apache-couchdb-1.6.0/0000755000175000001440000000000012332106073014320 5ustar00djcusers00000000000000apache-couchdb-1.6.0/m4/0000755000175000001440000000000012332105577014650 5ustar00djcusers00000000000000apache-couchdb-1.6.0/m4/libtool.m40000644000175000001440000106002312332105523016547 0ustar00djcusers00000000000000# 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*|ppc*-*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*) LD="${LD-ld} -m elf_i386" ;; ppc64-*linux*|powerpc64-*linux*) 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" ;; ppc*-*linux*|powerpc*-*linux*) 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"; 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 # Handle Gentoo/FreeBSD as it was Linux case $host_vendor in gentoo) version_type=linux ;; *) version_type=freebsd-$objformat ;; esac 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 ;; linux) library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major ${libname}${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' need_lib_prefix=no need_version=no ;; 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 ;; 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' shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=no hardcode_into_libs=yes ;; 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) 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' ;; 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 ;; gnu*) lt_cv_deplibs_check_method=pass_all ;; 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) lt_cv_deplibs_check_method=pass_all ;; netbsd*) 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) 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*) ;; *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) 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 ;; *) _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 ;; 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*) 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 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*) 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 ;; gnu*) ;; 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) 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 apache-couchdb-1.6.0/m4/ltversion.m40000644000175000001440000000126212332105523017127 0ustar00djcusers00000000000000# 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) ]) apache-couchdb-1.6.0/m4/lt~obsolete.m40000644000175000001440000001375612332105523017467 0ustar00djcusers00000000000000# 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])]) apache-couchdb-1.6.0/m4/ltoptions.m40000644000175000001440000003007312332105523017137 0ustar00djcusers00000000000000# 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])]) apache-couchdb-1.6.0/m4/ltsugar.m40000644000175000001440000001042412332105523016563 0ustar00djcusers00000000000000# ltsugar.m4 -- libtool m4 base layer. -*-Autoconf-*- # # Copyright (C) 2004, 2005, 2007, 2008 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 6 ltsugar.m4 # This is to help aclocal find these macros, as it can't see m4_define. AC_DEFUN([LTSUGAR_VERSION], [m4_if([0.1])]) # lt_join(SEP, ARG1, [ARG2...]) # ----------------------------- # Produce ARG1SEPARG2...SEPARGn, omitting [] arguments and their # associated separator. # Needed until we can rely on m4_join from Autoconf 2.62, since all earlier # versions in m4sugar had bugs. m4_define([lt_join], [m4_if([$#], [1], [], [$#], [2], [[$2]], [m4_if([$2], [], [], [[$2]_])$0([$1], m4_shift(m4_shift($@)))])]) m4_define([_lt_join], [m4_if([$#$2], [2], [], [m4_if([$2], [], [], [[$1$2]])$0([$1], m4_shift(m4_shift($@)))])]) # lt_car(LIST) # lt_cdr(LIST) # ------------ # Manipulate m4 lists. # These macros are necessary as long as will still need to support # Autoconf-2.59 which quotes differently. m4_define([lt_car], [[$1]]) m4_define([lt_cdr], [m4_if([$#], 0, [m4_fatal([$0: cannot be called without arguments])], [$#], 1, [], [m4_dquote(m4_shift($@))])]) m4_define([lt_unquote], $1) # lt_append(MACRO-NAME, STRING, [SEPARATOR]) # ------------------------------------------ # Redefine MACRO-NAME to hold its former content plus `SEPARATOR'`STRING'. # Note that neither SEPARATOR nor STRING are expanded; they are appended # to MACRO-NAME as is (leaving the expansion for when MACRO-NAME is invoked). # No SEPARATOR is output if MACRO-NAME was previously undefined (different # than defined and empty). # # This macro is needed until we can rely on Autoconf 2.62, since earlier # versions of m4sugar mistakenly expanded SEPARATOR but not STRING. m4_define([lt_append], [m4_define([$1], m4_ifdef([$1], [m4_defn([$1])[$3]])[$2])]) # lt_combine(SEP, PREFIX-LIST, INFIX, SUFFIX1, [SUFFIX2...]) # ---------------------------------------------------------- # Produce a SEP delimited list of all paired combinations of elements of # PREFIX-LIST with SUFFIX1 through SUFFIXn. Each element of the list # has the form PREFIXmINFIXSUFFIXn. # Needed until we can rely on m4_combine added in Autoconf 2.62. m4_define([lt_combine], [m4_if(m4_eval([$# > 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 ]) apache-couchdb-1.6.0/bin/0000755000175000001440000000000012332105577015100 5ustar00djcusers00000000000000apache-couchdb-1.6.0/bin/couchdb.tpl.in0000644000175000001440000002642212332105522017631 0ustar00djcusers00000000000000#! /bin/sh -e # Licensed under the Apache License, Version 2.0 (the "License"); you may not # use this file except in compliance with the License. You may obtain a copy of # the License at # # http://www.apache.org/licenses/LICENSE-2.0 # # Unless required by applicable law or agreed to in writing, software # distributed under the License is distributed on an "AS IS" BASIS, WITHOUT # WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the # License for the specific language governing permissions and limitations under # the License. BACKGROUND=false DEFAULT_CONFIG_DIR=%localconfdir%/default.d DEFAULT_CONFIG_FILE=%localconfdir%/%defaultini% ERL_OS_MON_OPTIONS="-os_mon \ start_memsup false \ start_cpu_sup false \ disk_space_check_interval 1 \ disk_almost_full_threshold 1" ERL_START_OPTIONS="$ERL_OS_MON_OPTIONS -sasl errlog_type error +K true +A 4" HEART_BEAT_TIMEOUT=11 HEART_COMMAND="%bindir%/%couchdb_command_name% -k" INTERACTIVE=false KILL=false PLUGINS_DIR=%locallibdir%/plugins LOCAL_CONFIG_DIR=%localconfdir%/local.d LOCAL_CONFIG_FILE=%localconfdir%/%localini% PID_FILE=%localstatedir%/run/couchdb/couchdb.pid RECURSED=false RESET_CONFIG=true RESPAWN_TIMEOUT=0 SCRIPT_ERROR=1 SCRIPT_OK=0 SHUTDOWN=false STDERR_FILE=couchdb.stderr STDOUT_FILE=couchdb.stdout print_arguments="" start_arguments="" background_start_arguments="" basename=`basename $0` display_version () { cat << EOF $basename - %package_name% %version% Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. You may obtain a copy of the License at http://www.apache.org/licenses/LICENSE-2.0 Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License. EOF } display_help () { cat << EOF Usage: $basename [OPTION] The $basename command runs the %package_name% server. Erlang is called with: $ERL_START_OPTIONS Erlang inherits the environment of this command. You can override these options using the environment: ERL_AFLAGS, ERL_FLAGS, ERL_ZFLAGS See erl(1) for more information about the environment variables. The exit status is 0 for success or 1 for failure. Options: -h display a short help message and exit -V display version information and exit -a FILE add configuration FILE to chain -A DIR add configuration DIR to chain -n reset configuration file chain (including system default) -c print configuration file chain and exit -i use the interactive Erlang shell -b spawn as a background process -p FILE set the background PID FILE (overrides system default) -r SECONDS respawn background process after SECONDS (defaults to no respawn) -o FILE redirect background stdout to FILE (defaults to $STDOUT_FILE) -e FILE redirect background stderr to FILE (defaults to $STDERR_FILE) -s display the status of the background process -k kill the background process, will respawn if needed -d shutdown the background process Report bugs at <%bug_uri%>. EOF } display_error () { if test -n "$1"; then echo $1 >&2 fi echo >&2 echo "Try \`"$basename" -h' for more information." >&2 false } _get_pid () { if test -f $PID_FILE; then PID=`cat $PID_FILE` fi echo $PID } _add_config_file () { if test -z "$print_arguments"; then print_arguments="$1" else print_arguments="`cat < /dev/null; then echo "Apache CouchDB is running as process $PID, time to relax." return $SCRIPT_OK else echo >&2 << EOF Apache CouchDB is not running but a stale PID file exists: $PID_FILE EOF fi else echo "Apache CouchDB is not running." >&2 fi return $SCRIPT_ERROR } check_environment () { if test "$BACKGROUND" != "true"; then return fi touch $PID_FILE 2> /dev/null || true touch $STDOUT_FILE 2> /dev/null || true touch $STDERR_FILE 2> /dev/null || true message_prefix="Apache CouchDB needs write permission on the" if test ! -w $PID_FILE; then echo "$message_prefix PID file: $PID_FILE" >&2 false fi if test ! -w $STDOUT_FILE; then echo "$message_prefix STDOUT file: $STDOUT_FILE" >&2 false fi if test ! -w $STDERR_FILE; then echo "$message_prefix STDERR file: $STDERR_FILE" >&2 false fi message_prefix="Apache CouchDB needs a regular" if test `echo 2> /dev/null >> $PID_FILE; echo $?` -gt 0; then echo "$message_prefix PID file: $PID_FILE" >&2 false fi if test `echo 2> /dev/null >> $STDOUT_FILE; echo $?` -gt 0; then echo "$message_prefix STDOUT file: $STDOUT_FILE" >&2 false fi if test `echo 2> /dev/null >> $STDERR_FILE; echo $?` -gt 0; then echo "$message_prefix STDERR file: $STDERR_FILE" >&2 false fi } _find_plugins () { # Find plugins and add them to the Erlang path and load their default # configurations. This should be called from _load_config. if test -d "$PLUGINS_DIR"; then for plugin in "$PLUGINS_DIR"/*; do if echo "$COUCH_PLUGIN_BLACKLIST" | grep "$plugin" > /dev/null 2> /dev/null; then : # Do not use this plugin. else if echo "$ERL_ZFLAGS" | grep "$plugin/ebin" > /dev/null 2> /dev/null; then : # It's already loaded. else ERL_ZFLAGS="$ERL_ZFLAGS -pz '$plugin/ebin'" fi _add_config_dir "$plugin/priv/default.d" _add_erlang_config "$plugin/priv/couch_plugin.config" fi done export ERL_ZFLAGS fi } start_couchdb () { if test ! "$RECURSED" = "true"; then if check_status 2> /dev/null; then exit fi check_environment fi interactive_option="+Bd -noinput" if test "$INTERACTIVE" = "true"; then interactive_option="" fi if test "$BACKGROUND" = "true"; then touch $PID_FILE interactive_option="+Bd -noinput" fi command="%ERL% $interactive_option $ERL_START_OPTIONS \ -env ERL_LIBS $ERL_LIBS:%localerlanglibdir% -couch_ini $start_arguments -s couch" if test "$BACKGROUND" = "true" -a "$RECURSED" = "false"; then $0 $background_start_arguments -b -r $RESPAWN_TIMEOUT -p $PID_FILE \ -o $STDOUT_FILE -e $STDERR_FILE -R & echo "Apache CouchDB has started, time to relax." else if test "$RECURSED" = "true"; then # close stdout / stderr exec 1>&- exec 2>&- while true; do export HEART_COMMAND export HEART_BEAT_TIMEOUT `eval $command -pidfile $PID_FILE -heart \ >> $STDOUT_FILE 2>> $STDERR_FILE` || true PID=`_get_pid` if test -n "$PID"; then if kill -0 $PID 2> /dev/null; then return $SCRIPT_ERROR fi else return $SCRIPT_OK fi if test "$RESPAWN_TIMEOUT" = "0"; then return $SCRIPT_OK fi if test "$RESPAWN_TIMEOUT" != "1"; then plural_ending="s" fi cat << EOF Apache CouchDB crashed, restarting in $RESPAWN_TIMEOUT second$plural_ending. EOF sleep $RESPAWN_TIMEOUT done else eval exec $command fi fi } stop_couchdb () { PID=`_get_pid` STOP_TIMEOUT=60 if test -n "$PID"; then if test "$1" = "false"; then echo > $PID_FILE fi if kill -0 $PID 2> /dev/null; then if kill -TERM $PID 2> /dev/null; then count=0 while kill -0 $PID 2> /dev/null; do if [ $count -ge $STOP_TIMEOUT ]; then echo "Apache CouchDB failed to shutdown." return $SCRIPT_ERROR else count=$[count+1] sleep 1 fi done if test "$1" = "false"; then echo "Apache CouchDB has been shutdown." else echo "Apache CouchDB has been killed." fi return $SCRIPT_OK else echo "Apache CouchDB could not be killed." >&2 return $SCRIPT_ERROR fi if test "$1" = "false"; then echo "Stale PID file exists but Apache CouchDB is not running." else echo "Stale PID file existed but Apache CouchDB is not running." fi fi else echo "Apache CouchDB is not running." fi } parse_script_option_list () { _load_config set +e options=`getopt hVa:A:ncibp:r:Ro:e:skd $@` if test ! $? -eq 0; then display_error fi set -e eval set -- $options while [ $# -gt 0 ]; do case "$1" in -h) shift; display_help; exit;; -V) shift; display_version; exit;; -a) shift; _add_config_file "$1"; shift;; -A) shift; _add_config_dir "$1"; shift;; -n) shift; _reset_config;; -c) shift; _print_config; exit;; -i) shift; INTERACTIVE=true;; -b) shift; BACKGROUND=true;; -r) shift; RESPAWN_TIMEOUT=$1; shift;; -R) shift; RECURSED=true;; -p) shift; PID_FILE=$1; shift;; -o) shift; STDOUT_FILE=$1; shift;; -e) shift; STDERR_FILE=$1; shift;; -s) shift; check_status; exit;; -k) shift; KILL=true;; -d) shift; SHUTDOWN=true;; --) shift; break;; *) display_error "Unknown option: $1" >&2;; esac done if test "$KILL" = "true" -o "$SHUTDOWN" = "true"; then stop_couchdb $KILL else start_couchdb fi } parse_script_option_list $@ apache-couchdb-1.6.0/bin/couchdb.10000644000175000001440000000444112332105577016574 0ustar00djcusers00000000000000.\" DO NOT MODIFY THIS FILE! It was generated by help2man 1.40.11. .TH COUCHDB "1" "May 2014" "couchdb - Apache CouchDB 1.6.0" "User Commands" .SH NAME couchdb \- Apache CouchDB database server .SH SYNOPSIS .B couchdb [\fIOPTION\fR] .SH DESCRIPTION The couchdb command runs the Apache CouchDB server. .PP Erlang is called with: .TP \fB\-os_mon\fR start_memsup false start_cpu_sup false disk_space_check_interval 1 disk_almost_full_threshold 1 \fB\-sasl\fR errlog_type error +K true +A 4 .PP Erlang inherits the environment of this command. .PP You can override these options using the environment: .IP ERL_AFLAGS, ERL_FLAGS, ERL_ZFLAGS .PP See erl(1) for more information about the environment variables. .PP The exit status is 0 for success or 1 for failure. .SH OPTIONS .TP \fB\-h\fR display a short help message and exit .TP \fB\-V\fR display version information and exit .TP \fB\-a\fR FILE add configuration FILE to chain .TP \fB\-A\fR DIR add configuration DIR to chain .TP \fB\-n\fR reset configuration file chain (including system default) .TP \fB\-c\fR print configuration file chain and exit .TP \fB\-i\fR use the interactive Erlang shell .TP \fB\-b\fR spawn as a background process .TP \fB\-p\fR FILE set the background PID FILE (overrides system default) .TP \fB\-r\fR SECONDS respawn background process after SECONDS (defaults to no respawn) .TP \fB\-o\fR FILE redirect background stdout to FILE (defaults to couchdb.stdout) .TP \fB\-e\fR FILE redirect background stderr to FILE (defaults to couchdb.stderr) .TP \fB\-s\fR display the status of the background process .TP \fB\-k\fR kill the background process, will respawn if needed .TP \fB\-d\fR shutdown the background process .SH "REPORTING BUGS" Report bugs at . .PP .br Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. You may obtain a copy of the .br License at .IP http://www.apache.org/licenses/LICENSE\-2.0 .PP .br Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR .br CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License. apache-couchdb-1.6.0/bin/couchdb.bat.tpl.in0000644000175000001440000000202312332105522020365 0ustar00djcusers00000000000000@echo off rem Licensed under the Apache License, Version 2.0 (the "License"); you may not rem use this file except in compliance with the License. You may obtain a copy rem of the License at rem rem http://www.apache.org/licenses/LICENSE-2.0 rem rem Unless required by applicable law or agreed to in writing, software rem distributed under the License is distributed on an "AS IS" BASIS, WITHOUT rem WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the rem License for the specific language governing permissions and limitations rem under the License. setlocal rem First change to the drive with the erlang bin directory %~d0 rem then change to the erlang bin directory cd %~dp0 rem Allow a different erlang executable (eg, erl) to be used. rem When using erl instead of werl, server restarts during test runs can fail rem intermittently. But using erl should be fine for production use. if "%ERL%x" == "x" set ERL=werl.exe echo CouchDB %version% - prepare to relax... %ERL% -sasl errlog_type error -s couch +A 4 +W w apache-couchdb-1.6.0/bin/couch-config.tpl.in0000644000175000001440000000667112332105522020572 0ustar00djcusers00000000000000#! /bin/sh -e # Licensed under the Apache License, Version 2.0 (the "License"); you # may not use this file except in compliance with the License. You may # obtain a copy of the License at # # http://www.apache.org/licenses/LICENSE-2.0 # # Unless required by applicable law or agreed to in writing, software # distributed under the License is distributed on an "AS IS" BASIS, # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or # implied. See the License for the specific language governing # permissions and limitations under the License. basename=`basename "$0"` staticdir="%localbuilddatadir%" erlanglibdir="%localerlanglibdir%" couchversion="%version%" dbdir="%localstatelibdir%" viewdir="%localstatelibdir%" confdir="%localconfdir%" urifile="%localstaterundir%/couch.uri" logdir="%localstatelogdir%" erlangversion="%erlangversion%" erlangbin="%erlangbin%" version () { cat << EOF $basename - %package_name% configuration helper %version% Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. You may obtain a copy of the License at http://www.apache.org/licenses/LICENSE-2.0 Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License. EOF } usage() { cat << EOF Usage: $basename [OPTION] The $basename command runs the %package_name% configuration helper script. Options: --erl-libs-dir Erlang library directory --erl-bin Erlang binary --config-dir configuration directory --db-dir database directory --view-dir view index directory --static-dir static asset directory --doc-dir documentation directory --log-dir log directory --uri-file daemon sockets file --couch-version version of Apache CouchDB --erlang-version version of Erlang that CouchDB was built with --version version of $basename --help Print usage If you want to add an option in couch-config or report bugs please do it at <%bug_uri%>. EOF } if [ $# -lt 1 ]; then usage exit 1 fi while [ $# -gt 0 ]; do arg="$1" var=`echo $arg | sed -e 's/^[^=]*=//'` case "$arg" in --erl-libs-dir) echo $erlanglibdir ;; --erl-bin) echo $erlangbin ;; --config-dir) echo $confdir ;; --db-dir) echo $dbdir ;; --view-dir) echo $viewdir ;; --static-dir) echo $staticdir ;; --doc-dir) echo $staticdir ;; --log-dir) echo $logdir ;; --uri-file) echo $urifile ;; --couch-version) echo $couchversion ;; --erlang-version) echo $erlangversion ;; --version) version exit 0 ;; --help) usage exit 0 ;; *|-*) echo $basename: ERROR Unknown Option $arg 1>&2 echo 1>&2 usage 1>&2 echo "### $basename: Exitting." 1>&2 exit 1; ;; esac shift done exit 0 apache-couchdb-1.6.0/bin/erlang-version.escript0000644000175000001440000000010412332105522021407 0ustar00djcusers00000000000000 main(_) -> io:format("~s~n", [erlang:system_info(otp_release)]). apache-couchdb-1.6.0/bin/Makefile.am0000644000175000001440000001302212332105522017120 0ustar00djcusers00000000000000## Licensed under the Apache License, Version 2.0 (the "License"); you may not ## use this file except in compliance with the License. You may obtain a copy of ## the License at ## ## http://www.apache.org/licenses/LICENSE-2.0 ## ## Unless required by applicable law or agreed to in writing, software ## distributed under the License is distributed on an "AS IS" BASIS, WITHOUT ## WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the ## License for the specific language governing permissions and limitations under ## the License. MAKE_SAFE = $(MAKE) if WINDOWS bin_SCRIPTS = couchdb.bat else bin_SCRIPTS = couchdb couch-config endif man1dir = $(mandir)/man1 noinst_SCRIPTS = couchjs_dev couch-config_dev man_file = couchdb.1 if BUILD_MAN man_file_build = $(man_file) else man_file_build = endif BUILT_SOURCES = $(man_file_build) EXTRA_DIST = $(man_file_build) erlang-version.escript CLEANFILES = $(bin_SCRIPTS) $(man_file_build) $(noinst_SCRIPTS) transform = @program_transform_name@ couchdb_command_name = `echo couchdb | sed '$(transform)'` couchjs_command_name = `echo couchjs | sed '$(transform)'` couchdb: couchdb.tpl sed -e "s|%ERL%|$(ERL)|g" \ -e "s|%ICU_CONFIG%|$(ICU_CONFIG)|g" \ -e "s|%bindir%|@bindir@|g" \ -e "s|%localerlanglibdir%|@localerlanglibdir@|g" \ -e "s|%defaultini%|default.ini|g" \ -e "s|%localini%|local.ini|g" \ -e "s|%localconfdir%|@localconfdir@|g" \ -e "s|%localstatelogdir%|@localstatelogdir@|g" \ -e "s|%localstatelibdir%|@localstatelibdir@|g" \ -e "s|%localstatedir%|@localstatedir@|g" \ -e "s|%locallibdir%|@locallibdir@|g" \ -e "s|%bug_uri%|@bug_uri@|g" \ -e "s|%package_author_address%|@package_author_address@|g" \ -e "s|%package_author_name%|@package_author_name@|g" \ -e "s|%package_name%|@package_name@|g" \ -e "s|%version%|@version@|g" \ -e "s|%couchdb_command_name%|$(couchdb_command_name)|g" > \ $@ < $< chmod +x $@ if !WINDOWS install-exec-hook: $(LN_S) -f "$(locallibbindir)/$(couchjs_command_name)" \ "$(DESTDIR)$(bindir)/$(couchjs_command_name)" endif couchjs_dev: $(LN_S) -f "$(abs_top_builddir)/src/couchdb/priv/couchjs" "$@" couchdb.bat: couchdb.bat.tpl sed -e "s|%ICU_CONFIG%|$(ICU_CONFIG)|g" \ -e "s|%version%|@version@|g" \ $< > $@ couch-config: couch-config.tpl sed -e "s|%ERL%|$(ERL)|g" \ -e "s|%bindir%|@bindir@|g" \ -e "s|%localerlanglibdir%|@localerlanglibdir@|g" \ -e "s|%localconfdir%|@localconfdir@|g" \ -e "s|%localdatadir%|$(localdatadir)|g" \ -e "s|%localbuilddatadir%|$(localdatadir)|g" \ -e "s|%localstatelogdir%|@localstatelogdir@|g" \ -e "s|%localstatelibdir%|@localstatelibdir@|g" \ -e "s|%localstatedir%|@localstatedir@|g" \ -e "s|%localstaterundir%|@localstaterundir@|g" \ -e "s|%couchlibdir%|@localerlanglibdir@/couch-%version%|g"\ -e "s|%couchincludedir%|@localerlanglibdir@/include|g"\ -e "s|%couchebindir%|@localerlanglibdir@/ebin|g"\ -e "s|%couchprivlibdir%|@localerlanglibdir@/couch-%version%/priv/lib|g"\ -e "s|%bug_uri%|@bug_uri@|g" \ -e "s|%package_author_address%|@package_author_address@|g" \ -e "s|%package_author_name%|@package_author_name@|g" \ -e "s|%package_name%|@package_name@|g" \ -e "s|%version%|@version@|g" \ -e "s|%erlangversion%|@erlangversion@|g" \ -e "s|%erlangbin%|@erlangbin@|g" \ -e "s|%couchdb_command_name%|$(couchdb_command_name)|g" > \ $@ < $< chmod +x $@ couch-config_dev: couch-config.tpl sed -e "s|%ERL%|$(ERL)|g" \ -e "s|%bindir%|$(abs_top_builddir)/bin|g" \ -e "s|%localerlanglibdir%|$(abs_top_builddir)\/src\/couchdb|g" \ -e "s|%couchlibdir%|$(abs_top_builddir)\/src\/couchdb|g"\ -e "s|%couchincludedir%|$(abs_top_builddir)\/src\/couchdb|g"\ -e "s|%couchebindir%|$(abs_top_builddir)\/src\/couchdb|g"\ -e "s|%couchprivlibdir%|$(abs_top_builddir)/src/couchdb/priv/.libs|g"\ -e "s|%localdatadir%|$(abs_top_srcdir)/share|g" \ -e "s|%localbuilddatadir%|$(abs_top_builddir)/share|g" \ -e "s|%localstatelibdir%|$(abs_top_builddir)/tmp/lib|g" \ -e "s|%localstatelogdir%|$(abs_top_builddir)/tmp/log|g" \ -e "s|%localstatedir%|$(abs_top_builddir)/tmp|g" \ -e "s|%localstaterundir%|$(abs_top_builddir)/tmp/run|g" \ -e "s|%bug_uri%|@bug_uri@|g" \ -e "s|%package_author_address%|@package_author_address@|g" \ -e "s|%package_author_name%|@package_author_name@|g" \ -e "s|%package_name%|@package_name@|g" \ -e "s|%version%|@version@|g" \ -e "s|%erlangversion%|@erlangversion@|g" \ -e "s|%erlangbin%|@erlangbin@|g" \ -e "s|%couchdb_command_name%|$(abs_top_builddir)/utils/run|g" > \ $@ < $< chmod +x $@ # Depend on source files so distributed man pages are not rebuilt for end user. $(man_file): couchdb.tpl.in $(MAKE_SAFE) -f Makefile couchdb; \ $(top_srcdir)/build-aux/missing --run \ help2man \ --no-info \ --help-option="-h" \ --version-option="-V" \ --name="$(package_name) database server" \ ./couchdb --output $@ install-data-local: if test -s $(man_file); then \ if test `cat $(man_file) | wc -l` -gt 1; then \ $(INSTALL) -d $(DESTDIR)$(man1dir); \ $(INSTALL_DATA) $(man_file) $(DESTDIR)$(man1dir)/$(man_file); \ fi \ fi uninstall-local: rm -f $(DESTDIR)$(man1dir)/$(man_file) distcheck-hook: if test ! -s $(man_file); then \ $(top_srcdir)/build-aux/dist-error $(man_file); \ else \ if test ! `cat $(man_file) | wc -l` -gt 1; then \ $(top_srcdir)/build-aux/dist-error $(man_file); \ fi \ fi apache-couchdb-1.6.0/bin/Makefile.in0000644000175000001440000005147712332105547017160 0ustar00djcusers00000000000000# Makefile.in generated by automake 1.11.6 from Makefile.am. # @configure_input@ # Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, # 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011 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__make_dryrun = \ { \ am__dry=no; \ case $$MAKEFLAGS in \ *\\[\ \ ]*) \ echo 'am--echo: ; @echo "AM" OK' | $(MAKE) -f - 2>/dev/null \ | grep '^AM OK$$' >/dev/null || am__dry=yes;; \ *) \ for am__flg in $$MAKEFLAGS; do \ case $$am__flg in \ *=*|--*) ;; \ *n*) am__dry=yes; break;; \ esac; \ done;; \ esac; \ test $$am__dry = yes; \ } 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) NORMAL_INSTALL = : PRE_INSTALL = : POST_INSTALL = : NORMAL_UNINSTALL = : PRE_UNINSTALL = : POST_UNINSTALL = : build_triplet = @build@ host_triplet = @host@ subdir = bin DIST_COMMON = $(srcdir)/Makefile.am $(srcdir)/Makefile.in \ $(srcdir)/couch-config.tpl.in $(srcdir)/couchdb.bat.tpl.in \ $(srcdir)/couchdb.tpl.in ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 am__aclocal_m4_deps = $(top_srcdir)/m4/libtool.m4 \ $(top_srcdir)/m4/ltoptions.m4 $(top_srcdir)/m4/ltsugar.m4 \ $(top_srcdir)/m4/ltversion.m4 $(top_srcdir)/m4/lt~obsolete.m4 \ $(top_srcdir)/acinclude.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 \ $(top_builddir)/src/snappy/google-snappy/config.h CONFIG_CLEAN_FILES = couch-config.tpl couchdb.tpl couchdb.bat.tpl 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)" SCRIPTS = $(bin_SCRIPTS) $(noinst_SCRIPTS) 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 DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) transform = @program_transform_name@ ACLOCAL = @ACLOCAL@ AMTAR = @AMTAR@ AR = @AR@ AS = @AS@ AUTOCONF = @AUTOCONF@ AUTOHEADER = @AUTOHEADER@ AUTOMAKE = @AUTOMAKE@ AWK = @AWK@ CC = @CC@ CCDEPMODE = @CCDEPMODE@ CFLAGS = @CFLAGS@ CPP = @CPP@ CPPFLAGS = @CPPFLAGS@ CURL_CFLAGS = @CURL_CFLAGS@ CURL_CONFIG = @CURL_CONFIG@ CURL_LIBS = @CURL_LIBS@ CXX = @CXX@ CXXCPP = @CXXCPP@ CXXDEPMODE = @CXXDEPMODE@ CXXFLAGS = @CXXFLAGS@ CYGPATH_W = @CYGPATH_W@ DEFS = @DEFS@ DEPDIR = @DEPDIR@ DLLTOOL = @DLLTOOL@ DSYMUTIL = @DSYMUTIL@ DUMPBIN = @DUMPBIN@ ECHO_C = @ECHO_C@ ECHO_N = @ECHO_N@ ECHO_T = @ECHO_T@ EGREP = @EGREP@ ERL = @ERL@ ERLANG_FLAGS = @ERLANG_FLAGS@ ERLC = @ERLC@ ERLC_FLAGS = @ERLC_FLAGS@ ESCRIPT = @ESCRIPT@ EXEEXT = @EXEEXT@ FGREP = @FGREP@ FLAGS = @FLAGS@ GREP = @GREP@ HAS_HELP2MAN = @HAS_HELP2MAN@ HAS_INSTALLINFO = @HAS_INSTALLINFO@ HAS_MAKEINFO = @HAS_MAKEINFO@ HAS_PDFLATEX = @HAS_PDFLATEX@ HAS_SPHINX_BUILD = @HAS_SPHINX_BUILD@ ICU_BIN = @ICU_BIN@ ICU_CFLAGS = @ICU_CFLAGS@ ICU_CONFIG = @ICU_CONFIG@ ICU_CPPFLAGS = @ICU_CPPFLAGS@ ICU_CXXFLAGS = @ICU_CXXFLAGS@ ICU_LIBS = @ICU_LIBS@ INNO_COMPILER_EXECUTABLE = @INNO_COMPILER_EXECUTABLE@ INSTALL = @INSTALL@ INSTALL_DATA = @INSTALL_DATA@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ INSTALL_SCRIPT = @INSTALL_SCRIPT@ INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ JS_CFLAGS = @JS_CFLAGS@ JS_LIBS = @JS_LIBS@ JS_LIB_BINARY = @JS_LIB_BINARY@ LD = @LD@ LDFLAGS = @LDFLAGS@ LIBOBJS = @LIBOBJS@ LIBS = @LIBS@ LIBTOOL = @LIBTOOL@ LIPO = @LIPO@ LN_S = @LN_S@ LTLIBOBJS = @LTLIBOBJS@ MAKEINFO = @MAKEINFO@ MANIFEST_TOOL = @MANIFEST_TOOL@ MKDIR_P = @MKDIR_P@ NM = @NM@ NMEDIT = @NMEDIT@ OBJDUMP = @OBJDUMP@ OBJEXT = @OBJEXT@ OTOOL = @OTOOL@ OTOOL64 = @OTOOL64@ PACKAGE = @PACKAGE@ PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ PACKAGE_NAME = @PACKAGE_NAME@ PACKAGE_STRING = @PACKAGE_STRING@ PACKAGE_TARNAME = @PACKAGE_TARNAME@ PACKAGE_URL = @PACKAGE_URL@ PACKAGE_VERSION = @PACKAGE_VERSION@ PATH_SEPARATOR = @PATH_SEPARATOR@ PKG_CONFIG = @PKG_CONFIG@ PKG_CONFIG_LIBDIR = @PKG_CONFIG_LIBDIR@ PKG_CONFIG_PATH = @PKG_CONFIG_PATH@ RANLIB = @RANLIB@ SED = @SED@ SET_MAKE = @SET_MAKE@ SHELL = @SHELL@ SNAPPY_MAJOR = @SNAPPY_MAJOR@ SNAPPY_MINOR = @SNAPPY_MINOR@ SNAPPY_PATCHLEVEL = @SNAPPY_PATCHLEVEL@ STRIP = @STRIP@ VERSION = @VERSION@ 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@ ac_cv_have_stddef_h = @ac_cv_have_stddef_h@ ac_cv_have_stdint_h = @ac_cv_have_stdint_h@ am__include = @am__include@ am__leading_dot = @am__leading_dot@ am__quote = @am__quote@ am__tar = @am__tar@ am__untar = @am__untar@ bindir = @bindir@ bug_uri = @bug_uri@ 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@ dvidir = @dvidir@ erlangbin = @erlangbin@ erlangversion = @erlangversion@ exec_prefix = @exec_prefix@ host = @host@ host_alias = @host_alias@ host_cpu = @host_cpu@ host_os = @host_os@ host_vendor = @host_vendor@ htmldir = @htmldir@ includedir = @includedir@ infodir = @infodir@ initdir = @initdir@ install_sh = @install_sh@ launchddir = @launchddir@ libdir = @libdir@ libexecdir = @libexecdir@ localconfdir = @localconfdir@ localdatadir = @localdatadir@ localdocdir = @localdocdir@ localedir = @localedir@ localerlanglibdir = @localerlanglibdir@ locallibbindir = @locallibbindir@ locallibdir = @locallibdir@ localstatedir = @localstatedir@ localstatelibdir = @localstatelibdir@ localstatelogdir = @localstatelogdir@ localstaterundir = @localstaterundir@ mandir = @mandir@ mkdir_p = @mkdir_p@ msvc_redist_dir = @msvc_redist_dir@ msvc_redist_name = @msvc_redist_name@ oldincludedir = @oldincludedir@ openssl_bin_dir = @openssl_bin_dir@ otp_release = @otp_release@ package_author_address = @package_author_address@ package_author_name = @package_author_name@ package_identifier = @package_identifier@ package_name = @package_name@ package_tarname = @package_tarname@ 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@ version = @version@ version_major = @version_major@ version_minor = @version_minor@ version_release = @version_release@ version_revision = @version_revision@ version_stage = @version_stage@ MAKE_SAFE = $(MAKE) @WINDOWS_FALSE@bin_SCRIPTS = couchdb couch-config @WINDOWS_TRUE@bin_SCRIPTS = couchdb.bat man1dir = $(mandir)/man1 noinst_SCRIPTS = couchjs_dev couch-config_dev man_file = couchdb.1 @BUILD_MAN_FALSE@man_file_build = @BUILD_MAN_TRUE@man_file_build = $(man_file) BUILT_SOURCES = $(man_file_build) EXTRA_DIST = $(man_file_build) erlang-version.escript CLEANFILES = $(bin_SCRIPTS) $(man_file_build) $(noinst_SCRIPTS) couchdb_command_name = `echo couchdb | sed '$(transform)'` couchjs_command_name = `echo couchjs | sed '$(transform)'` all: $(BUILT_SOURCES) $(MAKE) $(AM_MAKEFLAGS) 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) --foreign bin/Makefile'; \ $(am__cd) $(top_srcdir) && \ $(AUTOMAKE) --foreign bin/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): couch-config.tpl: $(top_builddir)/config.status $(srcdir)/couch-config.tpl.in cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ couchdb.tpl: $(top_builddir)/config.status $(srcdir)/couchdb.tpl.in cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ couchdb.bat.tpl: $(top_builddir)/config.status $(srcdir)/couchdb.bat.tpl.in cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ 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 tags: TAGS TAGS: ctags: CTAGS CTAGS: 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: $(BUILT_SOURCES) $(MAKE) $(AM_MAKEFLAGS) check-am all-am: Makefile $(SCRIPTS) installdirs: for dir in "$(DESTDIR)$(bindir)"; do \ test -z "$$dir" || $(MKDIR_P) "$$dir"; \ done install: $(BUILT_SOURCES) $(MAKE) $(AM_MAKEFLAGS) install-am install-exec: install-exec-am install-data: install-data-am uninstall: uninstall-am install-am: all-am @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am installcheck: installcheck-am install-strip: 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) @WINDOWS_TRUE@install-exec-hook: 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-data-local install-dvi: install-dvi-am install-dvi-am: install-exec-am: install-binSCRIPTS @$(NORMAL_INSTALL) $(MAKE) $(AM_MAKEFLAGS) install-exec-hook 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-binSCRIPTS uninstall-local .MAKE: all check install install-am install-exec-am install-strip .PHONY: all all-am check check-am clean clean-generic clean-libtool \ distclean distclean-generic distclean-libtool distdir dvi \ dvi-am html html-am info info-am install install-am \ install-binSCRIPTS install-data install-data-am \ install-data-local install-dvi install-dvi-am install-exec \ install-exec-am install-exec-hook 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 uninstall uninstall-am \ uninstall-binSCRIPTS uninstall-local couchdb: couchdb.tpl sed -e "s|%ERL%|$(ERL)|g" \ -e "s|%ICU_CONFIG%|$(ICU_CONFIG)|g" \ -e "s|%bindir%|@bindir@|g" \ -e "s|%localerlanglibdir%|@localerlanglibdir@|g" \ -e "s|%defaultini%|default.ini|g" \ -e "s|%localini%|local.ini|g" \ -e "s|%localconfdir%|@localconfdir@|g" \ -e "s|%localstatelogdir%|@localstatelogdir@|g" \ -e "s|%localstatelibdir%|@localstatelibdir@|g" \ -e "s|%localstatedir%|@localstatedir@|g" \ -e "s|%locallibdir%|@locallibdir@|g" \ -e "s|%bug_uri%|@bug_uri@|g" \ -e "s|%package_author_address%|@package_author_address@|g" \ -e "s|%package_author_name%|@package_author_name@|g" \ -e "s|%package_name%|@package_name@|g" \ -e "s|%version%|@version@|g" \ -e "s|%couchdb_command_name%|$(couchdb_command_name)|g" > \ $@ < $< chmod +x $@ @WINDOWS_FALSE@install-exec-hook: @WINDOWS_FALSE@ $(LN_S) -f "$(locallibbindir)/$(couchjs_command_name)" \ @WINDOWS_FALSE@ "$(DESTDIR)$(bindir)/$(couchjs_command_name)" couchjs_dev: $(LN_S) -f "$(abs_top_builddir)/src/couchdb/priv/couchjs" "$@" couchdb.bat: couchdb.bat.tpl sed -e "s|%ICU_CONFIG%|$(ICU_CONFIG)|g" \ -e "s|%version%|@version@|g" \ $< > $@ couch-config: couch-config.tpl sed -e "s|%ERL%|$(ERL)|g" \ -e "s|%bindir%|@bindir@|g" \ -e "s|%localerlanglibdir%|@localerlanglibdir@|g" \ -e "s|%localconfdir%|@localconfdir@|g" \ -e "s|%localdatadir%|$(localdatadir)|g" \ -e "s|%localbuilddatadir%|$(localdatadir)|g" \ -e "s|%localstatelogdir%|@localstatelogdir@|g" \ -e "s|%localstatelibdir%|@localstatelibdir@|g" \ -e "s|%localstatedir%|@localstatedir@|g" \ -e "s|%localstaterundir%|@localstaterundir@|g" \ -e "s|%couchlibdir%|@localerlanglibdir@/couch-%version%|g"\ -e "s|%couchincludedir%|@localerlanglibdir@/include|g"\ -e "s|%couchebindir%|@localerlanglibdir@/ebin|g"\ -e "s|%couchprivlibdir%|@localerlanglibdir@/couch-%version%/priv/lib|g"\ -e "s|%bug_uri%|@bug_uri@|g" \ -e "s|%package_author_address%|@package_author_address@|g" \ -e "s|%package_author_name%|@package_author_name@|g" \ -e "s|%package_name%|@package_name@|g" \ -e "s|%version%|@version@|g" \ -e "s|%erlangversion%|@erlangversion@|g" \ -e "s|%erlangbin%|@erlangbin@|g" \ -e "s|%couchdb_command_name%|$(couchdb_command_name)|g" > \ $@ < $< chmod +x $@ couch-config_dev: couch-config.tpl sed -e "s|%ERL%|$(ERL)|g" \ -e "s|%bindir%|$(abs_top_builddir)/bin|g" \ -e "s|%localerlanglibdir%|$(abs_top_builddir)\/src\/couchdb|g" \ -e "s|%couchlibdir%|$(abs_top_builddir)\/src\/couchdb|g"\ -e "s|%couchincludedir%|$(abs_top_builddir)\/src\/couchdb|g"\ -e "s|%couchebindir%|$(abs_top_builddir)\/src\/couchdb|g"\ -e "s|%couchprivlibdir%|$(abs_top_builddir)/src/couchdb/priv/.libs|g"\ -e "s|%localdatadir%|$(abs_top_srcdir)/share|g" \ -e "s|%localbuilddatadir%|$(abs_top_builddir)/share|g" \ -e "s|%localstatelibdir%|$(abs_top_builddir)/tmp/lib|g" \ -e "s|%localstatelogdir%|$(abs_top_builddir)/tmp/log|g" \ -e "s|%localstatedir%|$(abs_top_builddir)/tmp|g" \ -e "s|%localstaterundir%|$(abs_top_builddir)/tmp/run|g" \ -e "s|%bug_uri%|@bug_uri@|g" \ -e "s|%package_author_address%|@package_author_address@|g" \ -e "s|%package_author_name%|@package_author_name@|g" \ -e "s|%package_name%|@package_name@|g" \ -e "s|%version%|@version@|g" \ -e "s|%erlangversion%|@erlangversion@|g" \ -e "s|%erlangbin%|@erlangbin@|g" \ -e "s|%couchdb_command_name%|$(abs_top_builddir)/utils/run|g" > \ $@ < $< chmod +x $@ # Depend on source files so distributed man pages are not rebuilt for end user. $(man_file): couchdb.tpl.in $(MAKE_SAFE) -f Makefile couchdb; \ $(top_srcdir)/build-aux/missing --run \ help2man \ --no-info \ --help-option="-h" \ --version-option="-V" \ --name="$(package_name) database server" \ ./couchdb --output $@ install-data-local: if test -s $(man_file); then \ if test `cat $(man_file) | wc -l` -gt 1; then \ $(INSTALL) -d $(DESTDIR)$(man1dir); \ $(INSTALL_DATA) $(man_file) $(DESTDIR)$(man1dir)/$(man_file); \ fi \ fi uninstall-local: rm -f $(DESTDIR)$(man1dir)/$(man_file) distcheck-hook: if test ! -s $(man_file); then \ $(top_srcdir)/build-aux/dist-error $(man_file); \ else \ if test ! `cat $(man_file) | wc -l` -gt 1; then \ $(top_srcdir)/build-aux/dist-error $(man_file); \ fi \ fi # 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: apache-couchdb-1.6.0/etc/0000755000175000001440000000000012332105600015066 5ustar00djcusers00000000000000apache-couchdb-1.6.0/etc/init/0000755000175000001440000000000012332105600016031 5ustar00djcusers00000000000000apache-couchdb-1.6.0/etc/init/couchdb.tpl.in0000644000175000001440000000760612332105522020602 0ustar00djcusers00000000000000#!/bin/sh -e # Licensed under the Apache License, Version 2.0 (the "License"); you may not # use this file except in compliance with the License. You may obtain a copy of # the License at # # http://www.apache.org/licenses/LICENSE-2.0 # # Unless required by applicable law or agreed to in writing, software # distributed under the License is distributed on an "AS IS" BASIS, WITHOUT # WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the # License for the specific language governing permissions and limitations under # the License. ### BEGIN INIT INFO # Provides: couchdb # Required-Start: $local_fs $remote_fs # Required-Stop: $local_fs $remote_fs # Default-Start: 2 3 4 5 # Default-Stop: 0 1 6 # Short-Description: Apache CouchDB init script # Description: Apache CouchDB init script for the database server. ### END INIT INFO SCRIPT_OK=0 SCRIPT_ERROR=1 DESCRIPTION="database server" NAME=couchdb SCRIPT_NAME=`basename $0` COUCHDB=%bindir%/%couchdb_command_name% CONFIGURATION_FILE=%sysconfdir%/default/couchdb RUN_DIR=%localstaterundir% LSB_LIBRARY=/lib/lsb/init-functions if test ! -x $COUCHDB; then exit $SCRIPT_ERROR fi if test -r $CONFIGURATION_FILE; then . $CONFIGURATION_FILE fi log_daemon_msg () { # Dummy function to be replaced by LSB library. echo $@ } log_end_msg () { # Dummy function to be replaced by LSB library. if test "$1" != "0"; then echo "Error with $DESCRIPTION: $NAME" fi return $1 } if test -r $LSB_LIBRARY; then . $LSB_LIBRARY fi run_command () { command="$1" if test -n "$COUCHDB_OPTIONS"; then command="$command $COUCHDB_OPTIONS" fi if test -n "$COUCHDB_USER"; then if su $COUCHDB_USER -c "$command"; then return $SCRIPT_OK else return $SCRIPT_ERROR fi else if $command; then return $SCRIPT_OK else return $SCRIPT_ERROR fi fi } start_couchdb () { # Start Apache CouchDB as a background process. mkdir -p "$RUN_DIR" if test -n "$COUCHDB_USER"; then chown $COUCHDB_USER "$RUN_DIR" fi command="$COUCHDB -b" if test -n "$COUCHDB_STDOUT_FILE"; then command="$command -o $COUCHDB_STDOUT_FILE" fi if test -n "$COUCHDB_STDERR_FILE"; then command="$command -e $COUCHDB_STDERR_FILE" fi if test -n "$COUCHDB_RESPAWN_TIMEOUT"; then command="$command -r $COUCHDB_RESPAWN_TIMEOUT" fi run_command "$command" > /dev/null } stop_couchdb () { # Stop the running Apache CouchDB process. run_command "$COUCHDB -d" > /dev/null } display_status () { # Display the status of the running Apache CouchDB process. run_command "$COUCHDB -s" } parse_script_option_list () { # Parse arguments passed to the script and take appropriate action. case "$1" in start) log_daemon_msg "Starting $DESCRIPTION" $NAME if start_couchdb; then log_end_msg $SCRIPT_OK else log_end_msg $SCRIPT_ERROR fi ;; stop) log_daemon_msg "Stopping $DESCRIPTION" $NAME if stop_couchdb; then log_end_msg $SCRIPT_OK else log_end_msg $SCRIPT_ERROR fi ;; restart) log_daemon_msg "Restarting $DESCRIPTION" $NAME if stop_couchdb; then if start_couchdb; then log_end_msg $SCRIPT_OK else log_end_msg $SCRIPT_ERROR fi else log_end_msg $SCRIPT_ERROR fi ;; status) display_status ;; *) cat << EOF >&2 Usage: $SCRIPT_NAME {start|stop|restart|status} EOF exit $SCRIPT_ERROR ;; esac } parse_script_option_list $@ apache-couchdb-1.6.0/etc/init/Makefile.am0000644000175000001440000000112112332105522020063 0ustar00djcusers00000000000000## Licensed under the Apache License, Version 2.0 (the "License"); you may not ## use this file except in compliance with the License. You may obtain a copy of ## the License at ## ## http://www.apache.org/licenses/LICENSE-2.0 ## ## Unless required by applicable law or agreed to in writing, software ## distributed under the License is distributed on an "AS IS" BASIS, WITHOUT ## WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the ## License for the specific language governing permissions and limitations under ## the License. ## This file intentionally left blank. apache-couchdb-1.6.0/etc/init/Makefile.in0000644000175000001440000003035112332105550020104 0ustar00djcusers00000000000000# Makefile.in generated by automake 1.11.6 from Makefile.am. # @configure_input@ # Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, # 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011 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__make_dryrun = \ { \ am__dry=no; \ case $$MAKEFLAGS in \ *\\[\ \ ]*) \ echo 'am--echo: ; @echo "AM" OK' | $(MAKE) -f - 2>/dev/null \ | grep '^AM OK$$' >/dev/null || am__dry=yes;; \ *) \ for am__flg in $$MAKEFLAGS; do \ case $$am__flg in \ *=*|--*) ;; \ *n*) am__dry=yes; break;; \ esac; \ done;; \ esac; \ test $$am__dry = yes; \ } 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 = etc/init DIST_COMMON = $(srcdir)/Makefile.am $(srcdir)/Makefile.in \ $(srcdir)/couchdb.tpl.in ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 am__aclocal_m4_deps = $(top_srcdir)/m4/libtool.m4 \ $(top_srcdir)/m4/ltoptions.m4 $(top_srcdir)/m4/ltsugar.m4 \ $(top_srcdir)/m4/ltversion.m4 $(top_srcdir)/m4/lt~obsolete.m4 \ $(top_srcdir)/acinclude.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 \ $(top_builddir)/src/snappy/google-snappy/config.h CONFIG_CLEAN_FILES = couchdb.tpl CONFIG_CLEAN_VPATH_FILES = 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 DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) ACLOCAL = @ACLOCAL@ AMTAR = @AMTAR@ AR = @AR@ AS = @AS@ AUTOCONF = @AUTOCONF@ AUTOHEADER = @AUTOHEADER@ AUTOMAKE = @AUTOMAKE@ AWK = @AWK@ CC = @CC@ CCDEPMODE = @CCDEPMODE@ CFLAGS = @CFLAGS@ CPP = @CPP@ CPPFLAGS = @CPPFLAGS@ CURL_CFLAGS = @CURL_CFLAGS@ CURL_CONFIG = @CURL_CONFIG@ CURL_LIBS = @CURL_LIBS@ CXX = @CXX@ CXXCPP = @CXXCPP@ CXXDEPMODE = @CXXDEPMODE@ CXXFLAGS = @CXXFLAGS@ CYGPATH_W = @CYGPATH_W@ DEFS = @DEFS@ DEPDIR = @DEPDIR@ DLLTOOL = @DLLTOOL@ DSYMUTIL = @DSYMUTIL@ DUMPBIN = @DUMPBIN@ ECHO_C = @ECHO_C@ ECHO_N = @ECHO_N@ ECHO_T = @ECHO_T@ EGREP = @EGREP@ ERL = @ERL@ ERLANG_FLAGS = @ERLANG_FLAGS@ ERLC = @ERLC@ ERLC_FLAGS = @ERLC_FLAGS@ ESCRIPT = @ESCRIPT@ EXEEXT = @EXEEXT@ FGREP = @FGREP@ FLAGS = @FLAGS@ GREP = @GREP@ HAS_HELP2MAN = @HAS_HELP2MAN@ HAS_INSTALLINFO = @HAS_INSTALLINFO@ HAS_MAKEINFO = @HAS_MAKEINFO@ HAS_PDFLATEX = @HAS_PDFLATEX@ HAS_SPHINX_BUILD = @HAS_SPHINX_BUILD@ ICU_BIN = @ICU_BIN@ ICU_CFLAGS = @ICU_CFLAGS@ ICU_CONFIG = @ICU_CONFIG@ ICU_CPPFLAGS = @ICU_CPPFLAGS@ ICU_CXXFLAGS = @ICU_CXXFLAGS@ ICU_LIBS = @ICU_LIBS@ INNO_COMPILER_EXECUTABLE = @INNO_COMPILER_EXECUTABLE@ INSTALL = @INSTALL@ INSTALL_DATA = @INSTALL_DATA@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ INSTALL_SCRIPT = @INSTALL_SCRIPT@ INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ JS_CFLAGS = @JS_CFLAGS@ JS_LIBS = @JS_LIBS@ JS_LIB_BINARY = @JS_LIB_BINARY@ LD = @LD@ LDFLAGS = @LDFLAGS@ LIBOBJS = @LIBOBJS@ LIBS = @LIBS@ LIBTOOL = @LIBTOOL@ LIPO = @LIPO@ LN_S = @LN_S@ LTLIBOBJS = @LTLIBOBJS@ MAKEINFO = @MAKEINFO@ MANIFEST_TOOL = @MANIFEST_TOOL@ MKDIR_P = @MKDIR_P@ NM = @NM@ NMEDIT = @NMEDIT@ OBJDUMP = @OBJDUMP@ OBJEXT = @OBJEXT@ OTOOL = @OTOOL@ OTOOL64 = @OTOOL64@ PACKAGE = @PACKAGE@ PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ PACKAGE_NAME = @PACKAGE_NAME@ PACKAGE_STRING = @PACKAGE_STRING@ PACKAGE_TARNAME = @PACKAGE_TARNAME@ PACKAGE_URL = @PACKAGE_URL@ PACKAGE_VERSION = @PACKAGE_VERSION@ PATH_SEPARATOR = @PATH_SEPARATOR@ PKG_CONFIG = @PKG_CONFIG@ PKG_CONFIG_LIBDIR = @PKG_CONFIG_LIBDIR@ PKG_CONFIG_PATH = @PKG_CONFIG_PATH@ RANLIB = @RANLIB@ SED = @SED@ SET_MAKE = @SET_MAKE@ SHELL = @SHELL@ SNAPPY_MAJOR = @SNAPPY_MAJOR@ SNAPPY_MINOR = @SNAPPY_MINOR@ SNAPPY_PATCHLEVEL = @SNAPPY_PATCHLEVEL@ STRIP = @STRIP@ VERSION = @VERSION@ 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@ ac_cv_have_stddef_h = @ac_cv_have_stddef_h@ ac_cv_have_stdint_h = @ac_cv_have_stdint_h@ am__include = @am__include@ am__leading_dot = @am__leading_dot@ am__quote = @am__quote@ am__tar = @am__tar@ am__untar = @am__untar@ bindir = @bindir@ bug_uri = @bug_uri@ 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@ dvidir = @dvidir@ erlangbin = @erlangbin@ erlangversion = @erlangversion@ exec_prefix = @exec_prefix@ host = @host@ host_alias = @host_alias@ host_cpu = @host_cpu@ host_os = @host_os@ host_vendor = @host_vendor@ htmldir = @htmldir@ includedir = @includedir@ infodir = @infodir@ initdir = @initdir@ install_sh = @install_sh@ launchddir = @launchddir@ libdir = @libdir@ libexecdir = @libexecdir@ localconfdir = @localconfdir@ localdatadir = @localdatadir@ localdocdir = @localdocdir@ localedir = @localedir@ localerlanglibdir = @localerlanglibdir@ locallibbindir = @locallibbindir@ locallibdir = @locallibdir@ localstatedir = @localstatedir@ localstatelibdir = @localstatelibdir@ localstatelogdir = @localstatelogdir@ localstaterundir = @localstaterundir@ mandir = @mandir@ mkdir_p = @mkdir_p@ msvc_redist_dir = @msvc_redist_dir@ msvc_redist_name = @msvc_redist_name@ oldincludedir = @oldincludedir@ openssl_bin_dir = @openssl_bin_dir@ otp_release = @otp_release@ package_author_address = @package_author_address@ package_author_name = @package_author_name@ package_identifier = @package_identifier@ package_name = @package_name@ package_tarname = @package_tarname@ 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@ version = @version@ version_major = @version_major@ version_minor = @version_minor@ version_release = @version_release@ version_revision = @version_revision@ version_stage = @version_stage@ 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) --foreign etc/init/Makefile'; \ $(am__cd) $(top_srcdir) && \ $(AUTOMAKE) --foreign etc/init/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): couchdb.tpl: $(top_builddir)/config.status $(srcdir)/couchdb.tpl.in cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ mostlyclean-libtool: -rm -f *.lo clean-libtool: -rm -rf .libs _libs tags: TAGS TAGS: ctags: CTAGS CTAGS: 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 \ 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 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: apache-couchdb-1.6.0/etc/default/0000755000175000001440000000000012332105577016527 5ustar00djcusers00000000000000apache-couchdb-1.6.0/etc/default/couchdb0000644000175000001440000000025112332105522020045 0ustar00djcusers00000000000000# Sourced by init script for configuration. COUCHDB_USER=couchdb COUCHDB_STDOUT_FILE=/dev/null COUCHDB_STDERR_FILE=/dev/null COUCHDB_RESPAWN_TIMEOUT=5 COUCHDB_OPTIONS= apache-couchdb-1.6.0/etc/default/Makefile.am0000644000175000001440000000112112332105522020544 0ustar00djcusers00000000000000## Licensed under the Apache License, Version 2.0 (the "License"); you may not ## use this file except in compliance with the License. You may obtain a copy of ## the License at ## ## http://www.apache.org/licenses/LICENSE-2.0 ## ## Unless required by applicable law or agreed to in writing, software ## distributed under the License is distributed on an "AS IS" BASIS, WITHOUT ## WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the ## License for the specific language governing permissions and limitations under ## the License. ## This file intentionally left blank. apache-couchdb-1.6.0/etc/default/Makefile.in0000644000175000001440000003011112332105550020557 0ustar00djcusers00000000000000# Makefile.in generated by automake 1.11.6 from Makefile.am. # @configure_input@ # Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, # 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011 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__make_dryrun = \ { \ am__dry=no; \ case $$MAKEFLAGS in \ *\\[\ \ ]*) \ echo 'am--echo: ; @echo "AM" OK' | $(MAKE) -f - 2>/dev/null \ | grep '^AM OK$$' >/dev/null || am__dry=yes;; \ *) \ for am__flg in $$MAKEFLAGS; do \ case $$am__flg in \ *=*|--*) ;; \ *n*) am__dry=yes; break;; \ esac; \ done;; \ esac; \ test $$am__dry = yes; \ } 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 = etc/default DIST_COMMON = $(srcdir)/Makefile.am $(srcdir)/Makefile.in ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 am__aclocal_m4_deps = $(top_srcdir)/m4/libtool.m4 \ $(top_srcdir)/m4/ltoptions.m4 $(top_srcdir)/m4/ltsugar.m4 \ $(top_srcdir)/m4/ltversion.m4 $(top_srcdir)/m4/lt~obsolete.m4 \ $(top_srcdir)/acinclude.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 \ $(top_builddir)/src/snappy/google-snappy/config.h CONFIG_CLEAN_FILES = CONFIG_CLEAN_VPATH_FILES = 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 DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) ACLOCAL = @ACLOCAL@ AMTAR = @AMTAR@ AR = @AR@ AS = @AS@ AUTOCONF = @AUTOCONF@ AUTOHEADER = @AUTOHEADER@ AUTOMAKE = @AUTOMAKE@ AWK = @AWK@ CC = @CC@ CCDEPMODE = @CCDEPMODE@ CFLAGS = @CFLAGS@ CPP = @CPP@ CPPFLAGS = @CPPFLAGS@ CURL_CFLAGS = @CURL_CFLAGS@ CURL_CONFIG = @CURL_CONFIG@ CURL_LIBS = @CURL_LIBS@ CXX = @CXX@ CXXCPP = @CXXCPP@ CXXDEPMODE = @CXXDEPMODE@ CXXFLAGS = @CXXFLAGS@ CYGPATH_W = @CYGPATH_W@ DEFS = @DEFS@ DEPDIR = @DEPDIR@ DLLTOOL = @DLLTOOL@ DSYMUTIL = @DSYMUTIL@ DUMPBIN = @DUMPBIN@ ECHO_C = @ECHO_C@ ECHO_N = @ECHO_N@ ECHO_T = @ECHO_T@ EGREP = @EGREP@ ERL = @ERL@ ERLANG_FLAGS = @ERLANG_FLAGS@ ERLC = @ERLC@ ERLC_FLAGS = @ERLC_FLAGS@ ESCRIPT = @ESCRIPT@ EXEEXT = @EXEEXT@ FGREP = @FGREP@ FLAGS = @FLAGS@ GREP = @GREP@ HAS_HELP2MAN = @HAS_HELP2MAN@ HAS_INSTALLINFO = @HAS_INSTALLINFO@ HAS_MAKEINFO = @HAS_MAKEINFO@ HAS_PDFLATEX = @HAS_PDFLATEX@ HAS_SPHINX_BUILD = @HAS_SPHINX_BUILD@ ICU_BIN = @ICU_BIN@ ICU_CFLAGS = @ICU_CFLAGS@ ICU_CONFIG = @ICU_CONFIG@ ICU_CPPFLAGS = @ICU_CPPFLAGS@ ICU_CXXFLAGS = @ICU_CXXFLAGS@ ICU_LIBS = @ICU_LIBS@ INNO_COMPILER_EXECUTABLE = @INNO_COMPILER_EXECUTABLE@ INSTALL = @INSTALL@ INSTALL_DATA = @INSTALL_DATA@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ INSTALL_SCRIPT = @INSTALL_SCRIPT@ INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ JS_CFLAGS = @JS_CFLAGS@ JS_LIBS = @JS_LIBS@ JS_LIB_BINARY = @JS_LIB_BINARY@ LD = @LD@ LDFLAGS = @LDFLAGS@ LIBOBJS = @LIBOBJS@ LIBS = @LIBS@ LIBTOOL = @LIBTOOL@ LIPO = @LIPO@ LN_S = @LN_S@ LTLIBOBJS = @LTLIBOBJS@ MAKEINFO = @MAKEINFO@ MANIFEST_TOOL = @MANIFEST_TOOL@ MKDIR_P = @MKDIR_P@ NM = @NM@ NMEDIT = @NMEDIT@ OBJDUMP = @OBJDUMP@ OBJEXT = @OBJEXT@ OTOOL = @OTOOL@ OTOOL64 = @OTOOL64@ PACKAGE = @PACKAGE@ PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ PACKAGE_NAME = @PACKAGE_NAME@ PACKAGE_STRING = @PACKAGE_STRING@ PACKAGE_TARNAME = @PACKAGE_TARNAME@ PACKAGE_URL = @PACKAGE_URL@ PACKAGE_VERSION = @PACKAGE_VERSION@ PATH_SEPARATOR = @PATH_SEPARATOR@ PKG_CONFIG = @PKG_CONFIG@ PKG_CONFIG_LIBDIR = @PKG_CONFIG_LIBDIR@ PKG_CONFIG_PATH = @PKG_CONFIG_PATH@ RANLIB = @RANLIB@ SED = @SED@ SET_MAKE = @SET_MAKE@ SHELL = @SHELL@ SNAPPY_MAJOR = @SNAPPY_MAJOR@ SNAPPY_MINOR = @SNAPPY_MINOR@ SNAPPY_PATCHLEVEL = @SNAPPY_PATCHLEVEL@ STRIP = @STRIP@ VERSION = @VERSION@ 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@ ac_cv_have_stddef_h = @ac_cv_have_stddef_h@ ac_cv_have_stdint_h = @ac_cv_have_stdint_h@ am__include = @am__include@ am__leading_dot = @am__leading_dot@ am__quote = @am__quote@ am__tar = @am__tar@ am__untar = @am__untar@ bindir = @bindir@ bug_uri = @bug_uri@ 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@ dvidir = @dvidir@ erlangbin = @erlangbin@ erlangversion = @erlangversion@ exec_prefix = @exec_prefix@ host = @host@ host_alias = @host_alias@ host_cpu = @host_cpu@ host_os = @host_os@ host_vendor = @host_vendor@ htmldir = @htmldir@ includedir = @includedir@ infodir = @infodir@ initdir = @initdir@ install_sh = @install_sh@ launchddir = @launchddir@ libdir = @libdir@ libexecdir = @libexecdir@ localconfdir = @localconfdir@ localdatadir = @localdatadir@ localdocdir = @localdocdir@ localedir = @localedir@ localerlanglibdir = @localerlanglibdir@ locallibbindir = @locallibbindir@ locallibdir = @locallibdir@ localstatedir = @localstatedir@ localstatelibdir = @localstatelibdir@ localstatelogdir = @localstatelogdir@ localstaterundir = @localstaterundir@ mandir = @mandir@ mkdir_p = @mkdir_p@ msvc_redist_dir = @msvc_redist_dir@ msvc_redist_name = @msvc_redist_name@ oldincludedir = @oldincludedir@ openssl_bin_dir = @openssl_bin_dir@ otp_release = @otp_release@ package_author_address = @package_author_address@ package_author_name = @package_author_name@ package_identifier = @package_identifier@ package_name = @package_name@ package_tarname = @package_tarname@ 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@ version = @version@ version_major = @version_major@ version_minor = @version_minor@ version_release = @version_release@ version_revision = @version_revision@ version_stage = @version_stage@ 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) --foreign etc/default/Makefile'; \ $(am__cd) $(top_srcdir) && \ $(AUTOMAKE) --foreign etc/default/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 TAGS: ctags: CTAGS CTAGS: 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 \ 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 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: apache-couchdb-1.6.0/etc/couchdb/0000755000175000001440000000000012332105577016512 5ustar00djcusers00000000000000apache-couchdb-1.6.0/etc/couchdb/Makefile.am0000644000175000001440000000723012332105522020536 0ustar00djcusers00000000000000## Licensed under the Apache License, Version 2.0 (the "License"); you may not ## use this file except in compliance with the License. You may obtain a copy of ## the License at ## ## http://www.apache.org/licenses/LICENSE-2.0 ## ## Unless required by applicable law or agreed to in writing, software ## distributed under the License is distributed on an "AS IS" BASIS, WITHOUT ## WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the ## License for the specific language governing permissions and limitations under ## the License. couchprivlibdir = $(localerlanglibdir)/couch-$(version)/priv/lib devcouchprivlibdir = $(abs_top_builddir)/src/couchdb/priv/.libs localconf_DATA = default.ini noinst_DATA = default_dev.ini local_dev.ini EXTRA_DIST = local.ini CLEANFILES = $(localconf_DATA) $(noinst_DATA) transform = @program_transform_name@ couchjs_command_name = `echo couchjs | sed '$(transform)'` couchjs_dev_command_name = `echo couchjs_dev | sed '$(transform)'` if WINDOWS default.ini: default.ini.tpl sed -e "s|%bindir%|.|g" \ -e "s|%localconfdir%|$(localconfdir)|g" \ -e "s|%localdatadir%|../share/couchdb|g" \ -e "s|%localbuilddatadir%|../share/couchdb|g" \ -e "s|%localstatelibdir%|../var/lib/couchdb|g" \ -e "s|%localstatelogdir%|../var/log/couchdb|g" \ -e "s|%localstaterundir%|../var/run/couchdb|g" \ -e "s|%couchprivlibdir%|../lib/couch-$(version)/priv/lib|g" \ -e "s|%couchjs_command_name%|couchjs.exe|g" \ -e "s|%package_author_name%|$(package_author_name)|g" \ -e "s|%version%|$(version)|g" \ < $< > $@ else default.ini: default.ini.tpl sed -e "s|%bindir%|$(bindir)|g" \ -e "s|%localconfdir%|$(localconfdir)|g" \ -e "s|%localdatadir%|$(localdatadir)|g" \ -e "s|%localbuilddatadir%|$(localdatadir)|g" \ -e "s|%locallibdir%|$(locallibdir)|g" \ -e "s|%localstatelibdir%|$(localstatelibdir)|g" \ -e "s|%localstatelogdir%|$(localstatelogdir)|g" \ -e "s|%localstaterundir%|$(localstaterundir)|g" \ -e "s|%couchprivlibdir%|$(couchprivlibdir)|g" \ -e "s|%couchjs_command_name%|$(couchjs_command_name)|g" \ -e "s|%package_author_name%|$(package_author_name)|g" \ -e "s|%version%|$(version)|g" \ < $< > $@ endif default_dev.ini: default.ini.tpl sed -e "s|%bindir%|$(abs_top_builddir)/bin|g" \ -e "s|%localconfdir%|$(abs_top_builddir)/etc/couchdb|g" \ -e "s|%localdatadir%|$(abs_top_srcdir)/share|g" \ -e "s|%locallibdir%|$(abs_top_builddir)/tmp|g" \ -e "s|%localbuilddatadir%|$(abs_top_builddir)/share|g" \ -e "s|%localstatelibdir%|$(abs_top_builddir)/tmp/lib|g" \ -e "s|%localstatelogdir%|$(abs_top_builddir)/tmp/log|g" \ -e "s|%localstaterundir%|$(abs_top_builddir)/tmp/run|g" \ -e "s|%couchprivlibdir%|$(devcouchprivlibdir)|g" \ -e "s|%couchjs_command_name%|$(couchjs_dev_command_name)|g" \ -e "s|%package_author_name%|$(package_author_name)|g" \ -e "s|%version%|$(version)|g" \ < $< > $@ # Noah said to not specify local.ini but it borks # VPATH builds that make distcheck uses. local_dev.ini: local.ini if test ! -f "$@"; then \ cp $< $@; \ chmod +w $@; \ fi install-data-hook: if test ! -f "$(DESTDIR)$(localconfdir)/local.ini"; then \ cp $(srcdir)/local.ini "$(DESTDIR)$(localconfdir)/local.ini"; \ fi if test ! "$(mkdir_p)" = ""; then \ $(mkdir_p) "$(DESTDIR)$(localconfdir)/default.d"; \ $(mkdir_p) "$(DESTDIR)$(localconfdir)/local.d"; \ else \ echo "WARNING: You may have to create these directories by hand."; \ mkdir -p "$(DESTDIR)$(localconfdir)/default.d"; \ mkdir -p "$(DESTDIR)$(localconfdir)/local.d"; \ fi uninstall-local: rm -f "$(DESTDIR)/$(localconfdir)/local.ini" apache-couchdb-1.6.0/etc/couchdb/Makefile.in0000644000175000001440000004414312332105547020562 0ustar00djcusers00000000000000# Makefile.in generated by automake 1.11.6 from Makefile.am. # @configure_input@ # Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, # 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011 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__make_dryrun = \ { \ am__dry=no; \ case $$MAKEFLAGS in \ *\\[\ \ ]*) \ echo 'am--echo: ; @echo "AM" OK' | $(MAKE) -f - 2>/dev/null \ | grep '^AM OK$$' >/dev/null || am__dry=yes;; \ *) \ for am__flg in $$MAKEFLAGS; do \ case $$am__flg in \ *=*|--*) ;; \ *n*) am__dry=yes; break;; \ esac; \ done;; \ esac; \ test $$am__dry = yes; \ } 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) NORMAL_INSTALL = : PRE_INSTALL = : POST_INSTALL = : NORMAL_UNINSTALL = : PRE_UNINSTALL = : POST_UNINSTALL = : build_triplet = @build@ host_triplet = @host@ subdir = etc/couchdb DIST_COMMON = $(srcdir)/Makefile.am $(srcdir)/Makefile.in \ $(srcdir)/default.ini.tpl.in ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 am__aclocal_m4_deps = $(top_srcdir)/m4/libtool.m4 \ $(top_srcdir)/m4/ltoptions.m4 $(top_srcdir)/m4/ltsugar.m4 \ $(top_srcdir)/m4/ltversion.m4 $(top_srcdir)/m4/lt~obsolete.m4 \ $(top_srcdir)/acinclude.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 \ $(top_builddir)/src/snappy/google-snappy/config.h CONFIG_CLEAN_FILES = default.ini.tpl CONFIG_CLEAN_VPATH_FILES = 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)$(localconfdir)" DATA = $(localconf_DATA) $(noinst_DATA) DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) transform = @program_transform_name@ ACLOCAL = @ACLOCAL@ AMTAR = @AMTAR@ AR = @AR@ AS = @AS@ AUTOCONF = @AUTOCONF@ AUTOHEADER = @AUTOHEADER@ AUTOMAKE = @AUTOMAKE@ AWK = @AWK@ CC = @CC@ CCDEPMODE = @CCDEPMODE@ CFLAGS = @CFLAGS@ CPP = @CPP@ CPPFLAGS = @CPPFLAGS@ CURL_CFLAGS = @CURL_CFLAGS@ CURL_CONFIG = @CURL_CONFIG@ CURL_LIBS = @CURL_LIBS@ CXX = @CXX@ CXXCPP = @CXXCPP@ CXXDEPMODE = @CXXDEPMODE@ CXXFLAGS = @CXXFLAGS@ CYGPATH_W = @CYGPATH_W@ DEFS = @DEFS@ DEPDIR = @DEPDIR@ DLLTOOL = @DLLTOOL@ DSYMUTIL = @DSYMUTIL@ DUMPBIN = @DUMPBIN@ ECHO_C = @ECHO_C@ ECHO_N = @ECHO_N@ ECHO_T = @ECHO_T@ EGREP = @EGREP@ ERL = @ERL@ ERLANG_FLAGS = @ERLANG_FLAGS@ ERLC = @ERLC@ ERLC_FLAGS = @ERLC_FLAGS@ ESCRIPT = @ESCRIPT@ EXEEXT = @EXEEXT@ FGREP = @FGREP@ FLAGS = @FLAGS@ GREP = @GREP@ HAS_HELP2MAN = @HAS_HELP2MAN@ HAS_INSTALLINFO = @HAS_INSTALLINFO@ HAS_MAKEINFO = @HAS_MAKEINFO@ HAS_PDFLATEX = @HAS_PDFLATEX@ HAS_SPHINX_BUILD = @HAS_SPHINX_BUILD@ ICU_BIN = @ICU_BIN@ ICU_CFLAGS = @ICU_CFLAGS@ ICU_CONFIG = @ICU_CONFIG@ ICU_CPPFLAGS = @ICU_CPPFLAGS@ ICU_CXXFLAGS = @ICU_CXXFLAGS@ ICU_LIBS = @ICU_LIBS@ INNO_COMPILER_EXECUTABLE = @INNO_COMPILER_EXECUTABLE@ INSTALL = @INSTALL@ INSTALL_DATA = @INSTALL_DATA@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ INSTALL_SCRIPT = @INSTALL_SCRIPT@ INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ JS_CFLAGS = @JS_CFLAGS@ JS_LIBS = @JS_LIBS@ JS_LIB_BINARY = @JS_LIB_BINARY@ LD = @LD@ LDFLAGS = @LDFLAGS@ LIBOBJS = @LIBOBJS@ LIBS = @LIBS@ LIBTOOL = @LIBTOOL@ LIPO = @LIPO@ LN_S = @LN_S@ LTLIBOBJS = @LTLIBOBJS@ MAKEINFO = @MAKEINFO@ MANIFEST_TOOL = @MANIFEST_TOOL@ MKDIR_P = @MKDIR_P@ NM = @NM@ NMEDIT = @NMEDIT@ OBJDUMP = @OBJDUMP@ OBJEXT = @OBJEXT@ OTOOL = @OTOOL@ OTOOL64 = @OTOOL64@ PACKAGE = @PACKAGE@ PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ PACKAGE_NAME = @PACKAGE_NAME@ PACKAGE_STRING = @PACKAGE_STRING@ PACKAGE_TARNAME = @PACKAGE_TARNAME@ PACKAGE_URL = @PACKAGE_URL@ PACKAGE_VERSION = @PACKAGE_VERSION@ PATH_SEPARATOR = @PATH_SEPARATOR@ PKG_CONFIG = @PKG_CONFIG@ PKG_CONFIG_LIBDIR = @PKG_CONFIG_LIBDIR@ PKG_CONFIG_PATH = @PKG_CONFIG_PATH@ RANLIB = @RANLIB@ SED = @SED@ SET_MAKE = @SET_MAKE@ SHELL = @SHELL@ SNAPPY_MAJOR = @SNAPPY_MAJOR@ SNAPPY_MINOR = @SNAPPY_MINOR@ SNAPPY_PATCHLEVEL = @SNAPPY_PATCHLEVEL@ STRIP = @STRIP@ VERSION = @VERSION@ 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@ ac_cv_have_stddef_h = @ac_cv_have_stddef_h@ ac_cv_have_stdint_h = @ac_cv_have_stdint_h@ am__include = @am__include@ am__leading_dot = @am__leading_dot@ am__quote = @am__quote@ am__tar = @am__tar@ am__untar = @am__untar@ bindir = @bindir@ bug_uri = @bug_uri@ 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@ dvidir = @dvidir@ erlangbin = @erlangbin@ erlangversion = @erlangversion@ exec_prefix = @exec_prefix@ host = @host@ host_alias = @host_alias@ host_cpu = @host_cpu@ host_os = @host_os@ host_vendor = @host_vendor@ htmldir = @htmldir@ includedir = @includedir@ infodir = @infodir@ initdir = @initdir@ install_sh = @install_sh@ launchddir = @launchddir@ libdir = @libdir@ libexecdir = @libexecdir@ localconfdir = @localconfdir@ localdatadir = @localdatadir@ localdocdir = @localdocdir@ localedir = @localedir@ localerlanglibdir = @localerlanglibdir@ locallibbindir = @locallibbindir@ locallibdir = @locallibdir@ localstatedir = @localstatedir@ localstatelibdir = @localstatelibdir@ localstatelogdir = @localstatelogdir@ localstaterundir = @localstaterundir@ mandir = @mandir@ mkdir_p = @mkdir_p@ msvc_redist_dir = @msvc_redist_dir@ msvc_redist_name = @msvc_redist_name@ oldincludedir = @oldincludedir@ openssl_bin_dir = @openssl_bin_dir@ otp_release = @otp_release@ package_author_address = @package_author_address@ package_author_name = @package_author_name@ package_identifier = @package_identifier@ package_name = @package_name@ package_tarname = @package_tarname@ 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@ version = @version@ version_major = @version_major@ version_minor = @version_minor@ version_release = @version_release@ version_revision = @version_revision@ version_stage = @version_stage@ couchprivlibdir = $(localerlanglibdir)/couch-$(version)/priv/lib devcouchprivlibdir = $(abs_top_builddir)/src/couchdb/priv/.libs localconf_DATA = default.ini noinst_DATA = default_dev.ini local_dev.ini EXTRA_DIST = local.ini CLEANFILES = $(localconf_DATA) $(noinst_DATA) couchjs_command_name = `echo couchjs | sed '$(transform)'` couchjs_dev_command_name = `echo couchjs_dev | sed '$(transform)'` 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) --foreign etc/couchdb/Makefile'; \ $(am__cd) $(top_srcdir) && \ $(AUTOMAKE) --foreign etc/couchdb/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.ini.tpl: $(top_builddir)/config.status $(srcdir)/default.ini.tpl.in cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ mostlyclean-libtool: -rm -f *.lo clean-libtool: -rm -rf .libs _libs install-localconfDATA: $(localconf_DATA) @$(NORMAL_INSTALL) @list='$(localconf_DATA)'; test -n "$(localconfdir)" || list=; \ if test -n "$$list"; then \ echo " $(MKDIR_P) '$(DESTDIR)$(localconfdir)'"; \ $(MKDIR_P) "$(DESTDIR)$(localconfdir)" || 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)$(localconfdir)'"; \ $(INSTALL_DATA) $$files "$(DESTDIR)$(localconfdir)" || exit $$?; \ done uninstall-localconfDATA: @$(NORMAL_UNINSTALL) @list='$(localconf_DATA)'; test -n "$(localconfdir)" || list=; \ files=`for p in $$list; do echo $$p; done | sed -e 's|^.*/||'`; \ dir='$(DESTDIR)$(localconfdir)'; $(am__uninstall_files_from_dir) tags: TAGS TAGS: ctags: CTAGS CTAGS: 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)$(localconfdir)"; 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 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-localconfDATA @$(NORMAL_INSTALL) $(MAKE) $(AM_MAKEFLAGS) install-data-hook 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-local uninstall-localconfDATA .MAKE: install-am install-data-am install-strip .PHONY: all all-am check check-am clean clean-generic clean-libtool \ distclean distclean-generic distclean-libtool distdir dvi \ dvi-am html html-am info info-am install install-am \ install-data install-data-am install-data-hook install-dvi \ install-dvi-am install-exec install-exec-am install-html \ install-html-am install-info install-info-am \ install-localconfDATA 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 uninstall uninstall-am \ uninstall-local uninstall-localconfDATA @WINDOWS_TRUE@default.ini: default.ini.tpl @WINDOWS_TRUE@ sed -e "s|%bindir%|.|g" \ @WINDOWS_TRUE@ -e "s|%localconfdir%|$(localconfdir)|g" \ @WINDOWS_TRUE@ -e "s|%localdatadir%|../share/couchdb|g" \ @WINDOWS_TRUE@ -e "s|%localbuilddatadir%|../share/couchdb|g" \ @WINDOWS_TRUE@ -e "s|%localstatelibdir%|../var/lib/couchdb|g" \ @WINDOWS_TRUE@ -e "s|%localstatelogdir%|../var/log/couchdb|g" \ @WINDOWS_TRUE@ -e "s|%localstaterundir%|../var/run/couchdb|g" \ @WINDOWS_TRUE@ -e "s|%couchprivlibdir%|../lib/couch-$(version)/priv/lib|g" \ @WINDOWS_TRUE@ -e "s|%couchjs_command_name%|couchjs.exe|g" \ @WINDOWS_TRUE@ -e "s|%package_author_name%|$(package_author_name)|g" \ @WINDOWS_TRUE@ -e "s|%version%|$(version)|g" \ @WINDOWS_TRUE@ < $< > $@ @WINDOWS_FALSE@default.ini: default.ini.tpl @WINDOWS_FALSE@ sed -e "s|%bindir%|$(bindir)|g" \ @WINDOWS_FALSE@ -e "s|%localconfdir%|$(localconfdir)|g" \ @WINDOWS_FALSE@ -e "s|%localdatadir%|$(localdatadir)|g" \ @WINDOWS_FALSE@ -e "s|%localbuilddatadir%|$(localdatadir)|g" \ @WINDOWS_FALSE@ -e "s|%locallibdir%|$(locallibdir)|g" \ @WINDOWS_FALSE@ -e "s|%localstatelibdir%|$(localstatelibdir)|g" \ @WINDOWS_FALSE@ -e "s|%localstatelogdir%|$(localstatelogdir)|g" \ @WINDOWS_FALSE@ -e "s|%localstaterundir%|$(localstaterundir)|g" \ @WINDOWS_FALSE@ -e "s|%couchprivlibdir%|$(couchprivlibdir)|g" \ @WINDOWS_FALSE@ -e "s|%couchjs_command_name%|$(couchjs_command_name)|g" \ @WINDOWS_FALSE@ -e "s|%package_author_name%|$(package_author_name)|g" \ @WINDOWS_FALSE@ -e "s|%version%|$(version)|g" \ @WINDOWS_FALSE@ < $< > $@ default_dev.ini: default.ini.tpl sed -e "s|%bindir%|$(abs_top_builddir)/bin|g" \ -e "s|%localconfdir%|$(abs_top_builddir)/etc/couchdb|g" \ -e "s|%localdatadir%|$(abs_top_srcdir)/share|g" \ -e "s|%locallibdir%|$(abs_top_builddir)/tmp|g" \ -e "s|%localbuilddatadir%|$(abs_top_builddir)/share|g" \ -e "s|%localstatelibdir%|$(abs_top_builddir)/tmp/lib|g" \ -e "s|%localstatelogdir%|$(abs_top_builddir)/tmp/log|g" \ -e "s|%localstaterundir%|$(abs_top_builddir)/tmp/run|g" \ -e "s|%couchprivlibdir%|$(devcouchprivlibdir)|g" \ -e "s|%couchjs_command_name%|$(couchjs_dev_command_name)|g" \ -e "s|%package_author_name%|$(package_author_name)|g" \ -e "s|%version%|$(version)|g" \ < $< > $@ # Noah said to not specify local.ini but it borks # VPATH builds that make distcheck uses. local_dev.ini: local.ini if test ! -f "$@"; then \ cp $< $@; \ chmod +w $@; \ fi install-data-hook: if test ! -f "$(DESTDIR)$(localconfdir)/local.ini"; then \ cp $(srcdir)/local.ini "$(DESTDIR)$(localconfdir)/local.ini"; \ fi if test ! "$(mkdir_p)" = ""; then \ $(mkdir_p) "$(DESTDIR)$(localconfdir)/default.d"; \ $(mkdir_p) "$(DESTDIR)$(localconfdir)/local.d"; \ else \ echo "WARNING: You may have to create these directories by hand."; \ mkdir -p "$(DESTDIR)$(localconfdir)/default.d"; \ mkdir -p "$(DESTDIR)$(localconfdir)/local.d"; \ fi uninstall-local: rm -f "$(DESTDIR)/$(localconfdir)/local.ini" # 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: apache-couchdb-1.6.0/etc/couchdb/local.ini0000644000175000001440000000721712332105522020302 0ustar00djcusers00000000000000; CouchDB Configuration Settings ; Custom settings should be made in this file. They will override settings ; in default.ini, but unlike changes made to default.ini, this file won't be ; overwritten on server upgrade. [couchdb] ;max_document_size = 4294967296 ; bytes [httpd] ;port = 5984 ;bind_address = 127.0.0.1 ; Options for the MochiWeb HTTP server. ;server_options = [{backlog, 128}, {acceptor_pool_size, 16}] ; For more socket options, consult Erlang's module 'inet' man page. ;socket_options = [{recbuf, 262144}, {sndbuf, 262144}, {nodelay, true}] ; Uncomment next line to trigger basic-auth popup on unauthorized requests. ;WWW-Authenticate = Basic realm="administrator" ; Uncomment next line to set the configuration modification whitelist. Only ; whitelisted values may be changed via the /_config URLs. To allow the admin ; to change this value over HTTP, remember to include {httpd,config_whitelist} ; itself. Excluding it from the list would require editing this file to update ; the whitelist. ;config_whitelist = [{httpd,config_whitelist}, {log,level}, {etc,etc}] [query_servers] ;nodejs = /usr/local/bin/couchjs-node /path/to/couchdb/share/server/main.js [httpd_global_handlers] ;_google = {couch_httpd_proxy, handle_proxy_req, <<"http://www.google.com">>} [couch_httpd_auth] ; If you set this to true, you should also uncomment the WWW-Authenticate line ; above. If you don't configure a WWW-Authenticate header, CouchDB will send ; Basic realm="server" in order to prevent you getting logged out. ; require_valid_user = false [log] ;level = debug [log_level_by_module] ; In this section you can specify any of the four log levels 'none', 'info', ; 'error' or 'debug' on a per-module basis. See src/*/*.erl for various ; modules. ;couch_httpd = error [os_daemons] ; For any commands listed here, CouchDB will attempt to ensure that ; the process remains alive. Daemons should monitor their environment ; to know when to exit. This can most easily be accomplished by exiting ; when stdin is closed. ;foo = /path/to/command -with args [daemons] ; enable SSL support by uncommenting the following line and supply the PEM's below. ; the default ssl port CouchDB listens on is 6984 ; httpsd = {couch_httpd, start_link, [https]} [ssl] ;cert_file = /full/path/to/server_cert.pem ;key_file = /full/path/to/server_key.pem ;password = somepassword ; set to true to validate peer certificates verify_ssl_certificates = false ; Path to file containing PEM encoded CA certificates (trusted ; certificates used for verifying a peer certificate). May be omitted if ; you do not want to verify the peer. ;cacert_file = /full/path/to/cacertf ; The verification fun (optional) if not specified, the default ; verification fun will be used. ;verify_fun = {Module, VerifyFun} ; maximum peer certificate depth ssl_certificate_max_depth = 1 ; To enable Virtual Hosts in CouchDB, add a vhost = path directive. All requests to ; the Virual Host will be redirected to the path. In the example below all requests ; to http://example.com/ are redirected to /database. ; If you run CouchDB on a specific port, include the port number in the vhost: ; example.com:5984 = /database [vhosts] ;example.com = /database/ [update_notification] ;unique notifier name=/full/path/to/exe -with "cmd line arg" ; To create an admin account uncomment the '[admins]' section below and add a ; line in the format 'username = password'. When you next start CouchDB, it ; will change the password to a hash (so that your passwords don't linger ; around in plain-text files). You can add more admin accounts with more ; 'username = password' lines. Don't forget to restart CouchDB after ; changing this. [admins] ;admin = mysecretpassword apache-couchdb-1.6.0/etc/couchdb/default.ini.tpl.in0000644000175000001440000003604312332105522022036 0ustar00djcusers00000000000000; @configure_input@ ; Upgrading CouchDB will overwrite this file. [vendor] name = %package_author_name% version = %version% [couchdb] database_dir = %localstatelibdir% view_index_dir = %localstatelibdir% util_driver_dir = %couchprivlibdir% max_document_size = 4294967296 ; 4 GB os_process_timeout = 5000 ; 5 seconds. for view and external servers. max_dbs_open = 100 delayed_commits = true ; set this to false to ensure an fsync before 201 Created is returned uri_file = %localstaterundir%/couch.uri ; Method used to compress everything that is appended to database and view index files, except ; for attachments (see the attachments section). Available methods are: ; ; none - no compression ; snappy - use google snappy, a very fast compressor/decompressor ; deflate_[N] - use zlib's deflate, N is the compression level which ranges from 1 (fastest, ; lowest compression ratio) to 9 (slowest, highest compression ratio) file_compression = snappy ; Higher values may give better read performance due to less read operations ; and/or more OS page cache hits, but they can also increase overall response ; time for writes when there are many attachment write requests in parallel. attachment_stream_buffer_size = 4096 plugin_dir = %locallibdir%/plugins [database_compaction] ; larger buffer sizes can originate smaller files doc_buffer_size = 524288 ; value in bytes checkpoint_after = 5242880 ; checkpoint after every N bytes were written [view_compaction] ; larger buffer sizes can originate smaller files keyvalue_buffer_size = 2097152 ; value in bytes [httpd] port = 5984 bind_address = 127.0.0.1 authentication_handlers = {couch_httpd_oauth, oauth_authentication_handler}, {couch_httpd_auth, cookie_authentication_handler}, {couch_httpd_auth, default_authentication_handler} default_handler = {couch_httpd_db, handle_request} secure_rewrites = true vhost_global_handlers = _utils, _uuids, _session, _oauth, _users allow_jsonp = false ; Options for the MochiWeb HTTP server. ;server_options = [{backlog, 128}, {acceptor_pool_size, 16}] ; For more socket options, consult Erlang's module 'inet' man page. ;socket_options = [{recbuf, 262144}, {sndbuf, 262144}, {nodelay, true}] socket_options = [{recbuf, 262144}, {sndbuf, 262144}] log_max_chunk_size = 1000000 enable_cors = false ; CouchDB can optionally enforce a maximum uri length; ; max_uri_length = 8000 [ssl] port = 6984 [log] file = %localstatelogdir%/couch.log level = info include_sasl = true [couch_httpd_auth] authentication_db = _users authentication_redirect = /_utils/session.html require_valid_user = false timeout = 600 ; number of seconds before automatic logout auth_cache_size = 50 ; size is number of cache entries allow_persistent_cookies = false ; set to true to allow persistent cookies iterations = 10 ; iterations for password hashing ; min_iterations = 1 ; max_iterations = 1000000000 ; comma-separated list of public fields, 404 if empty ; public_fields = [cors] credentials = false ; List of origins separated by a comma, * means accept all ; Origins must include the scheme: http://example.com ; You can’t set origins: * and credentials = true at the same time. ;origins = * ; List of accepted headers separated by a comma ; headers = ; List of accepted methods ; methods = ; Configuration for a vhost ;[cors:http://example.com] ; credentials = false ; List of origins separated by a comma ; Origins must include the scheme: http://example.com ; You can’t set origins: * and credentials = true at the same time. ;origins = ; List of accepted headers separated by a comma ; headers = ; List of accepted methods ; methods = [couch_httpd_oauth] ; If set to 'true', oauth token and consumer secrets will be looked up ; in the authentication database (_users). These secrets are stored in ; a top level property named "oauth" in user documents. Example: ; { ; "_id": "org.couchdb.user:joe", ; "type": "user", ; "name": "joe", ; "password_sha": "fe95df1ca59a9b567bdca5cbaf8412abd6e06121", ; "salt": "4e170ffeb6f34daecfd814dfb4001a73" ; "roles": ["foo", "bar"], ; "oauth": { ; "consumer_keys": { ; "consumerKey1": "key1Secret", ; "consumerKey2": "key2Secret" ; }, ; "tokens": { ; "token1": "token1Secret", ; "token2": "token2Secret" ; } ; } ; } use_users_db = false [query_servers] javascript = %bindir%/%couchjs_command_name% %localbuilddatadir%/server/main.js coffeescript = %bindir%/%couchjs_command_name% %localbuilddatadir%/server/main-coffee.js ; Changing reduce_limit to false will disable reduce_limit. ; If you think you're hitting reduce_limit with a "good" reduce function, ; please let us know on the mailing list so we can fine tune the heuristic. [query_server_config] reduce_limit = true os_process_limit = 25 [daemons] index_server={couch_index_server, start_link, []} external_manager={couch_external_manager, start_link, []} query_servers={couch_query_servers, start_link, []} vhosts={couch_httpd_vhost, start_link, []} httpd={couch_httpd, start_link, []} stats_aggregator={couch_stats_aggregator, start, []} stats_collector={couch_stats_collector, start, []} uuids={couch_uuids, start, []} auth_cache={couch_auth_cache, start_link, []} replicator_manager={couch_replicator_manager, start_link, []} os_daemons={couch_os_daemons, start_link, []} compaction_daemon={couch_compaction_daemon, start_link, []} [httpd_global_handlers] / = {couch_httpd_misc_handlers, handle_welcome_req, <<"Welcome">>} favicon.ico = {couch_httpd_misc_handlers, handle_favicon_req, "%localdatadir%/www"} _utils = {couch_httpd_misc_handlers, handle_utils_dir_req, "%localdatadir%/www"} _all_dbs = {couch_httpd_misc_handlers, handle_all_dbs_req} _active_tasks = {couch_httpd_misc_handlers, handle_task_status_req} _config = {couch_httpd_misc_handlers, handle_config_req} _replicate = {couch_replicator_httpd, handle_req} _uuids = {couch_httpd_misc_handlers, handle_uuids_req} _restart = {couch_httpd_misc_handlers, handle_restart_req} _stats = {couch_httpd_stats_handlers, handle_stats_req} _log = {couch_httpd_misc_handlers, handle_log_req} _session = {couch_httpd_auth, handle_session_req} _oauth = {couch_httpd_oauth, handle_oauth_req} _db_updates = {couch_dbupdates_httpd, handle_req} _plugins = {couch_plugins_httpd, handle_req} [httpd_db_handlers] _all_docs = {couch_mrview_http, handle_all_docs_req} _changes = {couch_httpd_db, handle_changes_req} _compact = {couch_httpd_db, handle_compact_req} _design = {couch_httpd_db, handle_design_req} _temp_view = {couch_mrview_http, handle_temp_view_req} _view_cleanup = {couch_mrview_http, handle_cleanup_req} ; The external module takes an optional argument allowing you to narrow it to a ; single script. Otherwise the script name is inferred from the first path section ; after _external's own path. ; _mypath = {couch_httpd_external, handle_external_req, <<"mykey">>} ; _external = {couch_httpd_external, handle_external_req} [httpd_design_handlers] _compact = {couch_mrview_http, handle_compact_req} _info = {couch_mrview_http, handle_info_req} _list = {couch_mrview_show, handle_view_list_req} _rewrite = {couch_httpd_rewrite, handle_rewrite_req} _show = {couch_mrview_show, handle_doc_show_req} _update = {couch_mrview_show, handle_doc_update_req} _view = {couch_mrview_http, handle_view_req} ; enable external as an httpd handler, then link it with commands here. ; note, this api is still under consideration. ; [external] ; mykey = /path/to/mycommand ; Here you can setup commands for CouchDB to manage ; while it is alive. It will attempt to keep each command ; alive if it exits. ; [os_daemons] ; some_daemon_name = /path/to/script -with args [uuids] ; Known algorithms: ; random - 128 bits of random awesome ; All awesome, all the time. ; sequential - monotonically increasing ids with random increments ; First 26 hex characters are random. Last 6 increment in ; random amounts until an overflow occurs. On overflow, the ; random prefix is regenerated and the process starts over. ; utc_random - Time since Jan 1, 1970 UTC with microseconds ; First 14 characters are the time in hex. Last 18 are random. ; utc_id - Time since Jan 1, 1970 UTC with microseconds, plus utc_id_suffix string ; First 14 characters are the time in hex. uuids/utc_id_suffix string value is appended to these. algorithm = sequential ; The utc_id_suffix value will be appended to uuids generated by the utc_id algorithm. ; Replicating instances should have unique utc_id_suffix values to ensure uniqueness of utc_id ids. utc_id_suffix = # Maximum number of UUIDs retrievable from /_uuids in a single request max_count = 1000 [stats] ; rate is in milliseconds rate = 1000 ; sample intervals are in seconds samples = [0, 60, 300, 900] [attachments] compression_level = 8 ; from 1 (lowest, fastest) to 9 (highest, slowest), 0 to disable compression compressible_types = text/*, application/javascript, application/json, application/xml [replicator] db = _replicator ; Maximum replicaton retry count can be a non-negative integer or "infinity". max_replication_retry_count = 10 ; More worker processes can give higher network throughput but can also ; imply more disk and network IO. worker_processes = 4 ; With lower batch sizes checkpoints are done more frequently. Lower batch sizes ; also reduce the total amount of used RAM memory. worker_batch_size = 500 ; Maximum number of HTTP connections per replication. http_connections = 20 ; HTTP connection timeout per replication. ; Even for very fast/reliable networks it might need to be increased if a remote ; database is too busy. connection_timeout = 30000 ; If a request fails, the replicator will retry it up to N times. retries_per_request = 10 ; Some socket options that might boost performance in some scenarios: ; {nodelay, boolean()} ; {sndbuf, integer()} ; {recbuf, integer()} ; {priority, integer()} ; See the `inet` Erlang module's man page for the full list of options. socket_options = [{keepalive, true}, {nodelay, false}] ; Path to a file containing the user's certificate. ;cert_file = /full/path/to/server_cert.pem ; Path to file containing user's private PEM encoded key. ;key_file = /full/path/to/server_key.pem ; String containing the user's password. Only used if the private keyfile is password protected. ;password = somepassword ; Set to true to validate peer certificates. verify_ssl_certificates = false ; File containing a list of peer trusted certificates (in the PEM format). ;ssl_trusted_certificates_file = /etc/ssl/certs/ca-certificates.crt ; Maximum peer certificate depth (must be set even if certificate validation is off). ssl_certificate_max_depth = 3 [compaction_daemon] ; The delay, in seconds, between each check for which database and view indexes ; need to be compacted. check_interval = 300 ; If a database or view index file is smaller then this value (in bytes), ; compaction will not happen. Very small files always have a very high ; fragmentation therefore it's not worth to compact them. min_file_size = 131072 [compactions] ; List of compaction rules for the compaction daemon. ; The daemon compacts databases and their respective view groups when all the ; condition parameters are satisfied. Configuration can be per database or ; global, and it has the following format: ; ; database_name = [ {ParamName, ParamValue}, {ParamName, ParamValue}, ... ] ; _default = [ {ParamName, ParamValue}, {ParamName, ParamValue}, ... ] ; ; Possible parameters: ; ; * db_fragmentation - If the ratio (as an integer percentage), of the amount ; of old data (and its supporting metadata) over the database ; file size is equal to or greater then this value, this ; database compaction condition is satisfied. ; This value is computed as: ; ; (file_size - data_size) / file_size * 100 ; ; The data_size and file_size values can be obtained when ; querying a database's information URI (GET /dbname/). ; ; * view_fragmentation - If the ratio (as an integer percentage), of the amount ; of old data (and its supporting metadata) over the view ; index (view group) file size is equal to or greater then ; this value, then this view index compaction condition is ; satisfied. This value is computed as: ; ; (file_size - data_size) / file_size * 100 ; ; The data_size and file_size values can be obtained when ; querying a view group's information URI ; (GET /dbname/_design/groupname/_info). ; ; * from _and_ to - The period for which a database (and its view groups) compaction ; is allowed. The value for these parameters must obey the format: ; ; HH:MM - HH:MM (HH in [0..23], MM in [0..59]) ; ; * strict_window - If a compaction is still running after the end of the allowed ; period, it will be canceled if this parameter is set to 'true'. ; It defaults to 'false' and it's meaningful only if the *period* ; parameter is also specified. ; ; * parallel_view_compaction - If set to 'true', the database and its views are ; compacted in parallel. This is only useful on ; certain setups, like for example when the database ; and view index directories point to different ; disks. It defaults to 'false'. ; ; Before a compaction is triggered, an estimation of how much free disk space is ; needed is computed. This estimation corresponds to 2 times the data size of ; the database or view index. When there's not enough free disk space to compact ; a particular database or view index, a warning message is logged. ; ; Examples: ; ; 1) [{db_fragmentation, "70%"}, {view_fragmentation, "60%"}] ; The `foo` database is compacted if its fragmentation is 70% or more. ; Any view index of this database is compacted only if its fragmentation ; is 60% or more. ; ; 2) [{db_fragmentation, "70%"}, {view_fragmentation, "60%"}, {from, "00:00"}, {to, "04:00"}] ; Similar to the preceding example but a compaction (database or view index) ; is only triggered if the current time is between midnight and 4 AM. ; ; 3) [{db_fragmentation, "70%"}, {view_fragmentation, "60%"}, {from, "00:00"}, {to, "04:00"}, {strict_window, true}] ; Similar to the preceding example - a compaction (database or view index) ; is only triggered if the current time is between midnight and 4 AM. If at ; 4 AM the database or one of its views is still compacting, the compaction ; process will be canceled. ; ; 4) [{db_fragmentation, "70%"}, {view_fragmentation, "60%"}, {from, "00:00"}, {to, "04:00"}, {strict_window, true}, {parallel_view_compaction, true}] ; Similar to the preceding example, but a database and its views can be ; compacted in parallel. ; ;_default = [{db_fragmentation, "70%"}, {view_fragmentation, "60%"}, {from, "23:00"}, {to, "04:00"}] apache-couchdb-1.6.0/etc/launchd/0000755000175000001440000000000012332105600016504 5ustar00djcusers00000000000000apache-couchdb-1.6.0/etc/launchd/org.apache.couchdb.plist.tpl.in0000644000175000001440000000147312332105522024411 0ustar00djcusers00000000000000 Label org.apache.couchdb EnvironmentVariables HOME ~ DYLD_LIBRARY_PATH /opt/local/lib:$DYLD_LIBRARY_PATH ProgramArguments %bindir%/%couchdb_command_name% UserName couchdb StandardOutPath /dev/null StandardErrorPath /dev/null RunAtLoad KeepAlive apache-couchdb-1.6.0/etc/launchd/Makefile.am0000644000175000001440000000112112332105522020536 0ustar00djcusers00000000000000## Licensed under the Apache License, Version 2.0 (the "License"); you may not ## use this file except in compliance with the License. You may obtain a copy of ## the License at ## ## http://www.apache.org/licenses/LICENSE-2.0 ## ## Unless required by applicable law or agreed to in writing, software ## distributed under the License is distributed on an "AS IS" BASIS, WITHOUT ## WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the ## License for the specific language governing permissions and limitations under ## the License. ## This file intentionally left blank. apache-couchdb-1.6.0/etc/launchd/Makefile.in0000644000175000001440000003046612332105550020566 0ustar00djcusers00000000000000# Makefile.in generated by automake 1.11.6 from Makefile.am. # @configure_input@ # Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, # 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011 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__make_dryrun = \ { \ am__dry=no; \ case $$MAKEFLAGS in \ *\\[\ \ ]*) \ echo 'am--echo: ; @echo "AM" OK' | $(MAKE) -f - 2>/dev/null \ | grep '^AM OK$$' >/dev/null || am__dry=yes;; \ *) \ for am__flg in $$MAKEFLAGS; do \ case $$am__flg in \ *=*|--*) ;; \ *n*) am__dry=yes; break;; \ esac; \ done;; \ esac; \ test $$am__dry = yes; \ } 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 = etc/launchd DIST_COMMON = $(srcdir)/Makefile.am $(srcdir)/Makefile.in \ $(srcdir)/org.apache.couchdb.plist.tpl.in ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 am__aclocal_m4_deps = $(top_srcdir)/m4/libtool.m4 \ $(top_srcdir)/m4/ltoptions.m4 $(top_srcdir)/m4/ltsugar.m4 \ $(top_srcdir)/m4/ltversion.m4 $(top_srcdir)/m4/lt~obsolete.m4 \ $(top_srcdir)/acinclude.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 \ $(top_builddir)/src/snappy/google-snappy/config.h CONFIG_CLEAN_FILES = org.apache.couchdb.plist.tpl CONFIG_CLEAN_VPATH_FILES = 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 DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) ACLOCAL = @ACLOCAL@ AMTAR = @AMTAR@ AR = @AR@ AS = @AS@ AUTOCONF = @AUTOCONF@ AUTOHEADER = @AUTOHEADER@ AUTOMAKE = @AUTOMAKE@ AWK = @AWK@ CC = @CC@ CCDEPMODE = @CCDEPMODE@ CFLAGS = @CFLAGS@ CPP = @CPP@ CPPFLAGS = @CPPFLAGS@ CURL_CFLAGS = @CURL_CFLAGS@ CURL_CONFIG = @CURL_CONFIG@ CURL_LIBS = @CURL_LIBS@ CXX = @CXX@ CXXCPP = @CXXCPP@ CXXDEPMODE = @CXXDEPMODE@ CXXFLAGS = @CXXFLAGS@ CYGPATH_W = @CYGPATH_W@ DEFS = @DEFS@ DEPDIR = @DEPDIR@ DLLTOOL = @DLLTOOL@ DSYMUTIL = @DSYMUTIL@ DUMPBIN = @DUMPBIN@ ECHO_C = @ECHO_C@ ECHO_N = @ECHO_N@ ECHO_T = @ECHO_T@ EGREP = @EGREP@ ERL = @ERL@ ERLANG_FLAGS = @ERLANG_FLAGS@ ERLC = @ERLC@ ERLC_FLAGS = @ERLC_FLAGS@ ESCRIPT = @ESCRIPT@ EXEEXT = @EXEEXT@ FGREP = @FGREP@ FLAGS = @FLAGS@ GREP = @GREP@ HAS_HELP2MAN = @HAS_HELP2MAN@ HAS_INSTALLINFO = @HAS_INSTALLINFO@ HAS_MAKEINFO = @HAS_MAKEINFO@ HAS_PDFLATEX = @HAS_PDFLATEX@ HAS_SPHINX_BUILD = @HAS_SPHINX_BUILD@ ICU_BIN = @ICU_BIN@ ICU_CFLAGS = @ICU_CFLAGS@ ICU_CONFIG = @ICU_CONFIG@ ICU_CPPFLAGS = @ICU_CPPFLAGS@ ICU_CXXFLAGS = @ICU_CXXFLAGS@ ICU_LIBS = @ICU_LIBS@ INNO_COMPILER_EXECUTABLE = @INNO_COMPILER_EXECUTABLE@ INSTALL = @INSTALL@ INSTALL_DATA = @INSTALL_DATA@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ INSTALL_SCRIPT = @INSTALL_SCRIPT@ INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ JS_CFLAGS = @JS_CFLAGS@ JS_LIBS = @JS_LIBS@ JS_LIB_BINARY = @JS_LIB_BINARY@ LD = @LD@ LDFLAGS = @LDFLAGS@ LIBOBJS = @LIBOBJS@ LIBS = @LIBS@ LIBTOOL = @LIBTOOL@ LIPO = @LIPO@ LN_S = @LN_S@ LTLIBOBJS = @LTLIBOBJS@ MAKEINFO = @MAKEINFO@ MANIFEST_TOOL = @MANIFEST_TOOL@ MKDIR_P = @MKDIR_P@ NM = @NM@ NMEDIT = @NMEDIT@ OBJDUMP = @OBJDUMP@ OBJEXT = @OBJEXT@ OTOOL = @OTOOL@ OTOOL64 = @OTOOL64@ PACKAGE = @PACKAGE@ PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ PACKAGE_NAME = @PACKAGE_NAME@ PACKAGE_STRING = @PACKAGE_STRING@ PACKAGE_TARNAME = @PACKAGE_TARNAME@ PACKAGE_URL = @PACKAGE_URL@ PACKAGE_VERSION = @PACKAGE_VERSION@ PATH_SEPARATOR = @PATH_SEPARATOR@ PKG_CONFIG = @PKG_CONFIG@ PKG_CONFIG_LIBDIR = @PKG_CONFIG_LIBDIR@ PKG_CONFIG_PATH = @PKG_CONFIG_PATH@ RANLIB = @RANLIB@ SED = @SED@ SET_MAKE = @SET_MAKE@ SHELL = @SHELL@ SNAPPY_MAJOR = @SNAPPY_MAJOR@ SNAPPY_MINOR = @SNAPPY_MINOR@ SNAPPY_PATCHLEVEL = @SNAPPY_PATCHLEVEL@ STRIP = @STRIP@ VERSION = @VERSION@ 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@ ac_cv_have_stddef_h = @ac_cv_have_stddef_h@ ac_cv_have_stdint_h = @ac_cv_have_stdint_h@ am__include = @am__include@ am__leading_dot = @am__leading_dot@ am__quote = @am__quote@ am__tar = @am__tar@ am__untar = @am__untar@ bindir = @bindir@ bug_uri = @bug_uri@ 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@ dvidir = @dvidir@ erlangbin = @erlangbin@ erlangversion = @erlangversion@ exec_prefix = @exec_prefix@ host = @host@ host_alias = @host_alias@ host_cpu = @host_cpu@ host_os = @host_os@ host_vendor = @host_vendor@ htmldir = @htmldir@ includedir = @includedir@ infodir = @infodir@ initdir = @initdir@ install_sh = @install_sh@ launchddir = @launchddir@ libdir = @libdir@ libexecdir = @libexecdir@ localconfdir = @localconfdir@ localdatadir = @localdatadir@ localdocdir = @localdocdir@ localedir = @localedir@ localerlanglibdir = @localerlanglibdir@ locallibbindir = @locallibbindir@ locallibdir = @locallibdir@ localstatedir = @localstatedir@ localstatelibdir = @localstatelibdir@ localstatelogdir = @localstatelogdir@ localstaterundir = @localstaterundir@ mandir = @mandir@ mkdir_p = @mkdir_p@ msvc_redist_dir = @msvc_redist_dir@ msvc_redist_name = @msvc_redist_name@ oldincludedir = @oldincludedir@ openssl_bin_dir = @openssl_bin_dir@ otp_release = @otp_release@ package_author_address = @package_author_address@ package_author_name = @package_author_name@ package_identifier = @package_identifier@ package_name = @package_name@ package_tarname = @package_tarname@ 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@ version = @version@ version_major = @version_major@ version_minor = @version_minor@ version_release = @version_release@ version_revision = @version_revision@ version_stage = @version_stage@ 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) --foreign etc/launchd/Makefile'; \ $(am__cd) $(top_srcdir) && \ $(AUTOMAKE) --foreign etc/launchd/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): org.apache.couchdb.plist.tpl: $(top_builddir)/config.status $(srcdir)/org.apache.couchdb.plist.tpl.in cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ mostlyclean-libtool: -rm -f *.lo clean-libtool: -rm -rf .libs _libs tags: TAGS TAGS: ctags: CTAGS CTAGS: 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 \ 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 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: apache-couchdb-1.6.0/etc/Makefile.am0000644000175000001440000000742412332105522017134 0ustar00djcusers00000000000000## Licensed under the Apache License, Version 2.0 (the "License"); you may not ## use this file except in compliance with the License. You may obtain a copy of ## the License at ## ## http://www.apache.org/licenses/LICENSE-2.0 ## ## Unless required by applicable law or agreed to in writing, software ## distributed under the License is distributed on an "AS IS" BASIS, WITHOUT ## WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the ## License for the specific language governing permissions and limitations under ## the License. SUBDIRS = couchdb default init launchd logrotate.d windows default_sysconf_data = logrotate.d/couchdb if INIT init_sysconf_data = default/couchdb init_DATA = init/couchdb endif if LAUNCHD launchd_DATA = launchd/org.apache.couchdb.plist endif nobase_sysconf_DATA = $(default_sysconf_data) $(init_sysconf_data) EXTRA_DIST = \ default/couchdb \ windows/couchdb.iss.tpl \ windows/README.txt.tpl if WINDOWS EXTRA_DIST += \ windows/setup-couchdb-@version@.exe.md5 \ windows/setup-couchdb-@version@.exe.sha endif CLEANFILES = $(init_DATA) $(default_sysconf_data) $(launchd_DATA) transform = @program_transform_name@ couchdb_command_name = `echo couchdb | sed '$(transform)'` init/couchdb: init/couchdb.tpl if test "$(mkdir_p)"; then \ $(mkdir_p) init; \ else \ if test ! -d init; then \ mkdir init; \ fi \ fi sed -e "s|%configure_input%|$@. Generated from $< by configure.|" \ -e "s|%bindir%|$(bindir)|" \ -e "s|%sysconfdir%|$(sysconfdir)|" \ -e "s|%localstaterundir%|$(localstaterundir)|" \ -e "s|%couchdb_command_name%|$(couchdb_command_name)|" \ < $< > $@ logrotate.d/couchdb: logrotate.d/couchdb.tpl sed -e "s|%localstatelogdir%|@localstatelogdir@|g" < $< > $@ launchd/org.apache.couchdb.plist: launchd/org.apache.couchdb.plist.tpl if test "$(mkdir_p)"; then \ $(mkdir_p) launchd; \ else \ if test ! -d launchd; then \ mkdir launchd; \ fi \ fi sed -e "s|%configure_input%|$@. Generated from $< by configure.|" \ -e "s|%bindir%|$(bindir)|" \ -e "s|%couchdb_command_name%|$(couchdb_command_name)|" \ < $< > $@ if WINDOWS # README.txt has \n line endings in the repo and must have \r\n # when installed as notepad is used to view it. # Also: the targets below don't seem to update after an svn-up (which # changes the version string in the generated files) so we trick make # into always building it with the FORCE pattern... windows/README.txt: windows/README.txt.tpl FORCE sed -e "s|%package_name%|@package_name@|g" \ -e "s|%version%|@version@|g" \ < $< | unix2dos > $@ windows/couchdb.iss: windows/couchdb.iss.tpl FORCE sed -e "s|%configure_input%|$@. Generated from $< by configure.|" \ -e "s|%package_name%|@package_name@|g" \ -e "s|%locallibbindir%|`cygpath -m @locallibbindir@`|g" \ -e "s|%version%|@version@|g" \ -e "s|%erts_version%|`$(ERL) -version 2>&1 | $(SED) 's/[^0-9\.]//g'`|g" \ -e "s|%openssl_bin_dir%|@openssl_bin_dir@|g" \ -e "s|%msvc_redist_dir%|@msvc_redist_dir@|g" \ -e "s|%msvc_redist_name%|@msvc_redist_name@|g" \ < $< > $@ # The installer depends on all files, not just the source .iss file, # so we trick make into always building it with the FORCE pattern... windows/setup-couchdb-@version@.exe: windows/couchdb.iss windows/README.txt FORCE "$(INNO_COMPILER_EXECUTABLE)" /q $< @echo Windows Installer is at: `cygpath -a -w windows/setup-couchdb-@version@.exe` windows/setup-couchdb-@version@.exe.md5: windows/setup-couchdb-@version@.exe cd windows && md5sum ./$( $(@F) windows/setup-couchdb-@version@.exe.sha: windows/setup-couchdb-@version@.exe cd windows && sha1sum ./$( $(@F) FORCE: endif install-data-hook: if test -n "$(init_DATA)"; then \ chmod +x "$(DESTDIR)$(initdir)/couchdb"; \ fi apache-couchdb-1.6.0/etc/Makefile.in0000644000175000001440000006575112332105547017163 0ustar00djcusers00000000000000# Makefile.in generated by automake 1.11.6 from Makefile.am. # @configure_input@ # Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, # 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011 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__make_dryrun = \ { \ am__dry=no; \ case $$MAKEFLAGS in \ *\\[\ \ ]*) \ echo 'am--echo: ; @echo "AM" OK' | $(MAKE) -f - 2>/dev/null \ | grep '^AM OK$$' >/dev/null || am__dry=yes;; \ *) \ for am__flg in $$MAKEFLAGS; do \ case $$am__flg in \ *=*|--*) ;; \ *n*) am__dry=yes; break;; \ esac; \ done;; \ esac; \ test $$am__dry = yes; \ } 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) NORMAL_INSTALL = : PRE_INSTALL = : POST_INSTALL = : NORMAL_UNINSTALL = : PRE_UNINSTALL = : POST_UNINSTALL = : build_triplet = @build@ host_triplet = @host@ @WINDOWS_TRUE@am__append_1 = \ @WINDOWS_TRUE@ windows/setup-couchdb-@version@.exe.md5 \ @WINDOWS_TRUE@ windows/setup-couchdb-@version@.exe.sha subdir = etc DIST_COMMON = $(srcdir)/Makefile.am $(srcdir)/Makefile.in ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 am__aclocal_m4_deps = $(top_srcdir)/m4/libtool.m4 \ $(top_srcdir)/m4/ltoptions.m4 $(top_srcdir)/m4/ltsugar.m4 \ $(top_srcdir)/m4/ltversion.m4 $(top_srcdir)/m4/lt~obsolete.m4 \ $(top_srcdir)/acinclude.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 \ $(top_builddir)/src/snappy/google-snappy/config.h CONFIG_CLEAN_FILES = CONFIG_CLEAN_VPATH_FILES = SOURCES = DIST_SOURCES = RECURSIVE_TARGETS = all-recursive check-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 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)$(initdir)" "$(DESTDIR)$(launchddir)" \ "$(DESTDIR)$(sysconfdir)" DATA = $(init_DATA) $(launchd_DATA) $(nobase_sysconf_DATA) RECURSIVE_CLEAN_TARGETS = mostlyclean-recursive clean-recursive \ distclean-recursive maintainer-clean-recursive AM_RECURSIVE_TARGETS = $(RECURSIVE_TARGETS:-recursive=) \ $(RECURSIVE_CLEAN_TARGETS:-recursive=) tags TAGS ctags CTAGS \ distdir 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" transform = @program_transform_name@ ACLOCAL = @ACLOCAL@ AMTAR = @AMTAR@ AR = @AR@ AS = @AS@ AUTOCONF = @AUTOCONF@ AUTOHEADER = @AUTOHEADER@ AUTOMAKE = @AUTOMAKE@ AWK = @AWK@ CC = @CC@ CCDEPMODE = @CCDEPMODE@ CFLAGS = @CFLAGS@ CPP = @CPP@ CPPFLAGS = @CPPFLAGS@ CURL_CFLAGS = @CURL_CFLAGS@ CURL_CONFIG = @CURL_CONFIG@ CURL_LIBS = @CURL_LIBS@ CXX = @CXX@ CXXCPP = @CXXCPP@ CXXDEPMODE = @CXXDEPMODE@ CXXFLAGS = @CXXFLAGS@ CYGPATH_W = @CYGPATH_W@ DEFS = @DEFS@ DEPDIR = @DEPDIR@ DLLTOOL = @DLLTOOL@ DSYMUTIL = @DSYMUTIL@ DUMPBIN = @DUMPBIN@ ECHO_C = @ECHO_C@ ECHO_N = @ECHO_N@ ECHO_T = @ECHO_T@ EGREP = @EGREP@ ERL = @ERL@ ERLANG_FLAGS = @ERLANG_FLAGS@ ERLC = @ERLC@ ERLC_FLAGS = @ERLC_FLAGS@ ESCRIPT = @ESCRIPT@ EXEEXT = @EXEEXT@ FGREP = @FGREP@ FLAGS = @FLAGS@ GREP = @GREP@ HAS_HELP2MAN = @HAS_HELP2MAN@ HAS_INSTALLINFO = @HAS_INSTALLINFO@ HAS_MAKEINFO = @HAS_MAKEINFO@ HAS_PDFLATEX = @HAS_PDFLATEX@ HAS_SPHINX_BUILD = @HAS_SPHINX_BUILD@ ICU_BIN = @ICU_BIN@ ICU_CFLAGS = @ICU_CFLAGS@ ICU_CONFIG = @ICU_CONFIG@ ICU_CPPFLAGS = @ICU_CPPFLAGS@ ICU_CXXFLAGS = @ICU_CXXFLAGS@ ICU_LIBS = @ICU_LIBS@ INNO_COMPILER_EXECUTABLE = @INNO_COMPILER_EXECUTABLE@ INSTALL = @INSTALL@ INSTALL_DATA = @INSTALL_DATA@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ INSTALL_SCRIPT = @INSTALL_SCRIPT@ INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ JS_CFLAGS = @JS_CFLAGS@ JS_LIBS = @JS_LIBS@ JS_LIB_BINARY = @JS_LIB_BINARY@ LD = @LD@ LDFLAGS = @LDFLAGS@ LIBOBJS = @LIBOBJS@ LIBS = @LIBS@ LIBTOOL = @LIBTOOL@ LIPO = @LIPO@ LN_S = @LN_S@ LTLIBOBJS = @LTLIBOBJS@ MAKEINFO = @MAKEINFO@ MANIFEST_TOOL = @MANIFEST_TOOL@ MKDIR_P = @MKDIR_P@ NM = @NM@ NMEDIT = @NMEDIT@ OBJDUMP = @OBJDUMP@ OBJEXT = @OBJEXT@ OTOOL = @OTOOL@ OTOOL64 = @OTOOL64@ PACKAGE = @PACKAGE@ PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ PACKAGE_NAME = @PACKAGE_NAME@ PACKAGE_STRING = @PACKAGE_STRING@ PACKAGE_TARNAME = @PACKAGE_TARNAME@ PACKAGE_URL = @PACKAGE_URL@ PACKAGE_VERSION = @PACKAGE_VERSION@ PATH_SEPARATOR = @PATH_SEPARATOR@ PKG_CONFIG = @PKG_CONFIG@ PKG_CONFIG_LIBDIR = @PKG_CONFIG_LIBDIR@ PKG_CONFIG_PATH = @PKG_CONFIG_PATH@ RANLIB = @RANLIB@ SED = @SED@ SET_MAKE = @SET_MAKE@ SHELL = @SHELL@ SNAPPY_MAJOR = @SNAPPY_MAJOR@ SNAPPY_MINOR = @SNAPPY_MINOR@ SNAPPY_PATCHLEVEL = @SNAPPY_PATCHLEVEL@ STRIP = @STRIP@ VERSION = @VERSION@ 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@ ac_cv_have_stddef_h = @ac_cv_have_stddef_h@ ac_cv_have_stdint_h = @ac_cv_have_stdint_h@ am__include = @am__include@ am__leading_dot = @am__leading_dot@ am__quote = @am__quote@ am__tar = @am__tar@ am__untar = @am__untar@ bindir = @bindir@ bug_uri = @bug_uri@ 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@ dvidir = @dvidir@ erlangbin = @erlangbin@ erlangversion = @erlangversion@ exec_prefix = @exec_prefix@ host = @host@ host_alias = @host_alias@ host_cpu = @host_cpu@ host_os = @host_os@ host_vendor = @host_vendor@ htmldir = @htmldir@ includedir = @includedir@ infodir = @infodir@ initdir = @initdir@ install_sh = @install_sh@ launchddir = @launchddir@ libdir = @libdir@ libexecdir = @libexecdir@ localconfdir = @localconfdir@ localdatadir = @localdatadir@ localdocdir = @localdocdir@ localedir = @localedir@ localerlanglibdir = @localerlanglibdir@ locallibbindir = @locallibbindir@ locallibdir = @locallibdir@ localstatedir = @localstatedir@ localstatelibdir = @localstatelibdir@ localstatelogdir = @localstatelogdir@ localstaterundir = @localstaterundir@ mandir = @mandir@ mkdir_p = @mkdir_p@ msvc_redist_dir = @msvc_redist_dir@ msvc_redist_name = @msvc_redist_name@ oldincludedir = @oldincludedir@ openssl_bin_dir = @openssl_bin_dir@ otp_release = @otp_release@ package_author_address = @package_author_address@ package_author_name = @package_author_name@ package_identifier = @package_identifier@ package_name = @package_name@ package_tarname = @package_tarname@ 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@ version = @version@ version_major = @version_major@ version_minor = @version_minor@ version_release = @version_release@ version_revision = @version_revision@ version_stage = @version_stage@ SUBDIRS = couchdb default init launchd logrotate.d windows default_sysconf_data = logrotate.d/couchdb @INIT_TRUE@init_sysconf_data = default/couchdb @INIT_TRUE@init_DATA = init/couchdb @LAUNCHD_TRUE@launchd_DATA = launchd/org.apache.couchdb.plist nobase_sysconf_DATA = $(default_sysconf_data) $(init_sysconf_data) EXTRA_DIST = default/couchdb windows/couchdb.iss.tpl \ windows/README.txt.tpl $(am__append_1) CLEANFILES = $(init_DATA) $(default_sysconf_data) $(launchd_DATA) couchdb_command_name = `echo couchdb | sed '$(transform)'` 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) --foreign etc/Makefile'; \ $(am__cd) $(top_srcdir) && \ $(AUTOMAKE) --foreign etc/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-initDATA: $(init_DATA) @$(NORMAL_INSTALL) @list='$(init_DATA)'; test -n "$(initdir)" || list=; \ if test -n "$$list"; then \ echo " $(MKDIR_P) '$(DESTDIR)$(initdir)'"; \ $(MKDIR_P) "$(DESTDIR)$(initdir)" || 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)$(initdir)'"; \ $(INSTALL_DATA) $$files "$(DESTDIR)$(initdir)" || exit $$?; \ done uninstall-initDATA: @$(NORMAL_UNINSTALL) @list='$(init_DATA)'; test -n "$(initdir)" || list=; \ files=`for p in $$list; do echo $$p; done | sed -e 's|^.*/||'`; \ dir='$(DESTDIR)$(initdir)'; $(am__uninstall_files_from_dir) install-launchdDATA: $(launchd_DATA) @$(NORMAL_INSTALL) @list='$(launchd_DATA)'; test -n "$(launchddir)" || list=; \ if test -n "$$list"; then \ echo " $(MKDIR_P) '$(DESTDIR)$(launchddir)'"; \ $(MKDIR_P) "$(DESTDIR)$(launchddir)" || 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)$(launchddir)'"; \ $(INSTALL_DATA) $$files "$(DESTDIR)$(launchddir)" || exit $$?; \ done uninstall-launchdDATA: @$(NORMAL_UNINSTALL) @list='$(launchd_DATA)'; test -n "$(launchddir)" || list=; \ files=`for p in $$list; do echo $$p; done | sed -e 's|^.*/||'`; \ dir='$(DESTDIR)$(launchddir)'; $(am__uninstall_files_from_dir) install-nobase_sysconfDATA: $(nobase_sysconf_DATA) @$(NORMAL_INSTALL) @list='$(nobase_sysconf_DATA)'; test -n "$(sysconfdir)" || list=; \ if test -n "$$list"; then \ echo " $(MKDIR_P) '$(DESTDIR)$(sysconfdir)'"; \ $(MKDIR_P) "$(DESTDIR)$(sysconfdir)" || exit 1; \ fi; \ $(am__nobase_list) | while read dir files; do \ xfiles=; for file in $$files; do \ if test -f "$$file"; then xfiles="$$xfiles $$file"; \ else xfiles="$$xfiles $(srcdir)/$$file"; fi; done; \ test -z "$$xfiles" || { \ test "x$$dir" = x. || { \ echo " $(MKDIR_P) '$(DESTDIR)$(sysconfdir)/$$dir'"; \ $(MKDIR_P) "$(DESTDIR)$(sysconfdir)/$$dir"; }; \ echo " $(INSTALL_DATA) $$xfiles '$(DESTDIR)$(sysconfdir)/$$dir'"; \ $(INSTALL_DATA) $$xfiles "$(DESTDIR)$(sysconfdir)/$$dir" || exit $$?; }; \ done uninstall-nobase_sysconfDATA: @$(NORMAL_UNINSTALL) @list='$(nobase_sysconf_DATA)'; test -n "$(sysconfdir)" || list=; \ $(am__nobase_strip_setup); files=`$(am__nobase_strip)`; \ dir='$(DESTDIR)$(sysconfdir)'; $(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. $(RECURSIVE_TARGETS): @fail= failcom='exit 1'; \ for f in x $$MAKEFLAGS; do \ case $$f in \ *=* | --[!k]*);; \ *k*) failcom='fail=yes';; \ esac; \ done; \ dot_seen=no; \ target=`echo $@ | sed s/-recursive//`; \ list='$(SUBDIRS)'; for subdir in $$list; do \ echo "Making $$target in $$subdir"; \ if test "$$subdir" = "."; then \ dot_seen=yes; \ local_target="$$target-am"; \ else \ local_target="$$target"; \ fi; \ ($(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" $(RECURSIVE_CLEAN_TARGETS): @fail= failcom='exit 1'; \ for f in x $$MAKEFLAGS; do \ case $$f in \ *=* | --[!k]*);; \ *k*) failcom='fail=yes';; \ esac; \ done; \ dot_seen=no; \ case "$@" in \ distclean-* | maintainer-clean-*) list='$(DIST_SUBDIRS)' ;; \ *) list='$(SUBDIRS)' ;; \ esac; \ rev=''; for subdir in $$list; do \ if test "$$subdir" = "."; then :; else \ rev="$$subdir $$rev"; \ fi; \ done; \ rev="$$rev ."; \ target=`echo $@ | sed s/-recursive//`; \ for subdir in $$rev; do \ echo "Making $$target in $$subdir"; \ if test "$$subdir" = "."; then \ local_target="$$target-am"; \ else \ local_target="$$target"; \ fi; \ ($(am__cd) $$subdir && $(MAKE) $(AM_MAKEFLAGS) $$local_target) \ || eval $$failcom; \ done && test -z "$$fail" tags-recursive: list='$(SUBDIRS)'; for subdir in $$list; do \ test "$$subdir" = . || ($(am__cd) $$subdir && $(MAKE) $(AM_MAKEFLAGS) tags); \ done ctags-recursive: list='$(SUBDIRS)'; for subdir in $$list; do \ test "$$subdir" = . || ($(am__cd) $$subdir && $(MAKE) $(AM_MAKEFLAGS) ctags); \ done ID: $(HEADERS) $(SOURCES) $(LISP) $(TAGS_FILES) list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | \ $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ END { if (nonempty) { for (i in files) print i; }; }'`; \ mkid -fID $$unique tags: TAGS TAGS: tags-recursive $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ $(TAGS_FILES) $(LISP) 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; \ list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | \ $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ END { if (nonempty) { for (i in files) print i; }; }'`; \ 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 CTAGS: ctags-recursive $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ $(TAGS_FILES) $(LISP) list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | \ $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ END { if (nonempty) { for (i in files) print i; }; }'`; \ 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" 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 $(DATA) installdirs: installdirs-recursive installdirs-am: for dir in "$(DESTDIR)$(initdir)" "$(DESTDIR)$(launchddir)" "$(DESTDIR)$(sysconfdir)"; 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: -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-initDATA install-launchdDATA @$(NORMAL_INSTALL) $(MAKE) $(AM_MAKEFLAGS) install-data-hook install-dvi: install-dvi-recursive install-dvi-am: install-exec-am: install-nobase_sysconfDATA 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-initDATA uninstall-launchdDATA \ uninstall-nobase_sysconfDATA .MAKE: $(RECURSIVE_CLEAN_TARGETS) $(RECURSIVE_TARGETS) ctags-recursive \ install-am install-data-am install-strip tags-recursive .PHONY: $(RECURSIVE_CLEAN_TARGETS) $(RECURSIVE_TARGETS) CTAGS GTAGS \ all all-am check check-am clean clean-generic clean-libtool \ ctags ctags-recursive 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-data-hook install-dvi install-dvi-am \ install-exec install-exec-am install-html install-html-am \ install-info install-info-am install-initDATA \ install-launchdDATA install-man install-nobase_sysconfDATA \ 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-recursive uninstall uninstall-am \ uninstall-initDATA uninstall-launchdDATA \ uninstall-nobase_sysconfDATA init/couchdb: init/couchdb.tpl if test "$(mkdir_p)"; then \ $(mkdir_p) init; \ else \ if test ! -d init; then \ mkdir init; \ fi \ fi sed -e "s|%configure_input%|$@. Generated from $< by configure.|" \ -e "s|%bindir%|$(bindir)|" \ -e "s|%sysconfdir%|$(sysconfdir)|" \ -e "s|%localstaterundir%|$(localstaterundir)|" \ -e "s|%couchdb_command_name%|$(couchdb_command_name)|" \ < $< > $@ logrotate.d/couchdb: logrotate.d/couchdb.tpl sed -e "s|%localstatelogdir%|@localstatelogdir@|g" < $< > $@ launchd/org.apache.couchdb.plist: launchd/org.apache.couchdb.plist.tpl if test "$(mkdir_p)"; then \ $(mkdir_p) launchd; \ else \ if test ! -d launchd; then \ mkdir launchd; \ fi \ fi sed -e "s|%configure_input%|$@. Generated from $< by configure.|" \ -e "s|%bindir%|$(bindir)|" \ -e "s|%couchdb_command_name%|$(couchdb_command_name)|" \ < $< > $@ # README.txt has \n line endings in the repo and must have \r\n # when installed as notepad is used to view it. # Also: the targets below don't seem to update after an svn-up (which # changes the version string in the generated files) so we trick make # into always building it with the FORCE pattern... @WINDOWS_TRUE@windows/README.txt: windows/README.txt.tpl FORCE @WINDOWS_TRUE@ sed -e "s|%package_name%|@package_name@|g" \ @WINDOWS_TRUE@ -e "s|%version%|@version@|g" \ @WINDOWS_TRUE@ < $< | unix2dos > $@ @WINDOWS_TRUE@windows/couchdb.iss: windows/couchdb.iss.tpl FORCE @WINDOWS_TRUE@ sed -e "s|%configure_input%|$@. Generated from $< by configure.|" \ @WINDOWS_TRUE@ -e "s|%package_name%|@package_name@|g" \ @WINDOWS_TRUE@ -e "s|%locallibbindir%|`cygpath -m @locallibbindir@`|g" \ @WINDOWS_TRUE@ -e "s|%version%|@version@|g" \ @WINDOWS_TRUE@ -e "s|%erts_version%|`$(ERL) -version 2>&1 | $(SED) 's/[^0-9\.]//g'`|g" \ @WINDOWS_TRUE@ -e "s|%openssl_bin_dir%|@openssl_bin_dir@|g" \ @WINDOWS_TRUE@ -e "s|%msvc_redist_dir%|@msvc_redist_dir@|g" \ @WINDOWS_TRUE@ -e "s|%msvc_redist_name%|@msvc_redist_name@|g" \ @WINDOWS_TRUE@ < $< > $@ # The installer depends on all files, not just the source .iss file, # so we trick make into always building it with the FORCE pattern... @WINDOWS_TRUE@windows/setup-couchdb-@version@.exe: windows/couchdb.iss windows/README.txt FORCE @WINDOWS_TRUE@ "$(INNO_COMPILER_EXECUTABLE)" /q $< @WINDOWS_TRUE@ @echo Windows Installer is at: `cygpath -a -w windows/setup-couchdb-@version@.exe` @WINDOWS_TRUE@windows/setup-couchdb-@version@.exe.md5: windows/setup-couchdb-@version@.exe @WINDOWS_TRUE@ cd windows && md5sum ./$( $(@F) @WINDOWS_TRUE@windows/setup-couchdb-@version@.exe.sha: windows/setup-couchdb-@version@.exe @WINDOWS_TRUE@ cd windows && sha1sum ./$( $(@F) @WINDOWS_TRUE@FORCE: install-data-hook: if test -n "$(init_DATA)"; then \ chmod +x "$(DESTDIR)$(initdir)/couchdb"; \ fi # 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: apache-couchdb-1.6.0/etc/logrotate.d/0000755000175000001440000000000012332105600017310 5ustar00djcusers00000000000000apache-couchdb-1.6.0/etc/logrotate.d/couchdb.tpl.in0000644000175000001440000000023012332105522022043 0ustar00djcusers00000000000000%localstatelogdir%/*.log { weekly rotate 10 copytruncate delaycompress compress notifempty missingok } apache-couchdb-1.6.0/etc/logrotate.d/Makefile.am0000644000175000001440000000112112332105522021342 0ustar00djcusers00000000000000## Licensed under the Apache License, Version 2.0 (the "License"); you may not ## use this file except in compliance with the License. You may obtain a copy of ## the License at ## ## http://www.apache.org/licenses/LICENSE-2.0 ## ## Unless required by applicable law or agreed to in writing, software ## distributed under the License is distributed on an "AS IS" BASIS, WITHOUT ## WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the ## License for the specific language governing permissions and limitations under ## the License. ## This file intentionally left blank. apache-couchdb-1.6.0/etc/logrotate.d/Makefile.in0000644000175000001440000003037612332105550021372 0ustar00djcusers00000000000000# Makefile.in generated by automake 1.11.6 from Makefile.am. # @configure_input@ # Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, # 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011 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__make_dryrun = \ { \ am__dry=no; \ case $$MAKEFLAGS in \ *\\[\ \ ]*) \ echo 'am--echo: ; @echo "AM" OK' | $(MAKE) -f - 2>/dev/null \ | grep '^AM OK$$' >/dev/null || am__dry=yes;; \ *) \ for am__flg in $$MAKEFLAGS; do \ case $$am__flg in \ *=*|--*) ;; \ *n*) am__dry=yes; break;; \ esac; \ done;; \ esac; \ test $$am__dry = yes; \ } 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 = etc/logrotate.d DIST_COMMON = $(srcdir)/Makefile.am $(srcdir)/Makefile.in \ $(srcdir)/couchdb.tpl.in ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 am__aclocal_m4_deps = $(top_srcdir)/m4/libtool.m4 \ $(top_srcdir)/m4/ltoptions.m4 $(top_srcdir)/m4/ltsugar.m4 \ $(top_srcdir)/m4/ltversion.m4 $(top_srcdir)/m4/lt~obsolete.m4 \ $(top_srcdir)/acinclude.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 \ $(top_builddir)/src/snappy/google-snappy/config.h CONFIG_CLEAN_FILES = couchdb.tpl CONFIG_CLEAN_VPATH_FILES = 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 DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) ACLOCAL = @ACLOCAL@ AMTAR = @AMTAR@ AR = @AR@ AS = @AS@ AUTOCONF = @AUTOCONF@ AUTOHEADER = @AUTOHEADER@ AUTOMAKE = @AUTOMAKE@ AWK = @AWK@ CC = @CC@ CCDEPMODE = @CCDEPMODE@ CFLAGS = @CFLAGS@ CPP = @CPP@ CPPFLAGS = @CPPFLAGS@ CURL_CFLAGS = @CURL_CFLAGS@ CURL_CONFIG = @CURL_CONFIG@ CURL_LIBS = @CURL_LIBS@ CXX = @CXX@ CXXCPP = @CXXCPP@ CXXDEPMODE = @CXXDEPMODE@ CXXFLAGS = @CXXFLAGS@ CYGPATH_W = @CYGPATH_W@ DEFS = @DEFS@ DEPDIR = @DEPDIR@ DLLTOOL = @DLLTOOL@ DSYMUTIL = @DSYMUTIL@ DUMPBIN = @DUMPBIN@ ECHO_C = @ECHO_C@ ECHO_N = @ECHO_N@ ECHO_T = @ECHO_T@ EGREP = @EGREP@ ERL = @ERL@ ERLANG_FLAGS = @ERLANG_FLAGS@ ERLC = @ERLC@ ERLC_FLAGS = @ERLC_FLAGS@ ESCRIPT = @ESCRIPT@ EXEEXT = @EXEEXT@ FGREP = @FGREP@ FLAGS = @FLAGS@ GREP = @GREP@ HAS_HELP2MAN = @HAS_HELP2MAN@ HAS_INSTALLINFO = @HAS_INSTALLINFO@ HAS_MAKEINFO = @HAS_MAKEINFO@ HAS_PDFLATEX = @HAS_PDFLATEX@ HAS_SPHINX_BUILD = @HAS_SPHINX_BUILD@ ICU_BIN = @ICU_BIN@ ICU_CFLAGS = @ICU_CFLAGS@ ICU_CONFIG = @ICU_CONFIG@ ICU_CPPFLAGS = @ICU_CPPFLAGS@ ICU_CXXFLAGS = @ICU_CXXFLAGS@ ICU_LIBS = @ICU_LIBS@ INNO_COMPILER_EXECUTABLE = @INNO_COMPILER_EXECUTABLE@ INSTALL = @INSTALL@ INSTALL_DATA = @INSTALL_DATA@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ INSTALL_SCRIPT = @INSTALL_SCRIPT@ INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ JS_CFLAGS = @JS_CFLAGS@ JS_LIBS = @JS_LIBS@ JS_LIB_BINARY = @JS_LIB_BINARY@ LD = @LD@ LDFLAGS = @LDFLAGS@ LIBOBJS = @LIBOBJS@ LIBS = @LIBS@ LIBTOOL = @LIBTOOL@ LIPO = @LIPO@ LN_S = @LN_S@ LTLIBOBJS = @LTLIBOBJS@ MAKEINFO = @MAKEINFO@ MANIFEST_TOOL = @MANIFEST_TOOL@ MKDIR_P = @MKDIR_P@ NM = @NM@ NMEDIT = @NMEDIT@ OBJDUMP = @OBJDUMP@ OBJEXT = @OBJEXT@ OTOOL = @OTOOL@ OTOOL64 = @OTOOL64@ PACKAGE = @PACKAGE@ PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ PACKAGE_NAME = @PACKAGE_NAME@ PACKAGE_STRING = @PACKAGE_STRING@ PACKAGE_TARNAME = @PACKAGE_TARNAME@ PACKAGE_URL = @PACKAGE_URL@ PACKAGE_VERSION = @PACKAGE_VERSION@ PATH_SEPARATOR = @PATH_SEPARATOR@ PKG_CONFIG = @PKG_CONFIG@ PKG_CONFIG_LIBDIR = @PKG_CONFIG_LIBDIR@ PKG_CONFIG_PATH = @PKG_CONFIG_PATH@ RANLIB = @RANLIB@ SED = @SED@ SET_MAKE = @SET_MAKE@ SHELL = @SHELL@ SNAPPY_MAJOR = @SNAPPY_MAJOR@ SNAPPY_MINOR = @SNAPPY_MINOR@ SNAPPY_PATCHLEVEL = @SNAPPY_PATCHLEVEL@ STRIP = @STRIP@ VERSION = @VERSION@ 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@ ac_cv_have_stddef_h = @ac_cv_have_stddef_h@ ac_cv_have_stdint_h = @ac_cv_have_stdint_h@ am__include = @am__include@ am__leading_dot = @am__leading_dot@ am__quote = @am__quote@ am__tar = @am__tar@ am__untar = @am__untar@ bindir = @bindir@ bug_uri = @bug_uri@ 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@ dvidir = @dvidir@ erlangbin = @erlangbin@ erlangversion = @erlangversion@ exec_prefix = @exec_prefix@ host = @host@ host_alias = @host_alias@ host_cpu = @host_cpu@ host_os = @host_os@ host_vendor = @host_vendor@ htmldir = @htmldir@ includedir = @includedir@ infodir = @infodir@ initdir = @initdir@ install_sh = @install_sh@ launchddir = @launchddir@ libdir = @libdir@ libexecdir = @libexecdir@ localconfdir = @localconfdir@ localdatadir = @localdatadir@ localdocdir = @localdocdir@ localedir = @localedir@ localerlanglibdir = @localerlanglibdir@ locallibbindir = @locallibbindir@ locallibdir = @locallibdir@ localstatedir = @localstatedir@ localstatelibdir = @localstatelibdir@ localstatelogdir = @localstatelogdir@ localstaterundir = @localstaterundir@ mandir = @mandir@ mkdir_p = @mkdir_p@ msvc_redist_dir = @msvc_redist_dir@ msvc_redist_name = @msvc_redist_name@ oldincludedir = @oldincludedir@ openssl_bin_dir = @openssl_bin_dir@ otp_release = @otp_release@ package_author_address = @package_author_address@ package_author_name = @package_author_name@ package_identifier = @package_identifier@ package_name = @package_name@ package_tarname = @package_tarname@ 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@ version = @version@ version_major = @version_major@ version_minor = @version_minor@ version_release = @version_release@ version_revision = @version_revision@ version_stage = @version_stage@ 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) --foreign etc/logrotate.d/Makefile'; \ $(am__cd) $(top_srcdir) && \ $(AUTOMAKE) --foreign etc/logrotate.d/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): couchdb.tpl: $(top_builddir)/config.status $(srcdir)/couchdb.tpl.in cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ mostlyclean-libtool: -rm -f *.lo clean-libtool: -rm -rf .libs _libs tags: TAGS TAGS: ctags: CTAGS CTAGS: 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 \ 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 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: apache-couchdb-1.6.0/etc/windows/0000755000175000001440000000000012332105600016560 5ustar00djcusers00000000000000apache-couchdb-1.6.0/etc/windows/Makefile.am0000644000175000001440000000112112332105522020612 0ustar00djcusers00000000000000## Licensed under the Apache License, Version 2.0 (the "License"); you may not ## use this file except in compliance with the License. You may obtain a copy of ## the License at ## ## http://www.apache.org/licenses/LICENSE-2.0 ## ## Unless required by applicable law or agreed to in writing, software ## distributed under the License is distributed on an "AS IS" BASIS, WITHOUT ## WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the ## License for the specific language governing permissions and limitations under ## the License. ## This file intentionally left blank. apache-couchdb-1.6.0/etc/windows/Makefile.in0000644000175000001440000003011112332105550020625 0ustar00djcusers00000000000000# Makefile.in generated by automake 1.11.6 from Makefile.am. # @configure_input@ # Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, # 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011 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__make_dryrun = \ { \ am__dry=no; \ case $$MAKEFLAGS in \ *\\[\ \ ]*) \ echo 'am--echo: ; @echo "AM" OK' | $(MAKE) -f - 2>/dev/null \ | grep '^AM OK$$' >/dev/null || am__dry=yes;; \ *) \ for am__flg in $$MAKEFLAGS; do \ case $$am__flg in \ *=*|--*) ;; \ *n*) am__dry=yes; break;; \ esac; \ done;; \ esac; \ test $$am__dry = yes; \ } 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 = etc/windows DIST_COMMON = $(srcdir)/Makefile.am $(srcdir)/Makefile.in ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 am__aclocal_m4_deps = $(top_srcdir)/m4/libtool.m4 \ $(top_srcdir)/m4/ltoptions.m4 $(top_srcdir)/m4/ltsugar.m4 \ $(top_srcdir)/m4/ltversion.m4 $(top_srcdir)/m4/lt~obsolete.m4 \ $(top_srcdir)/acinclude.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 \ $(top_builddir)/src/snappy/google-snappy/config.h CONFIG_CLEAN_FILES = CONFIG_CLEAN_VPATH_FILES = 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 DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) ACLOCAL = @ACLOCAL@ AMTAR = @AMTAR@ AR = @AR@ AS = @AS@ AUTOCONF = @AUTOCONF@ AUTOHEADER = @AUTOHEADER@ AUTOMAKE = @AUTOMAKE@ AWK = @AWK@ CC = @CC@ CCDEPMODE = @CCDEPMODE@ CFLAGS = @CFLAGS@ CPP = @CPP@ CPPFLAGS = @CPPFLAGS@ CURL_CFLAGS = @CURL_CFLAGS@ CURL_CONFIG = @CURL_CONFIG@ CURL_LIBS = @CURL_LIBS@ CXX = @CXX@ CXXCPP = @CXXCPP@ CXXDEPMODE = @CXXDEPMODE@ CXXFLAGS = @CXXFLAGS@ CYGPATH_W = @CYGPATH_W@ DEFS = @DEFS@ DEPDIR = @DEPDIR@ DLLTOOL = @DLLTOOL@ DSYMUTIL = @DSYMUTIL@ DUMPBIN = @DUMPBIN@ ECHO_C = @ECHO_C@ ECHO_N = @ECHO_N@ ECHO_T = @ECHO_T@ EGREP = @EGREP@ ERL = @ERL@ ERLANG_FLAGS = @ERLANG_FLAGS@ ERLC = @ERLC@ ERLC_FLAGS = @ERLC_FLAGS@ ESCRIPT = @ESCRIPT@ EXEEXT = @EXEEXT@ FGREP = @FGREP@ FLAGS = @FLAGS@ GREP = @GREP@ HAS_HELP2MAN = @HAS_HELP2MAN@ HAS_INSTALLINFO = @HAS_INSTALLINFO@ HAS_MAKEINFO = @HAS_MAKEINFO@ HAS_PDFLATEX = @HAS_PDFLATEX@ HAS_SPHINX_BUILD = @HAS_SPHINX_BUILD@ ICU_BIN = @ICU_BIN@ ICU_CFLAGS = @ICU_CFLAGS@ ICU_CONFIG = @ICU_CONFIG@ ICU_CPPFLAGS = @ICU_CPPFLAGS@ ICU_CXXFLAGS = @ICU_CXXFLAGS@ ICU_LIBS = @ICU_LIBS@ INNO_COMPILER_EXECUTABLE = @INNO_COMPILER_EXECUTABLE@ INSTALL = @INSTALL@ INSTALL_DATA = @INSTALL_DATA@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ INSTALL_SCRIPT = @INSTALL_SCRIPT@ INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ JS_CFLAGS = @JS_CFLAGS@ JS_LIBS = @JS_LIBS@ JS_LIB_BINARY = @JS_LIB_BINARY@ LD = @LD@ LDFLAGS = @LDFLAGS@ LIBOBJS = @LIBOBJS@ LIBS = @LIBS@ LIBTOOL = @LIBTOOL@ LIPO = @LIPO@ LN_S = @LN_S@ LTLIBOBJS = @LTLIBOBJS@ MAKEINFO = @MAKEINFO@ MANIFEST_TOOL = @MANIFEST_TOOL@ MKDIR_P = @MKDIR_P@ NM = @NM@ NMEDIT = @NMEDIT@ OBJDUMP = @OBJDUMP@ OBJEXT = @OBJEXT@ OTOOL = @OTOOL@ OTOOL64 = @OTOOL64@ PACKAGE = @PACKAGE@ PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ PACKAGE_NAME = @PACKAGE_NAME@ PACKAGE_STRING = @PACKAGE_STRING@ PACKAGE_TARNAME = @PACKAGE_TARNAME@ PACKAGE_URL = @PACKAGE_URL@ PACKAGE_VERSION = @PACKAGE_VERSION@ PATH_SEPARATOR = @PATH_SEPARATOR@ PKG_CONFIG = @PKG_CONFIG@ PKG_CONFIG_LIBDIR = @PKG_CONFIG_LIBDIR@ PKG_CONFIG_PATH = @PKG_CONFIG_PATH@ RANLIB = @RANLIB@ SED = @SED@ SET_MAKE = @SET_MAKE@ SHELL = @SHELL@ SNAPPY_MAJOR = @SNAPPY_MAJOR@ SNAPPY_MINOR = @SNAPPY_MINOR@ SNAPPY_PATCHLEVEL = @SNAPPY_PATCHLEVEL@ STRIP = @STRIP@ VERSION = @VERSION@ 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@ ac_cv_have_stddef_h = @ac_cv_have_stddef_h@ ac_cv_have_stdint_h = @ac_cv_have_stdint_h@ am__include = @am__include@ am__leading_dot = @am__leading_dot@ am__quote = @am__quote@ am__tar = @am__tar@ am__untar = @am__untar@ bindir = @bindir@ bug_uri = @bug_uri@ 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@ dvidir = @dvidir@ erlangbin = @erlangbin@ erlangversion = @erlangversion@ exec_prefix = @exec_prefix@ host = @host@ host_alias = @host_alias@ host_cpu = @host_cpu@ host_os = @host_os@ host_vendor = @host_vendor@ htmldir = @htmldir@ includedir = @includedir@ infodir = @infodir@ initdir = @initdir@ install_sh = @install_sh@ launchddir = @launchddir@ libdir = @libdir@ libexecdir = @libexecdir@ localconfdir = @localconfdir@ localdatadir = @localdatadir@ localdocdir = @localdocdir@ localedir = @localedir@ localerlanglibdir = @localerlanglibdir@ locallibbindir = @locallibbindir@ locallibdir = @locallibdir@ localstatedir = @localstatedir@ localstatelibdir = @localstatelibdir@ localstatelogdir = @localstatelogdir@ localstaterundir = @localstaterundir@ mandir = @mandir@ mkdir_p = @mkdir_p@ msvc_redist_dir = @msvc_redist_dir@ msvc_redist_name = @msvc_redist_name@ oldincludedir = @oldincludedir@ openssl_bin_dir = @openssl_bin_dir@ otp_release = @otp_release@ package_author_address = @package_author_address@ package_author_name = @package_author_name@ package_identifier = @package_identifier@ package_name = @package_name@ package_tarname = @package_tarname@ 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@ version = @version@ version_major = @version_major@ version_minor = @version_minor@ version_release = @version_release@ version_revision = @version_revision@ version_stage = @version_stage@ 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) --foreign etc/windows/Makefile'; \ $(am__cd) $(top_srcdir) && \ $(AUTOMAKE) --foreign etc/windows/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 TAGS: ctags: CTAGS CTAGS: 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 \ 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 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: apache-couchdb-1.6.0/etc/windows/README.txt.tpl0000644000175000001440000000265412332105522021066 0ustar00djcusers00000000000000This is the README for the %package_name% binary distribution for Windows, version %version%. * Although CouchDB defaults to installing into your "Program Files" directory, the permissions on the 'var' and 'etc' sub-directories have been adjusted to allow modification by any authorized user so the couchdb databases, logs and .ini files can be written. You may like to further restrict these permissions to only the user who will be running couchdb. * The installer offers to install CouchDB as a Windows Service. If you select this option, the service will run as the "LocalSystem" user and be configured to start automatically. You can configure the service properties via the Windows 'Services' applet. * To start CouchDB in a "console" environment, execute couchdb.bat in the 'bin' directory. A shortcut to this batch file should have been installed. Don't try and start couchdb this way if the service is running - it will fail. * The Futon application which comes with CouchDB does not work with Internet Explorer - Mozilla Firefox is generally recommended. * The test suite is known to fail on Windows due to what appear to be permissions errors; this is due to couch being unable to delete a file while it is in use on Windows. See also https://issues.apache.org/jira/browse/COUCHDB-326 * Additional help with the Windows support is needed - please contact the couchdb-dev list if you can help. apache-couchdb-1.6.0/etc/windows/couchdb.iss.tpl0000644000175000001440000001166712332105522021523 0ustar00djcusers00000000000000; Licensed under the Apache License, Version 2.0 (the "License"); you may not ; use this file except in compliance with the License. You may obtain a copy of ; the License at ; ; http://www.apache.org/licenses/LICENSE-2.0 ; ; Unless required by applicable law or agreed to in writing, software ; distributed under the License is distributed on an "AS IS" BASIS, WITHOUT ; WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the ; License for the specific language governing permissions and limitations under ; the License. ; CouchDB inno installer script ; %configure_input% [Setup] AppID=ApacheCouchDB AppName=%package_name% AppVerName=%package_name% %version% AppPublisher=Apache Software Foundation AppPublisherURL=http://couchdb.apache.org/ LicenseFile=../../LICENSE DefaultDirName={pf}\Apache Software Foundation\CouchDB DefaultGroupName=%package_name% OutputBaseFilename=setup-couchdb-%version% OutputDir=. [Files] Source: "%locallibbindir%\..\*.*"; DestDir: "{app}"; Flags: ignoreversion uninsrestartdelete restartreplace ; bin dir Source: "%locallibbindir%\*.*"; DestDir: "{app}\bin"; Flags: ignoreversion uninsrestartdelete restartreplace recursesubdirs ; other dirs copied '*.*' Source: "%locallibbindir%\..\erts-%erts_version%\*.*"; DestDir: "{app}\erts-%erts_version%"; Flags: ignoreversion uninsrestartdelete restartreplace recursesubdirs Source: "%locallibbindir%\..\lib\*.*"; DestDir: "{app}\lib"; Flags: ignoreversion uninsrestartdelete restartreplace recursesubdirs Source: "%locallibbindir%\..\share\*.*"; DestDir: "{app}\share"; Flags: ignoreversion uninsrestartdelete restartreplace recursesubdirs Source: "%locallibbindir%\..\releases\*.*"; DestDir: "{app}\releases"; Flags: ignoreversion uninsrestartdelete restartreplace recursesubdirs ; skip ./usr, ./var ; These are erlang requirements and not copied by our makefiles. ; From R14B01 onwards OTP may be built with a static OpenSSL so ; thse DLLs are now optional. Source: "%openssl_bin_dir%\ssleay32.dll"; DestDir: "{app}\bin"; Flags: ignoreversion uninsrestartdelete restartreplace skipifsourcedoesntexist Source: "%openssl_bin_dir%\libeay32.dll"; DestDir: "{app}\bin"; Flags: ignoreversion uninsrestartdelete restartreplace skipifsourcedoesntexist ; custom stuff... ; ./etc/default.ini is unconditional Source: "%locallibbindir%\..\etc\couchdb\default.ini"; DestDir: "{app}\etc\couchdb"; Flags: ignoreversion uninsrestartdelete restartreplace ; ./etc/local.ini is preserved and should not be updated if it exists Source: "%locallibbindir%\..\etc\couchdb\local.ini"; DestDir: "{app}\etc\couchdb"; Flags: onlyifdoesntexist uninsneveruninstall ; readme Source: "README.txt"; DestDir: "{app}"; Flags: isreadme ; msvc redists - see comments in configure.ac for notes about these... ; ( deleteafterinstall - not needed - {tmp} auto cleaned???? Source: "%msvc_redist_dir%\%msvc_redist_name%"; DestDir: "{tmp}"; Flags: deleteafterinstall [Dirs] Name: "{app}\var\lib\couchdb"; Permissions: authusers-modify Name: "{app}\var\log\couchdb"; Permissions: authusers-modify Name: "{app}\var\run\couchdb"; Permissions: authusers-modify Name: "{app}\etc\couchdb"; Permissions: authusers-modify [Icons] Name: "{group}\Start CouchDB"; Filename: "{app}\bin\couchdb.bat" Name: "{group}\Futon (CouchDB web interface)"; Filename: "http://127.0.0.1:5984/_utils" Name: "{group}\CouchDB Web Site"; Filename: "http://couchdb.apache.org/" Name: "{group}\CouchDB Online Docs"; Filename: "http://docs.couchdb.org/" Name: "{group}\CouchDB Embedded Docs"; Filename: "http://localhost:5984/_utils/docs/" [Tasks] Name: service; Description: "Install couchdb as a Windows service" Name: service\start; Description: "Start the service after installation" [Run] Filename: "{tmp}\%msvc_redist_name%"; Parameters: "/q" ; This is erlang's Install.exe which updates erl.ini correctly. Filename: "{app}\Install.exe"; Parameters: "-s"; Flags: runhidden ; Commands for a service ; First attempt to nuke an existing service of this name, incase they are ; reinstalling without uninstalling Filename: "{app}\erts-%erts_version%\bin\erlsrv.exe"; Parameters: "remove ""%package_name%"""; Flags: runhidden; Tasks: service ; add a new service, including automatic restart by default on failure Filename: "{app}\erts-%erts_version%\bin\erlsrv.exe"; Parameters: "add ""%package_name%"" -workdir ""{app}\bin"" -onfail restart_always -args ""-sasl errlog_type error -s couch +A 4 +W w"" -comment ""%package_name% %version%"""; Flags: runhidden; Tasks: service ; and start it if requested Filename: "{app}\erts-%erts_version%\bin\erlsrv.exe"; Parameters: "start ""%package_name%"""; Flags: runhidden; Tasks: service\start [UninstallRun] ; erlsrv stops services prior to removing them Filename: "{app}\erts-%erts_version%\bin\erlsrv.exe"; Parameters: "remove ""%package_name%"""; Flags: runhidden; Tasks: service ; kill epmd.exe if running to ensure uninstaller is not prevented from removing all binaries Filename: "{app}\erts-%erts_version%\bin\epmd.exe"; Parameters: "-kill"; Flags: runhidden apache-couchdb-1.6.0/src/0000755000175000001440000000000012332105603015105 5ustar00djcusers00000000000000apache-couchdb-1.6.0/src/etap/0000755000175000001440000000000012332105603016036 5ustar00djcusers00000000000000apache-couchdb-1.6.0/src/etap/etap.erl0000644000175000001440000004635712332105522017512 0ustar00djcusers00000000000000%% Copyright (c) 2008-2009 Nick Gerakines %% %% 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 AUTHORS OR COPYRIGHT %% HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, %% WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING %% FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR %% OTHER DEALINGS IN THE SOFTWARE. %% %% @author Nick Gerakines [http://socklabs.com/] %% @author Jeremy Wall %% @version 0.3.4 %% @copyright 2007-2008 Jeremy Wall, 2008-2009 Nick Gerakines %% @reference http://testanything.org/wiki/index.php/Main_Page %% @reference http://en.wikipedia.org/wiki/Test_Anything_Protocol %% @todo Finish implementing the skip directive. %% @todo Document the messages handled by this receive loop. %% @todo Explain in documentation why we use a process to handle test input. %% @doc etap is a TAP testing module for Erlang components and applications. %% This module allows developers to test their software using the TAP method. %% %%

%% TAP, the Test Anything Protocol, is a simple text-based interface between %% testing modules in a test harness. TAP started life as part of the test %% harness for Perl but now has implementations in C/C++, Python, PHP, Perl %% and probably others by the time you read this. %%

%% %% The testing process begins by defining a plan using etap:plan/1, running %% a number of etap tests and then calling eta:end_tests/0. Please refer to %% the Erlang modules in the t directory of this project for example tests. -module(etap). -vsn("0.3.4"). -export([ ensure_test_server/0, start_etap_server/0, test_server/1, msg/1, msg/2, diag/1, diag/2, expectation_mismatch_message/3, plan/1, end_tests/0, not_ok/2, ok/2, is_ok/2, is/3, isnt/3, any/3, none/3, fun_is/3, expect_fun/3, expect_fun/4, is_greater/3, skip/1, skip/2, datetime/1, skip/3, bail/0, bail/1, test_state/0, failure_count/0 ]). -export([ contains_ok/3, is_before/4 ]). -export([ is_pid/2, is_alive/2, is_mfa/3 ]). -export([ loaded_ok/2, can_ok/2, can_ok/3, has_attrib/2, is_attrib/3, is_behaviour/2 ]). -export([ dies_ok/2, lives_ok/2, throws_ok/3 ]). -record(test_state, { planned = 0, count = 0, pass = 0, fail = 0, skip = 0, skip_reason = "" }). %% @spec plan(N) -> Result %% N = unknown | skip | {skip, string()} | integer() %% Result = ok %% @doc Create a test plan and boot strap the test server. plan(unknown) -> ensure_test_server(), etap_server ! {self(), plan, unknown}, ok; plan(skip) -> io:format("1..0 # skip~n"); plan({skip, Reason}) -> io:format("1..0 # skip ~s~n", [Reason]); plan(N) when is_integer(N), N > 0 -> ensure_test_server(), etap_server ! {self(), plan, N}, ok. %% @spec end_tests() -> ok %% @doc End the current test plan and output test results. %% @todo This should probably be done in the test_server process. end_tests() -> Ref = make_ref(), case whereis(etap_server) of undefined -> self() ! {Ref, true}; _ -> etap_server ! {self(), state, Ref} end, State = receive {Ref, X} -> X end, if is_record(State, test_state) andalso State#test_state.planned == -1 -> io:format("1..~p~n", [State#test_state.count]); true -> ok end, case whereis(etap_server) of undefined -> ok; _ -> etap_server ! done, ok end. bail() -> bail(""). bail(Reason) -> etap_server ! {self(), diag, "Bail out! " ++ Reason}, etap_server ! done, ok, ok. %% @spec test_state() -> Return %% Return = test_state_record() | {error, string()} %% @doc Return the current test state test_state() -> etap_server ! {self(), state}, receive X when is_record(X, test_state) -> X after 1000 -> {error, "Timed out waiting for etap server reply.~n"} end. %% @spec failure_count() -> Return %% Return = integer() | {error, string()} %% @doc Return the current failure count failure_count() -> case test_state() of #test_state{fail=FailureCount} -> FailureCount; X -> X end. %% @spec msg(S) -> ok %% S = string() %% @doc Print a message in the test output. msg(S) -> etap_server ! {self(), diag, S}, ok. %% @spec msg(Format, Data) -> ok %% Format = atom() | string() | binary() %% Data = [term()] %% UnicodeList = [Unicode] %% Unicode = int() %% @doc Print a message in the test output. %% Function arguments are passed through io_lib:format/2. msg(Format, Data) -> msg(io_lib:format(Format, Data)). %% @spec diag(S) -> ok %% S = string() %% @doc Print a debug/status message related to the test suite. diag(S) -> msg("# " ++ S). %% @spec diag(Format, Data) -> ok %% Format = atom() | string() | binary() %% Data = [term()] %% UnicodeList = [Unicode] %% Unicode = int() %% @doc Print a debug/status message related to the test suite. %% Function arguments are passed through io_lib:format/2. diag(Format, Data) -> diag(io_lib:format(Format, Data)). %% @spec expectation_mismatch_message(Got, Expected, Desc) -> ok %% Got = any() %% Expected = any() %% Desc = string() %% @doc Print an expectation mismatch message in the test output. expectation_mismatch_message(Got, Expected, Desc) -> msg(" ---"), msg(" description: ~p", [Desc]), msg(" found: ~p", [Got]), msg(" wanted: ~p", [Expected]), msg(" ..."), ok. % @spec evaluate(Pass, Got, Expected, Desc) -> Result %% Pass = true | false %% Got = any() %% Expected = any() %% Desc = string() %% Result = true | false %% @doc Evaluate a test statement, printing an expectation mismatch message %% if the test failed. evaluate(Pass, Got, Expected, Desc) -> case mk_tap(Pass, Desc) of false -> expectation_mismatch_message(Got, Expected, Desc), false; true -> true end. %% @spec ok(Expr, Desc) -> Result %% Expr = true | false %% Desc = string() %% Result = true | false %% @doc Assert that a statement is true. ok(Expr, Desc) -> evaluate(Expr == true, Expr, true, Desc). %% @spec not_ok(Expr, Desc) -> Result %% Expr = true | false %% Desc = string() %% Result = true | false %% @doc Assert that a statement is false. not_ok(Expr, Desc) -> evaluate(Expr == false, Expr, false, Desc). %% @spec is_ok(Expr, Desc) -> Result %% Expr = any() %% Desc = string() %% Result = true | false %% @doc Assert that two values are the same. is_ok(Expr, Desc) -> evaluate(Expr == ok, Expr, ok, Desc). %% @spec is(Got, Expected, Desc) -> Result %% Got = any() %% Expected = any() %% Desc = string() %% Result = true | false %% @doc Assert that two values are the same. is(Got, Expected, Desc) -> evaluate(Got == Expected, Got, Expected, Desc). %% @spec isnt(Got, Expected, Desc) -> Result %% Got = any() %% Expected = any() %% Desc = string() %% Result = true | false %% @doc Assert that two values are not the same. isnt(Got, Expected, Desc) -> evaluate(Got /= Expected, Got, Expected, Desc). %% @spec is_greater(ValueA, ValueB, Desc) -> Result %% ValueA = number() %% ValueB = number() %% Desc = string() %% Result = true | false %% @doc Assert that an integer is greater than another. is_greater(ValueA, ValueB, Desc) when is_integer(ValueA), is_integer(ValueB) -> mk_tap(ValueA > ValueB, Desc). %% @spec any(Got, Items, Desc) -> Result %% Got = any() %% Items = [any()] %% Desc = string() %% Result = true | false %% @doc Assert that an item is in a list. any(Got, Items, Desc) when is_function(Got) -> is(lists:any(Got, Items), true, Desc); any(Got, Items, Desc) -> is(lists:member(Got, Items), true, Desc). %% @spec none(Got, Items, Desc) -> Result %% Got = any() %% Items = [any()] %% Desc = string() %% Result = true | false %% @doc Assert that an item is not in a list. none(Got, Items, Desc) when is_function(Got) -> is(lists:any(Got, Items), false, Desc); none(Got, Items, Desc) -> is(lists:member(Got, Items), false, Desc). %% @spec fun_is(Fun, Expected, Desc) -> Result %% Fun = function() %% Expected = any() %% Desc = string() %% Result = true | false %% @doc Use an anonymous function to assert a pattern match. fun_is(Fun, Expected, Desc) when is_function(Fun) -> is(Fun(Expected), true, Desc). %% @spec expect_fun(ExpectFun, Got, Desc) -> Result %% ExpectFun = function() %% Got = any() %% Desc = string() %% Result = true | false %% @doc Use an anonymous function to assert a pattern match, using actual %% value as the argument to the function. expect_fun(ExpectFun, Got, Desc) -> evaluate(ExpectFun(Got), Got, ExpectFun, Desc). %% @spec expect_fun(ExpectFun, Got, Desc, ExpectStr) -> Result %% ExpectFun = function() %% Got = any() %% Desc = string() %% ExpectStr = string() %% Result = true | false %% @doc Use an anonymous function to assert a pattern match, using actual %% value as the argument to the function. expect_fun(ExpectFun, Got, Desc, ExpectStr) -> evaluate(ExpectFun(Got), Got, ExpectStr, Desc). %% @equiv skip(TestFun, "") skip(TestFun) when is_function(TestFun) -> skip(TestFun, ""). %% @spec skip(TestFun, Reason) -> ok %% TestFun = function() %% Reason = string() %% @doc Skip a test. skip(TestFun, Reason) when is_function(TestFun), is_list(Reason) -> begin_skip(Reason), catch TestFun(), end_skip(), ok. %% @spec skip(Q, TestFun, Reason) -> ok %% Q = true | false | function() %% TestFun = function() %% Reason = string() %% @doc Skips a test conditionally. The first argument to this function can %% either be the 'true' or 'false' atoms or a function that returns 'true' or %% 'false'. skip(QFun, TestFun, Reason) when is_function(QFun), is_function(TestFun), is_list(Reason) -> case QFun() of true -> begin_skip(Reason), TestFun(), end_skip(); _ -> TestFun() end, ok; skip(Q, TestFun, Reason) when is_function(TestFun), is_list(Reason), Q == true -> begin_skip(Reason), TestFun(), end_skip(), ok; skip(_, TestFun, Reason) when is_function(TestFun), is_list(Reason) -> TestFun(), ok. %% @private begin_skip(Reason) -> etap_server ! {self(), begin_skip, Reason}. %% @private end_skip() -> etap_server ! {self(), end_skip}. %% @spec contains_ok(string(), string(), string()) -> true | false %% @doc Assert that a string is contained in another string. contains_ok(Source, String, Desc) -> etap:isnt( string:str(Source, String), 0, Desc ). %% @spec is_before(string(), string(), string(), string()) -> true | false %% @doc Assert that a string comes before another string within a larger body. is_before(Source, StringA, StringB, Desc) -> etap:is_greater( string:str(Source, StringB), string:str(Source, StringA), Desc ). %% @doc Assert that a given variable is a pid. is_pid(Pid, Desc) when is_pid(Pid) -> etap:ok(true, Desc); is_pid(_, Desc) -> etap:ok(false, Desc). %% @doc Assert that a given process/pid is alive. is_alive(Pid, Desc) -> etap:ok(erlang:is_process_alive(Pid), Desc). %% @doc Assert that the current function of a pid is a given {M, F, A} tuple. is_mfa(Pid, MFA, Desc) -> etap:is({current_function, MFA}, erlang:process_info(Pid, current_function), Desc). %% @spec loaded_ok(atom(), string()) -> true | false %% @doc Assert that a module has been loaded successfully. loaded_ok(M, Desc) when is_atom(M) -> etap:fun_is(fun({module, _}) -> true; (_) -> false end, code:load_file(M), Desc). %% @spec can_ok(atom(), atom()) -> true | false %% @doc Assert that a module exports a given function. can_ok(M, F) when is_atom(M), is_atom(F) -> Matches = [X || {X, _} <- M:module_info(exports), X == F], etap:ok(Matches > 0, lists:concat([M, " can ", F])). %% @spec can_ok(atom(), atom(), integer()) -> true | false %% @doc Assert that a module exports a given function with a given arity. can_ok(M, F, A) when is_atom(M); is_atom(F), is_number(A) -> Matches = [X || X <- M:module_info(exports), X == {F, A}], etap:ok(Matches > 0, lists:concat([M, " can ", F, "/", A])). %% @spec has_attrib(M, A) -> true | false %% M = atom() %% A = atom() %% @doc Asserts that a module has a given attribute. has_attrib(M, A) when is_atom(M), is_atom(A) -> etap:isnt( proplists:get_value(A, M:module_info(attributes), 'asdlkjasdlkads'), 'asdlkjasdlkads', lists:concat([M, " has attribute ", A]) ). %% @spec has_attrib(M, A. V) -> true | false %% M = atom() %% A = atom() %% V = any() %% @doc Asserts that a module has a given attribute with a given value. is_attrib(M, A, V) when is_atom(M) andalso is_atom(A) -> etap:is( proplists:get_value(A, M:module_info(attributes)), [V], lists:concat([M, "'s ", A, " is ", V]) ). %% @spec is_behavior(M, B) -> true | false %% M = atom() %% B = atom() %% @doc Asserts that a given module has a specific behavior. is_behaviour(M, B) when is_atom(M) andalso is_atom(B) -> is_attrib(M, behaviour, B). %% @doc Assert that an exception is raised when running a given function. dies_ok(F, Desc) -> case (catch F()) of {'EXIT', _} -> etap:ok(true, Desc); _ -> etap:ok(false, Desc) end. %% @doc Assert that an exception is not raised when running a given function. lives_ok(F, Desc) -> etap:is(try_this(F), success, Desc). %% @doc Assert that the exception thrown by a function matches the given exception. throws_ok(F, Exception, Desc) -> try F() of _ -> etap:ok(nok, Desc) catch _:E -> etap:is(E, Exception, Desc) end. %% @private %% @doc Run a function and catch any exceptions. try_this(F) when is_function(F, 0) -> try F() of _ -> success catch throw:E -> {throw, E}; error:E -> {error, E}; exit:E -> {exit, E} end. %% @private %% @doc Start the etap_server process if it is not running already. ensure_test_server() -> case whereis(etap_server) of undefined -> proc_lib:start(?MODULE, start_etap_server,[]); _ -> diag("The test server is already running.") end. %% @private %% @doc Start the etap_server loop and register itself as the etap_server %% process. start_etap_server() -> catch register(etap_server, self()), proc_lib:init_ack(ok), etap:test_server(#test_state{ planned = 0, count = 0, pass = 0, fail = 0, skip = 0, skip_reason = "" }). %% @private %% @doc The main etap_server receive/run loop. The etap_server receive loop %% responds to seven messages apperatining to failure or passing of tests. %% It is also used to initiate the testing process with the {_, plan, _} %% message that clears the current test state. test_server(State) -> NewState = receive {_From, plan, unknown} -> io:format("# Current time local ~s~n", [datetime(erlang:localtime())]), io:format("# Using etap version ~p~n", [ proplists:get_value(vsn, proplists:get_value(attributes, etap:module_info())) ]), State#test_state{ planned = -1, count = 0, pass = 0, fail = 0, skip = 0, skip_reason = "" }; {_From, plan, N} -> io:format("# Current time local ~s~n", [datetime(erlang:localtime())]), io:format("# Using etap version ~p~n", [ proplists:get_value(vsn, proplists:get_value(attributes, etap:module_info())) ]), io:format("1..~p~n", [N]), State#test_state{ planned = N, count = 0, pass = 0, fail = 0, skip = 0, skip_reason = "" }; {_From, begin_skip, Reason} -> State#test_state{ skip = 1, skip_reason = Reason }; {_From, end_skip} -> State#test_state{ skip = 0, skip_reason = "" }; {_From, pass, Desc} -> FullMessage = skip_diag( " - " ++ Desc, State#test_state.skip, State#test_state.skip_reason ), io:format("ok ~p ~s~n", [State#test_state.count + 1, FullMessage]), State#test_state{ count = State#test_state.count + 1, pass = State#test_state.pass + 1 }; {_From, fail, Desc} -> FullMessage = skip_diag( " - " ++ Desc, State#test_state.skip, State#test_state.skip_reason ), io:format("not ok ~p ~s~n", [State#test_state.count + 1, FullMessage]), State#test_state{ count = State#test_state.count + 1, fail = State#test_state.fail + 1 }; {From, state, Ref} -> From ! {Ref, State}, State; {_From, diag, Message} -> io:format("~s~n", [Message]), State; {From, count} -> From ! State#test_state.count, State; {From, is_skip, Ref} -> From ! {Ref, State#test_state.skip}, State; done -> exit(normal) end, test_server(NewState). %% @private %% @doc Process the result of a test and send it to the etap_server process. mk_tap(Result, Desc) -> etap_server ! {self(), is_skip, Ref = make_ref()} , receive {Ref, IsSkip} -> ok end, case [IsSkip, Result] of [_, true] -> etap_server ! {self(), pass, Desc}, true; [1, _] -> etap_server ! {self(), pass, Desc}, true; _ -> etap_server ! {self(), fail, Desc}, false end. %% @private %% @doc Format a date/time string. datetime(DateTime) -> {{Year, Month, Day}, {Hour, Min, Sec}} = DateTime, io_lib:format("~4.10.0B-~2.10.0B-~2.10.0B ~2.10.0B:~2.10.0B:~2.10.0B", [Year, Month, Day, Hour, Min, Sec]). %% @private %% @doc Craft an output message taking skip/todo into consideration. skip_diag(Message, 0, _) -> Message; skip_diag(_Message, 1, "") -> " # SKIP"; skip_diag(_Message, 1, Reason) -> " # SKIP : " ++ Reason. apache-couchdb-1.6.0/src/etap/Makefile.am0000644000175000001440000000155612332105522020101 0ustar00djcusers00000000000000## Licensed under the Apache License, Version 2.0 (the "License"); you may not ## use this file except in compliance with the License. You may obtain a copy ## of the License at ## ## http://www.apache.org/licenses/LICENSE-2.0 ## ## Unless required by applicable law or agreed to in writing, software ## distributed under the License is distributed on an "AS IS" BASIS, WITHOUT ## WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the ## License for the specific language governing permissions and limitations under ## the License. etapebindir = $(localerlanglibdir)/etap/ebin etap_file_collection = \ etap.erl etapebin_make_generated_file_list = \ etap.beam etapebin_DATA = $(etapebin_make_generated_file_list) EXTRA_DIST = $(etap_file_collection) CLEANFILES = $(etapebin_make_generated_file_list) %.beam: %.erl $(ERLC) $(ERLC_FLAGS) $< apache-couchdb-1.6.0/src/etap/Makefile.in0000644000175000001440000003520412332105552020112 0ustar00djcusers00000000000000# Makefile.in generated by automake 1.11.6 from Makefile.am. # @configure_input@ # Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, # 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011 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__make_dryrun = \ { \ am__dry=no; \ case $$MAKEFLAGS in \ *\\[\ \ ]*) \ echo 'am--echo: ; @echo "AM" OK' | $(MAKE) -f - 2>/dev/null \ | grep '^AM OK$$' >/dev/null || am__dry=yes;; \ *) \ for am__flg in $$MAKEFLAGS; do \ case $$am__flg in \ *=*|--*) ;; \ *n*) am__dry=yes; break;; \ esac; \ done;; \ esac; \ test $$am__dry = yes; \ } 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/etap DIST_COMMON = $(srcdir)/Makefile.am $(srcdir)/Makefile.in ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 am__aclocal_m4_deps = $(top_srcdir)/m4/libtool.m4 \ $(top_srcdir)/m4/ltoptions.m4 $(top_srcdir)/m4/ltsugar.m4 \ $(top_srcdir)/m4/ltversion.m4 $(top_srcdir)/m4/lt~obsolete.m4 \ $(top_srcdir)/acinclude.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 \ $(top_builddir)/src/snappy/google-snappy/config.h CONFIG_CLEAN_FILES = CONFIG_CLEAN_VPATH_FILES = 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)$(etapebindir)" DATA = $(etapebin_DATA) DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) ACLOCAL = @ACLOCAL@ AMTAR = @AMTAR@ AR = @AR@ AS = @AS@ AUTOCONF = @AUTOCONF@ AUTOHEADER = @AUTOHEADER@ AUTOMAKE = @AUTOMAKE@ AWK = @AWK@ CC = @CC@ CCDEPMODE = @CCDEPMODE@ CFLAGS = @CFLAGS@ CPP = @CPP@ CPPFLAGS = @CPPFLAGS@ CURL_CFLAGS = @CURL_CFLAGS@ CURL_CONFIG = @CURL_CONFIG@ CURL_LIBS = @CURL_LIBS@ CXX = @CXX@ CXXCPP = @CXXCPP@ CXXDEPMODE = @CXXDEPMODE@ CXXFLAGS = @CXXFLAGS@ CYGPATH_W = @CYGPATH_W@ DEFS = @DEFS@ DEPDIR = @DEPDIR@ DLLTOOL = @DLLTOOL@ DSYMUTIL = @DSYMUTIL@ DUMPBIN = @DUMPBIN@ ECHO_C = @ECHO_C@ ECHO_N = @ECHO_N@ ECHO_T = @ECHO_T@ EGREP = @EGREP@ ERL = @ERL@ ERLANG_FLAGS = @ERLANG_FLAGS@ ERLC = @ERLC@ ERLC_FLAGS = @ERLC_FLAGS@ ESCRIPT = @ESCRIPT@ EXEEXT = @EXEEXT@ FGREP = @FGREP@ FLAGS = @FLAGS@ GREP = @GREP@ HAS_HELP2MAN = @HAS_HELP2MAN@ HAS_INSTALLINFO = @HAS_INSTALLINFO@ HAS_MAKEINFO = @HAS_MAKEINFO@ HAS_PDFLATEX = @HAS_PDFLATEX@ HAS_SPHINX_BUILD = @HAS_SPHINX_BUILD@ ICU_BIN = @ICU_BIN@ ICU_CFLAGS = @ICU_CFLAGS@ ICU_CONFIG = @ICU_CONFIG@ ICU_CPPFLAGS = @ICU_CPPFLAGS@ ICU_CXXFLAGS = @ICU_CXXFLAGS@ ICU_LIBS = @ICU_LIBS@ INNO_COMPILER_EXECUTABLE = @INNO_COMPILER_EXECUTABLE@ INSTALL = @INSTALL@ INSTALL_DATA = @INSTALL_DATA@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ INSTALL_SCRIPT = @INSTALL_SCRIPT@ INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ JS_CFLAGS = @JS_CFLAGS@ JS_LIBS = @JS_LIBS@ JS_LIB_BINARY = @JS_LIB_BINARY@ LD = @LD@ LDFLAGS = @LDFLAGS@ LIBOBJS = @LIBOBJS@ LIBS = @LIBS@ LIBTOOL = @LIBTOOL@ LIPO = @LIPO@ LN_S = @LN_S@ LTLIBOBJS = @LTLIBOBJS@ MAKEINFO = @MAKEINFO@ MANIFEST_TOOL = @MANIFEST_TOOL@ MKDIR_P = @MKDIR_P@ NM = @NM@ NMEDIT = @NMEDIT@ OBJDUMP = @OBJDUMP@ OBJEXT = @OBJEXT@ OTOOL = @OTOOL@ OTOOL64 = @OTOOL64@ PACKAGE = @PACKAGE@ PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ PACKAGE_NAME = @PACKAGE_NAME@ PACKAGE_STRING = @PACKAGE_STRING@ PACKAGE_TARNAME = @PACKAGE_TARNAME@ PACKAGE_URL = @PACKAGE_URL@ PACKAGE_VERSION = @PACKAGE_VERSION@ PATH_SEPARATOR = @PATH_SEPARATOR@ PKG_CONFIG = @PKG_CONFIG@ PKG_CONFIG_LIBDIR = @PKG_CONFIG_LIBDIR@ PKG_CONFIG_PATH = @PKG_CONFIG_PATH@ RANLIB = @RANLIB@ SED = @SED@ SET_MAKE = @SET_MAKE@ SHELL = @SHELL@ SNAPPY_MAJOR = @SNAPPY_MAJOR@ SNAPPY_MINOR = @SNAPPY_MINOR@ SNAPPY_PATCHLEVEL = @SNAPPY_PATCHLEVEL@ STRIP = @STRIP@ VERSION = @VERSION@ 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@ ac_cv_have_stddef_h = @ac_cv_have_stddef_h@ ac_cv_have_stdint_h = @ac_cv_have_stdint_h@ am__include = @am__include@ am__leading_dot = @am__leading_dot@ am__quote = @am__quote@ am__tar = @am__tar@ am__untar = @am__untar@ bindir = @bindir@ bug_uri = @bug_uri@ 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@ dvidir = @dvidir@ erlangbin = @erlangbin@ erlangversion = @erlangversion@ exec_prefix = @exec_prefix@ host = @host@ host_alias = @host_alias@ host_cpu = @host_cpu@ host_os = @host_os@ host_vendor = @host_vendor@ htmldir = @htmldir@ includedir = @includedir@ infodir = @infodir@ initdir = @initdir@ install_sh = @install_sh@ launchddir = @launchddir@ libdir = @libdir@ libexecdir = @libexecdir@ localconfdir = @localconfdir@ localdatadir = @localdatadir@ localdocdir = @localdocdir@ localedir = @localedir@ localerlanglibdir = @localerlanglibdir@ locallibbindir = @locallibbindir@ locallibdir = @locallibdir@ localstatedir = @localstatedir@ localstatelibdir = @localstatelibdir@ localstatelogdir = @localstatelogdir@ localstaterundir = @localstaterundir@ mandir = @mandir@ mkdir_p = @mkdir_p@ msvc_redist_dir = @msvc_redist_dir@ msvc_redist_name = @msvc_redist_name@ oldincludedir = @oldincludedir@ openssl_bin_dir = @openssl_bin_dir@ otp_release = @otp_release@ package_author_address = @package_author_address@ package_author_name = @package_author_name@ package_identifier = @package_identifier@ package_name = @package_name@ package_tarname = @package_tarname@ 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@ version = @version@ version_major = @version_major@ version_minor = @version_minor@ version_release = @version_release@ version_revision = @version_revision@ version_stage = @version_stage@ etapebindir = $(localerlanglibdir)/etap/ebin etap_file_collection = \ etap.erl etapebin_make_generated_file_list = \ etap.beam etapebin_DATA = $(etapebin_make_generated_file_list) EXTRA_DIST = $(etap_file_collection) CLEANFILES = $(etapebin_make_generated_file_list) 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) --foreign src/etap/Makefile'; \ $(am__cd) $(top_srcdir) && \ $(AUTOMAKE) --foreign src/etap/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-etapebinDATA: $(etapebin_DATA) @$(NORMAL_INSTALL) @list='$(etapebin_DATA)'; test -n "$(etapebindir)" || list=; \ if test -n "$$list"; then \ echo " $(MKDIR_P) '$(DESTDIR)$(etapebindir)'"; \ $(MKDIR_P) "$(DESTDIR)$(etapebindir)" || 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)$(etapebindir)'"; \ $(INSTALL_DATA) $$files "$(DESTDIR)$(etapebindir)" || exit $$?; \ done uninstall-etapebinDATA: @$(NORMAL_UNINSTALL) @list='$(etapebin_DATA)'; test -n "$(etapebindir)" || list=; \ files=`for p in $$list; do echo $$p; done | sed -e 's|^.*/||'`; \ dir='$(DESTDIR)$(etapebindir)'; $(am__uninstall_files_from_dir) tags: TAGS TAGS: ctags: CTAGS CTAGS: 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)$(etapebindir)"; 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 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-etapebinDATA 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-etapebinDATA .MAKE: install-am install-strip .PHONY: all all-am check check-am clean clean-generic clean-libtool \ 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-etapebinDATA 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 \ uninstall uninstall-am uninstall-etapebinDATA %.beam: %.erl $(ERLC) $(ERLC_FLAGS) $< # 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: apache-couchdb-1.6.0/src/couchdb/0000755000175000001440000000000012332105601016512 5ustar00djcusers00000000000000apache-couchdb-1.6.0/src/couchdb/couch_primary_sup.erl0000644000175000001440000000377512332105522022767 0ustar00djcusers00000000000000% Licensed under the Apache License, Version 2.0 (the "License"); you may not % use this file except in compliance with the License. You may obtain a copy of % the License at % % http://www.apache.org/licenses/LICENSE-2.0 % % Unless required by applicable law or agreed to in writing, software % distributed under the License is distributed on an "AS IS" BASIS, WITHOUT % WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the % License for the specific language governing permissions and limitations under % the License. -module(couch_primary_sup). -behaviour(supervisor). -export([init/1, start_link/0]). start_link() -> supervisor:start_link({local,couch_primary_services}, ?MODULE, []). init([]) -> Children = [ {collation_driver, {couch_drv, start_link, []}, permanent, infinity, supervisor, [couch_drv]}, {couch_task_status, {couch_task_status, start_link, []}, permanent, brutal_kill, worker, [couch_task_status]}, {couch_server, {couch_server, sup_start_link, []}, permanent, brutal_kill, worker, [couch_server]}, {couch_db_update_event, {gen_event, start_link, [{local, couch_db_update}]}, permanent, brutal_kill, worker, dynamic}, {couch_replication_event, {gen_event, start_link, [{local, couch_replication}]}, permanent, brutal_kill, worker, dynamic}, {couch_replicator_job_sup, {couch_replicator_job_sup, start_link, []}, permanent, infinity, supervisor, [couch_replicator_job_sup]}, {couch_log, {couch_log, start_link, []}, permanent, brutal_kill, worker, [couch_log]} ], {ok, {{one_for_one, 10, 3600}, Children}}. apache-couchdb-1.6.0/src/couchdb/priv/0000755000175000001440000000000012332105603017474 5ustar00djcusers00000000000000apache-couchdb-1.6.0/src/couchdb/priv/spawnkillable/0000755000175000001440000000000012332105603022324 5ustar00djcusers00000000000000apache-couchdb-1.6.0/src/couchdb/priv/spawnkillable/couchspawnkillable_win.c0000644000175000001440000001133712332105522027224 0ustar00djcusers00000000000000// Licensed under the Apache License, Version 2.0 (the "License"); you may not // use this file except in compliance with the License. You may obtain a copy of // the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, WITHOUT // WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the // License for the specific language governing permissions and limitations under // the License. // Do what 2 lines of shell script in couchspawnkillable does... // * Create a new suspended process with the same (duplicated) standard // handles as us. // * Write a line to stdout, consisting of the path to ourselves, plus // '--kill {pid}' where {pid} is the PID of the newly created process. // * Un-suspend the new process. // * Wait for the process to terminate. // * Terminate with the child's exit-code. // Later, couch will call us with --kill and the PID, so we dutifully // terminate the specified PID. #include #include "windows.h" char *get_child_cmdline(int argc, char **argv) { // make a new command-line, but skipping me. // XXX - todo - spaces etc in args??? int i; char *p, *cmdline; int nchars = 0; int nthis = 1; for (i=1;i #include #include "erl_nif_compat.h" #include "unicode/ucol.h" #include "unicode/ucasemap.h" #define MAX_DEPTH 10 #if (ERL_NIF_MAJOR_VERSION > 2) || \ (ERL_NIF_MAJOR_VERSION == 2 && ERL_NIF_MINOR_VERSION >= 3) /* OTP R15B or higher */ #define term_is_number(env, t) enif_is_number(env, t) #else #define term_is_number(env, t) \ (!enif_is_binary(env, t) && \ !enif_is_list(env, t) && \ !enif_is_tuple(env, t)) #endif static ERL_NIF_TERM ATOM_TRUE; static ERL_NIF_TERM ATOM_FALSE; static ERL_NIF_TERM ATOM_NULL; typedef struct { ErlNifEnv* env; int error; UCollator* coll; } ctx_t; static UCollator** collators = NULL; static int collStackTop = 0; static int numCollators = 0; static ErlNifMutex* collMutex = NULL; static ERL_NIF_TERM less_json_nif(ErlNifEnv*, int, const ERL_NIF_TERM []); static int on_load(ErlNifEnv*, void**, ERL_NIF_TERM); static void on_unload(ErlNifEnv*, void*); static __inline int less_json(int, ctx_t*, ERL_NIF_TERM, ERL_NIF_TERM); static __inline int atom_sort_order(ErlNifEnv*, ERL_NIF_TERM); static __inline int compare_strings(ctx_t*, ErlNifBinary, ErlNifBinary); static __inline int compare_lists(int, ctx_t*, ERL_NIF_TERM, ERL_NIF_TERM); static __inline int compare_props(int, ctx_t*, ERL_NIF_TERM, ERL_NIF_TERM); static __inline void reserve_coll(ctx_t*); static __inline void release_coll(ctx_t*); void reserve_coll(ctx_t *ctx) { if (ctx->coll == NULL) { enif_mutex_lock(collMutex); assert(collStackTop < numCollators); ctx->coll = collators[collStackTop]; collStackTop += 1; enif_mutex_unlock(collMutex); } } void release_coll(ctx_t *ctx) { if (ctx->coll != NULL) { enif_mutex_lock(collMutex); collStackTop -= 1; assert(collStackTop >= 0); enif_mutex_unlock(collMutex); } } ERL_NIF_TERM less_json_nif(ErlNifEnv* env, int argc, const ERL_NIF_TERM argv[]) { ctx_t ctx; int result; ctx.env = env; ctx.error = 0; ctx.coll = NULL; result = less_json(1, &ctx, argv[0], argv[1]); release_coll(&ctx); /* * There are 2 possible failure reasons: * * 1) We got an invalid EJSON operand; * 2) The EJSON structures are too deep - to avoid allocating too * many C stack frames (because less_json is a recursive function), * and running out of memory, we throw a badarg exception to Erlang * and do the comparison in Erlang land. In practice, views keys are * EJSON structures with very little nesting. */ return ctx.error ? enif_make_badarg(env) : enif_make_int(env, result); } int less_json(int depth, ctx_t* ctx, ERL_NIF_TERM a, ERL_NIF_TERM b) { int aIsAtom, bIsAtom; int aIsBin, bIsBin; int aIsNumber, bIsNumber; int aIsList, bIsList; int aArity, bArity; const ERL_NIF_TERM *aProps, *bProps; /* * Avoid too much recursion. Normally there isn't more than a few levels * of recursion, as in practice view keys do not go beyond 1 to 3 levels * of nesting. In case of too much recursion, signal it to the Erlang land * via an exception and do the EJSON comparison in Erlang land. */ if (depth > MAX_DEPTH) { ctx->error = 1; return 0; } aIsAtom = enif_is_atom(ctx->env, a); bIsAtom = enif_is_atom(ctx->env, b); if (aIsAtom) { if (bIsAtom) { int aSortOrd, bSortOrd; if ((aSortOrd = atom_sort_order(ctx->env, a)) == -1) { ctx->error = 1; return 0; } if ((bSortOrd = atom_sort_order(ctx->env, b)) == -1) { ctx->error = 1; return 0; } return aSortOrd - bSortOrd; } return -1; } if (bIsAtom) { return 1; } aIsNumber = term_is_number(ctx->env, a); bIsNumber = term_is_number(ctx->env, b); if (aIsNumber) { if (bIsNumber) { return enif_compare_compat(ctx->env, a, b); } return -1; } if (bIsNumber) { return 1; } aIsBin = enif_is_binary(ctx->env, a); bIsBin = enif_is_binary(ctx->env, b); if (aIsBin) { if (bIsBin) { ErlNifBinary binA, binB; enif_inspect_binary(ctx->env, a, &binA); enif_inspect_binary(ctx->env, b, &binB); return compare_strings(ctx, binA, binB); } return -1; } if (bIsBin) { return 1; } aIsList = enif_is_list(ctx->env, a); bIsList = enif_is_list(ctx->env, b); if (aIsList) { if (bIsList) { return compare_lists(depth, ctx, a, b); } return -1; } if (bIsList) { return 1; } if (!enif_get_tuple(ctx->env, a, &aArity, &aProps)) { ctx->error = 1; return 0; } if ((aArity != 1) || !enif_is_list(ctx->env, aProps[0])) { ctx->error = 1; return 0; } if (!enif_get_tuple(ctx->env, b, &bArity, &bProps)) { ctx->error = 1; return 0; } if ((bArity != 1) || !enif_is_list(ctx->env, bProps[0])) { ctx->error = 1; return 0; } return compare_props(depth, ctx, aProps[0], bProps[0]); } int atom_sort_order(ErlNifEnv* env, ERL_NIF_TERM a) { if (enif_compare_compat(env, a, ATOM_NULL) == 0) { return 1; } else if (enif_compare_compat(env, a, ATOM_FALSE) == 0) { return 2; } else if (enif_compare_compat(env, a, ATOM_TRUE) == 0) { return 3; } return -1; } int compare_lists(int depth, ctx_t* ctx, ERL_NIF_TERM a, ERL_NIF_TERM b) { ERL_NIF_TERM headA, tailA; ERL_NIF_TERM headB, tailB; int aIsEmpty, bIsEmpty; int result; while (1) { aIsEmpty = !enif_get_list_cell(ctx->env, a, &headA, &tailA); bIsEmpty = !enif_get_list_cell(ctx->env, b, &headB, &tailB); if (aIsEmpty) { if (bIsEmpty) { return 0; } return -1; } if (bIsEmpty) { return 1; } result = less_json(depth + 1, ctx, headA, headB); if (ctx->error || result != 0) { return result; } a = tailA; b = tailB; } return result; } int compare_props(int depth, ctx_t* ctx, ERL_NIF_TERM a, ERL_NIF_TERM b) { ERL_NIF_TERM headA, tailA; ERL_NIF_TERM headB, tailB; int aArity, bArity; const ERL_NIF_TERM *aKV, *bKV; ErlNifBinary keyA, keyB; int aIsEmpty, bIsEmpty; int keyCompResult, valueCompResult; while (1) { aIsEmpty = !enif_get_list_cell(ctx->env, a, &headA, &tailA); bIsEmpty = !enif_get_list_cell(ctx->env, b, &headB, &tailB); if (aIsEmpty) { if (bIsEmpty) { return 0; } return -1; } if (bIsEmpty) { return 1; } if (!enif_get_tuple(ctx->env, headA, &aArity, &aKV)) { ctx->error = 1; return 0; } if ((aArity != 2) || !enif_inspect_binary(ctx->env, aKV[0], &keyA)) { ctx->error = 1; return 0; } if (!enif_get_tuple(ctx->env, headB, &bArity, &bKV)) { ctx->error = 1; return 0; } if ((bArity != 2) || !enif_inspect_binary(ctx->env, bKV[0], &keyB)) { ctx->error = 1; return 0; } keyCompResult = compare_strings(ctx, keyA, keyB); if (ctx->error || keyCompResult != 0) { return keyCompResult; } valueCompResult = less_json(depth + 1, ctx, aKV[1], bKV[1]); if (ctx->error || valueCompResult != 0) { return valueCompResult; } a = tailA; b = tailB; } return 0; } int compare_strings(ctx_t* ctx, ErlNifBinary a, ErlNifBinary b) { UErrorCode status = U_ZERO_ERROR; UCharIterator iterA, iterB; int result; uiter_setUTF8(&iterA, (const char *) a.data, (uint32_t) a.size); uiter_setUTF8(&iterB, (const char *) b.data, (uint32_t) b.size); reserve_coll(ctx); result = ucol_strcollIter(ctx->coll, &iterA, &iterB, &status); if (U_FAILURE(status)) { ctx->error = 1; return 0; } /* ucol_strcollIter returns 0, -1 or 1 * (see type UCollationResult in unicode/ucol.h) */ return result; } int on_load(ErlNifEnv* env, void** priv, ERL_NIF_TERM info) { UErrorCode status = U_ZERO_ERROR; int i, j; if (!enif_get_int(env, info, &numCollators)) { return 1; } if (numCollators < 1) { return 2; } collMutex = enif_mutex_create("coll_mutex"); if (collMutex == NULL) { return 3; } collators = enif_alloc(sizeof(UCollator*) * numCollators); if (collators == NULL) { enif_mutex_destroy(collMutex); return 4; } for (i = 0; i < numCollators; i++) { collators[i] = ucol_open("", &status); if (U_FAILURE(status)) { for (j = 0; j < i; j++) { ucol_close(collators[j]); } enif_free(collators); enif_mutex_destroy(collMutex); return 5; } } ATOM_TRUE = enif_make_atom(env, "true"); ATOM_FALSE = enif_make_atom(env, "false"); ATOM_NULL = enif_make_atom(env, "null"); return 0; } void on_unload(ErlNifEnv* env, void* priv_data) { if (collators != NULL) { int i; for (i = 0; i < numCollators; i++) { ucol_close(collators[i]); } enif_free(collators); } if (collMutex != NULL) { enif_mutex_destroy(collMutex); } } static ErlNifFunc nif_functions[] = { {"less_nif", 2, less_json_nif} }; #ifdef __cplusplus extern "C" { #endif ERL_NIF_INIT(couch_ejson_compare, nif_functions, &on_load, NULL, NULL, &on_unload); #ifdef __cplusplus } #endif apache-couchdb-1.6.0/src/couchdb/priv/couch_ejson_compare/erl_nif_compat.h0000644000175000001440000000713412332105522026640 0ustar00djcusers00000000000000/* Copyright (c) 2010-2011 Basho Technologies, Inc. * With some minor modifications for Apache CouchDB. * * This file is provided to you under the Apache License, * Version 2.0 (the "License"); you may not use this file * except in compliance with the License. You may obtain * a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, * software distributed under the License is distributed on an * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY * KIND, either express or implied. See the License for the * specific language governing permissions and limitations * under the License. */ #ifndef ERL_NIF_COMPAT_H_ #define ERL_NIF_COMPAT_H_ #ifdef __cplusplus extern "C" { #endif /* __cplusplus */ #include "erl_nif.h" #if ERL_NIF_MAJOR_VERSION == 0 && ERL_NIF_MINOR_VERSION == 1 #define OTP_R13B03 #elif ERL_NIF_MAJOR_VERSION == 1 && ERL_NIF_MINOR_VERSION == 0 #define OTP_R13B04 #elif ERL_NIF_MAJOR_VERSION == 2 && ERL_NIF_MINOR_VERSION == 0 #define OTP_R14A #define OTP_R14B #define OTP_R14B01 #elif ERL_NIF_MAJOR_VERSION == 2 && ERL_NIF_MINOR_VERSION == 1 #define OTP_R14B02 #elif ERL_NIF_MAJOR_VERSION == 2 && ERL_NIF_MINOR_VERSION == 2 #define OTP_R14B03 #endif #ifdef OTP_R13B03 #define enif_open_resource_type_compat enif_open_resource_type #define enif_alloc_resource_compat enif_alloc_resource #define enif_release_resource_compat enif_release_resource #define enif_alloc_binary_compat enif_alloc_binary #define enif_alloc_compat enif_alloc #define enif_release_binary_compat enif_release_binary #define enif_free_compat enif_free #define enif_get_atom_compat enif_get_atom #define enif_priv_data_compat enif_get_data #define enif_make_uint_compat enif_make_ulong #define enif_make_string_compat(E, B, Enc) \ enif_make_string(E, B) #define enif_compare_compat enif_compare #endif /* R13B03 */ #ifdef OTP_R13B04 #define enif_open_resource_type_compat enif_open_resource_type #define enif_alloc_resource_compat enif_alloc_resource #define enif_release_resource_compat enif_release_resource #define enif_alloc_binary_compat enif_alloc_binary #define enif_realloc_binary_compat enif_realloc_binary #define enif_release_binary_compat enif_release_binary #define enif_alloc_compat enif_alloc #define enif_free_compat enif_free #define enif_get_atom_compat enif_get_atom #define enif_priv_data_compat enif_priv_data #define enif_make_string_compat enif_make_string #define enif_make_uint_compat enif_make_uint #define enif_compare_compat enif_compare #endif /* R13B04 */ /* OTP R14 and future releases */ #if !defined(OTP_R13B03) && !defined(OTP_R13B04) #define enif_open_resource_type_compat(E, N, D, F, T) \ enif_open_resource_type(E, NULL, N, D, F, T) #define enif_alloc_resource_compat(E, T, S) \ enif_alloc_resource(T, S) #define enif_release_resource_compat(E, H) \ enif_release_resource(H) #define enif_alloc_binary_compat(E, S, B) \ enif_alloc_binary(S, B) #define enif_realloc_binary_compat(E, S, B) \ enif_realloc_binary(S, B) #define enif_release_binary_compat(E, B) \ enif_release_binary(B) #define enif_alloc_compat(E, S) \ enif_alloc(S) #define enif_free_compat(E, P) \ enif_free(P) #define enif_get_atom_compat(E, T, B, S) \ enif_get_atom(E, T, B, S, ERL_NIF_LATIN1) #define enif_priv_data_compat enif_priv_data #define enif_make_string_compat enif_make_string #define enif_make_uint_compat enif_make_uint #define enif_compare_compat(E, A, B) \ enif_compare(A, B) #endif /* R14 and future releases */ #ifdef __cplusplus } #endif /* __cplusplus */ #endif /* ERL_NIF_COMPAT_H_ */ apache-couchdb-1.6.0/src/couchdb/priv/couchjs.10000644000175000001440000000262312332105603021217 0ustar00djcusers00000000000000.\" DO NOT MODIFY THIS FILE! It was generated by help2man 1.40.11. .TH COUCHJS "1" "May 2014" "couchjs - Apache CouchDB 1.6.0" "User Commands" .SH NAME couchjs \- Apache CouchDB JavaScript interpreter .SH SYNOPSIS .B couchjs [\fIFILE\fR] .SH DESCRIPTION The couchjs command runs the Apache CouchDB JavaScript interpreter. .PP The exit status is 0 for success or 1 for failure. .SH OPTIONS .TP \fB\-h\fR display a short help message and exit .TP \fB\-V\fR display version information and exit .TP \fB\-H\fR enable couchjs cURL bindings (only avaiable if package was built with cURL available) .TP \fB\-S\fR SIZE specify that the runtime should allow at most SIZE bytes of memory to be allocated .TP \fB\-u\fR FILE path to a .uri file containing the address (or addresses) of one or more servers .SH "REPORTING BUGS" Report bugs at . .PP .br Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. You may obtain a copy ofthe .br License at .IP http://www.apache.org/licenses/LICENSE\-2.0 .PP .br Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR .br CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License. apache-couchdb-1.6.0/src/couchdb/priv/icu_driver/0000755000175000001440000000000012332105603021627 5ustar00djcusers00000000000000apache-couchdb-1.6.0/src/couchdb/priv/icu_driver/couch_icu_driver.c0000644000175000001440000001317612332105522025317 0ustar00djcusers00000000000000/* Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. You may obtain a copy of the License at http://www.apache.org/licenses/LICENSE-2.0 Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License. */ /* This file is the C port driver for Erlang. It provides a low overhead * means of calling into C code, however coding errors in this module can * crash the entire Erlang server. */ #ifdef DARWIN #define U_HIDE_DRAFT_API 1 #define U_DISABLE_RENAMING 1 #endif #include "erl_driver.h" #include "unicode/ucol.h" #include "unicode/ucasemap.h" #ifndef WIN32 #include /* for memcpy */ #endif #if ERL_DRV_EXTENDED_MAJOR_VERSION < 2 typedef int COUCH_SSIZET; #else typedef ErlDrvSSizeT COUCH_SSIZET; #endif typedef struct { ErlDrvPort port; UCollator* collNoCase; UCollator* coll; } couch_drv_data; static void couch_drv_stop(ErlDrvData data) { couch_drv_data* pData = (couch_drv_data*)data; if (pData->coll) { ucol_close(pData->coll); } if (pData->collNoCase) { ucol_close(pData->collNoCase); } driver_free((void*)pData); } static ErlDrvData couch_drv_start(ErlDrvPort port, char *buff) { UErrorCode status = U_ZERO_ERROR; couch_drv_data* pData = (couch_drv_data*)driver_alloc(sizeof(couch_drv_data)); if (pData == NULL) return ERL_DRV_ERROR_GENERAL; pData->port = port; pData->coll = ucol_open("", &status); if (U_FAILURE(status)) { couch_drv_stop((ErlDrvData)pData); return ERL_DRV_ERROR_GENERAL; } pData->collNoCase = ucol_open("", &status); if (U_FAILURE(status)) { couch_drv_stop((ErlDrvData)pData); return ERL_DRV_ERROR_GENERAL; } ucol_setAttribute(pData->collNoCase, UCOL_STRENGTH, UCOL_PRIMARY, &status); if (U_FAILURE(status)) { couch_drv_stop((ErlDrvData)pData); return ERL_DRV_ERROR_GENERAL; } return (ErlDrvData)pData; } COUCH_SSIZET return_control_result(void* pLocalResult, int localLen, char **ppRetBuf, COUCH_SSIZET returnLen) { if (*ppRetBuf == NULL || localLen > returnLen) { *ppRetBuf = (char*)driver_alloc_binary(localLen); if(*ppRetBuf == NULL) { return -1; } } memcpy(*ppRetBuf, pLocalResult, localLen); return localLen; } static COUCH_SSIZET couch_drv_control(ErlDrvData drv_data, unsigned int command, char *pBuf, COUCH_SSIZET bufLen, char **rbuf, COUCH_SSIZET rlen) { couch_drv_data* pData = (couch_drv_data*)drv_data; switch(command) { case 0: /* COLLATE */ case 1: /* COLLATE_NO_CASE: */ { UErrorCode status = U_ZERO_ERROR; int collResult; char response; UCharIterator iterA; UCharIterator iterB; int32_t length; /* 2 strings are in the buffer, consecutively * The strings begin first with a 32 bit integer byte length, then the actual * string bytes follow. */ /* first 32bits are the length */ memcpy(&length, pBuf, sizeof(length)); pBuf += sizeof(length); /* point the iterator at it. */ uiter_setUTF8(&iterA, pBuf, length); pBuf += length; /* now on to string b */ /* first 32bits are the length */ memcpy(&length, pBuf, sizeof(length)); pBuf += sizeof(length); /* point the iterator at it. */ uiter_setUTF8(&iterB, pBuf, length); if (command == 0) /* COLLATE */ collResult = ucol_strcollIter(pData->coll, &iterA, &iterB, &status); else /* COLLATE_NO_CASE */ collResult = ucol_strcollIter(pData->collNoCase, &iterA, &iterB, &status); if (collResult < 0) response = 0; /*lt*/ else if (collResult > 0) response = 2; /*gt*/ else response = 1; /*eq*/ return return_control_result(&response, sizeof(response), rbuf, rlen); } default: return -1; } } ErlDrvEntry couch_driver_entry = { NULL, /* F_PTR init, N/A */ couch_drv_start, /* L_PTR start, called when port is opened */ couch_drv_stop, /* F_PTR stop, called when port is closed */ NULL, /* F_PTR output, called when erlang has sent */ NULL, /* F_PTR ready_input, called when input descriptor ready */ NULL, /* F_PTR ready_output, called when output descriptor ready */ "couch_icu_driver", /* char *driver_name, the argument to open_port */ NULL, /* F_PTR finish, called when unloaded */ NULL, /* Not used */ couch_drv_control, /* F_PTR control, port_command callback */ NULL, /* F_PTR timeout, reserved */ NULL, /* F_PTR outputv, reserved */ NULL, /* F_PTR ready_async */ NULL, /* F_PTR flush */ NULL, /* F_PTR call */ NULL, /* F_PTR event */ ERL_DRV_EXTENDED_MARKER, ERL_DRV_EXTENDED_MAJOR_VERSION, ERL_DRV_EXTENDED_MINOR_VERSION, ERL_DRV_FLAG_USE_PORT_LOCKING, NULL, /* Reserved -- Used by emulator internally */ NULL, /* F_PTR process_exit */ }; DRIVER_INIT(couch_icu_driver) /* must match name in driver_entry */ { return &couch_driver_entry; } apache-couchdb-1.6.0/src/couchdb/priv/stat_descriptions.cfg.in0000644000175000001440000000543212332105522024327 0ustar00djcusers00000000000000%% Licensed under the Apache License, Version 2.0 (the "License"); you may not %% use this file except in compliance with the License. You may obtain a copy of %% the License at %% %% http://www.apache.org/licenses/LICENSE-2.0 %% %% Unless required by applicable law or agreed to in writing, software %% distributed under the License is distributed on an "AS IS" BASIS, WITHOUT %% WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the %% License for the specific language governing permissions and limitations under %% the License. % Style guide for descriptions: Start with a lowercase letter & do not add % a trailing full-stop / period % Please keep this in alphabetical order {couchdb, database_writes, "number of times a database was changed"}. {couchdb, database_reads, "number of times a document was read from a database"}. {couchdb, open_databases, "number of open databases"}. {couchdb, open_os_files, "number of file descriptors CouchDB has open"}. {couchdb, request_time, "length of a request inside CouchDB without MochiWeb"}. {couchdb, auth_cache_hits, "number of authentication cache hits"}. {couchdb, auth_cache_misses, "number of authentication cache misses"}. {httpd, bulk_requests, "number of bulk requests"}. {httpd, requests, "number of HTTP requests"}. {httpd, temporary_view_reads, "number of temporary view reads"}. {httpd, view_reads, "number of view reads"}. {httpd, clients_requesting_changes, "number of clients for continuous _changes"}. {httpd_request_methods, 'COPY', "number of HTTP COPY requests"}. {httpd_request_methods, 'DELETE', "number of HTTP DELETE requests"}. {httpd_request_methods, 'GET', "number of HTTP GET requests"}. {httpd_request_methods, 'HEAD', "number of HTTP HEAD requests"}. {httpd_request_methods, 'POST', "number of HTTP POST requests"}. {httpd_request_methods, 'PUT', "number of HTTP PUT requests"}. {httpd_status_codes, '200', "number of HTTP 200 OK responses"}. {httpd_status_codes, '201', "number of HTTP 201 Created responses"}. {httpd_status_codes, '202', "number of HTTP 202 Accepted responses"}. {httpd_status_codes, '301', "number of HTTP 301 Moved Permanently responses"}. {httpd_status_codes, '304', "number of HTTP 304 Not Modified responses"}. {httpd_status_codes, '400', "number of HTTP 400 Bad Request responses"}. {httpd_status_codes, '401', "number of HTTP 401 Unauthorized responses"}. {httpd_status_codes, '403', "number of HTTP 403 Forbidden responses"}. {httpd_status_codes, '404', "number of HTTP 404 Not Found responses"}. {httpd_status_codes, '405', "number of HTTP 405 Method Not Allowed responses"}. {httpd_status_codes, '409', "number of HTTP 409 Conflict responses"}. {httpd_status_codes, '412', "number of HTTP 412 Precondition Failed responses"}. {httpd_status_codes, '500', "number of HTTP 500 Internal Server Error responses"}. apache-couchdb-1.6.0/src/couchdb/priv/Makefile.am0000644000175000001440000001130512332105522021530 0ustar00djcusers00000000000000## Licensed under the Apache License, Version 2.0 (the "License"); you may not ## use this file except in compliance with the License. You may obtain a copy of ## the License at ## ## http://www.apache.org/licenses/LICENSE-2.0 ## ## Unless required by applicable law or agreed to in writing, software ## distributed under the License is distributed on an "AS IS" BASIS, WITHOUT ## WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the ## License for the specific language governing permissions and limitations under ## the License. AUTOMAKE_OPTIONS = subdir-objects MAKE_SAFE = $(MAKE) couchlibdir = $(localerlanglibdir)/couch-$(version) couchprivdir = $(couchlibdir)/priv couchprivlibdir = $(couchlibdir)/priv/lib man1dir = $(mandir)/man1 man_file = couchjs.1 if BUILD_MAN man_file_build = $(man_file) else man_file_build = endif BUILT_SOURCES = $(man_file_build) EXTRA_DIST = \ spawnkillable/couchspawnkillable.sh \ stat_descriptions.cfg.in \ couch_ejson_compare/erl_nif_compat.h \ couch_js/sm170.c \ couch_js/sm180.c \ couch_js/sm185.c \ $(man_file_build) CLEANFILES = $(man_file_build) stat_descriptions.cfg couchprivlib_LTLIBRARIES = couch_icu_driver.la if USE_EJSON_COMPARE_NIF couchprivlib_LTLIBRARIES += couch_ejson_compare.la couch_ejson_compare_la_SOURCES = couch_ejson_compare/couch_ejson_compare.c couch_ejson_compare_la_CPPFLAGS = -D_BSD_SOURCE $(ICU_CPPFLAGS) $(ERLANG_FLAGS) couch_ejson_compare_la_LDFLAGS = -module -avoid-version couch_ejson_compare_la_LIBADD = $(ICU_LIBS) if WINDOWS couch_ejson_compare_la_LDFLAGS += -no-undefined endif endif couch_icu_driver_la_SOURCES = icu_driver/couch_icu_driver.c couch_icu_driver_la_LDFLAGS = -module -avoid-version couch_icu_driver_la_CPPFLAGS = $(ICU_CPPFLAGS) $(ERLANG_FLAGS) couch_icu_driver_la_LIBADD = $(ICU_LIBS) if WINDOWS couch_icu_driver_la_LDFLAGS += -no-undefined endif COUCHJS_SRCS = \ couch_js/help.h \ couch_js/http.c \ couch_js/http.h \ couch_js/main.c \ couch_js/utf8.c \ couch_js/utf8.h \ couch_js/util.h \ couch_js/util.c locallibbin_PROGRAMS = couchjs couchjs_SOURCES = $(COUCHJS_SRCS) couchjs_CFLAGS = -g -Wall -Werror -D_BSD_SOURCE $(CURL_CFLAGS) $(JS_CFLAGS) couchjs_LDADD = $(CURL_LIBS) $(JS_LIBS) couchpriv_DATA = stat_descriptions.cfg couchpriv_PROGRAMS = couchspawnkillable # Depend on source files so distributed man pages are not rebuilt for end user. $(man_file): $(COUCHJS_SRCS) $(MAKE_SAFE) -f Makefile couchjs; \ $(top_srcdir)/build-aux/missing --run \ help2man \ --no-info \ --help-option="-h" \ --version-option="-V" \ --name="$(package_name) JavaScript interpreter" \ ./couchjs --output $@ install-data-local: if test -s $(man_file); then \ if test `cat $(man_file) | wc -l` -gt 1; then \ $(INSTALL) -d $(DESTDIR)$(man1dir); \ $(INSTALL_DATA) $(man_file) $(DESTDIR)$(man1dir)/$(man_file); \ fi \ fi %.cfg: %.cfg.in cp $< $@ if WINDOWS couchspawnkillable_SOURCES = spawnkillable/couchspawnkillable_win.c endif if !WINDOWS couchspawnkillable: spawnkillable/couchspawnkillable.sh cp $< $@ chmod +x $@ endif # libtool and automake have defeated markh. For each of our executables # we end up with 2 copies - one directly in the 'target' folder (eg, 'priv') # and another - the correct one - in .libs. The former doesn't work but is # what gets installed for 'couchspawnkillable' - but the correct one for # couchjs.exe *does* get copied. *shrug* So just clobber it with the # correct one as the last step. See bug COUCHDB-439 install-data-hook: if test -f "$(DESTDIR)$(couchprivlibdir)/couch_icu_driver"; then \ rm -f "$(DESTDIR)$(couchprivlibdir)/couch_icu_driver.so"; \ cd "$(DESTDIR)$(couchprivlibdir)" && \ $(LN_S) couch_icu_driver couch_icu_driver.so; \ fi if test -f "$(DESTDIR)$(couchprivlibdir)/couch_ejson_compare_nif"; then \ rm -f "$(DESTDIR)$(couchprivlibdir)/couch_ejson_compare_nif.so"; \ cd "$(DESTDIR)$(couchprivlibdir)" && \ $(LN_S) couch_ejson_compare_nif couch_ejson_compare_nif.so; \ fi if WINDOWS $(INSTALL) $(ICU_BIN)/icuuc*.dll $(bindir) $(INSTALL) $(ICU_BIN)/icudt*.dll $(bindir) $(INSTALL) $(ICU_BIN)/icuin*.dll $(bindir) $(INSTALL) $(JS_LIB_BINARY) $(bindir) $(INSTALL) .libs/couchspawnkillable.exe \ "$(DESTDIR)$(couchprivdir)/couchspawnkillable.exe" endif uninstall-local: rm -f $(DESTDIR)$(man1dir)/$(man_file) if test -f "$(DESTDIR)$(couchprivlibdir)/couch_erl_driver"; then \ rm -f "$(DESTDIR)$(couchprivlibdir)/couch_erl_driver.so"; \ fi distcheck-hook: if test ! -s $(man_file); then \ $(top_srcdir)/build-aux/dist-error $(man_file); \ else \ if test ! `cat $(man_file) | wc -l` -gt 1; then \ $(top_srcdir)/build-aux/dist-error $(man_file); \ fi \ fi apache-couchdb-1.6.0/src/couchdb/priv/Makefile.in0000644000175000001440000013345312332105551021554 0ustar00djcusers00000000000000# Makefile.in generated by automake 1.11.6 from Makefile.am. # @configure_input@ # Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, # 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011 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__make_dryrun = \ { \ am__dry=no; \ case $$MAKEFLAGS in \ *\\[\ \ ]*) \ echo 'am--echo: ; @echo "AM" OK' | $(MAKE) -f - 2>/dev/null \ | grep '^AM OK$$' >/dev/null || am__dry=yes;; \ *) \ for am__flg in $$MAKEFLAGS; do \ case $$am__flg in \ *=*|--*) ;; \ *n*) am__dry=yes; break;; \ esac; \ done;; \ esac; \ test $$am__dry = yes; \ } 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@ @USE_EJSON_COMPARE_NIF_TRUE@am__append_1 = couch_ejson_compare.la @USE_EJSON_COMPARE_NIF_TRUE@@WINDOWS_TRUE@am__append_2 = -no-undefined @WINDOWS_TRUE@am__append_3 = -no-undefined locallibbin_PROGRAMS = couchjs$(EXEEXT) couchpriv_PROGRAMS = couchspawnkillable$(EXEEXT) subdir = src/couchdb/priv DIST_COMMON = $(srcdir)/Makefile.am $(srcdir)/Makefile.in ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 am__aclocal_m4_deps = $(top_srcdir)/m4/libtool.m4 \ $(top_srcdir)/m4/ltoptions.m4 $(top_srcdir)/m4/ltsugar.m4 \ $(top_srcdir)/m4/ltversion.m4 $(top_srcdir)/m4/lt~obsolete.m4 \ $(top_srcdir)/acinclude.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 \ $(top_builddir)/src/snappy/google-snappy/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)$(couchprivlibdir)" \ "$(DESTDIR)$(couchprivdir)" "$(DESTDIR)$(locallibbindir)" \ "$(DESTDIR)$(couchprivdir)" LTLIBRARIES = $(couchprivlib_LTLIBRARIES) am__DEPENDENCIES_1 = @USE_EJSON_COMPARE_NIF_TRUE@couch_ejson_compare_la_DEPENDENCIES = \ @USE_EJSON_COMPARE_NIF_TRUE@ $(am__DEPENDENCIES_1) am__couch_ejson_compare_la_SOURCES_DIST = \ couch_ejson_compare/couch_ejson_compare.c am__dirstamp = $(am__leading_dot)dirstamp @USE_EJSON_COMPARE_NIF_TRUE@am_couch_ejson_compare_la_OBJECTS = couch_ejson_compare/couch_ejson_compare_la-couch_ejson_compare.lo couch_ejson_compare_la_OBJECTS = $(am_couch_ejson_compare_la_OBJECTS) couch_ejson_compare_la_LINK = $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) \ $(LIBTOOLFLAGS) --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) \ $(couch_ejson_compare_la_LDFLAGS) $(LDFLAGS) -o $@ @USE_EJSON_COMPARE_NIF_TRUE@am_couch_ejson_compare_la_rpath = -rpath \ @USE_EJSON_COMPARE_NIF_TRUE@ $(couchprivlibdir) couch_icu_driver_la_DEPENDENCIES = $(am__DEPENDENCIES_1) am_couch_icu_driver_la_OBJECTS = \ icu_driver/couch_icu_driver_la-couch_icu_driver.lo couch_icu_driver_la_OBJECTS = $(am_couch_icu_driver_la_OBJECTS) couch_icu_driver_la_LINK = $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) \ $(LIBTOOLFLAGS) --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) \ $(couch_icu_driver_la_LDFLAGS) $(LDFLAGS) -o $@ PROGRAMS = $(couchpriv_PROGRAMS) $(locallibbin_PROGRAMS) am__objects_1 = couch_js/couchjs-http.$(OBJEXT) \ couch_js/couchjs-main.$(OBJEXT) \ couch_js/couchjs-utf8.$(OBJEXT) \ couch_js/couchjs-util.$(OBJEXT) am_couchjs_OBJECTS = $(am__objects_1) couchjs_OBJECTS = $(am_couchjs_OBJECTS) couchjs_DEPENDENCIES = $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) couchjs_LINK = $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) \ --mode=link $(CCLD) $(couchjs_CFLAGS) $(CFLAGS) $(AM_LDFLAGS) \ $(LDFLAGS) -o $@ am__couchspawnkillable_SOURCES_DIST = \ spawnkillable/couchspawnkillable_win.c @WINDOWS_TRUE@am_couchspawnkillable_OBJECTS = \ @WINDOWS_TRUE@ spawnkillable/couchspawnkillable_win.$(OBJEXT) couchspawnkillable_OBJECTS = $(am_couchspawnkillable_OBJECTS) couchspawnkillable_LDADD = $(LDADD) DEFAULT_INCLUDES = -I.@am__isrc@ -I$(top_builddir) -I$(top_builddir)/src/snappy/google-snappy depcomp = $(SHELL) $(top_srcdir)/build-aux/depcomp am__depfiles_maybe = depfiles am__mv = mv -f COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \ $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) LTCOMPILE = $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) \ --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) \ $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) CCLD = $(CC) LINK = $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) \ --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) $(AM_LDFLAGS) \ $(LDFLAGS) -o $@ SOURCES = $(couch_ejson_compare_la_SOURCES) \ $(couch_icu_driver_la_SOURCES) $(couchjs_SOURCES) \ $(couchspawnkillable_SOURCES) DIST_SOURCES = $(am__couch_ejson_compare_la_SOURCES_DIST) \ $(couch_icu_driver_la_SOURCES) $(couchjs_SOURCES) \ $(am__couchspawnkillable_SOURCES_DIST) am__can_run_installinfo = \ case $$AM_UPDATE_INFO_DIR in \ n|no|NO) false;; \ *) (install-info --version) >/dev/null 2>&1;; \ esac DATA = $(couchpriv_DATA) ETAGS = etags CTAGS = ctags DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) ACLOCAL = @ACLOCAL@ AMTAR = @AMTAR@ AR = @AR@ AS = @AS@ AUTOCONF = @AUTOCONF@ AUTOHEADER = @AUTOHEADER@ AUTOMAKE = @AUTOMAKE@ AWK = @AWK@ CC = @CC@ CCDEPMODE = @CCDEPMODE@ CFLAGS = @CFLAGS@ CPP = @CPP@ CPPFLAGS = @CPPFLAGS@ CURL_CFLAGS = @CURL_CFLAGS@ CURL_CONFIG = @CURL_CONFIG@ CURL_LIBS = @CURL_LIBS@ CXX = @CXX@ CXXCPP = @CXXCPP@ CXXDEPMODE = @CXXDEPMODE@ CXXFLAGS = @CXXFLAGS@ CYGPATH_W = @CYGPATH_W@ DEFS = @DEFS@ DEPDIR = @DEPDIR@ DLLTOOL = @DLLTOOL@ DSYMUTIL = @DSYMUTIL@ DUMPBIN = @DUMPBIN@ ECHO_C = @ECHO_C@ ECHO_N = @ECHO_N@ ECHO_T = @ECHO_T@ EGREP = @EGREP@ ERL = @ERL@ ERLANG_FLAGS = @ERLANG_FLAGS@ ERLC = @ERLC@ ERLC_FLAGS = @ERLC_FLAGS@ ESCRIPT = @ESCRIPT@ EXEEXT = @EXEEXT@ FGREP = @FGREP@ FLAGS = @FLAGS@ GREP = @GREP@ HAS_HELP2MAN = @HAS_HELP2MAN@ HAS_INSTALLINFO = @HAS_INSTALLINFO@ HAS_MAKEINFO = @HAS_MAKEINFO@ HAS_PDFLATEX = @HAS_PDFLATEX@ HAS_SPHINX_BUILD = @HAS_SPHINX_BUILD@ ICU_BIN = @ICU_BIN@ ICU_CFLAGS = @ICU_CFLAGS@ ICU_CONFIG = @ICU_CONFIG@ ICU_CPPFLAGS = @ICU_CPPFLAGS@ ICU_CXXFLAGS = @ICU_CXXFLAGS@ ICU_LIBS = @ICU_LIBS@ INNO_COMPILER_EXECUTABLE = @INNO_COMPILER_EXECUTABLE@ INSTALL = @INSTALL@ INSTALL_DATA = @INSTALL_DATA@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ INSTALL_SCRIPT = @INSTALL_SCRIPT@ INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ JS_CFLAGS = @JS_CFLAGS@ JS_LIBS = @JS_LIBS@ JS_LIB_BINARY = @JS_LIB_BINARY@ LD = @LD@ LDFLAGS = @LDFLAGS@ LIBOBJS = @LIBOBJS@ LIBS = @LIBS@ LIBTOOL = @LIBTOOL@ LIPO = @LIPO@ LN_S = @LN_S@ LTLIBOBJS = @LTLIBOBJS@ MAKEINFO = @MAKEINFO@ MANIFEST_TOOL = @MANIFEST_TOOL@ MKDIR_P = @MKDIR_P@ NM = @NM@ NMEDIT = @NMEDIT@ OBJDUMP = @OBJDUMP@ OBJEXT = @OBJEXT@ OTOOL = @OTOOL@ OTOOL64 = @OTOOL64@ PACKAGE = @PACKAGE@ PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ PACKAGE_NAME = @PACKAGE_NAME@ PACKAGE_STRING = @PACKAGE_STRING@ PACKAGE_TARNAME = @PACKAGE_TARNAME@ PACKAGE_URL = @PACKAGE_URL@ PACKAGE_VERSION = @PACKAGE_VERSION@ PATH_SEPARATOR = @PATH_SEPARATOR@ PKG_CONFIG = @PKG_CONFIG@ PKG_CONFIG_LIBDIR = @PKG_CONFIG_LIBDIR@ PKG_CONFIG_PATH = @PKG_CONFIG_PATH@ RANLIB = @RANLIB@ SED = @SED@ SET_MAKE = @SET_MAKE@ SHELL = @SHELL@ SNAPPY_MAJOR = @SNAPPY_MAJOR@ SNAPPY_MINOR = @SNAPPY_MINOR@ SNAPPY_PATCHLEVEL = @SNAPPY_PATCHLEVEL@ STRIP = @STRIP@ VERSION = @VERSION@ 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@ ac_cv_have_stddef_h = @ac_cv_have_stddef_h@ ac_cv_have_stdint_h = @ac_cv_have_stdint_h@ am__include = @am__include@ am__leading_dot = @am__leading_dot@ am__quote = @am__quote@ am__tar = @am__tar@ am__untar = @am__untar@ bindir = @bindir@ bug_uri = @bug_uri@ 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@ dvidir = @dvidir@ erlangbin = @erlangbin@ erlangversion = @erlangversion@ exec_prefix = @exec_prefix@ host = @host@ host_alias = @host_alias@ host_cpu = @host_cpu@ host_os = @host_os@ host_vendor = @host_vendor@ htmldir = @htmldir@ includedir = @includedir@ infodir = @infodir@ initdir = @initdir@ install_sh = @install_sh@ launchddir = @launchddir@ libdir = @libdir@ libexecdir = @libexecdir@ localconfdir = @localconfdir@ localdatadir = @localdatadir@ localdocdir = @localdocdir@ localedir = @localedir@ localerlanglibdir = @localerlanglibdir@ locallibbindir = @locallibbindir@ locallibdir = @locallibdir@ localstatedir = @localstatedir@ localstatelibdir = @localstatelibdir@ localstatelogdir = @localstatelogdir@ localstaterundir = @localstaterundir@ mandir = @mandir@ mkdir_p = @mkdir_p@ msvc_redist_dir = @msvc_redist_dir@ msvc_redist_name = @msvc_redist_name@ oldincludedir = @oldincludedir@ openssl_bin_dir = @openssl_bin_dir@ otp_release = @otp_release@ package_author_address = @package_author_address@ package_author_name = @package_author_name@ package_identifier = @package_identifier@ package_name = @package_name@ package_tarname = @package_tarname@ 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@ version = @version@ version_major = @version_major@ version_minor = @version_minor@ version_release = @version_release@ version_revision = @version_revision@ version_stage = @version_stage@ AUTOMAKE_OPTIONS = subdir-objects MAKE_SAFE = $(MAKE) couchlibdir = $(localerlanglibdir)/couch-$(version) couchprivdir = $(couchlibdir)/priv couchprivlibdir = $(couchlibdir)/priv/lib man1dir = $(mandir)/man1 man_file = couchjs.1 @BUILD_MAN_FALSE@man_file_build = @BUILD_MAN_TRUE@man_file_build = $(man_file) BUILT_SOURCES = $(man_file_build) EXTRA_DIST = \ spawnkillable/couchspawnkillable.sh \ stat_descriptions.cfg.in \ couch_ejson_compare/erl_nif_compat.h \ couch_js/sm170.c \ couch_js/sm180.c \ couch_js/sm185.c \ $(man_file_build) CLEANFILES = $(man_file_build) stat_descriptions.cfg couchprivlib_LTLIBRARIES = couch_icu_driver.la $(am__append_1) @USE_EJSON_COMPARE_NIF_TRUE@couch_ejson_compare_la_SOURCES = couch_ejson_compare/couch_ejson_compare.c @USE_EJSON_COMPARE_NIF_TRUE@couch_ejson_compare_la_CPPFLAGS = -D_BSD_SOURCE $(ICU_CPPFLAGS) $(ERLANG_FLAGS) @USE_EJSON_COMPARE_NIF_TRUE@couch_ejson_compare_la_LDFLAGS = -module \ @USE_EJSON_COMPARE_NIF_TRUE@ -avoid-version $(am__append_2) @USE_EJSON_COMPARE_NIF_TRUE@couch_ejson_compare_la_LIBADD = $(ICU_LIBS) couch_icu_driver_la_SOURCES = icu_driver/couch_icu_driver.c couch_icu_driver_la_LDFLAGS = -module -avoid-version $(am__append_3) couch_icu_driver_la_CPPFLAGS = $(ICU_CPPFLAGS) $(ERLANG_FLAGS) couch_icu_driver_la_LIBADD = $(ICU_LIBS) COUCHJS_SRCS = \ couch_js/help.h \ couch_js/http.c \ couch_js/http.h \ couch_js/main.c \ couch_js/utf8.c \ couch_js/utf8.h \ couch_js/util.h \ couch_js/util.c couchjs_SOURCES = $(COUCHJS_SRCS) couchjs_CFLAGS = -g -Wall -Werror -D_BSD_SOURCE $(CURL_CFLAGS) $(JS_CFLAGS) couchjs_LDADD = $(CURL_LIBS) $(JS_LIBS) couchpriv_DATA = stat_descriptions.cfg @WINDOWS_TRUE@couchspawnkillable_SOURCES = spawnkillable/couchspawnkillable_win.c all: $(BUILT_SOURCES) $(MAKE) $(AM_MAKEFLAGS) 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) --foreign src/couchdb/priv/Makefile'; \ $(am__cd) $(top_srcdir) && \ $(AUTOMAKE) --foreign src/couchdb/priv/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-couchprivlibLTLIBRARIES: $(couchprivlib_LTLIBRARIES) @$(NORMAL_INSTALL) @list='$(couchprivlib_LTLIBRARIES)'; test -n "$(couchprivlibdir)" || 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)$(couchprivlibdir)'"; \ $(MKDIR_P) "$(DESTDIR)$(couchprivlibdir)" || exit 1; \ echo " $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=install $(INSTALL) $(INSTALL_STRIP_FLAG) $$list2 '$(DESTDIR)$(couchprivlibdir)'"; \ $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=install $(INSTALL) $(INSTALL_STRIP_FLAG) $$list2 "$(DESTDIR)$(couchprivlibdir)"; \ } uninstall-couchprivlibLTLIBRARIES: @$(NORMAL_UNINSTALL) @list='$(couchprivlib_LTLIBRARIES)'; test -n "$(couchprivlibdir)" || list=; \ for p in $$list; do \ $(am__strip_dir) \ echo " $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=uninstall rm -f '$(DESTDIR)$(couchprivlibdir)/$$f'"; \ $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=uninstall rm -f "$(DESTDIR)$(couchprivlibdir)/$$f"; \ done clean-couchprivlibLTLIBRARIES: -test -z "$(couchprivlib_LTLIBRARIES)" || rm -f $(couchprivlib_LTLIBRARIES) @list='$(couchprivlib_LTLIBRARIES)'; for p in $$list; do \ dir="`echo $$p | sed -e 's|/[^/]*$$||'`"; \ test "$$dir" != "$$p" || dir=.; \ echo "rm -f \"$${dir}/so_locations\""; \ rm -f "$${dir}/so_locations"; \ done couch_ejson_compare/$(am__dirstamp): @$(MKDIR_P) couch_ejson_compare @: > couch_ejson_compare/$(am__dirstamp) couch_ejson_compare/$(DEPDIR)/$(am__dirstamp): @$(MKDIR_P) couch_ejson_compare/$(DEPDIR) @: > couch_ejson_compare/$(DEPDIR)/$(am__dirstamp) couch_ejson_compare/couch_ejson_compare_la-couch_ejson_compare.lo: \ couch_ejson_compare/$(am__dirstamp) \ couch_ejson_compare/$(DEPDIR)/$(am__dirstamp) couch_ejson_compare.la: $(couch_ejson_compare_la_OBJECTS) $(couch_ejson_compare_la_DEPENDENCIES) $(EXTRA_couch_ejson_compare_la_DEPENDENCIES) $(couch_ejson_compare_la_LINK) $(am_couch_ejson_compare_la_rpath) $(couch_ejson_compare_la_OBJECTS) $(couch_ejson_compare_la_LIBADD) $(LIBS) icu_driver/$(am__dirstamp): @$(MKDIR_P) icu_driver @: > icu_driver/$(am__dirstamp) icu_driver/$(DEPDIR)/$(am__dirstamp): @$(MKDIR_P) icu_driver/$(DEPDIR) @: > icu_driver/$(DEPDIR)/$(am__dirstamp) icu_driver/couch_icu_driver_la-couch_icu_driver.lo: \ icu_driver/$(am__dirstamp) \ icu_driver/$(DEPDIR)/$(am__dirstamp) couch_icu_driver.la: $(couch_icu_driver_la_OBJECTS) $(couch_icu_driver_la_DEPENDENCIES) $(EXTRA_couch_icu_driver_la_DEPENDENCIES) $(couch_icu_driver_la_LINK) -rpath $(couchprivlibdir) $(couch_icu_driver_la_OBJECTS) $(couch_icu_driver_la_LIBADD) $(LIBS) install-couchprivPROGRAMS: $(couchpriv_PROGRAMS) @$(NORMAL_INSTALL) @list='$(couchpriv_PROGRAMS)'; test -n "$(couchprivdir)" || list=; \ if test -n "$$list"; then \ echo " $(MKDIR_P) '$(DESTDIR)$(couchprivdir)'"; \ $(MKDIR_P) "$(DESTDIR)$(couchprivdir)" || 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)$(couchprivdir)$$dir'"; \ $(INSTALL_PROGRAM_ENV) $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=install $(INSTALL_PROGRAM) $$files "$(DESTDIR)$(couchprivdir)$$dir" || exit $$?; \ } \ ; done uninstall-couchprivPROGRAMS: @$(NORMAL_UNINSTALL) @list='$(couchpriv_PROGRAMS)'; test -n "$(couchprivdir)" || 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)$(couchprivdir)' && rm -f" $$files ")"; \ cd "$(DESTDIR)$(couchprivdir)" && rm -f $$files clean-couchprivPROGRAMS: @list='$(couchpriv_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 install-locallibbinPROGRAMS: $(locallibbin_PROGRAMS) @$(NORMAL_INSTALL) @list='$(locallibbin_PROGRAMS)'; test -n "$(locallibbindir)" || list=; \ if test -n "$$list"; then \ echo " $(MKDIR_P) '$(DESTDIR)$(locallibbindir)'"; \ $(MKDIR_P) "$(DESTDIR)$(locallibbindir)" || 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)$(locallibbindir)$$dir'"; \ $(INSTALL_PROGRAM_ENV) $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=install $(INSTALL_PROGRAM) $$files "$(DESTDIR)$(locallibbindir)$$dir" || exit $$?; \ } \ ; done uninstall-locallibbinPROGRAMS: @$(NORMAL_UNINSTALL) @list='$(locallibbin_PROGRAMS)'; test -n "$(locallibbindir)" || 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)$(locallibbindir)' && rm -f" $$files ")"; \ cd "$(DESTDIR)$(locallibbindir)" && rm -f $$files clean-locallibbinPROGRAMS: @list='$(locallibbin_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 couch_js/$(am__dirstamp): @$(MKDIR_P) couch_js @: > couch_js/$(am__dirstamp) couch_js/$(DEPDIR)/$(am__dirstamp): @$(MKDIR_P) couch_js/$(DEPDIR) @: > couch_js/$(DEPDIR)/$(am__dirstamp) couch_js/couchjs-http.$(OBJEXT): couch_js/$(am__dirstamp) \ couch_js/$(DEPDIR)/$(am__dirstamp) couch_js/couchjs-main.$(OBJEXT): couch_js/$(am__dirstamp) \ couch_js/$(DEPDIR)/$(am__dirstamp) couch_js/couchjs-utf8.$(OBJEXT): couch_js/$(am__dirstamp) \ couch_js/$(DEPDIR)/$(am__dirstamp) couch_js/couchjs-util.$(OBJEXT): couch_js/$(am__dirstamp) \ couch_js/$(DEPDIR)/$(am__dirstamp) couchjs$(EXEEXT): $(couchjs_OBJECTS) $(couchjs_DEPENDENCIES) $(EXTRA_couchjs_DEPENDENCIES) @rm -f couchjs$(EXEEXT) $(couchjs_LINK) $(couchjs_OBJECTS) $(couchjs_LDADD) $(LIBS) spawnkillable/$(am__dirstamp): @$(MKDIR_P) spawnkillable @: > spawnkillable/$(am__dirstamp) spawnkillable/$(DEPDIR)/$(am__dirstamp): @$(MKDIR_P) spawnkillable/$(DEPDIR) @: > spawnkillable/$(DEPDIR)/$(am__dirstamp) spawnkillable/couchspawnkillable_win.$(OBJEXT): \ spawnkillable/$(am__dirstamp) \ spawnkillable/$(DEPDIR)/$(am__dirstamp) @WINDOWS_TRUE@couchspawnkillable$(EXEEXT): $(couchspawnkillable_OBJECTS) $(couchspawnkillable_DEPENDENCIES) $(EXTRA_couchspawnkillable_DEPENDENCIES) @WINDOWS_TRUE@ @rm -f couchspawnkillable$(EXEEXT) @WINDOWS_TRUE@ $(LINK) $(couchspawnkillable_OBJECTS) $(couchspawnkillable_LDADD) $(LIBS) mostlyclean-compile: -rm -f *.$(OBJEXT) -rm -f couch_ejson_compare/couch_ejson_compare_la-couch_ejson_compare.$(OBJEXT) -rm -f couch_ejson_compare/couch_ejson_compare_la-couch_ejson_compare.lo -rm -f couch_js/couchjs-http.$(OBJEXT) -rm -f couch_js/couchjs-main.$(OBJEXT) -rm -f couch_js/couchjs-utf8.$(OBJEXT) -rm -f couch_js/couchjs-util.$(OBJEXT) -rm -f icu_driver/couch_icu_driver_la-couch_icu_driver.$(OBJEXT) -rm -f icu_driver/couch_icu_driver_la-couch_icu_driver.lo -rm -f spawnkillable/couchspawnkillable_win.$(OBJEXT) distclean-compile: -rm -f *.tab.c @AMDEP_TRUE@@am__include@ @am__quote@couch_ejson_compare/$(DEPDIR)/couch_ejson_compare_la-couch_ejson_compare.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@couch_js/$(DEPDIR)/couchjs-http.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@couch_js/$(DEPDIR)/couchjs-main.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@couch_js/$(DEPDIR)/couchjs-utf8.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@couch_js/$(DEPDIR)/couchjs-util.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@icu_driver/$(DEPDIR)/couch_icu_driver_la-couch_icu_driver.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@spawnkillable/$(DEPDIR)/couchspawnkillable_win.Po@am__quote@ .c.o: @am__fastdepCC_TRUE@ depbase=`echo $@ | sed 's|[^/]*$$|$(DEPDIR)/&|;s|\.o$$||'`;\ @am__fastdepCC_TRUE@ $(COMPILE) -MT $@ -MD -MP -MF $$depbase.Tpo -c -o $@ $< &&\ @am__fastdepCC_TRUE@ $(am__mv) $$depbase.Tpo $$depbase.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(COMPILE) -c -o $@ $< .c.obj: @am__fastdepCC_TRUE@ depbase=`echo $@ | sed 's|[^/]*$$|$(DEPDIR)/&|;s|\.obj$$||'`;\ @am__fastdepCC_TRUE@ $(COMPILE) -MT $@ -MD -MP -MF $$depbase.Tpo -c -o $@ `$(CYGPATH_W) '$<'` &&\ @am__fastdepCC_TRUE@ $(am__mv) $$depbase.Tpo $$depbase.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(COMPILE) -c -o $@ `$(CYGPATH_W) '$<'` .c.lo: @am__fastdepCC_TRUE@ depbase=`echo $@ | sed 's|[^/]*$$|$(DEPDIR)/&|;s|\.lo$$||'`;\ @am__fastdepCC_TRUE@ $(LTCOMPILE) -MT $@ -MD -MP -MF $$depbase.Tpo -c -o $@ $< &&\ @am__fastdepCC_TRUE@ $(am__mv) $$depbase.Tpo $$depbase.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(LTCOMPILE) -c -o $@ $< couch_ejson_compare/couch_ejson_compare_la-couch_ejson_compare.lo: couch_ejson_compare/couch_ejson_compare.c @am__fastdepCC_TRUE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(couch_ejson_compare_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT couch_ejson_compare/couch_ejson_compare_la-couch_ejson_compare.lo -MD -MP -MF couch_ejson_compare/$(DEPDIR)/couch_ejson_compare_la-couch_ejson_compare.Tpo -c -o couch_ejson_compare/couch_ejson_compare_la-couch_ejson_compare.lo `test -f 'couch_ejson_compare/couch_ejson_compare.c' || echo '$(srcdir)/'`couch_ejson_compare/couch_ejson_compare.c @am__fastdepCC_TRUE@ $(am__mv) couch_ejson_compare/$(DEPDIR)/couch_ejson_compare_la-couch_ejson_compare.Tpo couch_ejson_compare/$(DEPDIR)/couch_ejson_compare_la-couch_ejson_compare.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ source='couch_ejson_compare/couch_ejson_compare.c' object='couch_ejson_compare/couch_ejson_compare_la-couch_ejson_compare.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(couch_ejson_compare_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o couch_ejson_compare/couch_ejson_compare_la-couch_ejson_compare.lo `test -f 'couch_ejson_compare/couch_ejson_compare.c' || echo '$(srcdir)/'`couch_ejson_compare/couch_ejson_compare.c icu_driver/couch_icu_driver_la-couch_icu_driver.lo: icu_driver/couch_icu_driver.c @am__fastdepCC_TRUE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(couch_icu_driver_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT icu_driver/couch_icu_driver_la-couch_icu_driver.lo -MD -MP -MF icu_driver/$(DEPDIR)/couch_icu_driver_la-couch_icu_driver.Tpo -c -o icu_driver/couch_icu_driver_la-couch_icu_driver.lo `test -f 'icu_driver/couch_icu_driver.c' || echo '$(srcdir)/'`icu_driver/couch_icu_driver.c @am__fastdepCC_TRUE@ $(am__mv) icu_driver/$(DEPDIR)/couch_icu_driver_la-couch_icu_driver.Tpo icu_driver/$(DEPDIR)/couch_icu_driver_la-couch_icu_driver.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ source='icu_driver/couch_icu_driver.c' object='icu_driver/couch_icu_driver_la-couch_icu_driver.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(couch_icu_driver_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o icu_driver/couch_icu_driver_la-couch_icu_driver.lo `test -f 'icu_driver/couch_icu_driver.c' || echo '$(srcdir)/'`icu_driver/couch_icu_driver.c couch_js/couchjs-http.o: couch_js/http.c @am__fastdepCC_TRUE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(couchjs_CFLAGS) $(CFLAGS) -MT couch_js/couchjs-http.o -MD -MP -MF couch_js/$(DEPDIR)/couchjs-http.Tpo -c -o couch_js/couchjs-http.o `test -f 'couch_js/http.c' || echo '$(srcdir)/'`couch_js/http.c @am__fastdepCC_TRUE@ $(am__mv) couch_js/$(DEPDIR)/couchjs-http.Tpo couch_js/$(DEPDIR)/couchjs-http.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ source='couch_js/http.c' object='couch_js/couchjs-http.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(couchjs_CFLAGS) $(CFLAGS) -c -o couch_js/couchjs-http.o `test -f 'couch_js/http.c' || echo '$(srcdir)/'`couch_js/http.c couch_js/couchjs-http.obj: couch_js/http.c @am__fastdepCC_TRUE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(couchjs_CFLAGS) $(CFLAGS) -MT couch_js/couchjs-http.obj -MD -MP -MF couch_js/$(DEPDIR)/couchjs-http.Tpo -c -o couch_js/couchjs-http.obj `if test -f 'couch_js/http.c'; then $(CYGPATH_W) 'couch_js/http.c'; else $(CYGPATH_W) '$(srcdir)/couch_js/http.c'; fi` @am__fastdepCC_TRUE@ $(am__mv) couch_js/$(DEPDIR)/couchjs-http.Tpo couch_js/$(DEPDIR)/couchjs-http.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ source='couch_js/http.c' object='couch_js/couchjs-http.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(couchjs_CFLAGS) $(CFLAGS) -c -o couch_js/couchjs-http.obj `if test -f 'couch_js/http.c'; then $(CYGPATH_W) 'couch_js/http.c'; else $(CYGPATH_W) '$(srcdir)/couch_js/http.c'; fi` couch_js/couchjs-main.o: couch_js/main.c @am__fastdepCC_TRUE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(couchjs_CFLAGS) $(CFLAGS) -MT couch_js/couchjs-main.o -MD -MP -MF couch_js/$(DEPDIR)/couchjs-main.Tpo -c -o couch_js/couchjs-main.o `test -f 'couch_js/main.c' || echo '$(srcdir)/'`couch_js/main.c @am__fastdepCC_TRUE@ $(am__mv) couch_js/$(DEPDIR)/couchjs-main.Tpo couch_js/$(DEPDIR)/couchjs-main.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ source='couch_js/main.c' object='couch_js/couchjs-main.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(couchjs_CFLAGS) $(CFLAGS) -c -o couch_js/couchjs-main.o `test -f 'couch_js/main.c' || echo '$(srcdir)/'`couch_js/main.c couch_js/couchjs-main.obj: couch_js/main.c @am__fastdepCC_TRUE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(couchjs_CFLAGS) $(CFLAGS) -MT couch_js/couchjs-main.obj -MD -MP -MF couch_js/$(DEPDIR)/couchjs-main.Tpo -c -o couch_js/couchjs-main.obj `if test -f 'couch_js/main.c'; then $(CYGPATH_W) 'couch_js/main.c'; else $(CYGPATH_W) '$(srcdir)/couch_js/main.c'; fi` @am__fastdepCC_TRUE@ $(am__mv) couch_js/$(DEPDIR)/couchjs-main.Tpo couch_js/$(DEPDIR)/couchjs-main.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ source='couch_js/main.c' object='couch_js/couchjs-main.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(couchjs_CFLAGS) $(CFLAGS) -c -o couch_js/couchjs-main.obj `if test -f 'couch_js/main.c'; then $(CYGPATH_W) 'couch_js/main.c'; else $(CYGPATH_W) '$(srcdir)/couch_js/main.c'; fi` couch_js/couchjs-utf8.o: couch_js/utf8.c @am__fastdepCC_TRUE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(couchjs_CFLAGS) $(CFLAGS) -MT couch_js/couchjs-utf8.o -MD -MP -MF couch_js/$(DEPDIR)/couchjs-utf8.Tpo -c -o couch_js/couchjs-utf8.o `test -f 'couch_js/utf8.c' || echo '$(srcdir)/'`couch_js/utf8.c @am__fastdepCC_TRUE@ $(am__mv) couch_js/$(DEPDIR)/couchjs-utf8.Tpo couch_js/$(DEPDIR)/couchjs-utf8.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ source='couch_js/utf8.c' object='couch_js/couchjs-utf8.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(couchjs_CFLAGS) $(CFLAGS) -c -o couch_js/couchjs-utf8.o `test -f 'couch_js/utf8.c' || echo '$(srcdir)/'`couch_js/utf8.c couch_js/couchjs-utf8.obj: couch_js/utf8.c @am__fastdepCC_TRUE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(couchjs_CFLAGS) $(CFLAGS) -MT couch_js/couchjs-utf8.obj -MD -MP -MF couch_js/$(DEPDIR)/couchjs-utf8.Tpo -c -o couch_js/couchjs-utf8.obj `if test -f 'couch_js/utf8.c'; then $(CYGPATH_W) 'couch_js/utf8.c'; else $(CYGPATH_W) '$(srcdir)/couch_js/utf8.c'; fi` @am__fastdepCC_TRUE@ $(am__mv) couch_js/$(DEPDIR)/couchjs-utf8.Tpo couch_js/$(DEPDIR)/couchjs-utf8.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ source='couch_js/utf8.c' object='couch_js/couchjs-utf8.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(couchjs_CFLAGS) $(CFLAGS) -c -o couch_js/couchjs-utf8.obj `if test -f 'couch_js/utf8.c'; then $(CYGPATH_W) 'couch_js/utf8.c'; else $(CYGPATH_W) '$(srcdir)/couch_js/utf8.c'; fi` couch_js/couchjs-util.o: couch_js/util.c @am__fastdepCC_TRUE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(couchjs_CFLAGS) $(CFLAGS) -MT couch_js/couchjs-util.o -MD -MP -MF couch_js/$(DEPDIR)/couchjs-util.Tpo -c -o couch_js/couchjs-util.o `test -f 'couch_js/util.c' || echo '$(srcdir)/'`couch_js/util.c @am__fastdepCC_TRUE@ $(am__mv) couch_js/$(DEPDIR)/couchjs-util.Tpo couch_js/$(DEPDIR)/couchjs-util.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ source='couch_js/util.c' object='couch_js/couchjs-util.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(couchjs_CFLAGS) $(CFLAGS) -c -o couch_js/couchjs-util.o `test -f 'couch_js/util.c' || echo '$(srcdir)/'`couch_js/util.c couch_js/couchjs-util.obj: couch_js/util.c @am__fastdepCC_TRUE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(couchjs_CFLAGS) $(CFLAGS) -MT couch_js/couchjs-util.obj -MD -MP -MF couch_js/$(DEPDIR)/couchjs-util.Tpo -c -o couch_js/couchjs-util.obj `if test -f 'couch_js/util.c'; then $(CYGPATH_W) 'couch_js/util.c'; else $(CYGPATH_W) '$(srcdir)/couch_js/util.c'; fi` @am__fastdepCC_TRUE@ $(am__mv) couch_js/$(DEPDIR)/couchjs-util.Tpo couch_js/$(DEPDIR)/couchjs-util.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ source='couch_js/util.c' object='couch_js/couchjs-util.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(couchjs_CFLAGS) $(CFLAGS) -c -o couch_js/couchjs-util.obj `if test -f 'couch_js/util.c'; then $(CYGPATH_W) 'couch_js/util.c'; else $(CYGPATH_W) '$(srcdir)/couch_js/util.c'; fi` mostlyclean-libtool: -rm -f *.lo clean-libtool: -rm -rf .libs _libs -rm -rf couch_ejson_compare/.libs couch_ejson_compare/_libs -rm -rf icu_driver/.libs icu_driver/_libs install-couchprivDATA: $(couchpriv_DATA) @$(NORMAL_INSTALL) @list='$(couchpriv_DATA)'; test -n "$(couchprivdir)" || list=; \ if test -n "$$list"; then \ echo " $(MKDIR_P) '$(DESTDIR)$(couchprivdir)'"; \ $(MKDIR_P) "$(DESTDIR)$(couchprivdir)" || 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)$(couchprivdir)'"; \ $(INSTALL_DATA) $$files "$(DESTDIR)$(couchprivdir)" || exit $$?; \ done uninstall-couchprivDATA: @$(NORMAL_UNINSTALL) @list='$(couchpriv_DATA)'; test -n "$(couchprivdir)" || list=; \ files=`for p in $$list; do echo $$p; done | sed -e 's|^.*/||'`; \ dir='$(DESTDIR)$(couchprivdir)'; $(am__uninstall_files_from_dir) ID: $(HEADERS) $(SOURCES) $(LISP) $(TAGS_FILES) list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | \ $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ END { if (nonempty) { for (i in files) print i; }; }'`; \ mkid -fID $$unique tags: TAGS TAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ $(TAGS_FILES) $(LISP) set x; \ here=`pwd`; \ list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | \ $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ END { if (nonempty) { for (i in files) print i; }; }'`; \ 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 CTAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ $(TAGS_FILES) $(LISP) list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | \ $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ END { if (nonempty) { for (i in files) print i; }; }'`; \ 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" 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: $(BUILT_SOURCES) $(MAKE) $(AM_MAKEFLAGS) check-am all-am: Makefile $(LTLIBRARIES) $(PROGRAMS) $(DATA) installdirs: for dir in "$(DESTDIR)$(couchprivlibdir)" "$(DESTDIR)$(couchprivdir)" "$(DESTDIR)$(locallibbindir)" "$(DESTDIR)$(couchprivdir)"; do \ test -z "$$dir" || $(MKDIR_P) "$$dir"; \ done install: $(BUILT_SOURCES) $(MAKE) $(AM_MAKEFLAGS) install-am install-exec: install-exec-am install-data: install-data-am uninstall: uninstall-am install-am: all-am @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am installcheck: installcheck-am install-strip: 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) -rm -f couch_ejson_compare/$(DEPDIR)/$(am__dirstamp) -rm -f couch_ejson_compare/$(am__dirstamp) -rm -f couch_js/$(DEPDIR)/$(am__dirstamp) -rm -f couch_js/$(am__dirstamp) -rm -f icu_driver/$(DEPDIR)/$(am__dirstamp) -rm -f icu_driver/$(am__dirstamp) -rm -f spawnkillable/$(DEPDIR)/$(am__dirstamp) -rm -f spawnkillable/$(am__dirstamp) maintainer-clean-generic: @echo "This command is intended for maintainers to use" @echo "it deletes files that may require special tools to rebuild." -test -z "$(BUILT_SOURCES)" || rm -f $(BUILT_SOURCES) clean: clean-am clean-am: clean-couchprivPROGRAMS clean-couchprivlibLTLIBRARIES \ clean-generic clean-libtool clean-locallibbinPROGRAMS \ mostlyclean-am distclean: distclean-am -rm -rf couch_ejson_compare/$(DEPDIR) couch_js/$(DEPDIR) icu_driver/$(DEPDIR) spawnkillable/$(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-couchprivDATA install-couchprivPROGRAMS \ install-couchprivlibLTLIBRARIES install-data-local \ install-locallibbinPROGRAMS @$(NORMAL_INSTALL) $(MAKE) $(AM_MAKEFLAGS) install-data-hook 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 couch_ejson_compare/$(DEPDIR) couch_js/$(DEPDIR) icu_driver/$(DEPDIR) spawnkillable/$(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-couchprivDATA uninstall-couchprivPROGRAMS \ uninstall-couchprivlibLTLIBRARIES uninstall-local \ uninstall-locallibbinPROGRAMS .MAKE: all check install install-am install-data-am install-strip .PHONY: CTAGS GTAGS all all-am check check-am clean \ clean-couchprivPROGRAMS clean-couchprivlibLTLIBRARIES \ clean-generic clean-libtool clean-locallibbinPROGRAMS ctags \ distclean distclean-compile distclean-generic \ distclean-libtool distclean-tags distdir dvi dvi-am html \ html-am info info-am install install-am install-couchprivDATA \ install-couchprivPROGRAMS install-couchprivlibLTLIBRARIES \ install-data install-data-am install-data-hook \ install-data-local install-dvi install-dvi-am install-exec \ install-exec-am install-html install-html-am install-info \ install-info-am install-locallibbinPROGRAMS 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 uninstall uninstall-am \ uninstall-couchprivDATA uninstall-couchprivPROGRAMS \ uninstall-couchprivlibLTLIBRARIES uninstall-local \ uninstall-locallibbinPROGRAMS # Depend on source files so distributed man pages are not rebuilt for end user. $(man_file): $(COUCHJS_SRCS) $(MAKE_SAFE) -f Makefile couchjs; \ $(top_srcdir)/build-aux/missing --run \ help2man \ --no-info \ --help-option="-h" \ --version-option="-V" \ --name="$(package_name) JavaScript interpreter" \ ./couchjs --output $@ install-data-local: if test -s $(man_file); then \ if test `cat $(man_file) | wc -l` -gt 1; then \ $(INSTALL) -d $(DESTDIR)$(man1dir); \ $(INSTALL_DATA) $(man_file) $(DESTDIR)$(man1dir)/$(man_file); \ fi \ fi %.cfg: %.cfg.in cp $< $@ @WINDOWS_FALSE@couchspawnkillable: spawnkillable/couchspawnkillable.sh @WINDOWS_FALSE@ cp $< $@ @WINDOWS_FALSE@ chmod +x $@ # libtool and automake have defeated markh. For each of our executables # we end up with 2 copies - one directly in the 'target' folder (eg, 'priv') # and another - the correct one - in .libs. The former doesn't work but is # what gets installed for 'couchspawnkillable' - but the correct one for # couchjs.exe *does* get copied. *shrug* So just clobber it with the # correct one as the last step. See bug COUCHDB-439 install-data-hook: if test -f "$(DESTDIR)$(couchprivlibdir)/couch_icu_driver"; then \ rm -f "$(DESTDIR)$(couchprivlibdir)/couch_icu_driver.so"; \ cd "$(DESTDIR)$(couchprivlibdir)" && \ $(LN_S) couch_icu_driver couch_icu_driver.so; \ fi if test -f "$(DESTDIR)$(couchprivlibdir)/couch_ejson_compare_nif"; then \ rm -f "$(DESTDIR)$(couchprivlibdir)/couch_ejson_compare_nif.so"; \ cd "$(DESTDIR)$(couchprivlibdir)" && \ $(LN_S) couch_ejson_compare_nif couch_ejson_compare_nif.so; \ fi @WINDOWS_TRUE@ $(INSTALL) $(ICU_BIN)/icuuc*.dll $(bindir) @WINDOWS_TRUE@ $(INSTALL) $(ICU_BIN)/icudt*.dll $(bindir) @WINDOWS_TRUE@ $(INSTALL) $(ICU_BIN)/icuin*.dll $(bindir) @WINDOWS_TRUE@ $(INSTALL) $(JS_LIB_BINARY) $(bindir) @WINDOWS_TRUE@ $(INSTALL) .libs/couchspawnkillable.exe \ @WINDOWS_TRUE@ "$(DESTDIR)$(couchprivdir)/couchspawnkillable.exe" uninstall-local: rm -f $(DESTDIR)$(man1dir)/$(man_file) if test -f "$(DESTDIR)$(couchprivlibdir)/couch_erl_driver"; then \ rm -f "$(DESTDIR)$(couchprivlibdir)/couch_erl_driver.so"; \ fi distcheck-hook: if test ! -s $(man_file); then \ $(top_srcdir)/build-aux/dist-error $(man_file); \ else \ if test ! `cat $(man_file) | wc -l` -gt 1; then \ $(top_srcdir)/build-aux/dist-error $(man_file); \ fi \ fi # 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: apache-couchdb-1.6.0/src/couchdb/priv/couch_js/0000755000175000001440000000000012332105603021271 5ustar00djcusers00000000000000apache-couchdb-1.6.0/src/couchdb/priv/couch_js/sm170.c0000644000175000001440000002114712332105522022311 0ustar00djcusers00000000000000// Licensed under the Apache License, Version 2.0 (the "License"); you may not // use this file except in compliance with the License. You may obtain a copy of // the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, WITHOUT // WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the // License for the specific language governing permissions and limitations under // the License. #include #include #include #include #include "http.h" #include "utf8.h" #include "util.h" #ifdef JS_THREADSAFE #define SETUP_REQUEST(cx) \ JS_SetContextThread(cx); \ JS_BeginRequest(cx); #define FINISH_REQUEST(cx) \ JS_EndRequest(cx); \ JS_ClearContextThread(cx); #else #define SETUP_REQUEST(cx) #define FINISH_REQUEST(cx) #endif static JSBool req_ctor(JSContext* cx, JSObject* obj, uintN argc, jsval* argv, jsval* rval) { return http_ctor(cx, obj); } static void req_dtor(JSContext* cx, JSObject* obj) { http_dtor(cx, obj); } static JSBool req_open(JSContext* cx, JSObject* obj, uintN argc, jsval* argv, jsval* rval) { JSBool ret = JS_FALSE; if(argc == 2) { ret = http_open(cx, obj, argv[0], argv[1], JSVAL_FALSE); } else if(argc == 3) { ret = http_open(cx, obj, argv[0], argv[1], argv[2]); } else { JS_ReportError(cx, "Invalid call to CouchHTTP.open"); } *rval = JSVAL_VOID; return ret; } static JSBool req_set_hdr(JSContext* cx, JSObject* obj, uintN argc, jsval* argv, jsval* rval) { JSBool ret = JS_FALSE; if(argc == 2) { ret = http_set_hdr(cx, obj, argv[0], argv[1]); } else { JS_ReportError(cx, "Invalid call to CouchHTTP.set_header"); } *rval = JSVAL_VOID; return ret; } static JSBool req_send(JSContext* cx, JSObject* obj, uintN argc, jsval* argv, jsval* rval) { JSBool ret = JS_FALSE; if(argc == 1) { ret = http_send(cx, obj, argv[0]); } else { JS_ReportError(cx, "Invalid call to CouchHTTP.send"); } *rval = JSVAL_VOID; return ret; } static JSBool req_status(JSContext* cx, JSObject* obj, jsval idval, jsval* rval) { int status = http_status(cx, obj); if(status < 0) return JS_FALSE; if(INT_FITS_IN_JSVAL(status)) { *rval = INT_TO_JSVAL(status); return JS_TRUE; } else { JS_ReportError(cx, "Invalid HTTP status."); return JS_FALSE; } } static JSBool base_url(JSContext *cx, JSObject* obj, jsval idval, jsval* rval) { couch_args *args = (couch_args*)JS_GetContextPrivate(cx); return http_uri(cx, obj, args, rval); } static JSBool evalcx(JSContext *cx, JSObject *obj, uintN argc, jsval *argv, jsval *rval) { JSString *str; JSObject *sandbox; JSContext *subcx; const jschar *src; size_t srclen; JSBool ret = JS_FALSE; char *name = NULL; sandbox = NULL; if(!JS_ConvertArguments(cx, argc, argv, "S / o", &str, &sandbox)) { return JS_FALSE; } subcx = JS_NewContext(JS_GetRuntime(cx), 8L * 1024L); if(!subcx) { JS_ReportOutOfMemory(cx); return JS_FALSE; } SETUP_REQUEST(subcx); src = JS_GetStringChars(str); srclen = JS_GetStringLength(str); if(!sandbox) { sandbox = JS_NewObject(subcx, NULL, NULL, NULL); if(!sandbox || !JS_InitStandardClasses(subcx, sandbox)) { goto done; } } if(argc > 2) { name = enc_string(cx, argv[2], NULL); } if(srclen == 0) { *rval = OBJECT_TO_JSVAL(sandbox); } else { JS_EvaluateUCScript(subcx, sandbox, src, srclen, name, 1, rval); } ret = JS_TRUE; done: if(name) JS_free(cx, name); FINISH_REQUEST(subcx); JS_DestroyContext(subcx); return ret; } static JSBool gc(JSContext* cx, JSObject* obj, uintN argc, jsval* argv, jsval* rval) { JS_GC(cx); *rval = JSVAL_VOID; return JS_TRUE; } static JSBool print(JSContext* cx, JSObject* obj, uintN argc, jsval* argv, jsval* rval) { couch_print(cx, argc, argv); *rval = JSVAL_VOID; return JS_TRUE; } static JSBool quit(JSContext* cx, JSObject* obj, uintN argc, jsval* argv, jsval* rval) { int exit_code = 0; JS_ConvertArguments(cx, argc, argv, "/i", &exit_code); exit(exit_code); } static JSBool readline(JSContext* cx, JSObject* obj, uintN argc, jsval* argv, jsval* rval) { JSString* line; /* GC Occasionally */ JS_MaybeGC(cx); line = couch_readline(cx, stdin); if(line == NULL) return JS_FALSE; *rval = STRING_TO_JSVAL(line); return JS_TRUE; } static JSBool seal(JSContext* cx, JSObject* obj, uintN argc, jsval* argv, jsval* rval) { JSObject *target; JSBool deep = JS_FALSE; if(!JS_ConvertArguments(cx, argc, argv, "o/b", &target, &deep)) return JS_FALSE; if(!target) { *rval = JSVAL_VOID; return JS_TRUE; } if(JS_SealObject(cx, target, deep) != JS_TRUE) return JS_FALSE; *rval = JSVAL_VOID; return JS_TRUE; } JSClass CouchHTTPClass = { "CouchHTTP", JSCLASS_HAS_PRIVATE | JSCLASS_CONSTRUCT_PROTOTYPE | JSCLASS_HAS_RESERVED_SLOTS(2), JS_PropertyStub, JS_PropertyStub, JS_PropertyStub, JS_PropertyStub, JS_EnumerateStub, JS_ResolveStub, JS_ConvertStub, req_dtor, JSCLASS_NO_OPTIONAL_MEMBERS }; JSPropertySpec CouchHTTPProperties[] = { {"status", 0, JSPROP_READONLY, req_status, NULL}, {"base_url", 0, JSPROP_READONLY | JSPROP_SHARED, base_url, NULL}, {0, 0, 0, 0, 0} }; JSFunctionSpec CouchHTTPFunctions[] = { {"_open", req_open, 3, 0, 0}, {"_setRequestHeader", req_set_hdr, 2, 0, 0}, {"_send", req_send, 1, 0, 0}, {0, 0, 0, 0, 0} }; static JSClass global_class = { "GlobalClass", JSCLASS_GLOBAL_FLAGS, JS_PropertyStub, JS_PropertyStub, JS_PropertyStub, JS_PropertyStub, JS_EnumerateStub, JS_ResolveStub, JS_ConvertStub, JS_FinalizeStub, JSCLASS_NO_OPTIONAL_MEMBERS }; static JSFunctionSpec global_functions[] = { {"evalcx", evalcx, 0, 0, 0}, {"gc", gc, 0, 0, 0}, {"print", print, 0, 0, 0}, {"quit", quit, 0, 0, 0}, {"readline", readline, 0, 0, 0}, {"seal", seal, 0, 0, 0}, {0, 0, 0, 0, 0} }; int main(int argc, const char* argv[]) { JSRuntime* rt = NULL; JSContext* cx = NULL; JSObject* global = NULL; JSObject* klass = NULL; JSScript* script; JSString* scriptsrc; jschar* schars; size_t slen; jsval sroot; jsval result; int i; couch_args* args = couch_parse_args(argc, argv); rt = JS_NewRuntime(args->stack_size); if(rt == NULL) return 1; cx = JS_NewContext(rt, 8L * 1024L); if(cx == NULL) return 1; JS_SetErrorReporter(cx, couch_error); JS_ToggleOptions(cx, JSOPTION_XML); JS_SetContextPrivate(cx, args); SETUP_REQUEST(cx); global = JS_NewObject(cx, &global_class, NULL, NULL); if(global == NULL) return 1; JS_SetGlobalObject(cx, global); if(!JS_InitStandardClasses(cx, global)) return 1; if(couch_load_funcs(cx, global, global_functions) != JS_TRUE) return 1; if(args->use_http) { http_check_enabled(); klass = JS_InitClass( cx, global, NULL, &CouchHTTPClass, req_ctor, 0, CouchHTTPProperties, CouchHTTPFunctions, NULL, NULL ); if(!klass) { fprintf(stderr, "Failed to initialize CouchHTTP class.\n"); exit(2); } } for (i = 0 ; args->scripts[i] ; i++) { // Convert script source to jschars. scriptsrc = couch_readfile(cx, args->scripts[i]); if(!scriptsrc) return 1; schars = JS_GetStringChars(scriptsrc); slen = JS_GetStringLength(scriptsrc); // Root it so GC doesn't collect it. sroot = STRING_TO_JSVAL(scriptsrc); if(JS_AddRoot(cx, &sroot) != JS_TRUE) { fprintf(stderr, "Internal root error.\n"); return 1; } // Compile and run script = JS_CompileUCScript(cx, global, schars, slen, args->scripts[i], 1); if(!script) { fprintf(stderr, "Failed to compile script.\n"); return 1; } JS_ExecuteScript(cx, global, script, &result); // Warning message if we don't remove it. JS_RemoveRoot(cx, &sroot); } FINISH_REQUEST(cx); JS_DestroyContext(cx); JS_DestroyRuntime(rt); JS_ShutDown(); return 0; } apache-couchdb-1.6.0/src/couchdb/priv/couch_js/sm180.c0000644000175000001440000002211412332105522022305 0ustar00djcusers00000000000000// Licensed under the Apache License, Version 2.0 (the "License"); you may not // use this file except in compliance with the License. You may obtain a copy of // the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, WITHOUT // WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the // License for the specific language governing permissions and limitations under // the License. #include #include #include #include #include "http.h" #include "utf8.h" #include "util.h" #define SETUP_REQUEST(cx) \ JS_SetContextThread(cx); \ JS_BeginRequest(cx); #define FINISH_REQUEST(cx) \ JS_EndRequest(cx); \ JS_ClearContextThread(cx); static JSBool req_ctor(JSContext* cx, JSObject* obj, uintN argc, jsval* argv, jsval* rval) { return http_ctor(cx, obj); } static void req_dtor(JSContext* cx, JSObject* obj) { http_dtor(cx, obj); } static JSBool req_open(JSContext* cx, uintN argc, jsval* vp) { JSObject* obj = JS_THIS_OBJECT(cx, vp); jsval* argv = JS_ARGV(cx, vp); JSBool ret = JS_FALSE; if(argc == 2) { ret = http_open(cx, obj, argv[0], argv[1], JSVAL_FALSE); } else if(argc == 3) { ret = http_open(cx, obj, argv[0], argv[1], argv[2]); } else { JS_ReportError(cx, "Invalid call to CouchHTTP.open"); } JS_SET_RVAL(cx, vp, JSVAL_VOID); return ret; } static JSBool req_set_hdr(JSContext* cx, uintN argc, jsval* vp) { JSObject* obj = JS_THIS_OBJECT(cx, vp); jsval* argv = JS_ARGV(cx, vp); JSBool ret = JS_FALSE; if(argc == 2) { ret = http_set_hdr(cx, obj, argv[0], argv[1]); } else { JS_ReportError(cx, "Invalid call to CouchHTTP.set_header"); } JS_SET_RVAL(cx, vp, JSVAL_VOID); return ret; } static JSBool req_send(JSContext* cx, uintN argc, jsval* vp) { JSObject* obj = JS_THIS_OBJECT(cx, vp); jsval* argv = JS_ARGV(cx, vp); JSBool ret = JS_FALSE; if(argc == 1) { ret = http_send(cx, obj, argv[0]); } else { JS_ReportError(cx, "Invalid call to CouchHTTP.send"); } JS_SET_RVAL(cx, vp, JSVAL_VOID); return ret; } static JSBool req_status(JSContext* cx, JSObject* obj, jsval idval, jsval* vp) { int status = http_status(cx, obj); if(status < 0) return JS_FALSE; if(INT_FITS_IN_JSVAL(status)) { JS_SET_RVAL(cx, vp, INT_TO_JSVAL(status)); return JS_TRUE; } else { JS_ReportError(cx, "Invalid HTTP status."); return JS_FALSE; } } static JSBool base_url(JSContext *cx, JSObject* obj, jsid pid, jsval* vp) { couch_args *args = (couch_args*)JS_GetContextPrivate(cx); return http_uri(cx, obj, args, &JS_RVAL(cx, vp)); } static JSBool evalcx(JSContext *cx, uintN argc, jsval* vp) { jsval* argv = JS_ARGV(cx, vp); JSString *str; JSObject *sandbox; JSContext *subcx; const jschar *src; size_t srclen; jsval rval; JSBool ret = JS_FALSE; char *name = NULL; sandbox = NULL; if(!JS_ConvertArguments(cx, argc, argv, "S / o", &str, &sandbox)) { return JS_FALSE; } subcx = JS_NewContext(JS_GetRuntime(cx), 8L * 1024L); if(!subcx) { JS_ReportOutOfMemory(cx); return JS_FALSE; } SETUP_REQUEST(subcx); src = JS_GetStringChars(str); srclen = JS_GetStringLength(str); if(!sandbox) { sandbox = JS_NewObject(subcx, NULL, NULL, NULL); if(!sandbox || !JS_InitStandardClasses(subcx, sandbox)) { goto done; } } if(argc > 2) { name = enc_string(cx, argv[2], NULL); } if(srclen == 0) { JS_SET_RVAL(cx, vp, OBJECT_TO_JSVAL(sandbox)); } else { JS_EvaluateUCScript(subcx, sandbox, src, srclen, name, 1, &rval); JS_SET_RVAL(cx, vp, rval); } ret = JS_TRUE; done: if(name) JS_free(cx, name); FINISH_REQUEST(subcx); JS_DestroyContext(subcx); return ret; } static JSBool gc(JSContext* cx, uintN argc, jsval* vp) { JS_GC(cx); JS_SET_RVAL(cx, vp, JSVAL_VOID); return JS_TRUE; } static JSBool print(JSContext* cx, uintN argc, jsval* vp) { jsval* argv = JS_ARGV(cx, vp); couch_print(cx, argc, argv); JS_SET_RVAL(cx, vp, JSVAL_VOID); return JS_TRUE; } static JSBool quit(JSContext* cx, uintN argc, jsval* vp) { jsval* argv = JS_ARGV(cx, vp); int exit_code = 0; JS_ConvertArguments(cx, argc, argv, "/i", &exit_code); exit(exit_code); } static JSBool readline(JSContext* cx, uintN argc, jsval* vp) { JSString* line; /* GC Occasionally */ JS_MaybeGC(cx); line = couch_readline(cx, stdin); if(line == NULL) return JS_FALSE; JS_SET_RVAL(cx, vp, STRING_TO_JSVAL(line)); return JS_TRUE; } static JSBool seal(JSContext* cx, uintN argc, jsval* vp) { jsval* argv = JS_ARGV(cx, vp); JSObject *target; JSBool deep = JS_FALSE; if(!JS_ConvertArguments(cx, argc, argv, "o/b", &target, &deep)) return JS_FALSE; if(!target) { JS_SET_RVAL(cx, vp, JSVAL_VOID); return JS_TRUE; } if(JS_SealObject(cx, target, deep) != JS_TRUE) return JS_FALSE; JS_SET_RVAL(cx, vp, JSVAL_VOID); return JS_TRUE; } JSClass CouchHTTPClass = { "CouchHTTP", JSCLASS_HAS_PRIVATE | JSCLASS_CONSTRUCT_PROTOTYPE | JSCLASS_HAS_RESERVED_SLOTS(2), JS_PropertyStub, JS_PropertyStub, JS_PropertyStub, JS_PropertyStub, JS_EnumerateStub, JS_ResolveStub, JS_ConvertStub, req_dtor, JSCLASS_NO_OPTIONAL_MEMBERS }; JSPropertySpec CouchHTTPProperties[] = { {"status", 0, JSPROP_READONLY, req_status, NULL}, {"base_url", 0, JSPROP_READONLY | JSPROP_SHARED, base_url, NULL}, {0, 0, 0, 0, 0} }; JSFunctionSpec CouchHTTPFunctions[] = { JS_FS("_open", (JSNative) req_open, 3, JSFUN_FAST_NATIVE, 0), JS_FS("_setRequestHeader", (JSNative) req_set_hdr, 2, JSFUN_FAST_NATIVE, 0), JS_FS("_send", (JSNative) req_send, 1, JSFUN_FAST_NATIVE, 0), JS_FS_END }; static JSClass global_class = { "GlobalClass", JSCLASS_GLOBAL_FLAGS, JS_PropertyStub, JS_PropertyStub, JS_PropertyStub, JS_PropertyStub, JS_EnumerateStub, JS_ResolveStub, JS_ConvertStub, JS_FinalizeStub, JSCLASS_NO_OPTIONAL_MEMBERS }; static JSFunctionSpec global_functions[] = { JS_FS("evalcx", (JSNative) evalcx, 0, JSFUN_FAST_NATIVE, 0), JS_FS("gc", (JSNative) gc, 0, JSFUN_FAST_NATIVE, 0), JS_FS("print", (JSNative) print, 0, JSFUN_FAST_NATIVE, 0), JS_FS("quit", (JSNative) quit, 0, JSFUN_FAST_NATIVE, 0), JS_FS("readline", (JSNative) readline, 0, JSFUN_FAST_NATIVE, 0), JS_FS("seal", (JSNative) seal, 0, JSFUN_FAST_NATIVE, 0), JS_FS_END }; int main(int argc, const char* argv[]) { JSRuntime* rt = NULL; JSContext* cx = NULL; JSObject* global = NULL; JSObject* klass = NULL; JSScript* script; JSString* scriptsrc; jschar* schars; size_t slen; jsval sroot; jsval result; int i; couch_args* args = couch_parse_args(argc, argv); rt = JS_NewRuntime(args->stack_size); if(rt == NULL) return 1; cx = JS_NewContext(rt, 8L * 1024L); if(cx == NULL) return 1; JS_SetErrorReporter(cx, couch_error); JS_ToggleOptions(cx, JSOPTION_XML); JS_SetContextPrivate(cx, args); SETUP_REQUEST(cx); global = JS_NewObject(cx, &global_class, NULL, NULL); if(global == NULL) return 1; JS_SetGlobalObject(cx, global); if(!JS_InitStandardClasses(cx, global)) return 1; if(couch_load_funcs(cx, global, global_functions) != JS_TRUE) return 1; if(args->use_http) { http_check_enabled(); klass = JS_InitClass( cx, global, NULL, &CouchHTTPClass, req_ctor, 0, CouchHTTPProperties, CouchHTTPFunctions, NULL, NULL ); if(!klass) { fprintf(stderr, "Failed to initialize CouchHTTP class.\n"); exit(2); } } for (i = 0 ; args->scripts[i] ; i++) { // Convert script source to jschars. scriptsrc = couch_readfile(cx, args->scripts[i]); if(!scriptsrc) return 1; schars = JS_GetStringChars(scriptsrc); slen = JS_GetStringLength(scriptsrc); // Root it so GC doesn't collect it. sroot = STRING_TO_JSVAL(scriptsrc); if(JS_AddRoot(cx, &sroot) != JS_TRUE) { fprintf(stderr, "Internal root error.\n"); return 1; } // Compile and run script = JS_CompileUCScript(cx, global, schars, slen, args->scripts[i], 1); if(!script) { fprintf(stderr, "Failed to compile script.\n"); return 1; } JS_ExecuteScript(cx, global, script, &result); // Warning message if we don't remove it. JS_RemoveRoot(cx, &sroot); } FINISH_REQUEST(cx); JS_DestroyContext(cx); JS_DestroyRuntime(rt); JS_ShutDown(); return 0; } apache-couchdb-1.6.0/src/couchdb/priv/couch_js/sm185.c0000644000175000001440000002326412332105522022321 0ustar00djcusers00000000000000// Licensed under the Apache License, Version 2.0 (the "License"); you may not // use this file except in compliance with the License. You may obtain a copy of // the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, WITHOUT // WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the // License for the specific language governing permissions and limitations under // the License. #include #include #include #include #include "http.h" #include "utf8.h" #include "util.h" #define SETUP_REQUEST(cx) \ JS_SetContextThread(cx); \ JS_BeginRequest(cx); #define FINISH_REQUEST(cx) \ JS_EndRequest(cx); \ JS_ClearContextThread(cx); static JSClass global_class = { "GlobalClass", JSCLASS_GLOBAL_FLAGS, JS_PropertyStub, JS_PropertyStub, JS_PropertyStub, JS_StrictPropertyStub, JS_EnumerateStub, JS_ResolveStub, JS_ConvertStub, JS_FinalizeStub, JSCLASS_NO_OPTIONAL_MEMBERS }; static JSBool req_ctor(JSContext* cx, uintN argc, jsval* vp) { JSBool ret; JSObject* obj = JS_NewObjectForConstructor(cx, vp); if(!obj) { JS_ReportError(cx, "Failed to create CouchHTTP instance.\n"); return JS_FALSE; } ret = http_ctor(cx, obj); JS_SET_RVAL(cx, vp, OBJECT_TO_JSVAL(obj)); return ret; } static void req_dtor(JSContext* cx, JSObject* obj) { http_dtor(cx, obj); } static JSBool req_open(JSContext* cx, uintN argc, jsval* vp) { JSObject* obj = JS_THIS_OBJECT(cx, vp); jsval* argv = JS_ARGV(cx, vp); JSBool ret = JS_FALSE; if(argc == 2) { ret = http_open(cx, obj, argv[0], argv[1], JSVAL_FALSE); } else if(argc == 3) { ret = http_open(cx, obj, argv[0], argv[1], argv[2]); } else { JS_ReportError(cx, "Invalid call to CouchHTTP.open"); } JS_SET_RVAL(cx, vp, JSVAL_VOID); return ret; } static JSBool req_set_hdr(JSContext* cx, uintN argc, jsval* vp) { JSObject* obj = JS_THIS_OBJECT(cx, vp); jsval* argv = JS_ARGV(cx, vp); JSBool ret = JS_FALSE; if(argc == 2) { ret = http_set_hdr(cx, obj, argv[0], argv[1]); } else { JS_ReportError(cx, "Invalid call to CouchHTTP.set_header"); } JS_SET_RVAL(cx, vp, JSVAL_VOID); return ret; } static JSBool req_send(JSContext* cx, uintN argc, jsval* vp) { JSObject* obj = JS_THIS_OBJECT(cx, vp); jsval* argv = JS_ARGV(cx, vp); JSBool ret = JS_FALSE; if(argc == 1) { ret = http_send(cx, obj, argv[0]); } else { JS_ReportError(cx, "Invalid call to CouchHTTP.send"); } JS_SET_RVAL(cx, vp, JSVAL_VOID); return ret; } static JSBool req_status(JSContext* cx, JSObject* obj, jsid pid, jsval* vp) { int status = http_status(cx, obj); if(status < 0) return JS_FALSE; JS_SET_RVAL(cx, vp, INT_TO_JSVAL(status)); return JS_TRUE; } static JSBool base_url(JSContext *cx, JSObject* obj, jsid pid, jsval* vp) { couch_args *args = (couch_args*)JS_GetContextPrivate(cx); return http_uri(cx, obj, args, &JS_RVAL(cx, vp)); } static JSBool evalcx(JSContext *cx, uintN argc, jsval* vp) { jsval* argv = JS_ARGV(cx, vp); JSString* str; JSObject* sandbox; JSObject* global; JSContext* subcx; JSCrossCompartmentCall* call = NULL; const jschar* src; size_t srclen; jsval rval; JSBool ret = JS_FALSE; char *name = NULL; sandbox = NULL; if(!JS_ConvertArguments(cx, argc, argv, "S / o", &str, &sandbox)) { return JS_FALSE; } subcx = JS_NewContext(JS_GetRuntime(cx), 8L * 1024L); if(!subcx) { JS_ReportOutOfMemory(cx); return JS_FALSE; } SETUP_REQUEST(subcx); src = JS_GetStringCharsAndLength(cx, str, &srclen); // Re-use the compartment associated with the main context, // rather than creating a new compartment */ global = JS_GetGlobalObject(cx); if(global == NULL) goto done; call = JS_EnterCrossCompartmentCall(subcx, global); if(!sandbox) { sandbox = JS_NewGlobalObject(subcx, &global_class); if(!sandbox || !JS_InitStandardClasses(subcx, sandbox)) { goto done; } } if(argc > 2) { name = enc_string(cx, argv[2], NULL); } if(srclen == 0) { JS_SET_RVAL(cx, vp, OBJECT_TO_JSVAL(sandbox)); } else { JS_EvaluateUCScript(subcx, sandbox, src, srclen, name, 1, &rval); JS_SET_RVAL(cx, vp, rval); } ret = JS_TRUE; done: if(name) JS_free(cx, name); JS_LeaveCrossCompartmentCall(call); FINISH_REQUEST(subcx); JS_DestroyContext(subcx); return ret; } static JSBool gc(JSContext* cx, uintN argc, jsval* vp) { JS_GC(cx); JS_SET_RVAL(cx, vp, JSVAL_VOID); return JS_TRUE; } static JSBool print(JSContext* cx, uintN argc, jsval* vp) { jsval* argv = JS_ARGV(cx, vp); couch_print(cx, argc, argv); JS_SET_RVAL(cx, vp, JSVAL_VOID); return JS_TRUE; } static JSBool quit(JSContext* cx, uintN argc, jsval* vp) { jsval* argv = JS_ARGV(cx, vp); int exit_code = 0; JS_ConvertArguments(cx, argc, argv, "/i", &exit_code); exit(exit_code); } static JSBool readline(JSContext* cx, uintN argc, jsval* vp) { JSString* line; /* GC Occasionally */ JS_MaybeGC(cx); line = couch_readline(cx, stdin); if(line == NULL) return JS_FALSE; JS_SET_RVAL(cx, vp, STRING_TO_JSVAL(line)); return JS_TRUE; } static JSBool seal(JSContext* cx, uintN argc, jsval* vp) { jsval* argv = JS_ARGV(cx, vp); JSObject *target; JSBool deep = JS_FALSE; JSBool ret; if(!JS_ConvertArguments(cx, argc, argv, "o/b", &target, &deep)) return JS_FALSE; if(!target) { JS_SET_RVAL(cx, vp, JSVAL_VOID); return JS_TRUE; } ret = deep ? JS_DeepFreezeObject(cx, target) : JS_FreezeObject(cx, target); JS_SET_RVAL(cx, vp, JSVAL_VOID); return ret; } JSClass CouchHTTPClass = { "CouchHTTP", JSCLASS_HAS_PRIVATE | JSCLASS_CONSTRUCT_PROTOTYPE | JSCLASS_HAS_RESERVED_SLOTS(2), JS_PropertyStub, JS_PropertyStub, JS_PropertyStub, JS_StrictPropertyStub, JS_EnumerateStub, JS_ResolveStub, JS_ConvertStub, req_dtor, JSCLASS_NO_OPTIONAL_MEMBERS }; JSPropertySpec CouchHTTPProperties[] = { {"status", 0, JSPROP_READONLY, req_status, NULL}, {"base_url", 0, JSPROP_READONLY | JSPROP_SHARED, base_url, NULL}, {0, 0, 0, 0, 0} }; JSFunctionSpec CouchHTTPFunctions[] = { JS_FS("_open", req_open, 3, 0), JS_FS("_setRequestHeader", req_set_hdr, 2, 0), JS_FS("_send", req_send, 1, 0), JS_FS_END }; static JSFunctionSpec global_functions[] = { JS_FS("evalcx", evalcx, 0, 0), JS_FS("gc", gc, 0, 0), JS_FS("print", print, 0, 0), JS_FS("quit", quit, 0, 0), JS_FS("readline", readline, 0, 0), JS_FS("seal", seal, 0, 0), JS_FS_END }; int main(int argc, const char* argv[]) { JSRuntime* rt = NULL; JSContext* cx = NULL; JSObject* global = NULL; JSCrossCompartmentCall *call = NULL; JSObject* klass = NULL; JSSCRIPT_TYPE script; JSString* scriptsrc; const jschar* schars; size_t slen; jsval sroot; jsval result; int i; couch_args* args = couch_parse_args(argc, argv); rt = JS_NewRuntime(args->stack_size); if(rt == NULL) return 1; cx = JS_NewContext(rt, 8L * 1024L); if(cx == NULL) return 1; JS_SetErrorReporter(cx, couch_error); JS_ToggleOptions(cx, JSOPTION_XML); JS_SetOptions(cx, JSOPTION_METHODJIT); #ifdef JSOPTION_TYPE_INFERENCE JS_SetOptions(cx, JSOPTION_TYPE_INFERENCE); #endif JS_SetContextPrivate(cx, args); SETUP_REQUEST(cx); global = JS_NewCompartmentAndGlobalObject(cx, &global_class, NULL); if(global == NULL) return 1; call = JS_EnterCrossCompartmentCall(cx, global); JS_SetGlobalObject(cx, global); if(!JS_InitStandardClasses(cx, global)) return 1; if(couch_load_funcs(cx, global, global_functions) != JS_TRUE) return 1; if(args->use_http) { http_check_enabled(); klass = JS_InitClass( cx, global, NULL, &CouchHTTPClass, req_ctor, 0, CouchHTTPProperties, CouchHTTPFunctions, NULL, NULL ); if(!klass) { fprintf(stderr, "Failed to initialize CouchHTTP class.\n"); exit(2); } } for(i = 0 ; args->scripts[i] ; i++) { // Convert script source to jschars. scriptsrc = couch_readfile(cx, args->scripts[i]); if(!scriptsrc) return 1; schars = JS_GetStringCharsAndLength(cx, scriptsrc, &slen); // Root it so GC doesn't collect it. sroot = STRING_TO_JSVAL(scriptsrc); if(JS_AddValueRoot(cx, &sroot) != JS_TRUE) { fprintf(stderr, "Internal root error.\n"); return 1; } // Compile and run script = JS_CompileUCScript(cx, global, schars, slen, args->scripts[i], 1); if(!script) { fprintf(stderr, "Failed to compile script.\n"); return 1; } if(JS_ExecuteScript(cx, global, script, &result) != JS_TRUE) { fprintf(stderr, "Failed to execute script.\n"); return 1; } // Warning message if we don't remove it. JS_RemoveValueRoot(cx, &sroot); // Give the GC a chance to run. JS_MaybeGC(cx); } JS_LeaveCrossCompartmentCall(call); FINISH_REQUEST(cx); JS_DestroyContext(cx); JS_DestroyRuntime(rt); JS_ShutDown(); return 0; } apache-couchdb-1.6.0/src/couchdb/priv/couch_js/help.h0000644000175000001440000000552212332105522022376 0ustar00djcusers00000000000000// Licensed under the Apache License, Version 2.0 (the "License"); you may not // use this file except in compliance with the License. You may obtain a copy of // the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, WITHOUT // WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the // License for the specific language governing permissions and limitations under // the License. #ifndef COUCHJS_HELP_H #define COUCHJS_HELP_H #include "config.h" static const char VERSION_TEMPLATE[] = "%s - %s\n" "\n" "Licensed under the Apache License, Version 2.0 (the \"License\"); you may " "not use\n" "this file except in compliance with the License. You may obtain a copy of" "the\n" "License at\n" "\n" " http://www.apache.org/licenses/LICENSE-2.0\n" "\n" "Unless required by applicable law or agreed to in writing, software " "distributed\n" "under the License is distributed on an \"AS IS\" BASIS, WITHOUT " "WARRANTIES OR\n" "CONDITIONS OF ANY KIND, either express or implied. See the License " "for the\n" "specific language governing permissions and limitations under the " "License.\n"; static const char USAGE_TEMPLATE[] = "Usage: %s [FILE]\n" "\n" "The %s command runs the %s JavaScript interpreter.\n" "\n" "The exit status is 0 for success or 1 for failure.\n" "\n" "Options:\n" "\n" " -h display a short help message and exit\n" " -V display version information and exit\n" " -H enable %s cURL bindings (only avaiable\n" " if package was built with cURL available)\n" " -S SIZE specify that the runtime should allow at\n" " most SIZE bytes of memory to be allocated\n" " -u FILE path to a .uri file containing the address\n" " (or addresses) of one or more servers\n" "\n" "Report bugs at <%s>.\n"; #define BASENAME COUCHJS_NAME #define couch_version(basename) \ fprintf( \ stdout, \ VERSION_TEMPLATE, \ basename, \ PACKAGE_STRING) #define DISPLAY_VERSION couch_version(BASENAME) #define couch_usage(basename) \ fprintf( \ stdout, \ USAGE_TEMPLATE, \ basename, \ basename, \ PACKAGE_NAME, \ basename, \ PACKAGE_BUGREPORT) #define DISPLAY_USAGE couch_usage(BASENAME) #endif // Included help.h apache-couchdb-1.6.0/src/couchdb/priv/couch_js/http.c0000644000175000001440000004100212332105522022411 0ustar00djcusers00000000000000// Licensed under the Apache License, Version 2.0 (the "License"); you may not // use this file except in compliance with the License. You may obtain a copy of // the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, WITHOUT // WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the // License for the specific language governing permissions and limitations under // the License. #include #include #include #include #include #include #include "config.h" #include "utf8.h" #include "util.h" // Soft dependency on cURL bindings because they're // only used when running the JS tests from the // command line which is rare. #ifndef HAVE_CURL void http_check_enabled() { fprintf(stderr, "HTTP API was disabled at compile time.\n"); exit(3); } JSBool http_ctor(JSContext* cx, JSObject* req) { return JS_FALSE; } JSBool http_dtor(JSContext* cx, JSObject* req) { return JS_FALSE; } JSBool http_open(JSContext* cx, JSObject* req, jsval mth, jsval url, jsval snc) { return JS_FALSE; } JSBool http_set_hdr(JSContext* cx, JSObject* req, jsval name, jsval val) { return JS_FALSE; } JSBool http_send(JSContext* cx, JSObject* req, jsval body) { return JS_FALSE; } int http_status(JSContext* cx, JSObject* req, jsval body) { return -1; } JSBool http_uri(JSContext* cx, JSObject* req, couch_args* args, jsval* uri_val) { return JS_FALSE; } #else #include #include void http_check_enabled() { return; } // Map some of the string function names to things which exist on Windows #ifdef XP_WIN #define strcasecmp _strcmpi #define strncasecmp _strnicmp #define snprintf _snprintf #endif typedef struct curl_slist CurlHeaders; typedef struct { int method; char* url; CurlHeaders* req_headers; jsint last_status; } HTTPData; char* METHODS[] = {"GET", "HEAD", "POST", "PUT", "DELETE", "COPY", "OPTIONS", NULL}; #define GET 0 #define HEAD 1 #define POST 2 #define PUT 3 #define DELETE 4 #define COPY 5 #define OPTIONS 6 static JSBool go(JSContext* cx, JSObject* obj, HTTPData* http, char* body, size_t blen); static JSString* str_from_binary(JSContext* cx, char* data, size_t length); JSBool http_ctor(JSContext* cx, JSObject* req) { HTTPData* http = NULL; JSBool ret = JS_FALSE; http = (HTTPData*) malloc(sizeof(HTTPData)); if(!http) { JS_ReportError(cx, "Failed to create CouchHTTP instance."); goto error; } http->method = -1; http->url = NULL; http->req_headers = NULL; http->last_status = -1; if(!JS_SetPrivate(cx, req, http)) { JS_ReportError(cx, "Failed to set private CouchHTTP data."); goto error; } ret = JS_TRUE; goto success; error: if(http) free(http); success: return ret; } void http_dtor(JSContext* cx, JSObject* obj) { HTTPData* http = (HTTPData*) JS_GetPrivate(cx, obj); if(http) { if(http->url) free(http->url); if(http->req_headers) curl_slist_free_all(http->req_headers); free(http); } } JSBool http_open(JSContext* cx, JSObject* req, jsval mth, jsval url, jsval snc) { HTTPData* http = (HTTPData*) JS_GetPrivate(cx, req); char* method = NULL; int methid; JSBool ret = JS_FALSE; if(!http) { JS_ReportError(cx, "Invalid CouchHTTP instance."); goto done; } if(JSVAL_IS_VOID(mth)) { JS_ReportError(cx, "You must specify a method."); goto done; } method = enc_string(cx, mth, NULL); if(!method) { JS_ReportError(cx, "Failed to encode method."); goto done; } for(methid = 0; METHODS[methid] != NULL; methid++) { if(strcasecmp(METHODS[methid], method) == 0) break; } if(methid > OPTIONS) { JS_ReportError(cx, "Invalid method specified."); goto done; } http->method = methid; if(JSVAL_IS_VOID(url)) { JS_ReportError(cx, "You must specify a URL."); goto done; } if(http->url != NULL) { free(http->url); http->url = NULL; } http->url = enc_string(cx, url, NULL); if(http->url == NULL) { JS_ReportError(cx, "Failed to encode URL."); goto done; } if(JSVAL_IS_BOOLEAN(snc) && JSVAL_TO_BOOLEAN(snc)) { JS_ReportError(cx, "Synchronous flag must be false."); goto done; } if(http->req_headers) { curl_slist_free_all(http->req_headers); http->req_headers = NULL; } // Disable Expect: 100-continue http->req_headers = curl_slist_append(http->req_headers, "Expect:"); ret = JS_TRUE; done: if(method) free(method); return ret; } JSBool http_set_hdr(JSContext* cx, JSObject* req, jsval name, jsval val) { HTTPData* http = (HTTPData*) JS_GetPrivate(cx, req); char* keystr = NULL; char* valstr = NULL; char* hdrbuf = NULL; size_t hdrlen = -1; JSBool ret = JS_FALSE; if(!http) { JS_ReportError(cx, "Invalid CouchHTTP instance."); goto done; } if(JSVAL_IS_VOID(name)) { JS_ReportError(cx, "You must speciy a header name."); goto done; } keystr = enc_string(cx, name, NULL); if(!keystr) { JS_ReportError(cx, "Failed to encode header name."); goto done; } if(JSVAL_IS_VOID(val)) { JS_ReportError(cx, "You must specify a header value."); goto done; } valstr = enc_string(cx, val, NULL); if(!valstr) { JS_ReportError(cx, "Failed to encode header value."); goto done; } hdrlen = strlen(keystr) + strlen(valstr) + 3; hdrbuf = (char*) malloc(hdrlen * sizeof(char)); if(!hdrbuf) { JS_ReportError(cx, "Failed to allocate header buffer."); goto done; } snprintf(hdrbuf, hdrlen, "%s: %s", keystr, valstr); http->req_headers = curl_slist_append(http->req_headers, hdrbuf); ret = JS_TRUE; done: if(keystr) free(keystr); if(valstr) free(valstr); if(hdrbuf) free(hdrbuf); return ret; } JSBool http_send(JSContext* cx, JSObject* req, jsval body) { HTTPData* http = (HTTPData*) JS_GetPrivate(cx, req); char* bodystr = NULL; size_t bodylen = 0; JSBool ret = JS_FALSE; if(!http) { JS_ReportError(cx, "Invalid CouchHTTP instance."); goto done; } if(!JSVAL_IS_VOID(body)) { bodystr = enc_string(cx, body, &bodylen); if(!bodystr) { JS_ReportError(cx, "Failed to encode body."); goto done; } } ret = go(cx, req, http, bodystr, bodylen); done: if(bodystr) free(bodystr); return ret; } int http_status(JSContext* cx, JSObject* req) { HTTPData* http = (HTTPData*) JS_GetPrivate(cx, req); if(!http) { JS_ReportError(cx, "Invalid CouchHTTP instance."); return JS_FALSE; } return http->last_status; } JSBool http_uri(JSContext* cx, JSObject* req, couch_args* args, jsval* uri_val) { FILE* uri_fp = NULL; JSString* uri_str; // Default is http://localhost:5984/ when no uri file is specified if (!args->uri_file) { uri_str = JS_InternString(cx, "http://localhost:5984/"); *uri_val = STRING_TO_JSVAL(uri_str); return JS_TRUE; } // Else check to see if the base url is cached in a reserved slot if (JS_GetReservedSlot(cx, req, 0, uri_val) && !JSVAL_IS_VOID(*uri_val)) { return JS_TRUE; } // Read the first line of the couch.uri file. if(!((uri_fp = fopen(args->uri_file, "r")) && (uri_str = couch_readline(cx, uri_fp)))) { JS_ReportError(cx, "Failed to read couch.uri file."); goto error; } fclose(uri_fp); *uri_val = STRING_TO_JSVAL(uri_str); JS_SetReservedSlot(cx, req, 0, *uri_val); return JS_TRUE; error: if(uri_fp) fclose(uri_fp); return JS_FALSE; } // Curl Helpers typedef struct { HTTPData* http; JSContext* cx; JSObject* resp_headers; char* sendbuf; size_t sendlen; size_t sent; int sent_once; char* recvbuf; size_t recvlen; size_t read; } CurlState; /* * I really hate doing this but this doesn't have to be * uber awesome, it just has to work. */ CURL* HTTP_HANDLE = NULL; char ERRBUF[CURL_ERROR_SIZE]; static size_t send_body(void *ptr, size_t size, size_t nmem, void *data); static int seek_body(void *ptr, curl_off_t offset, int origin); static size_t recv_body(void *ptr, size_t size, size_t nmem, void *data); static size_t recv_header(void *ptr, size_t size, size_t nmem, void *data); static JSBool go(JSContext* cx, JSObject* obj, HTTPData* http, char* body, size_t bodylen) { CurlState state; char* referer; JSString* jsbody; JSBool ret = JS_FALSE; jsval tmp; state.cx = cx; state.http = http; state.sendbuf = body; state.sendlen = bodylen; state.sent = 0; state.sent_once = 0; state.recvbuf = NULL; state.recvlen = 0; state.read = 0; if(HTTP_HANDLE == NULL) { HTTP_HANDLE = curl_easy_init(); curl_easy_setopt(HTTP_HANDLE, CURLOPT_READFUNCTION, send_body); curl_easy_setopt(HTTP_HANDLE, CURLOPT_SEEKFUNCTION, (curl_seek_callback) seek_body); curl_easy_setopt(HTTP_HANDLE, CURLOPT_HEADERFUNCTION, recv_header); curl_easy_setopt(HTTP_HANDLE, CURLOPT_WRITEFUNCTION, recv_body); curl_easy_setopt(HTTP_HANDLE, CURLOPT_NOPROGRESS, 1); curl_easy_setopt(HTTP_HANDLE, CURLOPT_IPRESOLVE, CURL_IPRESOLVE_V4); curl_easy_setopt(HTTP_HANDLE, CURLOPT_ERRORBUFFER, ERRBUF); curl_easy_setopt(HTTP_HANDLE, CURLOPT_COOKIEFILE, ""); curl_easy_setopt(HTTP_HANDLE, CURLOPT_USERAGENT, "CouchHTTP Client - Relax"); } if(!HTTP_HANDLE) { JS_ReportError(cx, "Failed to initialize cURL handle."); goto done; } if(!JS_GetReservedSlot(cx, obj, 0, &tmp)) { JS_ReportError(cx, "Failed to readreserved slot."); goto done; } if(!(referer = enc_string(cx, tmp, NULL))) { JS_ReportError(cx, "Failed to encode referer."); goto done; } curl_easy_setopt(HTTP_HANDLE, CURLOPT_REFERER, referer); free(referer); if(http->method < 0 || http->method > OPTIONS) { JS_ReportError(cx, "INTERNAL: Unknown method."); goto done; } curl_easy_setopt(HTTP_HANDLE, CURLOPT_CUSTOMREQUEST, METHODS[http->method]); curl_easy_setopt(HTTP_HANDLE, CURLOPT_NOBODY, 0); curl_easy_setopt(HTTP_HANDLE, CURLOPT_FOLLOWLOCATION, 1); curl_easy_setopt(HTTP_HANDLE, CURLOPT_UPLOAD, 0); if(http->method == HEAD) { curl_easy_setopt(HTTP_HANDLE, CURLOPT_NOBODY, 1); curl_easy_setopt(HTTP_HANDLE, CURLOPT_FOLLOWLOCATION, 0); } else if(http->method == POST || http->method == PUT) { curl_easy_setopt(HTTP_HANDLE, CURLOPT_UPLOAD, 1); curl_easy_setopt(HTTP_HANDLE, CURLOPT_FOLLOWLOCATION, 0); } if(body && bodylen) { curl_easy_setopt(HTTP_HANDLE, CURLOPT_INFILESIZE, bodylen); } else { curl_easy_setopt(HTTP_HANDLE, CURLOPT_INFILESIZE, 0); } // curl_easy_setopt(HTTP_HANDLE, CURLOPT_VERBOSE, 1); curl_easy_setopt(HTTP_HANDLE, CURLOPT_URL, http->url); curl_easy_setopt(HTTP_HANDLE, CURLOPT_HTTPHEADER, http->req_headers); curl_easy_setopt(HTTP_HANDLE, CURLOPT_READDATA, &state); curl_easy_setopt(HTTP_HANDLE, CURLOPT_SEEKDATA, &state); curl_easy_setopt(HTTP_HANDLE, CURLOPT_WRITEHEADER, &state); curl_easy_setopt(HTTP_HANDLE, CURLOPT_WRITEDATA, &state); if(curl_easy_perform(HTTP_HANDLE) != 0) { JS_ReportError(cx, "Failed to execute HTTP request: %s", ERRBUF); goto done; } if(!state.resp_headers) { JS_ReportError(cx, "Failed to recieve HTTP headers."); goto done; } tmp = OBJECT_TO_JSVAL(state.resp_headers); if(!JS_DefineProperty( cx, obj, "_headers", tmp, NULL, NULL, JSPROP_READONLY )) { JS_ReportError(cx, "INTERNAL: Failed to set response headers."); goto done; } if(state.recvbuf) { state.recvbuf[state.read] = '\0'; jsbody = dec_string(cx, state.recvbuf, state.read+1); if(!jsbody) { // If we can't decode the body as UTF-8 we forcefully // convert it to a string by just forcing each byte // to a jschar. jsbody = str_from_binary(cx, state.recvbuf, state.read); if(!jsbody) { if(!JS_IsExceptionPending(cx)) { JS_ReportError(cx, "INTERNAL: Failed to decode body."); } goto done; } } tmp = STRING_TO_JSVAL(jsbody); } else { tmp = JS_GetEmptyStringValue(cx); } if(!JS_DefineProperty( cx, obj, "responseText", tmp, NULL, NULL, JSPROP_READONLY )) { JS_ReportError(cx, "INTERNAL: Failed to set responseText."); goto done; } ret = JS_TRUE; done: if(state.recvbuf) JS_free(cx, state.recvbuf); return ret; } static size_t send_body(void *ptr, size_t size, size_t nmem, void *data) { CurlState* state = (CurlState*) data; size_t length = size * nmem; size_t towrite = state->sendlen - state->sent; // Assume this is cURL trying to resend a request that // failed. if(towrite == 0 && state->sent_once == 0) { state->sent_once = 1; return 0; } else if(towrite == 0) { state->sent = 0; state->sent_once = 0; towrite = state->sendlen; } if(length < towrite) towrite = length; memcpy(ptr, state->sendbuf + state->sent, towrite); state->sent += towrite; return towrite; } static int seek_body(void* ptr, curl_off_t offset, int origin) { CurlState* state = (CurlState*) ptr; if(origin != SEEK_SET) return -1; state->sent = (size_t) offset; return (int) state->sent; } static size_t recv_header(void *ptr, size_t size, size_t nmem, void *data) { CurlState* state = (CurlState*) data; char code[4]; char* header = (char*) ptr; size_t length = size * nmem; JSString* hdr = NULL; jsuint hdrlen; jsval hdrval; if(length > 7 && strncasecmp(header, "HTTP/1.", 7) == 0) { if(length < 12) { return CURLE_WRITE_ERROR; } memcpy(code, header+9, 3*sizeof(char)); code[3] = '\0'; state->http->last_status = atoi(code); state->resp_headers = JS_NewArrayObject(state->cx, 0, NULL); if(!state->resp_headers) { return CURLE_WRITE_ERROR; } return length; } // We get a notice at the \r\n\r\n after headers. if(length <= 2) { return length; } // Append the new header to our array. hdr = dec_string(state->cx, header, length); if(!hdr) { return CURLE_WRITE_ERROR; } if(!JS_GetArrayLength(state->cx, state->resp_headers, &hdrlen)) { return CURLE_WRITE_ERROR; } hdrval = STRING_TO_JSVAL(hdr); if(!JS_SetElement(state->cx, state->resp_headers, hdrlen, &hdrval)) { return CURLE_WRITE_ERROR; } return length; } static size_t recv_body(void *ptr, size_t size, size_t nmem, void *data) { CurlState* state = (CurlState*) data; size_t length = size * nmem; char* tmp = NULL; if(!state->recvbuf) { state->recvlen = 4096; state->read = 0; state->recvbuf = JS_malloc(state->cx, state->recvlen); } if(!state->recvbuf) { return CURLE_WRITE_ERROR; } // +1 so we can add '\0' back up in the go function. while(length+1 > state->recvlen - state->read) state->recvlen *= 2; tmp = JS_realloc(state->cx, state->recvbuf, state->recvlen); if(!tmp) return CURLE_WRITE_ERROR; state->recvbuf = tmp; memcpy(state->recvbuf + state->read, ptr, length); state->read += length; return length; } JSString* str_from_binary(JSContext* cx, char* data, size_t length) { jschar* conv = (jschar*) JS_malloc(cx, length * sizeof(jschar)); JSString* ret = NULL; size_t i; if(!conv) return NULL; for(i = 0; i < length; i++) { conv[i] = (jschar) data[i]; } ret = JS_NewUCString(cx, conv, length); if(!ret) JS_free(cx, conv); return ret; } #endif /* HAVE_CURL */ apache-couchdb-1.6.0/src/couchdb/priv/couch_js/http.h0000644000175000001440000000210212332105522022414 0ustar00djcusers00000000000000// Licensed under the Apache License, Version 2.0 (the "License"); you may not // use this file except in compliance with the License. You may obtain a copy of // the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, WITHOUT // WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the // License for the specific language governing permissions and limitations under // the License. #ifndef COUCH_JS_HTTP_H #define COUCH_JS_HTTP_H #include "util.h" void http_check_enabled(); JSBool http_ctor(JSContext* cx, JSObject* req); void http_dtor(JSContext* cx, JSObject* req); JSBool http_open(JSContext* cx, JSObject* req, jsval mth, jsval url, jsval snc); JSBool http_set_hdr(JSContext* cx, JSObject* req, jsval name, jsval val); JSBool http_send(JSContext* cx, JSObject* req, jsval body); int http_status(JSContext* cx, JSObject* req); JSBool http_uri(JSContext* cx, JSObject *req, couch_args* args, jsval* uri); #endif apache-couchdb-1.6.0/src/couchdb/priv/couch_js/main.c0000644000175000001440000000125512332105522022364 0ustar00djcusers00000000000000// Licensed under the Apache License, Version 2.0 (the "License"); you may not // use this file except in compliance with the License. You may obtain a copy of // the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, WITHOUT // WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the // License for the specific language governing permissions and limitations under // the License. #include "config.h" #if defined(SM185) #include "sm185.c" #elif defined(SM180) #include "sm180.c" #else #include "sm170.c" #endif apache-couchdb-1.6.0/src/couchdb/priv/couch_js/utf8.c0000644000175000001440000001516112332105522022327 0ustar00djcusers00000000000000// Licensed under the Apache License, Version 2.0 (the "License"); you may not // use this file except in compliance with the License. You may obtain a copy of // the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, WITHOUT // WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the // License for the specific language governing permissions and limitations under // the License. #include #include "config.h" static int enc_char(uint8 *utf8Buffer, uint32 ucs4Char) { int utf8Length = 1; if (ucs4Char < 0x80) { *utf8Buffer = (uint8)ucs4Char; } else { int i; uint32 a = ucs4Char >> 11; utf8Length = 2; while(a) { a >>= 5; utf8Length++; } i = utf8Length; while(--i) { utf8Buffer[i] = (uint8)((ucs4Char & 0x3F) | 0x80); ucs4Char >>= 6; } *utf8Buffer = (uint8)(0x100 - (1 << (8-utf8Length)) + ucs4Char); } return utf8Length; } static JSBool enc_charbuf(const jschar* src, size_t srclen, char* dst, size_t* dstlenp) { size_t i; size_t utf8Len; size_t dstlen = *dstlenp; size_t origDstlen = dstlen; jschar c; jschar c2; uint32 v; uint8 utf8buf[6]; if(!dst) { dstlen = origDstlen = (size_t) -1; } while(srclen) { c = *src++; srclen--; if(c <= 0xD7FF || c >= 0xE000) { v = (uint32) c; } else if(c >= 0xD800 && c <= 0xDBFF) { if(srclen < 1) goto buffer_too_small; c2 = *src++; srclen--; if(c2 >= 0xDC00 && c2 <= 0xDFFF) { v = (uint32) (((c - 0xD800) << 10) + (c2 - 0xDC00) + 0x10000); } else { // Invalid second half of surrogate pair v = (uint32) 0xFFFD; } } else { // Invalid first half surrogate pair v = (uint32) 0xFFFD; } if(v < 0x0080) { /* no encoding necessary - performance hack */ if(!dstlen) goto buffer_too_small; if(dst) *dst++ = (char) v; utf8Len = 1; } else { utf8Len = enc_char(utf8buf, v); if(utf8Len > dstlen) goto buffer_too_small; if(dst) { for (i = 0; i < utf8Len; i++) { *dst++ = (char) utf8buf[i]; } } } dstlen -= utf8Len; } *dstlenp = (origDstlen - dstlen); return JS_TRUE; buffer_too_small: *dstlenp = (origDstlen - dstlen); return JS_FALSE; } char* enc_string(JSContext* cx, jsval arg, size_t* buflen) { JSString* str = NULL; const jschar* src = NULL; char* bytes = NULL; size_t srclen = 0; size_t byteslen = 0; str = JS_ValueToString(cx, arg); if(!str) goto error; #ifdef HAVE_JS_GET_STRING_CHARS_AND_LENGTH src = JS_GetStringCharsAndLength(cx, str, &srclen); #else src = JS_GetStringChars(str); srclen = JS_GetStringLength(str); #endif if(!enc_charbuf(src, srclen, NULL, &byteslen)) goto error; bytes = JS_malloc(cx, (byteslen) + 1); bytes[byteslen] = 0; if(!enc_charbuf(src, srclen, bytes, &byteslen)) goto error; if(buflen) *buflen = byteslen; goto success; error: if(bytes != NULL) JS_free(cx, bytes); bytes = NULL; success: return bytes; } static uint32 dec_char(const uint8 *utf8Buffer, int utf8Length) { uint32 ucs4Char; uint32 minucs4Char; /* from Unicode 3.1, non-shortest form is illegal */ static const uint32 minucs4Table[] = { 0x00000080, 0x00000800, 0x0001000, 0x0020000, 0x0400000 }; if (utf8Length == 1) { ucs4Char = *utf8Buffer; } else { ucs4Char = *utf8Buffer++ & ((1<<(7-utf8Length))-1); minucs4Char = minucs4Table[utf8Length-2]; while(--utf8Length) { ucs4Char = ucs4Char<<6 | (*utf8Buffer++ & 0x3F); } if(ucs4Char < minucs4Char || ucs4Char == 0xFFFE || ucs4Char == 0xFFFF) { ucs4Char = 0xFFFD; } } return ucs4Char; } static JSBool dec_charbuf(const char *src, size_t srclen, jschar *dst, size_t *dstlenp) { uint32 v; size_t offset = 0; size_t j; size_t n; size_t dstlen = *dstlenp; size_t origDstlen = dstlen; if(!dst) dstlen = origDstlen = (size_t) -1; while(srclen) { v = (uint8) *src; n = 1; if(v & 0x80) { while(v & (0x80 >> n)) { n++; } if(n > srclen) goto buffer_too_small; if(n == 1 || n > 6) goto bad_character; for(j = 1; j < n; j++) { if((src[j] & 0xC0) != 0x80) goto bad_character; } v = dec_char((const uint8 *) src, n); if(v >= 0x10000) { v -= 0x10000; if(v > 0xFFFFF || dstlen < 2) { *dstlenp = (origDstlen - dstlen); return JS_FALSE; } if(dstlen < 2) goto buffer_too_small; if(dst) { *dst++ = (jschar)((v >> 10) + 0xD800); v = (jschar)((v & 0x3FF) + 0xDC00); } dstlen--; } } if(!dstlen) goto buffer_too_small; if(dst) *dst++ = (jschar) v; dstlen--; offset += n; src += n; srclen -= n; } *dstlenp = (origDstlen - dstlen); return JS_TRUE; bad_character: *dstlenp = (origDstlen - dstlen); return JS_FALSE; buffer_too_small: *dstlenp = (origDstlen - dstlen); return JS_FALSE; } JSString* dec_string(JSContext* cx, const char* bytes, size_t byteslen) { JSString* str = NULL; jschar* chars = NULL; size_t charslen; if(!dec_charbuf(bytes, byteslen, NULL, &charslen)) goto error; chars = JS_malloc(cx, (charslen + 1) * sizeof(jschar)); if(!chars) return NULL; chars[charslen] = 0; if(!dec_charbuf(bytes, byteslen, chars, &charslen)) goto error; str = JS_NewUCString(cx, chars, charslen - 1); if(!str) goto error; goto success; error: if(chars != NULL) JS_free(cx, chars); str = NULL; success: return str; } apache-couchdb-1.6.0/src/couchdb/priv/couch_js/utf8.h0000644000175000001440000000134612332105522022334 0ustar00djcusers00000000000000// Licensed under the Apache License, Version 2.0 (the "License"); you may not // use this file except in compliance with the License. You may obtain a copy of // the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, WITHOUT // WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the // License for the specific language governing permissions and limitations under // the License. #ifndef COUCH_JS_UTF_8_H #define COUCH_JS_UTF_8_H char* enc_string(JSContext* cx, jsval arg, size_t* buflen); JSString* dec_string(JSContext* cx, const char* buf, size_t buflen); #endif apache-couchdb-1.6.0/src/couchdb/priv/couch_js/util.c0000644000175000001440000001635212332105522022421 0ustar00djcusers00000000000000// Licensed under the Apache License, Version 2.0 (the "License"); you may not // use this file except in compliance with the License. You may obtain a copy of // the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, WITHOUT // WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the // License for the specific language governing permissions and limitations under // the License. #include #include #include #include "help.h" #include "util.h" #include "utf8.h" size_t slurp_file(const char* file, char** outbuf_p) { FILE* fp; char fbuf[16384]; char *buf = NULL; char* tmp; size_t nread = 0; size_t buflen = 0; if(strcmp(file, "-") == 0) { fp = stdin; } else { fp = fopen(file, "r"); if(fp == NULL) { fprintf(stderr, "Failed to read file: %s\n", file); exit(3); } } while((nread = fread(fbuf, 1, 16384, fp)) > 0) { if(buf == NULL) { buf = (char*) malloc(nread + 1); if(buf == NULL) { fprintf(stderr, "Out of memory.\n"); exit(3); } memcpy(buf, fbuf, nread); } else { tmp = (char*) malloc(buflen + nread + 1); if(tmp == NULL) { fprintf(stderr, "Out of memory.\n"); exit(3); } memcpy(tmp, buf, buflen); memcpy(tmp+buflen, fbuf, nread); free(buf); buf = tmp; } buflen += nread; buf[buflen] = '\0'; } *outbuf_p = buf; return buflen + 1; } couch_args* couch_parse_args(int argc, const char* argv[]) { couch_args* args; int i = 1; args = (couch_args*) malloc(sizeof(couch_args)); if(args == NULL) return NULL; memset(args, '\0', sizeof(couch_args)); args->stack_size = 64L * 1024L * 1024L; while(i < argc) { if(strcmp("-h", argv[i]) == 0) { DISPLAY_USAGE; exit(0); } else if(strcmp("-V", argv[i]) == 0) { DISPLAY_VERSION; exit(0); } else if(strcmp("-H", argv[i]) == 0) { args->use_http = 1; } else if(strcmp("-S", argv[i]) == 0) { args->stack_size = atoi(argv[++i]); if(args->stack_size <= 0) { fprintf(stderr, "Invalid stack size.\n"); exit(2); } } else if(strcmp("-u", argv[i]) == 0) { args->uri_file = argv[++i]; } else if(strcmp("--", argv[i]) == 0) { i++; break; } else { break; } i++; } if(i >= argc) { DISPLAY_USAGE; exit(3); } args->scripts = argv + i; return args; } int couch_fgets(char* buf, int size, FILE* fp) { int n, i, c; if(size <= 0) return -1; n = size - 1; for(i = 0; i < n && (c = getc(fp)) != EOF; i++) { buf[i] = c; if(c == '\n') { i++; break; } } buf[i] = '\0'; return i; } JSString* couch_readline(JSContext* cx, FILE* fp) { JSString* str; char* bytes = NULL; char* tmp = NULL; size_t used = 0; size_t byteslen = 256; size_t readlen = 0; bytes = JS_malloc(cx, byteslen); if(bytes == NULL) return NULL; while((readlen = couch_fgets(bytes+used, byteslen-used, fp)) > 0) { used += readlen; if(bytes[used-1] == '\n') { bytes[used-1] = '\0'; break; } // Double our buffer and read more. byteslen *= 2; tmp = JS_realloc(cx, bytes, byteslen); if(!tmp) { JS_free(cx, bytes); return NULL; } bytes = tmp; } // Treat empty strings specially if(used == 0) { JS_free(cx, bytes); return JSVAL_TO_STRING(JS_GetEmptyStringValue(cx)); } // Shring the buffer to the actual data size tmp = JS_realloc(cx, bytes, used); if(!tmp) { JS_free(cx, bytes); return NULL; } bytes = tmp; byteslen = used; str = dec_string(cx, bytes, byteslen); JS_free(cx, bytes); return str; } JSString* couch_readfile(JSContext* cx, const char* filename) { JSString *string; size_t byteslen; char *bytes; if((byteslen = slurp_file(filename, &bytes))) { string = dec_string(cx, bytes, byteslen); free(bytes); return string; } return NULL; } void couch_print(JSContext* cx, uintN argc, jsval* argv) { char *bytes = NULL; FILE *stream = stdout; if (argc) { if (argc > 1 && argv[1] == JSVAL_TRUE) { stream = stderr; } bytes = enc_string(cx, argv[0], NULL); if(!bytes) return; fprintf(stream, "%s", bytes); JS_free(cx, bytes); } fputc('\n', stream); fflush(stream); } void couch_error(JSContext* cx, const char* mesg, JSErrorReport* report) { jsval v, replace; char* bytes; JSObject* regexp, *stack; jsval re_args[2]; if(!report || !JSREPORT_IS_WARNING(report->flags)) { fprintf(stderr, "%s\n", mesg); // Print a stack trace, if available. if (JSREPORT_IS_EXCEPTION(report->flags) && JS_GetPendingException(cx, &v)) { // Clear the exception before an JS method calls or the result is // infinite, recursive error report generation. JS_ClearPendingException(cx); // Use JS regexp to indent the stack trace. // If the regexp can't be created, don't JS_ReportError since it is // probably not productive to wind up here again. #ifdef SM185 if(JS_GetProperty(cx, JSVAL_TO_OBJECT(v), "stack", &v) && (regexp = JS_NewRegExpObjectNoStatics( cx, "^(?=.)", 6, JSREG_GLOB | JSREG_MULTILINE))) #else if(JS_GetProperty(cx, JSVAL_TO_OBJECT(v), "stack", &v) && (regexp = JS_NewRegExpObject( cx, "^(?=.)", 6, JSREG_GLOB | JSREG_MULTILINE))) #endif { // Set up the arguments to ``String.replace()`` re_args[0] = OBJECT_TO_JSVAL(regexp); re_args[1] = STRING_TO_JSVAL(JS_InternString(cx, "\t")); // Perform the replacement if(JS_ValueToObject(cx, v, &stack) && JS_GetProperty(cx, stack, "replace", &replace) && JS_CallFunctionValue(cx, stack, replace, 2, re_args, &v)) { // Print the result bytes = enc_string(cx, v, NULL); fprintf(stderr, "Stacktrace:\n%s", bytes); JS_free(cx, bytes); } } } } } JSBool couch_load_funcs(JSContext* cx, JSObject* obj, JSFunctionSpec* funcs) { JSFunctionSpec* f; for(f = funcs; f->name != NULL; f++) { if(!JS_DefineFunction(cx, obj, f->name, f->call, f->nargs, f->flags)) { fprintf(stderr, "Failed to create function: %s\n", f->name); return JS_FALSE; } } return JS_TRUE; } apache-couchdb-1.6.0/src/couchdb/priv/couch_js/util.h0000644000175000001440000000233412332105522022421 0ustar00djcusers00000000000000// Licensed under the Apache License, Version 2.0 (the "License"); you may not // use this file except in compliance with the License. You may obtain a copy of // the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, WITHOUT // WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the // License for the specific language governing permissions and limitations under // the License. #ifndef COUCHJS_UTIL_H #define COUCHJS_UTIL_H #include typedef struct { int use_http; int stack_size; const char** scripts; const char* uri_file; JSString* uri; } couch_args; couch_args* couch_parse_args(int argc, const char* argv[]); int couch_fgets(char* buf, int size, FILE* fp); JSString* couch_readline(JSContext* cx, FILE* fp); JSString* couch_readfile(JSContext* cx, const char* filename); void couch_print(JSContext* cx, uintN argc, jsval* argv); void couch_error(JSContext* cx, const char* mesg, JSErrorReport* report); JSBool couch_load_funcs(JSContext* cx, JSObject* obj, JSFunctionSpec* funcs); #endif // Included util.h apache-couchdb-1.6.0/src/couchdb/couch_server.erl0000644000175000001440000004222412332105522021713 0ustar00djcusers00000000000000% Licensed under the Apache License, Version 2.0 (the "License"); you may not % use this file except in compliance with the License. You may obtain a copy of % the License at % % http://www.apache.org/licenses/LICENSE-2.0 % % Unless required by applicable law or agreed to in writing, software % distributed under the License is distributed on an "AS IS" BASIS, WITHOUT % WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the % License for the specific language governing permissions and limitations under % the License. -module(couch_server). -behaviour(gen_server). -export([open/2,create/2,delete/2,get_version/0,get_version/1,get_uuid/0]). -export([all_databases/0, all_databases/2]). -export([init/1, handle_call/3,sup_start_link/0]). -export([handle_cast/2,code_change/3,handle_info/2,terminate/2]). -export([dev_start/0,is_admin/2,has_admins/0,get_stats/0]). -include("couch_db.hrl"). -record(server,{ root_dir = [], dbname_regexp, max_dbs_open=100, dbs_open=0, start_time="" }). dev_start() -> couch:stop(), up_to_date = make:all([load, debug_info]), couch:start(). get_version() -> Apps = application:loaded_applications(), case lists:keysearch(couch, 1, Apps) of {value, {_, _, Vsn}} -> Vsn; false -> "0.0.0" end. get_version(short) -> %% strip git hash from version string [Version|_Rest] = string:tokens(get_version(), "+"), Version. get_uuid() -> case couch_config:get("couchdb", "uuid", nil) of nil -> UUID = couch_uuids:random(), couch_config:set("couchdb", "uuid", ?b2l(UUID)), UUID; UUID -> ?l2b(UUID) end. get_stats() -> {ok, #server{start_time=Time,dbs_open=Open}} = gen_server:call(couch_server, get_server), [{start_time, ?l2b(Time)}, {dbs_open, Open}]. sup_start_link() -> gen_server:start_link({local, couch_server}, couch_server, [], []). open(DbName, Options0) -> Options = maybe_add_sys_db_callbacks(DbName, Options0), case gen_server:call(couch_server, {open, DbName, Options}, infinity) of {ok, Db} -> Ctx = couch_util:get_value(user_ctx, Options, #user_ctx{}), {ok, Db#db{user_ctx=Ctx}}; Error -> Error end. create(DbName, Options0) -> Options = maybe_add_sys_db_callbacks(DbName, Options0), case gen_server:call(couch_server, {create, DbName, Options}, infinity) of {ok, Db} -> Ctx = couch_util:get_value(user_ctx, Options, #user_ctx{}), {ok, Db#db{user_ctx=Ctx}}; Error -> Error end. delete(DbName, Options) -> gen_server:call(couch_server, {delete, DbName, Options}, infinity). maybe_add_sys_db_callbacks(DbName, Options) when is_binary(DbName) -> maybe_add_sys_db_callbacks(?b2l(DbName), Options); maybe_add_sys_db_callbacks(DbName, Options) -> case couch_config:get("replicator", "db", "_replicator") of DbName -> [ {before_doc_update, fun couch_replicator_manager:before_doc_update/2}, {after_doc_read, fun couch_replicator_manager:after_doc_read/2}, sys_db | Options ]; _ -> case couch_config:get("couch_httpd_auth", "authentication_db", "_users") of DbName -> [ {before_doc_update, fun couch_users_db:before_doc_update/2}, {after_doc_read, fun couch_users_db:after_doc_read/2}, sys_db | Options ]; _ -> Options end end. check_dbname(#server{dbname_regexp=RegExp}, DbName) -> case re:run(DbName, RegExp, [{capture, none}]) of nomatch -> case DbName of "_users" -> ok; "_replicator" -> ok; _Else -> {error, illegal_database_name, DbName} end; match -> ok end. is_admin(User, ClearPwd) -> case couch_config:get("admins", User) of "-hashed-" ++ HashedPwdAndSalt -> [HashedPwd, Salt] = string:tokens(HashedPwdAndSalt, ","), couch_util:to_hex(crypto:sha(ClearPwd ++ Salt)) == HashedPwd; _Else -> false end. has_admins() -> couch_config:get("admins") /= []. get_full_filename(Server, DbName) -> filename:join([Server#server.root_dir, "./" ++ DbName ++ ".couch"]). hash_admin_passwords() -> hash_admin_passwords(true). hash_admin_passwords(Persist) -> lists:foreach( fun({User, ClearPassword}) -> HashedPassword = couch_passwords:hash_admin_password(ClearPassword), couch_config:set("admins", User, ?b2l(HashedPassword), Persist) end, couch_passwords:get_unhashed_admins()). init([]) -> % read config and register for configuration changes % just stop if one of the config settings change. couch_server_sup % will restart us and then we will pick up the new settings. RootDir = couch_config:get("couchdb", "database_dir", "."), MaxDbsOpen = list_to_integer( couch_config:get("couchdb", "max_dbs_open")), Self = self(), ok = couch_config:register( fun("couchdb", "database_dir") -> exit(Self, config_change) end), ok = couch_config:register( fun("couchdb", "max_dbs_open", Max) -> gen_server:call(couch_server, {set_max_dbs_open, list_to_integer(Max)}) end), ok = couch_file:init_delete_dir(RootDir), hash_admin_passwords(), ok = couch_config:register( fun("admins", _Key, _Value, Persist) -> % spawn here so couch_config doesn't try to call itself spawn(fun() -> hash_admin_passwords(Persist) end) end, false), {ok, RegExp} = re:compile("^[a-z][a-z0-9\\_\\$()\\+\\-\\/]*$"), ets:new(couch_dbs_by_name, [set, private, named_table]), ets:new(couch_dbs_by_pid, [set, private, named_table]), ets:new(couch_dbs_by_lru, [ordered_set, private, named_table]), ets:new(couch_sys_dbs, [set, private, named_table]), process_flag(trap_exit, true), {ok, #server{root_dir=RootDir, dbname_regexp=RegExp, max_dbs_open=MaxDbsOpen, start_time=couch_util:rfc1123_date()}}. terminate(_Reason, _Srv) -> lists:foreach( fun({_, {_, Pid, _}}) -> couch_util:shutdown_sync(Pid) end, ets:tab2list(couch_dbs_by_name)). all_databases() -> {ok, DbList} = all_databases( fun(DbName, Acc) -> {ok, [DbName | Acc]} end, []), {ok, lists:usort(DbList)}. all_databases(Fun, Acc0) -> {ok, #server{root_dir=Root}} = gen_server:call(couch_server, get_server), NormRoot = couch_util:normpath(Root), FinalAcc = try filelib:fold_files(Root, "^[a-z0-9\\_\\$()\\+\\-]*[\\.]couch$", true, fun(Filename, AccIn) -> NormFilename = couch_util:normpath(Filename), case NormFilename -- NormRoot of [$/ | RelativeFilename] -> ok; RelativeFilename -> ok end, case Fun(?l2b(filename:rootname(RelativeFilename, ".couch")), AccIn) of {ok, NewAcc} -> NewAcc; {stop, NewAcc} -> throw({stop, Fun, NewAcc}) end end, Acc0) catch throw:{stop, Fun, Acc1} -> Acc1 end, {ok, FinalAcc}. maybe_close_lru_db(#server{dbs_open=NumOpen, max_dbs_open=MaxOpen}=Server) when NumOpen < MaxOpen -> {ok, Server}; maybe_close_lru_db(#server{dbs_open=NumOpen}=Server) -> % must free up the lru db. case try_close_lru(now()) of ok -> {ok, Server#server{dbs_open=NumOpen - 1}}; Error -> Error end. try_close_lru(StartTime) -> LruTime = get_lru(), if LruTime > StartTime -> % this means we've looped through all our opened dbs and found them % all in use. {error, all_dbs_active}; true -> [{_, DbName}] = ets:lookup(couch_dbs_by_lru, LruTime), [{_, {opened, MainPid, LruTime}}] = ets:lookup(couch_dbs_by_name, DbName), case couch_db:is_idle(MainPid) of true -> ok = shutdown_idle_db(DbName, MainPid, LruTime); false -> % this still has referrers. Go ahead and give it a current lru time % and try the next one in the table. NewLruTime = now(), true = ets:insert(couch_dbs_by_name, {DbName, {opened, MainPid, NewLruTime}}), true = ets:insert(couch_dbs_by_pid, {MainPid, DbName}), true = ets:delete(couch_dbs_by_lru, LruTime), true = ets:insert(couch_dbs_by_lru, {NewLruTime, DbName}), try_close_lru(StartTime) end end. get_lru() -> get_lru(ets:first(couch_dbs_by_lru)). get_lru(LruTime) -> [{LruTime, DbName}] = ets:lookup(couch_dbs_by_lru, LruTime), case ets:member(couch_sys_dbs, DbName) of false -> LruTime; true -> [{_, {opened, MainPid, _}}] = ets:lookup(couch_dbs_by_name, DbName), case couch_db:is_idle(MainPid) of true -> NextLru = ets:next(couch_dbs_by_lru, LruTime), ok = shutdown_idle_db(DbName, MainPid, LruTime), get_lru(NextLru); false -> get_lru(ets:next(couch_dbs_by_lru, LruTime)) end end. shutdown_idle_db(DbName, MainPid, LruTime) -> couch_util:shutdown_sync(MainPid), true = ets:delete(couch_dbs_by_lru, LruTime), true = ets:delete(couch_dbs_by_name, DbName), true = ets:delete(couch_dbs_by_pid, MainPid), true = ets:delete(couch_sys_dbs, DbName), ok. open_async(Server, From, DbName, Filepath, Options) -> Parent = self(), Opener = spawn_link(fun() -> Res = couch_db:start_link(DbName, Filepath, Options), gen_server:call( Parent, {open_result, DbName, Res, Options}, infinity ), unlink(Parent), case Res of {ok, DbReader} -> unlink(DbReader); _ -> ok end end), true = ets:insert(couch_dbs_by_name, {DbName, {opening, Opener, [From]}}), true = ets:insert(couch_dbs_by_pid, {Opener, DbName}), DbsOpen = case lists:member(sys_db, Options) of true -> true = ets:insert(couch_sys_dbs, {DbName, true}), Server#server.dbs_open; false -> Server#server.dbs_open + 1 end, Server#server{dbs_open = DbsOpen}. handle_call({set_max_dbs_open, Max}, _From, Server) -> {reply, ok, Server#server{max_dbs_open=Max}}; handle_call(get_server, _From, Server) -> {reply, {ok, Server}, Server}; handle_call({open_result, DbName, {ok, OpenedDbPid}, Options}, _From, Server) -> link(OpenedDbPid), [{DbName, {opening,Opener,Froms}}] = ets:lookup(couch_dbs_by_name, DbName), lists:foreach(fun({FromPid,_}=From) -> gen_server:reply(From, catch couch_db:open_ref_counted(OpenedDbPid, FromPid)) end, Froms), LruTime = now(), true = ets:insert(couch_dbs_by_name, {DbName, {opened, OpenedDbPid, LruTime}}), true = ets:delete(couch_dbs_by_pid, Opener), true = ets:insert(couch_dbs_by_pid, {OpenedDbPid, DbName}), true = ets:insert(couch_dbs_by_lru, {LruTime, DbName}), case lists:member(create, Options) of true -> couch_db_update_notifier:notify({created, DbName}); false -> ok end, {reply, ok, Server}; handle_call({open_result, DbName, {error, eexist}, Options}, From, Server) -> handle_call({open_result, DbName, file_exists, Options}, From, Server); handle_call({open_result, DbName, Error, Options}, _From, Server) -> [{DbName, {opening,Opener,Froms}}] = ets:lookup(couch_dbs_by_name, DbName), lists:foreach(fun(From) -> gen_server:reply(From, Error) end, Froms), true = ets:delete(couch_dbs_by_name, DbName), true = ets:delete(couch_dbs_by_pid, Opener), DbsOpen = case lists:member(sys_db, Options) of true -> true = ets:delete(couch_sys_dbs, DbName), Server#server.dbs_open; false -> Server#server.dbs_open - 1 end, {reply, ok, Server#server{dbs_open = DbsOpen}}; handle_call({open, DbName, Options}, {FromPid,_}=From, Server) -> LruTime = now(), case ets:lookup(couch_dbs_by_name, DbName) of [] -> open_db(DbName, Server, Options, From); [{_, {opening, Opener, Froms}}] -> true = ets:insert(couch_dbs_by_name, {DbName, {opening, Opener, [From|Froms]}}), {noreply, Server}; [{_, {opened, MainPid, PrevLruTime}}] -> true = ets:insert(couch_dbs_by_name, {DbName, {opened, MainPid, LruTime}}), true = ets:delete(couch_dbs_by_lru, PrevLruTime), true = ets:insert(couch_dbs_by_lru, {LruTime, DbName}), {reply, couch_db:open_ref_counted(MainPid, FromPid), Server} end; handle_call({create, DbName, Options}, From, Server) -> case ets:lookup(couch_dbs_by_name, DbName) of [] -> open_db(DbName, Server, [create | Options], From); [_AlreadyRunningDb] -> {reply, file_exists, Server} end; handle_call({delete, DbName, _Options}, _From, Server) -> DbNameList = binary_to_list(DbName), case check_dbname(Server, DbNameList) of ok -> FullFilepath = get_full_filename(Server, DbNameList), UpdateState = case ets:lookup(couch_dbs_by_name, DbName) of [] -> false; [{_, {opening, Pid, Froms}}] -> couch_util:shutdown_sync(Pid), true = ets:delete(couch_dbs_by_name, DbName), true = ets:delete(couch_dbs_by_pid, Pid), [gen_server:reply(F, not_found) || F <- Froms], true; [{_, {opened, Pid, LruTime}}] -> couch_util:shutdown_sync(Pid), true = ets:delete(couch_dbs_by_name, DbName), true = ets:delete(couch_dbs_by_pid, Pid), true = ets:delete(couch_dbs_by_lru, LruTime), true end, Server2 = case UpdateState of true -> DbsOpen = case ets:member(couch_sys_dbs, DbName) of true -> true = ets:delete(couch_sys_dbs, DbName), Server#server.dbs_open; false -> Server#server.dbs_open - 1 end, Server#server{dbs_open = DbsOpen}; false -> Server end, %% Delete any leftover .compact files. If we don't do this a subsequent %% request for this DB will try to open the .compact file and use it. couch_file:delete(Server#server.root_dir, FullFilepath ++ ".compact"), case couch_file:delete(Server#server.root_dir, FullFilepath) of ok -> couch_db_update_notifier:notify({deleted, DbName}), {reply, ok, Server2}; {error, enoent} -> {reply, not_found, Server2}; Else -> {reply, Else, Server2} end; Error -> {reply, Error, Server} end. handle_cast(Msg, _Server) -> exit({unknown_cast_message, Msg}). code_change(_OldVsn, State, _Extra) -> {ok, State}. handle_info({'EXIT', _Pid, config_change}, Server) -> {noreply, shutdown, Server}; handle_info({'EXIT', Pid, Reason}, Server) -> Server2 = case ets:lookup(couch_dbs_by_pid, Pid) of [{Pid, DbName}] -> % If the Pid is known, the name should be as well. % If not, that's an error, which is why there is no [] clause. case ets:lookup(couch_dbs_by_name, DbName) of [{_, {opening, Pid, Froms}}] -> Msg = case Reason of snappy_nif_not_loaded -> io_lib:format( "To open the database `~s`, Apache CouchDB " "must be built with Erlang OTP R13B04 or higher.", [DbName] ); true -> io_lib:format("Error opening database ~p: ~p", [DbName, Reason]) end, ?LOG_ERROR(Msg, []), lists:foreach( fun(F) -> gen_server:reply(F, {bad_otp_release, Msg}) end, Froms ); [{_, {opened, Pid, LruTime}}] -> ?LOG_ERROR( "Unexpected exit of database process ~p [~p]: ~p", [Pid, DbName, Reason] ), true = ets:delete(couch_dbs_by_lru, LruTime) end, true = ets:delete(couch_dbs_by_pid, DbName), true = ets:delete(couch_dbs_by_name, DbName), case ets:lookup(couch_sys_dbs, DbName) of [{DbName, _}] -> true = ets:delete(couch_sys_dbs, DbName), Server; [] -> Server#server{dbs_open = Server#server.dbs_open - 1} end end, {noreply, Server2}; handle_info(Error, _Server) -> ?LOG_ERROR("Unexpected message, restarting couch_server: ~p", [Error]), exit(kill). open_db(DbName, Server, Options, From) -> DbNameList = binary_to_list(DbName), case check_dbname(Server, DbNameList) of ok -> Filepath = get_full_filename(Server, DbNameList), case lists:member(sys_db, Options) of true -> {noreply, open_async(Server, From, DbName, Filepath, Options)}; false -> case maybe_close_lru_db(Server) of {ok, Server2} -> {noreply, open_async(Server2, From, DbName, Filepath, Options)}; CloseError -> {reply, CloseError, Server} end end; Error -> {reply, Error, Server} end. apache-couchdb-1.6.0/src/couchdb/couch_js_functions.hrl0000644000175000001440000001402412332105522023111 0ustar00djcusers00000000000000% Licensed under the Apache License, Version 2.0 (the "License"); you may not % use this file except in compliance with the License. You may obtain a copy of % the License at % % http://www.apache.org/licenses/LICENSE-2.0 % % Unless required by applicable law or agreed to in writing, software % distributed under the License is distributed on an "AS IS" BASIS, WITHOUT % WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the % License for the specific language governing permissions and limitations under % the License. -define(AUTH_DB_DOC_VALIDATE_FUNCTION, <<" function(newDoc, oldDoc, userCtx, secObj) { if (newDoc._deleted === true) { // allow deletes by admins and matching users // without checking the other fields if ((userCtx.roles.indexOf('_admin') !== -1) || (userCtx.name == oldDoc.name)) { return; } else { throw({forbidden: 'Only admins may delete other user docs.'}); } } if ((oldDoc && oldDoc.type !== 'user') || newDoc.type !== 'user') { throw({forbidden : 'doc.type must be user'}); } // we only allow user docs for now if (!newDoc.name) { throw({forbidden: 'doc.name is required'}); } if (!newDoc.roles) { throw({forbidden: 'doc.roles must exist'}); } if (!isArray(newDoc.roles)) { throw({forbidden: 'doc.roles must be an array'}); } for (var idx = 0; idx < newDoc.roles.length; idx++) { if (typeof newDoc.roles[idx] !== 'string') { throw({forbidden: 'doc.roles can only contain strings'}); } } if (newDoc._id !== ('org.couchdb.user:' + newDoc.name)) { throw({ forbidden: 'Doc ID must be of the form org.couchdb.user:name' }); } if (oldDoc) { // validate all updates if (oldDoc.name !== newDoc.name) { throw({forbidden: 'Usernames can not be changed.'}); } } if (newDoc.password_sha && !newDoc.salt) { throw({ forbidden: 'Users with password_sha must have a salt.' + 'See /_utils/script/couch.js for example code.' }); } if (newDoc.password_scheme === \"pbkdf2\") { if (typeof(newDoc.iterations) !== \"number\") { throw({forbidden: \"iterations must be a number.\"}); } if (typeof(newDoc.derived_key) !== \"string\") { throw({forbidden: \"derived_key must be a string.\"}); } } var is_server_or_database_admin = function(userCtx, secObj) { // see if the user is a server admin if(userCtx.roles.indexOf('_admin') !== -1) { return true; // a server admin } // see if the user a database admin specified by name if(secObj && secObj.admins && secObj.admins.names) { if(secObj.admins.names.indexOf(userCtx.name) !== -1) { return true; // database admin } } // see if the user a database admin specified by role if(secObj && secObj.admins && secObj.admins.roles) { var db_roles = secObj.admins.roles; for(var idx = 0; idx < userCtx.roles.length; idx++) { var user_role = userCtx.roles[idx]; if(db_roles.indexOf(user_role) !== -1) { return true; // role matches! } } } return false; // default to no admin } if (!is_server_or_database_admin(userCtx, secObj)) { if (oldDoc) { // validate non-admin updates if (userCtx.name !== newDoc.name) { throw({ forbidden: 'You may only update your own user document.' }); } // validate role updates var oldRoles = oldDoc.roles.sort(); var newRoles = newDoc.roles.sort(); if (oldRoles.length !== newRoles.length) { throw({forbidden: 'Only _admin may edit roles'}); } for (var i = 0; i < oldRoles.length; i++) { if (oldRoles[i] !== newRoles[i]) { throw({forbidden: 'Only _admin may edit roles'}); } } } else if (newDoc.roles.length > 0) { throw({forbidden: 'Only _admin may set roles'}); } } // no system roles in users db for (var i = 0; i < newDoc.roles.length; i++) { if (newDoc.roles[i][0] === '_') { throw({ forbidden: 'No system roles (starting with underscore) in users db.' }); } } // no system names as names if (newDoc.name[0] === '_') { throw({forbidden: 'Username may not start with underscore.'}); } var badUserNameChars = [':']; for (var i = 0; i < badUserNameChars.length; i++) { if (newDoc.name.indexOf(badUserNameChars[i]) >= 0) { throw({forbidden: 'Character `' + badUserNameChars[i] + '` is not allowed in usernames.'}); } } } ">>). -define(OAUTH_MAP_FUN, <<" function(doc) { if (doc.type === 'user' && doc.oauth && doc.oauth.consumer_keys) { for (var consumer_key in doc.oauth.consumer_keys) { for (var token in doc.oauth.tokens) { var obj = { 'consumer_secret': doc.oauth.consumer_keys[consumer_key], 'token_secret': doc.oauth.tokens[token], 'username': doc.name }; emit([consumer_key, token], obj); } } } } ">>). apache-couchdb-1.6.0/src/couchdb/couch_external_manager.erl0000644000175000001440000000643612332105522023726 0ustar00djcusers00000000000000% Licensed under the Apache License, Version 2.0 (the "License"); you may not % use this file except in compliance with the License. You may obtain a copy of % the License at % % http://www.apache.org/licenses/LICENSE-2.0 % % Unless required by applicable law or agreed to in writing, software % distributed under the License is distributed on an "AS IS" BASIS, WITHOUT % WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the % License for the specific language governing permissions and limitations under % the License. -module(couch_external_manager). -behaviour(gen_server). -export([start_link/0, execute/2, config_change/2]). -export([init/1, terminate/2, code_change/3, handle_call/3, handle_cast/2, handle_info/2]). -include("couch_db.hrl"). start_link() -> gen_server:start_link({local, couch_external_manager}, couch_external_manager, [], []). execute(UrlName, JsonReq) -> Pid = gen_server:call(couch_external_manager, {get, UrlName}), case Pid of {error, Reason} -> Reason; _ -> couch_external_server:execute(Pid, JsonReq) end. config_change("external", UrlName) -> gen_server:call(couch_external_manager, {config, UrlName}). % gen_server API init([]) -> process_flag(trap_exit, true), Handlers = ets:new(couch_external_manager_handlers, [set, private]), couch_config:register(fun ?MODULE:config_change/2), {ok, Handlers}. terminate(_Reason, Handlers) -> ets:foldl(fun({_UrlName, Pid}, nil) -> couch_external_server:stop(Pid), nil end, nil, Handlers), ok. handle_call({get, UrlName}, _From, Handlers) -> case ets:lookup(Handlers, UrlName) of [] -> case couch_config:get("external", UrlName, nil) of nil -> Msg = lists:flatten( io_lib:format("No server configured for ~p.", [UrlName])), {reply, {error, {unknown_external_server, ?l2b(Msg)}}, Handlers}; Command -> {ok, NewPid} = couch_external_server:start_link(UrlName, Command), true = ets:insert(Handlers, {UrlName, NewPid}), {reply, NewPid, Handlers} end; [{UrlName, Pid}] -> {reply, Pid, Handlers} end; handle_call({config, UrlName}, _From, Handlers) -> % A newly added handler and a handler that had it's command % changed are treated exactly the same. % Shutdown the old handler. case ets:lookup(Handlers, UrlName) of [{UrlName, Pid}] -> couch_external_server:stop(Pid); [] -> ok end, % Wait for next request to boot the handler. {reply, ok, Handlers}. handle_cast(_Whatever, State) -> {noreply, State}. handle_info({'EXIT', Pid, normal}, Handlers) -> ?LOG_INFO("EXTERNAL: Server ~p terminated normally", [Pid]), % The process terminated normally without us asking - Remove Pid from the % handlers table so we don't attempt to reuse it ets:match_delete(Handlers, {'_', Pid}), {noreply, Handlers}; handle_info({'EXIT', Pid, Reason}, Handlers) -> ?LOG_INFO("EXTERNAL: Server ~p died. (reason: ~p)", [Pid, Reason]), % Remove Pid from the handlers table so we don't try closing % it a second time in terminate/2. ets:match_delete(Handlers, {'_', Pid}), {stop, normal, Handlers}. code_change(_OldVsn, State, _Extra) -> {ok, State}. apache-couchdb-1.6.0/src/couchdb/couch_httpd_proxy.erl0000644000175000001440000003345512332105522022777 0ustar00djcusers00000000000000% Licensed under the Apache License, Version 2.0 (the "License"); you may not % use this file except in compliance with the License. You may obtain a copy of % the License at % % http://www.apache.org/licenses/LICENSE-2.0 % % Unless required by applicable law or agreed to in writing, software % distributed under the License is distributed on an "AS IS" BASIS, WITHOUT % WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the % License for the specific language governing permissions and limitations under % the License. -module(couch_httpd_proxy). -export([handle_proxy_req/2]). -include("couch_db.hrl"). -include("../ibrowse/ibrowse.hrl"). -define(TIMEOUT, infinity). -define(PKT_SIZE, 4096). handle_proxy_req(Req, ProxyDest) -> Method = get_method(Req), Url = get_url(Req, ProxyDest), Version = get_version(Req), Headers = get_headers(Req), Body = get_body(Req), Options = [ {http_vsn, Version}, {headers_as_is, true}, {response_format, binary}, {stream_to, {self(), once}} ], case ibrowse:send_req(Url, Headers, Method, Body, Options, ?TIMEOUT) of {ibrowse_req_id, ReqId} -> stream_response(Req, ProxyDest, ReqId); {error, Reason} -> throw({error, Reason}) end. get_method(#httpd{mochi_req=MochiReq}) -> case MochiReq:get(method) of Method when is_atom(Method) -> list_to_atom(string:to_lower(atom_to_list(Method))); Method when is_list(Method) -> list_to_atom(string:to_lower(Method)); Method when is_binary(Method) -> list_to_atom(string:to_lower(?b2l(Method))) end. get_url(Req, ProxyDest) when is_binary(ProxyDest) -> get_url(Req, ?b2l(ProxyDest)); get_url(#httpd{mochi_req=MochiReq}=Req, ProxyDest) -> BaseUrl = case mochiweb_util:partition(ProxyDest, "/") of {[], "/", _} -> couch_httpd:absolute_uri(Req, ProxyDest); _ -> ProxyDest end, ProxyPrefix = "/" ++ ?b2l(hd(Req#httpd.path_parts)), RequestedPath = MochiReq:get(raw_path), case mochiweb_util:partition(RequestedPath, ProxyPrefix) of {[], ProxyPrefix, []} -> BaseUrl; {[], ProxyPrefix, [$/ | DestPath]} -> remove_trailing_slash(BaseUrl) ++ "/" ++ DestPath; {[], ProxyPrefix, DestPath} -> remove_trailing_slash(BaseUrl) ++ "/" ++ DestPath; _Else -> throw({invalid_url_path, {ProxyPrefix, RequestedPath}}) end. get_version(#httpd{mochi_req=MochiReq}) -> MochiReq:get(version). get_headers(#httpd{mochi_req=MochiReq}) -> to_ibrowse_headers(mochiweb_headers:to_list(MochiReq:get(headers)), []). to_ibrowse_headers([], Acc) -> lists:reverse(Acc); to_ibrowse_headers([{K, V} | Rest], Acc) when is_atom(K) -> to_ibrowse_headers([{atom_to_list(K), V} | Rest], Acc); to_ibrowse_headers([{K, V} | Rest], Acc) when is_list(K) -> case string:to_lower(K) of "content-length" -> to_ibrowse_headers(Rest, [{content_length, V} | Acc]); % This appears to make ibrowse too smart. %"transfer-encoding" -> % to_ibrowse_headers(Rest, [{transfer_encoding, V} | Acc]); _ -> to_ibrowse_headers(Rest, [{K, V} | Acc]) end. get_body(#httpd{method='GET'}) -> fun() -> eof end; get_body(#httpd{method='HEAD'}) -> fun() -> eof end; get_body(#httpd{method='DELETE'}) -> fun() -> eof end; get_body(#httpd{mochi_req=MochiReq}) -> case MochiReq:get(body_length) of undefined -> <<>>; {unknown_transfer_encoding, Unknown} -> exit({unknown_transfer_encoding, Unknown}); chunked -> {fun stream_chunked_body/1, {init, MochiReq, 0}}; 0 -> <<>>; Length when is_integer(Length) andalso Length > 0 -> {fun stream_length_body/1, {init, MochiReq, Length}}; Length -> exit({invalid_body_length, Length}) end. remove_trailing_slash(Url) -> rem_slash(lists:reverse(Url)). rem_slash([]) -> []; rem_slash([$\s | RevUrl]) -> rem_slash(RevUrl); rem_slash([$\t | RevUrl]) -> rem_slash(RevUrl); rem_slash([$\r | RevUrl]) -> rem_slash(RevUrl); rem_slash([$\n | RevUrl]) -> rem_slash(RevUrl); rem_slash([$/ | RevUrl]) -> rem_slash(RevUrl); rem_slash(RevUrl) -> lists:reverse(RevUrl). stream_chunked_body({init, MReq, 0}) -> % First chunk, do expect-continue dance. init_body_stream(MReq), stream_chunked_body({stream, MReq, 0, [], ?PKT_SIZE}); stream_chunked_body({stream, MReq, 0, Buf, BRem}) -> % Finished a chunk, get next length. If next length % is 0, its time to try and read trailers. {CRem, Data} = read_chunk_length(MReq), case CRem of 0 -> BodyData = lists:reverse(Buf, Data), {ok, BodyData, {trailers, MReq, [], ?PKT_SIZE}}; _ -> stream_chunked_body( {stream, MReq, CRem, [Data | Buf], BRem-size(Data)} ) end; stream_chunked_body({stream, MReq, CRem, Buf, BRem}) when BRem =< 0 -> % Time to empty our buffers to the upstream socket. BodyData = lists:reverse(Buf), {ok, BodyData, {stream, MReq, CRem, [], ?PKT_SIZE}}; stream_chunked_body({stream, MReq, CRem, Buf, BRem}) -> % Buffer some more data from the client. Length = lists:min([CRem, BRem]), Socket = MReq:get(socket), NewState = case mochiweb_socket:recv(Socket, Length, ?TIMEOUT) of {ok, Data} when size(Data) == CRem -> case mochiweb_socket:recv(Socket, 2, ?TIMEOUT) of {ok, <<"\r\n">>} -> {stream, MReq, 0, [<<"\r\n">>, Data | Buf], BRem-Length-2}; _ -> exit(normal) end; {ok, Data} -> {stream, MReq, CRem-Length, [Data | Buf], BRem-Length}; _ -> exit(normal) end, stream_chunked_body(NewState); stream_chunked_body({trailers, MReq, Buf, BRem}) when BRem =< 0 -> % Empty our buffers and send data upstream. BodyData = lists:reverse(Buf), {ok, BodyData, {trailers, MReq, [], ?PKT_SIZE}}; stream_chunked_body({trailers, MReq, Buf, BRem}) -> % Read another trailer into the buffer or stop on an % empty line. Socket = MReq:get(socket), mochiweb_socket:setopts(Socket, [{packet, line}]), case mochiweb_socket:recv(Socket, 0, ?TIMEOUT) of {ok, <<"\r\n">>} -> mochiweb_socket:setopts(Socket, [{packet, raw}]), BodyData = lists:reverse(Buf, <<"\r\n">>), {ok, BodyData, eof}; {ok, Footer} -> mochiweb_socket:setopts(Socket, [{packet, raw}]), NewState = {trailers, MReq, [Footer | Buf], BRem-size(Footer)}, stream_chunked_body(NewState); _ -> exit(normal) end; stream_chunked_body(eof) -> % Tell ibrowse we're done sending data. eof. stream_length_body({init, MochiReq, Length}) -> % Do the expect-continue dance init_body_stream(MochiReq), stream_length_body({stream, MochiReq, Length}); stream_length_body({stream, _MochiReq, 0}) -> % Finished streaming. eof; stream_length_body({stream, MochiReq, Length}) -> BufLen = lists:min([Length, ?PKT_SIZE]), case MochiReq:recv(BufLen) of <<>> -> eof; Bin -> {ok, Bin, {stream, MochiReq, Length-BufLen}} end. init_body_stream(MochiReq) -> Expect = case MochiReq:get_header_value("expect") of undefined -> undefined; Value when is_list(Value) -> string:to_lower(Value) end, case Expect of "100-continue" -> MochiReq:start_raw_response({100, gb_trees:empty()}); _Else -> ok end. read_chunk_length(MochiReq) -> Socket = MochiReq:get(socket), mochiweb_socket:setopts(Socket, [{packet, line}]), case mochiweb_socket:recv(Socket, 0, ?TIMEOUT) of {ok, Header} -> mochiweb_socket:setopts(Socket, [{packet, raw}]), Splitter = fun(C) -> C =/= $\r andalso C =/= $\n andalso C =/= $\s end, {Hex, _Rest} = lists:splitwith(Splitter, ?b2l(Header)), {mochihex:to_int(Hex), Header}; _ -> exit(normal) end. stream_response(Req, ProxyDest, ReqId) -> receive {ibrowse_async_headers, ReqId, "100", _} -> % ibrowse doesn't handle 100 Continue responses which % means we have to discard them so the proxy client % doesn't get confused. ibrowse:stream_next(ReqId), stream_response(Req, ProxyDest, ReqId); {ibrowse_async_headers, ReqId, Status, Headers} -> {Source, Dest} = get_urls(Req, ProxyDest), FixedHeaders = fix_headers(Source, Dest, Headers, []), case body_length(FixedHeaders) of chunked -> {ok, Resp} = couch_httpd:start_chunked_response( Req, list_to_integer(Status), FixedHeaders ), ibrowse:stream_next(ReqId), stream_chunked_response(Req, ReqId, Resp), {ok, Resp}; Length when is_integer(Length) -> {ok, Resp} = couch_httpd:start_response_length( Req, list_to_integer(Status), FixedHeaders, Length ), ibrowse:stream_next(ReqId), stream_length_response(Req, ReqId, Resp), {ok, Resp}; _ -> {ok, Resp} = couch_httpd:start_response( Req, list_to_integer(Status), FixedHeaders ), ibrowse:stream_next(ReqId), stream_length_response(Req, ReqId, Resp), % XXX: MochiWeb apparently doesn't look at the % response to see if it must force close the % connection. So we help it out here. erlang:put(mochiweb_request_force_close, true), {ok, Resp} end end. stream_chunked_response(Req, ReqId, Resp) -> receive {ibrowse_async_response, ReqId, {error, Reason}} -> throw({error, Reason}); {ibrowse_async_response, ReqId, Chunk} -> couch_httpd:send_chunk(Resp, Chunk), ibrowse:stream_next(ReqId), stream_chunked_response(Req, ReqId, Resp); {ibrowse_async_response_end, ReqId} -> couch_httpd:last_chunk(Resp) end. stream_length_response(Req, ReqId, Resp) -> receive {ibrowse_async_response, ReqId, {error, Reason}} -> throw({error, Reason}); {ibrowse_async_response, ReqId, Chunk} -> couch_httpd:send(Resp, Chunk), ibrowse:stream_next(ReqId), stream_length_response(Req, ReqId, Resp); {ibrowse_async_response_end, ReqId} -> ok end. get_urls(Req, ProxyDest) -> SourceUrl = couch_httpd:absolute_uri(Req, "/" ++ hd(Req#httpd.path_parts)), Source = parse_url(?b2l(iolist_to_binary(SourceUrl))), case (catch parse_url(ProxyDest)) of Dest when is_record(Dest, url) -> {Source, Dest}; _ -> DestUrl = couch_httpd:absolute_uri(Req, ProxyDest), {Source, parse_url(DestUrl)} end. fix_headers(_, _, [], Acc) -> lists:reverse(Acc); fix_headers(Source, Dest, [{K, V} | Rest], Acc) -> Fixed = case string:to_lower(K) of "location" -> rewrite_location(Source, Dest, V); "content-location" -> rewrite_location(Source, Dest, V); "uri" -> rewrite_location(Source, Dest, V); "destination" -> rewrite_location(Source, Dest, V); "set-cookie" -> rewrite_cookie(Source, Dest, V); _ -> V end, fix_headers(Source, Dest, Rest, [{K, Fixed} | Acc]). rewrite_location(Source, #url{host=Host, port=Port, protocol=Proto}, Url) -> case (catch parse_url(Url)) of #url{host=Host, port=Port, protocol=Proto} = Location -> DestLoc = #url{ protocol=Source#url.protocol, host=Source#url.host, port=Source#url.port, path=join_url_path(Source#url.path, Location#url.path) }, url_to_url(DestLoc); #url{} -> Url; _ -> url_to_url(Source#url{path=join_url_path(Source#url.path, Url)}) end. rewrite_cookie(_Source, _Dest, Cookie) -> Cookie. parse_url(Url) when is_binary(Url) -> ibrowse_lib:parse_url(?b2l(Url)); parse_url(Url) when is_list(Url) -> ibrowse_lib:parse_url(?b2l(iolist_to_binary(Url))). join_url_path(Src, Dst) -> Src2 = case lists:reverse(Src) of "/" ++ RestSrc -> lists:reverse(RestSrc); _ -> Src end, Dst2 = case Dst of "/" ++ RestDst -> RestDst; _ -> Dst end, Src2 ++ "/" ++ Dst2. url_to_url(#url{host=Host, port=Port, path=Path, protocol=Proto} = Url) -> LPort = case {Proto, Port} of {http, 80} -> ""; {https, 443} -> ""; _ -> ":" ++ integer_to_list(Port) end, LPath = case Path of "/" ++ _RestPath -> Path; _ -> "/" ++ Path end, HostPart = case Url#url.host_type of ipv6_address -> "[" ++ Host ++ "]"; _ -> Host end, atom_to_list(Proto) ++ "://" ++ HostPart ++ LPort ++ LPath. body_length(Headers) -> case is_chunked(Headers) of true -> chunked; _ -> content_length(Headers) end. is_chunked([]) -> false; is_chunked([{K, V} | Rest]) -> case string:to_lower(K) of "transfer-encoding" -> string:to_lower(V) == "chunked"; _ -> is_chunked(Rest) end. content_length([]) -> undefined; content_length([{K, V} | Rest]) -> case string:to_lower(K) of "content-length" -> list_to_integer(V); _ -> content_length(Rest) end. apache-couchdb-1.6.0/src/couchdb/couch_stream.erl0000644000175000001440000002302512332105522021676 0ustar00djcusers00000000000000% Licensed under the Apache License, Version 2.0 (the "License"); you may not % use this file except in compliance with the License. You may obtain a copy of % the License at % % http://www.apache.org/licenses/LICENSE-2.0 % % Unless required by applicable law or agreed to in writing, software % distributed under the License is distributed on an "AS IS" BASIS, WITHOUT % WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the % License for the specific language governing permissions and limitations under % the License. -module(couch_stream). -behaviour(gen_server). % public API -export([open/1, open/2, close/1]). -export([foldl/4, foldl/5, foldl_decode/6, range_foldl/6]). -export([copy_to_new_stream/3, write/2]). % gen_server callbacks -export([init/1, terminate/2, code_change/3]). -export([handle_cast/2, handle_call/3, handle_info/2]). -include("couch_db.hrl"). -define(DEFAULT_BUFFER_SIZE, 4096). -record(stream, {fd = 0, written_pointers=[], buffer_list = [], buffer_len = 0, max_buffer, written_len = 0, md5, % md5 of the content without any transformation applied (e.g. compression) % needed for the attachment upload integrity check (ticket 558) identity_md5, identity_len = 0, encoding_fun, end_encoding_fun }). %%% Interface functions %%% open(Fd) -> open(Fd, []). open(Fd, Options) -> gen_server:start_link(couch_stream, {Fd, Options}, []). close(Pid) -> gen_server:call(Pid, close, infinity). copy_to_new_stream(Fd, PosList, DestFd) -> {ok, Dest} = open(DestFd), foldl(Fd, PosList, fun(Bin, _) -> ok = write(Dest, Bin) end, ok), close(Dest). foldl(_Fd, [], _Fun, Acc) -> Acc; foldl(Fd, [Pos|Rest], Fun, Acc) -> {ok, Bin} = couch_file:pread_iolist(Fd, Pos), foldl(Fd, Rest, Fun, Fun(Bin, Acc)). foldl(Fd, PosList, <<>>, Fun, Acc) -> foldl(Fd, PosList, Fun, Acc); foldl(Fd, PosList, Md5, Fun, Acc) -> foldl(Fd, PosList, Md5, couch_util:md5_init(), Fun, Acc). foldl_decode(Fd, PosList, Md5, Enc, Fun, Acc) -> {DecDataFun, DecEndFun} = case Enc of gzip -> ungzip_init(); identity -> identity_enc_dec_funs() end, Result = foldl_decode( DecDataFun, Fd, PosList, Md5, couch_util:md5_init(), Fun, Acc ), DecEndFun(), Result. foldl(_Fd, [], Md5, Md5Acc, _Fun, Acc) -> Md5 = couch_util:md5_final(Md5Acc), Acc; foldl(Fd, [{Pos, _Size}], Md5, Md5Acc, Fun, Acc) -> % 0110 UPGRADE CODE foldl(Fd, [Pos], Md5, Md5Acc, Fun, Acc); foldl(Fd, [Pos], Md5, Md5Acc, Fun, Acc) -> {ok, Bin} = couch_file:pread_iolist(Fd, Pos), Md5 = couch_util:md5_final(couch_util:md5_update(Md5Acc, Bin)), Fun(Bin, Acc); foldl(Fd, [{Pos, _Size}|Rest], Md5, Md5Acc, Fun, Acc) -> foldl(Fd, [Pos|Rest], Md5, Md5Acc, Fun, Acc); foldl(Fd, [Pos|Rest], Md5, Md5Acc, Fun, Acc) -> {ok, Bin} = couch_file:pread_iolist(Fd, Pos), foldl(Fd, Rest, Md5, couch_util:md5_update(Md5Acc, Bin), Fun, Fun(Bin, Acc)). range_foldl(Fd, PosList, From, To, Fun, Acc) -> range_foldl(Fd, PosList, From, To, 0, Fun, Acc). range_foldl(_Fd, _PosList, _From, To, Off, _Fun, Acc) when Off >= To -> Acc; range_foldl(Fd, [Pos|Rest], From, To, Off, Fun, Acc) when is_integer(Pos) -> % old-style attachment {ok, Bin} = couch_file:pread_iolist(Fd, Pos), range_foldl(Fd, [{Pos, iolist_size(Bin)}] ++ Rest, From, To, Off, Fun, Acc); range_foldl(Fd, [{_Pos, Size}|Rest], From, To, Off, Fun, Acc) when From > Off + Size -> range_foldl(Fd, Rest, From, To, Off + Size, Fun, Acc); range_foldl(Fd, [{Pos, Size}|Rest], From, To, Off, Fun, Acc) -> {ok, Bin} = couch_file:pread_iolist(Fd, Pos), Bin1 = if From =< Off andalso To >= Off + Size -> Bin; %% the whole block is covered true -> PrefixLen = clip(From - Off, 0, Size), PostfixLen = clip(Off + Size - To, 0, Size), MatchLen = Size - PrefixLen - PostfixLen, <<_Prefix:PrefixLen/binary,Match:MatchLen/binary,_Postfix:PostfixLen/binary>> = iolist_to_binary(Bin), Match end, range_foldl(Fd, Rest, From, To, Off + Size, Fun, Fun(Bin1, Acc)). clip(Value, Lo, Hi) -> if Value < Lo -> Lo; Value > Hi -> Hi; true -> Value end. foldl_decode(_DecFun, _Fd, [], Md5, Md5Acc, _Fun, Acc) -> Md5 = couch_util:md5_final(Md5Acc), Acc; foldl_decode(DecFun, Fd, [{Pos, _Size}], Md5, Md5Acc, Fun, Acc) -> foldl_decode(DecFun, Fd, [Pos], Md5, Md5Acc, Fun, Acc); foldl_decode(DecFun, Fd, [Pos], Md5, Md5Acc, Fun, Acc) -> {ok, EncBin} = couch_file:pread_iolist(Fd, Pos), Md5 = couch_util:md5_final(couch_util:md5_update(Md5Acc, EncBin)), Bin = DecFun(EncBin), Fun(Bin, Acc); foldl_decode(DecFun, Fd, [{Pos, _Size}|Rest], Md5, Md5Acc, Fun, Acc) -> foldl_decode(DecFun, Fd, [Pos|Rest], Md5, Md5Acc, Fun, Acc); foldl_decode(DecFun, Fd, [Pos|Rest], Md5, Md5Acc, Fun, Acc) -> {ok, EncBin} = couch_file:pread_iolist(Fd, Pos), Bin = DecFun(EncBin), Md5Acc2 = couch_util:md5_update(Md5Acc, EncBin), foldl_decode(DecFun, Fd, Rest, Md5, Md5Acc2, Fun, Fun(Bin, Acc)). gzip_init(Options) -> case couch_util:get_value(compression_level, Options, 0) of Lvl when Lvl >= 1 andalso Lvl =< 9 -> Z = zlib:open(), % 15 = ?MAX_WBITS (defined in the zlib module) % the 16 + ?MAX_WBITS formula was obtained by inspecting zlib:gzip/1 ok = zlib:deflateInit(Z, Lvl, deflated, 16 + 15, 8, default), { fun(Data) -> zlib:deflate(Z, Data) end, fun() -> Last = zlib:deflate(Z, [], finish), ok = zlib:deflateEnd(Z), ok = zlib:close(Z), Last end }; _ -> identity_enc_dec_funs() end. ungzip_init() -> Z = zlib:open(), zlib:inflateInit(Z, 16 + 15), { fun(Data) -> zlib:inflate(Z, Data) end, fun() -> ok = zlib:inflateEnd(Z), ok = zlib:close(Z) end }. identity_enc_dec_funs() -> { fun(Data) -> Data end, fun() -> [] end }. write(_Pid, <<>>) -> ok; write(Pid, Bin) -> gen_server:call(Pid, {write, Bin}, infinity). init({Fd, Options}) -> {EncodingFun, EndEncodingFun} = case couch_util:get_value(encoding, Options, identity) of identity -> identity_enc_dec_funs(); gzip -> gzip_init(Options) end, {ok, #stream{ fd=Fd, md5=couch_util:md5_init(), identity_md5=couch_util:md5_init(), encoding_fun=EncodingFun, end_encoding_fun=EndEncodingFun, max_buffer=couch_util:get_value( buffer_size, Options, ?DEFAULT_BUFFER_SIZE) } }. terminate(_Reason, _Stream) -> ok. handle_call({write, Bin}, _From, Stream) -> BinSize = iolist_size(Bin), #stream{ fd = Fd, written_len = WrittenLen, written_pointers = Written, buffer_len = BufferLen, buffer_list = Buffer, max_buffer = Max, md5 = Md5, identity_md5 = IdenMd5, identity_len = IdenLen, encoding_fun = EncodingFun} = Stream, if BinSize + BufferLen > Max -> WriteBin = lists:reverse(Buffer, [Bin]), IdenMd5_2 = couch_util:md5_update(IdenMd5, WriteBin), case EncodingFun(WriteBin) of [] -> % case where the encoder did some internal buffering % (zlib does it for example) WrittenLen2 = WrittenLen, Md5_2 = Md5, Written2 = Written; WriteBin2 -> {ok, Pos, _} = couch_file:append_binary(Fd, WriteBin2), WrittenLen2 = WrittenLen + iolist_size(WriteBin2), Md5_2 = couch_util:md5_update(Md5, WriteBin2), Written2 = [{Pos, iolist_size(WriteBin2)}|Written] end, {reply, ok, Stream#stream{ written_len=WrittenLen2, written_pointers=Written2, buffer_list=[], buffer_len=0, md5=Md5_2, identity_md5=IdenMd5_2, identity_len=IdenLen + BinSize}}; true -> {reply, ok, Stream#stream{ buffer_list=[Bin|Buffer], buffer_len=BufferLen + BinSize, identity_len=IdenLen + BinSize}} end; handle_call(close, _From, Stream) -> #stream{ fd = Fd, written_len = WrittenLen, written_pointers = Written, buffer_list = Buffer, md5 = Md5, identity_md5 = IdenMd5, identity_len = IdenLen, encoding_fun = EncodingFun, end_encoding_fun = EndEncodingFun} = Stream, WriteBin = lists:reverse(Buffer), IdenMd5Final = couch_util:md5_final(couch_util:md5_update(IdenMd5, WriteBin)), WriteBin2 = EncodingFun(WriteBin) ++ EndEncodingFun(), Md5Final = couch_util:md5_final(couch_util:md5_update(Md5, WriteBin2)), Result = case WriteBin2 of [] -> {lists:reverse(Written), WrittenLen, IdenLen, Md5Final, IdenMd5Final}; _ -> {ok, Pos, _} = couch_file:append_binary(Fd, WriteBin2), StreamInfo = lists:reverse(Written, [{Pos, iolist_size(WriteBin2)}]), StreamLen = WrittenLen + iolist_size(WriteBin2), {StreamInfo, StreamLen, IdenLen, Md5Final, IdenMd5Final} end, {stop, normal, Result, Stream}. handle_cast(_Msg, State) -> {noreply,State}. code_change(_OldVsn, State, _Extra) -> {ok, State}. handle_info(_Info, State) -> {noreply, State}. apache-couchdb-1.6.0/src/couchdb/couch_native_process.erl0000644000175000001440000003201612332105522023427 0ustar00djcusers00000000000000% Licensed under the Apache License, Version 2.0 (the "License"); % you may not use this file except in compliance with the License. % % You may obtain a copy of the License at % http://www.apache.org/licenses/LICENSE-2.0 % % Unless required by applicable law or agreed to in writing, % software distributed under the License is distributed on an % "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, % either express or implied. % % See the License for the specific language governing permissions % and limitations under the License. % % This file drew much inspiration from erlview, which was written by and % copyright Michael McDaniel [http://autosys.us], and is also under APL 2.0 % % % This module provides the smallest possible native view-server. % With this module in-place, you can add the following to your couch INI files: % [native_query_servers] % erlang={couch_native_process, start_link, []} % % Which will then allow following example map function to be used: % % fun({Doc}) -> % % Below, we emit a single record - the _id as key, null as value % DocId = couch_util:get_value(<<"_id">>, Doc, null), % Emit(DocId, null) % end. % % which should be roughly the same as the javascript: % emit(doc._id, null); % % This module exposes enough functions such that a native erlang server can % act as a fully-fleged view server, but no 'helper' functions specifically % for simplifying your erlang view code. It is expected other third-party % extensions will evolve which offer useful layers on top of this view server % to help simplify your view code. -module(couch_native_process). -behaviour(gen_server). -export([start_link/0,init/1,terminate/2,handle_call/3,handle_cast/2,code_change/3, handle_info/2]). -export([set_timeout/2, prompt/2]). -define(STATE, native_proc_state). -record(evstate, {ddocs, funs=[], query_config=[], list_pid=nil, timeout=5000}). -include("couch_db.hrl"). start_link() -> gen_server:start_link(?MODULE, [], []). % this is a bit messy, see also couch_query_servers handle_info % stop(_Pid) -> % ok. set_timeout(Pid, TimeOut) -> gen_server:call(Pid, {set_timeout, TimeOut}). prompt(Pid, Data) when is_list(Data) -> gen_server:call(Pid, {prompt, Data}). % gen_server callbacks init([]) -> {ok, #evstate{ddocs=dict:new()}}. handle_call({set_timeout, TimeOut}, _From, State) -> {reply, ok, State#evstate{timeout=TimeOut}}; handle_call({prompt, Data}, _From, State) -> ?LOG_DEBUG("Prompt native qs: ~s",[?JSON_ENCODE(Data)]), {NewState, Resp} = try run(State, to_binary(Data)) of {S, R} -> {S, R} catch throw:{error, Why} -> {State, [<<"error">>, Why, Why]} end, case Resp of {error, Reason} -> Msg = io_lib:format("couch native server error: ~p", [Reason]), {reply, [<<"error">>, <<"native_query_server">>, list_to_binary(Msg)], NewState}; [<<"error">> | Rest] -> % Msg = io_lib:format("couch native server error: ~p", [Rest]), % TODO: markh? (jan) {reply, [<<"error">> | Rest], NewState}; [<<"fatal">> | Rest] -> % Msg = io_lib:format("couch native server error: ~p", [Rest]), % TODO: markh? (jan) {stop, fatal, [<<"error">> | Rest], NewState}; Resp -> {reply, Resp, NewState} end. handle_cast(foo, State) -> {noreply, State}. handle_info({'EXIT',_,normal}, State) -> {noreply, State}; handle_info({'EXIT',_,Reason}, State) -> {stop, Reason, State}. terminate(_Reason, _State) -> ok. code_change(_OldVersion, State, _Extra) -> {ok, State}. run(#evstate{list_pid=Pid}=State, [<<"list_row">>, Row]) when is_pid(Pid) -> Pid ! {self(), list_row, Row}, receive {Pid, chunks, Data} -> {State, [<<"chunks">>, Data]}; {Pid, list_end, Data} -> receive {'EXIT', Pid, normal} -> ok after State#evstate.timeout -> throw({timeout, list_cleanup}) end, process_flag(trap_exit, erlang:get(do_trap)), {State#evstate{list_pid=nil}, [<<"end">>, Data]} after State#evstate.timeout -> throw({timeout, list_row}) end; run(#evstate{list_pid=Pid}=State, [<<"list_end">>]) when is_pid(Pid) -> Pid ! {self(), list_end}, Resp = receive {Pid, list_end, Data} -> receive {'EXIT', Pid, normal} -> ok after State#evstate.timeout -> throw({timeout, list_cleanup}) end, [<<"end">>, Data] after State#evstate.timeout -> throw({timeout, list_end}) end, process_flag(trap_exit, erlang:get(do_trap)), {State#evstate{list_pid=nil}, Resp}; run(#evstate{list_pid=Pid}=State, _Command) when is_pid(Pid) -> {State, [<<"error">>, list_error, list_error]}; run(#evstate{ddocs=DDocs}, [<<"reset">>]) -> {#evstate{ddocs=DDocs}, true}; run(#evstate{ddocs=DDocs}, [<<"reset">>, QueryConfig]) -> {#evstate{ddocs=DDocs, query_config=QueryConfig}, true}; run(#evstate{funs=Funs}=State, [<<"add_fun">> , BinFunc]) -> FunInfo = makefun(State, BinFunc), {State#evstate{funs=Funs ++ [FunInfo]}, true}; run(State, [<<"map_doc">> , Doc]) -> Resp = lists:map(fun({Sig, Fun}) -> erlang:put(Sig, []), Fun(Doc), lists:reverse(erlang:get(Sig)) end, State#evstate.funs), {State, Resp}; run(State, [<<"reduce">>, Funs, KVs]) -> {Keys, Vals} = lists:foldl(fun([K, V], {KAcc, VAcc}) -> {[K | KAcc], [V | VAcc]} end, {[], []}, KVs), Keys2 = lists:reverse(Keys), Vals2 = lists:reverse(Vals), {State, catch reduce(State, Funs, Keys2, Vals2, false)}; run(State, [<<"rereduce">>, Funs, Vals]) -> {State, catch reduce(State, Funs, null, Vals, true)}; run(#evstate{ddocs=DDocs}=State, [<<"ddoc">>, <<"new">>, DDocId, DDoc]) -> DDocs2 = store_ddoc(DDocs, DDocId, DDoc), {State#evstate{ddocs=DDocs2}, true}; run(#evstate{ddocs=DDocs}=State, [<<"ddoc">>, DDocId | Rest]) -> DDoc = load_ddoc(DDocs, DDocId), ddoc(State, DDoc, Rest); run(_, Unknown) -> ?LOG_ERROR("Native Process: Unknown command: ~p~n", [Unknown]), throw({error, unknown_command}). ddoc(State, {DDoc}, [FunPath, Args]) -> % load fun from the FunPath BFun = lists:foldl(fun (Key, {Props}) when is_list(Props) -> couch_util:get_value(Key, Props, nil); (_Key, Fun) when is_binary(Fun) -> Fun; (_Key, nil) -> throw({error, not_found}); (_Key, _Fun) -> throw({error, malformed_ddoc}) end, {DDoc}, FunPath), ddoc(State, makefun(State, BFun, {DDoc}), FunPath, Args). ddoc(State, {_, Fun}, [<<"validate_doc_update">>], Args) -> {State, (catch apply(Fun, Args))}; ddoc(State, {_, Fun}, [<<"filters">>|_], [Docs, Req]) -> FilterFunWrapper = fun(Doc) -> case catch Fun(Doc, Req) of true -> true; false -> false; {'EXIT', Error} -> ?LOG_ERROR("~p", [Error]) end end, Resp = lists:map(FilterFunWrapper, Docs), {State, [true, Resp]}; ddoc(State, {_, Fun}, [<<"shows">>|_], Args) -> Resp = case (catch apply(Fun, Args)) of FunResp when is_list(FunResp) -> FunResp; {FunResp} -> [<<"resp">>, {FunResp}]; FunResp -> FunResp end, {State, Resp}; ddoc(State, {_, Fun}, [<<"updates">>|_], Args) -> Resp = case (catch apply(Fun, Args)) of [JsonDoc, JsonResp] -> [<<"up">>, JsonDoc, JsonResp] end, {State, Resp}; ddoc(State, {Sig, Fun}, [<<"lists">>|_], Args) -> Self = self(), SpawnFun = fun() -> LastChunk = (catch apply(Fun, Args)), case start_list_resp(Self, Sig) of started -> receive {Self, list_row, _Row} -> ignore; {Self, list_end} -> ignore after State#evstate.timeout -> throw({timeout, list_cleanup_pid}) end; _ -> ok end, LastChunks = case erlang:get(Sig) of undefined -> [LastChunk]; OtherChunks -> [LastChunk | OtherChunks] end, Self ! {self(), list_end, lists:reverse(LastChunks)} end, erlang:put(do_trap, process_flag(trap_exit, true)), Pid = spawn_link(SpawnFun), Resp = receive {Pid, start, Chunks, JsonResp} -> [<<"start">>, Chunks, JsonResp] after State#evstate.timeout -> throw({timeout, list_start}) end, {State#evstate{list_pid=Pid}, Resp}. store_ddoc(DDocs, DDocId, DDoc) -> dict:store(DDocId, DDoc, DDocs). load_ddoc(DDocs, DDocId) -> try dict:fetch(DDocId, DDocs) of {DDoc} -> {DDoc} catch _:_Else -> throw({error, ?l2b(io_lib:format("Native Query Server missing DDoc with Id: ~s",[DDocId]))}) end. bindings(State, Sig) -> bindings(State, Sig, nil). bindings(State, Sig, DDoc) -> Self = self(), Log = fun(Msg) -> ?LOG_INFO(Msg, []) end, Emit = fun(Id, Value) -> Curr = erlang:get(Sig), erlang:put(Sig, [[Id, Value] | Curr]) end, Start = fun(Headers) -> erlang:put(list_headers, Headers) end, Send = fun(Chunk) -> Curr = case erlang:get(Sig) of undefined -> []; Else -> Else end, erlang:put(Sig, [Chunk | Curr]) end, GetRow = fun() -> case start_list_resp(Self, Sig) of started -> ok; _ -> Chunks = case erlang:get(Sig) of undefined -> []; CurrChunks -> CurrChunks end, Self ! {self(), chunks, lists:reverse(Chunks)} end, erlang:put(Sig, []), receive {Self, list_row, Row} -> Row; {Self, list_end} -> nil after State#evstate.timeout -> throw({timeout, list_pid_getrow}) end end, FoldRows = fun(Fun, Acc) -> foldrows(GetRow, Fun, Acc) end, Bindings = [ {'Log', Log}, {'Emit', Emit}, {'Start', Start}, {'Send', Send}, {'GetRow', GetRow}, {'FoldRows', FoldRows} ], case DDoc of {_Props} -> Bindings ++ [{'DDoc', DDoc}]; _Else -> Bindings end. % thanks to erlview, via: % http://erlang.org/pipermail/erlang-questions/2003-November/010544.html makefun(State, Source) -> Sig = couch_util:md5(Source), BindFuns = bindings(State, Sig), {Sig, makefun(State, Source, BindFuns)}. makefun(State, Source, {DDoc}) -> Sig = couch_util:md5(lists:flatten([Source, term_to_binary(DDoc)])), BindFuns = bindings(State, Sig, {DDoc}), {Sig, makefun(State, Source, BindFuns)}; makefun(_State, Source, BindFuns) when is_list(BindFuns) -> FunStr = binary_to_list(Source), {ok, Tokens, _} = erl_scan:string(FunStr), Form = case (catch erl_parse:parse_exprs(Tokens)) of {ok, [ParsedForm]} -> ParsedForm; {error, {LineNum, _Mod, [Mesg, Params]}}=Error -> io:format(standard_error, "Syntax error on line: ~p~n", [LineNum]), io:format(standard_error, "~s~p~n", [Mesg, Params]), throw(Error) end, Bindings = lists:foldl(fun({Name, Fun}, Acc) -> erl_eval:add_binding(Name, Fun, Acc) end, erl_eval:new_bindings(), BindFuns), {value, Fun, _} = erl_eval:expr(Form, Bindings), Fun. reduce(State, BinFuns, Keys, Vals, ReReduce) -> Funs = case is_list(BinFuns) of true -> lists:map(fun(BF) -> makefun(State, BF) end, BinFuns); _ -> [makefun(State, BinFuns)] end, Reds = lists:map(fun({_Sig, Fun}) -> Fun(Keys, Vals, ReReduce) end, Funs), [true, Reds]. foldrows(GetRow, ProcRow, Acc) -> case GetRow() of nil -> {ok, Acc}; Row -> case (catch ProcRow(Row, Acc)) of {ok, Acc2} -> foldrows(GetRow, ProcRow, Acc2); {stop, Acc2} -> {ok, Acc2} end end. start_list_resp(Self, Sig) -> case erlang:get(list_started) of undefined -> Headers = case erlang:get(list_headers) of undefined -> {[{<<"headers">>, {[]}}]}; CurrHdrs -> CurrHdrs end, Chunks = case erlang:get(Sig) of undefined -> []; CurrChunks -> CurrChunks end, Self ! {self(), start, lists:reverse(Chunks), Headers}, erlang:put(list_started, true), erlang:put(Sig, []), started; _ -> ok end. to_binary({Data}) -> Pred = fun({Key, Value}) -> {to_binary(Key), to_binary(Value)} end, {lists:map(Pred, Data)}; to_binary(Data) when is_list(Data) -> [to_binary(D) || D <- Data]; to_binary(null) -> null; to_binary(true) -> true; to_binary(false) -> false; to_binary(Data) when is_atom(Data) -> list_to_binary(atom_to_list(Data)); to_binary(Data) -> Data. apache-couchdb-1.6.0/src/couchdb/couch_httpd_db.erl0000644000175000001440000013432312332105522022177 0ustar00djcusers00000000000000% Licensed under the Apache License, Version 2.0 (the "License"); you may not % use this file except in compliance with the License. You may obtain a copy of % the License at % % http://www.apache.org/licenses/LICENSE-2.0 % % Unless required by applicable law or agreed to in writing, software % distributed under the License is distributed on an "AS IS" BASIS, WITHOUT % WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the % License for the specific language governing permissions and limitations under % the License. -module(couch_httpd_db). -include("couch_db.hrl"). -export([handle_request/1, handle_compact_req/2, handle_design_req/2, db_req/2, couch_doc_open/4,handle_changes_req/2, update_doc_result_to_json/1, update_doc_result_to_json/2, handle_design_info_req/3]). -import(couch_httpd, [send_json/2,send_json/3,send_json/4,send_method_not_allowed/2, start_json_response/2,send_chunk/2,last_chunk/1,end_json_response/1, start_chunked_response/3, absolute_uri/2, send/2, start_response_length/4, send_error/4]). -record(doc_query_args, { options = [], rev = nil, open_revs = [], update_type = interactive_edit, atts_since = nil }). % Database request handlers handle_request(#httpd{path_parts=[DbName|RestParts],method=Method, db_url_handlers=DbUrlHandlers}=Req)-> case {Method, RestParts} of {'PUT', []} -> create_db_req(Req, DbName); {'DELETE', []} -> % if we get ?rev=... the user is using a faulty script where the % document id is empty by accident. Let them recover safely. case couch_httpd:qs_value(Req, "rev", false) of false -> delete_db_req(Req, DbName); _Rev -> throw({bad_request, "You tried to DELETE a database with a ?rev= parameter. " ++ "Did you mean to DELETE a document instead?"}) end; {_, []} -> do_db_req(Req, fun db_req/2); {_, [SecondPart|_]} -> Handler = couch_util:dict_find(SecondPart, DbUrlHandlers, fun db_req/2), do_db_req(Req, Handler) end. handle_changes_req(#httpd{method='POST'}=Req, Db) -> couch_httpd:validate_ctype(Req, "application/json"), handle_changes_req1(Req, Db); handle_changes_req(#httpd{method='GET'}=Req, Db) -> handle_changes_req1(Req, Db); handle_changes_req(#httpd{path_parts=[_,<<"_changes">>]}=Req, _Db) -> send_method_not_allowed(Req, "GET,HEAD,POST"). handle_changes_req1(Req, #db{name=DbName}=Db) -> AuthDbName = ?l2b(couch_config:get("couch_httpd_auth", "authentication_db")), case AuthDbName of DbName -> % in the authentication database, _changes is admin-only. ok = couch_db:check_is_admin(Db); _Else -> % on other databases, _changes is free for all. ok end, handle_changes_req2(Req, Db). handle_changes_req2(Req, Db) -> MakeCallback = fun(Resp) -> fun({change, {ChangeProp}=Change, _}, "eventsource") -> Seq = proplists:get_value(<<"seq">>, ChangeProp), send_chunk(Resp, ["data: ", ?JSON_ENCODE(Change), "\n", "id: ", ?JSON_ENCODE(Seq), "\n\n"]); ({change, Change, _}, "continuous") -> send_chunk(Resp, [?JSON_ENCODE(Change) | "\n"]); ({change, Change, Prepend}, _) -> send_chunk(Resp, [Prepend, ?JSON_ENCODE(Change)]); (start, "eventsource") -> ok; (start, "continuous") -> ok; (start, _) -> send_chunk(Resp, "{\"results\":[\n"); ({stop, _EndSeq}, "eventsource") -> end_json_response(Resp); ({stop, EndSeq}, "continuous") -> send_chunk( Resp, [?JSON_ENCODE({[{<<"last_seq">>, EndSeq}]}) | "\n"] ), end_json_response(Resp); ({stop, EndSeq}, _) -> send_chunk( Resp, io_lib:format("\n],\n\"last_seq\":~w}\n", [EndSeq]) ), end_json_response(Resp); (timeout, _) -> send_chunk(Resp, "\n") end end, ChangesArgs = parse_changes_query(Req, Db), ChangesFun = couch_changes:handle_changes(ChangesArgs, Req, Db), WrapperFun = case ChangesArgs#changes_args.feed of "normal" -> {ok, Info} = couch_db:get_db_info(Db), CurrentEtag = couch_httpd:make_etag(Info), fun(FeedChangesFun) -> couch_httpd:etag_respond( Req, CurrentEtag, fun() -> {ok, Resp} = couch_httpd:start_json_response( Req, 200, [{"ETag", CurrentEtag}] ), FeedChangesFun(MakeCallback(Resp)) end ) end; "eventsource" -> Headers = [ {"Content-Type", "text/event-stream"}, {"Cache-Control", "no-cache"} ], {ok, Resp} = couch_httpd:start_chunked_response(Req, 200, Headers), fun(FeedChangesFun) -> FeedChangesFun(MakeCallback(Resp)) end; _ -> % "longpoll" or "continuous" {ok, Resp} = couch_httpd:start_json_response(Req, 200), fun(FeedChangesFun) -> FeedChangesFun(MakeCallback(Resp)) end end, couch_stats_collector:increment( {httpd, clients_requesting_changes} ), try WrapperFun(ChangesFun) after couch_stats_collector:decrement( {httpd, clients_requesting_changes} ) end. handle_compact_req(#httpd{method='POST'}=Req, Db) -> case Req#httpd.path_parts of [_DbName, <<"_compact">>] -> ok = couch_db:check_is_admin(Db), couch_httpd:validate_ctype(Req, "application/json"), {ok, _} = couch_db:start_compact(Db), send_json(Req, 202, {[{ok, true}]}); [_DbName, <<"_compact">>, DesignName | _] -> DesignId = <<"_design/", DesignName/binary>>, DDoc = couch_httpd_db:couch_doc_open( Db, DesignId, nil, [ejson_body] ), couch_mrview_http:handle_compact_req(Req, Db, DDoc) end; handle_compact_req(Req, _Db) -> send_method_not_allowed(Req, "POST"). handle_design_req(#httpd{ path_parts=[_DbName, _Design, DesignName, <<"_",_/binary>> = Action | _Rest], design_url_handlers = DesignUrlHandlers }=Req, Db) -> case couch_db:is_system_db(Db) of true -> case (catch couch_db:check_is_admin(Db)) of ok -> ok; _ -> throw({forbidden, <<"Only admins can access design document", " actions for system databases.">>}) end; false -> ok end, % load ddoc DesignId = <<"_design/", DesignName/binary>>, DDoc = couch_httpd_db:couch_doc_open(Db, DesignId, nil, [ejson_body]), Handler = couch_util:dict_find(Action, DesignUrlHandlers, fun(_, _, _) -> throw({not_found, <<"missing handler: ", Action/binary>>}) end), Handler(Req, Db, DDoc); handle_design_req(Req, Db) -> db_req(Req, Db). handle_design_info_req(#httpd{ method='GET', path_parts=[_DbName, _Design, DesignName, _] }=Req, Db, _DDoc) -> DesignId = <<"_design/", DesignName/binary>>, DDoc = couch_httpd_db:couch_doc_open(Db, DesignId, nil, [ejson_body]), couch_mrview_http:handle_info_req(Req, Db, DDoc). create_db_req(#httpd{user_ctx=UserCtx}=Req, DbName) -> ok = couch_httpd:verify_is_server_admin(Req), case couch_server:create(DbName, [{user_ctx, UserCtx}]) of {ok, Db} -> couch_db:close(Db), DbUrl = absolute_uri(Req, "/" ++ couch_util:url_encode(DbName)), send_json(Req, 201, [{"Location", DbUrl}], {[{ok, true}]}); Error -> throw(Error) end. delete_db_req(#httpd{user_ctx=UserCtx}=Req, DbName) -> ok = couch_httpd:verify_is_server_admin(Req), case couch_server:delete(DbName, [{user_ctx, UserCtx}]) of ok -> send_json(Req, 200, {[{ok, true}]}); Error -> throw(Error) end. do_db_req(#httpd{user_ctx=UserCtx,path_parts=[DbName|_]}=Req, Fun) -> case couch_db:open(DbName, [{user_ctx, UserCtx}]) of {ok, Db} -> try Fun(Req, Db) after catch couch_db:close(Db) end; Error -> throw(Error) end. db_req(#httpd{method='GET',path_parts=[_DbName]}=Req, Db) -> {ok, DbInfo} = couch_db:get_db_info(Db), send_json(Req, {DbInfo}); db_req(#httpd{method='POST',path_parts=[_DbName]}=Req, Db) -> couch_httpd:validate_ctype(Req, "application/json"), Doc = couch_doc:from_json_obj(couch_httpd:json_body(Req)), validate_attachment_names(Doc), Doc2 = case Doc#doc.id of <<"">> -> Doc#doc{id=couch_uuids:new(), revs={0, []}}; _ -> Doc end, DocId = Doc2#doc.id, update_doc(Req, Db, DocId, Doc2); db_req(#httpd{path_parts=[_DbName]}=Req, _Db) -> send_method_not_allowed(Req, "DELETE,GET,HEAD,POST"); db_req(#httpd{method='POST',path_parts=[_,<<"_ensure_full_commit">>]}=Req, Db) -> couch_httpd:validate_ctype(Req, "application/json"), UpdateSeq = couch_db:get_update_seq(Db), CommittedSeq = couch_db:get_committed_update_seq(Db), {ok, StartTime} = case couch_httpd:qs_value(Req, "seq") of undefined -> couch_db:ensure_full_commit(Db); RequiredStr -> RequiredSeq = list_to_integer(RequiredStr), if RequiredSeq > UpdateSeq -> throw({bad_request, "can't do a full commit ahead of current update_seq"}); RequiredSeq > CommittedSeq -> couch_db:ensure_full_commit(Db); true -> {ok, Db#db.instance_start_time} end end, send_json(Req, 201, {[ {ok, true}, {instance_start_time, StartTime} ]}); db_req(#httpd{path_parts=[_,<<"_ensure_full_commit">>]}=Req, _Db) -> send_method_not_allowed(Req, "POST"); db_req(#httpd{method='POST',path_parts=[_,<<"_bulk_docs">>]}=Req, Db) -> couch_stats_collector:increment({httpd, bulk_requests}), couch_httpd:validate_ctype(Req, "application/json"), {JsonProps} = couch_httpd:json_body_obj(Req), case couch_util:get_value(<<"docs">>, JsonProps) of undefined -> send_error(Req, 400, <<"bad_request">>, <<"Missing JSON list of 'docs'">>); DocsArray -> case couch_httpd:header_value(Req, "X-Couch-Full-Commit") of "true" -> Options = [full_commit]; "false" -> Options = [delay_commit]; _ -> Options = [] end, case couch_util:get_value(<<"new_edits">>, JsonProps, true) of true -> Docs = lists:map( fun({ObjProps} = JsonObj) -> Doc = couch_doc:from_json_obj(JsonObj), validate_attachment_names(Doc), Id = case Doc#doc.id of <<>> -> couch_uuids:new(); Id0 -> Id0 end, case couch_util:get_value(<<"_rev">>, ObjProps) of undefined -> Revs = {0, []}; Rev -> {Pos, RevId} = couch_doc:parse_rev(Rev), Revs = {Pos, [RevId]} end, Doc#doc{id=Id,revs=Revs} end, DocsArray), Options2 = case couch_util:get_value(<<"all_or_nothing">>, JsonProps) of true -> [all_or_nothing|Options]; _ -> Options end, case couch_db:update_docs(Db, Docs, Options2) of {ok, Results} -> % output the results DocResults = lists:zipwith(fun update_doc_result_to_json/2, Docs, Results), send_json(Req, 201, DocResults); {aborted, Errors} -> ErrorsJson = lists:map(fun update_doc_result_to_json/1, Errors), send_json(Req, 417, ErrorsJson) end; false -> Docs = lists:map(fun(JsonObj) -> Doc = couch_doc:from_json_obj(JsonObj), validate_attachment_names(Doc), Doc end, DocsArray), {ok, Errors} = couch_db:update_docs(Db, Docs, Options, replicated_changes), ErrorsJson = lists:map(fun update_doc_result_to_json/1, Errors), send_json(Req, 201, ErrorsJson) end end; db_req(#httpd{path_parts=[_,<<"_bulk_docs">>]}=Req, _Db) -> send_method_not_allowed(Req, "POST"); db_req(#httpd{method='POST',path_parts=[_,<<"_purge">>]}=Req, Db) -> couch_httpd:validate_ctype(Req, "application/json"), {IdsRevs} = couch_httpd:json_body_obj(Req), IdsRevs2 = [{Id, couch_doc:parse_revs(Revs)} || {Id, Revs} <- IdsRevs], case couch_db:purge_docs(Db, IdsRevs2) of {ok, PurgeSeq, PurgedIdsRevs} -> PurgedIdsRevs2 = [{Id, couch_doc:revs_to_strs(Revs)} || {Id, Revs} <- PurgedIdsRevs], send_json(Req, 200, {[{<<"purge_seq">>, PurgeSeq}, {<<"purged">>, {PurgedIdsRevs2}}]}); Error -> throw(Error) end; db_req(#httpd{path_parts=[_,<<"_purge">>]}=Req, _Db) -> send_method_not_allowed(Req, "POST"); db_req(#httpd{method='POST',path_parts=[_,<<"_missing_revs">>]}=Req, Db) -> {JsonDocIdRevs} = couch_httpd:json_body_obj(Req), JsonDocIdRevs2 = [{Id, [couch_doc:parse_rev(RevStr) || RevStr <- RevStrs]} || {Id, RevStrs} <- JsonDocIdRevs], {ok, Results} = couch_db:get_missing_revs(Db, JsonDocIdRevs2), Results2 = [{Id, couch_doc:revs_to_strs(Revs)} || {Id, Revs, _} <- Results], send_json(Req, {[ {missing_revs, {Results2}} ]}); db_req(#httpd{path_parts=[_,<<"_missing_revs">>]}=Req, _Db) -> send_method_not_allowed(Req, "POST"); db_req(#httpd{method='POST',path_parts=[_,<<"_revs_diff">>]}=Req, Db) -> {JsonDocIdRevs} = couch_httpd:json_body_obj(Req), JsonDocIdRevs2 = [{Id, couch_doc:parse_revs(RevStrs)} || {Id, RevStrs} <- JsonDocIdRevs], {ok, Results} = couch_db:get_missing_revs(Db, JsonDocIdRevs2), Results2 = lists:map(fun({Id, MissingRevs, PossibleAncestors}) -> {Id, {[{missing, couch_doc:revs_to_strs(MissingRevs)}] ++ if PossibleAncestors == [] -> []; true -> [{possible_ancestors, couch_doc:revs_to_strs(PossibleAncestors)}] end}} end, Results), send_json(Req, {Results2}); db_req(#httpd{path_parts=[_,<<"_revs_diff">>]}=Req, _Db) -> send_method_not_allowed(Req, "POST"); db_req(#httpd{method='PUT',path_parts=[_,<<"_security">>]}=Req, Db) -> SecObj = couch_httpd:json_body(Req), ok = couch_db:set_security(Db, SecObj), send_json(Req, {[{<<"ok">>, true}]}); db_req(#httpd{method='GET',path_parts=[_,<<"_security">>]}=Req, Db) -> send_json(Req, couch_db:get_security(Db)); db_req(#httpd{path_parts=[_,<<"_security">>]}=Req, _Db) -> send_method_not_allowed(Req, "PUT,GET"); db_req(#httpd{method='PUT',path_parts=[_,<<"_revs_limit">>]}=Req, Db) -> Limit = couch_httpd:json_body(Req), case is_integer(Limit) of true -> ok = couch_db:set_revs_limit(Db, Limit), send_json(Req, {[{<<"ok">>, true}]}); false -> throw({bad_request, <<"Rev limit has to be an integer">>}) end; db_req(#httpd{method='GET',path_parts=[_,<<"_revs_limit">>]}=Req, Db) -> send_json(Req, couch_db:get_revs_limit(Db)); db_req(#httpd{path_parts=[_,<<"_revs_limit">>]}=Req, _Db) -> send_method_not_allowed(Req, "PUT,GET"); % Special case to enable using an unencoded slash in the URL of design docs, % as slashes in document IDs must otherwise be URL encoded. db_req(#httpd{method='GET',mochi_req=MochiReq, path_parts=[DbName,<<"_design/",_/binary>>|_]}=Req, _Db) -> PathFront = "/" ++ couch_httpd:quote(binary_to_list(DbName)) ++ "/", [_|PathTail] = re:split(MochiReq:get(raw_path), "_design%2F", [{return, list}]), couch_httpd:send_redirect(Req, PathFront ++ "_design/" ++ mochiweb_util:join(PathTail, "_design%2F")); db_req(#httpd{path_parts=[_DbName,<<"_design">>,Name]}=Req, Db) -> db_doc_req(Req, Db, <<"_design/",Name/binary>>); db_req(#httpd{path_parts=[_DbName,<<"_design">>,Name|FileNameParts]}=Req, Db) -> db_attachment_req(Req, Db, <<"_design/",Name/binary>>, FileNameParts); % Special case to allow for accessing local documents without %2F % encoding the docid. Throws out requests that don't have the second % path part or that specify an attachment name. db_req(#httpd{path_parts=[_DbName, <<"_local">>]}, _Db) -> throw({bad_request, <<"Invalid _local document id.">>}); db_req(#httpd{path_parts=[_DbName, <<"_local/">>]}, _Db) -> throw({bad_request, <<"Invalid _local document id.">>}); db_req(#httpd{path_parts=[_DbName, <<"_local">>, Name]}=Req, Db) -> db_doc_req(Req, Db, <<"_local/", Name/binary>>); db_req(#httpd{path_parts=[_DbName, <<"_local">> | _Rest]}, _Db) -> throw({bad_request, <<"_local documents do not accept attachments.">>}); db_req(#httpd{path_parts=[_, DocId]}=Req, Db) -> db_doc_req(Req, Db, DocId); db_req(#httpd{path_parts=[_, DocId | FileNameParts]}=Req, Db) -> db_attachment_req(Req, Db, DocId, FileNameParts). db_doc_req(#httpd{method='DELETE'}=Req, Db, DocId) -> % check for the existence of the doc to handle the 404 case. couch_doc_open(Db, DocId, nil, []), case couch_httpd:qs_value(Req, "rev") of undefined -> update_doc(Req, Db, DocId, couch_doc_from_req(Req, DocId, {[{<<"_deleted">>,true}]})); Rev -> update_doc(Req, Db, DocId, couch_doc_from_req(Req, DocId, {[{<<"_rev">>, ?l2b(Rev)},{<<"_deleted">>,true}]})) end; db_doc_req(#httpd{method = 'GET', mochi_req = MochiReq} = Req, Db, DocId) -> #doc_query_args{ rev = Rev, open_revs = Revs, options = Options1, atts_since = AttsSince } = parse_doc_query(Req), Options = case AttsSince of nil -> Options1; RevList when is_list(RevList) -> [{atts_since, RevList}, attachments | Options1] end, case Revs of [] -> Doc = couch_doc_open(Db, DocId, Rev, Options), send_doc(Req, Doc, Options); _ -> {ok, Results} = couch_db:open_doc_revs(Db, DocId, Revs, Options), case MochiReq:accepts_content_type("multipart/mixed") of false -> {ok, Resp} = start_json_response(Req, 200), send_chunk(Resp, "["), % We loop through the docs. The first time through the separator % is whitespace, then a comma on subsequent iterations. lists:foldl( fun(Result, AccSeparator) -> case Result of {ok, Doc} -> JsonDoc = couch_doc:to_json_obj(Doc, Options), Json = ?JSON_ENCODE({[{ok, JsonDoc}]}), send_chunk(Resp, AccSeparator ++ Json); {{not_found, missing}, RevId} -> RevStr = couch_doc:rev_to_str(RevId), Json = ?JSON_ENCODE({[{"missing", RevStr}]}), send_chunk(Resp, AccSeparator ++ Json) end, "," % AccSeparator now has a comma end, "", Results), send_chunk(Resp, "]"), end_json_response(Resp); true -> send_docs_multipart(Req, Results, Options) end end; db_doc_req(#httpd{method='POST'}=Req, Db, DocId) -> couch_httpd:validate_referer(Req), couch_doc:validate_docid(DocId), couch_httpd:validate_ctype(Req, "multipart/form-data"), Form = couch_httpd:parse_form(Req), case couch_util:get_value("_doc", Form) of undefined -> Rev = couch_doc:parse_rev(couch_util:get_value("_rev", Form)), {ok, [{ok, Doc}]} = couch_db:open_doc_revs(Db, DocId, [Rev], []); Json -> Doc = couch_doc_from_req(Req, DocId, ?JSON_DECODE(Json)) end, UpdatedAtts = [ #att{name=validate_attachment_name(Name), type=list_to_binary(ContentType), data=Content} || {Name, {ContentType, _}, Content} <- proplists:get_all_values("_attachments", Form) ], #doc{atts=OldAtts} = Doc, OldAtts2 = lists:flatmap( fun(#att{name=OldName}=Att) -> case [1 || A <- UpdatedAtts, A#att.name == OldName] of [] -> [Att]; % the attachment wasn't in the UpdatedAtts, return it _ -> [] % the attachment was in the UpdatedAtts, drop it end end, OldAtts), NewDoc = Doc#doc{ atts = UpdatedAtts ++ OldAtts2 }, update_doc(Req, Db, DocId, NewDoc); db_doc_req(#httpd{method='PUT'}=Req, Db, DocId) -> couch_doc:validate_docid(DocId), case couch_util:to_list(couch_httpd:header_value(Req, "Content-Type")) of ("multipart/related;" ++ _) = ContentType -> {ok, Doc0, WaitFun, Parser} = couch_doc:doc_from_multi_part_stream( ContentType, fun() -> receive_request_data(Req) end), Doc = couch_doc_from_req(Req, DocId, Doc0), try Result = update_doc(Req, Db, DocId, Doc), WaitFun(), Result catch throw:Err -> % Document rejected by a validate_doc_update function. couch_doc:abort_multi_part_stream(Parser), throw(Err) end; _Else -> Body = couch_httpd:json_body(Req), Doc = couch_doc_from_req(Req, DocId, Body), update_doc(Req, Db, DocId, Doc) end; db_doc_req(#httpd{method='COPY'}=Req, Db, SourceDocId) -> SourceRev = case extract_header_rev(Req, couch_httpd:qs_value(Req, "rev")) of missing_rev -> nil; Rev -> Rev end, {TargetDocId, TargetRevs} = parse_copy_destination_header(Req), % open old doc Doc = couch_doc_open(Db, SourceDocId, SourceRev, []), % save new doc update_doc(Req, Db, TargetDocId, Doc#doc{id=TargetDocId, revs=TargetRevs}); db_doc_req(Req, _Db, _DocId) -> send_method_not_allowed(Req, "DELETE,GET,HEAD,POST,PUT,COPY"). send_doc(Req, Doc, Options) -> case Doc#doc.meta of [] -> DiskEtag = couch_httpd:doc_etag(Doc), % output etag only when we have no meta couch_httpd:etag_respond(Req, DiskEtag, fun() -> send_doc_efficiently(Req, Doc, [{"ETag", DiskEtag}], Options) end); _ -> send_doc_efficiently(Req, Doc, [], Options) end. send_doc_efficiently(Req, #doc{atts=[]}=Doc, Headers, Options) -> send_json(Req, 200, Headers, couch_doc:to_json_obj(Doc, Options)); send_doc_efficiently(#httpd{mochi_req = MochiReq} = Req, #doc{atts = Atts} = Doc, Headers, Options) -> case lists:member(attachments, Options) of true -> case MochiReq:accepts_content_type("multipart/related") of false -> send_json(Req, 200, Headers, couch_doc:to_json_obj(Doc, Options)); true -> Boundary = couch_uuids:random(), JsonBytes = ?JSON_ENCODE(couch_doc:to_json_obj(Doc, [attachments, follows, att_encoding_info | Options])), {ContentType, Len} = couch_doc:len_doc_to_multi_part_stream( Boundary,JsonBytes, Atts, true), CType = {"Content-Type", ?b2l(ContentType)}, {ok, Resp} = start_response_length(Req, 200, [CType|Headers], Len), couch_doc:doc_to_multi_part_stream(Boundary,JsonBytes,Atts, fun(Data) -> couch_httpd:send(Resp, Data) end, true) end; false -> send_json(Req, 200, Headers, couch_doc:to_json_obj(Doc, Options)) end. send_docs_multipart(Req, Results, Options1) -> OuterBoundary = couch_uuids:random(), InnerBoundary = couch_uuids:random(), Options = [attachments, follows, att_encoding_info | Options1], CType = {"Content-Type", "multipart/mixed; boundary=\"" ++ ?b2l(OuterBoundary) ++ "\""}, {ok, Resp} = start_chunked_response(Req, 200, [CType]), couch_httpd:send_chunk(Resp, <<"--", OuterBoundary/binary>>), lists:foreach( fun({ok, #doc{atts=Atts}=Doc}) -> JsonBytes = ?JSON_ENCODE(couch_doc:to_json_obj(Doc, Options)), {ContentType, _Len} = couch_doc:len_doc_to_multi_part_stream( InnerBoundary, JsonBytes, Atts, true), couch_httpd:send_chunk(Resp, <<"\r\nContent-Type: ", ContentType/binary, "\r\n\r\n">>), couch_doc:doc_to_multi_part_stream(InnerBoundary, JsonBytes, Atts, fun(Data) -> couch_httpd:send_chunk(Resp, Data) end, true), couch_httpd:send_chunk(Resp, <<"\r\n--", OuterBoundary/binary>>); ({{not_found, missing}, RevId}) -> RevStr = couch_doc:rev_to_str(RevId), Json = ?JSON_ENCODE({[{"missing", RevStr}]}), couch_httpd:send_chunk(Resp, [<<"\r\nContent-Type: application/json; error=\"true\"\r\n\r\n">>, Json, <<"\r\n--", OuterBoundary/binary>>]) end, Results), couch_httpd:send_chunk(Resp, <<"--">>), couch_httpd:last_chunk(Resp). send_ranges_multipart(Req, ContentType, Len, Att, Ranges) -> Boundary = couch_uuids:random(), CType = {"Content-Type", "multipart/byteranges; boundary=\"" ++ ?b2l(Boundary) ++ "\""}, {ok, Resp} = start_chunked_response(Req, 206, [CType]), couch_httpd:send_chunk(Resp, <<"--", Boundary/binary>>), lists:foreach(fun({From, To}) -> ContentRange = ?l2b(make_content_range(From, To, Len)), couch_httpd:send_chunk(Resp, <<"\r\nContent-Type: ", ContentType/binary, "\r\n", "Content-Range: ", ContentRange/binary, "\r\n", "\r\n">>), couch_doc:range_att_foldl(Att, From, To + 1, fun(Seg, _) -> send_chunk(Resp, Seg) end, {ok, Resp}), couch_httpd:send_chunk(Resp, <<"\r\n--", Boundary/binary>>) end, Ranges), couch_httpd:send_chunk(Resp, <<"--">>), couch_httpd:last_chunk(Resp), {ok, Resp}. receive_request_data(Req) -> receive_request_data(Req, couch_httpd:body_length(Req)). receive_request_data(Req, LenLeft) when LenLeft > 0 -> Len = erlang:min(4096, LenLeft), Data = couch_httpd:recv(Req, Len), {Data, fun() -> receive_request_data(Req, LenLeft - iolist_size(Data)) end}; receive_request_data(_Req, _) -> throw(<<"expected more data">>). make_content_range(From, To, Len) -> io_lib:format("bytes ~B-~B/~B", [From, To, Len]). update_doc_result_to_json({{Id, Rev}, Error}) -> {_Code, Err, Msg} = couch_httpd:error_info(Error), {[{id, Id}, {rev, couch_doc:rev_to_str(Rev)}, {error, Err}, {reason, Msg}]}. update_doc_result_to_json(#doc{id=DocId}, Result) -> update_doc_result_to_json(DocId, Result); update_doc_result_to_json(DocId, {ok, NewRev}) -> {[{ok, true}, {id, DocId}, {rev, couch_doc:rev_to_str(NewRev)}]}; update_doc_result_to_json(DocId, Error) -> {_Code, ErrorStr, Reason} = couch_httpd:error_info(Error), {[{id, DocId}, {error, ErrorStr}, {reason, Reason}]}. update_doc(Req, Db, DocId, #doc{deleted=false}=Doc) -> Loc = absolute_uri(Req, "/" ++ ?b2l(Db#db.name) ++ "/" ++ ?b2l(DocId)), update_doc(Req, Db, DocId, Doc, [{"Location", Loc}]); update_doc(Req, Db, DocId, Doc) -> update_doc(Req, Db, DocId, Doc, []). update_doc(Req, Db, DocId, Doc, Headers) -> #doc_query_args{ update_type = UpdateType } = parse_doc_query(Req), update_doc(Req, Db, DocId, Doc, Headers, UpdateType). update_doc(Req, Db, DocId, #doc{deleted=Deleted}=Doc, Headers, UpdateType) -> case couch_httpd:header_value(Req, "X-Couch-Full-Commit") of "true" -> Options = [full_commit]; "false" -> Options = [delay_commit]; _ -> Options = [] end, case couch_httpd:qs_value(Req, "batch") of "ok" -> % async batching spawn(fun() -> case catch(couch_db:update_doc(Db, Doc, Options, UpdateType)) of {ok, _} -> ok; Error -> ?LOG_INFO("Batch doc error (~s): ~p",[DocId, Error]) end end), send_json(Req, 202, Headers, {[ {ok, true}, {id, DocId} ]}); _Normal -> % normal {ok, NewRev} = couch_db:update_doc(Db, Doc, Options, UpdateType), NewRevStr = couch_doc:rev_to_str(NewRev), ResponseHeaders = [{"ETag", <<"\"", NewRevStr/binary, "\"">>}] ++ Headers, send_json(Req, if Deleted orelse Req#httpd.method == 'DELETE' -> 200; true -> 201 end, ResponseHeaders, {[ {ok, true}, {id, DocId}, {rev, NewRevStr}]}) end. couch_doc_from_req(Req, DocId, #doc{revs=Revs}=Doc) -> validate_attachment_names(Doc), Rev = case couch_httpd:qs_value(Req, "rev") of undefined -> undefined; QSRev -> couch_doc:parse_rev(QSRev) end, Revs2 = case Revs of {Start, [RevId|_]} -> if Rev /= undefined andalso Rev /= {Start, RevId} -> throw({bad_request, "Document rev from request body and query " "string have different values"}); true -> case extract_header_rev(Req, {Start, RevId}) of missing_rev -> {0, []}; _ -> Revs end end; _ -> case extract_header_rev(Req, Rev) of missing_rev -> {0, []}; {Pos, RevId2} -> {Pos, [RevId2]} end end, Doc#doc{id=DocId, revs=Revs2}; couch_doc_from_req(Req, DocId, Json) -> couch_doc_from_req(Req, DocId, couch_doc:from_json_obj(Json)). % Useful for debugging % couch_doc_open(Db, DocId) -> % couch_doc_open(Db, DocId, nil, []). couch_doc_open(Db, DocId, Rev, Options) -> case Rev of nil -> % open most recent rev case couch_db:open_doc(Db, DocId, Options) of {ok, Doc} -> Doc; Error -> throw(Error) end; _ -> % open a specific rev (deletions come back as stubs) case couch_db:open_doc_revs(Db, DocId, [Rev], Options) of {ok, [{ok, Doc}]} -> Doc; {ok, [{{not_found, missing}, Rev}]} -> throw(not_found); {ok, [Else]} -> throw(Else) end end. % Attachment request handlers db_attachment_req(#httpd{method='GET',mochi_req=MochiReq}=Req, Db, DocId, FileNameParts) -> FileName = list_to_binary(mochiweb_util:join(lists:map(fun binary_to_list/1, FileNameParts),"/")), #doc_query_args{ rev=Rev, options=Options } = parse_doc_query(Req), #doc{ atts=Atts } = Doc = couch_doc_open(Db, DocId, Rev, Options), case [A || A <- Atts, A#att.name == FileName] of [] -> throw({not_found, "Document is missing attachment"}); [#att{type=Type, encoding=Enc, disk_len=DiskLen, att_len=AttLen}=Att] -> Etag = case Att#att.md5 of <<>> -> couch_httpd:doc_etag(Doc); Md5 -> "\"" ++ ?b2l(base64:encode(Md5)) ++ "\"" end, ReqAcceptsAttEnc = lists:member( atom_to_list(Enc), couch_httpd:accepted_encodings(Req) ), Len = case {Enc, ReqAcceptsAttEnc} of {identity, _} -> % stored and served in identity form DiskLen; {_, false} when DiskLen =/= AttLen -> % Stored encoded, but client doesn't accept the encoding we used, % so we need to decode on the fly. DiskLen is the identity length % of the attachment. DiskLen; {_, true} -> % Stored and served encoded. AttLen is the encoded length. AttLen; _ -> % We received an encoded attachment and stored it as such, so we % don't know the identity length. The client doesn't accept the % encoding, and since we cannot serve a correct Content-Length % header we'll fall back to a chunked response. undefined end, Headers = [ {"ETag", Etag}, {"Cache-Control", "must-revalidate"}, {"Content-Type", binary_to_list(Type)} ] ++ case ReqAcceptsAttEnc of true when Enc =/= identity -> % RFC 2616 says that the 'identify' encoding should not be used in % the Content-Encoding header [{"Content-Encoding", atom_to_list(Enc)}]; _ -> [] end ++ case Enc of identity -> [{"Accept-Ranges", "bytes"}]; _ -> [{"Accept-Ranges", "none"}] end, AttFun = case ReqAcceptsAttEnc of false -> fun couch_doc:att_foldl_decode/3; true -> fun couch_doc:att_foldl/3 end, couch_httpd:etag_respond( Req, Etag, fun() -> case Len of undefined -> {ok, Resp} = start_chunked_response(Req, 200, Headers), AttFun(Att, fun(Seg, _) -> send_chunk(Resp, Seg) end, {ok, Resp}), last_chunk(Resp); _ -> Ranges = parse_ranges(MochiReq:get(range), Len), case {Enc, Ranges} of {identity, [{From, To}]} -> Headers1 = [{"Content-Range", make_content_range(From, To, Len)}] ++ Headers, {ok, Resp} = start_response_length(Req, 206, Headers1, To - From + 1), couch_doc:range_att_foldl(Att, From, To + 1, fun(Seg, _) -> send(Resp, Seg) end, {ok, Resp}); {identity, Ranges} when is_list(Ranges) andalso length(Ranges) < 10 -> send_ranges_multipart(Req, Type, Len, Att, Ranges); _ -> Headers1 = Headers ++ if Enc =:= identity orelse ReqAcceptsAttEnc =:= true -> [{"Content-MD5", base64:encode(Att#att.md5)}]; true -> [] end, {ok, Resp} = start_response_length(Req, 200, Headers1, Len), AttFun(Att, fun(Seg, _) -> send(Resp, Seg) end, {ok, Resp}) end end end ) end; db_attachment_req(#httpd{method=Method,mochi_req=MochiReq}=Req, Db, DocId, FileNameParts) when (Method == 'PUT') or (Method == 'DELETE') -> FileName = validate_attachment_name( mochiweb_util:join( lists:map(fun binary_to_list/1, FileNameParts),"/")), NewAtt = case Method of 'DELETE' -> []; _ -> [#att{ name = FileName, type = case couch_httpd:header_value(Req,"Content-Type") of undefined -> % We could throw an error here or guess by the FileName. % Currently, just giving it a default. <<"application/octet-stream">>; CType -> list_to_binary(CType) end, data = case couch_httpd:body_length(Req) of undefined -> <<"">>; {unknown_transfer_encoding, Unknown} -> exit({unknown_transfer_encoding, Unknown}); chunked -> fun(MaxChunkSize, ChunkFun, InitState) -> couch_httpd:recv_chunked(Req, MaxChunkSize, ChunkFun, InitState) end; 0 -> <<"">>; Length when is_integer(Length) -> Expect = case couch_httpd:header_value(Req, "expect") of undefined -> undefined; Value when is_list(Value) -> string:to_lower(Value) end, case Expect of "100-continue" -> MochiReq:start_raw_response({100, gb_trees:empty()}); _Else -> ok end, fun(Size) -> couch_httpd:recv(Req, Size) end end, att_len = case couch_httpd:header_value(Req,"Content-Length") of undefined -> undefined; Length -> list_to_integer(Length) end, md5 = get_md5_header(Req), encoding = case string:to_lower(string:strip( couch_httpd:header_value(Req,"Content-Encoding","identity") )) of "identity" -> identity; "gzip" -> gzip; _ -> throw({ bad_ctype, "Only gzip and identity content-encodings are supported" }) end }] end, Doc = case extract_header_rev(Req, couch_httpd:qs_value(Req, "rev")) of missing_rev -> % make the new doc couch_doc:validate_docid(DocId), #doc{id=DocId}; Rev -> case couch_db:open_doc_revs(Db, DocId, [Rev], []) of {ok, [{ok, Doc0}]} -> Doc0; {ok, [{{not_found, missing}, Rev}]} -> throw(conflict); {ok, [Error]} -> throw(Error) end end, #doc{atts=Atts} = Doc, DocEdited = Doc#doc{ atts = NewAtt ++ [A || A <- Atts, A#att.name /= FileName] }, Headers = case Method of 'DELETE' -> []; _ -> [{"Location", absolute_uri(Req, "/" ++ ?b2l(Db#db.name) ++ "/" ++ ?b2l(DocId) ++ "/" ++ ?b2l(FileName) )}] end, update_doc(Req, Db, DocId, DocEdited, Headers); db_attachment_req(Req, _Db, _DocId, _FileNameParts) -> send_method_not_allowed(Req, "DELETE,GET,HEAD,PUT"). parse_ranges(undefined, _Len) -> undefined; parse_ranges(fail, _Len) -> undefined; parse_ranges(Ranges, Len) -> parse_ranges(Ranges, Len, []). parse_ranges([], _Len, Acc) -> lists:reverse(Acc); parse_ranges([{0, none}|_], _Len, _Acc) -> undefined; parse_ranges([{From, To}|_], _Len, _Acc) when is_integer(From) andalso is_integer(To) andalso To < From -> throw(requested_range_not_satisfiable); parse_ranges([{From, To}|Rest], Len, Acc) when is_integer(To) andalso To >= Len -> parse_ranges([{From, Len-1}] ++ Rest, Len, Acc); parse_ranges([{none, To}|Rest], Len, Acc) -> parse_ranges([{Len - To, Len - 1}] ++ Rest, Len, Acc); parse_ranges([{From, none}|Rest], Len, Acc) -> parse_ranges([{From, Len - 1}] ++ Rest, Len, Acc); parse_ranges([{From,To}|Rest], Len, Acc) -> parse_ranges(Rest, Len, [{From, To}] ++ Acc). get_md5_header(Req) -> ContentMD5 = couch_httpd:header_value(Req, "Content-MD5"), Length = couch_httpd:body_length(Req), Trailer = couch_httpd:header_value(Req, "Trailer"), case {ContentMD5, Length, Trailer} of _ when is_list(ContentMD5) orelse is_binary(ContentMD5) -> base64:decode(ContentMD5); {_, chunked, undefined} -> <<>>; {_, chunked, _} -> case re:run(Trailer, "\\bContent-MD5\\b", [caseless]) of {match, _} -> md5_in_footer; _ -> <<>> end; _ -> <<>> end. parse_doc_query(Req) -> lists:foldl(fun({Key,Value}, Args) -> case {Key, Value} of {"attachments", "true"} -> Options = [attachments | Args#doc_query_args.options], Args#doc_query_args{options=Options}; {"meta", "true"} -> Options = [revs_info, conflicts, deleted_conflicts | Args#doc_query_args.options], Args#doc_query_args{options=Options}; {"revs", "true"} -> Options = [revs | Args#doc_query_args.options], Args#doc_query_args{options=Options}; {"local_seq", "true"} -> Options = [local_seq | Args#doc_query_args.options], Args#doc_query_args{options=Options}; {"revs_info", "true"} -> Options = [revs_info | Args#doc_query_args.options], Args#doc_query_args{options=Options}; {"conflicts", "true"} -> Options = [conflicts | Args#doc_query_args.options], Args#doc_query_args{options=Options}; {"deleted_conflicts", "true"} -> Options = [deleted_conflicts | Args#doc_query_args.options], Args#doc_query_args{options=Options}; {"rev", Rev} -> Args#doc_query_args{rev=couch_doc:parse_rev(Rev)}; {"open_revs", "all"} -> Args#doc_query_args{open_revs=all}; {"open_revs", RevsJsonStr} -> JsonArray = ?JSON_DECODE(RevsJsonStr), Args#doc_query_args{open_revs=couch_doc:parse_revs(JsonArray)}; {"latest", "true"} -> Options = [latest | Args#doc_query_args.options], Args#doc_query_args{options=Options}; {"atts_since", RevsJsonStr} -> JsonArray = ?JSON_DECODE(RevsJsonStr), Args#doc_query_args{atts_since = couch_doc:parse_revs(JsonArray)}; {"new_edits", "false"} -> Args#doc_query_args{update_type=replicated_changes}; {"new_edits", "true"} -> Args#doc_query_args{update_type=interactive_edit}; {"att_encoding_info", "true"} -> Options = [att_encoding_info | Args#doc_query_args.options], Args#doc_query_args{options=Options}; _Else -> % unknown key value pair, ignore. Args end end, #doc_query_args{}, couch_httpd:qs(Req)). parse_changes_query(Req, Db) -> ChangesArgs = lists:foldl(fun({Key, Value}, Args) -> case {string:to_lower(Key), Value} of {"feed", _} -> Args#changes_args{feed=Value}; {"descending", "true"} -> Args#changes_args{dir=rev}; {"since", "now"} -> UpdateSeq = couch_util:with_db(Db#db.name, fun(WDb) -> couch_db:get_update_seq(WDb) end), Args#changes_args{since=UpdateSeq}; {"since", _} -> Args#changes_args{since=list_to_integer(Value)}; {"last-event-id", _} -> Args#changes_args{since=list_to_integer(Value)}; {"limit", _} -> Args#changes_args{limit=list_to_integer(Value)}; {"style", _} -> Args#changes_args{style=list_to_existing_atom(Value)}; {"heartbeat", "true"} -> Args#changes_args{heartbeat=true}; {"heartbeat", _} -> Args#changes_args{heartbeat=list_to_integer(Value)}; {"timeout", _} -> Args#changes_args{timeout=list_to_integer(Value)}; {"include_docs", "true"} -> Args#changes_args{include_docs=true}; {"attachments", "true"} -> Opts = Args#changes_args.doc_options, Args#changes_args{doc_options=[attachments|Opts]}; {"att_encoding_info", "true"} -> Opts = Args#changes_args.doc_options, Args#changes_args{doc_options=[att_encoding_info|Opts]}; {"conflicts", "true"} -> Args#changes_args{conflicts=true}; {"filter", _} -> Args#changes_args{filter=Value}; _Else -> % unknown key value pair, ignore. Args end end, #changes_args{}, couch_httpd:qs(Req)), %% if it's an EventSource request with a Last-event-ID header %% that should override the `since` query string, since it's %% probably the browser reconnecting. case ChangesArgs#changes_args.feed of "eventsource" -> case couch_httpd:header_value(Req, "last-event-id") of undefined -> ChangesArgs; Value -> ChangesArgs#changes_args{since=list_to_integer(Value)} end; _ -> ChangesArgs end. extract_header_rev(Req, ExplicitRev) when is_binary(ExplicitRev) or is_list(ExplicitRev)-> extract_header_rev(Req, couch_doc:parse_rev(ExplicitRev)); extract_header_rev(Req, ExplicitRev) -> Etag = case couch_httpd:header_value(Req, "If-Match") of undefined -> undefined; Value -> couch_doc:parse_rev(string:strip(Value, both, $")) end, case {ExplicitRev, Etag} of {undefined, undefined} -> missing_rev; {_, undefined} -> ExplicitRev; {undefined, _} -> Etag; _ when ExplicitRev == Etag -> Etag; _ -> throw({bad_request, "Document rev and etag have different values"}) end. parse_copy_destination_header(Req) -> case couch_httpd:header_value(Req, "Destination") of undefined -> throw({bad_request, "Destination header is mandatory for COPY."}); Destination -> case re:run(Destination, "^https?://", [{capture, none}]) of match -> throw({bad_request, "Destination URL must be relative."}); nomatch -> % see if ?rev=revid got appended to the Destination header case re:run(Destination, "\\?", [{capture, none}]) of nomatch -> {list_to_binary(Destination), {0, []}}; match -> [DocId, RevQs] = re:split(Destination, "\\?", [{return, list}]), [_RevQueryKey, Rev] = re:split(RevQs, "=", [{return, list}]), {Pos, RevId} = couch_doc:parse_rev(Rev), {list_to_binary(DocId), {Pos, [RevId]}} end end end. validate_attachment_names(Doc) -> lists:foreach(fun(#att{name=Name}) -> validate_attachment_name(Name) end, Doc#doc.atts). validate_attachment_name(Name) when is_list(Name) -> validate_attachment_name(list_to_binary(Name)); validate_attachment_name(<<"_",_/binary>>) -> throw({bad_request, <<"Attachment name can't start with '_'">>}); validate_attachment_name(Name) -> case couch_util:validate_utf8(Name) of true -> Name; false -> throw({bad_request, <<"Attachment name is not UTF-8 encoded">>}) end. apache-couchdb-1.6.0/src/couchdb/couch_uuids.erl0000644000175000001440000000601512332105522021534 0ustar00djcusers00000000000000% Licensed under the Apache License, Version 2.0 (the "License"); you may not % use this file except in compliance with the License. You may obtain a copy of % the License at % % http://www.apache.org/licenses/LICENSE-2.0 % % Unless required by applicable law or agreed to in writing, software % distributed under the License is distributed on an "AS IS" BASIS, WITHOUT % WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the % License for the specific language governing permissions and limitations under % the License. -module(couch_uuids). -include("couch_db.hrl"). -behaviour(gen_server). -export([start/0, stop/0]). -export([new/0, random/0, utc_random/0]). -export([init/1, terminate/2, code_change/3]). -export([handle_call/3, handle_cast/2, handle_info/2]). start() -> gen_server:start_link({local, ?MODULE}, ?MODULE, [], []). stop() -> gen_server:cast(?MODULE, stop). new() -> gen_server:call(?MODULE, create). random() -> list_to_binary(couch_util:to_hex(crypto:rand_bytes(16))). utc_random() -> utc_suffix(couch_util:to_hex(crypto:rand_bytes(9))). utc_suffix(Suffix) -> Now = {_, _, Micro} = now(), Nowish = calendar:now_to_universal_time(Now), Nowsecs = calendar:datetime_to_gregorian_seconds(Nowish), Then = calendar:datetime_to_gregorian_seconds({{1970, 1, 1}, {0, 0, 0}}), Prefix = io_lib:format("~14.16.0b", [(Nowsecs - Then) * 1000000 + Micro]), list_to_binary(Prefix ++ Suffix). init([]) -> ok = couch_config:register( fun("uuids", _) -> gen_server:cast(?MODULE, change) end ), {ok, state()}. terminate(_Reason, _State) -> ok. handle_call(create, _From, random) -> {reply, random(), random}; handle_call(create, _From, utc_random) -> {reply, utc_random(), utc_random}; handle_call(create, _From, {utc_id, UtcIdSuffix}) -> {reply, utc_suffix(UtcIdSuffix), {utc_id, UtcIdSuffix}}; handle_call(create, _From, {sequential, Pref, Seq}) -> Result = ?l2b(Pref ++ io_lib:format("~6.16.0b", [Seq])), case Seq >= 16#fff000 of true -> {reply, Result, {sequential, new_prefix(), inc()}}; _ -> {reply, Result, {sequential, Pref, Seq + inc()}} end. handle_cast(change, _State) -> {noreply, state()}; handle_cast(stop, State) -> {stop, normal, State}; handle_cast(_Msg, State) -> {noreply, State}. handle_info(_Info, State) -> {noreply, State}. code_change(_OldVsn, State, _Extra) -> {ok, State}. new_prefix() -> couch_util:to_hex((crypto:rand_bytes(13))). inc() -> crypto:rand_uniform(1, 16#ffe). state() -> AlgoStr = couch_config:get("uuids", "algorithm", "random"), case couch_util:to_existing_atom(AlgoStr) of random -> random; utc_random -> utc_random; utc_id -> UtcIdSuffix = couch_config:get("uuids", "utc_id_suffix", ""), {utc_id, UtcIdSuffix}; sequential -> {sequential, new_prefix(), inc()}; Unknown -> throw({unknown_uuid_algorithm, Unknown}) end. apache-couchdb-1.6.0/src/couchdb/couch_auth_cache.erl0000644000175000001440000003130612332105522022470 0ustar00djcusers00000000000000% Licensed under the Apache License, Version 2.0 (the "License"); you may not % use this file except in compliance with the License. You may obtain a copy of % the License at % % http://www.apache.org/licenses/LICENSE-2.0 % % Unless required by applicable law or agreed to in writing, software % distributed under the License is distributed on an "AS IS" BASIS, WITHOUT % WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the % License for the specific language governing permissions and limitations under % the License. -module(couch_auth_cache). -behaviour(gen_server). % public API -export([get_user_creds/1]). % gen_server API -export([start_link/0, init/1, handle_call/3, handle_info/2, handle_cast/2]). -export([code_change/3, terminate/2]). -include("couch_db.hrl"). -include("couch_js_functions.hrl"). -define(STATE, auth_state_ets). -define(BY_USER, auth_by_user_ets). -define(BY_ATIME, auth_by_atime_ets). -record(state, { max_cache_size = 0, cache_size = 0, db_notifier = nil, db_mon_ref = nil }). -spec get_user_creds(UserName::string() | binary()) -> Credentials::list() | nil. get_user_creds(UserName) when is_list(UserName) -> get_user_creds(?l2b(UserName)); get_user_creds(UserName) -> UserCreds = case couch_config:get("admins", ?b2l(UserName)) of "-hashed-" ++ HashedPwdAndSalt -> % the name is an admin, now check to see if there is a user doc % which has a matching name, salt, and password_sha [HashedPwd, Salt] = string:tokens(HashedPwdAndSalt, ","), case get_from_cache(UserName) of nil -> make_admin_doc(HashedPwd, Salt, []); UserProps when is_list(UserProps) -> make_admin_doc(HashedPwd, Salt, couch_util:get_value(<<"roles">>, UserProps)) end; "-pbkdf2-" ++ HashedPwdSaltAndIterations -> [HashedPwd, Salt, Iterations] = string:tokens(HashedPwdSaltAndIterations, ","), case get_from_cache(UserName) of nil -> make_admin_doc(HashedPwd, Salt, Iterations, []); UserProps when is_list(UserProps) -> make_admin_doc(HashedPwd, Salt, Iterations, couch_util:get_value(<<"roles">>, UserProps)) end; _Else -> get_from_cache(UserName) end, validate_user_creds(UserCreds). make_admin_doc(HashedPwd, Salt, ExtraRoles) -> [{<<"roles">>, [<<"_admin">>|ExtraRoles]}, {<<"salt">>, ?l2b(Salt)}, {<<"password_scheme">>, <<"simple">>}, {<<"password_sha">>, ?l2b(HashedPwd)}]. make_admin_doc(DerivedKey, Salt, Iterations, ExtraRoles) -> [{<<"roles">>, [<<"_admin">>|ExtraRoles]}, {<<"salt">>, ?l2b(Salt)}, {<<"iterations">>, list_to_integer(Iterations)}, {<<"password_scheme">>, <<"pbkdf2">>}, {<<"derived_key">>, ?l2b(DerivedKey)}]. get_from_cache(UserName) -> exec_if_auth_db( fun(_AuthDb) -> maybe_refresh_cache(), case ets:lookup(?BY_USER, UserName) of [] -> gen_server:call(?MODULE, {fetch, UserName}, infinity); [{UserName, {Credentials, _ATime}}] -> couch_stats_collector:increment({couchdb, auth_cache_hits}), gen_server:cast(?MODULE, {cache_hit, UserName}), Credentials end end, nil ). validate_user_creds(nil) -> nil; validate_user_creds(UserCreds) -> case couch_util:get_value(<<"_conflicts">>, UserCreds) of undefined -> ok; _ConflictList -> throw({unauthorized, <<"User document conflicts must be resolved before the document", " is used for authentication purposes.">> }) end, UserCreds. start_link() -> gen_server:start_link({local, ?MODULE}, ?MODULE, [], []). init(_) -> ?STATE = ets:new(?STATE, [set, protected, named_table]), ?BY_USER = ets:new(?BY_USER, [set, protected, named_table]), ?BY_ATIME = ets:new(?BY_ATIME, [ordered_set, private, named_table]), process_flag(trap_exit, true), ok = couch_config:register( fun("couch_httpd_auth", "auth_cache_size", SizeList) -> Size = list_to_integer(SizeList), ok = gen_server:call(?MODULE, {new_max_cache_size, Size}, infinity); ("couch_httpd_auth", "authentication_db", _DbName) -> ok = gen_server:call(?MODULE, reinit_cache, infinity) end ), {ok, Notifier} = couch_db_update_notifier:start_link(fun handle_db_event/1), State = #state{ db_notifier = Notifier, max_cache_size = list_to_integer( couch_config:get("couch_httpd_auth", "auth_cache_size", "50") ) }, {ok, reinit_cache(State)}. handle_db_event({Event, DbName}) -> [{auth_db_name, AuthDbName}] = ets:lookup(?STATE, auth_db_name), case DbName =:= AuthDbName of true -> case Event of created -> gen_server:call(?MODULE, reinit_cache, infinity); compacted -> gen_server:call(?MODULE, auth_db_compacted, infinity); _Else -> ok end; false -> ok end. handle_call(reinit_cache, _From, State) -> catch erlang:demonitor(State#state.db_mon_ref, [flush]), exec_if_auth_db(fun(AuthDb) -> catch couch_db:close(AuthDb) end), {reply, ok, reinit_cache(State)}; handle_call(auth_db_compacted, _From, State) -> exec_if_auth_db( fun(AuthDb) -> true = ets:insert(?STATE, {auth_db, reopen_auth_db(AuthDb)}) end ), {reply, ok, State}; handle_call({new_max_cache_size, NewSize}, _From, #state{cache_size = Size} = State) when NewSize >= Size -> {reply, ok, State#state{max_cache_size = NewSize}}; handle_call({new_max_cache_size, NewSize}, _From, State) -> free_mru_cache_entries(State#state.cache_size - NewSize), {reply, ok, State#state{max_cache_size = NewSize, cache_size = NewSize}}; handle_call({fetch, UserName}, _From, State) -> {Credentials, NewState} = case ets:lookup(?BY_USER, UserName) of [{UserName, {Creds, ATime}}] -> couch_stats_collector:increment({couchdb, auth_cache_hits}), cache_hit(UserName, Creds, ATime), {Creds, State}; [] -> couch_stats_collector:increment({couchdb, auth_cache_misses}), Creds = get_user_props_from_db(UserName), State1 = add_cache_entry(UserName, Creds, erlang:now(), State), {Creds, State1} end, {reply, Credentials, NewState}; handle_call(refresh, _From, State) -> exec_if_auth_db(fun refresh_entries/1), {reply, ok, State}. handle_cast({cache_hit, UserName}, State) -> case ets:lookup(?BY_USER, UserName) of [{UserName, {Credentials, ATime}}] -> cache_hit(UserName, Credentials, ATime); _ -> ok end, {noreply, State}. handle_info({'DOWN', Ref, _, _, _Reason}, #state{db_mon_ref = Ref} = State) -> {noreply, reinit_cache(State)}. terminate(_Reason, #state{db_notifier = Notifier}) -> couch_db_update_notifier:stop(Notifier), exec_if_auth_db(fun(AuthDb) -> catch couch_db:close(AuthDb) end), true = ets:delete(?BY_USER), true = ets:delete(?BY_ATIME), true = ets:delete(?STATE). code_change(_OldVsn, State, _Extra) -> {ok, State}. clear_cache(State) -> exec_if_auth_db(fun(AuthDb) -> catch couch_db:close(AuthDb) end), true = ets:delete_all_objects(?BY_USER), true = ets:delete_all_objects(?BY_ATIME), State#state{cache_size = 0}. reinit_cache(State) -> NewState = clear_cache(State), AuthDbName = ?l2b(couch_config:get("couch_httpd_auth", "authentication_db")), true = ets:insert(?STATE, {auth_db_name, AuthDbName}), AuthDb = open_auth_db(), true = ets:insert(?STATE, {auth_db, AuthDb}), NewState#state{db_mon_ref = couch_db:monitor(AuthDb)}. add_cache_entry(_, _, _, #state{max_cache_size = 0} = State) -> State; add_cache_entry(UserName, Credentials, ATime, State) -> case State#state.cache_size >= State#state.max_cache_size of true -> free_mru_cache_entry(); false -> ok end, true = ets:insert(?BY_ATIME, {ATime, UserName}), true = ets:insert(?BY_USER, {UserName, {Credentials, ATime}}), State#state{cache_size = couch_util:get_value(size, ets:info(?BY_USER))}. free_mru_cache_entries(0) -> ok; free_mru_cache_entries(N) when N > 0 -> free_mru_cache_entry(), free_mru_cache_entries(N - 1). free_mru_cache_entry() -> MruTime = ets:last(?BY_ATIME), [{MruTime, UserName}] = ets:lookup(?BY_ATIME, MruTime), true = ets:delete(?BY_ATIME, MruTime), true = ets:delete(?BY_USER, UserName). cache_hit(UserName, Credentials, ATime) -> NewATime = erlang:now(), true = ets:delete(?BY_ATIME, ATime), true = ets:insert(?BY_ATIME, {NewATime, UserName}), true = ets:insert(?BY_USER, {UserName, {Credentials, NewATime}}). refresh_entries(AuthDb) -> case reopen_auth_db(AuthDb) of nil -> ok; AuthDb2 -> case AuthDb2#db.update_seq > AuthDb#db.update_seq of true -> {ok, _, _} = couch_db:enum_docs_since( AuthDb2, AuthDb#db.update_seq, fun(DocInfo, _, _) -> refresh_entry(AuthDb2, DocInfo) end, AuthDb#db.update_seq, [] ), true = ets:insert(?STATE, {auth_db, AuthDb2}); false -> ok end end. refresh_entry(Db, #doc_info{high_seq = DocSeq} = DocInfo) -> case is_user_doc(DocInfo) of {true, UserName} -> case ets:lookup(?BY_USER, UserName) of [] -> ok; [{UserName, {_OldCreds, ATime}}] -> {ok, Doc} = couch_db:open_doc(Db, DocInfo, [conflicts, deleted]), NewCreds = user_creds(Doc), true = ets:insert(?BY_USER, {UserName, {NewCreds, ATime}}) end; false -> ok end, {ok, DocSeq}. user_creds(#doc{deleted = true}) -> nil; user_creds(#doc{} = Doc) -> {Creds} = couch_doc:to_json_obj(Doc, []), Creds. is_user_doc(#doc_info{id = <<"org.couchdb.user:", UserName/binary>>}) -> {true, UserName}; is_user_doc(_) -> false. maybe_refresh_cache() -> case cache_needs_refresh() of true -> ok = gen_server:call(?MODULE, refresh, infinity); false -> ok end. cache_needs_refresh() -> exec_if_auth_db( fun(AuthDb) -> case reopen_auth_db(AuthDb) of nil -> false; AuthDb2 -> AuthDb2#db.update_seq > AuthDb#db.update_seq end end, false ). reopen_auth_db(AuthDb) -> case (catch couch_db:reopen(AuthDb)) of {ok, AuthDb2} -> AuthDb2; _ -> nil end. exec_if_auth_db(Fun) -> exec_if_auth_db(Fun, ok). exec_if_auth_db(Fun, DefRes) -> case ets:lookup(?STATE, auth_db) of [{auth_db, #db{} = AuthDb}] -> Fun(AuthDb); _ -> DefRes end. open_auth_db() -> [{auth_db_name, DbName}] = ets:lookup(?STATE, auth_db_name), {ok, AuthDb} = ensure_users_db_exists(DbName, [sys_db]), AuthDb. get_user_props_from_db(UserName) -> exec_if_auth_db( fun(AuthDb) -> Db = reopen_auth_db(AuthDb), DocId = <<"org.couchdb.user:", UserName/binary>>, try {ok, Doc} = couch_db:open_doc(Db, DocId, [conflicts]), {DocProps} = couch_doc:to_json_obj(Doc, []), DocProps catch _:_Error -> nil end end, nil ). ensure_users_db_exists(DbName, Options) -> Options1 = [{user_ctx, #user_ctx{roles=[<<"_admin">>]}}, nologifmissing | Options], case couch_db:open(DbName, Options1) of {ok, Db} -> ensure_auth_ddoc_exists(Db, <<"_design/_auth">>), {ok, Db}; _Error -> {ok, Db} = couch_db:create(DbName, Options1), ok = ensure_auth_ddoc_exists(Db, <<"_design/_auth">>), {ok, Db} end. ensure_auth_ddoc_exists(Db, DDocId) -> case couch_db:open_doc(Db, DDocId) of {not_found, _Reason} -> {ok, AuthDesign} = auth_design_doc(DDocId), {ok, _Rev} = couch_db:update_doc(Db, AuthDesign, []); {ok, Doc} -> {Props} = couch_doc:to_json_obj(Doc, []), case couch_util:get_value(<<"validate_doc_update">>, Props, []) of ?AUTH_DB_DOC_VALIDATE_FUNCTION -> ok; _ -> Props1 = lists:keyreplace(<<"validate_doc_update">>, 1, Props, {<<"validate_doc_update">>, ?AUTH_DB_DOC_VALIDATE_FUNCTION}), couch_db:update_doc(Db, couch_doc:from_json_obj({Props1}), []) end end, ok. auth_design_doc(DocId) -> DocProps = [ {<<"_id">>, DocId}, {<<"language">>,<<"javascript">>}, {<<"validate_doc_update">>, ?AUTH_DB_DOC_VALIDATE_FUNCTION} ], {ok, couch_doc:from_json_obj({DocProps})}. apache-couchdb-1.6.0/src/couchdb/couch.erl0000644000175000001440000000203612332105522020322 0ustar00djcusers00000000000000% Licensed under the Apache License, Version 2.0 (the "License"); you may not % use this file except in compliance with the License. You may obtain a copy of % the License at % % http://www.apache.org/licenses/LICENSE-2.0 % % Unless required by applicable law or agreed to in writing, software % distributed under the License is distributed on an "AS IS" BASIS, WITHOUT % WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the % License for the specific language governing permissions and limitations under % the License. -module(couch). -compile(export_all). start() -> ok = application:start(couch). stop() -> application:stop(couch). restart() -> case stop() of ok -> start(); {error, {not_started,couch}} -> start(); {error, Reason} -> {error, Reason} end. reload() -> case supervisor:terminate_child(couch_server_sup, couch_config) of ok -> supervisor:restart_child(couch_server_sup, couch_config); {error, Reason} -> {error, Reason} end. apache-couchdb-1.6.0/src/couchdb/couch_query_servers.erl0000644000175000001440000005230012332105522023317 0ustar00djcusers00000000000000% Licensed under the Apache License, Version 2.0 (the "License"); you may not % use this file except in compliance with the License. You may obtain a copy of % the License at % % http://www.apache.org/licenses/LICENSE-2.0 % % Unless required by applicable law or agreed to in writing, software % distributed under the License is distributed on an "AS IS" BASIS, WITHOUT % WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the % License for the specific language governing permissions and limitations under % the License. -module(couch_query_servers). -behaviour(gen_server). -export([start_link/0, config_change/1]). -export([init/1, terminate/2, handle_call/3, handle_cast/2, handle_info/2,code_change/3]). -export([start_doc_map/3, map_docs/2, map_doc_raw/2, stop_doc_map/1, raw_to_ejson/1]). -export([reduce/3, rereduce/3,validate_doc_update/5]). -export([filter_docs/5]). -export([filter_view/3]). -export([with_ddoc_proc/2, proc_prompt/2, ddoc_prompt/3, ddoc_proc_prompt/3, json_doc/1]). % For 210-os-proc-pool.t -export([get_os_process/1, ret_os_process/1]). -include("couch_db.hrl"). -record(proc, { pid, lang, ddoc_keys = [], prompt_fun, set_timeout_fun, stop_fun }). -record(qserver, { langs, % Keyed by language name, value is {Mod,Func,Arg} pid_procs, % Keyed by PID, valus is a #proc record. lang_procs, % Keyed by language name, value is a #proc record lang_limits, % Keyed by language name, value is {Lang, Limit, Current} waitlist = [], config }). start_link() -> gen_server:start_link({local, couch_query_servers}, couch_query_servers, [], []). start_doc_map(Lang, Functions, Lib) -> Proc = get_os_process(Lang), case Lib of {[]} -> ok; Lib -> true = proc_prompt(Proc, [<<"add_lib">>, Lib]) end, lists:foreach(fun(FunctionSource) -> true = proc_prompt(Proc, [<<"add_fun">>, FunctionSource]) end, Functions), {ok, Proc}. map_docs(Proc, Docs) -> % send the documents Results = lists:map( fun(Doc) -> Json = couch_doc:to_json_obj(Doc, []), FunsResults = proc_prompt(Proc, [<<"map_doc">>, Json]), % the results are a json array of function map yields like this: % [FunResults1, FunResults2 ...] % where funresults is are json arrays of key value pairs: % [[Key1, Value1], [Key2, Value2]] % Convert the key, value pairs to tuples like % [{Key1, Value1}, {Key2, Value2}] lists:map( fun(FunRs) -> [list_to_tuple(FunResult) || FunResult <- FunRs] end, FunsResults) end, Docs), {ok, Results}. map_doc_raw(Proc, Doc) -> Json = couch_doc:to_json_obj(Doc, []), {ok, proc_prompt_raw(Proc, [<<"map_doc">>, Json])}. stop_doc_map(nil) -> ok; stop_doc_map(Proc) -> ok = ret_os_process(Proc). group_reductions_results([]) -> []; group_reductions_results(List) -> {Heads, Tails} = lists:foldl( fun([H|T], {HAcc,TAcc}) -> {[H|HAcc], [T|TAcc]} end, {[], []}, List), case Tails of [[]|_] -> % no tails left [Heads]; _ -> [Heads | group_reductions_results(Tails)] end. rereduce(_Lang, [], _ReducedValues) -> {ok, []}; rereduce(Lang, RedSrcs, ReducedValues) -> Grouped = group_reductions_results(ReducedValues), Results = lists:zipwith( fun (<<"_", _/binary>> = FunSrc, Values) -> {ok, [Result]} = builtin_reduce(rereduce, [FunSrc], [[[], V] || V <- Values], []), Result; (FunSrc, Values) -> os_rereduce(Lang, [FunSrc], Values) end, RedSrcs, Grouped), {ok, Results}. reduce(_Lang, [], _KVs) -> {ok, []}; reduce(Lang, RedSrcs, KVs) -> {OsRedSrcs, BuiltinReds} = lists:partition(fun (<<"_", _/binary>>) -> false; (_OsFun) -> true end, RedSrcs), {ok, OsResults} = os_reduce(Lang, OsRedSrcs, KVs), {ok, BuiltinResults} = builtin_reduce(reduce, BuiltinReds, KVs, []), recombine_reduce_results(RedSrcs, OsResults, BuiltinResults, []). recombine_reduce_results([], [], [], Acc) -> {ok, lists:reverse(Acc)}; recombine_reduce_results([<<"_", _/binary>>|RedSrcs], OsResults, [BRes|BuiltinResults], Acc) -> recombine_reduce_results(RedSrcs, OsResults, BuiltinResults, [BRes|Acc]); recombine_reduce_results([_OsFun|RedSrcs], [OsR|OsResults], BuiltinResults, Acc) -> recombine_reduce_results(RedSrcs, OsResults, BuiltinResults, [OsR|Acc]). os_reduce(_Lang, [], _KVs) -> {ok, []}; os_reduce(Lang, OsRedSrcs, KVs) -> Proc = get_os_process(Lang), OsResults = try proc_prompt(Proc, [<<"reduce">>, OsRedSrcs, KVs]) of [true, Reductions] -> Reductions after ok = ret_os_process(Proc) end, {ok, OsResults}. os_rereduce(Lang, OsRedSrcs, KVs) -> Proc = get_os_process(Lang), try proc_prompt(Proc, [<<"rereduce">>, OsRedSrcs, KVs]) of [true, [Reduction]] -> Reduction after ok = ret_os_process(Proc) end. builtin_reduce(_Re, [], _KVs, Acc) -> {ok, lists:reverse(Acc)}; builtin_reduce(Re, [<<"_sum",_/binary>>|BuiltinReds], KVs, Acc) -> Sum = builtin_sum_rows(KVs), builtin_reduce(Re, BuiltinReds, KVs, [Sum|Acc]); builtin_reduce(reduce, [<<"_count",_/binary>>|BuiltinReds], KVs, Acc) -> Count = length(KVs), builtin_reduce(reduce, BuiltinReds, KVs, [Count|Acc]); builtin_reduce(rereduce, [<<"_count",_/binary>>|BuiltinReds], KVs, Acc) -> Count = builtin_sum_rows(KVs), builtin_reduce(rereduce, BuiltinReds, KVs, [Count|Acc]); builtin_reduce(Re, [<<"_stats",_/binary>>|BuiltinReds], KVs, Acc) -> Stats = builtin_stats(Re, KVs), builtin_reduce(Re, BuiltinReds, KVs, [Stats|Acc]). builtin_sum_rows(KVs) -> lists:foldl(fun ([_Key, Value], Acc) when is_number(Value), is_number(Acc) -> Acc + Value; ([_Key, Value], Acc) when is_list(Value), is_list(Acc) -> sum_terms(Acc, Value); ([_Key, Value], Acc) when is_number(Value), is_list(Acc) -> sum_terms(Acc, [Value]); ([_Key, Value], Acc) when is_list(Value), is_number(Acc) -> sum_terms([Acc], Value); (_Else, _Acc) -> throw({invalid_value, <<"builtin _sum function requires map values to be numbers or lists of numbers">>}) end, 0, KVs). sum_terms([], []) -> []; sum_terms([_|_]=Xs, []) -> Xs; sum_terms([], [_|_]=Ys) -> Ys; sum_terms([X|Xs], [Y|Ys]) when is_number(X), is_number(Y) -> [X+Y | sum_terms(Xs,Ys)]; sum_terms(_, _) -> throw({invalid_value, <<"builtin _sum function requires map values to be numbers or lists of numbers">>}). builtin_stats(reduce, []) -> {[]}; builtin_stats(reduce, [[_,First]|Rest]) when is_number(First) -> Stats = lists:foldl(fun([_K,V], {S,C,Mi,Ma,Sq}) when is_number(V) -> {S+V, C+1, lists:min([Mi, V]), lists:max([Ma, V]), Sq+(V*V)}; (_, _) -> throw({invalid_value, <<"builtin _stats function requires map values to be numbers">>}) end, {First,1,First,First,First*First}, Rest), {Sum, Cnt, Min, Max, Sqr} = Stats, {[{sum,Sum}, {count,Cnt}, {min,Min}, {max,Max}, {sumsqr,Sqr}]}; builtin_stats(rereduce, [[_,First]|Rest]) -> {[{sum,Sum0}, {count,Cnt0}, {min,Min0}, {max,Max0}, {sumsqr,Sqr0}]} = First, Stats = lists:foldl(fun([_K,Red], {S,C,Mi,Ma,Sq}) -> {[{sum,Sum}, {count,Cnt}, {min,Min}, {max,Max}, {sumsqr,Sqr}]} = Red, {Sum+S, Cnt+C, lists:min([Min, Mi]), lists:max([Max, Ma]), Sqr+Sq} end, {Sum0,Cnt0,Min0,Max0,Sqr0}, Rest), {Sum, Cnt, Min, Max, Sqr} = Stats, {[{sum,Sum}, {count,Cnt}, {min,Min}, {max,Max}, {sumsqr,Sqr}]}. % use the function stored in ddoc.validate_doc_update to test an update. validate_doc_update(DDoc, EditDoc, DiskDoc, Ctx, SecObj) -> JsonEditDoc = couch_doc:to_json_obj(EditDoc, [revs]), JsonDiskDoc = json_doc(DiskDoc), case ddoc_prompt(DDoc, [<<"validate_doc_update">>], [JsonEditDoc, JsonDiskDoc, Ctx, SecObj]) of 1 -> ok; {[{<<"forbidden">>, Message}]} -> throw({forbidden, Message}); {[{<<"unauthorized">>, Message}]} -> throw({unauthorized, Message}) end. json_doc(nil) -> null; json_doc(Doc) -> couch_doc:to_json_obj(Doc, [revs]). filter_view(DDoc, VName, Docs) -> JsonDocs = [couch_doc:to_json_obj(Doc, [revs]) || Doc <- Docs], [true, Passes] = ddoc_prompt(DDoc, [<<"views">>, VName, <<"map">>], [JsonDocs]), {ok, Passes}. filter_docs(Req, Db, DDoc, FName, Docs) -> JsonReq = case Req of {json_req, JsonObj} -> JsonObj; #httpd{} = HttpReq -> couch_httpd_external:json_req_obj(HttpReq, Db) end, JsonDocs = [couch_doc:to_json_obj(Doc, [revs]) || Doc <- Docs], [true, Passes] = ddoc_prompt(DDoc, [<<"filters">>, FName], [JsonDocs, JsonReq]), {ok, Passes}. ddoc_proc_prompt({Proc, DDocId}, FunPath, Args) -> proc_prompt(Proc, [<<"ddoc">>, DDocId, FunPath, Args]). ddoc_prompt(DDoc, FunPath, Args) -> with_ddoc_proc(DDoc, fun({Proc, DDocId}) -> proc_prompt(Proc, [<<"ddoc">>, DDocId, FunPath, Args]) end). with_ddoc_proc(#doc{id=DDocId,revs={Start, [DiskRev|_]}}=DDoc, Fun) -> Rev = couch_doc:rev_to_str({Start, DiskRev}), DDocKey = {DDocId, Rev}, Proc = get_ddoc_process(DDoc, DDocKey), try Fun({Proc, DDocId}) after ok = ret_os_process(Proc) end. init([]) -> % register async to avoid deadlock on restart_child Self = self(), spawn(couch_config, register, [fun ?MODULE:config_change/1, Self]), Langs = ets:new(couch_query_server_langs, [set, private]), LangLimits = ets:new(couch_query_server_lang_limits, [set, private]), PidProcs = ets:new(couch_query_server_pid_langs, [set, private]), LangProcs = ets:new(couch_query_server_procs, [set, private]), ProcTimeout = list_to_integer(couch_config:get( "couchdb", "os_process_timeout", "5000")), ReduceLimit = list_to_atom( couch_config:get("query_server_config","reduce_limit","true")), OsProcLimit = list_to_integer( couch_config:get("query_server_config","os_process_limit","10")), % 'query_servers' specifies an OS command-line to execute. lists:foreach(fun({Lang, Command}) -> true = ets:insert(LangLimits, {?l2b(Lang), OsProcLimit, 0}), true = ets:insert(Langs, {?l2b(Lang), couch_os_process, start_link, [Command]}) end, couch_config:get("query_servers")), % 'native_query_servers' specifies a {Module, Func, Arg} tuple. lists:foreach(fun({Lang, SpecStr}) -> {ok, {Mod, Fun, SpecArg}} = couch_util:parse_term(SpecStr), true = ets:insert(LangLimits, {?l2b(Lang), 0, 0}), % 0 means no limit true = ets:insert(Langs, {?l2b(Lang), Mod, Fun, SpecArg}) end, couch_config:get("native_query_servers")), process_flag(trap_exit, true), {ok, #qserver{ langs = Langs, % Keyed by language name, value is {Mod,Func,Arg} pid_procs = PidProcs, % Keyed by PID, valus is a #proc record. lang_procs = LangProcs, % Keyed by language name, value is a #proc record lang_limits = LangLimits, % Keyed by language name, value is {Lang, Limit, Current} config = {[{<<"reduce_limit">>, ReduceLimit},{<<"timeout">>, ProcTimeout}]} }}. terminate(_Reason, #qserver{pid_procs=PidProcs}) -> [couch_util:shutdown_sync(P) || {P,_} <- ets:tab2list(PidProcs)], ok. handle_call({get_proc, DDoc1, DDocKey}, From, Server) -> #doc{body = {Props}} = DDoc = couch_doc:with_ejson_body(DDoc1), Lang = couch_util:get_value(<<"language">>, Props, <<"javascript">>), case lang_proc(Lang, Server, fun(Procs) -> % find a proc in the set that has the DDoc proc_with_ddoc(DDoc, DDocKey, Procs) end) of {ok, Proc} -> {reply, {ok, Proc, Server#qserver.config}, Server}; wait -> {noreply, add_to_waitlist({DDoc, DDocKey}, From, Server)}; Error -> {reply, Error, Server} end; handle_call({get_proc, Lang}, From, Server) -> case lang_proc(Lang, Server, fun([P|_Procs]) -> {ok, P} end) of {ok, Proc} -> {reply, {ok, Proc, Server#qserver.config}, Server}; wait -> {noreply, add_to_waitlist({Lang}, From, Server)}; Error -> {reply, Error, Server} end; handle_call({unlink_proc, Pid}, _From, Server) -> unlink(Pid), {reply, ok, Server}; handle_call({ret_proc, Proc}, _From, #qserver{ pid_procs=PidProcs, lang_procs=LangProcs}=Server) -> % Along with max process limit, here we should check % if we're over the limit and discard when we are. case is_process_alive(Proc#proc.pid) of true -> add_value(PidProcs, Proc#proc.pid, Proc), add_to_list(LangProcs, Proc#proc.lang, Proc), link(Proc#proc.pid); false -> ok end, {reply, true, service_waitlist(Server)}. handle_cast(_Whatever, Server) -> {noreply, Server}. handle_info({'EXIT', _, _}, Server) -> {noreply, Server}; handle_info({'DOWN', _, process, Pid, Status}, #qserver{ pid_procs=PidProcs, lang_procs=LangProcs, lang_limits=LangLimits}=Server) -> case ets:lookup(PidProcs, Pid) of [{Pid, Proc}] -> case Status of normal -> ok; _ -> ?LOG_DEBUG("Linked process died abnormally: ~p (reason: ~p)", [Pid, Status]) end, rem_value(PidProcs, Pid), catch rem_from_list(LangProcs, Proc#proc.lang, Proc), [{Lang, Lim, Current}] = ets:lookup(LangLimits, Proc#proc.lang), true = ets:insert(LangLimits, {Lang, Lim, Current-1}), {noreply, service_waitlist(Server)}; [] -> case Status of normal -> {noreply, Server}; _ -> {stop, Status, Server} end end. code_change(_OldVsn, State, _Extra) -> {ok, State}. config_change("query_servers") -> supervisor:terminate_child(couch_secondary_services, query_servers), supervisor:restart_child(couch_secondary_services, query_servers); config_change("native_query_servers") -> supervisor:terminate_child(couch_secondary_services, query_servers), supervisor:restart_child(couch_secondary_services, query_servers); config_change("query_server_config") -> supervisor:terminate_child(couch_secondary_services, query_servers), supervisor:restart_child(couch_secondary_services, query_servers). % Private API add_to_waitlist(Info, From, #qserver{waitlist=Waitlist}=Server) -> Server#qserver{waitlist=[{Info, From}|Waitlist]}. service_waitlist(#qserver{waitlist=[]}=Server) -> Server; service_waitlist(#qserver{waitlist=Waitlist}=Server) -> [Oldest|RevWList] = lists:reverse(Waitlist), case service_waiting(Oldest, Server) of ok -> Server#qserver{waitlist=lists:reverse(RevWList)}; wait -> Server#qserver{waitlist=Waitlist} end. % todo get rid of duplication service_waiting({{#doc{body={Props}}=DDoc, DDocKey}, From}, Server) -> Lang = couch_util:get_value(<<"language">>, Props, <<"javascript">>), case lang_proc(Lang, Server, fun(Procs) -> % find a proc in the set that has the DDoc proc_with_ddoc(DDoc, DDocKey, Procs) end) of {ok, Proc} -> gen_server:reply(From, {ok, Proc, Server#qserver.config}), ok; wait -> % this should never happen wait; Error -> gen_server:reply(From, Error), ok end; service_waiting({{Lang}, From}, Server) -> case lang_proc(Lang, Server, fun([P|_Procs]) -> {ok, P} end) of {ok, Proc} -> gen_server:reply(From, {ok, Proc, Server#qserver.config}), ok; wait -> % this should never happen wait; Error -> gen_server:reply(From, Error), ok end. lang_proc(Lang, #qserver{ langs=Langs, pid_procs=PidProcs, lang_procs=LangProcs, lang_limits=LangLimits}, PickFun) -> % Note to future self. Add max process limit. case ets:lookup(LangProcs, Lang) of [{Lang, [P|Procs]}] -> {ok, Proc} = PickFun([P|Procs]), rem_from_list(LangProcs, Lang, Proc), {ok, Proc}; _ -> case (catch new_process(Langs, LangLimits, Lang)) of {ok, Proc} -> add_value(PidProcs, Proc#proc.pid, Proc), PickFun([Proc]); ErrorOrWait -> ErrorOrWait end end. new_process(Langs, LangLimits, Lang) -> [{Lang, Lim, Current}] = ets:lookup(LangLimits, Lang), if (Lim == 0) or (Current < Lim) -> % Lim == 0 means no limit % we are below the limit for our language, make a new one case ets:lookup(Langs, Lang) of [{Lang, Mod, Func, Arg}] -> {ok, Pid} = apply(Mod, Func, Arg), erlang:monitor(process, Pid), true = ets:insert(LangLimits, {Lang, Lim, Current+1}), {ok, #proc{lang=Lang, pid=Pid, % Called via proc_prompt, proc_set_timeout, and proc_stop prompt_fun={Mod, prompt}, set_timeout_fun={Mod, set_timeout}, stop_fun={Mod, stop}}}; _ -> {unknown_query_language, Lang} end; true -> wait end. proc_with_ddoc(DDoc, DDocKey, LangProcs) -> DDocProcs = lists:filter(fun(#proc{ddoc_keys=Keys}) -> lists:any(fun(Key) -> Key == DDocKey end, Keys) end, LangProcs), case DDocProcs of [DDocProc|_] -> ?LOG_DEBUG("DDocProc found for DDocKey: ~p",[DDocKey]), {ok, DDocProc}; [] -> [TeachProc|_] = LangProcs, ?LOG_DEBUG("Teach ddoc to new proc ~p with DDocKey: ~p",[TeachProc, DDocKey]), {ok, SmartProc} = teach_ddoc(DDoc, DDocKey, TeachProc), {ok, SmartProc} end. proc_prompt(Proc, Args) -> case proc_prompt_raw(Proc, Args) of {json, Json} -> ?JSON_DECODE(Json); EJson -> EJson end. proc_prompt_raw(#proc{prompt_fun = {Mod, Func}} = Proc, Args) -> apply(Mod, Func, [Proc#proc.pid, Args]). raw_to_ejson({json, Json}) -> ?JSON_DECODE(Json); raw_to_ejson(EJson) -> EJson. proc_stop(Proc) -> {Mod, Func} = Proc#proc.stop_fun, apply(Mod, Func, [Proc#proc.pid]). proc_set_timeout(Proc, Timeout) -> {Mod, Func} = Proc#proc.set_timeout_fun, apply(Mod, Func, [Proc#proc.pid, Timeout]). teach_ddoc(DDoc, {DDocId, _Rev}=DDocKey, #proc{ddoc_keys=Keys}=Proc) -> % send ddoc over the wire % we only share the rev with the client we know to update code % but it only keeps the latest copy, per each ddoc, around. true = proc_prompt(Proc, [<<"ddoc">>, <<"new">>, DDocId, couch_doc:to_json_obj(DDoc, [])]), % we should remove any other ddocs keys for this docid % because the query server overwrites without the rev Keys2 = [{D,R} || {D,R} <- Keys, D /= DDocId], % add ddoc to the proc {ok, Proc#proc{ddoc_keys=[DDocKey|Keys2]}}. get_ddoc_process(#doc{} = DDoc, DDocKey) -> % remove this case statement case gen_server:call(couch_query_servers, {get_proc, DDoc, DDocKey}, infinity) of {ok, Proc, {QueryConfig}} -> % process knows the ddoc case (catch proc_prompt(Proc, [<<"reset">>, {QueryConfig}])) of true -> proc_set_timeout(Proc, couch_util:get_value(<<"timeout">>, QueryConfig)), link(Proc#proc.pid), gen_server:call(couch_query_servers, {unlink_proc, Proc#proc.pid}, infinity), Proc; _ -> catch proc_stop(Proc), get_ddoc_process(DDoc, DDocKey) end; Error -> throw(Error) end. get_os_process(Lang) -> case gen_server:call(couch_query_servers, {get_proc, Lang}, infinity) of {ok, Proc, {QueryConfig}} -> case (catch proc_prompt(Proc, [<<"reset">>, {QueryConfig}])) of true -> proc_set_timeout(Proc, couch_util:get_value(<<"timeout">>, QueryConfig)), link(Proc#proc.pid), gen_server:call(couch_query_servers, {unlink_proc, Proc#proc.pid}, infinity), Proc; _ -> catch proc_stop(Proc), get_os_process(Lang) end; Error -> throw(Error) end. ret_os_process(Proc) -> true = gen_server:call(couch_query_servers, {ret_proc, Proc}, infinity), catch unlink(Proc#proc.pid), ok. add_value(Tid, Key, Value) -> true = ets:insert(Tid, {Key, Value}). rem_value(Tid, Key) -> true = ets:delete(Tid, Key). add_to_list(Tid, Key, Value) -> case ets:lookup(Tid, Key) of [{Key, Vals}] -> true = ets:insert(Tid, {Key, [Value|Vals]}); [] -> true = ets:insert(Tid, {Key, [Value]}) end. rem_from_list(Tid, Key, Value) when is_record(Value, proc)-> Pid = Value#proc.pid, case ets:lookup(Tid, Key) of [{Key, Vals}] -> % make a new values list that doesn't include the Value arg NewValues = [Val || #proc{pid=P}=Val <- Vals, P /= Pid], ets:insert(Tid, {Key, NewValues}); [] -> ok end; rem_from_list(Tid, Key, Value) -> case ets:lookup(Tid, Key) of [{Key, Vals}] -> % make a new values list that doesn't include the Value arg NewValues = [Val || Val <- Vals, Val /= Value], ets:insert(Tid, {Key, NewValues}); [] -> ok end. apache-couchdb-1.6.0/src/couchdb/couch_httpd_misc_handlers.erl0000644000175000001440000003004312332105522024417 0ustar00djcusers00000000000000% Licensed under the Apache License, Version 2.0 (the "License"); you may not % use this file except in compliance with the License. You may obtain a copy of % the License at % % http://www.apache.org/licenses/LICENSE-2.0 % % Unless required by applicable law or agreed to in writing, software % distributed under the License is distributed on an "AS IS" BASIS, WITHOUT % WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the % License for the specific language governing permissions and limitations under % the License. -module(couch_httpd_misc_handlers). -export([handle_welcome_req/2,handle_favicon_req/2,handle_utils_dir_req/2, handle_all_dbs_req/1,handle_restart_req/1, handle_uuids_req/1,handle_config_req/1,handle_log_req/1, handle_task_status_req/1, handle_file_req/2]). -export([increment_update_seq_req/2]). -include("couch_db.hrl"). -import(couch_httpd, [send_json/2,send_json/3,send_json/4,send_method_not_allowed/2, start_json_response/2,send_chunk/2,last_chunk/1,end_json_response/1, start_chunked_response/3, send_error/4]). % httpd global handlers handle_welcome_req(#httpd{method='GET'}=Req, WelcomeMessage) -> send_json(Req, {[ {couchdb, WelcomeMessage}, {uuid, couch_server:get_uuid()}, {version, list_to_binary(couch_server:get_version())} ] ++ case couch_config:get("vendor") of [] -> []; Properties -> [{vendor, {[{?l2b(K), ?l2b(V)} || {K, V} <- Properties]}}] end }); handle_welcome_req(Req, _) -> send_method_not_allowed(Req, "GET,HEAD"). handle_favicon_req(#httpd{method='GET'}=Req, DocumentRoot) -> {{Year,Month,Day},Time} = erlang:universaltime(), OneYearFromNow = {{Year+1,Month,Day},Time}, CachingHeaders = [ %favicon should expire a year from now {"Cache-Control", "public, max-age=31536000"}, {"Expires", couch_util:rfc1123_date(OneYearFromNow)} ], couch_httpd:serve_file(Req, "favicon.ico", DocumentRoot, CachingHeaders); handle_favicon_req(Req, _) -> send_method_not_allowed(Req, "GET,HEAD"). handle_file_req(#httpd{method='GET'}=Req, Document) -> couch_httpd:serve_file(Req, filename:basename(Document), filename:dirname(Document)); handle_file_req(Req, _) -> send_method_not_allowed(Req, "GET,HEAD"). handle_utils_dir_req(#httpd{method='GET'}=Req, DocumentRoot) -> "/" ++ UrlPath = couch_httpd:path(Req), case couch_httpd:partition(UrlPath) of {_ActionKey, "/", RelativePath} -> % GET /_utils/path or GET /_utils/ CachingHeaders = [{"Cache-Control", "private, must-revalidate"}], couch_httpd:serve_file(Req, RelativePath, DocumentRoot, CachingHeaders); {_ActionKey, "", _RelativePath} -> % GET /_utils RedirectPath = couch_httpd:path(Req) ++ "/", couch_httpd:send_redirect(Req, RedirectPath) end; handle_utils_dir_req(Req, _) -> send_method_not_allowed(Req, "GET,HEAD"). handle_all_dbs_req(#httpd{method='GET'}=Req) -> {ok, DbNames} = couch_server:all_databases(), send_json(Req, DbNames); handle_all_dbs_req(Req) -> send_method_not_allowed(Req, "GET,HEAD"). handle_task_status_req(#httpd{method='GET'}=Req) -> ok = couch_httpd:verify_is_server_admin(Req), % convert the list of prop lists to a list of json objects send_json(Req, [{Props} || Props <- couch_task_status:all()]); handle_task_status_req(Req) -> send_method_not_allowed(Req, "GET,HEAD"). handle_restart_req(#httpd{method='POST'}=Req) -> couch_httpd:validate_ctype(Req, "application/json"), ok = couch_httpd:verify_is_server_admin(Req), Result = send_json(Req, 202, {[{ok, true}]}), couch_server_sup:restart_core_server(), Result; handle_restart_req(Req) -> send_method_not_allowed(Req, "POST"). handle_uuids_req(#httpd{method='GET'}=Req) -> Max = list_to_integer(couch_config:get("uuids","max_count","1000")), Count = list_to_integer(couch_httpd:qs_value(Req, "count", "1")), case Count > Max of true -> throw({forbidden, <<"count parameter too large">>}); false -> ok end, UUIDs = [couch_uuids:new() || _ <- lists:seq(1, Count)], Etag = couch_httpd:make_etag(UUIDs), couch_httpd:etag_respond(Req, Etag, fun() -> CacheBustingHeaders = [ {"Date", couch_util:rfc1123_date()}, {"Cache-Control", "no-cache"}, % Past date, ON PURPOSE! {"Expires", "Fri, 01 Jan 1990 00:00:00 GMT"}, {"Pragma", "no-cache"}, {"ETag", Etag} ], send_json(Req, 200, CacheBustingHeaders, {[{<<"uuids">>, UUIDs}]}) end); handle_uuids_req(Req) -> send_method_not_allowed(Req, "GET"). % Config request handler % GET /_config/ % GET /_config handle_config_req(#httpd{method='GET', path_parts=[_]}=Req) -> ok = couch_httpd:verify_is_server_admin(Req), Grouped = lists:foldl(fun({{Section, Key}, Value}, Acc) -> case dict:is_key(Section, Acc) of true -> dict:append(Section, {list_to_binary(Key), list_to_binary(Value)}, Acc); false -> dict:store(Section, [{list_to_binary(Key), list_to_binary(Value)}], Acc) end end, dict:new(), couch_config:all()), KVs = dict:fold(fun(Section, Values, Acc) -> [{list_to_binary(Section), {Values}} | Acc] end, [], Grouped), send_json(Req, 200, {KVs}); % GET /_config/Section handle_config_req(#httpd{method='GET', path_parts=[_,Section]}=Req) -> ok = couch_httpd:verify_is_server_admin(Req), KVs = [{list_to_binary(Key), list_to_binary(Value)} || {Key, Value} <- couch_config:get(Section)], send_json(Req, 200, {KVs}); % GET /_config/Section/Key handle_config_req(#httpd{method='GET', path_parts=[_, Section, Key]}=Req) -> ok = couch_httpd:verify_is_server_admin(Req), case couch_config:get(Section, Key, null) of null -> throw({not_found, unknown_config_value}); Value -> send_json(Req, 200, list_to_binary(Value)) end; % PUT or DELETE /_config/Section/Key handle_config_req(#httpd{method=Method, path_parts=[_, Section, Key]}=Req) when (Method == 'PUT') or (Method == 'DELETE') -> ok = couch_httpd:verify_is_server_admin(Req), Persist = couch_httpd:header_value(Req, "X-Couch-Persist") /= "false", case couch_config:get(<<"httpd">>, <<"config_whitelist">>, null) of null -> % No whitelist; allow all changes. handle_approved_config_req(Req, Persist); WhitelistValue -> % Provide a failsafe to protect against inadvertently locking % onesself out of the config by supplying a syntactically-incorrect % Erlang term. To intentionally lock down the whitelist, supply a % well-formed list which does not include the whitelist config % variable itself. FallbackWhitelist = [{<<"httpd">>, <<"config_whitelist">>}], Whitelist = case couch_util:parse_term(WhitelistValue) of {ok, Value} when is_list(Value) -> Value; {ok, _NonListValue} -> FallbackWhitelist; {error, _} -> [{WhitelistSection, WhitelistKey}] = FallbackWhitelist, ?LOG_ERROR("Only whitelisting ~s/~s due to error parsing: ~p", [WhitelistSection, WhitelistKey, WhitelistValue]), FallbackWhitelist end, IsRequestedKeyVal = fun(Element) -> case Element of {A, B} -> % For readability, tuples may be used instead of binaries % in the whitelist. case {couch_util:to_binary(A), couch_util:to_binary(B)} of {Section, Key} -> true; {Section, <<"*">>} -> true; _Else -> false end; _Else -> false end end, case lists:any(IsRequestedKeyVal, Whitelist) of true -> % Allow modifying this whitelisted variable. handle_approved_config_req(Req, Persist); _NotWhitelisted -> % Disallow modifying this non-whitelisted variable. send_error(Req, 400, <<"modification_not_allowed">>, ?l2b("This config variable is read-only")) end end; handle_config_req(Req) -> send_method_not_allowed(Req, "GET,PUT,DELETE"). % PUT /_config/Section/Key % "value" handle_approved_config_req(Req, Persist) -> Query = couch_httpd:qs(Req), UseRawValue = case lists:keyfind("raw", 1, Query) of false -> false; % Not specified {"raw", ""} -> false; % Specified with no value, i.e. "?raw" and "?raw=" {"raw", "false"} -> false; {"raw", "true"} -> true; {"raw", InvalidValue} -> InvalidValue end, handle_approved_config_req(Req, Persist, UseRawValue). handle_approved_config_req(#httpd{method='PUT', path_parts=[_, Section, Key]}=Req, Persist, UseRawValue) when UseRawValue =:= false orelse UseRawValue =:= true -> RawValue = couch_httpd:json_body(Req), Value = case UseRawValue of true -> % Client requests no change to the provided value. RawValue; false -> % Pre-process the value as necessary. case Section of <<"admins">> -> couch_passwords:hash_admin_password(RawValue); _ -> RawValue end end, OldValue = couch_config:get(Section, Key, ""), case couch_config:set(Section, Key, ?b2l(Value), Persist) of ok -> send_json(Req, 200, list_to_binary(OldValue)); Error -> throw(Error) end; handle_approved_config_req(#httpd{method='PUT'}=Req, _Persist, UseRawValue) -> Err = io_lib:format("Bad value for 'raw' option: ~s", [UseRawValue]), send_json(Req, 400, {[{error, ?l2b(Err)}]}); % DELETE /_config/Section/Key handle_approved_config_req(#httpd{method='DELETE',path_parts=[_,Section,Key]}=Req, Persist, _UseRawValue) -> case couch_config:get(Section, Key, null) of null -> throw({not_found, unknown_config_value}); OldValue -> couch_config:delete(Section, Key, Persist), send_json(Req, 200, list_to_binary(OldValue)) end. % httpd db handlers increment_update_seq_req(#httpd{method='POST'}=Req, Db) -> couch_httpd:validate_ctype(Req, "application/json"), {ok, NewSeq} = couch_db:increment_update_seq(Db), send_json(Req, {[{ok, true}, {update_seq, NewSeq} ]}); increment_update_seq_req(Req, _Db) -> send_method_not_allowed(Req, "POST"). % httpd log handlers handle_log_req(#httpd{method='GET'}=Req) -> ok = couch_httpd:verify_is_server_admin(Req), Bytes = list_to_integer(couch_httpd:qs_value(Req, "bytes", "1000")), Offset = list_to_integer(couch_httpd:qs_value(Req, "offset", "0")), Chunk = couch_log:read(Bytes, Offset), {ok, Resp} = start_chunked_response(Req, 200, [ % send a plaintext response {"Content-Type", "text/plain; charset=utf-8"}, {"Content-Length", integer_to_list(length(Chunk))} ]), send_chunk(Resp, Chunk), last_chunk(Resp); handle_log_req(#httpd{method='POST'}=Req) -> {PostBody} = couch_httpd:json_body_obj(Req), Level = couch_util:get_value(<<"level">>, PostBody), Message = ?b2l(couch_util:get_value(<<"message">>, PostBody)), case Level of <<"debug">> -> ?LOG_DEBUG(Message, []), send_json(Req, 200, {[{ok, true}]}); <<"info">> -> ?LOG_INFO(Message, []), send_json(Req, 200, {[{ok, true}]}); <<"error">> -> ?LOG_ERROR(Message, []), send_json(Req, 200, {[{ok, true}]}); _ -> send_json(Req, 400, {[{error, ?l2b(io_lib:format("Unrecognized log level '~s'", [Level]))}]}) end; handle_log_req(Req) -> send_method_not_allowed(Req, "GET,POST"). apache-couchdb-1.6.0/src/couchdb/couch_external_server.erl0000644000175000001440000000446012332105522023615 0ustar00djcusers00000000000000% Licensed under the Apache License, Version 2.0 (the "License"); you may not % use this file except in compliance with the License. You may obtain a copy of % the License at % % http://www.apache.org/licenses/LICENSE-2.0 % % Unless required by applicable law or agreed to in writing, software % distributed under the License is distributed on an "AS IS" BASIS, WITHOUT % WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the % License for the specific language governing permissions and limitations under % the License. -module(couch_external_server). -behaviour(gen_server). -export([start_link/2, stop/1, execute/2]). -export([init/1, terminate/2, handle_call/3, handle_cast/2, handle_info/2, code_change/3]). -include("couch_db.hrl"). % External API start_link(Name, Command) -> gen_server:start_link(couch_external_server, [Name, Command], []). stop(Pid) -> gen_server:cast(Pid, stop). execute(Pid, JsonReq) -> {json, Json} = gen_server:call(Pid, {execute, JsonReq}, infinity), ?JSON_DECODE(Json). % Gen Server Handlers init([Name, Command]) -> ?LOG_INFO("EXTERNAL: Starting process for: ~s", [Name]), ?LOG_INFO("COMMAND: ~s", [Command]), process_flag(trap_exit, true), Timeout = list_to_integer(couch_config:get("couchdb", "os_process_timeout", "5000")), {ok, Pid} = couch_os_process:start_link(Command, [{timeout, Timeout}]), couch_config:register(fun("couchdb", "os_process_timeout", NewTimeout) -> couch_os_process:set_timeout(Pid, list_to_integer(NewTimeout)) end), {ok, {Name, Command, Pid}}. terminate(_Reason, {_Name, _Command, Pid}) -> couch_os_process:stop(Pid), ok. handle_call({execute, JsonReq}, _From, {Name, Command, Pid}) -> {reply, couch_os_process:prompt(Pid, JsonReq), {Name, Command, Pid}}. handle_info({'EXIT', _Pid, normal}, State) -> {noreply, State}; handle_info({'EXIT', Pid, Reason}, {Name, Command, Pid}) -> ?LOG_INFO("EXTERNAL: Process for ~s exiting. (reason: ~w)", [Name, Reason]), {stop, Reason, {Name, Command, Pid}}. handle_cast(stop, {Name, Command, Pid}) -> ?LOG_INFO("EXTERNAL: Shutting down ~s", [Name]), exit(Pid, normal), {stop, normal, {Name, Command, Pid}}; handle_cast(_Whatever, State) -> {noreply, State}. code_change(_OldVsn, State, _Extra) -> {ok, State}. apache-couchdb-1.6.0/src/couchdb/couch_stats_collector.erl0000644000175000001440000000703712332105522023614 0ustar00djcusers00000000000000% Licensed under the Apache License, Version 2.0 (the "License"); you may not % use this file except in compliance with the License. You may obtain a copy of % the License at % % http://www.apache.org/licenses/LICENSE-2.0 % % Unless required by applicable law or agreed to in writing, software % distributed under the License is distributed on an "AS IS" BASIS, WITHOUT % WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the % License for the specific language governing permissions and limitations under % the License. % todo % - remove existance check on increment(), decrement() and record(). have % modules initialize counters on startup. -module(couch_stats_collector). -behaviour(gen_server). -export([start/0, stop/0]). -export([all/0, all/1, get/1, increment/1, decrement/1, record/2, clear/1]). -export([track_process_count/1, track_process_count/2]). -export([init/1, terminate/2, code_change/3]). -export([handle_call/3, handle_cast/2, handle_info/2]). -define(HIT_TABLE, stats_hit_table). -define(ABS_TABLE, stats_abs_table). start() -> gen_server:start_link({local, ?MODULE}, ?MODULE, [], []). stop() -> gen_server:call(?MODULE, stop). all() -> ets:tab2list(?HIT_TABLE) ++ abs_to_list(). all(Type) -> case Type of incremental -> ets:tab2list(?HIT_TABLE); absolute -> abs_to_list() end. get(Key) -> case ets:lookup(?HIT_TABLE, Key) of [] -> case ets:lookup(?ABS_TABLE, Key) of [] -> nil; AbsVals -> lists:map(fun({_, Value}) -> Value end, AbsVals) end; [{_, Counter}] -> Counter end. increment(Key) -> Key2 = make_key(Key), case catch ets:update_counter(?HIT_TABLE, Key2, 1) of {'EXIT', {badarg, _}} -> catch ets:insert(?HIT_TABLE, {Key2, 1}), ok; _ -> ok end. decrement(Key) -> Key2 = make_key(Key), case catch ets:update_counter(?HIT_TABLE, Key2, -1) of {'EXIT', {badarg, _}} -> catch ets:insert(?HIT_TABLE, {Key2, -1}), ok; _ -> ok end. record(Key, Value) -> catch ets:insert(?ABS_TABLE, {make_key(Key), Value}). clear(Key) -> catch ets:delete(?ABS_TABLE, make_key(Key)). track_process_count(Stat) -> track_process_count(self(), Stat). track_process_count(Pid, Stat) -> MonitorFun = fun() -> Ref = erlang:monitor(process, Pid), receive {'DOWN', Ref, _, _, _} -> ok end, couch_stats_collector:decrement(Stat) end, case (catch couch_stats_collector:increment(Stat)) of ok -> spawn(MonitorFun); _ -> ok end. init(_) -> ets:new(?HIT_TABLE, [named_table, set, public]), ets:new(?ABS_TABLE, [named_table, duplicate_bag, public]), {ok, nil}. terminate(_Reason, _State) -> ok. handle_call(stop, _, State) -> {stop, normal, stopped, State}. handle_cast(foo, State) -> {noreply, State}. handle_info(_Info, State) -> {noreply, State}. code_change(_OldVersion, State, _Extra) -> {ok, State}. make_key({Module, Key}) when is_integer(Key) -> {Module, list_to_atom(integer_to_list(Key))}; make_key(Key) -> Key. abs_to_list() -> SortedKVs = lists:sort(ets:tab2list(?ABS_TABLE)), lists:foldl(fun({Key, Val}, Acc) -> case Acc of [] -> [{Key, [Val]}]; [{Key, Prev} | Rest] -> [{Key, [Val | Prev]} | Rest]; Others -> [{Key, [Val]} | Others] end end, [], SortedKVs).apache-couchdb-1.6.0/src/couchdb/couch_compaction_daemon.erl0000644000175000001440000003647012332105522024072 0ustar00djcusers00000000000000% Licensed under the Apache License, Version 2.0 (the "License"); you may not % use this file except in compliance with the License. You may obtain a copy of % the License at % % http://www.apache.org/licenses/LICENSE-2.0 % % Unless required by applicable law or agreed to in writing, software % distributed under the License is distributed on an "AS IS" BASIS, WITHOUT % WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the % License for the specific language governing permissions and limitations under % the License. -module(couch_compaction_daemon). -behaviour(gen_server). % public API -export([start_link/0, config_change/3]). % gen_server callbacks -export([init/1, handle_call/3, handle_info/2, handle_cast/2]). -export([code_change/3, terminate/2]). -include("couch_db.hrl"). -define(CONFIG_ETS, couch_compaction_daemon_config). -record(state, { loop_pid }). -record(config, { db_frag = nil, view_frag = nil, period = nil, cancel = false, parallel_view_compact = false }). -record(period, { from = nil, to = nil }). start_link() -> gen_server:start_link({local, ?MODULE}, ?MODULE, [], []). init(_) -> process_flag(trap_exit, true), ?CONFIG_ETS = ets:new(?CONFIG_ETS, [named_table, set, protected]), ok = couch_config:register(fun ?MODULE:config_change/3), load_config(), Server = self(), Loop = spawn_link(fun() -> compact_loop(Server) end), {ok, #state{loop_pid = Loop}}. config_change("compactions", DbName, NewValue) -> ok = gen_server:cast(?MODULE, {config_update, DbName, NewValue}). handle_cast({config_update, DbName, deleted}, State) -> true = ets:delete(?CONFIG_ETS, ?l2b(DbName)), {noreply, State}; handle_cast({config_update, DbName, Config}, #state{loop_pid = Loop} = State) -> case parse_config(DbName, Config) of {ok, NewConfig} -> WasEmpty = (ets:info(?CONFIG_ETS, size) =:= 0), true = ets:insert(?CONFIG_ETS, {?l2b(DbName), NewConfig}), case WasEmpty of true -> Loop ! {self(), have_config}; false -> ok end; error -> ok end, {noreply, State}. handle_call(Msg, _From, State) -> {stop, {unexpected_call, Msg}, State}. handle_info({'EXIT', Pid, Reason}, #state{loop_pid = Pid} = State) -> {stop, {compaction_loop_died, Reason}, State}. terminate(_Reason, _State) -> true = ets:delete(?CONFIG_ETS). code_change(_OldVsn, State, _Extra) -> {ok, State}. compact_loop(Parent) -> {ok, _} = couch_server:all_databases( fun(DbName, Acc) -> case ets:info(?CONFIG_ETS, size) =:= 0 of true -> {stop, Acc}; false -> case get_db_config(DbName) of nil -> ok; {ok, Config} -> case check_period(Config) of true -> maybe_compact_db(DbName, Config); false -> ok end end, {ok, Acc} end end, ok), case ets:info(?CONFIG_ETS, size) =:= 0 of true -> receive {Parent, have_config} -> ok end; false -> PausePeriod = list_to_integer( couch_config:get("compaction_daemon", "check_interval", "300")), ok = timer:sleep(PausePeriod * 1000) end, compact_loop(Parent). maybe_compact_db(DbName, Config) -> case (catch couch_db:open_int(DbName, [{user_ctx, #user_ctx{roles=[<<"_admin">>]}}])) of {ok, Db} -> DDocNames = db_ddoc_names(Db), case can_db_compact(Config, Db) of true -> {ok, DbCompactPid} = couch_db:start_compact(Db), TimeLeft = compact_time_left(Config), case Config#config.parallel_view_compact of true -> ViewsCompactPid = spawn_link(fun() -> maybe_compact_views(DbName, DDocNames, Config) end), ViewsMonRef = erlang:monitor(process, ViewsCompactPid); false -> ViewsCompactPid = nil, ViewsMonRef = nil end, DbMonRef = erlang:monitor(process, DbCompactPid), receive {'DOWN', DbMonRef, process, _, normal} -> couch_db:close(Db), case Config#config.parallel_view_compact of true -> ok; false -> maybe_compact_views(DbName, DDocNames, Config) end; {'DOWN', DbMonRef, process, _, Reason} -> couch_db:close(Db), ?LOG_ERROR("Compaction daemon - an error ocurred while" " compacting the database `~s`: ~p", [DbName, Reason]) after TimeLeft -> ?LOG_INFO("Compaction daemon - canceling compaction for database" " `~s` because it's exceeding the allowed period.", [DbName]), erlang:demonitor(DbMonRef, [flush]), ok = couch_db:cancel_compact(Db), couch_db:close(Db) end, case ViewsMonRef of nil -> ok; _ -> receive {'DOWN', ViewsMonRef, process, _, _Reason} -> ok after TimeLeft + 1000 -> % Under normal circunstances, the view compaction process % should have finished already. erlang:demonitor(ViewsMonRef, [flush]), unlink(ViewsCompactPid), exit(ViewsCompactPid, kill) end end; false -> couch_db:close(Db), maybe_compact_views(DbName, DDocNames, Config) end; _ -> ok end. maybe_compact_views(_DbName, [], _Config) -> ok; maybe_compact_views(DbName, [DDocName | Rest], Config) -> case check_period(Config) of true -> case maybe_compact_view(DbName, DDocName, Config) of ok -> maybe_compact_views(DbName, Rest, Config); timeout -> ok end; false -> ok end. db_ddoc_names(Db) -> {ok, _, DDocNames} = couch_db:enum_docs( Db, fun(#full_doc_info{id = <<"_design/", _/binary>>, deleted = true}, _, Acc) -> {ok, Acc}; (#full_doc_info{id = <<"_design/", Id/binary>>}, _, Acc) -> {ok, [Id | Acc]}; (_, _, Acc) -> {stop, Acc} end, [], [{start_key, <<"_design/">>}, {end_key_gt, <<"_design0">>}]), DDocNames. maybe_compact_view(DbName, GroupId, Config) -> DDocId = <<"_design/", GroupId/binary>>, case (catch couch_mrview:get_info(DbName, DDocId)) of {ok, GroupInfo} -> case can_view_compact(Config, DbName, GroupId, GroupInfo) of true -> {ok, MonRef} = couch_mrview:compact(DbName, DDocId, [monitor]), TimeLeft = compact_time_left(Config), receive {'DOWN', MonRef, process, _, normal} -> ok; {'DOWN', MonRef, process, _, Reason} -> ?LOG_ERROR("Compaction daemon - an error ocurred while compacting" " the view group `~s` from database `~s`: ~p", [GroupId, DbName, Reason]), ok after TimeLeft -> ?LOG_INFO("Compaction daemon - canceling the compaction for the " "view group `~s` of the database `~s` because it's exceeding" " the allowed period.", [GroupId, DbName]), erlang:demonitor(MonRef, [flush]), ok = couch_mrview:cancel_compaction(DbName, DDocId), timeout end; false -> ok end; Error -> ?LOG_ERROR("Error opening view group `~s` from database `~s`: ~p", [GroupId, DbName, Error]), ok end. compact_time_left(#config{cancel = false}) -> infinity; compact_time_left(#config{period = nil}) -> infinity; compact_time_left(#config{period = #period{to = {ToH, ToM} = To}}) -> {H, M, _} = time(), case To > {H, M} of true -> ((ToH - H) * 60 * 60 * 1000) + (abs(ToM - M) * 60 * 1000); false -> ((24 - H + ToH) * 60 * 60 * 1000) + (abs(ToM - M) * 60 * 1000) end. get_db_config(DbName) -> case ets:lookup(?CONFIG_ETS, DbName) of [] -> case ets:lookup(?CONFIG_ETS, <<"_default">>) of [] -> nil; [{<<"_default">>, Config}] -> {ok, Config} end; [{DbName, Config}] -> {ok, Config} end. can_db_compact(#config{db_frag = Threshold} = Config, Db) -> case check_period(Config) of false -> false; true -> {ok, DbInfo} = couch_db:get_db_info(Db), {Frag, SpaceRequired} = frag(DbInfo), ?LOG_DEBUG("Fragmentation for database `~s` is ~p%, estimated space for" " compaction is ~p bytes.", [Db#db.name, Frag, SpaceRequired]), case check_frag(Threshold, Frag) of false -> false; true -> Free = free_space(couch_config:get("couchdb", "database_dir")), case Free >= SpaceRequired of true -> true; false -> ?LOG_WARN("Compaction daemon - skipping database `~s` " "compaction: the estimated necessary disk space is about ~p" " bytes but the currently available disk space is ~p bytes.", [Db#db.name, SpaceRequired, Free]), false end end end. can_view_compact(Config, DbName, GroupId, GroupInfo) -> case check_period(Config) of false -> false; true -> case couch_util:get_value(updater_running, GroupInfo) of true -> false; false -> {Frag, SpaceRequired} = frag(GroupInfo), ?LOG_DEBUG("Fragmentation for view group `~s` (database `~s`) is " "~p%, estimated space for compaction is ~p bytes.", [GroupId, DbName, Frag, SpaceRequired]), case check_frag(Config#config.view_frag, Frag) of false -> false; true -> Free = free_space(couch_index_util:root_dir()), case Free >= SpaceRequired of true -> true; false -> ?LOG_WARN("Compaction daemon - skipping view group `~s` " "compaction (database `~s`): the estimated necessary " "disk space is about ~p bytes but the currently available" " disk space is ~p bytes.", [GroupId, DbName, SpaceRequired, Free]), false end end end end. check_period(#config{period = nil}) -> true; check_period(#config{period = #period{from = From, to = To}}) -> {HH, MM, _} = erlang:time(), case From < To of true -> ({HH, MM} >= From) andalso ({HH, MM} < To); false -> ({HH, MM} >= From) orelse ({HH, MM} < To) end. check_frag(nil, _) -> true; check_frag(Threshold, Frag) -> Frag >= Threshold. frag(Props) -> FileSize = couch_util:get_value(disk_size, Props), MinFileSize = list_to_integer( couch_config:get("compaction_daemon", "min_file_size", "131072")), case FileSize < MinFileSize of true -> {0, FileSize}; false -> case couch_util:get_value(data_size, Props) of null -> {100, FileSize}; 0 -> {0, FileSize}; DataSize -> Frag = round(((FileSize - DataSize) / FileSize * 100)), {Frag, space_required(DataSize)} end end. % Rough, and pessimistic, estimation of necessary disk space to compact a % database or view index. space_required(DataSize) -> round(DataSize * 2.0). load_config() -> lists:foreach( fun({DbName, ConfigString}) -> case parse_config(DbName, ConfigString) of {ok, Config} -> true = ets:insert(?CONFIG_ETS, {?l2b(DbName), Config}); error -> ok end end, couch_config:get("compactions")). parse_config(DbName, ConfigString) -> case (catch do_parse_config(ConfigString)) of {ok, Conf} -> {ok, Conf}; incomplete_period -> ?LOG_ERROR("Incomplete period ('to' or 'from' missing) in the compaction" " configuration for database `~s`", [DbName]), error; _ -> ?LOG_ERROR("Invalid compaction configuration for database " "`~s`: `~s`", [DbName, ConfigString]), error end. do_parse_config(ConfigString) -> {ok, ConfProps} = couch_util:parse_term(ConfigString), {ok, #config{period = Period} = Conf} = config_record(ConfProps, #config{}), case Period of nil -> {ok, Conf}; #period{from = From, to = To} when From =/= nil, To =/= nil -> {ok, Conf}; #period{} -> incomplete_period end. config_record([], Config) -> {ok, Config}; config_record([{db_fragmentation, V} | Rest], Config) -> [Frag] = string:tokens(V, "%"), config_record(Rest, Config#config{db_frag = list_to_integer(Frag)}); config_record([{view_fragmentation, V} | Rest], Config) -> [Frag] = string:tokens(V, "%"), config_record(Rest, Config#config{view_frag = list_to_integer(Frag)}); config_record([{from, V} | Rest], #config{period = Period0} = Config) -> Time = parse_time(V), Period = case Period0 of nil -> #period{from = Time}; #period{} -> Period0#period{from = Time} end, config_record(Rest, Config#config{period = Period}); config_record([{to, V} | Rest], #config{period = Period0} = Config) -> Time = parse_time(V), Period = case Period0 of nil -> #period{to = Time}; #period{} -> Period0#period{to = Time} end, config_record(Rest, Config#config{period = Period}); config_record([{strict_window, true} | Rest], Config) -> config_record(Rest, Config#config{cancel = true}); config_record([{strict_window, false} | Rest], Config) -> config_record(Rest, Config#config{cancel = false}); config_record([{parallel_view_compaction, true} | Rest], Config) -> config_record(Rest, Config#config{parallel_view_compact = true}); config_record([{parallel_view_compaction, false} | Rest], Config) -> config_record(Rest, Config#config{parallel_view_compact = false}). parse_time(String) -> [HH, MM] = string:tokens(String, ":"), {list_to_integer(HH), list_to_integer(MM)}. free_space(Path) -> DiskData = lists:sort( fun({PathA, _, _}, {PathB, _, _}) -> length(filename:split(PathA)) > length(filename:split(PathB)) end, disksup:get_disk_data()), free_space_rec(abs_path(Path), DiskData). free_space_rec(_Path, []) -> undefined; free_space_rec(Path, [{MountPoint0, Total, Usage} | Rest]) -> MountPoint = abs_path(MountPoint0), case MountPoint =:= string:substr(Path, 1, length(MountPoint)) of false -> free_space_rec(Path, Rest); true -> trunc(Total - (Total * (Usage / 100))) * 1024 end. abs_path(Path0) -> Path = filename:absname(Path0), case lists:last(Path) of $/ -> Path; _ -> Path ++ "/" end. apache-couchdb-1.6.0/src/couchdb/couch_stats_aggregator.erl0000644000175000001440000002127612332105522023751 0ustar00djcusers00000000000000% Licensed under the Apache License, Version 2.0 (the "License"); you may not % use this file except in compliance with the License. You may obtain a copy of % the License at % % http://www.apache.org/licenses/LICENSE-2.0 % % Unless required by applicable law or agreed to in writing, software % distributed under the License is distributed on an "AS IS" BASIS, WITHOUT % WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the % License for the specific language governing permissions and limitations under % the License. -module(couch_stats_aggregator). -behaviour(gen_server). -export([start/0, start/1, stop/0]). -export([all/0, all/1, get/1, get/2, get_json/1, get_json/2, collect_sample/0]). -export([init/1, terminate/2, code_change/3]). -export([handle_call/3, handle_cast/2, handle_info/2]). -record(aggregate, { description = <<"">>, seconds = 0, count = 0, current = null, sum = null, mean = null, variance = null, stddev = null, min = null, max = null, samples = [] }). start() -> PrivDir = couch_util:priv_dir(), start(filename:join(PrivDir, "stat_descriptions.cfg")). start(FileName) -> gen_server:start_link({local, ?MODULE}, ?MODULE, [FileName], []). stop() -> gen_server:cast(?MODULE, stop). all() -> ?MODULE:all(0). all(Time) when is_binary(Time) -> ?MODULE:all(list_to_integer(binary_to_list(Time))); all(Time) when is_atom(Time) -> ?MODULE:all(list_to_integer(atom_to_list(Time))); all(Time) when is_integer(Time) -> Aggs = ets:match(?MODULE, {{'$1', Time}, '$2'}), Stats = lists:map(fun([Key, Agg]) -> {Key, Agg} end, Aggs), case Stats of [] -> {[]}; _ -> Ret = lists:foldl(fun({{Mod, Key}, Agg}, Acc) -> CurrKeys = case proplists:lookup(Mod, Acc) of none -> []; {Mod, {Keys}} -> Keys end, NewMod = {[{Key, to_json_term(Agg)} | CurrKeys]}, [{Mod, NewMod} | proplists:delete(Mod, Acc)] end, [], Stats), {Ret} end. get(Key) -> ?MODULE:get(Key, 0). get(Key, Time) when is_binary(Time) -> ?MODULE:get(Key, list_to_integer(binary_to_list(Time))); get(Key, Time) when is_atom(Time) -> ?MODULE:get(Key, list_to_integer(atom_to_list(Time))); get(Key, Time) when is_integer(Time) -> case ets:lookup(?MODULE, {make_key(Key), Time}) of [] -> #aggregate{seconds=Time}; [{_, Agg}] -> Agg end. get_json(Key) -> get_json(Key, 0). get_json(Key, Time) -> to_json_term(?MODULE:get(Key, Time)). collect_sample() -> gen_server:call(?MODULE, collect_sample, infinity). init(StatDescsFileName) -> % Create an aggregate entry for each {description, rate} pair. ets:new(?MODULE, [named_table, set, protected]), SampleStr = couch_config:get("stats", "samples", "[0]"), {ok, Samples} = couch_util:parse_term(SampleStr), {ok, Descs} = file:consult(StatDescsFileName), lists:foreach(fun({Sect, Key, Value}) -> lists:foreach(fun(Secs) -> Agg = #aggregate{ description=list_to_binary(Value), seconds=Secs }, ets:insert(?MODULE, {{{Sect, Key}, Secs}, Agg}) end, Samples) end, Descs), Self = self(), ok = couch_config:register( fun("stats", _) -> exit(Self, config_change) end ), Rate = list_to_integer(couch_config:get("stats", "rate", "1000")), % TODO: Add timer_start to kernel start options. {ok, TRef} = timer:apply_after(Rate, ?MODULE, collect_sample, []), {ok, {TRef, Rate}}. terminate(_Reason, {TRef, _Rate}) -> timer:cancel(TRef), ok. handle_call(collect_sample, _, {OldTRef, SampleInterval}) -> timer:cancel(OldTRef), {ok, TRef} = timer:apply_after(SampleInterval, ?MODULE, collect_sample, []), % Gather new stats values to add. Incs = lists:map(fun({Key, Value}) -> {Key, {incremental, Value}} end, couch_stats_collector:all(incremental)), Abs = lists:map(fun({Key, Values}) -> couch_stats_collector:clear(Key), Values2 = case Values of X when is_list(X) -> X; Else -> [Else] end, {_, Mean} = lists:foldl(fun(Val, {Count, Curr}) -> {Count+1, Curr + (Val - Curr) / (Count+1)} end, {0, 0}, Values2), {Key, {absolute, Mean}} end, couch_stats_collector:all(absolute)), Values = Incs ++ Abs, Now = erlang:now(), lists:foreach(fun({{Key, Rate}, Agg}) -> NewAgg = case proplists:lookup(Key, Values) of none -> rem_values(Now, Agg); {Key, {Type, Value}} -> NewValue = new_value(Type, Value, Agg#aggregate.current), Agg2 = add_value(Now, NewValue, Agg), rem_values(Now, Agg2) end, ets:insert(?MODULE, {{Key, Rate}, NewAgg}) end, ets:tab2list(?MODULE)), {reply, ok, {TRef, SampleInterval}}. handle_cast(stop, State) -> {stop, normal, State}. handle_info(_Info, State) -> {noreply, State}. code_change(_OldVersion, State, _Extra) -> {ok, State}. new_value(incremental, Value, null) -> Value; new_value(incremental, Value, Current) -> Value - Current; new_value(absolute, Value, _Current) -> Value. add_value(Time, Value, #aggregate{count=Count, seconds=Secs}=Agg) when Count < 1 -> Samples = case Secs of 0 -> []; _ -> [{Time, Value}] end, Agg#aggregate{ count=1, current=Value, sum=Value, mean=Value, variance=0.0, stddev=null, min=Value, max=Value, samples=Samples }; add_value(Time, Value, Agg) -> #aggregate{ count=Count, current=Current, sum=Sum, mean=Mean, variance=Variance, samples=Samples } = Agg, NewCount = Count + 1, NewMean = Mean + (Value - Mean) / NewCount, NewVariance = Variance + (Value - Mean) * (Value - NewMean), StdDev = case NewCount > 1 of false -> null; _ -> math:sqrt(NewVariance / (NewCount - 1)) end, Agg2 = Agg#aggregate{ count=NewCount, current=Current + Value, sum=Sum + Value, mean=NewMean, variance=NewVariance, stddev=StdDev, min=lists:min([Agg#aggregate.min, Value]), max=lists:max([Agg#aggregate.max, Value]) }, case Agg2#aggregate.seconds of 0 -> Agg2; _ -> Agg2#aggregate{samples=[{Time, Value} | Samples]} end. rem_values(Time, Agg) -> Seconds = Agg#aggregate.seconds, Samples = Agg#aggregate.samples, Pred = fun({When, _Value}) -> timer:now_diff(Time, When) =< (Seconds * 1000000) end, {Keep, Remove} = lists:splitwith(Pred, Samples), Agg2 = lists:foldl(fun({_, Value}, Acc) -> rem_value(Value, Acc) end, Agg, Remove), Agg2#aggregate{samples=Keep}. rem_value(_Value, #aggregate{count=Count, seconds=Secs}) when Count =< 1 -> #aggregate{seconds=Secs}; rem_value(Value, Agg) -> #aggregate{ count=Count, sum=Sum, mean=Mean, variance=Variance } = Agg, OldMean = (Mean * Count - Value) / (Count - 1), OldVariance = Variance - (Value - OldMean) * (Value - Mean), OldCount = Count - 1, StdDev = case OldCount > 1 of false -> null; _ -> math:sqrt(clamp_value(OldVariance / (OldCount - 1))) end, Agg#aggregate{ count=OldCount, sum=Sum-Value, mean=clamp_value(OldMean), variance=clamp_value(OldVariance), stddev=StdDev }. to_json_term(Agg) -> {Min, Max} = case Agg#aggregate.seconds > 0 of false -> {Agg#aggregate.min, Agg#aggregate.max}; _ -> case length(Agg#aggregate.samples) > 0 of true -> Extract = fun({_Time, Value}) -> Value end, Samples = lists:map(Extract, Agg#aggregate.samples), {lists:min(Samples), lists:max(Samples)}; _ -> {null, null} end end, {[ {description, Agg#aggregate.description}, {current, round_value(Agg#aggregate.sum)}, {sum, round_value(Agg#aggregate.sum)}, {mean, round_value(Agg#aggregate.mean)}, {stddev, round_value(Agg#aggregate.stddev)}, {min, Min}, {max, Max} ]}. make_key({Mod, Val}) when is_integer(Val) -> {Mod, list_to_atom(integer_to_list(Val))}; make_key(Key) -> Key. round_value(Val) when not is_number(Val) -> Val; round_value(Val) when Val == 0 -> Val; round_value(Val) -> erlang:round(Val * 1000.0) / 1000.0. clamp_value(Val) when Val > 0.00000000000001 -> Val; clamp_value(_) -> 0.0. apache-couchdb-1.6.0/src/couchdb/couch_db_updater.erl0000644000175000001440000012010212332105522022506 0ustar00djcusers00000000000000% Licensed under the Apache License, Version 2.0 (the "License"); you may not % use this file except in compliance with the License. You may obtain a copy of % the License at % % http://www.apache.org/licenses/LICENSE-2.0 % % Unless required by applicable law or agreed to in writing, software % distributed under the License is distributed on an "AS IS" BASIS, WITHOUT % WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the % License for the specific language governing permissions and limitations under % the License. -module(couch_db_updater). -behaviour(gen_server). -export([btree_by_id_reduce/2,btree_by_seq_reduce/2]). -export([make_doc_summary/2]). -export([init/1,terminate/2,handle_call/3,handle_cast/2,code_change/3,handle_info/2]). -include("couch_db.hrl"). init({MainPid, DbName, Filepath, Fd, Options}) -> process_flag(trap_exit, true), case lists:member(create, Options) of true -> % create a new header and writes it to the file Header = #db_header{}, ok = couch_file:write_header(Fd, Header), % delete any old compaction files that might be hanging around RootDir = couch_config:get("couchdb", "database_dir", "."), couch_file:delete(RootDir, Filepath ++ ".compact"); false -> case couch_file:read_header(Fd) of {ok, Header} -> ok; no_valid_header -> % create a new header and writes it to the file Header = #db_header{}, ok = couch_file:write_header(Fd, Header), % delete any old compaction files that might be hanging around file:delete(Filepath ++ ".compact") end end, ReaderFd = open_reader_fd(Filepath, Options), Db = init_db(DbName, Filepath, Fd, ReaderFd, Header, Options), Db2 = refresh_validate_doc_funs(Db), {ok, Db2#db{main_pid = MainPid}}. terminate(_Reason, Db) -> ok = couch_file:close(Db#db.updater_fd), ok = couch_file:close(Db#db.fd), couch_util:shutdown_sync(Db#db.compactor_pid), couch_util:shutdown_sync(Db#db.fd_ref_counter), ok. handle_call(get_db, _From, Db) -> {reply, {ok, Db}, Db}; handle_call(full_commit, _From, #db{waiting_delayed_commit=nil}=Db) -> {reply, ok, Db}; % no data waiting, return ok immediately handle_call(full_commit, _From, Db) -> {reply, ok, commit_data(Db)}; % commit the data and return ok handle_call(increment_update_seq, _From, Db) -> Db2 = commit_data(Db#db{update_seq=Db#db.update_seq+1}), ok = gen_server:call(Db2#db.main_pid, {db_updated, Db2}), couch_db_update_notifier:notify({updated, Db#db.name}), {reply, {ok, Db2#db.update_seq}, Db2}; handle_call({set_security, NewSec}, _From, #db{compression = Comp} = Db) -> {ok, Ptr, _} = couch_file:append_term( Db#db.updater_fd, NewSec, [{compression, Comp}]), Db2 = commit_data(Db#db{security=NewSec, security_ptr=Ptr, update_seq=Db#db.update_seq+1}), ok = gen_server:call(Db2#db.main_pid, {db_updated, Db2}), {reply, ok, Db2}; handle_call({set_revs_limit, Limit}, _From, Db) -> Db2 = commit_data(Db#db{revs_limit=Limit, update_seq=Db#db.update_seq+1}), ok = gen_server:call(Db2#db.main_pid, {db_updated, Db2}), {reply, ok, Db2}; handle_call({purge_docs, _IdRevs}, _From, #db{compactor_pid=Pid}=Db) when Pid /= nil -> {reply, {error, purge_during_compaction}, Db}; handle_call({purge_docs, IdRevs}, _From, Db) -> #db{ updater_fd = Fd, fulldocinfo_by_id_btree = DocInfoByIdBTree, docinfo_by_seq_btree = DocInfoBySeqBTree, update_seq = LastSeq, header = Header = #db_header{purge_seq=PurgeSeq}, compression = Comp } = Db, DocLookups = couch_btree:lookup(DocInfoByIdBTree, [Id || {Id, _Revs} <- IdRevs]), NewDocInfos = lists:zipwith( fun({_Id, Revs}, {ok, #full_doc_info{rev_tree=Tree}=FullDocInfo}) -> case couch_key_tree:remove_leafs(Tree, Revs) of {_, []=_RemovedRevs} -> % no change nil; {NewTree, RemovedRevs} -> {FullDocInfo#full_doc_info{rev_tree=NewTree},RemovedRevs} end; (_, not_found) -> nil end, IdRevs, DocLookups), SeqsToRemove = [Seq || {#full_doc_info{update_seq=Seq},_} <- NewDocInfos], FullDocInfoToUpdate = [FullInfo || {#full_doc_info{rev_tree=Tree}=FullInfo,_} <- NewDocInfos, Tree /= []], IdRevsPurged = [{Id, Revs} || {#full_doc_info{id=Id}, Revs} <- NewDocInfos], {DocInfoToUpdate, NewSeq} = lists:mapfoldl( fun(#full_doc_info{rev_tree=Tree}=FullInfo, SeqAcc) -> Tree2 = couch_key_tree:map_leafs( fun(_RevId, LeafVal) -> IsDeleted = element(1, LeafVal), BodyPointer = element(2, LeafVal), {IsDeleted, BodyPointer, SeqAcc + 1} end, Tree), {couch_doc:to_doc_info(FullInfo#full_doc_info{rev_tree=Tree2}), SeqAcc + 1} end, LastSeq, FullDocInfoToUpdate), IdsToRemove = [Id || {#full_doc_info{id=Id,rev_tree=[]},_} <- NewDocInfos], {ok, DocInfoBySeqBTree2} = couch_btree:add_remove(DocInfoBySeqBTree, DocInfoToUpdate, SeqsToRemove), {ok, DocInfoByIdBTree2} = couch_btree:add_remove(DocInfoByIdBTree, FullDocInfoToUpdate, IdsToRemove), {ok, Pointer, _} = couch_file:append_term( Fd, IdRevsPurged, [{compression, Comp}]), Db2 = commit_data( Db#db{ fulldocinfo_by_id_btree = DocInfoByIdBTree2, docinfo_by_seq_btree = DocInfoBySeqBTree2, update_seq = NewSeq + 1, header=Header#db_header{purge_seq=PurgeSeq+1, purged_docs=Pointer}}), ok = gen_server:call(Db2#db.main_pid, {db_updated, Db2}), couch_db_update_notifier:notify({updated, Db#db.name}), {reply, {ok, (Db2#db.header)#db_header.purge_seq, IdRevsPurged}, Db2}; handle_call(start_compact, _From, Db) -> case Db#db.compactor_pid of nil -> ?LOG_INFO("Starting compaction for db \"~s\"", [Db#db.name]), Pid = spawn_link(fun() -> start_copy_compact(Db) end), Db2 = Db#db{compactor_pid=Pid}, ok = gen_server:call(Db#db.main_pid, {db_updated, Db2}), {reply, {ok, Pid}, Db2}; _ -> % compact currently running, this is a no-op {reply, {ok, Db#db.compactor_pid}, Db} end; handle_call(cancel_compact, _From, #db{compactor_pid = nil} = Db) -> {reply, ok, Db}; handle_call(cancel_compact, _From, #db{compactor_pid = Pid} = Db) -> unlink(Pid), exit(Pid, kill), RootDir = couch_config:get("couchdb", "database_dir", "."), ok = couch_file:delete(RootDir, Db#db.filepath ++ ".compact"), {reply, ok, Db#db{compactor_pid = nil}}; handle_call({compact_done, CompactFilepath}, _From, #db{filepath=Filepath}=Db) -> {ok, NewFd} = couch_file:open(CompactFilepath), ReaderFd = open_reader_fd(CompactFilepath, Db#db.options), {ok, NewHeader} = couch_file:read_header(NewFd), #db{update_seq=NewSeq} = NewDb = init_db(Db#db.name, Filepath, NewFd, ReaderFd, NewHeader, Db#db.options), unlink(NewFd), case Db#db.update_seq == NewSeq of true -> % suck up all the local docs into memory and write them to the new db {ok, _, LocalDocs} = couch_btree:foldl(Db#db.local_docs_btree, fun(Value, _Offset, Acc) -> {ok, [Value | Acc]} end, []), {ok, NewLocalBtree} = couch_btree:add(NewDb#db.local_docs_btree, LocalDocs), NewDb2 = commit_data(NewDb#db{ local_docs_btree = NewLocalBtree, main_pid = Db#db.main_pid, filepath = Filepath, instance_start_time = Db#db.instance_start_time, revs_limit = Db#db.revs_limit }), ?LOG_DEBUG("CouchDB swapping files ~s and ~s.", [Filepath, CompactFilepath]), RootDir = couch_config:get("couchdb", "database_dir", "."), couch_file:delete(RootDir, Filepath), ok = file:rename(CompactFilepath, Filepath), close_db(Db), NewDb3 = refresh_validate_doc_funs(NewDb2), ok = gen_server:call(Db#db.main_pid, {db_updated, NewDb3}, infinity), couch_db_update_notifier:notify({compacted, NewDb3#db.name}), ?LOG_INFO("Compaction for db \"~s\" completed.", [Db#db.name]), {reply, ok, NewDb3#db{compactor_pid=nil}}; false -> ?LOG_INFO("Compaction file still behind main file " "(update seq=~p. compact update seq=~p). Retrying.", [Db#db.update_seq, NewSeq]), close_db(NewDb), {reply, {retry, Db}, Db} end. handle_cast(Msg, #db{name = Name} = Db) -> ?LOG_ERROR("Database `~s` updater received unexpected cast: ~p", [Name, Msg]), {stop, Msg, Db}. handle_info({update_docs, Client, GroupedDocs, NonRepDocs, MergeConflicts, FullCommit}, Db) -> GroupedDocs2 = [[{Client, D} || D <- DocGroup] || DocGroup <- GroupedDocs], if NonRepDocs == [] -> {GroupedDocs3, Clients, FullCommit2} = collect_updates(GroupedDocs2, [Client], MergeConflicts, FullCommit); true -> GroupedDocs3 = GroupedDocs2, FullCommit2 = FullCommit, Clients = [Client] end, NonRepDocs2 = [{Client, NRDoc} || NRDoc <- NonRepDocs], try update_docs_int(Db, GroupedDocs3, NonRepDocs2, MergeConflicts, FullCommit2) of {ok, Db2, UpdatedDDocIds} -> ok = gen_server:call(Db#db.main_pid, {db_updated, Db2}), if Db2#db.update_seq /= Db#db.update_seq -> couch_db_update_notifier:notify({updated, Db2#db.name}); true -> ok end, [catch(ClientPid ! {done, self()}) || ClientPid <- Clients], lists:foreach(fun(DDocId) -> couch_db_update_notifier:notify({ddoc_updated, {Db#db.name, DDocId}}) end, UpdatedDDocIds), {noreply, Db2} catch throw: retry -> [catch(ClientPid ! {retry, self()}) || ClientPid <- Clients], {noreply, Db} end; handle_info(delayed_commit, #db{waiting_delayed_commit=nil}=Db) -> %no outstanding delayed commits, ignore {noreply, Db}; handle_info(delayed_commit, Db) -> case commit_data(Db) of Db -> {noreply, Db}; Db2 -> ok = gen_server:call(Db2#db.main_pid, {db_updated, Db2}), {noreply, Db2} end; handle_info({'EXIT', _Pid, normal}, Db) -> {noreply, Db}; handle_info({'EXIT', _Pid, Reason}, Db) -> {stop, Reason, Db}. code_change(_OldVsn, State, _Extra) -> {ok, State}. merge_updates([], RestB, AccOutGroups) -> lists:reverse(AccOutGroups, RestB); merge_updates(RestA, [], AccOutGroups) -> lists:reverse(AccOutGroups, RestA); merge_updates([[{_, {#doc{id=IdA}, _}}|_]=GroupA | RestA], [[{_, {#doc{id=IdB}, _}}|_]=GroupB | RestB], AccOutGroups) -> if IdA == IdB -> merge_updates(RestA, RestB, [GroupA ++ GroupB | AccOutGroups]); IdA < IdB -> merge_updates(RestA, [GroupB | RestB], [GroupA | AccOutGroups]); true -> merge_updates([GroupA | RestA], RestB, [GroupB | AccOutGroups]) end. collect_updates(GroupedDocsAcc, ClientsAcc, MergeConflicts, FullCommit) -> receive % Only collect updates with the same MergeConflicts flag and without % local docs. It's easier to just avoid multiple _local doc % updaters than deal with their possible conflicts, and local docs % writes are relatively rare. Can be optmized later if really needed. {update_docs, Client, GroupedDocs, [], MergeConflicts, FullCommit2} -> GroupedDocs2 = [[{Client, Doc} || Doc <- DocGroup] || DocGroup <- GroupedDocs], GroupedDocsAcc2 = merge_updates(GroupedDocsAcc, GroupedDocs2, []), collect_updates(GroupedDocsAcc2, [Client | ClientsAcc], MergeConflicts, (FullCommit or FullCommit2)) after 0 -> {GroupedDocsAcc, ClientsAcc, FullCommit} end. btree_by_seq_split(#doc_info{id=Id, high_seq=KeySeq, revs=Revs}) -> {RevInfos, DeletedRevInfos} = lists:foldl( fun(#rev_info{deleted = false, seq = Seq} = Ri, {Acc, AccDel}) -> {[{Ri#rev_info.rev, Seq, Ri#rev_info.body_sp} | Acc], AccDel}; (#rev_info{deleted = true, seq = Seq} = Ri, {Acc, AccDel}) -> {Acc, [{Ri#rev_info.rev, Seq, Ri#rev_info.body_sp} | AccDel]} end, {[], []}, Revs), {KeySeq, {Id, lists:reverse(RevInfos), lists:reverse(DeletedRevInfos)}}. btree_by_seq_join(KeySeq, {Id, RevInfos, DeletedRevInfos}) -> #doc_info{ id = Id, high_seq=KeySeq, revs = [#rev_info{rev=Rev,seq=Seq,deleted=false,body_sp = Bp} || {Rev, Seq, Bp} <- RevInfos] ++ [#rev_info{rev=Rev,seq=Seq,deleted=true,body_sp = Bp} || {Rev, Seq, Bp} <- DeletedRevInfos]}. btree_by_id_split(#full_doc_info{id=Id, update_seq=Seq, deleted=Deleted, rev_tree=Tree}) -> DiskTree = couch_key_tree:map( fun(_RevId, ?REV_MISSING) -> ?REV_MISSING; (_RevId, RevValue) -> IsDeleted = element(1, RevValue), BodyPointer = element(2, RevValue), UpdateSeq = element(3, RevValue), Size = case tuple_size(RevValue) of 4 -> element(4, RevValue); 3 -> % pre 1.2 format, will be upgraded on compaction nil end, {if IsDeleted -> 1; true -> 0 end, BodyPointer, UpdateSeq, Size} end, Tree), {Id, {Seq, if Deleted -> 1; true -> 0 end, DiskTree}}. btree_by_id_join(Id, {HighSeq, Deleted, DiskTree}) -> {Tree, LeafsSize} = couch_key_tree:mapfold( fun(_RevId, {IsDeleted, BodyPointer, UpdateSeq}, leaf, _Acc) -> % pre 1.2 format, will be upgraded on compaction {{IsDeleted == 1, BodyPointer, UpdateSeq, nil}, nil}; (_RevId, {IsDeleted, BodyPointer, UpdateSeq}, branch, Acc) -> {{IsDeleted == 1, BodyPointer, UpdateSeq, nil}, Acc}; (_RevId, {IsDeleted, BodyPointer, UpdateSeq, Size}, leaf, Acc) -> Acc2 = sum_leaf_sizes(Acc, Size), {{IsDeleted == 1, BodyPointer, UpdateSeq, Size}, Acc2}; (_RevId, {IsDeleted, BodyPointer, UpdateSeq, Size}, branch, Acc) -> {{IsDeleted == 1, BodyPointer, UpdateSeq, Size}, Acc}; (_RevId, ?REV_MISSING, _Type, Acc) -> {?REV_MISSING, Acc} end, 0, DiskTree), #full_doc_info{ id = Id, update_seq = HighSeq, deleted = (Deleted == 1), rev_tree = Tree, leafs_size = LeafsSize }. btree_by_id_reduce(reduce, FullDocInfos) -> lists:foldl( fun(Info, {NotDeleted, Deleted, Size}) -> Size2 = sum_leaf_sizes(Size, Info#full_doc_info.leafs_size), case Info#full_doc_info.deleted of true -> {NotDeleted, Deleted + 1, Size2}; false -> {NotDeleted + 1, Deleted, Size2} end end, {0, 0, 0}, FullDocInfos); btree_by_id_reduce(rereduce, Reds) -> lists:foldl( fun({NotDeleted, Deleted}, {AccNotDeleted, AccDeleted, _AccSize}) -> % pre 1.2 format, will be upgraded on compaction {AccNotDeleted + NotDeleted, AccDeleted + Deleted, nil}; ({NotDeleted, Deleted, Size}, {AccNotDeleted, AccDeleted, AccSize}) -> AccSize2 = sum_leaf_sizes(AccSize, Size), {AccNotDeleted + NotDeleted, AccDeleted + Deleted, AccSize2} end, {0, 0, 0}, Reds). sum_leaf_sizes(nil, _) -> nil; sum_leaf_sizes(_, nil) -> nil; sum_leaf_sizes(Size1, Size2) -> Size1 + Size2. btree_by_seq_reduce(reduce, DocInfos) -> % count the number of documents length(DocInfos); btree_by_seq_reduce(rereduce, Reds) -> lists:sum(Reds). simple_upgrade_record(Old, New) when tuple_size(Old) < tuple_size(New) -> OldSz = tuple_size(Old), NewValuesTail = lists:sublist(tuple_to_list(New), OldSz + 1, tuple_size(New) - OldSz), list_to_tuple(tuple_to_list(Old) ++ NewValuesTail); simple_upgrade_record(Old, _New) -> Old. -define(OLD_DISK_VERSION_ERROR, "Database files from versions smaller than 0.10.0 are no longer supported"). init_db(DbName, Filepath, Fd, ReaderFd, Header0, Options) -> Header1 = simple_upgrade_record(Header0, #db_header{}), Header = case element(2, Header1) of 1 -> throw({database_disk_version_error, ?OLD_DISK_VERSION_ERROR}); 2 -> throw({database_disk_version_error, ?OLD_DISK_VERSION_ERROR}); 3 -> throw({database_disk_version_error, ?OLD_DISK_VERSION_ERROR}); 4 -> Header1#db_header{security_ptr = nil}; % 0.10 and pre 0.11 5 -> Header1; % pre 1.2 ?LATEST_DISK_VERSION -> Header1; _ -> throw({database_disk_version_error, "Incorrect disk header version"}) end, {ok, FsyncOptions} = couch_util:parse_term( couch_config:get("couchdb", "fsync_options", "[before_header, after_header, on_file_open]")), case lists:member(on_file_open, FsyncOptions) of true -> ok = couch_file:sync(Fd); _ -> ok end, Compression = couch_compress:get_compression_method(), {ok, IdBtree} = couch_btree:open(Header#db_header.fulldocinfo_by_id_btree_state, Fd, [{split, fun(X) -> btree_by_id_split(X) end}, {join, fun(X,Y) -> btree_by_id_join(X,Y) end}, {reduce, fun(X,Y) -> btree_by_id_reduce(X,Y) end}, {compression, Compression}]), {ok, SeqBtree} = couch_btree:open(Header#db_header.docinfo_by_seq_btree_state, Fd, [{split, fun(X) -> btree_by_seq_split(X) end}, {join, fun(X,Y) -> btree_by_seq_join(X,Y) end}, {reduce, fun(X,Y) -> btree_by_seq_reduce(X,Y) end}, {compression, Compression}]), {ok, LocalDocsBtree} = couch_btree:open(Header#db_header.local_docs_btree_state, Fd, [{compression, Compression}]), case Header#db_header.security_ptr of nil -> Security = [], SecurityPtr = nil; SecurityPtr -> {ok, Security} = couch_file:pread_term(Fd, SecurityPtr) end, % convert start time tuple to microsecs and store as a binary string {MegaSecs, Secs, MicroSecs} = now(), StartTime = ?l2b(io_lib:format("~p", [(MegaSecs*1000000*1000000) + (Secs*1000000) + MicroSecs])), {ok, RefCntr} = couch_ref_counter:start([Fd, ReaderFd]), #db{ update_pid=self(), fd = ReaderFd, updater_fd = Fd, fd_ref_counter = RefCntr, header=Header, fulldocinfo_by_id_btree = IdBtree, docinfo_by_seq_btree = SeqBtree, local_docs_btree = LocalDocsBtree, committed_update_seq = Header#db_header.update_seq, update_seq = Header#db_header.update_seq, name = DbName, filepath = Filepath, security = Security, security_ptr = SecurityPtr, instance_start_time = StartTime, revs_limit = Header#db_header.revs_limit, fsync_options = FsyncOptions, options = Options, compression = Compression, before_doc_update = couch_util:get_value(before_doc_update, Options, nil), after_doc_read = couch_util:get_value(after_doc_read, Options, nil) }. open_reader_fd(Filepath, Options) -> {ok, Fd} = case lists:member(sys_db, Options) of true -> couch_file:open(Filepath, [read_only, sys_db]); false -> couch_file:open(Filepath, [read_only]) end, unlink(Fd), Fd. close_db(#db{fd_ref_counter = RefCntr}) -> couch_ref_counter:drop(RefCntr). refresh_validate_doc_funs(Db0) -> Db = Db0#db{user_ctx = #user_ctx{roles=[<<"_admin">>]}}, DesignDocs = couch_db:get_design_docs(Db), ProcessDocFuns = lists:flatmap( fun(DesignDocInfo) -> {ok, DesignDoc} = couch_db:open_doc_int( Db, DesignDocInfo, [ejson_body]), case couch_doc:get_validate_doc_fun(DesignDoc) of nil -> []; Fun -> [Fun] end end, DesignDocs), Db0#db{validate_doc_funs=ProcessDocFuns}. % rev tree functions flush_trees(_Db, [], AccFlushedTrees) -> {ok, lists:reverse(AccFlushedTrees)}; flush_trees(#db{updater_fd = Fd} = Db, [InfoUnflushed | RestUnflushed], AccFlushed) -> #full_doc_info{update_seq=UpdateSeq, rev_tree=Unflushed} = InfoUnflushed, {Flushed, LeafsSize} = couch_key_tree:mapfold( fun(_Rev, Value, Type, Acc) -> case Value of #doc{deleted = IsDeleted, body = {summary, Summary, AttsFd}} -> % this node value is actually an unwritten document summary, % write to disk. % make sure the Fd in the written bins is the same Fd we are % and convert bins, removing the FD. % All bins should have been written to disk already. case {AttsFd, Fd} of {nil, _} -> ok; {SameFd, SameFd} -> ok; _ -> % Fd where the attachments were written to is not the same % as our Fd. This can happen when a database is being % switched out during a compaction. ?LOG_DEBUG("File where the attachments are written has" " changed. Possibly retrying.", []), throw(retry) end, {ok, NewSummaryPointer, SummarySize} = couch_file:append_raw_chunk(Fd, Summary), TotalSize = lists:foldl( fun(#att{att_len = L}, A) -> A + L end, SummarySize, Value#doc.atts), NewValue = {IsDeleted, NewSummaryPointer, UpdateSeq, TotalSize}, case Type of leaf -> {NewValue, Acc + TotalSize}; branch -> {NewValue, Acc} end; {_, _, _, LeafSize} when Type =:= leaf, LeafSize =/= nil -> {Value, Acc + LeafSize}; _ -> {Value, Acc} end end, 0, Unflushed), InfoFlushed = InfoUnflushed#full_doc_info{ rev_tree = Flushed, leafs_size = LeafsSize }, flush_trees(Db, RestUnflushed, [InfoFlushed | AccFlushed]). send_result(Client, Ref, NewResult) -> % used to send a result to the client catch(Client ! {result, self(), {Ref, NewResult}}). merge_rev_trees(_Limit, _Merge, [], [], AccNewInfos, AccRemoveSeqs, AccSeq) -> {ok, lists:reverse(AccNewInfos), AccRemoveSeqs, AccSeq}; merge_rev_trees(Limit, MergeConflicts, [NewDocs|RestDocsList], [OldDocInfo|RestOldInfo], AccNewInfos, AccRemoveSeqs, AccSeq) -> #full_doc_info{id=Id,rev_tree=OldTree,deleted=OldDeleted0,update_seq=OldSeq} = OldDocInfo, {NewRevTree, _} = lists:foldl( fun({Client, {#doc{revs={Pos,[_Rev|PrevRevs]}}=NewDoc, Ref}}, {AccTree, OldDeleted}) -> if not MergeConflicts -> case couch_key_tree:merge(AccTree, couch_doc:to_path(NewDoc), Limit) of {_NewTree, conflicts} when (not OldDeleted) -> send_result(Client, Ref, conflict), {AccTree, OldDeleted}; {NewTree, conflicts} when PrevRevs /= [] -> % Check to be sure if prev revision was specified, it's % a leaf node in the tree Leafs = couch_key_tree:get_all_leafs(AccTree), IsPrevLeaf = lists:any(fun({_, {LeafPos, [LeafRevId|_]}}) -> {LeafPos, LeafRevId} == {Pos-1, hd(PrevRevs)} end, Leafs), if IsPrevLeaf -> {NewTree, OldDeleted}; true -> send_result(Client, Ref, conflict), {AccTree, OldDeleted} end; {NewTree, no_conflicts} when AccTree == NewTree -> % the tree didn't change at all % meaning we are saving a rev that's already % been editted again. if (Pos == 1) and OldDeleted -> % this means we are recreating a brand new document % into a state that already existed before. % put the rev into a subsequent edit of the deletion #doc_info{revs=[#rev_info{rev={OldPos,OldRev}}|_]} = couch_doc:to_doc_info(OldDocInfo), NewRevId = couch_db:new_revid( NewDoc#doc{revs={OldPos, [OldRev]}}), NewDoc2 = NewDoc#doc{revs={OldPos + 1, [NewRevId, OldRev]}}, {NewTree2, _} = couch_key_tree:merge(AccTree, couch_doc:to_path(NewDoc2), Limit), % we changed the rev id, this tells the caller we did send_result(Client, Ref, {ok, {OldPos + 1, NewRevId}}), {NewTree2, OldDeleted}; true -> send_result(Client, Ref, conflict), {AccTree, OldDeleted} end; {NewTree, _} -> {NewTree, NewDoc#doc.deleted} end; true -> {NewTree, _} = couch_key_tree:merge(AccTree, couch_doc:to_path(NewDoc), Limit), {NewTree, OldDeleted} end end, {OldTree, OldDeleted0}, NewDocs), if NewRevTree == OldTree -> % nothing changed merge_rev_trees(Limit, MergeConflicts, RestDocsList, RestOldInfo, AccNewInfos, AccRemoveSeqs, AccSeq); true -> % we have updated the document, give it a new seq # NewInfo = #full_doc_info{id=Id,update_seq=AccSeq+1,rev_tree=NewRevTree}, RemoveSeqs = case OldSeq of 0 -> AccRemoveSeqs; _ -> [OldSeq | AccRemoveSeqs] end, merge_rev_trees(Limit, MergeConflicts, RestDocsList, RestOldInfo, [NewInfo|AccNewInfos], RemoveSeqs, AccSeq+1) end. new_index_entries([], AccById, AccBySeq, AccDDocIds) -> {AccById, AccBySeq, AccDDocIds}; new_index_entries([FullDocInfo|RestInfos], AccById, AccBySeq, AccDDocIds) -> #doc_info{revs=[#rev_info{deleted=Deleted}|_], id=Id} = DocInfo = couch_doc:to_doc_info(FullDocInfo), AccDDocIds2 = case Id of <> -> [Id | AccDDocIds]; _ -> AccDDocIds end, new_index_entries(RestInfos, [FullDocInfo#full_doc_info{deleted=Deleted}|AccById], [DocInfo|AccBySeq], AccDDocIds2). stem_full_doc_infos(#db{revs_limit=Limit}, DocInfos) -> [Info#full_doc_info{rev_tree=couch_key_tree:stem(Tree, Limit)} || #full_doc_info{rev_tree=Tree}=Info <- DocInfos]. update_docs_int(Db, DocsList, NonRepDocs, MergeConflicts, FullCommit) -> #db{ fulldocinfo_by_id_btree = DocInfoByIdBTree, docinfo_by_seq_btree = DocInfoBySeqBTree, update_seq = LastSeq, revs_limit = RevsLimit } = Db, Ids = [Id || [{_Client, {#doc{id=Id}, _Ref}}|_] <- DocsList], % lookup up the old documents, if they exist. OldDocLookups = couch_btree:lookup(DocInfoByIdBTree, Ids), OldDocInfos = lists:zipwith( fun(_Id, {ok, FullDocInfo}) -> FullDocInfo; (Id, not_found) -> #full_doc_info{id=Id} end, Ids, OldDocLookups), % Merge the new docs into the revision trees. {ok, NewFullDocInfos, RemoveSeqs, NewSeq} = merge_rev_trees(RevsLimit, MergeConflicts, DocsList, OldDocInfos, [], [], LastSeq), % All documents are now ready to write. {ok, Db2} = update_local_docs(Db, NonRepDocs), % Write out the document summaries (the bodies are stored in the nodes of % the trees, the attachments are already written to disk) {ok, FlushedFullDocInfos} = flush_trees(Db2, NewFullDocInfos, []), {IndexFullDocInfos, IndexDocInfos, UpdatedDDocIds} = new_index_entries(FlushedFullDocInfos, [], [], []), % and the indexes {ok, DocInfoByIdBTree2} = couch_btree:add_remove(DocInfoByIdBTree, IndexFullDocInfos, []), {ok, DocInfoBySeqBTree2} = couch_btree:add_remove(DocInfoBySeqBTree, IndexDocInfos, RemoveSeqs), Db3 = Db2#db{ fulldocinfo_by_id_btree = DocInfoByIdBTree2, docinfo_by_seq_btree = DocInfoBySeqBTree2, update_seq = NewSeq}, % Check if we just updated any design documents, and update the validation % funs if we did. Db4 = case UpdatedDDocIds of [] -> Db3; _ -> refresh_validate_doc_funs(Db3) end, {ok, commit_data(Db4, not FullCommit), UpdatedDDocIds}. update_local_docs(Db, []) -> {ok, Db}; update_local_docs(#db{local_docs_btree=Btree}=Db, Docs) -> Ids = [Id || {_Client, {#doc{id=Id}, _Ref}} <- Docs], OldDocLookups = couch_btree:lookup(Btree, Ids), BtreeEntries = lists:zipwith( fun({Client, {#doc{id=Id,deleted=Delete,revs={0,PrevRevs},body=Body}, Ref}}, OldDocLookup) -> case PrevRevs of [RevStr|_] -> PrevRev = list_to_integer(?b2l(RevStr)); [] -> PrevRev = 0 end, OldRev = case OldDocLookup of {ok, {_, {OldRev0, _}}} -> OldRev0; not_found -> 0 end, case OldRev == PrevRev of true -> case Delete of false -> send_result(Client, Ref, {ok, {0, ?l2b(integer_to_list(PrevRev + 1))}}), {update, {Id, {PrevRev + 1, Body}}}; true -> send_result(Client, Ref, {ok, {0, <<"0">>}}), {remove, Id} end; false -> send_result(Client, Ref, conflict), ignore end end, Docs, OldDocLookups), BtreeIdsRemove = [Id || {remove, Id} <- BtreeEntries], BtreeIdsUpdate = [{Key, Val} || {update, {Key, Val}} <- BtreeEntries], {ok, Btree2} = couch_btree:add_remove(Btree, BtreeIdsUpdate, BtreeIdsRemove), {ok, Db#db{local_docs_btree = Btree2}}. commit_data(Db) -> commit_data(Db, false). db_to_header(Db, Header) -> Header#db_header{ update_seq = Db#db.update_seq, docinfo_by_seq_btree_state = couch_btree:get_state(Db#db.docinfo_by_seq_btree), fulldocinfo_by_id_btree_state = couch_btree:get_state(Db#db.fulldocinfo_by_id_btree), local_docs_btree_state = couch_btree:get_state(Db#db.local_docs_btree), security_ptr = Db#db.security_ptr, revs_limit = Db#db.revs_limit}. commit_data(#db{waiting_delayed_commit=nil} = Db, true) -> Db#db{waiting_delayed_commit=erlang:send_after(1000,self(),delayed_commit)}; commit_data(Db, true) -> Db; commit_data(Db, _) -> #db{ updater_fd = Fd, filepath = Filepath, header = OldHeader, fsync_options = FsyncOptions, waiting_delayed_commit = Timer } = Db, if is_reference(Timer) -> erlang:cancel_timer(Timer); true -> ok end, case db_to_header(Db, OldHeader) of OldHeader -> Db#db{waiting_delayed_commit=nil}; Header -> case lists:member(before_header, FsyncOptions) of true -> ok = couch_file:sync(Filepath); _ -> ok end, ok = couch_file:write_header(Fd, Header), case lists:member(after_header, FsyncOptions) of true -> ok = couch_file:sync(Filepath); _ -> ok end, Db#db{waiting_delayed_commit=nil, header=Header, committed_update_seq=Db#db.update_seq} end. copy_doc_attachments(#db{updater_fd = SrcFd} = SrcDb, SrcSp, DestFd) -> {ok, {BodyData, BinInfos0}} = couch_db:read_doc(SrcDb, SrcSp), BinInfos = case BinInfos0 of _ when is_binary(BinInfos0) -> couch_compress:decompress(BinInfos0); _ when is_list(BinInfos0) -> % pre 1.2 file format BinInfos0 end, % copy the bin values NewBinInfos = lists:map( fun({Name, Type, BinSp, AttLen, RevPos, ExpectedMd5}) -> % 010 UPGRADE CODE {NewBinSp, AttLen, AttLen, ActualMd5, _IdentityMd5} = couch_stream:copy_to_new_stream(SrcFd, BinSp, DestFd), check_md5(ExpectedMd5, ActualMd5), {Name, Type, NewBinSp, AttLen, AttLen, RevPos, ExpectedMd5, identity}; ({Name, Type, BinSp, AttLen, DiskLen, RevPos, ExpectedMd5, Enc1}) -> {NewBinSp, AttLen, _, ActualMd5, _IdentityMd5} = couch_stream:copy_to_new_stream(SrcFd, BinSp, DestFd), check_md5(ExpectedMd5, ActualMd5), Enc = case Enc1 of true -> % 0110 UPGRADE CODE gzip; false -> % 0110 UPGRADE CODE identity; _ -> Enc1 end, {Name, Type, NewBinSp, AttLen, DiskLen, RevPos, ExpectedMd5, Enc} end, BinInfos), {BodyData, NewBinInfos}. check_md5(Md5, Md5) -> ok; check_md5(_, _) -> throw(md5_mismatch). copy_docs(Db, #db{updater_fd = DestFd} = NewDb, InfoBySeq0, Retry) -> % COUCHDB-968, make sure we prune duplicates during compaction InfoBySeq = lists:usort(fun(#doc_info{id=A}, #doc_info{id=B}) -> A =< B end, InfoBySeq0), Ids = [Id || #doc_info{id=Id} <- InfoBySeq], LookupResults = couch_btree:lookup(Db#db.fulldocinfo_by_id_btree, Ids), NewFullDocInfos1 = lists:map( fun({ok, #full_doc_info{rev_tree=RevTree}=Info}) -> Info#full_doc_info{rev_tree=couch_key_tree:map( fun(_, _, branch) -> ?REV_MISSING; (_Rev, LeafVal, leaf) -> IsDel = element(1, LeafVal), Sp = element(2, LeafVal), Seq = element(3, LeafVal), {_Body, AttsInfo} = Summary = copy_doc_attachments( Db, Sp, DestFd), SummaryChunk = make_doc_summary(NewDb, Summary), {ok, Pos, SummarySize} = couch_file:append_raw_chunk( DestFd, SummaryChunk), TotalLeafSize = lists:foldl( fun({_, _, _, AttLen, _, _, _, _}, S) -> S + AttLen end, SummarySize, AttsInfo), {IsDel, Pos, Seq, TotalLeafSize} end, RevTree)} end, LookupResults), NewFullDocInfos = stem_full_doc_infos(Db, NewFullDocInfos1), NewDocInfos = [couch_doc:to_doc_info(Info) || Info <- NewFullDocInfos], RemoveSeqs = case Retry of false -> []; true -> % We are retrying a compaction, meaning the documents we are copying may % already exist in our file and must be removed from the by_seq index. Existing = couch_btree:lookup(NewDb#db.fulldocinfo_by_id_btree, Ids), [Seq || {ok, #full_doc_info{update_seq=Seq}} <- Existing] end, {ok, DocInfoBTree} = couch_btree:add_remove( NewDb#db.docinfo_by_seq_btree, NewDocInfos, RemoveSeqs), {ok, FullDocInfoBTree} = couch_btree:add_remove( NewDb#db.fulldocinfo_by_id_btree, NewFullDocInfos, []), update_compact_task(length(NewFullDocInfos)), NewDb#db{ fulldocinfo_by_id_btree=FullDocInfoBTree, docinfo_by_seq_btree=DocInfoBTree}. copy_compact(Db, NewDb0, Retry) -> FsyncOptions = [Op || Op <- NewDb0#db.fsync_options, Op == before_header], Compression = couch_compress:get_compression_method(), NewDb = NewDb0#db{fsync_options=FsyncOptions, compression=Compression}, TotalChanges = couch_db:count_changes_since(Db, NewDb#db.update_seq), BufferSize = list_to_integer( couch_config:get("database_compaction", "doc_buffer_size", "524288")), CheckpointAfter = couch_util:to_integer( couch_config:get("database_compaction", "checkpoint_after", BufferSize * 10)), EnumBySeqFun = fun(#doc_info{high_seq=Seq}=DocInfo, _Offset, {AccNewDb, AccUncopied, AccUncopiedSize, AccCopiedSize}) -> AccUncopiedSize2 = AccUncopiedSize + ?term_size(DocInfo), if AccUncopiedSize2 >= BufferSize -> NewDb2 = copy_docs( Db, AccNewDb, lists:reverse([DocInfo | AccUncopied]), Retry), AccCopiedSize2 = AccCopiedSize + AccUncopiedSize2, if AccCopiedSize2 >= CheckpointAfter -> {ok, {commit_data(NewDb2#db{update_seq = Seq}), [], 0, 0}}; true -> {ok, {NewDb2#db{update_seq = Seq}, [], 0, AccCopiedSize2}} end; true -> {ok, {AccNewDb, [DocInfo | AccUncopied], AccUncopiedSize2, AccCopiedSize}} end end, TaskProps0 = [ {type, database_compaction}, {database, Db#db.name}, {progress, 0}, {changes_done, 0}, {total_changes, TotalChanges} ], case Retry and couch_task_status:is_task_added() of true -> couch_task_status:update([ {retry, true}, {progress, 0}, {changes_done, 0}, {total_changes, TotalChanges} ]); false -> couch_task_status:add_task(TaskProps0), couch_task_status:set_update_frequency(500) end, {ok, _, {NewDb2, Uncopied, _, _}} = couch_btree:foldl(Db#db.docinfo_by_seq_btree, EnumBySeqFun, {NewDb, [], 0, 0}, [{start_key, NewDb#db.update_seq + 1}]), NewDb3 = copy_docs(Db, NewDb2, lists:reverse(Uncopied), Retry), % copy misc header values if NewDb3#db.security /= Db#db.security -> {ok, Ptr, _} = couch_file:append_term( NewDb3#db.updater_fd, Db#db.security, [{compression, NewDb3#db.compression}]), NewDb4 = NewDb3#db{security=Db#db.security, security_ptr=Ptr}; true -> NewDb4 = NewDb3 end, commit_data(NewDb4#db{update_seq=Db#db.update_seq}). start_copy_compact(#db{name=Name,filepath=Filepath,header=#db_header{purge_seq=PurgeSeq}}=Db) -> CompactFile = Filepath ++ ".compact", ?LOG_DEBUG("Compaction process spawned for db \"~s\"", [Name]), case couch_file:open(CompactFile, [nologifmissing]) of {ok, Fd} -> Retry = true, case couch_file:read_header(Fd) of {ok, Header} -> ok; no_valid_header -> ok = couch_file:write_header(Fd, Header=#db_header{}) end; {error, enoent} -> {ok, Fd} = couch_file:open(CompactFile, [create]), Retry = false, ok = couch_file:write_header(Fd, Header=#db_header{}) end, ReaderFd = open_reader_fd(CompactFile, Db#db.options), NewDb = init_db(Name, CompactFile, Fd, ReaderFd, Header, Db#db.options), NewDb2 = if PurgeSeq > 0 -> {ok, PurgedIdsRevs} = couch_db:get_last_purged(Db), {ok, Pointer, _} = couch_file:append_term( Fd, PurgedIdsRevs, [{compression, NewDb#db.compression}]), NewDb#db{header=Header#db_header{purge_seq=PurgeSeq, purged_docs=Pointer}}; true -> NewDb end, unlink(Fd), NewDb3 = copy_compact(Db, NewDb2, Retry), close_db(NewDb3), case gen_server:call( Db#db.update_pid, {compact_done, CompactFile}, infinity) of ok -> ok; {retry, CurrentDb} -> start_copy_compact(CurrentDb) end. update_compact_task(NumChanges) -> [Changes, Total] = couch_task_status:get([changes_done, total_changes]), Changes2 = Changes + NumChanges, Progress = case Total of 0 -> 0; _ -> (Changes2 * 100) div Total end, couch_task_status:update([{changes_done, Changes2}, {progress, Progress}]). make_doc_summary(#db{compression = Comp}, {Body0, Atts0}) -> Body = case couch_compress:is_compressed(Body0, Comp) of true -> Body0; false -> % pre 1.2 database file format couch_compress:compress(Body0, Comp) end, Atts = case couch_compress:is_compressed(Atts0, Comp) of true -> Atts0; false -> couch_compress:compress(Atts0, Comp) end, SummaryBin = ?term_to_bin({Body, Atts}), couch_file:assemble_file_chunk(SummaryBin, couch_util:md5(SummaryBin)). apache-couchdb-1.6.0/src/couchdb/couch_httpd_vhost.erl0000644000175000001440000002772012332105522022757 0ustar00djcusers00000000000000% Licensed under the Apache License, Version 2.0 (the "License"); you may not % use this file except in compliance with the License. You may obtain a copy of % the License at % % http://www.apache.org/licenses/LICENSE-2.0 % % Unless required by applicable law or agreed to in writing, software % distributed under the License is distributed on an "AS IS" BASIS, WITHOUT % WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the % License for the specific language governing permissions and limitations under % the License. -module(couch_httpd_vhost). -behaviour(gen_server). -export([start_link/0, config_change/2, reload/0, get_state/0, dispatch_host/1]). -export([urlsplit_netloc/2, redirect_to_vhost/2]). -export([host/1, split_host_port/1]). -export([init/1, handle_call/3, handle_cast/2, handle_info/2, terminate/2, code_change/3]). -include("couch_db.hrl"). -define(SEPARATOR, $\/). -define(MATCH_ALL, {bind, '*'}). -record(vhosts_state, { vhosts, vhost_globals, vhosts_fun}). %% doc the vhost manager. %% This gen_server keep state of vhosts added to the ini and try to %% match the Host header (or forwarded) against rules built against %% vhost list. %% %% Declaration of vhosts take place in the configuration file : %% %% [vhosts] %% example.com = /example %% *.example.com = /example %% %% The first line will rewrite the rquest to display the content of the %% example database. This rule works only if the Host header is %% 'example.com' and won't work for CNAMEs. Second rule on the other hand %% match all CNAMES to example db. So www.example.com or db.example.com %% will work. %% %% The wildcard ('*') should always be the last in the cnames: %% %% "*.db.example.com = /" will match all cname on top of db %% examples to the root of the machine. %% %% %% Rewriting Hosts to path %% ----------------------- %% %% Like in the _rewrite handler you could match some variable and use %them to create the target path. Some examples: %% %% [vhosts] %% *.example.com = /* %% :dbname.example.com = /:dbname %% :ddocname.:dbname.example.com = /:dbname/_design/:ddocname/_rewrite %% %% First rule pass wildcard as dbname, second do the same but use a %% variable name and the third one allows you to use any app with %% @ddocname in any db with @dbname . %% %% You could also change the default function to handle request by %% changing the setting `redirect_vhost_handler` in `httpd` section of %% the Ini: %% %% [httpd] %% redirect_vhost_handler = {Module, Fun} %% %% The function take 2 args : the mochiweb request object and the target %%% path. start_link() -> gen_server:start_link({local, ?MODULE}, ?MODULE, [], []). %% @doc reload vhosts rules reload() -> gen_server:call(?MODULE, reload). get_state() -> gen_server:call(?MODULE, get_state). %% @doc Try to find a rule matching current Host heade. some rule is %% found it rewrite the Mochiweb Request else it return current Request. dispatch_host(MochiReq) -> #vhosts_state{ vhost_globals = VHostGlobals, vhosts = VHosts, vhosts_fun=Fun} = get_state(), {"/" ++ VPath, Query, Fragment} = mochiweb_util:urlsplit_path(MochiReq:get(raw_path)), VPathParts = string:tokens(VPath, "/"), VHost = host(MochiReq), {VHostParts, VhostPort} = split_host_port(VHost), FinalMochiReq = case try_bind_vhost(VHosts, lists:reverse(VHostParts), VhostPort, VPathParts) of no_vhost_matched -> MochiReq; {VhostTarget, NewPath} -> case vhost_global(VHostGlobals, MochiReq) of true -> MochiReq; _Else -> NewPath1 = mochiweb_util:urlunsplit_path({NewPath, Query, Fragment}), MochiReq1 = mochiweb_request:new(MochiReq:get(socket), MochiReq:get(method), NewPath1, MochiReq:get(version), MochiReq:get(headers)), Fun(MochiReq1, VhostTarget) end end, FinalMochiReq. append_path("/"=_Target, "/"=_Path) -> "/"; append_path(Target, Path) -> Target ++ Path. % default redirect vhost handler redirect_to_vhost(MochiReq, VhostTarget) -> Path = MochiReq:get(raw_path), Target = append_path(VhostTarget, Path), ?LOG_DEBUG("Vhost Target: '~p'~n", [Target]), Headers = mochiweb_headers:enter("x-couchdb-vhost-path", Path, MochiReq:get(headers)), % build a new mochiweb request MochiReq1 = mochiweb_request:new(MochiReq:get(socket), MochiReq:get(method), Target, MochiReq:get(version), Headers), % cleanup, It force mochiweb to reparse raw uri. MochiReq1:cleanup(), MochiReq1. %% if so, then it will not be rewritten, but will run as a normal couchdb request. %* normally you'd use this for _uuids _utils and a few of the others you want to %% keep available on vhosts. You can also use it to make databases 'global'. vhost_global( VhostGlobals, MochiReq) -> RawUri = MochiReq:get(raw_path), {"/" ++ Path, _, _} = mochiweb_util:urlsplit_path(RawUri), Front = case couch_httpd:partition(Path) of {"", "", ""} -> "/"; % Special case the root url handler {FirstPart, _, _} -> FirstPart end, [true] == [true||V <- VhostGlobals, V == Front]. %% bind host %% first it try to bind the port then the hostname. try_bind_vhost([], _HostParts, _Port, _PathParts) -> no_vhost_matched; try_bind_vhost([VhostSpec|Rest], HostParts, Port, PathParts) -> {{VHostParts, VPort, VPath}, Path} = VhostSpec, case bind_port(VPort, Port) of ok -> case bind_vhost(lists:reverse(VHostParts), HostParts, []) of {ok, Bindings, Remainings} -> case bind_path(VPath, PathParts) of {ok, PathParts1} -> Path1 = make_target(Path, Bindings, Remainings, []), {make_path(Path1), make_path(PathParts1)}; fail -> try_bind_vhost(Rest, HostParts, Port, PathParts) end; fail -> try_bind_vhost(Rest, HostParts, Port, PathParts) end; fail -> try_bind_vhost(Rest, HostParts, Port, PathParts) end. %% doc: build new patch from bindings. bindings are query args %% (+ dynamic query rewritten if needed) and bindings found in %% bind_path step. %% TODO: merge code with rewrite. But we need to make sure we are %% in string here. make_target([], _Bindings, _Remaining, Acc) -> lists:reverse(Acc); make_target([?MATCH_ALL], _Bindings, Remaining, Acc) -> Acc1 = lists:reverse(Acc) ++ Remaining, Acc1; make_target([?MATCH_ALL|_Rest], _Bindings, Remaining, Acc) -> Acc1 = lists:reverse(Acc) ++ Remaining, Acc1; make_target([{bind, P}|Rest], Bindings, Remaining, Acc) -> P2 = case couch_util:get_value({bind, P}, Bindings) of undefined -> "undefined"; P1 -> P1 end, make_target(Rest, Bindings, Remaining, [P2|Acc]); make_target([P|Rest], Bindings, Remaining, Acc) -> make_target(Rest, Bindings, Remaining, [P|Acc]). %% bind port bind_port(Port, Port) -> ok; bind_port('*', _) -> ok; bind_port(_,_) -> fail. %% bind bhost bind_vhost([],[], Bindings) -> {ok, Bindings, []}; bind_vhost([?MATCH_ALL], [], _Bindings) -> fail; bind_vhost([?MATCH_ALL], Rest, Bindings) -> {ok, Bindings, Rest}; bind_vhost([], _HostParts, _Bindings) -> fail; bind_vhost([{bind, Token}|Rest], [Match|RestHost], Bindings) -> bind_vhost(Rest, RestHost, [{{bind, Token}, Match}|Bindings]); bind_vhost([Cname|Rest], [Cname|RestHost], Bindings) -> bind_vhost(Rest, RestHost, Bindings); bind_vhost(_, _, _) -> fail. %% bind path bind_path([], PathParts) -> {ok, PathParts}; bind_path(_VPathParts, []) -> fail; bind_path([Path|VRest],[Path|Rest]) -> bind_path(VRest, Rest); bind_path(_, _) -> fail. % utilities %% create vhost list from ini host(MochiReq) -> XHost = couch_config:get("httpd", "x_forwarded_host", "X-Forwarded-Host"), case MochiReq:get_header_value(XHost) of undefined -> case MochiReq:get_header_value("Host") of undefined -> []; Value1 -> Value1 end; Value -> Value end. make_vhosts() -> Vhosts = lists:foldl(fun ({_, ""}, Acc) -> Acc; ({Vhost, Path}, Acc) -> [{parse_vhost(Vhost), split_path(Path)}|Acc] end, [], couch_config:get("vhosts")), lists:reverse(lists:usort(Vhosts)). parse_vhost(Vhost) -> case urlsplit_netloc(Vhost, []) of {[], Path} -> {make_spec("*", []), '*', Path}; {HostPort, []} -> {H, P} = split_host_port(HostPort), H1 = make_spec(H, []), {H1, P, []}; {HostPort, Path} -> {H, P} = split_host_port(HostPort), H1 = make_spec(H, []), {H1, P, string:tokens(Path, "/")} end. split_host_port(HostAsString) -> case string:rchr(HostAsString, $:) of 0 -> {split_host(HostAsString), '*'}; N -> HostPart = string:substr(HostAsString, 1, N-1), case (catch erlang:list_to_integer(string:substr(HostAsString, N+1, length(HostAsString)))) of {'EXIT', _} -> {split_host(HostAsString), '*'}; Port -> {split_host(HostPart), Port} end end. split_host(HostAsString) -> string:tokens(HostAsString, "\."). split_path(Path) -> make_spec(string:tokens(Path, "/"), []). make_spec([], Acc) -> lists:reverse(Acc); make_spec([""|R], Acc) -> make_spec(R, Acc); make_spec(["*"|R], Acc) -> make_spec(R, [?MATCH_ALL|Acc]); make_spec([P|R], Acc) -> P1 = parse_var(P), make_spec(R, [P1|Acc]). parse_var(P) -> case P of ":" ++ Var -> {bind, Var}; _ -> P end. % mochiweb doesn't export it. urlsplit_netloc("", Acc) -> {lists:reverse(Acc), ""}; urlsplit_netloc(Rest=[C | _], Acc) when C =:= $/; C =:= $?; C =:= $# -> {lists:reverse(Acc), Rest}; urlsplit_netloc([C | Rest], Acc) -> urlsplit_netloc(Rest, [C | Acc]). make_path(Parts) -> "/" ++ string:join(Parts,[?SEPARATOR]). init(_) -> ok = couch_config:register(fun ?MODULE:config_change/2), %% load configuration {VHostGlobals, VHosts, Fun} = load_conf(), State = #vhosts_state{ vhost_globals=VHostGlobals, vhosts=VHosts, vhosts_fun=Fun}, {ok, State}. handle_call(reload, _From, _State) -> {VHostGlobals, VHosts, Fun} = load_conf(), {reply, ok, #vhosts_state{ vhost_globals=VHostGlobals, vhosts=VHosts, vhosts_fun=Fun}}; handle_call(get_state, _From, State) -> {reply, State, State}; handle_call(_Msg, _From, State) -> {noreply, State}. handle_cast(_Msg, State) -> {noreply, State}. handle_info(_Info, State) -> {noreply, State}. terminate(_Reason, _State) -> ok. code_change(_OldVsn, State, _Extra) -> {ok, State}. config_change("httpd", "vhost_global_handlers") -> ?MODULE:reload(); config_change("httpd", "redirect_vhost_handler") -> ?MODULE:reload(); config_change("vhosts", _) -> ?MODULE:reload(). load_conf() -> %% get vhost globals VHostGlobals = re:split(couch_config:get("httpd", "vhost_global_handlers",""), "\\s*,\\s*",[{return, list}]), %% build vhosts matching rules VHosts = make_vhosts(), %% build vhosts handler fun DefaultVHostFun = "{couch_httpd_vhost, redirect_to_vhost}", Fun = couch_httpd:make_arity_2_fun(couch_config:get("httpd", "redirect_vhost_handler", DefaultVHostFun)), {VHostGlobals, VHosts, Fun}. apache-couchdb-1.6.0/src/couchdb/couch_app.erl0000644000175000001440000000277512332105522021174 0ustar00djcusers00000000000000% Licensed under the Apache License, Version 2.0 (the "License"); you may not % use this file except in compliance with the License. You may obtain a copy of % the License at % % http://www.apache.org/licenses/LICENSE-2.0 % % Unless required by applicable law or agreed to in writing, software % distributed under the License is distributed on an "AS IS" BASIS, WITHOUT % WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the % License for the specific language governing permissions and limitations under % the License. -module(couch_app). -behaviour(application). -include("couch_db.hrl"). -export([start/2, stop/1]). start(_Type, DefaultIniFiles) -> IniFiles = get_ini_files(DefaultIniFiles), case start_apps([crypto, asn1, public_key, sasl, inets, oauth, ssl, ibrowse, syntax_tools, compiler, xmerl, mochiweb, os_mon]) of ok -> couch_server_sup:start_link(IniFiles); {error, Reason} -> {error, Reason} end. stop(_) -> ok. get_ini_files(Default) -> case init:get_argument(couch_ini) of error -> Default; {ok, [[]]} -> Default; {ok, [Values]} -> Values end. start_apps([]) -> ok; start_apps([App|Rest]) -> case application:start(App) of ok -> start_apps(Rest); {error, {already_started, App}} -> start_apps(Rest); {error, _Reason} when App =:= public_key -> % ignore on R12B5 start_apps(Rest); {error, _Reason} -> {error, {app_would_not_start, App}} end. apache-couchdb-1.6.0/src/couchdb/couch_event_sup.erl0000644000175000001440000000452612332105522022420 0ustar00djcusers00000000000000% Licensed under the Apache License, Version 2.0 (the "License"); you may not % use this file except in compliance with the License. You may obtain a copy of % the License at % % http://www.apache.org/licenses/LICENSE-2.0 % % Unless required by applicable law or agreed to in writing, software % distributed under the License is distributed on an "AS IS" BASIS, WITHOUT % WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the % License for the specific language governing permissions and limitations under % the License. %% The purpose of this module is to allow event handlers to particpate in Erlang %% supervisor trees. It provide a monitorable process that crashes if the event %% handler fails. The process, when shutdown, deregisters the event handler. -module(couch_event_sup). -behaviour(gen_server). -include("couch_db.hrl"). -export([start_link/3,start_link/4, stop/1]). -export([init/1, terminate/2, handle_call/3, handle_cast/2, handle_info/2,code_change/3]). % % Instead calling the % ok = gen_event:add_sup_handler(error_logger, my_log, Args) % % do this: % {ok, LinkedPid} = couch_event_sup:start_link(error_logger, my_log, Args) % % The benefit is the event is now part of the process tree, and can be % started, restarted and shutdown consistently like the rest of the server % components. % % And now if the "event" crashes, the supervisor is notified and can restart % the event handler. % % Use this form to named process: % {ok, LinkedPid} = couch_event_sup:start_link({local, my_log}, error_logger, my_log, Args) % start_link(EventMgr, EventHandler, Args) -> gen_server:start_link(couch_event_sup, {EventMgr, EventHandler, Args}, []). start_link(ServerName, EventMgr, EventHandler, Args) -> gen_server:start_link(ServerName, couch_event_sup, {EventMgr, EventHandler, Args}, []). stop(Pid) -> gen_server:cast(Pid, stop). init({EventMgr, EventHandler, Args}) -> case gen_event:add_sup_handler(EventMgr, EventHandler, Args) of ok -> {ok, {EventMgr, EventHandler}}; {stop, Error} -> {stop, Error} end. terminate(_Reason, _State) -> ok. handle_call(_Whatever, _From, State) -> {ok, State}. handle_cast(stop, State) -> {stop, normal, State}. handle_info({gen_event_EXIT, _Handler, Reason}, State) -> {stop, Reason, State}. code_change(_OldVsn, State, _Extra) -> {ok, State}. apache-couchdb-1.6.0/src/couchdb/couch_key_tree.erl0000644000175000001440000004176012332105522022220 0ustar00djcusers00000000000000% Licensed under the Apache License, Version 2.0 (the "License"); you may not % use this file except in compliance with the License. You may obtain a copy of % the License at % % http://www.apache.org/licenses/LICENSE-2.0 % % Unless required by applicable law or agreed to in writing, software % distributed under the License is distributed on an "AS IS" BASIS, WITHOUT % WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the % License for the specific language governing permissions and limitations under % the License. %% @doc Data structure used to represent document edit histories. %% A key tree is used to represent the edit history of a document. Each node of %% the tree represents a particular version. Relations between nodes represent %% the order that these edits were applied. For instance, a set of three edits %% would produce a tree of versions A->B->C indicating that edit C was based on %% version B which was in turn based on A. In a world without replication (and %% no ability to disable MVCC checks), all histories would be forced to be %% linear lists of edits due to constraints imposed by MVCC (ie, new edits must %% be based on the current version). However, we have replication, so we must %% deal with not so easy cases, which lead to trees. %% %% Consider a document in state A. This doc is replicated to a second node. We %% then edit the document on each node leaving it in two different states, B %% and C. We now have two key trees, A->B and A->C. When we go to replicate a %% second time, the key tree must combine these two trees which gives us %% A->(B|C). This is how conflicts are introduced. In terms of the key tree, we %% say that we have two leaves (B and C) that are not deleted. The presense of %% the multiple leaves indicate conflict. To remove a conflict, one of the %% edits (B or C) can be deleted, which results in, A->(B|C->D) where D is an %% edit that is specially marked with the a deleted=true flag. %% %% What makes this a bit more complicated is that there is a limit to the %% number of revisions kept, specified in couch_db.hrl (default is 1000). When %% this limit is exceeded only the last 1000 are kept. This comes in to play %% when branches are merged. The comparison has to begin at the same place in %% the branches. A revision id is of the form N-XXXXXXX where N is the current %% revision. So each path will have a start number, calculated in %% couch_doc:to_path using the formula N - length(RevIds) + 1 So, .eg. if a doc %% was edit 1003 times this start number would be 4, indicating that 3 %% revisions were truncated. %% %% This comes into play in @see merge_at/3 which recursively walks down one %% tree or the other until they begin at the same revision. -module(couch_key_tree). -export([merge/3, find_missing/2, get_key_leafs/2, get_full_key_paths/2, get/2]). -export([get_all_leafs/1, count_leafs/1, remove_leafs/2, get_all_leafs_full/1, stem/2]). -export([map/2, mapfold/3, map_leafs/2, fold/3]). -include("couch_db.hrl"). %% @doc Merge a path with a list of paths and stem to the given length. -spec merge([path()], path(), pos_integer()) -> {[path()], conflicts | no_conflicts}. merge(Paths, Path, Depth) -> {Merged, Conflicts} = merge(Paths, Path), {stem(Merged, Depth), Conflicts}. %% @doc Merge a path with an existing list of paths, returning a new list of %% paths. A return of conflicts indicates a new conflict was discovered in this %% merge. Conflicts may already exist in the original list of paths. -spec merge([path()], path()) -> {[path()], conflicts | no_conflicts}. merge(Paths, Path) -> {ok, Merged, HasConflicts} = merge_one(Paths, Path, [], false), if HasConflicts -> Conflicts = conflicts; (length(Merged) =/= length(Paths)) and (length(Merged) =/= 1) -> Conflicts = conflicts; true -> Conflicts = no_conflicts end, {lists:sort(Merged), Conflicts}. -spec merge_one(Original::[path()], Inserted::path(), [path()], boolean()) -> {ok, Merged::[path()], NewConflicts::boolean()}. merge_one([], Insert, OutAcc, ConflictsAcc) -> {ok, [Insert | OutAcc], ConflictsAcc}; merge_one([{Start, Tree}|Rest], {StartInsert, TreeInsert}, Acc, HasConflicts) -> case merge_at([Tree], StartInsert - Start, [TreeInsert]) of {ok, [Merged], Conflicts} -> MergedStart = lists:min([Start, StartInsert]), {ok, Rest ++ [{MergedStart, Merged} | Acc], Conflicts or HasConflicts}; no -> AccOut = [{Start, Tree} | Acc], merge_one(Rest, {StartInsert, TreeInsert}, AccOut, HasConflicts) end. -spec merge_at(tree(), Place::integer(), tree()) -> {ok, Merged::tree(), HasConflicts::boolean()} | no. merge_at(_Ours, _Place, []) -> no; merge_at([], _Place, _Insert) -> no; merge_at([{Key, Value, SubTree}|Sibs], Place, InsertTree) when Place > 0 -> % inserted starts later than committed, need to drill into committed subtree case merge_at(SubTree, Place - 1, InsertTree) of {ok, Merged, Conflicts} -> {ok, [{Key, Value, Merged} | Sibs], Conflicts}; no -> % first branch didn't merge, move to next branch case merge_at(Sibs, Place, InsertTree) of {ok, Merged, Conflicts} -> {ok, [{Key, Value, SubTree} | Merged], Conflicts}; no -> no end end; merge_at(OurTree, Place, [{Key, Value, SubTree}]) when Place < 0 -> % inserted starts earlier than committed, need to drill into insert subtree case merge_at(OurTree, Place + 1, SubTree) of {ok, Merged, Conflicts} -> {ok, [{Key, Value, Merged}], Conflicts}; no -> no end; merge_at([{Key, V1, SubTree}|Sibs], 0, [{Key, V2, InsertSubTree}]) -> {Merged, Conflicts} = merge_simple(SubTree, InsertSubTree), {ok, [{Key, value_pref(V1, V2), Merged} | Sibs], Conflicts}; merge_at([{OurKey, _, _} | _], 0, [{Key, _, _}]) when OurKey > Key -> % siblings keys are ordered, no point in continuing no; merge_at([Tree | Sibs], 0, InsertTree) -> case merge_at(Sibs, 0, InsertTree) of {ok, Merged, Conflicts} -> {ok, [Tree | Merged], Conflicts}; no -> no end. % key tree functions -spec merge_simple(tree(), tree()) -> {Merged::tree(), NewConflicts::boolean()}. merge_simple([], B) -> {B, false}; merge_simple(A, []) -> {A, false}; merge_simple([{Key, V1, SubA} | NextA], [{Key, V2, SubB} | NextB]) -> {MergedSubTree, Conflict1} = merge_simple(SubA, SubB), {MergedNextTree, Conflict2} = merge_simple(NextA, NextB), Value = value_pref(V1, V2), {[{Key, Value, MergedSubTree} | MergedNextTree], Conflict1 or Conflict2}; merge_simple([{A, _, _} = Tree | Next], [{B, _, _} | _] = Insert) when A < B -> {Merged, Conflict} = merge_simple(Next, Insert), % if Merged has more branches than the input we added a new conflict {[Tree | Merged], Conflict orelse (length(Merged) > length(Next))}; merge_simple(Ours, [Tree | Next]) -> {Merged, Conflict} = merge_simple(Ours, Next), {[Tree | Merged], Conflict orelse (length(Merged) > length(Next))}. find_missing(_Tree, []) -> []; find_missing([], SeachKeys) -> SeachKeys; find_missing([{Start, {Key, Value, SubTree}} | RestTree], SeachKeys) -> PossibleKeys = [{KeyPos, KeyValue} || {KeyPos, KeyValue} <- SeachKeys, KeyPos >= Start], ImpossibleKeys = [{KeyPos, KeyValue} || {KeyPos, KeyValue} <- SeachKeys, KeyPos < Start], Missing = find_missing_simple(Start, [{Key, Value, SubTree}], PossibleKeys), find_missing(RestTree, ImpossibleKeys ++ Missing). find_missing_simple(_Pos, _Tree, []) -> []; find_missing_simple(_Pos, [], SeachKeys) -> SeachKeys; find_missing_simple(Pos, [{Key, _, SubTree} | RestTree], SeachKeys) -> PossibleKeys = [{KeyPos, KeyValue} || {KeyPos, KeyValue} <- SeachKeys, KeyPos >= Pos], ImpossibleKeys = [{KeyPos, KeyValue} || {KeyPos, KeyValue} <- SeachKeys, KeyPos < Pos], SrcKeys2 = PossibleKeys -- [{Pos, Key}], SrcKeys3 = find_missing_simple(Pos + 1, SubTree, SrcKeys2), ImpossibleKeys ++ find_missing_simple(Pos, RestTree, SrcKeys3). filter_leafs([], _Keys, FilteredAcc, RemovedKeysAcc) -> {FilteredAcc, RemovedKeysAcc}; filter_leafs([{Pos, [{LeafKey, _}|_]} = Path |Rest], Keys, FilteredAcc, RemovedKeysAcc) -> FilteredKeys = lists:delete({Pos, LeafKey}, Keys), if FilteredKeys == Keys -> % this leaf is not a key we are looking to remove filter_leafs(Rest, Keys, [Path | FilteredAcc], RemovedKeysAcc); true -> % this did match a key, remove both the node and the input key filter_leafs(Rest, FilteredKeys, FilteredAcc, [{Pos, LeafKey} | RemovedKeysAcc]) end. % Removes any branches from the tree whose leaf node(s) are in the Keys remove_leafs(Trees, Keys) -> % flatten each branch in a tree into a tree path Paths = get_all_leafs_full(Trees), % filter out any that are in the keys list. {FilteredPaths, RemovedKeys} = filter_leafs(Paths, Keys, [], []), SortedPaths = lists:sort( [{Pos + 1 - length(Path), Path} || {Pos, Path} <- FilteredPaths] ), % convert paths back to trees NewTree = lists:foldl( fun({StartPos, Path},TreeAcc) -> [SingleTree] = lists:foldl( fun({K,V},NewTreeAcc) -> [{K,V,NewTreeAcc}] end, [], Path), {NewTrees, _} = merge(TreeAcc, {StartPos, SingleTree}), NewTrees end, [], SortedPaths), {NewTree, RemovedKeys}. % get the leafs in the tree matching the keys. The matching key nodes can be % leafs or an inner nodes. If an inner node, then the leafs for that node % are returned. get_key_leafs(Tree, Keys) -> get_key_leafs(Tree, Keys, []). get_key_leafs(_, [], Acc) -> {Acc, []}; get_key_leafs([], Keys, Acc) -> {Acc, Keys}; get_key_leafs([{Pos, Tree}|Rest], Keys, Acc) -> {Gotten, RemainingKeys} = get_key_leafs_simple(Pos, [Tree], Keys, []), get_key_leafs(Rest, RemainingKeys, Gotten ++ Acc). get_key_leafs_simple(_Pos, _Tree, [], _KeyPathAcc) -> {[], []}; get_key_leafs_simple(_Pos, [], KeysToGet, _KeyPathAcc) -> {[], KeysToGet}; get_key_leafs_simple(Pos, [{Key, _Value, SubTree}=Tree | RestTree], KeysToGet, KeyPathAcc) -> case lists:delete({Pos, Key}, KeysToGet) of KeysToGet -> % same list, key not found {LeafsFound, KeysToGet2} = get_key_leafs_simple(Pos + 1, SubTree, KeysToGet, [Key | KeyPathAcc]), {RestLeafsFound, KeysRemaining} = get_key_leafs_simple(Pos, RestTree, KeysToGet2, KeyPathAcc), {LeafsFound ++ RestLeafsFound, KeysRemaining}; KeysToGet2 -> LeafsFound = get_all_leafs_simple(Pos, [Tree], KeyPathAcc), LeafKeysFound = [{LeafPos, LeafRev} || {_, {LeafPos, [LeafRev|_]}} <- LeafsFound], KeysToGet3 = KeysToGet2 -- LeafKeysFound, {RestLeafsFound, KeysRemaining} = get_key_leafs_simple(Pos, RestTree, KeysToGet3, KeyPathAcc), {LeafsFound ++ RestLeafsFound, KeysRemaining} end. get(Tree, KeysToGet) -> {KeyPaths, KeysNotFound} = get_full_key_paths(Tree, KeysToGet), FixedResults = [ {Value, {Pos, [Key0 || {Key0, _} <- Path]}} || {Pos, [{_Key, Value}|_]=Path} <- KeyPaths], {FixedResults, KeysNotFound}. get_full_key_paths(Tree, Keys) -> get_full_key_paths(Tree, Keys, []). get_full_key_paths(_, [], Acc) -> {Acc, []}; get_full_key_paths([], Keys, Acc) -> {Acc, Keys}; get_full_key_paths([{Pos, Tree}|Rest], Keys, Acc) -> {Gotten, RemainingKeys} = get_full_key_paths(Pos, [Tree], Keys, []), get_full_key_paths(Rest, RemainingKeys, Gotten ++ Acc). get_full_key_paths(_Pos, _Tree, [], _KeyPathAcc) -> {[], []}; get_full_key_paths(_Pos, [], KeysToGet, _KeyPathAcc) -> {[], KeysToGet}; get_full_key_paths(Pos, [{KeyId, Value, SubTree} | RestTree], KeysToGet, KeyPathAcc) -> KeysToGet2 = KeysToGet -- [{Pos, KeyId}], CurrentNodeResult = case length(KeysToGet2) =:= length(KeysToGet) of true -> % not in the key list. []; false -> % this node is the key list. return it [{Pos, [{KeyId, Value} | KeyPathAcc]}] end, {KeysGotten, KeysRemaining} = get_full_key_paths(Pos + 1, SubTree, KeysToGet2, [{KeyId, Value} | KeyPathAcc]), {KeysGotten2, KeysRemaining2} = get_full_key_paths(Pos, RestTree, KeysRemaining, KeyPathAcc), {CurrentNodeResult ++ KeysGotten ++ KeysGotten2, KeysRemaining2}. get_all_leafs_full(Tree) -> get_all_leafs_full(Tree, []). get_all_leafs_full([], Acc) -> Acc; get_all_leafs_full([{Pos, Tree} | Rest], Acc) -> get_all_leafs_full(Rest, get_all_leafs_full_simple(Pos, [Tree], []) ++ Acc). get_all_leafs_full_simple(_Pos, [], _KeyPathAcc) -> []; get_all_leafs_full_simple(Pos, [{KeyId, Value, []} | RestTree], KeyPathAcc) -> [{Pos, [{KeyId, Value} | KeyPathAcc]} | get_all_leafs_full_simple(Pos, RestTree, KeyPathAcc)]; get_all_leafs_full_simple(Pos, [{KeyId, Value, SubTree} | RestTree], KeyPathAcc) -> get_all_leafs_full_simple(Pos + 1, SubTree, [{KeyId, Value} | KeyPathAcc]) ++ get_all_leafs_full_simple(Pos, RestTree, KeyPathAcc). get_all_leafs(Trees) -> get_all_leafs(Trees, []). get_all_leafs([], Acc) -> Acc; get_all_leafs([{Pos, Tree}|Rest], Acc) -> get_all_leafs(Rest, get_all_leafs_simple(Pos, [Tree], []) ++ Acc). get_all_leafs_simple(_Pos, [], _KeyPathAcc) -> []; get_all_leafs_simple(Pos, [{KeyId, Value, []} | RestTree], KeyPathAcc) -> [{Value, {Pos, [KeyId | KeyPathAcc]}} | get_all_leafs_simple(Pos, RestTree, KeyPathAcc)]; get_all_leafs_simple(Pos, [{KeyId, _Value, SubTree} | RestTree], KeyPathAcc) -> get_all_leafs_simple(Pos + 1, SubTree, [KeyId | KeyPathAcc]) ++ get_all_leafs_simple(Pos, RestTree, KeyPathAcc). count_leafs([]) -> 0; count_leafs([{_Pos,Tree}|Rest]) -> count_leafs_simple([Tree]) + count_leafs(Rest). count_leafs_simple([]) -> 0; count_leafs_simple([{_Key, _Value, []} | RestTree]) -> 1 + count_leafs_simple(RestTree); count_leafs_simple([{_Key, _Value, SubTree} | RestTree]) -> count_leafs_simple(SubTree) + count_leafs_simple(RestTree). fold(_Fun, Acc, []) -> Acc; fold(Fun, Acc0, [{Pos, Tree}|Rest]) -> Acc1 = fold_simple(Fun, Acc0, Pos, [Tree]), fold(Fun, Acc1, Rest). fold_simple(_Fun, Acc, _Pos, []) -> Acc; fold_simple(Fun, Acc0, Pos, [{Key, Value, SubTree} | RestTree]) -> Type = if SubTree == [] -> leaf; true -> branch end, Acc1 = Fun({Pos, Key}, Value, Type, Acc0), Acc2 = fold_simple(Fun, Acc1, Pos+1, SubTree), fold_simple(Fun, Acc2, Pos, RestTree). map(_Fun, []) -> []; map(Fun, [{Pos, Tree}|Rest]) -> case erlang:fun_info(Fun, arity) of {arity, 2} -> [NewTree] = map_simple(fun(A,B,_C) -> Fun(A,B) end, Pos, [Tree]), [{Pos, NewTree} | map(Fun, Rest)]; {arity, 3} -> [NewTree] = map_simple(Fun, Pos, [Tree]), [{Pos, NewTree} | map(Fun, Rest)] end. map_simple(_Fun, _Pos, []) -> []; map_simple(Fun, Pos, [{Key, Value, SubTree} | RestTree]) -> Value2 = Fun({Pos, Key}, Value, if SubTree == [] -> leaf; true -> branch end), [{Key, Value2, map_simple(Fun, Pos + 1, SubTree)} | map_simple(Fun, Pos, RestTree)]. mapfold(_Fun, Acc, []) -> {[], Acc}; mapfold(Fun, Acc, [{Pos, Tree} | Rest]) -> {[NewTree], Acc2} = mapfold_simple(Fun, Acc, Pos, [Tree]), {Rest2, Acc3} = mapfold(Fun, Acc2, Rest), {[{Pos, NewTree} | Rest2], Acc3}. mapfold_simple(_Fun, Acc, _Pos, []) -> {[], Acc}; mapfold_simple(Fun, Acc, Pos, [{Key, Value, SubTree} | RestTree]) -> {Value2, Acc2} = Fun({Pos, Key}, Value, if SubTree == [] -> leaf; true -> branch end, Acc), {SubTree2, Acc3} = mapfold_simple(Fun, Acc2, Pos + 1, SubTree), {RestTree2, Acc4} = mapfold_simple(Fun, Acc3, Pos, RestTree), {[{Key, Value2, SubTree2} | RestTree2], Acc4}. map_leafs(_Fun, []) -> []; map_leafs(Fun, [{Pos, Tree}|Rest]) -> [NewTree] = map_leafs_simple(Fun, Pos, [Tree]), [{Pos, NewTree} | map_leafs(Fun, Rest)]. map_leafs_simple(_Fun, _Pos, []) -> []; map_leafs_simple(Fun, Pos, [{Key, Value, []} | RestTree]) -> Value2 = Fun({Pos, Key}, Value), [{Key, Value2, []} | map_leafs_simple(Fun, Pos, RestTree)]; map_leafs_simple(Fun, Pos, [{Key, Value, SubTree} | RestTree]) -> [{Key, Value, map_leafs_simple(Fun, Pos + 1, SubTree)} | map_leafs_simple(Fun, Pos, RestTree)]. stem(Trees, Limit) -> % flatten each branch in a tree into a tree path, sort by starting rev # Paths = lists:sort(lists:map(fun({Pos, Path}) -> StemmedPath = lists:sublist(Path, Limit), {Pos + 1 - length(StemmedPath), StemmedPath} end, get_all_leafs_full(Trees))), % convert paths back to trees lists:foldl( fun({StartPos, Path},TreeAcc) -> [SingleTree] = lists:foldl( fun({K,V},NewTreeAcc) -> [{K,V,NewTreeAcc}] end, [], Path), {NewTrees, _} = merge(TreeAcc, {StartPos, SingleTree}), NewTrees end, [], Paths). value_pref(Tuple, _) when is_tuple(Tuple), (tuple_size(Tuple) == 3 orelse tuple_size(Tuple) == 4) -> Tuple; value_pref(_, Tuple) when is_tuple(Tuple), (tuple_size(Tuple) == 3 orelse tuple_size(Tuple) == 4) -> Tuple; value_pref(?REV_MISSING, Other) -> Other; value_pref(Other, ?REV_MISSING) -> Other; value_pref(Last, _) -> Last. % Tests moved to test/etap/06?-*.t apache-couchdb-1.6.0/src/couchdb/couch_db.erl0000644000175000001440000014021412332105522020770 0ustar00djcusers00000000000000% Licensed under the Apache License, Version 2.0 (the "License"); you may not % use this file except in compliance with the License. You may obtain a copy of % the License at % % http://www.apache.org/licenses/LICENSE-2.0 % % Unless required by applicable law or agreed to in writing, software % distributed under the License is distributed on an "AS IS" BASIS, WITHOUT % WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the % License for the specific language governing permissions and limitations under % the License. -module(couch_db). -behaviour(gen_server). -export([open/2,open_int/2,close/1,create/2,get_db_info/1,get_design_docs/1]). -export([start_compact/1, cancel_compact/1]). -export([open_ref_counted/2,is_idle/1,monitor/1,count_changes_since/2]). -export([update_doc/3,update_doc/4,update_docs/4,update_docs/2,update_docs/3,delete_doc/3]). -export([get_doc_info/2,get_full_doc_info/2,get_full_doc_infos/2]). -export([open_doc/2,open_doc/3,open_doc_revs/4]). -export([set_revs_limit/2,get_revs_limit/1]). -export([get_missing_revs/2,name/1,get_update_seq/1,get_committed_update_seq/1]). -export([enum_docs/4,enum_docs_since/5]). -export([enum_docs_since_reduce_to_count/1,enum_docs_reduce_to_count/1]). -export([increment_update_seq/1,get_purge_seq/1,purge_docs/2,get_last_purged/1]). -export([start_link/3,open_doc_int/3,ensure_full_commit/1]). -export([set_security/2,get_security/1]). -export([init/1,terminate/2,handle_call/3,handle_cast/2,code_change/3,handle_info/2]). -export([changes_since/4,changes_since/5,read_doc/2,new_revid/1]). -export([check_is_admin/1, check_is_member/1]). -export([reopen/1, is_system_db/1, compression/1]). -include("couch_db.hrl"). start_link(DbName, Filepath, Options) -> case open_db_file(Filepath, Options) of {ok, Fd} -> StartResult = gen_server:start_link(couch_db, {DbName, Filepath, Fd, Options}, []), unlink(Fd), StartResult; Else -> Else end. open_db_file(Filepath, Options) -> case couch_file:open(Filepath, Options) of {ok, Fd} -> {ok, Fd}; {error, enoent} -> % couldn't find file. is there a compact version? This can happen if % crashed during the file switch. case couch_file:open(Filepath ++ ".compact", [nologifmissing]) of {ok, Fd} -> ?LOG_INFO("Found ~s~s compaction file, using as primary storage.", [Filepath, ".compact"]), ok = file:rename(Filepath ++ ".compact", Filepath), ok = couch_file:sync(Fd), {ok, Fd}; {error, enoent} -> {not_found, no_db_file} end; Error -> Error end. create(DbName, Options) -> couch_server:create(DbName, Options). % this is for opening a database for internal purposes like the replicator % or the view indexer. it never throws a reader error. open_int(DbName, Options) -> couch_server:open(DbName, Options). % this should be called anytime an http request opens the database. % it ensures that the http userCtx is a valid reader open(DbName, Options) -> case couch_server:open(DbName, Options) of {ok, Db} -> try check_is_member(Db), {ok, Db} catch throw:Error -> close(Db), throw(Error) end; Else -> Else end. reopen(#db{main_pid = Pid, fd_ref_counter = OldRefCntr, user_ctx = UserCtx}) -> {ok, #db{fd_ref_counter = NewRefCntr} = NewDb} = gen_server:call(Pid, get_db, infinity), case NewRefCntr =:= OldRefCntr of true -> ok; false -> couch_ref_counter:add(NewRefCntr), catch couch_ref_counter:drop(OldRefCntr) end, {ok, NewDb#db{user_ctx = UserCtx}}. is_system_db(#db{options = Options}) -> lists:member(sys_db, Options). ensure_full_commit(#db{update_pid=UpdatePid,instance_start_time=StartTime}) -> ok = gen_server:call(UpdatePid, full_commit, infinity), {ok, StartTime}. close(#db{fd_ref_counter=RefCntr}) -> couch_ref_counter:drop(RefCntr). open_ref_counted(MainPid, OpenedPid) -> gen_server:call(MainPid, {open_ref_count, OpenedPid}). is_idle(#db{main_pid = MainPid}) -> is_idle(MainPid); is_idle(MainPid) -> gen_server:call(MainPid, is_idle). monitor(#db{main_pid=MainPid}) -> erlang:monitor(process, MainPid). start_compact(#db{update_pid=Pid}) -> gen_server:call(Pid, start_compact). cancel_compact(#db{update_pid=Pid}) -> gen_server:call(Pid, cancel_compact). delete_doc(Db, Id, Revisions) -> DeletedDocs = [#doc{id=Id, revs=[Rev], deleted=true} || Rev <- Revisions], {ok, [Result]} = update_docs(Db, DeletedDocs, []), {ok, Result}. open_doc(Db, IdOrDocInfo) -> open_doc(Db, IdOrDocInfo, []). open_doc(Db, Id, Options) -> increment_stat(Db, {couchdb, database_reads}), case open_doc_int(Db, Id, Options) of {ok, #doc{deleted=true}=Doc} -> case lists:member(deleted, Options) of true -> apply_open_options({ok, Doc},Options); false -> {not_found, deleted} end; Else -> apply_open_options(Else,Options) end. apply_open_options({ok, Doc},Options) -> apply_open_options2(Doc,Options); apply_open_options(Else,_Options) -> Else. apply_open_options2(Doc,[]) -> {ok, Doc}; apply_open_options2(#doc{atts=Atts,revs=Revs}=Doc, [{atts_since, PossibleAncestors}|Rest]) -> RevPos = find_ancestor_rev_pos(Revs, PossibleAncestors), apply_open_options2(Doc#doc{atts=[A#att{data= if AttPos>RevPos -> Data; true -> stub end} || #att{revpos=AttPos,data=Data}=A <- Atts]}, Rest); apply_open_options2(Doc, [ejson_body | Rest]) -> apply_open_options2(couch_doc:with_ejson_body(Doc), Rest); apply_open_options2(Doc,[_|Rest]) -> apply_open_options2(Doc,Rest). find_ancestor_rev_pos({_, []}, _AttsSinceRevs) -> 0; find_ancestor_rev_pos(_DocRevs, []) -> 0; find_ancestor_rev_pos({RevPos, [RevId|Rest]}, AttsSinceRevs) -> case lists:member({RevPos, RevId}, AttsSinceRevs) of true -> RevPos; false -> find_ancestor_rev_pos({RevPos - 1, Rest}, AttsSinceRevs) end. open_doc_revs(Db, Id, Revs, Options) -> increment_stat(Db, {couchdb, database_reads}), [{ok, Results}] = open_doc_revs_int(Db, [{Id, Revs}], Options), {ok, [apply_open_options(Result, Options) || Result <- Results]}. % Each returned result is a list of tuples: % {Id, MissingRevs, PossibleAncestors} % if no revs are missing, it's omitted from the results. get_missing_revs(Db, IdRevsList) -> Results = get_full_doc_infos(Db, [Id1 || {Id1, _Revs} <- IdRevsList]), {ok, find_missing(IdRevsList, Results)}. find_missing([], []) -> []; find_missing([{Id, Revs}|RestIdRevs], [{ok, FullInfo} | RestLookupInfo]) -> case couch_key_tree:find_missing(FullInfo#full_doc_info.rev_tree, Revs) of [] -> find_missing(RestIdRevs, RestLookupInfo); MissingRevs -> #doc_info{revs=RevsInfo} = couch_doc:to_doc_info(FullInfo), LeafRevs = [Rev || #rev_info{rev=Rev} <- RevsInfo], % Find the revs that are possible parents of this rev PossibleAncestors = lists:foldl(fun({LeafPos, LeafRevId}, Acc) -> % this leaf is a "possible ancenstor" of the missing % revs if this LeafPos lessthan any of the missing revs case lists:any(fun({MissingPos, _}) -> LeafPos < MissingPos end, MissingRevs) of true -> [{LeafPos, LeafRevId} | Acc]; false -> Acc end end, [], LeafRevs), [{Id, MissingRevs, PossibleAncestors} | find_missing(RestIdRevs, RestLookupInfo)] end; find_missing([{Id, Revs}|RestIdRevs], [not_found | RestLookupInfo]) -> [{Id, Revs, []} | find_missing(RestIdRevs, RestLookupInfo)]. get_doc_info(Db, Id) -> case get_full_doc_info(Db, Id) of {ok, DocInfo} -> {ok, couch_doc:to_doc_info(DocInfo)}; Else -> Else end. % returns {ok, DocInfo} or not_found get_full_doc_info(Db, Id) -> [Result] = get_full_doc_infos(Db, [Id]), Result. get_full_doc_infos(Db, Ids) -> couch_btree:lookup(by_id_btree(Db), Ids). increment_update_seq(#db{update_pid=UpdatePid}) -> gen_server:call(UpdatePid, increment_update_seq). purge_docs(#db{update_pid=UpdatePid}, IdsRevs) -> gen_server:call(UpdatePid, {purge_docs, IdsRevs}). get_committed_update_seq(#db{committed_update_seq=Seq}) -> Seq. get_update_seq(#db{update_seq=Seq})-> Seq. get_purge_seq(#db{header=#db_header{purge_seq=PurgeSeq}})-> PurgeSeq. get_last_purged(#db{header=#db_header{purged_docs=nil}}) -> {ok, []}; get_last_purged(#db{fd=Fd, header=#db_header{purged_docs=PurgedPointer}}) -> couch_file:pread_term(Fd, PurgedPointer). get_db_info(Db) -> #db{fd=Fd, header=#db_header{disk_version=DiskVersion}, compactor_pid=Compactor, update_seq=SeqNum, name=Name, instance_start_time=StartTime, committed_update_seq=CommittedUpdateSeq, fulldocinfo_by_id_btree = IdBtree, docinfo_by_seq_btree = SeqBtree, local_docs_btree = LocalBtree } = Db, {ok, Size} = couch_file:bytes(Fd), {ok, DbReduction} = couch_btree:full_reduce(by_id_btree(Db)), InfoList = [ {db_name, Name}, {doc_count, element(1, DbReduction)}, {doc_del_count, element(2, DbReduction)}, {update_seq, SeqNum}, {purge_seq, couch_db:get_purge_seq(Db)}, {compact_running, Compactor/=nil}, {disk_size, Size}, {data_size, db_data_size(DbReduction, [SeqBtree, IdBtree, LocalBtree])}, {instance_start_time, StartTime}, {disk_format_version, DiskVersion}, {committed_update_seq, CommittedUpdateSeq} ], {ok, InfoList}. db_data_size({_Count, _DelCount}, _Trees) -> % pre 1.2 format, upgraded on compaction null; db_data_size({_Count, _DelCount, nil}, _Trees) -> null; db_data_size({_Count, _DelCount, DocAndAttsSize}, Trees) -> sum_tree_sizes(DocAndAttsSize, Trees). sum_tree_sizes(Acc, []) -> Acc; sum_tree_sizes(Acc, [T | Rest]) -> case couch_btree:size(T) of nil -> null; Sz -> sum_tree_sizes(Acc + Sz, Rest) end. get_design_docs(Db) -> FoldFun = skip_deleted(fun (#full_doc_info{deleted = true}, _Reds, Acc) -> {ok, Acc}; (#full_doc_info{id= <<"_design/",_/binary>>}=FullDocInfo, _Reds, Acc) -> {ok, [FullDocInfo | Acc]}; (_, _Reds, Acc) -> {stop, Acc} end), KeyOpts = [{start_key, <<"_design/">>}, {end_key_gt, <<"_design0">>}], {ok, _, Docs} = couch_btree:fold(by_id_btree(Db), FoldFun, [], KeyOpts), Docs. check_is_admin(#db{user_ctx=#user_ctx{name=Name,roles=Roles}}=Db) -> {Admins} = get_admins(Db), AdminRoles = [<<"_admin">> | couch_util:get_value(<<"roles">>, Admins, [])], AdminNames = couch_util:get_value(<<"names">>, Admins,[]), case AdminRoles -- Roles of AdminRoles -> % same list, not an admin role case AdminNames -- [Name] of AdminNames -> % same names, not an admin throw({unauthorized, <<"You are not a db or server admin.">>}); _ -> ok end; _ -> ok end. check_is_member(#db{user_ctx=#user_ctx{name=Name,roles=Roles}=UserCtx}=Db) -> case (catch check_is_admin(Db)) of ok -> ok; _ -> {Members} = get_members(Db), ReaderRoles = couch_util:get_value(<<"roles">>, Members,[]), WithAdminRoles = [<<"_admin">> | ReaderRoles], ReaderNames = couch_util:get_value(<<"names">>, Members,[]), case ReaderRoles ++ ReaderNames of [] -> ok; % no readers == public access _Else -> case WithAdminRoles -- Roles of WithAdminRoles -> % same list, not an reader role case ReaderNames -- [Name] of ReaderNames -> % same names, not a reader ?LOG_DEBUG("Not a reader: UserCtx ~p vs Names ~p Roles ~p",[UserCtx, ReaderNames, WithAdminRoles]), throw({unauthorized, <<"You are not authorized to access this db.">>}); _ -> ok end; _ -> ok end end end. get_admins(#db{security=SecProps}) -> couch_util:get_value(<<"admins">>, SecProps, {[]}). get_members(#db{security=SecProps}) -> % we fallback to readers here for backwards compatibility couch_util:get_value(<<"members">>, SecProps, couch_util:get_value(<<"readers">>, SecProps, {[]})). get_security(#db{security=SecProps}) -> {SecProps}. set_security(#db{update_pid=Pid}=Db, {NewSecProps}) when is_list(NewSecProps) -> check_is_admin(Db), ok = validate_security_object(NewSecProps), ok = gen_server:call(Pid, {set_security, NewSecProps}, infinity), {ok, _} = ensure_full_commit(Db), ok; set_security(_, _) -> throw(bad_request). validate_security_object(SecProps) -> Admins = couch_util:get_value(<<"admins">>, SecProps, {[]}), % we fallback to readers here for backwards compatibility Members = couch_util:get_value(<<"members">>, SecProps, couch_util:get_value(<<"readers">>, SecProps, {[]})), ok = validate_names_and_roles(Admins), ok = validate_names_and_roles(Members), ok. % validate user input validate_names_and_roles({Props}) when is_list(Props) -> case couch_util:get_value(<<"names">>,Props,[]) of Ns when is_list(Ns) -> [throw("names must be a JSON list of strings") ||N <- Ns, not is_binary(N)], Ns; _ -> throw("names must be a JSON list of strings") end, case couch_util:get_value(<<"roles">>,Props,[]) of Rs when is_list(Rs) -> [throw("roles must be a JSON list of strings") ||R <- Rs, not is_binary(R)], Rs; _ -> throw("roles must be a JSON list of strings") end, ok. get_revs_limit(#db{revs_limit=Limit}) -> Limit. set_revs_limit(#db{update_pid=Pid}=Db, Limit) when Limit > 0 -> check_is_admin(Db), gen_server:call(Pid, {set_revs_limit, Limit}, infinity); set_revs_limit(_Db, _Limit) -> throw(invalid_revs_limit). name(#db{name=Name}) -> Name. compression(#db{compression=Compression}) -> Compression. update_doc(Db, Doc, Options) -> update_doc(Db, Doc, Options, interactive_edit). update_doc(Db, Doc, Options, UpdateType) -> case update_docs(Db, [Doc], Options, UpdateType) of {ok, [{ok, NewRev}]} -> {ok, NewRev}; {ok, [{{_Id, _Rev}, Error}]} -> throw(Error); {ok, [Error]} -> throw(Error); {ok, []} -> % replication success {Pos, [RevId | _]} = Doc#doc.revs, {ok, {Pos, RevId}} end. update_docs(Db, Docs) -> update_docs(Db, Docs, []). % group_alike_docs groups the sorted documents into sublist buckets, by id. % ([DocA, DocA, DocB, DocC], []) -> [[DocA, DocA], [DocB], [DocC]] group_alike_docs(Docs) -> Sorted = lists:sort(fun({#doc{id=A},_},{#doc{id=B},_})-> A < B end, Docs), group_alike_docs(Sorted, []). group_alike_docs([], Buckets) -> lists:reverse(lists:map(fun lists:reverse/1, Buckets)); group_alike_docs([Doc|Rest], []) -> group_alike_docs(Rest, [[Doc]]); group_alike_docs([{Doc,Ref}|Rest], [Bucket|RestBuckets]) -> [{#doc{id=BucketId},_Ref}|_] = Bucket, case Doc#doc.id == BucketId of true -> % add to existing bucket group_alike_docs(Rest, [[{Doc,Ref}|Bucket]|RestBuckets]); false -> % add to new bucket group_alike_docs(Rest, [[{Doc,Ref}]|[Bucket|RestBuckets]]) end. validate_doc_update(#db{}=Db, #doc{id= <<"_design/",_/binary>>}, _GetDiskDocFun) -> catch check_is_admin(Db); validate_doc_update(#db{validate_doc_funs=[]}, _Doc, _GetDiskDocFun) -> ok; validate_doc_update(_Db, #doc{id= <<"_local/",_/binary>>}, _GetDiskDocFun) -> ok; validate_doc_update(Db, Doc, GetDiskDocFun) -> DiskDoc = GetDiskDocFun(), JsonCtx = couch_util:json_user_ctx(Db), SecObj = get_security(Db), try [case Fun(Doc, DiskDoc, JsonCtx, SecObj) of ok -> ok; Error -> throw(Error) end || Fun <- Db#db.validate_doc_funs], ok catch throw:Error -> Error end. prep_and_validate_update(Db, #doc{id=Id,revs={RevStart, Revs}}=Doc, OldFullDocInfo, LeafRevsDict, AllowConflict) -> case Revs of [PrevRev|_] -> case dict:find({RevStart, PrevRev}, LeafRevsDict) of {ok, {Deleted, DiskSp, DiskRevs}} -> case couch_doc:has_stubs(Doc) of true -> DiskDoc = make_doc(Db, Id, Deleted, DiskSp, DiskRevs), Doc2 = couch_doc:merge_stubs(Doc, DiskDoc), {validate_doc_update(Db, Doc2, fun() -> DiskDoc end), Doc2}; false -> LoadDiskDoc = fun() -> make_doc(Db,Id,Deleted,DiskSp,DiskRevs) end, {validate_doc_update(Db, Doc, LoadDiskDoc), Doc} end; error when AllowConflict -> couch_doc:merge_stubs(Doc, #doc{}), % will generate error if % there are stubs {validate_doc_update(Db, Doc, fun() -> nil end), Doc}; error -> {conflict, Doc} end; [] -> % new doc, and we have existing revs. % reuse existing deleted doc if OldFullDocInfo#full_doc_info.deleted orelse AllowConflict -> {validate_doc_update(Db, Doc, fun() -> nil end), Doc}; true -> {conflict, Doc} end end. prep_and_validate_updates(_Db, [], [], _AllowConflict, AccPrepped, AccFatalErrors) -> {AccPrepped, AccFatalErrors}; prep_and_validate_updates(Db, [DocBucket|RestBuckets], [not_found|RestLookups], AllowConflict, AccPrepped, AccErrors) -> {PreppedBucket, AccErrors3} = lists:foldl( fun({#doc{revs=Revs}=Doc,Ref}, {AccBucket, AccErrors2}) -> case couch_doc:has_stubs(Doc) of true -> couch_doc:merge_stubs(Doc, #doc{}); % will throw exception false -> ok end, case Revs of {0, []} -> case validate_doc_update(Db, Doc, fun() -> nil end) of ok -> {[{Doc, Ref} | AccBucket], AccErrors2}; Error -> {AccBucket, [{Ref, Error} | AccErrors2]} end; _ -> % old revs specified but none exist, a conflict {AccBucket, [{Ref, conflict} | AccErrors2]} end end, {[], AccErrors}, DocBucket), prep_and_validate_updates(Db, RestBuckets, RestLookups, AllowConflict, [lists:reverse(PreppedBucket) | AccPrepped], AccErrors3); prep_and_validate_updates(Db, [DocBucket|RestBuckets], [{ok, #full_doc_info{rev_tree=OldRevTree}=OldFullDocInfo}|RestLookups], AllowConflict, AccPrepped, AccErrors) -> Leafs = couch_key_tree:get_all_leafs(OldRevTree), LeafRevsDict = dict:from_list([ begin Deleted = element(1, LeafVal), Sp = element(2, LeafVal), {{Start, RevId}, {Deleted, Sp, Revs}} end || {LeafVal, {Start, [RevId | _]} = Revs} <- Leafs ]), {PreppedBucket, AccErrors3} = lists:foldl( fun({Doc, Ref}, {Docs2Acc, AccErrors2}) -> case prep_and_validate_update(Db, Doc, OldFullDocInfo, LeafRevsDict, AllowConflict) of {ok, Doc2} -> {[{Doc2, Ref} | Docs2Acc], AccErrors2}; {Error, #doc{}} -> % Record the error {Docs2Acc, [{Ref, Error} |AccErrors2]} end end, {[], AccErrors}, DocBucket), prep_and_validate_updates(Db, RestBuckets, RestLookups, AllowConflict, [PreppedBucket | AccPrepped], AccErrors3). update_docs(Db, Docs, Options) -> update_docs(Db, Docs, Options, interactive_edit). prep_and_validate_replicated_updates(_Db, [], [], AccPrepped, AccErrors) -> Errors2 = [{{Id, {Pos, Rev}}, Error} || {#doc{id=Id,revs={Pos,[Rev|_]}}, Error} <- AccErrors], {lists:reverse(AccPrepped), lists:reverse(Errors2)}; prep_and_validate_replicated_updates(Db, [Bucket|RestBuckets], [OldInfo|RestOldInfo], AccPrepped, AccErrors) -> case OldInfo of not_found -> {ValidatedBucket, AccErrors3} = lists:foldl( fun({Doc, Ref}, {AccPrepped2, AccErrors2}) -> case couch_doc:has_stubs(Doc) of true -> couch_doc:merge_stubs(Doc, #doc{}); % will throw exception false -> ok end, case validate_doc_update(Db, Doc, fun() -> nil end) of ok -> {[{Doc, Ref} | AccPrepped2], AccErrors2}; Error -> {AccPrepped2, [{Doc, Error} | AccErrors2]} end end, {[], AccErrors}, Bucket), prep_and_validate_replicated_updates(Db, RestBuckets, RestOldInfo, [ValidatedBucket | AccPrepped], AccErrors3); {ok, #full_doc_info{rev_tree=OldTree}} -> NewRevTree = lists:foldl( fun({NewDoc, _Ref}, AccTree) -> {NewTree, _} = couch_key_tree:merge(AccTree, couch_doc:to_path(NewDoc), Db#db.revs_limit), NewTree end, OldTree, Bucket), Leafs = couch_key_tree:get_all_leafs_full(NewRevTree), LeafRevsFullDict = dict:from_list( [{{Start, RevId}, FullPath} || {Start, [{RevId, _}|_]}=FullPath <- Leafs]), {ValidatedBucket, AccErrors3} = lists:foldl( fun({#doc{id=Id,revs={Pos, [RevId|_]}}=Doc, Ref}, {AccValidated, AccErrors2}) -> case dict:find({Pos, RevId}, LeafRevsFullDict) of {ok, {Start, Path}} -> % our unflushed doc is a leaf node. Go back on the path % to find the previous rev that's on disk. LoadPrevRevFun = fun() -> make_first_doc_on_disk(Db,Id,Start-1, tl(Path)) end, case couch_doc:has_stubs(Doc) of true -> DiskDoc = LoadPrevRevFun(), Doc2 = couch_doc:merge_stubs(Doc, DiskDoc), GetDiskDocFun = fun() -> DiskDoc end; false -> Doc2 = Doc, GetDiskDocFun = LoadPrevRevFun end, case validate_doc_update(Db, Doc2, GetDiskDocFun) of ok -> {[{Doc2, Ref} | AccValidated], AccErrors2}; Error -> {AccValidated, [{Doc, Error} | AccErrors2]} end; _ -> % this doc isn't a leaf or already exists in the tree. % ignore but consider it a success. {AccValidated, AccErrors2} end end, {[], AccErrors}, Bucket), prep_and_validate_replicated_updates(Db, RestBuckets, RestOldInfo, [ValidatedBucket | AccPrepped], AccErrors3) end. new_revid(#doc{body=Body,revs={OldStart,OldRevs}, atts=Atts,deleted=Deleted}) -> case [{N, T, M} || #att{name=N,type=T,md5=M} <- Atts, M =/= <<>>] of Atts2 when length(Atts) =/= length(Atts2) -> % We must have old style non-md5 attachments ?l2b(integer_to_list(couch_util:rand32())); Atts2 -> OldRev = case OldRevs of [] -> 0; [OldRev0|_] -> OldRev0 end, couch_util:md5(term_to_binary([Deleted, OldStart, OldRev, Body, Atts2])) end. new_revs([], OutBuckets, IdRevsAcc) -> {lists:reverse(OutBuckets), IdRevsAcc}; new_revs([Bucket|RestBuckets], OutBuckets, IdRevsAcc) -> {NewBucket, IdRevsAcc3} = lists:mapfoldl( fun({#doc{revs={Start, RevIds}}=Doc, Ref}, IdRevsAcc2)-> NewRevId = new_revid(Doc), {{Doc#doc{revs={Start+1, [NewRevId | RevIds]}}, Ref}, [{Ref, {ok, {Start+1, NewRevId}}} | IdRevsAcc2]} end, IdRevsAcc, Bucket), new_revs(RestBuckets, [NewBucket|OutBuckets], IdRevsAcc3). check_dup_atts(#doc{atts=Atts}=Doc) -> Atts2 = lists:sort(fun(#att{name=N1}, #att{name=N2}) -> N1 < N2 end, Atts), check_dup_atts2(Atts2), Doc. check_dup_atts2([#att{name=N}, #att{name=N} | _]) -> throw({bad_request, <<"Duplicate attachments">>}); check_dup_atts2([_ | Rest]) -> check_dup_atts2(Rest); check_dup_atts2(_) -> ok. update_docs(Db, Docs, Options, replicated_changes) -> increment_stat(Db, {couchdb, database_writes}), % associate reference with each doc in order to track duplicates Docs2 = lists:map(fun(Doc) -> {Doc, make_ref()} end, Docs), DocBuckets = before_docs_update(Db, group_alike_docs(Docs2)), case (Db#db.validate_doc_funs /= []) orelse lists:any( fun({#doc{id= <>}, _Ref}) -> true; ({#doc{atts=Atts}, _Ref}) -> Atts /= [] end, Docs2) of true -> Ids = [Id || [{#doc{id=Id}, _Ref}|_] <- DocBuckets], ExistingDocs = get_full_doc_infos(Db, Ids), {DocBuckets2, DocErrors} = prep_and_validate_replicated_updates(Db, DocBuckets, ExistingDocs, [], []), DocBuckets3 = [Bucket || [_|_]=Bucket <- DocBuckets2]; % remove empty buckets false -> DocErrors = [], DocBuckets3 = DocBuckets end, DocBuckets4 = [[{doc_flush_atts(check_dup_atts(Doc), Db#db.updater_fd), Ref} || {Doc, Ref} <- Bucket] || Bucket <- DocBuckets3], {ok, []} = write_and_commit(Db, DocBuckets4, [], [merge_conflicts | Options]), {ok, DocErrors}; update_docs(Db, Docs, Options, interactive_edit) -> increment_stat(Db, {couchdb, database_writes}), AllOrNothing = lists:member(all_or_nothing, Options), % go ahead and generate the new revision ids for the documents. % separate out the NonRep documents from the rest of the documents % associate reference with each doc in order to track duplicates Docs2 = lists:map(fun(Doc) -> {Doc, make_ref()} end,Docs), {Docs3, NonRepDocs} = lists:foldl( fun({#doc{id=Id},_Ref}=Doc, {DocsAcc, NonRepDocsAcc}) -> case Id of <> -> {DocsAcc, [Doc | NonRepDocsAcc]}; Id-> {[Doc | DocsAcc], NonRepDocsAcc} end end, {[], []}, Docs2), DocBuckets = before_docs_update(Db, group_alike_docs(Docs3)), case (Db#db.validate_doc_funs /= []) orelse lists:any( fun({#doc{id= <>}, _Ref}) -> true; ({#doc{atts=Atts}, _Ref}) -> Atts /= [] end, Docs3) of true -> % lookup the doc by id and get the most recent Ids = [Id || [{#doc{id=Id}, _Ref}|_] <- DocBuckets], ExistingDocInfos = get_full_doc_infos(Db, Ids), {DocBucketsPrepped, PreCommitFailures} = prep_and_validate_updates(Db, DocBuckets, ExistingDocInfos, AllOrNothing, [], []), % strip out any empty buckets DocBuckets2 = [Bucket || [_|_] = Bucket <- DocBucketsPrepped]; false -> PreCommitFailures = [], DocBuckets2 = DocBuckets end, if (AllOrNothing) and (PreCommitFailures /= []) -> {aborted, lists:foldl(fun({#doc{id=Id,revs=Revs}, Ref},Acc) -> case lists:keyfind(Ref,1,PreCommitFailures) of {Ref, Error} -> case Revs of {Pos, [RevId|_]} -> [{{Id,{Pos, RevId}}, Error} | Acc]; {0, []} -> [{{Id,{0, <<>>}}, Error} | Acc] end; false -> Acc end end,[],Docs3)}; true -> Options2 = if AllOrNothing -> [merge_conflicts]; true -> [] end ++ Options, DocBuckets3 = [[ {doc_flush_atts(set_new_att_revpos( check_dup_atts(Doc)), Db#db.updater_fd), Ref} || {Doc, Ref} <- B] || B <- DocBuckets2], {DocBuckets4, IdRevs} = new_revs(DocBuckets3, [], []), {ok, CommitResults} = write_and_commit(Db, DocBuckets4, NonRepDocs, Options2), ResultsDict = dict:from_list(IdRevs ++ CommitResults ++ PreCommitFailures), {ok, lists:map( fun({#doc{}, Ref}) -> {ok, Result} = dict:find(Ref, ResultsDict), Result end, Docs2)} end. % Returns the first available document on disk. Input list is a full rev path % for the doc. make_first_doc_on_disk(_Db, _Id, _Pos, []) -> nil; make_first_doc_on_disk(Db, Id, Pos, [{_Rev, #doc{}} | RestPath]) -> make_first_doc_on_disk(Db, Id, Pos-1, RestPath); make_first_doc_on_disk(Db, Id, Pos, [{_Rev, ?REV_MISSING}|RestPath]) -> make_first_doc_on_disk(Db, Id, Pos - 1, RestPath); make_first_doc_on_disk(Db, Id, Pos, [{_Rev, RevValue} |_]=DocPath) -> IsDel = element(1, RevValue), Sp = element(2, RevValue), Revs = [Rev || {Rev, _} <- DocPath], make_doc(Db, Id, IsDel, Sp, {Pos, Revs}). set_commit_option(Options) -> CommitSettings = { [true || O <- Options, O==full_commit orelse O==delay_commit], couch_config:get("couchdb", "delayed_commits", "false") }, case CommitSettings of {[true], _} -> Options; % user requested explicit commit setting, do not change it {_, "true"} -> Options; % delayed commits are enabled, do nothing {_, "false"} -> [full_commit|Options]; {_, Else} -> ?LOG_ERROR("[couchdb] delayed_commits setting must be true/false, not ~p", [Else]), [full_commit|Options] end. collect_results(UpdatePid, MRef, ResultsAcc) -> receive {result, UpdatePid, Result} -> collect_results(UpdatePid, MRef, [Result | ResultsAcc]); {done, UpdatePid} -> {ok, ResultsAcc}; {retry, UpdatePid} -> retry; {'DOWN', MRef, _, _, Reason} -> exit(Reason) end. write_and_commit(#db{update_pid=UpdatePid}=Db, DocBuckets1, NonRepDocs, Options0) -> DocBuckets = prepare_doc_summaries(Db, DocBuckets1), Options = set_commit_option(Options0), MergeConflicts = lists:member(merge_conflicts, Options), FullCommit = lists:member(full_commit, Options), MRef = erlang:monitor(process, UpdatePid), try UpdatePid ! {update_docs, self(), DocBuckets, NonRepDocs, MergeConflicts, FullCommit}, case collect_results(UpdatePid, MRef, []) of {ok, Results} -> {ok, Results}; retry -> % This can happen if the db file we wrote to was swapped out by % compaction. Retry by reopening the db and writing to the current file {ok, Db2} = open_ref_counted(Db#db.main_pid, self()), DocBuckets2 = [ [{doc_flush_atts(Doc, Db2#db.updater_fd), Ref} || {Doc, Ref} <- Bucket] || Bucket <- DocBuckets1 ], % We only retry once DocBuckets3 = prepare_doc_summaries(Db2, DocBuckets2), close(Db2), UpdatePid ! {update_docs, self(), DocBuckets3, NonRepDocs, MergeConflicts, FullCommit}, case collect_results(UpdatePid, MRef, []) of {ok, Results} -> {ok, Results}; retry -> throw({update_error, compaction_retry}) end end after erlang:demonitor(MRef, [flush]) end. prepare_doc_summaries(Db, BucketList) -> [lists:map( fun({#doc{body = Body, atts = Atts} = Doc, Ref}) -> DiskAtts = [{N, T, P, AL, DL, R, M, E} || #att{name = N, type = T, data = {_, P}, md5 = M, revpos = R, att_len = AL, disk_len = DL, encoding = E} <- Atts], AttsFd = case Atts of [#att{data = {Fd, _}} | _] -> Fd; [] -> nil end, SummaryChunk = couch_db_updater:make_doc_summary(Db, {Body, DiskAtts}), {Doc#doc{body = {summary, SummaryChunk, AttsFd}}, Ref} end, Bucket) || Bucket <- BucketList]. before_docs_update(#db{before_doc_update = nil}, BucketList) -> BucketList; before_docs_update(#db{before_doc_update = Fun} = Db, BucketList) -> [lists:map( fun({Doc, Ref}) -> NewDoc = Fun(couch_doc:with_ejson_body(Doc), Db), {NewDoc, Ref} end, Bucket) || Bucket <- BucketList]. set_new_att_revpos(#doc{revs={RevPos,_Revs},atts=Atts}=Doc) -> Doc#doc{atts= lists:map(fun(#att{data={_Fd,_Sp}}=Att) -> % already commited to disk, do not set new rev Att; (Att) -> Att#att{revpos=RevPos+1} end, Atts)}. doc_flush_atts(Doc, Fd) -> Doc#doc{atts=[flush_att(Fd, Att) || Att <- Doc#doc.atts]}. check_md5(_NewSig, <<>>) -> ok; check_md5(Sig, Sig) -> ok; check_md5(_, _) -> throw(md5_mismatch). flush_att(Fd, #att{data={Fd0, _}}=Att) when Fd0 == Fd -> % already written to our file, nothing to write Att; flush_att(Fd, #att{data={OtherFd,StreamPointer}, md5=InMd5, disk_len=InDiskLen} = Att) -> {NewStreamData, Len, _IdentityLen, Md5, IdentityMd5} = couch_stream:copy_to_new_stream(OtherFd, StreamPointer, Fd), check_md5(IdentityMd5, InMd5), Att#att{data={Fd, NewStreamData}, md5=Md5, att_len=Len, disk_len=InDiskLen}; flush_att(Fd, #att{data=Data}=Att) when is_binary(Data) -> with_stream(Fd, Att, fun(OutputStream) -> couch_stream:write(OutputStream, Data) end); flush_att(Fd, #att{data=Fun,att_len=undefined}=Att) when is_function(Fun) -> MaxChunkSize = list_to_integer( couch_config:get("couchdb", "attachment_stream_buffer_size", "4096")), with_stream(Fd, Att, fun(OutputStream) -> % Fun(MaxChunkSize, WriterFun) must call WriterFun % once for each chunk of the attachment, Fun(MaxChunkSize, % WriterFun({Length, Binary}, State) % WriterFun({0, _Footers}, State) % Called with Length == 0 on the last time. % WriterFun returns NewState. fun({0, Footers}, _) -> F = mochiweb_headers:from_binary(Footers), case mochiweb_headers:get_value("Content-MD5", F) of undefined -> ok; Md5 -> {md5, base64:decode(Md5)} end; ({_Length, Chunk}, _) -> couch_stream:write(OutputStream, Chunk) end, ok) end); flush_att(Fd, #att{data=Fun,att_len=AttLen}=Att) when is_function(Fun) -> with_stream(Fd, Att, fun(OutputStream) -> write_streamed_attachment(OutputStream, Fun, AttLen) end). compressible_att_type(MimeType) when is_binary(MimeType) -> compressible_att_type(?b2l(MimeType)); compressible_att_type(MimeType) -> TypeExpList = re:split( couch_config:get("attachments", "compressible_types", ""), "\\s*,\\s*", [{return, list}] ), lists:any( fun(TypeExp) -> Regexp = ["^\\s*", re:replace(TypeExp, "\\*", ".*"), "(?:\\s*;.*?)?\\s*", $$], re:run(MimeType, Regexp, [caseless]) =/= nomatch end, [T || T <- TypeExpList, T /= []] ). % From RFC 2616 3.6.1 - Chunked Transfer Coding % % In other words, the origin server is willing to accept % the possibility that the trailer fields might be silently % discarded along the path to the client. % % I take this to mean that if "Trailers: Content-MD5\r\n" % is present in the request, but there is no Content-MD5 % trailer, we're free to ignore this inconsistency and % pretend that no Content-MD5 exists. with_stream(Fd, #att{md5=InMd5,type=Type,encoding=Enc}=Att, Fun) -> BufferSize = list_to_integer( couch_config:get("couchdb", "attachment_stream_buffer_size", "4096")), {ok, OutputStream} = case (Enc =:= identity) andalso compressible_att_type(Type) of true -> CompLevel = list_to_integer( couch_config:get("attachments", "compression_level", "0") ), couch_stream:open(Fd, [{buffer_size, BufferSize}, {encoding, gzip}, {compression_level, CompLevel}]); _ -> couch_stream:open(Fd, [{buffer_size, BufferSize}]) end, ReqMd5 = case Fun(OutputStream) of {md5, FooterMd5} -> case InMd5 of md5_in_footer -> FooterMd5; _ -> InMd5 end; _ -> InMd5 end, {StreamInfo, Len, IdentityLen, Md5, IdentityMd5} = couch_stream:close(OutputStream), check_md5(IdentityMd5, ReqMd5), {AttLen, DiskLen, NewEnc} = case Enc of identity -> case {Md5, IdentityMd5} of {Same, Same} -> {Len, IdentityLen, identity}; _ -> {Len, IdentityLen, gzip} end; gzip -> case {Att#att.att_len, Att#att.disk_len} of {AL, DL} when AL =:= undefined orelse DL =:= undefined -> % Compressed attachment uploaded through the standalone API. {Len, Len, gzip}; {AL, DL} -> % This case is used for efficient push-replication, where a % compressed attachment is located in the body of multipart % content-type request. {AL, DL, gzip} end end, Att#att{ data={Fd,StreamInfo}, att_len=AttLen, disk_len=DiskLen, md5=Md5, encoding=NewEnc }. write_streamed_attachment(_Stream, _F, 0) -> ok; write_streamed_attachment(Stream, F, LenLeft) when LenLeft > 0 -> Bin = read_next_chunk(F, LenLeft), ok = couch_stream:write(Stream, Bin), write_streamed_attachment(Stream, F, LenLeft - size(Bin)). read_next_chunk(F, _) when is_function(F, 0) -> F(); read_next_chunk(F, LenLeft) when is_function(F, 1) -> F(lists:min([LenLeft, 16#2000])). enum_docs_since_reduce_to_count(Reds) -> couch_btree:final_reduce( fun couch_db_updater:btree_by_seq_reduce/2, Reds). enum_docs_reduce_to_count(Reds) -> FinalRed = couch_btree:final_reduce( fun couch_db_updater:btree_by_id_reduce/2, Reds), element(1, FinalRed). changes_since(Db, StartSeq, Fun, Acc) -> changes_since(Db, StartSeq, Fun, [], Acc). changes_since(Db, StartSeq, Fun, Options, Acc) -> Wrapper = fun(DocInfo, _Offset, Acc2) -> Fun(DocInfo, Acc2) end, {ok, _LastReduction, AccOut} = couch_btree:fold(by_seq_btree(Db), Wrapper, Acc, [{start_key, StartSeq + 1}] ++ Options), {ok, AccOut}. count_changes_since(Db, SinceSeq) -> BTree = by_seq_btree(Db), {ok, Changes} = couch_btree:fold_reduce(BTree, fun(_SeqStart, PartialReds, 0) -> {ok, couch_btree:final_reduce(BTree, PartialReds)} end, 0, [{start_key, SinceSeq + 1}]), Changes. enum_docs_since(Db, SinceSeq, InFun, Acc, Options) -> {ok, LastReduction, AccOut} = couch_btree:fold( by_seq_btree(Db), InFun, Acc, [{start_key, SinceSeq + 1} | Options]), {ok, enum_docs_since_reduce_to_count(LastReduction), AccOut}. enum_docs(Db, InFun, InAcc, Options) -> FoldFun = skip_deleted(InFun), {ok, LastReduce, OutAcc} = couch_btree:fold( by_id_btree(Db), FoldFun, InAcc, Options), {ok, enum_docs_reduce_to_count(LastReduce), OutAcc}. % server functions init({DbName, Filepath, Fd, Options}) -> {ok, UpdaterPid} = gen_server:start_link(couch_db_updater, {self(), DbName, Filepath, Fd, Options}, []), {ok, #db{fd_ref_counter=RefCntr}=Db} = gen_server:call(UpdaterPid, get_db), couch_ref_counter:add(RefCntr), case lists:member(sys_db, Options) of true -> ok; false -> couch_stats_collector:track_process_count({couchdb, open_databases}) end, process_flag(trap_exit, true), {ok, Db}. terminate(_Reason, Db) -> couch_util:shutdown_sync(Db#db.update_pid), ok. handle_call({open_ref_count, OpenerPid}, _, #db{fd_ref_counter=RefCntr}=Db) -> ok = couch_ref_counter:add(RefCntr, OpenerPid), {reply, {ok, Db}, Db}; handle_call(is_idle, _From, #db{fd_ref_counter=RefCntr, compactor_pid=Compact, waiting_delayed_commit=Delay}=Db) -> % Idle means no referrers. Unless in the middle of a compaction file switch, % there are always at least 2 referrers, couch_db_updater and us. {reply, (Delay == nil) andalso (Compact == nil) andalso (couch_ref_counter:count(RefCntr) == 2), Db}; handle_call({db_updated, NewDb}, _From, #db{fd_ref_counter=OldRefCntr}) -> #db{fd_ref_counter=NewRefCntr}=NewDb, case NewRefCntr =:= OldRefCntr of true -> ok; false -> couch_ref_counter:add(NewRefCntr), couch_ref_counter:drop(OldRefCntr) end, {reply, ok, NewDb}; handle_call(get_db, _From, Db) -> {reply, {ok, Db}, Db}. handle_cast(Msg, Db) -> ?LOG_ERROR("Bad cast message received for db ~s: ~p", [Db#db.name, Msg]), exit({error, Msg}). code_change(_OldVsn, State, _Extra) -> {ok, State}. handle_info({'EXIT', _Pid, normal}, Db) -> {noreply, Db}; handle_info({'EXIT', _Pid, Reason}, Server) -> {stop, Reason, Server}; handle_info(Msg, Db) -> ?LOG_ERROR("Bad message received for db ~s: ~p", [Db#db.name, Msg]), exit({error, Msg}). %%% Internal function %%% open_doc_revs_int(Db, IdRevs, Options) -> Ids = [Id || {Id, _Revs} <- IdRevs], LookupResults = get_full_doc_infos(Db, Ids), lists:zipwith( fun({Id, Revs}, Lookup) -> case Lookup of {ok, #full_doc_info{rev_tree=RevTree}} -> {FoundRevs, MissingRevs} = case Revs of all -> {couch_key_tree:get_all_leafs(RevTree), []}; _ -> case lists:member(latest, Options) of true -> couch_key_tree:get_key_leafs(RevTree, Revs); false -> couch_key_tree:get(RevTree, Revs) end end, FoundResults = lists:map(fun({Value, {Pos, [Rev|_]}=FoundRevPath}) -> case Value of ?REV_MISSING -> % we have the rev in our list but know nothing about it {{not_found, missing}, {Pos, Rev}}; RevValue -> IsDeleted = element(1, RevValue), SummaryPtr = element(2, RevValue), {ok, make_doc(Db, Id, IsDeleted, SummaryPtr, FoundRevPath)} end end, FoundRevs), Results = FoundResults ++ [{{not_found, missing}, MissingRev} || MissingRev <- MissingRevs], {ok, Results}; not_found when Revs == all -> {ok, []}; not_found -> {ok, [{{not_found, missing}, Rev} || Rev <- Revs]} end end, IdRevs, LookupResults). open_doc_int(Db, <> = Id, Options) -> case couch_btree:lookup(local_btree(Db), [Id]) of [{ok, {_, {Rev, BodyData}}}] -> Doc = #doc{id=Id, revs={0, [?l2b(integer_to_list(Rev))]}, body=BodyData}, apply_open_options({ok, Doc}, Options); [not_found] -> {not_found, missing} end; open_doc_int(Db, #doc_info{id=Id,revs=[RevInfo|_]}=DocInfo, Options) -> #rev_info{deleted=IsDeleted,rev={Pos,RevId},body_sp=Bp} = RevInfo, Doc = make_doc(Db, Id, IsDeleted, Bp, {Pos,[RevId]}), apply_open_options( {ok, Doc#doc{meta=doc_meta_info(DocInfo, [], Options)}}, Options); open_doc_int(Db, #full_doc_info{id=Id,rev_tree=RevTree}=FullDocInfo, Options) -> #doc_info{revs=[#rev_info{deleted=IsDeleted,rev=Rev,body_sp=Bp}|_]} = DocInfo = couch_doc:to_doc_info(FullDocInfo), {[{_, RevPath}], []} = couch_key_tree:get(RevTree, [Rev]), Doc = make_doc(Db, Id, IsDeleted, Bp, RevPath), apply_open_options( {ok, Doc#doc{meta=doc_meta_info(DocInfo, RevTree, Options)}}, Options); open_doc_int(Db, Id, Options) -> case get_full_doc_info(Db, Id) of {ok, FullDocInfo} -> open_doc_int(Db, FullDocInfo, Options); not_found -> {not_found, missing} end. doc_meta_info(#doc_info{high_seq=Seq,revs=[#rev_info{rev=Rev}|RestInfo]}, RevTree, Options) -> case lists:member(revs_info, Options) of false -> []; true -> {[{Pos, RevPath}],[]} = couch_key_tree:get_full_key_paths(RevTree, [Rev]), [{revs_info, Pos, lists:map( fun({Rev1, ?REV_MISSING}) -> {Rev1, missing}; ({Rev1, RevValue}) -> case element(1, RevValue) of true -> {Rev1, deleted}; false -> {Rev1, available} end end, RevPath)}] end ++ case lists:member(conflicts, Options) of false -> []; true -> case [Rev1 || #rev_info{rev=Rev1,deleted=false} <- RestInfo] of [] -> []; ConflictRevs -> [{conflicts, ConflictRevs}] end end ++ case lists:member(deleted_conflicts, Options) of false -> []; true -> case [Rev1 || #rev_info{rev=Rev1,deleted=true} <- RestInfo] of [] -> []; DelConflictRevs -> [{deleted_conflicts, DelConflictRevs}] end end ++ case lists:member(local_seq, Options) of false -> []; true -> [{local_seq, Seq}] end. read_doc(#db{fd=Fd}, Pos) -> couch_file:pread_term(Fd, Pos). make_doc(#db{updater_fd = Fd} = Db, Id, Deleted, Bp, RevisionPath) -> {BodyData, Atts} = case Bp of nil -> {[], []}; _ -> {ok, {BodyData0, Atts00}} = read_doc(Db, Bp), Atts0 = case Atts00 of _ when is_binary(Atts00) -> couch_compress:decompress(Atts00); _ when is_list(Atts00) -> % pre 1.2 format Atts00 end, {BodyData0, lists:map( fun({Name,Type,Sp,AttLen,DiskLen,RevPos,Md5,Enc}) -> #att{name=Name, type=Type, att_len=AttLen, disk_len=DiskLen, md5=Md5, revpos=RevPos, data={Fd,Sp}, encoding= case Enc of true -> % 0110 UPGRADE CODE gzip; false -> % 0110 UPGRADE CODE identity; _ -> Enc end }; ({Name,Type,Sp,AttLen,RevPos,Md5}) -> #att{name=Name, type=Type, att_len=AttLen, disk_len=AttLen, md5=Md5, revpos=RevPos, data={Fd,Sp}}; ({Name,{Type,Sp,AttLen}}) -> #att{name=Name, type=Type, att_len=AttLen, disk_len=AttLen, md5= <<>>, revpos=0, data={Fd,Sp}} end, Atts0)} end, Doc = #doc{ id = Id, revs = RevisionPath, body = BodyData, atts = Atts, deleted = Deleted }, after_doc_read(Db, Doc). after_doc_read(#db{after_doc_read = nil}, Doc) -> Doc; after_doc_read(#db{after_doc_read = Fun} = Db, Doc) -> Fun(couch_doc:with_ejson_body(Doc), Db). increment_stat(#db{options = Options}, Stat) -> case lists:member(sys_db, Options) of true -> ok; false -> couch_stats_collector:increment(Stat) end. local_btree(#db{local_docs_btree = BTree, fd = ReaderFd}) -> BTree#btree{fd = ReaderFd}. by_seq_btree(#db{docinfo_by_seq_btree = BTree, fd = ReaderFd}) -> BTree#btree{fd = ReaderFd}. by_id_btree(#db{fulldocinfo_by_id_btree = BTree, fd = ReaderFd}) -> BTree#btree{fd = ReaderFd}. skip_deleted(FoldFun) -> fun (visit, KV, Reds, Acc) -> FoldFun(KV, Reds, Acc); (traverse, _LK, {Undeleted, _Del, _Size}, Acc) when Undeleted == 0 -> {skip, Acc}; (traverse, _, _, Acc) -> {ok, Acc} end. apache-couchdb-1.6.0/src/couchdb/couch_db.hrl0000644000175000001440000001463212332105522020777 0ustar00djcusers00000000000000% Licensed under the Apache License, Version 2.0 (the "License"); you may not % use this file except in compliance with the License. You may obtain a copy of % the License at % % http://www.apache.org/licenses/LICENSE-2.0 % % Unless required by applicable law or agreed to in writing, software % distributed under the License is distributed on an "AS IS" BASIS, WITHOUT % WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the % License for the specific language governing permissions and limitations under % the License. -define(LOCAL_DOC_PREFIX, "_local/"). -define(DESIGN_DOC_PREFIX0, "_design"). -define(DESIGN_DOC_PREFIX, "_design/"). -define(DEFAULT_COMPRESSION, snappy). -define(MIN_STR, <<"">>). -define(MAX_STR, <<255>>). % illegal utf string % the lowest possible database sequence number -define(LOWEST_SEQ, 0). -define(REWRITE_COUNT, couch_rewrite_count). -define(JSON_ENCODE(V), ejson:encode(V)). -define(JSON_DECODE(V), ejson:decode(V)). -define(b2l(V), binary_to_list(V)). -define(l2b(V), list_to_binary(V)). -define(term_to_bin(T), term_to_binary(T, [{minor_version, 1}])). -define(term_size(T), try erlang:external_size(T) catch _:_ -> byte_size(?term_to_bin(T)) end). -define(DEFAULT_ATTACHMENT_CONTENT_TYPE, <<"application/octet-stream">>). -define(LOG_DEBUG(Format, Args), case couch_log:debug_on(?MODULE) of true -> couch_log:debug(Format, Args); false -> ok end). -define(LOG_INFO(Format, Args), case couch_log:info_on(?MODULE) of true -> couch_log:info(Format, Args); false -> ok end). -define(LOG_WARN(Format, Args), case couch_log:warn_on(?MODULE) of true -> couch_log:warn(Format, Args); false -> ok end). -define(LOG_ERROR(Format, Args), couch_log:error(Format, Args)). % Tree::term() is really a tree(), but we don't want to require R13B04 yet -type branch() :: {Key::term(), Value::term(), Tree::term()}. -type path() :: {Start::pos_integer(), branch()}. -type tree() :: [branch()]. % sorted by key -record(rev_info, { rev, seq = 0, deleted = false, body_sp = nil % stream pointer }). -record(doc_info, { id = <<"">>, high_seq = 0, revs = [] % rev_info }). -record(full_doc_info, {id = <<"">>, update_seq = 0, deleted = false, rev_tree = [], leafs_size = 0 }). -record(httpd, {mochi_req, peer, method, requested_path_parts, path_parts, db_url_handlers, user_ctx, req_body = undefined, design_url_handlers, auth, default_fun, url_handlers }). -record(doc, { id = <<"">>, revs = {0, []}, % the json body object. body = {[]}, atts = [], % attachments deleted = false, % key/value tuple of meta information, provided when using special options: % couch_db:open_doc(Db, Id, Options). meta = [] }). -record(att, { name, type, att_len, disk_len, % length of the attachment in its identity form % (that is, without a content encoding applied to it) % differs from att_len when encoding /= identity md5= <<>>, revpos=0, data, encoding=identity % currently supported values are: % identity, gzip % additional values to support in the future: % deflate, compress }). -record(user_ctx, { name=null, roles=[], handler }). % This should be updated anytime a header change happens that requires more % than filling in new defaults. % % As long the changes are limited to new header fields (with inline % defaults) added to the end of the record, then there is no need to increment % the disk revision number. % % if the disk revision is incremented, then new upgrade logic will need to be % added to couch_db_updater:init_db. -define(LATEST_DISK_VERSION, 6). -record(db_header, {disk_version = ?LATEST_DISK_VERSION, update_seq = 0, unused = 0, fulldocinfo_by_id_btree_state = nil, docinfo_by_seq_btree_state = nil, local_docs_btree_state = nil, purge_seq = 0, purged_docs = nil, security_ptr = nil, revs_limit = 1000 }). -record(db, {main_pid = nil, update_pid = nil, compactor_pid = nil, instance_start_time, % number of microsecs since jan 1 1970 as a binary string fd, updater_fd, fd_ref_counter, header = #db_header{}, committed_update_seq, fulldocinfo_by_id_btree, docinfo_by_seq_btree, local_docs_btree, update_seq, name, filepath, validate_doc_funs = [], security = [], security_ptr = nil, user_ctx = #user_ctx{}, waiting_delayed_commit = nil, revs_limit = 1000, fsync_options = [], options = [], compression, before_doc_update = nil, % nil | fun(Doc, Db) -> NewDoc after_doc_read = nil % nil | fun(Doc, Db) -> NewDoc }). -record(view_query_args, { start_key, end_key, start_docid = ?MIN_STR, end_docid = ?MAX_STR, direction = fwd, inclusive_end=true, % aka a closed-interval limit = 10000000000, % Huge number to simplify logic skip = 0, group_level = 0, view_type = nil, include_docs = false, doc_options = [], conflicts = false, stale = false, multi_get = false, callback = nil, list = nil }). -record(view_fold_helper_funs, { reduce_count, passed_end, start_response, send_row }). -record(reduce_fold_helper_funs, { start_response, send_row }). -record(extern_resp_args, { code = 200, stop = false, data = <<>>, ctype = "application/json", headers = [], json = nil }). -record(index_header, {seq=0, purge_seq=0, id_btree_state=nil, view_states=nil }). % small value used in revision trees to indicate the revision isn't stored -define(REV_MISSING, []). -record(changes_args, { feed = "normal", dir = fwd, since = 0, limit = 1000000000000000, style = main_only, heartbeat, timeout, filter = "", filter_fun, filter_args = [], include_docs = false, doc_options = [], conflicts = false, db_open_options = [] }). -record(btree, { fd, root, extract_kv = fun({_Key, _Value} = KV) -> KV end, assemble_kv = fun(Key, Value) -> {Key, Value} end, less = fun(A, B) -> A < B end, reduce = nil, compression = ?DEFAULT_COMPRESSION }). apache-couchdb-1.6.0/src/couchdb/couch_work_queue.erl0000644000175000001440000001151712332105522022574 0ustar00djcusers00000000000000% Licensed under the Apache License, Version 2.0 (the "License"); you may not % use this file except in compliance with the License. You may obtain a copy of % the License at % % http://www.apache.org/licenses/LICENSE-2.0 % % Unless required by applicable law or agreed to in writing, software % distributed under the License is distributed on an "AS IS" BASIS, WITHOUT % WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the % License for the specific language governing permissions and limitations under % the License. -module(couch_work_queue). -behaviour(gen_server). -include("couch_db.hrl"). % public API -export([new/1, queue/2, dequeue/1, dequeue/2, close/1, item_count/1, size/1]). % gen_server callbacks -export([init/1, terminate/2]). -export([handle_call/3, handle_cast/2, code_change/3, handle_info/2]). -record(q, { queue = queue:new(), blocked = [], max_size, max_items, items = 0, size = 0, work_waiters = [], close_on_dequeue = false, multi_workers = false }). new(Options) -> gen_server:start_link(couch_work_queue, Options, []). queue(Wq, Item) when is_binary(Item) -> gen_server:call(Wq, {queue, Item, byte_size(Item)}, infinity); queue(Wq, Item) -> gen_server:call(Wq, {queue, Item, ?term_size(Item)}, infinity). dequeue(Wq) -> dequeue(Wq, all). dequeue(Wq, MaxItems) -> try gen_server:call(Wq, {dequeue, MaxItems}, infinity) catch _:_ -> closed end. item_count(Wq) -> try gen_server:call(Wq, item_count, infinity) catch _:_ -> closed end. size(Wq) -> try gen_server:call(Wq, size, infinity) catch _:_ -> closed end. close(Wq) -> gen_server:cast(Wq, close). init(Options) -> Q = #q{ max_size = couch_util:get_value(max_size, Options, nil), max_items = couch_util:get_value(max_items, Options, nil), multi_workers = couch_util:get_value(multi_workers, Options, false) }, {ok, Q}. terminate(_Reason, #q{work_waiters=Workers}) -> lists:foreach(fun({W, _}) -> gen_server:reply(W, closed) end, Workers). handle_call({queue, Item, Size}, From, #q{work_waiters = []} = Q0) -> Q = Q0#q{size = Q0#q.size + Size, items = Q0#q.items + 1, queue = queue:in({Item, Size}, Q0#q.queue)}, case (Q#q.size >= Q#q.max_size) orelse (Q#q.items >= Q#q.max_items) of true -> {noreply, Q#q{blocked = [From | Q#q.blocked]}}; false -> {reply, ok, Q} end; handle_call({queue, Item, _}, _From, #q{work_waiters = [{W, _Max} | Rest]} = Q) -> gen_server:reply(W, {ok, [Item]}), {reply, ok, Q#q{work_waiters = Rest}}; handle_call({dequeue, Max}, From, Q) -> #q{work_waiters = Workers, multi_workers = Multi, items = Count} = Q, case {Workers, Multi} of {[_ | _], false} -> exit("Only one caller allowed to wait for this work at a time"); {[_ | _], true} -> {noreply, Q#q{work_waiters=Workers ++ [{From, Max}]}}; _ -> case Count of 0 -> {noreply, Q#q{work_waiters=Workers ++ [{From, Max}]}}; C when C > 0 -> deliver_queue_items(Max, Q) end end; handle_call(item_count, _From, Q) -> {reply, Q#q.items, Q}; handle_call(size, _From, Q) -> {reply, Q#q.size, Q}. deliver_queue_items(Max, Q) -> #q{ queue = Queue, items = Count, size = Size, close_on_dequeue = Close, blocked = Blocked } = Q, case (Max =:= all) orelse (Max >= Count) of false -> {Items, Size2, Queue2, Blocked2} = dequeue_items( Max, Size, Queue, Blocked, []), Q2 = Q#q{ items = Count - Max, size = Size2, blocked = Blocked2, queue = Queue2 }, {reply, {ok, Items}, Q2}; true -> lists:foreach(fun(F) -> gen_server:reply(F, ok) end, Blocked), Q2 = Q#q{items = 0, size = 0, blocked = [], queue = queue:new()}, Items = [Item || {Item, _} <- queue:to_list(Queue)], case Close of false -> {reply, {ok, Items}, Q2}; true -> {stop, normal, {ok, Items}, Q2} end end. dequeue_items(0, Size, Queue, Blocked, DequeuedAcc) -> {lists:reverse(DequeuedAcc), Size, Queue, Blocked}; dequeue_items(NumItems, Size, Queue, Blocked, DequeuedAcc) -> {{value, {Item, ItemSize}}, Queue2} = queue:out(Queue), case Blocked of [] -> Blocked2 = Blocked; [From | Blocked2] -> gen_server:reply(From, ok) end, dequeue_items( NumItems - 1, Size - ItemSize, Queue2, Blocked2, [Item | DequeuedAcc]). handle_cast(close, #q{items = 0} = Q) -> {stop, normal, Q}; handle_cast(close, Q) -> {noreply, Q#q{close_on_dequeue = true}}. code_change(_OldVsn, State, _Extra) -> {ok, State}. handle_info(X, Q) -> {stop, X, Q}. apache-couchdb-1.6.0/src/couchdb/couch_ref_counter.erl0000644000175000001440000000616212332105522022721 0ustar00djcusers00000000000000% Licensed under the Apache License, Version 2.0 (the "License"); you may not % use this file except in compliance with the License. You may obtain a copy of % the License at % % http://www.apache.org/licenses/LICENSE-2.0 % % Unless required by applicable law or agreed to in writing, software % distributed under the License is distributed on an "AS IS" BASIS, WITHOUT % WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the % License for the specific language governing permissions and limitations under % the License. -module(couch_ref_counter). -behaviour(gen_server). -export([start/1, init/1, terminate/2, handle_call/3, handle_cast/2, code_change/3, handle_info/2]). -export([drop/1,drop/2,add/1,add/2,count/1]). start(ChildProcs) -> gen_server:start(couch_ref_counter, {self(), ChildProcs}, []). drop(RefCounterPid) -> drop(RefCounterPid, self()). drop(RefCounterPid, Pid) -> gen_server:call(RefCounterPid, {drop, Pid}, infinity). add(RefCounterPid) -> add(RefCounterPid, self()). add(RefCounterPid, Pid) -> gen_server:call(RefCounterPid, {add, Pid}, infinity). count(RefCounterPid) -> gen_server:call(RefCounterPid, count). % server functions -record(srv, { referrers=dict:new(), % a dict of each ref counting proc. child_procs=[] }). init({Pid, ChildProcs}) -> [link(ChildProc) || ChildProc <- ChildProcs], Referrers = dict:from_list([{Pid, {erlang:monitor(process, Pid), 1}}]), {ok, #srv{referrers=Referrers, child_procs=ChildProcs}}. terminate(_Reason, #srv{child_procs=ChildProcs}) -> [couch_util:shutdown_sync(Pid) || Pid <- ChildProcs], ok. handle_call({add, Pid},_From, #srv{referrers=Referrers}=Srv) -> Referrers2 = case dict:find(Pid, Referrers) of error -> dict:store(Pid, {erlang:monitor(process, Pid), 1}, Referrers); {ok, {MonRef, RefCnt}} -> dict:store(Pid, {MonRef, RefCnt + 1}, Referrers) end, {reply, ok, Srv#srv{referrers=Referrers2}}; handle_call(count, _From, Srv) -> {monitors, Monitors} = process_info(self(), monitors), {reply, length(Monitors), Srv}; handle_call({drop, Pid}, _From, #srv{referrers=Referrers}=Srv) -> Referrers2 = case dict:find(Pid, Referrers) of {ok, {MonRef, 1}} -> erlang:demonitor(MonRef, [flush]), dict:erase(Pid, Referrers); {ok, {MonRef, Num}} -> dict:store(Pid, {MonRef, Num-1}, Referrers); error -> Referrers end, Srv2 = Srv#srv{referrers=Referrers2}, case should_close() of true -> {stop,normal,ok,Srv2}; false -> {reply, ok, Srv2} end. handle_cast(Msg, _Srv)-> exit({unknown_msg,Msg}). code_change(_OldVsn, State, _Extra) -> {ok, State}. handle_info({'DOWN', MonRef, _, Pid, _}, #srv{referrers=Referrers}=Srv) -> {ok, {MonRef, _RefCount}} = dict:find(Pid, Referrers), Srv2 = Srv#srv{referrers=dict:erase(Pid, Referrers)}, case should_close() of true -> {stop,normal,Srv2}; false -> {noreply,Srv2} end. should_close() -> case process_info(self(), monitors) of {monitors, []} -> true; _ -> false end. apache-couchdb-1.6.0/src/couchdb/couch_config_writer.erl0000644000175000001440000000665612332105522023257 0ustar00djcusers00000000000000% Licensed under the Apache License, Version 2.0 (the "License"); you may not % use this file except in compliance with the License. You may obtain a copy of % the License at % % http://www.apache.org/licenses/LICENSE-2.0 % % Unless required by applicable law or agreed to in writing, software % distributed under the License is distributed on an "AS IS" BASIS, WITHOUT % WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the % License for the specific language governing permissions and limitations under % the License. %% @doc Saves a Key/Value pair to a ini file. The Key consists of a Section %% and Option combination. If that combination is found in the ini file %% the new value replaces the old value. If only the Section is found the %% Option and value combination is appended to the Section. If the Section %% does not yet exist in the ini file, it is added and the Option/Value %% pair is appended. %% @see couch_config -module(couch_config_writer). -export([save_to_file/2]). -include("couch_db.hrl"). %% @spec save_to_file( %% Config::{{Section::string(), Option::string()}, Value::string()}, %% File::filename()) -> ok %% @doc Saves a Section/Key/Value triple to the ini file File::filename() save_to_file({{Section, Key}, Value}, File) -> {ok, OldFileContents} = file:read_file(File), Lines = re:split(OldFileContents, "\r\n|\n|\r|\032", [{return, list}]), SectionLine = "[" ++ Section ++ "]", {ok, Pattern} = re:compile(["^(", Key, "\\s*=)|\\[[a-zA-Z0-9\_-]*\\]"]), NewLines = process_file_lines(Lines, [], SectionLine, Pattern, Key, Value), NewFileContents = reverse_and_add_newline(strip_empty_lines(NewLines), []), case file:write_file(File, NewFileContents) of ok -> ok; {error, Reason} = Error -> ?LOG_ERROR("Could not write config file ~s: ~s", [File, file:format_error(Reason)]), Error end. process_file_lines([Section|Rest], SeenLines, Section, Pattern, Key, Value) -> process_section_lines(Rest, [Section|SeenLines], Pattern, Key, Value); process_file_lines([Line|Rest], SeenLines, Section, Pattern, Key, Value) -> process_file_lines(Rest, [Line|SeenLines], Section, Pattern, Key, Value); process_file_lines([], SeenLines, Section, _Pattern, Key, Value) -> % Section wasn't found. Append it with the option here. [Key ++ " = " ++ Value, Section, "" | strip_empty_lines(SeenLines)]. process_section_lines([Line|Rest], SeenLines, Pattern, Key, Value) -> case re:run(Line, Pattern, [{capture, all_but_first}]) of nomatch -> % Found nothing interesting. Move on. process_section_lines(Rest, [Line|SeenLines], Pattern, Key, Value); {match, []} -> % Found another section. Append the option here. lists:reverse(Rest) ++ [Line, "", Key ++ " = " ++ Value | strip_empty_lines(SeenLines)]; {match, _} -> % Found the option itself. Replace it. lists:reverse(Rest) ++ [Key ++ " = " ++ Value | SeenLines] end; process_section_lines([], SeenLines, _Pattern, Key, Value) -> % Found end of file within the section. Append the option here. [Key ++ " = " ++ Value | strip_empty_lines(SeenLines)]. reverse_and_add_newline([Line|Rest], Content) -> reverse_and_add_newline(Rest, [Line, "\n", Content]); reverse_and_add_newline([], Content) -> Content. strip_empty_lines(["" | Rest]) -> strip_empty_lines(Rest); strip_empty_lines(All) -> All. apache-couchdb-1.6.0/src/couchdb/Makefile.am0000644000175000001440000001275612332105522020563 0ustar00djcusers00000000000000## Licensed under the Apache License, Version 2.0 (the "License"); you may not ## use this file except in compliance with the License. You may obtain a copy of ## the License at ## ## http://www.apache.org/licenses/LICENSE-2.0 ## ## Unless required by applicable law or agreed to in writing, software ## distributed under the License is distributed on an "AS IS" BASIS, WITHOUT ## WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the ## License for the specific language governing permissions and limitations under ## the License. SUBDIRS = priv # devdocdir = $(localdocdir)/developer/couchdb couchlibdir = $(localerlanglibdir)/couch-$(version) couchincludedir = $(couchlibdir)/include couchebindir = $(couchlibdir)/ebin couchinclude_DATA = couch_db.hrl couch_js_functions.hrl couchebin_DATA = $(compiled_files) # dist_devdoc_DATA = $(doc_base) $(doc_modules) CLEANFILES = $(compiled_files) $(doc_base) # CLEANFILES = $(doc_modules) edoc-info source_files = \ couch.erl \ couch_app.erl \ couch_auth_cache.erl \ couch_btree.erl \ couch_changes.erl \ couch_compaction_daemon.erl \ couch_compress.erl \ couch_config.erl \ couch_config_writer.erl \ couch_db.erl \ couch_db_update_notifier.erl \ couch_db_update_notifier_sup.erl \ couch_doc.erl \ couch_drv.erl \ couch_ejson_compare.erl \ couch_event_sup.erl \ couch_external_manager.erl \ couch_external_server.erl \ couch_file.erl \ couch_httpd.erl \ couch_httpd_db.erl \ couch_httpd_auth.erl \ couch_httpd_cors.erl \ couch_httpd_oauth.erl \ couch_httpd_external.erl \ couch_httpd_misc_handlers.erl \ couch_httpd_proxy.erl \ couch_httpd_rewrite.erl \ couch_httpd_stats_handlers.erl \ couch_httpd_vhost.erl \ couch_key_tree.erl \ couch_log.erl \ couch_native_process.erl \ couch_os_daemons.erl \ couch_os_process.erl \ couch_passwords.erl \ couch_primary_sup.erl \ couch_query_servers.erl \ couch_ref_counter.erl \ couch_secondary_sup.erl \ couch_server.erl \ couch_server_sup.erl \ couch_stats_aggregator.erl \ couch_stats_collector.erl \ couch_stream.erl \ couch_task_status.erl \ couch_users_db.erl \ couch_util.erl \ couch_uuids.erl \ couch_db_updater.erl \ couch_work_queue.erl \ json_stream_parse.erl EXTRA_DIST = $(source_files) couch_db.hrl couch_js_functions.hrl compiled_files = \ couch.app \ couch.beam \ couch_app.beam \ couch_auth_cache.beam \ couch_btree.beam \ couch_changes.beam \ couch_compaction_daemon.beam \ couch_compress.beam \ couch_config.beam \ couch_config_writer.beam \ couch_db.beam \ couch_db_update_notifier.beam \ couch_db_update_notifier_sup.beam \ couch_doc.beam \ couch_drv.beam \ couch_ejson_compare.beam \ couch_event_sup.beam \ couch_external_manager.beam \ couch_external_server.beam \ couch_file.beam \ couch_httpd.beam \ couch_httpd_db.beam \ couch_httpd_auth.beam \ couch_httpd_oauth.beam \ couch_httpd_cors.beam \ couch_httpd_proxy.beam \ couch_httpd_external.beam \ couch_httpd_misc_handlers.beam \ couch_httpd_rewrite.beam \ couch_httpd_stats_handlers.beam \ couch_httpd_vhost.beam \ couch_key_tree.beam \ couch_log.beam \ couch_native_process.beam \ couch_os_daemons.beam \ couch_os_process.beam \ couch_passwords.beam \ couch_primary_sup.beam \ couch_query_servers.beam \ couch_ref_counter.beam \ couch_secondary_sup.beam \ couch_server.beam \ couch_server_sup.beam \ couch_stats_aggregator.beam \ couch_stats_collector.beam \ couch_stream.beam \ couch_task_status.beam \ couch_users_db.beam \ couch_util.beam \ couch_uuids.beam \ couch_db_updater.beam \ couch_work_queue.beam \ json_stream_parse.beam # doc_base = \ # erlang.png \ # index.html \ # modules-frame.html \ # overview-summary.html \ # packages-frame.html \ # stylesheet.css # doc_modules = \ # couch_btree.html \ # couch_config.html \ # couch_config_writer.html \ # couch_db.html \ # couch_db_update_notifier.html \ # couch_db_update_notifier_sup.html \ # couch_doc.html \ # couch_event_sup.html \ # couch_file.html \ # couch_httpd.html \ # couch_key_tree.html \ # couch_log.html \ # couch_query_servers.html \ # couch_rep.html \ # couch_rep_sup.html \ # couch_server.html \ # couch_server_sup.html \ # couch_stream.html \ # couch_util.html if WINDOWS couch.app: couch.app.tpl modules=`find . -name "*.erl" \! -name ".*" -exec basename {} .erl \; | tr '\n' ',' | sed "s/,$$//"`; \ sed -e "s|%package_name%|@package_name@|g" \ -e "s|%version%|@version@|g" \ -e "s|@modules@|$$modules|g" \ -e "s|%localconfdir%|../etc/couchdb|g" \ -e "s|@defaultini@|default.ini|g" \ -e "s|@localini@|local.ini|g" > \ $@ < $< else couch.app: couch.app.tpl modules=`{ find . -name "*.erl" \! -name ".*" -exec basename {} .erl \; | tr '\n' ','; echo ''; } | sed "s/,$$//"`; \ sed -e "s|%package_name%|@package_name@|g" \ -e "s|%version%|@version@|g" \ -e "s|@modules@|$$modules|g" \ -e "s|%localconfdir%|@localconfdir@|g" \ -e "s|@defaultini@|default.ini|g" \ -e "s|@localini@|local.ini|g" > \ $@ < $< chmod +x $@ endif # $(dist_devdoc_DATA): edoc-info # $(ERL) -noshell -run edoc_run files [\"$<\"] %.beam: %.erl couch_db.hrl couch_js_functions.hrl $(ERLC) $(ERLC_FLAGS) ${TEST} $<; apache-couchdb-1.6.0/src/couchdb/Makefile.in0000644000175000001440000006734612332105551020603 0ustar00djcusers00000000000000# Makefile.in generated by automake 1.11.6 from Makefile.am. # @configure_input@ # Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, # 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011 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__make_dryrun = \ { \ am__dry=no; \ case $$MAKEFLAGS in \ *\\[\ \ ]*) \ echo 'am--echo: ; @echo "AM" OK' | $(MAKE) -f - 2>/dev/null \ | grep '^AM OK$$' >/dev/null || am__dry=yes;; \ *) \ for am__flg in $$MAKEFLAGS; do \ case $$am__flg in \ *=*|--*) ;; \ *n*) am__dry=yes; break;; \ esac; \ done;; \ esac; \ test $$am__dry = yes; \ } 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/couchdb DIST_COMMON = $(srcdir)/Makefile.am $(srcdir)/Makefile.in \ $(srcdir)/couch.app.tpl.in ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 am__aclocal_m4_deps = $(top_srcdir)/m4/libtool.m4 \ $(top_srcdir)/m4/ltoptions.m4 $(top_srcdir)/m4/ltsugar.m4 \ $(top_srcdir)/m4/ltversion.m4 $(top_srcdir)/m4/lt~obsolete.m4 \ $(top_srcdir)/acinclude.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 \ $(top_builddir)/src/snappy/google-snappy/config.h CONFIG_CLEAN_FILES = couch.app.tpl CONFIG_CLEAN_VPATH_FILES = SOURCES = DIST_SOURCES = RECURSIVE_TARGETS = all-recursive check-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 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)$(couchebindir)" \ "$(DESTDIR)$(couchincludedir)" DATA = $(couchebin_DATA) $(couchinclude_DATA) RECURSIVE_CLEAN_TARGETS = mostlyclean-recursive clean-recursive \ distclean-recursive maintainer-clean-recursive AM_RECURSIVE_TARGETS = $(RECURSIVE_TARGETS:-recursive=) \ $(RECURSIVE_CLEAN_TARGETS:-recursive=) tags TAGS ctags CTAGS \ distdir 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@ AMTAR = @AMTAR@ AR = @AR@ AS = @AS@ AUTOCONF = @AUTOCONF@ AUTOHEADER = @AUTOHEADER@ AUTOMAKE = @AUTOMAKE@ AWK = @AWK@ CC = @CC@ CCDEPMODE = @CCDEPMODE@ CFLAGS = @CFLAGS@ CPP = @CPP@ CPPFLAGS = @CPPFLAGS@ CURL_CFLAGS = @CURL_CFLAGS@ CURL_CONFIG = @CURL_CONFIG@ CURL_LIBS = @CURL_LIBS@ CXX = @CXX@ CXXCPP = @CXXCPP@ CXXDEPMODE = @CXXDEPMODE@ CXXFLAGS = @CXXFLAGS@ CYGPATH_W = @CYGPATH_W@ DEFS = @DEFS@ DEPDIR = @DEPDIR@ DLLTOOL = @DLLTOOL@ DSYMUTIL = @DSYMUTIL@ DUMPBIN = @DUMPBIN@ ECHO_C = @ECHO_C@ ECHO_N = @ECHO_N@ ECHO_T = @ECHO_T@ EGREP = @EGREP@ ERL = @ERL@ ERLANG_FLAGS = @ERLANG_FLAGS@ ERLC = @ERLC@ ERLC_FLAGS = @ERLC_FLAGS@ ESCRIPT = @ESCRIPT@ EXEEXT = @EXEEXT@ FGREP = @FGREP@ FLAGS = @FLAGS@ GREP = @GREP@ HAS_HELP2MAN = @HAS_HELP2MAN@ HAS_INSTALLINFO = @HAS_INSTALLINFO@ HAS_MAKEINFO = @HAS_MAKEINFO@ HAS_PDFLATEX = @HAS_PDFLATEX@ HAS_SPHINX_BUILD = @HAS_SPHINX_BUILD@ ICU_BIN = @ICU_BIN@ ICU_CFLAGS = @ICU_CFLAGS@ ICU_CONFIG = @ICU_CONFIG@ ICU_CPPFLAGS = @ICU_CPPFLAGS@ ICU_CXXFLAGS = @ICU_CXXFLAGS@ ICU_LIBS = @ICU_LIBS@ INNO_COMPILER_EXECUTABLE = @INNO_COMPILER_EXECUTABLE@ INSTALL = @INSTALL@ INSTALL_DATA = @INSTALL_DATA@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ INSTALL_SCRIPT = @INSTALL_SCRIPT@ INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ JS_CFLAGS = @JS_CFLAGS@ JS_LIBS = @JS_LIBS@ JS_LIB_BINARY = @JS_LIB_BINARY@ LD = @LD@ LDFLAGS = @LDFLAGS@ LIBOBJS = @LIBOBJS@ LIBS = @LIBS@ LIBTOOL = @LIBTOOL@ LIPO = @LIPO@ LN_S = @LN_S@ LTLIBOBJS = @LTLIBOBJS@ MAKEINFO = @MAKEINFO@ MANIFEST_TOOL = @MANIFEST_TOOL@ MKDIR_P = @MKDIR_P@ NM = @NM@ NMEDIT = @NMEDIT@ OBJDUMP = @OBJDUMP@ OBJEXT = @OBJEXT@ OTOOL = @OTOOL@ OTOOL64 = @OTOOL64@ PACKAGE = @PACKAGE@ PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ PACKAGE_NAME = @PACKAGE_NAME@ PACKAGE_STRING = @PACKAGE_STRING@ PACKAGE_TARNAME = @PACKAGE_TARNAME@ PACKAGE_URL = @PACKAGE_URL@ PACKAGE_VERSION = @PACKAGE_VERSION@ PATH_SEPARATOR = @PATH_SEPARATOR@ PKG_CONFIG = @PKG_CONFIG@ PKG_CONFIG_LIBDIR = @PKG_CONFIG_LIBDIR@ PKG_CONFIG_PATH = @PKG_CONFIG_PATH@ RANLIB = @RANLIB@ SED = @SED@ SET_MAKE = @SET_MAKE@ SHELL = @SHELL@ SNAPPY_MAJOR = @SNAPPY_MAJOR@ SNAPPY_MINOR = @SNAPPY_MINOR@ SNAPPY_PATCHLEVEL = @SNAPPY_PATCHLEVEL@ STRIP = @STRIP@ VERSION = @VERSION@ 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@ ac_cv_have_stddef_h = @ac_cv_have_stddef_h@ ac_cv_have_stdint_h = @ac_cv_have_stdint_h@ am__include = @am__include@ am__leading_dot = @am__leading_dot@ am__quote = @am__quote@ am__tar = @am__tar@ am__untar = @am__untar@ bindir = @bindir@ bug_uri = @bug_uri@ 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@ dvidir = @dvidir@ erlangbin = @erlangbin@ erlangversion = @erlangversion@ exec_prefix = @exec_prefix@ host = @host@ host_alias = @host_alias@ host_cpu = @host_cpu@ host_os = @host_os@ host_vendor = @host_vendor@ htmldir = @htmldir@ includedir = @includedir@ infodir = @infodir@ initdir = @initdir@ install_sh = @install_sh@ launchddir = @launchddir@ libdir = @libdir@ libexecdir = @libexecdir@ localconfdir = @localconfdir@ localdatadir = @localdatadir@ localdocdir = @localdocdir@ localedir = @localedir@ localerlanglibdir = @localerlanglibdir@ locallibbindir = @locallibbindir@ locallibdir = @locallibdir@ localstatedir = @localstatedir@ localstatelibdir = @localstatelibdir@ localstatelogdir = @localstatelogdir@ localstaterundir = @localstaterundir@ mandir = @mandir@ mkdir_p = @mkdir_p@ msvc_redist_dir = @msvc_redist_dir@ msvc_redist_name = @msvc_redist_name@ oldincludedir = @oldincludedir@ openssl_bin_dir = @openssl_bin_dir@ otp_release = @otp_release@ package_author_address = @package_author_address@ package_author_name = @package_author_name@ package_identifier = @package_identifier@ package_name = @package_name@ package_tarname = @package_tarname@ 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@ version = @version@ version_major = @version_major@ version_minor = @version_minor@ version_release = @version_release@ version_revision = @version_revision@ version_stage = @version_stage@ SUBDIRS = priv # devdocdir = $(localdocdir)/developer/couchdb couchlibdir = $(localerlanglibdir)/couch-$(version) couchincludedir = $(couchlibdir)/include couchebindir = $(couchlibdir)/ebin couchinclude_DATA = couch_db.hrl couch_js_functions.hrl couchebin_DATA = $(compiled_files) # dist_devdoc_DATA = $(doc_base) $(doc_modules) CLEANFILES = $(compiled_files) $(doc_base) # CLEANFILES = $(doc_modules) edoc-info source_files = \ couch.erl \ couch_app.erl \ couch_auth_cache.erl \ couch_btree.erl \ couch_changes.erl \ couch_compaction_daemon.erl \ couch_compress.erl \ couch_config.erl \ couch_config_writer.erl \ couch_db.erl \ couch_db_update_notifier.erl \ couch_db_update_notifier_sup.erl \ couch_doc.erl \ couch_drv.erl \ couch_ejson_compare.erl \ couch_event_sup.erl \ couch_external_manager.erl \ couch_external_server.erl \ couch_file.erl \ couch_httpd.erl \ couch_httpd_db.erl \ couch_httpd_auth.erl \ couch_httpd_cors.erl \ couch_httpd_oauth.erl \ couch_httpd_external.erl \ couch_httpd_misc_handlers.erl \ couch_httpd_proxy.erl \ couch_httpd_rewrite.erl \ couch_httpd_stats_handlers.erl \ couch_httpd_vhost.erl \ couch_key_tree.erl \ couch_log.erl \ couch_native_process.erl \ couch_os_daemons.erl \ couch_os_process.erl \ couch_passwords.erl \ couch_primary_sup.erl \ couch_query_servers.erl \ couch_ref_counter.erl \ couch_secondary_sup.erl \ couch_server.erl \ couch_server_sup.erl \ couch_stats_aggregator.erl \ couch_stats_collector.erl \ couch_stream.erl \ couch_task_status.erl \ couch_users_db.erl \ couch_util.erl \ couch_uuids.erl \ couch_db_updater.erl \ couch_work_queue.erl \ json_stream_parse.erl EXTRA_DIST = $(source_files) couch_db.hrl couch_js_functions.hrl compiled_files = \ couch.app \ couch.beam \ couch_app.beam \ couch_auth_cache.beam \ couch_btree.beam \ couch_changes.beam \ couch_compaction_daemon.beam \ couch_compress.beam \ couch_config.beam \ couch_config_writer.beam \ couch_db.beam \ couch_db_update_notifier.beam \ couch_db_update_notifier_sup.beam \ couch_doc.beam \ couch_drv.beam \ couch_ejson_compare.beam \ couch_event_sup.beam \ couch_external_manager.beam \ couch_external_server.beam \ couch_file.beam \ couch_httpd.beam \ couch_httpd_db.beam \ couch_httpd_auth.beam \ couch_httpd_oauth.beam \ couch_httpd_cors.beam \ couch_httpd_proxy.beam \ couch_httpd_external.beam \ couch_httpd_misc_handlers.beam \ couch_httpd_rewrite.beam \ couch_httpd_stats_handlers.beam \ couch_httpd_vhost.beam \ couch_key_tree.beam \ couch_log.beam \ couch_native_process.beam \ couch_os_daemons.beam \ couch_os_process.beam \ couch_passwords.beam \ couch_primary_sup.beam \ couch_query_servers.beam \ couch_ref_counter.beam \ couch_secondary_sup.beam \ couch_server.beam \ couch_server_sup.beam \ couch_stats_aggregator.beam \ couch_stats_collector.beam \ couch_stream.beam \ couch_task_status.beam \ couch_users_db.beam \ couch_util.beam \ couch_uuids.beam \ couch_db_updater.beam \ couch_work_queue.beam \ json_stream_parse.beam 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) --foreign src/couchdb/Makefile'; \ $(am__cd) $(top_srcdir) && \ $(AUTOMAKE) --foreign src/couchdb/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): couch.app.tpl: $(top_builddir)/config.status $(srcdir)/couch.app.tpl.in cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ mostlyclean-libtool: -rm -f *.lo clean-libtool: -rm -rf .libs _libs install-couchebinDATA: $(couchebin_DATA) @$(NORMAL_INSTALL) @list='$(couchebin_DATA)'; test -n "$(couchebindir)" || list=; \ if test -n "$$list"; then \ echo " $(MKDIR_P) '$(DESTDIR)$(couchebindir)'"; \ $(MKDIR_P) "$(DESTDIR)$(couchebindir)" || 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)$(couchebindir)'"; \ $(INSTALL_DATA) $$files "$(DESTDIR)$(couchebindir)" || exit $$?; \ done uninstall-couchebinDATA: @$(NORMAL_UNINSTALL) @list='$(couchebin_DATA)'; test -n "$(couchebindir)" || list=; \ files=`for p in $$list; do echo $$p; done | sed -e 's|^.*/||'`; \ dir='$(DESTDIR)$(couchebindir)'; $(am__uninstall_files_from_dir) install-couchincludeDATA: $(couchinclude_DATA) @$(NORMAL_INSTALL) @list='$(couchinclude_DATA)'; test -n "$(couchincludedir)" || list=; \ if test -n "$$list"; then \ echo " $(MKDIR_P) '$(DESTDIR)$(couchincludedir)'"; \ $(MKDIR_P) "$(DESTDIR)$(couchincludedir)" || 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)$(couchincludedir)'"; \ $(INSTALL_DATA) $$files "$(DESTDIR)$(couchincludedir)" || exit $$?; \ done uninstall-couchincludeDATA: @$(NORMAL_UNINSTALL) @list='$(couchinclude_DATA)'; test -n "$(couchincludedir)" || list=; \ files=`for p in $$list; do echo $$p; done | sed -e 's|^.*/||'`; \ dir='$(DESTDIR)$(couchincludedir)'; $(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. $(RECURSIVE_TARGETS): @fail= failcom='exit 1'; \ for f in x $$MAKEFLAGS; do \ case $$f in \ *=* | --[!k]*);; \ *k*) failcom='fail=yes';; \ esac; \ done; \ dot_seen=no; \ target=`echo $@ | sed s/-recursive//`; \ list='$(SUBDIRS)'; for subdir in $$list; do \ echo "Making $$target in $$subdir"; \ if test "$$subdir" = "."; then \ dot_seen=yes; \ local_target="$$target-am"; \ else \ local_target="$$target"; \ fi; \ ($(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" $(RECURSIVE_CLEAN_TARGETS): @fail= failcom='exit 1'; \ for f in x $$MAKEFLAGS; do \ case $$f in \ *=* | --[!k]*);; \ *k*) failcom='fail=yes';; \ esac; \ done; \ dot_seen=no; \ case "$@" in \ distclean-* | maintainer-clean-*) list='$(DIST_SUBDIRS)' ;; \ *) list='$(SUBDIRS)' ;; \ esac; \ rev=''; for subdir in $$list; do \ if test "$$subdir" = "."; then :; else \ rev="$$subdir $$rev"; \ fi; \ done; \ rev="$$rev ."; \ target=`echo $@ | sed s/-recursive//`; \ for subdir in $$rev; do \ echo "Making $$target in $$subdir"; \ if test "$$subdir" = "."; then \ local_target="$$target-am"; \ else \ local_target="$$target"; \ fi; \ ($(am__cd) $$subdir && $(MAKE) $(AM_MAKEFLAGS) $$local_target) \ || eval $$failcom; \ done && test -z "$$fail" tags-recursive: list='$(SUBDIRS)'; for subdir in $$list; do \ test "$$subdir" = . || ($(am__cd) $$subdir && $(MAKE) $(AM_MAKEFLAGS) tags); \ done ctags-recursive: list='$(SUBDIRS)'; for subdir in $$list; do \ test "$$subdir" = . || ($(am__cd) $$subdir && $(MAKE) $(AM_MAKEFLAGS) ctags); \ done ID: $(HEADERS) $(SOURCES) $(LISP) $(TAGS_FILES) list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | \ $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ END { if (nonempty) { for (i in files) print i; }; }'`; \ mkid -fID $$unique tags: TAGS TAGS: tags-recursive $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ $(TAGS_FILES) $(LISP) 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; \ list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | \ $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ END { if (nonempty) { for (i in files) print i; }; }'`; \ 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 CTAGS: ctags-recursive $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ $(TAGS_FILES) $(LISP) list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | \ $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ END { if (nonempty) { for (i in files) print i; }; }'`; \ 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" 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 $(DATA) installdirs: installdirs-recursive installdirs-am: for dir in "$(DESTDIR)$(couchebindir)" "$(DESTDIR)$(couchincludedir)"; 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: -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-couchebinDATA install-couchincludeDATA 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-couchebinDATA uninstall-couchincludeDATA .MAKE: $(RECURSIVE_CLEAN_TARGETS) $(RECURSIVE_TARGETS) ctags-recursive \ install-am install-strip tags-recursive .PHONY: $(RECURSIVE_CLEAN_TARGETS) $(RECURSIVE_TARGETS) CTAGS GTAGS \ all all-am check check-am clean clean-generic clean-libtool \ ctags ctags-recursive distclean distclean-generic \ distclean-libtool distclean-tags distdir dvi dvi-am html \ html-am info info-am install install-am install-couchebinDATA \ install-couchincludeDATA 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-recursive \ uninstall uninstall-am uninstall-couchebinDATA \ uninstall-couchincludeDATA # doc_base = \ # erlang.png \ # index.html \ # modules-frame.html \ # overview-summary.html \ # packages-frame.html \ # stylesheet.css # doc_modules = \ # couch_btree.html \ # couch_config.html \ # couch_config_writer.html \ # couch_db.html \ # couch_db_update_notifier.html \ # couch_db_update_notifier_sup.html \ # couch_doc.html \ # couch_event_sup.html \ # couch_file.html \ # couch_httpd.html \ # couch_key_tree.html \ # couch_log.html \ # couch_query_servers.html \ # couch_rep.html \ # couch_rep_sup.html \ # couch_server.html \ # couch_server_sup.html \ # couch_stream.html \ # couch_util.html @WINDOWS_TRUE@couch.app: couch.app.tpl @WINDOWS_TRUE@ modules=`find . -name "*.erl" \! -name ".*" -exec basename {} .erl \; | tr '\n' ',' | sed "s/,$$//"`; \ @WINDOWS_TRUE@ sed -e "s|%package_name%|@package_name@|g" \ @WINDOWS_TRUE@ -e "s|%version%|@version@|g" \ @WINDOWS_TRUE@ -e "s|@modules@|$$modules|g" \ @WINDOWS_TRUE@ -e "s|%localconfdir%|../etc/couchdb|g" \ @WINDOWS_TRUE@ -e "s|@defaultini@|default.ini|g" \ @WINDOWS_TRUE@ -e "s|@localini@|local.ini|g" > \ @WINDOWS_TRUE@ $@ < $< @WINDOWS_FALSE@couch.app: couch.app.tpl @WINDOWS_FALSE@ modules=`{ find . -name "*.erl" \! -name ".*" -exec basename {} .erl \; | tr '\n' ','; echo ''; } | sed "s/,$$//"`; \ @WINDOWS_FALSE@ sed -e "s|%package_name%|@package_name@|g" \ @WINDOWS_FALSE@ -e "s|%version%|@version@|g" \ @WINDOWS_FALSE@ -e "s|@modules@|$$modules|g" \ @WINDOWS_FALSE@ -e "s|%localconfdir%|@localconfdir@|g" \ @WINDOWS_FALSE@ -e "s|@defaultini@|default.ini|g" \ @WINDOWS_FALSE@ -e "s|@localini@|local.ini|g" > \ @WINDOWS_FALSE@ $@ < $< @WINDOWS_FALSE@ chmod +x $@ # $(dist_devdoc_DATA): edoc-info # $(ERL) -noshell -run edoc_run files [\"$<\"] %.beam: %.erl couch_db.hrl couch_js_functions.hrl $(ERLC) $(ERLC_FLAGS) ${TEST} $<; # 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: apache-couchdb-1.6.0/src/couchdb/couch_os_daemons.erl0000644000175000001440000003266612332105522022545 0ustar00djcusers00000000000000% Licensed under the Apache License, Version 2.0 (the "License"); you may not % use this file except in compliance with the License. You may obtain a copy of % the License at % % http://www.apache.org/licenses/LICENSE-2.0 % % Unless required by applicable law or agreed to in writing, software % distributed under the License is distributed on an "AS IS" BASIS, WITHOUT % WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the % License for the specific language governing permissions and limitations under % the License. -module(couch_os_daemons). -behaviour(gen_server). -export([start_link/0, info/0, info/1, config_change/2]). -export([init/1, terminate/2, code_change/3]). -export([handle_call/3, handle_cast/2, handle_info/2]). -include("couch_db.hrl"). -record(daemon, { port, name, cmd, kill, status=running, cfg_patterns=[], errors=[], buf=[] }). -define(PORT_OPTIONS, [stream, {line, 1024}, binary, exit_status, hide]). -define(TIMEOUT, 5000). start_link() -> gen_server:start_link({local, ?MODULE}, ?MODULE, [], []). info() -> info([]). info(Options) -> gen_server:call(?MODULE, {daemon_info, Options}). config_change(Section, Key) -> gen_server:cast(?MODULE, {config_change, Section, Key}). init(_) -> process_flag(trap_exit, true), ok = couch_config:register(fun ?MODULE:config_change/2), Table = ets:new(?MODULE, [protected, set, {keypos, #daemon.port}]), reload_daemons(Table), {ok, Table}. terminate(_Reason, Table) -> [stop_port(D) || D <- ets:tab2list(Table)], ok. handle_call({daemon_info, Options}, _From, Table) when is_list(Options) -> case lists:member(table, Options) of true -> {reply, {ok, ets:tab2list(Table)}, Table}; _ -> {reply, {ok, Table}, Table} end; handle_call(Msg, From, Table) -> ?LOG_ERROR("Unknown call message to ~p from ~p: ~p", [?MODULE, From, Msg]), {stop, error, Table}. handle_cast({config_change, Sect, Key}, Table) -> restart_daemons(Table, Sect, Key), case Sect of "os_daemons" -> reload_daemons(Table); _ -> ok end, {noreply, Table}; handle_cast(stop, Table) -> {stop, normal, Table}; handle_cast(Msg, Table) -> ?LOG_ERROR("Unknown cast message to ~p: ~p", [?MODULE, Msg]), {stop, error, Table}. handle_info({'EXIT', Port, Reason}, Table) -> case ets:lookup(Table, Port) of [] -> ?LOG_INFO("Port ~p exited after stopping: ~p~n", [Port, Reason]); [#daemon{status=stopping}] -> true = ets:delete(Table, Port); [#daemon{name=Name, status=restarting}=D] -> ?LOG_INFO("Daemon ~P restarting after config change.", [Name]), true = ets:delete(Table, Port), {ok, Port2} = start_port(D#daemon.cmd), true = ets:insert(Table, D#daemon{ port=Port2, status=running, kill=undefined, buf=[] }); [#daemon{name=Name, status=halted}] -> ?LOG_ERROR("Halted daemon process: ~p", [Name]); [D] -> ?LOG_ERROR("Invalid port state at exit: ~p", [D]) end, {noreply, Table}; handle_info({Port, closed}, Table) -> handle_info({Port, {exit_status, closed}}, Table); handle_info({Port, {exit_status, Status}}, Table) -> case ets:lookup(Table, Port) of [] -> ?LOG_ERROR("Unknown port ~p exiting ~p", [Port, Status]), {stop, {error, unknown_port_died, Status}, Table}; [#daemon{name=Name, status=restarting}=D] -> ?LOG_INFO("Daemon ~P restarting after config change.", [Name]), true = ets:delete(Table, Port), {ok, Port2} = start_port(D#daemon.cmd), true = ets:insert(Table, D#daemon{ port=Port2, status=running, kill=undefined, buf=[] }), {noreply, Table}; [#daemon{status=stopping}=D] -> % The configuration changed and this daemon is no % longer needed. ?LOG_DEBUG("Port ~p shut down.", [D#daemon.name]), true = ets:delete(Table, Port), {noreply, Table}; [D] -> % Port died for unknown reason. Check to see if it's % died too many times or if we should boot it back up. case should_halt([now() | D#daemon.errors]) of {true, _} -> % Halting the process. We won't try and reboot % until the configuration changes. Fmt = "Daemon ~p halted with exit_status ~p", ?LOG_ERROR(Fmt, [D#daemon.name, Status]), D2 = D#daemon{status=halted, errors=nil, buf=nil}, true = ets:insert(Table, D2), {noreply, Table}; {false, Errors} -> % We're guessing it was a random error, this daemon % has behaved so we'll give it another chance. Fmt = "Daemon ~p is being rebooted after exit_status ~p", ?LOG_INFO(Fmt, [D#daemon.name, Status]), true = ets:delete(Table, Port), {ok, Port2} = start_port(D#daemon.cmd), true = ets:insert(Table, D#daemon{ port=Port2, status=running, kill=undefined, errors=Errors, buf=[] }), {noreply, Table} end; _Else -> throw(error) end; handle_info({Port, {data, {noeol, Data}}}, Table) -> [#daemon{buf=Buf}=D] = ets:lookup(Table, Port), true = ets:insert(Table, D#daemon{buf=[Data | Buf]}), {noreply, Table}; handle_info({Port, {data, {eol, Data}}}, Table) -> [#daemon{buf=Buf}=D] = ets:lookup(Table, Port), Line = lists:reverse(Buf, Data), % The first line echoed back is the kill command % for when we go to get rid of the port. Lines after % that are considered part of the stdio API. case D#daemon.kill of undefined -> true = ets:insert(Table, D#daemon{kill=?b2l(Line), buf=[]}); _Else -> D2 = case (catch ?JSON_DECODE(Line)) of {invalid_json, Rejected} -> ?LOG_ERROR("Ignoring OS daemon request: ~p", [Rejected]), D; JSON -> {ok, D3} = handle_port_message(D, JSON), D3 end, true = ets:insert(Table, D2#daemon{buf=[]}) end, {noreply, Table}; handle_info({Port, Error}, Table) -> ?LOG_ERROR("Unexpectd message from port ~p: ~p", [Port, Error]), stop_port(Port), [D] = ets:lookup(Table, Port), true = ets:insert(Table, D#daemon{status=restarting, buf=nil}), {noreply, Table}; handle_info(Msg, Table) -> ?LOG_ERROR("Unexpected info message to ~p: ~p", [?MODULE, Msg]), {stop, error, Table}. code_change(_OldVsn, State, _Extra) -> {ok, State}. % Internal API % % Port management helpers % start_port(Command) -> start_port(Command, []). start_port(Command, EnvPairs) -> PrivDir = couch_util:priv_dir(), Spawnkiller = filename:join(PrivDir, "couchspawnkillable"), Opts = case lists:keytake(env, 1, ?PORT_OPTIONS) of false -> ?PORT_OPTIONS ++ [ {env,EnvPairs} ]; {value, {env,OldPairs}, SubOpts} -> AllPairs = lists:keymerge(1, EnvPairs, OldPairs), SubOpts ++ [ {env,AllPairs} ] end, Port = open_port({spawn, Spawnkiller ++ " " ++ Command}, Opts), {ok, Port}. stop_port(#daemon{port=Port, kill=undefined}=D) -> ?LOG_ERROR("Stopping daemon without a kill command: ~p", [D#daemon.name]), catch port_close(Port); stop_port(#daemon{port=Port}=D) -> ?LOG_DEBUG("Stopping daemon: ~p", [D#daemon.name]), os:cmd(D#daemon.kill), catch port_close(Port). handle_port_message(#daemon{port=Port}=Daemon, [<<"get">>, Section]) -> KVs = couch_config:get(Section), Data = lists:map(fun({K, V}) -> {?l2b(K), ?l2b(V)} end, KVs), Json = iolist_to_binary(?JSON_ENCODE({Data})), port_command(Port, <>), {ok, Daemon}; handle_port_message(#daemon{port=Port}=Daemon, [<<"get">>, Section, Key]) -> Value = case couch_config:get(Section, Key, null) of null -> null; String -> ?l2b(String) end, Json = iolist_to_binary(?JSON_ENCODE(Value)), port_command(Port, <>), {ok, Daemon}; handle_port_message(Daemon, [<<"register">>, Sec]) when is_binary(Sec) -> Patterns = lists:usort(Daemon#daemon.cfg_patterns ++ [{?b2l(Sec)}]), {ok, Daemon#daemon{cfg_patterns=Patterns}}; handle_port_message(Daemon, [<<"register">>, Sec, Key]) when is_binary(Sec) andalso is_binary(Key) -> Pattern = {?b2l(Sec), ?b2l(Key)}, Patterns = lists:usort(Daemon#daemon.cfg_patterns ++ [Pattern]), {ok, Daemon#daemon{cfg_patterns=Patterns}}; handle_port_message(#daemon{name=Name}=Daemon, [<<"log">>, Msg]) -> handle_log_message(Name, Msg, <<"info">>), {ok, Daemon}; handle_port_message(#daemon{name=Name}=Daemon, [<<"log">>, Msg, {Opts}]) -> Level = couch_util:get_value(<<"level">>, Opts, <<"info">>), handle_log_message(Name, Msg, Level), {ok, Daemon}; handle_port_message(#daemon{name=Name}=Daemon, Else) -> ?LOG_ERROR("Daemon ~p made invalid request: ~p", [Name, Else]), {ok, Daemon}. handle_log_message(Name, Msg, _Level) when not is_binary(Msg) -> ?LOG_ERROR("Invalid log message from daemon ~p: ~p", [Name, Msg]); handle_log_message(Name, Msg, <<"debug">>) -> ?LOG_DEBUG("Daemon ~p :: ~s", [Name, ?b2l(Msg)]); handle_log_message(Name, Msg, <<"info">>) -> ?LOG_INFO("Daemon ~p :: ~s", [Name, ?b2l(Msg)]); handle_log_message(Name, Msg, <<"error">>) -> ?LOG_ERROR("Daemon: ~p :: ~s", [Name, ?b2l(Msg)]); handle_log_message(Name, Msg, Level) -> ?LOG_ERROR("Invalid log level from daemon: ~p", [Level]), ?LOG_INFO("Daemon: ~p :: ~s", [Name, ?b2l(Msg)]). % % Daemon management helpers % reload_daemons(Table) -> % List of daemons we want to have running. Configured = lists:sort(couch_config:get("os_daemons")), % Remove records for daemons that were halted. MSpecHalted = #daemon{name='$1', cmd='$2', status=halted, _='_'}, Halted = lists:sort([{N, C} || [N, C] <- ets:match(Table, MSpecHalted)]), ok = stop_os_daemons(Table, find_to_stop(Configured, Halted, [])), % Stop daemons that are running % Start newly configured daemons MSpecRunning = #daemon{name='$1', cmd='$2', status=running, _='_'}, Running = lists:sort([{N, C} || [N, C] <- ets:match(Table, MSpecRunning)]), ok = stop_os_daemons(Table, find_to_stop(Configured, Running, [])), ok = boot_os_daemons(Table, find_to_boot(Configured, Running, [])), ok. restart_daemons(Table, Sect, Key) -> restart_daemons(Table, Sect, Key, ets:first(Table)). restart_daemons(_, _, _, '$end_of_table') -> ok; restart_daemons(Table, Sect, Key, Port) -> [D] = ets:lookup(Table, Port), HasSect = lists:member({Sect}, D#daemon.cfg_patterns), HasKey = lists:member({Sect, Key}, D#daemon.cfg_patterns), case HasSect or HasKey of true -> stop_port(D), D2 = D#daemon{status=restarting, buf=nil}, true = ets:insert(Table, D2); _ -> ok end, restart_daemons(Table, Sect, Key, ets:next(Table, Port)). stop_os_daemons(_Table, []) -> ok; stop_os_daemons(Table, [{Name, Cmd} | Rest]) -> [[Port]] = ets:match(Table, #daemon{port='$1', name=Name, cmd=Cmd, _='_'}), [D] = ets:lookup(Table, Port), case D#daemon.status of halted -> ets:delete(Table, Port); _ -> stop_port(D), D2 = D#daemon{status=stopping, errors=nil, buf=nil}, true = ets:insert(Table, D2) end, stop_os_daemons(Table, Rest). boot_os_daemons(_Table, []) -> ok; boot_os_daemons(Table, [{Name, Cmd} | Rest]) -> {ok, Port} = start_port(Cmd), true = ets:insert(Table, #daemon{port=Port, name=Name, cmd=Cmd}), boot_os_daemons(Table, Rest). % Elements unique to the configured set need to be booted. find_to_boot([], _Rest, Acc) -> % Nothing else configured. Acc; find_to_boot([D | R1], [D | R2], Acc) -> % Elements are equal, daemon already running. find_to_boot(R1, R2, Acc); find_to_boot([D1 | R1], [D2 | _]=A2, Acc) when D1 < D2 -> find_to_boot(R1, A2, [D1 | Acc]); find_to_boot(A1, [_ | R2], Acc) -> find_to_boot(A1, R2, Acc); find_to_boot(Rest, [], Acc) -> % No more candidates for already running. Boot all. Rest ++ Acc. % Elements unique to the running set need to be killed. find_to_stop([], Rest, Acc) -> % The rest haven't been found, so they must all % be ready to die. Rest ++ Acc; find_to_stop([D | R1], [D | R2], Acc) -> % Elements are equal, daemon already running. find_to_stop(R1, R2, Acc); find_to_stop([D1 | R1], [D2 | _]=A2, Acc) when D1 < D2 -> find_to_stop(R1, A2, Acc); find_to_stop(A1, [D2 | R2], Acc) -> find_to_stop(A1, R2, [D2 | Acc]); find_to_stop(_, [], Acc) -> % No more running daemons to worry about. Acc. should_halt(Errors) -> RetryTimeCfg = couch_config:get("os_daemon_settings", "retry_time", "5"), RetryTime = list_to_integer(RetryTimeCfg), Now = now(), RecentErrors = lists:filter(fun(Time) -> timer:now_diff(Now, Time) =< RetryTime * 1000000 end, Errors), RetryCfg = couch_config:get("os_daemon_settings", "max_retries", "3"), Retries = list_to_integer(RetryCfg), {length(RecentErrors) >= Retries, RecentErrors}. apache-couchdb-1.6.0/src/couchdb/couch_db_update_notifier.erl0000644000175000001440000000510512332105522024230 0ustar00djcusers00000000000000% Licensed under the Apache License, Version 2.0 (the "License"); you may not % use this file except in compliance with the License. You may obtain a copy of % the License at % % http://www.apache.org/licenses/LICENSE-2.0 % % Unless required by applicable law or agreed to in writing, software % distributed under the License is distributed on an "AS IS" BASIS, WITHOUT % WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the % License for the specific language governing permissions and limitations under % the License. % % This causes an OS process to spawned and it is notified every time a database % is updated. % % The notifications are in the form of a the database name sent as a line of % text to the OS processes stdout. % -module(couch_db_update_notifier). -behaviour(gen_event). -export([start_link/1, notify/1]). -export([init/1, terminate/2, handle_event/2, handle_call/2, handle_info/2, code_change/3,stop/1]). -include("couch_db.hrl"). start_link(Exec) -> couch_event_sup:start_link(couch_db_update, {couch_db_update_notifier, make_ref()}, Exec). notify(Event) -> gen_event:notify(couch_db_update, Event). stop(Pid) -> couch_event_sup:stop(Pid). init(Exec) when is_list(Exec) -> % an exe couch_os_process:start_link(Exec, []); init(Else) -> {ok, Else}. terminate(_Reason, Pid) when is_pid(Pid) -> couch_os_process:stop(Pid), ok; terminate(_Reason, _State) -> ok. handle_event(Event, Fun) when is_function(Fun, 1) -> Fun(Event), {ok, Fun}; handle_event(Event, {Fun, FunAcc}) -> FunAcc2 = Fun(Event, FunAcc), {ok, {Fun, FunAcc2}}; handle_event({EventType, EventDesc}, Pid) -> Obj = encode_event(EventType, EventDesc), ok = couch_os_process:send(Pid, Obj), {ok, Pid}. handle_call(_Request, State) -> {reply, ok, State}. handle_info({'EXIT', Pid, Reason}, Pid) -> ?LOG_ERROR("Update notification process ~p died: ~p", [Pid, Reason]), remove_handler; handle_info({'EXIT', _, _}, Pid) -> %% the db_update event manager traps exits and forwards this message to all %% its handlers. Just ignore as it wasn't our os_process that exited. {ok, Pid}. code_change(_OldVsn, State, _Extra) -> {ok, State}. encode_event(EventType, EventDesc) when is_atom(EventType) -> encode_event(atom_to_list(EventType), EventDesc); encode_event(EventType, EventDesc) when is_list(EventType) -> encode_event(?l2b(EventType), EventDesc); encode_event(EventType, {DbName, DocId}) -> {[{type, EventType}, {db, DbName}, {id, DocId}]}; encode_event(EventType, DbName) -> {[{type, EventType}, {db, DbName}]}. apache-couchdb-1.6.0/src/couchdb/couch_httpd_rewrite.erl0000644000175000001440000004152312332105522023272 0ustar00djcusers00000000000000% Licensed under the Apache License, Version 2.0 (the "License"); you may not % use this file except in compliance with the License. You may obtain a copy of % the License at % % http://www.apache.org/licenses/LICENSE-2.0 % % Unless required by applicable law or agreed to in writing, software % distributed under the License is distributed on an "AS IS" BASIS, WITHOUT % WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the % License for the specific language governing permissions and limitations under % the License. % % bind_path is based on bind method from Webmachine %% @doc Module for URL rewriting by pattern matching. -module(couch_httpd_rewrite). -export([handle_rewrite_req/3]). -include("couch_db.hrl"). -define(SEPARATOR, $\/). -define(MATCH_ALL, {bind, <<"*">>}). %% doc The http rewrite handler. All rewriting is done from %% /dbname/_design/ddocname/_rewrite by default. %% %% each rules should be in rewrites member of the design doc. %% Ex of a complete rule : %% %% { %% .... %% "rewrites": [ %% { %% "from": "", %% "to": "index.html", %% "method": "GET", %% "query": {} %% } %% ] %% } %% %% from: is the path rule used to bind current uri to the rule. It %% use pattern matching for that. %% %% to: rule to rewrite an url. It can contain variables depending on binding %% variables discovered during pattern matching and query args (url args and from %% the query member.) %% %% method: method to bind the request method to the rule. by default "*" %% query: query args you want to define they can contain dynamic variable %% by binding the key to the bindings %% %% %% to and from are path with patterns. pattern can be string starting with ":" or %% "*". ex: %% /somepath/:var/* %% %% This path is converted in erlang list by splitting "/". Each var are %% converted in atom. "*" is converted to '*' atom. The pattern matching is done %% by splitting "/" in request url in a list of token. A string pattern will %% match equal token. The star atom ('*' in single quotes) will match any number %% of tokens, but may only be present as the last pathtern in a pathspec. If all %% tokens are matched and all pathterms are used, then the pathspec matches. It works %% like webmachine. Each identified token will be reused in to rule and in query %% %% The pattern matching is done by first matching the request method to a rule. by %% default all methods match a rule. (method is equal to "*" by default). Then %% It will try to match the path to one rule. If no rule match, then a 404 error %% is displayed. %% %% Once a rule is found we rewrite the request url using the "to" and %% "query" members. The identified token are matched to the rule and %% will replace var. if '*' is found in the rule it will contain the remaining %% part if it exists. %% %% Examples: %% %% Dispatch rule URL TO Tokens %% %% {"from": "/a/b", /a/b?k=v /some/b?k=v var =:= b %% "to": "/some/"} k = v %% %% {"from": "/a/b", /a/b /some/b?var=b var =:= b %% "to": "/some/:var"} %% %% {"from": "/a", /a /some %% "to": "/some/*"} %% %% {"from": "/a/*", /a/b/c /some/b/c %% "to": "/some/*"} %% %% {"from": "/a", /a /some %% "to": "/some/*"} %% %% {"from": "/a/:foo/*", /a/b/c /some/b/c?foo=b foo =:= b %% "to": "/some/:foo/*"} %% %% {"from": "/a/:foo", /a/b /some/?k=b&foo=b foo =:= b %% "to": "/some", %% "query": { %% "k": ":foo" %% }} %% %% {"from": "/a", /a?foo=b /some/b foo =:= b %% "to": "/some/:foo", %% }} handle_rewrite_req(#httpd{ path_parts=[DbName, <<"_design">>, DesignName, _Rewrite|PathParts], method=Method, mochi_req=MochiReq}=Req, _Db, DDoc) -> % we are in a design handler DesignId = <<"_design/", DesignName/binary>>, Prefix = <<"/", (?l2b(couch_util:url_encode(DbName)))/binary, "/", DesignId/binary>>, QueryList = lists:map(fun decode_query_value/1, couch_httpd:qs(Req)), RewritesSoFar = erlang:get(?REWRITE_COUNT), MaxRewrites = list_to_integer(couch_config:get("httpd", "rewrite_limit", "100")), case RewritesSoFar >= MaxRewrites of true -> throw({bad_request, <<"Exceeded rewrite recursion limit">>}); false -> erlang:put(?REWRITE_COUNT, RewritesSoFar + 1) end, #doc{body={Props}} = DDoc, % get rules from ddoc case couch_util:get_value(<<"rewrites">>, Props) of undefined -> couch_httpd:send_error(Req, 404, <<"rewrite_error">>, <<"Invalid path.">>); Bin when is_binary(Bin) -> couch_httpd:send_error(Req, 400, <<"rewrite_error">>, <<"Rewrite rules are a String. They must be a JSON Array.">>); Rules -> % create dispatch list from rules DispatchList = [make_rule(Rule) || {Rule} <- Rules], Method1 = couch_util:to_binary(Method), % get raw path by matching url to a rule. Throws not_found. {NewPathParts0, Bindings0} = try_bind_path(DispatchList, Method1, PathParts, QueryList), NewPathParts = [quote_plus(X) || X <- NewPathParts0], Bindings = maybe_encode_bindings(Bindings0), Path0 = string:join(NewPathParts, [?SEPARATOR]), % if path is relative detect it and rewrite path Path1 = case mochiweb_util:safe_relative_path(Path0) of undefined -> ?b2l(Prefix) ++ "/" ++ Path0; P1 -> ?b2l(Prefix) ++ "/" ++ P1 end, Path2 = normalize_path(Path1), Path3 = case Bindings of [] -> Path2; _ -> [Path2, "?", mochiweb_util:urlencode(Bindings)] end, RawPath1 = ?b2l(iolist_to_binary(Path3)), % In order to do OAuth correctly, we have to save the % requested path. We use default so chained rewriting % wont replace the original header. Headers = mochiweb_headers:default("x-couchdb-requested-path", MochiReq:get(raw_path), MochiReq:get(headers)), ?LOG_DEBUG("rewrite to ~p ~n", [RawPath1]), % build a new mochiweb request MochiReq1 = mochiweb_request:new(MochiReq:get(socket), MochiReq:get(method), RawPath1, MochiReq:get(version), Headers), % cleanup, It force mochiweb to reparse raw uri. MochiReq1:cleanup(), #httpd{ db_url_handlers = DbUrlHandlers, design_url_handlers = DesignUrlHandlers, default_fun = DefaultFun, url_handlers = UrlHandlers, user_ctx = UserCtx, auth = Auth } = Req, erlang:put(pre_rewrite_auth, Auth), erlang:put(pre_rewrite_user_ctx, UserCtx), couch_httpd:handle_request_int(MochiReq1, DefaultFun, UrlHandlers, DbUrlHandlers, DesignUrlHandlers) end. quote_plus({bind, X}) -> mochiweb_util:quote_plus(X); quote_plus(X) -> mochiweb_util:quote_plus(X). %% @doc Try to find a rule matching current url. If none is found %% 404 error not_found is raised try_bind_path([], _Method, _PathParts, _QueryList) -> throw(not_found); try_bind_path([Dispatch|Rest], Method, PathParts, QueryList) -> [{PathParts1, Method1}, RedirectPath, QueryArgs, Formats] = Dispatch, case bind_method(Method1, Method) of true -> case bind_path(PathParts1, PathParts, []) of {ok, Remaining, Bindings} -> Bindings1 = Bindings ++ QueryList, % we parse query args from the rule and fill % it eventually with bindings vars QueryArgs1 = make_query_list(QueryArgs, Bindings1, Formats, []), % remove params in QueryLists1 that are already in % QueryArgs1 Bindings2 = lists:foldl(fun({K, V}, Acc) -> K1 = to_binding(K), KV = case couch_util:get_value(K1, QueryArgs1) of undefined -> [{K1, V}]; _V1 -> [] end, Acc ++ KV end, [], Bindings1), FinalBindings = Bindings2 ++ QueryArgs1, NewPathParts = make_new_path(RedirectPath, FinalBindings, Remaining, []), {NewPathParts, FinalBindings}; fail -> try_bind_path(Rest, Method, PathParts, QueryList) end; false -> try_bind_path(Rest, Method, PathParts, QueryList) end. %% rewriting dynamically the quey list given as query member in %% rewrites. Each value is replaced by one binding or an argument %% passed in url. make_query_list([], _Bindings, _Formats, Acc) -> Acc; make_query_list([{Key, {Value}}|Rest], Bindings, Formats, Acc) -> Value1 = {Value}, make_query_list(Rest, Bindings, Formats, [{to_binding(Key), Value1}|Acc]); make_query_list([{Key, Value}|Rest], Bindings, Formats, Acc) when is_binary(Value) -> Value1 = replace_var(Value, Bindings, Formats), make_query_list(Rest, Bindings, Formats, [{to_binding(Key), Value1}|Acc]); make_query_list([{Key, Value}|Rest], Bindings, Formats, Acc) when is_list(Value) -> Value1 = replace_var(Value, Bindings, Formats), make_query_list(Rest, Bindings, Formats, [{to_binding(Key), Value1}|Acc]); make_query_list([{Key, Value}|Rest], Bindings, Formats, Acc) -> make_query_list(Rest, Bindings, Formats, [{to_binding(Key), Value}|Acc]). replace_var(<<"*">>=Value, Bindings, Formats) -> get_var(Value, Bindings, Value, Formats); replace_var(<<":", Var/binary>> = Value, Bindings, Formats) -> get_var(Var, Bindings, Value, Formats); replace_var(Value, _Bindings, _Formats) when is_binary(Value) -> Value; replace_var(Value, Bindings, Formats) when is_list(Value) -> lists:reverse(lists:foldl(fun (<<":", Var/binary>>=Value1, Acc) -> [get_var(Var, Bindings, Value1, Formats)|Acc]; (Value1, Acc) -> [Value1|Acc] end, [], Value)); replace_var(Value, _Bindings, _Formats) -> Value. maybe_json(Key, Value) -> case lists:member(Key, [<<"key">>, <<"startkey">>, <<"start_key">>, <<"endkey">>, <<"end_key">>, <<"keys">>]) of true -> ?JSON_ENCODE(Value); false -> Value end. get_var(VarName, Props, Default, Formats) -> VarName1 = to_binding(VarName), Val = couch_util:get_value(VarName1, Props, Default), maybe_format(VarName, Val, Formats). maybe_format(VarName, Value, Formats) -> case couch_util:get_value(VarName, Formats) of undefined -> Value; Format -> format(Format, Value) end. format(<<"int">>, Value) when is_integer(Value) -> Value; format(<<"int">>, Value) when is_binary(Value) -> format(<<"int">>, ?b2l(Value)); format(<<"int">>, Value) when is_list(Value) -> case (catch list_to_integer(Value)) of IntVal when is_integer(IntVal) -> IntVal; _ -> Value end; format(<<"bool">>, Value) when is_binary(Value) -> format(<<"bool">>, ?b2l(Value)); format(<<"bool">>, Value) when is_list(Value) -> case string:to_lower(Value) of "true" -> true; "false" -> false; _ -> Value end; format(_Format, Value) -> Value. %% doc: build new patch from bindings. bindings are query args %% (+ dynamic query rewritten if needed) and bindings found in %% bind_path step. make_new_path([], _Bindings, _Remaining, Acc) -> lists:reverse(Acc); make_new_path([?MATCH_ALL], _Bindings, Remaining, Acc) -> Acc1 = lists:reverse(Acc) ++ Remaining, Acc1; make_new_path([?MATCH_ALL|_Rest], _Bindings, Remaining, Acc) -> Acc1 = lists:reverse(Acc) ++ Remaining, Acc1; make_new_path([{bind, P}|Rest], Bindings, Remaining, Acc) -> P2 = case couch_util:get_value({bind, P}, Bindings) of undefined -> << "undefined">>; P1 -> iolist_to_binary(P1) end, make_new_path(Rest, Bindings, Remaining, [P2|Acc]); make_new_path([P|Rest], Bindings, Remaining, Acc) -> make_new_path(Rest, Bindings, Remaining, [P|Acc]). %% @doc If method of the query fith the rule method. If the %% method rule is '*', which is the default, all %% request method will bind. It allows us to make rules %% depending on HTTP method. bind_method(?MATCH_ALL, _Method ) -> true; bind_method({bind, Method}, Method) -> true; bind_method(_, _) -> false. %% @doc bind path. Using the rule from we try to bind variables given %% to the current url by pattern matching bind_path([], [], Bindings) -> {ok, [], Bindings}; bind_path([?MATCH_ALL], [Match|_RestMatch]=Rest, Bindings) -> {ok, Rest, [{?MATCH_ALL, Match}|Bindings]}; bind_path(_, [], _) -> fail; bind_path([{bind, Token}|RestToken],[Match|RestMatch],Bindings) -> bind_path(RestToken, RestMatch, [{{bind, Token}, Match}|Bindings]); bind_path([Token|RestToken], [Token|RestMatch], Bindings) -> bind_path(RestToken, RestMatch, Bindings); bind_path(_, _, _) -> fail. %% normalize path. normalize_path(Path) -> "/" ++ string:join(normalize_path1(string:tokens(Path, "/"), []), [?SEPARATOR]). normalize_path1([], Acc) -> lists:reverse(Acc); normalize_path1([".."|Rest], Acc) -> Acc1 = case Acc of [] -> [".."|Acc]; [T|_] when T =:= ".." -> [".."|Acc]; [_|R] -> R end, normalize_path1(Rest, Acc1); normalize_path1(["."|Rest], Acc) -> normalize_path1(Rest, Acc); normalize_path1([Path|Rest], Acc) -> normalize_path1(Rest, [Path|Acc]). %% @doc transform json rule in erlang for pattern matching make_rule(Rule) -> Method = case couch_util:get_value(<<"method">>, Rule) of undefined -> ?MATCH_ALL; M -> to_binding(M) end, QueryArgs = case couch_util:get_value(<<"query">>, Rule) of undefined -> []; {Args} -> Args end, FromParts = case couch_util:get_value(<<"from">>, Rule) of undefined -> [?MATCH_ALL]; From -> parse_path(From) end, ToParts = case couch_util:get_value(<<"to">>, Rule) of undefined -> throw({error, invalid_rewrite_target}); To -> parse_path(To) end, Formats = case couch_util:get_value(<<"formats">>, Rule) of undefined -> []; {Fmts} -> Fmts end, [{FromParts, Method}, ToParts, QueryArgs, Formats]. parse_path(Path) -> {ok, SlashRE} = re:compile(<<"\\/">>), path_to_list(re:split(Path, SlashRE), [], 0). %% @doc convert a path rule (from or to) to an erlang list %% * and path variable starting by ":" are converted %% in erlang atom. path_to_list([], Acc, _DotDotCount) -> lists:reverse(Acc); path_to_list([<<>>|R], Acc, DotDotCount) -> path_to_list(R, Acc, DotDotCount); path_to_list([<<"*">>|R], Acc, DotDotCount) -> path_to_list(R, [?MATCH_ALL|Acc], DotDotCount); path_to_list([<<"..">>|R], Acc, DotDotCount) when DotDotCount == 2 -> case couch_config:get("httpd", "secure_rewrites", "true") of "false" -> path_to_list(R, [<<"..">>|Acc], DotDotCount+1); _Else -> ?LOG_INFO("insecure_rewrite_rule ~p blocked", [lists:reverse(Acc) ++ [<<"..">>] ++ R]), throw({insecure_rewrite_rule, "too many ../.. segments"}) end; path_to_list([<<"..">>|R], Acc, DotDotCount) -> path_to_list(R, [<<"..">>|Acc], DotDotCount+1); path_to_list([P|R], Acc, DotDotCount) -> P1 = case P of <<":", Var/binary>> -> to_binding(Var); _ -> P end, path_to_list(R, [P1|Acc], DotDotCount). maybe_encode_bindings([]) -> []; maybe_encode_bindings(Props) -> lists:foldl(fun ({{bind, <<"*">>}, _V}, Acc) -> Acc; ({{bind, K}, V}, Acc) -> V1 = iolist_to_binary(maybe_json(K, V)), [{K, V1}|Acc] end, [], Props). decode_query_value({K,V}) -> case lists:member(K, ["key", "startkey", "start_key", "endkey", "end_key", "keys"]) of true -> {to_binding(K), ?JSON_DECODE(V)}; false -> {to_binding(K), ?l2b(V)} end. to_binding({bind, V}) -> {bind, V}; to_binding(V) when is_list(V) -> to_binding(?l2b(V)); to_binding(V) -> {bind, V}. apache-couchdb-1.6.0/src/couchdb/couch_util.erl0000644000175000001440000003665112332105522021371 0ustar00djcusers00000000000000% Licensed under the Apache License, Version 2.0 (the "License"); you may not % use this file except in compliance with the License. You may obtain a copy of % the License at % % http://www.apache.org/licenses/LICENSE-2.0 % % Unless required by applicable law or agreed to in writing, software % distributed under the License is distributed on an "AS IS" BASIS, WITHOUT % WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the % License for the specific language governing permissions and limitations under % the License. -module(couch_util). -export([priv_dir/0, normpath/1]). -export([should_flush/0, should_flush/1, to_existing_atom/1]). -export([rand32/0, implode/2, collate/2, collate/3]). -export([abs_pathname/1,abs_pathname/2, trim/1]). -export([encodeBase64Url/1, decodeBase64Url/1]). -export([validate_utf8/1, to_hex/1, parse_term/1, dict_find/3]). -export([get_nested_json_value/2, json_user_ctx/1]). -export([proplist_apply_field/2, json_apply_field/2]). -export([to_binary/1, to_integer/1, to_list/1, url_encode/1]). -export([verify/2,simple_call/2,shutdown_sync/1]). -export([get_value/2, get_value/3]). -export([md5/1, md5_init/0, md5_update/2, md5_final/1]). -export([reorder_results/2]). -export([url_strip_password/1]). -export([encode_doc_id/1]). -export([with_db/2]). -export([rfc1123_date/0, rfc1123_date/1]). -export([find_in_binary/2]). -include("couch_db.hrl"). % arbitrarily chosen amount of memory to use before flushing to disk -define(FLUSH_MAX_MEM, 10000000). priv_dir() -> case code:priv_dir(couch) of {error, bad_name} -> % small hack, in dev mode "app" is couchdb. Fixing requires % renaming src/couch to src/couch. Not really worth the hassle. % -Damien code:priv_dir(couchdb); Dir -> Dir end. % Normalize a pathname by removing .. and . components. normpath(Path) -> normparts(filename:split(Path), []). normparts([], Acc) -> filename:join(lists:reverse(Acc)); normparts([".." | RestParts], [_Drop | RestAcc]) -> normparts(RestParts, RestAcc); normparts(["." | RestParts], Acc) -> normparts(RestParts, Acc); normparts([Part | RestParts], Acc) -> normparts(RestParts, [Part | Acc]). % works like list_to_existing_atom, except can be list or binary and it % gives you the original value instead of an error if no existing atom. to_existing_atom(V) when is_list(V) -> try list_to_existing_atom(V) catch _:_ -> V end; to_existing_atom(V) when is_binary(V) -> try list_to_existing_atom(?b2l(V)) catch _:_ -> V end; to_existing_atom(V) when is_atom(V) -> V. shutdown_sync(Pid) when not is_pid(Pid)-> ok; shutdown_sync(Pid) -> MRef = erlang:monitor(process, Pid), try catch unlink(Pid), catch exit(Pid, shutdown), receive {'DOWN', MRef, _, _, _} -> ok end after erlang:demonitor(MRef, [flush]) end. simple_call(Pid, Message) -> MRef = erlang:monitor(process, Pid), try Pid ! {self(), Message}, receive {Pid, Result} -> Result; {'DOWN', MRef, _, _, Reason} -> exit(Reason) end after erlang:demonitor(MRef, [flush]) end. validate_utf8(Data) when is_list(Data) -> validate_utf8(?l2b(Data)); validate_utf8(Bin) when is_binary(Bin) -> validate_utf8_fast(Bin, 0). validate_utf8_fast(B, O) -> case B of <<_:O/binary>> -> true; <<_:O/binary, C1, _/binary>> when C1 < 128 -> validate_utf8_fast(B, 1 + O); <<_:O/binary, C1, C2, _/binary>> when C1 >= 194, C1 =< 223, C2 >= 128, C2 =< 191 -> validate_utf8_fast(B, 2 + O); <<_:O/binary, C1, C2, C3, _/binary>> when C1 >= 224, C1 =< 239, C2 >= 128, C2 =< 191, C3 >= 128, C3 =< 191 -> validate_utf8_fast(B, 3 + O); <<_:O/binary, C1, C2, C3, C4, _/binary>> when C1 >= 240, C1 =< 244, C2 >= 128, C2 =< 191, C3 >= 128, C3 =< 191, C4 >= 128, C4 =< 191 -> validate_utf8_fast(B, 4 + O); _ -> false end. to_hex([]) -> []; to_hex(Bin) when is_binary(Bin) -> to_hex(binary_to_list(Bin)); to_hex([H|T]) -> [to_digit(H div 16), to_digit(H rem 16) | to_hex(T)]. to_digit(N) when N < 10 -> $0 + N; to_digit(N) -> $a + N-10. parse_term(Bin) when is_binary(Bin) -> parse_term(binary_to_list(Bin)); parse_term(List) -> {ok, Tokens, _} = erl_scan:string(List ++ "."), erl_parse:parse_term(Tokens). get_value(Key, List) -> get_value(Key, List, undefined). get_value(Key, List, Default) -> case lists:keysearch(Key, 1, List) of {value, {Key,Value}} -> Value; false -> Default end. get_nested_json_value({Props}, [Key|Keys]) -> case couch_util:get_value(Key, Props, nil) of nil -> throw({not_found, <<"missing json key: ", Key/binary>>}); Value -> get_nested_json_value(Value, Keys) end; get_nested_json_value(Value, []) -> Value; get_nested_json_value(_NotJSONObj, _) -> throw({not_found, json_mismatch}). proplist_apply_field(H, L) -> {R} = json_apply_field(H, {L}), R. json_apply_field(H, {L}) -> json_apply_field(H, L, []). json_apply_field({Key, NewValue}, [{Key, _OldVal} | Headers], Acc) -> json_apply_field({Key, NewValue}, Headers, Acc); json_apply_field({Key, NewValue}, [{OtherKey, OtherVal} | Headers], Acc) -> json_apply_field({Key, NewValue}, Headers, [{OtherKey, OtherVal} | Acc]); json_apply_field({Key, NewValue}, [], Acc) -> {[{Key, NewValue}|Acc]}. json_user_ctx(#db{name=DbName, user_ctx=Ctx}) -> {[{<<"db">>, DbName}, {<<"name">>,Ctx#user_ctx.name}, {<<"roles">>,Ctx#user_ctx.roles}]}. % returns a random integer rand32() -> crypto:rand_uniform(0, 16#100000000). % given a pathname "../foo/bar/" it gives back the fully qualified % absolute pathname. abs_pathname(" " ++ Filename) -> % strip leading whitspace abs_pathname(Filename); abs_pathname([$/ |_]=Filename) -> Filename; abs_pathname(Filename) -> {ok, Cwd} = file:get_cwd(), {Filename2, Args} = separate_cmd_args(Filename, ""), abs_pathname(Filename2, Cwd) ++ Args. abs_pathname(Filename, Dir) -> Name = filename:absname(Filename, Dir ++ "/"), OutFilename = filename:join(fix_path_list(filename:split(Name), [])), % If the filename is a dir (last char slash, put back end slash case string:right(Filename,1) of "/" -> OutFilename ++ "/"; "\\" -> OutFilename ++ "/"; _Else-> OutFilename end. % if this as an executable with arguments, seperate out the arguments % ""./foo\ bar.sh -baz=blah" -> {"./foo\ bar.sh", " -baz=blah"} separate_cmd_args("", CmdAcc) -> {lists:reverse(CmdAcc), ""}; separate_cmd_args("\\ " ++ Rest, CmdAcc) -> % handle skipped value separate_cmd_args(Rest, " \\" ++ CmdAcc); separate_cmd_args(" " ++ Rest, CmdAcc) -> {lists:reverse(CmdAcc), " " ++ Rest}; separate_cmd_args([Char|Rest], CmdAcc) -> separate_cmd_args(Rest, [Char | CmdAcc]). % Is a character whitespace? is_whitespace($\s) -> true; is_whitespace($\t) -> true; is_whitespace($\n) -> true; is_whitespace($\r) -> true; is_whitespace(_Else) -> false. % removes leading and trailing whitespace from a string trim(String) -> String2 = lists:dropwhile(fun is_whitespace/1, String), lists:reverse(lists:dropwhile(fun is_whitespace/1, lists:reverse(String2))). % takes a heirarchical list of dirs and removes the dots ".", double dots % ".." and the corresponding parent dirs. fix_path_list([], Acc) -> lists:reverse(Acc); fix_path_list([".."|Rest], [_PrevAcc|RestAcc]) -> fix_path_list(Rest, RestAcc); fix_path_list(["."|Rest], Acc) -> fix_path_list(Rest, Acc); fix_path_list([Dir | Rest], Acc) -> fix_path_list(Rest, [Dir | Acc]). implode(List, Sep) -> implode(List, Sep, []). implode([], _Sep, Acc) -> lists:flatten(lists:reverse(Acc)); implode([H], Sep, Acc) -> implode([], Sep, [H|Acc]); implode([H|T], Sep, Acc) -> implode(T, Sep, [Sep,H|Acc]). drv_port() -> case get(couch_drv_port) of undefined -> Port = open_port({spawn, "couch_icu_driver"}, []), put(couch_drv_port, Port), Port; Port -> Port end. collate(A, B) -> collate(A, B, []). collate(A, B, Options) when is_binary(A), is_binary(B) -> Operation = case lists:member(nocase, Options) of true -> 1; % Case insensitive false -> 0 % Case sensitive end, SizeA = byte_size(A), SizeB = byte_size(B), Bin = <>, [Result] = erlang:port_control(drv_port(), Operation, Bin), % Result is 0 for lt, 1 for eq and 2 for gt. Subtract 1 to return the % expected typical -1, 0, 1 Result - 1. should_flush() -> should_flush(?FLUSH_MAX_MEM). should_flush(MemThreshHold) -> {memory, ProcMem} = process_info(self(), memory), BinMem = lists:foldl(fun({_Id, Size, _NRefs}, Acc) -> Size+Acc end, 0, element(2,process_info(self(), binary))), if ProcMem+BinMem > 2*MemThreshHold -> garbage_collect(), {memory, ProcMem2} = process_info(self(), memory), BinMem2 = lists:foldl(fun({_Id, Size, _NRefs}, Acc) -> Size+Acc end, 0, element(2,process_info(self(), binary))), ProcMem2+BinMem2 > MemThreshHold; true -> false end. encodeBase64Url(Url) -> Url1 = re:replace(base64:encode(Url), ["=+", $$], ""), Url2 = re:replace(Url1, "/", "_", [global]), re:replace(Url2, "\\+", "-", [global, {return, binary}]). decodeBase64Url(Url64) -> Url1 = re:replace(Url64, "-", "+", [global]), Url2 = re:replace(Url1, "_", "/", [global]), Padding = lists:duplicate((4 - iolist_size(Url2) rem 4) rem 4, $=), base64:decode(iolist_to_binary([Url2, Padding])). dict_find(Key, Dict, DefaultValue) -> case dict:find(Key, Dict) of {ok, Value} -> Value; error -> DefaultValue end. to_binary(V) when is_binary(V) -> V; to_binary(V) when is_list(V) -> try list_to_binary(V) catch _:_ -> list_to_binary(io_lib:format("~p", [V])) end; to_binary(V) when is_atom(V) -> list_to_binary(atom_to_list(V)); to_binary(V) -> list_to_binary(io_lib:format("~p", [V])). to_integer(V) when is_integer(V) -> V; to_integer(V) when is_list(V) -> erlang:list_to_integer(V); to_integer(V) when is_binary(V) -> erlang:list_to_integer(binary_to_list(V)). to_list(V) when is_list(V) -> V; to_list(V) when is_binary(V) -> binary_to_list(V); to_list(V) when is_atom(V) -> atom_to_list(V); to_list(V) -> lists:flatten(io_lib:format("~p", [V])). url_encode(Bin) when is_binary(Bin) -> url_encode(binary_to_list(Bin)); url_encode([H|T]) -> if H >= $a, $z >= H -> [H|url_encode(T)]; H >= $A, $Z >= H -> [H|url_encode(T)]; H >= $0, $9 >= H -> [H|url_encode(T)]; H == $_; H == $.; H == $-; H == $: -> [H|url_encode(T)]; true -> case lists:flatten(io_lib:format("~.16.0B", [H])) of [X, Y] -> [$%, X, Y | url_encode(T)]; [X] -> [$%, $0, X | url_encode(T)] end end; url_encode([]) -> []. verify([X|RestX], [Y|RestY], Result) -> verify(RestX, RestY, (X bxor Y) bor Result); verify([], [], Result) -> Result == 0. verify(<>, <>) -> verify(?b2l(X), ?b2l(Y)); verify(X, Y) when is_list(X) and is_list(Y) -> case length(X) == length(Y) of true -> verify(X, Y, 0); false -> false end; verify(_X, _Y) -> false. -spec md5(Data::(iolist() | binary())) -> Digest::binary(). md5(Data) -> try crypto:md5(Data) catch error:_ -> erlang:md5(Data) end. -spec md5_init() -> Context::binary(). md5_init() -> try crypto:md5_init() catch error:_ -> erlang:md5_init() end. -spec md5_update(Context::binary(), Data::(iolist() | binary())) -> NewContext::binary(). md5_update(Ctx, D) -> try crypto:md5_update(Ctx,D) catch error:_ -> erlang:md5_update(Ctx,D) end. -spec md5_final(Context::binary()) -> Digest::binary(). md5_final(Ctx) -> try crypto:md5_final(Ctx) catch error:_ -> erlang:md5_final(Ctx) end. % linear search is faster for small lists, length() is 0.5 ms for 100k list reorder_results(Keys, SortedResults) when length(Keys) < 100 -> [couch_util:get_value(Key, SortedResults) || Key <- Keys]; reorder_results(Keys, SortedResults) -> KeyDict = dict:from_list(SortedResults), [dict:fetch(Key, KeyDict) || Key <- Keys]. url_strip_password(Url) -> re:replace(Url, "http(s)?://([^:]+):[^@]+@(.*)$", "http\\1://\\2:*****@\\3", [{return, list}]). encode_doc_id(#doc{id = Id}) -> encode_doc_id(Id); encode_doc_id(Id) when is_list(Id) -> encode_doc_id(?l2b(Id)); encode_doc_id(<<"_design/", Rest/binary>>) -> "_design/" ++ url_encode(Rest); encode_doc_id(<<"_local/", Rest/binary>>) -> "_local/" ++ url_encode(Rest); encode_doc_id(Id) -> url_encode(Id). with_db(Db, Fun) when is_record(Db, db) -> Fun(Db); with_db(DbName, Fun) -> case couch_db:open_int(DbName, [{user_ctx, #user_ctx{roles=[<<"_admin">>]}}]) of {ok, Db} -> try Fun(Db) after catch couch_db:close(Db) end; Else -> throw(Else) end. rfc1123_date() -> {{YYYY,MM,DD},{Hour,Min,Sec}} = calendar:universal_time(), DayNumber = calendar:day_of_the_week({YYYY,MM,DD}), lists:flatten( io_lib:format("~s, ~2.2.0w ~3.s ~4.4.0w ~2.2.0w:~2.2.0w:~2.2.0w GMT", [day(DayNumber),DD,month(MM),YYYY,Hour,Min,Sec])). rfc1123_date(undefined) -> undefined; rfc1123_date(UniversalTime) -> {{YYYY,MM,DD},{Hour,Min,Sec}} = UniversalTime, DayNumber = calendar:day_of_the_week({YYYY,MM,DD}), lists:flatten( io_lib:format("~s, ~2.2.0w ~3.s ~4.4.0w ~2.2.0w:~2.2.0w:~2.2.0w GMT", [day(DayNumber),DD,month(MM),YYYY,Hour,Min,Sec])). %% day day(1) -> "Mon"; day(2) -> "Tue"; day(3) -> "Wed"; day(4) -> "Thu"; day(5) -> "Fri"; day(6) -> "Sat"; day(7) -> "Sun". %% month month(1) -> "Jan"; month(2) -> "Feb"; month(3) -> "Mar"; month(4) -> "Apr"; month(5) -> "May"; month(6) -> "Jun"; month(7) -> "Jul"; month(8) -> "Aug"; month(9) -> "Sep"; month(10) -> "Oct"; month(11) -> "Nov"; month(12) -> "Dec". find_in_binary(_B, <<>>) -> not_found; find_in_binary(B, Data) -> case binary:match(Data, [B], []) of nomatch -> MatchLength = erlang:min(byte_size(B), byte_size(Data)), match_prefix_at_end(binary:part(B, {0, MatchLength}), binary:part(Data, {byte_size(Data), -MatchLength}), MatchLength, byte_size(Data) - MatchLength); {Pos, _Len} -> {exact, Pos} end. match_prefix_at_end(Prefix, Data, PrefixLength, N) -> FirstCharMatches = binary:matches(Data, [binary:part(Prefix, {0, 1})], []), match_rest_of_prefix(FirstCharMatches, Prefix, Data, PrefixLength, N). match_rest_of_prefix([], _Prefix, _Data, _PrefixLength, _N) -> not_found; match_rest_of_prefix([{Pos, _Len} | Rest], Prefix, Data, PrefixLength, N) -> case binary:match(binary:part(Data, {PrefixLength, Pos - PrefixLength}), [binary:part(Prefix, {0, PrefixLength - Pos})], []) of nomatch -> match_rest_of_prefix(Rest, Prefix, Data, PrefixLength, N); {_Pos, _Len1} -> {partial, N + Pos} end. apache-couchdb-1.6.0/src/couchdb/couch.app.tpl.in0000644000175000001440000000137312332105522021526 0ustar00djcusers00000000000000{application, couch, [ {description, "@package_name@"}, {vsn, "@version@"}, {modules, [@modules@]}, {registered, [ couch_config, couch_db_update, couch_db_update_notifier_sup, couch_external_manager, couch_httpd, couch_log, couch_primary_services, couch_query_servers, couch_secondary_services, couch_server, couch_server_sup, couch_stats_aggregator, couch_stats_collector, couch_task_status ]}, {mod, {couch_app, [ "%localconfdir%/@defaultini@", "%localconfdir%/@localini@" ]}}, {applications, [kernel, stdlib]}, {included_applications, [crypto, sasl, inets, oauth, ibrowse, mochiweb, os_mon]} ]}. apache-couchdb-1.6.0/src/couchdb/couch_httpd_auth.erl0000644000175000001440000004210312332105522022545 0ustar00djcusers00000000000000% Licensed under the Apache License, Version 2.0 (the "License"); you may not % use this file except in compliance with the License. You may obtain a copy of % the License at % % http://www.apache.org/licenses/LICENSE-2.0 % % Unless required by applicable law or agreed to in writing, software % distributed under the License is distributed on an "AS IS" BASIS, WITHOUT % WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the % License for the specific language governing permissions and limitations under % the License. -module(couch_httpd_auth). -include("couch_db.hrl"). -export([default_authentication_handler/1,special_test_authentication_handler/1]). -export([cookie_authentication_handler/1]). -export([null_authentication_handler/1]). -export([proxy_authentication_handler/1, proxy_authentification_handler/1]). -export([cookie_auth_header/2]). -export([handle_session_req/1]). -import(couch_httpd, [header_value/2, send_json/2,send_json/4, send_method_not_allowed/2]). special_test_authentication_handler(Req) -> case header_value(Req, "WWW-Authenticate") of "X-Couch-Test-Auth " ++ NamePass -> % NamePass is a colon separated string: "joe schmoe:a password". [Name, Pass] = re:split(NamePass, ":", [{return, list}, {parts, 2}]), case {Name, Pass} of {"Jan Lehnardt", "apple"} -> ok; {"Christopher Lenz", "dog food"} -> ok; {"Noah Slater", "biggiesmalls endian"} -> ok; {"Chris Anderson", "mp3"} -> ok; {"Damien Katz", "pecan pie"} -> ok; {_, _} -> throw({unauthorized, <<"Name or password is incorrect.">>}) end, Req#httpd{user_ctx=#user_ctx{name=?l2b(Name)}}; _ -> % No X-Couch-Test-Auth credentials sent, give admin access so the % previous authentication can be restored after the test Req#httpd{user_ctx=#user_ctx{roles=[<<"_admin">>]}} end. basic_name_pw(Req) -> AuthorizationHeader = header_value(Req, "Authorization"), case AuthorizationHeader of "Basic " ++ Base64Value -> case re:split(base64:decode(Base64Value), ":", [{return, list}, {parts, 2}]) of ["_", "_"] -> % special name and pass to be logged out nil; [User, Pass] -> {User, Pass}; _ -> nil end; _ -> nil end. default_authentication_handler(Req) -> case basic_name_pw(Req) of {User, Pass} -> case couch_auth_cache:get_user_creds(User) of nil -> throw({unauthorized, <<"Name or password is incorrect.">>}); UserProps -> UserName = ?l2b(User), Password = ?l2b(Pass), case authenticate(Password, UserProps) of true -> UserProps2 = maybe_upgrade_password_hash(UserName, Password, UserProps), Req#httpd{user_ctx=#user_ctx{ name=UserName, roles=couch_util:get_value(<<"roles">>, UserProps2, []) }}; _Else -> throw({unauthorized, <<"Name or password is incorrect.">>}) end end; nil -> case couch_server:has_admins() of true -> Req; false -> case couch_config:get("couch_httpd_auth", "require_valid_user", "false") of "true" -> Req; % If no admins, and no user required, then everyone is admin! % Yay, admin party! _ -> Req#httpd{user_ctx=#user_ctx{roles=[<<"_admin">>]}} end end end. null_authentication_handler(Req) -> Req#httpd{user_ctx=#user_ctx{roles=[<<"_admin">>]}}. %% @doc proxy auth handler. % % This handler allows creation of a userCtx object from a user authenticated remotly. % The client just pass specific headers to CouchDB and the handler create the userCtx. % Headers name can be defined in local.ini. By thefault they are : % % * X-Auth-CouchDB-UserName : contain the username, (x_auth_username in % couch_httpd_auth section) % * X-Auth-CouchDB-Roles : contain the user roles, list of roles separated by a % comma (x_auth_roles in couch_httpd_auth section) % * X-Auth-CouchDB-Token : token to authenticate the authorization (x_auth_token % in couch_httpd_auth section). This token is an hmac-sha1 created from secret key % and username. The secret key should be the same in the client and couchdb node. s % ecret key is the secret key in couch_httpd_auth section of ini. This token is optional % if value of proxy_use_secret key in couch_httpd_auth section of ini isn't true. % proxy_authentication_handler(Req) -> case proxy_auth_user(Req) of nil -> Req; Req2 -> Req2 end. %% @deprecated proxy_authentification_handler(Req) -> proxy_authentication_handler(Req). proxy_auth_user(Req) -> XHeaderUserName = couch_config:get("couch_httpd_auth", "x_auth_username", "X-Auth-CouchDB-UserName"), XHeaderRoles = couch_config:get("couch_httpd_auth", "x_auth_roles", "X-Auth-CouchDB-Roles"), XHeaderToken = couch_config:get("couch_httpd_auth", "x_auth_token", "X-Auth-CouchDB-Token"), case header_value(Req, XHeaderUserName) of undefined -> nil; UserName -> Roles = case header_value(Req, XHeaderRoles) of undefined -> []; Else -> [?l2b(R) || R <- string:tokens(Else, ",")] end, case couch_config:get("couch_httpd_auth", "proxy_use_secret", "false") of "true" -> case couch_config:get("couch_httpd_auth", "secret", nil) of nil -> Req#httpd{user_ctx=#user_ctx{name=?l2b(UserName), roles=Roles}}; Secret -> ExpectedToken = couch_util:to_hex(crypto:sha_mac(Secret, UserName)), case header_value(Req, XHeaderToken) of Token when Token == ExpectedToken -> Req#httpd{user_ctx=#user_ctx{name=?l2b(UserName), roles=Roles}}; _ -> nil end end; _ -> Req#httpd{user_ctx=#user_ctx{name=?l2b(UserName), roles=Roles}} end end. cookie_authentication_handler(#httpd{mochi_req=MochiReq}=Req) -> case MochiReq:get_cookie_value("AuthSession") of undefined -> Req; [] -> Req; Cookie -> [User, TimeStr, HashStr] = try AuthSession = couch_util:decodeBase64Url(Cookie), [_A, _B, _Cs] = re:split(?b2l(AuthSession), ":", [{return, list}, {parts, 3}]) catch _:_Error -> Reason = <<"Malformed AuthSession cookie. Please clear your cookies.">>, throw({bad_request, Reason}) end, % Verify expiry and hash CurrentTime = make_cookie_time(), case couch_config:get("couch_httpd_auth", "secret", nil) of nil -> ?LOG_DEBUG("cookie auth secret is not set",[]), Req; SecretStr -> Secret = ?l2b(SecretStr), case couch_auth_cache:get_user_creds(User) of nil -> Req; UserProps -> UserSalt = couch_util:get_value(<<"salt">>, UserProps, <<"">>), FullSecret = <>, ExpectedHash = crypto:sha_mac(FullSecret, User ++ ":" ++ TimeStr), Hash = ?l2b(HashStr), Timeout = list_to_integer( couch_config:get("couch_httpd_auth", "timeout", "600")), ?LOG_DEBUG("timeout ~p", [Timeout]), case (catch erlang:list_to_integer(TimeStr, 16)) of TimeStamp when CurrentTime < TimeStamp + Timeout -> case couch_passwords:verify(ExpectedHash, Hash) of true -> TimeLeft = TimeStamp + Timeout - CurrentTime, ?LOG_DEBUG("Successful cookie auth as: ~p", [User]), Req#httpd{user_ctx=#user_ctx{ name=?l2b(User), roles=couch_util:get_value(<<"roles">>, UserProps, []) }, auth={FullSecret, TimeLeft < Timeout*0.9}}; _Else -> Req end; _Else -> Req end end end end. cookie_auth_header(#httpd{user_ctx=#user_ctx{name=null}}, _Headers) -> []; cookie_auth_header(#httpd{user_ctx=#user_ctx{name=User}, auth={Secret, true}}=Req, Headers) -> % Note: we only set the AuthSession cookie if: % * a valid AuthSession cookie has been received % * we are outside a 10% timeout window % * and if an AuthSession cookie hasn't already been set e.g. by a login % or logout handler. % The login and logout handlers need to set the AuthSession cookie % themselves. CookieHeader = couch_util:get_value("Set-Cookie", Headers, ""), Cookies = mochiweb_cookies:parse_cookie(CookieHeader), AuthSession = couch_util:get_value("AuthSession", Cookies), if AuthSession == undefined -> TimeStamp = make_cookie_time(), [cookie_auth_cookie(Req, ?b2l(User), Secret, TimeStamp)]; true -> [] end; cookie_auth_header(_Req, _Headers) -> []. cookie_auth_cookie(Req, User, Secret, TimeStamp) -> SessionData = User ++ ":" ++ erlang:integer_to_list(TimeStamp, 16), Hash = crypto:sha_mac(Secret, SessionData), mochiweb_cookies:cookie("AuthSession", couch_util:encodeBase64Url(SessionData ++ ":" ++ ?b2l(Hash)), [{path, "/"}] ++ cookie_scheme(Req) ++ max_age()). ensure_cookie_auth_secret() -> case couch_config:get("couch_httpd_auth", "secret", nil) of nil -> NewSecret = ?b2l(couch_uuids:random()), couch_config:set("couch_httpd_auth", "secret", NewSecret), NewSecret; Secret -> Secret end. % session handlers % Login handler with user db handle_session_req(#httpd{method='POST', mochi_req=MochiReq}=Req) -> ReqBody = MochiReq:recv_body(), Form = case MochiReq:get_primary_header_value("content-type") of % content type should be json "application/x-www-form-urlencoded" ++ _ -> mochiweb_util:parse_qs(ReqBody); "application/json" ++ _ -> {Pairs} = ?JSON_DECODE(ReqBody), lists:map(fun({Key, Value}) -> {?b2l(Key), ?b2l(Value)} end, Pairs); _ -> [] end, UserName = ?l2b(couch_util:get_value("name", Form, "")), Password = ?l2b(couch_util:get_value("password", Form, "")), ?LOG_DEBUG("Attempt Login: ~s",[UserName]), UserProps = case couch_auth_cache:get_user_creds(UserName) of nil -> []; Result -> Result end, case authenticate(Password, UserProps) of true -> UserProps2 = maybe_upgrade_password_hash(UserName, Password, UserProps), % setup the session cookie Secret = ?l2b(ensure_cookie_auth_secret()), UserSalt = couch_util:get_value(<<"salt">>, UserProps2), CurrentTime = make_cookie_time(), Cookie = cookie_auth_cookie(Req, ?b2l(UserName), <>, CurrentTime), % TODO document the "next" feature in Futon {Code, Headers} = case couch_httpd:qs_value(Req, "next", nil) of nil -> {200, [Cookie]}; Redirect -> {302, [Cookie, {"Location", couch_httpd:absolute_uri(Req, Redirect)}]} end, send_json(Req#httpd{req_body=ReqBody}, Code, Headers, {[ {ok, true}, {name, couch_util:get_value(<<"name">>, UserProps2, null)}, {roles, couch_util:get_value(<<"roles">>, UserProps2, [])} ]}); _Else -> % clear the session Cookie = mochiweb_cookies:cookie("AuthSession", "", [{path, "/"}] ++ cookie_scheme(Req)), {Code, Headers} = case couch_httpd:qs_value(Req, "fail", nil) of nil -> {401, [Cookie]}; Redirect -> {302, [Cookie, {"Location", couch_httpd:absolute_uri(Req, Redirect)}]} end, send_json(Req, Code, Headers, {[{error, <<"unauthorized">>},{reason, <<"Name or password is incorrect.">>}]}) end; % get user info % GET /_session handle_session_req(#httpd{method='GET', user_ctx=UserCtx}=Req) -> Name = UserCtx#user_ctx.name, ForceLogin = couch_httpd:qs_value(Req, "basic", "false"), case {Name, ForceLogin} of {null, "true"} -> throw({unauthorized, <<"Please login.">>}); {Name, _} -> send_json(Req, {[ % remove this ok {ok, true}, {<<"userCtx">>, {[ {name, Name}, {roles, UserCtx#user_ctx.roles} ]}}, {info, {[ {authentication_db, ?l2b(couch_config:get("couch_httpd_auth", "authentication_db"))}, {authentication_handlers, [auth_name(H) || H <- couch_httpd:make_fun_spec_strs( couch_config:get("httpd", "authentication_handlers"))]} ] ++ maybe_value(authenticated, UserCtx#user_ctx.handler, fun(Handler) -> auth_name(?b2l(Handler)) end)}} ]}) end; % logout by deleting the session handle_session_req(#httpd{method='DELETE'}=Req) -> Cookie = mochiweb_cookies:cookie("AuthSession", "", [{path, "/"}] ++ cookie_scheme(Req)), {Code, Headers} = case couch_httpd:qs_value(Req, "next", nil) of nil -> {200, [Cookie]}; Redirect -> {302, [Cookie, {"Location", couch_httpd:absolute_uri(Req, Redirect)}]} end, send_json(Req, Code, Headers, {[{ok, true}]}); handle_session_req(Req) -> send_method_not_allowed(Req, "GET,HEAD,POST,DELETE"). maybe_value(_Key, undefined, _Fun) -> []; maybe_value(Key, Else, Fun) -> [{Key, Fun(Else)}]. maybe_upgrade_password_hash(UserName, Password, UserProps) -> case couch_util:get_value(<<"password_scheme">>, UserProps, <<"simple">>) of <<"simple">> -> DbName = ?l2b(couch_config:get("couch_httpd_auth", "authentication_db", "_users")), couch_util:with_db(DbName, fun(UserDb) -> UserProps2 = proplists:delete(<<"password_sha">>, UserProps), UserProps3 = [{<<"password">>, Password} | UserProps2], NewUserDoc = couch_doc:from_json_obj({UserProps3}), {ok, _NewRev} = couch_db:update_doc(UserDb, NewUserDoc, []), couch_auth_cache:get_user_creds(UserName) end); _ -> UserProps end. authenticate(Pass, UserProps) -> UserSalt = couch_util:get_value(<<"salt">>, UserProps, <<>>), {PasswordHash, ExpectedHash} = case couch_util:get_value(<<"password_scheme">>, UserProps, <<"simple">>) of <<"simple">> -> {couch_passwords:simple(Pass, UserSalt), couch_util:get_value(<<"password_sha">>, UserProps, nil)}; <<"pbkdf2">> -> Iterations = couch_util:get_value(<<"iterations">>, UserProps, 10000), verify_iterations(Iterations), {couch_passwords:pbkdf2(Pass, UserSalt, Iterations), couch_util:get_value(<<"derived_key">>, UserProps, nil)} end, couch_passwords:verify(PasswordHash, ExpectedHash). verify_iterations(Iterations) when is_integer(Iterations) -> Min = list_to_integer(couch_config:get("couch_httpd_auth", "min_iterations", "1")), Max = list_to_integer(couch_config:get("couch_httpd_auth", "max_iterations", "1000000000")), case Iterations < Min of true -> throw({forbidden, <<"Iteration count is too low for this server">>}); false -> ok end, case Iterations > Max of true -> throw({forbidden, <<"Iteration count is too high for this server">>}); false -> ok end. auth_name(String) when is_list(String) -> [_,_,_,_,_,Name|_] = re:split(String, "[\\W_]", [{return, list}]), ?l2b(Name). make_cookie_time() -> {NowMS, NowS, _} = erlang:now(), NowMS * 1000000 + NowS. cookie_scheme(#httpd{mochi_req=MochiReq}) -> [{http_only, true}] ++ case MochiReq:get(scheme) of http -> []; https -> [{secure, true}] end. max_age() -> case couch_config:get("couch_httpd_auth", "allow_persistent_cookies", "false") of "false" -> []; "true" -> Timeout = list_to_integer( couch_config:get("couch_httpd_auth", "timeout", "600")), [{max_age, Timeout}] end. apache-couchdb-1.6.0/src/couchdb/couch_db_update_notifier_sup.erl0000644000175000001440000000405712332105522025124 0ustar00djcusers00000000000000% Licensed under the Apache License, Version 2.0 (the "License"); you may not % use this file except in compliance with the License. You may obtain a copy of % the License at % % http://www.apache.org/licenses/LICENSE-2.0 % % Unless required by applicable law or agreed to in writing, software % distributed under the License is distributed on an "AS IS" BASIS, WITHOUT % WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the % License for the specific language governing permissions and limitations under % the License. % % This causes an OS process to spawned and it is notified every time a database % is updated. % % The notifications are in the form of a the database name sent as a line of % text to the OS processes stdout. % -module(couch_db_update_notifier_sup). -behaviour(supervisor). -export([start_link/0, init/1, config_change/3]). start_link() -> supervisor:start_link({local, couch_db_update_notifier_sup}, couch_db_update_notifier_sup, []). init([]) -> ok = couch_config:register(fun ?MODULE:config_change/3), UpdateNotifierExes = couch_config:get("update_notification"), {ok, {{one_for_one, 10, 3600}, lists:map(fun({Name, UpdateNotifierExe}) -> {Name, {couch_db_update_notifier, start_link, [UpdateNotifierExe]}, permanent, 1000, supervisor, [couch_db_update_notifier]} end, UpdateNotifierExes)}}. %% @doc when update_notification configuration changes, terminate the process %% for that notifier and start a new one with the updated config config_change("update_notification", Id, Exe) -> ChildSpec = { Id, {couch_db_update_notifier, start_link, [Exe]}, permanent, 1000, supervisor, [couch_db_update_notifier] }, supervisor:terminate_child(couch_db_update_notifier_sup, Id), supervisor:delete_child(couch_db_update_notifier_sup, Id), supervisor:start_child(couch_db_update_notifier_sup, ChildSpec). apache-couchdb-1.6.0/src/couchdb/couch_passwords.erl0000644000175000001440000001174412332105522022435 0ustar00djcusers00000000000000% Licensed under the Apache License, Version 2.0 (the "License"); you may not % use this file except in compliance with the License. You may obtain a copy of % the License at % % http://www.apache.org/licenses/LICENSE-2.0 % % Unless required by applicable law or agreed to in writing, software % distributed under the License is distributed on an "AS IS" BASIS, WITHOUT % WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the % License for the specific language governing permissions and limitations under % the License. -module(couch_passwords). -export([simple/2, pbkdf2/3, pbkdf2/4, verify/2]). -export([hash_admin_password/1, get_unhashed_admins/0]). -include("couch_db.hrl"). -define(MAX_DERIVED_KEY_LENGTH, (1 bsl 32 - 1)). -define(SHA1_OUTPUT_LENGTH, 20). %% legacy scheme, not used for new passwords. -spec simple(binary(), binary()) -> binary(). simple(Password, Salt) when is_binary(Password), is_binary(Salt) -> ?l2b(couch_util:to_hex(crypto:sha(<>))). %% CouchDB utility functions -spec hash_admin_password(binary()) -> binary(). hash_admin_password(ClearPassword) when is_binary(ClearPassword) -> Iterations = couch_config:get("couch_httpd_auth", "iterations", "10000"), Salt = couch_uuids:random(), DerivedKey = couch_passwords:pbkdf2(couch_util:to_binary(ClearPassword), Salt ,list_to_integer(Iterations)), ?l2b("-pbkdf2-" ++ ?b2l(DerivedKey) ++ "," ++ ?b2l(Salt) ++ "," ++ Iterations). -spec get_unhashed_admins() -> list(). get_unhashed_admins() -> lists:filter( fun({_User, "-hashed-" ++ _}) -> false; % already hashed ({_User, "-pbkdf2-" ++ _}) -> false; % already hashed ({_User, _ClearPassword}) -> true end, couch_config:get("admins")). %% Current scheme, much stronger. -spec pbkdf2(binary(), binary(), integer()) -> binary(). pbkdf2(Password, Salt, Iterations) when is_binary(Password), is_binary(Salt), is_integer(Iterations), Iterations > 0 -> {ok, Result} = pbkdf2(Password, Salt, Iterations, ?SHA1_OUTPUT_LENGTH), Result. -spec pbkdf2(binary(), binary(), integer(), integer()) -> {ok, binary()} | {error, derived_key_too_long}. pbkdf2(_Password, _Salt, _Iterations, DerivedLength) when DerivedLength > ?MAX_DERIVED_KEY_LENGTH -> {error, derived_key_too_long}; pbkdf2(Password, Salt, Iterations, DerivedLength) when is_binary(Password), is_binary(Salt), is_integer(Iterations), Iterations > 0, is_integer(DerivedLength) -> L = ceiling(DerivedLength / ?SHA1_OUTPUT_LENGTH), <> = iolist_to_binary(pbkdf2(Password, Salt, Iterations, L, 1, [])), {ok, ?l2b(couch_util:to_hex(Bin))}. -spec pbkdf2(binary(), binary(), integer(), integer(), integer(), iolist()) -> iolist(). pbkdf2(_Password, _Salt, _Iterations, BlockCount, BlockIndex, Acc) when BlockIndex > BlockCount -> lists:reverse(Acc); pbkdf2(Password, Salt, Iterations, BlockCount, BlockIndex, Acc) -> Block = pbkdf2(Password, Salt, Iterations, BlockIndex, 1, <<>>, <<>>), pbkdf2(Password, Salt, Iterations, BlockCount, BlockIndex + 1, [Block|Acc]). -spec pbkdf2(binary(), binary(), integer(), integer(), integer(), binary(), binary()) -> binary(). pbkdf2(_Password, _Salt, Iterations, _BlockIndex, Iteration, _Prev, Acc) when Iteration > Iterations -> Acc; pbkdf2(Password, Salt, Iterations, BlockIndex, 1, _Prev, _Acc) -> InitialBlock = crypto:sha_mac(Password, <>), pbkdf2(Password, Salt, Iterations, BlockIndex, 2, InitialBlock, InitialBlock); pbkdf2(Password, Salt, Iterations, BlockIndex, Iteration, Prev, Acc) -> Next = crypto:sha_mac(Password, Prev), pbkdf2(Password, Salt, Iterations, BlockIndex, Iteration + 1, Next, crypto:exor(Next, Acc)). %% verify two lists for equality without short-circuits to avoid timing attacks. -spec verify(string(), string(), integer()) -> boolean(). verify([X|RestX], [Y|RestY], Result) -> verify(RestX, RestY, (X bxor Y) bor Result); verify([], [], Result) -> Result == 0. -spec verify(binary(), binary()) -> boolean(); (list(), list()) -> boolean(). verify(<>, <>) -> verify(?b2l(X), ?b2l(Y)); verify(X, Y) when is_list(X) and is_list(Y) -> case length(X) == length(Y) of true -> verify(X, Y, 0); false -> false end; verify(_X, _Y) -> false. -spec ceiling(number()) -> integer(). ceiling(X) -> T = erlang:trunc(X), case (X - T) of Neg when Neg < 0 -> T; Pos when Pos > 0 -> T + 1; _ -> T end. apache-couchdb-1.6.0/src/couchdb/couch_users_db.erl0000644000175000001440000000772612332105522022223 0ustar00djcusers00000000000000% Licensed under the Apache License, Version 2.0 (the "License"); you may not % use this file except in compliance with the License. You may obtain a copy of % the License at % % http://www.apache.org/licenses/LICENSE-2.0 % % Unless required by applicable law or agreed to in writing, software % distributed under the License is distributed on an "AS IS" BASIS, WITHOUT % WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the % License for the specific language governing permissions and limitations under % the License. -module(couch_users_db). -export([before_doc_update/2, after_doc_read/2, strip_non_public_fields/1]). -include("couch_db.hrl"). -define(NAME, <<"name">>). -define(PASSWORD, <<"password">>). -define(DERIVED_KEY, <<"derived_key">>). -define(PASSWORD_SCHEME, <<"password_scheme">>). -define(PBKDF2, <<"pbkdf2">>). -define(ITERATIONS, <<"iterations">>). -define(SALT, <<"salt">>). -define(replace(L, K, V), lists:keystore(K, 1, L, {K, V})). % If the request's userCtx identifies an admin % -> save_doc (see below) % % If the request's userCtx.name is null: % -> save_doc % // this is an anonymous user registering a new document % // in case a user doc with the same id already exists, the anonymous % // user will get a regular doc update conflict. % If the request's userCtx.name doesn't match the doc's name % -> 404 // Not Found % Else % -> save_doc before_doc_update(Doc, #db{user_ctx = UserCtx} = Db) -> #user_ctx{name=Name} = UserCtx, DocName = get_doc_name(Doc), case (catch couch_db:check_is_admin(Db)) of ok -> save_doc(Doc); _ when Name =:= DocName orelse Name =:= null -> save_doc(Doc); _ -> throw(not_found) end. % If newDoc.password == null || newDoc.password == undefined: % -> % noop % Else -> // calculate password hash server side % newDoc.password_sha = hash_pw(newDoc.password + salt) % newDoc.salt = salt % newDoc.password = null save_doc(#doc{body={Body}} = Doc) -> case couch_util:get_value(?PASSWORD, Body) of null -> % server admins don't have a user-db password entry Doc; undefined -> Doc; ClearPassword -> Iterations = list_to_integer(couch_config:get("couch_httpd_auth", "iterations", "1000")), Salt = couch_uuids:random(), DerivedKey = couch_passwords:pbkdf2(ClearPassword, Salt, Iterations), Body0 = [{?PASSWORD_SCHEME, ?PBKDF2}, {?ITERATIONS, Iterations}|Body], Body1 = ?replace(Body0, ?DERIVED_KEY, DerivedKey), Body2 = ?replace(Body1, ?SALT, Salt), Body3 = proplists:delete(?PASSWORD, Body2), Doc#doc{body={Body3}} end. % If the doc is a design doc % If the request's userCtx identifies an admin % -> return doc % Else % -> 403 // Forbidden % If the request's userCtx identifies an admin % -> return doc % If the request's userCtx.name doesn't match the doc's name % -> 404 // Not Found % Else % -> return doc after_doc_read(#doc{id = <>} = Doc, Db) -> case (catch couch_db:check_is_admin(Db)) of ok -> Doc; _ -> throw({forbidden, <<"Only administrators can view design docs in the users database.">>}) end; after_doc_read(Doc, #db{user_ctx = UserCtx} = Db) -> #user_ctx{name=Name} = UserCtx, DocName = get_doc_name(Doc), case (catch couch_db:check_is_admin(Db)) of ok -> Doc; _ when Name =:= DocName -> Doc; _ -> Doc1 = strip_non_public_fields(Doc), case Doc1 of #doc{body={[]}} -> throw(not_found); _ -> Doc1 end end. get_doc_name(#doc{id= <<"org.couchdb.user:", Name/binary>>}) -> Name; get_doc_name(_) -> undefined. strip_non_public_fields(#doc{body={Props}}=Doc) -> Public = re:split(couch_config:get("couch_httpd_auth", "public_fields", ""), "\\s*,\\s*", [{return, binary}]), Doc#doc{body={[{K, V} || {K, V} <- Props, lists:member(K, Public)]}}. apache-couchdb-1.6.0/src/couchdb/couch_secondary_sup.erl0000644000175000001440000000311212332105522023254 0ustar00djcusers00000000000000% Licensed under the Apache License, Version 2.0 (the "License"); you may not % use this file except in compliance with the License. You may obtain a copy of % the License at % % http://www.apache.org/licenses/LICENSE-2.0 % % Unless required by applicable law or agreed to in writing, software % distributed under the License is distributed on an "AS IS" BASIS, WITHOUT % WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the % License for the specific language governing permissions and limitations under % the License. -module(couch_secondary_sup). -behaviour(supervisor). -export([init/1, start_link/0]). start_link() -> supervisor:start_link({local,couch_secondary_services}, ?MODULE, []). init([]) -> SecondarySupervisors = [ {couch_db_update_notifier_sup, {couch_db_update_notifier_sup, start_link, []}, permanent, infinity, supervisor, [couch_db_update_notifier_sup]}, {couch_plugin_event, {gen_event, start_link, [{local, couch_plugin}]}, permanent, brutal_kill, worker, dynamic} ], Children = SecondarySupervisors ++ [ begin {ok, {Module, Fun, Args}} = couch_util:parse_term(SpecStr), {list_to_atom(Name), {Module, Fun, Args}, permanent, brutal_kill, worker, [Module]} end || {Name, SpecStr} <- couch_config:get("daemons"), SpecStr /= ""], {ok, {{one_for_one, 10, 3600}, Children}}. apache-couchdb-1.6.0/src/couchdb/json_stream_parse.erl0000644000175000001440000003322312332105522022741 0ustar00djcusers00000000000000% Licensed under the Apache License, Version 2.0 (the "License"); you may not % use this file except in compliance with the License. You may obtain a copy of % the License at % % http://www.apache.org/licenses/LICENSE-2.0 % % Unless required by applicable law or agreed to in writing, software % distributed under the License is distributed on an "AS IS" BASIS, WITHOUT % WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the % License for the specific language governing permissions and limitations under % the License. -module(json_stream_parse). -export([events/2, to_ejson/1, collect_object/2]). -define(IS_WS(X), (X == $\ orelse X == $\t orelse X == $\n orelse X == $\r)). -define(IS_DELIM(X), (X == $} orelse X == $] orelse X == $,)). -define(IS_DIGIT(X), (X >= $0 andalso X =< $9)). % Parses the json into events. % % The DataFun param is a function that produces the data for parsing. When % called it must yield a tuple, or the atom done. The first element in the % tuple is the data itself, and the second element is a function to be called % next to get the next chunk of data in the stream. % % The EventFun is called everytime a json element is parsed. It must produce % a new function to be called for the next event. % % Events happen each time a new element in the json string is parsed. % For simple value types, the data itself is returned: % Strings % Integers % Floats % true % false % null % % For arrays, the start of the array is signaled by the event array_start % atom. The end is signaled by array_end. The events before the end are the % values, or nested values. % % For objects, the start of the object is signaled by the event object_start % atom. The end is signaled by object_end. Each key is signaled by % {key, KeyString}, and the following event is the value, or start of the % value (array_start, object_start). % events(Data,EventFun) when is_list(Data)-> events(list_to_binary(Data),EventFun); events(Data,EventFun) when is_binary(Data)-> events(fun() -> {Data, fun() -> done end} end,EventFun); events(DataFun,EventFun) -> parse_one(DataFun, EventFun, <<>>). % converts the JSON directly to the erlang represention of Json to_ejson(DF) -> {_DF2, EF, _Rest} = events(DF, fun(Ev) -> collect_events(Ev, []) end), [[EJson]] = make_ejson(EF(get_results), [[]]), EJson. % This function is used to return complete objects while parsing streams. % % Return this function from inside an event function right after getting an % object_start event. It then collects the remaining events for that object % and converts it to the erlang represention of Json. % % It then calls your ReturnControl function with the erlang object. Your % return control function then should yield another event function. % % This example stream parses an array of objects, calling % fun do_something_with_the_object/1 for each object. % % ev_array(array_start) -> % fun(Ev) -> ev_object_loop(Ev) end. % % ev_object_loop(object_start) -> % fun(Ev) -> % json_stream_parse:collect_object(Ev, % fun(Obj) -> % do_something_with_the_object(Obj), % fun(Ev2) -> ev_object_loop(Ev2) end % end) % end; % ev_object_loop(array_end) -> % ok % end. % % % invoke the parse % main() -> % ... % events(Data, fun(Ev) -> ev_array(Ev) end). collect_object(Ev, ReturnControl) -> collect_object(Ev, 0, ReturnControl, [object_start]). % internal methods parse_one(DF,EF,Acc) -> case toke(DF, Acc) of none -> none; {Token, DF2, Rest} -> case Token of "{" -> EF2 = EF(object_start), {DF3, EF3, Rest2} = parse_object(DF2, EF2, Rest), {DF3, EF3(object_end), Rest2}; "[" -> EF2 = EF(array_start), {DF3, EF3, Rest2} = parse_array(DF2, EF2, Rest), {DF3, EF3(array_end), Rest2}; Int when is_integer(Int)-> {DF2, EF(Int), Rest}; Float when is_float(Float)-> {DF2, EF(Float), Rest}; Atom when is_atom(Atom)-> {DF2, EF(Atom), Rest}; String when is_binary(String)-> {DF2, EF(String), Rest}; _OtherToken -> err(unexpected_token) end end. must_parse_one(DF,EF,Acc,Error)-> case parse_one(DF, EF, Acc) of none -> err(Error); Else -> Else end. must_toke(DF, Data, Error) -> case toke(DF, Data) of none -> err(Error); Result -> Result end. toke(DF, <<>>) -> case DF() of done -> none; {Data, DF2} -> toke(DF2, Data) end; toke(DF, <>) when ?IS_WS(C)-> toke(DF, Rest); toke(DF, <<${,Rest/binary>>) -> {"{", DF, Rest}; toke(DF, <<$},Rest/binary>>) -> {"}", DF, Rest}; toke(DF, <<$[,Rest/binary>>) -> {"[", DF, Rest}; toke(DF, <<$],Rest/binary>>) -> {"]", DF, Rest}; toke(DF, <<$",Rest/binary>>) -> toke_string(DF,Rest,[]); toke(DF, <<$,,Rest/binary>>) -> {",", DF, Rest}; toke(DF, <<$:,Rest/binary>>) -> {":", DF, Rest}; toke(DF, <<$-,Rest/binary>>) -> {<> = Data, DF2} = must_df(DF,1,Rest,expected_number), case ?IS_DIGIT(C) of true -> toke_number_leading(DF2, Data, "-"); false -> err(expected_number) end; toke(DF, <> = Data) when ?IS_DIGIT(C) -> toke_number_leading(DF, Data, []); toke(DF, <<$t,Rest/binary>>) -> {Data, DF2} = must_match(<<"rue">>, DF, Rest), {true, DF2, Data}; toke(DF, <<$f,Rest/binary>>) -> {Data, DF2} = must_match(<<"alse">>, DF, Rest), {false, DF2, Data}; toke(DF, <<$n,Rest/binary>>) -> {Data, DF2} = must_match(<<"ull">>, DF, Rest), {null, DF2, Data}; toke(_, _) -> err(bad_token). must_match(Pattern, DF, Data) -> Size = size(Pattern), case must_df(DF, Size, Data, bad_token) of {<>, DF2} -> {Data2, DF2}; {_, _} -> err(bad_token) end. must_df(DF,Error)-> case DF() of done -> err(Error); {Data, DF2} -> {Data, DF2} end. must_df(DF,NeedLen,Acc,Error)-> if size(Acc) >= NeedLen -> {Acc, DF}; true -> case DF() of done -> err(Error); {Data, DF2} -> must_df(DF2, NeedLen, <>, Error) end end. parse_object(DF,EF,Acc) -> case must_toke(DF, Acc, unterminated_object) of {String, DF2, Rest} when is_binary(String)-> EF2 = EF({key,String}), case must_toke(DF2,Rest,unterminated_object) of {":", DF3, Rest2} -> {DF4, EF3, Rest3} = must_parse_one(DF3, EF2, Rest2, expected_value), case must_toke(DF4,Rest3, unterminated_object) of {",", DF5, Rest4} -> parse_object(DF5, EF3, Rest4); {"}", DF5, Rest4} -> {DF5, EF3, Rest4}; {_, _, _} -> err(unexpected_token) end; _Else -> err(expected_colon) end; {"}", DF2, Rest} -> {DF2, EF, Rest}; {_, _, _} -> err(unexpected_token) end. parse_array0(DF,EF,Acc) -> case toke(DF, Acc) of none -> err(unterminated_array); {",", DF2, Rest} -> parse_array(DF2,EF,Rest); {"]", DF2, Rest} -> {DF2,EF,Rest}; _ -> err(unexpected_token) end. parse_array(DF,EF,Acc) -> case toke(DF, Acc) of none -> err(unterminated_array); {Token, DF2, Rest} -> case Token of "{" -> EF2 = EF(object_start), {DF3, EF3, Rest2} = parse_object(DF2, EF2, Rest), parse_array0(DF3, EF3(object_end), Rest2); "[" -> EF2 = EF(array_start), {DF3, EF3, Rest2} = parse_array(DF2, EF2, Rest), parse_array0(DF3, EF3(array_end), Rest2); Int when is_integer(Int)-> parse_array0(DF2, EF(Int), Rest); Float when is_float(Float)-> parse_array0(DF2, EF(Float), Rest); Atom when is_atom(Atom)-> parse_array0(DF2, EF(Atom), Rest); String when is_binary(String)-> parse_array0(DF2, EF(String), Rest); "]" -> {DF2, EF, Rest}; _ -> err(unexpected_token) end end. toke_string(DF, <<>>, Acc) -> {Data, DF2} = must_df(DF, unterminated_string), toke_string(DF2, Data, Acc); toke_string(DF, <<$\\,$",Rest/binary>>, Acc) -> toke_string(DF, Rest, [$" | Acc]); toke_string(DF, <<$\\,$\\,Rest/binary>>, Acc) -> toke_string(DF, Rest, [$\\ | Acc]); toke_string(DF, <<$\\,$/,Rest/binary>>, Acc) -> toke_string(DF, Rest, [$/ | Acc]); toke_string(DF, <<$\\,$b,Rest/binary>>, Acc) -> toke_string(DF, Rest, [$\b | Acc]); toke_string(DF, <<$\\,$f,Rest/binary>>, Acc) -> toke_string(DF, Rest, [$\f | Acc]); toke_string(DF, <<$\\,$n,Rest/binary>>, Acc) -> toke_string(DF, Rest, [$\n | Acc]); toke_string(DF, <<$\\,$r,Rest/binary>>, Acc) -> toke_string(DF, Rest, [$\r | Acc]); toke_string(DF, <<$\\,$t,Rest/binary>>, Acc) -> toke_string(DF, Rest, [$\t | Acc]); toke_string(DF, <<$\\,$u,Rest/binary>>, Acc) -> {<>, DF2} = must_df(DF,4,Rest,missing_hex), UTFChar = erlang:list_to_integer([A, B, C, D], 16), if UTFChar == 16#FFFF orelse UTFChar == 16#FFFE -> err(invalid_utf_char); true -> ok end, Chars = xmerl_ucs:to_utf8(UTFChar), toke_string(DF2, Data, lists:reverse(Chars) ++ Acc); toke_string(DF, <<$\\>>, Acc) -> {Data, DF2} = must_df(DF, unterminated_string), toke_string(DF2, <<$\\,Data/binary>>, Acc); toke_string(_DF, <<$\\, _/binary>>, _Acc) -> err(bad_escape); toke_string(DF, <<$", Rest/binary>>, Acc) -> {list_to_binary(lists:reverse(Acc)), DF, Rest}; toke_string(DF, <>, Acc) -> toke_string(DF, Rest, [C | Acc]). toke_number_leading(DF, <>, Acc) when ?IS_DIGIT(Digit) -> toke_number_leading(DF, Rest, [Digit | Acc]); toke_number_leading(DF, <>=Rest, Acc) when ?IS_WS(C) orelse ?IS_DELIM(C) -> {list_to_integer(lists:reverse(Acc)), DF, Rest}; toke_number_leading(DF, <<>>, Acc) -> case DF() of done -> {list_to_integer(lists:reverse(Acc)), fun() -> done end, <<>>}; {Data, DF2} -> toke_number_leading(DF2, Data, Acc) end; toke_number_leading(DF, <<$., Rest/binary>>, Acc) -> toke_number_trailing(DF, Rest, [$.|Acc]); toke_number_leading(DF, <<$e, Rest/binary>>, Acc) -> toke_number_exponent(DF, Rest, [$e, $0, $.|Acc]); toke_number_leading(DF, <<$E, Rest/binary>>, Acc) -> toke_number_exponent(DF, Rest, [$e, $0, $.|Acc]); toke_number_leading(_, _, _) -> err(unexpected_character_in_number). toke_number_trailing(DF, <>, Acc) when ?IS_DIGIT(Digit) -> toke_number_trailing(DF, Rest, [Digit | Acc]); toke_number_trailing(DF, <>=Rest, Acc) when ?IS_WS(C) orelse ?IS_DELIM(C) -> {list_to_float(lists:reverse(Acc)), DF, Rest}; toke_number_trailing(DF, <<>>, Acc) -> case DF() of done -> {list_to_float(lists:reverse(Acc)), fun() -> done end, <<>>}; {Data, DF2} -> toke_number_trailing(DF2, Data, Acc) end; toke_number_trailing(DF, <<"e", Rest/binary>>, [C|_]=Acc) when C /= $. -> toke_number_exponent(DF, Rest, [$e|Acc]); toke_number_trailing(DF, <<"E", Rest/binary>>, [C|_]=Acc) when C /= $. -> toke_number_exponent(DF, Rest, [$e|Acc]); toke_number_trailing(_, _, _) -> err(unexpected_character_in_number). toke_number_exponent(DF, <>, Acc) when ?IS_DIGIT(Digit) -> toke_number_exponent(DF, Rest, [Digit | Acc]); toke_number_exponent(DF, <>, [$e|_]=Acc) when Sign == $+ orelse Sign == $- -> toke_number_exponent(DF, Rest, [Sign | Acc]); toke_number_exponent(DF, <>=Rest, Acc) when ?IS_WS(C) orelse ?IS_DELIM(C) -> {list_to_float(lists:reverse(Acc)), DF, Rest}; toke_number_exponent(DF, <<>>, Acc) -> case DF() of done -> {list_to_float(lists:reverse(Acc)), fun() -> done end, <<>>}; {Data, DF2} -> toke_number_exponent(DF2, Data, Acc) end; toke_number_exponent(_, _, _) -> err(unexpected_character_in_number). err(Error)-> throw({parse_error,Error}). make_ejson([], Stack) -> Stack; make_ejson([array_start | RevEvs], [ArrayValues, PrevValues | RestStack]) -> make_ejson(RevEvs, [[ArrayValues | PrevValues] | RestStack]); make_ejson([array_end | RevEvs], Stack) -> make_ejson(RevEvs, [[] | Stack]); make_ejson([object_start | RevEvs], [ObjValues, PrevValues | RestStack]) -> make_ejson(RevEvs, [[{ObjValues} | PrevValues] | RestStack]); make_ejson([object_end | RevEvs], Stack) -> make_ejson(RevEvs, [[] | Stack]); make_ejson([{key, String} | RevEvs], [[PrevValue|RestObject] | RestStack] = _Stack) -> make_ejson(RevEvs, [[{String, PrevValue}|RestObject] | RestStack]); make_ejson([Value | RevEvs], [Vals | RestStack] = _Stack) -> make_ejson(RevEvs, [[Value | Vals] | RestStack]). collect_events(get_results, Acc) -> Acc; collect_events(Ev, Acc) -> fun(NextEv) -> collect_events(NextEv, [Ev | Acc]) end. collect_object(object_end, 0, ReturnControl, Acc) -> [[Obj]] = make_ejson([object_end | Acc], [[]]), ReturnControl(Obj); collect_object(object_end, NestCount, ReturnControl, Acc) -> fun(Ev) -> collect_object(Ev, NestCount - 1, ReturnControl, [object_end | Acc]) end; collect_object(object_start, NestCount, ReturnControl, Acc) -> fun(Ev) -> collect_object(Ev, NestCount + 1, ReturnControl, [object_start | Acc]) end; collect_object(Ev, NestCount, ReturnControl, Acc) -> fun(Ev2) -> collect_object(Ev2, NestCount, ReturnControl, [Ev | Acc]) end. apache-couchdb-1.6.0/src/couchdb/couch_doc.erl0000644000175000001440000005434212332105522021156 0ustar00djcusers00000000000000% Licensed under the Apache License, Version 2.0 (the "License"); you may not % use this file except in compliance with the License. You may obtain a copy of % the License at % % http://www.apache.org/licenses/LICENSE-2.0 % % Unless required by applicable law or agreed to in writing, software % distributed under the License is distributed on an "AS IS" BASIS, WITHOUT % WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the % License for the specific language governing permissions and limitations under % the License. -module(couch_doc). -export([to_doc_info/1,to_doc_info_path/1,parse_rev/1,parse_revs/1,rev_to_str/1,revs_to_strs/1]). -export([att_foldl/3,range_att_foldl/5,att_foldl_decode/3,get_validate_doc_fun/1]). -export([from_json_obj/1,to_json_obj/2,has_stubs/1, merge_stubs/2]). -export([validate_docid/1]). -export([doc_from_multi_part_stream/2]). -export([doc_to_multi_part_stream/5, len_doc_to_multi_part_stream/4]). -export([abort_multi_part_stream/1]). -export([to_path/1]). -export([mp_parse_doc/2]). -export([with_ejson_body/1]). -include("couch_db.hrl"). -spec to_path(#doc{}) -> path(). to_path(#doc{revs={Start, RevIds}}=Doc) -> [Branch] = to_branch(Doc, lists:reverse(RevIds)), {Start - length(RevIds) + 1, Branch}. -spec to_branch(#doc{}, [RevId::binary()]) -> [branch()]. to_branch(Doc, [RevId]) -> [{RevId, Doc, []}]; to_branch(Doc, [RevId | Rest]) -> [{RevId, ?REV_MISSING, to_branch(Doc, Rest)}]. % helpers used by to_json_obj to_json_rev(0, []) -> []; to_json_rev(Start, [FirstRevId|_]) -> [{<<"_rev">>, ?l2b([integer_to_list(Start),"-",revid_to_str(FirstRevId)])}]. to_json_body(true, {Body}) -> Body ++ [{<<"_deleted">>, true}]; to_json_body(false, {Body}) -> Body. to_json_revisions(Options, Start, RevIds) -> case lists:member(revs, Options) of false -> []; true -> [{<<"_revisions">>, {[{<<"start">>, Start}, {<<"ids">>, [revid_to_str(R) ||R <- RevIds]}]}}] end. revid_to_str(RevId) when size(RevId) =:= 16 -> ?l2b(couch_util:to_hex(RevId)); revid_to_str(RevId) -> RevId. rev_to_str({Pos, RevId}) -> ?l2b([integer_to_list(Pos),"-",revid_to_str(RevId)]). revs_to_strs([]) -> []; revs_to_strs([{Pos, RevId}| Rest]) -> [rev_to_str({Pos, RevId}) | revs_to_strs(Rest)]. to_json_meta(Meta) -> lists:map( fun({revs_info, Start, RevsInfo}) -> {JsonRevsInfo, _Pos} = lists:mapfoldl( fun({RevId, Status}, PosAcc) -> JsonObj = {[{<<"rev">>, rev_to_str({PosAcc, RevId})}, {<<"status">>, ?l2b(atom_to_list(Status))}]}, {JsonObj, PosAcc - 1} end, Start, RevsInfo), {<<"_revs_info">>, JsonRevsInfo}; ({local_seq, Seq}) -> {<<"_local_seq">>, Seq}; ({conflicts, Conflicts}) -> {<<"_conflicts">>, revs_to_strs(Conflicts)}; ({deleted_conflicts, DConflicts}) -> {<<"_deleted_conflicts">>, revs_to_strs(DConflicts)} end, Meta). to_json_attachments(Attachments, Options) -> to_json_attachments( Attachments, lists:member(attachments, Options), lists:member(follows, Options), lists:member(att_encoding_info, Options) ). to_json_attachments([], _OutputData, _DataToFollow, _ShowEncInfo) -> []; to_json_attachments(Atts, OutputData, DataToFollow, ShowEncInfo) -> AttProps = lists:map( fun(#att{disk_len=DiskLen, att_len=AttLen, encoding=Enc}=Att) -> {Att#att.name, {[ {<<"content_type">>, Att#att.type}, {<<"revpos">>, Att#att.revpos}] ++ case Att#att.md5 of <<>> -> []; Md5 -> EncodedMd5 = base64:encode(Md5), [{<<"digest">>, <<"md5-",EncodedMd5/binary>>}] end ++ if not OutputData orelse Att#att.data == stub -> [{<<"length">>, DiskLen}, {<<"stub">>, true}]; true -> if DataToFollow -> [{<<"length">>, DiskLen}, {<<"follows">>, true}]; true -> AttData = case Enc of gzip -> zlib:gunzip(att_to_bin(Att)); identity -> att_to_bin(Att) end, [{<<"data">>, base64:encode(AttData)}] end end ++ case {ShowEncInfo, Enc} of {false, _} -> []; {true, identity} -> []; {true, _} -> [ {<<"encoding">>, couch_util:to_binary(Enc)}, {<<"encoded_length">>, AttLen} ] end }} end, Atts), [{<<"_attachments">>, {AttProps}}]. to_json_obj(Doc, Options) -> doc_to_json_obj(with_ejson_body(Doc), Options). doc_to_json_obj(#doc{id=Id,deleted=Del,body=Body,revs={Start, RevIds}, meta=Meta}=Doc,Options)-> {[{<<"_id">>, Id}] ++ to_json_rev(Start, RevIds) ++ to_json_body(Del, Body) ++ to_json_revisions(Options, Start, RevIds) ++ to_json_meta(Meta) ++ to_json_attachments(Doc#doc.atts, Options) }. from_json_obj({Props}) -> transfer_fields(Props, #doc{body=[]}); from_json_obj(_Other) -> throw({bad_request, "Document must be a JSON object"}). parse_revid(RevId) when size(RevId) =:= 32 -> RevInt = erlang:list_to_integer(?b2l(RevId), 16), <>; parse_revid(RevId) when length(RevId) =:= 32 -> RevInt = erlang:list_to_integer(RevId, 16), <>; parse_revid(RevId) when is_binary(RevId) -> RevId; parse_revid(RevId) when is_list(RevId) -> ?l2b(RevId). parse_rev(Rev) when is_binary(Rev) -> parse_rev(?b2l(Rev)); parse_rev(Rev) when is_list(Rev) -> SplitRev = lists:splitwith(fun($-) -> false; (_) -> true end, Rev), case SplitRev of {Pos, [$- | RevId]} -> {list_to_integer(Pos), parse_revid(RevId)}; _Else -> throw({bad_request, <<"Invalid rev format">>}) end; parse_rev(_BadRev) -> throw({bad_request, <<"Invalid rev format">>}). parse_revs([]) -> []; parse_revs([Rev | Rest]) -> [parse_rev(Rev) | parse_revs(Rest)]. validate_docid(<<"">>) -> throw({bad_request, <<"Document id must not be empty">>}); validate_docid(Id) when is_binary(Id) -> case couch_util:validate_utf8(Id) of false -> throw({bad_request, <<"Document id must be valid UTF-8">>}); true -> ok end, case Id of <<"_design/", _/binary>> -> ok; <<"_local/", _/binary>> -> ok; <<"_", _/binary>> -> throw({bad_request, <<"Only reserved document ids may start with underscore.">>}); _Else -> ok end; validate_docid(Id) -> ?LOG_DEBUG("Document id is not a string: ~p", [Id]), throw({bad_request, <<"Document id must be a string">>}). transfer_fields([], #doc{body=Fields}=Doc) -> % convert fields back to json object Doc#doc{body={lists:reverse(Fields)}}; transfer_fields([{<<"_id">>, Id} | Rest], Doc) -> validate_docid(Id), transfer_fields(Rest, Doc#doc{id=Id}); transfer_fields([{<<"_rev">>, Rev} | Rest], #doc{revs={0, []}}=Doc) -> {Pos, RevId} = parse_rev(Rev), transfer_fields(Rest, Doc#doc{revs={Pos, [RevId]}}); transfer_fields([{<<"_rev">>, _Rev} | Rest], Doc) -> % we already got the rev from the _revisions transfer_fields(Rest,Doc); transfer_fields([{<<"_attachments">>, {JsonBins}} | Rest], Doc) -> Atts = lists:map(fun({Name, {BinProps}}) -> Md5 = case couch_util:get_value(<<"digest">>, BinProps) of <<"md5-",EncodedMd5/binary>> -> base64:decode(EncodedMd5); _ -> <<>> end, case couch_util:get_value(<<"stub">>, BinProps) of true -> Type = couch_util:get_value(<<"content_type">>, BinProps), RevPos = couch_util:get_value(<<"revpos">>, BinProps, nil), DiskLen = couch_util:get_value(<<"length">>, BinProps), {Enc, EncLen} = att_encoding_info(BinProps), #att{name=Name, data=stub, type=Type, att_len=EncLen, disk_len=DiskLen, encoding=Enc, revpos=RevPos, md5=Md5}; _ -> Type = couch_util:get_value(<<"content_type">>, BinProps, ?DEFAULT_ATTACHMENT_CONTENT_TYPE), RevPos = couch_util:get_value(<<"revpos">>, BinProps, 0), case couch_util:get_value(<<"follows">>, BinProps) of true -> DiskLen = couch_util:get_value(<<"length">>, BinProps), {Enc, EncLen} = att_encoding_info(BinProps), #att{name=Name, data=follows, type=Type, encoding=Enc, att_len=EncLen, disk_len=DiskLen, revpos=RevPos, md5=Md5}; _ -> Value = couch_util:get_value(<<"data">>, BinProps), Bin = base64:decode(Value), LenBin = size(Bin), #att{name=Name, data=Bin, type=Type, att_len=LenBin, disk_len=LenBin, revpos=RevPos} end end end, JsonBins), transfer_fields(Rest, Doc#doc{atts=Atts}); transfer_fields([{<<"_revisions">>, {Props}} | Rest], Doc) -> RevIds = couch_util:get_value(<<"ids">>, Props), Start = couch_util:get_value(<<"start">>, Props), if not is_integer(Start) -> throw({doc_validation, "_revisions.start isn't an integer."}); not is_list(RevIds) -> throw({doc_validation, "_revisions.ids isn't a array."}); true -> ok end, [throw({doc_validation, "RevId isn't a string"}) || RevId <- RevIds, not is_binary(RevId)], RevIds2 = [parse_revid(RevId) || RevId <- RevIds], transfer_fields(Rest, Doc#doc{revs={Start, RevIds2}}); transfer_fields([{<<"_deleted">>, B} | Rest], Doc) when is_boolean(B) -> transfer_fields(Rest, Doc#doc{deleted=B}); % ignored fields transfer_fields([{<<"_revs_info">>, _} | Rest], Doc) -> transfer_fields(Rest, Doc); transfer_fields([{<<"_local_seq">>, _} | Rest], Doc) -> transfer_fields(Rest, Doc); transfer_fields([{<<"_conflicts">>, _} | Rest], Doc) -> transfer_fields(Rest, Doc); transfer_fields([{<<"_deleted_conflicts">>, _} | Rest], Doc) -> transfer_fields(Rest, Doc); % special fields for replication documents transfer_fields([{<<"_replication_state">>, _} = Field | Rest], #doc{body=Fields} = Doc) -> transfer_fields(Rest, Doc#doc{body=[Field|Fields]}); transfer_fields([{<<"_replication_state_time">>, _} = Field | Rest], #doc{body=Fields} = Doc) -> transfer_fields(Rest, Doc#doc{body=[Field|Fields]}); transfer_fields([{<<"_replication_state_reason">>, _} = Field | Rest], #doc{body=Fields} = Doc) -> transfer_fields(Rest, Doc#doc{body=[Field|Fields]}); transfer_fields([{<<"_replication_id">>, _} = Field | Rest], #doc{body=Fields} = Doc) -> transfer_fields(Rest, Doc#doc{body=[Field|Fields]}); transfer_fields([{<<"_replication_stats">>, _} = Field | Rest], #doc{body=Fields} = Doc) -> transfer_fields(Rest, Doc#doc{body=[Field|Fields]}); % unknown special field transfer_fields([{<<"_",Name/binary>>, _} | _], _) -> throw({doc_validation, ?l2b(io_lib:format("Bad special document member: _~s", [Name]))}); transfer_fields([Field | Rest], #doc{body=Fields}=Doc) -> transfer_fields(Rest, Doc#doc{body=[Field|Fields]}). att_encoding_info(BinProps) -> DiskLen = couch_util:get_value(<<"length">>, BinProps), case couch_util:get_value(<<"encoding">>, BinProps) of undefined -> {identity, DiskLen}; Enc -> EncodedLen = couch_util:get_value(<<"encoded_length">>, BinProps, DiskLen), {list_to_existing_atom(?b2l(Enc)), EncodedLen} end. to_doc_info(FullDocInfo) -> {DocInfo, _Path} = to_doc_info_path(FullDocInfo), DocInfo. max_seq(Tree, UpdateSeq) -> FoldFun = fun({_Pos, _Key}, Value, _Type, MaxOldSeq) -> case Value of {_Deleted, _DiskPos, OldTreeSeq} -> % Older versions didn't track data sizes. erlang:max(MaxOldSeq, OldTreeSeq); {_Deleted, _DiskPos, OldTreeSeq, _Size} -> erlang:max(MaxOldSeq, OldTreeSeq); _ -> MaxOldSeq end end, couch_key_tree:fold(FoldFun, UpdateSeq, Tree). to_doc_info_path(#full_doc_info{id=Id,rev_tree=Tree,update_seq=Seq}) -> RevInfosAndPath = [ {#rev_info{ deleted = element(1, LeafVal), body_sp = element(2, LeafVal), seq = element(3, LeafVal), rev = {Pos, RevId} }, Path} || {LeafVal, {Pos, [RevId | _]} = Path} <- couch_key_tree:get_all_leafs(Tree) ], SortedRevInfosAndPath = lists:sort( fun({#rev_info{deleted=DeletedA,rev=RevA}, _PathA}, {#rev_info{deleted=DeletedB,rev=RevB}, _PathB}) -> % sort descending by {not deleted, rev} {not DeletedA, RevA} > {not DeletedB, RevB} end, RevInfosAndPath), [{_RevInfo, WinPath}|_] = SortedRevInfosAndPath, RevInfos = [RevInfo || {RevInfo, _Path} <- SortedRevInfosAndPath], {#doc_info{id=Id, high_seq=max_seq(Tree, Seq), revs=RevInfos}, WinPath}. att_foldl(#att{data=Bin}, Fun, Acc) when is_binary(Bin) -> Fun(Bin, Acc); att_foldl(#att{data={Fd,Sp},md5=Md5}, Fun, Acc) -> couch_stream:foldl(Fd, Sp, Md5, Fun, Acc); att_foldl(#att{data=DataFun,att_len=Len}, Fun, Acc) when is_function(DataFun) -> fold_streamed_data(DataFun, Len, Fun, Acc). range_att_foldl(#att{data={Fd,Sp}}, From, To, Fun, Acc) -> couch_stream:range_foldl(Fd, Sp, From, To, Fun, Acc). att_foldl_decode(#att{data={Fd,Sp},md5=Md5,encoding=Enc}, Fun, Acc) -> couch_stream:foldl_decode(Fd, Sp, Md5, Enc, Fun, Acc); att_foldl_decode(#att{data=Fun2,att_len=Len, encoding=identity}, Fun, Acc) -> fold_streamed_data(Fun2, Len, Fun, Acc). att_to_bin(#att{data=Bin}) when is_binary(Bin) -> Bin; att_to_bin(#att{data=Iolist}) when is_list(Iolist) -> iolist_to_binary(Iolist); att_to_bin(#att{data={_Fd,_Sp}}=Att) -> iolist_to_binary( lists:reverse(att_foldl( Att, fun(Bin,Acc) -> [Bin|Acc] end, [] )) ); att_to_bin(#att{data=DataFun, att_len=Len}) when is_function(DataFun)-> iolist_to_binary( lists:reverse(fold_streamed_data( DataFun, Len, fun(Data, Acc) -> [Data | Acc] end, [] )) ). get_validate_doc_fun(#doc{body={Props}}=DDoc) -> case couch_util:get_value(<<"validate_doc_update">>, Props) of undefined -> nil; _Else -> fun(EditDoc, DiskDoc, Ctx, SecObj) -> couch_query_servers:validate_doc_update(DDoc, EditDoc, DiskDoc, Ctx, SecObj) end end. has_stubs(#doc{atts=Atts}) -> has_stubs(Atts); has_stubs([]) -> false; has_stubs([#att{data=stub}|_]) -> true; has_stubs([_Att|Rest]) -> has_stubs(Rest). merge_stubs(#doc{id = Id}, nil) -> throw({missing_stub, <<"Previous revision missing for document ", Id/binary>>}); merge_stubs(#doc{id=Id,atts=MemBins}=StubsDoc, #doc{atts=DiskBins}) -> BinDict = dict:from_list([{Name, Att} || #att{name=Name}=Att <- DiskBins]), MergedBins = lists:map( fun(#att{name=Name, data=stub, revpos=StubRevPos}) -> case dict:find(Name, BinDict) of {ok, #att{revpos=DiskRevPos}=DiskAtt} when DiskRevPos == StubRevPos orelse StubRevPos == nil -> DiskAtt; _ -> throw({missing_stub, <<"id:", Id/binary, ", name:", Name/binary>>}) end; (Att) -> Att end, MemBins), StubsDoc#doc{atts= MergedBins}. fold_streamed_data(_RcvFun, 0, _Fun, Acc) -> Acc; fold_streamed_data(RcvFun, LenLeft, Fun, Acc) when LenLeft > 0-> Bin = RcvFun(), ResultAcc = Fun(Bin, Acc), fold_streamed_data(RcvFun, LenLeft - size(Bin), Fun, ResultAcc). len_doc_to_multi_part_stream(Boundary, JsonBytes, Atts, SendEncodedAtts) -> AttsSize = lists:foldl(fun(Att, AccAttsSize) -> #att{ data=Data, name=Name, att_len=AttLen, disk_len=DiskLen, type=Type, encoding=Encoding } = Att, case Data of stub -> AccAttsSize; _ -> AccAttsSize + 4 + % "\r\n\r\n" case SendEncodedAtts of true -> % header length(integer_to_list(AttLen)) + AttLen; _ -> % header length(integer_to_list(DiskLen)) + DiskLen end + 4 + % "\r\n--" size(Boundary) + % attachment headers % (the length of the Content-Length has already been set) size(Name) + size(Type) + length("\r\nContent-Disposition: attachment; filename=\"\"") + length("\r\nContent-Type: ") + length("\r\nContent-Length: ") + case Encoding of identity -> 0; _ -> length(atom_to_list(Encoding)) + length("\r\nContent-Encoding: ") end end end, 0, Atts), if AttsSize == 0 -> {<<"application/json">>, iolist_size(JsonBytes)}; true -> {<<"multipart/related; boundary=\"", Boundary/binary, "\"">>, 2 + % "--" size(Boundary) + 36 + % "\r\ncontent-type: application/json\r\n\r\n" iolist_size(JsonBytes) + 4 + % "\r\n--" size(Boundary) + + AttsSize + 2 % "--" } end. doc_to_multi_part_stream(Boundary, JsonBytes, Atts, WriteFun, SendEncodedAtts) -> case lists:any(fun(#att{data=Data})-> Data /= stub end, Atts) of true -> WriteFun([<<"--", Boundary/binary, "\r\nContent-Type: application/json\r\n\r\n">>, JsonBytes, <<"\r\n--", Boundary/binary>>]), atts_to_mp(Atts, Boundary, WriteFun, SendEncodedAtts); false -> WriteFun(JsonBytes) end. atts_to_mp([], _Boundary, WriteFun, _SendEncAtts) -> WriteFun(<<"--">>); atts_to_mp([#att{data=stub} | RestAtts], Boundary, WriteFun, SendEncodedAtts) -> atts_to_mp(RestAtts, Boundary, WriteFun, SendEncodedAtts); atts_to_mp([Att | RestAtts], Boundary, WriteFun, SendEncodedAtts) -> #att{ name=Name, att_len=AttLen, disk_len=DiskLen, type=Type, encoding=Encoding } = Att, % write headers LengthBin = case SendEncodedAtts of true -> list_to_binary(integer_to_list(AttLen)); false -> list_to_binary(integer_to_list(DiskLen)) end, WriteFun(<<"\r\nContent-Disposition: attachment; filename=\"", Name/binary, "\"">>), WriteFun(<<"\r\nContent-Type: ", Type/binary>>), WriteFun(<<"\r\nContent-Length: ", LengthBin/binary>>), case Encoding of identity -> ok; _ -> EncodingBin = atom_to_binary(Encoding, latin1), WriteFun(<<"\r\nContent-Encoding: ", EncodingBin/binary>>) end, % write data WriteFun(<<"\r\n\r\n">>), AttFun = case SendEncodedAtts of false -> fun att_foldl_decode/3; true -> fun att_foldl/3 end, AttFun(Att, fun(Data, _) -> WriteFun(Data) end, ok), WriteFun(<<"\r\n--", Boundary/binary>>), atts_to_mp(RestAtts, Boundary, WriteFun, SendEncodedAtts). doc_from_multi_part_stream(ContentType, DataFun) -> Parent = self(), Parser = spawn_link(fun() -> {<<"--",_/binary>>, _, _} = couch_httpd:parse_multipart_request( ContentType, DataFun, fun(Next) -> mp_parse_doc(Next, []) end), unlink(Parent), Parent ! {self(), finished} end), Ref = make_ref(), Parser ! {get_doc_bytes, Ref, self()}, receive {doc_bytes, Ref, DocBytes} -> Doc = from_json_obj(?JSON_DECODE(DocBytes)), % go through the attachments looking for 'follows' in the data, % replace with function that reads the data from MIME stream. ReadAttachmentDataFun = fun() -> Parser ! {get_bytes, Ref, self()}, receive {bytes, Ref, Bytes} -> Bytes end end, Atts2 = lists:map( fun(#att{data=follows}=A) -> A#att{data=ReadAttachmentDataFun}; (A) -> A end, Doc#doc.atts), WaitFun = fun() -> receive {Parser, finished} -> ok end, erlang:put(mochiweb_request_recv, true) end, {ok, Doc#doc{atts=Atts2}, WaitFun, Parser} end. mp_parse_doc({headers, H}, []) -> case couch_util:get_value("content-type", H) of {"application/json", _} -> fun (Next) -> mp_parse_doc(Next, []) end end; mp_parse_doc({body, Bytes}, AccBytes) -> fun (Next) -> mp_parse_doc(Next, [Bytes | AccBytes]) end; mp_parse_doc(body_end, AccBytes) -> receive {get_doc_bytes, Ref, From} -> From ! {doc_bytes, Ref, lists:reverse(AccBytes)} end, fun mp_parse_atts/1. mp_parse_atts(eof) -> ok; mp_parse_atts({headers, _H}) -> fun mp_parse_atts/1; mp_parse_atts({body, Bytes}) -> receive {get_bytes, Ref, From} -> From ! {bytes, Ref, Bytes} end, fun mp_parse_atts/1; mp_parse_atts(body_end) -> fun mp_parse_atts/1. abort_multi_part_stream(Parser) -> abort_multi_part_stream(Parser, erlang:monitor(process, Parser)). abort_multi_part_stream(Parser, MonRef) -> case is_process_alive(Parser) of true -> Parser ! {get_bytes, nil, self()}, receive {bytes, nil, _Bytes} -> abort_multi_part_stream(Parser, MonRef); {'DOWN', MonRef, _, _, _} -> ok end; false -> erlang:demonitor(MonRef, [flush]) end. with_ejson_body(#doc{body = Body} = Doc) when is_binary(Body) -> Doc#doc{body = couch_compress:decompress(Body)}; with_ejson_body(#doc{body = {_}} = Doc) -> Doc. apache-couchdb-1.6.0/src/couchdb/couch_compress.erl0000644000175000001440000000514712332105522022243 0ustar00djcusers00000000000000% Licensed under the Apache License, Version 2.0 (the "License"); you may not % use this file except in compliance with the License. You may obtain a copy of % the License at % % http://www.apache.org/licenses/LICENSE-2.0 % % Unless required by applicable law or agreed to in writing, software % distributed under the License is distributed on an "AS IS" BASIS, WITHOUT % WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the % License for the specific language governing permissions and limitations under % the License. -module(couch_compress). -export([compress/2, decompress/1, is_compressed/2]). -export([get_compression_method/0]). -include("couch_db.hrl"). % binaries compressed with snappy have their first byte set to this value -define(SNAPPY_PREFIX, 1). % Term prefixes documented at: % http://www.erlang.org/doc/apps/erts/erl_ext_dist.html -define(TERM_PREFIX, 131). -define(COMPRESSED_TERM_PREFIX, 131, 80). get_compression_method() -> case couch_config:get("couchdb", "file_compression") of undefined -> ?DEFAULT_COMPRESSION; Method1 -> case string:tokens(Method1, "_") of [Method] -> list_to_existing_atom(Method); [Method, Level] -> {list_to_existing_atom(Method), list_to_integer(Level)} end end. compress(<> = Bin, snappy) -> Bin; compress(<> = Bin, Method) -> compress(decompress(Bin), Method); compress(<> = Bin, Method) -> compress(decompress(Bin), Method); compress(Term, none) -> ?term_to_bin(Term); compress(Term, {deflate, Level}) -> term_to_binary(Term, [{minor_version, 1}, {compressed, Level}]); compress(Term, snappy) -> Bin = ?term_to_bin(Term), try {ok, CompressedBin} = snappy:compress(Bin), case byte_size(CompressedBin) < byte_size(Bin) of true -> <>; false -> Bin end catch exit:snappy_nif_not_loaded -> Bin end. decompress(<>) -> {ok, TermBin} = snappy:decompress(Rest), binary_to_term(TermBin); decompress(<> = Bin) -> binary_to_term(Bin). is_compressed(<>, Method) -> Method =:= snappy; is_compressed(<>, {deflate, _Level}) -> true; is_compressed(<>, _Method) -> false; is_compressed(<>, Method) -> Method =:= none; is_compressed(Term, _Method) when not is_binary(Term) -> false. apache-couchdb-1.6.0/src/couchdb/couch_httpd_stats_handlers.erl0000644000175000001440000000367112332105522024631 0ustar00djcusers00000000000000% Licensed under the Apache License, Version 2.0 (the "License"); you may not % use this file except in compliance with the License. You may obtain a copy of % the License at % % http://www.apache.org/licenses/LICENSE-2.0 % % Unless required by applicable law or agreed to in writing, software % distributed under the License is distributed on an "AS IS" BASIS, WITHOUT % WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the % License for the specific language governing permissions and limitations under % the License. -module(couch_httpd_stats_handlers). -include("couch_db.hrl"). -export([handle_stats_req/1]). -import(couch_httpd, [ send_json/2, send_json/3, send_json/4, send_method_not_allowed/2, start_json_response/2, send_chunk/2, end_json_response/1, start_chunked_response/3, send_error/4 ]). handle_stats_req(#httpd{method='GET', path_parts=[_]}=Req) -> flush(Req), send_json(Req, couch_stats_aggregator:all(range(Req))); handle_stats_req(#httpd{method='GET', path_parts=[_, _Mod]}) -> throw({bad_request, <<"Stat names must have exactly two parts.">>}); handle_stats_req(#httpd{method='GET', path_parts=[_, Mod, Key]}=Req) -> flush(Req), Stats = couch_stats_aggregator:get_json({list_to_atom(binary_to_list(Mod)), list_to_atom(binary_to_list(Key))}, range(Req)), send_json(Req, {[{Mod, {[{Key, Stats}]}}]}); handle_stats_req(#httpd{method='GET', path_parts=[_, _Mod, _Key | _Extra]}) -> throw({bad_request, <<"Stat names must have exactly two parts.">>}); handle_stats_req(Req) -> send_method_not_allowed(Req, "GET"). range(Req) -> case couch_util:get_value("range", couch_httpd:qs(Req)) of undefined -> 0; Value -> list_to_integer(Value) end. flush(Req) -> case couch_util:get_value("flush", couch_httpd:qs(Req)) of "true" -> couch_stats_aggregator:collect_sample(); _Else -> ok end. apache-couchdb-1.6.0/src/couchdb/couch_server_sup.erl0000644000175000001440000001122512332105522022577 0ustar00djcusers00000000000000% Licensed under the Apache License, Version 2.0 (the "License"); you may not % use this file except in compliance with the License. You may obtain a copy of % the License at % % http://www.apache.org/licenses/LICENSE-2.0 % % Unless required by applicable law or agreed to in writing, software % distributed under the License is distributed on an "AS IS" BASIS, WITHOUT % WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the % License for the specific language governing permissions and limitations under % the License. -module(couch_server_sup). -behaviour(supervisor). -export([start_link/1,stop/0, couch_config_start_link_wrapper/2, restart_core_server/0, config_change/2]). -include("couch_db.hrl"). %% supervisor callbacks -export([init/1]). start_link(IniFiles) -> case whereis(couch_server_sup) of undefined -> start_server(IniFiles); _Else -> {error, already_started} end. restart_core_server() -> init:restart(). couch_config_start_link_wrapper(IniFiles, FirstConfigPid) -> case is_process_alive(FirstConfigPid) of true -> link(FirstConfigPid), {ok, FirstConfigPid}; false -> couch_config:start_link(IniFiles) end. start_server(IniFiles) -> case init:get_argument(pidfile) of {ok, [PidFile]} -> case file:write_file(PidFile, os:getpid()) of ok -> ok; {error, Reason} -> io:format("Failed to write PID file ~s: ~s", [PidFile, file:format_error(Reason)]) end; _ -> ok end, {ok, ConfigPid} = couch_config:start_link(IniFiles), LogLevel = couch_config:get("log", "level", "info"), % announce startup io:format("Apache CouchDB ~s (LogLevel=~s) is starting.~n", [ couch_server:get_version(), LogLevel ]), case LogLevel of "debug" -> io:format("Configuration Settings ~p:~n", [IniFiles]), [io:format(" [~s] ~s=~p~n", [Module, Variable, Value]) || {{Module, Variable}, Value} <- couch_config:all()]; _ -> ok end, BaseChildSpecs = {{one_for_all, 10, 3600}, [{couch_config, {couch_server_sup, couch_config_start_link_wrapper, [IniFiles, ConfigPid]}, permanent, brutal_kill, worker, [couch_config]}, {couch_primary_services, {couch_primary_sup, start_link, []}, permanent, infinity, supervisor, [couch_primary_sup]}, {couch_secondary_services, {couch_secondary_sup, start_link, []}, permanent, infinity, supervisor, [couch_secondary_sup]} ]}, % ensure these applications are running application:start(ibrowse), application:start(crypto), {ok, Pid} = supervisor:start_link( {local, couch_server_sup}, couch_server_sup, BaseChildSpecs), % launch the icu bridge % just restart if one of the config settings change. couch_config:register(fun ?MODULE:config_change/2, Pid), unlink(ConfigPid), Ip = couch_config:get("httpd", "bind_address"), io:format("Apache CouchDB has started. Time to relax.~n"), Uris = [get_uri(Name, Ip) || Name <- [couch_httpd, https]], [begin case Uri of undefined -> ok; Uri -> ?LOG_INFO("Apache CouchDB has started on ~s", [Uri]) end end || Uri <- Uris], case couch_config:get("couchdb", "uri_file", null) of null -> ok; UriFile -> Lines = [begin case Uri of undefined -> []; Uri -> io_lib:format("~s~n", [Uri]) end end || Uri <- Uris], case file:write_file(UriFile, Lines) of ok -> ok; {error, Reason2} = Error -> ?LOG_ERROR("Failed to write to URI file ~s: ~s", [UriFile, file:format_error(Reason2)]), throw(Error) end end, {ok, Pid}. stop() -> catch exit(whereis(couch_server_sup), normal). config_change("daemons", _) -> supervisor:terminate_child(couch_server_sup, couch_secondary_services), supervisor:restart_child(couch_server_sup, couch_secondary_services); config_change("couchdb", "util_driver_dir") -> init:restart(). init(ChildSpecs) -> {ok, ChildSpecs}. get_uri(Name, Ip) -> case get_port(Name) of undefined -> undefined; Port -> io_lib:format("~s://~s:~w/", [get_scheme(Name), Ip, Port]) end. get_scheme(couch_httpd) -> "http"; get_scheme(https) -> "https". get_port(Name) -> try mochiweb_socket_server:get(Name, port) catch exit:{noproc, _}-> undefined end. apache-couchdb-1.6.0/src/couchdb/couch_httpd.erl0000644000175000001440000011452112332105522021530 0ustar00djcusers00000000000000% Licensed under the Apache License, Version 2.0 (the "License"); you may not % use this file except in compliance with the License. You may obtain a copy of % the License at % % http://www.apache.org/licenses/LICENSE-2.0 % % Unless required by applicable law or agreed to in writing, software % distributed under the License is distributed on an "AS IS" BASIS, WITHOUT % WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the % License for the specific language governing permissions and limitations under % the License. -module(couch_httpd). -include("couch_db.hrl"). -export([start_link/0, start_link/1, stop/0, config_change/2, handle_request/5]). -export([header_value/2,header_value/3,qs_value/2,qs_value/3,qs/1,qs_json_value/3]). -export([path/1,absolute_uri/2,body_length/1]). -export([verify_is_server_admin/1,unquote/1,quote/1,recv/2,recv_chunked/4,error_info/1]). -export([make_fun_spec_strs/1]). -export([make_arity_1_fun/1, make_arity_2_fun/1, make_arity_3_fun/1]). -export([parse_form/1,json_body/1,json_body_obj/1,body/1]). -export([doc_etag/1, make_etag/1, etag_match/2, etag_respond/3, etag_maybe/2]). -export([primary_header_value/2,partition/1,serve_file/3,serve_file/4, server_header/0]). -export([start_chunked_response/3,send_chunk/2,log_request/2]). -export([start_response_length/4, start_response/3, send/2]). -export([start_json_response/2, start_json_response/3, end_json_response/1]). -export([send_response/4,send_method_not_allowed/2,send_error/2,send_error/4, send_redirect/2,send_chunked_error/2]). -export([send_json/2,send_json/3,send_json/4,last_chunk/1,parse_multipart_request/3]). -export([accepted_encodings/1,handle_request_int/5,validate_referer/1,validate_ctype/2]). -export([http_1_0_keep_alive/2]). start_link() -> start_link(http). start_link(http) -> Port = couch_config:get("httpd", "port", "5984"), start_link(?MODULE, [{port, Port}]); start_link(https) -> Port = couch_config:get("ssl", "port", "6984"), ServerOpts0 = [{cacertfile, couch_config:get("ssl", "cacert_file", nil)}, {keyfile, couch_config:get("ssl", "key_file", nil)}, {certfile, couch_config:get("ssl", "cert_file", nil)}, {password, couch_config:get("ssl", "password", nil)}], case (couch_util:get_value(keyfile, ServerOpts0) == nil orelse couch_util:get_value(certfile, ServerOpts0) == nil) of true -> io:format("SSL enabled but PEM certificates are missing.", []), throw({error, missing_certs}); false -> ok end, ServerOpts = [Opt || {_, V}=Opt <- ServerOpts0, V /= nil], ClientOpts = case couch_config:get("ssl", "verify_ssl_certificates", "false") of "false" -> []; "true" -> [{depth, list_to_integer(couch_config:get("ssl", "ssl_certificate_max_depth", "1"))}, {verify, verify_peer}] ++ case couch_config:get("ssl", "verify_fun", nil) of nil -> []; SpecStr -> [{verify_fun, make_arity_3_fun(SpecStr)}] end end, SslOpts = ServerOpts ++ ClientOpts, Options = [{port, Port}, {ssl, true}, {ssl_opts, SslOpts}], start_link(https, Options). start_link(Name, Options) -> % read config and register for configuration changes % just stop if one of the config settings change. couch_server_sup % will restart us and then we will pick up the new settings. BindAddress = couch_config:get("httpd", "bind_address", any), validate_bind_address(BindAddress), DefaultSpec = "{couch_httpd_db, handle_request}", DefaultFun = make_arity_1_fun( couch_config:get("httpd", "default_handler", DefaultSpec) ), UrlHandlersList = lists:map( fun({UrlKey, SpecStr}) -> {?l2b(UrlKey), make_arity_1_fun(SpecStr)} end, couch_config:get("httpd_global_handlers")), DbUrlHandlersList = lists:map( fun({UrlKey, SpecStr}) -> {?l2b(UrlKey), make_arity_2_fun(SpecStr)} end, couch_config:get("httpd_db_handlers")), DesignUrlHandlersList = lists:map( fun({UrlKey, SpecStr}) -> {?l2b(UrlKey), make_arity_3_fun(SpecStr)} end, couch_config:get("httpd_design_handlers")), UrlHandlers = dict:from_list(UrlHandlersList), DbUrlHandlers = dict:from_list(DbUrlHandlersList), DesignUrlHandlers = dict:from_list(DesignUrlHandlersList), {ok, ServerOptions} = couch_util:parse_term( couch_config:get("httpd", "server_options", "[]")), {ok, SocketOptions} = couch_util:parse_term( couch_config:get("httpd", "socket_options", "[]")), set_auth_handlers(), % ensure uuid is set so that concurrent replications % get the same value. couch_server:get_uuid(), Loop = fun(Req)-> case SocketOptions of [] -> ok; _ -> ok = mochiweb_socket:setopts(Req:get(socket), SocketOptions) end, apply(?MODULE, handle_request, [ Req, DefaultFun, UrlHandlers, DbUrlHandlers, DesignUrlHandlers ]) end, % set mochiweb options FinalOptions = lists:append([Options, ServerOptions, [ {loop, Loop}, {name, Name}, {ip, BindAddress}]]), % launch mochiweb {ok, Pid} = case mochiweb_http:start(FinalOptions) of {ok, MochiPid} -> {ok, MochiPid}; {error, Reason} -> io:format("Failure to start Mochiweb: ~s~n",[Reason]), throw({error, Reason}) end, ok = couch_config:register(fun ?MODULE:config_change/2, Pid), {ok, Pid}. stop() -> mochiweb_http:stop(couch_httpd), mochiweb_http:stop(https). config_change("httpd", "bind_address") -> ?MODULE:stop(); config_change("httpd", "port") -> ?MODULE:stop(); config_change("httpd", "default_handler") -> ?MODULE:stop(); config_change("httpd", "server_options") -> ?MODULE:stop(); config_change("httpd", "socket_options") -> ?MODULE:stop(); config_change("httpd", "authentication_handlers") -> set_auth_handlers(); config_change("httpd_global_handlers", _) -> ?MODULE:stop(); config_change("httpd_db_handlers", _) -> ?MODULE:stop(); config_change("ssl", _) -> ?MODULE:stop(). set_auth_handlers() -> AuthenticationSrcs = make_fun_spec_strs( couch_config:get("httpd", "authentication_handlers", "")), AuthHandlers = lists:map( fun(A) -> {make_arity_1_fun(A), ?l2b(A)} end, AuthenticationSrcs), ok = application:set_env(couch, auth_handlers, AuthHandlers). % SpecStr is a string like "{my_module, my_fun}" % or "{my_module, my_fun, <<"my_arg">>}" make_arity_1_fun(SpecStr) -> case couch_util:parse_term(SpecStr) of {ok, {Mod, Fun, SpecArg}} -> fun(Arg) -> Mod:Fun(Arg, SpecArg) end; {ok, {Mod, Fun}} -> fun(Arg) -> Mod:Fun(Arg) end end. make_arity_2_fun(SpecStr) -> case couch_util:parse_term(SpecStr) of {ok, {Mod, Fun, SpecArg}} -> fun(Arg1, Arg2) -> Mod:Fun(Arg1, Arg2, SpecArg) end; {ok, {Mod, Fun}} -> fun(Arg1, Arg2) -> Mod:Fun(Arg1, Arg2) end end. make_arity_3_fun(SpecStr) -> case couch_util:parse_term(SpecStr) of {ok, {Mod, Fun, SpecArg}} -> fun(Arg1, Arg2, Arg3) -> Mod:Fun(Arg1, Arg2, Arg3, SpecArg) end; {ok, {Mod, Fun}} -> fun(Arg1, Arg2, Arg3) -> Mod:Fun(Arg1, Arg2, Arg3) end end. % SpecStr is "{my_module, my_fun}, {my_module2, my_fun2}" make_fun_spec_strs(SpecStr) -> re:split(SpecStr, "(?<=})\\s*,\\s*(?={)", [{return, list}]). handle_request(MochiReq, DefaultFun, UrlHandlers, DbUrlHandlers, DesignUrlHandlers) -> %% reset rewrite count for new request erlang:put(?REWRITE_COUNT, 0), MochiReq1 = couch_httpd_vhost:dispatch_host(MochiReq), handle_request_int(MochiReq1, DefaultFun, UrlHandlers, DbUrlHandlers, DesignUrlHandlers). handle_request_int(MochiReq, DefaultFun, UrlHandlers, DbUrlHandlers, DesignUrlHandlers) -> Begin = now(), % for the path, use the raw path with the query string and fragment % removed, but URL quoting left intact RawUri = MochiReq:get(raw_path), {"/" ++ Path, _, _} = mochiweb_util:urlsplit_path(RawUri), Headers = MochiReq:get(headers), % get requested path RequestedPath = case MochiReq:get_header_value("x-couchdb-vhost-path") of undefined -> case MochiReq:get_header_value("x-couchdb-requested-path") of undefined -> RawUri; R -> R end; P -> P end, HandlerKey = case mochiweb_util:partition(Path, "/") of {"", "", ""} -> <<"/">>; % Special case the root url handler {FirstPart, _, _} -> list_to_binary(FirstPart) end, ?LOG_DEBUG("~p ~s ~p from ~p~nHeaders: ~p", [ MochiReq:get(method), RawUri, MochiReq:get(version), MochiReq:get(peer), mochiweb_headers:to_list(MochiReq:get(headers)) ]), Method1 = case MochiReq:get(method) of % already an atom Meth when is_atom(Meth) -> Meth; % Non standard HTTP verbs aren't atoms (COPY, MOVE etc) so convert when % possible (if any module references the atom, then it's existing). Meth -> couch_util:to_existing_atom(Meth) end, increment_method_stats(Method1), % allow broken HTTP clients to fake a full method vocabulary with an X-HTTP-METHOD-OVERRIDE header MethodOverride = MochiReq:get_primary_header_value("X-HTTP-Method-Override"), Method2 = case lists:member(MethodOverride, ["GET", "HEAD", "POST", "PUT", "DELETE", "TRACE", "CONNECT", "COPY"]) of true -> ?LOG_INFO("MethodOverride: ~s (real method was ~s)", [MethodOverride, Method1]), case Method1 of 'POST' -> couch_util:to_existing_atom(MethodOverride); _ -> % Ignore X-HTTP-Method-Override when the original verb isn't POST. % I'd like to send a 406 error to the client, but that'd require a nasty refactor. % throw({not_acceptable, <<"X-HTTP-Method-Override may only be used with POST requests.">>}) Method1 end; _ -> Method1 end, % alias HEAD to GET as mochiweb takes care of stripping the body Method = case Method2 of 'HEAD' -> 'GET'; Other -> Other end, HttpReq = #httpd{ mochi_req = MochiReq, peer = MochiReq:get(peer), method = Method, requested_path_parts = [?l2b(unquote(Part)) || Part <- string:tokens(RequestedPath, "/")], path_parts = [?l2b(unquote(Part)) || Part <- string:tokens(Path, "/")], db_url_handlers = DbUrlHandlers, design_url_handlers = DesignUrlHandlers, default_fun = DefaultFun, url_handlers = UrlHandlers, user_ctx = erlang:erase(pre_rewrite_user_ctx), auth = erlang:erase(pre_rewrite_auth) }, HandlerFun = couch_util:dict_find(HandlerKey, UrlHandlers, DefaultFun), {ok, AuthHandlers} = application:get_env(couch, auth_handlers), {ok, Resp} = try check_request_uri_length(RawUri), case couch_httpd_cors:is_preflight_request(HttpReq) of #httpd{} -> case authenticate_request(HttpReq, AuthHandlers) of #httpd{} = Req -> HandlerFun(Req); Response -> Response end; Response -> Response end catch throw:{http_head_abort, Resp0} -> {ok, Resp0}; throw:{invalid_json, S} -> ?LOG_ERROR("attempted upload of invalid JSON (set log_level to debug to log it)", []), ?LOG_DEBUG("Invalid JSON: ~p",[S]), send_error(HttpReq, {bad_request, invalid_json}); throw:unacceptable_encoding -> ?LOG_ERROR("unsupported encoding method for the response", []), send_error(HttpReq, {not_acceptable, "unsupported encoding"}); throw:bad_accept_encoding_value -> ?LOG_ERROR("received invalid Accept-Encoding header", []), send_error(HttpReq, bad_request); exit:normal -> exit(normal); exit:snappy_nif_not_loaded -> ErrorReason = "To access the database or view index, Apache CouchDB" " must be built with Erlang OTP R13B04 or higher.", ?LOG_ERROR("~s", [ErrorReason]), send_error(HttpReq, {bad_otp_release, ErrorReason}); exit:{body_too_large, _} -> send_error(HttpReq, request_entity_too_large); exit:{uri_too_long, _} -> send_error(HttpReq, request_uri_too_long); throw:Error -> Stack = erlang:get_stacktrace(), ?LOG_DEBUG("Minor error in HTTP request: ~p",[Error]), ?LOG_DEBUG("Stacktrace: ~p",[Stack]), send_error(HttpReq, Error); error:badarg -> Stack = erlang:get_stacktrace(), ?LOG_ERROR("Badarg error in HTTP request",[]), ?LOG_INFO("Stacktrace: ~p",[Stack]), send_error(HttpReq, badarg); error:function_clause -> Stack = erlang:get_stacktrace(), ?LOG_ERROR("function_clause error in HTTP request",[]), ?LOG_INFO("Stacktrace: ~p",[Stack]), send_error(HttpReq, function_clause); Tag:Error -> Stack = erlang:get_stacktrace(), ?LOG_ERROR("Uncaught error in HTTP request: ~p",[{Tag, Error}]), ?LOG_INFO("Stacktrace: ~p",[Stack]), send_error(HttpReq, Error) end, RequestTime = round(timer:now_diff(now(), Begin)/1000), couch_stats_collector:record({couchdb, request_time}, RequestTime), couch_stats_collector:increment({httpd, requests}), {ok, Resp}. check_request_uri_length(Uri) -> check_request_uri_length(Uri, couch_config:get("httpd", "max_uri_length")). check_request_uri_length(_Uri, undefined) -> ok; check_request_uri_length(Uri, MaxUriLen) when is_list(MaxUriLen) -> case length(Uri) > list_to_integer(MaxUriLen) of true -> throw(request_uri_too_long); false -> ok end. % Try authentication handlers in order until one sets a user_ctx % the auth funs also have the option of returning a response % move this to couch_httpd_auth? authenticate_request(#httpd{user_ctx=#user_ctx{}} = Req, _AuthHandlers) -> Req; authenticate_request(#httpd{} = Req, []) -> case couch_config:get("couch_httpd_auth", "require_valid_user", "false") of "true" -> throw({unauthorized, <<"Authentication required.">>}); "false" -> Req#httpd{user_ctx=#user_ctx{}} end; authenticate_request(#httpd{} = Req, [{AuthFun, AuthSrc} | RestAuthHandlers]) -> R = case AuthFun(Req) of #httpd{user_ctx=#user_ctx{}=UserCtx}=Req2 -> Req2#httpd{user_ctx=UserCtx#user_ctx{handler=AuthSrc}}; Else -> Else end, authenticate_request(R, RestAuthHandlers); authenticate_request(Response, _AuthSrcs) -> Response. increment_method_stats(Method) -> couch_stats_collector:increment({httpd_request_methods, Method}). validate_referer(Req) -> Host = host_for_request(Req), Referer = header_value(Req, "Referer", fail), case Referer of fail -> throw({bad_request, <<"Referer header required.">>}); Referer -> {_,RefererHost,_,_,_} = mochiweb_util:urlsplit(Referer), if RefererHost =:= Host -> ok; true -> throw({bad_request, <<"Referer header must match host.">>}) end end. validate_ctype(Req, Ctype) -> case header_value(Req, "Content-Type") of undefined -> throw({bad_ctype, "Content-Type must be "++Ctype}); ReqCtype -> case string:tokens(ReqCtype, ";") of [Ctype] -> ok; [Ctype, _Rest] -> ok; _Else -> throw({bad_ctype, "Content-Type must be "++Ctype}) end end. % Utilities partition(Path) -> mochiweb_util:partition(Path, "/"). header_value(#httpd{mochi_req=MochiReq}, Key) -> MochiReq:get_header_value(Key). header_value(#httpd{mochi_req=MochiReq}, Key, Default) -> case MochiReq:get_header_value(Key) of undefined -> Default; Value -> Value end. primary_header_value(#httpd{mochi_req=MochiReq}, Key) -> MochiReq:get_primary_header_value(Key). accepted_encodings(#httpd{mochi_req=MochiReq}) -> case MochiReq:accepted_encodings(["gzip", "identity"]) of bad_accept_encoding_value -> throw(bad_accept_encoding_value); [] -> throw(unacceptable_encoding); EncList -> EncList end. serve_file(Req, RelativePath, DocumentRoot) -> serve_file(Req, RelativePath, DocumentRoot, []). serve_file(#httpd{mochi_req=MochiReq}=Req, RelativePath, DocumentRoot, ExtraHeaders) -> log_request(Req, 200), ResponseHeaders = server_header() ++ couch_httpd_auth:cookie_auth_header(Req, []) ++ ExtraHeaders, {ok, MochiReq:serve_file(RelativePath, DocumentRoot, couch_httpd_cors:cors_headers(Req, ResponseHeaders))}. qs_value(Req, Key) -> qs_value(Req, Key, undefined). qs_value(Req, Key, Default) -> couch_util:get_value(Key, qs(Req), Default). qs_json_value(Req, Key, Default) -> case qs_value(Req, Key, Default) of Default -> Default; Result -> ?JSON_DECODE(Result) end. qs(#httpd{mochi_req=MochiReq}) -> MochiReq:parse_qs(). path(#httpd{mochi_req=MochiReq}) -> MochiReq:get(path). host_for_request(#httpd{mochi_req=MochiReq}) -> XHost = couch_config:get("httpd", "x_forwarded_host", "X-Forwarded-Host"), case MochiReq:get_header_value(XHost) of undefined -> case MochiReq:get_header_value("Host") of undefined -> {ok, {Address, Port}} = case MochiReq:get(socket) of {ssl, SslSocket} -> ssl:sockname(SslSocket); Socket -> inet:sockname(Socket) end, inet_parse:ntoa(Address) ++ ":" ++ integer_to_list(Port); Value1 -> Value1 end; Value -> Value end. absolute_uri(#httpd{mochi_req=MochiReq}=Req, Path) -> Host = host_for_request(Req), XSsl = couch_config:get("httpd", "x_forwarded_ssl", "X-Forwarded-Ssl"), Scheme = case MochiReq:get_header_value(XSsl) of "on" -> "https"; _ -> XProto = couch_config:get("httpd", "x_forwarded_proto", "X-Forwarded-Proto"), case MochiReq:get_header_value(XProto) of %% Restrict to "https" and "http" schemes only "https" -> "https"; _ -> case MochiReq:get(scheme) of https -> "https"; http -> "http" end end end, Scheme ++ "://" ++ Host ++ Path. unquote(UrlEncodedString) -> mochiweb_util:unquote(UrlEncodedString). quote(UrlDecodedString) -> mochiweb_util:quote_plus(UrlDecodedString). parse_form(#httpd{mochi_req=MochiReq}) -> mochiweb_multipart:parse_form(MochiReq). recv(#httpd{mochi_req=MochiReq}, Len) -> MochiReq:recv(Len). recv_chunked(#httpd{mochi_req=MochiReq}, MaxChunkSize, ChunkFun, InitState) -> % Fun is called once with each chunk % Fun({Length, Binary}, State) % called with Length == 0 on the last time. MochiReq:stream_body(MaxChunkSize, ChunkFun, InitState). body_length(#httpd{mochi_req=MochiReq}) -> MochiReq:get(body_length). body(#httpd{mochi_req=MochiReq, req_body=undefined}) -> MaxSize = list_to_integer( couch_config:get("couchdb", "max_document_size", "4294967296")), MochiReq:recv_body(MaxSize); body(#httpd{req_body=ReqBody}) -> ReqBody. json_body(Httpd) -> ?JSON_DECODE(maybe_decompress(Httpd, body(Httpd))). json_body_obj(Httpd) -> case json_body(Httpd) of {Props} -> {Props}; _Else -> throw({bad_request, "Request body must be a JSON object"}) end. maybe_decompress(Httpd, Body) -> case header_value(Httpd, "Content-Encoding", "identity") of "gzip" -> zlib:gunzip(Body); "identity" -> Body; Else -> throw({bad_ctype, [Else, " is not a supported content encoding."]}) end. doc_etag(#doc{revs={Start, [DiskRev|_]}}) -> "\"" ++ ?b2l(couch_doc:rev_to_str({Start, DiskRev})) ++ "\"". make_etag(Term) -> <> = couch_util:md5(term_to_binary(Term)), iolist_to_binary([$", io_lib:format("~.36B", [SigInt]), $"]). etag_match(Req, CurrentEtag) when is_binary(CurrentEtag) -> etag_match(Req, binary_to_list(CurrentEtag)); etag_match(Req, CurrentEtag) -> EtagsToMatch = string:tokens( header_value(Req, "If-None-Match", ""), ", "), lists:member(CurrentEtag, EtagsToMatch). etag_respond(Req, CurrentEtag, RespFun) -> case etag_match(Req, CurrentEtag) of true -> % the client has this in their cache. send_response(Req, 304, [{"ETag", CurrentEtag}], <<>>); false -> % Run the function. RespFun() end. etag_maybe(Req, RespFun) -> try RespFun() catch throw:{etag_match, ETag} -> send_response(Req, 304, [{"ETag", ETag}], <<>>) end. verify_is_server_admin(#httpd{user_ctx=UserCtx}) -> verify_is_server_admin(UserCtx); verify_is_server_admin(#user_ctx{roles=Roles}) -> case lists:member(<<"_admin">>, Roles) of true -> ok; false -> throw({unauthorized, <<"You are not a server admin.">>}) end. log_request(#httpd{mochi_req=MochiReq,peer=Peer}=Req, Code) -> ?LOG_INFO("~s - - ~s ~s ~B", [ Peer, MochiReq:get(method), MochiReq:get(raw_path), Code ]), gen_event:notify(couch_plugin, {log_request, Req, Code}). start_response_length(#httpd{mochi_req=MochiReq}=Req, Code, Headers, Length) -> log_request(Req, Code), couch_stats_collector:increment({httpd_status_codes, Code}), Headers1 = Headers ++ server_header() ++ couch_httpd_auth:cookie_auth_header(Req, Headers), Headers2 = couch_httpd_cors:cors_headers(Req, Headers1), Resp = MochiReq:start_response_length({Code, Headers2, Length}), case MochiReq:get(method) of 'HEAD' -> throw({http_head_abort, Resp}); _ -> ok end, {ok, Resp}. start_response(#httpd{mochi_req=MochiReq}=Req, Code, Headers) -> log_request(Req, Code), couch_stats_collector:increment({httpd_status_codes, Code}), CookieHeader = couch_httpd_auth:cookie_auth_header(Req, Headers), Headers1 = Headers ++ server_header() ++ CookieHeader, Headers2 = couch_httpd_cors:cors_headers(Req, Headers1), Resp = MochiReq:start_response({Code, Headers2}), case MochiReq:get(method) of 'HEAD' -> throw({http_head_abort, Resp}); _ -> ok end, {ok, Resp}. send(Resp, Data) -> Resp:send(Data), {ok, Resp}. no_resp_conn_header([]) -> true; no_resp_conn_header([{Hdr, _}|Rest]) -> case string:to_lower(Hdr) of "connection" -> false; _ -> no_resp_conn_header(Rest) end. http_1_0_keep_alive(Req, Headers) -> KeepOpen = Req:should_close() == false, IsHttp10 = Req:get(version) == {1, 0}, NoRespHeader = no_resp_conn_header(Headers), case KeepOpen andalso IsHttp10 andalso NoRespHeader of true -> [{"Connection", "Keep-Alive"} | Headers]; false -> Headers end. start_chunked_response(#httpd{mochi_req=MochiReq}=Req, Code, Headers) -> log_request(Req, Code), couch_stats_collector:increment({httpd_status_codes, Code}), Headers1 = http_1_0_keep_alive(MochiReq, Headers), Headers2 = Headers1 ++ server_header() ++ couch_httpd_auth:cookie_auth_header(Req, Headers1), Headers3 = couch_httpd_cors:cors_headers(Req, Headers2), Resp = MochiReq:respond({Code, Headers3, chunked}), case MochiReq:get(method) of 'HEAD' -> throw({http_head_abort, Resp}); _ -> ok end, {ok, Resp}. send_chunk(Resp, Data) -> case iolist_size(Data) of 0 -> ok; % do nothing _ -> Resp:write_chunk(Data) end, {ok, Resp}. last_chunk(Resp) -> Resp:write_chunk([]), {ok, Resp}. send_response(#httpd{mochi_req=MochiReq}=Req, Code, Headers, Body) -> log_request(Req, Code), couch_stats_collector:increment({httpd_status_codes, Code}), Headers1 = http_1_0_keep_alive(MochiReq, Headers), if Code >= 500 -> ?LOG_ERROR("httpd ~p error response:~n ~s", [Code, Body]); Code >= 400 -> ?LOG_DEBUG("httpd ~p error response:~n ~s", [Code, Body]); true -> ok end, Headers2 = Headers1 ++ server_header() ++ couch_httpd_auth:cookie_auth_header(Req, Headers1), Headers3 = couch_httpd_cors:cors_headers(Req, Headers2), {ok, MochiReq:respond({Code, Headers3, Body})}. send_method_not_allowed(Req, Methods) -> send_error(Req, 405, [{"Allow", Methods}], <<"method_not_allowed">>, ?l2b("Only " ++ Methods ++ " allowed")). send_json(Req, Value) -> send_json(Req, 200, Value). send_json(Req, Code, Value) -> send_json(Req, Code, [], Value). send_json(Req, Code, Headers, Value) -> initialize_jsonp(Req), DefaultHeaders = [ {"Content-Type", negotiate_content_type(Req)}, {"Cache-Control", "must-revalidate"} ], Body = [start_jsonp(), ?JSON_ENCODE(Value), end_jsonp(), $\n], send_response(Req, Code, DefaultHeaders ++ Headers, Body). start_json_response(Req, Code) -> start_json_response(Req, Code, []). start_json_response(Req, Code, Headers) -> initialize_jsonp(Req), DefaultHeaders = [ {"Content-Type", negotiate_content_type(Req)}, {"Cache-Control", "must-revalidate"} ], {ok, Resp} = start_chunked_response(Req, Code, DefaultHeaders ++ Headers), case start_jsonp() of [] -> ok; Start -> send_chunk(Resp, Start) end, {ok, Resp}. end_json_response(Resp) -> send_chunk(Resp, end_jsonp() ++ [$\n]), last_chunk(Resp). initialize_jsonp(Req) -> case get(jsonp) of undefined -> put(jsonp, qs_value(Req, "callback", no_jsonp)); _ -> ok end, case get(jsonp) of no_jsonp -> []; [] -> []; CallBack -> try % make sure jsonp is configured on (default off) case couch_config:get("httpd", "allow_jsonp", "false") of "true" -> validate_callback(CallBack); _Else -> put(jsonp, no_jsonp) end catch Error -> put(jsonp, no_jsonp), throw(Error) end end. start_jsonp() -> case get(jsonp) of no_jsonp -> []; [] -> []; CallBack -> ["/* CouchDB */", CallBack, "("] end. end_jsonp() -> case erlang:erase(jsonp) of no_jsonp -> []; [] -> []; _ -> ");" end. validate_callback(CallBack) when is_binary(CallBack) -> validate_callback(binary_to_list(CallBack)); validate_callback([]) -> ok; validate_callback([Char | Rest]) -> case Char of _ when Char >= $a andalso Char =< $z -> ok; _ when Char >= $A andalso Char =< $Z -> ok; _ when Char >= $0 andalso Char =< $9 -> ok; _ when Char == $. -> ok; _ when Char == $_ -> ok; _ when Char == $[ -> ok; _ when Char == $] -> ok; _ -> throw({bad_request, invalid_callback}) end, validate_callback(Rest). error_info({Error, Reason}) when is_list(Reason) -> error_info({Error, ?l2b(Reason)}); error_info(bad_request) -> {400, <<"bad_request">>, <<>>}; error_info({bad_request, Reason}) -> {400, <<"bad_request">>, Reason}; error_info({query_parse_error, Reason}) -> {400, <<"query_parse_error">>, Reason}; % Prior art for md5 mismatch resulting in a 400 is from AWS S3 error_info(md5_mismatch) -> {400, <<"content_md5_mismatch">>, <<"Possible message corruption.">>}; error_info(not_found) -> {404, <<"not_found">>, <<"missing">>}; error_info({not_found, Reason}) -> {404, <<"not_found">>, Reason}; error_info({not_acceptable, Reason}) -> {406, <<"not_acceptable">>, Reason}; error_info(conflict) -> {409, <<"conflict">>, <<"Document update conflict.">>}; error_info({forbidden, Msg}) -> {403, <<"forbidden">>, Msg}; error_info({unauthorized, Msg}) -> {401, <<"unauthorized">>, Msg}; error_info(file_exists) -> {412, <<"file_exists">>, <<"The database could not be " "created, the file already exists.">>}; error_info(request_entity_too_large) -> {413, <<"too_large">>, <<"the request entity is too large">>}; error_info(request_uri_too_long) -> {414, <<"too_long">>, <<"the request entity is too long">>}; error_info({bad_ctype, Reason}) -> {415, <<"bad_content_type">>, Reason}; error_info(requested_range_not_satisfiable) -> {416, <<"requested_range_not_satisfiable">>, <<"Requested range not satisfiable">>}; error_info({error, illegal_database_name, Name}) -> Message = "Name: '" ++ Name ++ "'. Only lowercase characters (a-z), " ++ "digits (0-9), and any of the characters _, $, (, ), +, -, and / " ++ "are allowed. Must begin with a letter.", {400, <<"illegal_database_name">>, couch_util:to_binary(Message)}; error_info({missing_stub, Reason}) -> {412, <<"missing_stub">>, Reason}; error_info({Error, Reason}) -> {500, couch_util:to_binary(Error), couch_util:to_binary(Reason)}; error_info(Error) -> {500, <<"unknown_error">>, couch_util:to_binary(Error)}. error_headers(#httpd{mochi_req=MochiReq}=Req, Code, ErrorStr, ReasonStr) -> if Code == 401 -> % this is where the basic auth popup is triggered case MochiReq:get_header_value("X-CouchDB-WWW-Authenticate") of undefined -> case couch_config:get("httpd", "WWW-Authenticate", nil) of nil -> % If the client is a browser and the basic auth popup isn't turned on % redirect to the session page. case ErrorStr of <<"unauthorized">> -> case couch_config:get("couch_httpd_auth", "authentication_redirect", nil) of nil -> {Code, []}; AuthRedirect -> case couch_config:get("couch_httpd_auth", "require_valid_user", "false") of "true" -> % send the browser popup header no matter what if we are require_valid_user {Code, [{"WWW-Authenticate", "Basic realm=\"server\""}]}; _False -> case MochiReq:accepts_content_type("application/json") of true -> {Code, []}; false -> case MochiReq:accepts_content_type("text/html") of true -> % Redirect to the path the user requested, not % the one that is used internally. UrlReturnRaw = case MochiReq:get_header_value("x-couchdb-vhost-path") of undefined -> MochiReq:get(path); VHostPath -> VHostPath end, RedirectLocation = lists:flatten([ AuthRedirect, "?return=", couch_util:url_encode(UrlReturnRaw), "&reason=", couch_util:url_encode(ReasonStr) ]), {302, [{"Location", absolute_uri(Req, RedirectLocation)}]}; false -> {Code, []} end end end end; _Else -> {Code, []} end; Type -> {Code, [{"WWW-Authenticate", Type}]} end; Type -> {Code, [{"WWW-Authenticate", Type}]} end; true -> {Code, []} end. send_error(_Req, {already_sent, Resp, _Error}) -> {ok, Resp}; send_error(Req, Error) -> {Code, ErrorStr, ReasonStr} = error_info(Error), {Code1, Headers} = error_headers(Req, Code, ErrorStr, ReasonStr), send_error(Req, Code1, Headers, ErrorStr, ReasonStr). send_error(Req, Code, ErrorStr, ReasonStr) -> send_error(Req, Code, [], ErrorStr, ReasonStr). send_error(Req, Code, Headers, ErrorStr, ReasonStr) -> send_json(Req, Code, Headers, {[{<<"error">>, ErrorStr}, {<<"reason">>, ReasonStr}]}). % give the option for list functions to output html or other raw errors send_chunked_error(Resp, {_Error, {[{<<"body">>, Reason}]}}) -> send_chunk(Resp, Reason), last_chunk(Resp); send_chunked_error(Resp, Error) -> {Code, ErrorStr, ReasonStr} = error_info(Error), JsonError = {[{<<"code">>, Code}, {<<"error">>, ErrorStr}, {<<"reason">>, ReasonStr}]}, send_chunk(Resp, ?l2b([$\n,?JSON_ENCODE(JsonError),$\n])), last_chunk(Resp). send_redirect(Req, Path) -> send_response(Req, 301, [{"Location", absolute_uri(Req, Path)}], <<>>). negotiate_content_type(Req) -> case get(jsonp) of no_jsonp -> negotiate_content_type1(Req); [] -> negotiate_content_type1(Req); _Callback -> "text/javascript" end. negotiate_content_type1(#httpd{mochi_req=MochiReq}) -> %% Determine the appropriate Content-Type header for a JSON response %% depending on the Accept header in the request. A request that explicitly %% lists the correct JSON MIME type will get that type, otherwise the %% response will have the generic MIME type "text/plain" AcceptedTypes = case MochiReq:get_header_value("Accept") of undefined -> []; AcceptHeader -> string:tokens(AcceptHeader, ", ") end, case lists:member("application/json", AcceptedTypes) of true -> "application/json"; false -> "text/plain; charset=utf-8" end. server_header() -> [{"Server", "CouchDB/" ++ couch_server:get_version() ++ " (Erlang OTP/" ++ erlang:system_info(otp_release) ++ ")"}]. -record(mp, {boundary, buffer, data_fun, callback}). parse_multipart_request(ContentType, DataFun, Callback) -> Boundary0 = iolist_to_binary(get_boundary(ContentType)), Boundary = <<"\r\n--", Boundary0/binary>>, Mp = #mp{boundary= Boundary, buffer= <<>>, data_fun=DataFun, callback=Callback}, {Mp2, _NilCallback} = read_until(Mp, <<"--", Boundary0/binary>>, fun nil_callback/1), #mp{buffer=Buffer, data_fun=DataFun2, callback=Callback2} = parse_part_header(Mp2), {Buffer, DataFun2, Callback2}. nil_callback(_Data)-> fun nil_callback/1. get_boundary({"multipart/" ++ _, Opts}) -> case couch_util:get_value("boundary", Opts) of S when is_list(S) -> S end; get_boundary(ContentType) -> {"multipart/" ++ _ , Opts} = mochiweb_util:parse_header(ContentType), get_boundary({"multipart/", Opts}). split_header(<<>>) -> []; split_header(Line) -> {Name, [$: | Value]} = lists:splitwith(fun (C) -> C =/= $: end, binary_to_list(Line)), [{string:to_lower(string:strip(Name)), mochiweb_util:parse_header(Value)}]. read_until(#mp{data_fun=DataFun, buffer=Buffer}=Mp, Pattern, Callback) -> case couch_util:find_in_binary(Pattern, Buffer) of not_found -> Callback2 = Callback(Buffer), {Buffer2, DataFun2} = DataFun(), Buffer3 = iolist_to_binary(Buffer2), read_until(Mp#mp{data_fun=DataFun2,buffer=Buffer3}, Pattern, Callback2); {partial, 0} -> {NewData, DataFun2} = DataFun(), read_until(Mp#mp{data_fun=DataFun2, buffer= iolist_to_binary([Buffer,NewData])}, Pattern, Callback); {partial, Skip} -> <> = Buffer, Callback2 = Callback(DataChunk), {NewData, DataFun2} = DataFun(), read_until(Mp#mp{data_fun=DataFun2, buffer= iolist_to_binary([Rest | NewData])}, Pattern, Callback2); {exact, 0} -> PatternLen = size(Pattern), <<_:PatternLen/binary, Rest/binary>> = Buffer, {Mp#mp{buffer= Rest}, Callback}; {exact, Skip} -> PatternLen = size(Pattern), <> = Buffer, Callback2 = Callback(DataChunk), {Mp#mp{buffer= Rest}, Callback2} end. parse_part_header(#mp{callback=UserCallBack}=Mp) -> {Mp2, AccCallback} = read_until(Mp, <<"\r\n\r\n">>, fun(Next) -> acc_callback(Next, []) end), HeaderData = AccCallback(get_data), Headers = lists:foldl(fun(Line, Acc) -> split_header(Line) ++ Acc end, [], re:split(HeaderData,<<"\r\n">>, [])), NextCallback = UserCallBack({headers, Headers}), parse_part_body(Mp2#mp{callback=NextCallback}). parse_part_body(#mp{boundary=Prefix, callback=Callback}=Mp) -> {Mp2, WrappedCallback} = read_until(Mp, Prefix, fun(Data) -> body_callback_wrapper(Data, Callback) end), Callback2 = WrappedCallback(get_callback), Callback3 = Callback2(body_end), case check_for_last(Mp2#mp{callback=Callback3}) of {last, #mp{callback=Callback3}=Mp3} -> Mp3#mp{callback=Callback3(eof)}; {more, Mp3} -> parse_part_header(Mp3) end. acc_callback(get_data, Acc)-> iolist_to_binary(lists:reverse(Acc)); acc_callback(Data, Acc)-> fun(Next) -> acc_callback(Next, [Data | Acc]) end. body_callback_wrapper(get_callback, Callback) -> Callback; body_callback_wrapper(Data, Callback) -> Callback2 = Callback({body, Data}), fun(Next) -> body_callback_wrapper(Next, Callback2) end. check_for_last(#mp{buffer=Buffer, data_fun=DataFun}=Mp) -> case Buffer of <<"--",_/binary>> -> {last, Mp}; <<_, _, _/binary>> -> {more, Mp}; _ -> % not long enough {Data, DataFun2} = DataFun(), check_for_last(Mp#mp{buffer= <>, data_fun = DataFun2}) end. validate_bind_address(Address) -> case inet_parse:address(Address) of {ok, _} -> ok; _ -> throw({error, invalid_bind_address}) end. apache-couchdb-1.6.0/src/couchdb/couch_drv.erl0000644000175000001440000000320112332105522021170 0ustar00djcusers00000000000000% Licensed under the Apache License, Version 2.0 (the "License"); you may not % use this file except in compliance with the License. You may obtain a copy of % the License at % % http://www.apache.org/licenses/LICENSE-2.0 % % Unless required by applicable law or agreed to in writing, software % distributed under the License is distributed on an "AS IS" BASIS, WITHOUT % WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the % License for the specific language governing permissions and limitations under % the License. -module(couch_drv). -behaviour(gen_server). -export([init/1, handle_call/3, handle_cast/2, handle_info/2, terminate/2, code_change/3]). -export([start_link/0]). -include("couch_db.hrl"). start_link() -> gen_server:start_link({local, ?MODULE}, ?MODULE, [], []). init([]) -> LibDir = util_driver_dir(), case erl_ddll:load(LibDir, "couch_icu_driver") of ok -> {ok, nil}; {error, already_loaded} -> ?LOG_INFO("~p reloading couch_icu_driver", [?MODULE]), ok = erl_ddll:reload(LibDir, "couch_icu_driver"), {ok, nil}; {error, Error} -> {stop, erl_ddll:format_error(Error)} end. handle_call(_Request, _From, State) -> {reply, ok, State}. handle_cast(_Request, State) -> {noreply, State}. handle_info(_Info, State) -> {noreply, State}. terminate(_Reason, _State) -> ok. code_change(_OldVsn, State, _Extra) -> {ok, State}. % private API util_driver_dir() -> case couch_config:get("couchdb", "util_driver_dir", null) of null -> filename:join(couch_util:priv_dir(), "lib"); LibDir0 -> LibDir0 end. apache-couchdb-1.6.0/src/couchdb/couch_httpd_external.erl0000644000175000001440000001472712332105522023441 0ustar00djcusers00000000000000% Licensed under the Apache License, Version 2.0 (the "License"); you may not % use this file except in compliance with the License. You may obtain a copy of % the License at % % http://www.apache.org/licenses/LICENSE-2.0 % % Unless required by applicable law or agreed to in writing, software % distributed under the License is distributed on an "AS IS" BASIS, WITHOUT % WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the % License for the specific language governing permissions and limitations under % the License. -module(couch_httpd_external). -export([handle_external_req/2, handle_external_req/3]). -export([send_external_response/2, json_req_obj/2, json_req_obj/3]). -export([default_or_content_type/2, parse_external_response/1]). -import(couch_httpd,[send_error/4]). -include("couch_db.hrl"). % handle_external_req/2 % for the old type of config usage: % _external = {couch_httpd_external, handle_external_req} % with urls like % /db/_external/action/design/name handle_external_req(#httpd{ path_parts=[_DbName, _External, UrlName | _Path] }=HttpReq, Db) -> process_external_req(HttpReq, Db, UrlName); handle_external_req(#httpd{path_parts=[_, _]}=Req, _Db) -> send_error(Req, 404, <<"external_server_error">>, <<"No server name specified.">>); handle_external_req(Req, _) -> send_error(Req, 404, <<"external_server_error">>, <<"Broken assumption">>). % handle_external_req/3 % for this type of config usage: % _action = {couch_httpd_external, handle_external_req, <<"action">>} % with urls like % /db/_action/design/name handle_external_req(HttpReq, Db, Name) -> process_external_req(HttpReq, Db, Name). process_external_req(HttpReq, Db, Name) -> Response = couch_external_manager:execute(binary_to_list(Name), json_req_obj(HttpReq, Db)), case Response of {unknown_external_server, Msg} -> send_error(HttpReq, 404, <<"external_server_error">>, Msg); _ -> send_external_response(HttpReq, Response) end. json_req_obj(Req, Db) -> json_req_obj(Req, Db, null). json_req_obj(#httpd{mochi_req=Req, method=Method, requested_path_parts=RequestedPath, path_parts=Path, req_body=ReqBody }, Db, DocId) -> Body = case ReqBody of undefined -> MaxSize = list_to_integer( couch_config:get("couchdb", "max_document_size", "4294967296")), Req:recv_body(MaxSize); Else -> Else end, ParsedForm = case Req:get_primary_header_value("content-type") of "application/x-www-form-urlencoded" ++ _ -> case Body of undefined -> []; _ -> mochiweb_util:parse_qs(Body) end; _ -> [] end, Headers = Req:get(headers), Hlist = mochiweb_headers:to_list(Headers), {ok, Info} = couch_db:get_db_info(Db), % add headers... {[{<<"info">>, {Info}}, {<<"id">>, DocId}, {<<"uuid">>, couch_uuids:new()}, {<<"method">>, Method}, {<<"requested_path">>, RequestedPath}, {<<"path">>, Path}, {<<"raw_path">>, ?l2b(Req:get(raw_path))}, {<<"query">>, json_query_keys(to_json_terms(Req:parse_qs()))}, {<<"headers">>, to_json_terms(Hlist)}, {<<"body">>, Body}, {<<"peer">>, ?l2b(Req:get(peer))}, {<<"form">>, to_json_terms(ParsedForm)}, {<<"cookie">>, to_json_terms(Req:parse_cookie())}, {<<"userCtx">>, couch_util:json_user_ctx(Db)}, {<<"secObj">>, couch_db:get_security(Db)}]}. to_json_terms(Data) -> to_json_terms(Data, []). to_json_terms([], Acc) -> {lists:reverse(Acc)}; to_json_terms([{Key, Value} | Rest], Acc) when is_atom(Key) -> to_json_terms(Rest, [{list_to_binary(atom_to_list(Key)), list_to_binary(Value)} | Acc]); to_json_terms([{Key, Value} | Rest], Acc) -> to_json_terms(Rest, [{list_to_binary(Key), list_to_binary(Value)} | Acc]). json_query_keys({Json}) -> json_query_keys(Json, []). json_query_keys([], Acc) -> {lists:reverse(Acc)}; json_query_keys([{<<"startkey">>, Value} | Rest], Acc) -> json_query_keys(Rest, [{<<"startkey">>, ?JSON_DECODE(Value)}|Acc]); json_query_keys([{<<"endkey">>, Value} | Rest], Acc) -> json_query_keys(Rest, [{<<"endkey">>, ?JSON_DECODE(Value)}|Acc]); json_query_keys([{<<"key">>, Value} | Rest], Acc) -> json_query_keys(Rest, [{<<"key">>, ?JSON_DECODE(Value)}|Acc]); json_query_keys([Term | Rest], Acc) -> json_query_keys(Rest, [Term|Acc]). send_external_response(Req, Response) -> #extern_resp_args{ code = Code, data = Data, ctype = CType, headers = Headers, json = Json } = parse_external_response(Response), Headers1 = default_or_content_type(CType, Headers), case Json of nil -> couch_httpd:send_response(Req, Code, Headers1, Data); Json -> couch_httpd:send_json(Req, Code, Headers1, Json) end. parse_external_response({Response}) -> lists:foldl(fun({Key,Value}, Args) -> case {Key, Value} of {"", _} -> Args; {<<"code">>, Value} -> Args#extern_resp_args{code=Value}; {<<"stop">>, true} -> Args#extern_resp_args{stop=true}; {<<"json">>, Value} -> Args#extern_resp_args{ json=Value, ctype="application/json"}; {<<"body">>, Value} -> Args#extern_resp_args{data=Value, ctype="text/html; charset=utf-8"}; {<<"base64">>, Value} -> Args#extern_resp_args{ data=base64:decode(Value), ctype="application/binary" }; {<<"headers">>, {Headers}} -> NewHeaders = lists:map(fun({Header, HVal}) -> {binary_to_list(Header), binary_to_list(HVal)} end, Headers), Args#extern_resp_args{headers=NewHeaders}; _ -> % unknown key Msg = lists:flatten(io_lib:format("Invalid data from external server: ~p", [{Key, Value}])), throw({external_response_error, Msg}) end end, #extern_resp_args{}, Response). default_or_content_type(DefaultContentType, Headers) -> IsContentType = fun({X, _}) -> string:to_lower(X) == "content-type" end, case lists:any(IsContentType, Headers) of false -> [{"Content-Type", DefaultContentType} | Headers]; true -> Headers end. apache-couchdb-1.6.0/src/couchdb/couch_config.erl0000644000175000001440000002075712332105522021661 0ustar00djcusers00000000000000% Licensed under the Apache License, Version 2.0 (the "License"); you may not % use this file except in compliance with the License. You may obtain a copy of % the License at % % http://www.apache.org/licenses/LICENSE-2.0 % % Unless required by applicable law or agreed to in writing, software % distributed under the License is distributed on an "AS IS" BASIS, WITHOUT % WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the % License for the specific language governing permissions and limitations under % the License. % Reads CouchDB's ini file and gets queried for configuration parameters. % This module is initialized with a list of ini files that it consecutively % reads Key/Value pairs from and saves them in an ets table. If more than one % ini file is specified, the last one is used to write changes that are made % with store/2 back to that ini file. -module(couch_config). -behaviour(gen_server). -include("couch_db.hrl"). -export([start_link/1, stop/0]). -export([all/0, get/1, get/2, get/3, set/3, set/4, delete/2, delete/3]). -export([register/1, register/2]). -export([parse_ini_file/1]). -export([init/1, terminate/2, code_change/3]). -export([handle_call/3, handle_cast/2, handle_info/2]). -record(config, { notify_funs=[], write_filename=undefined }). start_link(IniFiles) -> gen_server:start_link({local, ?MODULE}, ?MODULE, IniFiles, []). stop() -> gen_server:cast(?MODULE, stop). all() -> lists:sort(gen_server:call(?MODULE, all, infinity)). get(Section) when is_binary(Section) -> ?MODULE:get(?b2l(Section)); get(Section) -> Matches = ets:match(?MODULE, {{Section, '$1'}, '$2'}), [{Key, Value} || [Key, Value] <- Matches]. get(Section, Key) -> ?MODULE:get(Section, Key, undefined). get(Section, Key, Default) when is_binary(Section) and is_binary(Key) -> ?MODULE:get(?b2l(Section), ?b2l(Key), Default); get(Section, Key, Default) -> case ets:lookup(?MODULE, {Section, Key}) of [] -> Default; [{_, Match}] -> Match end. set(Section, Key, Value) -> ?MODULE:set(Section, Key, Value, true). set(Section, Key, Value, Persist) when is_binary(Section) and is_binary(Key) -> ?MODULE:set(?b2l(Section), ?b2l(Key), Value, Persist); set(Section, Key, Value, Persist) -> gen_server:call(?MODULE, {set, Section, Key, Value, Persist}). delete(Section, Key) when is_binary(Section) and is_binary(Key) -> delete(?b2l(Section), ?b2l(Key)); delete(Section, Key) -> delete(Section, Key, true). delete(Section, Key, Persist) when is_binary(Section) and is_binary(Key) -> delete(?b2l(Section), ?b2l(Key), Persist); delete(Section, Key, Persist) -> gen_server:call(?MODULE, {delete, Section, Key, Persist}). register(Fun) -> ?MODULE:register(Fun, self()). register(Fun, Pid) -> gen_server:call(?MODULE, {register, Fun, Pid}). init(IniFiles) -> ets:new(?MODULE, [named_table, set, protected]), try lists:foreach(fun(IniFile) -> {ok, ParsedIniValues} = parse_ini_file(IniFile), ets:insert(?MODULE, ParsedIniValues) end, IniFiles), WriteFile = case IniFiles of [_|_] -> lists:last(IniFiles); _ -> undefined end, {ok, #config{write_filename = WriteFile}} catch _Tag:Error -> {stop, Error} end. terminate(_Reason, _State) -> ok. handle_call(all, _From, Config) -> Resp = lists:sort((ets:tab2list(?MODULE))), {reply, Resp, Config}; handle_call({set, Sec, Key, Val, Persist}, From, Config) -> Result = case {Persist, Config#config.write_filename} of {true, undefined} -> ok; {true, FileName} -> couch_config_writer:save_to_file({{Sec, Key}, Val}, FileName); _ -> ok end, case Result of ok -> true = ets:insert(?MODULE, {{Sec, Key}, Val}), spawn_link(fun() -> [catch F(Sec, Key, Val, Persist) || {_Pid, F} <- Config#config.notify_funs], gen_server:reply(From, ok) end), {noreply, Config}; _Error -> {reply, Result, Config} end; handle_call({delete, Sec, Key, Persist}, From, Config) -> true = ets:delete(?MODULE, {Sec,Key}), case {Persist, Config#config.write_filename} of {true, undefined} -> ok; {true, FileName} -> couch_config_writer:save_to_file({{Sec, Key}, ""}, FileName); _ -> ok end, spawn_link(fun() -> [catch F(Sec, Key, deleted, Persist) || {_Pid, F} <- Config#config.notify_funs], gen_server:reply(From, ok) end), {noreply, Config}; handle_call({register, Fun, Pid}, _From, #config{notify_funs=PidFuns}=Config) -> erlang:monitor(process, Pid), % convert 1 and 2 arity to 3 arity Fun2 = case Fun of _ when is_function(Fun, 1) -> fun(Section, _Key, _Value, _Persist) -> Fun(Section) end; _ when is_function(Fun, 2) -> fun(Section, Key, _Value, _Persist) -> Fun(Section, Key) end; _ when is_function(Fun, 3) -> fun(Section, Key, Value, _Persist) -> Fun(Section, Key, Value) end; _ when is_function(Fun, 4) -> Fun end, {reply, ok, Config#config{notify_funs=[{Pid, Fun2} | PidFuns]}}. handle_cast(stop, State) -> {stop, normal, State}; handle_cast(_Msg, State) -> {noreply, State}. handle_info({'DOWN', _, _, DownPid, _}, #config{notify_funs=PidFuns}=Config) -> % remove any funs registered by the downed process FilteredPidFuns = [{Pid,Fun} || {Pid,Fun} <- PidFuns, Pid /= DownPid], {noreply, Config#config{notify_funs=FilteredPidFuns}}. code_change(_OldVsn, State, _Extra) -> {ok, State}. parse_ini_file(IniFile) -> IniFilename = couch_util:abs_pathname(IniFile), IniBin = case file:read_file(IniFilename) of {ok, IniBin0} -> IniBin0; {error, Reason} = Error -> ?LOG_ERROR("Could not read server configuration file ~s: ~s", [IniFilename, file:format_error(Reason)]), throw(Error) end, Lines = re:split(IniBin, "\r\n|\n|\r|\032", [{return, list}]), {_, ParsedIniValues} = lists:foldl(fun(Line, {AccSectionName, AccValues}) -> case string:strip(Line) of "[" ++ Rest -> case re:split(Rest, "\\]", [{return, list}]) of [NewSectionName, ""] -> {NewSectionName, AccValues}; _Else -> % end bracket not at end, ignore this line {AccSectionName, AccValues} end; ";" ++ _Comment -> {AccSectionName, AccValues}; Line2 -> case re:split(Line2, "\s*=\s*", [{return, list}]) of [Value] -> MultiLineValuePart = case re:run(Line, "^ \\S", []) of {match, _} -> true; _ -> false end, case {MultiLineValuePart, AccValues} of {true, [{{_, ValueName}, PrevValue} | AccValuesRest]} -> % remove comment case re:split(Value, " ;|\t;", [{return, list}]) of [[]] -> % empty line {AccSectionName, AccValues}; [LineValue | _Rest] -> E = {{AccSectionName, ValueName}, PrevValue ++ " " ++ LineValue}, {AccSectionName, [E | AccValuesRest]} end; _ -> {AccSectionName, AccValues} end; [""|_LineValues] -> % line begins with "=", ignore {AccSectionName, AccValues}; [ValueName|LineValues] -> % yeehaw, got a line! RemainingLine = couch_util:implode(LineValues, "="), % removes comments case re:split(RemainingLine, " ;|\t;", [{return, list}]) of [[]] -> % empty line means delete this key ets:delete(?MODULE, {AccSectionName, ValueName}), {AccSectionName, AccValues}; [LineValue | _Rest] -> {AccSectionName, [{{AccSectionName, ValueName}, LineValue} | AccValues]} end end end end, {"", []}, Lines), {ok, ParsedIniValues}. apache-couchdb-1.6.0/src/couchdb/couch_changes.erl0000644000175000001440000004612412332105522022020 0ustar00djcusers00000000000000% Licensed under the Apache License, Version 2.0 (the "License"); you may not % use this file except in compliance with the License. You may obtain a copy of % the License at % % http://www.apache.org/licenses/LICENSE-2.0 % % Unless required by applicable law or agreed to in writing, software % distributed under the License is distributed on an "AS IS" BASIS, WITHOUT % WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the % License for the specific language governing permissions and limitations under % the License. -module(couch_changes). -include("couch_db.hrl"). -export([handle_changes/3]). % For the builtin filter _docs_ids, this is the maximum number % of documents for which we trigger the optimized code path. -define(MAX_DOC_IDS, 100). -record(changes_acc, { db, seq, prepend, filter, callback, user_acc, resp_type, limit, include_docs, doc_options, conflicts, timeout, timeout_fun }). %% @type Req -> #httpd{} | {json_req, JsonObj()} handle_changes(Args1, Req, Db0) -> #changes_args{ style = Style, filter = FilterName, feed = Feed, dir = Dir, since = Since } = Args1, {FilterFun, FilterArgs} = make_filter_fun(FilterName, Style, Req, Db0), Args = Args1#changes_args{filter_fun = FilterFun, filter_args = FilterArgs}, Start = fun() -> {ok, Db} = couch_db:reopen(Db0), StartSeq = case Dir of rev -> couch_db:get_update_seq(Db); fwd -> Since end, {Db, StartSeq} end, % begin timer to deal with heartbeat when filter function fails case Args#changes_args.heartbeat of undefined -> erlang:erase(last_changes_heartbeat); Val when is_integer(Val); Val =:= true -> put(last_changes_heartbeat, now()) end, case lists:member(Feed, ["continuous", "longpoll", "eventsource"]) of true -> fun(CallbackAcc) -> {Callback, UserAcc} = get_callback_acc(CallbackAcc), Self = self(), {ok, Notify} = couch_db_update_notifier:start_link( fun({_, DbName}) when Db0#db.name == DbName -> Self ! db_updated; (_) -> ok end ), {Db, StartSeq} = Start(), UserAcc2 = start_sending_changes(Callback, UserAcc, Feed), {Timeout, TimeoutFun} = get_changes_timeout(Args, Callback), Acc0 = build_acc(Args, Callback, UserAcc2, Db, StartSeq, <<"">>, Timeout, TimeoutFun), try keep_sending_changes( Args#changes_args{dir=fwd}, Acc0, true) after couch_db_update_notifier:stop(Notify), get_rest_db_updated(ok) % clean out any remaining update messages end end; false -> fun(CallbackAcc) -> {Callback, UserAcc} = get_callback_acc(CallbackAcc), UserAcc2 = start_sending_changes(Callback, UserAcc, Feed), {Timeout, TimeoutFun} = get_changes_timeout(Args, Callback), {Db, StartSeq} = Start(), Acc0 = build_acc(Args#changes_args{feed="normal"}, Callback, UserAcc2, Db, StartSeq, <<>>, Timeout, TimeoutFun), {ok, #changes_acc{seq = LastSeq, user_acc = UserAcc3}} = send_changes( Args#changes_args{feed="normal"}, Acc0, true), end_sending_changes(Callback, UserAcc3, LastSeq, Feed) end end. get_callback_acc({Callback, _UserAcc} = Pair) when is_function(Callback, 3) -> Pair; get_callback_acc(Callback) when is_function(Callback, 2) -> {fun(Ev, Data, _) -> Callback(Ev, Data) end, ok}. %% @type Req -> #httpd{} | {json_req, JsonObj()} make_filter_fun([$_ | _] = FilterName, Style, Req, Db) -> builtin_filter_fun(FilterName, Style, Req, Db); make_filter_fun(FilterName, Style, Req, Db) -> {os_filter_fun(FilterName, Style, Req, Db), []}. os_filter_fun(FilterName, Style, Req, Db) -> case [list_to_binary(couch_httpd:unquote(Part)) || Part <- string:tokens(FilterName, "/")] of [] -> fun(_Db2, #doc_info{revs=Revs}) -> builtin_results(Style, Revs) end; [DName, FName] -> DesignId = <<"_design/", DName/binary>>, DDoc = couch_httpd_db:couch_doc_open(Db, DesignId, nil, [ejson_body]), % validate that the ddoc has the filter fun #doc{body={Props}} = DDoc, couch_util:get_nested_json_value({Props}, [<<"filters">>, FName]), fun(Db2, DocInfo) -> DocInfos = case Style of main_only -> [DocInfo]; all_docs -> [DocInfo#doc_info{revs=[Rev]}|| Rev <- DocInfo#doc_info.revs] end, Docs = [Doc || {ok, Doc} <- [ couch_db:open_doc(Db2, DocInfo2, [deleted, conflicts]) || DocInfo2 <- DocInfos]], {ok, Passes} = couch_query_servers:filter_docs( Req, Db2, DDoc, FName, Docs ), [{[{<<"rev">>, couch_doc:rev_to_str({RevPos,RevId})}]} || {Pass, #doc{revs={RevPos,[RevId|_]}}} <- lists:zip(Passes, Docs), Pass == true] end; _Else -> throw({bad_request, "filter parameter must be of the form `designname/filtername`"}) end. builtin_filter_fun("_doc_ids", Style, {json_req, {Props}}, _Db) -> DocIds = couch_util:get_value(<<"doc_ids">>, Props), {filter_docids(DocIds, Style), DocIds}; builtin_filter_fun("_doc_ids", Style, #httpd{method='POST'}=Req, _Db) -> {Props} = couch_httpd:json_body_obj(Req), DocIds = couch_util:get_value(<<"doc_ids">>, Props, nil), {filter_docids(DocIds, Style), DocIds}; builtin_filter_fun("_doc_ids", Style, #httpd{method='GET'}=Req, _Db) -> DocIds = ?JSON_DECODE(couch_httpd:qs_value(Req, "doc_ids", "null")), {filter_docids(DocIds, Style), DocIds}; builtin_filter_fun("_design", Style, _Req, _Db) -> {filter_designdoc(Style), []}; builtin_filter_fun("_view", Style, Req, Db) -> ViewName = couch_httpd:qs_value(Req, "view", ""), {filter_view(ViewName, Style, Db), []}; builtin_filter_fun(_FilterName, _Style, _Req, _Db) -> throw({bad_request, "unknown builtin filter name"}). filter_docids(DocIds, Style) when is_list(DocIds)-> fun(_Db, #doc_info{id=DocId, revs=Revs}) -> case lists:member(DocId, DocIds) of true -> builtin_results(Style, Revs); _ -> [] end end; filter_docids(_, _) -> throw({bad_request, "`doc_ids` filter parameter is not a list."}). filter_designdoc(Style) -> fun(_Db, #doc_info{id=DocId, revs=Revs}) -> case DocId of <<"_design", _/binary>> -> builtin_results(Style, Revs); _ -> [] end end. filter_view("", _Style, _Db) -> throw({bad_request, "`view` filter parameter is not provided."}); filter_view(ViewName, Style, Db) -> case [list_to_binary(couch_httpd:unquote(Part)) || Part <- string:tokens(ViewName, "/")] of [] -> throw({bad_request, "Invalid `view` parameter."}); [DName, VName] -> DesignId = <<"_design/", DName/binary>>, DDoc = couch_httpd_db:couch_doc_open(Db, DesignId, nil, [ejson_body]), % validate that the ddoc has the filter fun #doc{body={Props}} = DDoc, couch_util:get_nested_json_value({Props}, [<<"views">>, VName]), fun(Db2, DocInfo) -> DocInfos = case Style of main_only -> [DocInfo]; all_docs -> [DocInfo#doc_info{revs=[Rev]}|| Rev <- DocInfo#doc_info.revs] end, Docs = [Doc || {ok, Doc} <- [ couch_db:open_doc(Db2, DocInfo2, [deleted, conflicts]) || DocInfo2 <- DocInfos]], {ok, Passes} = couch_query_servers:filter_view( DDoc, VName, Docs ), [{[{<<"rev">>, couch_doc:rev_to_str({RevPos,RevId})}]} || {Pass, #doc{revs={RevPos,[RevId|_]}}} <- lists:zip(Passes, Docs), Pass == true] end end. builtin_results(Style, [#rev_info{rev=Rev}|_]=Revs) -> case Style of main_only -> [{[{<<"rev">>, couch_doc:rev_to_str(Rev)}]}]; all_docs -> [{[{<<"rev">>, couch_doc:rev_to_str(R)}]} || #rev_info{rev=R} <- Revs] end. get_changes_timeout(Args, Callback) -> #changes_args{ heartbeat = Heartbeat, timeout = Timeout, feed = ResponseType } = Args, DefaultTimeout = list_to_integer( couch_config:get("httpd", "changes_timeout", "60000") ), case Heartbeat of undefined -> case Timeout of undefined -> {DefaultTimeout, fun(UserAcc) -> {stop, UserAcc} end}; infinity -> {infinity, fun(UserAcc) -> {stop, UserAcc} end}; _ -> {lists:min([DefaultTimeout, Timeout]), fun(UserAcc) -> {stop, UserAcc} end} end; true -> {DefaultTimeout, fun(UserAcc) -> {ok, Callback(timeout, ResponseType, UserAcc)} end}; _ -> {lists:min([DefaultTimeout, Heartbeat]), fun(UserAcc) -> {ok, Callback(timeout, ResponseType, UserAcc)} end} end. start_sending_changes(_Callback, UserAcc, ResponseType) when ResponseType =:= "continuous" orelse ResponseType =:= "eventsource" -> UserAcc; start_sending_changes(Callback, UserAcc, ResponseType) -> Callback(start, ResponseType, UserAcc). build_acc(Args, Callback, UserAcc, Db, StartSeq, Prepend, Timeout, TimeoutFun) -> #changes_args{ include_docs = IncludeDocs, doc_options = DocOpts, conflicts = Conflicts, limit = Limit, feed = ResponseType, filter_fun = FilterFun } = Args, #changes_acc{ db = Db, seq = StartSeq, prepend = Prepend, filter = FilterFun, callback = Callback, user_acc = UserAcc, resp_type = ResponseType, limit = Limit, include_docs = IncludeDocs, doc_options = DocOpts, conflicts = Conflicts, timeout = Timeout, timeout_fun = TimeoutFun }. send_changes(Args, Acc0, FirstRound) -> #changes_args{ dir = Dir, filter = FilterName, filter_args = FilterArgs } = Args, #changes_acc{ db = Db, seq = StartSeq } = Acc0, case FirstRound of true -> case FilterName of "_doc_ids" when length(FilterArgs) =< ?MAX_DOC_IDS -> send_changes_doc_ids( FilterArgs, Db, StartSeq, Dir, fun changes_enumerator/2, Acc0); "_design" -> send_changes_design_docs( Db, StartSeq, Dir, fun changes_enumerator/2, Acc0); _ -> couch_db:changes_since( Db, StartSeq, fun changes_enumerator/2, [{dir, Dir}], Acc0) end; false -> couch_db:changes_since( Db, StartSeq, fun changes_enumerator/2, [{dir, Dir}], Acc0) end. send_changes_doc_ids(DocIds, Db, StartSeq, Dir, Fun, Acc0) -> Lookups = couch_btree:lookup(Db#db.fulldocinfo_by_id_btree, DocIds), FullDocInfos = lists:foldl( fun({ok, FDI}, Acc) -> [FDI | Acc]; (not_found, Acc) -> Acc end, [], Lookups), send_lookup_changes(FullDocInfos, StartSeq, Dir, Db, Fun, Acc0). send_changes_design_docs(Db, StartSeq, Dir, Fun, Acc0) -> FoldFun = fun(FullDocInfo, _, Acc) -> {ok, [FullDocInfo | Acc]} end, KeyOpts = [{start_key, <<"_design/">>}, {end_key_gt, <<"_design0">>}], {ok, _, FullDocInfos} = couch_btree:fold( Db#db.fulldocinfo_by_id_btree, FoldFun, [], KeyOpts), send_lookup_changes(FullDocInfos, StartSeq, Dir, Db, Fun, Acc0). send_lookup_changes(FullDocInfos, StartSeq, Dir, Db, Fun, Acc0) -> FoldFun = case Dir of fwd -> fun lists:foldl/3; rev -> fun lists:foldr/3 end, GreaterFun = case Dir of fwd -> fun(A, B) -> A > B end; rev -> fun(A, B) -> A =< B end end, DocInfos = lists:foldl( fun(FDI, Acc) -> DI = couch_doc:to_doc_info(FDI), case GreaterFun(DI#doc_info.high_seq, StartSeq) of true -> [DI | Acc]; false -> Acc end end, [], FullDocInfos), SortedDocInfos = lists:keysort(#doc_info.high_seq, DocInfos), FinalAcc = try FoldFun( fun(DocInfo, Acc) -> case Fun(DocInfo, Acc) of {ok, NewAcc} -> NewAcc; {stop, NewAcc} -> throw({stop, NewAcc}) end end, Acc0, SortedDocInfos) catch throw:{stop, Acc} -> Acc end, case Dir of fwd -> {ok, FinalAcc#changes_acc{seq = couch_db:get_update_seq(Db)}}; rev -> {ok, FinalAcc} end. keep_sending_changes(Args, Acc0, FirstRound) -> #changes_args{ feed = ResponseType, limit = Limit, db_open_options = DbOptions } = Args, {ok, ChangesAcc} = send_changes( Args#changes_args{dir=fwd}, Acc0, FirstRound), #changes_acc{ db = Db, callback = Callback, timeout = Timeout, timeout_fun = TimeoutFun, seq = EndSeq, prepend = Prepend2, user_acc = UserAcc2, limit = NewLimit } = ChangesAcc, couch_db:close(Db), if Limit > NewLimit, ResponseType == "longpoll" -> end_sending_changes(Callback, UserAcc2, EndSeq, ResponseType); true -> case wait_db_updated(Timeout, TimeoutFun, UserAcc2) of {updated, UserAcc4} -> DbOptions1 = [{user_ctx, Db#db.user_ctx} | DbOptions], case couch_db:open(Db#db.name, DbOptions1) of {ok, Db2} -> keep_sending_changes( Args#changes_args{limit=NewLimit}, ChangesAcc#changes_acc{ db = Db2, user_acc = UserAcc4, seq = EndSeq, prepend = Prepend2, timeout = Timeout, timeout_fun = TimeoutFun}, false); _Else -> end_sending_changes(Callback, UserAcc2, EndSeq, ResponseType) end; {stop, UserAcc4} -> end_sending_changes(Callback, UserAcc4, EndSeq, ResponseType) end end. end_sending_changes(Callback, UserAcc, EndSeq, ResponseType) -> Callback({stop, EndSeq}, ResponseType, UserAcc). changes_enumerator(DocInfo, #changes_acc{resp_type = ResponseType} = Acc) when ResponseType =:= "continuous" orelse ResponseType =:= "eventsource" -> #changes_acc{ filter = FilterFun, callback = Callback, user_acc = UserAcc, limit = Limit, db = Db, timeout = Timeout, timeout_fun = TimeoutFun } = Acc, #doc_info{high_seq = Seq} = DocInfo, Results0 = FilterFun(Db, DocInfo), Results = [Result || Result <- Results0, Result /= null], %% TODO: I'm thinking this should be < 1 and not =< 1 Go = if Limit =< 1 -> stop; true -> ok end, case Results of [] -> {Done, UserAcc2} = maybe_heartbeat(Timeout, TimeoutFun, UserAcc), case Done of stop -> {stop, Acc#changes_acc{seq = Seq, user_acc = UserAcc2}}; ok -> {Go, Acc#changes_acc{seq = Seq, user_acc = UserAcc2}} end; _ -> ChangesRow = changes_row(Results, DocInfo, Acc), UserAcc2 = Callback({change, ChangesRow, <<>>}, ResponseType, UserAcc), reset_heartbeat(), {Go, Acc#changes_acc{seq = Seq, user_acc = UserAcc2, limit = Limit - 1}} end; changes_enumerator(DocInfo, Acc) -> #changes_acc{ filter = FilterFun, callback = Callback, prepend = Prepend, user_acc = UserAcc, limit = Limit, resp_type = ResponseType, db = Db, timeout = Timeout, timeout_fun = TimeoutFun } = Acc, #doc_info{high_seq = Seq} = DocInfo, Results0 = FilterFun(Db, DocInfo), Results = [Result || Result <- Results0, Result /= null], Go = if (Limit =< 1) andalso Results =/= [] -> stop; true -> ok end, case Results of [] -> {Done, UserAcc2} = maybe_heartbeat(Timeout, TimeoutFun, UserAcc), case Done of stop -> {stop, Acc#changes_acc{seq = Seq, user_acc = UserAcc2}}; ok -> {Go, Acc#changes_acc{seq = Seq, user_acc = UserAcc2}} end; _ -> ChangesRow = changes_row(Results, DocInfo, Acc), UserAcc2 = Callback({change, ChangesRow, Prepend}, ResponseType, UserAcc), reset_heartbeat(), {Go, Acc#changes_acc{ seq = Seq, prepend = <<",\n">>, user_acc = UserAcc2, limit = Limit - 1}} end. changes_row(Results, DocInfo, Acc) -> #doc_info{ id = Id, high_seq = Seq, revs = [#rev_info{deleted = Del} | _] } = DocInfo, #changes_acc{ db = Db, include_docs = IncDoc, doc_options = DocOpts, conflicts = Conflicts } = Acc, {[{<<"seq">>, Seq}, {<<"id">>, Id}, {<<"changes">>, Results}] ++ deleted_item(Del) ++ case IncDoc of true -> Opts = case Conflicts of true -> [deleted, conflicts]; false -> [deleted] end, Doc = couch_index_util:load_doc(Db, DocInfo, Opts), case Doc of null -> [{doc, null}]; _ -> [{doc, couch_doc:to_json_obj(Doc, DocOpts)}] end; false -> [] end}. deleted_item(true) -> [{<<"deleted">>, true}]; deleted_item(_) -> []. % waits for a db_updated msg, if there are multiple msgs, collects them. wait_db_updated(Timeout, TimeoutFun, UserAcc) -> receive db_updated -> get_rest_db_updated(UserAcc) after Timeout -> {Go, UserAcc2} = TimeoutFun(UserAcc), case Go of ok -> wait_db_updated(Timeout, TimeoutFun, UserAcc2); stop -> {stop, UserAcc2} end end. get_rest_db_updated(UserAcc) -> receive db_updated -> get_rest_db_updated(UserAcc) after 0 -> {updated, UserAcc} end. reset_heartbeat() -> case get(last_changes_heartbeat) of undefined -> ok; _ -> put(last_changes_heartbeat, now()) end. maybe_heartbeat(Timeout, TimeoutFun, Acc) -> Before = get(last_changes_heartbeat), case Before of undefined -> {ok, Acc}; _ -> Now = now(), case timer:now_diff(Now, Before) div 1000 >= Timeout of true -> Acc2 = TimeoutFun(Acc), put(last_changes_heartbeat, Now), Acc2; false -> {ok, Acc} end end. apache-couchdb-1.6.0/src/couchdb/couch_os_process.erl0000644000175000001440000001605512332105522022567 0ustar00djcusers00000000000000% Licensed under the Apache License, Version 2.0 (the "License"); you may not % use this file except in compliance with the License. You may obtain a copy of % the License at % % http://www.apache.org/licenses/LICENSE-2.0 % % Unless required by applicable law or agreed to in writing, software % distributed under the License is distributed on an "AS IS" BASIS, WITHOUT % WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the % License for the specific language governing permissions and limitations under % the License. -module(couch_os_process). -behaviour(gen_server). -export([start_link/1, start_link/2, start_link/3, stop/1]). -export([set_timeout/2, prompt/2]). -export([send/2, writeline/2, readline/1, writejson/2, readjson/1]). -export([init/1, terminate/2, handle_call/3, handle_cast/2, handle_info/2, code_change/3]). -include("couch_db.hrl"). -define(PORT_OPTIONS, [stream, {line, 4096}, binary, exit_status, hide]). -record(os_proc, {command, port, writer, reader, timeout=5000 }). start_link(Command) -> start_link(Command, []). start_link(Command, Options) -> start_link(Command, Options, ?PORT_OPTIONS). start_link(Command, Options, PortOptions) -> gen_server:start_link(couch_os_process, [Command, Options, PortOptions], []). stop(Pid) -> gen_server:cast(Pid, stop). % Read/Write API set_timeout(Pid, TimeOut) when is_integer(TimeOut) -> ok = gen_server:call(Pid, {set_timeout, TimeOut}, infinity). % Used by couch_db_update_notifier.erl send(Pid, Data) -> gen_server:cast(Pid, {send, Data}). prompt(Pid, Data) -> case gen_server:call(Pid, {prompt, Data}, infinity) of {ok, Result} -> Result; Error -> ?LOG_ERROR("OS Process Error ~p :: ~p",[Pid,Error]), throw(Error) end. % Utility functions for reading and writing % in custom functions writeline(OsProc, Data) when is_record(OsProc, os_proc) -> port_command(OsProc#os_proc.port, [Data, $\n]). readline(#os_proc{} = OsProc) -> readline(OsProc, []). readline(#os_proc{port = Port} = OsProc, Acc) -> receive {Port, {data, {noeol, Data}}} when is_binary(Acc) -> readline(OsProc, <>); {Port, {data, {noeol, Data}}} when is_binary(Data) -> readline(OsProc, Data); {Port, {data, {noeol, Data}}} -> readline(OsProc, [Data|Acc]); {Port, {data, {eol, <>}}} when is_binary(Acc) -> [<>]; {Port, {data, {eol, Data}}} when is_binary(Data) -> [Data]; {Port, {data, {eol, Data}}} -> lists:reverse(Acc, Data); {Port, Err} -> catch port_close(Port), throw({os_process_error, Err}) after OsProc#os_proc.timeout -> catch port_close(Port), throw({os_process_error, "OS process timed out."}) end. % Standard JSON functions writejson(OsProc, Data) when is_record(OsProc, os_proc) -> JsonData = ?JSON_ENCODE(Data), ?LOG_DEBUG("OS Process ~p Input :: ~s", [OsProc#os_proc.port, JsonData]), true = writeline(OsProc, JsonData). readjson(OsProc) when is_record(OsProc, os_proc) -> Line = iolist_to_binary(readline(OsProc)), ?LOG_DEBUG("OS Process ~p Output :: ~s", [OsProc#os_proc.port, Line]), try % Don't actually parse the whole JSON. Just try to see if it's % a command or a doc map/reduce/filter/show/list/update output. % If it's a command then parse the whole JSON and execute the % command, otherwise return the raw JSON line to the caller. pick_command(Line) catch throw:abort -> {json, Line}; throw:{cmd, _Cmd} -> case ?JSON_DECODE(Line) of [<<"log">>, Msg] when is_binary(Msg) -> % we got a message to log. Log it and continue ?LOG_INFO("OS Process ~p Log :: ~s", [OsProc#os_proc.port, Msg]), readjson(OsProc); [<<"error">>, Id, Reason] -> throw({error, {couch_util:to_existing_atom(Id),Reason}}); [<<"fatal">>, Id, Reason] -> ?LOG_INFO("OS Process ~p Fatal Error :: ~s ~p", [OsProc#os_proc.port, Id, Reason]), throw({couch_util:to_existing_atom(Id),Reason}); _Result -> {json, Line} end end. pick_command(Line) -> json_stream_parse:events(Line, fun pick_command0/1). pick_command0(array_start) -> fun pick_command1/1; pick_command0(_) -> throw(abort). pick_command1(<<"log">> = Cmd) -> throw({cmd, Cmd}); pick_command1(<<"error">> = Cmd) -> throw({cmd, Cmd}); pick_command1(<<"fatal">> = Cmd) -> throw({cmd, Cmd}); pick_command1(_) -> throw(abort). % gen_server API init([Command, Options, PortOptions]) -> PrivDir = couch_util:priv_dir(), Spawnkiller = filename:join(PrivDir, "couchspawnkillable"), BaseProc = #os_proc{ command=Command, port=open_port({spawn, Spawnkiller ++ " " ++ Command}, PortOptions), writer=fun writejson/2, reader=fun readjson/1 }, KillCmd = iolist_to_binary(readline(BaseProc)), Pid = self(), ?LOG_DEBUG("OS Process Start :: ~p", [BaseProc#os_proc.port]), spawn(fun() -> % this ensure the real os process is killed when this process dies. erlang:monitor(process, Pid), receive _ -> ok end, os:cmd(?b2l(iolist_to_binary(KillCmd))) end), OsProc = lists:foldl(fun(Opt, Proc) -> case Opt of {writer, Writer} when is_function(Writer) -> Proc#os_proc{writer=Writer}; {reader, Reader} when is_function(Reader) -> Proc#os_proc{reader=Reader}; {timeout, TimeOut} when is_integer(TimeOut) -> Proc#os_proc{timeout=TimeOut} end end, BaseProc, Options), {ok, OsProc}. terminate(_Reason, #os_proc{port=Port}) -> catch port_close(Port), ok. handle_call({set_timeout, TimeOut}, _From, OsProc) -> {reply, ok, OsProc#os_proc{timeout=TimeOut}}; handle_call({prompt, Data}, _From, OsProc) -> #os_proc{writer=Writer, reader=Reader} = OsProc, try Writer(OsProc, Data), {reply, {ok, Reader(OsProc)}, OsProc} catch throw:{error, OsError} -> {reply, OsError, OsProc}; throw:OtherError -> {stop, normal, OtherError, OsProc} end. handle_cast({send, Data}, #os_proc{writer=Writer}=OsProc) -> try Writer(OsProc, Data), {noreply, OsProc} catch throw:OsError -> ?LOG_ERROR("Failed sending data: ~p -> ~p", [Data, OsError]), {stop, normal, OsProc} end; handle_cast(stop, OsProc) -> {stop, normal, OsProc}; handle_cast(Msg, OsProc) -> ?LOG_DEBUG("OS Proc: Unknown cast: ~p", [Msg]), {noreply, OsProc}. handle_info({Port, {exit_status, 0}}, #os_proc{port=Port}=OsProc) -> ?LOG_INFO("OS Process terminated normally", []), {stop, normal, OsProc}; handle_info({Port, {exit_status, Status}}, #os_proc{port=Port}=OsProc) -> ?LOG_ERROR("OS Process died with status: ~p", [Status]), {stop, {exit_status, Status}, OsProc}. code_change(_OldVsn, State, _Extra) -> {ok, State}. apache-couchdb-1.6.0/src/couchdb/couch_httpd_cors.erl0000644000175000001440000002727012332105522022562 0ustar00djcusers00000000000000% Licensed under the Apache License, Version 2.0 (the "License"); you may not % use this file except in compliance with the License. You may obtain a copy of % the License at % % http://www.apache.org/licenses/LICENSE-2.0 % % Unless required by applicable law or agreed to in writing, software % distributed under the License is distributed on an "AS IS" BASIS, WITHOUT % WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the % License for the specific language governing permissions and limitations under % the License. %% @doc module to handle Cross-Origin Resource Sharing %% %% This module handles CORS requests and preflight request for %% CouchDB. The configuration is done in the ini file. %% %% This implements http://www.w3.org/TR/cors/ -module(couch_httpd_cors). -include("couch_db.hrl"). -export([is_preflight_request/1, cors_headers/2]). -define(SUPPORTED_HEADERS, "Accept, Accept-Language, Content-Type," ++ "Expires, Last-Modified, Pragma, Origin, Content-Length," ++ "If-Match, Destination, X-Requested-With, " ++ "X-Http-Method-Override, Content-Range"). -define(SUPPORTED_METHODS, "GET, HEAD, POST, PUT, DELETE," ++ "TRACE, CONNECT, COPY, OPTIONS"). % as defined in http://www.w3.org/TR/cors/#terminology -define(SIMPLE_HEADERS, ["Cache-Control", "Content-Language", "Content-Type", "Expires", "Last-Modified", "Pragma"]). -define(ALLOWED_HEADERS, lists:sort(["Server", "Etag", "Accept-Ranges" | ?SIMPLE_HEADERS])). -define(SIMPLE_CONTENT_TYPE_VALUES, ["application/x-www-form-urlencoded", "multipart/form-data", "text/plain"]). % TODO: - pick a sane default -define(CORS_DEFAULT_MAX_AGE, 12345). %% is_preflight_request/1 % http://www.w3.org/TR/cors/#resource-preflight-requests is_preflight_request(#httpd{method=Method}=Req) when Method /= 'OPTIONS' -> Req; is_preflight_request(Req) -> EnableCors = enable_cors(), is_preflight_request(Req, EnableCors). is_preflight_request(Req, false) -> Req; is_preflight_request(#httpd{mochi_req=MochiReq}=Req, true) -> case preflight_request(MochiReq) of {ok, PreflightHeaders} -> send_preflight_response(Req, PreflightHeaders); _ -> Req end. preflight_request(MochiReq) -> Origin = MochiReq:get_header_value("Origin"), preflight_request(MochiReq, Origin). preflight_request(MochiReq, undefined) -> % If the Origin header is not present terminate this set of % steps. The request is outside the scope of this specification. % http://www.w3.org/TR/cors/#resource-preflight-requests MochiReq; preflight_request(MochiReq, Origin) -> Host = couch_httpd_vhost:host(MochiReq), AcceptedOrigins = get_accepted_origins(Host), AcceptAll = lists:member("*", AcceptedOrigins), HandlerFun = fun() -> OriginList = couch_util:to_list(Origin), handle_preflight_request(OriginList, Host, MochiReq) end, case AcceptAll of true -> % Always matching is acceptable since the list of % origins can be unbounded. % http://www.w3.org/TR/cors/#resource-preflight-requests HandlerFun(); false -> case lists:member(Origin, AcceptedOrigins) of % The Origin header can only contain a single origin as % the user agent will not follow redirects. % http://www.w3.org/TR/cors/#resource-preflight-requests % TODO: Square against multi origin thinger in Security Considerations true -> HandlerFun(); false -> % If the value of the Origin header is not a % case-sensitive match for any of the values % in list of origins do not set any additional % headers and terminate this set of steps. % http://www.w3.org/TR/cors/#resource-preflight-requests false end end. handle_preflight_request(Origin, Host, MochiReq) -> %% get supported methods SupportedMethods = split_list(cors_config(Host, "methods", ?SUPPORTED_METHODS)), % get supported headers AllSupportedHeaders = split_list(cors_config(Host, "headers", ?SUPPORTED_HEADERS)), SupportedHeaders = [string:to_lower(H) || H <- AllSupportedHeaders], % get max age MaxAge = cors_config(Host, "max_age", ?CORS_DEFAULT_MAX_AGE), PreflightHeaders0 = maybe_add_credentials(Origin, Host, [ {"Access-Control-Allow-Origin", Origin}, {"Access-Control-Max-Age", MaxAge}, {"Access-Control-Allow-Methods", string:join(SupportedMethods, ", ")}]), case MochiReq:get_header_value("Access-Control-Request-Method") of undefined -> % If there is no Access-Control-Request-Method header % or if parsing failed, do not set any additional headers % and terminate this set of steps. The request is outside % the scope of this specification. % http://www.w3.org/TR/cors/#resource-preflight-requests {ok, PreflightHeaders0}; Method -> case lists:member(Method, SupportedMethods) of true -> % method ok , check headers AccessHeaders = MochiReq:get_header_value( "Access-Control-Request-Headers"), {FinalReqHeaders, ReqHeaders} = case AccessHeaders of undefined -> {"", []}; Headers -> % transform header list in something we % could check. make sure everything is a % list RH = [string:to_lower(H) || H <- split_headers(Headers)], {Headers, RH} end, % check if headers are supported case ReqHeaders -- SupportedHeaders of [] -> PreflightHeaders = PreflightHeaders0 ++ [{"Access-Control-Allow-Headers", FinalReqHeaders}], {ok, PreflightHeaders}; _ -> false end; false -> % If method is not a case-sensitive match for any of % the values in list of methods do not set any additional % headers and terminate this set of steps. % http://www.w3.org/TR/cors/#resource-preflight-requests false end end. send_preflight_response(#httpd{mochi_req=MochiReq}=Req, Headers) -> couch_httpd:log_request(Req, 204), couch_stats_collector:increment({httpd_status_codes, 204}), Headers1 = couch_httpd:http_1_0_keep_alive(MochiReq, Headers), Headers2 = Headers1 ++ couch_httpd:server_header() ++ couch_httpd_auth:cookie_auth_header(Req, Headers1), {ok, MochiReq:respond({204, Headers2, <<>>})}. % cors_headers/1 cors_headers(MochiReq, RequestHeaders) -> EnableCors = enable_cors(), CorsHeaders = do_cors_headers(MochiReq, EnableCors), maybe_apply_cors_headers(CorsHeaders, RequestHeaders). do_cors_headers(#httpd{mochi_req=MochiReq}, true) -> Host = couch_httpd_vhost:host(MochiReq), AcceptedOrigins = get_accepted_origins(Host), case MochiReq:get_header_value("Origin") of undefined -> % If the Origin header is not present terminate % this set of steps. The request is outside the scope % of this specification. % http://www.w3.org/TR/cors/#resource-processing-model []; Origin -> handle_cors_headers(couch_util:to_list(Origin), Host, AcceptedOrigins) end; do_cors_headers(_MochiReq, false) -> []. maybe_apply_cors_headers([], RequestHeaders) -> RequestHeaders; maybe_apply_cors_headers(CorsHeaders, RequestHeaders0) -> % for each RequestHeader that isn't in SimpleHeaders, % (or Content-Type with SIMPLE_CONTENT_TYPE_VALUES) % append to Access-Control-Expose-Headers % return: RequestHeaders ++ CorsHeaders ++ ACEH RequestHeaders = [K || {K,_V} <- RequestHeaders0], ExposedHeaders0 = reduce_headers(RequestHeaders, ?ALLOWED_HEADERS), % here we may have not moved Content-Type into ExposedHeaders, % now we need to check whether the Content-Type valus is % in ?SIMPLE_CONTENT_TYPE_VALUES and if it isn’t add Content- % Type to to ExposedHeaders ContentType = proplists:get_value("Content-Type", RequestHeaders0), IncludeContentType = case ContentType of undefined -> false; _ -> ContentType_ = string:to_lower(ContentType), lists:member(ContentType_, ?SIMPLE_CONTENT_TYPE_VALUES) end, ExposedHeaders = case IncludeContentType of false -> lists:umerge(ExposedHeaders0, ["Content-Type"]); true -> ExposedHeaders0 end, CorsHeaders ++ RequestHeaders0 ++ [{"Access-Control-Expose-Headers", string:join(ExposedHeaders, ", ")}]. reduce_headers(A, B) -> reduce_headers0(A, B, []). reduce_headers0([], _B, Result) -> lists:sort(Result); reduce_headers0([ElmA|RestA], B, Result) -> R = case member_nocase(ElmA, B) of false -> Result; _Else -> [ElmA | Result] end, reduce_headers0(RestA, B, R). member_nocase(ElmA, List) -> lists:any(fun(ElmB) -> string:to_lower(ElmA) =:= string:to_lower(ElmB) end, List). handle_cors_headers(_Origin, _Host, []) -> []; handle_cors_headers(Origin, Host, AcceptedOrigins) -> AcceptAll = lists:member("*", AcceptedOrigins), case {AcceptAll, lists:member(Origin, AcceptedOrigins)} of {true, _} -> make_cors_header(Origin, Host); {false, true} -> make_cors_header(Origin, Host); _ -> % If the value of the Origin header is not a % case-sensitive match for any of the values % in list of origins, do not set any additional % headers and terminate this set of steps. % http://www.w3.org/TR/cors/#resource-requests [] end. make_cors_header(Origin, Host) -> Headers = [{"Access-Control-Allow-Origin", Origin}], maybe_add_credentials(Origin, Host, Headers). %% util maybe_add_credentials(Origin, Host, Headers) -> maybe_add_credentials(Headers, allow_credentials(Origin, Host)). maybe_add_credentials(Headers, false) -> Headers; maybe_add_credentials(Headers, true) -> Headers ++ [{"Access-Control-Allow-Credentials", "true"}]. allow_credentials("*", _Host) -> false; allow_credentials(_Origin, Host) -> Default = get_bool_config("cors", "credentials", false), get_bool_config(cors_section(Host), "credentials", Default). cors_config(Host, Key, Default) -> couch_config:get(cors_section(Host), Key, couch_config:get("cors", Key, Default)). cors_section(Host0) -> {Host, _Port} = split_host_port(Host0), "cors:" ++ Host. enable_cors() -> get_bool_config("httpd", "enable_cors", false). get_bool_config(Section, Key, Default) -> case couch_config:get(Section, Key) of undefined -> Default; "true" -> true; "false" -> false end. get_accepted_origins(Host) -> split_list(cors_config(Host, "origins", [])). split_list(S) -> re:split(S, "\\s*,\\s*", [trim, {return, list}]). split_headers(H) -> re:split(H, ",\\s*", [{return,list}, trim]). split_host_port(HostAsString) -> % split at semicolon ":" Split = string:rchr(HostAsString, $:), split_host_port(HostAsString, Split). split_host_port(HostAsString, 0) -> % no semicolon {HostAsString, '*'}; split_host_port(HostAsString, N) -> HostPart = string:substr(HostAsString, 1, N-1), % parse out port % is there a nicer way? case (catch erlang:list_to_integer(string:substr(HostAsString, N+1, length(HostAsString)))) of {'EXIT', _} -> {HostAsString, '*'}; Port -> {HostPart, Port} end. apache-couchdb-1.6.0/src/couchdb/couch_task_status.erl0000644000175000001440000001075512332105522022756 0ustar00djcusers00000000000000% Licensed under the Apache License, Version 2.0 (the "License"); you may not % use this file except in compliance with the License. You may obtain a copy of % the License at % % http://www.apache.org/licenses/LICENSE-2.0 % % Unless required by applicable law or agreed to in writing, software % distributed under the License is distributed on an "AS IS" BASIS, WITHOUT % WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the % License for the specific language governing permissions and limitations under % the License. -module(couch_task_status). -behaviour(gen_server). % This module is used to track the status of long running tasks. % Long running tasks register themselves, via a call to add_task/1, and then % update their status properties via update/1. The status of a task is a % list of properties. Each property is a tuple, with the first element being % either an atom or a binary and the second element must be an EJSON value. When % a task updates its status, it can override some or all of its properties. % The properties {started_on, UnitTimestamp}, {updated_on, UnixTimestamp} and % {pid, ErlangPid} are automatically added by this module. % When a tracked task dies, its status will be automatically removed from % memory. To get the tasks list, call the all/0 function. -export([start_link/0, stop/0]). -export([all/0, add_task/1, update/1, get/1, set_update_frequency/1]). -export([is_task_added/0]). -export([init/1, terminate/2, code_change/3]). -export([handle_call/3, handle_cast/2, handle_info/2]). -include("couch_db.hrl"). -define(set(L, K, V), lists:keystore(K, 1, L, {K, V})). start_link() -> gen_server:start_link({local, ?MODULE}, ?MODULE, [], []). stop() -> gen_server:cast(?MODULE, stop). all() -> gen_server:call(?MODULE, all). add_task(Props) -> put(task_status_update, {{0, 0, 0}, 0}), Ts = timestamp(), TaskProps = lists:ukeysort( 1, [{started_on, Ts}, {updated_on, Ts} | Props]), put(task_status_props, TaskProps), gen_server:call(?MODULE, {add_task, TaskProps}). is_task_added() -> is_list(erlang:get(task_status_props)). set_update_frequency(Msecs) -> put(task_status_update, {{0, 0, 0}, Msecs * 1000}). update(Props) -> MergeProps = lists:ukeysort(1, Props), TaskProps = lists:ukeymerge(1, MergeProps, erlang:get(task_status_props)), put(task_status_props, TaskProps), maybe_persist(TaskProps). get(Props) when is_list(Props) -> TaskProps = erlang:get(task_status_props), [couch_util:get_value(P, TaskProps) || P <- Props]; get(Prop) -> TaskProps = erlang:get(task_status_props), couch_util:get_value(Prop, TaskProps). maybe_persist(TaskProps0) -> {LastUpdateTime, Frequency} = erlang:get(task_status_update), case timer:now_diff(Now = now(), LastUpdateTime) >= Frequency of true -> put(task_status_update, {Now, Frequency}), TaskProps = ?set(TaskProps0, updated_on, timestamp(Now)), gen_server:cast(?MODULE, {update_status, self(), TaskProps}); false -> ok end. init([]) -> % read configuration settings and register for configuration changes ets:new(?MODULE, [ordered_set, protected, named_table]), {ok, nil}. terminate(_Reason,_State) -> ok. handle_call({add_task, TaskProps}, {From, _}, Server) -> case ets:lookup(?MODULE, From) of [] -> true = ets:insert(?MODULE, {From, TaskProps}), erlang:monitor(process, From), {reply, ok, Server}; [_] -> {reply, {add_task_error, already_registered}, Server} end; handle_call(all, _, Server) -> All = [ [{pid, ?l2b(pid_to_list(Pid))} | TaskProps] || {Pid, TaskProps} <- ets:tab2list(?MODULE) ], {reply, All, Server}. handle_cast({update_status, Pid, NewProps}, Server) -> case ets:lookup(?MODULE, Pid) of [{Pid, _CurProps}] -> ?LOG_DEBUG("New task status for ~p: ~p", [Pid, NewProps]), true = ets:insert(?MODULE, {Pid, NewProps}); _ -> % Task finished/died in the meanwhile and we must have received % a monitor message before this call - ignore. ok end, {noreply, Server}; handle_cast(stop, State) -> {stop, normal, State}. handle_info({'DOWN', _MonitorRef, _Type, Pid, _Info}, Server) -> %% should we also erlang:demonitor(_MonitorRef), ? ets:delete(?MODULE, Pid), {noreply, Server}. code_change(_OldVsn, State, _Extra) -> {ok, State}. timestamp() -> timestamp(now()). timestamp({Mega, Secs, _}) -> Mega * 1000000 + Secs. apache-couchdb-1.6.0/src/couchdb/couch_log.erl0000644000175000001440000001716412332105522021173 0ustar00djcusers00000000000000% Licensed under the Apache License, Version 2.0 (the "License"); you may not % use this file except in compliance with the License. You may obtain a copy of % the License at % % http://www.apache.org/licenses/LICENSE-2.0 % % Unless required by applicable law or agreed to in writing, software % distributed under the License is distributed on an "AS IS" BASIS, WITHOUT % WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the % License for the specific language governing permissions and limitations under % the License. -module(couch_log). -behaviour(gen_event). % public API -export([start_link/0, stop/0]). -export([debug/2, info/2, warn/2, error/2]). -export([debug_on/0, info_on/0, warn_on/0, get_level/0, get_level_integer/0, set_level/1]). -export([debug_on/1, info_on/1, warn_on/1, get_level/1, get_level_integer/1, set_level/2]). -export([read/2]). % gen_event callbacks -export([init/1, handle_event/2, terminate/2, code_change/3]). -export([handle_info/2, handle_call/2]). -define(LEVEL_ERROR, 4). -define(LEVEL_WARN, 3). -define(LEVEL_INFO, 2). -define(LEVEL_DEBUG, 1). -record(state, { fd, level, sasl }). debug(Format, Args) -> {ConsoleMsg, FileMsg} = get_log_messages(self(), debug, Format, Args), gen_event:sync_notify(error_logger, {couch_debug, ConsoleMsg, FileMsg}). info(Format, Args) -> {ConsoleMsg, FileMsg} = get_log_messages(self(), info, Format, Args), gen_event:sync_notify(error_logger, {couch_info, ConsoleMsg, FileMsg}). warn(Format, Args) -> {ConsoleMsg, FileMsg} = get_log_messages(self(), warn, Format, Args), gen_event:sync_notify(error_logger, {couch_warn, ConsoleMsg, FileMsg}). error(Format, Args) -> {ConsoleMsg, FileMsg} = get_log_messages(self(), error, Format, Args), gen_event:sync_notify(error_logger, {couch_error, ConsoleMsg, FileMsg}). level_integer(error) -> ?LEVEL_ERROR; level_integer(warn) -> ?LEVEL_WARN; level_integer(info) -> ?LEVEL_INFO; level_integer(debug) -> ?LEVEL_DEBUG; level_integer(_Else) -> ?LEVEL_ERROR. % anything else default to ERROR level level_atom(?LEVEL_ERROR) -> error; level_atom(?LEVEL_WARN) -> warn; level_atom(?LEVEL_INFO) -> info; level_atom(?LEVEL_DEBUG) -> debug. start_link() -> couch_event_sup:start_link({local, couch_log}, error_logger, couch_log, []). stop() -> couch_event_sup:stop(couch_log). init([]) -> % read config and register for configuration changes % just stop if one of the config settings change. couch_server_sup % will restart us and then we will pick up the new settings. ok = couch_config:register( fun("log", "file") -> ?MODULE:stop(); ("log", "level") -> ?MODULE:stop(); ("log", "include_sasl") -> ?MODULE:stop(); ("log_level_by_module", _) -> ?MODULE:stop() end), Filename = couch_config:get("log", "file", "couchdb.log"), Level = level_integer(list_to_atom(couch_config:get("log", "level", "info"))), Sasl = couch_config:get("log", "include_sasl", "true") =:= "true", LevelByModule = couch_config:get("log_level_by_module"), case ets:info(?MODULE) of undefined -> ets:new(?MODULE, [named_table]); _ -> ok end, ets:insert(?MODULE, {level, Level}), lists:foreach(fun({Module, ModuleLevel}) -> ModuleLevelInteger = level_integer(list_to_atom(ModuleLevel)), ets:insert(?MODULE, {Module, ModuleLevelInteger}) end, LevelByModule), case file:open(Filename, [append]) of {ok, Fd} -> {ok, #state{fd = Fd, level = Level, sasl = Sasl}}; {error, Reason} -> ReasonStr = file:format_error(Reason), io:format("Error opening log file ~s: ~s", [Filename, ReasonStr]), {stop, {error, ReasonStr, Filename}} end. debug_on() -> get_level_integer() =< ?LEVEL_DEBUG. info_on() -> get_level_integer() =< ?LEVEL_INFO. warn_on() -> get_level_integer() =< ?LEVEL_WARN. debug_on(Module) -> get_level_integer(Module) =< ?LEVEL_DEBUG. info_on(Module) -> get_level_integer(Module) =< ?LEVEL_INFO. warn_on(Module) -> get_level_integer(Module) =< ?LEVEL_WARN. set_level(LevelAtom) -> set_level_integer(level_integer(LevelAtom)). set_level(Module, LevelAtom) -> set_level_integer(Module, level_integer(LevelAtom)). get_level() -> level_atom(get_level_integer()). get_level(Module) -> level_atom(get_level_integer(Module)). get_level_integer() -> try ets:lookup_element(?MODULE, level, 2) catch error:badarg -> ?LEVEL_ERROR end. get_level_integer(Module0) -> Module = atom_to_list(Module0), try [{_Module, Level}] = ets:lookup(?MODULE, Module), Level catch error:_ -> get_level_integer() end. set_level_integer(Int) -> gen_event:call(error_logger, couch_log, {set_level_integer, Int}). set_level_integer(Module, Int) -> gen_event:call(error_logger, couch_log, {set_level_integer, Module, Int}). handle_event({couch_error, ConMsg, FileMsg}, State) -> log(State, ConMsg, FileMsg), {ok, State}; handle_event({couch_warn, ConMsg, FileMsg}, State) -> log(State, ConMsg, FileMsg), {ok, State}; handle_event({couch_info, ConMsg, FileMsg}, State) -> log(State, ConMsg, FileMsg), {ok, State}; handle_event({couch_debug, ConMsg, FileMsg}, State) -> log(State, ConMsg, FileMsg), {ok, State}; handle_event({error_report, _, {Pid, _, _}}=Event, #state{sasl = true} = St) -> {ConMsg, FileMsg} = get_log_messages(Pid, error, "~p", [Event]), log(St, ConMsg, FileMsg), {ok, St}; handle_event({error, _, {Pid, Format, Args}}, #state{sasl = true} = State) -> {ConMsg, FileMsg} = get_log_messages(Pid, error, Format, Args), log(State, ConMsg, FileMsg), {ok, State}; handle_event(_Event, State) -> {ok, State}. handle_call({set_level_integer, NewLevel}, State) -> ets:insert(?MODULE, {level, NewLevel}), {ok, ok, State#state{level = NewLevel}}; handle_call({set_level_integer, Module, NewLevel}, State) -> ets:insert(?MODULE, {Module, NewLevel}), {ok, ok, State#state{level = NewLevel}}. handle_info(_Info, State) -> {ok, State}. code_change(_OldVsn, State, _Extra) -> {ok, State}. terminate(_Arg, #state{fd = Fd}) -> file:close(Fd). log(#state{fd = Fd}, ConsoleMsg, FileMsg) -> ok = io:put_chars(ConsoleMsg), ok = io:put_chars(Fd, FileMsg). get_log_messages(Pid, Level, Format, Args) -> ConsoleMsg = unicode:characters_to_binary(io_lib:format( "[~s] [~p] " ++ Format ++ "~n", [Level, Pid | Args])), FileMsg = ["[", couch_util:rfc1123_date(), "] ", ConsoleMsg], {ConsoleMsg, iolist_to_binary(FileMsg)}. % Read Bytes bytes from the end of log file, jumping Offset bytes towards % the beginning of the file first. % % Log File FilePos % ---------- % | | 10 % | | 20 % | | 30 % | | 40 % | | 50 % | | 60 % | | 70 -- Bytes = 20 -- % | | 80 | Chunk % | | 90 -- Offset = 10 -- % |__________| 100 read(Bytes, Offset) -> LogFileName = couch_config:get("log", "file"), LogFileSize = filelib:file_size(LogFileName), MaxChunkSize = list_to_integer( couch_config:get("httpd", "log_max_chunk_size", "1000000")), case Bytes > MaxChunkSize of true -> throw({bad_request, "'bytes' cannot exceed " ++ integer_to_list(MaxChunkSize)}); false -> ok end, {ok, Fd} = file:open(LogFileName, [read]), Start = lists:max([LogFileSize - Bytes - Offset, 0]), % TODO: truncate chopped first line % TODO: make streaming {ok, Chunk} = file:pread(Fd, Start, Bytes), ok = file:close(Fd), Chunk. apache-couchdb-1.6.0/src/couchdb/couch_ejson_compare.erl0000644000175000001440000000566612332105522023242 0ustar00djcusers00000000000000% Licensed under the Apache License, Version 2.0 (the "License"); you may not % use this file except in compliance with the License. You may obtain a copy of % the License at % % http://www.apache.org/licenses/LICENSE-2.0 % % Unless required by applicable law or agreed to in writing, software % distributed under the License is distributed on an "AS IS" BASIS, WITHOUT % WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the % License for the specific language governing permissions and limitations under % the License. -module(couch_ejson_compare). -export([less/2, less_json_ids/2, less_json/2]). -on_load(init/0). init() -> LibDir = case couch_config:get("couchdb", "util_driver_dir") of undefined -> filename:join(couch_util:priv_dir(), "lib"); LibDir0 -> LibDir0 end, NumScheds = erlang:system_info(schedulers), (catch erlang:load_nif(filename:join([LibDir, ?MODULE]), NumScheds)), case erlang:system_info(otp_release) of "R13B03" -> true; _ -> ok end. less(A, B) -> try less_nif(A, B) catch error:badarg -> % Maybe the EJSON structure is too deep, fallback to Erlang land. less_erl(A, B) end. less_json_ids({JsonA, IdA}, {JsonB, IdB}) -> case less(JsonA, JsonB) of 0 -> IdA < IdB; Result -> Result < 0 end. less_json(A,B) -> less(A, B) < 0. less_nif(A, B) -> less_erl(A, B). less_erl(A,A) -> 0; less_erl(A,B) when is_atom(A), is_atom(B) -> atom_sort(A) - atom_sort(B); less_erl(A,_) when is_atom(A) -> -1; less_erl(_,B) when is_atom(B) -> 1; less_erl(A,B) when is_number(A), is_number(B) -> A - B; less_erl(A,_) when is_number(A) -> -1; less_erl(_,B) when is_number(B) -> 1; less_erl(A,B) when is_binary(A), is_binary(B) -> couch_util:collate(A,B); less_erl(A,_) when is_binary(A) -> -1; less_erl(_,B) when is_binary(B) -> 1; less_erl(A,B) when is_list(A), is_list(B) -> less_list(A,B); less_erl(A,_) when is_list(A) -> -1; less_erl(_,B) when is_list(B) -> 1; less_erl({A},{B}) when is_list(A), is_list(B) -> less_props(A,B); less_erl({A},_) when is_list(A) -> -1; less_erl(_,{B}) when is_list(B) -> 1. atom_sort(null) -> 1; atom_sort(false) -> 2; atom_sort(true) -> 3. less_props([], [_|_]) -> -1; less_props(_, []) -> 1; less_props([{AKey, AValue}|RestA], [{BKey, BValue}|RestB]) -> case couch_util:collate(AKey, BKey) of 0 -> case less_erl(AValue, BValue) of 0 -> less_props(RestA, RestB); Result -> Result end; Result -> Result end. less_list([], [_|_]) -> -1; less_list(_, []) -> 1; less_list([A|RestA], [B|RestB]) -> case less_erl(A,B) of 0 -> less_list(RestA, RestB); Result -> Result end. apache-couchdb-1.6.0/src/couchdb/couch_file.erl0000644000175000001440000004245712332105522021334 0ustar00djcusers00000000000000% Licensed under the Apache License, Version 2.0 (the "License"); you may not % use this file except in compliance with the License. You may obtain a copy of % the License at % % http://www.apache.org/licenses/LICENSE-2.0 % % Unless required by applicable law or agreed to in writing, software % distributed under the License is distributed on an "AS IS" BASIS, WITHOUT % WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the % License for the specific language governing permissions and limitations under % the License. -module(couch_file). -behaviour(gen_server). -include("couch_db.hrl"). -define(SIZE_BLOCK, 4096). -record(file, { fd, eof = 0 }). % public API -export([open/1, open/2, close/1, bytes/1, sync/1, truncate/2]). -export([pread_term/2, pread_iolist/2, pread_binary/2]). -export([append_binary/2, append_binary_md5/2]). -export([append_raw_chunk/2, assemble_file_chunk/1, assemble_file_chunk/2]). -export([append_term/2, append_term/3, append_term_md5/2, append_term_md5/3]). -export([write_header/2, read_header/1]). -export([delete/2, delete/3, nuke_dir/2, init_delete_dir/1]). % gen_server callbacks -export([init/1, terminate/2, code_change/3]). -export([handle_call/3, handle_cast/2, handle_info/2]). %%---------------------------------------------------------------------- %% Args: Valid Options are [create] and [create,overwrite]. %% Files are opened in read/write mode. %% Returns: On success, {ok, Fd} %% or {error, Reason} if the file could not be opened. %%---------------------------------------------------------------------- open(Filepath) -> open(Filepath, []). open(Filepath, Options) -> case gen_server:start_link(couch_file, {Filepath, Options, self(), Ref = make_ref()}, []) of {ok, Fd} -> {ok, Fd}; ignore -> % get the error receive {Ref, Pid, {error, Reason} = Error} -> case process_info(self(), trap_exit) of {trap_exit, true} -> receive {'EXIT', Pid, _} -> ok end; {trap_exit, false} -> ok end, case {lists:member(nologifmissing, Options), Reason} of {true, enoent} -> ok; _ -> ?LOG_ERROR("Could not open file ~s: ~s", [Filepath, file:format_error(Reason)]) end, Error end; Error -> % We can't say much here, because it could be any kind of error. % Just let it bubble and an encapsulating subcomponent can perhaps % be more informative. It will likely appear in the SASL log, anyway. Error end. %%---------------------------------------------------------------------- %% Purpose: To append an Erlang term to the end of the file. %% Args: Erlang term to serialize and append to the file. %% Returns: {ok, Pos, NumBytesWritten} where Pos is the file offset to %% the beginning the serialized term. Use pread_term to read the term %% back. %% or {error, Reason}. %%---------------------------------------------------------------------- append_term(Fd, Term) -> append_term(Fd, Term, []). append_term(Fd, Term, Options) -> Comp = couch_util:get_value(compression, Options, ?DEFAULT_COMPRESSION), append_binary(Fd, couch_compress:compress(Term, Comp)). append_term_md5(Fd, Term) -> append_term_md5(Fd, Term, []). append_term_md5(Fd, Term, Options) -> Comp = couch_util:get_value(compression, Options, ?DEFAULT_COMPRESSION), append_binary_md5(Fd, couch_compress:compress(Term, Comp)). %%---------------------------------------------------------------------- %% Purpose: To append an Erlang binary to the end of the file. %% Args: Erlang term to serialize and append to the file. %% Returns: {ok, Pos, NumBytesWritten} where Pos is the file offset to the %% beginning the serialized term. Use pread_term to read the term back. %% or {error, Reason}. %%---------------------------------------------------------------------- append_binary(Fd, Bin) -> gen_server:call(Fd, {append_bin, assemble_file_chunk(Bin)}, infinity). append_binary_md5(Fd, Bin) -> gen_server:call(Fd, {append_bin, assemble_file_chunk(Bin, couch_util:md5(Bin))}, infinity). append_raw_chunk(Fd, Chunk) -> gen_server:call(Fd, {append_bin, Chunk}, infinity). assemble_file_chunk(Bin) -> [<<0:1/integer, (iolist_size(Bin)):31/integer>>, Bin]. assemble_file_chunk(Bin, Md5) -> [<<1:1/integer, (iolist_size(Bin)):31/integer>>, Md5, Bin]. %%---------------------------------------------------------------------- %% Purpose: Reads a term from a file that was written with append_term %% Args: Pos, the offset into the file where the term is serialized. %% Returns: {ok, Term} %% or {error, Reason}. %%---------------------------------------------------------------------- pread_term(Fd, Pos) -> {ok, Bin} = pread_binary(Fd, Pos), {ok, couch_compress:decompress(Bin)}. %%---------------------------------------------------------------------- %% Purpose: Reads a binrary from a file that was written with append_binary %% Args: Pos, the offset into the file where the term is serialized. %% Returns: {ok, Term} %% or {error, Reason}. %%---------------------------------------------------------------------- pread_binary(Fd, Pos) -> {ok, L} = pread_iolist(Fd, Pos), {ok, iolist_to_binary(L)}. pread_iolist(Fd, Pos) -> case gen_server:call(Fd, {pread_iolist, Pos}, infinity) of {ok, IoList, <<>>} -> {ok, IoList}; {ok, IoList, Md5} -> case couch_util:md5(IoList) of Md5 -> {ok, IoList}; _ -> exit({file_corruption, <<"file corruption">>}) end; Error -> Error end. %%---------------------------------------------------------------------- %% Purpose: The length of a file, in bytes. %% Returns: {ok, Bytes} %% or {error, Reason}. %%---------------------------------------------------------------------- % length in bytes bytes(Fd) -> gen_server:call(Fd, bytes, infinity). %%---------------------------------------------------------------------- %% Purpose: Truncate a file to the number of bytes. %% Returns: ok %% or {error, Reason}. %%---------------------------------------------------------------------- truncate(Fd, Pos) -> gen_server:call(Fd, {truncate, Pos}, infinity). %%---------------------------------------------------------------------- %% Purpose: Ensure all bytes written to the file are flushed to disk. %% Returns: ok %% or {error, Reason}. %%---------------------------------------------------------------------- sync(Filepath) when is_list(Filepath) -> {ok, Fd} = file:open(Filepath, [append, raw]), try ok = file:sync(Fd) after ok = file:close(Fd) end; sync(Fd) -> gen_server:call(Fd, sync, infinity). %%---------------------------------------------------------------------- %% Purpose: Close the file. %% Returns: ok %%---------------------------------------------------------------------- close(Fd) -> couch_util:shutdown_sync(Fd). delete(RootDir, Filepath) -> delete(RootDir, Filepath, true). delete(RootDir, Filepath, Async) -> DelFile = filename:join([RootDir,".delete", ?b2l(couch_uuids:random())]), case file:rename(Filepath, DelFile) of ok -> if (Async) -> spawn(file, delete, [DelFile]), ok; true -> file:delete(DelFile) end; Error -> Error end. nuke_dir(RootDelDir, Dir) -> FoldFun = fun(File) -> Path = Dir ++ "/" ++ File, case filelib:is_dir(Path) of true -> ok = nuke_dir(RootDelDir, Path), file:del_dir(Path); false -> delete(RootDelDir, Path, false) end end, case file:list_dir(Dir) of {ok, Files} -> lists:foreach(FoldFun, Files), ok = file:del_dir(Dir); {error, enoent} -> ok end. init_delete_dir(RootDir) -> Dir = filename:join(RootDir,".delete"), % note: ensure_dir requires an actual filename companent, which is the % reason for "foo". filelib:ensure_dir(filename:join(Dir,"foo")), filelib:fold_files(Dir, ".*", true, fun(Filename, _) -> ok = file:delete(Filename) end, ok). read_header(Fd) -> case gen_server:call(Fd, find_header, infinity) of {ok, Bin} -> {ok, binary_to_term(Bin)}; Else -> Else end. write_header(Fd, Data) -> Bin = term_to_binary(Data), Md5 = couch_util:md5(Bin), % now we assemble the final header binary and write to disk FinalBin = <>, gen_server:call(Fd, {write_header, FinalBin}, infinity). init_status_error(ReturnPid, Ref, Error) -> ReturnPid ! {Ref, self(), Error}, ignore. % server functions init({Filepath, Options, ReturnPid, Ref}) -> process_flag(trap_exit, true), OpenOptions = file_open_options(Options), case lists:member(create, Options) of true -> filelib:ensure_dir(Filepath), case file:open(Filepath, OpenOptions) of {ok, Fd} -> {ok, Length} = file:position(Fd, eof), case Length > 0 of true -> % this means the file already exists and has data. % FYI: We don't differentiate between empty files and non-existant % files here. case lists:member(overwrite, Options) of true -> {ok, 0} = file:position(Fd, 0), ok = file:truncate(Fd), ok = file:sync(Fd), maybe_track_open_os_files(Options), {ok, #file{fd=Fd}}; false -> ok = file:close(Fd), init_status_error(ReturnPid, Ref, {error, eexist}) end; false -> maybe_track_open_os_files(Options), {ok, #file{fd=Fd}} end; Error -> init_status_error(ReturnPid, Ref, Error) end; false -> % open in read mode first, so we don't create the file if it doesn't exist. case file:open(Filepath, [read, raw]) of {ok, Fd_Read} -> {ok, Fd} = file:open(Filepath, OpenOptions), ok = file:close(Fd_Read), maybe_track_open_os_files(Options), {ok, Eof} = file:position(Fd, eof), {ok, #file{fd=Fd, eof=Eof}}; Error -> init_status_error(ReturnPid, Ref, Error) end end. file_open_options(Options) -> [read, raw, binary] ++ case lists:member(read_only, Options) of true -> []; false -> [append] end. maybe_track_open_os_files(FileOptions) -> case lists:member(sys_db, FileOptions) of true -> ok; false -> couch_stats_collector:track_process_count({couchdb, open_os_files}) end. terminate(_Reason, #file{fd = Fd}) -> ok = file:close(Fd). handle_call({pread_iolist, Pos}, _From, File) -> {RawData, NextPos} = try % up to 8Kbs of read ahead read_raw_iolist_int(File, Pos, 2 * ?SIZE_BLOCK - (Pos rem ?SIZE_BLOCK)) catch _:_ -> read_raw_iolist_int(File, Pos, 4) end, <> = iolist_to_binary(RawData), case Prefix of 1 -> {Md5, IoList} = extract_md5( maybe_read_more_iolist(RestRawData, 16 + Len, NextPos, File)), {reply, {ok, IoList, Md5}, File}; 0 -> IoList = maybe_read_more_iolist(RestRawData, Len, NextPos, File), {reply, {ok, IoList, <<>>}, File} end; handle_call(bytes, _From, #file{fd = Fd} = File) -> {reply, file:position(Fd, eof), File}; handle_call(sync, _From, #file{fd=Fd}=File) -> {reply, file:sync(Fd), File}; handle_call({truncate, Pos}, _From, #file{fd=Fd}=File) -> {ok, Pos} = file:position(Fd, Pos), case file:truncate(Fd) of ok -> {reply, ok, File#file{eof = Pos}}; Error -> {reply, Error, File} end; handle_call({append_bin, Bin}, _From, #file{fd = Fd, eof = Pos} = File) -> Blocks = make_blocks(Pos rem ?SIZE_BLOCK, Bin), Size = iolist_size(Blocks), case file:write(Fd, Blocks) of ok -> {reply, {ok, Pos, Size}, File#file{eof = Pos + Size}}; Error -> {reply, Error, File} end; handle_call({write_header, Bin}, _From, #file{fd = Fd, eof = Pos} = File) -> BinSize = byte_size(Bin), case Pos rem ?SIZE_BLOCK of 0 -> Padding = <<>>; BlockOffset -> Padding = <<0:(8*(?SIZE_BLOCK-BlockOffset))>> end, FinalBin = [Padding, <<1, BinSize:32/integer>> | make_blocks(5, [Bin])], case file:write(Fd, FinalBin) of ok -> {reply, ok, File#file{eof = Pos + iolist_size(FinalBin)}}; Error -> {reply, Error, File} end; handle_call(find_header, _From, #file{fd = Fd, eof = Pos} = File) -> {reply, find_header(Fd, Pos div ?SIZE_BLOCK), File}. handle_cast(close, Fd) -> {stop,normal,Fd}. code_change(_OldVsn, State, _Extra) -> {ok, State}. handle_info({'EXIT', _, normal}, Fd) -> {noreply, Fd}; handle_info({'EXIT', _, Reason}, Fd) -> {stop, Reason, Fd}. find_header(_Fd, -1) -> no_valid_header; find_header(Fd, Block) -> case (catch load_header(Fd, Block)) of {ok, Bin} -> {ok, Bin}; _Error -> find_header(Fd, Block -1) end. load_header(Fd, Block) -> {ok, <<1, HeaderLen:32/integer, RestBlock/binary>>} = file:pread(Fd, Block * ?SIZE_BLOCK, ?SIZE_BLOCK), TotalBytes = calculate_total_read_len(5, HeaderLen), case TotalBytes > byte_size(RestBlock) of false -> <> = RestBlock; true -> {ok, Missing} = file:pread( Fd, (Block * ?SIZE_BLOCK) + 5 + byte_size(RestBlock), TotalBytes - byte_size(RestBlock)), RawBin = <> end, <> = iolist_to_binary(remove_block_prefixes(5, RawBin)), Md5Sig = couch_util:md5(HeaderBin), {ok, HeaderBin}. maybe_read_more_iolist(Buffer, DataSize, _, _) when DataSize =< byte_size(Buffer) -> <> = Buffer, [Data]; maybe_read_more_iolist(Buffer, DataSize, NextPos, File) -> {Missing, _} = read_raw_iolist_int(File, NextPos, DataSize - byte_size(Buffer)), [Buffer, Missing]. -spec read_raw_iolist_int(#file{}, Pos::non_neg_integer(), Len::non_neg_integer()) -> {Data::iolist(), CurPos::non_neg_integer()}. read_raw_iolist_int(Fd, {Pos, _Size}, Len) -> % 0110 UPGRADE CODE read_raw_iolist_int(Fd, Pos, Len); read_raw_iolist_int(#file{fd = Fd}, Pos, Len) -> BlockOffset = Pos rem ?SIZE_BLOCK, TotalBytes = calculate_total_read_len(BlockOffset, Len), {ok, <>} = file:pread(Fd, Pos, TotalBytes), {remove_block_prefixes(BlockOffset, RawBin), Pos + TotalBytes}. -spec extract_md5(iolist()) -> {binary(), iolist()}. extract_md5(FullIoList) -> {Md5List, IoList} = split_iolist(FullIoList, 16, []), {iolist_to_binary(Md5List), IoList}. calculate_total_read_len(0, FinalLen) -> calculate_total_read_len(1, FinalLen) + 1; calculate_total_read_len(BlockOffset, FinalLen) -> case ?SIZE_BLOCK - BlockOffset of BlockLeft when BlockLeft >= FinalLen -> FinalLen; BlockLeft -> FinalLen + ((FinalLen - BlockLeft) div (?SIZE_BLOCK -1)) + if ((FinalLen - BlockLeft) rem (?SIZE_BLOCK -1)) =:= 0 -> 0; true -> 1 end end. remove_block_prefixes(_BlockOffset, <<>>) -> []; remove_block_prefixes(0, <<_BlockPrefix,Rest/binary>>) -> remove_block_prefixes(1, Rest); remove_block_prefixes(BlockOffset, Bin) -> BlockBytesAvailable = ?SIZE_BLOCK - BlockOffset, case size(Bin) of Size when Size > BlockBytesAvailable -> <> = Bin, [DataBlock | remove_block_prefixes(0, Rest)]; _Size -> [Bin] end. make_blocks(_BlockOffset, []) -> []; make_blocks(0, IoList) -> [<<0>> | make_blocks(1, IoList)]; make_blocks(BlockOffset, IoList) -> case split_iolist(IoList, (?SIZE_BLOCK - BlockOffset), []) of {Begin, End} -> [Begin | make_blocks(0, End)]; _SplitRemaining -> IoList end. %% @doc Returns a tuple where the first element contains the leading SplitAt %% bytes of the original iolist, and the 2nd element is the tail. If SplitAt %% is larger than byte_size(IoList), return the difference. -spec split_iolist(IoList::iolist(), SplitAt::non_neg_integer(), Acc::list()) -> {iolist(), iolist()} | non_neg_integer(). split_iolist(List, 0, BeginAcc) -> {lists:reverse(BeginAcc), List}; split_iolist([], SplitAt, _BeginAcc) -> SplitAt; split_iolist([<> | Rest], SplitAt, BeginAcc) when SplitAt > byte_size(Bin) -> split_iolist(Rest, SplitAt - byte_size(Bin), [Bin | BeginAcc]); split_iolist([<> | Rest], SplitAt, BeginAcc) -> <> = Bin, split_iolist([End | Rest], 0, [Begin | BeginAcc]); split_iolist([Sublist| Rest], SplitAt, BeginAcc) when is_list(Sublist) -> case split_iolist(Sublist, SplitAt, BeginAcc) of {Begin, End} -> {Begin, [End | Rest]}; SplitRemaining -> split_iolist(Rest, SplitAt - (SplitAt - SplitRemaining), [Sublist | BeginAcc]) end; split_iolist([Byte | Rest], SplitAt, BeginAcc) when is_integer(Byte) -> split_iolist(Rest, SplitAt - 1, [Byte | BeginAcc]). apache-couchdb-1.6.0/src/couchdb/couch_btree.erl0000644000175000001440000006630012332105522021507 0ustar00djcusers00000000000000% Licensed under the Apache License, Version 2.0 (the "License"); you may not % use this file except in compliance with the License. You may obtain a copy of % the License at % % http://www.apache.org/licenses/LICENSE-2.0 % % Unless required by applicable law or agreed to in writing, software % distributed under the License is distributed on an "AS IS" BASIS, WITHOUT % WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the % License for the specific language governing permissions and limitations under % the License. -module(couch_btree). -export([open/2, open/3, query_modify/4, add/2, add_remove/3]). -export([fold/4, full_reduce/1, final_reduce/2, size/1, foldl/3, foldl/4]). -export([fold_reduce/4, lookup/2, get_state/1, set_options/2]). -export([less/3]). -include("couch_db.hrl"). -define(CHUNK_THRESHOLD, 16#4ff). extract(#btree{extract_kv=Extract}, Value) -> Extract(Value). assemble(#btree{assemble_kv=Assemble}, Key, Value) -> Assemble(Key, Value). less(#btree{less=Less}, A, B) -> Less(A, B). % pass in 'nil' for State if a new Btree. open(State, Fd) -> {ok, #btree{root=State, fd=Fd}}. set_options(Bt, []) -> Bt; set_options(Bt, [{split, Extract}|Rest]) -> set_options(Bt#btree{extract_kv=Extract}, Rest); set_options(Bt, [{join, Assemble}|Rest]) -> set_options(Bt#btree{assemble_kv=Assemble}, Rest); set_options(Bt, [{less, Less}|Rest]) -> set_options(Bt#btree{less=Less}, Rest); set_options(Bt, [{reduce, Reduce}|Rest]) -> set_options(Bt#btree{reduce=Reduce}, Rest); set_options(Bt, [{compression, Comp}|Rest]) -> set_options(Bt#btree{compression=Comp}, Rest). open(State, Fd, Options) -> {ok, set_options(#btree{root=State, fd=Fd}, Options)}. get_state(#btree{root=Root}) -> Root. final_reduce(#btree{reduce=Reduce}, Val) -> final_reduce(Reduce, Val); final_reduce(Reduce, {[], []}) -> Reduce(reduce, []); final_reduce(_Bt, {[], [Red]}) -> Red; final_reduce(Reduce, {[], Reductions}) -> Reduce(rereduce, Reductions); final_reduce(Reduce, {KVs, Reductions}) -> Red = Reduce(reduce, KVs), final_reduce(Reduce, {[], [Red | Reductions]}). fold_reduce(#btree{root=Root}=Bt, Fun, Acc, Options) -> Dir = couch_util:get_value(dir, Options, fwd), StartKey = couch_util:get_value(start_key, Options), InEndRangeFun = make_key_in_end_range_function(Bt, Dir, Options), KeyGroupFun = couch_util:get_value(key_group_fun, Options, fun(_,_) -> true end), try {ok, Acc2, GroupedRedsAcc2, GroupedKVsAcc2, GroupedKey2} = reduce_stream_node(Bt, Dir, Root, StartKey, InEndRangeFun, undefined, [], [], KeyGroupFun, Fun, Acc), if GroupedKey2 == undefined -> {ok, Acc2}; true -> case Fun(GroupedKey2, {GroupedKVsAcc2, GroupedRedsAcc2}, Acc2) of {ok, Acc3} -> {ok, Acc3}; {stop, Acc3} -> {ok, Acc3} end end catch throw:{stop, AccDone} -> {ok, AccDone} end. full_reduce(#btree{root=nil,reduce=Reduce}) -> {ok, Reduce(reduce, [])}; full_reduce(#btree{root=Root}) -> {ok, element(2, Root)}. size(#btree{root = nil}) -> 0; size(#btree{root = {_P, _Red}}) -> % pre 1.2 format nil; size(#btree{root = {_P, _Red, Size}}) -> Size. % wraps a 2 arity function with the proper 3 arity function convert_fun_arity(Fun) when is_function(Fun, 2) -> fun (visit, KV, _Reds, AccIn) -> Fun(KV, AccIn); (traverse, _K, _Red, AccIn) -> {ok, AccIn} end; convert_fun_arity(Fun) when is_function(Fun, 3) -> fun (visit, KV, Reds, AccIn) -> Fun(KV, Reds, AccIn); (traverse, _K, _Red, AccIn) -> {ok, AccIn} end; convert_fun_arity(Fun) when is_function(Fun, 4) -> Fun. % Already arity 4 make_key_in_end_range_function(#btree{less=Less}, fwd, Options) -> case couch_util:get_value(end_key_gt, Options) of undefined -> case couch_util:get_value(end_key, Options) of undefined -> fun(_Key) -> true end; LastKey -> fun(Key) -> not Less(LastKey, Key) end end; EndKey -> fun(Key) -> Less(Key, EndKey) end end; make_key_in_end_range_function(#btree{less=Less}, rev, Options) -> case couch_util:get_value(end_key_gt, Options) of undefined -> case couch_util:get_value(end_key, Options) of undefined -> fun(_Key) -> true end; LastKey -> fun(Key) -> not Less(Key, LastKey) end end; EndKey -> fun(Key) -> Less(EndKey, Key) end end. foldl(Bt, Fun, Acc) -> fold(Bt, Fun, Acc, []). foldl(Bt, Fun, Acc, Options) -> fold(Bt, Fun, Acc, Options). fold(#btree{root=nil}, _Fun, Acc, _Options) -> {ok, {[], []}, Acc}; fold(#btree{root=Root}=Bt, Fun, Acc, Options) -> Dir = couch_util:get_value(dir, Options, fwd), InRange = make_key_in_end_range_function(Bt, Dir, Options), Result = case couch_util:get_value(start_key, Options) of undefined -> stream_node(Bt, [], Bt#btree.root, InRange, Dir, convert_fun_arity(Fun), Acc); StartKey -> stream_node(Bt, [], Bt#btree.root, StartKey, InRange, Dir, convert_fun_arity(Fun), Acc) end, case Result of {ok, Acc2}-> FullReduction = element(2, Root), {ok, {[], [FullReduction]}, Acc2}; {stop, LastReduction, Acc2} -> {ok, LastReduction, Acc2} end. add(Bt, InsertKeyValues) -> add_remove(Bt, InsertKeyValues, []). add_remove(Bt, InsertKeyValues, RemoveKeys) -> {ok, [], Bt2} = query_modify(Bt, [], InsertKeyValues, RemoveKeys), {ok, Bt2}. query_modify(Bt, LookupKeys, InsertValues, RemoveKeys) -> #btree{root=Root} = Bt, InsertActions = lists:map( fun(KeyValue) -> {Key, Value} = extract(Bt, KeyValue), {insert, Key, Value} end, InsertValues), RemoveActions = [{remove, Key, nil} || Key <- RemoveKeys], FetchActions = [{fetch, Key, nil} || Key <- LookupKeys], SortFun = fun({OpA, A, _}, {OpB, B, _}) -> case A == B of % A and B are equal, sort by op. true -> op_order(OpA) < op_order(OpB); false -> less(Bt, A, B) end end, Actions = lists:sort(SortFun, lists:append([InsertActions, RemoveActions, FetchActions])), {ok, KeyPointers, QueryResults} = modify_node(Bt, Root, Actions, []), {ok, NewRoot} = complete_root(Bt, KeyPointers), {ok, QueryResults, Bt#btree{root=NewRoot}}. % for ordering different operations with the same key. % fetch < remove < insert op_order(fetch) -> 1; op_order(remove) -> 2; op_order(insert) -> 3. lookup(#btree{root=Root, less=Less}=Bt, Keys) -> SortedKeys = lists:sort(Less, Keys), {ok, SortedResults} = lookup(Bt, Root, SortedKeys), % We want to return the results in the same order as the keys were input % but we may have changed the order when we sorted. So we need to put the % order back into the results. couch_util:reorder_results(Keys, SortedResults). lookup(_Bt, nil, Keys) -> {ok, [{Key, not_found} || Key <- Keys]}; lookup(Bt, Node, Keys) -> Pointer = element(1, Node), {NodeType, NodeList} = get_node(Bt, Pointer), case NodeType of kp_node -> lookup_kpnode(Bt, list_to_tuple(NodeList), 1, Keys, []); kv_node -> lookup_kvnode(Bt, list_to_tuple(NodeList), 1, Keys, []) end. lookup_kpnode(_Bt, _NodeTuple, _LowerBound, [], Output) -> {ok, lists:reverse(Output)}; lookup_kpnode(_Bt, NodeTuple, LowerBound, Keys, Output) when tuple_size(NodeTuple) < LowerBound -> {ok, lists:reverse(Output, [{Key, not_found} || Key <- Keys])}; lookup_kpnode(Bt, NodeTuple, LowerBound, [FirstLookupKey | _] = LookupKeys, Output) -> N = find_first_gteq(Bt, NodeTuple, LowerBound, tuple_size(NodeTuple), FirstLookupKey), {Key, PointerInfo} = element(N, NodeTuple), SplitFun = fun(LookupKey) -> not less(Bt, Key, LookupKey) end, case lists:splitwith(SplitFun, LookupKeys) of {[], GreaterQueries} -> lookup_kpnode(Bt, NodeTuple, N + 1, GreaterQueries, Output); {LessEqQueries, GreaterQueries} -> {ok, Results} = lookup(Bt, PointerInfo, LessEqQueries), lookup_kpnode(Bt, NodeTuple, N + 1, GreaterQueries, lists:reverse(Results, Output)) end. lookup_kvnode(_Bt, _NodeTuple, _LowerBound, [], Output) -> {ok, lists:reverse(Output)}; lookup_kvnode(_Bt, NodeTuple, LowerBound, Keys, Output) when tuple_size(NodeTuple) < LowerBound -> % keys not found {ok, lists:reverse(Output, [{Key, not_found} || Key <- Keys])}; lookup_kvnode(Bt, NodeTuple, LowerBound, [LookupKey | RestLookupKeys], Output) -> N = find_first_gteq(Bt, NodeTuple, LowerBound, tuple_size(NodeTuple), LookupKey), {Key, Value} = element(N, NodeTuple), case less(Bt, LookupKey, Key) of true -> % LookupKey is less than Key lookup_kvnode(Bt, NodeTuple, N, RestLookupKeys, [{LookupKey, not_found} | Output]); false -> case less(Bt, Key, LookupKey) of true -> % LookupKey is greater than Key lookup_kvnode(Bt, NodeTuple, N+1, RestLookupKeys, [{LookupKey, not_found} | Output]); false -> % LookupKey is equal to Key lookup_kvnode(Bt, NodeTuple, N, RestLookupKeys, [{LookupKey, {ok, assemble(Bt, LookupKey, Value)}} | Output]) end end. complete_root(_Bt, []) -> {ok, nil}; complete_root(_Bt, [{_Key, PointerInfo}])-> {ok, PointerInfo}; complete_root(Bt, KPs) -> {ok, ResultKeyPointers} = write_node(Bt, kp_node, KPs), complete_root(Bt, ResultKeyPointers). %%%%%%%%%%%%% The chunkify function sucks! %%%%%%%%%%%%% % It is inaccurate as it does not account for compression when blocks are % written. Plus with the "case byte_size(term_to_binary(InList)) of" code % it's probably really inefficient. chunkify(InList) -> case ?term_size(InList) of Size when Size > ?CHUNK_THRESHOLD -> NumberOfChunksLikely = ((Size div ?CHUNK_THRESHOLD) + 1), ChunkThreshold = Size div NumberOfChunksLikely, chunkify(InList, ChunkThreshold, [], 0, []); _Else -> [InList] end. chunkify([], _ChunkThreshold, [], 0, OutputChunks) -> lists:reverse(OutputChunks); chunkify([], _ChunkThreshold, OutList, _OutListSize, OutputChunks) -> lists:reverse([lists:reverse(OutList) | OutputChunks]); chunkify([InElement | RestInList], ChunkThreshold, OutList, OutListSize, OutputChunks) -> case ?term_size(InElement) of Size when (Size + OutListSize) > ChunkThreshold andalso OutList /= [] -> chunkify(RestInList, ChunkThreshold, [], 0, [lists:reverse([InElement | OutList]) | OutputChunks]); Size -> chunkify(RestInList, ChunkThreshold, [InElement | OutList], OutListSize + Size, OutputChunks) end. modify_node(Bt, RootPointerInfo, Actions, QueryOutput) -> case RootPointerInfo of nil -> NodeType = kv_node, NodeList = []; _Tuple -> Pointer = element(1, RootPointerInfo), {NodeType, NodeList} = get_node(Bt, Pointer) end, NodeTuple = list_to_tuple(NodeList), {ok, NewNodeList, QueryOutput2} = case NodeType of kp_node -> modify_kpnode(Bt, NodeTuple, 1, Actions, [], QueryOutput); kv_node -> modify_kvnode(Bt, NodeTuple, 1, Actions, [], QueryOutput) end, case NewNodeList of [] -> % no nodes remain {ok, [], QueryOutput2}; NodeList -> % nothing changed {LastKey, _LastValue} = element(tuple_size(NodeTuple), NodeTuple), {ok, [{LastKey, RootPointerInfo}], QueryOutput2}; _Else2 -> {ok, ResultList} = write_node(Bt, NodeType, NewNodeList), {ok, ResultList, QueryOutput2} end. reduce_node(#btree{reduce=nil}, _NodeType, _NodeList) -> []; reduce_node(#btree{reduce=R}, kp_node, NodeList) -> R(rereduce, [element(2, Node) || {_K, Node} <- NodeList]); reduce_node(#btree{reduce=R}=Bt, kv_node, NodeList) -> R(reduce, [assemble(Bt, K, V) || {K, V} <- NodeList]). reduce_tree_size(kv_node, NodeSize, _KvList) -> NodeSize; reduce_tree_size(kp_node, NodeSize, []) -> NodeSize; reduce_tree_size(kp_node, _NodeSize, [{_K, {_P, _Red}} | _]) -> % pre 1.2 format nil; reduce_tree_size(kp_node, _NodeSize, [{_K, {_P, _Red, nil}} | _]) -> nil; reduce_tree_size(kp_node, NodeSize, [{_K, {_P, _Red, Sz}} | NodeList]) -> reduce_tree_size(kp_node, NodeSize + Sz, NodeList). get_node(#btree{fd = Fd}, NodePos) -> {ok, {NodeType, NodeList}} = couch_file:pread_term(Fd, NodePos), {NodeType, NodeList}. write_node(#btree{fd = Fd, compression = Comp} = Bt, NodeType, NodeList) -> % split up nodes into smaller sizes NodeListList = chunkify(NodeList), % now write out each chunk and return the KeyPointer pairs for those nodes ResultList = [ begin {ok, Pointer, Size} = couch_file:append_term( Fd, {NodeType, ANodeList}, [{compression, Comp}]), {LastKey, _} = lists:last(ANodeList), SubTreeSize = reduce_tree_size(NodeType, Size, ANodeList), {LastKey, {Pointer, reduce_node(Bt, NodeType, ANodeList), SubTreeSize}} end || ANodeList <- NodeListList ], {ok, ResultList}. modify_kpnode(Bt, {}, _LowerBound, Actions, [], QueryOutput) -> modify_node(Bt, nil, Actions, QueryOutput); modify_kpnode(_Bt, NodeTuple, LowerBound, [], ResultNode, QueryOutput) -> {ok, lists:reverse(ResultNode, bounded_tuple_to_list(NodeTuple, LowerBound, tuple_size(NodeTuple), [])), QueryOutput}; modify_kpnode(Bt, NodeTuple, LowerBound, [{_, FirstActionKey, _}|_]=Actions, ResultNode, QueryOutput) -> Sz = tuple_size(NodeTuple), N = find_first_gteq(Bt, NodeTuple, LowerBound, Sz, FirstActionKey), case N =:= Sz of true -> % perform remaining actions on last node {_, PointerInfo} = element(Sz, NodeTuple), {ok, ChildKPs, QueryOutput2} = modify_node(Bt, PointerInfo, Actions, QueryOutput), NodeList = lists:reverse(ResultNode, bounded_tuple_to_list(NodeTuple, LowerBound, Sz - 1, ChildKPs)), {ok, NodeList, QueryOutput2}; false -> {NodeKey, PointerInfo} = element(N, NodeTuple), SplitFun = fun({_ActionType, ActionKey, _ActionValue}) -> not less(Bt, NodeKey, ActionKey) end, {LessEqQueries, GreaterQueries} = lists:splitwith(SplitFun, Actions), {ok, ChildKPs, QueryOutput2} = modify_node(Bt, PointerInfo, LessEqQueries, QueryOutput), ResultNode2 = lists:reverse(ChildKPs, bounded_tuple_to_revlist(NodeTuple, LowerBound, N - 1, ResultNode)), modify_kpnode(Bt, NodeTuple, N+1, GreaterQueries, ResultNode2, QueryOutput2) end. bounded_tuple_to_revlist(_Tuple, Start, End, Tail) when Start > End -> Tail; bounded_tuple_to_revlist(Tuple, Start, End, Tail) -> bounded_tuple_to_revlist(Tuple, Start+1, End, [element(Start, Tuple)|Tail]). bounded_tuple_to_list(Tuple, Start, End, Tail) -> bounded_tuple_to_list2(Tuple, Start, End, [], Tail). bounded_tuple_to_list2(_Tuple, Start, End, Acc, Tail) when Start > End -> lists:reverse(Acc, Tail); bounded_tuple_to_list2(Tuple, Start, End, Acc, Tail) -> bounded_tuple_to_list2(Tuple, Start + 1, End, [element(Start, Tuple) | Acc], Tail). find_first_gteq(_Bt, _Tuple, Start, End, _Key) when Start == End -> End; find_first_gteq(Bt, Tuple, Start, End, Key) -> Mid = Start + ((End - Start) div 2), {TupleKey, _} = element(Mid, Tuple), case less(Bt, TupleKey, Key) of true -> find_first_gteq(Bt, Tuple, Mid+1, End, Key); false -> find_first_gteq(Bt, Tuple, Start, Mid, Key) end. modify_kvnode(_Bt, NodeTuple, LowerBound, [], ResultNode, QueryOutput) -> {ok, lists:reverse(ResultNode, bounded_tuple_to_list(NodeTuple, LowerBound, tuple_size(NodeTuple), [])), QueryOutput}; modify_kvnode(Bt, NodeTuple, LowerBound, [{ActionType, ActionKey, ActionValue} | RestActions], ResultNode, QueryOutput) when LowerBound > tuple_size(NodeTuple) -> case ActionType of insert -> modify_kvnode(Bt, NodeTuple, LowerBound, RestActions, [{ActionKey, ActionValue} | ResultNode], QueryOutput); remove -> % just drop the action modify_kvnode(Bt, NodeTuple, LowerBound, RestActions, ResultNode, QueryOutput); fetch -> % the key/value must not exist in the tree modify_kvnode(Bt, NodeTuple, LowerBound, RestActions, ResultNode, [{not_found, {ActionKey, nil}} | QueryOutput]) end; modify_kvnode(Bt, NodeTuple, LowerBound, [{ActionType, ActionKey, ActionValue} | RestActions], AccNode, QueryOutput) -> N = find_first_gteq(Bt, NodeTuple, LowerBound, tuple_size(NodeTuple), ActionKey), {Key, Value} = element(N, NodeTuple), ResultNode = bounded_tuple_to_revlist(NodeTuple, LowerBound, N - 1, AccNode), case less(Bt, ActionKey, Key) of true -> case ActionType of insert -> % ActionKey is less than the Key, so insert modify_kvnode(Bt, NodeTuple, N, RestActions, [{ActionKey, ActionValue} | ResultNode], QueryOutput); remove -> % ActionKey is less than the Key, just drop the action modify_kvnode(Bt, NodeTuple, N, RestActions, ResultNode, QueryOutput); fetch -> % ActionKey is less than the Key, the key/value must not exist in the tree modify_kvnode(Bt, NodeTuple, N, RestActions, ResultNode, [{not_found, {ActionKey, nil}} | QueryOutput]) end; false -> % ActionKey and Key are maybe equal. case less(Bt, Key, ActionKey) of false -> case ActionType of insert -> modify_kvnode(Bt, NodeTuple, N+1, RestActions, [{ActionKey, ActionValue} | ResultNode], QueryOutput); remove -> modify_kvnode(Bt, NodeTuple, N+1, RestActions, ResultNode, QueryOutput); fetch -> % ActionKey is equal to the Key, insert into the QueryOuput, but re-process the node % since an identical action key can follow it. modify_kvnode(Bt, NodeTuple, N, RestActions, ResultNode, [{ok, assemble(Bt, Key, Value)} | QueryOutput]) end; true -> modify_kvnode(Bt, NodeTuple, N + 1, [{ActionType, ActionKey, ActionValue} | RestActions], [{Key, Value} | ResultNode], QueryOutput) end end. reduce_stream_node(_Bt, _Dir, nil, _KeyStart, _InEndRangeFun, GroupedKey, GroupedKVsAcc, GroupedRedsAcc, _KeyGroupFun, _Fun, Acc) -> {ok, Acc, GroupedRedsAcc, GroupedKVsAcc, GroupedKey}; reduce_stream_node(Bt, Dir, Node, KeyStart, InEndRangeFun, GroupedKey, GroupedKVsAcc, GroupedRedsAcc, KeyGroupFun, Fun, Acc) -> P = element(1, Node), case get_node(Bt, P) of {kp_node, NodeList} -> NodeList2 = adjust_dir(Dir, NodeList), reduce_stream_kp_node(Bt, Dir, NodeList2, KeyStart, InEndRangeFun, GroupedKey, GroupedKVsAcc, GroupedRedsAcc, KeyGroupFun, Fun, Acc); {kv_node, KVs} -> KVs2 = adjust_dir(Dir, KVs), reduce_stream_kv_node(Bt, Dir, KVs2, KeyStart, InEndRangeFun, GroupedKey, GroupedKVsAcc, GroupedRedsAcc, KeyGroupFun, Fun, Acc) end. reduce_stream_kv_node(Bt, Dir, KVs, KeyStart, InEndRangeFun, GroupedKey, GroupedKVsAcc, GroupedRedsAcc, KeyGroupFun, Fun, Acc) -> GTEKeyStartKVs = case KeyStart of undefined -> KVs; _ -> DropFun = case Dir of fwd -> fun({Key, _}) -> less(Bt, Key, KeyStart) end; rev -> fun({Key, _}) -> less(Bt, KeyStart, Key) end end, lists:dropwhile(DropFun, KVs) end, KVs2 = lists:takewhile( fun({Key, _}) -> InEndRangeFun(Key) end, GTEKeyStartKVs), reduce_stream_kv_node2(Bt, KVs2, GroupedKey, GroupedKVsAcc, GroupedRedsAcc, KeyGroupFun, Fun, Acc). reduce_stream_kv_node2(_Bt, [], GroupedKey, GroupedKVsAcc, GroupedRedsAcc, _KeyGroupFun, _Fun, Acc) -> {ok, Acc, GroupedRedsAcc, GroupedKVsAcc, GroupedKey}; reduce_stream_kv_node2(Bt, [{Key, Value}| RestKVs], GroupedKey, GroupedKVsAcc, GroupedRedsAcc, KeyGroupFun, Fun, Acc) -> case GroupedKey of undefined -> reduce_stream_kv_node2(Bt, RestKVs, Key, [assemble(Bt,Key,Value)], [], KeyGroupFun, Fun, Acc); _ -> case KeyGroupFun(GroupedKey, Key) of true -> reduce_stream_kv_node2(Bt, RestKVs, GroupedKey, [assemble(Bt,Key,Value)|GroupedKVsAcc], GroupedRedsAcc, KeyGroupFun, Fun, Acc); false -> case Fun(GroupedKey, {GroupedKVsAcc, GroupedRedsAcc}, Acc) of {ok, Acc2} -> reduce_stream_kv_node2(Bt, RestKVs, Key, [assemble(Bt,Key,Value)], [], KeyGroupFun, Fun, Acc2); {stop, Acc2} -> throw({stop, Acc2}) end end end. reduce_stream_kp_node(Bt, Dir, NodeList, KeyStart, InEndRangeFun, GroupedKey, GroupedKVsAcc, GroupedRedsAcc, KeyGroupFun, Fun, Acc) -> Nodes = case KeyStart of undefined -> NodeList; _ -> case Dir of fwd -> lists:dropwhile(fun({Key, _}) -> less(Bt, Key, KeyStart) end, NodeList); rev -> RevKPs = lists:reverse(NodeList), case lists:splitwith(fun({Key, _}) -> less(Bt, Key, KeyStart) end, RevKPs) of {_Before, []} -> NodeList; {Before, [FirstAfter | _]} -> [FirstAfter | lists:reverse(Before)] end end end, {InRange, MaybeInRange} = lists:splitwith( fun({Key, _}) -> InEndRangeFun(Key) end, Nodes), NodesInRange = case MaybeInRange of [FirstMaybeInRange | _] when Dir =:= fwd -> InRange ++ [FirstMaybeInRange]; _ -> InRange end, reduce_stream_kp_node2(Bt, Dir, NodesInRange, KeyStart, InEndRangeFun, GroupedKey, GroupedKVsAcc, GroupedRedsAcc, KeyGroupFun, Fun, Acc). reduce_stream_kp_node2(Bt, Dir, [{_Key, NodeInfo} | RestNodeList], KeyStart, InEndRangeFun, undefined, [], [], KeyGroupFun, Fun, Acc) -> {ok, Acc2, GroupedRedsAcc2, GroupedKVsAcc2, GroupedKey2} = reduce_stream_node(Bt, Dir, NodeInfo, KeyStart, InEndRangeFun, undefined, [], [], KeyGroupFun, Fun, Acc), reduce_stream_kp_node2(Bt, Dir, RestNodeList, KeyStart, InEndRangeFun, GroupedKey2, GroupedKVsAcc2, GroupedRedsAcc2, KeyGroupFun, Fun, Acc2); reduce_stream_kp_node2(Bt, Dir, NodeList, KeyStart, InEndRangeFun, GroupedKey, GroupedKVsAcc, GroupedRedsAcc, KeyGroupFun, Fun, Acc) -> {Grouped0, Ungrouped0} = lists:splitwith(fun({Key,_}) -> KeyGroupFun(GroupedKey, Key) end, NodeList), {GroupedNodes, UngroupedNodes} = case Grouped0 of [] -> {Grouped0, Ungrouped0}; _ -> [FirstGrouped | RestGrouped] = lists:reverse(Grouped0), {RestGrouped, [FirstGrouped | Ungrouped0]} end, GroupedReds = [element(2, Node) || {_, Node} <- GroupedNodes], case UngroupedNodes of [{_Key, NodeInfo}|RestNodes] -> {ok, Acc2, GroupedRedsAcc2, GroupedKVsAcc2, GroupedKey2} = reduce_stream_node(Bt, Dir, NodeInfo, KeyStart, InEndRangeFun, GroupedKey, GroupedKVsAcc, GroupedReds ++ GroupedRedsAcc, KeyGroupFun, Fun, Acc), reduce_stream_kp_node2(Bt, Dir, RestNodes, KeyStart, InEndRangeFun, GroupedKey2, GroupedKVsAcc2, GroupedRedsAcc2, KeyGroupFun, Fun, Acc2); [] -> {ok, Acc, GroupedReds ++ GroupedRedsAcc, GroupedKVsAcc, GroupedKey} end. adjust_dir(fwd, List) -> List; adjust_dir(rev, List) -> lists:reverse(List). stream_node(Bt, Reds, Node, StartKey, InRange, Dir, Fun, Acc) -> Pointer = element(1, Node), {NodeType, NodeList} = get_node(Bt, Pointer), case NodeType of kp_node -> stream_kp_node(Bt, Reds, adjust_dir(Dir, NodeList), StartKey, InRange, Dir, Fun, Acc); kv_node -> stream_kv_node(Bt, Reds, adjust_dir(Dir, NodeList), StartKey, InRange, Dir, Fun, Acc) end. stream_node(Bt, Reds, Node, InRange, Dir, Fun, Acc) -> Pointer = element(1, Node), {NodeType, NodeList} = get_node(Bt, Pointer), case NodeType of kp_node -> stream_kp_node(Bt, Reds, adjust_dir(Dir, NodeList), InRange, Dir, Fun, Acc); kv_node -> stream_kv_node2(Bt, Reds, [], adjust_dir(Dir, NodeList), InRange, Dir, Fun, Acc) end. stream_kp_node(_Bt, _Reds, [], _InRange, _Dir, _Fun, Acc) -> {ok, Acc}; stream_kp_node(Bt, Reds, [{Key, Node} | Rest], InRange, Dir, Fun, Acc) -> Red = element(2, Node), case Fun(traverse, Key, Red, Acc) of {ok, Acc2} -> case stream_node(Bt, Reds, Node, InRange, Dir, Fun, Acc2) of {ok, Acc3} -> stream_kp_node(Bt, [Red | Reds], Rest, InRange, Dir, Fun, Acc3); {stop, LastReds, Acc3} -> {stop, LastReds, Acc3} end; {skip, Acc2} -> stream_kp_node(Bt, [Red | Reds], Rest, InRange, Dir, Fun, Acc2) end. drop_nodes(_Bt, Reds, _StartKey, []) -> {Reds, []}; drop_nodes(Bt, Reds, StartKey, [{NodeKey, Node} | RestKPs]) -> case less(Bt, NodeKey, StartKey) of true -> drop_nodes(Bt, [element(2, Node) | Reds], StartKey, RestKPs); false -> {Reds, [{NodeKey, Node} | RestKPs]} end. stream_kp_node(Bt, Reds, KPs, StartKey, InRange, Dir, Fun, Acc) -> {NewReds, NodesToStream} = case Dir of fwd -> % drop all nodes sorting before the key drop_nodes(Bt, Reds, StartKey, KPs); rev -> % keep all nodes sorting before the key, AND the first node to sort after RevKPs = lists:reverse(KPs), case lists:splitwith(fun({Key, _Pointer}) -> less(Bt, Key, StartKey) end, RevKPs) of {_RevsBefore, []} -> % everything sorts before it {Reds, KPs}; {RevBefore, [FirstAfter | Drop]} -> {[element(2, Node) || {_K, Node} <- Drop] ++ Reds, [FirstAfter | lists:reverse(RevBefore)]} end end, case NodesToStream of [] -> {ok, Acc}; [{_Key, Node} | Rest] -> case stream_node(Bt, NewReds, Node, StartKey, InRange, Dir, Fun, Acc) of {ok, Acc2} -> Red = element(2, Node), stream_kp_node(Bt, [Red | NewReds], Rest, InRange, Dir, Fun, Acc2); {stop, LastReds, Acc2} -> {stop, LastReds, Acc2} end end. stream_kv_node(Bt, Reds, KVs, StartKey, InRange, Dir, Fun, Acc) -> DropFun = case Dir of fwd -> fun({Key, _}) -> less(Bt, Key, StartKey) end; rev -> fun({Key, _}) -> less(Bt, StartKey, Key) end end, {LTKVs, GTEKVs} = lists:splitwith(DropFun, KVs), AssembleLTKVs = [assemble(Bt,K,V) || {K,V} <- LTKVs], stream_kv_node2(Bt, Reds, AssembleLTKVs, GTEKVs, InRange, Dir, Fun, Acc). stream_kv_node2(_Bt, _Reds, _PrevKVs, [], _InRange, _Dir, _Fun, Acc) -> {ok, Acc}; stream_kv_node2(Bt, Reds, PrevKVs, [{K,V} | RestKVs], InRange, Dir, Fun, Acc) -> case InRange(K) of false -> {stop, {PrevKVs, Reds}, Acc}; true -> AssembledKV = assemble(Bt, K, V), case Fun(visit, AssembledKV, {PrevKVs, Reds}, Acc) of {ok, Acc2} -> stream_kv_node2(Bt, Reds, [AssembledKV | PrevKVs], RestKVs, InRange, Dir, Fun, Acc2); {stop, Acc2} -> {stop, {PrevKVs, Reds}, Acc2} end end. apache-couchdb-1.6.0/src/couchdb/couch_httpd_oauth.erl0000644000175000001440000003255712332105522022740 0ustar00djcusers00000000000000% Licensed under the Apache License, Version 2.0 (the "License"); you may not % use this file except in compliance with the License. You may obtain a copy of % the License at % % http://www.apache.org/licenses/LICENSE-2.0 % % Unless required by applicable law or agreed to in writing, software % distributed under the License is distributed on an "AS IS" BASIS, WITHOUT % WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the % License for the specific language governing permissions and limitations under % the License. -module(couch_httpd_oauth). -include("couch_db.hrl"). -include("couch_js_functions.hrl"). -export([oauth_authentication_handler/1, handle_oauth_req/1]). -define(OAUTH_DDOC_ID, <<"_design/oauth">>). -define(OAUTH_VIEW_NAME, <<"oauth_credentials">>). -record(callback_params, { consumer, token, token_secret, url, signature, params, username }). % OAuth auth handler using per-node user db oauth_authentication_handler(Req) -> serve_oauth(Req, fun oauth_auth_callback/2, true). oauth_auth_callback(Req, #callback_params{token_secret = undefined}) -> couch_httpd:send_error( Req, 400, <<"invalid_token">>, <<"Invalid OAuth token.">>); oauth_auth_callback(#httpd{mochi_req = MochiReq} = Req, CbParams) -> Method = atom_to_list(MochiReq:get(method)), #callback_params{ consumer = Consumer, token = Token, token_secret = TokenSecret, url = Url, signature = Sig, params = Params, username = User } = CbParams, case oauth:verify(Sig, Method, Url, Params, Consumer, TokenSecret) of true -> set_user_ctx(Req, User); false -> ?LOG_DEBUG("OAuth handler: signature verification failed for user `~p`~n" "Received signature is `~p`~n" "HTTP method is `~p`~n" "URL is `~p`~n" "Parameters are `~p`~n" "Consumer is `~p`, token secret is `~p`~n" "Expected signature was `~p`~n", [User, Sig, Method, Url, Params, Consumer, TokenSecret, oauth:sign(Method, Url, Params, Consumer, Token, TokenSecret)]), Req end. % Look up the consumer key and get the roles to give the consumer set_user_ctx(_Req, undefined) -> throw({bad_request, unknown_oauth_token}); set_user_ctx(Req, Name) -> case couch_auth_cache:get_user_creds(Name) of nil -> ?LOG_DEBUG("OAuth handler: user `~p` credentials not found", [Name]), Req; User -> Roles = couch_util:get_value(<<"roles">>, User, []), Req#httpd{user_ctx=#user_ctx{name=Name, roles=Roles}} end. % OAuth request_token handle_oauth_req(#httpd{path_parts=[_OAuth, <<"request_token">>], method=Method}=Req1) -> serve_oauth(Req1, fun(Req, CbParams) -> #callback_params{ consumer = Consumer, token_secret = TokenSecret, url = Url, signature = Sig, params = Params } = CbParams, case oauth:verify( Sig, atom_to_list(Method), Url, Params, Consumer, TokenSecret) of true -> ok(Req, <<"oauth_token=requestkey&oauth_token_secret=requestsecret">>); false -> invalid_signature(Req) end end, false); handle_oauth_req(#httpd{path_parts=[_OAuth, <<"authorize">>]}=Req) -> {ok, serve_oauth_authorize(Req)}; handle_oauth_req(#httpd{path_parts=[_OAuth, <<"access_token">>], method='GET'}=Req1) -> serve_oauth(Req1, fun(Req, CbParams) -> #callback_params{ consumer = Consumer, token = Token, url = Url, signature = Sig, params = Params } = CbParams, case Token of "requestkey" -> case oauth:verify( Sig, "GET", Url, Params, Consumer, "requestsecret") of true -> ok(Req, <<"oauth_token=accesskey&oauth_token_secret=accesssecret">>); false -> invalid_signature(Req) end; _ -> couch_httpd:send_error( Req, 400, <<"invalid_token">>, <<"Invalid OAuth token.">>) end end, false); handle_oauth_req(#httpd{path_parts=[_OAuth, <<"access_token">>]}=Req) -> couch_httpd:send_method_not_allowed(Req, "GET"). invalid_signature(Req) -> couch_httpd:send_error(Req, 400, <<"invalid_signature">>, <<"Invalid signature value.">>). % This needs to be protected i.e. force user to login using HTTP Basic Auth or form-based login. serve_oauth_authorize(#httpd{method=Method}=Req1) -> case Method of 'GET' -> % Confirm with the User that they want to authenticate the Consumer serve_oauth(Req1, fun(Req, CbParams) -> #callback_params{ consumer = Consumer, token_secret = TokenSecret, url = Url, signature = Sig, params = Params } = CbParams, case oauth:verify( Sig, "GET", Url, Params, Consumer, TokenSecret) of true -> ok(Req, <<"oauth_token=requestkey&", "oauth_token_secret=requestsecret">>); false -> invalid_signature(Req) end end, false); 'POST' -> % If the User has confirmed, we direct the User back to the Consumer with a verification code serve_oauth(Req1, fun(Req, CbParams) -> #callback_params{ consumer = Consumer, token_secret = TokenSecret, url = Url, signature = Sig, params = Params } = CbParams, case oauth:verify( Sig, "POST", Url, Params, Consumer, TokenSecret) of true -> %redirect(oauth_callback, oauth_token, oauth_verifier), ok(Req, <<"oauth_token=requestkey&", "oauth_token_secret=requestsecret">>); false -> invalid_signature(Req) end end, false); _ -> couch_httpd:send_method_not_allowed(Req1, "GET,POST") end. serve_oauth(#httpd{mochi_req=MochiReq}=Req, Fun, FailSilently) -> % 1. In the HTTP Authorization header as defined in OAuth HTTP Authorization Scheme. % 2. As the HTTP POST request body with a content-type of application/x-www-form-urlencoded. % 3. Added to the URLs in the query part (as defined by [RFC3986] section 3). AuthHeader = case MochiReq:get_header_value("authorization") of undefined -> ""; Else -> [Head | Tail] = re:split(Else, "\\s", [{parts, 2}, {return, list}]), case [string:to_lower(Head) | Tail] of ["oauth", Rest] -> Rest; _ -> "" end end, HeaderParams = oauth:header_params_decode(AuthHeader), %Realm = couch_util:get_value("realm", HeaderParams), % get requested path RequestedPath = case MochiReq:get_header_value("x-couchdb-requested-path") of undefined -> case MochiReq:get_header_value("x-couchdb-vhost-path") of undefined -> MochiReq:get(raw_path); VHostPath -> VHostPath end; RequestedPath0 -> RequestedPath0 end, {_, QueryString, _} = mochiweb_util:urlsplit_path(RequestedPath), Params = proplists:delete("realm", HeaderParams) ++ mochiweb_util:parse_qs(QueryString), ?LOG_DEBUG("OAuth Params: ~p", [Params]), case couch_util:get_value("oauth_version", Params, "1.0") of "1.0" -> case couch_util:get_value("oauth_consumer_key", Params, undefined) of undefined -> case FailSilently of true -> Req; false -> couch_httpd:send_error(Req, 400, <<"invalid_consumer">>, <<"Invalid consumer.">>) end; ConsumerKey -> Url = couch_httpd:absolute_uri(Req, RequestedPath), case get_callback_params(ConsumerKey, Params, Url) of {ok, CallbackParams} -> Fun(Req, CallbackParams); invalid_consumer_token_pair -> couch_httpd:send_error( Req, 400, <<"invalid_consumer_token_pair">>, <<"Invalid consumer and token pair.">>); {error, {Error, Reason}} -> couch_httpd:send_error(Req, 400, Error, Reason) end end; _ -> couch_httpd:send_error(Req, 400, <<"invalid_oauth_version">>, <<"Invalid OAuth version.">>) end. get_callback_params(ConsumerKey, Params, Url) -> Token = couch_util:get_value("oauth_token", Params), SigMethod = sig_method(Params), CbParams0 = #callback_params{ token = Token, signature = couch_util:get_value("oauth_signature", Params), params = proplists:delete("oauth_signature", Params), url = Url }, case oauth_credentials_info(Token, ConsumerKey) of nil -> invalid_consumer_token_pair; {error, _} = Err -> Err; {OauthCreds} -> User = couch_util:get_value(<<"username">>, OauthCreds, []), ConsumerSecret = ?b2l(couch_util:get_value( <<"consumer_secret">>, OauthCreds, <<>>)), TokenSecret = ?b2l(couch_util:get_value( <<"token_secret">>, OauthCreds, <<>>)), case (User =:= []) orelse (ConsumerSecret =:= []) orelse (TokenSecret =:= []) of true -> invalid_consumer_token_pair; false -> CbParams = CbParams0#callback_params{ consumer = {ConsumerKey, ConsumerSecret, SigMethod}, token_secret = TokenSecret, username = User }, ?LOG_DEBUG("Got OAuth credentials, for ConsumerKey `~p` and " "Token `~p`, from the views, User: `~p`, " "ConsumerSecret: `~p`, TokenSecret: `~p`", [ConsumerKey, Token, User, ConsumerSecret, TokenSecret]), {ok, CbParams} end end. sig_method(Params) -> sig_method_1(couch_util:get_value("oauth_signature_method", Params)). sig_method_1("PLAINTEXT") -> plaintext; % sig_method_1("RSA-SHA1") -> % rsa_sha1; sig_method_1("HMAC-SHA1") -> hmac_sha1; sig_method_1(_) -> undefined. ok(#httpd{mochi_req=MochiReq}, Body) -> {ok, MochiReq:respond({200, [], Body})}. oauth_credentials_info(Token, ConsumerKey) -> case use_auth_db() of {ok, Db} -> Result = case query_oauth_view(Db, [?l2b(ConsumerKey), ?l2b(Token)]) of [] -> nil; [Creds] -> Creds; [_ | _] -> Reason = iolist_to_binary( io_lib:format("Found multiple OAuth credentials for the pair " " (consumer_key: `~p`, token: `~p`)", [ConsumerKey, Token])), {error, {<<"oauth_token_consumer_key_pair">>, Reason}} end, couch_db:close(Db), Result; nil -> { case couch_config:get("oauth_consumer_secrets", ConsumerKey) of undefined -> []; ConsumerSecret -> [{<<"consumer_secret">>, ?l2b(ConsumerSecret)}] end ++ case couch_config:get("oauth_token_secrets", Token) of undefined -> []; TokenSecret -> [{<<"token_secret">>, ?l2b(TokenSecret)}] end ++ case couch_config:get("oauth_token_users", Token) of undefined -> []; User -> [{<<"username">>, ?l2b(User)}] end } end. use_auth_db() -> case couch_config:get("couch_httpd_oauth", "use_users_db", "false") of "false" -> nil; "true" -> AuthDb = open_auth_db(), {ok, _AuthDb2} = ensure_oauth_views_exist(AuthDb) end. open_auth_db() -> DbName = ?l2b(couch_config:get("couch_httpd_auth", "authentication_db")), DbOptions = [{user_ctx, #user_ctx{roles = [<<"_admin">>]}}], {ok, AuthDb} = couch_db:open_int(DbName, DbOptions), AuthDb. ensure_oauth_views_exist(AuthDb) -> case couch_db:open_doc(AuthDb, ?OAUTH_DDOC_ID, []) of {ok, _DDoc} -> {ok, AuthDb}; _ -> {ok, DDoc} = get_oauth_ddoc(), {ok, _Rev} = couch_db:update_doc(AuthDb, DDoc, []), {ok, _AuthDb2} = couch_db:reopen(AuthDb) end. get_oauth_ddoc() -> Json = {[ {<<"_id">>, ?OAUTH_DDOC_ID}, {<<"language">>, <<"javascript">>}, {<<"views">>, {[ {?OAUTH_VIEW_NAME, {[ {<<"map">>, ?OAUTH_MAP_FUN} ]} } ]} } ]}, {ok, couch_doc:from_json_obj(Json)}. query_oauth_view(Db, Key) -> ViewOptions = [ {start_key, Key}, {end_key, Key} ], Callback = fun({row, Row}, Acc) -> {ok, [couch_util:get_value(value, Row) | Acc]}; (_, Acc) -> {ok, Acc} end, {ok, Result} = couch_mrview:query_view( Db, ?OAUTH_DDOC_ID, ?OAUTH_VIEW_NAME, ViewOptions, Callback, []), Result. apache-couchdb-1.6.0/src/ejson/0000755000175000001440000000000012332105603016223 5ustar00djcusers00000000000000apache-couchdb-1.6.0/src/ejson/yajl/0000755000175000001440000000000012332105603017162 5ustar00djcusers00000000000000apache-couchdb-1.6.0/src/ejson/yajl/yajl_alloc.c0000644000175000001440000000423712332105522021445 0ustar00djcusers00000000000000/* * Copyright 2010, Lloyd Hilaiel. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are * met: * * 1. Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * * 2. Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in * the documentation and/or other materials provided with the * distribution. * * 3. Neither the name of Lloyd Hilaiel nor the names of its * contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE * DISCLAIMED. IN NO EVENT SHALL THE AUTHOR 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. */ /** * \file yajl_alloc.h * default memory allocation routines for yajl which use malloc/realloc and * free */ #include "yajl_alloc.h" #include static void * yajl_internal_malloc(void *ctx, unsigned int sz) { return malloc(sz); } static void * yajl_internal_realloc(void *ctx, void * previous, unsigned int sz) { return realloc(previous, sz); } static void yajl_internal_free(void *ctx, void * ptr) { free(ptr); } void yajl_set_default_alloc_funcs(yajl_alloc_funcs * yaf) { yaf->malloc = yajl_internal_malloc; yaf->free = yajl_internal_free; yaf->realloc = yajl_internal_realloc; yaf->ctx = NULL; } apache-couchdb-1.6.0/src/ejson/yajl/yajl_alloc.h0000644000175000001440000000366512332105522021456 0ustar00djcusers00000000000000/* * Copyright 2010, Lloyd Hilaiel. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are * met: * * 1. Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * * 2. Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in * the documentation and/or other materials provided with the * distribution. * * 3. Neither the name of Lloyd Hilaiel nor the names of its * contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE * DISCLAIMED. IN NO EVENT SHALL THE AUTHOR 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. */ /** * \file yajl_alloc.h * default memory allocation routines for yajl which use malloc/realloc and * free */ #ifndef __YAJL_ALLOC_H__ #define __YAJL_ALLOC_H__ #include "yajl_common.h" #define YA_MALLOC(afs, sz) (afs)->malloc((afs)->ctx, (sz)) #define YA_FREE(afs, ptr) (afs)->free((afs)->ctx, (ptr)) #define YA_REALLOC(afs, ptr, sz) (afs)->realloc((afs)->ctx, (ptr), (sz)) void yajl_set_default_alloc_funcs(yajl_alloc_funcs * yaf); #endif apache-couchdb-1.6.0/src/ejson/yajl/yajl_parse.h0000644000175000001440000002046212332105522021470 0ustar00djcusers00000000000000/* * Copyright 2010, Lloyd Hilaiel. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are * met: * * 1. Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * * 2. Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in * the documentation and/or other materials provided with the * distribution. * * 3. Neither the name of Lloyd Hilaiel nor the names of its * contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE * DISCLAIMED. IN NO EVENT SHALL THE AUTHOR 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. */ /** * \file yajl_parse.h * Interface to YAJL's JSON parsing facilities. */ #include "yajl_common.h" #ifndef __YAJL_PARSE_H__ #define __YAJL_PARSE_H__ #ifdef __cplusplus extern "C" { #endif /** error codes returned from this interface */ typedef enum { /** no error was encountered */ yajl_status_ok, /** a client callback returned zero, stopping the parse */ yajl_status_client_canceled, /** The parse cannot yet complete because more json input text * is required, call yajl_parse with the next buffer of input text. * (pertinent only when stream parsing) */ yajl_status_insufficient_data, /** An error occured during the parse. Call yajl_get_error for * more information about the encountered error */ yajl_status_error } yajl_status; /** attain a human readable, english, string for an error */ YAJL_API const char * yajl_status_to_string(yajl_status code); /** an opaque handle to a parser */ typedef struct yajl_handle_t * yajl_handle; /** yajl is an event driven parser. this means as json elements are * parsed, you are called back to do something with the data. The * functions in this table indicate the various events for which * you will be called back. Each callback accepts a "context" * pointer, this is a void * that is passed into the yajl_parse * function which the client code may use to pass around context. * * All callbacks return an integer. If non-zero, the parse will * continue. If zero, the parse will be canceled and * yajl_status_client_canceled will be returned from the parse. * * Note about handling of numbers: * yajl will only convert numbers that can be represented in a double * or a long int. All other numbers will be passed to the client * in string form using the yajl_number callback. Furthermore, if * yajl_number is not NULL, it will always be used to return numbers, * that is yajl_integer and yajl_double will be ignored. If * yajl_number is NULL but one of yajl_integer or yajl_double are * defined, parsing of a number larger than is representable * in a double or long int will result in a parse error. */ typedef struct { int (* yajl_null)(void * ctx); int (* yajl_boolean)(void * ctx, int boolVal); int (* yajl_integer)(void * ctx, long integerVal); int (* yajl_double)(void * ctx, double doubleVal); /** A callback which passes the string representation of the number * back to the client. Will be used for all numbers when present */ int (* yajl_number)(void * ctx, const char * numberVal, unsigned int numberLen); /** strings are returned as pointers into the JSON text when, * possible, as a result, they are _not_ null padded */ int (* yajl_string)(void * ctx, const unsigned char * stringVal, unsigned int stringLen); int (* yajl_start_map)(void * ctx); int (* yajl_map_key)(void * ctx, const unsigned char * key, unsigned int stringLen); int (* yajl_end_map)(void * ctx); int (* yajl_start_array)(void * ctx); int (* yajl_end_array)(void * ctx); } yajl_callbacks; /** configuration structure for the generator */ typedef struct { /** if nonzero, javascript style comments will be allowed in * the json input, both slash star and slash slash */ unsigned int allowComments; /** if nonzero, invalid UTF8 strings will cause a parse * error */ unsigned int checkUTF8; } yajl_parser_config; /** allocate a parser handle * \param callbacks a yajl callbacks structure specifying the * functions to call when different JSON entities * are encountered in the input text. May be NULL, * which is only useful for validation. * \param config configuration parameters for the parse. * \param ctx a context pointer that will be passed to callbacks. */ YAJL_API yajl_handle yajl_alloc(const yajl_callbacks * callbacks, const yajl_parser_config * config, const yajl_alloc_funcs * allocFuncs, void * ctx); /** free a parser handle */ YAJL_API void yajl_free(yajl_handle handle); /** Parse some json! * \param hand - a handle to the json parser allocated with yajl_alloc * \param jsonText - a pointer to the UTF8 json text to be parsed * \param jsonTextLength - the length, in bytes, of input text */ YAJL_API yajl_status yajl_parse(yajl_handle hand, const unsigned char * jsonText, unsigned int jsonTextLength); /** Parse any remaining buffered json. * Since yajl is a stream-based parser, without an explicit end of * input, yajl sometimes can't decide if content at the end of the * stream is valid or not. For example, if "1" has been fed in, * yajl can't know whether another digit is next or some character * that would terminate the integer token. * * \param hand - a handle to the json parser allocated with yajl_alloc */ YAJL_API yajl_status yajl_parse_complete(yajl_handle hand); /** get an error string describing the state of the * parse. * * If verbose is non-zero, the message will include the JSON * text where the error occured, along with an arrow pointing to * the specific char. * * \returns A dynamically allocated string will be returned which should * be freed with yajl_free_error */ YAJL_API unsigned char * yajl_get_error(yajl_handle hand, int verbose, const unsigned char * jsonText, unsigned int jsonTextLength); /** * get the amount of data consumed from the last chunk passed to YAJL. * * In the case of a successful parse this can help you understand if * the entire buffer was consumed (which will allow you to handle * "junk at end of input". * * In the event an error is encountered during parsing, this function * affords the client a way to get the offset into the most recent * chunk where the error occured. 0 will be returned if no error * was encountered. */ YAJL_API unsigned int yajl_get_bytes_consumed(yajl_handle hand); /** free an error returned from yajl_get_error */ YAJL_API void yajl_free_error(yajl_handle hand, unsigned char * str); #ifdef __cplusplus } #endif #endif apache-couchdb-1.6.0/src/ejson/yajl/yajl_buf.c0000644000175000001440000000633412332105522021127 0ustar00djcusers00000000000000/* * Copyright 2010, Lloyd Hilaiel. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are * met: * * 1. Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * * 2. Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in * the documentation and/or other materials provided with the * distribution. * * 3. Neither the name of Lloyd Hilaiel nor the names of its * contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE * DISCLAIMED. IN NO EVENT SHALL THE AUTHOR 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. */ #include "yajl_buf.h" #include #include #include #define YAJL_BUF_INIT_SIZE 2048 struct yajl_buf_t { unsigned int len; unsigned int used; unsigned char * data; yajl_alloc_funcs * alloc; }; static void yajl_buf_ensure_available(yajl_buf buf, unsigned int want) { unsigned int need; assert(buf != NULL); /* first call */ if (buf->data == NULL) { buf->len = YAJL_BUF_INIT_SIZE; buf->data = (unsigned char *) YA_MALLOC(buf->alloc, buf->len); buf->data[0] = 0; } need = buf->len; while (want >= (need - buf->used)) need <<= 1; if (need != buf->len) { buf->data = (unsigned char *) YA_REALLOC(buf->alloc, buf->data, need); buf->len = need; } } yajl_buf yajl_buf_alloc(yajl_alloc_funcs * alloc) { yajl_buf b = YA_MALLOC(alloc, sizeof(struct yajl_buf_t)); memset((void *) b, 0, sizeof(struct yajl_buf_t)); b->alloc = alloc; return b; } void yajl_buf_free(yajl_buf buf) { assert(buf != NULL); if (buf->data) YA_FREE(buf->alloc, buf->data); YA_FREE(buf->alloc, buf); } void yajl_buf_append(yajl_buf buf, const void * data, unsigned int len) { yajl_buf_ensure_available(buf, len); if (len > 0) { assert(data != NULL); memcpy(buf->data + buf->used, data, len); buf->used += len; buf->data[buf->used] = 0; } } void yajl_buf_clear(yajl_buf buf) { buf->used = 0; if (buf->data) buf->data[buf->used] = 0; } const unsigned char * yajl_buf_data(yajl_buf buf) { return buf->data; } unsigned int yajl_buf_len(yajl_buf buf) { return buf->used; } void yajl_buf_truncate(yajl_buf buf, unsigned int len) { assert(len <= buf->used); buf->used = len; } apache-couchdb-1.6.0/src/ejson/yajl/yajl_buf.h0000644000175000001440000000505112332105522021127 0ustar00djcusers00000000000000/* * Copyright 2010, Lloyd Hilaiel. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are * met: * * 1. Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * * 2. Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in * the documentation and/or other materials provided with the * distribution. * * 3. Neither the name of Lloyd Hilaiel nor the names of its * contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE * DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE * POSSIBILITY OF SUCH DAMAGE. */ #ifndef __YAJL_BUF_H__ #define __YAJL_BUF_H__ #include "yajl_common.h" #include "yajl_alloc.h" /* * Implementation/performance notes. If this were moved to a header * only implementation using #define's where possible we might be * able to sqeeze a little performance out of the guy by killing function * call overhead. YMMV. */ /** * yajl_buf is a buffer with exponential growth. the buffer ensures that * you are always null padded. */ typedef struct yajl_buf_t * yajl_buf; /* allocate a new buffer */ yajl_buf yajl_buf_alloc(yajl_alloc_funcs * alloc); /* free the buffer */ void yajl_buf_free(yajl_buf buf); /* append a number of bytes to the buffer */ void yajl_buf_append(yajl_buf buf, const void * data, unsigned int len); /* empty the buffer */ void yajl_buf_clear(yajl_buf buf); /* get a pointer to the beginning of the buffer */ const unsigned char * yajl_buf_data(yajl_buf buf); /* get the length of the buffer */ unsigned int yajl_buf_len(yajl_buf buf); /* truncate the buffer */ void yajl_buf_truncate(yajl_buf buf, unsigned int len); #endif apache-couchdb-1.6.0/src/ejson/yajl/yajl_gen.c0000644000175000001440000002332412332105522021122 0ustar00djcusers00000000000000/* * Copyright 2010, Lloyd Hilaiel. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are * met: * * 1. Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * * 2. Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in * the documentation and/or other materials provided with the * distribution. * * 3. Neither the name of Lloyd Hilaiel nor the names of its * contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE * DISCLAIMED. IN NO EVENT SHALL THE AUTHOR 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. */ #include "yajl_gen.h" #include "yajl_buf.h" #include "yajl_encode.h" #include #include #include #include typedef enum { yajl_gen_start, yajl_gen_map_start, yajl_gen_map_key, yajl_gen_map_val, yajl_gen_array_start, yajl_gen_in_array, yajl_gen_complete, yajl_gen_error } yajl_gen_state; struct yajl_gen_t { unsigned int depth; unsigned int pretty; const char * indentString; yajl_gen_state state[YAJL_MAX_DEPTH]; yajl_print_t print; void * ctx; /* yajl_buf */ /* memory allocation routines */ yajl_alloc_funcs alloc; }; yajl_gen yajl_gen_alloc(const yajl_gen_config * config, const yajl_alloc_funcs * afs) { return yajl_gen_alloc2(NULL, config, afs, NULL); } yajl_gen yajl_gen_alloc2(const yajl_print_t callback, const yajl_gen_config * config, const yajl_alloc_funcs * afs, void * ctx) { yajl_gen g = NULL; yajl_alloc_funcs afsBuffer; /* first order of business is to set up memory allocation routines */ if (afs != NULL) { if (afs->malloc == NULL || afs->realloc == NULL || afs->free == NULL) { return NULL; } } else { yajl_set_default_alloc_funcs(&afsBuffer); afs = &afsBuffer; } g = (yajl_gen) YA_MALLOC(afs, sizeof(struct yajl_gen_t)); memset((void *) g, 0, sizeof(struct yajl_gen_t)); /* copy in pointers to allocation routines */ memcpy((void *) &(g->alloc), (void *) afs, sizeof(yajl_alloc_funcs)); if (config) { g->pretty = config->beautify; g->indentString = config->indentString ? config->indentString : " "; } if (callback) { g->print = callback; g->ctx = ctx; } else { g->print = (yajl_print_t)&yajl_buf_append; g->ctx = yajl_buf_alloc(&(g->alloc)); } return g; } void yajl_gen_free(yajl_gen g) { if (g->print == (yajl_print_t)&yajl_buf_append) yajl_buf_free((yajl_buf)g->ctx); YA_FREE(&(g->alloc), g); } #define INSERT_SEP \ if (g->state[g->depth] == yajl_gen_map_key || \ g->state[g->depth] == yajl_gen_in_array) { \ g->print(g->ctx, ",", 1); \ if (g->pretty) g->print(g->ctx, "\n", 1); \ } else if (g->state[g->depth] == yajl_gen_map_val) { \ g->print(g->ctx, ":", 1); \ if (g->pretty) g->print(g->ctx, " ", 1); \ } #define INSERT_WHITESPACE \ if (g->pretty) { \ if (g->state[g->depth] != yajl_gen_map_val) { \ unsigned int _i; \ for (_i=0;_idepth;_i++) \ g->print(g->ctx, g->indentString, \ strlen(g->indentString)); \ } \ } #define ENSURE_NOT_KEY \ if (g->state[g->depth] == yajl_gen_map_key) { \ return yajl_gen_keys_must_be_strings; \ } \ /* check that we're not complete, or in error state. in a valid state * to be generating */ #define ENSURE_VALID_STATE \ if (g->state[g->depth] == yajl_gen_error) { \ return yajl_gen_in_error_state;\ } else if (g->state[g->depth] == yajl_gen_complete) { \ return yajl_gen_generation_complete; \ } #define INCREMENT_DEPTH \ if (++(g->depth) >= YAJL_MAX_DEPTH) return yajl_max_depth_exceeded; #define APPENDED_ATOM \ switch (g->state[g->depth]) { \ case yajl_gen_start: \ g->state[g->depth] = yajl_gen_complete; \ break; \ case yajl_gen_map_start: \ case yajl_gen_map_key: \ g->state[g->depth] = yajl_gen_map_val; \ break; \ case yajl_gen_array_start: \ g->state[g->depth] = yajl_gen_in_array; \ break; \ case yajl_gen_map_val: \ g->state[g->depth] = yajl_gen_map_key; \ break; \ default: \ break; \ } \ #define FINAL_NEWLINE \ if (g->pretty && g->state[g->depth] == yajl_gen_complete) \ g->print(g->ctx, "\n", 1); yajl_gen_status yajl_gen_integer(yajl_gen g, long int number) { char i[32]; ENSURE_VALID_STATE; ENSURE_NOT_KEY; INSERT_SEP; INSERT_WHITESPACE; sprintf(i, "%ld", number); g->print(g->ctx, i, strlen(i)); APPENDED_ATOM; FINAL_NEWLINE; return yajl_gen_status_ok; } #if defined(_WIN32) || defined(WIN32) || defined(__WIN32__) #include #define isnan _isnan #define isinf !_finite #endif yajl_gen_status yajl_gen_double(yajl_gen g, double number) { char i[32]; ENSURE_VALID_STATE; ENSURE_NOT_KEY; if (isnan(number) || isinf(number)) return yajl_gen_invalid_number; INSERT_SEP; INSERT_WHITESPACE; sprintf(i, "%g", number); g->print(g->ctx, i, strlen(i)); APPENDED_ATOM; FINAL_NEWLINE; return yajl_gen_status_ok; } yajl_gen_status yajl_gen_number(yajl_gen g, const char * s, unsigned int l) { ENSURE_VALID_STATE; ENSURE_NOT_KEY; INSERT_SEP; INSERT_WHITESPACE; g->print(g->ctx, s, l); APPENDED_ATOM; FINAL_NEWLINE; return yajl_gen_status_ok; } yajl_gen_status yajl_gen_string(yajl_gen g, const unsigned char * str, unsigned int len) { ENSURE_VALID_STATE; INSERT_SEP; INSERT_WHITESPACE; g->print(g->ctx, "\"", 1); yajl_string_encode2(g->print, g->ctx, str, len); g->print(g->ctx, "\"", 1); APPENDED_ATOM; FINAL_NEWLINE; return yajl_gen_status_ok; } yajl_gen_status yajl_gen_null(yajl_gen g) { ENSURE_VALID_STATE; ENSURE_NOT_KEY; INSERT_SEP; INSERT_WHITESPACE; g->print(g->ctx, "null", strlen("null")); APPENDED_ATOM; FINAL_NEWLINE; return yajl_gen_status_ok; } yajl_gen_status yajl_gen_bool(yajl_gen g, int boolean) { const char * val = boolean ? "true" : "false"; ENSURE_VALID_STATE; ENSURE_NOT_KEY; INSERT_SEP; INSERT_WHITESPACE; g->print(g->ctx, val, strlen(val)); APPENDED_ATOM; FINAL_NEWLINE; return yajl_gen_status_ok; } yajl_gen_status yajl_gen_map_open(yajl_gen g) { ENSURE_VALID_STATE; ENSURE_NOT_KEY; INSERT_SEP; INSERT_WHITESPACE; INCREMENT_DEPTH; g->state[g->depth] = yajl_gen_map_start; g->print(g->ctx, "{", 1); if (g->pretty) g->print(g->ctx, "\n", 1); FINAL_NEWLINE; return yajl_gen_status_ok; } yajl_gen_status yajl_gen_map_close(yajl_gen g) { ENSURE_VALID_STATE; (g->depth)--; if (g->pretty) g->print(g->ctx, "\n", 1); APPENDED_ATOM; INSERT_WHITESPACE; g->print(g->ctx, "}", 1); FINAL_NEWLINE; return yajl_gen_status_ok; } yajl_gen_status yajl_gen_array_open(yajl_gen g) { ENSURE_VALID_STATE; ENSURE_NOT_KEY; INSERT_SEP; INSERT_WHITESPACE; INCREMENT_DEPTH; g->state[g->depth] = yajl_gen_array_start; g->print(g->ctx, "[", 1); if (g->pretty) g->print(g->ctx, "\n", 1); FINAL_NEWLINE; return yajl_gen_status_ok; } yajl_gen_status yajl_gen_array_close(yajl_gen g) { ENSURE_VALID_STATE; if (g->pretty) g->print(g->ctx, "\n", 1); (g->depth)--; APPENDED_ATOM; INSERT_WHITESPACE; g->print(g->ctx, "]", 1); FINAL_NEWLINE; return yajl_gen_status_ok; } yajl_gen_status yajl_gen_get_buf(yajl_gen g, const unsigned char ** buf, unsigned int * len) { if (g->print != (yajl_print_t)&yajl_buf_append) return yajl_gen_no_buf; *buf = yajl_buf_data((yajl_buf)g->ctx); *len = yajl_buf_len((yajl_buf)g->ctx); return yajl_gen_status_ok; } void yajl_gen_clear(yajl_gen g) { if (g->print == (yajl_print_t)&yajl_buf_append) yajl_buf_clear((yajl_buf)g->ctx); } apache-couchdb-1.6.0/src/ejson/yajl/yajl_gen.h0000644000175000001440000001605012332105522021125 0ustar00djcusers00000000000000/* * Copyright 2010, Lloyd Hilaiel. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are * met: * * 1. Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * * 2. Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in * the documentation and/or other materials provided with the * distribution. * * 3. Neither the name of Lloyd Hilaiel nor the names of its * contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE * DISCLAIMED. IN NO EVENT SHALL THE AUTHOR 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. */ /** * \file yajl_gen.h * Interface to YAJL's JSON generation facilities. */ #include "yajl_common.h" #ifndef __YAJL_GEN_H__ #define __YAJL_GEN_H__ #ifdef __cplusplus extern "C" { #endif /** generator status codes */ typedef enum { /** no error */ yajl_gen_status_ok = 0, /** at a point where a map key is generated, a function other than * yajl_gen_string was called */ yajl_gen_keys_must_be_strings, /** YAJL's maximum generation depth was exceeded. see * YAJL_MAX_DEPTH */ yajl_max_depth_exceeded, /** A generator function (yajl_gen_XXX) was called while in an error * state */ yajl_gen_in_error_state, /** A complete JSON document has been generated */ yajl_gen_generation_complete, /** yajl_gen_double was passed an invalid floating point value * (infinity or NaN). */ yajl_gen_invalid_number, /** A print callback was passed in, so there is no internal * buffer to get from */ yajl_gen_no_buf } yajl_gen_status; /** an opaque handle to a generator */ typedef struct yajl_gen_t * yajl_gen; /** a callback used for "printing" the results. */ typedef void (*yajl_print_t)(void * ctx, const char * str, unsigned int len); /** configuration structure for the generator */ typedef struct { /** generate indented (beautiful) output */ unsigned int beautify; /** an opportunity to define an indent string. such as \\t or * some number of spaces. default is four spaces ' '. This * member is only relevant when beautify is true */ const char * indentString; } yajl_gen_config; /** allocate a generator handle * \param config a pointer to a structure containing parameters which * configure the behavior of the json generator * \param allocFuncs an optional pointer to a structure which allows * the client to overide the memory allocation * used by yajl. May be NULL, in which case * malloc/free/realloc will be used. * * \returns an allocated handle on success, NULL on failure (bad params) */ YAJL_API yajl_gen yajl_gen_alloc(const yajl_gen_config * config, const yajl_alloc_funcs * allocFuncs); /** allocate a generator handle that will print to the specified * callback rather than storing the results in an internal buffer. * \param callback a pointer to a printer function. May be NULL * in which case, the results will be store in an * internal buffer. * \param config a pointer to a structure containing parameters * which configure the behavior of the json * generator. * \param allocFuncs an optional pointer to a structure which allows * the client to overide the memory allocation * used by yajl. May be NULL, in which case * malloc/free/realloc will be used. * \param ctx a context pointer that will be passed to the * printer callback. * * \returns an allocated handle on success, NULL on failure (bad params) */ YAJL_API yajl_gen yajl_gen_alloc2(const yajl_print_t callback, const yajl_gen_config * config, const yajl_alloc_funcs * allocFuncs, void * ctx); /** free a generator handle */ YAJL_API void yajl_gen_free(yajl_gen handle); YAJL_API yajl_gen_status yajl_gen_integer(yajl_gen hand, long int number); /** generate a floating point number. number may not be infinity or * NaN, as these have no representation in JSON. In these cases the * generator will return 'yajl_gen_invalid_number' */ YAJL_API yajl_gen_status yajl_gen_double(yajl_gen hand, double number); YAJL_API yajl_gen_status yajl_gen_number(yajl_gen hand, const char * num, unsigned int len); YAJL_API yajl_gen_status yajl_gen_string(yajl_gen hand, const unsigned char * str, unsigned int len); YAJL_API yajl_gen_status yajl_gen_null(yajl_gen hand); YAJL_API yajl_gen_status yajl_gen_bool(yajl_gen hand, int boolean); YAJL_API yajl_gen_status yajl_gen_map_open(yajl_gen hand); YAJL_API yajl_gen_status yajl_gen_map_close(yajl_gen hand); YAJL_API yajl_gen_status yajl_gen_array_open(yajl_gen hand); YAJL_API yajl_gen_status yajl_gen_array_close(yajl_gen hand); /** access the null terminated generator buffer. If incrementally * outputing JSON, one should call yajl_gen_clear to clear the * buffer. This allows stream generation. */ YAJL_API yajl_gen_status yajl_gen_get_buf(yajl_gen hand, const unsigned char ** buf, unsigned int * len); /** clear yajl's output buffer, but maintain all internal generation * state. This function will not "reset" the generator state, and is * intended to enable incremental JSON outputing. */ YAJL_API void yajl_gen_clear(yajl_gen hand); #ifdef __cplusplus } #endif #endif apache-couchdb-1.6.0/src/ejson/yajl/yajl_lex.c0000644000175000001440000006232512332105522021145 0ustar00djcusers00000000000000/* * Copyright 2010, Lloyd Hilaiel. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are * met: * * 1. Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * * 2. Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in * the documentation and/or other materials provided with the * distribution. * * 3. Neither the name of Lloyd Hilaiel nor the names of its * contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE * DISCLAIMED. IN NO EVENT SHALL THE AUTHOR 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. */ #include "yajl_lex.h" #include "yajl_buf.h" #include #include #include #include #ifdef YAJL_LEXER_DEBUG static const char * tokToStr(yajl_tok tok) { switch (tok) { case yajl_tok_bool: return "bool"; case yajl_tok_colon: return "colon"; case yajl_tok_comma: return "comma"; case yajl_tok_eof: return "eof"; case yajl_tok_error: return "error"; case yajl_tok_left_brace: return "brace"; case yajl_tok_left_bracket: return "bracket"; case yajl_tok_null: return "null"; case yajl_tok_integer: return "integer"; case yajl_tok_double: return "double"; case yajl_tok_right_brace: return "brace"; case yajl_tok_right_bracket: return "bracket"; case yajl_tok_string: return "string"; case yajl_tok_string_with_escapes: return "string_with_escapes"; } return "unknown"; } #endif /* Impact of the stream parsing feature on the lexer: * * YAJL support stream parsing. That is, the ability to parse the first * bits of a chunk of JSON before the last bits are available (still on * the network or disk). This makes the lexer more complex. The * responsibility of the lexer is to handle transparently the case where * a chunk boundary falls in the middle of a token. This is * accomplished is via a buffer and a character reading abstraction. * * Overview of implementation * * When we lex to end of input string before end of token is hit, we * copy all of the input text composing the token into our lexBuf. * * Every time we read a character, we do so through the readChar function. * readChar's responsibility is to handle pulling all chars from the buffer * before pulling chars from input text */ struct yajl_lexer_t { /* the overal line and char offset into the data */ unsigned int lineOff; unsigned int charOff; /* error */ yajl_lex_error error; /* a input buffer to handle the case where a token is spread over * multiple chunks */ yajl_buf buf; /* in the case where we have data in the lexBuf, bufOff holds * the current offset into the lexBuf. */ unsigned int bufOff; /* are we using the lex buf? */ unsigned int bufInUse; /* shall we allow comments? */ unsigned int allowComments; /* shall we validate utf8 inside strings? */ unsigned int validateUTF8; yajl_alloc_funcs * alloc; }; #define readChar(lxr, txt, off) \ (((lxr)->bufInUse && yajl_buf_len((lxr)->buf) && lxr->bufOff < yajl_buf_len((lxr)->buf)) ? \ (*((const unsigned char *) yajl_buf_data((lxr)->buf) + ((lxr)->bufOff)++)) : \ ((txt)[(*(off))++])) #define unreadChar(lxr, off) ((*(off) > 0) ? (*(off))-- : ((lxr)->bufOff--)) yajl_lexer yajl_lex_alloc(yajl_alloc_funcs * alloc, unsigned int allowComments, unsigned int validateUTF8) { yajl_lexer lxr = (yajl_lexer) YA_MALLOC(alloc, sizeof(struct yajl_lexer_t)); memset((void *) lxr, 0, sizeof(struct yajl_lexer_t)); lxr->buf = yajl_buf_alloc(alloc); lxr->allowComments = allowComments; lxr->validateUTF8 = validateUTF8; lxr->alloc = alloc; return lxr; } void yajl_lex_free(yajl_lexer lxr) { yajl_buf_free(lxr->buf); YA_FREE(lxr->alloc, lxr); return; } /* a lookup table which lets us quickly determine three things: * VEC - valid escaped conrol char * IJC - invalid json char * VHC - valid hex char * note. the solidus '/' may be escaped or not. * note. the */ #define VEC 1 #define IJC 2 #define VHC 4 static const char charLookupTable[256] = { /*00*/ IJC , IJC , IJC , IJC , IJC , IJC , IJC , IJC , /*08*/ IJC , IJC , IJC , IJC , IJC , IJC , IJC , IJC , /*10*/ IJC , IJC , IJC , IJC , IJC , IJC , IJC , IJC , /*18*/ IJC , IJC , IJC , IJC , IJC , IJC , IJC , IJC , /*20*/ 0 , 0 , VEC|IJC, 0 , 0 , 0 , 0 , 0 , /*28*/ 0 , 0 , 0 , 0 , 0 , 0 , 0 , VEC , /*30*/ VHC , VHC , VHC , VHC , VHC , VHC , VHC , VHC , /*38*/ VHC , VHC , 0 , 0 , 0 , 0 , 0 , 0 , /*40*/ 0 , VHC , VHC , VHC , VHC , VHC , VHC , 0 , /*48*/ 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , /*50*/ 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , /*58*/ 0 , 0 , 0 , 0 , VEC|IJC, 0 , 0 , 0 , /*60*/ 0 , VHC , VEC|VHC, VHC , VHC , VHC , VEC|VHC, 0 , /*68*/ 0 , 0 , 0 , 0 , 0 , 0 , VEC , 0 , /*70*/ 0 , 0 , VEC , 0 , VEC , 0 , 0 , 0 , /*78*/ 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , /* include these so we don't have to always check the range of the char */ 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 }; /** process a variable length utf8 encoded codepoint. * * returns: * yajl_tok_string - if valid utf8 char was parsed and offset was * advanced * yajl_tok_eof - if end of input was hit before validation could * complete * yajl_tok_error - if invalid utf8 was encountered * * NOTE: on error the offset will point to the first char of the * invalid utf8 */ #define UTF8_CHECK_EOF if (*offset >= jsonTextLen) { return yajl_tok_eof; } static yajl_tok yajl_lex_utf8_char(yajl_lexer lexer, const unsigned char * jsonText, unsigned int jsonTextLen, unsigned int * offset, unsigned char curChar) { if (curChar <= 0x7f) { /* single byte */ return yajl_tok_string; } else if ((curChar >> 5) == 0x6) { /* two byte */ UTF8_CHECK_EOF; curChar = readChar(lexer, jsonText, offset); if ((curChar >> 6) == 0x2) return yajl_tok_string; } else if ((curChar >> 4) == 0x0e) { /* three byte */ UTF8_CHECK_EOF; curChar = readChar(lexer, jsonText, offset); if ((curChar >> 6) == 0x2) { UTF8_CHECK_EOF; curChar = readChar(lexer, jsonText, offset); if ((curChar >> 6) == 0x2) return yajl_tok_string; } } else if ((curChar >> 3) == 0x1e) { /* four byte */ UTF8_CHECK_EOF; curChar = readChar(lexer, jsonText, offset); if ((curChar >> 6) == 0x2) { UTF8_CHECK_EOF; curChar = readChar(lexer, jsonText, offset); if ((curChar >> 6) == 0x2) { UTF8_CHECK_EOF; curChar = readChar(lexer, jsonText, offset); if ((curChar >> 6) == 0x2) return yajl_tok_string; } } } return yajl_tok_error; } /* lex a string. input is the lexer, pointer to beginning of * json text, and start of string (offset). * a token is returned which has the following meanings: * yajl_tok_string: lex of string was successful. offset points to * terminating '"'. * yajl_tok_eof: end of text was encountered before we could complete * the lex. * yajl_tok_error: embedded in the string were unallowable chars. offset * points to the offending char */ #define STR_CHECK_EOF \ if (*offset >= jsonTextLen) { \ tok = yajl_tok_eof; \ goto finish_string_lex; \ } static yajl_tok yajl_lex_string(yajl_lexer lexer, const unsigned char * jsonText, unsigned int jsonTextLen, unsigned int * offset) { yajl_tok tok = yajl_tok_error; int hasEscapes = 0; for (;;) { unsigned char curChar; STR_CHECK_EOF; curChar = readChar(lexer, jsonText, offset); /* quote terminates */ if (curChar == '"') { tok = yajl_tok_string; break; } /* backslash escapes a set of control chars, */ else if (curChar == '\\') { hasEscapes = 1; STR_CHECK_EOF; /* special case \u */ curChar = readChar(lexer, jsonText, offset); if (curChar == 'u') { unsigned int i = 0; for (i=0;i<4;i++) { STR_CHECK_EOF; curChar = readChar(lexer, jsonText, offset); if (!(charLookupTable[curChar] & VHC)) { /* back up to offending char */ unreadChar(lexer, offset); lexer->error = yajl_lex_string_invalid_hex_char; goto finish_string_lex; } } } else if (!(charLookupTable[curChar] & VEC)) { /* back up to offending char */ unreadChar(lexer, offset); lexer->error = yajl_lex_string_invalid_escaped_char; goto finish_string_lex; } } /* when not validating UTF8 it's a simple table lookup to determine * if the present character is invalid */ else if(charLookupTable[curChar] & IJC) { /* back up to offending char */ unreadChar(lexer, offset); lexer->error = yajl_lex_string_invalid_json_char; goto finish_string_lex; } /* when in validate UTF8 mode we need to do some extra work */ else if (lexer->validateUTF8) { yajl_tok t = yajl_lex_utf8_char(lexer, jsonText, jsonTextLen, offset, curChar); if (t == yajl_tok_eof) { tok = yajl_tok_eof; goto finish_string_lex; } else if (t == yajl_tok_error) { lexer->error = yajl_lex_string_invalid_utf8; goto finish_string_lex; } } /* accept it, and move on */ } finish_string_lex: /* tell our buddy, the parser, wether he needs to process this string * again */ if (hasEscapes && tok == yajl_tok_string) { tok = yajl_tok_string_with_escapes; } return tok; } #define RETURN_IF_EOF if (*offset >= jsonTextLen) return yajl_tok_eof; static yajl_tok yajl_lex_number(yajl_lexer lexer, const unsigned char * jsonText, unsigned int jsonTextLen, unsigned int * offset) { /** XXX: numbers are the only entities in json that we must lex * _beyond_ in order to know that they are complete. There * is an ambiguous case for integers at EOF. */ unsigned char c; yajl_tok tok = yajl_tok_integer; RETURN_IF_EOF; c = readChar(lexer, jsonText, offset); /* optional leading minus */ if (c == '-') { RETURN_IF_EOF; c = readChar(lexer, jsonText, offset); } /* a single zero, or a series of integers */ if (c == '0') { RETURN_IF_EOF; c = readChar(lexer, jsonText, offset); } else if (c >= '1' && c <= '9') { do { RETURN_IF_EOF; c = readChar(lexer, jsonText, offset); } while (c >= '0' && c <= '9'); } else { unreadChar(lexer, offset); lexer->error = yajl_lex_missing_integer_after_minus; return yajl_tok_error; } /* optional fraction (indicates this is floating point) */ if (c == '.') { int numRd = 0; RETURN_IF_EOF; c = readChar(lexer, jsonText, offset); while (c >= '0' && c <= '9') { numRd++; RETURN_IF_EOF; c = readChar(lexer, jsonText, offset); } if (!numRd) { unreadChar(lexer, offset); lexer->error = yajl_lex_missing_integer_after_decimal; return yajl_tok_error; } tok = yajl_tok_double; } /* optional exponent (indicates this is floating point) */ if (c == 'e' || c == 'E') { RETURN_IF_EOF; c = readChar(lexer, jsonText, offset); /* optional sign */ if (c == '+' || c == '-') { RETURN_IF_EOF; c = readChar(lexer, jsonText, offset); } if (c >= '0' && c <= '9') { do { RETURN_IF_EOF; c = readChar(lexer, jsonText, offset); } while (c >= '0' && c <= '9'); } else { unreadChar(lexer, offset); lexer->error = yajl_lex_missing_integer_after_exponent; return yajl_tok_error; } tok = yajl_tok_double; } /* we always go "one too far" */ unreadChar(lexer, offset); return tok; } static yajl_tok yajl_lex_comment(yajl_lexer lexer, const unsigned char * jsonText, unsigned int jsonTextLen, unsigned int * offset) { unsigned char c; yajl_tok tok = yajl_tok_comment; RETURN_IF_EOF; c = readChar(lexer, jsonText, offset); /* either slash or star expected */ if (c == '/') { /* now we throw away until end of line */ do { RETURN_IF_EOF; c = readChar(lexer, jsonText, offset); } while (c != '\n'); } else if (c == '*') { /* now we throw away until end of comment */ for (;;) { RETURN_IF_EOF; c = readChar(lexer, jsonText, offset); if (c == '*') { RETURN_IF_EOF; c = readChar(lexer, jsonText, offset); if (c == '/') { break; } else { unreadChar(lexer, offset); } } } } else { lexer->error = yajl_lex_invalid_char; tok = yajl_tok_error; } return tok; } yajl_tok yajl_lex_lex(yajl_lexer lexer, const unsigned char * jsonText, unsigned int jsonTextLen, unsigned int * offset, const unsigned char ** outBuf, unsigned int * outLen) { yajl_tok tok = yajl_tok_error; unsigned char c; unsigned int startOffset = *offset; *outBuf = NULL; *outLen = 0; for (;;) { assert(*offset <= jsonTextLen); if (*offset >= jsonTextLen) { tok = yajl_tok_eof; goto lexed; } c = readChar(lexer, jsonText, offset); switch (c) { case '{': tok = yajl_tok_left_bracket; goto lexed; case '}': tok = yajl_tok_right_bracket; goto lexed; case '[': tok = yajl_tok_left_brace; goto lexed; case ']': tok = yajl_tok_right_brace; goto lexed; case ',': tok = yajl_tok_comma; goto lexed; case ':': tok = yajl_tok_colon; goto lexed; case '\t': case '\n': case '\v': case '\f': case '\r': case ' ': startOffset++; break; case 't': { const char * want = "rue"; do { if (*offset >= jsonTextLen) { tok = yajl_tok_eof; goto lexed; } c = readChar(lexer, jsonText, offset); if (c != *want) { unreadChar(lexer, offset); lexer->error = yajl_lex_invalid_string; tok = yajl_tok_error; goto lexed; } } while (*(++want)); tok = yajl_tok_bool; goto lexed; } case 'f': { const char * want = "alse"; do { if (*offset >= jsonTextLen) { tok = yajl_tok_eof; goto lexed; } c = readChar(lexer, jsonText, offset); if (c != *want) { unreadChar(lexer, offset); lexer->error = yajl_lex_invalid_string; tok = yajl_tok_error; goto lexed; } } while (*(++want)); tok = yajl_tok_bool; goto lexed; } case 'n': { const char * want = "ull"; do { if (*offset >= jsonTextLen) { tok = yajl_tok_eof; goto lexed; } c = readChar(lexer, jsonText, offset); if (c != *want) { unreadChar(lexer, offset); lexer->error = yajl_lex_invalid_string; tok = yajl_tok_error; goto lexed; } } while (*(++want)); tok = yajl_tok_null; goto lexed; } case '"': { tok = yajl_lex_string(lexer, (const unsigned char *) jsonText, jsonTextLen, offset); goto lexed; } case '-': case '0': case '1': case '2': case '3': case '4': case '5': case '6': case '7': case '8': case '9': { /* integer parsing wants to start from the beginning */ unreadChar(lexer, offset); tok = yajl_lex_number(lexer, (const unsigned char *) jsonText, jsonTextLen, offset); goto lexed; } case '/': /* hey, look, a probable comment! If comments are disabled * it's an error. */ if (!lexer->allowComments) { unreadChar(lexer, offset); lexer->error = yajl_lex_unallowed_comment; tok = yajl_tok_error; goto lexed; } /* if comments are enabled, then we should try to lex * the thing. possible outcomes are * - successful lex (tok_comment, which means continue), * - malformed comment opening (slash not followed by * '*' or '/') (tok_error) * - eof hit. (tok_eof) */ tok = yajl_lex_comment(lexer, (const unsigned char *) jsonText, jsonTextLen, offset); if (tok == yajl_tok_comment) { /* "error" is silly, but that's the initial * state of tok. guilty until proven innocent. */ tok = yajl_tok_error; yajl_buf_clear(lexer->buf); lexer->bufInUse = 0; startOffset = *offset; break; } /* hit error or eof, bail */ goto lexed; default: lexer->error = yajl_lex_invalid_char; tok = yajl_tok_error; goto lexed; } } lexed: /* need to append to buffer if the buffer is in use or * if it's an EOF token */ if (tok == yajl_tok_eof || lexer->bufInUse) { if (!lexer->bufInUse) yajl_buf_clear(lexer->buf); lexer->bufInUse = 1; yajl_buf_append(lexer->buf, jsonText + startOffset, *offset - startOffset); lexer->bufOff = 0; if (tok != yajl_tok_eof) { *outBuf = yajl_buf_data(lexer->buf); *outLen = yajl_buf_len(lexer->buf); lexer->bufInUse = 0; } } else if (tok != yajl_tok_error) { *outBuf = jsonText + startOffset; *outLen = *offset - startOffset; } /* special case for strings. skip the quotes. */ if (tok == yajl_tok_string || tok == yajl_tok_string_with_escapes) { assert(*outLen >= 2); (*outBuf)++; *outLen -= 2; } #ifdef YAJL_LEXER_DEBUG if (tok == yajl_tok_error) { printf("lexical error: %s\n", yajl_lex_error_to_string(yajl_lex_get_error(lexer))); } else if (tok == yajl_tok_eof) { printf("EOF hit\n"); } else { printf("lexed %s: '", tokToStr(tok)); fwrite(*outBuf, 1, *outLen, stdout); printf("'\n"); } #endif return tok; } const char * yajl_lex_error_to_string(yajl_lex_error error) { switch (error) { case yajl_lex_e_ok: return "ok, no error"; case yajl_lex_string_invalid_utf8: return "invalid bytes in UTF8 string."; case yajl_lex_string_invalid_escaped_char: return "inside a string, '\\' occurs before a character " "which it may not."; case yajl_lex_string_invalid_json_char: return "invalid character inside string."; case yajl_lex_string_invalid_hex_char: return "invalid (non-hex) character occurs after '\\u' inside " "string."; case yajl_lex_invalid_char: return "invalid char in json text."; case yajl_lex_invalid_string: return "invalid string in json text."; case yajl_lex_missing_integer_after_exponent: return "malformed number, a digit is required after the exponent."; case yajl_lex_missing_integer_after_decimal: return "malformed number, a digit is required after the " "decimal point."; case yajl_lex_missing_integer_after_minus: return "malformed number, a digit is required after the " "minus sign."; case yajl_lex_unallowed_comment: return "probable comment found in input text, comments are " "not enabled."; } return "unknown error code"; } /** allows access to more specific information about the lexical * error when yajl_lex_lex returns yajl_tok_error. */ yajl_lex_error yajl_lex_get_error(yajl_lexer lexer) { if (lexer == NULL) return (yajl_lex_error) -1; return lexer->error; } unsigned int yajl_lex_current_line(yajl_lexer lexer) { return lexer->lineOff; } unsigned int yajl_lex_current_char(yajl_lexer lexer) { return lexer->charOff; } yajl_tok yajl_lex_peek(yajl_lexer lexer, const unsigned char * jsonText, unsigned int jsonTextLen, unsigned int offset) { const unsigned char * outBuf; unsigned int outLen; unsigned int bufLen = yajl_buf_len(lexer->buf); unsigned int bufOff = lexer->bufOff; unsigned int bufInUse = lexer->bufInUse; yajl_tok tok; tok = yajl_lex_lex(lexer, jsonText, jsonTextLen, &offset, &outBuf, &outLen); lexer->bufOff = bufOff; lexer->bufInUse = bufInUse; yajl_buf_truncate(lexer->buf, bufLen); return tok; } apache-couchdb-1.6.0/src/ejson/yajl/yajl_lex.h0000644000175000001440000001157712332105522021155 0ustar00djcusers00000000000000/* * Copyright 2010, Lloyd Hilaiel. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are * met: * * 1. Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * * 2. Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in * the documentation and/or other materials provided with the * distribution. * * 3. Neither the name of Lloyd Hilaiel nor the names of its * contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE * DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE * POSSIBILITY OF SUCH DAMAGE. */ #ifndef __YAJL_LEX_H__ #define __YAJL_LEX_H__ #include "yajl_common.h" typedef enum { yajl_tok_bool, yajl_tok_colon, yajl_tok_comma, yajl_tok_eof, yajl_tok_error, yajl_tok_left_brace, yajl_tok_left_bracket, yajl_tok_null, yajl_tok_right_brace, yajl_tok_right_bracket, /* we differentiate between integers and doubles to allow the * parser to interpret the number without re-scanning */ yajl_tok_integer, yajl_tok_double, /* we differentiate between strings which require further processing, * and strings that do not */ yajl_tok_string, yajl_tok_string_with_escapes, /* comment tokens are not currently returned to the parser, ever */ yajl_tok_comment } yajl_tok; typedef struct yajl_lexer_t * yajl_lexer; yajl_lexer yajl_lex_alloc(yajl_alloc_funcs * alloc, unsigned int allowComments, unsigned int validateUTF8); void yajl_lex_free(yajl_lexer lexer); /** * run/continue a lex. "offset" is an input/output parameter. * It should be initialized to zero for a * new chunk of target text, and upon subsetquent calls with the same * target text should passed with the value of the previous invocation. * * the client may be interested in the value of offset when an error is * returned from the lexer. This allows the client to render useful n * error messages. * * When you pass the next chunk of data, context should be reinitialized * to zero. * * Finally, the output buffer is usually just a pointer into the jsonText, * however in cases where the entity being lexed spans multiple chunks, * the lexer will buffer the entity and the data returned will be * a pointer into that buffer. * * This behavior is abstracted from client code except for the performance * implications which require that the client choose a reasonable chunk * size to get adequate performance. */ yajl_tok yajl_lex_lex(yajl_lexer lexer, const unsigned char * jsonText, unsigned int jsonTextLen, unsigned int * offset, const unsigned char ** outBuf, unsigned int * outLen); /** have a peek at the next token, but don't move the lexer forward */ yajl_tok yajl_lex_peek(yajl_lexer lexer, const unsigned char * jsonText, unsigned int jsonTextLen, unsigned int offset); typedef enum { yajl_lex_e_ok = 0, yajl_lex_string_invalid_utf8, yajl_lex_string_invalid_escaped_char, yajl_lex_string_invalid_json_char, yajl_lex_string_invalid_hex_char, yajl_lex_invalid_char, yajl_lex_invalid_string, yajl_lex_missing_integer_after_decimal, yajl_lex_missing_integer_after_exponent, yajl_lex_missing_integer_after_minus, yajl_lex_unallowed_comment } yajl_lex_error; const char * yajl_lex_error_to_string(yajl_lex_error error); /** allows access to more specific information about the lexical * error when yajl_lex_lex returns yajl_tok_error. */ yajl_lex_error yajl_lex_get_error(yajl_lexer lexer); /** get the current offset into the most recently lexed json string. */ unsigned int yajl_lex_current_offset(yajl_lexer lexer); /** get the number of lines lexed by this lexer instance */ unsigned int yajl_lex_current_line(yajl_lexer lexer); /** get the number of chars lexed by this lexer instance since the last * \n or \r */ unsigned int yajl_lex_current_char(yajl_lexer lexer); #endif apache-couchdb-1.6.0/src/ejson/yajl/yajl_parser.c0000644000175000001440000005062312332105522021647 0ustar00djcusers00000000000000/* * Copyright 2010, Lloyd Hilaiel. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are * met: * * 1. Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * * 2. Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in * the documentation and/or other materials provided with the * distribution. * * 3. Neither the name of Lloyd Hilaiel nor the names of its * contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE * DISCLAIMED. IN NO EVENT SHALL THE AUTHOR 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. */ #include "yajl_lex.h" #include "yajl_parser.h" #include "yajl_encode.h" #include "yajl_bytestack.h" #include #include #include #include #include #include #include #include const char * yajl_parser_error_to_string(yajl_parser_error error) { switch (error) { case yajl_parser_e_ok: return "ok, no error"; case yajl_parser_client_cancelled: return "client cancelled parse via callback return value"; case yajl_parser_integer_overflow: return "integer overflow"; case yajl_parser_numeric_overflow: return "numeric (floating point) overflow"; case yajl_parser_invalid_token: return "unallowed token at this point in JSON text"; case yajl_parser_internal_invalid_token: return "invalid token, internal error"; case yajl_parser_key_must_be_string: return "invalid object key (must be a string)"; case yajl_parser_pair_missing_colon: return "object key and value must be separated by a colon (':')"; case yajl_parser_bad_token_after_map_value: return "after key and value, inside map, I expect ',' or '}'"; case yajl_parser_bad_token_after_array_value: return "after array element, I expect ',' or ']'"; } return "unknown error code"; } unsigned char * yajl_render_error_string(yajl_handle hand, const unsigned char * jsonText, unsigned int jsonTextLen, int verbose) { unsigned int offset = hand->bytesConsumed; unsigned char * str; const char * errorType = NULL; const char * errorText = NULL; char text[72]; const char * arrow = " (right here) ------^\n"; if (yajl_bs_current(hand->stateStack) == yajl_state_parse_error) { errorType = "parse"; errorText = yajl_parser_error_to_string(hand->parserError); } else if (yajl_bs_current(hand->stateStack) == yajl_state_lexical_error) { errorType = "lexical"; errorText = yajl_lex_error_to_string(yajl_lex_get_error(hand->lexer)); } else { errorType = "unknown"; } { unsigned int memneeded = 0; memneeded += strlen(errorType); memneeded += strlen(" error"); if (errorText != NULL) { memneeded += strlen(": "); memneeded += strlen(errorText); } str = (unsigned char *) YA_MALLOC(&(hand->alloc), memneeded + 2); str[0] = 0; strcat((char *) str, errorType); strcat((char *) str, " error"); if (errorText != NULL) { strcat((char *) str, ": "); strcat((char *) str, errorText); } strcat((char *) str, "\n"); } /* now we append as many spaces as needed to make sure the error * falls at char 41, if verbose was specified */ if (verbose) { unsigned int start, end, i; unsigned int spacesNeeded; spacesNeeded = (offset < 30 ? 40 - offset : 10); start = (offset >= 30 ? offset - 30 : 0); end = (offset + 30 > jsonTextLen ? jsonTextLen : offset + 30); for (i=0;ialloc), (strlen((char *) str) + strlen((char *) text) + strlen(arrow) + 1)); newStr[0] = 0; strcat((char *) newStr, (char *) str); strcat((char *) newStr, text); strcat((char *) newStr, arrow); YA_FREE(&(hand->alloc), str); str = (unsigned char *) newStr; } } return str; } /* check for client cancelation */ #define _CC_CHK(x) \ if (!(x)) { \ yajl_bs_set(hand->stateStack, yajl_state_parse_error); \ hand->parserError = yajl_parser_client_cancelled; \ return yajl_status_client_canceled; \ } yajl_status yajl_do_parse(yajl_handle hand, const unsigned char * jsonText, unsigned int jsonTextLen) { yajl_tok tok; const unsigned char * buf; unsigned int bufLen; unsigned int * offset = &(hand->bytesConsumed); *offset = 0; around_again: switch (yajl_bs_current(hand->stateStack)) { case yajl_state_parse_complete: return yajl_status_ok; case yajl_state_lexical_error: case yajl_state_parse_error: return yajl_status_error; case yajl_state_start: case yajl_state_map_need_val: case yajl_state_array_need_val: case yajl_state_array_start: { /* for arrays and maps, we advance the state for this * depth, then push the state of the next depth. * If an error occurs during the parsing of the nesting * enitity, the state at this level will not matter. * a state that needs pushing will be anything other * than state_start */ yajl_state stateToPush = yajl_state_start; tok = yajl_lex_lex(hand->lexer, jsonText, jsonTextLen, offset, &buf, &bufLen); switch (tok) { case yajl_tok_eof: return yajl_status_insufficient_data; case yajl_tok_error: yajl_bs_set(hand->stateStack, yajl_state_lexical_error); goto around_again; case yajl_tok_string: if (hand->callbacks && hand->callbacks->yajl_string) { _CC_CHK(hand->callbacks->yajl_string(hand->ctx, buf, bufLen)); } break; case yajl_tok_string_with_escapes: if (hand->callbacks && hand->callbacks->yajl_string) { yajl_buf_clear(hand->decodeBuf); yajl_string_decode(hand->decodeBuf, buf, bufLen); _CC_CHK(hand->callbacks->yajl_string( hand->ctx, yajl_buf_data(hand->decodeBuf), yajl_buf_len(hand->decodeBuf))); } break; case yajl_tok_bool: if (hand->callbacks && hand->callbacks->yajl_boolean) { _CC_CHK(hand->callbacks->yajl_boolean(hand->ctx, *buf == 't')); } break; case yajl_tok_null: if (hand->callbacks && hand->callbacks->yajl_null) { _CC_CHK(hand->callbacks->yajl_null(hand->ctx)); } break; case yajl_tok_left_bracket: if (hand->callbacks && hand->callbacks->yajl_start_map) { _CC_CHK(hand->callbacks->yajl_start_map(hand->ctx)); } stateToPush = yajl_state_map_start; break; case yajl_tok_left_brace: if (hand->callbacks && hand->callbacks->yajl_start_array) { _CC_CHK(hand->callbacks->yajl_start_array(hand->ctx)); } stateToPush = yajl_state_array_start; break; case yajl_tok_integer: /* * note. strtol does not respect the length of * the lexical token. in a corner case where the * lexed number is a integer with a trailing zero, * immediately followed by the end of buffer, * sscanf could run off into oblivion and cause a * crash. for this reason we copy the integer * (and doubles), into our parse buffer (the same * one used for unescaping strings), before * calling strtol. yajl_buf ensures null padding, * so we're safe. */ if (hand->callbacks) { if (hand->callbacks->yajl_number) { _CC_CHK(hand->callbacks->yajl_number( hand->ctx,(const char *) buf, bufLen)); } else if (hand->callbacks->yajl_integer) { long int i = 0; yajl_buf_clear(hand->decodeBuf); yajl_buf_append(hand->decodeBuf, buf, bufLen); buf = yajl_buf_data(hand->decodeBuf); i = strtol((const char *) buf, NULL, 10); if ((i == LONG_MIN || i == LONG_MAX) && errno == ERANGE) { yajl_bs_set(hand->stateStack, yajl_state_parse_error); hand->parserError = yajl_parser_integer_overflow; /* try to restore error offset */ if (*offset >= bufLen) *offset -= bufLen; else *offset = 0; goto around_again; } _CC_CHK(hand->callbacks->yajl_integer(hand->ctx, i)); } } break; case yajl_tok_double: if (hand->callbacks) { if (hand->callbacks->yajl_number) { _CC_CHK(hand->callbacks->yajl_number( hand->ctx, (const char *) buf, bufLen)); } else if (hand->callbacks->yajl_double) { double d = 0.0; yajl_buf_clear(hand->decodeBuf); yajl_buf_append(hand->decodeBuf, buf, bufLen); buf = yajl_buf_data(hand->decodeBuf); d = strtod((char *) buf, NULL); if ((d == HUGE_VAL || d == -HUGE_VAL) && errno == ERANGE) { yajl_bs_set(hand->stateStack, yajl_state_parse_error); hand->parserError = yajl_parser_numeric_overflow; /* try to restore error offset */ if (*offset >= bufLen) *offset -= bufLen; else *offset = 0; goto around_again; } _CC_CHK(hand->callbacks->yajl_double(hand->ctx, d)); } } break; case yajl_tok_right_brace: { if (yajl_bs_current(hand->stateStack) == yajl_state_array_start) { if (hand->callbacks && hand->callbacks->yajl_end_array) { _CC_CHK(hand->callbacks->yajl_end_array(hand->ctx)); } yajl_bs_pop(hand->stateStack); goto around_again; } /* intentional fall-through */ } case yajl_tok_colon: case yajl_tok_comma: case yajl_tok_right_bracket: yajl_bs_set(hand->stateStack, yajl_state_parse_error); hand->parserError = yajl_parser_invalid_token; goto around_again; default: yajl_bs_set(hand->stateStack, yajl_state_parse_error); hand->parserError = yajl_parser_invalid_token; goto around_again; } /* got a value. transition depends on the state we're in. */ { yajl_state s = yajl_bs_current(hand->stateStack); if (s == yajl_state_start) { yajl_bs_set(hand->stateStack, yajl_state_parse_complete); } else if (s == yajl_state_map_need_val) { yajl_bs_set(hand->stateStack, yajl_state_map_got_val); } else { yajl_bs_set(hand->stateStack, yajl_state_array_got_val); } } if (stateToPush != yajl_state_start) { yajl_bs_push(hand->stateStack, stateToPush); } goto around_again; } case yajl_state_map_start: case yajl_state_map_need_key: { /* only difference between these two states is that in * start '}' is valid, whereas in need_key, we've parsed * a comma, and a string key _must_ follow */ tok = yajl_lex_lex(hand->lexer, jsonText, jsonTextLen, offset, &buf, &bufLen); switch (tok) { case yajl_tok_eof: return yajl_status_insufficient_data; case yajl_tok_error: yajl_bs_set(hand->stateStack, yajl_state_lexical_error); goto around_again; case yajl_tok_string_with_escapes: if (hand->callbacks && hand->callbacks->yajl_map_key) { yajl_buf_clear(hand->decodeBuf); yajl_string_decode(hand->decodeBuf, buf, bufLen); buf = yajl_buf_data(hand->decodeBuf); bufLen = yajl_buf_len(hand->decodeBuf); } /* intentional fall-through */ case yajl_tok_string: if (hand->callbacks && hand->callbacks->yajl_map_key) { _CC_CHK(hand->callbacks->yajl_map_key(hand->ctx, buf, bufLen)); } yajl_bs_set(hand->stateStack, yajl_state_map_sep); goto around_again; case yajl_tok_right_bracket: if (yajl_bs_current(hand->stateStack) == yajl_state_map_start) { if (hand->callbacks && hand->callbacks->yajl_end_map) { _CC_CHK(hand->callbacks->yajl_end_map(hand->ctx)); } yajl_bs_pop(hand->stateStack); goto around_again; } default: yajl_bs_set(hand->stateStack, yajl_state_parse_error); hand->parserError = yajl_parser_key_must_be_string; goto around_again; } } case yajl_state_map_sep: { tok = yajl_lex_lex(hand->lexer, jsonText, jsonTextLen, offset, &buf, &bufLen); switch (tok) { case yajl_tok_colon: yajl_bs_set(hand->stateStack, yajl_state_map_need_val); goto around_again; case yajl_tok_eof: return yajl_status_insufficient_data; case yajl_tok_error: yajl_bs_set(hand->stateStack, yajl_state_lexical_error); goto around_again; default: yajl_bs_set(hand->stateStack, yajl_state_parse_error); hand->parserError = yajl_parser_pair_missing_colon; goto around_again; } } case yajl_state_map_got_val: { tok = yajl_lex_lex(hand->lexer, jsonText, jsonTextLen, offset, &buf, &bufLen); switch (tok) { case yajl_tok_right_bracket: if (hand->callbacks && hand->callbacks->yajl_end_map) { _CC_CHK(hand->callbacks->yajl_end_map(hand->ctx)); } yajl_bs_pop(hand->stateStack); goto around_again; case yajl_tok_comma: yajl_bs_set(hand->stateStack, yajl_state_map_need_key); goto around_again; case yajl_tok_eof: return yajl_status_insufficient_data; case yajl_tok_error: yajl_bs_set(hand->stateStack, yajl_state_lexical_error); goto around_again; default: yajl_bs_set(hand->stateStack, yajl_state_parse_error); hand->parserError = yajl_parser_bad_token_after_map_value; /* try to restore error offset */ if (*offset >= bufLen) *offset -= bufLen; else *offset = 0; goto around_again; } } case yajl_state_array_got_val: { tok = yajl_lex_lex(hand->lexer, jsonText, jsonTextLen, offset, &buf, &bufLen); switch (tok) { case yajl_tok_right_brace: if (hand->callbacks && hand->callbacks->yajl_end_array) { _CC_CHK(hand->callbacks->yajl_end_array(hand->ctx)); } yajl_bs_pop(hand->stateStack); goto around_again; case yajl_tok_comma: yajl_bs_set(hand->stateStack, yajl_state_array_need_val); goto around_again; case yajl_tok_eof: return yajl_status_insufficient_data; case yajl_tok_error: yajl_bs_set(hand->stateStack, yajl_state_lexical_error); goto around_again; default: yajl_bs_set(hand->stateStack, yajl_state_parse_error); hand->parserError = yajl_parser_bad_token_after_array_value; goto around_again; } } } abort(); return yajl_status_error; } apache-couchdb-1.6.0/src/ejson/yajl/yajl_parser.h0000644000175000001440000000640012332105522021646 0ustar00djcusers00000000000000/* * Copyright 2010, Lloyd Hilaiel. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are * met: * * 1. Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * * 2. Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in * the documentation and/or other materials provided with the * distribution. * * 3. Neither the name of Lloyd Hilaiel nor the names of its * contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE * DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE * POSSIBILITY OF SUCH DAMAGE. */ #ifndef __YAJL_PARSER_H__ #define __YAJL_PARSER_H__ #include "yajl_parse.h" #include "yajl_bytestack.h" #include "yajl_buf.h" #include "yajl_lex.h" typedef enum { yajl_state_start = 0, yajl_state_parse_complete, yajl_state_parse_error, yajl_state_lexical_error, yajl_state_map_start, yajl_state_map_sep, yajl_state_map_need_val, yajl_state_map_got_val, yajl_state_map_need_key, yajl_state_array_start, yajl_state_array_got_val, yajl_state_array_need_val } yajl_state; typedef enum { yajl_parser_e_ok = 0, yajl_parser_client_cancelled, yajl_parser_integer_overflow, yajl_parser_numeric_overflow, yajl_parser_invalid_token, yajl_parser_internal_invalid_token, yajl_parser_key_must_be_string, yajl_parser_pair_missing_colon, yajl_parser_bad_token_after_map_value, yajl_parser_bad_token_after_array_value } yajl_parser_error; struct yajl_handle_t { const yajl_callbacks * callbacks; void * ctx; yajl_lexer lexer; yajl_parser_error parserError; /* the number of bytes consumed from the last client buffer, * in the case of an error this will be an error offset, in the * case of an error this can be used as the error offset */ unsigned int bytesConsumed; /* temporary storage for decoded strings */ yajl_buf decodeBuf; /* a stack of states. access with yajl_state_XXX routines */ yajl_bytestack stateStack; /* memory allocation routines */ yajl_alloc_funcs alloc; }; yajl_status yajl_do_parse(yajl_handle handle, const unsigned char * jsonText, unsigned int jsonTextLen); unsigned char * yajl_render_error_string(yajl_handle hand, const unsigned char * jsonText, unsigned int jsonTextLen, int verbose); #endif apache-couchdb-1.6.0/src/ejson/yajl/yajl_encode.c0000644000175000001440000001535012332105522021606 0ustar00djcusers00000000000000/* * Copyright 2010, Lloyd Hilaiel. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are * met: * * 1. Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * * 2. Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in * the documentation and/or other materials provided with the * distribution. * * 3. Neither the name of Lloyd Hilaiel nor the names of its * contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE * DISCLAIMED. IN NO EVENT SHALL THE AUTHOR 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. */ #include "yajl_encode.h" #include #include #include #include static void CharToHex(unsigned char c, char * hexBuf) { const char * hexchar = "0123456789ABCDEF"; hexBuf[0] = hexchar[c >> 4]; hexBuf[1] = hexchar[c & 0x0F]; } void yajl_string_encode(yajl_buf buf, const unsigned char * str, unsigned int len) { yajl_string_encode2((const yajl_print_t) &yajl_buf_append, buf, str, len); } void yajl_string_encode2(const yajl_print_t print, void * ctx, const unsigned char * str, unsigned int len) { unsigned int beg = 0; unsigned int end = 0; char hexBuf[7]; hexBuf[0] = '\\'; hexBuf[1] = 'u'; hexBuf[2] = '0'; hexBuf[3] = '0'; hexBuf[6] = 0; while (end < len) { const char * escaped = NULL; switch (str[end]) { case '\r': escaped = "\\r"; break; case '\n': escaped = "\\n"; break; case '\\': escaped = "\\\\"; break; /* case '/': escaped = "\\/"; break; */ case '"': escaped = "\\\""; break; case '\f': escaped = "\\f"; break; case '\b': escaped = "\\b"; break; case '\t': escaped = "\\t"; break; default: if ((unsigned char) str[end] < 32) { CharToHex(str[end], hexBuf + 4); escaped = hexBuf; } break; } if (escaped != NULL) { print(ctx, (const char *) (str + beg), end - beg); print(ctx, escaped, strlen(escaped)); beg = ++end; } else { ++end; } } print(ctx, (const char *) (str + beg), end - beg); } static void hexToDigit(unsigned int * val, const unsigned char * hex) { unsigned int i; for (i=0;i<4;i++) { unsigned char c = hex[i]; if (c >= 'A') c = (c & ~0x20) - 7; c -= '0'; assert(!(c & 0xF0)); *val = (*val << 4) | c; } } static void Utf32toUtf8(unsigned int codepoint, char * utf8Buf) { if (codepoint < 0x80) { utf8Buf[0] = (char) codepoint; utf8Buf[1] = 0; } else if (codepoint < 0x0800) { utf8Buf[0] = (char) ((codepoint >> 6) | 0xC0); utf8Buf[1] = (char) ((codepoint & 0x3F) | 0x80); utf8Buf[2] = 0; } else if (codepoint < 0x10000) { utf8Buf[0] = (char) ((codepoint >> 12) | 0xE0); utf8Buf[1] = (char) (((codepoint >> 6) & 0x3F) | 0x80); utf8Buf[2] = (char) ((codepoint & 0x3F) | 0x80); utf8Buf[3] = 0; } else if (codepoint < 0x200000) { utf8Buf[0] =(char)((codepoint >> 18) | 0xF0); utf8Buf[1] =(char)(((codepoint >> 12) & 0x3F) | 0x80); utf8Buf[2] =(char)(((codepoint >> 6) & 0x3F) | 0x80); utf8Buf[3] =(char)((codepoint & 0x3F) | 0x80); utf8Buf[4] = 0; } else { utf8Buf[0] = '?'; utf8Buf[1] = 0; } } void yajl_string_decode(yajl_buf buf, const unsigned char * str, unsigned int len) { unsigned int beg = 0; unsigned int end = 0; while (end < len) { if (str[end] == '\\') { char utf8Buf[5]; const char * unescaped = "?"; yajl_buf_append(buf, str + beg, end - beg); switch (str[++end]) { case 'r': unescaped = "\r"; break; case 'n': unescaped = "\n"; break; case '\\': unescaped = "\\"; break; case '/': unescaped = "/"; break; case '"': unescaped = "\""; break; case 'f': unescaped = "\f"; break; case 'b': unescaped = "\b"; break; case 't': unescaped = "\t"; break; case 'u': { unsigned int codepoint = 0; hexToDigit(&codepoint, str + ++end); end+=3; /* check if this is a surrogate */ if ((codepoint & 0xFC00) == 0xD800) { end++; if (str[end] == '\\' && str[end + 1] == 'u') { unsigned int surrogate = 0; hexToDigit(&surrogate, str + end + 2); codepoint = (((codepoint & 0x3F) << 10) | ((((codepoint >> 6) & 0xF) + 1) << 16) | (surrogate & 0x3FF)); end += 5; } else { unescaped = "?"; break; } } Utf32toUtf8(codepoint, utf8Buf); unescaped = utf8Buf; if (codepoint == 0) { yajl_buf_append(buf, unescaped, 1); beg = ++end; continue; } break; } default: assert("this should never happen" == NULL); } yajl_buf_append(buf, unescaped, strlen(unescaped)); beg = ++end; } else { end++; } } yajl_buf_append(buf, str + beg, end - beg); } apache-couchdb-1.6.0/src/ejson/yajl/yajl_encode.h0000644000175000001440000000377312332105522021621 0ustar00djcusers00000000000000/* * Copyright 2010, Lloyd Hilaiel. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are * met: * * 1. Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * * 2. Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in * the documentation and/or other materials provided with the * distribution. * * 3. Neither the name of Lloyd Hilaiel nor the names of its * contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE * DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE * POSSIBILITY OF SUCH DAMAGE. */ #ifndef __YAJL_ENCODE_H__ #define __YAJL_ENCODE_H__ #include "yajl_buf.h" #include "yajl_gen.h" void yajl_string_encode2(const yajl_print_t printer, void * ctx, const unsigned char * str, unsigned int length); void yajl_string_encode(yajl_buf buf, const unsigned char * str, unsigned int length); void yajl_string_decode(yajl_buf buf, const unsigned char * str, unsigned int length); #endif apache-couchdb-1.6.0/src/ejson/yajl/yajl_bytestack.h0000644000175000001440000000610312332105522022343 0ustar00djcusers00000000000000/* * Copyright 2010, Lloyd Hilaiel. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are * met: * * 1. Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * * 2. Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in * the documentation and/or other materials provided with the * distribution. * * 3. Neither the name of Lloyd Hilaiel nor the names of its * contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE * DISCLAIMED. IN NO EVENT SHALL THE AUTHOR 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. */ /* * A header only implementation of a simple stack of bytes, used in YAJL * to maintain parse state. */ #ifndef __YAJL_BYTESTACK_H__ #define __YAJL_BYTESTACK_H__ #include "yajl_common.h" #define YAJL_BS_INC 128 typedef struct yajl_bytestack_t { unsigned char * stack; unsigned int size; unsigned int used; yajl_alloc_funcs * yaf; } yajl_bytestack; /* initialize a bytestack */ #define yajl_bs_init(obs, _yaf) { \ (obs).stack = NULL; \ (obs).size = 0; \ (obs).used = 0; \ (obs).yaf = (_yaf); \ } \ /* initialize a bytestack */ #define yajl_bs_free(obs) \ if ((obs).stack) (obs).yaf->free((obs).yaf->ctx, (obs).stack); #define yajl_bs_current(obs) \ (assert((obs).used > 0), (obs).stack[(obs).used - 1]) #define yajl_bs_push(obs, byte) { \ if (((obs).size - (obs).used) == 0) { \ (obs).size += YAJL_BS_INC; \ (obs).stack = (obs).yaf->realloc((obs).yaf->ctx,\ (void *) (obs).stack, (obs).size);\ } \ (obs).stack[((obs).used)++] = (byte); \ } /* removes the top item of the stack, returns nothing */ #define yajl_bs_pop(obs) { ((obs).used)--; } #define yajl_bs_set(obs, byte) \ (obs).stack[((obs).used) - 1] = (byte); #endif apache-couchdb-1.6.0/src/ejson/yajl/yajl_common.h0000644000175000001440000000607312332105522021650 0ustar00djcusers00000000000000/* * Copyright 2010, Lloyd Hilaiel. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are * met: * * 1. Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * * 2. Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in * the documentation and/or other materials provided with the * distribution. * * 3. Neither the name of Lloyd Hilaiel nor the names of its * contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE * DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE * POSSIBILITY OF SUCH DAMAGE. */ #ifndef __YAJL_COMMON_H__ #define __YAJL_COMMON_H__ #ifdef __cplusplus extern "C" { #endif #define YAJL_MAX_DEPTH 128 /* msft dll export gunk. To build a DLL on windows, you * must define WIN32, YAJL_SHARED, and YAJL_BUILD. To use a shared * DLL, you must define YAJL_SHARED and WIN32 */ #if defined(WIN32) && defined(YAJL_SHARED) # ifdef YAJL_BUILD # define YAJL_API __declspec(dllexport) # else # define YAJL_API __declspec(dllimport) # endif #else # define YAJL_API #endif /** pointer to a malloc function, supporting client overriding memory * allocation routines */ typedef void * (*yajl_malloc_func)(void *ctx, unsigned int sz); /** pointer to a free function, supporting client overriding memory * allocation routines */ typedef void (*yajl_free_func)(void *ctx, void * ptr); /** pointer to a realloc function which can resize an allocation. */ typedef void * (*yajl_realloc_func)(void *ctx, void * ptr, unsigned int sz); /** A structure which can be passed to yajl_*_alloc routines to allow the * client to specify memory allocation functions to be used. */ typedef struct { /** pointer to a function that can allocate uninitialized memory */ yajl_malloc_func malloc; /** pointer to a function that can resize memory allocations */ yajl_realloc_func realloc; /** pointer to a function that can free memory allocated using * reallocFunction or mallocFunction */ yajl_free_func free; /** a context pointer that will be passed to above allocation routines */ void * ctx; } yajl_alloc_funcs; #ifdef __cplusplus } #endif #endif apache-couchdb-1.6.0/src/ejson/yajl/yajl.c0000644000175000001440000001145512332105522020273 0ustar00djcusers00000000000000/* * Copyright 2010, Lloyd Hilaiel. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are * met: * * 1. Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * * 2. Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in * the documentation and/or other materials provided with the * distribution. * * 3. Neither the name of Lloyd Hilaiel nor the names of its * contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE * DISCLAIMED. IN NO EVENT SHALL THE AUTHOR 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. */ #include "yajl_parse.h" #include "yajl_lex.h" #include "yajl_parser.h" #include "yajl_alloc.h" #include #include #include const char * yajl_status_to_string(yajl_status stat) { const char * statStr = "unknown"; switch (stat) { case yajl_status_ok: statStr = "ok, no error"; break; case yajl_status_client_canceled: statStr = "client canceled parse"; break; case yajl_status_insufficient_data: statStr = "eof was met before the parse could complete"; break; case yajl_status_error: statStr = "parse error"; break; } return statStr; } yajl_handle yajl_alloc(const yajl_callbacks * callbacks, const yajl_parser_config * config, const yajl_alloc_funcs * afs, void * ctx) { unsigned int allowComments = 0; unsigned int validateUTF8 = 0; yajl_handle hand = NULL; yajl_alloc_funcs afsBuffer; /* first order of business is to set up memory allocation routines */ if (afs != NULL) { if (afs->malloc == NULL || afs->realloc == NULL || afs->free == NULL) { return NULL; } } else { yajl_set_default_alloc_funcs(&afsBuffer); afs = &afsBuffer; } hand = (yajl_handle) YA_MALLOC(afs, sizeof(struct yajl_handle_t)); /* copy in pointers to allocation routines */ memcpy((void *) &(hand->alloc), (void *) afs, sizeof(yajl_alloc_funcs)); if (config != NULL) { allowComments = config->allowComments; validateUTF8 = config->checkUTF8; } hand->callbacks = callbacks; hand->ctx = ctx; hand->lexer = yajl_lex_alloc(&(hand->alloc), allowComments, validateUTF8); hand->bytesConsumed = 0; hand->decodeBuf = yajl_buf_alloc(&(hand->alloc)); yajl_bs_init(hand->stateStack, &(hand->alloc)); yajl_bs_push(hand->stateStack, yajl_state_start); return hand; } void yajl_free(yajl_handle handle) { yajl_bs_free(handle->stateStack); yajl_buf_free(handle->decodeBuf); yajl_lex_free(handle->lexer); YA_FREE(&(handle->alloc), handle); } yajl_status yajl_parse(yajl_handle hand, const unsigned char * jsonText, unsigned int jsonTextLen) { yajl_status status; status = yajl_do_parse(hand, jsonText, jsonTextLen); return status; } yajl_status yajl_parse_complete(yajl_handle hand) { /* The particular case we want to handle is a trailing number. * Further input consisting of digits could cause our interpretation * of the number to change (buffered "1" but "2" comes in). * A very simple approach to this is to inject whitespace to terminate * any number in the lex buffer. */ return yajl_parse(hand, (const unsigned char *)" ", 1); } unsigned char * yajl_get_error(yajl_handle hand, int verbose, const unsigned char * jsonText, unsigned int jsonTextLen) { return yajl_render_error_string(hand, jsonText, jsonTextLen, verbose); } unsigned int yajl_get_bytes_consumed(yajl_handle hand) { if (!hand) return 0; else return hand->bytesConsumed; } void yajl_free_error(yajl_handle hand, unsigned char * str) { /* use memory allocation functions if set */ YA_FREE(&(hand->alloc), str); } /* XXX: add utility routines to parse from file */ apache-couchdb-1.6.0/src/ejson/ejson.erl0000644000175000001440000001165112332105522020051 0ustar00djcusers00000000000000% Licensed under the Apache License, Version 2.0 (the "License"); you may not % use this file except in compliance with the License. You may obtain a copy of % the License at % % http://www.apache.org/licenses/LICENSE-2.0 % % Unless required by applicable law or agreed to in writing, software % distributed under the License is distributed on an "AS IS" BASIS, WITHOUT % WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the % License for the specific language governing permissions and limitations under % the License. -module(ejson). -export([encode/1, decode/1]). -on_load(init/0). init() -> SoName = case code:priv_dir(ejson) of {error, bad_name} -> case filelib:is_dir(filename:join(["..", priv])) of true -> filename:join(["..", priv, ejson]); false -> filename:join([priv, ejson]) end; Dir -> filename:join(Dir, ejson) end, (catch erlang:load_nif(SoName, 0)), case erlang:system_info(otp_release) of "R13B03" -> true; _ -> ok end. decode(undefined) -> throw({invalid_json, undefined}); decode(IoList) -> try nif_decode(IoList) catch exit:ejson_nif_not_loaded -> erl_decode(IoList) end. encode(EJson) -> try nif_encode(EJson) catch exit:ejson_nif_not_loaded -> erl_encode(EJson) end. nif_decode(IoList) -> case reverse_tokens(IoList) of {ok, ReverseTokens} -> [[EJson]] = make_ejson(ReverseTokens, [[]]), EJson; Error -> throw({invalid_json, {Error, IoList}}) end. erl_decode(IoList) -> try (mochijson2:decoder([{object_hook, fun({struct, L}) -> {L} end}]))(IoList) catch _Type:Error -> throw({invalid_json, {Error, IoList}}) end. nif_encode(EJson) -> RevList = encode_rev(EJson), final_encode(lists:reverse(lists:flatten([RevList]))). erl_encode(EJson) -> Opts = [{handler, fun mochi_encode_handler/1}], iolist_to_binary((mochijson2:encoder(Opts))(EJson)). mochi_encode_handler({L}) when is_list(L) -> {struct, L}; mochi_encode_handler(Bad) -> exit({json_encode, {bad_term, Bad}}). % Encode the json into a reverse list that's almost an iolist % everything in the list is the final output except for tuples with % {0, Strings} and {1, Floats}, which are to be converted to strings % inside the NIF. encode_rev(true) -> <<"true">>; encode_rev(false) -> <<"false">>; encode_rev(null) -> <<"null">>; encode_rev(I) when is_integer(I) -> list_to_binary(integer_to_list(I)); encode_rev(S) when is_binary(S) -> {0, S}; encode_rev(S) when is_atom(S) -> {0, list_to_binary(atom_to_list(S))}; encode_rev(F) when is_float(F) -> {1, F}; encode_rev({Props}) when is_list(Props) -> encode_proplist_rev(Props, [<<"{">>]); encode_rev(Array) when is_list(Array) -> encode_array_rev(Array, [<<"[">>]); encode_rev(Bad) -> throw({json_encode, {bad_term, Bad}}). encode_array_rev([], Acc) -> [<<"]">> | Acc]; encode_array_rev([Val | Rest], [<<"[">>]) -> encode_array_rev(Rest, [encode_rev(Val), <<"[">>]); encode_array_rev([Val | Rest], Acc) -> encode_array_rev(Rest, [encode_rev(Val), <<",">> | Acc]). encode_proplist_rev([], Acc) -> [<<"}">> | Acc]; encode_proplist_rev([{Key,Val} | Rest], [<<"{">>]) -> encode_proplist_rev( Rest, [encode_rev(Val), <<":">>, {0, as_binary(Key)}, <<"{">>]); encode_proplist_rev([{Key,Val} | Rest], Acc) -> encode_proplist_rev( Rest, [encode_rev(Val), <<":">>, {0, as_binary(Key)}, <<",">> | Acc]). as_binary(B) when is_binary(B) -> B; as_binary(A) when is_atom(A) -> list_to_binary(atom_to_list(A)); as_binary(L) when is_list(L) -> list_to_binary(L). make_ejson([], Stack) -> Stack; make_ejson([0 | RevEvs], [ArrayValues, PrevValues | RestStack]) -> % 0 ArrayStart make_ejson(RevEvs, [[ArrayValues | PrevValues] | RestStack]); make_ejson([1 | RevEvs], Stack) -> % 1 ArrayEnd make_ejson(RevEvs, [[] | Stack]); make_ejson([2 | RevEvs], [ObjValues, PrevValues | RestStack]) -> % 2 ObjectStart make_ejson(RevEvs, [[{ObjValues} | PrevValues] | RestStack]); make_ejson([3 | RevEvs], Stack) -> % 3 ObjectEnd make_ejson(RevEvs, [[] | Stack]); make_ejson([{0, Value} | RevEvs], [Vals | RestStack] = _Stack) -> % {0, IntegerString} make_ejson(RevEvs, [[list_to_integer(binary_to_list(Value)) | Vals] | RestStack]); make_ejson([{1, Value} | RevEvs], [Vals | RestStack] = _Stack) -> % {1, FloatString} make_ejson(RevEvs, [[list_to_float(binary_to_list(Value)) | Vals] | RestStack]); make_ejson([{3, String} | RevEvs], [[PrevValue|RestObject] | RestStack] = _Stack) -> % {3 , ObjectKey} make_ejson(RevEvs, [[{String, PrevValue}|RestObject] | RestStack]); make_ejson([Value | RevEvs], [Vals | RestStack] = _Stack) -> make_ejson(RevEvs, [[Value | Vals] | RestStack]). reverse_tokens(_) -> exit(ejson_nif_not_loaded). final_encode(_) -> exit(ejson_nif_not_loaded). apache-couchdb-1.6.0/src/ejson/ejson.c0000644000175000001440000000121312332105522017502 0ustar00djcusers00000000000000#include "erl_nif.h" ERL_NIF_TERM final_encode(ErlNifEnv* env, int argc, const ERL_NIF_TERM argv[]); ERL_NIF_TERM reverse_tokens(ErlNifEnv* env, int argc, const ERL_NIF_TERM argv[]); int on_load(ErlNifEnv* env, void** priv_data, ERL_NIF_TERM info) { return 0; } int on_reload(ErlNifEnv* env, void** priv_data, ERL_NIF_TERM info) { return 0; } int on_upgrade(ErlNifEnv* env, void** priv_data, void** old_data, ERL_NIF_TERM info) { return 0; } static ErlNifFunc nif_funcs[] = { {"final_encode", 1, final_encode}, {"reverse_tokens", 1, reverse_tokens} }; ERL_NIF_INIT(ejson, nif_funcs, &on_load, &on_reload, &on_upgrade, NULL); apache-couchdb-1.6.0/src/ejson/encode.c0000644000175000001440000001341412332105522017627 0ustar00djcusers00000000000000// Licensed under the Apache License, Version 2.0 (the "License"); you may not // use this file except in compliance with the License. You may obtain a copy of // the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, WITHOUT // WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the // License for the specific language governing permissions and limitations under // the License. #include #include #include #include "erl_nif.h" #include "erl_nif_compat.h" #include "yajl/yajl_encode.h" #if defined(_WIN32) || defined(WIN32) || defined(__WIN32__) #include #define isnan _isnan #define isinf !_finite #define snprintf _snprintf #endif #define SUCCESS 0 #define NOMEM 1 #define BADARG 2 typedef struct { ErlNifEnv* env; ErlNifBinary bin; size_t fill_offset; int error; } encode_ctx; static int ensure_buffer(void* vctx, unsigned int len) { encode_ctx* ctx = (encode_ctx*)vctx; if ((ctx->bin.size - ctx->fill_offset) < len) { if(!enif_realloc_binary_compat(ctx->env, &(ctx->bin), (ctx->bin.size * 2) + len)) { return NOMEM; } } return SUCCESS; } static void fill_buffer(void* vctx, const char* str, unsigned int len) { encode_ctx* ctx = (encode_ctx*)vctx; if (ctx->error || (ctx->error = ensure_buffer(vctx, len))) { return; } memcpy(ctx->bin.data + ctx->fill_offset, str, len); ctx->fill_offset += len; } /* Json encode the string binary into the ctx.bin, with surrounding quotes and all */ static int encode_string(void* vctx, ERL_NIF_TERM binary) { encode_ctx* ctx = (encode_ctx*)vctx; ErlNifBinary bin; if(!enif_inspect_binary(ctx->env, binary, &bin)) { return NOMEM; } fill_buffer(ctx, "\"", 1); if (ctx->error) { return ctx->error; } yajl_string_encode2(fill_buffer, ctx, bin.data, bin.size); fill_buffer(ctx, "\"", 1); return ctx->error; } static ERL_NIF_TERM no_mem_error(ErlNifEnv* env) { return enif_make_tuple(env, 2, enif_make_atom(env, "error"), enif_make_atom(env, "insufficient_memory")); } ERL_NIF_TERM final_encode(ErlNifEnv* env, int argc, const ERL_NIF_TERM argv[]) { ERL_NIF_TERM head = argv[0]; ERL_NIF_TERM term; double number; encode_ctx ctx; char* start; size_t len; size_t i; ctx.env = env; ctx.fill_offset = 0; ctx.error = 0; if (!enif_alloc_binary_compat(env, 100, &ctx.bin)) { return no_mem_error(env); } while(enif_get_list_cell(env, head, &term, &head)) { ErlNifBinary termbin; const ERL_NIF_TERM* array; int arity; int code; // We scan the list, looking for things to write into the binary, or // encode and then write into the binary. We encode values that are // tuples tagged with a type and a value: {Type, Value} where Type // is a an Integer and Value is what is to be encoded if (enif_get_tuple(env, term, &arity, &array)) { // It's a tuple to encode and copy if (arity != 2 || !enif_get_int(env, array[0], &code)) { // not arity 2 or the first element isn't an int ctx.error = BADARG; goto done; } if (code == 0) { // {0, String} if (encode_string(&ctx, array[1]) != SUCCESS) { goto done; } } else { // {1, Double} if(!enif_get_double(env, array[1], &number)) { ctx.error = BADARG; goto done; } // We can't encode these. if (isnan(number) || isinf(number)) { ctx.error = BADARG; goto done; } if ((ctx.error = ensure_buffer(&ctx, 32)) != SUCCESS) { goto done; } // write the string into the buffer start = (char*) (ctx.bin.data + ctx.fill_offset); snprintf(start, 32, "%0.20g", number); len = strlen(start); for(i = 0; i < len; i++) { if(start[i] == '.' || start[i] == 'e' || start[i] == 'E') { break; } } if(i == len) { if(i > 29) { ctx.error = BADARG; goto done; } start[len++] = '.'; start[len++] = '0'; } // increment the length ctx.fill_offset += len; } } else if (enif_inspect_binary(env, term, &termbin)) { // this is a regular binary, copy the contents into the buffer fill_buffer(&ctx, (char*)termbin.data, termbin.size); if (ctx.error) { goto done; } } else { //not a binary, not a tuple, wtf! ctx.error = BADARG; goto done; } } done: if (ctx.error == NOMEM) { enif_release_binary_compat(env, &ctx.bin); return no_mem_error(env); } else if (ctx.error == BADARG) { enif_release_binary_compat(env, &ctx.bin); return enif_make_badarg(env); } // Resize the binary to our exact final size if(!enif_realloc_binary_compat(env, &(ctx.bin), ctx.fill_offset)) { enif_release_binary_compat(env, &ctx.bin); return no_mem_error(env); } // make the binary term which transfers ownership return enif_make_binary(env, &ctx.bin); } apache-couchdb-1.6.0/src/ejson/decode.c0000644000175000001440000001646312332105522017624 0ustar00djcusers00000000000000// Licensed under the Apache License, Version 2.0 (the "License"); you may not // use this file except in compliance with the License. You may obtain a copy of // the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, WITHOUT // WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the // License for the specific language governing permissions and limitations under // the License. #include #include #include #include "erl_nif.h" #include "erl_nif_compat.h" #include "yajl/yajl_parse.h" #include "yajl/yajl_parser.h" #include "yajl/yajl_lex.h" typedef struct { ERL_NIF_TERM head; ErlNifEnv* env; } decode_ctx; #define ENV(ctxarg) (((decode_ctx*)ctxarg)->env) #define CONTINUE 1 #define CANCEL 0 static ERL_NIF_TERM make_error(yajl_handle handle, ErlNifEnv* env) { char* yajlError = (char*) yajl_get_error(handle, 0, NULL, 0); ERL_NIF_TERM errMsg; if(yajlError != NULL) { errMsg = enif_make_string(env, yajlError, ERL_NIF_LATIN1); yajl_free_error(handle, (unsigned char*) yajlError); } else { errMsg = enif_make_string(env, "unknown parse error", ERL_NIF_LATIN1); } return enif_make_tuple(env, 2, enif_make_atom(env, "error"), enif_make_tuple(env, 2, enif_make_uint(env, handle->bytesConsumed), errMsg ) ); } static void add_to_head(void* vctx, ERL_NIF_TERM newhead) { decode_ctx* ctx = (decode_ctx*)vctx; ctx->head = enif_make_list_cell(ctx->env, newhead, ctx->head); } static int decode_null(void* ctx) { add_to_head(ctx, enif_make_atom(ENV(ctx), "null")); return CONTINUE; } static int decode_boolean(void* ctx, int val) { add_to_head(ctx, enif_make_atom(ENV(ctx), val ? "true" : "false")); return CONTINUE; } static int decode_number(void * ctx, const char * numberVal, unsigned int numberLen) { // scan in the input to see if it's a float or int int numberType = 0; // 0 means integer, 1 means float unsigned int i; ErlNifBinary bin; int missingDot = 1; unsigned int expPos; for(i=0; ibytesConsumed; // Parsing something like "2.0" (without quotes) will // cause a spurious semi-error. We add the extra size // check so that "2008-20-10" doesn't pass. if(status == yajl_status_insufficient_data && used == bin.size) { status = yajl_parse_complete(handle); } if(status == yajl_status_ok && used != bin.size) { if(check_rest(bin.data, bin.size, used) == CANCEL) { ret = enif_make_tuple(env, 2, enif_make_atom(env, "error"), enif_make_atom(env, "garbage_after_value") ); goto done; } } switch(status) { case yajl_status_ok: ret = enif_make_tuple(env, 2, enif_make_atom(env, "ok"), ctx.head); goto done; case yajl_status_error: ret = make_error(handle, env); goto done; case yajl_status_insufficient_data: ret = enif_make_tuple(env, 2, enif_make_atom(env, "error"), enif_make_atom(env, "insufficient_data") ); goto done; case yajl_status_client_canceled: /* the only time we do this is when we can't allocate a binary. */ ret = enif_make_tuple(env, 2, enif_make_atom(env, "error"), enif_make_atom(env, "insufficient_memory") ); goto done; default: ret = enif_make_tuple(env, 2, enif_make_atom(env, "error"), enif_make_atom(env, "unknown") ); goto done; } done: if(handle != NULL) yajl_free(handle); return ret; } apache-couchdb-1.6.0/src/ejson/Makefile.am0000644000175000001440000000400212332105522020253 0ustar00djcusers00000000000000## Licensed under the Apache License, Version 2.0 (the "License"); you may not ## use this file except in compliance with the License. You may obtain a copy of ## the License at ## ## http://www.apache.org/licenses/LICENSE-2.0 ## ## Unless required by applicable law or agreed to in writing, software ## distributed under the License is distributed on an "AS IS" BASIS, WITHOUT ## WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the ## License for the specific language governing permissions and limitations under ## the License. AUTOMAKE_OPTIONS = subdir-objects ejsonebindir = $(localerlanglibdir)/ejson-0.1.0/ebin ejsonprivdir = $(localerlanglibdir)/ejson-0.1.0/priv CLEANFILES = \ $(ejsonebin_make_generated_file_list) \ $(ejsonpriv_make_generated_file_list) \ priv/ejson.so EJSON_C_SRCS = \ ejson.c \ decode.c \ encode.c \ yajl/yajl_alloc.c \ yajl/yajl_buf.c \ yajl/yajl.c \ yajl/yajl_encode.c \ yajl/yajl_gen.c \ yajl/yajl_lex.c \ yajl/yajl_parser.c EJSON_C_HDRS = \ erl_nif_compat.h \ yajl/yajl_alloc.h \ yajl/yajl_buf.h \ yajl/yajl_bytestack.h \ yajl/yajl_common.h \ yajl/yajl_encode.h \ yajl/yajl_gen.h \ yajl/yajl_lex.h \ yajl/yajl_parse.h \ yajl/yajl_parser.h ejson_file_collection = \ ejson.app.in \ ejson.erl \ mochijson2.erl \ mochinum.erl ejsonebin_make_generated_file_list = \ ejson.app \ ejson.beam \ mochijson2.beam \ mochinum.beam EXTRA_DIST = \ $(EJSON_C_HDRS) \ $(ejson_file_collection) ejsonebin_DATA = \ $(ejsonebin_make_generated_file_list) if USE_OTP_NIFS ejsonpriv_LTLIBRARIES = ejson.la ejson_la_SOURCES = $(EJSON_C_SRCS) ejson_la_CFLAGS = $(ERLANG_FLAGS) ejson_la_LDFLAGS = -module -avoid-version if WINDOWS ejson_la_LDFLAGS += -no-undefined EJSON_SO_NAME = ejson.dll else EJSON_SO_NAME = ejson.so endif priv/$(EJSON_SO_NAME): ejson.la @mkdir -p ./priv cp .libs/$(EJSON_SO_NAME) $@ all: priv/$(EJSON_SO_NAME) endif %.app: %.app.in cp $< $@ %.beam: %.erl $(ERLC) $(ERLC_FLAGS) $< apache-couchdb-1.6.0/src/ejson/Makefile.in0000644000175000001440000010520012332105552020271 0ustar00djcusers00000000000000# Makefile.in generated by automake 1.11.6 from Makefile.am. # @configure_input@ # Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, # 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011 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__make_dryrun = \ { \ am__dry=no; \ case $$MAKEFLAGS in \ *\\[\ \ ]*) \ echo 'am--echo: ; @echo "AM" OK' | $(MAKE) -f - 2>/dev/null \ | grep '^AM OK$$' >/dev/null || am__dry=yes;; \ *) \ for am__flg in $$MAKEFLAGS; do \ case $$am__flg in \ *=*|--*) ;; \ *n*) am__dry=yes; break;; \ esac; \ done;; \ esac; \ test $$am__dry = yes; \ } 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@ @USE_OTP_NIFS_TRUE@@WINDOWS_TRUE@am__append_1 = -no-undefined subdir = src/ejson DIST_COMMON = $(srcdir)/Makefile.am $(srcdir)/Makefile.in ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 am__aclocal_m4_deps = $(top_srcdir)/m4/libtool.m4 \ $(top_srcdir)/m4/ltoptions.m4 $(top_srcdir)/m4/ltsugar.m4 \ $(top_srcdir)/m4/ltversion.m4 $(top_srcdir)/m4/lt~obsolete.m4 \ $(top_srcdir)/acinclude.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 \ $(top_builddir)/src/snappy/google-snappy/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)$(ejsonprivdir)" \ "$(DESTDIR)$(ejsonebindir)" LTLIBRARIES = $(ejsonpriv_LTLIBRARIES) ejson_la_LIBADD = am__ejson_la_SOURCES_DIST = ejson.c decode.c encode.c \ yajl/yajl_alloc.c yajl/yajl_buf.c yajl/yajl.c \ yajl/yajl_encode.c yajl/yajl_gen.c yajl/yajl_lex.c \ yajl/yajl_parser.c am__dirstamp = $(am__leading_dot)dirstamp am__objects_1 = ejson_la-ejson.lo ejson_la-decode.lo \ ejson_la-encode.lo yajl/ejson_la-yajl_alloc.lo \ yajl/ejson_la-yajl_buf.lo yajl/ejson_la-yajl.lo \ yajl/ejson_la-yajl_encode.lo yajl/ejson_la-yajl_gen.lo \ yajl/ejson_la-yajl_lex.lo yajl/ejson_la-yajl_parser.lo @USE_OTP_NIFS_TRUE@am_ejson_la_OBJECTS = $(am__objects_1) ejson_la_OBJECTS = $(am_ejson_la_OBJECTS) ejson_la_LINK = $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) \ --mode=link $(CCLD) $(ejson_la_CFLAGS) $(CFLAGS) \ $(ejson_la_LDFLAGS) $(LDFLAGS) -o $@ @USE_OTP_NIFS_TRUE@am_ejson_la_rpath = -rpath $(ejsonprivdir) DEFAULT_INCLUDES = -I.@am__isrc@ -I$(top_builddir) -I$(top_builddir)/src/snappy/google-snappy depcomp = $(SHELL) $(top_srcdir)/build-aux/depcomp am__depfiles_maybe = depfiles am__mv = mv -f COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \ $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) LTCOMPILE = $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) \ --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) \ $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) CCLD = $(CC) LINK = $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) \ --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) $(AM_LDFLAGS) \ $(LDFLAGS) -o $@ SOURCES = $(ejson_la_SOURCES) DIST_SOURCES = $(am__ejson_la_SOURCES_DIST) am__can_run_installinfo = \ case $$AM_UPDATE_INFO_DIR in \ n|no|NO) false;; \ *) (install-info --version) >/dev/null 2>&1;; \ esac DATA = $(ejsonebin_DATA) ETAGS = etags CTAGS = ctags DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) ACLOCAL = @ACLOCAL@ AMTAR = @AMTAR@ AR = @AR@ AS = @AS@ AUTOCONF = @AUTOCONF@ AUTOHEADER = @AUTOHEADER@ AUTOMAKE = @AUTOMAKE@ AWK = @AWK@ CC = @CC@ CCDEPMODE = @CCDEPMODE@ CFLAGS = @CFLAGS@ CPP = @CPP@ CPPFLAGS = @CPPFLAGS@ CURL_CFLAGS = @CURL_CFLAGS@ CURL_CONFIG = @CURL_CONFIG@ CURL_LIBS = @CURL_LIBS@ CXX = @CXX@ CXXCPP = @CXXCPP@ CXXDEPMODE = @CXXDEPMODE@ CXXFLAGS = @CXXFLAGS@ CYGPATH_W = @CYGPATH_W@ DEFS = @DEFS@ DEPDIR = @DEPDIR@ DLLTOOL = @DLLTOOL@ DSYMUTIL = @DSYMUTIL@ DUMPBIN = @DUMPBIN@ ECHO_C = @ECHO_C@ ECHO_N = @ECHO_N@ ECHO_T = @ECHO_T@ EGREP = @EGREP@ ERL = @ERL@ ERLANG_FLAGS = @ERLANG_FLAGS@ ERLC = @ERLC@ ERLC_FLAGS = @ERLC_FLAGS@ ESCRIPT = @ESCRIPT@ EXEEXT = @EXEEXT@ FGREP = @FGREP@ FLAGS = @FLAGS@ GREP = @GREP@ HAS_HELP2MAN = @HAS_HELP2MAN@ HAS_INSTALLINFO = @HAS_INSTALLINFO@ HAS_MAKEINFO = @HAS_MAKEINFO@ HAS_PDFLATEX = @HAS_PDFLATEX@ HAS_SPHINX_BUILD = @HAS_SPHINX_BUILD@ ICU_BIN = @ICU_BIN@ ICU_CFLAGS = @ICU_CFLAGS@ ICU_CONFIG = @ICU_CONFIG@ ICU_CPPFLAGS = @ICU_CPPFLAGS@ ICU_CXXFLAGS = @ICU_CXXFLAGS@ ICU_LIBS = @ICU_LIBS@ INNO_COMPILER_EXECUTABLE = @INNO_COMPILER_EXECUTABLE@ INSTALL = @INSTALL@ INSTALL_DATA = @INSTALL_DATA@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ INSTALL_SCRIPT = @INSTALL_SCRIPT@ INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ JS_CFLAGS = @JS_CFLAGS@ JS_LIBS = @JS_LIBS@ JS_LIB_BINARY = @JS_LIB_BINARY@ LD = @LD@ LDFLAGS = @LDFLAGS@ LIBOBJS = @LIBOBJS@ LIBS = @LIBS@ LIBTOOL = @LIBTOOL@ LIPO = @LIPO@ LN_S = @LN_S@ LTLIBOBJS = @LTLIBOBJS@ MAKEINFO = @MAKEINFO@ MANIFEST_TOOL = @MANIFEST_TOOL@ MKDIR_P = @MKDIR_P@ NM = @NM@ NMEDIT = @NMEDIT@ OBJDUMP = @OBJDUMP@ OBJEXT = @OBJEXT@ OTOOL = @OTOOL@ OTOOL64 = @OTOOL64@ PACKAGE = @PACKAGE@ PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ PACKAGE_NAME = @PACKAGE_NAME@ PACKAGE_STRING = @PACKAGE_STRING@ PACKAGE_TARNAME = @PACKAGE_TARNAME@ PACKAGE_URL = @PACKAGE_URL@ PACKAGE_VERSION = @PACKAGE_VERSION@ PATH_SEPARATOR = @PATH_SEPARATOR@ PKG_CONFIG = @PKG_CONFIG@ PKG_CONFIG_LIBDIR = @PKG_CONFIG_LIBDIR@ PKG_CONFIG_PATH = @PKG_CONFIG_PATH@ RANLIB = @RANLIB@ SED = @SED@ SET_MAKE = @SET_MAKE@ SHELL = @SHELL@ SNAPPY_MAJOR = @SNAPPY_MAJOR@ SNAPPY_MINOR = @SNAPPY_MINOR@ SNAPPY_PATCHLEVEL = @SNAPPY_PATCHLEVEL@ STRIP = @STRIP@ VERSION = @VERSION@ 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@ ac_cv_have_stddef_h = @ac_cv_have_stddef_h@ ac_cv_have_stdint_h = @ac_cv_have_stdint_h@ am__include = @am__include@ am__leading_dot = @am__leading_dot@ am__quote = @am__quote@ am__tar = @am__tar@ am__untar = @am__untar@ bindir = @bindir@ bug_uri = @bug_uri@ 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@ dvidir = @dvidir@ erlangbin = @erlangbin@ erlangversion = @erlangversion@ exec_prefix = @exec_prefix@ host = @host@ host_alias = @host_alias@ host_cpu = @host_cpu@ host_os = @host_os@ host_vendor = @host_vendor@ htmldir = @htmldir@ includedir = @includedir@ infodir = @infodir@ initdir = @initdir@ install_sh = @install_sh@ launchddir = @launchddir@ libdir = @libdir@ libexecdir = @libexecdir@ localconfdir = @localconfdir@ localdatadir = @localdatadir@ localdocdir = @localdocdir@ localedir = @localedir@ localerlanglibdir = @localerlanglibdir@ locallibbindir = @locallibbindir@ locallibdir = @locallibdir@ localstatedir = @localstatedir@ localstatelibdir = @localstatelibdir@ localstatelogdir = @localstatelogdir@ localstaterundir = @localstaterundir@ mandir = @mandir@ mkdir_p = @mkdir_p@ msvc_redist_dir = @msvc_redist_dir@ msvc_redist_name = @msvc_redist_name@ oldincludedir = @oldincludedir@ openssl_bin_dir = @openssl_bin_dir@ otp_release = @otp_release@ package_author_address = @package_author_address@ package_author_name = @package_author_name@ package_identifier = @package_identifier@ package_name = @package_name@ package_tarname = @package_tarname@ 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@ version = @version@ version_major = @version_major@ version_minor = @version_minor@ version_release = @version_release@ version_revision = @version_revision@ version_stage = @version_stage@ AUTOMAKE_OPTIONS = subdir-objects ejsonebindir = $(localerlanglibdir)/ejson-0.1.0/ebin ejsonprivdir = $(localerlanglibdir)/ejson-0.1.0/priv CLEANFILES = \ $(ejsonebin_make_generated_file_list) \ $(ejsonpriv_make_generated_file_list) \ priv/ejson.so EJSON_C_SRCS = \ ejson.c \ decode.c \ encode.c \ yajl/yajl_alloc.c \ yajl/yajl_buf.c \ yajl/yajl.c \ yajl/yajl_encode.c \ yajl/yajl_gen.c \ yajl/yajl_lex.c \ yajl/yajl_parser.c EJSON_C_HDRS = \ erl_nif_compat.h \ yajl/yajl_alloc.h \ yajl/yajl_buf.h \ yajl/yajl_bytestack.h \ yajl/yajl_common.h \ yajl/yajl_encode.h \ yajl/yajl_gen.h \ yajl/yajl_lex.h \ yajl/yajl_parse.h \ yajl/yajl_parser.h ejson_file_collection = \ ejson.app.in \ ejson.erl \ mochijson2.erl \ mochinum.erl ejsonebin_make_generated_file_list = \ ejson.app \ ejson.beam \ mochijson2.beam \ mochinum.beam EXTRA_DIST = \ $(EJSON_C_HDRS) \ $(ejson_file_collection) ejsonebin_DATA = \ $(ejsonebin_make_generated_file_list) @USE_OTP_NIFS_TRUE@ejsonpriv_LTLIBRARIES = ejson.la @USE_OTP_NIFS_TRUE@ejson_la_SOURCES = $(EJSON_C_SRCS) @USE_OTP_NIFS_TRUE@ejson_la_CFLAGS = $(ERLANG_FLAGS) @USE_OTP_NIFS_TRUE@ejson_la_LDFLAGS = -module -avoid-version \ @USE_OTP_NIFS_TRUE@ $(am__append_1) @USE_OTP_NIFS_TRUE@@WINDOWS_FALSE@EJSON_SO_NAME = ejson.so @USE_OTP_NIFS_TRUE@@WINDOWS_TRUE@EJSON_SO_NAME = ejson.dll 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) --foreign src/ejson/Makefile'; \ $(am__cd) $(top_srcdir) && \ $(AUTOMAKE) --foreign src/ejson/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-ejsonprivLTLIBRARIES: $(ejsonpriv_LTLIBRARIES) @$(NORMAL_INSTALL) @list='$(ejsonpriv_LTLIBRARIES)'; test -n "$(ejsonprivdir)" || 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)$(ejsonprivdir)'"; \ $(MKDIR_P) "$(DESTDIR)$(ejsonprivdir)" || exit 1; \ echo " $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=install $(INSTALL) $(INSTALL_STRIP_FLAG) $$list2 '$(DESTDIR)$(ejsonprivdir)'"; \ $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=install $(INSTALL) $(INSTALL_STRIP_FLAG) $$list2 "$(DESTDIR)$(ejsonprivdir)"; \ } uninstall-ejsonprivLTLIBRARIES: @$(NORMAL_UNINSTALL) @list='$(ejsonpriv_LTLIBRARIES)'; test -n "$(ejsonprivdir)" || list=; \ for p in $$list; do \ $(am__strip_dir) \ echo " $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=uninstall rm -f '$(DESTDIR)$(ejsonprivdir)/$$f'"; \ $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=uninstall rm -f "$(DESTDIR)$(ejsonprivdir)/$$f"; \ done clean-ejsonprivLTLIBRARIES: -test -z "$(ejsonpriv_LTLIBRARIES)" || rm -f $(ejsonpriv_LTLIBRARIES) @list='$(ejsonpriv_LTLIBRARIES)'; for p in $$list; do \ dir="`echo $$p | sed -e 's|/[^/]*$$||'`"; \ test "$$dir" != "$$p" || dir=.; \ echo "rm -f \"$${dir}/so_locations\""; \ rm -f "$${dir}/so_locations"; \ done yajl/$(am__dirstamp): @$(MKDIR_P) yajl @: > yajl/$(am__dirstamp) yajl/$(DEPDIR)/$(am__dirstamp): @$(MKDIR_P) yajl/$(DEPDIR) @: > yajl/$(DEPDIR)/$(am__dirstamp) yajl/ejson_la-yajl_alloc.lo: yajl/$(am__dirstamp) \ yajl/$(DEPDIR)/$(am__dirstamp) yajl/ejson_la-yajl_buf.lo: yajl/$(am__dirstamp) \ yajl/$(DEPDIR)/$(am__dirstamp) yajl/ejson_la-yajl.lo: yajl/$(am__dirstamp) \ yajl/$(DEPDIR)/$(am__dirstamp) yajl/ejson_la-yajl_encode.lo: yajl/$(am__dirstamp) \ yajl/$(DEPDIR)/$(am__dirstamp) yajl/ejson_la-yajl_gen.lo: yajl/$(am__dirstamp) \ yajl/$(DEPDIR)/$(am__dirstamp) yajl/ejson_la-yajl_lex.lo: yajl/$(am__dirstamp) \ yajl/$(DEPDIR)/$(am__dirstamp) yajl/ejson_la-yajl_parser.lo: yajl/$(am__dirstamp) \ yajl/$(DEPDIR)/$(am__dirstamp) ejson.la: $(ejson_la_OBJECTS) $(ejson_la_DEPENDENCIES) $(EXTRA_ejson_la_DEPENDENCIES) $(ejson_la_LINK) $(am_ejson_la_rpath) $(ejson_la_OBJECTS) $(ejson_la_LIBADD) $(LIBS) mostlyclean-compile: -rm -f *.$(OBJEXT) -rm -f yajl/ejson_la-yajl.$(OBJEXT) -rm -f yajl/ejson_la-yajl.lo -rm -f yajl/ejson_la-yajl_alloc.$(OBJEXT) -rm -f yajl/ejson_la-yajl_alloc.lo -rm -f yajl/ejson_la-yajl_buf.$(OBJEXT) -rm -f yajl/ejson_la-yajl_buf.lo -rm -f yajl/ejson_la-yajl_encode.$(OBJEXT) -rm -f yajl/ejson_la-yajl_encode.lo -rm -f yajl/ejson_la-yajl_gen.$(OBJEXT) -rm -f yajl/ejson_la-yajl_gen.lo -rm -f yajl/ejson_la-yajl_lex.$(OBJEXT) -rm -f yajl/ejson_la-yajl_lex.lo -rm -f yajl/ejson_la-yajl_parser.$(OBJEXT) -rm -f yajl/ejson_la-yajl_parser.lo distclean-compile: -rm -f *.tab.c @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ejson_la-decode.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ejson_la-ejson.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ejson_la-encode.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@yajl/$(DEPDIR)/ejson_la-yajl.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@yajl/$(DEPDIR)/ejson_la-yajl_alloc.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@yajl/$(DEPDIR)/ejson_la-yajl_buf.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@yajl/$(DEPDIR)/ejson_la-yajl_encode.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@yajl/$(DEPDIR)/ejson_la-yajl_gen.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@yajl/$(DEPDIR)/ejson_la-yajl_lex.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@yajl/$(DEPDIR)/ejson_la-yajl_parser.Plo@am__quote@ .c.o: @am__fastdepCC_TRUE@ depbase=`echo $@ | sed 's|[^/]*$$|$(DEPDIR)/&|;s|\.o$$||'`;\ @am__fastdepCC_TRUE@ $(COMPILE) -MT $@ -MD -MP -MF $$depbase.Tpo -c -o $@ $< &&\ @am__fastdepCC_TRUE@ $(am__mv) $$depbase.Tpo $$depbase.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(COMPILE) -c -o $@ $< .c.obj: @am__fastdepCC_TRUE@ depbase=`echo $@ | sed 's|[^/]*$$|$(DEPDIR)/&|;s|\.obj$$||'`;\ @am__fastdepCC_TRUE@ $(COMPILE) -MT $@ -MD -MP -MF $$depbase.Tpo -c -o $@ `$(CYGPATH_W) '$<'` &&\ @am__fastdepCC_TRUE@ $(am__mv) $$depbase.Tpo $$depbase.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(COMPILE) -c -o $@ `$(CYGPATH_W) '$<'` .c.lo: @am__fastdepCC_TRUE@ depbase=`echo $@ | sed 's|[^/]*$$|$(DEPDIR)/&|;s|\.lo$$||'`;\ @am__fastdepCC_TRUE@ $(LTCOMPILE) -MT $@ -MD -MP -MF $$depbase.Tpo -c -o $@ $< &&\ @am__fastdepCC_TRUE@ $(am__mv) $$depbase.Tpo $$depbase.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(LTCOMPILE) -c -o $@ $< ejson_la-ejson.lo: ejson.c @am__fastdepCC_TRUE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(ejson_la_CFLAGS) $(CFLAGS) -MT ejson_la-ejson.lo -MD -MP -MF $(DEPDIR)/ejson_la-ejson.Tpo -c -o ejson_la-ejson.lo `test -f 'ejson.c' || echo '$(srcdir)/'`ejson.c @am__fastdepCC_TRUE@ $(am__mv) $(DEPDIR)/ejson_la-ejson.Tpo $(DEPDIR)/ejson_la-ejson.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ source='ejson.c' object='ejson_la-ejson.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(ejson_la_CFLAGS) $(CFLAGS) -c -o ejson_la-ejson.lo `test -f 'ejson.c' || echo '$(srcdir)/'`ejson.c ejson_la-decode.lo: decode.c @am__fastdepCC_TRUE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(ejson_la_CFLAGS) $(CFLAGS) -MT ejson_la-decode.lo -MD -MP -MF $(DEPDIR)/ejson_la-decode.Tpo -c -o ejson_la-decode.lo `test -f 'decode.c' || echo '$(srcdir)/'`decode.c @am__fastdepCC_TRUE@ $(am__mv) $(DEPDIR)/ejson_la-decode.Tpo $(DEPDIR)/ejson_la-decode.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ source='decode.c' object='ejson_la-decode.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(ejson_la_CFLAGS) $(CFLAGS) -c -o ejson_la-decode.lo `test -f 'decode.c' || echo '$(srcdir)/'`decode.c ejson_la-encode.lo: encode.c @am__fastdepCC_TRUE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(ejson_la_CFLAGS) $(CFLAGS) -MT ejson_la-encode.lo -MD -MP -MF $(DEPDIR)/ejson_la-encode.Tpo -c -o ejson_la-encode.lo `test -f 'encode.c' || echo '$(srcdir)/'`encode.c @am__fastdepCC_TRUE@ $(am__mv) $(DEPDIR)/ejson_la-encode.Tpo $(DEPDIR)/ejson_la-encode.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ source='encode.c' object='ejson_la-encode.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(ejson_la_CFLAGS) $(CFLAGS) -c -o ejson_la-encode.lo `test -f 'encode.c' || echo '$(srcdir)/'`encode.c yajl/ejson_la-yajl_alloc.lo: yajl/yajl_alloc.c @am__fastdepCC_TRUE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(ejson_la_CFLAGS) $(CFLAGS) -MT yajl/ejson_la-yajl_alloc.lo -MD -MP -MF yajl/$(DEPDIR)/ejson_la-yajl_alloc.Tpo -c -o yajl/ejson_la-yajl_alloc.lo `test -f 'yajl/yajl_alloc.c' || echo '$(srcdir)/'`yajl/yajl_alloc.c @am__fastdepCC_TRUE@ $(am__mv) yajl/$(DEPDIR)/ejson_la-yajl_alloc.Tpo yajl/$(DEPDIR)/ejson_la-yajl_alloc.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ source='yajl/yajl_alloc.c' object='yajl/ejson_la-yajl_alloc.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(ejson_la_CFLAGS) $(CFLAGS) -c -o yajl/ejson_la-yajl_alloc.lo `test -f 'yajl/yajl_alloc.c' || echo '$(srcdir)/'`yajl/yajl_alloc.c yajl/ejson_la-yajl_buf.lo: yajl/yajl_buf.c @am__fastdepCC_TRUE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(ejson_la_CFLAGS) $(CFLAGS) -MT yajl/ejson_la-yajl_buf.lo -MD -MP -MF yajl/$(DEPDIR)/ejson_la-yajl_buf.Tpo -c -o yajl/ejson_la-yajl_buf.lo `test -f 'yajl/yajl_buf.c' || echo '$(srcdir)/'`yajl/yajl_buf.c @am__fastdepCC_TRUE@ $(am__mv) yajl/$(DEPDIR)/ejson_la-yajl_buf.Tpo yajl/$(DEPDIR)/ejson_la-yajl_buf.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ source='yajl/yajl_buf.c' object='yajl/ejson_la-yajl_buf.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(ejson_la_CFLAGS) $(CFLAGS) -c -o yajl/ejson_la-yajl_buf.lo `test -f 'yajl/yajl_buf.c' || echo '$(srcdir)/'`yajl/yajl_buf.c yajl/ejson_la-yajl.lo: yajl/yajl.c @am__fastdepCC_TRUE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(ejson_la_CFLAGS) $(CFLAGS) -MT yajl/ejson_la-yajl.lo -MD -MP -MF yajl/$(DEPDIR)/ejson_la-yajl.Tpo -c -o yajl/ejson_la-yajl.lo `test -f 'yajl/yajl.c' || echo '$(srcdir)/'`yajl/yajl.c @am__fastdepCC_TRUE@ $(am__mv) yajl/$(DEPDIR)/ejson_la-yajl.Tpo yajl/$(DEPDIR)/ejson_la-yajl.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ source='yajl/yajl.c' object='yajl/ejson_la-yajl.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(ejson_la_CFLAGS) $(CFLAGS) -c -o yajl/ejson_la-yajl.lo `test -f 'yajl/yajl.c' || echo '$(srcdir)/'`yajl/yajl.c yajl/ejson_la-yajl_encode.lo: yajl/yajl_encode.c @am__fastdepCC_TRUE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(ejson_la_CFLAGS) $(CFLAGS) -MT yajl/ejson_la-yajl_encode.lo -MD -MP -MF yajl/$(DEPDIR)/ejson_la-yajl_encode.Tpo -c -o yajl/ejson_la-yajl_encode.lo `test -f 'yajl/yajl_encode.c' || echo '$(srcdir)/'`yajl/yajl_encode.c @am__fastdepCC_TRUE@ $(am__mv) yajl/$(DEPDIR)/ejson_la-yajl_encode.Tpo yajl/$(DEPDIR)/ejson_la-yajl_encode.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ source='yajl/yajl_encode.c' object='yajl/ejson_la-yajl_encode.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(ejson_la_CFLAGS) $(CFLAGS) -c -o yajl/ejson_la-yajl_encode.lo `test -f 'yajl/yajl_encode.c' || echo '$(srcdir)/'`yajl/yajl_encode.c yajl/ejson_la-yajl_gen.lo: yajl/yajl_gen.c @am__fastdepCC_TRUE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(ejson_la_CFLAGS) $(CFLAGS) -MT yajl/ejson_la-yajl_gen.lo -MD -MP -MF yajl/$(DEPDIR)/ejson_la-yajl_gen.Tpo -c -o yajl/ejson_la-yajl_gen.lo `test -f 'yajl/yajl_gen.c' || echo '$(srcdir)/'`yajl/yajl_gen.c @am__fastdepCC_TRUE@ $(am__mv) yajl/$(DEPDIR)/ejson_la-yajl_gen.Tpo yajl/$(DEPDIR)/ejson_la-yajl_gen.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ source='yajl/yajl_gen.c' object='yajl/ejson_la-yajl_gen.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(ejson_la_CFLAGS) $(CFLAGS) -c -o yajl/ejson_la-yajl_gen.lo `test -f 'yajl/yajl_gen.c' || echo '$(srcdir)/'`yajl/yajl_gen.c yajl/ejson_la-yajl_lex.lo: yajl/yajl_lex.c @am__fastdepCC_TRUE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(ejson_la_CFLAGS) $(CFLAGS) -MT yajl/ejson_la-yajl_lex.lo -MD -MP -MF yajl/$(DEPDIR)/ejson_la-yajl_lex.Tpo -c -o yajl/ejson_la-yajl_lex.lo `test -f 'yajl/yajl_lex.c' || echo '$(srcdir)/'`yajl/yajl_lex.c @am__fastdepCC_TRUE@ $(am__mv) yajl/$(DEPDIR)/ejson_la-yajl_lex.Tpo yajl/$(DEPDIR)/ejson_la-yajl_lex.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ source='yajl/yajl_lex.c' object='yajl/ejson_la-yajl_lex.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(ejson_la_CFLAGS) $(CFLAGS) -c -o yajl/ejson_la-yajl_lex.lo `test -f 'yajl/yajl_lex.c' || echo '$(srcdir)/'`yajl/yajl_lex.c yajl/ejson_la-yajl_parser.lo: yajl/yajl_parser.c @am__fastdepCC_TRUE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(ejson_la_CFLAGS) $(CFLAGS) -MT yajl/ejson_la-yajl_parser.lo -MD -MP -MF yajl/$(DEPDIR)/ejson_la-yajl_parser.Tpo -c -o yajl/ejson_la-yajl_parser.lo `test -f 'yajl/yajl_parser.c' || echo '$(srcdir)/'`yajl/yajl_parser.c @am__fastdepCC_TRUE@ $(am__mv) yajl/$(DEPDIR)/ejson_la-yajl_parser.Tpo yajl/$(DEPDIR)/ejson_la-yajl_parser.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ source='yajl/yajl_parser.c' object='yajl/ejson_la-yajl_parser.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(ejson_la_CFLAGS) $(CFLAGS) -c -o yajl/ejson_la-yajl_parser.lo `test -f 'yajl/yajl_parser.c' || echo '$(srcdir)/'`yajl/yajl_parser.c mostlyclean-libtool: -rm -f *.lo clean-libtool: -rm -rf .libs _libs -rm -rf yajl/.libs yajl/_libs install-ejsonebinDATA: $(ejsonebin_DATA) @$(NORMAL_INSTALL) @list='$(ejsonebin_DATA)'; test -n "$(ejsonebindir)" || list=; \ if test -n "$$list"; then \ echo " $(MKDIR_P) '$(DESTDIR)$(ejsonebindir)'"; \ $(MKDIR_P) "$(DESTDIR)$(ejsonebindir)" || 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)$(ejsonebindir)'"; \ $(INSTALL_DATA) $$files "$(DESTDIR)$(ejsonebindir)" || exit $$?; \ done uninstall-ejsonebinDATA: @$(NORMAL_UNINSTALL) @list='$(ejsonebin_DATA)'; test -n "$(ejsonebindir)" || list=; \ files=`for p in $$list; do echo $$p; done | sed -e 's|^.*/||'`; \ dir='$(DESTDIR)$(ejsonebindir)'; $(am__uninstall_files_from_dir) ID: $(HEADERS) $(SOURCES) $(LISP) $(TAGS_FILES) list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | \ $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ END { if (nonempty) { for (i in files) print i; }; }'`; \ mkid -fID $$unique tags: TAGS TAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ $(TAGS_FILES) $(LISP) set x; \ here=`pwd`; \ list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | \ $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ END { if (nonempty) { for (i in files) print i; }; }'`; \ 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 CTAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ $(TAGS_FILES) $(LISP) list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | \ $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ END { if (nonempty) { for (i in files) print i; }; }'`; \ 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" 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) installdirs: for dir in "$(DESTDIR)$(ejsonprivdir)" "$(DESTDIR)$(ejsonebindir)"; 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) -rm -f yajl/$(DEPDIR)/$(am__dirstamp) -rm -f yajl/$(am__dirstamp) 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-ejsonprivLTLIBRARIES clean-generic clean-libtool \ mostlyclean-am distclean: distclean-am -rm -rf ./$(DEPDIR) yajl/$(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-ejsonebinDATA install-ejsonprivLTLIBRARIES 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) yajl/$(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-ejsonebinDATA uninstall-ejsonprivLTLIBRARIES .MAKE: install-am install-strip .PHONY: CTAGS GTAGS all all-am check check-am clean \ clean-ejsonprivLTLIBRARIES clean-generic clean-libtool ctags \ 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-ejsonebinDATA install-ejsonprivLTLIBRARIES \ 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 uninstall uninstall-am uninstall-ejsonebinDATA \ uninstall-ejsonprivLTLIBRARIES @USE_OTP_NIFS_TRUE@priv/$(EJSON_SO_NAME): ejson.la @USE_OTP_NIFS_TRUE@ @mkdir -p ./priv @USE_OTP_NIFS_TRUE@ cp .libs/$(EJSON_SO_NAME) $@ @USE_OTP_NIFS_TRUE@all: priv/$(EJSON_SO_NAME) %.app: %.app.in cp $< $@ %.beam: %.erl $(ERLC) $(ERLC_FLAGS) $< # 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: apache-couchdb-1.6.0/src/ejson/erl_nif_compat.h0000644000175000001440000000657012332105522021365 0ustar00djcusers00000000000000/* Copyright (c) 2010-2011 Basho Technologies, Inc. * With some minor modifications for Apache CouchDB. * * This file is provided to you under the Apache License, * Version 2.0 (the "License"); you may not use this file * except in compliance with the License. You may obtain * a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, * software distributed under the License is distributed on an * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY * KIND, either express or implied. See the License for the * specific language governing permissions and limitations * under the License. */ #ifndef ERL_NIF_COMPAT_H_ #define ERL_NIF_COMPAT_H_ #ifdef __cplusplus extern "C" { #endif /* __cplusplus */ #include "erl_nif.h" #if ERL_NIF_MAJOR_VERSION == 0 && ERL_NIF_MINOR_VERSION == 1 #define OTP_R13B03 #elif ERL_NIF_MAJOR_VERSION == 1 && ERL_NIF_MINOR_VERSION == 0 #define OTP_R13B04 #elif ERL_NIF_MAJOR_VERSION == 2 && ERL_NIF_MINOR_VERSION == 0 #define OTP_R14A #define OTP_R14B #define OTP_R14B01 #elif ERL_NIF_MAJOR_VERSION == 2 && ERL_NIF_MINOR_VERSION == 1 #define OTP_R14B02 #endif #ifdef OTP_R13B03 #define enif_open_resource_type_compat enif_open_resource_type #define enif_alloc_resource_compat enif_alloc_resource #define enif_release_resource_compat enif_release_resource #define enif_alloc_binary_compat enif_alloc_binary #define enif_alloc_compat enif_alloc #define enif_release_binary_compat enif_release_binary #define enif_free_compat enif_free #define enif_get_atom_compat enif_get_atom #define enif_priv_data_compat enif_get_data #define enif_make_uint_compat enif_make_ulong #define enif_make_string_compat(E, B, Enc) \ enif_make_string(E, B) #endif /* R13B03 */ #ifdef OTP_R13B04 #define enif_open_resource_type_compat enif_open_resource_type #define enif_alloc_resource_compat enif_alloc_resource #define enif_release_resource_compat enif_release_resource #define enif_alloc_binary_compat enif_alloc_binary #define enif_realloc_binary_compat enif_realloc_binary #define enif_release_binary_compat enif_release_binary #define enif_alloc_compat enif_alloc #define enif_free_compat enif_free #define enif_get_atom_compat enif_get_atom #define enif_priv_data_compat enif_priv_data #define enif_make_string_compat enif_make_string #define enif_make_uint_compat enif_make_uint #endif /* R13B04 */ /* OTP R14 and future releases */ #if !defined(OTP_R13B03) && !defined(OTP_R13B04) #define enif_open_resource_type_compat(E, N, D, F, T) \ enif_open_resource_type(E, NULL, N, D, F, T) #define enif_alloc_resource_compat(E, T, S) \ enif_alloc_resource(T, S) #define enif_release_resource_compat(E, H) \ enif_release_resource(H) #define enif_alloc_binary_compat(E, S, B) \ enif_alloc_binary(S, B) #define enif_realloc_binary_compat(E, S, B) \ enif_realloc_binary(S, B) #define enif_release_binary_compat(E, B) \ enif_release_binary(B) #define enif_alloc_compat(E, S) \ enif_alloc(S) #define enif_free_compat(E, P) \ enif_free(P) #define enif_get_atom_compat(E, T, B, S) \ enif_get_atom(E, T, B, S, ERL_NIF_LATIN1) #define enif_priv_data_compat enif_priv_data #define enif_make_string_compat enif_make_string #define enif_make_uint_compat enif_make_uint #endif /* R14 and future releases */ #ifdef __cplusplus } #endif /* __cplusplus */ #endif /* ERL_NIF_COMPAT_H_ */ apache-couchdb-1.6.0/src/ejson/ejson.app.in0000644000175000001440000000033612332105522020452 0ustar00djcusers00000000000000{application, ejson, [ {description, "EJSON - decode and encode JSON into/from Erlang terms"}, {vsn, "0.1.0"}, {modules, [ejson]}, {registered, []}, {applications, [kernel, stdlib]}, {env, []} ]}. apache-couchdb-1.6.0/src/ejson/mochinum.erl0000644000175000001440000002441312332105522020552 0ustar00djcusers00000000000000%% @copyright 2007 Mochi Media, Inc. %% @author Bob Ippolito %% @doc Useful numeric algorithms for floats that cover some deficiencies %% in the math module. More interesting is digits/1, which implements %% the algorithm from: %% http://www.cs.indiana.edu/~burger/fp/index.html %% See also "Printing Floating-Point Numbers Quickly and Accurately" %% in Proceedings of the SIGPLAN '96 Conference on Programming Language %% Design and Implementation. -module(mochinum). -author("Bob Ippolito "). -export([digits/1, frexp/1, int_pow/2, int_ceil/1]). %% IEEE 754 Float exponent bias -define(FLOAT_BIAS, 1022). -define(MIN_EXP, -1074). -define(BIG_POW, 4503599627370496). %% External API %% @spec digits(number()) -> string() %% @doc Returns a string that accurately represents the given integer or float %% using a conservative amount of digits. Great for generating %% human-readable output, or compact ASCII serializations for floats. digits(N) when is_integer(N) -> integer_to_list(N); digits(0.0) -> "0.0"; digits(Float) -> {Frac1, Exp1} = frexp_int(Float), [Place0 | Digits0] = digits1(Float, Exp1, Frac1), {Place, Digits} = transform_digits(Place0, Digits0), R = insert_decimal(Place, Digits), case Float < 0 of true -> [$- | R]; _ -> R end. %% @spec frexp(F::float()) -> {Frac::float(), Exp::float()} %% @doc Return the fractional and exponent part of an IEEE 754 double, %% equivalent to the libc function of the same name. %% F = Frac * pow(2, Exp). frexp(F) -> frexp1(unpack(F)). %% @spec int_pow(X::integer(), N::integer()) -> Y::integer() %% @doc Moderately efficient way to exponentiate integers. %% int_pow(10, 2) = 100. int_pow(_X, 0) -> 1; int_pow(X, N) when N > 0 -> int_pow(X, N, 1). %% @spec int_ceil(F::float()) -> integer() %% @doc Return the ceiling of F as an integer. The ceiling is defined as %% F when F == trunc(F); %% trunc(F) when F < 0; %% trunc(F) + 1 when F > 0. int_ceil(X) -> T = trunc(X), case (X - T) of Pos when Pos > 0 -> T + 1; _ -> T end. %% Internal API int_pow(X, N, R) when N < 2 -> R * X; int_pow(X, N, R) -> int_pow(X * X, N bsr 1, case N band 1 of 1 -> R * X; 0 -> R end). insert_decimal(0, S) -> "0." ++ S; insert_decimal(Place, S) when Place > 0 -> L = length(S), case Place - L of 0 -> S ++ ".0"; N when N < 0 -> {S0, S1} = lists:split(L + N, S), S0 ++ "." ++ S1; N when N < 6 -> %% More places than digits S ++ lists:duplicate(N, $0) ++ ".0"; _ -> insert_decimal_exp(Place, S) end; insert_decimal(Place, S) when Place > -6 -> "0." ++ lists:duplicate(abs(Place), $0) ++ S; insert_decimal(Place, S) -> insert_decimal_exp(Place, S). insert_decimal_exp(Place, S) -> [C | S0] = S, S1 = case S0 of [] -> "0"; _ -> S0 end, Exp = case Place < 0 of true -> "e-"; false -> "e+" end, [C] ++ "." ++ S1 ++ Exp ++ integer_to_list(abs(Place - 1)). digits1(Float, Exp, Frac) -> Round = ((Frac band 1) =:= 0), case Exp >= 0 of true -> BExp = 1 bsl Exp, case (Frac =/= ?BIG_POW) of true -> scale((Frac * BExp * 2), 2, BExp, BExp, Round, Round, Float); false -> scale((Frac * BExp * 4), 4, (BExp * 2), BExp, Round, Round, Float) end; false -> case (Exp =:= ?MIN_EXP) orelse (Frac =/= ?BIG_POW) of true -> scale((Frac * 2), 1 bsl (1 - Exp), 1, 1, Round, Round, Float); false -> scale((Frac * 4), 1 bsl (2 - Exp), 2, 1, Round, Round, Float) end end. scale(R, S, MPlus, MMinus, LowOk, HighOk, Float) -> Est = int_ceil(math:log10(abs(Float)) - 1.0e-10), %% Note that the scheme implementation uses a 326 element look-up table %% for int_pow(10, N) where we do not. case Est >= 0 of true -> fixup(R, S * int_pow(10, Est), MPlus, MMinus, Est, LowOk, HighOk); false -> Scale = int_pow(10, -Est), fixup(R * Scale, S, MPlus * Scale, MMinus * Scale, Est, LowOk, HighOk) end. fixup(R, S, MPlus, MMinus, K, LowOk, HighOk) -> TooLow = case HighOk of true -> (R + MPlus) >= S; false -> (R + MPlus) > S end, case TooLow of true -> [(K + 1) | generate(R, S, MPlus, MMinus, LowOk, HighOk)]; false -> [K | generate(R * 10, S, MPlus * 10, MMinus * 10, LowOk, HighOk)] end. generate(R0, S, MPlus, MMinus, LowOk, HighOk) -> D = R0 div S, R = R0 rem S, TC1 = case LowOk of true -> R =< MMinus; false -> R < MMinus end, TC2 = case HighOk of true -> (R + MPlus) >= S; false -> (R + MPlus) > S end, case TC1 of false -> case TC2 of false -> [D | generate(R * 10, S, MPlus * 10, MMinus * 10, LowOk, HighOk)]; true -> [D + 1] end; true -> case TC2 of false -> [D]; true -> case R * 2 < S of true -> [D]; false -> [D + 1] end end end. unpack(Float) -> <> = <>, {Sign, Exp, Frac}. frexp1({_Sign, 0, 0}) -> {0.0, 0}; frexp1({Sign, 0, Frac}) -> Exp = log2floor(Frac), <> = <>, {Frac1, -(?FLOAT_BIAS) - 52 + Exp}; frexp1({Sign, Exp, Frac}) -> <> = <>, {Frac1, Exp - ?FLOAT_BIAS}. log2floor(Int) -> log2floor(Int, 0). log2floor(0, N) -> N; log2floor(Int, N) -> log2floor(Int bsr 1, 1 + N). transform_digits(Place, [0 | Rest]) -> transform_digits(Place, Rest); transform_digits(Place, Digits) -> {Place, [$0 + D || D <- Digits]}. frexp_int(F) -> case unpack(F) of {_Sign, 0, Frac} -> {Frac, ?MIN_EXP}; {_Sign, Exp, Frac} -> {Frac + (1 bsl 52), Exp - 53 - ?FLOAT_BIAS} end. %% %% Tests %% -ifdef(TEST). -include_lib("eunit/include/eunit.hrl"). int_ceil_test() -> ?assertEqual(1, int_ceil(0.0001)), ?assertEqual(0, int_ceil(0.0)), ?assertEqual(1, int_ceil(0.99)), ?assertEqual(1, int_ceil(1.0)), ?assertEqual(-1, int_ceil(-1.5)), ?assertEqual(-2, int_ceil(-2.0)), ok. int_pow_test() -> ?assertEqual(1, int_pow(1, 1)), ?assertEqual(1, int_pow(1, 0)), ?assertEqual(1, int_pow(10, 0)), ?assertEqual(10, int_pow(10, 1)), ?assertEqual(100, int_pow(10, 2)), ?assertEqual(1000, int_pow(10, 3)), ok. digits_test() -> ?assertEqual("0", digits(0)), ?assertEqual("0.0", digits(0.0)), ?assertEqual("1.0", digits(1.0)), ?assertEqual("-1.0", digits(-1.0)), ?assertEqual("0.1", digits(0.1)), ?assertEqual("0.01", digits(0.01)), ?assertEqual("0.001", digits(0.001)), ?assertEqual("1.0e+6", digits(1000000.0)), ?assertEqual("0.5", digits(0.5)), ?assertEqual("4503599627370496.0", digits(4503599627370496.0)), %% small denormalized number %% 4.94065645841246544177e-324 =:= 5.0e-324 <> = <<0,0,0,0,0,0,0,1>>, ?assertEqual("5.0e-324", digits(SmallDenorm)), ?assertEqual(SmallDenorm, list_to_float(digits(SmallDenorm))), %% large denormalized number %% 2.22507385850720088902e-308 <> = <<0,15,255,255,255,255,255,255>>, ?assertEqual("2.225073858507201e-308", digits(BigDenorm)), ?assertEqual(BigDenorm, list_to_float(digits(BigDenorm))), %% small normalized number %% 2.22507385850720138309e-308 <> = <<0,16,0,0,0,0,0,0>>, ?assertEqual("2.2250738585072014e-308", digits(SmallNorm)), ?assertEqual(SmallNorm, list_to_float(digits(SmallNorm))), %% large normalized number %% 1.79769313486231570815e+308 <> = <<127,239,255,255,255,255,255,255>>, ?assertEqual("1.7976931348623157e+308", digits(LargeNorm)), ?assertEqual(LargeNorm, list_to_float(digits(LargeNorm))), %% issue #10 - mochinum:frexp(math:pow(2, -1074)). ?assertEqual("5.0e-324", digits(math:pow(2, -1074))), ok. frexp_test() -> %% zero ?assertEqual({0.0, 0}, frexp(0.0)), %% one ?assertEqual({0.5, 1}, frexp(1.0)), %% negative one ?assertEqual({-0.5, 1}, frexp(-1.0)), %% small denormalized number %% 4.94065645841246544177e-324 <> = <<0,0,0,0,0,0,0,1>>, ?assertEqual({0.5, -1073}, frexp(SmallDenorm)), %% large denormalized number %% 2.22507385850720088902e-308 <> = <<0,15,255,255,255,255,255,255>>, ?assertEqual( {0.99999999999999978, -1022}, frexp(BigDenorm)), %% small normalized number %% 2.22507385850720138309e-308 <> = <<0,16,0,0,0,0,0,0>>, ?assertEqual({0.5, -1021}, frexp(SmallNorm)), %% large normalized number %% 1.79769313486231570815e+308 <> = <<127,239,255,255,255,255,255,255>>, ?assertEqual( {0.99999999999999989, 1024}, frexp(LargeNorm)), %% issue #10 - mochinum:frexp(math:pow(2, -1074)). ?assertEqual( {0.5, -1073}, frexp(math:pow(2, -1074))), ok. -endif. apache-couchdb-1.6.0/src/ejson/mochijson2.erl0000644000175000001440000007134212332105522021011 0ustar00djcusers00000000000000%% @author Bob Ippolito %% @copyright 2007 Mochi Media, Inc. %% @doc Yet another JSON (RFC 4627) library for Erlang. mochijson2 works %% with binaries as strings, arrays as lists (without an {array, _}) %% wrapper and it only knows how to decode UTF-8 (and ASCII). %% %% JSON terms are decoded as follows (javascript -> erlang): %%
    %%
  • {"key": "value"} -> %% {struct, [{<<"key">>, <<"value">>}]}
  • %%
  • ["array", 123, 12.34, true, false, null] -> %% [<<"array">>, 123, 12.34, true, false, null] %%
  • %%
%%
    %%
  • Strings in JSON decode to UTF-8 binaries in Erlang
  • %%
  • Objects decode to {struct, PropList}
  • %%
  • Numbers decode to integer or float
  • %%
  • true, false, null decode to their respective terms.
  • %%
%% The encoder will accept the same format that the decoder will produce, %% but will also allow additional cases for leniency: %%
    %%
  • atoms other than true, false, null will be considered UTF-8 %% strings (even as a proplist key) %%
  • %%
  • {json, IoList} will insert IoList directly into the output %% with no validation %%
  • %%
  • {array, Array} will be encoded as Array %% (legacy mochijson style) %%
  • %%
  • A non-empty raw proplist will be encoded as an object as long %% as the first pair does not have an atom key of json, struct, %% or array %%
  • %%
-module(mochijson2). -author('bob@mochimedia.com'). -export([encoder/1, encode/1]). -export([decoder/1, decode/1]). % This is a macro to placate syntax highlighters.. -define(Q, $\"). -define(ADV_COL(S, N), S#decoder{offset=N+S#decoder.offset, column=N+S#decoder.column}). -define(INC_COL(S), S#decoder{offset=1+S#decoder.offset, column=1+S#decoder.column}). -define(INC_LINE(S), S#decoder{offset=1+S#decoder.offset, column=1, line=1+S#decoder.line}). -define(INC_CHAR(S, C), case C of $\n -> S#decoder{column=1, line=1+S#decoder.line, offset=1+S#decoder.offset}; _ -> S#decoder{column=1+S#decoder.column, offset=1+S#decoder.offset} end). -define(IS_WHITESPACE(C), (C =:= $\s orelse C =:= $\t orelse C =:= $\r orelse C =:= $\n)). %% @type iolist() = [char() | binary() | iolist()] %% @type iodata() = iolist() | binary() %% @type json_string() = atom | binary() %% @type json_number() = integer() | float() %% @type json_array() = [json_term()] %% @type json_object() = {struct, [{json_string(), json_term()}]} %% @type json_iolist() = {json, iolist()} %% @type json_term() = json_string() | json_number() | json_array() | %% json_object() | json_iolist() -record(encoder, {handler=null, utf8=false}). -record(decoder, {object_hook=null, offset=0, line=1, column=1, state=null}). %% @spec encoder([encoder_option()]) -> function() %% @doc Create an encoder/1 with the given options. %% @type encoder_option() = handler_option() | utf8_option() %% @type utf8_option() = boolean(). Emit unicode as utf8 (default - false) encoder(Options) -> State = parse_encoder_options(Options, #encoder{}), fun (O) -> json_encode(O, State) end. %% @spec encode(json_term()) -> iolist() %% @doc Encode the given as JSON to an iolist. encode(Any) -> json_encode(Any, #encoder{}). %% @spec decoder([decoder_option()]) -> function() %% @doc Create a decoder/1 with the given options. decoder(Options) -> State = parse_decoder_options(Options, #decoder{}), fun (O) -> json_decode(O, State) end. %% @spec decode(iolist()) -> json_term() %% @doc Decode the given iolist to Erlang terms. decode(S) -> json_decode(S, #decoder{}). %% Internal API parse_encoder_options([], State) -> State; parse_encoder_options([{handler, Handler} | Rest], State) -> parse_encoder_options(Rest, State#encoder{handler=Handler}); parse_encoder_options([{utf8, Switch} | Rest], State) -> parse_encoder_options(Rest, State#encoder{utf8=Switch}). parse_decoder_options([], State) -> State; parse_decoder_options([{object_hook, Hook} | Rest], State) -> parse_decoder_options(Rest, State#decoder{object_hook=Hook}). json_encode(true, _State) -> <<"true">>; json_encode(false, _State) -> <<"false">>; json_encode(null, _State) -> <<"null">>; json_encode(I, _State) when is_integer(I) -> integer_to_list(I); json_encode(F, _State) when is_float(F) -> mochinum:digits(F); json_encode(S, State) when is_binary(S); is_atom(S) -> json_encode_string(S, State); json_encode([{K, _}|_] = Props, State) when (K =/= struct andalso K =/= array andalso K =/= json) -> json_encode_proplist(Props, State); json_encode({struct, Props}, State) when is_list(Props) -> json_encode_proplist(Props, State); json_encode(Array, State) when is_list(Array) -> json_encode_array(Array, State); json_encode({array, Array}, State) when is_list(Array) -> json_encode_array(Array, State); json_encode({json, IoList}, _State) -> IoList; json_encode(Bad, #encoder{handler=null}) -> exit({json_encode, {bad_term, Bad}}); json_encode(Bad, State=#encoder{handler=Handler}) -> json_encode(Handler(Bad), State). json_encode_array([], _State) -> <<"[]">>; json_encode_array(L, State) -> F = fun (O, Acc) -> [$,, json_encode(O, State) | Acc] end, [$, | Acc1] = lists:foldl(F, "[", L), lists:reverse([$\] | Acc1]). json_encode_proplist([], _State) -> <<"{}">>; json_encode_proplist(Props, State) -> F = fun ({K, V}, Acc) -> KS = json_encode_string(K, State), VS = json_encode(V, State), [$,, VS, $:, KS | Acc] end, [$, | Acc1] = lists:foldl(F, "{", Props), lists:reverse([$\} | Acc1]). json_encode_string(A, State) when is_atom(A) -> L = atom_to_list(A), case json_string_is_safe(L) of true -> [?Q, L, ?Q]; false -> json_encode_string_unicode(xmerl_ucs:from_utf8(L), State, [?Q]) end; json_encode_string(B, State) when is_binary(B) -> case json_bin_is_safe(B) of true -> [?Q, B, ?Q]; false -> json_encode_string_unicode(xmerl_ucs:from_utf8(B), State, [?Q]) end; json_encode_string(I, _State) when is_integer(I) -> [?Q, integer_to_list(I), ?Q]; json_encode_string(L, State) when is_list(L) -> case json_string_is_safe(L) of true -> [?Q, L, ?Q]; false -> json_encode_string_unicode(L, State, [?Q]) end. json_string_is_safe([]) -> true; json_string_is_safe([C | Rest]) -> case C of ?Q -> false; $\\ -> false; $\b -> false; $\f -> false; $\n -> false; $\r -> false; $\t -> false; C when C >= 0, C < $\s; C >= 16#7f, C =< 16#10FFFF -> false; C when C < 16#7f -> json_string_is_safe(Rest); _ -> false end. json_bin_is_safe(<<>>) -> true; json_bin_is_safe(<>) -> case C of ?Q -> false; $\\ -> false; $\b -> false; $\f -> false; $\n -> false; $\r -> false; $\t -> false; C when C >= 0, C < $\s; C >= 16#7f -> false; C when C < 16#7f -> json_bin_is_safe(Rest) end. json_encode_string_unicode([], _State, Acc) -> lists:reverse([$\" | Acc]); json_encode_string_unicode([C | Cs], State, Acc) -> Acc1 = case C of ?Q -> [?Q, $\\ | Acc]; %% Escaping solidus is only useful when trying to protect %% against "" injection attacks which are only %% possible when JSON is inserted into a HTML document %% in-line. mochijson2 does not protect you from this, so %% if you do insert directly into HTML then you need to %% uncomment the following case or escape the output of encode. %% %% $/ -> %% [$/, $\\ | Acc]; %% $\\ -> [$\\, $\\ | Acc]; $\b -> [$b, $\\ | Acc]; $\f -> [$f, $\\ | Acc]; $\n -> [$n, $\\ | Acc]; $\r -> [$r, $\\ | Acc]; $\t -> [$t, $\\ | Acc]; C when C >= 0, C < $\s -> [unihex(C) | Acc]; C when C >= 16#7f, C =< 16#10FFFF, State#encoder.utf8 -> [xmerl_ucs:to_utf8(C) | Acc]; C when C >= 16#7f, C =< 16#10FFFF, not State#encoder.utf8 -> [unihex(C) | Acc]; C when C < 16#7f -> [C | Acc]; _ -> exit({json_encode, {bad_char, C}}) end, json_encode_string_unicode(Cs, State, Acc1). hexdigit(C) when C >= 0, C =< 9 -> C + $0; hexdigit(C) when C =< 15 -> C + $a - 10. unihex(C) when C < 16#10000 -> <> = <>, Digits = [hexdigit(D) || D <- [D3, D2, D1, D0]], [$\\, $u | Digits]; unihex(C) when C =< 16#10FFFF -> N = C - 16#10000, S1 = 16#d800 bor ((N bsr 10) band 16#3ff), S2 = 16#dc00 bor (N band 16#3ff), [unihex(S1), unihex(S2)]. json_decode(L, S) when is_list(L) -> json_decode(iolist_to_binary(L), S); json_decode(B, S) -> {Res, S1} = decode1(B, S), {eof, _} = tokenize(B, S1#decoder{state=trim}), Res. decode1(B, S=#decoder{state=null}) -> case tokenize(B, S#decoder{state=any}) of {{const, C}, S1} -> {C, S1}; {start_array, S1} -> decode_array(B, S1); {start_object, S1} -> decode_object(B, S1) end. make_object(V, #decoder{object_hook=null}) -> V; make_object(V, #decoder{object_hook=Hook}) -> Hook(V). decode_object(B, S) -> decode_object(B, S#decoder{state=key}, []). decode_object(B, S=#decoder{state=key}, Acc) -> case tokenize(B, S) of {end_object, S1} -> V = make_object({struct, lists:reverse(Acc)}, S1), {V, S1#decoder{state=null}}; {{const, K}, S1} -> {colon, S2} = tokenize(B, S1), {V, S3} = decode1(B, S2#decoder{state=null}), decode_object(B, S3#decoder{state=comma}, [{K, V} | Acc]) end; decode_object(B, S=#decoder{state=comma}, Acc) -> case tokenize(B, S) of {end_object, S1} -> V = make_object({struct, lists:reverse(Acc)}, S1), {V, S1#decoder{state=null}}; {comma, S1} -> decode_object(B, S1#decoder{state=key}, Acc) end. decode_array(B, S) -> decode_array(B, S#decoder{state=any}, []). decode_array(B, S=#decoder{state=any}, Acc) -> case tokenize(B, S) of {end_array, S1} -> {lists:reverse(Acc), S1#decoder{state=null}}; {start_array, S1} -> {Array, S2} = decode_array(B, S1), decode_array(B, S2#decoder{state=comma}, [Array | Acc]); {start_object, S1} -> {Array, S2} = decode_object(B, S1), decode_array(B, S2#decoder{state=comma}, [Array | Acc]); {{const, Const}, S1} -> decode_array(B, S1#decoder{state=comma}, [Const | Acc]) end; decode_array(B, S=#decoder{state=comma}, Acc) -> case tokenize(B, S) of {end_array, S1} -> {lists:reverse(Acc), S1#decoder{state=null}}; {comma, S1} -> decode_array(B, S1#decoder{state=any}, Acc) end. tokenize_string(B, S=#decoder{offset=O}) -> case tokenize_string_fast(B, O) of {escape, O1} -> Length = O1 - O, S1 = ?ADV_COL(S, Length), <<_:O/binary, Head:Length/binary, _/binary>> = B, tokenize_string(B, S1, lists:reverse(binary_to_list(Head))); O1 -> Length = O1 - O, <<_:O/binary, String:Length/binary, ?Q, _/binary>> = B, {{const, String}, ?ADV_COL(S, Length + 1)} end. tokenize_string_fast(B, O) -> case B of <<_:O/binary, ?Q, _/binary>> -> O; <<_:O/binary, $\\, _/binary>> -> {escape, O}; <<_:O/binary, C1, _/binary>> when C1 < 128 -> tokenize_string_fast(B, 1 + O); <<_:O/binary, C1, C2, _/binary>> when C1 >= 194, C1 =< 223, C2 >= 128, C2 =< 191 -> tokenize_string_fast(B, 2 + O); <<_:O/binary, C1, C2, C3, _/binary>> when C1 >= 224, C1 =< 239, C2 >= 128, C2 =< 191, C3 >= 128, C3 =< 191 -> tokenize_string_fast(B, 3 + O); <<_:O/binary, C1, C2, C3, C4, _/binary>> when C1 >= 240, C1 =< 244, C2 >= 128, C2 =< 191, C3 >= 128, C3 =< 191, C4 >= 128, C4 =< 191 -> tokenize_string_fast(B, 4 + O); _ -> throw(invalid_utf8) end. tokenize_string(B, S=#decoder{offset=O}, Acc) -> case B of <<_:O/binary, ?Q, _/binary>> -> {{const, iolist_to_binary(lists:reverse(Acc))}, ?INC_COL(S)}; <<_:O/binary, "\\\"", _/binary>> -> tokenize_string(B, ?ADV_COL(S, 2), [$\" | Acc]); <<_:O/binary, "\\\\", _/binary>> -> tokenize_string(B, ?ADV_COL(S, 2), [$\\ | Acc]); <<_:O/binary, "\\/", _/binary>> -> tokenize_string(B, ?ADV_COL(S, 2), [$/ | Acc]); <<_:O/binary, "\\b", _/binary>> -> tokenize_string(B, ?ADV_COL(S, 2), [$\b | Acc]); <<_:O/binary, "\\f", _/binary>> -> tokenize_string(B, ?ADV_COL(S, 2), [$\f | Acc]); <<_:O/binary, "\\n", _/binary>> -> tokenize_string(B, ?ADV_COL(S, 2), [$\n | Acc]); <<_:O/binary, "\\r", _/binary>> -> tokenize_string(B, ?ADV_COL(S, 2), [$\r | Acc]); <<_:O/binary, "\\t", _/binary>> -> tokenize_string(B, ?ADV_COL(S, 2), [$\t | Acc]); <<_:O/binary, "\\u", C3, C2, C1, C0, Rest/binary>> -> C = erlang:list_to_integer([C3, C2, C1, C0], 16), if C > 16#D7FF, C < 16#DC00 -> %% coalesce UTF-16 surrogate pair <<"\\u", D3, D2, D1, D0, _/binary>> = Rest, D = erlang:list_to_integer([D3,D2,D1,D0], 16), [CodePoint] = xmerl_ucs:from_utf16be(<>), Acc1 = lists:reverse(xmerl_ucs:to_utf8(CodePoint), Acc), tokenize_string(B, ?ADV_COL(S, 12), Acc1); true -> Acc1 = lists:reverse(xmerl_ucs:to_utf8(C), Acc), tokenize_string(B, ?ADV_COL(S, 6), Acc1) end; <<_:O/binary, C1, _/binary>> when C1 < 128 -> tokenize_string(B, ?INC_CHAR(S, C1), [C1 | Acc]); <<_:O/binary, C1, C2, _/binary>> when C1 >= 194, C1 =< 223, C2 >= 128, C2 =< 191 -> tokenize_string(B, ?ADV_COL(S, 2), [C2, C1 | Acc]); <<_:O/binary, C1, C2, C3, _/binary>> when C1 >= 224, C1 =< 239, C2 >= 128, C2 =< 191, C3 >= 128, C3 =< 191 -> tokenize_string(B, ?ADV_COL(S, 3), [C3, C2, C1 | Acc]); <<_:O/binary, C1, C2, C3, C4, _/binary>> when C1 >= 240, C1 =< 244, C2 >= 128, C2 =< 191, C3 >= 128, C3 =< 191, C4 >= 128, C4 =< 191 -> tokenize_string(B, ?ADV_COL(S, 4), [C4, C3, C2, C1 | Acc]); _ -> throw(invalid_utf8) end. tokenize_number(B, S) -> case tokenize_number(B, sign, S, []) of {{int, Int}, S1} -> {{const, list_to_integer(Int)}, S1}; {{float, Float}, S1} -> {{const, list_to_float(Float)}, S1} end. tokenize_number(B, sign, S=#decoder{offset=O}, []) -> case B of <<_:O/binary, $-, _/binary>> -> tokenize_number(B, int, ?INC_COL(S), [$-]); _ -> tokenize_number(B, int, S, []) end; tokenize_number(B, int, S=#decoder{offset=O}, Acc) -> case B of <<_:O/binary, $0, _/binary>> -> tokenize_number(B, frac, ?INC_COL(S), [$0 | Acc]); <<_:O/binary, C, _/binary>> when C >= $1 andalso C =< $9 -> tokenize_number(B, int1, ?INC_COL(S), [C | Acc]) end; tokenize_number(B, int1, S=#decoder{offset=O}, Acc) -> case B of <<_:O/binary, C, _/binary>> when C >= $0 andalso C =< $9 -> tokenize_number(B, int1, ?INC_COL(S), [C | Acc]); _ -> tokenize_number(B, frac, S, Acc) end; tokenize_number(B, frac, S=#decoder{offset=O}, Acc) -> case B of <<_:O/binary, $., C, _/binary>> when C >= $0, C =< $9 -> tokenize_number(B, frac1, ?ADV_COL(S, 2), [C, $. | Acc]); <<_:O/binary, E, _/binary>> when E =:= $e orelse E =:= $E -> tokenize_number(B, esign, ?INC_COL(S), [$e, $0, $. | Acc]); _ -> {{int, lists:reverse(Acc)}, S} end; tokenize_number(B, frac1, S=#decoder{offset=O}, Acc) -> case B of <<_:O/binary, C, _/binary>> when C >= $0 andalso C =< $9 -> tokenize_number(B, frac1, ?INC_COL(S), [C | Acc]); <<_:O/binary, E, _/binary>> when E =:= $e orelse E =:= $E -> tokenize_number(B, esign, ?INC_COL(S), [$e | Acc]); _ -> {{float, lists:reverse(Acc)}, S} end; tokenize_number(B, esign, S=#decoder{offset=O}, Acc) -> case B of <<_:O/binary, C, _/binary>> when C =:= $- orelse C=:= $+ -> tokenize_number(B, eint, ?INC_COL(S), [C | Acc]); _ -> tokenize_number(B, eint, S, Acc) end; tokenize_number(B, eint, S=#decoder{offset=O}, Acc) -> case B of <<_:O/binary, C, _/binary>> when C >= $0 andalso C =< $9 -> tokenize_number(B, eint1, ?INC_COL(S), [C | Acc]) end; tokenize_number(B, eint1, S=#decoder{offset=O}, Acc) -> case B of <<_:O/binary, C, _/binary>> when C >= $0 andalso C =< $9 -> tokenize_number(B, eint1, ?INC_COL(S), [C | Acc]); _ -> {{float, lists:reverse(Acc)}, S} end. tokenize(B, S=#decoder{offset=O}) -> case B of <<_:O/binary, C, _/binary>> when ?IS_WHITESPACE(C) -> tokenize(B, ?INC_CHAR(S, C)); <<_:O/binary, "{", _/binary>> -> {start_object, ?INC_COL(S)}; <<_:O/binary, "}", _/binary>> -> {end_object, ?INC_COL(S)}; <<_:O/binary, "[", _/binary>> -> {start_array, ?INC_COL(S)}; <<_:O/binary, "]", _/binary>> -> {end_array, ?INC_COL(S)}; <<_:O/binary, ",", _/binary>> -> {comma, ?INC_COL(S)}; <<_:O/binary, ":", _/binary>> -> {colon, ?INC_COL(S)}; <<_:O/binary, "null", _/binary>> -> {{const, null}, ?ADV_COL(S, 4)}; <<_:O/binary, "true", _/binary>> -> {{const, true}, ?ADV_COL(S, 4)}; <<_:O/binary, "false", _/binary>> -> {{const, false}, ?ADV_COL(S, 5)}; <<_:O/binary, "\"", _/binary>> -> tokenize_string(B, ?INC_COL(S)); <<_:O/binary, C, _/binary>> when (C >= $0 andalso C =< $9) orelse C =:= $- -> tokenize_number(B, S); <<_:O/binary>> -> trim = S#decoder.state, {eof, S} end. %% %% Tests %% -ifdef(TEST). -include_lib("eunit/include/eunit.hrl"). %% testing constructs borrowed from the Yaws JSON implementation. %% Create an object from a list of Key/Value pairs. obj_new() -> {struct, []}. is_obj({struct, Props}) -> F = fun ({K, _}) when is_binary(K) -> true end, lists:all(F, Props). obj_from_list(Props) -> Obj = {struct, Props}, ?assert(is_obj(Obj)), Obj. %% Test for equivalence of Erlang terms. %% Due to arbitrary order of construction, equivalent objects might %% compare unequal as erlang terms, so we need to carefully recurse %% through aggregates (tuples and objects). equiv({struct, Props1}, {struct, Props2}) -> equiv_object(Props1, Props2); equiv(L1, L2) when is_list(L1), is_list(L2) -> equiv_list(L1, L2); equiv(N1, N2) when is_number(N1), is_number(N2) -> N1 == N2; equiv(B1, B2) when is_binary(B1), is_binary(B2) -> B1 == B2; equiv(A, A) when A =:= true orelse A =:= false orelse A =:= null -> true. %% Object representation and traversal order is unknown. %% Use the sledgehammer and sort property lists. equiv_object(Props1, Props2) -> L1 = lists:keysort(1, Props1), L2 = lists:keysort(1, Props2), Pairs = lists:zip(L1, L2), true = lists:all(fun({{K1, V1}, {K2, V2}}) -> equiv(K1, K2) and equiv(V1, V2) end, Pairs). %% Recursively compare tuple elements for equivalence. equiv_list([], []) -> true; equiv_list([V1 | L1], [V2 | L2]) -> equiv(V1, V2) andalso equiv_list(L1, L2). decode_test() -> [1199344435545.0, 1] = decode(<<"[1199344435545.0,1]">>), <<16#F0,16#9D,16#9C,16#95>> = decode([34,"\\ud835","\\udf15",34]). e2j_vec_test() -> test_one(e2j_test_vec(utf8), 1). test_one([], _N) -> %% io:format("~p tests passed~n", [N-1]), ok; test_one([{E, J} | Rest], N) -> %% io:format("[~p] ~p ~p~n", [N, E, J]), true = equiv(E, decode(J)), true = equiv(E, decode(encode(E))), test_one(Rest, 1+N). e2j_test_vec(utf8) -> [ {1, "1"}, {3.1416, "3.14160"}, %% text representation may truncate, trail zeroes {-1, "-1"}, {-3.1416, "-3.14160"}, {12.0e10, "1.20000e+11"}, {1.234E+10, "1.23400e+10"}, {-1.234E-10, "-1.23400e-10"}, {10.0, "1.0e+01"}, {123.456, "1.23456E+2"}, {10.0, "1e1"}, {<<"foo">>, "\"foo\""}, {<<"foo", 5, "bar">>, "\"foo\\u0005bar\""}, {<<"">>, "\"\""}, {<<"\n\n\n">>, "\"\\n\\n\\n\""}, {<<"\" \b\f\r\n\t\"">>, "\"\\\" \\b\\f\\r\\n\\t\\\"\""}, {obj_new(), "{}"}, {obj_from_list([{<<"foo">>, <<"bar">>}]), "{\"foo\":\"bar\"}"}, {obj_from_list([{<<"foo">>, <<"bar">>}, {<<"baz">>, 123}]), "{\"foo\":\"bar\",\"baz\":123}"}, {[], "[]"}, {[[]], "[[]]"}, {[1, <<"foo">>], "[1,\"foo\"]"}, %% json array in a json object {obj_from_list([{<<"foo">>, [123]}]), "{\"foo\":[123]}"}, %% json object in a json object {obj_from_list([{<<"foo">>, obj_from_list([{<<"bar">>, true}])}]), "{\"foo\":{\"bar\":true}}"}, %% fold evaluation order {obj_from_list([{<<"foo">>, []}, {<<"bar">>, obj_from_list([{<<"baz">>, true}])}, {<<"alice">>, <<"bob">>}]), "{\"foo\":[],\"bar\":{\"baz\":true},\"alice\":\"bob\"}"}, %% json object in a json array {[-123, <<"foo">>, obj_from_list([{<<"bar">>, []}]), null], "[-123,\"foo\",{\"bar\":[]},null]"} ]. %% test utf8 encoding encoder_utf8_test() -> %% safe conversion case (default) [34,"\\u0001","\\u0442","\\u0435","\\u0441","\\u0442",34] = encode(<<1,"\321\202\320\265\321\201\321\202">>), %% raw utf8 output (optional) Enc = mochijson2:encoder([{utf8, true}]), [34,"\\u0001",[209,130],[208,181],[209,129],[209,130],34] = Enc(<<1,"\321\202\320\265\321\201\321\202">>). input_validation_test() -> Good = [ {16#00A3, <>}, %% pound {16#20AC, <>}, %% euro {16#10196, <>} %% denarius ], lists:foreach(fun({CodePoint, UTF8}) -> Expect = list_to_binary(xmerl_ucs:to_utf8(CodePoint)), Expect = decode(UTF8) end, Good), Bad = [ %% 2nd, 3rd, or 4th byte of a multi-byte sequence w/o leading byte <>, %% missing continuations, last byte in each should be 80-BF <>, <>, <>, %% we don't support code points > 10FFFF per RFC 3629 <>, %% escape characters trigger a different code path <> ], lists:foreach( fun(X) -> ok = try decode(X) catch invalid_utf8 -> ok end, %% could be {ucs,{bad_utf8_character_code}} or %% {json_encode,{bad_char,_}} {'EXIT', _} = (catch encode(X)) end, Bad). inline_json_test() -> ?assertEqual(<<"\"iodata iodata\"">>, iolist_to_binary( encode({json, [<<"\"iodata">>, " iodata\""]}))), ?assertEqual({struct, [{<<"key">>, <<"iodata iodata">>}]}, decode( encode({struct, [{key, {json, [<<"\"iodata">>, " iodata\""]}}]}))), ok. big_unicode_test() -> UTF8Seq = list_to_binary(xmerl_ucs:to_utf8(16#0001d120)), ?assertEqual( <<"\"\\ud834\\udd20\"">>, iolist_to_binary(encode(UTF8Seq))), ?assertEqual( UTF8Seq, decode(iolist_to_binary(encode(UTF8Seq)))), ok. custom_decoder_test() -> ?assertEqual( {struct, [{<<"key">>, <<"value">>}]}, (decoder([]))("{\"key\": \"value\"}")), F = fun ({struct, [{<<"key">>, <<"value">>}]}) -> win end, ?assertEqual( win, (decoder([{object_hook, F}]))("{\"key\": \"value\"}")), ok. atom_test() -> %% JSON native atoms [begin ?assertEqual(A, decode(atom_to_list(A))), ?assertEqual(iolist_to_binary(atom_to_list(A)), iolist_to_binary(encode(A))) end || A <- [true, false, null]], %% Atom to string ?assertEqual( <<"\"foo\"">>, iolist_to_binary(encode(foo))), ?assertEqual( <<"\"\\ud834\\udd20\"">>, iolist_to_binary(encode(list_to_atom(xmerl_ucs:to_utf8(16#0001d120))))), ok. key_encode_test() -> %% Some forms are accepted as keys that would not be strings in other %% cases ?assertEqual( <<"{\"foo\":1}">>, iolist_to_binary(encode({struct, [{foo, 1}]}))), ?assertEqual( <<"{\"foo\":1}">>, iolist_to_binary(encode({struct, [{<<"foo">>, 1}]}))), ?assertEqual( <<"{\"foo\":1}">>, iolist_to_binary(encode({struct, [{"foo", 1}]}))), ?assertEqual( <<"{\"foo\":1}">>, iolist_to_binary(encode([{foo, 1}]))), ?assertEqual( <<"{\"foo\":1}">>, iolist_to_binary(encode([{<<"foo">>, 1}]))), ?assertEqual( <<"{\"foo\":1}">>, iolist_to_binary(encode([{"foo", 1}]))), ?assertEqual( <<"{\"\\ud834\\udd20\":1}">>, iolist_to_binary( encode({struct, [{[16#0001d120], 1}]}))), ?assertEqual( <<"{\"1\":1}">>, iolist_to_binary(encode({struct, [{1, 1}]}))), ok. unsafe_chars_test() -> Chars = "\"\\\b\f\n\r\t", [begin ?assertEqual(false, json_string_is_safe([C])), ?assertEqual(false, json_bin_is_safe(<>)), ?assertEqual(<>, decode(encode(<>))) end || C <- Chars], ?assertEqual( false, json_string_is_safe([16#0001d120])), ?assertEqual( false, json_bin_is_safe(list_to_binary(xmerl_ucs:to_utf8(16#0001d120)))), ?assertEqual( [16#0001d120], xmerl_ucs:from_utf8( binary_to_list( decode(encode(list_to_atom(xmerl_ucs:to_utf8(16#0001d120))))))), ?assertEqual( false, json_string_is_safe([16#110000])), ?assertEqual( false, json_bin_is_safe(list_to_binary(xmerl_ucs:to_utf8([16#110000])))), %% solidus can be escaped but isn't unsafe by default ?assertEqual( <<"/">>, decode(<<"\"\\/\"">>)), ok. int_test() -> ?assertEqual(0, decode("0")), ?assertEqual(1, decode("1")), ?assertEqual(11, decode("11")), ok. large_int_test() -> ?assertEqual(<<"-2147483649214748364921474836492147483649">>, iolist_to_binary(encode(-2147483649214748364921474836492147483649))), ?assertEqual(<<"2147483649214748364921474836492147483649">>, iolist_to_binary(encode(2147483649214748364921474836492147483649))), ok. float_test() -> ?assertEqual(<<"-2147483649.0">>, iolist_to_binary(encode(-2147483649.0))), ?assertEqual(<<"2147483648.0">>, iolist_to_binary(encode(2147483648.0))), ok. handler_test() -> ?assertEqual( {'EXIT',{json_encode,{bad_term,{}}}}, catch encode({})), F = fun ({}) -> [] end, ?assertEqual( <<"[]">>, iolist_to_binary((encoder([{handler, F}]))({}))), ok. -endif. apache-couchdb-1.6.0/src/couch_replicator/0000755000175000001440000000000012332105601020430 5ustar00djcusers00000000000000apache-couchdb-1.6.0/src/couch_replicator/src/0000755000175000001440000000000012332105601021217 5ustar00djcusers00000000000000apache-couchdb-1.6.0/src/couch_replicator/src/couch_replicator_manager.erl0000644000175000001440000005374512332105522026762 0ustar00djcusers00000000000000% Licensed under the Apache License, Version 2.0 (the "License"); you may not % use this file except in compliance with the License. You may obtain a copy of % the License at % % http://www.apache.org/licenses/LICENSE-2.0 % % Unless required by applicable law or agreed to in writing, software % distributed under the License is distributed on an "AS IS" BASIS, WITHOUT % WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the % License for the specific language governing permissions and limitations under % the License. -module(couch_replicator_manager). -behaviour(gen_server). % public API -export([replication_started/1, replication_completed/2, replication_error/2]). -export([before_doc_update/2, after_doc_read/2]). % gen_server callbacks -export([start_link/0, init/1, handle_call/3, handle_info/2, handle_cast/2]). -export([code_change/3, terminate/2]). -include("couch_db.hrl"). -include("couch_replicator.hrl"). -include("couch_replicator_js_functions.hrl"). -define(DOC_TO_REP, couch_rep_doc_id_to_rep_id). -define(REP_TO_STATE, couch_rep_id_to_rep_state). -define(INITIAL_WAIT, 2.5). % seconds -define(MAX_WAIT, 600). % seconds -define(OWNER, <<"owner">>). -define(replace(L, K, V), lists:keystore(K, 1, L, {K, V})). -record(rep_state, { rep, starting, retries_left, max_retries, wait = ?INITIAL_WAIT }). -import(couch_util, [ get_value/2, get_value/3, to_binary/1 ]). -record(state, { changes_feed_loop = nil, db_notifier = nil, rep_db_name = nil, rep_start_pids = [], max_retries }). start_link() -> gen_server:start_link({local, ?MODULE}, ?MODULE, [], []). replication_started(#rep{id = {BaseId, _} = RepId}) -> case rep_state(RepId) of nil -> ok; #rep_state{rep = #rep{doc_id = DocId}} -> update_rep_doc(DocId, [ {<<"_replication_state">>, <<"triggered">>}, {<<"_replication_state_reason">>, undefined}, {<<"_replication_id">>, ?l2b(BaseId)}, {<<"_replication_stats">>, undefined}]), ok = gen_server:call(?MODULE, {rep_started, RepId}, infinity), ?LOG_INFO("Document `~s` triggered replication `~s`", [DocId, pp_rep_id(RepId)]) end. replication_completed(#rep{id = RepId}, Stats) -> case rep_state(RepId) of nil -> ok; #rep_state{rep = #rep{doc_id = DocId}} -> update_rep_doc(DocId, [ {<<"_replication_state">>, <<"completed">>}, {<<"_replication_state_reason">>, undefined}, {<<"_replication_stats">>, {Stats}}]), ok = gen_server:call(?MODULE, {rep_complete, RepId}, infinity), ?LOG_INFO("Replication `~s` finished (triggered by document `~s`)", [pp_rep_id(RepId), DocId]) end. replication_error(#rep{id = {BaseId, _} = RepId}, Error) -> case rep_state(RepId) of nil -> ok; #rep_state{rep = #rep{doc_id = DocId}} -> update_rep_doc(DocId, [ {<<"_replication_state">>, <<"error">>}, {<<"_replication_state_reason">>, to_binary(error_reason(Error))}, {<<"_replication_id">>, ?l2b(BaseId)}]), ok = gen_server:call(?MODULE, {rep_error, RepId, Error}, infinity) end. init(_) -> process_flag(trap_exit, true), ?DOC_TO_REP = ets:new(?DOC_TO_REP, [named_table, set, protected]), ?REP_TO_STATE = ets:new(?REP_TO_STATE, [named_table, set, protected]), Server = self(), ok = couch_config:register( fun("replicator", "db", NewName) -> ok = gen_server:cast(Server, {rep_db_changed, ?l2b(NewName)}); ("replicator", "max_replication_retry_count", V) -> ok = gen_server:cast(Server, {set_max_retries, retries_value(V)}) end ), {Loop, RepDbName} = changes_feed_loop(), {ok, #state{ changes_feed_loop = Loop, rep_db_name = RepDbName, db_notifier = db_update_notifier(), max_retries = retries_value( couch_config:get("replicator", "max_replication_retry_count", "10")) }}. handle_call({rep_db_update, {ChangeProps} = Change}, _From, State) -> NewState = try process_update(State, Change) catch _Tag:Error -> {RepProps} = get_value(doc, ChangeProps), DocId = get_value(<<"_id">>, RepProps), rep_db_update_error(Error, DocId), State end, {reply, ok, NewState}; handle_call({rep_started, RepId}, _From, State) -> case rep_state(RepId) of nil -> ok; RepState -> NewRepState = RepState#rep_state{ starting = false, retries_left = State#state.max_retries, max_retries = State#state.max_retries, wait = ?INITIAL_WAIT }, true = ets:insert(?REP_TO_STATE, {RepId, NewRepState}) end, {reply, ok, State}; handle_call({rep_complete, RepId}, _From, State) -> true = ets:delete(?REP_TO_STATE, RepId), {reply, ok, State}; handle_call({rep_error, RepId, Error}, _From, State) -> {reply, ok, replication_error(State, RepId, Error)}; handle_call(Msg, From, State) -> ?LOG_ERROR("Replication manager received unexpected call ~p from ~p", [Msg, From]), {stop, {error, {unexpected_call, Msg}}, State}. handle_cast({rep_db_changed, NewName}, #state{rep_db_name = NewName} = State) -> {noreply, State}; handle_cast({rep_db_changed, _NewName}, State) -> {noreply, restart(State)}; handle_cast({rep_db_created, NewName}, #state{rep_db_name = NewName} = State) -> {noreply, State}; handle_cast({rep_db_created, _NewName}, State) -> {noreply, restart(State)}; handle_cast({set_max_retries, MaxRetries}, State) -> {noreply, State#state{max_retries = MaxRetries}}; handle_cast(Msg, State) -> ?LOG_ERROR("Replication manager received unexpected cast ~p", [Msg]), {stop, {error, {unexpected_cast, Msg}}, State}. handle_info({'EXIT', From, normal}, #state{changes_feed_loop = From} = State) -> % replicator DB deleted {noreply, State#state{changes_feed_loop = nil, rep_db_name = nil}}; handle_info({'EXIT', From, Reason}, #state{db_notifier = From} = State) -> ?LOG_ERROR("Database update notifier died. Reason: ~p", [Reason]), {stop, {db_update_notifier_died, Reason}, State}; handle_info({'EXIT', From, normal}, #state{rep_start_pids = Pids} = State) -> % one of the replication start processes terminated successfully {noreply, State#state{rep_start_pids = Pids -- [From]}}; handle_info({'DOWN', _Ref, _, _, _}, State) -> % From a db monitor created by a replication process. Ignore. {noreply, State}; handle_info(Msg, State) -> ?LOG_ERROR("Replication manager received unexpected message ~p", [Msg]), {stop, {unexpected_msg, Msg}, State}. terminate(_Reason, State) -> #state{ rep_start_pids = StartPids, changes_feed_loop = Loop, db_notifier = DbNotifier } = State, stop_all_replications(), lists:foreach( fun(Pid) -> catch unlink(Pid), catch exit(Pid, stop) end, [Loop | StartPids]), true = ets:delete(?REP_TO_STATE), true = ets:delete(?DOC_TO_REP), couch_db_update_notifier:stop(DbNotifier). code_change(_OldVsn, State, _Extra) -> {ok, State}. changes_feed_loop() -> {ok, RepDb} = ensure_rep_db_exists(), RepDbName = couch_db:name(RepDb), couch_db:close(RepDb), Server = self(), Pid = spawn_link( fun() -> DbOpenOptions = [{user_ctx, RepDb#db.user_ctx}, sys_db], {ok, Db} = couch_db:open_int(RepDbName, DbOpenOptions), ChangesFeedFun = couch_changes:handle_changes( #changes_args{ include_docs = true, feed = "continuous", timeout = infinity }, {json_req, null}, Db ), ChangesFeedFun( fun({change, Change, _}, _) -> case has_valid_rep_id(Change) of true -> ok = gen_server:call( Server, {rep_db_update, Change}, infinity); false -> ok end; (_, _) -> ok end ) end ), {Pid, RepDbName}. has_valid_rep_id({Change}) -> has_valid_rep_id(get_value(<<"id">>, Change)); has_valid_rep_id(<>) -> false; has_valid_rep_id(_Else) -> true. db_update_notifier() -> Server = self(), {ok, Notifier} = couch_db_update_notifier:start_link( fun({created, DbName}) -> case ?l2b(couch_config:get("replicator", "db", "_replicator")) of DbName -> ok = gen_server:cast(Server, {rep_db_created, DbName}); _ -> ok end; (_) -> % no need to handle the 'deleted' event - the changes feed loop % dies when the database is deleted ok end ), Notifier. restart(#state{changes_feed_loop = Loop, rep_start_pids = StartPids} = State) -> stop_all_replications(), lists:foreach( fun(Pid) -> catch unlink(Pid), catch exit(Pid, rep_db_changed) end, [Loop | StartPids]), {NewLoop, NewRepDbName} = changes_feed_loop(), State#state{ changes_feed_loop = NewLoop, rep_db_name = NewRepDbName, rep_start_pids = [] }. process_update(State, {Change}) -> {RepProps} = JsonRepDoc = get_value(doc, Change), DocId = get_value(<<"_id">>, RepProps), case get_value(<<"deleted">>, Change, false) of true -> rep_doc_deleted(DocId), State; false -> case get_value(<<"_replication_state">>, RepProps) of undefined -> maybe_start_replication(State, DocId, JsonRepDoc); <<"triggered">> -> maybe_start_replication(State, DocId, JsonRepDoc); <<"completed">> -> replication_complete(DocId), State; <<"error">> -> case ets:lookup(?DOC_TO_REP, DocId) of [] -> maybe_start_replication(State, DocId, JsonRepDoc); _ -> State end end end. rep_db_update_error(Error, DocId) -> case Error of {bad_rep_doc, Reason} -> ok; _ -> Reason = to_binary(Error) end, ?LOG_ERROR("Replication manager, error processing document `~s`: ~s", [DocId, Reason]), update_rep_doc(DocId, [{<<"_replication_state">>, <<"error">>}, {<<"_replication_state_reason">>, Reason}]). rep_user_ctx({RepDoc}) -> case get_value(<<"user_ctx">>, RepDoc) of undefined -> #user_ctx{}; {UserCtx} -> #user_ctx{ name = get_value(<<"name">>, UserCtx, null), roles = get_value(<<"roles">>, UserCtx, []) } end. maybe_start_replication(State, DocId, RepDoc) -> #rep{id = {BaseId, _} = RepId} = Rep = parse_rep_doc(RepDoc), case rep_state(RepId) of nil -> RepState = #rep_state{ rep = Rep, starting = true, retries_left = State#state.max_retries, max_retries = State#state.max_retries }, true = ets:insert(?REP_TO_STATE, {RepId, RepState}), true = ets:insert(?DOC_TO_REP, {DocId, RepId}), ?LOG_INFO("Attempting to start replication `~s` (document `~s`).", [pp_rep_id(RepId), DocId]), Pid = spawn_link(fun() -> start_replication(Rep, 0) end), State#state{rep_start_pids = [Pid | State#state.rep_start_pids]}; #rep_state{rep = #rep{doc_id = DocId}} -> State; #rep_state{starting = false, rep = #rep{doc_id = OtherDocId}} -> ?LOG_INFO("The replication specified by the document `~s` was already" " triggered by the document `~s`", [DocId, OtherDocId]), maybe_tag_rep_doc(DocId, RepDoc, ?l2b(BaseId)), State; #rep_state{starting = true, rep = #rep{doc_id = OtherDocId}} -> ?LOG_INFO("The replication specified by the document `~s` is already" " being triggered by the document `~s`", [DocId, OtherDocId]), maybe_tag_rep_doc(DocId, RepDoc, ?l2b(BaseId)), State end. parse_rep_doc(RepDoc) -> {ok, Rep} = try couch_replicator_utils:parse_rep_doc(RepDoc, rep_user_ctx(RepDoc)) catch throw:{error, Reason} -> throw({bad_rep_doc, Reason}); Tag:Err -> throw({bad_rep_doc, to_binary({Tag, Err})}) end, Rep. maybe_tag_rep_doc(DocId, {RepProps}, RepId) -> case get_value(<<"_replication_id">>, RepProps) of RepId -> ok; _ -> update_rep_doc(DocId, [{<<"_replication_id">>, RepId}]) end. start_replication(Rep, Wait) -> ok = timer:sleep(Wait * 1000), case (catch couch_replicator:async_replicate(Rep)) of {ok, _} -> ok; Error -> replication_error(Rep, Error) end. replication_complete(DocId) -> case ets:lookup(?DOC_TO_REP, DocId) of [{DocId, {BaseId, Ext} = RepId}] -> case rep_state(RepId) of nil -> % Prior to OTP R14B02, temporary child specs remain in % in the supervisor after a worker finishes - remove them. % We want to be able to start the same replication but with % eventually different values for parameters that don't % contribute to its ID calculation. case erlang:system_info(otp_release) < "R14B02" of true -> spawn(fun() -> _ = supervisor:delete_child(couch_replicator_job_sup, BaseId ++ Ext) end); false -> ok end; #rep_state{} -> ok end, true = ets:delete(?DOC_TO_REP, DocId); _ -> ok end. rep_doc_deleted(DocId) -> case ets:lookup(?DOC_TO_REP, DocId) of [{DocId, RepId}] -> couch_replicator:cancel_replication(RepId), true = ets:delete(?REP_TO_STATE, RepId), true = ets:delete(?DOC_TO_REP, DocId), ?LOG_INFO("Stopped replication `~s` because replication document `~s`" " was deleted", [pp_rep_id(RepId), DocId]); [] -> ok end. replication_error(State, RepId, Error) -> case rep_state(RepId) of nil -> State; RepState -> maybe_retry_replication(RepState, Error, State) end. maybe_retry_replication(#rep_state{retries_left = 0} = RepState, Error, State) -> #rep_state{ rep = #rep{id = RepId, doc_id = DocId}, max_retries = MaxRetries } = RepState, couch_replicator:cancel_replication(RepId), true = ets:delete(?REP_TO_STATE, RepId), true = ets:delete(?DOC_TO_REP, DocId), ?LOG_ERROR("Error in replication `~s` (triggered by document `~s`): ~s" "~nReached maximum retry attempts (~p).", [pp_rep_id(RepId), DocId, to_binary(error_reason(Error)), MaxRetries]), State; maybe_retry_replication(RepState, Error, State) -> #rep_state{ rep = #rep{id = RepId, doc_id = DocId} = Rep } = RepState, #rep_state{wait = Wait} = NewRepState = state_after_error(RepState), true = ets:insert(?REP_TO_STATE, {RepId, NewRepState}), ?LOG_ERROR("Error in replication `~s` (triggered by document `~s`): ~s" "~nRestarting replication in ~p seconds.", [pp_rep_id(RepId), DocId, to_binary(error_reason(Error)), Wait]), Pid = spawn_link(fun() -> start_replication(Rep, Wait) end), State#state{rep_start_pids = [Pid | State#state.rep_start_pids]}. stop_all_replications() -> ?LOG_INFO("Stopping all ongoing replications because the replicator" " database was deleted or changed", []), ets:foldl( fun({_, RepId}, _) -> couch_replicator:cancel_replication(RepId) end, ok, ?DOC_TO_REP), true = ets:delete_all_objects(?REP_TO_STATE), true = ets:delete_all_objects(?DOC_TO_REP). update_rep_doc(RepDocId, KVs) -> {ok, RepDb} = ensure_rep_db_exists(), try case couch_db:open_doc(RepDb, RepDocId, [ejson_body]) of {ok, LatestRepDoc} -> update_rep_doc(RepDb, LatestRepDoc, KVs); _ -> ok end catch throw:conflict -> % Shouldn't happen, as by default only the role _replicator can % update replication documents. ?LOG_ERROR("Conflict error when updating replication document `~s`." " Retrying.", [RepDocId]), ok = timer:sleep(5), update_rep_doc(RepDocId, KVs) after couch_db:close(RepDb) end. update_rep_doc(RepDb, #doc{body = {RepDocBody}} = RepDoc, KVs) -> NewRepDocBody = lists:foldl( fun({K, undefined}, Body) -> lists:keydelete(K, 1, Body); ({<<"_replication_state">> = K, State} = KV, Body) -> case get_value(K, Body) of State -> Body; _ -> Body1 = lists:keystore(K, 1, Body, KV), lists:keystore( <<"_replication_state_time">>, 1, Body1, {<<"_replication_state_time">>, timestamp()}) end; ({K, _V} = KV, Body) -> lists:keystore(K, 1, Body, KV) end, RepDocBody, KVs), case NewRepDocBody of RepDocBody -> ok; _ -> % Might not succeed - when the replication doc is deleted right % before this update (not an error, ignore). couch_db:update_doc(RepDb, RepDoc#doc{body = {NewRepDocBody}}, []) end. % RFC3339 timestamps. % Note: doesn't include the time seconds fraction (RFC3339 says it's optional). timestamp() -> {{Year, Month, Day}, {Hour, Min, Sec}} = calendar:now_to_local_time(now()), UTime = erlang:universaltime(), LocalTime = calendar:universal_time_to_local_time(UTime), DiffSecs = calendar:datetime_to_gregorian_seconds(LocalTime) - calendar:datetime_to_gregorian_seconds(UTime), zone(DiffSecs div 3600, (DiffSecs rem 3600) div 60), iolist_to_binary( io_lib:format("~4..0w-~2..0w-~2..0wT~2..0w:~2..0w:~2..0w~s", [Year, Month, Day, Hour, Min, Sec, zone(DiffSecs div 3600, (DiffSecs rem 3600) div 60)])). zone(Hr, Min) when Hr >= 0, Min >= 0 -> io_lib:format("+~2..0w:~2..0w", [Hr, Min]); zone(Hr, Min) -> io_lib:format("-~2..0w:~2..0w", [abs(Hr), abs(Min)]). ensure_rep_db_exists() -> DbName = ?l2b(couch_config:get("replicator", "db", "_replicator")), UserCtx = #user_ctx{roles = [<<"_admin">>, <<"_replicator">>]}, case couch_db:open_int(DbName, [sys_db, {user_ctx, UserCtx}, nologifmissing]) of {ok, Db} -> Db; _Error -> {ok, Db} = couch_db:create(DbName, [sys_db, {user_ctx, UserCtx}]) end, ensure_rep_ddoc_exists(Db, <<"_design/_replicator">>), {ok, Db}. ensure_rep_ddoc_exists(RepDb, DDocID) -> case couch_db:open_doc(RepDb, DDocID, []) of {ok, _Doc} -> ok; _ -> DDoc = couch_doc:from_json_obj({[ {<<"_id">>, DDocID}, {<<"language">>, <<"javascript">>}, {<<"validate_doc_update">>, ?REP_DB_DOC_VALIDATE_FUN} ]}), {ok, _Rev} = couch_db:update_doc(RepDb, DDoc, []) end. % pretty-print replication id pp_rep_id(#rep{id = RepId}) -> pp_rep_id(RepId); pp_rep_id({Base, Extension}) -> Base ++ Extension. rep_state(RepId) -> case ets:lookup(?REP_TO_STATE, RepId) of [{RepId, RepState}] -> RepState; [] -> nil end. error_reason({error, {Error, Reason}}) when is_atom(Error), is_binary(Reason) -> io_lib:format("~s: ~s", [Error, Reason]); error_reason({error, Reason}) -> Reason; error_reason(Reason) -> Reason. retries_value("infinity") -> infinity; retries_value(Value) -> list_to_integer(Value). state_after_error(#rep_state{retries_left = Left, wait = Wait} = State) -> Wait2 = erlang:min(trunc(Wait * 2), ?MAX_WAIT), case Left of infinity -> State#rep_state{wait = Wait2}; _ -> State#rep_state{retries_left = Left - 1, wait = Wait2} end. before_doc_update(#doc{id = <>} = Doc, _Db) -> Doc; before_doc_update(#doc{body = {Body}} = Doc, #db{user_ctx=UserCtx} = Db) -> #user_ctx{roles = Roles, name = Name} = UserCtx, case lists:member(<<"_replicator">>, Roles) of true -> Doc; false -> case couch_util:get_value(?OWNER, Body) of undefined -> Doc#doc{body = {?replace(Body, ?OWNER, Name)}}; Name -> Doc; Other -> case (catch couch_db:check_is_admin(Db)) of ok when Other =:= null -> Doc#doc{body = {?replace(Body, ?OWNER, Name)}}; ok -> Doc; _ -> throw({forbidden, <<"Can't update replication documents", " from other users.">>}) end end end. after_doc_read(#doc{id = <>} = Doc, _Db) -> Doc; after_doc_read(#doc{body = {Body}} = Doc, #db{user_ctx=UserCtx} = Db) -> #user_ctx{name = Name} = UserCtx, case (catch couch_db:check_is_admin(Db)) of ok -> Doc; _ -> case couch_util:get_value(?OWNER, Body) of Name -> Doc; _Other -> Source = strip_credentials(couch_util:get_value(<<"source">>, Body)), Target = strip_credentials(couch_util:get_value(<<"target">>, Body)), NewBody0 = ?replace(Body, <<"source">>, Source), NewBody = ?replace(NewBody0, <<"target">>, Target), #doc{revs = {Pos, [_ | Revs]}} = Doc, NewDoc = Doc#doc{body = {NewBody}, revs = {Pos - 1, Revs}}, NewRevId = couch_db:new_revid(NewDoc), NewDoc#doc{revs = {Pos, [NewRevId | Revs]}} end end. strip_credentials(undefined) -> undefined; strip_credentials(Url) when is_binary(Url) -> re:replace(Url, "http(s)?://(?:[^:]+):[^@]+@(.*)$", "http\\1://\\2", [{return, binary}]); strip_credentials({Props}) -> {lists:keydelete(<<"oauth">>, 1, Props)}. apache-couchdb-1.6.0/src/couch_replicator/src/couch_replicator_job_sup.erl0000644000175000001440000000220312332105522026770 0ustar00djcusers00000000000000% Licensed under the Apache License, Version 2.0 (the "License"); you may not % use this file except in compliance with the License. You may obtain a copy of % the License at % % http://www.apache.org/licenses/LICENSE-2.0 % % Unless required by applicable law or agreed to in writing, software % distributed under the License is distributed on an "AS IS" BASIS, WITHOUT % WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the % License for the specific language governing permissions and limitations under % the License. -module(couch_replicator_job_sup). -behaviour(supervisor). -export([init/1, start_link/0]). -include("couch_db.hrl"). start_link() -> supervisor:start_link({local,?MODULE}, ?MODULE, []). %%============================================================================= %% supervisor callbacks %%============================================================================= init([]) -> {ok, {{one_for_one, 3, 10}, []}}. %%============================================================================= %% internal functions %%============================================================================= apache-couchdb-1.6.0/src/couch_replicator/src/couch_replicator.erl0000644000175000001440000010541212332105522025255 0ustar00djcusers00000000000000% Licensed under the Apache License, Version 2.0 (the "License"); you may not % use this file except in compliance with the License. You may obtain a copy of % the License at % % http://www.apache.org/licenses/LICENSE-2.0 % % Unless required by applicable law or agreed to in writing, software % distributed under the License is distributed on an "AS IS" BASIS, WITHOUT % WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the % License for the specific language governing permissions and limitations under % the License. -module(couch_replicator). -behaviour(gen_server). % public API -export([replicate/1]). % meant to be used only by the replicator database listener -export([async_replicate/1]). -export([cancel_replication/1]). % gen_server callbacks -export([init/1, terminate/2, code_change/3]). -export([handle_call/3, handle_cast/2, handle_info/2]). -include("couch_db.hrl"). -include("couch_replicator_api_wrap.hrl"). -include("couch_replicator.hrl"). -import(couch_util, [ get_value/2, get_value/3, to_binary/1 ]). -import(couch_replicator_utils, [ start_db_compaction_notifier/2, stop_db_compaction_notifier/1 ]). -record(rep_state, { rep_details, source_name, target_name, source, target, history, checkpoint_history, start_seq, committed_seq, current_through_seq, seqs_in_progress = [], highest_seq_done = {0, ?LOWEST_SEQ}, source_log, target_log, rep_starttime, src_starttime, tgt_starttime, timer, % checkpoint timer changes_queue, changes_manager, changes_reader, workers, stats = #rep_stats{}, session_id, source_db_compaction_notifier = nil, target_db_compaction_notifier = nil, source_monitor = nil, target_monitor = nil, source_seq = nil, use_checkpoints = true, checkpoint_interval = 5000 }). replicate(#rep{id = RepId, options = Options, user_ctx = UserCtx} = Rep) -> case get_value(cancel, Options, false) of true -> case get_value(id, Options, nil) of nil -> cancel_replication(RepId); RepId2 -> cancel_replication(RepId2, UserCtx) end; false -> {ok, Listener} = rep_result_listener(RepId), Result = do_replication_loop(Rep), couch_replicator_notifier:stop(Listener), Result end. do_replication_loop(#rep{id = {BaseId, Ext} = Id, options = Options} = Rep) -> case async_replicate(Rep) of {ok, _Pid} -> case get_value(continuous, Options, false) of true -> {ok, {continuous, ?l2b(BaseId ++ Ext)}}; false -> wait_for_result(Id) end; Error -> Error end. async_replicate(#rep{id = {BaseId, Ext}, source = Src, target = Tgt} = Rep) -> RepChildId = BaseId ++ Ext, Source = couch_replicator_api_wrap:db_uri(Src), Target = couch_replicator_api_wrap:db_uri(Tgt), Timeout = get_value(connection_timeout, Rep#rep.options), ChildSpec = { RepChildId, {gen_server, start_link, [?MODULE, Rep, [{timeout, Timeout}]]}, temporary, 250, worker, [?MODULE] }, % All these nested cases to attempt starting/restarting a replication child % are ugly and not 100% race condition free. The following patch submission % is a solution: % % http://erlang.2086793.n4.nabble.com/PATCH-supervisor-atomically-delete-child-spec-when-child-terminates-td3226098.html % case supervisor:start_child(couch_replicator_job_sup, ChildSpec) of {ok, Pid} -> ?LOG_INFO("starting new replication `~s` at ~p (`~s` -> `~s`)", [RepChildId, Pid, Source, Target]), {ok, Pid}; {error, already_present} -> case supervisor:restart_child(couch_replicator_job_sup, RepChildId) of {ok, Pid} -> ?LOG_INFO("restarting replication `~s` at ~p (`~s` -> `~s`)", [RepChildId, Pid, Source, Target]), {ok, Pid}; {error, running} -> %% this error occurs if multiple replicators are racing %% each other to start and somebody else won. Just grab %% the Pid by calling start_child again. {error, {already_started, Pid}} = supervisor:start_child(couch_replicator_job_sup, ChildSpec), ?LOG_INFO("replication `~s` already running at ~p (`~s` -> `~s`)", [RepChildId, Pid, Source, Target]), {ok, Pid}; {error, {'EXIT', {badarg, [{erlang, apply, [gen_server, start_link, undefined]} | _]}}} -> % Clause to deal with a change in the supervisor module introduced % in R14B02. For more details consult the thread at: % http://erlang.org/pipermail/erlang-bugs/2011-March/002273.html _ = supervisor:delete_child(couch_replicator_job_sup, RepChildId), async_replicate(Rep); {error, _} = Error -> Error end; {error, {already_started, Pid}} -> ?LOG_INFO("replication `~s` already running at ~p (`~s` -> `~s`)", [RepChildId, Pid, Source, Target]), {ok, Pid}; {error, {Error, _}} -> {error, Error} end. rep_result_listener(RepId) -> ReplyTo = self(), {ok, _Listener} = couch_replicator_notifier:start_link( fun({_, RepId2, _} = Ev) when RepId2 =:= RepId -> ReplyTo ! Ev; (_) -> ok end). wait_for_result(RepId) -> receive {finished, RepId, RepResult} -> {ok, RepResult}; {error, RepId, Reason} -> {error, Reason} end. cancel_replication({BaseId, Extension}) -> FullRepId = BaseId ++ Extension, ?LOG_INFO("Canceling replication `~s`...", [FullRepId]), case supervisor:terminate_child(couch_replicator_job_sup, FullRepId) of ok -> ?LOG_INFO("Replication `~s` canceled.", [FullRepId]), case supervisor:delete_child(couch_replicator_job_sup, FullRepId) of ok -> {ok, {cancelled, ?l2b(FullRepId)}}; {error, not_found} -> {ok, {cancelled, ?l2b(FullRepId)}}; Error -> Error end; Error -> ?LOG_ERROR("Error canceling replication `~s`: ~p", [FullRepId, Error]), Error end. cancel_replication(RepId, #user_ctx{name = Name, roles = Roles}) -> case lists:member(<<"_admin">>, Roles) of true -> cancel_replication(RepId); false -> {BaseId, Ext} = RepId, case lists:keysearch( BaseId ++ Ext, 1, supervisor:which_children(couch_replicator_job_sup)) of {value, {_, Pid, _, _}} when is_pid(Pid) -> case (catch gen_server:call(Pid, get_details, infinity)) of {ok, #rep{user_ctx = #user_ctx{name = Name}}} -> cancel_replication(RepId); {ok, _} -> throw({unauthorized, <<"Can't cancel a replication triggered by another user">>}); {'EXIT', {noproc, {gen_server, call, _}}} -> {error, not_found}; Error -> throw(Error) end; _ -> {error, not_found} end end. init(InitArgs) -> try do_init(InitArgs) catch throw:{unauthorized, DbUri} -> {stop, {unauthorized, <<"unauthorized to access or create database ", DbUri/binary>>}}; throw:{db_not_found, DbUri} -> {stop, {db_not_found, <<"could not open ", DbUri/binary>>}}; throw:Error -> {stop, Error} end. do_init(#rep{options = Options, id = {BaseId, Ext}} = Rep) -> process_flag(trap_exit, true), #rep_state{ source = Source, target = Target, source_name = SourceName, target_name = TargetName, start_seq = {_Ts, StartSeq}, source_seq = SourceCurSeq, committed_seq = {_, CommittedSeq}, checkpoint_interval = CheckpointInterval } = State = init_state(Rep), NumWorkers = get_value(worker_processes, Options), BatchSize = get_value(worker_batch_size, Options), {ok, ChangesQueue} = couch_work_queue:new([ {max_items, BatchSize * NumWorkers * 2}, {max_size, 100 * 1024 * NumWorkers} ]), % This starts the _changes reader process. It adds the changes from % the source db to the ChangesQueue. ChangesReader = spawn_changes_reader(StartSeq, Source, ChangesQueue, Options), % Changes manager - responsible for dequeing batches from the changes queue % and deliver them to the worker processes. ChangesManager = spawn_changes_manager(self(), ChangesQueue, BatchSize), % This starts the worker processes. They ask the changes queue manager for a % a batch of _changes rows to process -> check which revs are missing in the % target, and for the missing ones, it copies them from the source to the target. MaxConns = get_value(http_connections, Options), Workers = lists:map( fun(_) -> {ok, Pid} = couch_replicator_worker:start_link( self(), Source, Target, ChangesManager, MaxConns), Pid end, lists:seq(1, NumWorkers)), couch_task_status:add_task([ {type, replication}, {replication_id, ?l2b(BaseId ++ Ext)}, {doc_id, Rep#rep.doc_id}, {source, ?l2b(SourceName)}, {target, ?l2b(TargetName)}, {continuous, get_value(continuous, Options, false)}, {revisions_checked, 0}, {missing_revisions_found, 0}, {docs_read, 0}, {docs_written, 0}, {doc_write_failures, 0}, {source_seq, SourceCurSeq}, {checkpointed_source_seq, CommittedSeq}, {progress, 0}, {checkpoint_interval, CheckpointInterval} ]), couch_task_status:set_update_frequency(1000), % Until OTP R14B03: % % Restarting a temporary supervised child implies that the original arguments % (#rep{} record) specified in the MFA component of the supervisor % child spec will always be used whenever the child is restarted. % This implies the same replication performance tunning parameters will % always be used. The solution is to delete the child spec (see % cancel_replication/1) and then start the replication again, but this is % unfortunately not immune to race conditions. ?LOG_INFO("Replication `~p` is using:~n" "~c~p worker processes~n" "~ca worker batch size of ~p~n" "~c~p HTTP connections~n" "~ca connection timeout of ~p milliseconds~n" "~c~p retries per request~n" "~csocket options are: ~s~s", [BaseId ++ Ext, $\t, NumWorkers, $\t, BatchSize, $\t, MaxConns, $\t, get_value(connection_timeout, Options), $\t, get_value(retries, Options), $\t, io_lib:format("~p", [get_value(socket_options, Options)]), case StartSeq of ?LOWEST_SEQ -> ""; _ -> io_lib:format("~n~csource start sequence ~p", [$\t, StartSeq]) end]), ?LOG_DEBUG("Worker pids are: ~p", [Workers]), couch_replicator_manager:replication_started(Rep), {ok, State#rep_state{ changes_queue = ChangesQueue, changes_manager = ChangesManager, changes_reader = ChangesReader, workers = Workers } }. handle_info(shutdown, St) -> {stop, shutdown, St}; handle_info({'DOWN', Ref, _, _, Why}, #rep_state{source_monitor = Ref} = St) -> ?LOG_ERROR("Source database is down. Reason: ~p", [Why]), {stop, source_db_down, St}; handle_info({'DOWN', Ref, _, _, Why}, #rep_state{target_monitor = Ref} = St) -> ?LOG_ERROR("Target database is down. Reason: ~p", [Why]), {stop, target_db_down, St}; handle_info({'EXIT', Pid, normal}, #rep_state{changes_reader=Pid} = State) -> {noreply, State}; handle_info({'EXIT', Pid, Reason}, #rep_state{changes_reader=Pid} = State) -> ?LOG_ERROR("ChangesReader process died with reason: ~p", [Reason]), {stop, changes_reader_died, cancel_timer(State)}; handle_info({'EXIT', Pid, normal}, #rep_state{changes_manager = Pid} = State) -> {noreply, State}; handle_info({'EXIT', Pid, Reason}, #rep_state{changes_manager = Pid} = State) -> ?LOG_ERROR("ChangesManager process died with reason: ~p", [Reason]), {stop, changes_manager_died, cancel_timer(State)}; handle_info({'EXIT', Pid, normal}, #rep_state{changes_queue=Pid} = State) -> {noreply, State}; handle_info({'EXIT', Pid, Reason}, #rep_state{changes_queue=Pid} = State) -> ?LOG_ERROR("ChangesQueue process died with reason: ~p", [Reason]), {stop, changes_queue_died, cancel_timer(State)}; handle_info({'EXIT', Pid, normal}, #rep_state{workers = Workers} = State) -> case Workers -- [Pid] of Workers -> {stop, {unknown_process_died, Pid, normal}, State}; [] -> catch unlink(State#rep_state.changes_manager), catch exit(State#rep_state.changes_manager, kill), do_last_checkpoint(State); Workers2 -> {noreply, State#rep_state{workers = Workers2}} end; handle_info({'EXIT', Pid, Reason}, #rep_state{workers = Workers} = State) -> State2 = cancel_timer(State), case lists:member(Pid, Workers) of false -> {stop, {unknown_process_died, Pid, Reason}, State2}; true -> ?LOG_ERROR("Worker ~p died with reason: ~p", [Pid, Reason]), {stop, {worker_died, Pid, Reason}, State2} end. handle_call(get_details, _From, #rep_state{rep_details = Rep} = State) -> {reply, {ok, Rep}, State}; handle_call({add_stats, Stats}, From, State) -> gen_server:reply(From, ok), NewStats = couch_replicator_utils:sum_stats(State#rep_state.stats, Stats), {noreply, State#rep_state{stats = NewStats}}; handle_call({report_seq_done, Seq, StatsInc}, From, #rep_state{seqs_in_progress = SeqsInProgress, highest_seq_done = HighestDone, current_through_seq = ThroughSeq, stats = Stats} = State) -> gen_server:reply(From, ok), {NewThroughSeq0, NewSeqsInProgress} = case SeqsInProgress of [Seq | Rest] -> {Seq, Rest}; [_ | _] -> {ThroughSeq, ordsets:del_element(Seq, SeqsInProgress)} end, NewHighestDone = lists:max([HighestDone, Seq]), NewThroughSeq = case NewSeqsInProgress of [] -> lists:max([NewThroughSeq0, NewHighestDone]); _ -> NewThroughSeq0 end, ?LOG_DEBUG("Worker reported seq ~p, through seq was ~p, " "new through seq is ~p, highest seq done was ~p, " "new highest seq done is ~p~n" "Seqs in progress were: ~p~nSeqs in progress are now: ~p", [Seq, ThroughSeq, NewThroughSeq, HighestDone, NewHighestDone, SeqsInProgress, NewSeqsInProgress]), SourceCurSeq = source_cur_seq(State), NewState = State#rep_state{ stats = couch_replicator_utils:sum_stats(Stats, StatsInc), current_through_seq = NewThroughSeq, seqs_in_progress = NewSeqsInProgress, highest_seq_done = NewHighestDone, source_seq = SourceCurSeq }, update_task(NewState), {noreply, NewState}. handle_cast({db_compacted, DbName}, #rep_state{source = #db{name = DbName} = Source} = State) -> {ok, NewSource} = couch_db:reopen(Source), {noreply, State#rep_state{source = NewSource}}; handle_cast({db_compacted, DbName}, #rep_state{target = #db{name = DbName} = Target} = State) -> {ok, NewTarget} = couch_db:reopen(Target), {noreply, State#rep_state{target = NewTarget}}; handle_cast(checkpoint, State) -> case do_checkpoint(State) of {ok, NewState} -> {noreply, NewState#rep_state{timer = start_timer(State)}}; Error -> {stop, Error, State} end; handle_cast({report_seq, Seq}, #rep_state{seqs_in_progress = SeqsInProgress} = State) -> NewSeqsInProgress = ordsets:add_element(Seq, SeqsInProgress), {noreply, State#rep_state{seqs_in_progress = NewSeqsInProgress}}. code_change(OldVsn, OldState, Extra) when tuple_size(OldState) =:= 30 -> code_change(OldVsn, erlang:append_element(OldState, true), Extra); code_change(OldVsn, OldState, Extra) when tuple_size(OldState) =:= 31 -> code_change(OldVsn, erlang:append_element(OldState, 5000), Extra); code_change(_OldVsn, #rep_state{}=State, _Extra) -> {ok, State}. terminate(normal, #rep_state{rep_details = #rep{id = RepId} = Rep, checkpoint_history = CheckpointHistory} = State) -> terminate_cleanup(State), couch_replicator_notifier:notify({finished, RepId, CheckpointHistory}), couch_replicator_manager:replication_completed(Rep, rep_stats(State)); terminate(shutdown, #rep_state{rep_details = #rep{id = RepId}} = State) -> % cancelled replication throught ?MODULE:cancel_replication/1 couch_replicator_notifier:notify({error, RepId, <<"cancelled">>}), terminate_cleanup(State); terminate(Reason, State) -> #rep_state{ source_name = Source, target_name = Target, rep_details = #rep{id = {BaseId, Ext} = RepId} = Rep } = State, ?LOG_ERROR("Replication `~s` (`~s` -> `~s`) failed: ~s", [BaseId ++ Ext, Source, Target, to_binary(Reason)]), terminate_cleanup(State), couch_replicator_notifier:notify({error, RepId, Reason}), couch_replicator_manager:replication_error(Rep, Reason). terminate_cleanup(State) -> update_task(State), stop_db_compaction_notifier(State#rep_state.source_db_compaction_notifier), stop_db_compaction_notifier(State#rep_state.target_db_compaction_notifier), couch_replicator_api_wrap:db_close(State#rep_state.source), couch_replicator_api_wrap:db_close(State#rep_state.target). do_last_checkpoint(#rep_state{seqs_in_progress = [], highest_seq_done = {_Ts, ?LOWEST_SEQ}} = State) -> {stop, normal, cancel_timer(State)}; do_last_checkpoint(#rep_state{seqs_in_progress = [], highest_seq_done = Seq} = State) -> case do_checkpoint(State#rep_state{current_through_seq = Seq}) of {ok, NewState} -> {stop, normal, cancel_timer(NewState)}; Error -> {stop, Error, State} end. start_timer(State) -> After = State#rep_state.checkpoint_interval, case timer:apply_after(After, gen_server, cast, [self(), checkpoint]) of {ok, Ref} -> Ref; Error -> ?LOG_ERROR("Replicator, error scheduling checkpoint: ~p", [Error]), nil end. cancel_timer(#rep_state{timer = nil} = State) -> State; cancel_timer(#rep_state{timer = Timer} = State) -> {ok, cancel} = timer:cancel(Timer), State#rep_state{timer = nil}. init_state(Rep) -> #rep{ source = Src, target = Tgt, options = Options, user_ctx = UserCtx } = Rep, {ok, Source} = couch_replicator_api_wrap:db_open(Src, [{user_ctx, UserCtx}]), {ok, Target} = couch_replicator_api_wrap:db_open(Tgt, [{user_ctx, UserCtx}], get_value(create_target, Options, false)), {ok, SourceInfo} = couch_replicator_api_wrap:get_db_info(Source), {ok, TargetInfo} = couch_replicator_api_wrap:get_db_info(Target), [SourceLog, TargetLog] = find_replication_logs([Source, Target], Rep), {StartSeq0, History} = compare_replication_logs(SourceLog, TargetLog), StartSeq1 = get_value(since_seq, Options, StartSeq0), StartSeq = {0, StartSeq1}, #doc{body={CheckpointHistory}} = SourceLog, State = #rep_state{ rep_details = Rep, source_name = couch_replicator_api_wrap:db_uri(Source), target_name = couch_replicator_api_wrap:db_uri(Target), source = Source, target = Target, history = History, checkpoint_history = {[{<<"no_changes">>, true}| CheckpointHistory]}, start_seq = StartSeq, current_through_seq = StartSeq, committed_seq = StartSeq, source_log = SourceLog, target_log = TargetLog, rep_starttime = couch_util:rfc1123_date(), src_starttime = get_value(<<"instance_start_time">>, SourceInfo), tgt_starttime = get_value(<<"instance_start_time">>, TargetInfo), session_id = couch_uuids:random(), source_db_compaction_notifier = start_db_compaction_notifier(Source, self()), target_db_compaction_notifier = start_db_compaction_notifier(Target, self()), source_monitor = db_monitor(Source), target_monitor = db_monitor(Target), source_seq = get_value(<<"update_seq">>, SourceInfo, ?LOWEST_SEQ), use_checkpoints = get_value(use_checkpoints, Options, true), checkpoint_interval = get_value(checkpoint_interval, Options, 5000) }, State#rep_state{timer = start_timer(State)}. find_replication_logs(DbList, #rep{id = {BaseId, _}} = Rep) -> LogId = ?l2b(?LOCAL_DOC_PREFIX ++ BaseId), fold_replication_logs(DbList, ?REP_ID_VERSION, LogId, LogId, Rep, []). fold_replication_logs([], _Vsn, _LogId, _NewId, _Rep, Acc) -> lists:reverse(Acc); fold_replication_logs([Db | Rest] = Dbs, Vsn, LogId, NewId, Rep, Acc) -> case couch_replicator_api_wrap:open_doc(Db, LogId, [ejson_body]) of {error, <<"not_found">>} when Vsn > 1 -> OldRepId = couch_replicator_utils:replication_id(Rep, Vsn - 1), fold_replication_logs(Dbs, Vsn - 1, ?l2b(?LOCAL_DOC_PREFIX ++ OldRepId), NewId, Rep, Acc); {error, <<"not_found">>} -> fold_replication_logs( Rest, ?REP_ID_VERSION, NewId, NewId, Rep, [#doc{id = NewId} | Acc]); {ok, Doc} when LogId =:= NewId -> fold_replication_logs( Rest, ?REP_ID_VERSION, NewId, NewId, Rep, [Doc | Acc]); {ok, Doc} -> MigratedLog = #doc{id = NewId, body = Doc#doc.body}, fold_replication_logs( Rest, ?REP_ID_VERSION, NewId, NewId, Rep, [MigratedLog | Acc]) end. spawn_changes_reader(StartSeq, #httpdb{} = Db, ChangesQueue, Options) -> spawn_link(fun() -> put(last_seq, StartSeq), put(retries_left, Db#httpdb.retries), read_changes(StartSeq, Db#httpdb{retries = 0}, ChangesQueue, Options) end); spawn_changes_reader(StartSeq, Db, ChangesQueue, Options) -> spawn_link(fun() -> read_changes(StartSeq, Db, ChangesQueue, Options) end). read_changes(StartSeq, Db, ChangesQueue, Options) -> try couch_replicator_api_wrap:changes_since(Db, all_docs, StartSeq, fun(#doc_info{high_seq = Seq, id = Id} = DocInfo) -> case Id of <<>> -> % Previous CouchDB releases had a bug which allowed a doc % with an empty ID to be inserted into databases. Such doc % is impossible to GET. ?LOG_ERROR("Replicator: ignoring document with empty ID in " "source database `~s` (_changes sequence ~p)", [couch_replicator_api_wrap:db_uri(Db), Seq]); _ -> ok = couch_work_queue:queue(ChangesQueue, DocInfo) end, put(last_seq, Seq) end, Options), couch_work_queue:close(ChangesQueue) catch exit:{http_request_failed, _, _, _} = Error -> case get(retries_left) of N when N > 0 -> put(retries_left, N - 1), LastSeq = get(last_seq), Db2 = case LastSeq of StartSeq -> ?LOG_INFO("Retrying _changes request to source database ~s" " with since=~p in ~p seconds", [couch_replicator_api_wrap:db_uri(Db), LastSeq, Db#httpdb.wait / 1000]), ok = timer:sleep(Db#httpdb.wait), Db#httpdb{wait = 2 * Db#httpdb.wait}; _ -> ?LOG_INFO("Retrying _changes request to source database ~s" " with since=~p", [couch_replicator_api_wrap:db_uri(Db), LastSeq]), Db end, read_changes(LastSeq, Db2, ChangesQueue, Options); _ -> exit(Error) end end. spawn_changes_manager(Parent, ChangesQueue, BatchSize) -> spawn_link(fun() -> changes_manager_loop_open(Parent, ChangesQueue, BatchSize, 1) end). changes_manager_loop_open(Parent, ChangesQueue, BatchSize, Ts) -> receive {get_changes, From} -> case couch_work_queue:dequeue(ChangesQueue, BatchSize) of closed -> From ! {closed, self()}; {ok, Changes} -> #doc_info{high_seq = Seq} = lists:last(Changes), ReportSeq = {Ts, Seq}, ok = gen_server:cast(Parent, {report_seq, ReportSeq}), From ! {changes, self(), Changes, ReportSeq} end, changes_manager_loop_open(Parent, ChangesQueue, BatchSize, Ts + 1) end. do_checkpoint(#rep_state{use_checkpoints=false} = State) -> NewState = State#rep_state{checkpoint_history = {[{<<"use_checkpoints">>, false}]} }, {ok, NewState}; do_checkpoint(#rep_state{current_through_seq=Seq, committed_seq=Seq} = State) -> SourceCurSeq = source_cur_seq(State), NewState = State#rep_state{source_seq = SourceCurSeq}, update_task(NewState), {ok, NewState}; do_checkpoint(State) -> #rep_state{ source_name=SourceName, target_name=TargetName, source = Source, target = Target, history = OldHistory, start_seq = {_, StartSeq}, current_through_seq = {_Ts, NewSeq} = NewTsSeq, source_log = SourceLog, target_log = TargetLog, rep_starttime = ReplicationStartTime, src_starttime = SrcInstanceStartTime, tgt_starttime = TgtInstanceStartTime, stats = Stats, rep_details = #rep{options = Options}, session_id = SessionId } = State, case commit_to_both(Source, Target) of {source_error, Reason} -> {checkpoint_commit_failure, <<"Failure on source commit: ", (to_binary(Reason))/binary>>}; {target_error, Reason} -> {checkpoint_commit_failure, <<"Failure on target commit: ", (to_binary(Reason))/binary>>}; {SrcInstanceStartTime, TgtInstanceStartTime} -> ?LOG_INFO("recording a checkpoint for `~s` -> `~s` at source update_seq ~p", [SourceName, TargetName, NewSeq]), StartTime = ?l2b(ReplicationStartTime), EndTime = ?l2b(couch_util:rfc1123_date()), NewHistoryEntry = {[ {<<"session_id">>, SessionId}, {<<"start_time">>, StartTime}, {<<"end_time">>, EndTime}, {<<"start_last_seq">>, StartSeq}, {<<"end_last_seq">>, NewSeq}, {<<"recorded_seq">>, NewSeq}, {<<"missing_checked">>, Stats#rep_stats.missing_checked}, {<<"missing_found">>, Stats#rep_stats.missing_found}, {<<"docs_read">>, Stats#rep_stats.docs_read}, {<<"docs_written">>, Stats#rep_stats.docs_written}, {<<"doc_write_failures">>, Stats#rep_stats.doc_write_failures} ]}, BaseHistory = [ {<<"session_id">>, SessionId}, {<<"source_last_seq">>, NewSeq}, {<<"replication_id_version">>, ?REP_ID_VERSION} ] ++ case get_value(doc_ids, Options) of undefined -> []; _DocIds -> % backwards compatibility with the result of a replication by % doc IDs in versions 0.11.x and 1.0.x % TODO: deprecate (use same history format, simplify code) [ {<<"start_time">>, StartTime}, {<<"end_time">>, EndTime}, {<<"docs_read">>, Stats#rep_stats.docs_read}, {<<"docs_written">>, Stats#rep_stats.docs_written}, {<<"doc_write_failures">>, Stats#rep_stats.doc_write_failures} ] end, % limit history to 50 entries NewRepHistory = { BaseHistory ++ [{<<"history">>, lists:sublist([NewHistoryEntry | OldHistory], 50)}] }, try {SrcRevPos, SrcRevId} = update_checkpoint( Source, SourceLog#doc{body = NewRepHistory}, source), {TgtRevPos, TgtRevId} = update_checkpoint( Target, TargetLog#doc{body = NewRepHistory}, target), SourceCurSeq = source_cur_seq(State), NewState = State#rep_state{ source_seq = SourceCurSeq, checkpoint_history = NewRepHistory, committed_seq = NewTsSeq, source_log = SourceLog#doc{revs={SrcRevPos, [SrcRevId]}}, target_log = TargetLog#doc{revs={TgtRevPos, [TgtRevId]}} }, update_task(NewState), {ok, NewState} catch throw:{checkpoint_commit_failure, _} = Failure -> Failure end; {SrcInstanceStartTime, _NewTgtInstanceStartTime} -> {checkpoint_commit_failure, <<"Target database out of sync. " "Try to increase max_dbs_open at the target's server.">>}; {_NewSrcInstanceStartTime, TgtInstanceStartTime} -> {checkpoint_commit_failure, <<"Source database out of sync. " "Try to increase max_dbs_open at the source's server.">>}; {_NewSrcInstanceStartTime, _NewTgtInstanceStartTime} -> {checkpoint_commit_failure, <<"Source and target databases out of " "sync. Try to increase max_dbs_open at both servers.">>} end. update_checkpoint(Db, Doc, DbType) -> try update_checkpoint(Db, Doc) catch throw:{checkpoint_commit_failure, Reason} -> throw({checkpoint_commit_failure, <<"Error updating the ", (to_binary(DbType))/binary, " checkpoint document: ", (to_binary(Reason))/binary>>}) end. update_checkpoint(Db, #doc{id = LogId, body = LogBody} = Doc) -> try case couch_replicator_api_wrap:update_doc(Db, Doc, [delay_commit]) of {ok, PosRevId} -> PosRevId; {error, Reason} -> throw({checkpoint_commit_failure, Reason}) end catch throw:conflict -> case (catch couch_replicator_api_wrap:open_doc(Db, LogId, [ejson_body])) of {ok, #doc{body = LogBody, revs = {Pos, [RevId | _]}}} -> % This means that we were able to update successfully the % checkpoint doc in a previous attempt but we got a connection % error (timeout for e.g.) before receiving the success response. % Therefore the request was retried and we got a conflict, as the % revision we sent is not the current one. % We confirm this by verifying the doc body we just got is the same % that we have just sent. {Pos, RevId}; _ -> throw({checkpoint_commit_failure, conflict}) end end. commit_to_both(Source, Target) -> % commit the src async ParentPid = self(), SrcCommitPid = spawn_link( fun() -> Result = (catch couch_replicator_api_wrap:ensure_full_commit(Source)), ParentPid ! {self(), Result} end), % commit tgt sync TargetResult = (catch couch_replicator_api_wrap:ensure_full_commit(Target)), SourceResult = receive {SrcCommitPid, Result} -> unlink(SrcCommitPid), receive {'EXIT', SrcCommitPid, _} -> ok after 0 -> ok end, Result; {'EXIT', SrcCommitPid, Reason} -> {error, Reason} end, case TargetResult of {ok, TargetStartTime} -> case SourceResult of {ok, SourceStartTime} -> {SourceStartTime, TargetStartTime}; SourceError -> {source_error, SourceError} end; TargetError -> {target_error, TargetError} end. compare_replication_logs(SrcDoc, TgtDoc) -> #doc{body={RepRecProps}} = SrcDoc, #doc{body={RepRecPropsTgt}} = TgtDoc, case get_value(<<"session_id">>, RepRecProps) == get_value(<<"session_id">>, RepRecPropsTgt) of true -> % if the records have the same session id, % then we have a valid replication history OldSeqNum = get_value(<<"source_last_seq">>, RepRecProps, ?LOWEST_SEQ), OldHistory = get_value(<<"history">>, RepRecProps, []), {OldSeqNum, OldHistory}; false -> SourceHistory = get_value(<<"history">>, RepRecProps, []), TargetHistory = get_value(<<"history">>, RepRecPropsTgt, []), ?LOG_INFO("Replication records differ. " "Scanning histories to find a common ancestor.", []), ?LOG_DEBUG("Record on source:~p~nRecord on target:~p~n", [RepRecProps, RepRecPropsTgt]), compare_rep_history(SourceHistory, TargetHistory) end. compare_rep_history(S, T) when S =:= [] orelse T =:= [] -> ?LOG_INFO("no common ancestry -- performing full replication", []), {?LOWEST_SEQ, []}; compare_rep_history([{S} | SourceRest], [{T} | TargetRest] = Target) -> SourceId = get_value(<<"session_id">>, S), case has_session_id(SourceId, Target) of true -> RecordSeqNum = get_value(<<"recorded_seq">>, S, ?LOWEST_SEQ), ?LOG_INFO("found a common replication record with source_seq ~p", [RecordSeqNum]), {RecordSeqNum, SourceRest}; false -> TargetId = get_value(<<"session_id">>, T), case has_session_id(TargetId, SourceRest) of true -> RecordSeqNum = get_value(<<"recorded_seq">>, T, ?LOWEST_SEQ), ?LOG_INFO("found a common replication record with source_seq ~p", [RecordSeqNum]), {RecordSeqNum, TargetRest}; false -> compare_rep_history(SourceRest, TargetRest) end end. has_session_id(_SessionId, []) -> false; has_session_id(SessionId, [{Props} | Rest]) -> case get_value(<<"session_id">>, Props, nil) of SessionId -> true; _Else -> has_session_id(SessionId, Rest) end. db_monitor(#db{} = Db) -> couch_db:monitor(Db); db_monitor(_HttpDb) -> nil. source_cur_seq(#rep_state{source = #httpdb{} = Db, source_seq = Seq}) -> case (catch couch_replicator_api_wrap:get_db_info(Db#httpdb{retries = 3})) of {ok, Info} -> get_value(<<"update_seq">>, Info, Seq); _ -> Seq end; source_cur_seq(#rep_state{source = Db, source_seq = Seq}) -> {ok, Info} = couch_replicator_api_wrap:get_db_info(Db), get_value(<<"update_seq">>, Info, Seq). update_task(State) -> #rep_state{ current_through_seq = {_, CurSeq}, source_seq = SourceCurSeq } = State, couch_task_status:update( rep_stats(State) ++ [ {source_seq, SourceCurSeq}, case is_number(CurSeq) andalso is_number(SourceCurSeq) of true -> case SourceCurSeq of 0 -> {progress, 0}; _ -> {progress, (CurSeq * 100) div SourceCurSeq} end; false -> {progress, null} end ]). rep_stats(State) -> #rep_state{ committed_seq = {_, CommittedSeq}, stats = Stats } = State, [ {revisions_checked, Stats#rep_stats.missing_checked}, {missing_revisions_found, Stats#rep_stats.missing_found}, {docs_read, Stats#rep_stats.docs_read}, {docs_written, Stats#rep_stats.docs_written}, {doc_write_failures, Stats#rep_stats.doc_write_failures}, {checkpointed_source_seq, CommittedSeq} ]. apache-couchdb-1.6.0/src/couch_replicator/src/couch_replicator.hrl0000644000175000001440000000144312332105522025257 0ustar00djcusers00000000000000% Licensed under the Apache License, Version 2.0 (the "License"); you may not % use this file except in compliance with the License. You may obtain a copy of % the License at % % http://www.apache.org/licenses/LICENSE-2.0 % % Unless required by applicable law or agreed to in writing, software % distributed under the License is distributed on an "AS IS" BASIS, WITHOUT % WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the % License for the specific language governing permissions and limitations under % the License. -define(REP_ID_VERSION, 3). -record(rep, { id, source, target, options, user_ctx, doc_id }). -record(rep_stats, { missing_checked = 0, missing_found = 0, docs_read = 0, docs_written = 0, doc_write_failures = 0 }). apache-couchdb-1.6.0/src/couch_replicator/src/couch_replicator_js_functions.hrl0000644000175000001440000001361112332105522030043 0ustar00djcusers00000000000000% Licensed under the Apache License, Version 2.0 (the "License"); you may not % use this file except in compliance with the License. You may obtain a copy of % the License at % % http://www.apache.org/licenses/LICENSE-2.0 % % Unless required by applicable law or agreed to in writing, software % distributed under the License is distributed on an "AS IS" BASIS, WITHOUT % WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the % License for the specific language governing permissions and limitations under % the License. -define(REP_DB_DOC_VALIDATE_FUN, <<" function(newDoc, oldDoc, userCtx) { function reportError(error_msg) { log('Error writing document `' + newDoc._id + '\\' to the replicator database: ' + error_msg); throw({forbidden: error_msg}); } function validateEndpoint(endpoint, fieldName) { if ((typeof endpoint !== 'string') && ((typeof endpoint !== 'object') || (endpoint === null))) { reportError('The `' + fieldName + '\\' property must exist' + ' and be either a string or an object.'); } if (typeof endpoint === 'object') { if ((typeof endpoint.url !== 'string') || !endpoint.url) { reportError('The url property must exist in the `' + fieldName + '\\' field and must be a non-empty string.'); } if ((typeof endpoint.auth !== 'undefined') && ((typeof endpoint.auth !== 'object') || endpoint.auth === null)) { reportError('`' + fieldName + '.auth\\' must be a non-null object.'); } if ((typeof endpoint.headers !== 'undefined') && ((typeof endpoint.headers !== 'object') || endpoint.headers === null)) { reportError('`' + fieldName + '.headers\\' must be a non-null object.'); } } } var isReplicator = (userCtx.roles.indexOf('_replicator') >= 0); var isAdmin = (userCtx.roles.indexOf('_admin') >= 0); if (oldDoc && !newDoc._deleted && !isReplicator && (oldDoc._replication_state === 'triggered')) { reportError('Only the replicator can edit replication documents ' + 'that are in the triggered state.'); } if (!newDoc._deleted) { validateEndpoint(newDoc.source, 'source'); validateEndpoint(newDoc.target, 'target'); if ((typeof newDoc.create_target !== 'undefined') && (typeof newDoc.create_target !== 'boolean')) { reportError('The `create_target\\' field must be a boolean.'); } if ((typeof newDoc.continuous !== 'undefined') && (typeof newDoc.continuous !== 'boolean')) { reportError('The `continuous\\' field must be a boolean.'); } if ((typeof newDoc.doc_ids !== 'undefined') && !isArray(newDoc.doc_ids)) { reportError('The `doc_ids\\' field must be an array of strings.'); } if ((typeof newDoc.filter !== 'undefined') && ((typeof newDoc.filter !== 'string') || !newDoc.filter)) { reportError('The `filter\\' field must be a non-empty string.'); } if ((typeof newDoc.query_params !== 'undefined') && ((typeof newDoc.query_params !== 'object') || newDoc.query_params === null)) { reportError('The `query_params\\' field must be an object.'); } if (newDoc.user_ctx) { var user_ctx = newDoc.user_ctx; if ((typeof user_ctx !== 'object') || (user_ctx === null)) { reportError('The `user_ctx\\' property must be a ' + 'non-null object.'); } if (!(user_ctx.name === null || (typeof user_ctx.name === 'undefined') || ((typeof user_ctx.name === 'string') && user_ctx.name.length > 0))) { reportError('The `user_ctx.name\\' property must be a ' + 'non-empty string or null.'); } if (!isAdmin && (user_ctx.name !== userCtx.name)) { reportError('The given `user_ctx.name\\' is not valid'); } if (user_ctx.roles && !isArray(user_ctx.roles)) { reportError('The `user_ctx.roles\\' property must be ' + 'an array of strings.'); } if (!isAdmin && user_ctx.roles) { for (var i = 0; i < user_ctx.roles.length; i++) { var role = user_ctx.roles[i]; if (typeof role !== 'string' || role.length === 0) { reportError('Roles must be non-empty strings.'); } if (userCtx.roles.indexOf(role) === -1) { reportError('Invalid role (`' + role + '\\') in the `user_ctx\\''); } } } } else { if (!isAdmin) { reportError('The `user_ctx\\' property is missing (it is ' + 'optional for admins only).'); } } } else { if (!isAdmin) { if (!oldDoc.user_ctx || (oldDoc.user_ctx.name !== userCtx.name)) { reportError('Replication documents can only be deleted by ' + 'admins or by the users who created them.'); } } } } ">>). apache-couchdb-1.6.0/src/couch_replicator/src/couch_replicator_worker.erl0000644000175000001440000004212712332105522026651 0ustar00djcusers00000000000000% Licensed under the Apache License, Version 2.0 (the "License"); you may not % use this file except in compliance with the License. You may obtain a copy of % the License at % % http://www.apache.org/licenses/LICENSE-2.0 % % Unless required by applicable law or agreed to in writing, software % distributed under the License is distributed on an "AS IS" BASIS, WITHOUT % WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the % License for the specific language governing permissions and limitations under % the License. -module(couch_replicator_worker). -behaviour(gen_server). % public API -export([start_link/5]). % gen_server callbacks -export([init/1, terminate/2, code_change/3]). -export([handle_call/3, handle_cast/2, handle_info/2]). -include("couch_db.hrl"). -include("couch_replicator_api_wrap.hrl"). -include("couch_replicator.hrl"). % TODO: maybe make both buffer max sizes configurable -define(DOC_BUFFER_BYTE_SIZE, 512 * 1024). % for remote targets -define(DOC_BUFFER_LEN, 10). % for local targets, # of documents -define(MAX_BULK_ATT_SIZE, 64 * 1024). -define(MAX_BULK_ATTS_PER_DOC, 8). -define(STATS_DELAY, 10000000). % 10 seconds (in microseconds) -define(inc_stat(StatPos, Stats, Inc), setelement(StatPos, Stats, element(StatPos, Stats) + Inc)). -import(couch_replicator_utils, [ open_db/1, close_db/1, start_db_compaction_notifier/2, stop_db_compaction_notifier/1 ]). -import(couch_util, [ to_binary/1, get_value/2, get_value/3 ]). -record(batch, { docs = [], size = 0 }). -record(state, { cp, loop, max_parallel_conns, source, target, readers = [], writer = nil, pending_fetch = nil, flush_waiter = nil, stats = #rep_stats{}, source_db_compaction_notifier = nil, target_db_compaction_notifier = nil, batch = #batch{} }). start_link(Cp, #db{} = Source, Target, ChangesManager, _MaxConns) -> Pid = spawn_link(fun() -> erlang:put(last_stats_report, now()), queue_fetch_loop(Source, Target, Cp, Cp, ChangesManager) end), {ok, Pid}; start_link(Cp, Source, Target, ChangesManager, MaxConns) -> gen_server:start_link( ?MODULE, {Cp, Source, Target, ChangesManager, MaxConns}, []). init({Cp, Source, Target, ChangesManager, MaxConns}) -> process_flag(trap_exit, true), Parent = self(), LoopPid = spawn_link(fun() -> queue_fetch_loop(Source, Target, Parent, Cp, ChangesManager) end), erlang:put(last_stats_report, now()), State = #state{ cp = Cp, max_parallel_conns = MaxConns, loop = LoopPid, source = open_db(Source), target = open_db(Target), source_db_compaction_notifier = start_db_compaction_notifier(Source, self()), target_db_compaction_notifier = start_db_compaction_notifier(Target, self()) }, {ok, State}. handle_call({fetch_doc, {_Id, _Revs, _PAs} = Params}, {Pid, _} = From, #state{loop = Pid, readers = Readers, pending_fetch = nil, source = Src, target = Tgt, max_parallel_conns = MaxConns} = State) -> case length(Readers) of Size when Size < MaxConns -> Reader = spawn_doc_reader(Src, Tgt, Params), NewState = State#state{ readers = [Reader | Readers] }, {reply, ok, NewState}; _ -> NewState = State#state{ pending_fetch = {From, Params} }, {noreply, NewState} end; handle_call({batch_doc, Doc}, From, State) -> gen_server:reply(From, ok), {noreply, maybe_flush_docs(Doc, State)}; handle_call({add_stats, IncStats}, From, #state{stats = Stats} = State) -> gen_server:reply(From, ok), NewStats = couch_replicator_utils:sum_stats(Stats, IncStats), NewStats2 = maybe_report_stats(State#state.cp, NewStats), {noreply, State#state{stats = NewStats2}}; handle_call(flush, {Pid, _} = From, #state{loop = Pid, writer = nil, flush_waiter = nil, target = Target, batch = Batch} = State) -> State2 = case State#state.readers of [] -> State#state{writer = spawn_writer(Target, Batch)}; _ -> State end, {noreply, State2#state{flush_waiter = From}}. handle_cast({db_compacted, DbName}, #state{source = #db{name = DbName} = Source} = State) -> {ok, NewSource} = couch_db:reopen(Source), {noreply, State#state{source = NewSource}}; handle_cast({db_compacted, DbName}, #state{target = #db{name = DbName} = Target} = State) -> {ok, NewTarget} = couch_db:reopen(Target), {noreply, State#state{target = NewTarget}}; handle_cast(Msg, State) -> {stop, {unexpected_async_call, Msg}, State}. handle_info({'EXIT', Pid, normal}, #state{loop = Pid} = State) -> #state{ batch = #batch{docs = []}, readers = [], writer = nil, pending_fetch = nil, flush_waiter = nil } = State, {stop, normal, State}; handle_info({'EXIT', Pid, normal}, #state{writer = Pid} = State) -> {noreply, after_full_flush(State)}; handle_info({'EXIT', Pid, normal}, #state{writer = nil} = State) -> #state{ readers = Readers, writer = Writer, batch = Batch, source = Source, target = Target, pending_fetch = Fetch, flush_waiter = FlushWaiter } = State, case Readers -- [Pid] of Readers -> {noreply, State}; Readers2 -> State2 = case Fetch of nil -> case (FlushWaiter =/= nil) andalso (Writer =:= nil) andalso (Readers2 =:= []) of true -> State#state{ readers = Readers2, writer = spawn_writer(Target, Batch) }; false -> State#state{readers = Readers2} end; {From, FetchParams} -> Reader = spawn_doc_reader(Source, Target, FetchParams), gen_server:reply(From, ok), State#state{ readers = [Reader | Readers2], pending_fetch = nil } end, {noreply, State2} end; handle_info({'EXIT', Pid, Reason}, State) -> {stop, {process_died, Pid, Reason}, State}. terminate(_Reason, State) -> close_db(State#state.source), close_db(State#state.target), stop_db_compaction_notifier(State#state.source_db_compaction_notifier), stop_db_compaction_notifier(State#state.target_db_compaction_notifier). code_change(_OldVsn, State, _Extra) -> {ok, State}. queue_fetch_loop(Source, Target, Parent, Cp, ChangesManager) -> ChangesManager ! {get_changes, self()}, receive {closed, ChangesManager} -> ok; {changes, ChangesManager, Changes, ReportSeq} -> Target2 = open_db(Target), {IdRevs, Stats0} = find_missing(Changes, Target2), case Source of #db{} -> Source2 = open_db(Source), Stats = local_process_batch( IdRevs, Cp, Source2, Target2, #batch{}, Stats0), close_db(Source2); #httpdb{} -> ok = gen_server:call(Parent, {add_stats, Stats0}, infinity), remote_process_batch(IdRevs, Parent), {ok, Stats} = gen_server:call(Parent, flush, infinity) end, close_db(Target2), ok = gen_server:call(Cp, {report_seq_done, ReportSeq, Stats}, infinity), erlang:put(last_stats_report, now()), ?LOG_DEBUG("Worker reported completion of seq ~p", [ReportSeq]), queue_fetch_loop(Source, Target, Parent, Cp, ChangesManager) end. local_process_batch([], _Cp, _Src, _Tgt, #batch{docs = []}, Stats) -> Stats; local_process_batch([], Cp, Source, Target, #batch{docs = Docs, size = Size}, Stats) -> case Target of #httpdb{} -> ?LOG_DEBUG("Worker flushing doc batch of size ~p bytes", [Size]); #db{} -> ?LOG_DEBUG("Worker flushing doc batch of ~p docs", [Size]) end, Stats2 = flush_docs(Target, Docs), Stats3 = couch_replicator_utils:sum_stats(Stats, Stats2), local_process_batch([], Cp, Source, Target, #batch{}, Stats3); local_process_batch([IdRevs | Rest], Cp, Source, Target, Batch, Stats) -> {ok, {_, DocList, Stats2, _}} = fetch_doc( Source, IdRevs, fun local_doc_handler/2, {Target, [], Stats, Cp}), {Batch2, Stats3} = lists:foldl( fun(Doc, {Batch0, Stats0}) -> {Batch1, S} = maybe_flush_docs(Target, Batch0, Doc), {Batch1, couch_replicator_utils:sum_stats(Stats0, S)} end, {Batch, Stats2}, DocList), local_process_batch(Rest, Cp, Source, Target, Batch2, Stats3). remote_process_batch([], _Parent) -> ok; remote_process_batch([{Id, Revs, PAs} | Rest], Parent) -> % When the source is a remote database, we fetch a single document revision % per HTTP request. This is mostly to facilitate retrying of HTTP requests % due to network transient failures. It also helps not exceeding the maximum % URL length allowed by proxies and Mochiweb. lists:foreach( fun(Rev) -> ok = gen_server:call(Parent, {fetch_doc, {Id, [Rev], PAs}}, infinity) end, Revs), remote_process_batch(Rest, Parent). spawn_doc_reader(Source, Target, FetchParams) -> Parent = self(), spawn_link(fun() -> Source2 = open_db(Source), fetch_doc( Source2, FetchParams, fun remote_doc_handler/2, {Parent, Target}), close_db(Source2) end). fetch_doc(Source, {Id, Revs, PAs}, DocHandler, Acc) -> try couch_replicator_api_wrap:open_doc_revs( Source, Id, Revs, [{atts_since, PAs}, latest], DocHandler, Acc) catch throw:{missing_stub, _} -> ?LOG_ERROR("Retrying fetch and update of document `~s` due to out of " "sync attachment stubs. Missing revisions are: ~s", [Id, couch_doc:revs_to_strs(Revs)]), couch_replicator_api_wrap:open_doc_revs(Source, Id, Revs, [latest], DocHandler, Acc) end. local_doc_handler({ok, Doc}, {Target, DocList, Stats, Cp}) -> Stats2 = ?inc_stat(#rep_stats.docs_read, Stats, 1), case batch_doc(Doc) of true -> {ok, {Target, [Doc | DocList], Stats2, Cp}}; false -> ?LOG_DEBUG("Worker flushing doc with attachments", []), Target2 = open_db(Target), Success = (flush_doc(Target2, Doc) =:= ok), close_db(Target2), Stats3 = case Success of true -> ?inc_stat(#rep_stats.docs_written, Stats2, 1); false -> ?inc_stat(#rep_stats.doc_write_failures, Stats2, 1) end, Stats4 = maybe_report_stats(Cp, Stats3), {ok, {Target, DocList, Stats4, Cp}} end; local_doc_handler(_, Acc) -> {ok, Acc}. remote_doc_handler({ok, #doc{atts = []} = Doc}, {Parent, _} = Acc) -> ok = gen_server:call(Parent, {batch_doc, Doc}, infinity), {ok, Acc}; remote_doc_handler({ok, Doc}, {Parent, Target} = Acc) -> % Immediately flush documents with attachments received from a remote % source. The data property of each attachment is a function that starts % streaming the attachment data from the remote source, therefore it's % convenient to call it ASAP to avoid ibrowse inactivity timeouts. Stats = #rep_stats{docs_read = 1}, ?LOG_DEBUG("Worker flushing doc with attachments", []), Target2 = open_db(Target), Success = (flush_doc(Target2, Doc) =:= ok), close_db(Target2), {Result, Stats2} = case Success of true -> {{ok, Acc}, ?inc_stat(#rep_stats.docs_written, Stats, 1)}; false -> {{skip, Acc}, ?inc_stat(#rep_stats.doc_write_failures, Stats, 1)} end, ok = gen_server:call(Parent, {add_stats, Stats2}, infinity), Result; remote_doc_handler(_, Acc) -> {ok, Acc}. spawn_writer(Target, #batch{docs = DocList, size = Size}) -> case {Target, Size > 0} of {#httpdb{}, true} -> ?LOG_DEBUG("Worker flushing doc batch of size ~p bytes", [Size]); {#db{}, true} -> ?LOG_DEBUG("Worker flushing doc batch of ~p docs", [Size]); _ -> ok end, Parent = self(), spawn_link( fun() -> Target2 = open_db(Target), Stats = flush_docs(Target2, DocList), close_db(Target2), ok = gen_server:call(Parent, {add_stats, Stats}, infinity) end). after_full_flush(#state{stats = Stats, flush_waiter = Waiter} = State) -> gen_server:reply(Waiter, {ok, Stats}), erlang:put(last_stats_report, now()), State#state{ stats = #rep_stats{}, flush_waiter = nil, writer = nil, batch = #batch{} }. maybe_flush_docs(Doc,State) -> #state{ target = Target, batch = Batch, stats = Stats, cp = Cp } = State, {Batch2, WStats} = maybe_flush_docs(Target, Batch, Doc), Stats2 = couch_replicator_utils:sum_stats(Stats, WStats), Stats3 = ?inc_stat(#rep_stats.docs_read, Stats2, 1), Stats4 = maybe_report_stats(Cp, Stats3), State#state{stats = Stats4, batch = Batch2}. maybe_flush_docs(#httpdb{} = Target, Batch, Doc) -> #batch{docs = DocAcc, size = SizeAcc} = Batch, case batch_doc(Doc) of false -> ?LOG_DEBUG("Worker flushing doc with attachments", []), case flush_doc(Target, Doc) of ok -> {Batch, #rep_stats{docs_written = 1}}; _ -> {Batch, #rep_stats{doc_write_failures = 1}} end; true -> JsonDoc = ?JSON_ENCODE(couch_doc:to_json_obj(Doc, [revs, attachments])), case SizeAcc + iolist_size(JsonDoc) of SizeAcc2 when SizeAcc2 > ?DOC_BUFFER_BYTE_SIZE -> ?LOG_DEBUG("Worker flushing doc batch of size ~p bytes", [SizeAcc2]), Stats = flush_docs(Target, [JsonDoc | DocAcc]), {#batch{}, Stats}; SizeAcc2 -> {#batch{docs = [JsonDoc | DocAcc], size = SizeAcc2}, #rep_stats{}} end end; maybe_flush_docs(#db{} = Target, #batch{docs = DocAcc, size = SizeAcc}, Doc) -> case SizeAcc + 1 of SizeAcc2 when SizeAcc2 >= ?DOC_BUFFER_LEN -> ?LOG_DEBUG("Worker flushing doc batch of ~p docs", [SizeAcc2]), Stats = flush_docs(Target, [Doc | DocAcc]), {#batch{}, Stats}; SizeAcc2 -> {#batch{docs = [Doc | DocAcc], size = SizeAcc2}, #rep_stats{}} end. batch_doc(#doc{atts = []}) -> true; batch_doc(#doc{atts = Atts}) -> (length(Atts) =< ?MAX_BULK_ATTS_PER_DOC) andalso lists:all( fun(#att{disk_len = L, data = Data}) -> (L =< ?MAX_BULK_ATT_SIZE) andalso (Data =/= stub) end, Atts). flush_docs(_Target, []) -> #rep_stats{}; flush_docs(Target, DocList) -> {ok, Errors} = couch_replicator_api_wrap:update_docs( Target, DocList, [delay_commit], replicated_changes), DbUri = couch_replicator_api_wrap:db_uri(Target), lists:foreach( fun({Props}) -> ?LOG_ERROR("Replicator: couldn't write document `~s`, revision `~s`," " to target database `~s`. Error: `~s`, reason: `~s`.", [get_value(id, Props, ""), get_value(rev, Props, ""), DbUri, get_value(error, Props, ""), get_value(reason, Props, "")]) end, Errors), #rep_stats{ docs_written = length(DocList) - length(Errors), doc_write_failures = length(Errors) }. flush_doc(Target, #doc{id = Id, revs = {Pos, [RevId | _]}} = Doc) -> try couch_replicator_api_wrap:update_doc(Target, Doc, [], replicated_changes) of {ok, _} -> ok; Error -> ?LOG_ERROR("Replicator: error writing document `~s` to `~s`: ~s", [Id, couch_replicator_api_wrap:db_uri(Target), couch_util:to_binary(Error)]), Error catch throw:{missing_stub, _} = MissingStub -> throw(MissingStub); throw:{Error, Reason} -> ?LOG_ERROR("Replicator: couldn't write document `~s`, revision `~s`," " to target database `~s`. Error: `~s`, reason: `~s`.", [Id, couch_doc:rev_to_str({Pos, RevId}), couch_replicator_api_wrap:db_uri(Target), to_binary(Error), to_binary(Reason)]), {error, Error}; throw:Err -> ?LOG_ERROR("Replicator: couldn't write document `~s`, revision `~s`," " to target database `~s`. Error: `~s`.", [Id, couch_doc:rev_to_str({Pos, RevId}), couch_replicator_api_wrap:db_uri(Target), to_binary(Err)]), {error, Err} end. find_missing(DocInfos, Target) -> {IdRevs, AllRevsCount} = lists:foldr( fun(#doc_info{id = Id, revs = RevsInfo}, {IdRevAcc, CountAcc}) -> Revs = [Rev || #rev_info{rev = Rev} <- RevsInfo], {[{Id, Revs} | IdRevAcc], CountAcc + length(Revs)} end, {[], 0}, DocInfos), {ok, Missing} = couch_replicator_api_wrap:get_missing_revs(Target, IdRevs), MissingRevsCount = lists:foldl( fun({_Id, MissingRevs, _PAs}, Acc) -> Acc + length(MissingRevs) end, 0, Missing), Stats = #rep_stats{ missing_checked = AllRevsCount, missing_found = MissingRevsCount }, {Missing, Stats}. maybe_report_stats(Cp, Stats) -> Now = now(), case timer:now_diff(erlang:get(last_stats_report), Now) >= ?STATS_DELAY of true -> ok = gen_server:call(Cp, {add_stats, Stats}, infinity), erlang:put(last_stats_report, Now), #rep_stats{}; false -> Stats end. apache-couchdb-1.6.0/src/couch_replicator/src/couch_replicator_httpc_pool.erl0000644000175000001440000000756612332105522027523 0ustar00djcusers00000000000000% Licensed under the Apache License, Version 2.0 (the "License"); you may not % use this file except in compliance with the License. You may obtain a copy of % the License at % % http://www.apache.org/licenses/LICENSE-2.0 % % Unless required by applicable law or agreed to in writing, software % distributed under the License is distributed on an "AS IS" BASIS, WITHOUT % WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the % License for the specific language governing permissions and limitations under % the License. -module(couch_replicator_httpc_pool). -behaviour(gen_server). % public API -export([start_link/2, stop/1]). -export([get_worker/1, release_worker/2]). % gen_server API -export([init/1, handle_call/3, handle_info/2, handle_cast/2]). -export([code_change/3, terminate/2]). -include("couch_db.hrl"). -import(couch_util, [ get_value/2, get_value/3 ]). -record(state, { url, limit, % max # of workers allowed free = [], % free workers (connections) busy = [], % busy workers (connections) waiting = queue:new() % blocked clients waiting for a worker }). start_link(Url, Options) -> gen_server:start_link(?MODULE, {Url, Options}, []). stop(Pool) -> ok = gen_server:call(Pool, stop, infinity). get_worker(Pool) -> {ok, _Worker} = gen_server:call(Pool, get_worker, infinity). release_worker(Pool, Worker) -> ok = gen_server:cast(Pool, {release_worker, Worker}). init({Url, Options}) -> process_flag(trap_exit, true), State = #state{ url = Url, limit = get_value(max_connections, Options) }, {ok, State}. handle_call(get_worker, From, #state{waiting = Waiting} = State) -> #state{url = Url, limit = Limit, busy = Busy, free = Free} = State, case length(Busy) >= Limit of true -> {noreply, State#state{waiting = queue:in(From, Waiting)}}; false -> case Free of [] -> {ok, Worker} = ibrowse:spawn_link_worker_process(Url), Free2 = Free; [Worker | Free2] -> ok end, NewState = State#state{free = Free2, busy = [Worker | Busy]}, {reply, {ok, Worker}, NewState} end; handle_call(stop, _From, State) -> {stop, normal, ok, State}. handle_cast({release_worker, Worker}, #state{waiting = Waiting} = State) -> case is_process_alive(Worker) andalso lists:member(Worker, State#state.busy) of true -> case queue:out(Waiting) of {empty, Waiting2} -> Busy2 = State#state.busy -- [Worker], Free2 = [Worker | State#state.free]; {{value, From}, Waiting2} -> gen_server:reply(From, {ok, Worker}), Busy2 = State#state.busy, Free2 = State#state.free end, NewState = State#state{ busy = Busy2, free = Free2, waiting = Waiting2 }, {noreply, NewState}; false -> {noreply, State} end. handle_info({'EXIT', Pid, _Reason}, #state{busy = Busy, free = Free} = State) -> case Free -- [Pid] of Free -> case Busy -- [Pid] of Busy -> {noreply, State}; Busy2 -> case queue:out(State#state.waiting) of {empty, _} -> {noreply, State#state{busy = Busy2}}; {{value, From}, Waiting2} -> {ok, Worker} = ibrowse:spawn_link_worker_process(State#state.url), gen_server:reply(From, {ok, Worker}), {noreply, State#state{busy = [Worker | Busy2], waiting = Waiting2}} end end; Free2 -> {noreply, State#state{free = Free2}} end. code_change(_OldVsn, State, _Extra) -> {ok, State}. terminate(_Reason, State) -> lists:foreach(fun ibrowse_http_client:stop/1, State#state.free), lists:foreach(fun ibrowse_http_client:stop/1, State#state.busy). apache-couchdb-1.6.0/src/couch_replicator/src/couch_replicator_utils.erl0000644000175000001440000003545112332105522026502 0ustar00djcusers00000000000000% Licensed under the Apache License, Version 2.0 (the "License"); you may not % use this file except in compliance with the License. You may obtain a copy of % the License at % % http://www.apache.org/licenses/LICENSE-2.0 % % Unless required by applicable law or agreed to in writing, software % distributed under the License is distributed on an "AS IS" BASIS, WITHOUT % WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the % License for the specific language governing permissions and limitations under % the License. -module(couch_replicator_utils). -export([parse_rep_doc/2]). -export([open_db/1, close_db/1]). -export([start_db_compaction_notifier/2, stop_db_compaction_notifier/1]). -export([replication_id/2]). -export([sum_stats/2]). -include("couch_db.hrl"). -include("couch_replicator_api_wrap.hrl"). -include("couch_replicator.hrl"). -include("../ibrowse/ibrowse.hrl"). -import(couch_util, [ get_value/2, get_value/3 ]). parse_rep_doc({Props}, UserCtx) -> ProxyParams = parse_proxy_params(get_value(<<"proxy">>, Props, <<>>)), Options = make_options(Props), case get_value(cancel, Options, false) andalso (get_value(id, Options, nil) =/= nil) of true -> {ok, #rep{options = Options, user_ctx = UserCtx}}; false -> Source = parse_rep_db(get_value(<<"source">>, Props), ProxyParams, Options), Target = parse_rep_db(get_value(<<"target">>, Props), ProxyParams, Options), Rep = #rep{ source = Source, target = Target, options = Options, user_ctx = UserCtx, doc_id = get_value(<<"_id">>, Props, null) }, {ok, Rep#rep{id = replication_id(Rep)}} end. replication_id(#rep{options = Options} = Rep) -> BaseId = replication_id(Rep, ?REP_ID_VERSION), {BaseId, maybe_append_options([continuous, create_target], Options)}. % Versioned clauses for generating replication IDs. % If a change is made to how replications are identified, % please add a new clause and increase ?REP_ID_VERSION. replication_id(#rep{user_ctx = UserCtx} = Rep, 3) -> UUID = couch_server:get_uuid(), Src = get_rep_endpoint(UserCtx, Rep#rep.source), Tgt = get_rep_endpoint(UserCtx, Rep#rep.target), maybe_append_filters([UUID, Src, Tgt], Rep); replication_id(#rep{user_ctx = UserCtx} = Rep, 2) -> {ok, HostName} = inet:gethostname(), Port = case (catch mochiweb_socket_server:get(couch_httpd, port)) of P when is_number(P) -> P; _ -> % On restart we might be called before the couch_httpd process is % started. % TODO: we might be under an SSL socket server only, or both under % SSL and a non-SSL socket. % ... mochiweb_socket_server:get(https, port) list_to_integer(couch_config:get("httpd", "port", "5984")) end, Src = get_rep_endpoint(UserCtx, Rep#rep.source), Tgt = get_rep_endpoint(UserCtx, Rep#rep.target), maybe_append_filters([HostName, Port, Src, Tgt], Rep); replication_id(#rep{user_ctx = UserCtx} = Rep, 1) -> {ok, HostName} = inet:gethostname(), Src = get_rep_endpoint(UserCtx, Rep#rep.source), Tgt = get_rep_endpoint(UserCtx, Rep#rep.target), maybe_append_filters([HostName, Src, Tgt], Rep). maybe_append_filters(Base, #rep{source = Source, user_ctx = UserCtx, options = Options}) -> Base2 = Base ++ case get_value(filter, Options) of undefined -> case get_value(doc_ids, Options) of undefined -> []; DocIds -> [DocIds] end; Filter -> [filter_code(Filter, Source, UserCtx), get_value(query_params, Options, {[]})] end, couch_util:to_hex(couch_util:md5(term_to_binary(Base2))). filter_code(Filter, Source, UserCtx) -> {DDocName, FilterName} = case re:run(Filter, "(.*?)/(.*)", [{capture, [1, 2], binary}]) of {match, [DDocName0, FilterName0]} -> {DDocName0, FilterName0}; _ -> throw({error, <<"Invalid filter. Must match `ddocname/filtername`.">>}) end, Db = case (catch couch_replicator_api_wrap:db_open(Source, [{user_ctx, UserCtx}])) of {ok, Db0} -> Db0; DbError -> DbErrorMsg = io_lib:format("Could not open source database `~s`: ~s", [couch_replicator_api_wrap:db_uri(Source), couch_util:to_binary(DbError)]), throw({error, iolist_to_binary(DbErrorMsg)}) end, try Body = case (catch couch_replicator_api_wrap:open_doc( Db, <<"_design/", DDocName/binary>>, [ejson_body])) of {ok, #doc{body = Body0}} -> Body0; DocError -> DocErrorMsg = io_lib:format( "Couldn't open document `_design/~s` from source " "database `~s`: ~s", [DDocName, couch_replicator_api_wrap:db_uri(Source), couch_util:to_binary(DocError)]), throw({error, iolist_to_binary(DocErrorMsg)}) end, Code = couch_util:get_nested_json_value( Body, [<<"filters">>, FilterName]), re:replace(Code, [$^, "\s*(.*?)\s*", $$], "\\1", [{return, binary}]) after couch_replicator_api_wrap:db_close(Db) end. maybe_append_options(Options, RepOptions) -> lists:foldl(fun(Option, Acc) -> Acc ++ case get_value(Option, RepOptions, false) of true -> "+" ++ atom_to_list(Option); false -> "" end end, [], Options). get_rep_endpoint(_UserCtx, #httpdb{url=Url, headers=Headers, oauth=OAuth}) -> DefaultHeaders = (#httpdb{})#httpdb.headers, case OAuth of nil -> {remote, Url, Headers -- DefaultHeaders}; #oauth{} -> {remote, Url, Headers -- DefaultHeaders, OAuth} end; get_rep_endpoint(UserCtx, <>) -> {local, DbName, UserCtx}. parse_rep_db({Props}, ProxyParams, Options) -> Url = maybe_add_trailing_slash(get_value(<<"url">>, Props)), {AuthProps} = get_value(<<"auth">>, Props, {[]}), {BinHeaders} = get_value(<<"headers">>, Props, {[]}), Headers = lists:ukeysort(1, [{?b2l(K), ?b2l(V)} || {K, V} <- BinHeaders]), DefaultHeaders = (#httpdb{})#httpdb.headers, OAuth = case get_value(<<"oauth">>, AuthProps) of undefined -> nil; {OauthProps} -> #oauth{ consumer_key = ?b2l(get_value(<<"consumer_key">>, OauthProps)), token = ?b2l(get_value(<<"token">>, OauthProps)), token_secret = ?b2l(get_value(<<"token_secret">>, OauthProps)), consumer_secret = ?b2l(get_value(<<"consumer_secret">>, OauthProps)), signature_method = case get_value(<<"signature_method">>, OauthProps) of undefined -> hmac_sha1; <<"PLAINTEXT">> -> plaintext; <<"HMAC-SHA1">> -> hmac_sha1; <<"RSA-SHA1">> -> rsa_sha1 end } end, #httpdb{ url = Url, oauth = OAuth, headers = lists:ukeymerge(1, Headers, DefaultHeaders), ibrowse_options = lists:keysort(1, [{socket_options, get_value(socket_options, Options)} | ProxyParams ++ ssl_params(Url)]), timeout = get_value(connection_timeout, Options), http_connections = get_value(http_connections, Options), retries = get_value(retries, Options) }; parse_rep_db(<<"http://", _/binary>> = Url, ProxyParams, Options) -> parse_rep_db({[{<<"url">>, Url}]}, ProxyParams, Options); parse_rep_db(<<"https://", _/binary>> = Url, ProxyParams, Options) -> parse_rep_db({[{<<"url">>, Url}]}, ProxyParams, Options); parse_rep_db(<>, _ProxyParams, _Options) -> DbName. maybe_add_trailing_slash(Url) when is_binary(Url) -> maybe_add_trailing_slash(?b2l(Url)); maybe_add_trailing_slash(Url) -> case lists:last(Url) of $/ -> Url; _ -> Url ++ "/" end. make_options(Props) -> Options = lists:ukeysort(1, convert_options(Props)), DefWorkers = couch_config:get("replicator", "worker_processes", "4"), DefBatchSize = couch_config:get("replicator", "worker_batch_size", "500"), DefConns = couch_config:get("replicator", "http_connections", "20"), DefTimeout = couch_config:get("replicator", "connection_timeout", "30000"), DefRetries = couch_config:get("replicator", "retries_per_request", "10"), UseCheckpoints = couch_config:get("replicator", "use_checkpoints", "true"), DefCheckpointInterval = couch_config:get("replicator", "checkpoint_interval", "5000"), {ok, DefSocketOptions} = couch_util:parse_term( couch_config:get("replicator", "socket_options", "[{keepalive, true}, {nodelay, false}]")), lists:ukeymerge(1, Options, lists:keysort(1, [ {connection_timeout, list_to_integer(DefTimeout)}, {retries, list_to_integer(DefRetries)}, {http_connections, list_to_integer(DefConns)}, {socket_options, DefSocketOptions}, {worker_batch_size, list_to_integer(DefBatchSize)}, {worker_processes, list_to_integer(DefWorkers)}, {use_checkpoints, list_to_existing_atom(UseCheckpoints)}, {checkpoint_interval, list_to_integer(DefCheckpointInterval)} ])). convert_options([])-> []; convert_options([{<<"cancel">>, V} | R]) -> [{cancel, V} | convert_options(R)]; convert_options([{IdOpt, V} | R]) when IdOpt =:= <<"_local_id">>; IdOpt =:= <<"replication_id">>; IdOpt =:= <<"id">> -> Id = lists:splitwith(fun(X) -> X =/= $+ end, ?b2l(V)), [{id, Id} | convert_options(R)]; convert_options([{<<"create_target">>, V} | R]) -> [{create_target, V} | convert_options(R)]; convert_options([{<<"continuous">>, V} | R]) -> [{continuous, V} | convert_options(R)]; convert_options([{<<"filter">>, V} | R]) -> [{filter, V} | convert_options(R)]; convert_options([{<<"query_params">>, V} | R]) -> [{query_params, V} | convert_options(R)]; convert_options([{<<"doc_ids">>, null} | R]) -> convert_options(R); convert_options([{<<"doc_ids">>, V} | R]) -> % Ensure same behaviour as old replicator: accept a list of percent % encoded doc IDs. DocIds = [?l2b(couch_httpd:unquote(Id)) || Id <- V], [{doc_ids, DocIds} | convert_options(R)]; convert_options([{<<"worker_processes">>, V} | R]) -> [{worker_processes, couch_util:to_integer(V)} | convert_options(R)]; convert_options([{<<"worker_batch_size">>, V} | R]) -> [{worker_batch_size, couch_util:to_integer(V)} | convert_options(R)]; convert_options([{<<"http_connections">>, V} | R]) -> [{http_connections, couch_util:to_integer(V)} | convert_options(R)]; convert_options([{<<"connection_timeout">>, V} | R]) -> [{connection_timeout, couch_util:to_integer(V)} | convert_options(R)]; convert_options([{<<"retries_per_request">>, V} | R]) -> [{retries, couch_util:to_integer(V)} | convert_options(R)]; convert_options([{<<"socket_options">>, V} | R]) -> {ok, SocketOptions} = couch_util:parse_term(V), [{socket_options, SocketOptions} | convert_options(R)]; convert_options([{<<"since_seq">>, V} | R]) -> [{since_seq, V} | convert_options(R)]; convert_options([{<<"use_checkpoints">>, V} | R]) -> [{use_checkpoints, V} | convert_options(R)]; convert_options([{<<"checkpoint_interval">>, V} | R]) -> [{checkpoint_interval, couch_util:to_integer(V)} | convert_options(R)]; convert_options([_ | R]) -> % skip unknown option convert_options(R). parse_proxy_params(ProxyUrl) when is_binary(ProxyUrl) -> parse_proxy_params(?b2l(ProxyUrl)); parse_proxy_params([]) -> []; parse_proxy_params(ProxyUrl) -> #url{ host = Host, port = Port, username = User, password = Passwd, protocol = Protocol } = ibrowse_lib:parse_url(ProxyUrl), [{proxy_protocol, Protocol}, {proxy_host, Host}, {proxy_port, Port}] ++ case is_list(User) andalso is_list(Passwd) of false -> []; true -> [{proxy_user, User}, {proxy_password, Passwd}] end. ssl_params(Url) -> case ibrowse_lib:parse_url(Url) of #url{protocol = https} -> Depth = list_to_integer( couch_config:get("replicator", "ssl_certificate_max_depth", "3") ), VerifyCerts = couch_config:get("replicator", "verify_ssl_certificates"), CertFile = couch_config:get("replicator", "cert_file", nil), KeyFile = couch_config:get("replicator", "key_file", nil), Password = couch_config:get("replicator", "password", nil), SslOpts = [{depth, Depth} | ssl_verify_options(VerifyCerts =:= "true")], SslOpts1 = case CertFile /= nil andalso KeyFile /= nil of true -> case Password of nil -> [{certfile, CertFile}, {keyfile, KeyFile}] ++ SslOpts; _ -> [{certfile, CertFile}, {keyfile, KeyFile}, {password, Password}] ++ SslOpts end; false -> SslOpts end, [{is_ssl, true}, {ssl_options, SslOpts1}]; #url{protocol = http} -> [] end. ssl_verify_options(Value) -> ssl_verify_options(Value, erlang:system_info(otp_release)). ssl_verify_options(true, OTPVersion) when OTPVersion >= "R14" -> CAFile = couch_config:get("replicator", "ssl_trusted_certificates_file"), [{verify, verify_peer}, {cacertfile, CAFile}]; ssl_verify_options(false, OTPVersion) when OTPVersion >= "R14" -> [{verify, verify_none}]; ssl_verify_options(true, _OTPVersion) -> CAFile = couch_config:get("replicator", "ssl_trusted_certificates_file"), [{verify, 2}, {cacertfile, CAFile}]; ssl_verify_options(false, _OTPVersion) -> [{verify, 0}]. open_db(#db{name = Name, user_ctx = UserCtx, options = Options}) -> {ok, Db} = couch_db:open(Name, [{user_ctx, UserCtx} | Options]), Db; open_db(HttpDb) -> HttpDb. close_db(#db{} = Db) -> couch_db:close(Db); close_db(_HttpDb) -> ok. start_db_compaction_notifier(#db{name = DbName}, Server) -> {ok, Notifier} = couch_db_update_notifier:start_link( fun({compacted, DbName1}) when DbName1 =:= DbName -> ok = gen_server:cast(Server, {db_compacted, DbName}); (_) -> ok end), Notifier; start_db_compaction_notifier(_, _) -> nil. stop_db_compaction_notifier(nil) -> ok; stop_db_compaction_notifier(Notifier) -> couch_db_update_notifier:stop(Notifier). sum_stats(#rep_stats{} = S1, #rep_stats{} = S2) -> #rep_stats{ missing_checked = S1#rep_stats.missing_checked + S2#rep_stats.missing_checked, missing_found = S1#rep_stats.missing_found + S2#rep_stats.missing_found, docs_read = S1#rep_stats.docs_read + S2#rep_stats.docs_read, docs_written = S1#rep_stats.docs_written + S2#rep_stats.docs_written, doc_write_failures = S1#rep_stats.doc_write_failures + S2#rep_stats.doc_write_failures }. apache-couchdb-1.6.0/src/couch_replicator/src/couch_replicator_notifier.erl0000644000175000001440000000271312332105522027154 0ustar00djcusers00000000000000% Licensed under the Apache License, Version 2.0 (the "License"); you may not % use this file except in compliance with the License. You may obtain a copy of % the License at % % http://www.apache.org/licenses/LICENSE-2.0 % % Unless required by applicable law or agreed to in writing, software % distributed under the License is distributed on an "AS IS" BASIS, WITHOUT % WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the % License for the specific language governing permissions and limitations under % the License. -module(couch_replicator_notifier). -behaviour(gen_event). % public API -export([start_link/1, stop/1, notify/1]). % gen_event callbacks -export([init/1, terminate/2, code_change/3]). -export([handle_event/2, handle_call/2, handle_info/2]). -include("couch_db.hrl"). start_link(FunAcc) -> couch_event_sup:start_link(couch_replication, {couch_replicator_notifier, make_ref()}, FunAcc). notify(Event) -> gen_event:notify(couch_replication, Event). stop(Pid) -> couch_event_sup:stop(Pid). init(FunAcc) -> {ok, FunAcc}. terminate(_Reason, _State) -> ok. handle_event(Event, Fun) when is_function(Fun, 1) -> Fun(Event), {ok, Fun}; handle_event(Event, {Fun, Acc}) when is_function(Fun, 2) -> Acc2 = Fun(Event, Acc), {ok, {Fun, Acc2}}. handle_call(_Msg, State) -> {reply, ok, State}. handle_info(_Msg, State) -> {ok, State}. code_change(_OldVsn, State, _Extra) -> {ok, State}. apache-couchdb-1.6.0/src/couch_replicator/src/couch_replicator_httpc.erl0000644000175000001440000002510412332105522026456 0ustar00djcusers00000000000000% Licensed under the Apache License, Version 2.0 (the "License"); you may not % use this file except in compliance with the License. You may obtain a copy of % the License at % % http://www.apache.org/licenses/LICENSE-2.0 % % Unless required by applicable law or agreed to in writing, software % distributed under the License is distributed on an "AS IS" BASIS, WITHOUT % WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the % License for the specific language governing permissions and limitations under % the License. -module(couch_replicator_httpc). -include("couch_db.hrl"). -include("couch_replicator_api_wrap.hrl"). -include("../ibrowse/ibrowse.hrl"). -export([setup/1]). -export([send_req/3]). -export([full_url/2]). -import(couch_util, [ get_value/2, get_value/3 ]). -define(replace(L, K, V), lists:keystore(K, 1, L, {K, V})). -define(MAX_WAIT, 5 * 60 * 1000). setup(#httpdb{httpc_pool = nil, url = Url, http_connections = MaxConns} = Db) -> {ok, Pid} = couch_replicator_httpc_pool:start_link(Url, [{max_connections, MaxConns}]), {ok, Db#httpdb{httpc_pool = Pid}}. send_req(HttpDb, Params1, Callback) -> Params2 = ?replace(Params1, qs, [{K, ?b2l(iolist_to_binary(V))} || {K, V} <- get_value(qs, Params1, [])]), Params = ?replace(Params2, ibrowse_options, lists:keysort(1, get_value(ibrowse_options, Params2, []))), {Worker, Response} = send_ibrowse_req(HttpDb, Params), process_response(Response, Worker, HttpDb, Params, Callback). send_ibrowse_req(#httpdb{headers = BaseHeaders} = HttpDb, Params) -> Method = get_value(method, Params, get), UserHeaders = lists:keysort(1, get_value(headers, Params, [])), Headers1 = lists:ukeymerge(1, UserHeaders, BaseHeaders), Headers2 = oauth_header(HttpDb, Params) ++ Headers1, Url = full_url(HttpDb, Params), Body = get_value(body, Params, []), case get_value(path, Params) of "_changes" -> {ok, Worker} = ibrowse:spawn_link_worker_process(Url); _ -> {ok, Worker} = couch_replicator_httpc_pool:get_worker(HttpDb#httpdb.httpc_pool) end, IbrowseOptions = [ {response_format, binary}, {inactivity_timeout, HttpDb#httpdb.timeout} | lists:ukeymerge(1, get_value(ibrowse_options, Params, []), HttpDb#httpdb.ibrowse_options) ], Response = ibrowse:send_req_direct( Worker, Url, Headers2, Method, Body, IbrowseOptions, infinity), {Worker, Response}. process_response({error, sel_conn_closed}, _Worker, HttpDb, Params, Callback) -> send_req(HttpDb, Params, Callback); process_response({error, {'EXIT', {normal, _}}}, _Worker, HttpDb, Params, Cb) -> % ibrowse worker terminated because remote peer closed the socket % -> not an error send_req(HttpDb, Params, Cb); process_response({ibrowse_req_id, ReqId}, Worker, HttpDb, Params, Callback) -> process_stream_response(ReqId, Worker, HttpDb, Params, Callback); process_response({ok, Code, Headers, Body}, Worker, HttpDb, Params, Callback) -> release_worker(Worker, HttpDb), case list_to_integer(Code) of Ok when (Ok >= 200 andalso Ok < 300) ; (Ok >= 400 andalso Ok < 500) -> EJson = case Body of <<>> -> null; Json -> ?JSON_DECODE(Json) end, Callback(Ok, Headers, EJson); R when R =:= 301 ; R =:= 302 ; R =:= 303 -> do_redirect(Worker, R, Headers, HttpDb, Params, Callback); Error -> maybe_retry({code, Error}, Worker, HttpDb, Params, Callback) end; process_response(Error, Worker, HttpDb, Params, Callback) -> maybe_retry(Error, Worker, HttpDb, Params, Callback). process_stream_response(ReqId, Worker, HttpDb, Params, Callback) -> receive {ibrowse_async_headers, ReqId, Code, Headers} -> case list_to_integer(Code) of Ok when (Ok >= 200 andalso Ok < 300) ; (Ok >= 400 andalso Ok < 500) -> StreamDataFun = fun() -> stream_data_self(HttpDb, Params, Worker, ReqId, Callback) end, ibrowse:stream_next(ReqId), try Ret = Callback(Ok, Headers, StreamDataFun), release_worker(Worker, HttpDb), clean_mailbox_req(ReqId), Ret catch throw:{maybe_retry_req, Err} -> clean_mailbox_req(ReqId), maybe_retry(Err, Worker, HttpDb, Params, Callback) end; R when R =:= 301 ; R =:= 302 ; R =:= 303 -> do_redirect(Worker, R, Headers, HttpDb, Params, Callback); Error -> report_error(Worker, HttpDb, Params, {code, Error}) end; {ibrowse_async_response, ReqId, {error, _} = Error} -> maybe_retry(Error, Worker, HttpDb, Params, Callback) after HttpDb#httpdb.timeout + 500 -> % Note: ibrowse should always reply with timeouts, but this doesn't % seem to be always true when there's a very high rate of requests % and many open connections. maybe_retry(timeout, Worker, HttpDb, Params, Callback) end. clean_mailbox_req(ReqId) -> receive {ibrowse_async_response, ReqId, _} -> clean_mailbox_req(ReqId); {ibrowse_async_response_end, ReqId} -> clean_mailbox_req(ReqId) after 0 -> ok end. release_worker(Worker, #httpdb{httpc_pool = Pool}) -> ok = couch_replicator_httpc_pool:release_worker(Pool, Worker). maybe_retry(Error, Worker, #httpdb{retries = 0} = HttpDb, Params, _Cb) -> report_error(Worker, HttpDb, Params, {error, Error}); maybe_retry(Error, Worker, #httpdb{retries = Retries, wait = Wait} = HttpDb, Params, Cb) -> release_worker(Worker, HttpDb), Method = string:to_upper(atom_to_list(get_value(method, Params, get))), Url = couch_util:url_strip_password(full_url(HttpDb, Params)), ?LOG_INFO("Retrying ~s request to ~s in ~p seconds due to error ~s", [Method, Url, Wait / 1000, error_cause(Error)]), ok = timer:sleep(Wait), Wait2 = erlang:min(Wait * 2, ?MAX_WAIT), send_req(HttpDb#httpdb{retries = Retries - 1, wait = Wait2}, Params, Cb). report_error(Worker, HttpDb, Params, Error) -> Method = string:to_upper(atom_to_list(get_value(method, Params, get))), Url = couch_util:url_strip_password(full_url(HttpDb, Params)), do_report_error(Url, Method, Error), release_worker(Worker, HttpDb), exit({http_request_failed, Method, Url, Error}). do_report_error(Url, Method, {code, Code}) -> ?LOG_ERROR("Replicator, request ~s to ~p failed. The received " "HTTP error code is ~p", [Method, Url, Code]); do_report_error(FullUrl, Method, Error) -> ?LOG_ERROR("Replicator, request ~s to ~p failed due to error ~s", [Method, FullUrl, error_cause(Error)]). error_cause({error, Cause}) -> lists:flatten(io_lib:format("~p", [Cause])); error_cause(Cause) -> lists:flatten(io_lib:format("~p", [Cause])). stream_data_self(#httpdb{timeout = T} = HttpDb, Params, Worker, ReqId, Cb) -> case accumulate_messages(ReqId, [], T + 500) of {Data, ibrowse_async_response} -> ibrowse:stream_next(ReqId), {Data, fun() -> stream_data_self(HttpDb, Params, Worker, ReqId, Cb) end}; {Data, ibrowse_async_response_end} -> {Data, fun() -> throw({maybe_retry_req, more_data_expected}) end} end. accumulate_messages(ReqId, Acc, Timeout) -> receive {ibrowse_async_response, ReqId, {error, Error}} -> throw({maybe_retry_req, Error}); {ibrowse_async_response, ReqId, <<>>} -> accumulate_messages(ReqId, Acc, Timeout); {ibrowse_async_response, ReqId, Data} -> accumulate_messages(ReqId, [Data | Acc], 0); {ibrowse_async_response_end, ReqId} -> {iolist_to_binary(lists:reverse(Acc)), ibrowse_async_response_end} after Timeout -> % Note: ibrowse should always reply with timeouts, but this doesn't % seem to be always true when there's a very high rate of requests % and many open connections. if Acc =:= [] -> throw({maybe_retry_req, timeout}); true -> {iolist_to_binary(lists:reverse(Acc)), ibrowse_async_response} end end. full_url(#httpdb{url = BaseUrl}, Params) -> Path = get_value(path, Params, []), QueryArgs = get_value(qs, Params, []), BaseUrl ++ Path ++ query_args_to_string(QueryArgs, []). query_args_to_string([], []) -> ""; query_args_to_string([], Acc) -> "?" ++ string:join(lists:reverse(Acc), "&"); query_args_to_string([{K, V} | Rest], Acc) -> query_args_to_string(Rest, [K ++ "=" ++ couch_httpd:quote(V) | Acc]). oauth_header(#httpdb{oauth = nil}, _ConnParams) -> []; oauth_header(#httpdb{url = BaseUrl, oauth = OAuth}, ConnParams) -> Consumer = { OAuth#oauth.consumer_key, OAuth#oauth.consumer_secret, OAuth#oauth.signature_method }, Method = case get_value(method, ConnParams, get) of get -> "GET"; post -> "POST"; put -> "PUT"; head -> "HEAD" end, QSL = get_value(qs, ConnParams, []), OAuthParams = oauth:sign(Method, BaseUrl ++ get_value(path, ConnParams, []), QSL, Consumer, OAuth#oauth.token, OAuth#oauth.token_secret) -- QSL, [{"Authorization", "OAuth " ++ oauth:header_params_encode(OAuthParams)}]. do_redirect(Worker, Code, Headers, #httpdb{url = Url} = HttpDb, Params, Cb) -> release_worker(Worker, HttpDb), RedirectUrl = redirect_url(Headers, Url), {HttpDb2, Params2} = after_redirect(RedirectUrl, Code, HttpDb, Params), send_req(HttpDb2, Params2, Cb). redirect_url(RespHeaders, OrigUrl) -> MochiHeaders = mochiweb_headers:make(RespHeaders), RedUrl = mochiweb_headers:get_value("Location", MochiHeaders), #url{ host = Host, host_type = HostType, port = Port, path = Path, % includes query string protocol = Proto } = ibrowse_lib:parse_url(RedUrl), #url{ username = User, password = Passwd } = ibrowse_lib:parse_url(OrigUrl), Creds = case is_list(User) andalso is_list(Passwd) of true -> User ++ ":" ++ Passwd ++ "@"; false -> [] end, HostPart = case HostType of ipv6_address -> "[" ++ Host ++ "]"; _ -> Host end, atom_to_list(Proto) ++ "://" ++ Creds ++ HostPart ++ ":" ++ integer_to_list(Port) ++ Path. after_redirect(RedirectUrl, 303, HttpDb, Params) -> after_redirect(RedirectUrl, HttpDb, ?replace(Params, method, get)); after_redirect(RedirectUrl, _Code, HttpDb, Params) -> after_redirect(RedirectUrl, HttpDb, Params). after_redirect(RedirectUrl, HttpDb, Params) -> Params2 = lists:keydelete(path, 1, lists:keydelete(qs, 1, Params)), {HttpDb#httpdb{url = RedirectUrl}, Params2}. apache-couchdb-1.6.0/src/couch_replicator/src/couch_replicator_httpd.erl0000644000175000001440000000422112332105522026454 0ustar00djcusers00000000000000% Licensed under the Apache License, Version 2.0 (the "License"); you may not % use this file except in compliance with the License. You may obtain a copy of % the License at % % http://www.apache.org/licenses/LICENSE-2.0 % % Unless required by applicable law or agreed to in writing, software % distributed under the License is distributed on an "AS IS" BASIS, WITHOUT % WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the % License for the specific language governing permissions and limitations under % the License. -module(couch_replicator_httpd). -include("couch_db.hrl"). -import(couch_httpd, [ send_json/2, send_json/3, send_method_not_allowed/2 ]). -import(couch_util, [ to_binary/1 ]). -export([handle_req/1]). handle_req(#httpd{method = 'POST', user_ctx = UserCtx} = Req) -> couch_httpd:validate_ctype(Req, "application/json"), RepDoc = {Props} = couch_httpd:json_body_obj(Req), validate_rep_props(Props), {ok, Rep} = couch_replicator_utils:parse_rep_doc(RepDoc, UserCtx), case couch_replicator:replicate(Rep) of {error, {Error, Reason}} -> send_json( Req, 500, {[{error, to_binary(Error)}, {reason, to_binary(Reason)}]}); {error, not_found} -> % Tried to cancel a replication that didn't exist. send_json(Req, 404, {[{error, <<"not found">>}]}); {error, Reason} -> send_json(Req, 500, {[{error, to_binary(Reason)}]}); {ok, {cancelled, RepId}} -> send_json(Req, 200, {[{ok, true}, {<<"_local_id">>, RepId}]}); {ok, {continuous, RepId}} -> send_json(Req, 202, {[{ok, true}, {<<"_local_id">>, RepId}]}); {ok, {HistoryResults}} -> send_json(Req, {[{ok, true} | HistoryResults]}) end; handle_req(Req) -> send_method_not_allowed(Req, "POST"). validate_rep_props([]) -> ok; validate_rep_props([{<<"query_params">>, {Params}}|Rest]) -> lists:foreach(fun ({_,V}) when is_binary(V) -> ok; ({K,_}) -> throw({bad_request, <>}) end, Params), validate_rep_props(Rest); validate_rep_props([_|Rest]) -> validate_rep_props(Rest). apache-couchdb-1.6.0/src/couch_replicator/src/couch_replicator_api_wrap.erl0000644000175000001440000007472312332105522027151 0ustar00djcusers00000000000000% Licensed under the Apache License, Version 2.0 (the "License"); you may not % use this file except in compliance with the License. You may obtain a copy of % the License at % % http://www.apache.org/licenses/LICENSE-2.0 % % Unless required by applicable law or agreed to in writing, software % distributed under the License is distributed on an "AS IS" BASIS, WITHOUT % WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the % License for the specific language governing permissions and limitations under % the License. -module(couch_replicator_api_wrap). % This module wraps the native erlang API, and allows for performing % operations on a remote vs. local databases via the same API. % % Notes: % Many options and apis aren't yet supported here, they are added as needed. -include("couch_db.hrl"). -include("couch_replicator_api_wrap.hrl"). -export([ db_open/2, db_open/3, db_close/1, get_db_info/1, update_doc/3, update_doc/4, update_docs/3, update_docs/4, ensure_full_commit/1, get_missing_revs/2, open_doc/3, open_doc_revs/6, changes_since/5, db_uri/1 ]). -import(couch_replicator_httpc, [ send_req/3 ]). -import(couch_util, [ encode_doc_id/1, get_value/2, get_value/3 ]). -define(MAX_WAIT, 5 * 60 * 1000). -define(MAX_URL_LEN, 7000). -define(MIN_URL_LEN, 200). db_uri(#httpdb{url = Url}) -> couch_util:url_strip_password(Url); db_uri(#db{name = Name}) -> db_uri(Name); db_uri(DbName) -> ?b2l(DbName). db_open(Db, Options) -> db_open(Db, Options, false). db_open(#httpdb{} = Db1, _Options, Create) -> {ok, Db} = couch_replicator_httpc:setup(Db1), case Create of false -> ok; true -> send_req(Db, [{method, put}], fun(_, _, _) -> ok end) end, send_req(Db, [{method, head}], fun(200, _, _) -> {ok, Db}; (401, _, _) -> throw({unauthorized, ?l2b(db_uri(Db))}); (_, _, _) -> throw({db_not_found, ?l2b(db_uri(Db))}) end); db_open(DbName, Options, Create) -> try case Create of false -> ok; true -> ok = couch_httpd:verify_is_server_admin( get_value(user_ctx, Options)), couch_db:create(DbName, Options) end, case couch_db:open(DbName, Options) of {error, illegal_database_name, _} -> throw({db_not_found, DbName}); {not_found, _Reason} -> throw({db_not_found, DbName}); {ok, _Db} = Success -> Success end catch throw:{unauthorized, _} -> throw({unauthorized, DbName}) end. db_close(#httpdb{httpc_pool = Pool}) -> unlink(Pool), ok = couch_replicator_httpc_pool:stop(Pool); db_close(DbName) -> catch couch_db:close(DbName). get_db_info(#httpdb{} = Db) -> send_req(Db, [], fun(200, _, {Props}) -> {ok, Props} end); get_db_info(#db{name = DbName, user_ctx = UserCtx}) -> {ok, Db} = couch_db:open(DbName, [{user_ctx, UserCtx}]), {ok, Info} = couch_db:get_db_info(Db), couch_db:close(Db), {ok, [{couch_util:to_binary(K), V} || {K, V} <- Info]}. ensure_full_commit(#httpdb{} = Db) -> send_req( Db, [{method, post}, {path, "_ensure_full_commit"}, {headers, [{"Content-Type", "application/json"}]}], fun(201, _, {Props}) -> {ok, get_value(<<"instance_start_time">>, Props)}; (_, _, {Props}) -> {error, get_value(<<"error">>, Props)} end); ensure_full_commit(Db) -> couch_db:ensure_full_commit(Db). get_missing_revs(#httpdb{} = Db, IdRevs) -> JsonBody = {[{Id, couch_doc:revs_to_strs(Revs)} || {Id, Revs} <- IdRevs]}, send_req( Db, [{method, post}, {path, "_revs_diff"}, {body, ?JSON_ENCODE(JsonBody)}, {headers, [{"Content-Type", "application/json"}]}], fun(200, _, {Props}) -> ConvertToNativeFun = fun({Id, {Result}}) -> MissingRevs = couch_doc:parse_revs( get_value(<<"missing">>, Result) ), PossibleAncestors = couch_doc:parse_revs( get_value(<<"possible_ancestors">>, Result, []) ), {Id, MissingRevs, PossibleAncestors} end, {ok, lists:map(ConvertToNativeFun, Props)} end); get_missing_revs(Db, IdRevs) -> couch_db:get_missing_revs(Db, IdRevs). open_doc_revs(#httpdb{retries = 0} = HttpDb, Id, Revs, Options, _Fun, _Acc) -> Path = encode_doc_id(Id), QS = options_to_query_args(HttpDb, Path, [revs, {open_revs, Revs} | Options]), Url = couch_util:url_strip_password( couch_replicator_httpc:full_url(HttpDb, [{path,Path}, {qs,QS}]) ), ?LOG_ERROR("Replication crashing because GET ~s failed", [Url]), exit(kaboom); open_doc_revs(#httpdb{} = HttpDb, Id, Revs, Options, Fun, Acc) -> Path = encode_doc_id(Id), QS = options_to_query_args(HttpDb, Path, [revs, {open_revs, Revs} | Options]), {Pid, Ref} = spawn_monitor(fun() -> Self = self(), Callback = fun (200, Headers, StreamDataFun) -> remote_open_doc_revs_streamer_start(Self), {<<"--">>, _, _} = couch_httpd:parse_multipart_request( get_value("Content-Type", Headers), StreamDataFun, fun mp_parse_mixed/1 ); (414, _, _) -> exit(request_uri_too_long) end, Streamer = spawn_link(fun() -> Params = [ {path, Path}, {qs, QS}, {ibrowse_options, [{stream_to, {self(), once}}]}, {headers, [{"Accept", "multipart/mixed"}]} ], % We're setting retries to 0 here to avoid the case where the % Streamer retries the request and ends up jumbling together two % different response bodies. Retries are handled explicitly by % open_doc_revs itself. send_req(HttpDb#httpdb{retries = 0}, Params, Callback) end), % If this process dies normally we can leave % the Streamer process hanging around keeping an % HTTP connection open. This is a bit of a % hammer approach to making sure it releases % that connection back to the pool. spawn(fun() -> Ref = erlang:monitor(process, Self), receive {'DOWN', Ref, process, Self, normal} -> exit(Streamer, {streamer_parent_died, Self}); {'DOWN', Ref, process, Self, _} -> ok end end), receive {started_open_doc_revs, Ref} -> Ret = receive_docs_loop(Streamer, Fun, Id, Revs, Ref, Acc), exit({exit_ok, Ret}) end end), receive {'DOWN', Ref, process, Pid, {exit_ok, Ret}} -> Ret; {'DOWN', Ref, process, Pid, {{nocatch, {missing_stub,_} = Stub}, _}} -> throw(Stub); {'DOWN', Ref, process, Pid, request_uri_too_long} -> NewMaxLen = get_value(max_url_len, Options, ?MAX_URL_LEN) div 2, case NewMaxLen < ?MIN_URL_LEN of true -> throw(request_uri_too_long); false -> ?LOG_INFO("Reducing url length to ~B because of 414 response", [NewMaxLen]), Options1 = lists:keystore(max_url_len, 1, Options, {max_url_len, NewMaxLen}), open_doc_revs(HttpDb, Id, Revs, Options1, Fun, Acc) end; {'DOWN', Ref, process, Pid, Else} -> Url = couch_util:url_strip_password( couch_replicator_httpc:full_url(HttpDb, [{path,Path}, {qs,QS}]) ), #httpdb{retries = Retries, wait = Wait0} = HttpDb, Wait = 2 * erlang:min(Wait0 * 2, ?MAX_WAIT), ?LOG_INFO("Retrying GET to ~s in ~p seconds due to error ~p", [Url, Wait / 1000, error_reason(Else)] ), ok = timer:sleep(Wait), RetryDb = HttpDb#httpdb{ retries = Retries - 1, wait = Wait }, open_doc_revs(RetryDb, Id, Revs, Options, Fun, Acc) end; open_doc_revs(Db, Id, Revs, Options, Fun, Acc) -> {ok, Results} = couch_db:open_doc_revs(Db, Id, Revs, Options), {ok, lists:foldl(fun(R, A) -> {_, A2} = Fun(R, A), A2 end, Acc, Results)}. error_reason({http_request_failed, "GET", _Url, {error, timeout}}) -> timeout; error_reason({http_request_failed, "GET", _Url, {error, {_, req_timedout}}}) -> req_timedout; error_reason({http_request_failed, "GET", _Url, Error}) -> Error; error_reason(Else) -> Else. open_doc(#httpdb{} = Db, Id, Options) -> send_req( Db, [{path, encode_doc_id(Id)}, {qs, options_to_query_args(Options, [])}], fun(200, _, Body) -> {ok, couch_doc:from_json_obj(Body)}; (_, _, {Props}) -> {error, get_value(<<"error">>, Props)} end); open_doc(Db, Id, Options) -> case couch_db:open_doc(Db, Id, Options) of {ok, _} = Ok -> Ok; {not_found, _Reason} -> {error, <<"not_found">>} end. update_doc(Db, Doc, Options) -> update_doc(Db, Doc, Options, interactive_edit). update_doc(#httpdb{} = HttpDb, #doc{id = DocId} = Doc, Options, Type) -> QArgs = case Type of replicated_changes -> [{"new_edits", "false"}]; _ -> [] end ++ options_to_query_args(Options, []), Boundary = couch_uuids:random(), JsonBytes = ?JSON_ENCODE( couch_doc:to_json_obj( Doc, [revs, attachments, follows, att_encoding_info | Options])), {ContentType, Len} = couch_doc:len_doc_to_multi_part_stream(Boundary, JsonBytes, Doc#doc.atts, true), Headers = case lists:member(delay_commit, Options) of true -> [{"X-Couch-Full-Commit", "false"}]; false -> [] end ++ [{"Content-Type", ?b2l(ContentType)}, {"Content-Length", Len}], Body = {fun stream_doc/1, {JsonBytes, Doc#doc.atts, Boundary, Len}}, send_req( % A crash here bubbles all the way back up to run_user_fun inside % open_doc_revs, which will retry the whole thing. That's the % appropriate course of action, since we've already started streaming % the response body from the GET request. HttpDb#httpdb{retries = 0}, [{method, put}, {path, encode_doc_id(DocId)}, {qs, QArgs}, {headers, Headers}, {body, Body}], fun(Code, _, {Props}) when Code =:= 200 orelse Code =:= 201 -> {ok, couch_doc:parse_rev(get_value(<<"rev">>, Props))}; (409, _, _) -> throw(conflict); (Code, _, {Props}) -> case {Code, get_value(<<"error">>, Props)} of {401, <<"unauthorized">>} -> throw({unauthorized, get_value(<<"reason">>, Props)}); {403, <<"forbidden">>} -> throw({forbidden, get_value(<<"reason">>, Props)}); {412, <<"missing_stub">>} -> throw({missing_stub, get_value(<<"reason">>, Props)}); {_, Error} -> {error, Error} end end); update_doc(Db, Doc, Options, Type) -> couch_db:update_doc(Db, Doc, Options, Type). update_docs(Db, DocList, Options) -> update_docs(Db, DocList, Options, interactive_edit). update_docs(_Db, [], _Options, _UpdateType) -> {ok, []}; update_docs(#httpdb{} = HttpDb, DocList, Options, UpdateType) -> FullCommit = atom_to_list(not lists:member(delay_commit, Options)), Prefix = case UpdateType of replicated_changes -> <<"{\"new_edits\":false,\"docs\":[">>; interactive_edit -> <<"{\"docs\":[">> end, Suffix = <<"]}">>, % Note: nginx and other servers don't like PUT/POST requests without % a Content-Length header, so we can't do a chunked transfer encoding % and JSON encode each doc only before sending it through the socket. {Docs, Len} = lists:mapfoldl( fun(#doc{} = Doc, Acc) -> Json = ?JSON_ENCODE(couch_doc:to_json_obj(Doc, [revs, attachments])), {Json, Acc + iolist_size(Json)}; (Doc, Acc) -> {Doc, Acc + iolist_size(Doc)} end, byte_size(Prefix) + byte_size(Suffix) + length(DocList) - 1, DocList), BodyFun = fun(eof) -> eof; ([]) -> {ok, Suffix, eof}; ([prefix | Rest]) -> {ok, Prefix, Rest}; ([Doc]) -> {ok, Doc, []}; ([Doc | RestDocs]) -> {ok, [Doc, ","], RestDocs} end, Headers = [ {"Content-Length", Len}, {"Content-Type", "application/json"}, {"X-Couch-Full-Commit", FullCommit} ], send_req( HttpDb, [{method, post}, {path, "_bulk_docs"}, {body, {BodyFun, [prefix | Docs]}}, {headers, Headers}], fun(201, _, Results) when is_list(Results) -> {ok, bulk_results_to_errors(DocList, Results, remote)}; (417, _, Results) when is_list(Results) -> {ok, bulk_results_to_errors(DocList, Results, remote)} end); update_docs(Db, DocList, Options, UpdateType) -> Result = couch_db:update_docs(Db, DocList, Options, UpdateType), {ok, bulk_results_to_errors(DocList, Result, UpdateType)}. changes_since(#httpdb{headers = Headers1} = HttpDb, Style, StartSeq, UserFun, Options) -> HeartBeat = erlang:max(1000, HttpDb#httpdb.timeout div 3), BaseQArgs = case get_value(continuous, Options, false) of false -> [{"feed", "normal"}]; true -> [{"feed", "continuous"}] end ++ [ {"style", atom_to_list(Style)}, {"since", ?JSON_ENCODE(StartSeq)}, {"heartbeat", integer_to_list(HeartBeat)} ], DocIds = get_value(doc_ids, Options), {QArgs, Method, Body, Headers} = case DocIds of undefined -> QArgs1 = maybe_add_changes_filter_q_args(BaseQArgs, Options), {QArgs1, get, [], Headers1}; _ when is_list(DocIds) -> Headers2 = [{"Content-Type", "application/json"} | Headers1], JsonDocIds = ?JSON_ENCODE({[{<<"doc_ids">>, DocIds}]}), {[{"filter", "_doc_ids"} | BaseQArgs], post, JsonDocIds, Headers2} end, send_req( HttpDb, [{method, Method}, {path, "_changes"}, {qs, QArgs}, {headers, Headers}, {body, Body}, {ibrowse_options, [{stream_to, {self(), once}}]}], fun(200, _, DataStreamFun) -> parse_changes_feed(Options, UserFun, DataStreamFun); (405, _, _) when is_list(DocIds) -> % CouchDB versions < 1.1.0 don't have the builtin _changes feed % filter "_doc_ids" neither support POST send_req(HttpDb, [{method, get}, {path, "_changes"}, {qs, BaseQArgs}, {headers, Headers1}, {ibrowse_options, [{stream_to, {self(), once}}]}], fun(200, _, DataStreamFun2) -> UserFun2 = fun(#doc_info{id = Id} = DocInfo) -> case lists:member(Id, DocIds) of true -> UserFun(DocInfo); false -> ok end end, parse_changes_feed(Options, UserFun2, DataStreamFun2) end) end); changes_since(Db, Style, StartSeq, UserFun, Options) -> Filter = case get_value(doc_ids, Options) of undefined -> ?b2l(get_value(filter, Options, <<>>)); _DocIds -> "_doc_ids" end, Args = #changes_args{ style = Style, since = StartSeq, filter = Filter, feed = case get_value(continuous, Options, false) of true -> "continuous"; false -> "normal" end, timeout = infinity }, QueryParams = get_value(query_params, Options, {[]}), Req = changes_json_req(Db, Filter, QueryParams, Options), ChangesFeedFun = couch_changes:handle_changes(Args, {json_req, Req}, Db), ChangesFeedFun(fun({change, Change, _}, _) -> UserFun(json_to_doc_info(Change)); (_, _) -> ok end). % internal functions maybe_add_changes_filter_q_args(BaseQS, Options) -> case get_value(filter, Options) of undefined -> BaseQS; FilterName -> {Params} = get_value(query_params, Options, {[]}), [{"filter", ?b2l(FilterName)} | lists:foldl( fun({K, V}, QSAcc) -> Ks = couch_util:to_list(K), case lists:keymember(Ks, 1, QSAcc) of true -> QSAcc; false -> [{Ks, couch_util:to_list(V)} | QSAcc] end end, BaseQS, Params)] end. parse_changes_feed(Options, UserFun, DataStreamFun) -> case get_value(continuous, Options, false) of true -> continuous_changes(DataStreamFun, UserFun); false -> EventFun = fun(Ev) -> changes_ev1(Ev, fun(DocInfo, _) -> UserFun(DocInfo) end, []) end, json_stream_parse:events(DataStreamFun, EventFun) end. changes_json_req(_Db, "", _QueryParams, _Options) -> {[]}; changes_json_req(_Db, "_doc_ids", _QueryParams, Options) -> {[{<<"doc_ids">>, get_value(doc_ids, Options)}]}; changes_json_req(Db, FilterName, {QueryParams}, _Options) -> {ok, Info} = couch_db:get_db_info(Db), % simulate a request to db_name/_changes {[ {<<"info">>, {Info}}, {<<"id">>, null}, {<<"method">>, 'GET'}, {<<"path">>, [couch_db:name(Db), <<"_changes">>]}, {<<"query">>, {[{<<"filter">>, FilterName} | QueryParams]}}, {<<"headers">>, []}, {<<"body">>, []}, {<<"peer">>, <<"replicator">>}, {<<"form">>, []}, {<<"cookie">>, []}, {<<"userCtx">>, couch_util:json_user_ctx(Db)} ]}. options_to_query_args(HttpDb, Path, Options0) -> case lists:keytake(max_url_len, 1, Options0) of false -> MaxLen = ?MAX_URL_LEN, Options = Options0; {value, {max_url_len, MaxLen}, Options} -> ok end, case lists:keytake(atts_since, 1, Options) of false -> options_to_query_args(Options, []); {value, {atts_since, []}, Options2} -> options_to_query_args(Options2, []); {value, {atts_since, PAs}, Options2} -> QueryArgs1 = options_to_query_args(Options2, []), FullUrl = couch_replicator_httpc:full_url( HttpDb, [{path, Path}, {qs, QueryArgs1}]), RevList = atts_since_arg( length("GET " ++ FullUrl ++ " HTTP/1.1\r\n") + length("&atts_since=") + 6, % +6 = % encoded [ and ] PAs, MaxLen, []), [{"atts_since", ?JSON_ENCODE(RevList)} | QueryArgs1] end. options_to_query_args([], Acc) -> lists:reverse(Acc); options_to_query_args([ejson_body | Rest], Acc) -> options_to_query_args(Rest, Acc); options_to_query_args([delay_commit | Rest], Acc) -> options_to_query_args(Rest, Acc); options_to_query_args([revs | Rest], Acc) -> options_to_query_args(Rest, [{"revs", "true"} | Acc]); options_to_query_args([{open_revs, all} | Rest], Acc) -> options_to_query_args(Rest, [{"open_revs", "all"} | Acc]); options_to_query_args([latest | Rest], Acc) -> options_to_query_args(Rest, [{"latest", "true"} | Acc]); options_to_query_args([{open_revs, Revs} | Rest], Acc) -> JsonRevs = ?b2l(?JSON_ENCODE(couch_doc:revs_to_strs(Revs))), options_to_query_args(Rest, [{"open_revs", JsonRevs} | Acc]). atts_since_arg(_UrlLen, [], _MaxLen, Acc) -> lists:reverse(Acc); atts_since_arg(UrlLen, [PA | Rest], MaxLen, Acc) -> RevStr = couch_doc:rev_to_str(PA), NewUrlLen = case Rest of [] -> % plus 2 double quotes (% encoded) UrlLen + size(RevStr) + 6; _ -> % plus 2 double quotes and a comma (% encoded) UrlLen + size(RevStr) + 9 end, case NewUrlLen >= MaxLen of true -> lists:reverse(Acc); false -> atts_since_arg(NewUrlLen, Rest, MaxLen, [RevStr | Acc]) end. % TODO: A less verbose, more elegant and automatic restart strategy for % the exported open_doc_revs/6 function. The restart should be % transparent to the caller like any other Couch API function exported % by this module. receive_docs_loop(Streamer, Fun, Id, Revs, Ref, Acc) -> try % Left only for debugging purposes via an interactive or remote shell erlang:put(open_doc_revs, {Id, Revs, Ref, Streamer}), receive_docs(Streamer, Fun, Ref, Acc) catch error:{restart_open_doc_revs, NewRef} -> receive_docs_loop(Streamer, Fun, Id, Revs, NewRef, Acc) end. receive_docs(Streamer, UserFun, Ref, UserAcc) -> Streamer ! {get_headers, Ref, self()}, receive {started_open_doc_revs, NewRef} -> restart_remote_open_doc_revs(Ref, NewRef); {headers, Ref, Headers} -> case get_value("content-type", Headers) of {"multipart/related", _} = ContentType -> case doc_from_multi_part_stream( ContentType, fun() -> receive_doc_data(Streamer, Ref) end, Ref) of {ok, Doc, Parser} -> case run_user_fun(UserFun, {ok, Doc}, UserAcc, Ref) of {ok, UserAcc2} -> ok; {skip, UserAcc2} -> couch_doc:abort_multi_part_stream(Parser) end, receive_docs(Streamer, UserFun, Ref, UserAcc2) end; {"application/json", []} -> Doc = couch_doc:from_json_obj( ?JSON_DECODE(receive_all(Streamer, Ref, []))), {_, UserAcc2} = run_user_fun(UserFun, {ok, Doc}, UserAcc, Ref), receive_docs(Streamer, UserFun, Ref, UserAcc2); {"application/json", [{"error","true"}]} -> {ErrorProps} = ?JSON_DECODE(receive_all(Streamer, Ref, [])), Rev = get_value(<<"missing">>, ErrorProps), Result = {{not_found, missing}, couch_doc:parse_rev(Rev)}, {_, UserAcc2} = run_user_fun(UserFun, Result, UserAcc, Ref), receive_docs(Streamer, UserFun, Ref, UserAcc2) end; {done, Ref} -> {ok, UserAcc} end. run_user_fun(UserFun, Arg, UserAcc, OldRef) -> {Pid, Ref} = spawn_monitor(fun() -> try UserFun(Arg, UserAcc) of Resp -> exit({exit_ok, Resp}) catch throw:Reason -> exit({exit_throw, Reason}); error:Reason -> exit({exit_error, Reason}); exit:Reason -> exit({exit_exit, Reason}) end end), receive {started_open_doc_revs, NewRef} -> erlang:demonitor(Ref, [flush]), exit(Pid, kill), restart_remote_open_doc_revs(OldRef, NewRef); {'DOWN', Ref, process, Pid, {exit_ok, Ret}} -> Ret; {'DOWN', Ref, process, Pid, {exit_throw, Reason}} -> throw(Reason); {'DOWN', Ref, process, Pid, {exit_error, Reason}} -> erlang:error(Reason); {'DOWN', Ref, process, Pid, {exit_exit, Reason}} -> erlang:exit(Reason) end. restart_remote_open_doc_revs(Ref, NewRef) -> receive {body_bytes, Ref, _} -> restart_remote_open_doc_revs(Ref, NewRef); {body_done, Ref} -> restart_remote_open_doc_revs(Ref, NewRef); {done, Ref} -> restart_remote_open_doc_revs(Ref, NewRef); {headers, Ref, _} -> restart_remote_open_doc_revs(Ref, NewRef) after 0 -> erlang:error({restart_open_doc_revs, NewRef}) end. remote_open_doc_revs_streamer_start(Parent) -> receive {get_headers, _Ref, Parent} -> remote_open_doc_revs_streamer_start(Parent); {next_bytes, _Ref, Parent} -> remote_open_doc_revs_streamer_start(Parent) after 0 -> Parent ! {started_open_doc_revs, make_ref()} end. receive_all(Streamer, Ref, Acc) -> Streamer ! {next_bytes, Ref, self()}, receive {started_open_doc_revs, NewRef} -> restart_remote_open_doc_revs(Ref, NewRef); {body_bytes, Ref, Bytes} -> receive_all(Streamer, Ref, [Bytes | Acc]); {body_done, Ref} -> lists:reverse(Acc) end. mp_parse_mixed(eof) -> receive {get_headers, Ref, From} -> From ! {done, Ref} end; mp_parse_mixed({headers, H}) -> receive {get_headers, Ref, From} -> From ! {headers, Ref, H} end, fun mp_parse_mixed/1; mp_parse_mixed({body, Bytes}) -> receive {next_bytes, Ref, From} -> From ! {body_bytes, Ref, Bytes} end, fun mp_parse_mixed/1; mp_parse_mixed(body_end) -> receive {next_bytes, Ref, From} -> From ! {body_done, Ref}; {get_headers, Ref, From} -> self() ! {get_headers, Ref, From} end, fun mp_parse_mixed/1. receive_doc_data(Streamer, Ref) -> Streamer ! {next_bytes, Ref, self()}, receive {body_bytes, Ref, Bytes} -> {Bytes, fun() -> receive_doc_data(Streamer, Ref) end}; {body_done, Ref} -> {<<>>, fun() -> receive_doc_data(Streamer, Ref) end} end. doc_from_multi_part_stream(ContentType, DataFun, Ref) -> Self = self(), Parser = spawn_link(fun() -> {<<"--">>, _, _} = couch_httpd:parse_multipart_request( ContentType, DataFun, fun(Next) -> couch_doc:mp_parse_doc(Next, []) end), unlink(Self) end), Parser ! {get_doc_bytes, Ref, self()}, receive {started_open_doc_revs, NewRef} -> unlink(Parser), exit(Parser, kill), restart_remote_open_doc_revs(Ref, NewRef); {doc_bytes, Ref, DocBytes} -> Doc = couch_doc:from_json_obj(?JSON_DECODE(DocBytes)), ReadAttachmentDataFun = fun() -> link(Parser), Parser ! {get_bytes, Ref, self()}, receive {started_open_doc_revs, NewRef} -> unlink(Parser), exit(Parser, kill), receive {bytes, Ref, _} -> ok after 0 -> ok end, restart_remote_open_doc_revs(Ref, NewRef); {bytes, Ref, Bytes} -> Bytes end end, Atts2 = lists:map( fun(#att{data = follows} = A) -> A#att{data = ReadAttachmentDataFun}; (A) -> A end, Doc#doc.atts), {ok, Doc#doc{atts = Atts2}, Parser} end. changes_ev1(object_start, UserFun, UserAcc) -> fun(Ev) -> changes_ev2(Ev, UserFun, UserAcc) end. changes_ev2({key, <<"results">>}, UserFun, UserAcc) -> fun(Ev) -> changes_ev3(Ev, UserFun, UserAcc) end; changes_ev2(_, UserFun, UserAcc) -> fun(Ev) -> changes_ev2(Ev, UserFun, UserAcc) end. changes_ev3(array_start, UserFun, UserAcc) -> fun(Ev) -> changes_ev_loop(Ev, UserFun, UserAcc) end. changes_ev_loop(object_start, UserFun, UserAcc) -> fun(Ev) -> json_stream_parse:collect_object(Ev, fun(Obj) -> UserAcc2 = UserFun(json_to_doc_info(Obj), UserAcc), fun(Ev2) -> changes_ev_loop(Ev2, UserFun, UserAcc2) end end) end; changes_ev_loop(array_end, _UserFun, _UserAcc) -> fun(_Ev) -> changes_ev_done() end. changes_ev_done() -> fun(_Ev) -> changes_ev_done() end. continuous_changes(DataFun, UserFun) -> {DataFun2, _, Rest} = json_stream_parse:events( DataFun, fun(Ev) -> parse_changes_line(Ev, UserFun) end), continuous_changes(fun() -> {Rest, DataFun2} end, UserFun). parse_changes_line(object_start, UserFun) -> fun(Ev) -> json_stream_parse:collect_object(Ev, fun(Obj) -> UserFun(json_to_doc_info(Obj)) end) end. json_to_doc_info({Props}) -> RevsInfo = lists:map( fun({Change}) -> Rev = couch_doc:parse_rev(get_value(<<"rev">>, Change)), Del = (true =:= get_value(<<"deleted">>, Change)), #rev_info{rev=Rev, deleted=Del} end, get_value(<<"changes">>, Props)), #doc_info{ id = get_value(<<"id">>, Props), high_seq = get_value(<<"seq">>, Props), revs = RevsInfo }. bulk_results_to_errors(Docs, {ok, Results}, interactive_edit) -> lists:reverse(lists:foldl( fun({_, {ok, _}}, Acc) -> Acc; ({#doc{id = Id, revs = {Pos, [RevId | _]}}, Error}, Acc) -> {_, Error, Reason} = couch_httpd:error_info(Error), [ {[{id, Id}, {rev, rev_to_str({Pos, RevId})}, {error, Error}, {reason, Reason}]} | Acc ] end, [], lists:zip(Docs, Results))); bulk_results_to_errors(Docs, {ok, Results}, replicated_changes) -> bulk_results_to_errors(Docs, {aborted, Results}, interactive_edit); bulk_results_to_errors(_Docs, {aborted, Results}, interactive_edit) -> lists:map( fun({{Id, Rev}, Err}) -> {_, Error, Reason} = couch_httpd:error_info(Err), {[{id, Id}, {rev, rev_to_str(Rev)}, {error, Error}, {reason, Reason}]} end, Results); bulk_results_to_errors(_Docs, Results, remote) -> lists:reverse(lists:foldl( fun({Props}, Acc) -> case get_value(<<"error">>, Props, get_value(error, Props)) of undefined -> Acc; Error -> Id = get_value(<<"id">>, Props, get_value(id, Props)), Rev = get_value(<<"rev">>, Props, get_value(rev, Props)), Reason = get_value(<<"reason">>, Props, get_value(reason, Props)), [ {[{id, Id}, {rev, rev_to_str(Rev)}, {error, Error}, {reason, Reason}]} | Acc ] end end, [], Results)). rev_to_str({_Pos, _Id} = Rev) -> couch_doc:rev_to_str(Rev); rev_to_str(Rev) -> Rev. write_fun() -> fun(Data) -> receive {get_data, Ref, From} -> From ! {data, Ref, Data} end end. stream_doc({JsonBytes, Atts, Boundary, Len}) -> case erlang:erase({doc_streamer, Boundary}) of Pid when is_pid(Pid) -> unlink(Pid), exit(Pid, kill); _ -> ok end, DocStreamer = spawn_link( couch_doc, doc_to_multi_part_stream, [Boundary, JsonBytes, Atts, write_fun(), true] ), erlang:put({doc_streamer, Boundary}, DocStreamer), {ok, <<>>, {Len, Boundary}}; stream_doc({0, Id}) -> erlang:erase({doc_streamer, Id}), eof; stream_doc({LenLeft, Id}) when LenLeft > 0 -> Ref = make_ref(), erlang:get({doc_streamer, Id}) ! {get_data, Ref, self()}, receive {data, Ref, Data} -> {ok, Data, {LenLeft - iolist_size(Data), Id}} end. apache-couchdb-1.6.0/src/couch_replicator/src/couch_replicator_api_wrap.hrl0000644000175000001440000000174512332105522027146 0ustar00djcusers00000000000000% Licensed under the Apache License, Version 2.0 (the "License"); you may not % use this file except in compliance with the License. You may obtain a copy of % the License at % % http://www.apache.org/licenses/LICENSE-2.0 % % Unless required by applicable law or agreed to in writing, software % distributed under the License is distributed on an "AS IS" BASIS, WITHOUT % WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the % License for the specific language governing permissions and limitations under % the License. -record(httpdb, { url, oauth = nil, headers = [ {"Accept", "application/json"}, {"User-Agent", "CouchDB/" ++ couch_server:get_version()} ], timeout, % milliseconds ibrowse_options = [], retries = 10, wait = 250, % milliseconds httpc_pool = nil, http_connections }). -record(oauth, { consumer_key, token, token_secret, consumer_secret, signature_method }). apache-couchdb-1.6.0/src/couch_replicator/src/couch_replicator.app.src0000644000175000001440000000211312332105522026033 0ustar00djcusers00000000000000% Licensed under the Apache License, Version 2.0 (the "License"); you may not % use this file except in compliance with the License. You may obtain a copy of % the License at % % http://www.apache.org/licenses/LICENSE-2.0 % % Unless required by applicable law or agreed to in writing, software % distributed under the License is distributed on an "AS IS" BASIS, WITHOUT % WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the % License for the specific language governing permissions and limitations under % the License. {application, couch_replicator, [ {description, "CouchDB replicator"}, {vsn, "%version%"}, {modules, [ couch_replicator_api_wrap, couch_replicator_httpc, couch_replicator_httpd, couch_replicator_job_sup, couch_replicator_notifier, couch_replicator_manager, couch_replicator_httpc_pool, couch_replicator_utils, couch_replicator_worker, couch_replicator ]}, {registered, [ couch_replicator_job_sup ]}, {applications, [kernel, stdlib]} ]}. apache-couchdb-1.6.0/src/couch_replicator/test/0000755000175000001440000000000012332105601021407 5ustar00djcusers00000000000000apache-couchdb-1.6.0/src/couch_replicator/test/02-httpc-pool.t0000755000175000001440000002145312332105522024116 0ustar00djcusers00000000000000#!/usr/bin/env escript %% -*- erlang -*- % Licensed under the Apache License, Version 2.0 (the "License"); you may not % use this file except in compliance with the License. You may obtain a copy of % the License at % % http://www.apache.org/licenses/LICENSE-2.0 % % Unless required by applicable law or agreed to in writing, software % distributed under the License is distributed on an "AS IS" BASIS, WITHOUT % WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the % License for the specific language governing permissions and limitations under % the License. main(_) -> test_util:init_code_path(), etap:plan(55), case (catch test()) of ok -> etap:end_tests(); Other -> etap:diag(io_lib:format("Test died abnormally: ~p", [Other])), etap:bail(Other) end, ok. test() -> couch_server_sup:start_link(test_util:config_files()), ibrowse:start(), test_pool_full(), test_worker_dead_pool_non_full(), test_worker_dead_pool_full(), couch_server_sup:stop(), ok. test_pool_full() -> Pool = spawn_pool(), Client1 = spawn_client(Pool), Client2 = spawn_client(Pool), Client3 = spawn_client(Pool), etap:diag("Check that we can spawn the max number of connections."), etap:is(ping_client(Client1), ok, "Client 1 started ok."), etap:is(ping_client(Client2), ok, "Client 2 started ok."), etap:is(ping_client(Client3), ok, "Client 3 started ok."), Worker1 = get_client_worker(Client1, "1"), Worker2 = get_client_worker(Client2, "2"), Worker3 = get_client_worker(Client3, "3"), etap:is(is_process_alive(Worker1), true, "Client's 1 worker is alive."), etap:is(is_process_alive(Worker2), true, "Client's 2 worker is alive."), etap:is(is_process_alive(Worker3), true, "Client's 3 worker is alive."), etap:isnt(Worker1, Worker2, "Clients 1 and 2 got different workers."), etap:isnt(Worker2, Worker3, "Clients 2 and 3 got different workers."), etap:isnt(Worker1, Worker3, "Clients 1 and 3 got different workers."), etap:diag("Check that client 4 blocks waiting for a worker."), Client4 = spawn_client(Pool), etap:is(ping_client(Client4), timeout, "Client 4 blocked while waiting."), etap:diag("Check that stopping a client gives up its worker."), etap:is(stop_client(Client1), ok, "First client stopped."), etap:diag("And check that our blocked client has been unblocked."), etap:is(ping_client(Client4), ok, "Client 4 was unblocked."), Worker4 = get_client_worker(Client4, "4"), etap:is(is_process_alive(Worker4), true, "Client's 4 worker is alive."), etap:is(Worker4, Worker1, "Client 4 got worker that client 1 got before."), lists:foreach(fun(C) -> ok = stop_client(C) end, [Client2, Client3, Client4]), stop_pool(Pool). test_worker_dead_pool_non_full() -> Pool = spawn_pool(), Client1 = spawn_client(Pool), etap:is(ping_client(Client1), ok, "Client 1 started ok."), Worker1 = get_client_worker(Client1, "1"), etap:is(is_process_alive(Worker1), true, "Client's 1 worker is alive."), etap:diag("Kill client's 1 worker."), etap:is(kill_client_worker(Client1), ok, "Killed client's 1 worker."), etap:is(is_process_alive(Worker1), false, "Client's 1 worker process is dead."), etap:is(stop_client(Client1), ok, "First client stopped and released its worker."), Client2 = spawn_client(Pool), etap:is(ping_client(Client2), ok, "Client 2 started ok."), Worker2 = get_client_worker(Client2, "2"), etap:isnt(Worker2, Worker1, "Client 2 got a different worker from client 1"), etap:is(is_process_alive(Worker2), true, "Client's 2 worker is alive."), etap:is(stop_client(Client2), ok, "Second client stopped."), stop_pool(Pool). test_worker_dead_pool_full() -> Pool = spawn_pool(), Client1 = spawn_client(Pool), Client2 = spawn_client(Pool), Client3 = spawn_client(Pool), etap:diag("Check that we can spawn the max number of connections."), etap:is(ping_client(Client1), ok, "Client 1 started ok."), etap:is(ping_client(Client2), ok, "Client 2 started ok."), etap:is(ping_client(Client3), ok, "Client 3 started ok."), Worker1 = get_client_worker(Client1, "1"), Worker2 = get_client_worker(Client2, "2"), Worker3 = get_client_worker(Client3, "3"), etap:is(is_process_alive(Worker1), true, "Client's 1 worker is alive."), etap:is(is_process_alive(Worker2), true, "Client's 2 worker is alive."), etap:is(is_process_alive(Worker3), true, "Client's 3 worker is alive."), etap:isnt(Worker1, Worker2, "Clients 1 and 2 got different workers."), etap:isnt(Worker2, Worker3, "Clients 2 and 3 got different workers."), etap:isnt(Worker1, Worker3, "Clients 1 and 3 got different workers."), etap:diag("Check that client 4 blocks waiting for a worker."), Client4 = spawn_client(Pool), etap:is(ping_client(Client4), timeout, "Client 4 blocked while waiting."), etap:diag("Kill client's 1 worker."), etap:is(kill_client_worker(Client1), ok, "Killed client's 1 worker."), etap:is(is_process_alive(Worker1), false, "Client's 1 worker process is dead."), etap:diag("Check client 4 got unblocked after first worker's death"), etap:is(ping_client(Client4), ok, "Client 4 not blocked anymore."), Worker4 = get_client_worker(Client4, "4"), etap:is(is_process_alive(Worker4), true, "Client's 4 worker is alive."), etap:isnt(Worker4, Worker1, "Client 4 got a worker different from client 1."), etap:isnt(Worker4, Worker2, "Client 4 got a worker different from client 2."), etap:isnt(Worker4, Worker3, "Client 4 got a worker different from client 3."), etap:diag("Check that stopping client 1 is a noop."), etap:is(stop_client(Client1), ok, "First client stopped."), etap:is(is_process_alive(Worker2), true, "Client's 2 worker still alive."), etap:is(is_process_alive(Worker3), true, "Client's 3 worker still alive."), etap:is(is_process_alive(Worker4), true, "Client's 4 worker still alive."), etap:diag("Check that client 5 blocks waiting for a worker."), Client5 = spawn_client(Pool), etap:is(ping_client(Client5), timeout, "Client 5 blocked while waiting."), etap:diag("Check that stopping client 2 gives up its worker."), etap:is(stop_client(Client2), ok, "Second client stopped."), etap:diag("Now check that client 5 has been unblocked."), etap:is(ping_client(Client5), ok, "Client 5 was unblocked."), Worker5 = get_client_worker(Client5, "5"), etap:is(is_process_alive(Worker5), true, "Client's 5 worker is alive."), etap:isnt(Worker5, Worker1, "Client 5 got a worker different from client 1."), etap:is(Worker5, Worker2, "Client 5 got same worker as client 2."), etap:isnt(Worker5, Worker3, "Client 5 got a worker different from client 3."), etap:isnt(Worker5, Worker4, "Client 5 got a worker different from client 4."), etap:is(is_process_alive(Worker3), true, "Client's 3 worker still alive."), etap:is(is_process_alive(Worker4), true, "Client's 4 worker still alive."), etap:is(is_process_alive(Worker5), true, "Client's 5 worker still alive."), lists:foreach(fun(C) -> ok = stop_client(C) end, [Client3, Client4, Client5]), stop_pool(Pool). spawn_client(Pool) -> Parent = self(), Ref = make_ref(), Pid = spawn(fun() -> {ok, Worker} = couch_replicator_httpc_pool:get_worker(Pool), loop(Parent, Ref, Worker, Pool) end), {Pid, Ref}. ping_client({Pid, Ref}) -> Pid ! ping, receive {pong, Ref} -> ok after 3000 -> timeout end. get_client_worker({Pid, Ref}, ClientName) -> Pid ! get_worker, receive {worker, Ref, Worker} -> Worker after 3000 -> etap:bail("Timeout getting client " ++ ClientName ++ " worker.") end. stop_client({Pid, Ref}) -> Pid ! stop, receive {stop, Ref} -> ok after 3000 -> timeout end. kill_client_worker({Pid, Ref}) -> Pid ! get_worker, receive {worker, Ref, Worker} -> exit(Worker, kill), ok after 3000 -> timeout end. loop(Parent, Ref, Worker, Pool) -> receive ping -> Parent ! {pong, Ref}, loop(Parent, Ref, Worker, Pool); get_worker -> Parent ! {worker, Ref, Worker}, loop(Parent, Ref, Worker, Pool); stop -> couch_replicator_httpc_pool:release_worker(Pool, Worker), Parent ! {stop, Ref} end. spawn_pool() -> Host = couch_config:get("httpd", "bind_address", "127.0.0.1"), Port = couch_config:get("httpd", "port", "5984"), {ok, Pool} = couch_replicator_httpc_pool:start_link( "http://" ++ Host ++ ":5984", [{max_connections, 3}]), Pool. stop_pool(Pool) -> ok = couch_replicator_httpc_pool:stop(Pool). apache-couchdb-1.6.0/src/couch_replicator/test/01-load.t0000644000175000001440000000222412332105522022733 0ustar00djcusers00000000000000#!/usr/bin/env escript %% -*- erlang -*- % Licensed under the Apache License, Version 2.0 (the "License"); you may not % use this file except in compliance with the License. You may obtain a copy of % the License at % % http://www.apache.org/licenses/LICENSE-2.0 % % Unless required by applicable law or agreed to in writing, software % distributed under the License is distributed on an "AS IS" BASIS, WITHOUT % WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the % License for the specific language governing permissions and limitations under % the License. % Test that we can load each module. main(_) -> test_util:init_code_path(), Modules = [ couch_replicator_api_wrap, couch_replicator_httpc, couch_replicator_httpd, couch_replicator_manager, couch_replicator_notifier, couch_replicator, couch_replicator_worker, couch_replicator_utils, couch_replicator_job_sup ], etap:plan(length(Modules)), lists:foreach( fun(Module) -> etap:loaded_ok(Module, lists:concat(["Loaded: ", Module])) end, Modules), etap:end_tests(). apache-couchdb-1.6.0/src/couch_replicator/test/03-replication-compact.t0000755000175000001440000003646412332105522025773 0ustar00djcusers00000000000000#!/usr/bin/env escript %% -*- erlang -*- % Licensed under the Apache License, Version 2.0 (the "License"); you may not % use this file except in compliance with the License. You may obtain a copy of % the License at % % http://www.apache.org/licenses/LICENSE-2.0 % % Unless required by applicable law or agreed to in writing, software % distributed under the License is distributed on an "AS IS" BASIS, WITHOUT % WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the % License for the specific language governing permissions and limitations under % the License. % Verify that compacting databases that are being used as the source or % target of a replication doesn't affect the replication and that the % replication doesn't hold their reference counters forever. -define(b2l(B), binary_to_list(B)). -record(user_ctx, { name = null, roles = [], handler }). -record(db, { main_pid = nil, update_pid = nil, compactor_pid = nil, instance_start_time, % number of microsecs since jan 1 1970 as a binary string fd, updater_fd, fd_ref_counter, header = nil, committed_update_seq, fulldocinfo_by_id_btree, docinfo_by_seq_btree, local_docs_btree, update_seq, name, filepath, validate_doc_funs = [], security = [], security_ptr = nil, user_ctx = #user_ctx{}, waiting_delayed_commit = nil, revs_limit = 1000, fsync_options = [], options = [], compression, before_doc_update, after_doc_read }). -record(rep, { id, source, target, options, user_ctx, doc_id }). source_db_name() -> <<"couch_test_rep_db_a">>. target_db_name() -> <<"couch_test_rep_db_b">>. main(_) -> test_util:init_code_path(), etap:plan(376), case (catch test()) of ok -> etap:end_tests(); Other -> etap:diag(io_lib:format("Test died abnormally: ~p", [Other])), etap:bail(Other) end, ok. test() -> couch_server_sup:start_link(test_util:config_files()), ibrowse:start(), Pairs = [ {source_db_name(), target_db_name()}, {{remote, source_db_name()}, target_db_name()}, {source_db_name(), {remote, target_db_name()}}, {{remote, source_db_name()}, {remote, (target_db_name())}} ], lists:foreach( fun({Source, Target}) -> {ok, SourceDb} = create_db(source_db_name()), etap:is(couch_db:is_idle(SourceDb), true, "Source database is idle before starting replication"), {ok, TargetDb} = create_db(target_db_name()), etap:is(couch_db:is_idle(TargetDb), true, "Target database is idle before starting replication"), {ok, RepPid, RepId} = replicate(Source, Target), check_active_tasks(RepPid, RepId, Source, Target), {ok, DocsWritten} = populate_and_compact_test( RepPid, SourceDb, TargetDb), wait_target_in_sync(DocsWritten, TargetDb), check_active_tasks(RepPid, RepId, Source, Target), cancel_replication(RepId, RepPid), compare_dbs(SourceDb, TargetDb), delete_db(SourceDb), delete_db(TargetDb), couch_server_sup:stop(), ok = timer:sleep(1000), couch_server_sup:start_link(test_util:config_files()) end, Pairs), couch_server_sup:stop(), ok. populate_and_compact_test(RepPid, SourceDb0, TargetDb0) -> etap:is(is_process_alive(RepPid), true, "Replication process is alive"), check_db_alive("source", SourceDb0), check_db_alive("target", TargetDb0), Writer = spawn_writer(SourceDb0), lists:foldl( fun(_, {SourceDb, TargetDb, DocCount}) -> pause_writer(Writer), compact_db("source", SourceDb), etap:is(is_process_alive(RepPid), true, "Replication process is alive after source database compaction"), check_db_alive("source", SourceDb), check_ref_counter("source", SourceDb), compact_db("target", TargetDb), etap:is(is_process_alive(RepPid), true, "Replication process is alive after target database compaction"), check_db_alive("target", TargetDb), check_ref_counter("target", TargetDb), {ok, SourceDb2} = reopen_db(SourceDb), {ok, TargetDb2} = reopen_db(TargetDb), resume_writer(Writer), wait_writer(Writer, DocCount), compact_db("source", SourceDb2), etap:is(is_process_alive(RepPid), true, "Replication process is alive after source database compaction"), check_db_alive("source", SourceDb2), pause_writer(Writer), check_ref_counter("source", SourceDb2), resume_writer(Writer), compact_db("target", TargetDb2), etap:is(is_process_alive(RepPid), true, "Replication process is alive after target database compaction"), check_db_alive("target", TargetDb2), pause_writer(Writer), check_ref_counter("target", TargetDb2), resume_writer(Writer), {ok, SourceDb3} = reopen_db(SourceDb2), {ok, TargetDb3} = reopen_db(TargetDb2), {SourceDb3, TargetDb3, DocCount + 50} end, {SourceDb0, TargetDb0, 50}, lists:seq(1, 5)), DocsWritten = stop_writer(Writer), {ok, DocsWritten}. check_db_alive(Type, #db{main_pid = Pid}) -> etap:is(is_process_alive(Pid), true, "Local " ++ Type ++ " database main pid is alive"). compact_db(Type, #db{name = Name}) -> {ok, Db} = couch_db:open_int(Name, []), {ok, CompactPid} = couch_db:start_compact(Db), MonRef = erlang:monitor(process, CompactPid), receive {'DOWN', MonRef, process, CompactPid, normal} -> ok; {'DOWN', MonRef, process, CompactPid, Reason} -> etap:bail("Error compacting " ++ Type ++ " database " ++ ?b2l(Name) ++ ": " ++ couch_util:to_list(Reason)) after 30000 -> etap:bail("Compaction for " ++ Type ++ " database " ++ ?b2l(Name) ++ " didn't finish") end, ok = couch_db:close(Db). check_ref_counter(Type, #db{name = Name, fd_ref_counter = OldRefCounter}) -> MonRef = erlang:monitor(process, OldRefCounter), receive {'DOWN', MonRef, process, OldRefCounter, _} -> etap:diag("Old " ++ Type ++ " database ref counter terminated") after 30000 -> etap:bail("Old " ++ Type ++ " database ref counter didn't terminate") end, {ok, #db{fd_ref_counter = NewRefCounter} = Db} = couch_db:open_int(Name, []), ok = couch_db:close(Db), etap:isnt( NewRefCounter, OldRefCounter, Type ++ " database has new ref counter"). reopen_db(#db{name = Name}) -> {ok, Db} = couch_db:open_int(Name, []), ok = couch_db:close(Db), {ok, Db}. wait_target_in_sync(DocCount, #db{name = TargetName}) -> wait_target_in_sync_loop(DocCount, TargetName, 300). wait_target_in_sync_loop(_DocCount, _TargetName, 0) -> etap:bail("Could not get source and target databases in sync"); wait_target_in_sync_loop(DocCount, TargetName, RetriesLeft) -> {ok, Target} = couch_db:open_int(TargetName, []), {ok, TargetInfo} = couch_db:get_db_info(Target), ok = couch_db:close(Target), TargetDocCount = couch_util:get_value(doc_count, TargetInfo), case TargetDocCount == DocCount of true -> etap:diag("Source and target databases are in sync"); false -> ok = timer:sleep(100), wait_target_in_sync_loop(DocCount, TargetName, RetriesLeft - 1) end. compare_dbs(#db{name = SourceName}, #db{name = TargetName}) -> {ok, SourceDb} = couch_db:open_int(SourceName, []), {ok, TargetDb} = couch_db:open_int(TargetName, []), Fun = fun(FullDocInfo, _, Acc) -> {ok, Doc} = couch_db:open_doc(SourceDb, FullDocInfo), {Props} = DocJson = couch_doc:to_json_obj(Doc, [attachments]), DocId = couch_util:get_value(<<"_id">>, Props), DocTarget = case couch_db:open_doc(TargetDb, DocId) of {ok, DocT} -> DocT; Error -> etap:bail("Error opening document '" ++ ?b2l(DocId) ++ "' from target: " ++ couch_util:to_list(Error)) end, DocTargetJson = couch_doc:to_json_obj(DocTarget, [attachments]), case DocTargetJson of DocJson -> ok; _ -> etap:bail("Content from document '" ++ ?b2l(DocId) ++ "' differs in target database") end, {ok, Acc} end, {ok, _, _} = couch_db:enum_docs(SourceDb, Fun, [], []), etap:diag("Target database has the same documents as the source database"), ok = couch_db:close(SourceDb), ok = couch_db:close(TargetDb). check_active_tasks(RepPid, {BaseId, Ext} = _RepId, Src, Tgt) -> Source = case Src of {remote, NameSrc} -> <<(db_url(NameSrc))/binary, $/>>; _ -> Src end, Target = case Tgt of {remote, NameTgt} -> <<(db_url(NameTgt))/binary, $/>>; _ -> Tgt end, FullRepId = list_to_binary(BaseId ++ Ext), Pid = list_to_binary(pid_to_list(RepPid)), [RepTask] = couch_task_status:all(), etap:is(couch_util:get_value(pid, RepTask), Pid, "_active_tasks entry has correct pid property"), etap:is(couch_util:get_value(replication_id, RepTask), FullRepId, "_active_tasks entry has right replication id"), etap:is(couch_util:get_value(continuous, RepTask), true, "_active_tasks entry has continuous property set to true"), etap:is(couch_util:get_value(source, RepTask), Source, "_active_tasks entry has correct source property"), etap:is(couch_util:get_value(target, RepTask), Target, "_active_tasks entry has correct target property"), etap:is(is_integer(couch_util:get_value(docs_read, RepTask)), true, "_active_tasks entry has integer docs_read property"), etap:is(is_integer(couch_util:get_value(docs_written, RepTask)), true, "_active_tasks entry has integer docs_written property"), etap:is(is_integer(couch_util:get_value(doc_write_failures, RepTask)), true, "_active_tasks entry has integer doc_write_failures property"), etap:is(is_integer(couch_util:get_value(revisions_checked, RepTask)), true, "_active_tasks entry has integer revisions_checked property"), etap:is(is_integer(couch_util:get_value(missing_revisions_found, RepTask)), true, "_active_tasks entry has integer missing_revisions_found property"), etap:is(is_integer(couch_util:get_value(checkpointed_source_seq, RepTask)), true, "_active_tasks entry has integer checkpointed_source_seq property"), etap:is(is_integer(couch_util:get_value(source_seq, RepTask)), true, "_active_tasks entry has integer source_seq property"), Progress = couch_util:get_value(progress, RepTask), etap:is(is_integer(Progress), true, "_active_tasks entry has an integer progress property"), etap:is(Progress =< 100, true, "Progress is not greater than 100%"). wait_writer(Pid, NumDocs) -> case get_writer_num_docs_written(Pid) of N when N >= NumDocs -> ok; _ -> wait_writer(Pid, NumDocs) end. spawn_writer(Db) -> Parent = self(), Pid = spawn(fun() -> writer_loop(Db, Parent, 0) end), etap:diag("Started source database writer"), Pid. pause_writer(Pid) -> Ref = make_ref(), Pid ! {pause, Ref}, receive {paused, Ref} -> ok after 30000 -> etap:bail("Failed to pause source database writer") end. resume_writer(Pid) -> Ref = make_ref(), Pid ! {continue, Ref}, receive {ok, Ref} -> ok after 30000 -> etap:bail("Failed to unpause source database writer") end. get_writer_num_docs_written(Pid) -> Ref = make_ref(), Pid ! {get_count, Ref}, receive {count, Ref, Count} -> Count after 30000 -> etap:bail("Timeout getting number of documents written from " "source database writer") end. stop_writer(Pid) -> Ref = make_ref(), Pid ! {stop, Ref}, receive {stopped, Ref, DocsWritten} -> MonRef = erlang:monitor(process, Pid), receive {'DOWN', MonRef, process, Pid, _Reason} -> etap:diag("Stopped source database writer"), DocsWritten after 30000 -> etap:bail("Timeout stopping source database writer") end after 30000 -> etap:bail("Timeout stopping source database writer") end. writer_loop(#db{name = DbName}, Parent, Counter) -> maybe_pause(Parent, Counter), Doc = couch_doc:from_json_obj({[ {<<"_id">>, list_to_binary(integer_to_list(Counter + 1))}, {<<"value">>, Counter + 1}, {<<"_attachments">>, {[ {<<"icon1.png">>, {[ {<<"data">>, base64:encode(att_data())}, {<<"content_type">>, <<"image/png">>} ]}}, {<<"icon2.png">>, {[ {<<"data">>, base64:encode(iolist_to_binary( [att_data(), att_data()]))}, {<<"content_type">>, <<"image/png">>} ]}} ]}} ]}), maybe_pause(Parent, Counter), {ok, Db} = couch_db:open_int(DbName, []), {ok, _} = couch_db:update_doc(Db, Doc, []), ok = couch_db:close(Db), receive {get_count, Ref} -> Parent ! {count, Ref, Counter + 1}, writer_loop(Db, Parent, Counter + 1); {stop, Ref} -> Parent ! {stopped, Ref, Counter + 1} after 0 -> ok = timer:sleep(500), writer_loop(Db, Parent, Counter + 1) end. maybe_pause(Parent, Counter) -> receive {get_count, Ref} -> Parent ! {count, Ref, Counter}; {pause, Ref} -> Parent ! {paused, Ref}, receive {continue, Ref2} -> Parent ! {ok, Ref2} end after 0 -> ok end. db_url(DbName) -> iolist_to_binary([ "http://", couch_config:get("httpd", "bind_address", "127.0.0.1"), ":", integer_to_list(mochiweb_socket_server:get(couch_httpd, port)), "/", DbName ]). create_db(DbName) -> {ok, Db} = couch_db:create( DbName, [{user_ctx, #user_ctx{roles = [<<"_admin">>]}}, overwrite]), couch_db:close(Db), {ok, Db}. delete_db(#db{name = DbName, main_pid = Pid}) -> ok = couch_server:delete( DbName, [{user_ctx, #user_ctx{roles = [<<"_admin">>]}}]), MonRef = erlang:monitor(process, Pid), receive {'DOWN', MonRef, process, Pid, _Reason} -> ok after 30000 -> etap:bail("Timeout deleting database") end. replicate({remote, Db}, Target) -> replicate(db_url(Db), Target); replicate(Source, {remote, Db}) -> replicate(Source, db_url(Db)); replicate(Source, Target) -> RepObject = {[ {<<"source">>, Source}, {<<"target">>, Target}, {<<"continuous">>, true} ]}, {ok, Rep} = couch_replicator_utils:parse_rep_doc( RepObject, #user_ctx{roles = [<<"_admin">>]}), {ok, Pid} = couch_replicator:async_replicate(Rep), {ok, Pid, Rep#rep.id}. cancel_replication(RepId, RepPid) -> {ok, _} = couch_replicator:cancel_replication(RepId), etap:is(is_process_alive(RepPid), false, "Replication process is no longer alive after cancel"). att_data() -> {ok, Data} = file:read_file( test_util:source_file("share/www/image/logo.png")), Data. apache-couchdb-1.6.0/src/couch_replicator/test/05-replication-many-leaves.t0000755000175000001440000002255112332105522026560 0ustar00djcusers00000000000000#!/usr/bin/env escript %% -*- erlang -*- % Licensed under the Apache License, Version 2.0 (the "License"); you may not % use this file except in compliance with the License. You may obtain a copy of % the License at % % http://www.apache.org/licenses/LICENSE-2.0 % % Unless required by applicable law or agreed to in writing, software % distributed under the License is distributed on an "AS IS" BASIS, WITHOUT % WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the % License for the specific language governing permissions and limitations under % the License. % Test replication of documents with many leaf revisions. % Motivated by COUCHDB-1340 and other similar issues where a document % GET with a too long ?open_revs revision list doesn't work due to % maximum web server limits for the HTTP request path. -record(user_ctx, { name = null, roles = [], handler }). -record(doc, { id = <<"">>, revs = {0, []}, body = {[]}, atts = [], deleted = false, meta = [] }). -record(att, { name, type, att_len, disk_len, md5= <<>>, revpos=0, data, encoding=identity }). -define(b2l(B), binary_to_list(B)). -define(l2b(L), list_to_binary(L)). -define(i2l(I), integer_to_list(I)). source_db_name() -> <<"couch_test_rep_db_a">>. target_db_name() -> <<"couch_test_rep_db_b">>. doc_ids() -> [<<"doc1">>, <<"doc2">>, <<"doc3">>]. doc_num_conflicts(<<"doc1">>) -> 10; doc_num_conflicts(<<"doc2">>) -> 100; % a number > MaxURLlength (7000) / length(DocRevisionString) doc_num_conflicts(<<"doc3">>) -> 210. main(_) -> test_util:init_code_path(), etap:plan(56), case (catch test()) of ok -> etap:end_tests(); Other -> etap:diag(io_lib:format("Test died abnormally: ~p", [Other])), etap:bail(Other) end, ok. test() -> couch_server_sup:start_link(test_util:config_files()), ibrowse:start(), crypto:start(), couch_config:set("replicator", "connection_timeout", "90000", false), Pairs = [ {source_db_name(), target_db_name()}, {{remote, source_db_name()}, target_db_name()}, {source_db_name(), {remote, target_db_name()}}, {{remote, source_db_name()}, {remote, (target_db_name())}} ], lists:foreach( fun({Source, Target}) -> {ok, SourceDb} = create_db(source_db_name()), etap:diag("Populating source database"), {ok, DocRevs} = populate_db(SourceDb), ok = couch_db:close(SourceDb), etap:diag("Creating target database"), {ok, TargetDb} = create_db(target_db_name()), ok = couch_db:close(TargetDb), etap:diag("Triggering replication"), replicate(Source, Target), etap:diag("Replication finished, comparing source and target databases"), {ok, SourceDb2} = couch_db:open_int(source_db_name(), []), {ok, TargetDb2} = couch_db:open_int(target_db_name(), []), verify_target(SourceDb2, TargetDb2, DocRevs), ok = couch_db:close(SourceDb2), ok = couch_db:close(TargetDb2), {ok, SourceDb3} = couch_db:open_int(source_db_name(), []), {ok, DocRevs2} = add_attachments(SourceDb3, DocRevs, 2), ok = couch_db:close(SourceDb3), etap:diag("Triggering replication again"), replicate(Source, Target), etap:diag("Replication finished, comparing source and target databases"), {ok, SourceDb4} = couch_db:open_int(source_db_name(), []), {ok, TargetDb4} = couch_db:open_int(target_db_name(), []), verify_target(SourceDb4, TargetDb4, DocRevs2), ok = couch_db:close(SourceDb4), ok = couch_db:close(TargetDb4), etap:diag("Deleting source and target databases"), delete_db(TargetDb), delete_db(SourceDb), ok = timer:sleep(1000) end, Pairs), couch_server_sup:stop(), ok. populate_db(Db) -> DocRevsDict = lists:foldl( fun(DocId, Acc) -> Value = <<"0">>, Doc = #doc{ id = DocId, body = {[ {<<"value">>, Value} ]} }, {ok, Rev} = couch_db:update_doc(Db, Doc, []), {ok, DocRevs} = add_doc_siblings(Db, DocId, doc_num_conflicts(DocId)), dict:store(DocId, [Rev | DocRevs], Acc) end, dict:new(), doc_ids()), {ok, dict:to_list(DocRevsDict)}. add_doc_siblings(Db, DocId, NumLeaves) when NumLeaves > 0 -> add_doc_siblings(Db, DocId, NumLeaves, [], []). add_doc_siblings(Db, _DocId, 0, AccDocs, AccRevs) -> {ok, []} = couch_db:update_docs(Db, AccDocs, [], replicated_changes), {ok, AccRevs}; add_doc_siblings(Db, DocId, NumLeaves, AccDocs, AccRevs) -> Value = list_to_binary(integer_to_list(NumLeaves)), Rev = couch_util:md5(Value), Doc = #doc{ id = DocId, revs = {1, [Rev]}, body = {[ {<<"value">>, Value} ]} }, add_doc_siblings(Db, DocId, NumLeaves - 1, [Doc | AccDocs], [{1, Rev} | AccRevs]). verify_target(_SourceDb, _TargetDb, []) -> ok; verify_target(SourceDb, TargetDb, [{DocId, RevList} | Rest]) -> {ok, Lookups} = couch_db:open_doc_revs( TargetDb, DocId, RevList, [conflicts, deleted_conflicts]), Docs = [Doc || {ok, Doc} <- Lookups], {ok, SourceLookups} = couch_db:open_doc_revs( SourceDb, DocId, RevList, [conflicts, deleted_conflicts]), SourceDocs = [Doc || {ok, Doc} <- SourceLookups], Total = doc_num_conflicts(DocId) + 1, etap:is( length(Docs), Total, "Target has " ++ ?i2l(Total) ++ " leaf revisions of document " ++ ?b2l(DocId)), etap:diag("Verifying all revisions of document " ++ ?b2l(DocId)), lists:foreach( fun({#doc{id = Id, revs = Revs} = TgtDoc, #doc{id = Id, revs = Revs} = SrcDoc}) -> SourceJson = couch_doc:to_json_obj(SrcDoc, [attachments]), TargetJson = couch_doc:to_json_obj(TgtDoc, [attachments]), case TargetJson of SourceJson -> ok; _ -> {Pos, [Rev | _]} = Revs, etap:bail("Wrong value for revision " ++ ?b2l(couch_doc:rev_to_str({Pos, Rev})) ++ " of document " ++ ?b2l(DocId)) end end, lists:zip(Docs, SourceDocs)), verify_target(SourceDb, TargetDb, Rest). add_attachments(Source, DocIdRevs, NumAtts) -> add_attachments(Source, DocIdRevs, NumAtts, []). add_attachments(_SourceDb, [], _NumAtts, Acc) -> {ok, Acc}; add_attachments(SourceDb, [{DocId, RevList} | Rest], NumAtts, IdRevsAcc) -> {ok, SourceLookups} = couch_db:open_doc_revs( SourceDb, DocId, RevList, []), SourceDocs = [Doc || {ok, Doc} <- SourceLookups], Total = doc_num_conflicts(DocId) + 1, etap:is( length(SourceDocs), Total, "Source still has " ++ ?i2l(Total) ++ " leaf revisions of document " ++ ?b2l(DocId)), etap:diag("Adding " ++ ?i2l(NumAtts) ++ " attachments to each revision of the document " ++ ?b2l(DocId)), NewDocs = lists:foldl( fun(#doc{atts = Atts, revs = {Pos, [Rev | _]}} = Doc, Acc) -> NewAtts = lists:foldl( fun(I, AttAcc) -> AttData = crypto:rand_bytes(100), NewAtt = #att{ name = iolist_to_binary( ["att_", ?i2l(I), "_", couch_doc:rev_to_str({Pos, Rev})]), type = <<"application/foobar">>, att_len = byte_size(AttData), data = AttData }, [NewAtt | AttAcc] end, [], lists:seq(1, NumAtts)), [Doc#doc{atts = Atts ++ NewAtts} | Acc] end, [], SourceDocs), {ok, UpdateResults} = couch_db:update_docs(SourceDb, NewDocs, []), NewRevs = [R || {ok, R} <- UpdateResults], etap:is( length(NewRevs), length(NewDocs), "Document revisions updated with " ++ ?i2l(NumAtts) ++ " attachments"), add_attachments(SourceDb, Rest, NumAtts, [{DocId, NewRevs} | IdRevsAcc]). db_url(DbName) -> iolist_to_binary([ "http://", couch_config:get("httpd", "bind_address", "127.0.0.1"), ":", integer_to_list(mochiweb_socket_server:get(couch_httpd, port)), "/", DbName ]). create_db(DbName) -> couch_db:create( DbName, [{user_ctx, #user_ctx{roles = [<<"_admin">>]}}, overwrite]). delete_db(Db) -> ok = couch_server:delete( couch_db:name(Db), [{user_ctx, #user_ctx{roles = [<<"_admin">>]}}]). replicate({remote, Db}, Target) -> replicate(db_url(Db), Target); replicate(Source, {remote, Db}) -> replicate(Source, db_url(Db)); replicate(Source, Target) -> RepObject = {[ {<<"source">>, Source}, {<<"target">>, Target} ]}, {ok, Rep} = couch_replicator_utils:parse_rep_doc( RepObject, #user_ctx{roles = [<<"_admin">>]}), {ok, Pid} = couch_replicator:async_replicate(Rep), MonRef = erlang:monitor(process, Pid), receive {'DOWN', MonRef, process, Pid, Reason} -> etap:is(Reason, normal, "Replication finished successfully") after 900000 -> etap:bail("Timeout waiting for replication to finish") end. apache-couchdb-1.6.0/src/couch_replicator/test/07-use-checkpoints.t0000755000175000001440000001776312332105522025147 0ustar00djcusers00000000000000#!/usr/bin/env escript %% -*- erlang -*- % Licensed under the Apache License, Version 2.0 (the "License"); you may not % use this file except in compliance with the License. You may obtain a copy of % the License at % % http://www.apache.org/licenses/LICENSE-2.0 % % Unless required by applicable law or agreed to in writing, software % distributed under the License is distributed on an "AS IS" BASIS, WITHOUT % WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the % License for the specific language governing permissions and limitations under % the License. % Verify that compacting databases that are being used as the source or % target of a replication doesn't affect the replication and that the % replication doesn't hold their reference counters forever. -define(b2l(B), binary_to_list(B)). -record(user_ctx, { name = null, roles = [], handler }). -record(doc, { id = <<"">>, revs = {0, []}, body = {[]}, atts = [], deleted = false, meta = [] }). -record(db, { main_pid = nil, update_pid = nil, compactor_pid = nil, instance_start_time, % number of microsecs since jan 1 1970 as a binary string fd, updater_fd, fd_ref_counter, header = nil, committed_update_seq, fulldocinfo_by_id_btree, docinfo_by_seq_btree, local_docs_btree, update_seq, name, filepath, validate_doc_funs = [], security = [], security_ptr = nil, user_ctx = #user_ctx{}, waiting_delayed_commit = nil, revs_limit = 1000, fsync_options = [], options = [], compression, before_doc_update, after_doc_read }). -record(rep, { id, source, target, options, user_ctx, doc_id }). source_db_name() -> <<"couch_test_rep_db_a">>. target_db_name() -> <<"couch_test_rep_db_b">>. main(_) -> test_util:init_code_path(), etap:plan(16), case (catch test()) of ok -> etap:end_tests(); Other -> etap:diag(io_lib:format("Test died abnormally: ~p", [Other])), etap:bail(Other) end, ok. test() -> couch_server_sup:start_link(test_util:config_files()), ibrowse:start(), % order matters test_use_checkpoints(false), test_use_checkpoints(true), couch_server_sup:stop(), ok. test_use_checkpoints(UseCheckpoints) -> Pairs = [ {source_db_name(), target_db_name()}, {{remote, source_db_name()}, target_db_name()}, {source_db_name(), {remote, target_db_name()}}, {{remote, source_db_name()}, {remote, (target_db_name())}} ], ListenerFun = case UseCheckpoints of false -> fun({finished, _, {CheckpointHistory}}) -> etap:is(CheckpointHistory, [{<<"use_checkpoints">>,false}], "No checkpoints found"); (_) -> ok end; true -> fun({finished, _, {CheckpointHistory}}) -> SessionId = lists:keyfind( <<"session_id">>, 1, CheckpointHistory), case SessionId of false -> OtpRel = erlang:system_info(otp_release), case OtpRel >= "R14B01" orelse OtpRel < "R14B03" of false -> etap:bail("Checkpoint expected, but not found"); true -> etap:ok(true, " Checkpoint expected, but wan't found." " Your Erlang " ++ OtpRel ++ " version is" " affected to OTP-9167 issue which causes" " failure of this test. Try to upgrade Erlang" " and if this failure repeats file the bug.") end; _ -> etap:ok(true, "There's a checkpoint") end; (_) -> ok end end, {ok, Listener} = couch_replicator_notifier:start_link(ListenerFun), lists:foreach( fun({Source, Target}) -> {ok, SourceDb} = create_db(source_db_name()), etap:diag("Populating source database"), populate_db(SourceDb, 100), ok = couch_db:close(SourceDb), etap:diag("Creating target database"), {ok, TargetDb} = create_db(target_db_name()), ok = couch_db:close(TargetDb), etap:diag("Setup replicator notifier listener"), etap:diag("Triggering replication"), replicate(Source, Target, UseCheckpoints), etap:diag("Replication finished, comparing source and target databases"), compare_dbs(SourceDb, TargetDb), etap:diag("Deleting databases"), delete_db(TargetDb), delete_db(SourceDb), ok = timer:sleep(1000) end, Pairs), couch_replicator_notifier:stop(Listener). populate_db(Db, DocCount) -> Docs = lists:foldl( fun(DocIdCounter, Acc) -> Id = iolist_to_binary(["doc", integer_to_list(DocIdCounter)]), Value = iolist_to_binary(["val", integer_to_list(DocIdCounter)]), Doc = #doc{ id = Id, body = {[ {<<"value">>, Value} ]} }, [Doc | Acc] end, [], lists:seq(1, DocCount)), {ok, _} = couch_db:update_docs(Db, Docs, []). compare_dbs(#db{name = SourceName}, #db{name = TargetName}) -> {ok, SourceDb} = couch_db:open_int(SourceName, []), {ok, TargetDb} = couch_db:open_int(TargetName, []), Fun = fun(FullDocInfo, _, Acc) -> {ok, Doc} = couch_db:open_doc(SourceDb, FullDocInfo), {Props} = DocJson = couch_doc:to_json_obj(Doc, [attachments]), DocId = couch_util:get_value(<<"_id">>, Props), DocTarget = case couch_db:open_doc(TargetDb, DocId) of {ok, DocT} -> DocT; Error -> etap:bail("Error opening document '" ++ ?b2l(DocId) ++ "' from target: " ++ couch_util:to_list(Error)) end, DocTargetJson = couch_doc:to_json_obj(DocTarget, [attachments]), case DocTargetJson of DocJson -> ok; _ -> etap:bail("Content from document '" ++ ?b2l(DocId) ++ "' differs in target database") end, {ok, Acc} end, {ok, _, _} = couch_db:enum_docs(SourceDb, Fun, [], []), etap:diag("Target database has the same documents as the source database"), ok = couch_db:close(SourceDb), ok = couch_db:close(TargetDb). db_url(DbName) -> iolist_to_binary([ "http://", couch_config:get("httpd", "bind_address", "127.0.0.1"), ":", integer_to_list(mochiweb_socket_server:get(couch_httpd, port)), "/", DbName ]). create_db(DbName) -> {ok, Db} = couch_db:create( DbName, [{user_ctx, #user_ctx{roles = [<<"_admin">>]}}, overwrite]), couch_db:close(Db), {ok, Db}. delete_db(#db{name = DbName, main_pid = Pid}) -> ok = couch_server:delete( DbName, [{user_ctx, #user_ctx{roles = [<<"_admin">>]}}]), MonRef = erlang:monitor(process, Pid), receive {'DOWN', MonRef, process, Pid, _Reason} -> ok after 30000 -> etap:bail("Timeout deleting database") end. replicate({remote, Db}, Target, UseCheckpoints) -> replicate(db_url(Db), Target, UseCheckpoints); replicate(Source, {remote, Db}, UseCheckpoints) -> replicate(Source, db_url(Db), UseCheckpoints); replicate(Source, Target, UseCheckpoints) -> RepObject = {[ {<<"source">>, Source}, {<<"target">>, Target}, {<<"use_checkpoints">>, UseCheckpoints} ]}, {ok, Rep} = couch_replicator_utils:parse_rep_doc( RepObject, #user_ctx{roles = [<<"_admin">>]}), {ok, Pid} = couch_replicator:async_replicate(Rep), MonRef = erlang:monitor(process, Pid), receive {'DOWN', MonRef, process, Pid, Reason} -> etap:is(Reason, normal, "Replication finished successfully") after 300000 -> etap:bail("Timeout waiting for replication to finish") end. apache-couchdb-1.6.0/src/couch_replicator/test/04-replication-large-atts.t0000755000175000001440000002065212332105522026401 0ustar00djcusers00000000000000#!/usr/bin/env escript %% -*- erlang -*- % Licensed under the Apache License, Version 2.0 (the "License"); you may not % use this file except in compliance with the License. You may obtain a copy of % the License at % % http://www.apache.org/licenses/LICENSE-2.0 % % Unless required by applicable law or agreed to in writing, software % distributed under the License is distributed on an "AS IS" BASIS, WITHOUT % WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the % License for the specific language governing permissions and limitations under % the License. % Test replication of large attachments. Verify that both source and % target have the same attachment data and metadata. -define(b2l(Bin), binary_to_list(Bin)). -record(user_ctx, { name = null, roles = [], handler }). -record(doc, { id = <<"">>, revs = {0, []}, body = {[]}, atts = [], deleted = false, meta = [] }). -record(att, { name, type, att_len, disk_len, md5= <<>>, revpos=0, data, encoding=identity }). source_db_name() -> <<"couch_test_rep_db_a">>. target_db_name() -> <<"couch_test_rep_db_b">>. main(_) -> test_util:init_code_path(), etap:plan(1192), case (catch test()) of ok -> etap:end_tests(); Other -> etap:diag(io_lib:format("Test died abnormally: ~p", [Other])), etap:bail(Other) end, ok. test() -> couch_server_sup:start_link(test_util:config_files()), application:start(ibrowse), application:start(crypto), couch_config:set("attachments", "compressible_types", "text/*", false), Pairs = [ {source_db_name(), target_db_name()}, {{remote, source_db_name()}, target_db_name()}, {source_db_name(), {remote, target_db_name()}}, {{remote, source_db_name()}, {remote, (target_db_name())}} ], {ok, SourceDb} = create_db(source_db_name()), etap:diag("Populating source database"), populate_db(SourceDb, 11), ok = couch_db:close(SourceDb), lists:foreach( fun({Source, Target}) -> etap:diag("Creating target database"), {ok, TargetDb} = create_db(target_db_name()), ok = couch_db:close(TargetDb), etap:diag("Triggering replication"), replicate(Source, Target), etap:diag("Replication finished, comparing source and target databases"), compare_dbs(SourceDb, TargetDb), etap:diag("Deleting target database"), delete_db(TargetDb), ok = timer:sleep(1000) end, Pairs), delete_db(SourceDb), couch_server_sup:stop(), ok. populate_db(Db, DocCount) -> Docs = lists:foldl( fun(DocIdCounter, Acc) -> Doc = #doc{ id = iolist_to_binary(["doc", integer_to_list(DocIdCounter)]), body = {[]}, atts = [ att(<<"att1">>, 2 * 1024 * 1024, <<"text/plain">>), att(<<"att2">>, round(6.6 * 1024 * 1024), <<"app/binary">>) ] }, [Doc | Acc] end, [], lists:seq(1, DocCount)), {ok, _} = couch_db:update_docs(Db, Docs, []). att(Name, Size, Type) -> #att{ name = Name, type = Type, att_len = Size, data = fun(Count) -> crypto:rand_bytes(Count) end }. compare_dbs(Source, Target) -> {ok, SourceDb} = couch_db:open_int(couch_db:name(Source), []), {ok, TargetDb} = couch_db:open_int(couch_db:name(Target), []), Fun = fun(FullDocInfo, _, Acc) -> {ok, DocSource} = couch_db:open_doc(SourceDb, FullDocInfo), Id = DocSource#doc.id, etap:diag("Verifying document " ++ ?b2l(Id)), {ok, DocTarget} = couch_db:open_doc(TargetDb, Id), etap:is(DocTarget#doc.body, DocSource#doc.body, "Same body in source and target databases"), #doc{atts = SourceAtts} = DocSource, #doc{atts = TargetAtts} = DocTarget, etap:is( lists:sort([N || #att{name = N} <- SourceAtts]), lists:sort([N || #att{name = N} <- TargetAtts]), "Document has same number (and names) of attachments in " "source and target databases"), lists:foreach( fun(#att{name = AttName} = Att) -> etap:diag("Verifying attachment " ++ ?b2l(AttName)), {ok, AttTarget} = find_att(TargetAtts, AttName), SourceMd5 = att_md5(Att), TargetMd5 = att_md5(AttTarget), case AttName of <<"att1">> -> etap:is(Att#att.encoding, gzip, "Attachment is gzip encoded in source database"), etap:is(AttTarget#att.encoding, gzip, "Attachment is gzip encoded in target database"), DecSourceMd5 = att_decoded_md5(Att), DecTargetMd5 = att_decoded_md5(AttTarget), etap:is(DecTargetMd5, DecSourceMd5, "Same identity content in source and target databases"); _ -> etap:is(Att#att.encoding, identity, "Attachment is not encoded in source database"), etap:is(AttTarget#att.encoding, identity, "Attachment is not encoded in target database") end, etap:is(TargetMd5, SourceMd5, "Same content in source and target databases"), etap:is(is_integer(Att#att.disk_len), true, "#att.disk_len is an integer in source database"), etap:is(is_integer(Att#att.att_len), true, "#att.att_len is an integer in source database"), etap:is(is_integer(AttTarget#att.disk_len), true, "#att.disk_len is an integer in target database"), etap:is(is_integer(AttTarget#att.att_len), true, "#att.att_len is an integer in target database"), etap:is(Att#att.disk_len, AttTarget#att.disk_len, "Same identity length in source and target databases"), etap:is(Att#att.att_len, AttTarget#att.att_len, "Same encoded length in source and target databases"), etap:is(Att#att.type, AttTarget#att.type, "Same type in source and target databases"), etap:is(Att#att.md5, SourceMd5, "Correct MD5 in source database"), etap:is(AttTarget#att.md5, SourceMd5, "Correct MD5 in target database") end, SourceAtts), {ok, Acc} end, {ok, _, _} = couch_db:enum_docs(SourceDb, Fun, [], []), ok = couch_db:close(SourceDb), ok = couch_db:close(TargetDb). find_att([], _Name) -> nil; find_att([#att{name = Name} = Att | _], Name) -> {ok, Att}; find_att([_ | Rest], Name) -> find_att(Rest, Name). att_md5(Att) -> Md50 = couch_doc:att_foldl( Att, fun(Chunk, Acc) -> couch_util:md5_update(Acc, Chunk) end, couch_util:md5_init()), couch_util:md5_final(Md50). att_decoded_md5(Att) -> Md50 = couch_doc:att_foldl_decode( Att, fun(Chunk, Acc) -> couch_util:md5_update(Acc, Chunk) end, couch_util:md5_init()), couch_util:md5_final(Md50). db_url(DbName) -> iolist_to_binary([ "http://", couch_config:get("httpd", "bind_address", "127.0.0.1"), ":", integer_to_list(mochiweb_socket_server:get(couch_httpd, port)), "/", DbName ]). create_db(DbName) -> couch_db:create( DbName, [{user_ctx, #user_ctx{roles = [<<"_admin">>]}}, overwrite]). delete_db(Db) -> ok = couch_server:delete( couch_db:name(Db), [{user_ctx, #user_ctx{roles = [<<"_admin">>]}}]). replicate({remote, Db}, Target) -> replicate(db_url(Db), Target); replicate(Source, {remote, Db}) -> replicate(Source, db_url(Db)); replicate(Source, Target) -> RepObject = {[ {<<"source">>, Source}, {<<"target">>, Target} ]}, {ok, Rep} = couch_replicator_utils:parse_rep_doc( RepObject, #user_ctx{roles = [<<"_admin">>]}), {ok, Pid} = couch_replicator:async_replicate(Rep), MonRef = erlang:monitor(process, Pid), receive {'DOWN', MonRef, process, Pid, Reason} -> etap:is(Reason, normal, "Replication finished successfully") after 300000 -> etap:bail("Timeout waiting for replication to finish") end. apache-couchdb-1.6.0/src/couch_replicator/test/06-doc-missing-stubs.t0000755000175000001440000002341212332105522025400 0ustar00djcusers00000000000000#!/usr/bin/env escript %% -*- erlang -*- % Licensed under the Apache License, Version 2.0 (the "License"); you may not % use this file except in compliance with the License. You may obtain a copy of % the License at % % http://www.apache.org/licenses/LICENSE-2.0 % % Unless required by applicable law or agreed to in writing, software % distributed under the License is distributed on an "AS IS" BASIS, WITHOUT % WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the % License for the specific language governing permissions and limitations under % the License. % Test replication of documents with many leaf revisions. % Motivated by COUCHDB-1340 and other similar issues where a document % GET with a too long ?open_revs revision list doesn't work due to % maximum web server limits for the HTTP request path. -record(user_ctx, { name = null, roles = [], handler }). -record(doc, { id = <<"">>, revs = {0, []}, body = {[]}, atts = [], deleted = false, meta = [] }). -record(att, { name, type, att_len, disk_len, md5= <<>>, revpos=0, data, encoding=identity }). -define(b2l(B), binary_to_list(B)). source_db_name() -> <<"couch_test_rep_db_a">>. target_db_name() -> <<"couch_test_rep_db_b">>. target_revs_limit() -> 3. main(_) -> test_util:init_code_path(), etap:plan(128), case (catch test()) of ok -> etap:end_tests(); Other -> etap:diag(io_lib:format("Test died abnormally: ~p", [Other])), etap:bail(Other) end, ok. % Test motivated by COUCHDB-1365. test() -> couch_server_sup:start_link(test_util:config_files()), ibrowse:start(), Pairs = [ {source_db_name(), target_db_name()}, {{remote, source_db_name()}, target_db_name()}, {source_db_name(), {remote, target_db_name()}}, {{remote, source_db_name()}, {remote, (target_db_name())}} ], lists:foreach( fun({Source, Target}) -> {ok, SourceDb} = create_db(source_db_name()), etap:diag("Populating source database"), populate_db(SourceDb), ok = couch_db:close(SourceDb), etap:diag("Creating target database"), {ok, TargetDb} = create_db(target_db_name()), ok = couch_db:set_revs_limit(TargetDb, target_revs_limit()), ok = couch_db:close(TargetDb), etap:diag("Triggering replication"), replicate(Source, Target), etap:diag("Replication finished, comparing source and target databases"), compare_dbs(SourceDb, TargetDb), etap:diag("Updating source database docs"), update_db_docs(couch_db:name(SourceDb), target_revs_limit() + 2), etap:diag("Triggering replication again"), replicate(Source, Target), etap:diag("Replication finished, comparing source and target databases"), compare_dbs(SourceDb, TargetDb), etap:diag("Deleting databases"), delete_db(TargetDb), delete_db(SourceDb), ok = timer:sleep(1000) end, Pairs), couch_server_sup:stop(), ok. populate_db(Db) -> AttData = crypto:rand_bytes(6000), Doc1 = #doc{ id = <<"doc1">>, atts = [ #att{ name = <<"doc1_att1">>, type = <<"application/foobar">>, att_len = byte_size(AttData), data = AttData } ] }, {ok, _} = couch_db:update_doc(Db, Doc1, []). update_db_docs(DbName, Times) -> {ok, Db} = couch_db:open_int(DbName, []), {ok, _, _} = couch_db:enum_docs( Db, fun(FDI, _, Acc) -> db_fold_fun(FDI, Acc) end, {DbName, Times}, []), ok = couch_db:close(Db). db_fold_fun(FullDocInfo, {DbName, Times}) -> {ok, Db} = couch_db:open_int(DbName, []), {ok, Doc} = couch_db:open_doc(Db, FullDocInfo), lists:foldl( fun(_, {Pos, RevId}) -> {ok, Db2} = couch_db:reopen(Db), NewDocVersion = Doc#doc{ revs = {Pos, [RevId]}, body = {[{<<"value">>, base64:encode(crypto:rand_bytes(100))}]} }, {ok, NewRev} = couch_db:update_doc(Db2, NewDocVersion, []), NewRev end, {element(1, Doc#doc.revs), hd(element(2, Doc#doc.revs))}, lists:seq(1, Times)), ok = couch_db:close(Db), {ok, {DbName, Times}}. compare_dbs(Source, Target) -> {ok, SourceDb} = couch_db:open_int(couch_db:name(Source), []), {ok, TargetDb} = couch_db:open_int(couch_db:name(Target), []), Fun = fun(FullDocInfo, _, Acc) -> {ok, DocSource} = couch_db:open_doc( SourceDb, FullDocInfo, [conflicts, deleted_conflicts]), Id = DocSource#doc.id, etap:diag("Verifying document " ++ ?b2l(Id)), {ok, DocTarget} = couch_db:open_doc( TargetDb, Id, [conflicts, deleted_conflicts]), etap:is(DocTarget#doc.body, DocSource#doc.body, "Same body in source and target databases"), etap:is( couch_doc:to_json_obj(DocTarget, []), couch_doc:to_json_obj(DocSource, []), "Same doc body in source and target databases"), #doc{atts = SourceAtts} = DocSource, #doc{atts = TargetAtts} = DocTarget, etap:is( lists:sort([N || #att{name = N} <- SourceAtts]), lists:sort([N || #att{name = N} <- TargetAtts]), "Document has same number (and names) of attachments in " "source and target databases"), lists:foreach( fun(#att{name = AttName} = Att) -> etap:diag("Verifying attachment " ++ ?b2l(AttName)), {ok, AttTarget} = find_att(TargetAtts, AttName), SourceMd5 = att_md5(Att), TargetMd5 = att_md5(AttTarget), case AttName of <<"att1">> -> etap:is(Att#att.encoding, gzip, "Attachment is gzip encoded in source database"), etap:is(AttTarget#att.encoding, gzip, "Attachment is gzip encoded in target database"), DecSourceMd5 = att_decoded_md5(Att), DecTargetMd5 = att_decoded_md5(AttTarget), etap:is(DecTargetMd5, DecSourceMd5, "Same identity content in source and target databases"); _ -> etap:is(Att#att.encoding, identity, "Attachment is not encoded in source database"), etap:is(AttTarget#att.encoding, identity, "Attachment is not encoded in target database") end, etap:is(TargetMd5, SourceMd5, "Same content in source and target databases"), etap:is(is_integer(Att#att.disk_len), true, "#att.disk_len is an integer in source database"), etap:is(is_integer(Att#att.att_len), true, "#att.att_len is an integer in source database"), etap:is(is_integer(AttTarget#att.disk_len), true, "#att.disk_len is an integer in target database"), etap:is(is_integer(AttTarget#att.att_len), true, "#att.att_len is an integer in target database"), etap:is(Att#att.disk_len, AttTarget#att.disk_len, "Same identity length in source and target databases"), etap:is(Att#att.att_len, AttTarget#att.att_len, "Same encoded length in source and target databases"), etap:is(Att#att.type, AttTarget#att.type, "Same type in source and target databases"), etap:is(Att#att.md5, SourceMd5, "Correct MD5 in source database"), etap:is(AttTarget#att.md5, SourceMd5, "Correct MD5 in target database") end, SourceAtts), {ok, Acc} end, {ok, _, _} = couch_db:enum_docs(SourceDb, Fun, [], []), ok = couch_db:close(SourceDb), ok = couch_db:close(TargetDb). find_att([], _Name) -> nil; find_att([#att{name = Name} = Att | _], Name) -> {ok, Att}; find_att([_ | Rest], Name) -> find_att(Rest, Name). att_md5(Att) -> Md50 = couch_doc:att_foldl( Att, fun(Chunk, Acc) -> couch_util:md5_update(Acc, Chunk) end, couch_util:md5_init()), couch_util:md5_final(Md50). att_decoded_md5(Att) -> Md50 = couch_doc:att_foldl_decode( Att, fun(Chunk, Acc) -> couch_util:md5_update(Acc, Chunk) end, couch_util:md5_init()), couch_util:md5_final(Md50). db_url(DbName) -> iolist_to_binary([ "http://", couch_config:get("httpd", "bind_address", "127.0.0.1"), ":", integer_to_list(mochiweb_socket_server:get(couch_httpd, port)), "/", DbName ]). create_db(DbName) -> couch_db:create( DbName, [{user_ctx, #user_ctx{roles = [<<"_admin">>]}}, overwrite]). delete_db(Db) -> ok = couch_server:delete( couch_db:name(Db), [{user_ctx, #user_ctx{roles = [<<"_admin">>]}}]). replicate({remote, Db}, Target) -> replicate(db_url(Db), Target); replicate(Source, {remote, Db}) -> replicate(Source, db_url(Db)); replicate(Source, Target) -> RepObject = {[ {<<"source">>, Source}, {<<"target">>, Target} ]}, {ok, Rep} = couch_replicator_utils:parse_rep_doc( RepObject, #user_ctx{roles = [<<"_admin">>]}), {ok, Pid} = couch_replicator:async_replicate(Rep), MonRef = erlang:monitor(process, Pid), receive {'DOWN', MonRef, process, Pid, Reason} -> etap:is(Reason, normal, "Replication finished successfully") after 300000 -> etap:bail("Timeout waiting for replication to finish") end. apache-couchdb-1.6.0/src/couch_replicator/Makefile.am0000644000175000001440000000462112332105522022471 0ustar00djcusers00000000000000## Licensed under the Apache License, Version 2.0 (the "License"); you may not ## use this file except in compliance with the License. You may obtain a copy of ## the License at ## ## http://www.apache.org/licenses/LICENSE-2.0 ## ## Unless required by applicable law or agreed to in writing, software ## distributed under the License is distributed on an "AS IS" BASIS, WITHOUT ## WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the ## License for the specific language governing permissions and limitations under ## the License. couch_replicatorlibdir = $(localerlanglibdir)/couch_replicator-0.1 couch_replicatorincludedir = $(couch_replicatorlibdir)/include couch_replicatorebindir = $(couch_replicatorlibdir)/ebin couch_replicatorinclude_DATA = $(include_files) couch_replicatorebin_DATA = $(compiled_files) include_files = \ src/couch_replicator_api_wrap.hrl \ src/couch_replicator.hrl \ src/couch_replicator_js_functions.hrl source_files = \ src/couch_replicator_api_wrap.erl \ src/couch_replicator_httpc_pool.erl \ src/couch_replicator_httpc.erl \ src/couch_replicator_httpd.erl \ src/couch_replicator_job_sup.erl \ src/couch_replicator_notifier.erl \ src/couch_replicator_manager.erl \ src/couch_replicator_utils.erl \ src/couch_replicator_worker.erl \ src/couch_replicator.app.src \ src/couch_replicator.erl test_files = \ test/01-load.t \ test/02-httpc-pool.t \ test/03-replication-compact.t \ test/04-replication-large-atts.t \ test/05-replication-many-leaves.t \ test/06-doc-missing-stubs.t \ test/07-use-checkpoints.t compiled_files = \ ebin/couch_replicator_api_wrap.beam \ ebin/couch_replicator_httpc_pool.beam \ ebin/couch_replicator_httpc.beam \ ebin/couch_replicator_httpd.beam \ ebin/couch_replicator_job_sup.beam \ ebin/couch_replicator_notifier.beam \ ebin/couch_replicator_manager.beam \ ebin/couch_replicator_utils.beam \ ebin/couch_replicator_worker.beam \ ebin/couch_replicator.app \ ebin/couch_replicator.beam EXTRA_DIST = $(include_files) $(source_files) $(test_files) CLEANFILES = $(compiled_files) check: if TESTS $(abs_top_builddir)/test/etap/run $(abs_top_srcdir)/src/couch_replicator/test endif ebin/%.app: src/%.app.src @mkdir -p ebin/ sed -e "s|%version%|@version@|g" \ < $< > $@ ebin/%.beam: src/%.erl $(include_files) @mkdir -p ebin/ $(ERLC) -Wall -I$(top_srcdir)/src -I$(top_srcdir)/src/couchdb \ -o ebin/ $(ERLC_FLAGS) ${TEST} $<; apache-couchdb-1.6.0/src/couch_replicator/Makefile.in0000644000175000001440000004323512332105551022510 0ustar00djcusers00000000000000# Makefile.in generated by automake 1.11.6 from Makefile.am. # @configure_input@ # Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, # 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011 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__make_dryrun = \ { \ am__dry=no; \ case $$MAKEFLAGS in \ *\\[\ \ ]*) \ echo 'am--echo: ; @echo "AM" OK' | $(MAKE) -f - 2>/dev/null \ | grep '^AM OK$$' >/dev/null || am__dry=yes;; \ *) \ for am__flg in $$MAKEFLAGS; do \ case $$am__flg in \ *=*|--*) ;; \ *n*) am__dry=yes; break;; \ esac; \ done;; \ esac; \ test $$am__dry = yes; \ } 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/couch_replicator DIST_COMMON = $(srcdir)/Makefile.am $(srcdir)/Makefile.in ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 am__aclocal_m4_deps = $(top_srcdir)/m4/libtool.m4 \ $(top_srcdir)/m4/ltoptions.m4 $(top_srcdir)/m4/ltsugar.m4 \ $(top_srcdir)/m4/ltversion.m4 $(top_srcdir)/m4/lt~obsolete.m4 \ $(top_srcdir)/acinclude.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 \ $(top_builddir)/src/snappy/google-snappy/config.h CONFIG_CLEAN_FILES = CONFIG_CLEAN_VPATH_FILES = 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)$(couch_replicatorebindir)" \ "$(DESTDIR)$(couch_replicatorincludedir)" DATA = $(couch_replicatorebin_DATA) $(couch_replicatorinclude_DATA) DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) ACLOCAL = @ACLOCAL@ AMTAR = @AMTAR@ AR = @AR@ AS = @AS@ AUTOCONF = @AUTOCONF@ AUTOHEADER = @AUTOHEADER@ AUTOMAKE = @AUTOMAKE@ AWK = @AWK@ CC = @CC@ CCDEPMODE = @CCDEPMODE@ CFLAGS = @CFLAGS@ CPP = @CPP@ CPPFLAGS = @CPPFLAGS@ CURL_CFLAGS = @CURL_CFLAGS@ CURL_CONFIG = @CURL_CONFIG@ CURL_LIBS = @CURL_LIBS@ CXX = @CXX@ CXXCPP = @CXXCPP@ CXXDEPMODE = @CXXDEPMODE@ CXXFLAGS = @CXXFLAGS@ CYGPATH_W = @CYGPATH_W@ DEFS = @DEFS@ DEPDIR = @DEPDIR@ DLLTOOL = @DLLTOOL@ DSYMUTIL = @DSYMUTIL@ DUMPBIN = @DUMPBIN@ ECHO_C = @ECHO_C@ ECHO_N = @ECHO_N@ ECHO_T = @ECHO_T@ EGREP = @EGREP@ ERL = @ERL@ ERLANG_FLAGS = @ERLANG_FLAGS@ ERLC = @ERLC@ ERLC_FLAGS = @ERLC_FLAGS@ ESCRIPT = @ESCRIPT@ EXEEXT = @EXEEXT@ FGREP = @FGREP@ FLAGS = @FLAGS@ GREP = @GREP@ HAS_HELP2MAN = @HAS_HELP2MAN@ HAS_INSTALLINFO = @HAS_INSTALLINFO@ HAS_MAKEINFO = @HAS_MAKEINFO@ HAS_PDFLATEX = @HAS_PDFLATEX@ HAS_SPHINX_BUILD = @HAS_SPHINX_BUILD@ ICU_BIN = @ICU_BIN@ ICU_CFLAGS = @ICU_CFLAGS@ ICU_CONFIG = @ICU_CONFIG@ ICU_CPPFLAGS = @ICU_CPPFLAGS@ ICU_CXXFLAGS = @ICU_CXXFLAGS@ ICU_LIBS = @ICU_LIBS@ INNO_COMPILER_EXECUTABLE = @INNO_COMPILER_EXECUTABLE@ INSTALL = @INSTALL@ INSTALL_DATA = @INSTALL_DATA@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ INSTALL_SCRIPT = @INSTALL_SCRIPT@ INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ JS_CFLAGS = @JS_CFLAGS@ JS_LIBS = @JS_LIBS@ JS_LIB_BINARY = @JS_LIB_BINARY@ LD = @LD@ LDFLAGS = @LDFLAGS@ LIBOBJS = @LIBOBJS@ LIBS = @LIBS@ LIBTOOL = @LIBTOOL@ LIPO = @LIPO@ LN_S = @LN_S@ LTLIBOBJS = @LTLIBOBJS@ MAKEINFO = @MAKEINFO@ MANIFEST_TOOL = @MANIFEST_TOOL@ MKDIR_P = @MKDIR_P@ NM = @NM@ NMEDIT = @NMEDIT@ OBJDUMP = @OBJDUMP@ OBJEXT = @OBJEXT@ OTOOL = @OTOOL@ OTOOL64 = @OTOOL64@ PACKAGE = @PACKAGE@ PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ PACKAGE_NAME = @PACKAGE_NAME@ PACKAGE_STRING = @PACKAGE_STRING@ PACKAGE_TARNAME = @PACKAGE_TARNAME@ PACKAGE_URL = @PACKAGE_URL@ PACKAGE_VERSION = @PACKAGE_VERSION@ PATH_SEPARATOR = @PATH_SEPARATOR@ PKG_CONFIG = @PKG_CONFIG@ PKG_CONFIG_LIBDIR = @PKG_CONFIG_LIBDIR@ PKG_CONFIG_PATH = @PKG_CONFIG_PATH@ RANLIB = @RANLIB@ SED = @SED@ SET_MAKE = @SET_MAKE@ SHELL = @SHELL@ SNAPPY_MAJOR = @SNAPPY_MAJOR@ SNAPPY_MINOR = @SNAPPY_MINOR@ SNAPPY_PATCHLEVEL = @SNAPPY_PATCHLEVEL@ STRIP = @STRIP@ VERSION = @VERSION@ 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@ ac_cv_have_stddef_h = @ac_cv_have_stddef_h@ ac_cv_have_stdint_h = @ac_cv_have_stdint_h@ am__include = @am__include@ am__leading_dot = @am__leading_dot@ am__quote = @am__quote@ am__tar = @am__tar@ am__untar = @am__untar@ bindir = @bindir@ bug_uri = @bug_uri@ 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@ dvidir = @dvidir@ erlangbin = @erlangbin@ erlangversion = @erlangversion@ exec_prefix = @exec_prefix@ host = @host@ host_alias = @host_alias@ host_cpu = @host_cpu@ host_os = @host_os@ host_vendor = @host_vendor@ htmldir = @htmldir@ includedir = @includedir@ infodir = @infodir@ initdir = @initdir@ install_sh = @install_sh@ launchddir = @launchddir@ libdir = @libdir@ libexecdir = @libexecdir@ localconfdir = @localconfdir@ localdatadir = @localdatadir@ localdocdir = @localdocdir@ localedir = @localedir@ localerlanglibdir = @localerlanglibdir@ locallibbindir = @locallibbindir@ locallibdir = @locallibdir@ localstatedir = @localstatedir@ localstatelibdir = @localstatelibdir@ localstatelogdir = @localstatelogdir@ localstaterundir = @localstaterundir@ mandir = @mandir@ mkdir_p = @mkdir_p@ msvc_redist_dir = @msvc_redist_dir@ msvc_redist_name = @msvc_redist_name@ oldincludedir = @oldincludedir@ openssl_bin_dir = @openssl_bin_dir@ otp_release = @otp_release@ package_author_address = @package_author_address@ package_author_name = @package_author_name@ package_identifier = @package_identifier@ package_name = @package_name@ package_tarname = @package_tarname@ 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@ version = @version@ version_major = @version_major@ version_minor = @version_minor@ version_release = @version_release@ version_revision = @version_revision@ version_stage = @version_stage@ couch_replicatorlibdir = $(localerlanglibdir)/couch_replicator-0.1 couch_replicatorincludedir = $(couch_replicatorlibdir)/include couch_replicatorebindir = $(couch_replicatorlibdir)/ebin couch_replicatorinclude_DATA = $(include_files) couch_replicatorebin_DATA = $(compiled_files) include_files = \ src/couch_replicator_api_wrap.hrl \ src/couch_replicator.hrl \ src/couch_replicator_js_functions.hrl source_files = \ src/couch_replicator_api_wrap.erl \ src/couch_replicator_httpc_pool.erl \ src/couch_replicator_httpc.erl \ src/couch_replicator_httpd.erl \ src/couch_replicator_job_sup.erl \ src/couch_replicator_notifier.erl \ src/couch_replicator_manager.erl \ src/couch_replicator_utils.erl \ src/couch_replicator_worker.erl \ src/couch_replicator.app.src \ src/couch_replicator.erl test_files = \ test/01-load.t \ test/02-httpc-pool.t \ test/03-replication-compact.t \ test/04-replication-large-atts.t \ test/05-replication-many-leaves.t \ test/06-doc-missing-stubs.t \ test/07-use-checkpoints.t compiled_files = \ ebin/couch_replicator_api_wrap.beam \ ebin/couch_replicator_httpc_pool.beam \ ebin/couch_replicator_httpc.beam \ ebin/couch_replicator_httpd.beam \ ebin/couch_replicator_job_sup.beam \ ebin/couch_replicator_notifier.beam \ ebin/couch_replicator_manager.beam \ ebin/couch_replicator_utils.beam \ ebin/couch_replicator_worker.beam \ ebin/couch_replicator.app \ ebin/couch_replicator.beam EXTRA_DIST = $(include_files) $(source_files) $(test_files) CLEANFILES = $(compiled_files) 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) --foreign src/couch_replicator/Makefile'; \ $(am__cd) $(top_srcdir) && \ $(AUTOMAKE) --foreign src/couch_replicator/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-couch_replicatorebinDATA: $(couch_replicatorebin_DATA) @$(NORMAL_INSTALL) @list='$(couch_replicatorebin_DATA)'; test -n "$(couch_replicatorebindir)" || list=; \ if test -n "$$list"; then \ echo " $(MKDIR_P) '$(DESTDIR)$(couch_replicatorebindir)'"; \ $(MKDIR_P) "$(DESTDIR)$(couch_replicatorebindir)" || 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)$(couch_replicatorebindir)'"; \ $(INSTALL_DATA) $$files "$(DESTDIR)$(couch_replicatorebindir)" || exit $$?; \ done uninstall-couch_replicatorebinDATA: @$(NORMAL_UNINSTALL) @list='$(couch_replicatorebin_DATA)'; test -n "$(couch_replicatorebindir)" || list=; \ files=`for p in $$list; do echo $$p; done | sed -e 's|^.*/||'`; \ dir='$(DESTDIR)$(couch_replicatorebindir)'; $(am__uninstall_files_from_dir) install-couch_replicatorincludeDATA: $(couch_replicatorinclude_DATA) @$(NORMAL_INSTALL) @list='$(couch_replicatorinclude_DATA)'; test -n "$(couch_replicatorincludedir)" || list=; \ if test -n "$$list"; then \ echo " $(MKDIR_P) '$(DESTDIR)$(couch_replicatorincludedir)'"; \ $(MKDIR_P) "$(DESTDIR)$(couch_replicatorincludedir)" || 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)$(couch_replicatorincludedir)'"; \ $(INSTALL_DATA) $$files "$(DESTDIR)$(couch_replicatorincludedir)" || exit $$?; \ done uninstall-couch_replicatorincludeDATA: @$(NORMAL_UNINSTALL) @list='$(couch_replicatorinclude_DATA)'; test -n "$(couch_replicatorincludedir)" || list=; \ files=`for p in $$list; do echo $$p; done | sed -e 's|^.*/||'`; \ dir='$(DESTDIR)$(couch_replicatorincludedir)'; $(am__uninstall_files_from_dir) tags: TAGS TAGS: ctags: CTAGS CTAGS: 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)$(couch_replicatorebindir)" "$(DESTDIR)$(couch_replicatorincludedir)"; 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 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-couch_replicatorebinDATA \ install-couch_replicatorincludeDATA 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-couch_replicatorebinDATA \ uninstall-couch_replicatorincludeDATA .MAKE: install-am install-strip .PHONY: all all-am check check-am clean clean-generic clean-libtool \ distclean distclean-generic distclean-libtool distdir dvi \ dvi-am html html-am info info-am install install-am \ install-couch_replicatorebinDATA \ install-couch_replicatorincludeDATA 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 uninstall uninstall-am \ uninstall-couch_replicatorebinDATA \ uninstall-couch_replicatorincludeDATA check: @TESTS_TRUE@ $(abs_top_builddir)/test/etap/run $(abs_top_srcdir)/src/couch_replicator/test ebin/%.app: src/%.app.src @mkdir -p ebin/ sed -e "s|%version%|@version@|g" \ < $< > $@ ebin/%.beam: src/%.erl $(include_files) @mkdir -p ebin/ $(ERLC) -Wall -I$(top_srcdir)/src -I$(top_srcdir)/src/couchdb \ -o ebin/ $(ERLC_FLAGS) ${TEST} $<; # 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: apache-couchdb-1.6.0/src/couchjs-node/0000755000175000001440000000000012332105603017466 5ustar00djcusers00000000000000apache-couchdb-1.6.0/src/couchjs-node/test/0000755000175000001440000000000012332105603020445 5ustar00djcusers00000000000000apache-couchdb-1.6.0/src/couchjs-node/test/experiment.js0000644000175000001440000000523512332105522023170 0ustar00djcusers00000000000000// Licensed under the Apache License, Version 2.0 (the "License"); you may not // use this file except in compliance with the License. You may obtain a copy of // the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, WITHOUT // WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the // License for the specific language governing permissions and limitations under // the License. var vm = require('vm'); var util = require('util'); var STATE = 'wait'; function main() { process.debugPort = 5859; process.kill(process.pid, 'SIGUSR1'); setTimeout(function() { stuff(0); }, 1000); } function stuff(count) { console.log('Doing stuff: %d', count); STATE = 'vm'; console.log('More stuff: %d', count); if (STATE === 'done') { console.log('Done'); } else if (STATE === 'code') { setTimeout(code, 1000); } else if(STATE === 'eval') { test_eval(); } else if(STATE === 'vm') { test_vm(); } else if(STATE === 'wait') { setTimeout(function() { stuff(count+1); }, 1000); } else { throw new Error('Unknown state: ' + STATE); } } function code() { var code = [ 'var foo = "in the code"', 'console.log("This is some code")', 'debugger', 'console.log("foo = " + foo)' ].join('\n'); var runner = Function([], code); console.log('Run runner in 1s'); setTimeout(run_runner, 1000) function run_runner() { console.log('About to run runner'); debugger; runner(); console.log('Runner done'); } } function test_eval() { console.log('Test eval in 1s'); setTimeout(run_eval, 1000); var code = [ 'var foo = "in eval"', 'console.log("This is eval")', 'debugger', 'console.log("foo = " + foo)' ].join('\n'); function run_eval() { console.log('Run eval now'); debugger; eval(code); } } function test_vm() { console.log('Test vm'); var code = [ 'var i = 10', 'setTimeout(hello, 1000)', '', 'function hello() {', ' debugger', ' console.log("Hello: " + i)', ' if(--i)', ' setTimeout(hello, 1000)', '}' ].join('\n'); console.log('Run vm now'); var filename = '_couchdb:code.js'; var sandbox = {}; var ok = ['console', 'setTimeout']; ok.forEach(function(key) { sandbox[key] = global[key]; }); var ctx = vm.createContext(sandbox); var script = vm.createScript(code, filename); var r = script.runInNewContext(sandbox); console.log('Result:\n%s', util.inspect(r, false, 10)); return r; } if (require.main === module) { main(); } apache-couchdb-1.6.0/src/couchjs-node/stream.js0000644000175000001440000000505012332105522021317 0ustar00djcusers00000000000000// Licensed under the Apache License, Version 2.0 (the "License"); you may not // use this file except in compliance with the License. You may obtain a copy of // the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, WITHOUT // WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the // License for the specific language governing permissions and limitations under // the License. // Text line stream var stream = require('stream'); var util = require('util'); function LineStream() { var self = this; stream.call(self); self.readable = true; self.writable = true; self.buffer = ''; self.downstream = null; self.on('pipe', function(upstream) { upstream.on('end', function(data, encoding) { self.emit('end', data, encoding); }); }); } function LineStream2() { if (!(this instanceof LineStream2)) { return new LineStream2(); } stream.Transform.call(this); this.setEncoding('utf8'); } util.inherits(LineStream2, stream.Transform); LineStream2.prototype._transform = function(message, encoding, done) { var self = this; message = message.toString(encoding); var lines = message.split(/\n/); // If the data ends in "\n" this will be ""; otherwise the final partial line. var remainder = lines.pop(); if (remainder) { this.unshift(remainder); } lines.forEach(function(line) { self.push(line); }); done(); }; util.inherits(LineStream, stream); LineStream.prototype.write = function(data) { var self = this; data = data || ''; if (typeof data !== 'string') { return self.error(new Error('Data was not a string: ' + util.inspect(data))); } self.buffer += data; var lines = self.buffer.split(/\n/); self.buffer = lines.pop(); // If the data ended in "\n" this will be ""; otherwise the final partial line. lines.forEach(function(line) { self.emit('data', line); }); }; LineStream.prototype.end = function(data) { var self = this; self.is_ending = true; self.writable = false; // Always call write, even with no data, so it can fire the "end" event. self.write(data); }; LineStream.prototype.error = function(er) { var self = this; self.readable = false; self.writable = false; self.emit('error', er); // The write() method sometimes returns this value, so if there was an error, make write() return false. return false; }; module.exports = LineStream; module.exports.v2 = LineStream2; apache-couchdb-1.6.0/src/couchjs-node/README.md0000644000175000001440000000220112332105522020740 0ustar00djcusers00000000000000# CouchJS ## Drop-in replacement JavaScript engine for Apache CouchDB CouchJS is a command-line Node.js program. It is 100% compatible with Apache CouchDB's built-in JavaScript system. By using CouchJS, you will get 100% CouchDB compatibility (the test suite completely passes) but your JavaScript environment is V8, or Node.js. See share/doc/src/experimental.rst for installation instructions. ## Idea JavaScript is decoupled from the CouchDB core. To do JavaScript stuff, CouchDB runs a normal Unix subprocess, `couchjs`. This subprocess is just a read-eval-print loop on standard i/o. CouchDB passes `couchjs` a file name, and *that file* contains the view server implementation. This tool duplicates the "REPL" look and feel of `couchjs` and supports the exact same view server implementation. ## Security I have no idea. I would not trust it for production use. ## Log If you create a file, `/tmp/couchjs.log` then *couchjs* will output debugging messages there. ## License Apache 2.0 See the [Apache 2.0 license](named/blob/master/LICENSE). [tap]: https://github.com/isaacs/node-tap [def]: https://github.com/iriscouch/defaultable apache-couchdb-1.6.0/src/couchjs-node/sandbox.js0000644000175000001440000000224212332105522021462 0ustar00djcusers00000000000000// from https://github.com/KlausTrainer/sandbox.js exports.runInSandbox = function(src, ctx, whitelist) { var vm = require('vm'); var sandbox; if (ctx && ctx.require) { whitelist = whitelist || []; var insecureRequire = ctx.require; var module = require('module'); var oldModulePrototype = module.prototype; var secureRequire = function(moduleName) { if (whitelist.indexOf(moduleName) === -1) { module.prototype = oldModulePrototype; throw new Error("'" + moduleName + "' is not whitelisted"); } else { var requiredModule = insecureRequire(moduleName); module.prototype = oldModulePrototype; return requiredModule; } }; module.prototype = { require: secureRequire, load: module.prototype.load, _compile: module.prototype._compile }; module._cache = {}; ctx.require = secureRequire; sandbox = Object.freeze(vm.createContext(ctx)); ctx.require = insecureRequire; } else { sandbox = Object.freeze(vm.createContext(ctx || {})); } return vm.createScript('(function() {"use strict"; return (' + src + ')()}())').runInContext(sandbox); }; apache-couchdb-1.6.0/src/couchjs-node/couchdb.js0000755000175000001440000000154712332105522021445 0ustar00djcusers00000000000000// Licensed under the Apache License, Version 2.0 (the "License"); you may not // use this file except in compliance with the License. You may obtain a copy of // the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, WITHOUT // WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the // License for the specific language governing permissions and limitations under // the License. var http = require('http'); function handler(req, res) { res.writeHead(200); res.end('Hello: ' + req.url + '\n'); } if (require.main === module) { var http = require('http'); var server = http.createServer(handler); server.listen(3000); console.log('Listening on :3000'); } module.exports = handler; apache-couchdb-1.6.0/src/couchjs-node/couchjs.js0000644000175000001440000000523612332105522021470 0ustar00djcusers00000000000000// Licensed under the Apache License, Version 2.0 (the "License"); you may not // use this file except in compliance with the License. You may obtain a copy of // the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, WITHOUT // WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the // License for the specific language governing permissions and limitations under // the License. var vm = require('vm'); var Fiber = require('fibers'); var util = require('util'); var XML = require('./xml'); var log = require('./console').log; var INPUT = { 'queue':[], 'waiting':null }; function print(line) { log('STDOUT %s: %s', process.pid, line); process.stdout.write(line + '\n'); try { line = JSON.parse(line); } catch(er) { return; } if (line[0] === 'log') { log('LOG: %s', line[1]); } } function stdin (line) { log('STDIN %s: %s', process.pid, line.trim()); if (INPUT.waiting) { INPUT.waiting.run(line); } else { INPUT.queue.push(line); } } function readline () { var line = INPUT.queue.shift(); if (line) { return line; } INPUT.waiting = Fiber.current; line = Fiber.yield(); INPUT.waiting = null; return line; } function evalcx (source, sandbox) { sandbox = sandbox || {}; var func; //log('evalcx in %j: %j', Object.keys(sandbox), source) if (source === '') { return sandbox; } // source might be "function(doc) { emit(doc._id, 1) }" source = source.replace(/;+$/, ''); sandbox.XML = sandbox.XML || XML; source = '(' + source + ')'; try { var id = Math.floor(Math.random() * 1000*1000); var filename = '_couchdb:' + id + '.js'; var script = vm.createScript(source, filename); func = script.runInNewContext(sandbox); } catch (er) { log('Error making code: %s', er.stack); return sandbox; } return func; } function quit(code) { code = code || 1; if (code < 0) { code = -code; } process.exit(code); } function gc() { } function toSource() { if (typeof this === 'function') { return '' + this; } if (this instanceof Error) { return this.stack; } return util.inspect(this); } Error.prototype.toSource = Error.prototype.toSource || toSource; Error.prototype.toString = Error.prototype.toString || toSource; Function.prototype.toSource = Function.prototype.toSource || toSource; Function.prototype.toString = Function.prototype.toString || toSource; module.exports = { 'print': print, 'readline': readline, 'stdin': stdin, 'evalcx': evalcx, 'quit': quit, 'gc': gc }; apache-couchdb-1.6.0/src/couchjs-node/inspector.js0000755000175000001440000000456612332105522022050 0ustar00djcusers00000000000000#!/usr/bin/env node // Licensed under the Apache License, Version 2.0 (the "License"); you may not // use this file except in compliance with the License. You may obtain a copy of // the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, WITHOUT // WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the // License for the specific language governing permissions and limitations under // the License. var cp = require('child_process'); var log = require('./console').log; function watchInspector(child) { child.stderr.on('data', function(body) { log('Inspector STDERR: %s', body); }); child.stdout.on('data', function(body) { log('Inspector STDOUT: %s', body); }); child.on('exit', function(code, signal) { log('Inspector exited %d signal=%j', code, signal); process.exit(code); }); process.on('exit', function() { log('Kill inspector upon exit: %d', child.pid); process.kill(child.pid, 'SIGTERM'); }); } function start (debugPort) { if (!debugPort || typeof debugPort !== 'number') { throw new Error('Need a listen debugPort'); } var webPort = debugPort + 1; var cmd = __filename; var args = [debugPort, webPort]; var opts = { 'cwd': __dirname, 'stdio': 'pipe', 'detached': false }; log('Start inspector: %s %j %j', cmd, args, opts); var inspector = cp.spawn(cmd, args, opts); watchInspector(inspector); log('Enable remote debug pid=%d port=%d', process.pid, debugPort); process.debugPort = debugPort; process.kill(process.pid, 'SIGUSR1'); } function main() { var debugPort = +process.argv[2]; var webPort = +process.argv[3]; if (!debugPort || !webPort) { throw new Error('Bad arguments: need debugPort and webPort'); } console.log('Start inspector debugPort=%j webPort=%j', debugPort, webPort); var DebugServer = require('node-inspector/lib/debug-server'); var server = new DebugServer(); server.on('close', function() { console.log('Server closed'); process.exit(0); }); server.start({ 'webPort':webPort, 'debugPort':debugPort }); process.on('uncaughtException', function(er) { console.log('Error:\n%s', er.stack); }); } module.exports = start; if (require.main === module) { main(); } apache-couchdb-1.6.0/src/couchjs-node/console.js0000644000175000001440000000320612332105522021467 0ustar00djcusers00000000000000// Licensed under the Apache License, Version 2.0 (the "License"); you may not // use this file except in compliance with the License. You may obtain a copy of // the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, WITHOUT // WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the // License for the specific language governing permissions and limitations under // the License. var fs = require('fs'); var util = require('util'); var noop = function() {}; module.exports = {}; module.exports.log = noop; module.exports.debug = noop; module.exports.info = noop; module.exports.warn = noop; module.exports.error = noop; var LOG_PATH = '/tmp/couchjs.log'; var stat = null; var LOG = null; try { stat = fs.statSync(LOG_PATH); } catch(er) {} if (stat) { LOG = fs.createWriteStream(LOG_PATH, { 'flags':'a' }); var log = function () { var str = util.format.apply(this, arguments); LOG.write(str + '\n'); }; var on_err = function (er) { module.exports.error('Uncaught error:\n%s', er.stack || er.message || JSON.stringify(er)); if (er.stack) { er = ['fatal', 'unknown_error', er.stack]; } process.stdout.write(JSON.stringify(er) + '\n'); process.exit(1); }; module.exports.log = log; module.exports.debug = log; module.exports.info = log; module.exports.warn = log; module.exports.error = log; process.on('exit', function() { module.exports.log('Exit %d', process.pid); }); process.on('uncaughtException', on_err); } apache-couchdb-1.6.0/src/couchjs-node/cli.js0000755000175000001440000000444412332105522020604 0ustar00djcusers00000000000000#!/usr/bin/env node // Licensed under the Apache License, Version 2.0 (the "License"); you may not // use this file except in compliance with the License. You may obtain a copy of // the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, WITHOUT // WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the // License for the specific language governing permissions and limitations under // the License. var fs = require('fs'); var Fiber = require('fibers'); var optimist = require('optimist'); var couchjs = require('./couchjs'); var package_json = require('./package.json'); var LineStream = require('./stream'); var inspector = require('./inspector'); var log = require('./console').log; var opts = optimist.boolean(['h', 'V', 'H']) .describe({ 'h': 'display a short help message and exit', 'V': 'display version information and exit', 'H': 'enable couchjs cURL bindings (not implemented)' }) .usage('$0 '); function main() { 'use strict'; var main_js = opts.argv._[0]; if (!main_js) { return console.error(opts.help()); } log('couchjs/%s %s: %s', package_json.version, process.pid, main_js); if (process.env.COUCHJS_DEBUG_PORT) { inspector(+process.env.COUCHJS_DEBUG_PORT); } fs.readFile(main_js, 'utf8', function(er, body) { if (er) { throw er; } var stdin = new LineStream.v2(); stdin.on('readable', function() { var buf = stdin.read(); if (buf) { couchjs.stdin(buf); } }); stdin.on('end', function() { log('Terminate; connection to parent closed'); process.exit(0); }); process.stdin.setEncoding('utf8'); process.stdin.pipe(stdin); var main_func = Function(['print', 'readline', 'evalcx', 'gc', 'quit'], body); log('Call main'); new Fiber(function() { main_func(couchjs.print, couchjs.readline, couchjs.evalcx, couchjs.gc); }).run(); }); process.on('uncaughtException', function(er) { log('Error:\n%s', er.stack); }); } if (require.main === module) { main(); } apache-couchdb-1.6.0/src/couchjs-node/Makefile.am0000644000175000001440000000133612332105522021525 0ustar00djcusers00000000000000## Licensed under the Apache License, Version 2.0 (the "License"); you may not ## use this file except in compliance with the License. You may obtain a copy of ## the License at ## ## http://www.apache.org/licenses/LICENSE-2.0 ## ## Unless required by applicable law or agreed to in writing, software ## distributed under the License is distributed on an "AS IS" BASIS, WITHOUT ## WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the ## License for the specific language governing permissions and limitations under ## the License. EXTRA_DIST = \ cli.js \ console.js \ couchdb.js \ couchjs.js \ inspector.js \ package.json \ README.md \ sandbox.js \ stream.js \ test/experiment.js \ xml.js apache-couchdb-1.6.0/src/couchjs-node/Makefile.in0000644000175000001440000003041512332105552021541 0ustar00djcusers00000000000000# Makefile.in generated by automake 1.11.6 from Makefile.am. # @configure_input@ # Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, # 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011 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__make_dryrun = \ { \ am__dry=no; \ case $$MAKEFLAGS in \ *\\[\ \ ]*) \ echo 'am--echo: ; @echo "AM" OK' | $(MAKE) -f - 2>/dev/null \ | grep '^AM OK$$' >/dev/null || am__dry=yes;; \ *) \ for am__flg in $$MAKEFLAGS; do \ case $$am__flg in \ *=*|--*) ;; \ *n*) am__dry=yes; break;; \ esac; \ done;; \ esac; \ test $$am__dry = yes; \ } 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/couchjs-node DIST_COMMON = $(srcdir)/Makefile.am $(srcdir)/Makefile.in ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 am__aclocal_m4_deps = $(top_srcdir)/m4/libtool.m4 \ $(top_srcdir)/m4/ltoptions.m4 $(top_srcdir)/m4/ltsugar.m4 \ $(top_srcdir)/m4/ltversion.m4 $(top_srcdir)/m4/lt~obsolete.m4 \ $(top_srcdir)/acinclude.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 \ $(top_builddir)/src/snappy/google-snappy/config.h CONFIG_CLEAN_FILES = CONFIG_CLEAN_VPATH_FILES = 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 DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) ACLOCAL = @ACLOCAL@ AMTAR = @AMTAR@ AR = @AR@ AS = @AS@ AUTOCONF = @AUTOCONF@ AUTOHEADER = @AUTOHEADER@ AUTOMAKE = @AUTOMAKE@ AWK = @AWK@ CC = @CC@ CCDEPMODE = @CCDEPMODE@ CFLAGS = @CFLAGS@ CPP = @CPP@ CPPFLAGS = @CPPFLAGS@ CURL_CFLAGS = @CURL_CFLAGS@ CURL_CONFIG = @CURL_CONFIG@ CURL_LIBS = @CURL_LIBS@ CXX = @CXX@ CXXCPP = @CXXCPP@ CXXDEPMODE = @CXXDEPMODE@ CXXFLAGS = @CXXFLAGS@ CYGPATH_W = @CYGPATH_W@ DEFS = @DEFS@ DEPDIR = @DEPDIR@ DLLTOOL = @DLLTOOL@ DSYMUTIL = @DSYMUTIL@ DUMPBIN = @DUMPBIN@ ECHO_C = @ECHO_C@ ECHO_N = @ECHO_N@ ECHO_T = @ECHO_T@ EGREP = @EGREP@ ERL = @ERL@ ERLANG_FLAGS = @ERLANG_FLAGS@ ERLC = @ERLC@ ERLC_FLAGS = @ERLC_FLAGS@ ESCRIPT = @ESCRIPT@ EXEEXT = @EXEEXT@ FGREP = @FGREP@ FLAGS = @FLAGS@ GREP = @GREP@ HAS_HELP2MAN = @HAS_HELP2MAN@ HAS_INSTALLINFO = @HAS_INSTALLINFO@ HAS_MAKEINFO = @HAS_MAKEINFO@ HAS_PDFLATEX = @HAS_PDFLATEX@ HAS_SPHINX_BUILD = @HAS_SPHINX_BUILD@ ICU_BIN = @ICU_BIN@ ICU_CFLAGS = @ICU_CFLAGS@ ICU_CONFIG = @ICU_CONFIG@ ICU_CPPFLAGS = @ICU_CPPFLAGS@ ICU_CXXFLAGS = @ICU_CXXFLAGS@ ICU_LIBS = @ICU_LIBS@ INNO_COMPILER_EXECUTABLE = @INNO_COMPILER_EXECUTABLE@ INSTALL = @INSTALL@ INSTALL_DATA = @INSTALL_DATA@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ INSTALL_SCRIPT = @INSTALL_SCRIPT@ INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ JS_CFLAGS = @JS_CFLAGS@ JS_LIBS = @JS_LIBS@ JS_LIB_BINARY = @JS_LIB_BINARY@ LD = @LD@ LDFLAGS = @LDFLAGS@ LIBOBJS = @LIBOBJS@ LIBS = @LIBS@ LIBTOOL = @LIBTOOL@ LIPO = @LIPO@ LN_S = @LN_S@ LTLIBOBJS = @LTLIBOBJS@ MAKEINFO = @MAKEINFO@ MANIFEST_TOOL = @MANIFEST_TOOL@ MKDIR_P = @MKDIR_P@ NM = @NM@ NMEDIT = @NMEDIT@ OBJDUMP = @OBJDUMP@ OBJEXT = @OBJEXT@ OTOOL = @OTOOL@ OTOOL64 = @OTOOL64@ PACKAGE = @PACKAGE@ PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ PACKAGE_NAME = @PACKAGE_NAME@ PACKAGE_STRING = @PACKAGE_STRING@ PACKAGE_TARNAME = @PACKAGE_TARNAME@ PACKAGE_URL = @PACKAGE_URL@ PACKAGE_VERSION = @PACKAGE_VERSION@ PATH_SEPARATOR = @PATH_SEPARATOR@ PKG_CONFIG = @PKG_CONFIG@ PKG_CONFIG_LIBDIR = @PKG_CONFIG_LIBDIR@ PKG_CONFIG_PATH = @PKG_CONFIG_PATH@ RANLIB = @RANLIB@ SED = @SED@ SET_MAKE = @SET_MAKE@ SHELL = @SHELL@ SNAPPY_MAJOR = @SNAPPY_MAJOR@ SNAPPY_MINOR = @SNAPPY_MINOR@ SNAPPY_PATCHLEVEL = @SNAPPY_PATCHLEVEL@ STRIP = @STRIP@ VERSION = @VERSION@ 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@ ac_cv_have_stddef_h = @ac_cv_have_stddef_h@ ac_cv_have_stdint_h = @ac_cv_have_stdint_h@ am__include = @am__include@ am__leading_dot = @am__leading_dot@ am__quote = @am__quote@ am__tar = @am__tar@ am__untar = @am__untar@ bindir = @bindir@ bug_uri = @bug_uri@ 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@ dvidir = @dvidir@ erlangbin = @erlangbin@ erlangversion = @erlangversion@ exec_prefix = @exec_prefix@ host = @host@ host_alias = @host_alias@ host_cpu = @host_cpu@ host_os = @host_os@ host_vendor = @host_vendor@ htmldir = @htmldir@ includedir = @includedir@ infodir = @infodir@ initdir = @initdir@ install_sh = @install_sh@ launchddir = @launchddir@ libdir = @libdir@ libexecdir = @libexecdir@ localconfdir = @localconfdir@ localdatadir = @localdatadir@ localdocdir = @localdocdir@ localedir = @localedir@ localerlanglibdir = @localerlanglibdir@ locallibbindir = @locallibbindir@ locallibdir = @locallibdir@ localstatedir = @localstatedir@ localstatelibdir = @localstatelibdir@ localstatelogdir = @localstatelogdir@ localstaterundir = @localstaterundir@ mandir = @mandir@ mkdir_p = @mkdir_p@ msvc_redist_dir = @msvc_redist_dir@ msvc_redist_name = @msvc_redist_name@ oldincludedir = @oldincludedir@ openssl_bin_dir = @openssl_bin_dir@ otp_release = @otp_release@ package_author_address = @package_author_address@ package_author_name = @package_author_name@ package_identifier = @package_identifier@ package_name = @package_name@ package_tarname = @package_tarname@ 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@ version = @version@ version_major = @version_major@ version_minor = @version_minor@ version_release = @version_release@ version_revision = @version_revision@ version_stage = @version_stage@ EXTRA_DIST = \ cli.js \ console.js \ couchdb.js \ couchjs.js \ inspector.js \ package.json \ README.md \ sandbox.js \ stream.js \ test/experiment.js \ xml.js 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) --foreign src/couchjs-node/Makefile'; \ $(am__cd) $(top_srcdir) && \ $(AUTOMAKE) --foreign src/couchjs-node/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 TAGS: ctags: CTAGS CTAGS: 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 \ 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 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: apache-couchdb-1.6.0/src/couchjs-node/xml.js0000644000175000001440000000131012332105522020617 0ustar00djcusers00000000000000// Licensed under the Apache License, Version 2.0 (the "License"); you may not // use this file except in compliance with the License. You may obtain a copy of // the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, WITHOUT // WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the // License for the specific language governing permissions and limitations under // the License. function XML () { this.foo = 'bar'; } XML.prototype.toXMLString = function() { return '\n test\n'; }; module.exports = XML; apache-couchdb-1.6.0/src/couchjs-node/package.json0000644000175000001440000000162712332105522021762 0ustar00djcusers00000000000000{ "name": "couchjs", "description": "Drop-in replacement for CouchDB JavaScript view server", "keywords": [ "couchdb", "couchjs" ], "version": "0.3.2", "author": "Jason Smith (http://www.iriscouch.com)", "repository": { "type":"git", "url":"https://github.com/iriscouch/couchjs" }, "engines": { "node": ">= 0.8" }, "main": "./couchjs.js", "bin": { "couchjs-node":"./cli.js" }, "couchdb": { "main":"./couchdb.js", "vhosts": [ "127.0.0.1.xip.io" ] }, "bundledDependencies": [ "node-inspector" ], "dependencies": { "optimist": "~0.3.4", "async" : "~0.2.5", "mkdirp" : "~0.3.4", "fibers" : "~1.0.0", "request" : "~2.9.203", "pushover": "~1.2.1", "defaultable": "~0.7.2", "node-inspector": "git://github.com/iriscouch/node-inspector#couchjs" }, "devDependencies": { "tap": "~0.2.5" } } apache-couchdb-1.6.0/src/erlang-oauth/0000755000175000001440000000000012332105603017473 5ustar00djcusers00000000000000apache-couchdb-1.6.0/src/erlang-oauth/oauth.app.in0000644000175000001440000000050512332105522021722 0ustar00djcusers00000000000000{application, oauth, [ {description, "Erlang OAuth implementation"}, {vsn, "7d85d3ef"}, {modules, [ oauth, oauth_hmac_sha1, oauth_http, oauth_plaintext, oauth_rsa_sha1, oauth_unix, oauth_uri ]}, {registered, []}, {applications, [ kernel, stdlib, crypto, inets ]} ]}. apache-couchdb-1.6.0/src/erlang-oauth/Makefile.am0000644000175000001440000000204712332105522021532 0ustar00djcusers00000000000000## Licensed under the Apache License, Version 2.0 (the "License"); you may not ## use this file except in compliance with the License. You may obtain a copy ## of the License at ## ## http://www.apache.org/licenses/LICENSE-2.0 ## ## Unless required by applicable law or agreed to in writing, software ## distributed under the License is distributed on an "AS IS" BASIS, WITHOUT ## WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the ## License for the specific language governing permissions and limitations under ## the License. oauthebindir = $(localerlanglibdir)/erlang-oauth/ebin oauth_file_collection = \ oauth.app.in \ oauth.erl # Removed oauth_rsa_sha1.beam until we require R12B5 or # we add a ./configure option to enable it. oauthebin_make_generated_file_list = \ oauth.app \ oauth.beam oauthebin_DATA = \ $(oauthebin_make_generated_file_list) EXTRA_DIST = \ $(oauth_file_collection) CLEANFILES = \ $(oauthebin_make_generated_file_list) %.app: %.app.in cp $< $@ %.beam: %.erl $(ERLC) $(ERLC_FLAGS) $< apache-couchdb-1.6.0/src/erlang-oauth/Makefile.in0000644000175000001440000003555412332105552021557 0ustar00djcusers00000000000000# Makefile.in generated by automake 1.11.6 from Makefile.am. # @configure_input@ # Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, # 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011 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__make_dryrun = \ { \ am__dry=no; \ case $$MAKEFLAGS in \ *\\[\ \ ]*) \ echo 'am--echo: ; @echo "AM" OK' | $(MAKE) -f - 2>/dev/null \ | grep '^AM OK$$' >/dev/null || am__dry=yes;; \ *) \ for am__flg in $$MAKEFLAGS; do \ case $$am__flg in \ *=*|--*) ;; \ *n*) am__dry=yes; break;; \ esac; \ done;; \ esac; \ test $$am__dry = yes; \ } 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/erlang-oauth DIST_COMMON = $(srcdir)/Makefile.am $(srcdir)/Makefile.in ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 am__aclocal_m4_deps = $(top_srcdir)/m4/libtool.m4 \ $(top_srcdir)/m4/ltoptions.m4 $(top_srcdir)/m4/ltsugar.m4 \ $(top_srcdir)/m4/ltversion.m4 $(top_srcdir)/m4/lt~obsolete.m4 \ $(top_srcdir)/acinclude.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 \ $(top_builddir)/src/snappy/google-snappy/config.h CONFIG_CLEAN_FILES = CONFIG_CLEAN_VPATH_FILES = 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)$(oauthebindir)" DATA = $(oauthebin_DATA) DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) ACLOCAL = @ACLOCAL@ AMTAR = @AMTAR@ AR = @AR@ AS = @AS@ AUTOCONF = @AUTOCONF@ AUTOHEADER = @AUTOHEADER@ AUTOMAKE = @AUTOMAKE@ AWK = @AWK@ CC = @CC@ CCDEPMODE = @CCDEPMODE@ CFLAGS = @CFLAGS@ CPP = @CPP@ CPPFLAGS = @CPPFLAGS@ CURL_CFLAGS = @CURL_CFLAGS@ CURL_CONFIG = @CURL_CONFIG@ CURL_LIBS = @CURL_LIBS@ CXX = @CXX@ CXXCPP = @CXXCPP@ CXXDEPMODE = @CXXDEPMODE@ CXXFLAGS = @CXXFLAGS@ CYGPATH_W = @CYGPATH_W@ DEFS = @DEFS@ DEPDIR = @DEPDIR@ DLLTOOL = @DLLTOOL@ DSYMUTIL = @DSYMUTIL@ DUMPBIN = @DUMPBIN@ ECHO_C = @ECHO_C@ ECHO_N = @ECHO_N@ ECHO_T = @ECHO_T@ EGREP = @EGREP@ ERL = @ERL@ ERLANG_FLAGS = @ERLANG_FLAGS@ ERLC = @ERLC@ ERLC_FLAGS = @ERLC_FLAGS@ ESCRIPT = @ESCRIPT@ EXEEXT = @EXEEXT@ FGREP = @FGREP@ FLAGS = @FLAGS@ GREP = @GREP@ HAS_HELP2MAN = @HAS_HELP2MAN@ HAS_INSTALLINFO = @HAS_INSTALLINFO@ HAS_MAKEINFO = @HAS_MAKEINFO@ HAS_PDFLATEX = @HAS_PDFLATEX@ HAS_SPHINX_BUILD = @HAS_SPHINX_BUILD@ ICU_BIN = @ICU_BIN@ ICU_CFLAGS = @ICU_CFLAGS@ ICU_CONFIG = @ICU_CONFIG@ ICU_CPPFLAGS = @ICU_CPPFLAGS@ ICU_CXXFLAGS = @ICU_CXXFLAGS@ ICU_LIBS = @ICU_LIBS@ INNO_COMPILER_EXECUTABLE = @INNO_COMPILER_EXECUTABLE@ INSTALL = @INSTALL@ INSTALL_DATA = @INSTALL_DATA@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ INSTALL_SCRIPT = @INSTALL_SCRIPT@ INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ JS_CFLAGS = @JS_CFLAGS@ JS_LIBS = @JS_LIBS@ JS_LIB_BINARY = @JS_LIB_BINARY@ LD = @LD@ LDFLAGS = @LDFLAGS@ LIBOBJS = @LIBOBJS@ LIBS = @LIBS@ LIBTOOL = @LIBTOOL@ LIPO = @LIPO@ LN_S = @LN_S@ LTLIBOBJS = @LTLIBOBJS@ MAKEINFO = @MAKEINFO@ MANIFEST_TOOL = @MANIFEST_TOOL@ MKDIR_P = @MKDIR_P@ NM = @NM@ NMEDIT = @NMEDIT@ OBJDUMP = @OBJDUMP@ OBJEXT = @OBJEXT@ OTOOL = @OTOOL@ OTOOL64 = @OTOOL64@ PACKAGE = @PACKAGE@ PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ PACKAGE_NAME = @PACKAGE_NAME@ PACKAGE_STRING = @PACKAGE_STRING@ PACKAGE_TARNAME = @PACKAGE_TARNAME@ PACKAGE_URL = @PACKAGE_URL@ PACKAGE_VERSION = @PACKAGE_VERSION@ PATH_SEPARATOR = @PATH_SEPARATOR@ PKG_CONFIG = @PKG_CONFIG@ PKG_CONFIG_LIBDIR = @PKG_CONFIG_LIBDIR@ PKG_CONFIG_PATH = @PKG_CONFIG_PATH@ RANLIB = @RANLIB@ SED = @SED@ SET_MAKE = @SET_MAKE@ SHELL = @SHELL@ SNAPPY_MAJOR = @SNAPPY_MAJOR@ SNAPPY_MINOR = @SNAPPY_MINOR@ SNAPPY_PATCHLEVEL = @SNAPPY_PATCHLEVEL@ STRIP = @STRIP@ VERSION = @VERSION@ 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@ ac_cv_have_stddef_h = @ac_cv_have_stddef_h@ ac_cv_have_stdint_h = @ac_cv_have_stdint_h@ am__include = @am__include@ am__leading_dot = @am__leading_dot@ am__quote = @am__quote@ am__tar = @am__tar@ am__untar = @am__untar@ bindir = @bindir@ bug_uri = @bug_uri@ 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@ dvidir = @dvidir@ erlangbin = @erlangbin@ erlangversion = @erlangversion@ exec_prefix = @exec_prefix@ host = @host@ host_alias = @host_alias@ host_cpu = @host_cpu@ host_os = @host_os@ host_vendor = @host_vendor@ htmldir = @htmldir@ includedir = @includedir@ infodir = @infodir@ initdir = @initdir@ install_sh = @install_sh@ launchddir = @launchddir@ libdir = @libdir@ libexecdir = @libexecdir@ localconfdir = @localconfdir@ localdatadir = @localdatadir@ localdocdir = @localdocdir@ localedir = @localedir@ localerlanglibdir = @localerlanglibdir@ locallibbindir = @locallibbindir@ locallibdir = @locallibdir@ localstatedir = @localstatedir@ localstatelibdir = @localstatelibdir@ localstatelogdir = @localstatelogdir@ localstaterundir = @localstaterundir@ mandir = @mandir@ mkdir_p = @mkdir_p@ msvc_redist_dir = @msvc_redist_dir@ msvc_redist_name = @msvc_redist_name@ oldincludedir = @oldincludedir@ openssl_bin_dir = @openssl_bin_dir@ otp_release = @otp_release@ package_author_address = @package_author_address@ package_author_name = @package_author_name@ package_identifier = @package_identifier@ package_name = @package_name@ package_tarname = @package_tarname@ 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@ version = @version@ version_major = @version_major@ version_minor = @version_minor@ version_release = @version_release@ version_revision = @version_revision@ version_stage = @version_stage@ oauthebindir = $(localerlanglibdir)/erlang-oauth/ebin oauth_file_collection = \ oauth.app.in \ oauth.erl # Removed oauth_rsa_sha1.beam until we require R12B5 or # we add a ./configure option to enable it. oauthebin_make_generated_file_list = \ oauth.app \ oauth.beam oauthebin_DATA = \ $(oauthebin_make_generated_file_list) EXTRA_DIST = \ $(oauth_file_collection) CLEANFILES = \ $(oauthebin_make_generated_file_list) 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) --foreign src/erlang-oauth/Makefile'; \ $(am__cd) $(top_srcdir) && \ $(AUTOMAKE) --foreign src/erlang-oauth/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-oauthebinDATA: $(oauthebin_DATA) @$(NORMAL_INSTALL) @list='$(oauthebin_DATA)'; test -n "$(oauthebindir)" || list=; \ if test -n "$$list"; then \ echo " $(MKDIR_P) '$(DESTDIR)$(oauthebindir)'"; \ $(MKDIR_P) "$(DESTDIR)$(oauthebindir)" || 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)$(oauthebindir)'"; \ $(INSTALL_DATA) $$files "$(DESTDIR)$(oauthebindir)" || exit $$?; \ done uninstall-oauthebinDATA: @$(NORMAL_UNINSTALL) @list='$(oauthebin_DATA)'; test -n "$(oauthebindir)" || list=; \ files=`for p in $$list; do echo $$p; done | sed -e 's|^.*/||'`; \ dir='$(DESTDIR)$(oauthebindir)'; $(am__uninstall_files_from_dir) tags: TAGS TAGS: ctags: CTAGS CTAGS: 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)$(oauthebindir)"; 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 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-oauthebinDATA 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-oauthebinDATA .MAKE: install-am install-strip .PHONY: all all-am check check-am clean clean-generic clean-libtool \ 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-oauthebinDATA \ 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 \ uninstall uninstall-am uninstall-oauthebinDATA %.app: %.app.in cp $< $@ %.beam: %.erl $(ERLC) $(ERLC_FLAGS) $< # 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: apache-couchdb-1.6.0/src/erlang-oauth/oauth.erl0000644000175000001440000002520512332105522021323 0ustar00djcusers00000000000000-module(oauth). -export([get/3, get/5, get/6, post/3, post/5, post/6, put/6, put/7, uri/2, header/1, sign/6, params_decode/1, token/1, token_secret/1, verify/6]). -export([plaintext_signature/2, hmac_sha1_signature/5, hmac_sha1_signature/3, rsa_sha1_signature/4, rsa_sha1_signature/2, signature_base_string/3, params_encode/1]). -export([plaintext_verify/3, hmac_sha1_verify/6, hmac_sha1_verify/4, rsa_sha1_verify/5, rsa_sha1_verify/3]). -export([header_params_encode/1, header_params_decode/1, uri_params_encode/1, uri_params_decode/1]). -include_lib("public_key/include/public_key.hrl"). get(URL, ExtraParams, Consumer) -> get(URL, ExtraParams, Consumer, "", ""). get(URL, ExtraParams, Consumer, Token, TokenSecret) -> get(URL, ExtraParams, Consumer, Token, TokenSecret, []). get(URL, ExtraParams, Consumer, Token, TokenSecret, HttpcOptions) -> SignedParams = sign("GET", URL, ExtraParams, Consumer, Token, TokenSecret), http_request(get, {uri(URL, SignedParams), []}, HttpcOptions). post(URL, ExtraParams, Consumer) -> post(URL, ExtraParams, Consumer, "", ""). post(URL, ExtraParams, Consumer, Token, TokenSecret) -> post(URL, ExtraParams, Consumer, Token, TokenSecret, []). post(URL, ExtraParams, Consumer, Token, TokenSecret, HttpcOptions) -> SignedParams = sign("POST", URL, ExtraParams, Consumer, Token, TokenSecret), http_request(post, {URL, [], "application/x-www-form-urlencoded", uri_params_encode(SignedParams)}, HttpcOptions). put(URL, ExtraParams, {ContentType, Body}, Consumer, Token, TokenSecret) -> put(URL, ExtraParams, {ContentType, Body}, Consumer, Token, TokenSecret, []). put(URL, ExtraParams, {ContentType, Body}, Consumer, Token, TokenSecret, HttpcOptions) -> SignedParams = sign("PUT", URL, ExtraParams, Consumer, Token, TokenSecret), http_request(put, {uri(URL, SignedParams), [], ContentType, Body}, HttpcOptions). uri(Base, []) -> Base; uri(Base, Params) -> lists:concat([Base, "?", uri_params_encode(Params)]). header(Params) -> {"Authorization", "OAuth " ++ header_params_encode(Params)}. token(Params) -> proplists:get_value("oauth_token", Params). token_secret(Params) -> proplists:get_value("oauth_token_secret", Params). consumer_key(_Consumer={Key, _, _}) -> Key. consumer_secret(_Consumer={_, Secret, _}) -> Secret. signature_method(_Consumer={_, _, Method}) -> Method. sign(HttpMethod, URL, Params, Consumer, Token, TokenSecret) -> SignatureParams = signature_params(Consumer, Params, Token), Signature = signature(HttpMethod, URL, SignatureParams, Consumer, TokenSecret), [{"oauth_signature", Signature} | SignatureParams]. signature_params(Consumer, Params, "") -> signature_params(Consumer, Params); signature_params(Consumer, Params, Token) -> signature_params(Consumer, [{"oauth_token", Token} | Params]). signature_params(Consumer, Params) -> Timestamp = unix_timestamp(), Nonce = base64:encode_to_string(crypto:rand_bytes(32)), % cf. ruby-oauth [ {"oauth_version", "1.0"} , {"oauth_nonce", Nonce} , {"oauth_timestamp", integer_to_list(Timestamp)} , {"oauth_signature_method", signature_method_string(Consumer)} , {"oauth_consumer_key", consumer_key(Consumer)} | Params ]. verify(Signature, HttpMethod, URL, Params, Consumer, TokenSecret) -> case signature_method(Consumer) of plaintext -> plaintext_verify(Signature, Consumer, TokenSecret); hmac_sha1 -> hmac_sha1_verify(Signature, HttpMethod, URL, Params, Consumer, TokenSecret); rsa_sha1 -> rsa_sha1_verify(Signature, HttpMethod, URL, Params, Consumer) end. signature(HttpMethod, URL, Params, Consumer, TokenSecret) -> case signature_method(Consumer) of plaintext -> plaintext_signature(Consumer, TokenSecret); hmac_sha1 -> hmac_sha1_signature(HttpMethod, URL, Params, Consumer, TokenSecret); rsa_sha1 -> rsa_sha1_signature(HttpMethod, URL, Params, Consumer) end. signature_method_string(Consumer) -> case signature_method(Consumer) of plaintext -> "PLAINTEXT"; hmac_sha1 -> "HMAC-SHA1"; rsa_sha1 -> "RSA-SHA1" end. plaintext_signature(Consumer, TokenSecret) -> uri_join([consumer_secret(Consumer), TokenSecret]). plaintext_verify(Signature, Consumer, TokenSecret) -> verify_in_constant_time(Signature, plaintext_signature(Consumer, TokenSecret)). hmac_sha1_signature(HttpMethod, URL, Params, Consumer, TokenSecret) -> BaseString = signature_base_string(HttpMethod, URL, Params), hmac_sha1_signature(BaseString, Consumer, TokenSecret). hmac_sha1_signature(BaseString, Consumer, TokenSecret) -> Key = uri_join([consumer_secret(Consumer), TokenSecret]), base64:encode_to_string(crypto:sha_mac(Key, BaseString)). hmac_sha1_verify(Signature, HttpMethod, URL, Params, Consumer, TokenSecret) -> verify_in_constant_time(Signature, hmac_sha1_signature(HttpMethod, URL, Params, Consumer, TokenSecret)). hmac_sha1_verify(Signature, BaseString, Consumer, TokenSecret) -> verify_in_constant_time(Signature, hmac_sha1_signature(BaseString, Consumer, TokenSecret)). rsa_sha1_signature(HttpMethod, URL, Params, Consumer) -> BaseString = signature_base_string(HttpMethod, URL, Params), rsa_sha1_signature(BaseString, Consumer). rsa_sha1_signature(BaseString, Consumer) -> Key = read_private_key(consumer_secret(Consumer)), base64:encode_to_string(public_key:sign(list_to_binary(BaseString), sha, Key)). rsa_sha1_verify(Signature, HttpMethod, URL, Params, Consumer) -> BaseString = signature_base_string(HttpMethod, URL, Params), rsa_sha1_verify(Signature, BaseString, Consumer). rsa_sha1_verify(Signature, BaseString, Consumer) -> Key = read_cert_key(consumer_secret(Consumer)), public_key:verify(to_binary(BaseString), sha, base64:decode(Signature), Key). verify_in_constant_time(<>, <>) -> verify_in_constant_time(binary_to_list(X), binary_to_list(Y)); verify_in_constant_time(X, Y) when is_list(X) and is_list(Y) -> case length(X) == length(Y) of true -> verify_in_constant_time(X, Y, 0); false -> false end. verify_in_constant_time([X | RestX], [Y | RestY], Result) -> verify_in_constant_time(RestX, RestY, (X bxor Y) bor Result); verify_in_constant_time([], [], Result) -> Result == 0. signature_base_string(HttpMethod, URL, Params) -> uri_join([HttpMethod, uri_normalize(URL), params_encode(Params)]). params_encode(Params) -> % cf. http://tools.ietf.org/html/rfc5849#section-3.4.1.3.2 Encoded = [{uri_encode(K), uri_encode(V)} || {K, V} <- Params], Sorted = lists:sort(Encoded), Concatenated = [lists:concat([K, "=", V]) || {K, V} <- Sorted], string:join(Concatenated, "&"). params_decode(_Response={{_, _, _}, _, Body}) -> uri_params_decode(Body). http_request(Method, Request, Options) -> httpc:request(Method, Request, [{autoredirect, false}], Options). unix_timestamp() -> unix_timestamp(calendar:universal_time()). unix_timestamp(DateTime) -> unix_seconds(DateTime) - unix_epoch(). unix_epoch() -> unix_seconds({{1970,1,1},{00,00,00}}). unix_seconds(DateTime) -> calendar:datetime_to_gregorian_seconds(DateTime). read_cert_key(Path) when is_list(Path) -> {ok, Contents} = file:read_file(Path), [{'Certificate', DerCert, not_encrypted}] = public_key:pem_decode(Contents), read_cert_key(public_key:pkix_decode_cert(DerCert, otp)); read_cert_key(#'OTPCertificate'{tbsCertificate=Cert}) -> read_cert_key(Cert); read_cert_key(#'OTPTBSCertificate'{subjectPublicKeyInfo=Info}) -> read_cert_key(Info); read_cert_key(#'OTPSubjectPublicKeyInfo'{subjectPublicKey=Key}) -> Key. read_private_key(Path) -> {ok, Contents} = file:read_file(Path), [Info] = public_key:pem_decode(Contents), public_key:pem_entry_decode(Info). to_binary(Term) when is_list(Term) -> list_to_binary(Term); to_binary(Term) when is_binary(Term) -> Term. header_params_encode(Params) -> intercalate(", ", [lists:concat([uri_encode(K), "=\"", uri_encode(V), "\""]) || {K, V} <- Params]). header_params_decode(String) -> [header_param_decode(Param) || Param <- re:split(String, ",\\s*", [{return, list}]), Param =/= ""]. header_param_decode(Param) -> [Key, QuotedValue] = string:tokens(Param, "="), Value = string:substr(QuotedValue, 2, length(QuotedValue) - 2), {uri_decode(Key), uri_decode(Value)}. uri_normalize(URI) -> case http_uri:parse(URI) of {ok, {Scheme, UserInfo, Host, Port, Path, _Query}} -> % R15B uri_normalize(Scheme, UserInfo, string:to_lower(Host), Port, [Path]); {Scheme, UserInfo, Host, Port, Path, _Query} -> uri_normalize(Scheme, UserInfo, string:to_lower(Host), Port, [Path]); Else -> Else end. uri_normalize(http, UserInfo, Host, 80, Acc) -> uri_normalize(http, UserInfo, [Host|Acc]); uri_normalize(https, UserInfo, Host, 443, Acc) -> uri_normalize(https, UserInfo, [Host|Acc]); uri_normalize(Scheme, UserInfo, Host, Port, Acc) -> uri_normalize(Scheme, UserInfo, [Host, ":", Port|Acc]). uri_normalize(Scheme, [], Acc) -> lists:concat([Scheme, "://" | Acc]); uri_normalize(Scheme, UserInfo, Acc) -> lists:concat([Scheme, "://", UserInfo, "@" | Acc]). uri_params_encode(Params) -> intercalate("&", [uri_join([K, V], "=") || {K, V} <- Params]). uri_params_decode(String) -> [uri_param_decode(Substring) || Substring <- string:tokens(String, "&")]. uri_param_decode(String) -> [Key, Value] = string:tokens(String, "="), {uri_decode(Key), uri_decode(Value)}. uri_join(Values) -> uri_join(Values, "&"). uri_join(Values, Separator) -> string:join([uri_encode(Value) || Value <- Values], Separator). intercalate(Sep, Xs) -> lists:concat(intersperse(Sep, Xs)). intersperse(_, []) -> []; intersperse(_, [X]) -> [X]; intersperse(Sep, [X | Xs]) -> [X, Sep | intersperse(Sep, Xs)]. uri_encode(Term) when is_integer(Term) -> integer_to_list(Term); uri_encode(Term) when is_atom(Term) -> uri_encode(atom_to_list(Term)); uri_encode(Term) when is_list(Term) -> uri_encode(lists:reverse(Term, []), []). -define(is_alphanum(C), C >= $A, C =< $Z; C >= $a, C =< $z; C >= $0, C =< $9). uri_encode([X | T], Acc) when ?is_alphanum(X); X =:= $-; X =:= $_; X =:= $.; X =:= $~ -> uri_encode(T, [X | Acc]); uri_encode([X | T], Acc) -> NewAcc = [$%, dec2hex(X bsr 4), dec2hex(X band 16#0f) | Acc], uri_encode(T, NewAcc); uri_encode([], Acc) -> Acc. uri_decode(Str) when is_list(Str) -> uri_decode(Str, []). uri_decode([$%, A, B | T], Acc) -> uri_decode(T, [(hex2dec(A) bsl 4) + hex2dec(B) | Acc]); uri_decode([X | T], Acc) -> uri_decode(T, [X | Acc]); uri_decode([], Acc) -> lists:reverse(Acc, []). -compile({inline, [{dec2hex, 1}, {hex2dec, 1}]}). dec2hex(N) when N >= 10 andalso N =< 15 -> N + $A - 10; dec2hex(N) when N >= 0 andalso N =< 9 -> N + $0. hex2dec(C) when C >= $A andalso C =< $F -> C - $A + 10; hex2dec(C) when C >= $0 andalso C =< $9 -> C - $0. apache-couchdb-1.6.0/src/mochiweb/0000755000175000001440000000000012332105603016702 5ustar00djcusers00000000000000apache-couchdb-1.6.0/src/mochiweb/mochifmt_std.erl0000644000175000001440000000142112332105522022064 0ustar00djcusers00000000000000%% @author Bob Ippolito %% @copyright 2008 Mochi Media, Inc. %% @doc Template module for a mochifmt formatter. -module(mochifmt_std). -author('bob@mochimedia.com'). -export([new/0, format/3, get_value/3, format_field/3, get_field/3, convert_field/3]). new() -> {?MODULE}. format(Format, Args, {?MODULE}=THIS) -> mochifmt:format(Format, Args, THIS). get_field(Key, Args, {?MODULE}=THIS) -> mochifmt:get_field(Key, Args, THIS). convert_field(Key, Args, {?MODULE}) -> mochifmt:convert_field(Key, Args). get_value(Key, Args, {?MODULE}) -> mochifmt:get_value(Key, Args). format_field(Arg, Format, {?MODULE}=THIS) -> mochifmt:format_field(Arg, Format, THIS). %% %% Tests %% -ifdef(TEST). -include_lib("eunit/include/eunit.hrl"). -endif. apache-couchdb-1.6.0/src/mochiweb/mochiweb_html.erl0000644000175000001440000014050412332105522022233 0ustar00djcusers00000000000000%% @author Bob Ippolito %% @copyright 2007 Mochi Media, Inc. %% @doc Loosely tokenizes and generates parse trees for HTML 4. -module(mochiweb_html). -export([tokens/1, parse/1, parse_tokens/1, to_tokens/1, escape/1, escape_attr/1, to_html/1]). %% This is a macro to placate syntax highlighters.. -define(QUOTE, $\"). -define(SQUOTE, $\'). -define(ADV_COL(S, N), S#decoder{column=N+S#decoder.column, offset=N+S#decoder.offset}). -define(INC_COL(S), S#decoder{column=1+S#decoder.column, offset=1+S#decoder.offset}). -define(INC_LINE(S), S#decoder{column=1, line=1+S#decoder.line, offset=1+S#decoder.offset}). -define(INC_CHAR(S, C), case C of $\n -> S#decoder{column=1, line=1+S#decoder.line, offset=1+S#decoder.offset}; _ -> S#decoder{column=1+S#decoder.column, offset=1+S#decoder.offset} end). -define(IS_WHITESPACE(C), (C =:= $\s orelse C =:= $\t orelse C =:= $\r orelse C =:= $\n)). -define(IS_LITERAL_SAFE(C), ((C >= $A andalso C =< $Z) orelse (C >= $a andalso C =< $z) orelse (C >= $0 andalso C =< $9))). -define(PROBABLE_CLOSE(C), (C =:= $> orelse ?IS_WHITESPACE(C))). -record(decoder, {line=1, column=1, offset=0}). %% @type html_node() = {string(), [html_attr()], [html_node() | string()]} %% @type html_attr() = {string(), string()} %% @type html_token() = html_data() | start_tag() | end_tag() | inline_html() | html_comment() | html_doctype() %% @type html_data() = {data, string(), Whitespace::boolean()} %% @type start_tag() = {start_tag, Name, [html_attr()], Singleton::boolean()} %% @type end_tag() = {end_tag, Name} %% @type html_comment() = {comment, Comment} %% @type html_doctype() = {doctype, [Doctype]} %% @type inline_html() = {'=', iolist()} %% External API. %% @spec parse(string() | binary()) -> html_node() %% @doc tokenize and then transform the token stream into a HTML tree. parse(Input) -> parse_tokens(tokens(Input)). %% @spec parse_tokens([html_token()]) -> html_node() %% @doc Transform the output of tokens(Doc) into a HTML tree. parse_tokens(Tokens) when is_list(Tokens) -> %% Skip over doctype, processing instructions F = fun (X) -> case X of {start_tag, _, _, false} -> false; _ -> true end end, [{start_tag, Tag, Attrs, false} | Rest] = lists:dropwhile(F, Tokens), {Tree, _} = tree(Rest, [norm({Tag, Attrs})]), Tree. %% @spec tokens(StringOrBinary) -> [html_token()] %% @doc Transform the input UTF-8 HTML into a token stream. tokens(Input) -> tokens(iolist_to_binary(Input), #decoder{}, []). %% @spec to_tokens(html_node()) -> [html_token()] %% @doc Convert a html_node() tree to a list of tokens. to_tokens({Tag0}) -> to_tokens({Tag0, [], []}); to_tokens(T={'=', _}) -> [T]; to_tokens(T={doctype, _}) -> [T]; to_tokens(T={comment, _}) -> [T]; to_tokens({Tag0, Acc}) -> %% This is only allowed in sub-tags: {p, [{"class", "foo"}]} to_tokens({Tag0, [], Acc}); to_tokens({Tag0, Attrs, Acc}) -> Tag = to_tag(Tag0), case is_singleton(Tag) of true -> to_tokens([], [{start_tag, Tag, Attrs, true}]); false -> to_tokens([{Tag, Acc}], [{start_tag, Tag, Attrs, false}]) end. %% @spec to_html([html_token()] | html_node()) -> iolist() %% @doc Convert a list of html_token() to a HTML document. to_html(Node) when is_tuple(Node) -> to_html(to_tokens(Node)); to_html(Tokens) when is_list(Tokens) -> to_html(Tokens, []). %% @spec escape(string() | atom() | binary()) -> binary() %% @doc Escape a string such that it's safe for HTML (amp; lt; gt;). escape(B) when is_binary(B) -> escape(binary_to_list(B), []); escape(A) when is_atom(A) -> escape(atom_to_list(A), []); escape(S) when is_list(S) -> escape(S, []). %% @spec escape_attr(string() | binary() | atom() | integer() | float()) -> binary() %% @doc Escape a string such that it's safe for HTML attrs %% (amp; lt; gt; quot;). escape_attr(B) when is_binary(B) -> escape_attr(binary_to_list(B), []); escape_attr(A) when is_atom(A) -> escape_attr(atom_to_list(A), []); escape_attr(S) when is_list(S) -> escape_attr(S, []); escape_attr(I) when is_integer(I) -> escape_attr(integer_to_list(I), []); escape_attr(F) when is_float(F) -> escape_attr(mochinum:digits(F), []). to_html([], Acc) -> lists:reverse(Acc); to_html([{'=', Content} | Rest], Acc) -> to_html(Rest, [Content | Acc]); to_html([{pi, Bin} | Rest], Acc) -> Open = [<<">, Bin, <<"?>">>], to_html(Rest, [Open | Acc]); to_html([{pi, Tag, Attrs} | Rest], Acc) -> Open = [<<">, Tag, attrs_to_html(Attrs, []), <<"?>">>], to_html(Rest, [Open | Acc]); to_html([{comment, Comment} | Rest], Acc) -> to_html(Rest, [[<<"">>] | Acc]); to_html([{doctype, Parts} | Rest], Acc) -> Inside = doctype_to_html(Parts, Acc), to_html(Rest, [[<<">, Inside, <<">">>] | Acc]); to_html([{data, Data, _Whitespace} | Rest], Acc) -> to_html(Rest, [escape(Data) | Acc]); to_html([{start_tag, Tag, Attrs, Singleton} | Rest], Acc) -> Open = [<<"<">>, Tag, attrs_to_html(Attrs, []), case Singleton of true -> <<" />">>; false -> <<">">> end], to_html(Rest, [Open | Acc]); to_html([{end_tag, Tag} | Rest], Acc) -> to_html(Rest, [[<<">, Tag, <<">">>] | Acc]). doctype_to_html([], Acc) -> lists:reverse(Acc); doctype_to_html([Word | Rest], Acc) -> case lists:all(fun (C) -> ?IS_LITERAL_SAFE(C) end, binary_to_list(iolist_to_binary(Word))) of true -> doctype_to_html(Rest, [[<<" ">>, Word] | Acc]); false -> doctype_to_html(Rest, [[<<" \"">>, escape_attr(Word), ?QUOTE] | Acc]) end. attrs_to_html([], Acc) -> lists:reverse(Acc); attrs_to_html([{K, V} | Rest], Acc) -> attrs_to_html(Rest, [[<<" ">>, escape(K), <<"=\"">>, escape_attr(V), <<"\"">>] | Acc]). escape([], Acc) -> list_to_binary(lists:reverse(Acc)); escape("<" ++ Rest, Acc) -> escape(Rest, lists:reverse("<", Acc)); escape(">" ++ Rest, Acc) -> escape(Rest, lists:reverse(">", Acc)); escape("&" ++ Rest, Acc) -> escape(Rest, lists:reverse("&", Acc)); escape([C | Rest], Acc) -> escape(Rest, [C | Acc]). escape_attr([], Acc) -> list_to_binary(lists:reverse(Acc)); escape_attr("<" ++ Rest, Acc) -> escape_attr(Rest, lists:reverse("<", Acc)); escape_attr(">" ++ Rest, Acc) -> escape_attr(Rest, lists:reverse(">", Acc)); escape_attr("&" ++ Rest, Acc) -> escape_attr(Rest, lists:reverse("&", Acc)); escape_attr([?QUOTE | Rest], Acc) -> escape_attr(Rest, lists:reverse(""", Acc)); escape_attr([C | Rest], Acc) -> escape_attr(Rest, [C | Acc]). to_tag(A) when is_atom(A) -> norm(atom_to_list(A)); to_tag(L) -> norm(L). to_tokens([], Acc) -> lists:reverse(Acc); to_tokens([{Tag, []} | Rest], Acc) -> to_tokens(Rest, [{end_tag, to_tag(Tag)} | Acc]); to_tokens([{Tag0, [{T0} | R1]} | Rest], Acc) -> %% Allow {br} to_tokens([{Tag0, [{T0, [], []} | R1]} | Rest], Acc); to_tokens([{Tag0, [T0={'=', _C0} | R1]} | Rest], Acc) -> %% Allow {'=', iolist()} to_tokens([{Tag0, R1} | Rest], [T0 | Acc]); to_tokens([{Tag0, [T0={comment, _C0} | R1]} | Rest], Acc) -> %% Allow {comment, iolist()} to_tokens([{Tag0, R1} | Rest], [T0 | Acc]); to_tokens([{Tag0, [T0={pi, _S0} | R1]} | Rest], Acc) -> %% Allow {pi, binary()} to_tokens([{Tag0, R1} | Rest], [T0 | Acc]); to_tokens([{Tag0, [T0={pi, _S0, _A0} | R1]} | Rest], Acc) -> %% Allow {pi, binary(), list()} to_tokens([{Tag0, R1} | Rest], [T0 | Acc]); to_tokens([{Tag0, [{T0, A0=[{_, _} | _]} | R1]} | Rest], Acc) -> %% Allow {p, [{"class", "foo"}]} to_tokens([{Tag0, [{T0, A0, []} | R1]} | Rest], Acc); to_tokens([{Tag0, [{T0, C0} | R1]} | Rest], Acc) -> %% Allow {p, "content"} and {p, <<"content">>} to_tokens([{Tag0, [{T0, [], C0} | R1]} | Rest], Acc); to_tokens([{Tag0, [{T0, A1, C0} | R1]} | Rest], Acc) when is_binary(C0) -> %% Allow {"p", [{"class", "foo"}], <<"content">>} to_tokens([{Tag0, [{T0, A1, binary_to_list(C0)} | R1]} | Rest], Acc); to_tokens([{Tag0, [{T0, A1, C0=[C | _]} | R1]} | Rest], Acc) when is_integer(C) -> %% Allow {"p", [{"class", "foo"}], "content"} to_tokens([{Tag0, [{T0, A1, [C0]} | R1]} | Rest], Acc); to_tokens([{Tag0, [{T0, A1, C1} | R1]} | Rest], Acc) -> %% Native {"p", [{"class", "foo"}], ["content"]} Tag = to_tag(Tag0), T1 = to_tag(T0), case is_singleton(norm(T1)) of true -> to_tokens([{Tag, R1} | Rest], [{start_tag, T1, A1, true} | Acc]); false -> to_tokens([{T1, C1}, {Tag, R1} | Rest], [{start_tag, T1, A1, false} | Acc]) end; to_tokens([{Tag0, [L | R1]} | Rest], Acc) when is_list(L) -> %% List text Tag = to_tag(Tag0), to_tokens([{Tag, R1} | Rest], [{data, iolist_to_binary(L), false} | Acc]); to_tokens([{Tag0, [B | R1]} | Rest], Acc) when is_binary(B) -> %% Binary text Tag = to_tag(Tag0), to_tokens([{Tag, R1} | Rest], [{data, B, false} | Acc]). tokens(B, S=#decoder{offset=O}, Acc) -> case B of <<_:O/binary>> -> lists:reverse(Acc); _ -> {Tag, S1} = tokenize(B, S), case parse_flag(Tag) of script -> {Tag2, S2} = tokenize_script(B, S1), tokens(B, S2, [Tag2, Tag | Acc]); textarea -> {Tag2, S2} = tokenize_textarea(B, S1), tokens(B, S2, [Tag2, Tag | Acc]); none -> tokens(B, S1, [Tag | Acc]) end end. parse_flag({start_tag, B, _, false}) -> case string:to_lower(binary_to_list(B)) of "script" -> script; "textarea" -> textarea; _ -> none end; parse_flag(_) -> none. tokenize(B, S=#decoder{offset=O}) -> case B of <<_:O/binary, "", _/binary>> -> Len = O - Start, <<_:Start/binary, Raw:Len/binary, _/binary>> = Bin, {{comment, Raw}, ?ADV_COL(S, 3)}; <<_:O/binary, C, _/binary>> -> tokenize_comment(Bin, ?INC_CHAR(S, C), Start); <<_:Start/binary, Raw/binary>> -> {{comment, Raw}, S} end. tokenize_script(Bin, S=#decoder{offset=O}) -> tokenize_script(Bin, S, O). tokenize_script(Bin, S=#decoder{offset=O}, Start) -> case Bin of %% Just a look-ahead, we want the end_tag separately <<_:O/binary, $<, $/, SS, CC, RR, II, PP, TT, ZZ, _/binary>> when (SS =:= $s orelse SS =:= $S) andalso (CC =:= $c orelse CC =:= $C) andalso (RR =:= $r orelse RR =:= $R) andalso (II =:= $i orelse II =:= $I) andalso (PP =:= $p orelse PP =:= $P) andalso (TT=:= $t orelse TT =:= $T) andalso ?PROBABLE_CLOSE(ZZ) -> Len = O - Start, <<_:Start/binary, Raw:Len/binary, _/binary>> = Bin, {{data, Raw, false}, S}; <<_:O/binary, C, _/binary>> -> tokenize_script(Bin, ?INC_CHAR(S, C), Start); <<_:Start/binary, Raw/binary>> -> {{data, Raw, false}, S} end. tokenize_textarea(Bin, S=#decoder{offset=O}) -> tokenize_textarea(Bin, S, O). tokenize_textarea(Bin, S=#decoder{offset=O}, Start) -> case Bin of %% Just a look-ahead, we want the end_tag separately <<_:O/binary, $<, $/, TT, EE, XX, TT2, AA, RR, EE2, AA2, ZZ, _/binary>> when (TT =:= $t orelse TT =:= $T) andalso (EE =:= $e orelse EE =:= $E) andalso (XX =:= $x orelse XX =:= $X) andalso (TT2 =:= $t orelse TT2 =:= $T) andalso (AA =:= $a orelse AA =:= $A) andalso (RR =:= $r orelse RR =:= $R) andalso (EE2 =:= $e orelse EE2 =:= $E) andalso (AA2 =:= $a orelse AA2 =:= $A) andalso ?PROBABLE_CLOSE(ZZ) -> Len = O - Start, <<_:Start/binary, Raw:Len/binary, _/binary>> = Bin, {{data, Raw, false}, S}; <<_:O/binary, C, _/binary>> -> tokenize_textarea(Bin, ?INC_CHAR(S, C), Start); <<_:Start/binary, Raw/binary>> -> {{data, Raw, false}, S} end. %% %% Tests %% -ifdef(TEST). -include_lib("eunit/include/eunit.hrl"). to_html_test() -> ?assertEqual( <<"hey!

what's up

sucka
RAW!">>, iolist_to_binary( to_html({html, [], [{<<"head">>, [], [{title, <<"hey!">>}]}, {body, [], [{p, [{class, foo}], [<<"what's">>, <<" up">>, {br}]}, {'div', <<"sucka">>}, {'=', <<"RAW!">>}, {comment, <<" comment! ">>}]}]}))), ?assertEqual( <<"">>, iolist_to_binary( to_html({doctype, [<<"html">>, <<"PUBLIC">>, <<"-//W3C//DTD XHTML 1.0 Transitional//EN">>, <<"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">>]}))), ?assertEqual( <<"">>, iolist_to_binary( to_html({<<"html">>,[], [{pi, <<"xml:namespace">>, [{<<"prefix">>,<<"o">>}, {<<"ns">>,<<"urn:schemas-microsoft-com:office:office">>}]}]}))), ok. escape_test() -> ?assertEqual( <<"&quot;\"word ><<up!&quot;">>, escape(<<""\"word ><>)), ?assertEqual( <<"&quot;\"word ><<up!&quot;">>, escape(""\"word ><>, escape('"\"word >< ?assertEqual( <<"&quot;"word ><<up!&quot;">>, escape_attr(<<""\"word ><>)), ?assertEqual( <<"&quot;"word ><<up!&quot;">>, escape_attr(""\"word ><>, escape_attr('"\"word ><>, escape_attr(12345)), ?assertEqual( <<"1.5">>, escape_attr(1.5)), ok. tokens_test() -> ?assertEqual( [{start_tag, <<"foo">>, [{<<"bar">>, <<"baz">>}, {<<"wibble">>, <<"wibble">>}, {<<"alice">>, <<"bob">>}], true}], tokens(<<"">>)), ?assertEqual( [{start_tag, <<"foo">>, [{<<"bar">>, <<"baz">>}, {<<"wibble">>, <<"wibble">>}, {<<"alice">>, <<"bob">>}], true}], tokens(<<"">>)), ?assertEqual( [{comment, <<"[if lt IE 7]>\n\n>}], tokens(<<"">>)), ?assertEqual( [{start_tag, <<"script">>, [{<<"type">>, <<"text/javascript">>}], false}, {data, <<" A= B <= C ">>, false}, {end_tag, <<"script">>}], tokens(<<"">>)), ?assertEqual( [{start_tag, <<"script">>, [{<<"type">>, <<"text/javascript">>}], false}, {data, <<" A= B <= C ">>, false}, {end_tag, <<"script">>}], tokens(<<"">>)), ?assertEqual( [{start_tag, <<"script">>, [{<<"type">>, <<"text/javascript">>}], false}, {data, <<" A= B <= C ">>, false}, {end_tag, <<"script">>}], tokens(<<"">>)), ?assertEqual( [{start_tag, <<"script">>, [{<<"type">>, <<"text/javascript">>}], false}, {data, <<" A= B <= C ">>, false}, {end_tag, <<"script">>}], tokens(<<"">>)), ?assertEqual( [{start_tag, <<"textarea">>, [], false}, {data, <<"">>, false}, {end_tag, <<"textarea">>}], tokens(<<"">>)), ?assertEqual( [{start_tag, <<"textarea">>, [], false}, {data, <<"">>, false}], tokens(<<"
<% if (hasReduce) { %>
<% } %>
<% if (showPreview) { %>
<% } %>
<% if (showPreview) { %> <% } %>
apache-couchdb-1.6.0/src/fauxton/app/addons/documents/templates/index_menu_item.html0000644000175000001440000000136312332105522030662 0ustar00djcusers00000000000000 <%= ddoc %>/<%= index %> apache-couchdb-1.6.0/src/fauxton/app/addons/documents/templates/doc_field_editor.html0000644000175000001440000000522212332105522030765 0ustar00djcusers00000000000000
<% _.each(doc, function(value, key) { %> <% }); %> <%_.each(attachments, function (att) { %> <% }) %>
Key Value
Attachments
<%= att.fileName %> <%= att.contentType %>, <%= formatSize(att.size)%>
New field
apache-couchdb-1.6.0/src/fauxton/app/addons/documents/templates/doc_field_editor_tabs.html0000644000175000001440000000155312332105522032001 0ustar00djcusers00000000000000 apache-couchdb-1.6.0/src/fauxton/app/addons/documents/templates/search.html0000644000175000001440000000117612332105522026760 0ustar00djcusers00000000000000 apache-couchdb-1.6.0/src/fauxton/app/addons/documents/templates/all_docs_list.html0000644000175000001440000000277412332105522030333 0ustar00djcusers00000000000000
<% if (!viewList) { %>
<% if (expandDocs) { %> <% } else { %> <% } %>
<% } %>

<% if (endOfResults) { %>

End of results - edit query

<% } %>
apache-couchdb-1.6.0/src/fauxton/app/addons/documents/templates/jumpdoc.html0000644000175000001440000000145312332105522027152 0ustar00djcusers00000000000000
apache-couchdb-1.6.0/src/fauxton/app/addons/documents/templates/design_doc_selector.html0000644000175000001440000000251212332105522031504 0ustar00djcusers00000000000000
apache-couchdb-1.6.0/src/fauxton/app/addons/documents/templates/all_docs_number.html0000644000175000001440000000230012332105522030631 0ustar00djcusers00000000000000 <% if (totalRows === "unknown" || totalRows === 0){ %> Showing 0 documents. Create your first document. <% } else { %> Showing <%=pageStart%> - <%= pageEnd %> <%}%> <% if (updateSeq) { %> -- Update Sequence: <%= updateSeq %> <% } %>
apache-couchdb-1.6.0/src/fauxton/app/addons/documents/templates/duplicate_doc_modal.html0000644000175000001440000000241312332105522031461 0ustar00djcusers00000000000000
apache-couchdb-1.6.0/src/fauxton/app/addons/verifyinstall/0000755000175000001440000000000012332105600023511 5ustar00djcusers00000000000000apache-couchdb-1.6.0/src/fauxton/app/addons/verifyinstall/routes.js0000644000175000001440000000210612332105522025372 0ustar00djcusers00000000000000// Licensed under the Apache License, Version 2.0 (the "License"); you may not // use this file except in compliance with the License. You may obtain a copy of // the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, WITHOUT // WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the // License for the specific language governing permissions and limitations under // the License. define([ "app", "api", "addons/verifyinstall/views" ], function(app, FauxtonAPI, VerifyInstall) { var VerifyRouteObject = FauxtonAPI.RouteObject.extend({ layout: 'one_pane', routes: { 'verifyinstall': "verifyInstall" }, selectedHeader: "Verify", verifyInstall: function () { this.setView('#dashboard-content', new VerifyInstall.Main({})); }, crumbs: [{name: 'Verify CouchDB Installation', link: '#'}] }); VerifyInstall.RouteObjects = [VerifyRouteObject]; return VerifyInstall; }); apache-couchdb-1.6.0/src/fauxton/app/addons/verifyinstall/resources.js0000644000175000001440000001010512332105522026061 0ustar00djcusers00000000000000// Licensed under the Apache License, Version 2.0 (the "License"); you may not // use this file except in compliance with the License. You may obtain a copy of // the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, WITHOUT // WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the // License for the specific language governing permissions and limitations under // the License. define([ "app", "api", "addons/databases/resources", "addons/documents/resources" ], function (app, FauxtonAPI, Databases, Documents) { var Verifyinstall = FauxtonAPI.addon(); var db = new Databases.Model({ id: 'verifytestdb', name: 'verifytestdb' }); var dbReplicate = new Databases.Model({ id: 'verifytestdb_replicate', name: 'verifytestdb_replicate' }); var doc, viewDoc; Verifyinstall.testProcess = { saveDoc: function () { doc = new Documents.Doc({_id: 'test_doc_1', a: 1}, { database: db }); return doc.save(); }, destroyDoc: function () { return doc.destroy(); }, updateDoc: function () { doc.set({b: "hello"}); return doc.save(); }, saveDB: function () { return db.save(); }, setupDB: function (db) { var deferred = FauxtonAPI.Deferred(); db.fetch() .then(function () { return db.destroy(); }, function (xhr) { deferred.resolve(); }) .then(function () { deferred.resolve(); }, function (xhr, error, reason) { if (reason === "Unauthorized") { deferred.reject(xhr, error, reason); } }); return deferred; }, setup: function () { return FauxtonAPI.when([ this.setupDB(db), this.setupDB(dbReplicate) ]); }, testView: function () { var deferred = FauxtonAPI.Deferred(); var promise = $.get(viewDoc.url() + '/_view/testview'); promise.then(function (resp) { var row = JSON.parse(resp).rows[0]; if (row.value === 6) { return deferred.resolve(); } var reason = { reason: 'Values expect 6, got ' + row.value }; deferred.reject({responseText: JSON.stringify(reason)}); }, deferred.reject); return deferred; }, setupView: function () { var doc1 = new Documents.Doc({_id: 'test_doc10', a: 1}, { database: db }); var doc2 = new Documents.Doc({_id: 'test_doc_20', a: 2}, { database: db }); var doc3 = new Documents.Doc({_id: 'test_doc_30', a: 3}, { database: db }); viewDoc = new Documents.Doc({ _id: '_design/view_check', views: { 'testview': { map:'function (doc) { emit(doc._id, doc.a); }', reduce: '_sum' } } },{ database: db, }); return FauxtonAPI.when([doc1.save(),doc2.save(), doc3.save(), viewDoc.save()]); }, setupReplicate: function () { return $.ajax({ url: app.host + '/_replicate', contentType: 'application/json', type: 'POST', dataType: 'json', processData: false, data: JSON.stringify({ create_target: true, source: 'verifytestdb', target: 'verifytestdb_replicate' }), }); }, testReplicate: function () { var deferred = FauxtonAPI.Deferred(); var promise = dbReplicate.fetch(); promise.then(function () { var docCount = dbReplicate.get('doc_count'); if ( docCount === 4) { deferred.resolve(); return; } var reason = { reason: 'Replication Failed, expected 4 docs got ' + docCount }; deferred.reject({responseText: JSON.stringify(reason)}); }, deferred.reject); return deferred; }, removeDBs: function () { dbReplicate.destroy(); db.destroy(); } }; return Verifyinstall; }); apache-couchdb-1.6.0/src/fauxton/app/addons/verifyinstall/assets/0000755000175000001440000000000012332105600025013 5ustar00djcusers00000000000000apache-couchdb-1.6.0/src/fauxton/app/addons/verifyinstall/assets/less/0000755000175000001440000000000012332105600025761 5ustar00djcusers00000000000000apache-couchdb-1.6.0/src/fauxton/app/addons/verifyinstall/assets/less/verifyinstall.less0000644000175000001440000000111512332105522031545 0ustar00djcusers00000000000000// Licensed under the Apache License, Version 2.0 (the "License"); you may not // use this file except in compliance with the License. You may obtain a copy of // the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, WITHOUT // WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the // License for the specific language governing permissions and limitations under // the License. #start { margin-bottom: 20px; } apache-couchdb-1.6.0/src/fauxton/app/addons/verifyinstall/base.js0000644000175000001440000000160512332105522024766 0ustar00djcusers00000000000000// Licensed under the Apache License, Version 2.0 (the "License"); you may not // use this file except in compliance with the License. You may obtain a copy of // the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, WITHOUT // WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the // License for the specific language governing permissions and limitations under // the License. define([ "app", "api", "addons/verifyinstall/routes" ], function(app, FauxtonAPI, VerifyInstall) { VerifyInstall.initialize = function () { FauxtonAPI.addHeaderLink({ title: "Verify", href: "#verifyinstall", icon: "fonticon-circle-check", bottomNav: true, }); }; return VerifyInstall; }); apache-couchdb-1.6.0/src/fauxton/app/addons/verifyinstall/views.js0000644000175000001440000000660512332105522025216 0ustar00djcusers00000000000000// Licensed under the Apache License, Version 2.0 (the "License"); you may not // use this file except in compliance with the License. You may obtain a copy of // the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, WITHOUT // WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the // License for the specific language governing permissions and limitations under // the License. define([ "app", "api", "addons/verifyinstall/resources", ], function(app, FauxtonAPI, VerifyInstall) { VerifyInstall.Main = FauxtonAPI.View.extend({ template: 'addons/verifyinstall/templates/main', events: { "click #start": "startTest" }, initialize: function (options) { _.bindAll(this); }, setPass: function (id) { this.$('#' + id).html('✓'); }, setError: function (id, msg) { this.$('#' + id).html('✗'); FauxtonAPI.addNotification({ msg: 'Error: ' + msg, type: 'error', selector: '#error' }); }, complete: function () { FauxtonAPI.addNotification({ msg: 'Success! You CouchDB install is working. Time to Relax', type: 'success', selector: '#error' }); }, enableButton: function () { this.$('#start').removeAttr('disabled').text('Verify Installation'); }, disableButton: function () { this.$('#start').attr('disabled','disabled').text('Verifying'); }, formatError: function (id) { var enableButton = this.enableButton, setError = this.setError; return function (xhr, error, reason) { enableButton(); if (!xhr) { return; } setError(id, JSON.parse(xhr.responseText).reason); }; }, startTest: function () { this.disableButton(); this.$('.status').text(''); var testProcess = VerifyInstall.testProcess, setPass = this.setPass, complete = this.complete, setError = this.setError, formatError = this.formatError; testProcess.setup() .then(function () { return testProcess.saveDB(); }, formatError('create-database')) .then(function () { setPass('create-database'); return testProcess.saveDoc(); }, formatError('create-document')) .then(function () { setPass('create-document'); return testProcess.updateDoc(); }, formatError('update-document')) .then(function () { setPass('update-document'); return testProcess.destroyDoc(); }, formatError('delete-document')) .then(function () { setPass('delete-document'); return testProcess.setupView(); }, formatError('create-view')) .then(function () { return testProcess.testView(); }, formatError('create-view')) .then(function () { setPass('create-view'); return testProcess.setupReplicate(); }, formatError('create-view')) .then(function () { return testProcess.testReplicate(); }, formatError('replicate')) .then(function () { setPass('replicate'); complete(); testProcess.removeDBs(); }, formatError('replicate')); this.enableButton(); } }); return VerifyInstall; }); apache-couchdb-1.6.0/src/fauxton/app/addons/verifyinstall/templates/0000755000175000001440000000000012332105600025507 5ustar00djcusers00000000000000apache-couchdb-1.6.0/src/fauxton/app/addons/verifyinstall/templates/main.html0000644000175000001440000000264212332105522027330 0ustar00djcusers00000000000000
Test Status
Create Database
Create Document
Update Document
Delete Document
Create View
Replication
apache-couchdb-1.6.0/src/fauxton/app/addons/plugins/0000755000175000001440000000000012332105600022277 5ustar00djcusers00000000000000apache-couchdb-1.6.0/src/fauxton/app/addons/plugins/routes.js0000644000175000001440000000242712332105522024166 0ustar00djcusers00000000000000// Licensed under the Apache License, Version 2.0 (the "License"); you may not // use this file except in compliance with the License. You may obtain a copy of // the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, WITHOUT // WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the // License for the specific language governing permissions and limitations under // the License. define([ "app", "api", "addons/plugins/resources" ], function(app, FauxtonAPI, plugins) { var PluginsRouteObject = FauxtonAPI.RouteObject.extend({ layout: "one_pane", crumbs: [ {"name": "Plugins","link": "_plugins"} ], routes: { "_plugins": "pluginsRoute" }, selectedHeader: "Plugins", roles: ["_admin"], apiUrl:'plugins', initialize: function () { //put common views used on all your routes here (eg: sidebars ) }, pluginsRoute: function () { this.setView("#dashboard-content", new plugins.Hello({})); } }); plugins.RouteObjects = [PluginsRouteObject]; return plugins; }); apache-couchdb-1.6.0/src/fauxton/app/addons/plugins/resources.js0000644000175000001440000000140312332105522024650 0ustar00djcusers00000000000000// Licensed under the Apache License, Version 2.0 (the "License"); you may not // use this file except in compliance with the License. You may obtain a copy of // the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, WITHOUT // WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the // License for the specific language governing permissions and limitations under // the License. define([ "app", "api" ], function (app, FauxtonAPI) { var plugins = FauxtonAPI.addon(); plugins.Hello = FauxtonAPI.View.extend({ template: "addons/plugins/templates/plugins" }); return plugins; }); apache-couchdb-1.6.0/src/fauxton/app/addons/plugins/base.js0000644000175000001440000000147612332105522023562 0ustar00djcusers00000000000000// Licensed under the Apache License, Version 2.0 (the "License"); you may not // use this file except in compliance with the License. You may obtain a copy of // the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, WITHOUT // WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the // License for the specific language governing permissions and limitations under // the License. define([ "app", "api", "addons/plugins/routes" ], function(app, FauxtonAPI, plugins) { plugins.initialize = function() { //FauxtonAPI.addHeaderLink({title: "Plugins", href: "#_plugins", icon: "fonticon-plugins", className: 'plugins'}); }; return plugins; }); apache-couchdb-1.6.0/src/fauxton/app/addons/plugins/templates/0000755000175000001440000000000012332105600024275 5ustar00djcusers00000000000000apache-couchdb-1.6.0/src/fauxton/app/addons/plugins/templates/plugins.html0000644000175000001440000000672112332105522026655 0ustar00djcusers00000000000000

GeoCouch

Version: couchdb1.2.x_v0.3.0-11-g66e6219

Author: Volker Mische

Available Erlang Versions:

  • CouchDB 1.4.0-XXX R15B01

CouchPerUser

Version: 1.0.0

Author: Bob Ippolito

Available Erlang Versions:

  • CouchDB 1.4.0-XXX R15B01

apache-couchdb-1.6.0/src/fauxton/app/addons/styletests/0000755000175000001440000000000012332105600023041 5ustar00djcusers00000000000000apache-couchdb-1.6.0/src/fauxton/app/addons/styletests/routes.js0000644000175000001440000000200412332105522024717 0ustar00djcusers00000000000000// Licensed under the Apache License, Version 2.0 (the "License"); you may not // use this file except in compliance with the License. You may obtain a copy of // the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, WITHOUT // WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the // License for the specific language governing permissions and limitations under // the License. define([ "app", "api", "addons/styletests/views" ], function(app, FauxtonAPI, Views) { var TestRouteObject = FauxtonAPI.RouteObject.extend({ layout: "one_pane", routes: { "tests": "initialize" }, selectedHeader: 'theme tests', crumbs:[], apiUrl: function(){ return false; }, initialize: function(){ this.setView("#dashboard-content", new Views.tests({})); } }); Views.RouteObjects = [TestRouteObject]; return Views; }); apache-couchdb-1.6.0/src/fauxton/app/addons/styletests/resources.js0000644000175000001440000000122412332105522025413 0ustar00djcusers00000000000000// Licensed under the Apache License, Version 2.0 (the "License"); you may not // use this file except in compliance with the License. You may obtain a copy of // the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, WITHOUT // WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the // License for the specific language governing permissions and limitations under // the License. define([ "app", "api" ], function (app, FauxtonAPI) { var resources = {}; return resources; }); apache-couchdb-1.6.0/src/fauxton/app/addons/styletests/base.js0000644000175000001440000000150112332105522024311 0ustar00djcusers00000000000000// Licensed under the Apache License, Version 2.0 (the "License"); you may not // use this file except in compliance with the License. You may obtain a copy of // the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, WITHOUT // WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the // License for the specific language governing permissions and limitations under // the License. define([ "app", "api", "addons/styletests/routes" ], function(app, FauxtonAPI, tests) { tests.initialize = function() { FauxtonAPI.addHeaderLink({ title: "Tests", href: '#/tests', bottomNav: true, icon: "fonticon-wrench" }); }; return tests; }); apache-couchdb-1.6.0/src/fauxton/app/addons/styletests/views.js0000644000175000001440000000136012332105522024537 0ustar00djcusers00000000000000// Licensed under the Apache License, Version 2.0 (the "License"); you may not // use this file except in compliance with the License. You may obtain a copy of // the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, WITHOUT // WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the // License for the specific language governing permissions and limitations under // the License. define([ "app", "api" ], function (app, FauxtonAPI) { var Views= {}; Views.tests = FauxtonAPI.View.extend({ template: "addons/styletests/templates/theme" }); return Views; }); apache-couchdb-1.6.0/src/fauxton/app/addons/styletests/templates/0000755000175000001440000000000012332105600025037 5ustar00djcusers00000000000000apache-couchdb-1.6.0/src/fauxton/app/addons/styletests/templates/theme.html0000644000175000001440000005665312332105522027051 0ustar00djcusers00000000000000

Fauxton Style Guide mostly made of Bootstrap 2.x

(Mostly) Standard Bootstrap styles customized for Fauxton.

h1. Heading 1

h2. Heading 2

h3. Heading 3

h4. Heading 4

h5. Heading 5
h6. Heading 6

Bootstrap Standard Button class names

.btn.btn-large.btn-*

.btn.btn-*

.btn.btn-small.btn-*

.btn.btn-mini.btn-*

with Icons

.btn.btn-large.btn-*

.btn.btn-*

.btn.btn-small.btn-*

.btn.btn-mini.btn-*

just Icons

.btn.btn-large.btn-*

.btn.btn-*

.btn.btn-small.btn-*

.btn.btn-mini.btn-*

.btn-group

disabled

.btn.btn-*

.btn.btn-*

Legend Example block-level help text here.

Search

Sign in

Whole form

Selects

Inputs with pre

@

Inputs with post

.00

Inputs with pre and post

$ .00

Inputs with button

Inputs with two buttons

Inputs with dropdown button

Inputs sizes

Well done! You successfully read this important alert message.
Heads up! This alert needs your attention, but it's not super important.
Warning! Best check yo self, you're not looking too good.
Oh snap! Change a few things up and try submitting again.
60% Complete
40% Complete (success)
20% Complete
60% Complete (warning)
80% Complete (danger)
35% Complete (success)
20% Complete (warning)
10% Complete (danger)

Lorem ipsum dolor sit amet, consectetur adipiscing elit. Maecenas sed diam eget risus varius blandit sit amet non magna. Lorem ipsum dolor sit amet, consectetur adipiscing elit. Praesent commodo cursus magna, vel scelerisque nisl consectetur et. Cras mattis consectetur purus sit amet fermentum. Duis mollis, est non commodo luctus, nisi erat porttitor ligula, eget lacinia odio sem nec elit. Aenean lacinia bibendum nulla sed consectetur.

apache-couchdb-1.6.0/src/fauxton/app/addons/pouchdb/0000755000175000001440000000000012332105600022242 5ustar00djcusers00000000000000apache-couchdb-1.6.0/src/fauxton/app/addons/pouchdb/base.js0000644000175000001440000000331712332105522023521 0ustar00djcusers00000000000000// Licensed under the Apache License, Version 2.0 (the "License"); you may not // use this file except in compliance with the License. You may obtain a copy of // the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, WITHOUT // WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the // License for the specific language governing permissions and limitations under // the License. /* * NOTE: * This temporarily uses the PouchDB map reduce implementation * These files are modified locally until we make a more general version and * push it back upstream. */ define([ "app", "api", // Modules "addons/pouchdb/pouchdb.mapreduce.js" ], function(app, FauxtonAPI, MapReduce) { var Pouch = FauxtonAPI.addon(); Pouch.MapReduce = MapReduce; Pouch.runViewQuery = function(fun, opts) { /*docs = [ {_id: 'test_doc_1', foo: 'bar-1'}, {_id: 'test_doc_2', foo: 'bar-2'}, {_id: 'test_doc_3', foo: 'bar-3'}, {_id: 'test_doc_4', foo: 'bar-4'}, {_id: 'test_doc_5', foo: 'bar-5'}, {_id: 'test_doc_6', foo: 'bar-6'}, {_id: 'test_doc_7', foo: 'bar-7'}, {_id: 'test_doc_8', foo: 'bar-8'}, {_id: 'test_doc_9', foo: 'bar-9'}, {_id: 'test_doc_10', foo: 'bar-10'} ];*/ var deferred = FauxtonAPI.Deferred(); var complete = function(resp, rows) { deferred.resolve(rows); }; var options = _.extend(opts, {complete: complete}); Pouch.MapReduce.query(fun, options); return deferred; }; //pdb.runViewQuery({map:function(doc) { emit(doc._id, doc.foo) }}) return Pouch; }); apache-couchdb-1.6.0/src/fauxton/app/addons/pouchdb/pouch.collate.js0000644000175000001440000000520312332105522025343 0ustar00djcusers00000000000000/* * NOTE: * This temporarily uses the PouchDB map reduce implementation * These files are modified locally until we make a more general version and * push it back upstream. * Original file: * https://github.com/daleharvey/pouchdb/blob/master/src/pouch.collate.js */ /* (function() { // a few hacks to get things in the right place for node.js if (typeof module !== 'undefined' && module.exports) { module.exports = Pouch; } */ define([ "app", "api", // Modules "addons/pouchdb/pouch.collate.js" ], function(app, FauxtonAPI, Collate) { var Pouch = {}; Pouch.collate = function(a, b) { var ai = collationIndex(a); var bi = collationIndex(b); if ((ai - bi) !== 0) { return ai - bi; } if (a === null) { return 0; } if (typeof a === 'number') { return a - b; } if (typeof a === 'boolean') { return a < b ? -1 : 1; } if (typeof a === 'string') { return stringCollate(a, b); } if (Array.isArray(a)) { return arrayCollate(a, b); } if (typeof a === 'object') { return objectCollate(a, b); } }; var stringCollate = function(a, b) { // See: https://github.com/daleharvey/pouchdb/issues/40 // This is incompatible with the CouchDB implementation, but its the // best we can do for now return (a === b) ? 0 : ((a > b) ? 1 : -1); }; var objectCollate = function(a, b) { var ak = Object.keys(a), bk = Object.keys(b); var len = Math.min(ak.length, bk.length); for (var i = 0; i < len; i++) { // First sort the keys var sort = Pouch.collate(ak[i], bk[i]); if (sort !== 0) { return sort; } // if the keys are equal sort the values sort = Pouch.collate(a[ak[i]], b[bk[i]]); if (sort !== 0) { return sort; } } return (ak.length === bk.length) ? 0 : (ak.length > bk.length) ? 1 : -1; }; var arrayCollate = function(a, b) { var len = Math.min(a.length, b.length); for (var i = 0; i < len; i++) { var sort = Pouch.collate(a[i], b[i]); if (sort !== 0) { return sort; } } return (a.length === b.length) ? 0 : (a.length > b.length) ? 1 : -1; }; // The collation is defined by erlangs ordered terms // the atoms null, true, false come first, then numbers, strings, // arrays, then objects var collationIndex = function(x) { var id = ['boolean', 'number', 'string', 'object']; if (id.indexOf(typeof x) !== -1) { if (x === null) { return 1; } return id.indexOf(typeof x) + 2; } if (Array.isArray(x)) { return 4.5; } }; return Pouch; }); apache-couchdb-1.6.0/src/fauxton/app/addons/pouchdb/pouchdb.mapreduce.js0000644000175000001440000002254212332105522026200 0ustar00djcusers00000000000000/* * NOTE: * This temporarily uses the PouchDB map reduce implementation * These files are modified locally until we make a more general version and * push it back upstream. * Original file: * https://github.com/daleharvey/pouchdb/blob/master/src/plugins/pouchdb.mapreduce.js */ /*global Pouch: true */ //"use strict"; // This is the first implementation of a basic plugin, we register the // plugin object with pouch and it is mixin'd to each database created // (regardless of adapter), adapters can override plugins by providing // their own implementation. functions on the plugin object that start // with _ are reserved function that are called by pouchdb for special // notifications. // If we wanted to store incremental views we can do it here by listening // to the changes feed (keeping track of our last update_seq between page loads) // and storing the result of the map function (possibly using the upcoming // extracted adapter functions) define([ "app", "api", // Modules "addons/pouchdb/pouch.collate.js" ], function(app, FauxtonAPI, Collate) { var Pouch = {}; Pouch.collate = Collate.collate; //var MapReduce = function(db) { var MapReduce = function() { var builtInReduce = { "_sum": function(keys, values){ return sum(values); }, "_count": function(keys, values, rereduce){ if (rereduce){ return sum(values); } else { return values.length; } }, "_stats": function(keys, values, rereduce){ return { 'sum': sum(values), 'min': Math.min.apply(null, values), 'max': Math.max.apply(null, values), 'count': values.length, 'sumsqr': (function(){ _sumsqr = 0; for(var idx in values){ _sumsqr += values[idx] * values[idx]; } return _sumsqr; })() }; } }; function viewQuery(fun, options) { console.log("IN VIEW QUERY"); if (!options.complete) { return; } function sum(values) { return values.reduce(function(a, b) { return a + b; }, 0); } var results = []; var current = null; var num_started= 0; var completed= false; var emit = function(key, val) { //console.log("IN EMIT: ", key, val, current); var viewRow = { id: current.doc._id, key: key, value: val }; //console.log("VIEW ROW: ", viewRow); if (options.startkey && Pouch.collate(key, options.startkey) < 0) return; if (options.endkey && Pouch.collate(key, options.endkey) > 0) return; if (options.key && Pouch.collate(key, options.key) !== 0) return; num_started++; if (options.include_docs) { // TODO:: FIX throw({error: "Include Docs not supported"}); /* //in this special case, join on _id (issue #106) if (val && typeof val === 'object' && val._id){ db.get(val._id, function(_, joined_doc){ if (joined_doc) { viewRow.doc = joined_doc; } results.push(viewRow); checkComplete(); }); return; } else { viewRow.doc = current.doc; } */ } console.log("EMITTING: ", viewRow); results.push(viewRow); }; // ugly way to make sure references to 'emit' in map/reduce bind to the // above emit eval('fun.map = ' + fun.map.toString() + ';'); if (fun.reduce && options.reduce) { if (builtInReduce[fun.reduce]) { console.log('built in reduce'); fun.reduce = builtInReduce[fun.reduce]; } eval('fun.reduce = ' + fun.reduce.toString() + ';'); } // exclude _conflicts key by default // or to use options.conflicts if it's set when called by db.query var conflicts = ('conflicts' in options ? options.conflicts : false); //only proceed once all documents are mapped and joined var checkComplete= function(){ console.log('check'); if (completed && results.length == num_started){ results.sort(function(a, b) { return Pouch.collate(a.key, b.key); }); if (options.descending) { results.reverse(); } if (options.reduce === false) { return options.complete(null, {rows: results}); } console.log('reducing', options); var groups = []; results.forEach(function(e) { var last = groups[groups.length-1] || null; if (last && Pouch.collate(last.key[0][0], e.key) === 0) { last.key.push([e.key, e.id]); last.value.push(e.value); return; } groups.push({key: [[e.key, e.id]], value: [e.value]}); }); groups.forEach(function(e) { e.value = fun.reduce(e.key, e.value) || null; e.key = e.key[0][0]; }); console.log('GROUPs', groups); options.complete(null, {rows: groups}); } }; if (options.docs) { //console.log("RUNNING MR ON DOCS: ", options.docs); _.each(options.docs, function(doc) { current = {doc: doc}; fun.map.call(this, doc); }, this); completed = true; return checkComplete();//options.complete(null, {rows: results}); } else { //console.log("COULD NOT FIND DOCS"); return false; } /* db.changes({ conflicts: conflicts, include_docs: true, onChange: function(doc) { if (!('deleted' in doc)) { current = {doc: doc.doc}; fun.map.call(this, doc.doc); } }, complete: function() { completed= true; checkComplete(); } }); */ } /* function httpQuery(fun, opts, callback) { // List of parameters to add to the PUT request var params = []; var body = undefined; var method = 'GET'; // If opts.reduce exists and is defined, then add it to the list // of parameters. // If reduce=false then the results are that of only the map function // not the final result of map and reduce. if (typeof opts.reduce !== 'undefined') { params.push('reduce=' + opts.reduce); } if (typeof opts.include_docs !== 'undefined') { params.push('include_docs=' + opts.include_docs); } if (typeof opts.limit !== 'undefined') { params.push('limit=' + opts.limit); } if (typeof opts.descending !== 'undefined') { params.push('descending=' + opts.descending); } if (typeof opts.startkey !== 'undefined') { params.push('startkey=' + encodeURIComponent(JSON.stringify(opts.startkey))); } if (typeof opts.endkey !== 'undefined') { params.push('endkey=' + encodeURIComponent(JSON.stringify(opts.endkey))); } if (typeof opts.key !== 'undefined') { params.push('key=' + encodeURIComponent(JSON.stringify(opts.key))); } // If keys are supplied, issue a POST request to circumvent GET query string limits // see http://wiki.apache.org/couchdb/HTTP_view_API#Querying_Options if (typeof opts.keys !== 'undefined') { method = 'POST'; body = JSON.stringify({keys:opts.keys}); } // Format the list of parameters into a valid URI query string params = params.join('&'); params = params === '' ? '' : '?' + params; // We are referencing a query defined in the design doc if (typeof fun === 'string') { var parts = fun.split('/'); db.request({ method: method, url: '_design/' + parts[0] + '/_view/' + parts[1] + params, body: body }, callback); return; } // We are using a temporary view, terrible for performance but good for testing var queryObject = JSON.parse(JSON.stringify(fun, function(key, val) { if (typeof val === 'function') { return val + ''; // implicitly `toString` it } return val; })); db.request({ method:'POST', url: '_temp_view' + params, body: queryObject }, callback); } */ function query(fun, opts, callback) { if (typeof opts === 'function') { callback = opts; opts = {}; } if (callback) { opts.complete = callback; } /* if (db.type() === 'http') { return httpQuery(fun, opts, callback); } */ if (typeof fun === 'object') { console.log("RUNNING VIEW QUERY", fun, opts, arguments); return viewQuery(fun, opts); } throw({error: "Shouldn't have gotten here"}); /* var parts = fun.split('/'); db.get('_design/' + parts[0], function(err, doc) { if (err) { if (callback) callback(err); return; } viewQuery({ map: doc.views[parts[1]].map, reduce: doc.views[parts[1]].reduce }, opts); }); */ } return {'query': query}; }; // Deletion is a noop since we dont store the results of the view MapReduce._delete = function() { }; //Pouch.plugin('mapreduce', MapReduce); return MapReduce(); }); apache-couchdb-1.6.0/src/fauxton/app/app.js0000644000175000001440000000562612332105522020500 0ustar00djcusers00000000000000// Licensed under the Apache License, Version 2.0 (the "License"); you may not // use this file except in compliance with the License. You may obtain a copy of // the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, WITHOUT // WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the // License for the specific language governing permissions and limitations under // the License. define([ // Application. "initialize", // Libraries "jquery", "lodash", "backbone", "bootstrap", "helpers", "core/utils", // Modules "core/api", "core/couchdbSession", // Plugins. "plugins/backbone.layoutmanager", "plugins/jquery.form" ], function(app, $, _, Backbone, Bootstrap, Helpers, Utils, FauxtonAPI, Couchdb) { // Make sure we have a console.log if (typeof console == "undefined") { console = { log: function(){}, trace: function(){}, debug: function(){} }; } // Provide a global location to place configuration settings and module // creation also mix in Backbone.Events _.extend(app, { utils: Utils, getParams: FauxtonAPI.utils.getParams }); // Localize or create a new JavaScript Template object. var JST = window.JST = window.JST || {}; // Configure LayoutManager with Backbone Boilerplate defaults. FauxtonAPI.Layout.configure({ // Allow LayoutManager to augment Backbone.View.prototype. manage: true, prefix: "app/", // Inject app/helper.js for shared functionality across all html templates renderTemplate: function(template, context) { return template(_.extend(Helpers, context)); }, fetchTemplate: function(path) { // Initialize done for use in async-mode var done; // Concatenate the file extension. path = path + ".html"; // If cached, use the compiled template. if (JST[path]) { return JST[path]; } else { // Put fetch into `async-mode`. done = this.async(); // Seek out the template asynchronously. return $.ajax({ url: app.root + path }).then(function(contents) { done(JST[path] = _.template(contents)); }); } } }); FauxtonAPI.setSession(new Couchdb.Session()); // Define your master router on the application namespace and trigger all // navigation from this instance. FauxtonAPI.config({ el: "#app-container", masterLayout: new FauxtonAPI.Layout(), addHeaderLink: function(link) { FauxtonAPI.registerExtension('navbar:addHeaderLink', link); }, removeHeaderLink: function(link) { FauxtonAPI.removeExtensionItem('navbar:addHeaderLink', link, function (item) { if (item.title === link.title) { return true; } return false; }); } }); return app; }); apache-couchdb-1.6.0/src/fauxton/app/load_addons.js.underscore0000644000175000001440000000136412332105522024332 0ustar00djcusers00000000000000// Licensed under the Apache License, Version 2.0 (the "License"); you may not // use this file except in compliance with the License. You may obtain a copy of // the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, WITHOUT // WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the // License for the specific language governing permissions and limitations under // the License. /* * ::WARNING:: * THIS IS A GENERATED FILE. DO NOT EDIT. */ define([ <%= '"' + deps.join('","') + '"' %> ], function() { var LoadAddons = { addons: arguments }; return LoadAddons; }); apache-couchdb-1.6.0/src/fauxton/app/initialize.js.underscore0000644000175000001440000000165312332105522024225 0ustar00djcusers00000000000000// Licensed under the Apache License, Version 2.0 (the "License"); you may not // use this file except in compliance with the License. You may obtain a copy of // the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, WITHOUT // WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the // License for the specific language governing permissions and limitations under // the License. /* * ::WARNING:: * THIS IS A GENERATED FILE. DO NOT EDIT. */ define([], function() { // Provide a global location to place configuration settings and module // creation. var app = { // The root path to run the application. root: "<%= root %>", version: "<%= version %>", // Host is used as prefix for urls host: "<%= host %>" , }; return app; }); apache-couchdb-1.6.0/src/fauxton/app/templates/0000755000175000001440000000000012332105600021344 5ustar00djcusers00000000000000apache-couchdb-1.6.0/src/fauxton/app/templates/layouts/0000755000175000001440000000000012332105600023044 5ustar00djcusers00000000000000apache-couchdb-1.6.0/src/fauxton/app/templates/layouts/with_tabs_sidebar.html0000644000175000001440000000222712332105522027415 0ustar00djcusers00000000000000
apache-couchdb-1.6.0/src/fauxton/app/templates/layouts/two_pane.html0000644000175000001440000000161112332105522025550 0ustar00djcusers00000000000000
apache-couchdb-1.6.0/src/fauxton/app/templates/layouts/one_pane.html0000644000175000001440000000156112332105522025524 0ustar00djcusers00000000000000
apache-couchdb-1.6.0/src/fauxton/app/templates/layouts/with_tabs.html0000644000175000001440000000155412332105522025726 0ustar00djcusers00000000000000
apache-couchdb-1.6.0/src/fauxton/app/templates/layouts/with_sidebar.html0000644000175000001440000000157512332105522026411 0ustar00djcusers00000000000000
apache-couchdb-1.6.0/src/fauxton/bin/0000755000175000001440000000000012332105600017336 5ustar00djcusers00000000000000apache-couchdb-1.6.0/src/fauxton/bin/grunt0000755000175000001440000000121012332105522020420 0ustar00djcusers00000000000000#!/bin/sh # Licensed under the Apache License, Version 2.0 (the "License"); you may not # use this file except in compliance with the License. You may obtain a copy of # the License at # # http://www.apache.org/licenses/LICENSE-2.0 # # Unless required by applicable law or agreed to in writing, software # distributed under the License is distributed on an "AS IS" BASIS, WITHOUT # WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the # License for the specific language governing permissions and limitations under # the License. REL_PATH="`dirname \"$0\"`" GRUNT_PATH="$REL_PATH/../node_modules/.bin/grunt" $GRUNT_PATH $* apache-couchdb-1.6.0/src/fauxton/test/0000755000175000001440000000000012332105600017545 5ustar00djcusers00000000000000apache-couchdb-1.6.0/src/fauxton/test/mocha/0000755000175000001440000000000012332105600020634 5ustar00djcusers00000000000000apache-couchdb-1.6.0/src/fauxton/test/mocha/sinon.js0000644000175000001440000040311412332105522022326 0ustar00djcusers00000000000000/** * Sinon.JS 1.7.3, 2013/06/20 * * @author Christian Johansen (christian@cjohansen.no) * @author Contributors: https://github.com/cjohansen/Sinon.JS/blob/master/AUTHORS * * (The BSD License) * * Copyright (c) 2010-2013, Christian Johansen, christian@cjohansen.no * All rights reserved. * * 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 Johansen nor the names of his contributors * may be used to endorse or promote products derived from this software * without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ this.sinon = (function () { var buster = (function (setTimeout, B) { var isNode = typeof require == "function" && typeof module == "object"; var div = typeof document != "undefined" && document.createElement("div"); var F = function () {}; var buster = { bind: function bind(obj, methOrProp) { var method = typeof methOrProp == "string" ? obj[methOrProp] : methOrProp; var args = Array.prototype.slice.call(arguments, 2); return function () { var allArgs = args.concat(Array.prototype.slice.call(arguments)); return method.apply(obj, allArgs); }; }, partial: function partial(fn) { var args = [].slice.call(arguments, 1); return function () { return fn.apply(this, args.concat([].slice.call(arguments))); }; }, create: function create(object) { F.prototype = object; return new F(); }, extend: function extend(target) { if (!target) { return; } for (var i = 1, l = arguments.length, prop; i < l; ++i) { for (prop in arguments[i]) { target[prop] = arguments[i][prop]; } } return target; }, nextTick: function nextTick(callback) { if (typeof process != "undefined" && process.nextTick) { return process.nextTick(callback); } setTimeout(callback, 0); }, functionName: function functionName(func) { if (!func) return ""; if (func.displayName) return func.displayName; if (func.name) return func.name; var matches = func.toString().match(/function\s+([^\(]+)/m); return matches && matches[1] || ""; }, isNode: function isNode(obj) { if (!div) return false; try { obj.appendChild(div); obj.removeChild(div); } catch (e) { return false; } return true; }, isElement: function isElement(obj) { return obj && obj.nodeType === 1 && buster.isNode(obj); }, isArray: function isArray(arr) { return Object.prototype.toString.call(arr) == "[object Array]"; }, flatten: function flatten(arr) { var result = [], arr = arr || []; for (var i = 0, l = arr.length; i < l; ++i) { result = result.concat(buster.isArray(arr[i]) ? flatten(arr[i]) : arr[i]); } return result; }, each: function each(arr, callback) { for (var i = 0, l = arr.length; i < l; ++i) { callback(arr[i]); } }, map: function map(arr, callback) { var results = []; for (var i = 0, l = arr.length; i < l; ++i) { results.push(callback(arr[i])); } return results; }, parallel: function parallel(fns, callback) { function cb(err, res) { if (typeof callback == "function") { callback(err, res); callback = null; } } if (fns.length == 0) { return cb(null, []); } var remaining = fns.length, results = []; function makeDone(num) { return function done(err, result) { if (err) { return cb(err); } results[num] = result; if (--remaining == 0) { cb(null, results); } }; } for (var i = 0, l = fns.length; i < l; ++i) { fns[i](makeDone(i)); } }, series: function series(fns, callback) { function cb(err, res) { if (typeof callback == "function") { callback(err, res); } } var remaining = fns.slice(); var results = []; function callNext() { if (remaining.length == 0) return cb(null, results); var promise = remaining.shift()(next); if (promise && typeof promise.then == "function") { promise.then(buster.partial(next, null), next); } } function next(err, result) { if (err) return cb(err); results.push(result); callNext(); } callNext(); }, countdown: function countdown(num, done) { return function () { if (--num == 0) done(); }; } }; if (typeof process === "object" && typeof require === "function" && typeof module === "object") { var crypto = require("crypto"); var path = require("path"); buster.tmpFile = function (fileName) { var hashed = crypto.createHash("sha1"); hashed.update(fileName); var tmpfileName = hashed.digest("hex"); if (process.platform == "win32") { return path.join(process.env["TEMP"], tmpfileName); } else { return path.join("/tmp", tmpfileName); } }; } if (Array.prototype.some) { buster.some = function (arr, fn, thisp) { return arr.some(fn, thisp); }; } else { // https://developer.mozilla.org/en/JavaScript/Reference/Global_Objects/Array/some buster.some = function (arr, fun, thisp) { if (arr == null) { throw new TypeError(); } arr = Object(arr); var len = arr.length >>> 0; if (typeof fun !== "function") { throw new TypeError(); } for (var i = 0; i < len; i++) { if (arr.hasOwnProperty(i) && fun.call(thisp, arr[i], i, arr)) { return true; } } return false; }; } if (Array.prototype.filter) { buster.filter = function (arr, fn, thisp) { return arr.filter(fn, thisp); }; } else { // https://developer.mozilla.org/en/JavaScript/Reference/Global_Objects/Array/filter buster.filter = function (fn, thisp) { if (this == null) { throw new TypeError(); } var t = Object(this); var len = t.length >>> 0; if (typeof fn != "function") { throw new TypeError(); } var res = []; for (var i = 0; i < len; i++) { if (i in t) { var val = t[i]; // in case fun mutates this if (fn.call(thisp, val, i, t)) { res.push(val); } } } return res; }; } if (isNode) { module.exports = buster; buster.eventEmitter = require("./buster-event-emitter"); Object.defineProperty(buster, "defineVersionGetter", { get: function () { return require("./define-version-getter"); } }); } return buster.extend(B || {}, buster); }(setTimeout, buster)); if (typeof buster === "undefined") { var buster = {}; } if (typeof module === "object" && typeof require === "function") { buster = require("buster-core"); } buster.format = buster.format || {}; buster.format.excludeConstructors = ["Object", /^.$/]; buster.format.quoteStrings = true; buster.format.ascii = (function () { var hasOwn = Object.prototype.hasOwnProperty; var specialObjects = []; if (typeof global != "undefined") { specialObjects.push({ obj: global, value: "[object global]" }); } if (typeof document != "undefined") { specialObjects.push({ obj: document, value: "[object HTMLDocument]" }); } if (typeof window != "undefined") { specialObjects.push({ obj: window, value: "[object Window]" }); } function keys(object) { var k = Object.keys && Object.keys(object) || []; if (k.length == 0) { for (var prop in object) { if (hasOwn.call(object, prop)) { k.push(prop); } } } return k.sort(); } function isCircular(object, objects) { if (typeof object != "object") { return false; } for (var i = 0, l = objects.length; i < l; ++i) { if (objects[i] === object) { return true; } } return false; } function ascii(object, processed, indent) { if (typeof object == "string") { var quote = typeof this.quoteStrings != "boolean" || this.quoteStrings; return processed || quote ? '"' + object + '"' : object; } if (typeof object == "function" && !(object instanceof RegExp)) { return ascii.func(object); } processed = processed || []; if (isCircular(object, processed)) { return "[Circular]"; } if (Object.prototype.toString.call(object) == "[object Array]") { return ascii.array.call(this, object, processed); } if (!object) { return "" + object; } if (buster.isElement(object)) { return ascii.element(object); } if (typeof object.toString == "function" && object.toString !== Object.prototype.toString) { return object.toString(); } for (var i = 0, l = specialObjects.length; i < l; i++) { if (object === specialObjects[i].obj) { return specialObjects[i].value; } } return ascii.object.call(this, object, processed, indent); } ascii.func = function (func) { return "function " + buster.functionName(func) + "() {}"; }; ascii.array = function (array, processed) { processed = processed || []; processed.push(array); var pieces = []; for (var i = 0, l = array.length; i < l; ++i) { pieces.push(ascii.call(this, array[i], processed)); } return "[" + pieces.join(", ") + "]"; }; ascii.object = function (object, processed, indent) { processed = processed || []; processed.push(object); indent = indent || 0; var pieces = [], properties = keys(object), prop, str, obj; var is = ""; var length = 3; for (var i = 0, l = indent; i < l; ++i) { is += " "; } for (i = 0, l = properties.length; i < l; ++i) { prop = properties[i]; obj = object[prop]; if (isCircular(obj, processed)) { str = "[Circular]"; } else { str = ascii.call(this, obj, processed, indent + 2); } str = (/\s/.test(prop) ? '"' + prop + '"' : prop) + ": " + str; length += str.length; pieces.push(str); } var cons = ascii.constructorName.call(this, object); var prefix = cons ? "[" + cons + "] " : "" return (length + indent) > 80 ? prefix + "{\n " + is + pieces.join(",\n " + is) + "\n" + is + "}" : prefix + "{ " + pieces.join(", ") + " }"; }; ascii.element = function (element) { var tagName = element.tagName.toLowerCase(); var attrs = element.attributes, attribute, pairs = [], attrName; for (var i = 0, l = attrs.length; i < l; ++i) { attribute = attrs.item(i); attrName = attribute.nodeName.toLowerCase().replace("html:", ""); if (attrName == "contenteditable" && attribute.nodeValue == "inherit") { continue; } if (!!attribute.nodeValue) { pairs.push(attrName + "=\"" + attribute.nodeValue + "\""); } } var formatted = "<" + tagName + (pairs.length > 0 ? " " : ""); var content = element.innerHTML; if (content.length > 20) { content = content.substr(0, 20) + "[...]"; } var res = formatted + pairs.join(" ") + ">" + content + ""; return res.replace(/ contentEditable="inherit"/, ""); }; ascii.constructorName = function (object) { var name = buster.functionName(object && object.constructor); var excludes = this.excludeConstructors || buster.format.excludeConstructors || []; for (var i = 0, l = excludes.length; i < l; ++i) { if (typeof excludes[i] == "string" && excludes[i] == name) { return ""; } else if (excludes[i].test && excludes[i].test(name)) { return ""; } } return name; }; return ascii; }()); if (typeof module != "undefined") { module.exports = buster.format; } /*jslint eqeqeq: false, onevar: false, forin: true, nomen: false, regexp: false, plusplus: false*/ /*global module, require, __dirname, document*/ /** * Sinon core utilities. For internal use only. * * @author Christian Johansen (christian@cjohansen.no) * @license BSD * * Copyright (c) 2010-2013 Christian Johansen */ var sinon = (function (buster) { var div = typeof document != "undefined" && document.createElement("div"); var hasOwn = Object.prototype.hasOwnProperty; function isDOMNode(obj) { var success = false; try { obj.appendChild(div); success = div.parentNode == obj; } catch (e) { return false; } finally { try { obj.removeChild(div); } catch (e) { // Remove failed, not much we can do about that } } return success; } function isElement(obj) { return div && obj && obj.nodeType === 1 && isDOMNode(obj); } function isFunction(obj) { return typeof obj === "function" || !!(obj && obj.constructor && obj.call && obj.apply); } function mirrorProperties(target, source) { for (var prop in source) { if (!hasOwn.call(target, prop)) { target[prop] = source[prop]; } } } function isRestorable (obj) { return typeof obj === "function" && typeof obj.restore === "function" && obj.restore.sinon; } var sinon = { wrapMethod: function wrapMethod(object, property, method) { if (!object) { throw new TypeError("Should wrap property of object"); } if (typeof method != "function") { throw new TypeError("Method wrapper should be function"); } var wrappedMethod = object[property]; if (!isFunction(wrappedMethod)) { throw new TypeError("Attempted to wrap " + (typeof wrappedMethod) + " property " + property + " as function"); } if (wrappedMethod.restore && wrappedMethod.restore.sinon) { throw new TypeError("Attempted to wrap " + property + " which is already wrapped"); } if (wrappedMethod.calledBefore) { var verb = !!wrappedMethod.returns ? "stubbed" : "spied on"; throw new TypeError("Attempted to wrap " + property + " which is already " + verb); } // IE 8 does not support hasOwnProperty on the window object. var owned = hasOwn.call(object, property); object[property] = method; method.displayName = property; method.restore = function () { // For prototype properties try to reset by delete first. // If this fails (ex: localStorage on mobile safari) then force a reset // via direct assignment. if (!owned) { delete object[property]; } if (object[property] === method) { object[property] = wrappedMethod; } }; method.restore.sinon = true; mirrorProperties(method, wrappedMethod); return method; }, extend: function extend(target) { for (var i = 1, l = arguments.length; i < l; i += 1) { for (var prop in arguments[i]) { if (arguments[i].hasOwnProperty(prop)) { target[prop] = arguments[i][prop]; } // DONT ENUM bug, only care about toString if (arguments[i].hasOwnProperty("toString") && arguments[i].toString != target.toString) { target.toString = arguments[i].toString; } } } return target; }, create: function create(proto) { var F = function () {}; F.prototype = proto; return new F(); }, deepEqual: function deepEqual(a, b) { if (sinon.match && sinon.match.isMatcher(a)) { return a.test(b); } if (typeof a != "object" || typeof b != "object") { return a === b; } if (isElement(a) || isElement(b)) { return a === b; } if (a === b) { return true; } if ((a === null && b !== null) || (a !== null && b === null)) { return false; } var aString = Object.prototype.toString.call(a); if (aString != Object.prototype.toString.call(b)) { return false; } if (aString == "[object Array]") { if (a.length !== b.length) { return false; } for (var i = 0, l = a.length; i < l; i += 1) { if (!deepEqual(a[i], b[i])) { return false; } } return true; } if (aString == "[object Date]") { return a.valueOf() === b.valueOf(); } var prop, aLength = 0, bLength = 0; for (prop in a) { aLength += 1; if (!deepEqual(a[prop], b[prop])) { return false; } } for (prop in b) { bLength += 1; } return aLength == bLength; }, functionName: function functionName(func) { var name = func.displayName || func.name; // Use function decomposition as a last resort to get function // name. Does not rely on function decomposition to work - if it // doesn't debugging will be slightly less informative // (i.e. toString will say 'spy' rather than 'myFunc'). if (!name) { var matches = func.toString().match(/function ([^\s\(]+)/); name = matches && matches[1]; } return name; }, functionToString: function toString() { if (this.getCall && this.callCount) { var thisValue, prop, i = this.callCount; while (i--) { thisValue = this.getCall(i).thisValue; for (prop in thisValue) { if (thisValue[prop] === this) { return prop; } } } } return this.displayName || "sinon fake"; }, getConfig: function (custom) { var config = {}; custom = custom || {}; var defaults = sinon.defaultConfig; for (var prop in defaults) { if (defaults.hasOwnProperty(prop)) { config[prop] = custom.hasOwnProperty(prop) ? custom[prop] : defaults[prop]; } } return config; }, format: function (val) { return "" + val; }, defaultConfig: { injectIntoThis: true, injectInto: null, properties: ["spy", "stub", "mock", "clock", "server", "requests"], useFakeTimers: true, useFakeServer: true }, timesInWords: function timesInWords(count) { return count == 1 && "once" || count == 2 && "twice" || count == 3 && "thrice" || (count || 0) + " times"; }, calledInOrder: function (spies) { for (var i = 1, l = spies.length; i < l; i++) { if (!spies[i - 1].calledBefore(spies[i]) || !spies[i].called) { return false; } } return true; }, orderByFirstCall: function (spies) { return spies.sort(function (a, b) { // uuid, won't ever be equal var aCall = a.getCall(0); var bCall = b.getCall(0); var aId = aCall && aCall.callId || -1; var bId = bCall && bCall.callId || -1; return aId < bId ? -1 : 1; }); }, log: function () {}, logError: function (label, err) { var msg = label + " threw exception: " sinon.log(msg + "[" + err.name + "] " + err.message); if (err.stack) { sinon.log(err.stack); } setTimeout(function () { err.message = msg + err.message; throw err; }, 0); }, typeOf: function (value) { if (value === null) { return "null"; } else if (value === undefined) { return "undefined"; } var string = Object.prototype.toString.call(value); return string.substring(8, string.length - 1).toLowerCase(); }, createStubInstance: function (constructor) { if (typeof constructor !== "function") { throw new TypeError("The constructor should be a function."); } return sinon.stub(sinon.create(constructor.prototype)); }, restore: function (object) { if (object !== null && typeof object === "object") { for (var prop in object) { if (isRestorable(object[prop])) { object[prop].restore(); } } } else if (isRestorable(object)) { object.restore(); } } }; var isNode = typeof module == "object" && typeof require == "function"; if (isNode) { try { buster = { format: require("buster-format") }; } catch (e) {} module.exports = sinon; module.exports.spy = require("./sinon/spy"); module.exports.stub = require("./sinon/stub"); module.exports.mock = require("./sinon/mock"); module.exports.collection = require("./sinon/collection"); module.exports.assert = require("./sinon/assert"); module.exports.sandbox = require("./sinon/sandbox"); module.exports.test = require("./sinon/test"); module.exports.testCase = require("./sinon/test_case"); module.exports.assert = require("./sinon/assert"); module.exports.match = require("./sinon/match"); } if (buster) { var formatter = sinon.create(buster.format); formatter.quoteStrings = false; sinon.format = function () { return formatter.ascii.apply(formatter, arguments); }; } else if (isNode) { try { var util = require("util"); sinon.format = function (value) { return typeof value == "object" && value.toString === Object.prototype.toString ? util.inspect(value) : value; }; } catch (e) { /* Node, but no util module - would be very old, but better safe than sorry */ } } return sinon; }(typeof buster == "object" && buster)); /* @depend ../sinon.js */ /*jslint eqeqeq: false, onevar: false, plusplus: false*/ /*global module, require, sinon*/ /** * Match functions * * @author Maximilian Antoni (mail@maxantoni.de) * @license BSD * * Copyright (c) 2012 Maximilian Antoni */ (function (sinon) { var commonJSModule = typeof module == "object" && typeof require == "function"; if (!sinon && commonJSModule) { sinon = require("../sinon"); } if (!sinon) { return; } function assertType(value, type, name) { var actual = sinon.typeOf(value); if (actual !== type) { throw new TypeError("Expected type of " + name + " to be " + type + ", but was " + actual); } } var matcher = { toString: function () { return this.message; } }; function isMatcher(object) { return matcher.isPrototypeOf(object); } function matchObject(expectation, actual) { if (actual === null || actual === undefined) { return false; } for (var key in expectation) { if (expectation.hasOwnProperty(key)) { var exp = expectation[key]; var act = actual[key]; if (match.isMatcher(exp)) { if (!exp.test(act)) { return false; } } else if (sinon.typeOf(exp) === "object") { if (!matchObject(exp, act)) { return false; } } else if (!sinon.deepEqual(exp, act)) { return false; } } } return true; } matcher.or = function (m2) { if (!isMatcher(m2)) { throw new TypeError("Matcher expected"); } var m1 = this; var or = sinon.create(matcher); or.test = function (actual) { return m1.test(actual) || m2.test(actual); }; or.message = m1.message + ".or(" + m2.message + ")"; return or; }; matcher.and = function (m2) { if (!isMatcher(m2)) { throw new TypeError("Matcher expected"); } var m1 = this; var and = sinon.create(matcher); and.test = function (actual) { return m1.test(actual) && m2.test(actual); }; and.message = m1.message + ".and(" + m2.message + ")"; return and; }; var match = function (expectation, message) { var m = sinon.create(matcher); var type = sinon.typeOf(expectation); switch (type) { case "object": if (typeof expectation.test === "function") { m.test = function (actual) { return expectation.test(actual) === true; }; m.message = "match(" + sinon.functionName(expectation.test) + ")"; return m; } var str = []; for (var key in expectation) { if (expectation.hasOwnProperty(key)) { str.push(key + ": " + expectation[key]); } } m.test = function (actual) { return matchObject(expectation, actual); }; m.message = "match(" + str.join(", ") + ")"; break; case "number": m.test = function (actual) { return expectation == actual; }; break; case "string": m.test = function (actual) { if (typeof actual !== "string") { return false; } return actual.indexOf(expectation) !== -1; }; m.message = "match(\"" + expectation + "\")"; break; case "regexp": m.test = function (actual) { if (typeof actual !== "string") { return false; } return expectation.test(actual); }; break; case "function": m.test = expectation; if (message) { m.message = message; } else { m.message = "match(" + sinon.functionName(expectation) + ")"; } break; default: m.test = function (actual) { return sinon.deepEqual(expectation, actual); }; } if (!m.message) { m.message = "match(" + expectation + ")"; } return m; }; match.isMatcher = isMatcher; match.any = match(function () { return true; }, "any"); match.defined = match(function (actual) { return actual !== null && actual !== undefined; }, "defined"); match.truthy = match(function (actual) { return !!actual; }, "truthy"); match.falsy = match(function (actual) { return !actual; }, "falsy"); match.same = function (expectation) { return match(function (actual) { return expectation === actual; }, "same(" + expectation + ")"); }; match.typeOf = function (type) { assertType(type, "string", "type"); return match(function (actual) { return sinon.typeOf(actual) === type; }, "typeOf(\"" + type + "\")"); }; match.instanceOf = function (type) { assertType(type, "function", "type"); return match(function (actual) { return actual instanceof type; }, "instanceOf(" + sinon.functionName(type) + ")"); }; function createPropertyMatcher(propertyTest, messagePrefix) { return function (property, value) { assertType(property, "string", "property"); var onlyProperty = arguments.length === 1; var message = messagePrefix + "(\"" + property + "\""; if (!onlyProperty) { message += ", " + value; } message += ")"; return match(function (actual) { if (actual === undefined || actual === null || !propertyTest(actual, property)) { return false; } return onlyProperty || sinon.deepEqual(value, actual[property]); }, message); }; } match.has = createPropertyMatcher(function (actual, property) { if (typeof actual === "object") { return property in actual; } return actual[property] !== undefined; }, "has"); match.hasOwn = createPropertyMatcher(function (actual, property) { return actual.hasOwnProperty(property); }, "hasOwn"); match.bool = match.typeOf("boolean"); match.number = match.typeOf("number"); match.string = match.typeOf("string"); match.object = match.typeOf("object"); match.func = match.typeOf("function"); match.array = match.typeOf("array"); match.regexp = match.typeOf("regexp"); match.date = match.typeOf("date"); if (commonJSModule) { module.exports = match; } else { sinon.match = match; } }(typeof sinon == "object" && sinon || null)); /** * @depend ../sinon.js * @depend match.js */ /*jslint eqeqeq: false, onevar: false, plusplus: false*/ /*global module, require, sinon*/ /** * Spy calls * * @author Christian Johansen (christian@cjohansen.no) * @author Maximilian Antoni (mail@maxantoni.de) * @license BSD * * Copyright (c) 2010-2013 Christian Johansen * Copyright (c) 2013 Maximilian Antoni */ var commonJSModule = typeof module == "object" && typeof require == "function"; if (!this.sinon && commonJSModule) { var sinon = require("../sinon"); } (function (sinon) { function throwYieldError(proxy, text, args) { var msg = sinon.functionName(proxy) + text; if (args.length) { msg += " Received [" + slice.call(args).join(", ") + "]"; } throw new Error(msg); } var slice = Array.prototype.slice; var callProto = { calledOn: function calledOn(thisValue) { if (sinon.match && sinon.match.isMatcher(thisValue)) { return thisValue.test(this.thisValue); } return this.thisValue === thisValue; }, calledWith: function calledWith() { for (var i = 0, l = arguments.length; i < l; i += 1) { if (!sinon.deepEqual(arguments[i], this.args[i])) { return false; } } return true; }, calledWithMatch: function calledWithMatch() { for (var i = 0, l = arguments.length; i < l; i += 1) { var actual = this.args[i]; var expectation = arguments[i]; if (!sinon.match || !sinon.match(expectation).test(actual)) { return false; } } return true; }, calledWithExactly: function calledWithExactly() { return arguments.length == this.args.length && this.calledWith.apply(this, arguments); }, notCalledWith: function notCalledWith() { return !this.calledWith.apply(this, arguments); }, notCalledWithMatch: function notCalledWithMatch() { return !this.calledWithMatch.apply(this, arguments); }, returned: function returned(value) { return sinon.deepEqual(value, this.returnValue); }, threw: function threw(error) { if (typeof error === "undefined" || !this.exception) { return !!this.exception; } return this.exception === error || this.exception.name === error; }, calledWithNew: function calledWithNew(thisValue) { return this.thisValue instanceof this.proxy; }, calledBefore: function (other) { return this.callId < other.callId; }, calledAfter: function (other) { return this.callId > other.callId; }, callArg: function (pos) { this.args[pos](); }, callArgOn: function (pos, thisValue) { this.args[pos].apply(thisValue); }, callArgWith: function (pos) { this.callArgOnWith.apply(this, [pos, null].concat(slice.call(arguments, 1))); }, callArgOnWith: function (pos, thisValue) { var args = slice.call(arguments, 2); this.args[pos].apply(thisValue, args); }, "yield": function () { this.yieldOn.apply(this, [null].concat(slice.call(arguments, 0))); }, yieldOn: function (thisValue) { var args = this.args; for (var i = 0, l = args.length; i < l; ++i) { if (typeof args[i] === "function") { args[i].apply(thisValue, slice.call(arguments, 1)); return; } } throwYieldError(this.proxy, " cannot yield since no callback was passed.", args); }, yieldTo: function (prop) { this.yieldToOn.apply(this, [prop, null].concat(slice.call(arguments, 1))); }, yieldToOn: function (prop, thisValue) { var args = this.args; for (var i = 0, l = args.length; i < l; ++i) { if (args[i] && typeof args[i][prop] === "function") { args[i][prop].apply(thisValue, slice.call(arguments, 2)); return; } } throwYieldError(this.proxy, " cannot yield to '" + prop + "' since no callback was passed.", args); }, toString: function () { var callStr = this.proxy.toString() + "("; var args = []; for (var i = 0, l = this.args.length; i < l; ++i) { args.push(sinon.format(this.args[i])); } callStr = callStr + args.join(", ") + ")"; if (typeof this.returnValue != "undefined") { callStr += " => " + sinon.format(this.returnValue); } if (this.exception) { callStr += " !" + this.exception.name; if (this.exception.message) { callStr += "(" + this.exception.message + ")"; } } return callStr; } }; callProto.invokeCallback = callProto.yield; function createSpyCall(spy, thisValue, args, returnValue, exception, id) { if (typeof id !== "number") { throw new TypeError("Call id is not a number"); } var proxyCall = sinon.create(callProto); proxyCall.proxy = spy; proxyCall.thisValue = thisValue; proxyCall.args = args; proxyCall.returnValue = returnValue; proxyCall.exception = exception; proxyCall.callId = id; return proxyCall; }; createSpyCall.toString = callProto.toString; // used by mocks sinon.spyCall = createSpyCall; }(typeof sinon == "object" && sinon || null)); /** * @depend ../sinon.js */ /*jslint eqeqeq: false, onevar: false, plusplus: false*/ /*global module, require, sinon*/ /** * Spy functions * * @author Christian Johansen (christian@cjohansen.no) * @license BSD * * Copyright (c) 2010-2013 Christian Johansen */ (function (sinon) { var commonJSModule = typeof module == "object" && typeof require == "function"; var push = Array.prototype.push; var slice = Array.prototype.slice; var callId = 0; function spy(object, property) { if (!property && typeof object == "function") { return spy.create(object); } if (!object && !property) { return spy.create(function () { }); } var method = object[property]; return sinon.wrapMethod(object, property, spy.create(method)); } function matchingFake(fakes, args, strict) { if (!fakes) { return; } var alen = args.length; for (var i = 0, l = fakes.length; i < l; i++) { if (fakes[i].matches(args, strict)) { return fakes[i]; } } } function incrementCallCount() { this.called = true; this.callCount += 1; this.notCalled = false; this.calledOnce = this.callCount == 1; this.calledTwice = this.callCount == 2; this.calledThrice = this.callCount == 3; } function createCallProperties() { this.firstCall = this.getCall(0); this.secondCall = this.getCall(1); this.thirdCall = this.getCall(2); this.lastCall = this.getCall(this.callCount - 1); } var vars = "a,b,c,d,e,f,g,h,i,j,k,l"; function createProxy(func) { // Retain the function length: var p; if (func.length) { eval("p = (function proxy(" + vars.substring(0, func.length * 2 - 1) + ") { return p.invoke(func, this, slice.call(arguments)); });"); } else { p = function proxy() { return p.invoke(func, this, slice.call(arguments)); }; } return p; } var uuid = 0; // Public API var spyApi = { reset: function () { this.called = false; this.notCalled = true; this.calledOnce = false; this.calledTwice = false; this.calledThrice = false; this.callCount = 0; this.firstCall = null; this.secondCall = null; this.thirdCall = null; this.lastCall = null; this.args = []; this.returnValues = []; this.thisValues = []; this.exceptions = []; this.callIds = []; if (this.fakes) { for (var i = 0; i < this.fakes.length; i++) { this.fakes[i].reset(); } } }, create: function create(func) { var name; if (typeof func != "function") { func = function () { }; } else { name = sinon.functionName(func); } var proxy = createProxy(func); sinon.extend(proxy, spy); delete proxy.create; sinon.extend(proxy, func); proxy.reset(); proxy.prototype = func.prototype; proxy.displayName = name || "spy"; proxy.toString = sinon.functionToString; proxy._create = sinon.spy.create; proxy.id = "spy#" + uuid++; return proxy; }, invoke: function invoke(func, thisValue, args) { var matching = matchingFake(this.fakes, args); var exception, returnValue; incrementCallCount.call(this); push.call(this.thisValues, thisValue); push.call(this.args, args); push.call(this.callIds, callId++); try { if (matching) { returnValue = matching.invoke(func, thisValue, args); } else { returnValue = (this.func || func).apply(thisValue, args); } } catch (e) { push.call(this.returnValues, undefined); exception = e; throw e; } finally { push.call(this.exceptions, exception); } push.call(this.returnValues, returnValue); createCallProperties.call(this); return returnValue; }, getCall: function getCall(i) { if (i < 0 || i >= this.callCount) { return null; } return sinon.spyCall(this, this.thisValues[i], this.args[i], this.returnValues[i], this.exceptions[i], this.callIds[i]); }, calledBefore: function calledBefore(spyFn) { if (!this.called) { return false; } if (!spyFn.called) { return true; } return this.callIds[0] < spyFn.callIds[spyFn.callIds.length - 1]; }, calledAfter: function calledAfter(spyFn) { if (!this.called || !spyFn.called) { return false; } return this.callIds[this.callCount - 1] > spyFn.callIds[spyFn.callCount - 1]; }, withArgs: function () { var args = slice.call(arguments); if (this.fakes) { var match = matchingFake(this.fakes, args, true); if (match) { return match; } } else { this.fakes = []; } var original = this; var fake = this._create(); fake.matchingAguments = args; push.call(this.fakes, fake); fake.withArgs = function () { return original.withArgs.apply(original, arguments); }; for (var i = 0; i < this.args.length; i++) { if (fake.matches(this.args[i])) { incrementCallCount.call(fake); push.call(fake.thisValues, this.thisValues[i]); push.call(fake.args, this.args[i]); push.call(fake.returnValues, this.returnValues[i]); push.call(fake.exceptions, this.exceptions[i]); push.call(fake.callIds, this.callIds[i]); } } createCallProperties.call(fake); return fake; }, matches: function (args, strict) { var margs = this.matchingAguments; if (margs.length <= args.length && sinon.deepEqual(margs, args.slice(0, margs.length))) { return !strict || margs.length == args.length; } }, printf: function (format) { var spy = this; var args = slice.call(arguments, 1); var formatter; return (format || "").replace(/%(.)/g, function (match, specifyer) { formatter = spyApi.formatters[specifyer]; if (typeof formatter == "function") { return formatter.call(null, spy, args); } else if (!isNaN(parseInt(specifyer), 10)) { return sinon.format(args[specifyer - 1]); } return "%" + specifyer; }); } }; function delegateToCalls(method, matchAny, actual, notCalled) { spyApi[method] = function () { if (!this.called) { if (notCalled) { return notCalled.apply(this, arguments); } return false; } var currentCall; var matches = 0; for (var i = 0, l = this.callCount; i < l; i += 1) { currentCall = this.getCall(i); if (currentCall[actual || method].apply(currentCall, arguments)) { matches += 1; if (matchAny) { return true; } } } return matches === this.callCount; }; } delegateToCalls("calledOn", true); delegateToCalls("alwaysCalledOn", false, "calledOn"); delegateToCalls("calledWith", true); delegateToCalls("calledWithMatch", true); delegateToCalls("alwaysCalledWith", false, "calledWith"); delegateToCalls("alwaysCalledWithMatch", false, "calledWithMatch"); delegateToCalls("calledWithExactly", true); delegateToCalls("alwaysCalledWithExactly", false, "calledWithExactly"); delegateToCalls("neverCalledWith", false, "notCalledWith", function () { return true; }); delegateToCalls("neverCalledWithMatch", false, "notCalledWithMatch", function () { return true; }); delegateToCalls("threw", true); delegateToCalls("alwaysThrew", false, "threw"); delegateToCalls("returned", true); delegateToCalls("alwaysReturned", false, "returned"); delegateToCalls("calledWithNew", true); delegateToCalls("alwaysCalledWithNew", false, "calledWithNew"); delegateToCalls("callArg", false, "callArgWith", function () { throw new Error(this.toString() + " cannot call arg since it was not yet invoked."); }); spyApi.callArgWith = spyApi.callArg; delegateToCalls("callArgOn", false, "callArgOnWith", function () { throw new Error(this.toString() + " cannot call arg since it was not yet invoked."); }); spyApi.callArgOnWith = spyApi.callArgOn; delegateToCalls("yield", false, "yield", function () { throw new Error(this.toString() + " cannot yield since it was not yet invoked."); }); // "invokeCallback" is an alias for "yield" since "yield" is invalid in strict mode. spyApi.invokeCallback = spyApi.yield; delegateToCalls("yieldOn", false, "yieldOn", function () { throw new Error(this.toString() + " cannot yield since it was not yet invoked."); }); delegateToCalls("yieldTo", false, "yieldTo", function (property) { throw new Error(this.toString() + " cannot yield to '" + property + "' since it was not yet invoked."); }); delegateToCalls("yieldToOn", false, "yieldToOn", function (property) { throw new Error(this.toString() + " cannot yield to '" + property + "' since it was not yet invoked."); }); spyApi.formatters = { "c": function (spy) { return sinon.timesInWords(spy.callCount); }, "n": function (spy) { return spy.toString(); }, "C": function (spy) { var calls = []; for (var i = 0, l = spy.callCount; i < l; ++i) { var stringifiedCall = " " + spy.getCall(i).toString(); if (/\n/.test(calls[i - 1])) { stringifiedCall = "\n" + stringifiedCall; } push.call(calls, stringifiedCall); } return calls.length > 0 ? "\n" + calls.join("\n") : ""; }, "t": function (spy) { var objects = []; for (var i = 0, l = spy.callCount; i < l; ++i) { push.call(objects, sinon.format(spy.thisValues[i])); } return objects.join(", "); }, "*": function (spy, args) { var formatted = []; for (var i = 0, l = args.length; i < l; ++i) { push.call(formatted, sinon.format(args[i])); } return formatted.join(", "); } }; sinon.extend(spy, spyApi); spy.spyCall = sinon.spyCall; if (commonJSModule) { module.exports = spy; } else { sinon.spy = spy; } }(typeof sinon == "object" && sinon || null)); /** * @depend ../sinon.js * @depend spy.js */ /*jslint eqeqeq: false, onevar: false*/ /*global module, require, sinon*/ /** * Stub functions * * @author Christian Johansen (christian@cjohansen.no) * @license BSD * * Copyright (c) 2010-2013 Christian Johansen */ (function (sinon) { var commonJSModule = typeof module == "object" && typeof require == "function"; if (!sinon && commonJSModule) { sinon = require("../sinon"); } if (!sinon) { return; } function stub(object, property, func) { if (!!func && typeof func != "function") { throw new TypeError("Custom stub should be function"); } var wrapper; if (func) { wrapper = sinon.spy && sinon.spy.create ? sinon.spy.create(func) : func; } else { wrapper = stub.create(); } if (!object && !property) { return sinon.stub.create(); } if (!property && !!object && typeof object == "object") { for (var prop in object) { if (typeof object[prop] === "function") { stub(object, prop); } } return object; } return sinon.wrapMethod(object, property, wrapper); } function getChangingValue(stub, property) { var index = stub.callCount - 1; var values = stub[property]; var prop = index in values ? values[index] : values[values.length - 1]; stub[property + "Last"] = prop; return prop; } function getCallback(stub, args) { var callArgAt = getChangingValue(stub, "callArgAts"); if (callArgAt < 0) { var callArgProp = getChangingValue(stub, "callArgProps"); for (var i = 0, l = args.length; i < l; ++i) { if (!callArgProp && typeof args[i] == "function") { return args[i]; } if (callArgProp && args[i] && typeof args[i][callArgProp] == "function") { return args[i][callArgProp]; } } return null; } return args[callArgAt]; } var join = Array.prototype.join; function getCallbackError(stub, func, args) { if (stub.callArgAtsLast < 0) { var msg; if (stub.callArgPropsLast) { msg = sinon.functionName(stub) + " expected to yield to '" + stub.callArgPropsLast + "', but no object with such a property was passed." } else { msg = sinon.functionName(stub) + " expected to yield, but no callback was passed." } if (args.length > 0) { msg += " Received [" + join.call(args, ", ") + "]"; } return msg; } return "argument at index " + stub.callArgAtsLast + " is not a function: " + func; } var nextTick = (function () { if (typeof process === "object" && typeof process.nextTick === "function") { return process.nextTick; } else if (typeof setImmediate === "function") { return setImmediate; } else { return function (callback) { setTimeout(callback, 0); }; } })(); function callCallback(stub, args) { if (stub.callArgAts.length > 0) { var func = getCallback(stub, args); if (typeof func != "function") { throw new TypeError(getCallbackError(stub, func, args)); } var callbackArguments = getChangingValue(stub, "callbackArguments"); var callbackContext = getChangingValue(stub, "callbackContexts"); if (stub.callbackAsync) { nextTick(function() { func.apply(callbackContext, callbackArguments); }); } else { func.apply(callbackContext, callbackArguments); } } } var uuid = 0; sinon.extend(stub, (function () { var slice = Array.prototype.slice, proto; function throwsException(error, message) { if (typeof error == "string") { this.exception = new Error(message || ""); this.exception.name = error; } else if (!error) { this.exception = new Error("Error"); } else { this.exception = error; } return this; } proto = { create: function create() { var functionStub = function () { callCallback(functionStub, arguments); if (functionStub.exception) { throw functionStub.exception; } else if (typeof functionStub.returnArgAt == 'number') { return arguments[functionStub.returnArgAt]; } else if (functionStub.returnThis) { return this; } return functionStub.returnValue; }; functionStub.id = "stub#" + uuid++; var orig = functionStub; functionStub = sinon.spy.create(functionStub); functionStub.func = orig; functionStub.callArgAts = []; functionStub.callbackArguments = []; functionStub.callbackContexts = []; functionStub.callArgProps = []; sinon.extend(functionStub, stub); functionStub._create = sinon.stub.create; functionStub.displayName = "stub"; functionStub.toString = sinon.functionToString; return functionStub; }, resetBehavior: function () { var i; this.callArgAts = []; this.callbackArguments = []; this.callbackContexts = []; this.callArgProps = []; delete this.returnValue; delete this.returnArgAt; this.returnThis = false; if (this.fakes) { for (i = 0; i < this.fakes.length; i++) { this.fakes[i].resetBehavior(); } } }, returns: function returns(value) { this.returnValue = value; return this; }, returnsArg: function returnsArg(pos) { if (typeof pos != "number") { throw new TypeError("argument index is not number"); } this.returnArgAt = pos; return this; }, returnsThis: function returnsThis() { this.returnThis = true; return this; }, "throws": throwsException, throwsException: throwsException, callsArg: function callsArg(pos) { if (typeof pos != "number") { throw new TypeError("argument index is not number"); } this.callArgAts.push(pos); this.callbackArguments.push([]); this.callbackContexts.push(undefined); this.callArgProps.push(undefined); return this; }, callsArgOn: function callsArgOn(pos, context) { if (typeof pos != "number") { throw new TypeError("argument index is not number"); } if (typeof context != "object") { throw new TypeError("argument context is not an object"); } this.callArgAts.push(pos); this.callbackArguments.push([]); this.callbackContexts.push(context); this.callArgProps.push(undefined); return this; }, callsArgWith: function callsArgWith(pos) { if (typeof pos != "number") { throw new TypeError("argument index is not number"); } this.callArgAts.push(pos); this.callbackArguments.push(slice.call(arguments, 1)); this.callbackContexts.push(undefined); this.callArgProps.push(undefined); return this; }, callsArgOnWith: function callsArgWith(pos, context) { if (typeof pos != "number") { throw new TypeError("argument index is not number"); } if (typeof context != "object") { throw new TypeError("argument context is not an object"); } this.callArgAts.push(pos); this.callbackArguments.push(slice.call(arguments, 2)); this.callbackContexts.push(context); this.callArgProps.push(undefined); return this; }, yields: function () { this.callArgAts.push(-1); this.callbackArguments.push(slice.call(arguments, 0)); this.callbackContexts.push(undefined); this.callArgProps.push(undefined); return this; }, yieldsOn: function (context) { if (typeof context != "object") { throw new TypeError("argument context is not an object"); } this.callArgAts.push(-1); this.callbackArguments.push(slice.call(arguments, 1)); this.callbackContexts.push(context); this.callArgProps.push(undefined); return this; }, yieldsTo: function (prop) { this.callArgAts.push(-1); this.callbackArguments.push(slice.call(arguments, 1)); this.callbackContexts.push(undefined); this.callArgProps.push(prop); return this; }, yieldsToOn: function (prop, context) { if (typeof context != "object") { throw new TypeError("argument context is not an object"); } this.callArgAts.push(-1); this.callbackArguments.push(slice.call(arguments, 2)); this.callbackContexts.push(context); this.callArgProps.push(prop); return this; } }; // create asynchronous versions of callsArg* and yields* methods for (var method in proto) { // need to avoid creating anotherasync versions of the newly added async methods if (proto.hasOwnProperty(method) && method.match(/^(callsArg|yields|thenYields$)/) && !method.match(/Async/)) { proto[method + 'Async'] = (function (syncFnName) { return function () { this.callbackAsync = true; return this[syncFnName].apply(this, arguments); }; })(method); } } return proto; }())); if (commonJSModule) { module.exports = stub; } else { sinon.stub = stub; } }(typeof sinon == "object" && sinon || null)); /** * @depend ../sinon.js * @depend stub.js */ /*jslint eqeqeq: false, onevar: false, nomen: false*/ /*global module, require, sinon*/ /** * Mock functions. * * @author Christian Johansen (christian@cjohansen.no) * @license BSD * * Copyright (c) 2010-2013 Christian Johansen */ (function (sinon) { var commonJSModule = typeof module == "object" && typeof require == "function"; var push = [].push; if (!sinon && commonJSModule) { sinon = require("../sinon"); } if (!sinon) { return; } function mock(object) { if (!object) { return sinon.expectation.create("Anonymous mock"); } return mock.create(object); } sinon.mock = mock; sinon.extend(mock, (function () { function each(collection, callback) { if (!collection) { return; } for (var i = 0, l = collection.length; i < l; i += 1) { callback(collection[i]); } } return { create: function create(object) { if (!object) { throw new TypeError("object is null"); } var mockObject = sinon.extend({}, mock); mockObject.object = object; delete mockObject.create; return mockObject; }, expects: function expects(method) { if (!method) { throw new TypeError("method is falsy"); } if (!this.expectations) { this.expectations = {}; this.proxies = []; } if (!this.expectations[method]) { this.expectations[method] = []; var mockObject = this; sinon.wrapMethod(this.object, method, function () { return mockObject.invokeMethod(method, this, arguments); }); push.call(this.proxies, method); } var expectation = sinon.expectation.create(method); push.call(this.expectations[method], expectation); return expectation; }, restore: function restore() { var object = this.object; each(this.proxies, function (proxy) { if (typeof object[proxy].restore == "function") { object[proxy].restore(); } }); }, verify: function verify() { var expectations = this.expectations || {}; var messages = [], met = []; each(this.proxies, function (proxy) { each(expectations[proxy], function (expectation) { if (!expectation.met()) { push.call(messages, expectation.toString()); } else { push.call(met, expectation.toString()); } }); }); this.restore(); if (messages.length > 0) { sinon.expectation.fail(messages.concat(met).join("\n")); } else { sinon.expectation.pass(messages.concat(met).join("\n")); } return true; }, invokeMethod: function invokeMethod(method, thisValue, args) { var expectations = this.expectations && this.expectations[method]; var length = expectations && expectations.length || 0, i; for (i = 0; i < length; i += 1) { if (!expectations[i].met() && expectations[i].allowsCall(thisValue, args)) { return expectations[i].apply(thisValue, args); } } var messages = [], available, exhausted = 0; for (i = 0; i < length; i += 1) { if (expectations[i].allowsCall(thisValue, args)) { available = available || expectations[i]; } else { exhausted += 1; } push.call(messages, " " + expectations[i].toString()); } if (exhausted === 0) { return available.apply(thisValue, args); } messages.unshift("Unexpected call: " + sinon.spyCall.toString.call({ proxy: method, args: args })); sinon.expectation.fail(messages.join("\n")); } }; }())); var times = sinon.timesInWords; sinon.expectation = (function () { var slice = Array.prototype.slice; var _invoke = sinon.spy.invoke; function callCountInWords(callCount) { if (callCount == 0) { return "never called"; } else { return "called " + times(callCount); } } function expectedCallCountInWords(expectation) { var min = expectation.minCalls; var max = expectation.maxCalls; if (typeof min == "number" && typeof max == "number") { var str = times(min); if (min != max) { str = "at least " + str + " and at most " + times(max); } return str; } if (typeof min == "number") { return "at least " + times(min); } return "at most " + times(max); } function receivedMinCalls(expectation) { var hasMinLimit = typeof expectation.minCalls == "number"; return !hasMinLimit || expectation.callCount >= expectation.minCalls; } function receivedMaxCalls(expectation) { if (typeof expectation.maxCalls != "number") { return false; } return expectation.callCount == expectation.maxCalls; } return { minCalls: 1, maxCalls: 1, create: function create(methodName) { var expectation = sinon.extend(sinon.stub.create(), sinon.expectation); delete expectation.create; expectation.method = methodName; return expectation; }, invoke: function invoke(func, thisValue, args) { this.verifyCallAllowed(thisValue, args); return _invoke.apply(this, arguments); }, atLeast: function atLeast(num) { if (typeof num != "number") { throw new TypeError("'" + num + "' is not number"); } if (!this.limitsSet) { this.maxCalls = null; this.limitsSet = true; } this.minCalls = num; return this; }, atMost: function atMost(num) { if (typeof num != "number") { throw new TypeError("'" + num + "' is not number"); } if (!this.limitsSet) { this.minCalls = null; this.limitsSet = true; } this.maxCalls = num; return this; }, never: function never() { return this.exactly(0); }, once: function once() { return this.exactly(1); }, twice: function twice() { return this.exactly(2); }, thrice: function thrice() { return this.exactly(3); }, exactly: function exactly(num) { if (typeof num != "number") { throw new TypeError("'" + num + "' is not a number"); } this.atLeast(num); return this.atMost(num); }, met: function met() { return !this.failed && receivedMinCalls(this); }, verifyCallAllowed: function verifyCallAllowed(thisValue, args) { if (receivedMaxCalls(this)) { this.failed = true; sinon.expectation.fail(this.method + " already called " + times(this.maxCalls)); } if ("expectedThis" in this && this.expectedThis !== thisValue) { sinon.expectation.fail(this.method + " called with " + thisValue + " as thisValue, expected " + this.expectedThis); } if (!("expectedArguments" in this)) { return; } if (!args) { sinon.expectation.fail(this.method + " received no arguments, expected " + sinon.format(this.expectedArguments)); } if (args.length < this.expectedArguments.length) { sinon.expectation.fail(this.method + " received too few arguments (" + sinon.format(args) + "), expected " + sinon.format(this.expectedArguments)); } if (this.expectsExactArgCount && args.length != this.expectedArguments.length) { sinon.expectation.fail(this.method + " received too many arguments (" + sinon.format(args) + "), expected " + sinon.format(this.expectedArguments)); } for (var i = 0, l = this.expectedArguments.length; i < l; i += 1) { if (!sinon.deepEqual(this.expectedArguments[i], args[i])) { sinon.expectation.fail(this.method + " received wrong arguments " + sinon.format(args) + ", expected " + sinon.format(this.expectedArguments)); } } }, allowsCall: function allowsCall(thisValue, args) { if (this.met() && receivedMaxCalls(this)) { return false; } if ("expectedThis" in this && this.expectedThis !== thisValue) { return false; } if (!("expectedArguments" in this)) { return true; } args = args || []; if (args.length < this.expectedArguments.length) { return false; } if (this.expectsExactArgCount && args.length != this.expectedArguments.length) { return false; } for (var i = 0, l = this.expectedArguments.length; i < l; i += 1) { if (!sinon.deepEqual(this.expectedArguments[i], args[i])) { return false; } } return true; }, withArgs: function withArgs() { this.expectedArguments = slice.call(arguments); return this; }, withExactArgs: function withExactArgs() { this.withArgs.apply(this, arguments); this.expectsExactArgCount = true; return this; }, on: function on(thisValue) { this.expectedThis = thisValue; return this; }, toString: function () { var args = (this.expectedArguments || []).slice(); if (!this.expectsExactArgCount) { push.call(args, "[...]"); } var callStr = sinon.spyCall.toString.call({ proxy: this.method || "anonymous mock expectation", args: args }); var message = callStr.replace(", [...", "[, ...") + " " + expectedCallCountInWords(this); if (this.met()) { return "Expectation met: " + message; } return "Expected " + message + " (" + callCountInWords(this.callCount) + ")"; }, verify: function verify() { if (!this.met()) { sinon.expectation.fail(this.toString()); } else { sinon.expectation.pass(this.toString()); } return true; }, pass: function(message) { sinon.assert.pass(message); }, fail: function (message) { var exception = new Error(message); exception.name = "ExpectationError"; throw exception; } }; }()); if (commonJSModule) { module.exports = mock; } else { sinon.mock = mock; } }(typeof sinon == "object" && sinon || null)); /** * @depend ../sinon.js * @depend stub.js * @depend mock.js */ /*jslint eqeqeq: false, onevar: false, forin: true*/ /*global module, require, sinon*/ /** * Collections of stubs, spies and mocks. * * @author Christian Johansen (christian@cjohansen.no) * @license BSD * * Copyright (c) 2010-2013 Christian Johansen */ (function (sinon) { var commonJSModule = typeof module == "object" && typeof require == "function"; var push = [].push; var hasOwnProperty = Object.prototype.hasOwnProperty; if (!sinon && commonJSModule) { sinon = require("../sinon"); } if (!sinon) { return; } function getFakes(fakeCollection) { if (!fakeCollection.fakes) { fakeCollection.fakes = []; } return fakeCollection.fakes; } function each(fakeCollection, method) { var fakes = getFakes(fakeCollection); for (var i = 0, l = fakes.length; i < l; i += 1) { if (typeof fakes[i][method] == "function") { fakes[i][method](); } } } function compact(fakeCollection) { var fakes = getFakes(fakeCollection); var i = 0; while (i < fakes.length) { fakes.splice(i, 1); } } var collection = { verify: function resolve() { each(this, "verify"); }, restore: function restore() { each(this, "restore"); compact(this); }, verifyAndRestore: function verifyAndRestore() { var exception; try { this.verify(); } catch (e) { exception = e; } this.restore(); if (exception) { throw exception; } }, add: function add(fake) { push.call(getFakes(this), fake); return fake; }, spy: function spy() { return this.add(sinon.spy.apply(sinon, arguments)); }, stub: function stub(object, property, value) { if (property) { var original = object[property]; if (typeof original != "function") { if (!hasOwnProperty.call(object, property)) { throw new TypeError("Cannot stub non-existent own property " + property); } object[property] = value; return this.add({ restore: function () { object[property] = original; } }); } } if (!property && !!object && typeof object == "object") { var stubbedObj = sinon.stub.apply(sinon, arguments); for (var prop in stubbedObj) { if (typeof stubbedObj[prop] === "function") { this.add(stubbedObj[prop]); } } return stubbedObj; } return this.add(sinon.stub.apply(sinon, arguments)); }, mock: function mock() { return this.add(sinon.mock.apply(sinon, arguments)); }, inject: function inject(obj) { var col = this; obj.spy = function () { return col.spy.apply(col, arguments); }; obj.stub = function () { return col.stub.apply(col, arguments); }; obj.mock = function () { return col.mock.apply(col, arguments); }; return obj; } }; if (commonJSModule) { module.exports = collection; } else { sinon.collection = collection; } }(typeof sinon == "object" && sinon || null)); /*jslint eqeqeq: false, plusplus: false, evil: true, onevar: false, browser: true, forin: false*/ /*global module, require, window*/ /** * Fake timer API * setTimeout * setInterval * clearTimeout * clearInterval * tick * reset * Date * * Inspired by jsUnitMockTimeOut from JsUnit * * @author Christian Johansen (christian@cjohansen.no) * @license BSD * * Copyright (c) 2010-2013 Christian Johansen */ if (typeof sinon == "undefined") { var sinon = {}; } (function (global) { var id = 1; function addTimer(args, recurring) { if (args.length === 0) { throw new Error("Function requires at least 1 parameter"); } var toId = id++; var delay = args[1] || 0; if (!this.timeouts) { this.timeouts = {}; } this.timeouts[toId] = { id: toId, func: args[0], callAt: this.now + delay, invokeArgs: Array.prototype.slice.call(args, 2) }; if (recurring === true) { this.timeouts[toId].interval = delay; } return toId; } function parseTime(str) { if (!str) { return 0; } var strings = str.split(":"); var l = strings.length, i = l; var ms = 0, parsed; if (l > 3 || !/^(\d\d:){0,2}\d\d?$/.test(str)) { throw new Error("tick only understands numbers and 'h:m:s'"); } while (i--) { parsed = parseInt(strings[i], 10); if (parsed >= 60) { throw new Error("Invalid time " + str); } ms += parsed * Math.pow(60, (l - i - 1)); } return ms * 1000; } function createObject(object) { var newObject; if (Object.create) { newObject = Object.create(object); } else { var F = function () {}; F.prototype = object; newObject = new F(); } newObject.Date.clock = newObject; return newObject; } sinon.clock = { now: 0, create: function create(now) { var clock = createObject(this); if (typeof now == "number") { clock.now = now; } if (!!now && typeof now == "object") { throw new TypeError("now should be milliseconds since UNIX epoch"); } return clock; }, setTimeout: function setTimeout(callback, timeout) { return addTimer.call(this, arguments, false); }, clearTimeout: function clearTimeout(timerId) { if (!this.timeouts) { this.timeouts = []; } if (timerId in this.timeouts) { delete this.timeouts[timerId]; } }, setInterval: function setInterval(callback, timeout) { return addTimer.call(this, arguments, true); }, clearInterval: function clearInterval(timerId) { this.clearTimeout(timerId); }, tick: function tick(ms) { ms = typeof ms == "number" ? ms : parseTime(ms); var tickFrom = this.now, tickTo = this.now + ms, previous = this.now; var timer = this.firstTimerInRange(tickFrom, tickTo); var firstException; while (timer && tickFrom <= tickTo) { if (this.timeouts[timer.id]) { tickFrom = this.now = timer.callAt; try { this.callTimer(timer); } catch (e) { firstException = firstException || e; } } timer = this.firstTimerInRange(previous, tickTo); previous = tickFrom; } this.now = tickTo; if (firstException) { throw firstException; } return this.now; }, firstTimerInRange: function (from, to) { var timer, smallest, originalTimer; for (var id in this.timeouts) { if (this.timeouts.hasOwnProperty(id)) { if (this.timeouts[id].callAt < from || this.timeouts[id].callAt > to) { continue; } if (!smallest || this.timeouts[id].callAt < smallest) { originalTimer = this.timeouts[id]; smallest = this.timeouts[id].callAt; timer = { func: this.timeouts[id].func, callAt: this.timeouts[id].callAt, interval: this.timeouts[id].interval, id: this.timeouts[id].id, invokeArgs: this.timeouts[id].invokeArgs }; } } } return timer || null; }, callTimer: function (timer) { if (typeof timer.interval == "number") { this.timeouts[timer.id].callAt += timer.interval; } else { delete this.timeouts[timer.id]; } try { if (typeof timer.func == "function") { timer.func.apply(null, timer.invokeArgs); } else { eval(timer.func); } } catch (e) { var exception = e; } if (!this.timeouts[timer.id]) { if (exception) { throw exception; } return; } if (exception) { throw exception; } }, reset: function reset() { this.timeouts = {}; }, Date: (function () { var NativeDate = Date; function ClockDate(year, month, date, hour, minute, second, ms) { // Defensive and verbose to avoid potential harm in passing // explicit undefined when user does not pass argument switch (arguments.length) { case 0: return new NativeDate(ClockDate.clock.now); case 1: return new NativeDate(year); case 2: return new NativeDate(year, month); case 3: return new NativeDate(year, month, date); case 4: return new NativeDate(year, month, date, hour); case 5: return new NativeDate(year, month, date, hour, minute); case 6: return new NativeDate(year, month, date, hour, minute, second); default: return new NativeDate(year, month, date, hour, minute, second, ms); } } return mirrorDateProperties(ClockDate, NativeDate); }()) }; function mirrorDateProperties(target, source) { if (source.now) { target.now = function now() { return target.clock.now; }; } else { delete target.now; } if (source.toSource) { target.toSource = function toSource() { return source.toSource(); }; } else { delete target.toSource; } target.toString = function toString() { return source.toString(); }; target.prototype = source.prototype; target.parse = source.parse; target.UTC = source.UTC; target.prototype.toUTCString = source.prototype.toUTCString; return target; } var methods = ["Date", "setTimeout", "setInterval", "clearTimeout", "clearInterval"]; function restore() { var method; for (var i = 0, l = this.methods.length; i < l; i++) { method = this.methods[i]; if (global[method].hadOwnProperty) { global[method] = this["_" + method]; } else { delete global[method]; } } // Prevent multiple executions which will completely remove these props this.methods = []; } function stubGlobal(method, clock) { clock[method].hadOwnProperty = Object.prototype.hasOwnProperty.call(global, method); clock["_" + method] = global[method]; if (method == "Date") { var date = mirrorDateProperties(clock[method], global[method]); global[method] = date; } else { global[method] = function () { return clock[method].apply(clock, arguments); }; for (var prop in clock[method]) { if (clock[method].hasOwnProperty(prop)) { global[method][prop] = clock[method][prop]; } } } global[method].clock = clock; } sinon.useFakeTimers = function useFakeTimers(now) { var clock = sinon.clock.create(now); clock.restore = restore; clock.methods = Array.prototype.slice.call(arguments, typeof now == "number" ? 1 : 0); if (clock.methods.length === 0) { clock.methods = methods; } for (var i = 0, l = clock.methods.length; i < l; i++) { stubGlobal(clock.methods[i], clock); } return clock; }; }(typeof global != "undefined" && typeof global !== "function" ? global : this)); sinon.timers = { setTimeout: setTimeout, clearTimeout: clearTimeout, setInterval: setInterval, clearInterval: clearInterval, Date: Date }; if (typeof module == "object" && typeof require == "function") { module.exports = sinon; } /*jslint eqeqeq: false, onevar: false*/ /*global sinon, module, require, ActiveXObject, XMLHttpRequest, DOMParser*/ /** * Minimal Event interface implementation * * Original implementation by Sven Fuchs: https://gist.github.com/995028 * Modifications and tests by Christian Johansen. * * @author Sven Fuchs (svenfuchs@artweb-design.de) * @author Christian Johansen (christian@cjohansen.no) * @license BSD * * Copyright (c) 2011 Sven Fuchs, Christian Johansen */ if (typeof sinon == "undefined") { this.sinon = {}; } (function () { var push = [].push; sinon.Event = function Event(type, bubbles, cancelable, target) { this.initEvent(type, bubbles, cancelable, target); }; sinon.Event.prototype = { initEvent: function(type, bubbles, cancelable, target) { this.type = type; this.bubbles = bubbles; this.cancelable = cancelable; this.target = target; }, stopPropagation: function () {}, preventDefault: function () { this.defaultPrevented = true; } }; sinon.EventTarget = { addEventListener: function addEventListener(event, listener, useCapture) { this.eventListeners = this.eventListeners || {}; this.eventListeners[event] = this.eventListeners[event] || []; push.call(this.eventListeners[event], listener); }, removeEventListener: function removeEventListener(event, listener, useCapture) { var listeners = this.eventListeners && this.eventListeners[event] || []; for (var i = 0, l = listeners.length; i < l; ++i) { if (listeners[i] == listener) { return listeners.splice(i, 1); } } }, dispatchEvent: function dispatchEvent(event) { var type = event.type; var listeners = this.eventListeners && this.eventListeners[type] || []; for (var i = 0; i < listeners.length; i++) { if (typeof listeners[i] == "function") { listeners[i].call(this, event); } else { listeners[i].handleEvent(event); } } return !!event.defaultPrevented; } }; }()); /** * @depend ../../sinon.js * @depend event.js */ /*jslint eqeqeq: false, onevar: false*/ /*global sinon, module, require, ActiveXObject, XMLHttpRequest, DOMParser*/ /** * Fake XMLHttpRequest object * * @author Christian Johansen (christian@cjohansen.no) * @license BSD * * Copyright (c) 2010-2013 Christian Johansen */ if (typeof sinon == "undefined") { this.sinon = {}; } sinon.xhr = { XMLHttpRequest: this.XMLHttpRequest }; // wrapper for global (function(global) { var xhr = sinon.xhr; xhr.GlobalXMLHttpRequest = global.XMLHttpRequest; xhr.GlobalActiveXObject = global.ActiveXObject; xhr.supportsActiveX = typeof xhr.GlobalActiveXObject != "undefined"; xhr.supportsXHR = typeof xhr.GlobalXMLHttpRequest != "undefined"; xhr.workingXHR = xhr.supportsXHR ? xhr.GlobalXMLHttpRequest : xhr.supportsActiveX ? function() { return new xhr.GlobalActiveXObject("MSXML2.XMLHTTP.3.0") } : false; /*jsl:ignore*/ var unsafeHeaders = { "Accept-Charset": true, "Accept-Encoding": true, "Connection": true, "Content-Length": true, "Cookie": true, "Cookie2": true, "Content-Transfer-Encoding": true, "Date": true, "Expect": true, "Host": true, "Keep-Alive": true, "Referer": true, "TE": true, "Trailer": true, "Transfer-Encoding": true, "Upgrade": true, "User-Agent": true, "Via": true }; /*jsl:end*/ function FakeXMLHttpRequest() { this.readyState = FakeXMLHttpRequest.UNSENT; this.requestHeaders = {}; this.requestBody = null; this.status = 0; this.statusText = ""; var xhr = this; var events = ["loadstart", "load", "abort", "loadend"]; function addEventListener(eventName) { xhr.addEventListener(eventName, function (event) { var listener = xhr["on" + eventName]; if (listener && typeof listener == "function") { listener(event); } }); } for (var i = events.length - 1; i >= 0; i--) { addEventListener(events[i]); } if (typeof FakeXMLHttpRequest.onCreate == "function") { FakeXMLHttpRequest.onCreate(this); } } function verifyState(xhr) { if (xhr.readyState !== FakeXMLHttpRequest.OPENED) { throw new Error("INVALID_STATE_ERR"); } if (xhr.sendFlag) { throw new Error("INVALID_STATE_ERR"); } } // filtering to enable a white-list version of Sinon FakeXhr, // where whitelisted requests are passed through to real XHR function each(collection, callback) { if (!collection) return; for (var i = 0, l = collection.length; i < l; i += 1) { callback(collection[i]); } } function some(collection, callback) { for (var index = 0; index < collection.length; index++) { if(callback(collection[index]) === true) return true; }; return false; } // largest arity in XHR is 5 - XHR#open var apply = function(obj,method,args) { switch(args.length) { case 0: return obj[method](); case 1: return obj[method](args[0]); case 2: return obj[method](args[0],args[1]); case 3: return obj[method](args[0],args[1],args[2]); case 4: return obj[method](args[0],args[1],args[2],args[3]); case 5: return obj[method](args[0],args[1],args[2],args[3],args[4]); }; }; FakeXMLHttpRequest.filters = []; FakeXMLHttpRequest.addFilter = function(fn) { this.filters.push(fn) }; var IE6Re = /MSIE 6/; FakeXMLHttpRequest.defake = function(fakeXhr,xhrArgs) { var xhr = new sinon.xhr.workingXHR(); each(["open","setRequestHeader","send","abort","getResponseHeader", "getAllResponseHeaders","addEventListener","overrideMimeType","removeEventListener"], function(method) { fakeXhr[method] = function() { return apply(xhr,method,arguments); }; }); var copyAttrs = function(args) { each(args, function(attr) { try { fakeXhr[attr] = xhr[attr] } catch(e) { if(!IE6Re.test(navigator.userAgent)) throw e; } }); }; var stateChange = function() { fakeXhr.readyState = xhr.readyState; if(xhr.readyState >= FakeXMLHttpRequest.HEADERS_RECEIVED) { copyAttrs(["status","statusText"]); } if(xhr.readyState >= FakeXMLHttpRequest.LOADING) { copyAttrs(["responseText"]); } if(xhr.readyState === FakeXMLHttpRequest.DONE) { copyAttrs(["responseXML"]); } if(fakeXhr.onreadystatechange) fakeXhr.onreadystatechange.call(fakeXhr); }; if(xhr.addEventListener) { for(var event in fakeXhr.eventListeners) { if(fakeXhr.eventListeners.hasOwnProperty(event)) { each(fakeXhr.eventListeners[event],function(handler) { xhr.addEventListener(event, handler); }); } } xhr.addEventListener("readystatechange",stateChange); } else { xhr.onreadystatechange = stateChange; } apply(xhr,"open",xhrArgs); }; FakeXMLHttpRequest.useFilters = false; function verifyRequestSent(xhr) { if (xhr.readyState == FakeXMLHttpRequest.DONE) { throw new Error("Request done"); } } function verifyHeadersReceived(xhr) { if (xhr.async && xhr.readyState != FakeXMLHttpRequest.HEADERS_RECEIVED) { throw new Error("No headers received"); } } function verifyResponseBodyType(body) { if (typeof body != "string") { var error = new Error("Attempted to respond to fake XMLHttpRequest with " + body + ", which is not a string."); error.name = "InvalidBodyException"; throw error; } } sinon.extend(FakeXMLHttpRequest.prototype, sinon.EventTarget, { async: true, open: function open(method, url, async, username, password) { this.method = method; this.url = url; this.async = typeof async == "boolean" ? async : true; this.username = username; this.password = password; this.responseText = null; this.responseXML = null; this.requestHeaders = {}; this.sendFlag = false; if(sinon.FakeXMLHttpRequest.useFilters === true) { var xhrArgs = arguments; var defake = some(FakeXMLHttpRequest.filters,function(filter) { return filter.apply(this,xhrArgs) }); if (defake) { return sinon.FakeXMLHttpRequest.defake(this,arguments); } } this.readyStateChange(FakeXMLHttpRequest.OPENED); }, readyStateChange: function readyStateChange(state) { this.readyState = state; if (typeof this.onreadystatechange == "function") { try { this.onreadystatechange(); } catch (e) { sinon.logError("Fake XHR onreadystatechange handler", e); } } this.dispatchEvent(new sinon.Event("readystatechange")); switch (this.readyState) { case FakeXMLHttpRequest.DONE: this.dispatchEvent(new sinon.Event("load", false, false, this)); this.dispatchEvent(new sinon.Event("loadend", false, false, this)); break; } }, setRequestHeader: function setRequestHeader(header, value) { verifyState(this); if (unsafeHeaders[header] || /^(Sec-|Proxy-)/.test(header)) { throw new Error("Refused to set unsafe header \"" + header + "\""); } if (this.requestHeaders[header]) { this.requestHeaders[header] += "," + value; } else { this.requestHeaders[header] = value; } }, // Helps testing setResponseHeaders: function setResponseHeaders(headers) { this.responseHeaders = {}; for (var header in headers) { if (headers.hasOwnProperty(header)) { this.responseHeaders[header] = headers[header]; } } if (this.async) { this.readyStateChange(FakeXMLHttpRequest.HEADERS_RECEIVED); } else { this.readyState = FakeXMLHttpRequest.HEADERS_RECEIVED; } }, // Currently treats ALL data as a DOMString (i.e. no Document) send: function send(data) { verifyState(this); if (!/^(get|head)$/i.test(this.method)) { if (this.requestHeaders["Content-Type"]) { var value = this.requestHeaders["Content-Type"].split(";"); this.requestHeaders["Content-Type"] = value[0] + ";charset=utf-8"; } else { this.requestHeaders["Content-Type"] = "text/plain;charset=utf-8"; } this.requestBody = data; } this.errorFlag = false; this.sendFlag = this.async; this.readyStateChange(FakeXMLHttpRequest.OPENED); if (typeof this.onSend == "function") { this.onSend(this); } this.dispatchEvent(new sinon.Event("loadstart", false, false, this)); }, abort: function abort() { this.aborted = true; this.responseText = null; this.errorFlag = true; this.requestHeaders = {}; if (this.readyState > sinon.FakeXMLHttpRequest.UNSENT && this.sendFlag) { this.readyStateChange(sinon.FakeXMLHttpRequest.DONE); this.sendFlag = false; } this.readyState = sinon.FakeXMLHttpRequest.UNSENT; this.dispatchEvent(new sinon.Event("abort", false, false, this)); if (typeof this.onerror === "function") { this.onerror(); } }, getResponseHeader: function getResponseHeader(header) { if (this.readyState < FakeXMLHttpRequest.HEADERS_RECEIVED) { return null; } if (/^Set-Cookie2?$/i.test(header)) { return null; } header = header.toLowerCase(); for (var h in this.responseHeaders) { if (h.toLowerCase() == header) { return this.responseHeaders[h]; } } return null; }, getAllResponseHeaders: function getAllResponseHeaders() { if (this.readyState < FakeXMLHttpRequest.HEADERS_RECEIVED) { return ""; } var headers = ""; for (var header in this.responseHeaders) { if (this.responseHeaders.hasOwnProperty(header) && !/^Set-Cookie2?$/i.test(header)) { headers += header + ": " + this.responseHeaders[header] + "\r\n"; } } return headers; }, setResponseBody: function setResponseBody(body) { verifyRequestSent(this); verifyHeadersReceived(this); verifyResponseBodyType(body); var chunkSize = this.chunkSize || 10; var index = 0; this.responseText = ""; do { if (this.async) { this.readyStateChange(FakeXMLHttpRequest.LOADING); } this.responseText += body.substring(index, index + chunkSize); index += chunkSize; } while (index < body.length); var type = this.getResponseHeader("Content-Type"); if (this.responseText && (!type || /(text\/xml)|(application\/xml)|(\+xml)/.test(type))) { try { this.responseXML = FakeXMLHttpRequest.parseXML(this.responseText); } catch (e) { // Unable to parse XML - no biggie } } if (this.async) { this.readyStateChange(FakeXMLHttpRequest.DONE); } else { this.readyState = FakeXMLHttpRequest.DONE; } }, respond: function respond(status, headers, body) { this.setResponseHeaders(headers || {}); this.status = typeof status == "number" ? status : 200; this.statusText = FakeXMLHttpRequest.statusCodes[this.status]; this.setResponseBody(body || ""); if (typeof this.onload === "function"){ this.onload(); } } }); sinon.extend(FakeXMLHttpRequest, { UNSENT: 0, OPENED: 1, HEADERS_RECEIVED: 2, LOADING: 3, DONE: 4 }); // Borrowed from JSpec FakeXMLHttpRequest.parseXML = function parseXML(text) { var xmlDoc; if (typeof DOMParser != "undefined") { var parser = new DOMParser(); xmlDoc = parser.parseFromString(text, "text/xml"); } else { xmlDoc = new ActiveXObject("Microsoft.XMLDOM"); xmlDoc.async = "false"; xmlDoc.loadXML(text); } return xmlDoc; }; FakeXMLHttpRequest.statusCodes = { 100: "Continue", 101: "Switching Protocols", 200: "OK", 201: "Created", 202: "Accepted", 203: "Non-Authoritative Information", 204: "No Content", 205: "Reset Content", 206: "Partial Content", 300: "Multiple Choice", 301: "Moved Permanently", 302: "Found", 303: "See Other", 304: "Not Modified", 305: "Use Proxy", 307: "Temporary Redirect", 400: "Bad Request", 401: "Unauthorized", 402: "Payment Required", 403: "Forbidden", 404: "Not Found", 405: "Method Not Allowed", 406: "Not Acceptable", 407: "Proxy Authentication Required", 408: "Request Timeout", 409: "Conflict", 410: "Gone", 411: "Length Required", 412: "Precondition Failed", 413: "Request Entity Too Large", 414: "Request-URI Too Long", 415: "Unsupported Media Type", 416: "Requested Range Not Satisfiable", 417: "Expectation Failed", 422: "Unprocessable Entity", 500: "Internal Server Error", 501: "Not Implemented", 502: "Bad Gateway", 503: "Service Unavailable", 504: "Gateway Timeout", 505: "HTTP Version Not Supported" }; sinon.useFakeXMLHttpRequest = function () { sinon.FakeXMLHttpRequest.restore = function restore(keepOnCreate) { if (xhr.supportsXHR) { global.XMLHttpRequest = xhr.GlobalXMLHttpRequest; } if (xhr.supportsActiveX) { global.ActiveXObject = xhr.GlobalActiveXObject; } delete sinon.FakeXMLHttpRequest.restore; if (keepOnCreate !== true) { delete sinon.FakeXMLHttpRequest.onCreate; } }; if (xhr.supportsXHR) { global.XMLHttpRequest = sinon.FakeXMLHttpRequest; } if (xhr.supportsActiveX) { global.ActiveXObject = function ActiveXObject(objId) { if (objId == "Microsoft.XMLHTTP" || /^Msxml2\.XMLHTTP/i.test(objId)) { return new sinon.FakeXMLHttpRequest(); } return new xhr.GlobalActiveXObject(objId); }; } return sinon.FakeXMLHttpRequest; }; sinon.FakeXMLHttpRequest = FakeXMLHttpRequest; })(this); if (typeof module == "object" && typeof require == "function") { module.exports = sinon; } /** * @depend fake_xml_http_request.js */ /*jslint eqeqeq: false, onevar: false, regexp: false, plusplus: false*/ /*global module, require, window*/ /** * The Sinon "server" mimics a web server that receives requests from * sinon.FakeXMLHttpRequest and provides an API to respond to those requests, * both synchronously and asynchronously. To respond synchronuously, canned * answers have to be provided upfront. * * @author Christian Johansen (christian@cjohansen.no) * @license BSD * * Copyright (c) 2010-2013 Christian Johansen */ if (typeof sinon == "undefined") { var sinon = {}; } sinon.fakeServer = (function () { var push = [].push; function F() {} function create(proto) { F.prototype = proto; return new F(); } function responseArray(handler) { var response = handler; if (Object.prototype.toString.call(handler) != "[object Array]") { response = [200, {}, handler]; } if (typeof response[2] != "string") { throw new TypeError("Fake server response body should be string, but was " + typeof response[2]); } return response; } var wloc = typeof window !== "undefined" ? window.location : {}; var rCurrLoc = new RegExp("^" + wloc.protocol + "//" + wloc.host); function matchOne(response, reqMethod, reqUrl) { var rmeth = response.method; var matchMethod = !rmeth || rmeth.toLowerCase() == reqMethod.toLowerCase(); var url = response.url; var matchUrl = !url || url == reqUrl || (typeof url.test == "function" && url.test(reqUrl)); return matchMethod && matchUrl; } function match(response, request) { var requestMethod = this.getHTTPMethod(request); var requestUrl = request.url; if (!/^https?:\/\//.test(requestUrl) || rCurrLoc.test(requestUrl)) { requestUrl = requestUrl.replace(rCurrLoc, ""); } if (matchOne(response, this.getHTTPMethod(request), requestUrl)) { if (typeof response.response == "function") { var ru = response.url; var args = [request].concat(!ru ? [] : requestUrl.match(ru).slice(1)); return response.response.apply(response, args); } return true; } return false; } function log(response, request) { var str; str = "Request:\n" + sinon.format(request) + "\n\n"; str += "Response:\n" + sinon.format(response) + "\n\n"; sinon.log(str); } return { create: function () { var server = create(this); this.xhr = sinon.useFakeXMLHttpRequest(); server.requests = []; this.xhr.onCreate = function (xhrObj) { server.addRequest(xhrObj); }; return server; }, addRequest: function addRequest(xhrObj) { var server = this; push.call(this.requests, xhrObj); xhrObj.onSend = function () { server.handleRequest(this); }; if (this.autoRespond && !this.responding) { setTimeout(function () { server.responding = false; server.respond(); }, this.autoRespondAfter || 10); this.responding = true; } }, getHTTPMethod: function getHTTPMethod(request) { if (this.fakeHTTPMethods && /post/i.test(request.method)) { var matches = (request.requestBody || "").match(/_method=([^\b;]+)/); return !!matches ? matches[1] : request.method; } return request.method; }, handleRequest: function handleRequest(xhr) { if (xhr.async) { if (!this.queue) { this.queue = []; } push.call(this.queue, xhr); } else { this.processRequest(xhr); } }, respondWith: function respondWith(method, url, body) { if (arguments.length == 1 && typeof method != "function") { this.response = responseArray(method); return; } if (!this.responses) { this.responses = []; } if (arguments.length == 1) { body = method; url = method = null; } if (arguments.length == 2) { body = url; url = method; method = null; } push.call(this.responses, { method: method, url: url, response: typeof body == "function" ? body : responseArray(body) }); }, respond: function respond() { if (arguments.length > 0) this.respondWith.apply(this, arguments); var queue = this.queue || []; var request; while(request = queue.shift()) { this.processRequest(request); } }, processRequest: function processRequest(request) { try { if (request.aborted) { return; } var response = this.response || [404, {}, ""]; if (this.responses) { for (var i = 0, l = this.responses.length; i < l; i++) { if (match.call(this, this.responses[i], request)) { response = this.responses[i].response; break; } } } if (request.readyState != 4) { log(response, request); request.respond(response[0], response[1], response[2]); } } catch (e) { sinon.logError("Fake server request processing", e); } }, restore: function restore() { return this.xhr.restore && this.xhr.restore.apply(this.xhr, arguments); } }; }()); if (typeof module == "object" && typeof require == "function") { module.exports = sinon; } /** * @depend fake_server.js * @depend fake_timers.js */ /*jslint browser: true, eqeqeq: false, onevar: false*/ /*global sinon*/ /** * Add-on for sinon.fakeServer that automatically handles a fake timer along with * the FakeXMLHttpRequest. The direct inspiration for this add-on is jQuery * 1.3.x, which does not use xhr object's onreadystatehandler at all - instead, * it polls the object for completion with setInterval. Dispite the direct * motivation, there is nothing jQuery-specific in this file, so it can be used * in any environment where the ajax implementation depends on setInterval or * setTimeout. * * @author Christian Johansen (christian@cjohansen.no) * @license BSD * * Copyright (c) 2010-2013 Christian Johansen */ (function () { function Server() {} Server.prototype = sinon.fakeServer; sinon.fakeServerWithClock = new Server(); sinon.fakeServerWithClock.addRequest = function addRequest(xhr) { if (xhr.async) { if (typeof setTimeout.clock == "object") { this.clock = setTimeout.clock; } else { this.clock = sinon.useFakeTimers(); this.resetClock = true; } if (!this.longestTimeout) { var clockSetTimeout = this.clock.setTimeout; var clockSetInterval = this.clock.setInterval; var server = this; this.clock.setTimeout = function (fn, timeout) { server.longestTimeout = Math.max(timeout, server.longestTimeout || 0); return clockSetTimeout.apply(this, arguments); }; this.clock.setInterval = function (fn, timeout) { server.longestTimeout = Math.max(timeout, server.longestTimeout || 0); return clockSetInterval.apply(this, arguments); }; } } return sinon.fakeServer.addRequest.call(this, xhr); }; sinon.fakeServerWithClock.respond = function respond() { var returnVal = sinon.fakeServer.respond.apply(this, arguments); if (this.clock) { this.clock.tick(this.longestTimeout || 0); this.longestTimeout = 0; if (this.resetClock) { this.clock.restore(); this.resetClock = false; } } return returnVal; }; sinon.fakeServerWithClock.restore = function restore() { if (this.clock) { this.clock.restore(); } return sinon.fakeServer.restore.apply(this, arguments); }; }()); /** * @depend ../sinon.js * @depend collection.js * @depend util/fake_timers.js * @depend util/fake_server_with_clock.js */ /*jslint eqeqeq: false, onevar: false, plusplus: false*/ /*global require, module*/ /** * Manages fake collections as well as fake utilities such as Sinon's * timers and fake XHR implementation in one convenient object. * * @author Christian Johansen (christian@cjohansen.no) * @license BSD * * Copyright (c) 2010-2013 Christian Johansen */ if (typeof module == "object" && typeof require == "function") { var sinon = require("../sinon"); sinon.extend(sinon, require("./util/fake_timers")); } (function () { var push = [].push; function exposeValue(sandbox, config, key, value) { if (!value) { return; } if (config.injectInto) { config.injectInto[key] = value; } else { push.call(sandbox.args, value); } } function prepareSandboxFromConfig(config) { var sandbox = sinon.create(sinon.sandbox); if (config.useFakeServer) { if (typeof config.useFakeServer == "object") { sandbox.serverPrototype = config.useFakeServer; } sandbox.useFakeServer(); } if (config.useFakeTimers) { if (typeof config.useFakeTimers == "object") { sandbox.useFakeTimers.apply(sandbox, config.useFakeTimers); } else { sandbox.useFakeTimers(); } } return sandbox; } sinon.sandbox = sinon.extend(sinon.create(sinon.collection), { useFakeTimers: function useFakeTimers() { this.clock = sinon.useFakeTimers.apply(sinon, arguments); return this.add(this.clock); }, serverPrototype: sinon.fakeServer, useFakeServer: function useFakeServer() { var proto = this.serverPrototype || sinon.fakeServer; if (!proto || !proto.create) { return null; } this.server = proto.create(); return this.add(this.server); }, inject: function (obj) { sinon.collection.inject.call(this, obj); if (this.clock) { obj.clock = this.clock; } if (this.server) { obj.server = this.server; obj.requests = this.server.requests; } return obj; }, create: function (config) { if (!config) { return sinon.create(sinon.sandbox); } var sandbox = prepareSandboxFromConfig(config); sandbox.args = sandbox.args || []; var prop, value, exposed = sandbox.inject({}); if (config.properties) { for (var i = 0, l = config.properties.length; i < l; i++) { prop = config.properties[i]; value = exposed[prop] || prop == "sandbox" && sandbox; exposeValue(sandbox, config, prop, value); } } else { exposeValue(sandbox, config, "sandbox", value); } return sandbox; } }); sinon.sandbox.useFakeXMLHttpRequest = sinon.sandbox.useFakeServer; if (typeof module == "object" && typeof require == "function") { module.exports = sinon.sandbox; } }()); /** * @depend ../sinon.js * @depend stub.js * @depend mock.js * @depend sandbox.js */ /*jslint eqeqeq: false, onevar: false, forin: true, plusplus: false*/ /*global module, require, sinon*/ /** * Test function, sandboxes fakes * * @author Christian Johansen (christian@cjohansen.no) * @license BSD * * Copyright (c) 2010-2013 Christian Johansen */ (function (sinon) { var commonJSModule = typeof module == "object" && typeof require == "function"; if (!sinon && commonJSModule) { sinon = require("../sinon"); } if (!sinon) { return; } function test(callback) { var type = typeof callback; if (type != "function") { throw new TypeError("sinon.test needs to wrap a test function, got " + type); } return function () { var config = sinon.getConfig(sinon.config); config.injectInto = config.injectIntoThis && this || config.injectInto; var sandbox = sinon.sandbox.create(config); var exception, result; var args = Array.prototype.slice.call(arguments).concat(sandbox.args); try { result = callback.apply(this, args); } catch (e) { exception = e; } if (typeof exception !== "undefined") { sandbox.restore(); throw exception; } else { sandbox.verifyAndRestore(); } return result; }; } test.config = { injectIntoThis: true, injectInto: null, properties: ["spy", "stub", "mock", "clock", "server", "requests"], useFakeTimers: true, useFakeServer: true }; if (commonJSModule) { module.exports = test; } else { sinon.test = test; } }(typeof sinon == "object" && sinon || null)); /** * @depend ../sinon.js * @depend test.js */ /*jslint eqeqeq: false, onevar: false, eqeqeq: false*/ /*global module, require, sinon*/ /** * Test case, sandboxes all test functions * * @author Christian Johansen (christian@cjohansen.no) * @license BSD * * Copyright (c) 2010-2013 Christian Johansen */ (function (sinon) { var commonJSModule = typeof module == "object" && typeof require == "function"; if (!sinon && commonJSModule) { sinon = require("../sinon"); } if (!sinon || !Object.prototype.hasOwnProperty) { return; } function createTest(property, setUp, tearDown) { return function () { if (setUp) { setUp.apply(this, arguments); } var exception, result; try { result = property.apply(this, arguments); } catch (e) { exception = e; } if (tearDown) { tearDown.apply(this, arguments); } if (exception) { throw exception; } return result; }; } function testCase(tests, prefix) { /*jsl:ignore*/ if (!tests || typeof tests != "object") { throw new TypeError("sinon.testCase needs an object with test functions"); } /*jsl:end*/ prefix = prefix || "test"; var rPrefix = new RegExp("^" + prefix); var methods = {}, testName, property, method; var setUp = tests.setUp; var tearDown = tests.tearDown; for (testName in tests) { if (tests.hasOwnProperty(testName)) { property = tests[testName]; if (/^(setUp|tearDown)$/.test(testName)) { continue; } if (typeof property == "function" && rPrefix.test(testName)) { method = property; if (setUp || tearDown) { method = createTest(property, setUp, tearDown); } methods[testName] = sinon.test(method); } else { methods[testName] = tests[testName]; } } } return methods; } if (commonJSModule) { module.exports = testCase; } else { sinon.testCase = testCase; } }(typeof sinon == "object" && sinon || null)); /** * @depend ../sinon.js * @depend stub.js */ /*jslint eqeqeq: false, onevar: false, nomen: false, plusplus: false*/ /*global module, require, sinon*/ /** * Assertions matching the test spy retrieval interface. * * @author Christian Johansen (christian@cjohansen.no) * @license BSD * * Copyright (c) 2010-2013 Christian Johansen */ (function (sinon, global) { var commonJSModule = typeof module == "object" && typeof require == "function"; var slice = Array.prototype.slice; var assert; if (!sinon && commonJSModule) { sinon = require("../sinon"); } if (!sinon) { return; } function verifyIsStub() { var method; for (var i = 0, l = arguments.length; i < l; ++i) { method = arguments[i]; if (!method) { assert.fail("fake is not a spy"); } if (typeof method != "function") { assert.fail(method + " is not a function"); } if (typeof method.getCall != "function") { assert.fail(method + " is not stubbed"); } } } function failAssertion(object, msg) { object = object || global; var failMethod = object.fail || assert.fail; failMethod.call(object, msg); } function mirrorPropAsAssertion(name, method, message) { if (arguments.length == 2) { message = method; method = name; } assert[name] = function (fake) { verifyIsStub(fake); var args = slice.call(arguments, 1); var failed = false; if (typeof method == "function") { failed = !method(fake); } else { failed = typeof fake[method] == "function" ? !fake[method].apply(fake, args) : !fake[method]; } if (failed) { failAssertion(this, fake.printf.apply(fake, [message].concat(args))); } else { assert.pass(name); } }; } function exposedName(prefix, prop) { return !prefix || /^fail/.test(prop) ? prop : prefix + prop.slice(0, 1).toUpperCase() + prop.slice(1); }; assert = { failException: "AssertError", fail: function fail(message) { var error = new Error(message); error.name = this.failException || assert.failException; throw error; }, pass: function pass(assertion) {}, callOrder: function assertCallOrder() { verifyIsStub.apply(null, arguments); var expected = "", actual = ""; if (!sinon.calledInOrder(arguments)) { try { expected = [].join.call(arguments, ", "); var calls = slice.call(arguments); var i = calls.length; while (i) { if (!calls[--i].called) { calls.splice(i, 1); } } actual = sinon.orderByFirstCall(calls).join(", "); } catch (e) { // If this fails, we'll just fall back to the blank string } failAssertion(this, "expected " + expected + " to be " + "called in order but were called as " + actual); } else { assert.pass("callOrder"); } }, callCount: function assertCallCount(method, count) { verifyIsStub(method); if (method.callCount != count) { var msg = "expected %n to be called " + sinon.timesInWords(count) + " but was called %c%C"; failAssertion(this, method.printf(msg)); } else { assert.pass("callCount"); } }, expose: function expose(target, options) { if (!target) { throw new TypeError("target is null or undefined"); } var o = options || {}; var prefix = typeof o.prefix == "undefined" && "assert" || o.prefix; var includeFail = typeof o.includeFail == "undefined" || !!o.includeFail; for (var method in this) { if (method != "export" && (includeFail || !/^(fail)/.test(method))) { target[exposedName(prefix, method)] = this[method]; } } return target; } }; mirrorPropAsAssertion("called", "expected %n to have been called at least once but was never called"); mirrorPropAsAssertion("notCalled", function (spy) { return !spy.called; }, "expected %n to not have been called but was called %c%C"); mirrorPropAsAssertion("calledOnce", "expected %n to be called once but was called %c%C"); mirrorPropAsAssertion("calledTwice", "expected %n to be called twice but was called %c%C"); mirrorPropAsAssertion("calledThrice", "expected %n to be called thrice but was called %c%C"); mirrorPropAsAssertion("calledOn", "expected %n to be called with %1 as this but was called with %t"); mirrorPropAsAssertion("alwaysCalledOn", "expected %n to always be called with %1 as this but was called with %t"); mirrorPropAsAssertion("calledWithNew", "expected %n to be called with new"); mirrorPropAsAssertion("alwaysCalledWithNew", "expected %n to always be called with new"); mirrorPropAsAssertion("calledWith", "expected %n to be called with arguments %*%C"); mirrorPropAsAssertion("calledWithMatch", "expected %n to be called with match %*%C"); mirrorPropAsAssertion("alwaysCalledWith", "expected %n to always be called with arguments %*%C"); mirrorPropAsAssertion("alwaysCalledWithMatch", "expected %n to always be called with match %*%C"); mirrorPropAsAssertion("calledWithExactly", "expected %n to be called with exact arguments %*%C"); mirrorPropAsAssertion("alwaysCalledWithExactly", "expected %n to always be called with exact arguments %*%C"); mirrorPropAsAssertion("neverCalledWith", "expected %n to never be called with arguments %*%C"); mirrorPropAsAssertion("neverCalledWithMatch", "expected %n to never be called with match %*%C"); mirrorPropAsAssertion("threw", "%n did not throw exception%C"); mirrorPropAsAssertion("alwaysThrew", "%n did not always throw exception%C"); if (commonJSModule) { module.exports = assert; } else { sinon.assert = assert; } }(typeof sinon == "object" && sinon || null, typeof window != "undefined" ? window : (typeof self != "undefined") ? self : global)); return sinon;}.call(typeof window != 'undefined' && window || {})); apache-couchdb-1.6.0/src/fauxton/test/mocha/mocha.js0000755000175000001440000033365212332105522022303 0ustar00djcusers00000000000000;(function(){ // CommonJS require() function require(p){ var path = require.resolve(p) , mod = require.modules[path]; if (!mod) throw new Error('failed to require "' + p + '"'); if (!mod.exports) { mod.exports = {}; mod.call(mod.exports, mod, mod.exports, require.relative(path)); } return mod.exports; } require.modules = {}; require.resolve = function (path){ var orig = path , reg = path + '.js' , index = path + '/index.js'; return require.modules[reg] && reg || require.modules[index] && index || orig; }; require.register = function (path, fn){ require.modules[path] = fn; }; require.relative = function (parent) { return function(p){ if ('.' != p.charAt(0)) return require(p); var path = parent.split('/') , segs = p.split('/'); path.pop(); for (var i = 0; i < segs.length; i++) { var seg = segs[i]; if ('..' == seg) path.pop(); else if ('.' != seg) path.push(seg); } return require(path.join('/')); }; }; require.register("browser/debug.js", function(module, exports, require){ module.exports = function(type){ return function(){ } }; }); // module: browser/debug.js require.register("browser/diff.js", function(module, exports, require){ /* See license.txt for terms of usage */ /* * Text diff implementation. * * This library supports the following APIS: * JsDiff.diffChars: Character by character diff * JsDiff.diffWords: Word (as defined by \b regex) diff which ignores whitespace * JsDiff.diffLines: Line based diff * * JsDiff.diffCss: Diff targeted at CSS content * * These methods are based on the implementation proposed in * "An O(ND) Difference Algorithm and its Variations" (Myers, 1986). * http://citeseerx.ist.psu.edu/viewdoc/summary?doi=10.1.1.4.6927 */ var JsDiff = (function() { function clonePath(path) { return { newPos: path.newPos, components: path.components.slice(0) }; } function removeEmpty(array) { var ret = []; for (var i = 0; i < array.length; i++) { if (array[i]) { ret.push(array[i]); } } return ret; } function escapeHTML(s) { var n = s; n = n.replace(/&/g, "&"); n = n.replace(//g, ">"); n = n.replace(/"/g, """); return n; } var fbDiff = function(ignoreWhitespace) { this.ignoreWhitespace = ignoreWhitespace; }; fbDiff.prototype = { diff: function(oldString, newString) { // Handle the identity case (this is due to unrolling editLength == 0 if (newString == oldString) { return [{ value: newString }]; } if (!newString) { return [{ value: oldString, removed: true }]; } if (!oldString) { return [{ value: newString, added: true }]; } newString = this.tokenize(newString); oldString = this.tokenize(oldString); var newLen = newString.length, oldLen = oldString.length; var maxEditLength = newLen + oldLen; var bestPath = [{ newPos: -1, components: [] }]; // Seed editLength = 0 var oldPos = this.extractCommon(bestPath[0], newString, oldString, 0); if (bestPath[0].newPos+1 >= newLen && oldPos+1 >= oldLen) { return bestPath[0].components; } for (var editLength = 1; editLength <= maxEditLength; editLength++) { for (var diagonalPath = -1*editLength; diagonalPath <= editLength; diagonalPath+=2) { var basePath; var addPath = bestPath[diagonalPath-1], removePath = bestPath[diagonalPath+1]; oldPos = (removePath ? removePath.newPos : 0) - diagonalPath; if (addPath) { // No one else is going to attempt to use this value, clear it bestPath[diagonalPath-1] = undefined; } var canAdd = addPath && addPath.newPos+1 < newLen; var canRemove = removePath && 0 <= oldPos && oldPos < oldLen; if (!canAdd && !canRemove) { bestPath[diagonalPath] = undefined; continue; } // Select the diagonal that we want to branch from. We select the prior // path whose position in the new string is the farthest from the origin // and does not pass the bounds of the diff graph if (!canAdd || (canRemove && addPath.newPos < removePath.newPos)) { basePath = clonePath(removePath); this.pushComponent(basePath.components, oldString[oldPos], undefined, true); } else { basePath = clonePath(addPath); basePath.newPos++; this.pushComponent(basePath.components, newString[basePath.newPos], true, undefined); } var oldPos = this.extractCommon(basePath, newString, oldString, diagonalPath); if (basePath.newPos+1 >= newLen && oldPos+1 >= oldLen) { return basePath.components; } else { bestPath[diagonalPath] = basePath; } } } }, pushComponent: function(components, value, added, removed) { var last = components[components.length-1]; if (last && last.added === added && last.removed === removed) { // We need to clone here as the component clone operation is just // as shallow array clone components[components.length-1] = {value: this.join(last.value, value), added: added, removed: removed }; } else { components.push({value: value, added: added, removed: removed }); } }, extractCommon: function(basePath, newString, oldString, diagonalPath) { var newLen = newString.length, oldLen = oldString.length, newPos = basePath.newPos, oldPos = newPos - diagonalPath; while (newPos+1 < newLen && oldPos+1 < oldLen && this.equals(newString[newPos+1], oldString[oldPos+1])) { newPos++; oldPos++; this.pushComponent(basePath.components, newString[newPos], undefined, undefined); } basePath.newPos = newPos; return oldPos; }, equals: function(left, right) { var reWhitespace = /\S/; if (this.ignoreWhitespace && !reWhitespace.test(left) && !reWhitespace.test(right)) { return true; } else { return left == right; } }, join: function(left, right) { return left + right; }, tokenize: function(value) { return value; } }; var CharDiff = new fbDiff(); var WordDiff = new fbDiff(true); WordDiff.tokenize = function(value) { return removeEmpty(value.split(/(\s+|\b)/)); }; var CssDiff = new fbDiff(true); CssDiff.tokenize = function(value) { return removeEmpty(value.split(/([{}:;,]|\s+)/)); }; var LineDiff = new fbDiff(); LineDiff.tokenize = function(value) { return value.split(/^/m); }; return { diffChars: function(oldStr, newStr) { return CharDiff.diff(oldStr, newStr); }, diffWords: function(oldStr, newStr) { return WordDiff.diff(oldStr, newStr); }, diffLines: function(oldStr, newStr) { return LineDiff.diff(oldStr, newStr); }, diffCss: function(oldStr, newStr) { return CssDiff.diff(oldStr, newStr); }, createPatch: function(fileName, oldStr, newStr, oldHeader, newHeader) { var ret = []; ret.push("Index: " + fileName); ret.push("==================================================================="); ret.push("--- " + fileName + (typeof oldHeader === "undefined" ? "" : "\t" + oldHeader)); ret.push("+++ " + fileName + (typeof newHeader === "undefined" ? "" : "\t" + newHeader)); var diff = LineDiff.diff(oldStr, newStr); if (!diff[diff.length-1].value) { diff.pop(); // Remove trailing newline add } diff.push({value: "", lines: []}); // Append an empty value to make cleanup easier function contextLines(lines) { return lines.map(function(entry) { return ' ' + entry; }); } function eofNL(curRange, i, current) { var last = diff[diff.length-2], isLast = i === diff.length-2, isLastOfType = i === diff.length-3 && (current.added === !last.added || current.removed === !last.removed); // Figure out if this is the last line for the given file and missing NL if (!/\n$/.test(current.value) && (isLast || isLastOfType)) { curRange.push('\\ No newline at end of file'); } } var oldRangeStart = 0, newRangeStart = 0, curRange = [], oldLine = 1, newLine = 1; for (var i = 0; i < diff.length; i++) { var current = diff[i], lines = current.lines || current.value.replace(/\n$/, "").split("\n"); current.lines = lines; if (current.added || current.removed) { if (!oldRangeStart) { var prev = diff[i-1]; oldRangeStart = oldLine; newRangeStart = newLine; if (prev) { curRange = contextLines(prev.lines.slice(-4)); oldRangeStart -= curRange.length; newRangeStart -= curRange.length; } } curRange.push.apply(curRange, lines.map(function(entry) { return (current.added?"+":"-") + entry; })); eofNL(curRange, i, current); if (current.added) { newLine += lines.length; } else { oldLine += lines.length; } } else { if (oldRangeStart) { // Close out any changes that have been output (or join overlapping) if (lines.length <= 8 && i < diff.length-2) { // Overlapping curRange.push.apply(curRange, contextLines(lines)); } else { // end the range and output var contextSize = Math.min(lines.length, 4); ret.push( "@@ -" + oldRangeStart + "," + (oldLine-oldRangeStart+contextSize) + " +" + newRangeStart + "," + (newLine-newRangeStart+contextSize) + " @@"); ret.push.apply(ret, curRange); ret.push.apply(ret, contextLines(lines.slice(0, contextSize))); if (lines.length <= 4) { eofNL(ret, i, current); } oldRangeStart = 0; newRangeStart = 0; curRange = []; } } oldLine += lines.length; newLine += lines.length; } } return ret.join('\n') + '\n'; }, convertChangesToXML: function(changes){ var ret = []; for ( var i = 0; i < changes.length; i++) { var change = changes[i]; if (change.added) { ret.push(""); } else if (change.removed) { ret.push(""); } ret.push(escapeHTML(change.value)); if (change.added) { ret.push(""); } else if (change.removed) { ret.push(""); } } return ret.join(""); } }; })(); if (typeof module !== "undefined") { module.exports = JsDiff; } }); // module: browser/diff.js require.register("browser/events.js", function(module, exports, require){ /** * Module exports. */ exports.EventEmitter = EventEmitter; /** * Check if `obj` is an array. */ function isArray(obj) { return '[object Array]' == {}.toString.call(obj); } /** * Event emitter constructor. * * @api public */ function EventEmitter(){}; /** * Adds a listener. * * @api public */ EventEmitter.prototype.on = function (name, fn) { if (!this.$events) { this.$events = {}; } if (!this.$events[name]) { this.$events[name] = fn; } else if (isArray(this.$events[name])) { this.$events[name].push(fn); } else { this.$events[name] = [this.$events[name], fn]; } return this; }; EventEmitter.prototype.addListener = EventEmitter.prototype.on; /** * Adds a volatile listener. * * @api public */ EventEmitter.prototype.once = function (name, fn) { var self = this; function on () { self.removeListener(name, on); fn.apply(this, arguments); }; on.listener = fn; this.on(name, on); return this; }; /** * Removes a listener. * * @api public */ EventEmitter.prototype.removeListener = function (name, fn) { if (this.$events && this.$events[name]) { var list = this.$events[name]; if (isArray(list)) { var pos = -1; for (var i = 0, l = list.length; i < l; i++) { if (list[i] === fn || (list[i].listener && list[i].listener === fn)) { pos = i; break; } } if (pos < 0) { return this; } list.splice(pos, 1); if (!list.length) { delete this.$events[name]; } } else if (list === fn || (list.listener && list.listener === fn)) { delete this.$events[name]; } } return this; }; /** * Removes all listeners for an event. * * @api public */ EventEmitter.prototype.removeAllListeners = function (name) { if (name === undefined) { this.$events = {}; return this; } if (this.$events && this.$events[name]) { this.$events[name] = null; } return this; }; /** * Gets all listeners for a certain event. * * @api public */ EventEmitter.prototype.listeners = function (name) { if (!this.$events) { this.$events = {}; } if (!this.$events[name]) { this.$events[name] = []; } if (!isArray(this.$events[name])) { this.$events[name] = [this.$events[name]]; } return this.$events[name]; }; /** * Emits an event. * * @api public */ EventEmitter.prototype.emit = function (name) { if (!this.$events) { return false; } var handler = this.$events[name]; if (!handler) { return false; } var args = [].slice.call(arguments, 1); if ('function' == typeof handler) { handler.apply(this, args); } else if (isArray(handler)) { var listeners = handler.slice(); for (var i = 0, l = listeners.length; i < l; i++) { listeners[i].apply(this, args); } } else { return false; } return true; }; }); // module: browser/events.js require.register("browser/fs.js", function(module, exports, require){ }); // module: browser/fs.js require.register("browser/path.js", function(module, exports, require){ }); // module: browser/path.js require.register("browser/progress.js", function(module, exports, require){ /** * Expose `Progress`. */ module.exports = Progress; /** * Initialize a new `Progress` indicator. */ function Progress() { this.percent = 0; this.size(0); this.fontSize(11); this.font('helvetica, arial, sans-serif'); } /** * Set progress size to `n`. * * @param {Number} n * @return {Progress} for chaining * @api public */ Progress.prototype.size = function(n){ this._size = n; return this; }; /** * Set text to `str`. * * @param {String} str * @return {Progress} for chaining * @api public */ Progress.prototype.text = function(str){ this._text = str; return this; }; /** * Set font size to `n`. * * @param {Number} n * @return {Progress} for chaining * @api public */ Progress.prototype.fontSize = function(n){ this._fontSize = n; return this; }; /** * Set font `family`. * * @param {String} family * @return {Progress} for chaining */ Progress.prototype.font = function(family){ this._font = family; return this; }; /** * Update percentage to `n`. * * @param {Number} n * @return {Progress} for chaining */ Progress.prototype.update = function(n){ this.percent = n; return this; }; /** * Draw on `ctx`. * * @param {CanvasRenderingContext2d} ctx * @return {Progress} for chaining */ Progress.prototype.draw = function(ctx){ var percent = Math.min(this.percent, 100) , size = this._size , half = size / 2 , x = half , y = half , rad = half - 1 , fontSize = this._fontSize; ctx.font = fontSize + 'px ' + this._font; var angle = Math.PI * 2 * (percent / 100); ctx.clearRect(0, 0, size, size); // outer circle ctx.strokeStyle = '#9f9f9f'; ctx.beginPath(); ctx.arc(x, y, rad, 0, angle, false); ctx.stroke(); // inner circle ctx.strokeStyle = '#eee'; ctx.beginPath(); ctx.arc(x, y, rad - 1, 0, angle, true); ctx.stroke(); // text var text = this._text || (percent | 0) + '%' , w = ctx.measureText(text).width; ctx.fillText( text , x - w / 2 + 1 , y + fontSize / 2 - 1); return this; }; }); // module: browser/progress.js require.register("browser/tty.js", function(module, exports, require){ exports.isatty = function(){ return true; }; exports.getWindowSize = function(){ if ('innerHeight' in global) { return [global.innerHeight, global.innerWidth]; } else { // In a Web Worker, the DOM Window is not available. return [640, 480]; } }; }); // module: browser/tty.js require.register("context.js", function(module, exports, require){ /** * Expose `Context`. */ module.exports = Context; /** * Initialize a new `Context`. * * @api private */ function Context(){} /** * Set or get the context `Runnable` to `runnable`. * * @param {Runnable} runnable * @return {Context} * @api private */ Context.prototype.runnable = function(runnable){ if (0 == arguments.length) return this._runnable; this.test = this._runnable = runnable; return this; }; /** * Set test timeout `ms`. * * @param {Number} ms * @return {Context} self * @api private */ Context.prototype.timeout = function(ms){ this.runnable().timeout(ms); return this; }; /** * Set test slowness threshold `ms`. * * @param {Number} ms * @return {Context} self * @api private */ Context.prototype.slow = function(ms){ this.runnable().slow(ms); return this; }; /** * Inspect the context void of `._runnable`. * * @return {String} * @api private */ Context.prototype.inspect = function(){ return JSON.stringify(this, function(key, val){ if ('_runnable' == key) return; if ('test' == key) return; return val; }, 2); }; }); // module: context.js require.register("hook.js", function(module, exports, require){ /** * Module dependencies. */ var Runnable = require('./runnable'); /** * Expose `Hook`. */ module.exports = Hook; /** * Initialize a new `Hook` with the given `title` and callback `fn`. * * @param {String} title * @param {Function} fn * @api private */ function Hook(title, fn) { Runnable.call(this, title, fn); this.type = 'hook'; } /** * Inherit from `Runnable.prototype`. */ function F(){}; F.prototype = Runnable.prototype; Hook.prototype = new F; Hook.prototype.constructor = Hook; /** * Get or set the test `err`. * * @param {Error} err * @return {Error} * @api public */ Hook.prototype.error = function(err){ if (0 == arguments.length) { var err = this._error; this._error = null; return err; } this._error = err; }; }); // module: hook.js require.register("interfaces/bdd.js", function(module, exports, require){ /** * Module dependencies. */ var Suite = require('../suite') , Test = require('../test'); /** * BDD-style interface: * * describe('Array', function(){ * describe('#indexOf()', function(){ * it('should return -1 when not present', function(){ * * }); * * it('should return the index when present', function(){ * * }); * }); * }); * */ module.exports = function(suite){ var suites = [suite]; suite.on('pre-require', function(context, file, mocha){ /** * Execute before running tests. */ context.before = function(fn){ suites[0].beforeAll(fn); }; /** * Execute after running tests. */ context.after = function(fn){ suites[0].afterAll(fn); }; /** * Execute before each test case. */ context.beforeEach = function(fn){ suites[0].beforeEach(fn); }; /** * Execute after each test case. */ context.afterEach = function(fn){ suites[0].afterEach(fn); }; /** * Describe a "suite" with the given `title` * and callback `fn` containing nested suites * and/or tests. */ context.describe = context.context = function(title, fn){ var suite = Suite.create(suites[0], title); suites.unshift(suite); fn.call(suite); suites.shift(); return suite; }; /** * Pending describe. */ context.xdescribe = context.xcontext = context.describe.skip = function(title, fn){ var suite = Suite.create(suites[0], title); suite.pending = true; suites.unshift(suite); fn.call(suite); suites.shift(); }; /** * Exclusive suite. */ context.describe.only = function(title, fn){ var suite = context.describe(title, fn); mocha.grep(suite.fullTitle()); }; /** * Describe a specification or test-case * with the given `title` and callback `fn` * acting as a thunk. */ context.it = context.specify = function(title, fn){ var suite = suites[0]; if (suite.pending) var fn = null; var test = new Test(title, fn); suite.addTest(test); return test; }; /** * Exclusive test-case. */ context.it.only = function(title, fn){ var test = context.it(title, fn); mocha.grep(test.fullTitle()); }; /** * Pending test case. */ context.xit = context.xspecify = context.it.skip = function(title){ context.it(title); }; }); }; }); // module: interfaces/bdd.js require.register("interfaces/exports.js", function(module, exports, require){ /** * Module dependencies. */ var Suite = require('../suite') , Test = require('../test'); /** * TDD-style interface: * * exports.Array = { * '#indexOf()': { * 'should return -1 when the value is not present': function(){ * * }, * * 'should return the correct index when the value is present': function(){ * * } * } * }; * */ module.exports = function(suite){ var suites = [suite]; suite.on('require', visit); function visit(obj) { var suite; for (var key in obj) { if ('function' == typeof obj[key]) { var fn = obj[key]; switch (key) { case 'before': suites[0].beforeAll(fn); break; case 'after': suites[0].afterAll(fn); break; case 'beforeEach': suites[0].beforeEach(fn); break; case 'afterEach': suites[0].afterEach(fn); break; default: suites[0].addTest(new Test(key, fn)); } } else { var suite = Suite.create(suites[0], key); suites.unshift(suite); visit(obj[key]); suites.shift(); } } } }; }); // module: interfaces/exports.js require.register("interfaces/index.js", function(module, exports, require){ exports.bdd = require('./bdd'); exports.tdd = require('./tdd'); exports.qunit = require('./qunit'); exports.exports = require('./exports'); }); // module: interfaces/index.js require.register("interfaces/qunit.js", function(module, exports, require){ /** * Module dependencies. */ var Suite = require('../suite') , Test = require('../test'); /** * QUnit-style interface: * * suite('Array'); * * test('#length', function(){ * var arr = [1,2,3]; * ok(arr.length == 3); * }); * * test('#indexOf()', function(){ * var arr = [1,2,3]; * ok(arr.indexOf(1) == 0); * ok(arr.indexOf(2) == 1); * ok(arr.indexOf(3) == 2); * }); * * suite('String'); * * test('#length', function(){ * ok('foo'.length == 3); * }); * */ module.exports = function(suite){ var suites = [suite]; suite.on('pre-require', function(context, file, mocha){ /** * Execute before running tests. */ context.before = function(fn){ suites[0].beforeAll(fn); }; /** * Execute after running tests. */ context.after = function(fn){ suites[0].afterAll(fn); }; /** * Execute before each test case. */ context.beforeEach = function(fn){ suites[0].beforeEach(fn); }; /** * Execute after each test case. */ context.afterEach = function(fn){ suites[0].afterEach(fn); }; /** * Describe a "suite" with the given `title`. */ context.suite = function(title){ if (suites.length > 1) suites.shift(); var suite = Suite.create(suites[0], title); suites.unshift(suite); return suite; }; /** * Exclusive test-case. */ context.suite.only = function(title, fn){ var suite = context.suite(title, fn); mocha.grep(suite.fullTitle()); }; /** * Describe a specification or test-case * with the given `title` and callback `fn` * acting as a thunk. */ context.test = function(title, fn){ var test = new Test(title, fn); suites[0].addTest(test); return test; }; /** * Exclusive test-case. */ context.test.only = function(title, fn){ var test = context.test(title, fn); mocha.grep(test.fullTitle()); }; /** * Pending test case. */ context.test.skip = function(title){ context.test(title); }; }); }; }); // module: interfaces/qunit.js require.register("interfaces/tdd.js", function(module, exports, require){ /** * Module dependencies. */ var Suite = require('../suite') , Test = require('../test'); /** * TDD-style interface: * * suite('Array', function(){ * suite('#indexOf()', function(){ * suiteSetup(function(){ * * }); * * test('should return -1 when not present', function(){ * * }); * * test('should return the index when present', function(){ * * }); * * suiteTeardown(function(){ * * }); * }); * }); * */ module.exports = function(suite){ var suites = [suite]; suite.on('pre-require', function(context, file, mocha){ /** * Execute before each test case. */ context.setup = function(fn){ suites[0].beforeEach(fn); }; /** * Execute after each test case. */ context.teardown = function(fn){ suites[0].afterEach(fn); }; /** * Execute before the suite. */ context.suiteSetup = function(fn){ suites[0].beforeAll(fn); }; /** * Execute after the suite. */ context.suiteTeardown = function(fn){ suites[0].afterAll(fn); }; /** * Describe a "suite" with the given `title` * and callback `fn` containing nested suites * and/or tests. */ context.suite = function(title, fn){ var suite = Suite.create(suites[0], title); suites.unshift(suite); fn.call(suite); suites.shift(); return suite; }; /** * Pending suite. */ context.suite.skip = function(title, fn) { var suite = Suite.create(suites[0], title); suite.pending = true; suites.unshift(suite); fn.call(suite); suites.shift(); }; /** * Exclusive test-case. */ context.suite.only = function(title, fn){ var suite = context.suite(title, fn); mocha.grep(suite.fullTitle()); }; /** * Describe a specification or test-case * with the given `title` and callback `fn` * acting as a thunk. */ context.test = function(title, fn){ var suite = suites[0]; if (suite.pending) var fn = null; var test = new Test(title, fn); suite.addTest(test); return test; }; /** * Exclusive test-case. */ context.test.only = function(title, fn){ var test = context.test(title, fn); mocha.grep(test.fullTitle()); }; /** * Pending test case. */ context.test.skip = function(title){ context.test(title); }; }); }; }); // module: interfaces/tdd.js require.register("mocha.js", function(module, exports, require){ /*! * mocha * Copyright(c) 2011 TJ Holowaychuk * MIT Licensed */ /** * Module dependencies. */ var path = require('browser/path') , utils = require('./utils'); /** * Expose `Mocha`. */ exports = module.exports = Mocha; /** * Expose internals. */ exports.utils = utils; exports.interfaces = require('./interfaces'); exports.reporters = require('./reporters'); exports.Runnable = require('./runnable'); exports.Context = require('./context'); exports.Runner = require('./runner'); exports.Suite = require('./suite'); exports.Hook = require('./hook'); exports.Test = require('./test'); /** * Return image `name` path. * * @param {String} name * @return {String} * @api private */ function image(name) { return __dirname + '/../images/' + name + '.png'; } /** * Setup mocha with `options`. * * Options: * * - `ui` name "bdd", "tdd", "exports" etc * - `reporter` reporter instance, defaults to `mocha.reporters.Dot` * - `globals` array of accepted globals * - `timeout` timeout in milliseconds * - `bail` bail on the first test failure * - `slow` milliseconds to wait before considering a test slow * - `ignoreLeaks` ignore global leaks * - `grep` string or regexp to filter tests with * * @param {Object} options * @api public */ function Mocha(options) { options = options || {}; this.files = []; this.options = options; this.grep(options.grep); this.suite = new exports.Suite('', new exports.Context); this.ui(options.ui); this.bail(options.bail); this.reporter(options.reporter); if (options.timeout) this.timeout(options.timeout); if (options.slow) this.slow(options.slow); } /** * Enable or disable bailing on the first failure. * * @param {Boolean} [bail] * @api public */ Mocha.prototype.bail = function(bail){ if (0 == arguments.length) bail = true; this.suite.bail(bail); return this; }; /** * Add test `file`. * * @param {String} file * @api public */ Mocha.prototype.addFile = function(file){ this.files.push(file); return this; }; /** * Set reporter to `reporter`, defaults to "dot". * * @param {String|Function} reporter name or constructor * @api public */ Mocha.prototype.reporter = function(reporter){ if ('function' == typeof reporter) { this._reporter = reporter; } else { reporter = reporter || 'dot'; try { this._reporter = require('./reporters/' + reporter); } catch (err) { this._reporter = require(reporter); } if (!this._reporter) throw new Error('invalid reporter "' + reporter + '"'); } return this; }; /** * Set test UI `name`, defaults to "bdd". * * @param {String} bdd * @api public */ Mocha.prototype.ui = function(name){ name = name || 'bdd'; this._ui = exports.interfaces[name]; if (!this._ui) throw new Error('invalid interface "' + name + '"'); this._ui = this._ui(this.suite); return this; }; /** * Load registered files. * * @api private */ Mocha.prototype.loadFiles = function(fn){ var self = this; var suite = this.suite; var pending = this.files.length; this.files.forEach(function(file){ file = path.resolve(file); suite.emit('pre-require', global, file, self); suite.emit('require', require(file), file, self); suite.emit('post-require', global, file, self); --pending || (fn && fn()); }); }; /** * Enable growl support. * * @api private */ Mocha.prototype._growl = function(runner, reporter) { var notify = require('growl'); runner.on('end', function(){ var stats = reporter.stats; if (stats.failures) { var msg = stats.failures + ' of ' + runner.total + ' tests failed'; notify(msg, { name: 'mocha', title: 'Failed', image: image('error') }); } else { notify(stats.passes + ' tests passed in ' + stats.duration + 'ms', { name: 'mocha' , title: 'Passed' , image: image('ok') }); } }); }; /** * Add regexp to grep, if `re` is a string it is escaped. * * @param {RegExp|String} re * @return {Mocha} * @api public */ Mocha.prototype.grep = function(re){ this.options.grep = 'string' == typeof re ? new RegExp(utils.escapeRegexp(re)) : re; return this; }; /** * Invert `.grep()` matches. * * @return {Mocha} * @api public */ Mocha.prototype.invert = function(){ this.options.invert = true; return this; }; /** * Ignore global leaks. * * @param {Boolean} ignore * @return {Mocha} * @api public */ Mocha.prototype.ignoreLeaks = function(ignore){ this.options.ignoreLeaks = !!ignore; return this; }; /** * Enable global leak checking. * * @return {Mocha} * @api public */ Mocha.prototype.checkLeaks = function(){ this.options.ignoreLeaks = false; return this; }; /** * Enable growl support. * * @return {Mocha} * @api public */ Mocha.prototype.growl = function(){ this.options.growl = true; return this; }; /** * Ignore `globals` array or string. * * @param {Array|String} globals * @return {Mocha} * @api public */ Mocha.prototype.globals = function(globals){ this.options.globals = (this.options.globals || []).concat(globals); return this; }; /** * Set the timeout in milliseconds. * * @param {Number} timeout * @return {Mocha} * @api public */ Mocha.prototype.timeout = function(timeout){ this.suite.timeout(timeout); return this; }; /** * Set slowness threshold in milliseconds. * * @param {Number} slow * @return {Mocha} * @api public */ Mocha.prototype.slow = function(slow){ this.suite.slow(slow); return this; }; /** * Makes all tests async (accepting a callback) * * @return {Mocha} * @api public */ Mocha.prototype.asyncOnly = function(){ this.options.asyncOnly = true; return this; }; /** * Run tests and invoke `fn()` when complete. * * @param {Function} fn * @return {Runner} * @api public */ Mocha.prototype.run = function(fn){ if (this.files.length) this.loadFiles(); var suite = this.suite; var options = this.options; var runner = new exports.Runner(suite); var reporter = new this._reporter(runner); runner.ignoreLeaks = false !== options.ignoreLeaks; runner.asyncOnly = options.asyncOnly; if (options.grep) runner.grep(options.grep, options.invert); if (options.globals) runner.globals(options.globals); if (options.growl) this._growl(runner, reporter); return runner.run(fn); }; }); // module: mocha.js require.register("ms.js", function(module, exports, require){ /** * Helpers. */ var s = 1000; var m = s * 60; var h = m * 60; var d = h * 24; /** * Parse or format the given `val`. * * @param {String|Number} val * @return {String|Number} * @api public */ module.exports = function(val){ if ('string' == typeof val) return parse(val); return format(val); } /** * Parse the given `str` and return milliseconds. * * @param {String} str * @return {Number} * @api private */ function parse(str) { var m = /^((?:\d+)?\.?\d+) *(ms|seconds?|s|minutes?|m|hours?|h|days?|d|years?|y)?$/i.exec(str); if (!m) return; var n = parseFloat(m[1]); var type = (m[2] || 'ms').toLowerCase(); switch (type) { case 'years': case 'year': case 'y': return n * 31557600000; case 'days': case 'day': case 'd': return n * 86400000; case 'hours': case 'hour': case 'h': return n * 3600000; case 'minutes': case 'minute': case 'm': return n * 60000; case 'seconds': case 'second': case 's': return n * 1000; case 'ms': return n; } } /** * Format the given `ms`. * * @param {Number} ms * @return {String} * @api public */ function format(ms) { if (ms == d) return Math.round(ms / d) + ' day'; if (ms > d) return Math.round(ms / d) + ' days'; if (ms == h) return Math.round(ms / h) + ' hour'; if (ms > h) return Math.round(ms / h) + ' hours'; if (ms == m) return Math.round(ms / m) + ' minute'; if (ms > m) return Math.round(ms / m) + ' minutes'; if (ms == s) return Math.round(ms / s) + ' second'; if (ms > s) return Math.round(ms / s) + ' seconds'; return ms + ' ms'; } }); // module: ms.js require.register("reporters/base.js", function(module, exports, require){ /** * Module dependencies. */ var tty = require('browser/tty') , diff = require('browser/diff') , ms = require('../ms'); /** * Save timer references to avoid Sinon interfering (see GH-237). */ var Date = global.Date , setTimeout = global.setTimeout , setInterval = global.setInterval , clearTimeout = global.clearTimeout , clearInterval = global.clearInterval; /** * Check if both stdio streams are associated with a tty. */ var isatty = tty.isatty(1) && tty.isatty(2); /** * Expose `Base`. */ exports = module.exports = Base; /** * Enable coloring by default. */ exports.useColors = isatty; /** * Default color map. */ exports.colors = { 'pass': 90 , 'fail': 31 , 'bright pass': 92 , 'bright fail': 91 , 'bright yellow': 93 , 'pending': 36 , 'suite': 0 , 'error title': 0 , 'error message': 31 , 'error stack': 90 , 'checkmark': 32 , 'fast': 90 , 'medium': 33 , 'slow': 31 , 'green': 32 , 'light': 90 , 'diff gutter': 90 , 'diff added': 42 , 'diff removed': 41 }; /** * Default symbol map. */ exports.symbols = { ok: 'āœ“', err: 'āœ–', dot: '․' }; // With node.js on Windows: use symbols available in terminal default fonts if ('win32' == process.platform) { exports.symbols.ok = '\u221A'; exports.symbols.err = '\u00D7'; exports.symbols.dot = '.'; } /** * Color `str` with the given `type`, * allowing colors to be disabled, * as well as user-defined color * schemes. * * @param {String} type * @param {String} str * @return {String} * @api private */ var color = exports.color = function(type, str) { if (!exports.useColors) return str; return '\u001b[' + exports.colors[type] + 'm' + str + '\u001b[0m'; }; /** * Expose term window size, with some * defaults for when stderr is not a tty. */ exports.window = { width: isatty ? process.stdout.getWindowSize ? process.stdout.getWindowSize(1)[0] : tty.getWindowSize()[1] : 75 }; /** * Expose some basic cursor interactions * that are common among reporters. */ exports.cursor = { hide: function(){ process.stdout.write('\u001b[?25l'); }, show: function(){ process.stdout.write('\u001b[?25h'); }, deleteLine: function(){ process.stdout.write('\u001b[2K'); }, beginningOfLine: function(){ process.stdout.write('\u001b[0G'); }, CR: function(){ exports.cursor.deleteLine(); exports.cursor.beginningOfLine(); } }; /** * Outut the given `failures` as a list. * * @param {Array} failures * @api public */ exports.list = function(failures){ console.error(); failures.forEach(function(test, i){ // format var fmt = color('error title', ' %s) %s:\n') + color('error message', ' %s') + color('error stack', '\n%s\n'); // msg var err = test.err , message = err.message || '' , stack = err.stack || message , index = stack.indexOf(message) + message.length , msg = stack.slice(0, index) , actual = err.actual , expected = err.expected , escape = true; // uncaught if (err.uncaught) { msg = 'Uncaught ' + msg; } // explicitly show diff if (err.showDiff && sameType(actual, expected)) { escape = false; err.actual = actual = stringify(actual); err.expected = expected = stringify(expected); } // actual / expected diff if ('string' == typeof actual && 'string' == typeof expected) { msg = errorDiff(err, 'Words', escape); // linenos var lines = msg.split('\n'); if (lines.length > 4) { var width = String(lines.length).length; msg = lines.map(function(str, i){ return pad(++i, width) + ' |' + ' ' + str; }).join('\n'); } // legend msg = '\n' + color('diff removed', 'actual') + ' ' + color('diff added', 'expected') + '\n\n' + msg + '\n'; // indent msg = msg.replace(/^/gm, ' '); fmt = color('error title', ' %s) %s:\n%s') + color('error stack', '\n%s\n'); } // indent stack trace without msg stack = stack.slice(index ? index + 1 : index) .replace(/^/gm, ' '); console.error(fmt, (i + 1), test.fullTitle(), msg, stack); }); }; /** * Initialize a new `Base` reporter. * * All other reporters generally * inherit from this reporter, providing * stats such as test duration, number * of tests passed / failed etc. * * @param {Runner} runner * @api public */ function Base(runner) { var self = this , stats = this.stats = { suites: 0, tests: 0, passes: 0, pending: 0, failures: 0 } , failures = this.failures = []; if (!runner) return; this.runner = runner; runner.stats = stats; runner.on('start', function(){ stats.start = new Date; }); runner.on('suite', function(suite){ stats.suites = stats.suites || 0; suite.root || stats.suites++; }); runner.on('test end', function(test){ stats.tests = stats.tests || 0; stats.tests++; }); runner.on('pass', function(test){ stats.passes = stats.passes || 0; var medium = test.slow() / 2; test.speed = test.duration > test.slow() ? 'slow' : test.duration > medium ? 'medium' : 'fast'; stats.passes++; }); runner.on('fail', function(test, err){ stats.failures = stats.failures || 0; stats.failures++; test.err = err; failures.push(test); }); runner.on('end', function(){ stats.end = new Date; stats.duration = new Date - stats.start; }); runner.on('pending', function(){ stats.pending++; }); } /** * Output common epilogue used by many of * the bundled reporters. * * @api public */ Base.prototype.epilogue = function(){ var stats = this.stats; var tests; var fmt; console.log(); // passes fmt = color('bright pass', ' ') + color('green', ' %d passing') + color('light', ' (%s)'); console.log(fmt, stats.passes || 0, ms(stats.duration)); // pending if (stats.pending) { fmt = color('pending', ' ') + color('pending', ' %d pending'); console.log(fmt, stats.pending); } // failures if (stats.failures) { fmt = color('fail', ' %d failing'); console.error(fmt, stats.failures); Base.list(this.failures); console.error(); } console.log(); }; /** * Pad the given `str` to `len`. * * @param {String} str * @param {String} len * @return {String} * @api private */ function pad(str, len) { str = String(str); return Array(len - str.length + 1).join(' ') + str; } /** * Return a character diff for `err`. * * @param {Error} err * @return {String} * @api private */ function errorDiff(err, type, escape) { return diff['diff' + type](err.actual, err.expected).map(function(str){ if (escape) { str.value = str.value .replace(/\t/g, '') .replace(/\r/g, '') .replace(/\n/g, '\n'); } if (str.added) return colorLines('diff added', str.value); if (str.removed) return colorLines('diff removed', str.value); return str.value; }).join(''); } /** * Color lines for `str`, using the color `name`. * * @param {String} name * @param {String} str * @return {String} * @api private */ function colorLines(name, str) { return str.split('\n').map(function(str){ return color(name, str); }).join('\n'); } /** * Stringify `obj`. * * @param {Mixed} obj * @return {String} * @api private */ function stringify(obj) { if (obj instanceof RegExp) return obj.toString(); return JSON.stringify(obj, null, 2); } /** * Check that a / b have the same type. * * @param {Object} a * @param {Object} b * @return {Boolean} * @api private */ function sameType(a, b) { a = Object.prototype.toString.call(a); b = Object.prototype.toString.call(b); return a == b; } }); // module: reporters/base.js require.register("reporters/doc.js", function(module, exports, require){ /** * Module dependencies. */ var Base = require('./base') , utils = require('../utils'); /** * Expose `Doc`. */ exports = module.exports = Doc; /** * Initialize a new `Doc` reporter. * * @param {Runner} runner * @api public */ function Doc(runner) { Base.call(this, runner); var self = this , stats = this.stats , total = runner.total , indents = 2; function indent() { return Array(indents).join(' '); } runner.on('suite', function(suite){ if (suite.root) return; ++indents; console.log('%s
', indent()); ++indents; console.log('%s

%s

', indent(), utils.escape(suite.title)); console.log('%s
', indent()); }); runner.on('suite end', function(suite){ if (suite.root) return; console.log('%s
', indent()); --indents; console.log('%s
', indent()); --indents; }); runner.on('pass', function(test){ console.log('%s
%s
', indent(), utils.escape(test.title)); var code = utils.escape(utils.clean(test.fn.toString())); console.log('%s
%s
', indent(), code); }); } }); // module: reporters/doc.js require.register("reporters/dot.js", function(module, exports, require){ /** * Module dependencies. */ var Base = require('./base') , color = Base.color; /** * Expose `Dot`. */ exports = module.exports = Dot; /** * Initialize a new `Dot` matrix test reporter. * * @param {Runner} runner * @api public */ function Dot(runner) { Base.call(this, runner); var self = this , stats = this.stats , width = Base.window.width * .75 | 0 , n = 0; runner.on('start', function(){ process.stdout.write('\n '); }); runner.on('pending', function(test){ process.stdout.write(color('pending', Base.symbols.dot)); }); runner.on('pass', function(test){ if (++n % width == 0) process.stdout.write('\n '); if ('slow' == test.speed) { process.stdout.write(color('bright yellow', Base.symbols.dot)); } else { process.stdout.write(color(test.speed, Base.symbols.dot)); } }); runner.on('fail', function(test, err){ if (++n % width == 0) process.stdout.write('\n '); process.stdout.write(color('fail', Base.symbols.dot)); }); runner.on('end', function(){ console.log(); self.epilogue(); }); } /** * Inherit from `Base.prototype`. */ function F(){}; F.prototype = Base.prototype; Dot.prototype = new F; Dot.prototype.constructor = Dot; }); // module: reporters/dot.js require.register("reporters/html-cov.js", function(module, exports, require){ /** * Module dependencies. */ var JSONCov = require('./json-cov') , fs = require('browser/fs'); /** * Expose `HTMLCov`. */ exports = module.exports = HTMLCov; /** * Initialize a new `JsCoverage` reporter. * * @param {Runner} runner * @api public */ function HTMLCov(runner) { var jade = require('jade') , file = __dirname + '/templates/coverage.jade' , str = fs.readFileSync(file, 'utf8') , fn = jade.compile(str, { filename: file }) , self = this; JSONCov.call(this, runner, false); runner.on('end', function(){ process.stdout.write(fn({ cov: self.cov , coverageClass: coverageClass })); }); } /** * Return coverage class for `n`. * * @return {String} * @api private */ function coverageClass(n) { if (n >= 75) return 'high'; if (n >= 50) return 'medium'; if (n >= 25) return 'low'; return 'terrible'; } }); // module: reporters/html-cov.js require.register("reporters/html.js", function(module, exports, require){ /** * Module dependencies. */ var Base = require('./base') , utils = require('../utils') , Progress = require('../browser/progress') , escape = utils.escape; /** * Save timer references to avoid Sinon interfering (see GH-237). */ var Date = global.Date , setTimeout = global.setTimeout , setInterval = global.setInterval , clearTimeout = global.clearTimeout , clearInterval = global.clearInterval; /** * Expose `Doc`. */ exports = module.exports = HTML; /** * Stats template. */ var statsTemplate = ''; /** * Initialize a new `Doc` reporter. * * @param {Runner} runner * @api public */ function HTML(runner, root) { Base.call(this, runner); var self = this , stats = this.stats , total = runner.total , stat = fragment(statsTemplate) , items = stat.getElementsByTagName('li') , passes = items[1].getElementsByTagName('em')[0] , passesLink = items[1].getElementsByTagName('a')[0] , failures = items[2].getElementsByTagName('em')[0] , failuresLink = items[2].getElementsByTagName('a')[0] , duration = items[3].getElementsByTagName('em')[0] , canvas = stat.getElementsByTagName('canvas')[0] , report = fragment('
    ') , stack = [report] , progress , ctx root = root || document.getElementById('mocha'); if (canvas.getContext) { var ratio = window.devicePixelRatio || 1; canvas.style.width = canvas.width; canvas.style.height = canvas.height; canvas.width *= ratio; canvas.height *= ratio; ctx = canvas.getContext('2d'); ctx.scale(ratio, ratio); progress = new Progress; } if (!root) return error('#mocha div missing, add it to your document'); // pass toggle on(passesLink, 'click', function(){ unhide(); var name = /pass/.test(report.className) ? '' : ' pass'; report.className = report.className.replace(/fail|pass/g, '') + name; if (report.className.trim()) hideSuitesWithout('test pass'); }); // failure toggle on(failuresLink, 'click', function(){ unhide(); var name = /fail/.test(report.className) ? '' : ' fail'; report.className = report.className.replace(/fail|pass/g, '') + name; if (report.className.trim()) hideSuitesWithout('test fail'); }); root.appendChild(stat); root.appendChild(report); if (progress) progress.size(40); runner.on('suite', function(suite){ if (suite.root) return; // suite var url = '?grep=' + encodeURIComponent(suite.fullTitle()); var el = fragment('
  • %s

  • ', url, escape(suite.title)); // container stack[0].appendChild(el); stack.unshift(document.createElement('ul')); el.appendChild(stack[0]); }); runner.on('suite end', function(suite){ if (suite.root) return; stack.shift(); }); runner.on('fail', function(test, err){ if ('hook' == test.type) runner.emit('test end', test); }); runner.on('test end', function(test){ // TODO: add to stats var percent = stats.tests / this.total * 100 | 0; if (progress) progress.update(percent).draw(ctx); // update stats var ms = new Date - stats.start; text(passes, stats.passes); text(failures, stats.failures); text(duration, (ms / 1000).toFixed(2)); // test if ('passed' == test.state) { var el = fragment('
  • %e%ems ‣

  • ', test.speed, test.title, test.duration, encodeURIComponent(test.fullTitle())); } else if (test.pending) { var el = fragment('
  • %e

  • ', test.title); } else { var el = fragment('
  • %e ‣

  • ', test.title, encodeURIComponent(test.fullTitle())); var str = test.err.stack || test.err.toString(); // FF / Opera do not add the message if (!~str.indexOf(test.err.message)) { str = test.err.message + '\n' + str; } // <=IE7 stringifies to [Object Error]. Since it can be overloaded, we // check for the result of the stringifying. if ('[object Error]' == str) str = test.err.message; // Safari doesn't give you a stack. Let's at least provide a source line. if (!test.err.stack && test.err.sourceURL && test.err.line !== undefined) { str += "\n(" + test.err.sourceURL + ":" + test.err.line + ")"; } el.appendChild(fragment('
    %e
    ', str)); } // toggle code // TODO: defer if (!test.pending) { var h2 = el.getElementsByTagName('h2')[0]; on(h2, 'click', function(){ pre.style.display = 'none' == pre.style.display ? 'block' : 'none'; }); var pre = fragment('
    %e
    ', utils.clean(test.fn.toString())); el.appendChild(pre); pre.style.display = 'none'; } // Don't call .appendChild if #mocha-report was already .shift()'ed off the stack. if (stack[0]) stack[0].appendChild(el); }); } /** * Display error `msg`. */ function error(msg) { document.body.appendChild(fragment('
    %s
    ', msg)); } /** * Return a DOM fragment from `html`. */ function fragment(html) { var args = arguments , div = document.createElement('div') , i = 1; div.innerHTML = html.replace(/%([se])/g, function(_, type){ switch (type) { case 's': return String(args[i++]); case 'e': return escape(args[i++]); } }); return div.firstChild; } /** * Check for suites that do not have elements * with `classname`, and hide them. */ function hideSuitesWithout(classname) { var suites = document.getElementsByClassName('suite'); for (var i = 0; i < suites.length; i++) { var els = suites[i].getElementsByClassName(classname); if (0 == els.length) suites[i].className += ' hidden'; } } /** * Unhide .hidden suites. */ function unhide() { var els = document.getElementsByClassName('suite hidden'); for (var i = 0; i < els.length; ++i) { els[i].className = els[i].className.replace('suite hidden', 'suite'); } } /** * Set `el` text to `str`. */ function text(el, str) { if (el.textContent) { el.textContent = str; } else { el.innerText = str; } } /** * Listen on `event` with callback `fn`. */ function on(el, event, fn) { if (el.addEventListener) { el.addEventListener(event, fn, false); } else { el.attachEvent('on' + event, fn); } } }); // module: reporters/html.js require.register("reporters/index.js", function(module, exports, require){ exports.Base = require('./base'); exports.Dot = require('./dot'); exports.Doc = require('./doc'); exports.TAP = require('./tap'); exports.JSON = require('./json'); exports.HTML = require('./html'); exports.List = require('./list'); exports.Min = require('./min'); exports.Spec = require('./spec'); exports.Nyan = require('./nyan'); exports.XUnit = require('./xunit'); exports.Markdown = require('./markdown'); exports.Progress = require('./progress'); exports.Landing = require('./landing'); exports.JSONCov = require('./json-cov'); exports.HTMLCov = require('./html-cov'); exports.JSONStream = require('./json-stream'); exports.Teamcity = require('./teamcity'); }); // module: reporters/index.js require.register("reporters/json-cov.js", function(module, exports, require){ /** * Module dependencies. */ var Base = require('./base'); /** * Expose `JSONCov`. */ exports = module.exports = JSONCov; /** * Initialize a new `JsCoverage` reporter. * * @param {Runner} runner * @param {Boolean} output * @api public */ function JSONCov(runner, output) { var self = this , output = 1 == arguments.length ? true : output; Base.call(this, runner); var tests = [] , failures = [] , passes = []; runner.on('test end', function(test){ tests.push(test); }); runner.on('pass', function(test){ passes.push(test); }); runner.on('fail', function(test){ failures.push(test); }); runner.on('end', function(){ var cov = global._$jscoverage || {}; var result = self.cov = map(cov); result.stats = self.stats; result.tests = tests.map(clean); result.failures = failures.map(clean); result.passes = passes.map(clean); if (!output) return; process.stdout.write(JSON.stringify(result, null, 2 )); }); } /** * Map jscoverage data to a JSON structure * suitable for reporting. * * @param {Object} cov * @return {Object} * @api private */ function map(cov) { var ret = { instrumentation: 'node-jscoverage' , sloc: 0 , hits: 0 , misses: 0 , coverage: 0 , files: [] }; for (var filename in cov) { var data = coverage(filename, cov[filename]); ret.files.push(data); ret.hits += data.hits; ret.misses += data.misses; ret.sloc += data.sloc; } ret.files.sort(function(a, b) { return a.filename.localeCompare(b.filename); }); if (ret.sloc > 0) { ret.coverage = (ret.hits / ret.sloc) * 100; } return ret; }; /** * Map jscoverage data for a single source file * to a JSON structure suitable for reporting. * * @param {String} filename name of the source file * @param {Object} data jscoverage coverage data * @return {Object} * @api private */ function coverage(filename, data) { var ret = { filename: filename, coverage: 0, hits: 0, misses: 0, sloc: 0, source: {} }; data.source.forEach(function(line, num){ num++; if (data[num] === 0) { ret.misses++; ret.sloc++; } else if (data[num] !== undefined) { ret.hits++; ret.sloc++; } ret.source[num] = { source: line , coverage: data[num] === undefined ? '' : data[num] }; }); ret.coverage = ret.hits / ret.sloc * 100; return ret; } /** * Return a plain-object representation of `test` * free of cyclic properties etc. * * @param {Object} test * @return {Object} * @api private */ function clean(test) { return { title: test.title , fullTitle: test.fullTitle() , duration: test.duration } } }); // module: reporters/json-cov.js require.register("reporters/json-stream.js", function(module, exports, require){ /** * Module dependencies. */ var Base = require('./base') , color = Base.color; /** * Expose `List`. */ exports = module.exports = List; /** * Initialize a new `List` test reporter. * * @param {Runner} runner * @api public */ function List(runner) { Base.call(this, runner); var self = this , stats = this.stats , total = runner.total; runner.on('start', function(){ console.log(JSON.stringify(['start', { total: total }])); }); runner.on('pass', function(test){ console.log(JSON.stringify(['pass', clean(test)])); }); runner.on('fail', function(test, err){ console.log(JSON.stringify(['fail', clean(test)])); }); runner.on('end', function(){ process.stdout.write(JSON.stringify(['end', self.stats])); }); } /** * Return a plain-object representation of `test` * free of cyclic properties etc. * * @param {Object} test * @return {Object} * @api private */ function clean(test) { return { title: test.title , fullTitle: test.fullTitle() , duration: test.duration } } }); // module: reporters/json-stream.js require.register("reporters/json.js", function(module, exports, require){ /** * Module dependencies. */ var Base = require('./base') , cursor = Base.cursor , color = Base.color; /** * Expose `JSON`. */ exports = module.exports = JSONReporter; /** * Initialize a new `JSON` reporter. * * @param {Runner} runner * @api public */ function JSONReporter(runner) { var self = this; Base.call(this, runner); var tests = [] , failures = [] , passes = []; runner.on('test end', function(test){ tests.push(test); }); runner.on('pass', function(test){ passes.push(test); }); runner.on('fail', function(test){ failures.push(test); }); runner.on('end', function(){ var obj = { stats: self.stats , tests: tests.map(clean) , failures: failures.map(clean) , passes: passes.map(clean) }; process.stdout.write(JSON.stringify(obj, null, 2)); }); } /** * Return a plain-object representation of `test` * free of cyclic properties etc. * * @param {Object} test * @return {Object} * @api private */ function clean(test) { return { title: test.title , fullTitle: test.fullTitle() , duration: test.duration } } }); // module: reporters/json.js require.register("reporters/landing.js", function(module, exports, require){ /** * Module dependencies. */ var Base = require('./base') , cursor = Base.cursor , color = Base.color; /** * Expose `Landing`. */ exports = module.exports = Landing; /** * Airplane color. */ Base.colors.plane = 0; /** * Airplane crash color. */ Base.colors['plane crash'] = 31; /** * Runway color. */ Base.colors.runway = 90; /** * Initialize a new `Landing` reporter. * * @param {Runner} runner * @api public */ function Landing(runner) { Base.call(this, runner); var self = this , stats = this.stats , width = Base.window.width * .75 | 0 , total = runner.total , stream = process.stdout , plane = color('plane', '✈') , crashed = -1 , n = 0; function runway() { var buf = Array(width).join('-'); return ' ' + color('runway', buf); } runner.on('start', function(){ stream.write('\n '); cursor.hide(); }); runner.on('test end', function(test){ // check if the plane crashed var col = -1 == crashed ? width * ++n / total | 0 : crashed; // show the crash if ('failed' == test.state) { plane = color('plane crash', '✈'); crashed = col; } // render landing strip stream.write('\u001b[4F\n\n'); stream.write(runway()); stream.write('\n '); stream.write(color('runway', Array(col).join('ā‹…'))); stream.write(plane) stream.write(color('runway', Array(width - col).join('ā‹…') + '\n')); stream.write(runway()); stream.write('\u001b[0m'); }); runner.on('end', function(){ cursor.show(); console.log(); self.epilogue(); }); } /** * Inherit from `Base.prototype`. */ function F(){}; F.prototype = Base.prototype; Landing.prototype = new F; Landing.prototype.constructor = Landing; }); // module: reporters/landing.js require.register("reporters/list.js", function(module, exports, require){ /** * Module dependencies. */ var Base = require('./base') , cursor = Base.cursor , color = Base.color; /** * Expose `List`. */ exports = module.exports = List; /** * Initialize a new `List` test reporter. * * @param {Runner} runner * @api public */ function List(runner) { Base.call(this, runner); var self = this , stats = this.stats , n = 0; runner.on('start', function(){ console.log(); }); runner.on('test', function(test){ process.stdout.write(color('pass', ' ' + test.fullTitle() + ': ')); }); runner.on('pending', function(test){ var fmt = color('checkmark', ' -') + color('pending', ' %s'); console.log(fmt, test.fullTitle()); }); runner.on('pass', function(test){ var fmt = color('checkmark', ' '+Base.symbols.dot) + color('pass', ' %s: ') + color(test.speed, '%dms'); cursor.CR(); console.log(fmt, test.fullTitle(), test.duration); }); runner.on('fail', function(test, err){ cursor.CR(); console.log(color('fail', ' %d) %s'), ++n, test.fullTitle()); }); runner.on('end', self.epilogue.bind(self)); } /** * Inherit from `Base.prototype`. */ function F(){}; F.prototype = Base.prototype; List.prototype = new F; List.prototype.constructor = List; }); // module: reporters/list.js require.register("reporters/markdown.js", function(module, exports, require){ /** * Module dependencies. */ var Base = require('./base') , utils = require('../utils'); /** * Expose `Markdown`. */ exports = module.exports = Markdown; /** * Initialize a new `Markdown` reporter. * * @param {Runner} runner * @api public */ function Markdown(runner) { Base.call(this, runner); var self = this , stats = this.stats , level = 0 , buf = ''; function title(str) { return Array(level).join('#') + ' ' + str; } function indent() { return Array(level).join(' '); } function mapTOC(suite, obj) { var ret = obj; obj = obj[suite.title] = obj[suite.title] || { suite: suite }; suite.suites.forEach(function(suite){ mapTOC(suite, obj); }); return ret; } function stringifyTOC(obj, level) { ++level; var buf = ''; var link; for (var key in obj) { if ('suite' == key) continue; if (key) link = ' - [' + key + '](#' + utils.slug(obj[key].suite.fullTitle()) + ')\n'; if (key) buf += Array(level).join(' ') + link; buf += stringifyTOC(obj[key], level); } --level; return buf; } function generateTOC(suite) { var obj = mapTOC(suite, {}); return stringifyTOC(obj, 0); } generateTOC(runner.suite); runner.on('suite', function(suite){ ++level; var slug = utils.slug(suite.fullTitle()); buf += '' + '\n'; buf += title(suite.title) + '\n'; }); runner.on('suite end', function(suite){ --level; }); runner.on('pass', function(test){ var code = utils.clean(test.fn.toString()); buf += test.title + '.\n'; buf += '\n```js\n'; buf += code + '\n'; buf += '```\n\n'; }); runner.on('end', function(){ process.stdout.write('# TOC\n'); process.stdout.write(generateTOC(runner.suite)); process.stdout.write(buf); }); } }); // module: reporters/markdown.js require.register("reporters/min.js", function(module, exports, require){ /** * Module dependencies. */ var Base = require('./base'); /** * Expose `Min`. */ exports = module.exports = Min; /** * Initialize a new `Min` minimal test reporter (best used with --watch). * * @param {Runner} runner * @api public */ function Min(runner) { Base.call(this, runner); runner.on('start', function(){ // clear screen process.stdout.write('\u001b[2J'); // set cursor position process.stdout.write('\u001b[1;3H'); }); runner.on('end', this.epilogue.bind(this)); } /** * Inherit from `Base.prototype`. */ function F(){}; F.prototype = Base.prototype; Min.prototype = new F; Min.prototype.constructor = Min; }); // module: reporters/min.js require.register("reporters/nyan.js", function(module, exports, require){ /** * Module dependencies. */ var Base = require('./base') , color = Base.color; /** * Expose `Dot`. */ exports = module.exports = NyanCat; /** * Initialize a new `Dot` matrix test reporter. * * @param {Runner} runner * @api public */ function NyanCat(runner) { Base.call(this, runner); var self = this , stats = this.stats , width = Base.window.width * .75 | 0 , rainbowColors = this.rainbowColors = self.generateColors() , colorIndex = this.colorIndex = 0 , numerOfLines = this.numberOfLines = 4 , trajectories = this.trajectories = [[], [], [], []] , nyanCatWidth = this.nyanCatWidth = 11 , trajectoryWidthMax = this.trajectoryWidthMax = (width - nyanCatWidth) , scoreboardWidth = this.scoreboardWidth = 5 , tick = this.tick = 0 , n = 0; runner.on('start', function(){ Base.cursor.hide(); self.draw('start'); }); runner.on('pending', function(test){ self.draw('pending'); }); runner.on('pass', function(test){ self.draw('pass'); }); runner.on('fail', function(test, err){ self.draw('fail'); }); runner.on('end', function(){ Base.cursor.show(); for (var i = 0; i < self.numberOfLines; i++) write('\n'); self.epilogue(); }); } /** * Draw the nyan cat with runner `status`. * * @param {String} status * @api private */ NyanCat.prototype.draw = function(status){ this.appendRainbow(); this.drawScoreboard(); this.drawRainbow(); this.drawNyanCat(status); this.tick = !this.tick; }; /** * Draw the "scoreboard" showing the number * of passes, failures and pending tests. * * @api private */ NyanCat.prototype.drawScoreboard = function(){ var stats = this.stats; var colors = Base.colors; function draw(color, n) { write(' '); write('\u001b[' + color + 'm' + n + '\u001b[0m'); write('\n'); } draw(colors.green, stats.passes); draw(colors.fail, stats.failures); draw(colors.pending, stats.pending); write('\n'); this.cursorUp(this.numberOfLines); }; /** * Append the rainbow. * * @api private */ NyanCat.prototype.appendRainbow = function(){ var segment = this.tick ? '_' : '-'; var rainbowified = this.rainbowify(segment); for (var index = 0; index < this.numberOfLines; index++) { var trajectory = this.trajectories[index]; if (trajectory.length >= this.trajectoryWidthMax) trajectory.shift(); trajectory.push(rainbowified); } }; /** * Draw the rainbow. * * @api private */ NyanCat.prototype.drawRainbow = function(){ var self = this; this.trajectories.forEach(function(line, index) { write('\u001b[' + self.scoreboardWidth + 'C'); write(line.join('')); write('\n'); }); this.cursorUp(this.numberOfLines); }; /** * Draw the nyan cat with `status`. * * @param {String} status * @api private */ NyanCat.prototype.drawNyanCat = function(status) { var self = this; var startWidth = this.scoreboardWidth + this.trajectories[0].length; var color = '\u001b[' + startWidth + 'C'; var padding = ''; write(color); write('_,------,'); write('\n'); write(color); padding = self.tick ? ' ' : ' '; write('_|' + padding + '/\\_/\\ '); write('\n'); write(color); padding = self.tick ? '_' : '__'; var tail = self.tick ? '~' : '^'; var face; switch (status) { case 'pass': face = '( ^ .^)'; break; case 'fail': face = '( o .o)'; break; default: face = '( - .-)'; } write(tail + '|' + padding + face + ' '); write('\n'); write(color); padding = self.tick ? ' ' : ' '; write(padding + '"" "" '); write('\n'); this.cursorUp(this.numberOfLines); }; /** * Move cursor up `n`. * * @param {Number} n * @api private */ NyanCat.prototype.cursorUp = function(n) { write('\u001b[' + n + 'A'); }; /** * Move cursor down `n`. * * @param {Number} n * @api private */ NyanCat.prototype.cursorDown = function(n) { write('\u001b[' + n + 'B'); }; /** * Generate rainbow colors. * * @return {Array} * @api private */ NyanCat.prototype.generateColors = function(){ var colors = []; for (var i = 0; i < (6 * 7); i++) { var pi3 = Math.floor(Math.PI / 3); var n = (i * (1.0 / 6)); var r = Math.floor(3 * Math.sin(n) + 3); var g = Math.floor(3 * Math.sin(n + 2 * pi3) + 3); var b = Math.floor(3 * Math.sin(n + 4 * pi3) + 3); colors.push(36 * r + 6 * g + b + 16); } return colors; }; /** * Apply rainbow to the given `str`. * * @param {String} str * @return {String} * @api private */ NyanCat.prototype.rainbowify = function(str){ var color = this.rainbowColors[this.colorIndex % this.rainbowColors.length]; this.colorIndex += 1; return '\u001b[38;5;' + color + 'm' + str + '\u001b[0m'; }; /** * Stdout helper. */ function write(string) { process.stdout.write(string); } /** * Inherit from `Base.prototype`. */ function F(){}; F.prototype = Base.prototype; NyanCat.prototype = new F; NyanCat.prototype.constructor = NyanCat; }); // module: reporters/nyan.js require.register("reporters/progress.js", function(module, exports, require){ /** * Module dependencies. */ var Base = require('./base') , cursor = Base.cursor , color = Base.color; /** * Expose `Progress`. */ exports = module.exports = Progress; /** * General progress bar color. */ Base.colors.progress = 90; /** * Initialize a new `Progress` bar test reporter. * * @param {Runner} runner * @param {Object} options * @api public */ function Progress(runner, options) { Base.call(this, runner); var self = this , options = options || {} , stats = this.stats , width = Base.window.width * .50 | 0 , total = runner.total , complete = 0 , max = Math.max; // default chars options.open = options.open || '['; options.complete = options.complete || 'ā–¬'; options.incomplete = options.incomplete || Base.symbols.dot; options.close = options.close || ']'; options.verbose = false; // tests started runner.on('start', function(){ console.log(); cursor.hide(); }); // tests complete runner.on('test end', function(){ complete++; var incomplete = total - complete , percent = complete / total , n = width * percent | 0 , i = width - n; cursor.CR(); process.stdout.write('\u001b[J'); process.stdout.write(color('progress', ' ' + options.open)); process.stdout.write(Array(n).join(options.complete)); process.stdout.write(Array(i).join(options.incomplete)); process.stdout.write(color('progress', options.close)); if (options.verbose) { process.stdout.write(color('progress', ' ' + complete + ' of ' + total)); } }); // tests are complete, output some stats // and the failures if any runner.on('end', function(){ cursor.show(); console.log(); self.epilogue(); }); } /** * Inherit from `Base.prototype`. */ function F(){}; F.prototype = Base.prototype; Progress.prototype = new F; Progress.prototype.constructor = Progress; }); // module: reporters/progress.js require.register("reporters/spec.js", function(module, exports, require){ /** * Module dependencies. */ var Base = require('./base') , cursor = Base.cursor , color = Base.color; /** * Expose `Spec`. */ exports = module.exports = Spec; /** * Initialize a new `Spec` test reporter. * * @param {Runner} runner * @api public */ function Spec(runner) { Base.call(this, runner); var self = this , stats = this.stats , indents = 0 , n = 0; function indent() { return Array(indents).join(' ') } runner.on('start', function(){ console.log(); }); runner.on('suite', function(suite){ ++indents; console.log(color('suite', '%s%s'), indent(), suite.title); }); runner.on('suite end', function(suite){ --indents; if (1 == indents) console.log(); }); runner.on('test', function(test){ process.stdout.write(indent() + color('pass', ' ā—¦ ' + test.title + ': ')); }); runner.on('pending', function(test){ var fmt = indent() + color('pending', ' - %s'); console.log(fmt, test.title); }); runner.on('pass', function(test){ if ('fast' == test.speed) { var fmt = indent() + color('checkmark', ' ' + Base.symbols.ok) + color('pass', ' %s '); cursor.CR(); console.log(fmt, test.title); } else { var fmt = indent() + color('checkmark', ' ' + Base.symbols.ok) + color('pass', ' %s ') + color(test.speed, '(%dms)'); cursor.CR(); console.log(fmt, test.title, test.duration); } }); runner.on('fail', function(test, err){ cursor.CR(); console.log(indent() + color('fail', ' %d) %s'), ++n, test.title); }); runner.on('end', self.epilogue.bind(self)); } /** * Inherit from `Base.prototype`. */ function F(){}; F.prototype = Base.prototype; Spec.prototype = new F; Spec.prototype.constructor = Spec; }); // module: reporters/spec.js require.register("reporters/tap.js", function(module, exports, require){ /** * Module dependencies. */ var Base = require('./base') , cursor = Base.cursor , color = Base.color; /** * Expose `TAP`. */ exports = module.exports = TAP; /** * Initialize a new `TAP` reporter. * * @param {Runner} runner * @api public */ function TAP(runner) { Base.call(this, runner); var self = this , stats = this.stats , n = 1 , passes = 0 , failures = 0; runner.on('start', function(){ var total = runner.grepTotal(runner.suite); console.log('%d..%d', 1, total); }); runner.on('test end', function(){ ++n; }); runner.on('pending', function(test){ console.log('ok %d %s # SKIP -', n, title(test)); }); runner.on('pass', function(test){ passes++; console.log('ok %d %s', n, title(test)); }); runner.on('fail', function(test, err){ failures++; console.log('not ok %d %s', n, title(test)); if (err.stack) console.log(err.stack.replace(/^/gm, ' ')); }); runner.on('end', function(){ console.log('# tests ' + (passes + failures)); console.log('# pass ' + passes); console.log('# fail ' + failures); }); } /** * Return a TAP-safe title of `test` * * @param {Object} test * @return {String} * @api private */ function title(test) { return test.fullTitle().replace(/#/g, ''); } }); // module: reporters/tap.js require.register("reporters/teamcity.js", function(module, exports, require){ /** * Module dependencies. */ var Base = require('./base'); /** * Expose `Teamcity`. */ exports = module.exports = Teamcity; /** * Initialize a new `Teamcity` reporter. * * @param {Runner} runner * @api public */ function Teamcity(runner) { Base.call(this, runner); var stats = this.stats; runner.on('start', function() { console.log("##teamcity[testSuiteStarted name='mocha.suite']"); }); runner.on('test', function(test) { console.log("##teamcity[testStarted name='" + escape(test.fullTitle()) + "']"); }); runner.on('fail', function(test, err) { console.log("##teamcity[testFailed name='" + escape(test.fullTitle()) + "' message='" + escape(err.message) + "']"); }); runner.on('pending', function(test) { console.log("##teamcity[testIgnored name='" + escape(test.fullTitle()) + "' message='pending']"); }); runner.on('test end', function(test) { console.log("##teamcity[testFinished name='" + escape(test.fullTitle()) + "' duration='" + test.duration + "']"); }); runner.on('end', function() { console.log("##teamcity[testSuiteFinished name='mocha.suite' duration='" + stats.duration + "']"); }); } /** * Escape the given `str`. */ function escape(str) { return str .replace(/\|/g, "||") .replace(/\n/g, "|n") .replace(/\r/g, "|r") .replace(/\[/g, "|[") .replace(/\]/g, "|]") .replace(/\u0085/g, "|x") .replace(/\u2028/g, "|l") .replace(/\u2029/g, "|p") .replace(/'/g, "|'"); } }); // module: reporters/teamcity.js require.register("reporters/xunit.js", function(module, exports, require){ /** * Module dependencies. */ var Base = require('./base') , utils = require('../utils') , escape = utils.escape; /** * Save timer references to avoid Sinon interfering (see GH-237). */ var Date = global.Date , setTimeout = global.setTimeout , setInterval = global.setInterval , clearTimeout = global.clearTimeout , clearInterval = global.clearInterval; /** * Expose `XUnit`. */ exports = module.exports = XUnit; /** * Initialize a new `XUnit` reporter. * * @param {Runner} runner * @api public */ function XUnit(runner) { Base.call(this, runner); var stats = this.stats , tests = [] , self = this; runner.on('pass', function(test){ tests.push(test); }); runner.on('fail', function(test){ tests.push(test); }); runner.on('end', function(){ console.log(tag('testsuite', { name: 'Mocha Tests' , tests: stats.tests , failures: stats.failures , errors: stats.failures , skipped: stats.tests - stats.failures - stats.passes , timestamp: (new Date).toUTCString() , time: (stats.duration / 1000) || 0 }, false)); tests.forEach(test); console.log(''); }); } /** * Inherit from `Base.prototype`. */ function F(){}; F.prototype = Base.prototype; XUnit.prototype = new F; XUnit.prototype.constructor = XUnit; /** * Output tag for the given `test.` */ function test(test) { var attrs = { classname: test.parent.fullTitle() , name: test.title , time: test.duration / 1000 }; if ('failed' == test.state) { var err = test.err; attrs.message = escape(err.message); console.log(tag('testcase', attrs, false, tag('failure', attrs, false, cdata(err.stack)))); } else if (test.pending) { console.log(tag('testcase', attrs, false, tag('skipped', {}, true))); } else { console.log(tag('testcase', attrs, true) ); } } /** * HTML tag helper. */ function tag(name, attrs, close, content) { var end = close ? '/>' : '>' , pairs = [] , tag; for (var key in attrs) { pairs.push(key + '="' + escape(attrs[key]) + '"'); } tag = '<' + name + (pairs.length ? ' ' + pairs.join(' ') : '') + end; if (content) tag += content + ''; } }); // module: reporters/xunit.js require.register("runnable.js", function(module, exports, require){ /** * Module dependencies. */ var EventEmitter = require('browser/events').EventEmitter , debug = require('browser/debug')('mocha:runnable') , milliseconds = require('./ms'); /** * Save timer references to avoid Sinon interfering (see GH-237). */ var Date = global.Date , setTimeout = global.setTimeout , setInterval = global.setInterval , clearTimeout = global.clearTimeout , clearInterval = global.clearInterval; /** * Object#toString(). */ var toString = Object.prototype.toString; /** * Expose `Runnable`. */ module.exports = Runnable; /** * Initialize a new `Runnable` with the given `title` and callback `fn`. * * @param {String} title * @param {Function} fn * @api private */ function Runnable(title, fn) { this.title = title; this.fn = fn; this.async = fn && fn.length; this.sync = ! this.async; this._timeout = 2000; this._slow = 75; this.timedOut = false; } /** * Inherit from `EventEmitter.prototype`. */ function F(){}; F.prototype = EventEmitter.prototype; Runnable.prototype = new F; Runnable.prototype.constructor = Runnable; /** * Set & get timeout `ms`. * * @param {Number|String} ms * @return {Runnable|Number} ms or self * @api private */ Runnable.prototype.timeout = function(ms){ if (0 == arguments.length) return this._timeout; if ('string' == typeof ms) ms = milliseconds(ms); debug('timeout %d', ms); this._timeout = ms; if (this.timer) this.resetTimeout(); return this; }; /** * Set & get slow `ms`. * * @param {Number|String} ms * @return {Runnable|Number} ms or self * @api private */ Runnable.prototype.slow = function(ms){ if (0 === arguments.length) return this._slow; if ('string' == typeof ms) ms = milliseconds(ms); debug('timeout %d', ms); this._slow = ms; return this; }; /** * Return the full title generated by recursively * concatenating the parent's full title. * * @return {String} * @api public */ Runnable.prototype.fullTitle = function(){ return this.parent.fullTitle() + ' ' + this.title; }; /** * Clear the timeout. * * @api private */ Runnable.prototype.clearTimeout = function(){ clearTimeout(this.timer); }; /** * Inspect the runnable void of private properties. * * @return {String} * @api private */ Runnable.prototype.inspect = function(){ return JSON.stringify(this, function(key, val){ if ('_' == key[0]) return; if ('parent' == key) return '#'; if ('ctx' == key) return '#'; return val; }, 2); }; /** * Reset the timeout. * * @api private */ Runnable.prototype.resetTimeout = function(){ var self = this; var ms = this.timeout() || 1e9; this.clearTimeout(); this.timer = setTimeout(function(){ self.callback(new Error('timeout of ' + ms + 'ms exceeded')); self.timedOut = true; }, ms); }; /** * Run the test and invoke `fn(err)`. * * @param {Function} fn * @api private */ Runnable.prototype.run = function(fn){ var self = this , ms = this.timeout() , start = new Date , ctx = this.ctx , finished , emitted; if (ctx) ctx.runnable(this); // timeout if (this.async) { if (ms) { this.timer = setTimeout(function(){ done(new Error('timeout of ' + ms + 'ms exceeded')); self.timedOut = true; }, ms); } } // called multiple times function multiple(err) { if (emitted) return; emitted = true; self.emit('error', err || new Error('done() called multiple times')); } // finished function done(err) { if (self.timedOut) return; if (finished) return multiple(err); self.clearTimeout(); self.duration = new Date - start; finished = true; fn(err); } // for .resetTimeout() this.callback = done; // async if (this.async) { try { this.fn.call(ctx, function(err){ if (err instanceof Error || toString.call(err) === "[object Error]") return done(err); if (null != err) return done(new Error('done() invoked with non-Error: ' + err)); done(); }); } catch (err) { done(err); } return; } if (this.asyncOnly) { return done(new Error('--async-only option in use without declaring `done()`')); } // sync try { if (!this.pending) this.fn.call(ctx); this.duration = new Date - start; fn(); } catch (err) { fn(err); } }; }); // module: runnable.js require.register("runner.js", function(module, exports, require){ /** * Module dependencies. */ var EventEmitter = require('browser/events').EventEmitter , debug = require('browser/debug')('mocha:runner') , Test = require('./test') , utils = require('./utils') , filter = utils.filter , keys = utils.keys; /** * Non-enumerable globals. */ var globals = [ 'setTimeout', 'clearTimeout', 'setInterval', 'clearInterval', 'XMLHttpRequest', 'Date' ]; /** * Expose `Runner`. */ module.exports = Runner; /** * Initialize a `Runner` for the given `suite`. * * Events: * * - `start` execution started * - `end` execution complete * - `suite` (suite) test suite execution started * - `suite end` (suite) all tests (and sub-suites) have finished * - `test` (test) test execution started * - `test end` (test) test completed * - `hook` (hook) hook execution started * - `hook end` (hook) hook complete * - `pass` (test) test passed * - `fail` (test, err) test failed * - `pending` (test) test pending * * @api public */ function Runner(suite) { var self = this; this._globals = []; this.suite = suite; this.total = suite.total(); this.failures = 0; this.on('test end', function(test){ self.checkGlobals(test); }); this.on('hook end', function(hook){ self.checkGlobals(hook); }); this.grep(/.*/); this.globals(this.globalProps().concat(['errno'])); } /** * Wrapper for setImmediate, process.nextTick, or browser polyfill. * * @param {Function} fn * @api private */ Runner.immediately = global.setImmediate || process.nextTick; /** * Inherit from `EventEmitter.prototype`. */ function F(){}; F.prototype = EventEmitter.prototype; Runner.prototype = new F; Runner.prototype.constructor = Runner; /** * Run tests with full titles matching `re`. Updates runner.total * with number of tests matched. * * @param {RegExp} re * @param {Boolean} invert * @return {Runner} for chaining * @api public */ Runner.prototype.grep = function(re, invert){ debug('grep %s', re); this._grep = re; this._invert = invert; this.total = this.grepTotal(this.suite); return this; }; /** * Returns the number of tests matching the grep search for the * given suite. * * @param {Suite} suite * @return {Number} * @api public */ Runner.prototype.grepTotal = function(suite) { var self = this; var total = 0; suite.eachTest(function(test){ var match = self._grep.test(test.fullTitle()); if (self._invert) match = !match; if (match) total++; }); return total; }; /** * Return a list of global properties. * * @return {Array} * @api private */ Runner.prototype.globalProps = function() { var props = utils.keys(global); // non-enumerables for (var i = 0; i < globals.length; ++i) { if (~utils.indexOf(props, globals[i])) continue; props.push(globals[i]); } return props; }; /** * Allow the given `arr` of globals. * * @param {Array} arr * @return {Runner} for chaining * @api public */ Runner.prototype.globals = function(arr){ if (0 == arguments.length) return this._globals; debug('globals %j', arr); utils.forEach(arr, function(arr){ this._globals.push(arr); }, this); return this; }; /** * Check for global variable leaks. * * @api private */ Runner.prototype.checkGlobals = function(test){ if (this.ignoreLeaks) return; var ok = this._globals; var globals = this.globalProps(); var isNode = process.kill; var leaks; // check length - 2 ('errno' and 'location' globals) if (isNode && 1 == ok.length - globals.length) return else if (2 == ok.length - globals.length) return; leaks = filterLeaks(ok, globals); this._globals = this._globals.concat(leaks); if (leaks.length > 1) { this.fail(test, new Error('global leaks detected: ' + leaks.join(', ') + '')); } else if (leaks.length) { this.fail(test, new Error('global leak detected: ' + leaks[0])); } }; /** * Fail the given `test`. * * @param {Test} test * @param {Error} err * @api private */ Runner.prototype.fail = function(test, err){ ++this.failures; test.state = 'failed'; if ('string' == typeof err) { err = new Error('the string "' + err + '" was thrown, throw an Error :)'); } this.emit('fail', test, err); }; /** * Fail the given `hook` with `err`. * * Hook failures (currently) hard-end due * to that fact that a failing hook will * surely cause subsequent tests to fail, * causing jumbled reporting. * * @param {Hook} hook * @param {Error} err * @api private */ Runner.prototype.failHook = function(hook, err){ this.fail(hook, err); this.emit('end'); }; /** * Run hook `name` callbacks and then invoke `fn()`. * * @param {String} name * @param {Function} function * @api private */ Runner.prototype.hook = function(name, fn){ var suite = this.suite , hooks = suite['_' + name] , self = this , timer; function next(i) { var hook = hooks[i]; if (!hook) return fn(); if (self.failures && suite.bail()) return fn(); self.currentRunnable = hook; hook.ctx.currentTest = self.test; self.emit('hook', hook); hook.on('error', function(err){ self.failHook(hook, err); }); hook.run(function(err){ hook.removeAllListeners('error'); var testError = hook.error(); if (testError) self.fail(self.test, testError); if (err) return self.failHook(hook, err); self.emit('hook end', hook); delete hook.ctx.currentTest; next(++i); }); } Runner.immediately(function(){ next(0); }); }; /** * Run hook `name` for the given array of `suites` * in order, and callback `fn(err)`. * * @param {String} name * @param {Array} suites * @param {Function} fn * @api private */ Runner.prototype.hooks = function(name, suites, fn){ var self = this , orig = this.suite; function next(suite) { self.suite = suite; if (!suite) { self.suite = orig; return fn(); } self.hook(name, function(err){ if (err) { self.suite = orig; return fn(err); } next(suites.pop()); }); } next(suites.pop()); }; /** * Run hooks from the top level down. * * @param {String} name * @param {Function} fn * @api private */ Runner.prototype.hookUp = function(name, fn){ var suites = [this.suite].concat(this.parents()).reverse(); this.hooks(name, suites, fn); }; /** * Run hooks from the bottom up. * * @param {String} name * @param {Function} fn * @api private */ Runner.prototype.hookDown = function(name, fn){ var suites = [this.suite].concat(this.parents()); this.hooks(name, suites, fn); }; /** * Return an array of parent Suites from * closest to furthest. * * @return {Array} * @api private */ Runner.prototype.parents = function(){ var suite = this.suite , suites = []; while (suite = suite.parent) suites.push(suite); return suites; }; /** * Run the current test and callback `fn(err)`. * * @param {Function} fn * @api private */ Runner.prototype.runTest = function(fn){ var test = this.test , self = this; if (this.asyncOnly) test.asyncOnly = true; try { test.on('error', function(err){ self.fail(test, err); }); test.run(fn); } catch (err) { fn(err); } }; /** * Run tests in the given `suite` and invoke * the callback `fn()` when complete. * * @param {Suite} suite * @param {Function} fn * @api private */ Runner.prototype.runTests = function(suite, fn){ var self = this , tests = suite.tests.slice() , test; function next(err) { // if we bail after first err if (self.failures && suite._bail) return fn(); // next test test = tests.shift(); // all done if (!test) return fn(); // grep var match = self._grep.test(test.fullTitle()); if (self._invert) match = !match; if (!match) return next(); // pending if (test.pending) { self.emit('pending', test); self.emit('test end', test); return next(); } // execute test and hook(s) self.emit('test', self.test = test); self.hookDown('beforeEach', function(){ self.currentRunnable = self.test; self.runTest(function(err){ test = self.test; if (err) { self.fail(test, err); self.emit('test end', test); return self.hookUp('afterEach', next); } test.state = 'passed'; self.emit('pass', test); self.emit('test end', test); self.hookUp('afterEach', next); }); }); } this.next = next; next(); }; /** * Run the given `suite` and invoke the * callback `fn()` when complete. * * @param {Suite} suite * @param {Function} fn * @api private */ Runner.prototype.runSuite = function(suite, fn){ var total = this.grepTotal(suite) , self = this , i = 0; debug('run suite %s', suite.fullTitle()); if (!total) return fn(); this.emit('suite', this.suite = suite); function next() { var curr = suite.suites[i++]; if (!curr) return done(); self.runSuite(curr, next); } function done() { self.suite = suite; self.hook('afterAll', function(){ self.emit('suite end', suite); fn(); }); } this.hook('beforeAll', function(){ self.runTests(suite, next); }); }; /** * Handle uncaught exceptions. * * @param {Error} err * @api private */ Runner.prototype.uncaught = function(err){ debug('uncaught exception %s', err.message); var runnable = this.currentRunnable; if (!runnable || 'failed' == runnable.state) return; runnable.clearTimeout(); err.uncaught = true; this.fail(runnable, err); // recover from test if ('test' == runnable.type) { this.emit('test end', runnable); this.hookUp('afterEach', this.next); return; } // bail on hooks this.emit('end'); }; /** * Run the root suite and invoke `fn(failures)` * on completion. * * @param {Function} fn * @return {Runner} for chaining * @api public */ Runner.prototype.run = function(fn){ var self = this , fn = fn || function(){}; function uncaught(err){ self.uncaught(err); } debug('start'); // callback this.on('end', function(){ debug('end'); process.removeListener('uncaughtException', uncaught); fn(self.failures); }); // run suites this.emit('start'); this.runSuite(this.suite, function(){ debug('finished running'); self.emit('end'); }); // uncaught exception process.on('uncaughtException', uncaught); return this; }; /** * Filter leaks with the given globals flagged as `ok`. * * @param {Array} ok * @param {Array} globals * @return {Array} * @api private */ function filterLeaks(ok, globals) { return filter(globals, function(key){ // Firefox and Chrome exposes iframes as index inside the window object if (/^d+/.test(key)) return false; var matched = filter(ok, function(ok){ if (~ok.indexOf('*')) return 0 == key.indexOf(ok.split('*')[0]); // Opera and IE expose global variables for HTML element IDs (issue #243) if (/^mocha-/.test(key)) return true; return key == ok; }); return matched.length == 0 && (!global.navigator || 'onerror' !== key); }); } }); // module: runner.js require.register("suite.js", function(module, exports, require){ /** * Module dependencies. */ var EventEmitter = require('browser/events').EventEmitter , debug = require('browser/debug')('mocha:suite') , milliseconds = require('./ms') , utils = require('./utils') , Hook = require('./hook'); /** * Expose `Suite`. */ exports = module.exports = Suite; /** * Create a new `Suite` with the given `title` * and parent `Suite`. When a suite with the * same title is already present, that suite * is returned to provide nicer reporter * and more flexible meta-testing. * * @param {Suite} parent * @param {String} title * @return {Suite} * @api public */ exports.create = function(parent, title){ var suite = new Suite(title, parent.ctx); suite.parent = parent; if (parent.pending) suite.pending = true; title = suite.fullTitle(); parent.addSuite(suite); return suite; }; /** * Initialize a new `Suite` with the given * `title` and `ctx`. * * @param {String} title * @param {Context} ctx * @api private */ function Suite(title, ctx) { this.title = title; this.ctx = ctx; this.suites = []; this.tests = []; this.pending = false; this._beforeEach = []; this._beforeAll = []; this._afterEach = []; this._afterAll = []; this.root = !title; this._timeout = 2000; this._slow = 75; this._bail = false; } /** * Inherit from `EventEmitter.prototype`. */ function F(){}; F.prototype = EventEmitter.prototype; Suite.prototype = new F; Suite.prototype.constructor = Suite; /** * Return a clone of this `Suite`. * * @return {Suite} * @api private */ Suite.prototype.clone = function(){ var suite = new Suite(this.title); debug('clone'); suite.ctx = this.ctx; suite.timeout(this.timeout()); suite.slow(this.slow()); suite.bail(this.bail()); return suite; }; /** * Set timeout `ms` or short-hand such as "2s". * * @param {Number|String} ms * @return {Suite|Number} for chaining * @api private */ Suite.prototype.timeout = function(ms){ if (0 == arguments.length) return this._timeout; if ('string' == typeof ms) ms = milliseconds(ms); debug('timeout %d', ms); this._timeout = parseInt(ms, 10); return this; }; /** * Set slow `ms` or short-hand such as "2s". * * @param {Number|String} ms * @return {Suite|Number} for chaining * @api private */ Suite.prototype.slow = function(ms){ if (0 === arguments.length) return this._slow; if ('string' == typeof ms) ms = milliseconds(ms); debug('slow %d', ms); this._slow = ms; return this; }; /** * Sets whether to bail after first error. * * @parma {Boolean} bail * @return {Suite|Number} for chaining * @api private */ Suite.prototype.bail = function(bail){ if (0 == arguments.length) return this._bail; debug('bail %s', bail); this._bail = bail; return this; }; /** * Run `fn(test[, done])` before running tests. * * @param {Function} fn * @return {Suite} for chaining * @api private */ Suite.prototype.beforeAll = function(fn){ if (this.pending) return this; var hook = new Hook('"before all" hook', fn); hook.parent = this; hook.timeout(this.timeout()); hook.slow(this.slow()); hook.ctx = this.ctx; this._beforeAll.push(hook); this.emit('beforeAll', hook); return this; }; /** * Run `fn(test[, done])` after running tests. * * @param {Function} fn * @return {Suite} for chaining * @api private */ Suite.prototype.afterAll = function(fn){ if (this.pending) return this; var hook = new Hook('"after all" hook', fn); hook.parent = this; hook.timeout(this.timeout()); hook.slow(this.slow()); hook.ctx = this.ctx; this._afterAll.push(hook); this.emit('afterAll', hook); return this; }; /** * Run `fn(test[, done])` before each test case. * * @param {Function} fn * @return {Suite} for chaining * @api private */ Suite.prototype.beforeEach = function(fn){ if (this.pending) return this; var hook = new Hook('"before each" hook', fn); hook.parent = this; hook.timeout(this.timeout()); hook.slow(this.slow()); hook.ctx = this.ctx; this._beforeEach.push(hook); this.emit('beforeEach', hook); return this; }; /** * Run `fn(test[, done])` after each test case. * * @param {Function} fn * @return {Suite} for chaining * @api private */ Suite.prototype.afterEach = function(fn){ if (this.pending) return this; var hook = new Hook('"after each" hook', fn); hook.parent = this; hook.timeout(this.timeout()); hook.slow(this.slow()); hook.ctx = this.ctx; this._afterEach.push(hook); this.emit('afterEach', hook); return this; }; /** * Add a test `suite`. * * @param {Suite} suite * @return {Suite} for chaining * @api private */ Suite.prototype.addSuite = function(suite){ suite.parent = this; suite.timeout(this.timeout()); suite.slow(this.slow()); suite.bail(this.bail()); this.suites.push(suite); this.emit('suite', suite); return this; }; /** * Add a `test` to this suite. * * @param {Test} test * @return {Suite} for chaining * @api private */ Suite.prototype.addTest = function(test){ test.parent = this; test.timeout(this.timeout()); test.slow(this.slow()); test.ctx = this.ctx; this.tests.push(test); this.emit('test', test); return this; }; /** * Return the full title generated by recursively * concatenating the parent's full title. * * @return {String} * @api public */ Suite.prototype.fullTitle = function(){ if (this.parent) { var full = this.parent.fullTitle(); if (full) return full + ' ' + this.title; } return this.title; }; /** * Return the total number of tests. * * @return {Number} * @api public */ Suite.prototype.total = function(){ return utils.reduce(this.suites, function(sum, suite){ return sum + suite.total(); }, 0) + this.tests.length; }; /** * Iterates through each suite recursively to find * all tests. Applies a function in the format * `fn(test)`. * * @param {Function} fn * @return {Suite} * @api private */ Suite.prototype.eachTest = function(fn){ utils.forEach(this.tests, fn); utils.forEach(this.suites, function(suite){ suite.eachTest(fn); }); return this; }; }); // module: suite.js require.register("test.js", function(module, exports, require){ /** * Module dependencies. */ var Runnable = require('./runnable'); /** * Expose `Test`. */ module.exports = Test; /** * Initialize a new `Test` with the given `title` and callback `fn`. * * @param {String} title * @param {Function} fn * @api private */ function Test(title, fn) { Runnable.call(this, title, fn); this.pending = !fn; this.type = 'test'; } /** * Inherit from `Runnable.prototype`. */ function F(){}; F.prototype = Runnable.prototype; Test.prototype = new F; Test.prototype.constructor = Test; }); // module: test.js require.register("utils.js", function(module, exports, require){ /** * Module dependencies. */ var fs = require('browser/fs') , path = require('browser/path') , join = path.join , debug = require('browser/debug')('mocha:watch'); /** * Ignored directories. */ var ignore = ['node_modules', '.git']; /** * Escape special characters in the given string of html. * * @param {String} html * @return {String} * @api private */ exports.escape = function(html){ return String(html) .replace(/&/g, '&') .replace(/"/g, '"') .replace(//g, '>'); }; /** * Array#forEach (<=IE8) * * @param {Array} array * @param {Function} fn * @param {Object} scope * @api private */ exports.forEach = function(arr, fn, scope){ for (var i = 0, l = arr.length; i < l; i++) fn.call(scope, arr[i], i); }; /** * Array#indexOf (<=IE8) * * @parma {Array} arr * @param {Object} obj to find index of * @param {Number} start * @api private */ exports.indexOf = function(arr, obj, start){ for (var i = start || 0, l = arr.length; i < l; i++) { if (arr[i] === obj) return i; } return -1; }; /** * Array#reduce (<=IE8) * * @param {Array} array * @param {Function} fn * @param {Object} initial value * @api private */ exports.reduce = function(arr, fn, val){ var rval = val; for (var i = 0, l = arr.length; i < l; i++) { rval = fn(rval, arr[i], i, arr); } return rval; }; /** * Array#filter (<=IE8) * * @param {Array} array * @param {Function} fn * @api private */ exports.filter = function(arr, fn){ var ret = []; for (var i = 0, l = arr.length; i < l; i++) { var val = arr[i]; if (fn(val, i, arr)) ret.push(val); } return ret; }; /** * Object.keys (<=IE8) * * @param {Object} obj * @return {Array} keys * @api private */ exports.keys = Object.keys || function(obj) { var keys = [] , has = Object.prototype.hasOwnProperty // for `window` on <=IE8 for (var key in obj) { if (has.call(obj, key)) { keys.push(key); } } return keys; }; /** * Watch the given `files` for changes * and invoke `fn(file)` on modification. * * @param {Array} files * @param {Function} fn * @api private */ exports.watch = function(files, fn){ var options = { interval: 100 }; files.forEach(function(file){ debug('file %s', file); fs.watchFile(file, options, function(curr, prev){ if (prev.mtime < curr.mtime) fn(file); }); }); }; /** * Ignored files. */ function ignored(path){ return !~ignore.indexOf(path); } /** * Lookup files in the given `dir`. * * @return {Array} * @api private */ exports.files = function(dir, ret){ ret = ret || []; fs.readdirSync(dir) .filter(ignored) .forEach(function(path){ path = join(dir, path); if (fs.statSync(path).isDirectory()) { exports.files(path, ret); } else if (path.match(/\.(js|coffee)$/)) { ret.push(path); } }); return ret; }; /** * Compute a slug from the given `str`. * * @param {String} str * @return {String} * @api private */ exports.slug = function(str){ return str .toLowerCase() .replace(/ +/g, '-') .replace(/[^-\w]/g, ''); }; /** * Strip the function definition from `str`, * and re-indent for pre whitespace. */ exports.clean = function(str) { str = str .replace(/^function *\(.*\) *{/, '') .replace(/\s+\}$/, ''); var whitespace = str.match(/^\n?(\s*)/)[1] , re = new RegExp('^' + whitespace, 'gm'); str = str.replace(re, ''); return exports.trim(str); }; /** * Escape regular expression characters in `str`. * * @param {String} str * @return {String} * @api private */ exports.escapeRegexp = function(str){ return str.replace(/[-\\^$*+?.()|[\]{}]/g, "\\$&"); }; /** * Trim the given `str`. * * @param {String} str * @return {String} * @api private */ exports.trim = function(str){ return str.replace(/^\s+|\s+$/g, ''); }; /** * Parse the given `qs`. * * @param {String} qs * @return {Object} * @api private */ exports.parseQuery = function(qs){ return exports.reduce(qs.replace('?', '').split('&'), function(obj, pair){ var i = pair.indexOf('=') , key = pair.slice(0, i) , val = pair.slice(++i); obj[key] = decodeURIComponent(val); return obj; }, {}); }; /** * Highlight the given string of `js`. * * @param {String} js * @return {String} * @api private */ function highlight(js) { return js .replace(//g, '>') .replace(/\/\/(.*)/gm, '//$1') .replace(/('.*?')/gm, '$1') .replace(/(\d+\.\d+)/gm, '$1') .replace(/(\d+)/gm, '$1') .replace(/\bnew *(\w+)/gm, 'new $1') .replace(/\b(function|new|throw|return|var|if|else)\b/gm, '$1') } /** * Highlight the contents of tag `name`. * * @param {String} name * @api private */ exports.highlightTags = function(name) { var code = document.getElementsByTagName(name); for (var i = 0, len = code.length; i < len; ++i) { code[i].innerHTML = highlight(code[i].innerHTML); } }; }); // module: utils.js // The global object is "self" in Web Workers. global = (function() { return this; })(); /** * Save timer references to avoid Sinon interfering (see GH-237). */ var Date = global.Date; var setTimeout = global.setTimeout; var setInterval = global.setInterval; var clearTimeout = global.clearTimeout; var clearInterval = global.clearInterval; /** * Node shims. * * These are meant only to allow * mocha.js to run untouched, not * to allow running node code in * the browser. */ var process = {}; process.exit = function(status){}; process.stdout = {}; /** * Remove uncaughtException listener. */ process.removeListener = function(e){ if ('uncaughtException' == e) { global.onerror = function() {}; } }; /** * Implements uncaughtException listener. */ process.on = function(e, fn){ if ('uncaughtException' == e) { global.onerror = function(err, url, line){ fn(new Error(err + ' (' + url + ':' + line + ')')); }; } }; /** * Expose mocha. */ var Mocha = global.Mocha = require('mocha'), mocha = global.mocha = new Mocha({ reporter: 'html' }); var immediateQueue = [] , immediateTimeout; function timeslice() { var immediateStart = new Date().getTime(); while (immediateQueue.length && (new Date().getTime() - immediateStart) < 100) { immediateQueue.shift()(); } if (immediateQueue.length) { immediateTimeout = setTimeout(timeslice, 0); } else { immediateTimeout = null; } } /** * High-performance override of Runner.immediately. */ Mocha.Runner.immediately = function(callback) { immediateQueue.push(callback); if (!immediateTimeout) { immediateTimeout = setTimeout(timeslice, 0); } }; /** * Override ui to ensure that the ui functions are initialized. * Normally this would happen in Mocha.prototype.loadFiles. */ mocha.ui = function(ui){ Mocha.prototype.ui.call(this, ui); this.suite.emit('pre-require', global, null, this); return this; }; /** * Setup mocha with the given setting options. */ mocha.setup = function(opts){ if ('string' == typeof opts) opts = { ui: opts }; for (var opt in opts) this[opt](opts[opt]); return this; }; /** * Run mocha, returning the Runner. */ mocha.run = function(fn){ var options = mocha.options; mocha.globals('location'); var query = Mocha.utils.parseQuery(global.location.search || ''); if (query.grep) mocha.grep(query.grep); if (query.invert) mocha.invert(); return Mocha.prototype.run.call(mocha, function(){ // The DOM Document is not available in Web Workers. if (global.document) { Mocha.utils.highlightTags('code'); } if (fn) fn(); }); }; /** * Expose the process shim. */ Mocha.process = process; })();apache-couchdb-1.6.0/src/fauxton/test/mocha/mocha.css0000755000175000001440000000737112332105522022453 0ustar00djcusers00000000000000@charset "utf-8"; body { margin:0; } #mocha { font: 20px/1.5 "Helvetica Neue", Helvetica, Arial, sans-serif; margin: 60px 50px; } #mocha ul, #mocha li { margin: 0; padding: 0; } #mocha ul { list-style: none; } #mocha h1, #mocha h2 { margin: 0; } #mocha h1 { margin-top: 15px; font-size: 1em; font-weight: 200; } #mocha h1 a { text-decoration: none; color: inherit; } #mocha h1 a:hover { text-decoration: underline; } #mocha .suite .suite h1 { margin-top: 0; font-size: .8em; } #mocha .hidden { display: none; } #mocha h2 { font-size: 12px; font-weight: normal; cursor: pointer; } #mocha .suite { margin-left: 15px; } #mocha .test { margin-left: 15px; overflow: hidden; } #mocha .test.pending:hover h2::after { content: '(pending)'; font-family: arial, sans-serif; } #mocha .test.pass.medium .duration { background: #C09853; } #mocha .test.pass.slow .duration { background: #B94A48; } #mocha .test.pass::before { content: 'āœ“'; font-size: 12px; display: block; float: left; margin-right: 5px; color: #00d6b2; } #mocha .test.pass .duration { font-size: 9px; margin-left: 5px; padding: 2px 5px; color: white; -webkit-box-shadow: inset 0 1px 1px rgba(0,0,0,.2); -moz-box-shadow: inset 0 1px 1px rgba(0,0,0,.2); box-shadow: inset 0 1px 1px rgba(0,0,0,.2); -webkit-border-radius: 5px; -moz-border-radius: 5px; -ms-border-radius: 5px; -o-border-radius: 5px; border-radius: 5px; } #mocha .test.pass.fast .duration { display: none; } #mocha .test.pending { color: #0b97c4; } #mocha .test.pending::before { content: 'ā—¦'; color: #0b97c4; } #mocha .test.fail { color: #c00; } #mocha .test.fail pre { color: black; } #mocha .test.fail::before { content: 'āœ–'; font-size: 12px; display: block; float: left; margin-right: 5px; color: #c00; } #mocha .test pre.error { color: #c00; max-height: 300px; overflow: auto; } #mocha .test pre { display: block; float: left; clear: left; font: 12px/1.5 monaco, monospace; margin: 5px; padding: 15px; border: 1px solid #eee; border-bottom-color: #ddd; -webkit-border-radius: 3px; -webkit-box-shadow: 0 1px 3px #eee; -moz-border-radius: 3px; -moz-box-shadow: 0 1px 3px #eee; } #mocha .test h2 { position: relative; } #mocha .test a.replay { position: absolute; top: 3px; right: 0; text-decoration: none; vertical-align: middle; display: block; width: 15px; height: 15px; line-height: 15px; text-align: center; background: #eee; font-size: 15px; -moz-border-radius: 15px; border-radius: 15px; -webkit-transition: opacity 200ms; -moz-transition: opacity 200ms; transition: opacity 200ms; opacity: 0.3; color: #888; } #mocha .test:hover a.replay { opacity: 1; } #mocha-report.pass .test.fail { display: none; } #mocha-report.fail .test.pass { display: none; } #mocha-error { color: #c00; font-size: 1.5em; font-weight: 100; letter-spacing: 1px; } #mocha-stats { position: fixed; top: 15px; right: 10px; font-size: 12px; margin: 0; color: #888; z-index: 1; } #mocha-stats .progress { float: right; padding-top: 0; } #mocha-stats em { color: black; } #mocha-stats a { text-decoration: none; color: inherit; } #mocha-stats a:hover { border-bottom: 1px solid #eee; } #mocha-stats li { display: inline-block; margin: 0 5px; list-style: none; padding-top: 11px; } #mocha-stats canvas { width: 40px; height: 40px; } #mocha code .comment { color: #ddd } #mocha code .init { color: #2F6FAD } #mocha code .string { color: #5890AD } #mocha code .keyword { color: #8A6343 } #mocha code .number { color: #2F6FAD } @media screen and (max-device-width: 480px) { #mocha { margin: 60px 0px; } #mocha #stats { position: absolute; } } apache-couchdb-1.6.0/src/fauxton/test/mocha/testUtils.js0000644000175000001440000000241512332105522023177 0ustar00djcusers00000000000000// Licensed under the Apache License, Version 2.0 (the "License"); you may not // use this file except in compliance with the License. You may obtain a copy of // the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, WITHOUT // WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the // License for the specific language governing permissions and limitations under // the License. define([ "api", "chai", "sinon-chai", "underscore" ], function(FauxtonAPI,chai, sinonChai) { chai.use(sinonChai); var ViewSandbox = function () { this.initialize(); }; _.extend(ViewSandbox.prototype, { initialize: function () { this.$el = $('
    ').appendTo('body'); this.$ = this.$el.find; }, views: [], renderView: function (view) { this.views.push(view); this.$el.append(view.el); view.render(); }, remove: function () { _.each(this.views, function (view) { view.remove(); }, this); } }); return { chai: chai, assert: chai.assert, ViewSandbox: ViewSandbox }; }); apache-couchdb-1.6.0/src/fauxton/test/mocha/chai.js0000644000175000001440000034511312332105522022110 0ustar00djcusers00000000000000;(function(){ /** * Require the given path. * * @param {String} path * @return {Object} exports * @api public */ function require(path, parent, orig) { var resolved = require.resolve(path); // lookup failed if (null == resolved) { orig = orig || path; parent = parent || 'root'; var err = new Error('Failed to require "' + orig + '" from "' + parent + '"'); err.path = orig; err.parent = parent; err.require = true; throw err; } var module = require.modules[resolved]; // perform real require() // by invoking the module's // registered function if (!module._resolving && !module.exports) { var mod = {}; mod.exports = {}; mod.client = mod.component = true; module._resolving = true; module.call(this, mod.exports, require.relative(resolved), mod); delete module._resolving; module.exports = mod.exports; } return module.exports; } /** * Registered modules. */ require.modules = {}; /** * Registered aliases. */ require.aliases = {}; /** * Resolve `path`. * * Lookup: * * - PATH/index.js * - PATH.js * - PATH * * @param {String} path * @return {String} path or null * @api private */ require.resolve = function(path) { if (path.charAt(0) === '/') path = path.slice(1); var paths = [ path, path + '.js', path + '.json', path + '/index.js', path + '/index.json' ]; for (var i = 0; i < paths.length; i++) { var path = paths[i]; if (require.modules.hasOwnProperty(path)) return path; if (require.aliases.hasOwnProperty(path)) return require.aliases[path]; } }; /** * Normalize `path` relative to the current path. * * @param {String} curr * @param {String} path * @return {String} * @api private */ require.normalize = function(curr, path) { var segs = []; if ('.' != path.charAt(0)) return path; curr = curr.split('/'); path = path.split('/'); for (var i = 0; i < path.length; ++i) { if ('..' == path[i]) { curr.pop(); } else if ('.' != path[i] && '' != path[i]) { segs.push(path[i]); } } return curr.concat(segs).join('/'); }; /** * Register module at `path` with callback `definition`. * * @param {String} path * @param {Function} definition * @api private */ require.register = function(path, definition) { require.modules[path] = definition; }; /** * Alias a module definition. * * @param {String} from * @param {String} to * @api private */ require.alias = function(from, to) { if (!require.modules.hasOwnProperty(from)) { throw new Error('Failed to alias "' + from + '", it does not exist'); } require.aliases[to] = from; }; /** * Return a require function relative to the `parent` path. * * @param {String} parent * @return {Function} * @api private */ require.relative = function(parent) { var p = require.normalize(parent, '..'); /** * lastIndexOf helper. */ function lastIndexOf(arr, obj) { var i = arr.length; while (i--) { if (arr[i] === obj) return i; } return -1; } /** * The relative require() itself. */ function localRequire(path) { var resolved = localRequire.resolve(path); return require(resolved, parent, path); } /** * Resolve relative to the parent. */ localRequire.resolve = function(path) { var c = path.charAt(0); if ('/' == c) return path.slice(1); if ('.' == c) return require.normalize(p, path); // resolve deps by returning // the dep in the nearest "deps" // directory var segs = parent.split('/'); var i = lastIndexOf(segs, 'deps') + 1; if (!i) i = 0; path = segs.slice(0, i + 1).join('/') + '/deps/' + path; return path; }; /** * Check if module is defined at `path`. */ localRequire.exists = function(path) { return require.modules.hasOwnProperty(localRequire.resolve(path)); }; return localRequire; }; require.register("chaijs-assertion-error/index.js", function(exports, require, module){ /*! * assertion-error * Copyright(c) 2013 Jake Luer * MIT Licensed */ /*! * Return a function that will copy properties from * one object to another excluding any originally * listed. Returned function will create a new `{}`. * * @param {String} excluded properties ... * @return {Function} */ function exclude () { var excludes = [].slice.call(arguments); function excludeProps (res, obj) { Object.keys(obj).forEach(function (key) { if (!~excludes.indexOf(key)) res[key] = obj[key]; }); } return function extendExclude () { var args = [].slice.call(arguments) , i = 0 , res = {}; for (; i < args.length; i++) { excludeProps(res, args[i]); } return res; }; }; /*! * Primary Exports */ module.exports = AssertionError; /** * ### AssertionError * * An extension of the JavaScript `Error` constructor for * assertion and validation scenarios. * * @param {String} message * @param {Object} properties to include (optional) * @param {callee} start stack function (optional) */ function AssertionError (message, _props, ssf) { var extend = exclude('name', 'message', 'stack', 'constructor', 'toJSON') , props = extend(_props || {}); // default values this.message = message || 'Unspecified AssertionError'; this.showDiff = false; // copy from properties for (var key in props) { this[key] = props[key]; } // capture stack trace ssf = ssf || arguments.callee; if (ssf && Error.captureStackTrace) { Error.captureStackTrace(this, ssf); } } /*! * Inherit from Error.prototype */ AssertionError.prototype = Object.create(Error.prototype); /*! * Statically set name */ AssertionError.prototype.name = 'AssertionError'; /*! * Ensure correct constructor */ AssertionError.prototype.constructor = AssertionError; /** * Allow errors to be converted to JSON for static transfer. * * @param {Boolean} include stack (default: `true`) * @return {Object} object that can be `JSON.stringify` */ AssertionError.prototype.toJSON = function (stack) { var extend = exclude('constructor', 'toJSON', 'stack') , props = extend({ name: this.name }, this); // include stack if exists and not turned off if (false !== stack && this.stack) { props.stack = this.stack; } return props; }; }); require.register("chaijs-type-detect/lib/type.js", function(exports, require, module){ /*! * type-detect * Copyright(c) 2013 jake luer * MIT Licensed */ /*! * Primary Exports */ var exports = module.exports = getType; /*! * Detectable javascript natives */ var natives = { '[object Array]': 'array' , '[object RegExp]': 'regexp' , '[object Function]': 'function' , '[object Arguments]': 'arguments' , '[object Date]': 'date' }; /** * ### typeOf (obj) * * Use several different techniques to determine * the type of object being tested. * * * @param {Mixed} object * @return {String} object type * @api public */ function getType (obj) { var str = Object.prototype.toString.call(obj); if (natives[str]) return natives[str]; if (obj === null) return 'null'; if (obj === undefined) return 'undefined'; if (obj === Object(obj)) return 'object'; return typeof obj; } exports.Library = Library; /** * ### Library * * Create a repository for custom type detection. * * ```js * var lib = new type.Library; * ``` * */ function Library () { this.tests = {}; } /** * #### .of (obj) * * Expose replacement `typeof` detection to the library. * * ```js * if ('string' === lib.of('hello world')) { * // ... * } * ``` * * @param {Mixed} object to test * @return {String} type */ Library.prototype.of = getType; /** * #### .define (type, test) * * Add a test to for the `.test()` assertion. * * Can be defined as a regular expression: * * ```js * lib.define('int', /^[0-9]+$/); * ``` * * ... or as a function: * * ```js * lib.define('bln', function (obj) { * if ('boolean' === lib.of(obj)) return true; * var blns = [ 'yes', 'no', 'true', 'false', 1, 0 ]; * if ('string' === lib.of(obj)) obj = obj.toLowerCase(); * return !! ~blns.indexOf(obj); * }); * ``` * * @param {String} type * @param {RegExp|Function} test * @api public */ Library.prototype.define = function (type, test) { if (arguments.length === 1) return this.tests[type]; this.tests[type] = test; return this; }; /** * #### .test (obj, test) * * Assert that an object is of type. Will first * check natives, and if that does not pass it will * use the user defined custom tests. * * ```js * assert(lib.test('1', 'int')); * assert(lib.test('yes', 'bln')); * ``` * * @param {Mixed} object * @param {String} type * @return {Boolean} result * @api public */ Library.prototype.test = function (obj, type) { if (type === getType(obj)) return true; var test = this.tests[type]; if (test && 'regexp' === getType(test)) { return test.test(obj); } else if (test && 'function' === getType(test)) { return test(obj); } else { throw new ReferenceError('Type test "' + type + '" not defined or invalid.'); } }; }); require.register("chaijs-deep-eql/lib/eql.js", function(exports, require, module){ /*! * deep-eql * Copyright(c) 2013 Jake Luer * MIT Licensed */ /*! * Module dependencies */ var type = require('type-detect'); /*! * Buffer.isBuffer browser shim */ var Buffer; try { Buffer = require('buffer').Buffer; } catch(ex) { Buffer = {}; Buffer.isBuffer = function() { return false; } } /*! * Primary Export */ module.exports = deepEqual; /** * Assert super-strict (egal) equality between * two objects of any type. * * @param {Mixed} a * @param {Mixed} b * @param {Array} memoised (optional) * @return {Boolean} equal match */ function deepEqual(a, b, m) { if (sameValue(a, b)) { return true; } else if ('date' === type(a)) { return dateEqual(a, b); } else if ('regexp' === type(a)) { return regexpEqual(a, b); } else if (Buffer.isBuffer(a)) { return bufferEqual(a, b); } else if ('arguments' === type(a)) { return argumentsEqual(a, b, m); } else if (!typeEqual(a, b)) { return false; } else if (('object' !== type(a) && 'object' !== type(b)) && ('array' !== type(a) && 'array' !== type(b))) { return sameValue(a, b); } else { return objectEqual(a, b, m); } } /*! * Strict (egal) equality test. Ensures that NaN always * equals NaN and `-0` does not equal `+0`. * * @param {Mixed} a * @param {Mixed} b * @return {Boolean} equal match */ function sameValue(a, b) { if (a === b) return a !== 0 || 1 / a === 1 / b; return a !== a && b !== b; } /*! * Compare the types of two given objects and * return if they are equal. Note that an Array * has a type of `array` (not `object`) and arguments * have a type of `arguments` (not `array`/`object`). * * @param {Mixed} a * @param {Mixed} b * @return {Boolean} result */ function typeEqual(a, b) { return type(a) === type(b); } /*! * Compare two Date objects by asserting that * the time values are equal using `saveValue`. * * @param {Date} a * @param {Date} b * @return {Boolean} result */ function dateEqual(a, b) { if ('date' !== type(b)) return false; return sameValue(a.getTime(), b.getTime()); } /*! * Compare two regular expressions by converting them * to string and checking for `sameValue`. * * @param {RegExp} a * @param {RegExp} b * @return {Boolean} result */ function regexpEqual(a, b) { if ('regexp' !== type(b)) return false; return sameValue(a.toString(), b.toString()); } /*! * Assert deep equality of two `arguments` objects. * Unfortunately, these must be sliced to arrays * prior to test to ensure no bad behavior. * * @param {Arguments} a * @param {Arguments} b * @param {Array} memoize (optional) * @return {Boolean} result */ function argumentsEqual(a, b, m) { if ('arguments' !== type(b)) return false; a = [].slice.call(a); b = [].slice.call(b); return deepEqual(a, b, m); } /*! * Get enumerable properties of a given object. * * @param {Object} a * @return {Array} property names */ function enumerable(a) { var res = []; for (var key in a) res.push(key); return res; } /*! * Simple equality for flat iterable objects * such as Arrays or Node.js buffers. * * @param {Iterable} a * @param {Iterable} b * @return {Boolean} result */ function iterableEqual(a, b) { if (a.length !== b.length) return false; var i = 0; var match = true; for (; i < a.length; i++) { if (a[i] !== b[i]) { match = false; break; } } return match; } /*! * Extension to `iterableEqual` specifically * for Node.js Buffers. * * @param {Buffer} a * @param {Mixed} b * @return {Boolean} result */ function bufferEqual(a, b) { if (!Buffer.isBuffer(b)) return false; return iterableEqual(a, b); } /*! * Block for `objectEqual` ensuring non-existing * values don't get in. * * @param {Mixed} object * @return {Boolean} result */ function isValue(a) { return a !== null && a !== undefined; } /*! * Recursively check the equality of two objects. * Once basic sameness has been established it will * defer to `deepEqual` for each enumerable key * in the object. * * @param {Mixed} a * @param {Mixed} b * @return {Boolean} result */ function objectEqual(a, b, m) { if (!isValue(a) || !isValue(b)) { return false; } if (a.prototype !== b.prototype) { return false; } var i; if (m) { for (i = 0; i < m.length; i++) { if ((m[i][0] === a && m[i][1] === b) || (m[i][0] === b && m[i][1] === a)) { return true; } } } else { m = []; } try { var ka = enumerable(a); var kb = enumerable(b); } catch (ex) { return false; } ka.sort(); kb.sort(); if (!iterableEqual(ka, kb)) { return false; } m.push([ a, b ]); var key; for (i = ka.length - 1; i >= 0; i--) { key = ka[i]; if (!deepEqual(a[key], b[key], m)) { return false; } } return true; } }); require.register("chai/index.js", function(exports, require, module){ module.exports = require('./lib/chai'); }); require.register("chai/lib/chai.js", function(exports, require, module){ /*! * chai * Copyright(c) 2011-2014 Jake Luer * MIT Licensed */ var used = [] , exports = module.exports = {}; /*! * Chai version */ exports.version = '1.8.1'; /*! * Assertion Error */ exports.AssertionError = require('assertion-error'); /*! * Utils for plugins (not exported) */ var util = require('./chai/utils'); /** * # .use(function) * * Provides a way to extend the internals of Chai * * @param {Function} * @returns {this} for chaining * @api public */ exports.use = function (fn) { if (!~used.indexOf(fn)) { fn(this, util); used.push(fn); } return this; }; /*! * Primary `Assertion` prototype */ var assertion = require('./chai/assertion'); exports.use(assertion); /*! * Core Assertions */ var core = require('./chai/core/assertions'); exports.use(core); /*! * Expect interface */ var expect = require('./chai/interface/expect'); exports.use(expect); /*! * Should interface */ var should = require('./chai/interface/should'); exports.use(should); /*! * Assert interface */ var assert = require('./chai/interface/assert'); exports.use(assert); }); require.register("chai/lib/chai/assertion.js", function(exports, require, module){ /*! * chai * http://chaijs.com * Copyright(c) 2011-2014 Jake Luer * MIT Licensed */ module.exports = function (_chai, util) { /*! * Module dependencies. */ var AssertionError = _chai.AssertionError , flag = util.flag; /*! * Module export. */ _chai.Assertion = Assertion; /*! * Assertion Constructor * * Creates object for chaining. * * @api private */ function Assertion (obj, msg, stack) { flag(this, 'ssfi', stack || arguments.callee); flag(this, 'object', obj); flag(this, 'message', msg); } /*! * ### Assertion.includeStack * * User configurable property, influences whether stack trace * is included in Assertion error message. Default of false * suppresses stack trace in the error message * * Assertion.includeStack = true; // enable stack on error * * @api public */ Assertion.includeStack = false; /*! * ### Assertion.showDiff * * User configurable property, influences whether or not * the `showDiff` flag should be included in the thrown * AssertionErrors. `false` will always be `false`; `true` * will be true when the assertion has requested a diff * be shown. * * @api public */ Assertion.showDiff = true; Assertion.addProperty = function (name, fn) { util.addProperty(this.prototype, name, fn); }; Assertion.addMethod = function (name, fn) { util.addMethod(this.prototype, name, fn); }; Assertion.addChainableMethod = function (name, fn, chainingBehavior) { util.addChainableMethod(this.prototype, name, fn, chainingBehavior); }; Assertion.overwriteProperty = function (name, fn) { util.overwriteProperty(this.prototype, name, fn); }; Assertion.overwriteMethod = function (name, fn) { util.overwriteMethod(this.prototype, name, fn); }; Assertion.overwriteChainableMethod = function (name, fn, chainingBehavior) { util.overwriteChainableMethod(this.prototype, name, fn, chainingBehavior); }; /*! * ### .assert(expression, message, negateMessage, expected, actual) * * Executes an expression and check expectations. Throws AssertionError for reporting if test doesn't pass. * * @name assert * @param {Philosophical} expression to be tested * @param {String} message to display if fails * @param {String} negatedMessage to display if negated expression fails * @param {Mixed} expected value (remember to check for negation) * @param {Mixed} actual (optional) will default to `this.obj` * @api private */ Assertion.prototype.assert = function (expr, msg, negateMsg, expected, _actual, showDiff) { var ok = util.test(this, arguments); if (true !== showDiff) showDiff = false; if (true !== Assertion.showDiff) showDiff = false; if (!ok) { var msg = util.getMessage(this, arguments) , actual = util.getActual(this, arguments); throw new AssertionError(msg, { actual: actual , expected: expected , showDiff: showDiff }, (Assertion.includeStack) ? this.assert : flag(this, 'ssfi')); } }; /*! * ### ._obj * * Quick reference to stored `actual` value for plugin developers. * * @api private */ Object.defineProperty(Assertion.prototype, '_obj', { get: function () { return flag(this, 'object'); } , set: function (val) { flag(this, 'object', val); } }); }; }); require.register("chai/lib/chai/core/assertions.js", function(exports, require, module){ /*! * chai * http://chaijs.com * Copyright(c) 2011-2014 Jake Luer * MIT Licensed */ module.exports = function (chai, _) { var Assertion = chai.Assertion , toString = Object.prototype.toString , flag = _.flag; /** * ### Language Chains * * The following are provided as chainable getters to * improve the readability of your assertions. They * do not provide an testing capability unless they * have been overwritten by a plugin. * * **Chains** * * - to * - be * - been * - is * - that * - and * - has * - have * - with * - at * - of * - same * * @name language chains * @api public */ [ 'to', 'be', 'been' , 'is', 'and', 'has', 'have' , 'with', 'that', 'at' , 'of', 'same' ].forEach(function (chain) { Assertion.addProperty(chain, function () { return this; }); }); /** * ### .not * * Negates any of assertions following in the chain. * * expect(foo).to.not.equal('bar'); * expect(goodFn).to.not.throw(Error); * expect({ foo: 'baz' }).to.have.property('foo') * .and.not.equal('bar'); * * @name not * @api public */ Assertion.addProperty('not', function () { flag(this, 'negate', true); }); /** * ### .deep * * Sets the `deep` flag, later used by the `equal` and * `property` assertions. * * expect(foo).to.deep.equal({ bar: 'baz' }); * expect({ foo: { bar: { baz: 'quux' } } }) * .to.have.deep.property('foo.bar.baz', 'quux'); * * @name deep * @api public */ Assertion.addProperty('deep', function () { flag(this, 'deep', true); }); /** * ### .a(type) * * The `a` and `an` assertions are aliases that can be * used either as language chains or to assert a value's * type. * * // typeof * expect('test').to.be.a('string'); * expect({ foo: 'bar' }).to.be.an('object'); * expect(null).to.be.a('null'); * expect(undefined).to.be.an('undefined'); * * // language chain * expect(foo).to.be.an.instanceof(Foo); * * @name a * @alias an * @param {String} type * @param {String} message _optional_ * @api public */ function an (type, msg) { if (msg) flag(this, 'message', msg); type = type.toLowerCase(); var obj = flag(this, 'object') , article = ~[ 'a', 'e', 'i', 'o', 'u' ].indexOf(type.charAt(0)) ? 'an ' : 'a '; this.assert( type === _.type(obj) , 'expected #{this} to be ' + article + type , 'expected #{this} not to be ' + article + type ); } Assertion.addChainableMethod('an', an); Assertion.addChainableMethod('a', an); /** * ### .include(value) * * The `include` and `contain` assertions can be used as either property * based language chains or as methods to assert the inclusion of an object * in an array or a substring in a string. When used as language chains, * they toggle the `contain` flag for the `keys` assertion. * * expect([1,2,3]).to.include(2); * expect('foobar').to.contain('foo'); * expect({ foo: 'bar', hello: 'universe' }).to.include.keys('foo'); * * @name include * @alias contain * @param {Object|String|Number} obj * @param {String} message _optional_ * @api public */ function includeChainingBehavior () { flag(this, 'contains', true); } function include (val, msg) { if (msg) flag(this, 'message', msg); var obj = flag(this, 'object'); if (_.type(val) === 'object') { if (!flag(this, 'negate')) { for (var k in val) new Assertion(obj).property(k, val[k]); return; } var subset = {} for (var k in val) subset[k] = obj[k] var expected = _.eql(subset, val); } else { var expected = obj && ~obj.indexOf(val) } this.assert( expected , 'expected #{this} to include ' + _.inspect(val) , 'expected #{this} to not include ' + _.inspect(val)); } Assertion.addChainableMethod('include', include, includeChainingBehavior); Assertion.addChainableMethod('contain', include, includeChainingBehavior); /** * ### .ok * * Asserts that the target is truthy. * * expect('everthing').to.be.ok; * expect(1).to.be.ok; * expect(false).to.not.be.ok; * expect(undefined).to.not.be.ok; * expect(null).to.not.be.ok; * * @name ok * @api public */ Assertion.addProperty('ok', function () { this.assert( flag(this, 'object') , 'expected #{this} to be truthy' , 'expected #{this} to be falsy'); }); /** * ### .true * * Asserts that the target is `true`. * * expect(true).to.be.true; * expect(1).to.not.be.true; * * @name true * @api public */ Assertion.addProperty('true', function () { this.assert( true === flag(this, 'object') , 'expected #{this} to be true' , 'expected #{this} to be false' , this.negate ? false : true ); }); /** * ### .false * * Asserts that the target is `false`. * * expect(false).to.be.false; * expect(0).to.not.be.false; * * @name false * @api public */ Assertion.addProperty('false', function () { this.assert( false === flag(this, 'object') , 'expected #{this} to be false' , 'expected #{this} to be true' , this.negate ? true : false ); }); /** * ### .null * * Asserts that the target is `null`. * * expect(null).to.be.null; * expect(undefined).not.to.be.null; * * @name null * @api public */ Assertion.addProperty('null', function () { this.assert( null === flag(this, 'object') , 'expected #{this} to be null' , 'expected #{this} not to be null' ); }); /** * ### .undefined * * Asserts that the target is `undefined`. * * expect(undefined).to.be.undefined; * expect(null).to.not.be.undefined; * * @name undefined * @api public */ Assertion.addProperty('undefined', function () { this.assert( undefined === flag(this, 'object') , 'expected #{this} to be undefined' , 'expected #{this} not to be undefined' ); }); /** * ### .exist * * Asserts that the target is neither `null` nor `undefined`. * * var foo = 'hi' * , bar = null * , baz; * * expect(foo).to.exist; * expect(bar).to.not.exist; * expect(baz).to.not.exist; * * @name exist * @api public */ Assertion.addProperty('exist', function () { this.assert( null != flag(this, 'object') , 'expected #{this} to exist' , 'expected #{this} to not exist' ); }); /** * ### .empty * * Asserts that the target's length is `0`. For arrays, it checks * the `length` property. For objects, it gets the count of * enumerable keys. * * expect([]).to.be.empty; * expect('').to.be.empty; * expect({}).to.be.empty; * * @name empty * @api public */ Assertion.addProperty('empty', function () { var obj = flag(this, 'object') , expected = obj; if (Array.isArray(obj) || 'string' === typeof object) { expected = obj.length; } else if (typeof obj === 'object') { expected = Object.keys(obj).length; } this.assert( !expected , 'expected #{this} to be empty' , 'expected #{this} not to be empty' ); }); /** * ### .arguments * * Asserts that the target is an arguments object. * * function test () { * expect(arguments).to.be.arguments; * } * * @name arguments * @alias Arguments * @api public */ function checkArguments () { var obj = flag(this, 'object') , type = Object.prototype.toString.call(obj); this.assert( '[object Arguments]' === type , 'expected #{this} to be arguments but got ' + type , 'expected #{this} to not be arguments' ); } Assertion.addProperty('arguments', checkArguments); Assertion.addProperty('Arguments', checkArguments); /** * ### .equal(value) * * Asserts that the target is strictly equal (`===`) to `value`. * Alternately, if the `deep` flag is set, asserts that * the target is deeply equal to `value`. * * expect('hello').to.equal('hello'); * expect(42).to.equal(42); * expect(1).to.not.equal(true); * expect({ foo: 'bar' }).to.not.equal({ foo: 'bar' }); * expect({ foo: 'bar' }).to.deep.equal({ foo: 'bar' }); * * @name equal * @alias equals * @alias eq * @alias deep.equal * @param {Mixed} value * @param {String} message _optional_ * @api public */ function assertEqual (val, msg) { if (msg) flag(this, 'message', msg); var obj = flag(this, 'object'); if (flag(this, 'deep')) { return this.eql(val); } else { this.assert( val === obj , 'expected #{this} to equal #{exp}' , 'expected #{this} to not equal #{exp}' , val , this._obj , true ); } } Assertion.addMethod('equal', assertEqual); Assertion.addMethod('equals', assertEqual); Assertion.addMethod('eq', assertEqual); /** * ### .eql(value) * * Asserts that the target is deeply equal to `value`. * * expect({ foo: 'bar' }).to.eql({ foo: 'bar' }); * expect([ 1, 2, 3 ]).to.eql([ 1, 2, 3 ]); * * @name eql * @alias eqls * @param {Mixed} value * @param {String} message _optional_ * @api public */ function assertEql(obj, msg) { if (msg) flag(this, 'message', msg); this.assert( _.eql(obj, flag(this, 'object')) , 'expected #{this} to deeply equal #{exp}' , 'expected #{this} to not deeply equal #{exp}' , obj , this._obj , true ); } Assertion.addMethod('eql', assertEql); Assertion.addMethod('eqls', assertEql); /** * ### .above(value) * * Asserts that the target is greater than `value`. * * expect(10).to.be.above(5); * * Can also be used in conjunction with `length` to * assert a minimum length. The benefit being a * more informative error message than if the length * was supplied directly. * * expect('foo').to.have.length.above(2); * expect([ 1, 2, 3 ]).to.have.length.above(2); * * @name above * @alias gt * @alias greaterThan * @param {Number} value * @param {String} message _optional_ * @api public */ function assertAbove (n, msg) { if (msg) flag(this, 'message', msg); var obj = flag(this, 'object'); if (flag(this, 'doLength')) { new Assertion(obj, msg).to.have.property('length'); var len = obj.length; this.assert( len > n , 'expected #{this} to have a length above #{exp} but got #{act}' , 'expected #{this} to not have a length above #{exp}' , n , len ); } else { this.assert( obj > n , 'expected #{this} to be above ' + n , 'expected #{this} to be at most ' + n ); } } Assertion.addMethod('above', assertAbove); Assertion.addMethod('gt', assertAbove); Assertion.addMethod('greaterThan', assertAbove); /** * ### .least(value) * * Asserts that the target is greater than or equal to `value`. * * expect(10).to.be.at.least(10); * * Can also be used in conjunction with `length` to * assert a minimum length. The benefit being a * more informative error message than if the length * was supplied directly. * * expect('foo').to.have.length.of.at.least(2); * expect([ 1, 2, 3 ]).to.have.length.of.at.least(3); * * @name least * @alias gte * @param {Number} value * @param {String} message _optional_ * @api public */ function assertLeast (n, msg) { if (msg) flag(this, 'message', msg); var obj = flag(this, 'object'); if (flag(this, 'doLength')) { new Assertion(obj, msg).to.have.property('length'); var len = obj.length; this.assert( len >= n , 'expected #{this} to have a length at least #{exp} but got #{act}' , 'expected #{this} to have a length below #{exp}' , n , len ); } else { this.assert( obj >= n , 'expected #{this} to be at least ' + n , 'expected #{this} to be below ' + n ); } } Assertion.addMethod('least', assertLeast); Assertion.addMethod('gte', assertLeast); /** * ### .below(value) * * Asserts that the target is less than `value`. * * expect(5).to.be.below(10); * * Can also be used in conjunction with `length` to * assert a maximum length. The benefit being a * more informative error message than if the length * was supplied directly. * * expect('foo').to.have.length.below(4); * expect([ 1, 2, 3 ]).to.have.length.below(4); * * @name below * @alias lt * @alias lessThan * @param {Number} value * @param {String} message _optional_ * @api public */ function assertBelow (n, msg) { if (msg) flag(this, 'message', msg); var obj = flag(this, 'object'); if (flag(this, 'doLength')) { new Assertion(obj, msg).to.have.property('length'); var len = obj.length; this.assert( len < n , 'expected #{this} to have a length below #{exp} but got #{act}' , 'expected #{this} to not have a length below #{exp}' , n , len ); } else { this.assert( obj < n , 'expected #{this} to be below ' + n , 'expected #{this} to be at least ' + n ); } } Assertion.addMethod('below', assertBelow); Assertion.addMethod('lt', assertBelow); Assertion.addMethod('lessThan', assertBelow); /** * ### .most(value) * * Asserts that the target is less than or equal to `value`. * * expect(5).to.be.at.most(5); * * Can also be used in conjunction with `length` to * assert a maximum length. The benefit being a * more informative error message than if the length * was supplied directly. * * expect('foo').to.have.length.of.at.most(4); * expect([ 1, 2, 3 ]).to.have.length.of.at.most(3); * * @name most * @alias lte * @param {Number} value * @param {String} message _optional_ * @api public */ function assertMost (n, msg) { if (msg) flag(this, 'message', msg); var obj = flag(this, 'object'); if (flag(this, 'doLength')) { new Assertion(obj, msg).to.have.property('length'); var len = obj.length; this.assert( len <= n , 'expected #{this} to have a length at most #{exp} but got #{act}' , 'expected #{this} to have a length above #{exp}' , n , len ); } else { this.assert( obj <= n , 'expected #{this} to be at most ' + n , 'expected #{this} to be above ' + n ); } } Assertion.addMethod('most', assertMost); Assertion.addMethod('lte', assertMost); /** * ### .within(start, finish) * * Asserts that the target is within a range. * * expect(7).to.be.within(5,10); * * Can also be used in conjunction with `length` to * assert a length range. The benefit being a * more informative error message than if the length * was supplied directly. * * expect('foo').to.have.length.within(2,4); * expect([ 1, 2, 3 ]).to.have.length.within(2,4); * * @name within * @param {Number} start lowerbound inclusive * @param {Number} finish upperbound inclusive * @param {String} message _optional_ * @api public */ Assertion.addMethod('within', function (start, finish, msg) { if (msg) flag(this, 'message', msg); var obj = flag(this, 'object') , range = start + '..' + finish; if (flag(this, 'doLength')) { new Assertion(obj, msg).to.have.property('length'); var len = obj.length; this.assert( len >= start && len <= finish , 'expected #{this} to have a length within ' + range , 'expected #{this} to not have a length within ' + range ); } else { this.assert( obj >= start && obj <= finish , 'expected #{this} to be within ' + range , 'expected #{this} to not be within ' + range ); } }); /** * ### .instanceof(constructor) * * Asserts that the target is an instance of `constructor`. * * var Tea = function (name) { this.name = name; } * , Chai = new Tea('chai'); * * expect(Chai).to.be.an.instanceof(Tea); * expect([ 1, 2, 3 ]).to.be.instanceof(Array); * * @name instanceof * @param {Constructor} constructor * @param {String} message _optional_ * @alias instanceOf * @api public */ function assertInstanceOf (constructor, msg) { if (msg) flag(this, 'message', msg); var name = _.getName(constructor); this.assert( flag(this, 'object') instanceof constructor , 'expected #{this} to be an instance of ' + name , 'expected #{this} to not be an instance of ' + name ); }; Assertion.addMethod('instanceof', assertInstanceOf); Assertion.addMethod('instanceOf', assertInstanceOf); /** * ### .property(name, [value]) * * Asserts that the target has a property `name`, optionally asserting that * the value of that property is strictly equal to `value`. * If the `deep` flag is set, you can use dot- and bracket-notation for deep * references into objects and arrays. * * // simple referencing * var obj = { foo: 'bar' }; * expect(obj).to.have.property('foo'); * expect(obj).to.have.property('foo', 'bar'); * * // deep referencing * var deepObj = { * green: { tea: 'matcha' } * , teas: [ 'chai', 'matcha', { tea: 'konacha' } ] * }; * expect(deepObj).to.have.deep.property('green.tea', 'matcha'); * expect(deepObj).to.have.deep.property('teas[1]', 'matcha'); * expect(deepObj).to.have.deep.property('teas[2].tea', 'konacha'); * * You can also use an array as the starting point of a `deep.property` * assertion, or traverse nested arrays. * * var arr = [ * [ 'chai', 'matcha', 'konacha' ] * , [ { tea: 'chai' } * , { tea: 'matcha' } * , { tea: 'konacha' } ] * ]; * * expect(arr).to.have.deep.property('[0][1]', 'matcha'); * expect(arr).to.have.deep.property('[1][2].tea', 'konacha'); * * Furthermore, `property` changes the subject of the assertion * to be the value of that property from the original object. This * permits for further chainable assertions on that property. * * expect(obj).to.have.property('foo') * .that.is.a('string'); * expect(deepObj).to.have.property('green') * .that.is.an('object') * .that.deep.equals({ tea: 'matcha' }); * expect(deepObj).to.have.property('teas') * .that.is.an('array') * .with.deep.property('[2]') * .that.deep.equals({ tea: 'konacha' }); * * @name property * @alias deep.property * @param {String} name * @param {Mixed} value (optional) * @param {String} message _optional_ * @returns value of property for chaining * @api public */ Assertion.addMethod('property', function (name, val, msg) { if (msg) flag(this, 'message', msg); var descriptor = flag(this, 'deep') ? 'deep property ' : 'property ' , negate = flag(this, 'negate') , obj = flag(this, 'object') , value = flag(this, 'deep') ? _.getPathValue(name, obj) : obj[name]; if (negate && undefined !== val) { if (undefined === value) { msg = (msg != null) ? msg + ': ' : ''; throw new Error(msg + _.inspect(obj) + ' has no ' + descriptor + _.inspect(name)); } } else { this.assert( undefined !== value , 'expected #{this} to have a ' + descriptor + _.inspect(name) , 'expected #{this} to not have ' + descriptor + _.inspect(name)); } if (undefined !== val) { this.assert( val === value , 'expected #{this} to have a ' + descriptor + _.inspect(name) + ' of #{exp}, but got #{act}' , 'expected #{this} to not have a ' + descriptor + _.inspect(name) + ' of #{act}' , val , value ); } flag(this, 'object', value); }); /** * ### .ownProperty(name) * * Asserts that the target has an own property `name`. * * expect('test').to.have.ownProperty('length'); * * @name ownProperty * @alias haveOwnProperty * @param {String} name * @param {String} message _optional_ * @api public */ function assertOwnProperty (name, msg) { if (msg) flag(this, 'message', msg); var obj = flag(this, 'object'); this.assert( obj.hasOwnProperty(name) , 'expected #{this} to have own property ' + _.inspect(name) , 'expected #{this} to not have own property ' + _.inspect(name) ); } Assertion.addMethod('ownProperty', assertOwnProperty); Assertion.addMethod('haveOwnProperty', assertOwnProperty); /** * ### .length(value) * * Asserts that the target's `length` property has * the expected value. * * expect([ 1, 2, 3]).to.have.length(3); * expect('foobar').to.have.length(6); * * Can also be used as a chain precursor to a value * comparison for the length property. * * expect('foo').to.have.length.above(2); * expect([ 1, 2, 3 ]).to.have.length.above(2); * expect('foo').to.have.length.below(4); * expect([ 1, 2, 3 ]).to.have.length.below(4); * expect('foo').to.have.length.within(2,4); * expect([ 1, 2, 3 ]).to.have.length.within(2,4); * * @name length * @alias lengthOf * @param {Number} length * @param {String} message _optional_ * @api public */ function assertLengthChain () { flag(this, 'doLength', true); } function assertLength (n, msg) { if (msg) flag(this, 'message', msg); var obj = flag(this, 'object'); new Assertion(obj, msg).to.have.property('length'); var len = obj.length; this.assert( len == n , 'expected #{this} to have a length of #{exp} but got #{act}' , 'expected #{this} to not have a length of #{act}' , n , len ); } Assertion.addChainableMethod('length', assertLength, assertLengthChain); Assertion.addMethod('lengthOf', assertLength, assertLengthChain); /** * ### .match(regexp) * * Asserts that the target matches a regular expression. * * expect('foobar').to.match(/^foo/); * * @name match * @param {RegExp} RegularExpression * @param {String} message _optional_ * @api public */ Assertion.addMethod('match', function (re, msg) { if (msg) flag(this, 'message', msg); var obj = flag(this, 'object'); this.assert( re.exec(obj) , 'expected #{this} to match ' + re , 'expected #{this} not to match ' + re ); }); /** * ### .string(string) * * Asserts that the string target contains another string. * * expect('foobar').to.have.string('bar'); * * @name string * @param {String} string * @param {String} message _optional_ * @api public */ Assertion.addMethod('string', function (str, msg) { if (msg) flag(this, 'message', msg); var obj = flag(this, 'object'); new Assertion(obj, msg).is.a('string'); this.assert( ~obj.indexOf(str) , 'expected #{this} to contain ' + _.inspect(str) , 'expected #{this} to not contain ' + _.inspect(str) ); }); /** * ### .keys(key1, [key2], [...]) * * Asserts that the target has exactly the given keys, or * asserts the inclusion of some keys when using the * `include` or `contain` modifiers. * * expect({ foo: 1, bar: 2 }).to.have.keys(['foo', 'bar']); * expect({ foo: 1, bar: 2, baz: 3 }).to.contain.keys('foo', 'bar'); * * @name keys * @alias key * @param {String...|Array} keys * @api public */ function assertKeys (keys) { var obj = flag(this, 'object') , str , ok = true; keys = keys instanceof Array ? keys : Array.prototype.slice.call(arguments); if (!keys.length) throw new Error('keys required'); var actual = Object.keys(obj) , len = keys.length; // Inclusion ok = keys.every(function(key){ return ~actual.indexOf(key); }); // Strict if (!flag(this, 'negate') && !flag(this, 'contains')) { ok = ok && keys.length == actual.length; } // Key string if (len > 1) { keys = keys.map(function(key){ return _.inspect(key); }); var last = keys.pop(); str = keys.join(', ') + ', and ' + last; } else { str = _.inspect(keys[0]); } // Form str = (len > 1 ? 'keys ' : 'key ') + str; // Have / include str = (flag(this, 'contains') ? 'contain ' : 'have ') + str; // Assertion this.assert( ok , 'expected #{this} to ' + str , 'expected #{this} to not ' + str ); } Assertion.addMethod('keys', assertKeys); Assertion.addMethod('key', assertKeys); /** * ### .throw(constructor) * * Asserts that the function target will throw a specific error, or specific type of error * (as determined using `instanceof`), optionally with a RegExp or string inclusion test * for the error's message. * * var err = new ReferenceError('This is a bad function.'); * var fn = function () { throw err; } * expect(fn).to.throw(ReferenceError); * expect(fn).to.throw(Error); * expect(fn).to.throw(/bad function/); * expect(fn).to.not.throw('good function'); * expect(fn).to.throw(ReferenceError, /bad function/); * expect(fn).to.throw(err); * expect(fn).to.not.throw(new RangeError('Out of range.')); * * Please note that when a throw expectation is negated, it will check each * parameter independently, starting with error constructor type. The appropriate way * to check for the existence of a type of error but for a message that does not match * is to use `and`. * * expect(fn).to.throw(ReferenceError) * .and.not.throw(/good function/); * * @name throw * @alias throws * @alias Throw * @param {ErrorConstructor} constructor * @param {String|RegExp} expected error message * @param {String} message _optional_ * @see https://developer.mozilla.org/en/JavaScript/Reference/Global_Objects/Error#Error_types * @returns error for chaining (null if no error) * @api public */ function assertThrows (constructor, errMsg, msg) { if (msg) flag(this, 'message', msg); var obj = flag(this, 'object'); new Assertion(obj, msg).is.a('function'); var thrown = false , desiredError = null , name = null , thrownError = null; if (arguments.length === 0) { errMsg = null; constructor = null; } else if (constructor && (constructor instanceof RegExp || 'string' === typeof constructor)) { errMsg = constructor; constructor = null; } else if (constructor && constructor instanceof Error) { desiredError = constructor; constructor = null; errMsg = null; } else if (typeof constructor === 'function') { name = constructor.prototype.name || constructor.name; if (name === 'Error' && constructor !== Error) { name = (new constructor()).name; } } else { constructor = null; } try { obj(); } catch (err) { // first, check desired error if (desiredError) { this.assert( err === desiredError , 'expected #{this} to throw #{exp} but #{act} was thrown' , 'expected #{this} to not throw #{exp}' , (desiredError instanceof Error ? desiredError.toString() : desiredError) , (err instanceof Error ? err.toString() : err) ); flag(this, 'object', err); return this; } // next, check constructor if (constructor) { this.assert( err instanceof constructor , 'expected #{this} to throw #{exp} but #{act} was thrown' , 'expected #{this} to not throw #{exp} but #{act} was thrown' , name , (err instanceof Error ? err.toString() : err) ); if (!errMsg) { flag(this, 'object', err); return this; } } // next, check message var message = 'object' === _.type(err) && "message" in err ? err.message : '' + err; if ((message != null) && errMsg && errMsg instanceof RegExp) { this.assert( errMsg.exec(message) , 'expected #{this} to throw error matching #{exp} but got #{act}' , 'expected #{this} to throw error not matching #{exp}' , errMsg , message ); flag(this, 'object', err); return this; } else if ((message != null) && errMsg && 'string' === typeof errMsg) { this.assert( ~message.indexOf(errMsg) , 'expected #{this} to throw error including #{exp} but got #{act}' , 'expected #{this} to throw error not including #{act}' , errMsg , message ); flag(this, 'object', err); return this; } else { thrown = true; thrownError = err; } } var actuallyGot = '' , expectedThrown = name !== null ? name : desiredError ? '#{exp}' //_.inspect(desiredError) : 'an error'; if (thrown) { actuallyGot = ' but #{act} was thrown' } this.assert( thrown === true , 'expected #{this} to throw ' + expectedThrown + actuallyGot , 'expected #{this} to not throw ' + expectedThrown + actuallyGot , (desiredError instanceof Error ? desiredError.toString() : desiredError) , (thrownError instanceof Error ? thrownError.toString() : thrownError) ); flag(this, 'object', thrownError); }; Assertion.addMethod('throw', assertThrows); Assertion.addMethod('throws', assertThrows); Assertion.addMethod('Throw', assertThrows); /** * ### .respondTo(method) * * Asserts that the object or class target will respond to a method. * * Klass.prototype.bar = function(){}; * expect(Klass).to.respondTo('bar'); * expect(obj).to.respondTo('bar'); * * To check if a constructor will respond to a static function, * set the `itself` flag. * * Klass.baz = function(){}; * expect(Klass).itself.to.respondTo('baz'); * * @name respondTo * @param {String} method * @param {String} message _optional_ * @api public */ Assertion.addMethod('respondTo', function (method, msg) { if (msg) flag(this, 'message', msg); var obj = flag(this, 'object') , itself = flag(this, 'itself') , context = ('function' === _.type(obj) && !itself) ? obj.prototype[method] : obj[method]; this.assert( 'function' === typeof context , 'expected #{this} to respond to ' + _.inspect(method) , 'expected #{this} to not respond to ' + _.inspect(method) ); }); /** * ### .itself * * Sets the `itself` flag, later used by the `respondTo` assertion. * * function Foo() {} * Foo.bar = function() {} * Foo.prototype.baz = function() {} * * expect(Foo).itself.to.respondTo('bar'); * expect(Foo).itself.not.to.respondTo('baz'); * * @name itself * @api public */ Assertion.addProperty('itself', function () { flag(this, 'itself', true); }); /** * ### .satisfy(method) * * Asserts that the target passes a given truth test. * * expect(1).to.satisfy(function(num) { return num > 0; }); * * @name satisfy * @param {Function} matcher * @param {String} message _optional_ * @api public */ Assertion.addMethod('satisfy', function (matcher, msg) { if (msg) flag(this, 'message', msg); var obj = flag(this, 'object'); this.assert( matcher(obj) , 'expected #{this} to satisfy ' + _.objDisplay(matcher) , 'expected #{this} to not satisfy' + _.objDisplay(matcher) , this.negate ? false : true , matcher(obj) ); }); /** * ### .closeTo(expected, delta) * * Asserts that the target is equal `expected`, to within a +/- `delta` range. * * expect(1.5).to.be.closeTo(1, 0.5); * * @name closeTo * @param {Number} expected * @param {Number} delta * @param {String} message _optional_ * @api public */ Assertion.addMethod('closeTo', function (expected, delta, msg) { if (msg) flag(this, 'message', msg); var obj = flag(this, 'object'); this.assert( Math.abs(obj - expected) <= delta , 'expected #{this} to be close to ' + expected + ' +/- ' + delta , 'expected #{this} not to be close to ' + expected + ' +/- ' + delta ); }); function isSubsetOf(subset, superset) { return subset.every(function(elem) { return superset.indexOf(elem) !== -1; }) } /** * ### .members(set) * * Asserts that the target is a superset of `set`, * or that the target and `set` have the same members. * * expect([1, 2, 3]).to.include.members([3, 2]); * expect([1, 2, 3]).to.not.include.members([3, 2, 8]); * * expect([4, 2]).to.have.members([2, 4]); * expect([5, 2]).to.not.have.members([5, 2, 1]); * * @name members * @param {Array} set * @param {String} message _optional_ * @api public */ Assertion.addMethod('members', function (subset, msg) { if (msg) flag(this, 'message', msg); var obj = flag(this, 'object'); new Assertion(obj).to.be.an('array'); new Assertion(subset).to.be.an('array'); if (flag(this, 'contains')) { return this.assert( isSubsetOf(subset, obj) , 'expected #{this} to be a superset of #{act}' , 'expected #{this} to not be a superset of #{act}' , obj , subset ); } this.assert( isSubsetOf(obj, subset) && isSubsetOf(subset, obj) , 'expected #{this} to have the same members as #{act}' , 'expected #{this} to not have the same members as #{act}' , obj , subset ); }); }; }); require.register("chai/lib/chai/interface/assert.js", function(exports, require, module){ /*! * chai * Copyright(c) 2011-2014 Jake Luer * MIT Licensed */ module.exports = function (chai, util) { /*! * Chai dependencies. */ var Assertion = chai.Assertion , flag = util.flag; /*! * Module export. */ /** * ### assert(expression, message) * * Write your own test expressions. * * assert('foo' !== 'bar', 'foo is not bar'); * assert(Array.isArray([]), 'empty arrays are arrays'); * * @param {Mixed} expression to test for truthiness * @param {String} message to display on error * @name assert * @api public */ var assert = chai.assert = function (express, errmsg) { var test = new Assertion(null); test.assert( express , errmsg , '[ negation message unavailable ]' ); }; /** * ### .fail(actual, expected, [message], [operator]) * * Throw a failure. Node.js `assert` module-compatible. * * @name fail * @param {Mixed} actual * @param {Mixed} expected * @param {String} message * @param {String} operator * @api public */ assert.fail = function (actual, expected, message, operator) { message = message || 'assert.fail()'; throw new chai.AssertionError(message, { actual: actual , expected: expected , operator: operator }, assert.fail); }; /** * ### .ok(object, [message]) * * Asserts that `object` is truthy. * * assert.ok('everything', 'everything is ok'); * assert.ok(false, 'this will fail'); * * @name ok * @param {Mixed} object to test * @param {String} message * @api public */ assert.ok = function (val, msg) { new Assertion(val, msg).is.ok; }; /** * ### .notOk(object, [message]) * * Asserts that `object` is falsy. * * assert.notOk('everything', 'this will fail'); * assert.notOk(false, 'this will pass'); * * @name notOk * @param {Mixed} object to test * @param {String} message * @api public */ assert.notOk = function (val, msg) { new Assertion(val, msg).is.not.ok; }; /** * ### .equal(actual, expected, [message]) * * Asserts non-strict equality (`==`) of `actual` and `expected`. * * assert.equal(3, '3', '== coerces values to strings'); * * @name equal * @param {Mixed} actual * @param {Mixed} expected * @param {String} message * @api public */ assert.equal = function (act, exp, msg) { var test = new Assertion(act, msg); test.assert( exp == flag(test, 'object') , 'expected #{this} to equal #{exp}' , 'expected #{this} to not equal #{act}' , exp , act ); }; /** * ### .notEqual(actual, expected, [message]) * * Asserts non-strict inequality (`!=`) of `actual` and `expected`. * * assert.notEqual(3, 4, 'these numbers are not equal'); * * @name notEqual * @param {Mixed} actual * @param {Mixed} expected * @param {String} message * @api public */ assert.notEqual = function (act, exp, msg) { var test = new Assertion(act, msg); test.assert( exp != flag(test, 'object') , 'expected #{this} to not equal #{exp}' , 'expected #{this} to equal #{act}' , exp , act ); }; /** * ### .strictEqual(actual, expected, [message]) * * Asserts strict equality (`===`) of `actual` and `expected`. * * assert.strictEqual(true, true, 'these booleans are strictly equal'); * * @name strictEqual * @param {Mixed} actual * @param {Mixed} expected * @param {String} message * @api public */ assert.strictEqual = function (act, exp, msg) { new Assertion(act, msg).to.equal(exp); }; /** * ### .notStrictEqual(actual, expected, [message]) * * Asserts strict inequality (`!==`) of `actual` and `expected`. * * assert.notStrictEqual(3, '3', 'no coercion for strict equality'); * * @name notStrictEqual * @param {Mixed} actual * @param {Mixed} expected * @param {String} message * @api public */ assert.notStrictEqual = function (act, exp, msg) { new Assertion(act, msg).to.not.equal(exp); }; /** * ### .deepEqual(actual, expected, [message]) * * Asserts that `actual` is deeply equal to `expected`. * * assert.deepEqual({ tea: 'green' }, { tea: 'green' }); * * @name deepEqual * @param {Mixed} actual * @param {Mixed} expected * @param {String} message * @api public */ assert.deepEqual = function (act, exp, msg) { new Assertion(act, msg).to.eql(exp); }; /** * ### .notDeepEqual(actual, expected, [message]) * * Assert that `actual` is not deeply equal to `expected`. * * assert.notDeepEqual({ tea: 'green' }, { tea: 'jasmine' }); * * @name notDeepEqual * @param {Mixed} actual * @param {Mixed} expected * @param {String} message * @api public */ assert.notDeepEqual = function (act, exp, msg) { new Assertion(act, msg).to.not.eql(exp); }; /** * ### .isTrue(value, [message]) * * Asserts that `value` is true. * * var teaServed = true; * assert.isTrue(teaServed, 'the tea has been served'); * * @name isTrue * @param {Mixed} value * @param {String} message * @api public */ assert.isTrue = function (val, msg) { new Assertion(val, msg).is['true']; }; /** * ### .isFalse(value, [message]) * * Asserts that `value` is false. * * var teaServed = false; * assert.isFalse(teaServed, 'no tea yet? hmm...'); * * @name isFalse * @param {Mixed} value * @param {String} message * @api public */ assert.isFalse = function (val, msg) { new Assertion(val, msg).is['false']; }; /** * ### .isNull(value, [message]) * * Asserts that `value` is null. * * assert.isNull(err, 'there was no error'); * * @name isNull * @param {Mixed} value * @param {String} message * @api public */ assert.isNull = function (val, msg) { new Assertion(val, msg).to.equal(null); }; /** * ### .isNotNull(value, [message]) * * Asserts that `value` is not null. * * var tea = 'tasty chai'; * assert.isNotNull(tea, 'great, time for tea!'); * * @name isNotNull * @param {Mixed} value * @param {String} message * @api public */ assert.isNotNull = function (val, msg) { new Assertion(val, msg).to.not.equal(null); }; /** * ### .isUndefined(value, [message]) * * Asserts that `value` is `undefined`. * * var tea; * assert.isUndefined(tea, 'no tea defined'); * * @name isUndefined * @param {Mixed} value * @param {String} message * @api public */ assert.isUndefined = function (val, msg) { new Assertion(val, msg).to.equal(undefined); }; /** * ### .isDefined(value, [message]) * * Asserts that `value` is not `undefined`. * * var tea = 'cup of chai'; * assert.isDefined(tea, 'tea has been defined'); * * @name isDefined * @param {Mixed} value * @param {String} message * @api public */ assert.isDefined = function (val, msg) { new Assertion(val, msg).to.not.equal(undefined); }; /** * ### .isFunction(value, [message]) * * Asserts that `value` is a function. * * function serveTea() { return 'cup of tea'; }; * assert.isFunction(serveTea, 'great, we can have tea now'); * * @name isFunction * @param {Mixed} value * @param {String} message * @api public */ assert.isFunction = function (val, msg) { new Assertion(val, msg).to.be.a('function'); }; /** * ### .isNotFunction(value, [message]) * * Asserts that `value` is _not_ a function. * * var serveTea = [ 'heat', 'pour', 'sip' ]; * assert.isNotFunction(serveTea, 'great, we have listed the steps'); * * @name isNotFunction * @param {Mixed} value * @param {String} message * @api public */ assert.isNotFunction = function (val, msg) { new Assertion(val, msg).to.not.be.a('function'); }; /** * ### .isObject(value, [message]) * * Asserts that `value` is an object (as revealed by * `Object.prototype.toString`). * * var selection = { name: 'Chai', serve: 'with spices' }; * assert.isObject(selection, 'tea selection is an object'); * * @name isObject * @param {Mixed} value * @param {String} message * @api public */ assert.isObject = function (val, msg) { new Assertion(val, msg).to.be.a('object'); }; /** * ### .isNotObject(value, [message]) * * Asserts that `value` is _not_ an object. * * var selection = 'chai' * assert.isObject(selection, 'tea selection is not an object'); * assert.isObject(null, 'null is not an object'); * * @name isNotObject * @param {Mixed} value * @param {String} message * @api public */ assert.isNotObject = function (val, msg) { new Assertion(val, msg).to.not.be.a('object'); }; /** * ### .isArray(value, [message]) * * Asserts that `value` is an array. * * var menu = [ 'green', 'chai', 'oolong' ]; * assert.isArray(menu, 'what kind of tea do we want?'); * * @name isArray * @param {Mixed} value * @param {String} message * @api public */ assert.isArray = function (val, msg) { new Assertion(val, msg).to.be.an('array'); }; /** * ### .isNotArray(value, [message]) * * Asserts that `value` is _not_ an array. * * var menu = 'green|chai|oolong'; * assert.isNotArray(menu, 'what kind of tea do we want?'); * * @name isNotArray * @param {Mixed} value * @param {String} message * @api public */ assert.isNotArray = function (val, msg) { new Assertion(val, msg).to.not.be.an('array'); }; /** * ### .isString(value, [message]) * * Asserts that `value` is a string. * * var teaOrder = 'chai'; * assert.isString(teaOrder, 'order placed'); * * @name isString * @param {Mixed} value * @param {String} message * @api public */ assert.isString = function (val, msg) { new Assertion(val, msg).to.be.a('string'); }; /** * ### .isNotString(value, [message]) * * Asserts that `value` is _not_ a string. * * var teaOrder = 4; * assert.isNotString(teaOrder, 'order placed'); * * @name isNotString * @param {Mixed} value * @param {String} message * @api public */ assert.isNotString = function (val, msg) { new Assertion(val, msg).to.not.be.a('string'); }; /** * ### .isNumber(value, [message]) * * Asserts that `value` is a number. * * var cups = 2; * assert.isNumber(cups, 'how many cups'); * * @name isNumber * @param {Number} value * @param {String} message * @api public */ assert.isNumber = function (val, msg) { new Assertion(val, msg).to.be.a('number'); }; /** * ### .isNotNumber(value, [message]) * * Asserts that `value` is _not_ a number. * * var cups = '2 cups please'; * assert.isNotNumber(cups, 'how many cups'); * * @name isNotNumber * @param {Mixed} value * @param {String} message * @api public */ assert.isNotNumber = function (val, msg) { new Assertion(val, msg).to.not.be.a('number'); }; /** * ### .isBoolean(value, [message]) * * Asserts that `value` is a boolean. * * var teaReady = true * , teaServed = false; * * assert.isBoolean(teaReady, 'is the tea ready'); * assert.isBoolean(teaServed, 'has tea been served'); * * @name isBoolean * @param {Mixed} value * @param {String} message * @api public */ assert.isBoolean = function (val, msg) { new Assertion(val, msg).to.be.a('boolean'); }; /** * ### .isNotBoolean(value, [message]) * * Asserts that `value` is _not_ a boolean. * * var teaReady = 'yep' * , teaServed = 'nope'; * * assert.isNotBoolean(teaReady, 'is the tea ready'); * assert.isNotBoolean(teaServed, 'has tea been served'); * * @name isNotBoolean * @param {Mixed} value * @param {String} message * @api public */ assert.isNotBoolean = function (val, msg) { new Assertion(val, msg).to.not.be.a('boolean'); }; /** * ### .typeOf(value, name, [message]) * * Asserts that `value`'s type is `name`, as determined by * `Object.prototype.toString`. * * assert.typeOf({ tea: 'chai' }, 'object', 'we have an object'); * assert.typeOf(['chai', 'jasmine'], 'array', 'we have an array'); * assert.typeOf('tea', 'string', 'we have a string'); * assert.typeOf(/tea/, 'regexp', 'we have a regular expression'); * assert.typeOf(null, 'null', 'we have a null'); * assert.typeOf(undefined, 'undefined', 'we have an undefined'); * * @name typeOf * @param {Mixed} value * @param {String} name * @param {String} message * @api public */ assert.typeOf = function (val, type, msg) { new Assertion(val, msg).to.be.a(type); }; /** * ### .notTypeOf(value, name, [message]) * * Asserts that `value`'s type is _not_ `name`, as determined by * `Object.prototype.toString`. * * assert.notTypeOf('tea', 'number', 'strings are not numbers'); * * @name notTypeOf * @param {Mixed} value * @param {String} typeof name * @param {String} message * @api public */ assert.notTypeOf = function (val, type, msg) { new Assertion(val, msg).to.not.be.a(type); }; /** * ### .instanceOf(object, constructor, [message]) * * Asserts that `value` is an instance of `constructor`. * * var Tea = function (name) { this.name = name; } * , chai = new Tea('chai'); * * assert.instanceOf(chai, Tea, 'chai is an instance of tea'); * * @name instanceOf * @param {Object} object * @param {Constructor} constructor * @param {String} message * @api public */ assert.instanceOf = function (val, type, msg) { new Assertion(val, msg).to.be.instanceOf(type); }; /** * ### .notInstanceOf(object, constructor, [message]) * * Asserts `value` is not an instance of `constructor`. * * var Tea = function (name) { this.name = name; } * , chai = new String('chai'); * * assert.notInstanceOf(chai, Tea, 'chai is not an instance of tea'); * * @name notInstanceOf * @param {Object} object * @param {Constructor} constructor * @param {String} message * @api public */ assert.notInstanceOf = function (val, type, msg) { new Assertion(val, msg).to.not.be.instanceOf(type); }; /** * ### .include(haystack, needle, [message]) * * Asserts that `haystack` includes `needle`. Works * for strings and arrays. * * assert.include('foobar', 'bar', 'foobar contains string "bar"'); * assert.include([ 1, 2, 3 ], 3, 'array contains value'); * * @name include * @param {Array|String} haystack * @param {Mixed} needle * @param {String} message * @api public */ assert.include = function (exp, inc, msg) { new Assertion(exp, msg).include(inc); }; /** * ### .notInclude(haystack, needle, [message]) * * Asserts that `haystack` does not include `needle`. Works * for strings and arrays. *i * assert.notInclude('foobar', 'baz', 'string not include substring'); * assert.notInclude([ 1, 2, 3 ], 4, 'array not include contain value'); * * @name notInclude * @param {Array|String} haystack * @param {Mixed} needle * @param {String} message * @api public */ assert.notInclude = function (exp, inc, msg) { new Assertion(exp, msg).not.include(inc); }; /** * ### .match(value, regexp, [message]) * * Asserts that `value` matches the regular expression `regexp`. * * assert.match('foobar', /^foo/, 'regexp matches'); * * @name match * @param {Mixed} value * @param {RegExp} regexp * @param {String} message * @api public */ assert.match = function (exp, re, msg) { new Assertion(exp, msg).to.match(re); }; /** * ### .notMatch(value, regexp, [message]) * * Asserts that `value` does not match the regular expression `regexp`. * * assert.notMatch('foobar', /^foo/, 'regexp does not match'); * * @name notMatch * @param {Mixed} value * @param {RegExp} regexp * @param {String} message * @api public */ assert.notMatch = function (exp, re, msg) { new Assertion(exp, msg).to.not.match(re); }; /** * ### .property(object, property, [message]) * * Asserts that `object` has a property named by `property`. * * assert.property({ tea: { green: 'matcha' }}, 'tea'); * * @name property * @param {Object} object * @param {String} property * @param {String} message * @api public */ assert.property = function (obj, prop, msg) { new Assertion(obj, msg).to.have.property(prop); }; /** * ### .notProperty(object, property, [message]) * * Asserts that `object` does _not_ have a property named by `property`. * * assert.notProperty({ tea: { green: 'matcha' }}, 'coffee'); * * @name notProperty * @param {Object} object * @param {String} property * @param {String} message * @api public */ assert.notProperty = function (obj, prop, msg) { new Assertion(obj, msg).to.not.have.property(prop); }; /** * ### .deepProperty(object, property, [message]) * * Asserts that `object` has a property named by `property`, which can be a * string using dot- and bracket-notation for deep reference. * * assert.deepProperty({ tea: { green: 'matcha' }}, 'tea.green'); * * @name deepProperty * @param {Object} object * @param {String} property * @param {String} message * @api public */ assert.deepProperty = function (obj, prop, msg) { new Assertion(obj, msg).to.have.deep.property(prop); }; /** * ### .notDeepProperty(object, property, [message]) * * Asserts that `object` does _not_ have a property named by `property`, which * can be a string using dot- and bracket-notation for deep reference. * * assert.notDeepProperty({ tea: { green: 'matcha' }}, 'tea.oolong'); * * @name notDeepProperty * @param {Object} object * @param {String} property * @param {String} message * @api public */ assert.notDeepProperty = function (obj, prop, msg) { new Assertion(obj, msg).to.not.have.deep.property(prop); }; /** * ### .propertyVal(object, property, value, [message]) * * Asserts that `object` has a property named by `property` with value given * by `value`. * * assert.propertyVal({ tea: 'is good' }, 'tea', 'is good'); * * @name propertyVal * @param {Object} object * @param {String} property * @param {Mixed} value * @param {String} message * @api public */ assert.propertyVal = function (obj, prop, val, msg) { new Assertion(obj, msg).to.have.property(prop, val); }; /** * ### .propertyNotVal(object, property, value, [message]) * * Asserts that `object` has a property named by `property`, but with a value * different from that given by `value`. * * assert.propertyNotVal({ tea: 'is good' }, 'tea', 'is bad'); * * @name propertyNotVal * @param {Object} object * @param {String} property * @param {Mixed} value * @param {String} message * @api public */ assert.propertyNotVal = function (obj, prop, val, msg) { new Assertion(obj, msg).to.not.have.property(prop, val); }; /** * ### .deepPropertyVal(object, property, value, [message]) * * Asserts that `object` has a property named by `property` with value given * by `value`. `property` can use dot- and bracket-notation for deep * reference. * * assert.deepPropertyVal({ tea: { green: 'matcha' }}, 'tea.green', 'matcha'); * * @name deepPropertyVal * @param {Object} object * @param {String} property * @param {Mixed} value * @param {String} message * @api public */ assert.deepPropertyVal = function (obj, prop, val, msg) { new Assertion(obj, msg).to.have.deep.property(prop, val); }; /** * ### .deepPropertyNotVal(object, property, value, [message]) * * Asserts that `object` has a property named by `property`, but with a value * different from that given by `value`. `property` can use dot- and * bracket-notation for deep reference. * * assert.deepPropertyNotVal({ tea: { green: 'matcha' }}, 'tea.green', 'konacha'); * * @name deepPropertyNotVal * @param {Object} object * @param {String} property * @param {Mixed} value * @param {String} message * @api public */ assert.deepPropertyNotVal = function (obj, prop, val, msg) { new Assertion(obj, msg).to.not.have.deep.property(prop, val); }; /** * ### .lengthOf(object, length, [message]) * * Asserts that `object` has a `length` property with the expected value. * * assert.lengthOf([1,2,3], 3, 'array has length of 3'); * assert.lengthOf('foobar', 5, 'string has length of 6'); * * @name lengthOf * @param {Mixed} object * @param {Number} length * @param {String} message * @api public */ assert.lengthOf = function (exp, len, msg) { new Assertion(exp, msg).to.have.length(len); }; /** * ### .throws(function, [constructor/string/regexp], [string/regexp], [message]) * * Asserts that `function` will throw an error that is an instance of * `constructor`, or alternately that it will throw an error with message * matching `regexp`. * * assert.throw(fn, 'function throws a reference error'); * assert.throw(fn, /function throws a reference error/); * assert.throw(fn, ReferenceError); * assert.throw(fn, ReferenceError, 'function throws a reference error'); * assert.throw(fn, ReferenceError, /function throws a reference error/); * * @name throws * @alias throw * @alias Throw * @param {Function} function * @param {ErrorConstructor} constructor * @param {RegExp} regexp * @param {String} message * @see https://developer.mozilla.org/en/JavaScript/Reference/Global_Objects/Error#Error_types * @api public */ assert.Throw = function (fn, errt, errs, msg) { if ('string' === typeof errt || errt instanceof RegExp) { errs = errt; errt = null; } var assertErr = new Assertion(fn, msg).to.Throw(errt, errs); return flag(assertErr, 'object'); }; /** * ### .doesNotThrow(function, [constructor/regexp], [message]) * * Asserts that `function` will _not_ throw an error that is an instance of * `constructor`, or alternately that it will not throw an error with message * matching `regexp`. * * assert.doesNotThrow(fn, Error, 'function does not throw'); * * @name doesNotThrow * @param {Function} function * @param {ErrorConstructor} constructor * @param {RegExp} regexp * @param {String} message * @see https://developer.mozilla.org/en/JavaScript/Reference/Global_Objects/Error#Error_types * @api public */ assert.doesNotThrow = function (fn, type, msg) { if ('string' === typeof type) { msg = type; type = null; } new Assertion(fn, msg).to.not.Throw(type); }; /** * ### .operator(val1, operator, val2, [message]) * * Compares two values using `operator`. * * assert.operator(1, '<', 2, 'everything is ok'); * assert.operator(1, '>', 2, 'this will fail'); * * @name operator * @param {Mixed} val1 * @param {String} operator * @param {Mixed} val2 * @param {String} message * @api public */ assert.operator = function (val, operator, val2, msg) { if (!~['==', '===', '>', '>=', '<', '<=', '!=', '!=='].indexOf(operator)) { throw new Error('Invalid operator "' + operator + '"'); } var test = new Assertion(eval(val + operator + val2), msg); test.assert( true === flag(test, 'object') , 'expected ' + util.inspect(val) + ' to be ' + operator + ' ' + util.inspect(val2) , 'expected ' + util.inspect(val) + ' to not be ' + operator + ' ' + util.inspect(val2) ); }; /** * ### .closeTo(actual, expected, delta, [message]) * * Asserts that the target is equal `expected`, to within a +/- `delta` range. * * assert.closeTo(1.5, 1, 0.5, 'numbers are close'); * * @name closeTo * @param {Number} actual * @param {Number} expected * @param {Number} delta * @param {String} message * @api public */ assert.closeTo = function (act, exp, delta, msg) { new Assertion(act, msg).to.be.closeTo(exp, delta); }; /** * ### .sameMembers(set1, set2, [message]) * * Asserts that `set1` and `set2` have the same members. * Order is not taken into account. * * assert.sameMembers([ 1, 2, 3 ], [ 2, 1, 3 ], 'same members'); * * @name sameMembers * @param {Array} superset * @param {Array} subset * @param {String} message * @api public */ assert.sameMembers = function (set1, set2, msg) { new Assertion(set1, msg).to.have.same.members(set2); } /** * ### .includeMembers(superset, subset, [message]) * * Asserts that `subset` is included in `superset`. * Order is not taken into account. * * assert.includeMembers([ 1, 2, 3 ], [ 2, 1 ], 'include members'); * * @name includeMembers * @param {Array} superset * @param {Array} subset * @param {String} message * @api public */ assert.includeMembers = function (superset, subset, msg) { new Assertion(superset, msg).to.include.members(subset); } /*! * Undocumented / untested */ assert.ifError = function (val, msg) { new Assertion(val, msg).to.not.be.ok; }; /*! * Aliases. */ (function alias(name, as){ assert[as] = assert[name]; return alias; }) ('Throw', 'throw') ('Throw', 'throws'); }; }); require.register("chai/lib/chai/interface/expect.js", function(exports, require, module){ /*! * chai * Copyright(c) 2011-2014 Jake Luer * MIT Licensed */ module.exports = function (chai, util) { chai.expect = function (val, message) { return new chai.Assertion(val, message); }; }; }); require.register("chai/lib/chai/interface/should.js", function(exports, require, module){ /*! * chai * Copyright(c) 2011-2014 Jake Luer * MIT Licensed */ module.exports = function (chai, util) { var Assertion = chai.Assertion; function loadShould () { // modify Object.prototype to have `should` Object.defineProperty(Object.prototype, 'should', { set: function (value) { // See https://github.com/chaijs/chai/issues/86: this makes // `whatever.should = someValue` actually set `someValue`, which is // especially useful for `global.should = require('chai').should()`. // // Note that we have to use [[DefineProperty]] instead of [[Put]] // since otherwise we would trigger this very setter! Object.defineProperty(this, 'should', { value: value, enumerable: true, configurable: true, writable: true }); } , get: function(){ if (this instanceof String || this instanceof Number) { return new Assertion(this.constructor(this)); } else if (this instanceof Boolean) { return new Assertion(this == true); } return new Assertion(this); } , configurable: true }); var should = {}; should.equal = function (val1, val2, msg) { new Assertion(val1, msg).to.equal(val2); }; should.Throw = function (fn, errt, errs, msg) { new Assertion(fn, msg).to.Throw(errt, errs); }; should.exist = function (val, msg) { new Assertion(val, msg).to.exist; } // negation should.not = {} should.not.equal = function (val1, val2, msg) { new Assertion(val1, msg).to.not.equal(val2); }; should.not.Throw = function (fn, errt, errs, msg) { new Assertion(fn, msg).to.not.Throw(errt, errs); }; should.not.exist = function (val, msg) { new Assertion(val, msg).to.not.exist; } should['throw'] = should['Throw']; should.not['throw'] = should.not['Throw']; return should; }; chai.should = loadShould; chai.Should = loadShould; }; }); require.register("chai/lib/chai/utils/addChainableMethod.js", function(exports, require, module){ /*! * Chai - addChainingMethod utility * Copyright(c) 2012-2014 Jake Luer * MIT Licensed */ /*! * Module dependencies */ var transferFlags = require('./transferFlags'); /*! * Module variables */ // Check whether `__proto__` is supported var hasProtoSupport = '__proto__' in Object; // Without `__proto__` support, this module will need to add properties to a function. // However, some Function.prototype methods cannot be overwritten, // and there seems no easy cross-platform way to detect them (@see chaijs/chai/issues/69). var excludeNames = /^(?:length|name|arguments|caller)$/; // Cache `Function` properties var call = Function.prototype.call, apply = Function.prototype.apply; /** * ### addChainableMethod (ctx, name, method, chainingBehavior) * * Adds a method to an object, such that the method can also be chained. * * utils.addChainableMethod(chai.Assertion.prototype, 'foo', function (str) { * var obj = utils.flag(this, 'object'); * new chai.Assertion(obj).to.be.equal(str); * }); * * Can also be accessed directly from `chai.Assertion`. * * chai.Assertion.addChainableMethod('foo', fn, chainingBehavior); * * The result can then be used as both a method assertion, executing both `method` and * `chainingBehavior`, or as a language chain, which only executes `chainingBehavior`. * * expect(fooStr).to.be.foo('bar'); * expect(fooStr).to.be.foo.equal('foo'); * * @param {Object} ctx object to which the method is added * @param {String} name of method to add * @param {Function} method function to be used for `name`, when called * @param {Function} chainingBehavior function to be called every time the property is accessed * @name addChainableMethod * @api public */ module.exports = function (ctx, name, method, chainingBehavior) { if (typeof chainingBehavior !== 'function') { chainingBehavior = function () { }; } var chainableBehavior = { method: method , chainingBehavior: chainingBehavior }; // save the methods so we can overwrite them later, if we need to. if (!ctx.__methods) { ctx.__methods = {}; } ctx.__methods[name] = chainableBehavior; Object.defineProperty(ctx, name, { get: function () { chainableBehavior.chainingBehavior.call(this); var assert = function () { var result = chainableBehavior.method.apply(this, arguments); return result === undefined ? this : result; }; // Use `__proto__` if available if (hasProtoSupport) { // Inherit all properties from the object by replacing the `Function` prototype var prototype = assert.__proto__ = Object.create(this); // Restore the `call` and `apply` methods from `Function` prototype.call = call; prototype.apply = apply; } // Otherwise, redefine all properties (slow!) else { var asserterNames = Object.getOwnPropertyNames(ctx); asserterNames.forEach(function (asserterName) { if (!excludeNames.test(asserterName)) { var pd = Object.getOwnPropertyDescriptor(ctx, asserterName); Object.defineProperty(assert, asserterName, pd); } }); } transferFlags(this, assert); return assert; } , configurable: true }); }; }); require.register("chai/lib/chai/utils/addMethod.js", function(exports, require, module){ /*! * Chai - addMethod utility * Copyright(c) 2012-2014 Jake Luer * MIT Licensed */ /** * ### .addMethod (ctx, name, method) * * Adds a method to the prototype of an object. * * utils.addMethod(chai.Assertion.prototype, 'foo', function (str) { * var obj = utils.flag(this, 'object'); * new chai.Assertion(obj).to.be.equal(str); * }); * * Can also be accessed directly from `chai.Assertion`. * * chai.Assertion.addMethod('foo', fn); * * Then can be used as any other assertion. * * expect(fooStr).to.be.foo('bar'); * * @param {Object} ctx object to which the method is added * @param {String} name of method to add * @param {Function} method function to be used for name * @name addMethod * @api public */ module.exports = function (ctx, name, method) { ctx[name] = function () { var result = method.apply(this, arguments); return result === undefined ? this : result; }; }; }); require.register("chai/lib/chai/utils/addProperty.js", function(exports, require, module){ /*! * Chai - addProperty utility * Copyright(c) 2012-2014 Jake Luer * MIT Licensed */ /** * ### addProperty (ctx, name, getter) * * Adds a property to the prototype of an object. * * utils.addProperty(chai.Assertion.prototype, 'foo', function () { * var obj = utils.flag(this, 'object'); * new chai.Assertion(obj).to.be.instanceof(Foo); * }); * * Can also be accessed directly from `chai.Assertion`. * * chai.Assertion.addProperty('foo', fn); * * Then can be used as any other assertion. * * expect(myFoo).to.be.foo; * * @param {Object} ctx object to which the property is added * @param {String} name of property to add * @param {Function} getter function to be used for name * @name addProperty * @api public */ module.exports = function (ctx, name, getter) { Object.defineProperty(ctx, name, { get: function () { var result = getter.call(this); return result === undefined ? this : result; } , configurable: true }); }; }); require.register("chai/lib/chai/utils/flag.js", function(exports, require, module){ /*! * Chai - flag utility * Copyright(c) 2012-2014 Jake Luer * MIT Licensed */ /** * ### flag(object ,key, [value]) * * Get or set a flag value on an object. If a * value is provided it will be set, else it will * return the currently set value or `undefined` if * the value is not set. * * utils.flag(this, 'foo', 'bar'); // setter * utils.flag(this, 'foo'); // getter, returns `bar` * * @param {Object} object (constructed Assertion * @param {String} key * @param {Mixed} value (optional) * @name flag * @api private */ module.exports = function (obj, key, value) { var flags = obj.__flags || (obj.__flags = Object.create(null)); if (arguments.length === 3) { flags[key] = value; } else { return flags[key]; } }; }); require.register("chai/lib/chai/utils/getActual.js", function(exports, require, module){ /*! * Chai - getActual utility * Copyright(c) 2012-2014 Jake Luer * MIT Licensed */ /** * # getActual(object, [actual]) * * Returns the `actual` value for an Assertion * * @param {Object} object (constructed Assertion) * @param {Arguments} chai.Assertion.prototype.assert arguments */ module.exports = function (obj, args) { var actual = args[4]; return 'undefined' !== typeof actual ? actual : obj._obj; }; }); require.register("chai/lib/chai/utils/getEnumerableProperties.js", function(exports, require, module){ /*! * Chai - getEnumerableProperties utility * Copyright(c) 2012-2014 Jake Luer * MIT Licensed */ /** * ### .getEnumerableProperties(object) * * This allows the retrieval of enumerable property names of an object, * inherited or not. * * @param {Object} object * @returns {Array} * @name getEnumerableProperties * @api public */ module.exports = function getEnumerableProperties(object) { var result = []; for (var name in object) { result.push(name); } return result; }; }); require.register("chai/lib/chai/utils/getMessage.js", function(exports, require, module){ /*! * Chai - message composition utility * Copyright(c) 2012-2014 Jake Luer * MIT Licensed */ /*! * Module dependancies */ var flag = require('./flag') , getActual = require('./getActual') , inspect = require('./inspect') , objDisplay = require('./objDisplay'); /** * ### .getMessage(object, message, negateMessage) * * Construct the error message based on flags * and template tags. Template tags will return * a stringified inspection of the object referenced. * * Message template tags: * - `#{this}` current asserted object * - `#{act}` actual value * - `#{exp}` expected value * * @param {Object} object (constructed Assertion) * @param {Arguments} chai.Assertion.prototype.assert arguments * @name getMessage * @api public */ module.exports = function (obj, args) { var negate = flag(obj, 'negate') , val = flag(obj, 'object') , expected = args[3] , actual = getActual(obj, args) , msg = negate ? args[2] : args[1] , flagMsg = flag(obj, 'message'); msg = msg || ''; msg = msg .replace(/#{this}/g, objDisplay(val)) .replace(/#{act}/g, objDisplay(actual)) .replace(/#{exp}/g, objDisplay(expected)); return flagMsg ? flagMsg + ': ' + msg : msg; }; }); require.register("chai/lib/chai/utils/getName.js", function(exports, require, module){ /*! * Chai - getName utility * Copyright(c) 2012-2014 Jake Luer * MIT Licensed */ /** * # getName(func) * * Gets the name of a function, in a cross-browser way. * * @param {Function} a function (usually a constructor) */ module.exports = function (func) { if (func.name) return func.name; var match = /^\s?function ([^(]*)\(/.exec(func); return match && match[1] ? match[1] : ""; }; }); require.register("chai/lib/chai/utils/getPathValue.js", function(exports, require, module){ /*! * Chai - getPathValue utility * Copyright(c) 2012-2014 Jake Luer * @see https://github.com/logicalparadox/filtr * MIT Licensed */ /** * ### .getPathValue(path, object) * * This allows the retrieval of values in an * object given a string path. * * var obj = { * prop1: { * arr: ['a', 'b', 'c'] * , str: 'Hello' * } * , prop2: { * arr: [ { nested: 'Universe' } ] * , str: 'Hello again!' * } * } * * The following would be the results. * * getPathValue('prop1.str', obj); // Hello * getPathValue('prop1.att[2]', obj); // b * getPathValue('prop2.arr[0].nested', obj); // Universe * * @param {String} path * @param {Object} object * @returns {Object} value or `undefined` * @name getPathValue * @api public */ var getPathValue = module.exports = function (path, obj) { var parsed = parsePath(path); return _getPathValue(parsed, obj); }; /*! * ## parsePath(path) * * Helper function used to parse string object * paths. Use in conjunction with `_getPathValue`. * * var parsed = parsePath('myobject.property.subprop'); * * ### Paths: * * * Can be as near infinitely deep and nested * * Arrays are also valid using the formal `myobject.document[3].property`. * * @param {String} path * @returns {Object} parsed * @api private */ function parsePath (path) { var str = path.replace(/\[/g, '.[') , parts = str.match(/(\\\.|[^.]+?)+/g); return parts.map(function (value) { var re = /\[(\d+)\]$/ , mArr = re.exec(value) if (mArr) return { i: parseFloat(mArr[1]) }; else return { p: value }; }); }; /*! * ## _getPathValue(parsed, obj) * * Helper companion function for `.parsePath` that returns * the value located at the parsed address. * * var value = getPathValue(parsed, obj); * * @param {Object} parsed definition from `parsePath`. * @param {Object} object to search against * @returns {Object|Undefined} value * @api private */ function _getPathValue (parsed, obj) { var tmp = obj , res; for (var i = 0, l = parsed.length; i < l; i++) { var part = parsed[i]; if (tmp) { if ('undefined' !== typeof part.p) tmp = tmp[part.p]; else if ('undefined' !== typeof part.i) tmp = tmp[part.i]; if (i == (l - 1)) res = tmp; } else { res = undefined; } } return res; }; }); require.register("chai/lib/chai/utils/getProperties.js", function(exports, require, module){ /*! * Chai - getProperties utility * Copyright(c) 2012-2014 Jake Luer * MIT Licensed */ /** * ### .getProperties(object) * * This allows the retrieval of property names of an object, enumerable or not, * inherited or not. * * @param {Object} object * @returns {Array} * @name getProperties * @api public */ module.exports = function getProperties(object) { var result = Object.getOwnPropertyNames(subject); function addProperty(property) { if (result.indexOf(property) === -1) { result.push(property); } } var proto = Object.getPrototypeOf(subject); while (proto !== null) { Object.getOwnPropertyNames(proto).forEach(addProperty); proto = Object.getPrototypeOf(proto); } return result; }; }); require.register("chai/lib/chai/utils/index.js", function(exports, require, module){ /*! * chai * Copyright(c) 2011 Jake Luer * MIT Licensed */ /*! * Main exports */ var exports = module.exports = {}; /*! * test utility */ exports.test = require('./test'); /*! * type utility */ exports.type = require('./type'); /*! * message utility */ exports.getMessage = require('./getMessage'); /*! * actual utility */ exports.getActual = require('./getActual'); /*! * Inspect util */ exports.inspect = require('./inspect'); /*! * Object Display util */ exports.objDisplay = require('./objDisplay'); /*! * Flag utility */ exports.flag = require('./flag'); /*! * Flag transferring utility */ exports.transferFlags = require('./transferFlags'); /*! * Deep equal utility */ exports.eql = require('deep-eql'); /*! * Deep path value */ exports.getPathValue = require('./getPathValue'); /*! * Function name */ exports.getName = require('./getName'); /*! * add Property */ exports.addProperty = require('./addProperty'); /*! * add Method */ exports.addMethod = require('./addMethod'); /*! * overwrite Property */ exports.overwriteProperty = require('./overwriteProperty'); /*! * overwrite Method */ exports.overwriteMethod = require('./overwriteMethod'); /*! * Add a chainable method */ exports.addChainableMethod = require('./addChainableMethod'); /*! * Overwrite chainable method */ exports.overwriteChainableMethod = require('./overwriteChainableMethod'); }); require.register("chai/lib/chai/utils/inspect.js", function(exports, require, module){ // This is (almost) directly from Node.js utils // https://github.com/joyent/node/blob/f8c335d0caf47f16d31413f89aa28eda3878e3aa/lib/util.js var getName = require('./getName'); var getProperties = require('./getProperties'); var getEnumerableProperties = require('./getEnumerableProperties'); module.exports = inspect; /** * Echos the value of a value. Trys to print the value out * in the best way possible given the different types. * * @param {Object} obj The object to print out. * @param {Boolean} showHidden Flag that shows hidden (not enumerable) * properties of objects. * @param {Number} depth Depth in which to descend in object. Default is 2. * @param {Boolean} colors Flag to turn on ANSI escape codes to color the * output. Default is false (no coloring). */ function inspect(obj, showHidden, depth, colors) { var ctx = { showHidden: showHidden, seen: [], stylize: function (str) { return str; } }; return formatValue(ctx, obj, (typeof depth === 'undefined' ? 2 : depth)); } // https://gist.github.com/1044128/ var getOuterHTML = function(element) { if ('outerHTML' in element) return element.outerHTML; var ns = "http://www.w3.org/1999/xhtml"; var container = document.createElementNS(ns, '_'); var elemProto = (window.HTMLElement || window.Element).prototype; var xmlSerializer = new XMLSerializer(); var html; if (document.xmlVersion) { return xmlSerializer.serializeToString(element); } else { container.appendChild(element.cloneNode(false)); html = container.innerHTML.replace('><', '>' + element.innerHTML + '<'); container.innerHTML = ''; return html; } }; // Returns true if object is a DOM element. var isDOMElement = function (object) { if (typeof HTMLElement === 'object') { return object instanceof HTMLElement; } else { return object && typeof object === 'object' && object.nodeType === 1 && typeof object.nodeName === 'string'; } }; function formatValue(ctx, value, recurseTimes) { // Provide a hook for user-specified inspect functions. // Check that value is an object with an inspect function on it if (value && typeof value.inspect === 'function' && // Filter out the util module, it's inspect function is special value.inspect !== exports.inspect && // Also filter out any prototype objects using the circular check. !(value.constructor && value.constructor.prototype === value)) { var ret = value.inspect(recurseTimes); if (typeof ret !== 'string') { ret = formatValue(ctx, ret, recurseTimes); } return ret; } // Primitive types cannot have properties var primitive = formatPrimitive(ctx, value); if (primitive) { return primitive; } // If it's DOM elem, get outer HTML. if (isDOMElement(value)) { return getOuterHTML(value); } // Look up the keys of the object. var visibleKeys = getEnumerableProperties(value); var keys = ctx.showHidden ? getProperties(value) : visibleKeys; // Some type of object without properties can be shortcutted. // In IE, errors have a single `stack` property, or if they are vanilla `Error`, // a `stack` plus `description` property; ignore those for consistency. if (keys.length === 0 || (isError(value) && ( (keys.length === 1 && keys[0] === 'stack') || (keys.length === 2 && keys[0] === 'description' && keys[1] === 'stack') ))) { if (typeof value === 'function') { var name = getName(value); var nameSuffix = name ? ': ' + name : ''; return ctx.stylize('[Function' + nameSuffix + ']', 'special'); } if (isRegExp(value)) { return ctx.stylize(RegExp.prototype.toString.call(value), 'regexp'); } if (isDate(value)) { return ctx.stylize(Date.prototype.toUTCString.call(value), 'date'); } if (isError(value)) { return formatError(value); } } var base = '', array = false, braces = ['{', '}']; // Make Array say that they are Array if (isArray(value)) { array = true; braces = ['[', ']']; } // Make functions say that they are functions if (typeof value === 'function') { var name = getName(value); var nameSuffix = name ? ': ' + name : ''; base = ' [Function' + nameSuffix + ']'; } // Make RegExps say that they are RegExps if (isRegExp(value)) { base = ' ' + RegExp.prototype.toString.call(value); } // Make dates with properties first say the date if (isDate(value)) { base = ' ' + Date.prototype.toUTCString.call(value); } // Make error with message first say the error if (isError(value)) { return formatError(value); } if (keys.length === 0 && (!array || value.length == 0)) { return braces[0] + base + braces[1]; } if (recurseTimes < 0) { if (isRegExp(value)) { return ctx.stylize(RegExp.prototype.toString.call(value), 'regexp'); } else { return ctx.stylize('[Object]', 'special'); } } ctx.seen.push(value); var output; if (array) { output = formatArray(ctx, value, recurseTimes, visibleKeys, keys); } else { output = keys.map(function(key) { return formatProperty(ctx, value, recurseTimes, visibleKeys, key, array); }); } ctx.seen.pop(); return reduceToSingleString(output, base, braces); } function formatPrimitive(ctx, value) { switch (typeof value) { case 'undefined': return ctx.stylize('undefined', 'undefined'); case 'string': var simple = '\'' + JSON.stringify(value).replace(/^"|"$/g, '') .replace(/'/g, "\\'") .replace(/\\"/g, '"') + '\''; return ctx.stylize(simple, 'string'); case 'number': return ctx.stylize('' + value, 'number'); case 'boolean': return ctx.stylize('' + value, 'boolean'); } // For some reason typeof null is "object", so special case here. if (value === null) { return ctx.stylize('null', 'null'); } } function formatError(value) { return '[' + Error.prototype.toString.call(value) + ']'; } function formatArray(ctx, value, recurseTimes, visibleKeys, keys) { var output = []; for (var i = 0, l = value.length; i < l; ++i) { if (Object.prototype.hasOwnProperty.call(value, String(i))) { output.push(formatProperty(ctx, value, recurseTimes, visibleKeys, String(i), true)); } else { output.push(''); } } keys.forEach(function(key) { if (!key.match(/^\d+$/)) { output.push(formatProperty(ctx, value, recurseTimes, visibleKeys, key, true)); } }); return output; } function formatProperty(ctx, value, recurseTimes, visibleKeys, key, array) { var name, str; if (value.__lookupGetter__) { if (value.__lookupGetter__(key)) { if (value.__lookupSetter__(key)) { str = ctx.stylize('[Getter/Setter]', 'special'); } else { str = ctx.stylize('[Getter]', 'special'); } } else { if (value.__lookupSetter__(key)) { str = ctx.stylize('[Setter]', 'special'); } } } if (visibleKeys.indexOf(key) < 0) { name = '[' + key + ']'; } if (!str) { if (ctx.seen.indexOf(value[key]) < 0) { if (recurseTimes === null) { str = formatValue(ctx, value[key], null); } else { str = formatValue(ctx, value[key], recurseTimes - 1); } if (str.indexOf('\n') > -1) { if (array) { str = str.split('\n').map(function(line) { return ' ' + line; }).join('\n').substr(2); } else { str = '\n' + str.split('\n').map(function(line) { return ' ' + line; }).join('\n'); } } } else { str = ctx.stylize('[Circular]', 'special'); } } if (typeof name === 'undefined') { if (array && key.match(/^\d+$/)) { return str; } name = JSON.stringify('' + key); if (name.match(/^"([a-zA-Z_][a-zA-Z_0-9]*)"$/)) { name = name.substr(1, name.length - 2); name = ctx.stylize(name, 'name'); } else { name = name.replace(/'/g, "\\'") .replace(/\\"/g, '"') .replace(/(^"|"$)/g, "'"); name = ctx.stylize(name, 'string'); } } return name + ': ' + str; } function reduceToSingleString(output, base, braces) { var numLinesEst = 0; var length = output.reduce(function(prev, cur) { numLinesEst++; if (cur.indexOf('\n') >= 0) numLinesEst++; return prev + cur.length + 1; }, 0); if (length > 60) { return braces[0] + (base === '' ? '' : base + '\n ') + ' ' + output.join(',\n ') + ' ' + braces[1]; } return braces[0] + base + ' ' + output.join(', ') + ' ' + braces[1]; } function isArray(ar) { return Array.isArray(ar) || (typeof ar === 'object' && objectToString(ar) === '[object Array]'); } function isRegExp(re) { return typeof re === 'object' && objectToString(re) === '[object RegExp]'; } function isDate(d) { return typeof d === 'object' && objectToString(d) === '[object Date]'; } function isError(e) { return typeof e === 'object' && objectToString(e) === '[object Error]'; } function objectToString(o) { return Object.prototype.toString.call(o); } }); require.register("chai/lib/chai/utils/objDisplay.js", function(exports, require, module){ /*! * Chai - flag utility * Copyright(c) 2012-2014 Jake Luer * MIT Licensed */ /*! * Module dependancies */ var inspect = require('./inspect'); /** * ### .objDisplay (object) * * Determines if an object or an array matches * criteria to be inspected in-line for error * messages or should be truncated. * * @param {Mixed} javascript object to inspect * @name objDisplay * @api public */ module.exports = function (obj) { var str = inspect(obj) , type = Object.prototype.toString.call(obj); if (str.length >= 40) { if (type === '[object Function]') { return !obj.name || obj.name === '' ? '[Function]' : '[Function: ' + obj.name + ']'; } else if (type === '[object Array]') { return '[ Array(' + obj.length + ') ]'; } else if (type === '[object Object]') { var keys = Object.keys(obj) , kstr = keys.length > 2 ? keys.splice(0, 2).join(', ') + ', ...' : keys.join(', '); return '{ Object (' + kstr + ') }'; } else { return str; } } else { return str; } }; }); require.register("chai/lib/chai/utils/overwriteMethod.js", function(exports, require, module){ /*! * Chai - overwriteMethod utility * Copyright(c) 2012-2014 Jake Luer * MIT Licensed */ /** * ### overwriteMethod (ctx, name, fn) * * Overwites an already existing method and provides * access to previous function. Must return function * to be used for name. * * utils.overwriteMethod(chai.Assertion.prototype, 'equal', function (_super) { * return function (str) { * var obj = utils.flag(this, 'object'); * if (obj instanceof Foo) { * new chai.Assertion(obj.value).to.equal(str); * } else { * _super.apply(this, arguments); * } * } * }); * * Can also be accessed directly from `chai.Assertion`. * * chai.Assertion.overwriteMethod('foo', fn); * * Then can be used as any other assertion. * * expect(myFoo).to.equal('bar'); * * @param {Object} ctx object whose method is to be overwritten * @param {String} name of method to overwrite * @param {Function} method function that returns a function to be used for name * @name overwriteMethod * @api public */ module.exports = function (ctx, name, method) { var _method = ctx[name] , _super = function () { return this; }; if (_method && 'function' === typeof _method) _super = _method; ctx[name] = function () { var result = method(_super).apply(this, arguments); return result === undefined ? this : result; } }; }); require.register("chai/lib/chai/utils/overwriteProperty.js", function(exports, require, module){ /*! * Chai - overwriteProperty utility * Copyright(c) 2012-2014 Jake Luer * MIT Licensed */ /** * ### overwriteProperty (ctx, name, fn) * * Overwites an already existing property getter and provides * access to previous value. Must return function to use as getter. * * utils.overwriteProperty(chai.Assertion.prototype, 'ok', function (_super) { * return function () { * var obj = utils.flag(this, 'object'); * if (obj instanceof Foo) { * new chai.Assertion(obj.name).to.equal('bar'); * } else { * _super.call(this); * } * } * }); * * * Can also be accessed directly from `chai.Assertion`. * * chai.Assertion.overwriteProperty('foo', fn); * * Then can be used as any other assertion. * * expect(myFoo).to.be.ok; * * @param {Object} ctx object whose property is to be overwritten * @param {String} name of property to overwrite * @param {Function} getter function that returns a getter function to be used for name * @name overwriteProperty * @api public */ module.exports = function (ctx, name, getter) { var _get = Object.getOwnPropertyDescriptor(ctx, name) , _super = function () {}; if (_get && 'function' === typeof _get.get) _super = _get.get Object.defineProperty(ctx, name, { get: function () { var result = getter(_super).call(this); return result === undefined ? this : result; } , configurable: true }); }; }); require.register("chai/lib/chai/utils/overwriteChainableMethod.js", function(exports, require, module){ /*! * Chai - overwriteChainableMethod utility * Copyright(c) 2012-2014 Jake Luer * MIT Licensed */ /** * ### overwriteChainableMethod (ctx, name, fn) * * Overwites an already existing chainable method * and provides access to the previous function or * property. Must return functions to be used for * name. * * utils.overwriteChainableMethod(chai.Assertion.prototype, 'length', * function (_super) { * } * , function (_super) { * } * ); * * Can also be accessed directly from `chai.Assertion`. * * chai.Assertion.overwriteChainableMethod('foo', fn, fn); * * Then can be used as any other assertion. * * expect(myFoo).to.have.length(3); * expect(myFoo).to.have.length.above(3); * * @param {Object} ctx object whose method / property is to be overwritten * @param {String} name of method / property to overwrite * @param {Function} method function that returns a function to be used for name * @param {Function} chainingBehavior function that returns a function to be used for property * @name overwriteChainableMethod * @api public */ module.exports = function (ctx, name, method, chainingBehavior) { var chainableBehavior = ctx.__methods[name]; var _chainingBehavior = chainableBehavior.chainingBehavior; chainableBehavior.chainingBehavior = function () { var result = chainingBehavior(_chainingBehavior).call(this); return result === undefined ? this : result; }; var _method = chainableBehavior.method; chainableBehavior.method = function () { var result = method(_method).apply(this, arguments); return result === undefined ? this : result; }; }; }); require.register("chai/lib/chai/utils/test.js", function(exports, require, module){ /*! * Chai - test utility * Copyright(c) 2012-2014 Jake Luer * MIT Licensed */ /*! * Module dependancies */ var flag = require('./flag'); /** * # test(object, expression) * * Test and object for expression. * * @param {Object} object (constructed Assertion) * @param {Arguments} chai.Assertion.prototype.assert arguments */ module.exports = function (obj, args) { var negate = flag(obj, 'negate') , expr = args[0]; return negate ? !expr : expr; }; }); require.register("chai/lib/chai/utils/transferFlags.js", function(exports, require, module){ /*! * Chai - transferFlags utility * Copyright(c) 2012-2014 Jake Luer * MIT Licensed */ /** * ### transferFlags(assertion, object, includeAll = true) * * Transfer all the flags for `assertion` to `object`. If * `includeAll` is set to `false`, then the base Chai * assertion flags (namely `object`, `ssfi`, and `message`) * will not be transferred. * * * var newAssertion = new Assertion(); * utils.transferFlags(assertion, newAssertion); * * var anotherAsseriton = new Assertion(myObj); * utils.transferFlags(assertion, anotherAssertion, false); * * @param {Assertion} assertion the assertion to transfer the flags from * @param {Object} object the object to transfer the flags too; usually a new assertion * @param {Boolean} includeAll * @name getAllFlags * @api private */ module.exports = function (assertion, object, includeAll) { var flags = assertion.__flags || (assertion.__flags = Object.create(null)); if (!object.__flags) { object.__flags = Object.create(null); } includeAll = arguments.length === 3 ? includeAll : true; for (var flag in flags) { if (includeAll || (flag !== 'object' && flag !== 'ssfi' && flag != 'message')) { object.__flags[flag] = flags[flag]; } } }; }); require.register("chai/lib/chai/utils/type.js", function(exports, require, module){ /*! * Chai - type utility * Copyright(c) 2012-2014 Jake Luer * MIT Licensed */ /*! * Detectable javascript natives */ var natives = { '[object Arguments]': 'arguments' , '[object Array]': 'array' , '[object Date]': 'date' , '[object Function]': 'function' , '[object Number]': 'number' , '[object RegExp]': 'regexp' , '[object String]': 'string' }; /** * ### type(object) * * Better implementation of `typeof` detection that can * be used cross-browser. Handles the inconsistencies of * Array, `null`, and `undefined` detection. * * utils.type({}) // 'object' * utils.type(null) // `null' * utils.type(undefined) // `undefined` * utils.type([]) // `array` * * @param {Mixed} object to detect type of * @name type * @api private */ module.exports = function (obj) { var str = Object.prototype.toString.call(obj); if (natives[str]) return natives[str]; if (obj === null) return 'null'; if (obj === undefined) return 'undefined'; if (obj === Object(obj)) return 'object'; return typeof obj; }; }); require.alias("chaijs-assertion-error/index.js", "chai/deps/assertion-error/index.js"); require.alias("chaijs-assertion-error/index.js", "chai/deps/assertion-error/index.js"); require.alias("chaijs-assertion-error/index.js", "assertion-error/index.js"); require.alias("chaijs-assertion-error/index.js", "chaijs-assertion-error/index.js"); require.alias("chaijs-deep-eql/lib/eql.js", "chai/deps/deep-eql/lib/eql.js"); require.alias("chaijs-deep-eql/lib/eql.js", "chai/deps/deep-eql/index.js"); require.alias("chaijs-deep-eql/lib/eql.js", "deep-eql/index.js"); require.alias("chaijs-type-detect/lib/type.js", "chaijs-deep-eql/deps/type-detect/lib/type.js"); require.alias("chaijs-type-detect/lib/type.js", "chaijs-deep-eql/deps/type-detect/index.js"); require.alias("chaijs-type-detect/lib/type.js", "chaijs-type-detect/index.js"); require.alias("chaijs-deep-eql/lib/eql.js", "chaijs-deep-eql/index.js"); require.alias("chai/index.js", "chai/index.js");if (typeof exports == "object") { module.exports = require("chai"); } else if (typeof define == "function" && define.amd) { define([], function(){ return require("chai"); }); } else { this["chai"] = require("chai"); }})(); apache-couchdb-1.6.0/src/fauxton/test/mocha/sinon-chai.js0000644000175000001440000001066112332105522023231 0ustar00djcusers00000000000000(function (sinonChai) { "use strict"; // Module systems magic dance. if (typeof require === "function" && typeof exports === "object" && typeof module === "object") { // NodeJS module.exports = sinonChai; } else if (typeof define === "function" && define.amd) { // AMD define(function () { return sinonChai; }); } else { // Other environment (usually apache-couchdb-1.6.0/src/fauxton/test/test.config.underscore0000644000175000001440000000074212332105522024071 0ustar00djcusers00000000000000// vim: set ft=javascript: // Set the require.js configuration for your test setup. require.config( <%= JSON.stringify(configInfo, null, '\t') %> ); require([ "app", <% _.each(testFiles, function (test) {%> <% if (test[0] === '.') { %> '../<%= test %>', <% } else { %> '<%= test %>', <% } %> <% }) %> ], function() { if (window.mochaPhantomJS) { mochaPhantomJS.run(); } else { mocha.run(); } }); apache-couchdb-1.6.0/src/fauxton/Gruntfile.js0000644000175000001440000003534712332105522021102 0ustar00djcusers00000000000000// Licensed under the Apache License, Version 2.0 (the "License"); you may not // use this file except in compliance with the License. You may obtain a copy of // the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, WITHOUT // WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the // License for the specific language governing permissions and limitations under // the License. // This is the main application configuration file. It is a Grunt // configuration file, which you can learn more about here: // https://github.com/cowboy/grunt/blob/master/docs/configuring.md module.exports = function(grunt) { var helper = require('./tasks/helper').init(grunt), _ = grunt.util._, fs = require('fs'); var couch_config = function () { var default_couch_config = { fauxton: { db: 'http://localhost:5984/fauxton', app: './couchapp.js', options: { okay_if_missing: true } } }; var settings_couch_config = helper.readSettingsFile().couch_config; return settings_couch_config || default_couch_config; }(); var cleanableAddons = function () { var theListToClean = []; helper.processAddons(function(addon){ // Only clean addons that are included from a local dir if (addon.path){ theListToClean.push("app/addons/" + addon.name); } }); return theListToClean; }(); var cleanable = function(){ // Whitelist files and directories to be cleaned // You'll always want to clean these two directories // Now find the external addons you have and add them for cleaning up return _.union(["dist/", "app/load_addons.js"], cleanableAddons); }(); var assets = function(){ // Base assets var theAssets = { less:{ paths: ["assets/less"], files: { "dist/debug/css/fauxton.css": "assets/less/fauxton.less" } }, img: ["assets/img/**"], // used in concat:index_css to keep file ordering intact // fauxton.css should load first css: ["assets/css/*.css", "dist/debug/css/fauxton.css"] }; helper.processAddons(function(addon){ // Less files from addons var root = addon.path || "app/addons/" + addon.name; var lessPath = root + "/assets/less"; if(fs.existsSync(lessPath)){ // .less files exist for this addon theAssets.less.paths.push(lessPath); theAssets.less.files["dist/debug/css/" + addon.name + ".css"] = lessPath + "/" + addon.name + ".less"; theAssets.css.push("dist/debug/css/" + addon.name + ".css"); } // Images root = addon.path || "app/addons/" + addon.name; var imgPath = root + "/assets/img"; if(fs.existsSync(imgPath)){ theAssets.img.push(imgPath + "/**"); } }); return theAssets; }(); var templateSettings = function(){ var defaultSettings = { "development": { "src": "assets/index.underscore", "dest": "dist/debug/index.html", "variables": { "requirejs": "/assets/js/libs/require.js", "css": "./css/index.css", "base": null } }, "release": { "src": "assets/index.underscore", "dest": "dist/debug/index.html", "variables": { "requirejs": "./js/require.js", "css": "./css/index.css", "base": null } } }; var settings = helper.readSettingsFile(); return settings.template || defaultSettings; }(); var couchserver_config = function () { // add a "couchserver" key to settings.json with JSON that matches the // keys and values below (plus your customizations) to have Fauxton work // against a remote CouchDB-compatible server. var defaults = { dist: './dist/debug/', port: 8000, proxy: { target: { host: 'localhost', port: 5984, https: false }, // This sets the Host header in the proxy so that you can use external // CouchDB instances and not have the Host set to 'localhost' changeOrigin: true } }; return helper.readSettingsFile().couchserver || defaults; }(); grunt.initConfig({ // The clean task ensures all files are removed from the dist/ directory so // that no files linger from previous builds. clean: { release: cleanable, watch: cleanableAddons }, less: { compile: { options: { paths: assets.less.paths }, files: assets.less.files } }, // The jshint option for scripturl is set to lax, because the anchor // override inside main.js needs to test for them so as to not accidentally // route. Settings expr true so we can do `migtBeNullObject && mightBeNullObject.coolFunction()` jshint: { all: ['app/**/*.js', 'Gruntfile.js', "!app/**/assets/js/*.js"], options: { scripturl: true, evil: true, expr: true } }, // The jst task compiles all application templates into JavaScript // functions with the underscore.js template function from 1.2.4. You can // change the namespace and the template options, by reading this: // https://github.com/gruntjs/grunt-contrib/blob/master/docs/jst.md // // The concat task depends on this file to exist, so if you decide to // remove this, ensure concat is updated accordingly. jst: { compile: { options: { processContent: function(src) { return src.replace(//gm, ''); } }, files: { "dist/debug/templates.js": [ "app/templates/**/*.html", "app/addons/**/templates/**/*.html" ] } } }, template: templateSettings, // The concatenate task is used here to merge the almond require/define // shim and the templates into the application code. It's named // dist/debug/require.js, because we want to only load one script file in // index.html. concat: { requirejs: { src: [ "assets/js/libs/require.js", "dist/debug/templates.js", "dist/debug/require.js"], dest: "dist/debug/js/require.js" }, index_css: { src: assets.css, dest: 'dist/debug/css/index.css' }, test_config_js: { src: ["dist/debug/templates.js", "test/test.config.js"], dest: 'test/test.config.js' }, }, cssmin: { compress: { files: { "dist/release/css/index.css": [ "dist/debug/css/index.css", 'assets/css/*.css', "app/addons/**/assets/css/*.css" ] }, options: { report: 'min' } } }, uglify: { release: { files: { "dist/release/js/require.js": [ "dist/debug/js/require.js" ] } } }, // Runs a proxy server for easier development, no need to keep deploying to couchdb couchserver: couchserver_config, watch: { js: { files: helper.watchFiles(['.js'], ["./app/**/*.js", '!./app/load_addons.js',"./assets/**/*.js", "./test/**/*.js"]), tasks: ['watchRun'], }, style: { files: helper.watchFiles(['.less','.css'],["./app/**/*.css","./app/**/*.less","./assets/**/*.css", "./assets/**/*.less"]), tasks: ['clean:watch', 'dependencies','less', 'concat:index_css'], }, html: { // the index.html is added in as a dummy file incase there is no // html dependancies this will break. So we need one include pattern files: helper.watchFiles(['.html'], ['./index.html']), tasks: ['clean:watch', 'dependencies'] }, options: { nospawn: true, debounceDelay: 500 } }, requirejs: { compile: { options: { baseUrl: 'app', // Include the main configuration file. mainConfigFile: "app/config.js", // Output file. out: "dist/debug/require.js", // Root application module. name: "config", // Do not wrap everything in an IIFE. wrap: false, optimize: "none", findNestedDependencies: true } } }, // Copy build artifacts and library code into the distribution // see - http://gruntjs.com/configuring-tasks#building-the-files-object-dynamically copy: { couchdb: { files: [ // this gets built in the template task {src: "dist/release/index.html", dest: "../../share/www/fauxton/index.html"}, {src: ["**"], dest: "../../share/www/fauxton/js/", cwd:'dist/release/js/', expand: true}, {src: ["**"], dest: "../../share/www/fauxton/img/", cwd:'dist/release/img/', expand: true}, {src: ["**"], dest: "../../share/www/fauxton/css/", cwd:"dist/release/css/", expand: true} ] }, couchdebug: { files: [ // this gets built in the template task {src: "dist/debug/index.html", dest: "../../share/www/fauxton/index.html"}, {src: ["**"], dest: "../../share/www/fauxton/js/", cwd:'dist/debug/js/', expand: true}, {src: ["**"], dest: "../../share/www/fauxton/img/", cwd:'dist/debug/img/', expand: true}, {src: ["**"], dest: "../../share/www/fauxton/css/", cwd:"dist/debug/css/", expand: true} ] }, ace: { files: [ {src: "assets/js/libs/ace/worker-json.js", dest: "dist/release/js/ace/worker-json.js"}, {src: "assets/js/libs/ace/mode-json.js", dest: "dist/release/js/ace/mode-json.js"}, {src: "assets/js/libs/ace/theme-crimson_editor.js", dest: "dist/release/js/ace/theme-crimson_editor.js"}, {src: "assets/js/libs/ace/mode-javascript.js", dest: "dist/release/js/ace/mode-javascript.js"}, {src: "assets/js/libs/ace/worker-javascript.js", dest: "dist/release/js/ace/worker-javascript.js"}, ] }, dist:{ files:[ {src: "dist/debug/index.html", dest: "dist/release/index.html"}, {src: assets.img, dest: "dist/release/img/", flatten: true, expand: true} ] }, debug:{ files:[ {src: assets.img, dest: "dist/debug/img/", flatten: true, expand: true} ] } }, get_deps: { "default": { src: "settings.json" } }, gen_load_addons: { "default": { src: "settings.json" } }, gen_initialize: templateSettings, mkcouchdb: couch_config, rmcouchdb: couch_config, couchapp: couch_config, mochaSetup: { default: { files: { src: helper.watchFiles(['[Ss]pec.js'], ['./app/**/*[Ss]pec.js'])}, template: 'test/test.config.underscore', config: './app/config.js' } }, mocha_phantomjs: { all: ['test/runner.html'] } }); // on watch events configure jshint:all to only run on changed file grunt.event.on('watch', function(action, filepath) { if (!!filepath.match(/.js$/) && filepath.indexOf('test.config.js') === -1) { grunt.config(['jshint', 'all'], filepath); } if (!!filepath.match(/[Ss]pec.js$/)) { //grunt.task.run(['mochaSetup','jst', 'concat:test_config_js', 'mocha_phantomjs']); } }); /* * Load Grunt plugins */ // Load fauxton specific tasks grunt.loadTasks('tasks'); // Load the couchapp task grunt.loadNpmTasks('grunt-couchapp'); // Load the copy task grunt.loadNpmTasks('grunt-contrib-watch'); // Load the exec task grunt.loadNpmTasks('grunt-exec'); // Load Require.js task grunt.loadNpmTasks('grunt-contrib-requirejs'); // Load Copy task grunt.loadNpmTasks('grunt-contrib-copy'); // Load Clean task grunt.loadNpmTasks('grunt-contrib-clean'); // Load jshint task grunt.loadNpmTasks('grunt-contrib-jshint'); // Load jst task grunt.loadNpmTasks('grunt-contrib-jst'); // Load less task grunt.loadNpmTasks('grunt-contrib-less'); // Load concat task grunt.loadNpmTasks('grunt-contrib-concat'); // Load UglifyJS task grunt.loadNpmTasks('grunt-contrib-uglify'); // Load CSSMin task grunt.loadNpmTasks('grunt-contrib-cssmin'); grunt.loadNpmTasks('grunt-mocha-phantomjs'); /* * Default task */ // defult task - install minified app to local CouchDB grunt.registerTask('default', 'couchdb'); /* * Transformation tasks */ // clean out previous build artefactsa and lint grunt.registerTask('lint', ['clean', 'jshint']); grunt.registerTask('test', ['lint', 'dependencies', 'gen_initialize:development', 'test_inline']); // lighter weight test task for use inside dev/watch grunt.registerTask('test_inline', ['mochaSetup','jst', 'concat:test_config_js','mocha_phantomjs']); // Fetch dependencies (from git or local dir), lint them and make load_addons grunt.registerTask('dependencies', ['get_deps', 'gen_load_addons:default']); // build templates, js and css grunt.registerTask('build', ['less', 'concat:index_css', 'jst', 'requirejs', 'concat:requirejs', 'template:release']); // minify code and css, ready for release. grunt.registerTask('minify', ['uglify', 'cssmin:compress']); /* * Build the app in either dev, debug, or release mode */ // dev server grunt.registerTask('dev', ['debugDev', 'couchserver']); // build a debug release grunt.registerTask('debug', ['lint', 'dependencies', "gen_initialize:development", 'concat:requirejs','less', 'concat:index_css', 'template:development', 'copy:debug']); grunt.registerTask('debugDev', ['clean', 'dependencies', "gen_initialize:development",'jshint','less', 'concat:index_css', 'template:development', 'copy:debug']); grunt.registerTask('watchRun', ['clean:watch', 'dependencies', 'jshint']); // build a release grunt.registerTask('release', ['clean' ,'dependencies', "gen_initialize:release", 'jshint', 'build', 'minify', 'copy:dist', 'copy:ace']); grunt.registerTask('couchapp_release', ['clean' ,'dependencies', "gen_initialize:couchapp", 'jshint', 'build', 'minify', 'copy:dist', 'copy:ace']); /* * Install into CouchDB in either debug, release, or couchapp mode */ // make a development install that is server by mochiweb under _utils grunt.registerTask('couchdebug', ['debug', 'copy:couchdebug']); // make a minimized install that is server by mochiweb under _utils grunt.registerTask('couchdb', ['release', 'copy:couchdb']); // make an install that can be deployed as a couchapp grunt.registerTask('couchapp_setup', ['couchapp_release']); // install fauxton as couchapp grunt.registerTask('couchapp_install', ['rmcouchdb:fauxton', 'mkcouchdb:fauxton', 'couchapp:fauxton']); // setup and install fauxton as couchapp grunt.registerTask('couchapp_deploy', ['couchapp_setup', 'couchapp_install']); }; apache-couchdb-1.6.0/src/fauxton/favicon.ico0000644000175000001440000000217612332105522020720 0ustar00djcusers00000000000000 h(  @’’’’’’’’’’’’’’’#õīę‰īęŠĶźąÄ’źąÄ’īęŠĶõīꉒ’’#’’’’’’’’’’’’’’’’’’’’’õīꉼąÄ’źąÄ’źąÄ’źąÄ’źąÄ’źąÄ’źąÄ’źąÄ’õīꉒ’’’’’’’’’’’’’’īęŠĶźąÄ’źąÄ’źąÄ’źąÄ’Ō»•’Ā•`’œZ’œZ’Ļ«|’åŲ»’īęŠĶ’’’’’’’’’õīę‰åŲ»’Ťy’²†S’¼|7’¶€E’¤k/’Ær3’¹y6’¼|7’²t3’²†S’źąÄ’õīꉒ’’’’’#źąÄ’Ťy’¤k/’²t3’¼|7’Ær3’¤k/’Ær3’¹y6’¼|7’²t3’­k1’źąÄ’źąÄ’’’’#ōīŽ™źąÄ’²†S’¤k/’²t3’¼|7’Ær3’¤k/’Ær3’¹y6’¼|7’²t3’­k1’źąÄ’źąÄ’ōīŽ™īęŠĶźąÄ’²†S’¤k/’²t3’¼|7’Ær3’¤k/’Ær3’¹y6’¼|7’²t3’­k1’źąÄ’źąÄ’īęŠĶźąÄ’źąÄ’²†S’¤k/’²t3’¼|7’Ær3’¤k/’Ær3’Ģ™f’¶€E’²t3’­k1’źąÄ’źąÄ’źąÄ’źąÄ’źąÄ’²†S’¤k/’œZ’͜h’Ąs’āѾ’’’’’’’’’’’’’õīę’²†S’źąÄ’źąÄ’źąÄ’īęŠĶźąÄ’Ąs’õīę’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’üśų’źąÄ’źąÄ’īęŠĶōīŽ™źąÄ’šēŪ’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’õīę’źąÄ’źąÄ’ōīŽ™’’’#źąÄ’ļčÓ’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’üśų’Ōø“’źąÄ’źąÄ’’’’#’’’õīꉼąÄ’ėāČ’ōīŽ’õīę’’’’’’’’’’’’’’’’’’’’’’’’’ōīŽ’źąÄ’õīꉒ’’’’’’’’īęŠĶźąÄ’źąÄ’źąÄ’ōīŽ’’’’’’’’’’’’’’’’’õīę’ėāČ’īęŠĶ’’’’’’’’’’’’’’’õīꉼąÄ’źąÄ’źąÄ’źąÄ’ļčÓ’ļčÓ’ėāČ’źąÄ’õīꉒ’’’’’’’’’’’’’’’’’’’’’’’#õīę‰īęŠĶźąÄ’źąÄ’īęŠĶõīꉒ’’#’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’apache-couchdb-1.6.0/src/fauxton/writing_addons.md0000644000175000001440000001100112332105522022117 0ustar00djcusers00000000000000# Addons Addons allow you to extend Fauxton for a specific use case. Addons will usually have the following structure: * templates/ * my_addon.html - _underscore template fragments_ * base.js - _entry point to the addon_ * resources.js - _models and collections of the addon_ * routes.js - _URL routing for the addon_ * views.js - _views that the model provides_ [optional] * assets/less * my_addon.less ## Generating an addon We have a `grunt-init` template that lets you create a skeleton addon, including all the boiler plate code. Run `./node_modules/.bin/grunt-init tasks/addon` and answer the questions it asks to create an addon: $ ./node_modules/.bin/grunt-init tasks/addon path.existsSync is now called `fs.existsSync`. Running "addon" task Please answer the following: [?] Add on Name (WickedCool) SuperAddon [?] Location of add ons (app/addons) [?] Do you need an assets folder?(for .less) (y/N) [?] Do you need to make any changes to the above before continuing? (y/N) Created addon SuperAddon in app/addons Done, without errors. Once the addon is created add the name to the settings.json file to get it compiled and added on the next install. ## Routes and hooks An addon can insert itself into fauxton in two ways; via a route or via a hook. ### Routes An addon will override an existing route should one exist, but in all other ways is just a normal backbone route/view. This is how you would add a whole new feature. ### Hooks Hooks let you modify/extend an existing feature. They modify a DOM element by selector for a named set of routes, for example: var Search = new FauxtonAPI.addon(); Search.hooks = { // Render additional content into the sidebar "#sidebar-content": { routes:[ "database/:database/_design/:ddoc/_search/:search", "database/:database/_design/:ddoc/_view/:view", "database/:database/_:handler"], callback: searchSidebar } }; return Search; adds the `searchSidebar` callback to `#sidebar-content` for three routes. ## Hello world addon First create the addon skeleton: ± bbb addon path.existsSync is now called `fs.existsSync`. Running "addon" task Please answer the following: [?] Add on Name (WickedCool) Hello [?] Location of add ons (app/addons) [?] Do you need to make any changes to the above before continuing? (y/N) Created addon Hello in app/addons Done, without errors. In `app/addons/hello/templates/hello.html` place:

    Hello!

    Next, we'll defined a simple view in `resources.js` (for more complex addons you may want to have a views.js) that renders that template: define([ "app", "api" ], function (app, FauxtonAPI) { var Resources = {}; Resources.Hello = FauxtonAPI.View.extend({ template: "addons/hello/templates/hello" }); return Resources; }); Then define a route in `routes.js` that the addon is accessible at: define([ "app", "api", "addons/hello/resources" ], function(app, FauxtonAPI, Resources) { var HelloRouteObject = FauxtonAPI.RouteObject.extend({ layout: "one_pane", crumbs: [ {"name": "Hello","link": "_hello"} ], routes: { "_hello": "helloRoute" }, selectedHeader: "Hello", roles: ["_admin"], apiUrl:'hello', initialize: function () { //put common views used on all your routes here (eg: sidebars ) }, helloRoute: function () { this.setView("#dashboard-content", new Resources.Hello({})); } }); Resources.RouteObjects = [HelloRouteObject]; return Resources; }); Then wire it all together in base.js: define([ "app", "api", "addons/hello/routes" ], function(app, FauxtonAPI, HelloRoutes) { HelloRoutes.initialize = function() { FauxtonAPI.addHeaderLink({title: "Hello", href: "#_hello"}); }; return HelloRoutes; }); Once the code is in place include the add on in your `settings.json` so that it gets included by the `require` task. Your addon is included in one of three ways; a local path, a git URL or a name. Named plugins assume the plugin is in the fauxton base directory, addons with a git URL will be cloned into the application, local paths will be copied. Addons included from a local path will be cleaned out by the clean task, others are left alone. **TODO:** addons via npm module apache-couchdb-1.6.0/src/fauxton/tasks/0000755000175000001440000000000012332105600017713 5ustar00djcusers00000000000000apache-couchdb-1.6.0/src/fauxton/tasks/addon/0000755000175000001440000000000012332105600021000 5ustar00djcusers00000000000000apache-couchdb-1.6.0/src/fauxton/tasks/addon/root/0000755000175000001440000000000012332105600021763 5ustar00djcusers00000000000000apache-couchdb-1.6.0/src/fauxton/tasks/addon/root/resources.js.underscore0000644000175000001440000000124712332105522026512 0ustar00djcusers00000000000000// Licensed under the Apache License, Version 2.0 (the "License"); you may not // use this file except in compliance with the License. You may obtain a copy of // the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, WITHOUT // WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the // License for the specific language governing permissions and limitations under // the License. define([ "app", "api" ], function (app, FauxtonAPI) { var {%= name %} = FauxtonAPI.addon(); return {%= name %}; }); apache-couchdb-1.6.0/src/fauxton/tasks/addon/root/base.js.underscore0000644000175000001440000000127012332105522025406 0ustar00djcusers00000000000000// Licensed under the Apache License, Version 2.0 (the "License"); you may not // use this file except in compliance with the License. You may obtain a copy of // the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, WITHOUT // WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the // License for the specific language governing permissions and limitations under // the License. define([ "app", "api", "addons/{%= name.toLowerCase() %}/routes" ], function(app, FauxtonAPI, {%= name %}) { return {%= name %}; }); apache-couchdb-1.6.0/src/fauxton/tasks/addon/root/routes.js.underscore0000644000175000001440000000212012332105522026010 0ustar00djcusers00000000000000// Licensed under the Apache License, Version 2.0 (the "License"); you may not // use this file except in compliance with the License. You may obtain a copy of // the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, WITHOUT // WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the // License for the specific language governing permissions and limitations under // the License. define([ "app", "api", "addons/{%= name.toLowerCase() %}/resources" ], function(app, FauxtonAPI, {%= name %}) { {%= name.substr(0, 1).toUpperCase() + name.substr(1)%}RouteObject = FauxtonAPI.RouteObject.extend({ layout: "with_sidebar", crumbs: [ ], routes: { }, roles: [], apiUrl: function() { return ["insert url here..."]; }, initialize: function () { }, }); {%= name %}.RouteObjects = [{%= name.substr(0, 1).toUpperCase() + name.substr(1)%}RouteObject]; return {%= name %}; }); apache-couchdb-1.6.0/src/fauxton/tasks/addon/template.js0000644000175000001440000000402212332105522023152 0ustar00djcusers00000000000000// Licensed under the Apache License, Version 2.0 (the "License"); you may not // use this file except in compliance with the License. You may obtain a copy of // the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, WITHOUT // WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the // License for the specific language governing permissions and limitations under // the License. 'use strict'; exports.description = 'Generate a skeleton for an addon.'; exports.notes = ''; exports.after = "Created your addon! Don't forget to update your"+ " settings.json for it to be compiled and deployed"; // Any existing file or directory matching this wildcard will cause a warning. // exports.warnOn = '*'; // The actual init template. exports.template = function(grunt, init, done) { // destpath init.process( {}, [ { name: "name", message: "Add on Name", validator: /^[\w\-\.]+$/, default: "WickedCool" }, { name: "path", message: "Location of add ons", default: "app/addons" }, { name: "assets", message: "Do you need an assets folder? (for .less)", default: 'y/N' } ], function (err, props) { // Files to copy (and process). var files = init.filesToCopy(props); // Actually copy and process (apply the template props) files. init.copyAndProcess(files, props); // Make the assets dir if requested if (props.assets == "y"){ var asspath = props.path + "/" + props.name.toLowerCase() + "/assets"; grunt.file.mkdir(asspath); grunt.log.writeln("Created " + asspath); } var tmplpath = props.path + "/" + props.name.toLowerCase() + "/templates"; grunt.file.mkdir(tmplpath); grunt.log.writeln("Created " + tmplpath); // All done! done(); } ) };apache-couchdb-1.6.0/src/fauxton/tasks/addon/rename.json0000644000175000001440000000035312332105522023146 0ustar00djcusers00000000000000{ "routes.js.underscore": "{%= path %}/{%= name.toLowerCase() %}/routes.js", "resources.js.underscore": "{%= path %}/{%= name.toLowerCase() %}/resources.js", "base.js.underscore": "{%= path %}/{%= name.toLowerCase() %}/base.js" }apache-couchdb-1.6.0/src/fauxton/tasks/fauxton.js0000644000175000001440000001140412332105522021740 0ustar00djcusers00000000000000// Licensed under the Apache License, Version 2.0 (the "License"); you may not // use this file except in compliance with the License. You may obtain a copy of // the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, WITHOUT // WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the // License for the specific language governing permissions and limitations under // the License. module.exports = function(grunt) { var _ = grunt.util._, fs = require('fs'); grunt.registerMultiTask('template', 'generates an html file from a specified template', function(){ var data = this.data, _ = grunt.util._, tmpl = _.template(grunt.file.read(data.src), null, data.variables); grunt.file.write(data.dest, tmpl(data.variables)); }); grunt.registerMultiTask('get_deps', 'Fetch external dependencies', function(version) { grunt.log.writeln("Fetching external dependencies"); var done = this.async(), data = this.data, target = data.target || "app/addons/", settingsFile = fs.existsSync(data.src) ? data.src : "settings.json.default", settings = grunt.file.readJSON(settingsFile), _ = grunt.util._; // This should probably be a helper, though they seem to have been removed var fetch = function(deps, command){ var child_process = require('child_process'); var async = require('async'); async.forEach(deps, function(dep, cb) { var path = target + dep.name; var location = dep.url || dep.path; grunt.log.writeln("Fetching: " + dep.name + " (" + location + ")"); child_process.exec(command(dep, path), function(error, stdout, stderr) { grunt.log.writeln(stderr); grunt.log.writeln(stdout); cb(error); }); }, function(error) { if (error) { grunt.log.writeln("ERROR: " + error.message); return false; } else { return true; } }); }; var remoteDeps = _.filter(settings.deps, function(dep) { return !! dep.url; }); grunt.log.writeln(remoteDeps.length + " remote dependencies"); var remote = fetch(remoteDeps, function(dep, destination){ return "git clone " + dep.url + " " + destination; }); var localDeps = _.filter(settings.deps, function(dep) { return !! dep.path; }); grunt.log.writeln(localDeps.length + " local dependencies"); var local = fetch(localDeps, function(dep, destination){ // TODO: Windows var command = "cp -r " + dep.path + " " + destination; grunt.log.writeln(command); return command; }); done(remote && local); }); grunt.registerMultiTask('gen_load_addons', 'Generate the load_addons.js file', function() { var data = this.data, _ = grunt.util._, settingsFile = fs.existsSync(data.src) ? data.src : "settings.json.default", settings = grunt.file.readJSON(settingsFile), template = "app/load_addons.js.underscore", dest = "app/load_addons.js", deps = _.map(settings.deps, function(dep) { return "addons/" + dep.name + "/base"; }); var tmpl = _.template(grunt.file.read(template)); grunt.file.write(dest, tmpl({deps: deps})); }); grunt.registerMultiTask('gen_initialize', 'Generate the app.js file', function() { var _ = grunt.util._, settings = this.data, template = "app/initialize.js.underscore", dest = "app/initialize.js" tmpl = _.template(grunt.file.read(template)), app = {}; _.defaults(app, settings.app, { root: '/', host: '../..', version: "0.0" }); grunt.file.write(dest, tmpl(app)); }); grunt.registerMultiTask('mochaSetup','Generate a config.js and runner.html for tests', function(){ var data = this.data, configInfo, _ = grunt.util._, configTemplateSrc = data.template, testFiles = grunt.file.expand(data.files.src); var configTemplate = _.template(grunt.file.read(configTemplateSrc)); // a bit of a nasty hack to read our current config.js and get the info so we can change it // for our testing setup var require = { config: function (args) { configInfo = args; configInfo.paths['chai'] = "../test/mocha/chai"; configInfo.paths['sinon-chai'] = "../test/mocha/sinon-chai"; configInfo.paths['testUtils'] = "../test/mocha/testUtils"; configInfo.baseUrl = '../app'; delete configInfo.deps; } }; eval(grunt.file.read(data.config) +''); grunt.file.write('./test/test.config.js', configTemplate({configInfo: configInfo, testFiles: testFiles})); }); }; apache-couchdb-1.6.0/src/fauxton/tasks/couchserver.js0000644000175000001440000001051112332105522022602 0ustar00djcusers00000000000000// Licensed under the Apache License, Version 2.0 (the "License"); you may not // use this file except in compliance with the License. You may obtain a copy of // the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, WITHOUT // WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the // License for the specific language governing permissions and limitations under // the License. module.exports = function (grunt) { var log = grunt.log; grunt.registerTask("couchserver", 'Run a couch dev proxy server', function () { var fs = require("fs"), path = require("path"), http = require("http"), httpProxy = require('http-proxy'), send = require('send'), options = grunt.config('couchserver'), _ = grunt.util._; // Options var dist_dir = options.dist || './dist/debug/', app_dir = './app', port = options.port || 8000; // Proxy options with default localhost var proxy_settings = options.proxy || { target: { host: 'localhost', port: 5984, https: false } }; // inform grunt that this task is async var done = this.async(); // create proxy to couch for all couch requests var proxy = new httpProxy.HttpProxy(proxy_settings); http.createServer(function (req, res) { var url = req.url.replace('app/',''), accept = req.headers.accept.split(','), filePath; if (!!url.match(/^\/addons\/.*\/assets\/js/)) { filePath = path.join(app_dir, url.replace('/_utils/fauxton/','')); } else if (!!url.match(/assets/)) { // serve any javascript or css files from here assets dir url = url.replace(/\?.*/, ''); filePath = path.join('./',url); } else if (!!url.match(/mocha|\/test\/core\/|test\.config/)) { filePath = path.join('./test', url.replace('/test/','')); } else if (!!url.match(/\.css|img/)) { filePath = path.join(dist_dir,url); /*} else if (!!url.match(/\/js\//)) { // serve any javascript or files from dist debug dir filePath = path.join(dist_dir,req.url);*/ } else if (!!url.match(/\.js$|\.html$/)) { // server js from app directory filePath = path.join(app_dir, url.replace('/_utils/fauxton/','')); } else if (!!url.match(/testrunner/)) { var testSetup = grunt.util.spawn({cmd: 'grunt', grunt: true, args: ['test_inline']}, function (error, result, code) {/* log.writeln(String(result));*/ }); testSetup.stdout.pipe(process.stdout); testSetup.stderr.pipe(process.stderr); filePath = path.join('./test/runner.html'); } else if (url === '/' && accept[0] !== 'application/json') { // serve main index file from here filePath = path.join(dist_dir, 'index.html'); }; if (filePath) { return send(req, filePath) .on('error', function (err) { if (err.status === 404) { log.writeln('Could not locate', filePath); } else { log.writeln('ERROR', filePath, err); } res.setHeader("Content-Type", "text/javascript"); res.statusCode = 404; res.end(JSON.stringify({error: err.message})); }) .pipe(res); } proxy.proxyRequest(req, res); }).listen(port); // Fail this task if any errors have been logged if (grunt.errors) { return false; } var watch = grunt.util.spawn({cmd: 'grunt', grunt: true, args: ['watch']}, function (error, result, code) {/* log.writeln(String(result));*/ }); watch.stdout.pipe(process.stdout); watch.stderr.pipe(process.stderr); var logo = [ [""], [" ______ _ "], ["| ____| | | "], ["| |__ __ _ _ _ __ __ | |_ ___ _ __ "], ["| __| / _` | | | | | \\ \\/ / | __| / _ \\ | '_ \\ "], ["| | | (_| | | |_| | > < | |_ | (_) | | | | |"], ["|_| \\__,_| \\__,_| /_/\\_\\ \\__| \\___/ |_| |_|"], [""] ]; _.each(logo, function (line) { console.log(line.toString()); }); log.writeln('Listening on ' + port); }); }; apache-couchdb-1.6.0/src/fauxton/tasks/helper.js0000644000175000001440000000266012332105522021537 0ustar00djcusers00000000000000// Licensed under the Apache License, Version 2.0 (the "License"); you may not // use this file except in compliance with the License. You may obtain a copy of // the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, WITHOUT // WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the // License for the specific language governing permissions and limitations under // the License. var fs = require('fs'), path = require('path'); exports.init = function(grunt) { var _ = grunt.util._; return { readSettingsFile: function () { if (fs.existsSync("settings.json")) { return grunt.file.readJSON("settings.json"); } else if (fs.existsSync("settings.json.default")) { return grunt.file.readJSON("settings.json.default"); } else { return {deps: []}; } }, processAddons: function (callback) { this.readSettingsFile().deps.forEach(callback); }, watchFiles: function (fileExtensions, defaults) { return _.reduce(this.readSettingsFile().deps, function (files, dep) { if (dep.path) { _.each(fileExtensions, function (fileExtension) { files.push(path.join(dep.path, '**/*' + fileExtension )); }); } return files }, defaults); } }; }; apache-couchdb-1.6.0/src/fauxton/index.html0000644000175000001440000000270612332105522020573 0ustar00djcusers00000000000000 Project Fauxton

    apache-couchdb-1.6.0/src/fauxton/TODO.md0000644000175000001440000000132712332105522017663 0ustar00djcusers00000000000000# Fauxton todo In no particular order - [ ] docco docs - [ ] user management - [ ] view options - [ ] view editor - [ ] visual view builder - [ ] new db as modal - [ ] new view button - [ ] show design docs only - [ ] fix delete doc button UI bug - [ ] delete multiple docs via _bulk_docs - [x] show change events in database view - [ ] pouchdb addon - [ ] bespoke bootstrap style - [ ] responsive interface - [ ] sticky subnav for some UI components on _all_docs - [ ] "show me" button in API bar doesn't - [ ] edit index button doesn't - [ ] replicate UI - [x] delete database - [x] format dates better (e.g. in logs plugin) - [ ] format log entry better - [ ] filter logs by method - [ ] restore unfiltered data in logs UI apache-couchdb-1.6.0/src/fauxton/assets/0000755000175000001440000000000012332105600020070 5ustar00djcusers00000000000000apache-couchdb-1.6.0/src/fauxton/assets/js/0000755000175000001440000000000012332105600020504 5ustar00djcusers00000000000000apache-couchdb-1.6.0/src/fauxton/assets/js/libs/0000755000175000001440000000000012332105600021435 5ustar00djcusers00000000000000apache-couchdb-1.6.0/src/fauxton/assets/js/libs/ace/0000755000175000001440000000000012332105600022165 5ustar00djcusers00000000000000apache-couchdb-1.6.0/src/fauxton/assets/js/libs/ace/ext-elastic_tabstops_lite.js0000644000175000001440000002407512332105522027714 0ustar00djcusers00000000000000/* ***** BEGIN LICENSE BLOCK ***** * Distributed under the BSD license: * * Copyright (c) 2012, Ajax.org B.V. * All rights reserved. * * 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 Ajax.org B.V. nor the * names of its contributors may be used to endorse or promote products * derived from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE * DISCLAIMED. IN NO EVENT SHALL AJAX.ORG B.V. 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. * * ***** END LICENSE BLOCK ***** */ define('ace/ext/elastic_tabstops_lite', ['require', 'exports', 'module' , 'ace/editor', 'ace/config'], function(require, exports, module) { var ElasticTabstopsLite = function(editor) { this.$editor = editor; var self = this; var changedRows = []; var recordChanges = false; this.onAfterExec = function() { recordChanges = false; self.processRows(changedRows); changedRows = []; }; this.onExec = function() { recordChanges = true; }; this.onChange = function(e) { var range = e.data.range if (recordChanges) { if (changedRows.indexOf(range.start.row) == -1) changedRows.push(range.start.row); if (range.end.row != range.start.row) changedRows.push(range.end.row); } }; }; (function() { this.processRows = function(rows) { this.$inChange = true; var checkedRows = []; for (var r = 0, rowCount = rows.length; r < rowCount; r++) { var row = rows[r]; if (checkedRows.indexOf(row) > -1) continue; var cellWidthObj = this.$findCellWidthsForBlock(row); var cellWidths = this.$setBlockCellWidthsToMax(cellWidthObj.cellWidths); var rowIndex = cellWidthObj.firstRow; for (var w = 0, l = cellWidths.length; w < l; w++) { var widths = cellWidths[w]; checkedRows.push(rowIndex); this.$adjustRow(rowIndex, widths); rowIndex++; } } this.$inChange = false; }; this.$findCellWidthsForBlock = function(row) { var cellWidths = [], widths; var rowIter = row; while (rowIter >= 0) { widths = this.$cellWidthsForRow(rowIter); if (widths.length == 0) break; cellWidths.unshift(widths); rowIter--; } var firstRow = rowIter + 1; rowIter = row; var numRows = this.$editor.session.getLength(); while (rowIter < numRows - 1) { rowIter++; widths = this.$cellWidthsForRow(rowIter); if (widths.length == 0) break; cellWidths.push(widths); } return { cellWidths: cellWidths, firstRow: firstRow }; }; this.$cellWidthsForRow = function(row) { var selectionColumns = this.$selectionColumnsForRow(row); var tabs = [-1].concat(this.$tabsForRow(row)); var widths = tabs.map(function(el) { return 0; } ).slice(1); var line = this.$editor.session.getLine(row); for (var i = 0, len = tabs.length - 1; i < len; i++) { var leftEdge = tabs[i]+1; var rightEdge = tabs[i+1]; var rightmostSelection = this.$rightmostSelectionInCell(selectionColumns, rightEdge); var cell = line.substring(leftEdge, rightEdge); widths[i] = Math.max(cell.replace(/\s+$/g,'').length, rightmostSelection - leftEdge); } return widths; }; this.$selectionColumnsForRow = function(row) { var selections = [], cursor = this.$editor.getCursorPosition(); if (this.$editor.session.getSelection().isEmpty()) { if (row == cursor.row) selections.push(cursor.column); } return selections; }; this.$setBlockCellWidthsToMax = function(cellWidths) { var startingNewBlock = true, blockStartRow, blockEndRow, maxWidth; var columnInfo = this.$izip_longest(cellWidths); for (var c = 0, l = columnInfo.length; c < l; c++) { var column = columnInfo[c]; if (!column.push) { console.error(column); continue; } column.push(NaN); for (var r = 0, s = column.length; r < s; r++) { var width = column[r]; if (startingNewBlock) { blockStartRow = r; maxWidth = 0; startingNewBlock = false; } if (isNaN(width)) { blockEndRow = r; for (var j = blockStartRow; j < blockEndRow; j++) { cellWidths[j][c] = maxWidth; } startingNewBlock = true; } maxWidth = Math.max(maxWidth, width); } } return cellWidths; }; this.$rightmostSelectionInCell = function(selectionColumns, cellRightEdge) { var rightmost = 0; if (selectionColumns.length) { var lengths = []; for (var s = 0, length = selectionColumns.length; s < length; s++) { if (selectionColumns[s] <= cellRightEdge) lengths.push(s); else lengths.push(0); } rightmost = Math.max.apply(Math, lengths); } return rightmost; }; this.$tabsForRow = function(row) { var rowTabs = [], line = this.$editor.session.getLine(row), re = /\t/g, match; while ((match = re.exec(line)) != null) { rowTabs.push(match.index); } return rowTabs; }; this.$adjustRow = function(row, widths) { var rowTabs = this.$tabsForRow(row); if (rowTabs.length == 0) return; var bias = 0, location = -1; var expandedSet = this.$izip(widths, rowTabs); for (var i = 0, l = expandedSet.length; i < l; i++) { var w = expandedSet[i][0], it = expandedSet[i][1]; location += 1 + w; it += bias; var difference = location - it; if (difference == 0) continue; var partialLine = this.$editor.session.getLine(row).substr(0, it ); var strippedPartialLine = partialLine.replace(/\s*$/g, ""); var ispaces = partialLine.length - strippedPartialLine.length; if (difference > 0) { this.$editor.session.getDocument().insertInLine({row: row, column: it + 1}, Array(difference + 1).join(" ") + "\t"); this.$editor.session.getDocument().removeInLine(row, it, it + 1); bias += difference; } if (difference < 0 && ispaces >= -difference) { this.$editor.session.getDocument().removeInLine(row, it + difference, it); bias += difference; } } }; this.$izip_longest = function(iterables) { if (!iterables[0]) return []; var longest = iterables[0].length; var iterablesLength = iterables.length; for (var i = 1; i < iterablesLength; i++) { var iLength = iterables[i].length; if (iLength > longest) longest = iLength; } var expandedSet = []; for (var l = 0; l < longest; l++) { var set = []; for (var i = 0; i < iterablesLength; i++) { if (iterables[i][l] === "") set.push(NaN); else set.push(iterables[i][l]); } expandedSet.push(set); } return expandedSet; }; this.$izip = function(widths, tabs) { var size = widths.length >= tabs.length ? tabs.length : widths.length; var expandedSet = []; for (var i = 0; i < size; i++) { var set = [ widths[i], tabs[i] ]; expandedSet.push(set); } return expandedSet; }; }).call(ElasticTabstopsLite.prototype); exports.ElasticTabstopsLite = ElasticTabstopsLite; var Editor = require("../editor").Editor; require("../config").defineOptions(Editor.prototype, "editor", { useElasticTabstops: { set: function(val) { if (val) { if (!this.elasticTabstops) this.elasticTabstops = new ElasticTabstopsLite(this); this.commands.on("afterExec", this.elasticTabstops.onAfterExec); this.commands.on("exec", this.elasticTabstops.onExec); this.on("change", this.elasticTabstops.onChange); } else if (this.elasticTabstops) { this.commands.removeListener("afterExec", this.elasticTabstops.onAfterExec); this.commands.removeListener("exec", this.elasticTabstops.onExec); this.removeListener("change", this.elasticTabstops.onChange); } } } }); });apache-couchdb-1.6.0/src/fauxton/assets/js/libs/ace/ext-language_tools.js0000644000175000001440000015563212332105522026343 0ustar00djcusers00000000000000/* ***** BEGIN LICENSE BLOCK ***** * Distributed under the BSD license: * * Copyright (c) 2012, Ajax.org B.V. * All rights reserved. * * 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 Ajax.org B.V. nor the * names of its contributors may be used to endorse or promote products * derived from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE * DISCLAIMED. IN NO EVENT SHALL AJAX.ORG B.V. 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. * * ***** END LICENSE BLOCK ***** */ define('ace/ext/language_tools', ['require', 'exports', 'module' , 'ace/snippets', 'ace/autocomplete', 'ace/config', 'ace/autocomplete/text_completer', 'ace/editor'], function(require, exports, module) { var snippetManager = require("../snippets").snippetManager; var Autocomplete = require("../autocomplete").Autocomplete; var config = require("../config"); var textCompleter = require("../autocomplete/text_completer"); var keyWordCompleter = { getCompletions: function(editor, session, pos, prefix, callback) { var state = editor.session.getState(pos.row); var completions = session.$mode.getCompletions(state, session, pos, prefix); callback(null, completions); } }; var snippetCompleter = { getCompletions: function(editor, session, pos, prefix, callback) { var scope = snippetManager.$getScope(editor); var snippetMap = snippetManager.snippetMap; var completions = []; [scope, "_"].forEach(function(scope) { var snippets = snippetMap[scope] || []; for (var i = snippets.length; i--;) { var s = snippets[i]; var caption = s.name || s.tabTrigger; if (!caption) continue; completions.push({ caption: caption, snippet: s.content, meta: s.tabTrigger && !s.name ? s.tabTrigger + "\u21E5 " : "snippet" }); } }, this); callback(null, completions); } }; var completers = [snippetCompleter, textCompleter, keyWordCompleter]; exports.addCompleter = function(completer) { completers.push(completer); }; var expandSnippet = { name: "expandSnippet", exec: function(editor) { var success = snippetManager.expandWithTab(editor); if (!success) editor.execCommand("indent"); }, bindKey: "tab" } var onChangeMode = function(e, editor) { var mode = editor.session.$mode; var id = mode.$id if (!snippetManager.files) snippetManager.files = {}; if (id && !snippetManager.files[id]) { var snippetFilePath = id.replace("mode", "snippets"); config.loadModule(snippetFilePath, function(m) { if (m) { snippetManager.files[id] = m; m.snippets = snippetManager.parseSnippetFile(m.snippetText); snippetManager.register(m.snippets, m.scope); } }); } }; var Editor = require("../editor").Editor; require("../config").defineOptions(Editor.prototype, "editor", { enableBasicAutocompletion: { set: function(val) { if (val) { this.completers = completers this.commands.addCommand(Autocomplete.startCommand); } else { this.commands.removeCommand(Autocomplete.startCommand); } }, value: false }, enableSnippets: { set: function(val) { if (val) { this.commands.addCommand(expandSnippet); this.on("changeMode", onChangeMode); onChangeMode(null, this) } else { this.commands.removeCommand(expandSnippet); this.off("changeMode", onChangeMode); } }, value: false } }); }); define('ace/snippets', ['require', 'exports', 'module' , 'ace/lib/lang', 'ace/range', 'ace/keyboard/hash_handler', 'ace/tokenizer', 'ace/lib/dom'], function(require, exports, module) { var lang = require("./lib/lang") var Range = require("./range").Range var HashHandler = require("./keyboard/hash_handler").HashHandler; var Tokenizer = require("./tokenizer").Tokenizer; var comparePoints = Range.comparePoints; var SnippetManager = function() { this.snippetMap = {}; this.snippetNameMap = {}; }; (function() { this.getTokenizer = function() { function TabstopToken(str, _, stack) { str = str.substr(1); if (/^\d+$/.test(str) && !stack.inFormatString) return [{tabstopId: parseInt(str, 10)}]; return [{text: str}] } function escape(ch) { return "(?:[^\\\\" + ch + "]|\\\\.)"; } SnippetManager.$tokenizer = new Tokenizer({ start: [ {regex: /:/, onMatch: function(val, state, stack) { if (stack.length && stack[0].expectIf) { stack[0].expectIf = false; stack[0].elseBranch = stack[0]; return [stack[0]]; } return ":"; }}, {regex: /\\./, onMatch: function(val, state, stack) { var ch = val[1]; if (ch == "}" && stack.length) { val = ch; }else if ("`$\\".indexOf(ch) != -1) { val = ch; } else if (stack.inFormatString) { if (ch == "n") val = "\n"; else if (ch == "t") val = "\n"; else if ("ulULE".indexOf(ch) != -1) { val = {changeCase: ch, local: ch > "a"}; } } return [val]; }}, {regex: /}/, onMatch: function(val, state, stack) { return [stack.length ? stack.shift() : val]; }}, {regex: /\$(?:\d+|\w+)/, onMatch: TabstopToken}, {regex: /\$\{[\dA-Z_a-z]+/, onMatch: function(str, state, stack) { var t = TabstopToken(str.substr(1), state, stack); stack.unshift(t[0]); return t; }, next: "snippetVar"}, {regex: /\n/, token: "newline", merge: false} ], snippetVar: [ {regex: "\\|" + escape("\\|") + "*\\|", onMatch: function(val, state, stack) { stack[0].choices = val.slice(1, -1).split(","); }, next: "start"}, {regex: "/(" + escape("/") + "+)/(?:(" + escape("/") + "*)/)(\\w*):?", onMatch: function(val, state, stack) { var ts = stack[0]; ts.fmtString = val; val = this.splitRegex.exec(val); ts.guard = val[1]; ts.fmt = val[2]; ts.flag = val[3]; return ""; }, next: "start"}, {regex: "`" + escape("`") + "*`", onMatch: function(val, state, stack) { stack[0].code = val.splice(1, -1); return ""; }, next: "start"}, {regex: "\\?", onMatch: function(val, state, stack) { if (stack[0]) stack[0].expectIf = true; }, next: "start"}, {regex: "([^:}\\\\]|\\\\.)*:?", token: "", next: "start"} ], formatString: [ {regex: "/(" + escape("/") + "+)/", token: "regex"}, {regex: "", onMatch: function(val, state, stack) { stack.inFormatString = true; }, next: "start"} ] }); SnippetManager.prototype.getTokenizer = function() { return SnippetManager.$tokenizer; } return SnippetManager.$tokenizer; }; this.tokenizeTmSnippet = function(str, startState) { return this.getTokenizer().getLineTokens(str, startState).tokens.map(function(x) { return x.value || x; }); }; this.$getDefaultValue = function(editor, name) { if (/^[A-Z]\d+$/.test(name)) { var i = name.substr(1); return (this.variables[name[0] + "__"] || {})[i]; } if (/^\d+$/.test(name)) { return (this.variables.__ || {})[name]; } name = name.replace(/^TM_/, ""); if (!editor) return; var s = editor.session; switch(name) { case "CURRENT_WORD": var r = s.getWordRange(); case "SELECTION": case "SELECTED_TEXT": return s.getTextRange(r); case "CURRENT_LINE": return s.getLine(editor.getCursorPosition().row); case "PREV_LINE": // not possible in textmate return s.getLine(editor.getCursorPosition().row - 1); case "LINE_INDEX": return editor.getCursorPosition().column; case "LINE_NUMBER": return editor.getCursorPosition().row + 1; case "SOFT_TABS": return s.getUseSoftTabs() ? "YES" : "NO"; case "TAB_SIZE": return s.getTabSize(); case "FILENAME": case "FILEPATH": return "ace.ajax.org"; case "FULLNAME": return "Ace"; } }; this.variables = {}; this.getVariableValue = function(editor, varName) { if (this.variables.hasOwnProperty(varName)) return this.variables[varName](editor, varName) || ""; return this.$getDefaultValue(editor, varName) || ""; }; this.tmStrFormat = function(str, ch, editor) { var flag = ch.flag || ""; var re = ch.guard; re = new RegExp(re, flag.replace(/[^gi]/, "")); var fmtTokens = this.tokenizeTmSnippet(ch.fmt, "formatString"); var _self = this; var formatted = str.replace(re, function() { _self.variables.__ = arguments; var fmtParts = _self.resolveVariables(fmtTokens, editor); var gChangeCase = "E"; for (var i = 0; i < fmtParts.length; i++) { var ch = fmtParts[i]; if (typeof ch == "object") { fmtParts[i] = ""; if (ch.changeCase && ch.local) { var next = fmtParts[i + 1]; if (next && typeof next == "string") { if (ch.changeCase == "u") fmtParts[i] = next[0].toUpperCase(); else fmtParts[i] = next[0].toLowerCase(); fmtParts[i + 1] = next.substr(1); } } else if (ch.changeCase) { gChangeCase = ch.changeCase; } } else if (gChangeCase == "U") { fmtParts[i] = ch.toUpperCase(); } else if (gChangeCase == "L") { fmtParts[i] = ch.toLowerCase(); } } return fmtParts.join(""); }); this.variables.__ = null; return formatted; }; this.resolveVariables = function(snippet, editor) { var result = []; for (var i = 0; i < snippet.length; i++) { var ch = snippet[i]; if (typeof ch == "string") { result.push(ch); } else if (typeof ch != "object") { continue; } else if (ch.skip) { gotoNext(ch); } else if (ch.processed < i) { continue; } else if (ch.text) { var value = this.getVariableValue(editor, ch.text); if (value && ch.fmtString) value = this.tmStrFormat(value, ch); ch.processed = i; if (ch.expectIf == null) { if (value) { result.push(value); gotoNext(ch); } } else { if (value) { ch.skip = ch.elseBranch; } else gotoNext(ch); } } else if (ch.tabstopId != null) { result.push(ch); } else if (ch.changeCase != null) { result.push(ch); } } function gotoNext(ch) { var i1 = snippet.indexOf(ch, i + 1); if (i1 != -1) i = i1; } return result; }; this.insertSnippet = function(editor, snippetText) { var cursor = editor.getCursorPosition(); var line = editor.session.getLine(cursor.row); var indentString = line.match(/^\s*/)[0]; var tabString = editor.session.getTabString(); var tokens = this.tokenizeTmSnippet(snippetText); tokens = this.resolveVariables(tokens, editor); tokens = tokens.map(function(x) { if (x == "\n") return x + indentString; if (typeof x == "string") return x.replace(/\t/g, tabString); return x; }); var tabstops = []; tokens.forEach(function(p, i) { if (typeof p != "object") return; var id = p.tabstopId; var ts = tabstops[id]; if (!ts) { ts = tabstops[id] = []; ts.index = id; ts.value = ""; } if (ts.indexOf(p) !== -1) return; ts.push(p); var i1 = tokens.indexOf(p, i + 1); if (i1 === -1) return; var value = tokens.slice(i + 1, i1); var isNested = value.some(function(t) {return typeof t === "object"}); if (isNested && !ts.value) { ts.value = value; } else if (value.length && (!ts.value || typeof ts.value !== "string")) { ts.value = value.join(""); } }); tabstops.forEach(function(ts) {ts.length = 0}); var expanding = {}; function copyValue(val) { var copy = [] for (var i = 0; i < val.length; i++) { var p = val[i]; if (typeof p == "object") { if (expanding[p.tabstopId]) continue; var j = val.lastIndexOf(p, i - 1); p = copy[j] || {tabstopId: p.tabstopId}; } copy[i] = p; } return copy; } for (var i = 0; i < tokens.length; i++) { var p = tokens[i]; if (typeof p != "object") continue; var id = p.tabstopId; var i1 = tokens.indexOf(p, i + 1); if (expanding[id] == p) { expanding[id] = null; continue; } var ts = tabstops[id]; var arg = typeof ts.value == "string" ? [ts.value] : copyValue(ts.value); arg.unshift(i + 1, Math.max(0, i1 - i)); arg.push(p); expanding[id] = p; tokens.splice.apply(tokens, arg); if (ts.indexOf(p) === -1) ts.push(p); }; var row = 0, column = 0; var text = ""; tokens.forEach(function(t) { if (typeof t === "string") { if (t[0] === "\n"){ column = t.length - 1; row ++; } else column += t.length; text += t; } else { if (!t.start) t.start = {row: row, column: column}; else t.end = {row: row, column: column}; } }); var range = editor.getSelectionRange(); var end = editor.session.replace(range, text); var tabstopManager = new TabstopManager(editor); tabstopManager.addTabstops(tabstops, range.start, end); tabstopManager.tabNext(); }; this.$getScope = function(editor) { var scope = editor.session.$mode.$id || ""; scope = scope.split("/").pop(); if (scope === "html" || scope === "php") { if (scope === "php") scope = "html"; var c = editor.getCursorPosition() var state = editor.session.getState(c.row); if (typeof state === "object") { state = state[0]; } if (state.substring) { if (state.substring(0, 3) == "js-") scope = "javascript"; else if (state.substring(0, 4) == "css-") scope = "css"; else if (state.substring(0, 4) == "php-") scope = "php"; } } return scope; }; this.expandWithTab = function(editor) { var cursor = editor.getCursorPosition(); var line = editor.session.getLine(cursor.row); var before = line.substring(0, cursor.column); var after = line.substr(cursor.column); var scope = this.$getScope(editor); var snippetMap = this.snippetMap; var snippet; [scope, "_"].some(function(scope) { var snippets = snippetMap[scope]; if (snippets) snippet = this.findMatchingSnippet(snippets, before, after); return !!snippet; }, this); if (!snippet) return false; editor.session.doc.removeInLine(cursor.row, cursor.column - snippet.replaceBefore.length, cursor.column + snippet.replaceAfter.length ); this.variables.M__ = snippet.matchBefore; this.variables.T__ = snippet.matchAfter; this.insertSnippet(editor, snippet.content); this.variables.M__ = this.variables.T__ = null; return true; }; this.findMatchingSnippet = function(snippetList, before, after) { for (var i = snippetList.length; i--;) { var s = snippetList[i]; if (s.startRe && !s.startRe.test(before)) continue; if (s.endRe && !s.endRe.test(after)) continue; if (!s.startRe && !s.endRe) continue; s.matchBefore = s.startRe ? s.startRe.exec(before) : [""]; s.matchAfter = s.endRe ? s.endRe.exec(after) : [""]; s.replaceBefore = s.triggerRe ? s.triggerRe.exec(before)[0] : ""; s.replaceAfter = s.endTriggerRe ? s.endTriggerRe.exec(after)[0] : ""; return s; } }; this.snippetMap = {}; this.snippetNameMap = {}; this.register = function(snippets, scope) { var snippetMap = this.snippetMap; var snippetNameMap = this.snippetNameMap; var self = this; function wrapRegexp(src) { if (src && !/^\^?\(.*\)\$?$|^\\b$/.test(src)) src = "(?:" + src + ")" return src || ""; } function guardedRegexp(re, guard, opening) { re = wrapRegexp(re); guard = wrapRegexp(guard); if (opening) { re = guard + re; if (re && re[re.length - 1] != "$") re = re + "$"; } else { re = re + guard; if (re && re[0] != "^") re = "^" + re; } return new RegExp(re); } function addSnippet(s) { if (!s.scope) s.scope = scope || "_"; scope = s.scope if (!snippetMap[scope]) { snippetMap[scope] = []; snippetNameMap[scope] = {}; } var map = snippetNameMap[scope]; if (s.name) { var old = map[s.name]; if (old) self.unregister(old); map[s.name] = s; } snippetMap[scope].push(s); if (s.tabTrigger && !s.trigger) { if (!s.guard && /^\w/.test(s.tabTrigger)) s.guard = "\\b"; s.trigger = lang.escapeRegExp(s.tabTrigger); } s.startRe = guardedRegexp(s.trigger, s.guard, true); s.triggerRe = new RegExp(s.trigger, "", true); s.endRe = guardedRegexp(s.endTrigger, s.endGuard, true); s.endTriggerRe = new RegExp(s.endTrigger, "", true); }; if (snippets.content) addSnippet(snippets); else if (Array.isArray(snippets)) snippets.forEach(addSnippet); }; this.unregister = function(snippets, scope) { var snippetMap = this.snippetMap; var snippetNameMap = this.snippetNameMap; function removeSnippet(s) { var nameMap = snippetNameMap[s.scope||scope]; if (nameMap && nameMap[s.name]) { delete nameMap[s.name]; var map = snippetMap[s.scope||scope]; var i = map && map.indexOf(s); if (i >= 0) map.splice(i, 1); } } if (snippets.content) removeSnippet(snippets); else if (Array.isArray(snippets)) snippets.forEach(removeSnippet); }; this.parseSnippetFile = function(str) { str = str.replace(/\r/g, ""); var list = [], snippet = {}; var re = /^#.*|^({[\s\S]*})\s*$|^(\S+) (.*)$|^((?:\n*\t.*)+)/gm; var m; while (m = re.exec(str)) { if (m[1]) { try { snippet = JSON.parse(m[1]) list.push(snippet); } catch (e) {} } if (m[4]) { snippet.content = m[4].replace(/^\t/gm, ""); list.push(snippet); snippet = {}; } else { var key = m[2], val = m[3]; if (key == "regex") { var guardRe = /\/((?:[^\/\\]|\\.)*)|$/g; snippet.guard = guardRe.exec(val)[1]; snippet.trigger = guardRe.exec(val)[1]; snippet.endTrigger = guardRe.exec(val)[1]; snippet.endGuard = guardRe.exec(val)[1]; } else if (key == "snippet") { snippet.tabTrigger = val.match(/^\S*/)[0]; if (!snippet.name) snippet.name = val; } else { snippet[key] = val; } } } return list; }; this.getSnippetByName = function(name, editor) { var scope = editor && this.$getScope(editor); var snippetMap = this.snippetNameMap; var snippet; [scope, "_"].some(function(scope) { var snippets = snippetMap[scope]; if (snippets) snippet = snippets[name]; return !!snippet; }, this); return snippet; }; }).call(SnippetManager.prototype); var TabstopManager = function(editor) { if (editor.tabstopManager) return editor.tabstopManager; editor.tabstopManager = this; this.$onChange = this.onChange.bind(this); this.$onChangeSelection = lang.delayedCall(this.onChangeSelection.bind(this)).schedule; this.$onChangeSession = this.onChangeSession.bind(this); this.$onAfterExec = this.onAfterExec.bind(this); this.attach(editor); }; (function() { this.attach = function(editor) { this.index = -1; this.ranges = []; this.tabstops = []; this.selectedTabstop = null; this.editor = editor; this.editor.on("change", this.$onChange); this.editor.on("changeSelection", this.$onChangeSelection); this.editor.on("changeSession", this.$onChangeSession); this.editor.commands.on("afterExec", this.$onAfterExec); this.editor.keyBinding.addKeyboardHandler(this.keyboardHandler); }; this.detach = function() { this.tabstops.forEach(this.removeTabstopMarkers, this); this.ranges = null; this.tabstops = null; this.selectedTabstop = null; this.editor.removeListener("change", this.$onChange); this.editor.removeListener("changeSelection", this.$onChangeSelection); this.editor.removeListener("changeSession", this.$onChangeSession); this.editor.commands.removeListener("afterExec", this.$onAfterExec); this.editor.keyBinding.removeKeyboardHandler(this.keyboardHandler); this.editor.tabstopManager = null; this.editor = null; }; this.onChange = function(e) { var changeRange = e.data.range; var isRemove = e.data.action[0] == "r"; var start = changeRange.start; var end = changeRange.end; var startRow = start.row; var endRow = end.row; var lineDif = endRow - startRow; var colDiff = end.column - start.column; if (isRemove) { lineDif = -lineDif; colDiff = -colDiff; } if (!this.$inChange && isRemove) { var ts = this.selectedTabstop; var changedOutside = !ts.some(function(r) { return comparePoints(r.start, start) <= 0 && comparePoints(r.end, end) >= 0; }); if (changedOutside) return this.detach(); } var ranges = this.ranges; for (var i = 0; i < ranges.length; i++) { var r = ranges[i]; if (r.end.row < start.row) continue; if (comparePoints(start, r.start) < 0 && comparePoints(end, r.end) > 0) { this.removeRange(r); i--; continue; } if (r.start.row == startRow && r.start.column > start.column) r.start.column += colDiff; if (r.end.row == startRow && r.end.column >= start.column) r.end.column += colDiff; if (r.start.row >= startRow) r.start.row += lineDif; if (r.end.row >= startRow) r.end.row += lineDif; if (comparePoints(r.start, r.end) > 0) this.removeRange(r); } if (!ranges.length) this.detach(); }; this.updateLinkedFields = function() { var ts = this.selectedTabstop; if (!ts.hasLinkedRanges) return; this.$inChange = true; var session = this.editor.session; var text = session.getTextRange(ts.firstNonLinked); for (var i = ts.length; i--;) { var range = ts[i]; if (!range.linked) continue; var fmt = exports.snippetManager.tmStrFormat(text, range.original) session.replace(range, fmt); } this.$inChange = false; }; this.onAfterExec = function(e) { if (e.command && !e.command.readOnly) this.updateLinkedFields(); }; this.onChangeSelection = function() { if (!this.editor) return var lead = this.editor.selection.lead; var anchor = this.editor.selection.anchor; var isEmpty = this.editor.selection.isEmpty(); for (var i = this.ranges.length; i--;) { if (this.ranges[i].linked) continue; var containsLead = this.ranges[i].contains(lead.row, lead.column); var containsAnchor = isEmpty || this.ranges[i].contains(anchor.row, anchor.column); if (containsLead && containsAnchor) return; } this.detach(); }; this.onChangeSession = function() { this.detach(); }; this.tabNext = function(dir) { var max = this.tabstops.length - 1; var index = this.index + (dir || 1); index = Math.min(Math.max(index, 0), max); this.selectTabstop(index); if (index == max) this.detach(); }; this.selectTabstop = function(index) { var ts = this.tabstops[this.index]; if (ts) this.addTabstopMarkers(ts); this.index = index; ts = this.tabstops[this.index]; if (!ts || !ts.length) return; this.selectedTabstop = ts; if (!this.editor.inVirtualSelectionMode) { var sel = this.editor.multiSelect; sel.toSingleRange(ts.firstNonLinked.clone()); for (var i = ts.length; i--;) { if (ts.hasLinkedRanges && ts[i].linked) continue; sel.addRange(ts[i].clone(), true); } } else { this.editor.selection.setRange(ts.firstNonLinked); } this.editor.keyBinding.addKeyboardHandler(this.keyboardHandler); }; this.addTabstops = function(tabstops, start, end) { if (!tabstops[0]) { var p = Range.fromPoints(end, end); moveRelative(p.start, start); moveRelative(p.end, start); tabstops[0] = [p]; tabstops[0].index = 0; } var i = this.index; var arg = [i, 0]; var ranges = this.ranges; var editor = this.editor; tabstops.forEach(function(ts) { for (var i = ts.length; i--;) { var p = ts[i]; var range = Range.fromPoints(p.start, p.end || p.start); movePoint(range.start, start); movePoint(range.end, start); range.original = p; range.tabstop = ts; ranges.push(range); ts[i] = range; if (p.fmtString) { range.linked = true; ts.hasLinkedRanges = true; } else if (!ts.firstNonLinked) ts.firstNonLinked = range; } if (!ts.firstNonLinked) ts.hasLinkedRanges = false; arg.push(ts); this.addTabstopMarkers(ts); }, this); arg.push(arg.splice(2, 1)[0]); this.tabstops.splice.apply(this.tabstops, arg); }; this.addTabstopMarkers = function(ts) { var session = this.editor.session; ts.forEach(function(range) { if (!range.markerId) range.markerId = session.addMarker(range, "ace_snippet-marker", "text"); }); }; this.removeTabstopMarkers = function(ts) { var session = this.editor.session; ts.forEach(function(range) { session.removeMarker(range.markerId); range.markerId = null; }); }; this.removeRange = function(range) { var i = range.tabstop.indexOf(range); range.tabstop.splice(i, 1); i = this.ranges.indexOf(range); this.ranges.splice(i, 1); this.editor.session.removeMarker(range.markerId); }; this.keyboardHandler = new HashHandler(); this.keyboardHandler.bindKeys({ "Tab": function(ed) { ed.tabstopManager.tabNext(1); }, "Shift-Tab": function(ed) { ed.tabstopManager.tabNext(-1); }, "Esc": function(ed) { ed.tabstopManager.detach(); }, "Return": function(ed) { return false; } }); }).call(TabstopManager.prototype); var movePoint = function(point, diff) { if (point.row == 0) point.column += diff.column; point.row += diff.row; }; var moveRelative = function(point, start) { if (point.row == start.row) point.column -= start.column; point.row -= start.row; }; require("./lib/dom").importCssString("\ .ace_snippet-marker {\ -moz-box-sizing: border-box;\ box-sizing: border-box;\ background: rgba(194, 193, 208, 0.09);\ border: 1px dotted rgba(211, 208, 235, 0.62);\ position: absolute;\ }"); exports.snippetManager = new SnippetManager(); }); define('ace/autocomplete', ['require', 'exports', 'module' , 'ace/keyboard/hash_handler', 'ace/autocomplete/popup', 'ace/autocomplete/util', 'ace/lib/event', 'ace/lib/lang', 'ace/snippets'], function(require, exports, module) { var HashHandler = require("./keyboard/hash_handler").HashHandler; var AcePopup = require("./autocomplete/popup").AcePopup; var util = require("./autocomplete/util"); var event = require("./lib/event"); var lang = require("./lib/lang"); var snippetManager = require("./snippets").snippetManager; var Autocomplete = function() { this.keyboardHandler = new HashHandler(); this.keyboardHandler.bindKeys(this.commands); this.blurListener = this.blurListener.bind(this); this.changeListener = this.changeListener.bind(this); this.mousedownListener = this.mousedownListener.bind(this); this.mousewheelListener = this.mousewheelListener.bind(this); this.changeTimer = lang.delayedCall(function() { this.updateCompletions(true); }.bind(this)) }; (function() { this.$init = function() { this.popup = new AcePopup(document.body || document.documentElement); this.popup.on("click", function(e) { this.insertMatch(); e.stop(); }.bind(this)); }; this.openPopup = function(editor, prefix, keepPopupPosition) { if (!this.popup) this.$init(); this.popup.setData(this.completions.filtered); var renderer = editor.renderer; if (!keepPopupPosition) { this.popup.setFontSize(editor.getFontSize()); var lineHeight = renderer.layerConfig.lineHeight; var pos = renderer.$cursorLayer.getPixelPosition(this.base, true); pos.left -= this.popup.getTextLeftOffset(); var rect = editor.container.getBoundingClientRect(); pos.top += rect.top - renderer.layerConfig.offset; pos.left += rect.left; pos.left += renderer.$gutterLayer.gutterWidth; this.popup.show(pos, lineHeight); } }; this.detach = function() { this.editor.keyBinding.removeKeyboardHandler(this.keyboardHandler); this.editor.off("changeSelection", this.changeListener); this.editor.off("blur", this.changeListener); this.editor.off("mousedown", this.mousedownListener); this.editor.off("mousewheel", this.mousewheelListener); this.changeTimer.cancel(); if (this.popup) this.popup.hide(); this.activated = false; this.completions = this.base = null; }; this.changeListener = function(e) { var cursor = this.editor.selection.lead; if (cursor.row != this.base.row || cursor.column < this.base.column) { this.detach(); } if (this.activated) this.changeTimer.schedule(); else this.detach(); }; this.blurListener = function() { if (document.activeElement != this.editor.textInput.getElement()) this.detach(); }; this.mousedownListener = function(e) { this.detach(); }; this.mousewheelListener = function(e) { this.detach(); }; this.goTo = function(where) { var row = this.popup.getRow(); var max = this.popup.session.getLength() - 1; switch(where) { case "up": row = row < 0 ? max : row - 1; break; case "down": row = row >= max ? -1 : row + 1; break; case "start": row = 0; break; case "end": row = max; break; } this.popup.setRow(row); }; this.insertMatch = function(data) { if (!data) data = this.popup.getData(this.popup.getRow()); if (!data) return false; if (data.completer && data.completer.insertMatch) { data.completer.insertMatch(this.editor); } else { if (this.completions.filterText) { var ranges = this.editor.selection.getAllRanges(); for (var i = 0, range; range = ranges[i]; i++) { range.start.column -= this.completions.filterText.length; this.editor.session.remove(range); } } if (data.snippet) snippetManager.insertSnippet(this.editor, data.snippet); else this.editor.execCommand("insertstring", data.value || data); } this.detach(); }; this.commands = { "Up": function(editor) { editor.completer.goTo("up"); }, "Down": function(editor) { editor.completer.goTo("down"); }, "Ctrl-Up|Ctrl-Home": function(editor) { editor.completer.goTo("start"); }, "Ctrl-Down|Ctrl-End": function(editor) { editor.completer.goTo("end"); }, "Esc": function(editor) { editor.completer.detach(); }, "Space": function(editor) { editor.completer.detach(); editor.insert(" ");}, "Return": function(editor) { editor.completer.insertMatch(); }, "Shift-Return": function(editor) { editor.completer.insertMatch(true); }, "Tab": function(editor) { editor.completer.insertMatch(); }, "PageUp": function(editor) { editor.completer.popup.gotoPageUp(); }, "PageDown": function(editor) { editor.completer.popup.gotoPageDown(); } }; this.gatherCompletions = function(editor, callback) { var session = editor.getSession(); var pos = editor.getCursorPosition(); var line = session.getLine(pos.row); var prefix = util.retrievePrecedingIdentifier(line, pos.column); this.base = editor.getCursorPosition(); this.base.column -= prefix.length; var matches = []; util.parForEach(editor.completers, function(completer, next) { completer.getCompletions(editor, session, pos, prefix, function(err, results) { if (!err) matches = matches.concat(results); next(); }); }, function() { callback(null, { prefix: prefix, matches: matches }); }); return true; }; this.showPopup = function(editor) { if (this.editor) this.detach(); this.activated = true; this.editor = editor; if (editor.completer != this) { if (editor.completer) editor.completer.detach(); editor.completer = this; } editor.keyBinding.addKeyboardHandler(this.keyboardHandler); editor.on("changeSelection", this.changeListener); editor.on("blur", this.blurListener); editor.on("mousedown", this.mousedownListener); editor.on("mousewheel", this.mousewheelListener); this.updateCompletions(); }; this.updateCompletions = function(keepPopupPosition) { if (keepPopupPosition && this.base && this.completions) { var pos = this.editor.getCursorPosition(); var prefix = this.editor.session.getTextRange({start: this.base, end: pos}); if (prefix == this.completions.filterText) return; this.completions.setFilter(prefix); if (!this.completions.filtered.length) return this.detach(); this.openPopup(this.editor, prefix, keepPopupPosition); return; } this.gatherCompletions(this.editor, function(err, results) { var matches = results && results.matches; if (!matches || !matches.length) return this.detach(); this.completions = new FilteredList(matches); this.completions.setFilter(results.prefix); if (!this.completions.filtered.length) return this.detach(); this.openPopup(this.editor, results.prefix, keepPopupPosition); }.bind(this)); }; this.cancelContextMenu = function() { var stop = function(e) { this.editor.off("nativecontextmenu", stop); if (e && e.domEvent) event.stopEvent(e.domEvent); }.bind(this); setTimeout(stop, 10); this.editor.on("nativecontextmenu", stop); }; }).call(Autocomplete.prototype); Autocomplete.startCommand = { name: "startAutocomplete", exec: function(editor) { if (!editor.completer) editor.completer = new Autocomplete(); editor.completer.showPopup(editor); editor.completer.cancelContextMenu(); }, bindKey: "Ctrl-Space|Ctrl-Shift-Space|Alt-Space" }; var FilteredList = function(array, filterText, mutateData) { this.all = array; this.filtered = array; this.filterText = filterText || ""; }; (function(){ this.setFilter = function(str) { if (str.length > this.filterText && str.lastIndexOf(this.filterText, 0) === 0) var matches = this.filtered; else var matches = this.all; this.filterText = str; matches = this.filterCompletions(matches, this.filterText); matches = matches.sort(function(a, b) { return b.exactMatch - a.exactMatch || b.score - a.score; }); var prev = null; matches = matches.filter(function(item){ var caption = item.value || item.caption || item.snippet; if (caption === prev) return false; prev = caption; return true; }); this.filtered = matches; }; this.filterCompletions = function(items, needle) { var results = []; var upper = needle.toUpperCase(); var lower = needle.toLowerCase(); loop: for (var i = 0, item; item = items[i]; i++) { var caption = item.value || item.caption || item.snippet; if (!caption) continue; var lastIndex = -1; var matchMask = 0; var penalty = 0; var index, distance; for (var j = 0; j < needle.length; j++) { var i1 = caption.indexOf(lower[j], lastIndex + 1); var i2 = caption.indexOf(upper[j], lastIndex + 1); index = (i1 >= 0) ? ((i2 < 0 || i1 < i2) ? i1 : i2) : i2; if (index < 0) continue loop; distance = index - lastIndex - 1; if (distance > 0) { if (lastIndex === -1) penalty += 10; penalty += distance; } matchMask = matchMask | (1 << index); lastIndex = index; } item.matchMask = matchMask; item.exactMatch = penalty ? 0 : 1; item.score = (item.score || 0) - penalty; results.push(item); } return results; }; }).call(FilteredList.prototype); exports.Autocomplete = Autocomplete; exports.FilteredList = FilteredList; }); define('ace/autocomplete/popup', ['require', 'exports', 'module' , 'ace/edit_session', 'ace/virtual_renderer', 'ace/editor', 'ace/range', 'ace/lib/event', 'ace/lib/lang', 'ace/lib/dom'], function(require, exports, module) { var EditSession = require("../edit_session").EditSession; var Renderer = require("../virtual_renderer").VirtualRenderer; var Editor = require("../editor").Editor; var Range = require("../range").Range; var event = require("../lib/event"); var lang = require("../lib/lang"); var dom = require("../lib/dom"); var $singleLineEditor = function(el) { var renderer = new Renderer(el); renderer.$maxLines = 4; var editor = new Editor(renderer); editor.setHighlightActiveLine(false); editor.setShowPrintMargin(false); editor.renderer.setShowGutter(false); editor.renderer.setHighlightGutterLine(false); editor.$mouseHandler.$focusWaitTimout = 0; return editor; }; var AcePopup = function(parentNode) { var el = dom.createElement("div"); var popup = new $singleLineEditor(el); if (parentNode) parentNode.appendChild(el); el.style.display = "none"; popup.renderer.content.style.cursor = "default"; popup.renderer.setStyle("ace_autocomplete"); popup.setOption("displayIndentGuides", false); var noop = function(){}; popup.focus = noop; popup.$isFocused = true; popup.renderer.$cursorLayer.restartTimer = noop; popup.renderer.$cursorLayer.element.style.opacity = 0; popup.renderer.$maxLines = 8; popup.renderer.$keepTextAreaAtCursor = false; popup.setHighlightActiveLine(false); popup.session.highlight(""); popup.session.$searchHighlight.clazz = "ace_highlight-marker"; popup.on("mousedown", function(e) { var pos = e.getDocumentPosition(); popup.moveCursorToPosition(pos); popup.selection.clearSelection(); selectionMarker.start.row = selectionMarker.end.row = pos.row; e.stop(); }); var lastMouseEvent; var hoverMarker = new Range(-1,0,-1,Infinity); var selectionMarker = new Range(-1,0,-1,Infinity); selectionMarker.id = popup.session.addMarker(selectionMarker, "ace_active-line", "fullLine"); popup.setSelectOnHover = function(val) { if (!val) { hoverMarker.id = popup.session.addMarker(hoverMarker, "ace_line-hover", "fullLine"); } else if (hoverMarker.id) { popup.session.removeMarker(hoverMarker.id); hoverMarker.id = null; } } popup.setSelectOnHover(false); popup.on("mousemove", function(e) { if (!lastMouseEvent) { lastMouseEvent = e; return; } if (lastMouseEvent.x == e.x && lastMouseEvent.y == e.y) { return; } lastMouseEvent = e; lastMouseEvent.scrollTop = popup.renderer.scrollTop; var row = lastMouseEvent.getDocumentPosition().row; if (hoverMarker.start.row != row) { if (!hoverMarker.id) popup.setRow(row); setHoverMarker(row); } }); popup.renderer.on("beforeRender", function() { if (lastMouseEvent && hoverMarker.start.row != -1) { lastMouseEvent.$pos = null; var row = lastMouseEvent.getDocumentPosition().row; if (!hoverMarker.id) popup.setRow(row); setHoverMarker(row, true); } }); popup.renderer.on("afterRender", function() { var row = popup.getRow(); var t = popup.renderer.$textLayer; var selected = t.element.childNodes[row - t.config.firstRow]; if (selected == t.selectedNode) return; if (t.selectedNode) dom.removeCssClass(t.selectedNode, "ace_selected"); t.selectedNode = selected; if (selected) dom.addCssClass(selected, "ace_selected"); }); var hideHoverMarker = function() { setHoverMarker(-1) }; var setHoverMarker = function(row, suppressRedraw) { if (row !== hoverMarker.start.row) { hoverMarker.start.row = hoverMarker.end.row = row; if (!suppressRedraw) popup.session._emit("changeBackMarker"); popup._emit("changeHoverMarker"); } }; popup.getHoveredRow = function() { return hoverMarker.start.row; }; event.addListener(popup.container, "mouseout", hideHoverMarker); popup.on("hide", hideHoverMarker); popup.on("changeSelection", hideHoverMarker); popup.session.doc.getLength = function() { return popup.data.length; }; popup.session.doc.getLine = function(i) { var data = popup.data[i]; if (typeof data == "string") return data; return (data && data.value) || ""; }; var bgTokenizer = popup.session.bgTokenizer; bgTokenizer.$tokenizeRow = function(i) { var data = popup.data[i]; var tokens = []; if (!data) return tokens; if (typeof data == "string") data = {value: data}; if (!data.caption) data.caption = data.value; var last = -1; var flag, c; for (var i = 0; i < data.caption.length; i++) { c = data.caption[i]; flag = data.matchMask & (1 << i) ? 1 : 0; if (last !== flag) { tokens.push({type: data.className || "" + ( flag ? "completion-highlight" : ""), value: c}); last = flag; } else { tokens[tokens.length - 1].value += c; } } if (data.meta) { var maxW = popup.renderer.$size.scrollerWidth / popup.renderer.layerConfig.characterWidth; if (data.meta.length + data.caption.length < maxW - 2) tokens.push({type: "rightAlignedText", value: data.meta}); } return tokens; }; bgTokenizer.$updateOnChange = noop; bgTokenizer.start = noop; popup.session.$computeWidth = function() { return this.screenWidth = 0; } popup.data = []; popup.setData = function(list) { popup.data = list || []; popup.setValue(lang.stringRepeat("\n", list.length), -1); popup.setRow(0); }; popup.getData = function(row) { return popup.data[row]; }; popup.getRow = function() { return selectionMarker.start.row; }; popup.setRow = function(line) { line = Math.max(-1, Math.min(this.data.length, line)); if (selectionMarker.start.row != line) { popup.selection.clearSelection(); selectionMarker.start.row = selectionMarker.end.row = line || 0; popup.session._emit("changeBackMarker"); popup.moveCursorTo(line || 0, 0); if (popup.isOpen) popup._signal("select"); } }; popup.hide = function() { this.container.style.display = "none"; this._signal("hide"); popup.isOpen = false; }; popup.show = function(pos, lineHeight) { var el = this.container; var screenHeight = window.innerHeight; var renderer = this.renderer; var maxH = renderer.$maxLines * lineHeight * 1.4; var top = pos.top + this.$borderSize; if (top + maxH > screenHeight - lineHeight) { el.style.top = ""; el.style.bottom = screenHeight - top + "px"; } else { top += lineHeight; el.style.top = top + "px"; el.style.bottom = ""; } el.style.left = pos.left + "px"; el.style.display = ""; this.renderer.$textLayer.checkForSizeChanges(); this._signal("show"); lastMouseEvent = null; popup.isOpen = true; }; popup.getTextLeftOffset = function() { return this.$borderSize + this.renderer.$padding + this.$imageSize; }; popup.$imageSize = 0; popup.$borderSize = 1; return popup; }; dom.importCssString("\ .ace_autocomplete.ace-tm .ace_marker-layer .ace_active-line {\ background-color: #CAD6FA;\ z-index: 1;\ }\ .ace_autocomplete.ace-tm .ace_line-hover {\ border: 1px solid #abbffe;\ margin-top: -1px;\ background: rgba(233,233,253,0.4);\ }\ .ace_autocomplete .ace_line-hover {\ position: absolute;\ z-index: 2;\ }\ .ace_rightAlignedText {\ color: gray;\ display: inline-block;\ position: absolute;\ right: 4px;\ text-align: right;\ z-index: -1;\ }\ .ace_autocomplete .ace_completion-highlight{\ color: #000;\ text-shadow: 0 0 0.01em;\ }\ .ace_autocomplete {\ width: 280px;\ z-index: 200000;\ background: #fbfbfb;\ color: #444;\ border: 1px lightgray solid;\ position: fixed;\ box-shadow: 2px 3px 5px rgba(0,0,0,.2);\ line-height: 1.4;\ }"); exports.AcePopup = AcePopup; }); define('ace/autocomplete/util', ['require', 'exports', 'module' ], function(require, exports, module) { exports.parForEach = function(array, fn, callback) { var completed = 0; var arLength = array.length; if (arLength === 0) callback(); for (var i = 0; i < arLength; i++) { fn(array[i], function(result, err) { completed++; if (completed === arLength) callback(result, err); }); } } var ID_REGEX = /[a-zA-Z_0-9\$-]/; exports.retrievePrecedingIdentifier = function(text, pos, regex) { regex = regex || ID_REGEX; var buf = []; for (var i = pos-1; i >= 0; i--) { if (regex.test(text[i])) buf.push(text[i]); else break; } return buf.reverse().join(""); } exports.retrieveFollowingIdentifier = function(text, pos, regex) { regex = regex || ID_REGEX; var buf = []; for (var i = pos; i < text.length; i++) { if (regex.test(text[i])) buf.push(text[i]); else break; } return buf; } }); define('ace/autocomplete/text_completer', ['require', 'exports', 'module' , 'ace/range'], function(require, exports, module) { var Range = require("ace/range").Range; var splitRegex = /[^a-zA-Z_0-9\$\-]+/; function getWordIndex(doc, pos) { var textBefore = doc.getTextRange(Range.fromPoints({row: 0, column:0}, pos)); return textBefore.split(splitRegex).length - 1; } function wordDistance(doc, pos) { var prefixPos = getWordIndex(doc, pos); var words = doc.getValue().split(splitRegex); var wordScores = Object.create(null); var currentWord = words[prefixPos]; words.forEach(function(word, idx) { if (!word || word === currentWord) return; var distance = Math.abs(prefixPos - idx); var score = words.length - distance; if (wordScores[word]) { wordScores[word] = Math.max(score, wordScores[word]); } else { wordScores[word] = score; } }); return wordScores; } exports.getCompletions = function(editor, session, pos, prefix, callback) { var wordScore = wordDistance(session, pos, prefix); var wordList = Object.keys(wordScore); callback(null, wordList.map(function(word) { return { name: word, value: word, score: wordScore[word], meta: "local" }; })); }; });apache-couchdb-1.6.0/src/fauxton/assets/js/libs/ace/ext-split.js0000644000175000001440000002132712332105522024464 0ustar00djcusers00000000000000/* ***** BEGIN LICENSE BLOCK ***** * Distributed under the BSD license: * * Copyright (c) 2010, Ajax.org B.V. * All rights reserved. * * 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 Ajax.org B.V. nor the * names of its contributors may be used to endorse or promote products * derived from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE * DISCLAIMED. IN NO EVENT SHALL AJAX.ORG B.V. 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. * * ***** END LICENSE BLOCK ***** */ define('ace/ext/split', ['require', 'exports', 'module' , 'ace/split'], function(require, exports, module) { module.exports = require("../split"); }); define('ace/split', ['require', 'exports', 'module' , 'ace/lib/oop', 'ace/lib/lang', 'ace/lib/event_emitter', 'ace/editor', 'ace/virtual_renderer', 'ace/edit_session'], function(require, exports, module) { var oop = require("./lib/oop"); var lang = require("./lib/lang"); var EventEmitter = require("./lib/event_emitter").EventEmitter; var Editor = require("./editor").Editor; var Renderer = require("./virtual_renderer").VirtualRenderer; var EditSession = require("./edit_session").EditSession; var Split = function(container, theme, splits) { this.BELOW = 1; this.BESIDE = 0; this.$container = container; this.$theme = theme; this.$splits = 0; this.$editorCSS = ""; this.$editors = []; this.$orientation = this.BESIDE; this.setSplits(splits || 1); this.$cEditor = this.$editors[0]; this.on("focus", function(editor) { this.$cEditor = editor; }.bind(this)); }; (function(){ oop.implement(this, EventEmitter); this.$createEditor = function() { var el = document.createElement("div"); el.className = this.$editorCSS; el.style.cssText = "position: absolute; top:0px; bottom:0px"; this.$container.appendChild(el); var editor = new Editor(new Renderer(el, this.$theme)); editor.on("focus", function() { this._emit("focus", editor); }.bind(this)); this.$editors.push(editor); editor.setFontSize(this.$fontSize); return editor; }; this.setSplits = function(splits) { var editor; if (splits < 1) { throw "The number of splits have to be > 0!"; } if (splits == this.$splits) { return; } else if (splits > this.$splits) { while (this.$splits < this.$editors.length && this.$splits < splits) { editor = this.$editors[this.$splits]; this.$container.appendChild(editor.container); editor.setFontSize(this.$fontSize); this.$splits ++; } while (this.$splits < splits) { this.$createEditor(); this.$splits ++; } } else { while (this.$splits > splits) { editor = this.$editors[this.$splits - 1]; this.$container.removeChild(editor.container); this.$splits --; } } this.resize(); }; this.getSplits = function() { return this.$splits; }; this.getEditor = function(idx) { return this.$editors[idx]; }; this.getCurrentEditor = function() { return this.$cEditor; }; this.focus = function() { this.$cEditor.focus(); }; this.blur = function() { this.$cEditor.blur(); }; this.setTheme = function(theme) { this.$editors.forEach(function(editor) { editor.setTheme(theme); }); }; this.setKeyboardHandler = function(keybinding) { this.$editors.forEach(function(editor) { editor.setKeyboardHandler(keybinding); }); }; this.forEach = function(callback, scope) { this.$editors.forEach(callback, scope); }; this.$fontSize = ""; this.setFontSize = function(size) { this.$fontSize = size; this.forEach(function(editor) { editor.setFontSize(size); }); }; this.$cloneSession = function(session) { var s = new EditSession(session.getDocument(), session.getMode()); var undoManager = session.getUndoManager(); if (undoManager) { var undoManagerProxy = new UndoManagerProxy(undoManager, s); s.setUndoManager(undoManagerProxy); } s.$informUndoManager = lang.delayedCall(function() { s.$deltas = []; }); s.setTabSize(session.getTabSize()); s.setUseSoftTabs(session.getUseSoftTabs()); s.setOverwrite(session.getOverwrite()); s.setBreakpoints(session.getBreakpoints()); s.setUseWrapMode(session.getUseWrapMode()); s.setUseWorker(session.getUseWorker()); s.setWrapLimitRange(session.$wrapLimitRange.min, session.$wrapLimitRange.max); s.$foldData = session.$cloneFoldData(); return s; }; this.setSession = function(session, idx) { var editor; if (idx == null) { editor = this.$cEditor; } else { editor = this.$editors[idx]; } var isUsed = this.$editors.some(function(editor) { return editor.session === session; }); if (isUsed) { session = this.$cloneSession(session); } editor.setSession(session); return session; }; this.getOrientation = function() { return this.$orientation; }; this.setOrientation = function(orientation) { if (this.$orientation == orientation) { return; } this.$orientation = orientation; this.resize(); }; this.resize = function() { var width = this.$container.clientWidth; var height = this.$container.clientHeight; var editor; if (this.$orientation == this.BESIDE) { var editorWidth = width / this.$splits; for (var i = 0; i < this.$splits; i++) { editor = this.$editors[i]; editor.container.style.width = editorWidth + "px"; editor.container.style.top = "0px"; editor.container.style.left = i * editorWidth + "px"; editor.container.style.height = height + "px"; editor.resize(); } } else { var editorHeight = height / this.$splits; for (var i = 0; i < this.$splits; i++) { editor = this.$editors[i]; editor.container.style.width = width + "px"; editor.container.style.top = i * editorHeight + "px"; editor.container.style.left = "0px"; editor.container.style.height = editorHeight + "px"; editor.resize(); } } }; }).call(Split.prototype); function UndoManagerProxy(undoManager, session) { this.$u = undoManager; this.$doc = session; } (function() { this.execute = function(options) { this.$u.execute(options); }; this.undo = function() { var selectionRange = this.$u.undo(true); if (selectionRange) { this.$doc.selection.setSelectionRange(selectionRange); } }; this.redo = function() { var selectionRange = this.$u.redo(true); if (selectionRange) { this.$doc.selection.setSelectionRange(selectionRange); } }; this.reset = function() { this.$u.reset(); }; this.hasUndo = function() { return this.$u.hasUndo(); }; this.hasRedo = function() { return this.$u.hasRedo(); }; }).call(UndoManagerProxy.prototype); exports.Split = Split; }); apache-couchdb-1.6.0/src/fauxton/assets/js/libs/ace/ext-keybinding_menu.js0000644000175000001440000001717212332105522026503 0ustar00djcusers00000000000000/* ***** BEGIN LICENSE BLOCK ***** * Distributed under the BSD license: * * Copyright (c) 2013 Matthew Christopher Kastor-Inare III, Atropa Inc. Intl * All rights reserved. * * Contributed to Ajax.org under the BSD license. * * 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 Ajax.org B.V. nor the * names of its contributors may be used to endorse or promote products * derived from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE * DISCLAIMED. IN NO EVENT SHALL AJAX.ORG B.V. 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. * * ***** END LICENSE BLOCK ***** */ define('ace/ext/keybinding_menu', ['require', 'exports', 'module' , 'ace/editor', 'ace/ext/menu_tools/overlay_page', 'ace/ext/menu_tools/get_editor_keyboard_shortcuts'], function(require, exports, module) { var Editor = require("ace/editor").Editor; function showKeyboardShortcuts (editor) { if(!document.getElementById('kbshortcutmenu')) { var overlayPage = require('./menu_tools/overlay_page').overlayPage; var getEditorKeybordShortcuts = require('./menu_tools/get_editor_keyboard_shortcuts').getEditorKeybordShortcuts; var kb = getEditorKeybordShortcuts(editor); var el = document.createElement('div'); var commands = kb.reduce(function(previous, current) { return previous + '
    ' + current.command + ' : ' + '' + current.key + '
    '; }, ''); el.id = 'kbshortcutmenu'; el.innerHTML = '

    Keyboard Shortcuts

    ' + commands + '
    '; overlayPage(editor, el, '0', '0', '0', null); } }; module.exports.init = function(editor) { Editor.prototype.showKeyboardShortcuts = function() { showKeyboardShortcuts(this); }; editor.commands.addCommands([{ name: "showKeyboardShortcuts", bindKey: {win: "Ctrl-Alt-h", mac: "Command-Alt-h"}, exec: function(editor, line) { editor.showKeyboardShortcuts(); } }]); }; }); define('ace/ext/menu_tools/overlay_page', ['require', 'exports', 'module' , 'ace/lib/dom'], function(require, exports, module) { var dom = require("../../lib/dom"); var cssText = "#ace_settingsmenu, #kbshortcutmenu {\ background-color: #F7F7F7;\ color: black;\ box-shadow: -5px 4px 5px rgba(126, 126, 126, 0.55);\ padding: 1em 0.5em 2em 1em;\ overflow: auto;\ position: absolute;\ margin: 0;\ bottom: 0;\ right: 0;\ top: 0;\ z-index: 9991;\ cursor: default;\ }\ .ace_dark #ace_settingsmenu, .ace_dark #kbshortcutmenu {\ box-shadow: -20px 10px 25px rgba(126, 126, 126, 0.25);\ background-color: rgba(255, 255, 255, 0.6);\ color: black;\ }\ .ace_optionsMenuEntry:hover {\ background-color: rgba(100, 100, 100, 0.1);\ -webkit-transition: all 0.5s;\ transition: all 0.3s\ }\ .ace_closeButton {\ background: rgba(245, 146, 146, 0.5);\ border: 1px solid #F48A8A;\ border-radius: 50%;\ padding: 7px;\ position: absolute;\ right: -8px;\ top: -8px;\ z-index: 1000;\ }\ .ace_closeButton{\ background: rgba(245, 146, 146, 0.9);\ }\ .ace_optionsMenuKey {\ color: darkslateblue;\ font-weight: bold;\ }\ .ace_optionsMenuCommand {\ color: darkcyan;\ font-weight: normal;\ }"; dom.importCssString(cssText); module.exports.overlayPage = function overlayPage(editor, contentElement, top, right, bottom, left) { top = top ? 'top: ' + top + ';' : ''; bottom = bottom ? 'bottom: ' + bottom + ';' : ''; right = right ? 'right: ' + right + ';' : ''; left = left ? 'left: ' + left + ';' : ''; var closer = document.createElement('div'); var contentContainer = document.createElement('div'); function documentEscListener(e) { if (e.keyCode === 27) { closer.click(); } } closer.style.cssText = 'margin: 0; padding: 0; ' + 'position: fixed; top:0; bottom:0; left:0; right:0;' + 'z-index: 9990; ' + 'background-color: rgba(0, 0, 0, 0.3);'; closer.addEventListener('click', function() { document.removeEventListener('keydown', documentEscListener); closer.parentNode.removeChild(closer); editor.focus(); closer = null; }); document.addEventListener('keydown', documentEscListener); contentContainer.style.cssText = top + right + bottom + left; contentContainer.addEventListener('click', function(e) { e.stopPropagation(); }); var wrapper = dom.createElement("div"); wrapper.style.position = "relative"; var closeButton = dom.createElement("div"); closeButton.className = "ace_closeButton"; closeButton.addEventListener('click', function() { closer.click(); }); wrapper.appendChild(closeButton); contentContainer.appendChild(wrapper); contentContainer.appendChild(contentElement); closer.appendChild(contentContainer); document.body.appendChild(closer); editor.blur(); }; }); define('ace/ext/menu_tools/get_editor_keyboard_shortcuts', ['require', 'exports', 'module' , 'ace/lib/keys'], function(require, exports, module) { var keys = require("../../lib/keys"); module.exports.getEditorKeybordShortcuts = function(editor) { var KEY_MODS = keys.KEY_MODS; var keybindings = []; var commandMap = {}; editor.keyBinding.$handlers.forEach(function(handler) { var ckb = handler.commandKeyBinding; for (var i in ckb) { var modifier = parseInt(i); if (modifier == -1) { modifier = ""; } else if(isNaN(modifier)) { modifier = i; } else { modifier = "" + (modifier & KEY_MODS.command ? "Cmd-" : "") + (modifier & KEY_MODS.ctrl ? "Ctrl-" : "") + (modifier & KEY_MODS.alt ? "Alt-" : "") + (modifier & KEY_MODS.shift ? "Shift-" : ""); } for (var key in ckb[i]) { var command = ckb[i][key] if (typeof command != "string") command = command.name if (commandMap[command]) { commandMap[command].key += "|" + modifier + key; } else { commandMap[command] = {key: modifier+key, command: command}; keybindings.push(commandMap[command]); } } } }); return keybindings; }; });apache-couchdb-1.6.0/src/fauxton/assets/js/libs/ace/ext-textarea.js0000644000175000001440000003656712332105522025162 0ustar00djcusers00000000000000/* ***** BEGIN LICENSE BLOCK ***** * Distributed under the BSD license: * * Copyright (c) 2010, Ajax.org B.V. * All rights reserved. * * 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 Ajax.org B.V. nor the * names of its contributors may be used to endorse or promote products * derived from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE * DISCLAIMED. IN NO EVENT SHALL AJAX.ORG B.V. 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. * * ***** END LICENSE BLOCK ***** */ define('ace/ext/textarea', ['require', 'exports', 'module' , 'ace/lib/event', 'ace/lib/useragent', 'ace/lib/net', 'ace/ace', 'ace/theme/textmate', 'ace/mode/text'], function(require, exports, module) { var event = require("../lib/event"); var UA = require("../lib/useragent"); var net = require("../lib/net"); var ace = require("../ace"); require("../theme/textmate"); module.exports = exports = ace; var getCSSProperty = function(element, container, property) { var ret = element.style[property]; if (!ret) { if (window.getComputedStyle) { ret = window.getComputedStyle(element, '').getPropertyValue(property); } else { ret = element.currentStyle[property]; } } if (!ret || ret == 'auto' || ret == 'intrinsic') { ret = container.style[property]; } return ret; }; function applyStyles(elm, styles) { for (var style in styles) { elm.style[style] = styles[style]; } } function setupContainer(element, getValue) { if (element.type != 'textarea') { throw new Error("Textarea required!"); } var parentNode = element.parentNode; var container = document.createElement('div'); var resizeEvent = function() { var style = 'position:relative;'; [ 'margin-top', 'margin-left', 'margin-right', 'margin-bottom' ].forEach(function(item) { style += item + ':' + getCSSProperty(element, container, item) + ';'; }); var width = getCSSProperty(element, container, 'width') || (element.clientWidth + "px"); var height = getCSSProperty(element, container, 'height') || (element.clientHeight + "px"); style += 'height:' + height + ';width:' + width + ';'; style += 'display:inline-block;'; container.setAttribute('style', style); }; event.addListener(window, 'resize', resizeEvent); resizeEvent(); parentNode.insertBefore(container, element.nextSibling); while (parentNode !== document) { if (parentNode.tagName.toUpperCase() === 'FORM') { var oldSumit = parentNode.onsubmit; parentNode.onsubmit = function(evt) { element.value = getValue(); if (oldSumit) { oldSumit.call(this, evt); } }; break; } parentNode = parentNode.parentNode; } return container; } exports.transformTextarea = function(element, loader) { var session; var container = setupContainer(element, function() { return session.getValue(); }); element.style.display = 'none'; container.style.background = 'white'; var editorDiv = document.createElement("div"); applyStyles(editorDiv, { top: "0px", left: "0px", right: "0px", bottom: "0px", border: "1px solid gray", position: "absolute" }); container.appendChild(editorDiv); var settingOpener = document.createElement("div"); applyStyles(settingOpener, { position: "absolute", right: "0px", bottom: "0px", background: "red", cursor: "nw-resize", borderStyle: "solid", borderWidth: "9px 8px 10px 9px", width: "2px", borderColor: "lightblue gray gray lightblue", zIndex: 101 }); var settingDiv = document.createElement("div"); var settingDivStyles = { top: "0px", left: "20%", right: "0px", bottom: "0px", position: "absolute", padding: "5px", zIndex: 100, color: "white", display: "none", overflow: "auto", fontSize: "14px", boxShadow: "-5px 2px 3px gray" }; if (!UA.isOldIE) { settingDivStyles.backgroundColor = "rgba(0, 0, 0, 0.6)"; } else { settingDivStyles.backgroundColor = "#333"; } applyStyles(settingDiv, settingDivStyles); container.appendChild(settingDiv); var options = {}; var editor = ace.edit(editorDiv); session = editor.getSession(); session.setValue(element.value || element.innerHTML); editor.focus(); container.appendChild(settingOpener); setupApi(editor, editorDiv, settingDiv, ace, options, loader); setupSettingPanel(settingDiv, settingOpener, editor, options); var state = ""; event.addListener(settingOpener, "mousemove", function(e) { var rect = this.getBoundingClientRect(); var x = e.clientX - rect.left, y = e.clientY - rect.top; if (x + y < (rect.width + rect.height)/2) { this.style.cursor = "pointer"; state = "toggle"; } else { state = "resize"; this.style.cursor = "nw-resize"; } }); event.addListener(settingOpener, "mousedown", function(e) { if (state == "toggle") { editor.setDisplaySettings(); return; } container.style.zIndex = 100000; var rect = container.getBoundingClientRect(); var startX = rect.width + rect.left - e.clientX; var startY = rect.height + rect.top - e.clientY; event.capture(settingOpener, function(e) { container.style.width = e.clientX - rect.left + startX + "px"; container.style.height = e.clientY - rect.top + startY + "px"; editor.resize(); }, function() {}); }); return editor; }; function load(url, module, callback) { net.loadScript(url, function() { require([module], callback); }); } function setupApi(editor, editorDiv, settingDiv, ace, options, loader) { var session = editor.getSession(); var renderer = editor.renderer; loader = loader || load; function toBool(value) { return value === "true" || value == true; } editor.setDisplaySettings = function(display) { if (display == null) display = settingDiv.style.display == "none"; if (display) { settingDiv.style.display = "block"; settingDiv.hideButton.focus(); editor.on("focus", function onFocus() { editor.removeListener("focus", onFocus); settingDiv.style.display = "none"; }); } else { editor.focus(); } }; editor.$setOption = editor.setOption; editor.setOption = function(key, value) { if (options[key] == value) return; switch (key) { case "mode": if (value != "text") { loader("mode-" + value + ".js", "ace/mode/" + value, function() { var aceMode = require("../mode/" + value).Mode; session.setMode(new aceMode()); }); } else { session.setMode(new (require("../mode/text").Mode)); } break; case "theme": if (value != "textmate") { loader("theme-" + value + ".js", "ace/theme/" + value, function() { editor.setTheme("ace/theme/" + value); }); } else { editor.setTheme("ace/theme/textmate"); } break; case "fontSize": editorDiv.style.fontSize = value; break; case "keybindings": switch (value) { case "vim": editor.setKeyboardHandler("ace/keyboard/vim"); break; case "emacs": editor.setKeyboardHandler("ace/keyboard/emacs"); break; default: editor.setKeyboardHandler(null); } break; case "softWrap": switch (value) { case "off": session.setUseWrapMode(false); renderer.setPrintMarginColumn(80); break; case "40": session.setUseWrapMode(true); session.setWrapLimitRange(40, 40); renderer.setPrintMarginColumn(40); break; case "80": session.setUseWrapMode(true); session.setWrapLimitRange(80, 80); renderer.setPrintMarginColumn(80); break; case "free": session.setUseWrapMode(true); session.setWrapLimitRange(null, null); renderer.setPrintMarginColumn(80); break; } break; default: editor.$setOption(key, toBool(value)); } options[key] = value; }; editor.getOption = function(key) { return options[key]; }; editor.getOptions = function() { return options; }; editor.setOptions(exports.options); return editor; } function setupSettingPanel(settingDiv, settingOpener, editor, options) { var BOOL = null; var desc = { mode: "Mode:", gutter: "Display Gutter:", theme: "Theme:", fontSize: "Font Size:", softWrap: "Soft Wrap:", keybindings: "Keyboard", showPrintMargin: "Show Print Margin:", useSoftTabs: "Use Soft Tabs:", showInvisibles: "Show Invisibles" }; var optionValues = { mode: { text: "Plain", javascript: "JavaScript", xml: "XML", html: "HTML", css: "CSS", scss: "SCSS", python: "Python", php: "PHP", java: "Java", ruby: "Ruby", c_cpp: "C/C++", coffee: "CoffeeScript", json: "json", perl: "Perl", clojure: "Clojure", ocaml: "OCaml", csharp: "C#", haxe: "haXe", svg: "SVG", textile: "Textile", groovy: "Groovy", liquid: "Liquid", Scala: "Scala" }, theme: { clouds: "Clouds", clouds_midnight: "Clouds Midnight", cobalt: "Cobalt", crimson_editor: "Crimson Editor", dawn: "Dawn", eclipse: "Eclipse", idle_fingers: "Idle Fingers", kr_theme: "Kr Theme", merbivore: "Merbivore", merbivore_soft: "Merbivore Soft", mono_industrial: "Mono Industrial", monokai: "Monokai", pastel_on_dark: "Pastel On Dark", solarized_dark: "Solarized Dark", solarized_light: "Solarized Light", textmate: "Textmate", twilight: "Twilight", vibrant_ink: "Vibrant Ink" }, gutter: BOOL, fontSize: { "10px": "10px", "11px": "11px", "12px": "12px", "14px": "14px", "16px": "16px" }, softWrap: { off: "Off", 40: "40", 80: "80", free: "Free" }, keybindings: { ace: "ace", vim: "vim", emacs: "emacs" }, showPrintMargin: BOOL, useSoftTabs: BOOL, showInvisibles: BOOL }; var table = []; table.push(""); function renderOption(builder, option, obj, cValue) { if (!obj) { builder.push( "" ); return; } builder.push(""); } for (var option in options) { table.push(""); table.push(""); } table.push("
    SettingValue
    ", desc[option], ""); renderOption(table, option, optionValues[option], options[option]); table.push("
    "); settingDiv.innerHTML = table.join(""); var onChange = function(e) { var select = e.currentTarget; editor.setOption(select.title, select.value); }; var onClick = function(e) { var cb = e.currentTarget; editor.setOption(cb.title, cb.checked); }; var selects = settingDiv.getElementsByTagName("select"); for (var i = 0; i < selects.length; i++) selects[i].onchange = onChange; var cbs = settingDiv.getElementsByTagName("input"); for (var i = 0; i < cbs.length; i++) cbs[i].onclick = onClick; var button = document.createElement("input"); button.type = "button"; button.value = "Hide"; event.addListener(button, "click", function() { editor.setDisplaySettings(false); }); settingDiv.appendChild(button); settingDiv.hideButton = button; } exports.options = { mode: "text", theme: "textmate", gutter: "false", fontSize: "12px", softWrap: "off", keybindings: "ace", showPrintMargin: "false", useSoftTabs: "true", showInvisibles: "false" }; }); apache-couchdb-1.6.0/src/fauxton/assets/js/libs/ace/ext-emmet.js0000644000175000001440000011445512332105522024445 0ustar00djcusers00000000000000/* ***** BEGIN LICENSE BLOCK ***** * Distributed under the BSD license: * * Copyright (c) 2010, Ajax.org B.V. * All rights reserved. * * 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 Ajax.org B.V. nor the * names of its contributors may be used to endorse or promote products * derived from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE * DISCLAIMED. IN NO EVENT SHALL AJAX.ORG B.V. 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. * * ***** END LICENSE BLOCK ***** */ define('ace/ext/emmet', ['require', 'exports', 'module' , 'ace/keyboard/hash_handler', 'ace/editor', 'ace/snippets', 'ace/range', 'ace/config'], function(require, exports, module) { var HashHandler = require("ace/keyboard/hash_handler").HashHandler; var Editor = require("ace/editor").Editor; var snippetManager = require("ace/snippets").snippetManager; var Range = require("ace/range").Range; var emmet; Editor.prototype.indexToPosition = function(index) { return this.session.doc.indexToPosition(index); }; Editor.prototype.positionToIndex = function(pos) { return this.session.doc.positionToIndex(pos); }; function AceEmmetEditor() {} AceEmmetEditor.prototype = { setupContext: function(editor) { this.ace = editor; this.indentation = editor.session.getTabString(); if (!emmet) emmet = window.emmet; emmet.require("resources").setVariable("indentation", this.indentation); this.$syntax = null; this.$syntax = this.getSyntax(); }, getSelectionRange: function() { var range = this.ace.getSelectionRange(); return { start: this.ace.positionToIndex(range.start), end: this.ace.positionToIndex(range.end) }; }, createSelection: function(start, end) { this.ace.selection.setRange({ start: this.ace.indexToPosition(start), end: this.ace.indexToPosition(end) }); }, getCurrentLineRange: function() { var row = this.ace.getCursorPosition().row; var lineLength = this.ace.session.getLine(row).length; var index = this.ace.positionToIndex({row: row, column: 0}); return { start: index, end: index + lineLength }; }, getCaretPos: function(){ var pos = this.ace.getCursorPosition(); return this.ace.positionToIndex(pos); }, setCaretPos: function(index){ var pos = this.ace.indexToPosition(index); this.ace.clearSelection(); this.ace.selection.moveCursorToPosition(pos); }, getCurrentLine: function() { var row = this.ace.getCursorPosition().row; return this.ace.session.getLine(row); }, replaceContent: function(value, start, end, noIndent) { if (end == null) end = start == null ? this.getContent().length : start; if (start == null) start = 0; var editor = this.ace; var range = Range.fromPoints(editor.indexToPosition(start), editor.indexToPosition(end)); editor.session.remove(range); range.end = range.start; value = this.$updateTabstops(value); snippetManager.insertSnippet(editor, value) }, getContent: function(){ return this.ace.getValue(); }, getSyntax: function() { if (this.$syntax) return this.$syntax; var syntax = this.ace.session.$modeId.split("/").pop(); if (syntax == "html" || syntax == "php") { var cursor = this.ace.getCursorPosition(); var state = this.ace.session.getState(cursor.row); if (typeof state != "string") state = state[0]; if (state) { state = state.split("-"); if (state.length > 1) syntax = state[0]; else if (syntax == "php") syntax = "html"; } } return syntax; }, getProfileName: function() { switch(this.getSyntax()) { case "css": return "css"; case "xml": case "xsl": return "xml"; case "html": var profile = emmet.require("resources").getVariable("profile"); if (!profile) profile = this.ace.session.getLines(0,2).join("").search(/]+XHTML/i) != -1 ? "xhtml": "html"; return profile; } return "xhtml"; }, prompt: function(title) { return prompt(title); }, getSelection: function() { return this.ace.session.getTextRange(); }, getFilePath: function() { return ""; }, $updateTabstops: function(value) { var base = 1000; var zeroBase = 0; var lastZero = null; var range = emmet.require('range'); var ts = emmet.require('tabStops'); var settings = emmet.require('resources').getVocabulary("user"); var tabstopOptions = { tabstop: function(data) { var group = parseInt(data.group, 10); var isZero = group === 0; if (isZero) group = ++zeroBase; else group += base; var placeholder = data.placeholder; if (placeholder) { placeholder = ts.processText(placeholder, tabstopOptions); } var result = '${' + group + (placeholder ? ':' + placeholder : '') + '}'; if (isZero) { lastZero = range.create(data.start, result); } return result }, escape: function(ch) { if (ch == '$') return '\\$'; if (ch == '\\') return '\\\\'; return ch; } }; value = ts.processText(value, tabstopOptions); if (settings.variables['insert_final_tabstop'] && !/\$\{0\}$/.test(value)) { value += '${0}'; } else if (lastZero) { value = emmet.require('utils').replaceSubstring(value, '${0}', lastZero); } return value; } }; var keymap = { expand_abbreviation: {"mac": "ctrl+alt+e", "win": "alt+e"}, match_pair_outward: {"mac": "ctrl+d", "win": "ctrl+,"}, match_pair_inward: {"mac": "ctrl+j", "win": "ctrl+shift+0"}, matching_pair: {"mac": "ctrl+alt+j", "win": "alt+j"}, next_edit_point: "alt+right", prev_edit_point: "alt+left", toggle_comment: {"mac": "command+/", "win": "ctrl+/"}, split_join_tag: {"mac": "shift+command+'", "win": "shift+ctrl+`"}, remove_tag: {"mac": "command+'", "win": "shift+ctrl+;"}, evaluate_math_expression: {"mac": "shift+command+y", "win": "shift+ctrl+y"}, increment_number_by_1: "ctrl+up", decrement_number_by_1: "ctrl+down", increment_number_by_01: "alt+up", decrement_number_by_01: "alt+down", increment_number_by_10: {"mac": "alt+command+up", "win": "shift+alt+up"}, decrement_number_by_10: {"mac": "alt+command+down", "win": "shift+alt+down"}, select_next_item: {"mac": "shift+command+.", "win": "shift+ctrl+."}, select_previous_item: {"mac": "shift+command+,", "win": "shift+ctrl+,"}, reflect_css_value: {"mac": "shift+command+r", "win": "shift+ctrl+r"}, encode_decode_data_url: {"mac": "shift+ctrl+d", "win": "ctrl+'"}, expand_abbreviation_with_tab: "Tab", wrap_with_abbreviation: {"mac": "shift+ctrl+a", "win": "shift+ctrl+a"} }; var editorProxy = new AceEmmetEditor(); exports.commands = new HashHandler(); exports.runEmmetCommand = function(editor) { editorProxy.setupContext(editor); if (editorProxy.getSyntax() == "php") return false; var actions = emmet.require("actions"); if (this.action == "expand_abbreviation_with_tab") { if (!editor.selection.isEmpty()) return false; } if (this.action == "wrap_with_abbreviation") { return setTimeout(function() { actions.run("wrap_with_abbreviation", editorProxy); }, 0); } try { var result = actions.run(this.action, editorProxy); } catch(e) { editor._signal("changeStatus", typeof e == "string" ? e : e.message); console.log(e); } return result; }; for (var command in keymap) { exports.commands.addCommand({ name: "emmet:" + command, action: command, bindKey: keymap[command], exec: exports.runEmmetCommand, multiSelectAction: "forEach" }); } var onChangeMode = function(e, target) { var editor = target; if (!editor) return; var modeId = editor.session.$modeId; var enabled = modeId && /css|less|scss|sass|stylus|html|php/.test(modeId); if (e.enableEmmet === false) enabled = false; if (enabled) editor.keyBinding.addKeyboardHandler(exports.commands); else editor.keyBinding.removeKeyboardHandler(exports.commands); }; exports.AceEmmetEditor = AceEmmetEditor; require("ace/config").defineOptions(Editor.prototype, "editor", { enableEmmet: { set: function(val) { this[val ? "on" : "removeListener"]("changeMode", onChangeMode); onChangeMode({enableEmmet: !!val}, this); }, value: true } }); exports.setCore = function(e) {emmet = e;}; }); define('ace/snippets', ['require', 'exports', 'module' , 'ace/lib/lang', 'ace/range', 'ace/keyboard/hash_handler', 'ace/tokenizer', 'ace/lib/dom'], function(require, exports, module) { var lang = require("./lib/lang") var Range = require("./range").Range var HashHandler = require("./keyboard/hash_handler").HashHandler; var Tokenizer = require("./tokenizer").Tokenizer; var comparePoints = Range.comparePoints; var SnippetManager = function() { this.snippetMap = {}; this.snippetNameMap = {}; }; (function() { this.getTokenizer = function() { function TabstopToken(str, _, stack) { str = str.substr(1); if (/^\d+$/.test(str) && !stack.inFormatString) return [{tabstopId: parseInt(str, 10)}]; return [{text: str}] } function escape(ch) { return "(?:[^\\\\" + ch + "]|\\\\.)"; } SnippetManager.$tokenizer = new Tokenizer({ start: [ {regex: /:/, onMatch: function(val, state, stack) { if (stack.length && stack[0].expectIf) { stack[0].expectIf = false; stack[0].elseBranch = stack[0]; return [stack[0]]; } return ":"; }}, {regex: /\\./, onMatch: function(val, state, stack) { var ch = val[1]; if (ch == "}" && stack.length) { val = ch; }else if ("`$\\".indexOf(ch) != -1) { val = ch; } else if (stack.inFormatString) { if (ch == "n") val = "\n"; else if (ch == "t") val = "\n"; else if ("ulULE".indexOf(ch) != -1) { val = {changeCase: ch, local: ch > "a"}; } } return [val]; }}, {regex: /}/, onMatch: function(val, state, stack) { return [stack.length ? stack.shift() : val]; }}, {regex: /\$(?:\d+|\w+)/, onMatch: TabstopToken}, {regex: /\$\{[\dA-Z_a-z]+/, onMatch: function(str, state, stack) { var t = TabstopToken(str.substr(1), state, stack); stack.unshift(t[0]); return t; }, next: "snippetVar"}, {regex: /\n/, token: "newline", merge: false} ], snippetVar: [ {regex: "\\|" + escape("\\|") + "*\\|", onMatch: function(val, state, stack) { stack[0].choices = val.slice(1, -1).split(","); }, next: "start"}, {regex: "/(" + escape("/") + "+)/(?:(" + escape("/") + "*)/)(\\w*):?", onMatch: function(val, state, stack) { var ts = stack[0]; ts.fmtString = val; val = this.splitRegex.exec(val); ts.guard = val[1]; ts.fmt = val[2]; ts.flag = val[3]; return ""; }, next: "start"}, {regex: "`" + escape("`") + "*`", onMatch: function(val, state, stack) { stack[0].code = val.splice(1, -1); return ""; }, next: "start"}, {regex: "\\?", onMatch: function(val, state, stack) { if (stack[0]) stack[0].expectIf = true; }, next: "start"}, {regex: "([^:}\\\\]|\\\\.)*:?", token: "", next: "start"} ], formatString: [ {regex: "/(" + escape("/") + "+)/", token: "regex"}, {regex: "", onMatch: function(val, state, stack) { stack.inFormatString = true; }, next: "start"} ] }); SnippetManager.prototype.getTokenizer = function() { return SnippetManager.$tokenizer; } return SnippetManager.$tokenizer; }; this.tokenizeTmSnippet = function(str, startState) { return this.getTokenizer().getLineTokens(str, startState).tokens.map(function(x) { return x.value || x; }); }; this.$getDefaultValue = function(editor, name) { if (/^[A-Z]\d+$/.test(name)) { var i = name.substr(1); return (this.variables[name[0] + "__"] || {})[i]; } if (/^\d+$/.test(name)) { return (this.variables.__ || {})[name]; } name = name.replace(/^TM_/, ""); if (!editor) return; var s = editor.session; switch(name) { case "CURRENT_WORD": var r = s.getWordRange(); case "SELECTION": case "SELECTED_TEXT": return s.getTextRange(r); case "CURRENT_LINE": return s.getLine(editor.getCursorPosition().row); case "PREV_LINE": // not possible in textmate return s.getLine(editor.getCursorPosition().row - 1); case "LINE_INDEX": return editor.getCursorPosition().column; case "LINE_NUMBER": return editor.getCursorPosition().row + 1; case "SOFT_TABS": return s.getUseSoftTabs() ? "YES" : "NO"; case "TAB_SIZE": return s.getTabSize(); case "FILENAME": case "FILEPATH": return "ace.ajax.org"; case "FULLNAME": return "Ace"; } }; this.variables = {}; this.getVariableValue = function(editor, varName) { if (this.variables.hasOwnProperty(varName)) return this.variables[varName](editor, varName) || ""; return this.$getDefaultValue(editor, varName) || ""; }; this.tmStrFormat = function(str, ch, editor) { var flag = ch.flag || ""; var re = ch.guard; re = new RegExp(re, flag.replace(/[^gi]/, "")); var fmtTokens = this.tokenizeTmSnippet(ch.fmt, "formatString"); var _self = this; var formatted = str.replace(re, function() { _self.variables.__ = arguments; var fmtParts = _self.resolveVariables(fmtTokens, editor); var gChangeCase = "E"; for (var i = 0; i < fmtParts.length; i++) { var ch = fmtParts[i]; if (typeof ch == "object") { fmtParts[i] = ""; if (ch.changeCase && ch.local) { var next = fmtParts[i + 1]; if (next && typeof next == "string") { if (ch.changeCase == "u") fmtParts[i] = next[0].toUpperCase(); else fmtParts[i] = next[0].toLowerCase(); fmtParts[i + 1] = next.substr(1); } } else if (ch.changeCase) { gChangeCase = ch.changeCase; } } else if (gChangeCase == "U") { fmtParts[i] = ch.toUpperCase(); } else if (gChangeCase == "L") { fmtParts[i] = ch.toLowerCase(); } } return fmtParts.join(""); }); this.variables.__ = null; return formatted; }; this.resolveVariables = function(snippet, editor) { var result = []; for (var i = 0; i < snippet.length; i++) { var ch = snippet[i]; if (typeof ch == "string") { result.push(ch); } else if (typeof ch != "object") { continue; } else if (ch.skip) { gotoNext(ch); } else if (ch.processed < i) { continue; } else if (ch.text) { var value = this.getVariableValue(editor, ch.text); if (value && ch.fmtString) value = this.tmStrFormat(value, ch); ch.processed = i; if (ch.expectIf == null) { if (value) { result.push(value); gotoNext(ch); } } else { if (value) { ch.skip = ch.elseBranch; } else gotoNext(ch); } } else if (ch.tabstopId != null) { result.push(ch); } else if (ch.changeCase != null) { result.push(ch); } } function gotoNext(ch) { var i1 = snippet.indexOf(ch, i + 1); if (i1 != -1) i = i1; } return result; }; this.insertSnippet = function(editor, snippetText) { var cursor = editor.getCursorPosition(); var line = editor.session.getLine(cursor.row); var indentString = line.match(/^\s*/)[0]; var tabString = editor.session.getTabString(); var tokens = this.tokenizeTmSnippet(snippetText); tokens = this.resolveVariables(tokens, editor); tokens = tokens.map(function(x) { if (x == "\n") return x + indentString; if (typeof x == "string") return x.replace(/\t/g, tabString); return x; }); var tabstops = []; tokens.forEach(function(p, i) { if (typeof p != "object") return; var id = p.tabstopId; var ts = tabstops[id]; if (!ts) { ts = tabstops[id] = []; ts.index = id; ts.value = ""; } if (ts.indexOf(p) !== -1) return; ts.push(p); var i1 = tokens.indexOf(p, i + 1); if (i1 === -1) return; var value = tokens.slice(i + 1, i1); var isNested = value.some(function(t) {return typeof t === "object"}); if (isNested && !ts.value) { ts.value = value; } else if (value.length && (!ts.value || typeof ts.value !== "string")) { ts.value = value.join(""); } }); tabstops.forEach(function(ts) {ts.length = 0}); var expanding = {}; function copyValue(val) { var copy = [] for (var i = 0; i < val.length; i++) { var p = val[i]; if (typeof p == "object") { if (expanding[p.tabstopId]) continue; var j = val.lastIndexOf(p, i - 1); p = copy[j] || {tabstopId: p.tabstopId}; } copy[i] = p; } return copy; } for (var i = 0; i < tokens.length; i++) { var p = tokens[i]; if (typeof p != "object") continue; var id = p.tabstopId; var i1 = tokens.indexOf(p, i + 1); if (expanding[id] == p) { expanding[id] = null; continue; } var ts = tabstops[id]; var arg = typeof ts.value == "string" ? [ts.value] : copyValue(ts.value); arg.unshift(i + 1, Math.max(0, i1 - i)); arg.push(p); expanding[id] = p; tokens.splice.apply(tokens, arg); if (ts.indexOf(p) === -1) ts.push(p); }; var row = 0, column = 0; var text = ""; tokens.forEach(function(t) { if (typeof t === "string") { if (t[0] === "\n"){ column = t.length - 1; row ++; } else column += t.length; text += t; } else { if (!t.start) t.start = {row: row, column: column}; else t.end = {row: row, column: column}; } }); var range = editor.getSelectionRange(); var end = editor.session.replace(range, text); var tabstopManager = new TabstopManager(editor); tabstopManager.addTabstops(tabstops, range.start, end); tabstopManager.tabNext(); }; this.$getScope = function(editor) { var scope = editor.session.$mode.$id || ""; scope = scope.split("/").pop(); if (scope === "html" || scope === "php") { if (scope === "php") scope = "html"; var c = editor.getCursorPosition() var state = editor.session.getState(c.row); if (typeof state === "object") { state = state[0]; } if (state.substring) { if (state.substring(0, 3) == "js-") scope = "javascript"; else if (state.substring(0, 4) == "css-") scope = "css"; else if (state.substring(0, 4) == "php-") scope = "php"; } } return scope; }; this.expandWithTab = function(editor) { var cursor = editor.getCursorPosition(); var line = editor.session.getLine(cursor.row); var before = line.substring(0, cursor.column); var after = line.substr(cursor.column); var scope = this.$getScope(editor); var snippetMap = this.snippetMap; var snippet; [scope, "_"].some(function(scope) { var snippets = snippetMap[scope]; if (snippets) snippet = this.findMatchingSnippet(snippets, before, after); return !!snippet; }, this); if (!snippet) return false; editor.session.doc.removeInLine(cursor.row, cursor.column - snippet.replaceBefore.length, cursor.column + snippet.replaceAfter.length ); this.variables.M__ = snippet.matchBefore; this.variables.T__ = snippet.matchAfter; this.insertSnippet(editor, snippet.content); this.variables.M__ = this.variables.T__ = null; return true; }; this.findMatchingSnippet = function(snippetList, before, after) { for (var i = snippetList.length; i--;) { var s = snippetList[i]; if (s.startRe && !s.startRe.test(before)) continue; if (s.endRe && !s.endRe.test(after)) continue; if (!s.startRe && !s.endRe) continue; s.matchBefore = s.startRe ? s.startRe.exec(before) : [""]; s.matchAfter = s.endRe ? s.endRe.exec(after) : [""]; s.replaceBefore = s.triggerRe ? s.triggerRe.exec(before)[0] : ""; s.replaceAfter = s.endTriggerRe ? s.endTriggerRe.exec(after)[0] : ""; return s; } }; this.snippetMap = {}; this.snippetNameMap = {}; this.register = function(snippets, scope) { var snippetMap = this.snippetMap; var snippetNameMap = this.snippetNameMap; var self = this; function wrapRegexp(src) { if (src && !/^\^?\(.*\)\$?$|^\\b$/.test(src)) src = "(?:" + src + ")" return src || ""; } function guardedRegexp(re, guard, opening) { re = wrapRegexp(re); guard = wrapRegexp(guard); if (opening) { re = guard + re; if (re && re[re.length - 1] != "$") re = re + "$"; } else { re = re + guard; if (re && re[0] != "^") re = "^" + re; } return new RegExp(re); } function addSnippet(s) { if (!s.scope) s.scope = scope || "_"; scope = s.scope if (!snippetMap[scope]) { snippetMap[scope] = []; snippetNameMap[scope] = {}; } var map = snippetNameMap[scope]; if (s.name) { var old = map[s.name]; if (old) self.unregister(old); map[s.name] = s; } snippetMap[scope].push(s); if (s.tabTrigger && !s.trigger) { if (!s.guard && /^\w/.test(s.tabTrigger)) s.guard = "\\b"; s.trigger = lang.escapeRegExp(s.tabTrigger); } s.startRe = guardedRegexp(s.trigger, s.guard, true); s.triggerRe = new RegExp(s.trigger, "", true); s.endRe = guardedRegexp(s.endTrigger, s.endGuard, true); s.endTriggerRe = new RegExp(s.endTrigger, "", true); }; if (snippets.content) addSnippet(snippets); else if (Array.isArray(snippets)) snippets.forEach(addSnippet); }; this.unregister = function(snippets, scope) { var snippetMap = this.snippetMap; var snippetNameMap = this.snippetNameMap; function removeSnippet(s) { var nameMap = snippetNameMap[s.scope||scope]; if (nameMap && nameMap[s.name]) { delete nameMap[s.name]; var map = snippetMap[s.scope||scope]; var i = map && map.indexOf(s); if (i >= 0) map.splice(i, 1); } } if (snippets.content) removeSnippet(snippets); else if (Array.isArray(snippets)) snippets.forEach(removeSnippet); }; this.parseSnippetFile = function(str) { str = str.replace(/\r/g, ""); var list = [], snippet = {}; var re = /^#.*|^({[\s\S]*})\s*$|^(\S+) (.*)$|^((?:\n*\t.*)+)/gm; var m; while (m = re.exec(str)) { if (m[1]) { try { snippet = JSON.parse(m[1]) list.push(snippet); } catch (e) {} } if (m[4]) { snippet.content = m[4].replace(/^\t/gm, ""); list.push(snippet); snippet = {}; } else { var key = m[2], val = m[3]; if (key == "regex") { var guardRe = /\/((?:[^\/\\]|\\.)*)|$/g; snippet.guard = guardRe.exec(val)[1]; snippet.trigger = guardRe.exec(val)[1]; snippet.endTrigger = guardRe.exec(val)[1]; snippet.endGuard = guardRe.exec(val)[1]; } else if (key == "snippet") { snippet.tabTrigger = val.match(/^\S*/)[0]; if (!snippet.name) snippet.name = val; } else { snippet[key] = val; } } } return list; }; this.getSnippetByName = function(name, editor) { var scope = editor && this.$getScope(editor); var snippetMap = this.snippetNameMap; var snippet; [scope, "_"].some(function(scope) { var snippets = snippetMap[scope]; if (snippets) snippet = snippets[name]; return !!snippet; }, this); return snippet; }; }).call(SnippetManager.prototype); var TabstopManager = function(editor) { if (editor.tabstopManager) return editor.tabstopManager; editor.tabstopManager = this; this.$onChange = this.onChange.bind(this); this.$onChangeSelection = lang.delayedCall(this.onChangeSelection.bind(this)).schedule; this.$onChangeSession = this.onChangeSession.bind(this); this.$onAfterExec = this.onAfterExec.bind(this); this.attach(editor); }; (function() { this.attach = function(editor) { this.index = -1; this.ranges = []; this.tabstops = []; this.selectedTabstop = null; this.editor = editor; this.editor.on("change", this.$onChange); this.editor.on("changeSelection", this.$onChangeSelection); this.editor.on("changeSession", this.$onChangeSession); this.editor.commands.on("afterExec", this.$onAfterExec); this.editor.keyBinding.addKeyboardHandler(this.keyboardHandler); }; this.detach = function() { this.tabstops.forEach(this.removeTabstopMarkers, this); this.ranges = null; this.tabstops = null; this.selectedTabstop = null; this.editor.removeListener("change", this.$onChange); this.editor.removeListener("changeSelection", this.$onChangeSelection); this.editor.removeListener("changeSession", this.$onChangeSession); this.editor.commands.removeListener("afterExec", this.$onAfterExec); this.editor.keyBinding.removeKeyboardHandler(this.keyboardHandler); this.editor.tabstopManager = null; this.editor = null; }; this.onChange = function(e) { var changeRange = e.data.range; var isRemove = e.data.action[0] == "r"; var start = changeRange.start; var end = changeRange.end; var startRow = start.row; var endRow = end.row; var lineDif = endRow - startRow; var colDiff = end.column - start.column; if (isRemove) { lineDif = -lineDif; colDiff = -colDiff; } if (!this.$inChange && isRemove) { var ts = this.selectedTabstop; var changedOutside = !ts.some(function(r) { return comparePoints(r.start, start) <= 0 && comparePoints(r.end, end) >= 0; }); if (changedOutside) return this.detach(); } var ranges = this.ranges; for (var i = 0; i < ranges.length; i++) { var r = ranges[i]; if (r.end.row < start.row) continue; if (comparePoints(start, r.start) < 0 && comparePoints(end, r.end) > 0) { this.removeRange(r); i--; continue; } if (r.start.row == startRow && r.start.column > start.column) r.start.column += colDiff; if (r.end.row == startRow && r.end.column >= start.column) r.end.column += colDiff; if (r.start.row >= startRow) r.start.row += lineDif; if (r.end.row >= startRow) r.end.row += lineDif; if (comparePoints(r.start, r.end) > 0) this.removeRange(r); } if (!ranges.length) this.detach(); }; this.updateLinkedFields = function() { var ts = this.selectedTabstop; if (!ts.hasLinkedRanges) return; this.$inChange = true; var session = this.editor.session; var text = session.getTextRange(ts.firstNonLinked); for (var i = ts.length; i--;) { var range = ts[i]; if (!range.linked) continue; var fmt = exports.snippetManager.tmStrFormat(text, range.original) session.replace(range, fmt); } this.$inChange = false; }; this.onAfterExec = function(e) { if (e.command && !e.command.readOnly) this.updateLinkedFields(); }; this.onChangeSelection = function() { if (!this.editor) return var lead = this.editor.selection.lead; var anchor = this.editor.selection.anchor; var isEmpty = this.editor.selection.isEmpty(); for (var i = this.ranges.length; i--;) { if (this.ranges[i].linked) continue; var containsLead = this.ranges[i].contains(lead.row, lead.column); var containsAnchor = isEmpty || this.ranges[i].contains(anchor.row, anchor.column); if (containsLead && containsAnchor) return; } this.detach(); }; this.onChangeSession = function() { this.detach(); }; this.tabNext = function(dir) { var max = this.tabstops.length - 1; var index = this.index + (dir || 1); index = Math.min(Math.max(index, 0), max); this.selectTabstop(index); if (index == max) this.detach(); }; this.selectTabstop = function(index) { var ts = this.tabstops[this.index]; if (ts) this.addTabstopMarkers(ts); this.index = index; ts = this.tabstops[this.index]; if (!ts || !ts.length) return; this.selectedTabstop = ts; if (!this.editor.inVirtualSelectionMode) { var sel = this.editor.multiSelect; sel.toSingleRange(ts.firstNonLinked.clone()); for (var i = ts.length; i--;) { if (ts.hasLinkedRanges && ts[i].linked) continue; sel.addRange(ts[i].clone(), true); } } else { this.editor.selection.setRange(ts.firstNonLinked); } this.editor.keyBinding.addKeyboardHandler(this.keyboardHandler); }; this.addTabstops = function(tabstops, start, end) { if (!tabstops[0]) { var p = Range.fromPoints(end, end); moveRelative(p.start, start); moveRelative(p.end, start); tabstops[0] = [p]; tabstops[0].index = 0; } var i = this.index; var arg = [i, 0]; var ranges = this.ranges; var editor = this.editor; tabstops.forEach(function(ts) { for (var i = ts.length; i--;) { var p = ts[i]; var range = Range.fromPoints(p.start, p.end || p.start); movePoint(range.start, start); movePoint(range.end, start); range.original = p; range.tabstop = ts; ranges.push(range); ts[i] = range; if (p.fmtString) { range.linked = true; ts.hasLinkedRanges = true; } else if (!ts.firstNonLinked) ts.firstNonLinked = range; } if (!ts.firstNonLinked) ts.hasLinkedRanges = false; arg.push(ts); this.addTabstopMarkers(ts); }, this); arg.push(arg.splice(2, 1)[0]); this.tabstops.splice.apply(this.tabstops, arg); }; this.addTabstopMarkers = function(ts) { var session = this.editor.session; ts.forEach(function(range) { if (!range.markerId) range.markerId = session.addMarker(range, "ace_snippet-marker", "text"); }); }; this.removeTabstopMarkers = function(ts) { var session = this.editor.session; ts.forEach(function(range) { session.removeMarker(range.markerId); range.markerId = null; }); }; this.removeRange = function(range) { var i = range.tabstop.indexOf(range); range.tabstop.splice(i, 1); i = this.ranges.indexOf(range); this.ranges.splice(i, 1); this.editor.session.removeMarker(range.markerId); }; this.keyboardHandler = new HashHandler(); this.keyboardHandler.bindKeys({ "Tab": function(ed) { ed.tabstopManager.tabNext(1); }, "Shift-Tab": function(ed) { ed.tabstopManager.tabNext(-1); }, "Esc": function(ed) { ed.tabstopManager.detach(); }, "Return": function(ed) { return false; } }); }).call(TabstopManager.prototype); var movePoint = function(point, diff) { if (point.row == 0) point.column += diff.column; point.row += diff.row; }; var moveRelative = function(point, start) { if (point.row == start.row) point.column -= start.column; point.row -= start.row; }; require("./lib/dom").importCssString("\ .ace_snippet-marker {\ -moz-box-sizing: border-box;\ box-sizing: border-box;\ background: rgba(194, 193, 208, 0.09);\ border: 1px dotted rgba(211, 208, 235, 0.62);\ position: absolute;\ }"); exports.snippetManager = new SnippetManager(); }); apache-couchdb-1.6.0/src/fauxton/assets/js/libs/ace/worker-json.js0000644000175000001440000020320512332105522025010 0ustar00djcusers00000000000000"no use strict"; ;(function(window) { if (typeof window.window != "undefined" && window.document) { return; } window.console = function() { var msgs = Array.prototype.slice.call(arguments, 0); postMessage({type: "log", data: msgs}); }; window.console.error = window.console.warn = window.console.log = window.console.trace = window.console; window.window = window; window.ace = window; window.normalizeModule = function(parentId, moduleName) { if (moduleName.indexOf("!") !== -1) { var chunks = moduleName.split("!"); return window.normalizeModule(parentId, chunks[0]) + "!" + window.normalizeModule(parentId, chunks[1]); } if (moduleName.charAt(0) == ".") { var base = parentId.split("/").slice(0, -1).join("/"); moduleName = (base ? base + "/" : "") + moduleName; while(moduleName.indexOf(".") !== -1 && previous != moduleName) { var previous = moduleName; moduleName = moduleName.replace(/^\.\//, "").replace(/\/\.\//, "/").replace(/[^\/]+\/\.\.\//, ""); } } return moduleName; }; window.require = function(parentId, id) { if (!id) { id = parentId parentId = null; } if (!id.charAt) throw new Error("worker.js require() accepts only (parentId, id) as arguments"); id = window.normalizeModule(parentId, id); var module = window.require.modules[id]; if (module) { if (!module.initialized) { module.initialized = true; module.exports = module.factory().exports; } return module.exports; } var chunks = id.split("/"); if (!window.require.tlns) return console.log("unable to load " + id); chunks[0] = window.require.tlns[chunks[0]] || chunks[0]; var path = chunks.join("/") + ".js"; window.require.id = id; importScripts(path); return window.require(parentId, id); }; window.require.modules = {}; window.require.tlns = {}; window.define = function(id, deps, factory) { if (arguments.length == 2) { factory = deps; if (typeof id != "string") { deps = id; id = window.require.id; } } else if (arguments.length == 1) { factory = id; deps = [] id = window.require.id; } if (!deps.length) deps = ['require', 'exports', 'module'] if (id.indexOf("text!") === 0) return; var req = function(childId) { return window.require(id, childId); }; window.require.modules[id] = { exports: {}, factory: function() { var module = this; var returnExports = factory.apply(this, deps.map(function(dep) { switch(dep) { case 'require': return req case 'exports': return module.exports case 'module': return module default: return req(dep) } })); if (returnExports) module.exports = returnExports; return module; } }; }; window.define.amd = {} window.initBaseUrls = function initBaseUrls(topLevelNamespaces) { require.tlns = topLevelNamespaces; } window.initSender = function initSender() { var EventEmitter = window.require("ace/lib/event_emitter").EventEmitter; var oop = window.require("ace/lib/oop"); var Sender = function() {}; (function() { oop.implement(this, EventEmitter); this.callback = function(data, callbackId) { postMessage({ type: "call", id: callbackId, data: data }); }; this.emit = function(name, data) { postMessage({ type: "event", name: name, data: data }); }; }).call(Sender.prototype); return new Sender(); } window.main = null; window.sender = null; window.onmessage = function(e) { var msg = e.data; if (msg.command) { if (main[msg.command]) main[msg.command].apply(main, msg.args); else throw new Error("Unknown command:" + msg.command); } else if (msg.init) { initBaseUrls(msg.tlns); require("ace/lib/es5-shim"); sender = initSender(); var clazz = require(msg.module)[msg.classname]; main = new clazz(sender); } else if (msg.event && sender) { sender._emit(msg.event, msg.data); } }; })(this);// https://github.com/kriskowal/es5-shim define('ace/lib/es5-shim', ['require', 'exports', 'module' ], function(require, exports, module) { function Empty() {} if (!Function.prototype.bind) { Function.prototype.bind = function bind(that) { // .length is 1 var target = this; if (typeof target != "function") { throw new TypeError("Function.prototype.bind called on incompatible " + target); } var args = slice.call(arguments, 1); // for normal call var bound = function () { if (this instanceof bound) { var result = target.apply( this, args.concat(slice.call(arguments)) ); if (Object(result) === result) { return result; } return this; } else { return target.apply( that, args.concat(slice.call(arguments)) ); } }; if(target.prototype) { Empty.prototype = target.prototype; bound.prototype = new Empty(); Empty.prototype = null; } return bound; }; } var call = Function.prototype.call; var prototypeOfArray = Array.prototype; var prototypeOfObject = Object.prototype; var slice = prototypeOfArray.slice; var _toString = call.bind(prototypeOfObject.toString); var owns = call.bind(prototypeOfObject.hasOwnProperty); var defineGetter; var defineSetter; var lookupGetter; var lookupSetter; var supportsAccessors; if ((supportsAccessors = owns(prototypeOfObject, "__defineGetter__"))) { defineGetter = call.bind(prototypeOfObject.__defineGetter__); defineSetter = call.bind(prototypeOfObject.__defineSetter__); lookupGetter = call.bind(prototypeOfObject.__lookupGetter__); lookupSetter = call.bind(prototypeOfObject.__lookupSetter__); } if ([1,2].splice(0).length != 2) { if(function() { // test IE < 9 to splice bug - see issue #138 function makeArray(l) { var a = new Array(l+2); a[0] = a[1] = 0; return a; } var array = [], lengthBefore; array.splice.apply(array, makeArray(20)); array.splice.apply(array, makeArray(26)); lengthBefore = array.length; //46 array.splice(5, 0, "XXX"); // add one element lengthBefore + 1 == array.length if (lengthBefore + 1 == array.length) { return true;// has right splice implementation without bugs } }()) {//IE 6/7 var array_splice = Array.prototype.splice; Array.prototype.splice = function(start, deleteCount) { if (!arguments.length) { return []; } else { return array_splice.apply(this, [ start === void 0 ? 0 : start, deleteCount === void 0 ? (this.length - start) : deleteCount ].concat(slice.call(arguments, 2))) } }; } else {//IE8 Array.prototype.splice = function(pos, removeCount){ var length = this.length; if (pos > 0) { if (pos > length) pos = length; } else if (pos == void 0) { pos = 0; } else if (pos < 0) { pos = Math.max(length + pos, 0); } if (!(pos+removeCount < length)) removeCount = length - pos; var removed = this.slice(pos, pos+removeCount); var insert = slice.call(arguments, 2); var add = insert.length; if (pos === length) { if (add) { this.push.apply(this, insert); } } else { var remove = Math.min(removeCount, length - pos); var tailOldPos = pos + remove; var tailNewPos = tailOldPos + add - remove; var tailCount = length - tailOldPos; var lengthAfterRemove = length - remove; if (tailNewPos < tailOldPos) { // case A for (var i = 0; i < tailCount; ++i) { this[tailNewPos+i] = this[tailOldPos+i]; } } else if (tailNewPos > tailOldPos) { // case B for (i = tailCount; i--; ) { this[tailNewPos+i] = this[tailOldPos+i]; } } // else, add == remove (nothing to do) if (add && pos === lengthAfterRemove) { this.length = lengthAfterRemove; // truncate array this.push.apply(this, insert); } else { this.length = lengthAfterRemove + add; // reserves space for (i = 0; i < add; ++i) { this[pos+i] = insert[i]; } } } return removed; }; } } if (!Array.isArray) { Array.isArray = function isArray(obj) { return _toString(obj) == "[object Array]"; }; } var boxedString = Object("a"), splitString = boxedString[0] != "a" || !(0 in boxedString); if (!Array.prototype.forEach) { Array.prototype.forEach = function forEach(fun /*, thisp*/) { var object = toObject(this), self = splitString && _toString(this) == "[object String]" ? this.split("") : object, thisp = arguments[1], i = -1, length = self.length >>> 0; if (_toString(fun) != "[object Function]") { throw new TypeError(); // TODO message } while (++i < length) { if (i in self) { fun.call(thisp, self[i], i, object); } } }; } if (!Array.prototype.map) { Array.prototype.map = function map(fun /*, thisp*/) { var object = toObject(this), self = splitString && _toString(this) == "[object String]" ? this.split("") : object, length = self.length >>> 0, result = Array(length), thisp = arguments[1]; if (_toString(fun) != "[object Function]") { throw new TypeError(fun + " is not a function"); } for (var i = 0; i < length; i++) { if (i in self) result[i] = fun.call(thisp, self[i], i, object); } return result; }; } if (!Array.prototype.filter) { Array.prototype.filter = function filter(fun /*, thisp */) { var object = toObject(this), self = splitString && _toString(this) == "[object String]" ? this.split("") : object, length = self.length >>> 0, result = [], value, thisp = arguments[1]; if (_toString(fun) != "[object Function]") { throw new TypeError(fun + " is not a function"); } for (var i = 0; i < length; i++) { if (i in self) { value = self[i]; if (fun.call(thisp, value, i, object)) { result.push(value); } } } return result; }; } if (!Array.prototype.every) { Array.prototype.every = function every(fun /*, thisp */) { var object = toObject(this), self = splitString && _toString(this) == "[object String]" ? this.split("") : object, length = self.length >>> 0, thisp = arguments[1]; if (_toString(fun) != "[object Function]") { throw new TypeError(fun + " is not a function"); } for (var i = 0; i < length; i++) { if (i in self && !fun.call(thisp, self[i], i, object)) { return false; } } return true; }; } if (!Array.prototype.some) { Array.prototype.some = function some(fun /*, thisp */) { var object = toObject(this), self = splitString && _toString(this) == "[object String]" ? this.split("") : object, length = self.length >>> 0, thisp = arguments[1]; if (_toString(fun) != "[object Function]") { throw new TypeError(fun + " is not a function"); } for (var i = 0; i < length; i++) { if (i in self && fun.call(thisp, self[i], i, object)) { return true; } } return false; }; } if (!Array.prototype.reduce) { Array.prototype.reduce = function reduce(fun /*, initial*/) { var object = toObject(this), self = splitString && _toString(this) == "[object String]" ? this.split("") : object, length = self.length >>> 0; if (_toString(fun) != "[object Function]") { throw new TypeError(fun + " is not a function"); } if (!length && arguments.length == 1) { throw new TypeError("reduce of empty array with no initial value"); } var i = 0; var result; if (arguments.length >= 2) { result = arguments[1]; } else { do { if (i in self) { result = self[i++]; break; } if (++i >= length) { throw new TypeError("reduce of empty array with no initial value"); } } while (true); } for (; i < length; i++) { if (i in self) { result = fun.call(void 0, result, self[i], i, object); } } return result; }; } if (!Array.prototype.reduceRight) { Array.prototype.reduceRight = function reduceRight(fun /*, initial*/) { var object = toObject(this), self = splitString && _toString(this) == "[object String]" ? this.split("") : object, length = self.length >>> 0; if (_toString(fun) != "[object Function]") { throw new TypeError(fun + " is not a function"); } if (!length && arguments.length == 1) { throw new TypeError("reduceRight of empty array with no initial value"); } var result, i = length - 1; if (arguments.length >= 2) { result = arguments[1]; } else { do { if (i in self) { result = self[i--]; break; } if (--i < 0) { throw new TypeError("reduceRight of empty array with no initial value"); } } while (true); } do { if (i in this) { result = fun.call(void 0, result, self[i], i, object); } } while (i--); return result; }; } if (!Array.prototype.indexOf || ([0, 1].indexOf(1, 2) != -1)) { Array.prototype.indexOf = function indexOf(sought /*, fromIndex */ ) { var self = splitString && _toString(this) == "[object String]" ? this.split("") : toObject(this), length = self.length >>> 0; if (!length) { return -1; } var i = 0; if (arguments.length > 1) { i = toInteger(arguments[1]); } i = i >= 0 ? i : Math.max(0, length + i); for (; i < length; i++) { if (i in self && self[i] === sought) { return i; } } return -1; }; } if (!Array.prototype.lastIndexOf || ([0, 1].lastIndexOf(0, -3) != -1)) { Array.prototype.lastIndexOf = function lastIndexOf(sought /*, fromIndex */) { var self = splitString && _toString(this) == "[object String]" ? this.split("") : toObject(this), length = self.length >>> 0; if (!length) { return -1; } var i = length - 1; if (arguments.length > 1) { i = Math.min(i, toInteger(arguments[1])); } i = i >= 0 ? i : length - Math.abs(i); for (; i >= 0; i--) { if (i in self && sought === self[i]) { return i; } } return -1; }; } if (!Object.getPrototypeOf) { Object.getPrototypeOf = function getPrototypeOf(object) { return object.__proto__ || ( object.constructor ? object.constructor.prototype : prototypeOfObject ); }; } if (!Object.getOwnPropertyDescriptor) { var ERR_NON_OBJECT = "Object.getOwnPropertyDescriptor called on a " + "non-object: "; Object.getOwnPropertyDescriptor = function getOwnPropertyDescriptor(object, property) { if ((typeof object != "object" && typeof object != "function") || object === null) throw new TypeError(ERR_NON_OBJECT + object); if (!owns(object, property)) return; var descriptor, getter, setter; descriptor = { enumerable: true, configurable: true }; if (supportsAccessors) { var prototype = object.__proto__; object.__proto__ = prototypeOfObject; var getter = lookupGetter(object, property); var setter = lookupSetter(object, property); object.__proto__ = prototype; if (getter || setter) { if (getter) descriptor.get = getter; if (setter) descriptor.set = setter; return descriptor; } } descriptor.value = object[property]; return descriptor; }; } if (!Object.getOwnPropertyNames) { Object.getOwnPropertyNames = function getOwnPropertyNames(object) { return Object.keys(object); }; } if (!Object.create) { var createEmpty; if (Object.prototype.__proto__ === null) { createEmpty = function () { return { "__proto__": null }; }; } else { createEmpty = function () { var empty = {}; for (var i in empty) empty[i] = null; empty.constructor = empty.hasOwnProperty = empty.propertyIsEnumerable = empty.isPrototypeOf = empty.toLocaleString = empty.toString = empty.valueOf = empty.__proto__ = null; return empty; } } Object.create = function create(prototype, properties) { var object; if (prototype === null) { object = createEmpty(); } else { if (typeof prototype != "object") throw new TypeError("typeof prototype["+(typeof prototype)+"] != 'object'"); var Type = function () {}; Type.prototype = prototype; object = new Type(); object.__proto__ = prototype; } if (properties !== void 0) Object.defineProperties(object, properties); return object; }; } function doesDefinePropertyWork(object) { try { Object.defineProperty(object, "sentinel", {}); return "sentinel" in object; } catch (exception) { } } if (Object.defineProperty) { var definePropertyWorksOnObject = doesDefinePropertyWork({}); var definePropertyWorksOnDom = typeof document == "undefined" || doesDefinePropertyWork(document.createElement("div")); if (!definePropertyWorksOnObject || !definePropertyWorksOnDom) { var definePropertyFallback = Object.defineProperty; } } if (!Object.defineProperty || definePropertyFallback) { var ERR_NON_OBJECT_DESCRIPTOR = "Property description must be an object: "; var ERR_NON_OBJECT_TARGET = "Object.defineProperty called on non-object: " var ERR_ACCESSORS_NOT_SUPPORTED = "getters & setters can not be defined " + "on this javascript engine"; Object.defineProperty = function defineProperty(object, property, descriptor) { if ((typeof object != "object" && typeof object != "function") || object === null) throw new TypeError(ERR_NON_OBJECT_TARGET + object); if ((typeof descriptor != "object" && typeof descriptor != "function") || descriptor === null) throw new TypeError(ERR_NON_OBJECT_DESCRIPTOR + descriptor); if (definePropertyFallback) { try { return definePropertyFallback.call(Object, object, property, descriptor); } catch (exception) { } } if (owns(descriptor, "value")) { if (supportsAccessors && (lookupGetter(object, property) || lookupSetter(object, property))) { var prototype = object.__proto__; object.__proto__ = prototypeOfObject; delete object[property]; object[property] = descriptor.value; object.__proto__ = prototype; } else { object[property] = descriptor.value; } } else { if (!supportsAccessors) throw new TypeError(ERR_ACCESSORS_NOT_SUPPORTED); if (owns(descriptor, "get")) defineGetter(object, property, descriptor.get); if (owns(descriptor, "set")) defineSetter(object, property, descriptor.set); } return object; }; } if (!Object.defineProperties) { Object.defineProperties = function defineProperties(object, properties) { for (var property in properties) { if (owns(properties, property)) Object.defineProperty(object, property, properties[property]); } return object; }; } if (!Object.seal) { Object.seal = function seal(object) { return object; }; } if (!Object.freeze) { Object.freeze = function freeze(object) { return object; }; } try { Object.freeze(function () {}); } catch (exception) { Object.freeze = (function freeze(freezeObject) { return function freeze(object) { if (typeof object == "function") { return object; } else { return freezeObject(object); } }; })(Object.freeze); } if (!Object.preventExtensions) { Object.preventExtensions = function preventExtensions(object) { return object; }; } if (!Object.isSealed) { Object.isSealed = function isSealed(object) { return false; }; } if (!Object.isFrozen) { Object.isFrozen = function isFrozen(object) { return false; }; } if (!Object.isExtensible) { Object.isExtensible = function isExtensible(object) { if (Object(object) === object) { throw new TypeError(); // TODO message } var name = ''; while (owns(object, name)) { name += '?'; } object[name] = true; var returnValue = owns(object, name); delete object[name]; return returnValue; }; } if (!Object.keys) { var hasDontEnumBug = true, dontEnums = [ "toString", "toLocaleString", "valueOf", "hasOwnProperty", "isPrototypeOf", "propertyIsEnumerable", "constructor" ], dontEnumsLength = dontEnums.length; for (var key in {"toString": null}) { hasDontEnumBug = false; } Object.keys = function keys(object) { if ( (typeof object != "object" && typeof object != "function") || object === null ) { throw new TypeError("Object.keys called on a non-object"); } var keys = []; for (var name in object) { if (owns(object, name)) { keys.push(name); } } if (hasDontEnumBug) { for (var i = 0, ii = dontEnumsLength; i < ii; i++) { var dontEnum = dontEnums[i]; if (owns(object, dontEnum)) { keys.push(dontEnum); } } } return keys; }; } if (!Date.now) { Date.now = function now() { return new Date().getTime(); }; } var ws = "\x09\x0A\x0B\x0C\x0D\x20\xA0\u1680\u180E\u2000\u2001\u2002\u2003" + "\u2004\u2005\u2006\u2007\u2008\u2009\u200A\u202F\u205F\u3000\u2028" + "\u2029\uFEFF"; if (!String.prototype.trim || ws.trim()) { ws = "[" + ws + "]"; var trimBeginRegexp = new RegExp("^" + ws + ws + "*"), trimEndRegexp = new RegExp(ws + ws + "*$"); String.prototype.trim = function trim() { return String(this).replace(trimBeginRegexp, "").replace(trimEndRegexp, ""); }; } function toInteger(n) { n = +n; if (n !== n) { // isNaN n = 0; } else if (n !== 0 && n !== (1/0) && n !== -(1/0)) { n = (n > 0 || -1) * Math.floor(Math.abs(n)); } return n; } function isPrimitive(input) { var type = typeof input; return ( input === null || type === "undefined" || type === "boolean" || type === "number" || type === "string" ); } function toPrimitive(input) { var val, valueOf, toString; if (isPrimitive(input)) { return input; } valueOf = input.valueOf; if (typeof valueOf === "function") { val = valueOf.call(input); if (isPrimitive(val)) { return val; } } toString = input.toString; if (typeof toString === "function") { val = toString.call(input); if (isPrimitive(val)) { return val; } } throw new TypeError(); } var toObject = function (o) { if (o == null) { // this matches both null and undefined throw new TypeError("can't convert "+o+" to object"); } return Object(o); }; }); define('ace/mode/json_worker', ['require', 'exports', 'module' , 'ace/lib/oop', 'ace/worker/mirror', 'ace/mode/json/json_parse'], function(require, exports, module) { var oop = require("../lib/oop"); var Mirror = require("../worker/mirror").Mirror; var parse = require("./json/json_parse"); var JsonWorker = exports.JsonWorker = function(sender) { Mirror.call(this, sender); this.setTimeout(200); }; oop.inherits(JsonWorker, Mirror); (function() { this.onUpdate = function() { var value = this.doc.getValue(); try { var result = parse(value); } catch (e) { var pos = this.doc.indexToPosition(e.at-1); this.sender.emit("error", { row: pos.row, column: pos.column, text: e.message, type: "error" }); return; } this.sender.emit("ok"); }; }).call(JsonWorker.prototype); }); define('ace/lib/oop', ['require', 'exports', 'module' ], function(require, exports, module) { exports.inherits = (function() { var tempCtor = function() {}; return function(ctor, superCtor) { tempCtor.prototype = superCtor.prototype; ctor.super_ = superCtor.prototype; ctor.prototype = new tempCtor(); ctor.prototype.constructor = ctor; }; }()); exports.mixin = function(obj, mixin) { for (var key in mixin) { obj[key] = mixin[key]; } return obj; }; exports.implement = function(proto, mixin) { exports.mixin(proto, mixin); }; }); define('ace/worker/mirror', ['require', 'exports', 'module' , 'ace/document', 'ace/lib/lang'], function(require, exports, module) { var Document = require("../document").Document; var lang = require("../lib/lang"); var Mirror = exports.Mirror = function(sender) { this.sender = sender; var doc = this.doc = new Document(""); var deferredUpdate = this.deferredUpdate = lang.delayedCall(this.onUpdate.bind(this)); var _self = this; sender.on("change", function(e) { doc.applyDeltas(e.data); deferredUpdate.schedule(_self.$timeout); }); }; (function() { this.$timeout = 500; this.setTimeout = function(timeout) { this.$timeout = timeout; }; this.setValue = function(value) { this.doc.setValue(value); this.deferredUpdate.schedule(this.$timeout); }; this.getValue = function(callbackId) { this.sender.callback(this.doc.getValue(), callbackId); }; this.onUpdate = function() { }; }).call(Mirror.prototype); }); define('ace/document', ['require', 'exports', 'module' , 'ace/lib/oop', 'ace/lib/event_emitter', 'ace/range', 'ace/anchor'], function(require, exports, module) { var oop = require("./lib/oop"); var EventEmitter = require("./lib/event_emitter").EventEmitter; var Range = require("./range").Range; var Anchor = require("./anchor").Anchor; var Document = function(text) { this.$lines = []; if (text.length == 0) { this.$lines = [""]; } else if (Array.isArray(text)) { this._insertLines(0, text); } else { this.insert({row: 0, column:0}, text); } }; (function() { oop.implement(this, EventEmitter); this.setValue = function(text) { var len = this.getLength(); this.remove(new Range(0, 0, len, this.getLine(len-1).length)); this.insert({row: 0, column:0}, text); }; this.getValue = function() { return this.getAllLines().join(this.getNewLineCharacter()); }; this.createAnchor = function(row, column) { return new Anchor(this, row, column); }; if ("aaa".split(/a/).length == 0) this.$split = function(text) { return text.replace(/\r\n|\r/g, "\n").split("\n"); } else this.$split = function(text) { return text.split(/\r\n|\r|\n/); }; this.$detectNewLine = function(text) { var match = text.match(/^.*?(\r\n|\r|\n)/m); this.$autoNewLine = match ? match[1] : "\n"; }; this.getNewLineCharacter = function() { switch (this.$newLineMode) { case "windows": return "\r\n"; case "unix": return "\n"; default: return this.$autoNewLine; } }; this.$autoNewLine = "\n"; this.$newLineMode = "auto"; this.setNewLineMode = function(newLineMode) { if (this.$newLineMode === newLineMode) return; this.$newLineMode = newLineMode; }; this.getNewLineMode = function() { return this.$newLineMode; }; this.isNewLine = function(text) { return (text == "\r\n" || text == "\r" || text == "\n"); }; this.getLine = function(row) { return this.$lines[row] || ""; }; this.getLines = function(firstRow, lastRow) { return this.$lines.slice(firstRow, lastRow + 1); }; this.getAllLines = function() { return this.getLines(0, this.getLength()); }; this.getLength = function() { return this.$lines.length; }; this.getTextRange = function(range) { if (range.start.row == range.end.row) { return this.getLine(range.start.row) .substring(range.start.column, range.end.column); } var lines = this.getLines(range.start.row, range.end.row); lines[0] = (lines[0] || "").substring(range.start.column); var l = lines.length - 1; if (range.end.row - range.start.row == l) lines[l] = lines[l].substring(0, range.end.column); return lines.join(this.getNewLineCharacter()); }; this.$clipPosition = function(position) { var length = this.getLength(); if (position.row >= length) { position.row = Math.max(0, length - 1); position.column = this.getLine(length-1).length; } else if (position.row < 0) position.row = 0; return position; }; this.insert = function(position, text) { if (!text || text.length === 0) return position; position = this.$clipPosition(position); if (this.getLength() <= 1) this.$detectNewLine(text); var lines = this.$split(text); var firstLine = lines.splice(0, 1)[0]; var lastLine = lines.length == 0 ? null : lines.splice(lines.length - 1, 1)[0]; position = this.insertInLine(position, firstLine); if (lastLine !== null) { position = this.insertNewLine(position); // terminate first line position = this._insertLines(position.row, lines); position = this.insertInLine(position, lastLine || ""); } return position; }; this.insertLines = function(row, lines) { if (row >= this.getLength()) return this.insert({row: row, column: 0}, "\n" + lines.join("\n")); return this._insertLines(Math.max(row, 0), lines); }; this._insertLines = function(row, lines) { if (lines.length == 0) return {row: row, column: 0}; if (lines.length > 0xFFFF) { var end = this._insertLines(row, lines.slice(0xFFFF)); lines = lines.slice(0, 0xFFFF); } var args = [row, 0]; args.push.apply(args, lines); this.$lines.splice.apply(this.$lines, args); var range = new Range(row, 0, row + lines.length, 0); var delta = { action: "insertLines", range: range, lines: lines }; this._emit("change", { data: delta }); return end || range.end; }; this.insertNewLine = function(position) { position = this.$clipPosition(position); var line = this.$lines[position.row] || ""; this.$lines[position.row] = line.substring(0, position.column); this.$lines.splice(position.row + 1, 0, line.substring(position.column, line.length)); var end = { row : position.row + 1, column : 0 }; var delta = { action: "insertText", range: Range.fromPoints(position, end), text: this.getNewLineCharacter() }; this._emit("change", { data: delta }); return end; }; this.insertInLine = function(position, text) { if (text.length == 0) return position; var line = this.$lines[position.row] || ""; this.$lines[position.row] = line.substring(0, position.column) + text + line.substring(position.column); var end = { row : position.row, column : position.column + text.length }; var delta = { action: "insertText", range: Range.fromPoints(position, end), text: text }; this._emit("change", { data: delta }); return end; }; this.remove = function(range) { if (!range instanceof Range) range = Range.fromPoints(range.start, range.end); range.start = this.$clipPosition(range.start); range.end = this.$clipPosition(range.end); if (range.isEmpty()) return range.start; var firstRow = range.start.row; var lastRow = range.end.row; if (range.isMultiLine()) { var firstFullRow = range.start.column == 0 ? firstRow : firstRow + 1; var lastFullRow = lastRow - 1; if (range.end.column > 0) this.removeInLine(lastRow, 0, range.end.column); if (lastFullRow >= firstFullRow) this._removeLines(firstFullRow, lastFullRow); if (firstFullRow != firstRow) { this.removeInLine(firstRow, range.start.column, this.getLine(firstRow).length); this.removeNewLine(range.start.row); } } else { this.removeInLine(firstRow, range.start.column, range.end.column); } return range.start; }; this.removeInLine = function(row, startColumn, endColumn) { if (startColumn == endColumn) return; var range = new Range(row, startColumn, row, endColumn); var line = this.getLine(row); var removed = line.substring(startColumn, endColumn); var newLine = line.substring(0, startColumn) + line.substring(endColumn, line.length); this.$lines.splice(row, 1, newLine); var delta = { action: "removeText", range: range, text: removed }; this._emit("change", { data: delta }); return range.start; }; this.removeLines = function(firstRow, lastRow) { if (firstRow < 0 || lastRow >= this.getLength()) return this.remove(new Range(firstRow, 0, lastRow + 1, 0)); return this._removeLines(firstRow, lastRow); }; this._removeLines = function(firstRow, lastRow) { var range = new Range(firstRow, 0, lastRow + 1, 0); var removed = this.$lines.splice(firstRow, lastRow - firstRow + 1); var delta = { action: "removeLines", range: range, nl: this.getNewLineCharacter(), lines: removed }; this._emit("change", { data: delta }); return removed; }; this.removeNewLine = function(row) { var firstLine = this.getLine(row); var secondLine = this.getLine(row+1); var range = new Range(row, firstLine.length, row+1, 0); var line = firstLine + secondLine; this.$lines.splice(row, 2, line); var delta = { action: "removeText", range: range, text: this.getNewLineCharacter() }; this._emit("change", { data: delta }); }; this.replace = function(range, text) { if (!range instanceof Range) range = Range.fromPoints(range.start, range.end); if (text.length == 0 && range.isEmpty()) return range.start; if (text == this.getTextRange(range)) return range.end; this.remove(range); if (text) { var end = this.insert(range.start, text); } else { end = range.start; } return end; }; this.applyDeltas = function(deltas) { for (var i=0; i=0; i--) { var delta = deltas[i]; var range = Range.fromPoints(delta.range.start, delta.range.end); if (delta.action == "insertLines") this._removeLines(range.start.row, range.end.row - 1); else if (delta.action == "insertText") this.remove(range); else if (delta.action == "removeLines") this._insertLines(range.start.row, delta.lines); else if (delta.action == "removeText") this.insert(range.start, delta.text); } }; this.indexToPosition = function(index, startRow) { var lines = this.$lines || this.getAllLines(); var newlineLength = this.getNewLineCharacter().length; for (var i = startRow || 0, l = lines.length; i < l; i++) { index -= lines[i].length + newlineLength; if (index < 0) return {row: i, column: index + lines[i].length + newlineLength}; } return {row: l-1, column: lines[l-1].length}; }; this.positionToIndex = function(pos, startRow) { var lines = this.$lines || this.getAllLines(); var newlineLength = this.getNewLineCharacter().length; var index = 0; var row = Math.min(pos.row, lines.length); for (var i = startRow || 0; i < row; ++i) index += lines[i].length + newlineLength; return index + pos.column; }; }).call(Document.prototype); exports.Document = Document; }); define('ace/lib/event_emitter', ['require', 'exports', 'module' ], function(require, exports, module) { var EventEmitter = {}; var stopPropagation = function() { this.propagationStopped = true; }; var preventDefault = function() { this.defaultPrevented = true; }; EventEmitter._emit = EventEmitter._dispatchEvent = function(eventName, e) { this._eventRegistry || (this._eventRegistry = {}); this._defaultHandlers || (this._defaultHandlers = {}); var listeners = this._eventRegistry[eventName] || []; var defaultHandler = this._defaultHandlers[eventName]; if (!listeners.length && !defaultHandler) return; if (typeof e != "object" || !e) e = {}; if (!e.type) e.type = eventName; if (!e.stopPropagation) e.stopPropagation = stopPropagation; if (!e.preventDefault) e.preventDefault = preventDefault; listeners = listeners.slice(); for (var i=0; i [" + this.end.row + "/" + this.end.column + "]"); }; this.contains = function(row, column) { return this.compare(row, column) == 0; }; this.compareRange = function(range) { var cmp, end = range.end, start = range.start; cmp = this.compare(end.row, end.column); if (cmp == 1) { cmp = this.compare(start.row, start.column); if (cmp == 1) { return 2; } else if (cmp == 0) { return 1; } else { return 0; } } else if (cmp == -1) { return -2; } else { cmp = this.compare(start.row, start.column); if (cmp == -1) { return -1; } else if (cmp == 1) { return 42; } else { return 0; } } }; this.comparePoint = function(p) { return this.compare(p.row, p.column); }; this.containsRange = function(range) { return this.comparePoint(range.start) == 0 && this.comparePoint(range.end) == 0; }; this.intersects = function(range) { var cmp = this.compareRange(range); return (cmp == -1 || cmp == 0 || cmp == 1); }; this.isEnd = function(row, column) { return this.end.row == row && this.end.column == column; }; this.isStart = function(row, column) { return this.start.row == row && this.start.column == column; }; this.setStart = function(row, column) { if (typeof row == "object") { this.start.column = row.column; this.start.row = row.row; } else { this.start.row = row; this.start.column = column; } }; this.setEnd = function(row, column) { if (typeof row == "object") { this.end.column = row.column; this.end.row = row.row; } else { this.end.row = row; this.end.column = column; } }; this.inside = function(row, column) { if (this.compare(row, column) == 0) { if (this.isEnd(row, column) || this.isStart(row, column)) { return false; } else { return true; } } return false; }; this.insideStart = function(row, column) { if (this.compare(row, column) == 0) { if (this.isEnd(row, column)) { return false; } else { return true; } } return false; }; this.insideEnd = function(row, column) { if (this.compare(row, column) == 0) { if (this.isStart(row, column)) { return false; } else { return true; } } return false; }; this.compare = function(row, column) { if (!this.isMultiLine()) { if (row === this.start.row) { return column < this.start.column ? -1 : (column > this.end.column ? 1 : 0); }; } if (row < this.start.row) return -1; if (row > this.end.row) return 1; if (this.start.row === row) return column >= this.start.column ? 0 : -1; if (this.end.row === row) return column <= this.end.column ? 0 : 1; return 0; }; this.compareStart = function(row, column) { if (this.start.row == row && this.start.column == column) { return -1; } else { return this.compare(row, column); } }; this.compareEnd = function(row, column) { if (this.end.row == row && this.end.column == column) { return 1; } else { return this.compare(row, column); } }; this.compareInside = function(row, column) { if (this.end.row == row && this.end.column == column) { return 1; } else if (this.start.row == row && this.start.column == column) { return -1; } else { return this.compare(row, column); } }; this.clipRows = function(firstRow, lastRow) { if (this.end.row > lastRow) var end = {row: lastRow + 1, column: 0}; else if (this.end.row < firstRow) var end = {row: firstRow, column: 0}; if (this.start.row > lastRow) var start = {row: lastRow + 1, column: 0}; else if (this.start.row < firstRow) var start = {row: firstRow, column: 0}; return Range.fromPoints(start || this.start, end || this.end); }; this.extend = function(row, column) { var cmp = this.compare(row, column); if (cmp == 0) return this; else if (cmp == -1) var start = {row: row, column: column}; else var end = {row: row, column: column}; return Range.fromPoints(start || this.start, end || this.end); }; this.isEmpty = function() { return (this.start.row === this.end.row && this.start.column === this.end.column); }; this.isMultiLine = function() { return (this.start.row !== this.end.row); }; this.clone = function() { return Range.fromPoints(this.start, this.end); }; this.collapseRows = function() { if (this.end.column == 0) return new Range(this.start.row, 0, Math.max(this.start.row, this.end.row-1), 0) else return new Range(this.start.row, 0, this.end.row, 0) }; this.toScreenRange = function(session) { var screenPosStart = session.documentToScreenPosition(this.start); var screenPosEnd = session.documentToScreenPosition(this.end); return new Range( screenPosStart.row, screenPosStart.column, screenPosEnd.row, screenPosEnd.column ); }; this.moveBy = function(row, column) { this.start.row += row; this.start.column += column; this.end.row += row; this.end.column += column; }; }).call(Range.prototype); Range.fromPoints = function(start, end) { return new Range(start.row, start.column, end.row, end.column); }; Range.comparePoints = comparePoints; Range.comparePoints = function(p1, p2) { return p1.row - p2.row || p1.column - p2.column; }; exports.Range = Range; }); define('ace/anchor', ['require', 'exports', 'module' , 'ace/lib/oop', 'ace/lib/event_emitter'], function(require, exports, module) { var oop = require("./lib/oop"); var EventEmitter = require("./lib/event_emitter").EventEmitter; var Anchor = exports.Anchor = function(doc, row, column) { this.$onChange = this.onChange.bind(this); this.attach(doc); if (typeof column == "undefined") this.setPosition(row.row, row.column); else this.setPosition(row, column); }; (function() { oop.implement(this, EventEmitter); this.getPosition = function() { return this.$clipPositionToDocument(this.row, this.column); }; this.getDocument = function() { return this.document; }; this.$insertRight = false; this.onChange = function(e) { var delta = e.data; var range = delta.range; if (range.start.row == range.end.row && range.start.row != this.row) return; if (range.start.row > this.row) return; if (range.start.row == this.row && range.start.column > this.column) return; var row = this.row; var column = this.column; var start = range.start; var end = range.end; if (delta.action === "insertText") { if (start.row === row && start.column <= column) { if (start.column === column && this.$insertRight) { } else if (start.row === end.row) { column += end.column - start.column; } else { column -= start.column; row += end.row - start.row; } } else if (start.row !== end.row && start.row < row) { row += end.row - start.row; } } else if (delta.action === "insertLines") { if (start.row <= row) { row += end.row - start.row; } } else if (delta.action === "removeText") { if (start.row === row && start.column < column) { if (end.column >= column) column = start.column; else column = Math.max(0, column - (end.column - start.column)); } else if (start.row !== end.row && start.row < row) { if (end.row === row) column = Math.max(0, column - end.column) + start.column; row -= (end.row - start.row); } else if (end.row === row) { row -= end.row - start.row; column = Math.max(0, column - end.column) + start.column; } } else if (delta.action == "removeLines") { if (start.row <= row) { if (end.row <= row) row -= end.row - start.row; else { row = start.row; column = 0; } } } this.setPosition(row, column, true); }; this.setPosition = function(row, column, noClip) { var pos; if (noClip) { pos = { row: row, column: column }; } else { pos = this.$clipPositionToDocument(row, column); } if (this.row == pos.row && this.column == pos.column) return; var old = { row: this.row, column: this.column }; this.row = pos.row; this.column = pos.column; this._emit("change", { old: old, value: pos }); }; this.detach = function() { this.document.removeEventListener("change", this.$onChange); }; this.attach = function(doc) { this.document = doc || this.document; this.document.on("change", this.$onChange); }; this.$clipPositionToDocument = function(row, column) { var pos = {}; if (row >= this.document.getLength()) { pos.row = Math.max(0, this.document.getLength() - 1); pos.column = this.document.getLine(pos.row).length; } else if (row < 0) { pos.row = 0; pos.column = 0; } else { pos.row = row; pos.column = Math.min(this.document.getLine(pos.row).length, Math.max(0, column)); } if (column < 0) pos.column = 0; return pos; }; }).call(Anchor.prototype); }); define('ace/lib/lang', ['require', 'exports', 'module' ], function(require, exports, module) { exports.stringReverse = function(string) { return string.split("").reverse().join(""); }; exports.stringRepeat = function (string, count) { var result = ''; while (count > 0) { if (count & 1) result += string; if (count >>= 1) string += string; } return result; }; var trimBeginRegexp = /^\s\s*/; var trimEndRegexp = /\s\s*$/; exports.stringTrimLeft = function (string) { return string.replace(trimBeginRegexp, ''); }; exports.stringTrimRight = function (string) { return string.replace(trimEndRegexp, ''); }; exports.copyObject = function(obj) { var copy = {}; for (var key in obj) { copy[key] = obj[key]; } return copy; }; exports.copyArray = function(array){ var copy = []; for (var i=0, l=array.length; i= '0' && ch <= '9') { string += ch; next(); } if (ch === '.') { string += '.'; while (next() && ch >= '0' && ch <= '9') { string += ch; } } if (ch === 'e' || ch === 'E') { string += ch; next(); if (ch === '-' || ch === '+') { string += ch; next(); } while (ch >= '0' && ch <= '9') { string += ch; next(); } } number = +string; if (isNaN(number)) { error("Bad number"); } else { return number; } }, string = function () { var hex, i, string = '', uffff; if (ch === '"') { while (next()) { if (ch === '"') { next(); return string; } else if (ch === '\\') { next(); if (ch === 'u') { uffff = 0; for (i = 0; i < 4; i += 1) { hex = parseInt(next(), 16); if (!isFinite(hex)) { break; } uffff = uffff * 16 + hex; } string += String.fromCharCode(uffff); } else if (typeof escapee[ch] === 'string') { string += escapee[ch]; } else { break; } } else { string += ch; } } } error("Bad string"); }, white = function () { while (ch && ch <= ' ') { next(); } }, word = function () { switch (ch) { case 't': next('t'); next('r'); next('u'); next('e'); return true; case 'f': next('f'); next('a'); next('l'); next('s'); next('e'); return false; case 'n': next('n'); next('u'); next('l'); next('l'); return null; } error("Unexpected '" + ch + "'"); }, value, // Place holder for the value function. array = function () { var array = []; if (ch === '[') { next('['); white(); if (ch === ']') { next(']'); return array; // empty array } while (ch) { array.push(value()); white(); if (ch === ']') { next(']'); return array; } next(','); white(); } } error("Bad array"); }, object = function () { var key, object = {}; if (ch === '{') { next('{'); white(); if (ch === '}') { next('}'); return object; // empty object } while (ch) { key = string(); white(); next(':'); if (Object.hasOwnProperty.call(object, key)) { error('Duplicate key "' + key + '"'); } object[key] = value(); white(); if (ch === '}') { next('}'); return object; } next(','); white(); } } error("Bad object"); }; value = function () { white(); switch (ch) { case '{': return object(); case '[': return array(); case '"': return string(); case '-': return number(); default: return ch >= '0' && ch <= '9' ? number() : word(); } }; return function (source, reviver) { var result; text = source; at = 0; ch = ' '; result = value(); white(); if (ch) { error("Syntax error"); } return typeof reviver === 'function' ? function walk(holder, key) { var k, v, value = holder[key]; if (value && typeof value === 'object') { for (k in value) { if (Object.hasOwnProperty.call(value, k)) { v = walk(value, k); if (v !== undefined) { value[k] = v; } else { delete value[k]; } } } } return reviver.call(holder, key, value); }({'': result}, '') : result; }; }); apache-couchdb-1.6.0/src/fauxton/assets/js/libs/ace/ext-statusbar.js0000644000175000001440000000274412332105522025343 0ustar00djcusers00000000000000define('ace/ext/statusbar', ['require', 'exports', 'module' , 'ace/lib/dom', 'ace/lib/lang'], function(require, exports, module) { var dom = require("ace/lib/dom"); var lang = require("ace/lib/lang"); var StatusBar = function(editor, parentNode) { this.element = dom.createElement("div"); this.element.className = "ace_status-indicator"; this.element.style.cssText = "display: inline-block;"; parentNode.appendChild(this.element); var statusUpdate = lang.delayedCall(function(){ this.updateStatus(editor) }.bind(this)); editor.on("changeStatus", function() { statusUpdate.schedule(100); }); editor.on("changeSelection", function() { statusUpdate.schedule(100); }); }; (function(){ this.updateStatus = function(editor) { var status = []; function add(str, separator) { str && status.push(str, separator || "|"); } if (editor.$vimModeHandler) add(editor.$vimModeHandler.getStatusText()); else if (editor.commands.recording) add("REC"); var c = editor.selection.lead; add(c.row + ":" + c.column, " "); if (!editor.selection.isEmpty()) { var r = editor.getSelectionRange(); add("(" + (r.end.row - r.start.row) + ":" +(r.end.column - r.start.column) + ")"); } status.pop(); this.element.textContent = status.join(""); }; }).call(StatusBar.prototype); exports.StatusBar = StatusBar; });apache-couchdb-1.6.0/src/fauxton/assets/js/libs/ace/ext-options.js0000644000175000001440000001611712332105522025025 0ustar00djcusers00000000000000define('ace/ext/options', ['require', 'exports', 'module' ], function(require, exports, module) { var modesByName = modelist.modesByName; var options = [ ["Document", function(name) { doclist.loadDoc(name, function(session) { if (!session) return; session = env.split.setSession(session); updateUIEditorOptions(); env.editor.focus(); }); }, doclist.all], ["Mode", function(value) { env.editor.session.setMode(modesByName[value].mode || modesByName.text.mode); env.editor.session.modeName = value; }, function(value) { return env.editor.session.modeName || "text" }, modelist.modes], ["Split", function(value) { var sp = env.split; if (value == "none") { if (sp.getSplits() == 2) { env.secondSession = sp.getEditor(1).session; } sp.setSplits(1); } else { var newEditor = (sp.getSplits() == 1); if (value == "below") { sp.setOrientation(sp.BELOW); } else { sp.setOrientation(sp.BESIDE); } sp.setSplits(2); if (newEditor) { var session = env.secondSession || sp.getEditor(0).session; var newSession = sp.setSession(session, 1); newSession.name = session.name; } } }, ["None", "Beside", "Below"]], ["Theme", function(value) { if (!value) return; env.editor.setTheme("ace/theme/" + value); themeEl.selectedValue = value; }, function() { return env.editor.getTheme(); }, { "Bright": { chrome: "Chrome", clouds: "Clouds", crimson_editor: "Crimson Editor", dawn: "Dawn", dreamweaver: "Dreamweaver", eclipse: "Eclipse", github: "GitHub", solarized_light: "Solarized Light", textmate: "TextMate", tomorrow: "Tomorrow", xcode: "XCode" }, "Dark": { ambiance: "Ambiance", chaos: "Chaos", clouds_midnight: "Clouds Midnight", cobalt: "Cobalt", idle_fingers: "idleFingers", kr_theme: "krTheme", merbivore: "Merbivore", merbivore_soft: "Merbivore Soft", mono_industrial: "Mono Industrial", monokai: "Monokai", pastel_on_dark: "Pastel on dark", solarized_dark: "Solarized Dark", twilight: "Twilight", tomorrow_night: "Tomorrow Night", tomorrow_night_blue: "Tomorrow Night Blue", tomorrow_night_bright: "Tomorrow Night Bright", tomorrow_night_eighties: "Tomorrow Night 80s", vibrant_ink: "Vibrant Ink", } }], ["Code Folding", function(value) { env.editor.getSession().setFoldStyle(value); env.editor.setShowFoldWidgets(value !== "manual"); }, ["manual", "mark begin", "mark begin and end"]], ["Soft Wrap", function(value) { value = value.toLowerCase() var session = env.editor.getSession(); var renderer = env.editor.renderer; session.setUseWrapMode(value == "off"); var col = parseInt(value) || null; renderer.setPrintMarginColumn(col || 80); session.setWrapLimitRange(col, col); }, ["Off", "40 Chars", "80 Chars", "Free"]], ["Key Binding", function(value) { env.editor.setKeyboardHandler(keybindings[value]); }, ["Ace", "Vim", "Emacs", "Custom"]], ["Font Size", function(value) { env.split.setFontSize(value + "px"); }, [10, 11, 12, 14, 16, 20, 24]], ["Full Line Selection", function(checked) { env.editor.setSelectionStyle(checked ? "line" : "text"); }], ["Highlight Active Line", function(checked) { env.editor.setHighlightActiveLine(checked); }], ["Show Invisibles", function(checked) { env.editor.setShowInvisibles(checked); }], ["Show Gutter", function(checked) { env.editor.renderer.setShowGutter(checked); }], ["Show Indent Guides", function(checked) { env.editor.renderer.setDisplayIndentGuides(checked); }], ["Show Print Margin", function(checked) { env.editor.renderer.setShowPrintMargin(checked); }], ["Persistent HScroll", function(checked) { env.editor.renderer.setHScrollBarAlwaysVisible(checked); }], ["Animate Scrolling", function(checked) { env.editor.setAnimatedScroll(checked); }], ["Use Soft Tab", function(checked) { env.editor.getSession().setUseSoftTabs(checked); }], ["Highlight Selected Word", function(checked) { env.editor.setHighlightSelectedWord(checked); }], ["Enable Behaviours", function(checked) { env.editor.setBehavioursEnabled(checked); }], ["Fade Fold Widgets", function(checked) { env.editor.setFadeFoldWidgets(checked); }], ["Show Token info", function(checked) { env.editor.setFadeFoldWidgets(checked); }] ] var createOptionsPanel = function(options) { var html = [] var container = document.createElement("div"); container.style.cssText = "position: absolute; overflow: hidden"; var inner = document.createElement("div"); inner.style.cssText = "width: 120%;height:100%;overflow: scroll"; container.appendChild(inner); html.push(""); options.forEach(function(o) { }); html.push( '', '', '' ) html.push("
    ', '', '', '', '
    "); return container; } function bindCheckbox(id, callback) { var el = document.getElementById(id); if (localStorage && localStorage.getItem(id)) el.checked = localStorage.getItem(id) == "1"; var onCheck = function() { callback(!!el.checked); saveOption(el); }; el.onclick = onCheck; onCheck(); } function bindDropdown(id, callback) { var el = document.getElementById(id); if (localStorage && localStorage.getItem(id)) el.value = localStorage.getItem(id); var onChange = function() { callback(el.value); saveOption(el); }; el.onchange = onChange; onChange(); } function fillOptgroup(list, el) { list.forEach(function(item) { var option = document.createElement("option"); option.setAttribute("value", item.name); option.innerHTML = item.desc; el.appendChild(option); }); } function fillDropdown(list, el) { if (Array.isArray(list)) { fillOptgroup(list, el); return; } for(var i in list) { var group = document.createElement("optgroup"); group.setAttribute("label", i); fillOptgroup(list[i], group); el.appendChild(group); } } function createOptionControl(opt) { if (opt.values) { var el = dom.createElement("select"); el.setAttribute("size", opt.visibleSize || 1); fillDropdown(opt.values, el) } else { var el = dom.createElement("checkbox"); } el.setAttribute("name", "opt_" + opt.name) return el; } function createOptionCell(opt) { if (opt.values) { var el = dom.createElement("select"); el.setAttribute("size", opt.visibleSize || 1); fillDropdown(opt.values, el) } else { var el = dom.createElement("checkbox"); } el.setAttribute("name", "opt_" + opt.name) return el; } createOptionsPanel(options) }); apache-couchdb-1.6.0/src/fauxton/assets/js/libs/ace/ext-static_highlight.js0000644000175000001440000001324212332105522026644 0ustar00djcusers00000000000000/* ***** BEGIN LICENSE BLOCK ***** * Distributed under the BSD license: * * Copyright (c) 2010, Ajax.org B.V. * All rights reserved. * * 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 Ajax.org B.V. nor the * names of its contributors may be used to endorse or promote products * derived from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE * DISCLAIMED. IN NO EVENT SHALL AJAX.ORG B.V. 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. * * ***** END LICENSE BLOCK ***** */ define('ace/ext/static_highlight', ['require', 'exports', 'module' , 'ace/edit_session', 'ace/layer/text', 'ace/config', 'ace/lib/dom'], function(require, exports, module) { var EditSession = require("../edit_session").EditSession; var TextLayer = require("../layer/text").Text; var baseStyles = ".ace_static_highlight {\ font-family: 'Monaco', 'Menlo', 'Ubuntu Mono', 'Consolas', 'source-code-pro', 'Droid Sans Mono', monospace;\ font-size: 12px;\ }\ .ace_static_highlight .ace_gutter {\ width: 25px !important;\ display: block;\ float: left;\ text-align: right;\ padding: 0 3px 0 0;\ margin-right: 3px;\ position: static !important;\ }\ .ace_static_highlight .ace_line { clear: both; }\ .ace_static_highlight .ace_gutter-cell {\ -moz-user-select: -moz-none;\ -khtml-user-select: none;\ -webkit-user-select: none;\ user-select: none;\ }"; var config = require("../config"); var dom = require("../lib/dom"); exports.render = function(input, mode, theme, lineStart, disableGutter, callback) { var waiting = 0; var modeCache = EditSession.prototype.$modes; if (typeof theme == "string") { waiting++; config.loadModule(['theme', theme], function(m) { theme = m; --waiting || done(); }); } if (typeof mode == "string") { waiting++; config.loadModule(['mode', mode], function(m) { if (!modeCache[mode]) modeCache[mode] = new m.Mode(); mode = modeCache[mode]; --waiting || done(); }); } function done() { var result = exports.renderSync(input, mode, theme, lineStart, disableGutter); return callback ? callback(result) : result; } return waiting || done(); }; exports.renderSync = function(input, mode, theme, lineStart, disableGutter) { lineStart = parseInt(lineStart || 1, 10); var session = new EditSession(""); session.setUseWorker(false); session.setMode(mode); var textLayer = new TextLayer(document.createElement("div")); textLayer.setSession(session); textLayer.config = { characterWidth: 10, lineHeight: 20 }; session.setValue(input); var stringBuilder = []; var length = session.getLength(); for(var ix = 0; ix < length; ix++) { stringBuilder.push("
    "); if (!disableGutter) stringBuilder.push("" + (ix + lineStart) + ""); textLayer.$renderLine(stringBuilder, ix, true, false); stringBuilder.push("
    "); } var html = "
    " + "
    " + stringBuilder.join("") + "
    " + "
    "; textLayer.destroy(); return { css: baseStyles + theme.cssText, html: html }; }; exports.highlight = function(el, opts, callback) { var m = el.className.match(/lang-(\w+)/); var mode = opts.mode || m && ("ace/mode/" + m[1]); if (!mode) return false; var theme = opts.theme || "ace/theme/textmate"; var data = ""; var nodes = []; if (el.firstElementChild) { var textLen = 0; for (var i = 0; i < el.childNodes.length; i++) { var ch = el.childNodes[i]; if (ch.nodeType == 3) { textLen += ch.data.length; data += ch.data; } else { nodes.push(textLen, ch); } } } else { data = dom.getInnerText(el); } exports.render(data, mode, theme, 1, true, function (highlighted) { dom.importCssString(highlighted.css, "ace_highlight"); el.innerHTML = highlighted.html; var container = el.firstChild.firstChild for (var i = 0; i < nodes.length; i += 2) { var pos = highlighted.session.doc.indexToPosition(nodes[i]) var node = nodes[i + 1]; var lineEl = container.children[pos.row]; lineEl && lineEl.appendChild(nodes[i+1]); } callback && callback(); }); }; }); apache-couchdb-1.6.0/src/fauxton/assets/js/libs/ace/worker-javascript.js0000644000175000001440000100112712332105522026205 0ustar00djcusers00000000000000"no use strict"; ;(function(window) { if (typeof window.window != "undefined" && window.document) { return; } window.console = function() { var msgs = Array.prototype.slice.call(arguments, 0); postMessage({type: "log", data: msgs}); }; window.console.error = window.console.warn = window.console.log = window.console.trace = window.console; window.window = window; window.ace = window; window.normalizeModule = function(parentId, moduleName) { if (moduleName.indexOf("!") !== -1) { var chunks = moduleName.split("!"); return window.normalizeModule(parentId, chunks[0]) + "!" + window.normalizeModule(parentId, chunks[1]); } if (moduleName.charAt(0) == ".") { var base = parentId.split("/").slice(0, -1).join("/"); moduleName = (base ? base + "/" : "") + moduleName; while(moduleName.indexOf(".") !== -1 && previous != moduleName) { var previous = moduleName; moduleName = moduleName.replace(/^\.\//, "").replace(/\/\.\//, "/").replace(/[^\/]+\/\.\.\//, ""); } } return moduleName; }; window.require = function(parentId, id) { if (!id) { id = parentId parentId = null; } if (!id.charAt) throw new Error("worker.js require() accepts only (parentId, id) as arguments"); id = window.normalizeModule(parentId, id); var module = window.require.modules[id]; if (module) { if (!module.initialized) { module.initialized = true; module.exports = module.factory().exports; } return module.exports; } var chunks = id.split("/"); if (!window.require.tlns) return console.log("unable to load " + id); chunks[0] = window.require.tlns[chunks[0]] || chunks[0]; var path = chunks.join("/") + ".js"; window.require.id = id; importScripts(path); return window.require(parentId, id); }; window.require.modules = {}; window.require.tlns = {}; window.define = function(id, deps, factory) { if (arguments.length == 2) { factory = deps; if (typeof id != "string") { deps = id; id = window.require.id; } } else if (arguments.length == 1) { factory = id; deps = [] id = window.require.id; } if (!deps.length) deps = ['require', 'exports', 'module'] if (id.indexOf("text!") === 0) return; var req = function(childId) { return window.require(id, childId); }; window.require.modules[id] = { exports: {}, factory: function() { var module = this; var returnExports = factory.apply(this, deps.map(function(dep) { switch(dep) { case 'require': return req case 'exports': return module.exports case 'module': return module default: return req(dep) } })); if (returnExports) module.exports = returnExports; return module; } }; }; window.define.amd = {} window.initBaseUrls = function initBaseUrls(topLevelNamespaces) { require.tlns = topLevelNamespaces; } window.initSender = function initSender() { var EventEmitter = window.require("ace/lib/event_emitter").EventEmitter; var oop = window.require("ace/lib/oop"); var Sender = function() {}; (function() { oop.implement(this, EventEmitter); this.callback = function(data, callbackId) { postMessage({ type: "call", id: callbackId, data: data }); }; this.emit = function(name, data) { postMessage({ type: "event", name: name, data: data }); }; }).call(Sender.prototype); return new Sender(); } window.main = null; window.sender = null; window.onmessage = function(e) { var msg = e.data; if (msg.command) { if (main[msg.command]) main[msg.command].apply(main, msg.args); else throw new Error("Unknown command:" + msg.command); } else if (msg.init) { initBaseUrls(msg.tlns); require("ace/lib/es5-shim"); sender = initSender(); var clazz = require(msg.module)[msg.classname]; main = new clazz(sender); } else if (msg.event && sender) { sender._emit(msg.event, msg.data); } }; })(this);// https://github.com/kriskowal/es5-shim define('ace/lib/es5-shim', ['require', 'exports', 'module' ], function(require, exports, module) { function Empty() {} if (!Function.prototype.bind) { Function.prototype.bind = function bind(that) { // .length is 1 var target = this; if (typeof target != "function") { throw new TypeError("Function.prototype.bind called on incompatible " + target); } var args = slice.call(arguments, 1); // for normal call var bound = function () { if (this instanceof bound) { var result = target.apply( this, args.concat(slice.call(arguments)) ); if (Object(result) === result) { return result; } return this; } else { return target.apply( that, args.concat(slice.call(arguments)) ); } }; if(target.prototype) { Empty.prototype = target.prototype; bound.prototype = new Empty(); Empty.prototype = null; } return bound; }; } var call = Function.prototype.call; var prototypeOfArray = Array.prototype; var prototypeOfObject = Object.prototype; var slice = prototypeOfArray.slice; var _toString = call.bind(prototypeOfObject.toString); var owns = call.bind(prototypeOfObject.hasOwnProperty); var defineGetter; var defineSetter; var lookupGetter; var lookupSetter; var supportsAccessors; if ((supportsAccessors = owns(prototypeOfObject, "__defineGetter__"))) { defineGetter = call.bind(prototypeOfObject.__defineGetter__); defineSetter = call.bind(prototypeOfObject.__defineSetter__); lookupGetter = call.bind(prototypeOfObject.__lookupGetter__); lookupSetter = call.bind(prototypeOfObject.__lookupSetter__); } if ([1,2].splice(0).length != 2) { if(function() { // test IE < 9 to splice bug - see issue #138 function makeArray(l) { var a = new Array(l+2); a[0] = a[1] = 0; return a; } var array = [], lengthBefore; array.splice.apply(array, makeArray(20)); array.splice.apply(array, makeArray(26)); lengthBefore = array.length; //46 array.splice(5, 0, "XXX"); // add one element lengthBefore + 1 == array.length if (lengthBefore + 1 == array.length) { return true;// has right splice implementation without bugs } }()) {//IE 6/7 var array_splice = Array.prototype.splice; Array.prototype.splice = function(start, deleteCount) { if (!arguments.length) { return []; } else { return array_splice.apply(this, [ start === void 0 ? 0 : start, deleteCount === void 0 ? (this.length - start) : deleteCount ].concat(slice.call(arguments, 2))) } }; } else {//IE8 Array.prototype.splice = function(pos, removeCount){ var length = this.length; if (pos > 0) { if (pos > length) pos = length; } else if (pos == void 0) { pos = 0; } else if (pos < 0) { pos = Math.max(length + pos, 0); } if (!(pos+removeCount < length)) removeCount = length - pos; var removed = this.slice(pos, pos+removeCount); var insert = slice.call(arguments, 2); var add = insert.length; if (pos === length) { if (add) { this.push.apply(this, insert); } } else { var remove = Math.min(removeCount, length - pos); var tailOldPos = pos + remove; var tailNewPos = tailOldPos + add - remove; var tailCount = length - tailOldPos; var lengthAfterRemove = length - remove; if (tailNewPos < tailOldPos) { // case A for (var i = 0; i < tailCount; ++i) { this[tailNewPos+i] = this[tailOldPos+i]; } } else if (tailNewPos > tailOldPos) { // case B for (i = tailCount; i--; ) { this[tailNewPos+i] = this[tailOldPos+i]; } } // else, add == remove (nothing to do) if (add && pos === lengthAfterRemove) { this.length = lengthAfterRemove; // truncate array this.push.apply(this, insert); } else { this.length = lengthAfterRemove + add; // reserves space for (i = 0; i < add; ++i) { this[pos+i] = insert[i]; } } } return removed; }; } } if (!Array.isArray) { Array.isArray = function isArray(obj) { return _toString(obj) == "[object Array]"; }; } var boxedString = Object("a"), splitString = boxedString[0] != "a" || !(0 in boxedString); if (!Array.prototype.forEach) { Array.prototype.forEach = function forEach(fun /*, thisp*/) { var object = toObject(this), self = splitString && _toString(this) == "[object String]" ? this.split("") : object, thisp = arguments[1], i = -1, length = self.length >>> 0; if (_toString(fun) != "[object Function]") { throw new TypeError(); // TODO message } while (++i < length) { if (i in self) { fun.call(thisp, self[i], i, object); } } }; } if (!Array.prototype.map) { Array.prototype.map = function map(fun /*, thisp*/) { var object = toObject(this), self = splitString && _toString(this) == "[object String]" ? this.split("") : object, length = self.length >>> 0, result = Array(length), thisp = arguments[1]; if (_toString(fun) != "[object Function]") { throw new TypeError(fun + " is not a function"); } for (var i = 0; i < length; i++) { if (i in self) result[i] = fun.call(thisp, self[i], i, object); } return result; }; } if (!Array.prototype.filter) { Array.prototype.filter = function filter(fun /*, thisp */) { var object = toObject(this), self = splitString && _toString(this) == "[object String]" ? this.split("") : object, length = self.length >>> 0, result = [], value, thisp = arguments[1]; if (_toString(fun) != "[object Function]") { throw new TypeError(fun + " is not a function"); } for (var i = 0; i < length; i++) { if (i in self) { value = self[i]; if (fun.call(thisp, value, i, object)) { result.push(value); } } } return result; }; } if (!Array.prototype.every) { Array.prototype.every = function every(fun /*, thisp */) { var object = toObject(this), self = splitString && _toString(this) == "[object String]" ? this.split("") : object, length = self.length >>> 0, thisp = arguments[1]; if (_toString(fun) != "[object Function]") { throw new TypeError(fun + " is not a function"); } for (var i = 0; i < length; i++) { if (i in self && !fun.call(thisp, self[i], i, object)) { return false; } } return true; }; } if (!Array.prototype.some) { Array.prototype.some = function some(fun /*, thisp */) { var object = toObject(this), self = splitString && _toString(this) == "[object String]" ? this.split("") : object, length = self.length >>> 0, thisp = arguments[1]; if (_toString(fun) != "[object Function]") { throw new TypeError(fun + " is not a function"); } for (var i = 0; i < length; i++) { if (i in self && fun.call(thisp, self[i], i, object)) { return true; } } return false; }; } if (!Array.prototype.reduce) { Array.prototype.reduce = function reduce(fun /*, initial*/) { var object = toObject(this), self = splitString && _toString(this) == "[object String]" ? this.split("") : object, length = self.length >>> 0; if (_toString(fun) != "[object Function]") { throw new TypeError(fun + " is not a function"); } if (!length && arguments.length == 1) { throw new TypeError("reduce of empty array with no initial value"); } var i = 0; var result; if (arguments.length >= 2) { result = arguments[1]; } else { do { if (i in self) { result = self[i++]; break; } if (++i >= length) { throw new TypeError("reduce of empty array with no initial value"); } } while (true); } for (; i < length; i++) { if (i in self) { result = fun.call(void 0, result, self[i], i, object); } } return result; }; } if (!Array.prototype.reduceRight) { Array.prototype.reduceRight = function reduceRight(fun /*, initial*/) { var object = toObject(this), self = splitString && _toString(this) == "[object String]" ? this.split("") : object, length = self.length >>> 0; if (_toString(fun) != "[object Function]") { throw new TypeError(fun + " is not a function"); } if (!length && arguments.length == 1) { throw new TypeError("reduceRight of empty array with no initial value"); } var result, i = length - 1; if (arguments.length >= 2) { result = arguments[1]; } else { do { if (i in self) { result = self[i--]; break; } if (--i < 0) { throw new TypeError("reduceRight of empty array with no initial value"); } } while (true); } do { if (i in this) { result = fun.call(void 0, result, self[i], i, object); } } while (i--); return result; }; } if (!Array.prototype.indexOf || ([0, 1].indexOf(1, 2) != -1)) { Array.prototype.indexOf = function indexOf(sought /*, fromIndex */ ) { var self = splitString && _toString(this) == "[object String]" ? this.split("") : toObject(this), length = self.length >>> 0; if (!length) { return -1; } var i = 0; if (arguments.length > 1) { i = toInteger(arguments[1]); } i = i >= 0 ? i : Math.max(0, length + i); for (; i < length; i++) { if (i in self && self[i] === sought) { return i; } } return -1; }; } if (!Array.prototype.lastIndexOf || ([0, 1].lastIndexOf(0, -3) != -1)) { Array.prototype.lastIndexOf = function lastIndexOf(sought /*, fromIndex */) { var self = splitString && _toString(this) == "[object String]" ? this.split("") : toObject(this), length = self.length >>> 0; if (!length) { return -1; } var i = length - 1; if (arguments.length > 1) { i = Math.min(i, toInteger(arguments[1])); } i = i >= 0 ? i : length - Math.abs(i); for (; i >= 0; i--) { if (i in self && sought === self[i]) { return i; } } return -1; }; } if (!Object.getPrototypeOf) { Object.getPrototypeOf = function getPrototypeOf(object) { return object.__proto__ || ( object.constructor ? object.constructor.prototype : prototypeOfObject ); }; } if (!Object.getOwnPropertyDescriptor) { var ERR_NON_OBJECT = "Object.getOwnPropertyDescriptor called on a " + "non-object: "; Object.getOwnPropertyDescriptor = function getOwnPropertyDescriptor(object, property) { if ((typeof object != "object" && typeof object != "function") || object === null) throw new TypeError(ERR_NON_OBJECT + object); if (!owns(object, property)) return; var descriptor, getter, setter; descriptor = { enumerable: true, configurable: true }; if (supportsAccessors) { var prototype = object.__proto__; object.__proto__ = prototypeOfObject; var getter = lookupGetter(object, property); var setter = lookupSetter(object, property); object.__proto__ = prototype; if (getter || setter) { if (getter) descriptor.get = getter; if (setter) descriptor.set = setter; return descriptor; } } descriptor.value = object[property]; return descriptor; }; } if (!Object.getOwnPropertyNames) { Object.getOwnPropertyNames = function getOwnPropertyNames(object) { return Object.keys(object); }; } if (!Object.create) { var createEmpty; if (Object.prototype.__proto__ === null) { createEmpty = function () { return { "__proto__": null }; }; } else { createEmpty = function () { var empty = {}; for (var i in empty) empty[i] = null; empty.constructor = empty.hasOwnProperty = empty.propertyIsEnumerable = empty.isPrototypeOf = empty.toLocaleString = empty.toString = empty.valueOf = empty.__proto__ = null; return empty; } } Object.create = function create(prototype, properties) { var object; if (prototype === null) { object = createEmpty(); } else { if (typeof prototype != "object") throw new TypeError("typeof prototype["+(typeof prototype)+"] != 'object'"); var Type = function () {}; Type.prototype = prototype; object = new Type(); object.__proto__ = prototype; } if (properties !== void 0) Object.defineProperties(object, properties); return object; }; } function doesDefinePropertyWork(object) { try { Object.defineProperty(object, "sentinel", {}); return "sentinel" in object; } catch (exception) { } } if (Object.defineProperty) { var definePropertyWorksOnObject = doesDefinePropertyWork({}); var definePropertyWorksOnDom = typeof document == "undefined" || doesDefinePropertyWork(document.createElement("div")); if (!definePropertyWorksOnObject || !definePropertyWorksOnDom) { var definePropertyFallback = Object.defineProperty; } } if (!Object.defineProperty || definePropertyFallback) { var ERR_NON_OBJECT_DESCRIPTOR = "Property description must be an object: "; var ERR_NON_OBJECT_TARGET = "Object.defineProperty called on non-object: " var ERR_ACCESSORS_NOT_SUPPORTED = "getters & setters can not be defined " + "on this javascript engine"; Object.defineProperty = function defineProperty(object, property, descriptor) { if ((typeof object != "object" && typeof object != "function") || object === null) throw new TypeError(ERR_NON_OBJECT_TARGET + object); if ((typeof descriptor != "object" && typeof descriptor != "function") || descriptor === null) throw new TypeError(ERR_NON_OBJECT_DESCRIPTOR + descriptor); if (definePropertyFallback) { try { return definePropertyFallback.call(Object, object, property, descriptor); } catch (exception) { } } if (owns(descriptor, "value")) { if (supportsAccessors && (lookupGetter(object, property) || lookupSetter(object, property))) { var prototype = object.__proto__; object.__proto__ = prototypeOfObject; delete object[property]; object[property] = descriptor.value; object.__proto__ = prototype; } else { object[property] = descriptor.value; } } else { if (!supportsAccessors) throw new TypeError(ERR_ACCESSORS_NOT_SUPPORTED); if (owns(descriptor, "get")) defineGetter(object, property, descriptor.get); if (owns(descriptor, "set")) defineSetter(object, property, descriptor.set); } return object; }; } if (!Object.defineProperties) { Object.defineProperties = function defineProperties(object, properties) { for (var property in properties) { if (owns(properties, property)) Object.defineProperty(object, property, properties[property]); } return object; }; } if (!Object.seal) { Object.seal = function seal(object) { return object; }; } if (!Object.freeze) { Object.freeze = function freeze(object) { return object; }; } try { Object.freeze(function () {}); } catch (exception) { Object.freeze = (function freeze(freezeObject) { return function freeze(object) { if (typeof object == "function") { return object; } else { return freezeObject(object); } }; })(Object.freeze); } if (!Object.preventExtensions) { Object.preventExtensions = function preventExtensions(object) { return object; }; } if (!Object.isSealed) { Object.isSealed = function isSealed(object) { return false; }; } if (!Object.isFrozen) { Object.isFrozen = function isFrozen(object) { return false; }; } if (!Object.isExtensible) { Object.isExtensible = function isExtensible(object) { if (Object(object) === object) { throw new TypeError(); // TODO message } var name = ''; while (owns(object, name)) { name += '?'; } object[name] = true; var returnValue = owns(object, name); delete object[name]; return returnValue; }; } if (!Object.keys) { var hasDontEnumBug = true, dontEnums = [ "toString", "toLocaleString", "valueOf", "hasOwnProperty", "isPrototypeOf", "propertyIsEnumerable", "constructor" ], dontEnumsLength = dontEnums.length; for (var key in {"toString": null}) { hasDontEnumBug = false; } Object.keys = function keys(object) { if ( (typeof object != "object" && typeof object != "function") || object === null ) { throw new TypeError("Object.keys called on a non-object"); } var keys = []; for (var name in object) { if (owns(object, name)) { keys.push(name); } } if (hasDontEnumBug) { for (var i = 0, ii = dontEnumsLength; i < ii; i++) { var dontEnum = dontEnums[i]; if (owns(object, dontEnum)) { keys.push(dontEnum); } } } return keys; }; } if (!Date.now) { Date.now = function now() { return new Date().getTime(); }; } var ws = "\x09\x0A\x0B\x0C\x0D\x20\xA0\u1680\u180E\u2000\u2001\u2002\u2003" + "\u2004\u2005\u2006\u2007\u2008\u2009\u200A\u202F\u205F\u3000\u2028" + "\u2029\uFEFF"; if (!String.prototype.trim || ws.trim()) { ws = "[" + ws + "]"; var trimBeginRegexp = new RegExp("^" + ws + ws + "*"), trimEndRegexp = new RegExp(ws + ws + "*$"); String.prototype.trim = function trim() { return String(this).replace(trimBeginRegexp, "").replace(trimEndRegexp, ""); }; } function toInteger(n) { n = +n; if (n !== n) { // isNaN n = 0; } else if (n !== 0 && n !== (1/0) && n !== -(1/0)) { n = (n > 0 || -1) * Math.floor(Math.abs(n)); } return n; } function isPrimitive(input) { var type = typeof input; return ( input === null || type === "undefined" || type === "boolean" || type === "number" || type === "string" ); } function toPrimitive(input) { var val, valueOf, toString; if (isPrimitive(input)) { return input; } valueOf = input.valueOf; if (typeof valueOf === "function") { val = valueOf.call(input); if (isPrimitive(val)) { return val; } } toString = input.toString; if (typeof toString === "function") { val = toString.call(input); if (isPrimitive(val)) { return val; } } throw new TypeError(); } var toObject = function (o) { if (o == null) { // this matches both null and undefined throw new TypeError("can't convert "+o+" to object"); } return Object(o); }; }); define('ace/mode/javascript_worker', ['require', 'exports', 'module' , 'ace/lib/oop', 'ace/worker/mirror', 'ace/mode/javascript/jshint'], function(require, exports, module) { var oop = require("../lib/oop"); var Mirror = require("../worker/mirror").Mirror; var lint = require("./javascript/jshint").JSHINT; function startRegex(arr) { return RegExp("^(" + arr.join("|") + ")"); } var disabledWarningsRe = startRegex([ "Bad for in variable '(.+)'.", 'Missing "use strict"' ]); var errorsRe = startRegex([ "Unexpected", "Expected ", "Confusing (plus|minus)", "\\{a\\} unterminated regular expression", "Unclosed ", "Unmatched ", "Unbegun comment", "Bad invocation", "Missing space after", "Missing operator at" ]); var infoRe = startRegex([ "Expected an assignment", "Bad escapement of EOL", "Unexpected comma", "Unexpected space", "Missing radix parameter.", "A leading decimal point can", "\\['{a}'\\] is better written in dot notation.", "'{a}' used out of scope" ]); var JavaScriptWorker = exports.JavaScriptWorker = function(sender) { Mirror.call(this, sender); this.setTimeout(500); this.setOptions(); }; oop.inherits(JavaScriptWorker, Mirror); (function() { this.setOptions = function(options) { this.options = options || { esnext: true, moz: true, devel: true, browser: true, node: true, laxcomma: true, laxbreak: true, lastsemic: true, onevar: false, passfail: false, maxerr: 100, expr: true, multistr: true, globalstrict: true }; this.doc.getValue() && this.deferredUpdate.schedule(100); }; this.changeOptions = function(newOptions) { oop.mixin(this.options, newOptions); this.doc.getValue() && this.deferredUpdate.schedule(100); }; this.isValidJS = function(str) { try { eval("throw 0;" + str); } catch(e) { if (e === 0) return true; } return false }; this.onUpdate = function() { var value = this.doc.getValue(); value = value.replace(/^#!.*\n/, "\n"); if (!value) { this.sender.emit("jslint", []); return; } var errors = []; var maxErrorLevel = this.isValidJS(value) ? "warning" : "error"; lint(value, this.options); var results = lint.errors; var errorAdded = false for (var i = 0; i < results.length; i++) { var error = results[i]; if (!error) continue; var raw = error.raw; var type = "warning"; if (raw == "Missing semicolon.") { var str = error.evidence.substr(error.character); str = str.charAt(str.search(/\S/)); if (maxErrorLevel == "error" && str && /[\w\d{(['"]/.test(str)) { error.reason = 'Missing ";" before statement'; type = "error"; } else { type = "info"; } } else if (disabledWarningsRe.test(raw)) { continue; } else if (infoRe.test(raw)) { type = "info" } else if (errorsRe.test(raw)) { errorAdded = true; type = maxErrorLevel; } else if (raw == "'{a}' is not defined.") { type = "warning"; } else if (raw == "'{a}' is defined but never used.") { type = "info"; } errors.push({ row: error.line-1, column: error.character-1, text: error.reason, type: type, raw: raw }); if (errorAdded) { } } this.sender.emit("jslint", errors); }; }).call(JavaScriptWorker.prototype); }); define('ace/lib/oop', ['require', 'exports', 'module' ], function(require, exports, module) { exports.inherits = (function() { var tempCtor = function() {}; return function(ctor, superCtor) { tempCtor.prototype = superCtor.prototype; ctor.super_ = superCtor.prototype; ctor.prototype = new tempCtor(); ctor.prototype.constructor = ctor; }; }()); exports.mixin = function(obj, mixin) { for (var key in mixin) { obj[key] = mixin[key]; } return obj; }; exports.implement = function(proto, mixin) { exports.mixin(proto, mixin); }; }); define('ace/worker/mirror', ['require', 'exports', 'module' , 'ace/document', 'ace/lib/lang'], function(require, exports, module) { var Document = require("../document").Document; var lang = require("../lib/lang"); var Mirror = exports.Mirror = function(sender) { this.sender = sender; var doc = this.doc = new Document(""); var deferredUpdate = this.deferredUpdate = lang.delayedCall(this.onUpdate.bind(this)); var _self = this; sender.on("change", function(e) { doc.applyDeltas(e.data); deferredUpdate.schedule(_self.$timeout); }); }; (function() { this.$timeout = 500; this.setTimeout = function(timeout) { this.$timeout = timeout; }; this.setValue = function(value) { this.doc.setValue(value); this.deferredUpdate.schedule(this.$timeout); }; this.getValue = function(callbackId) { this.sender.callback(this.doc.getValue(), callbackId); }; this.onUpdate = function() { }; }).call(Mirror.prototype); }); define('ace/document', ['require', 'exports', 'module' , 'ace/lib/oop', 'ace/lib/event_emitter', 'ace/range', 'ace/anchor'], function(require, exports, module) { var oop = require("./lib/oop"); var EventEmitter = require("./lib/event_emitter").EventEmitter; var Range = require("./range").Range; var Anchor = require("./anchor").Anchor; var Document = function(text) { this.$lines = []; if (text.length == 0) { this.$lines = [""]; } else if (Array.isArray(text)) { this._insertLines(0, text); } else { this.insert({row: 0, column:0}, text); } }; (function() { oop.implement(this, EventEmitter); this.setValue = function(text) { var len = this.getLength(); this.remove(new Range(0, 0, len, this.getLine(len-1).length)); this.insert({row: 0, column:0}, text); }; this.getValue = function() { return this.getAllLines().join(this.getNewLineCharacter()); }; this.createAnchor = function(row, column) { return new Anchor(this, row, column); }; if ("aaa".split(/a/).length == 0) this.$split = function(text) { return text.replace(/\r\n|\r/g, "\n").split("\n"); } else this.$split = function(text) { return text.split(/\r\n|\r|\n/); }; this.$detectNewLine = function(text) { var match = text.match(/^.*?(\r\n|\r|\n)/m); this.$autoNewLine = match ? match[1] : "\n"; }; this.getNewLineCharacter = function() { switch (this.$newLineMode) { case "windows": return "\r\n"; case "unix": return "\n"; default: return this.$autoNewLine; } }; this.$autoNewLine = "\n"; this.$newLineMode = "auto"; this.setNewLineMode = function(newLineMode) { if (this.$newLineMode === newLineMode) return; this.$newLineMode = newLineMode; }; this.getNewLineMode = function() { return this.$newLineMode; }; this.isNewLine = function(text) { return (text == "\r\n" || text == "\r" || text == "\n"); }; this.getLine = function(row) { return this.$lines[row] || ""; }; this.getLines = function(firstRow, lastRow) { return this.$lines.slice(firstRow, lastRow + 1); }; this.getAllLines = function() { return this.getLines(0, this.getLength()); }; this.getLength = function() { return this.$lines.length; }; this.getTextRange = function(range) { if (range.start.row == range.end.row) { return this.getLine(range.start.row) .substring(range.start.column, range.end.column); } var lines = this.getLines(range.start.row, range.end.row); lines[0] = (lines[0] || "").substring(range.start.column); var l = lines.length - 1; if (range.end.row - range.start.row == l) lines[l] = lines[l].substring(0, range.end.column); return lines.join(this.getNewLineCharacter()); }; this.$clipPosition = function(position) { var length = this.getLength(); if (position.row >= length) { position.row = Math.max(0, length - 1); position.column = this.getLine(length-1).length; } else if (position.row < 0) position.row = 0; return position; }; this.insert = function(position, text) { if (!text || text.length === 0) return position; position = this.$clipPosition(position); if (this.getLength() <= 1) this.$detectNewLine(text); var lines = this.$split(text); var firstLine = lines.splice(0, 1)[0]; var lastLine = lines.length == 0 ? null : lines.splice(lines.length - 1, 1)[0]; position = this.insertInLine(position, firstLine); if (lastLine !== null) { position = this.insertNewLine(position); // terminate first line position = this._insertLines(position.row, lines); position = this.insertInLine(position, lastLine || ""); } return position; }; this.insertLines = function(row, lines) { if (row >= this.getLength()) return this.insert({row: row, column: 0}, "\n" + lines.join("\n")); return this._insertLines(Math.max(row, 0), lines); }; this._insertLines = function(row, lines) { if (lines.length == 0) return {row: row, column: 0}; if (lines.length > 0xFFFF) { var end = this._insertLines(row, lines.slice(0xFFFF)); lines = lines.slice(0, 0xFFFF); } var args = [row, 0]; args.push.apply(args, lines); this.$lines.splice.apply(this.$lines, args); var range = new Range(row, 0, row + lines.length, 0); var delta = { action: "insertLines", range: range, lines: lines }; this._emit("change", { data: delta }); return end || range.end; }; this.insertNewLine = function(position) { position = this.$clipPosition(position); var line = this.$lines[position.row] || ""; this.$lines[position.row] = line.substring(0, position.column); this.$lines.splice(position.row + 1, 0, line.substring(position.column, line.length)); var end = { row : position.row + 1, column : 0 }; var delta = { action: "insertText", range: Range.fromPoints(position, end), text: this.getNewLineCharacter() }; this._emit("change", { data: delta }); return end; }; this.insertInLine = function(position, text) { if (text.length == 0) return position; var line = this.$lines[position.row] || ""; this.$lines[position.row] = line.substring(0, position.column) + text + line.substring(position.column); var end = { row : position.row, column : position.column + text.length }; var delta = { action: "insertText", range: Range.fromPoints(position, end), text: text }; this._emit("change", { data: delta }); return end; }; this.remove = function(range) { if (!range instanceof Range) range = Range.fromPoints(range.start, range.end); range.start = this.$clipPosition(range.start); range.end = this.$clipPosition(range.end); if (range.isEmpty()) return range.start; var firstRow = range.start.row; var lastRow = range.end.row; if (range.isMultiLine()) { var firstFullRow = range.start.column == 0 ? firstRow : firstRow + 1; var lastFullRow = lastRow - 1; if (range.end.column > 0) this.removeInLine(lastRow, 0, range.end.column); if (lastFullRow >= firstFullRow) this._removeLines(firstFullRow, lastFullRow); if (firstFullRow != firstRow) { this.removeInLine(firstRow, range.start.column, this.getLine(firstRow).length); this.removeNewLine(range.start.row); } } else { this.removeInLine(firstRow, range.start.column, range.end.column); } return range.start; }; this.removeInLine = function(row, startColumn, endColumn) { if (startColumn == endColumn) return; var range = new Range(row, startColumn, row, endColumn); var line = this.getLine(row); var removed = line.substring(startColumn, endColumn); var newLine = line.substring(0, startColumn) + line.substring(endColumn, line.length); this.$lines.splice(row, 1, newLine); var delta = { action: "removeText", range: range, text: removed }; this._emit("change", { data: delta }); return range.start; }; this.removeLines = function(firstRow, lastRow) { if (firstRow < 0 || lastRow >= this.getLength()) return this.remove(new Range(firstRow, 0, lastRow + 1, 0)); return this._removeLines(firstRow, lastRow); }; this._removeLines = function(firstRow, lastRow) { var range = new Range(firstRow, 0, lastRow + 1, 0); var removed = this.$lines.splice(firstRow, lastRow - firstRow + 1); var delta = { action: "removeLines", range: range, nl: this.getNewLineCharacter(), lines: removed }; this._emit("change", { data: delta }); return removed; }; this.removeNewLine = function(row) { var firstLine = this.getLine(row); var secondLine = this.getLine(row+1); var range = new Range(row, firstLine.length, row+1, 0); var line = firstLine + secondLine; this.$lines.splice(row, 2, line); var delta = { action: "removeText", range: range, text: this.getNewLineCharacter() }; this._emit("change", { data: delta }); }; this.replace = function(range, text) { if (!range instanceof Range) range = Range.fromPoints(range.start, range.end); if (text.length == 0 && range.isEmpty()) return range.start; if (text == this.getTextRange(range)) return range.end; this.remove(range); if (text) { var end = this.insert(range.start, text); } else { end = range.start; } return end; }; this.applyDeltas = function(deltas) { for (var i=0; i=0; i--) { var delta = deltas[i]; var range = Range.fromPoints(delta.range.start, delta.range.end); if (delta.action == "insertLines") this._removeLines(range.start.row, range.end.row - 1); else if (delta.action == "insertText") this.remove(range); else if (delta.action == "removeLines") this._insertLines(range.start.row, delta.lines); else if (delta.action == "removeText") this.insert(range.start, delta.text); } }; this.indexToPosition = function(index, startRow) { var lines = this.$lines || this.getAllLines(); var newlineLength = this.getNewLineCharacter().length; for (var i = startRow || 0, l = lines.length; i < l; i++) { index -= lines[i].length + newlineLength; if (index < 0) return {row: i, column: index + lines[i].length + newlineLength}; } return {row: l-1, column: lines[l-1].length}; }; this.positionToIndex = function(pos, startRow) { var lines = this.$lines || this.getAllLines(); var newlineLength = this.getNewLineCharacter().length; var index = 0; var row = Math.min(pos.row, lines.length); for (var i = startRow || 0; i < row; ++i) index += lines[i].length + newlineLength; return index + pos.column; }; }).call(Document.prototype); exports.Document = Document; }); define('ace/lib/event_emitter', ['require', 'exports', 'module' ], function(require, exports, module) { var EventEmitter = {}; var stopPropagation = function() { this.propagationStopped = true; }; var preventDefault = function() { this.defaultPrevented = true; }; EventEmitter._emit = EventEmitter._dispatchEvent = function(eventName, e) { this._eventRegistry || (this._eventRegistry = {}); this._defaultHandlers || (this._defaultHandlers = {}); var listeners = this._eventRegistry[eventName] || []; var defaultHandler = this._defaultHandlers[eventName]; if (!listeners.length && !defaultHandler) return; if (typeof e != "object" || !e) e = {}; if (!e.type) e.type = eventName; if (!e.stopPropagation) e.stopPropagation = stopPropagation; if (!e.preventDefault) e.preventDefault = preventDefault; listeners = listeners.slice(); for (var i=0; i [" + this.end.row + "/" + this.end.column + "]"); }; this.contains = function(row, column) { return this.compare(row, column) == 0; }; this.compareRange = function(range) { var cmp, end = range.end, start = range.start; cmp = this.compare(end.row, end.column); if (cmp == 1) { cmp = this.compare(start.row, start.column); if (cmp == 1) { return 2; } else if (cmp == 0) { return 1; } else { return 0; } } else if (cmp == -1) { return -2; } else { cmp = this.compare(start.row, start.column); if (cmp == -1) { return -1; } else if (cmp == 1) { return 42; } else { return 0; } } }; this.comparePoint = function(p) { return this.compare(p.row, p.column); }; this.containsRange = function(range) { return this.comparePoint(range.start) == 0 && this.comparePoint(range.end) == 0; }; this.intersects = function(range) { var cmp = this.compareRange(range); return (cmp == -1 || cmp == 0 || cmp == 1); }; this.isEnd = function(row, column) { return this.end.row == row && this.end.column == column; }; this.isStart = function(row, column) { return this.start.row == row && this.start.column == column; }; this.setStart = function(row, column) { if (typeof row == "object") { this.start.column = row.column; this.start.row = row.row; } else { this.start.row = row; this.start.column = column; } }; this.setEnd = function(row, column) { if (typeof row == "object") { this.end.column = row.column; this.end.row = row.row; } else { this.end.row = row; this.end.column = column; } }; this.inside = function(row, column) { if (this.compare(row, column) == 0) { if (this.isEnd(row, column) || this.isStart(row, column)) { return false; } else { return true; } } return false; }; this.insideStart = function(row, column) { if (this.compare(row, column) == 0) { if (this.isEnd(row, column)) { return false; } else { return true; } } return false; }; this.insideEnd = function(row, column) { if (this.compare(row, column) == 0) { if (this.isStart(row, column)) { return false; } else { return true; } } return false; }; this.compare = function(row, column) { if (!this.isMultiLine()) { if (row === this.start.row) { return column < this.start.column ? -1 : (column > this.end.column ? 1 : 0); }; } if (row < this.start.row) return -1; if (row > this.end.row) return 1; if (this.start.row === row) return column >= this.start.column ? 0 : -1; if (this.end.row === row) return column <= this.end.column ? 0 : 1; return 0; }; this.compareStart = function(row, column) { if (this.start.row == row && this.start.column == column) { return -1; } else { return this.compare(row, column); } }; this.compareEnd = function(row, column) { if (this.end.row == row && this.end.column == column) { return 1; } else { return this.compare(row, column); } }; this.compareInside = function(row, column) { if (this.end.row == row && this.end.column == column) { return 1; } else if (this.start.row == row && this.start.column == column) { return -1; } else { return this.compare(row, column); } }; this.clipRows = function(firstRow, lastRow) { if (this.end.row > lastRow) var end = {row: lastRow + 1, column: 0}; else if (this.end.row < firstRow) var end = {row: firstRow, column: 0}; if (this.start.row > lastRow) var start = {row: lastRow + 1, column: 0}; else if (this.start.row < firstRow) var start = {row: firstRow, column: 0}; return Range.fromPoints(start || this.start, end || this.end); }; this.extend = function(row, column) { var cmp = this.compare(row, column); if (cmp == 0) return this; else if (cmp == -1) var start = {row: row, column: column}; else var end = {row: row, column: column}; return Range.fromPoints(start || this.start, end || this.end); }; this.isEmpty = function() { return (this.start.row === this.end.row && this.start.column === this.end.column); }; this.isMultiLine = function() { return (this.start.row !== this.end.row); }; this.clone = function() { return Range.fromPoints(this.start, this.end); }; this.collapseRows = function() { if (this.end.column == 0) return new Range(this.start.row, 0, Math.max(this.start.row, this.end.row-1), 0) else return new Range(this.start.row, 0, this.end.row, 0) }; this.toScreenRange = function(session) { var screenPosStart = session.documentToScreenPosition(this.start); var screenPosEnd = session.documentToScreenPosition(this.end); return new Range( screenPosStart.row, screenPosStart.column, screenPosEnd.row, screenPosEnd.column ); }; this.moveBy = function(row, column) { this.start.row += row; this.start.column += column; this.end.row += row; this.end.column += column; }; }).call(Range.prototype); Range.fromPoints = function(start, end) { return new Range(start.row, start.column, end.row, end.column); }; Range.comparePoints = comparePoints; Range.comparePoints = function(p1, p2) { return p1.row - p2.row || p1.column - p2.column; }; exports.Range = Range; }); define('ace/anchor', ['require', 'exports', 'module' , 'ace/lib/oop', 'ace/lib/event_emitter'], function(require, exports, module) { var oop = require("./lib/oop"); var EventEmitter = require("./lib/event_emitter").EventEmitter; var Anchor = exports.Anchor = function(doc, row, column) { this.$onChange = this.onChange.bind(this); this.attach(doc); if (typeof column == "undefined") this.setPosition(row.row, row.column); else this.setPosition(row, column); }; (function() { oop.implement(this, EventEmitter); this.getPosition = function() { return this.$clipPositionToDocument(this.row, this.column); }; this.getDocument = function() { return this.document; }; this.$insertRight = false; this.onChange = function(e) { var delta = e.data; var range = delta.range; if (range.start.row == range.end.row && range.start.row != this.row) return; if (range.start.row > this.row) return; if (range.start.row == this.row && range.start.column > this.column) return; var row = this.row; var column = this.column; var start = range.start; var end = range.end; if (delta.action === "insertText") { if (start.row === row && start.column <= column) { if (start.column === column && this.$insertRight) { } else if (start.row === end.row) { column += end.column - start.column; } else { column -= start.column; row += end.row - start.row; } } else if (start.row !== end.row && start.row < row) { row += end.row - start.row; } } else if (delta.action === "insertLines") { if (start.row <= row) { row += end.row - start.row; } } else if (delta.action === "removeText") { if (start.row === row && start.column < column) { if (end.column >= column) column = start.column; else column = Math.max(0, column - (end.column - start.column)); } else if (start.row !== end.row && start.row < row) { if (end.row === row) column = Math.max(0, column - end.column) + start.column; row -= (end.row - start.row); } else if (end.row === row) { row -= end.row - start.row; column = Math.max(0, column - end.column) + start.column; } } else if (delta.action == "removeLines") { if (start.row <= row) { if (end.row <= row) row -= end.row - start.row; else { row = start.row; column = 0; } } } this.setPosition(row, column, true); }; this.setPosition = function(row, column, noClip) { var pos; if (noClip) { pos = { row: row, column: column }; } else { pos = this.$clipPositionToDocument(row, column); } if (this.row == pos.row && this.column == pos.column) return; var old = { row: this.row, column: this.column }; this.row = pos.row; this.column = pos.column; this._emit("change", { old: old, value: pos }); }; this.detach = function() { this.document.removeEventListener("change", this.$onChange); }; this.attach = function(doc) { this.document = doc || this.document; this.document.on("change", this.$onChange); }; this.$clipPositionToDocument = function(row, column) { var pos = {}; if (row >= this.document.getLength()) { pos.row = Math.max(0, this.document.getLength() - 1); pos.column = this.document.getLine(pos.row).length; } else if (row < 0) { pos.row = 0; pos.column = 0; } else { pos.row = row; pos.column = Math.min(this.document.getLine(pos.row).length, Math.max(0, column)); } if (column < 0) pos.column = 0; return pos; }; }).call(Anchor.prototype); }); define('ace/lib/lang', ['require', 'exports', 'module' ], function(require, exports, module) { exports.stringReverse = function(string) { return string.split("").reverse().join(""); }; exports.stringRepeat = function (string, count) { var result = ''; while (count > 0) { if (count & 1) result += string; if (count >>= 1) string += string; } return result; }; var trimBeginRegexp = /^\s\s*/; var trimEndRegexp = /\s\s*$/; exports.stringTrimLeft = function (string) { return string.replace(trimBeginRegexp, ''); }; exports.stringTrimRight = function (string) { return string.replace(trimEndRegexp, ''); }; exports.copyObject = function(obj) { var copy = {}; for (var key in obj) { copy[key] = obj[key]; } return copy; }; exports.copyArray = function(array){ var copy = []; for (var i=0, l=array.length; i 2; if (obj == null) obj = []; if (nativeReduce && obj.reduce === nativeReduce) { if (context) iterator = _.bind(iterator, context); return initial ? obj.reduce(iterator, memo) : obj.reduce(iterator); } each(obj, function(value, index, list) { if (!initial) { memo = value; initial = true; } else { memo = iterator.call(context, memo, value, index, list); } }); if (!initial) throw new TypeError(reduceError); return memo; }; _.reduceRight = _.foldr = function(obj, iterator, memo, context) { var initial = arguments.length > 2; if (obj == null) obj = []; if (nativeReduceRight && obj.reduceRight === nativeReduceRight) { if (context) iterator = _.bind(iterator, context); return initial ? obj.reduceRight(iterator, memo) : obj.reduceRight(iterator); } var length = obj.length; if (length !== +length) { var keys = _.keys(obj); length = keys.length; } each(obj, function(value, index, list) { index = keys ? keys[--length] : --length; if (!initial) { memo = obj[index]; initial = true; } else { memo = iterator.call(context, memo, obj[index], index, list); } }); if (!initial) throw new TypeError(reduceError); return memo; }; _.find = _.detect = function(obj, iterator, context) { var result; any(obj, function(value, index, list) { if (iterator.call(context, value, index, list)) { result = value; return true; } }); return result; }; _.filter = _.select = function(obj, iterator, context) { var results = []; if (obj == null) return results; if (nativeFilter && obj.filter === nativeFilter) return obj.filter(iterator, context); each(obj, function(value, index, list) { if (iterator.call(context, value, index, list)) results[results.length] = value; }); return results; }; _.reject = function(obj, iterator, context) { return _.filter(obj, function(value, index, list) { return !iterator.call(context, value, index, list); }, context); }; _.every = _.all = function(obj, iterator, context) { iterator || (iterator = _.identity); var result = true; if (obj == null) return result; if (nativeEvery && obj.every === nativeEvery) return obj.every(iterator, context); each(obj, function(value, index, list) { if (!(result = result && iterator.call(context, value, index, list))) return breaker; }); return !!result; }; var any = _.some = _.any = function(obj, iterator, context) { iterator || (iterator = _.identity); var result = false; if (obj == null) return result; if (nativeSome && obj.some === nativeSome) return obj.some(iterator, context); each(obj, function(value, index, list) { if (result || (result = iterator.call(context, value, index, list))) return breaker; }); return !!result; }; _.contains = _.include = function(obj, target) { if (obj == null) return false; if (nativeIndexOf && obj.indexOf === nativeIndexOf) return obj.indexOf(target) != -1; return any(obj, function(value) { return value === target; }); }; _.invoke = function(obj, method) { var args = slice.call(arguments, 2); var isFunc = _.isFunction(method); return _.map(obj, function(value) { return (isFunc ? method : value[method]).apply(value, args); }); }; _.pluck = function(obj, key) { return _.map(obj, function(value){ return value[key]; }); }; _.where = function(obj, attrs, first) { if (_.isEmpty(attrs)) return first ? null : []; return _[first ? 'find' : 'filter'](obj, function(value) { for (var key in attrs) { if (attrs[key] !== value[key]) return false; } return true; }); }; _.findWhere = function(obj, attrs) { return _.where(obj, attrs, true); }; _.max = function(obj, iterator, context) { if (!iterator && _.isArray(obj) && obj[0] === +obj[0] && obj.length < 65535) { return Math.max.apply(Math, obj); } if (!iterator && _.isEmpty(obj)) return -Infinity; var result = {computed : -Infinity, value: -Infinity}; each(obj, function(value, index, list) { var computed = iterator ? iterator.call(context, value, index, list) : value; computed >= result.computed && (result = {value : value, computed : computed}); }); return result.value; }; _.min = function(obj, iterator, context) { if (!iterator && _.isArray(obj) && obj[0] === +obj[0] && obj.length < 65535) { return Math.min.apply(Math, obj); } if (!iterator && _.isEmpty(obj)) return Infinity; var result = {computed : Infinity, value: Infinity}; each(obj, function(value, index, list) { var computed = iterator ? iterator.call(context, value, index, list) : value; computed < result.computed && (result = {value : value, computed : computed}); }); return result.value; }; _.shuffle = function(obj) { var rand; var index = 0; var shuffled = []; each(obj, function(value) { rand = _.random(index++); shuffled[index - 1] = shuffled[rand]; shuffled[rand] = value; }); return shuffled; }; var lookupIterator = function(value) { return _.isFunction(value) ? value : function(obj){ return obj[value]; }; }; _.sortBy = function(obj, value, context) { var iterator = lookupIterator(value); return _.pluck(_.map(obj, function(value, index, list) { return { value : value, index : index, criteria : iterator.call(context, value, index, list) }; }).sort(function(left, right) { var a = left.criteria; var b = right.criteria; if (a !== b) { if (a > b || a === void 0) return 1; if (a < b || b === void 0) return -1; } return left.index < right.index ? -1 : 1; }), 'value'); }; var group = function(obj, value, context, behavior) { var result = {}; var iterator = lookupIterator(value || _.identity); each(obj, function(value, index) { var key = iterator.call(context, value, index, obj); behavior(result, key, value); }); return result; }; _.groupBy = function(obj, value, context) { return group(obj, value, context, function(result, key, value) { (_.has(result, key) ? result[key] : (result[key] = [])).push(value); }); }; _.countBy = function(obj, value, context) { return group(obj, value, context, function(result, key) { if (!_.has(result, key)) result[key] = 0; result[key]++; }); }; _.sortedIndex = function(array, obj, iterator, context) { iterator = iterator == null ? _.identity : lookupIterator(iterator); var value = iterator.call(context, obj); var low = 0, high = array.length; while (low < high) { var mid = (low + high) >>> 1; iterator.call(context, array[mid]) < value ? low = mid + 1 : high = mid; } return low; }; _.toArray = function(obj) { if (!obj) return []; if (_.isArray(obj)) return slice.call(obj); if (obj.length === +obj.length) return _.map(obj, _.identity); return _.values(obj); }; _.size = function(obj) { if (obj == null) return 0; return (obj.length === +obj.length) ? obj.length : _.keys(obj).length; }; _.first = _.head = _.take = function(array, n, guard) { if (array == null) return void 0; return (n != null) && !guard ? slice.call(array, 0, n) : array[0]; }; _.initial = function(array, n, guard) { return slice.call(array, 0, array.length - ((n == null) || guard ? 1 : n)); }; _.last = function(array, n, guard) { if (array == null) return void 0; if ((n != null) && !guard) { return slice.call(array, Math.max(array.length - n, 0)); } else { return array[array.length - 1]; } }; _.rest = _.tail = _.drop = function(array, n, guard) { return slice.call(array, (n == null) || guard ? 1 : n); }; _.compact = function(array) { return _.filter(array, _.identity); }; var flatten = function(input, shallow, output) { each(input, function(value) { if (_.isArray(value)) { shallow ? push.apply(output, value) : flatten(value, shallow, output); } else { output.push(value); } }); return output; }; _.flatten = function(array, shallow) { return flatten(array, shallow, []); }; _.without = function(array) { return _.difference(array, slice.call(arguments, 1)); }; _.uniq = _.unique = function(array, isSorted, iterator, context) { if (_.isFunction(isSorted)) { context = iterator; iterator = isSorted; isSorted = false; } var initial = iterator ? _.map(array, iterator, context) : array; var results = []; var seen = []; each(initial, function(value, index) { if (isSorted ? (!index || seen[seen.length - 1] !== value) : !_.contains(seen, value)) { seen.push(value); results.push(array[index]); } }); return results; }; _.union = function() { return _.uniq(concat.apply(ArrayProto, arguments)); }; _.intersection = function(array) { var rest = slice.call(arguments, 1); return _.filter(_.uniq(array), function(item) { return _.every(rest, function(other) { return _.indexOf(other, item) >= 0; }); }); }; _.difference = function(array) { var rest = concat.apply(ArrayProto, slice.call(arguments, 1)); return _.filter(array, function(value){ return !_.contains(rest, value); }); }; _.zip = function() { var args = slice.call(arguments); var length = _.max(_.pluck(args, 'length')); var results = new Array(length); for (var i = 0; i < length; i++) { results[i] = _.pluck(args, "" + i); } return results; }; _.object = function(list, values) { if (list == null) return {}; var result = {}; for (var i = 0, l = list.length; i < l; i++) { if (values) { result[list[i]] = values[i]; } else { result[list[i][0]] = list[i][1]; } } return result; }; _.indexOf = function(array, item, isSorted) { if (array == null) return -1; var i = 0, l = array.length; if (isSorted) { if (typeof isSorted == 'number') { i = (isSorted < 0 ? Math.max(0, l + isSorted) : isSorted); } else { i = _.sortedIndex(array, item); return array[i] === item ? i : -1; } } if (nativeIndexOf && array.indexOf === nativeIndexOf) return array.indexOf(item, isSorted); for (; i < l; i++) if (array[i] === item) return i; return -1; }; _.lastIndexOf = function(array, item, from) { if (array == null) return -1; var hasIndex = from != null; if (nativeLastIndexOf && array.lastIndexOf === nativeLastIndexOf) { return hasIndex ? array.lastIndexOf(item, from) : array.lastIndexOf(item); } var i = (hasIndex ? from : array.length); while (i--) if (array[i] === item) return i; return -1; }; _.range = function(start, stop, step) { if (arguments.length <= 1) { stop = start || 0; start = 0; } step = arguments[2] || 1; var len = Math.max(Math.ceil((stop - start) / step), 0); var idx = 0; var range = new Array(len); while(idx < len) { range[idx++] = start; start += step; } return range; }; _.bind = function(func, context) { if (func.bind === nativeBind && nativeBind) return nativeBind.apply(func, slice.call(arguments, 1)); var args = slice.call(arguments, 2); return function() { return func.apply(context, args.concat(slice.call(arguments))); }; }; _.partial = function(func) { var args = slice.call(arguments, 1); return function() { return func.apply(this, args.concat(slice.call(arguments))); }; }; _.bindAll = function(obj) { var funcs = slice.call(arguments, 1); if (funcs.length === 0) funcs = _.functions(obj); each(funcs, function(f) { obj[f] = _.bind(obj[f], obj); }); return obj; }; _.memoize = function(func, hasher) { var memo = {}; hasher || (hasher = _.identity); return function() { var key = hasher.apply(this, arguments); return _.has(memo, key) ? memo[key] : (memo[key] = func.apply(this, arguments)); }; }; _.delay = function(func, wait) { var args = slice.call(arguments, 2); return setTimeout(function(){ return func.apply(null, args); }, wait); }; _.defer = function(func) { return _.delay.apply(_, [func, 1].concat(slice.call(arguments, 1))); }; _.throttle = function(func, wait) { var context, args, timeout, result; var previous = 0; var later = function() { previous = new Date; timeout = null; result = func.apply(context, args); }; return function() { var now = new Date; var remaining = wait - (now - previous); context = this; args = arguments; if (remaining <= 0) { clearTimeout(timeout); timeout = null; previous = now; result = func.apply(context, args); } else if (!timeout) { timeout = setTimeout(later, remaining); } return result; }; }; _.debounce = function(func, wait, immediate) { var timeout, result; return function() { var context = this, args = arguments; var later = function() { timeout = null; if (!immediate) result = func.apply(context, args); }; var callNow = immediate && !timeout; clearTimeout(timeout); timeout = setTimeout(later, wait); if (callNow) result = func.apply(context, args); return result; }; }; _.once = function(func) { var ran = false, memo; return function() { if (ran) return memo; ran = true; memo = func.apply(this, arguments); func = null; return memo; }; }; _.wrap = function(func, wrapper) { return function() { var args = [func]; push.apply(args, arguments); return wrapper.apply(this, args); }; }; _.compose = function() { var funcs = arguments; return function() { var args = arguments; for (var i = funcs.length - 1; i >= 0; i--) { args = [funcs[i].apply(this, args)]; } return args[0]; }; }; _.after = function(times, func) { if (times <= 0) return func(); return function() { if (--times < 1) { return func.apply(this, arguments); } }; }; _.keys = nativeKeys || function(obj) { if (obj !== Object(obj)) throw new TypeError('Invalid object'); var keys = []; for (var key in obj) if (_.has(obj, key)) keys[keys.length] = key; return keys; }; _.values = function(obj) { var values = []; for (var key in obj) if (_.has(obj, key)) values.push(obj[key]); return values; }; _.pairs = function(obj) { var pairs = []; for (var key in obj) if (_.has(obj, key)) pairs.push([key, obj[key]]); return pairs; }; _.invert = function(obj) { var result = {}; for (var key in obj) if (_.has(obj, key)) result[obj[key]] = key; return result; }; _.functions = _.methods = function(obj) { var names = []; for (var key in obj) { if (_.isFunction(obj[key])) names.push(key); } return names.sort(); }; _.extend = function(obj) { each(slice.call(arguments, 1), function(source) { if (source) { for (var prop in source) { obj[prop] = source[prop]; } } }); return obj; }; _.pick = function(obj) { var copy = {}; var keys = concat.apply(ArrayProto, slice.call(arguments, 1)); each(keys, function(key) { if (key in obj) copy[key] = obj[key]; }); return copy; }; _.omit = function(obj) { var copy = {}; var keys = concat.apply(ArrayProto, slice.call(arguments, 1)); for (var key in obj) { if (!_.contains(keys, key)) copy[key] = obj[key]; } return copy; }; _.defaults = function(obj) { each(slice.call(arguments, 1), function(source) { if (source) { for (var prop in source) { if (obj[prop] == null) obj[prop] = source[prop]; } } }); return obj; }; _.clone = function(obj) { if (!_.isObject(obj)) return obj; return _.isArray(obj) ? obj.slice() : _.extend({}, obj); }; _.tap = function(obj, interceptor) { interceptor(obj); return obj; }; var eq = function(a, b, aStack, bStack) { if (a === b) return a !== 0 || 1 / a == 1 / b; if (a == null || b == null) return a === b; if (a instanceof _) a = a._wrapped; if (b instanceof _) b = b._wrapped; var className = toString.call(a); if (className != toString.call(b)) return false; switch (className) { case '[object String]': return a == String(b); case '[object Number]': return a != +a ? b != +b : (a == 0 ? 1 / a == 1 / b : a == +b); case '[object Date]': case '[object Boolean]': return +a == +b; case '[object RegExp]': return a.source == b.source && a.global == b.global && a.multiline == b.multiline && a.ignoreCase == b.ignoreCase; } if (typeof a != 'object' || typeof b != 'object') return false; var length = aStack.length; while (length--) { if (aStack[length] == a) return bStack[length] == b; } aStack.push(a); bStack.push(b); var size = 0, result = true; if (className == '[object Array]') { size = a.length; result = size == b.length; if (result) { while (size--) { if (!(result = eq(a[size], b[size], aStack, bStack))) break; } } } else { var aCtor = a.constructor, bCtor = b.constructor; if (aCtor !== bCtor && !(_.isFunction(aCtor) && (aCtor instanceof aCtor) && _.isFunction(bCtor) && (bCtor instanceof bCtor))) { return false; } for (var key in a) { if (_.has(a, key)) { size++; if (!(result = _.has(b, key) && eq(a[key], b[key], aStack, bStack))) break; } } if (result) { for (key in b) { if (_.has(b, key) && !(size--)) break; } result = !size; } } aStack.pop(); bStack.pop(); return result; }; _.isEqual = function(a, b) { return eq(a, b, [], []); }; _.isEmpty = function(obj) { if (obj == null) return true; if (_.isArray(obj) || _.isString(obj)) return obj.length === 0; for (var key in obj) if (_.has(obj, key)) return false; return true; }; _.isElement = function(obj) { return !!(obj && obj.nodeType === 1); }; _.isArray = nativeIsArray || function(obj) { return toString.call(obj) == '[object Array]'; }; _.isObject = function(obj) { return obj === Object(obj); }; each(['Arguments', 'Function', 'String', 'Number', 'Date', 'RegExp'], function(name) { _['is' + name] = function(obj) { return toString.call(obj) == '[object ' + name + ']'; }; }); if (!_.isArguments(arguments)) { _.isArguments = function(obj) { return !!(obj && _.has(obj, 'callee')); }; } if (typeof (/./) !== 'function') { _.isFunction = function(obj) { return typeof obj === 'function'; }; } _.isFinite = function(obj) { return isFinite(obj) && !isNaN(parseFloat(obj)); }; _.isNaN = function(obj) { return _.isNumber(obj) && obj != +obj; }; _.isBoolean = function(obj) { return obj === true || obj === false || toString.call(obj) == '[object Boolean]'; }; _.isNull = function(obj) { return obj === null; }; _.isUndefined = function(obj) { return obj === void 0; }; _.has = function(obj, key) { return hasOwnProperty.call(obj, key); }; _.noConflict = function() { root._ = previousUnderscore; return this; }; _.identity = function(value) { return value; }; _.times = function(n, iterator, context) { var accum = Array(n); for (var i = 0; i < n; i++) accum[i] = iterator.call(context, i); return accum; }; _.random = function(min, max) { if (max == null) { max = min; min = 0; } return min + Math.floor(Math.random() * (max - min + 1)); }; var entityMap = { escape: { '&': '&', '<': '<', '>': '>', '"': '"', "'": ''', '/': '/' } }; entityMap.unescape = _.invert(entityMap.escape); var entityRegexes = { escape: new RegExp('[' + _.keys(entityMap.escape).join('') + ']', 'g'), unescape: new RegExp('(' + _.keys(entityMap.unescape).join('|') + ')', 'g') }; _.each(['escape', 'unescape'], function(method) { _[method] = function(string) { if (string == null) return ''; return ('' + string).replace(entityRegexes[method], function(match) { return entityMap[method][match]; }); }; }); _.result = function(object, property) { if (object == null) return null; var value = object[property]; return _.isFunction(value) ? value.call(object) : value; }; _.mixin = function(obj) { each(_.functions(obj), function(name){ var func = _[name] = obj[name]; _.prototype[name] = function() { var args = [this._wrapped]; push.apply(args, arguments); return result.call(this, func.apply(_, args)); }; }); }; var idCounter = 0; _.uniqueId = function(prefix) { var id = ++idCounter + ''; return prefix ? prefix + id : id; }; _.templateSettings = { evaluate : /<%([\s\S]+?)%>/g, interpolate : /<%=([\s\S]+?)%>/g, escape : /<%-([\s\S]+?)%>/g }; var noMatch = /(.)^/; var escapes = { "'": "'", '\\': '\\', '\r': 'r', '\n': 'n', '\t': 't', '\u2028': 'u2028', '\u2029': 'u2029' }; var escaper = /\\|'|\r|\n|\t|\u2028|\u2029/g; _.template = function(text, data, settings) { var render; settings = _.defaults({}, settings, _.templateSettings); var matcher = new RegExp([ (settings.escape || noMatch).source, (settings.interpolate || noMatch).source, (settings.evaluate || noMatch).source ].join('|') + '|$', 'g'); var index = 0; var source = "__p+='"; text.replace(matcher, function(match, escape, interpolate, evaluate, offset) { source += text.slice(index, offset) .replace(escaper, function(match) { return '\\' + escapes[match]; }); if (escape) { source += "'+\n((__t=(" + escape + "))==null?'':_.escape(__t))+\n'"; } if (interpolate) { source += "'+\n((__t=(" + interpolate + "))==null?'':__t)+\n'"; } if (evaluate) { source += "';\n" + evaluate + "\n__p+='"; } index = offset + match.length; return match; }); source += "';\n"; if (!settings.variable) source = 'with(obj||{}){\n' + source + '}\n'; source = "var __t,__p='',__j=Array.prototype.join," + "print=function(){__p+=__j.call(arguments,'');};\n" + source + "return __p;\n"; try { render = new Function(settings.variable || 'obj', '_', source); } catch (e) { e.source = source; throw e; } if (data) return render(data, _); var template = function(data) { return render.call(this, data, _); }; template.source = 'function(' + (settings.variable || 'obj') + '){\n' + source + '}'; return template; }; _.chain = function(obj) { return _(obj).chain(); }; var result = function(obj) { return this._chain ? _(obj).chain() : obj; }; _.mixin(_); each(['pop', 'push', 'reverse', 'shift', 'sort', 'splice', 'unshift'], function(name) { var method = ArrayProto[name]; _.prototype[name] = function() { var obj = this._wrapped; method.apply(obj, arguments); if ((name == 'shift' || name == 'splice') && obj.length === 0) delete obj[0]; return result.call(this, obj); }; }); each(['concat', 'join', 'slice'], function(name) { var method = ArrayProto[name]; _.prototype[name] = function() { return result.call(this, method.apply(this._wrapped, arguments)); }; }); _.extend(_.prototype, { chain: function() { this._chain = true; return this; }, value: function() { return this._wrapped; } }); }).call(this); }, {}], 2:[function(req,module,exports){ var _ = req("underscore"); var errors = { E001: "Bad option: '{a}'.", E002: "Bad option value.", E003: "Expected a JSON value.", E004: "Input is neither a string nor an array of strings.", E005: "Input is empty.", E006: "Unexpected early end of program.", E007: "Missing \"use strict\" statement.", E008: "Strict violation.", E009: "Option 'validthis' can't be used in a global scope.", E010: "'with' is not allowed in strict mode.", E011: "const '{a}' has already been declared.", E012: "const '{a}' is initialized to 'undefined'.", E013: "Attempting to override '{a}' which is a constant.", E014: "A regular expression literal can be confused with '/='.", E015: "Unclosed regular expression.", E016: "Invalid regular expression.", E017: "Unclosed comment.", E018: "Unbegun comment.", E019: "Unmatched '{a}'.", E020: "Expected '{a}' to match '{b}' from line {c} and instead saw '{d}'.", E021: "Expected '{a}' and instead saw '{b}'.", E022: "Line breaking error '{a}'.", E023: "Missing '{a}'.", E024: "Unexpected '{a}'.", E025: "Missing ':' on a case clause.", E026: "Missing '}' to match '{' from line {a}.", E027: "Missing ']' to match '[' form line {a}.", E028: "Illegal comma.", E029: "Unclosed string.", E030: "Expected an identifier and instead saw '{a}'.", E031: "Bad assignment.", // FIXME: Rephrase E032: "Expected a small integer or 'false' and instead saw '{a}'.", E033: "Expected an operator and instead saw '{a}'.", E034: "get/set are ES5 features.", E035: "Missing property name.", E036: "Expected to see a statement and instead saw a block.", E037: null, // Vacant E038: null, // Vacant E039: "Function declarations are not invocable. Wrap the whole function invocation in parens.", E040: "Each value should have its own case label.", E041: "Unrecoverable syntax error.", E042: "Stopping.", E043: "Too many errors.", E044: "'{a}' is already defined and can't be redefined.", E045: "Invalid for each loop.", E046: "A yield statement shall be within a generator function (with syntax: `function*`)", E047: "A generator function shall contain a yield statement.", E048: "Let declaration not directly within block.", E049: "A {a} cannot be named '{b}'.", E050: "Mozilla requires the yield expression to be parenthesized here.", E051: "Regular parameters cannot come after default parameters." }; var warnings = { W001: "'hasOwnProperty' is a really bad name.", W002: "Value of '{a}' may be overwritten in IE 8 and earlier.", W003: "'{a}' was used before it was defined.", W004: "'{a}' is already defined.", W005: "A dot following a number can be confused with a decimal point.", W006: "Confusing minuses.", W007: "Confusing pluses.", W008: "A leading decimal point can be confused with a dot: '{a}'.", W009: "The array literal notation [] is preferrable.", W010: "The object literal notation {} is preferrable.", W011: "Unexpected space after '{a}'.", W012: "Unexpected space before '{a}'.", W013: "Missing space after '{a}'.", W014: "Bad line breaking before '{a}'.", W015: "Expected '{a}' to have an indentation at {b} instead at {c}.", W016: "Unexpected use of '{a}'.", W017: "Bad operand.", W018: "Confusing use of '{a}'.", W019: "Use the isNaN function to compare with NaN.", W020: "Read only.", W021: "'{a}' is a function.", W022: "Do not assign to the exception parameter.", W023: "Expected an identifier in an assignment and instead saw a function invocation.", W024: "Expected an identifier and instead saw '{a}' (a reserved word).", W025: "Missing name in function declaration.", W026: "Inner functions should be listed at the top of the outer function.", W027: "Unreachable '{a}' after '{b}'.", W028: "Label '{a}' on {b} statement.", W030: "Expected an assignment or function call and instead saw an expression.", W031: "Do not use 'new' for side effects.", W032: "Unnecessary semicolon.", W033: "Missing semicolon.", W034: "Unnecessary directive \"{a}\".", W035: "Empty block.", W036: "Unexpected /*member '{a}'.", W037: "'{a}' is a statement label.", W038: "'{a}' used out of scope.", W039: "'{a}' is not allowed.", W040: "Possible strict violation.", W041: "Use '{a}' to compare with '{b}'.", W042: "Avoid EOL escaping.", W043: "Bad escaping of EOL. Use option multistr if needed.", W044: "Bad or unnecessary escaping.", W045: "Bad number '{a}'.", W046: "Don't use extra leading zeros '{a}'.", W047: "A trailing decimal point can be confused with a dot: '{a}'.", W048: "Unexpected control character in regular expression.", W049: "Unexpected escaped character '{a}' in regular expression.", W050: "JavaScript URL.", W051: "Variables should not be deleted.", W052: "Unexpected '{a}'.", W053: "Do not use {a} as a constructor.", W054: "The Function constructor is a form of eval.", W055: "A constructor name should start with an uppercase letter.", W056: "Bad constructor.", W057: "Weird construction. Is 'new' unnecessary?", W058: "Missing '()' invoking a constructor.", W059: "Avoid arguments.{a}.", W060: "document.write can be a form of eval.", W061: "eval can be harmful.", W062: "Wrap an immediate function invocation in parens " + "to assist the reader in understanding that the expression " + "is the result of a function, and not the function itself.", W063: "Math is not a function.", W064: "Missing 'new' prefix when invoking a constructor.", W065: "Missing radix parameter.", W066: "Implied eval. Consider passing a function instead of a string.", W067: "Bad invocation.", W068: "Wrapping non-IIFE function literals in parens is unnecessary.", W069: "['{a}'] is better written in dot notation.", W070: "Extra comma. (it breaks older versions of IE)", W071: "This function has too many statements. ({a})", W072: "This function has too many parameters. ({a})", W073: "Blocks are nested too deeply. ({a})", W074: "This function's cyclomatic complexity is too high. ({a})", W075: "Duplicate key '{a}'.", W076: "Unexpected parameter '{a}' in get {b} function.", W077: "Expected a single parameter in set {a} function.", W078: "Setter is defined without getter.", W079: "Redefinition of '{a}'.", W080: "It's not necessary to initialize '{a}' to 'undefined'.", W081: "Too many var statements.", W082: "Function declarations should not be placed in blocks. " + "Use a function expression or move the statement to the top of " + "the outer function.", W083: "Don't make functions within a loop.", W084: "Assignment in conditional expression", W085: "Don't use 'with'.", W086: "Expected a 'break' statement before '{a}'.", W087: "Forgotten 'debugger' statement?", W088: "Creating global 'for' variable. Should be 'for (var {a} ...'.", W089: "The body of a for in should be wrapped in an if statement to filter " + "unwanted properties from the prototype.", W090: "'{a}' is not a statement label.", W091: "'{a}' is out of scope.", W092: "Wrap the /regexp/ literal in parens to disambiguate the slash operator.", W093: "Did you mean to return a conditional instead of an assignment?", W094: "Unexpected comma.", W095: "Expected a string and instead saw {a}.", W096: "The '{a}' key may produce unexpected results.", W097: "Use the function form of \"use strict\".", W098: "'{a}' is defined but never used.", W099: "Mixed spaces and tabs.", W100: "This character may get silently deleted by one or more browsers.", W101: "Line is too long.", W102: "Trailing whitespace.", W103: "The '{a}' property is deprecated.", W104: "'{a}' is only available in JavaScript 1.7.", W105: "Unexpected {a} in '{b}'.", W106: "Identifier '{a}' is not in camel case.", W107: "Script URL.", W108: "Strings must use doublequote.", W109: "Strings must use singlequote.", W110: "Mixed double and single quotes.", W112: "Unclosed string.", W113: "Control character in string: {a}.", W114: "Avoid {a}.", W115: "Octal literals are not allowed in strict mode.", W116: "Expected '{a}' and instead saw '{b}'.", W117: "'{a}' is not defined.", W118: "'{a}' is only available in Mozilla JavaScript extensions (use moz option).", W119: "'{a}' is only available in ES6 (use esnext option).", W120: "You might be leaking a variable ({a}) here." }; var info = { I001: "Comma warnings can be turned off with 'laxcomma'.", I002: "Reserved words as properties can be used under the 'es5' option.", I003: "ES5 option is now set per default" }; exports.errors = {}; exports.warnings = {}; exports.info = {}; _.each(errors, function (desc, code) { exports.errors[code] = { code: code, desc: desc }; }); _.each(warnings, function (desc, code) { exports.warnings[code] = { code: code, desc: desc }; }); _.each(info, function (desc, code) { exports.info[code] = { code: code, desc: desc }; }); }, {"underscore":1}], 3:[function(req,module,exports){ exports.reservedVars = { arguments : false, NaN : false }; exports.ecmaIdentifiers = { Array : false, Boolean : false, Date : false, decodeURI : false, decodeURIComponent : false, encodeURI : false, encodeURIComponent : false, Error : false, "eval" : false, EvalError : false, Function : false, hasOwnProperty : false, isFinite : false, isNaN : false, JSON : false, Math : false, Map : false, Number : false, Object : false, parseInt : false, parseFloat : false, RangeError : false, ReferenceError : false, RegExp : false, Set : false, String : false, SyntaxError : false, TypeError : false, URIError : false, WeakMap : false }; exports.browser = { ArrayBuffer : false, ArrayBufferView : false, Audio : false, Blob : false, addEventListener : false, applicationCache : false, atob : false, blur : false, btoa : false, clearInterval : false, clearTimeout : false, close : false, closed : false, CustomEvent : false, DataView : false, DOMParser : false, defaultStatus : false, document : false, Element : false, ElementTimeControl : false, event : false, FileReader : false, Float32Array : false, Float64Array : false, FormData : false, focus : false, frames : false, getComputedStyle : false, HTMLElement : false, HTMLAnchorElement : false, HTMLBaseElement : false, HTMLBlockquoteElement: false, HTMLBodyElement : false, HTMLBRElement : false, HTMLButtonElement : false, HTMLCanvasElement : false, HTMLDirectoryElement : false, HTMLDivElement : false, HTMLDListElement : false, HTMLFieldSetElement : false, HTMLFontElement : false, HTMLFormElement : false, HTMLFrameElement : false, HTMLFrameSetElement : false, HTMLHeadElement : false, HTMLHeadingElement : false, HTMLHRElement : false, HTMLHtmlElement : false, HTMLIFrameElement : false, HTMLImageElement : false, HTMLInputElement : false, HTMLIsIndexElement : false, HTMLLabelElement : false, HTMLLayerElement : false, HTMLLegendElement : false, HTMLLIElement : false, HTMLLinkElement : false, HTMLMapElement : false, HTMLMenuElement : false, HTMLMetaElement : false, HTMLModElement : false, HTMLObjectElement : false, HTMLOListElement : false, HTMLOptGroupElement : false, HTMLOptionElement : false, HTMLParagraphElement : false, HTMLParamElement : false, HTMLPreElement : false, HTMLQuoteElement : false, HTMLScriptElement : false, HTMLSelectElement : false, HTMLStyleElement : false, HTMLTableCaptionElement: false, HTMLTableCellElement : false, HTMLTableColElement : false, HTMLTableElement : false, HTMLTableRowElement : false, HTMLTableSectionElement: false, HTMLTextAreaElement : false, HTMLTitleElement : false, HTMLUListElement : false, HTMLVideoElement : false, history : false, Int16Array : false, Int32Array : false, Int8Array : false, Image : false, length : false, localStorage : false, location : false, MessageChannel : false, MessageEvent : false, MessagePort : false, MouseEvent : false, moveBy : false, moveTo : false, MutationObserver : false, name : false, Node : false, NodeFilter : false, navigator : false, onbeforeunload : true, onblur : true, onerror : true, onfocus : true, onload : true, onresize : true, onunload : true, open : false, openDatabase : false, opener : false, Option : false, parent : false, print : false, removeEventListener : false, resizeBy : false, resizeTo : false, screen : false, scroll : false, scrollBy : false, scrollTo : false, sessionStorage : false, setInterval : false, setTimeout : false, SharedWorker : false, status : false, SVGAElement : false, SVGAltGlyphDefElement: false, SVGAltGlyphElement : false, SVGAltGlyphItemElement: false, SVGAngle : false, SVGAnimateColorElement: false, SVGAnimateElement : false, SVGAnimateMotionElement: false, SVGAnimateTransformElement: false, SVGAnimatedAngle : false, SVGAnimatedBoolean : false, SVGAnimatedEnumeration: false, SVGAnimatedInteger : false, SVGAnimatedLength : false, SVGAnimatedLengthList: false, SVGAnimatedNumber : false, SVGAnimatedNumberList: false, SVGAnimatedPathData : false, SVGAnimatedPoints : false, SVGAnimatedPreserveAspectRatio: false, SVGAnimatedRect : false, SVGAnimatedString : false, SVGAnimatedTransformList: false, SVGAnimationElement : false, SVGCSSRule : false, SVGCircleElement : false, SVGClipPathElement : false, SVGColor : false, SVGColorProfileElement: false, SVGColorProfileRule : false, SVGComponentTransferFunctionElement: false, SVGCursorElement : false, SVGDefsElement : false, SVGDescElement : false, SVGDocument : false, SVGElement : false, SVGElementInstance : false, SVGElementInstanceList: false, SVGEllipseElement : false, SVGExternalResourcesRequired: false, SVGFEBlendElement : false, SVGFEColorMatrixElement: false, SVGFEComponentTransferElement: false, SVGFECompositeElement: false, SVGFEConvolveMatrixElement: false, SVGFEDiffuseLightingElement: false, SVGFEDisplacementMapElement: false, SVGFEDistantLightElement: false, SVGFEFloodElement : false, SVGFEFuncAElement : false, SVGFEFuncBElement : false, SVGFEFuncGElement : false, SVGFEFuncRElement : false, SVGFEGaussianBlurElement: false, SVGFEImageElement : false, SVGFEMergeElement : false, SVGFEMergeNodeElement: false, SVGFEMorphologyElement: false, SVGFEOffsetElement : false, SVGFEPointLightElement: false, SVGFESpecularLightingElement: false, SVGFESpotLightElement: false, SVGFETileElement : false, SVGFETurbulenceElement: false, SVGFilterElement : false, SVGFilterPrimitiveStandardAttributes: false, SVGFitToViewBox : false, SVGFontElement : false, SVGFontFaceElement : false, SVGFontFaceFormatElement: false, SVGFontFaceNameElement: false, SVGFontFaceSrcElement: false, SVGFontFaceUriElement: false, SVGForeignObjectElement: false, SVGGElement : false, SVGGlyphElement : false, SVGGlyphRefElement : false, SVGGradientElement : false, SVGHKernElement : false, SVGICCColor : false, SVGImageElement : false, SVGLangSpace : false, SVGLength : false, SVGLengthList : false, SVGLineElement : false, SVGLinearGradientElement: false, SVGLocatable : false, SVGMPathElement : false, SVGMarkerElement : false, SVGMaskElement : false, SVGMatrix : false, SVGMetadataElement : false, SVGMissingGlyphElement: false, SVGNumber : false, SVGNumberList : false, SVGPaint : false, SVGPathElement : false, SVGPathSeg : false, SVGPathSegArcAbs : false, SVGPathSegArcRel : false, SVGPathSegClosePath : false, SVGPathSegCurvetoCubicAbs: false, SVGPathSegCurvetoCubicRel: false, SVGPathSegCurvetoCubicSmoothAbs: false, SVGPathSegCurvetoCubicSmoothRel: false, SVGPathSegCurvetoQuadraticAbs: false, SVGPathSegCurvetoQuadraticRel: false, SVGPathSegCurvetoQuadraticSmoothAbs: false, SVGPathSegCurvetoQuadraticSmoothRel: false, SVGPathSegLinetoAbs : false, SVGPathSegLinetoHorizontalAbs: false, SVGPathSegLinetoHorizontalRel: false, SVGPathSegLinetoRel : false, SVGPathSegLinetoVerticalAbs: false, SVGPathSegLinetoVerticalRel: false, SVGPathSegList : false, SVGPathSegMovetoAbs : false, SVGPathSegMovetoRel : false, SVGPatternElement : false, SVGPoint : false, SVGPointList : false, SVGPolygonElement : false, SVGPolylineElement : false, SVGPreserveAspectRatio: false, SVGRadialGradientElement: false, SVGRect : false, SVGRectElement : false, SVGRenderingIntent : false, SVGSVGElement : false, SVGScriptElement : false, SVGSetElement : false, SVGStopElement : false, SVGStringList : false, SVGStylable : false, SVGStyleElement : false, SVGSwitchElement : false, SVGSymbolElement : false, SVGTRefElement : false, SVGTSpanElement : false, SVGTests : false, SVGTextContentElement: false, SVGTextElement : false, SVGTextPathElement : false, SVGTextPositioningElement: false, SVGTitleElement : false, SVGTransform : false, SVGTransformList : false, SVGTransformable : false, SVGURIReference : false, SVGUnitTypes : false, SVGUseElement : false, SVGVKernElement : false, SVGViewElement : false, SVGViewSpec : false, SVGZoomAndPan : false, TimeEvent : false, top : false, Uint16Array : false, Uint32Array : false, Uint8Array : false, Uint8ClampedArray : false, WebSocket : false, window : false, Worker : false, XMLHttpRequest : false, XMLSerializer : false, XPathEvaluator : false, XPathException : false, XPathExpression : false, XPathNamespace : false, XPathNSResolver : false, XPathResult : false }; exports.devel = { alert : false, confirm: false, console: false, Debug : false, opera : false, prompt : false }; exports.worker = { importScripts: true, postMessage : true, self : true }; exports.nonstandard = { escape : false, unescape: false }; exports.couch = { "require" : false, respond : false, getRow : false, emit : false, send : false, start : false, sum : false, log : false, exports : false, module : false, provides : false }; exports.node = { __filename : false, __dirname : false, Buffer : false, DataView : false, console : false, exports : true, // In Node it is ok to exports = module.exports = foo(); GLOBAL : false, global : false, module : false, process : false, require : false, setTimeout : false, clearTimeout : false, setInterval : false, clearInterval : false, setImmediate : false, // v0.9.1+ clearImmediate: false // v0.9.1+ }; exports.phantom = { phantom : true, require : true, WebPage : true }; exports.rhino = { defineClass : false, deserialize : false, gc : false, help : false, importPackage: false, "java" : false, load : false, loadClass : false, print : false, quit : false, readFile : false, readUrl : false, runCommand : false, seal : false, serialize : false, spawn : false, sync : false, toint32 : false, version : false }; exports.shelljs = { target : false, echo : false, exit : false, cd : false, pwd : false, ls : false, find : false, cp : false, rm : false, mv : false, mkdir : false, test : false, cat : false, sed : false, grep : false, which : false, dirs : false, pushd : false, popd : false, env : false, exec : false, chmod : false, config : false, error : false, tempdir : false }; exports.wsh = { ActiveXObject : true, Enumerator : true, GetObject : true, ScriptEngine : true, ScriptEngineBuildVersion : true, ScriptEngineMajorVersion : true, ScriptEngineMinorVersion : true, VBArray : true, WSH : true, WScript : true, XDomainRequest : true }; exports.dojo = { dojo : false, dijit : false, dojox : false, define : false, "require": false }; exports.jquery = { "$" : false, jQuery : false }; exports.mootools = { "$" : false, "$$" : false, Asset : false, Browser : false, Chain : false, Class : false, Color : false, Cookie : false, Core : false, Document : false, DomReady : false, DOMEvent : false, DOMReady : false, Drag : false, Element : false, Elements : false, Event : false, Events : false, Fx : false, Group : false, Hash : false, HtmlTable : false, Iframe : false, IframeShim : false, InputValidator: false, instanceOf : false, Keyboard : false, Locale : false, Mask : false, MooTools : false, Native : false, Options : false, OverText : false, Request : false, Scroller : false, Slick : false, Slider : false, Sortables : false, Spinner : false, Swiff : false, Tips : false, Type : false, typeOf : false, URI : false, Window : false }; exports.prototypejs = { "$" : false, "$$" : false, "$A" : false, "$F" : false, "$H" : false, "$R" : false, "$break" : false, "$continue" : false, "$w" : false, Abstract : false, Ajax : false, Class : false, Enumerable : false, Element : false, Event : false, Field : false, Form : false, Hash : false, Insertion : false, ObjectRange : false, PeriodicalExecuter: false, Position : false, Prototype : false, Selector : false, Template : false, Toggle : false, Try : false, Autocompleter : false, Builder : false, Control : false, Draggable : false, Draggables : false, Droppables : false, Effect : false, Sortable : false, SortableObserver : false, Sound : false, Scriptaculous : false }; exports.yui = { YUI : false, Y : false, YUI_config: false }; }, {}], "n4bKNg":[function(req,module,exports){ var _ = req("underscore"); var events = req("events"); var vars = req("../shared/vars.js"); var messages = req("../shared/messages.js"); var Lexer = req("./lex.js").Lexer; var reg = req("./reg.js"); var state = req("./state.js").state; var style = req("./style.js"); var console = req("console-browserify"); var JSHINT = (function () { var anonname, // The guessed name for anonymous functions. api, // Extension API bang = { "<" : true, "<=" : true, "==" : true, "===": true, "!==": true, "!=" : true, ">" : true, ">=" : true, "+" : true, "-" : true, "*" : true, "/" : true, "%" : true }, boolOptions = { asi : true, // if automatic semicolon insertion should be tolerated bitwise : true, // if bitwise operators should not be allowed boss : true, // if advanced usage of assignments should be allowed browser : true, // if the standard browser globals should be predefined camelcase : true, // if identifiers should be required in camel case couch : true, // if CouchDB globals should be predefined curly : true, // if curly braces around all blocks should be required debug : true, // if debugger statements should be allowed devel : true, // if logging globals should be predefined (console, alert, etc.) dojo : true, // if Dojo Toolkit globals should be predefined eqeqeq : true, // if === should be required eqnull : true, // if == null comparisons should be tolerated es3 : true, // if ES3 syntax should be allowed es5 : true, // if ES5 syntax should be allowed (is now set per default) esnext : true, // if es.next specific syntax should be allowed moz : true, // if mozilla specific syntax should be allowed evil : true, // if eval should be allowed expr : true, // if ExpressionStatement should be allowed as Programs forin : true, // if for in statements must filter funcscope : true, // if only function scope should be used for scope tests gcl : true, // if JSHint should be compatible with Google Closure Linter globalstrict: true, // if global should be allowed (also enables 'strict') immed : true, // if immediate invocations must be wrapped in parens iterator : true, // if the `__iterator__` property should be allowed jquery : true, // if jQuery globals should be predefined lastsemic : true, // if semicolons may be ommitted for the trailing laxbreak : true, // if line breaks should not be checked laxcomma : true, // if line breaks should not be checked around commas loopfunc : true, // if functions should be allowed to be defined within mootools : true, // if MooTools globals should be predefined multistr : true, // allow multiline strings newcap : true, // if constructor names must be capitalized noarg : true, // if arguments.caller and arguments.callee should be node : true, // if the Node.js environment globals should be noempty : true, // if empty blocks should be disallowed nonew : true, // if using `new` for side-effects should be disallowed nonstandard : true, // if non-standard (but widely adopted) globals should nomen : true, // if names should be checked onevar : true, // if only one var statement per function should be passfail : true, // if the scan should stop on first error phantom : true, // if PhantomJS symbols should be allowed plusplus : true, // if increment/decrement should not be allowed proto : true, // if the `__proto__` property should be allowed prototypejs : true, // if Prototype and Scriptaculous globals should be rhino : true, // if the Rhino environment globals should be predefined shelljs : true, // if ShellJS globals should be predefined undef : true, // if variables should be declared before used scripturl : true, // if script-targeted URLs should be tolerated shadow : true, // if variable shadowing should be tolerated smarttabs : true, // if smarttabs should be tolerated strict : true, // require the pragma sub : true, // if all forms of subscript notation are tolerated supernew : true, // if `new function () { ... };` and `new Object;` trailing : true, // if trailing whitespace rules apply validthis : true, // if 'this' inside a non-constructor function is valid. withstmt : true, // if with statements should be allowed white : true, // if strict whitespace rules apply worker : true, // if Web Worker script symbols should be allowed wsh : true, // if the Windows Scripting Host environment globals yui : true, // YUI variables should be predefined onecase : true, // if one case switch statements should be allowed regexp : true, // if the . should not be allowed in regexp literals regexdash : true // if unescaped first/last dash (-) inside brackets }, valOptions = { maxlen : false, indent : false, maxerr : false, predef : false, quotmark : false, //'single'|'double'|true scope : false, maxstatements: false, // {int} max statements per function maxdepth : false, // {int} max nested block depth per function maxparams : false, // {int} max params per function maxcomplexity: false, // {int} max cyclomatic complexity per function unused : true, // warn if variables are unused. Available options: latedef : false // warn if the variable is used before its definition }, invertedOptions = { bitwise : true, forin : true, newcap : true, nomen : true, plusplus: true, regexp : true, undef : true, white : true, eqeqeq : true, onevar : true, strict : true }, renamedOptions = { eqeq : "eqeqeq", vars : "onevar", windows: "wsh", sloppy : "strict" }, declared, // Globals that were declared using /*global ... */ syntax. exported, // Variables that are used outside of the current file. functionicity = [ "closure", "exception", "global", "label", "outer", "unused", "var" ], funct, // The current function functions, // All of the functions global, // The global scope implied, // Implied globals inblock, indent, lookahead, lex, member, membersOnly, noreach, predefined, // Global variables defined by option scope, // The current scope stack, unuseds, urls, warnings, extraModules = [], emitter = new events.EventEmitter(); function checkOption(name, t) { name = name.trim(); if (/^[+-]W\d{3}$/g.test(name)) { return true; } if (valOptions[name] === undefined && boolOptions[name] === undefined) { if (t.type !== "jslint") { error("E001", t, name); return false; } } return true; } function isString(obj) { return Object.prototype.toString.call(obj) === "[object String]"; } function isIdentifier(tkn, value) { if (!tkn) return false; if (!tkn.identifier || tkn.value !== value) return false; return true; } function isReserved(token) { if (!token.reserved) { return false; } var meta = token.meta; if (meta && meta.isFutureReservedWord && state.option.inES5()) { if (!meta.es5) { return false; } if (meta.strictOnly) { if (!state.option.strict && !state.directive["use strict"]) { return false; } } if (token.isProperty) { return false; } } return true; } function supplant(str, data) { return str.replace(/\{([^{}]*)\}/g, function (a, b) { var r = data[b]; return typeof r === "string" || typeof r === "number" ? r : a; }); } function combine(t, o) { var n; for (n in o) { if (_.has(o, n) && !_.has(JSHINT.blacklist, n)) { t[n] = o[n]; } } } function updatePredefined() { Object.keys(JSHINT.blacklist).forEach(function (key) { delete predefined[key]; }); } function assume() { if (state.option.couch) { combine(predefined, vars.couch); } if (state.option.rhino) { combine(predefined, vars.rhino); } if (state.option.shelljs) { combine(predefined, vars.shelljs); combine(predefined, vars.node); } if (state.option.phantom) { combine(predefined, vars.phantom); } if (state.option.prototypejs) { combine(predefined, vars.prototypejs); } if (state.option.node) { combine(predefined, vars.node); } if (state.option.devel) { combine(predefined, vars.devel); } if (state.option.dojo) { combine(predefined, vars.dojo); } if (state.option.browser) { combine(predefined, vars.browser); } if (state.option.nonstandard) { combine(predefined, vars.nonstandard); } if (state.option.jquery) { combine(predefined, vars.jquery); } if (state.option.mootools) { combine(predefined, vars.mootools); } if (state.option.worker) { combine(predefined, vars.worker); } if (state.option.wsh) { combine(predefined, vars.wsh); } if (state.option.globalstrict && state.option.strict !== false) { state.option.strict = true; } if (state.option.yui) { combine(predefined, vars.yui); } state.option.inMoz = function (strict) { return state.option.moz; }; state.option.inESNext = function (strict) { return state.option.moz || state.option.esnext; }; state.option.inES5 = function (/* strict */) { return !state.option.es3; }; state.option.inES3 = function (strict) { if (strict) { return !state.option.moz && !state.option.esnext && state.option.es3; } return state.option.es3; }; } function quit(code, line, chr) { var percentage = Math.floor((line / state.lines.length) * 100); var message = messages.errors[code].desc; throw { name: "JSHintError", line: line, character: chr, message: message + " (" + percentage + "% scanned).", raw: message, code: code }; } function isundef(scope, code, token, a) { return JSHINT.undefs.push([scope, code, token, a]); } function warning(code, t, a, b, c, d) { var ch, l, w, msg; if (/^W\d{3}$/.test(code)) { if (state.ignored[code]) return; msg = messages.warnings[code]; } else if (/E\d{3}/.test(code)) { msg = messages.errors[code]; } else if (/I\d{3}/.test(code)) { msg = messages.info[code]; } t = t || state.tokens.next; if (t.id === "(end)") { // `~ t = state.tokens.curr; } l = t.line || 0; ch = t.from || 0; w = { id: "(error)", raw: msg.desc, code: msg.code, evidence: state.lines[l - 1] || "", line: l, character: ch, scope: JSHINT.scope, a: a, b: b, c: c, d: d }; w.reason = supplant(msg.desc, w); JSHINT.errors.push(w); if (state.option.passfail) { quit("E042", l, ch); } warnings += 1; if (warnings >= state.option.maxerr) { quit("E043", l, ch); } return w; } function warningAt(m, l, ch, a, b, c, d) { return warning(m, { line: l, from: ch }, a, b, c, d); } function error(m, t, a, b, c, d) { warning(m, t, a, b, c, d); } function errorAt(m, l, ch, a, b, c, d) { return error(m, { line: l, from: ch }, a, b, c, d); } function addInternalSrc(elem, src) { var i; i = { id: "(internal)", elem: elem, value: src }; JSHINT.internals.push(i); return i; } function addlabel(t, type, tkn, islet) { if (type === "exception") { if (_.has(funct["(context)"], t)) { if (funct[t] !== true && !state.option.node) { warning("W002", state.tokens.next, t); } } } if (_.has(funct, t) && !funct["(global)"]) { if (funct[t] === true) { if (state.option.latedef) { if ((state.option.latedef === true && _.contains([funct[t], type], "unction")) || !_.contains([funct[t], type], "unction")) { warning("W003", state.tokens.next, t); } } } else { if (!state.option.shadow && type !== "exception" || (funct["(blockscope)"].getlabel(t))) { warning("W004", state.tokens.next, t); } } } if (funct["(blockscope)"] && funct["(blockscope)"].current.has(t)) { error("E044", state.tokens.next, t); } if (islet) { funct["(blockscope)"].current.add(t, type, state.tokens.curr); } else { funct[t] = type; if (tkn) { funct["(tokens)"][t] = tkn; } if (funct["(global)"]) { global[t] = funct; if (_.has(implied, t)) { if (state.option.latedef) { if ((state.option.latedef === true && _.contains([funct[t], type], "unction")) || !_.contains([funct[t], type], "unction")) { warning("W003", state.tokens.next, t); } } delete implied[t]; } } else { scope[t] = funct; } } } function doOption() { var nt = state.tokens.next; var body = nt.body.match(/(-\s+)?[^\s,]+(?:\s*:\s*(-\s+)?[^\s,]+)?/g); var predef = {}; if (nt.type === "globals") { body.forEach(function (g) { g = g.split(":"); var key = (g[0] || "").trim(); var val = (g[1] || "").trim(); if (key.charAt(0) === "-") { key = key.slice(1); val = false; JSHINT.blacklist[key] = key; updatePredefined(); } else { predef[key] = (val === "true"); } }); combine(predefined, predef); for (var key in predef) { if (_.has(predef, key)) { declared[key] = nt; } } } if (nt.type === "exported") { body.forEach(function (e) { exported[e] = true; }); } if (nt.type === "members") { membersOnly = membersOnly || {}; body.forEach(function (m) { var ch1 = m.charAt(0); var ch2 = m.charAt(m.length - 1); if (ch1 === ch2 && (ch1 === "\"" || ch1 === "'")) { m = m .substr(1, m.length - 2) .replace("\\b", "\b") .replace("\\t", "\t") .replace("\\n", "\n") .replace("\\v", "\v") .replace("\\f", "\f") .replace("\\r", "\r") .replace("\\\\", "\\") .replace("\\\"", "\""); } membersOnly[m] = false; }); } var numvals = [ "maxstatements", "maxparams", "maxdepth", "maxcomplexity", "maxerr", "maxlen", "indent" ]; if (nt.type === "jshint" || nt.type === "jslint") { body.forEach(function (g) { g = g.split(":"); var key = (g[0] || "").trim(); var val = (g[1] || "").trim(); if (!checkOption(key, nt)) { return; } if (numvals.indexOf(key) >= 0) { if (val !== "false") { val = +val; if (typeof val !== "number" || !isFinite(val) || val <= 0 || Math.floor(val) !== val) { error("E032", nt, g[1].trim()); return; } if (key === "indent") { state.option["(explicitIndent)"] = true; } state.option[key] = val; } else { if (key === "indent") { state.option["(explicitIndent)"] = false; } else { state.option[key] = false; } } return; } if (key === "validthis") { if (funct["(global)"]) { error("E009"); } else { if (val === "true" || val === "false") { state.option.validthis = (val === "true"); } else { error("E002", nt); } } return; } if (key === "quotmark") { switch (val) { case "true": case "false": state.option.quotmark = (val === "true"); break; case "double": case "single": state.option.quotmark = val; break; default: error("E002", nt); } return; } if (key === "unused") { switch (val) { case "true": state.option.unused = true; break; case "false": state.option.unused = false; break; case "vars": case "strict": state.option.unused = val; break; default: error("E002", nt); } return; } if (key === "latedef") { switch (val) { case "true": state.option.latedef = true; break; case "false": state.option.latedef = false; break; case "nofunc": state.option.latedef = "nofunc"; break; default: error("E002", nt); } return; } var match = /^([+-])(W\d{3})$/g.exec(key); if (match) { state.ignored[match[2]] = (match[1] === "-"); return; } var tn; if (val === "true" || val === "false") { if (nt.type === "jslint") { tn = renamedOptions[key] || key; state.option[tn] = (val === "true"); if (invertedOptions[tn] !== undefined) { state.option[tn] = !state.option[tn]; } } else { state.option[key] = (val === "true"); } if (key === "newcap") { state.option["(explicitNewcap)"] = true; } return; } error("E002", nt); }); assume(); } } function peek(p) { var i = p || 0, j = 0, t; while (j <= i) { t = lookahead[j]; if (!t) { t = lookahead[j] = lex.token(); } j += 1; } return t; } function advance(id, t) { switch (state.tokens.curr.id) { case "(number)": if (state.tokens.next.id === ".") { warning("W005", state.tokens.curr); } break; case "-": if (state.tokens.next.id === "-" || state.tokens.next.id === "--") { warning("W006"); } break; case "+": if (state.tokens.next.id === "+" || state.tokens.next.id === "++") { warning("W007"); } break; } if (state.tokens.curr.type === "(string)" || state.tokens.curr.identifier) { anonname = state.tokens.curr.value; } if (id && state.tokens.next.id !== id) { if (t) { if (state.tokens.next.id === "(end)") { error("E019", t, t.id); } else { error("E020", state.tokens.next, id, t.id, t.line, state.tokens.next.value); } } else if (state.tokens.next.type !== "(identifier)" || state.tokens.next.value !== id) { warning("W116", state.tokens.next, id, state.tokens.next.value); } } state.tokens.prev = state.tokens.curr; state.tokens.curr = state.tokens.next; for (;;) { state.tokens.next = lookahead.shift() || lex.token(); if (!state.tokens.next) { // No more tokens left, give up quit("E041", state.tokens.curr.line); } if (state.tokens.next.id === "(end)" || state.tokens.next.id === "(error)") { return; } if (state.tokens.next.check) { state.tokens.next.check(); } if (state.tokens.next.isSpecial) { doOption(); } else { if (state.tokens.next.id !== "(endline)") { break; } } } } function isInfix(token) { return token.infix || (!token.identifier && !!token.led); } function isEndOfExpr() { var curr = state.tokens.curr; var next = state.tokens.next; if (next.id === ";" || next.id === "}" || next.id === ":") { return true; } if (isInfix(next) === isInfix(curr) || (curr.id === "yield" && state.option.inMoz(true))) { return curr.line !== next.line; } return false; } function expression(rbp, initial) { var left, isArray = false, isObject = false, isLetExpr = false; if (!initial && state.tokens.next.value === "let" && peek(0).value === "(") { if (!state.option.inMoz(true)) { warning("W118", state.tokens.next, "let expressions"); } isLetExpr = true; funct["(blockscope)"].stack(); advance("let"); advance("("); state.syntax["let"].fud.call(state.syntax["let"].fud, false); advance(")"); } if (state.tokens.next.id === "(end)") error("E006", state.tokens.curr); advance(); if (initial) { anonname = "anonymous"; funct["(verb)"] = state.tokens.curr.value; } if (initial === true && state.tokens.curr.fud) { left = state.tokens.curr.fud(); } else { if (state.tokens.curr.nud) { left = state.tokens.curr.nud(); } else { error("E030", state.tokens.curr, state.tokens.curr.id); } while (rbp < state.tokens.next.lbp && !isEndOfExpr()) { isArray = state.tokens.curr.value === "Array"; isObject = state.tokens.curr.value === "Object"; if (left && (left.value || (left.first && left.first.value))) { if (left.value !== "new" || (left.first && left.first.value && left.first.value === ".")) { isArray = false; if (left.value !== state.tokens.curr.value) { isObject = false; } } } advance(); if (isArray && state.tokens.curr.id === "(" && state.tokens.next.id === ")") { warning("W009", state.tokens.curr); } if (isObject && state.tokens.curr.id === "(" && state.tokens.next.id === ")") { warning("W010", state.tokens.curr); } if (left && state.tokens.curr.led) { left = state.tokens.curr.led(left); } else { error("E033", state.tokens.curr, state.tokens.curr.id); } } } if (isLetExpr) { funct["(blockscope)"].unstack(); } return left; } function adjacent(left, right) { left = left || state.tokens.curr; right = right || state.tokens.next; if (state.option.white) { if (left.character !== right.from && left.line === right.line) { left.from += (left.character - left.from); warning("W011", left, left.value); } } } function nobreak(left, right) { left = left || state.tokens.curr; right = right || state.tokens.next; if (state.option.white && (left.character !== right.from || left.line !== right.line)) { warning("W012", right, right.value); } } function nospace(left, right) { left = left || state.tokens.curr; right = right || state.tokens.next; if (state.option.white && !left.comment) { if (left.line === right.line) { adjacent(left, right); } } } function nonadjacent(left, right) { if (state.option.white) { left = left || state.tokens.curr; right = right || state.tokens.next; if (left.value === ";" && right.value === ";") { return; } if (left.line === right.line && left.character === right.from) { left.from += (left.character - left.from); warning("W013", left, left.value); } } } function nobreaknonadjacent(left, right) { left = left || state.tokens.curr; right = right || state.tokens.next; if (!state.option.laxbreak && left.line !== right.line) { warning("W014", right, right.value); } else if (state.option.white) { left = left || state.tokens.curr; right = right || state.tokens.next; if (left.character === right.from) { left.from += (left.character - left.from); warning("W013", left, left.value); } } } function indentation(bias) { if (!state.option.white && !state.option["(explicitIndent)"]) { return; } if (state.tokens.next.id === "(end)") { return; } var i = indent + (bias || 0); if (state.tokens.next.from !== i) { warning("W015", state.tokens.next, state.tokens.next.value, i, state.tokens.next.from); } } function nolinebreak(t) { t = t || state.tokens.curr; if (t.line !== state.tokens.next.line) { warning("E022", t, t.value); } } function nobreakcomma(left, right) { if (left.line !== right.line) { if (!state.option.laxcomma) { if (comma.first) { warning("I001"); comma.first = false; } warning("W014", left, right.value); } } else if (!left.comment && left.character !== right.from && state.option.white) { left.from += (left.character - left.from); warning("W011", left, left.value); } } function comma(opts) { opts = opts || {}; if (!opts.peek) { nobreakcomma(state.tokens.curr, state.tokens.next); advance(","); } else { nobreakcomma(state.tokens.prev, state.tokens.curr); } if (state.tokens.next.value !== "]" && state.tokens.next.value !== "}") { nonadjacent(state.tokens.curr, state.tokens.next); } if (state.tokens.next.identifier && !(opts.property && state.option.inES5())) { switch (state.tokens.next.value) { case "break": case "case": case "catch": case "continue": case "default": case "do": case "else": case "finally": case "for": case "if": case "in": case "instanceof": case "return": case "switch": case "throw": case "try": case "var": case "let": case "while": case "with": error("E024", state.tokens.next, state.tokens.next.value); return false; } } if (state.tokens.next.type === "(punctuator)") { switch (state.tokens.next.value) { case "}": case "]": case ",": if (opts.allowTrailing) { return true; } case ")": error("E024", state.tokens.next, state.tokens.next.value); return false; } } return true; } function symbol(s, p) { var x = state.syntax[s]; if (!x || typeof x !== "object") { state.syntax[s] = x = { id: s, lbp: p, value: s }; } return x; } function delim(s) { return symbol(s, 0); } function stmt(s, f) { var x = delim(s); x.identifier = x.reserved = true; x.fud = f; return x; } function blockstmt(s, f) { var x = stmt(s, f); x.block = true; return x; } function reserveName(x) { var c = x.id.charAt(0); if ((c >= "a" && c <= "z") || (c >= "A" && c <= "Z")) { x.identifier = x.reserved = true; } return x; } function prefix(s, f) { var x = symbol(s, 150); reserveName(x); x.nud = (typeof f === "function") ? f : function () { this.right = expression(150); this.arity = "unary"; if (this.id === "++" || this.id === "--") { if (state.option.plusplus) { warning("W016", this, this.id); } else if ((!this.right.identifier || isReserved(this.right)) && this.right.id !== "." && this.right.id !== "[") { warning("W017", this); } } return this; }; return x; } function type(s, f) { var x = delim(s); x.type = s; x.nud = f; return x; } function reserve(name, func) { var x = type(name, func); x.identifier = true; x.reserved = true; return x; } function FutureReservedWord(name, meta) { var x = type(name, (meta && meta.nud) || function () { return this; }); meta = meta || {}; meta.isFutureReservedWord = true; x.value = name; x.identifier = true; x.reserved = true; x.meta = meta; return x; } function reservevar(s, v) { return reserve(s, function () { if (typeof v === "function") { v(this); } return this; }); } function infix(s, f, p, w) { var x = symbol(s, p); reserveName(x); x.infix = true; x.led = function (left) { if (!w) { nobreaknonadjacent(state.tokens.prev, state.tokens.curr); nonadjacent(state.tokens.curr, state.tokens.next); } if (s === "in" && left.id === "!") { warning("W018", left, "!"); } if (typeof f === "function") { return f(left, this); } else { this.left = left; this.right = expression(p); return this; } }; return x; } function application(s) { var x = symbol(s, 42); x.led = function (left) { if (!state.option.inESNext()) { warning("W104", state.tokens.curr, "arrow function syntax (=>)"); } nobreaknonadjacent(state.tokens.prev, state.tokens.curr); nonadjacent(state.tokens.curr, state.tokens.next); this.left = left; this.right = doFunction(undefined, undefined, false, left); return this; }; return x; } function relation(s, f) { var x = symbol(s, 100); x.led = function (left) { nobreaknonadjacent(state.tokens.prev, state.tokens.curr); nonadjacent(state.tokens.curr, state.tokens.next); var right = expression(100); if (isIdentifier(left, "NaN") || isIdentifier(right, "NaN")) { warning("W019", this); } else if (f) { f.apply(this, [left, right]); } if (!left || !right) { quit("E041", state.tokens.curr.line); } if (left.id === "!") { warning("W018", left, "!"); } if (right.id === "!") { warning("W018", right, "!"); } this.left = left; this.right = right; return this; }; return x; } function isPoorRelation(node) { return node && ((node.type === "(number)" && +node.value === 0) || (node.type === "(string)" && node.value === "") || (node.type === "null" && !state.option.eqnull) || node.type === "true" || node.type === "false" || node.type === "undefined"); } function assignop(s, f, p) { var x = infix(s, typeof f === "function" ? f : function (left, that) { that.left = left; if (left) { if (predefined[left.value] === false && scope[left.value]["(global)"] === true) { warning("W020", left); } else if (left["function"]) { warning("W021", left, left.value); } if (funct[left.value] === "const") { error("E013", left, left.value); } if (left.id === ".") { if (!left.left) { warning("E031", that); } else if (left.left.value === "arguments" && !state.directive["use strict"]) { warning("E031", that); } that.right = expression(10); return that; } else if (left.id === "[") { if (state.tokens.curr.left.first) { state.tokens.curr.left.first.forEach(function (t) { if (funct[t.value] === "const") { error("E013", t, t.value); } }); } else if (!left.left) { warning("E031", that); } else if (left.left.value === "arguments" && !state.directive["use strict"]) { warning("E031", that); } that.right = expression(10); return that; } else if (left.identifier && !isReserved(left)) { if (funct[left.value] === "exception") { warning("W022", left); } that.right = expression(10); return that; } if (left === state.syntax["function"]) { warning("W023", state.tokens.curr); } } error("E031", that); }, p); x.exps = true; x.assign = true; return x; } function bitwise(s, f, p) { var x = symbol(s, p); reserveName(x); x.led = (typeof f === "function") ? f : function (left) { if (state.option.bitwise) { warning("W016", this, this.id); } this.left = left; this.right = expression(p); return this; }; return x; } function bitwiseassignop(s) { return assignop(s, function (left, that) { if (state.option.bitwise) { warning("W016", that, that.id); } nonadjacent(state.tokens.prev, state.tokens.curr); nonadjacent(state.tokens.curr, state.tokens.next); if (left) { if (left.id === "." || left.id === "[" || (left.identifier && !isReserved(left))) { expression(10); return that; } if (left === state.syntax["function"]) { warning("W023", state.tokens.curr); } return that; } error("E031", that); }, 20); } function suffix(s) { var x = symbol(s, 150); x.led = function (left) { if (state.option.plusplus) { warning("W016", this, this.id); } else if ((!left.identifier || isReserved(left)) && left.id !== "." && left.id !== "[") { warning("W017", this); } this.left = left; return this; }; return x; } function optionalidentifier(fnparam, prop) { if (!state.tokens.next.identifier) { return; } advance(); var curr = state.tokens.curr; var val = state.tokens.curr.value; if (!isReserved(curr)) { return val; } if (prop) { if (state.option.inES5()) { return val; } } if (fnparam && val === "undefined") { return val; } if (prop && !api.getCache("displayed:I002")) { api.setCache("displayed:I002", true); warning("I002"); } warning("W024", state.tokens.curr, state.tokens.curr.id); return val; } function identifier(fnparam, prop) { var i = optionalidentifier(fnparam, prop); if (i) { return i; } if (state.tokens.curr.id === "function" && state.tokens.next.id === "(") { warning("W025"); } else { error("E030", state.tokens.next, state.tokens.next.value); } } function reachable(s) { var i = 0, t; if (state.tokens.next.id !== ";" || noreach) { return; } for (;;) { t = peek(i); if (t.reach) { return; } if (t.id !== "(endline)") { if (t.id === "function") { if (!state.option.latedef) { break; } warning("W026", t); break; } warning("W027", t, t.value, s); break; } i += 1; } } function statement(noindent) { var values; var i = indent, r, s = scope, t = state.tokens.next; if (t.id === ";") { advance(";"); return; } var res = isReserved(t); if (res && t.meta && t.meta.isFutureReservedWord && peek().id === ":") { warning("W024", t, t.id); res = false; } if (_.has(["[", "{"], t.value)) { if (lookupBlockType().isDestAssign) { if (!state.option.inESNext()) { warning("W104", state.tokens.curr, "destructuring expression"); } values = destructuringExpression(); values.forEach(function (tok) { isundef(funct, "W117", tok.token, tok.id); }); advance("="); destructuringExpressionMatch(values, expression(10, true)); advance(";"); return; } } if (t.identifier && !res && peek().id === ":") { advance(); advance(":"); scope = Object.create(s); addlabel(t.value, "label"); if (!state.tokens.next.labelled && state.tokens.next.value !== "{") { warning("W028", state.tokens.next, t.value, state.tokens.next.value); } state.tokens.next.label = t.value; t = state.tokens.next; } if (t.id === "{") { block(true, true); return; } if (!noindent) { indentation(); } r = expression(0, true); if (!t.block) { if (!state.option.expr && (!r || !r.exps)) { warning("W030", state.tokens.curr); } else if (state.option.nonew && r && r.left && r.id === "(" && r.left.id === "new") { warning("W031", t); } if (state.tokens.next.id !== ";") { if (!state.option.asi) { if (!state.option.lastsemic || state.tokens.next.id !== "}" || state.tokens.next.line !== state.tokens.curr.line) { warningAt("W033", state.tokens.curr.line, state.tokens.curr.character); } } } else { adjacent(state.tokens.curr, state.tokens.next); advance(";"); nonadjacent(state.tokens.curr, state.tokens.next); } } indent = i; scope = s; return r; } function statements(startLine) { var a = [], p; while (!state.tokens.next.reach && state.tokens.next.id !== "(end)") { if (state.tokens.next.id === ";") { p = peek(); if (!p || (p.id !== "(" && p.id !== "[")) { warning("W032"); } advance(";"); } else { a.push(statement(startLine === state.tokens.next.line)); } } return a; } function directives() { var i, p, pn; for (;;) { if (state.tokens.next.id === "(string)") { p = peek(0); if (p.id === "(endline)") { i = 1; do { pn = peek(i); i = i + 1; } while (pn.id === "(endline)"); if (pn.id !== ";") { if (pn.id !== "(string)" && pn.id !== "(number)" && pn.id !== "(regexp)" && pn.identifier !== true && pn.id !== "}") { break; } warning("W033", state.tokens.next); } else { p = pn; } } else if (p.id === "}") { warning("W033", p); } else if (p.id !== ";") { break; } indentation(); advance(); if (state.directive[state.tokens.curr.value]) { warning("W034", state.tokens.curr, state.tokens.curr.value); } if (state.tokens.curr.value === "use strict") { if (!state.option["(explicitNewcap)"]) state.option.newcap = true; state.option.undef = true; } state.directive[state.tokens.curr.value] = true; if (p.id === ";") { advance(";"); } continue; } break; } } function block(ordinary, stmt, isfunc, isfatarrow) { var a, b = inblock, old_indent = indent, m, s = scope, t, line, d; inblock = ordinary; if (!ordinary || !state.option.funcscope) scope = Object.create(scope); nonadjacent(state.tokens.curr, state.tokens.next); t = state.tokens.next; var metrics = funct["(metrics)"]; metrics.nestedBlockDepth += 1; metrics.verifyMaxNestedBlockDepthPerFunction(); if (state.tokens.next.id === "{") { advance("{"); funct["(blockscope)"].stack(); line = state.tokens.curr.line; if (state.tokens.next.id !== "}") { indent += state.option.indent; while (!ordinary && state.tokens.next.from > indent) { indent += state.option.indent; } if (isfunc) { m = {}; for (d in state.directive) { if (_.has(state.directive, d)) { m[d] = state.directive[d]; } } directives(); if (state.option.strict && funct["(context)"]["(global)"]) { if (!m["use strict"] && !state.directive["use strict"]) { warning("E007"); } } } a = statements(line); metrics.statementCount += a.length; if (isfunc) { state.directive = m; } indent -= state.option.indent; if (line !== state.tokens.next.line) { indentation(); } } else if (line !== state.tokens.next.line) { indentation(); } advance("}", t); funct["(blockscope)"].unstack(); indent = old_indent; } else if (!ordinary) { if (isfunc) { m = {}; if (stmt && !isfatarrow && !state.option.inMoz(true)) { error("W118", state.tokens.curr, "function closure expressions"); } if (!stmt) { for (d in state.directive) { if (_.has(state.directive, d)) { m[d] = state.directive[d]; } } } expression(10); if (state.option.strict && funct["(context)"]["(global)"]) { if (!m["use strict"] && !state.directive["use strict"]) { warning("E007"); } } } else { error("E021", state.tokens.next, "{", state.tokens.next.value); } } else { funct["(nolet)"] = true; if (!stmt || state.option.curly) { warning("W116", state.tokens.next, "{", state.tokens.next.value); } noreach = true; indent += state.option.indent; a = [statement(state.tokens.next.line === state.tokens.curr.line)]; indent -= state.option.indent; noreach = false; delete funct["(nolet)"]; } funct["(verb)"] = null; if (!ordinary || !state.option.funcscope) scope = s; inblock = b; if (ordinary && state.option.noempty && (!a || a.length === 0)) { warning("W035"); } metrics.nestedBlockDepth -= 1; return a; } function countMember(m) { if (membersOnly && typeof membersOnly[m] !== "boolean") { warning("W036", state.tokens.curr, m); } if (typeof member[m] === "number") { member[m] += 1; } else { member[m] = 1; } } function note_implied(tkn) { var name = tkn.value, line = tkn.line, a = implied[name]; if (typeof a === "function") { a = false; } if (!a) { a = [line]; implied[name] = a; } else if (a[a.length - 1] !== line) { a.push(line); } } type("(number)", function () { return this; }); type("(string)", function () { return this; }); state.syntax["(identifier)"] = { type: "(identifier)", lbp: 0, identifier: true, nud: function () { var v = this.value, s = scope[v], f; if (typeof s === "function") { s = undefined; } else if (typeof s === "boolean") { f = funct; funct = functions[0]; addlabel(v, "var"); s = funct; funct = f; } var block; if (_.has(funct, "(blockscope)")) { block = funct["(blockscope)"].getlabel(v); } if (funct === s || block) { switch (block ? block[v]["(type)"] : funct[v]) { case "unused": if (block) block[v]["(type)"] = "var"; else funct[v] = "var"; break; case "unction": if (block) block[v]["(type)"] = "function"; else funct[v] = "function"; this["function"] = true; break; case "function": this["function"] = true; break; case "label": warning("W037", state.tokens.curr, v); break; } } else if (funct["(global)"]) { if (typeof predefined[v] !== "boolean") { if (!(anonname === "typeof" || anonname === "delete") || (state.tokens.next && (state.tokens.next.value === "." || state.tokens.next.value === "["))) { if (!funct["(comparray)"].check(v)) { isundef(funct, "W117", state.tokens.curr, v); } } } note_implied(state.tokens.curr); } else { switch (funct[v]) { case "closure": case "function": case "var": case "unused": warning("W038", state.tokens.curr, v); break; case "label": warning("W037", state.tokens.curr, v); break; case "outer": case "global": break; default: if (s === true) { funct[v] = true; } else if (s === null) { warning("W039", state.tokens.curr, v); note_implied(state.tokens.curr); } else if (typeof s !== "object") { if (!(anonname === "typeof" || anonname === "delete") || (state.tokens.next && (state.tokens.next.value === "." || state.tokens.next.value === "["))) { isundef(funct, "W117", state.tokens.curr, v); } funct[v] = true; note_implied(state.tokens.curr); } else { switch (s[v]) { case "function": case "unction": this["function"] = true; s[v] = "closure"; funct[v] = s["(global)"] ? "global" : "outer"; break; case "var": case "unused": s[v] = "closure"; funct[v] = s["(global)"] ? "global" : "outer"; break; case "closure": funct[v] = s["(global)"] ? "global" : "outer"; break; case "label": warning("W037", state.tokens.curr, v); } } } } return this; }, led: function () { error("E033", state.tokens.next, state.tokens.next.value); } }; type("(regexp)", function () { return this; }); delim("(endline)"); delim("(begin)"); delim("(end)").reach = true; delim("(error)").reach = true; delim("}").reach = true; delim(")"); delim("]"); delim("\"").reach = true; delim("'").reach = true; delim(";"); delim(":").reach = true; delim("#"); reserve("else"); reserve("case").reach = true; reserve("catch"); reserve("default").reach = true; reserve("finally"); reservevar("arguments", function (x) { if (state.directive["use strict"] && funct["(global)"]) { warning("E008", x); } }); reservevar("eval"); reservevar("false"); reservevar("Infinity"); reservevar("null"); reservevar("this", function (x) { if (state.directive["use strict"] && !state.option.validthis && ((funct["(statement)"] && funct["(name)"].charAt(0) > "Z") || funct["(global)"])) { warning("W040", x); } }); reservevar("true"); reservevar("undefined"); assignop("=", "assign", 20); assignop("+=", "assignadd", 20); assignop("-=", "assignsub", 20); assignop("*=", "assignmult", 20); assignop("/=", "assigndiv", 20).nud = function () { error("E014"); }; assignop("%=", "assignmod", 20); bitwiseassignop("&=", "assignbitand", 20); bitwiseassignop("|=", "assignbitor", 20); bitwiseassignop("^=", "assignbitxor", 20); bitwiseassignop("<<=", "assignshiftleft", 20); bitwiseassignop(">>=", "assignshiftright", 20); bitwiseassignop(">>>=", "assignshiftrightunsigned", 20); infix(",", function (left, that) { var expr; that.exprs = [left]; if (!comma({peek: true})) { return that; } while (true) { if (!(expr = expression(10))) { break; } that.exprs.push(expr); if (state.tokens.next.value !== "," || !comma()) { break; } } return that; }, 10, true); infix("?", function (left, that) { increaseComplexityCount(); that.left = left; that.right = expression(10); advance(":"); that["else"] = expression(10); return that; }, 30); var orPrecendence = 40; infix("||", function (left, that) { increaseComplexityCount(); that.left = left; that.right = expression(orPrecendence); return that; }, orPrecendence); infix("&&", "and", 50); bitwise("|", "bitor", 70); bitwise("^", "bitxor", 80); bitwise("&", "bitand", 90); relation("==", function (left, right) { var eqnull = state.option.eqnull && (left.value === "null" || right.value === "null"); if (!eqnull && state.option.eqeqeq) warning("W116", this, "===", "=="); else if (isPoorRelation(left)) warning("W041", this, "===", left.value); else if (isPoorRelation(right)) warning("W041", this, "===", right.value); return this; }); relation("==="); relation("!=", function (left, right) { var eqnull = state.option.eqnull && (left.value === "null" || right.value === "null"); if (!eqnull && state.option.eqeqeq) { warning("W116", this, "!==", "!="); } else if (isPoorRelation(left)) { warning("W041", this, "!==", left.value); } else if (isPoorRelation(right)) { warning("W041", this, "!==", right.value); } return this; }); relation("!=="); relation("<"); relation(">"); relation("<="); relation(">="); bitwise("<<", "shiftleft", 120); bitwise(">>", "shiftright", 120); bitwise(">>>", "shiftrightunsigned", 120); infix("in", "in", 120); infix("instanceof", "instanceof", 120); infix("+", function (left, that) { var right = expression(130); if (left && right && left.id === "(string)" && right.id === "(string)") { left.value += right.value; left.character = right.character; if (!state.option.scripturl && reg.javascriptURL.test(left.value)) { warning("W050", left); } return left; } that.left = left; that.right = right; return that; }, 130); prefix("+", "num"); prefix("+++", function () { warning("W007"); this.right = expression(150); this.arity = "unary"; return this; }); infix("+++", function (left) { warning("W007"); this.left = left; this.right = expression(130); return this; }, 130); infix("-", "sub", 130); prefix("-", "neg"); prefix("---", function () { warning("W006"); this.right = expression(150); this.arity = "unary"; return this; }); infix("---", function (left) { warning("W006"); this.left = left; this.right = expression(130); return this; }, 130); infix("*", "mult", 140); infix("/", "div", 140); infix("%", "mod", 140); suffix("++", "postinc"); prefix("++", "preinc"); state.syntax["++"].exps = true; suffix("--", "postdec"); prefix("--", "predec"); state.syntax["--"].exps = true; prefix("delete", function () { var p = expression(10); if (!p || (p.id !== "." && p.id !== "[")) { warning("W051"); } this.first = p; return this; }).exps = true; prefix("~", function () { if (state.option.bitwise) { warning("W052", this, "~"); } expression(150); return this; }); prefix("...", function () { if (!state.option.inESNext()) { warning("W104", this, "spread/rest operator"); } if (!state.tokens.next.identifier) { error("E030", state.tokens.next, state.tokens.next.value); } expression(150); return this; }); prefix("!", function () { this.right = expression(150); this.arity = "unary"; if (!this.right) { // '!' followed by nothing? Give up. quit("E041", this.line || 0); } if (bang[this.right.id] === true) { warning("W018", this, "!"); } return this; }); prefix("typeof", "typeof"); prefix("new", function () { var c = expression(155), i; if (c && c.id !== "function") { if (c.identifier) { c["new"] = true; switch (c.value) { case "Number": case "String": case "Boolean": case "Math": case "JSON": warning("W053", state.tokens.prev, c.value); break; case "Function": if (!state.option.evil) { warning("W054"); } break; case "Date": case "RegExp": break; default: if (c.id !== "function") { i = c.value.substr(0, 1); if (state.option.newcap && (i < "A" || i > "Z") && !_.has(global, c.value)) { warning("W055", state.tokens.curr); } } } } else { if (c.id !== "." && c.id !== "[" && c.id !== "(") { warning("W056", state.tokens.curr); } } } else { if (!state.option.supernew) warning("W057", this); } adjacent(state.tokens.curr, state.tokens.next); if (state.tokens.next.id !== "(" && !state.option.supernew) { warning("W058", state.tokens.curr, state.tokens.curr.value); } this.first = c; return this; }); state.syntax["new"].exps = true; prefix("void").exps = true; infix(".", function (left, that) { adjacent(state.tokens.prev, state.tokens.curr); nobreak(); var m = identifier(false, true); if (typeof m === "string") { countMember(m); } that.left = left; that.right = m; if (m && m === "hasOwnProperty" && state.tokens.next.value === "=") { warning("W001"); } if (left && left.value === "arguments" && (m === "callee" || m === "caller")) { if (state.option.noarg) warning("W059", left, m); else if (state.directive["use strict"]) error("E008"); } else if (!state.option.evil && left && left.value === "document" && (m === "write" || m === "writeln")) { warning("W060", left); } if (!state.option.evil && (m === "eval" || m === "execScript")) { warning("W061"); } return that; }, 160, true); infix("(", function (left, that) { if (state.tokens.prev.id !== "}" && state.tokens.prev.id !== ")") { nobreak(state.tokens.prev, state.tokens.curr); } nospace(); if (state.option.immed && left && !left.immed && left.id === "function") { warning("W062"); } var n = 0; var p = []; if (left) { if (left.type === "(identifier)") { if (left.value.match(/^[A-Z]([A-Z0-9_$]*[a-z][A-Za-z0-9_$]*)?$/)) { if ("Number String Boolean Date Object".indexOf(left.value) === -1) { if (left.value === "Math") { warning("W063", left); } else if (state.option.newcap) { warning("W064", left); } } } } } if (state.tokens.next.id !== ")") { for (;;) { p[p.length] = expression(10); n += 1; if (state.tokens.next.id !== ",") { break; } comma(); } } advance(")"); nospace(state.tokens.prev, state.tokens.curr); if (typeof left === "object") { if (left.value === "parseInt" && n === 1) { warning("W065", state.tokens.curr); } if (!state.option.evil) { if (left.value === "eval" || left.value === "Function" || left.value === "execScript") { warning("W061", left); if (p[0] && [0].id === "(string)") { addInternalSrc(left, p[0].value); } } else if (p[0] && p[0].id === "(string)" && (left.value === "setTimeout" || left.value === "setInterval")) { warning("W066", left); addInternalSrc(left, p[0].value); } else if (p[0] && p[0].id === "(string)" && left.value === "." && left.left.value === "window" && (left.right === "setTimeout" || left.right === "setInterval")) { warning("W066", left); addInternalSrc(left, p[0].value); } } if (!left.identifier && left.id !== "." && left.id !== "[" && left.id !== "(" && left.id !== "&&" && left.id !== "||" && left.id !== "?") { warning("W067", left); } } that.left = left; return that; }, 155, true).exps = true; prefix("(", function () { nospace(); var bracket, brackets = []; var pn, pn1, i = 0; var ret; do { pn = peek(i); i += 1; pn1 = peek(i); i += 1; } while (pn.value !== ")" && pn1.value !== "=>" && pn1.value !== ";" && pn1.type !== "(end)"); if (state.tokens.next.id === "function") { state.tokens.next.immed = true; } var exprs = []; if (state.tokens.next.id !== ")") { for (;;) { if (pn1.value === "=>" && state.tokens.next.value === "{") { bracket = state.tokens.next; bracket.left = destructuringExpression(); brackets.push(bracket); for (var t in bracket.left) { exprs.push(bracket.left[t].token); } } else { exprs.push(expression(10)); } if (state.tokens.next.id !== ",") { break; } comma(); } } advance(")", this); nospace(state.tokens.prev, state.tokens.curr); if (state.option.immed && exprs[0] && exprs[0].id === "function") { if (state.tokens.next.id !== "(" && (state.tokens.next.id !== "." || (peek().value !== "call" && peek().value !== "apply"))) { warning("W068", this); } } if (state.tokens.next.value === "=>") { return exprs; } if (!exprs.length) { return; } if (exprs.length > 1) { ret = Object.create(state.syntax[","]); ret.exprs = exprs; } else { ret = exprs[0]; } if (ret) { ret.paren = true; } return ret; }); application("=>"); infix("[", function (left, that) { nobreak(state.tokens.prev, state.tokens.curr); nospace(); var e = expression(10), s; if (e && e.type === "(string)") { if (!state.option.evil && (e.value === "eval" || e.value === "execScript")) { warning("W061", that); } countMember(e.value); if (!state.option.sub && reg.identifier.test(e.value)) { s = state.syntax[e.value]; if (!s || !isReserved(s)) { warning("W069", state.tokens.prev, e.value); } } } advance("]", that); if (e && e.value === "hasOwnProperty" && state.tokens.next.value === "=") { warning("W001"); } nospace(state.tokens.prev, state.tokens.curr); that.left = left; that.right = e; return that; }, 160, true); function comprehensiveArrayExpression() { var res = {}; res.exps = true; funct["(comparray)"].stack(); res.right = expression(10); advance("for"); if (state.tokens.next.value === "each") { advance("each"); if (!state.option.inMoz(true)) { warning("W118", state.tokens.curr, "for each"); } } advance("("); funct["(comparray)"].setState("define"); res.left = expression(10); advance(")"); if (state.tokens.next.value === "if") { advance("if"); advance("("); funct["(comparray)"].setState("filter"); res.filter = expression(10); advance(")"); } advance("]"); funct["(comparray)"].unstack(); return res; } prefix("[", function () { var blocktype = lookupBlockType(true); if (blocktype.isCompArray) { if (!state.option.inMoz(true)) { warning("W118", state.tokens.curr, "array comprehension"); } return comprehensiveArrayExpression(); } else if (blocktype.isDestAssign && !state.option.inESNext()) { warning("W104", state.tokens.curr, "destructuring assignment"); } var b = state.tokens.curr.line !== state.tokens.next.line; this.first = []; if (b) { indent += state.option.indent; if (state.tokens.next.from === indent + state.option.indent) { indent += state.option.indent; } } while (state.tokens.next.id !== "(end)") { while (state.tokens.next.id === ",") { if (!state.option.inES5()) warning("W070"); advance(","); } if (state.tokens.next.id === "]") { break; } if (b && state.tokens.curr.line !== state.tokens.next.line) { indentation(); } this.first.push(expression(10)); if (state.tokens.next.id === ",") { comma({ allowTrailing: true }); if (state.tokens.next.id === "]" && !state.option.inES5(true)) { warning("W070", state.tokens.curr); break; } } else { break; } } if (b) { indent -= state.option.indent; indentation(); } advance("]", this); return this; }, 160); function property_name() { var id = optionalidentifier(false, true); if (!id) { if (state.tokens.next.id === "(string)") { id = state.tokens.next.value; advance(); } else if (state.tokens.next.id === "(number)") { id = state.tokens.next.value.toString(); advance(); } } if (id === "hasOwnProperty") { warning("W001"); } return id; } function functionparams(parsed) { var curr, next; var params = []; var ident; var tokens = []; var t; var pastDefault = false; if (parsed) { if (parsed instanceof Array) { for (var i in parsed) { curr = parsed[i]; if (_.contains(["{", "["], curr.id)) { for (t in curr.left) { t = tokens[t]; if (t.id) { params.push(t.id); addlabel(t.id, "unused", t.token); } } } else if (curr.value === "...") { if (!state.option.inESNext()) { warning("W104", curr, "spread/rest operator"); } continue; } else { addlabel(curr.value, "unused", curr); } } return params; } else { if (parsed.identifier === true) { addlabel(parsed.value, "unused", parsed); return [parsed]; } } } next = state.tokens.next; advance("("); nospace(); if (state.tokens.next.id === ")") { advance(")"); return; } for (;;) { if (_.contains(["{", "["], state.tokens.next.id)) { tokens = destructuringExpression(); for (t in tokens) { t = tokens[t]; if (t.id) { params.push(t.id); addlabel(t.id, "unused", t.token); } } } else if (state.tokens.next.value === "...") { if (!state.option.inESNext()) { warning("W104", state.tokens.next, "spread/rest operator"); } advance("..."); nospace(); ident = identifier(true); params.push(ident); addlabel(ident, "unused", state.tokens.curr); } else { ident = identifier(true); params.push(ident); addlabel(ident, "unused", state.tokens.curr); } if (pastDefault) { if (state.tokens.next.id !== "=") { error("E051", state.tokens.current); } } if (state.tokens.next.id === "=") { if (!state.option.inESNext()) { warning("W119", state.tokens.next, "default parameters"); } advance("="); pastDefault = true; expression(10); } if (state.tokens.next.id === ",") { comma(); } else { advance(")", next); nospace(state.tokens.prev, state.tokens.curr); return params; } } } function doFunction(name, statement, generator, fatarrowparams) { var f; var oldOption = state.option; var oldIgnored = state.ignored; var oldScope = scope; state.option = Object.create(state.option); state.ignored = Object.create(state.ignored); scope = Object.create(scope); funct = { "(name)" : name || "\"" + anonname + "\"", "(line)" : state.tokens.next.line, "(character)" : state.tokens.next.character, "(context)" : funct, "(breakage)" : 0, "(loopage)" : 0, "(metrics)" : createMetrics(state.tokens.next), "(scope)" : scope, "(statement)" : statement, "(tokens)" : {}, "(blockscope)": funct["(blockscope)"], "(comparray)" : funct["(comparray)"] }; if (generator) { funct["(generator)"] = true; } f = funct; state.tokens.curr.funct = funct; functions.push(funct); if (name) { addlabel(name, "function"); } funct["(params)"] = functionparams(fatarrowparams); funct["(metrics)"].verifyMaxParametersPerFunction(funct["(params)"]); block(false, true, true, fatarrowparams ? true:false); if (generator && funct["(generator)"] !== "yielded") { error("E047", state.tokens.curr); } funct["(metrics)"].verifyMaxStatementsPerFunction(); funct["(metrics)"].verifyMaxComplexityPerFunction(); funct["(unusedOption)"] = state.option.unused; scope = oldScope; state.option = oldOption; state.ignored = oldIgnored; funct["(last)"] = state.tokens.curr.line; funct["(lastcharacter)"] = state.tokens.curr.character; funct = funct["(context)"]; return f; } function createMetrics(functionStartToken) { return { statementCount: 0, nestedBlockDepth: -1, ComplexityCount: 1, verifyMaxStatementsPerFunction: function () { if (state.option.maxstatements && this.statementCount > state.option.maxstatements) { warning("W071", functionStartToken, this.statementCount); } }, verifyMaxParametersPerFunction: function (params) { params = params || []; if (state.option.maxparams && params.length > state.option.maxparams) { warning("W072", functionStartToken, params.length); } }, verifyMaxNestedBlockDepthPerFunction: function () { if (state.option.maxdepth && this.nestedBlockDepth > 0 && this.nestedBlockDepth === state.option.maxdepth + 1) { warning("W073", null, this.nestedBlockDepth); } }, verifyMaxComplexityPerFunction: function () { var max = state.option.maxcomplexity; var cc = this.ComplexityCount; if (max && cc > max) { warning("W074", functionStartToken, cc); } } }; } function increaseComplexityCount() { funct["(metrics)"].ComplexityCount += 1; } function checkCondAssignment(expr) { var id, paren; if (expr) { id = expr.id; paren = expr.paren; if (id === "," && (expr = expr.exprs[expr.exprs.length - 1])) { id = expr.id; paren = paren || expr.paren; } } switch (id) { case "=": case "+=": case "-=": case "*=": case "%=": case "&=": case "|=": case "^=": case "/=": if (!paren && !state.option.boss) { warning("W084"); } } } (function (x) { x.nud = function (isclassdef) { var b, f, i, p, t, g; var props = {}; // All properties, including accessors var tag = ""; function saveProperty(name, tkn) { if (props[name] && _.has(props, name)) warning("W075", state.tokens.next, i); else props[name] = {}; props[name].basic = true; props[name].basictkn = tkn; } function saveSetter(name, tkn) { if (props[name] && _.has(props, name)) { if (props[name].basic || props[name].setter) warning("W075", state.tokens.next, i); } else { props[name] = {}; } props[name].setter = true; props[name].setterToken = tkn; } function saveGetter(name) { if (props[name] && _.has(props, name)) { if (props[name].basic || props[name].getter) warning("W075", state.tokens.next, i); } else { props[name] = {}; } props[name].getter = true; props[name].getterToken = state.tokens.curr; } b = state.tokens.curr.line !== state.tokens.next.line; if (b) { indent += state.option.indent; if (state.tokens.next.from === indent + state.option.indent) { indent += state.option.indent; } } for (;;) { if (state.tokens.next.id === "}") { break; } if (b) { indentation(); } if (isclassdef && state.tokens.next.value === "static") { advance("static"); tag = "static "; } if (state.tokens.next.value === "get" && peek().id !== ":") { advance("get"); if (!state.option.inES5(!isclassdef)) { error("E034"); } i = property_name(); if (!i) { error("E035"); } if (isclassdef && i === "constructor") { error("E049", state.tokens.next, "class getter method", i); } saveGetter(tag + i); t = state.tokens.next; adjacent(state.tokens.curr, state.tokens.next); f = doFunction(); p = f["(params)"]; if (p) { warning("W076", t, p[0], i); } adjacent(state.tokens.curr, state.tokens.next); } else if (state.tokens.next.value === "set" && peek().id !== ":") { advance("set"); if (!state.option.inES5(!isclassdef)) { error("E034"); } i = property_name(); if (!i) { error("E035"); } if (isclassdef && i === "constructor") { error("E049", state.tokens.next, "class setter method", i); } saveSetter(tag + i, state.tokens.next); t = state.tokens.next; adjacent(state.tokens.curr, state.tokens.next); f = doFunction(); p = f["(params)"]; if (!p || p.length !== 1) { warning("W077", t, i); } } else { g = false; if (state.tokens.next.value === "*" && state.tokens.next.type === "(punctuator)") { if (!state.option.inESNext()) { warning("W104", state.tokens.next, "generator functions"); } advance("*"); g = true; } i = property_name(); saveProperty(tag + i, state.tokens.next); if (typeof i !== "string") { break; } if (state.tokens.next.value === "(") { if (!state.option.inESNext()) { warning("W104", state.tokens.curr, "concise methods"); } doFunction(i, undefined, g); } else if (!isclassdef) { advance(":"); nonadjacent(state.tokens.curr, state.tokens.next); expression(10); } } if (isclassdef && i === "prototype") { error("E049", state.tokens.next, "class method", i); } countMember(i); if (isclassdef) { tag = ""; continue; } if (state.tokens.next.id === ",") { comma({ allowTrailing: true, property: true }); if (state.tokens.next.id === ",") { warning("W070", state.tokens.curr); } else if (state.tokens.next.id === "}" && !state.option.inES5(true)) { warning("W070", state.tokens.curr); } } else { break; } } if (b) { indent -= state.option.indent; indentation(); } advance("}", this); if (state.option.inES5()) { for (var name in props) { if (_.has(props, name) && props[name].setter && !props[name].getter) { warning("W078", props[name].setterToken); } } } return this; }; x.fud = function () { error("E036", state.tokens.curr); }; }(delim("{"))); function destructuringExpression() { var id, ids; var identifiers = []; if (!state.option.inESNext()) { warning("W104", state.tokens.curr, "destructuring expression"); } var nextInnerDE = function () { var ident; if (_.contains(["[", "{"], state.tokens.next.value)) { ids = destructuringExpression(); for (var id in ids) { id = ids[id]; identifiers.push({ id: id.id, token: id.token }); } } else if (state.tokens.next.value === ",") { identifiers.push({ id: null, token: state.tokens.curr }); } else { ident = identifier(); if (ident) identifiers.push({ id: ident, token: state.tokens.curr }); } }; if (state.tokens.next.value === "[") { advance("["); nextInnerDE(); while (state.tokens.next.value !== "]") { advance(","); nextInnerDE(); } advance("]"); } else if (state.tokens.next.value === "{") { advance("{"); id = identifier(); if (state.tokens.next.value === ":") { advance(":"); nextInnerDE(); } else { identifiers.push({ id: id, token: state.tokens.curr }); } while (state.tokens.next.value !== "}") { advance(","); id = identifier(); if (state.tokens.next.value === ":") { advance(":"); nextInnerDE(); } else { identifiers.push({ id: id, token: state.tokens.curr }); } } advance("}"); } return identifiers; } function destructuringExpressionMatch(tokens, value) { if (value.first) { _.zip(tokens, value.first).forEach(function (val) { var token = val[0]; var value = val[1]; if (token && value) { token.first = value; } else if (token && token.first && !value) { warning("W080", token.first, token.first.value); } /* else { XXX value is discarded: wouldn't it need a warning ? } */ }); } } var conststatement = stmt("const", function (prefix) { var tokens, value; var lone; if (!state.option.inESNext()) { warning("W104", state.tokens.curr, "const"); } this.first = []; for (;;) { var names = []; nonadjacent(state.tokens.curr, state.tokens.next); if (_.contains(["{", "["], state.tokens.next.value)) { tokens = destructuringExpression(); lone = false; } else { tokens = [ { id: identifier(), token: state.tokens.curr } ]; lone = true; } for (var t in tokens) { t = tokens[t]; if (funct[t.id] === "const") { warning("E011", null, t.id); } if (funct["(global)"] && predefined[t.id] === false) { warning("W079", t.token, t.id); } if (t.id) { addlabel(t.id, "const"); names.push(t.token); } } if (prefix) { break; } this.first = this.first.concat(names); if (state.tokens.next.id !== "=") { warning("E012", state.tokens.curr, state.tokens.curr.value); } if (state.tokens.next.id === "=") { nonadjacent(state.tokens.curr, state.tokens.next); advance("="); nonadjacent(state.tokens.curr, state.tokens.next); if (state.tokens.next.id === "undefined") { warning("W080", state.tokens.prev, state.tokens.prev.value); } if (peek(0).id === "=" && state.tokens.next.identifier) { warning("W120", state.tokens.next, state.tokens.next.value); } value = expression(10); if (lone) { tokens[0].first = value; } else { destructuringExpressionMatch(names, value); } } if (state.tokens.next.id !== ",") { break; } comma(); } return this; }); conststatement.exps = true; var varstatement = stmt("var", function (prefix) { var tokens, lone, value; if (funct["(onevar)"] && state.option.onevar) { warning("W081"); } else if (!funct["(global)"]) { funct["(onevar)"] = true; } this.first = []; for (;;) { var names = []; nonadjacent(state.tokens.curr, state.tokens.next); if (_.contains(["{", "["], state.tokens.next.value)) { tokens = destructuringExpression(); lone = false; } else { tokens = [ { id: identifier(), token: state.tokens.curr } ]; lone = true; } for (var t in tokens) { t = tokens[t]; if (state.option.inESNext() && funct[t.id] === "const") { warning("E011", null, t.id); } if (funct["(global)"] && predefined[t.id] === false) { warning("W079", t.token, t.id); } if (t.id) { addlabel(t.id, "unused", t.token); names.push(t.token); } } if (prefix) { break; } this.first = this.first.concat(names); if (state.tokens.next.id === "=") { nonadjacent(state.tokens.curr, state.tokens.next); advance("="); nonadjacent(state.tokens.curr, state.tokens.next); if (state.tokens.next.id === "undefined") { warning("W080", state.tokens.prev, state.tokens.prev.value); } if (peek(0).id === "=" && state.tokens.next.identifier) { warning("W120", state.tokens.next, state.tokens.next.value); } value = expression(10); if (lone) { tokens[0].first = value; } else { destructuringExpressionMatch(names, value); } } if (state.tokens.next.id !== ",") { break; } comma(); } return this; }); varstatement.exps = true; var letstatement = stmt("let", function (prefix) { var tokens, lone, value, letblock; if (!state.option.inESNext()) { warning("W104", state.tokens.curr, "let"); } if (state.tokens.next.value === "(") { if (!state.option.inMoz(true)) { warning("W118", state.tokens.next, "let block"); } advance("("); funct["(blockscope)"].stack(); letblock = true; } else if (funct["(nolet)"]) { error("E048", state.tokens.curr); } if (funct["(onevar)"] && state.option.onevar) { warning("W081"); } else if (!funct["(global)"]) { funct["(onevar)"] = true; } this.first = []; for (;;) { var names = []; nonadjacent(state.tokens.curr, state.tokens.next); if (_.contains(["{", "["], state.tokens.next.value)) { tokens = destructuringExpression(); lone = false; } else { tokens = [ { id: identifier(), token: state.tokens.curr.value } ]; lone = true; } for (var t in tokens) { t = tokens[t]; if (state.option.inESNext() && funct[t.id] === "const") { warning("E011", null, t.id); } if (funct["(global)"] && predefined[t.id] === false) { warning("W079", t.token, t.id); } if (t.id && !funct["(nolet)"]) { addlabel(t.id, "unused", t.token, true); names.push(t.token); } } if (prefix) { break; } this.first = this.first.concat(names); if (state.tokens.next.id === "=") { nonadjacent(state.tokens.curr, state.tokens.next); advance("="); nonadjacent(state.tokens.curr, state.tokens.next); if (state.tokens.next.id === "undefined") { warning("W080", state.tokens.prev, state.tokens.prev.value); } if (peek(0).id === "=" && state.tokens.next.identifier) { warning("W120", state.tokens.next, state.tokens.next.value); } value = expression(10); if (lone) { tokens[0].first = value; } else { destructuringExpressionMatch(names, value); } } if (state.tokens.next.id !== ",") { break; } comma(); } if (letblock) { advance(")"); block(true, true); this.block = true; funct["(blockscope)"].unstack(); } return this; }); letstatement.exps = true; blockstmt("class", function () { return classdef.call(this, true); }); function classdef(stmt) { if (!state.option.inESNext()) { warning("W104", state.tokens.curr, "class"); } if (stmt) { this.name = identifier(); addlabel(this.name, "unused", state.tokens.curr); } else if (state.tokens.next.identifier && state.tokens.next.value !== "extends") { this.name = identifier(); } classtail(this); return this; } function classtail(c) { var strictness = state.directive["use strict"]; if (state.tokens.next.value === "extends") { advance("extends"); c.heritage = expression(10); } state.directive["use strict"] = true; advance("{"); c.body = state.syntax["{"].nud(true); state.directive["use strict"] = strictness; } blockstmt("function", function () { var generator = false; if (state.tokens.next.value === "*") { advance("*"); if (state.option.inESNext(true)) { generator = true; } else { warning("W119", state.tokens.curr, "function*"); } } if (inblock) { warning("W082", state.tokens.curr); } var i = identifier(); if (funct[i] === "const") { warning("E011", null, i); } adjacent(state.tokens.curr, state.tokens.next); addlabel(i, "unction", state.tokens.curr); doFunction(i, { statement: true }, generator); if (state.tokens.next.id === "(" && state.tokens.next.line === state.tokens.curr.line) { error("E039"); } return this; }); prefix("function", function () { var generator = false; if (state.tokens.next.value === "*") { if (!state.option.inESNext()) { warning("W119", state.tokens.curr, "function*"); } advance("*"); generator = true; } var i = optionalidentifier(); if (i || state.option.gcl) { adjacent(state.tokens.curr, state.tokens.next); } else { nonadjacent(state.tokens.curr, state.tokens.next); } doFunction(i, undefined, generator); if (!state.option.loopfunc && funct["(loopage)"]) { warning("W083"); } return this; }); blockstmt("if", function () { var t = state.tokens.next; increaseComplexityCount(); state.condition = true; advance("("); nonadjacent(this, t); nospace(); checkCondAssignment(expression(0)); advance(")", t); state.condition = false; nospace(state.tokens.prev, state.tokens.curr); block(true, true); if (state.tokens.next.id === "else") { nonadjacent(state.tokens.curr, state.tokens.next); advance("else"); if (state.tokens.next.id === "if" || state.tokens.next.id === "switch") { statement(true); } else { block(true, true); } } return this; }); blockstmt("try", function () { var b; function doCatch() { var oldScope = scope; var e; advance("catch"); nonadjacent(state.tokens.curr, state.tokens.next); advance("("); scope = Object.create(oldScope); e = state.tokens.next.value; if (state.tokens.next.type !== "(identifier)") { e = null; warning("E030", state.tokens.next, e); } advance(); funct = { "(name)" : "(catch)", "(line)" : state.tokens.next.line, "(character)": state.tokens.next.character, "(context)" : funct, "(breakage)" : funct["(breakage)"], "(loopage)" : funct["(loopage)"], "(scope)" : scope, "(statement)": false, "(metrics)" : createMetrics(state.tokens.next), "(catch)" : true, "(tokens)" : {}, "(blockscope)": funct["(blockscope)"], "(comparray)": funct["(comparray)"] }; if (e) { addlabel(e, "exception"); } if (state.tokens.next.value === "if") { if (!state.option.inMoz(true)) { warning("W118", state.tokens.curr, "catch filter"); } advance("if"); expression(0); } advance(")"); state.tokens.curr.funct = funct; functions.push(funct); block(false); scope = oldScope; funct["(last)"] = state.tokens.curr.line; funct["(lastcharacter)"] = state.tokens.curr.character; funct = funct["(context)"]; } block(false); while (state.tokens.next.id === "catch") { increaseComplexityCount(); if (b && (!state.option.inMoz(true))) { warning("W118", state.tokens.next, "multiple catch blocks"); } doCatch(); b = true; } if (state.tokens.next.id === "finally") { advance("finally"); block(false); return; } if (!b) { error("E021", state.tokens.next, "catch", state.tokens.next.value); } return this; }); blockstmt("while", function () { var t = state.tokens.next; funct["(breakage)"] += 1; funct["(loopage)"] += 1; increaseComplexityCount(); advance("("); nonadjacent(this, t); nospace(); checkCondAssignment(expression(0)); advance(")", t); nospace(state.tokens.prev, state.tokens.curr); block(true, true); funct["(breakage)"] -= 1; funct["(loopage)"] -= 1; return this; }).labelled = true; blockstmt("with", function () { var t = state.tokens.next; if (state.directive["use strict"]) { error("E010", state.tokens.curr); } else if (!state.option.withstmt) { warning("W085", state.tokens.curr); } advance("("); nonadjacent(this, t); nospace(); expression(0); advance(")", t); nospace(state.tokens.prev, state.tokens.curr); block(true, true); return this; }); blockstmt("switch", function () { var t = state.tokens.next, g = false; funct["(breakage)"] += 1; advance("("); nonadjacent(this, t); nospace(); checkCondAssignment(expression(0)); advance(")", t); nospace(state.tokens.prev, state.tokens.curr); nonadjacent(state.tokens.curr, state.tokens.next); t = state.tokens.next; advance("{"); nonadjacent(state.tokens.curr, state.tokens.next); indent += state.option.indent; this.cases = []; for (;;) { switch (state.tokens.next.id) { case "case": switch (funct["(verb)"]) { case "yield": case "break": case "case": case "continue": case "return": case "switch": case "throw": break; default: if (!reg.fallsThrough.test(state.lines[state.tokens.next.line - 2])) { warning("W086", state.tokens.curr, "case"); } } indentation(-state.option.indent); advance("case"); this.cases.push(expression(20)); increaseComplexityCount(); g = true; advance(":"); funct["(verb)"] = "case"; break; case "default": switch (funct["(verb)"]) { case "yield": case "break": case "continue": case "return": case "throw": break; default: if (this.cases.length) { if (!reg.fallsThrough.test(state.lines[state.tokens.next.line - 2])) { warning("W086", state.tokens.curr, "default"); } } } indentation(-state.option.indent); advance("default"); g = true; advance(":"); break; case "}": indent -= state.option.indent; indentation(); advance("}", t); funct["(breakage)"] -= 1; funct["(verb)"] = undefined; return; case "(end)": error("E023", state.tokens.next, "}"); return; default: if (g) { switch (state.tokens.curr.id) { case ",": error("E040"); return; case ":": g = false; statements(); break; default: error("E025", state.tokens.curr); return; } } else { if (state.tokens.curr.id === ":") { advance(":"); error("E024", state.tokens.curr, ":"); statements(); } else { error("E021", state.tokens.next, "case", state.tokens.next.value); return; } } } } }).labelled = true; stmt("debugger", function () { if (!state.option.debug) { warning("W087"); } return this; }).exps = true; (function () { var x = stmt("do", function () { funct["(breakage)"] += 1; funct["(loopage)"] += 1; increaseComplexityCount(); this.first = block(true, true); advance("while"); var t = state.tokens.next; nonadjacent(state.tokens.curr, t); advance("("); nospace(); checkCondAssignment(expression(0)); advance(")", t); nospace(state.tokens.prev, state.tokens.curr); funct["(breakage)"] -= 1; funct["(loopage)"] -= 1; return this; }); x.labelled = true; x.exps = true; }()); blockstmt("for", function () { var s, t = state.tokens.next; var letscope = false; var foreachtok = null; if (t.value === "each") { foreachtok = t; advance("each"); if (!state.option.inMoz(true)) { warning("W118", state.tokens.curr, "for each"); } } funct["(breakage)"] += 1; funct["(loopage)"] += 1; increaseComplexityCount(); advance("("); nonadjacent(this, t); nospace(); var nextop; // contains the token of the "in" or "of" operator var i = 0; var inof = ["in", "of"]; do { nextop = peek(i); ++i; } while (!_.contains(inof, nextop.value) && nextop.value !== ";" && nextop.type !== "(end)"); if (_.contains(inof, nextop.value)) { if (!state.option.inESNext() && nextop.value === "of") { error("W104", nextop, "for of"); } if (state.tokens.next.id === "var") { advance("var"); state.syntax["var"].fud.call(state.syntax["var"].fud, true); } else if (state.tokens.next.id === "let") { advance("let"); letscope = true; funct["(blockscope)"].stack(); state.syntax["let"].fud.call(state.syntax["let"].fud, true); } else { switch (funct[state.tokens.next.value]) { case "unused": funct[state.tokens.next.value] = "var"; break; case "var": break; default: if (!funct["(blockscope)"].getlabel(state.tokens.next.value)) warning("W088", state.tokens.next, state.tokens.next.value); } advance(); } advance(nextop.value); expression(20); advance(")", t); s = block(true, true); if (state.option.forin && s && (s.length > 1 || typeof s[0] !== "object" || s[0].value !== "if")) { warning("W089", this); } funct["(breakage)"] -= 1; funct["(loopage)"] -= 1; } else { if (foreachtok) { error("E045", foreachtok); } if (state.tokens.next.id !== ";") { if (state.tokens.next.id === "var") { advance("var"); state.syntax["var"].fud.call(state.syntax["var"].fud); } else if (state.tokens.next.id === "let") { advance("let"); letscope = true; funct["(blockscope)"].stack(); state.syntax["let"].fud.call(state.syntax["let"].fud); } else { for (;;) { expression(0, "for"); if (state.tokens.next.id !== ",") { break; } comma(); } } } nolinebreak(state.tokens.curr); advance(";"); if (state.tokens.next.id !== ";") { checkCondAssignment(expression(0)); } nolinebreak(state.tokens.curr); advance(";"); if (state.tokens.next.id === ";") { error("E021", state.tokens.next, ")", ";"); } if (state.tokens.next.id !== ")") { for (;;) { expression(0, "for"); if (state.tokens.next.id !== ",") { break; } comma(); } } advance(")", t); nospace(state.tokens.prev, state.tokens.curr); block(true, true); funct["(breakage)"] -= 1; funct["(loopage)"] -= 1; } if (letscope) { funct["(blockscope)"].unstack(); } return this; }).labelled = true; stmt("break", function () { var v = state.tokens.next.value; if (funct["(breakage)"] === 0) warning("W052", state.tokens.next, this.value); if (!state.option.asi) nolinebreak(this); if (state.tokens.next.id !== ";" && !state.tokens.next.reach) { if (state.tokens.curr.line === state.tokens.next.line) { if (funct[v] !== "label") { warning("W090", state.tokens.next, v); } else if (scope[v] !== funct) { warning("W091", state.tokens.next, v); } this.first = state.tokens.next; advance(); } } reachable("break"); return this; }).exps = true; stmt("continue", function () { var v = state.tokens.next.value; if (funct["(breakage)"] === 0) warning("W052", state.tokens.next, this.value); if (!state.option.asi) nolinebreak(this); if (state.tokens.next.id !== ";" && !state.tokens.next.reach) { if (state.tokens.curr.line === state.tokens.next.line) { if (funct[v] !== "label") { warning("W090", state.tokens.next, v); } else if (scope[v] !== funct) { warning("W091", state.tokens.next, v); } this.first = state.tokens.next; advance(); } } else if (!funct["(loopage)"]) { warning("W052", state.tokens.next, this.value); } reachable("continue"); return this; }).exps = true; stmt("return", function () { if (this.line === state.tokens.next.line) { if (state.tokens.next.id === "(regexp)") warning("W092"); if (state.tokens.next.id !== ";" && !state.tokens.next.reach) { nonadjacent(state.tokens.curr, state.tokens.next); this.first = expression(0); if (this.first && this.first.type === "(punctuator)" && this.first.value === "=" && !state.option.boss) { warningAt("W093", this.first.line, this.first.character); } } } else { if (state.tokens.next.type === "(punctuator)" && ["[", "{", "+", "-"].indexOf(state.tokens.next.value) > -1) { nolinebreak(this); // always warn (Line breaking error) } } reachable("return"); return this; }).exps = true; (function (x) { x.exps = true; x.lbp = 25; }(prefix("yield", function () { var prev = state.tokens.prev; if (state.option.inESNext(true) && !funct["(generator)"]) { error("E046", state.tokens.curr, "yield"); } else if (!state.option.inESNext()) { warning("W104", state.tokens.curr, "yield"); } funct["(generator)"] = "yielded"; if (this.line === state.tokens.next.line || !state.option.inMoz(true)) { if (state.tokens.next.id === "(regexp)") warning("W092"); if (state.tokens.next.id !== ";" && !state.tokens.next.reach && state.tokens.next.nud) { nobreaknonadjacent(state.tokens.curr, state.tokens.next); this.first = expression(10); if (this.first.type === "(punctuator)" && this.first.value === "=" && !state.option.boss) { warningAt("W093", this.first.line, this.first.character); } } if (state.option.inMoz(true) && state.tokens.next.id !== ")" && (prev.lbp > 30 || (!prev.assign && !isEndOfExpr()) || prev.id === "yield")) { error("E050", this); } } else if (!state.option.asi) { nolinebreak(this); // always warn (Line breaking error) } return this; }))); stmt("throw", function () { nolinebreak(this); nonadjacent(state.tokens.curr, state.tokens.next); this.first = expression(20); reachable("throw"); return this; }).exps = true; stmt("import", function () { if (!state.option.inESNext()) { warning("W119", state.tokens.curr, "import"); } if (state.tokens.next.identifier) { this.name = identifier(); addlabel(this.name, "unused", state.tokens.curr); } else { advance("{"); for (;;) { var importName; if (state.tokens.next.type === "default") { importName = "default"; advance("default"); } else { importName = identifier(); } if (state.tokens.next.value === "as") { advance("as"); importName = identifier(); } addlabel(importName, "unused", state.tokens.curr); if (state.tokens.next.value === ",") { advance(","); } else if (state.tokens.next.value === "}") { advance("}"); break; } else { error("E024", state.tokens.next, state.tokens.next.value); break; } } } advance("from"); advance("(string)"); return this; }).exps = true; stmt("export", function () { if (!state.option.inESNext()) { warning("W119", state.tokens.curr, "export"); } if (state.tokens.next.type === "default") { advance("default"); if (state.tokens.next.id === "function" || state.tokens.next.id === "class") { this.block = true; } this.exportee = expression(10); return this; } if (state.tokens.next.value === "{") { advance("{"); for (;;) { identifier(); if (state.tokens.next.value === ",") { advance(","); } else if (state.tokens.next.value === "}") { advance("}"); break; } else { error("E024", state.tokens.next, state.tokens.next.value); break; } } return this; } if (state.tokens.next.id === "var") { advance("var"); state.syntax["var"].fud.call(state.syntax["var"].fud); } else if (state.tokens.next.id === "let") { advance("let"); state.syntax["let"].fud.call(state.syntax["let"].fud); } else if (state.tokens.next.id === "const") { advance("const"); state.syntax["const"].fud.call(state.syntax["const"].fud); } else if (state.tokens.next.id === "function") { this.block = true; advance("function"); state.syntax["function"].fud(); } else if (state.tokens.next.id === "class") { this.block = true; advance("class"); state.syntax["class"].fud(); } else { error("E024", state.tokens.next, state.tokens.next.value); } return this; }).exps = true; FutureReservedWord("abstract"); FutureReservedWord("boolean"); FutureReservedWord("byte"); FutureReservedWord("char"); FutureReservedWord("class", { es5: true, nud: classdef }); FutureReservedWord("double"); FutureReservedWord("enum", { es5: true }); FutureReservedWord("export", { es5: true }); FutureReservedWord("extends", { es5: true }); FutureReservedWord("final"); FutureReservedWord("float"); FutureReservedWord("goto"); FutureReservedWord("implements", { es5: true, strictOnly: true }); FutureReservedWord("import", { es5: true }); FutureReservedWord("int"); FutureReservedWord("interface", { es5: true, strictOnly: true }); FutureReservedWord("long"); FutureReservedWord("native"); FutureReservedWord("package", { es5: true, strictOnly: true }); FutureReservedWord("private", { es5: true, strictOnly: true }); FutureReservedWord("protected", { es5: true, strictOnly: true }); FutureReservedWord("public", { es5: true, strictOnly: true }); FutureReservedWord("short"); FutureReservedWord("static", { es5: true, strictOnly: true }); FutureReservedWord("super", { es5: true }); FutureReservedWord("synchronized"); FutureReservedWord("throws"); FutureReservedWord("transient"); FutureReservedWord("volatile"); var lookupBlockType = function () { var pn, pn1; var i = 0; var bracketStack = 0; var ret = {}; if (_.contains(["[", "{"], state.tokens.curr.value)) bracketStack += 1; if (_.contains(["[", "{"], state.tokens.next.value)) bracketStack += 1; if (_.contains(["]", "}"], state.tokens.next.value)) bracketStack -= 1; do { pn = peek(i); pn1 = peek(i + 1); i = i + 1; if (_.contains(["[", "{"], pn.value)) { bracketStack += 1; } else if (_.contains(["]", "}"], pn.value)) { bracketStack -= 1; } if (pn.identifier && pn.value === "for" && bracketStack === 1) { ret.isCompArray = true; ret.notJson = true; break; } if (_.contains(["}", "]"], pn.value) && pn1.value === "=") { ret.isDestAssign = true; ret.notJson = true; break; } if (pn.value === ";") { ret.isBlock = true; ret.notJson = true; } } while (bracketStack > 0 && pn.id !== "(end)" && i < 15); return ret; }; function destructuringAssignOrJsonValue() { var block = lookupBlockType(); if (block.notJson) { if (!state.option.inESNext() && block.isDestAssign) { warning("W104", state.tokens.curr, "destructuring assignment"); } statements(); } else { state.option.laxbreak = true; state.jsonMode = true; jsonValue(); } } var arrayComprehension = function () { var CompArray = function () { this.mode = "use"; this.variables = []; }; var _carrays = []; var _current; function declare(v) { var l = _current.variables.filter(function (elt) { if (elt.value === v) { elt.undef = false; return v; } }).length; return l !== 0; } function use(v) { var l = _current.variables.filter(function (elt) { if (elt.value === v && !elt.undef) { if (elt.unused === true) { elt.unused = false; } return v; } }).length; return (l === 0); } return {stack: function () { _current = new CompArray(); _carrays.push(_current); }, unstack: function () { _current.variables.filter(function (v) { if (v.unused) warning("W098", v.token, v.value); if (v.undef) isundef(v.funct, "W117", v.token, v.value); }); _carrays.splice(_carrays[_carrays.length - 1], 1); _current = _carrays[_carrays.length - 1]; }, setState: function (s) { if (_.contains(["use", "define", "filter"], s)) _current.mode = s; }, check: function (v) { if (_current && _current.mode === "use") { _current.variables.push({funct: funct, token: state.tokens.curr, value: v, undef: true, unused: false}); return true; } else if (_current && _current.mode === "define") { if (!declare(v)) { _current.variables.push({funct: funct, token: state.tokens.curr, value: v, undef: false, unused: true}); } return true; } else if (_current && _current.mode === "filter") { if (use(v)) { isundef(funct, "W117", state.tokens.curr, v); } return true; } return false; } }; }; function jsonValue() { function jsonObject() { var o = {}, t = state.tokens.next; advance("{"); if (state.tokens.next.id !== "}") { for (;;) { if (state.tokens.next.id === "(end)") { error("E026", state.tokens.next, t.line); } else if (state.tokens.next.id === "}") { warning("W094", state.tokens.curr); break; } else if (state.tokens.next.id === ",") { error("E028", state.tokens.next); } else if (state.tokens.next.id !== "(string)") { warning("W095", state.tokens.next, state.tokens.next.value); } if (o[state.tokens.next.value] === true) { warning("W075", state.tokens.next, state.tokens.next.value); } else if ((state.tokens.next.value === "__proto__" && !state.option.proto) || (state.tokens.next.value === "__iterator__" && !state.option.iterator)) { warning("W096", state.tokens.next, state.tokens.next.value); } else { o[state.tokens.next.value] = true; } advance(); advance(":"); jsonValue(); if (state.tokens.next.id !== ",") { break; } advance(","); } } advance("}"); } function jsonArray() { var t = state.tokens.next; advance("["); if (state.tokens.next.id !== "]") { for (;;) { if (state.tokens.next.id === "(end)") { error("E027", state.tokens.next, t.line); } else if (state.tokens.next.id === "]") { warning("W094", state.tokens.curr); break; } else if (state.tokens.next.id === ",") { error("E028", state.tokens.next); } jsonValue(); if (state.tokens.next.id !== ",") { break; } advance(","); } } advance("]"); } switch (state.tokens.next.id) { case "{": jsonObject(); break; case "[": jsonArray(); break; case "true": case "false": case "null": case "(number)": case "(string)": advance(); break; case "-": advance("-"); if (state.tokens.curr.character !== state.tokens.next.from) { warning("W011", state.tokens.curr); } adjacent(state.tokens.curr, state.tokens.next); advance("(number)"); break; default: error("E003", state.tokens.next); } } var blockScope = function () { var _current = {}; var _variables = [_current]; function _checkBlockLabels() { for (var t in _current) { if (_current[t]["(type)"] === "unused") { if (state.option.unused) { var tkn = _current[t]["(token)"]; var line = tkn.line; var chr = tkn.character; warningAt("W098", line, chr, t); } } } } return { stack: function () { _current = {}; _variables.push(_current); }, unstack: function () { _checkBlockLabels(); _variables.splice(_variables.length - 1, 1); _current = _.last(_variables); }, getlabel: function (l) { for (var i = _variables.length - 1 ; i >= 0; --i) { if (_.has(_variables[i], l)) { return _variables[i]; } } }, current: { has: function (t) { return _.has(_current, t); }, add: function (t, type, tok) { _current[t] = { "(type)" : type, "(token)": tok }; } } }; }; var itself = function (s, o, g) { var i, k, x; var optionKeys; var newOptionObj = {}; var newIgnoredObj = {}; state.reset(); if (o && o.scope) { JSHINT.scope = o.scope; } else { JSHINT.errors = []; JSHINT.undefs = []; JSHINT.internals = []; JSHINT.blacklist = {}; JSHINT.scope = "(main)"; } predefined = Object.create(null); combine(predefined, vars.ecmaIdentifiers); combine(predefined, vars.reservedVars); combine(predefined, g || {}); declared = Object.create(null); exported = Object.create(null); function each(obj, cb) { if (!obj) return; if (!Array.isArray(obj) && typeof obj === "object") obj = Object.keys(obj); obj.forEach(cb); } if (o) { each(o.predef || null, function (item) { var slice, prop; if (item[0] === "-") { slice = item.slice(1); JSHINT.blacklist[slice] = slice; } else { prop = Object.getOwnPropertyDescriptor(o.predef, item); predefined[item] = prop ? prop.value : false; } }); each(o.exported || null, function (item) { exported[item] = true; }); delete o.predef; delete o.exported; optionKeys = Object.keys(o); for (x = 0; x < optionKeys.length; x++) { if (/^-W\d{3}$/g.test(optionKeys[x])) { newIgnoredObj[optionKeys[x].slice(1)] = true; } else { newOptionObj[optionKeys[x]] = o[optionKeys[x]]; if (optionKeys[x] === "newcap" && o[optionKeys[x]] === false) newOptionObj["(explicitNewcap)"] = true; if (optionKeys[x] === "indent") newOptionObj["(explicitIndent)"] = o[optionKeys[x]] === false ? false : true; } } } state.option = newOptionObj; state.ignored = newIgnoredObj; state.option.indent = state.option.indent || 4; state.option.maxerr = state.option.maxerr || 50; indent = 1; global = Object.create(predefined); scope = global; funct = { "(global)": true, "(name)": "(global)", "(scope)": scope, "(breakage)": 0, "(loopage)": 0, "(tokens)": {}, "(metrics)": createMetrics(state.tokens.next), "(blockscope)": blockScope(), "(comparray)": arrayComprehension() }; functions = [funct]; urls = []; stack = null; member = {}; membersOnly = null; implied = {}; inblock = false; lookahead = []; warnings = 0; unuseds = []; if (!isString(s) && !Array.isArray(s)) { errorAt("E004", 0); return false; } api = { get isJSON() { return state.jsonMode; }, getOption: function (name) { return state.option[name] || null; }, getCache: function (name) { return state.cache[name]; }, setCache: function (name, value) { state.cache[name] = value; }, warn: function (code, data) { warningAt.apply(null, [ code, data.line, data.char ].concat(data.data)); }, on: function (names, listener) { names.split(" ").forEach(function (name) { emitter.on(name, listener); }.bind(this)); } }; emitter.removeAllListeners(); (extraModules || []).forEach(function (func) { func(api); }); state.tokens.prev = state.tokens.curr = state.tokens.next = state.syntax["(begin)"]; lex = new Lexer(s); lex.on("warning", function (ev) { warningAt.apply(null, [ ev.code, ev.line, ev.character].concat(ev.data)); }); lex.on("error", function (ev) { errorAt.apply(null, [ ev.code, ev.line, ev.character ].concat(ev.data)); }); lex.on("fatal", function (ev) { quit("E041", ev.line, ev.from); }); lex.on("Identifier", function (ev) { emitter.emit("Identifier", ev); }); lex.on("String", function (ev) { emitter.emit("String", ev); }); lex.on("Number", function (ev) { emitter.emit("Number", ev); }); lex.start(); for (var name in o) { if (_.has(o, name)) { checkOption(name, state.tokens.curr); } } assume(); combine(predefined, g || {}); comma.first = true; try { advance(); switch (state.tokens.next.id) { case "{": case "[": destructuringAssignOrJsonValue(); break; default: directives(); if (state.directive["use strict"]) { if (!state.option.globalstrict && !state.option.node) { warning("W097", state.tokens.prev); } } statements(); } advance((state.tokens.next && state.tokens.next.value !== ".") ? "(end)" : undefined); funct["(blockscope)"].unstack(); var markDefined = function (name, context) { do { if (typeof context[name] === "string") { if (context[name] === "unused") context[name] = "var"; else if (context[name] === "unction") context[name] = "closure"; return true; } context = context["(context)"]; } while (context); return false; }; var clearImplied = function (name, line) { if (!implied[name]) return; var newImplied = []; for (var i = 0; i < implied[name].length; i += 1) { if (implied[name][i] !== line) newImplied.push(implied[name][i]); } if (newImplied.length === 0) delete implied[name]; else implied[name] = newImplied; }; var warnUnused = function (name, tkn, type, unused_opt) { var line = tkn.line; var chr = tkn.character; if (unused_opt === undefined) { unused_opt = state.option.unused; } if (unused_opt === true) { unused_opt = "last-param"; } var warnable_types = { "vars": ["var"], "last-param": ["var", "param"], "strict": ["var", "param", "last-param"] }; if (unused_opt) { if (warnable_types[unused_opt] && warnable_types[unused_opt].indexOf(type) !== -1) { warningAt("W098", line, chr, name); } } unuseds.push({ name: name, line: line, character: chr }); }; var checkUnused = function (func, key) { var type = func[key]; var tkn = func["(tokens)"][key]; if (key.charAt(0) === "(") return; if (type !== "unused" && type !== "unction") return; if (func["(params)"] && func["(params)"].indexOf(key) !== -1) return; if (func["(global)"] && _.has(exported, key)) { return; } warnUnused(key, tkn, "var"); }; for (i = 0; i < JSHINT.undefs.length; i += 1) { k = JSHINT.undefs[i].slice(0); if (markDefined(k[2].value, k[0])) { clearImplied(k[2].value, k[2].line); } else if (state.option.undef) { warning.apply(warning, k.slice(1)); } } functions.forEach(function (func) { if (func["(unusedOption)"] === false) { return; } for (var key in func) { if (_.has(func, key)) { checkUnused(func, key); } } if (!func["(params)"]) return; var params = func["(params)"].slice(); var param = params.pop(); var type, unused_opt; while (param) { type = func[param]; unused_opt = func["(unusedOption)"] || state.option.unused; unused_opt = unused_opt === true ? "last-param" : unused_opt; if (param === "undefined") return; if (type === "unused" || type === "unction") { warnUnused(param, func["(tokens)"][param], "param", func["(unusedOption)"]); } else if (unused_opt === "last-param") { return; } param = params.pop(); } }); for (var key in declared) { if (_.has(declared, key) && !_.has(global, key)) { warnUnused(key, declared[key], "var"); } } } catch (err) { if (err && err.name === "JSHintError") { var nt = state.tokens.next || {}; JSHINT.errors.push({ scope : "(main)", raw : err.raw, code : err.code, reason : err.message, line : err.line || nt.line, character : err.character || nt.from }, null); } else { throw err; } } if (JSHINT.scope === "(main)") { o = o || {}; for (i = 0; i < JSHINT.internals.length; i += 1) { k = JSHINT.internals[i]; o.scope = k.elem; itself(k.value, o, g); } } return JSHINT.errors.length === 0; }; itself.addModule = function (func) { extraModules.push(func); }; itself.addModule(style.register); itself.data = function () { var data = { functions: [], options: state.option }; var implieds = []; var members = []; var fu, f, i, j, n, globals; if (itself.errors.length) { data.errors = itself.errors; } if (state.jsonMode) { data.json = true; } for (n in implied) { if (_.has(implied, n)) { implieds.push({ name: n, line: implied[n] }); } } if (implieds.length > 0) { data.implieds = implieds; } if (urls.length > 0) { data.urls = urls; } globals = Object.keys(scope); if (globals.length > 0) { data.globals = globals; } for (i = 1; i < functions.length; i += 1) { f = functions[i]; fu = {}; for (j = 0; j < functionicity.length; j += 1) { fu[functionicity[j]] = []; } for (j = 0; j < functionicity.length; j += 1) { if (fu[functionicity[j]].length === 0) { delete fu[functionicity[j]]; } } fu.name = f["(name)"]; fu.param = f["(params)"]; fu.line = f["(line)"]; fu.character = f["(character)"]; fu.last = f["(last)"]; fu.lastcharacter = f["(lastcharacter)"]; data.functions.push(fu); } if (unuseds.length > 0) { data.unused = unuseds; } members = []; for (n in member) { if (typeof member[n] === "number") { data.member = member; break; } } return data; }; itself.jshint = itself; return itself; }()); if (typeof exports === "object" && exports) { exports.JSHINT = JSHINT; } }, {"../shared/messages.js":2,"../shared/vars.js":3,"./lex.js":5,"./reg.js":6,"./state.js":7,"./style.js":8,"console-browserify":9,"events":10,"underscore":1}], 5:[function(req,module,exports){ var _ = req("underscore"); var events = req("events"); var reg = req("./reg.js"); var state = req("./state.js").state; var Token = { Identifier: 1, Punctuator: 2, NumericLiteral: 3, StringLiteral: 4, Comment: 5, Keyword: 6, NullLiteral: 7, BooleanLiteral: 8, RegExp: 9 }; var unicodeLetterTable = [ 170, 170, 181, 181, 186, 186, 192, 214, 216, 246, 248, 705, 710, 721, 736, 740, 748, 748, 750, 750, 880, 884, 886, 887, 890, 893, 902, 902, 904, 906, 908, 908, 910, 929, 931, 1013, 1015, 1153, 1162, 1319, 1329, 1366, 1369, 1369, 1377, 1415, 1488, 1514, 1520, 1522, 1568, 1610, 1646, 1647, 1649, 1747, 1749, 1749, 1765, 1766, 1774, 1775, 1786, 1788, 1791, 1791, 1808, 1808, 1810, 1839, 1869, 1957, 1969, 1969, 1994, 2026, 2036, 2037, 2042, 2042, 2048, 2069, 2074, 2074, 2084, 2084, 2088, 2088, 2112, 2136, 2308, 2361, 2365, 2365, 2384, 2384, 2392, 2401, 2417, 2423, 2425, 2431, 2437, 2444, 2447, 2448, 2451, 2472, 2474, 2480, 2482, 2482, 2486, 2489, 2493, 2493, 2510, 2510, 2524, 2525, 2527, 2529, 2544, 2545, 2565, 2570, 2575, 2576, 2579, 2600, 2602, 2608, 2610, 2611, 2613, 2614, 2616, 2617, 2649, 2652, 2654, 2654, 2674, 2676, 2693, 2701, 2703, 2705, 2707, 2728, 2730, 2736, 2738, 2739, 2741, 2745, 2749, 2749, 2768, 2768, 2784, 2785, 2821, 2828, 2831, 2832, 2835, 2856, 2858, 2864, 2866, 2867, 2869, 2873, 2877, 2877, 2908, 2909, 2911, 2913, 2929, 2929, 2947, 2947, 2949, 2954, 2958, 2960, 2962, 2965, 2969, 2970, 2972, 2972, 2974, 2975, 2979, 2980, 2984, 2986, 2990, 3001, 3024, 3024, 3077, 3084, 3086, 3088, 3090, 3112, 3114, 3123, 3125, 3129, 3133, 3133, 3160, 3161, 3168, 3169, 3205, 3212, 3214, 3216, 3218, 3240, 3242, 3251, 3253, 3257, 3261, 3261, 3294, 3294, 3296, 3297, 3313, 3314, 3333, 3340, 3342, 3344, 3346, 3386, 3389, 3389, 3406, 3406, 3424, 3425, 3450, 3455, 3461, 3478, 3482, 3505, 3507, 3515, 3517, 3517, 3520, 3526, 3585, 3632, 3634, 3635, 3648, 3654, 3713, 3714, 3716, 3716, 3719, 3720, 3722, 3722, 3725, 3725, 3732, 3735, 3737, 3743, 3745, 3747, 3749, 3749, 3751, 3751, 3754, 3755, 3757, 3760, 3762, 3763, 3773, 3773, 3776, 3780, 3782, 3782, 3804, 3805, 3840, 3840, 3904, 3911, 3913, 3948, 3976, 3980, 4096, 4138, 4159, 4159, 4176, 4181, 4186, 4189, 4193, 4193, 4197, 4198, 4206, 4208, 4213, 4225, 4238, 4238, 4256, 4293, 4304, 4346, 4348, 4348, 4352, 4680, 4682, 4685, 4688, 4694, 4696, 4696, 4698, 4701, 4704, 4744, 4746, 4749, 4752, 4784, 4786, 4789, 4792, 4798, 4800, 4800, 4802, 4805, 4808, 4822, 4824, 4880, 4882, 4885, 4888, 4954, 4992, 5007, 5024, 5108, 5121, 5740, 5743, 5759, 5761, 5786, 5792, 5866, 5870, 5872, 5888, 5900, 5902, 5905, 5920, 5937, 5952, 5969, 5984, 5996, 5998, 6000, 6016, 6067, 6103, 6103, 6108, 6108, 6176, 6263, 6272, 6312, 6314, 6314, 6320, 6389, 6400, 6428, 6480, 6509, 6512, 6516, 6528, 6571, 6593, 6599, 6656, 6678, 6688, 6740, 6823, 6823, 6917, 6963, 6981, 6987, 7043, 7072, 7086, 7087, 7104, 7141, 7168, 7203, 7245, 7247, 7258, 7293, 7401, 7404, 7406, 7409, 7424, 7615, 7680, 7957, 7960, 7965, 7968, 8005, 8008, 8013, 8016, 8023, 8025, 8025, 8027, 8027, 8029, 8029, 8031, 8061, 8064, 8116, 8118, 8124, 8126, 8126, 8130, 8132, 8134, 8140, 8144, 8147, 8150, 8155, 8160, 8172, 8178, 8180, 8182, 8188, 8305, 8305, 8319, 8319, 8336, 8348, 8450, 8450, 8455, 8455, 8458, 8467, 8469, 8469, 8473, 8477, 8484, 8484, 8486, 8486, 8488, 8488, 8490, 8493, 8495, 8505, 8508, 8511, 8517, 8521, 8526, 8526, 8544, 8584, 11264, 11310, 11312, 11358, 11360, 11492, 11499, 11502, 11520, 11557, 11568, 11621, 11631, 11631, 11648, 11670, 11680, 11686, 11688, 11694, 11696, 11702, 11704, 11710, 11712, 11718, 11720, 11726, 11728, 11734, 11736, 11742, 11823, 11823, 12293, 12295, 12321, 12329, 12337, 12341, 12344, 12348, 12353, 12438, 12445, 12447, 12449, 12538, 12540, 12543, 12549, 12589, 12593, 12686, 12704, 12730, 12784, 12799, 13312, 13312, 19893, 19893, 19968, 19968, 40907, 40907, 40960, 42124, 42192, 42237, 42240, 42508, 42512, 42527, 42538, 42539, 42560, 42606, 42623, 42647, 42656, 42735, 42775, 42783, 42786, 42888, 42891, 42894, 42896, 42897, 42912, 42921, 43002, 43009, 43011, 43013, 43015, 43018, 43020, 43042, 43072, 43123, 43138, 43187, 43250, 43255, 43259, 43259, 43274, 43301, 43312, 43334, 43360, 43388, 43396, 43442, 43471, 43471, 43520, 43560, 43584, 43586, 43588, 43595, 43616, 43638, 43642, 43642, 43648, 43695, 43697, 43697, 43701, 43702, 43705, 43709, 43712, 43712, 43714, 43714, 43739, 43741, 43777, 43782, 43785, 43790, 43793, 43798, 43808, 43814, 43816, 43822, 43968, 44002, 44032, 44032, 55203, 55203, 55216, 55238, 55243, 55291, 63744, 64045, 64048, 64109, 64112, 64217, 64256, 64262, 64275, 64279, 64285, 64285, 64287, 64296, 64298, 64310, 64312, 64316, 64318, 64318, 64320, 64321, 64323, 64324, 64326, 64433, 64467, 64829, 64848, 64911, 64914, 64967, 65008, 65019, 65136, 65140, 65142, 65276, 65313, 65338, 65345, 65370, 65382, 65470, 65474, 65479, 65482, 65487, 65490, 65495, 65498, 65500, 65536, 65547, 65549, 65574, 65576, 65594, 65596, 65597, 65599, 65613, 65616, 65629, 65664, 65786, 65856, 65908, 66176, 66204, 66208, 66256, 66304, 66334, 66352, 66378, 66432, 66461, 66464, 66499, 66504, 66511, 66513, 66517, 66560, 66717, 67584, 67589, 67592, 67592, 67594, 67637, 67639, 67640, 67644, 67644, 67647, 67669, 67840, 67861, 67872, 67897, 68096, 68096, 68112, 68115, 68117, 68119, 68121, 68147, 68192, 68220, 68352, 68405, 68416, 68437, 68448, 68466, 68608, 68680, 69635, 69687, 69763, 69807, 73728, 74606, 74752, 74850, 77824, 78894, 92160, 92728, 110592, 110593, 119808, 119892, 119894, 119964, 119966, 119967, 119970, 119970, 119973, 119974, 119977, 119980, 119982, 119993, 119995, 119995, 119997, 120003, 120005, 120069, 120071, 120074, 120077, 120084, 120086, 120092, 120094, 120121, 120123, 120126, 120128, 120132, 120134, 120134, 120138, 120144, 120146, 120485, 120488, 120512, 120514, 120538, 120540, 120570, 120572, 120596, 120598, 120628, 120630, 120654, 120656, 120686, 120688, 120712, 120714, 120744, 120746, 120770, 120772, 120779, 131072, 131072, 173782, 173782, 173824, 173824, 177972, 177972, 177984, 177984, 178205, 178205, 194560, 195101 ]; var identifierStartTable = []; for (var i = 0; i < 128; i++) { identifierStartTable[i] = i === 36 || // $ i >= 65 && i <= 90 || // A-Z i === 95 || // _ i >= 97 && i <= 122; // a-z } var identifierPartTable = []; for (var i = 0; i < 128; i++) { identifierPartTable[i] = identifierStartTable[i] || // $, _, A-Z, a-z i >= 48 && i <= 57; // 0-9 } function asyncTrigger() { var _checks = []; return { push: function (fn) { _checks.push(fn); }, check: function () { for (var check = 0; check < _checks.length; ++check) { _checks[check](); } _checks.splice(0, _checks.length); } }; } function Lexer(source) { var lines = source; if (typeof lines === "string") { lines = lines .replace(/\r\n/g, "\n") .replace(/\r/g, "\n") .split("\n"); } if (lines[0] && lines[0].substr(0, 2) === "#!") { lines[0] = ""; } this.emitter = new events.EventEmitter(); this.source = source; this.setLines(lines); this.prereg = true; this.line = 0; this.char = 1; this.from = 1; this.input = ""; for (var i = 0; i < state.option.indent; i += 1) { state.tab += " "; } } Lexer.prototype = { _lines: [], getLines: function () { this._lines = state.lines; return this._lines; }, setLines: function (val) { this._lines = val; state.lines = this._lines; }, peek: function (i) { return this.input.charAt(i || 0); }, skip: function (i) { i = i || 1; this.char += i; this.input = this.input.slice(i); }, on: function (names, listener) { names.split(" ").forEach(function (name) { this.emitter.on(name, listener); }.bind(this)); }, trigger: function () { this.emitter.emit.apply(this.emitter, Array.prototype.slice.call(arguments)); }, triggerAsync: function (type, args, checks, fn) { checks.push(function () { if (fn()) { this.trigger(type, args); } }.bind(this)); }, scanPunctuator: function () { var ch1 = this.peek(); var ch2, ch3, ch4; switch (ch1) { case ".": if ((/^[0-9]$/).test(this.peek(1))) { return null; } if (this.peek(1) === "." && this.peek(2) === ".") { return { type: Token.Punctuator, value: "..." }; } case "(": case ")": case ";": case ",": case "{": case "}": case "[": case "]": case ":": case "~": case "?": return { type: Token.Punctuator, value: ch1 }; case "#": return { type: Token.Punctuator, value: ch1 }; case "": return null; } ch2 = this.peek(1); ch3 = this.peek(2); ch4 = this.peek(3); if (ch1 === ">" && ch2 === ">" && ch3 === ">" && ch4 === "=") { return { type: Token.Punctuator, value: ">>>=" }; } if (ch1 === "=" && ch2 === "=" && ch3 === "=") { return { type: Token.Punctuator, value: "===" }; } if (ch1 === "!" && ch2 === "=" && ch3 === "=") { return { type: Token.Punctuator, value: "!==" }; } if (ch1 === ">" && ch2 === ">" && ch3 === ">") { return { type: Token.Punctuator, value: ">>>" }; } if (ch1 === "<" && ch2 === "<" && ch3 === "=") { return { type: Token.Punctuator, value: "<<=" }; } if (ch1 === ">" && ch2 === ">" && ch3 === "=") { return { type: Token.Punctuator, value: ">>=" }; } if (ch1 === "=" && ch2 === ">") { return { type: Token.Punctuator, value: ch1 + ch2 }; } if (ch1 === ch2 && ("+-<>&|".indexOf(ch1) >= 0)) { return { type: Token.Punctuator, value: ch1 + ch2 }; } if ("<>=!+-*%&|^".indexOf(ch1) >= 0) { if (ch2 === "=") { return { type: Token.Punctuator, value: ch1 + ch2 }; } return { type: Token.Punctuator, value: ch1 }; } if (ch1 === "/") { if (ch2 === "=" && /\/=(?!(\S*\/[gim]?))/.test(this.input)) { return { type: Token.Punctuator, value: "/=" }; } return { type: Token.Punctuator, value: "/" }; } return null; }, scanComments: function () { var ch1 = this.peek(); var ch2 = this.peek(1); var rest = this.input.substr(2); var startLine = this.line; var startChar = this.char; function commentToken(label, body, opt) { var special = ["jshint", "jslint", "members", "member", "globals", "global", "exported"]; var isSpecial = false; var value = label + body; var commentType = "plain"; opt = opt || {}; if (opt.isMultiline) { value += "*/"; } special.forEach(function (str) { if (isSpecial) { return; } if (label === "//" && str !== "jshint") { return; } if (body.substr(0, str.length) === str) { isSpecial = true; label = label + str; body = body.substr(str.length); } if (!isSpecial && body.charAt(0) === " " && body.substr(1, str.length) === str) { isSpecial = true; label = label + " " + str; body = body.substr(str.length + 1); } if (!isSpecial) { return; } switch (str) { case "member": commentType = "members"; break; case "global": commentType = "globals"; break; default: commentType = str; } }); return { type: Token.Comment, commentType: commentType, value: value, body: body, isSpecial: isSpecial, isMultiline: opt.isMultiline || false, isMalformed: opt.isMalformed || false }; } if (ch1 === "*" && ch2 === "/") { this.trigger("error", { code: "E018", line: startLine, character: startChar }); this.skip(2); return null; } if (ch1 !== "/" || (ch2 !== "*" && ch2 !== "/")) { return null; } if (ch2 === "/") { this.skip(this.input.length); // Skip to the EOL. return commentToken("//", rest); } var body = ""; if (ch2 === "*") { this.skip(2); while (this.peek() !== "*" || this.peek(1) !== "/") { if (this.peek() === "") { // End of Line body += "\n"; if (!this.nextLine()) { this.trigger("error", { code: "E017", line: startLine, character: startChar }); return commentToken("/*", body, { isMultiline: true, isMalformed: true }); } } else { body += this.peek(); this.skip(); } } this.skip(2); return commentToken("/*", body, { isMultiline: true }); } }, scanKeyword: function () { var result = /^[a-zA-Z_$][a-zA-Z0-9_$]*/.exec(this.input); var keywords = [ "if", "in", "do", "var", "for", "new", "try", "let", "this", "else", "case", "void", "with", "enum", "while", "break", "catch", "throw", "const", "yield", "class", "super", "return", "typeof", "delete", "switch", "export", "import", "default", "finally", "extends", "function", "continue", "debugger", "instanceof" ]; if (result && keywords.indexOf(result[0]) >= 0) { return { type: Token.Keyword, value: result[0] }; } return null; }, scanIdentifier: function () { var id = ""; var index = 0; var type, char; function isUnicodeLetter(code) { for (var i = 0; i < unicodeLetterTable.length;) { if (code < unicodeLetterTable[i++]) { return false; } if (code <= unicodeLetterTable[i++]) { return true; } } return false; } function isHexDigit(str) { return (/^[0-9a-fA-F]$/).test(str); } var readUnicodeEscapeSequence = function () { index += 1; if (this.peek(index) !== "u") { return null; } var ch1 = this.peek(index + 1); var ch2 = this.peek(index + 2); var ch3 = this.peek(index + 3); var ch4 = this.peek(index + 4); var code; if (isHexDigit(ch1) && isHexDigit(ch2) && isHexDigit(ch3) && isHexDigit(ch4)) { code = parseInt(ch1 + ch2 + ch3 + ch4, 16); if (isUnicodeLetter(code)) { index += 5; return "\\u" + ch1 + ch2 + ch3 + ch4; } return null; } return null; }.bind(this); var getIdentifierStart = function () { var chr = this.peek(index); var code = chr.charCodeAt(0); if (code === 92) { return readUnicodeEscapeSequence(); } if (code < 128) { if (identifierStartTable[code]) { index += 1; return chr; } return null; } if (isUnicodeLetter(code)) { index += 1; return chr; } return null; }.bind(this); var getIdentifierPart = function () { var chr = this.peek(index); var code = chr.charCodeAt(0); if (code === 92) { return readUnicodeEscapeSequence(); } if (code < 128) { if (identifierPartTable[code]) { index += 1; return chr; } return null; } if (isUnicodeLetter(code)) { index += 1; return chr; } return null; }.bind(this); char = getIdentifierStart(); if (char === null) { return null; } id = char; for (;;) { char = getIdentifierPart(); if (char === null) { break; } id += char; } switch (id) { case "true": case "false": type = Token.BooleanLiteral; break; case "null": type = Token.NullLiteral; break; default: type = Token.Identifier; } return { type: type, value: id }; }, scanNumericLiteral: function () { var index = 0; var value = ""; var length = this.input.length; var char = this.peek(index); var bad; function isDecimalDigit(str) { return (/^[0-9]$/).test(str); } function isOctalDigit(str) { return (/^[0-7]$/).test(str); } function isHexDigit(str) { return (/^[0-9a-fA-F]$/).test(str); } function isIdentifierStart(ch) { return (ch === "$") || (ch === "_") || (ch === "\\") || (ch >= "a" && ch <= "z") || (ch >= "A" && ch <= "Z"); } if (char !== "." && !isDecimalDigit(char)) { return null; } if (char !== ".") { value = this.peek(index); index += 1; char = this.peek(index); if (value === "0") { if (char === "x" || char === "X") { index += 1; value += char; while (index < length) { char = this.peek(index); if (!isHexDigit(char)) { break; } value += char; index += 1; } if (value.length <= 2) { // 0x return { type: Token.NumericLiteral, value: value, isMalformed: true }; } if (index < length) { char = this.peek(index); if (isIdentifierStart(char)) { return null; } } return { type: Token.NumericLiteral, value: value, base: 16, isMalformed: false }; } if (isOctalDigit(char)) { index += 1; value += char; bad = false; while (index < length) { char = this.peek(index); if (isDecimalDigit(char)) { bad = true; } else if (!isOctalDigit(char)) { break; } value += char; index += 1; } if (index < length) { char = this.peek(index); if (isIdentifierStart(char)) { return null; } } return { type: Token.NumericLiteral, value: value, base: 8, isMalformed: false }; } if (isDecimalDigit(char)) { index += 1; value += char; } } while (index < length) { char = this.peek(index); if (!isDecimalDigit(char)) { break; } value += char; index += 1; } } if (char === ".") { value += char; index += 1; while (index < length) { char = this.peek(index); if (!isDecimalDigit(char)) { break; } value += char; index += 1; } } if (char === "e" || char === "E") { value += char; index += 1; char = this.peek(index); if (char === "+" || char === "-") { value += this.peek(index); index += 1; } char = this.peek(index); if (isDecimalDigit(char)) { value += char; index += 1; while (index < length) { char = this.peek(index); if (!isDecimalDigit(char)) { break; } value += char; index += 1; } } else { return null; } } if (index < length) { char = this.peek(index); if (isIdentifierStart(char)) { return null; } } return { type: Token.NumericLiteral, value: value, base: 10, isMalformed: !isFinite(value) }; }, scanStringLiteral: function (checks) { var quote = this.peek(); if (quote !== "\"" && quote !== "'") { return null; } this.triggerAsync("warning", { code: "W108", line: this.line, character: this.char // +1? }, checks, function () { return state.jsonMode && quote !== "\""; }); var value = ""; var startLine = this.line; var startChar = this.char; var allowNewLine = false; this.skip(); while (this.peek() !== quote) { while (this.peek() === "") { // End Of Line if (!allowNewLine) { this.trigger("warning", { code: "W112", line: this.line, character: this.char }); } else { allowNewLine = false; this.triggerAsync("warning", { code: "W043", line: this.line, character: this.char }, checks, function () { return !state.option.multistr; }); this.triggerAsync("warning", { code: "W042", line: this.line, character: this.char }, checks, function () { return state.jsonMode && state.option.multistr; }); } if (!this.nextLine()) { this.trigger("error", { code: "E029", line: startLine, character: startChar }); return { type: Token.StringLiteral, value: value, isUnclosed: true, quote: quote }; } } allowNewLine = false; var char = this.peek(); var jump = 1; // A length of a jump, after we're done if (char < " ") { this.trigger("warning", { code: "W113", line: this.line, character: this.char, data: [ "" ] }); } if (char === "\\") { this.skip(); char = this.peek(); switch (char) { case "'": this.triggerAsync("warning", { code: "W114", line: this.line, character: this.char, data: [ "\\'" ] }, checks, function () {return state.jsonMode; }); break; case "b": char = "\b"; break; case "f": char = "\f"; break; case "n": char = "\n"; break; case "r": char = "\r"; break; case "t": char = "\t"; break; case "0": char = "\0"; var n = parseInt(this.peek(1), 10); this.triggerAsync("warning", { code: "W115", line: this.line, character: this.char }, checks, function () { return n >= 0 && n <= 7 && state.directive["use strict"]; }); break; case "u": char = String.fromCharCode(parseInt(this.input.substr(1, 4), 16)); jump = 5; break; case "v": this.triggerAsync("warning", { code: "W114", line: this.line, character: this.char, data: [ "\\v" ] }, checks, function () { return state.jsonMode; }); char = "\v"; break; case "x": var x = parseInt(this.input.substr(1, 2), 16); this.triggerAsync("warning", { code: "W114", line: this.line, character: this.char, data: [ "\\x-" ] }, checks, function () { return state.jsonMode; }); char = String.fromCharCode(x); jump = 3; break; case "\\": case "\"": case "/": break; case "": allowNewLine = true; char = ""; break; case "!": if (value.slice(value.length - 2) === "<") { break; } default: this.trigger("warning", { code: "W044", line: this.line, character: this.char }); } } value += char; this.skip(jump); } this.skip(); return { type: Token.StringLiteral, value: value, isUnclosed: false, quote: quote }; }, scanRegExp: function () { var index = 0; var length = this.input.length; var char = this.peek(); var value = char; var body = ""; var flags = []; var malformed = false; var isCharSet = false; var terminated; var scanUnexpectedChars = function () { if (char < " ") { malformed = true; this.trigger("warning", { code: "W048", line: this.line, character: this.char }); } if (char === "<") { malformed = true; this.trigger("warning", { code: "W049", line: this.line, character: this.char, data: [ char ] }); } }.bind(this); if (!this.prereg || char !== "/") { return null; } index += 1; terminated = false; while (index < length) { char = this.peek(index); value += char; body += char; if (isCharSet) { if (char === "]") { if (this.peek(index - 1) !== "\\" || this.peek(index - 2) === "\\") { isCharSet = false; } } if (char === "\\") { index += 1; char = this.peek(index); body += char; value += char; scanUnexpectedChars(); } index += 1; continue; } if (char === "\\") { index += 1; char = this.peek(index); body += char; value += char; scanUnexpectedChars(); if (char === "/") { index += 1; continue; } if (char === "[") { index += 1; continue; } } if (char === "[") { isCharSet = true; index += 1; continue; } if (char === "/") { body = body.substr(0, body.length - 1); terminated = true; index += 1; break; } index += 1; } if (!terminated) { this.trigger("error", { code: "E015", line: this.line, character: this.from }); return void this.trigger("fatal", { line: this.line, from: this.from }); } while (index < length) { char = this.peek(index); if (!/[gim]/.test(char)) { break; } flags.push(char); value += char; index += 1; } try { new RegExp(body, flags.join("")); } catch (err) { malformed = true; this.trigger("error", { code: "E016", line: this.line, character: this.char, data: [ err.message ] // Platform dependent! }); } return { type: Token.RegExp, value: value, flags: flags, isMalformed: malformed }; }, scanMixedSpacesAndTabs: function () { var at, match; if (state.option.smarttabs) { match = this.input.match(/(\/\/|^\s?\*)? \t/); at = match && !match[1] ? 0 : -1; } else { at = this.input.search(/ \t|\t [^\*]/); } return at; }, scanUnsafeChars: function () { return this.input.search(reg.unsafeChars); }, next: function (checks) { this.from = this.char; var start; if (/\s/.test(this.peek())) { start = this.char; while (/\s/.test(this.peek())) { this.from += 1; this.skip(); } if (this.peek() === "") { // EOL if (!/^\s*$/.test(this.getLines()[this.line - 1]) && state.option.trailing) { this.trigger("warning", { code: "W102", line: this.line, character: start }); } } } var match = this.scanComments() || this.scanStringLiteral(checks); if (match) { return match; } match = this.scanRegExp() || this.scanPunctuator() || this.scanKeyword() || this.scanIdentifier() || this.scanNumericLiteral(); if (match) { this.skip(match.value.length); return match; } return null; }, nextLine: function () { var char; if (this.line >= this.getLines().length) { return false; } this.input = this.getLines()[this.line]; this.line += 1; this.char = 1; this.from = 1; char = this.scanMixedSpacesAndTabs(); if (char >= 0) { this.trigger("warning", { code: "W099", line: this.line, character: char + 1 }); } this.input = this.input.replace(/\t/g, state.tab); char = this.scanUnsafeChars(); if (char >= 0) { this.trigger("warning", { code: "W100", line: this.line, character: char }); } if (state.option.maxlen && state.option.maxlen < this.input.length) { this.trigger("warning", { code: "W101", line: this.line, character: this.input.length }); } return true; }, start: function () { this.nextLine(); }, token: function () { var checks = asyncTrigger(); var token; function isReserved(token, isProperty) { if (!token.reserved) { return false; } var meta = token.meta; if (meta && meta.isFutureReservedWord && state.option.inES5()) { if (!meta.es5) { return false; } if (meta.strictOnly) { if (!state.option.strict && !state.directive["use strict"]) { return false; } } if (isProperty) { return false; } } return true; } var create = function (type, value, isProperty) { var obj; if (type !== "(endline)" && type !== "(end)") { this.prereg = false; } if (type === "(punctuator)") { switch (value) { case ".": case ")": case "~": case "#": case "]": this.prereg = false; break; default: this.prereg = true; } obj = Object.create(state.syntax[value] || state.syntax["(error)"]); } if (type === "(identifier)") { if (value === "return" || value === "case" || value === "typeof") { this.prereg = true; } if (_.has(state.syntax, value)) { obj = Object.create(state.syntax[value] || state.syntax["(error)"]); if (!isReserved(obj, isProperty && type === "(identifier)")) { obj = null; } } } if (!obj) { obj = Object.create(state.syntax[type]); } obj.identifier = (type === "(identifier)"); obj.type = obj.type || type; obj.value = value; obj.line = this.line; obj.character = this.char; obj.from = this.from; if (isProperty && obj.identifier) { obj.isProperty = isProperty; } obj.check = checks.check; return obj; }.bind(this); for (;;) { if (!this.input.length) { return create(this.nextLine() ? "(endline)" : "(end)", ""); } token = this.next(checks); if (!token) { if (this.input.length) { this.trigger("error", { code: "E024", line: this.line, character: this.char, data: [ this.peek() ] }); this.input = ""; } continue; } switch (token.type) { case Token.StringLiteral: this.triggerAsync("String", { line: this.line, char: this.char, from: this.from, value: token.value, quote: token.quote }, checks, function () { return true; }); return create("(string)", token.value); case Token.Identifier: this.trigger("Identifier", { line: this.line, char: this.char, from: this.form, name: token.value, isProperty: state.tokens.curr.id === "." }); case Token.Keyword: case Token.NullLiteral: case Token.BooleanLiteral: return create("(identifier)", token.value, state.tokens.curr.id === "."); case Token.NumericLiteral: if (token.isMalformed) { this.trigger("warning", { code: "W045", line: this.line, character: this.char, data: [ token.value ] }); } this.triggerAsync("warning", { code: "W114", line: this.line, character: this.char, data: [ "0x-" ] }, checks, function () { return token.base === 16 && state.jsonMode; }); this.triggerAsync("warning", { code: "W115", line: this.line, character: this.char }, checks, function () { return state.directive["use strict"] && token.base === 8; }); this.trigger("Number", { line: this.line, char: this.char, from: this.from, value: token.value, base: token.base, isMalformed: token.malformed }); return create("(number)", token.value); case Token.RegExp: return create("(regexp)", token.value); case Token.Comment: state.tokens.curr.comment = true; if (token.isSpecial) { return { value: token.value, body: token.body, type: token.commentType, isSpecial: token.isSpecial, line: this.line, character: this.char, from: this.from }; } break; case "": break; default: return create("(punctuator)", token.value); } } } }; exports.Lexer = Lexer; }, {"./reg.js":6,"./state.js":7,"events":10,"underscore":1}], 6:[function(req,module,exports){ "use string"; exports.unsafeString = /@cc|<\/?|script|\]\s*\]|<\s*!|</i; exports.unsafeChars = /[\u0000-\u001f\u007f-\u009f\u00ad\u0600-\u0604\u070f\u17b4\u17b5\u200c-\u200f\u2028-\u202f\u2060-\u206f\ufeff\ufff0-\uffff]/; exports.needEsc = /[\u0000-\u001f&<"\/\\\u007f-\u009f\u00ad\u0600-\u0604\u070f\u17b4\u17b5\u200c-\u200f\u2028-\u202f\u2060-\u206f\ufeff\ufff0-\uffff]/; exports.needEscGlobal = /[\u0000-\u001f&<"\/\\\u007f-\u009f\u00ad\u0600-\u0604\u070f\u17b4\u17b5\u200c-\u200f\u2028-\u202f\u2060-\u206f\ufeff\ufff0-\uffff]/g; exports.starSlash = /\*\//; exports.identifier = /^([a-zA-Z_$][a-zA-Z0-9_$]*)$/; exports.javascriptURL = /^(?:javascript|jscript|ecmascript|vbscript|mocha|livescript)\s*:/i; exports.fallsThrough = /^\s*\/\*\s*falls?\sthrough\s*\*\/\s*$/; }, {}], 7:[function(req,module,exports){ var state = { syntax: {}, reset: function () { this.tokens = { prev: null, next: null, curr: null }; this.option = {}; this.ignored = {}; this.directive = {}; this.jsonMode = false; this.jsonWarnings = []; this.lines = []; this.tab = ""; this.cache = {}; // Node.JS doesn't have Map. Sniff. } }; exports.state = state; }, {}], 8:[function(req,module,exports){ exports.register = function (linter) { linter.on("Identifier", function style_scanProto(data) { if (linter.getOption("proto")) { return; } if (data.name === "__proto__") { linter.warn("W103", { line: data.line, char: data.char, data: [ data.name ] }); } }); linter.on("Identifier", function style_scanIterator(data) { if (linter.getOption("iterator")) { return; } if (data.name === "__iterator__") { linter.warn("W104", { line: data.line, char: data.char, data: [ data.name ] }); } }); linter.on("Identifier", function style_scanDangling(data) { if (!linter.getOption("nomen")) { return; } if (data.name === "_") { return; } if (linter.getOption("node")) { if (/^(__dirname|__filename)$/.test(data.name) && !data.isProperty) { return; } } if (/^(_+.*|.*_+)$/.test(data.name)) { linter.warn("W105", { line: data.line, char: data.from, data: [ "dangling '_'", data.name ] }); } }); linter.on("Identifier", function style_scanCamelCase(data) { if (!linter.getOption("camelcase")) { return; } if (data.name.replace(/^_+/, "").indexOf("_") > -1 && !data.name.match(/^[A-Z0-9_]*$/)) { linter.warn("W106", { line: data.line, char: data.from, data: [ data.name ] }); } }); linter.on("String", function style_scanQuotes(data) { var quotmark = linter.getOption("quotmark"); var code; if (!quotmark) { return; } if (quotmark === "single" && data.quote !== "'") { code = "W109"; } if (quotmark === "double" && data.quote !== "\"") { code = "W108"; } if (quotmark === true) { if (!linter.getCache("quotmark")) { linter.setCache("quotmark", data.quote); } if (linter.getCache("quotmark") !== data.quote) { code = "W110"; } } if (code) { linter.warn(code, { line: data.line, char: data.char, }); } }); linter.on("Number", function style_scanNumbers(data) { if (data.value.charAt(0) === ".") { linter.warn("W008", { line: data.line, char: data.char, data: [ data.value ] }); } if (data.value.substr(data.value.length - 1) === ".") { linter.warn("W047", { line: data.line, char: data.char, data: [ data.value ] }); } if (/^00+/.test(data.value)) { linter.warn("W046", { line: data.line, char: data.char, data: [ data.value ] }); } }); linter.on("String", function style_scanJavaScriptURLs(data) { var re = /^(?:javascript|jscript|ecmascript|vbscript|mocha|livescript)\s*:/i; if (linter.getOption("scripturl")) { return; } if (re.test(data.value)) { linter.warn("W107", { line: data.line, char: data.char }); } }); }; }, {}], 9:[function(req,module,exports){ }, {}], 10:[function(req,module,exports){ var process=req("__browserify_process");if (!process.EventEmitter) process.EventEmitter = function () {}; var EventEmitter = exports.EventEmitter = process.EventEmitter; var isArray = typeof Array.isArray === 'function' ? Array.isArray : function (xs) { return Object.prototype.toString.call(xs) === '[object Array]' } ; function indexOf (xs, x) { if (xs.indexOf) return xs.indexOf(x); for (var i = 0; i < xs.length; i++) { if (x === xs[i]) return i; } return -1; } var defaultMaxListeners = 200; EventEmitter.prototype.setMaxListeners = function(n) { if (!this._events) this._events = {}; this._events.maxListeners = n; }; EventEmitter.prototype.emit = function(type) { if (type === 'error') { if (!this._events || !this._events.error || (isArray(this._events.error) && !this._events.error.length)) { if (arguments[1] instanceof Error) { throw arguments[1]; // Unhandled 'error' event } else { throw new Error("Uncaught, unspecified 'error' event."); } return false; } } if (!this._events) return false; var handler = this._events[type]; if (!handler) return false; if (typeof handler == 'function') { switch (arguments.length) { case 1: handler.call(this); break; case 2: handler.call(this, arguments[1]); break; case 3: handler.call(this, arguments[1], arguments[2]); break; default: var args = Array.prototype.slice.call(arguments, 1); handler.apply(this, args); } return true; } else if (isArray(handler)) { var args = Array.prototype.slice.call(arguments, 1); var listeners = handler.slice(); for (var i = 0, l = listeners.length; i < l; i++) { listeners[i].apply(this, args); } return true; } else { return false; } }; EventEmitter.prototype.addListener = function(type, listener) { if ('function' !== typeof listener) { throw new Error('addListener only takes instances of Function'); } if (!this._events) this._events = {}; this.emit('newListener', type, listener); if (!this._events[type]) { this._events[type] = listener; } else if (isArray(this._events[type])) { if (!this._events[type].warned) { var m; if (this._events.maxListeners !== undefined) { m = this._events.maxListeners; } else { m = defaultMaxListeners; } if (m && m > 0 && this._events[type].length > m) { this._events[type].warned = true; console.error('(node) warning: possible EventEmitter memory ' + 'leak detected. %d listeners added. ' + 'Use emitter.setMaxListeners() to increase limit.', this._events[type].length); console.trace(); } } this._events[type].push(listener); } else { this._events[type] = [this._events[type], listener]; } return this; }; EventEmitter.prototype.on = EventEmitter.prototype.addListener; EventEmitter.prototype.once = function(type, listener) { var self = this; self.on(type, function g() { self.removeListener(type, g); listener.apply(this, arguments); }); return this; }; EventEmitter.prototype.removeListener = function(type, listener) { if ('function' !== typeof listener) { throw new Error('removeListener only takes instances of Function'); } if (!this._events || !this._events[type]) return this; var list = this._events[type]; if (isArray(list)) { var i = indexOf(list, listener); if (i < 0) return this; list.splice(i, 1); if (list.length == 0) delete this._events[type]; } else if (this._events[type] === listener) { delete this._events[type]; } return this; }; EventEmitter.prototype.removeAllListeners = function(type) { if (arguments.length === 0) { this._events = {}; return this; } if (type && this._events && this._events[type]) this._events[type] = null; return this; }; EventEmitter.prototype.listeners = function(type) { if (!this._events) this._events = {}; if (!this._events[type]) this._events[type] = []; if (!isArray(this._events[type])) { this._events[type] = [this._events[type]]; } return this._events[type]; }; EventEmitter.listenerCount = function(emitter, type) { var ret; if (!emitter._events || !emitter._events[type]) ret = 0; else if (typeof emitter._events[type] === 'function') ret = 1; else ret = emitter._events[type].length; return ret; }; }, {"__browserify_process":11}], 11:[function(req,module,exports){ var process = module.exports = {}; process.nextTick = (function () { var canSetImmediate = typeof window !== 'undefined' && window.setImmediate; var canPost = typeof window !== 'undefined' && window.postMessage && window.addEventListener ; if (canSetImmediate) { return function (f) { return window.setImmediate(f) }; } if (canPost) { var queue = []; window.addEventListener('message', function (ev) { if (ev.source === window && ev.data === 'process-tick') { ev.stopPropagation(); if (queue.length > 0) { var fn = queue.shift(); fn(); } } }, true); return function nextTick(fn) { queue.push(fn); window.postMessage('process-tick', '*'); }; } return function nextTick(fn) { setTimeout(fn, 0); }; })(); process.title = 'browser'; process.browser = true; process.env = {}; process.argv = []; process.binding = function (name) { throw new Error('process.binding is not supported'); } process.cwd = function () { return '/' }; process.chdir = function (dir) { throw new Error('process.chdir is not supported'); }; }, {}], "jshint":[function(req,module,exports){ module.exports=req('n4bKNg'); }, {}]},{},["n4bKNg"]) ; function req() {return require.apply(this, arguments)} module.exports = req("jshint"); });apache-couchdb-1.6.0/src/fauxton/assets/js/libs/ace/ace.js0000644000175000001440000215537712332105522023302 0ustar00djcusers00000000000000/* ***** BEGIN LICENSE BLOCK ***** * Distributed under the BSD license: * * Copyright (c) 2010, Ajax.org B.V. * All rights reserved. * * 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 Ajax.org B.V. nor the * names of its contributors may be used to endorse or promote products * derived from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE * DISCLAIMED. IN NO EVENT SHALL AJAX.ORG B.V. 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. * * ***** END LICENSE BLOCK ***** */ (function() { var ACE_NAMESPACE = ""; var global = (function() { return this; })(); if (!ACE_NAMESPACE && typeof requirejs !== "undefined") return; var _define = function(module, deps, payload) { if (typeof module !== 'string') { if (_define.original) _define.original.apply(window, arguments); else { console.error('dropping module because define wasn\'t a string.'); console.trace(); } return; } if (arguments.length == 2) payload = deps; if (!_define.modules) { _define.modules = {}; _define.payloads = {}; } _define.payloads[module] = payload; _define.modules[module] = null; }; var _require = function(parentId, module, callback) { if (Object.prototype.toString.call(module) === "[object Array]") { var params = []; for (var i = 0, l = module.length; i < l; ++i) { var dep = lookup(parentId, module[i]); if (!dep && _require.original) return _require.original.apply(window, arguments); params.push(dep); } if (callback) { callback.apply(null, params); } } else if (typeof module === 'string') { var payload = lookup(parentId, module); if (!payload && _require.original) return _require.original.apply(window, arguments); if (callback) { callback(); } return payload; } else { if (_require.original) return _require.original.apply(window, arguments); } }; var normalizeModule = function(parentId, moduleName) { if (moduleName.indexOf("!") !== -1) { var chunks = moduleName.split("!"); return normalizeModule(parentId, chunks[0]) + "!" + normalizeModule(parentId, chunks[1]); } if (moduleName.charAt(0) == ".") { var base = parentId.split("/").slice(0, -1).join("/"); moduleName = base + "/" + moduleName; while(moduleName.indexOf(".") !== -1 && previous != moduleName) { var previous = moduleName; moduleName = moduleName.replace(/\/\.\//, "/").replace(/[^\/]+\/\.\.\//, ""); } } return moduleName; }; var lookup = function(parentId, moduleName) { moduleName = normalizeModule(parentId, moduleName); var module = _define.modules[moduleName]; if (!module) { module = _define.payloads[moduleName]; if (typeof module === 'function') { var exports = {}; var mod = { id: moduleName, uri: '', exports: exports, packaged: true }; var req = function(module, callback) { return _require(moduleName, module, callback); }; var returnValue = module(req, exports, mod); exports = returnValue || mod.exports; _define.modules[moduleName] = exports; delete _define.payloads[moduleName]; } module = _define.modules[moduleName] = exports || module; } return module; }; function exportAce(ns) { var require = function(module, callback) { return _require("", module, callback); }; var root = global; if (ns) { if (!global[ns]) global[ns] = {}; root = global[ns]; } if (!root.define || !root.define.packaged) { _define.original = root.define; root.define = _define; root.define.packaged = true; } if (!root.require || !root.require.packaged) { _require.original = root.require; root.require = require; root.require.packaged = true; } } exportAce(ACE_NAMESPACE); })(); define('ace/lib/fixoldbrowsers', ['require', 'exports', 'module' , 'ace/lib/regexp', 'ace/lib/es5-shim'], function(require, exports, module) { require("./regexp"); require("./es5-shim"); }); define('ace/lib/regexp', ['require', 'exports', 'module' ], function(require, exports, module) { var real = { exec: RegExp.prototype.exec, test: RegExp.prototype.test, match: String.prototype.match, replace: String.prototype.replace, split: String.prototype.split }, compliantExecNpcg = real.exec.call(/()??/, "")[1] === undefined, // check `exec` handling of nonparticipating capturing groups compliantLastIndexIncrement = function () { var x = /^/g; real.test.call(x, ""); return !x.lastIndex; }(); if (compliantLastIndexIncrement && compliantExecNpcg) return; RegExp.prototype.exec = function (str) { var match = real.exec.apply(this, arguments), name, r2; if ( typeof(str) == 'string' && match) { if (!compliantExecNpcg && match.length > 1 && indexOf(match, "") > -1) { r2 = RegExp(this.source, real.replace.call(getNativeFlags(this), "g", "")); real.replace.call(str.slice(match.index), r2, function () { for (var i = 1; i < arguments.length - 2; i++) { if (arguments[i] === undefined) match[i] = undefined; } }); } if (this._xregexp && this._xregexp.captureNames) { for (var i = 1; i < match.length; i++) { name = this._xregexp.captureNames[i - 1]; if (name) match[name] = match[i]; } } if (!compliantLastIndexIncrement && this.global && !match[0].length && (this.lastIndex > match.index)) this.lastIndex--; } return match; }; if (!compliantLastIndexIncrement) { RegExp.prototype.test = function (str) { var match = real.exec.call(this, str); if (match && this.global && !match[0].length && (this.lastIndex > match.index)) this.lastIndex--; return !!match; }; } function getNativeFlags (regex) { return (regex.global ? "g" : "") + (regex.ignoreCase ? "i" : "") + (regex.multiline ? "m" : "") + (regex.extended ? "x" : "") + // Proposed for ES4; included in AS3 (regex.sticky ? "y" : ""); } function indexOf (array, item, from) { if (Array.prototype.indexOf) // Use the native array method if available return array.indexOf(item, from); for (var i = from || 0; i < array.length; i++) { if (array[i] === item) return i; } return -1; } }); define('ace/lib/es5-shim', ['require', 'exports', 'module' ], function(require, exports, module) { function Empty() {} if (!Function.prototype.bind) { Function.prototype.bind = function bind(that) { // .length is 1 var target = this; if (typeof target != "function") { throw new TypeError("Function.prototype.bind called on incompatible " + target); } var args = slice.call(arguments, 1); // for normal call var bound = function () { if (this instanceof bound) { var result = target.apply( this, args.concat(slice.call(arguments)) ); if (Object(result) === result) { return result; } return this; } else { return target.apply( that, args.concat(slice.call(arguments)) ); } }; if(target.prototype) { Empty.prototype = target.prototype; bound.prototype = new Empty(); Empty.prototype = null; } return bound; }; } var call = Function.prototype.call; var prototypeOfArray = Array.prototype; var prototypeOfObject = Object.prototype; var slice = prototypeOfArray.slice; var _toString = call.bind(prototypeOfObject.toString); var owns = call.bind(prototypeOfObject.hasOwnProperty); var defineGetter; var defineSetter; var lookupGetter; var lookupSetter; var supportsAccessors; if ((supportsAccessors = owns(prototypeOfObject, "__defineGetter__"))) { defineGetter = call.bind(prototypeOfObject.__defineGetter__); defineSetter = call.bind(prototypeOfObject.__defineSetter__); lookupGetter = call.bind(prototypeOfObject.__lookupGetter__); lookupSetter = call.bind(prototypeOfObject.__lookupSetter__); } if ([1,2].splice(0).length != 2) { if(function() { // test IE < 9 to splice bug - see issue #138 function makeArray(l) { var a = new Array(l+2); a[0] = a[1] = 0; return a; } var array = [], lengthBefore; array.splice.apply(array, makeArray(20)); array.splice.apply(array, makeArray(26)); lengthBefore = array.length; //46 array.splice(5, 0, "XXX"); // add one element lengthBefore + 1 == array.length if (lengthBefore + 1 == array.length) { return true;// has right splice implementation without bugs } }()) {//IE 6/7 var array_splice = Array.prototype.splice; Array.prototype.splice = function(start, deleteCount) { if (!arguments.length) { return []; } else { return array_splice.apply(this, [ start === void 0 ? 0 : start, deleteCount === void 0 ? (this.length - start) : deleteCount ].concat(slice.call(arguments, 2))) } }; } else {//IE8 Array.prototype.splice = function(pos, removeCount){ var length = this.length; if (pos > 0) { if (pos > length) pos = length; } else if (pos == void 0) { pos = 0; } else if (pos < 0) { pos = Math.max(length + pos, 0); } if (!(pos+removeCount < length)) removeCount = length - pos; var removed = this.slice(pos, pos+removeCount); var insert = slice.call(arguments, 2); var add = insert.length; if (pos === length) { if (add) { this.push.apply(this, insert); } } else { var remove = Math.min(removeCount, length - pos); var tailOldPos = pos + remove; var tailNewPos = tailOldPos + add - remove; var tailCount = length - tailOldPos; var lengthAfterRemove = length - remove; if (tailNewPos < tailOldPos) { // case A for (var i = 0; i < tailCount; ++i) { this[tailNewPos+i] = this[tailOldPos+i]; } } else if (tailNewPos > tailOldPos) { // case B for (i = tailCount; i--; ) { this[tailNewPos+i] = this[tailOldPos+i]; } } // else, add == remove (nothing to do) if (add && pos === lengthAfterRemove) { this.length = lengthAfterRemove; // truncate array this.push.apply(this, insert); } else { this.length = lengthAfterRemove + add; // reserves space for (i = 0; i < add; ++i) { this[pos+i] = insert[i]; } } } return removed; }; } } if (!Array.isArray) { Array.isArray = function isArray(obj) { return _toString(obj) == "[object Array]"; }; } var boxedString = Object("a"), splitString = boxedString[0] != "a" || !(0 in boxedString); if (!Array.prototype.forEach) { Array.prototype.forEach = function forEach(fun /*, thisp*/) { var object = toObject(this), self = splitString && _toString(this) == "[object String]" ? this.split("") : object, thisp = arguments[1], i = -1, length = self.length >>> 0; if (_toString(fun) != "[object Function]") { throw new TypeError(); // TODO message } while (++i < length) { if (i in self) { fun.call(thisp, self[i], i, object); } } }; } if (!Array.prototype.map) { Array.prototype.map = function map(fun /*, thisp*/) { var object = toObject(this), self = splitString && _toString(this) == "[object String]" ? this.split("") : object, length = self.length >>> 0, result = Array(length), thisp = arguments[1]; if (_toString(fun) != "[object Function]") { throw new TypeError(fun + " is not a function"); } for (var i = 0; i < length; i++) { if (i in self) result[i] = fun.call(thisp, self[i], i, object); } return result; }; } if (!Array.prototype.filter) { Array.prototype.filter = function filter(fun /*, thisp */) { var object = toObject(this), self = splitString && _toString(this) == "[object String]" ? this.split("") : object, length = self.length >>> 0, result = [], value, thisp = arguments[1]; if (_toString(fun) != "[object Function]") { throw new TypeError(fun + " is not a function"); } for (var i = 0; i < length; i++) { if (i in self) { value = self[i]; if (fun.call(thisp, value, i, object)) { result.push(value); } } } return result; }; } if (!Array.prototype.every) { Array.prototype.every = function every(fun /*, thisp */) { var object = toObject(this), self = splitString && _toString(this) == "[object String]" ? this.split("") : object, length = self.length >>> 0, thisp = arguments[1]; if (_toString(fun) != "[object Function]") { throw new TypeError(fun + " is not a function"); } for (var i = 0; i < length; i++) { if (i in self && !fun.call(thisp, self[i], i, object)) { return false; } } return true; }; } if (!Array.prototype.some) { Array.prototype.some = function some(fun /*, thisp */) { var object = toObject(this), self = splitString && _toString(this) == "[object String]" ? this.split("") : object, length = self.length >>> 0, thisp = arguments[1]; if (_toString(fun) != "[object Function]") { throw new TypeError(fun + " is not a function"); } for (var i = 0; i < length; i++) { if (i in self && fun.call(thisp, self[i], i, object)) { return true; } } return false; }; } if (!Array.prototype.reduce) { Array.prototype.reduce = function reduce(fun /*, initial*/) { var object = toObject(this), self = splitString && _toString(this) == "[object String]" ? this.split("") : object, length = self.length >>> 0; if (_toString(fun) != "[object Function]") { throw new TypeError(fun + " is not a function"); } if (!length && arguments.length == 1) { throw new TypeError("reduce of empty array with no initial value"); } var i = 0; var result; if (arguments.length >= 2) { result = arguments[1]; } else { do { if (i in self) { result = self[i++]; break; } if (++i >= length) { throw new TypeError("reduce of empty array with no initial value"); } } while (true); } for (; i < length; i++) { if (i in self) { result = fun.call(void 0, result, self[i], i, object); } } return result; }; } if (!Array.prototype.reduceRight) { Array.prototype.reduceRight = function reduceRight(fun /*, initial*/) { var object = toObject(this), self = splitString && _toString(this) == "[object String]" ? this.split("") : object, length = self.length >>> 0; if (_toString(fun) != "[object Function]") { throw new TypeError(fun + " is not a function"); } if (!length && arguments.length == 1) { throw new TypeError("reduceRight of empty array with no initial value"); } var result, i = length - 1; if (arguments.length >= 2) { result = arguments[1]; } else { do { if (i in self) { result = self[i--]; break; } if (--i < 0) { throw new TypeError("reduceRight of empty array with no initial value"); } } while (true); } do { if (i in this) { result = fun.call(void 0, result, self[i], i, object); } } while (i--); return result; }; } if (!Array.prototype.indexOf || ([0, 1].indexOf(1, 2) != -1)) { Array.prototype.indexOf = function indexOf(sought /*, fromIndex */ ) { var self = splitString && _toString(this) == "[object String]" ? this.split("") : toObject(this), length = self.length >>> 0; if (!length) { return -1; } var i = 0; if (arguments.length > 1) { i = toInteger(arguments[1]); } i = i >= 0 ? i : Math.max(0, length + i); for (; i < length; i++) { if (i in self && self[i] === sought) { return i; } } return -1; }; } if (!Array.prototype.lastIndexOf || ([0, 1].lastIndexOf(0, -3) != -1)) { Array.prototype.lastIndexOf = function lastIndexOf(sought /*, fromIndex */) { var self = splitString && _toString(this) == "[object String]" ? this.split("") : toObject(this), length = self.length >>> 0; if (!length) { return -1; } var i = length - 1; if (arguments.length > 1) { i = Math.min(i, toInteger(arguments[1])); } i = i >= 0 ? i : length - Math.abs(i); for (; i >= 0; i--) { if (i in self && sought === self[i]) { return i; } } return -1; }; } if (!Object.getPrototypeOf) { Object.getPrototypeOf = function getPrototypeOf(object) { return object.__proto__ || ( object.constructor ? object.constructor.prototype : prototypeOfObject ); }; } if (!Object.getOwnPropertyDescriptor) { var ERR_NON_OBJECT = "Object.getOwnPropertyDescriptor called on a " + "non-object: "; Object.getOwnPropertyDescriptor = function getOwnPropertyDescriptor(object, property) { if ((typeof object != "object" && typeof object != "function") || object === null) throw new TypeError(ERR_NON_OBJECT + object); if (!owns(object, property)) return; var descriptor, getter, setter; descriptor = { enumerable: true, configurable: true }; if (supportsAccessors) { var prototype = object.__proto__; object.__proto__ = prototypeOfObject; var getter = lookupGetter(object, property); var setter = lookupSetter(object, property); object.__proto__ = prototype; if (getter || setter) { if (getter) descriptor.get = getter; if (setter) descriptor.set = setter; return descriptor; } } descriptor.value = object[property]; return descriptor; }; } if (!Object.getOwnPropertyNames) { Object.getOwnPropertyNames = function getOwnPropertyNames(object) { return Object.keys(object); }; } if (!Object.create) { var createEmpty; if (Object.prototype.__proto__ === null) { createEmpty = function () { return { "__proto__": null }; }; } else { createEmpty = function () { var empty = {}; for (var i in empty) empty[i] = null; empty.constructor = empty.hasOwnProperty = empty.propertyIsEnumerable = empty.isPrototypeOf = empty.toLocaleString = empty.toString = empty.valueOf = empty.__proto__ = null; return empty; } } Object.create = function create(prototype, properties) { var object; if (prototype === null) { object = createEmpty(); } else { if (typeof prototype != "object") throw new TypeError("typeof prototype["+(typeof prototype)+"] != 'object'"); var Type = function () {}; Type.prototype = prototype; object = new Type(); object.__proto__ = prototype; } if (properties !== void 0) Object.defineProperties(object, properties); return object; }; } function doesDefinePropertyWork(object) { try { Object.defineProperty(object, "sentinel", {}); return "sentinel" in object; } catch (exception) { } } if (Object.defineProperty) { var definePropertyWorksOnObject = doesDefinePropertyWork({}); var definePropertyWorksOnDom = typeof document == "undefined" || doesDefinePropertyWork(document.createElement("div")); if (!definePropertyWorksOnObject || !definePropertyWorksOnDom) { var definePropertyFallback = Object.defineProperty; } } if (!Object.defineProperty || definePropertyFallback) { var ERR_NON_OBJECT_DESCRIPTOR = "Property description must be an object: "; var ERR_NON_OBJECT_TARGET = "Object.defineProperty called on non-object: " var ERR_ACCESSORS_NOT_SUPPORTED = "getters & setters can not be defined " + "on this javascript engine"; Object.defineProperty = function defineProperty(object, property, descriptor) { if ((typeof object != "object" && typeof object != "function") || object === null) throw new TypeError(ERR_NON_OBJECT_TARGET + object); if ((typeof descriptor != "object" && typeof descriptor != "function") || descriptor === null) throw new TypeError(ERR_NON_OBJECT_DESCRIPTOR + descriptor); if (definePropertyFallback) { try { return definePropertyFallback.call(Object, object, property, descriptor); } catch (exception) { } } if (owns(descriptor, "value")) { if (supportsAccessors && (lookupGetter(object, property) || lookupSetter(object, property))) { var prototype = object.__proto__; object.__proto__ = prototypeOfObject; delete object[property]; object[property] = descriptor.value; object.__proto__ = prototype; } else { object[property] = descriptor.value; } } else { if (!supportsAccessors) throw new TypeError(ERR_ACCESSORS_NOT_SUPPORTED); if (owns(descriptor, "get")) defineGetter(object, property, descriptor.get); if (owns(descriptor, "set")) defineSetter(object, property, descriptor.set); } return object; }; } if (!Object.defineProperties) { Object.defineProperties = function defineProperties(object, properties) { for (var property in properties) { if (owns(properties, property)) Object.defineProperty(object, property, properties[property]); } return object; }; } if (!Object.seal) { Object.seal = function seal(object) { return object; }; } if (!Object.freeze) { Object.freeze = function freeze(object) { return object; }; } try { Object.freeze(function () {}); } catch (exception) { Object.freeze = (function freeze(freezeObject) { return function freeze(object) { if (typeof object == "function") { return object; } else { return freezeObject(object); } }; })(Object.freeze); } if (!Object.preventExtensions) { Object.preventExtensions = function preventExtensions(object) { return object; }; } if (!Object.isSealed) { Object.isSealed = function isSealed(object) { return false; }; } if (!Object.isFrozen) { Object.isFrozen = function isFrozen(object) { return false; }; } if (!Object.isExtensible) { Object.isExtensible = function isExtensible(object) { if (Object(object) === object) { throw new TypeError(); // TODO message } var name = ''; while (owns(object, name)) { name += '?'; } object[name] = true; var returnValue = owns(object, name); delete object[name]; return returnValue; }; } if (!Object.keys) { var hasDontEnumBug = true, dontEnums = [ "toString", "toLocaleString", "valueOf", "hasOwnProperty", "isPrototypeOf", "propertyIsEnumerable", "constructor" ], dontEnumsLength = dontEnums.length; for (var key in {"toString": null}) { hasDontEnumBug = false; } Object.keys = function keys(object) { if ( (typeof object != "object" && typeof object != "function") || object === null ) { throw new TypeError("Object.keys called on a non-object"); } var keys = []; for (var name in object) { if (owns(object, name)) { keys.push(name); } } if (hasDontEnumBug) { for (var i = 0, ii = dontEnumsLength; i < ii; i++) { var dontEnum = dontEnums[i]; if (owns(object, dontEnum)) { keys.push(dontEnum); } } } return keys; }; } if (!Date.now) { Date.now = function now() { return new Date().getTime(); }; } var ws = "\x09\x0A\x0B\x0C\x0D\x20\xA0\u1680\u180E\u2000\u2001\u2002\u2003" + "\u2004\u2005\u2006\u2007\u2008\u2009\u200A\u202F\u205F\u3000\u2028" + "\u2029\uFEFF"; if (!String.prototype.trim || ws.trim()) { ws = "[" + ws + "]"; var trimBeginRegexp = new RegExp("^" + ws + ws + "*"), trimEndRegexp = new RegExp(ws + ws + "*$"); String.prototype.trim = function trim() { return String(this).replace(trimBeginRegexp, "").replace(trimEndRegexp, ""); }; } function toInteger(n) { n = +n; if (n !== n) { // isNaN n = 0; } else if (n !== 0 && n !== (1/0) && n !== -(1/0)) { n = (n > 0 || -1) * Math.floor(Math.abs(n)); } return n; } function isPrimitive(input) { var type = typeof input; return ( input === null || type === "undefined" || type === "boolean" || type === "number" || type === "string" ); } function toPrimitive(input) { var val, valueOf, toString; if (isPrimitive(input)) { return input; } valueOf = input.valueOf; if (typeof valueOf === "function") { val = valueOf.call(input); if (isPrimitive(val)) { return val; } } toString = input.toString; if (typeof toString === "function") { val = toString.call(input); if (isPrimitive(val)) { return val; } } throw new TypeError(); } var toObject = function (o) { if (o == null) { // this matches both null and undefined throw new TypeError("can't convert "+o+" to object"); } return Object(o); }; }); define('ace/lib/dom', ['require', 'exports', 'module' ], function(require, exports, module) { if (typeof document == "undefined") return; var XHTML_NS = "http://www.w3.org/1999/xhtml"; exports.getDocumentHead = function(doc) { if (!doc) doc = document; return doc.head || doc.getElementsByTagName("head")[0] || doc.documentElement; } exports.createElement = function(tag, ns) { return document.createElementNS ? document.createElementNS(ns || XHTML_NS, tag) : document.createElement(tag); }; exports.hasCssClass = function(el, name) { var classes = el.className.split(/\s+/g); return classes.indexOf(name) !== -1; }; exports.addCssClass = function(el, name) { if (!exports.hasCssClass(el, name)) { el.className += " " + name; } }; exports.removeCssClass = function(el, name) { var classes = el.className.split(/\s+/g); while (true) { var index = classes.indexOf(name); if (index == -1) { break; } classes.splice(index, 1); } el.className = classes.join(" "); }; exports.toggleCssClass = function(el, name) { var classes = el.className.split(/\s+/g), add = true; while (true) { var index = classes.indexOf(name); if (index == -1) { break; } add = false; classes.splice(index, 1); } if(add) classes.push(name); el.className = classes.join(" "); return add; }; exports.setCssClass = function(node, className, include) { if (include) { exports.addCssClass(node, className); } else { exports.removeCssClass(node, className); } }; exports.hasCssString = function(id, doc) { var index = 0, sheets; doc = doc || document; if (doc.createStyleSheet && (sheets = doc.styleSheets)) { while (index < sheets.length) if (sheets[index++].owningElement.id === id) return true; } else if ((sheets = doc.getElementsByTagName("style"))) { while (index < sheets.length) if (sheets[index++].id === id) return true; } return false; }; exports.importCssString = function importCssString(cssText, id, doc) { doc = doc || document; if (id && exports.hasCssString(id, doc)) return null; var style; if (doc.createStyleSheet) { style = doc.createStyleSheet(); style.cssText = cssText; if (id) style.owningElement.id = id; } else { style = doc.createElementNS ? doc.createElementNS(XHTML_NS, "style") : doc.createElement("style"); style.appendChild(doc.createTextNode(cssText)); if (id) style.id = id; exports.getDocumentHead(doc).appendChild(style); } }; exports.importCssStylsheet = function(uri, doc) { if (doc.createStyleSheet) { doc.createStyleSheet(uri); } else { var link = exports.createElement('link'); link.rel = 'stylesheet'; link.href = uri; exports.getDocumentHead(doc).appendChild(link); } }; exports.getInnerWidth = function(element) { return ( parseInt(exports.computedStyle(element, "paddingLeft"), 10) + parseInt(exports.computedStyle(element, "paddingRight"), 10) + element.clientWidth ); }; exports.getInnerHeight = function(element) { return ( parseInt(exports.computedStyle(element, "paddingTop"), 10) + parseInt(exports.computedStyle(element, "paddingBottom"), 10) + element.clientHeight ); }; if (window.pageYOffset !== undefined) { exports.getPageScrollTop = function() { return window.pageYOffset; }; exports.getPageScrollLeft = function() { return window.pageXOffset; }; } else { exports.getPageScrollTop = function() { return document.body.scrollTop; }; exports.getPageScrollLeft = function() { return document.body.scrollLeft; }; } if (window.getComputedStyle) exports.computedStyle = function(element, style) { if (style) return (window.getComputedStyle(element, "") || {})[style] || ""; return window.getComputedStyle(element, "") || {}; }; else exports.computedStyle = function(element, style) { if (style) return element.currentStyle[style]; return element.currentStyle; }; exports.scrollbarWidth = function(document) { var inner = exports.createElement("ace_inner"); inner.style.width = "100%"; inner.style.minWidth = "0px"; inner.style.height = "200px"; inner.style.display = "block"; var outer = exports.createElement("ace_outer"); var style = outer.style; style.position = "absolute"; style.left = "-10000px"; style.overflow = "hidden"; style.width = "200px"; style.minWidth = "0px"; style.height = "150px"; style.display = "block"; outer.appendChild(inner); var body = document.documentElement; body.appendChild(outer); var noScrollbar = inner.offsetWidth; style.overflow = "scroll"; var withScrollbar = inner.offsetWidth; if (noScrollbar == withScrollbar) { withScrollbar = outer.clientWidth; } body.removeChild(outer); return noScrollbar-withScrollbar; }; exports.setInnerHtml = function(el, innerHtml) { var element = el.cloneNode(false);//document.createElement("div"); element.innerHTML = innerHtml; el.parentNode.replaceChild(element, el); return element; }; if ("textContent" in document.documentElement) { exports.setInnerText = function(el, innerText) { el.textContent = innerText; }; exports.getInnerText = function(el) { return el.textContent; }; } else { exports.setInnerText = function(el, innerText) { el.innerText = innerText; }; exports.getInnerText = function(el) { return el.innerText; }; } exports.getParentWindow = function(document) { return document.defaultView || document.parentWindow; }; }); define('ace/lib/event', ['require', 'exports', 'module' , 'ace/lib/keys', 'ace/lib/useragent', 'ace/lib/dom'], function(require, exports, module) { var keys = require("./keys"); var useragent = require("./useragent"); var dom = require("./dom"); exports.addListener = function(elem, type, callback) { if (elem.addEventListener) { return elem.addEventListener(type, callback, false); } if (elem.attachEvent) { var wrapper = function() { callback.call(elem, window.event); }; callback._wrapper = wrapper; elem.attachEvent("on" + type, wrapper); } }; exports.removeListener = function(elem, type, callback) { if (elem.removeEventListener) { return elem.removeEventListener(type, callback, false); } if (elem.detachEvent) { elem.detachEvent("on" + type, callback._wrapper || callback); } }; exports.stopEvent = function(e) { exports.stopPropagation(e); exports.preventDefault(e); return false; }; exports.stopPropagation = function(e) { if (e.stopPropagation) e.stopPropagation(); else e.cancelBubble = true; }; exports.preventDefault = function(e) { if (e.preventDefault) e.preventDefault(); else e.returnValue = false; }; exports.getButton = function(e) { if (e.type == "dblclick") return 0; if (e.type == "contextmenu" || (e.ctrlKey && useragent.isMac)) return 2; if (e.preventDefault) { return e.button; } else { return {1:0, 2:2, 4:1}[e.button]; } }; exports.capture = function(el, eventHandler, releaseCaptureHandler) { function onMouseUp(e) { eventHandler && eventHandler(e); releaseCaptureHandler && releaseCaptureHandler(e); exports.removeListener(document, "mousemove", eventHandler, true); exports.removeListener(document, "mouseup", onMouseUp, true); exports.removeListener(document, "dragstart", onMouseUp, true); } exports.addListener(document, "mousemove", eventHandler, true); exports.addListener(document, "mouseup", onMouseUp, true); exports.addListener(document, "dragstart", onMouseUp, true); }; exports.addMouseWheelListener = function(el, callback) { if ("onmousewheel" in el) { var factor = 8; exports.addListener(el, "mousewheel", function(e) { if (e.wheelDeltaX !== undefined) { e.wheelX = -e.wheelDeltaX / factor; e.wheelY = -e.wheelDeltaY / factor; } else { e.wheelX = 0; e.wheelY = -e.wheelDelta / factor; } callback(e); }); } else if ("onwheel" in el) { exports.addListener(el, "wheel", function(e) { e.wheelX = (e.deltaX || 0) * 5; e.wheelY = (e.deltaY || 0) * 5; callback(e); }); } else { exports.addListener(el, "DOMMouseScroll", function(e) { if (e.axis && e.axis == e.HORIZONTAL_AXIS) { e.wheelX = (e.detail || 0) * 5; e.wheelY = 0; } else { e.wheelX = 0; e.wheelY = (e.detail || 0) * 5; } callback(e); }); } }; exports.addMultiMouseDownListener = function(el, timeouts, eventHandler, callbackName) { var clicks = 0; var startX, startY, timer; var eventNames = { 2: "dblclick", 3: "tripleclick", 4: "quadclick" }; exports.addListener(el, "mousedown", function(e) { if (exports.getButton(e) != 0) { clicks = 0; } else if (e.detail > 1) { clicks++; if (clicks > 4) clicks = 1; } else { clicks = 1; } if (useragent.isIE) { var isNewClick = Math.abs(e.clientX - startX) > 5 || Math.abs(e.clientY - startY) > 5; if (isNewClick) { clicks = 1; } if (clicks == 1) { startX = e.clientX; startY = e.clientY; } } eventHandler[callbackName]("mousedown", e); if (clicks > 4) clicks = 0; else if (clicks > 1) return eventHandler[callbackName](eventNames[clicks], e); }); if (useragent.isOldIE) { exports.addListener(el, "dblclick", function(e) { clicks = 2; if (timer) clearTimeout(timer); timer = setTimeout(function() {timer = null}, timeouts[clicks - 1] || 600); eventHandler[callbackName]("mousedown", e); eventHandler[callbackName](eventNames[clicks], e); }); } }; function normalizeCommandKeys(callback, e, keyCode) { var hashId = 0; if ((useragent.isOpera && !("KeyboardEvent" in window)) && useragent.isMac) { hashId = 0 | (e.metaKey ? 1 : 0) | (e.altKey ? 2 : 0) | (e.shiftKey ? 4 : 0) | (e.ctrlKey ? 8 : 0); } else { hashId = 0 | (e.ctrlKey ? 1 : 0) | (e.altKey ? 2 : 0) | (e.shiftKey ? 4 : 0) | (e.metaKey ? 8 : 0); } if (!useragent.isMac && pressedKeys) { if (pressedKeys[91] || pressedKeys[92]) hashId |= 8; if (pressedKeys.altGr) { if ((3 & hashId) != 3) pressedKeys.altGr = 0 else return; } if (keyCode === 18 || keyCode === 17) { var location = e.location || e.keyLocation; if (keyCode === 17 && location === 1) { ts = e.timeStamp; } else if (keyCode === 18 && hashId === 3 && location === 2) { var dt = -ts; ts = e.timeStamp; dt += ts; if (dt < 3) pressedKeys.altGr = true; } } } if (keyCode in keys.MODIFIER_KEYS) { switch (keys.MODIFIER_KEYS[keyCode]) { case "Alt": hashId = 2; break; case "Shift": hashId = 4; break; case "Ctrl": hashId = 1; break; default: hashId = 8; break; } keyCode = 0; } if (hashId & 8 && (keyCode === 91 || keyCode === 93)) { keyCode = 0; } if (!hashId && keyCode === 13) { if (e.location || e.keyLocation === 3) { callback(e, hashId, -keyCode) if (e.defaultPrevented) return; } } if (!hashId && !(keyCode in keys.FUNCTION_KEYS) && !(keyCode in keys.PRINTABLE_KEYS)) { return false; } return callback(e, hashId, keyCode); } var pressedKeys = null; var ts = 0; exports.addCommandKeyListener = function(el, callback) { var addListener = exports.addListener; if (useragent.isOldGecko || (useragent.isOpera && !("KeyboardEvent" in window))) { var lastKeyDownKeyCode = null; addListener(el, "keydown", function(e) { lastKeyDownKeyCode = e.keyCode; }); addListener(el, "keypress", function(e) { return normalizeCommandKeys(callback, e, lastKeyDownKeyCode); }); } else { var lastDefaultPrevented = null; addListener(el, "keydown", function(e) { pressedKeys[e.keyCode] = true; var result = normalizeCommandKeys(callback, e, e.keyCode); lastDefaultPrevented = e.defaultPrevented; return result; }); addListener(el, "keypress", function(e) { if (lastDefaultPrevented && (e.ctrlKey || e.altKey || e.shiftKey || e.metaKey)) { exports.stopEvent(e); lastDefaultPrevented = null; } }); addListener(el, "keyup", function(e) { pressedKeys[e.keyCode] = null; }); if (!pressedKeys) { pressedKeys = Object.create(null); addListener(window, "focus", function(e) { pressedKeys = Object.create(null); }); } } }; if (window.postMessage && !useragent.isOldIE) { var postMessageId = 1; exports.nextTick = function(callback, win) { win = win || window; var messageName = "zero-timeout-message-" + postMessageId; exports.addListener(win, "message", function listener(e) { if (e.data == messageName) { exports.stopPropagation(e); exports.removeListener(win, "message", listener); callback(); } }); win.postMessage(messageName, "*"); }; } exports.nextFrame = window.requestAnimationFrame || window.mozRequestAnimationFrame || window.webkitRequestAnimationFrame || window.msRequestAnimationFrame || window.oRequestAnimationFrame; if (exports.nextFrame) exports.nextFrame = exports.nextFrame.bind(window); else exports.nextFrame = function(callback) { setTimeout(callback, 17); }; }); define('ace/lib/keys', ['require', 'exports', 'module' , 'ace/lib/oop'], function(require, exports, module) { var oop = require("./oop"); var Keys = (function() { var ret = { MODIFIER_KEYS: { 16: 'Shift', 17: 'Ctrl', 18: 'Alt', 224: 'Meta' }, KEY_MODS: { "ctrl": 1, "alt": 2, "option" : 2, "shift": 4, "meta": 8, "command": 8, "cmd": 8 }, FUNCTION_KEYS : { 8 : "Backspace", 9 : "Tab", 13 : "Return", 19 : "Pause", 27 : "Esc", 32 : "Space", 33 : "PageUp", 34 : "PageDown", 35 : "End", 36 : "Home", 37 : "Left", 38 : "Up", 39 : "Right", 40 : "Down", 44 : "Print", 45 : "Insert", 46 : "Delete", 96 : "Numpad0", 97 : "Numpad1", 98 : "Numpad2", 99 : "Numpad3", 100: "Numpad4", 101: "Numpad5", 102: "Numpad6", 103: "Numpad7", 104: "Numpad8", 105: "Numpad9", '-13': "NumpadEnter", 112: "F1", 113: "F2", 114: "F3", 115: "F4", 116: "F5", 117: "F6", 118: "F7", 119: "F8", 120: "F9", 121: "F10", 122: "F11", 123: "F12", 144: "Numlock", 145: "Scrolllock" }, PRINTABLE_KEYS: { 32: ' ', 48: '0', 49: '1', 50: '2', 51: '3', 52: '4', 53: '5', 54: '6', 55: '7', 56: '8', 57: '9', 59: ';', 61: '=', 65: 'a', 66: 'b', 67: 'c', 68: 'd', 69: 'e', 70: 'f', 71: 'g', 72: 'h', 73: 'i', 74: 'j', 75: 'k', 76: 'l', 77: 'm', 78: 'n', 79: 'o', 80: 'p', 81: 'q', 82: 'r', 83: 's', 84: 't', 85: 'u', 86: 'v', 87: 'w', 88: 'x', 89: 'y', 90: 'z', 107: '+', 109: '-', 110: '.', 188: ',', 190: '.', 191: '/', 192: '`', 219: '[', 220: '\\', 221: ']', 222: '\'' } }; for (var i in ret.FUNCTION_KEYS) { var name = ret.FUNCTION_KEYS[i].toLowerCase(); ret[name] = parseInt(i, 10); } oop.mixin(ret, ret.MODIFIER_KEYS); oop.mixin(ret, ret.PRINTABLE_KEYS); oop.mixin(ret, ret.FUNCTION_KEYS); ret.enter = ret["return"]; ret.escape = ret.esc; ret.del = ret["delete"]; ret[173] = '-'; return ret; })(); oop.mixin(exports, Keys); exports.keyCodeToString = function(keyCode) { return (Keys[keyCode] || String.fromCharCode(keyCode)).toLowerCase(); } }); define('ace/lib/oop', ['require', 'exports', 'module' ], function(require, exports, module) { exports.inherits = (function() { var tempCtor = function() {}; return function(ctor, superCtor) { tempCtor.prototype = superCtor.prototype; ctor.super_ = superCtor.prototype; ctor.prototype = new tempCtor(); ctor.prototype.constructor = ctor; }; }()); exports.mixin = function(obj, mixin) { for (var key in mixin) { obj[key] = mixin[key]; } return obj; }; exports.implement = function(proto, mixin) { exports.mixin(proto, mixin); }; }); define('ace/lib/useragent', ['require', 'exports', 'module' ], function(require, exports, module) { exports.OS = { LINUX: "LINUX", MAC: "MAC", WINDOWS: "WINDOWS" }; exports.getOS = function() { if (exports.isMac) { return exports.OS.MAC; } else if (exports.isLinux) { return exports.OS.LINUX; } else { return exports.OS.WINDOWS; } }; if (typeof navigator != "object") return; var os = (navigator.platform.match(/mac|win|linux/i) || ["other"])[0].toLowerCase(); var ua = navigator.userAgent; exports.isWin = (os == "win"); exports.isMac = (os == "mac"); exports.isLinux = (os == "linux"); exports.isIE = (navigator.appName == "Microsoft Internet Explorer" || navigator.appName.indexOf("MSAppHost") >= 0) && parseFloat(navigator.userAgent.match(/MSIE ([0-9]+[\.0-9]+)/)[1]); exports.isOldIE = exports.isIE && exports.isIE < 9; exports.isGecko = exports.isMozilla = window.controllers && window.navigator.product === "Gecko"; exports.isOldGecko = exports.isGecko && parseInt((navigator.userAgent.match(/rv\:(\d+)/)||[])[1], 10) < 4; exports.isOpera = window.opera && Object.prototype.toString.call(window.opera) == "[object Opera]"; exports.isWebKit = parseFloat(ua.split("WebKit/")[1]) || undefined; exports.isChrome = parseFloat(ua.split(" Chrome/")[1]) || undefined; exports.isAIR = ua.indexOf("AdobeAIR") >= 0; exports.isIPad = ua.indexOf("iPad") >= 0; exports.isTouchPad = ua.indexOf("TouchPad") >= 0; }); define('ace/editor', ['require', 'exports', 'module' , 'ace/lib/fixoldbrowsers', 'ace/lib/oop', 'ace/lib/dom', 'ace/lib/lang', 'ace/lib/useragent', 'ace/keyboard/textinput', 'ace/mouse/mouse_handler', 'ace/mouse/fold_handler', 'ace/keyboard/keybinding', 'ace/edit_session', 'ace/search', 'ace/range', 'ace/lib/event_emitter', 'ace/commands/command_manager', 'ace/commands/default_commands', 'ace/config'], function(require, exports, module) { require("./lib/fixoldbrowsers"); var oop = require("./lib/oop"); var dom = require("./lib/dom"); var lang = require("./lib/lang"); var useragent = require("./lib/useragent"); var TextInput = require("./keyboard/textinput").TextInput; var MouseHandler = require("./mouse/mouse_handler").MouseHandler; var FoldHandler = require("./mouse/fold_handler").FoldHandler; var KeyBinding = require("./keyboard/keybinding").KeyBinding; var EditSession = require("./edit_session").EditSession; var Search = require("./search").Search; var Range = require("./range").Range; var EventEmitter = require("./lib/event_emitter").EventEmitter; var CommandManager = require("./commands/command_manager").CommandManager; var defaultCommands = require("./commands/default_commands").commands; var config = require("./config"); var Editor = function(renderer, session) { var container = renderer.getContainerElement(); this.container = container; this.renderer = renderer; this.commands = new CommandManager(useragent.isMac ? "mac" : "win", defaultCommands); this.textInput = new TextInput(renderer.getTextAreaContainer(), this); this.renderer.textarea = this.textInput.getElement(); this.keyBinding = new KeyBinding(this); this.$mouseHandler = new MouseHandler(this); new FoldHandler(this); this.$blockScrolling = 0; this.$search = new Search().set({ wrap: true }); this.$historyTracker = this.$historyTracker.bind(this); this.commands.on("exec", this.$historyTracker); this.$initOperationListeners(); this._$emitInputEvent = lang.delayedCall(function() { this._signal("input", {}); this.session.bgTokenizer && this.session.bgTokenizer.scheduleStart(); }.bind(this)); this.on("change", function(_, _self) { _self._$emitInputEvent.schedule(31); }); this.setSession(session || new EditSession("")); config.resetOptions(this); config._emit("editor", this); }; (function(){ oop.implement(this, EventEmitter); this.$initOperationListeners = function() { function last(a) {return a[a.length - 1]}; this.selections = []; this.commands.on("exec", function(e) { this.startOperation(e); var command = e.command; if (command.group == "fileJump") { var prev = this.prevOp; if (!prev || prev.command.group != "fileJump") { this.lastFileJumpPos = last(this.selections) } } else { this.lastFileJumpPos = null; } }.bind(this), true); this.commands.on("afterExec", function(e) { var command = e.command; if (command.group == "fileJump") { if (this.lastFileJumpPos && !this.curOp.selectionChanged) { this.selection.fromJSON(this.lastFileJumpPos); return } } this.endOperation(e); }.bind(this), true); this.$opResetTimer = lang.delayedCall(this.endOperation.bind(this)); this.on("change", function() { this.curOp || this.startOperation(); this.curOp.docChanged = true; }.bind(this), true); this.on("changeSelection", function() { this.curOp || this.startOperation(); this.curOp.selectionChanged = true; }.bind(this), true); } this.curOp = null; this.prevOp = {}; this.startOperation = function(commadEvent) { if (this.curOp) { if (!commadEvent || this.curOp.command) return; this.prevOp = this.curOp; } if (!commadEvent) { this.previousCommand = null; commadEvent = {}; } this.$opResetTimer.schedule(); this.curOp = { command: commadEvent.command || {}, args: commadEvent.args }; this.selections.push(this.selection.toJSON()); }; this.endOperation = function() { if (this.curOp) { this.prevOp = this.curOp; this.curOp = null; } }; this.$historyTracker = function(e) { if (!this.$mergeUndoDeltas) return; var prev = this.prevOp; var mergeableCommands = ["backspace", "del", "insertstring"]; var shouldMerge = prev.command && (e.command.name == prev.command.name); if (e.command.name == "insertstring") { var text = e.args; if (this.mergeNextCommand === undefined) this.mergeNextCommand = true; shouldMerge = shouldMerge && this.mergeNextCommand // previous command allows to coalesce with && (!/\s/.test(text) || /\s/.test(prev.args)) // previous insertion was of same type this.mergeNextCommand = true; } else { shouldMerge = shouldMerge && mergeableCommands.indexOf(e.command.name) !== -1// the command is mergeable } if ( this.$mergeUndoDeltas != "always" && Date.now() - this.sequenceStartTime > 2000 ) { shouldMerge = false; // the sequence is too long } if (shouldMerge) this.session.mergeUndoDeltas = true; else if (mergeableCommands.indexOf(e.command.name) !== -1) this.sequenceStartTime = Date.now(); }; this.setKeyboardHandler = function(keyboardHandler) { if (!keyboardHandler) { this.keyBinding.setKeyboardHandler(null); } else if (typeof keyboardHandler == "string") { this.$keybindingId = keyboardHandler; var _self = this; config.loadModule(["keybinding", keyboardHandler], function(module) { if (_self.$keybindingId == keyboardHandler) _self.keyBinding.setKeyboardHandler(module && module.handler); }); } else { this.$keybindingId = null; this.keyBinding.setKeyboardHandler(keyboardHandler); } }; this.getKeyboardHandler = function() { return this.keyBinding.getKeyboardHandler(); }; this.setSession = function(session) { if (this.session == session) return; if (this.session) { var oldSession = this.session; this.session.removeEventListener("change", this.$onDocumentChange); this.session.removeEventListener("changeMode", this.$onChangeMode); this.session.removeEventListener("tokenizerUpdate", this.$onTokenizerUpdate); this.session.removeEventListener("changeTabSize", this.$onChangeTabSize); this.session.removeEventListener("changeWrapLimit", this.$onChangeWrapLimit); this.session.removeEventListener("changeWrapMode", this.$onChangeWrapMode); this.session.removeEventListener("onChangeFold", this.$onChangeFold); this.session.removeEventListener("changeFrontMarker", this.$onChangeFrontMarker); this.session.removeEventListener("changeBackMarker", this.$onChangeBackMarker); this.session.removeEventListener("changeBreakpoint", this.$onChangeBreakpoint); this.session.removeEventListener("changeAnnotation", this.$onChangeAnnotation); this.session.removeEventListener("changeOverwrite", this.$onCursorChange); this.session.removeEventListener("changeScrollTop", this.$onScrollTopChange); this.session.removeEventListener("changeScrollLeft", this.$onScrollLeftChange); var selection = this.session.getSelection(); selection.removeEventListener("changeCursor", this.$onCursorChange); selection.removeEventListener("changeSelection", this.$onSelectionChange); } this.session = session; this.$onDocumentChange = this.onDocumentChange.bind(this); session.addEventListener("change", this.$onDocumentChange); this.renderer.setSession(session); this.$onChangeMode = this.onChangeMode.bind(this); session.addEventListener("changeMode", this.$onChangeMode); this.$onTokenizerUpdate = this.onTokenizerUpdate.bind(this); session.addEventListener("tokenizerUpdate", this.$onTokenizerUpdate); this.$onChangeTabSize = this.renderer.onChangeTabSize.bind(this.renderer); session.addEventListener("changeTabSize", this.$onChangeTabSize); this.$onChangeWrapLimit = this.onChangeWrapLimit.bind(this); session.addEventListener("changeWrapLimit", this.$onChangeWrapLimit); this.$onChangeWrapMode = this.onChangeWrapMode.bind(this); session.addEventListener("changeWrapMode", this.$onChangeWrapMode); this.$onChangeFold = this.onChangeFold.bind(this); session.addEventListener("changeFold", this.$onChangeFold); this.$onChangeFrontMarker = this.onChangeFrontMarker.bind(this); this.session.addEventListener("changeFrontMarker", this.$onChangeFrontMarker); this.$onChangeBackMarker = this.onChangeBackMarker.bind(this); this.session.addEventListener("changeBackMarker", this.$onChangeBackMarker); this.$onChangeBreakpoint = this.onChangeBreakpoint.bind(this); this.session.addEventListener("changeBreakpoint", this.$onChangeBreakpoint); this.$onChangeAnnotation = this.onChangeAnnotation.bind(this); this.session.addEventListener("changeAnnotation", this.$onChangeAnnotation); this.$onCursorChange = this.onCursorChange.bind(this); this.session.addEventListener("changeOverwrite", this.$onCursorChange); this.$onScrollTopChange = this.onScrollTopChange.bind(this); this.session.addEventListener("changeScrollTop", this.$onScrollTopChange); this.$onScrollLeftChange = this.onScrollLeftChange.bind(this); this.session.addEventListener("changeScrollLeft", this.$onScrollLeftChange); this.selection = session.getSelection(); this.selection.addEventListener("changeCursor", this.$onCursorChange); this.$onSelectionChange = this.onSelectionChange.bind(this); this.selection.addEventListener("changeSelection", this.$onSelectionChange); this.onChangeMode(); this.$blockScrolling += 1; this.onCursorChange(); this.$blockScrolling -= 1; this.onScrollTopChange(); this.onScrollLeftChange(); this.onSelectionChange(); this.onChangeFrontMarker(); this.onChangeBackMarker(); this.onChangeBreakpoint(); this.onChangeAnnotation(); this.session.getUseWrapMode() && this.renderer.adjustWrapLimit(); this.renderer.updateFull(); this._emit("changeSession", { session: session, oldSession: oldSession }); }; this.getSession = function() { return this.session; }; this.setValue = function(val, cursorPos) { this.session.doc.setValue(val); if (!cursorPos) this.selectAll(); else if (cursorPos == 1) this.navigateFileEnd(); else if (cursorPos == -1) this.navigateFileStart(); return val; }; this.getValue = function() { return this.session.getValue(); }; this.getSelection = function() { return this.selection; }; this.resize = function(force) { this.renderer.onResize(force); }; this.setTheme = function(theme) { this.renderer.setTheme(theme); }; this.getTheme = function() { return this.renderer.getTheme(); }; this.setStyle = function(style) { this.renderer.setStyle(style); }; this.unsetStyle = function(style) { this.renderer.unsetStyle(style); }; this.getFontSize = function () { return this.getOption("fontSize") || dom.computedStyle(this.container, "fontSize"); }; this.setFontSize = function(size) { this.setOption("fontSize", size); }; this.$highlightBrackets = function() { if (this.session.$bracketHighlight) { this.session.removeMarker(this.session.$bracketHighlight); this.session.$bracketHighlight = null; } if (this.$highlightPending) { return; } var self = this; this.$highlightPending = true; setTimeout(function() { self.$highlightPending = false; var pos = self.session.findMatchingBracket(self.getCursorPosition()); if (pos) { var range = new Range(pos.row, pos.column, pos.row, pos.column+1); } else if (self.session.$mode.getMatching) { var range = self.session.$mode.getMatching(self.session); } if (range) self.session.$bracketHighlight = self.session.addMarker(range, "ace_bracket", "text"); }, 50); }; this.focus = function() { var _self = this; setTimeout(function() { _self.textInput.focus(); }); this.textInput.focus(); }; this.isFocused = function() { return this.textInput.isFocused(); }; this.blur = function() { this.textInput.blur(); }; this.onFocus = function() { if (this.$isFocused) return; this.$isFocused = true; this.renderer.showCursor(); this.renderer.visualizeFocus(); this._emit("focus"); }; this.onBlur = function() { if (!this.$isFocused) return; this.$isFocused = false; this.renderer.hideCursor(); this.renderer.visualizeBlur(); this._emit("blur"); }; this.$cursorChange = function() { this.renderer.updateCursor(); }; this.onDocumentChange = function(e) { var delta = e.data; var range = delta.range; var lastRow; if (range.start.row == range.end.row && delta.action != "insertLines" && delta.action != "removeLines") lastRow = range.end.row; else lastRow = Infinity; this.renderer.updateLines(range.start.row, lastRow); this._emit("change", e); this.$cursorChange(); }; this.onTokenizerUpdate = function(e) { var rows = e.data; this.renderer.updateLines(rows.first, rows.last); }; this.onScrollTopChange = function() { this.renderer.scrollToY(this.session.getScrollTop()); }; this.onScrollLeftChange = function() { this.renderer.scrollToX(this.session.getScrollLeft()); }; this.onCursorChange = function() { this.$cursorChange(); if (!this.$blockScrolling) { this.renderer.scrollCursorIntoView(); } this.$highlightBrackets(); this.$updateHighlightActiveLine(); this._emit("changeSelection"); }; this.$updateHighlightActiveLine = function() { var session = this.getSession(); var highlight; if (this.$highlightActiveLine) { if ((this.$selectionStyle != "line" || !this.selection.isMultiLine())) highlight = this.getCursorPosition(); if (this.renderer.$maxLines && this.session.getLength() === 1) highlight = false; } if (session.$highlightLineMarker && !highlight) { session.removeMarker(session.$highlightLineMarker.id); session.$highlightLineMarker = null; } else if (!session.$highlightLineMarker && highlight) { var range = new Range(highlight.row, highlight.column, highlight.row, Infinity); range.id = session.addMarker(range, "ace_active-line", "screenLine"); session.$highlightLineMarker = range; } else if (highlight) { session.$highlightLineMarker.start.row = highlight.row; session.$highlightLineMarker.end.row = highlight.row; session.$highlightLineMarker.start.column = highlight.column; session._emit("changeBackMarker"); } }; this.onSelectionChange = function(e) { var session = this.session; if (session.$selectionMarker) { session.removeMarker(session.$selectionMarker); } session.$selectionMarker = null; if (!this.selection.isEmpty()) { var range = this.selection.getRange(); var style = this.getSelectionStyle(); session.$selectionMarker = session.addMarker(range, "ace_selection", style); } else { this.$updateHighlightActiveLine(); } var re = this.$highlightSelectedWord && this.$getSelectionHighLightRegexp() this.session.highlight(re); this._emit("changeSelection"); }; this.$getSelectionHighLightRegexp = function() { var session = this.session; var selection = this.getSelectionRange(); if (selection.isEmpty() || selection.isMultiLine()) return; var startOuter = selection.start.column - 1; var endOuter = selection.end.column + 1; var line = session.getLine(selection.start.row); var lineCols = line.length; var needle = line.substring(Math.max(startOuter, 0), Math.min(endOuter, lineCols)); if ((startOuter >= 0 && /^[\w\d]/.test(needle)) || (endOuter <= lineCols && /[\w\d]$/.test(needle))) return; needle = line.substring(selection.start.column, selection.end.column); if (!/^[\w\d]+$/.test(needle)) return; var re = this.$search.$assembleRegExp({ wholeWord: true, caseSensitive: true, needle: needle }); return re; }; this.onChangeFrontMarker = function() { this.renderer.updateFrontMarkers(); }; this.onChangeBackMarker = function() { this.renderer.updateBackMarkers(); }; this.onChangeBreakpoint = function() { this.renderer.updateBreakpoints(); }; this.onChangeAnnotation = function() { this.renderer.setAnnotations(this.session.getAnnotations()); }; this.onChangeMode = function(e) { this.renderer.updateText(); this._emit("changeMode", e); }; this.onChangeWrapLimit = function() { this.renderer.updateFull(); }; this.onChangeWrapMode = function() { this.renderer.onResize(true); }; this.onChangeFold = function() { this.$updateHighlightActiveLine(); this.renderer.updateFull(); }; this.getSelectedText = function() { return this.session.getTextRange(this.getSelectionRange()); }; this.getCopyText = function() { var text = this.getSelectedText(); this._signal("copy", text); return text; }; this.onCopy = function() { this.commands.exec("copy", this); }; this.onCut = function() { this.commands.exec("cut", this); }; this.onPaste = function(text) { if (this.$readOnly) return; this._emit("paste", text); this.insert(text); }; this.execCommand = function(command, args) { this.commands.exec(command, this, args); }; this.insert = function(text) { var session = this.session; var mode = session.getMode(); var cursor = this.getCursorPosition(); if (this.getBehavioursEnabled()) { var transform = mode.transformAction(session.getState(cursor.row), 'insertion', this, session, text); if (transform) { if (text !== transform.text) { this.session.mergeUndoDeltas = false; this.$mergeNextCommand = false; } text = transform.text; } } if (text == "\t") text = this.session.getTabString(); if (!this.selection.isEmpty()) { var range = this.getSelectionRange(); cursor = this.session.remove(range); this.clearSelection(); } else if (this.session.getOverwrite()) { var range = new Range.fromPoints(cursor, cursor); range.end.column += text.length; this.session.remove(range); } if (text == "\n" || text == "\r\n") { var line = session.getLine(cursor.row) if (cursor.column > line.search(/\S|$/)) { var d = line.substr(cursor.column).search(/\S|$/); session.doc.removeInLine(cursor.row, cursor.column, cursor.column + d); } } this.clearSelection(); var start = cursor.column; var lineState = session.getState(cursor.row); var line = session.getLine(cursor.row); var shouldOutdent = mode.checkOutdent(lineState, line, text); var end = session.insert(cursor, text); if (transform && transform.selection) { if (transform.selection.length == 2) { // Transform relative to the current column this.selection.setSelectionRange( new Range(cursor.row, start + transform.selection[0], cursor.row, start + transform.selection[1])); } else { // Transform relative to the current row. this.selection.setSelectionRange( new Range(cursor.row + transform.selection[0], transform.selection[1], cursor.row + transform.selection[2], transform.selection[3])); } } if (session.getDocument().isNewLine(text)) { var lineIndent = mode.getNextLineIndent(lineState, line.slice(0, cursor.column), session.getTabString()); session.insert({row: cursor.row+1, column: 0}, lineIndent); } if (shouldOutdent) mode.autoOutdent(lineState, session, cursor.row); }; this.onTextInput = function(text) { this.keyBinding.onTextInput(text); }; this.onCommandKey = function(e, hashId, keyCode) { this.keyBinding.onCommandKey(e, hashId, keyCode); }; this.setOverwrite = function(overwrite) { this.session.setOverwrite(overwrite); }; this.getOverwrite = function() { return this.session.getOverwrite(); }; this.toggleOverwrite = function() { this.session.toggleOverwrite(); }; this.setScrollSpeed = function(speed) { this.setOption("scrollSpeed", speed); }; this.getScrollSpeed = function() { return this.getOption("scrollSpeed"); }; this.setDragDelay = function(dragDelay) { this.setOption("dragDelay", dragDelay); }; this.getDragDelay = function() { return this.getOption("dragDelay"); }; this.setSelectionStyle = function(val) { this.setOption("selectionStyle", val); }; this.getSelectionStyle = function() { return this.getOption("selectionStyle"); }; this.setHighlightActiveLine = function(shouldHighlight) { this.setOption("highlightActiveLine", shouldHighlight); }; this.getHighlightActiveLine = function() { return this.getOption("highlightActiveLine"); }; this.setHighlightGutterLine = function(shouldHighlight) { this.setOption("highlightGutterLine", shouldHighlight); }; this.getHighlightGutterLine = function() { return this.getOption("highlightGutterLine"); }; this.setHighlightSelectedWord = function(shouldHighlight) { this.setOption("highlightSelectedWord", shouldHighlight); }; this.getHighlightSelectedWord = function() { return this.$highlightSelectedWord; }; this.setAnimatedScroll = function(shouldAnimate){ this.renderer.setAnimatedScroll(shouldAnimate); }; this.getAnimatedScroll = function(){ return this.renderer.getAnimatedScroll(); }; this.setShowInvisibles = function(showInvisibles) { this.renderer.setShowInvisibles(showInvisibles); }; this.getShowInvisibles = function() { return this.renderer.getShowInvisibles(); }; this.setDisplayIndentGuides = function(display) { this.renderer.setDisplayIndentGuides(display); }; this.getDisplayIndentGuides = function() { return this.renderer.getDisplayIndentGuides(); }; this.setShowPrintMargin = function(showPrintMargin) { this.renderer.setShowPrintMargin(showPrintMargin); }; this.getShowPrintMargin = function() { return this.renderer.getShowPrintMargin(); }; this.setPrintMarginColumn = function(showPrintMargin) { this.renderer.setPrintMarginColumn(showPrintMargin); }; this.getPrintMarginColumn = function() { return this.renderer.getPrintMarginColumn(); }; this.setReadOnly = function(readOnly) { this.setOption("readOnly", readOnly); }; this.getReadOnly = function() { return this.getOption("readOnly"); }; this.setBehavioursEnabled = function (enabled) { this.setOption("behavioursEnabled", enabled); }; this.getBehavioursEnabled = function () { return this.getOption("behavioursEnabled"); }; this.setWrapBehavioursEnabled = function (enabled) { this.setOption("wrapBehavioursEnabled", enabled); }; this.getWrapBehavioursEnabled = function () { return this.getOption("wrapBehavioursEnabled"); }; this.setShowFoldWidgets = function(show) { this.setOption("showFoldWidgets", show); }; this.getShowFoldWidgets = function() { return this.getOption("showFoldWidgets"); }; this.setFadeFoldWidgets = function(fade) { this.setOption("fadeFoldWidgets", fade); }; this.getFadeFoldWidgets = function() { return this.getOption("fadeFoldWidgets"); }; this.remove = function(dir) { if (this.selection.isEmpty()){ if (dir == "left") this.selection.selectLeft(); else this.selection.selectRight(); } var range = this.getSelectionRange(); if (this.getBehavioursEnabled()) { var session = this.session; var state = session.getState(range.start.row); var new_range = session.getMode().transformAction(state, 'deletion', this, session, range); if (range.end.column == 0) { var text = session.getTextRange(range); if (text[text.length - 1] == "\n") { var line = session.getLine(range.end.row) if (/^\s+$/.test(line)) { range.end.column = line.length } } } if (new_range) range = new_range; } this.session.remove(range); this.clearSelection(); }; this.removeWordRight = function() { if (this.selection.isEmpty()) this.selection.selectWordRight(); this.session.remove(this.getSelectionRange()); this.clearSelection(); }; this.removeWordLeft = function() { if (this.selection.isEmpty()) this.selection.selectWordLeft(); this.session.remove(this.getSelectionRange()); this.clearSelection(); }; this.removeToLineStart = function() { if (this.selection.isEmpty()) this.selection.selectLineStart(); this.session.remove(this.getSelectionRange()); this.clearSelection(); }; this.removeToLineEnd = function() { if (this.selection.isEmpty()) this.selection.selectLineEnd(); var range = this.getSelectionRange(); if (range.start.column == range.end.column && range.start.row == range.end.row) { range.end.column = 0; range.end.row++; } this.session.remove(range); this.clearSelection(); }; this.splitLine = function() { if (!this.selection.isEmpty()) { this.session.remove(this.getSelectionRange()); this.clearSelection(); } var cursor = this.getCursorPosition(); this.insert("\n"); this.moveCursorToPosition(cursor); }; this.transposeLetters = function() { if (!this.selection.isEmpty()) { return; } var cursor = this.getCursorPosition(); var column = cursor.column; if (column === 0) return; var line = this.session.getLine(cursor.row); var swap, range; if (column < line.length) { swap = line.charAt(column) + line.charAt(column-1); range = new Range(cursor.row, column-1, cursor.row, column+1); } else { swap = line.charAt(column-1) + line.charAt(column-2); range = new Range(cursor.row, column-2, cursor.row, column); } this.session.replace(range, swap); }; this.toLowerCase = function() { var originalRange = this.getSelectionRange(); if (this.selection.isEmpty()) { this.selection.selectWord(); } var range = this.getSelectionRange(); var text = this.session.getTextRange(range); this.session.replace(range, text.toLowerCase()); this.selection.setSelectionRange(originalRange); }; this.toUpperCase = function() { var originalRange = this.getSelectionRange(); if (this.selection.isEmpty()) { this.selection.selectWord(); } var range = this.getSelectionRange(); var text = this.session.getTextRange(range); this.session.replace(range, text.toUpperCase()); this.selection.setSelectionRange(originalRange); }; this.indent = function() { var session = this.session; var range = this.getSelectionRange(); if (range.start.row < range.end.row) { var rows = this.$getSelectedRows(); session.indentRows(rows.first, rows.last, "\t"); return; } else if (range.start.column < range.end.column) { var text = session.getTextRange(range) if (!/^\s+$/.test(text)) { var rows = this.$getSelectedRows(); session.indentRows(rows.first, rows.last, "\t"); return; } } var line = session.getLine(range.start.row) var position = range.start; var size = session.getTabSize(); var column = session.documentToScreenColumn(position.row, position.column); if (this.session.getUseSoftTabs()) { var count = (size - column % size); var indentString = lang.stringRepeat(" ", count); } else { var count = column % size; while (line[range.start.column] == " " && count) { range.start.column--; count--; } this.selection.setSelectionRange(range); indentString = "\t"; } return this.insert(indentString); }; this.blockIndent = function() { var rows = this.$getSelectedRows(); this.session.indentRows(rows.first, rows.last, "\t"); }; this.blockOutdent = function() { var selection = this.session.getSelection(); this.session.outdentRows(selection.getRange()); }; this.sortLines = function() { var rows = this.$getSelectedRows(); var session = this.session; var lines = []; for (i = rows.first; i <= rows.last; i++) lines.push(session.getLine(i)); lines.sort(function(a, b) { if (a.toLowerCase() < b.toLowerCase()) return -1; if (a.toLowerCase() > b.toLowerCase()) return 1; return 0; }); var deleteRange = new Range(0, 0, 0, 0); for (var i = rows.first; i <= rows.last; i++) { var line = session.getLine(i); deleteRange.start.row = i; deleteRange.end.row = i; deleteRange.end.column = line.length; session.replace(deleteRange, lines[i-rows.first]); } }; this.toggleCommentLines = function() { var state = this.session.getState(this.getCursorPosition().row); var rows = this.$getSelectedRows(); this.session.getMode().toggleCommentLines(state, this.session, rows.first, rows.last); }; this.toggleBlockComment = function() { var cursor = this.getCursorPosition(); var state = this.session.getState(cursor.row); var range = this.getSelectionRange(); this.session.getMode().toggleBlockComment(state, this.session, range, cursor); }; this.getNumberAt = function( row, column ) { var _numberRx = /[\-]?[0-9]+(?:\.[0-9]+)?/g _numberRx.lastIndex = 0 var s = this.session.getLine(row) while (_numberRx.lastIndex < column) { var m = _numberRx.exec(s) if(m.index <= column && m.index+m[0].length >= column){ var number = { value: m[0], start: m.index, end: m.index+m[0].length } return number; } } return null; }; this.modifyNumber = function(amount) { var row = this.selection.getCursor().row; var column = this.selection.getCursor().column; var charRange = new Range(row, column-1, row, column); var c = this.session.getTextRange(charRange); if (!isNaN(parseFloat(c)) && isFinite(c)) { var nr = this.getNumberAt(row, column); if (nr) { var fp = nr.value.indexOf(".") >= 0 ? nr.start + nr.value.indexOf(".") + 1 : nr.end; var decimals = nr.start + nr.value.length - fp; var t = parseFloat(nr.value); t *= Math.pow(10, decimals); if(fp !== nr.end && column < fp){ amount *= Math.pow(10, nr.end - column - 1); } else { amount *= Math.pow(10, nr.end - column); } t += amount; t /= Math.pow(10, decimals); var nnr = t.toFixed(decimals); var replaceRange = new Range(row, nr.start, row, nr.end); this.session.replace(replaceRange, nnr); this.moveCursorTo(row, Math.max(nr.start +1, column + nnr.length - nr.value.length)); } } }; this.removeLines = function() { var rows = this.$getSelectedRows(); var range; if (rows.first === 0 || rows.last+1 < this.session.getLength()) range = new Range(rows.first, 0, rows.last+1, 0); else range = new Range( rows.first-1, this.session.getLine(rows.first-1).length, rows.last, this.session.getLine(rows.last).length ); this.session.remove(range); this.clearSelection(); }; this.duplicateSelection = function() { var sel = this.selection; var doc = this.session; var range = sel.getRange(); var reverse = sel.isBackwards(); if (range.isEmpty()) { var row = range.start.row; doc.duplicateLines(row, row); } else { var point = reverse ? range.start : range.end; var endPoint = doc.insert(point, doc.getTextRange(range), false); range.start = point; range.end = endPoint; sel.setSelectionRange(range, reverse) } }; this.moveLinesDown = function() { this.$moveLines(function(firstRow, lastRow) { return this.session.moveLinesDown(firstRow, lastRow); }); }; this.moveLinesUp = function() { this.$moveLines(function(firstRow, lastRow) { return this.session.moveLinesUp(firstRow, lastRow); }); }; this.moveText = function(range, toPosition, copy) { return this.session.moveText(range, toPosition, copy); }; this.copyLinesUp = function() { this.$moveLines(function(firstRow, lastRow) { this.session.duplicateLines(firstRow, lastRow); return 0; }); }; this.copyLinesDown = function() { this.$moveLines(function(firstRow, lastRow) { return this.session.duplicateLines(firstRow, lastRow); }); }; this.$moveLines = function(mover) { var selection = this.selection; if (!selection.inMultiSelectMode || this.inVirtualSelectionMode) { var range = selection.toOrientedRange(); var rows = this.$getSelectedRows(range); var linesMoved = mover.call(this, rows.first, rows.last); range.moveBy(linesMoved, 0); selection.fromOrientedRange(range); } else { var ranges = selection.rangeList.ranges; selection.rangeList.detach(this.session); for (var i = ranges.length; i--; ) { var rangeIndex = i; var rows = ranges[i].collapseRows(); var last = rows.end.row; var first = rows.start.row; while (i--) { var rows = ranges[i].collapseRows(); if (first - rows.end.row <= 1) first = rows.end.row; else break; } i++; var linesMoved = mover.call(this, first, last); while (rangeIndex >= i) { ranges[rangeIndex].moveBy(linesMoved, 0); rangeIndex--; } } selection.fromOrientedRange(selection.ranges[0]); selection.rangeList.attach(this.session); } }; this.$getSelectedRows = function() { var range = this.getSelectionRange().collapseRows(); return { first: range.start.row, last: range.end.row }; }; this.onCompositionStart = function(text) { this.renderer.showComposition(this.getCursorPosition()); }; this.onCompositionUpdate = function(text) { this.renderer.setCompositionText(text); }; this.onCompositionEnd = function() { this.renderer.hideComposition(); }; this.getFirstVisibleRow = function() { return this.renderer.getFirstVisibleRow(); }; this.getLastVisibleRow = function() { return this.renderer.getLastVisibleRow(); }; this.isRowVisible = function(row) { return (row >= this.getFirstVisibleRow() && row <= this.getLastVisibleRow()); }; this.isRowFullyVisible = function(row) { return (row >= this.renderer.getFirstFullyVisibleRow() && row <= this.renderer.getLastFullyVisibleRow()); }; this.$getVisibleRowCount = function() { return this.renderer.getScrollBottomRow() - this.renderer.getScrollTopRow() + 1; }; this.$moveByPage = function(dir, select) { var renderer = this.renderer; var config = this.renderer.layerConfig; var rows = dir * Math.floor(config.height / config.lineHeight); this.$blockScrolling++; if (select == true) { this.selection.$moveSelection(function(){ this.moveCursorBy(rows, 0); }); } else if (select == false) { this.selection.moveCursorBy(rows, 0); this.selection.clearSelection(); } this.$blockScrolling--; var scrollTop = renderer.scrollTop; renderer.scrollBy(0, rows * config.lineHeight); if (select != null) renderer.scrollCursorIntoView(null, 0.5); renderer.animateScrolling(scrollTop); }; this.selectPageDown = function() { this.$moveByPage(1, true); }; this.selectPageUp = function() { this.$moveByPage(-1, true); }; this.gotoPageDown = function() { this.$moveByPage(1, false); }; this.gotoPageUp = function() { this.$moveByPage(-1, false); }; this.scrollPageDown = function() { this.$moveByPage(1); }; this.scrollPageUp = function() { this.$moveByPage(-1); }; this.scrollToRow = function(row) { this.renderer.scrollToRow(row); }; this.scrollToLine = function(line, center, animate, callback) { this.renderer.scrollToLine(line, center, animate, callback); }; this.centerSelection = function() { var range = this.getSelectionRange(); var pos = { row: Math.floor(range.start.row + (range.end.row - range.start.row) / 2), column: Math.floor(range.start.column + (range.end.column - range.start.column) / 2) } this.renderer.alignCursor(pos, 0.5); }; this.getCursorPosition = function() { return this.selection.getCursor(); }; this.getCursorPositionScreen = function() { return this.session.documentToScreenPosition(this.getCursorPosition()); }; this.getSelectionRange = function() { return this.selection.getRange(); }; this.selectAll = function() { this.$blockScrolling += 1; this.selection.selectAll(); this.$blockScrolling -= 1; }; this.clearSelection = function() { this.selection.clearSelection(); }; this.moveCursorTo = function(row, column) { this.selection.moveCursorTo(row, column); }; this.moveCursorToPosition = function(pos) { this.selection.moveCursorToPosition(pos); }; this.jumpToMatching = function(select) { var cursor = this.getCursorPosition(); var range = this.session.getBracketRange(cursor); if (!range) { range = this.find({ needle: /[{}()\[\]]/g, preventScroll:true, start: {row: cursor.row, column: cursor.column - 1} }); if (!range) return; var pos = range.start; if (pos.row == cursor.row && Math.abs(pos.column - cursor.column) < 2) range = this.session.getBracketRange(pos); } pos = range && range.cursor || pos; if (pos) { if (select) { if (range && range.isEqual(this.getSelectionRange())) this.clearSelection(); else this.selection.selectTo(pos.row, pos.column); } else { this.clearSelection(); this.moveCursorTo(pos.row, pos.column); } } }; this.gotoLine = function(lineNumber, column, animate) { this.selection.clearSelection(); this.session.unfold({row: lineNumber - 1, column: column || 0}); this.$blockScrolling += 1; this.exitMultiSelectMode && this.exitMultiSelectMode(); this.moveCursorTo(lineNumber - 1, column || 0); this.$blockScrolling -= 1; if (!this.isRowFullyVisible(lineNumber - 1)) this.scrollToLine(lineNumber - 1, true, animate); }; this.navigateTo = function(row, column) { this.clearSelection(); this.moveCursorTo(row, column); }; this.navigateUp = function(times) { if (this.selection.isMultiLine() && !this.selection.isBackwards()) { var selectionStart = this.selection.anchor.getPosition(); return this.moveCursorToPosition(selectionStart); } this.selection.clearSelection(); times = times || 1; this.selection.moveCursorBy(-times, 0); }; this.navigateDown = function(times) { if (this.selection.isMultiLine() && this.selection.isBackwards()) { var selectionEnd = this.selection.anchor.getPosition(); return this.moveCursorToPosition(selectionEnd); } this.selection.clearSelection(); times = times || 1; this.selection.moveCursorBy(times, 0); }; this.navigateLeft = function(times) { if (!this.selection.isEmpty()) { var selectionStart = this.getSelectionRange().start; this.moveCursorToPosition(selectionStart); } else { times = times || 1; while (times--) { this.selection.moveCursorLeft(); } } this.clearSelection(); }; this.navigateRight = function(times) { if (!this.selection.isEmpty()) { var selectionEnd = this.getSelectionRange().end; this.moveCursorToPosition(selectionEnd); } else { times = times || 1; while (times--) { this.selection.moveCursorRight(); } } this.clearSelection(); }; this.navigateLineStart = function() { this.selection.moveCursorLineStart(); this.clearSelection(); }; this.navigateLineEnd = function() { this.selection.moveCursorLineEnd(); this.clearSelection(); }; this.navigateFileEnd = function() { var scrollTop = this.renderer.scrollTop; this.selection.moveCursorFileEnd(); this.clearSelection(); this.renderer.animateScrolling(scrollTop); }; this.navigateFileStart = function() { var scrollTop = this.renderer.scrollTop; this.selection.moveCursorFileStart(); this.clearSelection(); this.renderer.animateScrolling(scrollTop); }; this.navigateWordRight = function() { this.selection.moveCursorWordRight(); this.clearSelection(); }; this.navigateWordLeft = function() { this.selection.moveCursorWordLeft(); this.clearSelection(); }; this.replace = function(replacement, options) { if (options) this.$search.set(options); var range = this.$search.find(this.session); var replaced = 0; if (!range) return replaced; if (this.$tryReplace(range, replacement)) { replaced = 1; } if (range !== null) { this.selection.setSelectionRange(range); this.renderer.scrollSelectionIntoView(range.start, range.end); } return replaced; }; this.replaceAll = function(replacement, options) { if (options) { this.$search.set(options); } var ranges = this.$search.findAll(this.session); var replaced = 0; if (!ranges.length) return replaced; this.$blockScrolling += 1; var selection = this.getSelectionRange(); this.clearSelection(); this.selection.moveCursorTo(0, 0); for (var i = ranges.length - 1; i >= 0; --i) { if(this.$tryReplace(ranges[i], replacement)) { replaced++; } } this.selection.setSelectionRange(selection); this.$blockScrolling -= 1; return replaced; }; this.$tryReplace = function(range, replacement) { var input = this.session.getTextRange(range); replacement = this.$search.replace(input, replacement); if (replacement !== null) { range.end = this.session.replace(range, replacement); return range; } else { return null; } }; this.getLastSearchOptions = function() { return this.$search.getOptions(); }; this.find = function(needle, options, animate) { if (!options) options = {}; if (typeof needle == "string" || needle instanceof RegExp) options.needle = needle; else if (typeof needle == "object") oop.mixin(options, needle); var range = this.selection.getRange(); if (options.needle == null) { needle = this.session.getTextRange(range) || this.$search.$options.needle; if (!needle) { range = this.session.getWordRange(range.start.row, range.start.column); needle = this.session.getTextRange(range); } this.$search.set({needle: needle}); } this.$search.set(options); if (!options.start) this.$search.set({start: range}); var newRange = this.$search.find(this.session); if (options.preventScroll) return newRange; if (newRange) { this.revealRange(newRange, animate); return newRange; } if (options.backwards) range.start = range.end; else range.end = range.start; this.selection.setRange(range); }; this.findNext = function(options, animate) { this.find({skipCurrent: true, backwards: false}, options, animate); }; this.findPrevious = function(options, animate) { this.find(options, {skipCurrent: true, backwards: true}, animate); }; this.revealRange = function(range, animate) { this.$blockScrolling += 1; this.session.unfold(range); this.selection.setSelectionRange(range); this.$blockScrolling -= 1; var scrollTop = this.renderer.scrollTop; this.renderer.scrollSelectionIntoView(range.start, range.end, 0.5); if (animate != false) this.renderer.animateScrolling(scrollTop); }; this.undo = function() { this.$blockScrolling++; this.session.getUndoManager().undo(); this.$blockScrolling--; this.renderer.scrollCursorIntoView(null, 0.5); }; this.redo = function() { this.$blockScrolling++; this.session.getUndoManager().redo(); this.$blockScrolling--; this.renderer.scrollCursorIntoView(null, 0.5); }; this.destroy = function() { this.renderer.destroy(); this._emit("destroy", this); }; this.setAutoScrollEditorIntoView = function(enable) { if (enable === false) return; var rect; var self = this; var shouldScroll = false; if (!this.$scrollAnchor) this.$scrollAnchor = document.createElement("div"); var scrollAnchor = this.$scrollAnchor; scrollAnchor.style.cssText = "position:absolute"; this.container.insertBefore(scrollAnchor, this.container.firstChild); var onChangeSelection = this.on("changeSelection", function() { shouldScroll = true; }); var onBeforeRender = this.renderer.on("beforeRender", function() { if (shouldScroll) rect = self.renderer.container.getBoundingClientRect(); }); var onAfterRender = this.renderer.on("afterRender", function() { if (shouldScroll && rect && self.isFocused()) { var renderer = self.renderer; var pos = renderer.$cursorLayer.$pixelPos; var config = renderer.layerConfig; var top = pos.top - config.offset; if (pos.top >= 0 && top + rect.top < 0) { shouldScroll = true; } else if (pos.top < config.height && pos.top + rect.top + config.lineHeight > window.innerHeight) { shouldScroll = false; } else { shouldScroll = null; } if (shouldScroll != null) { scrollAnchor.style.top = top + "px"; scrollAnchor.style.left = pos.left + "px"; scrollAnchor.style.height = config.lineHeight + "px"; scrollAnchor.scrollIntoView(shouldScroll); } shouldScroll = rect = null; } }); this.setAutoScrollEditorIntoView = function(enable) { if (enable === true) return; delete this.setAutoScrollEditorIntoView; this.removeEventListener("changeSelection", onChangeSelection); this.renderer.removeEventListener("afterRender", onAfterRender); this.renderer.removeEventListener("beforeRender", onBeforeRender); }; }; this.$resetCursorStyle = function() { var style = this.$cursorStyle || "ace"; var cursorLayer = this.renderer.$cursorLayer; if (!cursorLayer) return; cursorLayer.setSmoothBlinking(style == "smooth"); cursorLayer.isBlinking = !this.$readOnly && style != "wide"; }; }).call(Editor.prototype); config.defineOptions(Editor.prototype, "editor", { selectionStyle: { set: function(style) { this.onSelectionChange(); this._emit("changeSelectionStyle", {data: style}); }, initialValue: "line" }, highlightActiveLine: { set: function() {this.$updateHighlightActiveLine();}, initialValue: true }, highlightSelectedWord: { set: function(shouldHighlight) {this.$onSelectionChange();}, initialValue: true }, readOnly: { set: function(readOnly) { this.textInput.setReadOnly(readOnly); this.$resetCursorStyle(); }, initialValue: false }, cursorStyle: { set: function(val) { this.$resetCursorStyle(); }, values: ["ace", "slim", "smooth", "wide"], initialValue: "ace" }, mergeUndoDeltas: { values: [false, true, "always"], initialValue: true }, behavioursEnabled: {initialValue: true}, wrapBehavioursEnabled: {initialValue: true}, hScrollBarAlwaysVisible: "renderer", vScrollBarAlwaysVisible: "renderer", highlightGutterLine: "renderer", animatedScroll: "renderer", showInvisibles: "renderer", showPrintMargin: "renderer", printMarginColumn: "renderer", printMargin: "renderer", fadeFoldWidgets: "renderer", showFoldWidgets: "renderer", showGutter: "renderer", displayIndentGuides: "renderer", fontSize: "renderer", fontFamily: "renderer", maxLines: "renderer", minLines: "renderer", scrollPastEnd: "renderer", fixedWidthGutter: "renderer", scrollSpeed: "$mouseHandler", dragDelay: "$mouseHandler", dragEnabled: "$mouseHandler", focusTimout: "$mouseHandler", firstLineNumber: "session", overwrite: "session", newLineMode: "session", useWorker: "session", useSoftTabs: "session", tabSize: "session", wrap: "session", foldStyle: "session" }); exports.Editor = Editor; }); define('ace/lib/lang', ['require', 'exports', 'module' ], function(require, exports, module) { exports.stringReverse = function(string) { return string.split("").reverse().join(""); }; exports.stringRepeat = function (string, count) { var result = ''; while (count > 0) { if (count & 1) result += string; if (count >>= 1) string += string; } return result; }; var trimBeginRegexp = /^\s\s*/; var trimEndRegexp = /\s\s*$/; exports.stringTrimLeft = function (string) { return string.replace(trimBeginRegexp, ''); }; exports.stringTrimRight = function (string) { return string.replace(trimEndRegexp, ''); }; exports.copyObject = function(obj) { var copy = {}; for (var key in obj) { copy[key] = obj[key]; } return copy; }; exports.copyArray = function(array){ var copy = []; for (var i=0, l=array.length; i= 0) { anchor = this.$clickSelection.start; if (range.start.row != cursor.row || range.start.column != cursor.column) cursor = range.end; } else if (cmpStart == -1 && cmpEnd == 1) { cursor = range.end; anchor = range.start; } else { var orientedRange = calcRangeOrientation(this.$clickSelection, cursor); cursor = orientedRange.cursor; anchor = orientedRange.anchor; } editor.selection.setSelectionAnchor(anchor.row, anchor.column); } editor.selection.selectToPosition(cursor); editor.renderer.scrollCursorIntoView(); }; this.selectEnd = this.selectAllEnd = this.selectByWordsEnd = this.selectByLinesEnd = function() { this.editor.unsetStyle("ace_selecting"); if (this.editor.renderer.scroller.releaseCapture) { this.editor.renderer.scroller.releaseCapture(); } }; this.focusWait = function() { var distance = calcDistance(this.mousedownEvent.x, this.mousedownEvent.y, this.x, this.y); var time = (new Date()).getTime(); if (distance > DRAG_OFFSET || time - this.mousedownEvent.time > this.$focusTimout) this.startSelect(this.mousedownEvent.getDocumentPosition()); }; this.onDoubleClick = function(ev) { var pos = ev.getDocumentPosition(); var editor = this.editor; var session = editor.session; var range = session.getBracketRange(pos); if (range) { if (range.isEmpty()) { range.start.column--; range.end.column++; } this.$clickSelection = range; this.setState("select"); return; } this.$clickSelection = editor.selection.getWordRange(pos.row, pos.column); this.setState("selectByWords"); }; this.onTripleClick = function(ev) { var pos = ev.getDocumentPosition(); var editor = this.editor; this.setState("selectByLines"); this.$clickSelection = editor.selection.getLineRange(pos.row); }; this.onQuadClick = function(ev) { var editor = this.editor; editor.selectAll(); this.$clickSelection = editor.getSelectionRange(); this.setState("selectAll"); }; this.onMouseWheel = function(ev) { if (ev.getShiftKey() || ev.getAccelKey()) return; var t = ev.domEvent.timeStamp; var dt = t - (this.$lastScrollTime||0); var editor = this.editor; var isScrolable = editor.renderer.isScrollableBy(ev.wheelX * ev.speed, ev.wheelY * ev.speed); if (isScrolable || dt < 200) { this.$lastScrollTime = t; editor.renderer.scrollBy(ev.wheelX * ev.speed, ev.wheelY * ev.speed); return ev.stop(); } }; }).call(DefaultHandlers.prototype); exports.DefaultHandlers = DefaultHandlers; function calcDistance(ax, ay, bx, by) { return Math.sqrt(Math.pow(bx - ax, 2) + Math.pow(by - ay, 2)); } function calcRangeOrientation(range, cursor) { if (range.start.row == range.end.row) var cmp = 2 * cursor.column - range.start.column - range.end.column; else if (range.start.row == range.end.row - 1 && !range.start.column && !range.end.column) var cmp = cursor.column - 4; else var cmp = 2 * cursor.row - range.start.row - range.end.row; if (cmp < 0) return {cursor: range.start, anchor: range.end}; else return {cursor: range.end, anchor: range.start}; } }); define('ace/mouse/default_gutter_handler', ['require', 'exports', 'module' , 'ace/lib/dom', 'ace/lib/event'], function(require, exports, module) { var dom = require("../lib/dom"); var event = require("../lib/event"); function GutterHandler(mouseHandler) { var editor = mouseHandler.editor; var gutter = editor.renderer.$gutterLayer; mouseHandler.editor.setDefaultHandler("guttermousedown", function(e) { if (!editor.isFocused() || e.getButton() != 0) return; var gutterRegion = gutter.getRegion(e); if (gutterRegion == "foldWidgets") return; var row = e.getDocumentPosition().row; var selection = editor.session.selection; if (e.getShiftKey()) selection.selectTo(row, 0); else { if (e.domEvent.detail == 2) { editor.selectAll(); return e.preventDefault(); } mouseHandler.$clickSelection = editor.selection.getLineRange(row); } mouseHandler.setState("selectByLines"); mouseHandler.captureMouse(e); return e.preventDefault(); }); var tooltipTimeout, mouseEvent, tooltip, tooltipAnnotation; function createTooltip() { tooltip = dom.createElement("div"); tooltip.className = "ace_gutter-tooltip"; tooltip.style.display = "none"; editor.container.appendChild(tooltip); } function showTooltip() { if (!tooltip) { createTooltip(); } var row = mouseEvent.getDocumentPosition().row; var annotation = gutter.$annotations[row]; if (!annotation) return hideTooltip(); var maxRow = editor.session.getLength(); if (row == maxRow) { var screenRow = editor.renderer.pixelToScreenCoordinates(0, mouseEvent.y).row; var pos = mouseEvent.$pos; if (screenRow > editor.session.documentToScreenRow(pos.row, pos.column)) return hideTooltip(); } if (tooltipAnnotation == annotation) return; tooltipAnnotation = annotation.text.join("
    "); tooltip.style.display = "block"; tooltip.innerHTML = tooltipAnnotation; editor.on("mousewheel", hideTooltip); moveTooltip(mouseEvent); } function hideTooltip() { if (tooltipTimeout) tooltipTimeout = clearTimeout(tooltipTimeout); if (tooltipAnnotation) { tooltip.style.display = "none"; tooltipAnnotation = null; editor.removeEventListener("mousewheel", hideTooltip); } } function moveTooltip(e) { var rect = editor.renderer.$gutter.getBoundingClientRect(); tooltip.style.left = e.x + 15 + "px"; if (e.y + 3 * editor.renderer.lineHeight + 15 < rect.bottom) { tooltip.style.bottom = ""; tooltip.style.top = e.y + 15 + "px"; } else { tooltip.style.top = ""; var innerHeight = window.innerHeight || document.documentElement.clientHeight; tooltip.style.bottom = innerHeight - e.y + 5 + "px"; } } mouseHandler.editor.setDefaultHandler("guttermousemove", function(e) { var target = e.domEvent.target || e.domEvent.srcElement; if (dom.hasCssClass(target, "ace_fold-widget")) return hideTooltip(); if (tooltipAnnotation) moveTooltip(e); mouseEvent = e; if (tooltipTimeout) return; tooltipTimeout = setTimeout(function() { tooltipTimeout = null; if (mouseEvent && !mouseHandler.isMousePressed) showTooltip(); else hideTooltip(); }, 50); }); event.addListener(editor.renderer.$gutter, "mouseout", function(e) { mouseEvent = null; if (!tooltipAnnotation || tooltipTimeout) return; tooltipTimeout = setTimeout(function() { tooltipTimeout = null; hideTooltip(); }, 50); }); editor.on("changeSession", hideTooltip); } exports.GutterHandler = GutterHandler; }); define('ace/mouse/mouse_event', ['require', 'exports', 'module' , 'ace/lib/event', 'ace/lib/useragent'], function(require, exports, module) { var event = require("../lib/event"); var useragent = require("../lib/useragent"); var MouseEvent = exports.MouseEvent = function(domEvent, editor) { this.domEvent = domEvent; this.editor = editor; this.x = this.clientX = domEvent.clientX; this.y = this.clientY = domEvent.clientY; this.$pos = null; this.$inSelection = null; this.propagationStopped = false; this.defaultPrevented = false; }; (function() { this.stopPropagation = function() { event.stopPropagation(this.domEvent); this.propagationStopped = true; }; this.preventDefault = function() { event.preventDefault(this.domEvent); this.defaultPrevented = true; }; this.stop = function() { this.stopPropagation(); this.preventDefault(); }; this.getDocumentPosition = function() { if (this.$pos) return this.$pos; this.$pos = this.editor.renderer.screenToTextCoordinates(this.clientX, this.clientY); return this.$pos; }; this.inSelection = function() { if (this.$inSelection !== null) return this.$inSelection; var editor = this.editor; var selectionRange = editor.getSelectionRange(); if (selectionRange.isEmpty()) this.$inSelection = false; else { var pos = this.getDocumentPosition(); this.$inSelection = selectionRange.contains(pos.row, pos.column); } return this.$inSelection; }; this.getButton = function() { return event.getButton(this.domEvent); }; this.getShiftKey = function() { return this.domEvent.shiftKey; }; this.getAccelKey = useragent.isMac ? function() { return this.domEvent.metaKey; } : function() { return this.domEvent.ctrlKey; }; }).call(MouseEvent.prototype); }); define('ace/mouse/dragdrop_handler', ['require', 'exports', 'module' , 'ace/lib/dom', 'ace/lib/event', 'ace/lib/useragent'], function(require, exports, module) { var dom = require("../lib/dom"); var event = require("../lib/event"); var useragent = require("../lib/useragent"); var AUTOSCROLL_DELAY = 200; var SCROLL_CURSOR_DELAY = 200; var SCROLL_CURSOR_HYSTERESIS = 5; function DragdropHandler(mouseHandler) { var editor = mouseHandler.editor; var blankImage = dom.createElement("img"); blankImage.src = "data:image/gif;base64,R0lGODlhAQABAAAAACH5BAEKAAEALAAAAAABAAEAAAICTAEAOw=="; if (useragent.isOpera) blankImage.style.cssText = "width:1px;height:1px;position:fixed;top:0;left:0;z-index:2147483647;opacity:0;"; var exports = ["dragWait", "dragWaitEnd", "startDrag", "dragReadyEnd", "onMouseDrag"]; exports.forEach(function(x) { mouseHandler[x] = this[x]; }, this); editor.addEventListener("mousedown", this.onMouseDown.bind(mouseHandler)); var mouseTarget = editor.container; var dragSelectionMarker, x, y; var timerId, range; var dragCursor, counter = 0; var dragOperation; var isInternal; var autoScrollStartTime; var cursorMovedTime; var cursorPointOnCaretMoved; this.onDragStart = function(e) { if (this.cancelDrag || !mouseTarget.draggable) { var self = this; setTimeout(function(){ self.startSelect(); self.captureMouse(e); }, 0); return e.preventDefault(); } range = editor.getSelectionRange(); var dataTransfer = e.dataTransfer; dataTransfer.effectAllowed = editor.getReadOnly() ? "copy" : "copyMove"; if (useragent.isOpera) { editor.container.appendChild(blankImage); blankImage._top = blankImage.offsetTop; } dataTransfer.setDragImage && dataTransfer.setDragImage(blankImage, 0, 0); if (useragent.isOpera) { editor.container.removeChild(blankImage); } dataTransfer.clearData(); dataTransfer.setData("Text", editor.session.getTextRange()); isInternal = true; this.setState("drag"); }; this.onDragEnd = function(e) { mouseTarget.draggable = false; isInternal = false; this.setState(null); if (!editor.getReadOnly()) { var dropEffect = e.dataTransfer.dropEffect; if (!dragOperation && dropEffect == "move") editor.session.remove(editor.getSelectionRange()); editor.renderer.$cursorLayer.setBlinking(true); } this.editor.unsetStyle("ace_dragging"); }; this.onDragEnter = function(e) { if (editor.getReadOnly() || !canAccept(e.dataTransfer)) return; if (!dragSelectionMarker) addDragMarker(); counter++; e.dataTransfer.dropEffect = dragOperation = getDropEffect(e); return event.preventDefault(e); }; this.onDragOver = function(e) { if (editor.getReadOnly() || !canAccept(e.dataTransfer)) return; if (!dragSelectionMarker) { addDragMarker(); counter++; } if (onMouseMoveTimer !== null) onMouseMoveTimer = null; x = e.clientX; y = e.clientY; e.dataTransfer.dropEffect = dragOperation = getDropEffect(e); return event.preventDefault(e); }; this.onDragLeave = function(e) { counter--; if (counter <= 0 && dragSelectionMarker) { clearDragMarker(); dragOperation = null; return event.preventDefault(e); } }; this.onDrop = function(e) { if (!dragSelectionMarker) return; var dataTransfer = e.dataTransfer; if (isInternal) { switch (dragOperation) { case "move": if (range.contains(dragCursor.row, dragCursor.column)) { range = { start: dragCursor, end: dragCursor }; } else { range = editor.moveText(range, dragCursor); } break; case "copy": range = editor.moveText(range, dragCursor, true); break; } } else { var dropData = dataTransfer.getData('Text'); range = { start: dragCursor, end: editor.session.insert(dragCursor, dropData) }; editor.focus(); dragOperation = null; } clearDragMarker(); return event.preventDefault(e); }; event.addListener(mouseTarget, "dragstart", this.onDragStart.bind(mouseHandler)); event.addListener(mouseTarget, "dragend", this.onDragEnd.bind(mouseHandler)); event.addListener(mouseTarget, "dragenter", this.onDragEnter.bind(mouseHandler)); event.addListener(mouseTarget, "dragover", this.onDragOver.bind(mouseHandler)); event.addListener(mouseTarget, "dragleave", this.onDragLeave.bind(mouseHandler)); event.addListener(mouseTarget, "drop", this.onDrop.bind(mouseHandler)); function scrollCursorIntoView(cursor, prevCursor) { var now = new Date().getTime(); var vMovement = !prevCursor || cursor.row != prevCursor.row; var hMovement = !prevCursor || cursor.column != prevCursor.column; if (!cursorMovedTime || vMovement || hMovement) { editor.$blockScrolling += 1; editor.moveCursorToPosition(cursor); editor.$blockScrolling -= 1; cursorMovedTime = now; cursorPointOnCaretMoved = {x: x, y: y}; } else { var distance = calcDistance(cursorPointOnCaretMoved.x, cursorPointOnCaretMoved.y, x, y); if (distance > SCROLL_CURSOR_HYSTERESIS) { cursorMovedTime = null; } else if (now - cursorMovedTime >= SCROLL_CURSOR_DELAY) { editor.renderer.scrollCursorIntoView(); cursorMovedTime = null; } } } function autoScroll(cursor, prevCursor) { var now = new Date().getTime(); var lineHeight = editor.renderer.layerConfig.lineHeight; var characterWidth = editor.renderer.layerConfig.characterWidth; var editorRect = editor.renderer.scroller.getBoundingClientRect(); var offsets = { x: { left: x - editorRect.left, right: editorRect.right - x }, y: { top: y - editorRect.top, bottom: editorRect.bottom - y } }; var nearestXOffset = Math.min(offsets.x.left, offsets.x.right); var nearestYOffset = Math.min(offsets.y.top, offsets.y.bottom); var scrollCursor = {row: cursor.row, column: cursor.column}; if (nearestXOffset / characterWidth <= 2) { scrollCursor.column += (offsets.x.left < offsets.x.right ? -3 : +2); } if (nearestYOffset / lineHeight <= 1) { scrollCursor.row += (offsets.y.top < offsets.y.bottom ? -1 : +1); } var vScroll = cursor.row != scrollCursor.row; var hScroll = cursor.column != scrollCursor.column; var vMovement = !prevCursor || cursor.row != prevCursor.row; if (vScroll || (hScroll && !vMovement)) { if (!autoScrollStartTime) autoScrollStartTime = now; else if (now - autoScrollStartTime >= AUTOSCROLL_DELAY) editor.renderer.scrollCursorIntoView(scrollCursor); } else { autoScrollStartTime = null; } } function onDragInterval() { var prevCursor = dragCursor; dragCursor = editor.renderer.screenToTextCoordinates(x, y); scrollCursorIntoView(dragCursor, prevCursor); autoScroll(dragCursor, prevCursor); } function addDragMarker() { range = editor.selection.toOrientedRange(); dragSelectionMarker = editor.session.addMarker(range, "ace_selection", editor.getSelectionStyle()); editor.clearSelection(); if (editor.isFocused()) editor.renderer.$cursorLayer.setBlinking(false); clearInterval(timerId); timerId = setInterval(onDragInterval, 20); counter = 0; event.addListener(document, "mousemove", onMouseMove); } function clearDragMarker() { clearInterval(timerId); editor.session.removeMarker(dragSelectionMarker); dragSelectionMarker = null; editor.$blockScrolling += 1; editor.selection.fromOrientedRange(range); editor.$blockScrolling -= 1; if (editor.isFocused() && !isInternal) editor.renderer.$cursorLayer.setBlinking(!editor.getReadOnly()); range = null; counter = 0; autoScrollStartTime = null; cursorMovedTime = null; event.removeListener(document, "mousemove", onMouseMove); } var onMouseMoveTimer = null; function onMouseMove() { if (onMouseMoveTimer == null) { onMouseMoveTimer = setTimeout(function() { if (onMouseMoveTimer != null && dragSelectionMarker) clearDragMarker(); }, 20); } } function canAccept(dataTransfer) { var types = dataTransfer.types; return !types || Array.prototype.some.call(types, function(type) { return type == 'text/plain' || type == 'Text'; }); } function getDropEffect(e) { var copyAllowed = ['copy', 'copymove', 'all', 'uninitialized']; var moveAllowed = ['move', 'copymove', 'linkmove', 'all', 'uninitialized']; var copyModifierState = useragent.isMac ? e.altKey : e.ctrlKey; var effectAllowed = "uninitialized"; try { effectAllowed = e.dataTransfer.effectAllowed.toLowerCase(); } catch (e) {} var dropEffect = "none"; if (copyModifierState && copyAllowed.indexOf(effectAllowed) >= 0) dropEffect = "copy"; else if (moveAllowed.indexOf(effectAllowed) >= 0) dropEffect = "move"; else if (copyAllowed.indexOf(effectAllowed) >= 0) dropEffect = "copy"; return dropEffect; } } (function() { this.dragWait = function() { var interval = (new Date()).getTime() - this.mousedownEvent.time; if (interval > this.editor.getDragDelay()) this.startDrag(); }; this.dragWaitEnd = function() { var target = this.editor.container; target.draggable = false; this.startSelect(this.mousedownEvent.getDocumentPosition()); this.selectEnd(); }; this.dragReadyEnd = function(e) { this.editor.renderer.$cursorLayer.setBlinking(!this.editor.getReadOnly()); this.editor.unsetStyle("ace_dragging"); this.dragWaitEnd(); }; this.startDrag = function(){ this.cancelDrag = false; var target = this.editor.container; target.draggable = true; this.editor.renderer.$cursorLayer.setBlinking(false); this.editor.setStyle("ace_dragging"); this.setState("dragReady"); }; this.onMouseDrag = function(e) { var target = this.editor.container; if (useragent.isIE && this.state == "dragReady") { var distance = calcDistance(this.mousedownEvent.x, this.mousedownEvent.y, this.x, this.y); if (distance > 3) target.dragDrop(); } if (this.state === "dragWait") { var distance = calcDistance(this.mousedownEvent.x, this.mousedownEvent.y, this.x, this.y); if (distance > 0) { target.draggable = false; this.startSelect(this.mousedownEvent.getDocumentPosition()); } } }; this.onMouseDown = function(e) { if (!this.$dragEnabled) return; this.mousedownEvent = e; var editor = this.editor; var inSelection = e.inSelection(); var button = e.getButton(); var clickCount = e.domEvent.detail || 1; if (clickCount === 1 && button === 0 && inSelection) { this.mousedownEvent.time = (new Date()).getTime(); var eventTarget = e.domEvent.target || e.domEvent.srcElement; if ("unselectable" in eventTarget) eventTarget.unselectable = "on"; if (editor.getDragDelay()) { if (useragent.isWebKit) { self.cancelDrag = true; var mouseTarget = editor.container; mouseTarget.draggable = true; } this.setState("dragWait"); } else { this.startDrag(); } this.captureMouse(e, this.onMouseDrag.bind(this)); e.defaultPrevented = true; } }; }).call(DragdropHandler.prototype); function calcDistance(ax, ay, bx, by) { return Math.sqrt(Math.pow(bx - ax, 2) + Math.pow(by - ay, 2)); } exports.DragdropHandler = DragdropHandler; }); define('ace/config', ['require', 'exports', 'module' , 'ace/lib/lang', 'ace/lib/oop', 'ace/lib/net', 'ace/lib/event_emitter'], function(require, exports, module) { "no use strict"; var lang = require("./lib/lang"); var oop = require("./lib/oop"); var net = require("./lib/net"); var EventEmitter = require("./lib/event_emitter").EventEmitter; var global = (function() { return this; })(); var options = { packaged: false, workerPath: null, modePath: null, themePath: null, basePath: "", suffix: ".js", $moduleUrls: {} }; exports.get = function(key) { if (!options.hasOwnProperty(key)) throw new Error("Unknown config key: " + key); return options[key]; }; exports.set = function(key, value) { if (!options.hasOwnProperty(key)) throw new Error("Unknown config key: " + key); options[key] = value; }; exports.all = function() { return lang.copyObject(options); }; oop.implement(exports, EventEmitter); exports.moduleUrl = function(name, component) { if (options.$moduleUrls[name]) return options.$moduleUrls[name]; var parts = name.split("/"); component = component || parts[parts.length - 2] || ""; var sep = component == "snippets" ? "/" : "-"; var base = parts[parts.length - 1]; if (sep == "-") { var re = new RegExp("^" + component + "[\\-_]|[\\-_]" + component + "$", "g"); base = base.replace(re, ""); } if ((!base || base == component) && parts.length > 1) base = parts[parts.length - 2]; var path = options[component + "Path"]; if (path == null) { path = options.basePath; } else if (sep == "/") { component = sep = ""; } if (path && path.slice(-1) != "/") path += "/"; return path + component + sep + base + this.get("suffix"); }; exports.setModuleUrl = function(name, subst) { return options.$moduleUrls[name] = subst; }; exports.$loading = {}; exports.loadModule = function(moduleName, onLoad) { var module, moduleType; if (Array.isArray(moduleName)) { moduleType = moduleName[0]; moduleName = moduleName[1]; } try { module = require(moduleName); } catch (e) {} if (module && !exports.$loading[moduleName]) return onLoad && onLoad(module); if (!exports.$loading[moduleName]) exports.$loading[moduleName] = []; exports.$loading[moduleName].push(onLoad); if (exports.$loading[moduleName].length > 1) return; var afterLoad = function() { require([moduleName], function(module) { exports._emit("load.module", {name: moduleName, module: module}); var listeners = exports.$loading[moduleName]; exports.$loading[moduleName] = null; listeners.forEach(function(onLoad) { onLoad && onLoad(module); }); }); }; if (!exports.get("packaged")) return afterLoad(); net.loadScript(exports.moduleUrl(moduleName, moduleType), afterLoad); }; exports.init = function() { options.packaged = require.packaged || module.packaged || (global.define && define.packaged); if (!global.document) return ""; var scriptOptions = {}; var scriptUrl = ""; var scripts = document.getElementsByTagName("script"); for (var i=0; i i) { this.$docRowCache.splice(i, l); this.$screenRowCache.splice(i, l); } }; this.$getRowCacheIndex = function(cacheArray, val) { var low = 0; var hi = cacheArray.length - 1; while (low <= hi) { var mid = (low + hi) >> 1; var c = cacheArray[mid]; if (val > c) low = mid + 1; else if (val < c) hi = mid - 1; else return mid; } return low -1; }; this.resetCaches = function() { this.$modified = true; this.$wrapData = []; this.$rowLengthCache = []; this.$resetRowCache(0); if (this.bgTokenizer) this.bgTokenizer.start(0); }; this.onChangeFold = function(e) { var fold = e.data; this.$resetRowCache(fold.start.row); }; this.onChange = function(e) { var delta = e.data; this.$modified = true; this.$resetRowCache(delta.range.start.row); var removedFolds = this.$updateInternalDataOnChange(e); if (!this.$fromUndo && this.$undoManager && !delta.ignore) { this.$deltasDoc.push(delta); if (removedFolds && removedFolds.length != 0) { this.$deltasFold.push({ action: "removeFolds", folds: removedFolds }); } this.$informUndoManager.schedule(); } this.bgTokenizer.$updateOnChange(delta); this._emit("change", e); }; this.setValue = function(text) { this.doc.setValue(text); this.selection.moveCursorTo(0, 0); this.selection.clearSelection(); this.$resetRowCache(0); this.$deltas = []; this.$deltasDoc = []; this.$deltasFold = []; this.getUndoManager().reset(); }; this.getValue = this.toString = function() { return this.doc.getValue(); }; this.getSelection = function() { return this.selection; }; this.getState = function(row) { return this.bgTokenizer.getState(row); }; this.getTokens = function(row) { return this.bgTokenizer.getTokens(row); }; this.getTokenAt = function(row, column) { var tokens = this.bgTokenizer.getTokens(row); var token, c = 0; if (column == null) { i = tokens.length - 1; c = this.getLine(row).length; } else { for (var i = 0; i < tokens.length; i++) { c += tokens[i].value.length; if (c >= column) break; } } token = tokens[i]; if (!token) return null; token.index = i; token.start = c - token.value.length; return token; }; this.setUndoManager = function(undoManager) { this.$undoManager = undoManager; this.$deltas = []; this.$deltasDoc = []; this.$deltasFold = []; if (this.$informUndoManager) this.$informUndoManager.cancel(); if (undoManager) { var self = this; this.$syncInformUndoManager = function() { self.$informUndoManager.cancel(); if (self.$deltasFold.length) { self.$deltas.push({ group: "fold", deltas: self.$deltasFold }); self.$deltasFold = []; } if (self.$deltasDoc.length) { self.$deltas.push({ group: "doc", deltas: self.$deltasDoc }); self.$deltasDoc = []; } if (self.$deltas.length > 0) { undoManager.execute({ action: "aceupdate", args: [self.$deltas, self], merge: self.mergeUndoDeltas }); } self.mergeUndoDeltas = false; self.$deltas = []; } this.$informUndoManager = lang.delayedCall(this.$syncInformUndoManager); } }; this.markUndoGroup = function() { if (this.$syncInformUndoManager) this.$syncInformUndoManager(); }; this.$defaultUndoManager = { undo: function() {}, redo: function() {}, reset: function() {} }; this.getUndoManager = function() { return this.$undoManager || this.$defaultUndoManager; }; this.getTabString = function() { if (this.getUseSoftTabs()) { return lang.stringRepeat(" ", this.getTabSize()); } else { return "\t"; } }; this.setUseSoftTabs = function(val) { this.setOption("useSoftTabs", val); }; this.getUseSoftTabs = function() { return this.$useSoftTabs && !this.$mode.$indentWithTabs; }; this.setTabSize = function(tabSize) { this.setOption("tabSize", tabSize) }; this.getTabSize = function() { return this.$tabSize; }; this.isTabStop = function(position) { return this.$useSoftTabs && (position.column % this.$tabSize == 0); }; this.$overwrite = false; this.setOverwrite = function(overwrite) { this.setOption("overwrite", overwrite) }; this.getOverwrite = function() { return this.$overwrite; }; this.toggleOverwrite = function() { this.setOverwrite(!this.$overwrite); }; this.addGutterDecoration = function(row, className) { if (!this.$decorations[row]) this.$decorations[row] = ""; this.$decorations[row] += " " + className; this._emit("changeBreakpoint", {}); }; this.removeGutterDecoration = function(row, className) { this.$decorations[row] = (this.$decorations[row] || "").replace(" " + className, ""); this._emit("changeBreakpoint", {}); }; this.getBreakpoints = function() { return this.$breakpoints; }; this.setBreakpoints = function(rows) { this.$breakpoints = []; for (var i=0; i 0) inToken = !!line.charAt(column - 1).match(this.tokenRe); if (!inToken) inToken = !!line.charAt(column).match(this.tokenRe); if (inToken) var re = this.tokenRe; else if (/^\s+$/.test(line.slice(column-1, column+1))) var re = /\s/; else var re = this.nonTokenRe; var start = column; if (start > 0) { do { start--; } while (start >= 0 && line.charAt(start).match(re)); start++; } var end = column; while (end < line.length && line.charAt(end).match(re)) { end++; } return new Range(row, start, row, end); }; this.getAWordRange = function(row, column) { var wordRange = this.getWordRange(row, column); var line = this.getLine(wordRange.end.row); while (line.charAt(wordRange.end.column).match(/[ \t]/)) { wordRange.end.column += 1; } return wordRange; }; this.setNewLineMode = function(newLineMode) { this.doc.setNewLineMode(newLineMode); }; this.getNewLineMode = function() { return this.doc.getNewLineMode(); }; this.setUseWorker = function(useWorker) { this.setOption("useWorker", useWorker); }; this.getUseWorker = function() { return this.$useWorker; }; this.onReloadTokenizer = function(e) { var rows = e.data; this.bgTokenizer.start(rows.first); this._emit("tokenizerUpdate", e); }; this.$modes = {}; this.$mode = null; this.$modeId = null; this.setMode = function(mode, cb) { if (mode && typeof mode === "object") { if (mode.getTokenizer) return this.$onChangeMode(mode); var options = mode; var path = options.path; } else { path = mode || "ace/mode/text"; } if (!this.$modes["ace/mode/text"]) this.$modes["ace/mode/text"] = new TextMode(); if (this.$modes[path] && !options) { this.$onChangeMode(this.$modes[path]); cb && cb(); return; } this.$modeId = path; config.loadModule(["mode", path], function(m) { if (this.$modeId !== path) return cb && cb(); if (this.$modes[path] && !options) return this.$onChangeMode(this.$modes[path]); if (m && m.Mode) { m = new m.Mode(options); if (!options) { this.$modes[path] = m; m.$id = path; } this.$onChangeMode(m); cb && cb(); } }.bind(this)); if (!this.$mode) this.$onChangeMode(this.$modes["ace/mode/text"], true); }; this.$onChangeMode = function(mode, $isPlaceholder) { if (!$isPlaceholder) this.$modeId = mode.$id; if (this.$mode === mode) return; this.$mode = mode; this.$stopWorker(); if (this.$useWorker) this.$startWorker(); var tokenizer = mode.getTokenizer(); if(tokenizer.addEventListener !== undefined) { var onReloadTokenizer = this.onReloadTokenizer.bind(this); tokenizer.addEventListener("update", onReloadTokenizer); } if (!this.bgTokenizer) { this.bgTokenizer = new BackgroundTokenizer(tokenizer); var _self = this; this.bgTokenizer.addEventListener("update", function(e) { _self._emit("tokenizerUpdate", e); }); } else { this.bgTokenizer.setTokenizer(tokenizer); } this.bgTokenizer.setDocument(this.getDocument()); this.tokenRe = mode.tokenRe; this.nonTokenRe = mode.nonTokenRe; this.$options.wrapMethod.set.call(this, this.$wrapMethod); if (!$isPlaceholder) { this.$setFolding(mode.foldingRules); this._emit("changeMode"); this.bgTokenizer.start(0); } }; this.$stopWorker = function() { if (this.$worker) this.$worker.terminate(); this.$worker = null; }; this.$startWorker = function() { if (typeof Worker !== "undefined" && !require.noWorker) { try { this.$worker = this.$mode.createWorker(this); } catch (e) { console.log("Could not load worker"); console.log(e); this.$worker = null; } } else this.$worker = null; }; this.getMode = function() { return this.$mode; }; this.$scrollTop = 0; this.setScrollTop = function(scrollTop) { if (this.$scrollTop === scrollTop || isNaN(scrollTop)) return; this.$scrollTop = scrollTop; this._signal("changeScrollTop", scrollTop); }; this.getScrollTop = function() { return this.$scrollTop; }; this.$scrollLeft = 0; this.setScrollLeft = function(scrollLeft) { if (this.$scrollLeft === scrollLeft || isNaN(scrollLeft)) return; this.$scrollLeft = scrollLeft; this._signal("changeScrollLeft", scrollLeft); }; this.getScrollLeft = function() { return this.$scrollLeft; }; this.getScreenWidth = function() { this.$computeWidth(); return this.screenWidth; }; this.$computeWidth = function(force) { if (this.$modified || force) { this.$modified = false; if (this.$useWrapMode) return this.screenWidth = this.$wrapLimit; var lines = this.doc.getAllLines(); var cache = this.$rowLengthCache; var longestScreenLine = 0; var foldIndex = 0; var foldLine = this.$foldData[foldIndex]; var foldStart = foldLine ? foldLine.start.row : Infinity; var len = lines.length; for (var i = 0; i < len; i++) { if (i > foldStart) { i = foldLine.end.row + 1; if (i >= len) break; foldLine = this.$foldData[foldIndex++]; foldStart = foldLine ? foldLine.start.row : Infinity; } if (cache[i] == null) cache[i] = this.$getStringScreenWidth(lines[i])[0]; if (cache[i] > longestScreenLine) longestScreenLine = cache[i]; } this.screenWidth = longestScreenLine; } }; this.getLine = function(row) { return this.doc.getLine(row); }; this.getLines = function(firstRow, lastRow) { return this.doc.getLines(firstRow, lastRow); }; this.getLength = function() { return this.doc.getLength(); }; this.getTextRange = function(range) { return this.doc.getTextRange(range || this.selection.getRange()); }; this.insert = function(position, text) { return this.doc.insert(position, text); }; this.remove = function(range) { return this.doc.remove(range); }; this.undoChanges = function(deltas, dontSelect) { if (!deltas.length) return; this.$fromUndo = true; var lastUndoRange = null; for (var i = deltas.length - 1; i != -1; i--) { var delta = deltas[i]; if (delta.group == "doc") { this.doc.revertDeltas(delta.deltas); lastUndoRange = this.$getUndoSelection(delta.deltas, true, lastUndoRange); } else { delta.deltas.forEach(function(foldDelta) { this.addFolds(foldDelta.folds); }, this); } } this.$fromUndo = false; lastUndoRange && this.$undoSelect && !dontSelect && this.selection.setSelectionRange(lastUndoRange); return lastUndoRange; }; this.redoChanges = function(deltas, dontSelect) { if (!deltas.length) return; this.$fromUndo = true; var lastUndoRange = null; for (var i = 0; i < deltas.length; i++) { var delta = deltas[i]; if (delta.group == "doc") { this.doc.applyDeltas(delta.deltas); lastUndoRange = this.$getUndoSelection(delta.deltas, false, lastUndoRange); } } this.$fromUndo = false; lastUndoRange && this.$undoSelect && !dontSelect && this.selection.setSelectionRange(lastUndoRange); return lastUndoRange; }; this.setUndoSelect = function(enable) { this.$undoSelect = enable; }; this.$getUndoSelection = function(deltas, isUndo, lastUndoRange) { function isInsert(delta) { var insert = delta.action === "insertText" || delta.action === "insertLines"; return isUndo ? !insert : insert; } var delta = deltas[0]; var range, point; var lastDeltaIsInsert = false; if (isInsert(delta)) { range = Range.fromPoints(delta.range.start, delta.range.end); lastDeltaIsInsert = true; } else { range = Range.fromPoints(delta.range.start, delta.range.start); lastDeltaIsInsert = false; } for (var i = 1; i < deltas.length; i++) { delta = deltas[i]; if (isInsert(delta)) { point = delta.range.start; if (range.compare(point.row, point.column) == -1) { range.setStart(delta.range.start); } point = delta.range.end; if (range.compare(point.row, point.column) == 1) { range.setEnd(delta.range.end); } lastDeltaIsInsert = true; } else { point = delta.range.start; if (range.compare(point.row, point.column) == -1) { range = Range.fromPoints(delta.range.start, delta.range.start); } lastDeltaIsInsert = false; } } if (lastUndoRange != null) { if (Range.comparePoints(lastUndoRange.start, range.start) == 0) { lastUndoRange.start.column += range.end.column - range.start.column; lastUndoRange.end.column += range.end.column - range.start.column; } var cmp = lastUndoRange.compareRange(range); if (cmp == 1) { range.setStart(lastUndoRange.start); } else if (cmp == -1) { range.setEnd(lastUndoRange.end); } } return range; }; this.replace = function(range, text) { return this.doc.replace(range, text); }; this.moveText = function(fromRange, toPosition, copy) { var text = this.getTextRange(fromRange); var folds = this.getFoldsInRange(fromRange); var toRange = Range.fromPoints(toPosition, toPosition); if (!copy) { this.remove(fromRange); var rowDiff = fromRange.start.row - fromRange.end.row; var collDiff = rowDiff ? -fromRange.end.column : fromRange.start.column - fromRange.end.column; if (collDiff) { if (toRange.start.row == fromRange.end.row && toRange.start.column > fromRange.end.column) toRange.start.column += collDiff; if (toRange.end.row == fromRange.end.row && toRange.end.column > fromRange.end.column) toRange.end.column += collDiff; } if (rowDiff && toRange.start.row >= fromRange.end.row) { toRange.start.row += rowDiff; toRange.end.row += rowDiff; } } toRange.end = this.insert(toRange.start, text); if (folds.length) { var oldStart = fromRange.start; var newStart = toRange.start; var rowDiff = newStart.row - oldStart.row; var collDiff = newStart.column - oldStart.column; this.addFolds(folds.map(function(x) { x = x.clone(); if (x.start.row == oldStart.row) x.start.column += collDiff; if (x.end.row == oldStart.row) x.end.column += collDiff; x.start.row += rowDiff; x.end.row += rowDiff; return x; })); } return toRange; }; this.indentRows = function(startRow, endRow, indentString) { indentString = indentString.replace(/\t/g, this.getTabString()); for (var row=startRow; row<=endRow; row++) this.insert({row: row, column:0}, indentString); }; this.outdentRows = function (range) { var rowRange = range.collapseRows(); var deleteRange = new Range(0, 0, 0, 0); var size = this.getTabSize(); for (var i = rowRange.start.row; i <= rowRange.end.row; ++i) { var line = this.getLine(i); deleteRange.start.row = i; deleteRange.end.row = i; for (var j = 0; j < size; ++j) if (line.charAt(j) != ' ') break; if (j < size && line.charAt(j) == '\t') { deleteRange.start.column = j; deleteRange.end.column = j + 1; } else { deleteRange.start.column = 0; deleteRange.end.column = j; } this.remove(deleteRange); } }; this.$moveLines = function(firstRow, lastRow, dir) { firstRow = this.getRowFoldStart(firstRow); lastRow = this.getRowFoldEnd(lastRow); if (dir < 0) { var row = this.getRowFoldStart(firstRow + dir); if (row < 0) return 0; var diff = row-firstRow; } else if (dir > 0) { var row = this.getRowFoldEnd(lastRow + dir); if (row > this.doc.getLength()-1) return 0; var diff = row-lastRow; } else { firstRow = this.$clipRowToDocument(firstRow); lastRow = this.$clipRowToDocument(lastRow); var diff = lastRow - firstRow + 1; } var range = new Range(firstRow, 0, lastRow, Number.MAX_VALUE); var folds = this.getFoldsInRange(range).map(function(x){ x = x.clone(); x.start.row += diff; x.end.row += diff; return x; }); var lines = dir == 0 ? this.doc.getLines(firstRow, lastRow) : this.doc.removeLines(firstRow, lastRow); this.doc.insertLines(firstRow+diff, lines); folds.length && this.addFolds(folds); return diff; }; this.moveLinesUp = function(firstRow, lastRow) { return this.$moveLines(firstRow, lastRow, -1); }; this.moveLinesDown = function(firstRow, lastRow) { return this.$moveLines(firstRow, lastRow, 1); }; this.duplicateLines = function(firstRow, lastRow) { return this.$moveLines(firstRow, lastRow, 0); }; this.$clipRowToDocument = function(row) { return Math.max(0, Math.min(row, this.doc.getLength()-1)); }; this.$clipColumnToRow = function(row, column) { if (column < 0) return 0; return Math.min(this.doc.getLine(row).length, column); }; this.$clipPositionToDocument = function(row, column) { column = Math.max(0, column); if (row < 0) { row = 0; column = 0; } else { var len = this.doc.getLength(); if (row >= len) { row = len - 1; column = this.doc.getLine(len-1).length; } else { column = Math.min(this.doc.getLine(row).length, column); } } return { row: row, column: column }; }; this.$clipRangeToDocument = function(range) { if (range.start.row < 0) { range.start.row = 0; range.start.column = 0; } else { range.start.column = this.$clipColumnToRow( range.start.row, range.start.column ); } var len = this.doc.getLength() - 1; if (range.end.row > len) { range.end.row = len; range.end.column = this.doc.getLine(len).length; } else { range.end.column = this.$clipColumnToRow( range.end.row, range.end.column ); } return range; }; this.$wrapLimit = 80; this.$useWrapMode = false; this.$wrapLimitRange = { min : null, max : null }; this.setUseWrapMode = function(useWrapMode) { if (useWrapMode != this.$useWrapMode) { this.$useWrapMode = useWrapMode; this.$modified = true; this.$resetRowCache(0); if (useWrapMode) { var len = this.getLength(); this.$wrapData = []; for (var i = 0; i < len; i++) { this.$wrapData.push([]); } this.$updateWrapData(0, len - 1); } this._emit("changeWrapMode"); } }; this.getUseWrapMode = function() { return this.$useWrapMode; }; this.setWrapLimitRange = function(min, max) { if (this.$wrapLimitRange.min !== min || this.$wrapLimitRange.max !== max) { this.$wrapLimitRange = { min: min, max: max }; this.$modified = true; this._emit("changeWrapMode"); } }; this.adjustWrapLimit = function(desiredLimit, $printMargin) { var limits = this.$wrapLimitRange if (limits.max < 0) limits = {min: $printMargin, max: $printMargin}; var wrapLimit = this.$constrainWrapLimit(desiredLimit, limits.min, limits.max); if (wrapLimit != this.$wrapLimit && wrapLimit > 1) { this.$wrapLimit = wrapLimit; this.$modified = true; if (this.$useWrapMode) { this.$updateWrapData(0, this.getLength() - 1); this.$resetRowCache(0); this._emit("changeWrapLimit"); } return true; } return false; }; this.$constrainWrapLimit = function(wrapLimit, min, max) { if (min) wrapLimit = Math.max(min, wrapLimit); if (max) wrapLimit = Math.min(max, wrapLimit); return wrapLimit; }; this.getWrapLimit = function() { return this.$wrapLimit; }; this.setWrapLimit = function (limit) { this.setWrapLimitRange(limit, limit); }; this.getWrapLimitRange = function() { return { min : this.$wrapLimitRange.min, max : this.$wrapLimitRange.max }; }; this.$updateInternalDataOnChange = function(e) { var useWrapMode = this.$useWrapMode; var len; var action = e.data.action; var firstRow = e.data.range.start.row; var lastRow = e.data.range.end.row; var start = e.data.range.start; var end = e.data.range.end; var removedFolds = null; if (action.indexOf("Lines") != -1) { if (action == "insertLines") { lastRow = firstRow + (e.data.lines.length); } else { lastRow = firstRow; } len = e.data.lines ? e.data.lines.length : lastRow - firstRow; } else { len = lastRow - firstRow; } this.$updating = true; if (len != 0) { if (action.indexOf("remove") != -1) { this[useWrapMode ? "$wrapData" : "$rowLengthCache"].splice(firstRow, len); var foldLines = this.$foldData; removedFolds = this.getFoldsInRange(e.data.range); this.removeFolds(removedFolds); var foldLine = this.getFoldLine(end.row); var idx = 0; if (foldLine) { foldLine.addRemoveChars(end.row, end.column, start.column - end.column); foldLine.shiftRow(-len); var foldLineBefore = this.getFoldLine(firstRow); if (foldLineBefore && foldLineBefore !== foldLine) { foldLineBefore.merge(foldLine); foldLine = foldLineBefore; } idx = foldLines.indexOf(foldLine) + 1; } for (idx; idx < foldLines.length; idx++) { var foldLine = foldLines[idx]; if (foldLine.start.row >= end.row) { foldLine.shiftRow(-len); } } lastRow = firstRow; } else { var args; if (useWrapMode) { args = [firstRow, 0]; for (var i = 0; i < len; i++) args.push([]); this.$wrapData.splice.apply(this.$wrapData, args); } else { args = Array(len); args.unshift(firstRow, 0); this.$rowLengthCache.splice.apply(this.$rowLengthCache, args); } var foldLines = this.$foldData; var foldLine = this.getFoldLine(firstRow); var idx = 0; if (foldLine) { var cmp = foldLine.range.compareInside(start.row, start.column) if (cmp == 0) { foldLine = foldLine.split(start.row, start.column); foldLine.shiftRow(len); foldLine.addRemoveChars( lastRow, 0, end.column - start.column); } else if (cmp == -1) { foldLine.addRemoveChars(firstRow, 0, end.column - start.column); foldLine.shiftRow(len); } idx = foldLines.indexOf(foldLine) + 1; } for (idx; idx < foldLines.length; idx++) { var foldLine = foldLines[idx]; if (foldLine.start.row >= firstRow) { foldLine.shiftRow(len); } } } } else { len = Math.abs(e.data.range.start.column - e.data.range.end.column); if (action.indexOf("remove") != -1) { removedFolds = this.getFoldsInRange(e.data.range); this.removeFolds(removedFolds); len = -len; } var foldLine = this.getFoldLine(firstRow); if (foldLine) { foldLine.addRemoveChars(firstRow, start.column, len); } } if (useWrapMode && this.$wrapData.length != this.doc.getLength()) { console.error("doc.getLength() and $wrapData.length have to be the same!"); } this.$updating = false; if (useWrapMode) this.$updateWrapData(firstRow, lastRow); else this.$updateRowLengthCache(firstRow, lastRow); return removedFolds; }; this.$updateRowLengthCache = function(firstRow, lastRow, b) { this.$rowLengthCache[firstRow] = null; this.$rowLengthCache[lastRow] = null; }; this.$updateWrapData = function(firstRow, lastRow) { var lines = this.doc.getAllLines(); var tabSize = this.getTabSize(); var wrapData = this.$wrapData; var wrapLimit = this.$wrapLimit; var tokens; var foldLine; var row = firstRow; lastRow = Math.min(lastRow, lines.length - 1); while (row <= lastRow) { foldLine = this.getFoldLine(row, foldLine); if (!foldLine) { tokens = this.$getDisplayTokens(lines[row]); wrapData[row] = this.$computeWrapSplits(tokens, wrapLimit, tabSize); row ++; } else { tokens = []; foldLine.walk(function(placeholder, row, column, lastColumn) { var walkTokens; if (placeholder != null) { walkTokens = this.$getDisplayTokens( placeholder, tokens.length); walkTokens[0] = PLACEHOLDER_START; for (var i = 1; i < walkTokens.length; i++) { walkTokens[i] = PLACEHOLDER_BODY; } } else { walkTokens = this.$getDisplayTokens( lines[row].substring(lastColumn, column), tokens.length); } tokens = tokens.concat(walkTokens); }.bind(this), foldLine.end.row, lines[foldLine.end.row].length + 1 ); wrapData[foldLine.start.row] = this.$computeWrapSplits(tokens, wrapLimit, tabSize); row = foldLine.end.row + 1; } } }; var CHAR = 1, CHAR_EXT = 2, PLACEHOLDER_START = 3, PLACEHOLDER_BODY = 4, PUNCTUATION = 9, SPACE = 10, TAB = 11, TAB_SPACE = 12; this.$computeWrapSplits = function(tokens, wrapLimit) { if (tokens.length == 0) { return []; } var splits = []; var displayLength = tokens.length; var lastSplit = 0, lastDocSplit = 0; var isCode = this.$wrapAsCode; function addSplit(screenPos) { var displayed = tokens.slice(lastSplit, screenPos); var len = displayed.length; displayed.join(""). replace(/12/g, function() { len -= 1; }). replace(/2/g, function() { len -= 1; }); lastDocSplit += len; splits.push(lastDocSplit); lastSplit = screenPos; } while (displayLength - lastSplit > wrapLimit) { var split = lastSplit + wrapLimit; if (tokens[split - 1] >= SPACE && tokens[split] >= SPACE) { addSplit(split); continue; } if (tokens[split] == PLACEHOLDER_START || tokens[split] == PLACEHOLDER_BODY) { for (split; split != lastSplit - 1; split--) { if (tokens[split] == PLACEHOLDER_START) { break; } } if (split > lastSplit) { addSplit(split); continue; } split = lastSplit + wrapLimit; for (split; split < tokens.length; split++) { if (tokens[split] != PLACEHOLDER_BODY) { break; } } if (split == tokens.length) { break; // Breaks the while-loop. } addSplit(split); continue; } var minSplit = Math.max(split - (isCode ? 10 : wrapLimit-(wrapLimit>>2)), lastSplit - 1); while (split > minSplit && tokens[split] < PLACEHOLDER_START) { split --; } if (isCode) { while (split > minSplit && tokens[split] < PLACEHOLDER_START) { split --; } while (split > minSplit && tokens[split] == PUNCTUATION) { split --; } } else { while (split > minSplit && tokens[split] < SPACE) { split --; } } if (split > minSplit) { addSplit(++split); continue; } split = lastSplit + wrapLimit; addSplit(split); } return splits; }; this.$getDisplayTokens = function(str, offset) { var arr = []; var tabSize; offset = offset || 0; for (var i = 0; i < str.length; i++) { var c = str.charCodeAt(i); if (c == 9) { tabSize = this.getScreenTabSize(arr.length + offset); arr.push(TAB); for (var n = 1; n < tabSize; n++) { arr.push(TAB_SPACE); } } else if (c == 32) { arr.push(SPACE); } else if((c > 39 && c < 48) || (c > 57 && c < 64)) { arr.push(PUNCTUATION); } else if (c >= 0x1100 && isFullWidth(c)) { arr.push(CHAR, CHAR_EXT); } else { arr.push(CHAR); } } return arr; }; this.$getStringScreenWidth = function(str, maxScreenColumn, screenColumn) { if (maxScreenColumn == 0) return [0, 0]; if (maxScreenColumn == null) maxScreenColumn = Infinity; screenColumn = screenColumn || 0; var c, column; for (column = 0; column < str.length; column++) { c = str.charCodeAt(column); if (c == 9) { screenColumn += this.getScreenTabSize(screenColumn); } else if (c >= 0x1100 && isFullWidth(c)) { screenColumn += 2; } else { screenColumn += 1; } if (screenColumn > maxScreenColumn) { break; } } return [screenColumn, column]; }; this.getRowLength = function(row) { if (!this.$useWrapMode || !this.$wrapData[row]) { return 1; } else { return this.$wrapData[row].length + 1; } }; this.getScreenLastRowColumn = function(screenRow) { var pos = this.screenToDocumentPosition(screenRow, Number.MAX_VALUE); return this.documentToScreenColumn(pos.row, pos.column); }; this.getDocumentLastRowColumn = function(docRow, docColumn) { var screenRow = this.documentToScreenRow(docRow, docColumn); return this.getScreenLastRowColumn(screenRow); }; this.getDocumentLastRowColumnPosition = function(docRow, docColumn) { var screenRow = this.documentToScreenRow(docRow, docColumn); return this.screenToDocumentPosition(screenRow, Number.MAX_VALUE / 10); }; this.getRowSplitData = function(row) { if (!this.$useWrapMode) { return undefined; } else { return this.$wrapData[row]; } }; this.getScreenTabSize = function(screenColumn) { return this.$tabSize - screenColumn % this.$tabSize; }; this.screenToDocumentRow = function(screenRow, screenColumn) { return this.screenToDocumentPosition(screenRow, screenColumn).row; }; this.screenToDocumentColumn = function(screenRow, screenColumn) { return this.screenToDocumentPosition(screenRow, screenColumn).column; }; this.screenToDocumentPosition = function(screenRow, screenColumn) { if (screenRow < 0) return {row: 0, column: 0}; var line; var docRow = 0; var docColumn = 0; var column; var row = 0; var rowLength = 0; var rowCache = this.$screenRowCache; var i = this.$getRowCacheIndex(rowCache, screenRow); var l = rowCache.length; if (l && i >= 0) { var row = rowCache[i]; var docRow = this.$docRowCache[i]; var doCache = screenRow > rowCache[l - 1]; } else { var doCache = !l; } var maxRow = this.getLength() - 1; var foldLine = this.getNextFoldLine(docRow); var foldStart = foldLine ? foldLine.start.row : Infinity; while (row <= screenRow) { rowLength = this.getRowLength(docRow); if (row + rowLength - 1 >= screenRow || docRow >= maxRow) { break; } else { row += rowLength; docRow++; if (docRow > foldStart) { docRow = foldLine.end.row+1; foldLine = this.getNextFoldLine(docRow, foldLine); foldStart = foldLine ? foldLine.start.row : Infinity; } } if (doCache) { this.$docRowCache.push(docRow); this.$screenRowCache.push(row); } } if (foldLine && foldLine.start.row <= docRow) { line = this.getFoldDisplayLine(foldLine); docRow = foldLine.start.row; } else if (row + rowLength <= screenRow || docRow > maxRow) { return { row: maxRow, column: this.getLine(maxRow).length } } else { line = this.getLine(docRow); foldLine = null; } if (this.$useWrapMode) { var splits = this.$wrapData[docRow]; if (splits) { column = splits[screenRow - row]; if(screenRow > row && splits.length) { docColumn = splits[screenRow - row - 1] || splits[splits.length - 1]; line = line.substring(docColumn); } } } docColumn += this.$getStringScreenWidth(line, screenColumn)[1]; if (this.$useWrapMode && docColumn >= column) docColumn = column - 1; if (foldLine) return foldLine.idxToPosition(docColumn); return {row: docRow, column: docColumn}; }; this.documentToScreenPosition = function(docRow, docColumn) { if (typeof docColumn === "undefined") var pos = this.$clipPositionToDocument(docRow.row, docRow.column); else pos = this.$clipPositionToDocument(docRow, docColumn); docRow = pos.row; docColumn = pos.column; var screenRow = 0; var foldStartRow = null; var fold = null; fold = this.getFoldAt(docRow, docColumn, 1); if (fold) { docRow = fold.start.row; docColumn = fold.start.column; } var rowEnd, row = 0; var rowCache = this.$docRowCache; var i = this.$getRowCacheIndex(rowCache, docRow); var l = rowCache.length; if (l && i >= 0) { var row = rowCache[i]; var screenRow = this.$screenRowCache[i]; var doCache = docRow > rowCache[l - 1]; } else { var doCache = !l; } var foldLine = this.getNextFoldLine(row); var foldStart = foldLine ?foldLine.start.row :Infinity; while (row < docRow) { if (row >= foldStart) { rowEnd = foldLine.end.row + 1; if (rowEnd > docRow) break; foldLine = this.getNextFoldLine(rowEnd, foldLine); foldStart = foldLine ?foldLine.start.row :Infinity; } else { rowEnd = row + 1; } screenRow += this.getRowLength(row); row = rowEnd; if (doCache) { this.$docRowCache.push(row); this.$screenRowCache.push(screenRow); } } var textLine = ""; if (foldLine && row >= foldStart) { textLine = this.getFoldDisplayLine(foldLine, docRow, docColumn); foldStartRow = foldLine.start.row; } else { textLine = this.getLine(docRow).substring(0, docColumn); foldStartRow = docRow; } if (this.$useWrapMode) { var wrapRow = this.$wrapData[foldStartRow]; var screenRowOffset = 0; while (textLine.length >= wrapRow[screenRowOffset]) { screenRow ++; screenRowOffset++; } textLine = textLine.substring( wrapRow[screenRowOffset - 1] || 0, textLine.length ); } return { row: screenRow, column: this.$getStringScreenWidth(textLine)[0] }; }; this.documentToScreenColumn = function(row, docColumn) { return this.documentToScreenPosition(row, docColumn).column; }; this.documentToScreenRow = function(docRow, docColumn) { return this.documentToScreenPosition(docRow, docColumn).row; }; this.getScreenLength = function() { var screenRows = 0; var fold = null; if (!this.$useWrapMode) { screenRows = this.getLength(); var foldData = this.$foldData; for (var i = 0; i < foldData.length; i++) { fold = foldData[i]; screenRows -= fold.end.row - fold.start.row; } } else { var lastRow = this.$wrapData.length; var row = 0, i = 0; var fold = this.$foldData[i++]; var foldStart = fold ? fold.start.row :Infinity; while (row < lastRow) { screenRows += this.$wrapData[row].length + 1; row ++; if (row > foldStart) { row = fold.end.row+1; fold = this.$foldData[i++]; foldStart = fold ?fold.start.row :Infinity; } } } return screenRows; }; function isFullWidth(c) { if (c < 0x1100) return false; return c >= 0x1100 && c <= 0x115F || c >= 0x11A3 && c <= 0x11A7 || c >= 0x11FA && c <= 0x11FF || c >= 0x2329 && c <= 0x232A || c >= 0x2E80 && c <= 0x2E99 || c >= 0x2E9B && c <= 0x2EF3 || c >= 0x2F00 && c <= 0x2FD5 || c >= 0x2FF0 && c <= 0x2FFB || c >= 0x3000 && c <= 0x303E || c >= 0x3041 && c <= 0x3096 || c >= 0x3099 && c <= 0x30FF || c >= 0x3105 && c <= 0x312D || c >= 0x3131 && c <= 0x318E || c >= 0x3190 && c <= 0x31BA || c >= 0x31C0 && c <= 0x31E3 || c >= 0x31F0 && c <= 0x321E || c >= 0x3220 && c <= 0x3247 || c >= 0x3250 && c <= 0x32FE || c >= 0x3300 && c <= 0x4DBF || c >= 0x4E00 && c <= 0xA48C || c >= 0xA490 && c <= 0xA4C6 || c >= 0xA960 && c <= 0xA97C || c >= 0xAC00 && c <= 0xD7A3 || c >= 0xD7B0 && c <= 0xD7C6 || c >= 0xD7CB && c <= 0xD7FB || c >= 0xF900 && c <= 0xFAFF || c >= 0xFE10 && c <= 0xFE19 || c >= 0xFE30 && c <= 0xFE52 || c >= 0xFE54 && c <= 0xFE66 || c >= 0xFE68 && c <= 0xFE6B || c >= 0xFF01 && c <= 0xFF60 || c >= 0xFFE0 && c <= 0xFFE6; }; }).call(EditSession.prototype); require("./edit_session/folding").Folding.call(EditSession.prototype); require("./edit_session/bracket_match").BracketMatch.call(EditSession.prototype); config.defineOptions(EditSession.prototype, "session", { wrap: { set: function(value) { if (!value || value == "off") value = false; else if (value == "free") value = true; else if (value == "printMargin") value = -1; else if (typeof value == "string") value = parseInt(value, 10) || false; if (this.$wrap == value) return; if (!value) { this.setUseWrapMode(false); } else { var col = typeof value == "number" ? value : null; this.setWrapLimitRange(col, col); this.setUseWrapMode(true); } this.$wrap = value; }, get: function() { return this.getUseWrapMode() ? this.getWrapLimitRange().min || "free" : "off"; }, handlesSet: true }, wrapMethod: { set: function(val) { if (val == "auto") this.$wrapAsCode = this.$mode.type != "text"; else this.$wrapAsCode = val != "text"; }, initialValue: "auto" }, firstLineNumber: { set: function() {this._emit("changeBreakpoint");}, initialValue: 1 }, useWorker: { set: function(useWorker) { this.$useWorker = useWorker; this.$stopWorker(); if (useWorker) this.$startWorker(); }, initialValue: true }, useSoftTabs: {initialValue: true}, tabSize: { set: function(tabSize) { if (isNaN(tabSize) || this.$tabSize === tabSize) return; this.$modified = true; this.$rowLengthCache = []; this.$tabSize = tabSize; this._emit("changeTabSize"); }, initialValue: 4, handlesSet: true }, overwrite: { set: function(val) {this._emit("changeOverwrite");}, initialValue: false }, newLineMode: { set: function(val) {this.doc.setNewLineMode(val)}, get: function() {return this.doc.getNewLineMode()}, handlesSet: true } }); exports.EditSession = EditSession; }); define('ace/selection', ['require', 'exports', 'module' , 'ace/lib/oop', 'ace/lib/lang', 'ace/lib/event_emitter', 'ace/range'], function(require, exports, module) { var oop = require("./lib/oop"); var lang = require("./lib/lang"); var EventEmitter = require("./lib/event_emitter").EventEmitter; var Range = require("./range").Range; var Selection = function(session) { this.session = session; this.doc = session.getDocument(); this.clearSelection(); this.lead = this.selectionLead = this.doc.createAnchor(0, 0); this.anchor = this.selectionAnchor = this.doc.createAnchor(0, 0); var self = this; this.lead.on("change", function(e) { self._emit("changeCursor"); if (!self.$isEmpty) self._emit("changeSelection"); if (!self.$keepDesiredColumnOnChange && e.old.column != e.value.column) self.$desiredColumn = null; }); this.selectionAnchor.on("change", function() { if (!self.$isEmpty) self._emit("changeSelection"); }); }; (function() { oop.implement(this, EventEmitter); this.isEmpty = function() { return (this.$isEmpty || ( this.anchor.row == this.lead.row && this.anchor.column == this.lead.column )); }; this.isMultiLine = function() { if (this.isEmpty()) { return false; } return this.getRange().isMultiLine(); }; this.getCursor = function() { return this.lead.getPosition(); }; this.setSelectionAnchor = function(row, column) { this.anchor.setPosition(row, column); if (this.$isEmpty) { this.$isEmpty = false; this._emit("changeSelection"); } }; this.getSelectionAnchor = function() { if (this.$isEmpty) return this.getSelectionLead() else return this.anchor.getPosition(); }; this.getSelectionLead = function() { return this.lead.getPosition(); }; this.shiftSelection = function(columns) { if (this.$isEmpty) { this.moveCursorTo(this.lead.row, this.lead.column + columns); return; }; var anchor = this.getSelectionAnchor(); var lead = this.getSelectionLead(); var isBackwards = this.isBackwards(); if (!isBackwards || anchor.column !== 0) this.setSelectionAnchor(anchor.row, anchor.column + columns); if (isBackwards || lead.column !== 0) { this.$moveSelection(function() { this.moveCursorTo(lead.row, lead.column + columns); }); } }; this.isBackwards = function() { var anchor = this.anchor; var lead = this.lead; return (anchor.row > lead.row || (anchor.row == lead.row && anchor.column > lead.column)); }; this.getRange = function() { var anchor = this.anchor; var lead = this.lead; if (this.isEmpty()) return Range.fromPoints(lead, lead); if (this.isBackwards()) { return Range.fromPoints(lead, anchor); } else { return Range.fromPoints(anchor, lead); } }; this.clearSelection = function() { if (!this.$isEmpty) { this.$isEmpty = true; this._emit("changeSelection"); } }; this.selectAll = function() { var lastRow = this.doc.getLength() - 1; this.setSelectionAnchor(0, 0); this.moveCursorTo(lastRow, this.doc.getLine(lastRow).length); }; this.setRange = this.setSelectionRange = function(range, reverse) { if (reverse) { this.setSelectionAnchor(range.end.row, range.end.column); this.selectTo(range.start.row, range.start.column); } else { this.setSelectionAnchor(range.start.row, range.start.column); this.selectTo(range.end.row, range.end.column); } if (this.getRange().isEmpty()) this.$isEmpty = true; this.$desiredColumn = null; }; this.$moveSelection = function(mover) { var lead = this.lead; if (this.$isEmpty) this.setSelectionAnchor(lead.row, lead.column); mover.call(this); }; this.selectTo = function(row, column) { this.$moveSelection(function() { this.moveCursorTo(row, column); }); }; this.selectToPosition = function(pos) { this.$moveSelection(function() { this.moveCursorToPosition(pos); }); }; this.selectUp = function() { this.$moveSelection(this.moveCursorUp); }; this.selectDown = function() { this.$moveSelection(this.moveCursorDown); }; this.selectRight = function() { this.$moveSelection(this.moveCursorRight); }; this.selectLeft = function() { this.$moveSelection(this.moveCursorLeft); }; this.selectLineStart = function() { this.$moveSelection(this.moveCursorLineStart); }; this.selectLineEnd = function() { this.$moveSelection(this.moveCursorLineEnd); }; this.selectFileEnd = function() { this.$moveSelection(this.moveCursorFileEnd); }; this.selectFileStart = function() { this.$moveSelection(this.moveCursorFileStart); }; this.selectWordRight = function() { this.$moveSelection(this.moveCursorWordRight); }; this.selectWordLeft = function() { this.$moveSelection(this.moveCursorWordLeft); }; this.getWordRange = function(row, column) { if (typeof column == "undefined") { var cursor = row || this.lead; row = cursor.row; column = cursor.column; } return this.session.getWordRange(row, column); }; this.selectWord = function() { this.setSelectionRange(this.getWordRange()); }; this.selectAWord = function() { var cursor = this.getCursor(); var range = this.session.getAWordRange(cursor.row, cursor.column); this.setSelectionRange(range); }; this.getLineRange = function(row, excludeLastChar) { var rowStart = typeof row == "number" ? row : this.lead.row; var rowEnd; var foldLine = this.session.getFoldLine(rowStart); if (foldLine) { rowStart = foldLine.start.row; rowEnd = foldLine.end.row; } else { rowEnd = rowStart; } if (excludeLastChar === true) return new Range(rowStart, 0, rowEnd, this.session.getLine(rowEnd).length); else return new Range(rowStart, 0, rowEnd + 1, 0); }; this.selectLine = function() { this.setSelectionRange(this.getLineRange()); }; this.moveCursorUp = function() { this.moveCursorBy(-1, 0); }; this.moveCursorDown = function() { this.moveCursorBy(1, 0); }; this.moveCursorLeft = function() { var cursor = this.lead.getPosition(), fold; if (fold = this.session.getFoldAt(cursor.row, cursor.column, -1)) { this.moveCursorTo(fold.start.row, fold.start.column); } else if (cursor.column == 0) { if (cursor.row > 0) { this.moveCursorTo(cursor.row - 1, this.doc.getLine(cursor.row - 1).length); } } else { var tabSize = this.session.getTabSize(); if (this.session.isTabStop(cursor) && this.doc.getLine(cursor.row).slice(cursor.column-tabSize, cursor.column).split(" ").length-1 == tabSize) this.moveCursorBy(0, -tabSize); else this.moveCursorBy(0, -1); } }; this.moveCursorRight = function() { var cursor = this.lead.getPosition(), fold; if (fold = this.session.getFoldAt(cursor.row, cursor.column, 1)) { this.moveCursorTo(fold.end.row, fold.end.column); } else if (this.lead.column == this.doc.getLine(this.lead.row).length) { if (this.lead.row < this.doc.getLength() - 1) { this.moveCursorTo(this.lead.row + 1, 0); } } else { var tabSize = this.session.getTabSize(); var cursor = this.lead; if (this.session.isTabStop(cursor) && this.doc.getLine(cursor.row).slice(cursor.column, cursor.column+tabSize).split(" ").length-1 == tabSize) this.moveCursorBy(0, tabSize); else this.moveCursorBy(0, 1); } }; this.moveCursorLineStart = function() { var row = this.lead.row; var column = this.lead.column; var screenRow = this.session.documentToScreenRow(row, column); var firstColumnPosition = this.session.screenToDocumentPosition(screenRow, 0); var beforeCursor = this.session.getDisplayLine( row, null, firstColumnPosition.row, firstColumnPosition.column ); var leadingSpace = beforeCursor.match(/^\s*/); if (leadingSpace[0].length != column && !this.session.$useEmacsStyleLineStart) firstColumnPosition.column += leadingSpace[0].length; this.moveCursorToPosition(firstColumnPosition); }; this.moveCursorLineEnd = function() { var lead = this.lead; var lineEnd = this.session.getDocumentLastRowColumnPosition(lead.row, lead.column); if (this.lead.column == lineEnd.column) { var line = this.session.getLine(lineEnd.row); if (lineEnd.column == line.length) { var textEnd = line.search(/\s+$/); if (textEnd > 0) lineEnd.column = textEnd; } } this.moveCursorTo(lineEnd.row, lineEnd.column); }; this.moveCursorFileEnd = function() { var row = this.doc.getLength() - 1; var column = this.doc.getLine(row).length; this.moveCursorTo(row, column); }; this.moveCursorFileStart = function() { this.moveCursorTo(0, 0); }; this.moveCursorLongWordRight = function() { var row = this.lead.row; var column = this.lead.column; var line = this.doc.getLine(row); var rightOfCursor = line.substring(column); var match; this.session.nonTokenRe.lastIndex = 0; this.session.tokenRe.lastIndex = 0; var fold = this.session.getFoldAt(row, column, 1); if (fold) { this.moveCursorTo(fold.end.row, fold.end.column); return; } if (match = this.session.nonTokenRe.exec(rightOfCursor)) { column += this.session.nonTokenRe.lastIndex; this.session.nonTokenRe.lastIndex = 0; rightOfCursor = line.substring(column); } if (column >= line.length) { this.moveCursorTo(row, line.length); this.moveCursorRight(); if (row < this.doc.getLength() - 1) this.moveCursorWordRight(); return; } if (match = this.session.tokenRe.exec(rightOfCursor)) { column += this.session.tokenRe.lastIndex; this.session.tokenRe.lastIndex = 0; } this.moveCursorTo(row, column); }; this.moveCursorLongWordLeft = function() { var row = this.lead.row; var column = this.lead.column; var fold; if (fold = this.session.getFoldAt(row, column, -1)) { this.moveCursorTo(fold.start.row, fold.start.column); return; } var str = this.session.getFoldStringAt(row, column, -1); if (str == null) { str = this.doc.getLine(row).substring(0, column) } var leftOfCursor = lang.stringReverse(str); var match; this.session.nonTokenRe.lastIndex = 0; this.session.tokenRe.lastIndex = 0; if (match = this.session.nonTokenRe.exec(leftOfCursor)) { column -= this.session.nonTokenRe.lastIndex; leftOfCursor = leftOfCursor.slice(this.session.nonTokenRe.lastIndex); this.session.nonTokenRe.lastIndex = 0; } if (column <= 0) { this.moveCursorTo(row, 0); this.moveCursorLeft(); if (row > 0) this.moveCursorWordLeft(); return; } if (match = this.session.tokenRe.exec(leftOfCursor)) { column -= this.session.tokenRe.lastIndex; this.session.tokenRe.lastIndex = 0; } this.moveCursorTo(row, column); }; this.$shortWordEndIndex = function(rightOfCursor) { var match, index = 0, ch; var whitespaceRe = /\s/; var tokenRe = this.session.tokenRe; tokenRe.lastIndex = 0; if (match = this.session.tokenRe.exec(rightOfCursor)) { index = this.session.tokenRe.lastIndex; } else { while ((ch = rightOfCursor[index]) && whitespaceRe.test(ch)) index ++; if (index < 1) { tokenRe.lastIndex = 0; while ((ch = rightOfCursor[index]) && !tokenRe.test(ch)) { tokenRe.lastIndex = 0; index ++; if (whitespaceRe.test(ch)) { if (index > 2) { index-- break; } else { while ((ch = rightOfCursor[index]) && whitespaceRe.test(ch)) index ++; if (index > 2) break } } } } } tokenRe.lastIndex = 0; return index; }; this.moveCursorShortWordRight = function() { var row = this.lead.row; var column = this.lead.column; var line = this.doc.getLine(row); var rightOfCursor = line.substring(column); var fold = this.session.getFoldAt(row, column, 1); if (fold) return this.moveCursorTo(fold.end.row, fold.end.column); if (column == line.length) { var l = this.doc.getLength(); do { row++; rightOfCursor = this.doc.getLine(row) } while (row < l && /^\s*$/.test(rightOfCursor)) if (!/^\s+/.test(rightOfCursor)) rightOfCursor = "" column = 0; } var index = this.$shortWordEndIndex(rightOfCursor); this.moveCursorTo(row, column + index); }; this.moveCursorShortWordLeft = function() { var row = this.lead.row; var column = this.lead.column; var fold; if (fold = this.session.getFoldAt(row, column, -1)) return this.moveCursorTo(fold.start.row, fold.start.column); var line = this.session.getLine(row).substring(0, column); if (column == 0) { do { row--; line = this.doc.getLine(row); } while (row > 0 && /^\s*$/.test(line)) column = line.length; if (!/\s+$/.test(line)) line = "" } var leftOfCursor = lang.stringReverse(line); var index = this.$shortWordEndIndex(leftOfCursor); return this.moveCursorTo(row, column - index); }; this.moveCursorWordRight = function() { if (this.session.$selectLongWords) this.moveCursorLongWordRight(); else this.moveCursorShortWordRight(); }; this.moveCursorWordLeft = function() { if (this.session.$selectLongWords) this.moveCursorLongWordLeft(); else this.moveCursorShortWordLeft(); }; this.moveCursorBy = function(rows, chars) { var screenPos = this.session.documentToScreenPosition( this.lead.row, this.lead.column ); if (chars === 0) { if (this.$desiredColumn) screenPos.column = this.$desiredColumn; else this.$desiredColumn = screenPos.column; } var docPos = this.session.screenToDocumentPosition(screenPos.row + rows, screenPos.column); this.moveCursorTo(docPos.row, docPos.column + chars, chars === 0); }; this.moveCursorToPosition = function(position) { this.moveCursorTo(position.row, position.column); }; this.moveCursorTo = function(row, column, keepDesiredColumn) { var fold = this.session.getFoldAt(row, column, 1); if (fold) { row = fold.start.row; column = fold.start.column; } this.$keepDesiredColumnOnChange = true; this.lead.setPosition(row, column); this.$keepDesiredColumnOnChange = false; if (!keepDesiredColumn) this.$desiredColumn = null; }; this.moveCursorToScreen = function(row, column, keepDesiredColumn) { var pos = this.session.screenToDocumentPosition(row, column); this.moveCursorTo(pos.row, pos.column, keepDesiredColumn); }; this.detach = function() { this.lead.detach(); this.anchor.detach(); this.session = this.doc = null; } this.fromOrientedRange = function(range) { this.setSelectionRange(range, range.cursor == range.start); this.$desiredColumn = range.desiredColumn || this.$desiredColumn; } this.toOrientedRange = function(range) { var r = this.getRange(); if (range) { range.start.column = r.start.column; range.start.row = r.start.row; range.end.column = r.end.column; range.end.row = r.end.row; } else { range = r; } range.cursor = this.isBackwards() ? range.start : range.end; range.desiredColumn = this.$desiredColumn; return range; } this.toJSON = function() { if (this.rangeCount) { var data = this.ranges.map(function(r) { var r1 = r.clone(); r1.isBackwards = r.cursor == r.start; return r1; }); } else { var data = this.getRange(); data.isBackwards = this.isBackwards(); } return data; }; this.fromJSON = function(data) { if (data.start == undefined) { if (this.rangeList) { this.toSingleRange(data[0]); for (var i = data.length; i--; ) { var r = Range.fromPoints(data[i].start, data[i].end); if (data.isBackwards) r.cursor = r.start; this.addRange(r, true); } return; } else data = data[0]; } if (this.rangeList) this.toSingleRange(data); this.setSelectionRange(data, data.isBackwards); }; this.isEqual = function(data) { if ((data.length || this.rangeCount) && data.length != this.rangeCount) return false; if (!data.length || !this.ranges) return this.getRange().isEqual(data); for (var i = this.ranges.length; i--; ) { if (!this.ranges[i].isEqual(data[i])) return false } return true; } }).call(Selection.prototype); exports.Selection = Selection; }); define('ace/range', ['require', 'exports', 'module' ], function(require, exports, module) { var comparePoints = function(p1, p2) { return p1.row - p2.row || p1.column - p2.column; }; var Range = function(startRow, startColumn, endRow, endColumn) { this.start = { row: startRow, column: startColumn }; this.end = { row: endRow, column: endColumn }; }; (function() { this.isEqual = function(range) { return this.start.row === range.start.row && this.end.row === range.end.row && this.start.column === range.start.column && this.end.column === range.end.column; }; this.toString = function() { return ("Range: [" + this.start.row + "/" + this.start.column + "] -> [" + this.end.row + "/" + this.end.column + "]"); }; this.contains = function(row, column) { return this.compare(row, column) == 0; }; this.compareRange = function(range) { var cmp, end = range.end, start = range.start; cmp = this.compare(end.row, end.column); if (cmp == 1) { cmp = this.compare(start.row, start.column); if (cmp == 1) { return 2; } else if (cmp == 0) { return 1; } else { return 0; } } else if (cmp == -1) { return -2; } else { cmp = this.compare(start.row, start.column); if (cmp == -1) { return -1; } else if (cmp == 1) { return 42; } else { return 0; } } }; this.comparePoint = function(p) { return this.compare(p.row, p.column); }; this.containsRange = function(range) { return this.comparePoint(range.start) == 0 && this.comparePoint(range.end) == 0; }; this.intersects = function(range) { var cmp = this.compareRange(range); return (cmp == -1 || cmp == 0 || cmp == 1); }; this.isEnd = function(row, column) { return this.end.row == row && this.end.column == column; }; this.isStart = function(row, column) { return this.start.row == row && this.start.column == column; }; this.setStart = function(row, column) { if (typeof row == "object") { this.start.column = row.column; this.start.row = row.row; } else { this.start.row = row; this.start.column = column; } }; this.setEnd = function(row, column) { if (typeof row == "object") { this.end.column = row.column; this.end.row = row.row; } else { this.end.row = row; this.end.column = column; } }; this.inside = function(row, column) { if (this.compare(row, column) == 0) { if (this.isEnd(row, column) || this.isStart(row, column)) { return false; } else { return true; } } return false; }; this.insideStart = function(row, column) { if (this.compare(row, column) == 0) { if (this.isEnd(row, column)) { return false; } else { return true; } } return false; }; this.insideEnd = function(row, column) { if (this.compare(row, column) == 0) { if (this.isStart(row, column)) { return false; } else { return true; } } return false; }; this.compare = function(row, column) { if (!this.isMultiLine()) { if (row === this.start.row) { return column < this.start.column ? -1 : (column > this.end.column ? 1 : 0); }; } if (row < this.start.row) return -1; if (row > this.end.row) return 1; if (this.start.row === row) return column >= this.start.column ? 0 : -1; if (this.end.row === row) return column <= this.end.column ? 0 : 1; return 0; }; this.compareStart = function(row, column) { if (this.start.row == row && this.start.column == column) { return -1; } else { return this.compare(row, column); } }; this.compareEnd = function(row, column) { if (this.end.row == row && this.end.column == column) { return 1; } else { return this.compare(row, column); } }; this.compareInside = function(row, column) { if (this.end.row == row && this.end.column == column) { return 1; } else if (this.start.row == row && this.start.column == column) { return -1; } else { return this.compare(row, column); } }; this.clipRows = function(firstRow, lastRow) { if (this.end.row > lastRow) var end = {row: lastRow + 1, column: 0}; else if (this.end.row < firstRow) var end = {row: firstRow, column: 0}; if (this.start.row > lastRow) var start = {row: lastRow + 1, column: 0}; else if (this.start.row < firstRow) var start = {row: firstRow, column: 0}; return Range.fromPoints(start || this.start, end || this.end); }; this.extend = function(row, column) { var cmp = this.compare(row, column); if (cmp == 0) return this; else if (cmp == -1) var start = {row: row, column: column}; else var end = {row: row, column: column}; return Range.fromPoints(start || this.start, end || this.end); }; this.isEmpty = function() { return (this.start.row === this.end.row && this.start.column === this.end.column); }; this.isMultiLine = function() { return (this.start.row !== this.end.row); }; this.clone = function() { return Range.fromPoints(this.start, this.end); }; this.collapseRows = function() { if (this.end.column == 0) return new Range(this.start.row, 0, Math.max(this.start.row, this.end.row-1), 0) else return new Range(this.start.row, 0, this.end.row, 0) }; this.toScreenRange = function(session) { var screenPosStart = session.documentToScreenPosition(this.start); var screenPosEnd = session.documentToScreenPosition(this.end); return new Range( screenPosStart.row, screenPosStart.column, screenPosEnd.row, screenPosEnd.column ); }; this.moveBy = function(row, column) { this.start.row += row; this.start.column += column; this.end.row += row; this.end.column += column; }; }).call(Range.prototype); Range.fromPoints = function(start, end) { return new Range(start.row, start.column, end.row, end.column); }; Range.comparePoints = comparePoints; Range.comparePoints = function(p1, p2) { return p1.row - p2.row || p1.column - p2.column; }; exports.Range = Range; }); define('ace/mode/text', ['require', 'exports', 'module' , 'ace/tokenizer', 'ace/mode/text_highlight_rules', 'ace/mode/behaviour', 'ace/unicode', 'ace/lib/lang', 'ace/token_iterator', 'ace/range'], function(require, exports, module) { var Tokenizer = require("../tokenizer").Tokenizer; var TextHighlightRules = require("./text_highlight_rules").TextHighlightRules; var Behaviour = require("./behaviour").Behaviour; var unicode = require("../unicode"); var lang = require("../lib/lang"); var TokenIterator = require("../token_iterator").TokenIterator; var Range = require("../range").Range; var Mode = function() { this.HighlightRules = TextHighlightRules; this.$behaviour = new Behaviour(); }; (function() { this.tokenRe = new RegExp("^[" + unicode.packages.L + unicode.packages.Mn + unicode.packages.Mc + unicode.packages.Nd + unicode.packages.Pc + "\\$_]+", "g" ); this.nonTokenRe = new RegExp("^(?:[^" + unicode.packages.L + unicode.packages.Mn + unicode.packages.Mc + unicode.packages.Nd + unicode.packages.Pc + "\\$_]|\s])+", "g" ); this.getTokenizer = function() { if (!this.$tokenizer) { this.$highlightRules = new this.HighlightRules(); this.$tokenizer = new Tokenizer(this.$highlightRules.getRules()); } return this.$tokenizer; }; this.lineCommentStart = ""; this.blockComment = ""; this.toggleCommentLines = function(state, session, startRow, endRow) { var doc = session.doc; var ignoreBlankLines = true; var shouldRemove = true; var minIndent = Infinity; var tabSize = session.getTabSize(); var insertAtTabStop = false; if (!this.lineCommentStart) { if (!this.blockComment) return false; var lineCommentStart = this.blockComment.start; var lineCommentEnd = this.blockComment.end; var regexpStart = new RegExp("^(\\s*)(?:" + lang.escapeRegExp(lineCommentStart) + ")"); var regexpEnd = new RegExp("(?:" + lang.escapeRegExp(lineCommentEnd) + ")\\s*$"); var comment = function(line, i) { if (testRemove(line, i)) return; if (!ignoreBlankLines || /\S/.test(line)) { doc.insertInLine({row: i, column: line.length}, lineCommentEnd); doc.insertInLine({row: i, column: minIndent}, lineCommentStart); } }; var uncomment = function(line, i) { var m; if (m = line.match(regexpEnd)) doc.removeInLine(i, line.length - m[0].length, line.length); if (m = line.match(regexpStart)) doc.removeInLine(i, m[1].length, m[0].length); }; var testRemove = function(line, row) { if (regexpStart.test(line)) return true; var tokens = session.getTokens(row); for (var i = 0; i < tokens.length; i++) { if (tokens[i].type === 'comment') return true; } }; } else { if (Array.isArray(this.lineCommentStart)) { var regexpStart = this.lineCommentStart.map(lang.escapeRegExp).join("|"); var lineCommentStart = this.lineCommentStart[0]; } else { var regexpStart = lang.escapeRegExp(this.lineCommentStart); var lineCommentStart = this.lineCommentStart; } regexpStart = new RegExp("^(\\s*)(?:" + regexpStart + ") ?"); insertAtTabStop = session.getUseSoftTabs(); var uncomment = function(line, i) { var m = line.match(regexpStart); if (!m) return; var start = m[1].length, end = m[0].length; if (!shouldInsertSpace(line, start, end) && m[0][end - 1] == " ") end--; doc.removeInLine(i, start, end); }; var commentWithSpace = lineCommentStart + " "; var comment = function(line, i) { if (!ignoreBlankLines || /\S/.test(line)) { if (shouldInsertSpace(line, minIndent, minIndent)) doc.insertInLine({row: i, column: minIndent}, commentWithSpace); else doc.insertInLine({row: i, column: minIndent}, lineCommentStart); } }; var testRemove = function(line, i) { return regexpStart.test(line); }; var shouldInsertSpace = function(line, before, after) { var spaces = 0; while (before-- && line.charAt(before) == " ") spaces++; if (spaces % tabSize != 0) return false; var spaces = 0; while (line.charAt(after++) == " ") spaces++; if (tabSize > 2) return spaces % tabSize != tabSize - 1; else return spaces % tabSize == 0; return true; }; } function iter(fun) { for (var i = startRow; i <= endRow; i++) fun(doc.getLine(i), i); } var minEmptyLength = Infinity; iter(function(line, i) { var indent = line.search(/\S/); if (indent !== -1) { if (indent < minIndent) minIndent = indent; if (shouldRemove && !testRemove(line, i)) shouldRemove = false; } else if (minEmptyLength > line.length) { minEmptyLength = line.length; } }); if (minIndent == Infinity) { minIndent = minEmptyLength; ignoreBlankLines = false; shouldRemove = false; } if (insertAtTabStop && minIndent % tabSize != 0) minIndent = Math.floor(minIndent / tabSize) * tabSize; iter(shouldRemove ? uncomment : comment); }; this.toggleBlockComment = function(state, session, range, cursor) { var comment = this.blockComment; if (!comment) return; if (!comment.start && comment[0]) comment = comment[0]; var iterator = new TokenIterator(session, cursor.row, cursor.column); var token = iterator.getCurrentToken(); var sel = session.selection; var initialRange = session.selection.toOrientedRange(); var startRow, colDiff; if (token && /comment/.test(token.type)) { var startRange, endRange; while (token && /comment/.test(token.type)) { var i = token.value.indexOf(comment.start); if (i != -1) { var row = iterator.getCurrentTokenRow(); var column = iterator.getCurrentTokenColumn() + i; startRange = new Range(row, column, row, column + comment.start.length); break } token = iterator.stepBackward(); }; var iterator = new TokenIterator(session, cursor.row, cursor.column); var token = iterator.getCurrentToken(); while (token && /comment/.test(token.type)) { var i = token.value.indexOf(comment.end); if (i != -1) { var row = iterator.getCurrentTokenRow(); var column = iterator.getCurrentTokenColumn() + i; endRange = new Range(row, column, row, column + comment.end.length); break; } token = iterator.stepForward(); } if (endRange) session.remove(endRange); if (startRange) { session.remove(startRange); startRow = startRange.start.row; colDiff = -comment.start.length } } else { colDiff = comment.start.length startRow = range.start.row; session.insert(range.end, comment.end); session.insert(range.start, comment.start); } if (initialRange.start.row == startRow) initialRange.start.column += colDiff; if (initialRange.end.row == startRow) initialRange.end.column += colDiff; session.selection.fromOrientedRange(initialRange); }; this.getNextLineIndent = function(state, line, tab) { return this.$getIndent(line); }; this.checkOutdent = function(state, line, input) { return false; }; this.autoOutdent = function(state, doc, row) { }; this.$getIndent = function(line) { return line.match(/^\s*/)[0]; }; this.createWorker = function(session) { return null; }; this.createModeDelegates = function (mapping) { this.$embeds = []; this.$modes = {}; for (var i in mapping) { if (mapping[i]) { this.$embeds.push(i); this.$modes[i] = new mapping[i](); } } var delegations = ['toggleCommentLines', 'getNextLineIndent', 'checkOutdent', 'autoOutdent', 'transformAction', 'getCompletions']; for (var i = 0; i < delegations.length; i++) { (function(scope) { var functionName = delegations[i]; var defaultHandler = scope[functionName]; scope[delegations[i]] = function() { return this.$delegator(functionName, arguments, defaultHandler); } } (this)); } }; this.$delegator = function(method, args, defaultHandler) { var state = args[0]; if (typeof state != "string") state = state[0]; for (var i = 0; i < this.$embeds.length; i++) { if (!this.$modes[this.$embeds[i]]) continue; var split = state.split(this.$embeds[i]); if (!split[0] && split[1]) { args[0] = split[1]; var mode = this.$modes[this.$embeds[i]]; return mode[method].apply(mode, args); } } var ret = defaultHandler.apply(this, args); return defaultHandler ? ret : undefined; }; this.transformAction = function(state, action, editor, session, param) { if (this.$behaviour) { var behaviours = this.$behaviour.getBehaviours(); for (var key in behaviours) { if (behaviours[key][action]) { var ret = behaviours[key][action].apply(this, arguments); if (ret) { return ret; } } } } }; this.getKeywords = function(append) { if (!this.completionKeywords) { var rules = this.$tokenizer.rules; var completionKeywords = []; for (var rule in rules) { var ruleItr = rules[rule]; for (var r = 0, l = ruleItr.length; r < l; r++) { if (typeof ruleItr[r].token === "string") { if (/keyword|support|storage/.test(ruleItr[r].token)) completionKeywords.push(ruleItr[r].regex); } else if (typeof ruleItr[r].token === "object") { for (var a = 0, aLength = ruleItr[r].token.length; a < aLength; a++) { if (/keyword|support|storage/.test(ruleItr[r].token[a])) { var rule = ruleItr[r].regex.match(/\(.+?\)/g)[a]; completionKeywords.push(rule.substr(1, rule.length - 2)); } } } } } this.completionKeywords = completionKeywords; } if (!append) return this.$keywordList; return completionKeywords.concat(this.$keywordList || []); }; this.$createKeywordList = function() { if (!this.$highlightRules) this.getTokenizer(); return this.$keywordList = this.$highlightRules.$keywordList || []; } this.getCompletions = function(state, session, pos, prefix) { var keywords = this.$keywordList || this.$createKeywordList(); return keywords.map(function(word) { return { name: word, value: word, score: 0, meta: "keyword" }; }); }; }).call(Mode.prototype); exports.Mode = Mode; }); define('ace/tokenizer', ['require', 'exports', 'module' ], function(require, exports, module) { var MAX_TOKEN_COUNT = 1000; var Tokenizer = function(rules) { this.states = rules; this.regExps = {}; this.matchMappings = {}; for (var key in this.states) { var state = this.states[key]; var ruleRegExps = []; var matchTotal = 0; var mapping = this.matchMappings[key] = {defaultToken: "text"}; var flag = "g"; var splitterRurles = []; for (var i = 0; i < state.length; i++) { var rule = state[i]; if (rule.defaultToken) mapping.defaultToken = rule.defaultToken; if (rule.caseInsensitive) flag = "gi"; if (rule.regex == null) continue; if (rule.regex instanceof RegExp) rule.regex = rule.regex.toString().slice(1, -1); var adjustedregex = rule.regex; var matchcount = new RegExp("(?:(" + adjustedregex + ")|(.))").exec("a").length - 2; if (Array.isArray(rule.token)) { if (rule.token.length == 1 || matchcount == 1) { rule.token = rule.token[0]; } else if (matchcount - 1 != rule.token.length) { throw new Error("number of classes and regexp groups in '" + rule.token + "'\n'" + rule.regex + "' doesn't match\n" + (matchcount - 1) + "!=" + rule.token.length); } else { rule.tokenArray = rule.token; rule.token = null; rule.onMatch = this.$arrayTokens; } } else if (typeof rule.token == "function" && !rule.onMatch) { if (matchcount > 1) rule.onMatch = this.$applyToken; else rule.onMatch = rule.token; } if (matchcount > 1) { if (/\\\d/.test(rule.regex)) { adjustedregex = rule.regex.replace(/\\([0-9]+)/g, function (match, digit) { return "\\" + (parseInt(digit, 10) + matchTotal + 1); }); } else { matchcount = 1; adjustedregex = this.removeCapturingGroups(rule.regex); } if (!rule.splitRegex && typeof rule.token != "string") splitterRurles.push(rule); // flag will be known only at the very end } mapping[matchTotal] = i; matchTotal += matchcount; ruleRegExps.push(adjustedregex); if (!rule.onMatch) rule.onMatch = null; rule.__proto__ = null; } splitterRurles.forEach(function(rule) { rule.splitRegex = this.createSplitterRegexp(rule.regex, flag); }, this); this.regExps[key] = new RegExp("(" + ruleRegExps.join(")|(") + ")|($)", flag); } }; (function() { this.$setMaxTokenCount = function(m) { MAX_TOKEN_COUNT = m | 0; }; this.$applyToken = function(str) { var values = this.splitRegex.exec(str).slice(1); var types = this.token.apply(this, values); if (typeof types === "string") return [{type: types, value: str}]; var tokens = []; for (var i = 0, l = types.length; i < l; i++) { if (values[i]) tokens[tokens.length] = { type: types[i], value: values[i] }; } return tokens; }, this.$arrayTokens = function(str) { if (!str) return []; var values = this.splitRegex.exec(str); if (!values) return "text"; var tokens = []; var types = this.tokenArray; for (var i = 0, l = types.length; i < l; i++) { if (values[i + 1]) tokens[tokens.length] = { type: types[i], value: values[i + 1] }; } return tokens; }; this.removeCapturingGroups = function(src) { var r = src.replace( /\[(?:\\.|[^\]])*?\]|\\.|\(\?[:=!]|(\()/g, function(x, y) {return y ? "(?:" : x;} ); return r; }; this.createSplitterRegexp = function(src, flag) { if (src.indexOf("(?=") != -1) { var stack = 0; var inChClass = false; var lastCapture = {}; src.replace(/(\\.)|(\((?:\?[=!])?)|(\))|([\[\]])/g, function( m, esc, parenOpen, parenClose, square, index ) { if (inChClass) { inChClass = square != "]"; } else if (square) { inChClass = true; } else if (parenClose) { if (stack == lastCapture.stack) { lastCapture.end = index+1; lastCapture.stack = -1; } stack--; } else if (parenOpen) { stack++; if (parenOpen.length != 1) { lastCapture.stack = stack lastCapture.start = index; } } return m; }); if (lastCapture.end != null && /^\)*$/.test(src.substr(lastCapture.end))) src = src.substring(0, lastCapture.start) + src.substr(lastCapture.end); } return new RegExp(src, (flag||"").replace("g", "")); }; this.getLineTokens = function(line, startState) { if (startState && typeof startState != "string") { var stack = startState.slice(0); startState = stack[0]; } else var stack = []; var currentState = startState || "start"; var state = this.states[currentState]; var mapping = this.matchMappings[currentState]; var re = this.regExps[currentState]; re.lastIndex = 0; var match, tokens = []; var lastIndex = 0; var token = {type: null, value: ""}; while (match = re.exec(line)) { var type = mapping.defaultToken; var rule = null; var value = match[0]; var index = re.lastIndex; if (index - value.length > lastIndex) { var skipped = line.substring(lastIndex, index - value.length); if (token.type == type) { token.value += skipped; } else { if (token.type) tokens.push(token); token = {type: type, value: skipped}; } } for (var i = 0; i < match.length-2; i++) { if (match[i + 1] === undefined) continue; rule = state[mapping[i]]; if (rule.onMatch) type = rule.onMatch(value, currentState, stack); else type = rule.token; if (rule.next) { if (typeof rule.next == "string") currentState = rule.next; else currentState = rule.next(currentState, stack); state = this.states[currentState]; if (!state) { window.console && console.error && console.error(currentState, "doesn't exist"); currentState = "start"; state = this.states[currentState]; } mapping = this.matchMappings[currentState]; lastIndex = index; re = this.regExps[currentState]; re.lastIndex = index; } break; } if (value) { if (typeof type == "string") { if ((!rule || rule.merge !== false) && token.type === type) { token.value += value; } else { if (token.type) tokens.push(token); token = {type: type, value: value}; } } else if (type) { if (token.type) tokens.push(token); token = {type: null, value: ""}; for (var i = 0; i < type.length; i++) tokens.push(type[i]); } } if (lastIndex == line.length) break; lastIndex = index; if (tokens.length > MAX_TOKEN_COUNT) { while (lastIndex < line.length) { if (token.type) tokens.push(token); token = { value: line.substring(lastIndex, lastIndex += 2000), type: "overflow" } } currentState = "start"; stack = []; break; } } if (token.type) tokens.push(token); return { tokens : tokens, state : stack.length ? stack : currentState }; }; }).call(Tokenizer.prototype); exports.Tokenizer = Tokenizer; }); define('ace/mode/text_highlight_rules', ['require', 'exports', 'module' , 'ace/lib/lang'], function(require, exports, module) { var lang = require("../lib/lang"); var TextHighlightRules = function() { this.$rules = { "start" : [{ token : "empty_line", regex : '^$' }, { defaultToken : "text" }] }; }; (function() { this.addRules = function(rules, prefix) { if (!prefix) { for (var key in rules) this.$rules[key] = rules[key]; return; } for (var key in rules) { var state = rules[key]; for (var i = 0; i < state.length; i++) { var rule = state[i]; if (rule.next) { if (typeof rule.next != "string") { if (rule.nextState && rule.nextState.indexOf(prefix) !== 0) rule.nextState = prefix + rule.nextState; } else { if (rule.next.indexOf(prefix) !== 0) rule.next = prefix + rule.next; } } } this.$rules[prefix + key] = state; } }; this.getRules = function() { return this.$rules; }; this.embedRules = function (HighlightRules, prefix, escapeRules, states, append) { var embedRules = new HighlightRules().getRules(); if (states) { for (var i = 0; i < states.length; i++) states[i] = prefix + states[i]; } else { states = []; for (var key in embedRules) states.push(prefix + key); } this.addRules(embedRules, prefix); if (escapeRules) { var addRules = Array.prototype[append ? "push" : "unshift"]; for (var i = 0; i < states.length; i++) addRules.apply(this.$rules[states[i]], lang.deepCopy(escapeRules)); } if (!this.$embeds) this.$embeds = []; this.$embeds.push(prefix); }; this.getEmbeds = function() { return this.$embeds; }; var pushState = function(currentState, stack) { if (currentState != "start") stack.unshift(this.nextState, currentState); return this.nextState; }; var popState = function(currentState, stack) { if (stack[0] !== currentState) return "start"; stack.shift(); return stack.shift(); }; this.normalizeRules = function() { var id = 0; var rules = this.$rules; function processState(key) { var state = rules[key]; state.processed = true; for (var i = 0; i < state.length; i++) { var rule = state[i]; if (!rule.regex && rule.start) { rule.regex = rule.start; if (!rule.next) rule.next = []; rule.next.push({ defaultToken: rule.token }, { token: rule.token + ".end", regex: rule.end || rule.start, next: "pop" }); rule.token = rule.token + ".start"; rule.push = true; } var next = rule.next || rule.push; if (next && Array.isArray(next)) { var stateName = rule.stateName; if (!stateName) { stateName = rule.token; if (typeof stateName != "string") stateName = stateName[0] || ""; if (rules[stateName]) stateName += id++; } rules[stateName] = next; rule.next = stateName; processState(stateName); } else if (next == "pop") { rule.next = popState; } if (rule.push) { rule.nextState = rule.next || rule.push; rule.next = pushState; delete rule.push; } if (rule.rules) { for (var r in rule.rules) { if (rules[r]) { if (rules[r].push) rules[r].push.apply(rules[r], rule.rules[r]); } else { rules[r] = rule.rules[r]; } } } if (rule.include || typeof rule == "string") { var includeName = rule.include || rule; var toInsert = rules[includeName]; } else if (Array.isArray(rule)) toInsert = rule; if (toInsert) { var args = [i, 1].concat(toInsert); if (rule.noEscape) args = args.filter(function(x) {return !x.next;}); state.splice.apply(state, args); i--; toInsert = null } if (rule.keywordMap) { rule.token = this.createKeywordMapper( rule.keywordMap, rule.defaultToken || "text", rule.caseInsensitive ); delete rule.defaultToken; } } }; Object.keys(rules).forEach(processState, this); }; this.createKeywordMapper = function(map, defaultToken, ignoreCase, splitChar) { var keywords = Object.create(null); Object.keys(map).forEach(function(className) { var a = map[className]; if (ignoreCase) a = a.toLowerCase(); var list = a.split(splitChar || "|"); for (var i = list.length; i--; ) keywords[list[i]] = className; }); if (Object.getPrototypeOf(keywords)) { keywords.__proto__ = null; } this.$keywordList = Object.keys(keywords); map = null; return ignoreCase ? function(value) {return keywords[value.toLowerCase()] || defaultToken } : function(value) {return keywords[value] || defaultToken }; } this.getKeywords = function() { return this.$keywords; }; }).call(TextHighlightRules.prototype); exports.TextHighlightRules = TextHighlightRules; }); define('ace/mode/behaviour', ['require', 'exports', 'module' ], function(require, exports, module) { var Behaviour = function() { this.$behaviours = {}; }; (function () { this.add = function (name, action, callback) { switch (undefined) { case this.$behaviours: this.$behaviours = {}; case this.$behaviours[name]: this.$behaviours[name] = {}; } this.$behaviours[name][action] = callback; } this.addBehaviours = function (behaviours) { for (var key in behaviours) { for (var action in behaviours[key]) { this.add(key, action, behaviours[key][action]); } } } this.remove = function (name) { if (this.$behaviours && this.$behaviours[name]) { delete this.$behaviours[name]; } } this.inherit = function (mode, filter) { if (typeof mode === "function") { var behaviours = new mode().getBehaviours(filter); } else { var behaviours = mode.getBehaviours(filter); } this.addBehaviours(behaviours); } this.getBehaviours = function (filter) { if (!filter) { return this.$behaviours; } else { var ret = {} for (var i = 0; i < filter.length; i++) { if (this.$behaviours[filter[i]]) { ret[filter[i]] = this.$behaviours[filter[i]]; } } return ret; } } }).call(Behaviour.prototype); exports.Behaviour = Behaviour; }); define('ace/unicode', ['require', 'exports', 'module' ], function(require, exports, module) { exports.packages = {}; addUnicodePackage({ L: "0041-005A0061-007A00AA00B500BA00C0-00D600D8-00F600F8-02C102C6-02D102E0-02E402EC02EE0370-037403760377037A-037D03860388-038A038C038E-03A103A3-03F503F7-0481048A-05250531-055605590561-058705D0-05EA05F0-05F20621-064A066E066F0671-06D306D506E506E606EE06EF06FA-06FC06FF07100712-072F074D-07A507B107CA-07EA07F407F507FA0800-0815081A082408280904-0939093D09500958-0961097109720979-097F0985-098C098F09900993-09A809AA-09B009B209B6-09B909BD09CE09DC09DD09DF-09E109F009F10A05-0A0A0A0F0A100A13-0A280A2A-0A300A320A330A350A360A380A390A59-0A5C0A5E0A72-0A740A85-0A8D0A8F-0A910A93-0AA80AAA-0AB00AB20AB30AB5-0AB90ABD0AD00AE00AE10B05-0B0C0B0F0B100B13-0B280B2A-0B300B320B330B35-0B390B3D0B5C0B5D0B5F-0B610B710B830B85-0B8A0B8E-0B900B92-0B950B990B9A0B9C0B9E0B9F0BA30BA40BA8-0BAA0BAE-0BB90BD00C05-0C0C0C0E-0C100C12-0C280C2A-0C330C35-0C390C3D0C580C590C600C610C85-0C8C0C8E-0C900C92-0CA80CAA-0CB30CB5-0CB90CBD0CDE0CE00CE10D05-0D0C0D0E-0D100D12-0D280D2A-0D390D3D0D600D610D7A-0D7F0D85-0D960D9A-0DB10DB3-0DBB0DBD0DC0-0DC60E01-0E300E320E330E40-0E460E810E820E840E870E880E8A0E8D0E94-0E970E99-0E9F0EA1-0EA30EA50EA70EAA0EAB0EAD-0EB00EB20EB30EBD0EC0-0EC40EC60EDC0EDD0F000F40-0F470F49-0F6C0F88-0F8B1000-102A103F1050-1055105A-105D106110651066106E-10701075-1081108E10A0-10C510D0-10FA10FC1100-1248124A-124D1250-12561258125A-125D1260-1288128A-128D1290-12B012B2-12B512B8-12BE12C012C2-12C512C8-12D612D8-13101312-13151318-135A1380-138F13A0-13F41401-166C166F-167F1681-169A16A0-16EA1700-170C170E-17111720-17311740-17511760-176C176E-17701780-17B317D717DC1820-18771880-18A818AA18B0-18F51900-191C1950-196D1970-19741980-19AB19C1-19C71A00-1A161A20-1A541AA71B05-1B331B45-1B4B1B83-1BA01BAE1BAF1C00-1C231C4D-1C4F1C5A-1C7D1CE9-1CEC1CEE-1CF11D00-1DBF1E00-1F151F18-1F1D1F20-1F451F48-1F4D1F50-1F571F591F5B1F5D1F5F-1F7D1F80-1FB41FB6-1FBC1FBE1FC2-1FC41FC6-1FCC1FD0-1FD31FD6-1FDB1FE0-1FEC1FF2-1FF41FF6-1FFC2071207F2090-209421022107210A-211321152119-211D212421262128212A-212D212F-2139213C-213F2145-2149214E218321842C00-2C2E2C30-2C5E2C60-2CE42CEB-2CEE2D00-2D252D30-2D652D6F2D80-2D962DA0-2DA62DA8-2DAE2DB0-2DB62DB8-2DBE2DC0-2DC62DC8-2DCE2DD0-2DD62DD8-2DDE2E2F300530063031-3035303B303C3041-3096309D-309F30A1-30FA30FC-30FF3105-312D3131-318E31A0-31B731F0-31FF3400-4DB54E00-9FCBA000-A48CA4D0-A4FDA500-A60CA610-A61FA62AA62BA640-A65FA662-A66EA67F-A697A6A0-A6E5A717-A71FA722-A788A78BA78CA7FB-A801A803-A805A807-A80AA80C-A822A840-A873A882-A8B3A8F2-A8F7A8FBA90A-A925A930-A946A960-A97CA984-A9B2A9CFAA00-AA28AA40-AA42AA44-AA4BAA60-AA76AA7AAA80-AAAFAAB1AAB5AAB6AAB9-AABDAAC0AAC2AADB-AADDABC0-ABE2AC00-D7A3D7B0-D7C6D7CB-D7FBF900-FA2DFA30-FA6DFA70-FAD9FB00-FB06FB13-FB17FB1DFB1F-FB28FB2A-FB36FB38-FB3CFB3EFB40FB41FB43FB44FB46-FBB1FBD3-FD3DFD50-FD8FFD92-FDC7FDF0-FDFBFE70-FE74FE76-FEFCFF21-FF3AFF41-FF5AFF66-FFBEFFC2-FFC7FFCA-FFCFFFD2-FFD7FFDA-FFDC", Ll: "0061-007A00AA00B500BA00DF-00F600F8-00FF01010103010501070109010B010D010F01110113011501170119011B011D011F01210123012501270129012B012D012F01310133013501370138013A013C013E014001420144014601480149014B014D014F01510153015501570159015B015D015F01610163016501670169016B016D016F0171017301750177017A017C017E-0180018301850188018C018D019201950199-019B019E01A101A301A501A801AA01AB01AD01B001B401B601B901BA01BD-01BF01C601C901CC01CE01D001D201D401D601D801DA01DC01DD01DF01E101E301E501E701E901EB01ED01EF01F001F301F501F901FB01FD01FF02010203020502070209020B020D020F02110213021502170219021B021D021F02210223022502270229022B022D022F02310233-0239023C023F0240024202470249024B024D024F-02930295-02AF037103730377037B-037D039003AC-03CE03D003D103D5-03D703D903DB03DD03DF03E103E303E503E703E903EB03ED03EF-03F303F503F803FB03FC0430-045F04610463046504670469046B046D046F04710473047504770479047B047D047F0481048B048D048F04910493049504970499049B049D049F04A104A304A504A704A904AB04AD04AF04B104B304B504B704B904BB04BD04BF04C204C404C604C804CA04CC04CE04CF04D104D304D504D704D904DB04DD04DF04E104E304E504E704E904EB04ED04EF04F104F304F504F704F904FB04FD04FF05010503050505070509050B050D050F05110513051505170519051B051D051F0521052305250561-05871D00-1D2B1D62-1D771D79-1D9A1E011E031E051E071E091E0B1E0D1E0F1E111E131E151E171E191E1B1E1D1E1F1E211E231E251E271E291E2B1E2D1E2F1E311E331E351E371E391E3B1E3D1E3F1E411E431E451E471E491E4B1E4D1E4F1E511E531E551E571E591E5B1E5D1E5F1E611E631E651E671E691E6B1E6D1E6F1E711E731E751E771E791E7B1E7D1E7F1E811E831E851E871E891E8B1E8D1E8F1E911E931E95-1E9D1E9F1EA11EA31EA51EA71EA91EAB1EAD1EAF1EB11EB31EB51EB71EB91EBB1EBD1EBF1EC11EC31EC51EC71EC91ECB1ECD1ECF1ED11ED31ED51ED71ED91EDB1EDD1EDF1EE11EE31EE51EE71EE91EEB1EED1EEF1EF11EF31EF51EF71EF91EFB1EFD1EFF-1F071F10-1F151F20-1F271F30-1F371F40-1F451F50-1F571F60-1F671F70-1F7D1F80-1F871F90-1F971FA0-1FA71FB0-1FB41FB61FB71FBE1FC2-1FC41FC61FC71FD0-1FD31FD61FD71FE0-1FE71FF2-1FF41FF61FF7210A210E210F2113212F21342139213C213D2146-2149214E21842C30-2C5E2C612C652C662C682C6A2C6C2C712C732C742C76-2C7C2C812C832C852C872C892C8B2C8D2C8F2C912C932C952C972C992C9B2C9D2C9F2CA12CA32CA52CA72CA92CAB2CAD2CAF2CB12CB32CB52CB72CB92CBB2CBD2CBF2CC12CC32CC52CC72CC92CCB2CCD2CCF2CD12CD32CD52CD72CD92CDB2CDD2CDF2CE12CE32CE42CEC2CEE2D00-2D25A641A643A645A647A649A64BA64DA64FA651A653A655A657A659A65BA65DA65FA663A665A667A669A66BA66DA681A683A685A687A689A68BA68DA68FA691A693A695A697A723A725A727A729A72BA72DA72F-A731A733A735A737A739A73BA73DA73FA741A743A745A747A749A74BA74DA74FA751A753A755A757A759A75BA75DA75FA761A763A765A767A769A76BA76DA76FA771-A778A77AA77CA77FA781A783A785A787A78CFB00-FB06FB13-FB17FF41-FF5A", Lu: "0041-005A00C0-00D600D8-00DE01000102010401060108010A010C010E01100112011401160118011A011C011E01200122012401260128012A012C012E01300132013401360139013B013D013F0141014301450147014A014C014E01500152015401560158015A015C015E01600162016401660168016A016C016E017001720174017601780179017B017D018101820184018601870189-018B018E-0191019301940196-0198019C019D019F01A001A201A401A601A701A901AC01AE01AF01B1-01B301B501B701B801BC01C401C701CA01CD01CF01D101D301D501D701D901DB01DE01E001E201E401E601E801EA01EC01EE01F101F401F6-01F801FA01FC01FE02000202020402060208020A020C020E02100212021402160218021A021C021E02200222022402260228022A022C022E02300232023A023B023D023E02410243-02460248024A024C024E03700372037603860388-038A038C038E038F0391-03A103A3-03AB03CF03D2-03D403D803DA03DC03DE03E003E203E403E603E803EA03EC03EE03F403F703F903FA03FD-042F04600462046404660468046A046C046E04700472047404760478047A047C047E0480048A048C048E04900492049404960498049A049C049E04A004A204A404A604A804AA04AC04AE04B004B204B404B604B804BA04BC04BE04C004C104C304C504C704C904CB04CD04D004D204D404D604D804DA04DC04DE04E004E204E404E604E804EA04EC04EE04F004F204F404F604F804FA04FC04FE05000502050405060508050A050C050E05100512051405160518051A051C051E0520052205240531-055610A0-10C51E001E021E041E061E081E0A1E0C1E0E1E101E121E141E161E181E1A1E1C1E1E1E201E221E241E261E281E2A1E2C1E2E1E301E321E341E361E381E3A1E3C1E3E1E401E421E441E461E481E4A1E4C1E4E1E501E521E541E561E581E5A1E5C1E5E1E601E621E641E661E681E6A1E6C1E6E1E701E721E741E761E781E7A1E7C1E7E1E801E821E841E861E881E8A1E8C1E8E1E901E921E941E9E1EA01EA21EA41EA61EA81EAA1EAC1EAE1EB01EB21EB41EB61EB81EBA1EBC1EBE1EC01EC21EC41EC61EC81ECA1ECC1ECE1ED01ED21ED41ED61ED81EDA1EDC1EDE1EE01EE21EE41EE61EE81EEA1EEC1EEE1EF01EF21EF41EF61EF81EFA1EFC1EFE1F08-1F0F1F18-1F1D1F28-1F2F1F38-1F3F1F48-1F4D1F591F5B1F5D1F5F1F68-1F6F1FB8-1FBB1FC8-1FCB1FD8-1FDB1FE8-1FEC1FF8-1FFB21022107210B-210D2110-211221152119-211D212421262128212A-212D2130-2133213E213F214521832C00-2C2E2C602C62-2C642C672C692C6B2C6D-2C702C722C752C7E-2C802C822C842C862C882C8A2C8C2C8E2C902C922C942C962C982C9A2C9C2C9E2CA02CA22CA42CA62CA82CAA2CAC2CAE2CB02CB22CB42CB62CB82CBA2CBC2CBE2CC02CC22CC42CC62CC82CCA2CCC2CCE2CD02CD22CD42CD62CD82CDA2CDC2CDE2CE02CE22CEB2CEDA640A642A644A646A648A64AA64CA64EA650A652A654A656A658A65AA65CA65EA662A664A666A668A66AA66CA680A682A684A686A688A68AA68CA68EA690A692A694A696A722A724A726A728A72AA72CA72EA732A734A736A738A73AA73CA73EA740A742A744A746A748A74AA74CA74EA750A752A754A756A758A75AA75CA75EA760A762A764A766A768A76AA76CA76EA779A77BA77DA77EA780A782A784A786A78BFF21-FF3A", Lt: "01C501C801CB01F21F88-1F8F1F98-1F9F1FA8-1FAF1FBC1FCC1FFC", Lm: "02B0-02C102C6-02D102E0-02E402EC02EE0374037A0559064006E506E607F407F507FA081A0824082809710E460EC610FC17D718431AA71C78-1C7D1D2C-1D611D781D9B-1DBF2071207F2090-20942C7D2D6F2E2F30053031-3035303B309D309E30FC-30FEA015A4F8-A4FDA60CA67FA717-A71FA770A788A9CFAA70AADDFF70FF9EFF9F", Lo: "01BB01C0-01C3029405D0-05EA05F0-05F20621-063F0641-064A066E066F0671-06D306D506EE06EF06FA-06FC06FF07100712-072F074D-07A507B107CA-07EA0800-08150904-0939093D09500958-096109720979-097F0985-098C098F09900993-09A809AA-09B009B209B6-09B909BD09CE09DC09DD09DF-09E109F009F10A05-0A0A0A0F0A100A13-0A280A2A-0A300A320A330A350A360A380A390A59-0A5C0A5E0A72-0A740A85-0A8D0A8F-0A910A93-0AA80AAA-0AB00AB20AB30AB5-0AB90ABD0AD00AE00AE10B05-0B0C0B0F0B100B13-0B280B2A-0B300B320B330B35-0B390B3D0B5C0B5D0B5F-0B610B710B830B85-0B8A0B8E-0B900B92-0B950B990B9A0B9C0B9E0B9F0BA30BA40BA8-0BAA0BAE-0BB90BD00C05-0C0C0C0E-0C100C12-0C280C2A-0C330C35-0C390C3D0C580C590C600C610C85-0C8C0C8E-0C900C92-0CA80CAA-0CB30CB5-0CB90CBD0CDE0CE00CE10D05-0D0C0D0E-0D100D12-0D280D2A-0D390D3D0D600D610D7A-0D7F0D85-0D960D9A-0DB10DB3-0DBB0DBD0DC0-0DC60E01-0E300E320E330E40-0E450E810E820E840E870E880E8A0E8D0E94-0E970E99-0E9F0EA1-0EA30EA50EA70EAA0EAB0EAD-0EB00EB20EB30EBD0EC0-0EC40EDC0EDD0F000F40-0F470F49-0F6C0F88-0F8B1000-102A103F1050-1055105A-105D106110651066106E-10701075-1081108E10D0-10FA1100-1248124A-124D1250-12561258125A-125D1260-1288128A-128D1290-12B012B2-12B512B8-12BE12C012C2-12C512C8-12D612D8-13101312-13151318-135A1380-138F13A0-13F41401-166C166F-167F1681-169A16A0-16EA1700-170C170E-17111720-17311740-17511760-176C176E-17701780-17B317DC1820-18421844-18771880-18A818AA18B0-18F51900-191C1950-196D1970-19741980-19AB19C1-19C71A00-1A161A20-1A541B05-1B331B45-1B4B1B83-1BA01BAE1BAF1C00-1C231C4D-1C4F1C5A-1C771CE9-1CEC1CEE-1CF12135-21382D30-2D652D80-2D962DA0-2DA62DA8-2DAE2DB0-2DB62DB8-2DBE2DC0-2DC62DC8-2DCE2DD0-2DD62DD8-2DDE3006303C3041-3096309F30A1-30FA30FF3105-312D3131-318E31A0-31B731F0-31FF3400-4DB54E00-9FCBA000-A014A016-A48CA4D0-A4F7A500-A60BA610-A61FA62AA62BA66EA6A0-A6E5A7FB-A801A803-A805A807-A80AA80C-A822A840-A873A882-A8B3A8F2-A8F7A8FBA90A-A925A930-A946A960-A97CA984-A9B2AA00-AA28AA40-AA42AA44-AA4BAA60-AA6FAA71-AA76AA7AAA80-AAAFAAB1AAB5AAB6AAB9-AABDAAC0AAC2AADBAADCABC0-ABE2AC00-D7A3D7B0-D7C6D7CB-D7FBF900-FA2DFA30-FA6DFA70-FAD9FB1DFB1F-FB28FB2A-FB36FB38-FB3CFB3EFB40FB41FB43FB44FB46-FBB1FBD3-FD3DFD50-FD8FFD92-FDC7FDF0-FDFBFE70-FE74FE76-FEFCFF66-FF6FFF71-FF9DFFA0-FFBEFFC2-FFC7FFCA-FFCFFFD2-FFD7FFDA-FFDC", M: "0300-036F0483-04890591-05BD05BF05C105C205C405C505C70610-061A064B-065E067006D6-06DC06DE-06E406E706E806EA-06ED07110730-074A07A6-07B007EB-07F30816-0819081B-08230825-08270829-082D0900-0903093C093E-094E0951-0955096209630981-098309BC09BE-09C409C709C809CB-09CD09D709E209E30A01-0A030A3C0A3E-0A420A470A480A4B-0A4D0A510A700A710A750A81-0A830ABC0ABE-0AC50AC7-0AC90ACB-0ACD0AE20AE30B01-0B030B3C0B3E-0B440B470B480B4B-0B4D0B560B570B620B630B820BBE-0BC20BC6-0BC80BCA-0BCD0BD70C01-0C030C3E-0C440C46-0C480C4A-0C4D0C550C560C620C630C820C830CBC0CBE-0CC40CC6-0CC80CCA-0CCD0CD50CD60CE20CE30D020D030D3E-0D440D46-0D480D4A-0D4D0D570D620D630D820D830DCA0DCF-0DD40DD60DD8-0DDF0DF20DF30E310E34-0E3A0E47-0E4E0EB10EB4-0EB90EBB0EBC0EC8-0ECD0F180F190F350F370F390F3E0F3F0F71-0F840F860F870F90-0F970F99-0FBC0FC6102B-103E1056-1059105E-10601062-10641067-106D1071-10741082-108D108F109A-109D135F1712-17141732-1734175217531772177317B6-17D317DD180B-180D18A91920-192B1930-193B19B0-19C019C819C91A17-1A1B1A55-1A5E1A60-1A7C1A7F1B00-1B041B34-1B441B6B-1B731B80-1B821BA1-1BAA1C24-1C371CD0-1CD21CD4-1CE81CED1CF21DC0-1DE61DFD-1DFF20D0-20F02CEF-2CF12DE0-2DFF302A-302F3099309AA66F-A672A67CA67DA6F0A6F1A802A806A80BA823-A827A880A881A8B4-A8C4A8E0-A8F1A926-A92DA947-A953A980-A983A9B3-A9C0AA29-AA36AA43AA4CAA4DAA7BAAB0AAB2-AAB4AAB7AAB8AABEAABFAAC1ABE3-ABEAABECABEDFB1EFE00-FE0FFE20-FE26", Mn: "0300-036F0483-04870591-05BD05BF05C105C205C405C505C70610-061A064B-065E067006D6-06DC06DF-06E406E706E806EA-06ED07110730-074A07A6-07B007EB-07F30816-0819081B-08230825-08270829-082D0900-0902093C0941-0948094D0951-095509620963098109BC09C1-09C409CD09E209E30A010A020A3C0A410A420A470A480A4B-0A4D0A510A700A710A750A810A820ABC0AC1-0AC50AC70AC80ACD0AE20AE30B010B3C0B3F0B41-0B440B4D0B560B620B630B820BC00BCD0C3E-0C400C46-0C480C4A-0C4D0C550C560C620C630CBC0CBF0CC60CCC0CCD0CE20CE30D41-0D440D4D0D620D630DCA0DD2-0DD40DD60E310E34-0E3A0E47-0E4E0EB10EB4-0EB90EBB0EBC0EC8-0ECD0F180F190F350F370F390F71-0F7E0F80-0F840F860F870F90-0F970F99-0FBC0FC6102D-10301032-10371039103A103D103E10581059105E-10601071-1074108210851086108D109D135F1712-17141732-1734175217531772177317B7-17BD17C617C9-17D317DD180B-180D18A91920-19221927192819321939-193B1A171A181A561A58-1A5E1A601A621A65-1A6C1A73-1A7C1A7F1B00-1B031B341B36-1B3A1B3C1B421B6B-1B731B801B811BA2-1BA51BA81BA91C2C-1C331C361C371CD0-1CD21CD4-1CE01CE2-1CE81CED1DC0-1DE61DFD-1DFF20D0-20DC20E120E5-20F02CEF-2CF12DE0-2DFF302A-302F3099309AA66FA67CA67DA6F0A6F1A802A806A80BA825A826A8C4A8E0-A8F1A926-A92DA947-A951A980-A982A9B3A9B6-A9B9A9BCAA29-AA2EAA31AA32AA35AA36AA43AA4CAAB0AAB2-AAB4AAB7AAB8AABEAABFAAC1ABE5ABE8ABEDFB1EFE00-FE0FFE20-FE26", Mc: "0903093E-09400949-094C094E0982098309BE-09C009C709C809CB09CC09D70A030A3E-0A400A830ABE-0AC00AC90ACB0ACC0B020B030B3E0B400B470B480B4B0B4C0B570BBE0BBF0BC10BC20BC6-0BC80BCA-0BCC0BD70C01-0C030C41-0C440C820C830CBE0CC0-0CC40CC70CC80CCA0CCB0CD50CD60D020D030D3E-0D400D46-0D480D4A-0D4C0D570D820D830DCF-0DD10DD8-0DDF0DF20DF30F3E0F3F0F7F102B102C10311038103B103C105610571062-10641067-106D108310841087-108C108F109A-109C17B617BE-17C517C717C81923-19261929-192B193019311933-193819B0-19C019C819C91A19-1A1B1A551A571A611A631A641A6D-1A721B041B351B3B1B3D-1B411B431B441B821BA11BA61BA71BAA1C24-1C2B1C341C351CE11CF2A823A824A827A880A881A8B4-A8C3A952A953A983A9B4A9B5A9BAA9BBA9BD-A9C0AA2FAA30AA33AA34AA4DAA7BABE3ABE4ABE6ABE7ABE9ABEAABEC", Me: "0488048906DE20DD-20E020E2-20E4A670-A672", N: "0030-003900B200B300B900BC-00BE0660-066906F0-06F907C0-07C90966-096F09E6-09EF09F4-09F90A66-0A6F0AE6-0AEF0B66-0B6F0BE6-0BF20C66-0C6F0C78-0C7E0CE6-0CEF0D66-0D750E50-0E590ED0-0ED90F20-0F331040-10491090-10991369-137C16EE-16F017E0-17E917F0-17F91810-18191946-194F19D0-19DA1A80-1A891A90-1A991B50-1B591BB0-1BB91C40-1C491C50-1C5920702074-20792080-20892150-21822185-21892460-249B24EA-24FF2776-27932CFD30073021-30293038-303A3192-31953220-32293251-325F3280-328932B1-32BFA620-A629A6E6-A6EFA830-A835A8D0-A8D9A900-A909A9D0-A9D9AA50-AA59ABF0-ABF9FF10-FF19", Nd: "0030-00390660-066906F0-06F907C0-07C90966-096F09E6-09EF0A66-0A6F0AE6-0AEF0B66-0B6F0BE6-0BEF0C66-0C6F0CE6-0CEF0D66-0D6F0E50-0E590ED0-0ED90F20-0F291040-10491090-109917E0-17E91810-18191946-194F19D0-19DA1A80-1A891A90-1A991B50-1B591BB0-1BB91C40-1C491C50-1C59A620-A629A8D0-A8D9A900-A909A9D0-A9D9AA50-AA59ABF0-ABF9FF10-FF19", Nl: "16EE-16F02160-21822185-218830073021-30293038-303AA6E6-A6EF", No: "00B200B300B900BC-00BE09F4-09F90BF0-0BF20C78-0C7E0D70-0D750F2A-0F331369-137C17F0-17F920702074-20792080-20892150-215F21892460-249B24EA-24FF2776-27932CFD3192-31953220-32293251-325F3280-328932B1-32BFA830-A835", P: "0021-00230025-002A002C-002F003A003B003F0040005B-005D005F007B007D00A100AB00B700BB00BF037E0387055A-055F0589058A05BE05C005C305C605F305F40609060A060C060D061B061E061F066A-066D06D40700-070D07F7-07F90830-083E0964096509700DF40E4F0E5A0E5B0F04-0F120F3A-0F3D0F850FD0-0FD4104A-104F10FB1361-13681400166D166E169B169C16EB-16ED1735173617D4-17D617D8-17DA1800-180A1944194519DE19DF1A1E1A1F1AA0-1AA61AA8-1AAD1B5A-1B601C3B-1C3F1C7E1C7F1CD32010-20272030-20432045-20512053-205E207D207E208D208E2329232A2768-277527C527C627E6-27EF2983-299829D8-29DB29FC29FD2CF9-2CFC2CFE2CFF2E00-2E2E2E302E313001-30033008-30113014-301F3030303D30A030FBA4FEA4FFA60D-A60FA673A67EA6F2-A6F7A874-A877A8CEA8CFA8F8-A8FAA92EA92FA95FA9C1-A9CDA9DEA9DFAA5C-AA5FAADEAADFABEBFD3EFD3FFE10-FE19FE30-FE52FE54-FE61FE63FE68FE6AFE6BFF01-FF03FF05-FF0AFF0C-FF0FFF1AFF1BFF1FFF20FF3B-FF3DFF3FFF5BFF5DFF5F-FF65", Pd: "002D058A05BE140018062010-20152E172E1A301C303030A0FE31FE32FE58FE63FF0D", Ps: "0028005B007B0F3A0F3C169B201A201E2045207D208D23292768276A276C276E27702772277427C527E627E827EA27EC27EE2983298529872989298B298D298F299129932995299729D829DA29FC2E222E242E262E283008300A300C300E3010301430163018301A301DFD3EFE17FE35FE37FE39FE3BFE3DFE3FFE41FE43FE47FE59FE5BFE5DFF08FF3BFF5BFF5FFF62", Pe: "0029005D007D0F3B0F3D169C2046207E208E232A2769276B276D276F27712773277527C627E727E927EB27ED27EF298429862988298A298C298E2990299229942996299829D929DB29FD2E232E252E272E293009300B300D300F3011301530173019301B301E301FFD3FFE18FE36FE38FE3AFE3CFE3EFE40FE42FE44FE48FE5AFE5CFE5EFF09FF3DFF5DFF60FF63", Pi: "00AB2018201B201C201F20392E022E042E092E0C2E1C2E20", Pf: "00BB2019201D203A2E032E052E0A2E0D2E1D2E21", Pc: "005F203F20402054FE33FE34FE4D-FE4FFF3F", Po: "0021-00230025-0027002A002C002E002F003A003B003F0040005C00A100B700BF037E0387055A-055F058905C005C305C605F305F40609060A060C060D061B061E061F066A-066D06D40700-070D07F7-07F90830-083E0964096509700DF40E4F0E5A0E5B0F04-0F120F850FD0-0FD4104A-104F10FB1361-1368166D166E16EB-16ED1735173617D4-17D617D8-17DA1800-18051807-180A1944194519DE19DF1A1E1A1F1AA0-1AA61AA8-1AAD1B5A-1B601C3B-1C3F1C7E1C7F1CD3201620172020-20272030-2038203B-203E2041-20432047-205120532055-205E2CF9-2CFC2CFE2CFF2E002E012E06-2E082E0B2E0E-2E162E182E192E1B2E1E2E1F2E2A-2E2E2E302E313001-3003303D30FBA4FEA4FFA60D-A60FA673A67EA6F2-A6F7A874-A877A8CEA8CFA8F8-A8FAA92EA92FA95FA9C1-A9CDA9DEA9DFAA5C-AA5FAADEAADFABEBFE10-FE16FE19FE30FE45FE46FE49-FE4CFE50-FE52FE54-FE57FE5F-FE61FE68FE6AFE6BFF01-FF03FF05-FF07FF0AFF0CFF0EFF0FFF1AFF1BFF1FFF20FF3CFF61FF64FF65", S: "0024002B003C-003E005E0060007C007E00A2-00A900AC00AE-00B100B400B600B800D700F702C2-02C502D2-02DF02E5-02EB02ED02EF-02FF03750384038503F604820606-0608060B060E060F06E906FD06FE07F609F209F309FA09FB0AF10B700BF3-0BFA0C7F0CF10CF20D790E3F0F01-0F030F13-0F170F1A-0F1F0F340F360F380FBE-0FC50FC7-0FCC0FCE0FCF0FD5-0FD8109E109F13601390-139917DB194019E0-19FF1B61-1B6A1B74-1B7C1FBD1FBF-1FC11FCD-1FCF1FDD-1FDF1FED-1FEF1FFD1FFE20442052207A-207C208A-208C20A0-20B8210021012103-21062108210921142116-2118211E-2123212521272129212E213A213B2140-2144214A-214D214F2190-2328232B-23E82400-24262440-244A249C-24E92500-26CD26CF-26E126E326E8-26FF2701-27042706-2709270C-27272729-274B274D274F-27522756-275E2761-276727942798-27AF27B1-27BE27C0-27C427C7-27CA27CC27D0-27E527F0-29822999-29D729DC-29FB29FE-2B4C2B50-2B592CE5-2CEA2E80-2E992E9B-2EF32F00-2FD52FF0-2FFB300430123013302030363037303E303F309B309C319031913196-319F31C0-31E33200-321E322A-32503260-327F328A-32B032C0-32FE3300-33FF4DC0-4DFFA490-A4C6A700-A716A720A721A789A78AA828-A82BA836-A839AA77-AA79FB29FDFCFDFDFE62FE64-FE66FE69FF04FF0BFF1C-FF1EFF3EFF40FF5CFF5EFFE0-FFE6FFE8-FFEEFFFCFFFD", Sm: "002B003C-003E007C007E00AC00B100D700F703F60606-060820442052207A-207C208A-208C2140-2144214B2190-2194219A219B21A021A321A621AE21CE21CF21D221D421F4-22FF2308-230B23202321237C239B-23B323DC-23E125B725C125F8-25FF266F27C0-27C427C7-27CA27CC27D0-27E527F0-27FF2900-29822999-29D729DC-29FB29FE-2AFF2B30-2B442B47-2B4CFB29FE62FE64-FE66FF0BFF1C-FF1EFF5CFF5EFFE2FFE9-FFEC", Sc: "002400A2-00A5060B09F209F309FB0AF10BF90E3F17DB20A0-20B8A838FDFCFE69FF04FFE0FFE1FFE5FFE6", Sk: "005E006000A800AF00B400B802C2-02C502D2-02DF02E5-02EB02ED02EF-02FF0375038403851FBD1FBF-1FC11FCD-1FCF1FDD-1FDF1FED-1FEF1FFD1FFE309B309CA700-A716A720A721A789A78AFF3EFF40FFE3", So: "00A600A700A900AE00B000B60482060E060F06E906FD06FE07F609FA0B700BF3-0BF80BFA0C7F0CF10CF20D790F01-0F030F13-0F170F1A-0F1F0F340F360F380FBE-0FC50FC7-0FCC0FCE0FCF0FD5-0FD8109E109F13601390-1399194019E0-19FF1B61-1B6A1B74-1B7C210021012103-21062108210921142116-2118211E-2123212521272129212E213A213B214A214C214D214F2195-2199219C-219F21A121A221A421A521A7-21AD21AF-21CD21D021D121D321D5-21F32300-2307230C-231F2322-2328232B-237B237D-239A23B4-23DB23E2-23E82400-24262440-244A249C-24E92500-25B625B8-25C025C2-25F72600-266E2670-26CD26CF-26E126E326E8-26FF2701-27042706-2709270C-27272729-274B274D274F-27522756-275E2761-276727942798-27AF27B1-27BE2800-28FF2B00-2B2F2B452B462B50-2B592CE5-2CEA2E80-2E992E9B-2EF32F00-2FD52FF0-2FFB300430123013302030363037303E303F319031913196-319F31C0-31E33200-321E322A-32503260-327F328A-32B032C0-32FE3300-33FF4DC0-4DFFA490-A4C6A828-A82BA836A837A839AA77-AA79FDFDFFE4FFE8FFEDFFEEFFFCFFFD", Z: "002000A01680180E2000-200A20282029202F205F3000", Zs: "002000A01680180E2000-200A202F205F3000", Zl: "2028", Zp: "2029", C: "0000-001F007F-009F00AD03780379037F-0383038B038D03A20526-05300557055805600588058B-059005C8-05CF05EB-05EF05F5-0605061C061D0620065F06DD070E070F074B074C07B2-07BF07FB-07FF082E082F083F-08FF093A093B094F095609570973-097809800984098D098E0991099209A909B109B3-09B509BA09BB09C509C609C909CA09CF-09D609D8-09DB09DE09E409E509FC-0A000A040A0B-0A0E0A110A120A290A310A340A370A3A0A3B0A3D0A43-0A460A490A4A0A4E-0A500A52-0A580A5D0A5F-0A650A76-0A800A840A8E0A920AA90AB10AB40ABA0ABB0AC60ACA0ACE0ACF0AD1-0ADF0AE40AE50AF00AF2-0B000B040B0D0B0E0B110B120B290B310B340B3A0B3B0B450B460B490B4A0B4E-0B550B58-0B5B0B5E0B640B650B72-0B810B840B8B-0B8D0B910B96-0B980B9B0B9D0BA0-0BA20BA5-0BA70BAB-0BAD0BBA-0BBD0BC3-0BC50BC90BCE0BCF0BD1-0BD60BD8-0BE50BFB-0C000C040C0D0C110C290C340C3A-0C3C0C450C490C4E-0C540C570C5A-0C5F0C640C650C70-0C770C800C810C840C8D0C910CA90CB40CBA0CBB0CC50CC90CCE-0CD40CD7-0CDD0CDF0CE40CE50CF00CF3-0D010D040D0D0D110D290D3A-0D3C0D450D490D4E-0D560D58-0D5F0D640D650D76-0D780D800D810D840D97-0D990DB20DBC0DBE0DBF0DC7-0DC90DCB-0DCE0DD50DD70DE0-0DF10DF5-0E000E3B-0E3E0E5C-0E800E830E850E860E890E8B0E8C0E8E-0E930E980EA00EA40EA60EA80EA90EAC0EBA0EBE0EBF0EC50EC70ECE0ECF0EDA0EDB0EDE-0EFF0F480F6D-0F700F8C-0F8F0F980FBD0FCD0FD9-0FFF10C6-10CF10FD-10FF1249124E124F12571259125E125F1289128E128F12B112B612B712BF12C112C612C712D7131113161317135B-135E137D-137F139A-139F13F5-13FF169D-169F16F1-16FF170D1715-171F1737-173F1754-175F176D17711774-177F17B417B517DE17DF17EA-17EF17FA-17FF180F181A-181F1878-187F18AB-18AF18F6-18FF191D-191F192C-192F193C-193F1941-1943196E196F1975-197F19AC-19AF19CA-19CF19DB-19DD1A1C1A1D1A5F1A7D1A7E1A8A-1A8F1A9A-1A9F1AAE-1AFF1B4C-1B4F1B7D-1B7F1BAB-1BAD1BBA-1BFF1C38-1C3A1C4A-1C4C1C80-1CCF1CF3-1CFF1DE7-1DFC1F161F171F1E1F1F1F461F471F4E1F4F1F581F5A1F5C1F5E1F7E1F7F1FB51FC51FD41FD51FDC1FF01FF11FF51FFF200B-200F202A-202E2060-206F20722073208F2095-209F20B9-20CF20F1-20FF218A-218F23E9-23FF2427-243F244B-245F26CE26E226E4-26E727002705270A270B2728274C274E2753-2755275F27602795-279727B027BF27CB27CD-27CF2B4D-2B4F2B5A-2BFF2C2F2C5F2CF2-2CF82D26-2D2F2D66-2D6E2D70-2D7F2D97-2D9F2DA72DAF2DB72DBF2DC72DCF2DD72DDF2E32-2E7F2E9A2EF4-2EFF2FD6-2FEF2FFC-2FFF3040309730983100-3104312E-3130318F31B8-31BF31E4-31EF321F32FF4DB6-4DBF9FCC-9FFFA48D-A48FA4C7-A4CFA62C-A63FA660A661A674-A67BA698-A69FA6F8-A6FFA78D-A7FAA82C-A82FA83A-A83FA878-A87FA8C5-A8CDA8DA-A8DFA8FC-A8FFA954-A95EA97D-A97FA9CEA9DA-A9DDA9E0-A9FFAA37-AA3FAA4EAA4FAA5AAA5BAA7C-AA7FAAC3-AADAAAE0-ABBFABEEABEFABFA-ABFFD7A4-D7AFD7C7-D7CAD7FC-F8FFFA2EFA2FFA6EFA6FFADA-FAFFFB07-FB12FB18-FB1CFB37FB3DFB3FFB42FB45FBB2-FBD2FD40-FD4FFD90FD91FDC8-FDEFFDFEFDFFFE1A-FE1FFE27-FE2FFE53FE67FE6C-FE6FFE75FEFD-FF00FFBF-FFC1FFC8FFC9FFD0FFD1FFD8FFD9FFDD-FFDFFFE7FFEF-FFFBFFFEFFFF", Cc: "0000-001F007F-009F", Cf: "00AD0600-060306DD070F17B417B5200B-200F202A-202E2060-2064206A-206FFEFFFFF9-FFFB", Co: "E000-F8FF", Cs: "D800-DFFF", Cn: "03780379037F-0383038B038D03A20526-05300557055805600588058B-059005C8-05CF05EB-05EF05F5-05FF06040605061C061D0620065F070E074B074C07B2-07BF07FB-07FF082E082F083F-08FF093A093B094F095609570973-097809800984098D098E0991099209A909B109B3-09B509BA09BB09C509C609C909CA09CF-09D609D8-09DB09DE09E409E509FC-0A000A040A0B-0A0E0A110A120A290A310A340A370A3A0A3B0A3D0A43-0A460A490A4A0A4E-0A500A52-0A580A5D0A5F-0A650A76-0A800A840A8E0A920AA90AB10AB40ABA0ABB0AC60ACA0ACE0ACF0AD1-0ADF0AE40AE50AF00AF2-0B000B040B0D0B0E0B110B120B290B310B340B3A0B3B0B450B460B490B4A0B4E-0B550B58-0B5B0B5E0B640B650B72-0B810B840B8B-0B8D0B910B96-0B980B9B0B9D0BA0-0BA20BA5-0BA70BAB-0BAD0BBA-0BBD0BC3-0BC50BC90BCE0BCF0BD1-0BD60BD8-0BE50BFB-0C000C040C0D0C110C290C340C3A-0C3C0C450C490C4E-0C540C570C5A-0C5F0C640C650C70-0C770C800C810C840C8D0C910CA90CB40CBA0CBB0CC50CC90CCE-0CD40CD7-0CDD0CDF0CE40CE50CF00CF3-0D010D040D0D0D110D290D3A-0D3C0D450D490D4E-0D560D58-0D5F0D640D650D76-0D780D800D810D840D97-0D990DB20DBC0DBE0DBF0DC7-0DC90DCB-0DCE0DD50DD70DE0-0DF10DF5-0E000E3B-0E3E0E5C-0E800E830E850E860E890E8B0E8C0E8E-0E930E980EA00EA40EA60EA80EA90EAC0EBA0EBE0EBF0EC50EC70ECE0ECF0EDA0EDB0EDE-0EFF0F480F6D-0F700F8C-0F8F0F980FBD0FCD0FD9-0FFF10C6-10CF10FD-10FF1249124E124F12571259125E125F1289128E128F12B112B612B712BF12C112C612C712D7131113161317135B-135E137D-137F139A-139F13F5-13FF169D-169F16F1-16FF170D1715-171F1737-173F1754-175F176D17711774-177F17DE17DF17EA-17EF17FA-17FF180F181A-181F1878-187F18AB-18AF18F6-18FF191D-191F192C-192F193C-193F1941-1943196E196F1975-197F19AC-19AF19CA-19CF19DB-19DD1A1C1A1D1A5F1A7D1A7E1A8A-1A8F1A9A-1A9F1AAE-1AFF1B4C-1B4F1B7D-1B7F1BAB-1BAD1BBA-1BFF1C38-1C3A1C4A-1C4C1C80-1CCF1CF3-1CFF1DE7-1DFC1F161F171F1E1F1F1F461F471F4E1F4F1F581F5A1F5C1F5E1F7E1F7F1FB51FC51FD41FD51FDC1FF01FF11FF51FFF2065-206920722073208F2095-209F20B9-20CF20F1-20FF218A-218F23E9-23FF2427-243F244B-245F26CE26E226E4-26E727002705270A270B2728274C274E2753-2755275F27602795-279727B027BF27CB27CD-27CF2B4D-2B4F2B5A-2BFF2C2F2C5F2CF2-2CF82D26-2D2F2D66-2D6E2D70-2D7F2D97-2D9F2DA72DAF2DB72DBF2DC72DCF2DD72DDF2E32-2E7F2E9A2EF4-2EFF2FD6-2FEF2FFC-2FFF3040309730983100-3104312E-3130318F31B8-31BF31E4-31EF321F32FF4DB6-4DBF9FCC-9FFFA48D-A48FA4C7-A4CFA62C-A63FA660A661A674-A67BA698-A69FA6F8-A6FFA78D-A7FAA82C-A82FA83A-A83FA878-A87FA8C5-A8CDA8DA-A8DFA8FC-A8FFA954-A95EA97D-A97FA9CEA9DA-A9DDA9E0-A9FFAA37-AA3FAA4EAA4FAA5AAA5BAA7C-AA7FAAC3-AADAAAE0-ABBFABEEABEFABFA-ABFFD7A4-D7AFD7C7-D7CAD7FC-D7FFFA2EFA2FFA6EFA6FFADA-FAFFFB07-FB12FB18-FB1CFB37FB3DFB3FFB42FB45FBB2-FBD2FD40-FD4FFD90FD91FDC8-FDEFFDFEFDFFFE1A-FE1FFE27-FE2FFE53FE67FE6C-FE6FFE75FEFDFEFEFF00FFBF-FFC1FFC8FFC9FFD0FFD1FFD8FFD9FFDD-FFDFFFE7FFEF-FFF8FFFEFFFF" }); function addUnicodePackage (pack) { var codePoint = /\w{4}/g; for (var name in pack) exports.packages[name] = pack[name].replace(codePoint, "\\u$&"); }; }); define('ace/token_iterator', ['require', 'exports', 'module' ], function(require, exports, module) { var TokenIterator = function(session, initialRow, initialColumn) { this.$session = session; this.$row = initialRow; this.$rowTokens = session.getTokens(initialRow); var token = session.getTokenAt(initialRow, initialColumn); this.$tokenIndex = token ? token.index : -1; }; (function() { this.stepBackward = function() { this.$tokenIndex -= 1; while (this.$tokenIndex < 0) { this.$row -= 1; if (this.$row < 0) { this.$row = 0; return null; } this.$rowTokens = this.$session.getTokens(this.$row); this.$tokenIndex = this.$rowTokens.length - 1; } return this.$rowTokens[this.$tokenIndex]; }; this.stepForward = function() { this.$tokenIndex += 1; var rowCount; while (this.$tokenIndex >= this.$rowTokens.length) { this.$row += 1; if (!rowCount) rowCount = this.$session.getLength(); if (this.$row >= rowCount) { this.$row = rowCount - 1; return null; } this.$rowTokens = this.$session.getTokens(this.$row); this.$tokenIndex = 0; } return this.$rowTokens[this.$tokenIndex]; }; this.getCurrentToken = function () { return this.$rowTokens[this.$tokenIndex]; }; this.getCurrentTokenRow = function () { return this.$row; }; this.getCurrentTokenColumn = function() { var rowTokens = this.$rowTokens; var tokenIndex = this.$tokenIndex; var column = rowTokens[tokenIndex].start; if (column !== undefined) return column; column = 0; while (tokenIndex > 0) { tokenIndex -= 1; column += rowTokens[tokenIndex].value.length; } return column; }; }).call(TokenIterator.prototype); exports.TokenIterator = TokenIterator; }); define('ace/document', ['require', 'exports', 'module' , 'ace/lib/oop', 'ace/lib/event_emitter', 'ace/range', 'ace/anchor'], function(require, exports, module) { var oop = require("./lib/oop"); var EventEmitter = require("./lib/event_emitter").EventEmitter; var Range = require("./range").Range; var Anchor = require("./anchor").Anchor; var Document = function(text) { this.$lines = []; if (text.length == 0) { this.$lines = [""]; } else if (Array.isArray(text)) { this._insertLines(0, text); } else { this.insert({row: 0, column:0}, text); } }; (function() { oop.implement(this, EventEmitter); this.setValue = function(text) { var len = this.getLength(); this.remove(new Range(0, 0, len, this.getLine(len-1).length)); this.insert({row: 0, column:0}, text); }; this.getValue = function() { return this.getAllLines().join(this.getNewLineCharacter()); }; this.createAnchor = function(row, column) { return new Anchor(this, row, column); }; if ("aaa".split(/a/).length == 0) this.$split = function(text) { return text.replace(/\r\n|\r/g, "\n").split("\n"); } else this.$split = function(text) { return text.split(/\r\n|\r|\n/); }; this.$detectNewLine = function(text) { var match = text.match(/^.*?(\r\n|\r|\n)/m); this.$autoNewLine = match ? match[1] : "\n"; }; this.getNewLineCharacter = function() { switch (this.$newLineMode) { case "windows": return "\r\n"; case "unix": return "\n"; default: return this.$autoNewLine; } }; this.$autoNewLine = "\n"; this.$newLineMode = "auto"; this.setNewLineMode = function(newLineMode) { if (this.$newLineMode === newLineMode) return; this.$newLineMode = newLineMode; }; this.getNewLineMode = function() { return this.$newLineMode; }; this.isNewLine = function(text) { return (text == "\r\n" || text == "\r" || text == "\n"); }; this.getLine = function(row) { return this.$lines[row] || ""; }; this.getLines = function(firstRow, lastRow) { return this.$lines.slice(firstRow, lastRow + 1); }; this.getAllLines = function() { return this.getLines(0, this.getLength()); }; this.getLength = function() { return this.$lines.length; }; this.getTextRange = function(range) { if (range.start.row == range.end.row) { return this.getLine(range.start.row) .substring(range.start.column, range.end.column); } var lines = this.getLines(range.start.row, range.end.row); lines[0] = (lines[0] || "").substring(range.start.column); var l = lines.length - 1; if (range.end.row - range.start.row == l) lines[l] = lines[l].substring(0, range.end.column); return lines.join(this.getNewLineCharacter()); }; this.$clipPosition = function(position) { var length = this.getLength(); if (position.row >= length) { position.row = Math.max(0, length - 1); position.column = this.getLine(length-1).length; } else if (position.row < 0) position.row = 0; return position; }; this.insert = function(position, text) { if (!text || text.length === 0) return position; position = this.$clipPosition(position); if (this.getLength() <= 1) this.$detectNewLine(text); var lines = this.$split(text); var firstLine = lines.splice(0, 1)[0]; var lastLine = lines.length == 0 ? null : lines.splice(lines.length - 1, 1)[0]; position = this.insertInLine(position, firstLine); if (lastLine !== null) { position = this.insertNewLine(position); // terminate first line position = this._insertLines(position.row, lines); position = this.insertInLine(position, lastLine || ""); } return position; }; this.insertLines = function(row, lines) { if (row >= this.getLength()) return this.insert({row: row, column: 0}, "\n" + lines.join("\n")); return this._insertLines(Math.max(row, 0), lines); }; this._insertLines = function(row, lines) { if (lines.length == 0) return {row: row, column: 0}; if (lines.length > 0xFFFF) { var end = this._insertLines(row, lines.slice(0xFFFF)); lines = lines.slice(0, 0xFFFF); } var args = [row, 0]; args.push.apply(args, lines); this.$lines.splice.apply(this.$lines, args); var range = new Range(row, 0, row + lines.length, 0); var delta = { action: "insertLines", range: range, lines: lines }; this._emit("change", { data: delta }); return end || range.end; }; this.insertNewLine = function(position) { position = this.$clipPosition(position); var line = this.$lines[position.row] || ""; this.$lines[position.row] = line.substring(0, position.column); this.$lines.splice(position.row + 1, 0, line.substring(position.column, line.length)); var end = { row : position.row + 1, column : 0 }; var delta = { action: "insertText", range: Range.fromPoints(position, end), text: this.getNewLineCharacter() }; this._emit("change", { data: delta }); return end; }; this.insertInLine = function(position, text) { if (text.length == 0) return position; var line = this.$lines[position.row] || ""; this.$lines[position.row] = line.substring(0, position.column) + text + line.substring(position.column); var end = { row : position.row, column : position.column + text.length }; var delta = { action: "insertText", range: Range.fromPoints(position, end), text: text }; this._emit("change", { data: delta }); return end; }; this.remove = function(range) { if (!range instanceof Range) range = Range.fromPoints(range.start, range.end); range.start = this.$clipPosition(range.start); range.end = this.$clipPosition(range.end); if (range.isEmpty()) return range.start; var firstRow = range.start.row; var lastRow = range.end.row; if (range.isMultiLine()) { var firstFullRow = range.start.column == 0 ? firstRow : firstRow + 1; var lastFullRow = lastRow - 1; if (range.end.column > 0) this.removeInLine(lastRow, 0, range.end.column); if (lastFullRow >= firstFullRow) this._removeLines(firstFullRow, lastFullRow); if (firstFullRow != firstRow) { this.removeInLine(firstRow, range.start.column, this.getLine(firstRow).length); this.removeNewLine(range.start.row); } } else { this.removeInLine(firstRow, range.start.column, range.end.column); } return range.start; }; this.removeInLine = function(row, startColumn, endColumn) { if (startColumn == endColumn) return; var range = new Range(row, startColumn, row, endColumn); var line = this.getLine(row); var removed = line.substring(startColumn, endColumn); var newLine = line.substring(0, startColumn) + line.substring(endColumn, line.length); this.$lines.splice(row, 1, newLine); var delta = { action: "removeText", range: range, text: removed }; this._emit("change", { data: delta }); return range.start; }; this.removeLines = function(firstRow, lastRow) { if (firstRow < 0 || lastRow >= this.getLength()) return this.remove(new Range(firstRow, 0, lastRow + 1, 0)); return this._removeLines(firstRow, lastRow); }; this._removeLines = function(firstRow, lastRow) { var range = new Range(firstRow, 0, lastRow + 1, 0); var removed = this.$lines.splice(firstRow, lastRow - firstRow + 1); var delta = { action: "removeLines", range: range, nl: this.getNewLineCharacter(), lines: removed }; this._emit("change", { data: delta }); return removed; }; this.removeNewLine = function(row) { var firstLine = this.getLine(row); var secondLine = this.getLine(row+1); var range = new Range(row, firstLine.length, row+1, 0); var line = firstLine + secondLine; this.$lines.splice(row, 2, line); var delta = { action: "removeText", range: range, text: this.getNewLineCharacter() }; this._emit("change", { data: delta }); }; this.replace = function(range, text) { if (!range instanceof Range) range = Range.fromPoints(range.start, range.end); if (text.length == 0 && range.isEmpty()) return range.start; if (text == this.getTextRange(range)) return range.end; this.remove(range); if (text) { var end = this.insert(range.start, text); } else { end = range.start; } return end; }; this.applyDeltas = function(deltas) { for (var i=0; i=0; i--) { var delta = deltas[i]; var range = Range.fromPoints(delta.range.start, delta.range.end); if (delta.action == "insertLines") this._removeLines(range.start.row, range.end.row - 1); else if (delta.action == "insertText") this.remove(range); else if (delta.action == "removeLines") this._insertLines(range.start.row, delta.lines); else if (delta.action == "removeText") this.insert(range.start, delta.text); } }; this.indexToPosition = function(index, startRow) { var lines = this.$lines || this.getAllLines(); var newlineLength = this.getNewLineCharacter().length; for (var i = startRow || 0, l = lines.length; i < l; i++) { index -= lines[i].length + newlineLength; if (index < 0) return {row: i, column: index + lines[i].length + newlineLength}; } return {row: l-1, column: lines[l-1].length}; }; this.positionToIndex = function(pos, startRow) { var lines = this.$lines || this.getAllLines(); var newlineLength = this.getNewLineCharacter().length; var index = 0; var row = Math.min(pos.row, lines.length); for (var i = startRow || 0; i < row; ++i) index += lines[i].length + newlineLength; return index + pos.column; }; }).call(Document.prototype); exports.Document = Document; }); define('ace/anchor', ['require', 'exports', 'module' , 'ace/lib/oop', 'ace/lib/event_emitter'], function(require, exports, module) { var oop = require("./lib/oop"); var EventEmitter = require("./lib/event_emitter").EventEmitter; var Anchor = exports.Anchor = function(doc, row, column) { this.$onChange = this.onChange.bind(this); this.attach(doc); if (typeof column == "undefined") this.setPosition(row.row, row.column); else this.setPosition(row, column); }; (function() { oop.implement(this, EventEmitter); this.getPosition = function() { return this.$clipPositionToDocument(this.row, this.column); }; this.getDocument = function() { return this.document; }; this.$insertRight = false; this.onChange = function(e) { var delta = e.data; var range = delta.range; if (range.start.row == range.end.row && range.start.row != this.row) return; if (range.start.row > this.row) return; if (range.start.row == this.row && range.start.column > this.column) return; var row = this.row; var column = this.column; var start = range.start; var end = range.end; if (delta.action === "insertText") { if (start.row === row && start.column <= column) { if (start.column === column && this.$insertRight) { } else if (start.row === end.row) { column += end.column - start.column; } else { column -= start.column; row += end.row - start.row; } } else if (start.row !== end.row && start.row < row) { row += end.row - start.row; } } else if (delta.action === "insertLines") { if (start.row <= row) { row += end.row - start.row; } } else if (delta.action === "removeText") { if (start.row === row && start.column < column) { if (end.column >= column) column = start.column; else column = Math.max(0, column - (end.column - start.column)); } else if (start.row !== end.row && start.row < row) { if (end.row === row) column = Math.max(0, column - end.column) + start.column; row -= (end.row - start.row); } else if (end.row === row) { row -= end.row - start.row; column = Math.max(0, column - end.column) + start.column; } } else if (delta.action == "removeLines") { if (start.row <= row) { if (end.row <= row) row -= end.row - start.row; else { row = start.row; column = 0; } } } this.setPosition(row, column, true); }; this.setPosition = function(row, column, noClip) { var pos; if (noClip) { pos = { row: row, column: column }; } else { pos = this.$clipPositionToDocument(row, column); } if (this.row == pos.row && this.column == pos.column) return; var old = { row: this.row, column: this.column }; this.row = pos.row; this.column = pos.column; this._emit("change", { old: old, value: pos }); }; this.detach = function() { this.document.removeEventListener("change", this.$onChange); }; this.attach = function(doc) { this.document = doc || this.document; this.document.on("change", this.$onChange); }; this.$clipPositionToDocument = function(row, column) { var pos = {}; if (row >= this.document.getLength()) { pos.row = Math.max(0, this.document.getLength() - 1); pos.column = this.document.getLine(pos.row).length; } else if (row < 0) { pos.row = 0; pos.column = 0; } else { pos.row = row; pos.column = Math.min(this.document.getLine(pos.row).length, Math.max(0, column)); } if (column < 0) pos.column = 0; return pos; }; }).call(Anchor.prototype); }); define('ace/background_tokenizer', ['require', 'exports', 'module' , 'ace/lib/oop', 'ace/lib/event_emitter'], function(require, exports, module) { var oop = require("./lib/oop"); var EventEmitter = require("./lib/event_emitter").EventEmitter; var BackgroundTokenizer = function(tokenizer, editor) { this.running = false; this.lines = []; this.states = []; this.currentLine = 0; this.tokenizer = tokenizer; var self = this; this.$worker = function() { if (!self.running) { return; } var workerStart = new Date(); var currentLine = self.currentLine; var endLine = -1; var doc = self.doc; while (self.lines[currentLine]) currentLine++; var startLine = currentLine; var len = doc.getLength(); var processedLines = 0; self.running = false; while (currentLine < len) { self.$tokenizeRow(currentLine); endLine = currentLine; do { currentLine++; } while (self.lines[currentLine]); processedLines ++; if ((processedLines % 5 == 0) && (new Date() - workerStart) > 20) { self.running = setTimeout(self.$worker, 20); self.currentLine = currentLine; return; } } self.currentLine = currentLine; if (startLine <= endLine) self.fireUpdateEvent(startLine, endLine); }; }; (function(){ oop.implement(this, EventEmitter); this.setTokenizer = function(tokenizer) { this.tokenizer = tokenizer; this.lines = []; this.states = []; this.start(0); }; this.setDocument = function(doc) { this.doc = doc; this.lines = []; this.states = []; this.stop(); }; this.fireUpdateEvent = function(firstRow, lastRow) { var data = { first: firstRow, last: lastRow }; this._emit("update", {data: data}); }; this.start = function(startRow) { this.currentLine = Math.min(startRow || 0, this.currentLine, this.doc.getLength()); this.lines.splice(this.currentLine, this.lines.length); this.states.splice(this.currentLine, this.states.length); this.stop(); this.running = setTimeout(this.$worker, 700); }; this.scheduleStart = function() { if (!this.running) this.running = setTimeout(this.$worker, 700); } this.$updateOnChange = function(delta) { var range = delta.range; var startRow = range.start.row; var len = range.end.row - startRow; if (len === 0) { this.lines[startRow] = null; } else if (delta.action == "removeText" || delta.action == "removeLines") { this.lines.splice(startRow, len + 1, null); this.states.splice(startRow, len + 1, null); } else { var args = Array(len + 1); args.unshift(startRow, 1); this.lines.splice.apply(this.lines, args); this.states.splice.apply(this.states, args); } this.currentLine = Math.min(startRow, this.currentLine, this.doc.getLength()); this.stop(); }; this.stop = function() { if (this.running) clearTimeout(this.running); this.running = false; }; this.getTokens = function(row) { return this.lines[row] || this.$tokenizeRow(row); }; this.getState = function(row) { if (this.currentLine == row) this.$tokenizeRow(row); return this.states[row] || "start"; }; this.$tokenizeRow = function(row) { var line = this.doc.getLine(row); var state = this.states[row - 1]; var data = this.tokenizer.getLineTokens(line, state, row); if (this.states[row] + "" !== data.state + "") { this.states[row] = data.state; this.lines[row + 1] = null; if (this.currentLine > row + 1) this.currentLine = row + 1; } else if (this.currentLine == row) { this.currentLine = row + 1; } return this.lines[row] = data.tokens; }; }).call(BackgroundTokenizer.prototype); exports.BackgroundTokenizer = BackgroundTokenizer; }); define('ace/search_highlight', ['require', 'exports', 'module' , 'ace/lib/lang', 'ace/lib/oop', 'ace/range'], function(require, exports, module) { var lang = require("./lib/lang"); var oop = require("./lib/oop"); var Range = require("./range").Range; var SearchHighlight = function(regExp, clazz, type) { this.setRegexp(regExp); this.clazz = clazz; this.type = type || "text"; }; (function() { this.MAX_RANGES = 500; this.setRegexp = function(regExp) { if (this.regExp+"" == regExp+"") return; this.regExp = regExp; this.cache = []; }; this.update = function(html, markerLayer, session, config) { if (!this.regExp) return; var start = config.firstRow, end = config.lastRow; for (var i = start; i <= end; i++) { var ranges = this.cache[i]; if (ranges == null) { ranges = lang.getMatchOffsets(session.getLine(i), this.regExp); if (ranges.length > this.MAX_RANGES) ranges = ranges.slice(0, this.MAX_RANGES); ranges = ranges.map(function(match) { return new Range(i, match.offset, i, match.offset + match.length); }); this.cache[i] = ranges.length ? ranges : ""; } for (var j = ranges.length; j --; ) { markerLayer.drawSingleLineMarker( html, ranges[j].toScreenRange(session), this.clazz, config); } } }; }).call(SearchHighlight.prototype); exports.SearchHighlight = SearchHighlight; }); define('ace/edit_session/folding', ['require', 'exports', 'module' , 'ace/range', 'ace/edit_session/fold_line', 'ace/edit_session/fold', 'ace/token_iterator'], function(require, exports, module) { var Range = require("../range").Range; var FoldLine = require("./fold_line").FoldLine; var Fold = require("./fold").Fold; var TokenIterator = require("../token_iterator").TokenIterator; function Folding() { this.getFoldAt = function(row, column, side) { var foldLine = this.getFoldLine(row); if (!foldLine) return null; var folds = foldLine.folds; for (var i = 0; i < folds.length; i++) { var fold = folds[i]; if (fold.range.contains(row, column)) { if (side == 1 && fold.range.isEnd(row, column)) { continue; } else if (side == -1 && fold.range.isStart(row, column)) { continue; } return fold; } } }; this.getFoldsInRange = function(range) { var start = range.start; var end = range.end; var foldLines = this.$foldData; var foundFolds = []; start.column += 1; end.column -= 1; for (var i = 0; i < foldLines.length; i++) { var cmp = foldLines[i].range.compareRange(range); if (cmp == 2) { continue; } else if (cmp == -2) { break; } var folds = foldLines[i].folds; for (var j = 0; j < folds.length; j++) { var fold = folds[j]; cmp = fold.range.compareRange(range); if (cmp == -2) { break; } else if (cmp == 2) { continue; } else if (cmp == 42) { break; } foundFolds.push(fold); } } start.column -= 1; end.column += 1; return foundFolds; }; this.getAllFolds = function() { var folds = []; var foldLines = this.$foldData; function addFold(fold) { folds.push(fold); } for (var i = 0; i < foldLines.length; i++) for (var j = 0; j < foldLines[i].folds.length; j++) addFold(foldLines[i].folds[j]); return folds; }; this.getFoldStringAt = function(row, column, trim, foldLine) { foldLine = foldLine || this.getFoldLine(row); if (!foldLine) return null; var lastFold = { end: { column: 0 } }; var str, fold; for (var i = 0; i < foldLine.folds.length; i++) { fold = foldLine.folds[i]; var cmp = fold.range.compareEnd(row, column); if (cmp == -1) { str = this .getLine(fold.start.row) .substring(lastFold.end.column, fold.start.column); break; } else if (cmp === 0) { return null; } lastFold = fold; } if (!str) str = this.getLine(fold.start.row).substring(lastFold.end.column); if (trim == -1) return str.substring(0, column - lastFold.end.column); else if (trim == 1) return str.substring(column - lastFold.end.column); else return str; }; this.getFoldLine = function(docRow, startFoldLine) { var foldData = this.$foldData; var i = 0; if (startFoldLine) i = foldData.indexOf(startFoldLine); if (i == -1) i = 0; for (i; i < foldData.length; i++) { var foldLine = foldData[i]; if (foldLine.start.row <= docRow && foldLine.end.row >= docRow) { return foldLine; } else if (foldLine.end.row > docRow) { return null; } } return null; }; this.getNextFoldLine = function(docRow, startFoldLine) { var foldData = this.$foldData; var i = 0; if (startFoldLine) i = foldData.indexOf(startFoldLine); if (i == -1) i = 0; for (i; i < foldData.length; i++) { var foldLine = foldData[i]; if (foldLine.end.row >= docRow) { return foldLine; } } return null; }; this.getFoldedRowCount = function(first, last) { var foldData = this.$foldData, rowCount = last-first+1; for (var i = 0; i < foldData.length; i++) { var foldLine = foldData[i], end = foldLine.end.row, start = foldLine.start.row; if (end >= last) { if(start < last) { if(start >= first) rowCount -= last-start; else rowCount = 0;//in one fold } break; } else if(end >= first){ if (start >= first) //fold inside range rowCount -= end-start; else rowCount -= end-first+1; } } return rowCount; }; this.$addFoldLine = function(foldLine) { this.$foldData.push(foldLine); this.$foldData.sort(function(a, b) { return a.start.row - b.start.row; }); return foldLine; }; this.addFold = function(placeholder, range) { var foldData = this.$foldData; var added = false; var fold; if (placeholder instanceof Fold) fold = placeholder; else { fold = new Fold(range, placeholder); fold.collapseChildren = range.collapseChildren; } this.$clipRangeToDocument(fold.range); var startRow = fold.start.row; var startColumn = fold.start.column; var endRow = fold.end.row; var endColumn = fold.end.column; if (!(startRow < endRow || startRow == endRow && startColumn <= endColumn - 2)) throw new Error("The range has to be at least 2 characters width"); var startFold = this.getFoldAt(startRow, startColumn, 1); var endFold = this.getFoldAt(endRow, endColumn, -1); if (startFold && endFold == startFold) return startFold.addSubFold(fold); if ( (startFold && !startFold.range.isStart(startRow, startColumn)) || (endFold && !endFold.range.isEnd(endRow, endColumn)) ) { throw new Error("A fold can't intersect already existing fold" + fold.range + startFold.range); } var folds = this.getFoldsInRange(fold.range); if (folds.length > 0) { this.removeFolds(folds); folds.forEach(function(subFold) { fold.addSubFold(subFold); }); } for (var i = 0; i < foldData.length; i++) { var foldLine = foldData[i]; if (endRow == foldLine.start.row) { foldLine.addFold(fold); added = true; break; } else if (startRow == foldLine.end.row) { foldLine.addFold(fold); added = true; if (!fold.sameRow) { var foldLineNext = foldData[i + 1]; if (foldLineNext && foldLineNext.start.row == endRow) { foldLine.merge(foldLineNext); break; } } break; } else if (endRow <= foldLine.start.row) { break; } } if (!added) foldLine = this.$addFoldLine(new FoldLine(this.$foldData, fold)); if (this.$useWrapMode) this.$updateWrapData(foldLine.start.row, foldLine.start.row); else this.$updateRowLengthCache(foldLine.start.row, foldLine.start.row); this.$modified = true; this._emit("changeFold", { data: fold, action: "add" }); return fold; }; this.addFolds = function(folds) { folds.forEach(function(fold) { this.addFold(fold); }, this); }; this.removeFold = function(fold) { var foldLine = fold.foldLine; var startRow = foldLine.start.row; var endRow = foldLine.end.row; var foldLines = this.$foldData; var folds = foldLine.folds; if (folds.length == 1) { foldLines.splice(foldLines.indexOf(foldLine), 1); } else if (foldLine.range.isEnd(fold.end.row, fold.end.column)) { folds.pop(); foldLine.end.row = folds[folds.length - 1].end.row; foldLine.end.column = folds[folds.length - 1].end.column; } else if (foldLine.range.isStart(fold.start.row, fold.start.column)) { folds.shift(); foldLine.start.row = folds[0].start.row; foldLine.start.column = folds[0].start.column; } else if (fold.sameRow) { folds.splice(folds.indexOf(fold), 1); } else { var newFoldLine = foldLine.split(fold.start.row, fold.start.column); folds = newFoldLine.folds; folds.shift(); newFoldLine.start.row = folds[0].start.row; newFoldLine.start.column = folds[0].start.column; } if (!this.$updating) { if (this.$useWrapMode) this.$updateWrapData(startRow, endRow); else this.$updateRowLengthCache(startRow, endRow); } this.$modified = true; this._emit("changeFold", { data: fold, action: "remove" }); }; this.removeFolds = function(folds) { var cloneFolds = []; for (var i = 0; i < folds.length; i++) { cloneFolds.push(folds[i]); } cloneFolds.forEach(function(fold) { this.removeFold(fold); }, this); this.$modified = true; }; this.expandFold = function(fold) { this.removeFold(fold); fold.subFolds.forEach(function(subFold) { fold.restoreRange(subFold); this.addFold(subFold); }, this); if (fold.collapseChildren > 0) { this.foldAll(fold.start.row+1, fold.end.row, fold.collapseChildren-1); } fold.subFolds = []; }; this.expandFolds = function(folds) { folds.forEach(function(fold) { this.expandFold(fold); }, this); }; this.unfold = function(location, expandInner) { var range, folds; if (location == null) { range = new Range(0, 0, this.getLength(), 0); expandInner = true; } else if (typeof location == "number") range = new Range(location, 0, location, this.getLine(location).length); else if ("row" in location) range = Range.fromPoints(location, location); else range = location; folds = this.getFoldsInRange(range); if (expandInner) { this.removeFolds(folds); } else { while (folds.length) { this.expandFolds(folds); folds = this.getFoldsInRange(range); } } }; this.isRowFolded = function(docRow, startFoldRow) { return !!this.getFoldLine(docRow, startFoldRow); }; this.getRowFoldEnd = function(docRow, startFoldRow) { var foldLine = this.getFoldLine(docRow, startFoldRow); return foldLine ? foldLine.end.row : docRow; }; this.getRowFoldStart = function(docRow, startFoldRow) { var foldLine = this.getFoldLine(docRow, startFoldRow); return foldLine ? foldLine.start.row : docRow; }; this.getFoldDisplayLine = function(foldLine, endRow, endColumn, startRow, startColumn) { if (startRow == null) { startRow = foldLine.start.row; startColumn = 0; } if (endRow == null) { endRow = foldLine.end.row; endColumn = this.getLine(endRow).length; } var doc = this.doc; var textLine = ""; foldLine.walk(function(placeholder, row, column, lastColumn) { if (row < startRow) return; if (row == startRow) { if (column < startColumn) return; lastColumn = Math.max(startColumn, lastColumn); } if (placeholder != null) { textLine += placeholder; } else { textLine += doc.getLine(row).substring(lastColumn, column); } }, endRow, endColumn); return textLine; }; this.getDisplayLine = function(row, endColumn, startRow, startColumn) { var foldLine = this.getFoldLine(row); if (!foldLine) { var line; line = this.doc.getLine(row); return line.substring(startColumn || 0, endColumn || line.length); } else { return this.getFoldDisplayLine( foldLine, row, endColumn, startRow, startColumn); } }; this.$cloneFoldData = function() { var fd = []; fd = this.$foldData.map(function(foldLine) { var folds = foldLine.folds.map(function(fold) { return fold.clone(); }); return new FoldLine(fd, folds); }); return fd; }; this.toggleFold = function(tryToUnfold) { var selection = this.selection; var range = selection.getRange(); var fold; var bracketPos; if (range.isEmpty()) { var cursor = range.start; fold = this.getFoldAt(cursor.row, cursor.column); if (fold) { this.expandFold(fold); return; } else if (bracketPos = this.findMatchingBracket(cursor)) { if (range.comparePoint(bracketPos) == 1) { range.end = bracketPos; } else { range.start = bracketPos; range.start.column++; range.end.column--; } } else if (bracketPos = this.findMatchingBracket({row: cursor.row, column: cursor.column + 1})) { if (range.comparePoint(bracketPos) == 1) range.end = bracketPos; else range.start = bracketPos; range.start.column++; } else { range = this.getCommentFoldRange(cursor.row, cursor.column) || range; } } else { var folds = this.getFoldsInRange(range); if (tryToUnfold && folds.length) { this.expandFolds(folds); return; } else if (folds.length == 1 ) { fold = folds[0]; } } if (!fold) fold = this.getFoldAt(range.start.row, range.start.column); if (fold && fold.range.toString() == range.toString()) { this.expandFold(fold); return; } var placeholder = "..."; if (!range.isMultiLine()) { placeholder = this.getTextRange(range); if(placeholder.length < 4) return; placeholder = placeholder.trim().substring(0, 2) + ".."; } this.addFold(placeholder, range); }; this.getCommentFoldRange = function(row, column, dir) { var iterator = new TokenIterator(this, row, column); var token = iterator.getCurrentToken(); if (token && /^comment|string/.test(token.type)) { var range = new Range(); var re = new RegExp(token.type.replace(/\..*/, "\\.")); if (dir != 1) { do { token = iterator.stepBackward(); } while(token && re.test(token.type)); iterator.stepForward(); } range.start.row = iterator.getCurrentTokenRow(); range.start.column = iterator.getCurrentTokenColumn() + 2; iterator = new TokenIterator(this, row, column); if (dir != -1) { do { token = iterator.stepForward(); } while(token && re.test(token.type)); token = iterator.stepBackward(); } else token = iterator.getCurrentToken(); range.end.row = iterator.getCurrentTokenRow(); range.end.column = iterator.getCurrentTokenColumn() + token.value.length - 2; return range; } }; this.foldAll = function(startRow, endRow, depth) { if (depth == undefined) depth = 100000; // JSON.stringify doesn't hanle Infinity var foldWidgets = this.foldWidgets; endRow = endRow || this.getLength(); startRow = startRow || 0; for (var row = startRow; row < endRow; row++) { if (foldWidgets[row] == null) foldWidgets[row] = this.getFoldWidget(row); if (foldWidgets[row] != "start") continue; var range = this.getFoldWidgetRange(row); var rangeEndRow = range.end.row; if (range && range.isMultiLine() && rangeEndRow <= endRow && range.start.row >= startRow ) try { var fold = this.addFold("...", range); fold.collapseChildren = depth; row = rangeEndRow; } catch(e) {} } }; this.$foldStyles = { "manual": 1, "markbegin": 1, "markbeginend": 1 }; this.$foldStyle = "markbegin"; this.setFoldStyle = function(style) { if (!this.$foldStyles[style]) throw new Error("invalid fold style: " + style + "[" + Object.keys(this.$foldStyles).join(", ") + "]"); if (this.$foldStyle == style) return; this.$foldStyle = style; if (style == "manual") this.unfold(); var mode = this.$foldMode; this.$setFolding(null); this.$setFolding(mode); }; this.$setFolding = function(foldMode) { if (this.$foldMode == foldMode) return; this.$foldMode = foldMode; this.removeListener('change', this.$updateFoldWidgets); this._emit("changeAnnotation"); if (!foldMode || this.$foldStyle == "manual") { this.foldWidgets = null; return; } this.foldWidgets = []; this.getFoldWidget = foldMode.getFoldWidget.bind(foldMode, this, this.$foldStyle); this.getFoldWidgetRange = foldMode.getFoldWidgetRange.bind(foldMode, this, this.$foldStyle); this.$updateFoldWidgets = this.updateFoldWidgets.bind(this); this.on('change', this.$updateFoldWidgets); }; this.getParentFoldRangeData = function (row, ignoreCurrent) { var fw = this.foldWidgets; if (!fw || (ignoreCurrent && fw[row])) return {}; var i = row - 1, firstRange; while (i >= 0) { var c = fw[i]; if (c == null) c = fw[i] = this.getFoldWidget(i); if (c == "start") { var range = this.getFoldWidgetRange(i); if (!firstRange) firstRange = range; if (range && range.end.row >= row) break; } i--; } return { range: i !== -1 && range, firstRange: firstRange }; } this.onFoldWidgetClick = function(row, e) { var type = this.getFoldWidget(row); var line = this.getLine(row); e = e.domEvent; var children = e.shiftKey; var all = e.ctrlKey || e.metaKey; var siblings = e.altKey; var dir = type === "end" ? -1 : 1; var fold = this.getFoldAt(row, dir === -1 ? 0 : line.length, dir); if (fold) { if (children || all) this.removeFold(fold); else this.expandFold(fold); return; } var range = this.getFoldWidgetRange(row); if (range && !range.isMultiLine()) { fold = this.getFoldAt(range.start.row, range.start.column, 1); if (fold && range.isEqual(fold.range)) { this.removeFold(fold); return; } } if (siblings) { var data = this.getParentFoldRangeData(row); if (data.range) { var startRow = data.range.start.row + 1; var endRow = data.range.end.row; } this.foldAll(startRow, endRow, all ? 10000 : 0); } else if (children) { var endRow = range ? range.end.row : this.getLength(); this.foldAll(row + 1, range.end.row, all ? 10000 : 0); } else if (range) { if (all) range.collapseChildren = 10000; this.addFold("...", range); } if (!range) (e.target || e.srcElement).className += " ace_invalid" }; this.updateFoldWidgets = function(e) { var delta = e.data; var range = delta.range; var firstRow = range.start.row; var len = range.end.row - firstRow; if (len === 0) { this.foldWidgets[firstRow] = null; } else if (delta.action == "removeText" || delta.action == "removeLines") { this.foldWidgets.splice(firstRow, len + 1, null); } else { var args = Array(len + 1); args.unshift(firstRow, 1); this.foldWidgets.splice.apply(this.foldWidgets, args); } }; } exports.Folding = Folding; }); define('ace/edit_session/fold_line', ['require', 'exports', 'module' , 'ace/range'], function(require, exports, module) { var Range = require("../range").Range; function FoldLine(foldData, folds) { this.foldData = foldData; if (Array.isArray(folds)) { this.folds = folds; } else { folds = this.folds = [ folds ]; } var last = folds[folds.length - 1] this.range = new Range(folds[0].start.row, folds[0].start.column, last.end.row, last.end.column); this.start = this.range.start; this.end = this.range.end; this.folds.forEach(function(fold) { fold.setFoldLine(this); }, this); } (function() { this.shiftRow = function(shift) { this.start.row += shift; this.end.row += shift; this.folds.forEach(function(fold) { fold.start.row += shift; fold.end.row += shift; }); } this.addFold = function(fold) { if (fold.sameRow) { if (fold.start.row < this.startRow || fold.endRow > this.endRow) { throw new Error("Can't add a fold to this FoldLine as it has no connection"); } this.folds.push(fold); this.folds.sort(function(a, b) { return -a.range.compareEnd(b.start.row, b.start.column); }); if (this.range.compareEnd(fold.start.row, fold.start.column) > 0) { this.end.row = fold.end.row; this.end.column = fold.end.column; } else if (this.range.compareStart(fold.end.row, fold.end.column) < 0) { this.start.row = fold.start.row; this.start.column = fold.start.column; } } else if (fold.start.row == this.end.row) { this.folds.push(fold); this.end.row = fold.end.row; this.end.column = fold.end.column; } else if (fold.end.row == this.start.row) { this.folds.unshift(fold); this.start.row = fold.start.row; this.start.column = fold.start.column; } else { throw new Error("Trying to add fold to FoldRow that doesn't have a matching row"); } fold.foldLine = this; } this.containsRow = function(row) { return row >= this.start.row && row <= this.end.row; } this.walk = function(callback, endRow, endColumn) { var lastEnd = 0, folds = this.folds, fold, comp, stop, isNewRow = true; if (endRow == null) { endRow = this.end.row; endColumn = this.end.column; } for (var i = 0; i < folds.length; i++) { fold = folds[i]; comp = fold.range.compareStart(endRow, endColumn); if (comp == -1) { callback(null, endRow, endColumn, lastEnd, isNewRow); return; } stop = callback(null, fold.start.row, fold.start.column, lastEnd, isNewRow); stop = !stop && callback(fold.placeholder, fold.start.row, fold.start.column, lastEnd); if (stop || comp == 0) { return; } isNewRow = !fold.sameRow; lastEnd = fold.end.column; } callback(null, endRow, endColumn, lastEnd, isNewRow); } this.getNextFoldTo = function(row, column) { var fold, cmp; for (var i = 0; i < this.folds.length; i++) { fold = this.folds[i]; cmp = fold.range.compareEnd(row, column); if (cmp == -1) { return { fold: fold, kind: "after" }; } else if (cmp == 0) { return { fold: fold, kind: "inside" } } } return null; } this.addRemoveChars = function(row, column, len) { var ret = this.getNextFoldTo(row, column), fold, folds; if (ret) { fold = ret.fold; if (ret.kind == "inside" && fold.start.column != column && fold.start.row != row) { window.console && window.console.log(row, column, fold); } else if (fold.start.row == row) { folds = this.folds; var i = folds.indexOf(fold); if (i == 0) { this.start.column += len; } for (i; i < folds.length; i++) { fold = folds[i]; fold.start.column += len; if (!fold.sameRow) { return; } fold.end.column += len; } this.end.column += len; } } } this.split = function(row, column) { var fold = this.getNextFoldTo(row, column).fold; var folds = this.folds; var foldData = this.foldData; if (!fold) return null; var i = folds.indexOf(fold); var foldBefore = folds[i - 1]; this.end.row = foldBefore.end.row; this.end.column = foldBefore.end.column; folds = folds.splice(i, folds.length - i); var newFoldLine = new FoldLine(foldData, folds); foldData.splice(foldData.indexOf(this) + 1, 0, newFoldLine); return newFoldLine; } this.merge = function(foldLineNext) { var folds = foldLineNext.folds; for (var i = 0; i < folds.length; i++) { this.addFold(folds[i]); } var foldData = this.foldData; foldData.splice(foldData.indexOf(foldLineNext), 1); } this.toString = function() { var ret = [this.range.toString() + ": [" ]; this.folds.forEach(function(fold) { ret.push(" " + fold.toString()); }); ret.push("]") return ret.join("\n"); } this.idxToPosition = function(idx) { var lastFoldEndColumn = 0; var fold; for (var i = 0; i < this.folds.length; i++) { var fold = this.folds[i]; idx -= fold.start.column - lastFoldEndColumn; if (idx < 0) { return { row: fold.start.row, column: fold.start.column + idx }; } idx -= fold.placeholder.length; if (idx < 0) { return fold.start; } lastFoldEndColumn = fold.end.column; } return { row: this.end.row, column: this.end.column + idx }; } }).call(FoldLine.prototype); exports.FoldLine = FoldLine; }); define('ace/edit_session/fold', ['require', 'exports', 'module' , 'ace/range', 'ace/range_list', 'ace/lib/oop'], function(require, exports, module) { var Range = require("../range").Range; var RangeList = require("../range_list").RangeList; var oop = require("../lib/oop") var Fold = exports.Fold = function(range, placeholder) { this.foldLine = null; this.placeholder = placeholder; this.range = range; this.start = range.start; this.end = range.end; this.sameRow = range.start.row == range.end.row; this.subFolds = this.ranges = []; }; oop.inherits(Fold, RangeList); (function() { this.toString = function() { return '"' + this.placeholder + '" ' + this.range.toString(); }; this.setFoldLine = function(foldLine) { this.foldLine = foldLine; this.subFolds.forEach(function(fold) { fold.setFoldLine(foldLine); }); }; this.clone = function() { var range = this.range.clone(); var fold = new Fold(range, this.placeholder); this.subFolds.forEach(function(subFold) { fold.subFolds.push(subFold.clone()); }); fold.collapseChildren = this.collapseChildren; return fold; }; this.addSubFold = function(fold) { if (this.range.isEqual(fold)) return; if (!this.range.containsRange(fold)) throw new Error("A fold can't intersect already existing fold" + fold.range + this.range); consumeRange(fold, this.start); var row = fold.start.row, column = fold.start.column; for (var i = 0, cmp = -1; i < this.subFolds.length; i++) { cmp = this.subFolds[i].range.compare(row, column); if (cmp != 1) break; } var afterStart = this.subFolds[i]; if (cmp == 0) return afterStart.addSubFold(fold); var row = fold.range.end.row, column = fold.range.end.column; for (var j = i, cmp = -1; j < this.subFolds.length; j++) { cmp = this.subFolds[j].range.compare(row, column); if (cmp != 1) break; } var afterEnd = this.subFolds[j]; if (cmp == 0) throw new Error("A fold can't intersect already existing fold" + fold.range + this.range); var consumedFolds = this.subFolds.splice(i, j - i, fold); fold.setFoldLine(this.foldLine); return fold; }; this.restoreRange = function(range) { return restoreRange(range, this.start); }; }).call(Fold.prototype); function consumePoint(point, anchor) { point.row -= anchor.row; if (point.row == 0) point.column -= anchor.column; } function consumeRange(range, anchor) { consumePoint(range.start, anchor); consumePoint(range.end, anchor); } function restorePoint(point, anchor) { if (point.row == 0) point.column += anchor.column; point.row += anchor.row; } function restoreRange(range, anchor) { restorePoint(range.start, anchor); restorePoint(range.end, anchor); } }); define('ace/range_list', ['require', 'exports', 'module' , 'ace/range'], function(require, exports, module) { var Range = require("./range").Range; var comparePoints = Range.comparePoints; var RangeList = function() { this.ranges = []; }; (function() { this.comparePoints = comparePoints; this.pointIndex = function(pos, excludeEdges, startIndex) { var list = this.ranges; for (var i = startIndex || 0; i < list.length; i++) { var range = list[i]; var cmpEnd = comparePoints(pos, range.end); if (cmpEnd > 0) continue; var cmpStart = comparePoints(pos, range.start); if (cmpEnd === 0) return excludeEdges && cmpStart !== 0 ? -i-2 : i; if (cmpStart > 0 || (cmpStart === 0 && !excludeEdges)) return i; return -i-1; } return -i - 1; }; this.add = function(range) { var excludeEdges = !range.isEmpty(); var startIndex = this.pointIndex(range.start, excludeEdges); if (startIndex < 0) startIndex = -startIndex - 1; var endIndex = this.pointIndex(range.end, excludeEdges, startIndex); if (endIndex < 0) endIndex = -endIndex - 1; else endIndex++; return this.ranges.splice(startIndex, endIndex - startIndex, range); }; this.addList = function(list) { var removed = []; for (var i = list.length; i--; ) { removed.push.call(removed, this.add(list[i])); } return removed; }; this.substractPoint = function(pos) { var i = this.pointIndex(pos); if (i >= 0) return this.ranges.splice(i, 1); }; this.merge = function() { var removed = []; var list = this.ranges; list = list.sort(function(a, b) { return comparePoints(a.start, b.start); }); var next = list[0], range; for (var i = 1; i < list.length; i++) { range = next; next = list[i]; var cmp = comparePoints(range.end, next.start); if (cmp < 0) continue; if (cmp == 0 && !range.isEmpty() && !next.isEmpty()) continue; if (comparePoints(range.end, next.end) < 0) { range.end.row = next.end.row; range.end.column = next.end.column; } list.splice(i, 1); removed.push(next); next = range; i--; } this.ranges = list; return removed; }; this.contains = function(row, column) { return this.pointIndex({row: row, column: column}) >= 0; }; this.containsPoint = function(pos) { return this.pointIndex(pos) >= 0; }; this.rangeAtPoint = function(pos) { var i = this.pointIndex(pos); if (i >= 0) return this.ranges[i]; }; this.clipRows = function(startRow, endRow) { var list = this.ranges; if (list[0].start.row > endRow || list[list.length - 1].start.row < startRow) return []; var startIndex = this.pointIndex({row: startRow, column: 0}); if (startIndex < 0) startIndex = -startIndex - 1; var endIndex = this.pointIndex({row: endRow, column: 0}, startIndex); if (endIndex < 0) endIndex = -endIndex - 1; var clipped = []; for (var i = startIndex; i < endIndex; i++) { clipped.push(list[i]); } return clipped; }; this.removeAll = function() { return this.ranges.splice(0, this.ranges.length); }; this.attach = function(session) { if (this.session) this.detach(); this.session = session; this.onChange = this.$onChange.bind(this); this.session.on('change', this.onChange); }; this.detach = function() { if (!this.session) return; this.session.removeListener('change', this.onChange); this.session = null; }; this.$onChange = function(e) { var changeRange = e.data.range; if (e.data.action[0] == "i"){ var start = changeRange.start; var end = changeRange.end; } else { var end = changeRange.start; var start = changeRange.end; } var startRow = start.row; var endRow = end.row; var lineDif = endRow - startRow; var colDiff = -start.column + end.column; var ranges = this.ranges; for (var i = 0, n = ranges.length; i < n; i++) { var r = ranges[i]; if (r.end.row < startRow) continue; if (r.start.row > startRow) break; if (r.start.row == startRow && r.start.column >= start.column ) { if (r.start.column == start.column && this.$insertRight) { } else { r.start.column += colDiff; r.start.row += lineDif; } } if (r.end.row == startRow && r.end.column >= start.column) { if (r.end.column == start.column && this.$insertRight) { continue; } if (r.end.column == start.column && colDiff > 0 && i < n - 1) { if (r.end.column > r.start.column && r.end.column == ranges[i+1].start.column) r.end.column -= colDiff; } r.end.column += colDiff; r.end.row += lineDif; } } if (lineDif != 0 && i < n) { for (; i < n; i++) { var r = ranges[i]; r.start.row += lineDif; r.end.row += lineDif; } } }; }).call(RangeList.prototype); exports.RangeList = RangeList; }); define('ace/edit_session/bracket_match', ['require', 'exports', 'module' , 'ace/token_iterator', 'ace/range'], function(require, exports, module) { var TokenIterator = require("../token_iterator").TokenIterator; var Range = require("../range").Range; function BracketMatch() { this.findMatchingBracket = function(position, chr) { if (position.column == 0) return null; var charBeforeCursor = chr || this.getLine(position.row).charAt(position.column-1); if (charBeforeCursor == "") return null; var match = charBeforeCursor.match(/([\(\[\{])|([\)\]\}])/); if (!match) return null; if (match[1]) return this.$findClosingBracket(match[1], position); else return this.$findOpeningBracket(match[2], position); }; this.getBracketRange = function(pos) { var line = this.getLine(pos.row); var before = true, range; var chr = line.charAt(pos.column-1); var match = chr && chr.match(/([\(\[\{])|([\)\]\}])/); if (!match) { chr = line.charAt(pos.column); pos = {row: pos.row, column: pos.column + 1}; match = chr && chr.match(/([\(\[\{])|([\)\]\}])/); before = false; } if (!match) return null; if (match[1]) { var bracketPos = this.$findClosingBracket(match[1], pos); if (!bracketPos) return null; range = Range.fromPoints(pos, bracketPos); if (!before) { range.end.column++; range.start.column--; } range.cursor = range.end; } else { var bracketPos = this.$findOpeningBracket(match[2], pos); if (!bracketPos) return null; range = Range.fromPoints(bracketPos, pos); if (!before) { range.start.column++; range.end.column--; } range.cursor = range.start; } return range; }; this.$brackets = { ")": "(", "(": ")", "]": "[", "[": "]", "{": "}", "}": "{" }; this.$findOpeningBracket = function(bracket, position, typeRe) { var openBracket = this.$brackets[bracket]; var depth = 1; var iterator = new TokenIterator(this, position.row, position.column); var token = iterator.getCurrentToken(); if (!token) token = iterator.stepForward(); if (!token) return; if (!typeRe){ typeRe = new RegExp( "(\\.?" + token.type.replace(".", "\\.").replace("rparen", ".paren") + ")+" ); } var valueIndex = position.column - iterator.getCurrentTokenColumn() - 2; var value = token.value; while (true) { while (valueIndex >= 0) { var chr = value.charAt(valueIndex); if (chr == openBracket) { depth -= 1; if (depth == 0) { return {row: iterator.getCurrentTokenRow(), column: valueIndex + iterator.getCurrentTokenColumn()}; } } else if (chr == bracket) { depth += 1; } valueIndex -= 1; } do { token = iterator.stepBackward(); } while (token && !typeRe.test(token.type)); if (token == null) break; value = token.value; valueIndex = value.length - 1; } return null; }; this.$findClosingBracket = function(bracket, position, typeRe) { var closingBracket = this.$brackets[bracket]; var depth = 1; var iterator = new TokenIterator(this, position.row, position.column); var token = iterator.getCurrentToken(); if (!token) token = iterator.stepForward(); if (!token) return; if (!typeRe){ typeRe = new RegExp( "(\\.?" + token.type.replace(".", "\\.").replace("lparen", ".paren") + ")+" ); } var valueIndex = position.column - iterator.getCurrentTokenColumn(); while (true) { var value = token.value; var valueLength = value.length; while (valueIndex < valueLength) { var chr = value.charAt(valueIndex); if (chr == closingBracket) { depth -= 1; if (depth == 0) { return {row: iterator.getCurrentTokenRow(), column: valueIndex + iterator.getCurrentTokenColumn()}; } } else if (chr == bracket) { depth += 1; } valueIndex += 1; } do { token = iterator.stepForward(); } while (token && !typeRe.test(token.type)); if (token == null) break; valueIndex = 0; } return null; }; } exports.BracketMatch = BracketMatch; }); define('ace/search', ['require', 'exports', 'module' , 'ace/lib/lang', 'ace/lib/oop', 'ace/range'], function(require, exports, module) { var lang = require("./lib/lang"); var oop = require("./lib/oop"); var Range = require("./range").Range; var Search = function() { this.$options = {}; }; (function() { this.set = function(options) { oop.mixin(this.$options, options); return this; }; this.getOptions = function() { return lang.copyObject(this.$options); }; this.setOptions = function(options) { this.$options = options; }; this.find = function(session) { var iterator = this.$matchIterator(session, this.$options); if (!iterator) return false; var firstRange = null; iterator.forEach(function(range, row, offset) { if (!range.start) { var column = range.offset + (offset || 0); firstRange = new Range(row, column, row, column+range.length); } else firstRange = range; return true; }); return firstRange; }; this.findAll = function(session) { var options = this.$options; if (!options.needle) return []; this.$assembleRegExp(options); var range = options.range; var lines = range ? session.getLines(range.start.row, range.end.row) : session.doc.getAllLines(); var ranges = []; var re = options.re; if (options.$isMultiLine) { var len = re.length; var maxRow = lines.length - len; for (var row = re.offset || 0; row <= maxRow; row++) { for (var j = 0; j < len; j++) if (lines[row + j].search(re[j]) == -1) break; var startLine = lines[row]; var line = lines[row + len - 1]; var startIndex = startLine.match(re[0])[0].length; var endIndex = line.match(re[len - 1])[0].length; ranges.push(new Range( row, startLine.length - startIndex, row + len - 1, endIndex )); } } else { for (var i = 0; i < lines.length; i++) { var matches = lang.getMatchOffsets(lines[i], re); for (var j = 0; j < matches.length; j++) { var match = matches[j]; ranges.push(new Range(i, match.offset, i, match.offset + match.length)); } } } if (range) { var startColumn = range.start.column; var endColumn = range.start.column; var i = 0, j = ranges.length - 1; while (i < j && ranges[i].start.column < startColumn && ranges[i].start.row == range.start.row) i++; while (i < j && ranges[j].end.column > endColumn && ranges[j].end.row == range.end.row) j--; ranges = ranges.slice(i, j + 1); for (i = 0, j = ranges.length; i < j; i++) { ranges[i].start.row += range.start.row; ranges[i].end.row += range.start.row; } } return ranges; }; this.replace = function(input, replacement) { var options = this.$options; var re = this.$assembleRegExp(options); if (options.$isMultiLine) return replacement; if (!re) return; var match = re.exec(input); if (!match || match[0].length != input.length) return null; replacement = input.replace(re, replacement); if (options.preserveCase) { replacement = replacement.split(""); for (var i = Math.min(input.length, input.length); i--; ) { var ch = input[i]; if (ch && ch.toLowerCase() != ch) replacement[i] = replacement[i].toUpperCase(); else replacement[i] = replacement[i].toLowerCase(); } replacement = replacement.join(""); } return replacement; }; this.$matchIterator = function(session, options) { var re = this.$assembleRegExp(options); if (!re) return false; var self = this, callback, backwards = options.backwards; if (options.$isMultiLine) { var len = re.length; var matchIterator = function(line, row, offset) { var startIndex = line.search(re[0]); if (startIndex == -1) return; for (var i = 1; i < len; i++) { line = session.getLine(row + i); if (line.search(re[i]) == -1) return; } var endIndex = line.match(re[len - 1])[0].length; var range = new Range(row, startIndex, row + len - 1, endIndex); if (re.offset == 1) { range.start.row--; range.start.column = Number.MAX_VALUE; } else if (offset) range.start.column += offset; if (callback(range)) return true; }; } else if (backwards) { var matchIterator = function(line, row, startIndex) { var matches = lang.getMatchOffsets(line, re); for (var i = matches.length-1; i >= 0; i--) if (callback(matches[i], row, startIndex)) return true; }; } else { var matchIterator = function(line, row, startIndex) { var matches = lang.getMatchOffsets(line, re); for (var i = 0; i < matches.length; i++) if (callback(matches[i], row, startIndex)) return true; }; } return { forEach: function(_callback) { callback = _callback; self.$lineIterator(session, options).forEach(matchIterator); } }; }; this.$assembleRegExp = function(options, $disableFakeMultiline) { if (options.needle instanceof RegExp) return options.re = options.needle; var needle = options.needle; if (!options.needle) return options.re = false; if (!options.regExp) needle = lang.escapeRegExp(needle); if (options.wholeWord) needle = "\\b" + needle + "\\b"; var modifier = options.caseSensitive ? "g" : "gi"; options.$isMultiLine = !$disableFakeMultiline && /[\n\r]/.test(needle); if (options.$isMultiLine) return options.re = this.$assembleMultilineRegExp(needle, modifier); try { var re = new RegExp(needle, modifier); } catch(e) { re = false; } return options.re = re; }; this.$assembleMultilineRegExp = function(needle, modifier) { var parts = needle.replace(/\r\n|\r|\n/g, "$\n^").split("\n"); var re = []; for (var i = 0; i < parts.length; i++) try { re.push(new RegExp(parts[i], modifier)); } catch(e) { return false; } if (parts[0] == "") { re.shift(); re.offset = 1; } else { re.offset = 0; } return re; }; this.$lineIterator = function(session, options) { var backwards = options.backwards == true; var skipCurrent = options.skipCurrent != false; var range = options.range; var start = options.start; if (!start) start = range ? range[backwards ? "end" : "start"] : session.selection.getRange(); if (start.start) start = start[skipCurrent != backwards ? "end" : "start"]; var firstRow = range ? range.start.row : 0; var lastRow = range ? range.end.row : session.getLength() - 1; var forEach = backwards ? function(callback) { var row = start.row; var line = session.getLine(row).substring(0, start.column); if (callback(line, row)) return; for (row--; row >= firstRow; row--) if (callback(session.getLine(row), row)) return; if (options.wrap == false) return; for (row = lastRow, firstRow = start.row; row >= firstRow; row--) if (callback(session.getLine(row), row)) return; } : function(callback) { var row = start.row; var line = session.getLine(row).substr(start.column); if (callback(line, row, start.column)) return; for (row = row+1; row <= lastRow; row++) if (callback(session.getLine(row), row)) return; if (options.wrap == false) return; for (row = firstRow, lastRow = start.row; row <= lastRow; row++) if (callback(session.getLine(row), row)) return; }; return {forEach: forEach}; }; }).call(Search.prototype); exports.Search = Search; }); define('ace/commands/command_manager', ['require', 'exports', 'module' , 'ace/lib/oop', 'ace/keyboard/hash_handler', 'ace/lib/event_emitter'], function(require, exports, module) { var oop = require("../lib/oop"); var HashHandler = require("../keyboard/hash_handler").HashHandler; var EventEmitter = require("../lib/event_emitter").EventEmitter; var CommandManager = function(platform, commands) { HashHandler.call(this, commands, platform); this.byName = this.commands; this.setDefaultHandler("exec", function(e) { return e.command.exec(e.editor, e.args || {}); }); }; oop.inherits(CommandManager, HashHandler); (function() { oop.implement(this, EventEmitter); this.exec = function(command, editor, args) { if (typeof command === 'string') command = this.commands[command]; if (!command) return false; if (editor && editor.$readOnly && !command.readOnly) return false; var e = {editor: editor, command: command, args: args}; var retvalue = this._emit("exec", e); this._signal("afterExec", e); return retvalue === false ? false : true; }; this.toggleRecording = function(editor) { if (this.$inReplay) return; editor && editor._emit("changeStatus"); if (this.recording) { this.macro.pop(); this.removeEventListener("exec", this.$addCommandToMacro); if (!this.macro.length) this.macro = this.oldMacro; return this.recording = false; } if (!this.$addCommandToMacro) { this.$addCommandToMacro = function(e) { this.macro.push([e.command, e.args]); }.bind(this); } this.oldMacro = this.macro; this.macro = []; this.on("exec", this.$addCommandToMacro); return this.recording = true; }; this.replay = function(editor) { if (this.$inReplay || !this.macro) return; if (this.recording) return this.toggleRecording(editor); try { this.$inReplay = true; this.macro.forEach(function(x) { if (typeof x == "string") this.exec(x, editor); else this.exec(x[0], editor, x[1]); }, this); } finally { this.$inReplay = false; } }; this.trimMacro = function(m) { return m.map(function(x){ if (typeof x[0] != "string") x[0] = x[0].name; if (!x[1]) x = x[0]; return x; }); }; }).call(CommandManager.prototype); exports.CommandManager = CommandManager; }); define('ace/keyboard/hash_handler', ['require', 'exports', 'module' , 'ace/lib/keys', 'ace/lib/useragent'], function(require, exports, module) { var keyUtil = require("../lib/keys"); var useragent = require("../lib/useragent"); function HashHandler(config, platform) { this.platform = platform || (useragent.isMac ? "mac" : "win"); this.commands = {}; this.commandKeyBinding = {}; if (this.__defineGetter__ && this.__defineSetter__ && typeof console != "undefined" && console.error) { var warned = false; var warn = function() { if (!warned) { warned = true; console.error("commmandKeyBinding has too many m's. use commandKeyBinding"); } }; this.__defineGetter__("commmandKeyBinding", function() { warn(); return this.commandKeyBinding; }); this.__defineSetter__("commmandKeyBinding", function(val) { warn(); return this.commandKeyBinding = val; }); } else { this.commmandKeyBinding = this.commandKeyBinding; } this.addCommands(config); }; (function() { this.addCommand = function(command) { if (this.commands[command.name]) this.removeCommand(command); this.commands[command.name] = command; if (command.bindKey) this._buildKeyHash(command); }; this.removeCommand = function(command) { var name = (typeof command === 'string' ? command : command.name); command = this.commands[name]; delete this.commands[name]; var ckb = this.commandKeyBinding; for (var hashId in ckb) { for (var key in ckb[hashId]) { if (ckb[hashId][key] == command) delete ckb[hashId][key]; } } }; this.bindKey = function(key, command) { if(!key) return; if (typeof command == "function") { this.addCommand({exec: command, bindKey: key, name: command.name || key}); return; } var ckb = this.commandKeyBinding; key.split("|").forEach(function(keyPart) { var binding = this.parseKeys(keyPart, command); var hashId = binding.hashId; (ckb[hashId] || (ckb[hashId] = {}))[binding.key] = command; }, this); }; this.addCommands = function(commands) { commands && Object.keys(commands).forEach(function(name) { var command = commands[name]; if (!command) return; if (typeof command === "string") return this.bindKey(command, name); if (typeof command === "function") command = { exec: command }; if (!command.name) command.name = name; this.addCommand(command); }, this); }; this.removeCommands = function(commands) { Object.keys(commands).forEach(function(name) { this.removeCommand(commands[name]); }, this); }; this.bindKeys = function(keyList) { Object.keys(keyList).forEach(function(key) { this.bindKey(key, keyList[key]); }, this); }; this._buildKeyHash = function(command) { var binding = command.bindKey; if (!binding) return; var key = typeof binding == "string" ? binding: binding[this.platform]; this.bindKey(key, command); }; this.parseKeys = function(keys) { if (keys.indexOf(" ") != -1) keys = keys.split(/\s+/).pop(); var parts = keys.toLowerCase().split(/[\-\+]([\-\+])?/).filter(function(x){return x}); var key = parts.pop(); var keyCode = keyUtil[key]; if (keyUtil.FUNCTION_KEYS[keyCode]) key = keyUtil.FUNCTION_KEYS[keyCode].toLowerCase(); else if (!parts.length) return {key: key, hashId: -1}; else if (parts.length == 1 && parts[0] == "shift") return {key: key.toUpperCase(), hashId: -1}; var hashId = 0; for (var i = parts.length; i--;) { var modifier = keyUtil.KEY_MODS[parts[i]]; if (modifier == null) { if (typeof console != "undefined") console.error("invalid modifier " + parts[i] + " in " + keys); return false; } hashId |= modifier; } return {key: key, hashId: hashId}; }; this.findKeyCommand = function findKeyCommand(hashId, keyString) { var ckbr = this.commandKeyBinding; return ckbr[hashId] && ckbr[hashId][keyString]; }; this.handleKeyboard = function(data, hashId, keyString, keyCode) { return { command: this.findKeyCommand(hashId, keyString) }; }; }).call(HashHandler.prototype) exports.HashHandler = HashHandler; }); define('ace/commands/default_commands', ['require', 'exports', 'module' , 'ace/lib/lang', 'ace/config'], function(require, exports, module) { var lang = require("../lib/lang"); var config = require("../config"); function bindKey(win, mac) { return { win: win, mac: mac }; } exports.commands = [{ name: "showSettingsMenu", bindKey: bindKey("Ctrl-,", "Command-,"), exec: function(editor) { config.loadModule("ace/ext/settings_menu", function(module) { module.init(editor); editor.showSettingsMenu(); }); }, readOnly: true }, { name: "selectall", bindKey: bindKey("Ctrl-A", "Command-A"), exec: function(editor) { editor.selectAll(); }, readOnly: true }, { name: "centerselection", bindKey: bindKey(null, "Ctrl-L"), exec: function(editor) { editor.centerSelection(); }, readOnly: true }, { name: "gotoline", bindKey: bindKey("Ctrl-L", "Command-L"), exec: function(editor) { var line = parseInt(prompt("Enter line number:"), 10); if (!isNaN(line)) { editor.gotoLine(line); } }, readOnly: true }, { name: "fold", bindKey: bindKey("Alt-L|Ctrl-F1", "Command-Alt-L|Command-F1"), exec: function(editor) { editor.session.toggleFold(false); }, readOnly: true }, { name: "unfold", bindKey: bindKey("Alt-Shift-L|Ctrl-Shift-F1", "Command-Alt-Shift-L|Command-Shift-F1"), exec: function(editor) { editor.session.toggleFold(true); }, readOnly: true }, { name: "foldall", bindKey: bindKey("Alt-0", "Command-Option-0"), exec: function(editor) { editor.session.foldAll(); }, readOnly: true }, { name: "unfoldall", bindKey: bindKey("Alt-Shift-0", "Command-Option-Shift-0"), exec: function(editor) { editor.session.unfold(); }, readOnly: true }, { name: "findnext", bindKey: bindKey("Ctrl-K", "Command-G"), exec: function(editor) { editor.findNext(); }, readOnly: true }, { name: "findprevious", bindKey: bindKey("Ctrl-Shift-K", "Command-Shift-G"), exec: function(editor) { editor.findPrevious(); }, readOnly: true }, { name: "find", bindKey: bindKey("Ctrl-F", "Command-F"), exec: function(editor) { config.loadModule("ace/ext/searchbox", function(e) {e.Search(editor)}); }, readOnly: true }, { name: "overwrite", bindKey: "Insert", exec: function(editor) { editor.toggleOverwrite(); }, readOnly: true }, { name: "selecttostart", bindKey: bindKey("Ctrl-Shift-Home", "Command-Shift-Up"), exec: function(editor) { editor.getSelection().selectFileStart(); }, multiSelectAction: "forEach", readOnly: true, group: "fileJump" }, { name: "gotostart", bindKey: bindKey("Ctrl-Home", "Command-Home|Command-Up"), exec: function(editor) { editor.navigateFileStart(); }, multiSelectAction: "forEach", readOnly: true, group: "fileJump" }, { name: "selectup", bindKey: bindKey("Shift-Up", "Shift-Up"), exec: function(editor) { editor.getSelection().selectUp(); }, multiSelectAction: "forEach", readOnly: true }, { name: "golineup", bindKey: bindKey("Up", "Up|Ctrl-P"), exec: function(editor, args) { editor.navigateUp(args.times); }, multiSelectAction: "forEach", readOnly: true }, { name: "selecttoend", bindKey: bindKey("Ctrl-Shift-End", "Command-Shift-Down"), exec: function(editor) { editor.getSelection().selectFileEnd(); }, multiSelectAction: "forEach", readOnly: true, group: "fileJump" }, { name: "gotoend", bindKey: bindKey("Ctrl-End", "Command-End|Command-Down"), exec: function(editor) { editor.navigateFileEnd(); }, multiSelectAction: "forEach", readOnly: true, group: "fileJump" }, { name: "selectdown", bindKey: bindKey("Shift-Down", "Shift-Down"), exec: function(editor) { editor.getSelection().selectDown(); }, multiSelectAction: "forEach", readOnly: true }, { name: "golinedown", bindKey: bindKey("Down", "Down|Ctrl-N"), exec: function(editor, args) { editor.navigateDown(args.times); }, multiSelectAction: "forEach", readOnly: true }, { name: "selectwordleft", bindKey: bindKey("Ctrl-Shift-Left", "Option-Shift-Left"), exec: function(editor) { editor.getSelection().selectWordLeft(); }, multiSelectAction: "forEach", readOnly: true }, { name: "gotowordleft", bindKey: bindKey("Ctrl-Left", "Option-Left"), exec: function(editor) { editor.navigateWordLeft(); }, multiSelectAction: "forEach", readOnly: true }, { name: "selecttolinestart", bindKey: bindKey("Alt-Shift-Left", "Command-Shift-Left"), exec: function(editor) { editor.getSelection().selectLineStart(); }, multiSelectAction: "forEach", readOnly: true }, { name: "gotolinestart", bindKey: bindKey("Alt-Left|Home", "Command-Left|Home|Ctrl-A"), exec: function(editor) { editor.navigateLineStart(); }, multiSelectAction: "forEach", readOnly: true }, { name: "selectleft", bindKey: bindKey("Shift-Left", "Shift-Left"), exec: function(editor) { editor.getSelection().selectLeft(); }, multiSelectAction: "forEach", readOnly: true }, { name: "gotoleft", bindKey: bindKey("Left", "Left|Ctrl-B"), exec: function(editor, args) { editor.navigateLeft(args.times); }, multiSelectAction: "forEach", readOnly: true }, { name: "selectwordright", bindKey: bindKey("Ctrl-Shift-Right", "Option-Shift-Right"), exec: function(editor) { editor.getSelection().selectWordRight(); }, multiSelectAction: "forEach", readOnly: true }, { name: "gotowordright", bindKey: bindKey("Ctrl-Right", "Option-Right"), exec: function(editor) { editor.navigateWordRight(); }, multiSelectAction: "forEach", readOnly: true }, { name: "selecttolineend", bindKey: bindKey("Alt-Shift-Right", "Command-Shift-Right"), exec: function(editor) { editor.getSelection().selectLineEnd(); }, multiSelectAction: "forEach", readOnly: true }, { name: "gotolineend", bindKey: bindKey("Alt-Right|End", "Command-Right|End|Ctrl-E"), exec: function(editor) { editor.navigateLineEnd(); }, multiSelectAction: "forEach", readOnly: true }, { name: "selectright", bindKey: bindKey("Shift-Right", "Shift-Right"), exec: function(editor) { editor.getSelection().selectRight(); }, multiSelectAction: "forEach", readOnly: true }, { name: "gotoright", bindKey: bindKey("Right", "Right|Ctrl-F"), exec: function(editor, args) { editor.navigateRight(args.times); }, multiSelectAction: "forEach", readOnly: true }, { name: "selectpagedown", bindKey: "Shift-PageDown", exec: function(editor) { editor.selectPageDown(); }, readOnly: true }, { name: "pagedown", bindKey: bindKey(null, "Option-PageDown"), exec: function(editor) { editor.scrollPageDown(); }, readOnly: true }, { name: "gotopagedown", bindKey: bindKey("PageDown", "PageDown|Ctrl-V"), exec: function(editor) { editor.gotoPageDown(); }, readOnly: true }, { name: "selectpageup", bindKey: "Shift-PageUp", exec: function(editor) { editor.selectPageUp(); }, readOnly: true }, { name: "pageup", bindKey: bindKey(null, "Option-PageUp"), exec: function(editor) { editor.scrollPageUp(); }, readOnly: true }, { name: "gotopageup", bindKey: "PageUp", exec: function(editor) { editor.gotoPageUp(); }, readOnly: true }, { name: "scrollup", bindKey: bindKey("Ctrl-Up", null), exec: function(e) { e.renderer.scrollBy(0, -2 * e.renderer.layerConfig.lineHeight); }, readOnly: true }, { name: "scrolldown", bindKey: bindKey("Ctrl-Down", null), exec: function(e) { e.renderer.scrollBy(0, 2 * e.renderer.layerConfig.lineHeight); }, readOnly: true }, { name: "selectlinestart", bindKey: "Shift-Home", exec: function(editor) { editor.getSelection().selectLineStart(); }, multiSelectAction: "forEach", readOnly: true }, { name: "selectlineend", bindKey: "Shift-End", exec: function(editor) { editor.getSelection().selectLineEnd(); }, multiSelectAction: "forEach", readOnly: true }, { name: "togglerecording", bindKey: bindKey("Ctrl-Alt-E", "Command-Option-E"), exec: function(editor) { editor.commands.toggleRecording(editor); }, readOnly: true }, { name: "replaymacro", bindKey: bindKey("Ctrl-Shift-E", "Command-Shift-E"), exec: function(editor) { editor.commands.replay(editor); }, readOnly: true }, { name: "jumptomatching", bindKey: bindKey("Ctrl-P", "Ctrl-Shift-P"), exec: function(editor) { editor.jumpToMatching(); }, multiSelectAction: "forEach", readOnly: true }, { name: "selecttomatching", bindKey: bindKey("Ctrl-Shift-P", null), exec: function(editor) { editor.jumpToMatching(true); }, multiSelectAction: "forEach", readOnly: true }, { name: "cut", exec: function(editor) { var range = editor.getSelectionRange(); editor._emit("cut", range); if (!editor.selection.isEmpty()) { editor.session.remove(range); editor.clearSelection(); } }, multiSelectAction: "forEach" }, { name: "removeline", bindKey: bindKey("Ctrl-D", "Command-D"), exec: function(editor) { editor.removeLines(); }, multiSelectAction: "forEachLine" }, { name: "duplicateSelection", bindKey: bindKey("Ctrl-Shift-D", "Command-Shift-D"), exec: function(editor) { editor.duplicateSelection(); }, multiSelectAction: "forEach" }, { name: "sortlines", bindKey: bindKey("Ctrl-Alt-S", "Command-Alt-S"), exec: function(editor) { editor.sortLines(); }, multiSelectAction: "forEachLine" }, { name: "togglecomment", bindKey: bindKey("Ctrl-/", "Command-/"), exec: function(editor) { editor.toggleCommentLines(); }, multiSelectAction: "forEachLine" }, { name: "toggleBlockComment", bindKey: bindKey("Ctrl-Shift-/", "Command-Shift-/"), exec: function(editor) { editor.toggleBlockComment(); }, multiSelectAction: "forEach" }, { name: "modifyNumberUp", bindKey: bindKey("Ctrl-Shift-Up", "Alt-Shift-Up"), exec: function(editor) { editor.modifyNumber(1); }, multiSelectAction: "forEach" }, { name: "modifyNumberDown", bindKey: bindKey("Ctrl-Shift-Down", "Alt-Shift-Down"), exec: function(editor) { editor.modifyNumber(-1); }, multiSelectAction: "forEach" }, { name: "replace", bindKey: bindKey("Ctrl-H", "Command-Option-F"), exec: function(editor) { config.loadModule("ace/ext/searchbox", function(e) {e.Search(editor, true)}); } }, { name: "undo", bindKey: bindKey("Ctrl-Z", "Command-Z"), exec: function(editor) { editor.undo(); } }, { name: "redo", bindKey: bindKey("Ctrl-Shift-Z|Ctrl-Y", "Command-Shift-Z|Command-Y"), exec: function(editor) { editor.redo(); } }, { name: "copylinesup", bindKey: bindKey("Alt-Shift-Up", "Command-Option-Up"), exec: function(editor) { editor.copyLinesUp(); } }, { name: "movelinesup", bindKey: bindKey("Alt-Up", "Option-Up"), exec: function(editor) { editor.moveLinesUp(); } }, { name: "copylinesdown", bindKey: bindKey("Alt-Shift-Down", "Command-Option-Down"), exec: function(editor) { editor.copyLinesDown(); } }, { name: "movelinesdown", bindKey: bindKey("Alt-Down", "Option-Down"), exec: function(editor) { editor.moveLinesDown(); } }, { name: "del", bindKey: bindKey("Delete", "Delete|Ctrl-D|Shift-Delete"), exec: function(editor) { editor.remove("right"); }, multiSelectAction: "forEach" }, { name: "backspace", bindKey: bindKey( "Shift-Backspace|Backspace", "Ctrl-Backspace|Shift-Backspace|Backspace|Ctrl-H" ), exec: function(editor) { editor.remove("left"); }, multiSelectAction: "forEach" }, { name: "cut_or_delete", bindKey: bindKey("Shift-Delete", null), exec: function(editor) { if (editor.selection.isEmpty()) { editor.remove("left"); } else { return false; } }, multiSelectAction: "forEach" }, { name: "removetolinestart", bindKey: bindKey("Alt-Backspace", "Command-Backspace"), exec: function(editor) { editor.removeToLineStart(); }, multiSelectAction: "forEach" }, { name: "removetolineend", bindKey: bindKey("Alt-Delete", "Ctrl-K"), exec: function(editor) { editor.removeToLineEnd(); }, multiSelectAction: "forEach" }, { name: "removewordleft", bindKey: bindKey("Ctrl-Backspace", "Alt-Backspace|Ctrl-Alt-Backspace"), exec: function(editor) { editor.removeWordLeft(); }, multiSelectAction: "forEach" }, { name: "removewordright", bindKey: bindKey("Ctrl-Delete", "Alt-Delete"), exec: function(editor) { editor.removeWordRight(); }, multiSelectAction: "forEach" }, { name: "outdent", bindKey: bindKey("Shift-Tab", "Shift-Tab"), exec: function(editor) { editor.blockOutdent(); }, multiSelectAction: "forEach" }, { name: "indent", bindKey: bindKey("Tab", "Tab"), exec: function(editor) { editor.indent(); }, multiSelectAction: "forEach" },{ name: "blockoutdent", bindKey: bindKey("Ctrl-[", "Ctrl-["), exec: function(editor) { editor.blockOutdent(); }, multiSelectAction: "forEachLine" },{ name: "blockindent", bindKey: bindKey("Ctrl-]", "Ctrl-]"), exec: function(editor) { editor.blockIndent(); }, multiSelectAction: "forEachLine" }, { name: "insertstring", exec: function(editor, str) { editor.insert(str); }, multiSelectAction: "forEach" }, { name: "inserttext", exec: function(editor, args) { editor.insert(lang.stringRepeat(args.text || "", args.times || 1)); }, multiSelectAction: "forEach" }, { name: "splitline", bindKey: bindKey(null, "Ctrl-O"), exec: function(editor) { editor.splitLine(); }, multiSelectAction: "forEach" }, { name: "transposeletters", bindKey: bindKey("Ctrl-T", "Ctrl-T"), exec: function(editor) { editor.transposeLetters(); }, multiSelectAction: function(editor) {editor.transposeSelections(1); } }, { name: "touppercase", bindKey: bindKey("Ctrl-U", "Ctrl-U"), exec: function(editor) { editor.toUpperCase(); }, multiSelectAction: "forEach" }, { name: "tolowercase", bindKey: bindKey("Ctrl-Shift-U", "Ctrl-Shift-U"), exec: function(editor) { editor.toLowerCase(); }, multiSelectAction: "forEach" }]; }); define('ace/undomanager', ['require', 'exports', 'module' ], function(require, exports, module) { var UndoManager = function() { this.reset(); }; (function() { this.execute = function(options) { var deltas = options.args[0]; this.$doc = options.args[1]; if (options.merge && this.hasUndo()){ deltas = this.$undoStack.pop().concat(deltas); } this.$undoStack.push(deltas); this.$redoStack = []; if (this.dirtyCounter < 0) { this.dirtyCounter = NaN; } this.dirtyCounter++; }; this.undo = function(dontSelect) { var deltas = this.$undoStack.pop(); var undoSelectionRange = null; if (deltas) { undoSelectionRange = this.$doc.undoChanges(deltas, dontSelect); this.$redoStack.push(deltas); this.dirtyCounter--; } return undoSelectionRange; }; this.redo = function(dontSelect) { var deltas = this.$redoStack.pop(); var redoSelectionRange = null; if (deltas) { redoSelectionRange = this.$doc.redoChanges(deltas, dontSelect); this.$undoStack.push(deltas); this.dirtyCounter++; } return redoSelectionRange; }; this.reset = function() { this.$undoStack = []; this.$redoStack = []; this.dirtyCounter = 0; }; this.hasUndo = function() { return this.$undoStack.length > 0; }; this.hasRedo = function() { return this.$redoStack.length > 0; }; this.markClean = function() { this.dirtyCounter = 0; }; this.isClean = function() { return this.dirtyCounter === 0; }; }).call(UndoManager.prototype); exports.UndoManager = UndoManager; }); define('ace/virtual_renderer', ['require', 'exports', 'module' , 'ace/lib/oop', 'ace/lib/dom', 'ace/lib/useragent', 'ace/config', 'ace/layer/gutter', 'ace/layer/marker', 'ace/layer/text', 'ace/layer/cursor', 'ace/scrollbar', 'ace/renderloop', 'ace/lib/event_emitter'], function(require, exports, module) { var oop = require("./lib/oop"); var dom = require("./lib/dom"); var useragent = require("./lib/useragent"); var config = require("./config"); var GutterLayer = require("./layer/gutter").Gutter; var MarkerLayer = require("./layer/marker").Marker; var TextLayer = require("./layer/text").Text; var CursorLayer = require("./layer/cursor").Cursor; var ScrollBarH = require("./scrollbar").ScrollBarH; var ScrollBarV = require("./scrollbar").ScrollBarV; var RenderLoop = require("./renderloop").RenderLoop; var EventEmitter = require("./lib/event_emitter").EventEmitter; var editorCss = ".ace_editor {\ position: relative;\ overflow: hidden;\ font-family: 'Monaco', 'Menlo', 'Ubuntu Mono', 'Consolas', 'source-code-pro', monospace;\ font-size: 12px;\ line-height: normal;\ color: black;\ -ms-user-select: none;\ -moz-user-select: none;\ -webkit-user-select: none;\ user-select: none;\ }\ .ace_scroller {\ position: absolute;\ overflow: hidden;\ top: 0;\ bottom: 0;\ background-color: inherit;\ }\ .ace_content {\ position: absolute;\ -moz-box-sizing: border-box;\ -webkit-box-sizing: border-box;\ box-sizing: border-box;\ cursor: text;\ }\ .ace_dragging, .ace_dragging * {\ cursor: move !important;\ }\ .ace_dragging .ace_scroller:before{\ position: absolute;\ top: 0;\ left: 0;\ right: 0;\ bottom: 0;\ content: '';\ background: rgba(250, 250, 250, 0.01);\ z-index: 1000;\ }\ .ace_dragging.ace_dark .ace_scroller:before{\ background: rgba(0, 0, 0, 0.01);\ }\ .ace_selecting, .ace_selecting * {\ cursor: text !important;\ }\ .ace_gutter {\ position: absolute;\ overflow : hidden;\ width: auto;\ top: 0;\ bottom: 0;\ left: 0;\ cursor: default;\ z-index: 4;\ }\ .ace_gutter-active-line {\ position: absolute;\ left: 0;\ right: 0;\ }\ .ace_scroller.ace_scroll-left {\ box-shadow: 17px 0 16px -16px rgba(0, 0, 0, 0.4) inset;\ }\ .ace_gutter-cell {\ padding-left: 19px;\ padding-right: 6px;\ background-repeat: no-repeat;\ }\ .ace_gutter-cell.ace_error {\ background-image: url(\"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAyJpVFh0WE1MOmNvbS5hZG9iZS54bXAAAAAAADw/eHBhY2tldCBiZWdpbj0i77u/IiBpZD0iVzVNME1wQ2VoaUh6cmVTek5UY3prYzlkIj8+IDx4OnhtcG1ldGEgeG1sbnM6eD0iYWRvYmU6bnM6bWV0YS8iIHg6eG1wdGs9IkFkb2JlIFhNUCBDb3JlIDUuMC1jMDYwIDYxLjEzNDc3NywgMjAxMC8wMi8xMi0xNzozMjowMCAgICAgICAgIj4gPHJkZjpSREYgeG1sbnM6cmRmPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5LzAyLzIyLXJkZi1zeW50YXgtbnMjIj4gPHJkZjpEZXNjcmlwdGlvbiByZGY6YWJvdXQ9IiIgeG1sbnM6eG1wPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvIiB4bWxuczp4bXBNTT0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wL21tLyIgeG1sbnM6c3RSZWY9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC9zVHlwZS9SZXNvdXJjZVJlZiMiIHhtcDpDcmVhdG9yVG9vbD0iQWRvYmUgUGhvdG9zaG9wIENTNSBNYWNpbnRvc2giIHhtcE1NOkluc3RhbmNlSUQ9InhtcC5paWQ6QUM2OEZDQTQ4RTU0MTFFMUEzM0VFRTM2RUY1M0RBMjYiIHhtcE1NOkRvY3VtZW50SUQ9InhtcC5kaWQ6QUM2OEZDQTU4RTU0MTFFMUEzM0VFRTM2RUY1M0RBMjYiPiA8eG1wTU06RGVyaXZlZEZyb20gc3RSZWY6aW5zdGFuY2VJRD0ieG1wLmlpZDpBQzY4RkNBMjhFNTQxMUUxQTMzRUVFMzZFRjUzREEyNiIgc3RSZWY6ZG9jdW1lbnRJRD0ieG1wLmRpZDpBQzY4RkNBMzhFNTQxMUUxQTMzRUVFMzZFRjUzREEyNiIvPiA8L3JkZjpEZXNjcmlwdGlvbj4gPC9yZGY6UkRGPiA8L3g6eG1wbWV0YT4gPD94cGFja2V0IGVuZD0iciI/PkgXxbAAAAJbSURBVHjapFNNaBNBFH4zs5vdZLP5sQmNpT82QY209heh1ioWisaDRcSKF0WKJ0GQnrzrxasHsR6EnlrwD0TagxJabaVEpFYxLWlLSS822tr87m66ccfd2GKyVhA6MMybgfe97/vmPUQphd0sZjto9XIn9OOsvlu2nkqRzVU+6vvlzPf8W6bk8dxQ0NPbxAALgCgg2JkaQuhzQau/El0zbmUA7U0Es8v2CiYmKQJHGO1QICCLoqilMhkmurDAyapKgqItezi/USRdJqEYY4D5jCy03ht2yMkkvL91jTTX10qzyyu2hruPRN7jgbH+EOsXcMLgYiThEgAMhABW85oqy1DXdRIdvP1AHJ2acQXvDIrVHcdQNrEKNYSVMSZGMjEzIIAwDXIo+6G/FxcGnzkC3T2oMhLjre49sBB+RRcHLqdafK6sYdE/GGBwU1VpFNj0aN8pJbe+BkZyevUrvLl6Xmm0W9IuTc0DxrDNAJd5oEvI/KRsNC3bQyNjPO9yQ1YHcfj2QvfQc/5TUhJTBc2iM0U7AWDQtc1nJHvD/cfO2s7jaGkiTEfa/Ep8coLu7zmNmh8+dc5lZDuUeFAGUNA/OY6JVaypQ0vjr7XYjUvJM37vt+j1vuTK5DgVfVUoTjVe+y3/LxMxY2GgU+CSLy4cpfsYorRXuXIOi0Vt40h67uZFTdIo6nLaZcwUJWAzwNS0tBnqqKzQDnjdG/iPyZxo46HaKUpbvYkj8qYRTZsBhge+JHhZyh0x9b95JqjVJkT084kZIPwu/mPWqPgfQ5jXh2+92Ay7HedfAgwA6KDWafb4w3cAAAAASUVORK5CYII=\");\ background-repeat: no-repeat;\ background-position: 2px center;\ }\ .ace_gutter-cell.ace_warning {\ background-image: url(\"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAyJpVFh0WE1MOmNvbS5hZG9iZS54bXAAAAAAADw/eHBhY2tldCBiZWdpbj0i77u/IiBpZD0iVzVNME1wQ2VoaUh6cmVTek5UY3prYzlkIj8+IDx4OnhtcG1ldGEgeG1sbnM6eD0iYWRvYmU6bnM6bWV0YS8iIHg6eG1wdGs9IkFkb2JlIFhNUCBDb3JlIDUuMC1jMDYwIDYxLjEzNDc3NywgMjAxMC8wMi8xMi0xNzozMjowMCAgICAgICAgIj4gPHJkZjpSREYgeG1sbnM6cmRmPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5LzAyLzIyLXJkZi1zeW50YXgtbnMjIj4gPHJkZjpEZXNjcmlwdGlvbiByZGY6YWJvdXQ9IiIgeG1sbnM6eG1wPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvIiB4bWxuczp4bXBNTT0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wL21tLyIgeG1sbnM6c3RSZWY9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC9zVHlwZS9SZXNvdXJjZVJlZiMiIHhtcDpDcmVhdG9yVG9vbD0iQWRvYmUgUGhvdG9zaG9wIENTNSBNYWNpbnRvc2giIHhtcE1NOkluc3RhbmNlSUQ9InhtcC5paWQ6QUM2OEZDQTg4RTU0MTFFMUEzM0VFRTM2RUY1M0RBMjYiIHhtcE1NOkRvY3VtZW50SUQ9InhtcC5kaWQ6QUM2OEZDQTk4RTU0MTFFMUEzM0VFRTM2RUY1M0RBMjYiPiA8eG1wTU06RGVyaXZlZEZyb20gc3RSZWY6aW5zdGFuY2VJRD0ieG1wLmlpZDpBQzY4RkNBNjhFNTQxMUUxQTMzRUVFMzZFRjUzREEyNiIgc3RSZWY6ZG9jdW1lbnRJRD0ieG1wLmRpZDpBQzY4RkNBNzhFNTQxMUUxQTMzRUVFMzZFRjUzREEyNiIvPiA8L3JkZjpEZXNjcmlwdGlvbj4gPC9yZGY6UkRGPiA8L3g6eG1wbWV0YT4gPD94cGFja2V0IGVuZD0iciI/Pgd7PfIAAAGmSURBVHjaYvr//z8DJZiJgUIANoCRkREb9gLiSVAaQx4OQM7AAkwd7XU2/v++/rOttdYGEB9dASEvOMydGKfH8Gv/p4XTkvRBfLxeQAP+1cUhXopyvzhP7P/IoSj7g7Mw09cNKO6J1QQ0L4gICPIv/veg/8W+JdFvQNLHVsW9/nmn9zk7B+cCkDwhL7gt6knSZnx9/LuCEOcvkIAMP+cvto9nfqyZmmUAksfnBUtbM60gX/3/kgyv3/xSFOL5DZT+L8vP+Yfh5cvfPvp/xUHyQHXGyAYwgpwBjZYFT3Y1OEl/OfCH4ffv3wzc4iwMvNIsDJ+f/mH4+vIPAxsb631WW0Yln6ZpQLXdMK/DXGDflh+sIv37EivD5x//Gb7+YWT4y86sl7BCCkSD+Z++/1dkvsFRl+HnD1Rvje4F8whjMXmGj58YGf5zsDMwcnAwfPvKcml62DsQDeaDxN+/Y0qwlpEHqrdB94IRNIDUgfgfKJChGK4OikEW3gTiXUB950ASLFAF54AC94A0G9QAfOnmF9DCDzABFqS08IHYDIScdijOjQABBgC+/9awBH96jwAAAABJRU5ErkJggg==\");\ background-position: 2px center;\ }\ .ace_gutter-cell.ace_info {\ background-image: url(\"data:image/gif;base64,R0lGODlhEAAQAMQAAAAAAEFBQVJSUl5eXmRkZGtra39/f4WFhYmJiZGRkaampry8vMPDw8zMzNXV1dzc3OTk5Orq6vDw8P///wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACH5BAkAABQALAAAAAAQABAAAAUuICWOZGmeaBml5XGwFCQSBGyXRSAwtqQIiRuiwIM5BoYVbEFIyGCQoeJGrVptIQA7\");\ background-position: 2px center;\ }\ .ace_dark .ace_gutter-cell.ace_info {\ background-image: url(\"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAyRpVFh0WE1MOmNvbS5hZG9iZS54bXAAAAAAADw/eHBhY2tldCBiZWdpbj0i77u/IiBpZD0iVzVNME1wQ2VoaUh6cmVTek5UY3prYzlkIj8+IDx4OnhtcG1ldGEgeG1sbnM6eD0iYWRvYmU6bnM6bWV0YS8iIHg6eG1wdGs9IkFkb2JlIFhNUCBDb3JlIDUuMy1jMDExIDY2LjE0NTY2MSwgMjAxMi8wMi8wNi0xNDo1NjoyNyAgICAgICAgIj4gPHJkZjpSREYgeG1sbnM6cmRmPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5LzAyLzIyLXJkZi1zeW50YXgtbnMjIj4gPHJkZjpEZXNjcmlwdGlvbiByZGY6YWJvdXQ9IiIgeG1sbnM6eG1wPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvIiB4bWxuczp4bXBNTT0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wL21tLyIgeG1sbnM6c3RSZWY9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC9zVHlwZS9SZXNvdXJjZVJlZiMiIHhtcDpDcmVhdG9yVG9vbD0iQWRvYmUgUGhvdG9zaG9wIENTNiAoTWFjaW50b3NoKSIgeG1wTU06SW5zdGFuY2VJRD0ieG1wLmlpZDpGRTk5MTVGREIxNDkxMUUxOTc5Q0FFREQyMTNGMjBFQyIgeG1wTU06RG9jdW1lbnRJRD0ieG1wLmRpZDpGRTk5MTVGRUIxNDkxMUUxOTc5Q0FFREQyMTNGMjBFQyI+IDx4bXBNTTpEZXJpdmVkRnJvbSBzdFJlZjppbnN0YW5jZUlEPSJ4bXAuaWlkOkZFOTkxNUZCQjE0OTExRTE5NzlDQUVERDIxM0YyMEVDIiBzdFJlZjpkb2N1bWVudElEPSJ4bXAuZGlkOkZFOTkxNUZDQjE0OTExRTE5NzlDQUVERDIxM0YyMEVDIi8+IDwvcmRmOkRlc2NyaXB0aW9uPiA8L3JkZjpSREY+IDwveDp4bXBtZXRhPiA8P3hwYWNrZXQgZW5kPSJyIj8+SIDkjAAAAJ1JREFUeNpi/P//PwMlgImBQkB7A6qrq/+DMC55FkIGKCoq4pVnpFkgTp069f/+/fv/r1u37r+tre1/kg0A+ptn9uzZYLaRkRHpLvjw4cNXWVlZhufPnzOcO3eOdAO0tbVPAjHDmzdvGA4fPsxIsgGSkpJmv379Ynj37h2DjIyMCMkG3LhxQ/T27dsMampqDHZ2dq/pH41DxwCAAAMAFdc68dUsFZgAAAAASUVORK5CYII=\");\ }\ .ace_scrollbar {\ position: absolute;\ overflow-x: hidden;\ overflow-y: auto;\ right: 0;\ top: 0;\ bottom: 0;\ z-index: 6;\ }\ .ace_scrollbar-inner {\ position: absolute;\ cursor: text;\ left: 0;\ top: 0;\ }\ .ace_scrollbar-h {\ position: absolute;\ overflow-x: auto;\ overflow-y: hidden;\ right: 0;\ left: 0;\ bottom: 0;\ z-index: 6;\ }\ .ace_print-margin {\ position: absolute;\ height: 100%;\ }\ .ace_text-input {\ position: absolute;\ z-index: 0;\ width: 0.5em;\ height: 1em;\ opacity: 0;\ background: transparent;\ -moz-appearance: none;\ appearance: none;\ border: none;\ resize: none;\ outline: none;\ overflow: hidden;\ font: inherit;\ padding: 0 1px;\ margin: 0 -1px;\ text-indent: -1em;\ }\ .ace_text-input.ace_composition {\ background: #f8f8f8;\ color: #111;\ z-index: 1000;\ opacity: 1;\ text-indent: 0;\ }\ .ace_layer {\ z-index: 1;\ position: absolute;\ overflow: hidden;\ white-space: nowrap;\ height: 100%;\ width: 100%;\ -moz-box-sizing: border-box;\ -webkit-box-sizing: border-box;\ box-sizing: border-box;\ /* setting pointer-events: auto; on node under the mouse, which changes\ during scroll, will break mouse wheel scrolling in Safari */\ pointer-events: none;\ }\ .ace_gutter-layer {\ position: relative;\ width: auto;\ text-align: right;\ pointer-events: auto;\ }\ .ace_text-layer {\ font: inherit !important;\ }\ .ace_cjk {\ display: inline-block;\ text-align: center;\ }\ .ace_cursor-layer {\ z-index: 4;\ }\ .ace_cursor {\ z-index: 4;\ position: absolute;\ -moz-box-sizing: border-box;\ -webkit-box-sizing: border-box;\ box-sizing: border-box;\ border-left: 2px solid\ }\ .ace_slim-cursors .ace_cursor {\ border-left-width: 1px;\ }\ .ace_overwrite-cursors .ace_cursor {\ border-left-width: 0px;\ border-bottom: 1px solid;\ }\ .ace_hidden-cursors .ace_cursor {\ opacity: 0.2;\ }\ .ace_smooth-blinking .ace_cursor {\ -moz-transition: opacity 0.18s;\ -webkit-transition: opacity 0.18s;\ -o-transition: opacity 0.18s;\ -ms-transition: opacity 0.18s;\ transition: opacity 0.18s;\ }\ .ace_cursor[style*=\"opacity: 0\"]{\ -ms-filter: \"progid:DXImageTransform.Microsoft.Alpha(Opacity=0)\";\ }\ .ace_editor.ace_multiselect .ace_cursor {\ border-left-width: 1px;\ }\ .ace_line {\ white-space: nowrap;\ }\ .ace_marker-layer .ace_step, .ace_marker-layer .ace_stack {\ position: absolute;\ z-index: 3;\ }\ .ace_marker-layer .ace_selection {\ position: absolute;\ z-index: 5;\ }\ .ace_marker-layer .ace_bracket {\ position: absolute;\ z-index: 6;\ }\ .ace_marker-layer .ace_active-line {\ position: absolute;\ z-index: 2;\ }\ .ace_marker-layer .ace_selected-word {\ position: absolute;\ z-index: 4;\ -moz-box-sizing: border-box;\ -webkit-box-sizing: border-box;\ box-sizing: border-box;\ }\ .ace_line .ace_fold {\ -moz-box-sizing: border-box;\ -webkit-box-sizing: border-box;\ box-sizing: border-box;\ display: inline-block;\ height: 11px;\ margin-top: -2px;\ vertical-align: middle;\ background-image:\ url(\"data:image/png,%89PNG%0D%0A%1A%0A%00%00%00%0DIHDR%00%00%00%11%00%00%00%09%08%06%00%00%00%D4%E8%C7%0C%00%00%03%1EiCCPICC%20Profile%00%00x%01%85T%DFk%D3P%14%FE%DAe%9D%B0%E1%8B%3Ag%11%09%3Eh%91ndStC%9C%B6kW%BA%CDZ%EA6%B7!H%9B%A6m%5C%9A%C6%24%ED~%B0%07%D9%8Bo%3A%C5w%F1%07%3E%F9%07%0C%D9%83o%7B%92%0D%C6%14a%F8%AC%88%22L%F6%22%B3%9E%9B4M'S%03%B9%F7%BB%DF%F9%EE9'%E7%E4%5E%A0%F9qZ%D3%14%2F%0F%14USO%C5%C2%FC%C4%E4%14%DF%F2%01%5E%1CC%2B%FChM%8B%86%16J%26G%40%0F%D3%B2y%EF%B3%F3%0E%1E%C6lt%EEo%DF%AB%FEc%D5%9A%95%0C%11%F0%1C%20%BE%945%C4%22%E1Y%A0i%5C%D4t%13%E0%D6%89%EF%9D15%C2%CDLsX%A7%04%09%1Fg8oc%81%E1%8C%8D%23%96f45%40%9A%09%C2%07%C5B%3AK%B8%408%98i%E0%F3%0D%D8%CE%81%14%E4'%26%A9%92.%8B%3C%ABER%2F%E5dE%B2%0C%F6%F0%1Fs%83%F2_%B0%A8%94%E9%9B%AD%E7%10%8Dm%9A%19N%D1%7C%8A%DE%1F9%7Dp%8C%E6%00%D5%C1%3F_%18%BDA%B8%9DpX6%E3%A35~B%CD%24%AE%11%26%BD%E7%EEti%98%EDe%9A%97Y)%12%25%1C%24%BCbT%AE3li%E6%0B%03%89%9A%E6%D3%ED%F4P%92%B0%9F4%BF43Y%F3%E3%EDP%95%04%EB1%C5%F5%F6KF%F4%BA%BD%D7%DB%91%93%07%E35%3E%A7)%D6%7F%40%FE%BD%F7%F5r%8A%E5y%92%F0%EB%B4%1E%8D%D5%F4%5B%92%3AV%DB%DB%E4%CD%A6%23%C3%C4wQ%3F%03HB%82%8E%1Cd(%E0%91B%0Ca%9Ac%C4%AA%F8L%16%19%22J%A4%D2itTy%B28%D6%3B(%93%96%ED%1CGx%C9_%0E%B8%5E%16%F5%5B%B2%B8%F6%E0%FB%9E%DD%25%D7%8E%BC%15%85%C5%B7%A3%D8Q%ED%B5%81%E9%BA%B2%13%9A%1B%7Fua%A5%A3n%E17%B9%E5%9B%1Bm%AB%0B%08Q%FE%8A%E5%B1H%5Ee%CAO%82Q%D7u6%E6%90S%97%FCu%0B%CF2%94%EE%25v%12X%0C%BA%AC%F0%5E%F8*l%0AO%85%17%C2%97%BF%D4%C8%CE%DE%AD%11%CB%80q%2C%3E%AB%9ES%CD%C6%EC%25%D2L%D2%EBd%B8%BF%8A%F5B%C6%18%F9%901CZ%9D%BE%24M%9C%8A9%F2%DAP%0B'%06w%82%EB%E6%E2%5C%2F%D7%07%9E%BB%CC%5D%E1%FA%B9%08%AD.r%23%8E%C2%17%F5E%7C!%F0%BE3%BE%3E_%B7o%88a%A7%DB%BE%D3d%EB%A31Z%EB%BB%D3%91%BA%A2%B1z%94%8F%DB'%F6%3D%8E%AA%13%19%B2%B1%BE%B1~V%08%2B%B4%A2cjJ%B3tO%00%03%25mN%97%F3%05%93%EF%11%84%0B%7C%88%AE-%89%8F%ABbW%90O%2B%0Ao%99%0C%5E%97%0CI%AFH%D9.%B0%3B%8F%ED%03%B6S%D6%5D%E6i_s9%F3*p%E9%1B%FD%C3%EB.7U%06%5E%19%C0%D1s.%17%A03u%E4%09%B0%7C%5E%2C%EB%15%DB%1F%3C%9E%B7%80%91%3B%DBc%AD%3Dma%BA%8B%3EV%AB%DBt.%5B%1E%01%BB%0F%AB%D5%9F%CF%AA%D5%DD%E7%E4%7F%0Bx%A3%FC%06%A9%23%0A%D6%C2%A1_2%00%00%00%09pHYs%00%00%0B%13%00%00%0B%13%01%00%9A%9C%18%00%00%00%B5IDAT(%15%A5%91%3D%0E%02!%10%85ac%E1%05%D6%CE%D6%C6%CE%D2%E8%ED%CD%DE%C0%C6%D6N.%E0V%F8%3D%9Ca%891XH%C2%BE%D9y%3F%90!%E6%9C%C3%BFk%E5%011%C6-%F5%C8N%04%DF%BD%FF%89%DFt%83DN%60%3E%F3%AB%A0%DE%1A%5Dg%BE%10Q%97%1B%40%9C%A8o%10%8F%5E%828%B4%1B%60%87%F6%02%26%85%1Ch%1E%C1%2B%5Bk%FF%86%EE%B7j%09%9A%DA%9B%ACe%A3%F9%EC%DA!9%B4%D5%A6%81%86%86%98%CC%3C%5B%40%FA%81%B3%E9%CB%23%94%C16Azo%05%D4%E1%C1%95a%3B%8A'%A0%E8%CC%17%22%85%1D%BA%00%A2%FA%DC%0A%94%D1%D1%8D%8B%3A%84%17B%C7%60%1A%25Z%FC%8D%00%00%00%00IEND%AEB%60%82\"),\ url(\"data:image/png,%89PNG%0D%0A%1A%0A%00%00%00%0DIHDR%00%00%00%05%00%00%007%08%06%00%00%00%C4%DD%80C%00%00%03%1EiCCPICC%20Profile%00%00x%01%85T%DFk%D3P%14%FE%DAe%9D%B0%E1%8B%3Ag%11%09%3Eh%91ndStC%9C%B6kW%BA%CDZ%EA6%B7!H%9B%A6m%5C%9A%C6%24%ED~%B0%07%D9%8Bo%3A%C5w%F1%07%3E%F9%07%0C%D9%83o%7B%92%0D%C6%14a%F8%AC%88%22L%F6%22%B3%9E%9B4M'S%03%B9%F7%BB%DF%F9%EE9'%E7%E4%5E%A0%F9qZ%D3%14%2F%0F%14USO%C5%C2%FC%C4%E4%14%DF%F2%01%5E%1CC%2B%FChM%8B%86%16J%26G%40%0F%D3%B2y%EF%B3%F3%0E%1E%C6lt%EEo%DF%AB%FEc%D5%9A%95%0C%11%F0%1C%20%BE%945%C4%22%E1Y%A0i%5C%D4t%13%E0%D6%89%EF%9D15%C2%CDLsX%A7%04%09%1Fg8oc%81%E1%8C%8D%23%96f45%40%9A%09%C2%07%C5B%3AK%B8%408%98i%E0%F3%0D%D8%CE%81%14%E4'%26%A9%92.%8B%3C%ABER%2F%E5dE%B2%0C%F6%F0%1Fs%83%F2_%B0%A8%94%E9%9B%AD%E7%10%8Dm%9A%19N%D1%7C%8A%DE%1F9%7Dp%8C%E6%00%D5%C1%3F_%18%BDA%B8%9DpX6%E3%A35~B%CD%24%AE%11%26%BD%E7%EEti%98%EDe%9A%97Y)%12%25%1C%24%BCbT%AE3li%E6%0B%03%89%9A%E6%D3%ED%F4P%92%B0%9F4%BF43Y%F3%E3%EDP%95%04%EB1%C5%F5%F6KF%F4%BA%BD%D7%DB%91%93%07%E35%3E%A7)%D6%7F%40%FE%BD%F7%F5r%8A%E5y%92%F0%EB%B4%1E%8D%D5%F4%5B%92%3AV%DB%DB%E4%CD%A6%23%C3%C4wQ%3F%03HB%82%8E%1Cd(%E0%91B%0Ca%9Ac%C4%AA%F8L%16%19%22J%A4%D2itTy%B28%D6%3B(%93%96%ED%1CGx%C9_%0E%B8%5E%16%F5%5B%B2%B8%F6%E0%FB%9E%DD%25%D7%8E%BC%15%85%C5%B7%A3%D8Q%ED%B5%81%E9%BA%B2%13%9A%1B%7Fua%A5%A3n%E17%B9%E5%9B%1Bm%AB%0B%08Q%FE%8A%E5%B1H%5Ee%CAO%82Q%D7u6%E6%90S%97%FCu%0B%CF2%94%EE%25v%12X%0C%BA%AC%F0%5E%F8*l%0AO%85%17%C2%97%BF%D4%C8%CE%DE%AD%11%CB%80q%2C%3E%AB%9ES%CD%C6%EC%25%D2L%D2%EBd%B8%BF%8A%F5B%C6%18%F9%901CZ%9D%BE%24M%9C%8A9%F2%DAP%0B'%06w%82%EB%E6%E2%5C%2F%D7%07%9E%BB%CC%5D%E1%FA%B9%08%AD.r%23%8E%C2%17%F5E%7C!%F0%BE3%BE%3E_%B7o%88a%A7%DB%BE%D3d%EB%A31Z%EB%BB%D3%91%BA%A2%B1z%94%8F%DB'%F6%3D%8E%AA%13%19%B2%B1%BE%B1~V%08%2B%B4%A2cjJ%B3tO%00%03%25mN%97%F3%05%93%EF%11%84%0B%7C%88%AE-%89%8F%ABbW%90O%2B%0Ao%99%0C%5E%97%0CI%AFH%D9.%B0%3B%8F%ED%03%B6S%D6%5D%E6i_s9%F3*p%E9%1B%FD%C3%EB.7U%06%5E%19%C0%D1s.%17%A03u%E4%09%B0%7C%5E%2C%EB%15%DB%1F%3C%9E%B7%80%91%3B%DBc%AD%3Dma%BA%8B%3EV%AB%DBt.%5B%1E%01%BB%0F%AB%D5%9F%CF%AA%D5%DD%E7%E4%7F%0Bx%A3%FC%06%A9%23%0A%D6%C2%A1_2%00%00%00%09pHYs%00%00%0B%13%00%00%0B%13%01%00%9A%9C%18%00%00%00%3AIDAT8%11c%FC%FF%FF%7F%18%03%1A%60%01%F2%3F%A0%891%80%04%FF%11-%F8%17%9BJ%E2%05%B1ZD%81v%26t%E7%80%F8%A3%82h%A12%1A%20%A3%01%02%0F%01%BA%25%06%00%19%C0%0D%AEF%D5%3ES%00%00%00%00IEND%AEB%60%82\");\ background-repeat: no-repeat, repeat-x;\ background-position: center center, top left;\ color: transparent;\ border: 1px solid black;\ -moz-border-radius: 2px;\ -webkit-border-radius: 2px;\ border-radius: 2px;\ cursor: pointer;\ pointer-events: auto;\ }\ .ace_dark .ace_fold {\ }\ .ace_fold:hover{\ background-image:\ url(\"data:image/png,%89PNG%0D%0A%1A%0A%00%00%00%0DIHDR%00%00%00%11%00%00%00%09%08%06%00%00%00%D4%E8%C7%0C%00%00%03%1EiCCPICC%20Profile%00%00x%01%85T%DFk%D3P%14%FE%DAe%9D%B0%E1%8B%3Ag%11%09%3Eh%91ndStC%9C%B6kW%BA%CDZ%EA6%B7!H%9B%A6m%5C%9A%C6%24%ED~%B0%07%D9%8Bo%3A%C5w%F1%07%3E%F9%07%0C%D9%83o%7B%92%0D%C6%14a%F8%AC%88%22L%F6%22%B3%9E%9B4M'S%03%B9%F7%BB%DF%F9%EE9'%E7%E4%5E%A0%F9qZ%D3%14%2F%0F%14USO%C5%C2%FC%C4%E4%14%DF%F2%01%5E%1CC%2B%FChM%8B%86%16J%26G%40%0F%D3%B2y%EF%B3%F3%0E%1E%C6lt%EEo%DF%AB%FEc%D5%9A%95%0C%11%F0%1C%20%BE%945%C4%22%E1Y%A0i%5C%D4t%13%E0%D6%89%EF%9D15%C2%CDLsX%A7%04%09%1Fg8oc%81%E1%8C%8D%23%96f45%40%9A%09%C2%07%C5B%3AK%B8%408%98i%E0%F3%0D%D8%CE%81%14%E4'%26%A9%92.%8B%3C%ABER%2F%E5dE%B2%0C%F6%F0%1Fs%83%F2_%B0%A8%94%E9%9B%AD%E7%10%8Dm%9A%19N%D1%7C%8A%DE%1F9%7Dp%8C%E6%00%D5%C1%3F_%18%BDA%B8%9DpX6%E3%A35~B%CD%24%AE%11%26%BD%E7%EEti%98%EDe%9A%97Y)%12%25%1C%24%BCbT%AE3li%E6%0B%03%89%9A%E6%D3%ED%F4P%92%B0%9F4%BF43Y%F3%E3%EDP%95%04%EB1%C5%F5%F6KF%F4%BA%BD%D7%DB%91%93%07%E35%3E%A7)%D6%7F%40%FE%BD%F7%F5r%8A%E5y%92%F0%EB%B4%1E%8D%D5%F4%5B%92%3AV%DB%DB%E4%CD%A6%23%C3%C4wQ%3F%03HB%82%8E%1Cd(%E0%91B%0Ca%9Ac%C4%AA%F8L%16%19%22J%A4%D2itTy%B28%D6%3B(%93%96%ED%1CGx%C9_%0E%B8%5E%16%F5%5B%B2%B8%F6%E0%FB%9E%DD%25%D7%8E%BC%15%85%C5%B7%A3%D8Q%ED%B5%81%E9%BA%B2%13%9A%1B%7Fua%A5%A3n%E17%B9%E5%9B%1Bm%AB%0B%08Q%FE%8A%E5%B1H%5Ee%CAO%82Q%D7u6%E6%90S%97%FCu%0B%CF2%94%EE%25v%12X%0C%BA%AC%F0%5E%F8*l%0AO%85%17%C2%97%BF%D4%C8%CE%DE%AD%11%CB%80q%2C%3E%AB%9ES%CD%C6%EC%25%D2L%D2%EBd%B8%BF%8A%F5B%C6%18%F9%901CZ%9D%BE%24M%9C%8A9%F2%DAP%0B'%06w%82%EB%E6%E2%5C%2F%D7%07%9E%BB%CC%5D%E1%FA%B9%08%AD.r%23%8E%C2%17%F5E%7C!%F0%BE3%BE%3E_%B7o%88a%A7%DB%BE%D3d%EB%A31Z%EB%BB%D3%91%BA%A2%B1z%94%8F%DB'%F6%3D%8E%AA%13%19%B2%B1%BE%B1~V%08%2B%B4%A2cjJ%B3tO%00%03%25mN%97%F3%05%93%EF%11%84%0B%7C%88%AE-%89%8F%ABbW%90O%2B%0Ao%99%0C%5E%97%0CI%AFH%D9.%B0%3B%8F%ED%03%B6S%D6%5D%E6i_s9%F3*p%E9%1B%FD%C3%EB.7U%06%5E%19%C0%D1s.%17%A03u%E4%09%B0%7C%5E%2C%EB%15%DB%1F%3C%9E%B7%80%91%3B%DBc%AD%3Dma%BA%8B%3EV%AB%DBt.%5B%1E%01%BB%0F%AB%D5%9F%CF%AA%D5%DD%E7%E4%7F%0Bx%A3%FC%06%A9%23%0A%D6%C2%A1_2%00%00%00%09pHYs%00%00%0B%13%00%00%0B%13%01%00%9A%9C%18%00%00%00%B5IDAT(%15%A5%91%3D%0E%02!%10%85ac%E1%05%D6%CE%D6%C6%CE%D2%E8%ED%CD%DE%C0%C6%D6N.%E0V%F8%3D%9Ca%891XH%C2%BE%D9y%3F%90!%E6%9C%C3%BFk%E5%011%C6-%F5%C8N%04%DF%BD%FF%89%DFt%83DN%60%3E%F3%AB%A0%DE%1A%5Dg%BE%10Q%97%1B%40%9C%A8o%10%8F%5E%828%B4%1B%60%87%F6%02%26%85%1Ch%1E%C1%2B%5Bk%FF%86%EE%B7j%09%9A%DA%9B%ACe%A3%F9%EC%DA!9%B4%D5%A6%81%86%86%98%CC%3C%5B%40%FA%81%B3%E9%CB%23%94%C16Azo%05%D4%E1%C1%95a%3B%8A'%A0%E8%CC%17%22%85%1D%BA%00%A2%FA%DC%0A%94%D1%D1%8D%8B%3A%84%17B%C7%60%1A%25Z%FC%8D%00%00%00%00IEND%AEB%60%82\"),\ url(\"data:image/png,%89PNG%0D%0A%1A%0A%00%00%00%0DIHDR%00%00%00%05%00%00%007%08%06%00%00%00%C4%DD%80C%00%00%03%1EiCCPICC%20Profile%00%00x%01%85T%DFk%D3P%14%FE%DAe%9D%B0%E1%8B%3Ag%11%09%3Eh%91ndStC%9C%B6kW%BA%CDZ%EA6%B7!H%9B%A6m%5C%9A%C6%24%ED~%B0%07%D9%8Bo%3A%C5w%F1%07%3E%F9%07%0C%D9%83o%7B%92%0D%C6%14a%F8%AC%88%22L%F6%22%B3%9E%9B4M'S%03%B9%F7%BB%DF%F9%EE9'%E7%E4%5E%A0%F9qZ%D3%14%2F%0F%14USO%C5%C2%FC%C4%E4%14%DF%F2%01%5E%1CC%2B%FChM%8B%86%16J%26G%40%0F%D3%B2y%EF%B3%F3%0E%1E%C6lt%EEo%DF%AB%FEc%D5%9A%95%0C%11%F0%1C%20%BE%945%C4%22%E1Y%A0i%5C%D4t%13%E0%D6%89%EF%9D15%C2%CDLsX%A7%04%09%1Fg8oc%81%E1%8C%8D%23%96f45%40%9A%09%C2%07%C5B%3AK%B8%408%98i%E0%F3%0D%D8%CE%81%14%E4'%26%A9%92.%8B%3C%ABER%2F%E5dE%B2%0C%F6%F0%1Fs%83%F2_%B0%A8%94%E9%9B%AD%E7%10%8Dm%9A%19N%D1%7C%8A%DE%1F9%7Dp%8C%E6%00%D5%C1%3F_%18%BDA%B8%9DpX6%E3%A35~B%CD%24%AE%11%26%BD%E7%EEti%98%EDe%9A%97Y)%12%25%1C%24%BCbT%AE3li%E6%0B%03%89%9A%E6%D3%ED%F4P%92%B0%9F4%BF43Y%F3%E3%EDP%95%04%EB1%C5%F5%F6KF%F4%BA%BD%D7%DB%91%93%07%E35%3E%A7)%D6%7F%40%FE%BD%F7%F5r%8A%E5y%92%F0%EB%B4%1E%8D%D5%F4%5B%92%3AV%DB%DB%E4%CD%A6%23%C3%C4wQ%3F%03HB%82%8E%1Cd(%E0%91B%0Ca%9Ac%C4%AA%F8L%16%19%22J%A4%D2itTy%B28%D6%3B(%93%96%ED%1CGx%C9_%0E%B8%5E%16%F5%5B%B2%B8%F6%E0%FB%9E%DD%25%D7%8E%BC%15%85%C5%B7%A3%D8Q%ED%B5%81%E9%BA%B2%13%9A%1B%7Fua%A5%A3n%E17%B9%E5%9B%1Bm%AB%0B%08Q%FE%8A%E5%B1H%5Ee%CAO%82Q%D7u6%E6%90S%97%FCu%0B%CF2%94%EE%25v%12X%0C%BA%AC%F0%5E%F8*l%0AO%85%17%C2%97%BF%D4%C8%CE%DE%AD%11%CB%80q%2C%3E%AB%9ES%CD%C6%EC%25%D2L%D2%EBd%B8%BF%8A%F5B%C6%18%F9%901CZ%9D%BE%24M%9C%8A9%F2%DAP%0B'%06w%82%EB%E6%E2%5C%2F%D7%07%9E%BB%CC%5D%E1%FA%B9%08%AD.r%23%8E%C2%17%F5E%7C!%F0%BE3%BE%3E_%B7o%88a%A7%DB%BE%D3d%EB%A31Z%EB%BB%D3%91%BA%A2%B1z%94%8F%DB'%F6%3D%8E%AA%13%19%B2%B1%BE%B1~V%08%2B%B4%A2cjJ%B3tO%00%03%25mN%97%F3%05%93%EF%11%84%0B%7C%88%AE-%89%8F%ABbW%90O%2B%0Ao%99%0C%5E%97%0CI%AFH%D9.%B0%3B%8F%ED%03%B6S%D6%5D%E6i_s9%F3*p%E9%1B%FD%C3%EB.7U%06%5E%19%C0%D1s.%17%A03u%E4%09%B0%7C%5E%2C%EB%15%DB%1F%3C%9E%B7%80%91%3B%DBc%AD%3Dma%BA%8B%3EV%AB%DBt.%5B%1E%01%BB%0F%AB%D5%9F%CF%AA%D5%DD%E7%E4%7F%0Bx%A3%FC%06%A9%23%0A%D6%C2%A1_2%00%00%00%09pHYs%00%00%0B%13%00%00%0B%13%01%00%9A%9C%18%00%00%003IDAT8%11c%FC%FF%FF%7F%3E%03%1A%60%01%F2%3F%A3%891%80%04%FFQ%26%F8w%C0%B43%A1%DB%0C%E2%8F%0A%A2%85%CAh%80%8C%06%08%3C%04%E8%96%18%00%A3S%0D%CD%CF%D8%C1%9D%00%00%00%00IEND%AEB%60%82\");\ background-repeat: no-repeat, repeat-x;\ background-position: center center, top left;\ }\ .ace_gutter-tooltip {\ background-color: #FFF;\ background-image: -webkit-linear-gradient(top, transparent, rgba(0, 0, 0, 0.1));\ background-image: linear-gradient(to bottom, transparent, rgba(0, 0, 0, 0.1));\ border: 1px solid gray;\ border-radius: 1px;\ box-shadow: 0 1px 2px rgba(0, 0, 0, 0.3);\ color: black;\ display: inline-block;\ max-width: 500px;\ padding: 4px;\ position: fixed;\ z-index: 999999;\ -moz-box-sizing: border-box;\ -webkit-box-sizing: border-box;\ box-sizing: border-box;\ cursor: default;\ white-space: pre-line;\ word-wrap: break-word;\ line-height: normal;\ font-style: normal;\ font-weight: normal;\ letter-spacing: normal;\ }\ .ace_folding-enabled > .ace_gutter-cell {\ padding-right: 13px;\ }\ .ace_fold-widget {\ -moz-box-sizing: border-box;\ -webkit-box-sizing: border-box;\ box-sizing: border-box;\ margin: 0 -12px 0 1px;\ display: none;\ width: 11px;\ vertical-align: top;\ background-image: url(\"data:image/png,%89PNG%0D%0A%1A%0A%00%00%00%0DIHDR%00%00%00%05%00%00%00%05%08%06%00%00%00%8Do%26%E5%00%00%004IDATx%DAe%8A%B1%0D%000%0C%C2%F2%2CK%96%BC%D0%8F9%81%88H%E9%D0%0E%96%C0%10%92%3E%02%80%5E%82%E4%A9*-%EEsw%C8%CC%11%EE%96w%D8%DC%E9*Eh%0C%151(%00%00%00%00IEND%AEB%60%82\");\ background-repeat: no-repeat;\ background-position: center;\ border-radius: 3px;\ border: 1px solid transparent;\ cursor: pointer;\ }\ .ace_folding-enabled .ace_fold-widget {\ display: inline-block; \ }\ .ace_fold-widget.ace_end {\ background-image: url(\"data:image/png,%89PNG%0D%0A%1A%0A%00%00%00%0DIHDR%00%00%00%05%00%00%00%05%08%06%00%00%00%8Do%26%E5%00%00%004IDATx%DAm%C7%C1%09%000%08C%D1%8C%ECE%C8E(%8E%EC%02)%1EZJ%F1%C1'%04%07I%E1%E5%EE%CAL%F5%A2%99%99%22%E2%D6%1FU%B5%FE0%D9x%A7%26Wz5%0E%D5%00%00%00%00IEND%AEB%60%82\");\ }\ .ace_fold-widget.ace_closed {\ background-image: url(\"data:image/png,%89PNG%0D%0A%1A%0A%00%00%00%0DIHDR%00%00%00%03%00%00%00%06%08%06%00%00%00%06%E5%24%0C%00%00%009IDATx%DA5%CA%C1%09%000%08%03%C0%AC*(%3E%04%C1%0D%BA%B1%23%A4Uh%E0%20%81%C0%CC%F8%82%81%AA%A2%AArGfr%88%08%11%11%1C%DD%7D%E0%EE%5B%F6%F6%CB%B8%05Q%2F%E9tai%D9%00%00%00%00IEND%AEB%60%82\");\ }\ .ace_fold-widget:hover {\ border: 1px solid rgba(0, 0, 0, 0.3);\ background-color: rgba(255, 255, 255, 0.2);\ -moz-box-shadow: 0 1px 1px rgba(255, 255, 255, 0.7);\ -webkit-box-shadow: 0 1px 1px rgba(255, 255, 255, 0.7);\ box-shadow: 0 1px 1px rgba(255, 255, 255, 0.7);\ }\ .ace_fold-widget:active {\ border: 1px solid rgba(0, 0, 0, 0.4);\ background-color: rgba(0, 0, 0, 0.05);\ -moz-box-shadow: 0 1px 1px rgba(255, 255, 255, 0.8);\ -webkit-box-shadow: 0 1px 1px rgba(255, 255, 255, 0.8);\ box-shadow: 0 1px 1px rgba(255, 255, 255, 0.8);\ }\ /**\ * Dark version for fold widgets\ */\ .ace_dark .ace_fold-widget {\ background-image: url(\"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAUAAAAFCAYAAACNbyblAAAAHklEQVQIW2P4//8/AzoGEQ7oGCaLLAhWiSwB146BAQCSTPYocqT0AAAAAElFTkSuQmCC\");\ }\ .ace_dark .ace_fold-widget.ace_end {\ background-image: url(\"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAUAAAAFCAYAAACNbyblAAAAH0lEQVQIW2P4//8/AxQ7wNjIAjDMgC4AxjCVKBirIAAF0kz2rlhxpAAAAABJRU5ErkJggg==\");\ }\ .ace_dark .ace_fold-widget.ace_closed {\ background-image: url(\"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAMAAAAFCAYAAACAcVaiAAAAHElEQVQIW2P4//+/AxAzgDADlOOAznHAKgPWAwARji8UIDTfQQAAAABJRU5ErkJggg==\");\ }\ .ace_dark .ace_fold-widget:hover {\ box-shadow: 0 1px 1px rgba(255, 255, 255, 0.2);\ background-color: rgba(255, 255, 255, 0.1);\ }\ .ace_dark .ace_fold-widget:active {\ -moz-box-shadow: 0 1px 1px rgba(255, 255, 255, 0.2);\ -webkit-box-shadow: 0 1px 1px rgba(255, 255, 255, 0.2);\ box-shadow: 0 1px 1px rgba(255, 255, 255, 0.2);\ }\ .ace_fold-widget.ace_invalid {\ background-color: #FFB4B4;\ border-color: #DE5555;\ }\ .ace_fade-fold-widgets .ace_fold-widget {\ -moz-transition: opacity 0.4s ease 0.05s;\ -webkit-transition: opacity 0.4s ease 0.05s;\ -o-transition: opacity 0.4s ease 0.05s;\ -ms-transition: opacity 0.4s ease 0.05s;\ transition: opacity 0.4s ease 0.05s;\ opacity: 0;\ }\ .ace_fade-fold-widgets:hover .ace_fold-widget {\ -moz-transition: opacity 0.05s ease 0.05s;\ -webkit-transition: opacity 0.05s ease 0.05s;\ -o-transition: opacity 0.05s ease 0.05s;\ -ms-transition: opacity 0.05s ease 0.05s;\ transition: opacity 0.05s ease 0.05s;\ opacity:1;\ }\ .ace_underline {\ text-decoration: underline;\ }\ .ace_bold {\ font-weight: bold;\ }\ .ace_nobold .ace_bold {\ font-weight: normal;\ }\ .ace_italic {\ font-style: italic;\ }\ .ace_error-marker {\ background-color: rgba(255, 0, 0,0.2);\ position: absolute;\ z-index: 9;\ }\ .ace_highlight-marker {\ background-color: rgba(255, 255, 0,0.2);\ position: absolute;\ z-index: 8;\ }\ "; dom.importCssString(editorCss, "ace_editor"); var VirtualRenderer = function(container, theme) { var _self = this; this.container = container || dom.createElement("div"); this.$keepTextAreaAtCursor = true; dom.addCssClass(this.container, "ace_editor"); this.setTheme(theme); this.$gutter = dom.createElement("div"); this.$gutter.className = "ace_gutter"; this.container.appendChild(this.$gutter); this.scroller = dom.createElement("div"); this.scroller.className = "ace_scroller"; this.container.appendChild(this.scroller); this.content = dom.createElement("div"); this.content.className = "ace_content"; this.scroller.appendChild(this.content); this.$gutterLayer = new GutterLayer(this.$gutter); this.$gutterLayer.on("changeGutterWidth", this.onGutterResize.bind(this)); this.$markerBack = new MarkerLayer(this.content); var textLayer = this.$textLayer = new TextLayer(this.content); this.canvas = textLayer.element; this.$markerFront = new MarkerLayer(this.content); this.$cursorLayer = new CursorLayer(this.content); this.$horizScroll = false; this.$vScroll = false; this.scrollBar = this.scrollBarV = new ScrollBarV(this.container, this); this.scrollBarH = new ScrollBarH(this.container, this); this.scrollBarV.addEventListener("scroll", function(e) { if (!_self.$scrollAnimation) _self.session.setScrollTop(e.data - _self.scrollMargin.top); }); this.scrollBarH.addEventListener("scroll", function(e) { if (!_self.$scrollAnimation) _self.session.setScrollLeft(e.data - _self.scrollMargin.left); }); this.scrollTop = 0; this.scrollLeft = 0; this.cursorPos = { row : 0, column : 0 }; this.$textLayer.addEventListener("changeCharacterSize", function() { _self.updateCharacterSize(); _self.onResize(true); _self._signal("changeCharacterSize"); }); this.$size = { width: 0, height: 0, scrollerHeight: 0, scrollerWidth: 0 }; this.layerConfig = { width : 1, padding : 0, firstRow : 0, firstRowScreen: 0, lastRow : 0, lineHeight : 0, characterWidth : 0, minHeight : 1, maxHeight : 1, offset : 0, height : 1 }; this.scrollMargin = { left: 0, right: 0, top: 0, bottom: 0, v: 0, h: 0 }; this.$loop = new RenderLoop( this.$renderChanges.bind(this), this.container.ownerDocument.defaultView ); this.$loop.schedule(this.CHANGE_FULL); this.updateCharacterSize(); this.setPadding(4); config.resetOptions(this); config._emit("renderer", this); }; (function() { this.CHANGE_CURSOR = 1; this.CHANGE_MARKER = 2; this.CHANGE_GUTTER = 4; this.CHANGE_SCROLL = 8; this.CHANGE_LINES = 16; this.CHANGE_TEXT = 32; this.CHANGE_SIZE = 64; this.CHANGE_MARKER_BACK = 128; this.CHANGE_MARKER_FRONT = 256; this.CHANGE_FULL = 512; this.CHANGE_H_SCROLL = 1024; oop.implement(this, EventEmitter); this.updateCharacterSize = function() { if (this.$textLayer.allowBoldFonts != this.$allowBoldFonts) { this.$allowBoldFonts = this.$textLayer.allowBoldFonts; this.setStyle("ace_nobold", !this.$allowBoldFonts); } this.layerConfig.characterWidth = this.characterWidth = this.$textLayer.getCharacterWidth(); this.layerConfig.lineHeight = this.lineHeight = this.$textLayer.getLineHeight(); this.$updatePrintMargin(); }; this.setSession = function(session) { this.session = session; this.scroller.className = "ace_scroller"; this.$cursorLayer.setSession(session); this.$markerBack.setSession(session); this.$markerFront.setSession(session); this.$gutterLayer.setSession(session); this.$textLayer.setSession(session); this.$loop.schedule(this.CHANGE_FULL); }; this.updateLines = function(firstRow, lastRow) { if (lastRow === undefined) lastRow = Infinity; if (!this.$changedLines) { this.$changedLines = { firstRow: firstRow, lastRow: lastRow }; } else { if (this.$changedLines.firstRow > firstRow) this.$changedLines.firstRow = firstRow; if (this.$changedLines.lastRow < lastRow) this.$changedLines.lastRow = lastRow; } if (this.$changedLines.firstRow > this.layerConfig.lastRow || this.$changedLines.lastRow < this.layerConfig.firstRow) return; this.$loop.schedule(this.CHANGE_LINES); }; this.onChangeTabSize = function() { this.$loop.schedule(this.CHANGE_TEXT | this.CHANGE_MARKER); this.$textLayer.onChangeTabSize(); }; this.updateText = function() { this.$loop.schedule(this.CHANGE_TEXT); }; this.updateFull = function(force) { if (force) this.$renderChanges(this.CHANGE_FULL, true); else this.$loop.schedule(this.CHANGE_FULL); }; this.updateFontSize = function() { this.$textLayer.checkForSizeChanges(); }; this.$changes = 0; this.onResize = function(force, gutterWidth, width, height) { if (this.resizing > 2) return; else if (this.resizing > 0) this.resizing++; else this.resizing = force ? 1 : 0; var el = this.container; if (!height) height = el.clientHeight || el.scrollHeight; if (!width) width = el.clientWidth || el.scrollWidth; var changes = this.$updateCachedSize(force, gutterWidth, width, height); if (!this.$size.scrollerHeight || (!width && !height)) return this.resizing = 0; if (force) this.$gutterLayer.$padding = null; if (force) this.$renderChanges(changes, true); else this.$loop.schedule(changes | this.$changes); if (this.resizing) this.resizing = 0; }; this.$updateCachedSize = function(force, gutterWidth, width, height) { var changes = 0; var size = this.$size; var oldSize = { width: size.width, height: size.height, scrollerHeight: size.scrollerHeight, scrollerWidth: size.scrollerWidth }; if (height && (force || size.height != height)) { size.height = height; changes = this.CHANGE_SIZE; size.scrollerHeight = size.height; if (this.$horizScroll) size.scrollerHeight -= this.scrollBarH.getHeight(); this.scrollBarV.element.style.bottom = this.scrollBarH.getHeight() + "px"; if (this.session) { this.session.setScrollTop(this.getScrollTop()); changes = changes | this.CHANGE_SCROLL; } } if (width && (force || size.width != width)) { changes = this.CHANGE_SIZE; size.width = width; if (gutterWidth == null) gutterWidth = this.$showGutter ? this.$gutter.offsetWidth : 0; this.gutterWidth = gutterWidth; this.scrollBarH.element.style.left = this.scroller.style.left = gutterWidth + "px"; size.scrollerWidth = Math.max(0, width - gutterWidth - this.scrollBarV.getWidth()); this.scrollBarH.element.style.right = this.scroller.style.right = this.scrollBarV.getWidth() + "px"; this.scroller.style.bottom = this.scrollBarH.getHeight() + "px"; if (this.session && this.session.getUseWrapMode() && this.adjustWrapLimit() || force) changes = changes | this.CHANGE_FULL; } if (changes) this._signal("resize", oldSize); return changes; }; this.onGutterResize = function() { var gutterWidth = this.$showGutter ? this.$gutter.offsetWidth : 0; if (gutterWidth != this.gutterWidth) this.$changes |= this.$updateCachedSize(true, gutterWidth, this.$size.width, this.$size.height); if (this.session.getUseWrapMode() && this.adjustWrapLimit()) this.$loop.schedule(this.CHANGE_FULL); else { this.$computeLayerConfig(); this.$loop.schedule(this.CHANGE_MARKER); } }; this.adjustWrapLimit = function() { var availableWidth = this.$size.scrollerWidth - this.$padding * 2; var limit = Math.floor(availableWidth / this.characterWidth); return this.session.adjustWrapLimit(limit, this.$showPrintMargin && this.$printMarginColumn); }; this.setAnimatedScroll = function(shouldAnimate){ this.setOption("animatedScroll", shouldAnimate); }; this.getAnimatedScroll = function() { return this.$animatedScroll; }; this.setShowInvisibles = function(showInvisibles) { this.setOption("showInvisibles", showInvisibles); }; this.getShowInvisibles = function() { return this.getOption("showInvisibles"); }; this.getDisplayIndentGuides = function() { return this.getOption("displayIndentGuides"); }; this.setDisplayIndentGuides = function(display) { this.setOption("displayIndentGuides", display); }; this.setShowPrintMargin = function(showPrintMargin) { this.setOption("showPrintMargin", showPrintMargin); }; this.getShowPrintMargin = function() { return this.getOption("showPrintMargin"); }; this.setPrintMarginColumn = function(showPrintMargin) { this.setOption("printMarginColumn", showPrintMargin); }; this.getPrintMarginColumn = function() { return this.getOption("printMarginColumn"); }; this.getShowGutter = function(){ return this.getOption("showGutter"); }; this.setShowGutter = function(show){ return this.setOption("showGutter", show); }; this.getFadeFoldWidgets = function(){ return this.getOption("fadeFoldWidgets") }; this.setFadeFoldWidgets = function(show) { this.setOption("fadeFoldWidgets", show); }; this.setHighlightGutterLine = function(shouldHighlight) { this.setOption("highlightGutterLine", shouldHighlight); }; this.getHighlightGutterLine = function() { return this.getOption("highlightGutterLine"); }; this.$updateGutterLineHighlight = function() { var pos = this.$cursorLayer.$pixelPos; var height = this.layerConfig.lineHeight; if (this.session.getUseWrapMode()) { var cursor = this.session.selection.getCursor(); cursor.column = 0; pos = this.$cursorLayer.getPixelPosition(cursor, true); height *= this.session.getRowLength(cursor.row); } this.$gutterLineHighlight.style.top = pos.top - this.layerConfig.offset + "px"; this.$gutterLineHighlight.style.height = height + "px"; }; this.$updatePrintMargin = function() { if (!this.$showPrintMargin && !this.$printMarginEl) return; if (!this.$printMarginEl) { var containerEl = dom.createElement("div"); containerEl.className = "ace_layer ace_print-margin-layer"; this.$printMarginEl = dom.createElement("div"); this.$printMarginEl.className = "ace_print-margin"; containerEl.appendChild(this.$printMarginEl); this.content.insertBefore(containerEl, this.content.firstChild); } var style = this.$printMarginEl.style; style.left = ((this.characterWidth * this.$printMarginColumn) + this.$padding) + "px"; style.visibility = this.$showPrintMargin ? "visible" : "hidden"; if (this.session && this.session.$wrap == -1) this.adjustWrapLimit(); }; this.getContainerElement = function() { return this.container; }; this.getMouseEventTarget = function() { return this.content; }; this.getTextAreaContainer = function() { return this.container; }; this.$moveTextAreaToCursor = function() { if (!this.$keepTextAreaAtCursor) return; var config = this.layerConfig; var posTop = this.$cursorLayer.$pixelPos.top; var posLeft = this.$cursorLayer.$pixelPos.left; posTop -= config.offset; var h = this.lineHeight; if (posTop < 0 || posTop > config.height - h) return; var w = this.characterWidth; if (this.$composition) { var val = this.textarea.value.replace(/^\x01+/, ""); w *= (this.session.$getStringScreenWidth(val)[0]+2); h += 2; posTop -= 1; } posLeft -= this.scrollLeft; if (posLeft > this.$size.scrollerWidth - w) posLeft = this.$size.scrollerWidth - w; posLeft -= this.scrollBar.width; this.textarea.style.height = h + "px"; this.textarea.style.width = w + "px"; this.textarea.style.right = Math.max(0, this.$size.scrollerWidth - posLeft - w) + "px"; this.textarea.style.bottom = Math.max(0, this.$size.height - posTop - h) + "px"; }; this.getFirstVisibleRow = function() { return this.layerConfig.firstRow; }; this.getFirstFullyVisibleRow = function() { return this.layerConfig.firstRow + (this.layerConfig.offset === 0 ? 0 : 1); }; this.getLastFullyVisibleRow = function() { var flint = Math.floor((this.layerConfig.height + this.layerConfig.offset) / this.layerConfig.lineHeight); return this.layerConfig.firstRow - 1 + flint; }; this.getLastVisibleRow = function() { return this.layerConfig.lastRow; }; this.$padding = null; this.setPadding = function(padding) { this.$padding = padding; this.$textLayer.setPadding(padding); this.$cursorLayer.setPadding(padding); this.$markerFront.setPadding(padding); this.$markerBack.setPadding(padding); this.$loop.schedule(this.CHANGE_FULL); this.$updatePrintMargin(); }; this.setScrollMargin = function(top, bottom, left, right) { var sm = this.scrollMargin; sm.top = top|0; sm.bottom = bottom|0; sm.right = right|0; sm.left = left|0; sm.v = sm.top + sm.bottom; sm.h = sm.left + sm.right; this.updateFull(); }; this.getHScrollBarAlwaysVisible = function() { return this.$hScrollBarAlwaysVisible; }; this.setHScrollBarAlwaysVisible = function(alwaysVisible) { this.setOption("hScrollBarAlwaysVisible", alwaysVisible); }; this.getVScrollBarAlwaysVisible = function() { return this.$hScrollBarAlwaysVisible; }; this.setVScrollBarAlwaysVisible = function(alwaysVisible) { this.setOption("vScrollBarAlwaysVisible", alwaysVisible); }; this.$updateScrollBarV = function() { this.scrollBarV.setInnerHeight(this.layerConfig.maxHeight + this.scrollMargin.v); this.scrollBarV.setScrollTop(this.scrollTop + this.scrollMargin.top); }; this.$updateScrollBarH = function() { this.scrollBarH.setInnerWidth(this.layerConfig.width + 2 * this.$padding + this.scrollMargin.h); this.scrollBarH.setScrollLeft(this.scrollLeft + this.scrollMargin.left); }; this.$renderChanges = function(changes, force) { if (this.$changes) { changes |= this.$changes; this.$changes = 0; } if ((!this.session || !this.container.offsetWidth) || (!changes && !force)) { this.$changes |= changes; return; } if (!this.$size.width) { this.$changes |= changes; return this.onResize(true); } if (!this.lineHeight) { this.$textLayer.checkForSizeChanges(); } this._signal("beforeRender"); if (changes & this.CHANGE_FULL || changes & this.CHANGE_SIZE || changes & this.CHANGE_TEXT || changes & this.CHANGE_LINES || changes & this.CHANGE_SCROLL || changes & this.CHANGE_H_SCROLL ) changes |= this.$computeLayerConfig(); if (changes & this.CHANGE_H_SCROLL) { this.$updateScrollBarH(); this.content.style.marginLeft = -this.scrollLeft + "px"; this.scroller.className = this.scrollLeft <= 0 ? "ace_scroller" : "ace_scroller ace_scroll-left"; } if (changes & this.CHANGE_FULL) { this.$updateScrollBarV(); this.$updateScrollBarH(); this.$textLayer.update(this.layerConfig); if (this.$showGutter) this.$gutterLayer.update(this.layerConfig); this.$markerBack.update(this.layerConfig); this.$markerFront.update(this.layerConfig); this.$cursorLayer.update(this.layerConfig); this.$moveTextAreaToCursor(); this.$highlightGutterLine && this.$updateGutterLineHighlight(); this._signal("afterRender"); return; } if (changes & this.CHANGE_SCROLL) { this.$updateScrollBarV(); if (changes & this.CHANGE_TEXT || changes & this.CHANGE_LINES) this.$textLayer.update(this.layerConfig); else this.$textLayer.scrollLines(this.layerConfig); if (this.$showGutter) this.$gutterLayer.update(this.layerConfig); this.$markerBack.update(this.layerConfig); this.$markerFront.update(this.layerConfig); this.$cursorLayer.update(this.layerConfig); this.$highlightGutterLine && this.$updateGutterLineHighlight(); this.$moveTextAreaToCursor(); this._signal("afterRender"); return; } if (changes & this.CHANGE_TEXT) { this.$textLayer.update(this.layerConfig); if (this.$showGutter) this.$gutterLayer.update(this.layerConfig); } else if (changes & this.CHANGE_LINES) { if (this.$updateLines() || (changes & this.CHANGE_GUTTER) && this.$showGutter) this.$gutterLayer.update(this.layerConfig); } else if (changes & this.CHANGE_TEXT || changes & this.CHANGE_GUTTER) { if (this.$showGutter) this.$gutterLayer.update(this.layerConfig); } if (changes & this.CHANGE_CURSOR) { this.$cursorLayer.update(this.layerConfig); this.$moveTextAreaToCursor(); this.$highlightGutterLine && this.$updateGutterLineHighlight(); } if (changes & (this.CHANGE_MARKER | this.CHANGE_MARKER_FRONT)) { this.$markerFront.update(this.layerConfig); } if (changes & (this.CHANGE_MARKER | this.CHANGE_MARKER_BACK)) { this.$markerBack.update(this.layerConfig); } if (changes & this.CHANGE_SIZE || changes & this.CHANGE_LINES) { this.$updateScrollBarV(); this.$updateScrollBarH(); } this._signal("afterRender"); }; this.$autosize = function(height, width) { var height = this.session.getScreenLength() * this.lineHeight; var maxHeight = this.$maxLines * this.lineHeight; var desiredHeight = Math.max( (this.$minLines||1) * this.lineHeight, Math.min(maxHeight, height) ); var vScroll = height > maxHeight; if (desiredHeight != this.desiredHeight || this.$size.height != this.desiredHeight || vScroll != this.$vScroll) { if (vScroll != this.$vScroll) { this.$vScroll = vScroll; this.scrollBarV.setVisible(vScroll); } var w = this.container.clientWidth; this.container.style.height = desiredHeight + "px"; this.$updateCachedSize(true, this.$gutterWidth, w, desiredHeight); this.desiredHeight = desiredHeight; } }; this.$computeLayerConfig = function() { if (this.$maxLines && this.lineHeight > 1) this.$autosize(); var session = this.session; var hideScrollbars = this.$size.height <= 2 * this.lineHeight; var screenLines = this.session.getScreenLength() var maxHeight = screenLines * this.lineHeight; var offset = this.scrollTop % this.lineHeight; var minHeight = this.$size.scrollerHeight + this.lineHeight; var longestLine = this.$getLongestLine(); var horizScroll = !hideScrollbars && (this.$hScrollBarAlwaysVisible || this.$size.scrollerWidth - longestLine - 2 * this.$padding < 0); var hScrollChanged = this.$horizScroll !== horizScroll; if (hScrollChanged) { this.$horizScroll = horizScroll; this.scrollBarH.setVisible(horizScroll); } if (!this.$maxLines && this.$scrollPastEnd) { if (this.scrollTop > maxHeight - this.$size.scrollerHeight) maxHeight += Math.min( (this.$size.scrollerHeight - this.lineHeight) * this.$scrollPastEnd, this.scrollTop - maxHeight + this.$size.scrollerHeight ); } var vScroll = !hideScrollbars && (this.$vScrollBarAlwaysVisible || this.$size.scrollerHeight - maxHeight < 0); var vScrollChanged = this.$vScroll !== vScroll; if (vScrollChanged) { this.$vScroll = vScroll; this.scrollBarV.setVisible(vScroll); } this.session.setScrollTop(Math.max(-this.scrollMargin.top, Math.min(this.scrollTop, maxHeight - this.$size.scrollerHeight + this.scrollMargin.v))); this.session.setScrollLeft(Math.max(-this.scrollMargin.left, Math.min(this.scrollLeft, longestLine + 2 * this.$padding - this.$size.scrollerWidth + this.scrollMargin.h))); var lineCount = Math.ceil(minHeight / this.lineHeight) - 1; var firstRow = Math.max(0, Math.round((this.scrollTop - offset) / this.lineHeight)); var lastRow = firstRow + lineCount; var firstRowScreen, firstRowHeight; var lineHeight = this.lineHeight; firstRow = session.screenToDocumentRow(firstRow, 0); var foldLine = session.getFoldLine(firstRow); if (foldLine) { firstRow = foldLine.start.row; } firstRowScreen = session.documentToScreenRow(firstRow, 0); firstRowHeight = session.getRowLength(firstRow) * lineHeight; lastRow = Math.min(session.screenToDocumentRow(lastRow, 0), session.getLength() - 1); minHeight = this.$size.scrollerHeight + session.getRowLength(lastRow) * lineHeight + firstRowHeight; offset = this.scrollTop - firstRowScreen * lineHeight; var changes = 0; if (hScrollChanged || vScrollChanged) { changes = this.$updateCachedSize(true, this.gutterWidth, this.$size.width, this.$size.height); this._signal("scrollbarVisibilityChanged"); if (vScrollChanged) longestLine = this.$getLongestLine(); } this.layerConfig = { width : longestLine, padding : this.$padding, firstRow : firstRow, firstRowScreen: firstRowScreen, lastRow : lastRow, lineHeight : lineHeight, characterWidth : this.characterWidth, minHeight : minHeight, maxHeight : maxHeight, offset : offset, height : this.$size.scrollerHeight }; this.$gutterLayer.element.style.marginTop = (-offset) + "px"; this.content.style.marginTop = (-offset) + "px"; this.content.style.width = longestLine + 2 * this.$padding + "px"; this.content.style.height = minHeight + "px"; return changes; }; this.$updateLines = function() { var firstRow = this.$changedLines.firstRow; var lastRow = this.$changedLines.lastRow; this.$changedLines = null; var layerConfig = this.layerConfig; if (firstRow > layerConfig.lastRow + 1) { return; } if (lastRow < layerConfig.firstRow) { return; } if (lastRow === Infinity) { if (this.$showGutter) this.$gutterLayer.update(layerConfig); this.$textLayer.update(layerConfig); return; } this.$textLayer.updateLines(layerConfig, firstRow, lastRow); return true; }; this.$getLongestLine = function() { var charCount = this.session.getScreenWidth(); if (this.showInvisibles && !this.session.$useWrapMode) charCount += 1; return Math.max(this.$size.scrollerWidth - 2 * this.$padding, Math.round(charCount * this.characterWidth)); }; this.updateFrontMarkers = function() { this.$markerFront.setMarkers(this.session.getMarkers(true)); this.$loop.schedule(this.CHANGE_MARKER_FRONT); }; this.updateBackMarkers = function() { this.$markerBack.setMarkers(this.session.getMarkers()); this.$loop.schedule(this.CHANGE_MARKER_BACK); }; this.addGutterDecoration = function(row, className){ this.$gutterLayer.addGutterDecoration(row, className); }; this.removeGutterDecoration = function(row, className){ this.$gutterLayer.removeGutterDecoration(row, className); }; this.updateBreakpoints = function(rows) { this.$loop.schedule(this.CHANGE_GUTTER); }; this.setAnnotations = function(annotations) { this.$gutterLayer.setAnnotations(annotations); this.$loop.schedule(this.CHANGE_GUTTER); }; this.updateCursor = function() { this.$loop.schedule(this.CHANGE_CURSOR); }; this.hideCursor = function() { this.$cursorLayer.hideCursor(); }; this.showCursor = function() { this.$cursorLayer.showCursor(); }; this.scrollSelectionIntoView = function(anchor, lead, offset) { this.scrollCursorIntoView(anchor, offset); this.scrollCursorIntoView(lead, offset); }; this.scrollCursorIntoView = function(cursor, offset) { if (this.$size.scrollerHeight === 0) return; var pos = this.$cursorLayer.getPixelPosition(cursor); var left = pos.left; var top = pos.top; var scrollTop = this.$scrollAnimation ? this.session.getScrollTop() : this.scrollTop; if (scrollTop > top) { if (offset) top -= offset * this.$size.scrollerHeight; if (top == 0) top = - this.scrollMargin.top; else if (top == 0) top = + this.scrollMargin.bottom; this.session.setScrollTop(top); } else if (scrollTop + this.$size.scrollerHeight < top + this.lineHeight) { if (offset) top += offset * this.$size.scrollerHeight; this.session.setScrollTop(top + this.lineHeight - this.$size.scrollerHeight); } var scrollLeft = this.scrollLeft; if (scrollLeft > left) { if (left < this.$padding + 2 * this.layerConfig.characterWidth) left = -this.scrollMargin.left; this.session.setScrollLeft(left); } else if (scrollLeft + this.$size.scrollerWidth < left + this.characterWidth) { this.session.setScrollLeft(Math.round(left + this.characterWidth - this.$size.scrollerWidth)); } else if (scrollLeft <= this.$padding && left - scrollLeft < this.characterWidth) { this.session.setScrollLeft(0); } }; this.getScrollTop = function() { return this.session.getScrollTop(); }; this.getScrollLeft = function() { return this.session.getScrollLeft(); }; this.getScrollTopRow = function() { return this.scrollTop / this.lineHeight; }; this.getScrollBottomRow = function() { return Math.max(0, Math.floor((this.scrollTop + this.$size.scrollerHeight) / this.lineHeight) - 1); }; this.scrollToRow = function(row) { this.session.setScrollTop(row * this.lineHeight); }; this.alignCursor = function(cursor, alignment) { if (typeof cursor == "number") cursor = {row: cursor, column: 0}; var pos = this.$cursorLayer.getPixelPosition(cursor); var h = this.$size.scrollerHeight - this.lineHeight; var offset = pos.top - h * (alignment || 0); this.session.setScrollTop(offset); return offset; }; this.STEPS = 8; this.$calcSteps = function(fromValue, toValue){ var i = 0; var l = this.STEPS; var steps = []; var func = function(t, x_min, dx) { return dx * (Math.pow(t - 1, 3) + 1) + x_min; }; for (i = 0; i < l; ++i) steps.push(func(i / this.STEPS, fromValue, toValue - fromValue)); return steps; }; this.scrollToLine = function(line, center, animate, callback) { var pos = this.$cursorLayer.getPixelPosition({row: line, column: 0}); var offset = pos.top; if (center) offset -= this.$size.scrollerHeight / 2; var initialScroll = this.scrollTop; this.session.setScrollTop(offset); if (animate !== false) this.animateScrolling(initialScroll, callback); }; this.animateScrolling = function(fromValue, callback) { var toValue = this.scrollTop; if (!this.$animatedScroll) return; var _self = this; if (fromValue == toValue) return; if (this.$scrollAnimation) { var oldSteps = this.$scrollAnimation.steps; if (oldSteps.length) { fromValue = oldSteps[0]; if (fromValue == toValue) return; } } var steps = _self.$calcSteps(fromValue, toValue); this.$scrollAnimation = {from: fromValue, to: toValue, steps: steps}; clearInterval(this.$timer); _self.session.setScrollTop(steps.shift()); this.$timer = setInterval(function() { if (steps.length) { _self.session.setScrollTop(steps.shift()); _self.session.$scrollTop = toValue; } else if (toValue != null) { _self.session.$scrollTop = -1; _self.session.setScrollTop(toValue); toValue = null; } else { _self.$timer = clearInterval(_self.$timer); _self.$scrollAnimation = null; callback && callback(); } }, 10); }; this.scrollToY = function(scrollTop) { if (this.scrollTop !== scrollTop) { this.$loop.schedule(this.CHANGE_SCROLL); this.scrollTop = scrollTop; } }; this.scrollToX = function(scrollLeft) { if (this.scrollLeft !== scrollLeft) this.scrollLeft = scrollLeft; this.$loop.schedule(this.CHANGE_H_SCROLL); }; this.scrollTo = function(x, y) { this.session.setScrollTop(y); this.session.setScrollLeft(y); }; this.scrollBy = function(deltaX, deltaY) { deltaY && this.session.setScrollTop(this.session.getScrollTop() + deltaY); deltaX && this.session.setScrollLeft(this.session.getScrollLeft() + deltaX); }; this.isScrollableBy = function(deltaX, deltaY) { if (deltaY < 0 && this.session.getScrollTop() >= 1 - this.scrollMargin.top) return true; if (deltaY > 0 && this.session.getScrollTop() + this.$size.scrollerHeight - this.layerConfig.maxHeight - (this.$size.scrollerHeight - this.lineHeight) * this.$scrollPastEnd < -1 + this.scrollMargin.bottom) return true; if (deltaX < 0 && this.session.getScrollLeft() >= 1 - this.scrollMargin.left) return true; if (deltaX > 0 && this.session.getScrollLeft() + this.$size.scrollerWidth - this.layerConfig.width < -1 + this.scrollMargin.right) return true; }; this.pixelToScreenCoordinates = function(x, y) { var canvasPos = this.scroller.getBoundingClientRect(); var offset = (x + this.scrollLeft - canvasPos.left - this.$padding) / this.characterWidth; var row = Math.floor((y + this.scrollTop - canvasPos.top) / this.lineHeight); var col = Math.round(offset); return {row: row, column: col, side: offset - col > 0 ? 1 : -1}; }; this.screenToTextCoordinates = function(x, y) { var canvasPos = this.scroller.getBoundingClientRect(); var col = Math.round( (x + this.scrollLeft - canvasPos.left - this.$padding) / this.characterWidth ); var row = Math.floor( (y + this.scrollTop - canvasPos.top) / this.lineHeight ); return this.session.screenToDocumentPosition(row, Math.max(col, 0)); }; this.textToScreenCoordinates = function(row, column) { var canvasPos = this.scroller.getBoundingClientRect(); var pos = this.session.documentToScreenPosition(row, column); var x = this.$padding + Math.round(pos.column * this.characterWidth); var y = pos.row * this.lineHeight; return { pageX: canvasPos.left + x - this.scrollLeft, pageY: canvasPos.top + y - this.scrollTop }; }; this.visualizeFocus = function() { dom.addCssClass(this.container, "ace_focus"); }; this.visualizeBlur = function() { dom.removeCssClass(this.container, "ace_focus"); }; this.showComposition = function(position) { if (!this.$composition) this.$composition = { keepTextAreaAtCursor: this.$keepTextAreaAtCursor, cssText: this.textarea.style.cssText }; this.$keepTextAreaAtCursor = true; dom.addCssClass(this.textarea, "ace_composition"); this.textarea.style.cssText = ""; this.$moveTextAreaToCursor(); }; this.setCompositionText = function(text) { this.$moveTextAreaToCursor(); }; this.hideComposition = function() { if (!this.$composition) return; dom.removeCssClass(this.textarea, "ace_composition"); this.$keepTextAreaAtCursor = this.$composition.keepTextAreaAtCursor; this.textarea.style.cssText = this.$composition.cssText; this.$composition = null; }; this.setTheme = function(theme, cb) { var _self = this; this.$themeValue = theme; _self._dispatchEvent('themeChange',{theme:theme}); if (!theme || typeof theme == "string") { var moduleName = theme || "ace/theme/textmate"; config.loadModule(["theme", moduleName], afterLoad); } else { afterLoad(theme); } function afterLoad(module) { if (_self.$themeValue != theme) return cb && cb(); if (!module.cssClass) return; dom.importCssString( module.cssText, module.cssClass, _self.container.ownerDocument ); if (_self.theme) dom.removeCssClass(_self.container, _self.theme.cssClass); _self.$theme = module.cssClass; _self.theme = module; dom.addCssClass(_self.container, module.cssClass); dom.setCssClass(_self.container, "ace_dark", module.isDark); var padding = "padding" in module ? module.padding : 4; if (_self.$padding && padding != _self.$padding) _self.setPadding(padding); if (_self.$size) { _self.$size.width = 0; _self.onResize(); } _self._dispatchEvent('themeLoaded', {theme:module}); cb && cb(); } }; this.getTheme = function() { return this.$themeValue; }; this.setStyle = function(style, include) { dom.setCssClass(this.container, style, include != false); }; this.unsetStyle = function(style) { dom.removeCssClass(this.container, style); }; this.setMouseCursor = function(cursorStyle) { this.content.style.cursor = cursorStyle; }; this.destroy = function() { this.$textLayer.destroy(); this.$cursorLayer.destroy(); }; }).call(VirtualRenderer.prototype); config.defineOptions(VirtualRenderer.prototype, "renderer", { animatedScroll: {initialValue: false}, showInvisibles: { set: function(value) { if (this.$textLayer.setShowInvisibles(value)) this.$loop.schedule(this.CHANGE_TEXT); }, initialValue: false }, showPrintMargin: { set: function() { this.$updatePrintMargin(); }, initialValue: true }, printMarginColumn: { set: function() { this.$updatePrintMargin(); }, initialValue: 80 }, printMargin: { set: function(val) { if (typeof val == "number") this.$printMarginColumn = val; this.$showPrintMargin = !!val; this.$updatePrintMargin(); }, get: function() { return this.$showPrintMargin && this.$printMarginColumn; } }, showGutter: { set: function(show){ this.$gutter.style.display = show ? "block" : "none"; this.onGutterResize(); }, initialValue: true }, fadeFoldWidgets: { set: function(show) { dom.setCssClass(this.$gutter, "ace_fade-fold-widgets", show); }, initialValue: false }, showFoldWidgets: { set: function(show) {this.$gutterLayer.setShowFoldWidgets(show)}, initialValue: true }, displayIndentGuides: { set: function(show) { if (this.$textLayer.setDisplayIndentGuides(show)) this.$loop.schedule(this.CHANGE_TEXT); }, initialValue: true }, highlightGutterLine: { set: function(shouldHighlight) { if (!this.$gutterLineHighlight) { this.$gutterLineHighlight = dom.createElement("div"); this.$gutterLineHighlight.className = "ace_gutter-active-line"; this.$gutter.appendChild(this.$gutterLineHighlight); return; } this.$gutterLineHighlight.style.display = shouldHighlight ? "" : "none"; if (this.$cursorLayer.$pixelPos) this.$updateGutterLineHighlight(); }, initialValue: false, value: true }, hScrollBarAlwaysVisible: { set: function(val) { if (!this.$hScrollBarAlwaysVisible || !this.$horizScroll) this.$loop.schedule(this.CHANGE_SCROLL); }, initialValue: false }, vScrollBarAlwaysVisible: { set: function(val) { if (!this.$vScrollBarAlwaysVisible || !this.$vScroll) this.$loop.schedule(this.CHANGE_SCROLL); }, initialValue: false }, fontSize: { set: function(size) { if (typeof size == "number") size = size + "px"; this.container.style.fontSize = size; this.updateFontSize(); }, initialValue: 12 }, fontFamily: { set: function(name) { this.container.style.fontFamily = name; this.updateFontSize(); } }, maxLines: { set: function(val) { this.updateFull(); } }, minLines: { set: function(val) { this.updateFull(); } }, scrollPastEnd: { set: function(val) { val = +val || 0; if (this.$scrollPastEnd == val) return; this.$scrollPastEnd = val; this.$loop.schedule(this.CHANGE_SCROLL); }, initialValue: 0, handlesSet: true }, fixedWidthGutter: { set: function(val) { this.$gutterLayer.$fixedWidth = !!val; this.$loop.schedule(this.CHANGE_GUTTER); } } }); exports.VirtualRenderer = VirtualRenderer; }); define('ace/layer/gutter', ['require', 'exports', 'module' , 'ace/lib/dom', 'ace/lib/oop', 'ace/lib/lang', 'ace/lib/event_emitter'], function(require, exports, module) { var dom = require("../lib/dom"); var oop = require("../lib/oop"); var lang = require("../lib/lang"); var EventEmitter = require("../lib/event_emitter").EventEmitter; var Gutter = function(parentEl) { this.element = dom.createElement("div"); this.element.className = "ace_layer ace_gutter-layer"; parentEl.appendChild(this.element); this.setShowFoldWidgets(this.$showFoldWidgets); this.gutterWidth = 0; this.$annotations = []; this.$updateAnnotations = this.$updateAnnotations.bind(this); this.$cells = []; }; (function() { oop.implement(this, EventEmitter); this.setSession = function(session) { if (this.session) this.session.removeEventListener("change", this.$updateAnnotations); this.session = session; session.on("change", this.$updateAnnotations); }; this.addGutterDecoration = function(row, className){ if (window.console) console.warn && console.warn("deprecated use session.addGutterDecoration"); this.session.addGutterDecoration(row, className); }; this.removeGutterDecoration = function(row, className){ if (window.console) console.warn && console.warn("deprecated use session.removeGutterDecoration"); this.session.removeGutterDecoration(row, className); }; this.setAnnotations = function(annotations) { this.$annotations = [] var rowInfo, row; for (var i = 0; i < annotations.length; i++) { var annotation = annotations[i]; var row = annotation.row; var rowInfo = this.$annotations[row]; if (!rowInfo) rowInfo = this.$annotations[row] = {text: []}; var annoText = annotation.text; annoText = annoText ? lang.escapeHTML(annoText) : annotation.html || ""; if (rowInfo.text.indexOf(annoText) === -1) rowInfo.text.push(annoText); var type = annotation.type; if (type == "error") rowInfo.className = " ace_error"; else if (type == "warning" && rowInfo.className != " ace_error") rowInfo.className = " ace_warning"; else if (type == "info" && (!rowInfo.className)) rowInfo.className = " ace_info"; } }; this.$updateAnnotations = function (e) { if (!this.$annotations.length) return; var delta = e.data; var range = delta.range; var firstRow = range.start.row; var len = range.end.row - firstRow; if (len === 0) { } else if (delta.action == "removeText" || delta.action == "removeLines") { this.$annotations.splice(firstRow, len + 1, null); } else { var args = Array(len + 1); args.unshift(firstRow, 1); this.$annotations.splice.apply(this.$annotations, args); } }; this.update = function(config) { var firstRow = config.firstRow; var lastRow = config.lastRow; var fold = this.session.getNextFoldLine(firstRow); var foldStart = fold ? fold.start.row : Infinity; var foldWidgets = this.$showFoldWidgets && this.session.foldWidgets; var breakpoints = this.session.$breakpoints; var decorations = this.session.$decorations; var firstLineNumber = this.session.$firstLineNumber; var lastLineNumber = 0; var cell = null; var index = -1; var row = firstRow; while (true) { if (row > foldStart) { row = fold.end.row + 1; fold = this.session.getNextFoldLine(row, fold); foldStart = fold ? fold.start.row : Infinity; } if (row > lastRow) { while (this.$cells.length > index + 1) { cell = this.$cells.pop(); this.element.removeChild(cell.element); } break; } cell = this.$cells[++index]; if (!cell) { cell = {element: null, textNode: null, foldWidget: null}; cell.element = dom.createElement("div"); cell.textNode = document.createTextNode(''); cell.element.appendChild(cell.textNode); this.element.appendChild(cell.element); this.$cells[index] = cell; } var className = "ace_gutter-cell "; if (breakpoints[row]) className += breakpoints[row]; if (decorations[row]) className += decorations[row]; if (this.$annotations[row]) className += this.$annotations[row].className; if (cell.element.className != className) cell.element.className = className; var height = this.session.getRowLength(row) * config.lineHeight + "px"; if (height != cell.element.style.height) cell.element.style.height = height; var text = lastLineNumber = row + firstLineNumber; if (text != cell.textNode.data) cell.textNode.data = text; if (foldWidgets) { var c = foldWidgets[row]; if (c == null) c = foldWidgets[row] = this.session.getFoldWidget(row); } if (c) { if (!cell.foldWidget) { cell.foldWidget = dom.createElement("span"); cell.element.appendChild(cell.foldWidget); } var className = "ace_fold-widget ace_" + c; if (c == "start" && row == foldStart && row < fold.end.row) className += " ace_closed"; else className += " ace_open"; if (cell.foldWidget.className != className) cell.foldWidget.className = className; var height = config.lineHeight + "px"; if (cell.foldWidget.style.height != height) cell.foldWidget.style.height = height; } else { if (cell.foldWidget != null) { cell.element.removeChild(cell.foldWidget); cell.foldWidget = null; } } row++; } this.element.style.height = config.minHeight + "px"; if (this.$fixedWidth || this.session.$useWrapMode) lastLineNumber = this.session.getLength(); var gutterWidth = lastLineNumber.toString().length * config.characterWidth; var padding = this.$padding || this.$computePadding(); gutterWidth += padding.left + padding.right; if (gutterWidth !== this.gutterWidth && !isNaN(gutterWidth)) { this.gutterWidth = gutterWidth; this.element.style.width = Math.ceil(this.gutterWidth) + "px"; this._emit("changeGutterWidth", gutterWidth); } }; this.$fixedWidth = false; this.$showFoldWidgets = true; this.setShowFoldWidgets = function(show) { if (show) dom.addCssClass(this.element, "ace_folding-enabled"); else dom.removeCssClass(this.element, "ace_folding-enabled"); this.$showFoldWidgets = show; this.$padding = null; }; this.getShowFoldWidgets = function() { return this.$showFoldWidgets; }; this.$computePadding = function() { if (!this.element.firstChild) return {left: 0, right: 0}; var style = dom.computedStyle(this.element.firstChild); this.$padding = {}; this.$padding.left = parseInt(style.paddingLeft) + 1 || 0; this.$padding.right = parseInt(style.paddingRight) || 0; return this.$padding; }; this.getRegion = function(point) { var padding = this.$padding || this.$computePadding(); var rect = this.element.getBoundingClientRect(); if (point.x < padding.left + rect.left) return "markers"; if (this.$showFoldWidgets && point.x > rect.right - padding.right) return "foldWidgets"; }; }).call(Gutter.prototype); exports.Gutter = Gutter; }); define('ace/layer/marker', ['require', 'exports', 'module' , 'ace/range', 'ace/lib/dom'], function(require, exports, module) { var Range = require("../range").Range; var dom = require("../lib/dom"); var Marker = function(parentEl) { this.element = dom.createElement("div"); this.element.className = "ace_layer ace_marker-layer"; parentEl.appendChild(this.element); }; (function() { this.$padding = 0; this.setPadding = function(padding) { this.$padding = padding; }; this.setSession = function(session) { this.session = session; }; this.setMarkers = function(markers) { this.markers = markers; }; this.update = function(config) { var config = config || this.config; if (!config) return; this.config = config; var html = []; for (var key in this.markers) { var marker = this.markers[key]; if (!marker.range) { marker.update(html, this, this.session, config); continue; } var range = marker.range.clipRows(config.firstRow, config.lastRow); if (range.isEmpty()) continue; range = range.toScreenRange(this.session); if (marker.renderer) { var top = this.$getTop(range.start.row, config); var left = this.$padding + range.start.column * config.characterWidth; marker.renderer(html, range, left, top, config); } else if (marker.type == "fullLine") { this.drawFullLineMarker(html, range, marker.clazz, config); } else if (marker.type == "screenLine") { this.drawScreenLineMarker(html, range, marker.clazz, config); } else if (range.isMultiLine()) { if (marker.type == "text") this.drawTextMarker(html, range, marker.clazz, config); else this.drawMultiLineMarker(html, range, marker.clazz, config); } else { this.drawSingleLineMarker(html, range, marker.clazz + " ace_start", config); } } this.element = dom.setInnerHtml(this.element, html.join("")); }; this.$getTop = function(row, layerConfig) { return (row - layerConfig.firstRowScreen) * layerConfig.lineHeight; }; this.drawTextMarker = function(stringBuilder, range, clazz, layerConfig, extraStyle) { var row = range.start.row; var lineRange = new Range( row, range.start.column, row, this.session.getScreenLastRowColumn(row) ); this.drawSingleLineMarker(stringBuilder, lineRange, clazz + " ace_start", layerConfig, 1, extraStyle); row = range.end.row; lineRange = new Range(row, 0, row, range.end.column); this.drawSingleLineMarker(stringBuilder, lineRange, clazz, layerConfig, 0, extraStyle); for (row = range.start.row + 1; row < range.end.row; row++) { lineRange.start.row = row; lineRange.end.row = row; lineRange.end.column = this.session.getScreenLastRowColumn(row); this.drawSingleLineMarker(stringBuilder, lineRange, clazz, layerConfig, 1, extraStyle); } }; this.drawMultiLineMarker = function(stringBuilder, range, clazz, config, extraStyle) { var padding = this.$padding; var height = config.lineHeight; var top = this.$getTop(range.start.row, config); var left = padding + range.start.column * config.characterWidth; extraStyle = extraStyle || ""; stringBuilder.push( "
    " ); top = this.$getTop(range.end.row, config); var width = range.end.column * config.characterWidth; stringBuilder.push( "
    " ); height = (range.end.row - range.start.row - 1) * config.lineHeight; if (height < 0) return; top = this.$getTop(range.start.row + 1, config); stringBuilder.push( "
    " ); }; this.drawSingleLineMarker = function(stringBuilder, range, clazz, config, extraLength, extraStyle) { var height = config.lineHeight; var width = (range.end.column + (extraLength || 0) - range.start.column) * config.characterWidth; var top = this.$getTop(range.start.row, config); var left = this.$padding + range.start.column * config.characterWidth; stringBuilder.push( "
    " ); }; this.drawFullLineMarker = function(stringBuilder, range, clazz, config, extraStyle) { var top = this.$getTop(range.start.row, config); var height = config.lineHeight; if (range.start.row != range.end.row) height += this.$getTop(range.end.row, config) - top; stringBuilder.push( "
    " ); }; this.drawScreenLineMarker = function(stringBuilder, range, clazz, config, extraStyle) { var top = this.$getTop(range.start.row, config); var height = config.lineHeight; stringBuilder.push( "
    " ); }; }).call(Marker.prototype); exports.Marker = Marker; }); define('ace/layer/text', ['require', 'exports', 'module' , 'ace/lib/oop', 'ace/lib/dom', 'ace/lib/lang', 'ace/lib/useragent', 'ace/lib/event_emitter'], function(require, exports, module) { var oop = require("../lib/oop"); var dom = require("../lib/dom"); var lang = require("../lib/lang"); var useragent = require("../lib/useragent"); var EventEmitter = require("../lib/event_emitter").EventEmitter; var Text = function(parentEl) { this.element = dom.createElement("div"); this.element.className = "ace_layer ace_text-layer"; parentEl.appendChild(this.element); this.$characterSize = {width: 0, height: 0}; this.checkForSizeChanges(); this.$pollSizeChanges(); }; (function() { oop.implement(this, EventEmitter); this.EOF_CHAR = "\xB6"; //"¶"; this.EOL_CHAR = "\xAC"; //"¬"; this.TAB_CHAR = "\u2192"; //"→" "\u21E5"; this.SPACE_CHAR = "\xB7"; //"·"; this.$padding = 0; this.setPadding = function(padding) { this.$padding = padding; this.element.style.padding = "0 " + padding + "px"; }; this.getLineHeight = function() { return this.$characterSize.height || 0; }; this.getCharacterWidth = function() { return this.$characterSize.width || 0; }; this.checkForSizeChanges = function() { var size = this.$measureSizes(); if (size && (this.$characterSize.width !== size.width || this.$characterSize.height !== size.height)) { this.$measureNode.style.fontWeight = "bold"; var boldSize = this.$measureSizes(); this.$measureNode.style.fontWeight = ""; this.$characterSize = size; this.allowBoldFonts = boldSize && boldSize.width === size.width && boldSize.height === size.height; this._emit("changeCharacterSize", {data: size}); } }; this.$pollSizeChanges = function() { var self = this; this.$pollSizeChangesTimer = setInterval(function() { self.checkForSizeChanges(); }, 500); }; this.$fontStyles = { fontFamily : 1, fontSize : 1, fontWeight : 1, fontStyle : 1, lineHeight : 1 }; this.$measureSizes = useragent.isIE || useragent.isOldGecko ? function() { var n = 1000; if (!this.$measureNode) { var measureNode = this.$measureNode = dom.createElement("div"); var style = measureNode.style; style.width = style.height = "auto"; style.left = style.top = (-n * 40) + "px"; style.visibility = "hidden"; style.position = "fixed"; style.overflow = "visible"; style.whiteSpace = "nowrap"; measureNode.innerHTML = lang.stringRepeat("Xy", n); if (this.element.ownerDocument.body) { this.element.ownerDocument.body.appendChild(measureNode); } else { var container = this.element.parentNode; while (!dom.hasCssClass(container, "ace_editor")) container = container.parentNode; container.appendChild(measureNode); } } if (!this.element.offsetWidth) return null; var style = this.$measureNode.style; var computedStyle = dom.computedStyle(this.element); for (var prop in this.$fontStyles) style[prop] = computedStyle[prop]; var size = { height: this.$measureNode.offsetHeight, width: this.$measureNode.offsetWidth / (n * 2) }; if (size.width == 0 || size.height == 0) return null; return size; } : function() { if (!this.$measureNode) { var measureNode = this.$measureNode = dom.createElement("div"); var style = measureNode.style; style.width = style.height = "auto"; style.left = style.top = -100 + "px"; style.visibility = "hidden"; style.position = "fixed"; style.overflow = "visible"; style.whiteSpace = "nowrap"; measureNode.innerHTML = lang.stringRepeat("X", 100); var container = this.element.parentNode; while (container && !dom.hasCssClass(container, "ace_editor")) container = container.parentNode; if (!container) return this.$measureNode = null; container.appendChild(measureNode); } var rect = this.$measureNode.getBoundingClientRect(); var size = { height: rect.height, width: rect.width / 100 }; if (size.width == 0 || size.height == 0) return null; return size; }; this.setSession = function(session) { this.session = session; this.$computeTabString(); }; this.showInvisibles = false; this.setShowInvisibles = function(showInvisibles) { if (this.showInvisibles == showInvisibles) return false; this.showInvisibles = showInvisibles; this.$computeTabString(); return true; }; this.displayIndentGuides = true; this.setDisplayIndentGuides = function(display) { if (this.displayIndentGuides == display) return false; this.displayIndentGuides = display; this.$computeTabString(); return true; }; this.$tabStrings = []; this.onChangeTabSize = this.$computeTabString = function() { var tabSize = this.session.getTabSize(); this.tabSize = tabSize; var tabStr = this.$tabStrings = [0]; for (var i = 1; i < tabSize + 1; i++) { if (this.showInvisibles) { tabStr.push("" + this.TAB_CHAR + lang.stringRepeat("\xa0", i - 1) + ""); } else { tabStr.push(lang.stringRepeat("\xa0", i)); } } if (this.displayIndentGuides) { this.$indentGuideRe = /\s\S| \t|\t |\s$/; var className = "ace_indent-guide"; if (this.showInvisibles) { className += " ace_invisible"; var spaceContent = lang.stringRepeat(this.SPACE_CHAR, this.tabSize); var tabContent = this.TAB_CHAR + lang.stringRepeat("\xa0", this.tabSize - 1); } else{ var spaceContent = lang.stringRepeat("\xa0", this.tabSize); var tabContent = spaceContent; } this.$tabStrings[" "] = "" + spaceContent + ""; this.$tabStrings["\t"] = "" + tabContent + ""; } }; this.updateLines = function(config, firstRow, lastRow) { if (this.config.lastRow != config.lastRow || this.config.firstRow != config.firstRow) { this.scrollLines(config); } this.config = config; var first = Math.max(firstRow, config.firstRow); var last = Math.min(lastRow, config.lastRow); var lineElements = this.element.childNodes; var lineElementsIdx = 0; for (var row = config.firstRow; row < first; row++) { var foldLine = this.session.getFoldLine(row); if (foldLine) { if (foldLine.containsRow(first)) { first = foldLine.start.row; break; } else { row = foldLine.end.row; } } lineElementsIdx ++; } var row = first; var foldLine = this.session.getNextFoldLine(row); var foldStart = foldLine ? foldLine.start.row : Infinity; while (true) { if (row > foldStart) { row = foldLine.end.row+1; foldLine = this.session.getNextFoldLine(row, foldLine); foldStart = foldLine ? foldLine.start.row :Infinity; } if (row > last) break; var lineElement = lineElements[lineElementsIdx++]; if (lineElement) { var html = []; this.$renderLine( html, row, !this.$useLineGroups(), row == foldStart ? foldLine : false ); dom.setInnerHtml(lineElement, html.join("")); } row++; } }; this.scrollLines = function(config) { var oldConfig = this.config; this.config = config; if (!oldConfig || oldConfig.lastRow < config.firstRow) return this.update(config); if (config.lastRow < oldConfig.firstRow) return this.update(config); var el = this.element; if (oldConfig.firstRow < config.firstRow) for (var row=this.session.getFoldedRowCount(oldConfig.firstRow, config.firstRow - 1); row>0; row--) el.removeChild(el.firstChild); if (oldConfig.lastRow > config.lastRow) for (var row=this.session.getFoldedRowCount(config.lastRow + 1, oldConfig.lastRow); row>0; row--) el.removeChild(el.lastChild); if (config.firstRow < oldConfig.firstRow) { var fragment = this.$renderLinesFragment(config, config.firstRow, oldConfig.firstRow - 1); if (el.firstChild) el.insertBefore(fragment, el.firstChild); else el.appendChild(fragment); } if (config.lastRow > oldConfig.lastRow) { var fragment = this.$renderLinesFragment(config, oldConfig.lastRow + 1, config.lastRow); el.appendChild(fragment); } }; this.$renderLinesFragment = function(config, firstRow, lastRow) { var fragment = this.element.ownerDocument.createDocumentFragment(); var row = firstRow; var foldLine = this.session.getNextFoldLine(row); var foldStart = foldLine ? foldLine.start.row : Infinity; while (true) { if (row > foldStart) { row = foldLine.end.row+1; foldLine = this.session.getNextFoldLine(row, foldLine); foldStart = foldLine ? foldLine.start.row : Infinity; } if (row > lastRow) break; var container = dom.createElement("div"); var html = []; this.$renderLine(html, row, false, row == foldStart ? foldLine : false); container.innerHTML = html.join(""); if (this.$useLineGroups()) { container.className = 'ace_line_group'; fragment.appendChild(container); } else { var lines = container.childNodes while(lines.length) fragment.appendChild(lines[0]); } row++; } return fragment; }; this.update = function(config) { this.config = config; var html = []; var firstRow = config.firstRow, lastRow = config.lastRow; var row = firstRow; var foldLine = this.session.getNextFoldLine(row); var foldStart = foldLine ? foldLine.start.row : Infinity; while (true) { if (row > foldStart) { row = foldLine.end.row+1; foldLine = this.session.getNextFoldLine(row, foldLine); foldStart = foldLine ? foldLine.start.row :Infinity; } if (row > lastRow) break; if (this.$useLineGroups()) html.push("
    ") this.$renderLine(html, row, false, row == foldStart ? foldLine : false); if (this.$useLineGroups()) html.push("
    "); // end the line group row++; } this.element = dom.setInnerHtml(this.element, html.join("")); }; this.$textToken = { "text": true, "rparen": true, "lparen": true }; this.$renderToken = function(stringBuilder, screenColumn, token, value) { var self = this; var replaceReg = /\t|&|<|( +)|([\x00-\x1f\x80-\xa0\u1680\u180E\u2000-\u200f\u2028\u2029\u202F\u205F\u3000\uFEFF])|[\u1100-\u115F\u11A3-\u11A7\u11FA-\u11FF\u2329-\u232A\u2E80-\u2E99\u2E9B-\u2EF3\u2F00-\u2FD5\u2FF0-\u2FFB\u3000-\u303E\u3041-\u3096\u3099-\u30FF\u3105-\u312D\u3131-\u318E\u3190-\u31BA\u31C0-\u31E3\u31F0-\u321E\u3220-\u3247\u3250-\u32FE\u3300-\u4DBF\u4E00-\uA48C\uA490-\uA4C6\uA960-\uA97C\uAC00-\uD7A3\uD7B0-\uD7C6\uD7CB-\uD7FB\uF900-\uFAFF\uFE10-\uFE19\uFE30-\uFE52\uFE54-\uFE66\uFE68-\uFE6B\uFF01-\uFF60\uFFE0-\uFFE6]/g; var replaceFunc = function(c, a, b, tabIdx, idx4) { if (a) { return self.showInvisibles ? "" + lang.stringRepeat(self.SPACE_CHAR, c.length) + "" : lang.stringRepeat("\xa0", c.length); } else if (c == "&") { return "&"; } else if (c == "<") { return "<"; } else if (c == "\t") { var tabSize = self.session.getScreenTabSize(screenColumn + tabIdx); screenColumn += tabSize - 1; return self.$tabStrings[tabSize]; } else if (c == "\u3000") { var classToUse = self.showInvisibles ? "ace_cjk ace_invisible" : "ace_cjk"; var space = self.showInvisibles ? self.SPACE_CHAR : ""; screenColumn += 1; return "" + space + ""; } else if (b) { return "" + self.SPACE_CHAR + ""; } else { screenColumn += 1; return "" + c + ""; } }; var output = value.replace(replaceReg, replaceFunc); if (!this.$textToken[token.type]) { var classes = "ace_" + token.type.replace(/\./g, " ace_"); var style = ""; if (token.type == "fold") style = " style='width:" + (token.value.length * this.config.characterWidth) + "px;' "; stringBuilder.push("", output, ""); } else { stringBuilder.push(output); } return screenColumn + value.length; }; this.renderIndentGuide = function(stringBuilder, value, max) { var cols = value.search(this.$indentGuideRe); if (cols <= 0 || cols >= max) return value; if (value[0] == " ") { cols -= cols % this.tabSize; stringBuilder.push(lang.stringRepeat(this.$tabStrings[" "], cols/this.tabSize)); return value.substr(cols); } else if (value[0] == "\t") { stringBuilder.push(lang.stringRepeat(this.$tabStrings["\t"], cols)); return value.substr(cols); } return value; }; this.$renderWrappedLine = function(stringBuilder, tokens, splits, onlyContents) { var chars = 0; var split = 0; var splitChars = splits[0]; var screenColumn = 0; for (var i = 0; i < tokens.length; i++) { var token = tokens[i]; var value = token.value; if (i == 0 && this.displayIndentGuides) { chars = value.length; value = this.renderIndentGuide(stringBuilder, value, splitChars); if (!value) continue; chars -= value.length; } if (chars + value.length < splitChars) { screenColumn = this.$renderToken(stringBuilder, screenColumn, token, value); chars += value.length; } else { while (chars + value.length >= splitChars) { screenColumn = this.$renderToken( stringBuilder, screenColumn, token, value.substring(0, splitChars - chars) ); value = value.substring(splitChars - chars); chars = splitChars; if (!onlyContents) { stringBuilder.push("
    ", "
    " ); } split ++; screenColumn = 0; splitChars = splits[split] || Number.MAX_VALUE; } if (value.length != 0) { chars += value.length; screenColumn = this.$renderToken( stringBuilder, screenColumn, token, value ); } } } }; this.$renderSimpleLine = function(stringBuilder, tokens) { var screenColumn = 0; var token = tokens[0]; var value = token.value; if (this.displayIndentGuides) value = this.renderIndentGuide(stringBuilder, value); if (value) screenColumn = this.$renderToken(stringBuilder, screenColumn, token, value); for (var i = 1; i < tokens.length; i++) { token = tokens[i]; value = token.value; screenColumn = this.$renderToken(stringBuilder, screenColumn, token, value); } }; this.$renderLine = function(stringBuilder, row, onlyContents, foldLine) { if (!foldLine && foldLine != false) foldLine = this.session.getFoldLine(row); if (foldLine) var tokens = this.$getFoldLineTokens(row, foldLine); else var tokens = this.session.getTokens(row); if (!onlyContents) { stringBuilder.push( "
    " ); } if (tokens.length) { var splits = this.session.getRowSplitData(row); if (splits && splits.length) this.$renderWrappedLine(stringBuilder, tokens, splits, onlyContents); else this.$renderSimpleLine(stringBuilder, tokens); } if (this.showInvisibles) { if (foldLine) row = foldLine.end.row stringBuilder.push( "", row == this.session.getLength() - 1 ? this.EOF_CHAR : this.EOL_CHAR, "" ); } if (!onlyContents) stringBuilder.push("
    "); }; this.$getFoldLineTokens = function(row, foldLine) { var session = this.session; var renderTokens = []; function addTokens(tokens, from, to) { var idx = 0, col = 0; while ((col + tokens[idx].value.length) < from) { col += tokens[idx].value.length; idx++; if (idx == tokens.length) return; } if (col != from) { var value = tokens[idx].value.substring(from - col); if (value.length > (to - from)) value = value.substring(0, to - from); renderTokens.push({ type: tokens[idx].type, value: value }); col = from + value.length; idx += 1; } while (col < to && idx < tokens.length) { var value = tokens[idx].value; if (value.length + col > to) { renderTokens.push({ type: tokens[idx].type, value: value.substring(0, to - col) }); } else renderTokens.push(tokens[idx]); col += value.length; idx += 1; } } var tokens = session.getTokens(row); foldLine.walk(function(placeholder, row, column, lastColumn, isNewRow) { if (placeholder != null) { renderTokens.push({ type: "fold", value: placeholder }); } else { if (isNewRow) tokens = session.getTokens(row); if (tokens.length) addTokens(tokens, lastColumn, column); } }, foldLine.end.row, this.session.getLine(foldLine.end.row).length); return renderTokens; }; this.$useLineGroups = function() { return this.session.getUseWrapMode(); }; this.destroy = function() { clearInterval(this.$pollSizeChangesTimer); if (this.$measureNode) this.$measureNode.parentNode.removeChild(this.$measureNode); delete this.$measureNode; }; }).call(Text.prototype); exports.Text = Text; }); define('ace/layer/cursor', ['require', 'exports', 'module' , 'ace/lib/dom'], function(require, exports, module) { var dom = require("../lib/dom"); var Cursor = function(parentEl) { this.element = dom.createElement("div"); this.element.className = "ace_layer ace_cursor-layer"; parentEl.appendChild(this.element); this.isVisible = false; this.isBlinking = true; this.blinkInterval = 1000; this.smoothBlinking = false; this.cursors = []; this.cursor = this.addCursor(); dom.addCssClass(this.element, "ace_hidden-cursors"); }; (function() { this.$padding = 0; this.setPadding = function(padding) { this.$padding = padding; }; this.setSession = function(session) { this.session = session; }; this.setBlinking = function(blinking) { if (blinking != this.isBlinking){ this.isBlinking = blinking; this.restartTimer(); } }; this.setBlinkInterval = function(blinkInterval) { if (blinkInterval != this.blinkInterval){ this.blinkInterval = blinkInterval; this.restartTimer(); } }; this.setSmoothBlinking = function(smoothBlinking) { if (smoothBlinking != this.smoothBlinking) { this.smoothBlinking = smoothBlinking; if (smoothBlinking) dom.addCssClass(this.element, "ace_smooth-blinking"); else dom.removeCssClass(this.element, "ace_smooth-blinking"); this.restartTimer(); } }; this.addCursor = function() { var el = dom.createElement("div"); el.className = "ace_cursor"; this.element.appendChild(el); this.cursors.push(el); return el; }; this.removeCursor = function() { if (this.cursors.length > 1) { var el = this.cursors.pop(); el.parentNode.removeChild(el); return el; } }; this.hideCursor = function() { this.isVisible = false; dom.addCssClass(this.element, "ace_hidden-cursors"); this.restartTimer(); }; this.showCursor = function() { this.isVisible = true; dom.removeCssClass(this.element, "ace_hidden-cursors"); this.restartTimer(); }; this.restartTimer = function() { clearInterval(this.intervalId); clearTimeout(this.timeoutId); if (this.smoothBlinking) dom.removeCssClass(this.element, "ace_smooth-blinking"); for (var i = this.cursors.length; i--; ) this.cursors[i].style.opacity = ""; if (!this.isBlinking || !this.blinkInterval || !this.isVisible) return; if (this.smoothBlinking) setTimeout(function(){ dom.addCssClass(this.element, "ace_smooth-blinking"); }.bind(this)); var blink = function(){ this.timeoutId = setTimeout(function() { for (var i = this.cursors.length; i--; ) { this.cursors[i].style.opacity = 0; } }.bind(this), 0.6 * this.blinkInterval); }.bind(this); this.intervalId = setInterval(function() { for (var i = this.cursors.length; i--; ) { this.cursors[i].style.opacity = ""; } blink(); }.bind(this), this.blinkInterval); blink(); }; this.getPixelPosition = function(position, onScreen) { if (!this.config || !this.session) return {left : 0, top : 0}; if (!position) position = this.session.selection.getCursor(); var pos = this.session.documentToScreenPosition(position); var cursorLeft = this.$padding + pos.column * this.config.characterWidth; var cursorTop = (pos.row - (onScreen ? this.config.firstRowScreen : 0)) * this.config.lineHeight; return {left : cursorLeft, top : cursorTop}; }; this.update = function(config) { this.config = config; var selections = this.session.$selectionMarkers; var i = 0, cursorIndex = 0; if (selections === undefined || selections.length === 0){ selections = [{cursor: null}]; } for (var i = 0, n = selections.length; i < n; i++) { var pixelPos = this.getPixelPosition(selections[i].cursor, true); if ((pixelPos.top > config.height + config.offset || pixelPos.top < -config.offset) && i > 1) { continue; } var style = (this.cursors[cursorIndex++] || this.addCursor()).style; style.left = pixelPos.left + "px"; style.top = pixelPos.top + "px"; style.width = config.characterWidth + "px"; style.height = config.lineHeight + "px"; } while (this.cursors.length > cursorIndex) this.removeCursor(); var overwrite = this.session.getOverwrite(); this.$setOverwrite(overwrite); this.$pixelPos = pixelPos; this.restartTimer(); }; this.$setOverwrite = function(overwrite) { if (overwrite != this.overwrite) { this.overwrite = overwrite; if (overwrite) dom.addCssClass(this.element, "ace_overwrite-cursors"); else dom.removeCssClass(this.element, "ace_overwrite-cursors"); } }; this.destroy = function() { clearInterval(this.intervalId); clearTimeout(this.timeoutId); }; }).call(Cursor.prototype); exports.Cursor = Cursor; }); define('ace/scrollbar', ['require', 'exports', 'module' , 'ace/lib/oop', 'ace/lib/dom', 'ace/lib/event', 'ace/lib/event_emitter'], function(require, exports, module) { var oop = require("./lib/oop"); var dom = require("./lib/dom"); var event = require("./lib/event"); var EventEmitter = require("./lib/event_emitter").EventEmitter; var ScrollBarV = function(parent, renderer) { this.element = dom.createElement("div"); this.element.className = "ace_scrollbar"; this.inner = dom.createElement("div"); this.inner.className = "ace_scrollbar-inner"; this.element.appendChild(this.inner); parent.appendChild(this.element); renderer.$scrollbarWidth = this.width = dom.scrollbarWidth(parent.ownerDocument); renderer.$scrollbarWidth = this.width = dom.scrollbarWidth(parent.ownerDocument); this.fullWidth = this.width; this.inner.style.width = this.element.style.width = (this.width || 15) + 5 + "px"; this.setVisible(false); this.element.style.overflowY = "scroll"; event.addListener(this.element, "scroll", this.onScrollV.bind(this)); event.addListener(this.element, "mousedown", event.preventDefault); }; var ScrollBarH = function(parent, renderer) { this.element = dom.createElement("div"); this.element.className = "ace_scrollbar-h"; this.inner = dom.createElement("div"); this.inner.className = "ace_scrollbar-inner"; this.element.appendChild(this.inner); parent.appendChild(this.element); this.height = renderer.$scrollbarWidth; this.fullHeight = this.height; this.inner.style.height = this.element.style.height = (this.height || 15) + 5 + "px"; this.setVisible(false); this.element.style.overflowX = "scroll"; event.addListener(this.element, "scroll", this.onScrollH.bind(this)); event.addListener(this.element, "mousedown", event.preventDefault); }; (function() { oop.implement(this, EventEmitter); this.setVisible = function(show) { if (show) { this.element.style.display = ""; if (this.fullWidth) this.width = this.fullWidth; if (this.fullHeight) this.height = this.fullHeight; } else { this.element.style.display = "none"; this.height = this.width = 0; } }; this.onScrollV = function() { if (!this.skipEvent) { this.scrollTop = this.element.scrollTop; this._emit("scroll", {data: this.scrollTop}); } this.skipEvent = false; }; this.onScrollH = function() { if (!this.skipEvent) { this.scrollLeft = this.element.scrollLeft; this._emit("scroll", {data: this.scrollLeft}); } this.skipEvent = false; }; this.getWidth = function() { return this.width; }; this.getHeight = function() { return this.height; }; this.setHeight = function(height) { this.element.style.height = height + "px"; }; this.setWidth = function(width) { this.element.style.width = width + "px"; }; this.setInnerHeight = function(height) { this.inner.style.height = height + "px"; }; this.setInnerWidth = function(width) { this.inner.style.width = width + "px"; }; this.setScrollTop = function(scrollTop) { if (this.scrollTop != scrollTop) { this.skipEvent = true; this.scrollTop = this.element.scrollTop = scrollTop; } }; this.setScrollLeft = function(scrollLeft) { if (this.scrollLeft != scrollLeft) { this.skipEvent = true; this.scrollLeft = this.element.scrollLeft = scrollLeft; } }; }).call(ScrollBarV.prototype); ScrollBarH.prototype = ScrollBarV.prototype; exports.ScrollBar = ScrollBarV; // backward compatibility exports.ScrollBarV = ScrollBarV; exports.ScrollBarH = ScrollBarH; }); define('ace/renderloop', ['require', 'exports', 'module' , 'ace/lib/event'], function(require, exports, module) { var event = require("./lib/event"); var RenderLoop = function(onRender, win) { this.onRender = onRender; this.pending = false; this.changes = 0; this.window = win || window; }; (function() { this.schedule = function(change) { this.changes = this.changes | change; if (!this.pending) { this.pending = true; var _self = this; event.nextFrame(function() { _self.pending = false; var changes; while (changes = _self.changes) { _self.changes = 0; _self.onRender(changes); } }, this.window); } }; }).call(RenderLoop.prototype); exports.RenderLoop = RenderLoop; }); define('ace/multi_select', ['require', 'exports', 'module' , 'ace/range_list', 'ace/range', 'ace/selection', 'ace/mouse/multi_select_handler', 'ace/lib/event', 'ace/lib/lang', 'ace/commands/multi_select_commands', 'ace/search', 'ace/edit_session', 'ace/editor', 'ace/config'], function(require, exports, module) { var RangeList = require("./range_list").RangeList; var Range = require("./range").Range; var Selection = require("./selection").Selection; var onMouseDown = require("./mouse/multi_select_handler").onMouseDown; var event = require("./lib/event"); var lang = require("./lib/lang"); var commands = require("./commands/multi_select_commands"); exports.commands = commands.defaultCommands.concat(commands.multiSelectCommands); var Search = require("./search").Search; var search = new Search(); function find(session, needle, dir) { search.$options.wrap = true; search.$options.needle = needle; search.$options.backwards = dir == -1; return search.find(session); } var EditSession = require("./edit_session").EditSession; (function() { this.getSelectionMarkers = function() { return this.$selectionMarkers; }; }).call(EditSession.prototype); (function() { this.ranges = null; this.rangeList = null; this.addRange = function(range, $blockChangeEvents) { if (!range) return; if (!this.inMultiSelectMode && this.rangeCount == 0) { var oldRange = this.toOrientedRange(); this.rangeList.add(oldRange); this.rangeList.add(range); if (this.rangeList.ranges.length != 2) { this.rangeList.removeAll(); return $blockChangeEvents || this.fromOrientedRange(range); } this.rangeList.removeAll(); this.rangeList.add(oldRange); this.$onAddRange(oldRange); } if (!range.cursor) range.cursor = range.end; var removed = this.rangeList.add(range); this.$onAddRange(range); if (removed.length) this.$onRemoveRange(removed); if (this.rangeCount > 1 && !this.inMultiSelectMode) { this._emit("multiSelect"); this.inMultiSelectMode = true; this.session.$undoSelect = false; this.rangeList.attach(this.session); } return $blockChangeEvents || this.fromOrientedRange(range); }; this.toSingleRange = function(range) { range = range || this.ranges[0]; var removed = this.rangeList.removeAll(); if (removed.length) this.$onRemoveRange(removed); range && this.fromOrientedRange(range); }; this.substractPoint = function(pos) { var removed = this.rangeList.substractPoint(pos); if (removed) { this.$onRemoveRange(removed); return removed[0]; } }; this.mergeOverlappingRanges = function() { var removed = this.rangeList.merge(); if (removed.length) this.$onRemoveRange(removed); else if(this.ranges[0]) this.fromOrientedRange(this.ranges[0]); }; this.$onAddRange = function(range) { this.rangeCount = this.rangeList.ranges.length; this.ranges.unshift(range); this._emit("addRange", {range: range}); }; this.$onRemoveRange = function(removed) { this.rangeCount = this.rangeList.ranges.length; if (this.rangeCount == 1 && this.inMultiSelectMode) { var lastRange = this.rangeList.ranges.pop(); removed.push(lastRange); this.rangeCount = 0; } for (var i = removed.length; i--; ) { var index = this.ranges.indexOf(removed[i]); this.ranges.splice(index, 1); } this._emit("removeRange", {ranges: removed}); if (this.rangeCount == 0 && this.inMultiSelectMode) { this.inMultiSelectMode = false; this._emit("singleSelect"); this.session.$undoSelect = true; this.rangeList.detach(this.session); } lastRange = lastRange || this.ranges[0]; if (lastRange && !lastRange.isEqual(this.getRange())) this.fromOrientedRange(lastRange); }; this.$initRangeList = function() { if (this.rangeList) return; this.rangeList = new RangeList(); this.ranges = []; this.rangeCount = 0; }; this.getAllRanges = function() { return this.rangeCount ? this.rangeList.ranges.concat() : [this.getRange()]; }; this.splitIntoLines = function () { if (this.rangeCount > 1) { var ranges = this.rangeList.ranges; var lastRange = ranges[ranges.length - 1]; var range = Range.fromPoints(ranges[0].start, lastRange.end); this.toSingleRange(); this.setSelectionRange(range, lastRange.cursor == lastRange.start); } else { var range = this.getRange(); var isBackwards = this.isBackwards(); var startRow = range.start.row; var endRow = range.end.row; if (startRow == endRow) { if (isBackwards) var start = range.end, end = range.start; else var start = range.start, end = range.end; this.addRange(Range.fromPoints(end, end)); this.addRange(Range.fromPoints(start, start)); return; } var rectSel = []; var r = this.getLineRange(startRow, true); r.start.column = range.start.column; rectSel.push(r); for (var i = startRow + 1; i < endRow; i++) rectSel.push(this.getLineRange(i, true)); r = this.getLineRange(endRow, true); r.end.column = range.end.column; rectSel.push(r); rectSel.forEach(this.addRange, this); } }; this.toggleBlockSelection = function () { if (this.rangeCount > 1) { var ranges = this.rangeList.ranges; var lastRange = ranges[ranges.length - 1]; var range = Range.fromPoints(ranges[0].start, lastRange.end); this.toSingleRange(); this.setSelectionRange(range, lastRange.cursor == lastRange.start); } else { var cursor = this.session.documentToScreenPosition(this.selectionLead); var anchor = this.session.documentToScreenPosition(this.selectionAnchor); var rectSel = this.rectangularRangeBlock(cursor, anchor); rectSel.forEach(this.addRange, this); } }; this.rectangularRangeBlock = function(screenCursor, screenAnchor, includeEmptyLines) { var rectSel = []; var xBackwards = screenCursor.column < screenAnchor.column; if (xBackwards) { var startColumn = screenCursor.column; var endColumn = screenAnchor.column; } else { var startColumn = screenAnchor.column; var endColumn = screenCursor.column; } var yBackwards = screenCursor.row < screenAnchor.row; if (yBackwards) { var startRow = screenCursor.row; var endRow = screenAnchor.row; } else { var startRow = screenAnchor.row; var endRow = screenCursor.row; } if (startColumn < 0) startColumn = 0; if (startRow < 0) startRow = 0; if (startRow == endRow) includeEmptyLines = true; for (var row = startRow; row <= endRow; row++) { var range = Range.fromPoints( this.session.screenToDocumentPosition(row, startColumn), this.session.screenToDocumentPosition(row, endColumn) ); if (range.isEmpty()) { if (docEnd && isSamePoint(range.end, docEnd)) break; var docEnd = range.end; } range.cursor = xBackwards ? range.start : range.end; rectSel.push(range); } if (yBackwards) rectSel.reverse(); if (!includeEmptyLines) { var end = rectSel.length - 1; while (rectSel[end].isEmpty() && end > 0) end--; if (end > 0) { var start = 0; while (rectSel[start].isEmpty()) start++; } for (var i = end; i >= start; i--) { if (rectSel[i].isEmpty()) rectSel.splice(i, 1); } } return rectSel; }; }).call(Selection.prototype); var Editor = require("./editor").Editor; (function() { this.updateSelectionMarkers = function() { this.renderer.updateCursor(); this.renderer.updateBackMarkers(); }; this.addSelectionMarker = function(orientedRange) { if (!orientedRange.cursor) orientedRange.cursor = orientedRange.end; var style = this.getSelectionStyle(); orientedRange.marker = this.session.addMarker(orientedRange, "ace_selection", style); this.session.$selectionMarkers.push(orientedRange); this.session.selectionMarkerCount = this.session.$selectionMarkers.length; return orientedRange; }; this.removeSelectionMarker = function(range) { if (!range.marker) return; this.session.removeMarker(range.marker); var index = this.session.$selectionMarkers.indexOf(range); if (index != -1) this.session.$selectionMarkers.splice(index, 1); this.session.selectionMarkerCount = this.session.$selectionMarkers.length; }; this.removeSelectionMarkers = function(ranges) { var markerList = this.session.$selectionMarkers; for (var i = ranges.length; i--; ) { var range = ranges[i]; if (!range.marker) continue; this.session.removeMarker(range.marker); var index = markerList.indexOf(range); if (index != -1) markerList.splice(index, 1); } this.session.selectionMarkerCount = markerList.length; }; this.$onAddRange = function(e) { this.addSelectionMarker(e.range); this.renderer.updateCursor(); this.renderer.updateBackMarkers(); }; this.$onRemoveRange = function(e) { this.removeSelectionMarkers(e.ranges); this.renderer.updateCursor(); this.renderer.updateBackMarkers(); }; this.$onMultiSelect = function(e) { if (this.inMultiSelectMode) return; this.inMultiSelectMode = true; this.setStyle("ace_multiselect"); this.keyBinding.addKeyboardHandler(commands.keyboardHandler); this.commands.setDefaultHandler("exec", this.$onMultiSelectExec); this.renderer.updateCursor(); this.renderer.updateBackMarkers(); }; this.$onSingleSelect = function(e) { if (this.session.multiSelect.inVirtualMode) return; this.inMultiSelectMode = false; this.unsetStyle("ace_multiselect"); this.keyBinding.removeKeyboardHandler(commands.keyboardHandler); this.commands.removeDefaultHandler("exec", this.$onMultiSelectExec); this.renderer.updateCursor(); this.renderer.updateBackMarkers(); }; this.$onMultiSelectExec = function(e) { var command = e.command; var editor = e.editor; if (!editor.multiSelect) return; if (!command.multiSelectAction) { var result = command.exec(editor, e.args || {}); editor.multiSelect.addRange(editor.multiSelect.toOrientedRange()); editor.multiSelect.mergeOverlappingRanges(); } else if (command.multiSelectAction == "forEach") { result = editor.forEachSelection(command, e.args); } else if (command.multiSelectAction == "forEachLine") { result = editor.forEachSelection(command, e.args, true); } else if (command.multiSelectAction == "single") { editor.exitMultiSelectMode(); result = command.exec(editor, e.args || {}); } else { result = command.multiSelectAction(editor, e.args || {}); } return result; }; this.forEachSelection = function(cmd, args, $byLines) { if (this.inVirtualSelectionMode) return; var session = this.session; var selection = this.selection; var rangeList = selection.rangeList; var result; var reg = selection._eventRegistry; selection._eventRegistry = {}; var tmpSel = new Selection(session); this.inVirtualSelectionMode = true; for (var i = rangeList.ranges.length; i--;) { if ($byLines) { while (i > 0 && rangeList.ranges[i].start.row == rangeList.ranges[i - 1].end.row) i--; } tmpSel.fromOrientedRange(rangeList.ranges[i]); this.selection = session.selection = tmpSel; var cmdResult = cmd.exec(this, args || {}); if (!result == undefined) result = cmdResult; tmpSel.toOrientedRange(rangeList.ranges[i]); } tmpSel.detach(); this.selection = session.selection = selection; this.inVirtualSelectionMode = false; selection._eventRegistry = reg; selection.mergeOverlappingRanges(); var anim = this.renderer.$scrollAnimation; this.onCursorChange(); this.onSelectionChange(); if (anim && anim.from == anim.to) this.renderer.animateScrolling(anim.from); return result; }; this.exitMultiSelectMode = function() { if (!this.inMultiSelectMode || this.inVirtualSelectionMode) return; this.multiSelect.toSingleRange(); }; this.getSelectedText = function() { var text = ""; if (this.inMultiSelectMode && !this.inVirtualSelectionMode) { var ranges = this.multiSelect.rangeList.ranges; var buf = []; for (var i = 0; i < ranges.length; i++) { buf.push(this.session.getTextRange(ranges[i])); } var nl = this.session.getDocument().getNewLineCharacter(); text = buf.join(nl); if (text.length == (buf.length - 1) * nl.length) text = ""; } else if (!this.selection.isEmpty()) { text = this.session.getTextRange(this.getSelectionRange()); } return text; }; this.onPaste = function(text) { if (this.$readOnly) return; this._signal("paste", text); if (!this.inMultiSelectMode || this.inVirtualSelectionMode) return this.insert(text); var lines = text.split(/\r\n|\r|\n/); var ranges = this.selection.rangeList.ranges; if (lines.length > ranges.length || lines.length < 2 || !lines[1]) return this.commands.exec("insertstring", this, text); for (var i = ranges.length; i--;) { var range = ranges[i]; if (!range.isEmpty()) this.session.remove(range); this.session.insert(range.start, lines[i]); } }; this.findAll = function(needle, options, additive) { options = options || {}; options.needle = needle || options.needle; this.$search.set(options); var ranges = this.$search.findAll(this.session); if (!ranges.length) return 0; this.$blockScrolling += 1; var selection = this.multiSelect; if (!additive) selection.toSingleRange(ranges[0]); for (var i = ranges.length; i--; ) selection.addRange(ranges[i], true); this.$blockScrolling -= 1; return ranges.length; }; this.selectMoreLines = function(dir, skip) { var range = this.selection.toOrientedRange(); var isBackwards = range.cursor == range.end; var screenLead = this.session.documentToScreenPosition(range.cursor); if (this.selection.$desiredColumn) screenLead.column = this.selection.$desiredColumn; var lead = this.session.screenToDocumentPosition(screenLead.row + dir, screenLead.column); if (!range.isEmpty()) { var screenAnchor = this.session.documentToScreenPosition(isBackwards ? range.end : range.start); var anchor = this.session.screenToDocumentPosition(screenAnchor.row + dir, screenAnchor.column); } else { var anchor = lead; } if (isBackwards) { var newRange = Range.fromPoints(lead, anchor); newRange.cursor = newRange.start; } else { var newRange = Range.fromPoints(anchor, lead); newRange.cursor = newRange.end; } newRange.desiredColumn = screenLead.column; if (!this.selection.inMultiSelectMode) { this.selection.addRange(range); } else { if (skip) var toRemove = range.cursor; } this.selection.addRange(newRange); if (toRemove) this.selection.substractPoint(toRemove); }; this.transposeSelections = function(dir) { var session = this.session; var sel = session.multiSelect; var all = sel.ranges; for (var i = all.length; i--; ) { var range = all[i]; if (range.isEmpty()) { var tmp = session.getWordRange(range.start.row, range.start.column); range.start.row = tmp.start.row; range.start.column = tmp.start.column; range.end.row = tmp.end.row; range.end.column = tmp.end.column; } } sel.mergeOverlappingRanges(); var words = []; for (var i = all.length; i--; ) { var range = all[i]; words.unshift(session.getTextRange(range)); } if (dir < 0) words.unshift(words.pop()); else words.push(words.shift()); for (var i = all.length; i--; ) { var range = all[i]; var tmp = range.clone(); session.replace(range, words[i]); range.start.row = tmp.start.row; range.start.column = tmp.start.column; } }; this.selectMore = function(dir, skip) { var session = this.session; var sel = session.multiSelect; var range = sel.toOrientedRange(); if (range.isEmpty()) { var range = session.getWordRange(range.start.row, range.start.column); range.cursor = dir == -1 ? range.start : range.end; this.multiSelect.addRange(range); return; } var needle = session.getTextRange(range); var newRange = find(session, needle, dir); if (newRange) { newRange.cursor = dir == -1 ? newRange.start : newRange.end; this.multiSelect.addRange(newRange); } if (skip) this.multiSelect.substractPoint(range.cursor); }; this.alignCursors = function() { var session = this.session; var sel = session.multiSelect; var ranges = sel.ranges; if (!ranges.length) { var range = this.selection.getRange(); var fr = range.start.row, lr = range.end.row; var lines = this.session.doc.removeLines(fr, lr); lines = this.$reAlignText(lines); this.session.doc.insertLines(fr, lines); range.start.column = 0; range.end.column = lines[lines.length - 1].length; this.selection.setRange(range); } else { var row = -1; var sameRowRanges = ranges.filter(function(r) { if (r.cursor.row == row) return true; row = r.cursor.row; }); sel.$onRemoveRange(sameRowRanges); var maxCol = 0; var minSpace = Infinity; var spaceOffsets = ranges.map(function(r) { var p = r.cursor; var line = session.getLine(p.row); var spaceOffset = line.substr(p.column).search(/\S/g); if (spaceOffset == -1) spaceOffset = 0; if (p.column > maxCol) maxCol = p.column; if (spaceOffset < minSpace) minSpace = spaceOffset; return spaceOffset; }); ranges.forEach(function(r, i) { var p = r.cursor; var l = maxCol - p.column; var d = spaceOffsets[i] - minSpace; if (l > d) session.insert(p, lang.stringRepeat(" ", l - d)); else session.remove(new Range(p.row, p.column, p.row, p.column - l + d)); r.start.column = r.end.column = maxCol; r.start.row = r.end.row = p.row; r.cursor = r.end; }); sel.fromOrientedRange(ranges[0]); this.renderer.updateCursor(); this.renderer.updateBackMarkers(); } }; this.$reAlignText = function(lines) { var isLeftAligned = true, isRightAligned = true; var startW, textW, endW; return lines.map(function(line) { var m = line.match(/(\s*)(.*?)(\s*)([=:].*)/); if (!m) return [line]; if (startW == null) { startW = m[1].length; textW = m[2].length; endW = m[3].length; return m; } if (startW + textW + endW != m[1].length + m[2].length + m[3].length) isRightAligned = false; if (startW != m[1].length) isLeftAligned = false; if (startW > m[1].length) startW = m[1].length; if (textW < m[2].length) textW = m[2].length; if (endW > m[3].length) endW = m[3].length; return m; }).map(isLeftAligned ? isRightAligned ? alignRight : alignLeft : unAlign); function spaces(n) { return lang.stringRepeat(" ", n); } function alignLeft(m) { return !m[2] ? m[0] : spaces(startW) + m[2] + spaces(textW - m[2].length + endW) + m[4].replace(/^([=:])\s+/, "$1 ") } function alignRight(m) { return !m[2] ? m[0] : spaces(startW + textW - m[2].length) + m[2] + spaces(endW, " ") + m[4].replace(/^([=:])\s+/, "$1 ") } function unAlign(m) { return !m[2] ? m[0] : spaces(startW) + m[2] + spaces(endW) + m[4].replace(/^([=:])\s+/, "$1 ") } } }).call(Editor.prototype); function isSamePoint(p1, p2) { return p1.row == p2.row && p1.column == p2.column; } exports.onSessionChange = function(e) { var session = e.session; if (!session.multiSelect) { session.$selectionMarkers = []; session.selection.$initRangeList(); session.multiSelect = session.selection; } this.multiSelect = session.multiSelect; var oldSession = e.oldSession; if (oldSession) { oldSession.multiSelect.removeEventListener("addRange", this.$onAddRange); oldSession.multiSelect.removeEventListener("removeRange", this.$onRemoveRange); oldSession.multiSelect.removeEventListener("multiSelect", this.$onMultiSelect); oldSession.multiSelect.removeEventListener("singleSelect", this.$onSingleSelect); } session.multiSelect.on("addRange", this.$onAddRange); session.multiSelect.on("removeRange", this.$onRemoveRange); session.multiSelect.on("multiSelect", this.$onMultiSelect); session.multiSelect.on("singleSelect", this.$onSingleSelect); if (this.inMultiSelectMode != session.selection.inMultiSelectMode) { if (session.selection.inMultiSelectMode) this.$onMultiSelect(); else this.$onSingleSelect(); } }; function MultiSelect(editor) { if (editor.$multiselectOnSessionChange) return; editor.$onAddRange = editor.$onAddRange.bind(editor); editor.$onRemoveRange = editor.$onRemoveRange.bind(editor); editor.$onMultiSelect = editor.$onMultiSelect.bind(editor); editor.$onSingleSelect = editor.$onSingleSelect.bind(editor); editor.$multiselectOnSessionChange = exports.onSessionChange.bind(editor); editor.$multiselectOnSessionChange(editor); editor.on("changeSession", editor.$multiselectOnSessionChange); editor.on("mousedown", onMouseDown); editor.commands.addCommands(commands.defaultCommands); addAltCursorListeners(editor); } function addAltCursorListeners(editor){ var el = editor.textInput.getElement(); var altCursor = false; event.addListener(el, "keydown", function(e) { if (e.keyCode == 18 && !(e.ctrlKey || e.shiftKey || e.metaKey)) { if (!altCursor) { editor.renderer.setMouseCursor("crosshair"); altCursor = true; } } else if (altCursor) { reset(); } }); event.addListener(el, "keyup", reset); event.addListener(el, "blur", reset); function reset(e) { if (altCursor) { editor.renderer.setMouseCursor(""); altCursor = false; } } } exports.MultiSelect = MultiSelect; require("./config").defineOptions(Editor.prototype, "editor", { enableMultiselect: { set: function(val) { MultiSelect(this); if (val) { this.on("changeSession", this.$multiselectOnSessionChange); this.on("mousedown", onMouseDown); } else { this.off("changeSession", this.$multiselectOnSessionChange); this.off("mousedown", onMouseDown); } }, value: true } }) }); define('ace/mouse/multi_select_handler', ['require', 'exports', 'module' , 'ace/lib/event'], function(require, exports, module) { var event = require("../lib/event"); function isSamePoint(p1, p2) { return p1.row == p2.row && p1.column == p2.column; } function onMouseDown(e) { var ev = e.domEvent; var alt = ev.altKey; var shift = ev.shiftKey; var ctrl = e.getAccelKey(); var button = e.getButton(); if (e.editor.inMultiSelectMode && button == 2) { e.editor.textInput.onContextMenu(e.domEvent); return; } if (!ctrl && !alt) { if (button == 0 && e.editor.inMultiSelectMode) e.editor.exitMultiSelectMode(); return; } var editor = e.editor; var selection = editor.selection; var isMultiSelect = editor.inMultiSelectMode; var pos = e.getDocumentPosition(); var cursor = selection.getCursor(); var inSelection = e.inSelection() || (selection.isEmpty() && isSamePoint(pos, cursor)); var mouseX = e.x, mouseY = e.y; var onMouseSelection = function(e) { mouseX = e.clientX; mouseY = e.clientY; }; var blockSelect = function() { var newCursor = editor.renderer.pixelToScreenCoordinates(mouseX, mouseY); var cursor = session.screenToDocumentPosition(newCursor.row, newCursor.column); if (isSamePoint(screenCursor, newCursor) && isSamePoint(cursor, selection.selectionLead)) return; screenCursor = newCursor; editor.selection.moveCursorToPosition(cursor); editor.selection.clearSelection(); editor.renderer.scrollCursorIntoView(); editor.removeSelectionMarkers(rectSel); rectSel = selection.rectangularRangeBlock(screenCursor, screenAnchor); rectSel.forEach(editor.addSelectionMarker, editor); editor.updateSelectionMarkers(); }; var session = editor.session; var screenAnchor = editor.renderer.pixelToScreenCoordinates(mouseX, mouseY); var screenCursor = screenAnchor; if (ctrl && !shift && !alt && button == 0) { if (!isMultiSelect && inSelection) return; // dragging if (!isMultiSelect) { var range = selection.toOrientedRange(); editor.addSelectionMarker(range); } var oldRange = selection.rangeList.rangeAtPoint(pos); editor.once("mouseup", function() { var tmpSel = selection.toOrientedRange(); if (oldRange && tmpSel.isEmpty() && isSamePoint(oldRange.cursor, tmpSel.cursor)) selection.substractPoint(tmpSel.cursor); else { if (range) { editor.removeSelectionMarker(range); selection.addRange(range); } selection.addRange(tmpSel); } }); } else if (alt && button == 0) { e.stop(); if (isMultiSelect && !ctrl) selection.toSingleRange(); else if (!isMultiSelect && ctrl) selection.addRange(); var rectSel = []; if (shift) { screenAnchor = session.documentToScreenPosition(selection.lead); blockSelect(); } else { selection.moveCursorToPosition(pos); selection.clearSelection(); } var onMouseSelectionEnd = function(e) { clearInterval(timerId); editor.removeSelectionMarkers(rectSel); for (var i = 0; i < rectSel.length; i++) selection.addRange(rectSel[i]); }; var onSelectionInterval = blockSelect; event.capture(editor.container, onMouseSelection, onMouseSelectionEnd); var timerId = setInterval(function() {onSelectionInterval();}, 20); return e.preventDefault(); } } exports.onMouseDown = onMouseDown; }); define('ace/commands/multi_select_commands', ['require', 'exports', 'module' , 'ace/keyboard/hash_handler'], function(require, exports, module) { exports.defaultCommands = [{ name: "addCursorAbove", exec: function(editor) { editor.selectMoreLines(-1); }, bindKey: {win: "Ctrl-Alt-Up", mac: "Ctrl-Alt-Up"}, readonly: true }, { name: "addCursorBelow", exec: function(editor) { editor.selectMoreLines(1); }, bindKey: {win: "Ctrl-Alt-Down", mac: "Ctrl-Alt-Down"}, readonly: true }, { name: "addCursorAboveSkipCurrent", exec: function(editor) { editor.selectMoreLines(-1, true); }, bindKey: {win: "Ctrl-Alt-Shift-Up", mac: "Ctrl-Alt-Shift-Up"}, readonly: true }, { name: "addCursorBelowSkipCurrent", exec: function(editor) { editor.selectMoreLines(1, true); }, bindKey: {win: "Ctrl-Alt-Shift-Down", mac: "Ctrl-Alt-Shift-Down"}, readonly: true }, { name: "selectMoreBefore", exec: function(editor) { editor.selectMore(-1); }, bindKey: {win: "Ctrl-Alt-Left", mac: "Ctrl-Alt-Left"}, readonly: true }, { name: "selectMoreAfter", exec: function(editor) { editor.selectMore(1); }, bindKey: {win: "Ctrl-Alt-Right", mac: "Ctrl-Alt-Right"}, readonly: true }, { name: "selectNextBefore", exec: function(editor) { editor.selectMore(-1, true); }, bindKey: {win: "Ctrl-Alt-Shift-Left", mac: "Ctrl-Alt-Shift-Left"}, readonly: true }, { name: "selectNextAfter", exec: function(editor) { editor.selectMore(1, true); }, bindKey: {win: "Ctrl-Alt-Shift-Right", mac: "Ctrl-Alt-Shift-Right"}, readonly: true }, { name: "splitIntoLines", exec: function(editor) { editor.multiSelect.splitIntoLines(); }, bindKey: {win: "Ctrl-Alt-L", mac: "Ctrl-Alt-L"}, readonly: true }, { name: "alignCursors", exec: function(editor) { editor.alignCursors(); }, bindKey: {win: "Ctrl-Alt-A", mac: "Ctrl-Alt-A"} }]; exports.multiSelectCommands = [{ name: "singleSelection", bindKey: "esc", exec: function(editor) { editor.exitMultiSelectMode(); }, readonly: true, isAvailable: function(editor) {return editor && editor.inMultiSelectMode} }]; var HashHandler = require("../keyboard/hash_handler").HashHandler; exports.keyboardHandler = new HashHandler(exports.multiSelectCommands); }); define('ace/worker/worker_client', ['require', 'exports', 'module' , 'ace/lib/oop', 'ace/lib/event_emitter', 'ace/config'], function(require, exports, module) { var oop = require("../lib/oop"); var EventEmitter = require("../lib/event_emitter").EventEmitter; var config = require("../config"); var WorkerClient = function(topLevelNamespaces, mod, classname) { this.$sendDeltaQueue = this.$sendDeltaQueue.bind(this); this.changeListener = this.changeListener.bind(this); this.onMessage = this.onMessage.bind(this); this.onError = this.onError.bind(this); if (require.nameToUrl && !require.toUrl) require.toUrl = require.nameToUrl; var workerUrl; if (config.get("packaged") || !require.toUrl) { workerUrl = config.moduleUrl(mod, "worker"); } else { var normalizePath = this.$normalizePath; workerUrl = normalizePath(require.toUrl("ace/worker/worker.js", null, "_")); var tlns = {}; topLevelNamespaces.forEach(function(ns) { tlns[ns] = normalizePath(require.toUrl(ns, null, "_").replace(/(\.js)?(\?.*)?$/, "")); }); } this.$worker = new Worker(workerUrl); this.$worker.postMessage({ init : true, tlns: tlns, module: mod, classname: classname }); this.callbackId = 1; this.callbacks = {}; this.$worker.onerror = this.onError; this.$worker.onmessage = this.onMessage; }; (function(){ oop.implement(this, EventEmitter); this.onError = function(e) { window.console && console.log && console.log(e); throw e; }; this.onMessage = function(e) { var msg = e.data; switch(msg.type) { case "log": window.console && console.log && console.log.apply(console, msg.data); break; case "event": this._emit(msg.name, {data: msg.data}); break; case "call": var callback = this.callbacks[msg.id]; if (callback) { callback(msg.data); delete this.callbacks[msg.id]; } break; } }; this.$normalizePath = function(path) { if (!location.host) // needed for file:// protocol return path; path = path.replace(/^[a-z]+:\/\/[^\/]+/, ""); // Remove domain name and rebuild it path = location.protocol + "//" + location.host + (path.charAt(0) == "/" ? "" : location.pathname.replace(/\/[^\/]*$/, "")) + "/" + path.replace(/^[\/]+/, ""); return path; }; this.terminate = function() { this._emit("terminate", {}); this.deltaQueue = null; this.$worker.terminate(); this.$worker = null; this.$doc.removeEventListener("change", this.changeListener); this.$doc = null; }; this.send = function(cmd, args) { this.$worker.postMessage({command: cmd, args: args}); }; this.call = function(cmd, args, callback) { if (callback) { var id = this.callbackId++; this.callbacks[id] = callback; args.push(id); } this.send(cmd, args); }; this.emit = function(event, data) { try { this.$worker.postMessage({event: event, data: {data: data.data}}); } catch(ex) {} }; this.attachToDocument = function(doc) { if(this.$doc) this.terminate(); this.$doc = doc; this.call("setValue", [doc.getValue()]); doc.on("change", this.changeListener); }; this.changeListener = function(e) { if (!this.deltaQueue) { this.deltaQueue = [e.data]; setTimeout(this.$sendDeltaQueue, 1); } else this.deltaQueue.push(e.data); }; this.$sendDeltaQueue = function() { var q = this.deltaQueue; if (!q) return; this.deltaQueue = null; if (q.length > 20 && q.length > this.$doc.getLength() >> 1) { this.call("setValue", [this.$doc.getValue()]); } else this.emit("change", {data: q}); } }).call(WorkerClient.prototype); var UIWorkerClient = function(topLevelNamespaces, mod, classname) { this.$sendDeltaQueue = this.$sendDeltaQueue.bind(this); this.changeListener = this.changeListener.bind(this); this.callbackId = 1; this.callbacks = {}; this.messageBuffer = []; var main = null; var sender = Object.create(EventEmitter); var _self = this; this.$worker = {}; this.$worker.terminate = function() {}; this.$worker.postMessage = function(e) { _self.messageBuffer.push(e); main && setTimeout(processNext); }; var processNext = function() { var msg = _self.messageBuffer.shift(); if (msg.command) main[msg.command].apply(main, msg.args); else if (msg.event) sender._emit(msg.event, msg.data); }; sender.postMessage = function(msg) { _self.onMessage({data: msg}); }; sender.callback = function(data, callbackId) { this.postMessage({type: "call", id: callbackId, data: data}); }; sender.emit = function(name, data) { this.postMessage({type: "event", name: name, data: data}); }; config.loadModule(["worker", mod], function(Main) { main = new Main[classname](sender); while (_self.messageBuffer.length) processNext(); }); }; UIWorkerClient.prototype = WorkerClient.prototype; exports.UIWorkerClient = UIWorkerClient; exports.WorkerClient = WorkerClient; }); define('ace/placeholder', ['require', 'exports', 'module' , 'ace/range', 'ace/lib/event_emitter', 'ace/lib/oop'], function(require, exports, module) { var Range = require("./range").Range; var EventEmitter = require("./lib/event_emitter").EventEmitter; var oop = require("./lib/oop"); var PlaceHolder = function(session, length, pos, others, mainClass, othersClass) { var _self = this; this.length = length; this.session = session; this.doc = session.getDocument(); this.mainClass = mainClass; this.othersClass = othersClass; this.$onUpdate = this.onUpdate.bind(this); this.doc.on("change", this.$onUpdate); this.$others = others; this.$onCursorChange = function() { setTimeout(function() { _self.onCursorChange(); }); }; this.$pos = pos; var undoStack = session.getUndoManager().$undoStack || session.getUndoManager().$undostack || {length: -1}; this.$undoStackDepth = undoStack.length; this.setup(); session.selection.on("changeCursor", this.$onCursorChange); }; (function() { oop.implement(this, EventEmitter); this.setup = function() { var _self = this; var doc = this.doc; var session = this.session; var pos = this.$pos; this.pos = doc.createAnchor(pos.row, pos.column); this.markerId = session.addMarker(new Range(pos.row, pos.column, pos.row, pos.column + this.length), this.mainClass, null, false); this.pos.on("change", function(event) { session.removeMarker(_self.markerId); _self.markerId = session.addMarker(new Range(event.value.row, event.value.column, event.value.row, event.value.column+_self.length), _self.mainClass, null, false); }); this.others = []; this.$others.forEach(function(other) { var anchor = doc.createAnchor(other.row, other.column); _self.others.push(anchor); }); session.setUndoSelect(false); }; this.showOtherMarkers = function() { if(this.othersActive) return; var session = this.session; var _self = this; this.othersActive = true; this.others.forEach(function(anchor) { anchor.markerId = session.addMarker(new Range(anchor.row, anchor.column, anchor.row, anchor.column+_self.length), _self.othersClass, null, false); anchor.on("change", function(event) { session.removeMarker(anchor.markerId); anchor.markerId = session.addMarker(new Range(event.value.row, event.value.column, event.value.row, event.value.column+_self.length), _self.othersClass, null, false); }); }); }; this.hideOtherMarkers = function() { if(!this.othersActive) return; this.othersActive = false; for (var i = 0; i < this.others.length; i++) { this.session.removeMarker(this.others[i].markerId); } }; this.onUpdate = function(event) { var delta = event.data; var range = delta.range; if(range.start.row !== range.end.row) return; if(range.start.row !== this.pos.row) return; if (this.$updating) return; this.$updating = true; var lengthDiff = delta.action === "insertText" ? range.end.column - range.start.column : range.start.column - range.end.column; if(range.start.column >= this.pos.column && range.start.column <= this.pos.column + this.length + 1) { var distanceFromStart = range.start.column - this.pos.column; this.length += lengthDiff; if(!this.session.$fromUndo) { if(delta.action === "insertText") { for (var i = this.others.length - 1; i >= 0; i--) { var otherPos = this.others[i]; var newPos = {row: otherPos.row, column: otherPos.column + distanceFromStart}; if(otherPos.row === range.start.row && range.start.column < otherPos.column) newPos.column += lengthDiff; this.doc.insert(newPos, delta.text); } } else if(delta.action === "removeText") { for (var i = this.others.length - 1; i >= 0; i--) { var otherPos = this.others[i]; var newPos = {row: otherPos.row, column: otherPos.column + distanceFromStart}; if(otherPos.row === range.start.row && range.start.column < otherPos.column) newPos.column += lengthDiff; this.doc.remove(new Range(newPos.row, newPos.column, newPos.row, newPos.column - lengthDiff)); } } if(range.start.column === this.pos.column && delta.action === "insertText") { setTimeout(function() { this.pos.setPosition(this.pos.row, this.pos.column - lengthDiff); for (var i = 0; i < this.others.length; i++) { var other = this.others[i]; var newPos = {row: other.row, column: other.column - lengthDiff}; if(other.row === range.start.row && range.start.column < other.column) newPos.column += lengthDiff; other.setPosition(newPos.row, newPos.column); } }.bind(this), 0); } else if(range.start.column === this.pos.column && delta.action === "removeText") { setTimeout(function() { for (var i = 0; i < this.others.length; i++) { var other = this.others[i]; if(other.row === range.start.row && range.start.column < other.column) { other.setPosition(other.row, other.column - lengthDiff); } } }.bind(this), 0); } } this.pos._emit("change", {value: this.pos}); for (var i = 0; i < this.others.length; i++) { this.others[i]._emit("change", {value: this.others[i]}); } } this.$updating = false; }; this.onCursorChange = function(event) { if (this.$updating) return; var pos = this.session.selection.getCursor(); if(pos.row === this.pos.row && pos.column >= this.pos.column && pos.column <= this.pos.column + this.length) { this.showOtherMarkers(); this._emit("cursorEnter", event); } else { this.hideOtherMarkers(); this._emit("cursorLeave", event); } }; this.detach = function() { this.session.removeMarker(this.markerId); this.hideOtherMarkers(); this.doc.removeEventListener("change", this.$onUpdate); this.session.selection.removeEventListener("changeCursor", this.$onCursorChange); this.pos.detach(); for (var i = 0; i < this.others.length; i++) { this.others[i].detach(); } this.session.setUndoSelect(true); }; this.cancel = function() { if(this.$undoStackDepth === -1) throw Error("Canceling placeholders only supported with undo manager attached to session."); var undoManager = this.session.getUndoManager(); var undosRequired = (undoManager.$undoStack || undoManager.$undostack).length - this.$undoStackDepth; for (var i = 0; i < undosRequired; i++) { undoManager.undo(true); } }; }).call(PlaceHolder.prototype); exports.PlaceHolder = PlaceHolder; }); define('ace/mode/folding/fold_mode', ['require', 'exports', 'module' , 'ace/range'], function(require, exports, module) { var Range = require("../../range").Range; var FoldMode = exports.FoldMode = function() {}; (function() { this.foldingStartMarker = null; this.foldingStopMarker = null; this.getFoldWidget = function(session, foldStyle, row) { var line = session.getLine(row); if (this.foldingStartMarker.test(line)) return "start"; if (foldStyle == "markbeginend" && this.foldingStopMarker && this.foldingStopMarker.test(line)) return "end"; return ""; }; this.getFoldWidgetRange = function(session, foldStyle, row) { return null; }; this.indentationBlock = function(session, row, column) { var re = /\S/; var line = session.getLine(row); var startLevel = line.search(re); if (startLevel == -1) return; var startColumn = column || line.length; var maxRow = session.getLength(); var startRow = row; var endRow = row; while (++row < maxRow) { var level = session.getLine(row).search(re); if (level == -1) continue; if (level <= startLevel) break; endRow = row; } if (endRow > startRow) { var endColumn = session.getLine(endRow).length; return new Range(startRow, startColumn, endRow, endColumn); } }; this.openingBracketBlock = function(session, bracket, row, column, typeRe) { var start = {row: row, column: column + 1}; var end = session.$findClosingBracket(bracket, start, typeRe); if (!end) return; var fw = session.foldWidgets[end.row]; if (fw == null) fw = this.getFoldWidget(session, end.row); if (fw == "start" && end.row > start.row) { end.row --; end.column = session.getLine(end.row).length; } return Range.fromPoints(start, end); }; this.closingBracketBlock = function(session, bracket, row, column, typeRe) { var end = {row: row, column: column}; var start = session.$findOpeningBracket(bracket, end); if (!start) return; start.column++; end.column--; return Range.fromPoints(start, end); }; }).call(FoldMode.prototype); }); define('ace/theme/textmate', ['require', 'exports', 'module' , 'ace/lib/dom'], function(require, exports, module) { exports.isDark = false; exports.cssClass = "ace-tm"; exports.cssText = ".ace-tm .ace_gutter {\ background: #f0f0f0;\ color: #333;\ }\ .ace-tm .ace_print-margin {\ width: 1px;\ background: #e8e8e8;\ }\ .ace-tm .ace_fold {\ background-color: #6B72E6;\ }\ .ace-tm {\ background-color: #FFFFFF;\ }\ .ace-tm .ace_cursor {\ color: black;\ }\ .ace-tm .ace_invisible {\ color: rgb(191, 191, 191);\ }\ .ace-tm .ace_storage,\ .ace-tm .ace_keyword {\ color: blue;\ }\ .ace-tm .ace_constant {\ color: rgb(197, 6, 11);\ }\ .ace-tm .ace_constant.ace_buildin {\ color: rgb(88, 72, 246);\ }\ .ace-tm .ace_constant.ace_language {\ color: rgb(88, 92, 246);\ }\ .ace-tm .ace_constant.ace_library {\ color: rgb(6, 150, 14);\ }\ .ace-tm .ace_invalid {\ background-color: rgba(255, 0, 0, 0.1);\ color: red;\ }\ .ace-tm .ace_support.ace_function {\ color: rgb(60, 76, 114);\ }\ .ace-tm .ace_support.ace_constant {\ color: rgb(6, 150, 14);\ }\ .ace-tm .ace_support.ace_type,\ .ace-tm .ace_support.ace_class {\ color: rgb(109, 121, 222);\ }\ .ace-tm .ace_keyword.ace_operator {\ color: rgb(104, 118, 135);\ }\ .ace-tm .ace_string {\ color: rgb(3, 106, 7);\ }\ .ace-tm .ace_comment {\ color: rgb(76, 136, 107);\ }\ .ace-tm .ace_comment.ace_doc {\ color: rgb(0, 102, 255);\ }\ .ace-tm .ace_comment.ace_doc.ace_tag {\ color: rgb(128, 159, 191);\ }\ .ace-tm .ace_constant.ace_numeric {\ color: rgb(0, 0, 205);\ }\ .ace-tm .ace_variable {\ color: rgb(49, 132, 149);\ }\ .ace-tm .ace_xml-pe {\ color: rgb(104, 104, 91);\ }\ .ace-tm .ace_entity.ace_name.ace_function {\ color: #0000A2;\ }\ .ace-tm .ace_heading {\ color: rgb(12, 7, 255);\ }\ .ace-tm .ace_list {\ color:rgb(185, 6, 144);\ }\ .ace-tm .ace_meta.ace_tag {\ color:rgb(0, 22, 142);\ }\ .ace-tm .ace_string.ace_regex {\ color: rgb(255, 0, 0)\ }\ .ace-tm .ace_marker-layer .ace_selection {\ background: rgb(181, 213, 255);\ }\ .ace-tm.ace_multiselect .ace_selection.ace_start {\ box-shadow: 0 0 3px 0px white;\ border-radius: 2px;\ }\ .ace-tm .ace_marker-layer .ace_step {\ background: rgb(252, 255, 0);\ }\ .ace-tm .ace_marker-layer .ace_stack {\ background: rgb(164, 229, 101);\ }\ .ace-tm .ace_marker-layer .ace_bracket {\ margin: -1px 0 0 -1px;\ border: 1px solid rgb(192, 192, 192);\ }\ .ace-tm .ace_marker-layer .ace_active-line {\ background: rgba(0, 0, 0, 0.07);\ }\ .ace-tm .ace_gutter-active-line {\ background-color : #dcdcdc;\ }\ .ace-tm .ace_marker-layer .ace_selected-word {\ background: rgb(250, 250, 255);\ border: 1px solid rgb(200, 200, 250);\ }\ .ace-tm .ace_indent-guide {\ background: url(\"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAACCAYAAACZgbYnAAAAE0lEQVQImWP4////f4bLly//BwAmVgd1/w11/gAAAABJRU5ErkJggg==\") right repeat-y;\ }\ "; var dom = require("../lib/dom"); dom.importCssString(exports.cssText, exports.cssClass); }); ; (function() { window.require(["ace/ace"], function(a) { a && a.config.init(); if (!window.ace) window.ace = {}; for (var key in a) if (a.hasOwnProperty(key)) ace[key] = a[key]; }); })(); define('ace/ace', ['require', 'exports', 'module' , 'ace/lib/fixoldbrowsers', 'ace/lib/dom', 'ace/lib/event', 'ace/editor', 'ace/edit_session', 'ace/undomanager', 'ace/virtual_renderer', 'ace/multi_select', 'ace/worker/worker_client', 'ace/keyboard/hash_handler', 'ace/placeholder', 'ace/mode/folding/fold_mode', 'ace/theme/textmate', 'ace/config'], function(require, exports, module) { require("./lib/fixoldbrowsers"); var dom = require("./lib/dom"); var event = require("./lib/event"); var Editor = require("./editor").Editor; var EditSession = require("./edit_session").EditSession; var UndoManager = require("./undomanager").UndoManager; var Renderer = require("./virtual_renderer").VirtualRenderer; var MultiSelect = require("./multi_select").MultiSelect; require("./worker/worker_client"); require("./keyboard/hash_handler"); require("./placeholder"); require("./mode/folding/fold_mode"); require("./theme/textmate"); exports.config = require("./config"); exports.require = require; exports.edit = function(el) { if (typeof(el) == "string") { var _id = el; var el = document.getElementById(_id); if (!el) throw new Error("ace.edit can't find div #" + _id); } if (el.env && el.env.editor instanceof Editor) return el.env.editor; var doc = exports.createEditSession(dom.getInnerText(el)); el.innerHTML = ''; var editor = new Editor(new Renderer(el)); new MultiSelect(editor); editor.setSession(doc); var env = { document: doc, editor: editor, onResize: editor.resize.bind(editor, null) }; event.addListener(window, "resize", env.onResize); editor.on("destroy", function() { event.removeListener(window, "resize", env.onResize); }); el.env = editor.env = env; return editor; }; exports.createEditSession = function(text, mode) { var doc = new EditSession(text, mode); doc.setUndoManager(new UndoManager()); return doc; } exports.EditSession = EditSession; exports.UndoManager = UndoManager; }); apache-couchdb-1.6.0/src/fauxton/assets/js/libs/ace/ext-whitespace.js0000644000175000001440000001504512332105522025465 0ustar00djcusers00000000000000/* ***** BEGIN LICENSE BLOCK ***** * Distributed under the BSD license: * * Copyright (c) 2010, Ajax.org B.V. * All rights reserved. * * 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 Ajax.org B.V. nor the * names of its contributors may be used to endorse or promote products * derived from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE * DISCLAIMED. IN NO EVENT SHALL AJAX.ORG B.V. 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. * * ***** END LICENSE BLOCK ***** */ define('ace/ext/whitespace', ['require', 'exports', 'module' , 'ace/lib/lang'], function(require, exports, module) { var lang = require("../lib/lang"); exports.$detectIndentation = function(lines, fallback) { var stats = []; var changes = []; var tabIndents = 0; var prevSpaces = 0; var max = Math.min(lines.length, 1000); for (var i = 0; i < max; i++) { var line = lines[i]; if (!/^\s*[^*+\-\s]/.test(line)) continue; var tabs = line.match(/^\t*/)[0].length; if (line[0] == "\t") tabIndents++; var spaces = line.match(/^ */)[0].length; if (spaces && line[spaces] != "\t") { var diff = spaces - prevSpaces; if (diff > 0 && !(prevSpaces%diff) && !(spaces%diff)) changes[diff] = (changes[diff] || 0) + 1; stats[spaces] = (stats[spaces] || 0) + 1; } prevSpaces = spaces; while (line[line.length - 1] == "\\") line = lines[i++]; } function getScore(indent) { var score = 0; for (var i = indent; i < stats.length; i += indent) score += stats[i] || 0; return score; } var changesTotal = changes.reduce(function(a,b){return a+b}, 0); var first = {score: 0, length: 0}; var spaceIndents = 0; for (var i = 1; i < 12; i++) { if (i == 1) { spaceIndents = getScore(i); var score = 1; } else var score = getScore(i) / spaceIndents; if (changes[i]) { score += changes[i] / changesTotal; } if (score > first.score) first = {score: score, length: i}; } if (first.score && first.score > 1.4) var tabLength = first.length; if (tabIndents > spaceIndents + 1) return {ch: "\t", length: tabLength}; if (spaceIndents + 1 > tabIndents) return {ch: " ", length: tabLength}; }; exports.detectIndentation = function(session) { var lines = session.getLines(0, 1000); var indent = exports.$detectIndentation(lines) || {}; if (indent.ch) session.setUseSoftTabs(indent.ch == " "); if (indent.length) session.setTabSize(indent.length); return indent; }; exports.trimTrailingSpace = function(session, trimEmpty) { var doc = session.getDocument(); var lines = doc.getAllLines(); var min = trimEmpty ? -1 : 0; for (var i = 0, l=lines.length; i < l; i++) { var line = lines[i]; var index = line.search(/\s+$/); if (index > min) doc.removeInLine(i, index, line.length); } }; exports.convertIndentation = function(session, ch, len) { var oldCh = session.getTabString()[0]; var oldLen = session.getTabSize(); if (!len) len = oldLen; if (!ch) ch = oldCh; var tab = ch == "\t" ? ch: lang.stringRepeat(ch, len); var doc = session.doc; var lines = doc.getAllLines(); var cache = {}; var spaceCache = {}; for (var i = 0, l=lines.length; i < l; i++) { var line = lines[i]; var match = line.match(/^\s*/)[0]; if (match) { var w = session.$getStringScreenWidth(match)[0]; var tabCount = Math.floor(w/oldLen); var reminder = w%oldLen; var toInsert = cache[tabCount] || (cache[tabCount] = lang.stringRepeat(tab, tabCount)); toInsert += spaceCache[reminder] || (spaceCache[reminder] = lang.stringRepeat(" ", reminder)); if (toInsert != match) { doc.removeInLine(i, 0, match.length); doc.insertInLine({row: i, column: 0}, toInsert); } } } session.setTabSize(len); session.setUseSoftTabs(ch == " "); }; exports.$parseStringArg = function(text) { var indent = {}; if (/t/.test(text)) indent.ch = "\t"; else if (/s/.test(text)) indent.ch = " "; var m = text.match(/\d+/); if (m) indent.length = parseInt(m[0], 10); return indent; }; exports.$parseArg = function(arg) { if (!arg) return {}; if (typeof arg == "string") return exports.$parseStringArg(arg); if (typeof arg.text == "string") return exports.$parseStringArg(arg.text); return arg; }; exports.commands = [{ name: "detectIndentation", exec: function(editor) { exports.detectIndentation(editor.session); } }, { name: "trimTrailingSpace", exec: function(editor) { exports.trimTrailingSpace(editor.session); } }, { name: "convertIndentation", exec: function(editor, arg) { var indent = exports.$parseArg(arg); exports.convertIndentation(editor.session, indent.ch, indent.length); } }, { name: "setIndentation", exec: function(editor, arg) { var indent = exports.$parseArg(arg); indent.length && editor.session.setTabSize(indent.length); indent.ch && editor.session.setUseSoftTabs(indent.ch == " "); } }]; }); apache-couchdb-1.6.0/src/fauxton/assets/js/libs/ace/theme-crimson_editor.js0000644000175000001440000001127312332105522026652 0ustar00djcusers00000000000000/* ***** BEGIN LICENSE BLOCK ***** * Distributed under the BSD license: * * Copyright (c) 2010, Ajax.org B.V. * All rights reserved. * * 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 Ajax.org B.V. nor the * names of its contributors may be used to endorse or promote products * derived from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE * DISCLAIMED. IN NO EVENT SHALL AJAX.ORG B.V. 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. * * ***** END LICENSE BLOCK ***** */ define('ace/theme/crimson_editor', ['require', 'exports', 'module' , 'ace/lib/dom'], function(require, exports, module) { exports.isDark = false; exports.cssText = ".ace-crimson-editor .ace_gutter {\ background: #ebebeb;\ color: #333;\ overflow : hidden;\ }\ .ace-crimson-editor .ace_gutter-layer {\ width: 100%;\ text-align: right;\ }\ .ace-crimson-editor .ace_print-margin {\ width: 1px;\ background: #e8e8e8;\ }\ .ace-crimson-editor {\ background-color: #FFFFFF;\ color: rgb(64, 64, 64);\ }\ .ace-crimson-editor .ace_cursor {\ color: black;\ }\ .ace-crimson-editor .ace_invisible {\ color: rgb(191, 191, 191);\ }\ .ace-crimson-editor .ace_identifier {\ color: black;\ }\ .ace-crimson-editor .ace_keyword {\ color: blue;\ }\ .ace-crimson-editor .ace_constant.ace_buildin {\ color: rgb(88, 72, 246);\ }\ .ace-crimson-editor .ace_constant.ace_language {\ color: rgb(255, 156, 0);\ }\ .ace-crimson-editor .ace_constant.ace_library {\ color: rgb(6, 150, 14);\ }\ .ace-crimson-editor .ace_invalid {\ text-decoration: line-through;\ color: rgb(224, 0, 0);\ }\ .ace-crimson-editor .ace_fold {\ }\ .ace-crimson-editor .ace_support.ace_function {\ color: rgb(192, 0, 0);\ }\ .ace-crimson-editor .ace_support.ace_constant {\ color: rgb(6, 150, 14);\ }\ .ace-crimson-editor .ace_support.ace_type,\ .ace-crimson-editor .ace_support.ace_class {\ color: rgb(109, 121, 222);\ }\ .ace-crimson-editor .ace_keyword.ace_operator {\ color: rgb(49, 132, 149);\ }\ .ace-crimson-editor .ace_string {\ color: rgb(128, 0, 128);\ }\ .ace-crimson-editor .ace_comment {\ color: rgb(76, 136, 107);\ }\ .ace-crimson-editor .ace_comment.ace_doc {\ color: rgb(0, 102, 255);\ }\ .ace-crimson-editor .ace_comment.ace_doc.ace_tag {\ color: rgb(128, 159, 191);\ }\ .ace-crimson-editor .ace_constant.ace_numeric {\ color: rgb(0, 0, 64);\ }\ .ace-crimson-editor .ace_variable {\ color: rgb(0, 64, 128);\ }\ .ace-crimson-editor .ace_xml-pe {\ color: rgb(104, 104, 91);\ }\ .ace-crimson-editor .ace_marker-layer .ace_selection {\ background: rgb(181, 213, 255);\ }\ .ace-crimson-editor .ace_marker-layer .ace_step {\ background: rgb(252, 255, 0);\ }\ .ace-crimson-editor .ace_marker-layer .ace_stack {\ background: rgb(164, 229, 101);\ }\ .ace-crimson-editor .ace_marker-layer .ace_bracket {\ margin: -1px 0 0 -1px;\ border: 1px solid rgb(192, 192, 192);\ }\ .ace-crimson-editor .ace_marker-layer .ace_active-line {\ background: rgb(232, 242, 254);\ }\ .ace-crimson-editor .ace_gutter-active-line {\ background-color : #dcdcdc;\ }\ .ace-crimson-editor .ace_meta.ace_tag {\ color:rgb(28, 2, 255);\ }\ .ace-crimson-editor .ace_marker-layer .ace_selected-word {\ background: rgb(250, 250, 255);\ border: 1px solid rgb(200, 200, 250);\ }\ .ace-crimson-editor .ace_string.ace_regex {\ color: rgb(192, 0, 192);\ }\ .ace-crimson-editor .ace_indent-guide {\ background: url(\"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAACCAYAAACZgbYnAAAAE0lEQVQImWP4////f4bLly//BwAmVgd1/w11/gAAAABJRU5ErkJggg==\") right repeat-y;\ }"; exports.cssClass = "ace-crimson-editor"; var dom = require("../lib/dom"); dom.importCssString(exports.cssText, exports.cssClass); }); apache-couchdb-1.6.0/src/fauxton/assets/js/libs/ace/mode-json.js0000644000175000001440000005333712332105522024434 0ustar00djcusers00000000000000/* ***** BEGIN LICENSE BLOCK ***** * Distributed under the BSD license: * * Copyright (c) 2010, Ajax.org B.V. * All rights reserved. * * 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 Ajax.org B.V. nor the * names of its contributors may be used to endorse or promote products * derived from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE * DISCLAIMED. IN NO EVENT SHALL AJAX.ORG B.V. 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. * * ***** END LICENSE BLOCK ***** */ define('ace/mode/json', ['require', 'exports', 'module' , 'ace/lib/oop', 'ace/mode/text', 'ace/tokenizer', 'ace/mode/json_highlight_rules', 'ace/mode/matching_brace_outdent', 'ace/mode/behaviour/cstyle', 'ace/mode/folding/cstyle', 'ace/worker/worker_client'], function(require, exports, module) { var oop = require("../lib/oop"); var TextMode = require("./text").Mode; var Tokenizer = require("../tokenizer").Tokenizer; var HighlightRules = require("./json_highlight_rules").JsonHighlightRules; var MatchingBraceOutdent = require("./matching_brace_outdent").MatchingBraceOutdent; var CstyleBehaviour = require("./behaviour/cstyle").CstyleBehaviour; var CStyleFoldMode = require("./folding/cstyle").FoldMode; var WorkerClient = require("../worker/worker_client").WorkerClient; var Mode = function() { this.HighlightRules = HighlightRules; this.$outdent = new MatchingBraceOutdent(); this.$behaviour = new CstyleBehaviour(); this.foldingRules = new CStyleFoldMode(); }; oop.inherits(Mode, TextMode); (function() { this.getNextLineIndent = function(state, line, tab) { var indent = this.$getIndent(line); if (state == "start") { var match = line.match(/^.*[\{\(\[]\s*$/); if (match) { indent += tab; } } return indent; }; this.checkOutdent = function(state, line, input) { return this.$outdent.checkOutdent(line, input); }; this.autoOutdent = function(state, doc, row) { this.$outdent.autoOutdent(doc, row); }; this.createWorker = function(session) { var worker = new WorkerClient(["ace"], "ace/mode/json_worker", "JsonWorker"); worker.attachToDocument(session.getDocument()); worker.on("error", function(e) { session.setAnnotations([e.data]); }); worker.on("ok", function() { session.clearAnnotations(); }); return worker; }; }).call(Mode.prototype); exports.Mode = Mode; }); define('ace/mode/json_highlight_rules', ['require', 'exports', 'module' , 'ace/lib/oop', 'ace/mode/text_highlight_rules'], function(require, exports, module) { var oop = require("../lib/oop"); var TextHighlightRules = require("./text_highlight_rules").TextHighlightRules; var JsonHighlightRules = function() { this.$rules = { "start" : [ { token : "variable", // single line regex : '["](?:(?:\\\\.)|(?:[^"\\\\]))*?["]\\s*(?=:)' }, { token : "string", // single line regex : '"', next : "string" }, { token : "constant.numeric", // hex regex : "0[xX][0-9a-fA-F]+\\b" }, { token : "constant.numeric", // float regex : "[+-]?\\d+(?:(?:\\.\\d*)?(?:[eE][+-]?\\d+)?)?\\b" }, { token : "constant.language.boolean", regex : "(?:true|false)\\b" }, { token : "invalid.illegal", // single quoted strings are not allowed regex : "['](?:(?:\\\\.)|(?:[^'\\\\]))*?[']" }, { token : "invalid.illegal", // comments are not allowed regex : "\\/\\/.*$" }, { token : "paren.lparen", regex : "[[({]" }, { token : "paren.rparen", regex : "[\\])}]" }, { token : "text", regex : "\\s+" } ], "string" : [ { token : "constant.language.escape", regex : /\\(?:x[0-9a-fA-F]{2}|u[0-9a-fA-F]{4}|["\\\/bfnrt])/ }, { token : "string", regex : '[^"\\\\]+' }, { token : "string", regex : '"', next : "start" }, { token : "string", regex : "", next : "start" } ] }; }; oop.inherits(JsonHighlightRules, TextHighlightRules); exports.JsonHighlightRules = JsonHighlightRules; }); define('ace/mode/matching_brace_outdent', ['require', 'exports', 'module' , 'ace/range'], function(require, exports, module) { var Range = require("../range").Range; var MatchingBraceOutdent = function() {}; (function() { this.checkOutdent = function(line, input) { if (! /^\s+$/.test(line)) return false; return /^\s*\}/.test(input); }; this.autoOutdent = function(doc, row) { var line = doc.getLine(row); var match = line.match(/^(\s*\})/); if (!match) return 0; var column = match[1].length; var openBracePos = doc.findMatchingBracket({row: row, column: column}); if (!openBracePos || openBracePos.row == row) return 0; var indent = this.$getIndent(doc.getLine(openBracePos.row)); doc.replace(new Range(row, 0, row, column-1), indent); }; this.$getIndent = function(line) { return line.match(/^\s*/)[0]; }; }).call(MatchingBraceOutdent.prototype); exports.MatchingBraceOutdent = MatchingBraceOutdent; }); define('ace/mode/behaviour/cstyle', ['require', 'exports', 'module' , 'ace/lib/oop', 'ace/mode/behaviour', 'ace/token_iterator', 'ace/lib/lang'], function(require, exports, module) { var oop = require("../../lib/oop"); var Behaviour = require("../behaviour").Behaviour; var TokenIterator = require("../../token_iterator").TokenIterator; var lang = require("../../lib/lang"); var SAFE_INSERT_IN_TOKENS = ["text", "paren.rparen", "punctuation.operator"]; var SAFE_INSERT_BEFORE_TOKENS = ["text", "paren.rparen", "punctuation.operator", "comment"]; var autoInsertedBrackets = 0; var autoInsertedRow = -1; var autoInsertedLineEnd = ""; var maybeInsertedBrackets = 0; var maybeInsertedRow = -1; var maybeInsertedLineStart = ""; var maybeInsertedLineEnd = ""; var CstyleBehaviour = function () { CstyleBehaviour.isSaneInsertion = function(editor, session) { var cursor = editor.getCursorPosition(); var iterator = new TokenIterator(session, cursor.row, cursor.column); if (!this.$matchTokenType(iterator.getCurrentToken() || "text", SAFE_INSERT_IN_TOKENS)) { var iterator2 = new TokenIterator(session, cursor.row, cursor.column + 1); if (!this.$matchTokenType(iterator2.getCurrentToken() || "text", SAFE_INSERT_IN_TOKENS)) return false; } iterator.stepForward(); return iterator.getCurrentTokenRow() !== cursor.row || this.$matchTokenType(iterator.getCurrentToken() || "text", SAFE_INSERT_BEFORE_TOKENS); }; CstyleBehaviour.$matchTokenType = function(token, types) { return types.indexOf(token.type || token) > -1; }; CstyleBehaviour.recordAutoInsert = function(editor, session, bracket) { var cursor = editor.getCursorPosition(); var line = session.doc.getLine(cursor.row); if (!this.isAutoInsertedClosing(cursor, line, autoInsertedLineEnd[0])) autoInsertedBrackets = 0; autoInsertedRow = cursor.row; autoInsertedLineEnd = bracket + line.substr(cursor.column); autoInsertedBrackets++; }; CstyleBehaviour.recordMaybeInsert = function(editor, session, bracket) { var cursor = editor.getCursorPosition(); var line = session.doc.getLine(cursor.row); if (!this.isMaybeInsertedClosing(cursor, line)) maybeInsertedBrackets = 0; maybeInsertedRow = cursor.row; maybeInsertedLineStart = line.substr(0, cursor.column) + bracket; maybeInsertedLineEnd = line.substr(cursor.column); maybeInsertedBrackets++; }; CstyleBehaviour.isAutoInsertedClosing = function(cursor, line, bracket) { return autoInsertedBrackets > 0 && cursor.row === autoInsertedRow && bracket === autoInsertedLineEnd[0] && line.substr(cursor.column) === autoInsertedLineEnd; }; CstyleBehaviour.isMaybeInsertedClosing = function(cursor, line) { return maybeInsertedBrackets > 0 && cursor.row === maybeInsertedRow && line.substr(cursor.column) === maybeInsertedLineEnd && line.substr(0, cursor.column) == maybeInsertedLineStart; }; CstyleBehaviour.popAutoInsertedClosing = function() { autoInsertedLineEnd = autoInsertedLineEnd.substr(1); autoInsertedBrackets--; }; CstyleBehaviour.clearMaybeInsertedClosing = function() { maybeInsertedBrackets = 0; maybeInsertedRow = -1; }; this.add("braces", "insertion", function (state, action, editor, session, text) { var cursor = editor.getCursorPosition(); var line = session.doc.getLine(cursor.row); if (text == '{') { var selection = editor.getSelectionRange(); var selected = session.doc.getTextRange(selection); if (selected !== "" && selected !== "{" && editor.getWrapBehavioursEnabled()) { return { text: '{' + selected + '}', selection: false }; } else if (CstyleBehaviour.isSaneInsertion(editor, session)) { if (/[\]\}\)]/.test(line[cursor.column])) { CstyleBehaviour.recordAutoInsert(editor, session, "}"); return { text: '{}', selection: [1, 1] }; } else { CstyleBehaviour.recordMaybeInsert(editor, session, "{"); return { text: '{', selection: [1, 1] }; } } } else if (text == '}') { var rightChar = line.substring(cursor.column, cursor.column + 1); if (rightChar == '}') { var matching = session.$findOpeningBracket('}', {column: cursor.column + 1, row: cursor.row}); if (matching !== null && CstyleBehaviour.isAutoInsertedClosing(cursor, line, text)) { CstyleBehaviour.popAutoInsertedClosing(); return { text: '', selection: [1, 1] }; } } } else if (text == "\n" || text == "\r\n") { var closing = ""; if (CstyleBehaviour.isMaybeInsertedClosing(cursor, line)) { closing = lang.stringRepeat("}", maybeInsertedBrackets); CstyleBehaviour.clearMaybeInsertedClosing(); } var rightChar = line.substring(cursor.column, cursor.column + 1); if (rightChar == '}' || closing !== "") { var openBracePos = session.findMatchingBracket({row: cursor.row, column: cursor.column}, '}'); if (!openBracePos) return null; var indent = this.getNextLineIndent(state, line.substring(0, cursor.column), session.getTabString()); var next_indent = this.$getIndent(line); return { text: '\n' + indent + '\n' + next_indent + closing, selection: [1, indent.length, 1, indent.length] }; } } }); this.add("braces", "deletion", function (state, action, editor, session, range) { var selected = session.doc.getTextRange(range); if (!range.isMultiLine() && selected == '{') { var line = session.doc.getLine(range.start.row); var rightChar = line.substring(range.end.column, range.end.column + 1); if (rightChar == '}') { range.end.column++; return range; } else { maybeInsertedBrackets--; } } }); this.add("parens", "insertion", function (state, action, editor, session, text) { if (text == '(') { var selection = editor.getSelectionRange(); var selected = session.doc.getTextRange(selection); if (selected !== "" && editor.getWrapBehavioursEnabled()) { return { text: '(' + selected + ')', selection: false }; } else if (CstyleBehaviour.isSaneInsertion(editor, session)) { CstyleBehaviour.recordAutoInsert(editor, session, ")"); return { text: '()', selection: [1, 1] }; } } else if (text == ')') { var cursor = editor.getCursorPosition(); var line = session.doc.getLine(cursor.row); var rightChar = line.substring(cursor.column, cursor.column + 1); if (rightChar == ')') { var matching = session.$findOpeningBracket(')', {column: cursor.column + 1, row: cursor.row}); if (matching !== null && CstyleBehaviour.isAutoInsertedClosing(cursor, line, text)) { CstyleBehaviour.popAutoInsertedClosing(); return { text: '', selection: [1, 1] }; } } } }); this.add("parens", "deletion", function (state, action, editor, session, range) { var selected = session.doc.getTextRange(range); if (!range.isMultiLine() && selected == '(') { var line = session.doc.getLine(range.start.row); var rightChar = line.substring(range.start.column + 1, range.start.column + 2); if (rightChar == ')') { range.end.column++; return range; } } }); this.add("brackets", "insertion", function (state, action, editor, session, text) { if (text == '[') { var selection = editor.getSelectionRange(); var selected = session.doc.getTextRange(selection); if (selected !== "" && editor.getWrapBehavioursEnabled()) { return { text: '[' + selected + ']', selection: false }; } else if (CstyleBehaviour.isSaneInsertion(editor, session)) { CstyleBehaviour.recordAutoInsert(editor, session, "]"); return { text: '[]', selection: [1, 1] }; } } else if (text == ']') { var cursor = editor.getCursorPosition(); var line = session.doc.getLine(cursor.row); var rightChar = line.substring(cursor.column, cursor.column + 1); if (rightChar == ']') { var matching = session.$findOpeningBracket(']', {column: cursor.column + 1, row: cursor.row}); if (matching !== null && CstyleBehaviour.isAutoInsertedClosing(cursor, line, text)) { CstyleBehaviour.popAutoInsertedClosing(); return { text: '', selection: [1, 1] }; } } } }); this.add("brackets", "deletion", function (state, action, editor, session, range) { var selected = session.doc.getTextRange(range); if (!range.isMultiLine() && selected == '[') { var line = session.doc.getLine(range.start.row); var rightChar = line.substring(range.start.column + 1, range.start.column + 2); if (rightChar == ']') { range.end.column++; return range; } } }); this.add("string_dquotes", "insertion", function (state, action, editor, session, text) { if (text == '"' || text == "'") { var quote = text; var selection = editor.getSelectionRange(); var selected = session.doc.getTextRange(selection); if (selected !== "" && selected !== "'" && selected != '"' && editor.getWrapBehavioursEnabled()) { return { text: quote + selected + quote, selection: false }; } else { var cursor = editor.getCursorPosition(); var line = session.doc.getLine(cursor.row); var leftChar = line.substring(cursor.column-1, cursor.column); if (leftChar == '\\') { return null; } var tokens = session.getTokens(selection.start.row); var col = 0, token; var quotepos = -1; // Track whether we're inside an open quote. for (var x = 0; x < tokens.length; x++) { token = tokens[x]; if (token.type == "string") { quotepos = -1; } else if (quotepos < 0) { quotepos = token.value.indexOf(quote); } if ((token.value.length + col) > selection.start.column) { break; } col += tokens[x].value.length; } if (!token || (quotepos < 0 && token.type !== "comment" && (token.type !== "string" || ((selection.start.column !== token.value.length+col-1) && token.value.lastIndexOf(quote) === token.value.length-1)))) { if (!CstyleBehaviour.isSaneInsertion(editor, session)) return; return { text: quote + quote, selection: [1,1] }; } else if (token && token.type === "string") { var rightChar = line.substring(cursor.column, cursor.column + 1); if (rightChar == quote) { return { text: '', selection: [1, 1] }; } } } } }); this.add("string_dquotes", "deletion", function (state, action, editor, session, range) { var selected = session.doc.getTextRange(range); if (!range.isMultiLine() && (selected == '"' || selected == "'")) { var line = session.doc.getLine(range.start.row); var rightChar = line.substring(range.start.column + 1, range.start.column + 2); if (rightChar == selected) { range.end.column++; return range; } } }); }; oop.inherits(CstyleBehaviour, Behaviour); exports.CstyleBehaviour = CstyleBehaviour; }); define('ace/mode/folding/cstyle', ['require', 'exports', 'module' , 'ace/lib/oop', 'ace/range', 'ace/mode/folding/fold_mode'], function(require, exports, module) { var oop = require("../../lib/oop"); var Range = require("../../range").Range; var BaseFoldMode = require("./fold_mode").FoldMode; var FoldMode = exports.FoldMode = function(commentRegex) { if (commentRegex) { this.foldingStartMarker = new RegExp( this.foldingStartMarker.source.replace(/\|[^|]*?$/, "|" + commentRegex.start) ); this.foldingStopMarker = new RegExp( this.foldingStopMarker.source.replace(/\|[^|]*?$/, "|" + commentRegex.end) ); } }; oop.inherits(FoldMode, BaseFoldMode); (function() { this.foldingStartMarker = /(\{|\[)[^\}\]]*$|^\s*(\/\*)/; this.foldingStopMarker = /^[^\[\{]*(\}|\])|^[\s\*]*(\*\/)/; this.getFoldWidgetRange = function(session, foldStyle, row) { var line = session.getLine(row); var match = line.match(this.foldingStartMarker); if (match) { var i = match.index; if (match[1]) return this.openingBracketBlock(session, match[1], row, i); return session.getCommentFoldRange(row, i + match[0].length, 1); } if (foldStyle !== "markbeginend") return; var match = line.match(this.foldingStopMarker); if (match) { var i = match.index + match[0].length; if (match[1]) return this.closingBracketBlock(session, match[1], row, i); return session.getCommentFoldRange(row, i, -1); } }; }).call(FoldMode.prototype); }); apache-couchdb-1.6.0/src/fauxton/assets/js/libs/ace/mode-jsoniq.js0000644000175000001440000120314512332105522024761 0ustar00djcusers00000000000000/* ***** BEGIN LICENSE BLOCK ***** * Distributed under the BSD license: * * Copyright (c) 2010, Ajax.org B.V. * All rights reserved. * * 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 Ajax.org B.V. nor the * names of its contributors may be used to endorse or promote products * derived from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE * DISCLAIMED. IN NO EVENT SHALL AJAX.ORG B.V. 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. * * ***** END LICENSE BLOCK ***** */ define('ace/mode/jsoniq', ['require', 'exports', 'module' , 'ace/lib/oop', 'ace/mode/text', 'ace/mode/xquery/JSONiqLexer', 'ace/range', 'ace/mode/behaviour/xquery', 'ace/mode/folding/cstyle'], function(require, exports, module) { var oop = require("../lib/oop"); var TextMode = require("./text").Mode; var JSONiqLexer = require("./xquery/JSONiqLexer").JSONiqLexer; var Range = require("../range").Range; var XQueryBehaviour = require("./behaviour/xquery").XQueryBehaviour; var CStyleFoldMode = require("./folding/cstyle").FoldMode; var Mode = function() { this.$tokenizer = new JSONiqLexer(); this.$behaviour = new XQueryBehaviour(); this.foldingRules = new CStyleFoldMode(); }; oop.inherits(Mode, TextMode); (function() { this.getNextLineIndent = function(state, line, tab) { var indent = this.$getIndent(line); var match = line.match(/\s*(?:then|else|return|[{\(]|<\w+>)\s*$/); if (match) indent += tab; return indent; }; this.checkOutdent = function(state, line, input) { if (! /^\s+$/.test(line)) return false; return /^\s*[\}\)]/.test(input); }; this.autoOutdent = function(state, doc, row) { var line = doc.getLine(row); var match = line.match(/^(\s*[\}\)])/); if (!match) return 0; var column = match[1].length; var openBracePos = doc.findMatchingBracket({row: row, column: column}); if (!openBracePos || openBracePos.row == row) return 0; var indent = this.$getIndent(doc.getLine(openBracePos.row)); doc.replace(new Range(row, 0, row, column-1), indent); }; this.toggleCommentLines = function(state, doc, startRow, endRow) { var i, line; var outdent = true; var re = /^\s*\(:(.*):\)/; for (i=startRow; i<= endRow; i++) { if (!re.test(doc.getLine(i))) { outdent = false; break; } } var range = new Range(0, 0, 0, 0); for (i=startRow; i<= endRow; i++) { line = doc.getLine(i); range.start.row = i; range.end.row = i; range.end.column = line.length; doc.replace(range, outdent ? line.match(re)[1] : "(:" + line + ":)"); } }; }).call(Mode.prototype); exports.Mode = Mode; }); define('ace/mode/xquery/JSONiqLexer', ['require', 'exports', 'module' , 'ace/mode/xquery/JSONiqTokenizer'], function(require, exports, module) { var JSONiqTokenizer = require("./JSONiqTokenizer").JSONiqTokenizer; var TokenHandler = function(code) { var input = code; this.tokens = []; this.reset = function(code) { input = input; this.tokens = []; }; this.startNonterminal = function(name, begin) {}; this.endNonterminal = function(name, end) {}; this.terminal = function(name, begin, end) { this.tokens.push({ name: name, value: input.substring(begin, end) }); }; this.whitespace = function(begin, end) { this.tokens.push({ name: "WS", value: input.substring(begin, end) }); }; }; var keys = "NaN|after|allowing|ancestor|ancestor-or-self|and|append|array|as|ascending|at|attribute|base-uri|before|boundary-space|break|by|case|cast|castable|catch|child|collation|comment|constraint|construction|contains|context|continue|copy|copy-namespaces|count|decimal-format|decimal-separator|declare|default|delete|descendant|descendant-or-self|descending|digit|div|document|document-node|element|else|empty|empty-sequence|encoding|end|eq|every|except|exit|external|false|first|following|following-sibling|for|from|ft-option|function|ge|greatest|group|grouping-separator|gt|idiv|if|import|in|index|infinity|insert|instance|integrity|intersect|into|is|item|json|json-item|jsoniq|last|lax|le|least|let|loop|lt|minus-sign|mod|modify|module|namespace|namespace-node|ne|next|node|nodes|not|null|object|of|only|option|or|order|ordered|ordering|paragraphs|parent|pattern-separator|per-mille|percent|preceding|preceding-sibling|previous|processing-instruction|rename|replace|return|returning|revalidation|satisfies|schema|schema-attribute|schema-element|score|select|self|sentences|sliding|some|stable|start|strict|switch|text|then|times|to|treat|true|try|tumbling|type|typeswitch|union|unordered|updating|validate|value|variable|version|when|where|while|window|with|words|xquery|zero-digit".split("|"); var keywords = keys.map( function(val) { return { name: "'" + val + "'", token: "keyword" }; } ); var ncnames = keys.map( function(val) { return { name: "'" + val + "'", token: "text", next: function(stack){ stack.pop(); } }; } ); var cdata = "constant.language"; var number = "constant"; var xmlcomment = "comment"; var pi = "xml-pe"; var pragma = "constant.buildin"; var Rules = { start: [ { name: "'(#'", token: pragma, next: function(stack){ stack.push("Pragma"); } }, { name: "'(:'", token: "comment", next: function(stack){ stack.push("Comment"); } }, { name: "'(:~'", token: "comment.doc", next: function(stack){ stack.push("CommentDoc"); } }, { name: "''", token: xmlcomment, next: function(stack){ stack.pop(); } } ], CData: [ { name: "CDataSectionContents", token: cdata }, { name: "']]>'", token: cdata, next: function(stack){ stack.pop(); } } ], PI: [ { name: "DirPIContents", token: pi }, { name: "'?'", token: pi }, { name: "'?>'", token: pi, next: function(stack){ stack.pop(); } } ], AposString: [ { name: "''''", token: "string", next: function(stack){ stack.pop(); } }, { name: "PredefinedEntityRef", token: "constant.language.escape" }, { name: "CharRef", token: "constant.language.escape" }, { name: "EscapeApos", token: "constant.language.escape" }, { name: "AposChar", token: "string" } ], QuotString: [ { name: "'\"'", token: "string", next: function(stack){ stack.pop(); } }, { name: "PredefinedEntityRef", token: "constant.language.escape" }, { name: "CharRef", token: "constant.language.escape" }, { name: "EscapeQuot", token: "constant.language.escape" }, { name: "QuotChar", token: "string" } ] }; exports.JSONiqLexer = function() { this.tokens = []; this.getLineTokens = function(line, state, row) { state = (state === "start" || !state) ? '["start"]' : state; var stack = JSON.parse(state); var h = new TokenHandler(line); var tokenizer = new JSONiqTokenizer(line, h); var tokens = []; while(true) { var currentState = stack[stack.length - 1]; try { h.tokens = []; tokenizer["parse_" + currentState](); var info = null; if(h.tokens.length > 1 && h.tokens[0].name === "WS") { tokens.push({ type: "text", value: h.tokens[0].value }); h.tokens.splice(0, 1); } var token = h.tokens[0]; var rules = Rules[currentState]; for(var k = 0; k < rules.length; k++) { var rule = Rules[currentState][k]; if((typeof(rule.name) === "function" && rule.name(token)) || rule.name === token.name) { info = rule; break; } } if(token.name === "EOF") { break; } if(token.value === "") { throw "Encountered empty string lexical rule."; } tokens.push({ type: info === null ? "text" : (typeof(info.token) === "function" ? info.token(token.value) : info.token), value: token.value }); if(info && info.next) { info.next(stack); } } catch(e) { if(e instanceof tokenizer.ParseException) { var index = 0; for(var i=0; i < tokens.length; i++) { index += tokens[i].value.length; } tokens.push({ type: "text", value: line.substring(index) }); return { tokens: tokens, state: JSON.stringify(["start"]) }; } else { throw e; } } } if(this.tokens[row] !== undefined) { var cachedLine = this.lines[row]; var begin = sharedStart([line, cachedLine]); var diff = cachedLine.length - line.length; var idx = 0; var col = 0; for(var i = 0; i < tokens.length; i++) { var token = tokens[i]; for(var j = 0; j < this.tokens[row].length; j++) { var semanticToken = this.tokens[row][j]; if( ((col + token.value.length) <= begin.length && semanticToken.sc === col && semanticToken.ec === (col + token.value.length)) || (semanticToken.sc === (col + diff) && semanticToken.ec === (col + token.value.length + diff)) ) { idx = i; tokens[i].type = semanticToken.type; } } col += token.value.length; } } return { tokens: tokens, state: JSON.stringify(stack) }; }; function sharedStart(A) { var tem1, tem2, s, A = A.slice(0).sort(); tem1 = A[0]; s = tem1.length; tem2 = A.pop(); while(s && tem2.indexOf(tem1) == -1) { tem1 = tem1.substring(0, --s); } return tem1; } }; }); define('ace/mode/xquery/JSONiqTokenizer', ['require', 'exports', 'module' ], function(require, exports, module) { var JSONiqTokenizer = exports.JSONiqTokenizer = function JSONiqTokenizer(string, parsingEventHandler) { init(string, parsingEventHandler); var self = this; this.ParseException = function(b, e, s, o, x) { var begin = b, end = e, state = s, offending = o, expected = x; this.getBegin = function() {return begin;}; this.getEnd = function() {return end;}; this.getState = function() {return state;}; this.getExpected = function() {return expected;}; this.getOffending = function() {return offending;}; this.getMessage = function() { return offending < 0 ? "lexical analysis failed" : "syntax error"; }; }; function init(string, parsingEventHandler) { eventHandler = parsingEventHandler; input = string; size = string.length; reset(0, 0, 0); } this.getInput = function() { return input; }; function reset(l, b, e) { b0 = b; e0 = b; l1 = l; b1 = b; e1 = e; end = e; eventHandler.reset(input); } this.getOffendingToken = function(e) { var o = e.getOffending(); return o >= 0 ? JSONiqTokenizer.TOKEN[o] : null; }; this.getExpectedTokenSet = function(e) { var expected; if (e.getExpected() < 0) { expected = JSONiqTokenizer.getTokenSet(- e.getState()); } else { expected = [JSONiqTokenizer.TOKEN[e.getExpected()]]; } return expected; }; this.getErrorMessage = function(e) { var tokenSet = this.getExpectedTokenSet(e); var found = this.getOffendingToken(e); var prefix = input.substring(0, e.getBegin()); var lines = prefix.split("\n"); var line = lines.length; var column = lines[line - 1].length + 1; var size = e.getEnd() - e.getBegin(); return e.getMessage() + (found == null ? "" : ", found " + found) + "\nwhile expecting " + (tokenSet.length == 1 ? tokenSet[0] : ("[" + tokenSet.join(", ") + "]")) + "\n" + (size == 0 || found != null ? "" : "after successfully scanning " + size + " characters beginning ") + "at line " + line + ", column " + column + ":\n..." + input.substring(e.getBegin(), Math.min(input.length, e.getBegin() + 64)) + "..."; }; this.parse_start = function() { eventHandler.startNonterminal("start", e0); lookahead1W(14); // ModuleDecl | Annotation | OptionDecl | Operator | Variable | Tag | AttrTest | switch (l1) { case 55: // '' | '=' | '>' switch (l1) { case 58: // '>' shift(58); // '>' break; case 50: // '/>' shift(50); // '/>' break; case 27: // QName shift(27); // QName break; case 57: // '=' shift(57); // '=' break; case 35: // '"' shift(35); // '"' break; case 38: // "'" shift(38); // "'" break; default: shift(33); // EOF } eventHandler.endNonterminal("StartTag", e0); }; this.parse_TagContent = function() { eventHandler.startNonterminal("TagContent", e0); lookahead1(11); // Tag | EndTag | PredefinedEntityRef | ElementContentChar | CharRef | EOF | switch (l1) { case 23: // ElementContentChar shift(23); // ElementContentChar break; case 6: // Tag shift(6); // Tag break; case 7: // EndTag shift(7); // EndTag break; case 55: // '' switch (l1) { case 11: // CDataSectionContents shift(11); // CDataSectionContents break; case 64: // ']]>' shift(64); // ']]>' break; default: shift(33); // EOF } eventHandler.endNonterminal("CData", e0); }; this.parse_XMLComment = function() { eventHandler.startNonterminal("XMLComment", e0); lookahead1(0); // DirCommentContents | EOF | '-->' switch (l1) { case 9: // DirCommentContents shift(9); // DirCommentContents break; case 47: // '-->' shift(47); // '-->' break; default: shift(33); // EOF } eventHandler.endNonterminal("XMLComment", e0); }; this.parse_PI = function() { eventHandler.startNonterminal("PI", e0); lookahead1(3); // DirPIContents | EOF | '?' | '?>' switch (l1) { case 10: // DirPIContents shift(10); // DirPIContents break; case 59: // '?' shift(59); // '?' break; case 60: // '?>' shift(60); // '?>' break; default: shift(33); // EOF } eventHandler.endNonterminal("PI", e0); }; this.parse_Pragma = function() { eventHandler.startNonterminal("Pragma", e0); lookahead1(2); // PragmaContents | EOF | '#' | '#)' switch (l1) { case 8: // PragmaContents shift(8); // PragmaContents break; case 36: // '#' shift(36); // '#' break; case 37: // '#)' shift(37); // '#)' break; default: shift(33); // EOF } eventHandler.endNonterminal("Pragma", e0); }; this.parse_Comment = function() { eventHandler.startNonterminal("Comment", e0); lookahead1(4); // CommentContents | EOF | '(:' | ':)' switch (l1) { case 52: // ':)' shift(52); // ':)' break; case 41: // '(:' shift(41); // '(:' break; case 30: // CommentContents shift(30); // CommentContents break; default: shift(33); // EOF } eventHandler.endNonterminal("Comment", e0); }; this.parse_CommentDoc = function() { eventHandler.startNonterminal("CommentDoc", e0); lookahead1(5); // DocTag | DocCommentContents | EOF | '(:' | ':)' switch (l1) { case 31: // DocTag shift(31); // DocTag break; case 32: // DocCommentContents shift(32); // DocCommentContents break; case 52: // ':)' shift(52); // ':)' break; case 41: // '(:' shift(41); // '(:' break; default: shift(33); // EOF } eventHandler.endNonterminal("CommentDoc", e0); }; this.parse_QuotString = function() { eventHandler.startNonterminal("QuotString", e0); lookahead1(6); // PredefinedEntityRef | EscapeQuot | QuotChar | CharRef | EOF | '"' switch (l1) { case 18: // PredefinedEntityRef shift(18); // PredefinedEntityRef break; case 29: // CharRef shift(29); // CharRef break; case 19: // EscapeQuot shift(19); // EscapeQuot break; case 21: // QuotChar shift(21); // QuotChar break; case 35: // '"' shift(35); // '"' break; default: shift(33); // EOF } eventHandler.endNonterminal("QuotString", e0); }; this.parse_AposString = function() { eventHandler.startNonterminal("AposString", e0); lookahead1(7); // PredefinedEntityRef | EscapeApos | AposChar | CharRef | EOF | "'" switch (l1) { case 18: // PredefinedEntityRef shift(18); // PredefinedEntityRef break; case 29: // CharRef shift(29); // CharRef break; case 20: // EscapeApos shift(20); // EscapeApos break; case 22: // AposChar shift(22); // AposChar break; case 38: // "'" shift(38); // "'" break; default: shift(33); // EOF } eventHandler.endNonterminal("AposString", e0); }; this.parse_Prefix = function() { eventHandler.startNonterminal("Prefix", e0); lookahead1W(13); // NCName^Token | S^WS | 'after' | 'allowing' | 'ancestor' | 'ancestor-or-self' | whitespace(); parse_NCName(); eventHandler.endNonterminal("Prefix", e0); }; this.parse__EQName = function() { eventHandler.startNonterminal("_EQName", e0); lookahead1W(12); // EQName^Token | S^WS | 'after' | 'allowing' | 'ancestor' | 'ancestor-or-self' | whitespace(); parse_EQName(); eventHandler.endNonterminal("_EQName", e0); }; function parse_EQName() { eventHandler.startNonterminal("EQName", e0); switch (l1) { case 77: // 'attribute' shift(77); // 'attribute' break; case 91: // 'comment' shift(91); // 'comment' break; case 115: // 'document-node' shift(115); // 'document-node' break; case 116: // 'element' shift(116); // 'element' break; case 119: // 'empty-sequence' shift(119); // 'empty-sequence' break; case 140: // 'function' shift(140); // 'function' break; case 147: // 'if' shift(147); // 'if' break; case 160: // 'item' shift(160); // 'item' break; case 180: // 'namespace-node' shift(180); // 'namespace-node' break; case 186: // 'node' shift(186); // 'node' break; case 211: // 'processing-instruction' shift(211); // 'processing-instruction' break; case 221: // 'schema-attribute' shift(221); // 'schema-attribute' break; case 222: // 'schema-element' shift(222); // 'schema-element' break; case 238: // 'switch' shift(238); // 'switch' break; case 239: // 'text' shift(239); // 'text' break; case 248: // 'typeswitch' shift(248); // 'typeswitch' break; default: parse_FunctionName(); } eventHandler.endNonterminal("EQName", e0); } function parse_FunctionName() { eventHandler.startNonterminal("FunctionName", e0); switch (l1) { case 14: // EQName^Token shift(14); // EQName^Token break; case 65: // 'after' shift(65); // 'after' break; case 68: // 'ancestor' shift(68); // 'ancestor' break; case 69: // 'ancestor-or-self' shift(69); // 'ancestor-or-self' break; case 70: // 'and' shift(70); // 'and' break; case 74: // 'as' shift(74); // 'as' break; case 75: // 'ascending' shift(75); // 'ascending' break; case 79: // 'before' shift(79); // 'before' break; case 83: // 'case' shift(83); // 'case' break; case 84: // 'cast' shift(84); // 'cast' break; case 85: // 'castable' shift(85); // 'castable' break; case 88: // 'child' shift(88); // 'child' break; case 89: // 'collation' shift(89); // 'collation' break; case 98: // 'copy' shift(98); // 'copy' break; case 100: // 'count' shift(100); // 'count' break; case 103: // 'declare' shift(103); // 'declare' break; case 104: // 'default' shift(104); // 'default' break; case 105: // 'delete' shift(105); // 'delete' break; case 106: // 'descendant' shift(106); // 'descendant' break; case 107: // 'descendant-or-self' shift(107); // 'descendant-or-self' break; case 108: // 'descending' shift(108); // 'descending' break; case 113: // 'div' shift(113); // 'div' break; case 114: // 'document' shift(114); // 'document' break; case 117: // 'else' shift(117); // 'else' break; case 118: // 'empty' shift(118); // 'empty' break; case 121: // 'end' shift(121); // 'end' break; case 123: // 'eq' shift(123); // 'eq' break; case 124: // 'every' shift(124); // 'every' break; case 126: // 'except' shift(126); // 'except' break; case 129: // 'first' shift(129); // 'first' break; case 130: // 'following' shift(130); // 'following' break; case 131: // 'following-sibling' shift(131); // 'following-sibling' break; case 132: // 'for' shift(132); // 'for' break; case 141: // 'ge' shift(141); // 'ge' break; case 143: // 'group' shift(143); // 'group' break; case 145: // 'gt' shift(145); // 'gt' break; case 146: // 'idiv' shift(146); // 'idiv' break; case 148: // 'import' shift(148); // 'import' break; case 154: // 'insert' shift(154); // 'insert' break; case 155: // 'instance' shift(155); // 'instance' break; case 157: // 'intersect' shift(157); // 'intersect' break; case 158: // 'into' shift(158); // 'into' break; case 159: // 'is' shift(159); // 'is' break; case 165: // 'last' shift(165); // 'last' break; case 167: // 'le' shift(167); // 'le' break; case 169: // 'let' shift(169); // 'let' break; case 173: // 'lt' shift(173); // 'lt' break; case 175: // 'mod' shift(175); // 'mod' break; case 176: // 'modify' shift(176); // 'modify' break; case 177: // 'module' shift(177); // 'module' break; case 179: // 'namespace' shift(179); // 'namespace' break; case 181: // 'ne' shift(181); // 'ne' break; case 193: // 'only' shift(193); // 'only' break; case 195: // 'or' shift(195); // 'or' break; case 196: // 'order' shift(196); // 'order' break; case 197: // 'ordered' shift(197); // 'ordered' break; case 201: // 'parent' shift(201); // 'parent' break; case 207: // 'preceding' shift(207); // 'preceding' break; case 208: // 'preceding-sibling' shift(208); // 'preceding-sibling' break; case 213: // 'rename' shift(213); // 'rename' break; case 214: // 'replace' shift(214); // 'replace' break; case 215: // 'return' shift(215); // 'return' break; case 219: // 'satisfies' shift(219); // 'satisfies' break; case 224: // 'self' shift(224); // 'self' break; case 230: // 'some' shift(230); // 'some' break; case 231: // 'stable' shift(231); // 'stable' break; case 232: // 'start' shift(232); // 'start' break; case 243: // 'to' shift(243); // 'to' break; case 244: // 'treat' shift(244); // 'treat' break; case 245: // 'try' shift(245); // 'try' break; case 249: // 'union' shift(249); // 'union' break; case 251: // 'unordered' shift(251); // 'unordered' break; case 255: // 'validate' shift(255); // 'validate' break; case 261: // 'where' shift(261); // 'where' break; case 265: // 'with' shift(265); // 'with' break; case 269: // 'xquery' shift(269); // 'xquery' break; case 67: // 'allowing' shift(67); // 'allowing' break; case 76: // 'at' shift(76); // 'at' break; case 78: // 'base-uri' shift(78); // 'base-uri' break; case 80: // 'boundary-space' shift(80); // 'boundary-space' break; case 81: // 'break' shift(81); // 'break' break; case 86: // 'catch' shift(86); // 'catch' break; case 93: // 'construction' shift(93); // 'construction' break; case 96: // 'context' shift(96); // 'context' break; case 97: // 'continue' shift(97); // 'continue' break; case 99: // 'copy-namespaces' shift(99); // 'copy-namespaces' break; case 101: // 'decimal-format' shift(101); // 'decimal-format' break; case 120: // 'encoding' shift(120); // 'encoding' break; case 127: // 'exit' shift(127); // 'exit' break; case 128: // 'external' shift(128); // 'external' break; case 136: // 'ft-option' shift(136); // 'ft-option' break; case 149: // 'in' shift(149); // 'in' break; case 150: // 'index' shift(150); // 'index' break; case 156: // 'integrity' shift(156); // 'integrity' break; case 166: // 'lax' shift(166); // 'lax' break; case 187: // 'nodes' shift(187); // 'nodes' break; case 194: // 'option' shift(194); // 'option' break; case 198: // 'ordering' shift(198); // 'ordering' break; case 217: // 'revalidation' shift(217); // 'revalidation' break; case 220: // 'schema' shift(220); // 'schema' break; case 223: // 'score' shift(223); // 'score' break; case 229: // 'sliding' shift(229); // 'sliding' break; case 235: // 'strict' shift(235); // 'strict' break; case 246: // 'tumbling' shift(246); // 'tumbling' break; case 247: // 'type' shift(247); // 'type' break; case 252: // 'updating' shift(252); // 'updating' break; case 256: // 'value' shift(256); // 'value' break; case 257: // 'variable' shift(257); // 'variable' break; case 258: // 'version' shift(258); // 'version' break; case 262: // 'while' shift(262); // 'while' break; case 92: // 'constraint' shift(92); // 'constraint' break; case 171: // 'loop' shift(171); // 'loop' break; default: shift(216); // 'returning' } eventHandler.endNonterminal("FunctionName", e0); } function parse_NCName() { eventHandler.startNonterminal("NCName", e0); switch (l1) { case 26: // NCName^Token shift(26); // NCName^Token break; case 65: // 'after' shift(65); // 'after' break; case 70: // 'and' shift(70); // 'and' break; case 74: // 'as' shift(74); // 'as' break; case 75: // 'ascending' shift(75); // 'ascending' break; case 79: // 'before' shift(79); // 'before' break; case 83: // 'case' shift(83); // 'case' break; case 84: // 'cast' shift(84); // 'cast' break; case 85: // 'castable' shift(85); // 'castable' break; case 89: // 'collation' shift(89); // 'collation' break; case 100: // 'count' shift(100); // 'count' break; case 104: // 'default' shift(104); // 'default' break; case 108: // 'descending' shift(108); // 'descending' break; case 113: // 'div' shift(113); // 'div' break; case 117: // 'else' shift(117); // 'else' break; case 118: // 'empty' shift(118); // 'empty' break; case 121: // 'end' shift(121); // 'end' break; case 123: // 'eq' shift(123); // 'eq' break; case 126: // 'except' shift(126); // 'except' break; case 132: // 'for' shift(132); // 'for' break; case 141: // 'ge' shift(141); // 'ge' break; case 143: // 'group' shift(143); // 'group' break; case 145: // 'gt' shift(145); // 'gt' break; case 146: // 'idiv' shift(146); // 'idiv' break; case 155: // 'instance' shift(155); // 'instance' break; case 157: // 'intersect' shift(157); // 'intersect' break; case 158: // 'into' shift(158); // 'into' break; case 159: // 'is' shift(159); // 'is' break; case 167: // 'le' shift(167); // 'le' break; case 169: // 'let' shift(169); // 'let' break; case 173: // 'lt' shift(173); // 'lt' break; case 175: // 'mod' shift(175); // 'mod' break; case 176: // 'modify' shift(176); // 'modify' break; case 181: // 'ne' shift(181); // 'ne' break; case 193: // 'only' shift(193); // 'only' break; case 195: // 'or' shift(195); // 'or' break; case 196: // 'order' shift(196); // 'order' break; case 215: // 'return' shift(215); // 'return' break; case 219: // 'satisfies' shift(219); // 'satisfies' break; case 231: // 'stable' shift(231); // 'stable' break; case 232: // 'start' shift(232); // 'start' break; case 243: // 'to' shift(243); // 'to' break; case 244: // 'treat' shift(244); // 'treat' break; case 249: // 'union' shift(249); // 'union' break; case 261: // 'where' shift(261); // 'where' break; case 265: // 'with' shift(265); // 'with' break; case 68: // 'ancestor' shift(68); // 'ancestor' break; case 69: // 'ancestor-or-self' shift(69); // 'ancestor-or-self' break; case 77: // 'attribute' shift(77); // 'attribute' break; case 88: // 'child' shift(88); // 'child' break; case 91: // 'comment' shift(91); // 'comment' break; case 98: // 'copy' shift(98); // 'copy' break; case 103: // 'declare' shift(103); // 'declare' break; case 105: // 'delete' shift(105); // 'delete' break; case 106: // 'descendant' shift(106); // 'descendant' break; case 107: // 'descendant-or-self' shift(107); // 'descendant-or-self' break; case 114: // 'document' shift(114); // 'document' break; case 115: // 'document-node' shift(115); // 'document-node' break; case 116: // 'element' shift(116); // 'element' break; case 119: // 'empty-sequence' shift(119); // 'empty-sequence' break; case 124: // 'every' shift(124); // 'every' break; case 129: // 'first' shift(129); // 'first' break; case 130: // 'following' shift(130); // 'following' break; case 131: // 'following-sibling' shift(131); // 'following-sibling' break; case 140: // 'function' shift(140); // 'function' break; case 147: // 'if' shift(147); // 'if' break; case 148: // 'import' shift(148); // 'import' break; case 154: // 'insert' shift(154); // 'insert' break; case 160: // 'item' shift(160); // 'item' break; case 165: // 'last' shift(165); // 'last' break; case 177: // 'module' shift(177); // 'module' break; case 179: // 'namespace' shift(179); // 'namespace' break; case 180: // 'namespace-node' shift(180); // 'namespace-node' break; case 186: // 'node' shift(186); // 'node' break; case 197: // 'ordered' shift(197); // 'ordered' break; case 201: // 'parent' shift(201); // 'parent' break; case 207: // 'preceding' shift(207); // 'preceding' break; case 208: // 'preceding-sibling' shift(208); // 'preceding-sibling' break; case 211: // 'processing-instruction' shift(211); // 'processing-instruction' break; case 213: // 'rename' shift(213); // 'rename' break; case 214: // 'replace' shift(214); // 'replace' break; case 221: // 'schema-attribute' shift(221); // 'schema-attribute' break; case 222: // 'schema-element' shift(222); // 'schema-element' break; case 224: // 'self' shift(224); // 'self' break; case 230: // 'some' shift(230); // 'some' break; case 238: // 'switch' shift(238); // 'switch' break; case 239: // 'text' shift(239); // 'text' break; case 245: // 'try' shift(245); // 'try' break; case 248: // 'typeswitch' shift(248); // 'typeswitch' break; case 251: // 'unordered' shift(251); // 'unordered' break; case 255: // 'validate' shift(255); // 'validate' break; case 257: // 'variable' shift(257); // 'variable' break; case 269: // 'xquery' shift(269); // 'xquery' break; case 67: // 'allowing' shift(67); // 'allowing' break; case 76: // 'at' shift(76); // 'at' break; case 78: // 'base-uri' shift(78); // 'base-uri' break; case 80: // 'boundary-space' shift(80); // 'boundary-space' break; case 81: // 'break' shift(81); // 'break' break; case 86: // 'catch' shift(86); // 'catch' break; case 93: // 'construction' shift(93); // 'construction' break; case 96: // 'context' shift(96); // 'context' break; case 97: // 'continue' shift(97); // 'continue' break; case 99: // 'copy-namespaces' shift(99); // 'copy-namespaces' break; case 101: // 'decimal-format' shift(101); // 'decimal-format' break; case 120: // 'encoding' shift(120); // 'encoding' break; case 127: // 'exit' shift(127); // 'exit' break; case 128: // 'external' shift(128); // 'external' break; case 136: // 'ft-option' shift(136); // 'ft-option' break; case 149: // 'in' shift(149); // 'in' break; case 150: // 'index' shift(150); // 'index' break; case 156: // 'integrity' shift(156); // 'integrity' break; case 166: // 'lax' shift(166); // 'lax' break; case 187: // 'nodes' shift(187); // 'nodes' break; case 194: // 'option' shift(194); // 'option' break; case 198: // 'ordering' shift(198); // 'ordering' break; case 217: // 'revalidation' shift(217); // 'revalidation' break; case 220: // 'schema' shift(220); // 'schema' break; case 223: // 'score' shift(223); // 'score' break; case 229: // 'sliding' shift(229); // 'sliding' break; case 235: // 'strict' shift(235); // 'strict' break; case 246: // 'tumbling' shift(246); // 'tumbling' break; case 247: // 'type' shift(247); // 'type' break; case 252: // 'updating' shift(252); // 'updating' break; case 256: // 'value' shift(256); // 'value' break; case 258: // 'version' shift(258); // 'version' break; case 262: // 'while' shift(262); // 'while' break; case 92: // 'constraint' shift(92); // 'constraint' break; case 171: // 'loop' shift(171); // 'loop' break; default: shift(216); // 'returning' } eventHandler.endNonterminal("NCName", e0); } function shift(t) { if (l1 == t) { whitespace(); eventHandler.terminal(JSONiqTokenizer.TOKEN[l1], b1, e1 > size ? size : e1); b0 = b1; e0 = e1; l1 = 0; } else { error(b1, e1, 0, l1, t); } } function whitespace() { if (e0 != b1) { b0 = e0; e0 = b1; eventHandler.whitespace(b0, e0); } } function matchW(set) { var code; for (;;) { code = match(set); if (code != 28) // S^WS { break; } } return code; } function lookahead1W(set) { if (l1 == 0) { l1 = matchW(set); b1 = begin; e1 = end; } } function lookahead1(set) { if (l1 == 0) { l1 = match(set); b1 = begin; e1 = end; } } function error(b, e, s, l, t) { throw new self.ParseException(b, e, s, l, t); } var lk, b0, e0; var l1, b1, e1; var eventHandler; var input; var size; var begin; var end; function match(tokenSetId) { var nonbmp = false; begin = end; var current = end; var result = JSONiqTokenizer.INITIAL[tokenSetId]; var state = 0; for (var code = result & 4095; code != 0; ) { var charclass; var c0 = current < size ? input.charCodeAt(current) : 0; ++current; if (c0 < 0x80) { charclass = JSONiqTokenizer.MAP0[c0]; } else if (c0 < 0xd800) { var c1 = c0 >> 4; charclass = JSONiqTokenizer.MAP1[(c0 & 15) + JSONiqTokenizer.MAP1[(c1 & 31) + JSONiqTokenizer.MAP1[c1 >> 5]]]; } else { if (c0 < 0xdc00) { var c1 = current < size ? input.charCodeAt(current) : 0; if (c1 >= 0xdc00 && c1 < 0xe000) { ++current; c0 = ((c0 & 0x3ff) << 10) + (c1 & 0x3ff) + 0x10000; nonbmp = true; } } var lo = 0, hi = 5; for (var m = 3; ; m = (hi + lo) >> 1) { if (JSONiqTokenizer.MAP2[m] > c0) hi = m - 1; else if (JSONiqTokenizer.MAP2[6 + m] < c0) lo = m + 1; else {charclass = JSONiqTokenizer.MAP2[12 + m]; break;} if (lo > hi) {charclass = 0; break;} } } state = code; var i0 = (charclass << 12) + code - 1; code = JSONiqTokenizer.TRANSITION[(i0 & 15) + JSONiqTokenizer.TRANSITION[i0 >> 4]]; if (code > 4095) { result = code; code &= 4095; end = current; } } result >>= 12; if (result == 0) { end = current - 1; var c1 = end < size ? input.charCodeAt(end) : 0; if (c1 >= 0xdc00 && c1 < 0xe000) --end; return error(begin, end, state, -1, -1); } if (nonbmp) { for (var i = result >> 9; i > 0; --i) { --end; var c1 = end < size ? input.charCodeAt(end) : 0; if (c1 >= 0xdc00 && c1 < 0xe000) --end; } } else { end -= result >> 9; } return (result & 511) - 1; } } JSONiqTokenizer.getTokenSet = function(tokenSetId) { var set = []; var s = tokenSetId < 0 ? - tokenSetId : INITIAL[tokenSetId] & 4095; for (var i = 0; i < 276; i += 32) { var j = i; var i0 = (i >> 5) * 2062 + s - 1; var i1 = i0 >> 2; var i2 = i1 >> 2; var f = JSONiqTokenizer.EXPECTED[(i0 & 3) + JSONiqTokenizer.EXPECTED[(i1 & 3) + JSONiqTokenizer.EXPECTED[(i2 & 3) + JSONiqTokenizer.EXPECTED[i2 >> 2]]]]; for ( ; f != 0; f >>>= 1, ++j) { if ((f & 1) != 0) { set.push(JSONiqTokenizer.TOKEN[j]); } } } return set; }; JSONiqTokenizer.MAP0 = [ 66, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 27, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 32, 31, 31, 33, 31, 31, 31, 31, 31, 31, 34, 35, 36, 35, 31, 35, 37, 38, 39, 40, 41, 42, 43, 44, 45, 31, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 31, 61, 62, 63, 64, 35 ]; JSONiqTokenizer.MAP1 = [ 108, 124, 214, 214, 214, 214, 214, 214, 214, 214, 214, 214, 214, 214, 214, 214, 156, 181, 181, 181, 181, 181, 214, 215, 213, 214, 214, 214, 214, 214, 214, 214, 214, 214, 214, 214, 214, 214, 214, 214, 214, 214, 214, 214, 214, 214, 214, 214, 214, 214, 214, 214, 214, 214, 214, 214, 214, 214, 214, 214, 214, 214, 214, 214, 214, 214, 214, 214, 214, 214, 214, 214, 214, 214, 214, 214, 214, 214, 214, 214, 214, 214, 214, 214, 214, 214, 214, 214, 214, 214, 214, 214, 214, 214, 214, 214, 214, 214, 214, 214, 214, 214, 214, 214, 214, 214, 214, 214, 247, 261, 277, 293, 309, 347, 363, 379, 416, 416, 416, 408, 331, 323, 331, 323, 331, 331, 331, 331, 331, 331, 331, 331, 331, 331, 331, 331, 331, 331, 331, 331, 433, 433, 433, 433, 433, 433, 433, 316, 331, 331, 331, 331, 331, 331, 331, 331, 394, 416, 416, 417, 415, 416, 416, 331, 331, 331, 331, 331, 331, 331, 331, 331, 331, 331, 331, 331, 331, 331, 331, 331, 331, 416, 416, 416, 416, 416, 416, 416, 416, 416, 416, 416, 416, 416, 416, 416, 416, 416, 416, 416, 416, 416, 416, 416, 416, 416, 416, 416, 416, 416, 416, 416, 416, 330, 331, 331, 331, 331, 331, 331, 331, 331, 331, 331, 331, 331, 331, 331, 331, 331, 331, 331, 331, 331, 331, 331, 331, 331, 331, 331, 331, 331, 331, 331, 331, 331, 416, 66, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 27, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 35, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 32, 31, 31, 33, 31, 31, 31, 31, 31, 31, 34, 35, 36, 35, 31, 35, 37, 38, 39, 40, 41, 42, 43, 44, 45, 31, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 31, 61, 62, 63, 64, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 31, 31, 35, 35, 35, 35, 35, 35, 35, 65, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65 ]; JSONiqTokenizer.MAP2 = [ 57344, 63744, 64976, 65008, 65536, 983040, 63743, 64975, 65007, 65533, 983039, 1114111, 35, 31, 35, 31, 31, 35 ]; JSONiqTokenizer.INITIAL = [ 1, 2, 36867, 45060, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15 ]; JSONiqTokenizer.TRANSITION = [ 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 22874, 18847, 17152, 19027, 19252, 17687, 19027, 17173, 30771, 36436, 17330, 17349, 18940, 17189, 17208, 17281, 17675, 17991, 17308, 17327, 17346, 18937, 17365, 21855, 18660, 18676, 19025, 17265, 22008, 17292, 17421, 21157, 17192, 21217, 21848, 17311, 18669, 19018, 19027, 17447, 17470, 17497, 17520, 17251, 36410, 17824, 20322, 20663, 20490, 17543, 17559, 17585, 21862, 17504, 17527, 17258, 36417, 18199, 21915, 17611, 36466, 18259, 17633, 17661, 18368, 17703, 17730, 17772, 33538, 21921, 17617, 36472, 18265, 36530, 17477, 19171, 17902, 17934, 17744, 17795, 17874, 17590, 21595, 17481, 17890, 17922, 18742, 17960, 36550, 17714, 17976, 18021, 18738, 18065, 36544, 18632, 18081, 18098, 18114, 18159, 18185, 18215, 18094, 18251, 18292, 18281, 18308, 18005, 18338, 18354, 18384, 17849, 36402, 19251, 17838, 17163, 30650, 18400, 17858, 32918, 17756, 18816, 18429, 18445, 18143, 17393, 18500, 18516, 18546, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 18590, 21686, 17152, 19027, 19252, 17687, 19027, 28677, 30771, 36436, 17330, 17349, 18940, 17189, 17208, 17281, 17675, 17991, 17308, 17327, 17346, 18937, 17365, 21855, 18660, 18676, 19025, 17265, 22008, 17292, 17421, 21157, 17192, 21217, 21848, 17311, 18669, 19018, 19027, 17447, 17470, 17497, 17520, 17251, 36410, 17824, 20322, 20663, 20490, 17543, 17559, 17585, 21862, 17504, 17527, 17258, 36417, 18199, 21915, 17611, 36466, 18259, 17633, 17661, 18368, 17703, 17730, 17772, 33538, 21921, 17617, 36472, 18265, 36530, 17477, 19171, 17902, 17934, 17744, 17795, 17874, 17590, 21595, 17481, 17890, 17922, 18742, 17960, 36550, 17714, 17976, 18021, 18738, 18065, 36544, 18632, 18081, 18098, 18114, 18159, 18185, 18215, 18094, 18251, 18292, 18281, 18308, 18005, 18338, 18354, 18384, 17849, 36402, 19251, 17838, 17163, 30650, 18400, 17858, 32918, 17756, 18816, 18429, 18445, 18143, 17393, 18500, 18516, 18546, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 20083, 18847, 18648, 19027, 19252, 21242, 19027, 17173, 30771, 36436, 17330, 17349, 18940, 17189, 17208, 17281, 17675, 17991, 17308, 17327, 17346, 18937, 18460, 21855, 18660, 18676, 19025, 17265, 22008, 17292, 17421, 21157, 17192, 21217, 21848, 17311, 18669, 19018, 19027, 17447, 32909, 17497, 17520, 17251, 36410, 17824, 20322, 20663, 20490, 17543, 17559, 17585, 21862, 17504, 17527, 17258, 36417, 21890, 21915, 17611, 36466, 18259, 17633, 17661, 18368, 17703, 17730, 17772, 33538, 21921, 17617, 36472, 18265, 36530, 17477, 19171, 17902, 17934, 17744, 17795, 17874, 17590, 21595, 17481, 19175, 17906, 18742, 17960, 36550, 17714, 17976, 18021, 18738, 18692, 18413, 18632, 18081, 18098, 18114, 18159, 18185, 18717, 18094, 18251, 18292, 18281, 18308, 18005, 18338, 18354, 18384, 17849, 36402, 19251, 17838, 17163, 30650, 18400, 17858, 32918, 17645, 18816, 18429, 18445, 18530, 17393, 18758, 18516, 18546, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 18774, 18789, 18805, 19027, 19252, 17687, 19027, 17173, 30771, 36436, 17330, 17349, 18940, 17189, 17208, 17281, 17675, 17991, 17308, 17327, 17346, 18937, 18460, 21855, 18660, 18676, 19025, 17265, 22008, 17292, 17421, 21157, 17192, 21217, 21848, 17311, 18669, 19018, 19027, 17447, 32909, 17497, 17520, 17251, 36410, 17824, 20322, 20663, 20490, 17543, 17559, 17585, 21862, 17504, 17527, 17258, 36417, 21890, 21915, 17611, 36466, 18259, 17633, 17661, 18368, 17703, 17730, 17772, 33538, 21921, 17617, 36472, 18265, 36530, 17477, 19171, 17902, 17934, 17744, 17795, 17874, 17590, 21595, 17481, 19175, 17906, 18742, 17960, 36550, 17714, 17976, 18021, 18738, 18692, 18413, 18632, 18081, 18098, 18114, 18159, 18185, 18717, 18094, 18251, 18292, 18281, 18308, 18005, 18338, 18354, 18384, 17849, 36402, 19251, 17838, 17163, 30650, 18400, 17858, 32918, 17645, 18816, 18429, 18445, 18530, 17393, 18758, 18516, 18546, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 18832, 22889, 18925, 19027, 19252, 17569, 19027, 17173, 30771, 36436, 17330, 17349, 18940, 17189, 17208, 17281, 17675, 17991, 17308, 17327, 17346, 18937, 18956, 21855, 18660, 18676, 19025, 17265, 22008, 17292, 17421, 21157, 17192, 21217, 19073, 17311, 18669, 19018, 19027, 17447, 32909, 17497, 17520, 17251, 36410, 17824, 20322, 20663, 20490, 17543, 17559, 18972, 21862, 17504, 17527, 17258, 36417, 21890, 21915, 17611, 36466, 18259, 17633, 17661, 18368, 17703, 17730, 17772, 33538, 21921, 17617, 36472, 18265, 36530, 17477, 19171, 17902, 17934, 17744, 17795, 17874, 17590, 21595, 17481, 19175, 17906, 18742, 17960, 36550, 17714, 17976, 18021, 18738, 18692, 18413, 18632, 18081, 18098, 18114, 18159, 18185, 18717, 18094, 18251, 18292, 18281, 18308, 18005, 18338, 18354, 18384, 17849, 36402, 19251, 17838, 17163, 30650, 18400, 17858, 32918, 17645, 18816, 18429, 18445, 18530, 17393, 18758, 18516, 18546, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 21818, 18847, 19006, 19027, 19252, 17687, 19027, 17173, 30771, 36436, 17330, 17349, 18940, 17189, 17208, 17281, 17675, 17991, 17308, 17327, 17346, 18937, 18460, 21855, 18660, 18676, 19025, 17265, 22008, 17292, 17421, 21157, 17192, 21217, 21848, 17311, 18669, 19018, 19027, 17447, 32909, 17497, 17520, 17251, 36410, 17824, 20322, 20663, 20490, 17543, 17559, 17585, 21862, 17504, 17527, 17258, 36417, 21890, 21915, 17611, 36466, 18259, 17633, 17661, 18368, 17703, 17730, 17772, 33538, 21921, 17617, 36472, 18265, 36530, 17477, 19171, 17902, 17934, 17744, 17795, 17874, 17590, 21595, 17481, 19175, 17906, 18742, 17960, 36550, 17714, 17976, 18021, 18738, 18692, 18413, 18632, 18081, 18098, 18114, 18159, 18185, 18717, 18094, 18251, 18292, 18281, 18308, 18005, 18338, 18354, 18384, 17849, 36402, 19251, 17838, 17163, 30650, 18400, 17858, 32918, 17645, 18816, 18429, 18445, 18530, 17393, 18758, 18516, 18546, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 21671, 18847, 19006, 19027, 19252, 17687, 19027, 17173, 30771, 36436, 17330, 17349, 18940, 17189, 17208, 17281, 17675, 17991, 17308, 17327, 17346, 18937, 18460, 21855, 18660, 18676, 19025, 17265, 22008, 17292, 17421, 21157, 17192, 21217, 21848, 17311, 18669, 19018, 19027, 17447, 32909, 17497, 17520, 17251, 36410, 17824, 20322, 20663, 20490, 17543, 17559, 17585, 21862, 17504, 17527, 17258, 36417, 21890, 21915, 17611, 36466, 18259, 17633, 17661, 18368, 17703, 17730, 17772, 33538, 21921, 17617, 36472, 18265, 36530, 17477, 19171, 17902, 17934, 17744, 17795, 17874, 17590, 21595, 17481, 19175, 17906, 18742, 17960, 36550, 17714, 17976, 18021, 18738, 18692, 18413, 18632, 18081, 18098, 18114, 18159, 18185, 18717, 18094, 18251, 18292, 18281, 18308, 18005, 18338, 18354, 18384, 17849, 36402, 19251, 17838, 17163, 30650, 18400, 17858, 32918, 17645, 18816, 18429, 18445, 18530, 17393, 18758, 18516, 18546, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 22395, 20098, 18731, 19027, 19252, 17687, 19027, 17173, 23525, 36436, 17330, 17349, 18940, 17189, 17208, 17281, 17675, 18129, 17308, 17327, 17346, 18937, 18460, 21855, 18660, 18676, 19025, 17265, 22008, 17292, 17421, 21157, 17192, 20746, 19130, 17311, 18669, 19018, 19027, 17447, 32909, 17497, 17520, 17251, 36410, 17824, 20322, 20663, 20490, 17543, 17559, 17585, 21862, 17504, 17527, 17258, 36417, 21890, 21915, 17611, 36466, 18259, 17633, 17661, 18368, 17703, 17730, 17772, 33538, 21921, 17617, 36472, 18265, 36530, 17477, 19171, 17902, 17934, 17744, 17795, 17874, 17590, 21595, 17481, 19175, 17906, 18742, 17960, 36550, 17714, 17976, 18021, 18738, 18692, 18413, 18632, 18081, 18098, 18114, 18159, 18185, 18717, 18094, 18251, 18292, 18281, 18308, 18005, 18338, 18354, 18384, 17849, 36402, 19251, 17838, 17163, 30650, 18400, 17858, 32918, 17645, 18816, 18429, 18445, 18530, 17393, 18758, 18516, 18546, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 19043, 18847, 18620, 19027, 19252, 17687, 19027, 17173, 30771, 36436, 17330, 17349, 18940, 17189, 17208, 17281, 17675, 17991, 17308, 17327, 17346, 18937, 18460, 21855, 18660, 18676, 19025, 17265, 22008, 17292, 17421, 21157, 17192, 21217, 21848, 17311, 18669, 19018, 19027, 17447, 32909, 17497, 17520, 17251, 36410, 17824, 20322, 20663, 20490, 17543, 17559, 17585, 21862, 17504, 17527, 17258, 36417, 21890, 21915, 17611, 36466, 18259, 17633, 17661, 18368, 17703, 17730, 17772, 33538, 21921, 17617, 36472, 18265, 36530, 17477, 19171, 17902, 17934, 17744, 17795, 17874, 17590, 21595, 17481, 19175, 17906, 18742, 17960, 36550, 17714, 17976, 18021, 18738, 18692, 18413, 18632, 18081, 18098, 18114, 18159, 18185, 18717, 18094, 18251, 18292, 18281, 18308, 18005, 18338, 18354, 18384, 17849, 36402, 19251, 17838, 17163, 30650, 18400, 17858, 32918, 17645, 18816, 18429, 18445, 18530, 17393, 18758, 18516, 18546, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 19100, 22410, 19006, 19027, 19252, 17687, 19027, 19084, 30771, 36436, 17330, 17349, 18940, 17189, 17208, 17281, 17675, 17991, 17308, 17327, 17346, 18937, 18460, 21855, 18660, 18676, 19025, 17265, 22008, 17292, 17421, 21157, 17192, 21217, 21848, 17311, 18669, 19018, 19027, 17447, 32909, 17497, 17520, 17251, 36410, 17824, 20322, 20663, 20490, 17543, 17559, 17585, 21862, 17504, 17527, 17258, 36417, 21890, 21915, 17611, 36466, 18259, 17633, 17661, 18368, 17703, 17730, 17772, 33538, 21921, 17617, 36472, 18265, 36530, 17477, 19171, 17902, 17934, 17744, 17795, 17874, 17590, 21595, 17481, 19175, 17906, 18742, 17960, 36550, 17714, 17976, 18021, 18738, 18692, 18413, 18632, 18081, 18098, 18114, 18159, 18185, 18717, 18094, 18251, 18292, 18281, 18308, 18005, 18338, 18354, 18384, 17849, 36402, 19251, 17838, 17163, 30650, 18400, 17858, 32918, 17645, 18816, 18429, 18445, 18530, 17393, 18758, 18516, 18546, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 21967, 21982, 19006, 19027, 19252, 17687, 19027, 18701, 30771, 36436, 17330, 17349, 18940, 17189, 17208, 17281, 17675, 17991, 17308, 17327, 17346, 18937, 18460, 21855, 18660, 18676, 19025, 17265, 22008, 17292, 17421, 21157, 17192, 21217, 21848, 17311, 18669, 19018, 19027, 17447, 32909, 17497, 17520, 17251, 36410, 17824, 20322, 20663, 20490, 17543, 17559, 17585, 21862, 17504, 17527, 17258, 36417, 21890, 21915, 17611, 36466, 18259, 17633, 17661, 18368, 17703, 17730, 17772, 33538, 21921, 17617, 36472, 18265, 36530, 17477, 19171, 17902, 17934, 17744, 17795, 17874, 17590, 21595, 17481, 19175, 17906, 18742, 17960, 36550, 17714, 17976, 18021, 18738, 18692, 18413, 18632, 18081, 18098, 18114, 18159, 18185, 18717, 18094, 18251, 18292, 18281, 18308, 18005, 18338, 18354, 18384, 17849, 36402, 19251, 17838, 17163, 30650, 18400, 17858, 32918, 17645, 18816, 18429, 18445, 18530, 17393, 18758, 18516, 18546, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 22380, 18847, 19006, 19027, 19252, 30659, 19027, 17173, 30771, 36436, 17330, 17349, 18940, 17189, 17208, 17281, 17675, 19157, 17308, 17327, 17346, 18937, 18460, 21855, 18660, 18676, 19025, 17265, 22008, 17292, 17421, 21157, 17192, 21217, 19299, 17311, 18669, 19018, 19027, 17447, 32909, 17497, 17520, 17251, 36410, 17824, 20322, 20663, 20490, 17543, 17559, 19191, 21862, 17504, 17527, 17258, 36417, 21890, 21915, 17611, 36466, 18259, 17633, 17661, 18368, 17703, 17730, 17772, 33538, 21921, 17617, 36472, 18265, 36530, 17477, 19171, 17902, 17934, 17744, 17795, 17874, 17590, 21595, 17481, 19175, 17906, 18742, 17960, 36550, 17714, 17976, 18021, 18738, 18692, 18413, 18632, 18081, 18098, 18114, 18159, 18185, 18717, 18094, 18251, 18292, 18281, 18308, 18005, 18338, 18354, 18384, 17849, 36402, 19251, 17838, 17163, 30650, 18400, 17858, 32918, 17645, 18816, 18429, 18445, 18530, 17393, 18758, 18516, 18546, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 21758, 18847, 19006, 19027, 19252, 17687, 19027, 17173, 30771, 36436, 17330, 17349, 18940, 17189, 17208, 17281, 17675, 19237, 17308, 17327, 17346, 18937, 18460, 21855, 18660, 18676, 19025, 17265, 22008, 17292, 17421, 21157, 17192, 21217, 21848, 17311, 18669, 19018, 19027, 17447, 32909, 17497, 17520, 17251, 36410, 17824, 20322, 20663, 20490, 17543, 17559, 17585, 21862, 17504, 17527, 17258, 36417, 21890, 21915, 17611, 36466, 18259, 17633, 17661, 18368, 17703, 17730, 17772, 33538, 21921, 17617, 36472, 18265, 36530, 17477, 19171, 17902, 17934, 17744, 17795, 17874, 17590, 21595, 17481, 19175, 17906, 18742, 17960, 36550, 17714, 17976, 18021, 18738, 18692, 18413, 18632, 18081, 18098, 18114, 18159, 18185, 18717, 18094, 18251, 18292, 18281, 18308, 18005, 18338, 18354, 18384, 17849, 36402, 19251, 17838, 17163, 30650, 18400, 17858, 32918, 17645, 18816, 18429, 18445, 18530, 17393, 18758, 18516, 18546, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 21626, 18847, 19006, 19027, 19252, 17687, 19027, 17173, 30771, 36436, 17330, 17349, 18940, 17189, 17208, 17281, 17675, 17991, 17308, 17327, 17346, 18937, 18460, 21855, 18660, 18676, 19025, 17265, 22008, 17292, 17421, 21157, 17192, 21217, 21848, 17311, 18669, 19018, 19027, 17447, 32909, 17497, 17520, 17251, 36410, 17824, 20322, 20663, 20490, 17543, 17559, 17585, 21862, 17504, 17527, 17258, 36417, 21890, 21915, 17611, 36466, 18259, 17633, 17661, 18368, 17703, 17730, 17772, 33538, 21921, 17617, 36472, 18265, 36530, 17477, 19171, 17902, 17934, 17744, 17795, 17874, 17590, 21595, 17481, 19175, 17906, 18742, 17960, 36550, 17714, 17976, 18021, 18738, 18692, 18413, 18632, 18081, 18098, 18114, 18159, 18185, 18717, 18094, 18251, 18292, 18281, 18308, 18005, 18338, 18354, 18384, 17849, 36402, 19251, 17838, 17163, 30650, 18400, 17858, 32918, 17645, 18816, 18429, 18445, 18530, 17393, 18758, 18516, 18546, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 19268, 19284, 19326, 18482, 27869, 30509, 24384, 31417, 23323, 18482, 19370, 18482, 18484, 27202, 19389, 27202, 27202, 19411, 24384, 34295, 24384, 24384, 25485, 18482, 18482, 18482, 18482, 18482, 25794, 27202, 27202, 27202, 27202, 28530, 19459, 24384, 24384, 24384, 24384, 24017, 18036, 24041, 18482, 18482, 18482, 18484, 19487, 27202, 27202, 27202, 27202, 19503, 35523, 19539, 24384, 24384, 24384, 19647, 18482, 35623, 18482, 18482, 23052, 27202, 19557, 27202, 27202, 30764, 23993, 24384, 19579, 24384, 24384, 26758, 18482, 18482, 19346, 27867, 27202, 27202, 19599, 17590, 23998, 24384, 24384, 19619, 25683, 18482, 18482, 28511, 27202, 27203, 23997, 19639, 19887, 28419, 18902, 18483, 19663, 27202, 24325, 35844, 19887, 30991, 19713, 19395, 19736, 22259, 19754, 22073, 19770, 35154, 19795, 19816, 19836, 19859, 25794, 34248, 24116, 19720, 19875, 30988, 23482, 30981, 28304, 19438, 27956, 19678, 27944, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 21743, 18847, 19006, 19027, 19252, 17431, 19027, 17173, 30771, 36436, 17330, 17349, 18940, 17189, 17208, 17281, 17675, 17991, 17308, 17327, 17346, 18937, 18460, 21855, 18660, 18676, 19025, 17265, 22008, 17292, 17421, 21157, 17192, 21217, 21848, 17311, 18669, 19018, 19027, 17447, 32909, 17497, 17520, 17251, 36410, 17824, 20322, 20663, 20490, 17543, 17559, 17585, 21862, 17504, 17527, 17258, 36417, 21890, 21915, 17611, 36466, 18259, 17633, 17661, 18368, 17703, 17730, 17772, 33538, 21921, 17617, 36472, 18265, 36530, 17477, 19171, 17902, 17934, 17744, 17795, 17874, 17590, 21595, 17481, 19175, 17906, 18742, 17960, 36550, 17714, 17976, 18021, 18738, 18692, 18413, 18632, 18081, 18098, 18114, 18159, 18185, 18717, 18094, 18251, 18292, 18281, 18308, 18005, 18338, 18354, 18384, 17849, 36402, 19251, 17838, 17163, 30650, 18400, 17858, 32918, 17645, 18816, 18429, 18445, 18530, 17393, 18758, 18516, 18546, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 22365, 18847, 19907, 19027, 19252, 17687, 19027, 17173, 30771, 36436, 17330, 17349, 18940, 17189, 17208, 17281, 17675, 17991, 17308, 17327, 17346, 18937, 18460, 21855, 18660, 18676, 19025, 17265, 22008, 17292, 17421, 21157, 17192, 21217, 21848, 17311, 18669, 19018, 19027, 17447, 32909, 17497, 17520, 17251, 36410, 17824, 20322, 20663, 20490, 17543, 17559, 17585, 21862, 17504, 17527, 17258, 36417, 21890, 21915, 17611, 36466, 18259, 17633, 17661, 18368, 17703, 17730, 17772, 33538, 21921, 17617, 36472, 18265, 36530, 17477, 19171, 17902, 17934, 17744, 17795, 17874, 17590, 21595, 17481, 19175, 17906, 18742, 17960, 36550, 17714, 17976, 18021, 18738, 18692, 18413, 18632, 18081, 18098, 18114, 18159, 18185, 18717, 18094, 18251, 18292, 18281, 18308, 18005, 18338, 18354, 18384, 17849, 36402, 19251, 17838, 17163, 30650, 18400, 17858, 32918, 17645, 18816, 18429, 18445, 18530, 17393, 18758, 18516, 18546, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 21641, 18847, 19326, 18482, 27869, 30544, 24384, 29176, 21442, 18482, 18482, 18482, 18484, 27202, 27202, 27202, 27202, 19935, 24384, 24384, 24384, 24384, 32316, 18482, 18482, 18482, 18482, 18482, 25794, 27202, 27202, 27202, 27202, 28530, 19965, 24384, 24384, 24384, 24384, 31473, 18475, 18482, 18482, 18482, 18482, 18484, 27202, 27202, 27202, 27202, 27202, 19988, 24384, 24384, 24384, 24384, 24384, 33654, 18482, 18482, 18482, 18482, 23052, 27202, 27202, 27202, 27202, 29523, 29939, 24384, 24384, 24384, 24384, 26114, 18482, 18482, 18482, 27867, 27202, 27202, 27202, 20017, 22934, 24384, 24384, 24384, 18481, 18482, 18482, 27202, 27202, 35771, 20047, 24385, 19887, 25677, 18482, 18483, 27202, 27202, 19738, 23870, 19887, 30991, 18484, 27202, 31802, 19425, 19466, 23052, 23296, 19847, 30990, 27868, 34251, 19859, 25794, 34248, 19856, 25793, 19779, 30988, 23482, 30981, 22080, 19438, 27956, 19678, 27944, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 20068, 19058, 20158, 20367, 20884, 17944, 20276, 20853, 25651, 20604, 20460, 20185, 20209, 17189, 17208, 17281, 17675, 20232, 20273, 20295, 20338, 22456, 20777, 20600, 21329, 20635, 20365, 20937, 21207, 17292, 17421, 21157, 17192, 21217, 22425, 20279, 25549, 22436, 20276, 20383, 18983, 20421, 20446, 21317, 21051, 20476, 20322, 20663, 20490, 17543, 17559, 17585, 22463, 20540, 19523, 20246, 20556, 20257, 20430, 20585, 20620, 20193, 20651, 17661, 18368, 17703, 17730, 17772, 19513, 20679, 20692, 22446, 21027, 21097, 18990, 21111, 20708, 20736, 17744, 17795, 17874, 17590, 25536, 20349, 20762, 20812, 20169, 20828, 21376, 17714, 17976, 18021, 18560, 20844, 20569, 25560, 20869, 20900, 18114, 18159, 20916, 20953, 21013, 21043, 21067, 18281, 21083, 18574, 21127, 21143, 21181, 20515, 20930, 20883, 20504, 21197, 21233, 21258, 20524, 20216, 17405, 21270, 21286, 21302, 20720, 20310, 21345, 21361, 21392, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 21952, 18847, 19006, 19027, 19252, 17687, 19027, 17173, 30771, 36436, 17330, 17349, 18940, 17189, 17208, 17281, 17675, 17991, 17308, 17327, 17346, 18937, 21427, 21855, 18660, 18676, 19025, 17265, 22008, 17292, 17421, 21157, 17192, 21217, 21848, 17311, 18669, 19018, 19027, 21479, 32909, 17497, 17520, 17251, 36410, 17824, 20322, 20663, 20490, 17543, 17559, 17585, 21862, 17504, 17527, 17258, 36417, 36500, 21915, 17611, 36466, 18259, 17633, 17661, 18368, 17703, 17730, 17772, 28667, 21921, 17617, 36472, 18265, 17237, 17477, 19171, 17902, 17934, 17744, 17795, 17874, 21550, 21509, 17481, 19175, 17906, 18742, 17960, 36550, 17714, 17976, 21535, 30636, 18692, 18413, 18632, 18081, 18098, 18114, 18159, 18185, 18717, 18094, 18251, 18292, 18281, 18308, 18005, 18338, 18354, 18384, 17849, 36402, 19251, 17838, 17163, 30650, 18400, 17858, 32918, 17645, 18816, 18429, 18445, 18530, 17393, 18758, 18516, 18546, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 21773, 18847, 21587, 19027, 19252, 17687, 19027, 17173, 30771, 36436, 17330, 17349, 18940, 17189, 17208, 17281, 17675, 17991, 17308, 17327, 17346, 18937, 18460, 21855, 18660, 18676, 19025, 17265, 22008, 17292, 17421, 21157, 17192, 21217, 21848, 17311, 18669, 19018, 19027, 17447, 32909, 17497, 17520, 17251, 36410, 17824, 20322, 20663, 20490, 17543, 17559, 17585, 21862, 17504, 17527, 17258, 36417, 21890, 21915, 17611, 36466, 18259, 17633, 17661, 18368, 17703, 17730, 17772, 33538, 21921, 17617, 36472, 18265, 36530, 17477, 19171, 17902, 17934, 17744, 17795, 17874, 17590, 21595, 17481, 19175, 17906, 18742, 17960, 36550, 17714, 17976, 18021, 18738, 18692, 18413, 18632, 18081, 18098, 18114, 18159, 18185, 18717, 18094, 18251, 18292, 18281, 18308, 18005, 18338, 18354, 18384, 17849, 36402, 19251, 17838, 17163, 30650, 18400, 17858, 32918, 17645, 18816, 18429, 18445, 18530, 17393, 18758, 18516, 18546, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 21611, 18847, 19006, 19027, 19252, 18169, 19027, 17173, 30771, 36436, 17330, 17349, 18940, 17189, 17208, 17281, 17675, 17991, 17308, 17327, 17346, 18937, 18460, 21855, 18660, 18676, 19025, 17265, 22008, 17292, 17421, 21157, 17192, 21217, 21848, 17311, 18669, 19018, 19027, 17447, 32909, 17497, 17520, 17251, 36410, 17824, 20322, 20663, 20490, 17543, 17559, 17585, 21862, 17504, 17527, 17258, 36417, 21890, 21915, 17611, 36466, 18259, 17633, 17661, 18368, 17703, 17730, 17772, 33538, 21921, 17617, 36472, 18265, 36530, 17477, 19171, 17902, 17934, 17744, 17795, 17874, 17590, 21595, 17481, 19175, 17906, 18742, 17960, 36550, 17714, 17976, 18021, 18738, 18692, 18413, 18632, 18081, 18098, 18114, 18159, 18185, 18717, 18094, 18251, 18292, 18281, 18308, 18005, 18338, 18354, 18384, 17849, 36402, 19251, 17838, 17163, 30650, 18400, 17858, 32918, 17645, 18816, 18429, 18445, 18530, 17393, 18758, 18516, 18546, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 21728, 19115, 21878, 19027, 19252, 17687, 19027, 19310, 30771, 36436, 17330, 17349, 18940, 17189, 17208, 17281, 17675, 17991, 17308, 17327, 17346, 18937, 17379, 21855, 18660, 18676, 19025, 17265, 22008, 17292, 17421, 21157, 17192, 21217, 21848, 17311, 18669, 19018, 19027, 17447, 21906, 17497, 17520, 17251, 36410, 17824, 20322, 20663, 20490, 17543, 17559, 17585, 21862, 17504, 17527, 17258, 36417, 18322, 21915, 17611, 36466, 18259, 17633, 17661, 18368, 17703, 17730, 17772, 33538, 21921, 17617, 36472, 18265, 36530, 17477, 19171, 17902, 17934, 17744, 17795, 17874, 17590, 21595, 17481, 19175, 17906, 18742, 17960, 36550, 17714, 17976, 18021, 18738, 18692, 18413, 18632, 18081, 18098, 18114, 18159, 18185, 18717, 18094, 18251, 18292, 18281, 18308, 18005, 18338, 18354, 18384, 17849, 36402, 19251, 17838, 17163, 30650, 18400, 17858, 32918, 17645, 18816, 18429, 18445, 18530, 17393, 18758, 18516, 18546, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 21937, 18605, 19006, 19027, 19252, 22018, 19027, 17173, 30771, 36436, 17330, 17349, 18940, 17189, 17208, 17281, 17675, 17991, 17308, 17327, 17346, 18937, 18460, 21855, 18660, 18676, 19025, 17265, 22008, 17292, 17421, 21157, 17192, 21217, 21848, 17311, 18669, 19018, 19027, 17447, 32909, 17497, 17520, 17251, 36410, 17824, 20322, 20663, 20490, 17543, 17559, 17585, 21862, 17504, 17527, 17258, 36417, 21890, 21915, 17611, 36466, 18259, 17633, 17661, 18368, 17703, 17730, 17772, 33538, 21921, 17617, 36472, 18265, 36530, 17477, 19171, 17902, 17934, 17744, 17795, 17874, 17590, 21595, 17481, 19175, 17906, 18742, 17960, 36550, 17714, 17976, 18021, 18738, 18692, 18413, 18632, 18081, 18098, 18114, 18159, 18185, 18717, 18094, 18251, 18292, 18281, 18308, 18005, 18338, 18354, 18384, 17849, 36402, 19251, 17838, 17163, 30650, 18400, 17858, 32918, 17645, 18816, 18429, 18445, 18530, 17393, 18758, 18516, 18546, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 21656, 21833, 19006, 19027, 19252, 17687, 19027, 21519, 30771, 36436, 17330, 17349, 18940, 17189, 17208, 17281, 17675, 17991, 17308, 17327, 17346, 18937, 18460, 21855, 18660, 18676, 19025, 17265, 22008, 17292, 17421, 21157, 17192, 21217, 21848, 17311, 18669, 19018, 19027, 17447, 32909, 17497, 17520, 17251, 36410, 17824, 20322, 20663, 20490, 17543, 17559, 17585, 21862, 17504, 17527, 17258, 36417, 21890, 21915, 17611, 36466, 18259, 17633, 17661, 18368, 17703, 17730, 17772, 33538, 21921, 17617, 36472, 18265, 36530, 17477, 19171, 17902, 17934, 17744, 17795, 17874, 17590, 21595, 17481, 19175, 17906, 18742, 17960, 36550, 17714, 17976, 18021, 18738, 18692, 18413, 18632, 18081, 18098, 18114, 18159, 18185, 18717, 18094, 18251, 18292, 18281, 18308, 18005, 18338, 18354, 18384, 17849, 36402, 19251, 17838, 17163, 30650, 18400, 17858, 32918, 17645, 18816, 18429, 18445, 18530, 17393, 18758, 18516, 18546, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 22305, 18847, 22034, 18482, 27869, 25325, 24384, 29176, 22062, 18482, 18482, 18482, 18484, 27202, 27202, 27202, 27202, 22096, 24384, 24384, 24384, 24384, 30621, 18482, 18482, 18482, 18482, 18482, 25794, 27202, 27202, 27202, 27202, 35010, 22148, 24384, 24384, 24384, 24384, 31473, 31659, 18482, 18482, 18482, 18482, 18484, 27202, 27202, 27202, 27202, 27202, 19503, 24384, 24384, 24384, 24384, 24384, 32253, 18482, 18482, 18482, 18482, 23052, 27202, 27202, 27202, 27202, 30764, 21406, 24384, 24384, 24384, 24384, 26114, 18482, 18482, 18482, 27867, 27202, 27202, 27202, 22171, 22934, 24384, 24384, 24384, 22228, 18482, 18482, 27202, 27202, 35771, 20047, 24385, 19887, 25677, 18482, 18483, 27202, 27202, 19738, 23870, 19887, 30991, 18484, 27202, 31802, 19425, 19466, 23052, 23296, 19847, 30990, 27868, 34251, 19859, 25794, 34248, 19856, 25793, 19779, 30988, 23482, 30981, 22080, 19438, 27956, 19678, 27944, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 22305, 18847, 22034, 18482, 27869, 25325, 24384, 29176, 22062, 18482, 18482, 18482, 18484, 27202, 27202, 27202, 27202, 22096, 24384, 24384, 24384, 24384, 30621, 18482, 18482, 18482, 18482, 18482, 25794, 27202, 27202, 27202, 27202, 35010, 22148, 24384, 24384, 24384, 24384, 31473, 31659, 18482, 18482, 18482, 18482, 18484, 27202, 27202, 27202, 27202, 27202, 19503, 24384, 24384, 24384, 24384, 24384, 31154, 18482, 18482, 18482, 18482, 23052, 27202, 27202, 27202, 27202, 30764, 21406, 24384, 24384, 24384, 24384, 26114, 18482, 18482, 18482, 27867, 27202, 27202, 27202, 22171, 22934, 24384, 24384, 24384, 18481, 18482, 18482, 27202, 27202, 35771, 20047, 24385, 19887, 25677, 18482, 18483, 27202, 27202, 19738, 23870, 19887, 30991, 18484, 27202, 31802, 19425, 19466, 23052, 23296, 19847, 30990, 27868, 34251, 19859, 25794, 34248, 19856, 25793, 19779, 30988, 23482, 30981, 22080, 19438, 27956, 19678, 27944, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 22305, 18847, 22034, 18482, 27869, 25325, 24384, 29176, 22062, 18482, 18482, 18482, 18484, 27202, 27202, 27202, 27202, 22096, 24384, 24384, 24384, 24384, 31644, 18482, 18482, 18482, 18482, 18482, 25794, 27202, 27202, 27202, 27202, 35010, 22148, 24384, 24384, 24384, 24384, 31473, 31659, 18482, 18482, 18482, 18482, 18484, 27202, 27202, 27202, 27202, 27202, 19503, 24384, 24384, 24384, 24384, 24384, 31154, 18482, 18482, 18482, 18482, 23052, 27202, 27202, 27202, 27202, 30764, 21406, 24384, 24384, 24384, 24384, 26114, 18482, 18482, 18482, 27867, 27202, 27202, 27202, 22171, 22934, 24384, 24384, 24384, 18481, 18482, 18482, 27202, 27202, 35771, 20047, 24385, 19887, 25677, 18482, 18483, 27202, 27202, 19738, 23870, 19887, 30991, 18484, 27202, 31802, 19425, 19466, 23052, 23296, 19847, 30990, 27868, 34251, 19859, 25794, 34248, 19856, 25793, 19779, 30988, 23482, 30981, 22080, 19438, 27956, 19678, 27944, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 22305, 18847, 22034, 18482, 27869, 25325, 24384, 29176, 22062, 18482, 18482, 18482, 18484, 27202, 27202, 27202, 27202, 22096, 24384, 24384, 24384, 24384, 30621, 18482, 18482, 18482, 18482, 18482, 25794, 27202, 27202, 27202, 27202, 35010, 22148, 24384, 24384, 24384, 24384, 33557, 31659, 18482, 18482, 18482, 18482, 18484, 27202, 27202, 27202, 27202, 27202, 19503, 24384, 24384, 24384, 24384, 24384, 31154, 18482, 18482, 18482, 18482, 23052, 27202, 27202, 27202, 27202, 30764, 21406, 24384, 24384, 24384, 24384, 26114, 18482, 18482, 18482, 27867, 27202, 27202, 27202, 22171, 22934, 24384, 24384, 24384, 18481, 18482, 18482, 27202, 27202, 35771, 20047, 24385, 19887, 25677, 18482, 18483, 27202, 27202, 19738, 23870, 19887, 30991, 18484, 27202, 31802, 19425, 19466, 23052, 23296, 19847, 30990, 27868, 34251, 19859, 25794, 34248, 19856, 25793, 19779, 30988, 23482, 30981, 22080, 19438, 27956, 19678, 27944, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 22305, 18847, 22034, 18482, 27869, 34068, 24384, 29176, 22062, 18482, 18482, 18482, 18484, 27202, 27202, 27202, 27202, 22245, 24384, 24384, 24384, 24384, 30621, 18482, 18482, 18482, 18482, 18482, 25794, 27202, 27202, 27202, 27202, 35010, 22148, 24384, 24384, 24384, 24384, 31473, 31659, 18482, 18482, 18482, 18482, 18484, 27202, 27202, 27202, 27202, 27202, 19503, 24384, 24384, 24384, 24384, 24384, 31154, 18482, 18482, 18482, 18482, 23052, 27202, 27202, 27202, 27202, 30764, 21406, 24384, 24384, 24384, 24384, 26114, 18482, 18482, 18482, 27867, 27202, 27202, 27202, 22171, 22934, 24384, 24384, 24384, 18481, 18482, 18482, 27202, 27202, 35771, 20047, 24385, 19887, 25677, 18482, 18483, 27202, 27202, 19738, 23870, 19887, 30991, 18484, 27202, 31802, 19425, 19466, 23052, 23296, 19847, 30990, 27868, 34251, 19859, 25794, 34248, 19856, 25793, 19779, 30988, 23482, 30981, 22080, 19438, 27956, 19678, 27944, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 22305, 18847, 22034, 18482, 27869, 25325, 24384, 29176, 22062, 18482, 18482, 18482, 18484, 27202, 27202, 27202, 27202, 22096, 24384, 24384, 24384, 24384, 18877, 18482, 18482, 18482, 18482, 18482, 25794, 27202, 27202, 27202, 27202, 35010, 22148, 24384, 24384, 24384, 24384, 24017, 31659, 18482, 18482, 18482, 18482, 18484, 27202, 27202, 27202, 27202, 27202, 19503, 24384, 24384, 24384, 24384, 24384, 19647, 18482, 18482, 18482, 18482, 23052, 27202, 27202, 27202, 27202, 30764, 23993, 24384, 24384, 24384, 24384, 26758, 18482, 18482, 18482, 27867, 27202, 27202, 27202, 17590, 23998, 24384, 24384, 24384, 18481, 18482, 18482, 27202, 27202, 27203, 23997, 24385, 19887, 25677, 18482, 18483, 27202, 27202, 19738, 23870, 19887, 30991, 18484, 27202, 31802, 19425, 19466, 23052, 23296, 19847, 30990, 27868, 34251, 19859, 25794, 34248, 19856, 25793, 19779, 30988, 23482, 30981, 22080, 19438, 27956, 19678, 27944, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 22290, 18847, 22034, 18482, 27869, 34957, 24384, 29176, 22062, 18482, 18482, 18482, 18484, 27202, 27202, 27202, 27202, 22096, 24384, 24384, 24384, 24384, 18877, 18482, 18482, 18482, 18482, 18482, 25794, 27202, 27202, 27202, 27202, 35010, 22148, 24384, 24384, 24384, 24384, 24017, 31659, 18482, 18482, 18482, 18482, 18484, 27202, 27202, 27202, 27202, 27202, 19503, 24384, 24384, 24384, 24384, 24384, 19647, 18482, 18482, 18482, 18482, 23052, 27202, 27202, 27202, 27202, 30764, 23993, 24384, 24384, 24384, 24384, 26758, 18482, 18482, 18482, 27867, 27202, 27202, 27202, 17590, 23998, 24384, 24384, 24384, 18481, 18482, 18482, 27202, 27202, 27203, 23997, 24385, 19887, 25677, 18482, 18483, 27202, 27202, 19738, 23870, 19887, 30991, 18484, 27202, 31802, 19425, 19466, 23052, 23296, 19847, 30990, 27868, 34251, 19859, 25794, 34248, 19856, 25793, 19779, 30988, 23482, 30981, 22080, 19438, 27956, 19678, 27944, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 22305, 18847, 22034, 18482, 27869, 25325, 24384, 29176, 22062, 18482, 18482, 18482, 18484, 27202, 27202, 27202, 27202, 22096, 24384, 24384, 24384, 24384, 18877, 18482, 18482, 18482, 18482, 18482, 25794, 27202, 27202, 27202, 27202, 35010, 22148, 24384, 24384, 24384, 24384, 24017, 31659, 18482, 18482, 18482, 18482, 18484, 27202, 27202, 27202, 27202, 27202, 19503, 24384, 24384, 24384, 24384, 24384, 19647, 18482, 18482, 18482, 18482, 23052, 27202, 27202, 27202, 27202, 30764, 23993, 24384, 24384, 24384, 24384, 34436, 18482, 18482, 18482, 27867, 27202, 27202, 27202, 17590, 23998, 24384, 24384, 24384, 18481, 18482, 18482, 27202, 27202, 27203, 23997, 24385, 19887, 25677, 18482, 18483, 27202, 27202, 19738, 23870, 19887, 30991, 18484, 27202, 31802, 19425, 19466, 23052, 23296, 19847, 30990, 27868, 34251, 19859, 25794, 34248, 19856, 25793, 19779, 30988, 23482, 30981, 22080, 19438, 27956, 19678, 27944, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 22320, 18847, 19006, 19027, 19252, 17687, 19027, 17173, 27077, 36436, 17330, 17349, 18940, 17189, 17208, 17281, 17675, 17991, 17308, 17327, 17346, 18937, 18460, 21855, 18660, 18676, 19025, 17265, 22008, 17292, 17421, 21157, 17192, 21217, 21848, 17311, 18669, 19018, 19027, 17447, 32909, 17497, 17520, 17251, 36410, 17824, 20322, 20663, 20490, 17543, 17559, 17585, 21862, 17504, 17527, 17258, 36417, 21890, 21915, 17611, 36466, 18259, 17633, 17661, 18368, 17703, 17730, 17772, 33538, 21921, 17617, 36472, 18265, 36530, 17477, 19171, 17902, 17934, 17744, 17795, 17874, 17590, 21595, 17481, 19175, 17906, 18742, 17960, 36550, 17714, 17976, 18021, 18738, 18692, 18413, 19919, 18081, 18098, 18114, 18159, 18185, 18717, 18094, 18251, 18292, 18281, 18308, 18005, 18338, 18354, 18384, 17849, 36402, 19251, 17838, 17163, 30650, 18400, 17858, 32918, 17645, 18816, 18429, 18445, 18530, 17393, 18758, 18516, 18546, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 21803, 18847, 19006, 19027, 19252, 17687, 19027, 17173, 30771, 36436, 17330, 17349, 18940, 17189, 17208, 17281, 17675, 17991, 17308, 17327, 17346, 18937, 18460, 21855, 18660, 18676, 19025, 17265, 22008, 17292, 17421, 21157, 17192, 21217, 21848, 17311, 18669, 19018, 19027, 17447, 32909, 17497, 17520, 17251, 36410, 17824, 20322, 20663, 20490, 17543, 17559, 17585, 21862, 17504, 17527, 17258, 36417, 21890, 21915, 17611, 36466, 18259, 17633, 17661, 18368, 17703, 17730, 17772, 33538, 21921, 17617, 36472, 18265, 36530, 17477, 19171, 17902, 17934, 17744, 17795, 17874, 17590, 21595, 17481, 19175, 17906, 18742, 17960, 36550, 17714, 17976, 18021, 18738, 18692, 18413, 18632, 18081, 18098, 18114, 18159, 18185, 18717, 18094, 18251, 18292, 18281, 18308, 18005, 18338, 18354, 18384, 17849, 36402, 19251, 17838, 17163, 30650, 18400, 17858, 32918, 17645, 18816, 18429, 18445, 18530, 17393, 18758, 18516, 18546, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 22275, 22479, 19006, 19027, 19252, 17687, 19027, 19141, 30771, 36436, 17330, 17349, 18940, 17189, 17208, 17281, 17675, 17991, 17308, 17327, 17346, 18937, 22510, 21855, 18660, 18676, 19025, 17265, 22008, 17292, 17421, 21157, 17192, 21217, 21848, 17311, 18669, 19018, 19027, 17447, 32909, 17497, 17520, 17251, 36410, 17824, 20322, 20663, 20490, 17543, 17559, 17585, 21862, 17504, 17527, 17258, 36417, 21890, 21915, 17611, 36466, 18259, 17633, 17661, 18368, 17703, 17730, 17772, 33538, 21921, 17617, 36472, 18265, 36530, 17477, 19171, 17902, 17934, 17744, 17795, 17874, 17590, 21595, 17481, 19175, 17906, 18742, 17960, 36550, 17714, 17976, 18021, 18738, 18692, 18413, 18632, 18081, 18098, 18114, 18159, 18185, 18717, 18094, 18251, 18292, 18281, 18308, 18005, 18338, 18354, 18384, 17849, 36402, 19251, 17838, 17163, 30650, 18400, 17858, 32918, 17645, 18816, 18429, 18445, 18530, 17393, 18758, 18516, 18546, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 22574, 18847, 22954, 22970, 27597, 22986, 23002, 23033, 22062, 18482, 18482, 18482, 23049, 27202, 27202, 27202, 23068, 22096, 24384, 24384, 24384, 23088, 31359, 31082, 19693, 18482, 28112, 28225, 19443, 35045, 27202, 27202, 23108, 23139, 23155, 23178, 24384, 24384, 23212, 35330, 31659, 23228, 18482, 23256, 23274, 27795, 26712, 23293, 35214, 34879, 33340, 23312, 18235, 23359, 32708, 23949, 24384, 23380, 35255, 23429, 18482, 33884, 23408, 23448, 27202, 27202, 23498, 23518, 21406, 23541, 24384, 24384, 23570, 26114, 23601, 23623, 18482, 33444, 23651, 32875, 27202, 22171, 18862, 23702, 36589, 24384, 18481, 23731, 32601, 27202, 23750, 23768, 20047, 32969, 24367, 25677, 18482, 18483, 27202, 27202, 19738, 23870, 23784, 30991, 18484, 27202, 31802, 19425, 19466, 23052, 23296, 19847, 28217, 31795, 23804, 26925, 34916, 23831, 26501, 25793, 23859, 23895, 23482, 30981, 22080, 19438, 27956, 19678, 29812, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 22589, 18847, 22034, 18482, 27869, 25325, 24384, 29176, 22062, 18482, 18482, 18482, 18484, 27202, 27202, 27202, 27202, 22096, 24384, 24384, 24384, 24384, 30621, 18482, 18482, 18482, 18482, 28902, 25794, 27202, 27202, 27202, 34019, 23914, 22148, 24384, 24384, 24384, 28393, 23930, 31659, 18482, 18482, 18482, 18482, 18484, 27202, 27202, 27202, 27202, 27202, 19503, 24384, 24384, 24384, 24384, 24384, 31154, 26591, 18482, 18482, 18482, 31585, 23965, 27202, 27202, 27202, 23986, 22185, 24014, 24384, 24384, 24384, 24033, 18482, 18482, 18482, 27867, 27202, 27202, 27202, 22171, 22934, 24384, 24384, 24384, 18481, 18482, 18482, 27202, 27202, 35771, 20047, 24385, 19887, 25677, 18482, 18483, 27202, 27202, 19738, 23870, 19887, 30991, 18484, 27202, 31802, 19425, 19466, 23052, 23296, 19847, 30990, 27868, 34251, 26504, 24057, 24107, 24132, 25793, 19779, 30988, 23482, 30981, 22080, 19438, 27956, 19678, 27944, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 22604, 18847, 22034, 19697, 27869, 24166, 24384, 24182, 24198, 26600, 18482, 18482, 18484, 24233, 24249, 27202, 27202, 22096, 24268, 24284, 24384, 24384, 30621, 19800, 35427, 35999, 32609, 18482, 25794, 24303, 28959, 23752, 27202, 35010, 22148, 24341, 32040, 26837, 24383, 31473, 31659, 18482, 18482, 18482, 24784, 18484, 27202, 27202, 27202, 27202, 24401, 19503, 24384, 24384, 24384, 24384, 20134, 31154, 18482, 18482, 18482, 27845, 23052, 27202, 27202, 33502, 27202, 30764, 21406, 24384, 24384, 22938, 24384, 26114, 18482, 36246, 18482, 27867, 27202, 24423, 27202, 22171, 22934, 24384, 24442, 24384, 36762, 28438, 18482, 34466, 34508, 35771, 24461, 24385, 24477, 25677, 18482, 36220, 27202, 27202, 24498, 30954, 23715, 30991, 18484, 27202, 31802, 19425, 19466, 23052, 23296, 24521, 30990, 27868, 34251, 30090, 23343, 24546, 19856, 25793, 19779, 30988, 23482, 26152, 22080, 19438, 29824, 24562, 27944, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 22619, 18847, 22034, 25767, 22132, 25325, 23162, 29176, 24597, 24091, 23607, 24656, 26122, 24680, 24426, 24696, 28551, 22096, 24731, 24445, 24747, 23364, 30621, 18482, 18482, 18482, 18482, 24781, 25794, 27202, 27202, 27202, 34210, 35010, 22148, 24384, 24384, 24384, 33259, 31473, 22525, 24087, 24213, 18482, 18482, 34908, 24800, 30419, 27202, 27202, 32418, 19503, 29781, 35065, 24384, 24384, 19891, 31154, 24835, 18482, 18482, 24854, 29214, 27202, 27202, 32006, 27202, 30764, 35344, 24384, 24384, 31544, 24384, 26114, 33098, 27814, 27002, 27867, 34668, 25625, 24871, 22171, 22934, 19214, 34531, 24889, 18481, 18482, 18482, 27202, 27202, 35771, 20047, 24385, 19887, 25677, 18482, 33615, 27202, 27202, 24907, 24930, 23554, 30991, 18484, 27202, 31802, 22199, 19466, 23052, 23296, 19847, 30877, 31015, 24955, 19859, 24983, 34248, 30871, 25793, 19779, 30988, 23482, 30981, 22080, 19438, 24999, 19678, 27944, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 22634, 18847, 25024, 25040, 31293, 25056, 25072, 25088, 22062, 34734, 24217, 36253, 34808, 32637, 25104, 23072, 32848, 22245, 36623, 25120, 30679, 27356, 30621, 25136, 26455, 25174, 25208, 22540, 23240, 25224, 25240, 25256, 25306, 25341, 25357, 25418, 25446, 25470, 26739, 25522, 31659, 23635, 25576, 27398, 25593, 28592, 25945, 25617, 27202, 32546, 27295, 25641, 25850, 25667, 24384, 34758, 25699, 25716, 22552, 27787, 30221, 25756, 25789, 25810, 25828, 28333, 28988, 30764, 21493, 33405, 25848, 25866, 25904, 26114, 31227, 26677, 30167, 27867, 25941, 25961, 27202, 22171, 22934, 25977, 25997, 24384, 23394, 27775, 25740, 25270, 26013, 26048, 26064, 26104, 26138, 26178, 26211, 26230, 26247, 30500, 26380, 26282, 28388, 30991, 33711, 27202, 33645, 26324, 36716, 26353, 26374, 35300, 30990, 26396, 26415, 30927, 26358, 33832, 26442, 26471, 26487, 26520, 23482, 33146, 26539, 26555, 27956, 31266, 27944, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 22649, 18847, 26576, 26189, 26616, 25325, 26643, 29176, 22062, 26669, 18482, 18482, 18484, 26693, 27202, 27202, 27202, 22096, 26728, 24384, 24384, 24384, 30621, 18482, 18482, 18482, 18482, 26782, 25794, 27202, 27202, 27202, 26258, 35010, 22148, 24384, 24384, 24384, 21571, 31473, 31659, 18482, 18482, 33949, 18482, 18484, 27202, 27202, 25812, 27202, 27202, 19503, 24384, 24384, 24384, 26800, 24384, 31154, 18482, 18482, 18482, 35570, 23052, 27202, 27202, 27202, 26817, 30764, 21406, 24384, 24384, 24384, 26836, 26114, 18482, 18482, 18482, 27867, 27202, 27202, 27202, 22171, 22934, 24384, 24384, 24384, 18481, 18482, 18482, 27202, 27202, 35771, 20047, 24385, 19887, 25677, 31882, 18483, 35699, 27202, 19738, 26853, 19887, 30991, 18484, 27202, 31802, 19425, 19466, 23052, 23296, 26913, 30990, 27868, 34251, 19859, 25794, 34248, 19856, 25793, 19779, 30988, 23482, 24967, 31061, 19438, 26953, 27663, 27944, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 22664, 18847, 26990, 18482, 27869, 25325, 24384, 29176, 22062, 18482, 18482, 18482, 18484, 27202, 27202, 27202, 27202, 22096, 24384, 24384, 24384, 24384, 23017, 18482, 18482, 18482, 18482, 18482, 25794, 27202, 27202, 27202, 27202, 35010, 27024, 24384, 24384, 24384, 24384, 24017, 31659, 18482, 18482, 27047, 18482, 18484, 27202, 27202, 27331, 27202, 27202, 27066, 24384, 24384, 29025, 24384, 24384, 19647, 18482, 18482, 18482, 18482, 23052, 27202, 27202, 27202, 27202, 30764, 23993, 24384, 24384, 24384, 24384, 26758, 18482, 18482, 33957, 27867, 27202, 27202, 27093, 17590, 23998, 24384, 24384, 27114, 27135, 36322, 27153, 27201, 27219, 28359, 18229, 34780, 34405, 27235, 35972, 27268, 27293, 27311, 36040, 33984, 20980, 31851, 21453, 30535, 27347, 32520, 27372, 23052, 23296, 19847, 30990, 27868, 34251, 19859, 25794, 34248, 19856, 25793, 19779, 30988, 23482, 30981, 22080, 26337, 30118, 19678, 27944, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 22305, 18847, 22034, 27397, 27414, 27436, 27452, 27473, 22062, 18482, 18482, 30171, 18484, 27202, 27202, 27982, 27202, 22096, 24384, 24384, 25700, 24384, 18877, 18482, 18482, 18482, 18482, 18482, 34013, 27202, 27202, 27202, 27202, 29731, 22148, 24384, 24384, 24384, 24384, 27119, 31659, 27489, 18482, 18482, 18482, 18484, 27185, 27202, 27202, 27202, 27202, 19503, 27457, 24384, 24384, 24384, 24384, 19647, 18482, 18482, 18482, 27050, 23052, 27202, 27202, 27202, 32469, 30764, 23993, 24384, 24384, 24384, 34982, 26758, 18482, 18482, 18482, 27867, 27202, 27202, 27202, 17590, 23998, 24384, 24384, 24384, 18481, 18482, 18482, 27202, 27202, 27203, 23997, 24385, 19887, 25677, 18482, 18483, 27202, 27202, 19738, 23870, 19887, 30991, 20796, 27202, 29362, 22110, 33940, 23052, 23296, 19847, 30990, 27868, 34251, 19859, 25794, 34248, 19856, 25793, 19779, 30988, 23482, 30981, 22080, 19438, 27956, 19678, 27944, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 22679, 18847, 22034, 27508, 27528, 27553, 35182, 27569, 22062, 29693, 26300, 23258, 27585, 24715, 27613, 27202, 27648, 22096, 36597, 27698, 24384, 27733, 18877, 18482, 27811, 18482, 27830, 22046, 27865, 32194, 27202, 25158, 27885, 27913, 22148, 29458, 24384, 29977, 34392, 26750, 27763, 26889, 18482, 18482, 27252, 29886, 27929, 27202, 27202, 27202, 27981, 27998, 28024, 28045, 24384, 24384, 28062, 28081, 28128, 25506, 28145, 26088, 28160, 27202, 28173, 24640, 28189, 30764, 31496, 24384, 28205, 34154, 36166, 24939, 28241, 28259, 28283, 21463, 33034, 28320, 28349, 17590, 20967, 23092, 28375, 28409, 28095, 28435, 28454, 28474, 28509, 28527, 20001, 33682, 25879, 25677, 18482, 18483, 27202, 27202, 19738, 23870, 19887, 30272, 28267, 28546, 28567, 19425, 28583, 23052, 23296, 19847, 19471, 28608, 28653, 31075, 25794, 34248, 19856, 25793, 19779, 29644, 35950, 30318, 22080, 19438, 27956, 23123, 28693, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 22305, 18847, 22034, 18482, 27869, 25325, 24384, 29176, 22062, 18482, 18482, 18482, 18484, 27202, 27202, 27202, 27202, 22096, 24384, 24384, 24384, 24384, 18877, 18482, 18482, 18482, 18482, 18482, 25794, 27202, 27202, 27202, 27202, 35010, 22148, 24384, 24384, 24384, 24384, 24017, 22494, 18482, 18482, 18482, 18482, 18484, 25283, 27202, 27202, 27202, 27202, 19503, 29397, 24384, 24384, 24384, 24384, 19647, 18482, 18482, 18482, 18482, 23052, 27202, 27202, 27202, 27202, 30764, 23993, 24384, 24384, 24384, 24384, 26758, 18482, 18482, 18482, 27867, 27202, 27202, 27202, 17590, 23998, 24384, 24384, 24384, 18481, 18482, 18482, 27202, 27202, 27203, 23997, 24385, 19887, 25677, 18482, 18483, 27202, 27202, 19738, 23870, 19887, 30991, 18484, 27202, 31802, 19425, 19466, 23052, 23296, 19847, 30990, 27868, 34251, 19859, 25794, 34248, 19856, 25793, 19779, 30988, 23482, 30981, 22080, 19438, 27956, 19678, 27944, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 22694, 18847, 28740, 28775, 28810, 28834, 28850, 28873, 28889, 24142, 28936, 31945, 36329, 25290, 28954, 27632, 28975, 29004, 24505, 29020, 25454, 29041, 23017, 27512, 29083, 29103, 30721, 18482, 23478, 29123, 24819, 27202, 29148, 28920, 27024, 29166, 23196, 24384, 29192, 35529, 31659, 18482, 18482, 25601, 32589, 29211, 27202, 27202, 31434, 30700, 29230, 27066, 24384, 24384, 24384, 29255, 29306, 19647, 18482, 33383, 18482, 18482, 23052, 27202, 29333, 27202, 27202, 30764, 23993, 35925, 24384, 24384, 24384, 27717, 36123, 18482, 18482, 29350, 29413, 27202, 35642, 17590, 21411, 29432, 24384, 25981, 18481, 33866, 18482, 27202, 26967, 27203, 23997, 32729, 19887, 25677, 18482, 26897, 27202, 27202, 29451, 23870, 24354, 30991, 18484, 27202, 31802, 19425, 19466, 23052, 23296, 19847, 30990, 27868, 31737, 19859, 25794, 34248, 19856, 29474, 29539, 29283, 29581, 29637, 22080, 32533, 29501, 19678, 27944, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 22709, 18847, 22034, 29660, 29512, 25325, 33242, 29176, 29682, 27245, 18482, 29709, 33286, 26974, 27202, 29725, 29747, 22096, 19221, 24384, 32702, 29772, 18877, 26784, 33892, 28458, 18482, 18482, 25794, 29797, 27202, 29840, 27202, 35010, 22148, 35817, 24384, 29859, 24384, 24017, 36756, 25192, 18482, 18482, 29879, 18484, 27202, 29902, 27202, 26032, 27202, 29925, 24384, 29960, 24384, 33594, 24384, 19647, 18482, 18482, 18482, 18482, 23052, 27202, 27202, 27202, 27202, 29239, 29993, 24384, 24384, 24384, 24384, 26758, 18482, 18482, 18482, 27867, 27202, 27202, 27202, 17590, 23998, 24384, 24384, 24384, 31665, 18482, 18482, 19603, 27202, 27203, 23997, 30013, 19887, 25677, 18482, 18483, 27202, 27202, 19738, 23870, 19887, 30991, 18484, 27202, 31802, 19949, 19466, 36661, 19563, 19847, 30029, 30128, 30062, 19859, 25794, 30078, 19856, 25793, 19779, 30988, 23482, 30981, 22080, 19438, 27956, 19678, 30106, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 22724, 18847, 30152, 30187, 30237, 30288, 30304, 30344, 22062, 35616, 32797, 25773, 18484, 29909, 34096, 26820, 27202, 22096, 24914, 23189, 29195, 24384, 18877, 34444, 30360, 18482, 18482, 18482, 23413, 24707, 27202, 27202, 27202, 35010, 30378, 34990, 24384, 24384, 24384, 24017, 29554, 18482, 18482, 27137, 18482, 31281, 30394, 27202, 27202, 30413, 30566, 19503, 30435, 24384, 24384, 29969, 35678, 19647, 28759, 30455, 35459, 35606, 23052, 28724, 30490, 30525, 30560, 30764, 23993, 20123, 30582, 30606, 30675, 26291, 33426, 28938, 27682, 30695, 23675, 33466, 28493, 17590, 23944, 20405, 34338, 20997, 32331, 26308, 30716, 30737, 24315, 30756, 21563, 36372, 30787, 26653, 24611, 33177, 32448, 30814, 31804, 25430, 25917, 26523, 18484, 28818, 31802, 29269, 19466, 28297, 34240, 23815, 26076, 30842, 30858, 32115, 30893, 30915, 32757, 25793, 30943, 30988, 23482, 30981, 30970, 31007, 27956, 19678, 29489, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 22739, 18847, 31031, 31047, 32397, 31098, 31114, 31170, 22062, 18482, 29565, 35577, 36725, 27202, 33216, 31186, 24407, 22096, 24384, 20142, 31202, 34301, 27748, 31218, 33388, 27166, 18482, 29087, 27277, 27202, 31251, 31309, 27202, 31328, 31344, 24384, 31375, 31391, 24384, 31410, 31659, 18482, 36130, 32801, 18482, 18484, 27202, 27202, 31433, 31450, 27202, 19503, 24384, 24384, 31470, 33588, 24384, 32977, 18482, 18482, 18482, 18482, 30038, 27202, 27202, 27202, 27202, 31489, 32244, 24384, 24384, 24384, 24384, 31512, 18482, 28755, 18482, 24634, 35732, 27202, 27202, 28637, 31538, 35788, 24384, 24384, 19337, 31986, 18482, 33208, 25316, 27203, 29997, 29863, 19887, 25677, 18482, 18483, 27202, 27202, 19738, 31560, 19887, 31601, 32369, 33316, 30136, 31629, 19972, 31681, 31726, 31753, 31781, 30046, 31820, 31847, 25794, 34282, 19856, 25793, 19779, 30988, 23482, 30981, 22080, 19438, 27956, 31867, 30252, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 22754, 18847, 22034, 18909, 30474, 31902, 24287, 31918, 31934, 32767, 35262, 27008, 29621, 34103, 19820, 29416, 33323, 22096, 27031, 30439, 29435, 28857, 29596, 18482, 18482, 18482, 31961, 18482, 25794, 27202, 27202, 35038, 27202, 35010, 22148, 24384, 24384, 29389, 24384, 24017, 31979, 18482, 26937, 18482, 18482, 18484, 27202, 31454, 32002, 27202, 27202, 32022, 24384, 33015, 32056, 24384, 24384, 33690, 18482, 18482, 33119, 18482, 23052, 27202, 27202, 27624, 27202, 29756, 32078, 24384, 24384, 34332, 24384, 26758, 18482, 18482, 18482, 27867, 27202, 27202, 27202, 36691, 23998, 24384, 24384, 24384, 18481, 18482, 18482, 27202, 27202, 27203, 23997, 24385, 19887, 25677, 18482, 18483, 27202, 27202, 19738, 23870, 19887, 30991, 18484, 27202, 31802, 31710, 22155, 33181, 24252, 32103, 30990, 27868, 34251, 19859, 25794, 34248, 30265, 25793, 19779, 30988, 23482, 30981, 22080, 19438, 27956, 19678, 27944, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 22305, 18847, 32138, 32166, 32186, 30826, 33252, 29067, 22062, 18482, 18482, 18482, 18484, 27202, 27202, 27202, 27202, 22096, 24384, 24384, 24384, 24384, 23585, 18482, 18482, 18482, 18482, 18482, 25794, 27202, 27202, 27202, 27202, 35010, 32210, 24384, 24384, 24384, 24384, 24017, 31659, 18482, 18482, 18482, 18482, 18484, 27202, 27202, 27202, 27202, 27202, 32233, 24384, 24384, 24384, 24384, 24384, 19647, 18482, 18482, 18482, 18482, 23052, 27202, 27202, 27202, 27202, 30764, 23993, 24384, 24384, 24384, 24384, 26758, 18482, 18482, 18482, 27867, 27202, 27202, 27202, 17590, 23998, 24384, 24384, 24384, 18481, 18482, 18482, 27202, 27202, 27203, 23997, 24385, 19887, 25677, 33857, 18483, 36057, 27202, 19738, 35289, 19887, 30991, 18484, 27202, 31802, 19425, 19466, 23052, 23296, 19847, 30990, 27868, 34251, 19859, 25794, 34248, 19856, 25793, 19779, 30988, 23482, 30981, 22080, 19438, 27956, 19678, 27944, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 22769, 18847, 32269, 31613, 34604, 32285, 32301, 32351, 22062, 18482, 32367, 19354, 32385, 27202, 32413, 27098, 32434, 22096, 24384, 32485, 20052, 32506, 18877, 25396, 23734, 18482, 18482, 32562, 32625, 27202, 32653, 27202, 23664, 32673, 32689, 24384, 32724, 24384, 25888, 32745, 34706, 18482, 27381, 32783, 24577, 24838, 32817, 24873, 32838, 32864, 27202, 32899, 32934, 24384, 32957, 29317, 24384, 30798, 26214, 27678, 33875, 18482, 23052, 36352, 27202, 32993, 27202, 30764, 23993, 32087, 24384, 33013, 24384, 35853, 18482, 18482, 30362, 27965, 27202, 27202, 33754, 17590, 20112, 24384, 24384, 34576, 20792, 18482, 18482, 33031, 27202, 27203, 36159, 24385, 19887, 25677, 18482, 18483, 27202, 27202, 19738, 23870, 19887, 30991, 18484, 27202, 31802, 19425, 34554, 24150, 33050, 33080, 33114, 27868, 34251, 23843, 26560, 31696, 19856, 25793, 19779, 30988, 23482, 30981, 33135, 22123, 27956, 23463, 27944, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 22784, 18847, 33162, 28106, 33197, 25325, 33232, 29176, 22062, 33275, 35433, 18482, 18484, 33302, 26399, 33339, 27202, 22096, 33356, 28065, 33404, 24384, 18877, 22229, 18482, 33421, 18482, 18482, 33442, 33460, 24811, 27202, 27202, 26627, 22148, 24758, 35190, 24384, 24384, 25925, 29611, 18482, 18482, 29290, 25186, 33482, 33501, 27202, 27202, 33518, 36276, 19503, 33554, 24384, 24384, 33573, 32490, 19647, 18482, 18482, 31235, 33610, 23052, 27202, 27202, 33631, 27202, 30764, 23993, 24384, 24384, 33670, 24384, 26862, 27492, 18482, 33706, 27867, 32883, 34639, 27202, 17590, 32036, 24765, 23788, 24384, 18481, 18482, 18482, 27202, 27202, 27203, 33727, 36097, 19887, 25677, 18482, 23334, 27202, 29150, 19738, 23870, 35357, 30328, 18484, 33748, 34675, 33770, 19466, 34050, 33824, 31831, 30990, 27868, 34251, 33848, 28913, 33908, 19856, 30469, 33973, 25385, 36033, 34000, 22080, 19438, 27956, 19678, 27944, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 22799, 18847, 34035, 32576, 34084, 34119, 34135, 34170, 34186, 32150, 36005, 31522, 31886, 34202, 34226, 34267, 29334, 34317, 34354, 34378, 34421, 26801, 18877, 26195, 29666, 25402, 18482, 35091, 25794, 34460, 34482, 34504, 25832, 35010, 22148, 34524, 34547, 34570, 19623, 24017, 36654, 35111, 24664, 18482, 32335, 34592, 31312, 34620, 34636, 27202, 34655, 34691, 28046, 34750, 34774, 24384, 33785, 19647, 34796, 32170, 34844, 24581, 33485, 26704, 34828, 34860, 35493, 29132, 36704, 33800, 35368, 32941, 34146, 26758, 34895, 18482, 18482, 34932, 34948, 27202, 32997, 17590, 29944, 34973, 24384, 36296, 25500, 30202, 35875, 35006, 35026, 26266, 20396, 31146, 35061, 35081, 35127, 24623, 28484, 27897, 19738, 35143, 35170, 26162, 28794, 35206, 35230, 33064, 35245, 23052, 23296, 29054, 30990, 27868, 34251, 19859, 25794, 34248, 24530, 25147, 35278, 31765, 35316, 33370, 22080, 19438, 27956, 24072, 28623, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 22814, 18847, 22034, 34720, 34059, 35384, 20989, 35400, 35416, 35449, 18482, 18482, 23432, 35475, 27202, 27202, 27202, 35509, 31127, 24384, 24384, 24384, 35545, 18482, 26871, 35101, 35593, 24855, 25794, 30397, 23502, 26024, 35639, 35658, 22148, 19541, 19583, 30590, 35674, 27709, 35560, 29107, 18482, 18482, 18482, 18484, 27202, 35694, 27202, 27202, 27202, 35715, 24384, 36580, 24384, 24384, 24384, 19647, 30215, 18482, 18482, 18482, 23052, 35731, 27202, 27202, 27202, 27537, 22904, 24384, 24384, 24384, 24384, 23879, 35748, 18482, 18482, 25008, 35770, 27202, 27202, 17590, 20031, 35787, 24384, 24384, 18481, 18482, 18482, 27202, 27202, 27203, 23997, 24385, 19887, 25677, 18482, 18483, 27202, 27202, 19738, 23870, 19887, 23898, 18484, 34488, 31802, 25371, 19466, 23052, 23296, 26426, 30990, 27868, 34251, 19859, 25794, 35804, 19856, 27178, 35833, 33092, 23482, 30981, 22080, 22212, 28705, 19678, 27944, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 22829, 18847, 22034, 35869, 28716, 25325, 31137, 29176, 22062, 26766, 18482, 22558, 18484, 23970, 27202, 29843, 27202, 22096, 33732, 24384, 31394, 24384, 18877, 18482, 18482, 26880, 18482, 18482, 25794, 27202, 30740, 27202, 27202, 35010, 22148, 24384, 24891, 24384, 24384, 24017, 31659, 18482, 18482, 18482, 18482, 18484, 27202, 27202, 27202, 27202, 27202, 19503, 24384, 24384, 24384, 24384, 24384, 19647, 18482, 18482, 18482, 18482, 23052, 27202, 27202, 27202, 27202, 30764, 23993, 24384, 24384, 24384, 24384, 26758, 18482, 18482, 18482, 27867, 27202, 27202, 27202, 17590, 23998, 24384, 24384, 24384, 18481, 18482, 18482, 27202, 27202, 27203, 23997, 24385, 19887, 25677, 18482, 18483, 27202, 27202, 19738, 23870, 19887, 30991, 18484, 27202, 31802, 19425, 19466, 23052, 23296, 19847, 30990, 27868, 34251, 19859, 25794, 34248, 19856, 25793, 19779, 30988, 23482, 30981, 22080, 19438, 27956, 19678, 27944, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 22844, 18847, 22034, 27849, 27869, 35891, 24384, 35907, 22062, 18482, 18482, 18482, 18484, 27202, 27202, 27202, 27202, 22096, 24384, 24384, 24384, 24384, 18877, 18482, 18482, 18482, 18482, 18482, 25794, 27202, 27202, 27202, 27202, 35010, 22148, 24384, 24384, 24384, 24384, 24017, 31575, 18482, 18482, 18482, 18482, 26231, 27202, 27202, 27202, 27202, 27202, 19503, 35923, 24384, 24384, 24384, 24384, 19647, 18482, 28129, 18482, 18482, 35941, 27202, 32822, 27202, 32657, 30764, 23993, 24384, 32217, 24384, 32062, 26758, 18482, 18482, 18482, 27867, 27202, 27202, 27202, 17590, 23998, 24384, 24384, 24384, 18481, 18482, 18482, 27202, 27202, 27203, 23997, 24385, 19887, 25677, 18482, 18483, 27202, 27202, 19738, 23870, 19887, 30991, 18484, 27202, 31802, 19425, 19466, 23052, 23296, 19847, 30990, 27868, 34251, 19859, 25794, 34248, 19856, 25793, 19779, 30988, 23482, 30981, 22080, 19438, 27956, 19678, 27944, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 22859, 18847, 22034, 35966, 34820, 25325, 33931, 29176, 35988, 18482, 23277, 18482, 36021, 27202, 27202, 36056, 36073, 22096, 24384, 24384, 36096, 33921, 18877, 18482, 18482, 18482, 18482, 18482, 25794, 27202, 27202, 27202, 27202, 35010, 22148, 24384, 24384, 24384, 24384, 24017, 36113, 18482, 25577, 18482, 18482, 18484, 27202, 27202, 27324, 27202, 27202, 36146, 24384, 24384, 34362, 24384, 24384, 19647, 28243, 18482, 18482, 18482, 23052, 30899, 27202, 27202, 27202, 23686, 23993, 33808, 24384, 24384, 24384, 26758, 18482, 18482, 18482, 27867, 27202, 27202, 27202, 17590, 23998, 24384, 24384, 24384, 18481, 18482, 18482, 27202, 27202, 27203, 23997, 24385, 19887, 25677, 18482, 18483, 27202, 27202, 19738, 23870, 19887, 30991, 18484, 27202, 31802, 19425, 19466, 23052, 23296, 19847, 30990, 27868, 34251, 19859, 25794, 34248, 19856, 25793, 19779, 30988, 23482, 30981, 22080, 19438, 27956, 19678, 27944, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 22305, 18847, 22034, 19373, 27869, 36182, 24384, 36198, 22062, 18482, 18482, 18482, 18049, 27202, 27202, 27202, 35485, 22096, 24384, 24384, 24384, 29371, 18877, 18482, 36214, 18482, 28788, 18482, 25794, 34872, 27202, 27420, 27202, 35010, 22148, 29380, 24384, 24482, 24384, 24017, 31659, 18482, 36236, 18482, 18482, 18484, 27202, 36080, 27202, 27202, 27202, 19503, 24384, 28029, 24384, 24384, 24384, 19647, 18482, 18482, 32122, 18482, 35754, 27202, 27202, 36269, 27202, 33531, 23993, 24384, 24384, 36292, 24384, 36312, 18482, 18482, 18482, 27867, 27202, 27202, 27202, 17590, 23998, 24384, 24384, 24384, 25730, 18482, 18482, 36345, 27202, 27203, 19203, 24385, 19887, 25677, 31963, 18483, 27202, 32462, 19738, 23870, 36368, 30991, 18484, 27202, 31802, 19425, 19466, 23052, 23296, 19847, 30990, 27868, 34251, 19859, 25794, 34248, 19856, 25793, 19779, 30988, 23482, 30981, 22080, 19438, 27956, 19678, 27944, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 22350, 18847, 36388, 19027, 19252, 17687, 36433, 17173, 17595, 36436, 17330, 17349, 18940, 17189, 17208, 17281, 17675, 36452, 17308, 17327, 17346, 18937, 18460, 21855, 18660, 18676, 19025, 17265, 22008, 17292, 17421, 21157, 17192, 17682, 21701, 17311, 18669, 19018, 19027, 17447, 32909, 17497, 17520, 17251, 36410, 17824, 20322, 20663, 20490, 17543, 17559, 17585, 21862, 17504, 17527, 17258, 36417, 21890, 21915, 17611, 36466, 18259, 17633, 17661, 18368, 17703, 17730, 17772, 33538, 21921, 17617, 36472, 18265, 36530, 17477, 19171, 17902, 17934, 17744, 17795, 17874, 17590, 21595, 17481, 19175, 17906, 18742, 17960, 36550, 17714, 17976, 18021, 18738, 18692, 18413, 18632, 18081, 18098, 18114, 18159, 18185, 18717, 18094, 18251, 18292, 18281, 18308, 18005, 18338, 18354, 18384, 17849, 36402, 19251, 17838, 17163, 30650, 18400, 17858, 32918, 17645, 18816, 18429, 18445, 18530, 17393, 18758, 18516, 18546, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 22335, 18847, 19006, 19027, 19252, 17687, 19027, 21712, 30771, 36436, 17330, 17349, 18940, 17189, 17208, 17281, 17675, 17991, 17308, 17327, 17346, 18937, 18460, 21855, 18660, 18676, 19025, 17265, 22008, 17292, 17421, 21157, 17192, 21217, 21848, 17311, 18669, 19018, 19027, 17447, 32909, 17497, 17520, 17251, 36410, 17824, 20322, 20663, 20490, 17543, 17559, 17585, 21862, 17504, 17527, 17258, 36417, 21890, 21915, 17611, 36466, 18259, 17633, 17661, 18368, 17703, 17730, 17772, 33538, 21921, 17617, 36472, 18265, 36530, 17477, 19171, 17902, 17934, 17744, 17795, 17874, 17590, 21595, 17481, 19175, 17906, 18742, 17960, 36550, 17714, 17976, 18021, 18738, 18692, 18413, 18632, 18081, 18098, 18114, 18159, 18185, 18717, 18094, 18251, 18292, 18281, 18308, 18005, 18338, 18354, 18384, 17849, 36402, 19251, 17838, 17163, 30650, 18400, 17858, 32918, 17645, 18816, 18429, 18445, 18530, 17393, 18758, 18516, 18546, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 21788, 18847, 36488, 19027, 19252, 17687, 19027, 17173, 17779, 36436, 17330, 17349, 18940, 17189, 17208, 17281, 17675, 17810, 17308, 17327, 17346, 18937, 18460, 21855, 18660, 18676, 19025, 17265, 22008, 17292, 17421, 21157, 17192, 21165, 21997, 17311, 18669, 19018, 19027, 17447, 32909, 17497, 17520, 17251, 36410, 17824, 20322, 20663, 20490, 17543, 17559, 17585, 21862, 17504, 17527, 17258, 36417, 21890, 21915, 17611, 36466, 18259, 17633, 17661, 18368, 17703, 17730, 17772, 33538, 21921, 17617, 36472, 18265, 36530, 17477, 19171, 17902, 17934, 17744, 17795, 17874, 17590, 21595, 17481, 19175, 17906, 18742, 17960, 36550, 17714, 17976, 18021, 18738, 18692, 18413, 18632, 18081, 18098, 18114, 18159, 18185, 18717, 18094, 18251, 18292, 18281, 18308, 18005, 18338, 18354, 18384, 17849, 36402, 19251, 17838, 17163, 30650, 18400, 17858, 32918, 17645, 18816, 18429, 18445, 18530, 17393, 18758, 18516, 18546, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 21803, 18847, 19006, 19027, 19252, 17687, 19027, 17173, 30771, 36436, 17330, 17349, 18940, 17189, 17208, 17281, 17675, 36516, 17308, 17327, 17346, 18937, 18460, 21855, 18660, 18676, 19025, 17265, 22008, 17292, 17421, 21157, 17192, 21217, 21848, 17311, 18669, 19018, 19027, 17447, 32909, 17497, 17520, 17251, 36410, 17824, 20322, 20663, 20490, 17543, 17559, 17585, 21862, 17504, 17527, 17258, 36417, 21890, 21915, 17611, 36466, 18259, 17633, 17661, 18368, 17703, 17730, 17772, 33538, 21921, 17617, 36472, 18265, 36530, 17477, 19171, 17902, 17934, 17744, 17795, 17874, 17590, 21595, 17481, 19175, 17906, 18742, 17960, 36550, 17714, 17976, 18021, 18738, 18692, 18413, 18632, 18081, 18098, 18114, 18159, 18185, 18717, 18094, 18251, 18292, 18281, 18308, 18005, 18338, 18354, 18384, 17849, 36402, 19251, 17838, 17163, 30650, 18400, 17858, 32918, 17645, 18816, 18429, 18445, 18530, 17393, 18758, 18516, 18546, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 21803, 18847, 19326, 18482, 27869, 30764, 24384, 29176, 28008, 18482, 18482, 18482, 18484, 27202, 27202, 27202, 27202, 36566, 24384, 24384, 24384, 24384, 22919, 18482, 18482, 18482, 18482, 18482, 25794, 27202, 27202, 27202, 27202, 28530, 36613, 24384, 24384, 24384, 24384, 24017, 18892, 18482, 18482, 18482, 18482, 18484, 27202, 27202, 27202, 27202, 27202, 19503, 24384, 24384, 24384, 24384, 24384, 19647, 18482, 18482, 18482, 18482, 23052, 27202, 27202, 27202, 27202, 30764, 23993, 24384, 24384, 24384, 24384, 26758, 18482, 18482, 18482, 27867, 27202, 27202, 27202, 17590, 23998, 24384, 24384, 24384, 18481, 18482, 18482, 27202, 27202, 27203, 23997, 24385, 19887, 25677, 18482, 18483, 27202, 27202, 19738, 23870, 19887, 30991, 18484, 27202, 31802, 19425, 19466, 23052, 23296, 19847, 30990, 27868, 34251, 19859, 25794, 34248, 19856, 25793, 19779, 30988, 23482, 30981, 22080, 19438, 27956, 19678, 27944, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 36639, 36677, 18731, 19027, 19252, 17687, 19027, 17454, 17595, 36436, 17330, 17349, 18940, 17189, 17208, 17281, 17675, 17223, 17308, 17327, 17346, 18937, 36741, 21855, 18660, 18676, 19025, 17265, 22008, 17292, 17421, 21157, 17192, 17682, 21701, 17311, 18669, 19018, 19027, 17447, 32909, 17497, 17520, 17251, 36410, 17824, 20322, 20663, 20490, 17543, 17559, 17585, 21862, 17504, 17527, 17258, 36417, 21890, 21915, 17611, 36466, 18259, 17633, 17661, 18368, 17703, 17730, 17772, 33538, 21921, 17617, 36472, 18265, 36530, 17477, 19171, 17902, 17934, 17744, 17795, 17874, 17590, 21595, 17481, 19175, 17906, 18742, 17960, 36550, 17714, 17976, 18021, 18738, 18692, 18413, 18632, 18081, 18098, 18114, 18159, 18185, 18717, 18094, 18251, 18292, 18281, 18308, 18005, 18338, 18354, 18384, 17849, 36402, 19251, 17838, 17163, 30650, 18400, 17858, 32918, 17645, 18816, 18429, 18445, 18530, 17393, 18758, 18516, 18546, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 0, 94242, 0, 118820, 0, 2211840, 102439, 0, 0, 106538, 98347, 0, 2158592, 2158592, 2158592, 2158592, 2158592, 2158592, 2158592, 2158592, 2482176, 2158592, 2158592, 2158592, 2158592, 2158592, 2158592, 0, 40976, 0, 18, 18, 24, 24, 27, 27, 27, 2207744, 2404352, 2412544, 2207744, 2207744, 2207744, 2207744, 2207744, 2207744, 2207744, 2207744, 2207744, 2207744, 2207744, 2207744, 2207744, 2207744, 2207744, 3104768, 2605056, 2207744, 2207744, 2207744, 2207744, 2207744, 2207744, 2678784, 2207744, 2695168, 2207744, 2703360, 2207744, 2711552, 2752512, 2207744, 0, 0, 0, 0, 0, 0, 2166784, 0, 0, 0, 0, 0, 0, 2158592, 2158592, 3170304, 3174400, 2158592, 0, 139, 0, 2158592, 2158592, 2158592, 2158592, 2158592, 2424832, 2158592, 2158592, 2158592, 2748416, 2756608, 2777088, 2801664, 2158592, 2158592, 2158592, 2863104, 2891776, 2158592, 2158592, 2158592, 2158592, 2158592, 2158592, 2158592, 2158592, 2158592, 2158592, 2158592, 3104768, 2158592, 2158592, 2158592, 2158592, 2158592, 2158592, 2207744, 2785280, 2207744, 2809856, 2207744, 2207744, 2842624, 2207744, 2207744, 2207744, 2899968, 2207744, 2207744, 2207744, 2207744, 2207744, 2207744, 2207744, 2207744, 2207744, 2207744, 2207744, 2207744, 2564096, 2207744, 2207744, 2207744, 2158592, 2404352, 2412544, 2158592, 2158592, 2158592, 2158592, 2158592, 2158592, 2158592, 2158592, 2158592, 2158592, 2158592, 2158592, 2158592, 2564096, 2158592, 2158592, 2605056, 2158592, 2158592, 2158592, 2158592, 2158592, 2158592, 2678784, 2158592, 2695168, 2158592, 2703360, 2158592, 2711552, 2752512, 2158592, 2158592, 2785280, 2158592, 2158592, 2785280, 2158592, 2809856, 2158592, 2158592, 2842624, 2158592, 2158592, 2158592, 2899968, 2158592, 2158592, 2158592, 2158592, 2158592, 2158592, 2158592, 2158592, 2158592, 18, 0, 0, 0, 0, 0, 0, 0, 2211840, 0, 0, 641, 0, 2158592, 0, 0, 0, 0, 0, 0, 0, 0, 2211840, 0, 0, 32768, 0, 2158592, 0, 2158592, 2158592, 2158592, 2383872, 2158592, 2158592, 2158592, 2158592, 3006464, 2383872, 2207744, 2207744, 2207744, 2207744, 2158877, 2158877, 2158877, 2158877, 0, 0, 0, 2158877, 2572573, 2158877, 2158877, 0, 2207744, 2207744, 2596864, 2207744, 2207744, 2207744, 2207744, 2207744, 2207744, 2641920, 2207744, 2207744, 2207744, 2207744, 2207744, 2207744, 2207744, 0, 0, 0, 0, 0, 0, 2162968, 0, 0, 3104768, 2158592, 2158592, 2158592, 2158592, 2158592, 2158592, 2158592, 2158592, 2158592, 2158592, 2158592, 2158592, 0, 0, 0, 2146304, 2146304, 2224128, 2224128, 2232320, 2232320, 2232320, 641, 0, 0, 0, 0, 0, 0, 2158592, 2158592, 2158592, 2158592, 2158592, 2158592, 2158592, 2158592, 2158592, 2531328, 2158592, 2158592, 2158592, 2158592, 2158592, 2617344, 2158592, 2158592, 2158592, 2158592, 2441216, 2445312, 2158592, 2158592, 2158592, 2158592, 2158592, 2158592, 2502656, 2158592, 2158592, 2158592, 2158592, 2158592, 2158592, 2158592, 2158592, 2580480, 2158592, 2158592, 2158592, 2158592, 2621440, 2158592, 2580480, 2158592, 2158592, 2158592, 2158592, 2621440, 2158592, 2158592, 2158592, 2158592, 2158592, 2158592, 2699264, 2158592, 2158592, 2158592, 2158592, 2158592, 2748416, 2756608, 2777088, 2801664, 2207744, 2863104, 2891776, 2207744, 2207744, 2207744, 2207744, 2207744, 2207744, 2207744, 2207744, 2207744, 2207744, 2207744, 2207744, 3018752, 2207744, 3043328, 2207744, 2207744, 2207744, 2207744, 3080192, 2207744, 2207744, 3112960, 2207744, 2207744, 2207744, 2207744, 2207744, 2207744, 2207744, 0, 0, 0, 167936, 0, 0, 2162688, 0, 0, 2207744, 2207744, 2207744, 3186688, 2207744, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2158592, 2158592, 2158592, 2404352, 2412544, 2158592, 2510848, 2158592, 2158592, 2158592, 2158592, 2158592, 2158592, 2158592, 2584576, 2158592, 2609152, 2158592, 2158592, 2629632, 2158592, 2158592, 2158592, 2686976, 2158592, 2715648, 2158592, 2158592, 3121152, 2158592, 2158592, 2158592, 3149824, 2158592, 2158592, 3170304, 3174400, 2158592, 2367488, 2207744, 2207744, 2207744, 2207744, 2158592, 2158592, 2158592, 2158592, 0, 0, 0, 2158592, 2572288, 2158592, 2158592, 0, 2207744, 2207744, 2207744, 2433024, 2207744, 2453504, 2461696, 2207744, 2207744, 2207744, 2207744, 2207744, 2207744, 2510848, 2207744, 2207744, 2207744, 2207744, 2207744, 2207744, 3096576, 2207744, 2207744, 2207744, 2207744, 2207744, 2207744, 2207744, 2207744, 2207744, 2207744, 2207744, 2207744, 0, 0, 0, 0, 0, 0, 2162688, 0, 0, 2715648, 2207744, 2207744, 2207744, 2207744, 2207744, 2207744, 2207744, 2867200, 2207744, 2904064, 2207744, 2207744, 2207744, 2207744, 2207744, 2207744, 2207744, 2207744, 2473984, 2207744, 2207744, 2494464, 2207744, 2207744, 2207744, 2523136, 2207744, 2207744, 2207744, 2207744, 3014656, 2207744, 2207744, 3051520, 2207744, 2207744, 3100672, 2207744, 2207744, 3121152, 2207744, 2207744, 2207744, 2207744, 2207744, 2531328, 2207744, 2207744, 2207744, 2207744, 2207744, 2617344, 2207744, 2207744, 2207744, 2207744, 2158592, 2158592, 2158592, 2158592, 0, 0, 0, 2158592, 2572288, 2158592, 2158592, 1508, 2207744, 3149824, 2207744, 2207744, 3170304, 3174400, 2207744, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 138, 2158592, 2158592, 2158592, 2404352, 2412544, 2707456, 2732032, 2207744, 2207744, 2207744, 2822144, 2826240, 2207744, 2895872, 2207744, 2207744, 2924544, 2207744, 2207744, 2973696, 2207744, 0, 0, 0, 0, 0, 0, 2166784, 0, 0, 0, 0, 0, 285, 2158592, 2158592, 3112960, 2158592, 2158592, 2158592, 2158592, 2158592, 2158592, 2158592, 2158592, 2158592, 3186688, 2158592, 2207744, 2207744, 2158592, 2158592, 2158592, 2158592, 2158592, 0, 0, 0, 2158592, 2158592, 2158592, 2158592, 0, 0, 2535424, 2543616, 2158592, 2158592, 2158592, 0, 0, 0, 2158592, 2158592, 2158592, 2990080, 2158592, 2158592, 2158592, 2158592, 2158592, 2158592, 2158592, 2572288, 2981888, 2207744, 2207744, 3002368, 2207744, 3047424, 3063808, 3076096, 2207744, 2207744, 2207744, 2207744, 2207744, 2207744, 2207744, 3203072, 2708960, 2732032, 2158592, 2158592, 2158592, 2822144, 2827748, 2158592, 2895872, 2158592, 2158592, 2924544, 2158592, 2158592, 2973696, 2158592, 2981888, 2158592, 2158592, 3002368, 2158592, 3047424, 3063808, 3076096, 2158592, 2158592, 2158592, 2158592, 2158592, 2158592, 2158592, 3203072, 2981888, 2158592, 2158592, 3003876, 2158592, 3047424, 3063808, 3076096, 2158592, 2158592, 2158592, 2158592, 2158592, 2158592, 2158592, 3203072, 2207744, 2207744, 2207744, 2207744, 2207744, 2424832, 2207744, 2207744, 2207744, 2207744, 2207744, 2207744, 2207744, 0, 0, 0, 172310, 279, 0, 2162688, 0, 0, 2523136, 2527232, 2158592, 2158592, 2576384, 2158592, 2158592, 2158592, 2158592, 2158592, 2158592, 2158592, 2158592, 2158592, 2158592, 2908160, 2527232, 2207744, 2207744, 2576384, 2207744, 2207744, 2207744, 2207744, 2207744, 2207744, 2207744, 2207744, 2207744, 2207744, 2908160, 2207744, 0, 0, 0, 0, 0, 0, 2166784, 0, 0, 0, 0, 0, 286, 2158592, 2158592, 0, 0, 2158592, 2158592, 2158592, 2158592, 2633728, 2658304, 0, 0, 2740224, 2744320, 0, 2834432, 2207744, 2207744, 2977792, 2207744, 2207744, 2207744, 2207744, 3039232, 2207744, 2207744, 2207744, 2207744, 2207744, 2207744, 3158016, 0, 0, 29315, 0, 0, 0, 0, 45, 45, 45, 45, 45, 933, 45, 45, 45, 45, 442, 45, 45, 45, 45, 45, 45, 45, 45, 45, 67, 67, 2494464, 2158592, 2158592, 2158592, 2524757, 2527232, 2158592, 2158592, 2576384, 2158592, 2158592, 2158592, 2158592, 2158592, 2158592, 1504, 2158592, 2498560, 2158592, 2158592, 2158592, 2158592, 2568192, 2158592, 2592768, 2625536, 2158592, 2158592, 2674688, 2736128, 2158592, 2158592, 0, 2158592, 2912256, 2158592, 2158592, 2158592, 2158592, 2158592, 2158592, 2158592, 3108864, 2158592, 2158592, 3133440, 3145728, 3153920, 2375680, 2379776, 2207744, 2207744, 2420736, 2207744, 2449408, 2207744, 2207744, 2207744, 2498560, 2207744, 2207744, 2207744, 2207744, 2568192, 2207744, 0, 0, 0, 0, 0, 0, 2166784, 0, 0, 0, 0, 0, 551, 2158592, 2158592, 2158592, 2158592, 2207744, 2506752, 2207744, 2207744, 2207744, 2207744, 2207744, 2158592, 2506752, 0, 2020, 2158592, 2592768, 2625536, 2207744, 2207744, 2674688, 2736128, 2207744, 2207744, 2207744, 2912256, 2207744, 2207744, 2207744, 2207744, 2207744, 2207744, 2207744, 20480, 0, 0, 0, 0, 0, 2162688, 20480, 0, 2207744, 3108864, 2207744, 2207744, 3133440, 3145728, 3153920, 2375680, 2379776, 2158592, 2158592, 2420736, 2158592, 2449408, 2158592, 2158592, 2158592, 2158592, 2158592, 3186688, 2158592, 0, 641, 0, 0, 0, 0, 0, 0, 2367488, 2158592, 2498560, 2158592, 2158592, 1621, 2158592, 2158592, 2568192, 2158592, 2592768, 2625536, 2158592, 2158592, 2674688, 0, 0, 0, 0, 0, 1608, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 1107, 97, 97, 1110, 97, 97, 3133440, 3145728, 3153920, 2158592, 2408448, 2416640, 2158592, 2465792, 2158592, 2158592, 2158592, 2158592, 2158592, 2158592, 2158592, 2158592, 3014656, 2158592, 2158592, 3051520, 2158592, 2158592, 3100672, 2158592, 2158592, 3121152, 2158592, 2158592, 2158592, 3149824, 2416640, 2207744, 2465792, 2207744, 2207744, 2207744, 2207744, 2207744, 2207744, 2207744, 2207744, 2633728, 2658304, 2740224, 2744320, 2834432, 2949120, 2158592, 2985984, 2158592, 2998272, 2158592, 2158592, 2158592, 3129344, 2207744, 2408448, 2949120, 2207744, 2985984, 2207744, 2998272, 2207744, 2207744, 2207744, 3129344, 2158592, 2408448, 2416640, 2158592, 2465792, 2158592, 2158592, 2158592, 2158592, 2158592, 3186688, 2158592, 0, 32768, 0, 0, 0, 0, 0, 0, 2367488, 2949120, 2158592, 2985984, 2158592, 2998272, 2158592, 2158592, 2158592, 3129344, 2158592, 2158592, 2478080, 2158592, 2158592, 2158592, 2535424, 2543616, 2158592, 2158592, 2158592, 2158592, 2158592, 2158592, 2158592, 2158592, 2158592, 3117056, 2207744, 2207744, 2478080, 2207744, 2207744, 2207744, 2207744, 2207744, 2584576, 2207744, 2609152, 2207744, 2207744, 2629632, 2207744, 2207744, 2207744, 2686976, 2207744, 2207744, 2535424, 2543616, 2207744, 2207744, 2207744, 2207744, 2207744, 2207744, 2207744, 2207744, 2207744, 3117056, 2158592, 2158592, 2478080, 2207744, 2207744, 2990080, 2207744, 2207744, 2158592, 2158592, 2482176, 2158592, 2158592, 0, 0, 0, 2158592, 2158592, 2158592, 0, 2158592, 2908160, 2158592, 2158592, 2158592, 2977792, 2158592, 2158592, 2158592, 2158592, 3039232, 2158592, 2158592, 3010560, 2207744, 2428928, 2207744, 2514944, 2207744, 2588672, 2207744, 2838528, 2207744, 2207744, 2207744, 3010560, 2158592, 2428928, 2158592, 2514944, 0, 0, 2158592, 2588672, 2158592, 0, 2838528, 2158592, 2158592, 2158592, 3010560, 2158592, 2506752, 2158592, 18, 0, 0, 0, 0, 0, 0, 0, 2211840, 0, 0, 0, 0, 2158592, 0, 0, 29315, 922, 0, 0, 0, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 67, 67, 3006464, 2383872, 0, 2020, 2158592, 2158592, 2158592, 2158592, 3006464, 2158592, 2637824, 2953216, 2158592, 2207744, 2637824, 2953216, 2207744, 0, 0, 2158592, 2637824, 2953216, 2158592, 2539520, 2158592, 2539520, 2207744, 0, 0, 2539520, 2158592, 2158592, 2158592, 2158592, 2207744, 2506752, 2207744, 2207744, 2207744, 2207744, 2207744, 2158592, 2506752, 0, 0, 2158592, 2207744, 0, 2158592, 2158592, 2207744, 0, 2158592, 2158592, 2207744, 0, 2158592, 2965504, 2965504, 2965504, 0, 0, 0, 0, 0, 2158877, 2158877, 2158877, 2158877, 2158877, 2158877, 2158877, 2158877, 2474269, 2158877, 2158877, 0, 0, 2158877, 2158877, 2158877, 2158877, 2634013, 2658589, 0, 0, 2740509, 2744605, 0, 2834717, 40976, 18, 36884, 45078, 24, 28, 90143, 94242, 118820, 102439, 106538, 98347, 118820, 118820, 118820, 40976, 18, 18, 36884, 0, 0, 0, 24, 24, 24, 27, 27, 27, 27, 90143, 0, 0, 86016, 0, 0, 2211840, 102439, 0, 0, 0, 98347, 0, 2158592, 2158592, 2158592, 2158592, 2158592, 3158016, 0, 2375680, 2379776, 2158592, 2158592, 2420736, 2158592, 2449408, 2158592, 2158592, 0, 94242, 0, 0, 0, 2211840, 102439, 0, 0, 106538, 98347, 135, 2158592, 2158592, 2158592, 2158592, 2158592, 2158592, 2564096, 2158592, 2158592, 2158592, 2158592, 2158592, 2596864, 2158592, 2158592, 2158592, 2158592, 2158592, 2158592, 2641920, 2158592, 2158592, 2158592, 2158592, 2158592, 2158592, 2158592, 2158592, 2158592, 2158592, 2781184, 2793472, 2494464, 2158592, 2158592, 2158592, 2523136, 2527232, 2158592, 2158592, 2576384, 2158592, 2158592, 2158592, 2158592, 2158592, 2158592, 0, 40976, 0, 18, 18, 24, 0, 27, 27, 0, 2158592, 2498560, 2158592, 2158592, 0, 2158592, 2158592, 2568192, 2158592, 2592768, 2625536, 2158592, 2158592, 2674688, 0, 0, 0, 0, 0, 2211840, 0, 0, 0, 0, 0, 0, 2158592, 2158592, 2158592, 2158592, 2158592, 2158592, 2158592, 2158592, 2473984, 2158592, 2158592, 2494464, 2158592, 2158592, 2158592, 3006464, 2383872, 0, 0, 2158592, 2158592, 2158592, 2158592, 3006464, 2158592, 2637824, 2953216, 2158592, 2207744, 2637824, 2953216, 40976, 18, 36884, 45078, 24, 27, 147488, 94242, 147456, 147488, 106538, 98347, 0, 0, 147456, 40976, 18, 18, 36884, 0, 45078, 0, 24, 24, 24, 27, 27, 27, 27, 0, 81920, 0, 94242, 0, 0, 0, 2211840, 0, 0, 0, 106538, 98347, 0, 2158592, 2158592, 2158592, 2158592, 2158592, 2158592, 2428928, 2158592, 2514944, 2158592, 2588672, 2158592, 2838528, 2158592, 2158592, 40976, 18, 151573, 45078, 24, 27, 90143, 94242, 0, 102439, 106538, 98347, 0, 0, 0, 40976, 18, 18, 36884, 0, 45078, 0, 24, 24, 24, 27, 27, 27, 27, 90143, 0, 0, 1315, 0, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 1487, 97, 18, 131427, 0, 0, 0, 0, 0, 0, 362, 0, 0, 365, 29315, 367, 0, 0, 29315, 0, 0, 0, 0, 45, 45, 45, 45, 45, 45, 45, 45, 45, 1663, 45, 45, 45, 45, 45, 45, 45, 45, 45, 183, 45, 45, 45, 45, 201, 45, 130, 94242, 0, 0, 0, 2211840, 102439, 0, 0, 106538, 98347, 0, 2158592, 2158592, 2158592, 2158592, 2158592, 2158592, 3096576, 2158592, 2158592, 2158592, 2158592, 2158592, 2158592, 2158592, 2158592, 2158592, 2158592, 2207744, 2207744, 2158592, 18, 0, 0, 0, 0, 0, 0, 0, 2211840, 0, 0, 0, 0, 2158592, 644, 2207744, 2207744, 2207744, 3186688, 2207744, 0, 1080, 0, 1084, 0, 1088, 0, 0, 0, 0, 0, 0, 0, 2158730, 2158730, 2158730, 2158730, 2158730, 2158730, 2158730, 2158730, 2158730, 2531466, 2158730, 2158730, 2158730, 2158730, 2158730, 2617482, 0, 94242, 0, 0, 0, 2211840, 102439, 0, 0, 106538, 98347, 0, 2158592, 2158592, 2158592, 2158592, 2158592, 2781184, 2793472, 2158592, 2818048, 2158592, 2158592, 2158592, 2158592, 2158592, 2158592, 2158592, 2158592, 2158592, 2158592, 2158592, 2158592, 2158592, 2158592, 2158592, 2158592, 40976, 18, 36884, 45078, 24, 27, 90143, 159779, 159744, 102439, 159779, 98347, 0, 0, 159744, 40976, 18, 18, 36884, 0, 45078, 0, 2224253, 172032, 2224253, 2232448, 2232448, 172032, 2232448, 90143, 0, 0, 2170880, 0, 0, 550, 829, 2158592, 2158592, 2158592, 2387968, 2158592, 2158592, 2158592, 2158592, 2158592, 2158592, 0, 40976, 0, 18, 18, 124, 124, 127, 127, 127, 40976, 18, 36884, 45078, 25, 29, 90143, 94242, 0, 102439, 106538, 98347, 0, 0, 163931, 40976, 18, 18, 36884, 0, 45078, 249856, 24, 24, 24, 27, 27, 27, 27, 90143, 0, 0, 2170880, 0, 0, 827, 0, 2158592, 2158592, 2158592, 2387968, 2158592, 2158592, 2158592, 2158592, 2158592, 2158592, 0, 40976, 0, 4243810, 4243810, 24, 24, 27, 27, 27, 2207744, 0, 0, 0, 0, 0, 0, 2166784, 0, 0, 0, 0, 57344, 286, 2158592, 2158592, 2158592, 2158592, 2707456, 2732032, 2158592, 2158592, 2158592, 2822144, 2826240, 2158592, 2895872, 2158592, 2158592, 2924544, 2158592, 2158592, 2973696, 2158592, 2207744, 2207744, 2207744, 3186688, 2207744, 0, 0, 0, 0, 0, 0, 53248, 0, 0, 0, 0, 0, 97, 97, 97, 97, 97, 1613, 97, 97, 97, 97, 97, 97, 1495, 97, 97, 97, 97, 97, 97, 97, 97, 97, 566, 97, 97, 97, 97, 97, 97, 2207744, 0, 0, 0, 0, 0, 0, 2166784, 546, 0, 0, 0, 0, 286, 2158592, 2158592, 2158592, 2207744, 2207744, 2207744, 2207744, 2207744, 2207744, 2207744, 2207744, 2207744, 2207744, 2207744, 2207744, 2207744, 2207744, 17, 18, 36884, 45078, 24, 27, 90143, 94242, 0, 102439, 106538, 98347, 0, 0, 20480, 120, 121, 18, 18, 36884, 0, 45078, 0, 24, 24, 24, 27, 27, 27, 27, 90143, 0, 0, 2170880, 0, 53248, 550, 0, 2158592, 2158592, 2158592, 2387968, 2158592, 2158592, 2158592, 2158592, 2158592, 2158592, 0, 40976, 196608, 18, 266240, 24, 24, 27, 27, 27, 0, 94242, 0, 0, 0, 38, 102439, 0, 0, 106538, 98347, 0, 45, 45, 45, 45, 45, 45, 45, 1535, 45, 45, 45, 45, 45, 45, 45, 1416, 45, 45, 45, 45, 45, 45, 45, 45, 424, 45, 45, 45, 45, 45, 45, 45, 45, 45, 405, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 199, 45, 45, 67, 67, 67, 67, 67, 491, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 1766, 67, 67, 67, 1767, 67, 24850, 24850, 12564, 12564, 0, 0, 2166784, 546, 0, 53531, 53531, 0, 286, 97, 97, 0, 0, 97, 97, 97, 97, 97, 97, 0, 0, 97, 97, 0, 97, 97, 97, 45, 45, 45, 45, 45, 45, 67, 67, 67, 67, 67, 67, 67, 67, 67, 743, 57889, 0, 2170880, 0, 0, 550, 0, 97, 97, 97, 97, 97, 97, 97, 97, 97, 45, 45, 45, 45, 45, 45, 45, 45, 1856, 45, 1858, 1859, 67, 67, 67, 1009, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 1021, 67, 67, 67, 67, 67, 25398, 0, 13112, 0, 54074, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2367773, 2158877, 2158877, 2158877, 2158877, 2158877, 2158877, 2699549, 2158877, 2158877, 2158877, 2158877, 2158877, 2748701, 2756893, 2777373, 2801949, 97, 1115, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 857, 97, 67, 67, 67, 67, 67, 1258, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 1826, 67, 97, 97, 97, 97, 97, 97, 1338, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 870, 97, 97, 67, 67, 67, 1463, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 1579, 67, 67, 97, 97, 97, 1518, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 904, 905, 97, 97, 97, 97, 1620, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 0, 921, 0, 0, 0, 0, 0, 0, 45, 1679, 67, 67, 67, 1682, 67, 67, 67, 67, 67, 67, 67, 67, 67, 1690, 67, 0, 0, 97, 97, 97, 97, 45, 45, 67, 67, 0, 0, 97, 97, 45, 45, 45, 669, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 189, 45, 45, 45, 1748, 45, 45, 45, 1749, 1750, 45, 45, 45, 45, 45, 45, 45, 45, 67, 67, 67, 67, 1959, 67, 67, 67, 67, 1768, 67, 67, 67, 67, 67, 67, 67, 67, 97, 97, 97, 97, 97, 97, 97, 97, 97, 1791, 97, 97, 97, 97, 97, 97, 97, 97, 45, 45, 45, 45, 45, 45, 1802, 67, 1817, 67, 67, 67, 67, 67, 67, 1823, 67, 67, 67, 67, 97, 97, 97, 97, 0, 0, 0, 97, 97, 97, 97, 0, 97, 97, 97, 97, 1848, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 659, 45, 45, 45, 45, 45, 45, 45, 1863, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 495, 67, 67, 67, 67, 67, 1878, 97, 97, 97, 97, 0, 0, 0, 97, 97, 97, 97, 0, 0, 97, 97, 97, 97, 97, 0, 0, 0, 97, 97, 97, 97, 97, 97, 45, 45, 45, 45, 45, 45, 45, 45, 45, 67, 67, 67, 67, 97, 97, 97, 97, 0, 0, 0, 1973, 97, 97, 97, 0, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 1165, 97, 1167, 0, 94242, 0, 0, 0, 2211840, 102439, 0, 0, 106538, 98347, 136, 2158592, 2158592, 2158592, 2158592, 2158592, 3158016, 229376, 2375680, 2379776, 2158592, 2158592, 2420736, 2158592, 2449408, 2158592, 2158592, 67, 24850, 24850, 12564, 12564, 0, 0, 280, 547, 0, 53531, 53531, 0, 286, 97, 97, 0, 0, 97, 97, 97, 97, 97, 97, 0, 0, 97, 97, 1789, 97, 57889, 547, 547, 0, 0, 550, 0, 97, 97, 97, 97, 97, 97, 97, 97, 97, 45, 45, 45, 1799, 45, 45, 45, 67, 67, 67, 67, 67, 25398, 0, 13112, 0, 54074, 0, 0, 1092, 0, 0, 0, 0, 0, 97, 97, 97, 97, 1612, 97, 97, 97, 97, 1616, 97, 1297, 1472, 0, 0, 0, 0, 1303, 1474, 0, 0, 0, 0, 1309, 1476, 0, 0, 0, 0, 97, 97, 97, 1481, 97, 97, 97, 97, 97, 97, 1488, 97, 0, 1474, 0, 1476, 0, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 607, 97, 97, 97, 97, 40976, 18, 36884, 45078, 26, 30, 90143, 94242, 0, 102439, 106538, 98347, 0, 0, 213080, 40976, 18, 36884, 45078, 24, 27, 90143, 94242, 0, 102439, 106538, 98347, 0, 0, 143448, 40976, 18, 18, 36884, 0, 45078, 0, 24, 24, 24, 27, 27, 27, 27, 0, 0, 0, 0, 97, 97, 97, 97, 1482, 97, 1483, 97, 97, 97, 97, 97, 97, 1326, 97, 97, 1329, 1330, 97, 97, 97, 97, 97, 97, 1159, 1160, 97, 97, 97, 97, 97, 97, 97, 97, 590, 97, 97, 97, 97, 97, 97, 97, 0, 94242, 0, 0, 0, 2211974, 102439, 0, 0, 106538, 98347, 0, 2158730, 2158730, 2158730, 2158730, 2158730, 2158730, 2158730, 2158730, 2474122, 2158730, 2158730, 2494602, 2158730, 2158730, 2158730, 2809994, 2158730, 2158730, 2842762, 2158730, 2158730, 2158730, 2900106, 2158730, 2158730, 2158730, 2158730, 2158730, 2158730, 2158730, 2158730, 3014794, 2158730, 2158730, 3051658, 2158730, 2158730, 3100810, 2158730, 2158730, 2158730, 2158730, 3096714, 2158730, 2158730, 2158730, 2158730, 2158730, 2158730, 2158730, 2158730, 2158730, 2158730, 2207744, 2207744, 2207744, 2207744, 2207744, 2572288, 2207744, 2207744, 2207744, 2207744, 541, 541, 543, 543, 0, 0, 2166784, 0, 548, 549, 549, 0, 286, 2158877, 2158877, 2158877, 2863389, 2892061, 2158877, 2158877, 2158877, 2158877, 2158877, 2158877, 2158877, 2158877, 2158877, 2158877, 2158877, 3186973, 2158877, 0, 0, 0, 0, 0, 0, 0, 0, 2367626, 2158877, 2404637, 2412829, 2158877, 2158877, 2158877, 2158877, 2158877, 2158877, 2158877, 2158877, 2158877, 2158877, 2158877, 2158877, 2158877, 2158877, 2158877, 2158877, 2564381, 2158877, 2158877, 2605341, 2158877, 2158877, 2158877, 2158877, 2158877, 2158877, 2679069, 2158877, 2695453, 2158877, 2703645, 2158877, 2711837, 2752797, 2158877, 0, 2158877, 2158877, 2158877, 2384010, 2158730, 2158730, 2158730, 2158730, 3006602, 2383872, 2207744, 2207744, 2207744, 2207744, 2207744, 2207744, 2207744, 2441216, 2445312, 2207744, 2207744, 2207744, 2207744, 2207744, 2207744, 2502656, 2158877, 2785565, 2158877, 2810141, 2158877, 2158877, 2842909, 2158877, 2158877, 2158877, 2900253, 2158877, 2158877, 2158877, 2158877, 2158877, 2531613, 2158877, 2158877, 2158877, 2158877, 2158877, 2617629, 2158877, 2158877, 2158877, 2158877, 2158730, 2818186, 2158730, 2158730, 2158730, 2158730, 2158730, 2158730, 2158730, 2158730, 2158730, 2158730, 2158730, 2158730, 2158730, 2158730, 2158730, 2158730, 3105053, 2158877, 2158877, 2158877, 2158877, 2158877, 2158877, 2158877, 2158877, 2158877, 2158877, 2158877, 2158877, 0, 0, 0, 0, 0, 97, 97, 97, 1611, 97, 97, 97, 97, 97, 97, 97, 1496, 97, 97, 1499, 97, 97, 97, 97, 97, 2441354, 2445450, 2158730, 2158730, 2158730, 2158730, 2158730, 2158730, 2502794, 2158730, 2158730, 2158730, 2158730, 2158730, 2158730, 2158730, 2433162, 2158730, 2453642, 2461834, 2158730, 2158730, 2158730, 2158730, 2158730, 2158730, 2580618, 2158730, 2158730, 2158730, 2158730, 2621578, 2158730, 2158730, 2158730, 2158730, 2158730, 2158730, 2699402, 2158730, 2158730, 2158730, 2158730, 2678922, 2158730, 2695306, 2158730, 2703498, 2158730, 2711690, 2752650, 2158730, 2158730, 2785418, 2158730, 2158730, 2158730, 3113098, 2158730, 2158730, 2158730, 2158730, 2158730, 2158730, 2158730, 2158730, 2158730, 3186826, 2158730, 2207744, 2207744, 2207744, 2207744, 2699264, 2207744, 2207744, 2207744, 2207744, 2207744, 2748416, 2756608, 2777088, 2801664, 2207744, 2207744, 2158877, 2158877, 2158877, 2158877, 2158877, 0, 0, 0, 2158877, 2158877, 2158877, 2158877, 0, 0, 2535709, 2543901, 2158877, 2158877, 2158877, 0, 0, 0, 2158877, 2158877, 2158877, 2990365, 2158877, 2158877, 2158730, 2158730, 2158730, 2158730, 2158730, 2572426, 2158877, 2502941, 2158877, 2158877, 2158877, 2158877, 2158877, 2158877, 2158877, 2158877, 2580765, 2158877, 2158877, 2158877, 2158877, 2621725, 2158877, 3019037, 2158877, 3043613, 2158877, 2158877, 2158877, 2158877, 3080477, 2158877, 2158877, 3113245, 2158877, 2158877, 2158877, 2158877, 0, 2158877, 2908445, 2158877, 2158877, 2158877, 2978077, 2158877, 2158877, 2158877, 2158877, 3039517, 2158877, 2158730, 2510986, 2158730, 2158730, 2158730, 2158730, 2158730, 2158730, 2158730, 2584714, 2158730, 2609290, 2158730, 2158730, 2629770, 2158730, 2158730, 2158730, 2388106, 2158730, 2158730, 2158730, 2158730, 2158730, 2158730, 2158730, 2158730, 2158730, 2158730, 2158730, 2158730, 2158730, 2605194, 2158730, 2158730, 2158730, 2158730, 2687114, 2158730, 2715786, 2158730, 2158730, 2158730, 2158730, 2158730, 2158730, 2158730, 2867338, 2158730, 2904202, 2158730, 2158730, 2158730, 2642058, 2158730, 2158730, 2158730, 2158730, 2158730, 2158730, 2158730, 2158730, 2158730, 2158730, 2781322, 2793610, 2158730, 3121290, 2158730, 2158730, 2158730, 3149962, 2158730, 2158730, 3170442, 3174538, 2158730, 2367488, 2207744, 2207744, 2207744, 2207744, 2207744, 2207744, 2207744, 2207744, 2580480, 2207744, 2207744, 2207744, 2207744, 2621440, 2207744, 2207744, 2158877, 2433309, 2158877, 2453789, 2461981, 2158877, 2158877, 2158877, 2158877, 2158877, 2158877, 2511133, 2158877, 2158877, 2158877, 2158877, 2584861, 2158877, 2609437, 2158877, 2158877, 2629917, 2158877, 2158877, 2158877, 2687261, 2158877, 2715933, 2158877, 2158730, 2158730, 2973834, 2158730, 2982026, 2158730, 2158730, 3002506, 2158730, 3047562, 3063946, 3076234, 2158730, 2158730, 2158730, 2158730, 2207744, 2506752, 2207744, 2207744, 2207744, 2207744, 2207744, 2158877, 2507037, 0, 0, 2158877, 2158730, 2158730, 2158730, 3203210, 2207744, 2207744, 2207744, 2207744, 2207744, 2424832, 2207744, 2207744, 2207744, 2207744, 2207744, 2207744, 2207744, 2207744, 2207744, 2207744, 2207744, 2207744, 0, 823, 0, 825, 2707741, 2732317, 2158877, 2158877, 2158877, 2822429, 2826525, 2158877, 2896157, 2158877, 2158877, 2924829, 2158877, 2158877, 2973981, 2158877, 18, 0, 0, 0, 0, 0, 0, 0, 2211840, 0, 0, 642, 0, 2158592, 0, 45, 1529, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 1755, 45, 67, 67, 2982173, 2158877, 2158877, 3002653, 2158877, 3047709, 3064093, 3076381, 2158877, 2158877, 2158877, 2158877, 2158877, 2158877, 2158877, 3203357, 2523274, 2527370, 2158730, 2158730, 2576522, 2158730, 2158730, 2158730, 2158730, 2158730, 2158730, 2158730, 2158730, 2158730, 2158730, 2908298, 2494749, 2158877, 2158877, 2158877, 2523421, 2527517, 2158877, 2158877, 2576669, 2158877, 2158877, 2158877, 2158877, 2158877, 2158877, 0, 40976, 0, 18, 18, 4321280, 2224253, 2232448, 4329472, 2232448, 2158730, 2498698, 2158730, 2158730, 2158730, 2158730, 2568330, 2158730, 2592906, 2625674, 2158730, 2158730, 2674826, 2736266, 2158730, 2158730, 2158730, 2207744, 2207744, 2207744, 2207744, 2207744, 2207744, 2207744, 2207744, 2207744, 2207744, 2207744, 2207744, 2207744, 2207744, 2158730, 2912394, 2158730, 2158730, 2158730, 2158730, 2158730, 2158730, 2158730, 3109002, 2158730, 2158730, 3133578, 3145866, 3154058, 2375680, 2207744, 3108864, 2207744, 2207744, 3133440, 3145728, 3153920, 2375965, 2380061, 2158877, 2158877, 2421021, 2158877, 2449693, 2158877, 2158877, 2158877, 3117341, 2158730, 2158730, 2158730, 2158730, 2158730, 2158730, 2158730, 2158730, 2158730, 2158730, 2158730, 2158730, 3104906, 2158730, 2158730, 2158730, 2158730, 2158730, 2158730, 2158877, 2498845, 2158877, 2158877, 0, 2158877, 2158877, 2568477, 2158877, 2593053, 2625821, 2158877, 2158877, 2674973, 0, 0, 0, 0, 97, 97, 1480, 97, 97, 97, 97, 97, 1485, 97, 97, 97, 0, 97, 97, 1729, 97, 1731, 97, 97, 97, 97, 97, 97, 97, 311, 97, 97, 97, 97, 97, 97, 97, 97, 1520, 97, 97, 1523, 97, 97, 1526, 97, 2736413, 2158877, 2158877, 0, 2158877, 2912541, 2158877, 2158877, 2158877, 2158877, 2158877, 2158877, 2158877, 3109149, 2158877, 2158877, 3014941, 2158877, 2158877, 3051805, 2158877, 2158877, 3100957, 2158877, 2158877, 3121437, 2158877, 2158877, 2158877, 3150109, 3133725, 3146013, 3154205, 2158730, 2408586, 2416778, 2158730, 2465930, 2158730, 2158730, 2158730, 2158730, 2158730, 2158730, 2158730, 2158730, 3018890, 2158730, 3043466, 2158730, 2158730, 2158730, 2158730, 3080330, 2633866, 2658442, 2740362, 2744458, 2834570, 2949258, 2158730, 2986122, 2158730, 2998410, 2158730, 2158730, 2158730, 3129482, 2207744, 2408448, 2949120, 2207744, 2985984, 2207744, 2998272, 2207744, 2207744, 2207744, 3129344, 2158877, 2408733, 2416925, 2158877, 2466077, 2158877, 2158877, 3170589, 3174685, 2158877, 0, 0, 0, 2158730, 2158730, 2158730, 2158730, 2158730, 2424970, 2158730, 2158730, 2158730, 2158730, 2707594, 2732170, 2158730, 2158730, 2158730, 2822282, 2826378, 2158730, 2896010, 2158730, 2158730, 2924682, 2949405, 2158877, 2986269, 2158877, 2998557, 2158877, 2158877, 2158877, 3129629, 2158730, 2158730, 2478218, 2158730, 2158730, 2158730, 2535562, 2543754, 2158730, 2158730, 2158730, 2158730, 2158730, 2158730, 2158730, 2158730, 2158730, 3117194, 2207744, 2207744, 2478080, 2207744, 2207744, 2207744, 2207744, 2781184, 2793472, 2207744, 2818048, 2207744, 2207744, 2207744, 2207744, 2207744, 2207744, 2207744, 2207744, 2207744, 2207744, 2207744, 2207744, 0, 541, 0, 543, 2207744, 2535424, 2543616, 2207744, 2207744, 2207744, 2207744, 2207744, 2207744, 2207744, 2207744, 2207744, 3117056, 2158877, 2158877, 2478365, 0, 2158877, 2158877, 2158877, 2158877, 2158877, 2158877, 2158730, 2158730, 2482314, 2158730, 2158730, 2158730, 2158730, 2158730, 2158730, 2207744, 2207744, 2207744, 2387968, 2207744, 2207744, 2207744, 2207744, 2207744, 2207744, 2207744, 2207744, 2207744, 2207744, 2207744, 2207744, 0, 542, 0, 544, 2158730, 2158730, 2158730, 2990218, 2158730, 2158730, 2207744, 2207744, 2482176, 2207744, 2207744, 2207744, 2207744, 2207744, 2207744, 2207744, 0, 0, 0, 0, 0, 0, 2162688, 135, 0, 2207744, 2207744, 2990080, 2207744, 2207744, 2158877, 2158877, 2482461, 2158877, 2158877, 0, 0, 0, 2158877, 2158877, 2158877, 2158877, 2158877, 2158730, 2429066, 2158730, 2515082, 2158730, 2588810, 2158730, 2838666, 2158730, 2158730, 2158730, 3010698, 2207744, 2428928, 2207744, 2514944, 2207744, 2588672, 2207744, 2838528, 2207744, 2207744, 2207744, 3010560, 2158877, 2429213, 2158877, 2515229, 0, 0, 2158877, 2588957, 2158877, 0, 2838813, 2158877, 2158877, 2158877, 3010845, 2158730, 2506890, 2158730, 2158730, 2158730, 2748554, 2756746, 2777226, 2801802, 2158730, 2158730, 2158730, 2863242, 2891914, 2158730, 2158730, 2158730, 2158730, 2158730, 2158730, 2564234, 2158730, 2158730, 2158730, 2158730, 2158730, 2597002, 2158730, 2158730, 2158730, 3006464, 2384157, 0, 0, 2158877, 2158877, 2158877, 2158877, 3006749, 2158730, 2637962, 2953354, 2158730, 2207744, 2637824, 2953216, 2207744, 0, 0, 2158877, 2638109, 2953501, 2158877, 2539658, 2158730, 2539520, 2207744, 0, 0, 2539805, 2158877, 2158730, 2158730, 2158730, 2977930, 2158730, 2158730, 2158730, 2158730, 3039370, 2158730, 2158730, 2158730, 2158730, 2158730, 2158730, 3158154, 2207744, 0, 2158877, 2158730, 2207744, 0, 2158877, 2158730, 2207744, 0, 2158877, 2965642, 2965504, 2965789, 0, 0, 0, 0, 1315, 0, 0, 0, 0, 97, 97, 97, 97, 97, 97, 97, 1484, 97, 97, 97, 97, 2158592, 18, 0, 122880, 0, 0, 0, 77824, 0, 2211840, 0, 0, 0, 0, 2158592, 0, 356, 0, 0, 0, 0, 0, 0, 28809, 0, 139, 45, 45, 45, 45, 45, 45, 1751, 45, 45, 45, 45, 45, 45, 45, 67, 67, 1427, 67, 67, 67, 67, 67, 1432, 67, 67, 67, 3104768, 2158592, 2158592, 2158592, 2158592, 2158592, 2158592, 2158592, 2158592, 2158592, 2158592, 2158592, 2158592, 122880, 0, 0, 0, 0, 1315, 0, 0, 0, 0, 97, 97, 97, 97, 97, 97, 1322, 550, 0, 286, 0, 2158592, 2158592, 2158592, 2158592, 2158592, 2424832, 2158592, 2158592, 2158592, 2158592, 2158592, 2158592, 0, 40976, 0, 18, 18, 24, 24, 4329472, 27, 27, 2207744, 2207744, 2977792, 2207744, 2207744, 2207744, 2207744, 3039232, 2207744, 2207744, 2207744, 2207744, 2207744, 2207744, 3158016, 542, 0, 0, 0, 542, 0, 544, 0, 0, 0, 544, 0, 550, 0, 0, 0, 0, 0, 97, 97, 1610, 97, 97, 97, 97, 97, 97, 97, 97, 898, 97, 97, 97, 97, 97, 97, 97, 0, 94242, 0, 0, 0, 2211840, 0, 0, 0, 0, 0, 0, 2158592, 2158592, 2158592, 2158592, 2158592, 2424832, 2158592, 2158592, 2158592, 2158592, 2158592, 2158592, 40976, 18, 36884, 45078, 24, 27, 90143, 94242, 237568, 102439, 106538, 98347, 0, 0, 20480, 40976, 18, 36884, 45078, 24, 27, 90143, 94242, 0, 102439, 106538, 98347, 0, 0, 192512, 40976, 18, 36884, 45078, 24, 27, 90143, 94242, 0, 102439, 106538, 98347, 0, 0, 94, 40976, 18, 36884, 45078, 24, 27, 90143, 94242, 0, 102439, 106538, 98347, 0, 0, 96, 40976, 18, 36884, 45078, 24, 27, 90143, 94242, 0, 102439, 106538, 98347, 0, 0, 12378, 40976, 18, 18, 36884, 0, 45078, 0, 24, 24, 24, 126, 126, 126, 126, 90143, 0, 0, 2170880, 0, 0, 0, 0, 2158592, 2158592, 2158592, 2387968, 2158592, 2158592, 2158592, 2158592, 2158592, 2158592, 20480, 40976, 0, 18, 18, 24, 24, 27, 27, 27, 40976, 18, 36884, 45078, 24, 27, 90143, 94242, 241664, 102439, 106538, 98347, 0, 0, 20568, 40976, 18, 36884, 45078, 24, 27, 90143, 94242, 0, 102439, 106538, 98347, 0, 0, 200797, 40976, 18, 36884, 45078, 24, 27, 90143, 94242, 0, 102439, 106538, 98347, 0, 0, 20480, 40976, 18, 36884, 45078, 24, 27, 90143, 94242, 0, 0, 0, 44, 0, 0, 20575, 40976, 18, 36884, 45078, 24, 27, 90143, 94242, 0, 41, 41, 41, 0, 0, 1126400, 40976, 18, 36884, 45078, 24, 27, 90143, 94242, 0, 102439, 106538, 98347, 0, 0, 0, 40976, 18, 36884, 45078, 24, 27, 90143, 94242, 0, 102439, 106538, 98347, 0, 0, 89, 40976, 18, 18, 36884, 0, 45078, 0, 24, 24, 24, 27, 131201, 27, 27, 90143, 0, 0, 2170880, 0, 0, 550, 0, 2158592, 2158592, 2158592, 2387968, 2158592, 2158592, 2158592, 2158592, 2158592, 2158592, 2158592, 2158592, 2158592, 2158592, 2158592, 2158592, 2441216, 2445312, 2158592, 2158592, 2158592, 2158592, 2158592, 0, 94242, 0, 0, 208896, 2211840, 102439, 0, 0, 106538, 98347, 0, 2158592, 2158592, 2158592, 2158592, 2158592, 3186688, 2158592, 0, 0, 0, 0, 0, 0, 0, 0, 2367488, 32768, 0, 0, 0, 0, 0, 0, 2158592, 2158592, 2158592, 2158592, 2158592, 2158592, 2158592, 2158592, 2158592, 2433024, 2158592, 2453504, 2461696, 2158592, 2158592, 2158592, 2158592, 2158592, 2158592, 2510848, 2158592, 2158592, 2158592, 2158592, 40976, 18, 36884, 245783, 24, 27, 90143, 94242, 0, 102439, 106538, 98347, 0, 0, 20480, 40976, 18, 36884, 45078, 24, 27, 90143, 94242, 0, 102439, 106538, 98347, 0, 0, 221184, 40976, 18, 36884, 45078, 24, 27, 90143, 94242, 0, 102439, 106538, 98347, 0, 0, 180224, 40976, 18, 18, 36884, 155648, 45078, 0, 24, 24, 217088, 27, 27, 27, 217088, 90143, 0, 0, 2170880, 0, 0, 828, 0, 2158592, 2158592, 2158592, 2387968, 2158592, 2158592, 2158592, 2158592, 2158592, 2158592, 2207744, 2207744, 2207744, 2387968, 2207744, 2207744, 2207744, 2207744, 2207744, 2207744, 2207744, 0, 0, 0, 0, 0, 0, 2162688, 233472, 0, 0, 94242, 0, 0, 0, 38, 102439, 0, 0, 106538, 98347, 28809, 45, 45, 45, 45, 45, 718, 45, 45, 45, 45, 45, 45, 45, 45, 45, 727, 131427, 0, 0, 0, 0, 362, 0, 365, 28809, 367, 139, 45, 45, 45, 45, 45, 45, 1808, 45, 45, 45, 45, 67, 67, 67, 67, 67, 67, 67, 97, 97, 0, 0, 97, 67, 24850, 24850, 12564, 12564, 0, 57889, 0, 0, 0, 53531, 53531, 367, 286, 97, 97, 0, 0, 97, 97, 97, 97, 97, 97, 0, 1788, 97, 97, 0, 97, 2024, 97, 45, 45, 45, 45, 45, 45, 67, 67, 67, 67, 67, 67, 67, 67, 235, 67, 67, 67, 67, 67, 57889, 0, 0, 54074, 54074, 550, 0, 97, 97, 97, 97, 97, 97, 97, 97, 97, 45, 1798, 45, 45, 1800, 45, 45, 0, 1472, 0, 0, 0, 0, 0, 1474, 0, 0, 0, 0, 0, 1476, 0, 0, 0, 0, 1315, 0, 0, 0, 0, 97, 97, 97, 97, 1320, 97, 97, 0, 0, 97, 97, 97, 97, 97, 97, 1787, 0, 97, 97, 0, 97, 97, 97, 45, 45, 45, 45, 2029, 45, 67, 67, 67, 67, 2033, 1527, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 663, 67, 24850, 24850, 12564, 12564, 0, 57889, 281, 0, 0, 53531, 53531, 367, 286, 97, 97, 0, 0, 97, 97, 97, 97, 1786, 97, 0, 0, 97, 97, 0, 1790, 40976, 19, 36884, 45078, 24, 27, 90143, 94242, 0, 102439, 106538, 98347, 0, 0, 262144, 40976, 18, 36884, 45078, 24, 27, 90143, 94242, 38, 102439, 106538, 98347, 46, 67, 98, 40976, 18, 36884, 45078, 24, 27, 90143, 94242, 38, 102439, 106538, 98347, 45, 67, 97, 40976, 18, 36884, 45078, 24, 27, 90143, 94242, 0, 102439, 106538, 98347, 0, 0, 258048, 40976, 18, 36884, 45078, 24, 27, 90143, 94242, 0, 102439, 106538, 98347, 0, 0, 1122423, 40976, 18, 36884, 45078, 24, 27, 90143, 94242, 0, 1114152, 1114152, 1114152, 0, 0, 1114112, 40976, 18, 36884, 45078, 24, 27, 90143, 94242, 37, 102439, 106538, 98347, 0, 0, 204800, 40976, 18, 36884, 45078, 24, 27, 90143, 94242, 0, 102439, 106538, 98347, 0, 0, 57436, 40976, 18, 36884, 45078, 24, 27, 33, 33, 0, 33, 33, 33, 0, 0, 0, 40976, 18, 18, 36884, 0, 45078, 0, 124, 124, 124, 127, 127, 127, 127, 90143, 0, 0, 2170880, 0, 0, 550, 0, 2158877, 2158877, 2158877, 2388253, 2158877, 2158877, 2158877, 2158877, 2158877, 2781469, 2793757, 2158877, 2818333, 2158877, 2158877, 2158877, 2158877, 2158877, 2158877, 2158877, 2867485, 2158877, 2904349, 2158877, 2158877, 2158877, 2158877, 2158877, 2158877, 2158877, 3096861, 2158877, 2158877, 2158877, 2158877, 2158877, 2158877, 2158877, 2158877, 2158877, 2441501, 2445597, 2158877, 2158877, 2158877, 2158877, 2158877, 40976, 122, 123, 36884, 0, 45078, 0, 24, 24, 24, 27, 27, 27, 27, 90143, 0, 921, 29315, 0, 0, 0, 0, 45, 45, 45, 45, 45, 45, 45, 45, 936, 2158592, 4243810, 0, 0, 0, 0, 0, 0, 0, 2211840, 0, 0, 0, 0, 2158592, 0, 921, 29315, 0, 0, 0, 0, 45, 45, 45, 45, 45, 45, 45, 935, 45, 45, 45, 715, 45, 45, 45, 45, 45, 45, 45, 723, 45, 45, 45, 45, 45, 1182, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 430, 45, 45, 45, 45, 45, 40976, 18, 36884, 45078, 24, 27, 90143, 94242, 38, 102439, 106538, 98347, 47, 68, 99, 40976, 18, 36884, 45078, 24, 27, 90143, 94242, 38, 102439, 106538, 98347, 48, 69, 100, 40976, 18, 36884, 45078, 24, 27, 90143, 94242, 38, 102439, 106538, 98347, 49, 70, 101, 40976, 18, 36884, 45078, 24, 27, 90143, 94242, 38, 102439, 106538, 98347, 50, 71, 102, 40976, 18, 36884, 45078, 24, 27, 90143, 94242, 38, 102439, 106538, 98347, 51, 72, 103, 40976, 18, 36884, 45078, 24, 27, 90143, 94242, 38, 102439, 106538, 98347, 52, 73, 104, 40976, 18, 36884, 45078, 24, 27, 90143, 94242, 38, 102439, 106538, 98347, 53, 74, 105, 40976, 18, 36884, 45078, 24, 27, 90143, 94242, 38, 102439, 106538, 98347, 54, 75, 106, 40976, 18, 36884, 45078, 24, 27, 90143, 94242, 38, 102439, 106538, 98347, 55, 76, 107, 40976, 18, 36884, 45078, 24, 27, 90143, 94242, 38, 102439, 106538, 98347, 56, 77, 108, 40976, 18, 36884, 45078, 24, 27, 90143, 94242, 38, 102439, 106538, 98347, 57, 78, 109, 40976, 18, 36884, 45078, 24, 27, 90143, 94242, 38, 102439, 106538, 98347, 58, 79, 110, 40976, 18, 36884, 45078, 24, 27, 90143, 94242, 38, 102439, 106538, 98347, 59, 80, 111, 40976, 18, 36884, 45078, 24, 27, 90143, 94242, 38, 102439, 106538, 98347, 60, 81, 112, 40976, 18, 36884, 45078, 24, 27, 90143, 94242, 38, 102439, 106538, 98347, 61, 82, 113, 40976, 18, 36884, 45078, 24, 27, 90143, 94242, 38, 102439, 106538, 98347, 62, 83, 114, 40976, 18, 36884, 45078, 24, 27, 90143, 94242, 38, 102439, 106538, 98347, 63, 84, 115, 40976, 18, 36884, 45078, 24, 27, 90143, 94242, 38, 102439, 106538, 98347, 64, 85, 116, 40976, 18, 36884, 45078, 24, 27, 90143, 94242, 38, 102439, 106538, 98347, 65, 86, 117, 40976, 18, 36884, 45078, 24, 27, 90143, 94242, 38, 102439, 106538, 98347, 66, 87, 118, 40976, 18, 36884, 45078, 24, 27, 90143, 94242, 118820, 102439, 106538, 98347, 118820, 118820, 118820, 40976, 18, 18, 0, 0, 45078, 0, 24, 24, 24, 27, 27, 27, 27, 90143, 0, 0, 1314, 0, 0, 0, 0, 0, 0, 97, 97, 97, 97, 97, 1321, 97, 18, 131427, 0, 0, 0, 0, 0, 0, 362, 0, 0, 365, 0, 367, 0, 0, 1315, 0, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 1360, 97, 97, 131, 94242, 0, 0, 0, 38, 102439, 0, 0, 106538, 98347, 28809, 45, 45, 45, 145, 149, 45, 45, 45, 45, 45, 174, 45, 179, 45, 185, 45, 188, 45, 45, 202, 67, 255, 67, 67, 269, 67, 67, 0, 24850, 12564, 0, 0, 0, 0, 28809, 53531, 97, 97, 97, 292, 296, 97, 97, 97, 97, 97, 321, 97, 326, 97, 332, 97, 18, 131427, 0, 0, 0, 0, 0, 0, 362, 0, 0, 365, 29315, 367, 646, 335, 97, 97, 349, 97, 97, 0, 40976, 0, 18, 18, 24, 24, 27, 27, 27, 437, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 67, 67, 67, 67, 67, 67, 67, 67, 523, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 511, 67, 67, 67, 97, 97, 97, 620, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 1501, 1502, 97, 793, 67, 67, 796, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 808, 67, 0, 0, 97, 97, 97, 97, 45, 45, 67, 67, 0, 0, 97, 97, 2052, 67, 67, 67, 67, 813, 67, 67, 67, 67, 67, 67, 67, 25398, 542, 13112, 544, 57889, 0, 0, 54074, 54074, 550, 830, 97, 97, 97, 97, 97, 97, 97, 97, 97, 315, 97, 97, 97, 97, 97, 97, 841, 97, 97, 97, 97, 97, 97, 97, 97, 97, 854, 97, 97, 97, 97, 97, 97, 589, 97, 97, 97, 97, 97, 97, 97, 97, 97, 867, 97, 97, 97, 97, 97, 97, 97, 891, 97, 97, 894, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 906, 45, 937, 45, 45, 940, 45, 45, 45, 45, 45, 45, 948, 45, 45, 45, 45, 45, 734, 735, 67, 737, 67, 738, 67, 740, 67, 67, 67, 45, 967, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 435, 45, 45, 45, 980, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 415, 45, 45, 67, 67, 1024, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 97, 97, 97, 67, 67, 67, 67, 67, 25398, 1081, 13112, 1085, 54074, 1089, 0, 0, 0, 0, 0, 0, 363, 0, 28809, 0, 139, 45, 45, 45, 45, 45, 45, 1674, 45, 45, 45, 45, 45, 45, 45, 45, 67, 1913, 67, 1914, 67, 67, 67, 1918, 67, 67, 97, 97, 97, 97, 1118, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 630, 97, 97, 97, 97, 97, 1169, 97, 97, 97, 97, 97, 0, 921, 0, 1175, 0, 0, 0, 0, 45, 45, 45, 45, 45, 45, 1534, 45, 45, 45, 45, 45, 1538, 45, 45, 45, 45, 1233, 45, 45, 45, 45, 45, 45, 67, 67, 67, 67, 67, 67, 67, 67, 742, 67, 45, 45, 1191, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 454, 67, 67, 67, 67, 1243, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 1251, 67, 0, 0, 97, 97, 97, 97, 45, 45, 67, 67, 2050, 0, 97, 97, 45, 45, 45, 732, 45, 45, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 97, 97, 67, 67, 67, 1284, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 772, 67, 67, 67, 1293, 67, 67, 67, 67, 67, 67, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 368, 2158592, 2158592, 2158592, 2404352, 2412544, 1323, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 1331, 97, 97, 97, 0, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 1737, 97, 1364, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 1373, 97, 18, 131427, 0, 0, 0, 0, 0, 0, 362, 0, 0, 365, 29315, 367, 647, 45, 45, 1387, 45, 45, 1391, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 410, 45, 45, 45, 45, 45, 1400, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 1407, 45, 45, 45, 45, 45, 941, 45, 943, 45, 45, 45, 45, 45, 45, 951, 45, 67, 1438, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 1447, 67, 67, 67, 67, 67, 67, 799, 67, 67, 67, 804, 67, 67, 67, 67, 67, 67, 67, 1443, 67, 67, 1446, 67, 67, 67, 67, 67, 67, 67, 1298, 0, 0, 0, 1304, 0, 0, 0, 1310, 97, 1491, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 1500, 97, 97, 97, 0, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 1736, 97, 45, 45, 1541, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 677, 45, 45, 67, 1581, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 791, 792, 67, 67, 67, 67, 1598, 67, 1600, 67, 67, 67, 67, 67, 67, 67, 67, 1472, 97, 97, 97, 1727, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 1513, 97, 97, 67, 67, 97, 1879, 97, 1881, 97, 0, 1884, 0, 97, 97, 97, 97, 0, 0, 97, 97, 97, 97, 97, 0, 0, 0, 1842, 97, 97, 67, 67, 67, 67, 67, 97, 97, 97, 97, 1928, 0, 0, 0, 97, 97, 97, 97, 97, 97, 45, 45, 45, 45, 45, 1903, 45, 45, 45, 67, 67, 67, 67, 97, 97, 97, 97, 1971, 0, 0, 97, 97, 97, 97, 0, 97, 97, 97, 97, 97, 97, 97, 97, 97, 0, 0, 0, 45, 45, 45, 1381, 45, 45, 45, 45, 1976, 97, 97, 97, 97, 97, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 1747, 809, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 25398, 542, 13112, 544, 97, 907, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 638, 0, 0, 0, 0, 1478, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 1150, 97, 97, 97, 97, 67, 67, 67, 67, 1244, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 477, 67, 67, 67, 67, 67, 67, 1294, 67, 67, 67, 67, 0, 0, 0, 0, 0, 0, 0, 0, 0, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 1324, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 0, 0, 0, 1374, 97, 97, 97, 97, 0, 1175, 0, 45, 45, 45, 45, 45, 45, 45, 45, 945, 45, 45, 45, 45, 45, 45, 45, 45, 1908, 45, 45, 1910, 45, 67, 67, 67, 67, 67, 67, 67, 67, 1919, 67, 0, 0, 97, 97, 97, 97, 45, 2048, 67, 2049, 0, 0, 97, 2051, 45, 45, 45, 939, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 397, 45, 45, 45, 1921, 67, 67, 1923, 67, 97, 97, 97, 97, 97, 0, 0, 0, 97, 97, 97, 97, 97, 97, 45, 45, 45, 45, 1947, 45, 1935, 0, 0, 0, 97, 1939, 97, 97, 1941, 97, 45, 45, 45, 45, 45, 45, 382, 389, 45, 45, 45, 45, 45, 45, 45, 45, 1810, 45, 45, 1812, 67, 67, 67, 67, 67, 256, 67, 67, 67, 67, 67, 0, 24850, 12564, 0, 0, 0, 0, 28809, 53531, 336, 97, 97, 97, 97, 97, 0, 40976, 0, 18, 18, 24, 24, 27, 27, 27, 131427, 0, 0, 0, 0, 362, 0, 365, 28809, 367, 139, 45, 45, 371, 373, 45, 45, 45, 955, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 413, 45, 45, 45, 457, 459, 67, 67, 67, 67, 67, 67, 67, 67, 473, 67, 478, 67, 67, 482, 67, 67, 485, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 97, 1828, 97, 554, 556, 97, 97, 97, 97, 97, 97, 97, 97, 570, 97, 575, 97, 97, 579, 97, 97, 582, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 330, 97, 97, 67, 746, 67, 67, 67, 67, 67, 67, 67, 67, 67, 758, 67, 67, 67, 67, 67, 67, 67, 1587, 67, 1589, 67, 67, 67, 67, 67, 67, 67, 97, 1706, 97, 97, 97, 1709, 97, 97, 97, 97, 97, 844, 97, 97, 97, 97, 97, 97, 97, 97, 97, 856, 97, 97, 97, 0, 97, 97, 97, 97, 97, 97, 97, 97, 1735, 97, 97, 97, 0, 97, 97, 97, 97, 97, 97, 97, 1642, 97, 1644, 97, 97, 890, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 0, 67, 67, 67, 67, 1065, 1066, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 532, 67, 67, 67, 67, 67, 67, 67, 1451, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 496, 67, 67, 97, 97, 1505, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 593, 97, 97, 0, 1474, 0, 1476, 0, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 1617, 97, 97, 1635, 0, 1637, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 885, 97, 97, 97, 97, 67, 67, 1704, 67, 67, 67, 67, 97, 97, 97, 97, 97, 97, 97, 97, 97, 565, 572, 97, 97, 97, 97, 97, 97, 97, 97, 1832, 0, 97, 97, 97, 97, 97, 0, 0, 0, 97, 97, 97, 97, 97, 97, 45, 45, 45, 1946, 45, 45, 67, 67, 67, 67, 67, 97, 1926, 97, 1927, 97, 0, 0, 0, 97, 97, 1934, 2043, 0, 0, 97, 97, 97, 2047, 45, 45, 67, 67, 0, 1832, 97, 97, 45, 45, 45, 981, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 1227, 45, 45, 45, 131427, 0, 0, 0, 0, 362, 0, 365, 28809, 367, 139, 45, 45, 372, 45, 45, 45, 45, 1661, 1662, 45, 45, 45, 45, 45, 1666, 45, 45, 45, 45, 45, 1673, 45, 1675, 45, 45, 45, 45, 45, 45, 45, 67, 1426, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 1275, 67, 67, 67, 67, 67, 45, 418, 45, 45, 420, 45, 45, 423, 45, 45, 45, 45, 45, 45, 45, 45, 959, 45, 45, 962, 45, 45, 45, 45, 458, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 483, 67, 67, 67, 67, 504, 67, 67, 506, 67, 67, 509, 67, 67, 67, 67, 67, 67, 67, 753, 67, 67, 67, 67, 67, 67, 67, 67, 467, 67, 67, 67, 67, 67, 67, 67, 555, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 580, 97, 97, 97, 97, 601, 97, 97, 603, 97, 97, 606, 97, 97, 97, 97, 97, 97, 848, 97, 97, 97, 97, 97, 97, 97, 97, 97, 1498, 97, 97, 97, 97, 97, 97, 45, 45, 714, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 989, 990, 45, 67, 67, 67, 67, 67, 1011, 67, 67, 67, 67, 1015, 67, 67, 67, 67, 67, 67, 67, 768, 67, 67, 67, 67, 67, 67, 67, 67, 769, 67, 67, 67, 67, 67, 67, 67, 45, 45, 1179, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 1003, 1004, 67, 1217, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 728, 67, 1461, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 1034, 67, 97, 1516, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 871, 97, 67, 67, 67, 1705, 67, 67, 67, 97, 97, 97, 97, 97, 97, 97, 97, 97, 567, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 1715, 97, 97, 97, 97, 97, 97, 97, 97, 97, 0, 0, 0, 45, 45, 1380, 45, 45, 45, 45, 45, 67, 67, 97, 97, 97, 97, 97, 0, 0, 0, 97, 1887, 97, 97, 0, 0, 97, 97, 97, 0, 97, 97, 97, 97, 97, 2006, 45, 45, 1907, 45, 45, 45, 45, 45, 67, 67, 67, 67, 67, 67, 67, 67, 67, 1920, 67, 97, 0, 2035, 97, 97, 97, 97, 97, 45, 45, 45, 45, 67, 67, 67, 1428, 67, 67, 67, 67, 67, 67, 1435, 67, 0, 94242, 0, 0, 0, 38, 102439, 0, 0, 106538, 98347, 28809, 45, 45, 45, 146, 45, 152, 45, 45, 165, 45, 175, 45, 180, 45, 45, 187, 190, 195, 45, 203, 254, 257, 262, 67, 270, 67, 67, 0, 24850, 12564, 0, 0, 0, 281, 28809, 53531, 97, 97, 97, 293, 97, 299, 97, 97, 312, 97, 322, 97, 327, 97, 97, 334, 337, 342, 97, 350, 97, 97, 0, 40976, 0, 18, 18, 24, 24, 27, 27, 27, 67, 484, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 499, 97, 581, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 596, 648, 45, 650, 45, 651, 45, 653, 45, 45, 45, 657, 45, 45, 45, 45, 45, 45, 1954, 67, 67, 67, 1958, 67, 67, 67, 67, 67, 67, 67, 783, 67, 67, 67, 788, 67, 67, 67, 67, 680, 45, 45, 45, 45, 45, 45, 45, 45, 688, 689, 691, 45, 45, 45, 45, 45, 983, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 947, 45, 45, 45, 45, 952, 45, 45, 698, 699, 45, 45, 702, 703, 45, 45, 45, 45, 45, 45, 45, 711, 744, 67, 67, 67, 67, 67, 67, 67, 67, 67, 757, 67, 67, 67, 67, 761, 67, 67, 67, 67, 765, 67, 767, 67, 67, 67, 67, 67, 67, 67, 67, 775, 776, 778, 67, 67, 67, 67, 67, 67, 785, 786, 67, 67, 789, 790, 67, 67, 67, 67, 67, 67, 1574, 67, 67, 67, 67, 67, 1578, 67, 67, 67, 67, 67, 67, 1012, 67, 67, 67, 67, 67, 67, 67, 67, 67, 468, 475, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 798, 67, 67, 67, 802, 67, 67, 67, 67, 67, 67, 67, 67, 1588, 67, 67, 67, 67, 67, 67, 67, 0, 24850, 12564, 0, 0, 0, 0, 28809, 53531, 67, 810, 67, 67, 67, 67, 67, 67, 67, 67, 67, 821, 25398, 542, 13112, 544, 57889, 0, 0, 54074, 54074, 550, 0, 833, 97, 835, 97, 836, 97, 838, 97, 97, 0, 0, 97, 97, 97, 1785, 97, 97, 0, 0, 97, 97, 0, 97, 97, 1979, 97, 97, 45, 45, 1983, 45, 1984, 45, 45, 45, 45, 45, 652, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 690, 45, 45, 694, 45, 45, 97, 842, 97, 97, 97, 97, 97, 97, 97, 97, 97, 855, 97, 97, 97, 97, 0, 1717, 1718, 97, 97, 97, 97, 97, 1722, 97, 0, 0, 859, 97, 97, 97, 97, 863, 97, 865, 97, 97, 97, 97, 97, 97, 97, 97, 604, 97, 97, 97, 97, 97, 97, 97, 873, 874, 876, 97, 97, 97, 97, 97, 97, 883, 884, 97, 97, 887, 888, 97, 18, 131427, 0, 0, 0, 0, 0, 0, 362, 225280, 0, 365, 0, 367, 0, 45, 45, 45, 1531, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 1199, 45, 45, 45, 45, 45, 97, 97, 908, 97, 97, 97, 97, 97, 97, 97, 97, 97, 919, 638, 0, 0, 0, 0, 2158877, 2158877, 2158877, 2158877, 2158877, 2425117, 2158877, 2158877, 2158877, 2158877, 2158877, 2158877, 2597149, 2158877, 2158877, 2158877, 2158877, 2158877, 2158877, 2642205, 2158877, 2158877, 2158877, 2158877, 2158877, 3158301, 0, 2375818, 2379914, 2158730, 2158730, 2420874, 2158730, 2449546, 2158730, 2158730, 953, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 965, 978, 45, 45, 45, 45, 45, 45, 985, 45, 45, 45, 45, 45, 45, 45, 45, 971, 45, 45, 45, 45, 45, 45, 45, 67, 67, 67, 67, 67, 1027, 67, 1029, 67, 67, 67, 67, 67, 67, 67, 67, 67, 1455, 67, 67, 67, 67, 67, 67, 67, 1077, 1078, 67, 67, 25398, 0, 13112, 0, 54074, 0, 0, 0, 0, 0, 0, 0, 0, 366, 0, 139, 2158730, 2158730, 2158730, 2404490, 2412682, 1113, 97, 97, 97, 97, 97, 97, 1121, 97, 1123, 97, 97, 97, 97, 97, 97, 0, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 1540, 1155, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 615, 1168, 97, 97, 1171, 1172, 97, 97, 0, 921, 0, 1175, 0, 0, 0, 0, 45, 45, 45, 45, 45, 1533, 45, 45, 45, 45, 45, 45, 45, 45, 45, 1559, 1561, 45, 45, 45, 1564, 45, 1566, 1567, 45, 45, 45, 1219, 45, 45, 45, 45, 45, 45, 45, 1226, 45, 45, 45, 45, 45, 168, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 427, 45, 45, 45, 45, 45, 45, 45, 1231, 45, 45, 45, 45, 45, 45, 45, 45, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 1242, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 1046, 67, 67, 1254, 67, 1256, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 806, 807, 67, 67, 97, 1336, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 1111, 97, 97, 97, 97, 97, 1351, 97, 97, 97, 1354, 97, 97, 97, 1359, 97, 97, 97, 0, 97, 97, 97, 97, 1640, 97, 97, 97, 97, 97, 97, 97, 897, 97, 97, 97, 902, 97, 97, 97, 97, 97, 97, 97, 97, 1366, 97, 97, 97, 97, 97, 97, 97, 1371, 97, 97, 97, 0, 97, 97, 97, 1730, 97, 97, 97, 97, 97, 97, 97, 97, 915, 97, 97, 97, 97, 0, 360, 0, 67, 67, 67, 1440, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 1017, 67, 1019, 67, 67, 67, 67, 67, 1453, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 1459, 97, 97, 97, 1493, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 1525, 97, 97, 97, 97, 97, 97, 1507, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 1514, 67, 67, 67, 67, 1584, 67, 67, 67, 67, 67, 1590, 67, 67, 67, 67, 67, 67, 67, 784, 67, 67, 67, 67, 67, 67, 67, 67, 1055, 67, 67, 67, 67, 1060, 67, 67, 67, 67, 67, 67, 67, 1599, 1601, 67, 67, 67, 1604, 67, 1606, 1607, 67, 1472, 0, 1474, 0, 1476, 0, 97, 97, 97, 97, 97, 97, 1614, 97, 97, 97, 97, 45, 45, 1850, 45, 45, 45, 45, 1855, 45, 45, 45, 45, 45, 1222, 45, 45, 45, 45, 45, 45, 45, 45, 45, 1229, 97, 1618, 97, 97, 97, 97, 97, 97, 97, 1625, 97, 97, 97, 97, 97, 0, 1175, 0, 45, 45, 45, 45, 45, 45, 45, 45, 447, 45, 45, 45, 45, 45, 67, 67, 1633, 97, 97, 0, 97, 97, 97, 97, 97, 97, 97, 97, 1643, 1645, 97, 97, 0, 0, 97, 97, 97, 2002, 97, 97, 97, 97, 97, 45, 45, 45, 45, 45, 1740, 45, 45, 45, 1744, 45, 45, 45, 97, 1648, 97, 1650, 1651, 97, 0, 45, 45, 45, 1654, 45, 45, 45, 45, 45, 169, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 658, 45, 45, 45, 45, 664, 45, 45, 1659, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 1187, 45, 45, 1669, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 67, 1005, 67, 67, 1681, 67, 67, 67, 67, 67, 67, 67, 1686, 67, 67, 67, 67, 67, 67, 67, 800, 67, 67, 67, 67, 67, 67, 67, 67, 67, 1603, 67, 67, 67, 67, 67, 0, 97, 97, 1713, 97, 0, 97, 97, 97, 97, 97, 97, 97, 97, 97, 0, 0, 0, 1378, 45, 45, 45, 45, 45, 45, 45, 408, 45, 45, 45, 45, 45, 45, 45, 45, 1547, 45, 1549, 45, 45, 45, 45, 45, 97, 97, 1780, 0, 97, 97, 97, 97, 97, 97, 0, 0, 97, 97, 0, 97, 97, 97, 45, 45, 2027, 2028, 45, 45, 67, 67, 2031, 2032, 67, 45, 45, 1804, 45, 45, 45, 45, 45, 45, 45, 45, 67, 67, 67, 67, 67, 67, 1917, 67, 67, 67, 67, 67, 67, 67, 1819, 67, 67, 67, 67, 67, 67, 67, 67, 97, 97, 97, 1708, 97, 97, 97, 97, 97, 45, 45, 1862, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 497, 67, 67, 67, 1877, 97, 97, 97, 97, 97, 0, 0, 0, 97, 97, 97, 97, 0, 0, 97, 97, 97, 97, 97, 1839, 0, 0, 97, 97, 97, 97, 1936, 0, 0, 97, 97, 97, 97, 97, 97, 1943, 1944, 1945, 45, 45, 45, 45, 670, 45, 45, 45, 45, 674, 45, 45, 45, 45, 678, 45, 1948, 45, 1950, 45, 45, 45, 45, 1955, 1956, 1957, 67, 67, 67, 1960, 67, 1962, 67, 67, 67, 67, 1967, 1968, 1969, 97, 0, 0, 0, 97, 97, 1974, 97, 0, 1936, 0, 97, 97, 97, 97, 97, 97, 45, 45, 45, 45, 45, 45, 45, 45, 1906, 0, 1977, 97, 97, 97, 97, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 1746, 45, 45, 45, 45, 2011, 67, 67, 2013, 67, 67, 67, 2017, 97, 97, 0, 0, 2021, 97, 8192, 97, 97, 2025, 45, 45, 45, 45, 45, 45, 67, 67, 67, 67, 67, 1916, 67, 67, 67, 67, 0, 94242, 0, 0, 0, 38, 102439, 0, 0, 106538, 98347, 28809, 45, 45, 140, 45, 45, 45, 1180, 45, 45, 45, 45, 1184, 45, 45, 45, 45, 45, 45, 45, 387, 45, 392, 45, 45, 396, 45, 45, 399, 45, 45, 67, 207, 67, 67, 67, 67, 67, 67, 236, 67, 67, 67, 67, 67, 67, 67, 817, 67, 67, 67, 67, 25398, 542, 13112, 544, 97, 97, 287, 97, 97, 97, 97, 97, 97, 316, 97, 97, 97, 97, 97, 97, 0, 45, 45, 45, 45, 45, 45, 45, 1656, 1657, 45, 376, 45, 45, 45, 45, 45, 388, 45, 45, 45, 45, 45, 45, 45, 45, 1406, 45, 45, 45, 45, 45, 45, 45, 67, 67, 67, 67, 462, 67, 67, 67, 67, 67, 474, 67, 67, 67, 67, 67, 67, 67, 1245, 67, 67, 67, 67, 67, 67, 67, 67, 1013, 67, 67, 1016, 67, 67, 67, 67, 97, 97, 97, 97, 559, 97, 97, 97, 97, 97, 571, 97, 97, 97, 97, 97, 97, 896, 97, 97, 97, 900, 97, 97, 97, 97, 97, 97, 912, 914, 97, 97, 97, 97, 97, 0, 0, 0, 45, 45, 45, 45, 45, 45, 45, 45, 391, 45, 45, 45, 45, 45, 45, 45, 45, 713, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 662, 45, 1140, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 636, 67, 67, 1283, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 513, 67, 67, 1363, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 889, 97, 97, 97, 1714, 0, 97, 97, 97, 97, 97, 97, 97, 97, 97, 0, 0, 926, 45, 45, 45, 45, 45, 45, 45, 45, 672, 45, 45, 45, 45, 45, 45, 45, 45, 686, 45, 45, 45, 45, 45, 45, 45, 45, 944, 45, 45, 45, 45, 45, 45, 45, 45, 1676, 45, 45, 45, 45, 45, 45, 67, 97, 97, 97, 1833, 0, 97, 97, 97, 97, 97, 0, 0, 0, 97, 97, 97, 97, 97, 97, 45, 45, 45, 45, 1902, 45, 45, 45, 45, 45, 957, 45, 45, 45, 45, 961, 45, 963, 45, 45, 45, 67, 97, 2034, 0, 97, 97, 97, 97, 97, 2040, 45, 45, 45, 2042, 67, 67, 67, 67, 67, 67, 1586, 67, 67, 67, 67, 67, 67, 67, 67, 67, 469, 67, 67, 67, 67, 67, 67, 132, 94242, 0, 0, 0, 38, 102439, 0, 0, 106538, 98347, 28809, 45, 45, 45, 45, 45, 1414, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 428, 45, 45, 45, 45, 45, 57889, 0, 0, 54074, 54074, 550, 831, 97, 97, 97, 97, 97, 97, 97, 97, 97, 568, 97, 97, 97, 97, 578, 97, 45, 45, 968, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 1228, 45, 45, 67, 67, 67, 67, 67, 25398, 1082, 13112, 1086, 54074, 1090, 0, 0, 0, 0, 0, 0, 364, 0, 0, 0, 139, 2158592, 2158592, 2158592, 2404352, 2412544, 67, 67, 67, 67, 1464, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 510, 67, 67, 67, 67, 97, 97, 97, 97, 1519, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 918, 97, 0, 0, 0, 0, 1528, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 976, 45, 1554, 45, 45, 45, 45, 45, 45, 45, 45, 1562, 45, 45, 1565, 45, 45, 45, 45, 683, 45, 45, 45, 687, 45, 45, 692, 45, 45, 45, 45, 45, 1953, 45, 67, 67, 67, 67, 67, 67, 67, 67, 67, 1014, 67, 67, 67, 67, 67, 67, 1568, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 0, 67, 67, 67, 67, 67, 1585, 67, 67, 67, 67, 67, 67, 67, 67, 67, 1594, 97, 97, 1649, 97, 97, 97, 0, 45, 45, 1653, 45, 45, 45, 45, 45, 45, 383, 45, 45, 45, 45, 45, 45, 45, 45, 45, 986, 45, 45, 45, 45, 45, 45, 45, 45, 1670, 45, 1672, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 67, 736, 67, 67, 67, 67, 67, 741, 67, 67, 67, 1680, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 1074, 67, 67, 67, 1692, 67, 67, 67, 67, 67, 67, 67, 1697, 67, 1699, 67, 67, 67, 67, 67, 67, 1041, 67, 67, 67, 67, 67, 67, 67, 67, 67, 1044, 67, 67, 67, 67, 67, 67, 67, 1769, 67, 67, 67, 67, 67, 67, 67, 97, 97, 97, 97, 97, 97, 97, 624, 97, 97, 97, 97, 97, 97, 634, 97, 97, 1792, 97, 97, 97, 97, 97, 97, 97, 45, 45, 45, 45, 45, 45, 45, 958, 45, 45, 45, 45, 45, 45, 964, 45, 150, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 977, 204, 45, 67, 67, 67, 217, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 787, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 271, 67, 0, 24850, 12564, 0, 0, 0, 0, 28809, 53531, 97, 97, 97, 97, 297, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 1108, 97, 97, 97, 97, 97, 97, 97, 97, 351, 97, 0, 40976, 0, 18, 18, 24, 24, 27, 27, 27, 45, 45, 938, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 1398, 45, 45, 45, 153, 45, 161, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 660, 661, 45, 45, 205, 45, 67, 67, 67, 67, 220, 67, 228, 67, 67, 67, 67, 67, 67, 67, 0, 0, 0, 1302, 0, 0, 0, 1308, 0, 67, 67, 67, 67, 67, 272, 67, 0, 24850, 12564, 0, 0, 0, 0, 28809, 53531, 97, 97, 97, 97, 352, 97, 0, 40976, 0, 18, 18, 24, 24, 27, 27, 27, 45, 439, 45, 45, 45, 45, 45, 445, 45, 45, 45, 452, 45, 45, 67, 67, 212, 216, 67, 67, 67, 67, 67, 241, 67, 246, 67, 252, 67, 67, 486, 67, 67, 67, 67, 67, 67, 67, 494, 67, 67, 67, 67, 67, 67, 67, 1272, 67, 67, 67, 67, 67, 67, 67, 67, 507, 67, 67, 67, 67, 67, 67, 67, 67, 521, 67, 67, 525, 67, 67, 67, 67, 67, 531, 67, 67, 67, 538, 67, 0, 0, 2046, 97, 97, 97, 45, 45, 67, 67, 0, 0, 97, 97, 45, 45, 45, 1192, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 1418, 45, 45, 1421, 97, 97, 583, 97, 97, 97, 97, 97, 97, 97, 591, 97, 97, 97, 97, 97, 97, 913, 97, 97, 97, 97, 97, 97, 0, 0, 0, 45, 45, 45, 45, 45, 45, 45, 1384, 97, 618, 97, 97, 622, 97, 97, 97, 97, 97, 628, 97, 97, 97, 635, 97, 18, 131427, 0, 0, 0, 639, 0, 132, 362, 0, 0, 365, 29315, 367, 0, 921, 29315, 0, 0, 0, 0, 45, 45, 45, 45, 932, 45, 45, 45, 45, 45, 1544, 45, 45, 45, 45, 45, 1550, 45, 45, 45, 45, 45, 1194, 45, 1196, 45, 45, 45, 45, 45, 45, 45, 45, 999, 45, 45, 45, 45, 45, 67, 67, 45, 45, 667, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 1408, 45, 45, 45, 696, 45, 45, 45, 701, 45, 45, 45, 45, 45, 45, 45, 45, 710, 45, 45, 45, 1220, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 194, 45, 45, 45, 729, 45, 45, 45, 45, 45, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 797, 67, 67, 67, 67, 67, 67, 805, 67, 67, 67, 67, 67, 67, 67, 1695, 67, 67, 67, 67, 67, 1700, 67, 1702, 67, 67, 67, 67, 67, 814, 816, 67, 67, 67, 67, 67, 25398, 542, 13112, 544, 67, 67, 1008, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 1020, 67, 0, 97, 45, 67, 0, 97, 45, 67, 0, 97, 45, 67, 97, 0, 0, 97, 97, 97, 97, 97, 45, 45, 45, 45, 67, 67, 67, 67, 1429, 67, 1430, 67, 67, 67, 67, 67, 1062, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 518, 1076, 67, 67, 67, 67, 25398, 0, 13112, 0, 54074, 0, 0, 0, 0, 0, 0, 0, 0, 28809, 0, 139, 45, 45, 45, 45, 45, 97, 97, 97, 97, 1102, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 1124, 97, 1126, 97, 97, 1114, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 1112, 97, 97, 1156, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 594, 97, 97, 97, 97, 1170, 97, 97, 97, 97, 0, 921, 0, 0, 0, 0, 0, 0, 45, 45, 45, 45, 1532, 45, 45, 45, 45, 1536, 45, 45, 45, 45, 45, 172, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 706, 45, 45, 709, 45, 45, 1177, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 1202, 45, 1204, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 1215, 45, 45, 45, 1232, 45, 45, 45, 45, 45, 45, 45, 67, 1237, 67, 67, 67, 67, 67, 67, 1259, 67, 67, 67, 67, 67, 67, 1264, 67, 67, 67, 1282, 67, 67, 67, 67, 67, 67, 67, 67, 67, 1289, 67, 67, 67, 1292, 97, 97, 97, 97, 1339, 97, 97, 97, 97, 97, 97, 1344, 97, 97, 97, 97, 45, 1849, 45, 1851, 45, 45, 45, 45, 45, 45, 45, 45, 721, 45, 45, 45, 45, 45, 726, 45, 1385, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 1188, 45, 45, 1401, 1402, 45, 45, 45, 45, 1405, 45, 45, 45, 45, 45, 45, 45, 45, 1752, 45, 45, 45, 45, 45, 67, 67, 1410, 45, 45, 45, 1413, 45, 1415, 45, 45, 45, 45, 45, 45, 1419, 45, 45, 45, 45, 1806, 45, 45, 45, 45, 45, 45, 67, 67, 67, 67, 67, 67, 67, 97, 97, 2019, 0, 97, 67, 67, 67, 1452, 67, 67, 67, 67, 67, 67, 67, 67, 1457, 67, 67, 67, 67, 67, 67, 1271, 67, 67, 67, 1274, 67, 67, 67, 1279, 67, 1460, 67, 1462, 67, 67, 67, 67, 67, 67, 1466, 67, 67, 67, 67, 67, 67, 67, 67, 1602, 67, 67, 1605, 67, 67, 67, 0, 97, 97, 97, 1506, 97, 97, 97, 97, 97, 97, 97, 97, 1512, 97, 97, 97, 0, 1728, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 901, 97, 97, 97, 97, 1515, 97, 1517, 97, 97, 97, 97, 97, 97, 1521, 97, 97, 97, 97, 97, 97, 0, 45, 1652, 45, 45, 45, 1655, 45, 45, 45, 45, 45, 1542, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 1552, 1553, 45, 45, 45, 1556, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 693, 45, 45, 45, 67, 67, 67, 67, 1572, 67, 67, 67, 67, 1576, 67, 67, 67, 67, 67, 67, 67, 67, 1685, 67, 67, 67, 67, 67, 67, 67, 67, 1465, 67, 67, 1468, 67, 67, 1471, 67, 67, 1582, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 1580, 67, 67, 1596, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 0, 542, 0, 544, 67, 67, 67, 67, 1759, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 533, 67, 67, 67, 67, 67, 67, 67, 1770, 67, 67, 67, 67, 67, 97, 97, 97, 97, 97, 97, 1777, 97, 97, 97, 1793, 97, 97, 97, 97, 97, 45, 45, 45, 45, 45, 45, 45, 998, 45, 45, 1001, 1002, 45, 45, 67, 67, 45, 1861, 45, 67, 67, 67, 67, 67, 67, 67, 67, 1871, 67, 1873, 1874, 67, 0, 97, 45, 67, 0, 97, 45, 67, 16384, 97, 45, 67, 97, 0, 0, 0, 1473, 0, 1082, 0, 0, 0, 1475, 0, 1086, 0, 0, 0, 1477, 1876, 67, 97, 97, 97, 97, 97, 1883, 0, 1885, 97, 97, 97, 1889, 0, 0, 0, 286, 0, 0, 0, 286, 0, 2367488, 2158592, 2158592, 2158592, 2158592, 2158592, 2158592, 0, 40976, 0, 18, 18, 24, 24, 126, 126, 126, 2053, 0, 2055, 45, 67, 0, 97, 45, 67, 0, 97, 45, 67, 97, 0, 0, 97, 97, 97, 2039, 97, 45, 45, 45, 45, 67, 67, 67, 67, 67, 226, 67, 67, 67, 67, 67, 67, 67, 67, 1246, 67, 67, 1249, 1250, 67, 67, 67, 132, 94242, 0, 0, 0, 38, 102439, 0, 0, 106538, 98347, 28809, 45, 45, 141, 45, 45, 45, 1403, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 1186, 45, 45, 1189, 45, 45, 155, 45, 45, 45, 45, 45, 45, 45, 45, 45, 191, 45, 45, 45, 45, 700, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 1753, 45, 45, 45, 67, 67, 45, 45, 67, 208, 67, 67, 67, 222, 67, 67, 67, 67, 67, 67, 67, 67, 67, 1764, 67, 67, 67, 67, 67, 67, 67, 258, 67, 67, 67, 67, 67, 0, 24850, 12564, 0, 0, 0, 0, 28809, 53531, 97, 97, 288, 97, 97, 97, 302, 97, 97, 97, 97, 97, 97, 97, 97, 97, 627, 97, 97, 97, 97, 97, 97, 338, 97, 97, 97, 97, 97, 0, 40976, 0, 18, 18, 24, 24, 27, 27, 27, 131427, 0, 0, 0, 0, 362, 0, 365, 28809, 367, 139, 45, 370, 45, 45, 45, 45, 716, 45, 45, 45, 45, 45, 722, 45, 45, 45, 45, 45, 45, 1912, 67, 67, 67, 67, 67, 67, 67, 67, 67, 819, 67, 67, 25398, 542, 13112, 544, 45, 403, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 1409, 45, 67, 67, 67, 67, 489, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 771, 67, 67, 67, 67, 520, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 534, 67, 67, 67, 67, 67, 67, 1286, 67, 67, 67, 67, 67, 67, 67, 1291, 67, 67, 24850, 24850, 12564, 12564, 0, 57889, 0, 0, 0, 53531, 53531, 367, 286, 97, 553, 97, 97, 97, 97, 586, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 1138, 97, 97, 97, 97, 617, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 631, 97, 97, 97, 0, 1834, 97, 97, 97, 97, 97, 0, 0, 0, 97, 97, 97, 97, 97, 353, 0, 40976, 0, 18, 18, 24, 24, 27, 27, 27, 45, 45, 668, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 724, 45, 45, 45, 45, 45, 682, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 949, 45, 45, 45, 67, 67, 747, 748, 67, 67, 67, 67, 755, 67, 67, 67, 67, 67, 67, 67, 0, 0, 1301, 0, 0, 0, 1307, 0, 0, 67, 794, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 1701, 67, 97, 97, 97, 845, 846, 97, 97, 97, 97, 853, 97, 97, 97, 97, 97, 97, 0, 40976, 0, 18, 18, 24, 24, 27, 27, 27, 97, 97, 892, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 610, 97, 97, 45, 992, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 67, 67, 67, 1239, 67, 67, 67, 1063, 67, 67, 67, 67, 67, 1068, 67, 67, 67, 67, 67, 67, 67, 0, 1299, 0, 0, 0, 1305, 0, 0, 0, 97, 1141, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 1152, 97, 97, 0, 0, 97, 97, 1784, 97, 97, 97, 0, 0, 97, 97, 0, 97, 1978, 97, 97, 97, 1982, 45, 45, 45, 45, 45, 45, 45, 45, 45, 972, 973, 45, 45, 45, 45, 45, 97, 97, 97, 97, 1157, 97, 97, 97, 97, 97, 1162, 97, 97, 97, 97, 97, 97, 1145, 97, 97, 97, 97, 97, 1151, 97, 97, 97, 1253, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 539, 45, 1423, 45, 45, 67, 67, 67, 67, 67, 67, 67, 1431, 67, 67, 67, 67, 67, 67, 67, 1773, 67, 97, 97, 97, 97, 97, 97, 97, 625, 97, 97, 97, 97, 97, 97, 97, 97, 850, 97, 97, 97, 97, 97, 97, 97, 97, 880, 97, 97, 97, 97, 97, 97, 97, 97, 1106, 97, 97, 97, 97, 97, 97, 97, 67, 67, 1439, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 514, 67, 67, 97, 97, 1492, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 611, 97, 97, 1703, 67, 67, 67, 67, 67, 67, 97, 97, 97, 97, 97, 97, 97, 97, 97, 852, 97, 97, 97, 97, 97, 97, 45, 1949, 45, 1951, 45, 45, 45, 67, 67, 67, 67, 67, 67, 67, 1961, 67, 0, 97, 45, 67, 0, 97, 2060, 2061, 0, 2062, 45, 67, 97, 0, 0, 2036, 97, 97, 97, 97, 45, 45, 45, 45, 67, 67, 67, 67, 67, 223, 67, 67, 237, 67, 67, 67, 67, 67, 67, 67, 1297, 0, 0, 0, 1303, 0, 0, 0, 1309, 1963, 67, 67, 67, 97, 97, 97, 97, 0, 1972, 0, 97, 97, 97, 1975, 0, 921, 29315, 0, 0, 0, 0, 45, 45, 45, 931, 45, 45, 45, 45, 45, 407, 45, 45, 45, 45, 45, 45, 45, 45, 45, 417, 45, 45, 1989, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 1996, 97, 18, 131427, 0, 0, 360, 0, 0, 0, 362, 0, 0, 365, 29315, 367, 0, 921, 29315, 0, 0, 0, 0, 45, 45, 930, 45, 45, 45, 45, 45, 45, 444, 45, 45, 45, 45, 45, 45, 45, 67, 67, 97, 97, 1998, 0, 97, 97, 97, 0, 97, 97, 97, 97, 97, 45, 45, 45, 45, 45, 45, 1985, 45, 1986, 45, 45, 45, 156, 45, 45, 170, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 675, 45, 45, 45, 45, 679, 131427, 0, 358, 0, 0, 362, 0, 365, 28809, 367, 139, 45, 45, 45, 45, 45, 381, 45, 45, 45, 45, 45, 45, 45, 45, 45, 400, 45, 45, 419, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 436, 67, 67, 67, 67, 67, 505, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 820, 67, 25398, 542, 13112, 544, 67, 67, 522, 67, 67, 67, 67, 67, 529, 67, 67, 67, 67, 67, 67, 67, 0, 1300, 0, 0, 0, 1306, 0, 0, 0, 97, 97, 619, 97, 97, 97, 97, 97, 626, 97, 97, 97, 97, 97, 97, 97, 1105, 97, 97, 97, 97, 1109, 97, 97, 97, 67, 67, 67, 67, 749, 67, 67, 67, 67, 67, 67, 67, 67, 67, 760, 67, 0, 97, 45, 67, 2058, 97, 45, 67, 0, 97, 45, 67, 97, 0, 0, 97, 97, 97, 97, 97, 45, 45, 45, 2041, 67, 67, 67, 67, 67, 780, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 516, 67, 67, 97, 97, 97, 878, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 1629, 97, 0, 45, 979, 45, 45, 45, 45, 984, 45, 45, 45, 45, 45, 45, 45, 45, 45, 1000, 45, 45, 45, 45, 67, 67, 67, 1023, 67, 67, 67, 67, 1028, 67, 67, 67, 67, 67, 67, 67, 67, 67, 470, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 25398, 0, 13112, 0, 54074, 0, 0, 0, 1094, 0, 0, 0, 1092, 1315, 0, 0, 0, 0, 97, 97, 97, 97, 97, 97, 97, 97, 97, 1486, 97, 1489, 97, 97, 97, 1117, 97, 97, 97, 97, 1122, 97, 97, 97, 97, 97, 97, 97, 1146, 97, 97, 97, 97, 97, 97, 97, 97, 881, 97, 97, 97, 886, 97, 97, 97, 1311, 0, 0, 0, 0, 0, 0, 0, 0, 97, 97, 97, 97, 97, 97, 97, 1615, 97, 97, 97, 97, 97, 1619, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 1631, 97, 97, 1847, 97, 45, 45, 45, 45, 1852, 45, 45, 45, 45, 45, 45, 45, 1235, 45, 45, 45, 67, 67, 67, 67, 67, 1868, 67, 67, 67, 1872, 67, 67, 67, 67, 67, 97, 97, 97, 97, 1882, 0, 0, 0, 97, 97, 97, 97, 0, 1891, 67, 67, 67, 67, 67, 97, 97, 97, 97, 97, 1929, 0, 0, 97, 97, 97, 97, 97, 97, 45, 1900, 45, 1901, 45, 45, 45, 1905, 45, 67, 2054, 97, 45, 67, 0, 97, 45, 67, 0, 97, 45, 67, 97, 0, 0, 97, 2037, 2038, 97, 97, 45, 45, 45, 45, 67, 67, 67, 67, 1867, 67, 67, 67, 67, 67, 67, 67, 67, 67, 1774, 97, 97, 97, 97, 97, 97, 0, 94242, 0, 0, 0, 38, 102439, 0, 0, 106538, 98347, 28809, 45, 45, 142, 45, 45, 45, 1412, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 432, 45, 45, 45, 45, 45, 157, 45, 45, 171, 45, 45, 45, 182, 45, 45, 45, 45, 200, 45, 45, 45, 1543, 45, 45, 45, 45, 45, 45, 45, 45, 1551, 45, 45, 45, 45, 1181, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 1211, 45, 45, 45, 1214, 45, 45, 45, 67, 209, 67, 67, 67, 224, 67, 67, 238, 67, 67, 67, 249, 67, 0, 97, 2056, 2057, 0, 2059, 45, 67, 0, 97, 45, 67, 97, 0, 0, 1937, 97, 97, 97, 97, 97, 97, 45, 45, 45, 45, 45, 45, 1741, 45, 45, 45, 45, 45, 45, 67, 67, 67, 267, 67, 67, 67, 0, 24850, 12564, 0, 0, 0, 0, 28809, 53531, 97, 97, 289, 97, 97, 97, 304, 97, 97, 318, 97, 97, 97, 329, 97, 97, 0, 0, 97, 97, 2001, 0, 97, 2003, 97, 97, 97, 45, 45, 45, 1739, 45, 45, 45, 1742, 45, 45, 45, 45, 45, 97, 97, 347, 97, 97, 97, 0, 40976, 0, 18, 18, 24, 24, 27, 27, 27, 45, 666, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 1420, 45, 57889, 0, 0, 54074, 54074, 550, 0, 97, 97, 97, 97, 97, 97, 97, 97, 840, 67, 1007, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 759, 67, 67, 67, 67, 67, 67, 67, 1052, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 1031, 67, 67, 67, 67, 67, 97, 97, 97, 1101, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 592, 97, 97, 97, 1190, 45, 45, 45, 45, 45, 1195, 45, 1197, 45, 45, 45, 45, 1201, 45, 45, 45, 45, 1952, 45, 45, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 250, 67, 67, 67, 1255, 67, 1257, 67, 67, 67, 67, 1261, 67, 67, 67, 67, 67, 67, 67, 67, 1696, 67, 67, 67, 67, 67, 67, 67, 0, 0, 0, 0, 0, 0, 2162688, 0, 0, 67, 67, 1267, 67, 67, 67, 67, 67, 67, 1273, 67, 67, 67, 67, 67, 67, 67, 67, 1763, 67, 67, 67, 67, 67, 67, 67, 0, 0, 0, 0, 0, 280, 94, 0, 0, 1281, 67, 67, 67, 67, 1285, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 1070, 67, 67, 67, 67, 67, 1335, 97, 1337, 97, 97, 97, 97, 1341, 97, 97, 97, 97, 97, 97, 97, 97, 882, 97, 97, 97, 97, 97, 97, 97, 1347, 97, 97, 97, 97, 97, 97, 1353, 97, 97, 97, 97, 97, 97, 1361, 97, 18, 131427, 0, 638, 0, 0, 0, 0, 362, 0, 0, 365, 29315, 367, 0, 544, 0, 550, 0, 2158592, 2158592, 2158592, 2158592, 2158592, 2158592, 2158592, 2158592, 2473984, 2158592, 2158592, 2158592, 2990080, 2158592, 2158592, 2207744, 2207744, 2482176, 2207744, 2207744, 2207744, 2207744, 2207744, 2207744, 2207744, 0, 0, 0, 0, 0, 0, 2162688, 0, 53530, 97, 97, 97, 1365, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 608, 97, 97, 97, 45, 45, 1424, 45, 1425, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 1058, 67, 67, 67, 67, 45, 1555, 45, 45, 1557, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 707, 45, 45, 45, 45, 67, 67, 1570, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 773, 67, 67, 1595, 67, 67, 1597, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 139, 2158592, 2158592, 2158592, 2404352, 2412544, 97, 97, 97, 1636, 97, 97, 97, 1639, 97, 97, 1641, 97, 97, 97, 97, 97, 97, 1173, 0, 921, 0, 0, 0, 0, 0, 0, 45, 67, 67, 67, 1693, 67, 67, 67, 67, 67, 67, 67, 1698, 67, 67, 67, 67, 67, 67, 273, 0, 24850, 12564, 0, 0, 0, 0, 28809, 53531, 1860, 45, 45, 67, 67, 1865, 67, 67, 67, 67, 1870, 67, 67, 67, 67, 1875, 67, 67, 97, 97, 1880, 97, 97, 0, 0, 0, 97, 97, 1888, 97, 0, 0, 0, 1938, 97, 97, 97, 97, 97, 45, 45, 45, 45, 45, 45, 1854, 45, 45, 45, 45, 45, 45, 45, 1909, 45, 45, 1911, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 1248, 67, 67, 67, 67, 67, 67, 1922, 67, 67, 1924, 97, 97, 97, 97, 97, 0, 0, 0, 97, 97, 97, 97, 97, 1898, 45, 45, 45, 45, 45, 45, 1904, 45, 45, 67, 67, 67, 67, 97, 97, 97, 97, 0, 0, 16384, 97, 97, 97, 97, 0, 97, 97, 97, 97, 97, 97, 97, 97, 97, 0, 1724, 2008, 2009, 45, 45, 67, 67, 67, 2014, 2015, 67, 67, 97, 97, 0, 0, 97, 97, 97, 0, 97, 97, 97, 97, 97, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 2022, 0, 2023, 97, 97, 45, 45, 45, 45, 45, 45, 67, 67, 67, 67, 67, 67, 1869, 67, 67, 67, 67, 67, 67, 0, 94242, 0, 0, 0, 38, 102439, 0, 0, 106538, 98347, 28809, 45, 45, 45, 147, 151, 154, 45, 162, 45, 45, 176, 178, 181, 45, 45, 45, 192, 196, 45, 45, 45, 45, 2012, 67, 67, 67, 67, 67, 67, 2018, 97, 0, 0, 97, 1894, 1895, 97, 1897, 97, 45, 45, 45, 45, 45, 45, 45, 45, 45, 656, 45, 45, 45, 45, 45, 45, 67, 259, 263, 67, 67, 67, 67, 0, 24850, 12564, 0, 0, 0, 0, 28809, 53531, 97, 97, 97, 294, 298, 301, 97, 309, 97, 97, 323, 325, 328, 97, 97, 97, 97, 97, 560, 97, 97, 97, 569, 97, 97, 97, 97, 97, 97, 306, 97, 97, 97, 97, 97, 97, 97, 97, 97, 1624, 97, 97, 97, 97, 97, 97, 97, 0, 921, 0, 1175, 0, 0, 0, 0, 45, 339, 343, 97, 97, 97, 97, 0, 40976, 0, 18, 18, 24, 24, 27, 27, 27, 67, 67, 503, 67, 67, 67, 67, 67, 67, 67, 67, 67, 512, 67, 67, 519, 97, 97, 600, 97, 97, 97, 97, 97, 97, 97, 97, 97, 609, 97, 97, 616, 45, 649, 45, 45, 45, 45, 45, 654, 45, 45, 45, 45, 45, 45, 45, 45, 1393, 45, 45, 45, 45, 45, 45, 45, 45, 1209, 45, 45, 45, 45, 45, 45, 45, 67, 763, 67, 67, 67, 67, 67, 67, 67, 67, 770, 67, 67, 67, 774, 67, 0, 2045, 97, 97, 97, 97, 45, 45, 67, 67, 0, 0, 97, 97, 45, 45, 45, 994, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 67, 67, 213, 67, 219, 67, 67, 232, 67, 242, 67, 247, 67, 67, 67, 779, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 1018, 67, 67, 67, 67, 811, 67, 67, 67, 67, 67, 67, 67, 67, 67, 25398, 542, 13112, 544, 57889, 0, 0, 54074, 54074, 550, 0, 97, 834, 97, 97, 97, 97, 97, 839, 97, 18, 131427, 0, 638, 0, 0, 0, 0, 362, 0, 0, 365, 29315, 367, 645, 97, 97, 861, 97, 97, 97, 97, 97, 97, 97, 97, 868, 97, 97, 97, 872, 97, 97, 877, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 613, 97, 97, 97, 97, 97, 909, 97, 97, 97, 97, 97, 97, 97, 97, 97, 0, 0, 0, 18, 18, 24, 24, 27, 27, 27, 1036, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 1047, 67, 67, 67, 1050, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 1033, 67, 67, 67, 97, 97, 1130, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 638, 0, 0, 67, 67, 67, 1295, 67, 67, 67, 0, 0, 0, 0, 0, 0, 0, 0, 0, 97, 1317, 97, 97, 97, 97, 97, 97, 1375, 97, 97, 97, 0, 0, 0, 45, 1379, 45, 45, 45, 45, 45, 45, 422, 45, 45, 45, 429, 431, 45, 45, 45, 45, 0, 1090, 0, 0, 97, 1479, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 1357, 97, 97, 97, 97, 97, 97, 97, 97, 97, 1716, 97, 97, 97, 97, 97, 97, 97, 97, 97, 1723, 0, 921, 29315, 0, 0, 0, 0, 45, 929, 45, 45, 45, 45, 45, 45, 45, 1234, 45, 45, 45, 45, 67, 67, 67, 67, 1240, 97, 97, 97, 1738, 45, 45, 45, 45, 45, 45, 45, 1743, 45, 45, 45, 45, 166, 45, 45, 45, 45, 184, 186, 45, 45, 197, 45, 45, 97, 1779, 0, 0, 97, 97, 97, 97, 97, 97, 0, 0, 97, 97, 0, 97, 18, 131427, 0, 638, 0, 0, 0, 0, 362, 0, 640, 365, 29315, 367, 0, 921, 29315, 0, 0, 0, 0, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 1539, 45, 45, 1803, 45, 45, 45, 45, 45, 1809, 45, 45, 45, 67, 67, 67, 1814, 67, 67, 67, 67, 67, 97, 97, 97, 97, 97, 0, 0, 0, 1932, 97, 97, 0, 1781, 97, 97, 97, 97, 97, 97, 0, 0, 97, 97, 0, 97, 67, 67, 67, 1818, 67, 67, 67, 67, 67, 1824, 67, 67, 67, 97, 97, 97, 97, 97, 0, 0, 0, 97, 97, 97, 97, 1890, 0, 1829, 97, 97, 0, 0, 97, 97, 1836, 97, 97, 0, 0, 0, 97, 97, 97, 97, 1981, 45, 45, 45, 45, 45, 45, 45, 45, 45, 1987, 1845, 97, 97, 97, 45, 45, 45, 45, 45, 1853, 45, 45, 45, 1857, 45, 45, 45, 67, 1864, 67, 1866, 67, 67, 67, 67, 67, 67, 67, 67, 67, 97, 97, 97, 97, 97, 97, 97, 1710, 1711, 67, 67, 97, 97, 97, 97, 97, 0, 0, 0, 1886, 97, 97, 97, 0, 0, 97, 97, 97, 97, 1838, 0, 0, 0, 97, 1843, 97, 0, 1893, 97, 97, 97, 97, 97, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 1745, 45, 45, 67, 2044, 0, 97, 97, 97, 97, 45, 45, 67, 67, 0, 0, 97, 97, 45, 45, 45, 1660, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 453, 45, 455, 67, 67, 67, 67, 268, 67, 67, 67, 0, 24850, 12564, 0, 0, 0, 0, 28809, 53531, 97, 97, 348, 97, 97, 97, 0, 40976, 0, 18, 18, 24, 24, 27, 27, 27, 131427, 0, 359, 0, 0, 362, 0, 365, 28809, 367, 139, 45, 45, 45, 45, 45, 421, 45, 45, 45, 45, 45, 45, 45, 434, 45, 45, 695, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 1667, 45, 0, 921, 29315, 0, 925, 0, 0, 45, 45, 45, 45, 45, 45, 45, 45, 45, 1548, 45, 45, 45, 45, 45, 45, 67, 1037, 67, 1039, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 1277, 67, 67, 67, 67, 67, 67, 67, 67, 25398, 0, 13112, 0, 54074, 0, 0, 0, 1095, 0, 0, 0, 1096, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 869, 97, 97, 97, 97, 97, 97, 1131, 97, 1133, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 1370, 97, 97, 97, 97, 97, 1312, 0, 0, 0, 0, 1096, 0, 0, 0, 97, 97, 97, 97, 97, 97, 97, 1327, 97, 97, 97, 97, 97, 1332, 97, 97, 97, 1830, 97, 0, 0, 97, 97, 97, 97, 97, 0, 0, 0, 97, 97, 97, 1896, 97, 97, 45, 45, 45, 45, 45, 45, 45, 45, 45, 1210, 45, 45, 45, 45, 45, 45, 133, 94242, 0, 0, 0, 38, 102439, 0, 0, 106538, 98347, 28809, 45, 45, 45, 45, 380, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 401, 45, 45, 158, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 1200, 45, 45, 45, 45, 206, 67, 67, 67, 67, 67, 225, 67, 67, 67, 67, 67, 67, 67, 67, 754, 67, 67, 67, 67, 67, 67, 67, 57889, 0, 0, 54074, 54074, 550, 832, 97, 97, 97, 97, 97, 97, 97, 97, 97, 1342, 97, 97, 97, 97, 97, 97, 67, 67, 67, 67, 67, 25398, 1083, 13112, 1087, 54074, 1091, 0, 0, 0, 0, 0, 0, 1316, 0, 831, 97, 97, 97, 97, 97, 97, 97, 1174, 921, 0, 1175, 0, 0, 0, 0, 45, 0, 94242, 0, 0, 0, 38, 102439, 0, 0, 106538, 98347, 28809, 45, 45, 45, 148, 67, 67, 264, 67, 67, 67, 67, 0, 24850, 12564, 0, 0, 0, 0, 28809, 53531, 97, 97, 97, 295, 97, 97, 97, 97, 313, 97, 97, 97, 97, 331, 333, 97, 18, 131427, 356, 638, 0, 0, 0, 0, 362, 0, 0, 365, 0, 367, 0, 45, 45, 1530, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 988, 45, 45, 45, 97, 344, 97, 97, 97, 97, 0, 40976, 0, 18, 18, 24, 24, 27, 27, 27, 402, 404, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 1756, 67, 438, 45, 45, 45, 45, 45, 45, 45, 45, 449, 450, 45, 45, 45, 67, 67, 214, 218, 221, 67, 229, 67, 67, 243, 245, 248, 67, 67, 67, 67, 67, 488, 490, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 1071, 67, 1073, 67, 67, 67, 67, 67, 524, 67, 67, 67, 67, 67, 67, 67, 67, 535, 536, 67, 67, 67, 67, 67, 67, 1683, 1684, 67, 67, 67, 67, 1688, 1689, 67, 67, 67, 67, 67, 67, 1694, 67, 67, 67, 67, 67, 67, 67, 67, 67, 1288, 67, 67, 67, 67, 67, 67, 97, 97, 97, 585, 587, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 1163, 97, 97, 97, 97, 97, 97, 97, 621, 97, 97, 97, 97, 97, 97, 97, 97, 632, 633, 97, 97, 0, 0, 97, 1783, 97, 97, 97, 97, 0, 0, 97, 97, 0, 97, 97, 97, 45, 2026, 45, 45, 45, 45, 67, 2030, 67, 67, 67, 67, 67, 67, 1053, 1054, 67, 67, 67, 67, 67, 67, 1061, 67, 712, 45, 45, 45, 717, 45, 45, 45, 45, 45, 45, 45, 45, 725, 45, 45, 45, 163, 167, 173, 177, 45, 45, 45, 45, 45, 193, 45, 45, 45, 45, 982, 45, 45, 45, 45, 45, 45, 987, 45, 45, 45, 45, 45, 1558, 45, 1560, 45, 45, 45, 45, 45, 45, 45, 45, 704, 705, 45, 45, 45, 45, 45, 45, 45, 45, 731, 45, 45, 45, 67, 67, 67, 67, 67, 739, 67, 67, 67, 67, 67, 67, 464, 67, 67, 67, 67, 67, 67, 479, 67, 67, 67, 67, 67, 764, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 1290, 67, 67, 67, 67, 67, 67, 812, 67, 67, 67, 67, 818, 67, 67, 67, 25398, 542, 13112, 544, 57889, 0, 0, 54074, 54074, 550, 0, 97, 97, 97, 97, 97, 837, 97, 97, 97, 97, 97, 602, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 1137, 97, 97, 97, 97, 97, 97, 97, 97, 97, 862, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 1627, 97, 97, 97, 0, 97, 97, 97, 97, 910, 97, 97, 97, 97, 916, 97, 97, 97, 0, 0, 0, 97, 97, 1940, 97, 97, 1942, 45, 45, 45, 45, 45, 45, 385, 45, 45, 45, 45, 395, 45, 45, 45, 45, 966, 45, 969, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 975, 45, 45, 45, 406, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 974, 45, 45, 45, 67, 67, 67, 67, 1010, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 1262, 67, 67, 67, 67, 67, 67, 67, 67, 67, 1040, 67, 1042, 67, 1045, 67, 67, 67, 67, 67, 67, 67, 527, 67, 67, 67, 67, 67, 67, 537, 67, 67, 67, 67, 67, 1051, 67, 67, 67, 67, 67, 1057, 67, 67, 67, 67, 67, 67, 67, 1454, 67, 67, 67, 67, 67, 67, 67, 67, 67, 1445, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 1079, 25398, 0, 13112, 0, 54074, 0, 0, 0, 0, 0, 0, 0, 2158592, 2158592, 2158592, 2158592, 2158592, 2158592, 2158592, 2158592, 2158592, 2207744, 2207744, 2207744, 2207744, 2207744, 2572288, 2207744, 2207744, 2207744, 1098, 97, 97, 97, 97, 97, 1104, 97, 97, 97, 97, 97, 97, 97, 97, 97, 1356, 97, 97, 97, 97, 97, 97, 1128, 97, 97, 97, 97, 97, 97, 1134, 97, 1136, 97, 1139, 97, 97, 97, 97, 97, 97, 1622, 97, 97, 97, 97, 97, 97, 97, 97, 0, 921, 0, 0, 0, 1176, 0, 646, 45, 67, 67, 67, 1268, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 1469, 67, 67, 67, 97, 1348, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 1127, 97, 67, 1569, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 1448, 1449, 67, 1816, 67, 67, 67, 67, 67, 67, 67, 67, 67, 1825, 67, 67, 1827, 97, 97, 0, 0, 1782, 97, 97, 97, 97, 97, 0, 0, 97, 97, 0, 97, 97, 97, 1831, 0, 0, 97, 97, 97, 97, 97, 0, 0, 0, 97, 97, 97, 1980, 97, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 1395, 45, 45, 45, 45, 45, 97, 1846, 97, 97, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 1212, 45, 45, 45, 45, 45, 45, 2010, 45, 67, 67, 67, 67, 67, 2016, 67, 97, 97, 0, 0, 97, 97, 97, 0, 97, 97, 97, 97, 97, 45, 45, 2007, 0, 94242, 0, 0, 0, 38, 102439, 0, 0, 106538, 98347, 28809, 45, 45, 143, 45, 45, 45, 1671, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 67, 1813, 67, 67, 1815, 45, 45, 67, 210, 67, 67, 67, 67, 67, 67, 239, 67, 67, 67, 67, 67, 67, 67, 1575, 67, 67, 67, 67, 67, 67, 67, 67, 493, 67, 67, 67, 67, 67, 67, 67, 97, 97, 290, 97, 97, 97, 97, 97, 97, 319, 97, 97, 97, 97, 97, 97, 303, 97, 97, 317, 97, 97, 97, 97, 97, 97, 305, 97, 97, 97, 97, 97, 97, 97, 97, 97, 899, 97, 97, 97, 97, 97, 97, 375, 45, 45, 45, 379, 45, 45, 390, 45, 45, 394, 45, 45, 45, 45, 45, 443, 45, 45, 45, 45, 45, 45, 45, 45, 67, 67, 67, 67, 67, 461, 67, 67, 67, 465, 67, 67, 476, 67, 67, 480, 67, 67, 67, 67, 67, 67, 1761, 67, 67, 67, 67, 67, 67, 67, 67, 67, 530, 67, 67, 67, 67, 67, 67, 500, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 1075, 97, 97, 97, 558, 97, 97, 97, 562, 97, 97, 573, 97, 97, 577, 97, 97, 0, 1999, 97, 97, 97, 0, 97, 97, 2004, 2005, 97, 45, 45, 45, 45, 1193, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 676, 45, 45, 45, 45, 597, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 1334, 45, 681, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 1396, 45, 45, 1399, 45, 45, 730, 45, 45, 45, 45, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 1434, 67, 67, 67, 67, 67, 67, 750, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 1456, 67, 67, 67, 67, 67, 45, 45, 993, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 67, 67, 1238, 67, 67, 1006, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 1280, 1048, 1049, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 1059, 67, 67, 67, 67, 67, 67, 1296, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2367488, 2158592, 2158592, 2158592, 2158592, 2158592, 2158592, 97, 97, 1100, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 638, 0, 920, 97, 97, 1142, 1143, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 1153, 97, 97, 97, 97, 97, 1144, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 1149, 97, 97, 97, 97, 1154, 45, 1218, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 1678, 45, 45, 45, 67, 67, 67, 67, 67, 1269, 67, 67, 67, 67, 67, 67, 67, 67, 1278, 67, 67, 67, 67, 67, 67, 1772, 67, 67, 97, 97, 97, 97, 97, 97, 97, 0, 921, 922, 1175, 0, 0, 0, 0, 45, 97, 97, 1349, 97, 97, 97, 97, 97, 97, 97, 97, 1358, 97, 97, 97, 97, 97, 97, 1623, 97, 97, 97, 97, 97, 97, 97, 97, 0, 921, 0, 0, 926, 0, 0, 0, 45, 45, 1411, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 1754, 45, 45, 67, 67, 1301, 0, 1307, 0, 1313, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 21054, 97, 97, 97, 97, 67, 1757, 67, 67, 67, 1760, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 1467, 67, 67, 67, 67, 67, 1778, 97, 0, 0, 97, 97, 97, 97, 97, 97, 0, 0, 97, 97, 0, 97, 97, 97, 97, 97, 1158, 97, 97, 97, 1161, 97, 97, 97, 97, 1166, 97, 97, 97, 97, 97, 1325, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 1328, 97, 97, 97, 97, 97, 97, 97, 67, 67, 67, 67, 67, 1820, 67, 1822, 67, 67, 67, 67, 67, 97, 97, 97, 97, 97, 0, 0, 0, 97, 1933, 97, 1892, 97, 97, 97, 97, 97, 97, 1899, 45, 45, 45, 45, 45, 45, 45, 45, 1664, 45, 45, 45, 45, 45, 45, 45, 45, 1546, 45, 45, 45, 45, 45, 45, 45, 45, 1208, 45, 45, 45, 45, 45, 45, 45, 45, 1224, 45, 45, 45, 45, 45, 45, 45, 45, 673, 45, 45, 45, 45, 45, 45, 45, 67, 67, 67, 67, 67, 1925, 97, 97, 97, 97, 0, 0, 0, 97, 97, 97, 97, 97, 623, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 307, 97, 97, 97, 97, 97, 97, 97, 97, 97, 1796, 97, 45, 45, 45, 45, 45, 45, 45, 970, 45, 45, 45, 45, 45, 45, 45, 45, 1417, 45, 45, 45, 45, 45, 45, 45, 67, 1964, 67, 67, 97, 97, 97, 97, 0, 0, 0, 97, 97, 97, 97, 0, 97, 97, 97, 97, 97, 97, 1721, 97, 97, 0, 0, 1997, 97, 0, 0, 2000, 97, 97, 0, 97, 97, 97, 97, 97, 45, 45, 45, 45, 733, 45, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 803, 67, 67, 67, 67, 67, 0, 94242, 0, 0, 0, 38, 102439, 0, 0, 106538, 98347, 28809, 45, 45, 144, 45, 45, 45, 1805, 45, 1807, 45, 45, 45, 45, 45, 67, 67, 67, 67, 67, 67, 231, 67, 67, 67, 67, 67, 67, 67, 0, 24850, 12564, 0, 0, 0, 281, 28809, 53531, 45, 45, 67, 211, 67, 67, 67, 67, 230, 234, 240, 244, 67, 67, 67, 67, 67, 67, 492, 67, 67, 67, 67, 67, 67, 67, 67, 67, 471, 67, 67, 67, 67, 481, 67, 67, 260, 67, 67, 67, 67, 67, 0, 24850, 12564, 0, 0, 0, 0, 28809, 53531, 97, 97, 291, 97, 97, 97, 97, 310, 314, 320, 324, 97, 97, 97, 97, 97, 97, 1367, 97, 97, 97, 97, 97, 97, 97, 97, 97, 1355, 97, 97, 97, 97, 97, 97, 1362, 340, 97, 97, 97, 97, 97, 0, 40976, 0, 18, 18, 24, 24, 27, 27, 27, 131427, 0, 0, 360, 0, 362, 0, 365, 28809, 367, 139, 369, 45, 45, 45, 374, 67, 67, 460, 67, 67, 67, 67, 466, 67, 67, 67, 67, 67, 67, 67, 67, 801, 67, 67, 67, 67, 67, 67, 67, 67, 67, 487, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 498, 67, 67, 67, 67, 67, 67, 1821, 67, 67, 67, 67, 67, 67, 97, 97, 97, 97, 97, 0, 0, 0, 97, 97, 97, 97, 0, 0, 67, 502, 67, 67, 67, 67, 67, 67, 67, 508, 67, 67, 67, 515, 517, 67, 67, 67, 67, 67, 97, 97, 97, 97, 97, 0, 0, 1931, 97, 97, 97, 97, 97, 588, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 629, 97, 97, 97, 97, 97, 67, 24850, 24850, 12564, 12564, 0, 57889, 0, 0, 0, 53531, 53531, 367, 286, 552, 97, 97, 97, 97, 97, 1352, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 1511, 97, 97, 97, 97, 97, 97, 97, 557, 97, 97, 97, 97, 563, 97, 97, 97, 97, 97, 97, 97, 97, 1135, 97, 97, 97, 97, 97, 97, 97, 97, 97, 584, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 595, 97, 97, 97, 97, 97, 895, 97, 97, 97, 97, 97, 97, 903, 97, 97, 97, 0, 97, 97, 1638, 97, 97, 97, 97, 97, 97, 97, 97, 1646, 97, 599, 97, 97, 97, 97, 97, 97, 97, 605, 97, 97, 97, 612, 614, 97, 97, 97, 97, 97, 1377, 0, 0, 45, 45, 45, 45, 45, 45, 45, 45, 655, 45, 45, 45, 45, 45, 45, 45, 745, 67, 67, 67, 67, 751, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 1577, 67, 67, 67, 67, 67, 762, 67, 67, 67, 67, 766, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 1765, 67, 67, 67, 67, 67, 777, 67, 67, 781, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 1592, 1593, 67, 67, 97, 843, 97, 97, 97, 97, 849, 97, 97, 97, 97, 97, 97, 97, 97, 97, 1510, 97, 97, 97, 97, 97, 97, 97, 860, 97, 97, 97, 97, 864, 97, 97, 97, 97, 97, 97, 97, 97, 97, 1797, 45, 45, 45, 45, 1801, 45, 97, 875, 97, 97, 879, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 1522, 97, 97, 97, 97, 97, 991, 45, 45, 45, 45, 996, 45, 45, 45, 45, 45, 45, 45, 45, 67, 67, 215, 67, 67, 67, 67, 233, 67, 67, 67, 67, 251, 253, 1022, 67, 67, 67, 1026, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 1035, 67, 67, 1038, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 1458, 67, 67, 67, 67, 67, 1064, 67, 67, 67, 1067, 67, 67, 67, 67, 1072, 67, 67, 67, 67, 67, 67, 1442, 67, 67, 67, 67, 67, 67, 67, 67, 67, 97, 97, 97, 1775, 97, 97, 97, 67, 67, 67, 67, 67, 25398, 0, 13112, 0, 54074, 0, 0, 0, 0, 1096, 0, 921, 29315, 0, 0, 0, 0, 928, 45, 45, 45, 45, 45, 934, 45, 45, 45, 164, 45, 45, 45, 45, 45, 45, 45, 45, 45, 198, 45, 45, 45, 378, 45, 45, 45, 45, 45, 45, 393, 45, 45, 45, 398, 45, 97, 97, 1116, 97, 97, 97, 1120, 97, 97, 97, 97, 97, 97, 97, 97, 97, 1147, 1148, 97, 97, 97, 97, 97, 97, 97, 1129, 97, 97, 1132, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 1626, 97, 97, 97, 97, 0, 45, 1178, 45, 45, 45, 45, 45, 45, 45, 45, 45, 1185, 45, 45, 45, 45, 441, 45, 45, 45, 45, 45, 45, 451, 45, 45, 67, 67, 67, 67, 67, 227, 67, 67, 67, 67, 67, 67, 67, 67, 1260, 67, 67, 67, 1263, 67, 67, 1265, 1203, 45, 45, 1205, 45, 1206, 45, 45, 45, 45, 45, 45, 45, 45, 45, 1216, 67, 1266, 67, 67, 67, 67, 67, 67, 67, 67, 67, 1276, 67, 67, 67, 67, 67, 67, 752, 67, 67, 67, 67, 67, 67, 67, 67, 67, 1056, 67, 67, 67, 67, 67, 67, 45, 1386, 45, 1389, 45, 45, 45, 45, 1394, 45, 45, 45, 1397, 45, 45, 45, 45, 995, 45, 997, 45, 45, 45, 45, 45, 45, 45, 67, 67, 67, 67, 1915, 67, 67, 67, 67, 67, 1422, 45, 45, 45, 67, 67, 67, 67, 67, 67, 67, 67, 67, 1433, 67, 1436, 67, 67, 67, 67, 1441, 67, 67, 67, 1444, 67, 67, 67, 67, 67, 67, 67, 0, 24851, 12565, 0, 0, 0, 0, 28809, 53532, 97, 97, 97, 97, 1494, 97, 97, 97, 1497, 97, 97, 97, 97, 97, 97, 97, 1368, 97, 97, 97, 97, 97, 97, 97, 97, 851, 97, 97, 97, 97, 97, 97, 97, 67, 67, 67, 1571, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 25398, 542, 13112, 544, 67, 67, 1583, 67, 67, 67, 67, 67, 67, 67, 67, 1591, 67, 67, 67, 67, 67, 67, 782, 67, 67, 67, 67, 67, 67, 67, 67, 67, 756, 67, 67, 67, 67, 67, 67, 97, 1634, 97, 0, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 1125, 97, 97, 97, 1647, 97, 97, 97, 97, 97, 0, 45, 45, 45, 45, 45, 45, 45, 45, 45, 719, 720, 45, 45, 45, 45, 45, 45, 45, 45, 685, 45, 45, 45, 45, 45, 45, 45, 45, 45, 942, 45, 45, 946, 45, 45, 45, 950, 45, 45, 1658, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 1668, 1712, 97, 97, 97, 0, 97, 97, 97, 97, 97, 97, 97, 97, 97, 0, 0, 1835, 97, 97, 97, 97, 0, 0, 0, 97, 97, 1844, 97, 97, 1726, 0, 97, 97, 97, 97, 97, 1732, 97, 1734, 97, 97, 97, 97, 97, 300, 97, 308, 97, 97, 97, 97, 97, 97, 97, 97, 866, 97, 97, 97, 97, 97, 97, 97, 67, 67, 67, 1758, 67, 67, 67, 1762, 67, 67, 67, 67, 67, 67, 67, 67, 1043, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 1771, 67, 67, 67, 97, 97, 97, 97, 97, 1776, 97, 97, 97, 97, 97, 1794, 97, 97, 97, 45, 45, 45, 45, 45, 45, 45, 1183, 45, 45, 45, 45, 45, 45, 45, 45, 45, 409, 45, 45, 45, 45, 45, 45, 67, 67, 67, 1966, 97, 97, 97, 1970, 0, 0, 0, 97, 97, 97, 97, 0, 97, 97, 97, 1720, 97, 97, 97, 97, 97, 0, 0, 97, 97, 97, 1837, 97, 0, 1840, 1841, 97, 97, 97, 1988, 45, 67, 67, 67, 67, 67, 67, 67, 67, 67, 1994, 1995, 67, 97, 97, 97, 97, 97, 911, 97, 97, 97, 97, 97, 97, 97, 638, 0, 0, 0, 0, 1315, 0, 0, 0, 0, 97, 97, 97, 1319, 97, 97, 97, 0, 97, 97, 97, 97, 97, 97, 1733, 97, 97, 97, 97, 97, 97, 1340, 97, 97, 97, 1343, 97, 97, 1345, 97, 1346, 67, 67, 265, 67, 67, 67, 67, 0, 24850, 12564, 0, 0, 0, 0, 28809, 53531, 97, 345, 97, 97, 97, 97, 0, 40976, 0, 18, 18, 24, 24, 27, 27, 27, 131427, 0, 0, 0, 361, 362, 0, 365, 28809, 367, 139, 45, 45, 45, 45, 45, 671, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 411, 45, 45, 414, 45, 45, 45, 45, 377, 45, 45, 45, 386, 45, 45, 45, 45, 45, 45, 45, 45, 45, 1207, 45, 45, 45, 45, 45, 45, 1213, 45, 45, 67, 67, 67, 67, 67, 463, 67, 67, 67, 472, 67, 67, 67, 67, 67, 67, 67, 528, 67, 67, 67, 67, 67, 67, 67, 67, 1287, 67, 67, 67, 67, 67, 67, 67, 540, 24850, 24850, 12564, 12564, 0, 57889, 0, 0, 0, 53531, 53531, 367, 286, 97, 97, 97, 97, 97, 1103, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 917, 97, 97, 0, 0, 0, 637, 18, 131427, 0, 0, 0, 0, 0, 0, 362, 0, 0, 365, 29315, 367, 0, 921, 29315, 0, 0, 0, 927, 45, 45, 45, 45, 45, 45, 45, 45, 45, 1223, 45, 45, 45, 45, 45, 45, 45, 45, 45, 426, 45, 45, 433, 45, 45, 45, 45, 697, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 708, 45, 45, 45, 45, 1221, 45, 45, 45, 45, 1225, 45, 45, 45, 45, 45, 45, 384, 45, 45, 45, 45, 45, 45, 45, 45, 45, 1198, 45, 45, 45, 45, 45, 45, 67, 67, 795, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 1470, 67, 67, 67, 67, 67, 67, 67, 815, 67, 67, 67, 67, 67, 67, 25398, 542, 13112, 544, 97, 97, 97, 893, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 1164, 97, 97, 97, 67, 67, 67, 1025, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 1687, 67, 67, 67, 67, 67, 67, 67, 67, 67, 25398, 0, 13112, 0, 54074, 0, 0, 0, 0, 0, 1097, 1241, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 1450, 45, 45, 1388, 45, 1390, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 1236, 67, 67, 67, 67, 67, 1437, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 1472, 1490, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 1503, 67, 67, 67, 67, 67, 97, 97, 97, 97, 97, 0, 1930, 0, 97, 97, 97, 97, 97, 847, 97, 97, 97, 97, 97, 97, 97, 97, 97, 858, 67, 67, 1965, 67, 97, 97, 97, 97, 0, 0, 0, 97, 97, 97, 97, 0, 97, 97, 1719, 97, 97, 97, 97, 97, 97, 0, 0, 0, 45, 45, 45, 45, 1382, 45, 1383, 45, 45, 45, 159, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 1563, 45, 45, 45, 45, 45, 67, 261, 67, 67, 67, 67, 67, 0, 24850, 12564, 0, 0, 0, 0, 28809, 53531, 341, 97, 97, 97, 97, 97, 0, 40976, 0, 18, 18, 24, 24, 27, 27, 27, 97, 1099, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 1333, 97, 1230, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 67, 67, 67, 67, 67, 67, 1992, 67, 1993, 67, 67, 67, 97, 97, 45, 45, 160, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 1665, 45, 45, 45, 45, 45, 131427, 357, 0, 0, 0, 362, 0, 365, 28809, 367, 139, 45, 45, 45, 45, 45, 684, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 412, 45, 45, 45, 416, 45, 45, 45, 440, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 67, 67, 1990, 67, 1991, 67, 67, 67, 67, 67, 67, 67, 97, 97, 1707, 97, 97, 97, 97, 97, 97, 501, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 1691, 67, 67, 67, 67, 67, 526, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 1030, 67, 1032, 67, 67, 67, 67, 598, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 1632, 0, 921, 29315, 923, 0, 0, 0, 45, 45, 45, 45, 45, 45, 45, 45, 45, 1392, 45, 45, 45, 45, 45, 45, 45, 45, 45, 960, 45, 45, 45, 45, 45, 45, 67, 67, 67, 67, 67, 25398, 0, 13112, 0, 54074, 0, 0, 1093, 0, 0, 0, 0, 0, 97, 1609, 97, 97, 97, 97, 97, 97, 97, 97, 97, 1369, 97, 97, 97, 1372, 97, 97, 67, 67, 266, 67, 67, 67, 67, 0, 24850, 12564, 0, 0, 0, 0, 28809, 53531, 97, 346, 97, 97, 97, 97, 0, 40976, 0, 18, 18, 24, 24, 27, 27, 27, 665, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 1677, 45, 45, 45, 45, 67, 45, 45, 954, 45, 956, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 1404, 45, 45, 45, 45, 45, 45, 45, 45, 45, 425, 45, 45, 45, 45, 45, 45, 67, 67, 67, 67, 67, 1270, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 1069, 67, 67, 67, 67, 67, 67, 97, 97, 97, 1350, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 1524, 97, 97, 97, 97, 97, 97, 97, 1376, 0, 0, 0, 45, 45, 45, 45, 45, 45, 45, 45, 1545, 45, 45, 45, 45, 45, 45, 45, 45, 45, 448, 45, 45, 45, 45, 67, 456, 67, 67, 67, 67, 67, 1573, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 1247, 67, 67, 67, 67, 67, 1252, 97, 1725, 97, 0, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 1628, 97, 1630, 0, 0, 94242, 0, 0, 0, 2211840, 0, 1118208, 0, 0, 0, 0, 2158592, 2158731, 2158592, 2158592, 2158592, 3117056, 2158592, 2158592, 2158592, 2158592, 2158592, 2158592, 2158592, 2158592, 2158592, 2158592, 2158592, 2158592, 3018752, 2158592, 3043328, 2158592, 2158592, 2158592, 2158592, 3080192, 2158592, 2158592, 3112960, 2158592, 2158592, 2158592, 2158592, 2158592, 2158878, 2158592, 2158592, 2158592, 2158592, 2158592, 2158592, 2158592, 2158592, 2158592, 2158592, 2158592, 2158592, 2158592, 2158592, 2605056, 2158592, 2158592, 2207744, 0, 542, 0, 544, 0, 0, 2166784, 0, 0, 0, 550, 0, 0, 2158592, 2158592, 2686976, 2158592, 2715648, 2158592, 2158592, 2158592, 2158592, 2158592, 2158592, 2158592, 2867200, 2158592, 2904064, 2158592, 2158592, 2158592, 2158592, 2158592, 2158592, 2158592, 0, 94242, 0, 0, 0, 2211840, 0, 0, 1130496, 0, 0, 0, 2158592, 2158592, 2158592, 2158592, 2158592, 3186688, 2158592, 0, 0, 139, 0, 0, 0, 139, 0, 2367488, 2207744, 0, 0, 0, 0, 176128, 0, 2166784, 0, 0, 0, 0, 0, 286, 2158592, 2158592, 3170304, 3174400, 2158592, 0, 0, 0, 2158592, 2158592, 2158592, 2158592, 2158592, 2424832, 2158592, 2158592, 2158592, 1508, 2158592, 2908160, 2158592, 2158592, 2158592, 2977792, 2158592, 2158592, 2158592, 2158592, 3039232, 2158592, 2158592, 2158592, 2158592, 2158592, 2158592, 3158016, 67, 24850, 24850, 12564, 12564, 0, 0, 0, 0, 0, 53531, 53531, 0, 286, 97, 97, 97, 97, 97, 1119, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 1509, 97, 97, 97, 97, 97, 97, 97, 97, 564, 97, 97, 97, 97, 97, 97, 97, 57889, 0, 0, 0, 0, 550, 0, 97, 97, 97, 97, 97, 97, 97, 97, 97, 561, 97, 97, 97, 97, 97, 97, 576, 97, 97, 139264, 139264, 139264, 139264, 139264, 139264, 139264, 139264, 139264, 139264, 139264, 139264, 0, 0, 139264, 0, 921, 29315, 0, 0, 926, 0, 45, 45, 45, 45, 45, 45, 45, 45, 45, 1811, 45, 67, 67, 67, 67, 67, 0, 2146304, 2146304, 0, 0, 0, 0, 2224128, 2224128, 2224128, 2232320, 2232320, 2232320, 2232320, 0, 0, 1301, 0, 0, 0, 0, 0, 1307, 0, 0, 0, 0, 0, 1313, 0, 0, 0, 0, 0, 0, 0, 97, 97, 1318, 97, 97, 97, 97, 97, 97, 1795, 97, 97, 45, 45, 45, 45, 45, 45, 45, 446, 45, 45, 45, 45, 45, 45, 67, 67, 2158592, 2146304, 0, 0, 0, 0, 0, 0, 0, 2211840, 0, 0, 0, 0, 2158592, 0, 921, 29315, 0, 924, 0, 0, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 1537, 45, 45, 45, 45 ]; JSONiqTokenizer.EXPECTED = [ 290, 300, 304, 353, 296, 309, 305, 319, 315, 324, 328, 352, 354, 334, 338, 330, 320, 345, 349, 293, 358, 362, 341, 366, 312, 370, 374, 378, 382, 386, 390, 394, 398, 737, 402, 634, 439, 604, 634, 634, 634, 634, 408, 634, 634, 634, 404, 634, 634, 634, 457, 634, 634, 963, 634, 634, 413, 634, 634, 634, 634, 634, 634, 634, 663, 418, 422, 903, 902, 426, 431, 548, 634, 437, 521, 919, 443, 615, 409, 449, 455, 624, 731, 751, 634, 461, 465, 672, 470, 469, 474, 481, 485, 477, 489, 493, 629, 542, 497, 505, 603, 602, 991, 648, 510, 804, 634, 515, 958, 526, 525, 530, 768, 634, 546, 552, 711, 710, 593, 558, 562, 618, 566, 570, 574, 578, 582, 586, 590, 608, 612, 660, 822, 821, 634, 622, 596, 444, 628, 533, 724, 633, 640, 653, 647, 652, 536, 1008, 451, 450, 445, 657, 670, 676, 685, 689, 693, 697, 701, 704, 707, 715, 719, 798, 815, 634, 723, 762, 996, 634, 728, 969, 730, 735, 908, 634, 741, 679, 889, 511, 747, 634, 750, 755, 499, 666, 499, 501, 759, 772, 776, 780, 634, 787, 784, 797, 802, 809, 808, 427, 814, 1006, 517, 634, 519, 853, 634, 813, 850, 793, 634, 819, 826, 833, 832, 837, 843, 847, 857, 861, 863, 867, 871, 875, 879, 883, 643, 887, 539, 980, 979, 634, 893, 944, 634, 900, 896, 634, 907, 933, 506, 912, 917, 828, 433, 636, 635, 554, 961, 923, 930, 927, 937, 941, 634, 634, 634, 974, 948, 952, 985, 913, 968, 967, 743, 634, 973, 839, 634, 978, 599, 634, 984, 989, 765, 444, 995, 1000, 634, 1003, 790, 955, 1012, 681, 634, 634, 634, 634, 634, 414, 1016, 1020, 1024, 1085, 1027, 1090, 1090, 1046, 1080, 1137, 1108, 1215, 1049, 1032, 1039, 1085, 1085, 1085, 1085, 1058, 1062, 1068, 1085, 1086, 1090, 1090, 1091, 1072, 1064, 1107, 1090, 1090, 1090, 1118, 1123, 1138, 1078, 1074, 1084, 1085, 1085, 1085, 1087, 1090, 1062, 1052, 1060, 1114, 1062, 1104, 1085, 1085, 1090, 1090, 1028, 1122, 1063, 1128, 1139, 1127, 1158, 1085, 1085, 1151, 1090, 1090, 1090, 1095, 1090, 1132, 1073, 1136, 1143, 1061, 1150, 1085, 1155, 1098, 1101, 1146, 1162, 1169, 1101, 1185, 1151, 1090, 1110, 1173, 1054, 1087, 1109, 1177, 1165, 1089, 1204, 1184, 1107, 1189, 1193, 1088, 1197, 1180, 1201, 1208, 1042, 1212, 1219, 1223, 1227, 1231, 1235, 1245, 1777, 1527, 1686, 1686, 1238, 1686, 1254, 1686, 1686, 1686, 1294, 1669, 1686, 1686, 1686, 1322, 1625, 1534, 1268, 1624, 1275, 1281, 1443, 1292, 1300, 1686, 1686, 1686, 1350, 1826, 1306, 1686, 1686, 1240, 2032, 1317, 1321, 1686, 1686, 1253, 1686, 1326, 1686, 1686, 1686, 1418, 1709, 1446, 1686, 1686, 1686, 1492, 1686, 1295, 1447, 1686, 1686, 1258, 1686, 1736, 1686, 1686, 1520, 1355, 1686, 1288, 1348, 1361, 1686, 1359, 1686, 1364, 1498, 1368, 1302, 1362, 1381, 1389, 1395, 1486, 1686, 1371, 1377, 1370, 1686, 1375, 1382, 1384, 1402, 1408, 1385, 1383, 1619, 1413, 1423, 1428, 1433, 1686, 1686, 1270, 1686, 1338, 1686, 1440, 1686, 1686, 1686, 1499, 1465, 1686, 1686, 1686, 1639, 1473, 1884, 1686, 1686, 1293, 1864, 1686, 1686, 1296, 1321, 1483, 1686, 1686, 1686, 1646, 1686, 1748, 1496, 1686, 1418, 1675, 1686, 1418, 1702, 1686, 1418, 1981, 1686, 1429, 1409, 1427, 1504, 1692, 1686, 1686, 1313, 1448, 1651, 1508, 1686, 1686, 1340, 1686, 1903, 1686, 1686, 1435, 1513, 1686, 1283, 1287, 1519, 1686, 1524, 1363, 1568, 1938, 1539, 1566, 1579, 1479, 1533, 1538, 1553, 1544, 1552, 1557, 1563, 1574, 1557, 1583, 1589, 1590, 1759, 1594, 1603, 1607, 1611, 1686, 1436, 1514, 1686, 1434, 1656, 1686, 1434, 1680, 1686, 1453, 1686, 1686, 1686, 1559, 1617, 1686, 1770, 1418, 1623, 1769, 1629, 1686, 1515, 1335, 1686, 1285, 1686, 1671, 1921, 1650, 1686, 1686, 1344, 1308, 1666, 1686, 1686, 1686, 1659, 1685, 1686, 1686, 1686, 1686, 1241, 1686, 1686, 1844, 1691, 1686, 1630, 1977, 1970, 1362, 1686, 1686, 1686, 1693, 1698, 1686, 1686, 1686, 1697, 1686, 1764, 1715, 1686, 1634, 1638, 1686, 1599, 1585, 1686, 1271, 1686, 1269, 1686, 1721, 1686, 1686, 1354, 1686, 1801, 1686, 1799, 1686, 1640, 1686, 1686, 1461, 1686, 1686, 1732, 1686, 1944, 1686, 1740, 1686, 1746, 1415, 1396, 1686, 1598, 1547, 1417, 1597, 1416, 1577, 1546, 1397, 1577, 1547, 1548, 1570, 1398, 1753, 1686, 1652, 1509, 1686, 1686, 1686, 1757, 1686, 1419, 1686, 1763, 1418, 1768, 1781, 1686, 1686, 1686, 1705, 1686, 2048, 1792, 1686, 1686, 1686, 1735, 1686, 1797, 1686, 1686, 1404, 1686, 1639, 1815, 1686, 1686, 1418, 2017, 1820, 1686, 1686, 1803, 1686, 1686, 1686, 1736, 1489, 1686, 1686, 1825, 1338, 1260, 1263, 1686, 1686, 1785, 1686, 1686, 1728, 1686, 1686, 1749, 1497, 1830, 1830, 1262, 1248, 1261, 1329, 1260, 1264, 1329, 1248, 1249, 1259, 1540, 1849, 1842, 1686, 1686, 1835, 1686, 1686, 1816, 1686, 1686, 1831, 1882, 1848, 1686, 1686, 1686, 1774, 2071, 1854, 1686, 1686, 1469, 1884, 1686, 1821, 1859, 1686, 1686, 1350, 1883, 1686, 1686, 1686, 1781, 1391, 1875, 1686, 1686, 1613, 1644, 1686, 1686, 1889, 1686, 1686, 1662, 1884, 1686, 1885, 1890, 1686, 1686, 1686, 1894, 1686, 1686, 1678, 1686, 1907, 1686, 1686, 1529, 1914, 1686, 1838, 1686, 1686, 1881, 1686, 1686, 1872, 1876, 1836, 1919, 1686, 1837, 1692, 1910, 1686, 1925, 1928, 1742, 1686, 1811, 1811, 1930, 1810, 1929, 1935, 1928, 1900, 1942, 1867, 1868, 1931, 1035, 1788, 1948, 1952, 1956, 1960, 1964, 1686, 1976, 1686, 1686, 1686, 2065, 1686, 1992, 2037, 1686, 1686, 1998, 2009, 1972, 2002, 1686, 1686, 1686, 2077, 1300, 2023, 1686, 1686, 1686, 1807, 2031, 1686, 1686, 1686, 1860, 1500, 2032, 1686, 1686, 1686, 2083, 1686, 2036, 1686, 1277, 1276, 2042, 1877, 1686, 1686, 2041, 1686, 1686, 2027, 2037, 2012, 1686, 2012, 1855, 1850, 1686, 2046, 1686, 1686, 2054, 1996, 1686, 1897, 1309, 2059, 2052, 1686, 2058, 1686, 1686, 2081, 1686, 1717, 1477, 1686, 1331, 1686, 1686, 1687, 1686, 1860, 1681, 1686, 1686, 1686, 1966, 1724, 1686, 1686, 1686, 1984, 2015, 1686, 1686, 1686, 1988, 1686, 2063, 1686, 1686, 1686, 2005, 1686, 1727, 1686, 1686, 1711, 1457, 2069, 1686, 1686, 1686, 2019, 2075, 1686, 1686, 1915, 1686, 1686, 1793, 1874, 1686, 1686, 1491, 1362, 1449, 1686, 1686, 1460, 2098, 2087, 2091, 2095, 2184, 2102, 2113, 2780, 2117, 2134, 2142, 2281, 2146, 2146, 2146, 2304, 2296, 2181, 2639, 2591, 2872, 2592, 2873, 2313, 2195, 2200, 2281, 2146, 2273, 2226, 2204, 2152, 2219, 2276, 2167, 2177, 2276, 2235, 2276, 2276, 2230, 2281, 2276, 2296, 2276, 2293, 2276, 2276, 2276, 2276, 2234, 2276, 2311, 2314, 2210, 2199, 2217, 2222, 2276, 2276, 2276, 2240, 2276, 2294, 2276, 2276, 2173, 2276, 2198, 2281, 2281, 2281, 2281, 2282, 2146, 2146, 2146, 2146, 2205, 2146, 2204, 2248, 2276, 2235, 2276, 2297, 2276, 2276, 2276, 2277, 2256, 2281, 2283, 2146, 2146, 2146, 2275, 2276, 2295, 2276, 2276, 2293, 2146, 2304, 2264, 2269, 2221, 2276, 2276, 2276, 2293, 2295, 2276, 2276, 2276, 2295, 2263, 2205, 2268, 2220, 2172, 2276, 2276, 2276, 2296, 2276, 2276, 2296, 2294, 2276, 2276, 2278, 2281, 2281, 2280, 2281, 2281, 2281, 2283, 2206, 2223, 2276, 2276, 2279, 2281, 2281, 2146, 2273, 2276, 2276, 2281, 2281, 2281, 2276, 2292, 2276, 2298, 2225, 2276, 2298, 2169, 2224, 2292, 2298, 2171, 2229, 2281, 2281, 2171, 2236, 2281, 2281, 2281, 2146, 2275, 2225, 2292, 2299, 2276, 2229, 2281, 2146, 2276, 2290, 2297, 2283, 2146, 2146, 2274, 2224, 2227, 2298, 2225, 2297, 2276, 2230, 2170, 2230, 2282, 2146, 2147, 2151, 2156, 2288, 2276, 2230, 2303, 2308, 2236, 2284, 2228, 2318, 2318, 2318, 2326, 2335, 2339, 2343, 2349, 2416, 2693, 2357, 2592, 2109, 2592, 2592, 2162, 2943, 2823, 2646, 2592, 2361, 2592, 2122, 2592, 2592, 2122, 2470, 2592, 2592, 2592, 2109, 2107, 2592, 2592, 2592, 2123, 2592, 2592, 2592, 2125, 2592, 2413, 2592, 2592, 2592, 2127, 2592, 2592, 2414, 2592, 2592, 2592, 2130, 2952, 2592, 2594, 2592, 2592, 2212, 2609, 2252, 2592, 2592, 2592, 2446, 2434, 2592, 2592, 2592, 2212, 2446, 2450, 2456, 2431, 2435, 2592, 2592, 2243, 2478, 2448, 2439, 2946, 2592, 2592, 2592, 2368, 2809, 2813, 2450, 2441, 2212, 2812, 2449, 2440, 2947, 2592, 2592, 2592, 2345, 2451, 2457, 2948, 2592, 2124, 2592, 2592, 2650, 2823, 2449, 2455, 2946, 2592, 2128, 2592, 2592, 2649, 2952, 2592, 2810, 2448, 2461, 2991, 2467, 2592, 2592, 2329, 2817, 2474, 2990, 2466, 2592, 2592, 2373, 2447, 2992, 2469, 2592, 2592, 2592, 2373, 2447, 2477, 2468, 2592, 2592, 2353, 2469, 2592, 2495, 2592, 2592, 2415, 2483, 2592, 2415, 2496, 2592, 2592, 2352, 2592, 2592, 2352, 2352, 2469, 2592, 2592, 2363, 2331, 2494, 2592, 2592, 2592, 2375, 2592, 2375, 2415, 2504, 2592, 2592, 2367, 2372, 2503, 2592, 2592, 2592, 2389, 2418, 2415, 2592, 2592, 2373, 2592, 2592, 2592, 2593, 2732, 2417, 2415, 2592, 2417, 2520, 2592, 2592, 2592, 2390, 2521, 2521, 2592, 2592, 2592, 2401, 2599, 2585, 2526, 2531, 2120, 2592, 2212, 2426, 2450, 2463, 2948, 2592, 2592, 2592, 2213, 2389, 2527, 2532, 2121, 2542, 2551, 2105, 2592, 2213, 2592, 2592, 2592, 2558, 2538, 2544, 2553, 2557, 2537, 2543, 2552, 2421, 2572, 2576, 2546, 2543, 2547, 2592, 2592, 2373, 2615, 2575, 2545, 2105, 2592, 2244, 2479, 2592, 2129, 2592, 2592, 2628, 2690, 2469, 2562, 2566, 2592, 2592, 2592, 2415, 2928, 2934, 2401, 2570, 2574, 2564, 2572, 2585, 2590, 2592, 2592, 2585, 2965, 2592, 2592, 2592, 2445, 2251, 2592, 2592, 2592, 2474, 2592, 2609, 2892, 2592, 2362, 2592, 2592, 2138, 2851, 2159, 2592, 2592, 2592, 2509, 2888, 2892, 2592, 2592, 2592, 2490, 2418, 2891, 2592, 2592, 2376, 2592, 2592, 2374, 2592, 2889, 2388, 2592, 2373, 2373, 2890, 2592, 2592, 2387, 2592, 2887, 2505, 2892, 2592, 2373, 2610, 2388, 2592, 2592, 2376, 2373, 2592, 2887, 2891, 2592, 2374, 2592, 2592, 2608, 2159, 2614, 2620, 2592, 2592, 2394, 2594, 2887, 2399, 2592, 2887, 2397, 2508, 2374, 2507, 2592, 2375, 2592, 2592, 2592, 2595, 2508, 2506, 2592, 2506, 2505, 2505, 2592, 2507, 2637, 2505, 2592, 2592, 2401, 2661, 2592, 2643, 2592, 2592, 2417, 2592, 2655, 2592, 2592, 2592, 2510, 2414, 2656, 2592, 2592, 2592, 2516, 2592, 2593, 2660, 2665, 2880, 2592, 2592, 2592, 2522, 2767, 2666, 2881, 2592, 2592, 2420, 2571, 2696, 2592, 2592, 2592, 2580, 2572, 2686, 2632, 2698, 2592, 2383, 2514, 2592, 2163, 2932, 2465, 2685, 2631, 2697, 2592, 2388, 2592, 2592, 2212, 2604, 2671, 2632, 2678, 2592, 2401, 2405, 2409, 2592, 2592, 2592, 2679, 2592, 2592, 2592, 2592, 2108, 2677, 2591, 2592, 2592, 2592, 2419, 2592, 2683, 2187, 2191, 2469, 2671, 2189, 2467, 2592, 2401, 2629, 2633, 2702, 2468, 2592, 2592, 2421, 2536, 2703, 2469, 2592, 2592, 2422, 2573, 2593, 2672, 2467, 2592, 2402, 2406, 2592, 2402, 2979, 2592, 2592, 2626, 2673, 2467, 2592, 2446, 2259, 2947, 2592, 2377, 2709, 2592, 2592, 2522, 2862, 2713, 2468, 2592, 2592, 2581, 2572, 2562, 2374, 2374, 2592, 2376, 2721, 2724, 2592, 2592, 2624, 2373, 2731, 2592, 2592, 2592, 2626, 2732, 2592, 2592, 2592, 2755, 2656, 2726, 2736, 2741, 2592, 2486, 2593, 2381, 2592, 2727, 2737, 2742, 2715, 2747, 2753, 2592, 2498, 2469, 2873, 2743, 2592, 2592, 2592, 2791, 2759, 2763, 2592, 2592, 2627, 2704, 2592, 2592, 2522, 2789, 2593, 2761, 2753, 2592, 2498, 2863, 2592, 2592, 2767, 2592, 2592, 2592, 2792, 2789, 2592, 2592, 2592, 2803, 2126, 2592, 2592, 2592, 2811, 2122, 2592, 2592, 2592, 2834, 2777, 2592, 2592, 2592, 2848, 2936, 2591, 2489, 2797, 2592, 2592, 2670, 2631, 2490, 2798, 2592, 2592, 2592, 2963, 2807, 2592, 2592, 2592, 2965, 2838, 2592, 2592, 2592, 2975, 2330, 2818, 2829, 2592, 2498, 2939, 2592, 2498, 2592, 2791, 2331, 2819, 2830, 2592, 2592, 2592, 2982, 2834, 2817, 2828, 2106, 2592, 2592, 2592, 2405, 2405, 2817, 2828, 2592, 2592, 2415, 2849, 2842, 2592, 2522, 2773, 2592, 2522, 2868, 2592, 2580, 2600, 2586, 2137, 2850, 2843, 2592, 2592, 2855, 2937, 2844, 2592, 2592, 2592, 2987, 2936, 2591, 2592, 2592, 2684, 2630, 2592, 2856, 2938, 2592, 2592, 2860, 2939, 2592, 2592, 2872, 2592, 2861, 2591, 2592, 2592, 2887, 2616, 2592, 2867, 2592, 2592, 2708, 2592, 2498, 2469, 2498, 2497, 2785, 2773, 2499, 2783, 2770, 2877, 2877, 2877, 2772, 2592, 2592, 2345, 2885, 2592, 2592, 2592, 2715, 2762, 2515, 2896, 2592, 2592, 2715, 2917, 2516, 2897, 2592, 2592, 2592, 2901, 2906, 2911, 2592, 2592, 2956, 2960, 2715, 2902, 2907, 2912, 2593, 2916, 2920, 2820, 2922, 2822, 2592, 2592, 2715, 2927, 2921, 2821, 2106, 2592, 2592, 2974, 2408, 2321, 2821, 2106, 2592, 2592, 2983, 2592, 2593, 2404, 2408, 2592, 2592, 2717, 2749, 2716, 2928, 2322, 2822, 2593, 2926, 2919, 2820, 2934, 2823, 2592, 2592, 2592, 2651, 2824, 2592, 2592, 2592, 2130, 2952, 2592, 2592, 2592, 2592, 2964, 2592, 2592, 2716, 2748, 2592, 2969, 2592, 2592, 2716, 2918, 2368, 2970, 2592, 2592, 2592, 2403, 2407, 2592, 2592, 2787, 2211, 2404, 2409, 2592, 2592, 2802, 2837, 2987, 2592, 2592, 2592, 2809, 2427, 2592, 2793, 2592, 2592, 2809, 2447, 1073741824, 0x80000000, 539754496, 542375936, 402653184, 554434560, 571736064, 545521856, 268451840, 335544320, 268693630, 512, 2048, 256, 1024, 0, 1024, 0, 1073741824, 0x80000000, 0, 0, 0, 8388608, 0, 0, 1073741824, 1073741824, 0, 0x80000000, 537133056, 4194304, 1048576, 268435456, -1073741824, 0, 0, 0, 1048576, 0, 0, 0, 1572864, 0, 0, 0, 4194304, 0, 134217728, 16777216, 0, 0, 32, 64, 98304, 0, 33554432, 8388608, 192, 67108864, 67108864, 67108864, 67108864, 16, 32, 4, 0, 8192, 196608, 196608, 229376, 80, 4096, 524288, 8388608, 0, 0, 32, 128, 256, 24576, 24600, 24576, 24576, 2, 24576, 24576, 24576, 24584, 24592, 24576, 24578, 24576, 24578, 24576, 24576, 16, 512, 2048, 2048, 256, 4096, 32768, 1048576, 4194304, 67108864, 134217728, 268435456, 262144, 134217728, 0, 128, 128, 64, 16384, 16384, 16384, 67108864, 32, 32, 4, 4, 4096, 262144, 134217728, 0, 0, 0, 2, 0, 8192, 131072, 131072, 4096, 4096, 4096, 4096, 24576, 24576, 24576, 8, 8, 24576, 24576, 16384, 16384, 16384, 24576, 24584, 24576, 24576, 24576, 16384, 24576, 536870912, 262144, 0, 0, 32, 2048, 8192, 4, 4096, 4096, 4096, 786432, 8388608, 16777216, 0, 128, 16384, 16384, 16384, 32768, 65536, 2097152, 32, 32, 32, 32, 4, 4, 4, 4, 4, 4096, 67108864, 67108864, 67108864, 24576, 24576, 24576, 24576, 0, 16384, 16384, 16384, 16384, 67108864, 67108864, 8, 67108864, 24576, 8, 8, 8, 24576, 24576, 24576, 24578, 24576, 24576, 24576, 2, 2, 2, 16384, 67108864, 67108864, 67108864, 32, 67108864, 8, 8, 24576, 2048, 0x80000000, 536870912, 262144, 262144, 262144, 67108864, 8, 24576, 16384, 32768, 1048576, 4194304, 25165824, 67108864, 24576, 32770, 2, 4, 112, 512, 98304, 524288, 50, 402653186, 1049090, 1049091, 10, 66, 100925514, 10, 66, 12582914, 0, 0, -1678194207, -1678194207, -1041543218, 0, 32768, 0, 0, 32, 65536, 268435456, 1, 1, 513, 1048577, 0, 12582912, 0, 0, 0, 4, 1792, 0, 0, 0, 7, 29360128, 0, 0, 0, 8, 0, 0, 0, 12, 1, 1, 0, 0, -604102721, -604102721, 4194304, 8388608, 0, 0, 0, 31, 925600, 997981306, 997981306, 997981306, 0, 0, 2048, 8388608, 0, 0, 1, 2, 4, 32, 64, 512, 8192, 0, 0, 0, 245760, 997720064, 0, 0, 0, 32, 0, 0, 0, 3, 12, 16, 32, 8, 112, 3072, 12288, 16384, 32768, 65536, 131072, 7864320, 16777216, 973078528, 0, 0, 65536, 131072, 3670016, 4194304, 16777216, 33554432, 2, 8, 48, 2048, 8192, 16384, 32768, 65536, 131072, 524288, 131072, 524288, 3145728, 4194304, 16777216, 33554432, 65536, 131072, 2097152, 4194304, 16777216, 33554432, 134217728, 268435456, 536870912, 0, 0, 0, 1024, 0, 8, 48, 2048, 8192, 65536, 33554432, 268435456, 536870912, 65536, 268435456, 536870912, 0, 0, 32768, 0, 0, 126, 623104, 65011712, 0, 32, 65536, 536870912, 0, 0, 65536, 524288, 0, 32, 65536, 0, 0, 0, 2048, 0, 0, 0, 15482, 245760, -604102721, 0, 0, 0, 18913, 33062912, 925600, -605028352, 0, 0, 0, 65536, 31, 8096, 131072, 786432, 3145728, 3145728, 12582912, 50331648, 134217728, 268435456, 160, 256, 512, 7168, 131072, 786432, 131072, 786432, 1048576, 2097152, 12582912, 16777216, 268435456, 1073741824, 0x80000000, 12582912, 16777216, 33554432, 268435456, 1073741824, 0x80000000, 3, 12, 16, 160, 256, 7168, 786432, 1048576, 12582912, 16777216, 268435456, 1073741824, 0, 8, 16, 32, 128, 256, 512, 7168, 786432, 1048576, 2097152, 0, 1, 2, 8, 16, 7168, 786432, 1048576, 8388608, 16777216, 16777216, 1073741824, 0, 0, 0, 0, 1, 0, 0, 8, 32, 128, 256, 7168, 8, 32, 0, 3072, 0, 8, 32, 3072, 4096, 524288, 8, 32, 0, 0, 3072, 4096, 0, 2048, 524288, 8388608, 8, 2048, 0, 0, 1, 12, 256, 4096, 32768, 262144, 1048576, 4194304, 67108864, 0, 2048, 0, 2048, 2048, 1073741824, -58805985, -58805985, -58805985, 0, 0, 262144, 0, 0, 32, 4194304, 16777216, 134217728, 4382, 172032, -58982400, 0, 0, 2, 28, 256, 4096, 8192, 8192, 32768, 131072, 262144, 524288, 1, 2, 12, 256, 4096, 0, 0, 4194304, 67108864, 134217728, 805306368, 1073741824, 0, 0, 1, 2, 12, 16, 256, 4096, 1048576, 67108864, 134217728, 268435456, 0, 512, 1048576, 4194304, 201326592, 1879048192, 0, 0, 12, 256, 4096, 134217728, 268435456, 536870912, 12, 256, 268435456, 536870912, 0, 12, 256, 0, 0, 1, 32, 64, 512, 0, 0, 205236961, 205236961, 0, 0, 0, 1, 96, 640, 1, 10976, 229376, 204996608, 0, 640, 2048, 8192, 229376, 1572864, 1572864, 2097152, 201326592, 0, 0, 0, 64, 512, 2048, 229376, 1572864, 201326592, 1572864, 201326592, 0, 0, 1, 4382, 0, 1, 32, 2048, 65536, 131072, 1572864, 201326592, 131072, 1572864, 134217728, 0, 0, 524288, 524288, 0, 0, 0, -68582786, -68582786, -68582786, 0, 0, 2097152, 524288, 0, 524288, 0, 0, 65536, 131072, 1572864, 0, 0, 2, 4, 0, 0, 65011712, -134217728, 0, 0, 0, 0, 2, 4, 120, 512, -268435456, 0, 0, 0, 2, 8, 48, 64, 2048, 8192, 98304, 524288, 2097152, 4194304, 25165824, 33554432, 134217728, 268435456, 0x80000000, 0, 0, 25165824, 33554432, 134217728, 1879048192, 0x80000000, 0, 0, 4, 112, 512, 622592, 65011712, 134217728, -268435456, 16777216, 33554432, 134217728, 1610612736, 0, 0, 0, 64, 98304, 524288, 4194304, 16777216, 33554432, 0, 98304, 524288, 16777216, 33554432, 0, 65536, 524288, 33554432, 536870912, 1073741824, 0, 65536, 524288, 536870912, 1073741824, 0, 0, 65536, 524288, 536870912, 0, 524288, 0, 524288, 524288, 1048576, 2086666240, 0x80000000, 0, -1678194207, 0, 0, 0, 8, 32, 2048, 524288, 8388608, 0, 0, 33062912, 436207616, 0x80000000, 0, 0, 32, 64, 2432, 16384, 32768, 32768, 524288, 3145728, 4194304, 25165824, 25165824, 167772160, 268435456, 0x80000000, 0, 32, 64, 384, 2048, 16384, 32768, 1048576, 2097152, 4194304, 25165824, 32, 64, 128, 256, 2048, 16384, 2048, 16384, 1048576, 4194304, 16777216, 33554432, 134217728, 536870912, 1073741824, 0, 0, 2048, 16384, 4194304, 16777216, 33554432, 134217728, 805306368, 0, 0, 16777216, 134217728, 268435456, 0x80000000, 0, 622592, 622592, 622592, 8807, 8807, 434791, 0, 0, 16777216, 0, 0, 0, 7, 608, 8192, 0, 0, 0, 3, 4, 96, 512, 32, 64, 8192, 0, 0, 16777216, 134217728, 0, 0, 2, 4, 8192, 16384, 65536, 2097152, 33554432, 268435456 ]; JSONiqTokenizer.TOKEN = [ "(0)", "ModuleDecl", "Annotation", "OptionDecl", "Operator", "Variable", "Tag", "EndTag", "PragmaContents", "DirCommentContents", "DirPIContents", "CDataSectionContents", "AttrTest", "Wildcard", "EQName", "IntegerLiteral", "DecimalLiteral", "DoubleLiteral", "PredefinedEntityRef", "'\"\"'", "EscapeApos", "QuotChar", "AposChar", "ElementContentChar", "QuotAttrContentChar", "AposAttrContentChar", "NCName", "QName", "S", "CharRef", "CommentContents", "DocTag", "DocCommentContents", "EOF", "'!'", "'\"'", "'#'", "'#)'", "''''", "'('", "'(#'", "'(:'", "'(:~'", "')'", "'*'", "'*'", "','", "'-->'", "'.'", "'/'", "'/>'", "':'", "':)'", "';'", "'') { flags.in_html_comment = false; parser_pos += 2; return ['-->', 'TK_COMMENT']; } if (c === '.') { return [c, 'TK_DOT']; } if (in_array(c, punct)) { while (parser_pos < input_length && in_array(c + input.charAt(parser_pos), punct)) { c += input.charAt(parser_pos); parser_pos += 1; if (parser_pos >= input_length) { break; } } if (c === ',') { return [c, 'TK_COMMA']; } else if (c === '=') { return [c, 'TK_EQUALS']; } else { return [c, 'TK_OPERATOR']; } } return [c, 'TK_UNKNOWN']; } function handle_start_expr() { if (start_of_statement()) { // The conditional starts the statement if appropriate. } var next_mode = MODE.Expression; if (token_text === '[') { if (last_type === 'TK_WORD' || flags.last_text === ')') { // this is array index specifier, break immediately // a[x], fn()[x] if (in_array(flags.last_text, line_starters)) { output_space_before_token = true; } set_mode(next_mode); print_token(); indent(); if (opt.space_in_paren) { output_space_before_token = true; } return; } next_mode = MODE.ArrayLiteral; if (is_array(flags.mode)) { if (flags.last_text === '[' || (flags.last_text === ',' && (last_last_text === ']' || last_last_text === '}'))) { // ], [ goes to new line // }, [ goes to new line if (!opt.keep_array_indentation) { print_newline(); } } } } else { if (flags.last_text === 'for') { next_mode = MODE.ForInitializer; } else if (in_array(flags.last_text, ['if', 'while'])) { next_mode = MODE.Conditional; } else { // next_mode = MODE.Expression; } } if (flags.last_text === ';' || last_type === 'TK_START_BLOCK') { print_newline(); } else if (last_type === 'TK_END_EXPR' || last_type === 'TK_START_EXPR' || last_type === 'TK_END_BLOCK' || flags.last_text === '.') { // TODO: Consider whether forcing this is required. Review failing tests when removed. allow_wrap_or_preserved_newline(input_wanted_newline); output_wrapped = false; // do nothing on (( and )( and ][ and ]( and .( } else if (last_type !== 'TK_WORD' && last_type !== 'TK_OPERATOR') { output_space_before_token = true; } else if (flags.last_word === 'function' || flags.last_word === 'typeof') { // function() vs function () if (opt.jslint_happy) { output_space_before_token = true; } } else if (in_array(flags.last_text, line_starters) || flags.last_text === 'catch') { if (opt.space_before_conditional) { output_space_before_token = true; } } // Support of this kind of newline preservation. // a = (b && // (c || d)); if (token_text === '(') { if (last_type === 'TK_EQUALS' || last_type === 'TK_OPERATOR') { if (!start_of_object_property()) { allow_wrap_or_preserved_newline(); } } } set_mode(next_mode); print_token(); if (opt.space_in_paren) { output_space_before_token = true; } // In all cases, if we newline while inside an expression it should be indented. indent(); } function handle_end_expr() { // statements inside expressions are not valid syntax, but... // statements must all be closed when their container closes while (flags.mode === MODE.Statement) { restore_mode(); } if (token_text === ']' && is_array(flags.mode) && flags.multiline_frame && !opt.keep_array_indentation) { print_newline(); } if (flags.multiline_frame) { allow_wrap_or_preserved_newline(); } if (opt.space_in_paren) { if (last_type === 'TK_START_EXPR') { // () [] no inner space in empty parens like these, ever, ref #320 trim_output(); output_space_before_token = false; } else { output_space_before_token = true; } } if (token_text === ']' && opt.keep_array_indentation) { print_token(); restore_mode(); } else { restore_mode(); print_token(); } remove_redundant_indentation(previous_flags); // do {} while () // no statement required after if (flags.do_while && previous_flags.mode === MODE.Conditional) { previous_flags.mode = MODE.Expression; flags.do_block = false; flags.do_while = false; } } function handle_start_block() { set_mode(MODE.BlockStatement); var empty_braces = is_next('}'); var empty_anonymous_function = empty_braces && flags.last_word === 'function' && last_type === 'TK_END_EXPR'; if (opt.brace_style === "expand") { if (last_type !== 'TK_OPERATOR' && (empty_anonymous_function || last_type === 'TK_EQUALS' || (is_special_word(flags.last_text) && flags.last_text !== 'else'))) { output_space_before_token = true; } else { print_newline(); } } else { // collapse if (last_type !== 'TK_OPERATOR' && last_type !== 'TK_START_EXPR') { if (last_type === 'TK_START_BLOCK') { print_newline(); } else { output_space_before_token = true; } } else { // if TK_OPERATOR or TK_START_EXPR if (is_array(previous_flags.mode) && flags.last_text === ',') { if (last_last_text === '}') { // }, { in array context output_space_before_token = true; } else { print_newline(); // [a, b, c, { } } } } print_token(); indent(); } function handle_end_block() { // statements must all be closed when their container closes while (flags.mode === MODE.Statement) { restore_mode(); } var empty_braces = last_type === 'TK_START_BLOCK'; if (opt.brace_style === "expand") { if (!empty_braces) { print_newline(); } } else { // skip {} if (!empty_braces) { if (is_array(flags.mode) && opt.keep_array_indentation) { // we REALLY need a newline here, but newliner would skip that opt.keep_array_indentation = false; print_newline(); opt.keep_array_indentation = true; } else { print_newline(); } } } restore_mode(); print_token(); } function handle_word() { if (start_of_statement()) { // The conditional starts the statement if appropriate. } else if (input_wanted_newline && !is_expression(flags.mode) && (last_type !== 'TK_OPERATOR' || (flags.last_text === '--' || flags.last_text === '++')) && last_type !== 'TK_EQUALS' && (opt.preserve_newlines || flags.last_text !== 'var')) { print_newline(); } if (flags.do_block && !flags.do_while) { if (token_text === 'while') { // do {} ## while () output_space_before_token = true; print_token(); output_space_before_token = true; flags.do_while = true; return; } else { // do {} should always have while as the next word. // if we don't see the expected while, recover print_newline(); flags.do_block = false; } } // if may be followed by else, or not // Bare/inline ifs are tricky // Need to unwind the modes correctly: if (a) if (b) c(); else d(); else e(); if (flags.if_block) { if (token_text !== 'else') { while (flags.mode === MODE.Statement) { restore_mode(); } flags.if_block = false; } } if (token_text === 'case' || (token_text === 'default' && flags.in_case_statement)) { print_newline(); if (flags.case_body || opt.jslint_happy) { // switch cases following one another deindent(); flags.case_body = false; } print_token(); flags.in_case = true; flags.in_case_statement = true; return; } if (token_text === 'function') { if (flags.var_line && last_type !== 'TK_EQUALS') { flags.var_line_reindented = true; } if (in_array(flags.last_text, ['}', ';']) || (just_added_newline() && ! in_array(flags.last_text, ['{', ':', '=', ',']))) { // make sure there is a nice clean space of at least one blank line // before a new function definition if ( ! just_added_blankline() && ! flags.had_comment) { print_newline(); print_newline(true); } } if (last_type === 'TK_WORD') { if (flags.last_text === 'get' || flags.last_text === 'set' || flags.last_text === 'new' || flags.last_text === 'return') { output_space_before_token = true; } else { print_newline(); } } else if (last_type === 'TK_OPERATOR' || flags.last_text === '=') { // foo = function output_space_before_token = true; } else if (is_expression(flags.mode)) { // (function } else { print_newline(); } } if (last_type === 'TK_COMMA' || last_type === 'TK_START_EXPR' || last_type === 'TK_EQUALS' || last_type === 'TK_OPERATOR') { if (!start_of_object_property()) { allow_wrap_or_preserved_newline(); } } if (token_text === 'function') { print_token(); flags.last_word = token_text; return; } prefix = 'NONE'; if (last_type === 'TK_END_BLOCK') { if (!in_array(token_text, ['else', 'catch', 'finally'])) { prefix = 'NEWLINE'; } else { if (opt.brace_style === "expand" || opt.brace_style === "end-expand") { prefix = 'NEWLINE'; } else { prefix = 'SPACE'; output_space_before_token = true; } } } else if (last_type === 'TK_SEMICOLON' && flags.mode === MODE.BlockStatement) { // TODO: Should this be for STATEMENT as well? prefix = 'NEWLINE'; } else if (last_type === 'TK_SEMICOLON' && is_expression(flags.mode)) { prefix = 'SPACE'; } else if (last_type === 'TK_STRING') { prefix = 'NEWLINE'; } else if (last_type === 'TK_WORD') { prefix = 'SPACE'; } else if (last_type === 'TK_START_BLOCK') { prefix = 'NEWLINE'; } else if (last_type === 'TK_END_EXPR') { output_space_before_token = true; prefix = 'NEWLINE'; } if (in_array(token_text, line_starters) && flags.last_text !== ')') { if (flags.last_text === 'else') { prefix = 'SPACE'; } else { prefix = 'NEWLINE'; } } if (in_array(token_text, ['else', 'catch', 'finally'])) { if (last_type !== 'TK_END_BLOCK' || opt.brace_style === "expand" || opt.brace_style === "end-expand") { print_newline(); } else { trim_output(true); var line = output_lines[output_lines.length - 1]; // If we trimmed and there's something other than a close block before us // put a newline back in. Handles '} // comment' scenario. if (line.text[line.text.length - 1] !== '}') { print_newline(); } output_space_before_token = true; } } else if (prefix === 'NEWLINE') { if (is_special_word(flags.last_text)) { // no newline between 'return nnn' output_space_before_token = true; } else if (last_type !== 'TK_END_EXPR') { if ((last_type !== 'TK_START_EXPR' || token_text !== 'var') && flags.last_text !== ':') { // no need to force newline on 'var': for (var x = 0...) if (token_text === 'if' && flags.last_word === 'else' && flags.last_text !== '{') { // no newline for } else if { output_space_before_token = true; } else { flags.var_line = false; flags.var_line_reindented = false; print_newline(); } } } else if (in_array(token_text, line_starters) && flags.last_text !== ')') { flags.var_line = false; flags.var_line_reindented = false; print_newline(); } } else if (is_array(flags.mode) && flags.last_text === ',' && last_last_text === '}') { print_newline(); // }, in lists get a newline treatment } else if (prefix === 'SPACE') { output_space_before_token = true; } print_token(); flags.last_word = token_text; if (token_text === 'var') { flags.var_line = true; flags.var_line_reindented = false; flags.var_line_tainted = false; } if (token_text === 'do') { flags.do_block = true; } if (token_text === 'if') { flags.if_block = true; } } function handle_semicolon() { if (start_of_statement()) { // The conditional starts the statement if appropriate. // Semicolon can be the start (and end) of a statement output_space_before_token = false; } while (flags.mode === MODE.Statement && !flags.if_block && !flags.do_block) { restore_mode(); } print_token(); flags.var_line = false; flags.var_line_reindented = false; if (flags.mode === MODE.ObjectLiteral) { // if we're in OBJECT mode and see a semicolon, its invalid syntax // recover back to treating this as a BLOCK flags.mode = MODE.BlockStatement; } } function handle_string() { if (start_of_statement()) { // The conditional starts the statement if appropriate. // One difference - strings want at least a space before output_space_before_token = true; } else if (last_type === 'TK_WORD') { output_space_before_token = true; } else if (last_type === 'TK_COMMA' || last_type === 'TK_START_EXPR' || last_type === 'TK_EQUALS' || last_type === 'TK_OPERATOR') { if (!start_of_object_property()) { allow_wrap_or_preserved_newline(); } } else { print_newline(); } print_token(); } function handle_equals() { if (flags.var_line) { // just got an '=' in a var-line, different formatting/line-breaking, etc will now be done flags.var_line_tainted = true; } output_space_before_token = true; print_token(); output_space_before_token = true; } function handle_comma() { if (flags.var_line) { if (is_expression(flags.mode) || last_type === 'TK_END_BLOCK') { // do not break on comma, for(var a = 1, b = 2) flags.var_line_tainted = false; } if (flags.var_line) { flags.var_line_reindented = true; } print_token(); if (flags.var_line_tainted) { flags.var_line_tainted = false; print_newline(); } else { output_space_before_token = true; } return; } if (last_type === 'TK_END_BLOCK' && flags.mode !== MODE.Expression) { print_token(); if (flags.mode === MODE.ObjectLiteral && flags.last_text === '}') { print_newline(); } else { output_space_before_token = true; } } else { if (flags.mode === MODE.ObjectLiteral) { print_token(); print_newline(); } else { // EXPR or DO_BLOCK print_token(); output_space_before_token = true; } } } function handle_operator() { var space_before = true; var space_after = true; if (is_special_word(flags.last_text)) { // "return" had a special handling in TK_WORD. Now we need to return the favor output_space_before_token = true; print_token(); return; } // hack for actionscript's import .*; if (token_text === '*' && last_type === 'TK_DOT' && !last_last_text.match(/^\d+$/)) { print_token(); return; } if (token_text === ':' && flags.in_case) { flags.case_body = true; indent(); print_token(); print_newline(); flags.in_case = false; return; } if (token_text === '::') { // no spaces around exotic namespacing syntax operator print_token(); return; } // http://www.ecma-international.org/ecma-262/5.1/#sec-7.9.1 // if there is a newline between -- or ++ and anything else we should preserve it. if (input_wanted_newline && (token_text === '--' || token_text === '++')) { print_newline(); } if (in_array(token_text, ['--', '++', '!']) || (in_array(token_text, ['-', '+']) && (in_array(last_type, ['TK_START_BLOCK', 'TK_START_EXPR', 'TK_EQUALS', 'TK_OPERATOR']) || in_array(flags.last_text, line_starters) || flags.last_text === ','))) { // unary operators (and binary +/- pretending to be unary) special cases space_before = false; space_after = false; if (flags.last_text === ';' && is_expression(flags.mode)) { // for (;; ++i) // ^^^ space_before = true; } if (last_type === 'TK_WORD' && in_array(flags.last_text, line_starters)) { space_before = true; } if ((flags.mode === MODE.BlockStatement || flags.mode === MODE.Statement) && (flags.last_text === '{' || flags.last_text === ';')) { // { foo; --i } // foo(); --bar; print_newline(); } } else if (token_text === ':') { if (flags.ternary_depth === 0) { if (flags.mode === MODE.BlockStatement) { flags.mode = MODE.ObjectLiteral; } space_before = false; } else { flags.ternary_depth -= 1; } } else if (token_text === '?') { flags.ternary_depth += 1; } output_space_before_token = output_space_before_token || space_before; print_token(); output_space_before_token = space_after; } function handle_block_comment() { var lines = split_newlines(token_text); var j; // iterator for this case var javadoc = false; // block comment starts with a new line print_newline(false, true); if (lines.length > 1) { if (all_lines_start_with(lines.slice(1), '*')) { javadoc = true; } } // first line always indented print_token(lines[0]); for (j = 1; j < lines.length; j++) { print_newline(false, true); if (javadoc) { // javadoc: reformat and re-indent print_token(' ' + trim(lines[j])); } else { // normal comments output raw output_lines[output_lines.length - 1].text.push(lines[j]); } } // for comments of more than one line, make sure there's a new line after print_newline(false, true); } function handle_inline_comment() { output_space_before_token = true; print_token(); output_space_before_token = true; } function handle_comment() { if (input_wanted_newline) { print_newline(false, true); } else { trim_output(true); } output_space_before_token = true; print_token(); print_newline(false, true); } function handle_dot() { if (is_special_word(flags.last_text)) { output_space_before_token = true; } else { // allow preserved newlines before dots in general // force newlines on dots after close paren when break_chained - for bar().baz() allow_wrap_or_preserved_newline(flags.last_text === ')' && opt.break_chained_methods); } print_token(); } function handle_unknown() { print_token(); if (token_text[token_text.length - 1] === '\n') { print_newline(); } } } if (typeof define === "function" && define.amd) { define([], function() { return js_beautify; }); } else if (typeof exports !== "undefined") { // Add support for CommonJS. Just put this file somewhere on your require.paths // and you will be able to `var js_beautify = require("beautify").js_beautify`. exports.js_beautify = js_beautify; } else if (typeof window !== "undefined") { // If we're running a web page and don't have either of the above, add our one global window.js_beautify = js_beautify; } else if (typeof global !== "undefined") { // If we don't even have window, try global. global.js_beautify = js_beautify; } }()); apache-couchdb-1.6.0/src/fauxton/assets/js/plugins/zeroclipboard/0000755000175000001440000000000012332105600025024 5ustar00djcusers00000000000000apache-couchdb-1.6.0/src/fauxton/assets/js/plugins/zeroclipboard/ZeroClipboard.js0000755000175000001440000011105212332105522030127 0ustar00djcusers00000000000000/*! * ZeroClipboard * The ZeroClipboard library provides an easy way to copy text to the clipboard using an invisible Adobe Flash movie and a JavaScript interface. * Copyright (c) 2014 Jon Rohan, James M. Greene * Licensed MIT * http://zeroclipboard.org/ * v1.3.5 */ (function(window) { "use strict"; var currentElement; var flashState = { bridge: null, version: "0.0.0", disabled: null, outdated: null, ready: null }; var _clipData = {}; var clientIdCounter = 0; var _clientMeta = {}; var elementIdCounter = 0; var _elementMeta = {}; var _amdModuleId = null; var _cjsModuleId = null; var _swfPath = function() { var i, jsDir, tmpJsPath, jsPath, swfPath = "ZeroClipboard.swf"; if (document.currentScript && (jsPath = document.currentScript.src)) {} else { var scripts = document.getElementsByTagName("script"); if ("readyState" in scripts[0]) { for (i = scripts.length; i--; ) { if (scripts[i].readyState === "interactive" && (jsPath = scripts[i].src)) { break; } } } else if (document.readyState === "loading") { jsPath = scripts[scripts.length - 1].src; } else { for (i = scripts.length; i--; ) { tmpJsPath = scripts[i].src; if (!tmpJsPath) { jsDir = null; break; } tmpJsPath = tmpJsPath.split("#")[0].split("?")[0]; tmpJsPath = tmpJsPath.slice(0, tmpJsPath.lastIndexOf("/") + 1); if (jsDir == null) { jsDir = tmpJsPath; } else if (jsDir !== tmpJsPath) { jsDir = null; break; } } if (jsDir !== null) { jsPath = jsDir; } } } if (jsPath) { jsPath = jsPath.split("#")[0].split("?")[0]; swfPath = jsPath.slice(0, jsPath.lastIndexOf("/") + 1) + swfPath; } return swfPath; }(); var _camelizeCssPropName = function() { var matcherRegex = /\-([a-z])/g, replacerFn = function(match, group) { return group.toUpperCase(); }; return function(prop) { return prop.replace(matcherRegex, replacerFn); }; }(); var _getStyle = function(el, prop) { var value, camelProp, tagName, possiblePointers, i, len; if (window.getComputedStyle) { value = window.getComputedStyle(el, null).getPropertyValue(prop); } else { camelProp = _camelizeCssPropName(prop); if (el.currentStyle) { value = el.currentStyle[camelProp]; } else { value = el.style[camelProp]; } } if (prop === "cursor") { if (!value || value === "auto") { tagName = el.tagName.toLowerCase(); if (tagName === "a") { return "pointer"; } } } return value; }; var _elementMouseOver = function(event) { if (!event) { event = window.event; } var target; if (this !== window) { target = this; } else if (event.target) { target = event.target; } else if (event.srcElement) { target = event.srcElement; } ZeroClipboard.activate(target); }; var _addEventHandler = function(element, method, func) { if (!element || element.nodeType !== 1) { return; } if (element.addEventListener) { element.addEventListener(method, func, false); } else if (element.attachEvent) { element.attachEvent("on" + method, func); } }; var _removeEventHandler = function(element, method, func) { if (!element || element.nodeType !== 1) { return; } if (element.removeEventListener) { element.removeEventListener(method, func, false); } else if (element.detachEvent) { element.detachEvent("on" + method, func); } }; var _addClass = function(element, value) { if (!element || element.nodeType !== 1) { return element; } if (element.classList) { if (!element.classList.contains(value)) { element.classList.add(value); } return element; } if (value && typeof value === "string") { var classNames = (value || "").split(/\s+/); if (element.nodeType === 1) { if (!element.className) { element.className = value; } else { var className = " " + element.className + " ", setClass = element.className; for (var c = 0, cl = classNames.length; c < cl; c++) { if (className.indexOf(" " + classNames[c] + " ") < 0) { setClass += " " + classNames[c]; } } element.className = setClass.replace(/^\s+|\s+$/g, ""); } } } return element; }; var _removeClass = function(element, value) { if (!element || element.nodeType !== 1) { return element; } if (element.classList) { if (element.classList.contains(value)) { element.classList.remove(value); } return element; } if (value && typeof value === "string" || value === undefined) { var classNames = (value || "").split(/\s+/); if (element.nodeType === 1 && element.className) { if (value) { var className = (" " + element.className + " ").replace(/[\n\t]/g, " "); for (var c = 0, cl = classNames.length; c < cl; c++) { className = className.replace(" " + classNames[c] + " ", " "); } element.className = className.replace(/^\s+|\s+$/g, ""); } else { element.className = ""; } } } return element; }; var _getZoomFactor = function() { var rect, physicalWidth, logicalWidth, zoomFactor = 1; if (typeof document.body.getBoundingClientRect === "function") { rect = document.body.getBoundingClientRect(); physicalWidth = rect.right - rect.left; logicalWidth = document.body.offsetWidth; zoomFactor = Math.round(physicalWidth / logicalWidth * 100) / 100; } return zoomFactor; }; var _getDOMObjectPosition = function(obj, defaultZIndex) { var info = { left: 0, top: 0, width: 0, height: 0, zIndex: _getSafeZIndex(defaultZIndex) - 1 }; if (obj.getBoundingClientRect) { var rect = obj.getBoundingClientRect(); var pageXOffset, pageYOffset, zoomFactor; if ("pageXOffset" in window && "pageYOffset" in window) { pageXOffset = window.pageXOffset; pageYOffset = window.pageYOffset; } else { zoomFactor = _getZoomFactor(); pageXOffset = Math.round(document.documentElement.scrollLeft / zoomFactor); pageYOffset = Math.round(document.documentElement.scrollTop / zoomFactor); } var leftBorderWidth = document.documentElement.clientLeft || 0; var topBorderWidth = document.documentElement.clientTop || 0; info.left = rect.left + pageXOffset - leftBorderWidth; info.top = rect.top + pageYOffset - topBorderWidth; info.width = "width" in rect ? rect.width : rect.right - rect.left; info.height = "height" in rect ? rect.height : rect.bottom - rect.top; } return info; }; var _cacheBust = function(path, options) { var cacheBust = options == null || options && options.cacheBust === true && options.useNoCache === true; if (cacheBust) { return (path.indexOf("?") === -1 ? "?" : "&") + "noCache=" + new Date().getTime(); } else { return ""; } }; var _vars = function(options) { var i, len, domain, str = [], domains = [], trustedOriginsExpanded = []; if (options.trustedOrigins) { if (typeof options.trustedOrigins === "string") { domains.push(options.trustedOrigins); } else if (typeof options.trustedOrigins === "object" && "length" in options.trustedOrigins) { domains = domains.concat(options.trustedOrigins); } } if (options.trustedDomains) { if (typeof options.trustedDomains === "string") { domains.push(options.trustedDomains); } else if (typeof options.trustedDomains === "object" && "length" in options.trustedDomains) { domains = domains.concat(options.trustedDomains); } } if (domains.length) { for (i = 0, len = domains.length; i < len; i++) { if (domains.hasOwnProperty(i) && domains[i] && typeof domains[i] === "string") { domain = _extractDomain(domains[i]); if (!domain) { continue; } if (domain === "*") { trustedOriginsExpanded = [ domain ]; break; } trustedOriginsExpanded.push.apply(trustedOriginsExpanded, [ domain, "//" + domain, window.location.protocol + "//" + domain ]); } } } if (trustedOriginsExpanded.length) { str.push("trustedOrigins=" + encodeURIComponent(trustedOriginsExpanded.join(","))); } if (typeof options.jsModuleId === "string" && options.jsModuleId) { str.push("jsModuleId=" + encodeURIComponent(options.jsModuleId)); } return str.join("&"); }; var _inArray = function(elem, array, fromIndex) { if (typeof array.indexOf === "function") { return array.indexOf(elem, fromIndex); } var i, len = array.length; if (typeof fromIndex === "undefined") { fromIndex = 0; } else if (fromIndex < 0) { fromIndex = len + fromIndex; } for (i = fromIndex; i < len; i++) { if (array.hasOwnProperty(i) && array[i] === elem) { return i; } } return -1; }; var _prepClip = function(elements) { if (typeof elements === "string") throw new TypeError("ZeroClipboard doesn't accept query strings."); if (!elements.length) return [ elements ]; return elements; }; var _dispatchCallback = function(func, context, args, async) { if (async) { window.setTimeout(function() { func.apply(context, args); }, 0); } else { func.apply(context, args); } }; var _getSafeZIndex = function(val) { var zIndex, tmp; if (val) { if (typeof val === "number" && val > 0) { zIndex = val; } else if (typeof val === "string" && (tmp = parseInt(val, 10)) && !isNaN(tmp) && tmp > 0) { zIndex = tmp; } } if (!zIndex) { if (typeof _globalConfig.zIndex === "number" && _globalConfig.zIndex > 0) { zIndex = _globalConfig.zIndex; } else if (typeof _globalConfig.zIndex === "string" && (tmp = parseInt(_globalConfig.zIndex, 10)) && !isNaN(tmp) && tmp > 0) { zIndex = tmp; } } return zIndex || 0; }; var _deprecationWarning = function(deprecatedApiName, debugEnabled) { if (deprecatedApiName && debugEnabled !== false && typeof console !== "undefined" && console && (console.warn || console.log)) { var deprecationWarning = "`" + deprecatedApiName + "` is deprecated. See docs for more info:\n" + " https://github.com/zeroclipboard/zeroclipboard/blob/master/docs/instructions.md#deprecations"; if (console.warn) { console.warn(deprecationWarning); } else { console.log(deprecationWarning); } } }; var _extend = function() { var i, len, arg, prop, src, copy, target = arguments[0] || {}; for (i = 1, len = arguments.length; i < len; i++) { if ((arg = arguments[i]) != null) { for (prop in arg) { if (arg.hasOwnProperty(prop)) { src = target[prop]; copy = arg[prop]; if (target === copy) { continue; } if (copy !== undefined) { target[prop] = copy; } } } } } return target; }; var _extractDomain = function(originOrUrl) { if (originOrUrl == null || originOrUrl === "") { return null; } originOrUrl = originOrUrl.replace(/^\s+|\s+$/g, ""); if (originOrUrl === "") { return null; } var protocolIndex = originOrUrl.indexOf("//"); originOrUrl = protocolIndex === -1 ? originOrUrl : originOrUrl.slice(protocolIndex + 2); var pathIndex = originOrUrl.indexOf("/"); originOrUrl = pathIndex === -1 ? originOrUrl : protocolIndex === -1 || pathIndex === 0 ? null : originOrUrl.slice(0, pathIndex); if (originOrUrl && originOrUrl.slice(-4).toLowerCase() === ".swf") { return null; } return originOrUrl || null; }; var _determineScriptAccess = function() { var _extractAllDomains = function(origins, resultsArray) { var i, len, tmp; if (origins != null && resultsArray[0] !== "*") { if (typeof origins === "string") { origins = [ origins ]; } if (typeof origins === "object" && "length" in origins) { for (i = 0, len = origins.length; i < len; i++) { if (origins.hasOwnProperty(i)) { tmp = _extractDomain(origins[i]); if (tmp) { if (tmp === "*") { resultsArray.length = 0; resultsArray.push("*"); break; } if (_inArray(tmp, resultsArray) === -1) { resultsArray.push(tmp); } } } } } } }; var _accessLevelLookup = { always: "always", samedomain: "sameDomain", never: "never" }; return function(currentDomain, configOptions) { var asaLower, allowScriptAccess = configOptions.allowScriptAccess; if (typeof allowScriptAccess === "string" && (asaLower = allowScriptAccess.toLowerCase()) && /^always|samedomain|never$/.test(asaLower)) { return _accessLevelLookup[asaLower]; } var swfDomain = _extractDomain(configOptions.moviePath); if (swfDomain === null) { swfDomain = currentDomain; } var trustedDomains = []; _extractAllDomains(configOptions.trustedOrigins, trustedDomains); _extractAllDomains(configOptions.trustedDomains, trustedDomains); var len = trustedDomains.length; if (len > 0) { if (len === 1 && trustedDomains[0] === "*") { return "always"; } if (_inArray(currentDomain, trustedDomains) !== -1) { if (len === 1 && currentDomain === swfDomain) { return "sameDomain"; } return "always"; } } return "never"; }; }(); var _objectKeys = function(obj) { if (obj == null) { return []; } if (Object.keys) { return Object.keys(obj); } var keys = []; for (var prop in obj) { if (obj.hasOwnProperty(prop)) { keys.push(prop); } } return keys; }; var _deleteOwnProperties = function(obj) { if (obj) { for (var prop in obj) { if (obj.hasOwnProperty(prop)) { delete obj[prop]; } } } return obj; }; var _safeActiveElement = function() { try { return document.activeElement; } catch (err) {} return null; }; var _detectFlashSupport = function() { var hasFlash = false; if (typeof flashState.disabled === "boolean") { hasFlash = flashState.disabled === false; } else { if (typeof ActiveXObject === "function") { try { if (new ActiveXObject("ShockwaveFlash.ShockwaveFlash")) { hasFlash = true; } } catch (error) {} } if (!hasFlash && navigator.mimeTypes["application/x-shockwave-flash"]) { hasFlash = true; } } return hasFlash; }; function _parseFlashVersion(flashVersion) { return flashVersion.replace(/,/g, ".").replace(/[^0-9\.]/g, ""); } function _isFlashVersionSupported(flashVersion) { return parseFloat(_parseFlashVersion(flashVersion)) >= 10; } var ZeroClipboard = function(elements, options) { if (!(this instanceof ZeroClipboard)) { return new ZeroClipboard(elements, options); } this.id = "" + clientIdCounter++; _clientMeta[this.id] = { instance: this, elements: [], handlers: {} }; if (elements) { this.clip(elements); } if (typeof options !== "undefined") { _deprecationWarning("new ZeroClipboard(elements, options)", _globalConfig.debug); ZeroClipboard.config(options); } this.options = ZeroClipboard.config(); if (typeof flashState.disabled !== "boolean") { flashState.disabled = !_detectFlashSupport(); } if (flashState.disabled === false && flashState.outdated !== true) { if (flashState.bridge === null) { flashState.outdated = false; flashState.ready = false; _bridge(); } } }; ZeroClipboard.prototype.setText = function(newText) { if (newText && newText !== "") { _clipData["text/plain"] = newText; if (flashState.ready === true && flashState.bridge && typeof flashState.bridge.setText === "function") { flashState.bridge.setText(newText); } else { flashState.ready = false; } } return this; }; ZeroClipboard.prototype.setSize = function(width, height) { if (flashState.ready === true && flashState.bridge && typeof flashState.bridge.setSize === "function") { flashState.bridge.setSize(width, height); } else { flashState.ready = false; } return this; }; var _setHandCursor = function(enabled) { if (flashState.ready === true && flashState.bridge && typeof flashState.bridge.setHandCursor === "function") { flashState.bridge.setHandCursor(enabled); } else { flashState.ready = false; } }; ZeroClipboard.prototype.destroy = function() { this.unclip(); this.off(); delete _clientMeta[this.id]; }; var _getAllClients = function() { var i, len, client, clients = [], clientIds = _objectKeys(_clientMeta); for (i = 0, len = clientIds.length; i < len; i++) { client = _clientMeta[clientIds[i]].instance; if (client && client instanceof ZeroClipboard) { clients.push(client); } } return clients; }; ZeroClipboard.version = "1.3.5"; var _globalConfig = { swfPath: _swfPath, trustedDomains: window.location.host ? [ window.location.host ] : [], cacheBust: true, forceHandCursor: false, zIndex: 999999999, debug: true, title: null, autoActivate: true }; ZeroClipboard.config = function(options) { if (typeof options === "object" && options !== null) { _extend(_globalConfig, options); } if (typeof options === "string" && options) { if (_globalConfig.hasOwnProperty(options)) { return _globalConfig[options]; } return; } var copy = {}; for (var prop in _globalConfig) { if (_globalConfig.hasOwnProperty(prop)) { if (typeof _globalConfig[prop] === "object" && _globalConfig[prop] !== null) { if ("length" in _globalConfig[prop]) { copy[prop] = _globalConfig[prop].slice(0); } else { copy[prop] = _extend({}, _globalConfig[prop]); } } else { copy[prop] = _globalConfig[prop]; } } } return copy; }; ZeroClipboard.destroy = function() { ZeroClipboard.deactivate(); for (var clientId in _clientMeta) { if (_clientMeta.hasOwnProperty(clientId) && _clientMeta[clientId]) { var client = _clientMeta[clientId].instance; if (client && typeof client.destroy === "function") { client.destroy(); } } } var htmlBridge = _getHtmlBridge(flashState.bridge); if (htmlBridge && htmlBridge.parentNode) { htmlBridge.parentNode.removeChild(htmlBridge); flashState.ready = null; flashState.bridge = null; } }; ZeroClipboard.activate = function(element) { if (currentElement) { _removeClass(currentElement, _globalConfig.hoverClass); _removeClass(currentElement, _globalConfig.activeClass); } currentElement = element; _addClass(element, _globalConfig.hoverClass); _reposition(); var newTitle = _globalConfig.title || element.getAttribute("title"); if (newTitle) { var htmlBridge = _getHtmlBridge(flashState.bridge); if (htmlBridge) { htmlBridge.setAttribute("title", newTitle); } } var useHandCursor = _globalConfig.forceHandCursor === true || _getStyle(element, "cursor") === "pointer"; _setHandCursor(useHandCursor); }; ZeroClipboard.deactivate = function() { var htmlBridge = _getHtmlBridge(flashState.bridge); if (htmlBridge) { htmlBridge.style.left = "0px"; htmlBridge.style.top = "-9999px"; htmlBridge.removeAttribute("title"); } if (currentElement) { _removeClass(currentElement, _globalConfig.hoverClass); _removeClass(currentElement, _globalConfig.activeClass); currentElement = null; } }; var _bridge = function() { var flashBridge, len; var container = document.getElementById("global-zeroclipboard-html-bridge"); if (!container) { var opts = ZeroClipboard.config(); opts.jsModuleId = typeof _amdModuleId === "string" && _amdModuleId || typeof _cjsModuleId === "string" && _cjsModuleId || null; var allowScriptAccess = _determineScriptAccess(window.location.host, _globalConfig); var flashvars = _vars(opts); var swfUrl = _globalConfig.moviePath + _cacheBust(_globalConfig.moviePath, _globalConfig); var html = ' '; container = document.createElement("div"); container.id = "global-zeroclipboard-html-bridge"; container.setAttribute("class", "global-zeroclipboard-container"); container.style.position = "absolute"; container.style.left = "0px"; container.style.top = "-9999px"; container.style.width = "15px"; container.style.height = "15px"; container.style.zIndex = "" + _getSafeZIndex(_globalConfig.zIndex); document.body.appendChild(container); container.innerHTML = html; } flashBridge = document["global-zeroclipboard-flash-bridge"]; if (flashBridge && (len = flashBridge.length)) { flashBridge = flashBridge[len - 1]; } flashState.bridge = flashBridge || container.children[0].lastElementChild; }; var _getHtmlBridge = function(flashBridge) { var isFlashElement = /^OBJECT|EMBED$/; var htmlBridge = flashBridge && flashBridge.parentNode; while (htmlBridge && isFlashElement.test(htmlBridge.nodeName) && htmlBridge.parentNode) { htmlBridge = htmlBridge.parentNode; } return htmlBridge || null; }; var _reposition = function() { if (currentElement) { var pos = _getDOMObjectPosition(currentElement, _globalConfig.zIndex); var htmlBridge = _getHtmlBridge(flashState.bridge); if (htmlBridge) { htmlBridge.style.top = pos.top + "px"; htmlBridge.style.left = pos.left + "px"; htmlBridge.style.width = pos.width + "px"; htmlBridge.style.height = pos.height + "px"; htmlBridge.style.zIndex = pos.zIndex + 1; } if (flashState.ready === true && flashState.bridge && typeof flashState.bridge.setSize === "function") { flashState.bridge.setSize(pos.width, pos.height); } else { flashState.ready = false; } } return this; }; ZeroClipboard.prototype.on = function(eventName, func) { var i, len, events, added = {}, handlers = _clientMeta[this.id] && _clientMeta[this.id].handlers; if (typeof eventName === "string" && eventName) { events = eventName.toLowerCase().split(/\s+/); } else if (typeof eventName === "object" && eventName && typeof func === "undefined") { for (i in eventName) { if (eventName.hasOwnProperty(i) && typeof i === "string" && i && typeof eventName[i] === "function") { this.on(i, eventName[i]); } } } if (events && events.length) { for (i = 0, len = events.length; i < len; i++) { eventName = events[i].replace(/^on/, ""); added[eventName] = true; if (!handlers[eventName]) { handlers[eventName] = []; } handlers[eventName].push(func); } if (added.noflash && flashState.disabled) { _receiveEvent.call(this, "noflash", {}); } if (added.wrongflash && flashState.outdated) { _receiveEvent.call(this, "wrongflash", { flashVersion: flashState.version }); } if (added.load && flashState.ready) { _receiveEvent.call(this, "load", { flashVersion: flashState.version }); } } return this; }; ZeroClipboard.prototype.off = function(eventName, func) { var i, len, foundIndex, events, perEventHandlers, handlers = _clientMeta[this.id] && _clientMeta[this.id].handlers; if (arguments.length === 0) { events = _objectKeys(handlers); } else if (typeof eventName === "string" && eventName) { events = eventName.split(/\s+/); } else if (typeof eventName === "object" && eventName && typeof func === "undefined") { for (i in eventName) { if (eventName.hasOwnProperty(i) && typeof i === "string" && i && typeof eventName[i] === "function") { this.off(i, eventName[i]); } } } if (events && events.length) { for (i = 0, len = events.length; i < len; i++) { eventName = events[i].toLowerCase().replace(/^on/, ""); perEventHandlers = handlers[eventName]; if (perEventHandlers && perEventHandlers.length) { if (func) { foundIndex = _inArray(func, perEventHandlers); while (foundIndex !== -1) { perEventHandlers.splice(foundIndex, 1); foundIndex = _inArray(func, perEventHandlers, foundIndex); } } else { handlers[eventName].length = 0; } } } } return this; }; ZeroClipboard.prototype.handlers = function(eventName) { var prop, copy = null, handlers = _clientMeta[this.id] && _clientMeta[this.id].handlers; if (handlers) { if (typeof eventName === "string" && eventName) { return handlers[eventName] ? handlers[eventName].slice(0) : null; } copy = {}; for (prop in handlers) { if (handlers.hasOwnProperty(prop) && handlers[prop]) { copy[prop] = handlers[prop].slice(0); } } } return copy; }; var _dispatchClientCallbacks = function(eventName, context, args, async) { var handlers = _clientMeta[this.id] && _clientMeta[this.id].handlers[eventName]; if (handlers && handlers.length) { var i, len, func, originalContext = context || this; for (i = 0, len = handlers.length; i < len; i++) { func = handlers[i]; context = originalContext; if (typeof func === "string" && typeof window[func] === "function") { func = window[func]; } if (typeof func === "object" && func && typeof func.handleEvent === "function") { context = func; func = func.handleEvent; } if (typeof func === "function") { _dispatchCallback(func, context, args, async); } } } return this; }; ZeroClipboard.prototype.clip = function(elements) { elements = _prepClip(elements); for (var i = 0; i < elements.length; i++) { if (elements.hasOwnProperty(i) && elements[i] && elements[i].nodeType === 1) { if (!elements[i].zcClippingId) { elements[i].zcClippingId = "zcClippingId_" + elementIdCounter++; _elementMeta[elements[i].zcClippingId] = [ this.id ]; if (_globalConfig.autoActivate === true) { _addEventHandler(elements[i], "mouseover", _elementMouseOver); } } else if (_inArray(this.id, _elementMeta[elements[i].zcClippingId]) === -1) { _elementMeta[elements[i].zcClippingId].push(this.id); } var clippedElements = _clientMeta[this.id].elements; if (_inArray(elements[i], clippedElements) === -1) { clippedElements.push(elements[i]); } } } return this; }; ZeroClipboard.prototype.unclip = function(elements) { var meta = _clientMeta[this.id]; if (meta) { var clippedElements = meta.elements; var arrayIndex; if (typeof elements === "undefined") { elements = clippedElements.slice(0); } else { elements = _prepClip(elements); } for (var i = elements.length; i--; ) { if (elements.hasOwnProperty(i) && elements[i] && elements[i].nodeType === 1) { arrayIndex = 0; while ((arrayIndex = _inArray(elements[i], clippedElements, arrayIndex)) !== -1) { clippedElements.splice(arrayIndex, 1); } var clientIds = _elementMeta[elements[i].zcClippingId]; if (clientIds) { arrayIndex = 0; while ((arrayIndex = _inArray(this.id, clientIds, arrayIndex)) !== -1) { clientIds.splice(arrayIndex, 1); } if (clientIds.length === 0) { if (_globalConfig.autoActivate === true) { _removeEventHandler(elements[i], "mouseover", _elementMouseOver); } delete elements[i].zcClippingId; } } } } } return this; }; ZeroClipboard.prototype.elements = function() { var meta = _clientMeta[this.id]; return meta && meta.elements ? meta.elements.slice(0) : []; }; var _getAllClientsClippedToElement = function(element) { var elementMetaId, clientIds, i, len, client, clients = []; if (element && element.nodeType === 1 && (elementMetaId = element.zcClippingId) && _elementMeta.hasOwnProperty(elementMetaId)) { clientIds = _elementMeta[elementMetaId]; if (clientIds && clientIds.length) { for (i = 0, len = clientIds.length; i < len; i++) { client = _clientMeta[clientIds[i]].instance; if (client && client instanceof ZeroClipboard) { clients.push(client); } } } } return clients; }; _globalConfig.hoverClass = "zeroclipboard-is-hover"; _globalConfig.activeClass = "zeroclipboard-is-active"; _globalConfig.trustedOrigins = null; _globalConfig.allowScriptAccess = null; _globalConfig.useNoCache = true; _globalConfig.moviePath = "ZeroClipboard.swf"; ZeroClipboard.detectFlashSupport = function() { _deprecationWarning("ZeroClipboard.detectFlashSupport", _globalConfig.debug); return _detectFlashSupport(); }; ZeroClipboard.dispatch = function(eventName, args) { if (typeof eventName === "string" && eventName) { var cleanEventName = eventName.toLowerCase().replace(/^on/, ""); if (cleanEventName) { var clients = currentElement && _globalConfig.autoActivate === true ? _getAllClientsClippedToElement(currentElement) : _getAllClients(); for (var i = 0, len = clients.length; i < len; i++) { _receiveEvent.call(clients[i], cleanEventName, args); } } } }; ZeroClipboard.prototype.setHandCursor = function(enabled) { _deprecationWarning("ZeroClipboard.prototype.setHandCursor", _globalConfig.debug); enabled = typeof enabled === "boolean" ? enabled : !!enabled; _setHandCursor(enabled); _globalConfig.forceHandCursor = enabled; return this; }; ZeroClipboard.prototype.reposition = function() { _deprecationWarning("ZeroClipboard.prototype.reposition", _globalConfig.debug); return _reposition(); }; ZeroClipboard.prototype.receiveEvent = function(eventName, args) { _deprecationWarning("ZeroClipboard.prototype.receiveEvent", _globalConfig.debug); if (typeof eventName === "string" && eventName) { var cleanEventName = eventName.toLowerCase().replace(/^on/, ""); if (cleanEventName) { _receiveEvent.call(this, cleanEventName, args); } } }; ZeroClipboard.prototype.setCurrent = function(element) { _deprecationWarning("ZeroClipboard.prototype.setCurrent", _globalConfig.debug); ZeroClipboard.activate(element); return this; }; ZeroClipboard.prototype.resetBridge = function() { _deprecationWarning("ZeroClipboard.prototype.resetBridge", _globalConfig.debug); ZeroClipboard.deactivate(); return this; }; ZeroClipboard.prototype.setTitle = function(newTitle) { _deprecationWarning("ZeroClipboard.prototype.setTitle", _globalConfig.debug); newTitle = newTitle || _globalConfig.title || currentElement && currentElement.getAttribute("title"); if (newTitle) { var htmlBridge = _getHtmlBridge(flashState.bridge); if (htmlBridge) { htmlBridge.setAttribute("title", newTitle); } } return this; }; ZeroClipboard.setDefaults = function(options) { _deprecationWarning("ZeroClipboard.setDefaults", _globalConfig.debug); ZeroClipboard.config(options); }; ZeroClipboard.prototype.addEventListener = function(eventName, func) { _deprecationWarning("ZeroClipboard.prototype.addEventListener", _globalConfig.debug); return this.on(eventName, func); }; ZeroClipboard.prototype.removeEventListener = function(eventName, func) { _deprecationWarning("ZeroClipboard.prototype.removeEventListener", _globalConfig.debug); return this.off(eventName, func); }; ZeroClipboard.prototype.ready = function() { _deprecationWarning("ZeroClipboard.prototype.ready", _globalConfig.debug); return flashState.ready === true; }; var _receiveEvent = function(eventName, args) { eventName = eventName.toLowerCase().replace(/^on/, ""); var cleanVersion = args && args.flashVersion && _parseFlashVersion(args.flashVersion) || null; var element = currentElement; var performCallbackAsync = true; switch (eventName) { case "load": if (cleanVersion) { if (!_isFlashVersionSupported(cleanVersion)) { _receiveEvent.call(this, "onWrongFlash", { flashVersion: cleanVersion }); return; } flashState.outdated = false; flashState.ready = true; flashState.version = cleanVersion; } break; case "wrongflash": if (cleanVersion && !_isFlashVersionSupported(cleanVersion)) { flashState.outdated = true; flashState.ready = false; flashState.version = cleanVersion; } break; case "mouseover": _addClass(element, _globalConfig.hoverClass); break; case "mouseout": if (_globalConfig.autoActivate === true) { ZeroClipboard.deactivate(); } break; case "mousedown": _addClass(element, _globalConfig.activeClass); break; case "mouseup": _removeClass(element, _globalConfig.activeClass); break; case "datarequested": if (element) { var targetId = element.getAttribute("data-clipboard-target"), targetEl = !targetId ? null : document.getElementById(targetId); if (targetEl) { var textContent = targetEl.value || targetEl.textContent || targetEl.innerText; if (textContent) { this.setText(textContent); } } else { var defaultText = element.getAttribute("data-clipboard-text"); if (defaultText) { this.setText(defaultText); } } } performCallbackAsync = false; break; case "complete": _deleteOwnProperties(_clipData); if (element && element !== _safeActiveElement() && element.focus) { element.focus(); } break; } var context = element; var eventArgs = [ this, args ]; return _dispatchClientCallbacks.call(this, eventName, context, eventArgs, performCallbackAsync); }; if (typeof define === "function" && define.amd) { define([ "require", "exports", "module" ], function(require, exports, module) { _amdModuleId = module && module.id || null; return ZeroClipboard; }); } else if (typeof module === "object" && module && typeof module.exports === "object" && module.exports && typeof window.require === "function") { _cjsModuleId = module.id || null; module.exports = ZeroClipboard; } else { window.ZeroClipboard = ZeroClipboard; } })(function() { return this; }());apache-couchdb-1.6.0/src/fauxton/assets/js/plugins/zeroclipboard/ZeroClipboard.swf0000755000175000001440000000415512332105522030317 0ustar00djcusers00000000000000CWSõ xŚ}VŻSŪŲæW–t%aŪ€Cȗ³!! d³ !$`ćL0$Ū4¾–Æl%Br%™v:Ķģt§Aß³/}Śö„}ļŠ™ŽLfwßūŠéō­’@Ó#™Žn«AĒēüt¾Ļ¹ˆ’Bńß!4ˆQ!y!ō«¾æ`„ęœš>»U(fvMĖéŽHĆóš³ŁģžžžÄžō„ķŌ³“333ŁÜTvjj4ĘŻCĖ£ć–{md>tP`®ęMϰ­L ÓŖŻņīŒ{­i'N›-Ē ]Ö“,3Ł.³<7;91 Žjڬn;»Ō›§Ķ¦ih4p—=w¶öfŸī±qݤnc.{ŖŲx†g²ł…š]e™¢É2·3 §ö”vG%P®&:¦LXOhön¶éŲµ–9éą*4>køh¶Ŗ¦į6˜3ß²ŽXö~'Ä)čh£žŻ­ń ž›ŌŖ·hĶ/m„ĻNä0Gź±łUje¦'ÕĢTnņv'Ėž ŪĒ p’ˆĢ”<÷įƇgJ&,ĀĶ‹_?CįµųÆ?ü3’«ņŒ9vŽ4šU›:5ōēž?)Į¤;t—M¢š@ÜŪ’QD:¾L$–=ǰźb©śši^4œÄŪ Ę§¬Ū-—-<æg5²hŪ&£–øŃŚ­2'Ö.Ö±¬nÓ¤‡b¹é«-ϳ-I­mvą)ÆŻuƒÉVjŹną̵7rȖö˜#uø–ׁ Šbr;Mā2/pƒßejÕņ-ǵ-?gR—zZ#¹QŚZ_X{UX)o.lē——¶Ņ]iN|T¼øZ~µ^*ģ¬-½zŗµ°¹¹T8cw©exą·Ói—y“@=Ŗ4©ć²Ē-ęFėĢ+%?čĘM½eiį)¹öNĶP§īŖ™ÓzG3æPne2{ŌÉt%”¹—qŲĻZ†ĆnžQ¾«Œd2?žųŁ ĒżrTÜbõ„ƒ&÷ü9®_=^žÓÅ_(Og§r¹;ŁjĖ0=Ć"ƒ i¬3ź'Ģq!ķć¹»‡®Ēv£yڤUƄ0—ģu4DjzŲaOG±å¦Ūß5ņŁĪȇ»ĮBē·³]y^/†Åœ+ŻJ+–Ē żŪcÅ ’ĒÉų+:ngįø5Ģ!šē˜¦ä6 =Čߥ֚6ńÆmƒ;,ęEw¶Ö`|­šĢ7Ø[Ś·6»ÉļPXpz(øœ^n{M ¦Q·ˆe—5j2Ł (L‹)k6­1gÅŅmޱmO1Oä`YąÜAin^ŽqĻiAwk%ĒØ–+ŗįjaU*3­;씦iļģ]h‘¼)•Īń āÄąœ®½Twh³ah®\eą¬h˜¦fśŌØyž]fF½įI5‡īoAŪ €fƒJ“VĖ7 ³&ä×Vņ †\3 5Œ²^Ś)/½*=YŚ’Łķc°Pzŗ!uŲĶųń <‹šÉ„c&„ėÕD‚ŠŖT{ĆMĖå‚{²Ō,hӄń^p“įUH·ą0° OĀ~P‹ŲĖą”ßfļ†ėŚ‹ämQśĒ—Æ/Ó|Z”$ŻH čNÉCCŁ”ÜŠäŠTz&żœ‹ X”dNį{¢±xob›`Žąį‚E‚ ĮĮ2‰ō!J„āDč%B‚I"¤ˆŠGp?Į§‰pŽƒD"Ā"\$Ā%"\&ųG#ųĮŖ¬b‚§åi ·åŪų&ā"~FÄĻIr–ˆw ž#ųĮ÷ ^ ‘E‚ó^"ø(?ÄņČg•ąGD\“ćącą ‚Koü˜ą-‚ĖC;?!ų)Į_ü‚ŸüS’zAšKB*S‚Į:ĮuĀ5HÄ ‘×$ņ&|&0†ĻĒE8$…ŸĢ…r@C‘ü/‚"€2/ŠÅ?=˜H2„ØŒ„”0DŠh4Š‘ƈÄ1’z1’)IŒzREū0ŠõcGā€ˆńyœ!…sÉLņÜł¤JŠ<īÅā&PKņ Ÿ{9 žo ¼L«WŌĢ;õź;õ“wōĆ /N’“~®]¹ «×9uøx‘[²„ܶż\ę+WoV.é—wš[īūv*…Šū¶~…f€^„Ÿ½F‡‡‘&}©‰‰>„äŖX.ƒŁū*Tåõėōś”($’žįƒ$JĀ{šį"’<¾ßrßµS„Śź§ÅxG0p7ńWß¶SŠ“£ķÕQˆśŻńY’ĆŒøÅłŌL|T<:cŸŅ‚DHūKMJ¬‰HU‰ķŖPĆ©„@żz’¦xƒ“*>ŪKĮŒGįqč×įaUü&I ÖŖP”‰$H *^V¾ę‚n}ﯠŠŖĪÓq čċ¬ÆēōÉbæĶ~Ō§Śśtqˆ ŃoC( B÷[uł›T?BĄŖ+ÅO1øŖÜŃ?˼/}Īé3'Š3”"lŽ|£Ē!­JØ!ūŗ|ƒĪ”wźsćøt‡Ü0«Øś<Ü÷Kx€²˜.¼X¦“hT"zŽ×£„×–|=v"}=~"<ōõŽaŁ× TVŌ_O•V®ßד.ķė}Ąłź+(ŗ8ˆJż,˜H8Yós•G¾®”Ö°ÆVƒžØP@ Ń; Ģ²Æā†„‹„ŸóÕD YÄOŅ žģĀåšŌ)®“1č˜ZėŅUN|ōuį=ąšv˜B4eu¹Mļć"²Ņ{ ¬=¢Ē€Gø'›_Y§zŗ}r©Ä'¢”öQ©ƒ^c隟cØĀå*›¹Źć\e+W)ē*ü}.…Wƒ€jŖ/x±t’7ū’S}š/apache-couchdb-1.6.0/src/fauxton/assets/js/plugins/prettify.js0000644000175000001440000003250012332105522024374 0ustar00djcusers00000000000000var q=null;window.PR_SHOULD_USE_CONTINUATION=!0; (function(){function L(a){function m(a){var f=a.charCodeAt(0);if(f!==92)return f;var b=a.charAt(1);return(f=r[b])?f:"0"<=b&&b<="7"?parseInt(a.substring(1),8):b==="u"||b==="x"?parseInt(a.substring(2),16):a.charCodeAt(1)}function e(a){if(a<32)return(a<16?"\\x0":"\\x")+a.toString(16);a=String.fromCharCode(a);if(a==="\\"||a==="-"||a==="["||a==="]")a="\\"+a;return a}function h(a){for(var f=a.substring(1,a.length-1).match(/\\u[\dA-Fa-f]{4}|\\x[\dA-Fa-f]{2}|\\[0-3][0-7]{0,2}|\\[0-7]{1,2}|\\[\S\s]|[^\\]/g),a= [],b=[],o=f[0]==="^",c=o?1:0,i=f.length;c122||(d<65||j>90||b.push([Math.max(65,j)|32,Math.min(d,90)|32]),d<97||j>122||b.push([Math.max(97,j)&-33,Math.min(d,122)&-33]))}}b.sort(function(a,f){return a[0]-f[0]||f[1]-a[1]});f=[];j=[NaN,NaN];for(c=0;ci[0]&&(i[1]+1>i[0]&&b.push("-"),b.push(e(i[1])));b.push("]");return b.join("")}function y(a){for(var f=a.source.match(/\[(?:[^\\\]]|\\[\S\s])*]|\\u[\dA-Fa-f]{4}|\\x[\dA-Fa-f]{2}|\\\d+|\\[^\dux]|\(\?[!:=]|[()^]|[^()[\\^]+/g),b=f.length,d=[],c=0,i=0;c=2&&a==="["?f[c]=h(j):a!=="\\"&&(f[c]=j.replace(/[A-Za-z]/g,function(a){a=a.charCodeAt(0);return"["+String.fromCharCode(a&-33,a|32)+"]"}));return f.join("")}for(var t=0,s=!1,l=!1,p=0,d=a.length;p=5&&"lang-"===b.substring(0,5))&&!(o&&typeof o[1]==="string"))c=!1,b="src";c||(r[f]=b)}i=d;d+=f.length;if(c){c=o[1];var j=f.indexOf(c),k=j+c.length;o[2]&&(k=f.length-o[2].length,j=k-c.length);b=b.substring(5);B(l+i,f.substring(0,j),e,p);B(l+i+j,c,C(b,c),p);B(l+i+k,f.substring(k),e,p)}else p.push(l+i,b)}a.e=p}var h={},y;(function(){for(var e=a.concat(m), l=[],p={},d=0,g=e.length;d=0;)h[n.charAt(k)]=r;r=r[1];n=""+r;p.hasOwnProperty(n)||(l.push(r),p[n]=q)}l.push(/[\S\s]/);y=L(l)})();var t=m.length;return e}function u(a){var m=[],e=[];a.tripleQuotedStrings?m.push(["str",/^(?:'''(?:[^'\\]|\\[\S\s]|''?(?=[^']))*(?:'''|$)|"""(?:[^"\\]|\\[\S\s]|""?(?=[^"]))*(?:"""|$)|'(?:[^'\\]|\\[\S\s])*(?:'|$)|"(?:[^"\\]|\\[\S\s])*(?:"|$))/,q,"'\""]):a.multiLineStrings?m.push(["str",/^(?:'(?:[^'\\]|\\[\S\s])*(?:'|$)|"(?:[^"\\]|\\[\S\s])*(?:"|$)|`(?:[^\\`]|\\[\S\s])*(?:`|$))/, q,"'\"`"]):m.push(["str",/^(?:'(?:[^\n\r'\\]|\\.)*(?:'|$)|"(?:[^\n\r"\\]|\\.)*(?:"|$))/,q,"\"'"]);a.verbatimStrings&&e.push(["str",/^@"(?:[^"]|"")*(?:"|$)/,q]);var h=a.hashComments;h&&(a.cStyleComments?(h>1?m.push(["com",/^#(?:##(?:[^#]|#(?!##))*(?:###|$)|.*)/,q,"#"]):m.push(["com",/^#(?:(?:define|elif|else|endif|error|ifdef|include|ifndef|line|pragma|undef|warning)\b|[^\n\r]*)/,q,"#"]),e.push(["str",/^<(?:(?:(?:\.\.\/)*|\/?)(?:[\w-]+(?:\/[\w-]+)+)?[\w-]+\.h|[a-z]\w*)>/,q])):m.push(["com",/^#[^\n\r]*/, q,"#"]));a.cStyleComments&&(e.push(["com",/^\/\/[^\n\r]*/,q]),e.push(["com",/^\/\*[\S\s]*?(?:\*\/|$)/,q]));a.regexLiterals&&e.push(["lang-regex",/^(?:^^\.?|[!+-]|!=|!==|#|%|%=|&|&&|&&=|&=|\(|\*|\*=|\+=|,|-=|->|\/|\/=|:|::|;|<|<<|<<=|<=|=|==|===|>|>=|>>|>>=|>>>|>>>=|[?@[^]|\^=|\^\^|\^\^=|{|\||\|=|\|\||\|\|=|~|break|case|continue|delete|do|else|finally|instanceof|return|throw|try|typeof)\s*(\/(?=[^*/])(?:[^/[\\]|\\[\S\s]|\[(?:[^\\\]]|\\[\S\s])*(?:]|$))+\/)/]);(h=a.types)&&e.push(["typ",h]);a=(""+a.keywords).replace(/^ | $/g, "");a.length&&e.push(["kwd",RegExp("^(?:"+a.replace(/[\s,]+/g,"|")+")\\b"),q]);m.push(["pln",/^\s+/,q," \r\n\t\xa0"]);e.push(["lit",/^@[$_a-z][\w$@]*/i,q],["typ",/^(?:[@_]?[A-Z]+[a-z][\w$@]*|\w+_t\b)/,q],["pln",/^[$_a-z][\w$@]*/i,q],["lit",/^(?:0x[\da-f]+|(?:\d(?:_\d+)*\d*(?:\.\d*)?|\.\d\+)(?:e[+-]?\d+)?)[a-z]*/i,q,"0123456789"],["pln",/^\\[\S\s]?/,q],["pun",/^.[^\s\w"-$'./@\\`]*/,q]);return x(m,e)}function D(a,m){function e(a){switch(a.nodeType){case 1:if(k.test(a.className))break;if("BR"===a.nodeName)h(a), a.parentNode&&a.parentNode.removeChild(a);else for(a=a.firstChild;a;a=a.nextSibling)e(a);break;case 3:case 4:if(p){var b=a.nodeValue,d=b.match(t);if(d){var c=b.substring(0,d.index);a.nodeValue=c;(b=b.substring(d.index+d[0].length))&&a.parentNode.insertBefore(s.createTextNode(b),a.nextSibling);h(a);c||a.parentNode.removeChild(a)}}}}function h(a){function b(a,d){var e=d?a.cloneNode(!1):a,f=a.parentNode;if(f){var f=b(f,1),g=a.nextSibling;f.appendChild(e);for(var h=g;h;h=g)g=h.nextSibling,f.appendChild(h)}return e} for(;!a.nextSibling;)if(a=a.parentNode,!a)return;for(var a=b(a.nextSibling,0),e;(e=a.parentNode)&&e.nodeType===1;)a=e;d.push(a)}var k=/(?:^|\s)nocode(?:\s|$)/,t=/\r\n?|\n/,s=a.ownerDocument,l;a.currentStyle?l=a.currentStyle.whiteSpace:window.getComputedStyle&&(l=s.defaultView.getComputedStyle(a,q).getPropertyValue("white-space"));var p=l&&"pre"===l.substring(0,3);for(l=s.createElement("LI");a.firstChild;)l.appendChild(a.firstChild);for(var d=[l],g=0;g=0;){var h=m[e];A.hasOwnProperty(h)?window.console&&console.warn("cannot override language handler %s",h):A[h]=a}}function C(a,m){if(!a||!A.hasOwnProperty(a))a=/^\s*=o&&(h+=2);e>=c&&(a+=2)}}catch(w){"console"in window&&console.log(w&&w.stack?w.stack:w)}}var v=["break,continue,do,else,for,if,return,while"],w=[[v,"auto,case,char,const,default,double,enum,extern,float,goto,int,long,register,short,signed,sizeof,static,struct,switch,typedef,union,unsigned,void,volatile"], "catch,class,delete,false,import,new,operator,private,protected,public,this,throw,true,try,typeof"],F=[w,"alignof,align_union,asm,axiom,bool,concept,concept_map,const_cast,constexpr,decltype,dynamic_cast,explicit,export,friend,inline,late_check,mutable,namespace,nullptr,reinterpret_cast,static_assert,static_cast,template,typeid,typename,using,virtual,where"],G=[w,"abstract,boolean,byte,extends,final,finally,implements,import,instanceof,null,native,package,strictfp,super,synchronized,throws,transient"], H=[G,"as,base,by,checked,decimal,delegate,descending,dynamic,event,fixed,foreach,from,group,implicit,in,interface,internal,into,is,lock,object,out,override,orderby,params,partial,readonly,ref,sbyte,sealed,stackalloc,string,select,uint,ulong,unchecked,unsafe,ushort,var"],w=[w,"debugger,eval,export,function,get,null,set,undefined,var,with,Infinity,NaN"],I=[v,"and,as,assert,class,def,del,elif,except,exec,finally,from,global,import,in,is,lambda,nonlocal,not,or,pass,print,raise,try,with,yield,False,True,None"], J=[v,"alias,and,begin,case,class,def,defined,elsif,end,ensure,false,in,module,next,nil,not,or,redo,rescue,retry,self,super,then,true,undef,unless,until,when,yield,BEGIN,END"],v=[v,"case,done,elif,esac,eval,fi,function,in,local,set,then,until"],K=/^(DIR|FILE|vector|(de|priority_)?queue|list|stack|(const_)?iterator|(multi)?(set|map)|bitset|u?(int|float)\d*)/,N=/\S/,O=u({keywords:[F,H,w,"caller,delete,die,do,dump,elsif,eval,exit,foreach,for,goto,if,import,last,local,my,next,no,our,print,package,redo,require,sub,undef,unless,until,use,wantarray,while,BEGIN,END"+ I,J,v],hashComments:!0,cStyleComments:!0,multiLineStrings:!0,regexLiterals:!0}),A={};k(O,["default-code"]);k(x([],[["pln",/^[^]*(?:>|$)/],["com",/^<\!--[\S\s]*?(?:--\>|$)/],["lang-",/^<\?([\S\s]+?)(?:\?>|$)/],["lang-",/^<%([\S\s]+?)(?:%>|$)/],["pun",/^(?:<[%?]|[%?]>)/],["lang-",/^]*>([\S\s]+?)<\/xmp\b[^>]*>/i],["lang-js",/^]*>([\S\s]*?)(<\/script\b[^>]*>)/i],["lang-css",/^]*>([\S\s]*?)(<\/style\b[^>]*>)/i],["lang-in.tag",/^(<\/?[a-z][^<>]*>)/i]]), ["default-markup","htm","html","mxml","xhtml","xml","xsl"]);k(x([["pln",/^\s+/,q," \t\r\n"],["atv",/^(?:"[^"]*"?|'[^']*'?)/,q,"\"'"]],[["tag",/^^<\/?[a-z](?:[\w-.:]*\w)?|\/?>$/i],["atn",/^(?!style[\s=]|on)[a-z](?:[\w:-]*\w)?/i],["lang-uq.val",/^=\s*([^\s"'>]*(?:[^\s"'/>]|\/(?=\s)))/],["pun",/^[/<->]+/],["lang-js",/^on\w+\s*=\s*"([^"]+)"/i],["lang-js",/^on\w+\s*=\s*'([^']+)'/i],["lang-js",/^on\w+\s*=\s*([^\s"'>]+)/i],["lang-css",/^style\s*=\s*"([^"]+)"/i],["lang-css",/^style\s*=\s*'([^']+)'/i],["lang-css", /^style\s*=\s*([^\s"'>]+)/i]]),["in.tag"]);k(x([],[["atv",/^[\S\s]+/]]),["uq.val"]);k(u({keywords:F,hashComments:!0,cStyleComments:!0,types:K}),["c","cc","cpp","cxx","cyc","m"]);k(u({keywords:"null,true,false"}),["json"]);k(u({keywords:H,hashComments:!0,cStyleComments:!0,verbatimStrings:!0,types:K}),["cs"]);k(u({keywords:G,cStyleComments:!0}),["java"]);k(u({keywords:v,hashComments:!0,multiLineStrings:!0}),["bsh","csh","sh"]);k(u({keywords:I,hashComments:!0,multiLineStrings:!0,tripleQuotedStrings:!0}), ["cv","py"]);k(u({keywords:"caller,delete,die,do,dump,elsif,eval,exit,foreach,for,goto,if,import,last,local,my,next,no,our,print,package,redo,require,sub,undef,unless,until,use,wantarray,while,BEGIN,END",hashComments:!0,multiLineStrings:!0,regexLiterals:!0}),["perl","pl","pm"]);k(u({keywords:J,hashComments:!0,multiLineStrings:!0,regexLiterals:!0}),["rb"]);k(u({keywords:w,cStyleComments:!0,regexLiterals:!0}),["js"]);k(u({keywords:"all,and,by,catch,class,else,extends,false,finally,for,if,in,is,isnt,loop,new,no,not,null,of,off,on,or,return,super,then,true,try,unless,until,when,while,yes", hashComments:3,cStyleComments:!0,multilineStrings:!0,tripleQuotedStrings:!0,regexLiterals:!0}),["coffee"]);k(x([],[["str",/^[\S\s]+/]]),["regex"]);window.prettyPrintOne=function(a,m,e){var h=document.createElement("PRE");h.innerHTML=a;e&&D(h,e);E({g:m,i:e,h:h});return h.innerHTML};window.prettyPrint=function(a){function m(){for(var e=window.PR_SHOULD_USE_CONTINUATION?l.now()+250:Infinity;p=0){var k=k.match(g),f,b;if(b= !k){b=n;for(var o=void 0,c=b.firstChild;c;c=c.nextSibling)var i=c.nodeType,o=i===1?o?b:c:i===3?N.test(c.nodeValue)?b:o:o;b=(f=o===b?void 0:o)&&"CODE"===f.tagName}b&&(k=f.className.match(g));k&&(k=k[1]);b=!1;for(o=n.parentNode;o;o=o.parentNode)if((o.tagName==="pre"||o.tagName==="code"||o.tagName==="xmp")&&o.className&&o.className.indexOf("prettyprint")>=0){b=!0;break}b||((b=(b=n.className.match(/\blinenums\b(?::(\d+))?/))?b[1]&&b[1].length?+b[1]:!0:!1)&&D(n,b),d={g:k,h:n,i:b},E(d))}}p 0) { this.paging.direction = 'fetch'; this.paging.params.limit = this.paging.params.limit + 1; this.updateUrlQuery(this.paging.params); } return Backbone.Collection.prototype.fetch.apply(this, arguments); }, parse: function (resp) { var rows = resp.rows; this.paging.hasNext = this.paging.hasPrevious = false; this.viewMeta = { total_rows: resp.total_rows, offset: resp.offset, update_seq: resp.update_seq }; var skipLimit = this.paging.defaultParams.skip || 0; if(this.paging.params.skip > skipLimit) { this.paging.hasPrevious = true; } if(rows.length === this.paging.pageSize + 1) { this.paging.hasNext = true; // remove the next page marker result rows.pop(); this.viewMeta.total_rows = this.viewMeta.total_rows - 1; } return rows; }, hasNext: function() { return this.paging.hasNext; }, hasPrevious: function() { return this.paging.hasPrevious; } }); if (exports) { // Overload the Backbone.ajax method, this allows PagingCollection to be able to // work in node.js exports.setAjax = function (ajax) { Backbone.ajax = ajax; }; exports.PagingCollection = PagingCollection; } return PagingCollection; })); apache-couchdb-1.6.0/src/fauxton/assets/css/0000755000175000001440000000000012332105600020660 5ustar00djcusers00000000000000apache-couchdb-1.6.0/src/fauxton/assets/css/nv.d3.css0000644000175000001440000003104312332105522022326 0ustar00djcusers00000000000000 /******************** * HTML CSS */ .chartWrap { margin: 0; padding: 0; overflow: hidden; } /******************** Box shadow and border radius styling */ .nvtooltip.with-3d-shadow, .with-3d-shadow .nvtooltip { -moz-box-shadow: 0 5px 10px rgba(0,0,0,.2); -webkit-box-shadow: 0 5px 10px rgba(0,0,0,.2); box-shadow: 0 5px 10px rgba(0,0,0,.2); -webkit-border-radius: 6px; -moz-border-radius: 6px; border-radius: 6px; } /******************** * TOOLTIP CSS */ .nvtooltip { position: absolute; background-color: rgba(255,255,255,1.0); padding: 1px; border: 1px solid rgba(0,0,0,.2); z-index: 10000; font-family: Arial; font-size: 13px; text-align: left; pointer-events: none; white-space: nowrap; -webkit-touch-callout: none; -webkit-user-select: none; -khtml-user-select: none; -moz-user-select: none; -ms-user-select: none; user-select: none; } /*Give tooltips that old fade in transition by putting a "with-transitions" class on the container div. */ .nvtooltip.with-transitions, .with-transitions .nvtooltip { transition: opacity 250ms linear; -moz-transition: opacity 250ms linear; -webkit-transition: opacity 250ms linear; transition-delay: 250ms; -moz-transition-delay: 250ms; -webkit-transition-delay: 250ms; } .nvtooltip.x-nvtooltip, .nvtooltip.y-nvtooltip { padding: 8px; } .nvtooltip h3 { margin: 0; padding: 4px 14px; line-height: 18px; font-weight: normal; background-color: rgba(247,247,247,0.75); text-align: center; border-bottom: 1px solid #ebebeb; -webkit-border-radius: 5px 5px 0 0; -moz-border-radius: 5px 5px 0 0; border-radius: 5px 5px 0 0; } .nvtooltip p { margin: 0; padding: 5px 14px; text-align: center; } .nvtooltip span { display: inline-block; margin: 2px 0; } .nvtooltip table { margin: 6px; border-spacing:0; } .nvtooltip table td { padding: 2px 9px 2px 0; vertical-align: middle; } .nvtooltip table td.key { font-weight:normal; } .nvtooltip table td.value { text-align: right; font-weight: bold; } .nvtooltip table tr.highlight td { padding: 1px 9px 1px 0; border-bottom-style: solid; border-bottom-width: 1px; border-top-style: solid; border-top-width: 1px; } .nvtooltip table td.legend-color-guide div { width: 8px; height: 8px; vertical-align: middle; } .nvtooltip .footer { padding: 3px; text-align: center; } .nvtooltip-pending-removal { position: absolute; pointer-events: none; } /******************** * SVG CSS */ svg { -webkit-touch-callout: none; -webkit-user-select: none; -khtml-user-select: none; -moz-user-select: none; -ms-user-select: none; user-select: none; /* Trying to get SVG to act like a greedy block in all browsers */ display: block; width:100%; height:100%; } svg text { font: normal 12px Arial; } svg .title { font: bold 14px Arial; } .nvd3 .nv-background { fill: white; fill-opacity: 0; /* pointer-events: none; */ } .nvd3.nv-noData { font-size: 18px; font-weight: bold; } /********** * Brush */ .nv-brush .extent { fill-opacity: .125; shape-rendering: crispEdges; } /********** * Legend */ .nvd3 .nv-legend .nv-series { cursor: pointer; } .nvd3 .nv-legend .disabled circle { fill-opacity: 0; } /********** * Axes */ .nvd3 .nv-axis { pointer-events:none; } .nvd3 .nv-axis path { fill: none; stroke: #000; stroke-opacity: .75; shape-rendering: crispEdges; } .nvd3 .nv-axis path.domain { stroke-opacity: .75; } .nvd3 .nv-axis.nv-x path.domain { stroke-opacity: 0; } .nvd3 .nv-axis line { fill: none; stroke: #e5e5e5; shape-rendering: crispEdges; } .nvd3 .nv-axis .zero line, /*this selector may not be necessary*/ .nvd3 .nv-axis line.zero { stroke-opacity: .75; } .nvd3 .nv-axis .nv-axisMaxMin text { font-weight: bold; } .nvd3 .x .nv-axis .nv-axisMaxMin text, .nvd3 .x2 .nv-axis .nv-axisMaxMin text, .nvd3 .x3 .nv-axis .nv-axisMaxMin text { text-anchor: middle } /********** * Brush */ .nv-brush .resize path { fill: #eee; stroke: #666; } /********** * Bars */ .nvd3 .nv-bars .negative rect { zfill: brown; } .nvd3 .nv-bars rect { zfill: steelblue; fill-opacity: .75; transition: fill-opacity 250ms linear; -moz-transition: fill-opacity 250ms linear; -webkit-transition: fill-opacity 250ms linear; } .nvd3 .nv-bars rect.hover { fill-opacity: 1; } .nvd3 .nv-bars .hover rect { fill: lightblue; } .nvd3 .nv-bars text { fill: rgba(0,0,0,0); } .nvd3 .nv-bars .hover text { fill: rgba(0,0,0,1); } /********** * Bars */ .nvd3 .nv-multibar .nv-groups rect, .nvd3 .nv-multibarHorizontal .nv-groups rect, .nvd3 .nv-discretebar .nv-groups rect { stroke-opacity: 0; transition: fill-opacity 250ms linear; -moz-transition: fill-opacity 250ms linear; -webkit-transition: fill-opacity 250ms linear; } .nvd3 .nv-multibar .nv-groups rect:hover, .nvd3 .nv-multibarHorizontal .nv-groups rect:hover, .nvd3 .nv-discretebar .nv-groups rect:hover { fill-opacity: 1; } .nvd3 .nv-discretebar .nv-groups text, .nvd3 .nv-multibarHorizontal .nv-groups text { font-weight: bold; fill: rgba(0,0,0,1); stroke: rgba(0,0,0,0); } /*********** * Pie Chart */ .nvd3.nv-pie path { stroke-opacity: 0; transition: fill-opacity 250ms linear, stroke-width 250ms linear, stroke-opacity 250ms linear; -moz-transition: fill-opacity 250ms linear, stroke-width 250ms linear, stroke-opacity 250ms linear; -webkit-transition: fill-opacity 250ms linear, stroke-width 250ms linear, stroke-opacity 250ms linear; } .nvd3.nv-pie .nv-slice text { stroke: #000; stroke-width: 0; } .nvd3.nv-pie path { stroke: #fff; stroke-width: 1px; stroke-opacity: 1; } .nvd3.nv-pie .hover path { fill-opacity: .7; } .nvd3.nv-pie .nv-label { pointer-events: none; } .nvd3.nv-pie .nv-label rect { fill-opacity: 0; stroke-opacity: 0; } /********** * Lines */ .nvd3 .nv-groups path.nv-line { fill: none; stroke-width: 1.5px; /* stroke-linecap: round; shape-rendering: geometricPrecision; transition: stroke-width 250ms linear; -moz-transition: stroke-width 250ms linear; -webkit-transition: stroke-width 250ms linear; transition-delay: 250ms -moz-transition-delay: 250ms; -webkit-transition-delay: 250ms; */ } .nvd3 .nv-groups path.nv-line.nv-thin-line { stroke-width: 1px; } .nvd3 .nv-groups path.nv-area { stroke: none; /* stroke-linecap: round; shape-rendering: geometricPrecision; stroke-width: 2.5px; transition: stroke-width 250ms linear; -moz-transition: stroke-width 250ms linear; -webkit-transition: stroke-width 250ms linear; transition-delay: 250ms -moz-transition-delay: 250ms; -webkit-transition-delay: 250ms; */ } .nvd3 .nv-line.hover path { stroke-width: 6px; } /* .nvd3.scatter .groups .point { fill-opacity: 0.1; stroke-opacity: 0.1; } */ .nvd3.nv-line .nvd3.nv-scatter .nv-groups .nv-point { fill-opacity: 0; stroke-opacity: 0; } .nvd3.nv-scatter.nv-single-point .nv-groups .nv-point { fill-opacity: .5 !important; stroke-opacity: .5 !important; } .with-transitions .nvd3 .nv-groups .nv-point { transition: stroke-width 250ms linear, stroke-opacity 250ms linear; -moz-transition: stroke-width 250ms linear, stroke-opacity 250ms linear; -webkit-transition: stroke-width 250ms linear, stroke-opacity 250ms linear; } .nvd3.nv-scatter .nv-groups .nv-point.hover, .nvd3 .nv-groups .nv-point.hover { stroke-width: 7px; fill-opacity: .95 !important; stroke-opacity: .95 !important; } .nvd3 .nv-point-paths path { stroke: #aaa; stroke-opacity: 0; fill: #eee; fill-opacity: 0; } .nvd3 .nv-indexLine { cursor: ew-resize; } /********** * Distribution */ .nvd3 .nv-distribution { pointer-events: none; } /********** * Scatter */ /* **Attempting to remove this for useVoronoi(false), need to see if it's required anywhere .nvd3 .nv-groups .nv-point { pointer-events: none; } */ .nvd3 .nv-groups .nv-point.hover { stroke-width: 20px; stroke-opacity: .5; } .nvd3 .nv-scatter .nv-point.hover { fill-opacity: 1; } /* .nv-group.hover .nv-point { fill-opacity: 1; } */ /********** * Stacked Area */ .nvd3.nv-stackedarea path.nv-area { fill-opacity: .7; /* stroke-opacity: .65; fill-opacity: 1; */ stroke-opacity: 0; transition: fill-opacity 250ms linear, stroke-opacity 250ms linear; -moz-transition: fill-opacity 250ms linear, stroke-opacity 250ms linear; -webkit-transition: fill-opacity 250ms linear, stroke-opacity 250ms linear; /* transition-delay: 500ms; -moz-transition-delay: 500ms; -webkit-transition-delay: 500ms; */ } .nvd3.nv-stackedarea path.nv-area.hover { fill-opacity: .9; /* stroke-opacity: .85; */ } /* .d3stackedarea .groups path { stroke-opacity: 0; } */ .nvd3.nv-stackedarea .nv-groups .nv-point { stroke-opacity: 0; fill-opacity: 0; } /* .nvd3.nv-stackedarea .nv-groups .nv-point.hover { stroke-width: 20px; stroke-opacity: .75; fill-opacity: 1; }*/ /********** * Line Plus Bar */ .nvd3.nv-linePlusBar .nv-bar rect { fill-opacity: .75; } .nvd3.nv-linePlusBar .nv-bar rect:hover { fill-opacity: 1; } /********** * Bullet */ .nvd3.nv-bullet { font: 10px sans-serif; } .nvd3.nv-bullet .nv-measure { fill-opacity: .8; } .nvd3.nv-bullet .nv-measure:hover { fill-opacity: 1; } .nvd3.nv-bullet .nv-marker { stroke: #000; stroke-width: 2px; } .nvd3.nv-bullet .nv-markerTriangle { stroke: #000; fill: #fff; stroke-width: 1.5px; } .nvd3.nv-bullet .nv-tick line { stroke: #666; stroke-width: .5px; } .nvd3.nv-bullet .nv-range.nv-s0 { fill: #eee; } .nvd3.nv-bullet .nv-range.nv-s1 { fill: #ddd; } .nvd3.nv-bullet .nv-range.nv-s2 { fill: #ccc; } .nvd3.nv-bullet .nv-title { font-size: 14px; font-weight: bold; } .nvd3.nv-bullet .nv-subtitle { fill: #999; } .nvd3.nv-bullet .nv-range { fill: #bababa; fill-opacity: .4; } .nvd3.nv-bullet .nv-range:hover { fill-opacity: .7; } /********** * Sparkline */ .nvd3.nv-sparkline path { fill: none; } .nvd3.nv-sparklineplus g.nv-hoverValue { pointer-events: none; } .nvd3.nv-sparklineplus .nv-hoverValue line { stroke: #333; stroke-width: 1.5px; } .nvd3.nv-sparklineplus, .nvd3.nv-sparklineplus g { pointer-events: all; } .nvd3 .nv-hoverArea { fill-opacity: 0; stroke-opacity: 0; } .nvd3.nv-sparklineplus .nv-xValue, .nvd3.nv-sparklineplus .nv-yValue { /* stroke: #666; */ stroke-width: 0; font-size: .9em; font-weight: normal; } .nvd3.nv-sparklineplus .nv-yValue { stroke: #f66; } .nvd3.nv-sparklineplus .nv-maxValue { stroke: #2ca02c; fill: #2ca02c; } .nvd3.nv-sparklineplus .nv-minValue { stroke: #d62728; fill: #d62728; } .nvd3.nv-sparklineplus .nv-currentValue { /* stroke: #444; fill: #000; */ font-weight: bold; font-size: 1.1em; } /********** * historical stock */ .nvd3.nv-ohlcBar .nv-ticks .nv-tick { stroke-width: 2px; } .nvd3.nv-ohlcBar .nv-ticks .nv-tick.hover { stroke-width: 4px; } .nvd3.nv-ohlcBar .nv-ticks .nv-tick.positive { stroke: #2ca02c; } .nvd3.nv-ohlcBar .nv-ticks .nv-tick.negative { stroke: #d62728; } .nvd3.nv-historicalStockChart .nv-axis .nv-axislabel { font-weight: bold; } .nvd3.nv-historicalStockChart .nv-dragTarget { fill-opacity: 0; stroke: none; cursor: move; } .nvd3 .nv-brush .extent { /* cursor: ew-resize !important; */ fill-opacity: 0 !important; } .nvd3 .nv-brushBackground rect { stroke: #000; stroke-width: .4; fill: #fff; fill-opacity: .7; } /********** * Indented Tree */ /** * TODO: the following 3 selectors are based on classes used in the example. I should either make them standard and leave them here, or move to a CSS file not included in the library */ .nvd3.nv-indentedtree .name { margin-left: 5px; } .nvd3.nv-indentedtree .clickable { color: #08C; cursor: pointer; } .nvd3.nv-indentedtree span.clickable:hover { color: #005580; text-decoration: underline; } .nvd3.nv-indentedtree .nv-childrenCount { display: inline-block; margin-left: 5px; } .nvd3.nv-indentedtree .nv-treeicon { cursor: pointer; /* cursor: n-resize; */ } .nvd3.nv-indentedtree .nv-treeicon.nv-folded { cursor: pointer; /* cursor: s-resize; */ } /********** * Parallel Coordinates */ .nvd3 .background path { fill: none; stroke: #ccc; stroke-opacity: .4; shape-rendering: crispEdges; } .nvd3 .foreground path { fill: none; stroke: steelblue; stroke-opacity: .7; } .nvd3 .brush .extent { fill-opacity: .3; stroke: #fff; shape-rendering: crispEdges; } .nvd3 .axis line, .axis path { fill: none; stroke: #000; shape-rendering: crispEdges; } .nvd3 .axis text { text-shadow: 0 1px 0 #fff; } /**** Interactive Layer */ .nvd3 .nv-interactiveGuideLine { pointer-events:none; } .nvd3 line.nv-guideline { stroke: #ccc; }apache-couchdb-1.6.0/src/fauxton/assets/img/0000755000175000001440000000000012332105600020644 5ustar00djcusers00000000000000apache-couchdb-1.6.0/src/fauxton/assets/img/couchdblogo.png0000644000175000001440000000526212332105522023652 0ustar00djcusers00000000000000‰PNG  IHDRŖ—²L0ĆsBITŪįOą½PLTEĢĢĢė"Ö```ńT[ą&)333°°°’’’ņÆÆŲé17šššķī*2€€€÷ĻĻ뀀PPPčppā ÷ĀĆ@@@ą@@Ż ļ8@ ąąąĄĄĄņbiüāćpppłøŗļŸŸękkłßßå``äāOOżšššFM   óqvūŌÖŽ ō„ćPPēźķö’įź ÷›Ÿų©­ģ4;õææŽ00Ū ķ6=½æ\ē pHYs  ŅŻ~ütEXtSoftwareMacromedia Fireworks 8µhŅx aIDATxœķœm[ā8†2…„ņ"®E)rVd]ŻĀž’ŸµMҤ'iŅ&m óĮ狐¦ÉŻ“““—nŖ™ƒ5seJ.2]…ŅlRœŅ„4$4؏k}P×]Ն*µD=D& ®öėB•‚¤ØĒ•h¬MØūV«õ)«ķ[‹hō&wŅė7Ø{>é¹UFØo9ØĻ?ävūŖłOWVØĻJŌo×rP÷%SĻõIPæ)Poļ ”¤G;wT?źHŠ:’ś&}’U4ŚU$ÕAmÉx>•!w[•©ŖŹ#„ŗ®ŚĪ•Pļ HÅ®bŌև6i¶ėŸu¤ˆž¢d]’ÄØņx•%•vż£j¹@m]ß õ¶x:Z_×7A½“ĪXxÕŲõµQŸ>“&ų•£ŖØ½iv~׿8'j’j¢Ė‰t§UįӇ^>#T#ĪXaq½ģāŒoÖQUä®wtÖųY*XŲDĶu×Ūąõ„B°UT„»Žžw|Ę2›]T¹»~“…eóé‚]T‰»ŽŖĀń˜aUp×ŃsĪ“|gŲ¹l£Bw}RÆj°~˜9¬uTź®·/Å朣üVD„;.Æ„Y±»>«Ž‚LFaOČŖū”9ĮĮŗ×wŲbT¼Õ“Ė©­švŚ[ŒŠōߌPŻPwƒH†ŠŅĮŽ Z…ī+8D”Ģ—¹*Ōk„Ś7Ś—6TĪh°7A ŃŠW–¤ ŽmŌ]<~cT§W'«|ś×j€zŻzIPļPJH2üt Q[OÉóÕŁ³Üģd÷tt#TŚŽé ĘPüFĀSÕBϊŽõE0<°šYŒśBļ؎łk^įU\Č£ŚēC:-»q PćµP˜AķWėY=ņj퐢ߐ¼ĆAI•.ˆ ŖsU4|¤µ÷sœ>|Ż8ĘØ-<9ęPåoµ“o+ū¹ž“:–AMĖ£J‚®…7ŻłĀꣶxTēw)ŅߙĄ9©7«ŽZ¦g‰&%ķSPP4«ŠZd‰^% ±ŽE#J“©ˆjڳ&Ź3żĀ ŠzS õhDŖ0)QńņhŽ W Ӗč(EdĀŽå Æ%P[l Ń^ąq4_³Éė1ļŁ{eP‘ŽÉ@ņhǤL9QeRĶwu”Į•³V@ÅĘż^\{&§~śQt­Š÷āe`¾FwŸ¹;RéŌ$G7±Žßß÷ū}q…åQ‘žSæwĖŽ£ÕéŖ ¶ž”¤Ż» ŗJØ-•Ē^cŗ»tÕP•“u2£*ĻU=QU(cT偆’ÆūōeŒ*=ՄµFJ,sTÕė“°FJ,sT„³Ö{ˆ„ ŖŅYė<ƄdŽŖtÖūś(±J Öä¬ńą±GC‡gVx„DŸ¬<Ód䬐,;m(šźhŠü'+O ę9+"{ˆÉ~JŃl¢Bęæuœ5×h§AER­å”%«U¹/¤»®:ź£ µüŃ’ŗPū*Ō ?žØ ÕQķ ¬’”½Æ“§’Øņ…‹gU©1+'éŪĢIÉĀōTżØķÉō…Z‡¾PėŠjśB­C_ØDĮ8ÖÖVi2ŌE7®”»Ø^ų¢Ė—_"’\ńTWDToė7Ø:ƒzP—sVEc菛ą’?LÆL»¹Øć4k¬i=Ø~ƒW'5!Į”Ø^‡ĻZ“UEŌŲ&žµ1„‡ØĶ!k”ńxcseuŠŗÜ˜Rw<€Š.$N2÷ŅŪŖG®śŌE¼ŖFĶEMŻŪūų•|ÜāĻ ~Ō)y¤Ŗ|fØĢė"Ŗ»DŸŪ2Ō…÷4GMX‡žˆ*ŽŻą Įn•ę/™“/;ŃŹ°Ó±¼ĮŁM+[“ēqģam) ŗĶ“©3Ø2« ”¦EiOCWÅm–·CQ=šFūŽˆJ\o*–…o±•”’ā3Ś6€’č”Bm‚°¼¤Ø`LQ ā*†BY[±•źTѧŗ¤ߟĖ(PŅ”rS€ĖQI‹z“,4®:°xT_0w"×>Ev1LŒ„DÅO3$>Ł ź“IcŅ\ŽšŗāŠöøL™Ü¼Ę įH́u\ÜŠŸ›&Ø>S„:‡ÉøŽē…s¾kŲXÖlŚV»¤>j3m67ńō© 5ąņ2TŚ3–ģj@? ą7MÜŒķ 5c¬nŚ‚FŠŹēĶ ŽÕØ Ö0ģCl—!¼Ū»ÕRDå˜Ņ’¤ØB^Ō4PŌddH]Ÿ”Ž3Ķw:ŌŌLUŒŸ,½+uÖAUéƒL»h¢óqØcŽŅ9vV.ꊕ„ߤ؋L»h¢vŅlzØųß-ā'R~܉Q°‚ƒ^“ļeŚEµ īćP; `3kŽ®Š_Ü'tłĮņĀš¢ƒųŠDu+<:˜Zó4†É\Ļė¶bd^ŁN‹DŽB§MŒŒ¬A l“Ū¹ ¹ŁąŪŸ[[„sØx¾,ˆ˜IYķīb0FkÓ|ō˜J¦+ƒ|TN>· ō}:9ā†inÅŚņ%`ūp«XzkÖėK†Ź­xŪŚØC!f«Ė¢ŗæ@"Ļ2Mč°[·CVŚ‚”ŗČėk¢ĪĒpUʁ.å3+ »&¶ŸOI Ś$‰Ūīh’N×ÓD F“ƒvņ h}‚ÆŠH»E_p;-żÄśCæ=€v‹Ÿ‚nÆtā8„ŪkĶÅBŲš2).ŚwjfŅķB–¹ŗ¾6-ėŠ„Zō’/Ō2śB­ŖŁŖwÄdėĶńø!g÷œ$įą.qĀf†ĪI]Ī’³gBu6ż:Y4éĻz«ł±(A]mVŃ9u”“r;t.Ōąˆn®É࿜äOē GŠĪ…JæLœ ōg†ļ1Ō0ڐߤ‡żĆEśėōs”¬ ē€ŽzōFžģĮhēE½t6—XiŚ•s9‰Ó jĻ žuOĆā“5>tJQgĒYśŪōó¢®a,ş#Y8ńÕ §7Isœ56߯‰öÖ,-ģ×įe£Nœ_(ĒErĻ™QŻKt’“„ičßµĢzčäiHāķĮ9ļ“’ C¤8Ėū? źźaIEND®B`‚apache-couchdb-1.6.0/src/fauxton/assets/img/glyphicons-halflings-white.png0000644000175000001440000002111112332105522026613 0ustar00djcusers00000000000000‰PNG  IHDR՟˜Ó³{ŁPLTE’’’łłł’’’’’’żżżmmm’’’’’’’’’’’’šššžžžöööüüü’’’’’’ŚŚŚĀĀĀōōō’’’’’’ōōō÷÷÷’’’³³³żżżāāā°°°’’’’’’ūūūēēēžžž’’’ķķķĻĻĻżżżöööķķķūūūēēēśśśįįį’’’žžžžžžĮĮĮ˜˜˜tttįįįŠŠŠóóó»»»”””€€€żżżŌŌŌbbb’’’ÕÕÕųųųÜÜÜśśśūūūéééūūūżżżżżżŃŃŃņņņüüüųųųėėėüüü¶¶¶ĘĘĘåååīīīõõõżżżeeegggššš¶¶¶ąąą÷÷÷śśśéééåååśśśųųųĖĖĖ’’’„„„ńńńxxx÷÷÷ŻŻŻłłłČČČŅŅŅģģģśśśŽŽŽāāāęęęóóó›››ØØØ„„„ÜÜÜīīī’’’ńńńÉÉÉššš’’’’’’ŽŽŽĘĘƼ¼¼ėėėÖÖÖŠŠŠāāāłłłōōōāāāģģģõõõ“““’’’żżżūūūüüüśśśęęęäääüüü÷÷÷°°°™™™żżżģģģüüüĮĮĮééé’’’ŚŚŚššššššõõõńńńžžžųųųžžžŽŽŽāāāūūūłłłÜÜÜ’’’ņņņśśśŸŸŸķķķ÷÷÷öööčččóóóśśśõõõõõõ¦¦¦ĖĖĖśśśųųųÓÓÓėėėśśśėėėŖŖŖóóóķķķ¢¢¢ĻĻĻŚŚŚÖÖÖ¢¢¢ėėėāāāłłłUUUĶĶĶ’’’ÖÖÖćććįįįźźźüüü’’’öööūūūóóóōōōĢĢĢ’’’’’’łłłõõõ’’’ņņņżżżŁŁŁüüüūūūüüüéééæææūūūźźźéééžžž’’’ųrOęņtRNSŌĻń#ļŸ_ /©šĘāæoS·ß?†ÅCį kDÆĀĄOS_ „š²ŒÓ6Šą>4!~a §@1Ń_'oÄn¢Ņ‹‘€M†”“3±BQj™¶p&%!lµĆ"Xqr;€— A[‚<`‰am}4…3/0IˆØPCM!6(*gK&YQ¦GDP,å`’{VP¤-źxĮ)hŻ7‡e1]ōˆßWæ³$—‡1ƒbÄzSܕcOŁĶ]ĄŠ–U;Zié»'yÜ"€āŠŠ‘ŻŲ†‰K 64ÖYœ*.vč@²øīŽc.};‡ļŸtN%ØDIŖ˜ŹŠ !Z¶Š5LńH£2Ś6 ŒƒÉƎÖ"Š Ō-b±E,,)ŹĄ BŒ·¦>m¹ŖĆćśnųö6pmŸRöO wm@°ŻĢVŻ#?É'C…Č‘Z#©Žqž‡ģĄbŅÓ|$½:Ü)‰Ā/E¾%÷ānR¹q—CąhnµÉ%õiÓĢ“­ŗ¶¶ß}lƒm ?i’dādĆ"€,Ų­Ē`¬Hń"r.z”¼‹ŽĮ~żģü(bšQÜU&ź½—)–5õźX#•§ ņé™EMŖęÜR<Ķ*p[€[%.©OÉĢ£˜„k7“lIo°żØż“¶ßJ°F  „lV!̔ăuH‚`Ƽ™€—›ē‚&¢,Ēz“ÉRk$¤ņØ|$ölŠ»¼Xbü¢āéĒjßŖČdU±ū?Ī£$Hµīø©W±¾$Uū'…ĘÅHÜE3*Õ­ŗ€µµU\}ź­ż†(Ņ ¤zhVk}gĒu«Rk$¤ņ%Ø|‰TØ|Śźck¦ē³"ćžä±Dē”ż«ƒ_W+‹®”Ź.QņŅÅ)Õ@«ż“ƽ€H¢Ą›ĶbµsøŌlžŽT“©·D’ō­RÄ2Xm£#a Żźŗ3lYĆĪzĢj¹ŽŌ撚#!Ž 4žJ“Ä8Ń(Œņcµv™‰¾t]­a·˜T™Ēąų Ņ÷D Ī…ą¼įQ?^-‹Õ_^$:\’ģŽV  $«•N|ģ=(vˆZ'q6¹Zš×†‡×üB5VģĢī!y†“¼3äßKœ’㱿bąv4Œńxšėź£āR]al—ķ!ŌžIŪo‡P‰@Åt„äVy”ŗīąLļ’ŁŖmlµŚæIØUb|[*°¶lke'*¾WdīĄŻdą³šļD·Ó}\W›ƒ_Wߝ“ł¶¤rŠNŚ?™ųŪvŽ«ĮŪ²X%§Ž0u‡öoui*„üJV·€Ę¦‡b%†}ōćˆi5I„YlNŸE-wŠĻ‚ūf_W3mžIåą…Äż“…—-ŒmƒŹ¬²Q)“S µÖk“«TC7źķm¤<"Äō܌‡b‹T|ģĘ'¦Õ$µŅ˜Ÿ£óóÖR&>„źO pœõŗš¾ł…ź6ݬŅöēś½t±Øī„S­ŽN\©×ÆLŒīmÕų\ČĪŃŹÄr@¦3žuT b7śÓt.5.q©ōČ3²r0ü=™8TĀæŖi­J©\ėČ6uF ”²Rø32^÷ķń'ÅŖŠóĄķ±xˆāI« ļŅF„8O{%8­žkJšÓMSČ“dāBEdęŃč ļW‚CYĆ÷O:/OŒN/—I‹ź_=½€xFE”Ń! Ķ=„ęi:oĮ~’”· yž?¶š'·š'·š[Ķ“[Ķ“[Ķ“[Ķ“[Ķ­–č».¹U>±$÷P–ʦŠc%†] Ū\c©“:é| ż,eÆSœZ,‘ošæXrķäĪĖXŗ!ėRę”ĒĘņ@įZųv‚ ‡0Ōē>?Į*ē® Ō<šžÕ|ų«¼N6ž0ś¹;{Æažd³ź2Ōév+Däó^tąąśŃ[q!ņŪžV}Čųf«œŪØĻŽĪ×Y’źeą„—€Ė)Vyl|" f÷UDzqˆ@ėˆĒ¼˜4Y-˜³YżĶ-!¶6a“žŠB:o%ńJ¤ŪI±“—UQ|£UĘKØO `¢®=\ ż“­ņ:ė0¾°Ąx …±Paó‰Ģuˆ@œ»!ē»K†āPĻdÕxhw1>×$jĪ³“vöZdąč™xń«ÕSšUAÅ&[URßd•ż7šĆøĀz·kż«/˜œšr¢U^¬Žä £ó—w:I.ąVĒ®ėō’c>qī„œķ.!·zSŪr&«³Õ2…)Wgł ¾…R -ĪićQ 8æēŲūPa\Šž×U%•iŻ”¦žUļ_=ąĆpŹų ›Lu ź(īžN¹?†Ÿ 0?Ć†:]½Ī¬ä†ŌĻt¬B%“U|™śł²”NsorN’¹f¶ś ų,»P !­v" Y¬6¼hLļ_­@@…bé·sÆc¶¬£qg˜v4|Ā|0lϟŠėŌ$SŒõ9ŽīņbʱšŃj#ŽŸ£~žƒĮŅĻ?o²÷}‘‘ƒš}7sAPm:IV¹=n•÷Æ !ōžÕ{±›{ĶŻh¼ĪEࢪ£8¤sču€ĶoL®ėČTš$ń„õ;VŻś¹­sõöcqģD¦3šųøń üŪ༂3.D«Bˆ«éż«³B4Ģ&ģV'ŲÜ TÅ `õą½Dļ6’™žšĻ·óqżyłjū8V‰Õę*ėÖķX%ż³›@s«\ŽjrNµ$ą|ö=5žĪ† 'ģmUĀ«iż«Kżi€%C™ÉIš:ssaʅ`*`óµ=śl½÷)>Ču՘MeuSš›·ØIņ_ĪO÷ˆLü£_©}o&©ķĄjz’źŻpčŗž{ؤÖįÜlu:OńĮ®«ĘĢ)«s¤%Q@ćĶ$Ž<]f› € xO%…÷PCbhr2£ÕōžÕ¼ŸčżPK·Źėpžf5½NĆ«3^o«ł©ś¼]źe²JŹźĮ¤iŠB˜œ464†€^tļ‡uٲžU֌:G4'æņ22YźpĪėˆĢu¦G'/PyŁ4?”žč.ÕęSB„P_>‘ŃėšI 1t3Ī“÷BäÉ­ęÉ­ęÉ­ęÉ­ęVóäVóäVóäVóäVs«ęĆ]ī³!×67(ŖĒg Ƥ„‹Šyƒ°@†” 4>QŚņ ßÕV«F­}^X×‡ģŚ¼ˆ’Õjµ¦e÷26 Lž³Š%žņY“Gāh ū³šl‰C­}­)Óā< ˆ!ŚE ōšĒE½PēZWZ™½ŒV+ž@†ĻR 5{@ou—ɐ†4²‚²&…„˜“H…Ѭ6÷eµy V‹ˆŻ€˜VÅ„ÖĮ¬¾įcqZ„Ž’©rģÓJĘēyBźęyžÓˆFzŃõFN¢$¢HbČČÕ³*+jՏqņŃĪĄ Ś«˜kŻæUąX„Ælŗe·ģÄö¾Ä1“ÕŹŚdą0d^õ-‘B%‰ƒ}ź œųø{Yõ”™%rĒ*Ņj5Ak5¦u«³"Ģ,·:~éŅøįY¾Ü~ h™÷ūÄSA~æ­6ģ ¼fuĮlՇfµŠ{ȵQtATHŠZˆkĄŖŠĘ­/_°øÕSŸī¼nįū¹ ±u']bł]|m`«B…ńāĮĻĄ”J,O$ķĮdu]·Zs® ĄFLß:©Äłśś›aõų‹Ą‹Ē™ÕĀĢT4Ļoą~by?wpĒj껄ÖAœ…Ų(€xł]„†¦ś…ŖfÕķ¶~anÖ§/ž©øæ^ČdÕŚ²öcŲŚś˜Õ‡,!ÄŠ1©ųi&–xi_VK@ip«Ķƒ9ÆŠŽVi%a; ÕÆL?‰0J“*¹’šÅŖ5ܶøUŃ·Š“'Į¬ŗx^ī²6āV[„^ ą{öeU™ČŅ|—:0ų=0‡»ČdŪ«o‡Øē*J“q%•[­ĘõYĆNø˜.sQ„L‹udš[2ך9žIżó:WĮn—ŌČ’ŠŁŽŹm™Xl„ڃ¾6×!lNl‡ŁVŁÕ§KU¼¤¤jVć\J%©UߊßB°ŽLcKfįb×ö>a“=Ņb›~¹R]aG%[ś÷×js@«/9šMطݘU×>yɲXĒ@}³ ” ėėF¢“tÜg^‚ŪvO\°žÓøwv‚p•ĻÆz3›K5i¤!$P>”āÅ€¹'Ņ”Vʛ¬”¢Lž2r“ś@¤UMĆÉKĆśZÆõ‰¹å6ÖץtwŒė§ŸĀ¦bä„mß1āh|ō|É]}~¹0ųĄMjA¢Ą“Ņ(JāŠŻĮ­JP68ĢC&yrČĢ׉e}­jŽ_cĖJ½?źI0¬ÆkźŪ>š«W™‹įų Ęū‹™Æé|”B¾Žį."TEXd  Ō8”Ä!cwµ*E(ĪJ)ŹåÉ!Ī[W"­j_ŌĆįŠ¢eX_׊XB;¤÷Æo°†O0~?¬:P½Cć (.²ķ¶±[·Ž‘‘ņ!Wq£%ßŌ*leĆĄY)E™<^ˆKåZ¹T•60Ö.šõ#«µųA\ż¤Į5;RmĘtkdĀ/8§)5~‚æ ¬^0Ś #åCkg–¦¶eĶĢy)²—±Ķ¶æ‘ԺҰ6Ä„Ŗ<€(?Ę×&ÉõõuīA„įVŸ’õm0^h.—tĢxR*ō×aō©'ö:,„H§|čō–ŖĻ l5z„;8+e¦#b'#|ū}2Ęw(|Kc–J½ Čl6 뀶¾®wł‹^‚ՏŒo×—iśœ3HÓ źR –ŽĢ”9Š,Y“gP«Ö°:N œ[5SĆöū‰R‡!¢§ä[)•ē]€śœi}`śśŗm¬’øN±4Š„¹²ćvŃ`|;f¬(®“Fļlt©„¢LŌ8”ÄĆ·Z#½Aļ–¤O%ÕĄY)N¹U®5YźŃeœ¼d–JĪE3dZŲ°’žĒ<Čx·ĒńŲɝńä¶e •@łPڧĻžĪFśTR œ•2S”Ā·ßüΦ/uˆZ°~ššCę3ĒŌXŹz¼ĶÓU؞āxõ\2s«ńä¶e •DłD.ēÉåfBO&enŻ'iČåR%™?FyøVsS~$uˆ®mœw()Į“r”ŗo³0*Dķ˜Õi!3½:On[Bµ!sʇBäp>Ż£HTŁ1ņč ;ö8M×jnŹ¤‘Ó¤ļ¼äqpŽ 1hņ^ˆ<¹Õ<¹Õ<¹ÕÜjžÜjžÜjžÜjžÜjnÕÜßū–qÕ(qpõOkŖ’Ō}øßųI?TY8H«®mhyKøĢu5ĶĻĀĪIœt÷eÕnQBŽ—`µRÄĀ`Æ·EĄPĖ ­Ś¦ö˜½¹xū™«ž½>¹>€ā‘”yt¾{?|œ×'j)”ÉĘ€µ}YUŪĻäUłŪÜ{ē@Vå‡/€J1ģF+€¬æ7䀉[OW«O[ęł ų¹‘‰y³ĒUY«Ŗ•ˆõ!?BōČD%D™Wj¼>-Ai6x£z)»ÕĪU R½łŖ±’7 dõŁŠ@µg‡ˆėļ•\†soŲ)œaĻ4ßzfŒ[«W+•±>¹ø« œ’Pō>ä |•ŪqLćŃG8vāøāźČ£„˜l“j©µ2ZķĘtÜß+åŒV„ŌA¬6g<„/ŽęQ ‚H­ēSrĪ£“ŃēÖd}ŲłYqąŌg]€sY]ē;]FėCŖ@5¼YÓՖ5ĪC©3å8oŁ)kš1'ūüd6«>T *ĖŹ†’§Uz(„m)ūā®CD `‡ÖHe/¾.ń:ē—zN„Č9pgo &NC¦×ƒŒŽ‡¼>¶WÓųÕ°_’ńHj ń)¤Xe6F„ 7p’m¾-č`'Öc†»Ü.Õ«‹ĀAZ=³ž^Ée8÷ĀF×;<ĖūÄJ1{óćŠ+8'€ÉŖ'„Ö‡\Aµ*æŅų[² ‹ńR$UćY)V¹ óAyɃŒw)ŽEc#<ÕT‡ƒ”»\vW<U1ļIؘCDo‹ĘYoČ·]ßwmĪawŠę:B¹ :'§Z+²vé}ČĮ|”0Ńėq†«Ć1ŽPŖĪƒį*€¤u•T«Ķ7 óF3ޱ9½ŅėA}$Żåf»+īoČüē[Åč½I±5ö÷ʰžŽ½x(&Ķ”Żńiµ»Ź¼YŽń:cæPp*Ž»bœœĀøJˆ²‘j•V7l¬jtsNk¦œv—ĖļŠ»[ŗfy3ĄŒg]ź÷÷‚õ÷¾uœœĀąé²±¹ČęgēJųŒE†0)Viłµ¢Ć¹čĮƒ”»\vW<°Ugųt§eļ~Bļ[ĀÕĄąAÖ†‰‡ŁHµJ—Č'å.—Żn•œ& 1Ō”½ū ż½o%gͱ_Ÿ‰Nę ¦›”5ź.W×ģõ3y/Džļd«yr«¹Õ<¹Õ<¹Õ<¹Õ<¹Õ<¹ÕÜjžÜŖ{•¾­“÷wawˆ:6ŗdJ§;&Õžķ3‹p tlŒŒ±asõÕŸ²äÕW_UߎÄT€_'9{?ša«†…Ō¬ĆÄģ•l/0«÷įdHgqll±cę’śĻ8ÄR‚yłč€”žm=Ė¢š_ŒĶŗå–[Ō·71Æx"Ü"ŪĘSÖIfV“ūrńüŒx3Ļ3y•)h ŌšĒhĢÕ »ˆ0‹®‘?ŃrŁó©5—xšū°Šž_ü -ŚĘłČjÕõŻäĘ÷õ õ‹¬Ń‡oO:ēė$›­–XBXJ¬źŃ£1¼ˆćĆ#ֈu7½`ózu2ąü{ļ“\;äėuܗ±9@Ø0ŪÅV$2X››SßųāĖę&ś¦ÓBaĢż[ļOŚ~‘Ńj“N2ß ČŖ/­Žšüjz_®€ŪnA±¬ŽŁé§æčˆ~ĄĀ ŚuųŚh@GLüOżeɵ ĻĒ?TˆÅąf•{R­®«ÉėÉżŗtŪn(–ĻzĻ!S×7o ×ļ€×Ie®Žī™wõ3]ŌēbܗüäĒ8¹5|Ęi·Ļ ęźRŪŚJkʱZ‘RO+ź8£U&µ:]•Z‰ieR‰’¬¢‰(üóJĖMŠŽ—7—³«ŅZ@Œ²5Ża^äŗ\G˜z™ÆsŖ¾éρU‚Ņ*„rMĻe³zT¬^Ź:ɬ‚õͦX=>Ü$ bi>³U&X¬Qoybb¹GÄųkųĶ8Æ – ÅҘóż’n).Ս¤ņœŁšoć „Ą^Mmįd³ZƒŹóiė$s«Ŗo–oŽź*{»4ģģŃeLb¤Lٳ""mx: `:mÉkž[ŲgeTˆŃ‡Ž¬)Į„'0*T˜›Bį€{!śīIŽ ‘'·š'·š'·š'·š[Ķ“[Ķ“[Ķ“[Ķ“[]˜ZˆƒÜj QŠ.e '/ø®y÷vQ¤71ų(Z&†óŅX‘õ?(_œšZ”œĒŗ”){tÄŚ€m˜Zķ’ĄWŃĻ)­«-C“ŠÓņ“¶ jqįnķ,Ģ‹Ÿ"įIv‹¦½ULŲ!h¢™Łź›æīń©ÆŻsēk’óAcrN‚ōžä½šŃ„€…VE4ö0śy˜XÜŅ~å4zŹøVć³°%·ń,é¹ßū)fųĆĄqtĆp˜u¦~ć  Žų©ŽŃ*ż“©^ęÖ0:åżĻéܲö3’3…ĆĻJĪāOō(¦·ö£›ZB?K™^ Ąv]’un Ÿlēś’ōWžĄ‚¶i0“p6­ˆ[ģ°©ąC_5Xż#ś[æöwX3įbńĪ廫ÄR½{łĪā¢NKšAīĻ’Œée S«čÓeŖ|Żć¹wń¢ĒxāŗŹŽsōńo>ÖP\å„”Ō•6Ņ;nVŪmÆfėI$ąų‰ĒūVĶ“J-ŪJ%֌¼Ž0ÆóUwūYŠŽÉSõóó×n‘u’Ņm’藮ʳ«xzµŅĖ—VŸĘ«ŚIµvnōW’Ś_’qLZŲĒņé"_—X®z‡Ć÷Ę 8Ē]Ap—‰ƒˆĶ?†¶C͋ޑž5Č4ˆ·3ńŽzw(Ü{7e²*Ȳ`Ū°¬!AŌQ“:ńKUnõ•æĀ’zė]ś1y†V„ų›Ga°śC’źm0īPY ٚUx6TT&·hVļ9V§ žīßÓ¬žzƑ  1[÷X®z‡ZœĖÕī„Š9Ŗe¢r›qóJø³øNDß/ł¬¹g·žX¦ė*9o—šķN6«DĆĆ` Ė{ą÷ŖIļ%ĖM“z9Ā—ćTūQŽŸą–ˆžž7fö\"jžĆ_3ŁžÖē~xBį'€ŸłÜ·ˆˆY›]*KЌćī“«%"śŌē5«"šČqxq~ü’Ę•=·‘Øj¼“ŗSį>j¤Vē·&~]2 xzĄFøÕķŸ1X•§_yŽłDĄĪ<#N’ÕīļRB÷Ō}KōĻ’Å/ói‰Šy†łæõĖ !V^¢ńĖæe²JŸ‰‡}/FkļńAßś7Ÿū· āėS©Č×+.–(ec—ˆJ:˜zšƒŖóW“ZšŠ°ėŖ–wļŅŁQ™žįšÅž~aŪŅź„ŲĶ„öpē6,e5ķÆ,¬+¢–”Į,żū’š­óń÷’t±võ%O^OųüO}ćן -Oüś7>e²ŚkC¦6£waō_žėC ¢‹|½ā›9‘‘×*•šĪ‡ŲWĘńøAŖ)×U¶Jgź8<żZ€“šx^?„’¾2²u¶­Yżķ³õč*^?ūŪŚ‡KC­Z¤[‚’©’ł0.’–ąCµÆ@m¾ēÓēß$-ßÄ/~ž|Y„å[ežwƒeQżŸŁ×¶&cėŹOž4s|‰œc’§JåūŸwsļūXĶ8/ńš¼Ī6Ļ/ ڼ;ē'FÆLN^8]ہeadėZ 1'®Ü°ž÷^†Śü™ū¼‡L³‘sBdü%Ó+M¢·`ŻćSKö8פ²÷«ģŗ*ƒŖ)gl#Ž3"Ä’gъ˜S Ē拎©qtcxxƒš|H>–¬Ęų=šŒ:³ÅēżĪmŹjÕå¬ß’ģÕUßņĮóv£qģys©Ü’žLglžC6+[FĶSWg…ö“9õ˜ƒwV3¼1µA ė N”ßD¾<Ķū«ĖĀ$5e’(s„ś” ’[Š ŪØbś—³‡žaF.”Ø]±K”īĒIEND®B`‚apache-couchdb-1.6.0/src/fauxton/assets/img/fontcustom_fauxton.eot0000644000175000001440000001630412332105522025331 0ustar00djcusers00000000000000Äģ ōLP˜„āÉ$fontcustom_fauxton Medium Version 001.000 $fontcustom_fauxton €PFFTMh/MŠOS/2A9^‹X`cmapōŠBcvt DXgasp’’Čglyf)Cw`°xheadżė=Ü6hheańÅ$hmtxž@øZlocaTY˜\Tmaxpué8 namešĶūl(śpost›#¼“$¤É℘_<õ ĶųÕ`ĶųÕ`’ĄĄĄ’Ą.)ø @.ōLfGLfõ„ PfEdĄńń%Ą’Ą.Ą@ X;@#>,< ń%’’ń’’D***Ręų,LrČä"f~¢¾N®ąģdŅ4BX”4ī84T¦ō x ¢ ¼™U.±/<²ķ2±Ü<²ķ2±/<²ķ2²ü<²ķ233'3#ˆwffUž«3’Āž¾ 75!!!%5#!!%5#üžüžģ_žsüžģžŽŽ0ooģoPP’Ā’Ą$*0>LXf%"&'&'"&54632307670632&'67*54>"54>'4&/524&/52߅;;…  an$² žō1nn1ßm21n  ! ( ! (Ä0' 0   ~   / ž‚ Z žĀ\ žĘ@ @ €? @ `@@ ‚@?X’ĄØĄ'7'7ØOÆÆO’?PÆÆP’’Ćżæ 2"&47''–Ņ••Ņ”ÖÅ-˜H-¾”Ņ••ŅŽÅ-˜G,’ĮĄ 2"&45#—Ó••Ó•~’æ•Ó••Ó‰??’Į’æ2"&45#5##335—Ó••Ó•~`@__@¾•Ó••Ó‰@__@``’Įæ2"&4'7''7—Ó••Ó•|QQ-QQ-QQ-QQæ•Ó••Ó»QQ-QQ-QQ-QQ’ĄĄ'6%'#'&''7&/5767'76?372654.#"M -M @ K-KK-L @! L-Mž’(8-'9$”! M-LL-L @ K-LL-M 8(,8($’Āå¾ %''''äD  DääD  DėäE  E¶äE  E’ĀĄ'#!"&5463!2'4#!"3!25%'777'' žo ‘ 0že›ž•'`>AA>(a?>B  žfX†=sQcOlB;’Āŗæ #/"&=265&"&=265&"&=265&"&=462Jžpm£možpm£možpm£možppžo>8(5&//&5((8'6'//'6''8(5&//&5((7( '88' (@’ĮĄæ !3#5# Ÿž‚@ž柞”žžB’’Ćļæ#!355#5#%5#5#OŸ_žƒ_ŽŽ ^柞__žDžžć_Ÿ~žć’Įåæ %'77'77åE  EååE  E•åD  DžHåD  D’!,2"./>264&"62#".54ä9;1-"69ROQ<1  0/$iKKiKe5%%!)(! B3*(98'$+ž×KiKKit%5%’Ćž½/7"353535?32>54&2#"'###57&542"&4‡O7®??@ # ƒ\\B ?@½Ą‘}7' !®%?@#'w]ƒ\@??~Į A"’Ćż½#;%'764/&"&6?62&4?622?"/&4?>į.<l -  k /O-ž³ †  † }-  k +O0.<l ļ/ k  - l<.,O­ †  † #- l<.0O+ k ’Į’æ !5!!5!!5!!5!#".5462žžüæžĆ=æžüžƒ} ?¾?ž@æ?  €ž75!ü~~’Ā’¾ <Y!".5463!24&#!"3!265'"&="&=46354622'"&=".=46354622ŸžĆ,8'='88 žĆ  = _  ¬  =,='88'žĆ(7œ  žĆ  ?/ /   _Ž Ž  0 0 ’Įēæ"-8@L54632"#"&65&#"&=7.=7.=323"&462#5##3353pO4X35-).Opg æ'Opg?F`ZFG`nQ TwTTw$PPPP? (8, -  8.3ę'8(6&.6$6#- H6$6'/wTTwTOO PP#’ÄŻ¼*"&4?62"&4??64'&"2?f3°#k$%%žA.=,= 5° !^O,O~žD_? ?æ@@æ=žĆ@ @æ?>’ĄæĄ?žĄ’’’ĄĄ ##5#5353’æ€ĄĄ€€ææ€ĄĄ’Įķ¾(!4675.=.4>754632ķž%_J%   O8%?$  K_?.G >%  8P$?%! G ’į’Ÿ#'8<@PTX7'&4?63#&=#535463#3#2+"&=4635#3#72+"&=4635#3#K@ @' '[@ @' 'Ę    _@æ Ž  `@_ é@  ? @C@  ? @E@>@ @@>@  @@¾@’żü„.#/&4?62ļoE&××&Y~@PH  &  H~Y$’Äč½@VdpxŒ"&=46;2#724&/!"".=4>332>7:#!".5'4>3264&+"37254&+"3724+"37".=46;2#l ”  ½  žÆ   O * žŁ  Ü©© © © © Ü   > W  V  žZ  žļ „   i å  ę Ø *  *½ V  V’Įž¾%"/#"&462264&"š(p2:Uyy«yėwSSwT'p z«yyV93#TvTTv’Į’æ 23"&54>3#432åŖ:†¼†=h>öe‰ć_……_=i=Ąõ’Āžæemu}Æ·%0###1"'"'&'"&1&'&'&'4&5&'4&5&51474767465676767061672636312201%'7&427'"'"627.'1&'&"111127271>716764'&764ž "8    8"  "8    8" žn// il3/:/Ÿl3/:/1!  !11!   G/ 0Į 9!  !9  9!  !9 9/2m2/;ü/ /”/ /¢!0  0!  !0     N/:/2m’óż73!!##5!5!53ezž†•fž…{&gO/OfgO/O’ĮÜæ#-159+".5"&46;4>3232&"34#;265'3#'3#'3#¼8(æ,  _#'8` æ@_’ æ @ _@@@  ’'8,’#8(_M’  ßßßßßß,’Ą¬æ'5#"&5>7&=4>3254&"26.#1";26LĄ'85'#"/5J#&6-9&4&&4&? I,,I  Ą ?8(*G%3?/#K5?3%G*,??%%?%%Ä)66)’ĆžĄ$=K]%+673265&'&'67>=4.'&'632#"&5>7&=46254&"32>.#1";26›&57(,   .$  !4KŸ¾(86&#JiK#&5,:%4&&@ H,,I ¾ ŖG+'8% 0( !@%J5@2žõ8'+G%2@5JJ5@2%G+,=@%%@%Ķ)66)’Ćž¾#"'"&4?&54>323÷J4ż $ ž ":#OSd4J ż # ž#:"OT’ĮĄ %''7'77’f™™f™™f™™f™(gššg˜™f™™f™®DŠõ-yĶ9 ˆ $Ļ   Z $§  ą $Created by Sue Lockwood with FontForge 2.0 (http://fontforge.sf.net)Created by Sue Lockwood with FontForge 2.0 (http://fontforge.sf.net)fontcustom_fauxtonfontcustom_fauxtonMediumMediumFontForge 2.0 : fontcustom_fauxton : 2-7-2013FontForge 2.0 : fontcustom_fauxton : 2-7-2013fontcustom_fauxtonfontcustom_fauxtonVersion 001.000 Version 001.000 fontcustom_fauxtonfontcustom_fauxton’Ą)      !"#$%&'uniF100uniF101uniF102uniF103uniF104uniF105uniF106uniF107uniF108uniF109uniF10AuniF10BuniF10CuniF10DuniF10EuniF10FuniF110uniF111uniF112uniF113uniF114uniF115uniF116uniF117uniF118uniF119uniF11AuniF11BuniF11CuniF11DuniF11EuniF11FuniF120uniF121uniF122uniF123uniF124uniF125’’Ģ=¢ĻĶųÕ`ĶųÕ`apache-couchdb-1.6.0/src/fauxton/assets/img/fontcustom_fauxton.svg0000644000175000001440000007155112332105522025346 0ustar00djcusers00000000000000 Created by FontForge 20120731 at Tue Jul 2 15:07:12 2013 By Sue Lockwood Created by Sue Lockwood with FontForge 2.0 (http://fontforge.sf.net) apache-couchdb-1.6.0/src/fauxton/assets/img/fontcustom_fauxton.ttf0000644000175000001440000002264412332105522025343 0ustar00djcusers00000000000000€pFFTMh/MüOS/2A9^‹`cmapōŠxBcvt 22Ųfpgmć'„ģ bgaspŠglyføĻ¼Hheadżė=6hheańÅ<$hmtxž@`ZlocaR6W ¼Tmaxpž  namešĶūl0śpost›#¼“,¤prepTڃK%PRĢ=¢ĻĶųÕ`ĶųÕ`ōLfGLfõ„ PfEdĄńń%Ą’Ą.Ą@ < ń%’’ń’’™U33'3#ˆwffUž«3’Āž¾ 75!!!%5#!!%5#üžüžģ_žsüžģžŽŽ0ooģoPP’Ā’Ą$*0>LXf%"&'&'"&54632307670632&'67*54>"54>'4&/524&/52߅;;…  an$² žō1nn1ßm21n  ! ( ! (Ä0' 0   ~   / ž‚ Z žĀ\ žĘ@ @ €? @ `@@ ‚@?X’ĄØĄ'7'7ØOÆÆO’?PÆÆP’’Ćżæ 2"&47''–Ņ••Ņ”ÖÅ-˜H-¾”Ņ••ŅŽÅ-˜G,’ĮĄ 2"&45#—Ó••Ó•~’æ•Ó••Ó‰??’Į’æ2"&45#5##335—Ó••Ó•~`@__@¾•Ó••Ó‰@__@``’Įæ2"&4'7''7—Ó••Ó•|QQ-QQ-QQ-QQæ•Ó••Ó»QQ-QQ-QQ-QQ’ĄĄ'6%'#'&''7&/5767'76?372654.#"M -M @ K-KK-L @! L-Mž’(8-'9$”! M-LL-L @ K-LL-M 8(,8($’Āå¾ %''''äD  DääD  DėäE  E¶äE  E’ĀĄ'#!"&5463!2'4#!"3!25%'777'' žo ‘ 0že›ž•'`>AA>(a?>B  žfX†=sQcOlB;’Āŗæ #/"&=265&"&=265&"&=265&"&=462Jžpm£možpm£možpm£možppžo>8(5&//&5((8'6'//'6''8(5&//&5((7( '88' (@’ĮĄæ !3#5# Ÿž‚@ž柞”žžB’’Ćļæ#!355#5#%5#5#OŸ_žƒ_ŽŽ ^柞__žDžžć_Ÿ~žć’Įåæ %'77'77åE  EååE  E•åD  DžHåD  D’!,2"./>264&"62#".54ä9;1-"69ROQ<1  0/$iKKiKe5%%!)(! B3*(98'$+ž×KiKKit%5%’Ćž½/7"353535?32>54&2#"'###57&542"&4‡O7®??@ # ƒ\\B ?@½Ą‘}7' !®%?@#'w]ƒ\@??~Į A"’Ćż½#;%'764/&"&6?62&4?622?"/&4?>į.<l -  k /O-ž³ †  † }-  k +O0.<l ļ/ k  - l<.,O­ †  † #- l<.0O+ k ’Į’æ !5!!5!!5!!5!#".5462žžüæžĆ=æžüžƒ} ?¾?ž@æ?  €ž75!ü~~’Ā’¾ <Y!".5463!24&#!"3!265'"&="&=46354622'"&=".=46354622ŸžĆ,8'='88 žĆ  = _  ¬  =,='88'žĆ(7œ  žĆ  ?/ /   _Ž Ž  0 0 ’Įēæ"-8@L54632"#"&65&#"&=7.=7.=323"&462#5##3353pO4X35-).Opg æ'Opg?F`ZFG`nQ TwTTw$PPPP? (8, -  8.3ę'8(6&.6$6#- H6$6'/wTTwTOO PP#’ÄŻ¼*"&4?62"&4??64'&"2?f3°#k$%%žA.=,= 5° !^O,O~žD_? ?æ@@æ=žĆ@ @æ?>’ĄæĄ?žĄ’’’ĄĄ ##5#5353’æ€ĄĄ€€ææ€ĄĄ’Įķ¾(!4675.=.4>754632ķž%_J%   O8%?$  K_?.G >%  8P$?%! G ’į’Ÿ#'8<@PTX7'&4?63#&=#535463#3#2+"&=4635#3#72+"&=4635#3#K@ @' '[@ @' 'Ę    _@æ Ž  `@_ é@  ? @C@  ? @E@>@ @@>@  @@¾@’żü„.#/&4?62ļoE&××&Y~@PH  &  H~Y$’Äč½@VdpxŒ"&=46;2#724&/!"".=4>332>7:#!".5'4>3264&+"37254&+"3724+"37".=46;2#l ”  ½  žÆ   O * žŁ  Ü©© © © © Ü   > W  V  žZ  žļ „   i å  ę Ø *  *½ V  V’Įž¾%"/#"&462264&"š(p2:Uyy«yėwSSwT'p z«yyV93#TvTTv’Į’æ 23"&54>3#432åŖ:†¼†=h>öe‰ć_……_=i=Ąõ’Āžæemu}Æ·%0###1"'"'&'"&1&'&'&'4&5&'4&5&51474767465676767061672636312201%'7&427'"'"627.'1&'&"111127271>716764'&764ž "8    8"  "8    8" žn// il3/:/Ÿl3/:/1!  !11!   G/ 0Į 9!  !9  9!  !9 9/2m2/;ü/ /”/ /¢!0  0!  !0     N/:/2m’óż73!!##5!5!53ezž†•fž…{&gO/OfgO/O’ĮÜæ#-159+".5"&46;4>3232&"34#;265'3#'3#'3#¼8(æ,  _#'8` æ@_’ æ @ _@@@  ’'8,’#8(_M’  ßßßßßß,’Ą¬æ'5#"&5>7&=4>3254&"26.#1";26LĄ'85'#"/5J#&6-9&4&&4&? I,,I  Ą ?8(*G%3?/#K5?3%G*,??%%?%%Ä)66)’ĆžĄ$=K]%+673265&'&'67>=4.'&'632#"&5>7&=46254&"32>.#1";26›&57(,   .$  !4KŸ¾(86&#JiK#&5,:%4&&@ H,,I ¾ ŖG+'8% 0( !@%J5@2žõ8'+G%2@5JJ5@2%G+,=@%%@%Ķ)66)’Ćž¾#"'"&4?&54>323÷J4ż $ ž ":#OSd4J ż # ž#:"OT’ĮĄ %''7'77’f™™f™™f™™f™(gššg˜™f™™f™hŽāĮ_<õ ĶųÕ`ĶųÕ`’ĄĄĄ’Ą.X;@#>,:Īąü4Z°Ģ NfЦč6–ČŌLŗž*@|ųÖ <ŽÜ ` Š ¤)ø j b®DŠõ-yĶ9 ˆ $Ļ   Z $§  ą $Created by Sue Lockwood with FontForge 2.0 (http://fontforge.sf.net)Created by Sue Lockwood with FontForge 2.0 (http://fontforge.sf.net)fontcustom_fauxtonfontcustom_fauxtonMediumMediumFontForge 2.0 : fontcustom_fauxton : 2-7-2013FontForge 2.0 : fontcustom_fauxton : 2-7-2013fontcustom_fauxtonfontcustom_fauxtonVersion 001.000 Version 001.000 fontcustom_fauxtonfontcustom_fauxton’Ą)      !"#$%&'uniF100uniF101uniF102uniF103uniF104uniF105uniF106uniF107uniF108uniF109uniF10AuniF10BuniF10CuniF10DuniF10EuniF10FuniF110uniF111uniF112uniF113uniF114uniF115uniF116uniF117uniF118uniF119uniF11AuniF11BuniF11CuniF11DuniF11EuniF11FuniF120uniF121uniF122uniF123uniF124uniF125’’22°,° `f-°, d °ĄP°&Z°E[X!#!ŠX °PPX!°@Y °8PX!°8YY ° Ead°(PX!° E °0PX!°0Y °ĄPX f ŠŠa ° PX` ° PX!° ` °6PX!°6``YYY°+YY#°PXeYY-°, E °%ad °CPX°#B°#B!!Y°`-°,#!#! d±bB °#B² *! °C Ра+±0%ŠQX`PaRYX#Y! °@SX°+!°@Y#°PXeY-°,°#B°#B°#B°C°CQX°C+²C`B°eY-°,°C E °Ec°Eb`D-°,°C E °+#±%` EŠ#a d ° PX!°°0PX° °@YY#°PXeY°%#aDD-°,±E°aD-°,°` ° CJ°PX ° #BY° CJ°RX ° #BY-° , øb øcŠ#a° C` Š` ° #B#-° ,± CUX± C°aB° +Y°C°%B²C`B± %B± %B°# °%PX°C°%BŠŠ Š#a°*!#°a Š#a°*!°C°%B°%a°*!Y° CG° CG`°€b °Ec°Eb`±#D°C°>²C`B-° ,±ETX° #B `°aµ BBŠ`± +°i+"Y-° ,± +-° ,± +-°,± +-°,± +-°,± +-°,± +-°,± +-°,± +-°,± +-°,± +-°,°+±ETX° #B `°aµ BBŠ`± +°i+"Y-°,±+-°,±+-°,±+-°,±+-°,±+-°,±+-°,±+-°,±+-°,±+-° ,± +-°!, `°` C#°`C°%°%QX# <°`#°e!!Y-°",°!+°!*-°#, G °Ec°Eb`#a8# ŠUX G °Ec°Eb`#a8!Y-°$,±ETX°°#*°0"Y-°%,°+±ETX°°#*°0"Y-°&, 5°`-°',°Ec°Eb°+°Ec°Eb°+°“D>#8±&*-°(, < G °Ec°Eb`°Ca8-°),.<-°*, < G °Ec°Eb`°Ca°Cc8-°+,±% . G°#B°%IŠŠG#G#ab°#B²**-°,,°°%°%G#G#a°E+eŠ.# <Š8-°-,°°%°% .G#G#a °#B°E+ °`PX °@QX³  ³&YBB# ° C Š#G#G#a#F`°C°€b` °+ ŠŠa °C`d#°CadPX°Ca°C`Y°%°€ba# °&#Fa8#° CF°%° CG#G#a` °C°€b`# °+#°C`°+°%a°%°€b°&a °%`d#°%`dPX!#!Y# °&#Fa8Y-°.,° °& .G#G#a#<8-°/,° ° #B F#G°+#a8-°0,°°%°%G#G#a°TX. <#!°%°%G#G#a °%°%G#G#a°%°%I°%a°Ec#bc°Eb`#.# <Š8#!Y-°1,° ° C .G#G#a `° `f°€b# <Š8-°2,# .F°%FRX ,°+*-°5,°,+# .F°%FRX Č“āaįIDATxŚŌXklTĒžīs½ocæāclJ­Ų(śPŚ’T-? ‰Ņ %U£„¤@š©Ō¦R›_UZUUŅDŠŖV5©ˆ‡Eˆ‡‚S+!"`#hcģ]Ūkc{׎]Ū»{_Ó3w×^?ÖąÅøgu4wļ=3óĶĢ9gĪ9c ÷#Ɂ@ ē¾ ΦiŚ’EQ„$IüQąŸēĖėŗ>#'Ā Æš Jčõ2QQ`$0ć6PÆ×ū°ÓéÜ®ŖźęØ®½”ŌIĢDč±ĢT >ŸļŖ&“ÉvZlIJ,pę‹ē ą Rü>²BóYł”¤žŒG˜hPūæœŁ&Ž^0‡Šu-%ŗ}ž†²Ŗ~„(JÆœī?6z/ 'Õ—Ÿ:&ŗ»Sžŗ:gE}Ż«n·ū¹Œ˜FĄ Ćwišv‘ø—Ž…¦ŗ{&EU•ŅóåA­TR’×;L}M¾ŃBoo/D§ÓŽ…ąŽ§?éætįėėv½ l~’/ ś¼ķ‡lčĀIÓa:$SØŁżœŃš§×„¬tIó_śÅoĶĪ·~/z‹k—Œ™ė‚ŽĄ]Y®>}x½RY1fŽG3;ž9öT2åóZ–²:r+ē •”€ą1MYtŹ(’ėØxęieŽĄČpņ$Ąmėü¦MĄĘĄ”C cĮŗŲˆÄØu ÉP–¦’\*Œ$“^?­BEĘnäģŗ¤<ŽD9=­q˜ G =®ļļ¶oŽœ®¹ß‡‡†š%<÷żĖ/oæm?oN–—¦|IüoŠ@K{œ½ć¤źōŅąĻmŸĮ P]ķmŠ—O鿃.9"D›‚攽2 ŅM@Ś,g¾’Įp×g;µ[·Ņ;kŁŽnwnŠ7nĄąą’׏§½=‘€0>žšl pĻ>lŪÜÉóc{ōQ ¹óLµd7o.oöžčE÷`}½½k§ŗoŽbłŅŃ£~n®Ø`lĻĘ._NĖ67/.{¾Æiė ‹BĢDp„ģéʵėB°ėĘ×,Ę†ŁŻŅkÆĶlēNĘČ-ŪŽĪXuužĄEv|Mc“ūr{C`0¤ōü·³@8S·ńhł†Æ>ŃųÆ.ļwļJɟļŪŌÕŻ^–<vģĪž]ŅŠ®btxW3æ$ÄåHÄōmØė’­ńXĖJÅćäīŽĄ*(€ųŌSK~ąĄŅeąĢą•W€7ß\TL%ؖ‰R#…†‰° NĘ|£äJ±ņ5²čvʼn3’pš °w/Fø’ŻxąG;VĪ5¼ńFŚ÷ļŁ3÷S\øź.ĘC#6šrmĀfN×Éöx|Q‘ƒά?ŽæĘŻ“’ä§Š'&—Æūõ?āź {s|žy µÕVÆż½Hü”>…±x.f.źÓe±v-m-Ą;ļėėÓŃQ¤ ‘ˆ c÷ϰ©łż»œ ąźž—Тپؒ}żŲrā8…óÜģÖ­@WŲÕkš“ž_t`üō9¤"p,6ų¹Ēw}Ü:ۊUÕn£²Źūki.>u6oGüŪ»ģCÅĒŽQ’5kYUƎŠó…[X24tĒžį±Å¦2;Õ“µSFJ›īp='rššŒ8‚šŁ®gń±>x–°Ė‰@:^܇žÓ'ą|p–¬C’ō”Q8JźŃמ9büe?މŖ'žDłĆM³:“²D£¤[Ż(¢ŲĒāQėääm‰¤P˜[?F=E£ćż`ß} ųĶÆÓ7e.HāĖw’Ī_¾ +1†U…ՐIOŅYöx¼­õ–Aé¹ķwW üł-Šqč“o_īŃ8/ˆGņž½d-”šö|Kš/’łlٲ@L?×ńē/ā< T]c”Ł`„ ŚŻóēļŹ~ļ{;–óµ»øäŲPEģѦP@ź!盢åsę 8y•ˆāD!9©Aš®“}’»CõšüĆUž³k"o%hö³„˜¤"!Źhœ…Ė4ņ®¢Ķ[/v[:VŃÜc(ģ `5ĻüÓ–**€ņ2`(=YYjfR"ū§V3Ą8@ʁ%‰ ’ć °ČxyĖĪ~;7h˜ņßq~Ģ“Ć2ģÉśTtU€4Åc]ŻpoX?·-äę7æPó!¾J{'uČAs@lV*&( iżē’łķ8¢™ §…姐Y„­Æ.āćĆ=ūŃBąDŃÆ¬E?µ~:-~»qvZĘŠčøøŲŹÄ\.!āŽ·]Ģ9˜æ“|YŚ0ÅeVɤż§«QņtZ1_ÄŹ•ż0žf«ˆ]ž"ēD*éø8݃*–1KÅf§@¶(ƒ”*r’h™\O@Šō¤sŠłå‚Ī+h-]‡o]’rIQxQxX”Šöć^ß>Ķ” )Šz ZŁ÷½mJÜM‚æ\˜]ģ?Ŗ~˜'Փ SŃ“xüI> øĀ«ææó”¤:EQ‘•åļ8Y‰0g»™3gŽŖŹ>”j¢ÓM§kęUĖÓ)¦)¤ƒвkö\C-ä{Eqe žwŗŁ Ūµ¢|‰Wgć>ß{šzyD`fN5eF"^=•Š‹óżü=æ9ļŅņ%ī£S©K–eża8'Ė4u»¼¼Āuwį~-싸Oé ¢})ąn IEND®B`‚apache-couchdb-1.6.0/src/fauxton/assets/img/loader.gif0000644000175000001440000001211112332105522022600 0ustar00djcusers00000000000000GIF89a Õ$~~~>>>āāāŠŠŠģģģīīīččč   †††’’’øøøJJJ ÜÜÜlllČČČŲŲŲVVVĪĪʚš°°°```,,,^^^®®®|||LLLØØØöööÄÄÄšššüüüśśśęęę’’’!’ NETSCAPE2.0!’ XMP DataXMP ’žżüūśłų÷öõōóņńšļīķģėźéčēęåäćāįąßŽŻÜŪŚŁŲ×ÖÕŌÓŅŃŠĻĪĶĢĖŹÉČĒĘÅÄĆĀĮĄæ¾½¼»ŗ¹ø·¶µ“³²±°Æ®­¬«Ŗ©Ø§¦„¤£¢” Ÿžœ›š™˜—–•”“’‘ŽŒ‹Š‰ˆ‡†…„ƒ‚€~}|{zyxwvutsrqponmlkjihgfedcba`_^]\[ZYXWVUTSRQPONMLKJIHGFEDCBA@?>=<;:9876543210/.-,+*)('&%$#"!  !ł $, ’@’pH$~ AqÉ$6:DĻhä)†šĢLĄV‡KTŠ””: ‰DrQXŒ×_RX$/Ī BxBnb}Eg$ƒ$orEgŒ^$oWDc$ JCg  oqmo „£±“E µ$ {p~ørÅĖD! ø}Å M¦dÆ®‡”ąĀK!ęēĻr!ģķ! ¬ńń‹‡…o÷"ņņ|õųųåčĢ©ĆĀ]»qæÄÓ$b 9Cėf‰€$§Ą=‡ĆŠ}“Cģ^u›-ūH.!‰…Ü»ņŻ'ƌ ÉOČK"1ćŗ²ä5.&{jķT)¢ĄBBoĘ eŲšØÄ6œ†<·”DÕB?±ø1 µ)ÆG»b K„ø !ł $, ’@’pH$v CqÉ$BÄA 0(zšĢ€V‡˜‘[_’”:ōŒFr1@@ÕŽįeÄųȉg Bk_oEg~…$ #rJDgxloWFC~mgoD!"" B „w!KĀ$ ¶"ØC¼øɶwE ¼ÓŹ¢d!ĢX ĖŅßčŲ!īļ!ģršļęŹ÷×ó÷ūü"źśż@Šs'ÆÜĄxM &T$¤ƒˆ|MBųūC«ŚŸŹ A¦ģƒBlŌD€č°Śµ‘KBVŃÖ?oFlŃ”ĆL[äJŠÅĪž6‰!Ł"ł 5\@ļŲ*ĄpŠoImJ¢ÖN!Q…Xmš•D×§ %2u:uH2\ĖR•#“a!ł $, ’@’pH$†ˆOqÉ$v@D (šL‘gV‡ˆ@[4x<†””:rńq†’Ö_’%°čȉg BxB oEg!w^$ r!ŽFgW…oWD cB ""˜„g!!oD##Ÿ$„"v JE i$n¶#E!»"~ȉL»Įd¶ ŁL "ØX#yrvøE —š—ėńš¤Ķ»ädĢųżĶĻōü‰xW/Ä<2ė²°IĆ&×ō1aK„üŃUJā(q„zż ·«€¾kQ™\¢€‹»*ĘtR ˆOī}C)ĀÉ7":IšsņdE& ” RŖ€"#„ž-Ōń©Œ=…L%ÕźÖÆQŸ2s:d+ qÅVµŖØęÓ !ł $, ’@’pH$‚<žPqÉ4?ČOQŠdvD"Ō#VŠj1$)…Ū.ITÄEBy˜Rˆ3\HuŠQBm{Oe $u! p!zB eRumTDC”"’W" ¦mD Ce"Øt’B] Æc“~†æaV“jUÆ U¦f{ †$‰†±L ‘摎{[HéĆĆøU#ńņ# ģ“Ó{šóń āäåܤØi‰98į\q·„ ¾*!䀦3« Ćn˜% —±L\£@éłŲ°€·ˆ÷ˆ¤2ŖT‡„* 9¦™}”tłIĒ*D9…xä6¤Ļ“ $F]l"±ØÅ!M¹!%1ÕØT,D¦*²FT×®pq !ł $, ’@’pH,ŠD ¢rILCĒPńĆ\vD…g”ń4ŖEØH*“I.ŽCóp¢v¶ĖĒ~,4ØwSGIr jm!gB GTrjTDˆŒG‹WH$Šj\ CG"v‹Bd¤a©"zw!µ ”V©“`¤®E |mÄmvĻL ŠŁŠÕ`ßą¹¹ŹLéź ä©»wčėé ŲŚŪ$įą¦KÜUå»b®ˆ‡¦- ńF;FŒ`pė_3G• qÄE69l”öaXšS¢©9°ń„Ė?X °‘!Ø+›$½“*-=ĢŅ„lĄFxB’ĪĀó  \€Få§3ŖÖ®·† ]!ł $, ’@’pH,ŠD ¢rILCĒPQŹTvD…g”ųuŖÓ­*¢’Čp‘p’Ķ…¶Zė‹Éß9÷˜| jE Gi~WeEy$##DŠ}R†"inlHB‘#CfC N ]‡E ¢›j®"ئ¢s·ŽL#”j†Nsz$ŹEŅÓĶg!ŁŚ$ Žß ĶdGå"ŻąŽāzäę"ŃŌŅÖz ŚöĻ\ĶųU!„j c2  ęÄ£ÄĄƒĢÓŖ\] &€ ĄZnVéTgČAĢ4šą”ˆF 2T$‚Č ūy`ęĒ•®2Fj°”ā‡Ä«k$>°XT‘.5X:)J¢Ó5,'RÅÓ¬€‡ tPuyz*R0|š!ł $, ’@’pH,ŠD ¢rI|ˆ”cØ8e*£ TJüˆ:Öāa4: £¢* ż ##F­.ŻEŁ!¤÷`xDdk\$Gn Ed‡i$ˆC$ Dd !S Gm}GI•BJ ­ ^ØE °ša½"jD °xĘÄK n§­x ‚$ŚEāć©x„č„$ķīÖēGóóģļķńnhōØäćęa@¤C÷ J·‚V@špI”hŅxššKE: ˜čaD\Ę $ŪÄńA!"•„Š„j1Ž“YB"ˆS"ĢĶADDƒ5d8Ÿųé52“›^Iü$ŹŁķ  ?”*aijŠ'T5U›*¤ĶG‡"N:J‹lÓ±#Ļ2aÕ-;apache-couchdb-1.6.0/src/fauxton/assets/img/fontcustom_fauxton.woff0000644000175000001440000001132012332105522025474 0ustar00djcusers00000000000000wOFFŠ ģFFTM“h/MOS/2 J`A9^‹cmap0BBōŠcvt tDgasp¬’’glyfĢ ½x)Cw`head0.6żė=hhea`$ńÅhmtxģDZž@locaxTTTY˜maxp€ uénameŒqśšĶūlpost¬¤›#¼“xŚc`d``ā“–Īˆē·łŹĄĶÄg\M@Š’012r9ĄŅ|! xŚc`d``<š’ƒ01202 P§ŗ)ø @.xŚc`ab`üĀĄŹĄĄčƘʥĄą„æ2H2“0001°q2Ą‚ɐęšĀpą#ĆGUĘ’0č1`p 3")Q``9° ZxŚ%‹Ė €@C_fmĄ£,ž¼Ś –a’•ųÜMä3S°"jŖƚ„nsńxÓĶMʦŲ8t7’wXĢKcē.c$ExŚc```f€`F°ņĮ| Ķ„@žGÕ’’$Ć’’üĢP• Œl 0&#`b@Œ Ćd§ŃD***Ręų,LrČä"f~¢¾N®ąģdŅ4BX”4ī84T¦ō x ¢ ¼xŚ}X}lēyŸūäńx¤ī‹')ńHŠ<ʖD‰äń(["Ļ^R»–=Ś‹’%iZŗX-ψæ€nõÜ-–“ŌŽ l± D[“.±³a@Ņduć°%’Rgżo’“Ą‚Y‚"q·” 2`ėöO|Üó)'ي‰ä{ĻūõÜó>æēyE¢Bž…KD2ūŚāM‘#Ö_ųwo² ’ä5–ótų¦(ĄĒ‹7Ž7Ō†ź6Ō’śēVWįšȍ'ĢąĀFÄS&)¢ā{“/˜…²W2aōdąć‹~?ļ‡_įO?=weģĢųł™ŌįĆČyņĄ™";Č鐃ä!²JHY“P¬ø·XńŌf«QO7&!s~˟£=S5ØøjŚŅQmł¬¹’Œé5;¬e“lD¹f³RÆ>Éäa›äLxļŅnFW™Ż—MS€/Ÿaź&Š®‡’9śōü{§źó§.Q° ˆkUū.õÖÜųxÖÕāHy=%p ŸO¤R‰<Æ+pAсq’©D] ŸÄī#)üŸG„LųĆ p‚"ĄÉ’x± ģØÉ1œ„8ūdDvYAõä”Į¼„zā ±\ßõł—z7nōČ {ųʍĆŖKuy īĄ&jU!D«§ ”XiZ¾+ŗā’h}żGĻüćßĻ|{’ l59zŒė[­.4¬4ņÓyąė-Æ9 „¢`“ Cq¬3sH”Ą‘cĖ3“·¼Ģqł™ƒ19ⱃ3yŽ=Ŗķ̌ķ.Œe¦^,ČĀ!åäŲhįö^v4„ģņO“«ö“Ż®źSv eĶ¢ÆßĘŲį©žĖ(ØčźQ äƒ{Æ_æ÷ƒØżŁ÷]æ~üuōĄ3²4ęĄ3¦HĻIxC(FaQĄHp›ŲÅxĄŽWĘ£ŅåŹ'ž±Ē‚o„91 |Āu÷hgĻžNõĖŻĪ^1š¾J[žaĀU†y(wyé«G~#ó|ļä^Ā‘Ż(óߢ­db‘©Ā+K`¤Qƒ¦Qł’čf«žž¼pöԟŸ:óŁöģ g:ķŖW©Õ*^µŚv[n­†ūɘ_uÜvŪuŖCߊē¶PŽÄ1,µ źO^ œkį“Aø¶›×Ā! ÷’ĮźLÅXų×ĒH’tŗfAmx:uSµµŠ»ÖŸźæū®_2čĆ󿚎|¾ßæv!|?²Ł›h³Ķ‘Ķ"ķ²Q ä65ŠķØ]æM-ī‘Ķß9€5’!2M½|’ĖC’+Ī25čšZ½Õ¬£EæTœÆłĮĀīł™¢-ˆ¼ŚZųµŽ‘Åy%ĮHł¹ŚŌ‰ååĖǼr9«Nذfī©ārĢŽŪŲQ]h—t§vęĆ·—éĀß*{euB³QuĀč55ā£TŌŻóŒPśé2VŗQļ0^³2ĆMĮ%ĻÆxĶō(.į÷{>ˆćßėvwā¢Qʤ®?õč£{•Ū ŽŲbæ•Õ“¬ūnL*ŒÆÜ l\)0©LÉpĻ}ń©GY6čv/¼9¦ģ)j¶®Ūd$Ū”zÕn¹IpżV³•b *­­zŅWiR2m¤C;]ļB£[(ā:œč€% üd6½hŸ”¤Ɏ?¦HéZ¶—É…„Ē/K6mßžŁ™ķåęr¹įśjiIy,nć>餽˜žĶå¦s½æŌmérü)]8ÜŚ­‰’$ÖtÅQ“+”¼¢!©÷Ÿ¦ōÓRRĀń9JĻEć“FČ ®’u­”·É i“ė¢{“.˜*§XQŁѧ"¦-JS4ņé™ ģ›ĘˆlŌ9v«n}’±™³½ęC oų{f{gįøßL»»wöx÷sGłÄö=}„—lČ®œ[Y97u8æŠuŖm„xĒžI0ńö¬>Žąźš\»ŚŖĢę¹ÖT«4ĆI±ńż<’n-›”{WÖz=gX’) Ž‚†×±ś”Č9»y{Ō”īm„q°éŅø :…ĢÕÕĘ÷KM•Ė/X{f­„é%Ž“Ļėŗęißw ł/å{Ó½ÅÕ«õW§¦Ź'¦ž³f÷ŠE¼ĀĖņszSÓ“W _pņłŽL ńjT×qĆ*Ą}°€&NßŻŚĄH»ŽŪļ:ŻĶ€ 6ai-¼•ōŲč ¬M61?a6ցļĀZųl ȀĪmēgä ¶”(ö˜0Ų¼øµuČÅMJ u”¢?DŖŌ£›-ߣ&›eššļšz’Ū4’¬hN|–ū&Ėńś^¼×.w§R:–d ÕL,÷»³ū”ŒÖ)³œb˜†Ā±ķĆSŻ2ĖŪ›gSK3Ź>Ģ'0ų ĘÓ5Œā<¢‘‹žµˆv˜¬`-J|7² FCå7~ht/z’fKÄab0IŲ¹d:—Žž0’>3N7-’¤\Ēqį wÉ:ō/Æh±Tl†K?Ųtœw“š–\£Å*VTŽóoĀY75f:A>=ö+ŸéŻ@'@dYCš²–Ōւį„#&8°DśęwącųĶ¢ŠS>ųĪx kųĘæ`ų”,­1"N°œ$ÜfE*ÄOQ†— ßČšģŽ8' ||‡i¾!P¶s.&°Ū58W+ R¦©ŗõ(x›†(Œ ų÷d®š<[ßõĄłóÆœĻ’ģÜż÷Ÿ[ѓn.yÖłś+ēĻ?øŠ(­|meåkŸ®ėˆ“D7ė Š“Õ=_jāėöww]~żņŅov ū_pģ*|óżž„Kż„K[æøBˆ0ŗn’cäłmņ8¹AžeCaLA4hC?sB %”4_t‹Ńżnž^ó*n³ā o¾é7±jo¶¼–ߊ.|ó-æŽj“óu įњKϧ-ś1Ņ&>Ģ“Yvż V-¾+`!£E ‘Ō·fĮ„ü1=ˆóIē…Q­łI°(ŗ_÷ē;œ/ ė‹i76!d€eA+¶s ‰¤Z2©LėäŚÅ1 8°žføŃ*.‘>ZÅšÉ7Z„L˜št-›­É'N6j»&j×FO56_Y“”02ŪāÅäø”&Ųht_MNĢeßL©Œ ąė!Ÿ[(ŒÅa8É ”ja!—lj„<£¦’*Ėß]ØJæt”jr”V?UÆåvœ«Ér ^ŒV˜“š²ĄHsQUYqū Ć%Tc\‰Å_Å3äõvšXĖżÖŚ*śß0 ų)ńbÉĆ*Čk°ĒlųzxنõÕLx ~7•ć½Zo•6„śĶśŻ;č7ˆ¾3džxdf‹3i]C½z74; ½÷7h]Š®m6šBVƒėÄÓķ¼Ž®nbĶ”gŹĘ“}éM[ś]ŁTōĄqśA€-8·• `åe”ģT»ŠDxh@·æżEłqsÜ«(#½yˆ—j"EøH.„} !‹õhäMDw!t?ōsōžHL8øå¶EĻ-Śķ(UZbff”Ҭą·’üōōē㚲„hŻvuǾt¹Ńµk%cŁė6Źé};°Ź€n7‹—ڼuO«u:ŹĘE÷ž0śŹY&_Ę£’ öZ~•Cƒ«åw(4b4 =—żŌZæüx;€»G˜ä¢3|§ā‰~uz2Ī)zb֚8}\6c…T²¹|m£Ś[•ҁĖ%\—™ŽUĘÓŁxm äżō| 'ˆ1~CŃækīŪé¶ķ²®Ģe«9).Œ 9®qå,{Ą źį/ŚīĪ}f¹xhæŒĖѦ°Ų岍:ńT\L8VÕĖ‘6("‚`t£ÖQC«[¢Ł€’4sŁ;‰©ńDØw•ĘŒŽżšCmHÜQ2„DhēJ»ŠBo%ā¹żæzū£—źØ$Āl°śģ³Ūßźńēž;žķ!Mžcū”¾xŚ„ĶJ1…O¦?(ˆHwB]ŌE§étQģ¶ŅU]ŗpSś“i‡Ņ¦Ģdhū⋸óMÄWš%Ü{fDtBræ{ęÜÜ\§x‚Ąį»Įƒc Ž{(‹ ĒŌÅŽqńģø„3Ļs\FÅ»¦S™ŻēU TńāŲƉ8r\Ąøt\DU<:.AŠWĒeT½stCc Ės‰ ö<H™Kōa0Å[F“’ß"¢wAźQY“³cžūųPŒ5:,×4øBē ?½>f>UMż čĘzlõLNörjŁ7Óå֘™ÜFv!{fm{&žkųJÖÖn:FH5ĢT? żµ¶¼å£Ń”$Œ+ŒØŽ™ļņ|Mė¦ibĶjŽÓ5Ōnół#ŚVLō,J±Ćż›ng€:ŚÜk›hńź/uä÷7Q źķz š­Ģ5ä£c–Dī1*€ŸĒl uœDģ¦TÓWJÉæ÷z¾Ī‘exŚ]Ķ9RBaį×ĻÅTÅ”"c~Å%tć.$fŽĻ›©…9IWMņUuµÜ÷WÕū Õ’M–oMĶ «¬±Nƒ 6Ł¢É6;“Ųe}hÓį#ŽéŅć„>§œ1ąœ .¹bȈkn7>?óL§6¶Ų[{ggöŽ>ŲGūdŸķ‹}µoöŻĪ’żčG?śŃ~ō£żčG?śŃ~ō£_ō‹~Ń/śEæĢ~5-Xä’’xŚc```d‚3¶‹Īƒč³?®&ĄhUėpapache-couchdb-1.6.0/src/fauxton/assets/img/fontawesome-webfont.eot0000755000175000001440000011103512332105522025355 0ustar00djcusers00000000000000’7‘LPB5fŠFontAwesomeRegular$Version 3.2.0 2013&FontAwesome RegularBSGPŌ‘/‘3{źĶéŒĻŅY£D MåFx™ ¤>°›ŽŽʏ)[1ɵHŃķ¦‰-A)FąÕٜ1ĪĶ.Ó/ dŗU'ė&a /‚ž³s%į%„<ŻŌ® ¾€­ÜO%pļVł "˜Ūu¦Kupp^c˜RB`\÷}TیW œÅÖĮĖ ‹ żŃ£ĒzŅ®5*’ݱLzSq>Š×?­øTō†35(„œ}ž­æŽāœįنaKPŌ'¢ŌšģŽŽ2Ė45Ū$[GVzi„ę<—QAī2#+Ø£%a^źV Pü Ü=öG š,·æ‹āö'ܧ×Įģ *ܰ¢¢Čń”S„kÄū6>Œ\öæ²‡ģ:šł^ CĄ»=P O*¦õ-<€‚ @a(0‘•LšĻ ›"žgmL%ŸĘŖiC…̼„ų“‰a’A^É舱žś– h–Q% ./Œ"}„ŠžŅ‚č»JŸĄDĶpb('0E1ÆŻÕē¢ hQšōśQŠJŸī Śą ŖDp7Hk‚„3L4K«4dĪČ S²*¢?į€źe [!•ģ=8Šg¤ŽF"bTÓÅį*¹?ØG.W“Ą0āQēĮ'š^xn©?²[Ÿ ä(ż›"““wšZšhMz"°zõ“hŽ,jē°Ī÷D° ö‰„&%X Ę5²š«ōg„"‚`hńԚl Ć78ŖK'ļ³ēńmƼÓF“±ˆļŲ€œÕ’Äł{b|ŌŪœ³™„-4H”fšP[»ĖŃ1<æ̈́+š-w˜ÄE ¢:hĒKŒuOTRT;Õ)/‚- ā9˜L2 ŠĀ%3LU®2ń†Õ8ߣY€% ­)Gˆ–ŖÕ¤5 uĶĆŖśĄÅĒŲĖĒĖ:AbĄ65W{‘”D“!dåNóĒ£zśKĒõE°Å<½U³EēqUžä*5Z-Š„}Sq¦*ŗŠ(Yéõ!`‘;0.ŖAGCF|Į¹yö)5.£ć@²C€Ł4XGZ`-ņ¤Ė.a6ŠĆ ˆŅøžšā•.øm|>d‹;-xP«²KL›H «*KG—Ä%EF9B͆HŅi•0zÖuŠ1Tpß`FöU ֏”›cc+UŸ²ø³^µĄśóĆĘ4x®¶(ųŚF4xˆŲģXݽŒš‰·‡z(R6LļV£?ˆS÷G‚Łcą"W/B]ŽŽO€5Į!Ļ.ĮŠžÆu»_wĪ„±Q€C\UĶ`ŽŁv=¶£Mš­HźÆSײ7]\bB£Ųö-—Aćj]¢zxW Wp_5MQŗTw"‰A‡äqž[Mތœ<§łcō؁“vÆC›żG¬&aYG°ŠĀŃ%ód2Ÿ‚$¶ttB&ŃDĮĮė{‹0RPu›ŒŻ¹¹0¤?,ŌÜŲjż³:ŽQ ķQ˜"•§0·ę 87Fą‰©„żŒæŠńAœÆŃćŗ]ž¤˜Hƒ‡PØī<Ó!ŃoĖnøų'|§ķ3rŽKŹå>]Ē.R”Ó”šn¾ (ćłZw)„夶¼ļ™up[2•b›gć¾8Ż@W)Źækģ’«Yœ8åŒL›<'s†i½³BB DžæÜÅå(OC0PO©tŽt‚¢Ęå6ĀØ/6oƍāM˜ˆ²ĻEÓhĪ.Ģ ‘łä7M­I$t£łØ–čŅōüĘŠUæf¢! œ96H"rą‰6ĒA8ʉEĪ"Q)æf”RJJhģ$Ǧö9[VfĘ%c£xPƒqDPœĶ$艨“,øµvœŽUäIūm5Xؤ”L‡øäšj$q51§hhŖ«'ŽŪ žõ .L‰©®ļ Žœ Lš¹¤ąŠ€Ó®ŻbƑˆŲ·%UFŃUtä„\¦şB] Sƾbõ[­›‚3Ÿf€uĄ¦{ĆŲéćS6õ>÷š³%nEqŽ˜`{1Õy*„éØVJT(B+ń†iæ0(/å$„¼šŁˆ;¤¶*aR)öśIą…œ:Raõ3ŁŽģŻö{øąosCØÕŠhįįßąŅ"KĶ•£ė©AG‘Ōä<ų^a2”™PK”’—¤¹Hy˜ė3ƒNźyŽG°F„ØFŻ) »L–­o‹›7[:£’ą T*ĀB”I‹a’ ŪńĆ ·x‹«eÖU,¦ ėҵĮ›–ō’SG7„ƕĪqo99ŹH+ß,W½üeÓNe{ˆ¹›/#/( ,w{Ł P»zAt‹3ģÄhfš„'VRŌęõ# ŲÓ»żrėæ¾²Fīųf™ŚO[r¦±IÉė'"į÷Į-:?ŸĖ$€d@‰Ŗ£±š©¤ƒõ¾4t_‹I& ŒAµB…Ä“²›$šqb{FÉ Ī$¹ƒĆ ™äÜā˜Š"”æĻ‚)ĢŁśfĢ68AŪ å5Lt|›1ŠTqˆ„ŅÓx|“ “dZI¶øŃZ“›ĖĖ÷O‰ź(}ÕĶ™DżLĒȹbä¢A2Fd’ Ł=ć“Gb4eD źóC"ū#'ĮcǁąˆKj}}” 1x&”µ$±©*<›“20ĪŠb_e@Īź•‚ j śo¶œ#•¤)œ…Ļ“Yi2uõć¾vł°{@$ˆ÷A9zUė:©Ī-k"HŽk‚GiŃAš[=Æ"D\d‰‚j“Ļ}rž!†× ŌUߛ~e…ƒµ“ƒ¦ó:‚ +G›Qlā'Z‹gĒg‚W%Gn¤Į%śŒiß,ˆ•’‚µˆZ<ńe™åy4‡į °1č|—ĮŖŽ`®*Ó%—v%ōƒć”ĆL+¶t¤³ń|9­'ŁZ9Ō¹­+ūŸ„¢uŃĀwØ«ā”Šģ†¹TVĮ>ō.ŒTųķĖ0U+S>T³JƒĄ|ūQTi¹čLŲeD-A)¬p˜%łF?õELb» ›Ÿ¦˜'ĶŽHÆäŻHMāėŁ¾5E%2£žÓiUOhx#ĆĄr.öń‰rƒl æ)5™•”-‰C.(,oē8œ'Ł­q&¶ |€ćŅ7×Q’øę oM+£‰}šQ„.ż†ŠėN—Wއ¬ń33:½ ;=–Žw€ĪD÷_ ŚjœĄĒezO!fF’Ó²ßNšśqQż”āÄ=8ö"ŹY—ßsą1]Ü#Ž;’®Į+"ŪHŽZĶ„öy†„äFD˜€¹s}&Ķ^BāŠ.4§Ī9ŹŹ`±äÄ£ĶŪž'釾“ŗ·ZŽb»0­ÕJw0ŠvT…RW&xŪ²ÅMŻAಈ•€Ņ7¬ķt=CFé$mĮĖ„fjævB¦Š¢ņń5lĻu Œ®I£“70<%õh^Ž”~ܝ"_S©Ž&!‹śżøź"ŌĪ;1pjŃdÆ,*`›¢Ņ «€˜¢zÆ_!oh‘’»įŠėH(rz”}v:c%³’—€]x*•†bb™ƒČļ·ūXį|Š9(®-æ(ž"͊»—Lyöϳ{"1P»Ė’Z&ŌBā¦Ā€ßxPS ŽÕ¤YuJ„ĄČ Øeœ98GULœcKP‘4IČĘQƒļ†|ŸĢą›ƒj·õé%”H<"`›2ZQuU›1ˆT‹Wv ³Q,żp[÷ ¾õ@–ŽĀ āĮ fÖ¤Ū®£E×ҳzfDµ2ŖÅ%Ę+T‡įcż)ÉģņFĀ9v"bœ†cõ>§F*žšęŽgqR+Ձę€9^NPž¶ĮbߎA÷¬nĶhŒˆ¢įöčłZT™÷Ģ¢)L!X2ŸNU¶ČŠ ² Ē=„J¶¼’+ģPa—ʬį3·ZĶ ©›|Fm-õĒ+}¾’¶ĀxP öA 0łĀœū,JÓŖ”mPNb¤ ;XįSęV]eS”āėĪ«Ó2)l`3ļ~½ ®]÷š#/»Ņ•ŻZń{=dœĶCR܂Z&fƒšć“l>e¶‚¦Žę«3a Ā~‘`r‡ ņIĒ“€»PšNCū`šä\ļŃÖĢQšÉXAH$ķŒĪųšŠ-;Ź€„ƍDm靦 š-é›~2{ńe.Œ^{sŲLĖ—ńŻzŻ„[柣r$ĮČ[Š3%儕Ģ*fŒZĮg§t,Hź9NŒ„M‰ĒO iR?GŽ QĘŃü“tĆļš:–殾öÜ@Ÿ­©•03¦ųå®P¤PõXĆŸC‚t“±\ROžVźćŠ-5pg™2{QŹ»o'Śa_Š äf?‚Mėļwp”œ<ų˜w7Ō¬-XTaų‡÷RY=‘au»*fļq(‚qź(T-]ĪŃŗг ÜɐžoĢ#ė<ĪrĮĄĘ0ŗ# |z³÷Pł?/WަžVdś7¼Ń–æv„“ćv椓OXk›³ Šųł“‚Ęń2ś:ßŒąšø0N:N8 šŚ·½Ś=/ž2-b‹pƒCāŠŪžĖmļ³^…N"s›k §Æ+Ö .žŗ¬ƒ5€ÅäÕ:ŒFÅ~Z²ļņ‰‰ĶÅ(›` + %ŖÖöP_\d5ņ®øq‰K‡<Ńdjį飁Éʬ%LÖUdF’dĢ?Õ9nm«žŹöŃ,Ķ(^ōCÕ-½G6ß³“†€-¦ ³¶éOOæ;‡;¶Ś=”dœåisĻ% ģƒ?°2ĻO\Ų’Ø”:6åź­mź“ęxnŒ8D$bƒä©pD!uŠŃ‡ŁvIšģĄz™įj&›žŻZµ³į°@KÆŃ£&‚n ƒdÓ;č+™7²¤ųi`Ql±šį£NA†‚!|ō RŸŸ†Ż+AGƒż’ˆO’[䏠žc×@-¬Ršź΁’D– óæ«źBՈ*H ’væ?ėŚväNģ‘Ą"„„’6N&Žų4G é9PHž@ ØH69µą0°ä«-]«²7Q˜Fp±ńlļBĒ ĢHŃ q^j)ŗ¬$oŒĻĖŃ5%H^ĀY…P™čSš6‰"EåŅיūĀnūÓœ“=-±Ąō³Šąõ’åv Eö²Ž+Ē«0W¢o¬¢eč5+4©Qyß ąÅąĘž“ņ֜M)§w¦TҁVčM÷XRøP†DwŸĻBŁRŖź{ÆP‘|ŽęŁÖˆß|»DV'Ä¢Öf¢ß…õ œ³øŚĄuIńm¼tȋ|ŻVkŘ'm/ü#·–€€ƒ\!aÖ{s@Žż5‰Dˆž€C «ėkv„y ĆnLķ¤Õ÷!¼;ŠŚĄĪĢčӎ· eD=Ż¢<+Aˆ Ąõü+?9ą|#ł!Ś‚œ77ˆi&P,T*Ó„Ļ’9 fŒ¤ē_ ‚"gŖ–‘Īc5‡yˆdGż‰{¶ÅZūˆx,«m?#Ķd¬>x dŲ·Ń ĪœżsŪ¦UēŃć+6^v¦Ģž›Œ“®IV>̲w”ŽGśŠ>Ź4€öKćH\ģ ńr{­Ā”]SÓū śŃZ‚¢£hĆq^¢ƒ <®ÖŹćE#"I/C“ļš®¬–gvśŌśĖIy Š=FĄrŌ厎’–^©ĻL–¦`·¶W¤4ņL’d⌠£a/¾‰öŻ;č'f,9̤]„N?.^d|ŒK‚6ƐŃĘz§8>‰gƒ›Ó\䯽Į÷ފ@¤#sOŹböTŅ“śՕ «›rB”‰@ %ĒXB›ÜG{ŃÜÅh.c*µIŽæābÓT„ķ‚/ŪQR­‹J’É-=Š _Š*q}Å”8Ō/³"’¢]ķÅ£eFõń8b¢9Éé¶¾źŖ%+d)Rį÷ļםō»Ń@‡”»:Mœ~!hF¹™B ‘¤Ø`’ ­ÅŠj<^•T‚^¾ßĄcl¢w+µX;‚įršĻRŸ*–¦Zæ°ŃĘž¢ī½jĖTÕ5L;(˜²Ł[į')¤¼ń–¦”3ØKa+„°@.–^°?Sm#ķå=c|ˆaƈŪ5žøkR‡CAæź%¦œåļh”–Üfyī­Y}ń ÷“ƒƒ‰h»ē\…ĖfŒa­ķŠąs™ļ…Ć—(N~Ęėėŗ6,ir‰¦‡čÓĀŲ«_ķˆŌz?`(Ķłm %ķɉ|Rņ"Åc±Š@żé} py’øž†«Ą`SAv'PŽūG ģśĒė’aŖ&,o’^<gj B£¹@üALų»³Ś£‹Žu=līčör»ń½…š×ĀjŠyŅ#R_ [¤*”h€$ó vĮH79öŹ k2U«+4°W`ŖDÉ—¬PF¹ęØeEt+ÅļMüŠdBp¾–ʼįŻČ+ D(†ł@Ū—­F”ƒ¦Z1BØiˆūKϵ„Ŗ8.”‡Šrx²ĀB0‡„ŹØØ^nx—Ü\'٘>VŠDϼ܁†mP·ĀӀ(x9ŁŒ¶Śęe{Ü ®L[ĀīE[n’_F×c— ƒXQ68j-—wkvsl¢[±yģl°¬.„źói N²4!h‰Wy÷\F÷Mb6²œ„ÕOl(X=mW×C±v8ž­£½)Ü\#3ÖŽĖČLŃ,TGĈ{GŸÓ…B2īœFSsLR2Q|£Ņ="*R~õņäĘ®ŒSā˜Ąo”żPe79E8ĖŁõZ„ń÷²µ ÕD¹`':ōļH©ćN”R}š§/°čʐ±ō(؝ø«Š%Fhr™bR½Œ£½˜ÉAź[6 ÓĖęµŗp°Ģp×B"Š”źDlޱęSāĄjAń:©ECUl.Tš›ŒzŁbA2рKMH̾šÉTĖ {5hØ[2¬`¢ń}­†œUx łŠ'晣/~šÕEĄŒM‡{^,ƒyJŹģśźX© u –i4ļdŚó;}h,ƒ’ĘņłŪ\m$v£Źū½ /y—““’¾Q čķ'X%¤¾‘,© ĘŁŲĶ䡟ŌZb3ĀŖ””É;ā@S}Ņ RIĶ6ĮN£guc瀹#”üU @Ži&²Ø2’P@‚ž8‰Ö¾u'b/Ч"NŹĖYÜĖąźķŌPOÜ6k³6iCÆNæ!†HĒ"’AĶ`Ėä‡>@q˜N”ō# “£¢ä@hāŠ((eĻ÷J7„>†iØ_<ĀIø³Ayńš|ÉŸ­öĀŁ ūsŚ{ ŃßĪdȅś »©“CŻ“Ųpę "“\‘9B–±ŗņL@MķŸŚśQhjŽœœŗxŽÉžaŁ½bŌhÆZŅ 09}ūŁq’n«<× ‹±ö+÷¼Æ5ŅÓK&h˲Tū–*zż:Ÿ%’[44b›`Ȭ×ļ&ŗ•Ć&½TSvžĘšč`7²£žčPrWüyž4\čéEĢEĢ•¢Ŗwu#DZć0Cp\ģĮšŒĪF„ģšccĻŖvĆ̚/¬LkY ŅœJv~ź‰ĖlP‡ŸFbV[Lu>!aī¾µf㗀īäš:¹Ł«Ą¼¢ĶŻ,"Āp‘Żń ü¤e©:Ūł‚l·šóœ¤ÉÅ @±£Ž¢āŹqkS€N”¦S…  b{s<lĢŅ?ÓĢt ÕēW³×ēLĄX'Üvµ<¼Čš¦–,¤‰ØFY¼/eŁē—Mz²0†™å+ԚžÜéy꜊³©Bųž 0‹x]ÅjeÆ]R\čįś`ÅuöŠ.E­§©. ʻ릙”B<›¼6¾Įź–råj ŚĆ‡9Į߃āŠ‹ĶBf-ģ,Q…Ļ‘N¶#Š/•ÅĆšžMČ" q«ÓA@2X~ĻD0į]C“°­ż[iĒpr Å@aTŠUt©©BŸĻ÷oŻ•Ņœ]©mžŲA«#ÖO‡Ā(æ®JŒiԌ¬6v[{„q®yŽČX‘šR6Tķ±įvƒ(‡ˆr‹­sŒč5Īs<āŲ>ؤ敦$Ē,·mR¢Fž#:ĘlBD`…H9PUōī›ÜȂH4ŖįĘ@’˜· €ˆō·!4ņ6õž5ĒDc>Ų>˱:½A0a¶0īŒÄÉ@Ō³Ų«öƒ¢qėf²“Į[ęzÖŁ_<¤®~Ą¦qśŒÜbV‡ł!k29ň¼ÕŒ¶ĄB=Nŗ“ŗÕ’'¶*ĒW÷³€ōœŅš݉ø~‹Hx8Ź˜Źž TұčGFözh[õo5,¶-¾ĆŻX_ƒdʆK@U€•łĒOøY“c` Ō¶49J©=‡æP_Ģź8tānRē÷‹”E’!Ē5>ÓDŠ ”.ļŽÅ/QźÆķÕŠ”ŽŅØ1ˆĪ¬`n³ŻĢ[4N}¾æŻÆ7}.śµüpN¬°Čź ,nå±{µ“rø©R Taذ±«ūüřœ^<¹čh ×vˆ!ī}Ūæ ©÷CEŽĖACéJ¶Žl¼Ķ$Ś„ŗ© eü˜Ę½’8ƒĮœ‘W ‹Uš(ķ£¤5„,“9ĢÖd„8-Ł!Kjéō(˜³+ TXv¶š6F§—“eNĀL2ŽLģf) Æ„†‰fŖ ž…‡-Ž3‰a,Ó¤L¼š‡ ŁXh b^’øäUB› äPā#IF[c˜K”å­ä(~Ģļ"!H”UUrX„Fe‰Ā%Æ.Øū„‹]LDDę;–PĪĄh d4f»XrQqzpzŸ0(#+bvt‰ ‘p¾oź×ģ̚8lœ£ō@ܙ”G¤\]™œ‰¬Ā”{AÕOĢ’¦?N$•~†; .ĪqY“U[Sčå <•N6wgĶMކ¢OjM–QXó‰cmg:‰G‘‚g˜ …“Žæāųį…³‘a©Æ]ø“1č "Ą|btŪč³Ļź”1C<·ą²@Š3Äōp|ß,†„ŸšÅb (åäĒÕ½0 NGFĘ3 RqšŒL“Ō¦¶BVąˆHk i+F8[}3l&iC¾“Ģ£ø ©D”TNž”ėåņ„+‘ŽX $ńõFŒžD?¬„ŲČz r©8Iģ]źu*<ą@ˆBmrĢĀm¶«ŌåȆžkLE‚i䌦{« ‘4OJ Hį¬Kp Ä\€a’h8S§F#Dy*ß!]Šoä¾CÄ|O:8Ž£nÅēńXĄGą!r"¦“Œ†yŹ'“ŠūÉżVy#bŃ5*ći&( ĮĀ6lB§ ĮdT H@/e'äfĪ×`šFKҹČ(OķĒ’‚CžŽ‰Į˜¦$„å/Ō1v|Bxß8ĻMDō÷Įݲ)› Żfč åѹēe“RŠĻšqd“.Čä(@· \C¼ŠOTčłdĖ*ąāµ)“ ŠH*€ Õɚ sN·,Qšj)ķ“™Īz»ęĶ °'‹ņ”lB Æ£ĶzŅ&"žåÉųR čo×4¾!y;BBJūŖ—O] Āš7`цŽ+t9=7°“ŒõŁ92“ržRDĆīü|\¤€o,}±‡!ī8š®õ V4¬ē¤${ųŹ ÅHRX«Aˆƒ&Y¤Ņ±І8‡ , Æā‹Z¢sńl!ŅVĄ-…[³vĖAmü9ĢeĆUĒEMķ­H“Fų‡£€E)µY‹_‹b&_“£ńfbȏ“‘]ȍ1w_ ÕžÓ ÖĆ]1%Ԙ»|)˜«_)‹H.+ų˜„2Ē\{¤?‹7I§åč›$*āM€šāÅõõÜPe“‡…mšT*¶ņ$× ^Ą"~¬›ķŖ[ō,†©ó‹Č3OŁr4€ŅŖBC“÷±EĶB ūŃс%a‘¤aČ+Tø–½‚L 0f(#–"k„”†É_°]µŻµ%PAų•yŠŹ›$YŌ M#ąLä Ź»¾=H„©­ąź”œˆ. ņųŖöL ŠdŖ0¹ęą(ĆŹčd}ĮŌ sżnjҰizS«`j©Ę›mßĢvĻŗ/5>*ĢM£Ģ|ĘŠ"*¶VigĄAś’ üFL ė4”ĪäÓ$-į­„æø­¢M—lśÓĒģ6ē >ŽŽć)“¼Ę}fq_WD! ¦eÖšžo’(Hƒ¼Ģ2ńų?/H=Ø?¢*qõ¾qU½h6µ°oØ}Ķ k-Õe0 $/~»F”BsĻ ¶:˜żŲä“…źcE§v”ń³FsH”%ši˜·n„ž”e‚\‰å5ė<žķbŹę=¹£f>Ė PCE„y®’d,K *3Ō Īæ“Ø3ą ˆšØ¾ķŃ ūžį…’¼Ł„Ć*„Fœ”µ5bk„€e–įVøąÄ]UOˆÄšu޶bd`G†s{ņKUOĒPįśŻ†gQH@½e*FŁÄ©/j’Æsš¹ĢW°‘ķ ‹]—Qi ’’“ŁĢyÜåqÉ@J‹Ž¤Sœˆæķ­ŗX¹ˆUƒ)ģ…r& U}ѓ5‡ ²/꼃M?¾Fo_So(qNšV&,±0Å„Cɏ,ėō\š€ŅLŲ￯5¹ˆ^Čæ ß#4JoģcÓŌ¬öXųĢmTˆ„LŖˆ4Mœ&‹s ūaók’#-ØPXD, ?šś–pVž0¤Ž2i nč·ō)nCwDķ¹1¾BȲ¾)xgŚóń©kź–ć†1‰ū>¢WF{Piü“›Æ‚1„Uä ;†w,ė5žæÄū„—§NtŸĶ3/ĻŽÅ¢ ©\KĀvpr˜Ō’ĄĻ qåśń'‘‰Ž#±†9T¾Hr6^ņ™d$E|cķlĒTęCH{÷' *Ż ;±Ōōóe<>¾4õnóÅUźo~ųq®Ī1‘GāM6QjÕJøQŁT}FS𯮺łé«»@ę®jfM—Æų‹-’ü37qõUµm“ŃķHĢń‘Y<€UĘššį¬ģZZ@üt8,ÉŻ–yĢ$Ū]­¢!Ó«.Q·‚ęoÕńČ<›eāĄDŗ‰ÄĮT(^6µĻĪ Ī­øŽ3¬8µøĘ„!æ†?ć C§a…ŅFjq7Vš"ņ#[V0&™Ź_Äגż?ż¼ńØĄżģqˆYķ¹[ÅƕĖ>Z}©‹*"'D’{üc°  Ķ Zé£3·Į wĢ īģōā1)_o⬲Łä\šĒšĆQ,F‡ k… ži¶0Š Į”įļ“℆²-¶aŸņņÕ‰Ōæš$hJ^H×UyhīĆŁ'¾’7KÓČ7 bē3ŒćtõŽ*iÄ­Q¤giŗeI±„(t%aąį%R„Ā©¢8ß3GTUžŖ·z$ąMŗé*~‘…Ę€J–ŃŲµn–u˜ B”4čγRŅ-:‹;qĢÖ½Ńą™(™Š;ĻQĘ)Ō“1EF÷ĖÓv:T~ļż×œŽziŠ¶4*оT‰\ā˜<žĪĶĖó韓©5ļ¶Ē…ŠŃ!e¾f¾ƒO/wŒž©)’Ź9EÄ˱üyFęģĄtį /t>^G^,°U ĘœŁ‹i!sNvSš$ü!ņčŌF¼qÄÄoB2¤‘ œŻ`O÷če‘āę@5֑Ær;[UŖ­Ŗ ­.|"?Ī!Ķ€åŅ’j@=1R󔊹k©k||źü½{Ō%-ŗ®Ē=öĀ'§qų¢b†¶ Éš‰ 6Ā›š¬ļ€ ņtnK]{ˆ3H³ćźBĶ ą¹ÜŹv,n‚)ˆCŠę«ő]|–TQH‰„<£GÉMx4]b  ŠPčć|'ųģ± *‡ŲĻ!ó¶+qwÜtž™Äōn€Ļ‰!%|O;„Ž6ŲIÕiMłŅ›Ś(½ÜŲdVĮe»0B߯fé\N„¼ć€ƒ|ćŚb¤_ƒŌK1œLÄĻć¾T%Ÿ’–éYĀ0rČExģĄ×©Šy®ˆLĄcŗ\Y°q½³PLŲś5$|A}½ń@ÉŁtø-’{Õ}lÓčį“ fŽ~möKØ“¦¦Kƒ”žżėڽhū>‡G~^ +‹±ŃqcEyī'ŪƒÆ›OC0÷«ĪÕCÉ1"嵦4Oė-µŸÜˆ|ˆ’SĆ8cŪZž<=Ē äķ•ķņM4¦t?ó¶]Ė“ŗ9 ž+J3¼Cd ¦-ęd¼®X!Ź!ˆøZVRŅg ų¤å‘’Å›¬‹̲¬\8Ś^ņł!Õ#Į®xŚi ¶»_ČDʙ.ˆ:‹DŖŠ3‘‹ĮdVÜmw»ZlįµÓŸ¹yB|t±ŽR†›Aķ31>Ū$”UĪl†6ķ@;ŠįŁ_«ä4tA!²3ē|éõČ+p[äA¾…kī˜ÖęXA¢ĀkOFšt¦Ünæ”ķpP(Ęņˆ6Ų•Ō"ž²Øč7/„1Ø)A¶@VĄ !1ų( •C@šŖ či.**ÄPXC'‚ ^GT<įśe“c—ćMB)ŪR…ČÕČČØ¼Ż¶¾=š»‹¤ŽźQń”_’*]‰ÆW%ēC}÷œ÷Ž3V> ń‡ĪO\/ńńģ{§7,YžoÓÓ|²CĒs xš ˜!qF š×²‚ņ·ęć`Ź>Ā֘F=Ś"łžgĖ^<ŗ‰rćU,dʼ1”µQ{!ŒXX@“<’Dß-qŹ@7“āčźų}é#£‡*ÄvŽzżp³wъtļ÷™BočdĄ›öÅŽšĮ z.­ī U1āĄ÷ÄT QJä×ČXy勂zõ/6×!҇]8SŖ²rv=‚§ŃSČĖʱ^©É5ŲŻH%M©×#p`E² Ng[Ē™$j…ߝUבK½˜>ęŘä:ŌWō¢P*ŸņĪBM›BÉÆżĆ+6șDži’—RżŲgyürĻ%/^Mą¦UŻĄć{U%bØ ŽŽĮ(źŠŅbÜ9b/eŚ(h”ƒ÷|kBnĮ¹ ÄĄFVKŸ_ā#(± Jƒ)™ųšgK«Ą¤+žģC „(P‰—*“nŽ4ņŠ@²ū,ŪNkg€µTŪŹśxXc•6g/9¬XO,xčüå™q+ŅdaSL§ä“ÄŁ.9øóĆ؈ųĻlø¹9­éź× {żeT£ņŠ1Ų†¾GŖ†Gض‘ü)ĶxaG#Ö\ÆĮóN$ĒęšvŲ`KŒöįt|ŚNU3ÕÖkJ|Zq9z1!'Å"łd}柏 ¬ ĄøyuJÉż¤YygF/F·[ėÄr¬š],O'­ćct4÷›̔œw¢ 6¾cHģ³’`&{SPeŹÖ–łmŁ'/j7Ļķ4‹Gāśˆ¤j|>Ģ©( EAÜõśf>b‘„ŃKu rn· ·Ļbšcæ;įgKC;8irA1“/ųß j€¾}²yI@čT|ĖdPŌ8Ļ„™Ał=å)€<Ćo *`|f\śQdzéÆš‘-ųŽOCŠĄĘÓŚÆ§bŲžĻp²ūēfŹŪ\وŹóźr+™I±;9•O½D-#³!døąq\²`1ƶ$Ėń2ał‡±šYķSéģĢ-ƒ} ųūŻLq¤†A-Ü9äIRņĀGn†ź„#”D#QM7—Ér\"k6Ź ';+[±©]„wż3IK$½«Ž¹Xšš·k¤‰Ū-—H7 Ą¾ +>%'ūėn! kŅ`X=ĮeĀmź^0»ՌiÓ-€ŁąGAēM‡ųĆ|į3X¼pm•ŗĘEP̬3¢0·VÜ^Oń߁ō,¦ĶBQć<čI°@sÉ2sÄ‹›¢ÅīšMQzݐ&[|IÆA’z(Ņ mIo†ķ¹@F‡tęµ;č5< , “ŲvR?›@?}ųßeR†Å³ć­®Ī(hÓĮ4…oÆĄōwžžMyKjŪ¶:: ņĢAĮ.ÆńšvqׄĻ2$ŗŻø¬Pė—C‡ņųĄšŻ”Kn¾sGīĮ36·N GĒхųOʒJVī9†żAß؊†ĘŚ'"œ§•ŪLüV†Ŗ×Ę÷Dąž±ĒtGyŁyź#BųXDĻ?‘fŖD,Żń–J×¹Œ^+ž4č’Ė °7„J‹nż?V99~:?׆(¾"’ täõ‹cfIb ųʑ’>¶’EyÅö?ˆL §śó `rļÕ&ĘŽø†ŸšāTżķ Ę00ā!Šćk‚‰wgTžå/u¹Ą<’iJķ{ąŌx“7¬jė#tĶ*&ŽI kēA”IMūšÕÄk?“Ņ `ŽŹ»Øą‚a~)Ķģø@¤‘hÜ+v˜µ„˜OT8‡›Ž Å&…g£¦dv$æoøĀØ(F¾ŁpŁŠēQĖ]§žģ»€^4šQ•TP::4A¤yļO×¶ńčŠWóŽ“?K¢ƽ'īK¾Oy©˜sŗ’HÓXżą@ė~óJ ,³C©­“=ż.8’¢:d„žąŽ£a/ō°B’ٰ<äo ĻćŅ›cąš~‡ībĒå‰0E„ §»jßÄĢįvT|äé†É”č“vÆ®Iōœ¹¼ŗ_ŠōéĻ‹zPØH–l"ŽŪ§‰W"ój?žš» ĄAF tŠĀń‘Žb:¬‘ "ŠäÜ 'ĮŪ]`oäčsę™Å¤. egŠ3,©©(Óč°pUR%D¤Œ5qIŻ£)PšÄLAdRdŒto=k“Bų7·lō¹³į¦c=jÓüiObēcŻ•8$–ŅNeHS“‘}Łļm„tŁi >'č “FžŅō—‡§Gł'n2ÓÉJ¦ķ 3L-%O• 1‰Lūv‹Ž‡L“µˆęo ń-ŠČ©DZ_-˜sc‘Iµ/ܓĮŅjū]+"׬ˆčy‰Q…8yy C`ŠĆąM:XS¼ŅkŒ]«ńM²Č:˜©ˆ„ĶWq`$E蹘 ±ų{X7žµfQr9”W”Ü6 ­¤ß^@tQ$YF“fhtŹnńKKn€„(‘H [;}²/#”Šķf|$T,ēØ@²³ę8@ģhÕ68ņ/šRK±Ń㾯“6ö{E% Ē™r@MHä Ūż¤—ÓDFJņ? *äźŅƒĮŽĶŽÖēhŒBÄS4ȱTe˜,F øB¤B’7ūßĆ@պĽĄ­^Ė@Ė8 žq3"ąŽOHØlN *øiō¼ŽC-½šd÷wµ„M‘P)7”1ÜBŖ[×ņOŁ o4 o73š%„˜Bᐙ3˜qhKY¶į~õˆeöūI¶Pm2ćŽw" óuß<āy s\fƒ¬…Kx¹Ę%h‹ĄK¦=k“q€+ˆ…ŚŲ8ĄÜ@$fĆK R©äŻ¢čHąv0$‡`…Ø_åß Ē¦s‚]ĶL‘uŌ„qqœ[2f¦‚ÉLOQ*kśmņ ‰Š=TĶéö4Ō°ł±‚å"rtĄdģD(, Q–Q!݃†ŁA„qĖ…i S¢į€Åś$>„Ź”ź^¾‰*,;LŚnļä:Pń‚Ä’‰“īö辂”¾ä",#f]$óW>ƒįd$ƦXŠ©qt‰µžl¶dd]L& ^Ÿ|§æśj&Gńż3§²\l „ąÖ›lU.ķ@MŽŽ\n)“Ś„’­#œ“2AǼ IĻ·rn™‘’<ʓw ¤Tƒäz0nÜŹƒr,(Ō^&¼ćŅ•WŘ08‚åŹvßĀÕ£³ź"÷vžĻc}²BćÜ*@ńI,Ś×wš÷0ƒ×Ły˜)Ä ·s7›č'ed22|4żP?Ņ•kūhˆfy³ī !—™ļś/gGƄŖ#“©Ø:ĀZ’ńm=Ī”~ qN]éę %æx`UœģŖ×č`街Ē2#j£8RcŽ\‡\{éˆ8LÕۈģCüčŚĢ-Œ\ׯöŠnØ·ÅOŒD`õ<ōqLžGŒe˜Dś o)eD–Ńt§¹Ü¹K…„•Mn­wøLQpł,›WŽĶt]e›~¼²ƒr›ī–“ė“,; L4Øf`ø&¬·KóX§cńr)F‹øµg…¤E ЉpÖZ6$x•ń®Ö®nTł¦yŌ@“ ž¼“«Ū·8 ¬\ǐć…|.&x½Ęz ߯Š“ZB%9ų±D„@7ߜ¼ē}œ u¹Ø!¹“BåątŅžŸyķ¹gå ¹k‘—9EŅ ń.ٌ¶Ś.Æił ŌmĄnŪ šģ ¶ ˁ óÖĪō‹†ßyF ūhžІw)®Aš²9ČX”Į±Ų“”37UøwŖ!Ļu÷-iŻĪ²Óęm¬‰ e"øF‹ é½4 į$YĄÅ-M‘cŽ Q”Ó^“™Aš1^ŪYˆ¦‹…é`ŽGķŻ˜©wLn3č@Ef¾Š7ØÆaŗ¼8iÄpĒ÷čL“žX=GSé ƒ EY>&Rl[²gP`’œk6=€Õ©%i«~ČAgŠD‘«@ĻČŚh  šāOĆ(f7޾ÕX½!ׯ)$ b9S“`XH e ~į¢Ēø@–ż‚ĄXę֔c(@SƒUŸœ®”‰’8ų%”Q× QāzM¦Ę(܉ŚF}@³ß7˰īqóqŪH{5Y4֍ NĢAIoåŲÅ|ž}æ- Dš&>‹/}|CŁą[$:—7ū¢ŠŌ*ģt,¤Pžpšh’ iM¼„·- q4„NI9 ‡—‹WģēćāŠzÓH1.#ŗ*Nzt…$S\„“0äĢ.Ķ2)śæn).­ū°ŁćĘw,r·ĻĖ¢[¹;®*\ćpHōŽÆ,?Åż–q8$Ćą÷̟a>ķ{¤8M=ˆ£OIŗA ™ņ€92@¶=é‚|ɏ)…æ®—¾XhäŁq¢-čšX’Õģh-Uų½2ÅbH«uߤ™–>¢ĪlĮ›ŅOJœ½ļ'E8b€j’j J²öFAö×+ŁM¾&ō¼¬ē XĻ•0:ė§aµ²ŲŒP,/Ō(lżću)æ%’Ä#Źréę›Ķū,—f¶GDŹ·£D^Xƒų%öQŌ§£{Œōi®č xų¢`Ōφ‹›`dŃQ’IxĆ IŃõøūõ=aGÖų¾6Š!ÄČg$ż©ŲYM¦4¶’¤·YA1MNč¶„š¶(4q°¼YlƒłźWügé¾7$† Š£¦ ūĖØÄ«Y‰• ąŖ %”%Śš`ø'Æ^F6ŁǵqmÅģāHi*ni,łc~`½4ȗ°Ż4ėŸg Ļ$øa”*xā ąˆÆ‚=õ2Ź0“‹HBŃQ„@‡5H©³htUL‘įJ6 e)Cą<8-‰2zĆ!脔āĀwŅp֎XÅ*Ź1§’ęZ\†»õb’ć—C•‹e„Ė?ł# ”I0Ö©ńrųĢCiʂ„Ē?ŖĆXĖ‹åßś 0\ok‰“¾…"{5K“ū*Ÿē‡č„Ž":r]?ŖX9@#‡&‘c²iACƒnt'*Ķ• ÷P& “0 ģ˜™t€n'Üė6ŖØ/h Y;<$ābó1©Ń?=…ąÖ‰”Į+DX8²TĘüŃΤ¶i żŃ‘]8¹×°‘Ā‚Šķ›.×V€94¶ŠqMŖLƒt£Ŗ4ˆ`Ź) a–ŻkČė@µIvn.’4ē€²_c?'¦œŖś™P+„’UŲ“drąŸEį—ąr:ėŁg߄®ėæČČŁ9NM…›zŠŒ}“ŖĻ¬š£mN€•×X2PбE ;ёp€²Q²BOōÓɳyČ@T‰ŽéUOG÷œņp?Č{9‘Č'FõrŚ'‹Õ@¤3 fĮCĀ>wRńTj@ŠŪ?#Ėż){ĶĀó‚&½€”ÉDsrˆ³>0ó+>É:&ࢠ1†Ad'ēNf0\œŁźBZ”P€`4Gæ%ØC„@³9 d" A¢R2«¤dęW}ԘxF8YMMŁC1ćiBŪƒ“&’ž~— ńm˜†€éV’“Å’„ѲW˜Æg}Ä.5‡sÅ{x±š.vaļa°^ķĶk²ūœQØfĪ µ™ŁöÄ\EjÅRżGORbg¾¢åŗH䗽ŲI×AbŒĪĀE˜×ĮÉä›7Šv×E&˜*žš„ްōē… —AćCó.dāÜ£kś‹Ü¦¹²ŚūOÓ ÅT¢ŗ°Ł^‡.Fhć1uĒ5^‰(éYʁĄŹ”I#s’¹Ó4 †^‘Rkģæį‰jŻķˆfuä¦h ƒg@¹XdĮI!fS4{÷Aé)÷nßāśśš«ĖJ”Bv­õˆ.…ū4>ކr9Ó,iõĢt&§€+ˆ½r6†¹3]ūłĀ 4…6”=”M ū[Śvąa QŹ‚(E‘ōguUĄ;&“²2= ÓĄ#øĮ•ōLpD,z yDĄWvÄȰi£+›É{$x䉃‚õ-uFPƒĮ]sČ©DMސ(4ģyĪŠŠl!³b•įBҰõšVƒJ²ąˊk<ņ^'Vf G_P±0EÉü3­č|bA8Äó%Q…žŌSćéõ§='Ąq¾6%3Yéóś>įŖ Ķӟ,žqį96JĢvķ,HĆódzÕČćL[¢g’;÷>%Čó|~{G¾l~ßx1@Y:MTTŌŲś$bŠ„Aµ}÷¬$õ²r¢L“烤O •ŒĪöčÆĆ<ż NV ¶!Œ®/Ė›ißāEį£eŽŻ4Žš–]鏤\]¢ø9QŻ-ŠxKū‘œS(į#6d—BBķņ,'‚;‡SŠØ`ärsĄÕł~øęI³,ę//«Ē {åJŃJ`”’|­†R손`Ļ4tÓö$āų'wL„’fŸņ±Ė0ą€W°ć€×ūvā#m‹sńMuq2 ¦ˆL(óC¶ HSZHó|zˆPp€AŠŅ”öīńŃöāŌ„üÉĒ4=n¤V5ke3ü·]® +£RRd…Ģ ]Dˆ7ö×q,{ČBFšĀĪhˆ@RG~¤{cHfŸˆ öTāl†Ń*%ŗŒīn*8ąv^ZQQ[°uż‚ŌQ%Ż sŪ9Ņ^¹=ž„’"ŌEŠzS4„h+%üXæ½č¾hę$6Š@ˆĆjØ0¬'å ų?,ˆ!3ųh…Š“a@mFÕs”X Õ9t×Õ!”’(õ4½u·>‚3Pā Ü<Üš_ۊ‚|4ÆĀS&g|«Åør;•żąźL„Ņ.āQ²:äp DfIĮąP§ÄCŪ4 ožĢdęķHl,p³žƒ¹ żd  ĀńĢpĻżˆµŽAīoŪD 0(,Į°d„Pżā›Ü6zdžÜwy›Ÿ ‚„ųT£Ÿģš<€r8G:>—”ō#¦Ńčīg\amŻ„ečyDōkū`bŗŠ˜~ĒAĪŹŌ‚<2j"HŽ3N±LĮ¼æBc®-}ĶÜÕ/…=ŲG±ļė÷»®©Ńś»Žü"ąŚĖ·Ü†ĪE„8nĢU8&ĆYŁŪž?–µ’½W&Čvn8«n­ÅŌ2ŁŪ2¦z\īklķ[śHæT”eż3\ü¢@ī¼&ŌøĀ%ēŌāLģĘE˜aPļ“ˆ3 ljO˜õuIpˆ`1ö@„‹ķ!&63ƖT1ē?Ā;ś¢¹°Ē’Fø;£Ž]ĒTB³Mķy£ ;ʉ‡lnt$XÓövt2LÄ0[P±i !=#ŹA0T“ŻK/Ō-đŪwųܟ0·.’4"©W†Ģńm47!Bg¦^P‘„BF”œÜŠütHūį4xc8¦źūDhäØóEŠgše¦ˆ3hźņŁzWóf·Ę ĀH`”"YŁPˆ2Kzk; wĄ‚õIۈįĮ\"11¾Æńį‰Å­bōŠ—Āż¢\8“cNz°Ž—H"‚Ä×jõ}šŪ:ČgĖuŠr„¼ŸԚN’,Y<ūĘ3ż­Į(ūö ®Šts|%R¶ņęń¦b-Ԑl¦ÉŖ•ĒåF „pž+æ`3qƒsؾßįÅ&ĻÕņhö¹Į3 ņ*‚«ŸÅ Ī0˱¾CZ#‹ø =«‰a“īh  8k‡v\XXQ"1,ƒx ā£Į:ōæpmzŠ!>ĄŖ–RŒD'¦źåMN"Ūy‹- ® 3#÷ķJ¬³{e*n<ß“„Įy&Å©B\m“ķ*ä„ņ™¾[F ¤ˆ÷ŲOé/l^žÖŗēA[" ųČ)ųī0ż‡Ē÷T¬@ĮX—DÜ8b/( |½°ŠWHƒ£¶BBµŁ)3ˆ3¢ Ē’ ±~ó$ŖŖČ{:ŗŒ:> öZ2c^&ņüÄC\V€Ūž€hŚK§šÜĪŌiŌ%I°,q?Ą2ć!±,§a±6ų4Ėh» åö$æÓw° ßęŻģhĒÉø{”Šz`±G؁ĖyĄģvOmƒ^ˆ’ÅZĪ1PVźź”Éę9ü¾l]ó‡ŸķĆŌ½¢}Lپ: īæ\xæBnūCś•īæ°>5®’?ņ ŸX“Ÿ, @p*ųx8C>µ½µv;…^ ŽKėĪĒ4„p}%xKر™ĢR ©„j“4GZčÜW±‘ Œ0Ū¤Ėu< .B;ōŒ4"/ŗx\õĪˆŹEc|ć}Mė+ŹsŻKŠ= rŠfĮų#uĘnb²1ŁĻ<°Ī ĪńŻ šj/<$n2š*ߚ˜,¶Óķ`R€nPCJ ]…-€ ĄČps»oÅa D€d¶ī"Ž,ā ^„‹œØ]ś::1cw^_¹–“4ū±§YżÕ 'Zņ¤Ż’CįJBÓŅģ)wf¶‘›,Č\j>„Žæ,Źø}HÜ­š7»Éé – @’µŒ VFÖ~dGóø(æqy0,|›\‘!*šķ¶fÕŠĶā 7Dˆž.¦/śBА¼†)§€Ü[§BÕ'į,TŠū¾ā<}ŸĀķÜäŹbcSØ ^ļ.5#bāgxP¦˜€KÓĢ’™aD 6‰ńfWžŠež&“µ±–ošåœ»(Ń*Éģ+ PŌćĆå*8ź!č_£f‚‘¦kŠg+mŌ–ƒŅÖʙ¼Ām¹bŠMĄ/ŠdG~ *–~Č-*üw"=„ńE9|GĶ鋈ŽŌWō Ié5"Ģ`6:.߂Ŗ’Lš‚HĢ*ƒ“ī•y‡ ”Ł…z^°N€‡å.ųįB¦Ńœ—™ķ2xŻe©żå%ķ¼5.;Įv+$BkœR…ūįPH½†+ʤ™«ʑß@˜`?‰ įō€²½SÕ]œBāV|tzpŲC҇bX‹8T³y™Kę;ūTšM† ,”C19ģ°% B„ą¼Ģ“ø"aÉƾ/3W„ ›"ėŹ‡YŻfį5ö}ęI‰,=²67ILɟ#Ą{$óL4V9§ ŗµļV<‡›čßrnö6 d¼t_Ó@Č –;×ŗnįŚ0’¹!–¾I+B%ĆH‰šėF½fdZ ŹČ/RŌd_ńäAźć€I‹Wfrqµ’Ī++aŽšPY†YØ$/‰ŪXmƒ¢V?®°WÖŹĢō }lĀl`Ą+X• 3Ąć’e‘fG@‘Ļųo·ˆnńŸŅ:Ęō,ÖÆ ‰\ $„×fś/4J„¦Si!dßœ ¤É÷Øżģ£%źźŠ«‡Vėœh”yķ5»Oüßčl8'Ä«ļ)h“ˆūŃā({%FNJKē¶zŖ=v[`:ś£ Ļ$k ÷Ļ%FA]ćQ^ØEU YąœŅ +›_śóÕ£Æźż:éČźĻ•ĀQU)GYT$Ļ19T*ՙ¹ŗČ€Lö³}Ɯ’_ü %ī–Ņ‘źŸNŌ,3ö=ėś$ß8†Tœ ģDćįnr€DŸ¦™Xą@Ę2„Čˆį'Z¢‘{ č^qŻŌÖ^XDņøĻƘ7ÜeāčĒökTĒd4…ĻŚ•p嫱Ē‘=Ösū³+^€IĻŌ—ŒœŠ¾gt`¬Æi4÷$ō**¢ik•9™®åM$ĶmÜ*”,x˜RæMPO“ŽT­ź²tĘ:åĄTGo•Ūļūź¢Fņ0½':|šØTnōe3/L-Ž*m¢ 4§Æ”²\źBO„-³„āÖa·¾a‘ƒ+:7ā×q(ĖGč`‘ÕĘvŸ ŠGWH §?Ž÷uĻ4ė[ķ Ę*‚Ģo%äšųY)ī@0Ę|„”³$€ƒ\‹Ę4p„¹ ×B#ķæ†:XÕ°Õy“¼ąå(jq±S ŖQ1%ĢӑĄ7| 4T{Ö6ģgyTĻL2k}ė3Ū(īå•ažŚĀ“ĶūŖs¤ ®ņšŁ”N^5“JiG$ ‰  Į— ĘŽ ęųł<•ĮUTާåµI×å0D˜g_Š=įĆ^ŌóaæÆšGöķ‡_ ™Ö£„‚ ()Ģ/;ū©ófcS‡ s}¦W $!_ö]oBń ·—‘ī'*ØĄQuW‚·FŖcų@‰0’Æ ˆ[”(‚či2x‰¹|¼śwÉ1 vɹ‡skĆē¶S¬Ą‡£ĪƒL.ān«CŁå_ķ S5æ¶?ɮƏŚ7 q?$ģøŅ­gĆ,“ŃZh&[į9$@Gü•‹ ±Ļ±Ē=³p–€Ł>&”Łv†>¤ƒ^lćį@`\S+.foĮ.‡]Āt mz©ɍQĪ}–å‚ųś-~ŪQeb»ĒIżCĘš4…|²HʵĀa²Y}1įŹ|ŒĄøčĄų׬˓ŗķ?M;R—~Gä4˜I8ÉēV-±-tŹ]Xļįˆäč‰ĆŌ>;*īõņĆw'ńvĒĮ$4v$_J{Ń'Č_˜Ü[sĘuA,Öī)z+ĄĻßz ŚE…ń·~Q4“ŲÖÅIp¹;Ņ/Ģ͐ϕGĻ<Éß­ÄnĘäsāv1ADS••Rݰ.Øļ~,ī҆øšfP"šĻį‹čž"cč’ēęÉCrį –:ˆK Ä6c°Č| »†#ó®)’‹3Āa5éPrAƒę½ B°¤‚Հ»zāŹ oŖ …fÉ ‹źŲŁŪ ļĪ ¼)ä±ĀDŗCFIj–ŻfaD#˜e#õ\8bŌØ>ĖųVŠ¢ä³#ÓčīµŲŽģĮS!Į ūVø„ķŖė®hˆ^ÕČ0ŗ#±xH"ײ~«ąKלݤ·$ƒTÄ ī«‡/[\wŽuŗ!t Ėīs{XA³Mėč"G\Ē{æ bu³™!ęĀķ»Õ9¹øI˜v­ń­Ē#…Ł" r0iNŁRG74„WŲcŲ<å;L‹onQ$Õ@‡_…v]<_#¹8 |Mśf–eĘ@P+ŅZa—;ą%Ų>“ƹŁćēBŲ‰Øc(G{SćgC§ŠųyZaPŹņvÅĢJƒ¤°+½a_VĻ×Lø§=ŗ’Īą],^ųŽ ĒŠ’@¤Ó®ā Ev+«fs9ßLpŖ`xAHƼF`×mŽXĶ“^Ņ ,tĮj¶ęĖԜ- Ō§® Zö¤¢cŒDč7ń ńAA?ąĪd–ƒpü+)SČnĖó< JB Šē„ö^ü‚‚1¬ģŽÜO×[õ\ēéOĄ »V¢bH €CåP:`WIé~é˜CXćSØ”U72GάXÖµ–ÕEŲ#’2tHEÕs`õwń+Į–ŚD·=uÅ~bt[_NČ«(vĖ‹l(Bįź„½<(CBĄB±Ą#Ą - ~ƒĘ],Õzł³•@˜Ś)›!ÖĒžÆ\|O_ĢOŠė·š3ųżįĖFM-±‚÷Ź”śćFøÓˆ Iį6yĪuėŽ{pOY'"ķ’ŹäÜ-ģĢū’¤.°ż#dsē!ėįLGoĆv$Ž~ųŽ]PN²{¾īNo`Čćobż…Ģųļ«f,c÷ŗƒź8gм3šsߏJč»uōX,zL5‹!œ9·tüqšF5ś¬?XaéŠä·Ū²Sµ+ó&3Åa&Ōć³ ĒHĄd7Ŗö‚t_$Ōn«D¶%DA¾*ąHq*X=ńūĒOO¦ļOjśōßRŒ8xŠ$4VŲu–|Q: ģü¤„], 53åĶIałųÉ0_&,:ݜD=—œĘG –Ńò…1U^,QÓąė>ō¢Š Ž“ L‘¶5­@ˉā*/^Én`11QU‚łUksœ‹ģCxˆļ¾‡G!r†ę6øsyxId~ŁŹD]­g>gĶXÄEŪy3Ćn©{±XČĪó†ÉČŠóĀHPōWø½Ų> ßŲ'č DŪņ²™‡xE&Æ"&k8ŒłD=œŽ'Ģ!A“õžĶ±-“ÆņŠ4­ŌøKS یTĄ»" “-WļdH®öy]ˆ6ŎŽę ˜y±g [@—WŁ@‰|¼ƒ`q£é_ŗa1®)ŒĀ:l4s\Ū/DÉ ±D/µ¦Öõ5IŹc U5æßŁZ‹źEMGŸŚķ›N¬HŽ}ieƓš”kżh’q`j ”’˜GOß Šł„ł92ÆCĒ'Ų…«:Ņ Ł–„b`j ‰ü{Ǝ]ģŠ1ĖFŠ ‰«{@8ś‰wibŗxV)Šę+Q9ždf¦Æ‚{@”b,";BšcDžŚQ‘·9üeˆNT&‘…Ė^Ļż2PoN06.6ńym·©«LĢB4ā[äb†”(*»NłBQ°ØTĢ"-᱇< Š 50‘“Ęń‚Ųyv†[ˆ˜€āö¹ˆæa۟«\_ĖŠÜ&p4{d"ɂˆZ½Ŗœä„x9'ƒkÕģÉGń`œZ”ūį¼DųqåÄ8 Šō#ŲĢ8@ćD0A¬k†zD&āķqņ”Cņž„@7ÌvśžpADQV)@™č\Ö)P“­{×_\ć…īœ) €”i@Ó²£S»PnĢHa³Ø>qaNBńP ė|¢T‘)$Ę„•ė0ēGĆ-* ¢"^ށ×¦L’,ģü¹B0}” ēćüʁpBø3P‡öŠĪŅ7ÕBÕ,XČģ q0Ū;܌<x,Ģ*;ē÷Œ/'>ź³rba”b„(XĖaiꐐĶkÅŹ.N‘LčĘÓĄ„vc̉ēĪP|L(XIC‚“daLV$äŗ”'?±Jź½JصżT,ŒŖpĒ™ų%BųŻɬ|9YźcµÓ¢}įSć#6ŸRlÉ>Yx¹‚| ­ŪžP U¤8 4œ V ó†ÓžĘ„CŪ“h豊‘#×'*_ńąŠÖ½ą!tė.²„ø¹ĒīŒĆēå+Ʊ"é͚-zĀ_ˆF`P4Ą‹rūŚÓŠq•łžæ}£čM€4Ė*ƒ0ΊcÆÄ!Ԉ2'‚ܹ܅9®AEoJW¤“„wĘ;kĮĮ¹žłzxšsøXØmhbHtóhnHh?£Ū¼;ĢMIz›:°öaŽ28z˜ĶЈ}ņŠ’©DÓņĄ}†\Ÿ«ŲģW„šPž…(5€óc‰Ą§ ¾„R}C(3ĪZé)Ä«»¢=±š#ˆ¶ŠƒĮīĄ«‹ig‘6‰ąęRœ  $qؚHŲĪ,>,wŅįŁT]70‚Ń”(éŁ4m“ ¹%§p%Šė»]ΌĪÉ£wøWN"%§Y8t>“G<yÕ!¾ĖķŌJ,³žy«mŌ…­¢īįW”™’o6`S QĄÉkq% Ža5ųg›ōc°ˆ¾DņßVńC÷œKõK*&(£ćdŖjš8*€W ?ģ{RU•3xĮķGhe?I‘K”°TŗX˜äēĘ#FŽ›¤bČę#¼$…‚ų‘PČɼP#^‹Įݐµ]yœøįB:ˆ `xņŪĘK0Ÿ£© ÷”—šü’  é“§k]tėæ$4Ō¬xc¤’?ÄæąW’I³ %‹Ć¹é¢@8[‚°nĶa(¬§p—c×FSdDōå3_ˈVv/3i^fbsxšĀżj3Ņžć­õąY„¹3lÜ4 Ó-°ŗ–›E«Ķ=s\YČļŠŽZŖ Į k]kńĖ4‘«źm§ģ2pÕæŹ+„ ~­qõ!QŖ>ė„ t»ŠwåĄ ż,\ӛžlMs@“ż' yČĀ”8™hąISś:Õ0Źģ֒ßG›ŲzK悝Ćnx‹–ĖFólĮŪ„4™ņnį·8‘HIÄ œ½Į60~śŖÕ!l’%ųt ©ģŗaŹ“¼śT.“R¢xečN@¼ņįŅp aĻ:ę»×i%¶C ÷-0{ó19LõK“l­KMČ9Ōjō„I€—?iŃĕĢFc?hÜY¼Įƒl l^Ŗ:öö«žńZę³mqé÷L®µīšŠÉ$ź*'fč XÆe<€·ōś¼MŒqAfŒ£wÖź%īÄėšaDUjZ"Ä2W°XŲˆŻ GŸ X tp;ü)Ō?8hq(ō!–^)»wšN>€ĢĘF0µÉn†Slć’­C\[Ų,ÓS@S@cė…€CĀ>ū÷»µ×`ł «’Zc’4©ŠM,ĘēŅP÷Å­Ķ5¾„Éłbøz-ąø6QvÉ8ä/ę@l™ŁĖKn„¶/$·0Ų9żG•C£L\&ƒéfū}ź@bĶw,™IK9B *x”»É4Bļ1"›kk«2ŚĆĀDIx ž0jäĒĮžå¼ĪnåķŹ07ćg‹» Ų”H.“S vŖM\ &”k3•øxO%"•±R$ĀF ąĖ&^ź2Ÿ5z’5»ä& œĻŁ®ĘŻŻ"]ČŠkH™øæxż&U/ļ1Iö“ÆVS{I^ŚÅ2ĘxšÜpųŲԔց7¹g}BHäzĘ Īkw­.G§(˜Dؐ£Š± °ŻŲŖmŖńl„…Ķ3£õÖgžTIYƍ—Öi5Ŗ‡·"aLć±ķ„B9 ęÉå¬,(ž—އC+"›Ī–gƒž\żŅÓĘćo§JJ“Sb<Ÿ%cūFh©·jÄ*YÆĢŹŚƒkb@ŗ3M<3cµĻ½ł•ł4 Xī“JqyA<J» ‘Iƒ„†šW©Ļ=”‰CYÜÆ¾Ŗį8‘ivžÅ›ń|÷Ų€PųčńģĒ0Öļµś,FģDjvß榎Či(ó£= –*8®ö„ĮpĒ"‚€·rnX‰Q‰„ļ&EŹ4kÄf‘AŠ š#é_¶Öå²q7Č<_©Šņ” ·¼Ū‘LԊŸö ™Ä1Y^Žź!¢ [—Gx‰vƒcśĆQ`!¦š&ŁM{®ÕŅ0*n·N .˜ŠD˜‘¾éÓ*A:ōIŻņłčLįb;»(PxżĄĻœ Ań³ŽLĀmSŖé©`’ķė±ąć¬Vŗ¹C®= n²±!²z¬+ĆJµA8HÖ’=^Ń퐃vψ™9iˆ|ƒĘFtʆÕōAÕ †»ė‘½ˆńe&f'ƒŁ› Ō2|Å`',䡓žŖ3;²„‚(廨§Ļę€  M|‡€`Ū¹üŠÄ\kØH^ÜV<†§ę0>ź‚@5÷¦]ņPWóRz‡čĒiįÕ}ćf°‚ęīhiĻ ĒHŪ¼DŠ™[µQĮˆ)Ö¬ŠādÓŅdö ×E üœŁķ$Ķ š%JĆˆÕæZR)$s‘VąC”čy–…Ž-@Z6\źüē]č„8¦ÄlŒ‹‹{“=Ē—4§DĀ;Aŗ}ęļpš7 /;G[© BčH¢"ķę³2Ņ)Ä~’4-ÕoZ‚ė?1› Ä®ģVF÷²+DĒ"ĪĘŁTå+¬$z2ė.Ąā™93½‰³d;üĀā!ė*U„9Ģ™/„Āꇱ£A¹#!ģD{āĮmČ"~`Xŗq ŒÜ×SÆEĒk0‘½ŗ¢Ó·3²Īö^ j~€°ć±#ė½ø®Ū>/1ŚX}nŠš‚šØT9;¢÷qBSfĻņér³ "°fÖĢ÷;럘‘(ū8[‰ųŠå"SZø †Ē­œ¶˜K`ųO«4O!pd7X@N73ŸEĶPģ•ƒ8rØN#gm E†dŹ1ŠÖVēŖĘn^ē,B”,…»³ul®ń&˜!œ˜ń‚KlmӮѷE¦ÅCŠé|mźjŠÆÆP­hÖ?Pö—Ģ ø¦`2ДȐ‚9z½¢ĖØCš4Aqø³"Ą•ø‹)݊ŠjżOč%cĢwJ<ĀH­..,s+ĻĄZõßq&VMs^‚ÜÅq˜½&|-üķ.Ņ=,GĀbŒńę\ŗ0æŠdõ ͜y#śó‰Ū±—5^`}/ œŅx4ń6QĮ ‡źü:‹ „ć_m™ź75_™—årģ1§ģ>E|€Č 0:™MĄĪv”É}†„CĆ ÉK—Ķv!+Ģ$GaĆSś{{ ķkĢJü<’ /“‰;²‰’Wī4“”ŗ˜E<‡Æ Ö-kõ8ĢčŪ";#7tµĮ„’ ¬ÆÖšūØ|®P»2¤r=äĖ x“=Ę®R‡Ļ—/oubęĻ%bÓŻ/qOÅ’[6[Éfµoh­ż•"x(°…€.Óߓ@ ę Jģb¾€3n™®Õüēń§­A T$h”šbZ®¤˜ž$üĄXźĢ Ųåx¶;Zß7Č£ŽŅśįŒwNDIS”H„UłM›„R1Ģ#Éńuk¾˜Nt[&ZjwQåeģ8²`sI0aVĘq„Æmų‘•x!²öš™Ū9Éż’¾÷.¢#¾ÄPŞOwģõ+“„Ų <Œ1…5EöµéYS°’ŲęļŅ֜ ’ŠÓ ©’ā:cÓxGdō §–vf=īi— Ēϼ!¾ĖLČ>®ÅžēIdW `ŠŽqbį ’‚>L.Kœ9OšŚ|‰×†±.Š1Ci6”¶8ĆūI²ĘĪ’eŅG'š»JLŽŅ[ĆY灌v&+”æPŒłYŸMaBM5øĮb¤CēõUAĖGm=PSŹ£%ĒŠ Ż jĢ@«–ę«™©Ŗ³³eLč-¦V&uĘē-įĖ‘(åšL§ĄŚKā  Æų4nGāģĄ„ęheŖÉŽ”Õgņ;j„™FīĶOĮ©g2c$xJ…Č£­‘+X§0Mdf°æĶ®©€g*p•††¦|łō£Z(F_ŒĄ'+^OŁf›š‘E„“õ¹iVÄšBsu•=²™²€„µyY"T,®T±? |z ˜łlF?5ķķµ> RlOO;Yj I?.°8„ł6o&‡ń3U‡”įą™a”Ą ćļ¬_ŻĪ•čŅ”L?įLV ò©-”É%šĘ•FÆŠ“ķ†×&µ”PžČĆüY‚&˜Ćģ ®Ó]WóPÄžH ź"•Õf’}?©ó“„b`õ'AvšŻ_# ”€s\Ö¢ŃV§®‰9W‡„٠˽¦Ī3šŹŽ]ę”÷äqLķĆ?a~SNQĀt^0„j—vERĮņļ̃ŒĵB ¬Rds›`óżõ'¼AęøĶV #“-*å V ØhkT¾U­2 *K*Żl ĆU£Ó<AiŃŁŸs$<‡ščl÷Į“‡˜»ątŲ˜7žĮ&J+ź3Ÿ²?œźļ,fłL‡¦“‰4ōք+źŚ%sßĄ6³äy*m±†9PzĖ[(-ĮóCĮ;TjŁ.¼IQ‹o_kn‰TśźĢ¢@3hå“+zÅŪĻž#£`­©ågŖœ²vU”;p†nƒzhbżB‰b„#‘^@ą€ļo\a‡=Ź]p=m4%ĮFi6²”õÄ®!ęŖŻ[Fö›ŻŽ%•»Z”šR…Ļ{Ķ„ņMÉHą‘}BQó^vym^= š¶rĒĻŽ{Š V²d¾ J>gĘ£™Ž­Tvn^Cäč€SśĖ„ŗR(²„pö’ū ›Z‘!Ø4±³Z0’(=Ū²LYĖŸī`FdĶŒ ˶/» p€Ėm#0Ėńf鎩öżŅŗ ütĻ£qe@[DZTę .Ęźy$Īßīó“ßrh`@=:'˜8VŖ ĮĪV`å­°ŠKĮ1 GĮä}ź$70¹¢’†siYĀ2?z}JōAŁĢ„"wŲZåų­zZwY  ļv'Hž»ó6ę§Ä$8ĉŲ?¶½i'ŁĖEh”¦}“ ¹”Eb5łēz_¾ńźS¢Ó¹R–ńõeqÅ X­Œ ±žJ ŌDhq >ś0Ć⹜ŗ‚ /ņĆP~‹ĄmąMٱ6ā–‚Ó“”…’ž‡ĄĒ0q¦“²`1 ‘”A›ƒüfŃf¾ižÅÕ¼6Ÿ$mŠ/ŹŠ„ęNµŖpäŖhµå‚ōĶnńC‚5æ¼V“«įKEKä<†|Fgh„ŲxäŖźęµg: ·‡Ÿ#xüYėNnüuø37ä€ūOÖBwvÓBīģ-øfz”HĖC۟?ĮžD,h˜ÓśHš[łLŠžx•t OY¦ö­`ÆÆĄrØ÷ k¤¶$¬-ßŲ3•Ł4§Ū€d@H‚K)ņūĀ-±CŠ:]mK@–ęÉĄ«ŃŲ›·fN3†’aZ Xc}{6c„kłk /©››0•ŅTN Ŗ¼¢Z]F,;“8 EÓÄJĻ)°zYų’—Źßp© (DB²0Ł©G’ń@ ®+™U5ˆN@äšp„Ÿ°ĄĒŻ-ÅāJpošŽš%Ņz9΁pķ0lų°–I>"{b`žŽEŲO藉$÷Ō® ĮœŲŚi!‡ÓČAlŲ”†\u,Aģ××]=ņ"Į/€i ±cō?ļØÖŌŠ—bY­$b#“ŃCį‘3ē×ū܍f*j ČDF†źl|3b³IÅ)ļ’ np2‡ߝėÄį+q¦±:&VÖņ·‡æwĮ·ŌIŌzĻU ™y:‘ŠŌ§W}6Õūf#–h’Kē±C#6ņģnˆP·2J“Ļ y†ģ¾yĒ&‡±–>]€č8_ŗB…¤pĻR `?gcFФ9VŠ&$MłÄß`B^rUńyA}4'ĶśöżįŖŠ“ną 䉕ō{O.„rU^Ld!Ø|€c#TnO$vÉ׀étĆpRŽw®’°Š ^Ęl„ü*¼ÆŪ ƒĆ5ģL/¦Ł[˜õ(ßvćTõuĘ”Ł3hH–—ˆąt;!dg‘ ņןF$» ¼R‡Dn^e\»WŖœ/ĒkŃ_ēŽŻ_œX£'jJM¦ L‘Z²ŁflŃ4č‘Ń›F—ŽčŒŖ„`æŅģŸN$,-€ ²å)Hų½Į"ėļĀØ;6ÜŅĶ:vŠi'Z¬>śGŚę(ńAp‹ćĮŲ±5je‚ŽX¬!ĘD¢BŲP• Ķ 9! •,æųÓdTŖ°T…ą†(fĢīÜhģźYXē sɆ8#GQÄF3Ę­nĻ7Ž•ŁbEtļm „҈tΤ¤¼ĮłœĻÅśˆ@O‡æĶ×H2ŪTĄßƒ žvO„t#åŁī=Ź$”Åź†Øņf4dķO1 Å³¤fŹź(#Ŗey€ t`Ćž[¼¶Ź6%“¾śöWU’žwŅÅĀ\¤8*lĮ’8ŌQJ`(ņųžBė#ßš\ˆ_¼ $ō;M°’³žN÷=1N]įŅ ‰54«IM©>Įł¬(Ģ 0Ģł ÕWѬ9ŗ”pŖø®ėć9lĆĄ¤uŻĪ`‡Tµü€•RĮš­ÜŹ+¦æX[ †2[ž£ ¬9?SŹtå×£bvlĖĂ5Ę?€ü.‘qĆŗĶ\īį|"e§5øĢX³]wT’ɇĶź— ¢)Š/˜~ˆ›A|Ą]‚~§7ÕŪT}z/Ļ ±åLÉĘCBX ¬g™#'g«0[Réöi*ƒy¬ńķ»ÕįdߢQ†ś)ō 'wDć­]±ōq”e÷%S_®|T󵍭wpą?PŽĒi,¢Ūäʏiüķ¾źL„QĶķdÉH ā ä#Ÿ«Ģ2ŗģČG`źóŠŒ&įöįÆŚĄio,™w€Ż”ł%jāY°g«¢*Ęš˜ā§ØŽ&ę  ™¤ńC×ĻĄŚĒ'Ż  §™ņ’œaš›Ši^­@[ ĖX]FŖˆg ”Ē1å̶4pļÅ%[ĖoÆP.fä,Ī_Ž_KmÉ zķ25 Ų¼ą(Ū)“ČVƕäZ„5€yŪĄöˆx +³ill$hD`é8§•zF3d<^Ć,ļ8³4ē{vÜŲ~°åšp‹0‰fĘĖp·ćĒHlF ©Tæ€zPŠ0[l/«Zś“5f…Ž ­Æ…ˆ¢ĶOĮ/˜Æ=(T 7©Š7ųģTB¾{ø4·öčŌčĶq wĮģ˜XŠ&ģcē¶’u_Ź™3™o”–ėßNPM9˜Õ»Ućėß̟cĄ Ä=<†ĻŅ]½ōR/˜*”üŽŲjļē_śĮĘAO¼?œØšg}Ž­™ 2Ē“øåe8=yČō6€ŖkčĀŖ½zˆRøąøZfÄE䲩!EŻš6ōēp õ§nE€ń­²^’(įėBiՒ¾Ō'lKjöX£øWx6d[.Ė’Ø3”JQ¬Ż³ģY“n"ćśP%ž×d˜×Q¾WL€žCE.žÕ–ō*ŁŲŽ_ķ½ĮVĪÕqJ£j‘TĒĻÆ<xśyų“‚);Œ‰­ZØ"ŃČŠHG* ÕĮŪ‘Ä%hĖ­`w”™hójq°ž§—qA—w}7PżŻø÷Sł‡ƒWÕąĀŠü6¼“¼ĆeUköBĶéĄW«©*B3&I(_ &t8¦īł,’(GŠ:J+ä1¶xłāĖlŽg€1ā#Č1]BŒŹÜģĘa÷-Hŗė/7Z‹Ėą'i¬"^(óvPXs”“źx‚xƒäIŅ»ŃTŚ/¤ēO 5šŽūA4Ę6r¼®h4­ŗ‰£iöBOQh1%%‚rę,čcįŚŽt¾SøßFĄś5 ¼Zz§ LģėŲÜkųŅnŠ‘Čż† Ģ<ȲE£Ć,ėķ­K.Pš%³ķĪH‰Xć\Øōā”ĄĶŸĖ[ČĄ=n/ ½¬(|\Ųø§" ÅĆõP3ҁ@Ž| t’P ?A_-$qŻž¬³įńTŪ{„ŖC•YµDˆØ8tX½yˆąllPpšŅtvY-“ž¹Čd”×K•CWīoņĻ ¢)ÄA:Łg–ģ)Ÿ»›Š§ 5¬‰ā˜¢bxÕL<1Æ9g–qæc’÷½Q8Pš”Ģ©PJƒv_ß\Ż’ rXāMį¶x‡XŹ:#­¹’"ų¹‚F‡„1Īńį}‹«ų×[²å_(3RF. ”JŽ <gĪådT O{ŽÜõ“Ąad‰Ei„LAčC›“s‚-˱č~5‘aŠó,7ČÅåƒ+ǰpƒ9µŽŲ` $$¤vىöĘØōńKQķ|/¶«&ƃ¢ŠY¶~¼9œ’»‘*‡ē“ŃŹv-ذa…Ŗ[‹:UK‘‰¾EvY9µ&cPD).©&²uĀ$™Ę :'ą9Ūü'ß0šó`liØč~HFŪłģ;uBŚņ섾hēŠČŲą”č_āŁléī®įZ:h|Ī;£Ā»…²č×TD’:Ä2."pąT„–4cž/ėZĶ•ķ.D*oWvŠ€TŹ[T¹éA,¢IPd\ }/"ŌbmćŲA ‰†c2”ł‘S4z„μ 3p š™ß5C <#õ¹$$2µĆD Q¬nė-ØŚVT²Ŗ ®a¦o¦Š›$>Ćŗ¬ŹN·LkKčĖkµõŽčÜb¹žńœŸ½sģt~¢Ÿr õ©±`ĆźŸ’WÓ¶. ‘ ¦"Į°Ōø/źdąńźĘxB®ł8;Th6ZŒŖćŠ’$ÄB7;·’2Ie™ņ„C7–y^—`™Ik7)ā$””½­ŃŒłQĖŻL˜øŁS}Ń%«Ķ"q ĄM‰, ‹n•LŗÜŠĻŲssSńį°m¤.žŃüć!“¶-źR»cś’¶²@½k¢‹OĢtż¹zǚЬ±OŽiØę漕;Č)EoŁźķ܀2kŌĘŪ³d]“z ҊSČ Čī0’›„…bÖ!˜0ŪŖA× ½>XĆ„ōš):Äl~+ƒęd4¢Dä6g©vųĆ8jéqŹs]|ČҳJūwXŃ +,YŒ"ęPj¼e½ż(tŗ™“Dv:¦č@œąø4ÉĶ^ńżĶ«€ŒA-Äóą#nv;©M¼GźCKZYĖ6n2bĶvO9_åU†^˜čĮ|\`‹†ž Ą•“ ²K·“ØĻwwčKƉåéG;#·EFč‰ĪH@ąŗ!ĮK·Ž ŚĘˆŗ­–ى³.$¬kŒ§Ü;–£·X*°70¹&©Øœ»‰×ƙ¬gvŻKJ(„ø…†€*¹8¢²UK ĶÅ5’ŠüOcLKoNö„¤«’†ĪŖD„p!ģ›d0z((MŒ fĄ•–‹ jTĵŌōb”X=lL@BФ§ż…RH6]I5RĆ?pDVßF€xi ųŠ§—įčQ«TŌYŚŌ(Lj~~XóV0†‘‘bį\B.‚ɼa&Ö©m7FeüdÖQøS—Äõ7YŌµF;wģź¢zˆeΌ™ō:Ó>mMžO ōĀNŠążcOQ?ß ˆ1Nżæ¦=’wu›Ģg#’ˆs³ĢTp„¾»ØQŸ„®”ā½3ŒJ(„7Éć‘s»4ÉŲ‘c/Üå> CüĖg^„c|!ĄéĒsIŗœ¦/ų“øµ®,ąÆ\JöPŒū’PļČÉ æ=cFn„|č—’š°5#¹¬‹¹u*Ćg(Uč¼ā2ß79Ō<ż,NČEą~ÓZ×Xs6z-Ź%"‰ę…›Jä³/乊Ł"÷ƒ3¢{¾ćĘålE’Jļå„M‰āsČ'—ƒ»NÖe‚~! ‡×aƋZ»1x@”ƒk`);Žl̤vy yM@+×gfŹ<ū0ÖLZ†čc%xŠš}qćE“»żpQĶH¼^a+!q£Ÿ\śķ/]lž†©5•Ł€/½‹f»#¬€ū/ T3ń—{‰Ź¢€6hQŃܶYŌ°qt)U.­h*Ņ„$YƒĀ·éÖōµ˜®öŅąÓzĄ %„4Šu„1]I±E\)ŸJęSCff2jt@ž³Y|õšŅ\Iō~U… ęä"³œ™æīVŽOe•-“ēHøČČv®Å“ 4mE€"¾å€uæ‰"Ä ¹óI>• ¤:ZõĒ‘ĀÖOžĪ?÷ıÓņ“ī@»'Qܕ„dk*ić[ŹĄp^|Ēen-y=¢.åÄ«?'.‹^=tQšœmy2»„v„pć%t“ZE·Y,Öń‰KtUķΜÉ:‘įp!"¹‹ƒ4Ų›ĪŠ_Ėo¶Pļ² "aȚ/.ö· Y# ž¬'e†VćÉxĶAG˜Éo #šśĆ}€īi·²ōxrÉõŗū|2?¹ųė*»”‡s(Ųū P›įž;ż#ę;m8š’Ėń9ėmÓJ³ĘĪaZf6ośŒĮŲĖ}«O§A1ßæ· č"±y¼Å£›K¹õŽ?"†Ėč$ŗī «bƒh-ĀwĢį¶›évŅ+²^'TšæÅ.i¶·ŠŁ¹`T‡8Zœ7­Ž”ü’M•5Ŗ‰Į„_äŪC Ź ·;Œ†Ģ;>tŒ{ןćĪ*ķgģ7W.Z掙ÕČŹœ¶ėŁJ™•(qKāæY–ąćŻ8Ā):©Y—©Pb¦MwM4¾Ž«¤ū ›;jK‚šcŅ-‰Ńn}‰Ī¢>ŹŪ©²FˆX#Ń.ŚØDŽäiƬ~©Cƃba“3ŖsŸ©©āŽC“–¢łä­Ó_ŹyР课hNĢ.˜‰f¾hćHŲć.ēQVĶ•Kc²¤Ē¶“Śq0öœc |ßKŽŽh×®Ž,ąŲ\^e/1œ­™Q¶æ=’fOč„L9}r ÕiÅ3IĀÅC’P£I\ób5“nbŹŪ3Žxsw)1:3æŠzs,@¶łÅ#®’b®–Ęė• «“‹U‘×Čœ0*Ų™Ę) ŲĆŚ Ņ” l"IŹm0Ć“ĘqŪż½Drō›Õ%,ÓWbgé!„pčFBŻži†Ą *ż6¹ę"8ĒUÉ(? įcČÆ·­d6ŁīX$0ē˜Xl@š×eé™K>‚¬ĘmČ’”ćŲ±JVʰ”HćPķ`Fe½$¤z厤G£Ļźß „q³ „0Ń[öĢ†Œ=鷑ļbØ²ßl³CöĘt‘+›d˜«‚•{Ģ‚) ¼}xé$Ž×§³ ½&²¹…/Æiī6yØź5øR§EŠFFÓ\³3cm=qś/aZRš¢¹õe% Ģżw?²ŹŖV ¹(:JŻ‹™‹kčĘųÄ¢‚^2PZK%cņźł&-«ĶĒF¦ģ@K#ʏ‰>%’°ŠMÕ9 N<ˆ‚V.-ņl—ĆŌś^ą%ŒXX¶‰½įh­Ńļ¢jĢā)<’bŻł} dyCVZ<éYō»hźęÆ Ī…#öŠ£±Ć†’Č P'4z–ģĄjJŁÓƒOƒq®I€ÜČū'߉$¦Od9”@Õ¤RgFŹŪq† µŹ?—ƹ‘€»NOb£ż?Ŗ­7UŠĖż(ÜäœÕ' ”3Se49n``„§•)o“ÜĢo&ŪJ{¤8“ “¦¶YĮ¢$ ōĀhŲIbBó'Ś0ęå¢Z“äxžƒ[B•¢”śžĆŒEõņŁ_OFČ Ąl+i5įœD²£­†ėŗ~ϵ±ŅO@J͜U oÆļzR§iŁ*Bž64gy"`<źSų”ŽĆg”łÜ¼ÉāŸiŠćfŁZ%÷Oē˜L'ėĮ*\LŅC„P”\ä -sļ, ®@•·'(  :ż Ķ€apache-couchdb-1.6.0/src/fauxton/assets/img/fontawesome-webfont.svg0000755000175000001440000060230512332105522025372 0ustar00djcusers00000000000000 apache-couchdb-1.6.0/src/fauxton/assets/img/fontawesome-webfont.ttf0000755000175000001440000023234412332105522025372 0ustar00djcusers00000000000000€`FFTMepaŃģGDEF“ OS/2‹z(`cmapé5°ņˆjgaspōglyf2‡÷üÄhead\Ć"Ą6hhea ‚įų$hmtxŁģlocaqµź4maxpŻ!D name<eš!døpost2Ķæ$¾webfŒRQø4ÜĢ=¢ĻĖT‚0ĶŽ<Ń†įŒ3†Œ3sZ3pyrs@ õ’# dHN@  ©®“Ę / _!"""`ąššš>šNš^šnš~šŽšžš®š²šĪšŽšīšžńńń.ń>ńNń^ńnń~ńŽõ’’  Ø®“Ę / _!"""`ąššš!š@šPš`špš€šš š°šĄšŠšąššńńń ń0ń@ńPń`ńpń€õ’’’ć’d’]’Y’T’Cą ßęß·ŽõŻśŻ¹ ’žżüūśłų÷ † ’’p7!!!ąĄž@p p śpś1]’£€!2#!"&463!&54>3!2£+żˆ@&&ü€&&@żˆ+$(€($F#+żˆż&4&&4&x+#’€+".4>32".4>32467632DhgZghDDhg-iWżDhgZghDDhg-iW&@ (8 ū 2N++NdN+'ķż;2N++NdN+'Ē3 8’€€!  #"'#"$&6$ €žłžŽžłrL46$ž©³Üžū½oo½½o|W%ržłžŽžłž€4L&V|o½½oo½žūÜ³ž©%’€=M%+".'&%&'3!26<.#!";2>767>7#!"&5463!2€ %žōž3@m00m@3žžō%  Ą  ś@ “ĮŠ:"7..7":ŠĮ6]€^Bś@B^^BĄB^ $Ī„+0110+„Ī$ż (   Øt˜„1%%1„˜+‘`ūĄB^^B@B^^’€€"'.54632>32š4ż #LoP$$Po>ąžåż‘€Z$_dŽCÜų+I@$$@I+ųÜŻåżØ’­€ą"#"'%#"&547&547%62€ž•Vž?ž?Vž”8öį<įö8yžžž   ģģ ōb% IĒ))ž9I ’­€ą + % %#"'%#"&547&547%62q2žZ½½žZ2IzyĒž•V)ž?ž?Vž”8öį<įö8)>~ž‚>ž×ž[ĒĒ žžž  2 ģģ ōb% IĒ))ž9I ’€€€'%#!"&54>322>32 &6 €’yü–y’ 6Fe= BS…†…SB =eF6 žĄįžĀįį>ƒx‹‹x5eud_C(+5++5+(C_dueēžĀįį>į ’€€/?O_oŸÆ54&+";2654&+";2654&+";264&#!"3!2654&+";2654&+";264&#!"3!2654&+";2654&+";2654&+";267#!"&5463!2€&€&&€&&€&&€&&€&&€&&ż&&&ü&€&&€&€&€&&€&ž€&ż&&&€&€&&€&&€&&€&&€&&€&€^BłĄB^^B@B^@€&&€&&š€&&€&&š€&&€&&ż&&ž&&š€&&€&&ūš€&&€&&&&ž&&žš€&&€&&š€&&€&&š€&&€&&ŗśĄB^^B@B^^€€/?#!"&5463!2#!"&5463!2#!"&5463!2#!"&5463!2L4ž4LL44LL4ž4LL44L€L4ž4LL44LL4ž4LL44Lž€4LL4€4LLĢž€4LL4€4LLüĢž€4LL4€4LLĢž€4LL4€4LL €/?O_o#!"&=463!2#!"&=463!2#!"&=463!2#!"&=463!2#!"&=463!2#!"&=463!2#!"&=463!2#!"&=463!2#!"&=463!28(žĄ(88(@(88(žĄ(88(@(8€8(žĄ(88(@(8ż€8(žĄ(88(@(8€8(žĄ(88(@(8€8(žĄ(88(@(8ż€8(žĄ(88(@(8€8(žĄ(88(@(88(žĄ(88(@(8 Ą(88(Ą(88ŲĄ(88(Ą(88żŲĄ(88(Ą(88ŲĄ(88(Ą(88żŲĄ(88(Ą(88żŲĄ(88(Ą(88ŲĄ(88(Ą(88żŲĄ(88(Ą(88ŲĄ(88(Ą(88€/?O_#!"&=463!2#!"&=463!2#!"&=463!2#!"&=463!2#!"&=463!2#!"&=463!28(žĄ(88(@(88(žĄ(88(@(88(ü@(88(Ą(8ū8(žĄ(88(@(88(ü@(88(Ą(88(ü@(88(Ą(8 Ą(88(Ą(88ŲĄ(88(Ą(88żŲĄ(88(Ą(88ŲĄ(88(Ą(88żŲĄ(88(Ą(88ŲĄ(88(Ą(88y‡²"/&4?62 62‡ż,ˆPˆž–ˆP&PˆņPż,ˆˆjPˆžŁ‘ˆn’ī’#$"' "/&47 &4?62 62 ˆPžŚžŚPˆ&žŚˆP&&PˆžŚ&žPˆ&žŚˆP&&PˆžŚ&ˆPžŚžŚ’€€#+D++"&=#"&=46;546;232  #"'#"$&6$  ą @ ą  ą @ ą €žłžŽžłrK56$ž©³Üžū½oo½½o|Wą@ ą  ą @ ą  ąęržłžŽžłžµjK&V|o½½oo½žūÜ³ž©’€€0#!"&=463!2  #"'#"$&6$  żĄ  @ €žłžŽžłrK56$ž©³Üžū½oo½½o|Wą@  @ ęržłžŽžłžµjK&V|o½½oo½žūÜ³ž©’€)5 $&54762>54&'.7>"&5462zĪžäžČžäĪz”’+i *bkQннŠQkb* j*’”ż€LhLLhL€œžäĪzzĪœ¶Bm +*i JÖyh½ŠQQнhyÖJ i*+ mž¾Jż€4LL4€4LL’€€/?O%+"&=46;2%+"&546;2%+"&546;2+"&546;2+"&546;2ĄĄ€ĄĄ€ĄĄ€ĄĄ€ĄĄ`ĄĄržĄ@ņżĄ@rü@Ąņś@Ą’€€n4&"2#"/+"&/&'#"'&'&547>7&/.=46?67&'&547>3267676;27632–Ō––Ō– ¹#H  Š,/ Ž1)  ~'H·  ŗ(C ‘ Š,/ Ž1)Ž  $H· Ō––Ō–mŽ 6%2X  %Ž lˆ2 øk r6 [21 Ž ..9Q $ kˆ2 øk w3 [20’€€€/;Cg+"&546;2+"&546;2+"&546;2!3!2>!'&'!+#!"&5#"&=463!7>3!2!2@@@@@@€ü€@ż`Ą0 žĆ o`^BüĄB^`5FN(@(NF5 żĄ@żĄ@żĄ@ż“üL%%Ju  •@üLSyuSø@§%44%§f5#!!!"&5465 7#"' '&/&6762546;2€&ž€’ž€&??ß>  żLżL > Ļ X ōĄŪ  ž &€ž€&ąŚž&AJ Ażæ J WĢĆžh¶’€€#3!!"&5!!&'&'#!"&5463!2€ž`(8ž€x žĒ 8(ūĄ(88(€(`8(8( ž€ 9 žhü€(88(@(8(žČ`’€€ ,#!"&=46;46;2.  6 $$ €žĄą@ ’śžŲś’’ś(śrĪžŸž^žŸĪĪa¢aąž@@`żž(ś’’śžŲś’’_ž^žŸĪĪa¢aĪĪ2NC5.+";26#!26'.#!"3!"547>3!";26/.#!2W ŗ  ō ö.ż@  žš  ż@.”$S  ¦  S$”@  žĄ ž9I   ’ I6> ĄĄ ūģ>€%=$4&"2$4&"2#!"&5463!2?!2"'&763!463!2!2&4&&4&&4&&4¦8(ś@(88(ч:œ:ˆŠ(8ž»ž@6ž@*&&*¦4&&4&&4&&4& žĄ(88(@(8ˆ88ˆ8)ž@Ą)'Ą&&ž@’€€$0"'&76;46;232  >& $$ ` žĮ  žĄĄĄĄĢžŲś’’ś(ś’’rĪžŸž^žŸĪĪa¢a` žĮ @`ž 2’śžŲś’’ś(ś½ž^žŸĪĪa¢aĪĪ’€€$0++"&5#"&54762  >& $$ ^ĄĄĄ ?  @ŅžŲś’’ś(ś’’rĪžŸž^žŸĪĪa¢a”ž ` ? žĄł’śžŲś’’ś(ś½ž^žŸĪĪa¢aĪĪ #!.'!!!%#!"&547>3!2’<Ōż<Ō<_@`&ś€&ī 5@5 ī@ šž Ą¢ž&&ā>=(""żŲ=’€€'#"'&5476.  6 $$   żą !  ’śžŲś’’ś(śrĪžŸž^žŸĪĪa¢a„JžĄ %€%žĄĖ(ś’’śžŲś’’_ž^žŸĪĪa¢aĪĪ’€€3#!"'&?&#"3267672#"$&6$3276&ž@*Š”Éh½ŠQQнhwŌI ‰ mžŹ¬œžäĪzzĪœ“k‚)'ž@&('ЉQннŠQh_  Š „‘zĪ8Īzoe’€€$G!"$'"&5463!23267676;2#!"&4?&#"+"&=!2762ē@žhžī’žļk4&&Ą&‰G“a†čF *Ą &ž@&ДɆčF *Ē Aš’k‚4&ąžōž³nf&Ą&&4‰BH‚rdž@&&4Љ‚rd  Moe&€/?O_o+"&=46;25+"&=46;25+"&=46;2#!"&=463!25#!"&=463!25#!"&=463!24&#!"3!26#!"&5463!2€ @  @  @  @  @  @ € ü@  Ą  ü@  Ą  ü@  Ą € ś@  Ą €^Bś@B^^BĄB^`@  @ ó@  @ ó@  @ żó@  @ ó@  @ ó@  @ ż3@  üĄ MūĄB^^B@B^^€€!54&"#!"&546;54 32@–Ō–@8(ü@(88( p (8Ąj––jžążĄ(88(@(8ĄøžųøĄ8@’€€7+"&5&5462#".#"#"&5476763232>32@@ @ @KjKĄך=}\‹IĄžš&:ģ¹kŗ~&26]S &H&ū  ņ&H5KKużt,4,’ &ę x:;*4*&€€K#+"&546;227654$ >3546;2+"&="&/&546$ €<¹‰X@@Gv"D°ž×ž²ž×°D"vG@@X‰¹<†ą4L4ą†Ц”1!Sk @ G< _b”œœžś”b_ 4.54632&4ž³žś&&M4&€UF &""""& F ūĄ&M&€&M&ž˜ƒ%.D.%’¹€G-Ik"'!"&5463!62#"&54>4.54632#"&54767>4&'&'&54632#"&547>7676'&'.'&54632&4ž³žś&&M4&€UF &""""& FUŖŒ &'8JSSJ8'& ŒŖžÓ &'.${ŠŠ{$.'& Ó ūĄ&M&€&M&ž˜ƒ%.D.%7žĪžż;&'6£ø£6'&;¶ž4ž[&$ [2[ $&[ €€ #/37#5#5!#5!!!!!!!#5!#5!5##!35!!!€€€€€€ü€€ž€€ž€€ž€’ż€€€€€€ž€€€€€ż€ż€€ż€€€€€€€€ü€€ž€€ż€ż€€ž€€€€ž€€ž€€€€ż€€ż€€€ #'+/37;?3#3#3#3#3#3#3#3#3#3#3#3#3#3#3#3#3???? ^>>~??????~??~??^??½^^? ^??€śśśśśśśśśśśśśśś€€’•ė€4&"2#"'.5463!2ĄKjKKjv%ž'45%ż5&5L4 5€&Ė% jKKjKž@5%ž%%Ģ%€5 4L5&ż6'’•k€54&"2#"'.5463!2#"&'654'.#32ĄKjKKjv%ž'45%ż5&5L4 5€&Ė%€%ž'4$.Ö%%ż5&€5ą5€&Ė% jKKjKž@5%ž%%Ģ%€5 4L5&ż6'45%ž%Ö%54'Ź&55&ż6' ’€y€Tdt#!"&'&74676&7>7>76&7>7>76&7>7>76&7>7>63!2#!"3!2676'3!26?6&#!"3!26?6&#!"g(žķsAüeM ,*$/ !'& łJPžī$G]ü› x›6,&ūķ `  ż  h `  ż  "9Hüv@WkNC<.  &k& ( "$p" . #u&#  %!' pJüvwEFŪ#  @  žĄ  @  ’—€2#"' #"'.546763Œ!''!0#žGžG$/!''!€ 8"ś÷"8  ØžX! 8" "8 ’€€€ <)!!#"&=!4&"27+#!"&=#"&546;463!232€€ü€€ (8ż€€&4&&4¦ ą8(ü@(8ą qO@8( (`˜(@Oq€€8( ż&4&&4&@ž`  (88(   Oq (8(˜`(’q’€€!)2"&42#!"&546;7>3!2  Iī©©ī©ąj––jś€j––ją3e55e3żgržłžŽžł`©ī©©īI–jü€j––j€j–ˆ1GG1ˆū€ržłžŽ’€€€ Q37&'&#7676767;"'&#"4?6764/%2"%ÕŖI”M <5ż:YķK5 Ķg'9') //8Pp]`O8Č:ƒ8 /\ž>KM'Bžå0QŃž>_’„ūžO 4hŌž ņ7f…:jCR1'  -! räAŃ@   ’€€€%e%3267654'&'&#"32654'&#"767676765'&'&'&'&/-72632;2/&+L@ƒŖ%&):SP§J+BƲUT«4Nżä-M.   3T|-)JXg+59-,*@?|±Z\2BJI‚RtÅTÖ! RHForB^ ­žņĶ‚ŸpKK ,!zb+üe^  B€ń”W  S  //rAFt/9)ij‚LU>7H$$ ’€€J767676?7>5?5&'&'7327>3"#"'&/&IL( 8  )g ='"B”!F76@% ,=&+ @7$ ~Ę)…J~U%@‹ @,Q5(?‡2&g  9,&ĒkžÉžė-   ’€ś€i…;?!6?2&'.'&'&"#"2#"'&#"#&5'56767676'&64&'&'&#"#&'52"/&6;#"&?62+Q6æ‚s×%"* ' Gˆ+"!  1( 8nMH¦X‘0:‹ &n+r  , Š!~:~!PP!~:~!P5d: +UM6a'˜ž“ž™“.'  -   !& #Ąń¬>q\ 0f!)Vū%¢¢%%¢¢%ü’†€h„;?!6?2&'.'&'&"#"52#"'&#"#&5'56767676''&'&'&#"#&'5&=!/&4?6!546Q6æ‚s¾>"* ' g®)^!  1( 8nMH¦R—-:‹ &n2ķ  , į¢%ü%¢¢%%5d: +UM6a'˜4ž™“.'  -    !& #‰(,  0f!)Vśó:~!PP!~:~!PP!€/?%#!"&=463!2#!"&=463!2#!"&=463!2#!"&=463!2&ł€&&€&ž€&ū&&&&ś&&&ž€&ū€&&€&Ą€&&€&&f€&&€&&f€&&€&&f€&&€&&€/?%#!"&=463!2#!"&=463!2#!"&=463!2#!"&=463!2&ł€&&€&ž€&ü€&&€&&ś€&&€&ž€&ż€&&€&Ą€&&€&&f€&&€&&f€&&€&&f€&&€&&€/?%#!"&=463!2#!"&=463!2#!"&=463!2#!"&=463!2&ł€&&€&&ū&&&&ś&&&&ū€&&€&Ą€&&€&&f€&&€&&f€&&€&&f€&&€&&€/?%#!"&=463!2#!"&=463!2#!"&=463!2#!"&=463!2&ł€&&€&&ł€&&€&&ł€&&€&&ł€&&€&Ą€&&€&&f€&&€&&f€&&€&&f€&&€&&€/?O_o%+"&=46;2+"&=46;2+"&=46;2#!"&=463!2+"&=46;2#!"&=463!2#!"&=463!2#!"&=463!2 Ą  Ą  Ą  Ą  Ą  Ą  śĄ  @ ś Ą  Ą  śĄ  @  śĄ  @  śĄ  @ ąĄ  Ą sĄ  Ą sĄ  Ą üóĄ  Ą sĄ  Ą üóĄ  Ą sĄ  Ą sĄ  Ą €/?O#"'&47632#!"&=463!2#!"&=463!2#!"&=463!2#!"&=463!2€  žą   € ł@  Ą  ūĄ  @  ūĄ  @  ł@  Ą ążĄ     üóĄ  Ą sĄ  Ą sĄ  Ą sĄ  Ą €/?O#"&54632 #!"&=463!2#!"&=463!2#!"&=463!2#!"&=463!2` žą     © ł@  Ą  ūĄ  @  ūĄ  @  ł@  Ą Ī žą  @  žąž Ą  Ą sĄ  Ą sĄ  Ą sĄ  Ą #"'#!"&5463!2632' žm©wż@w©©wĄw©“ ' ūĄ*“¦w©©wĄw©©w„’’€€€."&462!5 !"3!2654&#!"&5463!2€p pp pś€@ łĄ  @ “^BłĄB^^B@B^ pp pżĄž@Ą@   ū@  Ą  ū@B^^BĄB^^’€ėk%!7'34#"3276' !7632k[ė[€v żā 6 üĄž`ė%¦ž`¦$65&ė%[ė[k€ żā Źž`üĄ ą5%¦ „&&ź'’€€4&"2"&'&54 –Ō––Ō–!ž”?H?ž“!,Ø,Ō––Ō–mFüś!&&!FmŌ,žŌ’€€%" $$ ”ś’’ś”ĪžŸž^žŸĪĪa¢a`@’śžŲś’ńž^žŸĪĪa¢aĪĪĄ-4'.'&"26% 547>7>2"KjKžŌžXžŌQqYn 243nYqQ€$!+!77!+!$5KKµŌžŌ,Ō‘‚ £‹Ł]""]Ł‹£ ų€9>H7'3&7#!"&5463!2'&#!"3!26=4?6 !762xt˜t` ž¢ ^Q©wüĄw©©w@?6 1üĄB^^B@B^ @(` ż`žą\\žą\P˜`t˜t8`Ą ž¢ ^żĻ¾w©©w@w© 1^BüĄB^^B~ @Ķžąż` \ \˜P€+Z#!"&5463!12+"3!26=47676#"'&=# #"'.54>;547632€©wüĄw©©w’ M8 pB^^B@B^ķž€ ' ž½sw- 9*##;Noеj ' €#žżw©©w@w© "^BüĄB^^BÖ  Üž€*Ąƒ‰ž°  "g`„81T`PSA:'Ą*ž€4€/D#!"&5463!2#"'&#!"3!26=4?632"'&4?62 62€©wüĄw©©w@?6 1 üĄB^^B@B^ @ ēüŅBžRnB‡Bn^žĀw©©w@w© 1 ^BüĄB^^Bž @ ŌüŅ®Bnžł‡nB’C"&=!32"'&46;!"'&4762!#"&4762+!5462’4&ž€€&’4’&€ž€&4’4&€€&4&€€&4š4’&€ž€&4’4&€€&4&€€&4’4&ž€€&’’€€6'&'+"&546;267Óż: &€&&€& s ś@ Ę żZ&&€&&żZ ’€€+6'&''&'+"&546;267667Óż: ż: &€&&€& Ę s ś@ Ę ż: Ę żZ&&€&&żZ Ę ż: z’€€€6'&''&47667Sż:ż:Ęs ś@ Ę ż: Ę4Ę ż: ’|„ &546hśŠ!!0aż Ą ż $’€€#!"&5463!2#!"&5463!2&ž&&&ü€&ž&&&@ś€&&€&&ś€&&€&&’€€#!"&5463!2&ś€&&€&@ś€&&€&&’€€&54646&5-ĘĘż:s Ą ż: Ę ż:4ż: Ę ’€€+&5464646;2+"&5&5-ĘĘ&€&&€&ż:s Ą ż: Ę ż: ¦&&ś€&&¦ ż: Ę ’€€&54646;2+"&5-Ę&€&&€&s Ą ż: ¦&&ś€&&¦  62#!"&!"&5463!2Ę4Ę ś@ Ęś€&&€&&-Ęż:żę&&&’&5’¶ Ė&4762 "ężt%%Œ%k%K%%žę%%K%k%‹%k%‹%%K%k%žž&j%K%u’µKĖ"/&547 &54?62K%żt%j%L%%ęž%%L$l$Œ%Ą4'żu%%K'45%ęå'45%K&&żu%’€€#/54&#!4&+"!"3!;265!26 $$ Ą&’&€&’&&&€&&@ĪžŸž^žŸĪĪa¢a@€&&&’&€&’&&&+ž^žŸĪĪa¢aĪĪ’€€54&#!"3!26 $$ Ą&ż&&&@ĪžŸž^žŸĪĪa¢a@€&&€&&+ž^žŸĪĪa¢aĪĪ’€€+74/7654/&#"'&#"32?32?6 $$ }µµZµµZµµZµµZƒĪžŸž^žŸĪĪa¢ažµµZµµZµµZµµZĪž^žŸĪĪa¢aĪĪ’€€#4/&"'&"327> $$ [4žhā4[jüĪžŸž^žŸĪĪa¢a"ZžiāZž–Jž^žŸĪĪa¢aĪĪ’€€:F%54&+";264.#"32767632;265467>$ $$ €ĄĄo¦Wó€„  5!"40K(0?iĄ+! ":€ĪžŸž^žŸĪĪa¢a ĄĄ®X–RÕd D4!&.uC$=1/J=ž^žŸĪĪa¢aĪĪ’€€.:%54&+4&#!";#"3!2654&+";26 $$ `žĄ``Ą€ĄĄ€ĪžŸž^žŸĪĪa¢a   žĄ Ž  Įž^žŸĪĪa¢aĪĪ’€€/_#"&=46;.'+"&=32+546;2>++"&=.'#"&=46;>7546;232­m&&m ”l&€&l” m&&m ”l&€&l”s&%ė”&€&”ė%&&%ė”&€&”ė%&&€&l” m&&m ”l&€&l” m&&m ”,€&”ė%&&%ė”&€&”ė%&&%ė”&’€€#/;"/"/&4?'&4?627626.  6 $$ I’  ‰‰  ’ ‰‰ ’  ‰‰  ’ ‰‰ Ķ’śžŲś’’ś(śrĪžŸž^žŸĪĪa¢aɒ ‰‰ ’  ‰‰  ’ ‰‰ ’  ‰‰ (ś’’śžŲś’’_ž^žŸĪĪa¢aĪĪ’€€ , "'&4?6262.  6 $$ “žZ4žŚf4“4fz’śžŲś’’ś(śrĪžŸž^žŸĪĪa¢aÓžZ&4f“f4ś(ś’’śžŲś’’_ž^žŸĪĪa¢aĪĪ’€… "4'32>&#" $&6$  Wż‰ oɒVü󇄔ś’ zĶžćžČžćĶzzĶ8Ķƒ”†żYW’˼ņ[’ü”¢?žĘžāĪzzĪ:ĪzzĪ@’5K #!#"'&547632!2A4ż@%&&K%54'żu%%‹&54&K&&žŪĄ4A€€5KžŚ$l$L%%Œ%54'Š&&J&j&žŪK’5ĄK #"/&47!"&=463!&4?632Ą%żu'43'K&&%ż@4AA4ĄžŪ&&K&45&‹%@6%żu%%K&j&%K5€5K&$l$K&&żu#5’€K@!#"'+"&5"/&547632K%K&56$žŚK5€5KžŚ$l$K&&‹#76%‹%53'K&&%ż@4AA4ĄžŪ&&K&45&‹%%żu'5’µK€"#"'&54?63246;2632K%żu'45%żu&&J'45%&L4€4L&%54'K%Ą5%żt%%Œ$65&K%%žŚĄ4LL4ż@&%%K'’€Ą,"&5#"#"'.'547!3462ž4&ąb›™qb>#  5¢Éą&4š4ž& 6Uu e7D#  "¦Ē†“&ž’€€/#!"&546262"/"/&47'&463!2ó ž“&ž@&&4L  r&4ž“  r L&Ą&ķ ž“4&&Ą&L rIž@&ž“ r  L4&& ’ós/"/"/&47'&463!2#!"&546262&4ž“  r L&Ą&ó ž“&ž@&&4L  r@ž@&ž“ r  L4&&“ ž“4&&Ą&L r€€##!+"&5!"&=463!46;2!2€8(ž`8(Ą(8ž`(88( 8(Ą(8 (8 Ą(8ž`(88( 8(Ą(8 (88(ž`8€€#!"&=463!2€8(ū@(88(Ą(8 Ą(88(Ą(88z’€€5'%+"&5&/&67-.?>46;2%6Ź.@g.žöL4€4Lžö.g@. žö.@g. L4€4L .g@.žöęg.n.™žĶ4LL43™.n.gššg.n.™34LL4žĶ™.n.gš’€€ -  $54&+";264'&+";26/¢aĪĪžŸž^žŸĪβ Ą  Ą  Ü ¹€ĪžŸž^žŸĪĪa¢aūļ¾ ¾ fm  ż“ @ J%55!;263'&#"$4&#"32+#!"&5#"&5463!"&46327632#!2 žĄ$Ą$ž8Ć~+(88Ų8(+}Ā(°`8(ūĄ(8`ø]ƒƒ]k=€€=k]ƒƒ]ø“8ŌĄĄž,8e”8P88P8” žĄž`(88( @ƒŗƒM„„Mƒŗƒ€O4&#"327>76$32#"'.#"#".'.54>54&'&54>7>7>32&¬žÜćz&^‰¶&.žėŪÖą”Š’/+>*>J> W—¾m7“³²•' '"''? &4&c©‡&^|h_bąžĀml/J@L@ #M6:D 35sҟw$ '% ' \„t’€3#!"&=463!2'.54>54''€ śĄ  @ ’1O``O1CZŒ‰Z71O``O1BZŒ‰Z7 @  @ N„]SHH[3`€)Tt¬bN„]SHH[3^‚)Tt¬€!1&' 547 $4&#"2654632 '&476 €˜å=žłžŽžł=嘅‘Ō‘żµ}³(zVlŒž'żņž'ŒŒŁٌ@ģuhy¹žł¹yhuģĶóó9(³}VzžŅD#ęžėå#D#åžźå’ ą =CU%7.5474&#"2654632%#"'&547.'&476!27632#76$7&'7+NWb=嘧‰}³(zV‡iž\j1  z,ńX™Ę Y[6 $!%ž‚Ą'F–žuŽJŌiys§?_Æ9ɍ?Ąkyhuģžžn(³}Vzļ¼ż ½YF  KAŲ‰Lėa  ž0‹å2ö-„F"@Q¬¾„ī¼³sp@²_’€š!3%54&+";264'&+";26#!"&'&7>2 Ą  Ą  Ü ¹ #%;"ś";%#`,@L” € žéžż5 `  ½ü  ` Āž €™ LĄ`4ĄL”żH` üžżĀ`  ü½ a 5 € Ÿ L@’€ #37;?Os!!!!%!!!!%!!!!!!!!%!!4&+";26!!%!!!!74&+";26%#!"&546;546;2!546;232€ žą`@žĄž  žą`@žĄž  žąą@žĄž€@žĄ žąž€@žĄž  @  @ ą žąž€@žĄ€ žą  @  @ €L4ś€4LL4€^B@B^€^B@B^€4L€ žą @@žĄ@@ ü Ą ü @@   žą ü­@@ žą Ą  žą Mū4LL44L`B^^B``B^^B`L’ ą7q.+"&=46;2#"&=".'673!54632#"&=!"+"&=46;2>767>3!54632š7>7&54>$32šždōFKĘžś1A  0) µŽšL¶ōœ.ž¤žŁ«ÆC58.H(Y–‚ķ¬e«’€€#3C $=463!22>=463!2#!"&5463!2#!"&5463!2Åž”žHž”Å&€&/7#"&463!2!2€KjKKjĖKjKKjĖ ūģ˜&&ü&%±Ģ&& ±&5jKKjKKjKKjKĄž%z 0&4&&3D7&4& %&€€#!"&5463!2!2€„\ū@\„„\@\„ \„ ż@\„„\Ą\„„\ „W€*#!"&547>3!2!"4&5463!2!2Wž°+›BūĄ"5P+›B@"5ž©üĄ^Ī=žÆ„\@\„ \„H#žt3G#Œ3G: _HžtĄ\„„\ „@’Ą+32"'&46;#"&4762Ą&€€&’4’&€€&4Ś4&ü&4’4&&4’@Ą"&=!"'&4762!5462’4&ü&4’4&&4š4’&€€&4&€€&’’€€€ /!!!!4&#!"3!26#!"&5463!2’€’€’€’€ łĄ  @ €^BłĄB^^B@B^ž€€ü€€’ż€€€üū Ą  ū@ Ķū@B^^BĄB^^’€€0@67&#".'&'#"'#"'32>54'6#!"&5463!28ADAE=\W{āO[/5dI kDt‘”®pČe1?*©wü@w©©wĄw©ž (M& B{Wta28r=Ku?RZ^Gw›©T -ü@w©©wĄw©©’€€#7#546;5#"#3!#!"&5463!2Ę8nƘ„ƒƒ”©wü@w©©wĄw©jŪm1'ېƒŪż…{öü@w©©wĄw©©’€€#'.>4&#"26546326"&462!5!&  !5!!=!!%#!"&5463!2 B^8(ņ–Ō––Ōü–ś€įžĀįį>üį€ž€€üÄ@ż|€K5ś5KK55K²^B(8Ō––Ō–üĀ€>įįžĀį€žĄvŠ€€ū5KK55KK’H“€G4&"&#"2654'32#".'#"'#"&54$327.54632@p p)*Ppp p)*PĆb '"+`ÜN*(ża°½£Ķ¾2 £Ķƒc`." b PTY9° ppP*)p ppP*)žb ".`Ü(*NŸƒĶ£ 2¾Ķ£½°ž`+"' b MRZB’€š½ū4&"24&"264&"26#"/+"&/&'#"'&547>7&/.=46?67&'&547>3267676;27632#"&'"'#"'&547&'&=4767&547>32626?2#"&'"'#"'&547&'&=4767&547>32626?2€–Ō––Ō–LhLKjKLhLKjKž€ › "8w s%( ŗ ")v  > ˜  › "8x s"+ ŗ ")v  < ˜ €• 3zLLz3 •• 3>8L3)x3 •• 3zLLz3 •• 3>8L3)x3 •Ō––Ō–’4LL45KK54LL45KKž¹ #)0C wZ l/ ™ Y… N,& ¹ #)0C vZl. ™ Y… L0"żąŒqG^^GqŒq$ ]G)FqšŒqG^^GqŒq$ ]G)Fq’€%O#"'#"&'&4>7>7.546$ '&'&'# '32$7>54'€¼ž»æVZ|š$2 $ |޼E~E<Ž| $ 2$š|ZVžńÉ:”(t}†–‹žźģ‰X(  &%(HŅw‹ģ‰‰ż‰xŃH(%& (X„ZT\š†MKGÖ’€<m$4&"24&#!4654&#+32;254'>4'654&'>7+"&'&#!"&5463!6767>763232&4&&4¦N2ž `@`%)7&,$)' %/0ӃyĄ#5 +€1 &<¬$]`»{tžą5KK5$e:1&+'3T†F0°h˜¦4&&4&€3M:Ė;b^v…+D2 5#$ż€I§IJ 2E=\$YJ!$MCeM‹”-+(K5€5KƒK5y„*%AŠu]c˜’€=p4&"24&'>54'64&'654&+"+322654&5!267+#"'.'&'&'!"&5463!27>;2&4&&4¦+ 5#bW€ƒÓ0/% ')$,&7)%`@``2N€˜h°0##†T3'"( 0;e$žī5KK5 t€¾ipŒ­<& 1&4&&4&ž#\=E2 JIURIż€$#5 2D+…v^b;Ė:M2g˜c]vDEA%!bSV2MƒK5€5K(,,ž‰MeCM$!J’­@ą#"&547&547%6@ž?Vž”8öįąśÅģ ōb% IĒ)’€€94.""'." 67"'.54632>32€+C`\hxeH>Hexh\`C+»ED¼€åż‘4ż #LoP$$Po>ąž¬Q|I.3MCCM3.I|QØ»żŠ/¼ØŻåżØZ$_dŽCÜų+I@$$@I+ų (@%#!"&5463!2#!"3!:"&5!"&5463!462€ žĄw©©w@  žĄB^^B   żą4&ž@&&Ą&4 `  ©wĄw©   ^Bż@B^ 24żą& &€& &żą’€€%573#7.";2634&#"35#347>32#!"&5463!2ķēēöFtIG9;HIē’xˆIēē<,tŌ©wü@w©©wĄw©z¶Ö4DD43EEü§ŽšžueBżŒ„&#1sü@w©©wĄw©©’€€ .4&"26#!+"'!"&5463"&463!2#2ą &žS3 Lžl&c4LL4€4LL4c Ąž@ž®&ž å&{ÅLhLLhLžÅ'?#!"&5463!2#!"3!26546;2"/"/&47'&463!2€©wüĄw©©wĄż@B^^B@B^@€&4°żt  r Œ°&&`žĄw©©w@w©@^BüĄB^^B@Rž&°żt r  Œ°4&&@"&5!"&5463!462 #!"&54&>3!2654&#!*.54&>3!2 żą4&ž@&&Ą&4 s©wžĄ  @B^^Bžą  @w©š4żą& &€& &żą3ż@w©   ^BĄB^   ©’€€€ I&5!%5!>732#!"&=4632654&'&'.=463!5463!2!2ŹJ’½Ć’J½€SĶq*5&=CKuüĄuKC=&5*qĶS8( ^B@B^ (8¢Ń`NØö`Ń¢ØĪ€GtO6)"M36J[E@@E[J63M")6OtG€(8`B^^B`8’€€%-3%'&76'&76''&76'&76'&6#5436&76+".=4'>54'6'&&"."&'./"?+"&5463!2Š  2  5    z<: Ę©wą 49[aA)O%-j'&]Ę]5r,%O)@a[9( 0BA; + >HCąw©©wĄw©ø  5 /)  u    ±ü@w©ļa-6OƒUyU[q ( - q[UyU‚P6$C +) (  8&/ &‚©wĄw©©’€€Ą'?$4&"2$4&"2#!"&5463!3!267!2#!#!"&5!"'&762&4&&4&&4&&4¦8(ś@(88(«c==c«(8ž»*’&’&’*Ą6Ą&4&&4&&4&&4& žĄ(88(@(88HH88`(ž@&&Ą('Ąž@’€’€1d4&'.54654'&#"#"&#"32632327>7#"&#"#"&54654&54>76763232632   N<č;+gC8‰A`1a9į9µgÕw€Œü›|Ź9ā8aIe$I€VNšĀz<ē:LQJ  Ę,‹-[% 061Iéļ( )W,$-׋„ž»ū7,oIX(”)oÕζA;=N0 eTZ  (€€O#".'&'&'&'.54767>3232>32€ e^\3@P bM€žļO0# 382W# & 9C9 Lĉ" 82<*9FF(W283 #0O€Mb P@3\^e FF9*<28 "‰ÄL 9C9 & #€€!"3!2654&#!"&5463!2`üĄB^^B@B^^Ž©wüĄw©©w@w©^BüĄB^^B@B^ üĄw©©w@w©©’—€#!72#"' #"'.546763€ü§YY§ !''!0#žGžG$/!''!ū&–UUžjZ 8"ś÷"8  ØžX! 8" "8 ’€€EU4'./.#"#".'.'.54>54.'.#"32676#!"&5463!2G55 :8 c7 )1)  05.D <9¤0)$9“©wü@w©©wĄw©W + AB 7c  )$+ -.1 “9$)0¤žĒ< D.59ü@w©©wĄw©©,T1# '327.'327.=.547&54632676TC_L›ÖžŅ¬žńį#+į°i¦!+*p“DNBN,y[ƽ†Œ`m`%i]hbE‚žżī·m‘Š}a ±u&,ŽSXK•³ &$†½f9s? ’€š!#!#3546;#"’ćž«ŖŖ¬ÅćŽ'/ŌžäüČ8«¶»žä "# ’§€R&=4'>54'6'&&"."&'./"?'&54$ žŪč49[aA)O%-j'&]Ę]5r,%O)@a[9( 0BA; + >HCčžŪĪa¢aĪ€ūžoMÓa-6OƒUyU[q ( - q[UyU‚P6$C +) (  8&/ &fM‘ūŃaĪĪžŸ€€%+"&54&"32#!"&5463!54 €&@&–Ō–`(88(ü@(88( rĄ’&&j––jĄ8(żĄ(88(@(8Ą¹žł’€€€#'+2#!"&5463"!54&#265!375!35!ąB^^BłĄB^^B € ł€ `€€€^Bū@B^^BĄB^€ ąą ū `ż  €€€€€€€!="&462+"&'&'.=476;+"&'&$'.=476; €p pp p‡$ž»å! $qr‡ % ²žćž}×#ßŗ»Ö pp pžÅ!åE$‡ ‡rqžÜ¢#׃² % Ö»ŗž!)?"&462"&4624&#!"3!26!.#!"#!"&547>3!2/B//B//B//BŸ ū@  Ą ū2œüņ±^Bū@B^Å\77\ÅaB//B//B//B/š@  žĄ ķā  ż~žĄB^^B@2^5BB5ż¢2’ƒ€.42##%&'.67#"&=463! 2€5KK5L4ž_žu:B&1/&„¬.- zB^^Bą³Ķ4L€žvžŠy€KjKž€4L[!^k'!A3;):2*54&#"+323254'>4'654&'!267+#"'&#!"&5463!2>767>32!2&4&&4¦N2żĄ$YGB (HGEG H¾ÅQ½#5K4L€—i©!<¬…½¤;žą5KK5 A# ("/?&}£vh˜¦4&&4&€3M95S+C=‹,@QQ9ż€@@§IJ 2E=L5i˜>9eM‹”E;K5€5K J7R>@#†zD<˜’€€7?s%3#".'.'&'&'.#"!"3!32>$4&"2#!"#"&?&547&'#"&5463!&546323!2` #A<(H(GY$żĄ2NL4K5#aWTƾh&4&&4¦K5žą;¤¾ް=!©i—˜hv£}&?/"( #A  5K€€2*!Q@.'!&=C+S59M34L=E2 JI UR@@&4&&4&€ż€5K;E›ŒLf9>˜ig˜R7J K’5h4&"24#"."&#"4&#"".#"!54>7#!"&54.'&'.5463246326326&4&&4¦§IJ 2E=L43M95S+C=‹,@QQ9€@@€E;K5ż€5K J7R>@#†zD<˜gi˜>9eM‹”Z4&&4&<½#5K4LN2żĄ$YGB (HGEG H¾ÅV…½¤;žą5KK5 A# ("/?&}£vh˜—i©!<¬’4<p4.=!32>332653272673264&"2/#"'#"&5#"&54>767>5463!2€@@ż€2*! Q@.'!&=C+S59M34L.9E2 JI UR€&4&&4&›ŒLf6A˜ig˜6Jy‡#@>R7J K5€5K;E@TƾH #A<(H(GY$żĄ2NL4K#5#a=4&&4&żDް=©i—˜hv£}&?/"( #A  5KK5žą;¤¾’€€+54&#!764/&"2?64/!26 $$ &ž ½[6ž–[[j6[½ö&ĪžŸž^žŸĪĪa¢a@€&½4[ž–[6[ž–[6½&+ž^žŸĪĪa¢aĪĪ’€€+4/&"!"3!277$ $$ [ž–6[½ž &&ö½[6j[ ĪžŸž^žŸĪĪa¢ae6[j[6½&€&½4[j[žž^žŸĪĪa¢aĪĪ’€€+4''&"2?;2652?$ $$ ž–[6[ž–[6½&€&½4[ĪžŸž^žŸĪĪa¢af6j[[ž–6[½ž &&ö½[żž^žŸĪĪa¢aĪĪ’€€+4/&"4&+"'&"2? $$ [6½&€&½4[j[6[jĪžŸž^žŸĪĪa¢ad6[½ö&&ž ½[6ž–[[j’ž^žŸĪĪa¢aĪĪ’€€ Ų  $2>767676&67>?&'4&'.'.'."#&6'&6&'3.'.&'&'&&'&6'&>567>#7>7636''&'&&'.'"6&'6'..'/"&'&76.'7>767&.'"76.7"7"#76'&'.'2#22676767765'4.6326&'.'&'"'>7>&&'.54>'>7>67&'&#674&7767>&/45'.67>76'27".#6'>776'>7647>?6#76'6&'676'&67.'&'6.'.#&'.&6'&.5/¢aĪĪžŸž^žŸĪĪD&"      4   $!   #          .0"’Y +  !       $     "  +       ½Ī‘      €ĪžŸž^žŸĪĪa¢ažÅ                        PŽ   ' -( # * $  "  !     * !   (         ü‚$™      2 ’~€/$4&"2 #"/&547#"32>32€&4&&4ŖżV%54'j&&©'—Ü/ė¹žł¹:,žŪĮ”{ &4&&4&äżV%%l$65&©b—Œ'C†§r! " ©ąk[G€ +;%!5!!5!!5!#!"&5463!2#!"&5463!2#!"&5463!2€ż€ž€ü€€ž€&ł€&&€&&ł€&&€&&ł€&&€&€€€€€€ü@’&&&&ę’&&&&ę’&&&&’€{#"'&5&763!2{ž' ’ž**Ł)žż*ęķ)'/!5!#!"&5!3!26=#!5!463!5463!2!2€ž€^Bś@B^ &@&`’ł^B`8(@(8`B^€żž B^^Bą && €€ąž€€B^ (88( ^’€€G 76#!"'&? #!"&5476 #"'&5463!2 '&763!2#"'žc)'&ž@*žž*ž@&('cž (&Ą*cc*Ą&' 澝ž*ž@&('cž'(&Ą*cc*Ą&('žc'(&ž@*’€19AS[#"&532327#!"&54>322>32"&462 &6 +&'654'32>32"&462Q¢g†Rp|Kx;CB€’yü–y’ 6Fe= BP†ˆ†PB =eF6 ü–Ō––ŌVįžĀįį>!pR†g¢QBC;xK|€–Ō––Ō€{QNa*+%‹żx‹‹x5eud_C(+5++5+(C_due2Ō––Ō–žžĀįį>įżŸNQ{u‹%+*jŌ––Ō–’pš!Ci4/&#"#".'32?64/&#"327.546326#"/&547'#"/&4?632632°Š(* 8( !Ī)(“żAĪ('“Š)* 8( !U“SxySĪSXXVzxTŠTU“SxySĪSXXVzxTŠ@(Š  (8 *(Ļ’č(Ļ’'(Š (8 żįšS’SUĻSx{VXXTŠTšS’SUĻSx{VXXTŠ€€#!"5467&5432632€įŸūĄ¹žłŽt,Ōž;F`j–)Ø€Ÿį¹„Ū6Ō,°Ž>–jK?Ńs’€ €!%#!"&7#"&463!2+!'5#÷8Ejū€jE8÷@&&&&@žģžšČžš€XYY&4&&4&žqDžS­%žq%’€N\jx†Œ2"&4#"'#"'&7>76326?'&'#"'.'&676326326&'&#"32>'&#"3254?''7¦4&&4&lū€ żNnbS„‘ˆVZ bR„’SD zz DS’„Rb)+U‰‘„Sbn² €ū\.2Q\dJ'.2Q\dJ.Q2.'Jd\Q2.'Jd`!O×`ą€ż  `€żų± €&4&&4žr$#@ƒB10M5TNT{LŽ5T II T5ŽL;l'OT4ŽM01Bƒ@#$Š*„3;$*„3;ż;3„*$;3„*$ : $/é @@žQq`žĄ@˜Š’"%3<2#!"&5!"&5467>3!263! !!#!!46!#! (88(ü@(8żą(8(˜`( (8D<€žÕ+ż€žÕ+Ä<ž€8(ž`(Ųž€8(ž`€8(ū@(88( 8( (`˜(8(žø(ÕžÕ«žÕž¤< ž`(8ż€(`üų€ž`(8ż€’„||?%#"'&54632#"'&#"32654'&#"#"'&54632|žu‡dü÷qܟžs] = ż¢Ofj’L?R@T?ż»"&š > žf?rRX=Ed—uždsœŸŽqż¢ = _M–jiLü÷?T@R?E& žf > š=XRr?ż»b’€€!1E)!34&'.##!"&5#3463!24&+";26#!"&5463!2€ż€€ žē 08(żĄ(8€€8(@(8ž€ Ą  Ą €8(śĄ(88( (`(€ž€€1  ž`(88( ū (88(@  žĄ ü`(88(@(8(žč`’€€#!"&5463!2©wü@w©©wĄw©`ü@w©©wĄw©©/%#!"&=463!2#!"&=463!2#!"&=463!2&ś€&&€&&ś€&&€&&ś€&&€&Ą€&&€&&ę€&&€&&ę€&&€&&’Ą@'7G$"&462"&462#!"&=463!2"&462#!"&=463!2#!"&=463!2€p pp pp pp š ū@  Ą ś€p pp š ū@  Ą  ū@  Ą Š pp p pp pż Ą  Ą ć pp pż Ą  Ą óĄ  Ą ’÷<L\l|#"'732654'>75"##5!!&54>54&#"'>3235#!"&=463!2!5346=#'73#!"&=463!2#!"&=463!2}mQjB919+i1$AjM_3<ž–/BB/.#U_:IdDREź ū@ Ą ś€ž±k*Gˆjģ ū@ Ą  ū@  Ą TP\BX-@8 C)5˜Xs J@Ÿ$3T4+,:;39SG2S.7<žĮĄ  Ąvcc)¢( %Lžlž}Ą  ĄóĄ  Ą ’€€5e2#!"&=463%&'&5476!2/&'&#"!#"/&'&=4'&?5732767654'&ął@Ć0†…2uBo  T25XzrDCBBÕEh:%ģ›)0%HPIP{rQŒ9f#-+>;I@KM-/Q"€@@@#-a[µ€ $&P{<•8[;:XICC>.’'5oe71#.0(  l0&%,"J&9%$<=DTI’€€cs&/6323276727#"327676767654./&'&'737#"'&'&'&54'&54&#!"3!260% <4„"VRt8<@< -#=XYhW8+0$"+dTĶLx-'I&JKkm’§uw<=Vś@Ą!X@ v 'åžč|N;!/!$8:IœOb“V;C#V  &   ( ž‡ĆmL.A:9 !./KLwPM¼$ś‚@@ €€/?O_oŸ%54&#!"3!2654&#!"3!2654&#!"3!2654&#!"3!2654&#!"3!2654&#!"3!2654&#!"3!2654&#!"3!2654&#!"3!26#!"&5463!2žĄ@žĄ@žĄ@žžĄ@žĄ@žĄ@žžĄ@žĄ@žĄ@€^BśĄB^^B@B^ ĄĄŽĄĄžŽĄĄĄĄžŽĄĄžŽĄĄĄĄžŽĄĄŽĄĄNūĄB^^B@B^^’›€#+3 '$"/&4762%/?/?/?/?¦%kžŪ*śś6Ę6ĘśĖbbbb|ÄÄ<<ÄÄ<Žbbbbżžbbbb»%kžŪÕ6śśĘ6ʑbbbžü<<ÄÄ<<Äż^bbbbbb@’€M$4&"2!#"4&"2&#"&5!"&5#".54634&>?>;5463!2€LhLLhžĢ€ž Ć LhLLhL! '–Ō–ž€–Ō–@' !&  Ę? &&LhLLhL€ Ć ż®hLLhLĄü j––jj––j &@6/" ĘĄ&&’€€J#"'676732>54.#"7>76'&54632#"&7>54&#"&54$ ĪžŸŃok; -j=y¾hwāŽi¶[+PM 3Ń©—©‰k=J%62>VcĪžĪa¢aQž^žŸĪ ]G"±'9‰š–rČ~:`}†Chž 0=Z—٤ƒŖīW=#uY2BrUI1ž^Fk[|éŃaĪĪ’€€L2#!67673254.#"67676'&54632#"&7>54&#"#"&5463ąw©©wż+U ,i<µåF{¶jhµ}Z+OM  2ϧ•§‡jX–Õ¢ØģW<"uW1AqSH1žbdš©wĄw©’€€"3g!"&'>32 327#".54632%#!654.54>4&'.'37!"463!2!#!!3¦ ž„_™Znh7 1-$ žŪź—gŖ &ģWa3\@0g]Bj> Ņ©wž,',CMC,.BA.51 ‡‡žKŠÕL¢~Ąw©’€’€9&!q[-A"" ""$!'JN±v=C­dy4Shh/`ŠR~†ż w©ITBqIE2;$@;Ft’‘.  @M_~®©w`’€’’€€-co%4.'&#"32>4.#"326!#!".547>7&54>7#"&54676!#!5!3l $-1!6hpT6Gs~@;k^7x!=kB]f0@\3aWƒµ‡‡GN.BB.!5@@5!Œ˜žō;y{^<% €¢”L@ (•Õ¾‹^l’€’€G'!$"" "$8^2"&5!#2!46#!"&5463!2€€r”M* €*M~–~M**M~–~M*j–ū€–jj–€–ź&ł&&&€`Ą‰P%žąęŒ|NN|Œ|NN|ž*–jj–ž–jj–@ū€&&€&&@€ "'&463!2ž@4ž@&€Z4ž@Ą4&@ #!"&4762&ü€&Ą4ĄZ4&&4Ąž@@€€€ "'&4762€&4ž@Ą4&@ü€&Ą4Ą&€@€ "&5462@ž@4&&4Ąš4ž@&€&ž@’€€€ 3!!%!!26#!"&5463!2 `ż€mż€` €^BśĄB^^B@B^€ū   `ū€Ķū@B^^BĄB^^’Ą@ "'&463!2#!"&4762ž@4ž@&€&&ü€&Ą4ĄŚ4ž@Ą4&Z4&&4Ąž@’Ą "'&463!2ž@4ž@&€Ś4ž@Ą4&@ #!"&4762&ü€&Ą4ĄZ4&&4Ąž@’€:#!"&5;2>76%6+".'&$'.5463!2^Bś@B^,9j‡9Gv33vG9ŖH9+bIžˆ\ A+=66=+A [žŖ">nSMĄA_:üęB^^B1&öc*/11/*{Ž'VO3žū@/$$/@ķ*“?Nh^’°l+!+"&5462!4&#"!/!#>32]ž¶_gTRdg¦dž·QV?U ž·I*Gg?«Šü!ß2IbbIJaaüŻżČiwE33ż×š00 08ć’€€4#"$'&6?6332>4.#"#!"&54766$32zĪžäœ¬žŹm‰ IŌwh½ŠQQнhb“F‰*ž@&('‚k“œĪžČžäĪz‘„ Š  _hQннŠQGBŠ'(&Ą*eozĪ(’ėŲq!#"'&547"'#"'&54>7632&4762.547>32#".'632ė%k'45%ž•&+’~(  (žh  &  \(  (˜  &  ~+54'k%5%l%%l$65+~  &  ˜(  (\  &  žh(  (~’+%ž•'’€!)19K4&"24&"26.676&$4&"24&"24&"2#!"'&46$ €KjKKj KjKKj÷e2.e<^PšŠ,bKjKKjżĖKjKKj KjKKj‹#ś†#ŽšLlLšŽKjKKjK jKKjKžŸ~-ž‚M7>7&54$ LžhžŃ‚W.˜{+9E=ĢcŃŃQšždōFKĘžś1A  0) µšœčœ€‹ģ‰pĖJ2`[Q?l&‹ģģĒž¤žŁ«ÆC58.H(Y–®'««’€:d 6?32$64&$ #"'#"&'&4>7>7.546'&'&'# '32$7>54'YžĪžöj`a#",5NK™ żž~E¼¼ž»æVZ|š$2 $ |޼: $ 2$š|ZVžńÉ:”(t}†–Ž€h²fR˜88T h²Ģ²č‰ģžźģ‰X(  &%(HŅw‹ģūų(%& (X„ZT\š†MKGÖ{xŃ’|€!#"'.7#"'&7>3!2%632u żä  Åžj ÉH«ŒŹū{(e 9 ž1b’€€U#!"&546;5!32#!"&546;5!32#!"&546;5463!5#"&5463!2+!2328(žĄ(88(`ž`(88(žĄ(88(`ž`(88(žĄ(88(`L4`(88(@(88(`4L`(8 žĄ(88(@(8ĄĄ8(žĄ(88(@(8ĄĄ8(žĄ(88(@(8Ą4LĄ8(@(88(žĄ(8ĄL4Ą8’€€ĄOY"&546226562#"'.#"#"'.'."#"'.'.#"#"&5476$32&"5462€˜Š˜&4&NdN!>! 1X:Dx+  +wˆw+  +xD:X1 -’U¾Œ ą„!ż*,*&4&Äż¼h˜˜h&&2NN2D &  ..J< $$ 767#"&'"&547&547&547.'&54>2ąl4  2cK Eo‡Š‡oED ) € ä € ) D€g-;</- ?.P^P.? -/<;-gY‘·¾·‘YĄ  .2 L4H|O--O|HeO , ™‘‘™ , Oe›q1Ls26%%4.2,44,2.4%%62sL1q›c«qAAq«’ ą4#!#"'&547632!2#"&=!"&=463!54632 ś  žĮ @  `  žĄ  ś   ` ?`Ą Ą  @  @  Ą! žĄ  Ą Ą Ą žĮ€€54&+4&+"#"276#!"5467&5432632ą Ą ą  `  _ €įŸūĄ¹žłŒv,Ԝ;G_j–)‚§``  ž   ž  _ ԟṂÜ7 Ō,®>–jL>Ń€€54'&";;265326#!"5467&5432632 ž   ž” ą Ą ą €įŸūĄ¹žłŒv,Ԝ;G_j–)‚§  ` ž” ž   `žķŸį¹‚Ü7 Ō,®>–jL>Ń’€€€X`$"&462#!"&54>72654&'547 7"2654'54622654'54&'46.' &6 €&4&&4&’yü–y’ %:hD:Fp pG9„F„j– 8P8 LhL 8P8 E; Dh:% žĄįžĀįį>Ś4&&4&}yŠŠyD~–s[4DĖd=PppP=dĖ>hh>@–jY*(88(*Y4LL4Y*(88(*YDw" A4*[s–~ŲžĀįį>į’€€€M4&"27 $=.54632>32#"' 65#"&4632632 65.5462&4&&4¦G9žłžŽžł¤Ü& <#5KK5!¼¼!5KK5#< &ܤ¼¼9Gp p&4&&4&@>bžuŸįįŸ„ؐ&$KjKžnj––j’KjK$&žŲ„j––j‹b>Ppp’€€ %!5!#"&5463!!35463!2+32€žž @\„„\ ü€8(@(8„\@@\„€€€ū„\@\„ū (88( ąüĄ\„„’€ -4#"&54"3#!"&5!"&56467&5462P;U gI@L4ž@–Ō–ž@4L¾ĀĄØ8P8ØĄĀ° U;Ig04Lj––jL4”Ł„Ā(88(Ā„žśž'’€@"4&+32!#!"&+#!"&5463!2€pP@@Płš–jūj–@įŸ@„\ż@\„&€Ÿ0 pž€żĄj–– žĀį \„„\ą&’€-B+"&5.5462265462265462+"&5#"&5463!2€G9L4€4L9G&4&&4&&4&&4&&4&L4€4Lą ¼„&Ąż€=düõ4LL4 d=€&&ž`&& &&ž`&& &&łĄ4LL4  „¼&’€€(/C#!"&=463!25#!"&=463!2!!"&5!!&'&'#!"&5463!2ż@Ąż@Ąü€ž`(8ž€x žĒ 8(ūĄ(88(€(`8(`@@ņ@@ż’8( ž€ 9 žhü€(88(@(8(žČ`’€/?O_oŸÆæĻßļ’-=%+"&=46;25+"&=46;2+"&=46;2%+"&=46;2+"&=46;2%+"&=46;2%+"&=46;2%+"&=46;2+"&=46;2%+"&=46;2%+"&=46;2%+"&=46;2+"&=46;2%+"&=46;2%+"&=46;2+"&=46;2%+"&=46;2+"&=46;2!!!5463!2#!"&5463!2€ @  @  @  @  @  @ ’ @  @  @  @ ’ @  @ ’ @  @ ’ @  @  @  @ ’ @  @ ’ @  @ ’ @  @  @  @ ’ @  @ ’ @  @  @  @ ’ @  @  @  @ ’€ū€€ @ &ū&&&ą@  @ ó@  @  @  @ ó@  @ żó@  @ ó@  @ ó@  @ ó@  @ żó@  @ ó@  @ ó@  @ ó@  @ żó@  @ ó@  @ ó@  @ žó@  @ ó@  @  @  @ ś“śą  `ł€&&€&& ’€/?O_oŸ·Ūõ%+"&=46;25+"&=46;2+"&=46;2%+"&=46;2+"&=46;2%+"&=46;2%+"&=46;2+"&=46;2%+"&=46;2+"&=46;2!!#!"&=!!5463!24&+"#54&+";26=3;26%#!"&5463!463!2!2€ @  @  @  @  @  @ ’ @  @  @  @ ’ @  @ ’ @  @  @  @ ’ @  @  @  @ ’€’8(ž@(8’€ @  @ € @  @ € @ &ū&&@8(Ą(8@&ą@  @ ó@  @  @  @ ó@  @ żó@  @ ó@  @ ó@  @ žó@  @ ó@  @  @  @ ü“€ (88( ū€ą  Ą@  ``  žĄ  `` -ū&&& (88(žą&@’€€€<c$4&"2!#4&"254&+54&+"#";;26=326+"&5!"&5#"&46346?>;463!2€KjKKjžĖ€žĆKjKKjĖąĄąąĄą&Ą–Ō–ž€–Ō–€&&Ę@ &€&KjKKjK€Ć ż­jKKjK ĄąąĄąą.ū€&j––jj––j&4& @Ę@&&’€€#'1?I54&+54&+"#";;26=326!5!#"&5463!!35463!2+32ąĄąąĄąż€žž€ \„„\ĄūĄ 8(@(8„\ \„ ĄąąĄąąū„\@\„ū (88( ąüĄ\„„€€: #32+53##'53535'575#5#5733#5;2+3€žįž ą@žŪE&&` @@ Ą` €ĄĄ€ `Ą @@ `&&E%@ą`@ @ @ž    ą Ą € Ą ą   ž @ :#@€€!3!57#"&5'7!7!€’K5€ū€€€Ÿį@ ą Ą @€€’5Kž@ĄĄĄįŸ@@€€Ą üą’€€#3%4&+"!4&+";265!;26#!"&5463!2&€&ž&€&&€&&€&©wü@w©©wĄw©Ą€&&žĄ@&&ü€&&@žĄ&&ŗü@w©©wĄw©©’€€#354&#!4&+"!"3!;265!26#!"&5463!2&žĄ&€&žĄ&&@&€&@&©wü@w©©wĄw©@€&@&&žĄ&€&žĄ&&@&:ü@w©©wĄw©©-Mó3)$"'&4762 "'&4762 s 2  ž. Ņ  2 žw‰Š 2  ž. Ņ  2 žw‰­ 2 Ņ  Ņ 2  žwžw  2 Ņ  Ņ 2  žwžw MÓ3)"/&47 &4?62"/&47 &4?62S ž.  2 ‰žw 2  ŅŠ ž.  2 ‰žw 2  ŅM ž. 2  ‰‰  2 ž.  ž. 2  ‰‰  2 ž.M3S)$"' "/&4762"' "/&47623 2  žwžw  2 Ņ  Ņ 2  žwžw  2 Ņ  Ņķ 2 ‰žw 2  Ņ ž.v 2 ‰žw 2  Ņ ž.M­3s)"'&4?62 62"'&4?62 623 ž.  ž. 2  ‰‰  2 ž.  ž. 2  ‰‰  2­ ž. Ņ  2 žw‰ 2v ž. Ņ  2 žw‰ 2-Ms3 "'&4762s žw‰ 2  ž. Ņ  2ķ žwžw  2 Ņ  Ņ 2 MS3"/&47 &4?62S ž.  2 ‰žw 2  ŅM ž. 2  ‰‰  2 ž.M 3S"' "/&47623 2  žwžw  2 Ņ  Ņm 2 ‰žw 2  Ņ ž.M-3s"'&4?62 623 ž.  ž. 2  ‰‰  2- ž. Ņ  2 žw‰ 2’€€/4&#!"3!26#!#!"&54>5!"&5463!2 łĄ  @ €^Bżą &ž& żąB^^B@B^ @  üĄ MūĄB^%Q= &&& $$ ”žŲś’’ś(ś’’rĪžŸž^žŸĪĪa¢a ’śžŲś’’ś(ś½ž^žŸĪĪa¢aĪĪ€€!C#!"&54>;2+";2#!"&54>;2+";2pPž€PpQнh@&&@j–8(ąPp€pPž€PpQнh@&&@j–8(ąPp@ž€PppPĄh½ŠQ&€&–j (8pPž€PppPĄh½ŠQ&€&–j (8p€€!C+"&=46;26=4&+"&5463!2+"&=46;26=4&+"&5463!2Qнh@&&@j–8(ąPppP€Pp€Qнh@&&@j–8(ąPppP€PpĄż@h½ŠQ&€&–j (8pP€PppPż@h½ŠQ&€&–j (8pP€Ppp’€Ą !)19A$#"&4632"&462"&462"&462"&462$"&462"&462"&462šU;bq™›bą&4ž4&ąÉ¢5 ¦žć"  #D7e uU6 ’&4&’žm†’€€ 1X".4>2".4>24&#""'&#";2>#".'&547&5472632>3€=T==T=™=T==T=¹Šv)šG¬G˜+vŠ@b’†RØR†’b@ą=&‡“Į–\N€§Šˆj!>ˆ3l¤k“¢”„i¤k3ˆhPTDDTPTDDTPTDDTPTDD|xØ ØxXƒK--KƒĻ|Mp<# )>dA{ŠķŸRXtfOT# RNftWQ €€,%4&#!"&=4&#!"3!26#!"&5463!2!28(ż@(88(žĄ(88(Ą(8€„\ū@\„„\@\„ \„ąĄ(88(@(88(ü@(88čż@\„„\Ą\„„\ „u€'E4#!"3!2676%!54&#!"&=4&#!">#!"&5463!2!232õ5ūĄ([žŚ5@(\&ū‹8(żĄ(88(žĄ(8,9.žŁ+’CūĄ\„„\@\„ \„Ą6Z]#+ž•#,k“ (88(@(88(ü«;5E£>:ž•5E„\Ą\„„\ „\ 1. €€#3C++"&=#"&=46;546;2324&#!"3!26#!"&5463!2€ą@ąą@ą€8(ż@(88(Ą(8€ƒ]ż@]ƒƒ]Ą]ƒ`@ąą@ąąžrĄ(88(ż@(88čż@\„„\Ą]ƒƒ€€/2#!"&54634&#!"3!262#!"&=463 ]ƒƒ]ż@]ƒƒ] 8(ż@(88(Ą(8 żĄ€ƒ]ż@\„„\Ą]ƒü`Ą(88(ż@(88Č@@’€€$4@"&'&676267>"&462"&462.  > $$ n%ŹžŹ%/‡Ø‡02ž KjKKjKKjKKjKf«ķžüķ«ff«ķķ«ęĪžŸž^žŸĪĪa¢aĶy””y/PccP/ĻjKKjKKjKKjKżžķ«ff«ķžüķ«ff«@ž^žŸĪĪa¢aĪĪ’€€$4@&'."'.7>2"&462"&462.  > $$ n20‡Ø‡/%ŹžŹž7KjKKjKKjKKjKf«ķžüķ«ff«ķķ«ęĪžŸž^žŸĪĪa¢a3/PccP/y”” jKKjKKjKKjKżžķ«ff«ķžüķ«ff«@ž^žŸĪĪa¢aĪĪ’€€ +7#!"&463!2"&462"&462.  > $$ €&ż€&&€ž&KjKKjKKjKKjKf«ķžüķ«ff«ķķ«ęĪžŸž^žŸĪĪa¢aŚ4&&4&µjKKjKKjKKjKżžķ«ff«ķžüķ«ff«@ž^žŸĪĪa¢aĪĪ€#+3C54&+54&+"#";;26=3264&"24&"2$#"'##"3!2@Ą€ĄĄ€Ą@KjKKjKKjKKjKžŌŌĄ’Ü’ĄŌžŌ,Ō€ŌĄ€ĄĄ€ĄĄgjKKjKKjKKjKŌžXžŌ€€,Ø,€€ #/;GS_kwƒŸ£³+"=4;27+"=4;2'+"=4;2#!"=43!2%+"=4;2'+"=4;2+"=4;2'+"=4;2+"=4;2+"=4;2+"=4;2+"=4;2+"=4;54;2!#!"&5463!2€``€ąą€``ü `ż€``€``€``€``€``€``ž````ąp`€ł€K5ł€5KK5€5Kp``š``š``żš``š``š``žš``š``žš``žš``š````ž `šż€ü€€ü€5KK5€5KK@’€€*V#"'.#"63232+"&5.5462#"/.#"#"'&547>32327676€©‰R?dØ^­ęõ¼7ac77,9xūm#@#KjKĄ# Ś—XF@Fp:fžõ_ #W¤IpĀp&3z¼ ėh[ 17ż©q%q#:ūņ:#5KKuż't#!X: %ę#+=&>7p @’€€ *2Fr56565'5&'. #"32325#"'+"&5.5462#"/.#"#"'&547>32327676@µĖͳ¬Ō×éė•8 2.,#,fµk*1x­©‰-!”ū¬#@#KjKĄ# Ś—XF@Fp:fžõ_ #W¤IpĀp&3z¼ Ąe¹`°Åv½ož8øt-ą  Ž:5 ¼½[Ä*ī#:ūņ:#5KKuż't#!X: %ę#+=&>7p  €3$ "/&47 &4?62#!"&=463!2Iž.  2 ‰žw 2  Ņ -ü@Ą)ž. 2  ‰‰  2 ž. ž-@@-’“Sķ$9%"'&4762  /.7> "/&47 &4?62i2  ž. Ņ  2 žw‰ Ež‹ > u > ž.  2 ‰žw 2  Ņ ‰2 Ņ  Ņ 2  žwžw !śõ   żhž. 2  ‰‰  2 ž. ’€»;#"'&476#"'&7'.'#"'&476€' ž)'žs "+5+•@Õ”' ž)'›¼©ĘF*4*Ežr4žM:—}}8 „GO ū*4*žśĮ­’­~ą (-/' #"'%#"&7&67%632¢žœBŸ;>< õž•Vž?ž?Vž” -öįįö-Cś4 <Bü=ØcB5žžž !% ģģ %!ōb 7IĒ))ž9I7’€€ #"'.5!".67632yż€( żĄ#  £ū##@,( €)’€€8! !++"&=!"&5#"&=46;546;2!76232-Sż€Sż­€ąĄü ąąĄSö  ÷ąSżŚSż`Ąąą`Ąąą÷  öü­’€€K$4&"24&"24&"27"&5467.546267>5.5462 8P88P88P88Pø8P88P˜4,ąD‡€S,4p p4,,4p p4,6d7AL*',4p pP88P8øP88P8HP88P8`4Yžį&+(>EY4PppP4Y4Y4PppP4Yž%*54&#"#"/.7!2Ąšš<'G,')7š‚N;2]=A+#H  ¤  0P¢‚RššH6^;<T%-S“#:/*@Z}   >h—€€.%#!"&=46;#"&=463!232#!"&=463!2€&ž&&@@&&€&@&€&’&&&Ą€&&€&€&€&&żĄ&fĄ&&Ą&&b€#!"&=463!2#!"&'&63!2&’&&&'’'%@% ą&&ą&&ż&&&&žk"G%#/&'#!53#5!36?!#!'&54>54&#"'6763235ųŸ ›žž€Å¹‰‹Œ}øĢźżž4NZN4;)3.i%Sinˆ1KXL7č§§ü* ś§#Øä& *äØžõžŲ§Ī@jC?.>!&1' \%Awc8^;:+54&#"'6763235ųŸ ›žž€Å¹‰‹Œ}øĢģżž4NZN4;)3.i%PlnˆEcdJč§§ü* ś§#Øä& *äØžõžŲŁĪ-@jC?.>!&1' \%AwcBiC:D'P%! #!"&'&6763!2€Pżž°õ ü€&:ż&? €&:&?€€ž€5"Kü,)""K,)’Ü€h#".#""#"&54>54&#"#"'./"'"5327654.54632326732>32€YO)I-D%n  "h.=T#)#lQTv%.%P_– % %–_P%.%vUPl#)#T=@č/#,-91P+R[¶Ql#)#|'˜' 59%D-I)OY[R+P19-,##,-91P+R[YO)I-D%95%–_P%.%v’€€'3!2#!"&463!5&=462 =462 &546 €žŁŁ&&ż€&&ŁžŁ&4&r&4&’¼žų¼¼¼@€Żž¹„&4&&4&„GŻ€&&€¹žł¹€&&fž„¼¼„„¼¼ ’€s CK&=462 #"'32=462!2#!"&463!5&'"/&4762%4632e*&4&iž—¼„76`al¹&4&žŁŁ&&ż€&&}nž  R Ņ  R žzż“¼„f„Oego€&&€5ž—€„¼`3¹€&&€Żž¹„&4&&4&„ Dž R  Ņ R zż“„¼v’€€"!676"'.5463!2@ž@w^ėĄCc‰t~5  5~t‰cC&€&@€ū?Jø°żV©ƒ|RIIR|ƒ©V&&’€#G!!%4&+";26%4&+";26%#!"&546;546;2!546;232€€ś€€@@@@€L4ś€4LL4€^B@B^€^B@B^€4L€Ą žą žąNū4LL44L`B^^B``B^^B`L’€€ąL4&"2%#"'%.5!#!"&54675#"#"'.7>7&5462!467%632&4&&4¦  ž@ ’o‘&ž&}c ;pG=(  8Ai8^„^. Ą  &4&&4&`žĄ ` f°süą&& j©o/;J!# 2 KAE*,B^^B! ` $’ €€-4&"2#"/&7#"/&767%676$!2 8P88P—²Qrž€ @ Užēžģ @ ą {`P¼TP88P8€łž•³P`ž… ą @U @€rQ»Ž¬!6'&'&'&+!!!!2¬¼žŠµ ÅĶžŃĢžŠĶžŠsXVqüQ ü@Ąü@vt’€€ %764' 64/&"2 $$ fžĶ3f4ž:Ę4†ĪžŸž^žŸĪĪa¢af4334fž:4ž:מ^žŸĪĪa¢aĪĪ’€€ %64'&" 2 $$ ĶĘž:4f3žĶf4FĪžŸž^žŸĪĪa¢aĘ4Ęf4žĶžĶ4fמ^žŸĪĪa¢aĪĪ’€€ 764'&"27 2 $$ fž:4ž:f4334†ĪžŸž^žŸĪĪa¢af4Ęž:4f3žĶמ^žŸĪĪa¢aĪĪ’€€ %64/&" &"2 $$ -Ęf4žĶžĶ4fĘ4ęĪžŸž^žŸĪĪa¢aķĘ4fžĶ3f4ž:wž^žŸĪĪa¢aĪĪ’@€€7!!/#35%!'!%jüŒ/dÅÄ Æjg2ż|ž8€€ż¾żĀ«Æżźä55Œžźdc µÕśb¢¢ ’@ō€! !%!!7!įžöüÜżFG)¦ęDūH:¹&ūH€śĖžõ d“””S)æ’U4&"2#"/ $'#"'&5463!2#"&=46;5.546232+>7'&763!2Ą&4&&4f ]wžqž4žqw] `dCõ•Ą&&Ą:F–Ō–F:Ą&&Ą•õCd`ę4&&4&ü ž  ]§§] `d[}‡&€&£"uFj––jFu"£&€&ży}[d€#2#!"&546;4 +"&54&" (88(ü@(88( r&@&–Ō–8(żĄ(88(@(8@¹žł¹&&j––jžĄ’€€'3"&462&    .  > $$ –Ō––ŌįžĀįį>ažŌžXžŌ,جf«ķžüķ«ff«ķķ«ęĪžŸž^žŸĪĪa¢aźŌ––Ō–ža>įįžĀįTžXžŌ,Ø,ż~ķ«ff«ķžüķ«ff«@ž^žŸĪĪa¢aĪĪ€€/+"&=46;2+"&=46;2+"&=46;2€8(Ą(88(Ą(88(Ą(88(Ą(88(Ą(88(Ą(8 Ą(88(Ą(88(Ą(88(Ą(88(Ą(88(Ą(88€€/+"&=46;2+"&=46;2+"&=46;2€8(Ą(88(Ą(88(Ą(88(Ą(88(Ą(88(Ą(8 Ą(88(Ą(88ŲĄ(88(Ą(88ŲĄ(88(Ą(88’€€5E$4&"2%&'&;26%&.$'&;276#!"&5463!2KjKKjŖ žøč šÜ  € f±éžįš  Ģ\Ń € ©wü@w©©wĄw©ĖjKKjK"čH  €  ܚ  šé±f € Ńž¤Ģ  Ķü@w©©wĄw©©’€€   $64'&327/¢aĪĪžŸž^žŸĪβ żą! €ĪžŸž^žŸĪĪa¢aż—J@%ż€% 6’5ĖŹ/ 64'&"2 "/64&"'&476227<żÄžÄijž–6ż–j6‹üu%k%~8p 8}%%‹%k%}8p 8~%<žÄżÄ<žij4jż–4ž–üt%%~8 p8~%k%Š%%}8 p8}%k’€€54&#!"3!26#!"&5463!2&ü€&&€&©wü@w©©wĄw©@€&&€&&:ü@w©©wĄw©©€€/#!"&=463!24&#!"3!26#!"&5463!2€üĄ@€^BüĄB^^B@B^€©wüĄw©©w@w©ą@@ž2@B^^BüĄB^^‚üĄw©©w@w©©ś+#!"'&?63!#"'&762ś(Ąż@   @Ą(@>@„%ü Ą €%%€ž€ ’€ś!232"'&76;!"/&76 Ą Ą($žĄ>žĄ(ĄžĄ   ü”J ž€€&%€ Ą’€€$%64/&"'&"2#!"&5463!2­ff4ž-Ó4ff4f©wü@w©©wĄw©ķf4fž-Óf4žš†ü@w©©wĄw©©’€€/#5#5'&76 764/&"%#!"&5463!2”˜48`ŅžŻ #žū žążą€\˜P\ ©wü@w©©wĄw©¬˜4`8ŗ žŻ #ż@  żąžą`\P˜\`ü@w©©wĄw©©’€€)4&#!"273276#!"&5463!2&ž *żźf4 '©wü@w©©wĄw©`ą&')żź4f*ü@w©©wĄw©©’€€%5 64'&"3276'7>332#!"&5463!2ķ`ž '(wƒa8! § ,j.،( &©wü@w©©wĄw©³`4`* '?_`ze<µß  bw4/ *Ąü@w©©wĄw©©’€€-.  6 $$ €’€ž ’śžŲś’’ś(śrĪžŸž^žŸĪĪa¢aĄ€€Ożā’žŻ(ś’’śžŲś’’_ž^žŸĪĪa¢aĪĪ’€€ -"'&763!24&#!"3!26#!"&5463!2yžĄBžĄ(€(˜ ü@  Ą ©wü@w©©wĄw©]#ž@Ą##ż Ą  ü@ Ķü@w©©wĄw©©’€€ -#!"'&7624&#!"3!26#!"&5463!2y(ż€(@B@u ü@  Ą ©wü@w©©wĄw©£###Ąž@žŚĄ  ü@ Ķü@w©©wĄw©©’€€ -'&54764&#!"3!26#!"&5463!2@ž@####ĄŪü@Ą©wü@w©©wĄw©”BžĄ(€(žĄżģĄü@Īü@w©©wĄw©©ó€`%#"'#"&=46;&7#"&=46;632/.#"!2#!!2#!32>?6Š#  !"'źž¢?_  BCbCaąf\ + ~Č2Ō žĖ  ž}0Ė$ åŸ Ż q 90rŅ Ÿ €p r%D p u‰ü€?#!"&=46;#"&=46;54632'.#"!2#!!546;2üüD a__÷湖 g *`-Uh1  žĻž¢ž‘–  ƒß«Ž}   $^L׃ ž…µ 4’Ņb+"&=.'&?676032654.'.5467546;2'.#"Ņǟ‡ B{PDg q‚%%Q{%P46'-N/B).ĝ ‡9kC< Q 7>W*_x*%K./58`7E%_™ŻÆ Æ ,-3‡  cVO2")#,)9;J)ŠŠ“ °"!*’ #VD,'#/&>AX‚€>++"''&=46;267!"&=463!&+"&=463!2+32‚ØŌŖ§$ Ć žĪĄ  p„”žU9ӑ @é/«*f“²žš oĢ  VRfq …f=S’€E!#"&5!"&=463!5!"&=46;&76;2>76;232#!!2#![¬ žą   žą  Öžæ Ā ×% )ææ žĒ×  žŽ"  žŽJg Uh BžW&WX¤ż½ hU gž¶ ’瀀L\+"&5##"/&67>7> 7!"&=463!2+;26=46;2#!"&=463!2€¼„€„¼ą$=5R9[/*G :!3' ’Ąą&€&Ąž€ü@Ą` „¼¼„ąf±‡vQJ+- ²   (->K\rB  ž&&@ņ  € n#467!!3'##467!++"'#+"&'#"&=46;'#"&=46;&76;2!6;2!6;232+32QŸKt#žÜ ”‹#FŸN¢Qo!ž×"€Õ¤Ÿ¦Ń§Ÿ  ŠÆ!ŽmY ‰Zga~bm]‰ [o‘"³U+žŌ¬€€€żŌ,žÕ­€€ @ż˜hż˜ h@€@X ž˜hž˜h žØ@€8’č€3H\#5"'#"&+73273&#&+5275363534."#22>4.#2>•ut 3NtRšP*šHČo2 LoŌ@!šR(šOzh=Ń,GID2Fżž žĮ žĄĄĄĄī8PuE>.'%&TeQ,j†m{¤ž+§>RĄ{ß?jJrL6V žĮ @`ś 7>wmR1q uWei’½/rr° :V¹żr"’Ī $7V4&#"326#"'&76;46;232!5346=#'73#"'&'73267##"&54632BX;4>ID2Fżž žĮ žĄĄĄĄŠž+§>RĄ{Ć8PuE>.'%&TeQ,j†m{¤ß?jJrL6ūŖ žĮ @`ś ürr° :V¹żr3>wmR1q uWei’½’€@€ \%4&#"326#!"&5463!2+".'&'.5467>767>7>7632!2&%%& &žą&& & 7.' :@…$LBœWM{#&$h1D!  .I/! NrĄ&&%%ż€&&€&&V?, L=8=9%pEL+%%r@W!<%*',<2(<&L,"r’@ \#"&546324&#!"3!26%#!#"'.'.'&'.'.546767>;&%%& &žą&& &i7qNžė !/I.  !D1h$&#{MWœBL$…@: '.Ą&&%%żå€&&ż€&&Æ=XNr%(M&<(2<,'*%<!W@r%%+LEp%9=8=L ’€€ +=\dŒž²Ā%54#"327354"%###5#5#"'&53327#"'#3632#"'&=4762#3274645"=424'.'&!  7>76#'#3%54'&#"32763##"'&5#327#!"&5463!2—øBBżÅPJN±C'%! B? )#!CC $) ū 54f…"ž@@ B+ˆžģžķˆ,A  A+‰&‰+A ż ZK35N # J!1331µCCC $)÷©wü@w©©wĄw©é2ą«"33čFžY§F~ž‘(-&"žņo’4*)$ķ”(*¶ (&;;&&:LA3  8œ33œ4ż±S,;;,W­°T+<<+T;(ĆĆ\g7Éx‚:&&:‚:&&<ržåžŪ%-ü@w©©wĄw©© ’å +=[c}‰›Æ#"'632#542%35!33!3##"'&5#327%54'&#"5#353276%5##"=354'&#"32767654"2 '.'&547>76 3#&'&'3#"'&=47632%#5#"'&53327Ė''RZZü:kžČid YYY .06­ 62+YY-06 R[!.³'CD''EH$ż VVĻX:øżø:Y X;·ęø:Y üfyd/%jG¶%EC&&CE%O[52. [$ÓC-D..D–^^żĒīž†* lžy1%=^ÅI86Łżi077S 3 $EWgO%33%O­O%35 ĀŅEEŅFżWźt;PP;pīźt;PP;pžqžńJŠgTžłFÆQ%33&PÆP%33%Rž 7>%3Šž‘!+}’€{ö'+"&72'&76;2+"'66;2U ÷&ļ ż” ļ(Ź żšP ļ*ž­'ńežJ."Ą-düZż™-n Ž-’€€'74'&+";27&+";276'56#!"&5463!2­~ø}Ä ¹7»že ø žü™Ū©wü@w©©wĄw©Ż" Ųž¦ $Q #ż'ž!# ÜÓˆü@w©©wĄw©©/4'&327$ '.'.4>7>76 ž"!!jGŽü~ŽGkjGŽ‚ŽGk[J@&ż€& @–Ąl„AIddIA„lĄl„AIddIA„@’€ĄŠ '5557 ’īžŖž,žž“VWżQVžž®.Ržž©Wéž®ž=žĻžć?žälžŪ%l`žäŲžćžŠžņžńžĮ~žĮžņ0’~#%5!'#3! %% % ż=“ū”#y üŲĄ ż?R«'żUŹaMżŸµŽ|žqBy•y‡——[żC#ąż–jXA–AŅ·’·ļž˜‚hĶż·UHéżG¹’€€/?%##"547#3!264&#"3254&+";267#!"&5463!2R‡€Ü‚Åžč#-$žäµ€µµ€Ń(®((®(®tQūŠQttQvQtnˆ?D~Õ|ĄD?żx##³ųÆÆųÆ“„))„((ķūŠQttQvQtt’€€2#!"&54634&"2$4&"2ąw©©wü@w©©wš|°||°°|°||°€©wü@w©©wĄw©üذ||°||°||°|’€€ !3 37! $$ Éžn6^ž5ž5^h ūĪžŸž^žŸĪĪa¢a’žĪą³żM 1ž^žŸĪĪa¢aĪĪ’P£ *Cg'.676.7>.'$7>&'.'&'? 7%&'.'.'>767$/u5'&$I7oĘb?K“\[zäH,1žŻžķ+.@\7<äÜ?5\V ,$VĻÅg.GR@ ß7ąµU,+!üžšų’  # "8$}¼{)›<„?L RR ;kr,yE[€˜z# /1 "# #üeCI0/"5#`Ä ””"8ø§ž4~&p )4 2Č{¬H- .%W.L>’€€':Yi4&67&'&676'.'>7646&' '7>6'&'&7>7#!"&5463!2PR$++'TJX„j7-F¶C',›©,&C ."ĘŅ!$28 ”žh¢ /ł³"‡ +pŲžń„^&+3$ i³µ0(©wü@w©©wĄw©š+.i6=Bn \C1XR:#"ż'jj š8Q.cAjĒ57!? "0DŒŹ$4" P[ & 2ü@w©©wĄw©©N’€€#3!!327#"'&'&'&5#567676†Ūlž” '2CusfLM`iQN<:Ŗ[@@''€ž|ńžvˆ$%Lņ02366kŁ67MN’€€#3%5#"'&'&5!5!#33276#!"&5463!2cXV3% žī¤ 10D*+=>NC>9ź©wü@w©©wĄw©µ8c'µ#Z99*(£žlN+*$% ü@w©©wĄw©©’@ż#"'&76;46;23õ ž¢  ž  ąĄą&ž€ €ąū ’żĄ++"&5#"&7632ż ąĄą ^  c ū ą&€ ž€@ż#!'&5476!2ū &ž€ €ąąĄą ^  b ąĄż'&=!"&=463!546Ą ž€ū ą&€ ƒ žž ąĄą ž¢ ’€q&8#"'&#"#"5476323276326767q'T€1[VA=QQ3˜•“qp¬Hih"-bfGw^44O#AŠžį?66%CKJ°A}}Ä !"ņ䒐""A$@C3^q|Ęz=KK?6 •lk) ’€€ %!%!ŖżVŖżV€üu‹üużu^-ēżm5żwüī}•nüę’€~7M[264&"264&"2"&546+"&=##"&5'#"&5!467'&766276#"&54632Ż  ¼  üū*<;V<<O@-K<&4'>&4.'.'.'.'.'&6&'.'.6767645.'#.'6&'&7676"&'&627>76'&7>'&'&'&'&766'.7>7676>76&6763>6&'&232.'.6'4.?4.'&#>7626'.'&#"'.'.'&676.67>7>5'&7>.'&'&'&7>7>767&'&67636'.'&67>7>.'.67— \ ž›U7  J#!W! '  " ';%  k )"    '   /7*   I ,6 *&"!   O6* O $.(Ø *.'  .x…,  $CNż”    £  * “ 8   7%&&_f& ",VL,G$3¤@@$+ "  V5 3"  ""#dA++ y0D- %&n 4P'A5j$9E#"c7Y 6" & 8Z(;=I50 ' !!e  žR  žš "+0n?¢t(-z.'< >R$A"24B@( ~ 9B9, *$        < > ?0DØ9f?Ae ‡ .(;1.D 4H&.Ct iY% * Ā 7ą ģ   śČ  J  <    W 0%$  ""I! *  D  ,4A'¾4J" .0f6D4pĘZ{+*ŸD_wqi;ŠW1G("% %T7F}AG!1#%  JG 3 ’€€ '.2>Vb%&#'32&'!>?>'&' &>"6&#">&'>26 $$ *b6”~ˆ#øź„= žÉž–XP2“Š{&%gx|ŠĄ .ÜŅĒW)o”üńO¹ųLOƒsEzG<ä’ CK}E $MFD<5+ zĪžŸž^žŸĪĪa¢a$ńMWŽM –“1>]|įYY›^D ÖÕ„Aņ—ļ<ļęKåm‘¤ŖŌE6<ž"č² @9I5*Čž^žŸĪĪa¢aĪĪ’€€>^4./.543232654.#"#".#"32>#"'#"$&547&54632632•':XM1h*+D($,/9p¬`D€oC&JV<’Z PA3Q1*223ō©I†oBkįŸ‚hMIžū½oPįŸ‚hMI½oPŁ2S6, M!"@-7Y.?oI=[<%$('3 -- <-\ƒ%FuŸįPo½IMh‚ŸįPo½žūIMh’€€#< "'&4762 '&#"327#1"'&'&4?6262Ėżµ4—5żµ55K5–5 žr¼*9;)x**–%<'k5‚xż& žiy ,ü>*żµ55K5–5K55ž÷žq¼*)y(;:*žh )k5–=x*ż& ˜*xü?’€€/%4&#!"3!264&#!"3!26#!"&5463!2Ąž ą ž ą &ś€&&€&ĄüŽ€ż€ś€&&€&&’ą19#"'#++"&5#"&5475##"&54763!2"&4628(3ć-÷ &ĄB. .BĄ& ÷-ć3(8Ig€gIž`ƒŗƒƒŗą(8+U„že&žš.BB.&›„ž«+8(€kkž€`ŗƒƒŗƒ’ą%-"&5#"&5#"&5#"&5463!2"&4628P8@B\B@B\B@8P8pP€Ppžąƒŗƒƒŗ@ž`(88(`üp.BB.Šž0.BB.ž (88( PppĶŗƒƒŗƒ’€€!%>&'&#"'.$ $$ ^/(V=$<;$=V).XĪžŸž^žŸĪĪa¢aźŁJ`"(("`JŽž^žŸĪĪa¢aĪĪ,’Ō’I4."2>%'%"/'&5%&'&?'&767%476762%6Ą[›ÕźÕ›[[›ÕźÕ›ožÜ žÜ“ “žÜ žÜ ““ $ $“ " “$ $ ““  źÕ›[[›ÕźÕ›[[›5`žĪ ^ų ų^ 2` ųų `2 ^ų ų^ žĪ` ųų ’€¾1%#"$54732$%#"$&546$763276ī68¶žŹ“hÉ’f«ķ‚&^ž…ąœžäĪzsÅ™,!V[’ś”vn)é “6¶Ą„<ž®×‚ķ«f{ĆĖózĪœ™Ģ}))NĻs”ś’3(@’€Ą€ +4&#!"3!2#!"&5463!2#!"&5463!2@&’&&f&ś€&&€&@&ś&&&¦4&&4&ü@&&Ą&&¦’&&&& ’ `ĄBH+"/##"./#"'.?&5#"&46;'&462!76232!46 `&ąCŠ6Ę@Bb0€3eI;·Ź:ą&&ą­&4­L­4&­ąžFż€» »Z4&«wŃ4Å) €ü€'' Ļ5ćr &4&&­4&­­&4­žŚ…»»’’}G†3#&/.#./.'&4?63%27>'./&'&7676>767>?>%6}­)N @2*&’@P9A #sG–q] #lh<* 46+(  < 5ŗR5"*>%"/ +[>hy  ’Ŗ÷K !/Ui%6&'&676&'&6'.7>%.$76$% $.5476$6?62'.76&&'&676%.76&'..676£#"NDQt µ-āokQ//Ńjo_  ž’’ßžŪ  ’ß%&JĮžżžęžōՂ‹€©YJA-‹Ö.-- 9\DtT+X?*<UW3' 26$>>¬W0 {ņü"F!"E ›   ^f`$"¹_]\µ<`”Fķ’`”FķŽDƒh>Cw·ls€©†J@‘ ;=?s  :i_^{8+?` ) O`żs2R“DE58/K`€˜ &1:%#"'>7&54&5#"'>71654'6&5%z‹xbŠŠž³‘»€€‘³Ä(z‹xbŠŠž¶’……A‘³Ā£CC=°gg°øžØ³žŚF˜ĒČ0™˜ĒɖF(“U!ü,CC=°gg°øžØ³žŚFšÅܗž ɖF(“U žŠƒŠf5B_<õ ĶŽ<ŃĶŽ<Ń’’’€žŻ€’’’’€„€pUĄĄ€Ą3U3€ō]€€€€€€y€n€€€€€2€€@€€€€€€ €€€€€€€€z€€€5€u@€5€5 €€€z€€€€5€5€€€€@€€€€€€€€€€,€€€€€€€€€€s€€€@€€€@€€(€€€€€€€€€€€€@€€@- €M€M€-€ €M€M€€€€€ €€€€€€€@@€ €-€€€€`€€b€€€€ €€€$€ €€€6€4‚€8€"€"""""€€€@€€N@€€€ €,@€ €’’€P’ŌBp®<$‚HĪś<¦üTÄfüT’ą H Ø ž R  Ś , š D x Ź 6 \ ¤DØL¦XŠā*ŖD¶x8”šJ¤NĄ2f²ö$P˜Žų`Ö"Vt¤źLv¤š$~Ą*‚h¼ž 6 n Ø ā!&!v!Ę!ü""p"¼#&#˜#ā$8$Ą%%f& &¼&ü'`'Œ'¼(*(‚(¦(ģ)")X)¬* *B*¦+,n,ä-z..:.’.š/@/ˆ/ę0D0¬1~1ā2l2ą33R3Ģ44>4¼4ö585œ66V6¬7"7²8P8ą9|9Ź::b:°=¾>>l>–>ą?R?Ų@l@š@ŌA²BBxBāCCDC®DZDīE–FrFŌGDG²HH®IFI¢IĄIŽIüJJLJ€JžJ¼KK\K®LJLČM*M¾MųNhNģOFOČPPjP¾QDQ²QīR2RjRČS2TĢVV’VśWLWxWÄXX\XØXōY@YjY”Y¾YčZ0Z~Z¼[[6[’[ī\V\t\ø]6]x]ā^@^ˆ^ö_d_Ā`$aa„b(bhbŠc2c€cŖcždle?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqļ rstuvwxyz{|}~€‚ƒ„…†‡ˆ‰Š‹ŒŽ‘’“”•–—˜™š›œžŸ ”¢£¤„¦§Ø©Ŗ«¬­®Æ°±²³“µ¶·ø¹ŗ»¼½¾æĄĮĀĆÄÅĘĒČÉŹĖĢĶĪĻŠŃŅÓŌÕÖ×ŲŁŚŪÜŻŽßąįāćäåęēčéźėģķīļšńņóōõö÷ųłśūüżž’     " !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abŅcdefghijklmnopqrstuv”uni00A0uni2000uni2001uni2002uni2003uni2004uni2005uni2006uni2007uni2008uni2009uni200Auni202Funi205FuniE000glassmusicsearchenvelopeheartstar star_emptyuserfilmth_largethth_listokremovezoom_inzoom_outoffsignalcogtrashhomefile_alttimeroad download_altdownloaduploadinbox play_circlerepeatrefreshlist_altlockflag headphones volume_off volume_down volume_upqrcodebarcodetagtagsbookbookmarkprintcamerafontbolditalic text_height text_width align_left align_center align_right align_justifylist indent_left indent_rightfacetime_videopicturepencil map_markeradjusttinteditsharecheckmove step_backward fast_backwardbackwardplaypausestopforward fast_forward step_forwardeject chevron_left chevron_right plus_sign minus_sign remove_signok_sign question_sign info_sign screenshot remove_circle ok_circle ban_circle arrow_left arrow_rightarrow_up arrow_down share_alt resize_full resize_smallexclamation_signgiftleaffireeye_open eye_close warning_signplanecalendarrandomcommentmagnet chevron_up chevron_downretweet shopping_cart folder_close folder_openresize_verticalresize_horizontal bar_chart twitter_sign facebook_sign camera_retrokeycogscomments thumbs_up_altthumbs_down_alt star_half heart_emptysignout linkedin_signpushpin external_linksignintrophy github_sign upload_altlemonphone check_emptybookmark_empty phone_signtwitterfacebookgithubunlock credit_cardrsshddbullhornbell certificate hand_right hand_lefthand_up hand_downcircle_arrow_leftcircle_arrow_rightcircle_arrow_upcircle_arrow_downglobewrenchtasksfilter briefcase fullscreengrouplinkcloudbeakercutcopy paper_clipsave sign_blankreorderulol strikethrough underlinetablemagictruck pinterestpinterest_signgoogle_plus_sign google_plusmoney caret_downcaret_up caret_left caret_rightcolumnssort sort_downsort_up envelope_altlinkedinundolegal dashboard comment_alt comments_altboltsitemapumbrellapaste light_bulbexchangecloud_download cloud_uploaduser_md stethoscopesuitcasebell_altcoffeefood file_text_altbuildinghospital ambulancemedkit fighter_jetbeerh_signf0fedouble_angle_leftdouble_angle_rightdouble_angle_updouble_angle_down angle_left angle_rightangle_up angle_downdesktoplaptoptablet mobile_phone circle_blank quote_left quote_rightspinnercirclereply github_altfolder_close_altfolder_open_alt expand_alt collapse_altsmilefrownmehgamepadkeyboardflag_altflag_checkeredterminalcode reply_allstar_half_emptylocation_arrowcrop code_forkunlink_279 exclamation superscript subscript_283 puzzle_piece microphonemicrophone_offshieldcalendar_emptyfire_extinguisherrocketmaxcdnchevron_sign_leftchevron_sign_rightchevron_sign_upchevron_sign_downhtml5css3anchor unlock_altbullseyeellipsis_horizontalellipsis_vertical_303 play_signticketminus_sign_alt check_minuslevel_up level_down check_sign edit_sign_312 share_signcompasscollapse collapse_top_317eurgbpusdinrjpycnykrwbtcfile file_textsort_by_alphabet_329sort_by_attributessort_by_attributes_alt sort_by_ordersort_by_order_alt_334_335 youtube_signyoutubexing xing_sign youtube_playdropbox stackexchange instagramflickradnf171bitbucket_signtumblr tumblr_signlong_arrow_down long_arrow_uplong_arrow_leftlong_arrow_rightwindowsandroidlinuxdribbleskype foursquaretrellofemalemalegittipsun_366archivebugvkweiborenren_372_373_374QøŒQapache-couchdb-1.6.0/src/fauxton/assets/img/linen.png0000644000175000001440000025213612332105522022473 0ustar00djcusers00000000000000‰PNG  IHDRŽŽŠhŅtEXtSoftwareAdobe ImageReadyqÉe<"iTXtXML:com.adobe.xmp ’“ä°KPLTEŅÓÕÓŌÖŌÕ×ÕÖŲÖף×ŲŚŲŁŪŁŚÜŚŪŻŪÜŽÜŻßŻŽąŽßįßąāąįćįāäāćåćäęäåēåęčęēéēčźčéėéźģźėķј¬P{IDATxŚÜ}ėbć8Ī%JNUÅqŖß’9w:–Hb “źžo/šteā«DB$.ēŠĒŪõŗæææ’õńćz»~Ü®æoæ®æÆæŽ?\??®ļ×ŪēķćśńžłóķÆėķćz½Ż>®ļļæ~żzæ~\ߎ?¾½_Æ×÷÷_?üx’üżńžqūųüü¼Żnæ®·÷_æ~]ž¼^ž,ļ’¼]ß?Æænæn·ėõććv­ĒūƟæ®×÷ėēēõśły½~Ü>޽_Ææ_ßoŸ·Ļßż¾}Ü>?nŸŸ׏O9>źQßõł~ūüųų¼½·Ļ½Žn×ėķóśńńńq}’õńłūóććöł~ū}»żõūććvūü¼Ż>ŚēÜ>>>?o·Ūļß·ėķöłū÷ēķöł×ļėūķö^/ļ㯿~’ž]Nį÷ļßżõńńq»Ż>?ßo·÷ėļæ>å}×Ūļß·ŪĒķóóććÖĪ·}ļļæn·ß·÷ĻŪĒĒēļĻ_ļåL?o×ėķvķ×QÆK®³oˆėĒēēķćóöqūż×ļĻŪēķżśū÷õśžėżćöq•q}æ~\żüÕ>Węįöėćöėśł~½}Ž®×›ĢŪÆ_æŽ?n×_õņ>?nļæ?ßüųłėżżz½¾æżü|»~\ßżśõž~żø•÷’õöóóżćśqū¼]߯Ÿ×ßŸļæ®æÆænæ?®·ėķśććÆ÷÷÷żz}ū ˆI9%DÄņ""‚O°ź’ ż_ż|æN€råbź™ĖĖĢ/TWK$ļ+§T^$/óß ““«Ÿ öO}™u|dźd`ŌĮ9§É|ł'}u~† Żóõ%jŽż “ó’+”‹O)k‹‹Õ Ė©śńVŽĖŪŪåķryė_X.śR~zćÕT32Ö§×W†Ž|ü0łĒÉŅĆĻ©“6>>¾›Ms3``–W000sV?ܞ(Æayß`e“Ū†&×5\t«Ÿ^·{7 ŅųzŪ?ū™d’¼™|e ņ²n7õÓė7¼].ÅÖŹńƒ‚X"¢333s³fŠĖ ±rswS»CŹ’T‹'ątdÕB\?ņøü¶r„-ČæaŪĀźńlul« ˜ÕO]̰xB1ēņ(OŽrņÕŪo†ŁkŪ…»‹.Jm5ń—1Ž62}`Ś`mŪ¶…Õøö§^ÓlI6³m† ša¶„Čī.}WÕĆ ķńņ­9W3¤;¦Č×m/ä˜SN)ʔRfąSĘöbʜsŁ)#Ÿē#Åćcäóä|ʶep:Ļ”sjó’sN9„Ģ™9ēzżĄ %€t&ęcBę˜‘sLĢ91·;SĪ1Ē3¦œNِ ~Zy—æäcn}dD`†¶‘qN)ÆĖ 3«iŖkSµö½īĒŪL×÷uĪ@}Mūārźz‘ćų:¹®ņØ\·¼īL9Å3ę˜s:Ļ3Õa攙SĢ,ćšbLĢé”q—y(ŸĻ9„œōצœSūø”sŽgęóä:ķ1™“cń˜Sāœ"œ{HȐSL œS±«œSĢÕģ2Žiq„@Bō#ßOVūvóČ2^’±>‡Ż<ØłT«Ķ{ō1ė½ mœśŽ~5öǰŹ._'®”½NyųłūO[ž#B_Lõ2¶Ś„Ū抶šéėŪ¼ōyz8ŸnڟŪH5¬ĒÆĀ?{ŪŅ'óŌ|IœzšH »7G?¼ĖĶYv“aśµ’÷ē‡š R?m²žł7æs˜D:ø’x'šśŒvo|Eė3~ßWĖöóęÅż ųśą•csóĖpößĪéf˜śc%šę“ZU|„Z=3µzXß±®»ōOWĒržŠÆ“›™ójDæó=õ–¤IF ®žķ:mLžäóŪøŹHO¦Ś?YOgæDl“’ŗ„ąjDJ" zįĶ3)æ”/cŅœÕėXzł€ņœ¼.ĖCņŗ\’éöä=Ż+ļ_łh²Ŗ!żóÕ«—»NyüŸÆ¾åDæ}^KŸÖŽ£œ³÷™Ū¼ōyRóźēæĶ›¶7’Īz8+k Æ&g'%–sU¾,;ĆĖę,ä^^š»É.Œż.œE«uCķkjVé•Õņé æģĶ_ĪBÖ³§>Ū+»ił‘U±ÅKo~ęĆźµÖ^€½ĪU0o>æĻ• m]«ćl²†Ż.ėyēŃ.f֓›q©Y{!AO?Č’Ą6™«mŁDš²cßćēžćځT!‚d€ ĪČk[óf²„}<’^}’xõj™a›/ŸņŸÆ¾åDG³Æņ5gøc}}‹¾#ĶfMĶhßuŃzuŚ8pzŪ’×YÓ#œYj ēa>8ڧżad]'XīzT•qŗŽ”Ļ’m:棎xʘŅyēyg)żH݊[^1eąœ1e¦,g“3—]NĖ}Ü"įĄLÄ<©>.Öb؈ €Ź†ż²ļ—½ŪB Ä7€@Ģe„©œ 3”%:eŹ4…’‚DBĪ ‘‚¬Ž3pf$,ÉĘö¾™ |®|OY…™Ą†"…¶­žīeß/»\‡\—\§$Õū8ø"`y<“H½Žk.¹V@Ī }ˆ3ABäœrjyI–Šl™Ōó8Īó8Ļ”F+ˆńŒgNĒ‘!‰ŻœēyĒqæ1§¶³bw%)™uøŃåÉQbuj‹jƊ@†Čßņŗ'›–ŻŽŚėCŲ¶m+æĆ¶l­Z³õ?śßķu%÷ž2?<€qQDҾøŽšb™žXžMqõŗE™ø}5;^Ī[]pŠ~©śļÉ?ż¬Œ3>q.|Õ«Uk®Fž6vP…č{ AgŠ°ŻŚ(Łä {`2v¾ł÷„m~čZų2LU§™gš…ąŃ–:c5 1¼/é"e}Ő`’©‡uī_źĮŻēö²%K\lHød›ˆ‘ė˜¤ŻŚÅ?Ÿį}jŁy˜ šˆ©4VÅNtÄ­mÉ%ÄÄ×%7!¢aÅķ!łDÉīŪŅ»†D |'9ڌ nrvŪķŪĢę °·ķzŪBŲŗ‹/įåü¦Čß<$ß"’|÷ż+Có”óö×cĒ#<ŸĶnń-o\oŒļ¤±µ™ óŽģ¢ŲÉ`@ʦ(„ąĢF_„­)©ŽwÉ æ„z`ź9 0 So<ś Jb’pœ­Ž‹›ß®Žż?‡4ņb’K“퐹šŲ÷łś«Żf‡ˆŠB¹Ž¹ē_qcšśŽü’[— ¹DIÖŪŠ Xģ¤ĻĆ`Q9§v°@€ģś(¹†mß·öP. +U.½ 1;¬Ā3ߑLyYĻk»9…1²–æÅń7³öÕ5ŌĄmHŹØØĶŚĘHO}¼oõ¹ź«‡=±81åĢW×eƒģł…:€³ČZĻ|G‡ģ`¹u}ēķb××mj°§ęcC:3'ˆ 1cŠe÷ éĢłlEĜ3§Œ˜KJ4q>ĻĢĶŚćyĘxž±€$s*·” n:gĮ/ś½äü:Óבīņž³ÜŠg,\‰(ŽæBUDꕐŪy¬×:²l,—˜R.ŠEy[čŖˆ]ˆ“ó¬;Ō™ó™ ßÅĪę!q>”üqƒgõecéz«Šƒsę¾éP[Ł Fh +ĢpĶŲ@"ĢĪiRģā“I:uš½”_Ä \‚Ž ąwņń¦|·æ¾Üźłsē­|Jf`īŗ¶€ ŪźN7w9©v¢õ“[mŗō­ŌŅŠā«6g¬\—sᲟ«YČ<ˆ +„Fwrüõ=³#c{©ē#ańnÉ“Y)zõ”©A›ōꥣ"B¤]ł Ū¾ķż<-~o" EµæŌ€Ņ:ł2›G=FĢČÜĮĀ`eŽžƒä{ä~ņŁ)•^°×1õÅżŖØ}ņ:ž›Ś1÷ę½>˜Dj0?5•–sē|u•;¬]UÓ#S~lUoI,ģŪ¶mūą‹ō4gŁEZ _EmŲ:žīŽšK U5 BB ŃY„ٽĖ-?1•08ĘżŹ©¤IĶfĪY”®Ń€pž/ēļŠP”ŌŪĀŪ W¬Gˆc=Q9e]“˜…ˆCµĒ€€eŸ™‹ƒ+õys¹5Ķ ŁĢ vį«qĶ“­v„k^ŠĆŌšžyó*øŸö·6ƒ£åńłõ¦V>O|“Z~ųW›õ‹ØYöóå²_.ūå"tŹ~3X(Ał-Q×- ³ ūö9õs…D'ßė#p†—±jÓĶŚĻS”‚²ų|Æŗž~·®ę׹dß&¾Z„6jҰ^•)4Ų1ÆŠ«,1„˜’8I Kś‘;¢š­ć«ˆ@SS%jłLļkśĶzäI—aÖÉM “Ś%«„@ų .ŽŌ żO1MĀ` ™ Æ_C5l~?lØÆfBlõ›µJĄ•y!2˜€WќŲ,:ސĶD+ąšŲ…ÆĘianŁźMż\’„ŒĒ/ŗ4÷SßŃŗŽĶĒh+ƒŌĻZ>ē‰ļ(~NĶ ųRæOl,Į’ʬ@™©ĻžĘ†…( ²+n™Ķ‘ņtš°`ž›_įjŅę“ū"yC_Pf`ÆcZcö‰/MiŁ–:®Ļ|Gćć‡6‰dāQå<¾ź;v%vWīK’<’Ū¬WE'y¾fßv“2&Äq”ŗ¬śGp¶ś(²vz >"÷7ŻĢ ū–ĀEÆ šXm¾1!Q¬-\Ł@Ÿ‹5ź -4QŪ¢­ĖēŹō⫯ŽõŖXN95ēÉń“}~pØ1×ńvŚO#ėnnĮąPUĘŪź”l@ģĀ/«å£—U€™Ī 1c>r¼ētÆõ—œć~æŸ1ŽżÓqę|~Õ#ßæR>ćyĒqÄć~æŻ’üēėė~’śśśŗĒżėėž÷ßĒ×’śJĒqĘxž‡/¢Ż’óŸūż?’¹KÄłuæßļĒy܏ņµĒQž’×ūń¼ßļĒ!v–ī)ßc>2ęł$MæĮ×É]’Ē”s¤#·Éė¤|1g¶šJPĶÜ_öż"ØY\½ń)ŁõĄ'!™ZsS㨤"~µŗ“z|Žś\›t!€˜Öź:^Ąå›…Ī§g]ńo¬Yx=ßĪ­jņ¾>`ŗŹ."vÖe9 2'ē“(ć¬HŁõŁ¬ĢźęQŠ[]³¹ķ¢V~£÷=‚2ćˆ³dpü‡¦åĢÆźäyŹÓ?gM[ š8’ž{edžŃ5Z-(?žcŽxį?Ŗ…¤}BqjTUæŪ@ūšĻ3¬ī#ØBLBŗ*6ZE^¼<čŠń¦«ŌV•Ėņ~gÓk ¤„2˜SūÉI¹¦’Ȅ̻Zg$ n>ŽCŃ>C&-_WĒ[£¦•Æ ćy·ż›cuīüx¶q^¬öģ !VķĶjb5†&<•źŖ»n·³³ĀSŹŪ„'Ū(°yJ]”#čĮgŖU/fĮØŹ7<¦ĻćČs·ļCƒY˜kqōaYåæĻ<“Ÿ£æĖC*¬]‡K³ÆP÷Øń‰‹[ĶGŲ®śßé¤)ž¾eg¼Ę‹§. \ä”bL1­ˆ­rž–PÉ ļ’^ÕŅddx(Ń`¾V^­ =xZ«} `s‰YŗŸŠ•·Ą¦’Ųw”ĻQŸūŠń“āÕÄŪr\źOēG«}Ÿ+K!gm¬¦_Œó\ž@ EŻĪē˜“qXĢ2ö|¹ŹƒÕ<€ĘRĄM€ģ|ę;¢Éb²)ćNø-f-V»ėóĪ‚ó›ŽÄČ|‹ČŚ4,¾£>Ws‚“K†Įļ/9³Ļg¾£K„ r¢MæNó悥üĄąjޱŁ(åƒ5®ķA8§Ųѝ:MN×Q§J% [ŌX[¾OóY&›łt=Mśžf%6R–„‘uÖyHY’©ļ(Ÿ£óŒłAd-{İ:N.q¶lN6c;žNppę{ź)&“C|śōÓØŽ;2'Ė®+vm_.yGÄ®3L[ąĘA(£…üė4-@Šgbȉ9Ę•L™›xÕČāqB>ä‘ g®);åKpS  0„ aŁdJŹĪ_^ĒÓä¬óHc̩ܵŌ}˜zYĄ1ĘĄ!sģbGM—É*) "ΜS <«Y3P@Č)sf`yŸ|N’žņ‘3`ę‘r,€ ‚/léģŅ·M„Jp/g€ŽGĶŖœ$Ū)„€!P+ijk®_Č9!Ņ™! Ļ:gÉ­B”²¤˜bdN81č2ƒ„QÄŲīŸś`ŲØ+V#R½ūl½•/$­Ń5ʼ×jZŗäe “dTž±j±’Ž-€ćŌd³Ŗ]Ōҁz ˜­–Æ0ÅBJUĮŠ2FX0l[Ē·X¦Kµ¼OHßóĄI‹Yk••—$£p5¦ß|§dęSF¾ėģüųAul J±;µmd­INNs¬¾„”3mŪ®‹8šÉ”·āŅß¶½½eß+.a«ØÄ}=ąJvŪ<ųßkūŌ:ó¤*§ÕŽVęˆFœö©$”D~=BÓ±fŹJÄŲ"¶5Dqæä}¢fćµµxˆ˜m~ĪūF#Ƌ°–Š‚)l³æKY{uiOžŲ*MS”°÷:ń…ŽøuāF5 i"ä@Ҷ·o›—‹˜(t±S}5Ī„Dk –ļnwK‚®Ś(°NEX¦@ jÅęefÓc²Y€øT”ĶHnޚ}ó(é9w1'µÖ4²ÖŒ ĖzŌŌzžņŠ×gæ·e\ės©ųmŒ–ņ ”T# ƒv‚:ģ*Ńd'ØėB©XŻT“¶k!>Ŗö·±·8޲R×<~1+®|AMm–¦±RÓ©±ĮķRøxŒßWHcQƒņ…$€Ź’ū„ÆŌ\U¾ń…{Ž—Ą2ø« ¤B1?QÕŗ}żģyÓæTy/ģӈóńšyĻ:˜Ź¦Žł=lÖ2±2ĻuŽÅŗe;Qś:WŁš‘‡2¾ó8Čõ3™$œ5[¹vWčĄ¢˜§ś“»Ļ-ŽŌ5oĶ{–›°e¦vÉŪÕ ÷®8”Äw-ŁYka†›n§WV½•”c_ŁČ x|f œŪ×öŁź^XŹ27klŖĆøV»­™¾]—Üņčw/„Y&ÅĀÆH?A£†Õ‘a’zvĶthÓĪćŽ}GE‚Š&&>A'wŸA|ń)Ä}ō÷²÷M¼Ą“•ĶčIWœšųJŲsĶÕ.<Aļ—#{ŽWŒ&¬Uäe¾z5Ń+0g`© Õ!ŚÕā:”‘ÅĘ(ŖXĘ«{{ߎļ7AĻ$†˜BĢĚ®TWßQß¶-#k`ŌŠ>Qµś»‘uu\dŻÜz/Ą4v½āÆčüóŒgį=“ ¾˜§=ź•$YópæOĀźf‘õ}õc¢ūųś}śä¼ æ÷E™’‘µī‹#ҳ*²®_üŻČ:i ß,ĆR’ĻČD“ĢCY·¤č Öū¶ŻB˜bFs· –č%„Ŗ¢œk¶©ž®™ÄŠ\‡”€;ß²ō "”3ą™0‘ä§rŠ)sźoHŸsŪō” )é]DN“ŻØ€ž·}ßHĄŃa»ģ!lūžćmß~ühooo?Ž.ūF?vŲö‚Œ¢@uū# ́H.„4e`&€ņœō% @§·o°’ mæ¼żx{{kŚ?~lūŪ}ßBŲ/eµŁ÷}§mß·B¢˜öI\$‹mĪKÓcĢuč„3“8§˜²ä“)!e,ó vŠßRjĮC@iDS•”I)g;(¢fģ¾ŹT䜰o|åü u’+ėjÖęŽŸäł¼¹<"o$Š_:HēžŌųŠMøŚ%¾ iOźQÆéUÉNQł8ōŅėÓL/uT˜ųn4AmĖlU™ŸčŃöĻ#˜2%J?O õÖ䏗™ó€ £ZU;{ȄUh›•®ĪkփĖY=Ķńéų@ÖŠļźK\ā"ʎšS5Äę1‡Qķv!Ü7H_PkLÄzł+f"Ńk:ˆsŻŹ1Ņ}õ{—bīļgBwCD]$ĻqéMżld(ÓŖnWīųĶī~{DO=<Öä}͚ŸN“ÄFĶs”.uß„ŖŅŁly³$D%wū7g,. ƒõ««£H5JėĘ”ęĢüž© m\-:„¤©ˆB¾ŗ:āāB×!UēĮ·šĒæžGE:'3;¤ZĮXšĆAŹĪL¬D &o+‰s©Y/=qčķՓU×Ó¾Yo}³f‡›T}I!P ’¾½ĒåCŻ./²}ū}ügżo¾¹8ĀJH0kPJļ ”WxUU»īļ1ēĻ}³Žśf½ź6Ū«=ŗH°Œ=W¦7±K’_UāEč¶MnS«,šwSTY"åöÉ®aÅbzyՀ!­+bŹ)åūq܏ūż˜į’¤}œēQĖē÷ūq?Ž»ō¢ōtżĒĘųŅ.`¦°%ŽŲ·xžXįK•šFļģŠwɎ’yč)d³».¹2¾˜#{¾ļš$›—ų RL©€ĮpTCaķŚܝr¾””ń?’ż³åQØK·æē!É·Qᓁ^żŽǧāŲŖ "L,­ļØ[B#F.~höQcˆ.…dŗ¶AKLńł WfµśČډiO"kūĻ"kĶßÅlĪēCgž?®eU€8Ńsu ś~(Csµq™ƒņźźøŗČU`mdM‡XG1é^ެ¹ūÜ:²žšÅ,²¶”ēŹ`Š„‰9F„˜r±ļYųšˆĀRÉĀ€øļE8_#ŻIōĘBUDœ]›Öżh»l„N¶µl=2åÄX…ÖoåĢ4­³ī1ž1* uƝ§šˆ-%xˆ )aµī¤P(Łg̜äBÄ8žž:ÓqfiȜsŽZĄWibf"((ĆžqFL«÷qN)Ö/H)Å|éüśū(€ż )si՝å\ėūå:0%ąĀo®—­ĒAČŲ1ž1Šļ¤¢ņ©ūē0 §LÜ|½¢.I“]6 —½‹®TųdÕŌ ¢‰¦m!”ÖūŽÄnjz1Ųķ&PN0Fę„vQ”ź§Ź3ÆwČŖČć¬ņ˜ŗˆ ·ƒ'«źŖØ Ft ė„ Ü¬]­«%[|R©^īū¾9@ ų×95‡1L³ŖYŖF\_qf” „~łš1ƒ»ļŌ3¶Ķ"’œ³Ēõ2w’ŗ¹ģh Ž"L;#_`5_~…©l]„UU»uYŠį Šā©0ĪGq‚{4jJ[wwˆš=xkĶTr¢g-ćä./*Š‘AB~Ŗs[¢‹cņÆxŻĮŚ# ®’ĢūfŽSāģ¶m0põuŁģ›D޳Õg/r"€S)ZęŚaQæNKčĒŽV'ŹšĘ" żhŽVDfŲr••*Óp‚yƒ·ėŌ¢z¢§kvAEĶqz·Ö½J·AŖÖ'*mm€uS ]µóńķ«ÅńæĀė.8°SŪtcė”qN™9Ė*D†bc֞_vœh„α¾éÜ“ŗ‘‡œ5€įÉū “C»:Æd± — †Ėö}WM/Ćŗą‹[gA“€Ś>Ō7hłFqĒōõƒ\Ś:źbŪ6 PÅΠ빐жš^–5ŻŽ‚mķh,ZŲ–{ę™jTŠfvĖkÉÉLģ—R>ģŻe—¶aEQßF~7µK‘ńƛgŠ^Æŗ¬B×CͧĘIzŽ ŅĖutķ{½rō‘Ńć“_dK”ü²;‘ ņsfņĢCŃÜQ^•W¤µ}VĒżĪøØm܋¾£k×DMNI^¤„č=*į9Ų©Djł$—ąRłØy¤čt¹łą€|?“kĻ Ż{³3Ńƒ9]J6x³‹£–#Žg–+ü„^šceҘ™Įt'Æ3œ’Œ¹ ŁŠØiHd…ĻyŁÖœ™@„,H —™ˆ°z[ ®®S?[fóā-Š%ŠµåĪa‘-ĄX6]–lŚodŲ÷ŻØ#øb™—õ>ŒhŪŹ}ÖŌn+žjÖJčŒ :ÖėGłĒæĪi E®‹-ĄĢÅčŪ(n‰ķÓÓ9ŲwŲmŗŽ$Ļk\×wi8±.ńxu|ÉJĆAYSŒpdś)/%HŠvŠõĒæĪu Ø0ĄNģĖ»Q”j?Ū¬ŻĖĒé ÖĶUŽÓč²ļZi~ßvé°ė_ē„¢%Ž5ÜŁ—e ž¶•ā`Ųw'Cü¶ė¦u[AL°Ł™.§A-ō2LĢĢ)÷»!B:!Ÿ‚ž‹wŃų;Īćžuœį˜ų<3Ē“ÄÜ2w V]8Õé,~EŠ ÓÉéfTB`FžØhQĀ?®p<žqE2l $ a Ņ30l{iSūDÓ¾aĮå‰mņ¾ó¶DuĪö“†Ņ©~Ė0Č2ę9`¶¼†‰T»“Óœd¹ ¶r]¤$Ąm'黍¶m/K5ķ»…@„!„ ¤o—ā2ēœCp”ŠÖVˆPŖiłH|&L±ÓłL…{mAģŘÓĮgä|ž\)Ų|_÷ćÖ0÷× žÅ£UžÕÕ±ć¼Øi§GOŅ6Ź.~cu"Å.ÄN–yęjh½·™DbŲ1f]dw5,4؍ŲN9/„vrCtźFXˆ,Ė*ņ`Żs2ƒ5kV¶³T˜ÅŗÅćԌx¾¦uUŻüŠķ?óŪŽ#l84”ĻLM™¦1ōI\k¼ÆŹ’g¶U)±HBŻ)dÄē”Ōfg›õ“™ {jƒåWøĒA0­¦ž˜m°€÷¢'ƒ4pAūøæ6šz”®•śė€™“f-žšÖSN`’·Āj詗¦+±č](’ZŽ“›ĮTŠ»nÖy¶Y÷eN MuDŠg‘³«~)3äœņgä#gȉ!§Č s·t=ÉQ«*”„KójĖé„ęC<8Enł­Śņüś:ĻÆÆĪ‡Ē|é8½hƒŹø(±ßDĄĄ©5#ē„łĢ ˜—œ‰€2äĢ€| 8TłJ†3„Ö’ŗ ;°$df )ęSpĀˆh¹żŻB§JƬb † £œ'‚œ§Xd>3¦Ģ±A„ĪĶ‘ĢśDł*„t)Ž3vuƒ:īŅSņĮZšŁē±v&«xC5õ%Ģ„!NaÅ3DęXĶ'pĪĒŽœrę Iæ3ŗ>!½+–į=÷^‘ż‡l§#šÖ>mæč§°%±•®ąƒ»zŻ=Ėg×ĆVž'½Ļs©"ݾļūn4³k+ķŪž×÷…™Łh Ėyśž…_*—»…-,ņÕßéÖ8׉œ©7ōŒ˜Śčb<$JĻ˲34—č©Óf“Üt›øŃsgiŦ”­ļ™‘X‚U¶ŗyüO#ėĘ/~ńP¼hę?ąS’’Ś|ĻĖ'Ś”Ōž0’čBĀg«ė|Ž4š»lžĖž@¹5oč€7kH"G³4øQŸP† ŗr3ŖFXüŠT…vøĖlŖm÷Ī4ӵނ)¦•2‡I˦'­LõŻJ˜’JćŽēłŠŗ ‹7×!Ė!ē)ēķaļŅxø^vbóŽ©<Ÿ9‡R_'˜Z?ę —ŗc±uÅĢ»^ĮūŽŹéD"§¦g}KŸFĻ֗5óA“ļ86i3\Ö®}Āt—®ī6 .śķķķķķņö62@Aƒ@éæmŽŻV³åė¾½ÕS­‡®šw=GxŚČāPés^ĶĆŹēWsŖe`=zœ&Ż?°k“ŗ¼_ld­zfk[$ÕÓDŽ6²†?ŠŌ›Ōąpū°ØøJ†Öß@½1‡­”Ų֍€’ӑµ¬Ź“Ȳu˜-ēMĆyW½ÜĀńvę{šŸ)Ü/dDĄEÖC䌬|H7Q Ż›zĘ   "„”1¦ŒIŌ°2#aĶŠ4jć‡Œp '€œ‰øpŚ’t!A”ńł¾(m ŖLey¾dƄņ“Č»āėėC ¹I™t ¦ŠśĢ4`WĖ”fŖ=:ΘSŒ‰±ö”^U6N7„ĒĄˆbĄÄۚ“€Č Č)ʔćY»}¤’,T5o¹Ķd¼1\—ŒE9Čõ5|¤œśxr©’ Éø(źó•¤ˆŅ)(ž&å Ą’v~˜3׌ib$ä\œĀ„9!$ĢI™[”¾3ēLu'Ē…Ō¹FwGćr:Åō讜nBä•Ä‹ńr'®“CĢŌ92Øü•Ź£żT_&|؈ Ł-JŪ×$'Ī3øˆõ_ǧ«z™Y7ŻYĖ*tI©ŽCl m®‹RŗõósdhÄE C±Ü‚į=féĻ4mžœO[ćųųųe2ĄÆ÷ dļė?TęZÕŗš“efĪśĆxŪwģń_óyĖĢzDŌ,2Ś É¢)ØæÖæ$€~'r‡ƒ‚üŌžOJŲIļś-¬ÖT-ųē ¼Wļjŗ£wėD¢ćČšY{Ā€|µ#+Ų8 ĄF O-v\”ƒ';ĪĢģśŌ®8\ß{u”i5i_“·ö”āŗ˜pU”(čgöąy·Y?†×g—›×‰ ų’ō°"žŗ•2šæqž_{Ż.qVdīĻćUxnŪ”Œ±t|Q”`® EsUÖo:€¦-‰–Ś]`ykJ^ņßY_ŽzzŃ’­ÕQ–<½Ó²B˜c‰:c7ėašj;uYņPfŹČ™…Æ[𢠓 ŹC dh‰ Œ`c„”RRUvBĪ €1qh#€ß¶M…źB hŪB”C‘!ØÆžńVóe˜šōEåmś.ƒO+ū¶©P¢ń£ U ‚‘Ø+N6ä4lˆ‡Ąā įŽÕ‰+飹ŌųŚõFß,֧큅_xŃrbrŪB, Ķ’ķNG·FBŲ6¢Z:į”l ź @&‰)0άD%ś<ó b3F zŪńĘTSØÅ®83fāLšśķ 6ke|gA{”æ—׳øŽ+†-°:ķ& ‡)ź„–õŠā(ģtV‡Ēs×ėB_c"E‰t CˆK-€f³;›ąP±pUZBļŻ¬ tY׌u‰|FŒķ×Ń䍽xJ¹n+>Ė«q3c›FŠ a L&oTTó²£]•M˜KjK¢ŃķęU$Å( d;7–W9hHš É%s?čD‡ø”^Ö0œęü­ ¤­Bµ•ęŖ…Ī3ö…)h¼¾ł ążś±Y=ļOµfĪź:œ.Bļė2¬žvÜōuĄTėÄÕ²–¹œ÷bŌ]ŹE× ¶=" MyĆ­»‘]h<-_›gÓ|¢“¾P-äSŅ×DƒGRƒl ?ƒģE†;§›2£aéüØJ3k^®Ė£[@uæVV«"(ƒŌ«Ø^ś€mŅŒ¦“fBwę’äævŻN¦Cɞ–׍>S–vČ™gŚIŗI½šw׏FkPf0˜ņŅiŌɲŸsĪ,śyMØ®©Ī–×éāL•V ޵U‹~$s©#LÓ%Jß}¤ŲIg„4±¢Õŗ:ńĘń?vŌóP5f]“ké·×=–qÜfČ©Łśæš·¹Źn\ŪE2„Ӌo&(>ĄŲV‰ū† J82ĻQtfóō‚xNō7[É`€©\Åħ‘­ił"‚Ø4Ėė|œ­ņs|4“L‚M½ ā«mŠņ¬ƞźĀ\IŒ6­ŌZśĢĪHŸ,ųXZ®S4—= ¹W}źėf>śdšĮv]ļ°ųy“Zķšģ-Č׳ÓH‰RT˜¢•Õ ?öłŽŹ!¾ŲĻ2s±Š`{faó™’yu.zĖ\Ghåfw5ÜC<œūĄÕÕ[ż_°`Ō%Š.u¶b¬ef5Ł(‚'3†9h•óŪTׇ źŹ O}Ē1¦ŗ©¢!ÓxŠŁ:²®ŸŖ£ęoDÖ+)÷š¹§²C5¾·Õ‘ÖoŪńƒÅµK’×±Iū·bÓY˚3ėl@؅”°OµAQ«bĻhźF=]¼½øqĆ<¹Ļš“ūy¶ėŠE3īć­a°^Čl’ń”}5HʘH.j`ĹjÅ7"kżšVŗ[EÖŁ&@šĪc83ÅŅ%e†3åŅļ$1ēp<3$ŃlfSńsUE³‚ģˆi Ģ‘!&ˆŒ!`mŗ…XīÜ6`$ÜjBģhŪ(\óīmK pŪ·@Ū.HÜ J§— `“ž/(óV›p§|ž )„Ģ™SŠ„ex_UbbP>B¦Ą€2rBH 01ę(«]øŗLŅ!ēSāĢ9õļ­§±q¦€@ržąVŗŲĄ&˜Ū}£°ķµ”©Œ„;dÜjzwCB†-dŁSķęU$öC@ސ"pd;q…NW­5ę>ĻėĆĢ ņŹų©ōļÉéĪ©4ꉔχŖļX•UžpJŁ#¤‘ÆHŲņDz»lŠ”Š=%ŚB ģVć~WWž}'Œå¹ōŠ?ș]öoŠ«›ž¬vZ«rßöĶxj¦ņųĀ;öņf·]ß¶7UŠšbĪ·.sżļ²}æŒĻl kmAO³q·tiD$ĪŗŽÖāmŪåCŁĶŅN¼EłŖ IēqžĒŗņČ7,ņ‘ø„ß3ž9ĪŪē-žxµ†ģÓīę<E˶ԗė»)„”`ąĒƒĪĶ(hSBرlķ’¦\j3½aI4’Šńæ}ZśÕł£±¦ŖĆ8Ģ&½y&®±ÓÓy<‹śwn }ž®Å#üą†ē˜ÉG)ŸŅ6ü葼z¾ŖĀ†®bˆ^nļŃt….«°¦³w |6¹ft«šŒó«Jb’~ŌĶdŌ*‹½‰dóõ@gL­BŲx2¢ÆŽ®jž…ŖņĖĄ† Į?ڟę2Qhķf©Żć::X»éóü:Į÷ńC<MĖ|×ē:ļvČs:^·daW:~ø[zÖ ŖUkĶN:”nEDøI ?CX½ŠÄZJĒxßÕ÷µl¢#Sł& 2÷Ļu!uHÄz”™Ž»mÕ&­ĻĘŌųu;y|P< DzːY{«ińŽĄVš £F%ĻcŠƒõ®ģ5Óņ‘1>VQūŚpE$ŽÜŁ$×XF¢ēVH6żsRźhkŪ'‡}ŗ}ŸŁöaéhõ~*å{MæšŚĻ'Æ®@Z}ÖĘ%ē¹v¶:ēI«Ē(»Ź7Ś*I=w5u~RMõŹ~e0ļ]ŒĄątĻH—B<ÖģV¤±‘ļŅ'h/÷ ƒ¹Ļ48(Ÿ…&Īļ÷|GBĆŌbf½µQ„>Qķ¶p40£œĻĢŒśµ£[)3›®×°óBX —KĘēū¾£īäü|&ę>ō˜ S|õiŒ16.¶vShå lv‘Ī^EL ~ėŽŖ­_žOk.:āƒR—(w‰ ķŌšløÖ£& v›ö(EAÕQU’ź®Ūk{+z><7GXV¶—Ÿł¶Ö禄Ć@‘³‰ß½†¢rŻĻĘG:Ō BSró iūßŪą¶¹ÜT‹½}°›'‘µ·/yK¼ o}[Ŗ¾ UĀs§h‡€Šś·x&r>Žœc>ϜĻ3·-9gLńĢĘ;«ąµō!‰)—gK g¦¦ćHń~?e{–Vœ1„mĆ-B f"ę"åEa<„†vŠV2„*×»aĖļPŸØ/C…묳Ušˆ[I–’|/”÷løm€!`ŃiĢY`Žu^8Ē3eM”ó”ėī<źĀo}kźøÉ.{Žļ1GĀÄ3õqĻgĢ)¶>Aöó=by6ÅóLm—yŽ9GęÖVnĀ@PńØ$=™Iō5”õ½iB €K¹Õ…ēŅ]÷ń §›u>­Ūįź®E£—:Į>øŖH²5Ziæą żĄ¾ĀėǦā”ĮdĄ„ūä «Æ'N£ßU”‰aĘgµ yĮßi¶åskĖŽŁœžŪä’Ā›} Ųōē_ķ;[ėĢ93C§qõŒ/“q …ŠÅ ŰM%N¶°m 3”æŁņ čVNуMōuĮ„ŁÅl £ņ#Ā€51µIašaIüĮų€÷5WmÅaŗA;ŌĀQ’‰]<­Ŗd\Šßü£•‘uÕÄŽeö.ä3*=ɦ¾Ł#- ōˆš.”Ņ•YU+ÕmhÖ÷„Ÿ²^;¬Y³„KƒVüŖés"{ξ[ązWSć3äżjD?°oŁīZvWÓUž‡+äBJŪž½Ž?žūta©$śĶŗ‚)hŌaŌŖĻĻÆ$±jŸ×ŚŌ5Ę3ź#;ZÉķńbHĘī\Ó9ż9~.Ąģ3 N¶÷^=ć+Ėžœ!±WĒÕoÖŁ·]’/Ō¢yˆĆ‡_ē7k§ł*ųų!gļXšĘ对_$ōQüŚ(®²²·ĢLĢ’Åh©Ÿ¶”X ʶ£¶ż“-#kÓpr“y&Ÿź7^6¾Ś³`µšŌx†':ĄŪ¦u% l^4Ō –›µz(Ęv²ÅĶp}²{Vt®,ƒń8²¶×$(sķOH!g6§’z¦ę³ØōO6}žeŖD’Ä ˜¹5ŗ)sķ!#܉ƒŠ11§óŒ)Ē©ø1'ģkĀŃŌR>3m€3C(h»qw-[X技Wș€9C\ŹÓHŪaßpė«7Wœ&åŒ|¦z])3ä̘2@Ī€(g 5ęÆUœ’³ó’Õ*K_ėūrČ 9gØ_Ą9„“1gŖøAī«Ļ†ŪxŁźi‡L836 ]½n-ąĖ‚3ӑ€™1`¢Ģa£Œl›ĢėyÉ)„;œ@Š;sgJń<‰Ź*ŌŲ€ųåŗW*pĘ¢½S i°Æfw‚¾7`żqĖb“Ļ@iq ōż‚‡>&Øį—ķˤ¦ļuģŃĒŽ+9“jõ)PŚõ-PņŖ}\5qlżF[(ėšO{>‹³ĒB~:ž']v5ī×3Ÿø‘āLdD“]5Ļä‡'ņEŽŒA. > T­×ƒ×Évßé§Zõ\$Ū›ØS]æ„U{Iį}»Ń·ĆÆ©RJ-Xo³`ÓÅc±V D«NņČ µV zĮ9żß”ČŖ”HŲ7ČÉ%éė6#Bƒ(µÅ;®ĘōųOęĀ0Ƀhņ‰Ŗ½OĆ/—'HŲČŗ³†ż]ć}"ķŅ÷”Ń«īņŪ0H§Ļ&„R!}S—7+&šc4‚sé}¼“j[VІu&”5œT@§æµ–¼nT1ĻĀ™$Cžœčņ’Ą3ų:“/OCTĮ;®ĘńįāhہXö“3FĻ‚įOwc¬’Q?7q…~}Ü ¬~<„×<ƒśqÖƒéa4Öś<>Ίähń©Ö~|UĒŖeԼ㿧3ÓĪŪÅÜTŠBõq7\?+¶ŻÅ„Kči݆™žłŽ£sÜ{8:_°ßō\ę¾#­ƒÓšų1h±£ęæW^󜞓÷¶HŖ¾V¦Ø©›µ«•ŗ §YTĶŅö®œ{ŽVU“³ż˜Å£pķy–T¦±£”‰ä LqŪåĮŻ©Į"ėƒHrn A/vDėČŚ[d#£ūH¹=ę2CdM„·¦²E6yńx<†™¼ćjÜūoÓUpIUŪEY¾øqśčNÖÆ"ŗ¼!]¶h߉vĮķ‡(01*r=ķ µę”bZ•N$™Ŗš‘xƒ6Œ; ĮēEęXśearGם¹øEŻ;ƒÄ˜2fŃ„#Bę"†Č3sΜS*‚)rN8’/«¼pČ9ēIā+—¤]ģSāR‚“åw”5ؗÕ÷‰œ3c`į-×üķ™rŖųϜ9„Ģ9ēX±š\$+9"§˜A®;cNČ©‡DYlÓD ź@Ėø·~7Aā̰Ļ+0P.]o°.V7¶ń¶„{fā@°&±3±»ķBųv!Ŗ’Z#šK”Ķal,=ø ½DÓ{4—F¦ėŖ“o…iRC‡V\į׊LME§Ėķ€Q™ķwµsŠgUø<§”uł¼†©ƒ¾¶ĖŲėÕEĘ5®óńu⤃«ž-Ē]óUq¬ 6\gg×Õ’ŠPļ 욐ƒā²Œ@¶j†Ō‚9æYćģ'¼ēUÓt³ņŽ`ŲTĆŪæ\ėį¼PÆZ: Ž÷±QŠV6Ėø§ūūĮą‚× OŸĒ «q{Ŗ9>ņė-sHaĀ”’½4gZ†É˜39¶bÕŃćŠOOJrÕšŖe·¤óL䣱Üė»ŃÆfOīr|ĪYV[К8 ŃÕ&Ą²«†ųeą 63©yY*™fw·\7 ĖB“OV³'׋Ov•IG†Ån„ńä&6˃·$1¼k%Dœ*3EģĢq ©ÖĖG=ĘBƒō|h#PĪc^P)ėżYßå’Ƶ>”.²vŗ‘mÓŅĢöłåēŌ×üæ6>=_:gPvaķFZé3éę°˜„ß;äŪD·©Æśš Ūī{*jģRw~Ą–Ée³ķł«rļV®Ęę>±ÓW ShĒQm&Špģ’i¶Ž«”Z=īW8; ī08@śŽŅ®q{Y‰>]Åg_5ņ»ŸÜfó †Õø=ķuśŒjÄHžw½² k9[å*‰i»SyXŸŅj:~øPŽ©Ō¾ķµ»QMJ+YŪN{<Õól5›Žåµü&~=÷«nUé#k«nŚ£ļį{²~~bަœŖšģų: $“æüdWY»[5‡¼c[®ōt×~Gū¶·®ē Š×‡tyYāółhĢIŒ˜"GČ'ä“#RN E‹0õ»™)„Ή'Š5-%>RoźY*õäī­)jYo3^:#hI$‚œøē+nNÕ Ė "g¢Œć6Éā–&5½œār…ö)ém¹Żs… !Īb ’÷ ­”V0“:†0c&Źģ²ŹĢĢŅF®»]&§’ léŅuÖalŃÅt¼Õć2Oc±©v>åāĖgE¤®l1c_ś /§LłĢpfˆ‰DlŒŻ#Ćżdņ*µ*¦Ņ²Ų @NÅ)āĘÆ’o4 Ūcœ†8l:.’•j׊&\ÓØ[¤¬@ß1ĘNÄń•Ļ™E¶Å̰‰½“ZyßÖńšTöÅd¢s~ä:›ˆ‹'M8{7²! `@< YLļµ”ājŽŪo!4i •ŃT{یm¢fäėöHß$²ē@CžŽ` HóŽŚ =xÉ”Yр}1õ#w±‰½ź³._ĒĘy-­=;mĒ•™Iyj»6ʇyG„  ꯔE˜Ä(±ėŒ»śŽE)+OŃ»ø£Ž=„’ÖX…ļ±^¬õMēc8:ב w<ÕĒīżž5ņŅÅ_¬zÆ®¢ŖuĄŁ£×čn׫9<ˆC^¶_Że”CŪŹ|®Įe^WóŽS1ŒgĀ.ČEĪ`”D8­z|`ĖS¶MķJÆłŅų×Z?š1x%¹>‚’_;pŗYÆ®÷ŸŽćŠŸmū[Y:šŒ'ޟŸćqęß āšś.óüTwĮ-`o¬šŪ˜Ž‚ŗOŒ ü†¼£B’2<`‘V'ŻC±źEƒģ[Ō¢xęWõēLæU­é•¢Ÿ?m/ĀÜĢŗ €Ķ@dÓmŲ&~|jlCÓ¦ÓjŽWšŲYK?meb‡.¹ž„Å<ą G˜8Ģł ž1儘Ü.āu«[ķÓ“EYѬĒ{ņåå­,ņ²&üjķxńsę'Īš€ä:_+~敐w¬į~Üļ÷ūż^”ĪX~ń8Žć~Üļ÷ć^’_łS^/ļ÷”ĖFŻR]²„YĄbсŖÕrŁĖeß/ū~:ĆZMėvwė¹t~0»Ė°§ÉēÖÆéß[ÕG`1Ņõ@łžµĖy=&mœļmšd4õEŖMĮ)Ɨ÷˼łłvńÆMHÅEudv¬V’j†ŖEę·RÅ-?E łE8oŪ¶ķēŸ?žüńóē?üüłCt•ÅƓ$‘oŽwÕPĄ5ą ŪĪētĒ' €Ų¦ŃĶd¤0xƇä~S*?c‚Ęš[½äŸ†ĶČśfņ¹Rhß« †hłÉPĘ«ŽVCŚśńxųējdė6¼iey½ų§"ÄüćēĻ?üų)ó*³£rĤ{.«:śĘ­Ef=żU*$„©Jučašö"»ł„£Q/ ˆč‡#•!ŁDYŹ© ٶuĶļĖ„ˆ›ĖŃJńеŠó֛uÖ½žU Ī̦ZĮ0ųHY7 ̽ŚäļŪž®ļ࿜3«~>-#Šśø.Ś]ĆAÅåķréā„¢¼ķ}”Ķ o}”7™‘Ŗõؙļ>ėMEŖćH—zėyēQ‘}ģ&i¬j†Ō^öŚāŲ6?%‹Žbß~‹“zŌC¦JŖ[ĒqœG;ĪCz:Ųć”OųęįūŠ!”ĆāčŅJÄÆłČ—ż¢Žż¢Hń™Ż®B«éBš}e¼†Ī«Ēi†ĻiŒvōCž#“ējØaęõŒēŁ›±Ū|²G=[=ÕlĮ žų)ĘŌņNr—+i¢ 'ócß])T™¹ī\9÷¾{@ggÜĖēTؽ³Ö>œTWtŸhbŌ&dg»žŠŹĮ‡G©Oéįń;(ēĢż{{čćNqØę( ĖŽß[Åq?Ž6¬ŗĪŚ „:ōÕ?‘ė²äÕ7%×ŗųtŻ8·¼³y÷ŚwtŖÕwĢß(ZLjēŽ/›O ’k·öś$HīŁÜž ąyć}³®ńƒŚ-TEĻ|Głś „¹ ė73gˆ”3EČå~ 3`NØEjš; †2lS`~„ĖoūŠ^yŪ·.ŠxCÜ9Ō“"ļˆ! [@¤PˆėDrŲSkÅČÜņĖŠØ¦Čœ2pi`Ķ)©p‘1E Ī|BNČ'‹_p?Ž’ņ+Ś„ .Ņq?süś*ٌœó™Óy¦|–„­Č3tē$—"„*™rJIŽWčG1ĘÆÆ˜Ļū!N5䪊yžēqwŁAłdLNĪLy¹®ĢDĄ˜sLXä‱$µŠi0·Ö„i™`1Ä@ˆa B@Üė4@ąqc5Q[™;×@|ƒż~Ą8pŲ€1ą^fŽŚš.N\Ź9C({U·³z_Ȕ–zr’ŌFÖ]tSN½]\Q|W ĘóŒńhŠzĮ¬dM?;U ­ncoXOÅutöyĒ•Oā•’ēU4¢Ź½Æs_‡=g ńŅ,P’·x!ŗ“ßVūIkg\Vu Ōóq~øē]wģ>Ī}ÜS­ (`c›²8+Ėó̧a¦TM¦[PmregrCʔµśó¼=µ*ź4Æ fö]QĻ”tR¤ ½€ļ­b»ĶEZ4NĆöJqĻSžB”E ‡ƒ omō–kץ®Ńžæpō% {‰ ŠcĮ~µę-}ꜗ2¤õśüµÉ±•iöҒśæGć„9š5ĄnuīŚ¦8” ŽR܅±oŅÕN˜1¾kAķJ/¦žņÓX(Ū¾•)Ō_ŪžŁBÅæ– Ń+ ,ś7yj=Ź¦3‘ĪZ«•¼ė Ēiz!¶7„„ģ'NNBQĄaÅööų,a„†wŪ|CÄŠ&”LódŖō\*½v£=DŲ¹0*k܍gŪ÷fXŗ½ų¶mUŠŸ&1:·£4h”Ūć4čҾ.ÖwNqļO÷Ø-ø’)5ĖcåΦ’Ŗ°›¬RvµN­£«īėżV­Ÿh?)Ęä@“–­É’ņQk¶iĄˆ,ō-J]s(­¼¦“ą#žRģ¤XM3"õģ=ڳOYŗ—7„Ķ\E—tĘ*ē§Č-|ģŪŌ6ÉÉorž#+"Š#ß±ó”Wmq•*‚‡6”ßw‰ßgÅ÷ŃWź[ŃY”Žć£•v¼6~$å9·ī–Īyä0t޶óöœP«č×Ükźר^§“½ĒR?”nź“ōuQł•HXåŪZ„ß•˜ņ$rxYŅė#ö›Æ<žģöxv€ĮŠÆq‹#3šÉó.ļ(’üfćį†Bå_×É.?·UžU%”tĘ(Ś3"é38$õt©čó?s77Ŗ²nó< H¾ēÓZjČ“w^ń}Ͷ/īV»gXē"­«śøĻ®=[żž­Ž³ē¼|/ ÆjČy!Ī}lēo/<.%āEl>«ū˜Ž“y3“{ŌłµĀƒÜūS»™vŚ¢˜£NxLŚBƒZX”3$[ÊŃ“Į c·aKó8—0‚QÄø«hŚÆ©ĪłØ/€8{?XvĪW5ŗ²ŖJ[„޼šP‚ņńZPķ“ܤ›Œ,$ŗ\µr9o‹:§#$v>2(–økĶZxʵČjg•9AÉ  EOözW×S]äJŚĶ8­ « 8k“čc6<ėvŚ^é}© įŚUõČ×Ń1ĪĶl–č™vžœiÕeČ5[*9x­}Mņ…¤oķl/Į¼Xę­lõ-žl3„<Ź6B7ÜB€āÉĖi‡®%ĻÅ· ūPV‘¬EDH˜ŁVų Ó^'hˆ(“ļŠ‰9Ef¬tŖ†\)buS˜†»Žē«}ŽÖąSšrŁą¶įa!1pN ÄLÄL[餌RC"`† .~FN g„ĢÄ9–Ī.1–˜7pŒ łĶGĪGĮ9 īQoÆkļ+eN1–®613qĢ &Ę,ē€ˆ@Ī»°„i“ė.B@ aĆmC»)"xŌē…»Čó£0ŹÄ`Cåo!?ŖŹęėŌ‚79gĖ>P"=Ŗūš¼…)ó8/ś»¦ŻR&I‰^óc;’æ3³|¢‡]ļOĶĢ3ŠSZߐ“öÓj¢5q 줖’GօRm”QåŹ¶PA"IÆ"fŠŌ ×}ĮeŪ†ōųéhĆŁś¤Ŗ?“Io>a«S zē1ä$ų©Uæ^fFó7W •†V£o„·d>å š3„axV ÉÅf­²j½G0-ƒųŽd>W›õR€ĻŻžF[ETFM»ZU+VOšÜéžu€cOŌ”HŗČŲI[kßqeWõ{Ļx/¢Ż’Ė‹ tļ¾yO@U†­IŠÕڊ·źĢ]čŅ­6ļŲéļ=æ5Vu™U™»ę57DQ›“WG%kG’Zd®GįāD44Q£Q;ĶæP'7ōs¬sā4ŠqĶĀą[ōŠBĻ­!uBŲB@Sy÷U#ØŖ-ØŪU‡ź`±Ā;]¶€»Ź‡PŁņB(]M2uÆøč9**„\ūē”¶‚Ém‡,IŠwß« į¹5°+ØIę3P”ķ3ęg‘>L˜‘2–DŒ$»J;;Ś" 3aÖRL6™˜S‚*4ŠŌ°‚'eäCMķ—;@z–h.µ sÓ`Ø*.‚d-WYĖ$Ļ…f•¹ŌŌ0* æŸwqHŪu!1#č±6Æ·Qiū f,£O H!Šk 2råcĖčG7 µ¼ś¾%.oóXēµ6©kšjIT^Óņ˜ÕŽŚhw;+’b6  = 0ž©øCZ#¾A›jlĢ«Y’:1Ŗ&*zƒę‰HQlŅuēyT}›ó<Ļæėń hµĀ?¢Ć ŠŁÕƒōŖo?ŽŽ~¼żßJĮ7u+yT‹Į¾ń°N®»‘ˆg3;¾± a_éO£øČ³FĒ#!¶:S ²ĮĻ€w‚&Zr1ž¦MCzŃxŗmże“2q·š.—ż²_.ń¢*R²±Gå{:”¶hĄ5 Č ¢~{{ūńööö¶š6Ešį\¹Ņ “N£M‡ÖDÅD½ĒSIž·É¬u!+‡€ŪēsĪł­^øev‡Mä2›fOŗ ¢i… īė„NDƒĀ5r|™¹FAs„aĻe˜·œ l…„?³bŪ¬€Ń–˜Mœ6c_cR&”ć>{¦Å [dœZ+“Č\āŠÉ(žT•B§‰óŠ”ĮlĪZų+ēt?Ž»žÆGĀvu‘R-e]ÓüsÕ {ŽćÕu†gjĆŃĖO¹Eę2¼A nkrG• Ć9w-ß³IēBL]…Ēf³^ēž¼”²(ź-ZEźB"3tÖøĆå°Q²*iĀŪÖ` ’7W^nŪt{ŠP>[Ņ·Dó~ÕJ¢QI7‡fé4æObĪöļ‘cŽļšśy7ą™‚¬ a®ĢPyš¬ˆĄĄ‹NVƒ&i¾7" 8ŅzéJܬzŌģą›łė×ĢńY‡ī4•‡… Q²§‹mŃ£ÕĘ7Æ"ŹDA³ė'lAĄCŻ v™ŲyR†P:XpTc:‘/£ė™'‰ ×ūw`Hf×Ų'8$āō%ó6÷d‘[ķ¼ē—…rķuƖQŁ„ŒYĒ­Ću Ü”ż7UKöł×ŽgvčL ¦ˆųÄ Ÿō唄ĢXŸÓhńĪęHŖŹܝ¢œSśŖ‡!ĄŖ¼—8wJMóėžu’:īĒqæŻõć8īŅā¦ŲeWądŠŗ‹YiĢ\aD@ėÕå‘Ż’­§7ä;ėē*†}Ö:’Fø‡õyO‘ ­ĶĖ(uPīĒ×żėž„M\S3øŠ°*óŗühq²U“sgfmO–GŸ|qu|Ś]Š Y@Õo]I¾ÜS^ŚV.Ūų.9g£ |žG×īnķ»ÉŠ@·\KųŹ-Jż8Ļ‘KSžwŠųĮkwˆ o”kö¢uØóÕzGļŗY«l®ĪR»Æ Ģ åż¼'פ©śĮÉ“RƒI—Ÿ6¾…Ē܆¹/$ŒŅźnŚ…Ä÷½2f0dˆĒÖųh×-½*¹éÖō^L1ę|&„œ“äĒź|ńŚérFĢEĆŹl1ŅŻ8§t&Ī©ōR9Ļć8rf.½R¤_‹„Ļ@łU.’ō®pƄ)š33жlĄ}C ”¶×~)ŌŚ0maŪ1¼!m”ܝ%>¤Œ”9°źCŻRfˆˆzŪ¶7ŗ“ݱž–ĒWļ桙0×1@Ųßīo{ŲZ!ŖżwźyÄmGr]r²t¤ ø”qIP—ˆ¬†/5Ś$vdPfęœćØ“q¦Ģ锄A#3>—9Fā^ćŠyĘ~Ū”ü£ŲљsŒŻĪD'³Ų!'m TłóÕ×qŒ¶–¼"Ä-ł³āč\.Eßģ|p¹ģå{ +¼œ}!C®ÉķxW×ķõėļæ’žūėļÆó”łŒg<£ $ŗvxMęu‰ż‡GļÆ]ˉŹ9Öä_YŖĪóėļr&>4ōétł”'2A‹MC§„6°—ĖeļT߅ĖŪåķ­ĢŅåRDČĀ6ĪØpS\P|ą5;£8}ÅżŠ+ĪčūM7ŃYpšˆ£Txobų»u˜õŁo¢GEøŗ„V_O3¤‰„ƒ_ugŲ7ś} &”½õ/!)ļÖóč!ĆcĄMõ[ÖĆČ(’5į ą„ō]ŹŻõó!B’M¤t(Gjź Ą«öŌ}Ē)n"p7,Žš890ÜØ7Ā#DŖ› —8łtyT„¤õ¾Ä#Īpč䨧uÆŖ•ā•Jä®dUŁV%fT§¶Šźu}‘+ĻIä+^UBÜ=nĢe˜Ēł  ¬.œY­dĮ‘ż6äź µ„©ž„{éżfꌬ%7§ć1¹}ę°WŃé澂ƒ$¼&H.?`PņX5°õ0QīXįŗź~FęIķ¹QR÷ōJ+Ȉ!fļ=WĖT«ˆ‡ZņDFŁ’$IģļµNiį¼W蜈’č—ļC™ž¤£«VnÉüڵd„ŅĘ1ćŲ\-7ī‚Žf² ]õaž*x.¬‰ÆŁ .óRˆĪ¢×sö”挗cˆ'ÄĢ ‡Č#‘sÖʎ§Čŗ&1Ņ…\§÷©CŚŻĶūŽTæ#«ķJ‡>+m"cŠa&Źģ’ś²•%½XÕ|ĒÉfK}Łś÷ˆ(svHÖx½™Ču-“˚ÖŅ\į±·ÆÕP/ˆX'f•ØŸž”ž8|Š XȐOdØt'M²ń]O°üö•”MuÆ !lßÕDĆlX'XLµ}?E™¢ĒÕžÉx<<śū@Gƒ®Öń‹®æŽćņ@æņ©Ż,t5·vO¹o.…ąH-žT×ĢōuøDł`Lįķ`.h)Ÿ=…„Ļ uŁZ­Ža`žm’=—ó؍4šUĄÆź ›īå –Rh³Ū­ł¢čiš,yLш»h ÷.ÉožĶµŅ’;1µV}6_½:„"A¤¤ŚÕ8dץ'µ ”Z7¹«³Z[.³6uų“7\mo䳏āīĶE|“¼ ĖōU 5zVæI„f•ļŲ|¢zĢ]ŁMĄQ؀»Ä¦oQ“Ø«‡Ļ’‰&„ÆnXÉxĪŽ,:ōŽž7ŠOĻ_ēoƒĢV"¤j•ńĪߜ/€éŠŌĻ'08Źt_h¶]6\_=Ö¾£ĪZ…'g³VĢń©ł4ü¦Kō”Č{ŌMdÕ!>óś]ƒ–JŅEIģlYonyt›©‚‡Ī#ėAĪ“£”£,Ć,0ŌvóŌ)“šƒ!»­„rˆ‘•p>MCŅóōĻ/?ȕKd1U„œYĪŪćķŶ‚LĻ8,"ė¶9gĄ-ŽŪ*²«•.mŅŖM×øįŃHŗwŌ­,¬ßŽ 8„xž)Ÿ'Ÿ_µĆrJé8Ź)„ϳSØJśR©ßj™%ffŚ7Äm' ąb…N#3Ą 2RŹ40ʰęŃ 93\ö WŹ@ķ—=„ķR‘ģ!ģ—}ŪĀ…pælA{nūe7œ”mß"m„XPøķ.õK$©źå+µ.?;āĪį-l;†Ūö#ą¾…7y¼;K õķ†^/©9 ŅY&\Öö1ˆõþo†Ć³_śu…ķ²#]¶ķ—=„>‹qŁBŲ/»8¢ö pf¤’hß±ĶåD˜aCČąee^•`Wӏ1AŅ4’›½oŻ’$µĮ”Ucæ’£ŚŻ•Ņž$ˆĢ¬ź±ĻzĻ¦ĒŻ]·¬ @—ļĀ\Æ«cu÷šß—\W]w}jģøō\“ß.Ą»ĘC(ĢKō1-ųŻŚK­/M·īØh]Ŗn7ēśķ" '·ķµ’©—oČmoVžHūoõ<Żśmzõ:wó,”%7”ÄqYėŒ'”4­N34©\zWéŌŃŚyōJ™Kä¾Ńx³ū/`µ­žą’śr¼¹Æ {{ŲāßfŌ}āĢ<¾óJ®ŠAVU9-ˌ&ZžīšhŽĶ’c¦-ź1 T`UŖŚæŒaر)å^Īō‰Ī÷N'ž„iłw-ē?~ŸO¹?3Ž.;ÖÅXę>O:e»Z²(!9ę§7Ķ zBčą£­¼i£ĢaŁøCĢń^Ļrzx?¶ ūnwŗīx½†Z;ŽdYp;’漓ŸqL¾­-?śÅc²ßF“Oę|ĤG¦n–Ń\bS'SńŽSĘPx£Ū=ž„U÷£Œ2šńQµ÷4[™Ķšt™Ģ.i½Ņ =­™/[¹…„­_śßÜqčT,§ßpš):\S4;֖Œˆ|s«ƒ^eśjķvYŌ±oōĒY#Œš„B(foœKfącŚ,x±4?0 nä7ßöc§ōę)¦`®¬śŪtnŪź žæv:‰ąg Œ¬€ā ńnĮé½>’½³Ž,fbŻ&ąD­X"® a«‰hä„Äõ†įĘ:30­6jO·½‡ 4œ:—ūŲŃq:øņāŃēį¦hō §UŹxbl/ŻĒ*’³ĖŃXĪł“śŠhĄ|l#6„-čŃāN7æwŹ:€(Xdų „uģÖɍ&ø^ŗ!£‚C-]•ŗ¦kwŸi‡õU*åÓ6Pf¹¾®Źå*µ«ó³pŪŗ]ŲMUźćĮr)*ęÖśb…[±\\Y Ō×ćėėŗ_PÆbY×UJ-×CĖķµT© Ī­rmˆŃ†~jq%ŃrX¶Ž«Ś+a«¢µR4 5ą„xˆių¹ŅśĄń ®‡Nž6ś>Cķ•Z ¾UjÕæ ‘»SS<äUW`ŚŹU*ׁģ‚ėQ„–ŖåéĒUj)“P[™k¹*|=®ėėėq)›+ƒ\uʘšnI¹„ŖóŲ… -<ćž Ōr®×—® ]'…k¹&D†ŗŌk“Łd.ųTI,„dļäj†kŖŁ'§U^CĻmEž||œēGćéęćõkō ūó;¤”¼XCjįól%ß^ī2=9·²qŽSÉ&qROÆv”zūbÆ v° 2l~tūzu=īŗe~¬(„Ę?ĢĖpōa:“—×ŅXzœhū)Ź'’q~œaԟۣ²óę$rėŗ0ž4ƒŌMą&Č\³³^Ž?V»mS6Ķ)kcp 'OøKćų *d`ćóźT”ŻżMyń/WwxŗžÉŖ;̻Ӓ¬Šį™ļ@“F0ńć`Į’š–P7^Łąė\įĘLÕēÄč E.˜©øØXéQćPĮ`®ĢZęŁńģŽ8‚)o7ėWĆ"s©!\­qsÅÖŗ’Ųā'lv€"Čų°XkĖ"›@|𑵒EkŪ'UqžĪģ†ŃÄzĒØ8=yiĶbŖ¶©Ć^m$ 6”®»—æīĪz~²Ģƒ>Qę} g·l&ƒ1åÕZća*$`2a¼7¹['ęć֐¾`_t¢™¢¹‚@<,Ö¤EƒŌö‡nøŚSÕĀüŠ;ß{„h·}æV±"iėŽ€yhėÜDĪścś{uÜŽž'©„³Ył÷?ŽŒTbčTŻ„qœś0.D[­G©«eŗģļ패|h0$pųõīÖM,<ŁŌ.ř›ź‘s§ā˜]@1ŽŹĄÕĆz’-XR`qșM6Ē&®ā: ‘ƒGÜR—.gfƒµ Ń?ĶG‘ §š»»ć‹Šq\ļß?‡ž~ģ8Æ{ÖÕSo¶Ćą†©)—)gzP¶hŖĆöz‡ŽA˜±Ž=ėIO÷&“ĮQķJjCØg£u-Ź?p/ÆKŪĀįUšvŅUŌׯ߿5y£_æ~żž„øT­½«4zƖ×)=ß>ßņźŅ4ēūĪ]ŗė—6ŻĮI¹†Ōke6-.m1V»ü'ܶ ;Ī\”jæC›O‰¤?łöŗµ ]ü}Ö0 „ŌR4rŌ4vD[°–Ć  Ļ˘'7%ģźP |–ę·Pj©fiüśżū×X6ŗŽś[^Ė‚»)õjfĻӎĻńjRšćĻs(å©O(¢‡„öY¼Tq"ÕBԌyČõ Ō§V3·ĻĻęK0ž®.ĮnŲ-“ ыbĒqĪ?ę™õ“ČŃvbóĖ—ļī’8vŒ™µ‡cxę([Ą1oš¤’P(ėi¤ė›¦{øüüøyró§7§k£Eo³« …Å2W‘®«•זcAf*@RY„+ČCčR–I)E¤0 ĆP,TŃĀ3§ć R@]&J9w_ķ”œˆŅąóvŪüȒ2¢Ž6§ Œ˜Q0ŖĆ_…„\&DÆ,0QĒ„ÆĢŽ\ÅÕĘpų¹tAĖ,į ̌€‰€¬žy’7³Ø [¹.‘v\•ÉPœŒæŅB•ž}jB§ļߟ€rF: u#/¹»īy_ D¬¬÷F¤Gš(}®&Ó¹Šp¹X}ņ! fB†œXē1'ÉØĘ7:o‰(åūÄź“cuĒĢ"Ō³ł§¼Ć'jŁtT¦ūSõķŽėÓÅ8}޹ŖGbŃkM½²ŗŽ—Õdz‡]ˆļ×S™z¢¾‰›h|»žć†ż ŽvOģø<¼1~ÄķŽ»CoœŠ.兝†óū1"¾µQƒ5oķoå;†nĒuo4]÷×Ūć·cĒ×D­YS$¤mģŲ–į)³ž=čW™5®Ē ¾3ĻcĒūĢŗuÉī–Ą³ŻAŽO¬a•=”Š}‘Nū’Žaż~ó×#_gÖļīŽWfĶ&²7nR]PˆłŗŚ’¬Ž‰”Vѧ­Š”Špéń§VT…æJł’Ö ©³pØx8|TŖEøĄƒł„N8ˆ WDf,@R˜/©ćµaѧéE‚0W© 8IL‘“r'%Å%¶BčŌ›»XµÅ6ņ6•hJeĻ„§ōśÕ¦ć]wk×“ŹŁ®»vʇVż+żēiLŪ­ņ™ŖæŲ&ō–ƒ"SŗŅ\0G{c:”lƲæ:ÖIø£–EDą™“$ŁåFčµBjī}Üū+\öO–#O vy7Ø” šĖ9M$”ĪĖ€Eß.ĒvvŽææn¦X“īnr-ļP϶šģ|WVÉ'‡«GQ2Ž ‹“ź3`ģ¾bž­im<\¶f"įSJ­š Ż^ ĮS„'€«å(ķ§ģøł÷ļæö†hyk/^äĒwˆ-ūįÜģŚt" Ŗ)’²GFķWŌ4!IM¾ūJ‹Į¼IlrNĶļāķ ¦†.:ėēd†ŪóvWsÅ]AO,ä'dh2Ć24ŗõ)ģĆŗ±bŽį­^– ˆƒfE`ÄŁką:@ĮNó¢%.›ń(Ö;ĮŻ'ė˜’»÷Ż"šüuĪVÉ&|‹ˆŠÉoéćdXŸ±ÕÓ€”I¾CdÅižœ¼ķŚG³§ćpw՟ šōœč»ģŻĢåƒhHĖßߔłT±čm(r®>6šSĪVeś™laĆDų[°īāĆOå‰PÖżk~s|Ÿ·.āÉuOo¬ —Œśq5{z}ßG ą5“NZ0‚ÕQĀ‚ĪÜ£0֝ž|ž9‰fķ~mźL3łk[ʙ-īŽŚ£DšpĻvFµUB"l;#u¼ŻŪmŻ!śįnbX{ŽČŻīh3Hłį+¾Ļnwéģ w]Š×MŻx %JÓ7|k9„V4ŪĢ5ź<­»ćŠ'÷sn•ādE‘/ątŠ›v»˜)TrŸzš6“Ó[“Zž‘żśjX “zWSusÄ>՚ÅęõóąÜ»×+5t{˜źOü×”ŒŅ÷¹•ēš¼\‡?{kejŸ< dOFŅ ¹ß|že{· A¶©+?WŁķ\ Qk™9löŻÕ[PŃŠŪ»™õu]Ė&µ™5›ś^“ _–©UŚŽ\tńeč|ćž’r˜Ķ7¤œ%¤l[LīT3_cĶ nź”3ė!‹ćģĞgÖc‹]ēč5¤yTXų¦›3=°āżXé}īuĄę`ŠĆ}^ƒč eč†Ņ;C‰Ņq bBLI( dhå2čóżÜå‚VIŒ)Qū–ć lĶ”Q)ē-ØŁŸś¢ŌĘ騔2b.„/ŹöĢō:Zē ¤¦o!Bµ !`„*ü@ŗ™Ŗ ME˜+dd‚ŚŸ¼Z¹ÖkH‚°HA¬WåRø^±tzxåZŹÕ3š c}ßń{ˆQ.ĄK„Š€„„’^gźl­ÓĪ“Uø†ŠČ°źūŖ/ŽJć9+ķAĒsnc@)!'ŖhLAä¢c0©×‰ŪĢfD’‚`B$Įć L ˆ”zæXtŻ čĘxæ¶ś¹-'ЃūšL›®Zā, š~eeW9Ń2Y»0Y}]ž{›¼Š“vœš;a歇„Ę”¦02„ķ9ęa™K^1™‡Jbšl[…]ŽÕ{& ęĶ@–Äe*=n{Xś­Ę+w@0·ĖYĢĻ£aŲXT“›ÓeAG°‰²põ† ×\wķc‚ąwĖÅ»ŌtŒ’ÉYfˆ›Å9Sœ¦Ļ±ŗ#«,)NüXmsœłŽl”ÆVŽ&p0™ĘʚZL›)ēW3—¢å:ĶĀÉ`ŖĪ7“śÕčp@ZėŃŁ$'²=m©vƒ@tg+صN-oΆÄTŠfŅvnÄŌ—e¦0kmy,£ķ®{[¢8ņqźŗ0*}Cēgó'٧ųŌf£’Hߊjö›ßļՄyjŠ (p‡=lZēÅ|ģęQgxrYĒ2xc½<}Ż–(Z•¢t ę5Ü9ż!¼āūjŖ­¶Ų2ÖŚ… ˜»ÅC…F]ꁍ‘W*K?1Ŗ3ÜČ_~ū;=Ņ©=»§)N1ju=)ĖnT¶:£Ź"ž÷Ż ‰GūūÜ^1 d¾O7/½VvW.#gøžŻ±l֞öū–ų‹Q]ļwŪd3*š÷E£(±ˆ0—ŃÜ­F*1ü/Ś?µ‹±ØZ†MmoĀfī.yC©æżķ w6ŪQ™µQ·ĖL̵ļģ¢?ܐĀlnRh@ėĮųźmŻcėÜ^ Xid+·ŒA“ȐխHU2üųÖī„§i‹b¶ēLµÉœā(Óe@©~lM…ŁG;Ą^Źi8jĶ-Ļ"˜("\‚[÷ćėńõx<żĻĒäSĒŌJ†3KGN/Ū]©ÖŲ»ļ …Ń)9pŒ}”k‹æ5\zרćMż*_õž†ńMd÷ó¤R°C‰@KK*ߍ[ßdŸˆ(Īϲ™v„»Ÿķø &’śaĻ×ćė]ą‚‰Bēlī­‡u­5ž0£ż'5įK Pi7oķŽ!éS8@[Īæo>ĮwO¹RĻļĢĪLmtT#a½Qˆ¼oĖH`³L|‰i".øDƒšLœųށ×웋³,;}ś|³u夰+ŃÅS%ŽļšYTg™~juŠ«rč’ɐp:OŽŠ­Õ-cÜ£»ÆķAĘm‚z‘š-f\åż„¶GźxI*ŗ;*E¾e:dš*¼}20i^˜s­o¹ŲCĄ‰n{ͳRŌ L®Hxū>ĘŌķBÓĄ·¤Œ;¼‰kąhÅŖģī»KL›“jš“æļ- Ć`M²£,…I+ixjv[#]G²,1w?“Ń“?bgӅā-—Å!uöA’‹°Ļ¬g™5Łv•fŸąĆ²nęOóČEœ£“£ĒŚæį¾»“Ż1ĖD¢6øļzĶżŚßB˜æ_•‘}›Ö,=ˬ}f­Č„d}¾œ,ķj׋®#X–˜ÓŃtčįœ35›®!‰ņAéÄÜ6·œZ]0! pßø3RĆŃ5ūŗ®E„ …H2ä<śČ­Fpą™Ó‘š‡YFÉiÄT …°ŖŪ4aŹ)CĀ–…©/ØT˜@ńĪ2 ¬µkü¶é""\į­„Vv:Œ=JįŠPQ.†ĀX»Ū0qE© ćŖ`ebé.¹_‚°2ĪópØ0°p­e…·õ3.¼ŻGŒł˜ė}ĻQh§R«–`‚œrźƒ€I0Ų5eĮ<‚‘ӑņ‰m–ĪüAljYēQ»²W3šlųIĀÜ4BįVyChNC„„ĻDc¢tdĄó£Y RóLŗĶä#å UóDƒÓūŸhq–gµ}Õ =ē-gäū6ŗ+4ēēQ# xG­ĀéÉf–u„ŖŻō6=’ę R€xFį:tÄvŻłČó”ųÓń0ˆ7·:„Œ]?-J×Ͼ޾ óš¶ķÓ2Ä»ś‚[€füśžn}č¶ģ $šĮź0`Ž0s žµY6˜'lʉ®@ ;ąŸoJ¶Æļą²dėąĮ¬ļĻ—ćŒDg²3ȎŠ0·RRņ¶¤ż‹eFŪeūUīŸŽå²,2/ąļ&TАŌLłw¼ŚŠkńBgÄ;öfS*¦,8—Ų\pp[vōß? ›A£kžFĔhÉ}ōĮßqV8|-˜ŅƒĢ>ąŠ“\tf|Ē9z±p^-Ēå’Ł{>°¶P¬’× ŠŅ;6I?ÆĖIWA÷’JļČAŸPėūūõˆWķHž¾^Kq’©q2˜Ē‚UĻ¢Åb@žü™Ų¬Gz{}R4Žp#āīˆ{XēŅś6ß’wT‰G}G¹%NżĀ94+jʦ ØĮ>°šĢX.ŒĢ ŸŸė~ˆ˜XS4{a zŻņ·/¶O…°4›oęi…ļøSߘ²żŠölūvl¶²U㦾ĶŒ©ž>rü-±Ņ4ŖĄ³N1ņŚ<ŚŖ—;PŚ;˜ēņy<ɦ ØŸ”‚9,.8 AĪč u»0žüqšŁóŲĄ¤7óøćĄ~{¾6Kķ&³žĪżÅCoū޲å+ĢĀhĆ+Ć|üÓįļĄœ†vHDī–fž6vS5_ń0i[“–»ŻŲVŃķšt d#fą™[bUę&>ó'bÓ¶„čO-ĄĮg€čĘ×¹’n@·Ö½.×5¾„IŹIX€Õxr2Zdeb›ÖįK…Eņ…J®…nÖAāĢDD ‰X„œ +p J(ŖĘųĢ"\«"ķ‚‚åØE%פµ  äb›Į“Ō P Š®Šbm­0WÄʎ6±ZĆé! 2B¬ŒK,ĒČ„2 `ƍš˜“1¶+p[ń«bŠ ” P«4ūģ²”$ę}wōC© WĮIoqG­¬šZjć܁`R<…)Ī“ĪS7ł„Üć•Eø¤Ž&·±·Fą}Żt?taIp!ģ=jÅŁ:5ÅmŃäžÕé€A1’ Jåyč)Æ)=ψC~ĖiżoˆDKՐAĻZc·•i‡ Æ/Ŗž¦f’āa„Ÿæū¹ČūLĮ…ųŁw#w=ŃŽ-č9’•÷”Šü¾¦č½˜L1 °‰Ŗ|”SpŸö…”:A‡az:T¢ó‚­ćgÜŅW"ļr+w ć§Čʄ–­f,YfĘīƒCw’ųöN÷p Ų…ŽovhųXĪO­:Ÿ’.=ōFƒp¢ŌpskBĖulŒŖ›~`Ćć'}c æĪāγqmø£{z“ųnå,,M)ČŽ ™ĘWE'v†ƒńźµEß1"^now¹/C&œ”µõ>ßq ÷¼bóT†Ē-ā!N÷pŅ·`4īŽśł»Ÿ[€lóŪX|™®”K€Ļhō›=aó½8šÄŻį¶²zꦗīĖéą>V)Š'<6č>˜„×< µ61[lts‡“³Oø¼¾ć¶ŗ~ūNĻ™EĀ­ZŠ+³<ėElĆō č¾J“ūn é˜7br+e_ļśó˜ßć[Žš`ÓĀ>7ń®Üą(bĮޚH²æYč¼Y‹wóęõļp˜†īéķ¬ _sõ 3ķZŠö×ß_fönō6‡ų. "¶öĆ-Ęž–E ךxÜ!±­kā-!4ʀ:ŗWxMģē±£‘#ŲÕ}Šdų(QķööœqéåT‘¹‘‡]/¹Ów“Iū«Šd¶ąžrWbPqgSūcėå/G*Ü=}b¼éÄbä‘|LŌ-¶uƐŘrŸnė÷ńŽ=n\ĀGżüūXńķam ©k>sW÷5IŸ# ā\Ób·S±m*¾˜ąŲ)½³ÉŗYfO4Æl/Æ£i³­fą[śŽņ|jā€1Ž5CÜHtl2k sˆ÷™õÓÄz‰5ƒžƘYßʎ 7™uø|Ÿ’ۊDȬļ*O;ęēą«ł —ćb®ŗrÉ(č/ĖĢnsź^Œ‰XI•/ņU¤¶čNĘöż1„īgrr"J|&iyŽł• )'DJ’ Õėŗ4#7– cFśJ="€\±ŽXøŹØ§U‘RDŖFĀJ„ž]?äŠ$źļÜIEwāRŖ“jdØZBUfbb&&¬@,¤ Kˆ•ū'K‰zų TŌ÷U_p-ÖéuT‘ZŠīXeø>w:aåéz.ƒĘŻćE—QŸ•ʽUŽź”ˆõP/ ³½5Āv5Ģ:OČH I!¦LHłėlI¼&œóŽü}ƉĘSÓ×M•ņU@.U}$a@JŲźÓ}ŚI¹=uVš-+¦@„ØžÅŹūćŖĢœ± ŗ0µĖĢū,F¤  óMĮż)0 Ŗ÷‚WēlPyĄE}/yBęøC‡L߆ vwBO§0wæÖŌ=qõg7®<Ļ›a…#Ó7‚yŌaį63VżqżXéY}Y°®“0#ģUŻŠ±ģŚd3 ć)z=®Ēćz\å*]Ł×1i¬[ś A•’4Ō€Ö ĪzŪ&–ķ)oBéwštO1aŹÉÅRŽnš•ĻŪB=ļ¼­Ä¬¾Õ ~5 Ȍ„Ȧ‡õužQé` #TIŚįaŲ­Ÿ¢r®›f×p]WĪw®=ēżh”8ļLl(‡D¤/Ś’×CĮ҇ń& ßÖĻĄ%Ö#!|]€y$ĘźkMŃ%ģ1Ó·”›}iÄxUŪ*ŸŸĄ`\āåó? Õv,B#|*q؛|Įą65ˆŅyWr½“°«¦ÓT N¢‰”f1ž‹!śŁ_“kŌ÷)%}®'劜~ćšęh”h—£ģkĮ&xäĄW»Dv\Ā+^=čA:żžūļóķĢ÷ß~ł*óųüTĄŲ…9n²?¬eYŽ«?8żĒ8ĻŌ앦!ĆdĢėŗYR¾¹ŌHd%‹nÖaŒMĶ“ iņhŁ·+čwŹ®>ä8«ļ‘$Ą2ūSżĪīųĪöč=Ģ6z1°ékśŸ•ņx±;ŚżV@īT]¤ē.zß¼ļ1X»+šjă™`ų @'Ēnj±lŽ\ĻźüNSzUĒQ5sčīKżßUĻų–ØL Ši»×~āׯ_æ~żžõ«“źćz<×ćŅ|g mČeÖ"Łźv]üeģųb5śŲ —Š‘šu–bß éu@¹¹ŠŸ’éz“ j·?Ś 9Č,8閩CĖ|õ‰Öy’õė÷Æ_æ~żjėgz3Z!ŠÆG_R×ćź®Āµ»~©‰ MóåR`Ā_«S×ĆmV‘µ •āК’źp ÄŽ²?¶O°jĆ8āŖ±ķ2ÄŪó~^›ō?Ļ;bfm~ųifMöūŸdā1µqŃŌkÄĶ«ūž ¹äĢą o Ū™؅¾&õŅtŽõ*š‘ßX$Õ¹¢Mų/Ø£Ķ°žk0}~~~|~|ŸŸĒ_łćĪL*ŪŚ°³+sGJ9ē#ēćȔ)}”’¢|™NĀ|f:ˆŅ)Ÿœr"ŹG&’13daJ˜„"!¦ó‰éģ”:A(H)WIFægāSH„›‚¢_—p)LЊZZkümIĢķ®±V€R„ks8,u(v°p/k˜^2ˆ>քŲq“"„"Ö"ćēŪSōóŅqŠˆ©bząĢb»ŲßĒć盋`e) Vlūs’ʇÖ:o+ q),×Å­lZėh ÷?­ $©™… @i*ž όGB$¬’0KΈ‡ōIL9ń§œ‰č |f¤SēżÆLĒG¢Lł8r>>rĪ)ĒéHüĒq4’>叏óććŲ³wk³Ø¬ćĒK)Ķ#iż]ćē½d± ²ŽZT[kāRkŃfķtŅźćĒˌåUŹå„.B”čÄaĀüŻķÖnžLįnēæ p<:ÜåL ™ĪUdńMG¶€Æ›ųNbé&&Œś€“ŗ\·v\÷+·Ž\‹Bčl*qL;LÄ~ĀĖŲqųJ“7ūhĖžēŖn‹6¢#fāg‰ų:œ»ķ„š.zŒń#K­„؂…Båwk–õ]5¼Ÿ€ēO–Rk7YäžŖtŒu!Eüé#AG Žv|~0żhĖ’ŁĶ”oĻt½ ĪÄ»-¶ Ŗėb+ c}Æ4.EVbØéa²dÖŪ¬f¾£ßž{hįU?ž²æ_:-#ƒ4ž××u]kO6T‡É'‘ZK3ÜØ<į'ŃŽ).Ŗh÷3ARm®RūvüžēW4ŒEśŒūźY²>†_V5ūĖ ”øž÷éMsr”ŠĢ’ߣ®/ė%>²O•цåóLųqä|~žłÆĻĻóćÆĻó<Žóć<ĻćüųųLĶB<©Ž£Ķo³I%¦£h:³Az‹H·Ä¤$ł@ DE›v‹¶3@NˆYĀ#ÉŲ4æd@jµLĄœrJ)ēó8YZõ‰;ó¦\We©V *4ŖCź,‘ĘöķŃ/%„œQj¹@>ĪJł8#ēŠńóĢżĆt-]@JMŅ2ē#§¶{å|)Ķć<’qŠ?r’>Ī£]s’=€Ķ1§{°Ī\Å,R‡ćI%ØxUįz]„³[øÕT„Ļćl×ÜĒ…(åDĶoę8J:Ɉm¬ū4""J”D€G–&ΉH„bÄ|ņIŅRĻĻ}!hҤŗŗn>?>Īć<Ļó8ĪóóƏóćććóóÆ|~ž9˜Ī3·Ā`CštZ2u`ćģÅćŸn$Ÿ4DĻ3 NżbsN)énև#‹Uƒ‘¬é`ū”¬‡ß,s“/jWqź‘·ńŠV½Ė4óĢČĒu¬ µū£ū ā„U, ńĶ”‡z]ó:³«$LB»ÅæhĻOĒEsk .²ŽdŸƒu¼Ūčn;®#©wFūp‹Ō!9E1ń0½bkFhäó[›ø/C2Ö§F.žž¾ń„k1+ŗÕĘĖūźÆG;eG;lTGĀ6Ū'¬šˆˆĄ“ą®Ć0¢££GøÖRĮE̳կ÷½]Óėß.Gø1ŸGœ<‡ēó9l—c”Ų^µś¬Š”¶Œt\zY”č”i†²5Ćxkäcęå«ćW?ņÆėzč¼.¹о5Cƒ×f»‡2žŲųz„–-Ūf§Ŗ„‡ū!=c>­±ŃRĘĪyŌjeö(‚éSØĻkPü’X›0”©ųyi±j­ep§zųxY.>[ŖUk–×čŠŗēkĻŽįO4qąłū:Ī`+ēøĖd«0põĄq|µ?ŸZö‘٤ÅŖYoŻ9Ķ©å·å9—Ž 4“&¶«éōÖ'žJ¬ļ Y‰FäE$‚ŽŸā°dy}½ž(,w‡8YōæłŠÜŗEd„27ažDF„¦SžAŌŪ“ūķē¾®4DZY,ųlŚ*æŖ=̟{éŽp…w×}tr·µŪ¶Ś:.:FśŽn0×<š{ ®ż¼N…8‹£6śž„NėG×!‚®ĆQ4\U'l7=ü”bcŒ.ÄĘvžiiµ=#JØK­Uk^EUgƒŗl<ßRµŹ4ĶĮł@§ Eō2sl3ā²JŸļŽqŶ$ŗäžļŽż2b‹/› ĻhŒ{éń°uŖµ„™8nŲ;Ę»+t÷©™»īhóŗlż2Å•€ˆ­ÆŗmĄ,¶¾ ’8ōš…›£ 3Ų—s`<ó<ŪæĻó§’F&D³™šT’ēū”ķvO}‚‘‘x¾ —BÄf5ŹĖŻŃķā^]8Žē36·s_†©oź2õŌ"›žÕ,s.k-„n©ŲŪÅWPØ_ł5iė1Ņø+„ō-ш²¹˜ƒp:“ Zuē©¶śNڒŗp9åĶtfŽēĀuė½e.°¹]½W¹¹ŻX¾æÕåc3ėĢćxķDK÷ŒćžŪõgkX…-7QhD…ßeÖ‘bĻ}é»*rjŸ7*Ű÷įŚĘģ4Łs#¤āšĪ!ł·¹"®\Ø7‚‰²Ä“ߤNć0ŠŹ²-‘^Õuso#ōöK¶.VJ˜£¶²tWÜōĪĒu ±v„¢¶ŽR䀌ė„Õ”p‹)“;½µ$‰)ĀĖō1ÉlÆ=¬üēHgĀYHc;.¦g)"y +Ž|mŃxuŚ6S. Jźõåßēuš©ńv1Ņ”ō?Ļó8OgŪķ×] ź‚Z…gT”²Šź4ˆ6=·ņ”ż\pŲiÆ=4_D„ßK’Ūy:šžŠ˜½ōMœ­ĖećŲ„Ö#>fhš;–ųĪ€-u}q˜šo`ŻŻiŗėåNN’š-_E°l¶$‡ ē|Ÿ0œ×ĪLEų•óCgF\‹§ć„j1fDB]7Ź<ĒĄ Ś;4DlņÅćäŻŒį.Gļt]Źs¹YgŽL.ˆ¼é ŒģŪX×[“ąķÉņv‹Š»ˆŹ)/d…źØ:ŒqN]Š$™b…Č-jI@Ģ{Ķ#‹–™b\Cč&ŖˆŁ]ßnĢQĄ x)JJ~D×ńčq_æeē 3–«.©čĄĪĘœüĒ­†•£?I /×£T¬×.8gmzΦ‘Cš³Uj*8ū×ļß_ćæö—MQÅ6ģ/3ÖIöćw¾’&će—²YKȞšjķåÖąƒ-ł@aģļŪ×Ėó1gyg|Ģ.Ģq¼ē<“’īęm"ŪóĀŽĻ2›ĀŗJtŻ(dŌ抎<ńĄS؎&ŪŻ® Ne‡ˆq¢6sxõrõ6CU¼NdG¦Ōŗgē“m„ Ī–Āx%:ß&ųPīĒ`”ä™JędpƒąM­Ź…‘Ćé`>˜Źą“+€egż -—ĮźÜ¢Żįf”ŠÖūĻZŸę4–y&tŲbļžšW&¬Ļ£ĪkdZr¤ VfįrjYū,1JG2É ¶¶gńu­ŽČ¢—ˆ,|ÓūĮtMÓĻĻ&¶J½kŠtžĒy’üē?’ń®ÆĻĻNSśüųųG†w*ˆś÷ęEam„Q‹‚XmėūžĘó‘f?éĖß÷kŽā)“Ņ7OR°°†Ś_£ŠõE“ćŖ ²:35µ†óc3ä’ųĒ?’łĻ£å®gP]ŖMhģóS/®k Į§€ŲN‰vOhk¢#ą¹É¬ÉI0åćŠ6&xP“Óu!"ś8Ļóü8µ÷yŹ×^ō5hĆžåSUa'čt\8)¹ŒŁī"v“¾Pó*Ć·E’T&P ģ&!:e@M=°M;‰nõ!95A©īG…L\%77– 2ŌŪ ¤>8D}”ćĄ|PęÉSƒ<ÓäüUą÷ų„;œ 1`•“今īsf‡üfæ”ü²M¶~Tu0)g:2G9:‘»5@ˆ»Øć !0Ci9Y+c÷k¢P)÷aGÅ·6OZßŖĢsȨݧ ߛr5Põ×£–Ē£˜¦®® †VU†))$¶Aj%¬UÆ^ZwTA¢S‚Üū<ėćžząå<E–b»©—–ž¬z(Ĭ›±!‰ś«?Ė£Gķ„L Š)9bŁ_ægģÓ¾Ę`öYæfqõ2ʶ#}1”™»ŸŪv8§*4åŒ{ė%«¦Fø½"Į%Pė¤śMózgŠėTĘnę!Ī«~] ķKūĪ †:O;§dźÅ®ņlךY{dÕ¾LF|£sū˜Ł“„ŒQاÉF™]6†8½ݰmšIž4‡ä(£­Ž~t žēēĒĒĒǧĘO³½Ņžy²ŃŪ,éĖ1¼4†ÕėŌėī„ŒCļĖųP› aČīzqzāĘ@E6Śż²B>ŠŗÄåŪ£®Ē2źÅx#šc„aK)“Q“r”Š«ń|ÜY&•°Ō.³)Õ­oņ(¶…6ɭ˲Ø­ ×ōö»Ču•I{œŠSe5»Ō·‘9ņÜā7‚é:=ė‘ūŌrɾ”_„\Å2Ŝr»Ė{Ӈ[ĄÜLÕ4½SJ\°Cņ?”£żšŽŪE—qŠķež;ߛ،PŸ*m[š“uÓxkžv'Yōźėk¶ō¼k“cŹŁśŽ+%_}æ®øMģ®Żż|o˜Cݜ_ŌgqoČ`é7fq'Zl·o]xLkf{­·ołøķ½Ć(é…)©9ź;b$/ąĶņO±ßmHura5”ÄV8iņų³å|†×(°L”ēS‘‰čōśīīØåŁē2ł7 Nńz{²Q³ŽgPĻ%Ī>PžzŻĄn–FņF}G„~/2 aŽõ(Ā•Ē0¶‡kĶģɚ"ēy~œē¹ą=÷#f++ķM.6*aÆ\išä”§ŲJ«WæqWVmleæśa• µčŒOü°Ÿķ1tŒĮć»§Į¢ÖÆ+Ŗ^öĆśŅūŅūōå’9 ½ŗž–`“ĖÜĪC4ڱ 7Ģšš¾‘?šŽ}™5›ŽiėF«ęqµ4{ߏ±Wä2(“XwŃĶīļ#ø‹o3ė pź ø9ų³Ūćśt™õ.æ.T Ć4ˆžrŖ6źä]\÷™õ«eŽęXk1w»C’ĢśÆīśc`öeFß•‘éO•'™õ²;B˜“öu³ėńtÓl։ŚŲĆŚ,6£- ĄŅn<{Žzą¤$‚Č1%’N!õ8ÄZ*WFLVρVœ!f"fŖ,R ‹ņ™ĒӏĄ<Ŗ_č=ųd§ŌZ8I7å!ŖŒ…¹"ÖLŠ\• aśf÷RAJ)ĮA:eŪqžŸ.•±¢& 0ß õwS8{tĆģ³IFōņ]3ęĒ»cÜƁą~aļ)ĮÖLž¾£ĆĻŽˆ!čocĶcBt׌]ǽE±qqBƒ6’uĆóĆŻžLŽĘIŅvŃ iż„J~ēFøEŗŚtŠʃi¼M€?Ę"­=ŠT‹ŌĒźÆ?ŪĒ9q£›xGNń°ŅõĄ§‡śN¼ńūohÆćęwQ;\['ćü8r|}ŚÜͳĒP,Å¢Q!£W÷OŚ…Ų8čŽhŠÉ]Ē׋ ĪfŽ7śŁmy7ğ%×1³žĄ¼+ƍ ć][% ·gLø%Lƒƒq˜OĮ6Ö4oz§Jūōņ@ &dƒPÄĢśGi5DÜüóy³š²æfS?ĢbÉ}?ōD&Ņ!H;ŁgöwßM5+r)€Ų*O"¬åCšRUƾ“ki–¹ś eŚ©ątŖģͬŗéĮB5Ėą-%B†FE¬Ā•Aj©,\¤‘ÉųT·¦G®P+Kć3J)•¹`+²ĄÉr ŗÜVDPNį€Z) s-E°Łæ*mܚNyÄLætaÉé{Mn(……k©\Y@jSįL ©ŁŠźø®¢$JŌęźķĮøN·3ŌĀ 7Į=µK«„\­¬> mkõ7-X²H{D(…±"t;ą®:+H 7 Ī®K|*`Œ³üjNÆÆößTlQ"oŁ×F>Ģõ÷××ļÆßæßķNÆĀĪ»Ģę_¤Č>Ģą3w¶0„Į/~÷uŪW¹éé¼żĘŹ7xsću3 ņ*¼Ū’žżõūėėw¾}=ÆučćÖZJÕuņh> £ž;½?É7‚‰,·¢oæK8pč–Ūe‘‡ź»å§Óå§e l—m3Ū7*!OšB éÅłŽīYŽģŽ/O³k…„佟ŗ—Š×‡/NŽč«x’}p;¼bDĶÕ-jĢӛóŗ,ˆ¾JŽ<Å”œ%Ńšž““(Āx@§–(6¦)ī±”¾ń2Ķ“ įąX9Īs0ß6”ļ“ žQ³į€ØĆ}ūp™K™śj„¾z9-ń(©“¼æ>-m^¼Ģµ˜Ė›×¼#éį=¼åzxO J›‡Īܚˆ§ļĢ«Y GŚLĒ‘sÖJwdÕ$r\D±ž,Āҽ²®ėŗėŗęį¬tźźœ:^įļęęŽ&É+cm}hä… ā3č¶zöć!Ā]ŻD䣓ƒš²„÷Ū“ī įŹŻW•B„ó ó²śfæš×ŖÜٹ4J­ŗntM• Ū8,iŠ‚Yb0ęcwœ>]DČīhlÖcŒŻć§Zų}9>ݲ?¬=āo Czaœ#JfžR)vķ_yėŸćµ%6ā/IÕ_½ż¼syÓO&i8yS(C˜ŁÖ²½-ŗĻ‹o¾ž×„ū2›!"Ģgė”f³rÉkó¹šŌ";£Å ŗüUŒ =±’¼{[GĒ»EĖżÜtSĪD)W©„šUøłG°r®X„kķ©É)†&ÆFĀ j8œø‚ˆpåŹćęZio (%Źf7 Bēń$Ģźs¹¢(€Ģ W…Z€‹ QūuD"…”Tؗ3B"X+ŖouF:‘ĻŽå§E&P|‹fuZƒs P9œŗ 5‘0`Ū”+W)—ŽŪPÄ)„T.—R¤ęD”sŗF·#å”Hu8õyسn¬Śp€•QŚ^JyH½„}q‡B2D–Ä¢U…U¦= ¢ŖnZź™Hēˆ“mc9ń¬­•k…š”­»„œÓŁMɌufSYØ^ŅmKÅfźģdēOnÄ$tu©Æ<=(s(ĪŗŽÆ±ųģó—Æž×b¤Y"[IćC/²^Õ>~\g7Ż;­sīę‚óÓ®—‹Å“t8tŒ^‡Ęó8r>t !¾ØA€BŻm$IƉ·’”ĪB{­ˆīa ›÷7Z951–1‡›}Ŗ‡²T›/O’Ų”F—I7†½ūņŠ péŠ 61ƒ††† Z7œj. ŅäŻėŅ#-Ä"Ąlžż=‘ć6N?šL€K]tMI˘øu€V Ce,¦ž¹W_Øź' ü’×’ż_ó¢YĪ“‘|’D“G¾®æÉŻ-%5łā~ņ{óęz“¬1žź*E#1o‰–¾ßā@q ,ˆ¦ĻS\8i¦e”-Wkdc=\­_HßF­WCßkCÆö½ėŅŗ D-ųŗ˜Œž4ŒqK¤ći†˜nś4kęܧŃÓc?Ī\Nc4am9†fü* “žš-Äéє–E»’źeŗ āą¶,]®ķU Ē׏}‘µ–RWk‚ŽŒÆĻķ2ćrę›äMæ ā~Ö[FĒ®øҤRuĮ×å e O¢œ^ŲäģÉ€­”]vZŽŌÆźļ{ōšžķ—Wå ‡ƒ­¶ģīĮ¢!`ŗcŗn¦(s'|-”"ē+cžÖS¶ßŃ2Ļ”NĀ#į™»®VĀV*…@Č”Rź”+!2  ńü«6v®„0ג0åLG¦”s¶O5bO©ŗšN×·–o1R…š!”)QĻYUÜ PZå yLfyŠ›BfŽÅsō…›ĮQš«ĖŠyōŠZVP—ķ•ńĆó²—ødÖāéé›¶0ŁošĻcfmÉ*ĒqōĶ×[Įģ»××"°Ćtebf ?L®żyódւV¼£µ4R5€›+«–Š˜Yš€TT+}‚kE”"R+"£NøeI9µ"[w/A"JĶš±éķ'BL™0¢±AF !’ö·{Øu5’C‹j+ą!2'’L ”DRa©µ%w€@ŌpjŪ}Gį‹”^•‹\Œ•I.”*õšu·ĖÕ¹“!qI©±ŲaА*Œ0Аžō Ą‡°ČcÖÆ*UšāŠ|IįzUą/½NµNmh¢&iÉ"µ —$’H€²Pb Ę>0µÅÕĄ£øJjrķ»9¢cßę19"%¤œ)é<¶²&sK  •bSN"yĀpX±V‘B"ˆ½‹Š—H’…Ū:ܤÕÉfl`w~ƒB^ÕO}3N;½““ądqo[×]· £+ŠŚĖłĪ±UÆ/:¶:CŃŽ]Č­»š–cė†,Ą³“jžźŸæū¹›žĪÜĮļ+ O”ž17Ž­Ys'T‚YÖ]ģv6"· Ś}_š—a5ėÄF`+ i“\?ĒćńõõõÕŠÆĒ×ć±RtÓx|=ĒW\5+ÓBģM.”FLe–åhHęū{?“Ü9¶*L+:¶ĘĢ_{no[[†2ˆ‰Œ ټĪóŹĮ*yÕ®+f®Ń±Uļóαµō²„^٬ĒŪyˆÉ€]°²rjāū¶Uņx€ŪÕęļėˬ©ī}}}}µuHųāŃŚ›AėŽ­m×»“jÕ«Tįfwōj w…G±kv{ĒVåtDĒÖGx ÄŹ›Ž­ Ć{…(Z ©/€mĮ±Õ!žĢ+:¶īŹckĻŲ_ÆŲm”ĒFƲŁ™¹‰5ŻO˜]Tvz1mŽ’MS?l8˜õŽåŌB ŽšģƒßŻ`˜\ßZ’>™ö" "Ό÷]üŻśłc…ž=yŸåŗśFõnF<æĻįų^¾–Ķ”üī}Ž}½ćR|÷4ˆOO4&—±üłtÖøYxD{tyõ‡µĄtlmB,±^ļw*€ŌW«Q®Żŗ=e49nlˆ·Ž­C78¶źõÄŲ÷]ĒÖwń–ß­'FĒÖ{uĪUŠŽ­c¼o[o~ŽmŽŪyĄõėz=ĖŽģ~¢tŁŠjuĻm!'é±ÅĘāļwz]& Ę‚ń»LČĄāŲzh÷ö:¶ŗŗTŻ9¶f^plżżūėėė«żłõõõ„‡õ»ĖhēŹå‚G:Ź»õÕÅØ£ÖzzŻŃ±uB(öŽ­7.bKųnā¼µÆĖÜ#-u’4ŗléqčŗ‘›ŻŪ‚ŲrĪŌ@»×ćŃT!õw»éŲŚą£^–ךQĒŠųŌ½pl½É¬ĒŻżōŗslĶ3ķ[??????’śŌ—n5š¦cėfzMf=T3—ĢśårļŲŖśøŠæōz½c«Žēc«~ӼޙõޱuŁu3‹ĀŒą,q±Å˜Å9¶ŗŻŌ®5³ö“y“N"`JĀ)ahoį4ĒlÄj¦°%̦יĻ3§ó#„–vßQHX1 4ƂV"m’_£œŖÕ/›ō%Ņ‘F"Xŗ"W'M 1%,˜2BĪ@Ź‹«@ćv]­ėŗņuI¹øPW8 œ»ˆˆ)ēæ2|R$=č$TIX—Ż Ś}V©H" OČåœl ©sį©šUäŗņu]]+®ń A* ōĘU&Č0',(’ˆ©oŲ•ĖJ6ņŃøĖ“ūt—»›7ŅGŸh‡{ h©yJrõ_5 ‹i’ĻDzŃh"øzHŪ9¶‡¬ĻļßĶBœ¬ĄD„tęÖõÆżėß’ž×śśśżõ„ŽļÆÆß`KzĪĪCLršWyi¬ĀÄ,Ž®=‡Ō˜-²Õ V|ĒŅrŪہļQpŠP’ž×ĄóĄąÉxÕ[fK5±ÅQĆłµņ’ū_’ś×Õ¹[¼­³4ū•ßæõ÷ŹŗšXN?Y‡ģķN£É=Ø}ÆVe˜©šm]•’Aœ»%"»«čÓ¦”O€·bdėG‘ęŃš^M9§œ}—`jX›gŃÉ&šr“«”)Ęq®UøÕŠ‚4%¤9Aćģ>˜AoōǶˆÄQöV°½åV+()Öjķ®oĖ’ŖÜneˆ²N{²ŗŽ÷Ø8dO€ĻŲŪ§¼NļŽ“āĒĀé Éŗ²MUq4ȧL–¼²{҇®O`™ēI2ņTęēÓdŁöŗęöõłł1žkł×,oł².Øõ4ü™×!_­…Å:œ:øL/ųCńåt‹č¹ń£y}æŠņńõŠgß?%¶‰āxĻyh’ŻĶ›„j5a;ƒdŌ„”ę*Ńu£»wņŚū)(M{uē$PnՑˆÖ7É{Ō铪x¼͌"ų=̄×ÅčĆŲĶĪśÕ¬:XĖ&ÄP7ń]D/keĮ¹(LMŲä8,Ū:žĆz¼£Ćonė¤żÆQ_4’“Ö-Aėn]oćR[Õ6Īę8 'zŚÉŠcD×ńī¹ADõė¶ŠēŃć,AŹiRˆ0ęenēcéVĪųENMc=ÜōfU`:ŠŲÖøø^§ˆČń¢ė1—«± 3ÆćP8{{EÅŪ0l·9 ;ĪÓŲ5#2R‹UAh~Z†$ēü³§$ŸŪxVl’CÓ·ćV#åž×˜lø)µ÷u:bŽ§ÅłBĪc#ŖE„s¹½čCo…EŽf§Ėa&²Ż¾°Öō'o2k™)Ēõx<¦žįD†ģ©:”(\Ēāį)Š<2ö°Źjz¦~ ] œņ-*»‹Ųż‘ OÓĖg^‰ 8=µą£ø'^ø]­×IcJäłßóšvŃõv×wøO s3õāĮ¾ļ(§–Qe®ŹÅń(1Īm^§JÉķb`fį©wŁrא‰/™µ>Ķ‚I0QÆX4np¢Ōw”Xj[4‚µU@fDf„ZJB`œ§ ™©“²~Cø5H\NĄt ²P&JĒq$H(‰D‰ÉŲ¾—*#֊`[LĢ\KĖńj~©Ā|®(å¾.Wߓӛ„²PÖ<©@­x5Q$HBĂU0AEÅ1—šŚ»$­„Z’T&’ŌßąĀZ”h¶ĮI2Iņ©^ĖU+ƒ”‹Yŗ­.ŖwĖC»Ÿŗµ"r„$ÜfµŃʅ’`‚tG"Ź$ŒxCbiß+ż*…˜ńšæ6Ƶ€;ļD„¢“…ŽH-„į-4+QŪ ]fPŠń$Y C²ƒ_GõčīóāiEķĮøĀ«•0%“X`€@é9åtĶH\ŚR[ĘŪ$RŚ?E˜»>Éh“ž\aź©ÄŽ_ņü:ö—ö·cZ¶bżdģõ…Ęa @ ĪBƒ›¬8ŸiĖ}·‹Jś· i]q"$Ė:”g\&ŲhR¦“·5eƌ5Ę5¶įMÓó-øČe ś7MøÕšzĒ š‡ļ›ü㔿¹]˜>@ŪŪ]a4ļ¹ƒoGė&ą•ęX µ=j–FøĻUN–U9|e *l,ŚH¹CE„WŅ"W’’¢Ūs|Ė-˜<éAIv„6XZžhĄöŽotØŠ9l<_ļKHżps\ O÷hė‚hé;®…‹hfIW„<ļÉÓ¶£ß3å8S]°gh½Ł&ēB‹#® ’6A²ÓWʮɐłÉrZ›s=ķ7$[Ķ|o(PĻIOęLø…›ƒjzśNžŻėC›Śą°¶ŽuųNŠ0.—āy/fIĄĆüö8ėóN¶^€Ŗ[Æ0Ų "žÕ²T.āҳ‡µūZÄ;޼é¢Z;Ø;ڼ¶±„7‹ź¼[˜{öÆʝK’]“Ąmtėu„Żbą]ąé|é÷ßX žł«æńĖŻŃ¬F·;:¤'.*‰ń}gØ:7ˆŻ ›żčƒܬ²ŚŒ UÖ[XvŖB€ ÷ė/,$*/‡5l™]j"‡Ń°_x ˦@®ė»C0Z=¢GÜįnڌH”ƒä†ŁFx;rœt’Ąj|—qŠŪĢ ĒķZUņ±!ķA·{Q*ć‘]§Ž< iń©’Č•1e”Mœø]SāÖ¦;¬·+ruś“ļq—YEŗŽ4ŹŽķ()Ž×®J€&ø—RN6ņ›€D ‹ ĮO‚Q˜Ē˜~½mņśŸŚĆõæNg|1÷G/"»÷E§4ѧ22ĮčĄ7m‰0žFy6…[ƒų.³ö©ņ½ó®[f갆N*‡]€Ģ„Špķ€Ķ:(<ķi˜F©­Õ Œ)‰¤4:UR+ —G_ŸP”\ĢH”VŠś”VŸ“”‘riżWBmzjY–!3eĜĒšäV%ė,Šf­ÕĀoQȄ[B ‰ )’»įö ŃĘYõŪ;aBą!‘ĄŻą ’„Tvl’7ż"Tw‘1ōg”Ļœ€’‰• Q€Ne{­€0Kżž©Õöęøč81S–iƒŽGܚhPŒvŠ5²’Ź+ŃĻ) d}XĶq9«č1éŲ¾éž*dSQüi»1[į¶Ż¶čY“õļIĘSŅóēķ¼|uŅĄ£7ųĘt^×uķ˜–zćzé`.„mo~ąÓŌ^½ mX.’ƒƒŽŠ¾Y£-r JasŲśžm©UżAŸBuNt >ćuUi1J,j]{d„ŌŖį¬i&™įJ;µĶĒo$ L“Ö}Į€¢Ÿ¾ÆXÖyÓnĘ|Fµq/ŻųŠ2 m.x§²Ē[=,Ķ©•goPG}^HLæLc ®žŲ6‘Pc a +…“w*Ģć Ż×Į¶ÅgwÅf¬x[æ2ݘ½Œ§Za¶Ļ+š£Jk驯ŠuyŃč…¦ūĀÖÕWę9ān"zė ¤Z]óē^Ŗ’ŗś›Ü]wG•\"1×jĆ0ė¢ć`¬3Õ·ņ§ór7ÆóqšodoŌ¾ĪX˜E±Zw4E>«čŠŽ%f4°Ū§©#ˆāåY§Š`ueāAķĀl‚ėq(¤åóŲ€OĶč8 O½œóį,’lcاżQKįÕīųrĀ{»c搞¼z”Ŗ1MT¦õtām˜Öāa½•)HDq¼Õø &>² jµĪ¹ėiŲ.Ō®t]1+ķĖ©ZÆxFļ'‹˜LóĻD¶ęb÷śčÆīøt6ć8Ļóü8ĻS³Āxƒ!"Ā<ā§ļ1`ž5¢&‰ä:ö^0Hp=ŠiļR™}n›ųTˆQĻ…čćõ-Źżįścõ¶­ĄcĄāö|j`–mŌ”rŽćŻfÅĶĖĒyžŻ+ė<ĻóŗŠĘĢĀöķtŻķeå˹,-؝½D²K1Ķ7KĄAjz­Qę6ü‘Š¢Ž;J¹–Zl‹ ±8£Å›ā@FIÕ×F>ŌJ›Ū²łø]GØ-¾Ź¬šz3³ī„Ł~]Ę>ŪmRz_]×Z(ŗIŌÉRt7ŚŲNMˆÖńn? ;Łø#µ[k-:ÆĖ)ŠB,„²Āt”5<Éi™¢ŠvęņxTłŗJyü~”_æ}}=¾~ż~<®ėńõx<®Ē××ļŚjUŗd©MJ©‹× ü(c»jÅ»VjįŠåąŹEAʰ”*Ršb¹*ŽÕ’įī]IqpAIĪź}’g®t€“?@ °Õ=ē쬻«²Ņ·ˆ„ō]*Č}³TčŲ¾RŠ@ė¹ēż$lūŸ†Ė'Ź×•Ó% 8!«żø$D‚*zK"Ė€4W‰ē¬µÜĻo®å~Žw)’įū?ĻgéæÖNƒ®ĀµÜm»Ke©Č]Ė}?ļRĖ󳟛’SśÆüż¼ūhkĒõ¹ī'¢;Ģ$1é.€C’+!„ėŹm¹Ej»¤ēżlēÜŪ„c@” ß÷$0rÅz ßXDZ[÷n@ĮĢ•Aī‚•zVS¦ķĘ/OĆ œ”8]ČŪČčBŹ¢ćę÷÷÷ó~>ŸßĻū~>’żżüžžžżūļņüż,åž–ś|fNó ™Ž©Ā*ž ÅūIwbõ7ī{#°śz<®ĒćzčĻžoóū—®/_ÆĒ—ζѻOż=RĮš–™RĪ×Ō!œ±‘S3^D‚kČŖkĻ•sóœĒy}FVõöa,TbCg³ÆĒ×hŽĒ—k(ßpżg„°»~Ą­H="ž¤Ŗ–ń’\'›ŽIŗ"2źńNK»7žœA‡c¾ē½¤R7o"Ćś"æŚ’ĒöÜM+Ō§Z@`“i41¢[ZĖŃŽ|=,ϘRĪ8 CD„kć{!žYKždæ¶fēœī—īķYiė?"fTĄ ßyÖ//ī?¾µ×ĢōŌ <ņtÖį8† /—['7=Œ3 /’·Å@Ė‚?ål#$ź;Ć£!ƒy™ßWLć‹į@æSķ©˜H³—`ė26C'q¦Z†„Ę0%—gōŸ_ńÄSwJŹ(ķĶę榓@0¶‰Z?•=µi@eāmĪ”[#č=zj:éM øz¾ÆØ]ʋC…ĖļÅ÷Čk޳kLUŸßä™b?$–>jžĶć`¾y¹#HÖ\}³[–DóĪŸÖŒ7ž#n8›Õrßŗ3P†m’ćóĀĪe‚GU»ķ6tļuß„2;qųpZ#c),¢×±śL·ė¶NĻ›ß żøCŽųļÄ»nŸÆä‘—µ„/“±„ą čya¼ó?€•=¶>ŚE÷ųØėbu ļ%ˆšŒn©f+śSÆÓ,X3õ\w¾]D6f1Ė$¦Ż€ĒÆ+ÓkØ{AŌ›ÕÓ®vh‡ķÜJŌR¼ą®ŻĘboŚŚ’Cq™½ö^“AŚ ·…U ;ĻöļßZ6čŹ¢œ*L÷„ocGĄ-ź‹,Ķ·Ļ2ņ6u2‡ŗˆ±šTѧMÜØž9Ą¬œüĮņ…ÄPW嚊ŗœ–l¤0ŲaV$ÄÄZ\˜ŒĀє̸m¾śi?ą-rĀ®ČŪ {E°£JĖQ—,uݶ ˜9w ĪĮxZ¬—ŻŁP`]H6`43ń²÷EŅ1B]“QGH[“ōĪĮ‡Yw¤C!ŚMް‹l–¹I«=ijĢ$—£Ū™Åų"¶Łģ”—c-;»¹åk¢‚ą žuB%ƒŽ.±½L[^9_h”ZaCy•øŠ§Åƒ°xéX±GæW›’ „Ō„Ę~ßßæß—ļ.f_ZnQ”“:dī»ÖRŹw+rįś}sł›ĖĶ|~²”g᛹>ń7µį]˜ń)‰«€LĀ"õ–ņ”ślRs €9£—„u†Ū}ī›ŌŽ)µ1Nׅ”3 %W E°0Ö>OeI glą¢œTSEtzĮ &åQ%UL elĮŒćóĶ‹%ėó˜@J(R“Ō‡`‡{hVC“‰‚H)7œD˜3@J’ūœ\‘ J* Ü„)gĀė¢6rR¢™5éōżImmĢUL…I!el‡€<«<‹ÜU„%aŹ„؈ÜŲ;±–JæńY™o.Ļ"üŌ~’»šż]¹p+š—Rj½ļēĢtōZ{ĖI–nÓń]Śø»7i42`¤zĢ)ēØV15«Ķü“RÖż”4ĄŃ)DY=+ ¾=AÓn-o#®Ś¾ÆøÆP’Ńg[ŲH½2I‚€ęò1D›[%ū~9æ?œĶ‡-ĢžOÆ[ļŽ]›Fefµļ)ļ¾–HOMū]Ļ"Oy”†Ō fBśK`¦¾X[Ļ k`¾œRŗFŅtę›ĒĆ 圞śėÆæžśõ×_ŗƒÓÄ+™źŃ.Y °³Š‘Wžkjß/¹e»ÉŪßY>zš‹ÆX=żü/‹­ŚkV¼%Ņnb|—?UÖĮ%«HļUĶ­kæ’õ×ÆæžśėÆæ“«ćd œ‘oćjä†,›s¦yjŽ33Vś¾2z]ĘYėŸyØv±ZĀŠQ“–śOž+‘ĄåĒćJøżįx iU\Y°ų‚umŁÜÓ~`k逮ōįȀŽ&ąÜ‰}B~wŻŚnĖõ†9—/<4Eǵšōk=PŪ¤ īØ1Żī'@“Č8dyBō1ģō}l6lÜL…§yD©®T%D\WėbŻkCFóÜģÆ k¢Ļö®8y@ø­ÕÓūѼčüžpp^HļV9Ļ×µŻvsćüiśWß„ˆ+vżĢ"v,ōįĮ\ė°kŠćÉ 5ęIt&—¹œÖŖx‡ŌQµVtõnŠ “õ³}ˆ#;ü†™j$:>˜?¦‹ī/ <õ0«”Ł@Āg³#˜”Cų * ø N>¦ą~0;ĘėuüģŠ²NÅ$pD÷ĘŚļZ•Wöłcl¦ĆÆ«)xŌ,ėŸ»$ †ń–Ö  .EŸ8‘ˆ]j>ŲāōņĖ]ģVä½,ěnńĀŚKšč\._ˆ†ŽŸ}E”1gY3ÓÆcĒ×·aĢ_ĘäŒMÜé4²ōS—ŗ7¶Ł?©ż®ŁĪøŠčøéź’YĒUĄoŲōX7R"šš“4„žÅķ@œ²Sˆ4Lś‰•kmśŠÓ‹Yœ˜PŪ5łŗŖĢā«ę¹c¢Ļvø/Ļ»ŒEj’ĶNٽ•z»_2k­2Į^øĖHĢĻś,ŠG­ģĢŻĄ„ˆMæ³V®<įŗm»Ū‡Å€k‡†•š4AR4`"2nĶDRY€°%µäBČ_Ø3Ép}ęŖ,\žT™+=AŖt’~~–ĪŪĘ ÄBŅ«Ćgŗóˆ—ˆÆ$’FŁ(”ŠtŽČ1i>õźõéi_%”„{śPĮī  "ŅÜXpųŽ@÷»Į”@ˆ˜‰‰˜X0!«{9aX”Sx„E5½‹ŒÄD旉ź†o 6‡Żf%ćöY [Ūé”s¾4­¬ķ¢Y ĮD“ˆI$]ØūĖdl<ō雯śIH˜ bēE —Æg—E©2ū½ēy«ØNĢ}Ü$Ģ_š5&Dį*ŗŽŗ6p«*Q§k¤25°ūĮ× /4HœŸš'L<‡ĢJ½…Ģ,³ˆ‘ėv!Pt^Żųvo'›X\SĪČ¢.É©(ē\–w1tßü„Ó_č NßĶĪ&7j[Ѿ¢üQ§™…µ„€ U­K×Ć0șu˜9,BÄ×Ķ÷Į>¶Į½ĪI¼sdu¢?³„`»<²e6ņ ?ź(ó"&–ŠR‘V|»±¹E}ĪP¦ŽÉ-ŗ‡Ų «¬cbw3‹½}¢•%śĮø®Ų•­įMGĶČe8 ĮyQńŠM^Īž–œzH†Vg"z©€Õō”ts¼ą°“ ÜoˆwH˜Ę‚č^Gä”ĒKĮ¦G‹qWxčó§Ļ-DVŁ«ų숭`Æj¹żö[tܵ¢Żéo„ŠöĀUs|XŒĶ”śŸüŪWG†€`ˆMC#ÅŪѬŽūĒyŌye¬ųɇߥ[Ɯ{Éī7Å.Ö}æ8f÷•uoīÆ÷Ö)Į¾ˆNætXõ ƒ@ķ„ź*d¦ńxU&ŸjR¢”ńV:£óØd<­^€/Ęé!įµs˜šé[EœHśŠć`“g]aЉģā,FuÖyß¾™a•ż±¢Æˆę¶“E•U×«ą¬łb¬ø,Ör¬rÄPw(q›¬Ļ捍Ćāf±ē9ĶAö|ķ˜s-e ]3ŗńĒƈōÕc0ėՅq²©ĮƒīŒ3·o„ˆķm›”ż6ŅŅ3čn¦“ÖL(s­·}bz‰]UķgĀŌĘ@6Ž\Ąś‘j?.p“šČnąÉ§Įc²\ü>Ņvq~·|Y²µĢū|l^–ėYČŪ¶Hw“ĻdYb7īųp»ŖßÕņqź`%ųwVmĢŌ…&ņćMZåkVš“C ;k>쬗żĢyg-/·Ö1ŌtœćĪś;J”8ģ¬×]Ģ~gĶag}ĢHˆoĆ·yĶw9U%ę„9œjư1[o“…µļ"–”„QóPÜŲ¾ł‚Š„@„ @sŅm‘i¶–Ǭ™Ė%=×ĻŠņIN뇅‰€™ 2”É-P*…JCĪ9Ɛ,"Ā®ŲgōžOĖBŹ+Ō„ ŅR‹ĪWN”rĒ)6!aY‰¹-EI”DŗlȼĪ*"\±åOsó½Yb&”$˜[¾A*‹H5ié&ł"’ØĶąÜ¼T™­ Z#tÜdN”ņ•—Śö¼īńēx呟2ŒŌ‘½aG;wœzZ@n!$® ż4 Ū!DĄ½~&WA¤\Õ&ИĪā…ŗ»! a…+7†;kžŪ8¤C*é"4–‘&‹²=Ń.˜[o§½£éœ“į>tÖ@œ€@ĄX L“ģŠļĮŪĻ`¾Ń6‘Ū¬yXtōä«§X(œˆ›åė*šOŪCģö×8ŅŽ]äI [_Žßåūžg²i“Ż[üčņ–ÄßbćÕń8FBX„üąü£wbŽN¤Ž€ŃSĻø©ĶtŸ,“jē²Ÿ^\tˆ >å‡ąš_ŽÓ|ęŒĄÜŖj±ēŅDcå?ńūŽŃµäBļćŻį™„{Ā™ĶŹŽcėOڈĶuŁ:§ŚŃ¤褋謾Xš ÷G²¦„ĪĄŚqYŒ÷ ÓĻ@=ļÓlü'#¬<€ēRĖ©ŸęŖõfuüŃäļ†#Ā?w?ĆĄÆ!“øČŪh"ĀéaŒLŻ£- y‡Ķ„żėēƒŽڌ{tō[šiMūßj'£Uéö†ƒžu’ńĮ]ˆyĻ ¼)NŒx\pÄÕ齇V9’MG@œĄ·”³ÓÄvsœUSÜ#f¢Čś—ĄÖµyŪ’Ų½¹…¾®;¶ŠžŠ¢=oüqõr$˜ź—2’Bķ>äoćģč6N śGē“ż~@:ŲĆ­¶•5ż7§øųŒuBĄ\)^{ÅBE\õƲżwnsæą‡k~$Vdx7®˜”yXĶ#xńék\ź+XżCƏś ?Z¬įTĢ;]Ÿ»;<#pī¬Ó+Dšzåą >’Āpl}¬Ęv4Z‘UÖ·öą-ēÕkföą½›§qŻĻ;D€<‡Ŗ5zžćQ­#Äyü³µĀ”N`ŗŠ+łŹwÖĘ&Ļ͐?˜¢·;k ŗ(„p½K)÷÷S Ü•«ŠĶõ)„…}„V†F•Ba N“)ŖūŲÄ™;Œ” 3(ßņ¼ł»|?»f÷³Ō»Źsōs, uģ3« KRR @-P„-d„*½ĒbEŒ²t˜žWՊTėUć*„éɔ©©ģNŠ”’PH‚A&IĆš›/ō’æL(‰xųp'” t”$D2Ģrō‘3!„”# éNhPŲór½1Ą(µo½öļŅ©P*@©¢CY’0Jūł æ­wĶSź]˳k?æĖ7ßOł.ŚŲ‘møÜEuK§»° A#é×ZZZäYł&©\ļņü¾K)weGāośŽ†ļ6Ē}ļ1KJ˜5śUrHęĪ“øÄU ʒŻē=m¹ūĶĆ!°MÕAÕæ^~ćz„wę›ū=Ę•lfhńȖŻb1Ÿ—ŻĢd.¶%pį‚n„Gb)¹ 8‡†k«Äė‡ö‹Ī”43³z#gū>J~Łń¢ć–!†¶ßh§Ib>ņŸžø»wĪŻ½r>96ĖĀī§JÉŲ5脲„:aÜbfį©UŸwŪ«Ę ŗ<`VmŠÖØdxĆļęć÷Œ`#x|Oc:ct±IO.߃.Ś[TLv×ķՍūrō—Ł<öś{3x)ĮPÄż#BųÖ‘Ņ nGø 1w=zĻ ]Dh²¢)„Ih6Ghü.­!k­•-²„é¶\‚bŲ†2ž”ÉOÓć ŠŠMLmqF«ź¬'_¼Š˜.\“õ>]7jG ¬ž¼­õ{-üXó L›×t¶Ą&õ`:p!Ä*fkm².³ąŪwŹÅ§i»‡„šß©}j‰»:õČk­Õøj¢IĖ`¤©ć™EŒÅ uŖĖm €ˆVć×>6Īʖ†]æŁĮdUĄč?b"ŲŻŸČ0s&nĶÉŃŌ|’,1HX™ķsņĆļ:~^ąßČó›š{c¹$r&r±ŻbūVÓųĢ̱–=M÷¬š½½2Ężh™ŖŁŃA6d÷)Ä5ˆĘ¼¹jmį¤Ą6YńĆ0¢ ‡å|åKŪÕ·TF+ ꚯėö合Ē5×!/š­¶‘“’ Ź’PœŹcŚŃ=?±aÆæ6ćf^Óś4ƒ)[ķ7Ų²ŸU|ćÅöUޟĪ^ŗjĶžj9ś±é¢ )µ‰‰X^$Z]Ō;ƄĄa±ź-é[)<©Ć;}ĄćS$Č H¶Ó.v # NRĮ'PBG;ĻX“ܔ*÷„S[§Ż?E6Å4[æM 9~S5]o“IµŽø-ˆcy;¦×±ć6ĖʂõšˆćEż`ĄNy&ōP€Yj‚^ *AĆ#LsZŠĶ}ĀQĢn¦ųt2 Ķćł¼Ÿ÷~gż|µ³ö aŗ"ń6#ö=’›_\)£€­DĮl‹<<Ī„vś’yĘ"żBĪ™õ_æ1Rā»}āOŲcBÅSė~īwÖŚOj*3¬3ū‡TÖÕņxģå„ÖVuź wŗHFŃR"¤aø‹,)A×G©T“HbŠ> 03ō ®µ®w¤*4  @Aę«0Ն ``¬µ‚ŌJĀ *“¼&K“oī+³ˆØšśzƒżå«af‘[R³AFL §Ćƒ’Ģ<ā•)]וŅW¦Ē5hÜŌØÜŌņD˜¾šŗš+éĻń|{Ūō¾šzPžJéŗ®DłšyJI t:Æ āˆį$%i4čvW ĻX34i• Ķ1‚ݼpĖ B…ÄBµ Ō P± ™pgB%.k?5L’Jł© RJ f`fHż¾„(ä$’*5Ü( (ζK©™z‹įézó@7÷ ƾ óC#Ŗtś%¹ßS¢õ¾¢éb1稐W“OĖOńE;Ļ“ö³ģ~„čo}~ū3{ʬ• žV’~šÕ¶?ԁ–ęYB½]“3ĶŽtĒ‹źµÅŲ¾JÓ7MÕG2Ē]ū½ō²ž ~#»4ó¶Ä‰'=°4ķĀUY!­oŃF:ć€×åĶ™^ØŃ±6‡²1ś¼Ćo¼1= ߇{Ėó¼żdÜĀÆļ2éž2§£ŠēĀ‘ «ķj<ęŽO/ŗyóōyQźź³~øõwæ˜ČM·÷“T ¶$ńW²—+¬Ómw„ž<ż4wjÅ-gxśģµšĒó{ńčązÜküš±ŖŠgÆķ¤×o*ßS|Ó„į§ŗųVĖ1“dB…vŃ»vzÓå&7jSC×Z~–†±³Śģ”§!øÉ7‰¶°NņÆlŅģ[r›ć[ž5MŻłN4‹į̟¬zC²Ź½¬a“ŲĮ_Å’Yņ—b©–|į^ĒUŲ‘‘fFŹßš—qZØYėÓ=^SŪuķŽNęŌ-¼ ayöašĮxyi'TĖöс$wwģ¬ĖĪĻƱžęɶ„ͦŅ$čÖ×Ćbż ųacOnśR|]~[ź›#“ DhgœÓkøYęäø m=WģµŚĆæF_ķDkpÓ° uēļD}ģn =öĘķ&»åīŠŖżØ«Įµ_ŃčWąß䓌YސĀgWaį@+—”L{Ņ ˆøå÷ŹZ‹ō°0Šü¤ŃT3ż˜" ¦i]qѕ®&ū`„N<—ł2ćq$ć‘Ē!×i=Ø ­ŗj%eׯV7#[c•£]ox±“·œļ4¹ATńķó<Ėāti%3’lźDŖĆ·ēF ŠŃź¤xh¾{ō4,Ö‰”Ķ£qKdE_÷ždO‘ßu›,³čT˳ŖŠ~4³z_ŗYOö·Y8ĮČūž†`•W]¹wŪ¢.<łūĄP§Äķ¹SŖj*yXe-ņ\4,›Ż‰A øÜOOųƒ²3+‹ €4ædd‘Śl©‘+Bi'†ŠįĪóū"*Y#V’Zҕ”ęˆĶ­ZŠxŗ(:uNÆ46„$H$å<Źē­>Ō2–m›]SJ ‘SÄ é!€|”[/?D¢Eˆ!õŗhJ”šS‘RĄ³HŗåLéJ"YÉĢĶ#©„S “ŠļĒa¼A„‰“€°äÄzžµƒ‡ĘQ&µr&H"”@’~ƀzµvlÕųooķā,t² §iGžē‘Vüž­}œµ·DP³Åp¹€[×Ń<\¹•ž ś9V„L_‹öÓfė'}Ē‘ˆGĄķVĘ„ū#ˆ\D˜©[.Ü*O*;š¹µ±Į_ōńGœÄī¾då«ć˜œ‹s¬]ķ}©eē·ÜY&ŪD®lQ„Ķ·Ł Ųēłęų=Ä‹ófŁū`ĒĀžsööķŖOw3æš’üN“hÉZ”„yEvŖ·cÜÕZ™‰×ZŖ/Kx÷¤å~ī9±Eßń`ĄńÕN żéļfČq—W­~¶Y`Q» ƒHć J·Ŗ|īė9;lKķ/ óiı§ļ]h^ēhųī0D,‹ī“źķdüĆ_µ±#e öÓ:;ĀŅĶ€®*‰ūŅ®W43XŠ9·“’›i–ŪœJĀźņl¶­Ø²›kj“ŁĮ¦ķLˆæ>JsoöāŅCöÜ$‚Ć˜‚A¬t)Ÿ:hõÄa3a ­Ė.fęō”Ģ“Óę×Ō~bŚFKH„a½;ŌKb©'®ŽØTF¾’ėÉś| ļ8Ŗųz=šŖ4’ŠĖ–r2÷Ęūgi“”ņMŽ•æ55sÕOۜˆS#{ÕwÄ·2` °>ŻY÷]õCżķĪzėæ­¦S‹X³1ÖŻČ ŲhčĪŗum³ō)ū]Bq¼·”ZŹ vÖfösÕ [ēӋĻōśõhœėz|ŗ³6V_š–Ęæé멉Žč·Z®‚~ĄbĢaŲCÓĄ PJ­õ¾ĖTŗÆ„² Yåūf¾o&`ÕČ„6ē·of*€…:jxڽčy,äZJ­µÖĮ*„ q`ęZje…†1”[PŗŸÉ˜„ BóGA$¼ !_ią ķŃɘܠŌŌ6I©ˆµČ(ūgz\£7‘™‰¹Éc¶/ø”E懈‚/m;rBĄN- 'ŁĪ;]Œ .Ōė@ą2x›ĢŻßXPīŚNµ–ŹĢ … ŪMŅźVµV ZK©Œ ‚=Ol¤ÉyŚõž¤‚PˆuŒµN@X@Ņq2īQ®enē¹Üw­µčøė{$ ź¬iX[‡ū*Śł˜j‚Ż1n¬Õ\¼cķ€,~Qy4)ł[÷½ŖHż±j…†ųѾ7ź‚h"BŪéś¼n£"Lü~=ī«Jk€·×ļ ””cń‘Ö¾éŒJņķ£8§ydaÄĖxj‡÷SČž&éÓóž|ŠŹ)2زXęX%’·œœŪŚįO»µ×õo.rJ^ĪEp,ŃŠ_švƒž{ģ÷÷Ɩ?Žč×ĆwļĶ»I‡Ēą¦żmźu˜~ßn ߍ§ß$Ÿ•īęŹ'›šÅA lV-v†Ų+61ņš#ŹŪģe—°90=>ęO†c¹K)w1DˆYc½ƒ†¶ĻóyßĶ#÷¾ŸĻŪu/j÷Ļę‹ßßūĒĆ1(øæ}»Æ·ėŲ"ž°­®LH›^‡ÉC»ž­§qļFŌ¼a5T;ޟK"įä_F¾Śń¹-R\œÖü˜×Ū÷ų9ŸūóÅŗmȞ3n¤ÖśfšŻĪ:Āa]ģn¾_÷zŽ>ßśox¹ę]ó¹1x‰[ŽŁ©ķ‡ö;}Ģϧ7ī(¬ķD»“ÄźYįug ‡eÆ\³ÆY›»yDäFė’8§1žśG¶ <¶,8Eó•žMŸé®ĖGOķÉ*žė`fM|wŽīpb«‰wö~½õūi”ć`މ 1‡¹Äq6±H^m¢ZP­'É ć(?—˜fĒÓŻ¾ŅŻĻU(<ξŃ+eÉ s:‚0Xß+~qē ȧĻGµŪ]XŹŃeę|UĒė^„sö {L_ćÕ÷ÓĢd¹Z0Łŗ³o›>“o“ź«&„nŒßŒy™”Æk2m”us]ćåvfb/§GunüƒŁń“Xėīeņ Ń»’»ć4L~ŽĖšB0‡DŻ×üt±~3oĖŗX49~ŠO6.t\ń~ÜŃ~”Šč:<‹Œu⇋ōŪŁ1N‹Ķ·€Ó?”œqÖdŖZžu@³æœ—žxv ßļä&d ĪńÅh<^÷æž|ķĶäxœ?]“§źpFŚĆ†•Ž»_••+³‰e7'°Ó&°ųߋĆķ»ÜĆžYHš(¢aŹA8 6~ōāņżĆtŽ4Q³³’ćł.cž~rüyģČ6›9AŅ»į(ŪŲQč’#;kĻhSĢ8īŖå§1ŌŪuk‚-męåb}$oėųFlfu„?ßYæ¹n9ī®ßÜ×Ƽļ£ałoķ¬³qĘD(€”ȗJŗeĜ³ś+ČBėßĻR”R¹¹ˆŌRZ±ŌŹr—ʬi¾†Kl+ĒwĮZDō®¢Z€„AŠ`ģ„eŗ2įL!R"$E%7%Čl°·2Ķ*–ÜĀ kąŪī‘ 7K!© &ó:y-!097Z¤śżūū÷÷ļߚµÆ­ŹŃ_,y”ƒļµ‚2c*üDä5I¢¢Ö÷¬­ž¾Z_“~1Ąy~Zéé×oÉ]V©•ƒōżß½!µ]õ¦Š5Ū÷ė'×zqś»ÖŖõ2ŪØx†Į2G‘Ž«@üŃŅVƚåj)—Rx~éćÆ_æžśė×_ķńėÆNIZnŠ•”s­?5ó©w®;°IĄ¦Į”Łl•1»²ƒį¤ŲŹbŽpOŻ ¼O}÷Ę ėģē<7 ’ä˜ö¼&>Š\g ͐sjPJÉkø Z1$D³3.Wļ®Öoż1šŗ?Æu¦n“ĢŠųėׯæĘ°ŃqŌæņZœޱ]ÕÖ(āÕFn©§&;f?Eߍ 찚’w«ć#£l½k ķńx<×#ŒG+ƒ™Čüf $)5‘bų‰ŃG:Ŗ5۟tDŖų÷Sųšśxw>ÖØ£%Jh4Ó ®™ˆˆ½!^L™ö=xv>3“ļ1ž9YÓļķŠuą+¼µÕ˜Õ»ķŃAž’¦|—­‹Å² qūKw„Ü\ø4·ńŽ;°•Ūū¦ågŻk†+ÕŃ/+óŁøC•RkŃ@ķóbŚiO #AņĘÓ{4™Č?yL¦_?z] µoˆŲN½ō·BćJ¹[ŗĖ·2ėū5;pūńpŒf<2Šż³'z¶čÄ®-u)¼r æŲß ™A7m˧ōƖ7 q£~;LÓ¬ŪĖō¼ky,qÜĘ‚–IF“ļÓŁ±¾x źA9£œ]¬YŖ'åžAģčĻU-ė@¢8Ę„7äōŒō6VxxŖ¶Y Żo ©ńž®B2 &»qb~ļ:y{%8‡±±”¼Ė}3©n›½Ō¢k¤UC••8«Ė°Uk †H& `ĄņG³³łŽ-c±ž±čŸĒ ?*™[Ł{ųóųŃÄzŗX»ąč$8pj7Ci™…žœŖĀ‹?’Ŗ wnœI"’†ČŗX—Z¶·© Ė}·Õ­„vŪ4… ĒĖ€€jŗō*ē' ŠEro%hźĪķūūłżü~>‡§ę›ĒPÖļ=’ģ\“ēół¼ŸĻ§Āeļ!֜Ÿieā ŗ³No‚GJ‰ĀÖjzīļ{:¦Ÿī¬-žņł|>›KwYš£7Ó3p}XŪUW!-k|ŠE„Ü÷ż|~?æŸßßFŻnŌ»ĖŚ‚l†‰#Gt7¶Y›åDĢ ‚”©ł¾ØÜf­<'į+'ʭЉ¤xøÆ+Q¾ré$KŹ9_9=ƒ–ˆ„éń ¼2źž­ļįrßōä šƒ‡Ąõųśŗ®Ē¤+[ióėŹ9åė”±{Ź Óć‚.5“Z:0+Ŗ4)•`Ig·ä#©'w鏦ŠĘU—²*rß"•;Śļ¬—Ø?ćĪZ?§ß£įHå¦6ÖEÕmZØ„W`^§;ču„Üœ©‹ģĄõHØŻ¶4+§œ'×%„|%ųz\×××ćj­Œ‰^Y“ņ蚖’Ą|!=Iū±åV”Æœ3u2±@ŹW¦t}éøŠq’ (åku¬É7i°: œ€Ą…„Ōö&lq¢ńÄF-éŽmpō;4÷6L£ÕĉSŃ]ņ‚<¼Fą<ÅjÉĖšœG”Ìņ’īc^Čt›•g˜m;ÜųŅÉęƒtHz7[ėµ5ēŖCe·iŁ“ƒĮž)Fb³Ƃk%ėœu#,¾=2h–1DžØ€Qāńe³™½Xö’õōū§ą’’Ļ ĒąUhōĢ„ŽŻ 劊ŽĆéó£\kŲr*•Ų94ŠažgŗoȾŲŒ?¤ Œ6©ŃN±§Xų"(sNy:xRÆE¶§‚” v²&TK)Å(ļŸŪLĀŌ¶óŅ’Ć’ē_ūÆ*“¾ō®=ķCDĄ¶µåB-;ū ~¤ŠŽ [<äķ°˜Rąč= ¦Lb¤>:żŠ6Ī9„g}sux™üa5śžų¹×¢%Gµ‚#„ĮŗŃxoĻ’ß?œÓä4:ā-ķųī6ŃԈĮAN³`ÓéHgׁeĶ!6żoŚ8¤Õ§d;įŌZfMk££t\–<šu}•čˆE=-żY½Į7*žpT÷‡ÅDźwv4Ž 'WŠO› !ē ż÷f§Æżxźē1JńÕż>pSyō"#āŒ!:)f ŲŲźrą!a¬'»rž ?FÖĄ”Ž—;ŠJļ’KĆé’śdxø.;żüD/:6ńhÖ;Īōć'jõə ‹ĘՆ‚ńŠHg°Ū÷…ÕØ£āo1ž†!Ä\`¼ŗ<Łī,Ս.śķ„ŽŽ&ą]ćƒŅ N„ė’śŚ<—äĆÅNłėVkĄ6Eė„jŅn8v 1Õ²ŠĻ³”ān›qj‡a5m©:ßuRRŹ×•čŗšśE)ēėŗRJGū“Rʹs‡ÕgJš¾‹«6 Ł]DŹĶŗ‰Ź-ˆ\A p"ŽÉ€" ĀóV@]¹ļē]kyv“:-“޵ŽĻ»”śd¹Ÿ„jFøŁ¼?oĶž>Ė}W.źĆ}K¹„>ūAš}N­µĢ¬AĒGŠ ‘“Ę[äĘś]Ė-õw)æ«Ü„~ė󳁊?>Ń{R:ø#EŸUī"·śB©wKė7AŖg·5ļ’×ņ¼…Ÿµ”ūy×:[¢„ß„Öūy›†c®õ~ Ø/Ļ2ū2%‚"PQ:Ÿ:k?jæNÅ̜ŒŃ’\WĘ8ŗ®+ēDæ.¼.J:īT“§7śŗ9yS֝¹ŚhĮ’"qØŌāJķ!!3’LŻ„ÜŚLDZ µĪ˜“hŅZéŠ$·lŽi|!¼¹kM¬Rõ ?;vר.Āt]ńõć…eMŒ1Iēx" ī)ɵ”żČzej‰x˜eŗ]E½׊NQ»åDåŅŅó@„Ńł)ōŚpmī—cŃD@(:NĶļ}La„źxt0‘Q\ÓJŹ)6‰„õ?3$ؼWb_Ŗ "ĄÄ Įg;BtSØ1˜ļ\Ā)ģŪÕ&ŗ?«£Äž}q‹5ŽCAäzœWÆåĒó÷¾Ńf…»(Ö XńŽĪŖŃ<"äį»j…Ēč%Įn‰Ņ?ń‚‡Fx¤¤õuńOFŲĮÄŁ2(8ŲƒČšmĶĘÆĘŗ=fō“cńU”7.hVfĪ=ŽŪ ŒŖX|”Sy“ąkŃg¹”Œē%źS¶3!=ø×õsö{ŅHŌ:"ču]WŽ·ßłN_qYM",3ßYpų..azÜf-{¾ņ.„ˆ*õøĪ_ĒŃŚ›£½}‹#¾pˆ­”ȆŸI—c ųż2…±ŗ$ōT­5³=P×蠟¢I©’Źķu¼25ūˆ5ų1e)ē?Māą!ao5¶BjĪ€LÖvŁś“;@ūĒõį‹S'bAŪµx˜‡­ŅvųŪė[\šF¹ŪåņżøqŚ#ĖØĄÄÓģ-ŒCĄ\Ip7K‚›`_ ¼_EžčŽ :Īč”0’©}G JsóNӚ1UvҼ•žĒČß­;ķ}©3˜ōĀP®_NENm¼”GŹ0„N_1½mŖ%'A9†ü›^Y_'XYŻgöŽ­ø±HŪ[­œ˜cNv¬£öŁ.×سڢEµ²”V)yIšÓ@¶YPHäć|SAy%(ĒtĄk°€’Njߤ*Z»¹6­‹(ęrčŽieōžMmٵ£1quķĪģ^Šg]ЦÆ7­»ÉŌ|4ĪbU&ņˆO‰šńĪķ}Ŗ v˜čåžä&«ß«ŽS' ęz h؜̲̽S[ÉøXkŽ+¹<·7=³1uōvÅQ£c}rʎ>ś„S<—%O3O»Vs¬ Ȳ9­ xS_į%K ķHdŖjøĆ_Ģž“‰—•-āBšoMrļŌŖĢžĘ~žŽ¬}¦·ĆgGÖ}t{g=»›ŃŅĒ:iź)XNĒKtøƝŖr,]Ż‹”Ņ ŸW“…āłÅėåY«ryĄų¾¹(µ×JĒŖ GG>ÜŪr¬ƒ»ēń5wāIM$īvöńü XmŌ ‘(ł²ęüŽQØ;Č œÄdtv|«5³}˜]-IjŻQoķ¼½±Ć}6 ŃÄń€$9ąeÖė!ļϲ­y˜žŽ±£Āąt¹ĢłćāsŒ‡Å=jčAŗcĒ%Ś W!¼ŌĢd "*ūXw@96ĶˆWöƒ;ž}ÜFZĒFęµ|łn<Ų1ź .ƒv’z?¦²ež „ŌFČVó¾ļļē÷ółż|Ej£wLŲŻ³²OĖĒęĮ¹Œ}ę01®žˆ}düjņFæ®ėńø„ _łŹ:t¢yŻšÕ~󈋵Ń Ź]=ėńx\ĒużjZKæb~/œųøØ8śÖ¶5Ōl¹Ń–½a»_”ļļēóūłż­V‹>]ĖŚ£¾ĆĶ88MŽŸŒ³įūL)!R·TN9äLt%"DMV ZėÜŃ|,HMTBk(“„t%¤¤œŽęeˆH3. DŒ¶Čōr"°€Ņ±U86… § ¹€Rø‚Ü„!ļū.•[EgȕzßRæ…KīūSd&¬­CGńŽæKłę§õ§>śV$ā^ €ZX¾«ÜßwŚ:Ķ'XϻД[ źuIµvE65wąl¾¤Ģ–ĆēÜĀĢĒć”ėD˜. ‰}„–{G’”0NŠ—n c2ˆIĒŃE”3Ąg„˜ ŸīsIZ^[ ¢+­ż@6hKO ā%łė5F|bŸŖs±1 ‹›jWRsMqĒt]ėz\ןf?õ ­ŽÅŹĒl1|”ŗšŖjé„—ęŽĪSL£ŁP[łņqŽ›k²ŲŌecÆŅķ½Ż¦’YŸ~RgJAfcŹĀ†Ēl¤AeOu//‰²Æt éĢē•w£ŃJ™Gٵ6ŁŠoIU’Ļ…Ö0OB¹j_óńėė×ׯĒ×ćŃP©_Ēćń„uŹ ü&©*’6·_Ź)Åė_ŠŠZR4:C¤VT¦3=“`bŅÜM“sØšKę¼ć5µæ“B×ZįŃåėńėė××/ÓhJłsk¶ŽŚ>A€]źc­9ū~¶ćą¦z¤ū掎āI+ž#ūģü„eś ęQ5®vgĖb`š‘–™VĘźØ=±³ĆŲ±4 Ÿ»lpĮ¶u“Y›šŠ‰“x¤˜˜Ś%8 u›ė5St1Ī8ļżeÉ@>Øībósā'tĆū¾č#Ā UĀ'„ÖjÜ4Éyć8ńjÕ}«0÷nz<@$ęéµĶ0Ųī…Ł =f§ŠD”dś€ó¶ć©X±ņz›`öŗˆć»ĘŚę8)ĻūłNĀiˆ-³—+ŽbͧļŃć i¬€7Õvēm*ńc§Ū…%³@›bƒf‘4”H{žs&½LŃBjµ­žł–ÆķŠ›<ØčL¤|żÅ&ÖķūyXÓĖ"ĢźÅ7ڰķ[T„ĀöĀ’¼&XĒ „‘AÖ @øL«†»Y`掄Ö=ÓĻś}_Ē—ż3im1ļxĪ6˯՘ķ¬įĻ{½ŗ±Øj«¤dPģ“B„Ķ[MćB©ĘīH¤÷č^œvœąRš°cįķ°9iéĢē}IOÖĆŹ)Ų!<««ÕXĪn'"š|¶9B—ņŖtĖåėq¬Ŗ[¹ļ{šś¶AuŃßį2·x'"ĢŖöŃÖāõė"¶ź~ųŖL|}]üŚ÷Ŗ`z×ŽÉØĮŻēēMDD*ļŚjQI#M€†4Æ^’šģ1tØś¶TÕ-†ŁŸĄ. x=żNģÓŁńõ(o;Ŗ)%Ž_`²žä“€`ńŽ`|FTwOO}H©_S7żŃw×u]] żÆS·Įf¬2F”¶84Gbśų÷÷ļf Š.Š „ˆrj[Ą°&Ņ^śņ¼‰HÆ{€tjÜ“ńŒ¤ühß<„ēGū*¹b@*l˜󇖳"ąŠ›Æå ^ Wz2”*·įÕŚŽŽ¦uB$¶yF"ĖĄ£”±ńØs†ALŲiĆh6@2DŲę·@½ÜÜw©X …€³N„„0\=Q%$LPQ½M›hÉ ˆ<¬YwƒbJŠe£IiĀ#-" Uo@:Ł}b`·x# ’.$Ü-Ī0æ” (ņ¼r•é3_keŃój2›ö¼[–b\—0¢@.ĶWÕ„TYNXXØ«Ņę  dš2 RķvÖ©¾©y ¢*5åĪя½_{“9·ĪŌq0o£öž!ŠĒŃhķ9Κ*®Ōü¤Īą°2]$D¼XšLż@Ÿ#6(0šUwvb€bV9/Ņė šZE A >ŌŖ±ŁčE [MżuÖ~‡÷Ч¾ŌÕ.į¬O˜”‚9F%KLæX·Rė2f«ĮĆq{"Փk†gŽ©µß-ļŁŸŗ7Ś'ݬ‹—€åó9«³g€i23ż66Z~võŽćƋ.ŹW`³¹  O½‡Œ6Ÿ×E\Ō(>±NaĮˆM`°Œ+²Ć(köÅĄ0į$ØŚ8†ŗŽęŪĄž2$eb<ń ĶQ°„Š3›ŌS>%‚`y²ƒ!ģ6UVŚĮ5ģ¼aµ’ Ķj©±[ŚĄ25l pāβ”–½G`Ē\æ÷ČRudUŖ³xĢqĄ›’Ē>Xw†5J»O[‡³Ó†ßi:ŗ>›ū ĄQ¶B7;Į5ijņmĄēÓ 1Jū!Zxčݵ*Ū‰„ņul@ž±k²¼µü„Ļ ޾Šh!UŠćóŠ*4;…ī»Ņ”ņV¹, ØŃ©]h „væaŅūöK(XhĢĻįų:²²«­Š/]ŻĒŠļ—9|s\ībžYՍ!£ōƒ~ųiæ~Śļž†Ķi’<:}Ī"žévÜø|ėų?¦‰Ķ$žiyŠeōł&ÜėYNÅOu­ dPčuČ䜚™µ¶‹õč7CÆ9ĢŽCź_ĶŽ:ėæ&,Öś~«é£ŗ>Õ ²ūe&Eą‰”­,.āfpj}ó÷œÖcš¼alČT`njŽ£Érr‡j¼¢€?œJJ^qżŻęjŽ2Ÿ±;œXȘ·6ś‚žx&MÜÓÕf`F„(B¤Uü$ģķT<7‹õ¬k¼Š;ūēœóā­,ӏ^N‹õæ J7÷)yēåśHwµpzĘĖmćz±Š=į(gŗäĻćŠ ÜszŌYł%c>6’ŸŒzC7kŽ™"‡Ē]SˆN–«5Æs;ƒūkÜeĆ6ƒød’*Us-!3ŗmŅæ' `‹“0æéŽ{gŻ1Ē5²ŸWņ¢>ƒŠlgżZkQŪA_q‹8¬”qjē†&Ž‹ ŗ.żŁūqxśeĆM'vå1,¢1ćs'1<(‘˜ė}×!2ā@Ą0žBhG@¤‰eŁ"3×1Ļē„˜2¢ō¤@æĀVėó"UŃŌµ²ˆpUü£ŌR[ĘNiĮ¤)-iWRĀįēRø!§•6Mdl4 &I€‘rB Dķ"EųdĄœ¦ō>ˆ˜{Ā‘:Üōłń¾ń¹Ü‹™€)gJ˜2!#VH …ĘtŠäŃ@Ļ»!ܹ l_U[ź“H)µŹߊŌREń½kD³[·˜Y²Ż0ĢJ“mˆ ö«vsef›‘h2nUĒ"ŲŹ š|`«ŖÜE\ź}Wfź‹>mÅTQ‘-"Ņa"‹]9RœxūÖ­ņšz=ä6‰ šÅØE‡vź·3’VE{XH .ĖAČW™vÆ­;L[ÅŲļ˜ĆXŚŽ>" d§~ «n¢ųóšų:eģµ°äšņHI³c£”Āh¬nvóˆCk  ¼:Cżt,…āl.‡ć0“˜o’™fęµ{m~j“„@W5V›8s·"v<¬>‡/ŽĻ*‡aönŗI„¹’A{ƲĢō˜“֖ž ›üāž!ź{Ļż¶3+r¹OÖÕn(¤<¼‹†a‘ŁÅRN)ÆČē’{£Œ>Œ:“ÖD5Øī'A¶6r`&Ēͬéwķ²×ڐ–LĢÓt9’6Äjø9rÖÉ(ųƒ×­~—DźČ“ gKA­ŃxŠ1³{°uœÓ#œNżę:÷Ńū7: 8ˆ7ž”«±}ŽOаć²I·.Õ£©†šZنžf }GÖmJ„ŅF1čcŲ„ĒZŲĆ^G’ųÓX,¹ņm&į:«ū²ę;żŹOä,‘tĮ‘žPWs#5¶ķ7ķWo2·X:.tœų/3ż¼ĻÆ*œY+£fbu³ÓDØlÓgĒīŸT>›:NŽvļEūDĶjŗraŽ˜d°}qz1žx‡ŁqS$G•89Å„"§ŃÄŠKŌµŻLńhŗ€5ūķŻķ¶QfVkŚÉ*š ųŹt˜ ’xOZ5žÉŽZtVĮ;¬2ū¼ćšv~'ÖGķKŁ-8čķ8˜`ĆPŁįAßÅ¢ėūÄ|0P…8äNē¶]ETŸó}{,øĶ5ļbžsæõ~µ¦ĪĒq0ŸĒĻŽ«[ŁįØõeēi43ßՕx;PfėKbā-ā/'qMŚb:k§C¹“³“šĀ¾q'*2†ģå”jÆg4‰ßįæ×K俬„@ģ„W=idåĘ8P–Sīœ×¢šŽĖt£>©‹RJ^óŹgf¼zöE~…7£¤-c”S >ÉłO¼Sg°ģl@ļóõąfų—ķ»¶ęµķŪ;!ænߗŻĶ&(ŒźĆH樣*ļV51ŅM·÷¼›2l”|ņōÉE§qŗzŖdDŌč÷>ū,NtJUÉ.aēŪ×5 ßµMbŽQŪŃ5īČĪNP4—‹É `·Y°!z&£Ä÷óŁŠ$öE³ ""|l߉;X½¦)ōtUµ@DlNgŸĪīåˆčr^}utŅŽżc£1Ō”ÓÄSŪ ż½­ ½{†śC'ą(’<•EXr²ęĄ)Ÿø5VG²ėŠ6™Š~\!09÷xĶķÄ#ēäM{x$A]|ŻgĖÆésóy6‰”rJ¶xLøja ¼En6f'Px`$ī2…9§4̫ЗR°3$Žü§SŅˆ5„(ėM*śøŃļy<4šō1å =ZŗßsģŌžnz?ćzŗĢ§¼1Öϳ†76Ң߫Łęq\š lžUjfVĮ2ól[<¾›wT Ų^“jȋ¶Äµ›ź©$±:4OŠq[õ`¹o“56\f+—{J𩦔ę¬v‘ŠM„cą“jŽõ]쨓£LąŠóū(xŌ¤I‡¶įŪĪ’ļß’ż÷ßæ’žū÷ļæ’ż÷ox:€5 ōļVyĀ5ÆĒžr¢%嚗„}«ęė‘$јmjh·”¢Å¬u±tņS§qźBzŗ{¦įP[±ĒqĶ,.!ĘmķÕkßQėęM{E|Ū²šÆvƒT߯ƒKéļæ’žż÷ļßkæjļĄ`P Ž ĀÖ`ņåä8xõæŪćT’FĄ“HŌļ ‚yQh(ÄX^€dś4Ć+½#'v“@}Zó~Į üØV||Ÿ1ĪĻb+9šĀ`©?ƳtlCNķCó=Ų¼ėą0^ 7²"¶ß/īJąŲŪAhŖŽå|l9§lįtyAGĆzĻxXß<zж’<”Ļ:­×ŽĀšÖģõ,jbæĘ£d–ģ¬S@ Sėmń›^×AXŠļŁR{æžś}é×ćżnNéó6”żöī!›Iq†ų6tŸŹe{ Õ;=Į؇øštßjā$’k½Ė{‚韵cĢ'Ɣ±`Ģś}{=ĒżQ<“Ė‹#˹…–»ż#÷16€Ņ’"ttB\f+` RĀcĒwžd?ģ‘TFŃ W „ćóP+@­Š©ēe£D‡ÄLBRQŹŽ}Ą"\&Ś„N“4é~0,h„— žŃśsVŠ:°®Īų[Ægf.ܽĄĻ«4tćŖ ŲÅ YÆ{\&&3ÜTx²7ćŲÕnŪŪ<ÆżCƒ¹/՚*jߕ[^x®) 2¢ĢŻs·čLĒń"ø2fĘyš“ӃąėyĖ+L.ĢĮW¾Ėź‚ņ=,žļRJź°qq9šŸWéų ¢ŗ*«żČŒŃŠĻͧWń5 ĻS˜$lÅfžā` Jöuū¹ÉJLd3`œF>žģ:„°“jń)(±ĀąŽwÜūµøī5Ž[„ō¶#†'—fyqˆ¢pS‡ķ„qøfRÄa<“sĆŲi¦–,¾jļµĄłÆ£7¢Wćü0„Ū„ą·Ūg[Ͱ"k¤¹;ž}Ć2ß*ņÄ7łŽĻbÖC»ķģŃ_ń¹#2gežµ0į<2üČ)½N£ćĢŽ;ī=Ž’mȼ;N}”ß{aŪy]Åś U'žóšw³=Žåxv[zuš‘qyV¼4Æč‡Ģ!Ø~o^j³mĄ)ē8Ÿ™ķģuø^|³ŖÄŁö¼ZŁŗÉ*Ż5:zt}R}Š©wŠKšю.Ą“Ŗą.N”9ŁjTk˜ ŖƒČ„ݲü=¢>āā3młŃ²Ń[ Ææ'ŲĒ’Æ<āg–öćĀ›Ō‡īF\„‹‚øµŹ®«BZšN؞ŽE<µž!ä·ü¾żĄ‹$ ;°“'āŪŁŃ°›ŠmDǁWćž*³žģ/dyBkrēÓV±[ĘNyQ«y}½‹' Ļ˜,¦{'Ę„ßūĀRćęZ{FyÖ:£NŠ(Zˆ'ŖŅ‰Ž3Ÿi7¢‡±e7`` Mp°ŽKŠ‹gœœŠgÜb a‘Ļj¾/h[i$<*õŒ¬ÆĶ:ū‡—ēē‘ćkyĶ3ēęm­üŠn›~yÉēŽ‘»öäčę·ÕN—W’ØNćgćÄÓ6”)RœØ^ž°°j¬ŒBT×bYvÖ¾ę#ǘjĶ¶wł§Čš…²eósaö1^ĖĪzAōŻń– 1w<»=š| J jł““…Āõ)’čĶŖrn÷X­Pśļżź]ķp Ķø¬žØ ćfŹ8`Q›Młł-ü,7ó}3ßR°V,ĀXoąŠŒX»]ņ÷­…öеå»Z*”įA“ŁW9QæÖ(N1#挘ߧѱ#b“ Ļ)M’(H(‰„ %h\äœP[6F$wĮ+ģ16g—KéKŠU֛ĖÄ-šā/@›Ī”š‚”ąBż™’O!čēālИķRūaAikWsµéžąŌ¹Ü”EZ‰ D0åĘ!‡”€„’`šØ J)ūŲ®łŽōMā?µŻ7}ø•ŠŃƀĄ-ɉCĘ 7 {§ļ÷v7ƈŒ•į®Č:Ītܕ'Ė÷“)ģ\É¬°ŽĢµŁoļ‹‹M"Dz/4t]¹‡ƒgĻkm“rŗć';½ĖäŁ=źFęjI¤²a$ŽØĮrOĻMĒź/Õ]^M–÷÷ƒ¾z„0ĶG}Ż;ĪŅ]J¹Oķ>"x)É×Į°ųł¼š_ ;žĒŁå b1U?Zé"°äÆę.ßÄó⽘=<Ļ=t¼Ih’3XĆ*SŸ‡d4m[v⟬ß?6yg¬ļߖ!Ö3ŽžĖ”š£Qt“ķķ>"4 ¶MQѲ*R:ŌŲ=~šE‚Źī—a;Żč>…KąįdƲkŸwŌE@üå‹ÖBõi•¢ŪÜMde›£Y#Ą¬»F‚ˆ"]’lŲ éySĻĄāD”t÷R”Žøaяźd0&5Ė“YķTšŌīzŽøķ¶€Óϊ;ę÷OéPw ‚½Ŗ›dw ļA&_K_v3°ED™2ŃāZsfÕßwy­Ī%Ļ3Ÿ…=ŒUjņܕé¾4ĻŲhó+Š’‚wAō„6N²“<gŌ£öĢßu>~8ŸåūiHŚĻėĆI­‹ķŃQ²y—Žķl7]³ÅøŲZNt‚‰ĒŖcXĻ)q±‘µxɝ'_$Y?·³ƒ 9müZ5Øc,4čÓ¶GūŁĄUĮČøƓŗėb‹q|Q{#Z‹–qfŒķvÖĀ“) `±’.Iü¾=¢Ś1šÅzÓīqŒē…śWhĶ Ę ‘pø$¾@@„ŗĻ±āę i˜WF!¬3†#lĀõ-_ÖÕ")åœÓu售ǕfČÄpĮ ķ]vM#Œ q©H̵ŠZ^Ū½tĒßyė2÷¬cŅšN+#ԊJ6.O»tĄ£Łö0‘ą•śu%B BI-m(P™ˆkÆī#t6Ńś'„œ[ž”ōsҐIśRŗPˆX :Ü±Ü Ļ¢s¬+"0 ”h`Ŗ×­ł`h²T € ĪH„V@fĀ*P˜Äm}æPJ)Ć WĖŽöšóõøRŹ×•SWÅL¹3R[ ҌY+’bsgYĒ×w,"-ļˆ?—"śØB`bĢ Oy2 ÓaRž~Ų^ń½`ŲžÓiˆŲŁĄÄÆÜ”rĪ9’27©1Ü3tķ’/ŪeڽiĆÅ-•ÉŸO;å«InMŠwv4꽯m! ś2„°Ök‰H©ŅŹ»>ż7żt_įöžéP“A©Ź-ø¼‡€¶säĜŖpŲ×ŻÆøŚ˜Bxš¼Gź7$…Żą‘H°•Óؔ¼ɓō!ĘóÖ~ā]ʽĀī*ńÜ*1<±%܀&"NR•„\ūɗ8Ń3Ģólæ{~ÜeÉße ŲåįT›ü-_w ¬õ* ĆŲŁ@m,9ÓØļųBĀ”k?T­dMėŹ©ź`eś7G ’\ŠX!œ |Ų$ꔌܦ©-~AŁ+96ė‡ā’X÷7Óöf…ĆMü_ĄĻQČOö¾éŗ·|ęgćGņCchM6ł=O|ai­pᐮ^RķgĶĒÅŚœO6'{õH£÷Ū©Ē}Oµ=¢…ƒaĻf±FÜŠ'0h żéĆ/Ö¾‹»ÅŚ›Cń‚[ &y+€K¶ē=WŲŽ9)UŗĶĀ…„2?nŚGśŽņąTü†£ż|“e{\+Ķ«(ŒÅڊ›@ČĪĄŹ×Ž›ćū»ų@©ÓÅ©ŌR6‹5@DÓ.»Æys×˾(īZ0Óū’EĶ€†}i#ÜĆī*å“ö'¦ėČcżöšz‘g"ū§ćŽ–÷ŅDQž‹»%w—•Åõ}õĄ×;kńéb9LcI†¬¾/YcŲ7Ŗ˜;YF""ʝµßa[-{sĄ³å4ŗĒU8õ޵Ļė5BŽeßÜøęŖößĖĀ4eB© lø­ŠŠõżXZ°3żéjj²cžČHQn®ÅĪHוS¾s’ü…ĘD‰Ɯؽš‘)&IGŹ__—2ĀH„Ø1Ķz›tģĪqNGJG;ZÓ¬§teĀž—l~ŚŠ2¾ˆ$µ ”"„²T`DfDf®cX+;—{. āĘR{¾Vq{ś³ēĻj›īā‚#]\k×½h'ʌȩ>S¤Z„m}VS ˜ å+QSØĻ)_—^÷äz7ühĻZˆ¶›r¬®ÆÆœ$ !Ļv§+SŹö„£&Œń+K{5åėJć†Ō~ĪDaFēOP¤³²;§AXõ=5_<Ęp-»ė]s^™”’,°óEqõģ<ÜFæ¾YA~‡»VKgŠwģ®v÷»»KUdU–ŠynTŖgõæÓՃ!"šĢŽ/į{ĪJ09A+¦F&ÖP¢8”­"»¹ ŹŌė~×>·:Jö^ŃrčiźŠĻ¦ĖŁ?XL§Ę‡ē߯ćä¤ÓĻė8|6qóXō‹E²`›°óPš‹oŒłś'xēβyŠĘńBzVE7¤mQ”f/{ō•ļ Q×ņõpÄ(°āłŻĮž=ĻD"Ł¢Y„¢”§’¹Xšœ!>6{|jåī(ÆzćŌj½$ĖēTyŽ›f<š¤i×ŗ!hZæĖjil=Dœį”źIøĮĻaÆBōaŠ= µ£:>ļĶC5¬õØi1“†|”4®š³©¹r÷§ń³šwš<åœŌ“ž‘ĄŠYē©“ćŗ<)€$¢`7½¶oŅŹŁj^j|Üo:ųgæ{öæ^m² ¾S×Ą¾J[ŲćÜÓ8c‘+ÓĒ|żīߣĒĮ#ccaxø‹k<)–>ņS1.PŻ.x«~-‘Z¦K‘ ¼Lœįg Wļ3ī÷mĶętöœ»('­%ŒwśŽžR6zOķnųŅÓit!ā~ ąēćäĶ# 4e?œīiŌėŲ:č¹Z®ĒŠ}nw„y=·vOĆĻ£ÉŒńĘŽ@¹V£™&`ŠzĶĘ9lń?Ģæ[żJ+§õC¦˜gŲŻ"µz{ńxŚ¢Ÿ3‰3xšˆ€F[<¤¹Z`a¹F•ĻÄĒ«~Q27£Ÿ©›½9ö1Į‰‰½¦Åö¼ę³Ä_ž,v ¼_^= ĒF°æŒ]3ŁÅL«¦ł tÆ=ļch뢛ŗc© nįźIČ[>óĻcGž į_õZdŗnģ©w{Œ7żŲĶšØoEMwn³ĖĒS7QpĉčbDČ2~¶ę,įy¼+Ų}’°ÖŽ–¬¦ļžwtī3»ĪJ·qCæĖ]ĘŠYtåvC_æŸņ="å¶Ē+·„-5œ/„į2®dēTūĮbMƒ× <ųŲYDMēMWĆ9nŽķ¬£$Ŗ~IOEaø^3­qntŻDW"ŹWN”®L”rĢAŠŗ‹šēź¼åž cä¤"f„œ £4³]Ķs·yD Z„ ·ÕŹü¬\ ×ē–čʚ¹Elž%åīšĮ\ Ł[f€ŅĪŽ„A*–>0S¼.„¦Eˆ)åDd%Š0'ƒ$ ®‰“@H …`e2ŲĄ”ŃŠŌ„œ6ĶL=n?‚ÄU€õ< 3HiÖPśeÕ»4æŸX ÄŪCŪ»”›° ”JŗX[4z¦„VĮ )fÄ*p3öp”®żĶ-@³>UßdMĆ@/µ|q`&cp@`¤‚l-܄ƒąź ®*45xĘSģŌ4VĶó“£Ŗ™‹ABœķźučBż©¹ŻŽW^ …ż–ˆGŻ#Ø }Ę2ŗ›qaߣųw^¢ƒ6i XŒŃąÜčD‰ Éē}Å[ūLå į;—0šN·sµ"Æ’iB…¾®¹Ņń$¾A cŒµd ²QK—;Į¬ƒ×Ć1æŠŹżkmķ¹ LVūtÖڐøŚ'wÉäÕMÉ-ņiu@‹¾Ķ"īŲž/śƒŽh#ˆ«±/^ƒTZ« ÖO~”¶E^Æ6óM½ģŸņqy}Ų­ó”A˜žĶ±L«zƒś>q‘Śd”Ąz1µ½ o‰LvŽfų9 IÉó0€‹ģ½"Ęį7Pšō™ł«^ēŠÓ üéļŻß·Åä“iü_…Čƍż:£JĻhÜÉŖ’½āN~ļ÷b<=dŹĘÜfŽ“ĮēcČ]įŖ9’§oY†ßrwz~Ӣè%žńūHļ)‚å Vū?śjŹ iHž…Õy”nƼm–µŻNéū˜Ā;õŪąJٹĆõ{É  Œ#ūe,n-ŚžĻø hrŃūd?ŅŅ– ?öŪŚ$ļi&…¬M/‹“jŸzb®ŗHN‚ķ†Čj e“Ē;/ÉéĖ8Yä‡+8;2ļ¦ą¬ŃH“éi`f[¢k¼sćŗƒÉh'}ß*³•-šL€‘łvócģ×ÓVMÆEĻ—b+Å„+$£†+b 3nb„—±#KČ#Ą÷`¬­)ą:pį^čæGŽ12œŪĀø‡_Qqę€\~;‘YtŻ1ÆĒSZ8ćī®Ć_«źJīcÄSńī QļW'ŲĒĄGį­eOчO‹]ō" ēµē5;īvÖ1-½ŽĢvńۘ&Ö¾M¬²Ę¤mŗ]ž'#¹jnŠ­r@4“±ĪœÕ-rč)ł‘Éh”&FyÜŻq]¤”ČJJś‰Ę¶GØ”ŚĶWš×čŃmk“äšńĪ:ddFLõrg€ ™ Aš #4@š¢JŃNäR+ ˜“%C‚‚¢zƒb4ΐ VFĘZ! ³Į6\®CRU¾™Kkp)śuÕœ4<]©Ķ™„EU8ņΈŅÄE:3Ļ6g`Ēöö'jɑʖ ˆ(€Ā df‡vņ0±ŽR`h4ŒīfA•˜Ņeøķ0¹ÖŚź1c[f’QURą#°ōZR“ŽźĮde‘Z:uŚłTm·Qd(…łīA‘-Bjo0fIP+2rEØHhōÉf?cy ®Ul@†ŠSnpZhrH(ÄHü’v÷m[’£:”’GvĻ’’keŲ y$ĄįĢīÓkÖÄ©SÕ2č²µ7„Y‹‚œ£:ĄŽ1zKĻįļ6rå2M’¢ü™Zš„-ׄ˜™»›Q0ó^•~Y–žÉóę!ß#§…ųõźŻĻ3Rl%~9Ÿjßma9=łÓ,- ƒkN² 4ŹØ{DJQŪmYģæ Fy –9čžž£ĄŌZćüüDe4pƒ:õņ˜ƒŪœŻšžéYq"9)v¾>rx’Ō’­yn «`Öē„ą·‹ژФ5槕"{Ś_"¾\Fņ@Cxś/™ó#±Ø|WėüĢbī+EĶ{IOóÓščģOQ)ń<w÷„`(Īj¶ß…ĀĮ$x¾ß’zw §fŠZšŹJM,"Bł/GHĶ’¦ę„ū$Šā°Ž§ėG:é:K)„mų’>Švf#®Ÿ’’oÜķ1Vŗ®üÖ0’O³K„fSŻ-$­ģŌŪ”f~Yež„ē ’ćæ“=>=Q‡‹c"[@ \ŲCkü·vGń=sЬu2&L‡µGrµTNƒ‰“C!ą@øŌ©` äĀ XxŠ;Q&†ƒ1•ŅŖ–”fŸX'-ł4W+~N~ߌ»{õ,ˆ‘[¾±¾>0p¦A€R'J,¹ŖŽYęqŪÕ Yh÷eŠ•¢Rś•wĖxaąĢœ±dÄ\꿘™3¼vęŠõ[BŒbj«j6W±A“Ū¦ĻW.„€ŒKę‚2e_ĻĒņ$K?ęåõ2ļ3IIū}ƒ5¾e¤Š*Ó„ä˜r°>!!äĀHĄõ–)˜C` ŹÜbU£±Ķ ̆Ɣ‹.Āw݊-yī˜{īœö±ģĄ­Ÿ®„± ĀŚ†ÜĄ©¦HYŸVöĖÕaamx’A¤1ūYrßD0®»LׯP‹%—\pK~cõ|nwī„ķĶ)§Żr!™,Ģ0Ÿ¢sZCKTĢäY‹6ĄR<,­ō6č2-§†4Ø„ö9Ź6_ø@šŲhaÓ1åkƃ8Rŗ˜ßķń]ŪŹægy5«’’źČ~@bkcüžn—Śƒ/³)솽ģ!³qÖ9µĪ_Ø5ÕĄ;{;uüŃl;ŻeT­ źE“Ż’lhŖĀ”­‹b@Ÿ‡¶dÖēŪ¼™ī÷† cßŠryŚ<IŅÆö02Nˆƒ$ōR"ż(aŅSõ0ÓĪ\§OœÉø„kØ ;ģŲ€Mø“õ5Ÿ»ž\VˆĻåŹ”fdSę£ęv³QӘ_‘hs“ä¢ĘįT[•¹åyć'M'9;U³«må@~¼Ü^ęÓc¼ÆōmŽž{ž·»’R'ÜJp,ŖCėHg½n  ōŅzl@‹Fh%„ÓA֐“Š ŻlŽ.bUŃȵ«nbą‰%u× käČüäę…ķ‹ņU’'DtžšļÜ6ķ”n'QśUųš’ oā¾Pé„#"¢\§īŌ»¶¶aē…Bėͼķf¶ ŗ®6©\!»EZBu…³S€›ķŃūŽŹ7,30Ķö+jø£ŗē–źe“‡”Y˜#ē©•b½Kśł/4RŸÓU„”RšŃŃõļāś™’w5ö:ĘN{ķnSu©ķza×<ģķ®øhRvŸ·ń>æ«`²IܘVo9ŗ¤¢ä•ļč"ė)r.Ę@Õ‹„ä¾Cž.BŪéŸ{*ųµR:0…śæŠ€ōV}‡SW™ŪRŚ]ü_GÖ²=N›XY]÷0ŸÖ2ڰiŅżö}ū®mquČü&#Āąu þi¬ŠvćŚ,ś°b:Ž£©[ıRĻ: E<Øe †Ŗ71Ě½¢ØŪėC”iͤžPjyĶŽ6‚x`ˆHGĄ8H–4}}„ōõ5ö0¦W Gš: õ’šiB E˜ b[jÓŹ/H@„ĄųΜ±B ·½Q$>IŹg’ūĻż‘—s(² ²˜rrfź?÷"aėw¬vwe̜ßČrĀÆ)×)§%ā@ÅJ@@(AłzNÜv¦#ÄńŲwŪ¼Kŗ:pHĀšˆŠ1…ck¾05 µō5 N5c"…Ŗ—ŻĢ‡čĄ˜ą P x±Õ“SJĒq¤HŖcX¤åŒx—‹[G ŃR$|Ųėųč «øē½š„m_·Xį‘6\”‘‰uVŠM |Ÿ·v$üó ¼Lv։F›®”õŁ žlĆäĻ”yyĄp zF@€: Ż.FOŌjŽ•”±źN§±{ƒéؐ?ģ™čéh[ÜĪŖ_(+u»¼é±)巑õĪßĶ”ąĒ§¹ŖĘ©Ųyāķā"­ŁÖØØī‹y’Ņ®pža#/˜µ†¶PµśeĢ7Zõ7œE&°Š=02HĪ¢—Y_,JoājJŸS±\BŪĖó·ęś‹++¢ŁöĢ5ŗÖĮžZņÖ^q“ąņøGūż;Qū²Ŗęčd ,B²õVß;ć]Ę*)…UĒä4±JŲåыt-—Ņ2¬3hö¼cžc;ÖÓ@a¦i• ½¹u‘>¬…ēļVĶ‚ÖŹŪHø® ;pžļvÉūmeŌtŗ8ģśäüūvŸ§Ŗ/ĖX}yžĢÓųĖķŃĻŪ4ÅrhÓ ÷ė®ė5՗n–[”ĮVi©{b–E5ħšÜń¾Ķóń”Į‰ˆ€æŽ7»ŠG̈¤Ā§5Ēe_:zŻ’g@58zŗĖ?ŻMķŚ¬ēz.gõüĶ’‡{ÖāY·Ē Ii‹öėĶtŽł†T6łjšĀ“õłEķį®Vż7G_UB­6„ŸŖ7ó…Śn÷OՖŚķ¼`Ž\ä_öŻtN”ė ?²€MöØ/ł3ū°·é`NW ó¤vFT՘œ(TVČĮQØxŒķ“ć±yŗ>?É”«ž’2°Ž÷ū”É7§§ųē7¤Ę| ÕĄęuÓēŠ­¹ąžłŸ åchĶąp(8É}\ żÓŁ=yvY(^čcG|(öHҾ+¼Ž„h$4"„”¤w1¾^____Æ×בŽ××ŃuH0%˜šˆ­ĶÕä»*š/TĮ =æ%ąMé‹^°”RržĄ®{Óśu[†½Ą•rę†KÆ\Y œÆóŗņč?.ēÅF·ūĀóÄėŖKF]·&ē|]ŖH§ŚÖ ä¹g‚Œ˜2“łUaO‹óyž×Õ`·•n³ŽjW½£óĢ×9š‹%_×yåŗ1å>LĪ _ĶļēEō\ˆ(gõ×$(­o[“=\õ÷(…еłßjˆįĄ‘RĀ®t|½Žt|‰DézN)@ 0 ˆ•;ÅĢ@ƒ®rą4ń@¹±”üÉuå|Õ>ĘKZ;Ģ“3–Żm¼¼<Ÿ£ĄėÓÕžė¹ ¶ ä>Ž’Ÿ~‰ķė™iõbSŒ7,¦^ÆXfߌźNo?FOčX†ĪĶeĶøå<ĻėŠ’:ĖŚĶ=‹#Ć\p'!MłĪ½^ŽŻ© E?Õ®KĻüuŠŻČ¼Ė×ķL‘Į1šL¦mą4ĄnÓ÷’$Ó:ńaÓŹµ`&Ӝ9Ś E]B»į9§SJ;Æ:„śūĆ”Øä_ē#Į@¤Ižtķ,ŽB’ĢĖjo#šļ0.ŠČ2"Qš™ $Č8ŌØb.YĻ…ŅyrBD™¹‰óĒ9‰¦%ĒRYiąiļńā@ĪÉY,[Öč5kݶۊWB£ Fo…*{Z–‡¾;”‚Õa±¹4øĆ= ŗE0 }8߬ÉńNü—ģĆÉŹ„ī#ŖuqjZ`ɜ”Q¾ia4!€5D03N£@]E[ķą„eÜp:Q¼nöYķ<Éę"(&‡s¼AƒóVi B½~:„ŃCC b7•/Č^(v&v×į·0 *1`Ą¾Ŗś ˆ#mē›čXHÉ{ōø ż)|¾«Ī|ĆÆ—÷)øčó=žūż6T’v’„÷ū<ßļÓæn“Ÿ{,}:¬YęSĒxZˆŠĘ1$öģxå1fFĻÓł–y<Ļó|Ÿļӟé~Ķŗ›wA>:]³¾ŻŅ(z V· ØÄ(0/ķ–+Ob=åå—wŪī£dmV¹7.¢į,t¢ö[šKo’[[nÓ°°śĶA ˆ­¼51ŖÉėäp*š³œJ¬Hķ|k„Ł)­>p3² ŁĻiAUÅ)–„yp1čZ^.¹tZŠ™zÓČ[)‚>9e¬Œŗ°éŽŠ¾ŗön«­XlēeæFķ©_YäĢ/1<±³a¦(u_47»®ĶSģµ’Ą  Mī0…uĀÄū0ĘwLĶĒ”į;6ņį‰e·“`·Ś}s*DJ.ų×y¼œmĮUq8kCģĻļØųͧ«Źi—Å2j–’³×€$Ēź-ćhƒ ]åÄ½Ī²ŅŽüµLÆøšws?'Ø-Ā\,½ŗæYßČ֖ šÜ”%H܀f¶õ„$/”&Zy^Ģa-Œ»>²Žåßf\ˆuåe+¦ˆNwī"HŸ“øXŻæĪÕ¬ēņæW6Š(č¦3ĆL°ż˜ ĘąjÖ>ßēąÖ8röuu“DÖķ\Ćó`NtŽ›õņ‘µŠ,›ĆZÕÅn¤[ ŅŲ™h„‡X8 ĘČ•\Œ‡Ž6.[’™Ļ³%¾”ØB‘Ų>×O§Rņu]Jć|ēr½Æ:ScŚ” XIü›3—DYCÕÅoRŠŃ»ųā9ǘŅqD„8HnÅHKŖz'H(ĄćÆÆŽD1ō¬i jSłÓö3W„Ń‘’W»÷!…{ę.DJGH_€!ĀŖßCĮH}öqp€Žć8RjŒóvŚ8ė<õˆP5ėeJEę±’Ūa RyÜęՖÆ÷UņūT ×uåŹ ĄYrOŚZŚ÷<™³ž)„d#•\(Dą—˜Œ Š"vt±Č.bCŅø6ń«żG­[[lĆkĒó,\Ģ•ßU0x­2G†ü<$¹Zė }ėįMĪÉsŌ·‰Ą{ļK;•ZsĻõ<Zr”“ѧ‹GĻB¾¬€ukŃJĪÅ'%*(‡•YlŠžŹĘŒP×•é¾€źƒDUĆ"’õEĀ,„d÷§Š׿nņA ü>x’Ē$łÖI‡Ł_įź|ńQUQ"UńéśĻ‹„Ēo8‡äZū½›šßģ‰-…­„¦n;VŖŅĘ<Õxe„ģ巅•jtūh!"*ÕŹ  1‚QßĀĒ ŌŸZ~:āqŖoźØF9śķ} 0uźŅłD)£ié`¦D"K¹¾čä¾źžą§»cK­Ņė8^Ēėu¬|ĆßP3yų­|īńzÆćxµ„)=Ż7Ćä[0^Ŗ‰R pƒŠ°ķ¾ÓTüĖ.~>²9Jła‰āč«ę(ōęXX·żĻŠ,Ä%ŚW5ŠĆZ\o;<£}Œ dŒ)Y‰źŖ÷˜ŗÅió«Ķńy_tĄ/ś©)ŖžįŽ`=Ō¼õ¹7Ļ¤ēŽ\]׾؜±ÅĮ5ŖW+˜.ŚŗU [žŪŖŚ»= ·ßŗņՑ)0Ė*Į,œ +V īå쁊Ä}³Įó]Ć„›{DšKĪåūżž~æ½ļØE~ psżŃ9ēüžž~æßߢ£3EŠwhŚ'§€^ųzŸÕ‡™ö\%U%ćÓ§ėbs4ģż­ƒ³%z|kŽŪ½Ūs†”ūAéŗŌ7öC׿ā¾ex0ÅØD•MMYt¦Ŗ$Ģ7G‰He†śĻszūWż×²Eüö{Ÿn+ķĆ„JY.&tŃ<ŪĘwģžćнA93’æīR‰:ĘŠlŹč6GĻ ‹ddPÜ&…ūČŚš'-"kō.żmdmūŗg ”’w[Öü«°ZķŽ’['Śū޼ Iž˜c1 ­-/Ł6*ÉX?ŻwĮ5ļBėó9śžŸFÖ0kY9š]d~[ÖB=Ōi¤ź¤5H[Ļcr@ˆÄčš`œKÅBĪ9J’¼ż[æ—¬4@U hp¼¹• ˜ ‡Ræ:F 1†ń†P;w[Zpa7 3†5ļ@ŠēU•Æ÷™óuž¾ĻėϟSŖĀßßß¾ßēUžœpµźWńsu¶„ÕQ†"8ÉĪō(Ę[r•ę)ēēŸrļļ?ßßßRQ?’ü¹Īļ?ēyå|¾Æ,²rg`-»ī2_ö¾TD µ©“jW@ 1PŒu±JąBQÖAģ@•ĒB0eīŅ™ įX’;ØŲĢ’½ 2EĄĄŖŠBB;h·ķPAlśČ>æē8õŚfÜėR"ż9~Öģø!śŪuöģ”*Y‘V»§-ļŃĪ•bJ†h«žst¦‡ =Ž£³ķÆ;€­Ķ‡ūųö}śb‡Ž„ÓÓĶrOŌżß¤ˆ€ź<ŗłśšėćgu¬¬*ŅV)śĀųYĢıéMłPRĘˆČ™ĪK)ž²1LÉÖ׎„ó:OŻy‰Ąˆ4¶ źb1mf¼Ž§A#ą<°!+ “£|€7Šd,‚Õ5}Ž“!ųˆ_±ŅmZ-į&5_„ŃEt}:Æ«‹°k3ģ*ưW¼…ŽŽO¶9PĶ’šŃ5N·yÖ«{ÕŻüj£ŽžÜ:X®ė¼¬wŠ]ŚīFć».rÄCėt Ši^ÜÖOĖĆ?޶ĆhźP­ĮK.ą` ° wųĀ‘ébøóń¤¹Cˆ‹¾Ļ„‹ŠMčjāä•OÉ>%2c>NĄ±ķø¹«~ē“Ž*ĮM›½”ÕĢRmžeāMßx’5xBŸ•Z’+‹śÉł,Ž įŚD8G-ņ¶æ¦üžÖŠ&¢”Ƭ:ŅζŃY Äž~V¼„š~ Õp°…Ćj%&Wfj}~Ā›²,éÜ“čf³īźßö”›>bŖÉē<śRµžbęõ|øP²ĶyŒÉ÷óßp<• ¤ņ_׹ÁėĆw¤¤µāŠŚ"ŹųŅq+e.oōÅī8˜tŪīŲĒ8LČs‡+Õ²~÷·=*Xų(ż "ī®ŃVIŻŽ¦„ƒB** Óņ\K ·żŪ&=6 V:£_`¾7“ “ß}ČAåė›FR…ó’ŃfŹmŽÅŸ^ VÅlZß~*ŠX ™%v<ŸuéČõ-]\gŻĶ×PŚĶ'A|ń!YFÅWZŲ³E Ó$ƞ‹ü†<‚ė«Ÿ™žuŸĆŽ$-‚ęR@/›Śa«ĄŻw“•×›ķ±ž_Ž'†0QŸ+!ķśĒryÜÖ£`°õuwŚĢI«ZāFļy“æžĪރÕb‰$†č1E3×Ŗc’ź;Zäß6²īΧ„§4.’*¢r,#ė¶Į»ČŚē*Ŗ§’Ih]Š£Nõ·{™;Æ+gY~jzÖ$Æķ}Ķżw~ó·[ß¼”‡õMdŻaćĶĘDÖ2ó?Œ¬ew Ń,Ēi™ņ”>²¼]„”+£–$DÉOM­A!@ˆ) P@Œ1ÄŚā56ŖÖ‚]ćE €ęµ²āäõöLsəsĪ…åÉŸœ-A  {ŃEQŽs5ī6,ĄH…cFb ̵N4jĄ5&m . )p.€ Ÿ–Jf @H(ļ“ĻQ5öR #ęȅbN!āų~¹nVų{­ĖĆ@@AęaN†·‰ĖāqÉ9sĪ„ēčõ­%D݌DP˜‚Hņ˜D=ŚfØ’CŒˆCŠ”BkgoĶ'÷{µ=™ÆN[[˜Ł×¬›6Kńs;bé¢éLuš²,Ō?”šĆ2ŲFSRµ\43ÜlHŠ>ĆŅœ×Ż±²SµiPؓęo0Ž©ęüi˚jŽķs4×7 ÖvZq0ta"ĀĶV½h6°óéiWD‰ģ‰•Mų5ņ5Š,¹|b gHģģCĶś“N‰ėSbĢę¹±.ĻēŅ8óBN°PM‘É•ąbČ1 ūĘT“ė[5 nł3§Ģ?{Ģ>œ›ö}āåŠVCÄU•éƒ!B?Ÿę¼Zٶfiw0Łl%3İźE'bcpSĶŗ6;UĄžŠņŒ:nl.ŃĆƂpŪņjw“žģHw!ļŲąļ>™‹Ū„=™o< .³žTŃuz]ūõ¹pw ĮōĶćxdī*Bņ󣓝7»½k_Õ !ŪĄ„±Ś¢µp‹œŗĆĪlĶśĪĻC&F•bEłG3ū2ų0ł¶•kŃć¶Ć‹­õh¦žé o°Ģ_ņ‚DZÅr’twōŸ³œJ±ż×w氃Ż ²Vé¢-]ćr=h¢ÕÖӆ’FSīü¹ŸĢĶõŹŌ4Mė³^ījQ…KŻ%čY'z7±i~ĄŻn"éŌ!ƒP’S—V¾ēӇ Qv±ld}×pÅŖßśŽR,ŌS®w{ŗĪ¼lœ}ś0z\ŠŸĻ>Ļ›Ż]ó€§AŌ`÷‘÷÷¤Ō;„‹ag·½2¾ĻxĶŪY¤»24¹3wćaĄĢk>ة﹌h°„ęü"ć•$åæ§ĻwTl°£tķ;2’Ó1Zš ?ŸŸ|ĒŃI×öń ĀäĘJSžŒļ¼aż½1ø©W¦ŻDäŁlō⇰„a»‡é×É ÖU1ÅöŃųϳр¼ĻóWė”M‘µ”p~”ž5Ka?Ÿzž«nĶśc#ÉÅ„ĢU'"«Ōéō:'\Ż#B @¾W&Db:(¾(¼ķŃq¼^ÆćĖ?b8Qśjz}JG”žęx¼^ÆÆ×ń÷ß_ĀńwÆÆÆ×__’ē+GŠ1„Ć3n½žžūõśūļ—¤cæ^Æ×ėHĒėØ_{õWūÄ8ā+UQH)`JŖ;„ŠśĢSU=iµh½° !‡<÷kŹŽłŗ˜/u{]9gÖM3ŠsĪ—Złł\łžĄH£S§¬ZڈĄMæE93!ʔ†”ĘˆĒ±ėŁ(Žć8Ž×!³ų:Ņńz½^_2Ļ2ļ~=Ž”bLǾžĻ×ń×_/YĒŗŖ’}¼¾^Æ×„ß;‰Ā׋Ä.Q:ĀĀ|bz½^Ē!v^^‘bŠ@IHQü™?–Å>zcf»»|G)u ŸĒ£dŽ—‡Ė"[ßŅĮīŌęĆäŅva`эĀ/oFŠN” —Ņ󟋚„& ź¬Ā5°Ō\éŸÓ>WęĄkź2ChL‚V€…¤ØŸ /dm£ś¶s~†*VրqÖżš„˜…g.…Å.ģ Žčś×;w¹#Eqaé‡ÄĀä{°Ö̧lMlæ›×Oīܚķ%ŽŗŻ5RĻÕkÓĀγ¾ė$2ó~<:Ź ŸdFŸ 8 ‹ųŻtĶaP+ĢĄ¬Ä\+“c±Ŗ&÷ÆĢX‡ÖS™id dśĢŁ“£•śÄ•<¬PR)5žėŹ›,öŒąńųLSvą…GķŌ” Vrz”MĒ¢ŲÅī»ZöA"Ņ5ś.āžCƒ\)“(€3}¢$’Ļk=u«J)zW_±¼>ķĄ3p›āJįCüžžžž~›–2½›,ą2ŁĻ4‹ŹŸÓ>÷ū»}Uū^—2(÷ ”}G¤§č-/µļ!ʼś¼ńĶz čün}}ŪŪDĖœ)G€+“'Ģcn¬U;W²ōsMģŚŽ­ƒnŽĘģŽMŁŌņ~ŗM÷wżÓ$Rŗ² :žHiU»G+åyNźÉ¼ õä&M >Č ¦’^g”Ūe U—ś·Ö„^ †ģ0}—ė·Š³Ż]K“īˆwĖlŲ.Ä.ŗx½®fW¶’ cĪ©£ŽmĄ7:~ōóØ8wøV9ŚAcup÷¾ć„™ęƳ8tōī°^É@k?öЁ…ĀŹę2€VŚr¹‹€UŽ„»j“žA¾G¶wČ5)'²Źƒīš)d¾»Ä@›×O¾cŸoI„4!ŅŌ÷žĮÜg»źœó\˜IŌŚ ?Źü“ķyŃyČ>j<ŻM£ōY;”“ ßRŁĻ‡5:É2ēĪ[’ŲN­Ź.«§qDÖh"ė…¹õ½n=å¶hnī6_dC_źŚ.{@(`Y»÷‡uēÉlēŃēŸ"ė)2–rŃ«=ĢŠļ“Ūc&„D„H\A‹ā‹ $¢Ō– ćé03ˆZ@J‰°s°Šo‚! Šz£_ˆŌū„Mž,}„šu„—¼?՘3ÅF/=Åk:Ķ*UŒż:3·fŲvÄHCVe—¼Ī÷ū}ž ļJ.ł*\Ŗź©PęräŒ8h ˜Q°‹8Ąū\sø”¹”É×Uø\¹äŹ[%DĪó|W2óŽqh@,Q0@äÜqžČ „¦y‘ŽóF?ęµĶó+_!}„©…’Cl@ėŁ†@@!ģ>ØŠļ6;»;xŌzk&¢€^bg)FH)’»;NżøŌ‰é²÷zz$wŪńk{Œ„Ąs!GÖ©‹†Ÿ„Cm^4[BzMānE׫–°Ž”qöTÉą_ו{­²ŖKOÜīs=ųß»²/ļĘåDƖ3ԚEĢoU‰ÆšS6­›ĘĮ¶ÓDW¼]œzā†MMö$ī®Ü¤Č¦ƒaÓVdZrQ%¤š0dÅ.÷]‡ŸAy«»µ%ƒ)³ø‡ä §¼B½ĖĪ`!¶µLÓp:öĆ~ŪŚbŻhIr|…ķu>böŸÆæŚ Ė3Ė<7,¶Ž½ōŲ?ĪLģÓ8Pī6éżÆ)ی Q4Ƭ¤éX‡É¢ŖÓąĢoŖČFU 8-=„™ńŖ÷éČį1FūE7•+skClb¹[ĄŪmē•Źžīuh½a¬>×°hÖ±ŃĖwD‚•†fĮWą'h!Ń©żėĒČ$@yOŠ4ŖPą“ƒ®Š‰­óFŗXf•Õœ~öhé©öÆ;īŒąĘł{CBĖ}x˜]ŃŅd‹ĶĻr¬Õ’ū¾é]zƒ~ųčšķÆŸ¾’FĮÓōeūńŲłČŸēĒéĻŠČ1‘=žØm×½ŪEµ“É€4£Ā\„ޤŃޚ6Ć·LŠ·Dw>;›ēR E7ņņī7»£įV·d Vœp+(BŗSi(ģpMGBžŚ%hÄ ŁĒ']ć5āŅwŒĪŚøH;ĻI:0Ć źŸūø3—ŗįrŻU>÷}ß “ĆčžŃąŻ“Å„ļXžÆz4ņ˜Ā.‘¬~_J)ͬ6­. \z&ƒģ}^Ž„ź4t—^£›»yę\|ń“ļXō»Š¬7”µ‹8§ČZ‚Æū`Œø/³ķĪ›pG^4×q÷:ŽĄėńƒAŹuė@Ł»öēm`½‰¬=4eē;śB_i¹$łŁŲ4ķ¦ņÄžĢ™R;£±k^vī˜Ž×«µäĒ×+Ę×+ ćŌš(IÄUµ—ŹĶr$uÓb ‚JĮ öĄž š¬ āŽuÆ7RF,E‘Vō{»=Æ[äJa®lƒ•n¹ä³ćN› tӉ¾riŅyUb“ė­Ōō@€B±ń¾ä¦ŚYø&ˆ¹ßŚ%—ʵބ\še_*@>·ėē42RF,ąŻķe2®.['ĖßēĮ„źóYā™×vg#aÆ33¤”’GY·ĪŁ5•ƒ§*ŲX+ˆ1ÅDį8‚ŲM£x½Ž¤ķ¬mśX»¶×0cfŲ÷ŗĮ46Ör·™HB§™“U™ś•H‚UMzźĻFć ĶE5j<ķČ»+’jFĶZōØ&üį{LØdA”ŠiЬFńb^,ć™JÄhŖ]‡Ž:mļǹ±›f²1¬śi4ŖįŖnͰklUņ„ąU YńĖĻWo±Ū–0ė®ń£Ż™Ÿ— QĪXųĀƹ(Ž_°Ÿ’ōó[U}͹ćFłL_„…=zްš¶Åj…Ö+  Ų¤œā ,„}c«’LצGžDh0č!-{Éj;š%š:ÄCtž]jmŃż­Į8¾åéĘķCM؁ąČŸ”|ĄĢ<óóŻŃ“£Éœ>B…}¤„Ҽ}vCą¦Ī/ÜSG‘ė¼dĘJėu½XzA‡øC¾“·‘9s¤šj4Ai–Ā­YÕ$OA>įå¬&]$š@ś¢¤8C Œ~‹×”ń‡Łwµ²V2ųłī„øFŠĢĖ²Żżē×Y/ōĒ×µ™?=‘åL]įŅŪÉ4N½®^ÕKxÕ¶ 'Ū^½mA`žI›5£Ømq:^ś]·ŁŲŲ \oŚŪ§ÄŹhK³”l“æ|Jh<ÅńŖķ’鏾§Éư= ƒņVµßń‚ßqĻ†ŪžLLJŻaZ2{Śé&ų©„š¶mVTe°—ēģś¦—Žć®=UOcQ žO2ęž„a"š–ē7Rnė]vcM?”ž -žęg„^ߏó5ę©,oėéVs»šŸŒ¤s^—żšmOķńבu÷±…šh" Y¼^zƒŪ¶:µŸŠx>K L½Nkå~Ļ Ģ³K…R—šŃ˜§ŸoŽ}7-ė×?¬iŸ¶9zqˆx °P µs+Ę q«ŠEäĻ1VuåV2Įt ­/FL )Å^—’~`]f؝„ĶsØÓÓó’) †#ęŒČ‚lŽ †”R ŠUō9$Uōjt`Ź2‚¶-m];˜µmŠ}®+RÓ,Š]WŃėī}“^õ0‘ę8ōˆ4²@w²«p Ģēבņŗ….wŒ'…*Õ‰BJ© Ā ~Qę5ÄCźyŶRÉnŹØ‹”żćÅD˜¶eį <Š8†€"¤3Ę ’¬ą×kļVˆŌp”Œ_ŌPĒņĶŗ¶ĢŠig0oŁN¶ĀJõƓÆĮ’‰]»C°ėłšy“Ü«-YžĪ:0SG¹ĆŪėō½eh4LG½XŪóž]zę*”ŗÕ7­/IkMlg_õÓ'ėŗ®+ļęuŠōĶd­hõĮ“$*m.¾“sõ“ŽZøÜcb†mæżóż-Mtļļ÷ū{ŲS“ut“Įźš_ųŠü^ģUÆį9T)ģ*·Ÿó‘ŗČä ÷Ė<ī°œXƒ“Ž€ĄŌ#8źJpCŻ6;ÕÓU×vÜīŻPūy{x?üœŃmbæ=Ęė†ŻŠø>/R¤Ķģž“#ŸZ\]/l7š6‘^KoŃėŅ•äVŹx»„})¼$šAsŚ h˧Żq”:{›ģ„sĄƒu›OVoža#L)ļS•[•w “Ż®}Go>ĮęŌ\ø””ŅĢReWSY©A‚]÷¹ČęTU»=³ėįĶ ’/Ņļ>*a0oĒIEND®B`‚apache-couchdb-1.6.0/src/fauxton/assets/img/glyphicons-halflings.png0000644000175000001440000003300212332105522025477 0ustar00djcusers00000000000000‰PNG  IHDR՟‹ĀtEXtSoftwareAdobe ImageReadyqÉe<÷iTXtXML:com.adobe.xmp glyphicons_small_dark 5kŅ1”IDATxŚķ}ol\E¶§W²“^ÉzŽD$|_w'žCwģžG;ć4¶ĮäĻ<ć1ĖĘÉœu˜Ä³Œ6C‚Č"Ą ĘŅęEʼ0 "=ń€÷,į· ļūĄ’f3oŅ 0 `ążōģøõ¾ģ—Śsnuõ½Ż¾·źT§;1K«ÄmūwėÖ­{~U§ĪużŖŖŹ˜1cKά:kĪbö1ēü0“ūQį‘!8dM` \Æ5e]‹OY½KŖA¦*…‡–9c·ć«Ī8Ž ?'M’Ń÷7kž1ōcü¤]?¦b€ŠŃ½ą¶c}x$œ’/ōõĢ$YįŃ3s”OqY›¢+Ų*bQ8CŽ AÖĘā,’™•V”¬ŁuXx Š÷Xšł ŻMYRĒŚ˜5¤ń@4š ļEģ–Œ°†÷ŌŁė ąjt(üJĘ®ąŃM„åü>Ć€Ķ(=BĖJĄCšąž’¶71Q7ŗ% ąWY}¶ł„dlķP"o÷¤Óž¬ŗ˜¬HTV-/NPĪ¬¬¢Vo öŽcqhOg6¬pw½®ĆŖk¼ŚˆŌĒŗŅ _“š€ē)MŅś+Ą¾I :ųH¾ī¦z̬/ɞ{Ę9ųOdnĮVć|–»‘ƒ_©xŹŠŸHĆÅ0køč’¬t|ˆ²°”Nŗž£‹‡nźŠ3#×3ƒu+/Ua9³%Xąq¾N²özłŗg†Š§;yŅī9ļyČ9ųOŌ%~–ć„įu©ŹÉ—*ś=±ŖŖÄēIŃp‘cįy}®öY(ž£ėoÖ(•u±$«^¬jŸ¾ ī®»ļe\õ‰iXķńœ¬Łć;X-„r‡ö×ć¬ѲŠ&¾>ŗ>„eŲ²’Ƭ¬œØaŸsŗ»?ŗū?1aŪ¤^‘›¼ū=7žČ65^ŸŖ8†R•6ŖŅØ*śäāÆ4|QÆN$*>µskUqS”E Ó-ī?–D²ŖüGął”ĘÆł ĻÕMø#Ū  ŸÖ™„ʟ€U±ļņōÖÓ[ū3HVUwŸd#æ)üē~@@V¼ Ø¶ƒ-s'A…Ē]—åĪ›dn² ¢ś3š„7UžšuÅśS›‹Cģžøļz¾{vģ(8l-ėŪ;Ž™•į¹¹£”[;ŖV~® é’)t>7QeSØĀ)—jŗÅżĒ¹O„’hāc Yīó¢CbµŁÄ7:ć©ģ X½ ļįļ'Y «9ŸĀĻ ļY1y©=G ’6`­=G©„VŃ’»B[\Æ×y¬QÖ=«ŗłuoóĒÉćŗ·ż›‚Õc?U|ōgdD‚&ėžtŠĆ“¬Cv߈z«ÅЬ”&ö’AŽ·ĻIåg”)ŹØŗŹuČGU÷8Gó*=Wµbł6œyhDåłM$?ŗ.Ü&Ćr’ĮĮvQūĄóCļšķXŌ™vd“ŁrQõŌ]ÄßolåwŽŸļśc÷¦ *-µ˜œ˜‚–7ö3pÄyNV+¼ŌxU^ņą4 YiYqDµŅ,48ķ…ó©Åc䳔ŖžĻÜļą~T}戒›֙{·Óšī~2Ŗ¦•d£ŖnøŅsÕ¦S ;˜]ÉØDuF_1g•„ĀlāüG×ßzž”`…cœK瓪²Z>’ß·Óhö{>åŽIoUR—Ī•–N'0iž±2üq†®Ė†NŌ°c苳A$+-œ¢åÆy6f“³ų?%«‹xļ¾Y­ļõ®ˆśĄū½ŽŹĢUiąJĻU?ģŅm}gōsVYĘU×tń£Ļ&Łź³īŸ¬†qyōYńTńŖł uĆ,°óU«Ź. Uįź§×ęc,“w'÷ŠŒ¤aĄóžĒ‰Š„"MłW$«¬)²ŅˆŹ³æ#iÖ5v³Ą:ų„}ēD¹óŅą6žćĘw}®ŖßśėO ¬8sż©ņł¶æÕ÷ĢDšJ,#ž‰`Fø^gė°w¼?Ó‘ķšŻtžx¢C~śTåWyfēį-“źĢ¶B‰Ī?WŌŖó-×_5T•l¬öŌfśc%—Z}h µī«Ć£Ŗ-ŽūoMüŪ“t<-|sŽ«B›„ŹżDĖå?<ŒĆ0ځµĖ_Ā9/u’Æspʔ­M‘&—xÓ¤=_Ŗøhī9ńć`e†Øł8¦¾kŠ»iā±ü_^—˜é ó„gaYŻ«-(x®³ ‹j³Ł£č¬®ž1–Ž;Ń;_W’˜Ņ$t]=Żśč⣿.^•"_Œ^j}PV¤ ńsaF-ń+X”Ńž/meU×źĀµŖq™½ų;ā˜š>EżĻ4d,ŠsŚ÷»ÄdŠåŖÓɜō¶Xć|ē‡Ā bÕNĮŹg(…¬īĒGĮćŖ’ž А²Ō‰żµĪjčS,}ĖŲ–1{µē§å„Ŗn}tńø ݽ.t¾®\}p5¦ü¾‹ńŖv*¬½Źµ„^”ŗ»4‰Š‘žoR7¢FĘ+VŌ?ĖśOoÅzœŽ:’ސtza‘xF‹p6ž&öīĘ[•R)Ņdnd“…KūÜߕ@ÕĀÅÜjņ®˜TįQg$*⬫ĖÉā茲›³\ŠƒÆŻDAJR©ź®ˆO*ėćĀOX| n @;Ö3gž*NłųN}š»–×Ŗ1Ļ…·źŌxǹÜĮš|i¹ŠcĖØTMä×ńF»3X£ ֐łGX#Ü;U†ŁÖĮF;vąž£ö_Ɉ[m䚍ó‘įĮéÖÆäw‹Kä’Ģ!l‰T]¬ŗ "Ÿ›Ŗźeߨ³zx‹ØŚį-rÕ;öńŅķį½t’ݱÆ|Tuׇćåõx«7„ ž½*<Ö¾P€JŚžT×ß½>9š„T«IŻx{U©rõ©p'÷ZU‰,ۜ[” ÷iNU>=¼_•ˆ‚5¤¬~p:|M>7ä!9ń¬Ń•’ĪŽGU“Öw(sOßöZčw/< ėŠ–„µŅ>Tõ’GQ‘ÕĮQRŽĪŖØžJg5t—ž@ꁜDg蚢ł2–S#EŲć®Ƒ¼>;Ž|iĻ›æ“źų’™d?ś„ū'?ś%ˆ`}Ø®OƒŖś$æxš9åSMoTMxųO‚•ŖqöŲöāŸ=¶=NPÉ@Ł™½ćM0»…Q¹†‚ÆŖzō”Č5¦Dü·¶1”åõ u¦¶ÆŁ“ YgéKUģe7µ|¤ŌI9øuV“yZĖtV­˜<`°V„Ir‰ćB!.yS‹śX¶0'¶¬>ćQ—]§.\¤,Ćć:#›Ż?Ł,Ū¹ĘŻ>šČ_SÕ“C#Ūßš4µXCU„Ź5Ŗź&”¼Ø*SźM²‰ĘāŸM4ŅźSUuĻcųõžĒØŌ»o #«CÕūųŻÜ7ąŪž}īŒ.ļödƛt®Ŗ×ŠŗxGgUÆų+Ł5t„øD}p»¾‚¼>NżÅŹń¶ę+֝+ŃöZ¶ųŖ9åwĻĀę"ĶŖņū.xéÖöæÆ“@‘ėÜźŖ„PÕŖėĻŲzėż\FļŲvi’«ŚķŚv†”šV+€#*ެžpa­×[V‡ŖkŽm:gÅ0”ĢܗŻyąäPUdśŹMU]U̟ņžėƕzaTśZ>wXĮų¦F+”!¹Ø«Iƒ\h­Ŗ>NżÅŹńłm„Ęķ»Wµ‘S>H­-S—ļŻžļW¾ŁKÓŚ’fŒŖ£ÄŁrH-WĖčˌ9ģ7Šį1’ę0äėY=ü_CĮõ®ļŪ!÷žB|ä뱟µ¼¾ZKyY#ڶ¤ø8!S~Ŗźé¬ZC"üķłsņ!š­6<E© wAµī« oo¬ Ā;ļōƒT}Ż)暢C«Æ[Ė•š_x€ŽÆōØŖ3sI{QuDń–‚OģÄ<¼Č«®"š§6Ėuļ‹ńS<‘h_xō“—5b|!ń£ŖžĪjŪ›¢Ģ»žˆßóż>dFP\— Bķ__÷Uļķŗ²U¶>X#|÷ŖƒÆü\•nؾ¼˜ŖųSÅyµø£Ęul^W×÷źÓ…ŖķŻŚo×Ń¹ÕŠ%Ny SņņµÉąŗ>uÆ×%CäBŻęep•˜č¦Ź˜1cƌ3f̘1cƌ3f̘1cƌ3f̘1cƌ3f̘1cƌ3f¬Ą\”ÖĒ[i‚m ŖŠueõ4hsē¤óč+k)T»iµ³&Č„ęĪČØīŌ»dʲ„“ر%gøRap:©„ģąYhŻŪŖ³.ĘPz’*V©»rĶY‘gtH= _S©Qpćām‡öŲß3"KX³ś±£I¶éœ|é–5¶éƳvGSÕ·J—Ņ€,gɍŠķœ cKļµųĢ ÅõO¢ōdØ?CW.Ä«ÉeöjIF«Ō§*JøDÜvé5± ‡’°ÜkĶuél‰MXA±ütIķ¦>¤ĪW“L©AŠ %7£`)ˆ»ō‰õØĄ[(hź6lqėÓ»{ݳXMé _\6ea'uy]1*Ét©§*ßk]S’S5"*ĄÅxY½š­¼Tm{Ņ– —r1L« tK)‡‰śŻĄéž™£lÄ źŒbÖń*Uš’üņr*pō¾‚1ÆŗøĢ4ÖĮ/#F}7~µl ^”¦R”ÕZ‡ŖŽŽģϾgEń†"9Ŗ"łōT€‹ńr²V–ŖH4ōtŽœ—õ]ĪųŪ3ĆuG~£’ĆÄp­½šĄ¶æUunŖZ±Ę“  |–JUlU•ˆ[qĖé,“&JškīX£ Jh+'5Ņ*F•BU”ō•ÕÄŽ”ęZ.ĻcKóŲWįóNŗ °7^FÖŹRÕ֝ż¦ Xų†PķŸœÜ;žĢĖ/ĖģŽ}(uõKm#Ģ…łXŻČ°ÉU!­ÄćŌ‚BøŹRUWĆB7@õ NomĢēžÅZ„”śäI>”Ó>\{[ö|‘cĆÆ"QqĄ¼UgćYH¬~x²VžŖń‚ž3Nxō=3:V²•ģ@‡PV„æ×6½cõĘ×#ŗłEŠ»ćž*˜(jś˜¶Rüæ&ٽ’ćÖSUWĆB_õB? ­\Œž©æ“£$ØS{ŽŖV:$‰{óŗ·Uā¢öA$jŌ@oø˜Ć{‘oŻŪ’Źśą×½ķ}V婪ßKw]ŽŲŠ_7¶v]&ٽqčŽP`-šMŌ¤‰¬†įÉ( ¼@"Ņń$ŪpōÖSµ¤Wešgčؕ €‘pƓ,ä€i÷źJ… _z{āŪü‘†āušb0Šō`4w†kWŸbņp–t/¼•^÷¶÷Y„QµgęōVʈWU£'>½õōÖš®(”;ż=ČqöńČģ1¼—JŠ!įūˆB¤Ųgø÷]åØjŚĮ×(…Šŗł\Ż3tŌŹĄ˜QwĄ“{-›õŚłć·b W[!ā»ćyÖßM>Q½šžD-Ŗ¶N~ŲąBl§¶Õ¾‰..5‘ö ³]Ļ 'ŪtöŠł{RZ)`¶\O²»O”võVŽŖM¹»Ö€+‘^*pq˜.؛īuI~pžųćsSøˆ_W#ČG!j1^FToŖNĖnNlh!6ø ŠbĪģ’$1Ģ(‹’ä01{ ’zcąļ칹䯖¬=<­“ˆ‘ &–ų9Ļžµ›C;I ŚHÉńn“„AJ 8—ž†3ĄŌśØ©źØ8ķ£”“^ŃU|T¢ŗńÖØŒØ~!€?޽ó '«Ŗ)Š’B[ S"‡iÄ|]ć¼P³ēłāĄ¼Z 6N‚??Pźµ[~NĆUe›7C‹7ėŒ”"éį>BLēÕZłŌ„•T-„>„Ø—Ŗvę)¤S,ǃĘl؜!UįQ(P­¬GmAłõålŗœq*æU±Ré¶ .]”ąrhJ›ūcŽxžōp˜H)gĄ¹Ōšś>·ųZ}JQ5.%æD•€Õ`L«=›Õ?1f̘1cƌ3f̘1cƌ3f̘1cƌ3f̘1cƌ3fģÖ¬– ,‰zL™ga̘„Ø Å§Kq£Öč¾LQdĮlōė ¬9CĆćrnF*¹³Z-™¦)+3V’“Æm꺜®įnŲ*CųפŌ8DÉī&\}—MĄ’€ĻP$Lš>i”Æ(Hk:ę^cg³J²üŪ…?ƒ«JµŹŸĆN Öčש‰&*+»µe±­ō±ź³ōšpæ½KĘ#óŽBó›Åx¾$ŽvėjĻ4MŒĒiuzē eĖīšB°|CĮésk£ŲDõX§ĀŹęnøŲ–SģOęæ¶)f[āb”,Ćå`)g¹‹vē9E1N«G²ŹR•»,^xŖø ėnOJō‰*!«Q«ŖÖŸåŪa@zÅŽCvĶvd=QV6NćX`¹FŸ»q¢Źˆ!šk'Oo…09Ž™Ż;įjµ’ĢżkZR’š}ż)/¹ yĄ,$©TŗÜD}VćI=|1•ĀJ!™ŹSµšžżc o<]‡‚-$Ŗ:ū"ŚDß55Vŗg‹īW—ØUUūvpEµÖœŖŚń{ż±=JäEÜ›ė» Æ7ķp°qF”jąńh®žņ¤I~ē–«ĮƧ6³zõrZPµĒw`,Į‰*S3ā½”{;'uoŹŪžNUK9ėÜZ=|1•§?¾ļÖSÕ}ž17žNU 6/Æć>:Ōķgz/ļ¬t¼š~łė¢āEƓN3CŅ„Ę;ś,Ģ7Ļ?¢ŃgeįuūŸÆs”“$ŖvŽ;ĪėU>ś‚{©ĮOjY¹&Q“¢FBåUœ©{)„T)Nå`)g ŻGśU’®}}@Ę-¤ņŠŹS}3IN¼šTŖŅ°ŗ»ś8ķf:/kĀÅ÷xœæž”ķŻ„x䐯 J·¾gĘ–cī¾K&U¶žl”­śm߁–ļä‚Af*aRUĻŖQ—C 5>ŸEB$КÕås²ā^^¹¹jZöŲćo5EõøK;K/WįuVEĘ­ŅTå¾IN¼šŌX…ŽÕSDŌ'«Qafų©x=£#?ĘŖlĆqÆ{ö|J…ÅjFp‡Õ9§ļ’įOnč̆ó‚ŝY‘?ö ĘŸÄ ¢Dß¶ĀŽ,jߓ·_˜ %rA6Aõx1–v–ƱéL –ĀĖᮓøĻ O”[Š¢ CV—5÷kp†·ķoUÆg<.a÷ģ±ķźóPtļx¦#Ū=»é$q:ä簚S›ńĻ ø«ƒĆŌJŃĖģēÓo”¼{`?[~ėšn²R3~ł [©zģ…„œ%Pök~%ŽV/n—Mk¼œ×łJĆÓ]ø«UG‹ū”óIM?liĘ[]ēeMŃżī¾ŻĪƒ6”"č a—œFī0fÕ)Ą·STzac¦PNZ;¤v¶Źu+ļ.æµx§¹©?ĒYÕŖĒ^XŠV2Gńē¬ĀÓŌ‹o޹ėLńRåś¤õ4°7BV—5E4@M•1cĘnF·S]9“1cƌ3f̘1cƌ3f̘1cƌ3f̘1cƌ3f̘1cƌ•Łtuzæoxū²ģäҬÅ}(5Šé“¦ÅnB­ŅŗW²bÖÄR„iN§7Īh:½ß7¼8‹ĖˆŃŪ3™ķČźŌ§Rų›eK ay‰Zꂹ‚;ĻčļūšĀzW²byŠÉœø•] ßß"'Ųpµh±VŒJ§·4<_Ō†’W¦üd^Ō¬Üåsqę6vŜZ·ßŃ=f©;ū3”ś”Šß;NÓU¶yFŪe4ØaMD•ŗG7JÕ( žj훀ģ_ F`Ą'ĄKŸ¹æõ§•ļoa ±Ęł¼ źōņĖ = ¹Nƃw;» ß3óÉF\æłÉF\`K/_A©ń°ŠDĶNģ¤×Ÿvæh'ېIöČĖ v*×0Īéoø æŪp‹#łäõ:ÉöĀB ¼k¹N©? 7ĪGµ‹N k(”M£…äŗ®nõZ{Pær£‡§‚x'vNSša@@< ³ß:Ŗ®mŠ/ąžX>Ö?¾°¶Éžźō:—Uėō:x÷!Ēwfqķ®ßÄ5{8²ŅŹļ™łų>N$`–[{¬«åkķ)å P•.±Uf»_bõ6½y¹åŗ¬”¹ī1ō†(Ź™†’c‡·Øź#t.ųÖ T¼pDl!¹®²5± \Pß±ØŌ°«ē§Ör2ėø:(cĪAZ=/ćNķ[%ˆG_ā¢~;(«°+GUVƒ’{‰œ“®]¾P5¶ F–iüuz¼8Ōų„+,j<™ ”ņ[ż$ųX?R[…‡q……®uo²ź¢ŒRqj]biI⌐Śsh“ĪRøī1«œĘ=k`Õ?|††’Fއėģ±øµBćI">GTxõ2<¾!W礒ķrcØŌ\Jøŗm.•ÓÕqć‘DQ×x•äōĶƓ4ā¹ėŌņŗzŽjµ(e^KMCt£ė~(uÄń]³ÅM&×é- ļ(ŹpÕ~r-ƒ ƚ;¤Ÿ“Ų²Ę“*a· ¢¼ć P£ej5 ”{Ģļ“ßwGVVÄ[{ZŲJĶ IšQkåųĘ«Q-Ł./¬Š\nÓÕv(fĄ…®.ßźŖ7¼Ø>=3ǶӲø¬™BT‘%Ī >!5uDŠō“¤¼Æ`’¢ēO¢É’å:½ŽŻæČńYG¹õÜZ%UåģLbžØJ<Ŗ±°RgŲĮ»›ÅĻś>°gĀ}–=²¢ź“Lԃė[1QqdÅĻ i}?ĘĄ«éš£n¢ŹńǶ;Šø„RUM qrrŠ-Ū™”±ļ`Ębxc”K ­T[Ž,n)YāŹS•õŲé“P÷,$¹·”Nļb×õ×éušīCŽOŲbž8wĆģV‚P¾-’ß+ˆJ«; UćEĄÆÖ%fՃӘLBÜŚŸ¶/ģ~IÖŠ\÷˜ÕBĆÜžÆ]}VUĄĆŽvAéPć› ’r<«Å’ŻAæ\x¬xjC”†UYĶSO;žóŌÓrÉ 6Ō™ī‚ŃюiT{!čeqKɶ QÆPKߊ šśóŽ,ްšéźō§Yd:½ŽŻėŖšQx́s·sQbłø[JB«>zõwĒr]bŒN7åR&˜`’>–œī±ČćV!Ŗś >t'ŗ ŒĮ<ÖźaØ*¼­ŸŚ;Ž^?­¤¦F)³O¶\H¾ƒŗBTˆĢG383/_·”,qåÓJ»oO}õē)®Īlź‹Ż·ē~å(®ÓtzKƋŒV„ŹÆž;;†ĮIöÉFµā¢£{lĶ5²©>ŗx;ŃEÄs‚ß” ]lØQšó²fš³f%2č¾sźKz2I7K|2Ąa”¤®=jמŚģR.:½TŽļ^œÅÕé)H”{Ü„UŸJį@X×ihoiĪ{d[÷¬|–źuēåÉāŽH–øņT:¢9m嚢»ÖÓéżžįԃŒ]ŠõÆÖw-tŸV ”Št„m)YÜb²źU÷n3f̘1cƌ3f̘1cƌ3f̘1cƌ3f̘1cƌ3fĢX –Ķķ1­`ĢX!-4teAé%v”<ē?|懶Ō&i_¾q†zė Ļš”É] e²R_Ä× ©|& c*kր4fŌńČ,J «U—ųÜ_Äh“ų\1A¤„īīčł•æéõÅ÷ŗeL·ż-‰L\÷¬^ēź~ŌP¹hrĆÉ*tqa0ƃfTźā:ßMUłÅŪpŌ>µyd³u„UŁĻYCÖA>†Ž€įkž).,ł°+ɦ@Śb÷ŚjE)ųŌW°ā¾ŁĻ …ĘFŅ+Ažs$¢e¢6\äµQ9oI}4Čx<÷“U.ÕB?¢–BÕĀß«ė#ˆš$‘åHxģ.x%,•Ģa!®RThwgd5zšÉÅ÷śDB·żeŠŽž².L7@„*ļž AsduttWėāVUaą‹RU|–I xG¶߇$T®üĆėüń-Ÿ¬Äė™#_œłIF÷NĄŒö_XufÕo÷ŁĀQ°IDĶŗI²Ž ?|×eŽæ’å$Ū|ź „īŁi{œŸŽtĻFŌŪNÄøÜwŽs²qqń?ÕķīäDß½m}o—/`Ó£ŖCT±i ¬ńj÷·HĮ}ł2¾Žo^՟Įń|Ŗćķ’ϧpä„+żšP§ć;꘭“?^$”^ü)«ŽtnÓ9VżāOķ­źdDÅĄTŒń›ĪŁóʘ’äYßĀŖ® #jÓĒvŁžąŹRÕ!*Œė]|6©ŽīŹ!«œØ~.«īMPx§żļėG5žåƘŚ÷9G6Q©Źēä…ƹ˜IWG·ŖjćRT|–^|Y߅&—“gö|JuKŲw’ž-w”ķżŠēS=3­,šœ‚7<Ž ß’ ˆ‡Č{oü…-³†„xL(Eįśļx?Ž ’O¶ßY`¾# ßķ¹š·Ųߑ Ģ—kTŐHČgŽEp#¢FiøŲqÅ3šæßO2®½_NóīƟtėOåˆrR?Ž ./²ŖˆŗŲĮ1œ‡õIEę”ĖŃ;³WNŖĀ˜śŽ÷Š5嘫b+ŗæĻOntutuēŖųÖ6RōNéĆćѾ|ć:ßéźāźQµįb×åÓ[Aņ–˜«T @ŸÜ€ÄŃĢe-Æóś8Ūhx?tÖ›Q½ŸųCāżļŚS˜‚šÄCŗā>Hźo=“±š’5}Œ ·•łn 殓#„¦}ĖoĒŽU(¶ćx ‘ķåUÕņ›<¦ ‚$ŸkØG/÷øĮĒU×t„^ń""ä÷ź9Øė䮉óŚFv·š+OīF8k¢±œTm:ź‡įm™*¬„v0²&ÓŅÅÕ£j×ep’šœ[‘DYĶĒ÷¹ėqÖ3CÓ¹…mŚ!ŽĆ’ĖH×X¶ŗŸm-“õÉQę÷(£Š—6]ö^#'vvĶŖ\Q®ŗŲ¤®[§CT>Iž1 Oʧ+•¶¢—"!uwĻ“ĻŁéõѼ™JÕ5×½ń»žW‡µ7HTѓŅueóĶvŹ·JzN’ļUW}ēL“ ŗ%u’¢p&ģ:Ō¼ •Øm“ļąƒ6f̘1cƌ3f̘1cƌ3f̘1cƌ3f̘1cƌ3f̘±’ WY¦ŒÉœ$P,;AUžÓŗJ]v†ė‚€ŒŽóŚśÄsßÕ§ ™ÆŚÅ¢{%kååšØówĘn£ƒeõd--¬üY™”•¾ųjö7‘įbįɦµˆ¾É®@„ –-/É7p]·įbĆųÆ@ŃĮ« ];š`1“k†ƒĮٵęōÖ€Ōą?*šŖĆäč<'ˆ:ĻKßśUß? æŗļÉū~«Ę;Öš®”†eŽAIéŚ:É„-ƈŚk}¢±ŁĀņÄ !^ČÆ-šś5ŃŁ”o\ÉĀ_ķ¾]å0Į/¹n xIUīŚ&XšĮeføĶʬdk›Ōµ ¼Š‘żeW’$‘m½‚j®ėO±¾ēžžl%e ‰påĪ~źé&RgŠÄžzśĪ†Q —NUŠÕłÖ^ OØĶČoœC鰚:Ļ„ā{f„4młĖĮœPģ£čÆ#_Sa„¢DŠŠ[øĢŃŸÜ ęnK<².dśŠ‰=¤ī ’¬@œ}Nę|üµ£Ź Qs~ū¬˜Ŗ±ĻŽ›^±Šśeā’tżkœ±j•¦]ܽĪSŃ'²šž™Ø ‹v•cke¼ŒńeńM’żą<’Üü"E§:×”åä¾¹ä̱ķ囫āsß-Źß]^• “ }(¢µ#Jü,œkÜ« Čøw!=3B5¾š²ņKÆłŌ^ó©Żj…3FҬﳁ½ćr¹S7QÕ3ŚRęŖ<¶'J9"””]|Č_ģˆŠ—‡Į%ĒźŲ/Ž’# TĒé­cGqn"£ź[­cGQ љ†÷gʎ¾Õ*iźVŌ!jTś2%Š¢Čtuhcä•(;²MŁŠµ¼|Ēõ' RĘøēHge-ƒ«S»ŚŁ1å ˜c½ķ,µ+øšjŖ¢ ©†żē25{¾²©zu͵Æcx'-¹ŽiĖ6‚γƒosw–-Ć뵓¹Ŗć4”–ΰgŲž^'“1 KĖš½¶ų\d@ćf#i’Ž0 †ųŁĄ”=‡ö@Ņ%ß5Čz£Ż·ƒūuˆ÷tŲ!ģ¾]āŠŲ±·M|ž×š![@QDL§ĀŁ;ö7U ßѾ€3ŌՊM<Äė¦žĢj[=GH¬ś%¹ūuķ-,¼$ė‚SY]ē›…²Øfł­_Į‹—ĢŸĖšzD]ü^•6WåĻ€ņāNww|²v`ŖikMھcūiqQ–Ž–¾WĀłX°85¢VĶÆš§čriŃįI †'ķvVG.x R«ŽöZ aN"Fį| 'įć…ŅŚz½/é=bŻó:ĻŃØu•—&~Ó¹īŁĪoCæŪõ¼į±ŽŽnń{Uź\U®½\z€ōüĆBūY—«ė\I£TԟE=ŚŖŠ™=ŚŻR9źE£7łĻŌ†'®b7F.ė <7šYÄIDATxŚģ\ TTĒž»ž »Čä™ØÕˆ‰•hcZhÉQ꣩‰•XÓJŪ#h’žM±VÓh“h“{¢G$_"ĘŠU¬<E Oeaٽż’ĖÜuøģŻ]dWL³’9sī½sļĢ¹óĶ÷?fv9žē‰K\Ņį,e–••Ł|ę󌈎ŽvnO€ˆ‚‡cīuøł,Ēq p:R~yyłk•Ćóƒį «ØØČČ@ā)\4ūDeT š”~^^^s(p:ŒĻ†ƒ‡„JżżżµŽŽŽéPī-¼ŽŠŠĀC9&(÷-ėL&Sqsssń;wź $#&œ. =D&¢,¤ø:ģ¹TŽŠ6Ą¼ų¼.īóOć,¬Z»”¢äOK*„łį©SIß„KĀ©ÖĪ6Ō°ĪŸ9—Üھ³;šįEt…āLlįžłL&—j{xLDYˆ‹!&SŽH[}ƒlACmm$€-R¼öˆģMśü9ƒ&ļj“€×‘žĻ=Kj¶~嘙”ąIՔ•8ÖVr‰óՙ‚S)| €ĀŌFBZļŹōkƒ‡ōķ SĶ›KBÓß!*­Æå‡W¬¾a“Ö`0•RR9p,«vs)’^ߊ­ĪčJRķę ½Pp“o $—8DŒ7Ę <ń4IØéDŗ?B²³ĮĢ#’†ŌTB6l蜟–•čÉĢ4gÅt³3u*÷vqœh×}/döģŁ™k×®ĶüQgfµJ|ÉädB22¬×. ‘œkźq+< ˆ‡P+Ł`(‚kœU˜W×ŪąZ‡ÓR^Ó2Æć\„ėō:Mņ<Ž?€õÉ8?ü£Ā²ÖgkQ‘ü`ĒĒ?8€z |ńeŻ!”~ĒhMĮŌ#•֍TŽąx^ć; €­z¼NfT$Xz.~Ō Zē<éx•––¾UYYłQqqń|ŚFk¢¦mŽ”¤0H>ō>g”ļŲļŽ’2į“ŒŹ–MŌYŠfAÕÓéyuGŌėׯœ””4ĒŪŪū Fó4fŽ»wļf}}żå¬¬¬w—-[††\+Sęu:čfPŌX0OGĮ”c­Éóå–“3¤R½źåå5ÜŻŻż \©EŽ “ŒFć/BCC÷ōōōĀĢęęę{Ā҆††²„K—ž;??’"dߢž¬ą#?~Łwß}ēŪÆ_æbe—.]ŗpźŌ©ćóęĶŪ—„ģ{;lj@›”‡’ųEGó|ZĻ—–Ž/S[ĖócĘX/g#ÕŖÜł}ŗ>/“oō'’$ķ£MÕ3t‘Ųœ»wļ@įøįd»~żśc0;'ÉX„†²³lXl¶Æ¦¦]c­?·oßžPģĻ“iÓ0v§>yņd0źKmmmłā½ŠŠŠ#p/„S#ꃏ\‹żF 궝˜×:¼>®’ŠYŽQ’’Ņy 1/'Ēz9WwAÖļō)’Ö^ Į‡łóQw`Ć?ŗŪĪ;ć®\¹2~XiT#½Ø SJģ½g ˜Źuėօa½Ń“7 ˆŠFń°'b(ą9K ¢vM‡śAµ}.Ž’ę›oŽ¢m2ƒŌŚF[©ššš 軋h»Ūå@ģ ”ūü£V®É.ē)Č,Č8ńńķĢ„×öJvv·@“Ļ?ŖŁhPģįżŃßę…õI'‹œ ą`v~‚Æniiiš4iR¼źĀ>ę2°9źŁ¦ĆŒżˆ8«[·n&Ž£8‘)&ęĆ}Ą€O}ķŚµW€)*Ųz[[[«ą^¢7nœUōū~¼·|łņ;A$Üd2 š˜6—‚R "Ńųö‚oS…ł%%%›0 d¦GN©ō'FćhCm­c‰m©Ó§»nS fźėķ¶ŅŲ±ÖĆ rb4ł˜š›‡™āF¾„,ĄĖDƕjµzžąąl޼¹ĢF”Ūž3??æ—š`»^ÆoŠŠŠś‰ĻĖĀƒa8ؐųšf»œ³äŌĄ@ŠRÖÖÖ®Ņét‚M øĄĻ[LćėėėĪóšīĒ‚ƒƒ?v8vZ“æ7Ü3fĢųĒ‚ &X°Ū,I °ŃN(÷ Ō÷‘9ā ŽE5ŽZ0Īßtss ćŅŹ•+al×\ĖĮ'žNÄŁ{õƒætdƒ¼<žĻĢ’”®žļAöB&³Ā>W=“|£R-œ7+Tµ˜ū†¶«·ˆžĄ`ø£ķ'gkˆÆ,((ų̆­Į—’,>łņåw©Kģ“=‘a—„Xļ¦M›RÅ<ŖņĢö­˜ŒŚµkWœ˜W^^ž5 ä{ӄmr™%77w*}·źŲ'ę/\ø0ÖN&²ōŒÜp6­X±bU›LœH©RČŗöM†tńĶßöŒ³-²2“Dš”jrÜ'„”zų’6®½ øT£Æ7'Œŗ·÷R!čˆ¶-ĻG ž^žĄG½Ö·oßæŅŁŪ˜ššš*NXĒ—z¢Ä²łĪaƆĶÅ`±»ĄjæÓ›HH45±ģróęĶāäääÆé»ė”__ˆ÷RRR?`œĢÄ20¾ćܹsŸ‚ZūµŲĪ\ü/ĮfœĶöMAœåhņ¶męĖ[_ļ’3ėm*¾`ż!\ZÉŹN0%ž:@$ūĮŁś <ؔ <ŃjµaԈ•7agŲ-ø‹”™U·nŻŗ$ŚĆ£æĮĄZ¬TŚįpŪZDZ”PštmPą™ķ {¤°£×FĄ–+¤@% ˆŽĒÅÅ-8pąŪж§īܹ³óĆĆĆßgŁŚĢBĀ@Šö.–Jb6ČFÖVõ»*XWńŌYB:žš"©žb³õš»MŸ»]8×Ä p$–Ą*‡š$66vųøqć·+k[ŗ²{€“lUvś’Ę¢E‹Ā#©żu^2!ˆJ„Bę»G™š:0ŠJ `ß¼¼¼D¶S°ŒÖZ{“Łåć ;J­!`Ž ~¦»aŻ%XlS½i&N¶œ<}p7I(;GB_ä6*DHĮxōZµjU&›Ø-Ø9Cccća€>žüPfĪ Tݳ“¾cČL0f0€Ń%zm r„@£’ š_ĪēG=ń@ŽZÅĒ넲⻬„c£Ēó—Ó3łš»-W†‘nō1eeńæ^Ū}J$Ōw ją‡`xzŅȼģWÆ+>Ükż?~ü$¬’’’4&>s£®®īŠx ŚÄŲC¾ąi}&­Ū ¹ĪxgĀö(ū1ūĢų3X7Ų,Ēį~€LĚ;zōčĻÅ2xކ/ėyUWWcl+[?0ꮯ»w±`cśQ#¾Ÿm÷ٳgSY² ŁøÆS¦kHÓĢŁD÷Ē…¶Wņ)ū óŌ:jõ9a“›Øµ Į“lÜåĮ÷×äd r0dČ4fZUU5ĪßßضŃ@÷‘tV^€T jʰgĻcŸ>}žvńāÅ+0;ß»b4®«q{fõĮĮĮ룷<­7a@õ~~~“Q}čõś'NœX eSt:ʔϙ@åĶĘŪ6ŌGŖ6˜łēaš®`ŲŚžĖŒ·ĘĘŪ  h< ūĮc½P® źé2.Ą@~ 8{`ŅäNœ8`ŪXµ ķ; }”Ńh1Óр}ƒtöäɓ«žĆŚl2‘”Ló“×Uvķ«£±K½&‹:{Ž\łQń&¢1Ģnø§©½Ķ˜‡÷œ%§5A¤VåN”Zķ²čütåŁŽ=× ŠO¹æÅÖ@?8ĻŲ †uZéĄņ2Ū2DK¬ĒŗŹ­’$4ߍÜß;ŌBĪ¶ÉD~<ó¼ŲŽŚ•d)D4ö[iyóĒCYXļ;vģbŗ £”1Š:MŽÄø½ÕŚŗĄ äI`®ļ©˜čĒnµį}‰Œ-1°.93Ų²£Ō[bʓȕŖŹ±łmVŻ”łųĻČ®”{D„Ŗ­y÷%[ę9dŸ:ŹF)"ćP;ķ£·į™mō™4qĄ’Õ>Jt£†?Ÿ’”‚f¬%[‡“’P@šŸi„l&cXĒ0Ļü¬]™L¼Ōąe_›ž”•­\rm4Š}Ftƕė÷ųNo0˜,č.?ˆą¢,nē²żKłßć;Qp‘U1Ķ›­\’āxQšś£#*B6’c$æQ=kńmFń·b.6r‚ąĻhÄõ!5=>°±ń¾B”ų•4æµµ5¹ŗŗśpBq¹Įõ_EĪRgĢ Å#GŗńGĒ]±”ÆV«ń—{{Ą’’ōĄäb!ēÉ’ż,u•N&`‹zcmapĄ jé5°ņgaspąglyfč–Æā2‡÷head™˜16\Ć"hhea™Ģ$ ‚įhmtx™ģĀŁģloca›°õqµźmaxpžØ ŻnamežČfø<ešpost 0 ł¾2ĶæwebfŖ,ŒRQøĢ=¢ĻĖT‚0ĶŽ<ŃxŚc`d``ąb `b`d`dl’,` ŗxŚc`f}Č8•…„‡Å˜” B33Dł8AAeQ1ƒƒĀW6†’@>£2bDR¢ĄĄR xŚĶ‘½JQ…ēn~Ō {ĒßÄ(Ėf@}‚°±ZRŲX·Hņ!•eš $„6ADtV–ā $Y,åLŌØ¹n\lÄĀs†‡Æ˜!¢ųF*rRÕ(©÷œTŪŃö©D)²É„6P‡ĪéŹĶøī~Įó/ 6ᣂhįœį}Üc,¶8².Eń„"5iHkHĘDÜ ļųƒG_xF%” Ž&ŃĘ).qƒW6„$e ¤.Ķ ĻܚŖŁ3»fĒl…™ĮŻą¢?ģz]7Ļ«œēgy™—x‘xžē˜9Į+&mōXæźż¬GśI?ź‡Łƒų)•¦Oز"³¾āüM„³Ó©•ŹżŲHžŠūā2tn’’xڼ½ |TåÕ0~Ļs·™;ūÜY’Éd2ūd$d¶Y†°“ŁĈ¢.  ŠŪ(ˆā.*„¶jŌŖ„«]ģ×jńŚjW}mkWż÷‹mµż^­µ¶?[!słĪóܙÉ$$¢}’ļ™{Ÿ}=ĻóœsžsĪ川ćx»„NęølČā!Ē“Üv2¼] Ū.qĒ8śøŖ3Ø’ĢœōؘēźŃć’Įźšø¤H(Oe’!ÄÓ©H†: =ŚR¼r¾xÜ7š§OČon‰6zż·1*.ˆ`t‘‹§āųĒs䊖ˆ·Ī`ØcubÖт‡ĖJĀ­$ÕC’^‡8Ž›Źd!“ģšHܼ-ēÆ;Ė<|Mæ`Mq¼7ąsf{c§<>ܱ“ÅķnYz.¾¤ö/ÅŁÕü÷’ pB'GXņŲ™ a×ķ\ž»N>¢qbwf¢AĮćtć0x„¼öv‡öČp)/¤2QķČ×^»S;~ō’KŽ‚^r5¬‰L²žX˧ā°śź±—ÕŽßłŚ×“#1:;܉¼Ģ‰ēćŗ¹AŽ‹9$Y­¤GńX<įpyp¬3Ž.ŅŹćHn—×ć ³IGŸĶd{ ėŠ''ķ Óƒ•Ę“<˜Ģ]ŌŠ~Q.ł öXPµˆ‹ ¢d6ĖYŌ{¾ó²4+œmuøZ³įYŅĖßɜ™ßŲw,×·qcŸXčŪä¹hą„}-ķ3f“·ģ{)-rU‰Óč0(¢jłģĪƏ‰3|1§3ę›!>vøåī”ćš[ ečsLū–ēü'ą¶ ilaG€x{xœP:¦üż)gń.%2ŠÕ¦ō\ɲhtŁ%×÷ŒhoļĪ;É:Cō¬sļ˜ūŚæZē¢ŃÜā–½ö’½Qü¬^öqīFø°£*Gē-&ā4«R0ĶĘŌL‡WqL|Ś}«ĮķRŻZÆÖ‹ź&«µ{k;įż×Õ.õuxæ“æŅćÓŌ̲Å]o~ūms½[²Ā?`S;f\ ßojŅf.6Ņ%B*u)ō!fĀ©åcb¹S7CŲŚŗ£GµuбöĄ•š}Ö®¦©›E\ŠŌ×j7ōhæŅÖ’ū¼RnfLJ“’¶!ǾK T• $Õ#Ņńļ ++ rv)·g‚bžą•£‡®<(»ƒ™›»}+oÜćŹ>c÷ę™ [Ö ÆkϽž:ōģ½āÖ[ÆHoŽuīYs[Ņ-ų×8÷¬swm撤ǿĪq&ŗ¦dZÆ knćz¹Óø³øKøėø;¹‡ø/sœ˜NÅ[ ,ՃĖ3¬OįG*Ī ¾“ `büĒLŖś&.&ČĒ}lg›ā!pq_‘£Ÿ£ÜXŒX•SĖW§:U™ø ?` IĀ…”«DĮż“9‹>Ā ÖčS ?>ę䫓h÷Ÿ¢Ą§±ŗE¶ˆ šRõ|ŅŻzÜÕĀ„;E<Ļ ¤4.50"ģ9ęęóSÅŽn£) Oņ“*ĻčO¦ŠįŲbeūĻɰȁ[oU7č­rLšĆ’°b}„ėlŌ £Ļ17ÉWūŠł©ć>zŹj7™“>ą×gqĢÉOzŹU…!M:’æĻĀGUcFYaǹ©ćŖŻ’ęX <»®ä¬ŅMĀW9śšĢ„p@<Õ xJńŃŅMžā“›żĖü7k‡ü~ź€8¹‹śł÷–±(’Ͱ•śż~ķ7änōb¹ŸxGt ¹ĒE]6Ā #в㩬q|ł—lŃÉJÖ~«żV/ āč*ÕńRéæÅŠõWJŃń}æˆąŁ8OŸįżA§%¢ĻĶlܖńŃį©<ˆ „yqSa^§ZFT ¢-#ˆ‚Œ9Ēįcżé©š12rRNź|³ I{jk’HZuŸlœ—k? j?Zū‹Z+É}¼V³ö~䖖Ī}‰.·&.M1#" AlM:åĢf<^$[±õ Ąƒ/Ń ˆ?z=Nŗgė;4ų÷¼¤żQūöĒ—ö<|°å‚† ­yÓ¶å·}łč-Ė·mj¶¶6|ø˜Ų2€$’išrĻKą’ō7 ļ¢ µ„ł‚ą’_^¹“c®-WžrIš‚ękš"ķY²¤Č6hĀ6hü'Vpı}‹UĄE’˜C÷ÓöMę‡Sł9§µ`u²ä?ž{Øģp^Ŗ1'äšł^‘¹ uĆ„£ōeåi¼wŒyDź›Fc\ŒžT<,¹<‚p}Ź8#.œ‘®QIĘ’“Õø\2¤x‚¢ŽˆßcP+ŠĮĄœ-‡&qg’g=ÄķĶ"j”E«­ cPįīŠ+‡½BŁĶßR]‘Eбī.ŁzĖ“6»E®’Õ žM·+6«éŚ„l°-rÖY’—Ån7=m­mœ«}w{,–ń‰ļ0Ś,ęė£,±Ļ†‰‰‡Öp.śŁCü™XĒZ³O‰Ża¼Šk»¹Ćļ°|ÓīŽf4]šQ,f“{}mnj:ā¶°“­­3—›ĶŠ%z§²­:±²;i°ź‰ŪżÄĶĪŽ.«ĆČln.w¾Ž‡Tϲx æŠōÆ+@éÖ€ŽnH’Ei„%R^ÓYFßā²3ÄiesŠ˜ĀĶ[m<ŸćmÖāŚeEū®"ó—8­CūFŸb “^`[JO˜„¶¶:ł`Y§pü×Gę1aÉ.#!Ęū0xt`啻Vņßdµ?K„bO8õõļĆ;Oä9•­Ö5ģx ’JĮ“E@‹°“!AaR×J„żŲķšā¦‚ų©–?8āŖ¤—ōĀ’ī1Xx‹”8P0›-†QČ×’Į–Ę« !A-H[ŠčĀæÕādĪ#‘Éœā€—(u²ĘēūÉwiß“-ß |F’Št}pvńÜJ–Ś‚P<+a"6éE°Ī œ6ŌŲ©q$W(fķūęzzŠg‡,É7ł”ÓßČc kłz3Ģ4+Ś–Ń<ń,oōk?šéu³µé½{Śf«ļ;%°įģ­“‚=Į g'ø›ā֎;;›„¾#Œčą0|š˜öėcƒĘcpéKŚCŚFķ”—^‚³į8›Ń*pCa”ØaŖƒ„䬟¤/½Äę±ń„„ø=:Ś9Hó­@É™wK:ćŠ u“Ą`Jķȼ„ŌN7 ¦› KFwŽ6°¦\–§-.اłf'y浘³8Į…Įڻ˜kõĮĆ†Ø Vbˆ CĒ$6L+]Q<ģ#~Ųɤ³ŻŽō¦jʰœĄēāLąRżŖEß7-č<žvO™Ž(hćb\7b(„½°üVĒĶ“×ÓŃKWxdŠĒ@=ėfxĮćGƒ–sfœZ®Įįh$Ķ€_\óć)=żƒąŽws'žGS½–SU(Ō7% Ąč¦\¬ŌpQ†ø*ķŖ€ŠŪ‘Äķ¢,=` Uš" )ŚwL5&­`3<¶pšļ'˜9xš$Ø!Cf³ö£rvÕÅąĘŖ ;IG¤= t&i«¾Ē雔Ζ ˜ LŻÖU-T › 9ŪĻ>“©÷ŗ“a¶É 9­f3ōZĮ|HS ƒ ŠX謇P+$ų‡WČŠACVÕwcÆźįO@ššJ±ė|A×Y#Cqß1ÜØjßQŅ>>ēK+ļŌ’Æšš®f'fRxD 0Īäļ{ŗIcm8\[üuwÕŁø:Ź!”x8;ti…›)–½0,ŽŲv{0j Į]ōä±%N­`4Ø1’©NU+üųĆV=TŚ”¬ģE‰x/Ä#a+Aœ-ŁAĻūz°Ė’PA2“žżˆŚqR›ކ[īżałŚżŹbŁn50‚į"ķG_CÕīuŪ į"§å|ńĘDą–%oĖY 1ŽbØUöŻMSB'ų_ŚsÉęėqUć3Qn![„ …£ˆ°ŒmŃHyą1ŪQANŹ ;ÅŗRĮsŗĮɅXŪń¬žä“-Ś;µæn»^MŃéĀ•§Xųõ³÷’y©ĮŃ¢ÖŅža(vÆų}‹:īõ ø¶Ż€Ł`D$Ś?“Æ]|ŽõŖ^D<„č[tĆ„Žs½*ÆŅģrĖ=Ą"ƒ±kjœ‚¢aJ~0Ņō)üéŅō)üꮕzJ'¦z?Ź<<#3&wc¢cĢC9Įćx½0T)īŠ’šč$ĻÜ£“>a°š ĢÖø óŲčOÓŻŽ]}ŖSZĻ_J zp9S”•Ļ•‰ī `;‚ņfŠk­æbÖlµ9Õ/ß³0:²Ÿ¶ŠFńwĒQėń‡ ""øÕ·«ēŌ¬ cH#ģU‰Ą”ņ]®oy¬ĆF^žW’¤ö+ķ«ŚÆž¬Ÿ¾|įXÜŚžo¹ŗö@  5²ŸÜņų½3B+·ĒĻąĀ.óY›īéÓŸÖŽŻ»é,s×ĀąRܶ24ćŽĒ?5/īŁó¢ög½_AžFēdū‹ŲŃĘĆćY­j_ӎ±}X‚A\ŖĀšqŗĀaC(š9ØÆA /A!ĻŹš>yiœ>‘”™Ķ§Zyv„ą“ȟ¾@±łā5įp żÅ}6eĮ$kĪĆ{żb¬Ī]ļ®m×Z‹ļŗ˜XĒ@÷»oįœ-dķYĢmū8mĀ#µŹīiŽfÄŪÄ8¤šv’ y%ÅGīœž¹Ū,ęŗx¢ÓµdåŹ%®ĪDÜg±ÜŸÓ~nA0MČ rkōŖ[n¹*ڊNłó> Yķ%­8[Œū®z[ęŃo>š±Õ»ż³æ”„“ėÖcLŌ+X„Zßz°CŲ×ūjŃėb’õœ™łęé=¤ wV•óā‰Ū€'~žst­ŗ#i!ü£U(ņ?t@)i·tÄq„ÜÉ4čIĒ|I/JvŠĻŃē ®˜ņy­åŁ»ˆ’EüŃ ž£ŁF®ƒR>Kņ §|f $,! ¦?ŽŻ –φ“ū‘ąZJ}™MłćɈ#©ž7~½ų/ÜŲŠšžõō\ŪŠŠĖžčķÅækŁßĘŽŽ£7Ņd½½bžŲõāu’ÖĪ‹~¦ß'¾Åöčś*E #B bŒųņ@7Ēž­Āå1ĶH„cÅt<=‚įt>N~L4²_Ė„cš+#?‰åÓ0œHĒ‹™D7½OŽVŖ+}ŖŚD=É@Üi\$łZym Ą/c4.ŸłķK±@fĀŹČāi½Ł<§ Īs%¶yw.·!i+„»p9gSøvćŁĀ–qœ>':0JņʬK„|²äeĒ<¢į (1w/dāc¤\•_:æŃ£żE½lĪčęĮ;ż5 šL$f·äfąEĀūyw³² DµM!VdpXTW(ᇸ…|°d™G{'ŗšĢŃOՙLJĶü§ź3˜&“ųńæf+²Ō nt‡Ń±å¤!žUOÄØ -Z”āŌļs?!–īŠ”Ćw饦Œ |ź`ēµp›×J$Bjm{D[Ø-Œ¶é~·WĢ-įc’ wZ Aų¬¶6Dż¢żĘņ^ž—ō½ČŒ4Ē5é› ćū„Ź ˜u”XÖ:†)Ļ%°¤ų7£ōwŸQü Ó»!Æ¢ŖeDĒ]F,źŽÓ!ƍCžĆžĘÜi;€£{NgćpQ§=sڐE¦ŲĢ0’ŠĆ§ķ Aʜ8ģj<Įķ(Éč4sˆkĀP1 Ä£KČĄUaW•ųŠv~ń;G޼s„”(Ó±<}Ž$ÕĶiĀ„7«Éāłcüd~čMJŚ:ŹŅńų¼yĘĀ…3n>ž‡ŠĆo™ŽŸ‘[޳Ä#IBŁ‘É2\?«Āl@"Ķ;īæŪ%# Ū½ČfRm$†ˤ: 'ˆÉłÅē?ė¶RšO'Ņ%ØIšńŒŽ9RŚŁJčuA<įHć&`Ó/÷čք›TÆ~±Gy=Ė3®’øA½ģW [ż²Ül£“%$źkė 6±Xå…7·„C ”<óŒFģ“\"ou]<øčńµw·{øgŻź2ņ"bFA2Ä/n¹ŌnqśLR<Ķ,½rŗ®uĶŸ3“lYµG¼®NÄR Ų ßésgUßrzĶ`†ŲBij‡µÆkŸ¼§5Q++vĮ LqöƒUš>cČ7»#…æĮzvlš"Hu&cūy!ÕW瀦ÕĒIĢ÷ˆ’bWv–ö¦żŒ/±…ŪW™ń”sžHsąHŲ“MeuHōčĄµŪ¦_°" ‡4nĘ[šxz¦˜ƒóæŌ“qŖ9Xń‰éµå9DBŲ tüÅZ™ńõR׫‡ć#}j’”·ˆcC§Ńb¢CļWŖ†žŲß'pźįtžī8Ž »ÅūļÜåĖ\Ü÷“J‘J4Ē™‹Č˜øqß1擸RK)ą³0&ŌrŽ)œ’Ś­‹FņłR»™O,K1łh·ćcśĒ·»z“«Ēśßé’'m>µūc¶łCx‚o©§šO7Ŗ¾§Z =ÅCĀųcĢ#"’}Œ›*f*÷H„4øl2ēčß+NaŅŠÉ³±;’“ĘTēwÓū””.ķ ’MČ S«Q1!h“ZTż°J¬)ĒŁSČMt„įGØČĶī§S÷¬ŗ““ö±tĒ óØ$Ī·C“ƒŒiÅ&ŠG>nÉK~Z‚.–‚.Ķų1ŗØó3™ģr›?vv–ūT&āė7KęsS»čČībn÷‘#»Ia÷øĒYg¶$(3ŖŁ!ŖpĻćå˜#»ƒƒŖčØŠm²ĪC¶r®•Ž$„ƒ2H¾„²ŠuŽǽŲē$æ}xūöaaū±<ä† b °~Ht$ī©–¶ģ4įöbAĖXRāą±0Kš8c™ …’l$Ņo‰Ū8 ©ÉZ¤ øP6!»“nH!Hć f‹$>¶Ļˆ*e7#ŠŪÖæµ>O.÷(rń÷2>I@ĪĄšhAߊ=® =ͤćoÅ0Õ¶‚–PÖk·{³”EÓżżO½¢aæ^¹ū㣷žęĢ@88ó7·>j¼N_ÆŅ氟ĀŲL®‡[„­Ņg“‹ć\z² ŽmŠ0ŚØEõÅ .MŠņlŹeœp&kĒ_±óšĪ!ĀŚ#Ž 6.?²{”A9ŸėĶŲxŽ<ĆźōzFņbƜ­q‚Å!mDŲ°AŁą_ę?ģ‡!,¦sˆ*å’óY½”ŻGje»‹‘$]ądcßµ,ÅN^ŌFŠXńo€ą?–²¬2žģ>¾…[7Q¦wFG‰„U=£Ø°×£ź÷¤Ż Ź’źa«žJö÷Čō&‡I!a—Å|¹‹Ü ‹źģT¤ķåŽ9ż>»źž‹–g«X;zŁīé¼× ŲÅ3³9"»#³—^rĖS[‡qĖš©ø““ˆV,÷SµŌ‰¾°Pīå/UÅRc7į5-ūEsaļķIÆ ģšłCū:g¬Z¶rά„‡m0˜$Uīūu8×mLBŃ1Ł“22उ„;™Ŗßū—¦ėneF /ŸSÅ"I®?ž¬¦ÆF[QSs1¾A&7įėā²Q{nüT*¤2•N„ĀąĢ[_bj“0+-¤¤Ćs—(ĪēÜŅ9ĆXZ”MUT`,,J©”OYŗ93ŽWY€ÉBQź=øÜOpj qTD…˜“>1B¤•9UąŲ…¦NśĄh ŃĄ‘ū?^zu|mU|Ŗƒ”aü.*4A¦ĖķČdłŸ«>ŸZœeŖ¤ņāeŖŁw,ē3«ä£R\Wƹć^g2T馓L,ŠjX¢LVŖŌvräÕwRͳ¦h&6ūгX[ö”ųjµ““%U©y„^³A¤OU„µ‰†IkĆŃ+žõõjń:qÕĪ0"ĮJ»ÅÖč–c/{C!ÆŲī%g—O,ų\tE¹q²‹¶Ņ ?īP'Ŗq% ¦m0šÆö‰¹1Ŗ§šŠ—a·\ĻIµHć(¦qåŒå•ō±óVŗę-õPf½•äétčČ tčp`čšįŠŃ‘Ć›é˜šČ ́#‡³¼ +å—įä¤ņ½ŽńW³“ŖÉj4ˆUj!†©kGĒćcDWŒÕ·&Ę·eb#*µW×;¾Ę ±łĘ$%„“:ŽSõMĶTĶ­Ē:cöÄŖ¦…L/±Æų¦.s÷Ą§>žéßLācāÄŅ>TGgܔ0y³ø3#·Å¶Åśc1ĶoĘŠ±-FnÕĢ£ł“ŗųVtźeī:ń”ŠezĖrYmLėŹHŸ½z7„ž–»56‹Į›š/ˆ^ÅZH!•(īĀRéõ¼ oŠw<Žać×½ÆäØ6Q$äŠU†Üސ®7” 9t唓OŠqŅBŚu6ž'Ų8€īa‚h¹‰āB¹RĢÉy ådŁ©*ł„R»Ź­9¹ UŗG“ÖZ¢}[&‘C,×ÓĀījSm@ŽmT’ĒŒÆOńܐŁÓ“ģč/{ŽoĆ5źSO©ź:µĪG¾:tž{'“ ü°ä„xiʱń2¹2ŚZDǽdmõŅVR9ÉŖö‰‚s=“¶å÷ų\ļtĀVZipŽN”ć ūX³vĮļ±j§ šC*M·dBŖåĖfq sžØ§–jI[£ ¢Š+”Są9œķ¢DN+2źÜ%Æł{ŽęŻ'›ķĘt(œjļolļ½€E¶„‚įY µŸŠśįŠ0;łŅŚC+~Qć,CųāEt!]|ųB¶œ.|881.‹ūõ0ó>üVģN?!€pSå®Ą“©³—ĘˁF˜Ō<§+ÉŗFP/.ˆ”~gP¢Rlør]™©äT|ʁų8ØŠ·2Į’ā‡IBĀ'ĻTń×~ø8ōɲŚĘ*,¼J‡Č”B›÷hėčņž­Ŗž‡ļ{@ÅēyźžŽü9ęQ!ĪR²,4ļ±ŲĪ9#ēdŗÉ©0ł2‘Éq"PaĆtœ’†\S“¾ä‡WÖ’æßō’Óbpϋړh BVø%tBż‹dļĆū‹¶3Öüń·É{ėŽŽūōj/hæg˜õŌEĻĆ܉4¶”GŖ¤«¤Ÿ­Œæ–Ölģ̆`ĶIs‹Ēū©Ų= É­˜*އ ö*sH>Ÿī×~‹ēå;˜©pÄ-ńų’ųVLŠÆć%i±PŖOēq13ØšŖō‰b””Xˆw%RÉ–±b.5gNŠ“W±žx*Ēžä21v$cėOcķĒŚŁ©Ńqˆ¼Ō/ęØÖ>”;VĮ~*Ē©B©K¢ZVæeE±Ž`QäÖH6C ’ž¶Š¶–ń–§°Ī|Yß¼<˜„nUp°ŅŲb„“—i|āH1Ü">Ź§ NĒÆńŽtLGt(Ƈb:æÅ± s§čČīY š^¢éØü¶UÄCĢUŅwo% ‚}u†’Ž2ݦQJjdÓ§>¹cSOD6»Y6ŪųėŅŽ µE8©3’_Ą™2§ļޜ'EŒ6—ĆčƓ²žńļļ‡{(&‚©øqēi›ŽÆg K//?&×e…Cŗ½čĢ·æ+Ś×ļRuį]¬ž.ĄE)ļ„nķėŌ­(0pWIbžācé+BĄ4=&_ĢdiLļcRń’Ģ åÄķāßÅĖōöMՎ©ŚĶäģ&iČķ&¹IBŁū¢®YZ`­¬ Qʊźź1}QŖēBÕX˜†;łąd”,}©.‚uń:-5_LĖ=ĪÄj…B©¤²RŖNƒR:Šj Ą†_bLĻN”tU”éxöāŁē+ķeØö™$‹āZė|9ßł­Śū ҵ÷[ĻG]+(čŌ£@сRŠŅއ71ųbŒž¤ö"SŻN~Ć/Ęųūļ/Ē@’iƒæX‰©>(­2I:Ė;žD^M%h⨪BŚō-»¼å“Æ:-‹Ė…'q*Šõ5«¢8\ÖoYUq"rüÆĻZU—åY‹K…óČEfÉ`ĢÅ{›­|Ē…ķŹq΃TóŠ%9Ņ!·Ć]Āū’ģŁå‰¦ņœģŠõŌŖuŠtJ‹Y[a§sR7æŅįᇵBŌ_šGµĪļ^ėkĮ™#æīllń]ó\#<‰x”®„cSßńģEŁÆķ«÷%”„+œØIōķ|<?ēČMī\s5Õ«·€tÖ¦ķ¹‹.l—är_½`•,rd03Kę)Éōe?{hwŌi捉˜’pxöķŌmĮˆ”j£ŚāěŪt^Ęčq÷&½S»/;ĮĶ8mhč“sXwہuYŻ×Ēė¾įŠ“¼ .ŻwęŹE‹Ö'‡ņM«v^’…M名7”BJøwŹ“‡˜ažxw}/.Év6:ÜI st‚nyŁ ¾½RžšŻŗ W÷‡o„»įø»ų”ßuĶ×üž=«]ü…®Ū“Dń=-q›Ėuü†Xį7·‘ÜŪ»¶\ł-Ŗ¢ü­+·ģzūÅæ’Ģlōķ—ßļZ½GūټțŚ[ąy#2/ņx“’zƒéńĖTÜČÕrŻÜ\īt„ül+°¦:'¶3FŪYā²b *õL[ź`Z¬”ׯ"-„T;cC xRG³ńDmҲtĶ&ģĖäĄX/ą&ø@Ū°u†ā4ļ±O»óok]®OĀ `9c}Fqоh ÄŪcŽ5(ø i»~·äøąŹĖžč=ėĖ3x{oaķ§¦‘‹ĒŗłW™|»h>z†}Ū?ē׎»ćl»YuŖDŃŚo}£ޟ¾oA8·ü Ļīs¾óķÆ]¶=÷Õ³ō¹³ćžō.ƒ§…ØŲ)÷$ē°‰iōØl·˜Ļ6BxšģvSŽ">4<£'Ł ż®ādŁė²ŌõiÜeē-IŽĒ&¼”Ś_aŽ”öćŖtŁ q± Z*%r/Te»Ą“‡ 6CÓ ŚšD7aī<}ņ ŃŻŚš˜ź¦©„+-8 łŌ1¦1ŸßŲ—ėŪś Cōzƒ9–-—ƒą(–ż”$A&eKŒ~‘%” UĮƒĒ™ŸCōšaH”č\ĻāR1YnÕ!”[…*q…ņ]v7 QÓ*%2Ł€ éŖ ą¬D†š(Ą%l­–tĄƒ “ķ‘*©Éż]ƒž@2Ł?m„©Ó%£V ÷ŚĮ­ėR}©Yu³KIØÖuY½&9Įµ/ķj® ¶Ö7Ķķ^sęóō2&–s žšž]ŌTĻX £V?-×/[½įÖīę_gńTļQū滜 ŠÕŪŚsQßŗ+–­N†Xęq!zņ±{Ü)jŠ ®(IÄ=,žHĒ3qzŠYjŽ”ØāžĢ½«ūż/hĒfĢqŌ ¼ 1¹ŻŻT0=šŌļĀĄ7žŸę[µĻhæł¼įĖs­āq‚`l¼•ŅŽĪÖEg€t膿|aóēĒÓüI¦9ģv1¬Ø|’įžą;zųŹÉvJ®žóŚĆŚ"ķįēuM‘¶®­Ķ­+ŗŚt/5x¤é–ßJʐĘ|¤’”öģSOAßucj ī%„(Ÿų¼±¤ÕŁŹ|bn—Ō/ō³ķgœ@ŚU(;Ÿę+u:u »¶R&.¼”Õ!-G),–c妱\»k9‰Ž3V“o“č1ņķMxS§ÜųœNՑ[Ė”›Ī£NTīUå<žŁ1Ŗå„ŪŻjå» ĘiŽźvBL |A—Öočō.2Ć"¼Iz‡'rTĻ`’‚“… rj— 9[ÜW 9»qX&y›VpĶriV,Š0ŖóW΁k^P$‡ä‚aF”ĖyGĖ;jØš©`‚C5-ļõ ‚¼¹`4eцŖųIyQ×įžMmĢčRBéMµe1@Ü.¹b1Bz–č¦;‚—‰c0ķ žĒģõć`ķń·AkųĆĢŽ ’žłŹOtÖ·½Öfd¾ā‹§™ī†žĒ4®&Ęļ‘ėk{;§÷Y“ó>‹N‹³Į“ćUśv®“ļ•źļ#æoĆń܆}ū6>Éš†}üp‘łł}÷Ķé&÷ݬC~N—Õķ©“ÕŌ95¾|yMƒöd˧śŽĀéX†.!NkGF _źÖ¾,B©ā ž5D“É…¾@CnĆ7Ģ>k‘¶SBUc(o‡#‰ÉÜp ˆ&^ńŽ]č’.ŗ ×·UׯĀoStżVŻĪ \å2VßĖ 's|AÆ«|§<ńyü}ń¤ŽŻOøż-Żö–l|ČÕzb :-rŒ’}øž,ĮŻ—äĒ~T lLŌgœ]5ŖźyĀQ ŽL× ņ£Hæté)†«æX-š3ŽŅĪåŲ©˜AüVGn½ˆĘŅW<ˆ®—n,ˆÆŅå’!%”Čœ“ŁrsęÕΙ߽aĶUāõæ?­~}[śÜÅõ‹Ļ½mŽĪ»}5÷~iū÷nŪ<iīę#»G™Ü_Ų}„°ÖŲ8·ō]µ¦^•wžŻŃyi7Ō’ž]VƒŠ»ÖńīžŌ‘UNćt c¹ŽŒkæŹøŁŪuҌmq'ŁOhd÷…†Ī‹æ|xߎ½ Į½Õ ![_½hFāÕ»nßūjńFr¼_]›\eŪ‡ākTS®•ė)QUŌ@¦,ĶJ‡8{<(Ł=AźęCnrµ)݀ҨTˆÄŁŁh}É4¢¶L…|ÉNįčėT³»9ś½\ńj)ߟ>Ę„ūūÓ>ÉWżĪ}Ghģ40±§ŃēņŠ=ÆÓĢÉk…ĖoÉē³ "}²1[$ŻĆč߅%ł*:͌ŒgŹJ’2åā„ģ-1ętIæ”3Z²t™-«…>·}x»ŚŌ¼l{éĶw“Ć˜·šCÆł—67ś‹g?yōŃŸ…ŽįG_Ü ē ń­įą&‡E‘–­:c&’äšöķ˚›Ōķ„·Ę96ńĮĢĶKżä”½/>: ϾųčŃ'µ†ų<9›ipÅŗ¾ņZ³įZ{gȁórw”;^%7¦÷{樸Ŗģ¹?Ä`ŃĒ7WTe¬˜ĢQI?žĄM†Öòǩø?beQUm/ī9X¾^¶ŹńßÉĢēń‡¶ ąŁ¢?µ¼Õų)“;Ü)ĖŽŻŖI¹,Öh2ĖŽ§MNš†›.—-&å.Yé±{͇k%©ē š4ÜRŌ`¦IĶ]6Æ “’ü}fgRŲC V—Ėe0=BŅi¾ļ>‹#)=„ˆd“$\!$–ū>nś’I¦ ¹GŅ%‡v×·j"MķsÅ,vĖėTó…m56哊ū ŁpcQ±.õL‹×€ĆTIj2š ĖåuNė…­ć’Ś<ķa/qGn³ŪźjwŌ üĀnBÜņzėlvŒØ÷Ņ ž‰Q ›Čē­·ńļž;¹*{0ƱcŒe—–ĶĢįd§ĆīėŽÆąĀ”ķHҘ‡ ŅEØÄµKĶ}[{ę?VÆ»śžhoR Dä%£öz·rõ߆łp-Ģ']w\­øėķQ$Ŗw‰É\ęŽčżWÆ[­żķ‡³CćĪkö{Æ?ÄßŖż×ŪģkHŃņ²$ 2OÅBܱƚE?Ū}ėŪ\ńÓE51w\Œ$Ię­vkķū„u«6¼»°į/+ų<Óģā.³šō Leč½…ĀBT{JIWģWąCYoø"]le°ŸŌBč ķ§tQRŠŒŚįĆTōZ7­#<¾“CŹ łjbMž¬ƝmJ؃AK¬¾ĶŪ.ž|ļ•1q¦]¶`K~†1ŽXīnž9ōĢU;=ŚŻ?ĮŻ<½„±?Mņ龚½żéŚ+÷5ĒęܲėĢsse;}ŗ¬j7µ]µ£%Ų\SEŖŒĪˆ‘­¢>`"U¾#^ŗĒÓT'—"Uå]ŽI„RSa•Ӂ†ī`²»2¢•įj Ś\ig$ nZ“ßūs±ŻŪV³ƒöDStZm\Čzšb5>OźXš?¼åÉöHd’Ŗd"ÜhŖQŪgoŽjļ°1 zv柽`ūm_„.>nœ!čŗ¢ŁŽīŚłĮ%‹ķßé+‡Į&Kż3I;ÄyŽ–/÷mÜ4ūdz;Ī?|Ī™—Ļ›?'Ś“rµ»cpo>jÓ¦=x@ÜģqĻŒ†–čv”ł£óŪ:Éj1Ÿ›h•X9öüÉf‡«×%ÕįIo>[yFżÓQ [y<2‘¼Ź–pÕ ¶ „|ĖÜ” [®Ų¼ØĘŁć¬Y“łŠ-†ę¶ŅHq¹˜Ėc%Õx†»PĀ6g‘_¹…«$ÓoŻHž€h³hL”ZĒ*y)īŌ¢øCR~X-ŽP!Gf/ ō*.8$Ż>‹.ō®Z˜gc_‘ā§‚l")šKv‚ˆ0GŹŗĢŗ=jO+Ķq٤#‚»;±õ›Š,‡åd:āįŃĶa÷Dģī/śÓū°`ēā…3aö"²ųOÆøy1łĻ’I¶uMŪ ÆTc{{Č7~™š7/•œ?ō øćžwmī+ŽūāĪȌČeÕøć§3»/&*Æ:*į`ømo„ęĢ<£¢2IG‰>¤D£w Äīš ­Ŗ­L‡źÄķB_üs*ę#Sē<@†‰‹0ŪjŚ—˜­7;źąøļŖē §Ū§Ōøē+4ŻG“Ł0®×mW+T,INv—8&īKXйŠl33ńF…ZŸ,īŌÆÉmOŖŗ$Ņ e!_–°,ąĖŒJņ+ØĄ$ĖĒni>zÅ9f'ĖKįt 4Vś”Š#–SŅ„ˆ„š E<õ 0ĀeGvSe|³Ąz¢”`¶†˜žż“ƒ"$‹¹*Č%r :XWxT®ŽĀ-¦wi¤ =±tČ%ćÉäv駰ˤņ<č÷.lK¦6QJĢŖte ?Zr‚;*|÷·äö£ł•·æø£9ÆļžŪæĖiÅ)ŁÕ?·»>žnŽńāķ+;!ˆ-£ģÓ`c'¹ż‘Ÿ-żģūC?}¤ž³/å޵ó41ÓLf–¬ŸÆ[əæ~I&9nʈ§ķ¼ka¾±Sē‹vźś`}+ēįøö¦sIīvÜ?¤DœŹĒ'<²„ŽDÉė­zӗ+"„SIjÆ ƒKR ­”=—čč•ˆ#¦Ė­8.^\ĖŽKĒ'LmĆ“įźE–ńĒ÷` iĢPŌ-³Åh0›;ŒFƒÓhL‹…ēÅ/)F{žö.»Ćī˜E‚‚ŻĪæpd÷ˆŻįQR3ן=§é“Ųt’ÖDüĢĪ“§/­Ÿ;­)wöś™Fw{߯:ŪårŪ%3ā¹-ŠbéY4—ćšxFŹ ’›F³É€æ“Y–|¢Ü&‹¢,ņb“¬˜DÉhŚe– ŚMÄb"¼bØį ’ŗmƒŪń׳§K5™Óöž~åéėwkj|>SpŗqĒz øaY¦FŠ"ÖŚŅlx£Õ*ŠJ§×o³€ Äoą=^¾Bä–ķ<ŸŠ­÷·5Ȍ‚f²tųō»y=ŠZ_+±ė¦²6ųy÷9ŻĄuŸć†Ļ3ƒƒĶTp“JmžąØ!6(83N(4ħ08Ų¹hQg'j,/ĒFÄF ŖŖå•óT<°6ƒ;—ž§Ty9*Y '5(¢«‡ø™8]Bō²˜ŻŹ:³.¢%ŅÓ²Œś5¬.mاÅl Ę ¾Īj2+EŒźRWןg·œ?·óĄœ”ėfŌzj<5g×Ī|}ęSē_’‹ŻłŪF?uõfž¾ĆoöŌFēW/½’¹=]š„ø–/Qˆ ‰ŻI^˜vk]Ą?Żē]ļ‰9ĮŲī­ńdf,ž?½¾qøÉ»fZ½§!:żWąŗõ1ķ™ćŁiõõ—,®Yėm|øé’_¼ō9³»—¶+›Wy×y‡CńHŒ—„ :ƒĢb„»–ĘѽB([b¶p» ÜH:>Ō ŽÆ›ś¢NB5=ļĖ䎼qC]2×°Ģøi0Æżõ“ö09ådgGķš:«ģŒ˜āA_o9w¦"»aą{HŲZgtvvt¹¬õĶBķĢź‰‡Ęŗ5µIŁi š‘öÓĄ‘Üd\֐KÖmŲøŁmrń¦›Y+4×[]]Nc5L|oܲ‚e[ėy[0nŠ8åņyU±yĖJĮMÓ3Łų»1U”ŻGD®|ĘŠøį±żŒÖm®HŗżEd½ ~Øń•ü(OœqY²ģēš³*[š¢-6Åć„é­3‚‚Ē}ĻL{“¶ÉŁ.}Fū~qŹQœ×šęgŽēæ•å’V‰ś‡vĒ‚XAŠ)Rz®æŗĮćewēĮ[²FłŒiÕܳ`ąSæŌ~öķoÆGZ^ņ‚ĒBž–ęķ÷Ģ[Ś·tŚ•°žĆŃż· ]4»ąLa˦łV’ Zń’uŃŻĀ-䚳E“÷+»„8?ķŽ•kūļūšī?zž{ęe½JYæ€ēÄw97…>B-ć8tósT쌸į@ąŚē?÷¹/<’‡;mn‰EūćčųNšžĻh“„#AVĪl^WŠ5ŹÉŌDĀæ{¼į©ÉQ.ZPpJœöźŸėj’ŻsŹW÷gķÕ²°&É×.kœ?’÷Oóxg8w’©.Jč³ńg”:Nł«Éńv{(FĆ1u܇ū’”W }l1[f{‡/”uØmžBgc•õĆoQÓ<źś^Q[²GĘM°”tÓPė‹ˆ_S=ŗ™dÓŌžZČ-ŠżAg[T)ÆZ,źų.Xīƾ1.8ŒXŌćœj!CÅa‹JͦåuY±ü-„ī* ]Ī$¤Ū3ć R BµĒ)Vb‹33{ōŗĀ.ŁNTgżMµQāўy£6ävųÄaˆīøō&b!.§’N_ Ģ_Õž ]󫌈ĖéćA‚’żō3æ]‹W{Žļr‡j߀ł­½©Žé°ÜtéķµGź\®HķÆ`/ŌÕ±Ś;‘Ų°üņ™§µPI”+Żq5pM{ą&Üsy'~c&T6Ć “Z­ģm}mm}ŠĘ^U+ļ>ż€Pc}ĻZ#_ŃGŚž¼cC–·f78ž·ĆŁ}z6ś÷.ŒYĪ‚æĄļ-‡„xm‰ĢĢÕvé¾¾tń‘¶·īe“x+—bŠ@)+üq1+ī-VĄćĻ ō¼Ģd+Vσhx':)Oy)ķ,m׬>!ī’œ3Śāõ}”Už®ÖńŠc«s¾/¦ņŚåŚ-p%Ÿg|ÓŌ¬©·%Bs’³›³:ꚽ×w]¾jGfcµ5šHFł§µŸ5iļ5Wų6T¾Ć„;OøĆWĀ”&€Pœ¤ķA‡‹ˆthŁg čgœōDŅm{ŗ]2Yv'æĢ>ūōął‹‹»Eēg+ęc؃®,-—xö¹Āg Ė: Ÿ-<÷dšōŁvūāó”ż)xQ¬_ӒO„č"H= æé±ē\N•®5Õézī1ķ˜V’&ˆ“iā5Œ–ń"ŪŲ“ŠÕĖLīYffÕ鳗±铦<¢Ļf Š>½żicvgdq薀bnüvŚÜPßōt»Ņd–\7ŻäonRڟnŖo0§æŻhV·LHÕTÓMõMćӐü„lÄC³™šĘ²5ūĒݤ˜n½5`RĘ„©|›Œ®é4·e"ļ‘ öQ¹t@¹iøĒUóĖü4©Ä|,iՖOė‘āj‚~CŖpÅĒ—v hąŒ…5}5–ĘE 󃋞}~łŃĒśź>qĮ!ÄøŽ7żĢģĖ1ØxkÜuÖ2'bi ·õĘÆyŌ—W3]3Ó+[ęvß:Ķ[¾¼vf1ŸĖU3ŅsēĻÖŁfFÕį·łł%Y÷Šž\d’žy]‡¹ŖńÉā.qR€I‡Ž·čv¾ZvĖ…(ūjn{ńJōr‘»=0ačz/č·:Īž éē?•‰ó$†ā ƒ‘9]õ„É¢Fk ØNŪ°š ±b”cé@ śuN¤pöšU/< [tŖ„?­ĢžĢ³×Żń$@7Ž\š‰Ć[ąrĻ£×Ä{ŪĀ–ČRc­s×x¦ūó$_ÓŃāy‰,ĻyĆŽŻs[V¦gŗ“© +²&xśŠ\.^Ż"ÖģłŸŗM8Ļ枣sų‚ówĶŪ³?’ėYįĪ.įqŖ±æĀ«e|m[By$Øé„V³;UŁ”ß:˜Ł^ŻfūĻŽ2ĘŲ–ŖN¹V±Ddōļ2†‚Ē˰§2 ÷ųø©N ”!O§½8ł“Ÿ?ėōĻvUĆäT€»ś#@hœ¹źńIq]”—MõÅŲå;早’VA"’t0Ā/ķ ø£Wõ‘Šܛ$v?Āī%©zhÉP-“ĀŖŅź¤ŌP.WdÓn'›ō֙csž/QÄ„¹ĪĢ”sYråM暭ŸŁóI!qQ p Ā`Ń”–ļfC[œ§ƒj@žpP-öxš¢aAL/’d*€²äj _ !ō$©L²¦UÕõō›‡Ö;ėa+:Ńqާš™“iNÕizLŖĀ\č8śįŗ”¬m\Š~ō‰ź$b£*ŗ›¬‰žŽ,d«5’D‘•­7FSFų~©©°u=X&6ms†µ¾ŌßXC1µ6„¾d©] ]Wō¦ōBE»•}”!:^oņ¤žW*ėÄVĒZ뜢/ÅSµ« WEHSWčty5kœMŖĻ9IĻlTNn×¹c³< p'>LĶæ&5ō¬ wō”ģ>zć”Ń R<į’Sq)Q&l)•gĘäd¤ŠäL<‘dQ2Ņ@n=!h”„»•P3sōL‘鏦ī4½¶‹x˜ü=»žLĀĆRHŽøh aZd†Ȱ=5\'ydJcRB+ĪŲ’TdEÖ ńf=Ž8½DGŚ,f¦($ė‘3 C”ķņdqK‘½ų–JĢ@–"ŒŸ’Ķč¬;X‹PĆ-”ėBŸtg¢Ÿ Źźq” õd3i)‘j%”ŁĖņŅQ’ÜaziŁĆĒo‹ŹNRZøX(x˜PAÄƒķŹ¦āYO–UŽ»mg ņ•JcżV3ё #nž”Y±6öʤ؄d"4€Ž}Ēł COdč$šRD¶ņ^Źp£Ō©ĒVŗ°%†ńį@»šo¢& ?Ų$"Š Ł­ń°ƒxy¾†'fHF+Q ˆĻ‹’A^Āƕ7ń6»"yY›‹7¤š-ƒÅ/š>^”e’(š&U^IŒÖ†$I6ó„7‚Yę#6Ń"U“ņF³QäĶ6ƒ»Œ¢ĮĄūµN®“D0)b•ˆEĮEŃĄĖAEØqˆ‚¼`å[Ū%I““°A“J2vH&‚Ķj°KϐEšŠQ‚•š°/ĖŲ:Ā;,–¶Üi³xxąky ‚D|6Š•ęā«‹HvƒŃ#‰!³‹ė ŠŁ!ŚürT%¢I&¢OĄ.ƒµĮ)ņ„F" ®ļy Ž£DLfUzE–-*½|7 „6‡äÉ&‹D¬įkE{&*Äd @’ŁdE«CpK²8ÜFYE£Y–Ä^&¼ą!žwZ;o6ņbó8޾t7ÆņN d£'Š`’d:UÜ6Ńl4I"ĮÅ$ņ6£U°œ;¢—Õ:"Ųķp’¢ö<8@1ƒl$ƒJ<€`į»AŠąŠkxŃ$"x‹ŠBp\ ˆ’‚]Œ"ÉØņ’U”ƒ]0ø%"Š1=¶ZŃ`“XŒ"Xm¼ä„k3 6±ĒR”JN¬Ąˆ#äEø«›Į fŽ™l”1PēUp b­`äA ²‡ŪęĆ&Į*‹v£ĄK’Yā­8’ĖīģŲųĪ™§‚ ĢÓy¾ŃÄd”Ĉ$łø™Ń<ÄÕ\+ˆnĒŚd·ŻC¤:—bˆJ²ERŗ€} Ŗ,N/9%A4Ō¾Ž#Āģ 5¼‘ # ®`·˜±*o3š< Ķv%ä°Oķi ¼Q2YĄ!Ö9yGšåE«Ņˆ.‡I6Ž©A4ŖŻˆ5™x;1+ƒ,KGU4€I ģ®4 Š$ŽŽż$փȂ™¶Ö€ÓL!Ē pYID(®•p嚈‘ģŲ^é°48jmA®30-÷ ·t-£›ÜTбŒåKš±Tn4€`ĪD 8;ǾAį’E·W’ …ŽZ‘ĻWS‰ć­ń89’ųyĶŪöÖķŗRĪ¬ė¦ŁķŚ«ßļ½Źhs”īžˆÉc2Yē#›>·%ęīBg"…¦°éČČ6~żBWż-N]Ö²OףH½„Ņ!(’Nń ׉~£Øæ–øQśQ.jB’#Yfdęłńo4WfsQ3oNå”ō·ˆō÷U"Ēx”¹bvŽ*ž²oDuˆW94•Y›;Į©šJ?ž$rĶĀošź5µčc†ę8ÕoĀ_ź›cv)ŁĢQ9Å6ö’Ŗ1¹Ė6 "īūžĄÄėHBæĄ „oŖŠkkśQō”XöÜĘ>ŅYv0Ō·QäņEN źģ“aڵaŖ’ļŪØßXmg!Ē eøĒ¾dd'P™Ń””Ź9rłćEŗ +%ōń Y¬ČkĄ9wa§Ė ŗK{@{ą.:@„Żē`€ź3›é}Kē`&ö­‚/Ī,rń˜<_ 1!5ČEsѬn–‚Ö-Ŗŗ"Ēģ›;øÜLn·’[Ļøā”@±ė܄,"B0ł×«KÜøņW¬™ &ßĆn1/)„ Ė9’ŠķWKżWĢžŪ' ć?w­ō-Ūóže}Jés×£ŗ<~uIš”m_±’üG–‹}sg_Ń/]­ „ĀåKįģęo¬žÖ¢uŠOc‹LOk(}!»ųŠŅåW‰»n­y[ša+‹,ė‹Ż%mßåBÜ\ī‚’Õ$…#ې3°’²–rX¶,NĆ{3%m }ŸI”tńKJ\”Ļāe.ńI’ĖžĘę4©rg£­ÖgnąCž—źšż÷ų‹sü/łõ÷ųż/×5MLÅ_wś=+ÆøråK+×®]½ēŠU/ƚą‡\#–ä̾Z[c§¬šŠŻÜč’Ļ:ßA?ł3:üuż LT×0>QńõwW\yś®¼āŖÕk×bÉć½%›“”Ļ\Ēī’.ø“Īä臰ō+M9ržõ‡Žp»¼c'iÆ<0{ĮŠÖCM×ņ½Ž{č¾W3~Ū+0ķÉ;zmķļ üéĖpĶY˜ž{ˆZwgP—Õ%źKŅ)-ōA"ķˆ8Üā?;ēo=žß:æž™+›ŗŠūrŚŪŚ»äŚ»®üŚ3®»ī ¾ī, q혧­„/6ÄąNmGLßv $Ė(sK¹ ÜVī n?wۘ­‘ķq 9·––:ĆŁ“L•É4†Ł·cŲÕ.ƶ©PmiŅ)ƒ1£›Ø—Ų׎ųfŗĖ¢>jõ ”%ćęJ€[f&éѝ„µņ:ó .„ć~^ ä-v‡µøōbƒ€8ń¦•ūī¾yõ:“¼ižƒ+ē-{öXŒóVÜ·b“,6µœ~ąī}+7ɘŅp1łŖÕa·ä"ļ?¾”µcł†s—$ōWėņŽÖĒs7č/°…¬§łx«ˆxŅÆ†Čī˜ĆŌ¼½UšńCłāæ¾BLD?$}Ś„®hĞC”ooŸ3ŚoOÆZŗźŖ;Ņ«,Ęŋ–†Ué;f_˜8mUźŽĮö ōĮ^ƒœ³G¢®[š÷%gGé£8;¹Æ9Źdx–)ź2“łx;¢Eš‚$—Ó–ļ2A° >­ƒĆ·š‚~ \˜‹qIśE‰q÷.„²¬%āvd’2„ŒRé!Rś4g*SńHĆå āżŠOAPżžy]yķŠRdĻļA—Ę,®‘’µī*Ŗż,}s3cŚ7”ż‚|^ū…ö袺<ōkĄ5žKČė>Ę×N쯯fV™]e­(Ż‚FI ½¤å„/ŒłŻŅ‹W?øė¦sG’¹ćµ‡¼Œœ©tŪ-Jń‘ÓĪŪzp€7ō®Č­ź->ć ×Ēkį~„ĒnV“óz/]±¶›Ģ?÷»<—7\öé‡~·£ųˆb¶w+ä¬ĮC[/żgļŖÜŠ^2æ&^¬ÓĪĆøīļ^»āR,lÓ8y8Ŗ+=_’¶“cߍÓÆw$Ė,Ɖŗ ā$ßś! ŽĻē]Šö'„Ż¦ßĄåqøyn-_„”‹aĒŲķφæĘßČ>J”·ĪP Vq•ģsŗÅĀUŻęØ£CU_'ż³čŌvńŖÆ©…”ń×Ģś}»Ē*iŅ|\KŪćķīM宲¦żędNvĘdjAæOKpYŠŃ”5ǜå[Ā µsS„Ÿlå™Żźā»Õ7kĒņ“V»_fŁą.ŻąļpŰ1’‡‰!š÷*«ĒtXmLĒóŸ\WüīŚrWćvĄVAV_r¢‡dÓa)Ā>`…ē‘ź1¦«~g’ča—Į”™›LŸl<”N¦(¶)ɉlŅqŹAøę¢å[ūfΘYßrĻ0#ŖŚēŲ·ĀąYÉ.¢’ŚśśŚźk[#§×œ5kń¹óV̇ėÄ’ŅĒĮiÕJūŹ6 †ę…7o߮ީ­UĖ6ō­^ļĻ:•¹MN éĆk/3/!¹‡¢ĪäŖTĖ4omݬŁÉ™+v¬lĶÖvißŃĒĢźTłĖĻ9§é‘F³#6pv”vM%bĀøņUśBiś}˜ ӕI2ŗ‘VŖ½aŖ|¶ŹåŖś‚ Ć~˜śÓY]źĒ[²¹F%©$¦0ü“üƒļś½ķūo”cWß%ŠÉ*šWY;Ņk÷\:on_ß/ęo™{>%7yŪc‹–-^vÕ„Ėo›i3Pŗń<[Ą&F¦·ōĢ^œėœŽ¶d6@Šņz²cŸ›”é=ŖgläōO^ą†“ˆO“/Ų3š–ŗ®Ō¾šź; ]¹.Õ`•¦Gŗ×ž±eMgK»#źpĖ6¤¹Õp˹V²źÅ+ÖŸžX,ŁxƒUrŪ|ń%żŪ.:ųÄ®Ż]Ż»£V\ķ“Ž}>] ²™Gߚ3k­—[ŅڟÆ^:;Ōęw†¢žĪY‹?}ڦ{VĻžėŽįW+¼…Ä-rL’Ķ'7šTķ¦ļ^4Š:gÖĢ`ص­`÷²`šŪµŃc7”ēĘÉqJEfc¢’;¹‡tĖ Õ}wLšĆ’°b}'ė<–ķč1)ā*÷ų›:¬vSr—ɈT“¬b[īØ8µ1'o,ō” Ŗ ƒ„Õ_„ūp݉O•ģBØL氅ZŚ@Ā¢e+ %ū¢1/Ż)z¦x Cl›ö*iv;ęĢ8_p:E‰¾żxÓ¦@põ÷¾×Յ?žw„āƒ%’ Ėū‹ Ķ‹Y34Æó…»Yd`“6Źņu}Æø±B%ć=ä*ų杫į«nŁ©mfJāUŌX.«č"ģ‰˜Nų!"ÓĆSĆLĢL…nņž‰æk?üƒćw¢.Õ2'xJ”RJ6Ē'Ģ!«j@Ā£jyAķ­Žū¤dtły‚Č"淿ļBa”³y­F€ KŠo“zmŌ¶Ø!ći« c!¾‚®Č?†Ć,©ŲC %ķ©J3ÄS}Yż¢ōõK„¤ßĪK—tE½¼ä„včķŽDoā~zɶ٪qŗkk÷•ĻnŁżū;.ųĘuė[–  ÄL$Gņ§G>q䥶ī%VCĢ›éčY]{ŽCxI+[ń\Īų“Į3†æ’˜yąŻC—žąŚYC×쟻åĮ 9(·K^W÷ŗOüę3{?÷ΚīČ®3žosļGq÷ļĢ–ė{w»×Oŗ^TO–Nw§®Sqor·±±…ml¹€;¶16‡m06Ķ0¦Ń«LIœä’@BBاzęt™Q³œ±įÕnząĄŚ6\9K¬¾}žm¹Ķų ¾Ä% Išā…¾ĒĆM ü_sļŲ9¹¹×åŻ«n÷°j¾Ęh;}ėīĖühA›oŪw}צ9“ź„å+o•„GŖ8¶ÄŠÖ5Qj5–m—‡źX]*Ą)ˆ­•\”•ŁX9RO2 aBžūįh{Få•e„ÅӋ„pxæZŚæģ§ķœ #Wo¬F»Z%żįƛW?ģ ™?Zp^tIrœuõ¹Żk;<ōm—jĀ5=Ó{j"Ż]‘X=gPiŲ¤©‡Žšv÷\śÓś¦RĶ!ļ¦Åµ]>2>­Ļč³¼a0E1|÷"¶ŻŽŽÆÜŁ8g` ®’Šģ=Wø2žķMžŪ½iņų†VW Ł:aė‘ė#œšåÕÉéĖö<öŠö~ģ!DrĪńQČóEU‹ęą hŽhŒ(±‚ß6&źī€tcÖe»ĒiÆĀĆėČuĻø^Ņj˜Ž@öÉĪŗh'āHśĆMĆMDÆW©ķʀXk¬ēŒŽųĄĘ¹ń‰[ö$[×-Mģš¶Æė>w•u\rIō¼ūĄ‰&ΈtwG¼±d2ę½ś˜ō?­;w-m zRwß8-ÉpjXįŗé­]µ”YŸk„‰ę°7`GĶ£õ14-mė]×ī²Ē–Ņw“Ų3ūPŻĄĄœĘ°sfķŻ §l™ŠŚp4DŚ'®h¼xŸ©nü=ķS’ēÖ[įœn­ÕąT²Ļßxõ;nS.Üjyż*ĘŠ¢«!«dBēŖ°ĘqŠR‰Į¾D­Š€Ö[FytĆa@foćØŁs¼¦6ß8½J‡u®UÓ÷Ż3½JŽĄŖµGO„š˜Ä¤Ž~rü‹hcō8ÕŅū‚&ičż«_2cĘ%‡åT)|ƒD~édŪ(”Å?`ŠŚŅå¢nĘ*C‰R#Š&EBģDŸCöEsøähIMŃIł^™’\&Ą )Ć!qŅ€ų‘ˆ²ćæ|o’JAŒ!¢Ė³ gį°Ö£š &Yœ˜ć˜NĮ$STfģŠ `’”Y~ēÉ>”}īČXrŠŠz‰ŸhsdŽ–;a&%²dR°_¦ĻĖLźŌ Nō0ż§R% XvM32>ž³“U…’vŁĘ”’fū}QKŒŃ†ä9čqg}w#2ŹŽKSŁ2žåŻŃ„Ļ-Ä&;0BraÕn±2Vl…Ä/ Ēšf”‚gŖ! ^ w–ŅJ6"Ō4ƒµš'^ zŃÄę‡Į¤ęźå“„+—Ø»ŖŪćV$ŗÄŪ«»Ō‹„‡}ΙΦ»–Ń-ĆļOG}čŸ+ŖźźėėŖvż1 ęĻ<•N%uåA”×)’ŪŖnčœ1°”¼ó'ŠXæžÄVg7,²Ū2ö­$Öā‹…ńĪCššż$dœ+= –Õsįģ•«ļ_É\'=3k~ē<³Fz-‰ĄdhŖšøŗó‘×č놽ōŸ@ĆäåĖ'O9ļ¼įw2/BaĶöńQW4ópųlÜøĆžqMī?äh$ņķ„CJ Š5’xh•GVE‰ ƒ2Žŗųé½Ū•~u(ŖõÅä7·üšŠ¬Y‡~8°ü© ‹¬{×ń†ŪAŁ+t™ō¢ōŽ+_æ_mWRAõ²”ü5t×ÄīCEVĖĪßpń+،§ĶÜßŲßb\,ļ`]ģźāpš0›=×ĮŠj֚ķBślVÆĘ3$|… c|Ž^ķ߂ėńM”źÓŌ¾‚‡fĘĄ(é2Ś©q]E™4P¦RY4.ŚRŒj#g‚<–Œ•#é@Uc Žŗ`,ø>ŲjX гxhāP"ƒ:„nŠXT*¢EŌ”¬4N”©en†č1čY£“¢R‘tĻiŖÕ%Låń@dßjĢh‹­>S qŚyAWŒGŽˆ'¾0˜_9P’"ē- Ł&fl”Į” c ¼łņ|ĪŁQœß¶Ō`ź»õÉP—“+|fÓ]uč’ś æx FÜėĮ“Ļ®2ŅĢRFß ö8jy§CŚĖNo›~Ø¢ozŪf^NńŁl“Ó„„S,/pOćL®żLz*7.Čø`<’QHˆEr!†ĶWÄeÄü@Üb €aŹ`$b²ž& Hw¼~ŻŽN[äŲ®źęńķæ+^Ģ*Ācõ¶Q@bŸŪĮąv&uÕG7¾4„”ń¬Īõ!NyÕG@ųčp1³q l±Ē@ų‘G ś4&¢±meq-ņuh į·š ˆ ą›±hL/’^‘žyĒŚžóü¾²šŲŒ©·õwd¾ƒ1Nž©młV ×2©ļ­š}¬©i®It«łļżś{üč,° §¾:;bĆ®Æ£ńœ¦čKŠę•mŌ²q&!²²į&€F :ˆ>yz› É¼§+gŌF#ó‚“–Q :ż%c3€I¢ƒ}\­dDśW&Ū©]vȖčŠóFo£›yĮnTŖ„śå°˜§dŽH]1ZzĶŃRĀč1Ļ£¶$ŃG5G³H‡ Ŗ©B]ģ—(¢­óhZ#”I€cE?Äč‚MÅaét.õGÓҹ{ńŁō“ĘtSA6I£•žLjQV.ʹ’cc¼AÖĄā%%—3“aO;PrH&3ē NįY›Ė€9äSģčŌ±×Ž…C3VĪšvŠ^Q§ŃÖ/léŻQ­03£ åźķWn'‡‚‘īčmYXÆÕčDPKó~t5Š ŻēŖŖ¦ »E?Ÿ99pģŲafĢh€½šNTG"SŚŌĪhäź¶)Åū‘ˆZŌ±š`¼²ļ†?‚šå.ĒB)“·9))’ hmę•ķLŽQŠ$o>&¼}$ ±lŠH²Å6 )…™$3DÓ ÓØØ–Ž‚TĮÕTĮ =³Ļ)lꃥ“dzĶ\€ŅĻːw>(›0°ŁI§GóA^®$¼5Ŗ‚ZBģ¶$L]¶«ā`L4„ćų2±\Z£q¢ H˜°÷_gƚI ys¹?ģk#K‡D‡ø¾—«aÅŌĮń:°a|ÆŗRŅ½§K”mojumkSg·×ź:#¦¾„}¦H§®ÖnÆcŚZkW/ŗž™=sż"šh„# (7Ļ“ĘI—̬­yɤógjj4·\ż-h3óüŪ6ÕOŪŅP:ĮĘr«-ŅPÓŲXÓ±YĖń¹xYƖiõ›n[ńȦ®®Mń_ĘĒux¢Ā/ŲĶdĪKāJb(ĀĪ ßeˆ5Ż×ƒ¢N«•~¢R$”µģĒč óėA‚DÜ/#]‚~T ōOŅavČ$F±”7hIŌīyŲŹn!įQŠ‘X漂u,gēĆd†ģ7ŲÜYJą‡HĘC˜8³g.SÜ%žź‹°%žv@·N\¶öhåŽ`?/€~b$lƒØZĖ“oūüŽ·.Ż› ę±ĆG×Nėpæ>ŗŒaāŌ-ć]ä}”£Y„‰3–?µĀ]ź¢Ā~Cy\”^«å‰“1č„ĻPČ<ń j!Õ_°v±y?:¾Rz ƒąHOOuüõęŃĀd8q 7b’T“wz‘ĶąLHviŃ[z--6nœŲlß&ģ·Æ=źiźkņL˜F¶ć[`ŌŹŽ– FJg]\~OĢū»w:“³wĻŃ-‹õ½/™V¶÷mÜŲ×¾ŅōR‡{`ĄŻ‘<ŗvQyžø«ŹaüĀQļvŸŗĖŻX%źo9ŗ‡žmÖŁ%Ć.·Åō‚¤—@Ė£‰ń0©J–•˜Äȁބ'.Ē)}™üöpH²Y¾B$‰†|HĒÄfāśŽ·CNmló㐯ū$Pžt{ń¾æĶØę”·ļŧš'¢Ö”e‡ŒdĒr³“ķĪwß½sæé·‡ D‡+€¤8Aŗh6č ą‚˜ĖģšoMūÉÉ«ĢĖ;PÓdyIe›3^Ķeæ1¶įŽÖNѼ›Xē=šó“ Ņ$38L„d÷0Hķ_’D'™ Ūæ„Fū§¼%{… §—ģg©ż²,™—«-‰–ūÖ1rtņ¬”qg ‡“åĮdVž÷‘·K*¼rGG“ŗ„–KmģK&ūžõ™‚:ŗöµöØ"łīÉżK0ź&V¼ÜIÜ(„2iōhF…ś‘·ĀģaŒöZŖ[–ł[¹‘nb‘ń[Fī³ł”žb^؉̈́ yb1DŽź”Čy44œÜ]Łt&…>…į/pǧ5čć€2lm?qN,Ż’įņ€hĦ=ūO†ä]6Ē„WAÕe±yGrc„†ŻüĢīÅ,®a0†&RŹ»L‰&·?Œę\2æcĢj­ō m9žÕOÉÄ)ģ£ŠTVśó¦°Ļó{™#4…§y)U®ĶZµ40œ*ņOx‘Lģ¦"ĢüŃv³Ē©SÆR¢>E‘øA-hĶ™+9fKŽƒcpdÓõą’Ļī?[śŅśā7nĢy–ŽĀjĀh¦y±«€NöOķÓg8ś’bzx†ó#Ė R§Røn8‹*fžŹ×ō£+^t.ó1Nžć’`BéßX²ÆoĄ€¤C²@V䶌5ŠßšĶā(ä ā³(QĪ\˜ck-öµL˶(L»‘³IįAĀō÷Kü0KŹõmųcĒ*—”–Ė––Ÿ%—*YZ2™@6)—nä °„¼–šN’ƒ‰")®ÆPõ `fĢņń2c„[Ō j‡ZŠØÕą “Ó VKŪĮAphĢÓĒÉ9ƒ~ä$Ū„ķź±OĖ\nØ\’‘+UšćQå(×Q¹Ę8 ēą‡ĖłDO ™‚7P¹Ę: §Ėe%GĮĮl‰#ź±OćrM§®a¢Ģœķ„*r2¬'cœd¢g«õˆÓ**~>øhĢӔ\®ćØ\[ŠŪ«„^ė$*׫;Ęix|ōĖE)pĮĘ8Ē"Ōæąņq©rģĪ…Ž„:R6õˆ~C+¦;Mmģ“R}±ÉžĢfɵG›*†ś6Ņ©3\€I|zcLcS?™śŽ®EĀÆœ|ŒóԘåęaŃ2Ézdž.¦Fśę45Ŗ`ū@ —ū ˜t&YZb@J|†óTmšRQFŹž·¤wMsVišŽ<Ć6Prœ‹•ŸĶkm›;·­²²üoK÷/]ŗŸ¹°{Iw÷’ \}dõź#0!ó& ’ĒHŽ1wīŽ¹Ņ_d ½ß“4ó ¾©›^„oZŻOā*†? ¬“ą2Ņ{Gś|hdŃ\ÆäJW²~›EoG.0Ń." vŠŻŁź‘žSfcŌ#¢ŃšRZÆUh z#Ėś;–oŗå¶å˜W¢D¼fD8üåŻ10xæōg…Ļ”2šō*?כ8pŪ¼ø[‹ć‘I2üƒŃ^„ ®ČcĪRä;«§ā‘Ÿ¾h$L~EūV5Ėeż1%-š<ć÷E˜pβ%ė½±Zœ˜æ`ŹŽ>·ŻŽą-łŻē]TyėÄG'«¾čPrł‘+f?8ūŠ#Ė“Cķ”7üäč’©]¹ÖŪq„3ŗžŽu7Ü}ćž5÷®‹:Æ}s{{ēŽü¹dǃfĘüąŽ…ū¦Öņ|ķŌ}@łź%Ó7¶łUœXٱ²k×kß9{įÖU3ēś=³g¬Śŗ`ÖąČļȊßBvœĆ_É7޶2Zzg’ó1&¦EŹ4ɵd~PŹŅ$senc1WfGFµ0÷ń 7VZ0“Pe lNÅå"o«…ū"v*]±Ų!ż^ˆ1Ɋ%vN]…u£2#.4 j³ĶéwÕGzN„óåF+¹tü‹žėÆvK7Ł ž7Xgyj°P•G@klü=-ŅM±ń…Ź,¬ĻcL1—›¬P—”<}1”x–9ŽN‘ue²°Ä”wS¹÷€Ū:µļÜL³ĘĀō¹ū`’ØÄxWŚ,æ•Lń Įé÷,{ŽÉ©²T‚”Kb}čAü|¹“§øpƒDĶM”Ż )hīĮĆżE%/āor™Yžų2*@5ö&bNXĻĄJĮ)CzxhpA4k Ťņ%ż*Ø“9ģuJūŲ•ćl’Zö+’yŹĄŌU|, üČ*“ĢĒ¼_2¢—wŽxćN”ʦoŊ>‡ĶP^-":ĖHų¶U…lŠTW2Ž]7 w”}°÷ zžŗ)m ć²µŖ³;lJ\W)ńļÕ-jÆ3äŖ„DŁ ŖBÕ’¶nćQ=r>™øCū*„BŽ Y«Ć”C ż{5‘ ¤ąÄæUų¬ŒŒ6rdJĻ·Ó.1%¾nå÷…żœ ām “Ÿų/ȑ1¹]˜ĢV&»‘Ž|3}äķ#é7„7AĶ›tźMuŽ]MŖ“õv{SZ(½™Jš Ą¬óś¼N Ļk~ō%·R©9Ō2jµŚG“Ö÷PO’± Õ }ŗØ‰¢żpŃ>JƒŽŚGµž9ĶYϟiŸ-Ž7ę÷cųXƒŁ ¤ żō/e2 Ł#†2 #a›ī7dņ×ÉŒ}˜ŪJTöø°EŁnÄ7ü ‰(Sc’"˜ŖYl$)>+śĶ|6ź”4ĘAväMöŸ4HŅpœ2¦³&¢ńÆ<'³zN UEĶĒ’nĪOJa$qC”˜S³VÓ\%vŗeņ(# āœ‹,Deꔃ³;W>øōųū_œLœ·"‘(«iŽqź9ĖżØo±iæZńū›N(KNŲŲ²Jśb™^0\{śÅęcņüf$e*F©&-&šŃ1ł\Ą0āc®KS©†ć„««¶C§cĄ6y^3fŽ­Åc¼_n62V«‘w2cW®'šʌ±—€9c„+„ńM °”‰§³`v],IdFO@Ė‚t$/]Ź+ĆŅQät¾źX§4q“Vߔ|뮑iĄm'?Ÿ€Qx²ėģ?^ڌ£"¦·Ü¼{w“Ö”pų¾‰3u§JŅI_—żäø,÷ĆÓǹ=섦*PjQŪÓF+K‡U@$XæAĀ'…٤ā˜L ­fDÖ˜»nļvŻŁ :Ś“ą 馳¬Åj“JR'ŚXŲłŅ”üó]Sy™ł]šĻZö|ŻØnŻĆķīĮŠn“¾#i½AķGiƒ^ĢCåI(0 U„Ō$³±ģ ą!+~ł|V^ž7ÖĄ”Ž©95hyßX“ŻÄW&ŗ¦U…äŠFnaž%›Iä·æq‘]z÷ŅPuEĒx‡}Q#Vz Stca_Ņ;ÜF{°ŖmfödN÷õ <å BTu.µ†Ś†$‘ģ[ĪŖm-&«ģ LœBE#›Ųc64*ąHˆ&²Š<Ŗ’(BE¼Š­ą Y€¢¬Y¬ŻĶ?q† ˆŸšŃ£ęĆ„²ŠLŅ'Ÿ™Q‘ę_Dn¾k^#SrQEYŽ7āaņ˜Š>”a¢nĖ­X‹<šˆĘŸ%Ž’Yq2Ÿ‚„ąÅμi’hl䓹ĆkĀ• t¤7ļŃŚpn{Wµ’NŠźīÕ±ŹA0®ļī½³-wƒ NŠ/mmsZ¬sķFwP¬sƒßŁRW•,·ŸcPīV»t@Ż1psNwń7ķĀedš|\:”r—ēĪ:ą ūbFŒŸ‚…[ܞ f'ōS˜ŒĒŒµÆ‡E&YB‹‚E3+'×ö/ō‹Ęwé@¤}®æŅæ~Ö܋\AW$Ų·ģØ*ØŅ”;H]ÖŒ óĶė[RĶmO~PXŲü5µ–ęś¾źŁ‹ĮÓ³š„KĀĒĀ,5Ō±ę`oķ䬙‹Ļ®ī«o¶ŌÖųm†*¹5[’ę˜«äiYYŒInĄ(łž(…9O`OšCž‰ŠŠņd÷ń,ą!³€Ē¤¤ßżŽ@Tfu €śō;¬2 œhē4uRśź$ö?¦“©w¤ēlūeGÓż60ńyˆ±= ‚Ņ*‰Śņä~ˆ±w1’e¶ß<›£ óÅQ9Š@½Ø£*VćaXLA äżł8D…Y#Ż|r"ŽŽśēHyGÕg÷…ég«ÕĢd+]œ¹įäžU÷Į™ēÆŽ W ]ŅĶ©ż'Åžh¶"ŽUÕõJjt§g·(\Ƌņ~ā2•Oö Aß„h4ń,!ĶćŌ3I)¹}éßŅ=+nŻ3hĖ“†Ųž­WōČB0 S§®ėœņ,żD†š’оKfOv(8Nį˜<ū’}Ķ—ĀB ;ďĒC«×č –x‹Œ>.‰˜Ź wÅX4™|>æ‚ś‘¦ ū˜üäkĀ^™ZŚ å :ƒ$¶4š€"ÓķĻ8ELz,ޤ"L„ņļ4Ņn4‘s‡¬7­ą_ĢB~#8ŌKęóŹ•;Ć8ŁĻĒååĽčb@ Aٳž¾_«Ō2“”Ōš§© ×Ė“ŻīžÖŪMŒ±Ā ³µ¬ŲŌµ¦É¾t’RDx HÓ ŗ‹•ßyæ”6Ø  šUÖ'¶ “©‰ö¬}ȵ”®uŠWéWhljĻŌ®ńBU ®•×­`?PØpݧ=œlĒ­-bó5a‰•ę¬Œī„–ł=\žD<€uƒD8¶›æ7k³ ņRJ”Ņj’:vžōßŅG4Ē«’FķŚvõ÷sĖ›YJ©I7=Ł×/]nP1*üŅLĄ>ؒ¢ ¤xhŚ<ė׊y®§G /'hÆ—“Ŗń¾—öŒSÅ=zRzķƒŚD-–^–^’µōŚĖŅkĄĄl¹cį|zÓšuō,3ZšjÕp’N'YꢭEv[<ąPĮD¼­Ŗr<‰Ę)6•Ń׬EéeÅUx×"Šąēb#¼¢D“y ¾ ¢(]£ˆļh‘Ćߜ{_~>zt8KV`Ue‰ŠŸ_F“³CŁ‚Øō2)=”ōłøTøhr1_Féšg{>HÄsŃ>2=‚ŖäłĢ5Eµ •„ ä(-,ųĶhŒ’1Ś€4æ*ׄļ vT½ä—PŖNž˜4Bé ƒŪĒhƒ$‰1āU,H ^…įŠü"Eoxi6Ȭ5 _]WZ^x^÷ø¬eĄź†Ģ%z©‰M„2?Źü”~äń̇ļÅbWK®+ ēxėėåwßMśÆöt’ūŸ,¾ WEƂEłŠŽ„ˆģ»Ņ?‡ßĪL˜*ĖĮżążŽS“Z˜ēB§&”įķ%é  +oøė.0Tž8ŪV…Ģē2Æč[•Ē”:Ą”V Ā(vkŃR¹hŃiŽę¼Œ ‘2¦ÓņØ“Ź¤dtźs·K›¤FiÓösU<£4”³ß¢TźWö|q“,\·L8śęŃ -ņĮM_ō¬Ō+•ŠĻ Ģūdl”-JØ:÷ŗøī\”/šDĆŹÅ»Mš‘Öļńm›€½G'lóŻCNdvšv/^iM‚üż¹Į?ʾ…ż_Q§É.tb2ū1ć)¼y²’A–ś­`R$8ŃIĀķö.9~ŗ”¦FŲ°äu=‘V (Č!g°x(•ż;“D†7–lģ8O"J¢ņō,†ų” g|čxßēęo­Éģ9«5‡čPČž¢ vĮ³ųšņ=O5UvJcŁ±÷iOno̟¼}0ßF•Ćx–ćārŒõ eæk·gIA9©¶Zē}…0™)± ž @dŒ€fų ē-Œ _́ ekš°NzöŽdŌŻś¶ŗ”Ī.eW}÷ÆŅ»·ņ*µ ū5Xņŗ‚\Pk€»Ų“TF4š}&é€ ]€ęķ[uF“īVąžėwW±@­&gÆK÷žZ'ØUōĖ„ž„»³„… 儸‰¬%F1h|»¤¹½Į`ŌbUČÜ,L@RÄ`&•*ō.ć§cÜK쯈,‡Ž„Š-Ģx–ÕĄqŌ¶ŠpN&Ś/«Å„ m™ē„ēĮø Ș—&sŪk…8}Õš¶ąŗąž¦ƒM»ƒAś*t°ģ 2mŅóŒĆ‹ļjÄ©ń]ų~xŻšÖ ŗip#J·.H ¢›ŠĮīąŗķ"ÆõKC¶Ēšż•ŒéԘ޾²Ja¤w/=‚;¶n ĀY|°Rr˜hyhåÆą—*ꖅCy½Ō@Øgå”ōŽbšY4N¢Ń_³—ReŲ/½€ģ±÷¼æ@³L-T¤q ›Y©ŌŖ ™®Œ:Š+wŅ÷±–T0éÓ˜ Ż e±H)™ĖŒžAįŽ&ęō5Y×KL+iō 1īĮīr銀SJ£L„“ƈ)„yĶ N„b)‘¾kŠGBł‚”;„)Mš7‰#e@‘,ĀY`Ōgx®ŹĪīµ’‘°L“Ŗų-~ Wee”FN|«H_Qü> ć>‡FvsöZŲ‰ŸĄKöSŃF%ŗŅö)¼ńXcS?xƒ7Jļu¼ųŅ)葆2CtjIYٱ²¾²%ppóķ£Ēū›Ą÷uų^‡oÉ$” oS‚żKŠĒŹŹ–ōŸé»·c䬗‡‚sēŲ¤@V Œéåī!Ō™冀–Ć‚S« —tū~€įŹrœŽ“J'²FXU\’B9‚8V\•tʁgeE"†˜(Z>*-ż1čG/eŠ®ŲžÓ}ē5yÕØõ ĪB׬^ųÓ#Ü­“«/ÕØbĖK§żFą÷éDéņ2ą5 OSōhż°\ę²Ļ‹˜Ų “_YĒÉšĶXßJ‡#JlœĖėš0z¶Y¦Q ­Dæń‹;ž€NģŽÕ×kgśÕ ƒ^7ķ gķrūćįŚuŻ•»ńł;DŻ^h^×Ó&pFķ,„ž×ŃÖDĒ‚Ŗe;ŒUĮ©‘ŗXSb|Š–ŻņŽćq܏«jj£6ō¬j5p…C9fYƒÆŅj6~gMesė”ŹCƹžĀāOp>o•LGō€VӂæÜ:æ×QvśEĮd­ ut-̾³½čuädp(,YÖč0Ī;['ņL('‡G½¹U¢ÅŠ­3{žAė›?¼Ziž™A%½‚±N6īæĖ"Ķ#:µ;š’ćz\4š|­3>‚VƒU«xįšS¦ļI·A 6üZ„»T'Ο-ščĀ&Qw9N‹vŪēŌ‰„³žņś³$Y˜–|w“EŽŒ¾–Æ"ŁGćj4×ĶĢ…gāąāGQ§ 1Ą#o’Sś±R©~*Ŗ#ՕŠ+Ķ?6ŖUJéæ!}īĄ'oQUĄ_­ē ü€N„ŻƒA„ŲĮ½¢7f~(źxažØ[Ķ ŅÓ:Ķ6īÓ’Mōjӏ9ŒĄ+ó˜é‚§C•š–6u>¢·;<‚7 urj’É!h“Ēf7/®«bŹ”ŒE9‘UkÖķnńF]a‹UNSÄ …ŒnCDŽ%m)5bxģ÷`E8ZõŻ͚R]+P·3}OgciŌźœöŠŚŽ©K6w <ń ÄčÕÄ ‡‡ĖĻsējļ•’Ņ"IŹŽFņ QżEæh1YćbĀkõFĆ~|-°äņś“&½‘öÓ2c9N c-{ē^qÄÖ¢ óŹ ¶żĆYwNlõKo{Ą]Wł'€;gÜ= Łą•~CpćßŗWa»Ó¦ø’õŠVc„ƒÆįj<ī½o.XÄŖÕ†ƒö°ś<…mM±\p.ė8hP«ŁÅp’ė}O¢–›ŖŃҜĮĢr¦R© Z¦Ko”tźx*åA ”9f³ĮōĖ«į‘će­5XØ×imŅ10`“µ:½ō`6^;7¦˜P;F©I¤Y0įĻ(Ģž˜/lö}čM Ė łŲįŃŚˆEĶń(śqŃtc„ń€×† itpĢuĀMŪ¶źŃ[/}k_Õ­Ā$ńE÷†„Sė¦mx3é½uvÅ­3/hŻU3±maĆL„²%Ō[ß©w‰큶†ÉÕ] ¶Õ×]Ó tźéieGƚø~B…9} S§Į3Qpwļ½  æVø[ĻĖÜh Ųµ”4«58|š•7źµŖ9¤—ŃŌ£ä­īH‘Ā(Ē®ŽˆdGŠ‹‘µ(›ŁĄ\,å=»45ŠŌšPC£j„@Fß ½Ų ˁylzģYrVĢł3=ūĢp `ģR ę—p€/ģ^x†¢¢²śNSÜn£ęØnj6j‡(¦šņ+ŠdģŖÜ’K!ČJŒÅÄińN€)1°· fÅH`1ć„13^„żŠ(ފQ‘y໓“˜Z‘É|¦–~‚=*¤4ÖŽ„ɁŻcz3Ļ‚MZ&įÓ ģ€ é:NÆįUęÆŽ†¦Öż£nŖōī„÷ļ~Ÿų}1Ÿö”+œeMl?®ė׃Āå=•Šō–æ,Ź|¢4Āķōek×>¼v-<šY+Ū‹Šė݈ė,Ō›=c½AIĶčol‡oQļ;FŌNC«Ń~FwĪŌhl†Ņ£šk¦Æ¹¼>ź4›Ńśr󉞎ĆiPīąĖb„Š_ļh0 ńE£L&ģ‘®ÆØ-3„€OśÜõn`Ūp¤Ń\UßUQe~ZUĪ[„А³õ²Vg(TÖ2­+źZ³†nŗ=½½1CwNM+«×³­5 Ž?1·ŗ ļ·UĻ„[AÅĻ~f]b]ų厽-å”Py Ł8ŪĄfé/n“ƒō‡ ą¬Ź‘z_ōu ńņ/h¼,ōÅŌ j7uŗzœ¬21²#z×,z‚QŒAlŒzĒx-¹—C½#F^^0ę'¦DG½ŲfLņ”ĆĀØ¬ą<¤‹`˜uŌ+<¤‡€(rĒŽQ1×÷ä~†ū^pŒJæ¶Z,Ö0˜}Ī9Ć-ė¤׬žE‹\N‹”ŚČø88®2ĘŖ-Ŗ7ŖĄģÅhX‹<é ÷ō†ĖŹĆć'”Ģ ĪŸ_uš [žĶ8žmY¤s żÖgąūdŲ±jēJ¾.X¶v"xŗ,8¾'TVź,3Ē":åb@ NüGŌZz#‘Ž£K—f~>‘®Ø2Ó°^ŚYo ¶/}a²£)ž»Ģšq‰„sŽ.ŖŒ_°zf0 Ī<Ž61§SE’ōńćߘYšįÖÖ>ĪlęśZ7~‚÷&“ķ3¼“Iś;ŠO9“z®ōÆ ĻBw‡śļÙ̖t‰Ž - I×{”„ģ–ż.1ó?)#,N^'Ćpn!Œ5Éęœ"Ä> 穿t†>5›ŌīŅjTÖO+ōÆ4šĢg O£V[>­²IĒģįæ[čóiJć¹Š+ŌėkĮJƒyų¹ÅdŌ×Ā =ōµµŽ <6‰„_#Ćb¶:˜iΊõ @Ī Gń0@bøu”ĮfŁż¬ T(w?ÆR) ϹE:”0žĄ%Jē£e“Éó¬ PŖ¤ap‹ņ#Ū4xǧŃ ¤ūy^ giż™0”¼~“poų†+GćQ2<Įó FšDAĄ$“±Ź}s£€BoĘ ¶.‰rū¼^ƒŽÄC ŗ ^oX;ńĆ{ž8q×Ćģ1½7{¼xŠ$M‚ʤB‚R ’GÓėļ뚼Ri·+WNīŗożČCJĘ ćŅģ!bSŬŲnōi3f`+bh=ž%Ģ*-ZL"=,YŲɂ֬ÖĄ|Ą‚Ģ,0_¤ĒŲ˜-Y„‡ĄšWé1I Ū„W„?ƒNé½õŅž/ø¾”a=é=ę·ŅŸ„×/}.ż]ś (§÷H?‘>ćoÅī!¾zś|iüŲŪ—£Āģ cROÆQA‘E@”‚ 4=˜i§Ÿ§nōƒōąšoaZ—éœ  gęż ž7=s'8®½DŚ»wŽ“óĄĶąf°8ÓćGåŹ…kvķo0]ćw0µö€ōމԄ'N\šÆW”?V^A~Ū:ėŌ”Y[·Īb.šµõBxegļž·.śtogf‡ĆļO~õųć_=oøÆ¬²²ģ>tÓĒ…ä[‹¾=Į(›<ĶE‹J*¹ƒ[/yā’Kž€OMŽoJīŁĆāsŁÅß%D³ęk½lT¢ ļ·)ź—Ņ…0¾TŠI±„P N•¢>‘^‚Of¦‚ś±āƒūŲĖŲ{œŽ£{0[°paēGKGč“AŸˆ$±‹¤OģȤ0‘Ä"ŽŖPø 1Ā8‘#AtšĮW0G"Ąb? ŗN¹-./ &'6š?_Ž9•fnX²ųā÷L“jź„w¤«#IĮµ$ŃöŽŪ±%ó•z]M`ž«/¬ŽLœ4Ł=œš'˜2s†ŽylMµwXŗõ«#z³ŽU@•ßģPŃ徦€k÷I° TŽÖfš¾ĪićģŁFAŪj\·¹¦lēųÅ)„ņ¼ŲéW)ėźjŸ£ĢÆR”—)•žaĮq~ĻdÓø:ŚØ4łbžžē Ŗoä|Mō³H6Wc™qOȹQ[^élT5¼øėŃIŽZ—KƉĮ‘i¦ĀÓ*æ+%E[ŠZ—°‡et—ž€ŹX½ń·Ņß÷/ UG„%Ą%'čÖ< č6·›*FXÖn­ŽXLkk¼½ūBķ’žś…&÷lŠbvp¬ÉÄ)ģ&Ѧ@;«°ghEŲά]ĖiomšåŒ¬»ÖĀ_Ä, o§SėӛƹzÆžU€m4ł4}¦²Å:SČ 4 ”d|Ԍl ö ‹Ź3S–ŠÓ<‚]Ó#ÜpąŠ? éüF^n裶eÕ“éżkfĶhk1[^œL†ĆlJŗäļŅEW‚V÷“ĻĒE§½!ÆƒĪß¹ā‰é3ĘĄš ƲO‰61æĢėiŽM ŌQvŹ ēGƒåj ¤OīՔ—׏ė½Ōh¬Ŗnļ˜ŃÓŃ >,nŅKO4Ye® |ųĻin®Ŗ°Ž#­ŸQ]šL¼ŽaGµ }: 3ń—„,c/”įt·ZĒ«„;tJ•)‹ˆI)„Vƒ”Aā }*ē÷AĮ ›&>ø²oIę9‘Ż‚™|>fƒ,ʃ:FO'kf(d(s)eČņoZAŃ’g©?‡Óo•B.AI”ąŠČg,ēI ²|`4—Īę)ŪŽG"ücęŸ4.BI©ą>Ōßį•ÅU@ ”÷™ß„Ś3D¢³Ż Ē~ cYéæg²Ā’9^AŽW&*“š,ģ¦šÜĖRõ‹ēwµĻš=vÓ ›6>:iĶ€ÆvłŖ‰Ū—66Īōw’Ž-wuĘćĮzź”'fī®Ż»Ÿ÷x¼>tĄ~žŽ‘Ć.—Ļ×HöD—nŗäēĢÅķS§vĘ wÓśu•“f“ży4šÓ52«uŠH§²[ųpf>žćRĆŪ°ū2Ū–ĀZųߙ `,³}ų“Żš&śĀį÷į²=cé²{ˆ?d’ü¦£5E5ÄɼÅd·¬<»É\†ē$ŽķxyIóabĒƐŲ{›ŗ±«ąV/$ū4XĄ;«Õc'=‹Ē:|ŖŖ­u~[33Y;µm~Ū”¶źŖ60%’„­K ÆH­ŸØŠź“–½¹l’B§U€£ųz[UuSnÅłČ’^m«’fW·µUƒĒŖŚÄĢŖHņĻųčĻņo2o7%^Ų¶ķ…Ä>‚ÓگåŗĢM¹»Ŗ[[ŃüŖAmń/Ā ¢§|@L źĮDš)Į9ńcŚ©+R J-×;č6BsjÄŹ Ęj tĖd ųź <ų£Ł –ćč4g5ł#Ø£«!ó4įQLA‚”¬ Ž•’©—Ęs§ ó° Ł#$ĻhZÅ<֐`ń ³VœĀ‚“ą÷ œ,ń’›]ŠGšŹŃĶ$¾gFl¬q<5E;|Ėc¶XZjā1ņ nD¢G†>S'hÄKD?–'č‘œACø . €)4gRštXnœ?n"ˆĒHQn.ZaĀyāb-Ń}…šE¢õBµNȳf”@Ģ(²i-ų!4ɵnŌlĘŁvv±šfŠaEv £WŪ”“tư4­PpŒ‘HĻK0H¼Eb® اųmŽ^MŲ­•YŠéļ³[ʤ ė[9%g±ĖŌÉF»Å°NŖJ; |eĪrTF…šc4 #&›Ń€E„ «ę-j§„.«œV„ai•Ö4YUć°ĒÕģUʐĻė“č ä8BG—ĶŒ[ĢUøŹu‚u¦Niö0cX&a+Ӄ*ķv)«ųH˜Ńq€6©#;.Ʊj“=’3ÓVŠ¢€ž™»h §‚“š¦54øŖŒ«b9HóU‚Jó”ZKó yFŁÄźh½JÅŅØ!Ć(y%0š0a²@…Ķt„””eeĘU!ĮŖö¹ję‹ÓL5Ѳņ{“b2PmcÕ>Šš­ęē]6sĢõ©tŌ² šŃ“Ļt™ß¶²ĖZ]M &õĪq½µ |‚K” ZB¦ y-ūĀ]±µęń,’V$é‘¢Q;qŸąT<“„ƒIT7SŃŚ>96Nöx½4x½ĆądĪ"ąPU€žÖč8i6PYV©†Ą ¦•ųuCéVĮ¦·; åjŸ¢šw”ÉŌy÷Ö ČŌ^ ·¹-č˜ķ XĢ]>%ķ ”ŠŻvQÆ`’¬«Ā¬¢•{ō*šQ4wŠģÖ×ø!­QrŃāUFĻk­€w°J«^ hUFĻ”’Šœ›$•2ŒŽ €Ö źUŒ ²,ĆŃ Ą·9“š·ŠVŲ;Ēõ–s6 «”6³»³¬Ll׳Zc= ŅG*h}k}ÄÖ«4(!«R4ō“BJ.bļ±–q«Ē¼f‘Cz4t•Ń”ŠzÓO• š”՜@C‚ƨ€€qŅģGSB=Šé8FĒr4j6Ą|ż¢ÖnµXŒ&ĄˆSœ… *· nŒ^R™Ē@›uk­Qc] 1Œ TZF-ų|“½&–Öé«8›Ö¢Ń÷ņFgWržęj»ĀĘ5Nń©lK9fb_ļ5]×øńēēģŖ6ƒrg՝½Ė¶oZÓśŚ‚ś‰ś‚ØŃ•¢¶œ ņsvwMd½õ~;Ŗ–]£™2QėŽŗœ}Æ/Eń”ÉÖŖź ęcƟ`ˆöcĆ9ę@£Caʋgh«LåŒF4LxؐpĄ§ˆ³xnGŒ ć»ČXŅ\Œ5>ĀĆæj9„†ų{®ōėŸżp»Ł#żR: ö5ÜphW(Č«w\r(ķśķ7~± rƍĆG:œłÜWÓfīŪ2žā‰mś÷č#@eꙺ{¼]„*:0}Bo[¬Ś„¾ødmĄwręé ®®9 oØļ8WĮ_ņī¢E·-ķåu€żĻ·īėśüęOŪܟ¾?õ/ō\Æųš›Žńń6³äūą{@kO6O.‹UqVŌ½h“b`į‹cįKfŪÆƒZŠ×$ŗ`†įh!×ͲHCÆźĘ‹³LJœ³Yt@™ ż0‘^BVßct=Ę"`l=ę¦pĖĀéõ®²*Aøŗ·"PćØkŽųhojCOhŹü¶#ēX<}]ŃYõU å Ń’yhņŗĮŗwļÜ;0}ņuŅ©n0ōe‹ĄļęÄkl›Ba08ŒÓm^Ÿ-Y›Xqwn˜Ü¾ø-Č,¼©"õŌÖzŚj—ģ NŲvųĪwū ~Ųė&OŲ+H§šA¾ "Ū·Éų+9ō« Oe9Ų‹D‰“­ Ķ»ÄLUYü7@?ģK™7Ē2'b185v4TŅę“UĶ­•;ŖŖĄQW+k Ću0¶wĻgBF­“†ēwźjųaŲ”Æ‚Tž^ō“¾”6¬ŖÜYŃŚR…™)™JøŽŽ…ķ;ōUśLH ÓWń;ōśaŲ©” ¾ĢĮQŽ“gĮiÅv_"#ƒ”¬E44r|ML,śM3Ğ:L"yH,„Ä^Jó…D”¹¬ .kxĒf…[’¶r›åqŅØ¦¾¦d÷’nņ‡ö7öĮTßFiˆ”†NJ2w_’šFR’פqxK–n!ģŪø¼\(GN’åÅ>ńXEcڃHŒ²XŊ,5Ėė*ę·Ūm­[ūüŹH¹ŃĄ,,T>æ³Léw;„RQQęw’˵cŒ 5h=ń&{õ£ÉX‡JHäŠ ŠŠ‚h(Į±gį ‰{f‰«n0„Ż*±\™æ]6?‰ ĮŅa‰s¬Õ¦ßöևoݶXŽ€ ŒAz[§ē„·ŸR{ŌOIoózō¶aUO=„b ‹ š”Ź§z ŠEČ^„šB6hÓ³żŅ+µš[ś•N÷ÕRN­6€†~VoŌ~õ•Ī€®‚łŖV+_•^AW ŗÆ¾Ņf×z?b/„ŌC© ĖšPĘA™p<$L¹„'4 ¢1†ŁĄĪ¼Dņf>‰7=-żź©_ž^õČĒ{£I2“Tŗ|čvL{»å ÜRc¼ółśĘ‹.¬t󊿢ŚÄŸNß×&=ö›½?²j×Ļ^śĒÅÆ€²ŪoÖ_ļę`e„{Ę«[nüśHTpó2Ę—Īڌ«I ž„É\Ŗeo’,B“€«Šæ`tåkr…ĆÜ\÷Ė0|Ō0AŪ VNp ƒ`ixNrżlšź¦&‘čøj“ąÅ#!ī<ƒM’¾¬ĖŃAv‚,qE+0†ń÷į&H=Y ąÅĮż\Č1Ōóš( qįē¬)ٽ|\*zžäV^’Œ©Ģ&Š“ńW-2äĘq1Ō(§§Cāń!‡4!“śP’žÓzdūėb£(Š/°†Jƒ“9Ća’ŖŁ ÄLŽ<ˆ+’o”³‘~©ĖšōŸ>MÅnf"uńµć䵛5ź†H€hqĒr!4#ŅH&°š‘‡ŸĆuŒŠhaEl¤‚gFüė¢ At K,ÜWŠ:ĘDPY°¶`½Z‹ ZƒhŻ¢Ųm=n«œ”5ŗI,'\Ӏ"ŹŖŠiŹ–4™\}Ķ]6Zmõ@Į0‚ĖÄ£›ĪµŁÕžõדq4£Æ‚Ö²„©Qo(WW”é 'ØŌ,䜽M'ͱļĻŽ™œH¦Grä²3¬I«5Ļ_§¬Ķ?¾ZoēX‘f*»zl6uŵƒ€»Ę`a9ɘ ­17¬++o[X_Ęe e`rE·NėSA‹Øq@ enoK㢐¦ĆWēVAĘQ½øc`§ZOÓżƒ¬^%s?Ģ}ÉN„ŌdŌ«£ęQkØKŃ™_c¾b²‹Öö&jÖ`Šś Œ‰x ˆÖŗhdÄ1Æ:ċ@v Ɔoōé’%t,xg­)å…dœ#§ĀxA+/Ėį=Ų¼:ĆlzgmUŖt|¹Āčā]'j’kĆŗYuuÆÆŻ° ­ „ÓGž$żW päO BS’DŹHļK’óÖŽ«RESŗjŽ×sÜU’©­…,ÆÖ6/éŻ:×.*«­Ø`¦…¶*†uŲŚĄ¼ѰŖ!īP–::]P6Nė.Ūõł°o‚žwx}ć=ĪŪtN–ÕčÜ<«YŗŖ?ą{nٹKœå'ŚśoœĄ[?>"o®ķ½nß@GĻögÖoLź”+¦$ÆēµØĄÖöĪ-:^ƒzTĖølé®&ōtT†Ī~zŗ­’ÕĶģĻlq:„ēģ§zĒĒĪŻTĒ9¦ęü|ū)ę„B£eB#f‹ŃŌ oŖóM®x?«ö.åŚ™‰¦ž`8†³PöŖō'•kŒčĮ¹-€ł[ļš©ģż¼‹Ē ļĘÖ7{ØqbžŽæß ńķ‘cƜˆ|bž€gųģ»AbĆ~ŌżÄ»ƒ<]×oįeGw_u]=§7ŖĒ½Žńß~™Ž]¹/H‡łHt“œ¢Ū@2³‰NŠ/1(Ģ’ 8ä4s5…“Z‡Ü{/’`Ē>uŸÕn{hö)˜’ģĻErŽcśżµ{šŸ?īe‰xŚc``#Ź10LbøĀčÄXĄøŽ‰É†Y…¹‰ÅƒåĖ/VÖe¬ŲBŲŽ°§±’įį˜Äń€Óƒsē?® ® \·øuøgńøšTšœā5ćį]ĀēĀ·‚_Œß‡™@„@—Ą#A-ĮUB.BŪ„+D,D¦ˆ|õ]"ę'v@ÜHČRČJČZ”õ([(Ū"{Sö«Ÿœ 9—rrĖrĻäžĖsĖ«Č[‘÷,ß&æ!’RHA\ĮŠ‚O…U…—ŠBŠÖów•蕬*¹VŖSŗ¢L©lQ¹Rł‚ ¹Š%•UÕÕeÕjjŅj6ÕņÕ:ՖŌIŌØūUļU_R?ÆžDż§Ɔ¢†ĶĒZŅZ^“śµĪh}×fŌVŌö¢Ż¢½¦żYǚκĪG0ŽDxŚc`d``lg’da& fB0ŸżxŚmĖNĀ@†’¼£+C\6Ęøpm1a*^B„ A·åR!J!m½ącų.\ų ®tēŅ'š9ü{:E0d2g¾óĻĢĪ €¼"•ΰ9cVČ2‹y«8ќĀšÓŲĀ£ęylāEóļ¾k^¤ū·ę%¬«'ͬ©gĶĖŲVoš?U_š?aŖ\ąeØ`ˆ¼Ąń!|ĮGń1|ŸĄ'ń)|ŸĮgń9|_Ąq?¾„/ć+ų*¾†Æćų&¾…oć;ų.¾‡ļćų!~„ć'ų)~†Ÿćų%~…_ć7ų-Ąļš{üğšgüÅßšwü’ÄæšoüR…@DU2ØFujP“ZŌ¦u©G4IS4MhŚ•v£ŻiŹA“'ķE{Ó>“/ķGūÓō:¢ƒé:”£Ćé:’Ž¢£é:–Ž£ći†6Ņ,ĶŃ&ŚL[hž¶Ņ6:N¤“čd:…N„Óh;NgŠ™tMēŠ¹tOŠ…t]L—Š„t]NWŠ•t]M׊µt]O7ŠtŻL&ŻBŁ•ūÉ!—õi@ł“ƒ†PHIŠi'%”RF9-Tīkä‘?3³}FÉŁ™™±ÜXŹŁRĪ•rS)7—rK)ēK¹µ”ŪJ¹½³gr³–gń>µA`„i-ĢSß©§ĀJÆ)¢ČXŌ<¶3#ͬ¤­S„q62ņT$FßĀfꙁ• e^Cé~š‘ÖŹŃX–24żØ©„̳Ŗģ÷ė©?ˆ¬ źČA-K¬Ō3<Š&Æ&L+ȌĢ…‘HĖķŗr1 XQŻĶ±QĻc%j~dĖ„NX#Óń'¼g,¬¬‘ˆ~"RÆ©\Ń ŅżĄ“ł0nģÉH¤ķä”0ٟN©Ŗ Z„žĒõ‰#]Ѱ--«™50ų/5l)‡MՄV2¬Å‰euĒ Eb}eü=pė~f¾ÓÉÄRfzĀxY[닾›ymž6ˆĢ@ō³n”:"ŹDŅ)ŒD ļśŽ<ĶüžČPgéų‘ĖćŠy„®ĒNō-GØØ™ ¾+d#ö,OD=‘ćķŠŠMå«Hź–«ä³ŸĀõ³ZźY‰Ø9žą© ė„™ˆMŪr†‹Vāöś‡pl5NJ”‚^‹-Cʍ¾LTWz„ŅØ‰ĀÉŗ¼ĻB"‹“÷ʆ>B+ņŌTĄh‡~TŖDZoČ”–½¹ąš£P$ÅfŅP.L–Ž/ˆ$óyĒéŅödā/3|­ Åˆ7O-’-ść²¼™‚½¶ŗāMŽ<‘Õ”œĶi³t9ķe^Ś)ūŖ7YZŹ]e·4‘xVŠļhv)8„”ÖeŠč~4dp”lÄyźń±zœ="aŚ0ÕgM!~TēĶcoŌų¼ƒ]ą `µM-`ppU¾w4ċ&ĘÉ[˜m= Ų¬LĖN|Ńw¬T“r‹<© ™Ē†Še1’»u[XĢU'Ļų*cŽŠküų±‘Z ¢­ācŚ Ō!#N&Œ'Ź’3FāEęń‚ƕ3/%¼¬`ģ@Ō¼¾Ć4Ÿ;Ć_#ūĆé;±¢é°O ¤šiV8 ³¦£Ęw(Fm޹ČōI›…ŹIZ(:‰ UNJó†)mńaб5®žĮØ]Rfj-jZCƒŹn‹„Xeaq»|q1®–†ģH­Ļ©UCį5Ģu±å6™ę4.šź-”FNhES £ŁmrŒ¹zY”^ -ķ &Wų®$ &“¢Xčü5f±–š¢ŹåP‘ £Ņ0gē·uÖT–NšsFrśś1Ć:· ‡mėĘłņ²Š/ĮT-ØĀ8±Ŗšśįåł"p'ʅ¦šfZ•(“ŃÄŹżŌćˆ&LvBž%Ēe‚*«M:~“lX×SŌŚ.EPkmMP^› 'MēźŒM¦ĢvĮŖ%ˆ™™ø:īĀx÷ćŌOפ镾qŃ2̹™¹–~ś©õėÜÉžN¬¾t¹.(_w6ĮIÆ`X(±ÅwżŒŠ“®SœŪ8Ū.J¾®œöœÖŖ²YE CWžÆŠ<©츚§nՏ’źŽxTu¢Qu˜,VķĢQĻdŃZÉŁ)ĶC¶FģY6g¤97»mĆJoĘtjē™Hw’ß.u¬Žø[sšō:Ks“97·I5›»#®¦¹]¤4Œ%¾ęÖŅųé±2F³į2XųQĶ”Ī/½1yń‹ķAb…õ>æi‡IÕr™:6Īoœ°żĢĪUčĖk`& ’N!t×d y£Õ*Õ[cēńŚÆ WSkģ"Åł™+Ó§i"}·Ę‰‘/±›¾­jK:Å\Ōdž¤;s¾1~0Td½Ļ“C5Ŗ€g~\Msuµ[¶4Ō?7ž‚ØŚł€†µEįŪ’’qˆų—ĢĻŖfN5›ž jw©¤QøŒQapache-couchdb-1.6.0/src/fauxton/assets/img/FontAwesome.otf0000644000175000001440000017071012332105522023616 0ustar00djcusers00000000000000OTTO €CFF ˆL± äŖOS/2’n€Õ`cmapa%1ģ¼lhead’Ė66œ6hhea ƒōŌ$hmtx¾l ’(ŌmaxpvPųnameŸUÓl`Ypost’}Z ü ƒõÄ_<õĖT‚0ĶŻj‹’’ž’’€’’’’tPvŒ3†Œ3sZ3pyrs@ õ’€  $ 5 QG ˜ ¤ ® 2Ć õ   " õ $; õ ¢_   *-SIL Open Font License 1.1FontAwesomeFONTLAB:OTFEXPORTVersion 3.2.0 2013Please refer to the Copyright section for the font trademark attribution notices.Fort AwesomeDave Gandyhttp://fontawesome.ioSIL Open Font License 1.1FontAwesomeRegularFONTLAB:OTFEXPORTVersion 3.2.0 2013Please refer to the Copyright section for the font trademark attribution notices.Fort AwesomeDave Gandyhttp://fontawesome.io"" ±²JL@ ©®“Ę!"""`ššš>šNš^šfšišnš~šŽšžš®š²šĪšŽšīšžńńń'ń(ń.ń>ńNń^ńnń~ńŽõ’’ Ø®“Ę!"""`ššš!š@šPš`šgšjšpš€šš š°šĄšŠšąššńńń ń(ń)ń0ń@ńPń`ńpń€õ’’’į’[’Q’AŽęŽ”ŽQ   ’žōóņńšļīÜķģėźéčē ³J4  €pĄ€v€_€]€€€€€€y€n€€€€€2€€@€€€€€€’’€€€€€€€€z€€’’€5€u@€5€5 €€€€5€5€€€€@€€€€€€€€€€,€€€€’’€€€€€€f€€€@€€€@€€(€€€€€€€€€€€€@€€@- €M€M€-€ €M€M€€€€€ €€€€€€€@@€ €-€€€€€€b€€€€ €€€ € €€€5€-‚€8€€€€€@€€N@€€€€’’*@€ €’’€’zZ FontAwesomeDųł…ł†ł†ųūG å Šū• U€6’‹‹ U€6’‹‹  … §®Õ.l ",04<>EGMT\_ehmqy}•› «±øĄÄČŅÜēšöż#)4>HT_lp{‡•œ¢¬²¶ŗæÄČÕāźīó÷ž '4=GRYfoy†™£®¶ĄÉŌąšōųü &,39COVcoz‰š£Æ¼ČĖĻ×äóü"/5;FPUZes}„Œ’˜£¦©±µĄŹÓŚćō&+16<EOW_hmqv|ƒ‘›¢¤¦³¼ĮĘĖŌāņż )04=DPX\aju…Œ”™£«¹ÅĢ×ßēķńž(,26GYhyƒŽ– §­³æĖÕąēķņü %16;>EMUckox‡•™¢Ø¬·ĀĖĻŪåół    $ 5 G V g l p v € ˆ › ¬ ° ¹ æ Ķ Ų ą ź ō ż    & * - 0 3 6 9 < ? B F O _ c u ‹ ˜ © ­ ± ½ Ä Č Ń Ż ä ń ś     & 5 B Q a f m t y € …  • › Ÿ „ Ø ¬ ³ ¶ ø ½ Ć Ē Ė Ļ č óglassmusicsearchenvelopeheartstarstar_emptyuserfilmth_largethth_listokremovezoom_inzoom_outoffsignalcogtrashhomefile_alttimeroaddownload_altdownloaduploadinboxplay_circlerepeatrefreshlist_altlockflagheadphonesvolume_offvolume_downvolume_upqrcodebarcodetagtagsbookbookmarkprintcamerafontbolditalictext_heighttext_widthalign_leftalign_centeralign_rightalign_justifylistindent_leftindent_rightfacetime_videopicturepencilmap_markeradjusttinteditsharecheckmovestep_backwardfast_backwardbackwardplaypausestopforwardfast_forwardstep_forwardejectchevron_leftchevron_rightplus_signminus_signremove_signok_signquestion_signinfo_signscreenshotremove_circleok_circleban_circlearrow_leftarrow_rightarrow_uparrow_downshare_altresize_fullresize_smallexclamation_signgiftleaffireeye_openeye_closewarning_signplanecalendarrandomcommentmagnetchevron_upchevron_downretweetshopping_cartfolder_closefolder_openresize_verticalresize_horizontalbar_charttwitter_signfacebook_signcamera_retrokeycogscommentsthumbs_up_altthumbs_down_altstar_halfheart_emptysignoutlinkedin_signpushpinexternal_linksignintrophygithub_signupload_altlemonphonecheck_emptybookmark_emptyphone_signtwitterfacebookgithubunlockcredit_cardrsshddbullhornbellcertificatehand_righthand_lefthand_uphand_downcircle_arrow_leftcircle_arrow_rightcircle_arrow_upcircle_arrow_downglobewrenchtasksfilterbriefcasefullscreennotequalinfinitylessequalgrouplinkcloudbeakercutcopypaper_clipsavesign_blankreorderulolstrikethroughunderlinetablemagictruckpinterestpinterest_signgoogle_plus_signgoogle_plusmoneycaret_downcaret_upcaret_leftcaret_rightcolumnssortsort_downsort_upenvelope_altlinkedinundolegaldashboardcomment_altcomments_altboltsitemapumbrellapastelight_bulbexchangecloud_downloadcloud_uploaduser_mdstethoscopesuitcasebell_altcoffeefoodfile_text_altbuildinghospitalambulancemedkitfighter_jetbeerh_signf0fedouble_angle_leftdouble_angle_rightdouble_angle_updouble_angle_downangle_leftangle_rightangle_upangle_downdesktoplaptoptabletmobile_phonecircle_blankquote_leftquote_rightspinnercirclereplygithub_altfolder_close_altfolder_open_altexpand_altcollapse_altsmilefrownmehgamepadkeyboardflag_altflag_checkeredterminalcodereply_allstar_half_emptylocation_arrowcropcode_forkunlink_279exclamationsuperscriptsubscript_283puzzle_piecemicrophonemicrophone_offshieldcalendar_emptyfire_extinguisherrocketmaxcdnchevron_sign_leftchevron_sign_rightchevron_sign_upchevron_sign_downhtml5css3anchorunlock_altbullseyeellipsis_horizontalellipsis_vertical_303play_signticketminus_sign_altcheck_minuslevel_uplevel_downcheck_signedit_sign_312share_signcompasscollapsecollapse_top_317eurgbpusdinrjpycnykrwbtcfilefile_textsort_by_alphabet_329sort_by_attributessort_by_attributes_altsort_by_ordersort_by_order_alt_334_335youtube_signyoutubexingxing_signyoutube_playdropboxstackexchangeinstagramflickradnf171bitbucket_signtumblrtumblr_signlong_arrow_downlong_arrow_uplong_arrow_leftlong_arrow_rightapplewindowsandroidlinuxdribbleskypefoursquaretrellofemalemalegittipsun_366archivebugvkweiborenren_372_373_374SIL Open Font License 1.1FontAwesome# '9>KVZbvzĪŌŲÜź÷ü1:?KYgkotzJNQUbfmrw…‰’š©UZ`d¹æåł 6:^ntĮņ÷ūFL} Ŗ¹ī/?DVZ^bhmu}‚·īóųż-1:AJNR`{†šž„½ÉŅž)16;@EIquŠ‘”˜ž£ØĪŌŻāē÷ż   # . 5 < @ [ _ b w € ‹ ˜ ž £ Ø µ ¾ Ė ć  ! ) G X b } ™ ¦ « · Ą Ź ć õ ü    # 1 7 < @ W n ƒ ™ Æ · ½ Ä Ź Ń Ö Ū š   + 7 ; C H M [ l  ˆ › Ÿ Ø Æ ¶ Č Ń Ü į ę ė ü   " 2 6 : B J Q V ] d i n r   ™ ” ¤ © ° ¾ Ā Ź Š Õ Ś ß č ķ ó ÷ ż!,9?FJNRV\fnv~„‰Ž“˜ž¦±·ĀÉÓŽéņż ö "śTÄ . K_ KDĖN žTū3ūūū3žT& „¹K÷Ą÷ˆ¹÷t hnnh –Æ÷TZ ÷Ōx ū3÷ū÷3 * _ ūTD hnnhū÷÷nhū . ƒ÷÷]­÷]­÷'ų”żŌ­}¬t¢ūė÷ėÜ÷ ¶÷ ÷"ųūĻ÷ĻüüūĻūĻüü÷ĻūĻų÷"÷ ¶Ü÷ ÷ėūź÷6 }™y 5 $ ……‡‚ƒƒ‚‘… 3ł€& €' :  +‚„„‚+‚’„”ė”’’” ;  — ü÷H ų‘…‚ƒ‚ƒ£ųfüfe ÷3ū÷ū3 y}}y …‘”‡““”ø $hnØ®®ØØ®  ‘…‚ƒƒ‚‡…… $ F ! ū” V``V ”ŸµļŠŽˆ’ ʆ…‰iimdodŒŒŠ $š@ī~† K…ˆ‰Šˆ‰zµ&”w{yƒyw‰ū}|ū |÷}Ÿ‰“x•z—{‚wa&z‰ŒˆŽ‰„—öK˜Öļš••ЕЕ••Œ• $|•Ö'˜ œ|šzł@z||zūTzš|œĄœššœųŌœ|šzžŌz||zūTzš|œśŌ‰ł@(Ą7 8 ', Q   ÷T0 S 0 ūT- Ą¶¶Ą ÷”b ū!÷ūX  3 R‹ „„÷ˆ÷Ą v ƒ H “– üTüT} śA÷;ū÷(ū=čšZ“XWūG/ū9ū;ūūū/ū_Mūknmn9÷÷:Y÷IČʑ•ĆŽPé`šq¦„؆©‡›‰š˜é ž~—€˜d·_²iŽ üi‹üiüi w ų”ü42 ų4ż”üśų œ…œ‚’„÷ĶūĶ’„”z‘z÷kĄlÕf°ūĢ÷̰fAŖVż÷śŌ6 0  ūV  j lžn‹l||ˆ…}_zob^ś÷^§b·z…™šˆšŖØ— ¢ųMų<ųMü<v¢Ø€Ŗšš‘™·œ§“ø øo“_œ‘}|Ž|÷9÷ YY……‡‚ƒƒ‚‘…ųü÷H Ć ųfųf‘‘”“ éü”EQQEüŖų”‹ \€‹O ‘‘”“ _ z ū÷9ūąūąū$÷$}üT( ųT÷Fū$÷$÷ą÷ąY [ IüT.ž÷$ū$ūąūą/÷ū7÷ą÷ą÷$ū$| õ5į!ø!į5õõįįõ ™}y ÷mū÷ū3ū'!ūūūźū÷%ĘĘ ©§#xM'ū nq‘’w€Ž€‚dū—†™†›†‚„°„ø÷‚÷÷o÷^ ū“ųĖéūė… K{+üė… K{+ūEQQEūŖr÷ ÷‚ 6   č÷ ž÷ Ԉ†ø…¹×‡Ģ”–‹Œ™˜Œ•‘’‰›ˆ¦}’z‘xa—Qœ†ŒpW”ƒ„‡‘ŒĄŒ÷'ˆ÷ū hnØ® ÷8ūtV`¶Ą«÷3'· Kū®ūzūzū®żT!į5õųõįįõ  ü“ų“}ū“üT$ü( ųTū“‚ų“ų“u Ą V üŌŗ ƒ ū!ū÷÷!Į  ü“V`¶Ąų“ü“÷- śĄ2 śŌ6 ˆś4‚»qĮm©ūĢ÷Ģm©U„[”ü‘ų‘‡š•ˆ”„“‚…”,žSžS`œnŸ”‘„•Ž™ŒœŸŒÅŠļŠōŒŚŠæŒ~‚‹…aŠ‹sjki Ē ł:š ś€›ł: DRRD «Õ ūŌū&&ūžT . † € y}™ ū÷ ——’›œ ÷h÷@÷( ŅÄÄŅ i8_dd_€~~xé zŽ™šŒŒ‹Œ©Ø¦’š„鶎ʁĆʅČų÷Ļ÷y÷Æ ÷¹ūG÷CūæūCū8ū=<Ł<ū8÷ūCūæūGūCū¹ū„÷pū]“„łüī—›…› ”  ” ÷J o $ € Ž„…‘…łZżZ¤rŸ”® ˆ’‡‘…‘żZłZr¤w‚h 9 / œ›’—— ÷÷' ÷ˆ÷Ą÷Ą÷ˆ † 7  @÷”8÷÷tą ÷. ūtūtØ÷tūts÷TZ ÷t÷t T žŌ(śŌT “ˆ£ ūÓ÷Ó‘„ƒ‚0 ūT | ”„’‚ ’ ū”ū”„{zž÷ | ÷ ÷”÷”U“÷ z üfųf9 ū9ł"ūūTūMŻ5Éؘ“•“’—{Š~~üDū;ūųi —˜‹Ÿ˜~—w‹~ū”ū”~‹w—~…’“ˆ“““Ž‘’÷”÷” ÷- üŌÉ ÷”ń 3CC3 ÷÷! cūŌ nD ś÷;ūū`÷¼÷L÷Ÿ÷÷<ū•ū ūxra†„‡„‰„ˆ Ą ÷÷÷÷÷÷÷÷÷÷ ( ÷' z, z’{— ų÷ ®Ønh ūŚ&÷ i÷!iū!&ū ū<`Ųäsźé䣶Łūōś‰ B‹ūT ‡……YY/ ÷ū ūĄūˆ ū”÷”÷ ū”ū”} ÷ 1Ė y}}Ō ™ fh  EÅQŃ œ÷&÷Ō÷Ō‘‘Ž”“ ÷÷”÷÷÷ ÷‹÷‹÷] r¤‹³¤¤ s ūhū@ū@ūhūhū@÷(v÷h÷@ū@ūh ) ¢ |™zū@G   z™|÷=  üTųTo V`¶ĄFĄ¶`V {…zz{‘— ÷ ™ !55! ūˆūĄ . śĄ(@N 2ųū4Œ . ł@(ĄN V``VżTV`¶ĄłTĄ¶¶÷A ±”„“ŗĄK” x—x–tŒw„‡€…~„ Ō÷n’ŸŒšŽ—ŽŸ…Œ…Œƒ—\Óūnż Ąč ¦OI—IūūgXū!ū!÷gX÷÷÷g¾÷! mķm))mķm©)©ķķ© 3ü*ū ÷'ļūū''ūūļ'÷÷ļļ÷÷”÷”ų÷³ūU÷ ÷˜÷“ūf÷ ż@§ |łĄq™÷B Šę0 łZłZ‘‘‘Ž’ L śT6 ų<÷ģ÷ģų<2Ÿy—qpV``VV`¶Ą¦—„Ÿä ÷‹÷÷”÷‹÷D ‹÷ ­}¬t£ ~~‹w˜~ Ÿų ——›‘÷<…— yyrrr•ry t—vŸ†•–ˆ–– ųŌU Ļ÷ jŻ ÷M÷÷÷Q‰²½ ĖĖ™Šš‰™ £Ē÷ ˆˆž‘Š‰ˆŽˆ…Œ… ’‹‘Š’5ųˆ÷’÷ö˜˜˜œquuqqu”„÷;÷÷÷;„”uq ÷³õ@ŗ÷$÷‡ŗū$@!÷“ UV ÷ = ;  ¤¤³‹¤r ‹r rrc‹r¤ ÷Ÿ ¹ ™ y£„¤•£÷'÷&œ ››‘——łųģ””÷p÷]÷„ ÷% ųF÷Š÷Ā÷ B ‰’ˆ’…’„˜„š‚™ū÷xūØ ÷÷‹÷÷”÷ ‹ą ‹ś”ś” ÷ ~÷ ū&&ūżŌ÷ EQQEEQÅѤ ŃÅQE ūŠxˆe`‹Z=ūŽƒ ÷) ~÷ \xcik—v‘ss]tRat Õ ÷”÷”÷”÷” ~˜w‹~~ Ą¶`V ūÆ÷yūy÷Æ÷Æ÷y÷y÷Æ  ū÷” ÷‹÷÷÷ ÷IØ ÷0 ÷G Ņ÷ ÷_Ö÷$÷ŪcXš üūĻūyūÆū6óū%÷6- ŃQÅE „ śĄ2 s Ąz P@Į—z”y–z€’“… v C  ÷“÷“ū“ ŲśzśĒ ÷”ų÷” ÷% ¤¤‹³r¤ z…{ ÷$ y˜ © fMū@ū jm‘˜q šū™wƒ› = ł”d ‹•÷1\ | ū‹ū] t£÷= ………ƒ‡‚ūz} ¶ : ÷TZ ū÷. U÷ ś”U ūŌą ü;÷ķūķų; tĪ j DÄRŅ ”  “”Ž‘‘ ū]ū‹ ÷@÷h ÷÷÷÷÷p „¢›£••¢†§x ‹÷”ł÷”÷% ~—œ…››œ‘˜— V ł ÷”ś”÷” + ‹V w    ÷ Ė Ą÷% ł‘ œ›}yŒ s¢¬}­ •¤¤ õ5į! ÷‹ jii ł”÷ œœ› u ¢¢ ś”łt. ĪČOG÷Œ ; U ®Ø’””n’h ū’ vŽ ‹‹‹÷( " ū%ūņtū„~ ūnqū"ūūu = œ„›— ÷ ÷-÷÷œ÷ ÷" ÷® z||z iij   }ƒŠ™„Ŗ‡’‡iv59Ćó‘“•—™›­Æö+Bćó!u²żf±õU–¼D‰ĮYåś + Ö B † Ö 7 u ģ £  E ĪgtµŸ]]`¤£Œ–ļÆg±ŻļQ†Ō,¦ęśx@­ž+Xˆ²»ąō D‡Ų  5 Ó!(!§!ō"›"÷#9#©$ $x$Ł%%}%Œ%¤&&Ć'r'Ń(ƒ)œ*'*ā+—,@,h,ø,ū-*-Ü.\.x.Ż//4/•020z11Ą3]3‡4¢5÷66e6Ŗ7.7¢7į8#8É9ā:K;t<+>^>É?~@ @’A#B&C D#E7FfFæG&G{GĒLsLļM.MjMĪNoNqNsNuO(PPŃQ-SS¶TUUU9U…V•W½Y+Y’Z%Z›[Z\] ^^°^½^Ź^ń__U_f_r_``šab b™cccödbeef‹fļg?gh>hźi7i‚i×jh3cū #ū ^u™i”÷„¢œ„”‹ذŠĘ­źĄ÷Ō÷R     ū’ų”ųó ū@# ™6   ÷I ł”÷”£F¼M”fś€fM‚Zn¢nŸwł ż ż”÷6 / ś÷? ūŌł”ł ł ŸŸ¢ØØ vŸ ÷;V  Ą`¶V‚Šˆ‚żŌū”c~ofaž[ĮłYł”÷ü­Į ‹÷”śŒ ś÷”~łT+¤  t÷”÷ł”ې «‹ś@qł” s¢u¤w÷#ū÷$ū÷ūLÖč>óŒŒóčŲŹÖ÷÷÷$÷÷#÷¤Ÿ¢” £ż”śÆ69ūJXū"ū!ū!`V+/EŠŠE+ē¶Vūõūõūō1ŅRī÷†÷9 ±…_r÷°… ś@{žŌ÷ J śūćyę  ś ©k—süŠŌūuų[ž‚z”tH ųUū€„—™†™ؗ£„Ųę qųØÓü9ü ÷[üū[Ōų9ūĘ÷½ų:É÷Qų÷Qüų:M÷qĒ©k—süŠŌūuų[ž‚z”tH ųUū€„—™†™ؗ¢¦Ųū’Jrr÷÷vV÷ļū¹lūūūXūXū÷l÷> ÷*÷3łž÷3÷ģ÷6ūŌśi ÷)ū”ī ‹÷÷”÷÷1 ÷”÷ųKI ś”ż”° ž”~±rū€±üł”° ųüI ÷÷4÷ śĄs @œ  v÷ ł”ų”W~WśüW~W  v® ų”÷“:łT$ łūŌ:ż™Ą`¶VūŌV``VūTV¶`Ą÷ŌĄ¶¶ĄłūŌl ż™l łT$   v® ų”÷“:łT$ w ÷!žTV``VūTÉ ū™:w ÷!žTV``VūTÉ łT@ žTV``VūTÉ  ™¤÷ ‡ś^¤¤yū÷© ż$ż%ūŗ÷»© ūūŃ÷žūž÷ūŅ ÷÷łhłh÷7ū’Žv÷¤÷j¤¤yūŗ÷ŗ÷ŗ÷ŗ÷7¤¤yū÷© ūŗūŗūŗ÷ŗ© ūūŃ÷ŗūŗūŗūŗŃ÷ūŅ ÷ŗ÷ŗ÷ŗūŗŅ ÷÷÷7 ‹÷”ĻŒ Ļ÷”ü÷>ūt÷t. K_ ūtūt_ KD÷tūtj ĖN ÷t÷t, ÷«+w ‹÷”ĻŒ ś÷”ą÷>üŌ_ KDųŌN ÷«+wū÷”‹÷”ų÷ p÷-÷‡ū÷tūW÷&S¶:€aR`S—:Ća÷)Öū)ū6ū®ūzūzū®ū®ūz÷z÷®÷6Ö÷)÷ķƵ—Ü`ĆaÄ;–R`ūWū&ūūtū‡÷"ų;÷ķ÷ķų;żł”÷EQQEżEÅQѤ  ū÷”‹÷”÷÷”ė}™yūTy}}yūTĀ ÷ԁūŌĀ ųԁüŌĀ śTžTĀ Ąś@€ J ś”łjų”÷œ›zŽūK§¬}¬z«­ŗ°·­¹’Ž’”“‰“†‘aĘEÉV¼‘„‚‚‚‚ˆ……ū" nšm—l•o÷Lœ‰{˜yūry}{‡{O…J„Nll~n|ūö‘ƒ‚‚iūū&js†„‡„‚‚ƒ‘„°^Æ^­[{m~mkūNo|ˆy|ūrz—{œˆ÷Kp•i™jœki\f_i]†„ˆ„‚ƒƒ„µQŃMĄ[„’”‡”””Ž‘’÷!öØ|©Ŗ§ūLz›~÷r™—››Ē‘Ģ’ČŖ•Ŗ˜Øš÷ū†“”‡”­÷÷'«£‘’Ž’””‡”…’føg·i¼›Ø—©–«÷M§›Ž—šū’tś”÷÷÷šų”ł“] ÷”ųŌ] ÷”ųŌ] ÷ū([po†żŌ†p§»śHśžHż4śČ¼÷ Ž“‘‘Œ÷ѐД…އ»ū ųtkBūÉE÷;¼wO³VūŌVOcZwEū;ūÉQėžLūÓ1ćłŌćÓé÷śHėk   v~÷”rų“‹ŠüÓųnüÓün‰Š‰‰üt( ųų÷”üų'÷sų¹–˜‰ ~–ūo÷Jų,\ ūWūˆ÷`a®G‹ahżcüė~€‰v–~ÉA…“‡“Š”ГޒłHųÕłHüÕ†‘’‰“ŒŒ‹Œ“Œ“‘ÉÕütł”÷ų÷E Ÿ÷Pū÷tų4÷ų“÷t‹÷tų“÷ų4÷tśśt÷ ūōūtQ÷Ō1ų4ė#÷) v÷Ō÷TŸ½śėų°{Œ||ūˆ||—›Œ£÷Ō÷5 ÷N÷5£ūŌ‡ł‹üg³€³|Æü5śØ¤p”pūē÷5šūTyŒ~}yū:y~™Œš÷T÷5 ūēppurü5žØ|g€ccn“_±łTz}™ŒŸ÷”÷5 ÷¤÷5Ÿū”yŒ}}złT±“·Ø ‹÷÷÷”w ÷÷÷w ÷T‡üdūūgf[wXX[ŸÆfū÷üe Ą6 ūŁś ¢t›qū”ųT3ū”*üTū”÷+ ųTüT÷,ųTųTž§£a ų4÷”ų4÷t8śōųō¢÷ō\ ūō  ~ƒ††Ž~”÷ŌūŌ…’“ˆ“““Ž‘’÷Ó÷Óß ūōųŌ8 a ų4÷”ų4÷t8śņł(—ˆ˜‚•ūŌ÷Ō‘„ƒŽƒƒƒˆ…„ūÓūÓ…„‡ƒ‚y™}‹÷Tūō€ ÷ō÷T˜—“—ūņų 8  vśŌ÷TŽ ś“ųŌ,ūTūŌ,÷TūŠŒ‘÷hų„łX÷hü„†Œ…†÷YmƀĄ}­ū‚ų¼¬}c„hżŌhcqj}ū‚ü¼}i€Vgüvō a śŌ÷t ł¢ w–ü“÷Ōx—r‹w€wvtżŅ–Ž‘•ų“÷ŌŸ–— ¢÷#å ‹÷”°V ÷1µ ūū÷ū!ūSŚūYü;ūķūķü;÷"÷y÷lš÷D÷&•˜‹ž–ū÷‘„‚Ž‚‚Š‚‡†„ū)ū'Cū3ū®ūz÷z÷®÷®÷z÷z÷®÷÷Y4éŠūūŠ ųTAå ÷0°ēųtœ}š÷|‚}†zcesdū,.ū9/ūFūū½ć-÷÷u3üT*üTŠ‚÷÷ū÷"÷Q>÷Wų÷ø÷‹÷öąŒ‹Ž¤ł“’ ūū÷ū"ūSŁūXüū»ūŠū÷5‰‹ˆ‰z™|÷[š•”™œ³—±£²÷,č÷9ē÷F÷÷Z3źūū} ųTA ‹÷÷÷÷÷÷÷÷w ÷ų÷ō! ÷Ō!÷Ō!~üTy ÷Ōy ÷Ōy ÷ż‹ś@qłŌ…Ą÷ żŌ÷śŌ… ś@{žŌ÷ü’ v™÷T÷÷Tų”÷T÷Ōł”÷TĮ   ÷Ō+ą k÷T÷Šū^÷^ūŠūŠū^ū^ūŠūTk’ R÷÷÷Ō÷1ŅRÄDn]¤b²tūDĖN ņ²¢¤“¹ĄKI_ū=ūū1ln™oĢūūæū1ū"ū-SKūq~n}s{x}zsżz/ —•Ž‘–Õ÷÷;Ó÷3÷nćū ÷L÷÷ĀČ÷ؚ¢™°  v™÷T‹÷T÷Ō÷Ÿ÷Ō÷T łų/ü÷ļüWüWüūļü/ūŸ!³(ŸZ÷MjūØī:÷ k- Ė1ųŌKG k+8V=_G—xɁĖĪ÷Ā÷æ÷œ÷é÷é÷æūœūĀHKxMGŁ_8Ą+«] «÷ īÜ÷Ø÷M¬Ÿ¼³īŸõ÷ž«™‹ł”F ü’«™ś”÷F ųų“ļNķ-°ƒ‚Œƒhnog?÷ ū ū ū ?gØo®“”Œ“é±Čģļ Gwś”÷)F ųų“ļNķ-°ƒ‚Œƒhnog?÷ ū ū ū ?gØo®“”Œ“é±Čģļ÷”÷_ū÷QūPŚ÷2 o›x¢¦}¤£yīCÅūūūQū(Csyrp}t{xoO Ɠ”Ž“÷PŚ÷÷Q÷_÷”÷ĒūK÷Ŗū®÷ ÷2 nš{£}™ƒ›†šƒ§|§z„x÷8ū ģūSū`ū`*ūSū8ū qxozo||ƒ{†}ƒs}|{n/ ””Ž“÷®÷ ÷K÷Ŗ÷Ēū’‹÷÷÷ž ‹÷÷÷÷÷÷÷Ž ßųųųūtśūt÷;ūtž”žųųüüł“ųųüųųųüżū”żżłŸ ūt÷”÷ūū ÷łūū0tüż 8÷ųßų÷ūųż”~żżłł”łżżł  v”v‹ŹŖ«ŹŖ÷ŖźÉźŖ«Ŗ«ŖéŹéŹŹŹŹŹŖŹźéŖ«ŖŹ’ĄŹųk‹ųiųhvv‹vüi‹üjüi Ÿ‹”ʌ[ €‹€O—”‹–éX–•‹•÷1X—”÷wŠ ”Ÿ‹Ÿ÷X–•‹•ŹX–•‹•ŹX –•‹•÷1W YĄ€¢ž‹ ÷1W ¢Ÿ‹Ÿ÷W ”Ÿ‹ ÷W ”Ÿ‹ éW ¢ž‹ ÷Q\kl‹lO€Ą«Ŗ‹ŖŹ\€‹€OF?—”‹–éŠųi‹ųjųivv‹vüi‹üiüj¢Ÿ‹ŸK ÷)K ųĶż_ł^¾X*³DūtŅģcX¾ł_ż^¢s™÷:}jttüjüjh­„sæ­¬™¢£ųų€² t÷1 ÷÷”‹÷¼ßgś¶|Ÿv™t”Œy‹w…xūĄžog€`vfž/TF—Åwƒ”Œ”“——”›Ž˜łł÷„­÷.ŗ÷¦ś™ŗ…ŗqÆ®ra \żzz†‡zŒŽūƃūaM{tsw‡xˆy•z‰z…Vc,sj|wu„t…{•t‰v†\h2p]yx}†x†z•u†x€Wi:mY{pvz‡s‰”~Š{Šs‡w‰w}e‹_›^#°÷:ńś/įćĶą¤÷§ś™¹„ŗrÆž¼‰” 8ū”” ü"é‹w Œ€T ū÷łą÷”÷÷1 ÷÷ų÷”śū”žłłłū42 ÷4ü÷”K™ ō4ā"K÷”ĄmŌe±ū,÷,±eB©Vż4„ ü“K"44"ü4D÷tū4É÷4÷t, ÷)ž ‹€śTłōū3ūūū3ū3÷ū÷3÷3÷÷÷35łTų4ūtX÷Ķr=ĮEü”E=UIrXūūtƒ žļ r÷@ śv żTū€÷÷]­÷]­ū]÷<  ų(÷÷ łiśe£[ŖE°.±/Ŗ;¢Fn‰jŠūŽūLüŖż#ĄĆ•Å»“~÷L÷„¼•‹”“–‹žŠ§Z’pƒŒX’i•yš€“…šŸš“¦šµæ÷%®ęœ±ųV‰ēūxŗū€€‡‚ƒƒ…†t‚d‚ūoˆrŠqpō÷\–Œ§øŒÉĆŹ‰…цŃˈÅŒ—‹“‘—‰ž‡„f™i”kkŽt“}—ƒž|¬mĒv½}²pŌuĀ{ÆqČjŁfėgė_ķ_ņūaųt€ Vsr‹qū¬żhūüüxg{u~~‚f€O€e„p…|†‰<ū’ūéAęł5ķųŗį6ń÷s÷Ņl¬ųæš„œ†š—ˆ÷¢Œ÷A÷$’ž¬Ž¼÷݁uĀĀvŗa²L§^˜O@BOq[rZbfSppSD}2`\– Yl}ł~Š­‹„œŒķŒ÷ ˆē‡Ī‰¬‹„”Į¶¬÷ąrYĆÄY§M@!m@P`_O3vūaglü±ž ÷)åެŽ÷’ī‘߉÷Y‡ćˆĶ‘·“į›ĻŸ¼£¼£ŗÆ·»¬Æ£²™µžĆ•Į¾ālŚNŃ“NŅ2»ū ¦ŁÆ¾¤ ›¬¶«Ŗ® ± ±–¶ŗ¶„“}±}±u®nŖn©i„dŸcŸk—s’FL”PAiwŒƒ‚‚ "^Šü~ū˜…8ȃ±‡šŠ­‰¢†—ƒ‡ˆ†‘}gŒP‘ūnūŒWü…6ˆJ…_ˆ{„z€yk~bYƒpˆu†x‡‰-ż†v‹ś”ūšŒ¬Ž½Ų’Ő²Š÷Z‰Ⴜ…•‰‰˜•А™‹£Œ“‹•žŽ˜”ŽšŽŸŒ¢f‘uŽ„Œgc’`•‰—Š”‘—ø¶÷±÷2Č÷˚ҔńØ÷ §’¬“²“Ø“Ÿ¦–­•³•³”°–«–‘ œŽ˜–—š}Šh‰T‡…(Dˆ_s‹dūљx$”‰˜Š›Šχ»‚§|yŒŠƒƒYuū{Lnū1Іp=mū1KSū pūƒ`}ixsq~e~W~h‚q…{†z6 ū÷ś”÷ū/÷ū÷ ų‘÷ųSŅ÷•÷*„ «ė“Ų§ž™Ÿč׏rˆūŒū ü@ūZ‡ū$‡0± ŽÆ”e÷ąŠ÷,.Šž‘ćŽØ„¢Œ÷ ÷lū¹ūkŒķIū;ś”Ū·™§®pŹū÷6p®_‹phūū6hp™o·Ūž”;_}oh¦÷ū6¦h·‹¦®÷÷6®¦}§_‹÷śō÷ū÷ ÷ų÷Žų÷HŅŚ„ ŗ«ė“Ų§ž™Ÿ÷q׏r‰ūū _ūZ‰ū$‡0± Æ“eWŠ÷,ڊž‘ćŽØ„ތ÷ ÷SlūŅüRŒ¼ķZū ū6÷h¦o}_;ž”Ū·o™hpū6ūhp‹_®p÷6ū®p§™·Ūś”;_§}®¦÷6÷®¦‹·h¦CüÓ ū& w '÷”Ó ś& V 'üÓ ū€& ~ACüÓ ž& ś'÷”ų”R üÓ ż& łACų”3ū& w 'ų”3ś& V 'ų”3ū€& ~ACų”0ų”0ų”0Q ÷”÷”÷tĄ ųŌĄ ųŌiś@iųŌŗųŌŗQ  ųśtœ|šzƒ‚ˆ……ū“ū“……ˆ‚ƒƒŽ‚‘…÷“ū“…‘”ˆ“, rūT?Q  ÷ōłT“ˆ£ ū“÷“‘…‚Žƒ_ üŌS÷&÷“÷“‘‘Ž”“ üt?  v®   „{¢t•Žƒ‚ƒz{…~ü'ü&÷9-żTū3ūūū3żT&łT÷3÷÷÷3÷:ų'ü' ÷)÷ ÷TśTU ÷łśT« ś”üü4ų4ü”ü”ū4÷4ūŌūŌūTrė~œš|zū@Ę÷4k… ‹łĄ”ū@s @œūU÷’ ÷ūöęę÷ūųDłŁ…‰…††ü²ü²††…‰…~‚”˜‘‘ų²ų²‘‘˜”‚~U÷TżŌżŌü4ų4łŌłŌ÷Ÿ÷Ō÷ ū÷~£sÕstū:ū9ų4ü4÷:÷:²ż~Œ ÷' ł”śj÷”÷Æūy÷yūƶ N’L„Tųżš_Ÿ¹p»»¹¦· ųłš„Ā’ŹČa ł”ėKžŌł”ų“ ż‹÷”ūv‹÷ ś”Pų”ų—RÄŅ ¤“£—Ÿ˜ŸĄĻ Ī–Ž•““•†€Ž HĄG˜w—w“srPŸ šméXŪXŪūj÷£:÷¢¶b kkcv`~:ū¢ūjū£X;`Y;l-&Pō ‹÷÷ėś4Uų”ėų“÷ś ÷ōSė+Ć÷÷÷,ū,÷Ųųš”‚Š|‚‚ūņūņ‚‚|Š‚”‚”Œš””÷ņ÷ņ””šŒ”‚Ūüę˜ƒ–~‰KK……ˆƒƒūn łŌšš‰‡š–‡—Ž””¼¼““Ž•‰–‰•„”‚œfc“cżŌ? +ś4ż4ż4ū“÷“ł4ł4÷0÷0°°‹Éf°ū,÷,f°M‹ff//÷“ū“ēē ÷) ÷÷głĮ÷rų·˜‚–}‡‚‚{|y~w‚€…„€ūjn ÷‘±¢øŸ½œšŽ–˜›|™z÷Cū“? ÷ł‡÷üų—{’zƒ‚‰ˆƒt{tqūTū4ż 7ūČū ū\÷3ūu’ƒ‘•†•ŒŒ˜‘”™‰™l÷z£÷*ÜčäŁ÷ µ÷p÷4˜ q›t¢ˆ“”‰“œ›‘˜—ųų ÷ Jw÷ Ųørųņ˜ƒ–‡‡Œ‡ƒƒˆ„„KK……ˆƒƒū’3CC÷$ ŲØ łŌšš‰‡šŠŽŽŠŽ“”ø ¼¼““Ž•‰–‰•„”‚œfc“cżŌ? ÷{ł»««‹½k«ū÷k«Y‹kkżżū›÷›k«Y‹kkūūkk‹Y«kųBüB«k½‹««łĀłĀ ÷' ł”÷”» üų÷÷F¦üü÷ųüū$ž÷ b œ›’——÷”÷”u3ūųųū‚÷”÷”użņ ‹÷”śgsmĄč  ņ ‹÷”Ó÷ łZč młZĄ ņ ÷S÷ łZč żZżZrr‹c¤rłZżZ¤rŸ”®łZĄū’ū‹hųõŖœ‹§lœśŠłvlœr|hś@h¤|ŖœJ V @Iü”*ś€( ų”'ž€Iü”*ś€( ų”AJ V @¦ ņ ‹÷ żZē łZłZ÷żZłZr¤w‚hżZæ  ņ V ÷”÷ żZē m żZæ żņ ł”÷”øūm ś@ē ū}÷; ™ųĮrr”w®÷9 ®”Ÿ¤rżZłZ÷ łū * ÷”3ś€*ū”( ü’@Ąśjłzf¼YŻ‹½½ÖÖ¼¼‹ŻZ½üzųyųzųz¼¼‹ŻZ½@ÖY¼9‹ZZż żZY‹9¼Zü’@÷ śjśßłT­}¬t¢ż ł£tÕst?@t÷#¢sųzüyüzüzt÷#¢s×@t¢÷=ł ł¢£™¬­ū÷Ōś÷Ō‹÷Ōś÷Ō™Óū”ū”> ÷ ©÷”÷”E ū”÷” ū÷ŌĖ J÷Ōś÷Ō™Óż”hnØ®÷÷ū÷ŌĖ J }ų2z„z11z„zz{’—ūI÷IūIūI{„zzz’—1å—„œœœ’›——÷I÷IūI÷I—„›œœ’œ——åå——œ’÷<„—÷IūI÷I÷I——›’œœœ„—å1—’zzz„{ūIūI÷IūI—’{zų÷v ūV ‹›  ł¶÷7 ü³ü³z„z{z’—ūž÷ž—…›œœ‘œ——ęåŃ ÷vūvų,ų+Ń ę1—‘zz÷ū6~ ŠŹž ÷”ĖłT÷”Ž ś÷4Ø÷T÷ūT÷”ł4ū,#Q?`\pnZt‹ØÆģģŽŅ«ȧ¦„æ·P“Kgjzx}wy\Oƒ…‡‚„„†ūļ~•‡”™÷#į÷Ń÷7÷@÷TūūKųūT ž ÷t÷Ō÷t÷÷t÷4Ž ś”÷4÷. üTÆ÷4Z ė÷Ō+Æ÷4Z ÷ŌZü”ė_ū4ūśØ÷4÷ū4łü4 ÷' ł÷”­ų”`ū$ūūū$`÷š ūū$¶ū÷`÷$÷'· ū¶÷$÷÷÷$¶ū›÷÷$`÷ū¶ū$ū& ÷÷ē÷ ū#Z÷kū=÷=ūk¼÷#š ū#ūkZū=ū=Zūkū#& ÷#¼ūk÷=ū=÷kZū#›÷#÷k¼÷=÷=¼÷k÷#Aa śŌ÷tśŻų]Ü ū÷÷÷Ü ū&÷&ņūūū÷ņū&ū&Ī÷ūūūĪ÷&ū&ń ÷÷÷ūń ÷&÷&÷k÷K#a śŌ÷t“łg÷%ń÷ ū§ū§ū'÷'÷ %%rr‹c¤r÷ŗūŗ¤r³‹¤¤ų:ų:÷!8#ū÷tśŁ÷t‹­  łūĀūˆū‰ūĄū%¬Ć5ł†ł…Ā6«&ūž{ūæSįjń÷÷Į÷ˆ÷‰÷Ą÷ņjQįųhü[ų=ūģ÷ķü<ü<ūģūķü=ü>÷ģūķų<ų<÷ģ÷ķų>KwĖĄ÷-Ļ^ĒCżT÷¹÷¹££™¬­­}¬s£@Õ£skŻ ssżżtsĪ j¢tłż ÷Ö×£¢™¬­­}¬s¢ū¹÷ŗłTÓøĒĻKw‹ĄĄųŌ­~¬s¢żł£sj™iik}ss@@s÷#£t÷¹ūŗżTC^OGūGøOÓłTū¹ū¹¬ sÖ@t£«}­­¬™¢£łł££˜¬­ @wŪ ųÉ÷ żł£sj˜÷K~stżżssĪ k£sÖ@s¢u £¢÷ŗ÷¹żTCĒ^Ļ÷ĻĒøÓłT÷ŗū¹s¢u ££ÖÖ¢£™«­ @ĖŪ łT÷ @Ö¢sÕttūŗūŗłT÷ żTūŗ÷ŗ¼ ż t¢u ¢£łł ² ū@‹÷j ś ü”ų”}ū”ūtūÜü,Qūķūa!€ūūū ŃūKÄū–t–kšv’’„™Ÿ—›ž›‡Š›ˆ“‰““ųq÷ÆŽųC÷tū”‚ų”ų”uJ ł‡ųt[ł”łō]ūę˜ęł”ųŌ]ł‡śō[ž ÷”ėł4÷”Ž ` ÷ū!y}|z˜ y|š÷Ršš÷Tœ™|y‰÷.}Š|€yūMx|–™zł’Ž’’‘”Ž”÷p””ˆ†‘’‡Ž„„‹÷÷;÷T÷÷Œ÷ė÷÷Ō÷ė÷ś4÷Hhnzh˜ hnœ®Ćųh÷T÷Ō  ühSü\łąV`¶ĄF­£y~–÷ū5ųėV``VūV÷÷5˜–£­Ą¶`Vų ū”BüL÷ļļ÷÷'ļūHMoZdūū9ū÷9¼dM§Hū''ūūļ'÷üLG ūŌ- ėü4L śŌ6 ų4ėk   vś÷ß® w łŌ$ūŠū/Jū7ūI[^_[Z_~}„yhnØ®’™—˜÷“÷{÷x÷(÷ö ų”÷Ząf÷¹ū7p\XTūūüHŚūaGū°-ū‘ūwūŅhŽh‘iw„V‚QūZ:#v’…”z]¦žlŹāĒ÷`½³ėL{»lęī{ė÷,÷+³Ļ÷÷Ŗ÷÷\÷^Ė÷Ė˜Ė’ĢĖū’÷I ÷)vŽrū4. śĄ_ KD@N ū”śō÷ęū€÷CūØ÷ŒŠˆŒŖN®.Eū“üTiüūę÷€ūC÷ØūŠŒŠkČhčŃ÷“ųT­ų ‹÷ś÷$ųT÷$ ųŌūœū?ūØūLūÕūÕūØ÷L÷œū?ź÷'÷÷÷0ŪcGv=<ū‹÷]ū]­÷]÷‹ŚvŁcĻ÷0;÷ūźū'żdųquuqū--ūŁłäü¤ƒ¢ ÷ĀūLūå÷aū÷ū÷ūåūaūĀūLvƒtrr“t—vūĀ÷L÷åūa÷÷÷÷÷å÷`÷Ć÷L— “¢¤  vś„÷$ųT÷$ųæ÷]ūDŚū'÷#÷5ź÷'÷÷÷0ŪcGv=<ū#Šū÷7÷Ėųžquuqū-.ūŁ÷’÷S–…•‘—v-Åy……U*–PN‘OüūÉū_ūÄūZ~w„rsr’s˜w÷ūH÷7ū*÷V3ziU{‘•… źQ––‘•‘¼ä÷gų ÷eų÷gų Œ‹°üS§ˆ§†§ū¬üŠ÷AĶ÷÷:÷NųTū„„ ~”=÷ū÷ūŽLū÷=ź&Õūū0ū†ū‹ūEū·rAū÷Į÷¢÷÷u÷X²ø²¼Ŗ¾˜”’ „ ž ÷”÷® ś”÷5y}|Ō š÷R™š÷ |yūR‰ų ~Š|yūMx|•˜zų]‘Ž•’‘”‘”÷p””…†‘’†Žƒ…kųo“u`„\\`qbuż”ś€udŒ[¢dd¢µsøV øµ£²¢¢²Œ»u²ū’÷; z``KĖū4K++ū4ū4ż-÷3Ž‡ƒ„ūū„„ˆ€Œ‚‘‚”†ųū«ū—ū—ūVĄŒ‰ˆ‹ˆƒ‚ˆ……+*…„‡‚Œ‚Œ‚‚“†÷ūQ÷Qū‘ƒ“‡•ŠŒ‹‹Œ÷&ė듔ޖˆ–V÷V÷—÷—÷«ü‚“†”‰ŠŽ‹’’÷ė•“˜ˆ—ū4łL÷5÷5ėėĖ÷4KĖ ÷I ÷“Ė÷ŌĖ÷“÷ «Ė«÷÷4Ė÷4÷«Ė«÷÷÷÷ū÷ Ė÷ ż4÷ō÷Ō÷“ūŌĖ÷Ō÷ŌūŌż4ų÷ ųTżt÷ żTłt÷ ųTżt÷ ż4÷ō÷Ō÷ŌūŌż4łō‹Kq÷“…Ė÷ ū“łtżō÷Ō÷“ūŌż4ų÷ Ė÷ ū”ųt‹Kq÷“…Ėœš|za ÷÷”ł÷”® ł.ś³÷"&ūŽūFūtA ÷t÷+Ėū ū ųé“čĆįśśż³Šū”ū+K÷ ÷ Qc-b.T5ū˜÷M÷K®÷½ūTzš|«śŠū”ūŁūū ū–ūsRrQnSūSL0ūūtA ÷t÷Ł÷÷ ÷–÷£Ä¤ÅØĆ÷ĆŹę÷÷”˜ yš}«  v®  ł÷öü%÷²üƒüƒü%ū³ūõ÷F 㠐s {”Ŗ J V łTĆūKūi‚``ūi”÷K÷Ćü,÷×ū¼ųQųQ÷×÷¼ų,ž”ł”Iü*ü( ų'ś”ųIü*ü( ųA ÷ śjŪ ÷Ō­}¬s£żł¢sÕttżż¬ tÖ@s¢u £¢ųzųyųzüys¢u ££ÖÖ² ĄśjŪ łŌ÷ @Ö¢sÕttüzüzüzųz¼ żs¢u ££łł²÷)÷+ś÷”w «’ˆ“‡‘ū4÷T’…‚üŌų÷T= š†š–ūŌų™y“xxyƒ}ūŌü€†||÷/÷Tü4ū4r†d°śTN łų4IūTų4÷4¤²fžT÷J„Žƒ†÷4ūTƒ‘•‡”ųŌüūT.||•€÷Ōü}—‚žž”™—÷Ōų•–šš ž ‹÷÷1 ‹ ū÷”ł÷”płŅRÄD—ÄRŅwśŅRÄDDRRD÷$¬w÷śŌIūO»ŠŪGū”õ ÷`÷EżĖ}n\>l÷/ś”÷? ž,•Ÿ™ ¢¢‚¤‡”śØ÷h¬£§«  v÷  ś4šż4oūš&÷™÷H÷)÷; WWųÜøX–gžŌ3ū UGQūäü {y|ss^¾€ÆśŌć÷ ĮĻÅ÷äų ›š££ūė÷ģšü“oƒŒ‚ƒ‘÷åų ėÜ÷/Ņ÷łŌžū” ÷% łT™ ¦ž”ū.ž÷ b œ›’——÷”÷”u3ūś”÷A ÷' ‹» ž”÷ś”ū‚÷”÷”u÷)tw ÷‹÷ī ÷ų”ų”ū”ü÷”ųśū”ž÷”ųłū”ż÷”ųś”ū”ž”÷”÷+Ęœš|zū@÷™÷ ū@s @œū÷Ō‹÷“w ś2o`gfbnŒ‚‹‚‚ūŖūhūŌüū ū®Ę.‰›œŠœīå­ĆÓ/>Čpމ˜˜‰˜ž™Ž+ž>ąńŒ‹Œ‹«|¬®ŠR±iĖŌ±–°Ŗóū÷/8÷C‚‡šŠœ›÷éé÷ĒĀrb±»”ø“£{Zja_q¶‘³–±œ÷”÷V ū÷łź÷Y÷o÷/1÷cųžūCżūšłū÷o÷÷÷GÕõ÷f÷Cūoū:…lRū÷Z÷b÷Æ  ÷ Éų¶é÷Ķ÷Ė÷Ė‹÷ų”ėś4÷ś4łT6V``V6y}™” ™}y÷tūLž”üŅ÷V ūüųҰž”ł÷ųūü”ūT÷łĖ÷łŠūū ÷÷”ŅRÄDśnū÷V w ų÷Tł÷T‹÷Tł÷TłŌś”øno’—q—q’onø!5įõõįįõا„„„„§Øõįįõõį5!łēżTØū«÷›f°‘…‚ƒt//tqé: v++ū÷÷÷ŁōĄ÷÷÷nū+÷*ūmūÜūÜūÜūÜūm÷*ū+÷n÷÷ĄŁōł3ż3y¤¤ĆĖĖƤ¤yūp÷pėėv Ü-„¢ēē¢÷)t‡v¹v÷”ą÷”÷~÷”>śłjł”ü”ERQDEQÄҤ ŃÅQEś”ERQDEQÄҤ ’ŃÅQEüü9™˜}Žū,¢‚§¦~¦§²©ÆØ²‘Ž‘’§ū ÷q£…„Žƒ„„‰†…ū 2s—r–q“t÷-™‰}–}ūN}}‡~Z†T†Yp‚rr~ū叅„Žƒnūū pw†…‰„„„Ž„…«e©f§c~r€rƒqū/s~‰|~ūM}•~™‰÷,s”o—p™pndmfne‡…ˆ…„n÷ „s†‘’ˆ“’“÷ 䣤€„ƒ¢ū-}™€™÷N™—•™˜¼Ā¾¦“¤•¤˜÷1‡‘’ˆ“Ø÷÷¦Ÿ’’“ˆ‘‡‘k±m°o³˜¤–¤“„÷/£˜•š˜łūš÷>÷, >aļ‚Ÿ÷ Œ÷B>‚÷, aļ‚ŸN÷   v® rł”÷ÆūĻ÷yü÷xųū”N÷6éó÷$÷7t‹÷ ‹÷ųö÷Ē÷÷d÷÷I÷.÷3÷WW ÷”÷TU —ĄhnØ®®ØØ® ~ųŌfo1\Š s™\koļŽyxxū<^ūū ū ū®±ūžU/ÆSkł«WŚ÷ ÷?Åø¤Ŗ£Ŗ§Øģńj÷-ĖĢ÷¢@ū ū +6ū ÷ō÷?o÷ū ÷ ūūD©ÉĒŃ·ÅlČģZ'°#ik}ts')«ū2OKebh`i_—ĄmdG1dqū¦nż÷÷“W §ÜmØ]÷÷a÷"WčÆÖ¤·˜½½¢ˆ£…”«»œÄÅ÷I Ÿ‹÷ ‹ö÷Ę÷÷e÷÷ ÷G÷.÷3÷OĄ׈÷”śŌU 7ĄhnØ®®ØØ® ~üŌGNOHūōū ė6ū ū t@ūK̬÷-*ńoØsŖrŖÅ^ū ÷?<kOĄł«ĆēÆžĮ±÷÷®÷ ÷O ÷ÕYū Ox‰xˆyµt¢R]׈s…sv­kžc\k}\vsOŗŠ§1f÷ŠO ÅzÄk»‘”Ž£¢OĄ½~½r·™Œš™ĖvĖd½·Ą÷OŒū÷ūJūū.ūeYū$n:moū“OĄnż÷÷¦²qĻ1©d­_®`±cĘJlū2ļ)t£«}­óļ°ģ¼ŖĒĒĶŃyĒmÉ÷D׈÷÷ ÷ ÷ż’83‹łŌłŌą‹H ‹ w ې ś@ūKūMū>ˆˆüŲüĆüŁųĉūM÷>÷K÷­÷RĘ÷4÷)÷<ū5Mæ£n½‹£ØÉæ÷<÷5÷)÷4÷RPū­÷yć ‹÷C łė°d†rū“3CÓćłT÷¹ ø~ϧœ|šzūŌū3ūūū3żT&¹ ø~ϧś4ų“hū÷ŽłJé÷„÷–‹÷÷{÷÷{÷†÷{÷÷÷łJ÷{żJšś IYU:‹Š=YĮĶĻææŚŚ¼WGŒųŻž ųéjŹ8Ke`bz…|Švwüū{‹Žł ˆĢ‹÷{&‰»©ĀŠ÷÷,÷(ūiü"÷śz ü’~÷”÷”÷4ųtł46y}™ųTk ™}yüTł4ūō÷8ū÷0ūų”¤ ÷żEQQEEÅQŃü”ūūū0ū8/ ų(×üy{Ž˜€›‹Œ‹‹›˜˜›¾ųwųAA īrųō÷ ūŌn łT§żT? ų Iü”.ž÷DūDż ż /÷ū7ł ł ÷DūD÷‹÷ś”÷r÷ łh÷ō÷ōö ūŌ^˜Gof²¤÷“ćÓC3żT”ūŌ^˜Goj ÷ŌÄ ž śUųŌ÷”ųŌ÷8ų^ł!ūY“ū÷ķė÷”ū1«ūµ/śŹ÷§)ūūūYbµē«÷÷1÷”+÷÷ą ū“ė… üŌ{+ū“÷- ūūR÷zūf÷Ģ|³X°m}Ą[™YKKkK+++K+ łŌ1Ėė+Ė++kĖĖĖ™½Ą»™°©³¾÷̚÷z÷f÷Rū÷hĘ”|¢w”ު陋÷_÷¤÷L±ł<÷ŖĄų÷L‰”…‘„’‚Œ‡††‡‚’…’„”Š@€aȇ’ƒŽ†‡†ˆ‹ƒ„„“ˆŽ‹‹“†’NĒˆ…Ž…†Š‰ˆ‰‡Ž†‘ˆˆ‘ŽŖiŽŠ’†‘†„‡‡‡ˆŒ„…†’‰÷ū‘…’‚Žƒ‚ˆ‰…‰…‘„”‰%€“ˆ”Ž‘ʆ’ƒ‚Š‚„†…„’†•Œ€”’‘ŕŠ‘ƒ‚Š‚‰……Œ„Œ…“‡””‘‘Š‘śXśPö "÷t«­‹»ŠäD §s£]C$‹ūr[¬‹«÷tÄ ÷ ÷”w ÷÷÷w ˇü?ApDU8ū”8DĮÕpü? Ą6 ūŁś\•¢†§xüTųT˜z‘{{z…~üTüTŠ ÷”üT+ ÷”'ųT÷”„¢›£•ū÷ū÷ū÷°÷ū÷1÷‹÷ū÷!÷¹÷8÷’ 2 łZūØūZūÄū›.n8ū„2ūūŖūY\uZQ m{¢§·”µ¹ ÜrŚÜ÷…Ń÷¬÷^÷-Ʒ֫Ϧ­įå®č† ÷ ÷[÷ ²²”²‹Š’@”{Œwx^^]U–pž[›c”ū\÷Ė€÷tÅ’ «‚™Æø•¹øóbÜūdeeū ū»ū Š@ū$fb%’ ÷aūa÷>"ĀiĘpČuląßečĪĒž«Ęø¤Ć« ¼š¬›ŃÆū’īśō÷1ćÓC3żŌn łŌ÷“ū4ö ‹÷8 ūūū3żŌ&łŌÄ üw Uś”÷~÷1ū&ü;ų*2ą26ü;ü*Śś”—÷T^ w ÷ėqXsImū[FHN¦¢MūoŪū‚÷‚;÷otÉpČĪŠ»÷Ķ©•£¾—„‘‹‰…Õū&›o–x”tt_ūJdwr•yÕūę0÷A¤yŸ²Ģ÷·¢¢u€ž§{÷&A‘y†‹…†÷”ł   v·(TśüQrLyJ„γ¾Ź£ÖMfEpB}ŹP7².ūGū$ū%ūFrŽrsū ™ūƒ÷ū3÷Xo[{TOūÄ(āQVYš`£Š‹‰Šū1÷ū÷(m„pn‡nvwŽw“ū÷ .÷"ˆ4ūūXū+prŒŽq/÷#÷>V÷Kųę÷Łų€ų?™‹™Š™ʹĀÄ·ĖžłL÷°÷”÷°÷>÷éų“śh÷"Ւ³õ÷"÷°ūwū„+ūū{ū?ū>ū°÷>żĢ÷éłĢ÷w©÷°1Śś'÷A‹÷Ŗśh÷Ŗ°pÖ ūē÷pū“÷Å%²„™£ŸŠČD °§s£]C$‹8rw˜s²’÷Åń÷p÷“÷ē  v™÷Tł”÷Tų”÷T śT÷ ūTż4’ųŌ@ +÷TĮ ū”( ĖA÷)÷ ÷C ÷÷”w ÷ą÷K łĄ{ū@s @z™… łĄū@÷ ūtł€÷t÷ ūłĄqųō üō|ś ÷÷”÷ū”ųūŸü÷Bų÷T« ų”ūz÷i.÷]ū,÷+ū+÷,ū]čūiœ‰Š‹‰{{…€€}„zyūj¤p¬ˆ÷Ån÷†ū†ØūÅjަr¬÷œ’™——˜‘œŠų”‰y÷ņū'÷Żū÷ŒūŒ÷ūŻ÷'ūņŠŠ‹Š{{…~„{yū#j„o­‰ųŁiųcüc¬üŁi§q­÷#›’˜—˜˜‘œŠœ‹÷÷÷4÷÷ų”Uł„÷4ė÷4÷÷ś¤÷Ō“ ÷”“ ÷ū4‹ū@q÷Ō…™÷ ūŌū2ųt÷1ųvœž˜ł¢ž~z÷1üv÷Fū4¦ƒ¢ƒ¤ūYųņŃtH¼Aż¢AHZEtūYüņƒrƒtpūŌs ™œ ś÷ V ÷ śųéū4ūTūŌūtüüt{ūTs ÷EūuįūFÅūFē6÷–É÷!Ž1ÜŃ÷=Ū“÷÷ ³÷ļn÷³ū_÷Fū(¤ ųwŅRÄDūüšū™÷\ū‘÷ū’§÷¢÷’§÷‘÷÷™÷\ ū”Ū÷D÷ū÷~÷”ŸĖŪŪ÷T÷t÷; ż-÷“÷t÷‹ō÷Ņ÷ß÷Y÷%Ę÷C÷C÷%PūYūßōūŅ÷tū‹÷Kū™÷qū÷ē÷ä÷uū"÷ūn„–Ž˜˜@ ­V``V~Ž~€÷EĶūäūūēū™ūqŖųTßHųT÷ J `ł÷÷ž’¦…¤„¤wŸr‘ūP»Ą÷N’¤„¦xyžp’r„ūNV[÷P…¤wŸr‘q’q„yxūūū÷yžp’r„r…ww…r[ūPūNĄr’p„yxxy„p’rĄūNūP[r…ww„r…r’pžy÷ūūūxy„p‘r’rŸw¤…÷P[VūN„r’pžyx¦„¤’÷NĄ»ūP‘ržw„„¤…¦’ž÷÷÷ū}˜žƒž‘’ŒŒ‘¤’ŸŸ‘¤»÷P÷NV¤„¦’žž’¦„¤V÷N÷P»¤‘ŸŸ’¤‘¤„¦xÅ ÷÷/  ÷.÷÷½÷o°÷”÷TÆŠ8w°rųŌFPPFūß s™\kļo°Žyxxū >\ūūVū?÷ūCkł«õŅåŌĖ“¹±¹¬Ą˜ —”—”¢–¾÷§w°ąÖk+ū+JLųŌ÷?÷ū ÷ ūü š“’¶·÷=ūāū3ÆŠū`ū?.Qm\ibgbjnG5[ū“no°ż÷÷“ŹīfuČeóõl÷Ö °˜³Žµ÷=÷ ÷÷ ÷ Å ÷½÷.÷G÷c÷/ ÷÷n8`÷®XūCū>ūū[ūB¼÷ nøžŒžŽa¢tĹ£‘£— o8i«x³ŗ«™ŗ £ūßFPĘŠĻČĒĪųŌv8Ź+Ģ÷ė֫ঽūt——t—t™u¬V±]“]BĖŅ1õ«ż÷”Ė™ ųŌŅRÄDo8ū“[Gį¬ng“i“mŗčQ`÷?ūū3ū4ū=_’`šbü ūū ū ūū ÷ū ÷ ÷=Ža˜c fnø‰}Š|}K K³Y®XІūSŠ÷#÷L÷ō«°ńn8”Čī°Ź÷“w÷I ÷÷/  ÷.÷÷½Ģē`w K™ łēPūVūū?ūCkż«õ1ŅBĖ]“]±V¬v˜u—u—t–ū¾§ą«Öėęą÷Ģ+ŹųŌĪĒČĻļ`ŠĘPFūß÷` £ŗ™«ŗ³xi«— £‘£ēP¹Äta¢Žžž÷ ¹?ū÷÷Mū÷ūQ‰²YK K}|Љ}÷Pf c˜aŽ÷=÷ ū ÷ū ūū ū ūü šb`’_ū=4ūū3ū÷?`čQŗm“i“gļ`¬nįG[ū“ęą÷$łw÷“ʰī”ȱóŖõ÷÷I ÷½÷.÷G÷c÷/ ÷Ģ°rųŌūZBū —ØxxŒŽyatRt]ss‘—vikcx\j_šŸqūßưFPPFGOČĪųŌLJ+ū+kÖą¦÷½¢—¢—¢—”™Ą¬¹±¹“ŌĖåŅõ«ϰłkpūC÷ū>ū[ūł”$hnØ®= —Ø °÷”ż÷kōfńuČfīŹ÷“ŅRÄD—Øżnū“[5Gjnbgbi\m.Qū?`ūū3ćū÷<µŗ‘›²ü ū÷ ū ÷÷ ÷ ÷÷ p÷=²¹™­žϰ‰™šŠ™ĖĖ ³½Šư÷SŠó÷÷Lū› ‹÷ś™÷”Hw ÓüŠ÷QūQø—‘{zH÷00÷ūž÷ž0ę§ ęę÷ž÷žĒ—’{zz„{ūQūQųŠøõĖ ū› ‹÷”ś™÷Xł÷7 00ūžūžø{…zXz{‘—0ę—„›œœ’›——÷Q÷QüŠ÷ųŠūQ÷Q§ ęęŠ÷žūžę0—‘{z÷ø ž ś™÷‹› ł÷7 00{„zz{’—ūQ÷QüŠ> ųŠūQūQ÷ § ÷ž÷žęęĒ÷žūž—‘{z÷Š~ čŹū÷ś™÷”‹› Pł÷7 ūžūž00÷ ūž÷ž§ ęęŃ ÷QūQųŠE üŠ÷Q÷QĒ—‘{z÷Œ~ čŹū÷÷ˆĀ÷%÷‰”÷š÷šžœš¹÷Qū4÷.™‹„öœŒ”­÷&‹÷»÷E¬ŚŻ‚”ŗ§„”»Ÿ“ævŸ÷”Ż'­€` ß'­€÷¦ü–’”™‡–ˆ”‡~‚ķ'­€…‡‚„‰”‰˜‡‡‚„|iyz“Šr|Œ‚†‹„‚ƒ€–x|…~t’}–uz€š‡€……Œ…„‡Œ—ŽŠ†‰‡‡†~€}‚ƒƒtƒˆ‰yzr«„Œ‹jŠŒhv˜…§ˆ–ˆ—Š‹ƒ—~|‰–€’Ż'­€€‘{‰…‘|€€Žˆœ‡ƒ“Šˆ†‚ƒ‘~•oz|’Œ‡‰Žˆ„’…‡ķ'­€„†……†˜r}sŒpw˜hž€”†©‰”™‘‰–—˜‘‘šŒ¶jh†yˆ~Š|‰‰ŒŽŽ‘Ÿˆ‘—’™‚}}˜|x}›o†–wƒŸ•ƒˆu€‰‰x –Їˆˆˆ‰—z‘‚—‰Žp“‘}…o•~’v–ˆØq‡yˆ†„v“}•}’{”o”…Ÿ…›ž‚š•…yŸ~—t©Žˆ€˜c®“ŸŽu“‡ŒŒ€‚‘‚‘–yšu‰u~‡ž‡“„˜x‹†™ŒŒ‹ŒŒœr™—}–‹ ™‚˜|‘~”†Žg¹˜Žw†ŗŽ—‹‰‹Œ—„É›Œ€Šˆ¦Žš|Œ‰‘Ž‘“‰’ˆ“€’„‘ˆc„ŠŠ’Š’…x|•ØŽ‡Œ‡Ž‡ÅēÜŲėĄŒ‘“‹“‰•|˜‚‡“ˆŽ“—’”Œ˜“‡…”„“„“ŠŠˆ‰Š‰€”v‡ƒ‡„†ƒˆ†‰ˆ‹‡ŒŻ'Ż€©›Ŗ™¬–‘‡‘„”„…‹t‡–|£•šŠø…‚ $’‹|”‚””~•‘”‘Ž’’ˆ‘dŽž¢’“¤‡“†Ż+¾€–…—€|’Ь‚†~‘ސ”“”Šv†™r£½‰y’­””ˆ’ˆ–s~Œ݇®€–ŒuwŒ}Œ{ž~|ŻG­€‚‡|‚‚}}xŒz’Šut‰‡…„‡ƒ‰ƒ‰€†œ”l„Š Žœ‹Ÿ„݇®€™† …‘|‘žˆ‘‰—…Œ~Ž€|˜rœ“Ž”•ƒ‘Ż®€ƒ’‚“•“–žŽ™“¢kˆœ•˜ŽŠ—•|Ÿ—’•‘»”…”…§ƒ‚‰Š‹‰ß'­€“„’|}‡”„y…‘ސ‰‘’’”†Š–”‘Š”Š~…‚–ˆ‚’zˆ{¢…’‰ž–Š|ŽŒŒ}‘{œ‹‹x‰ˆ…‚|‚†ˆŠsvŽˆ~šv‹z‡yˆz‰z„ƒ‡ƒ‡…„ˆ‡†y†Š•–“‘Ż'­€ū7žАЕŒŠ›œ–Šš€Žˆ–—œš——–—–Ž¢ˆ™†£‹¤‡£Œ…œŽƒ’”’‘’‘•‘ ¢—}•r~˜€“‡—““›–w›†œ†‘…˜€‡Ÿ’Œž“€˜™”„‰w•‰‘ˆ“ˆ“‡–‘…/*ūGūs ūk iųĖ@łų8ūæ"ōW÷ż=ż=¬ tõū÷ł>ł>łųGŸšwwū|ū&xjūUö÷t÷¹÷=”‘’––—…”’“N,”Bƒū‹÷]ū]÷‹÷Q÷?÷÷FŹ–«—“¬ Ž  ÷ś”÷÷łūž”ų”÷ś”ūüų”÷ųū÷żŌq ł”q ł”q ū’ūrŽ{Ł¢t›qū÷+ ųüüzž÷  łzųųž§£  vŸ ÷;Ÿ ÷÷”÷÷ł÷1÷ų”ūłżż4ū4U ūԜ ÷4ż4üt÷ż”ųtū”ž ł”ųō… ūō÷4@ üŌ„ ū4ūō”ü J św÷$ū$b “”Ž“¢•›¢„ųT3üTqt{stožy÷$ū$ū÷ū÷ū÷÷÷÷$÷$ž§¢£t›qüT*üTq›t£ˆ’”‰“œ›’——÷$÷$÷÷ū÷ū÷ū÷ū$÷$Ź ÷*ū$÷$÷÷÷÷÷÷ū÷ū$ū$Š ųT'ųTµ ū$ū$ū÷÷÷   ÷)ū” ‹€ųåłWÖnåę””Ž”|`_ƒ]ū#ąvūŽū¤:ūé[ļ÷ĪŪéøóŽśĆż÷vV÷ļū¹iūūū\ū\ū÷i÷> ö*÷4łž÷4öģ÷6ž”żLłTüi ųŌūu܎÷¤ūv#6ū]_“š`Žuuu0n1W@óˆé^Ī;÷ļé»÷ūųõL ū÷UūU`ž4÷Uū5÷Tų”÷T›÷TūT`ž4÷Sū2÷SB‚°÷Ō÷G zyr‚rrr”yūb÷cy¤¤©—¢ Ÿj¬§d¾;¾d§j¬ Ÿ¢–ؤ¤y÷dūdy•sqżSłUmtvw¬jo²XV``VX²o¬jvwtnrr”yBūd÷d⤕¤¤¤y÷būcy•rrśżUŲnÓTĀūd÷dĮUA©?€?BnUUū'ū&UVlA?>ØCĀT÷dūdUĮÕm×ŚÕ«ĆĀć3STk@<”?ØBĮU÷būcTĮŌmŲ,€×ŌØĮĮ÷'÷&ĮĄŖÕ×÷)÷; €€ų÷Jū÷,ū>³„³šŗ¾÷ KQtd_÷O>ūK÷ūj¶ }Œ|Œ}ū,D!ū/ūGū‹÷]ū]÷‹śŌv w ÷÷& ÷÷÷ćü‹ł­ų#ĖÜü”õ Ėü#ü‹ż­ū @Ą*÷!~÷!Ąģ÷ @żŸłiŸŖ°ų#÷ü#fŸl÷¤üAż\ ū÷4€v÷ō÷4‹÷‹÷4÷Ō÷4Œ÷3ųT÷3ŒĖĖ÷o@śTł$/ Ü÷ĄKųų"˜””‰ ˆ”~žx•ūː‚€€ˆ†‚żFüū͇‡‡Œ”Ŗ¬ˆ¬‚ņFīūŠĮ6)©-1?pWSRWn?’=”%Š(÷EUąīméþ–Ÿ·‘‚’„”…÷BƒūB‚…„„…‚Ÿ_X–S-(mU6ūEF(‚%„=Ø?ÄVXĆ×påOéķ©Įą÷ŃŠķ”ņެ‡¬‚ŖŒ÷ĶłFü†”–ˆ–••”÷Ėž•˜žŽ” ‚”y˜ū\ł&sqb]£NEŸ²NūĻešČĆ£„“—¹ĒŅwdČ÷G±&NS6ż}dNDwOĄ]b—£qNƱš÷Ļ²ČџČ¹“s„ČSe&ūG÷Fųł””ŒŽŽ“’‘“““„„Ś\}ƒw~vt€÷ū:ū4+q„ƒ“…“ƒ“ˆ‰Œ‰Ž‚“÷4ė÷ł”ųC÷KżtüŌųōüüŚ÷ېŒŽ÷E÷ųœü, ū”b÷‹÷÷”÷‹÷Ÿ‹÷÷”÷‹÷Ÿī° ~ü4dYztd÷Ü÷P@ ü4VAlffü,ü,fflAVż42 ī°ų“ū“É™@ ü“ūiīŠūæūæūéł?ūæūæųƒūšfflAVū”ü”łų4;ų4ųü4ī°łžōžłų4÷0;ų4ųū’ū÷ś÷÷Ž÷÷÷Š÷ł—÷|÷+ćfąLÉüŁųٳdU¢Sū55ūT¢T³dų.ü.…‘“‡“ ÄÄ “‡“…‘ü.ų.|› ”²Ø§±””‚|›ųŁüٱe¤WT6LL6UV¤±eżœł[»oĢĻ÷!÷÷÷"ĻĢm\»ųņüó…‘“‡” ĆĆ “‡“…‘üńųņÓB)“%ūhū;ū=ūh&µ)ŅCłżœMÉąeć÷0÷ ÷ ÷0tŸ÷”Ģ ÷ą÷÷÷÷ųųł”ü÷ų4@ żŌ„ ü4ūw ÷ü42 ųŌ6 ų4Ÿ²{}™÷­ū­˜~œbxžü”ś4‹ūTq÷Ō…÷T÷ ūŌłkĄmŌe±ū¬÷¬±eB©Vž4÷@6 J V śō ‹“÷ąV ÷TR łR łR  ‹“Ėw® Ÿ« ų”^rü4. ū@(™7 ś€śō« rü4. ū@(™7 łTpū@(™7  ū”÷÷'÷”)ķ÷īØ÷”ž÷÷ī«õž÷ h÷ū ÷$ōJ€ų7Š_æH›ź÷ćūįū,õĮ Ą” «¬«Š`djXg]„S“ŽĖˆScfzhebŸ¤pR3Į ^øĖvŹóįÉ÷ł" OūŽŁ÷m¬÷(ī;Ā.?GdFjąP§œØ©®¬ yi7ūvoūMyŽyŽy÷žū4³ś€ś×€ūų(!ūūŅ?žœŸš–”:Š:: @(÷ćrū“³łTpū@÷   z™|™€,  ūõųŖ÷ł$÷® ąłł@QĄ§ūĖł{pkœgœG©R”[™ū"“.¶_ø_øu¹¼Å”¼ø²²øČŸ×ŪŅmNĘ­g®G­&™‰߅—ŽŽ›š™¶†Č‚Ś„愳„„A£P›_“—AT’eūAūa6226^%ūO›L«Jšnœpžsųū”Šo¹s”xĮZ¦WS]{`lcmcbnXzyY\‚a\^’šcb™hžn£n£pŖs²€z¾fą%‰_w‡hY+‰Wƒ~€„‡•ƒ¢‚²€÷ cvÕ͉ĀŽĪ’™ĄĄ˜½¢½©¼ŖÆ¦£¢¬¬¢­š°§Š˜ŅÓ¬‰Ŗ†§‹÷ˆū÷ś½é1č5ć÷h÷øłv÷9öU»!݉¼}›t–{‘Dūūį$<–Tš;§J³Y³YĒbŚllŚź|÷ģą–”ŌԔǩ¼°»±±“„·œ©™“•¾•¾•ń†÷+Ž}ųƒ‹Ф‰Ÿ˜ž‘˜””¦ŗ’ØŒ§¦’—•””‰œ‡¤yL„J…GŽūa•7‰5™ˆļØŒ„”t™|’mŽ`P„šūv˜†ūG#„?}Zhzdqcwuvltlsj{h€xPK‚GQPš«Ob”kŖt²lĮ{·Ü}÷¬Š÷yšŠž£Ł·”•œ˜„“³¶“Ž‘³”‰ĖŒ™Š|nŠa`ŠZ‰U‰•‰TSŠR{S-ŽdeŒh}~‹Š~Ž3U—ˆš‹ŠŠś÷. ś@sĖZ ĄZ ‹b÷”‹÷ų÷Ōų”÷4M ųd ü”ł”y}}yūŌy}™÷T™™÷Ō™}yūTų”üc ü”ł”c ų%÷÷Ō… śĄ{žŌs @œ &e¦e¦śO ö÷¹÷¹ö ÷.œ…›—ūZ÷Z—{‘zz{…śśśś…{zz‘{—÷ZūZ—›…÷<‘————‘›œś¹÷RĀ÷ūO÷XOūXūXO÷XOĒūXĒ÷X÷XĒłrü6Āżvł2Ā ÷ ÷ ęŸ÷”÷÷÷& ģüų”©‘šŽŽ÷W÷WŽŽš‘÷2ļū”śü”ģ÷”śŌIž”*ūTū4g[wrr÷ūZūZTT•·¾p_ūC‚i‹v9U:j\łi÷3÷÷÷3śT-ś”÷TĖ÷9÷Öų9÷-ų÷”ł:R÷ ūŁ%Ņz{‹{ūūKlūGū Æ÷8÷ų’¢Ž££ū¹÷ój¶m½ĆŖ–„•؈ts‰tū4¬ąAüE÷ É÷ž÷÷Aų“÷,:÷ūMūKūū ū,ļū‚÷F÷ŗī÷śfęū”ū”ū÷”÷I ÷”÷”÷ū”÷”ė-žTū>ū ūū9÷÷÷,°÷;ųIūKū˜m˜ xŠK¬ū0ūœūsuūū÷æXū¬T~VqZųhÄ ū”ēų¢Ē÷zĒ÷Ģ÷÷EŚ‹÷M?÷M÷u÷Z²÷MJ÷!÷›÷ż`śŅūCū:Oū)ū4ūlÕ÷T÷d÷ˆæ÷8œ›‹‰œńD÷=ū ū łņū\(ūūF'÷‚÷,÷ Ė÷÷÷MŻūū,ūųoLL„~NūJcū'ū6ūRū]÷<ū#÷V¢¢Ž£ū`lujSŖY¬`ūG†ūŖ]2ūHva{]\ū|÷¢;÷O÷(÷1«ī÷ż`ąÕĀč÷÷¬ūĄ¾÷÷÷tŸ÷÷Y÷ (Éż ÷÷Śųīū”ū”÷”ūż`ū”ū”ū÷ ū ÷÷”÷”÷)‹÷ė÷4ų“÷ė÷E ŅÄ÷÷”Ÿ ł”ųė÷÷“‰{r|€sv>Ū÷(÷÷üT÷+÷÷”÷Jū÷~ūfūfūū~ūJūJ÷ū~÷f÷f÷÷~÷Jų”ū”ƒ ū€v ų”C ~ļ ü”÷łŌIł*ū€(  Aż÷ŌųŌčłŌP ż÷”ųŌč÷ŌMž’÷ś”ĖųŌłśŌ’ üTüT„{zžųTüT÷ž’÷ś”‹ųŌųŌł“$ž‚ųTųTu t~÷”‹÷ł÷ 8÷4† śōłū€ł”«‹üō~łžō÷™… śĄ{ū@s @œż@wčųTP ųMżKųŌčųTP ż@wčłŌM ūr®  łĪmjingrū;ūū<ūū7ū M7#?ūŠŠū#×É7ū7÷ ū<÷ū:÷f¤iØm¬ż®÷śŌćBÓ4ś@ V7)0šūŅ[÷/ū÷1ū÷/ū^Ģ÷/ÜŒŒÜ÷ēøĢ÷/÷÷1÷÷0÷ćČŽš÷ł6÷˜ū;÷$ž÷Žłī÷Żp÷ńś#ūŽžs÷Ž °ģŠEÕūūAA*,Ņ?÷‹÷ÓןŠŽżm÷Äū6÷"ūmpūF=(G`°÷$ūŻ‹.‡ž‹÷Żų½©ŽØ“”Ę£ĮČę÷ »0ūü¦÷Żå w ÷”°Š÷-ų;ūķ÷ķü;ūYūS<ūū!ū÷Ź °÷*ū÷āč÷½÷÷®÷zūzū®ū®ūzūzū®ū3ū'Ó÷)†’‚‚Œ‚‚ˆ…„Šūū€€Šx•~°ūD÷&÷l&÷yų;÷ķ÷ķų; ūóĆėĶū’÷’¢sj™iel{ppū”÷”÷÷””—˜˜†—‚”m©”o¹„¢•žÆ­»ÆĮ¤¤yü,ų,yr•rUg[giyxtq]§u©m”‚~~†‚‚ūšūš‚‚†~~”‚©mu§]qtyxgi[gUr•ryų,ü,y¤¤Įƻƭž•¢„¹o”m©‚”—†˜˜—””÷÷÷ pp{lei™j£t÷’üt¢u ¢£ö÷² t€Ūųų5 ÷TųT5 ų@üuĢ^­9v:p%"M$¦%¦Mō¦ņ”ÜŠĀŚ‘šų”­® ­‚‹­‚ŸhƒiųĆūń5 żł5 ųTūT5 ÷ŌüTų‚ü&ų&ü‚ü‚ü&ü&ü‚ū@¼ū;ēū$y—Ÿ€”z”Ÿ–—ē÷%¼÷:÷@ ‹÷ś”Ūś~ų4÷ōū~ūŖūŖūōū~ü4`_ސ`R‘`e9C/R&a„¹¤ĀžŅ¦ė4½ūAķ'÷"÷)÷Ŗ÷ō÷~ų4śü”÷öü%÷²üƒ‹üƒü%ū²ūö÷F ć u{ŸŒ‹Ŗ   v÷”÷ł”÷÷ łT~÷Ģ÷œūDūdūdūœūDūĢWX”YV•_lw}v~v®ß*ĆūÕAõ÷÷d÷œ÷D÷Ģ÷÷x÷ÆūĻ÷yüłŹūo÷6éó÷$÷7Nż’ū” ‹śś ś^”‚‘~‡‡ŠŠ‡ü )÷?ųcŽ‘‘‘¢wžr‹ūÜvy~x†ū]żĶˆ}|—„“—‡–‹Œų*šūYż¼†v˜v”„АŠ›•š“ų°…’šˆœ€— ųŌ÷÷T÷ų”ąp ÷“ą +÷Téü”÷Tė6 ÷Ō@ ūԁ ėūTü”EQQEūT+÷- ūŌ2 ÷Ō6 ÷Ō@ +÷Tų”ūT+ ÷Ō6 ÷Ō@ +÷Tų”ūT+ ÷Ō6  t ÷4Ÿ÷”÷śłX’vvuuv‡„vüŲHNNHHNČĪ; $ū÷ ū ÷÷÷ ÷ ÷ł”ų½Ž‹Šų1ü÷jüü üūjü/Љ‹‰ˆj ”’‘’ĮÅĮ±ŽźŻ÷˜™÷ ÜĘźźÜ÷™˜÷ ŻĘźŽĮeUÅ…’’‡”, ż”łk; U ) Œ”Œ  ”Š  $ ÷I ÷)vŸ ų÷”÷÷9÷”ų÷Ōł”ū~ųü42 ų4żż ‹żTqĖ…łT÷ K÷”ż4÷æ÷æūæ÷iūĄmŌe±ü,ų,€–”~“÷Ü@ žŌ÷ų“ū4Éżś“Ė÷4÷‹÷÷#÷÷x÷:Ė÷4÷ęśłtśT÷ū¼.÷Jj ĄöpFj †÷4KqHaZxuuvwtD6O'ūūx÷OļDąw¢u x”a¼qĪĖ÷\÷_÷ ÷Ię÷I÷_ū ū\÷÷¤ū—÷Dū‘ū‘ū—ūDū¤$­2Š?śŠ?ę “ nzykjs”t›z{z‚tsjœm§yƒ}†z{ęJ¾lÅQ„ÅeŹŹÅ±Å„žŖĢ›†œƒ™§œ©¬£‚¢{œ›œ”¢£¬y«nœ“öęöŠ×Š×­äņ ÷÷ ®  ÷ō|™zś ÷: |™zƒ‚ˆ……ūŌūŌ……ˆƒ‚ƒŽƒ‘…÷ÓūŌ…’“‡”™šœ÷T`, łtŠś _ ūTD`˜ zš|«÷)‹÷t‹€w ųō‚‡ƒ…„ūóūó……‚ˆƒ‚ƒŽ‘…ūō÷ō…‘ˆ”“œ™š÷t÷ō†÷T÷ ūō÷t_łūtS ÷)‹÷”‹€w ł4z}|yūtūō|ūTq÷ōūty}™”“‘’÷ó÷󑑔ޓ”“ˆ…‘÷ōūō‘…Ž‚ƒłū“S ū’÷ ö÷÷”÷÷”ūt÷T÷4÷óų÷T; $/ = õś”N÷[c÷Īū‚æØG„=BŚ^¼60Ė÷EQQEĖ÷ ˬˆ¬u¦ūI7#e  #±Ķ7upˆjjū_×pæB:óø!5įõܾŌŲ¦÷_“‘“›±ū‚WcūĪū[ū7ö+÷4łž÷4öė÷7ūŌśi ū’t÷1 ÷Ōw‹÷÷”¬‹÷‹÷½ž€w łŌ™ õ5į!ø7ĄEÖpüķ ÷÷m¦÷;÷4÷Uų”; …†ŠŠ†²ua¦[—ÄRŅ¢”’–žü&ķ ų&€ž”„¢wŅRÄD[apdu½Œ††Œ…$ü”ūU÷;ū4÷mpūūh÷]ū@­÷(ųž€Ö¦ĄŃß w ÷9÷“÷tą÷t÷“ł~÷ų”ūżōKėĖśō÷1ū÷4@ üŌ„ ū4ūūś”ųś“šKūĖ÷H ¾ łÄ÷“ū™÷qū÷ē÷ä÷uū"÷ūn„–Ž˜˜Ą`¶VV``V~Ž~€÷Eūäūūēū™ūqŖųTHųT÷ ÷)ž ų÷Tų÷T ÷T śøKųĖõį5!ł€ż”ļ w ÷@ Ėł”÷hū@÷@ūhū€*żt÷ łT÷" «Ėvū’ū” ‹÷)łĄ; U ÷ nØ®ų4÷@÷ nØ®ų4÷@ż:æB×pżŸŖ÷‹ łŸצæŌÜł”łIū”÷! ż“D÷tü”Ŗ÷÷ üū÷÷”÷÷÷÷÷ų÷E Ÿś”÷ōBżTQłT1÷Ō,żTQłT1žü“Pū’ū”÷÷”‘ Ž ų÷t! ÷Ō!÷”Ė4 ł”üTœ|šzKz||zKzš|œĖœššœū”÷Ō1 ł”üTœ|šzKz||zKzš|œĖœššœū”÷Ōœ|šzKz||zKzš|œĖœššœū”÷Ō% 7 ū”śąŁ V ~ś÷@Iū*ł€( w Aū’ū”¬÷÷ę‹÷÷÷ģ ÷÷÷Uų÷t! ÷Ō!÷”Ė% D, ū”ż“Ł ~÷”k2 ųT6 „«÷”ū€ü ‹Kqėū+|Kq÷Ō…Ė÷ +÷ė… TĖ÷ ūŌ‡Eų”«IūŌ÷“pŖ@ üT„ ū“÷6 ū( w A÷)÷ ÷ ÷”÷ęž ÷”÷÷”÷‹÷”ł ÷& 5 üų”©Œ‘–ސ÷W÷WöĄ–‘Œ÷2ū”śü”5 ÷ł4ˆĻ   ÷”ų“ł 3ū€*ūŌū4hZwrröĄūZūZrrwZh÷ Øn®÷ū!÷ū÷"÷"÷•ųļ ÷"÷•÷TA ž ł”÷”÷÷‹÷”ė÷4ē‹÷4ė÷”ł€w ų4ˆö€Ļ ł€  ö€żłt÷ų”ūł€žkė« ÷1ū4÷4@ üŌ„ ū4ū4ūśŌ÷ōś“škū«÷H÷)‹«÷T÷”k÷”k÷”÷T«‹€¬€ųŌ‹‹«ū“Ėūō«ūtĖKū¹÷ōŠ÷A+ū4KkĖü4Üū4ūT÷t+kkūT«k÷ƒūTsū÷Tsƒūkk  «k¬ė÷T÷t÷4ü4KkĖ÷4ė÷AF÷¹÷ōĖ÷tĖ÷ō«÷“Ė‹«‹  vų÷ ÷÷”łł|g‹>DRÄŅ‹‹÷÷÷”üś”üTū÷Tł“Ė«k÷TžTkūütkūĖKūŌūh÷@ū@÷h–õ‹–ūūTūT~^ w ÷T> ÷Ōü”ūŌ> śE ūŌų”÷ŌE ž÷”ś4 ^ w ÓūŌūŌ> ÷ŌūŌ©÷Ō¹ E ūŌ÷Ōõų“ żŲśzøśZł÷4z üųųųY“‡”B ųz üųųųY“‡”B żŲśz˜śZųēųŌVųVü’÷!śZ÷ ÷t3 ų3 ü’÷AśZ÷ ł44ų4ž’ŲśzøųŚłśt”‡“B z üųųųYž’Ųśz˜ųŚųēųŌYY……‡‚ƒƒ‚‘…ųü÷H ……‡‚ƒ‚ƒ‘…½Ye ü’÷”ųŚ÷ ÷ō3 ü’÷ĮųŚ÷ ł“4÷)rU ÷ ų“‹łĄqłŌ÷B œš|zżŌ÷łŌ÷ žŌs ų“4KGf÷/ų”'®KÓąų“œ÷)‹ė+÷TKĖĖ÷÷;÷”÷ź^ų4÷”śŌzłT… žŌ{żTs kłō†śŌ÷ żT|žŌq`ūtłĄū4+VÓ`ć@ćÓ¶Ąė¾ž+ä ‚„„‚ü’‹Ė÷Ė÷ ÷1 ÷& @ų÷4‹żŌqśT…łŌ÷ žT÷śTćCÓ3żŌ{žŌs łŌœž‹»÷4»ł”ė«÷9ėųŌėųd÷_gg__gÆ··ÆÆ··Æg_÷d÷4‹ü”qłT…ų”÷ żTūTłä‚„„‚ä ÷“›éü”EQQEž”Ŗų”÷ a śŌ÷tł” 8  v~Œ ł÷”ł”ųŌgśųg ‹÷”÷' ł÷”ł”™f śłTf ū_ž [÷t÷„÷T÷¤÷4ł4÷”÷d÷tūT÷4›÷Tzų„÷TŪJĖ<;KK;;ĖKŪˆŚĢĖŪųDūTŅRÄDDRRD÷$DwüōłćCÓ3”3ÓCć÷%ś¤üTÉY½MMYYM÷ żŌśģ<Ś**<<**Ś<ģ!ģŚŚģųd÷T« ų“żĄ`¶VV``VL ;ūdųT“ J ł  ū@*÷j ų4÷€÷aõ÷ķūü,ÅūÜūt÷”’ ü”ü”„{zžų”ü”| ÷”÷tųC÷Æ8üqb‰bˆbŠ{‡y{x—{Ÿ™’’•’š –«–¢Ä÷Ń÷K÷  ūź‹÷t÷4÷ ÷4÷tł÷ŌŚ łŚ ÷4ūĘū¬\ūˆū<ūˆū¬ŗ÷Ę÷-č÷÷7ĶĖ‚ĢƒææˆĄĄæŽ“æ”ĶŹ—Ķ÷7čūū-÷t÷D÷&c÷+÷Į”ÄÄÖzÖiĻū0&H.ū ”0,•-##€s&éū &Šū2iGz@@R”QT+ūcūū&ū–ū ¾&ū¢÷ųt÷œ÷˜÷’„÷Ÿ÷½ń–÷ ÷ ‹÷÷1 ÷÷E ÷;V ÷tV``V÷J V`¶ĄśTF÷ŌóKV¶`÷A żT÷łTšż4oūš&÷™÷H÷)‹÷ų”÷÷”÷÷÷E ł÷÷‰÷õųń|‚~‚€ūŗū’aiEjVžŌul’§š”˜”—÷ŗ÷’“­Ń¬ĄśŌ”Ŗ„oū‹÷70 XDQū”ūĻłéF÷ŌóK2 ųŌóū4ų‰ū7£†¢ ĖmGŖGūT÷4Õ ü“oūš&÷śŌå÷æŃÄ÷»÷’¦­žµ·ü’‹÷ųĢ ŌüśųōBūt÷t,KG ūtūtQ÷tūty™}Ė1÷t÷tk ÷ūŌ½żT÷łT÷'ļū½ ü’‹÷ųĢ ÷1 ąś4~½ łT÷'ļūėž4½ū4ū“üŌQųŌ§t÷T÷ųTŽnųa–­x®j–i–gx€i j(Cūū(Óöj€­gžj€i€xh–iū5½÷'ū÷=÷=÷'÷÷5½ü‚ųG' tųT÷÷TŽn÷Ē÷5Yū'÷ū=ū=ū'ūū5Y€ižh­€¬€Æž–­ö¬īÓ÷÷īC ¬–iÆx­–¬–ž®€­ü‚ųį' tŸ÷”Ž~ųTIżõ ł'ü”ųT' ÷)‹÷TK÷“ų4÷T‹÷TĄ÷”øłŌųT÷. ūT˜ xcūÆ÷T  sø÷Z ÷T·÷ZūT÷T_ūųŌK5 ÷”÷”x—RÄŅwøŅÄRD÷”ūx÷Æūy÷yūÆøž¶ ūÆ÷yūy÷Æ÷÷ ¼Śå÷p<å÷ Z÷÷Æ÷y÷y÷Æ÷)‹÷÷÷÷÷÷÷÷öž ‹÷ģ ÷÷÷÷ž«€ųųŒ2÷÷ōŒūt‚„„‚+‚’„”÷t”’’”ū÷ōŒ2ś”ü4Œ!żō‚„„‚+‚’„”łō”’’”ż÷ōŒ2ū÷ōŒ»r@2ū÷ōŒ»0»2ü”ųōŒ2÷”ėŒp%2÷”ėŒ0 +‚„„‚ū„ū‚„„‚+‚’„”÷t”’’”÷ü$ł€ś÷2÷ŅRÄDł€nž÷÷2w ÷£÷—÷ųq÷“÷÷ ^ ųjMū Pūdi“™oo™Ą '¾ū.Žūūū±÷X…¤„‰¦÷3 ūQśĄ÷žŅRÄDn\„b±uū- Ė1ņJ¾÷ź xvużzŅ—Ž‘•J÷µĖ  –™”£ ‹÷˜sųŻų½t śĖü]BžTQśT² ÷)ū\ø&ųż÷Ü üųųųÜ Y½ņüfüfĪųfüfń ½½ųćśæœzMœ{y†zü śõ†z•yœ†Éz›†•œų  ł%żt  ū@‹÷tJ÷jłųZü!ų!®ų!ų"Ј ~«÷$y÷fū+÷/ū÷ūYŌū؞÷šˆ ÷÷kz÷Xą,šū­ūHnū„Š|”}š†ŠŽŽ‹Ž—–‘–’˜÷1÷Ę÷dę ¢ų×Z\—IĒū÷ūŅ÷Į÷”ŪŽ÷żĬ²ÉŅ ū÷TPvų4ĖųTĖ÷ä÷T›÷T÷äĖųTĖ÷ä÷T{€ųK÷‘÷=b× ūtų“BūŌ6y™}÷Ō1€€šūŲmÓUĀūä÷äzœx˜w—yūƒ÷¦ū§y•sq÷G ggKŒgÆū„÷¦ūƒy—w˜xœz{€÷āūćTĮŌmŲŲÓØĮĮ÷'÷&ĀĮ©ÓŲüżłh Ÿ~žzœūā÷ćĀUB©>>CnUUū'ū&TUmC>>©CĮT÷äūäœzž~Ÿ{€÷„ū¦÷¦ā£•„„£y÷„ū¦÷ƒł 7BūŌ6y™}÷Ō1ü“ų“× ų+÷=‘ž’‹÷ ÷T÷Ō‹łł÷ KųŌĆ/ ĖüK& ų”'ūIū”*ūT( ÷”Až’ vķųPų”÷“Iū”*ūt( ÷”'©÷1®ŒoØhūŌhonhŒ§ż”hŒ©n®÷”®©Ø®Œ§ł”‹÷;ųm÷g÷<÷ė÷&S÷3ū÷Ĥ˜ÄåŲū<÷{ łłāū;ū|™÷#÷ąŸ÷„÷&ąū%6Nkjā ­±ĄŗhWÄ÷Dx}Žpų–ū”÷÷÷;÷F÷&÷ƒ÷<U÷3ū÷Ōų˜Ōåū<÷{ łYū;ū|™÷$÷ąŸ÷ƒ÷&ąū%6Nliā ¬²ĄŗhW÷DyŒ|pų–÷)‹÷9€÷1 ż”÷äųł”ł9łI¹v]ØYż”fh{osžž”jeƒVŸ]] ¹n½ł”°®›§£śś”¬±“Ąw¹ œv„v÷ū÷Kųu÷Kp ųJōQģūūT*Fhl”£tnŖ…·µŻ–Ż˜Ü•’ĘŽ°…ūūqūDA§Ż÷÷«÷÷5Ę%!*QūūģTFhulstnl_…a99–˜:P’‡Žpž”ŠŽ‹Š˜‰ˆž‰ˆ~ÜŻ€Żµ·‘ØŖ£¢”Ŗ®Š*Ā÷÷ģÅōņįPūūūkū9ÕoŅóóŸ•ņŒ––‹–ŒŲkÖŁÕ©½Ū÷«ū÷÷Ęįņü’ūUŌp~łŌ; Y ƒ÷÷]÷‹÷÷@ūū¼÷tūˆ÷“k• ū”ų”÷Dū$÷$ūD÷! ü”ūD÷$ū$÷D÷# ū’t÷÷÷÷Ō8÷£ųク…±²÷÷@ū?šC¦IššśīųīÜ 9Żņū.ū.ĪŻ9ń ÷’÷’Ń`Ūną‚• ÷÷@ūƒAEž«Nėė­°„±÷# ÷÷ż÷żü÷÷^ū äū÷! ü”łłü™÷TśŌ÷TśŌųŌū%ūū 7;L9\XpqųTż÷Tł”Iū€*ż”ü9ųįūž¤€“‡”‰”””“ $¤–ųį÷žų9 ÷I ś”÷ ÷÷ų÷÷÷÷÷÷ūś”rž”ž”™÷. KÆ÷“Z ĖZū“ł”cKÆ÷“Z Ė™}yaū’ź÷ė÷“ėė÷4ūė°ų”@@ś«•‡”ƒ‘…„„‰‰‹ŠˆüT+}ˆ€~|ūĀ”Ÿ ¢ćCÓ3”k•nšrčū]J'ūV†{k˜eŖ{†”•‰•¢¢˜”–Œ÷÷o÷h«ūūc-ūū#ż“( ų”'ł“÷/ū÷ū&©ń÷”|–~™ˆųT+ŠŽ‹’’‘°“‘”• ūt`«` śŌV``Vµ÷t÷“{™yūšūS;ūūŽRQPIODüwŠ……‚ūtü„{•€ĖK…‘”ˆ“ŽŽ‹ŒŽ÷Øą÷­ū­6ū؈€Ž“‚ĖK…’“ˆ“‘ŒŽų÷t”‘‘•Œ•ŸųŅĒĶĘÅÄ÷÷‚ē÷q÷ą  vśT÷Ō‹¶¬ś¢÷zčQŁŁQ9³"ūū¤ū÷Ä÷aśT÷Äū`žT÷Ć÷aśT÷Yš˜ˆ…—–…•ƒ’“€Ž}}‹}ˆ|ūIżå÷Ä÷Pśū÷Žś ÷ŽŽ ś!÷!ßüZųZ®ųZųZŻń%Ķ ūĒūĒ÷ĒūĒĶ ų”ų! ū÷Žś ÷ŽŽ ła÷!ß%ń®÷Ē÷ĒūĒ÷Ē®ńńŻųZüZĶ ųø J÷Žś ÷Žų!ßūĒ÷ĒūĒūĒß%ń®ųZųZŻųZüZĶ ÷”÷! J÷Žś ÷ŽłĮ÷ßüZųZ®ńńŻ÷ĒūĒ÷Ē÷ĒŻń%Ķ ÷”X ū’ų€ć÷F÷I÷C÷ŗŽśžś?ż6šūIłYü“ūū(Їūžļu÷Ŗ÷C˜ū ÷XV÷YĄ”÷xüų\ųŖśū†÷ŗ÷śbųŅū6ųÖ÷6÷ž ł÷½÷S÷½—č÷§÷K Pū½øeūSūGQū½øGūēüzū5ü:÷5Ø÷'ū½DūųłNūŸłø÷Ÿ÷ž5 ł÷”ųT÷T‹÷(ų€÷TK÷”K÷Tų€÷(ČśT@łŌž4Būō~ƒ††Ž~”ļ'1ū ūA3ūZpł÷T* · ūT÷7×·æŻź÷ ƒ ,æ9×_ū7ÖūT*ūČ+ ÷TżūZ¦ūAć1÷ ļļ”•Ž˜†——†“~ūōŌ0 ūō~“—†ŠŠ÷&ččūQ÷1÷®ū ÷É÷É÷®÷ ÷Q÷1č.…’“ˆ“ŒŒꗐ“—˜ü’ v@÷T÷÷Tų”÷Tś“ł”żt¹ Į + Ė= ÷ ūŌk’ųŌ@ ū÷ ‹÷ ś”łL÷°÷÷Æūy÷yūƶ ō÷ūõū³ū³ūõūõū³÷³÷õ÷õ÷³÷³÷õ÷õ÷³ū³ūõ÷ ū’ų”ųŽųł“< ų”÷T< ų”÷T< ś•÷; ųų÷“< łT< łT< ž śs÷µ‹÷”śs÷µ÷' 5 ÷ó-Œ‚‡‚…÷˜œŠ|÷aū9÷9ūašzŒ~÷ ‘””Š÷Źz÷ŠūŠœūŹųŠŒ‚ˆƒ„÷™œŠ|ų3ūę÷ęü3šzŒ}÷ ’’Ž•Šųœzų9ü9œüœ÷µśS J ` ųżĖü“ūŌ…€ˆ€€€Žw— ¢ł¢— Ÿ—Ÿ–¤‹žų“ūŌŸ€—vttvw€ ū_•ūµ÷µĮ÷“ū“•ūµ÷µś”śŠüŠüŠ÷ŠūŠųŠųŠü£ż+¶ūž÷ž®ųžųž££µ‹£s÷žūžĶ ÷£ž¼¼‹ŻZ½ū÷@@ū‹@Ö@֋÷ÖÖ ū÷Y½9‹ZYhžžYY‹9½Z÷ūÖÖ÷‹Ö@Ö@‹ū@@÷ū¼ZŻ‹½¼śś J÷.w Óž÷śõų“ ū’ēų”÷÷ ą~łtBżŌQłŌ1÷ür łŌćÓC3żŌ÷łŌö żŌ? ż‹÷”÷' śŽś9–”‡¦{žūŌųsØY‹snūŌü{xˆp•ut–”}¤÷TżūŌ‚‡„…ū4ūTƒŠ~€—„—łT1łō÷T¤”™¢–żś”÷”÷' «÷1ƒ€††€Œ}“‚÷4ūT„’”‡”÷Ōż˜ ru|u€tŽp›x÷Ōü£n½‹£Ø÷Ōų›ž¦€¢”€ušrūTłó}šyJ÷nśą÷nłA÷ßūś÷ś®ńńŻ÷gūgųgųgŻń%Ķ ÷÷” ž ÷TĆł”÷œ‹÷”÷TĆł”÷œų(ų@WWSė+Ćææ÷šų²„“}‰‚‚ū·ū·‚‚‰}“„’ƒ™””÷·÷·””™ƒ’ū¦żFū“÷“ų“ų“÷“ū“ĖĖū“÷“ēē°°É‹°f÷,ū,°f‹Mff÷ø÷ø ū÷®śz÷”‹÷®śz÷”w ųōq{ttˆƒ‚‰ƒz{‘˜ū$÷$üŖüŖß%ń®ųŖųŖū$÷$x†§•£¢•¢›„ųtdüt÷”ų” ū÷4™÷4‹÷”śō÷4śųG{„zƒ‚Ž„s•{¢„÷4ūO!mFNB9xū*©ū…}ƒ}~†‰‡†Š‡‚‚“„…“ū5÷W÷]÷‹Ķ÷ŻųŅ÷4„›¢£•¢•§†x÷ōūōĶ ÷G÷į a ÷“÷÷”÷÷“÷tłųT÷”÷”ū÷ųcü”ū”ü²÷' ÷“÷##^ yłń”€u˜sżsu~u€€vq™x÷ŌüTz—ž  ž•œ—÷ŌųT™ž„€ ÷żQ‹žTqśT…śT÷ žT÷”śT ^ yų7– ‰„}žūŌųTœx•vvxzūŌüT}x‰q–vu–”~£ł£”˜”–÷ū—‹žTqśT…śT÷ žT÷”śT ^ śŌł žz—üT÷Ōx™qv€u€~usżs˜u”€ €„ž™ųT÷Ōœ—•ž ÷Tüt÷. žTÆśTZ śTZžT÷”śT ż‹÷x÷’÷Eō÷F÷„÷vī÷śd÷y‰“†“ƒƒŒƒˆŠDs4ū>ū$ķ÷0Kųš˜–šŽ£÷”‰•…“’…‚ü_‰²Š­Ž«ų|›˜–šŽ£÷”ˆ•…’“…‚üh÷)Ī÷!ę÷<ŅĻzŒœ†œ•œ¶÷3“Š”‡’†’„‘ƒŒ‡5”#ūæū”ūNū¬2)G ū- Ήh‹eŒkI÷ ūz™|źūŗß÷ūP÷Ģ÷ 諌𐔛‡›ż‹÷jūj÷nų÷Wų÷{÷÷ų2÷v|śų#Bū6¼0 ūIü2|ų÷Åk ÷ūÅ÷kń×Ļ÷šįGŠŒ‘†”ˆ“Œ”Œ’‘’ņ÷•˜Šž–…ū÷ ū\ū’ūLū9ūxūs,0 ū- źü*÷ ū*- śP² żū” Ļ÷’ī÷[ō÷‘śf÷ó÷…ūdÜūLŅū"ĀūŗõęćŹ÷÷*÷ ŠŒ“…”ˆ••Œ“‘”Ü÷&’—‰š–‡ū÷ū_¢÷Dūz|}yūHūecū$ū,ūLū÷t1÷HD÷U÷ \+ū!W)ūEū ÷Œ‰…’‚ނЂЂ‡†„$ū‚Œz•…÷ū ÷~jūCyš}œ÷1÷C÷h®÷&÷5÷`żż vś8÷:÷$÷:‹śśś¾Bū?€Āv»k“÷}1ńżŌG ūz™|÷%÷ åe@±ü1G %- ų?ūnūPūDū÷ ūƒŽƒ‘…÷Qū]÷(ūE÷5ūUƒ‘”‡•÷W˜–’–‘–‰™ƒ”ū+÷Mū3÷Tū)÷3÷w¦÷'÷Ŗ÷T÷<² ż| v÷ž÷;ą÷<ų#÷€ųļœš™÷Ž÷¶k ņū¶ą÷¶1óœ}šyūk÷Ķųא•‹—…”•…‘€ūS„†ūSü8x_uaz`{±{³sŗūkų=–…€’ūV€€……†‹÷ÕüÖūj÷ #- ÷“6ū“G $- ÷“ūŽy™}÷@ ‡v¤÷tųŌ÷t÷4÷tų4÷”÷t÷”÷”÷”~ ÷ōK> ų”÷t¾: ÷4ū@G ū4- ~÷”ƒüTū?Jū+Q~†~‡†{„ƒy’zŅūF~—„˜ŒŒ•––÷KŠ÷Ā÷–ł÷tütūD÷$ū$÷D÷÷# üś“BžTG ū4- śT²   v÷& ÷÷® ų–÷鉊ˆ‰Š‹Š@÷Ą÷3®÷ūuk÷÷ø÷1ū­÷Ń®ū÷Źü@‰Š‰‰Š‹ŠŽ:÷æ÷6¬÷ūzi÷÷½ų ū4BūG­÷÷%§ūę÷ģŽ”‰–…“’…ū|~}ˆ.ūüü)÷ü™‡•|ū}~}‡*ūüūū1÷ü™ˆ~•|ū†„……ƒ‰ŽäūģūQ÷"¬ūūCQ÷d÷4üü}Ž˜™÷3š—•™÷;ųü÷e÷:üü}˜™÷3™˜•™÷8ųü÷i² ü†÷OūJ÷K÷å÷.÷Ē÷Jū?÷7÷”÷žū1÷.÷÷.Kśz÷Jū1ČūZœ÷ū.Sū‰cbŠŠb÷‹ū.KūŠjj‹l‹ūhŒMū8÷‰‰‹ʟgk‘ū³‘‹Š‘†…‹†ü&wˆl`‹‰ūlūKK÷\°ÆŠÆū“‹÷.÷е“‹²ūK÷.÷“÷–™÷HĢ¢÷‡÷W/āū&®µćøĆŪ~÷ūküµūSūŚ”#÷ęó÷ŚØūZDųpūAū¤Ÿ4÷Ēā÷¤¦ūIüJw w ł”küž ÷÷÷Œ ł”÷”ąś”÷4³ ³ ÷ōk ū”÷ų°÷÷”õ÷$÷÷±÷Åśüæžœ" ž€ß łŲū ÷4 ‰‚}‰––Ų ÷|ŗ äśžė ż@Ś ū”õ÷$÷÷±÷÷”÷ų°÷Åóæƒ" ž€ß ś1ūŠė Ś2é÷4 Š‚}ˆŽ–•Ų ż@÷|ŗ Ę łtė" ß ś“ūBżŌA łŌ÷ żA ł÷ üTA ųT÷ ū”A ÷”² Ę ™kBū”A ÷”1üt÷Ō" ß ł4ųBüTA ųT1÷TłTBżA ł1÷TłTBżŌA łŌ² ū”÷G÷”÷ųiwä÷sį ū" ß ł‚Š`młaū”÷ś"÷Gäßį ū" ß łdū‚©„` ‹÷÷4÷”÷Tgnohgo§Æ®§ØÆ ÷4Ó ū“*ż( ÷“' łó3ć#ū©“«••–”¦æØÅŻŲ‹÷Gūt– `aM€PQ€Oddlli`g]_Q+ū fˆjˆoojżh©o­Š®ŠĒvŹuf÷÷\÷#œ×™‹ćŒĶ„¶¾±øœČ…Ö¤£ž¬•°–³‹³€°©³šŗ‰½™‡©€«­² ÄĄ ÷1 ÷÷÷”śTÆn§hgoogh§nÆ= ÷4ü”U ū“œ ł= ÷“dżśż÷)–«©™½|ŗm³–°‹³€³°x¬r£‘ÖzČeø`¾I„3Œ‡}‹y?zū#ū\fūLuOvhŠiŠmohżj§o¬ˆ°ˆėū ·QÆ]­`Ŗl²d–O—Q–P—M¶ap ÷t‹÷GŲŻmÅq怔•ƒ«÷©óāćóŒĄvÅi±ū÷÷ Č÷ĀąĒ¾Ń÷Īų…ź‹÷n÷4ÕåĶ^ę—ĪĖĪ†Ā—Ķ€ĘĶĶĪŻ÷nÆŌ°ś+÷}j{x€€–€÷t––––ž•zjū1‡"÷L÷­­–œ””–ziiż÷žū|EŁü;Õų;Ū÷]SHū¬v|~}‚†•ŠŠ‹”š÷¢Iū¶qz€x‘š‚ ¤¤š©„cĪ÷÷”®‰£†š§ƒy™pst}qv÷5HüĪÆp”¢}¢¦™§“š¤¬÷œGqŠ|‡z‡‚{t€œ­Ģ÷ײ„§}ž¤yp˜jip~rx}x…odūd’n™yrž¦~®­§˜¦“—˜šŒ’Œ™”üWłÕ­€vuyiū0i•z” –œ­ų©üĮxÕ`6‹0w7~Q[`R„|ūū‹ūūū‹šūR’[¶~Åwߋęą‹įŒęžŽ˜Ę»¶Å‘š÷÷‹÷÷÷‹|÷ą»`™Pž8‹05‹ż‡łū]A÷]„Æ|æsŃ|¹z¹|¹ŁĄūW¾÷WÖ÷[ü d„m}yrxq~jiq˜¤y}ž„ز÷²’Ø™ž¤„˜­¬„~rž™x’ndū÷Iū ³mpr|rv|”„‡—‰œ„÷¹Īū¤{‹ƒŒ‰€Œ‘†”˜™• š÷ÆĪüųH÷Ä ū”÷X÷?ĘÖ÷ÖÖé÷AŽŻ÷ń܅w¦÷lļ÷ DļĒŚzå›Łƒę‘ß{ę™Ń†ęŽćę÷żŌØś_÷ø·~¢q||„||ūĮ|šš„š„˜”ø÷ę÷fø|¢mm|t^]åžZ÷œüĶ'ųÕXųĶ"é÷Ģ-÷IüĶĮbgiwknv—¤ƒ†šˆ¢®ųäüv‹€Œˆ}’„—ž™§Ÿųäü‚÷č÷(]‰j„vg€rxhkl°m[2ł+ä*ūmÆØŖ¬®¤xf–’wj]ūY÷ę•n‹w‰‚‰wƒy€{hsfy\\hœ­qx£²Ą÷AĄ”±ž¤­„®œ¹ø®zi„r”eV$ūG4]štŖ”˜—£ŒŒŸÆę~üōś%]~smn}£¹÷f¹™¢Ø©˜t]ūfłcżƒ÷‹÷q÷yŚJÅ>”ŸūLūN‹ūMūMūN‹wūK=‚KQx<rūŠūū‹ū‹ū„ū<ĢQ؃v÷L÷N‹÷M÷M÷N‹ ÷LŲ“ĖŞŚ¤÷Œ÷÷žzüGū›D÷›! M”L”M«.ŸE”Zū£ļ÷£÷ ų#÷ ūįĄ‚²x¤­rhœ]^hzirxr‚dVūCV”džqi¤®zø¹®œ­¤ž¤”³Ą÷ć÷å0ünwx}y„“™‰Š‹— ų0ügŽs|r” Ø¬­ŸµÆT ęū’ūvŽųéłł‹ŠŒū7÷± y£gūƒ}†…„Œ}’~÷5ū«ŠŒ‹‹Šū‘üT„~Œ~‘‘–„™÷ƒ®œ£”˜÷‹ųK•œ‹łŗł•…€}ū…g|ut~ü–ž$zm‹‹‹Š÷ēżv–žsÆ÷ƒ™–•’‘•‹™„˜ūäųūŠ‹ŒŒų¤ś:’˜‹™„•tw ÷9÷sśÖ÷słAł—‹„~ūTūēz‚}xpūM€ƒ“††“Š•‘•÷X÷īŒ‹‹‹ū÷l†•Š–“’”—÷L§™y{•÷ūq‹Š‹łų…ƒ‹†ü-żg‹‹Š‹÷˜üp‘‹†ƒƒ†‚‡€ūLn}ž›‚ūšųt‹Œ‹‹˜¢ų"łV•—œ¦÷O–“‡ƒ÷wū(   vś”÷”® w łu€vx€ü”ūŌ„ˆ€Žw–~”¢ł¢˜”Ÿ–Ÿ–¤‹Ÿ~ų”ūŌž€–vuų”÷#‹÷,l÷uķ=Ó-–¤ūrūu‹ūtūtūu‹rūr-€>Cu)kū‹ū,ū#ū#‹ū,Ŗū”)ŁCé€r÷r÷u‹÷t÷t÷u‹¤÷r閣Ӡķ«÷‹÷,÷# ū ː ų&łŃūęū£ų~ūÓ÷ź÷±ų€ūŽū'+ūė÷°ŠŠŠŒ‰ūźū°ū'ėūų}ū¹ŠŒŒŒŠŒų~÷¹żÖäü~ūÓ÷ęū¢ų‚÷Äų‚ūÄü‚ūÅ÷ėū±ų}÷Óü}łšūėū±ų‚ūÄ÷ę÷¢ū’ū”÷ ÷ ÷+‹÷ ś4÷ ś4÷żWŠū+łWŒ÷…ų…ū üžž4ųžū żtŒ‹‹Š®lŒ‹Œ‹®ž4ųł}ū*łUJ˜÷*żųdū&ł?ūK²÷&üœųØ>ūųõūüŲ÷ūłGū5ų#üÜ÷ąĀłpū)q÷ żM÷)„ū÷E÷÷Hų2÷D÷Ć÷?‹÷?÷ ÷=ųż÷=÷÷BR÷ippižĮip¦­ł÷!~b„^^ū”÷jūc÷›÷œ÷j÷c÷”ø„ø~“÷‹żū°ų©ū9ūūū?ū>ū÷÷9÷9÷÷÷>÷?÷ūū9÷°÷üelleūBelŖ±÷9±ŖŖ±‹÷B±Ŗleū9÷B÷d÷2äūūŠ‹ū22ūūŠūä2÷v÷ää÷J÷¦ų<÷ ų<÷¦pą÷K "śT÷3÷÷÷3śT-üŗż”Č ųČČ J ł”ś&ū]ūĘų&÷8ūt#÷4üž#ū4-ų_łGų_żG÷É÷” ū’ūC÷å÷÷3÷÷u÷÷‘÷X÷ųå÷rų £łĆł9Ł*ĮHb=g‹ūŪhŅ`ńĶ€ß÷ šū,ū ū€ū€ūļ†÷‡čĆ掰÷Ę÷5-ū"÷ƒų²MM/ƒ8ū(xū,Œū(ž9•0”KDzĆіɕ÷O¬÷TŠ÷Om̀ց·QÄžŸŒ­®Ä\™ūæūYü5‹ū¾÷Yy‚…{›)›)¤+Ä)÷jóx÷Yh÷m–÷GīóÄ{÷§ķ÷IśU®“²sŖVĪ7«=¢ūoĖū{“ūvu! z'f@o&d1¤ūc³ūa®ūa•P‹EĄb÷4÷"f÷|÷au÷n›÷O鿦ɯ–˱÷n²÷n­÷oū÷I÷†ę÷Ū÷7Ū÷J÷!Ü÷I‹÷˜÷ļŪ÷5Ū÷š÷˜łäł.“OB\WŖQ£‹ēĦ»ØŃdRŪ›~ńūĻ-aOpbKŽI2ŽCć“擊į€ć÷@ųl“U“[’ū”ūŒūs^„Yƒoc¹`Ģ„Ęƒ÷~÷Šö™Ę’Ī‘·øµż~vD—,@aūDū1ƒū"„@˜3£bŅyŠ€Ņѐ——‘÷lū"÷Ą‹÷k÷"­rbs÷łIrū3pū1oū1ƒ]_qewūGū1€ū(›'–$¦:Ée©‹½ƒµr÷)n÷'y÷*”ĖŌ§Į Ó„Ų˜Ų’÷6›÷;…÷2]ÄzĒt±[œu†n‡s÷œļ żłŸ÷…ų÷oų÷K üÆE’Ušf™f¦h±j±k¹qĮzyĮɂŃÉő˜ĄĄ—Ɣͪ÷†X>>r=_d• iršyŸ‚¤„‡Ääųų÷…üųū÷T~÷TŽ ś÷÷Zt^zc‚‚c`†]V\’˜cc˜hžn¤o£w¦€¦€§…³Ąų(ū÷7øš² «¦¬§„¬ž±Ÿ²˜¼’Ę÷8ū·÷¦ūIū¦ū»H`’x’x˜|ž€{„؄¬ÅްÅūIų1śu žūT÷4÷—†€’~ūtą9 ū ūt~€ƒ€††~“÷÷ü…‘”‡”÷( ”“‘‘÷ņų“•˜†—žū”÷4ś§—‰˜ƒ•ū÷ų‘…‚‚÷( ‚ƒ‡……ūņüƒ‰~–„˜÷tū y™}·ą÷t˜–“– ÷' ĖĄ łtBū ÷t˜ƒ–€~‰‚üūö……‡‚‚é ‚ƒ‘…ųūņ•ƒ˜‰——’–˜÷tąk  ÷' ‹ĄĄłé ”‡“…‘ü÷ņ“~††„€~ūtū Eąūt~“€–†—†˜•”ų÷ö‘‘””ū’ū ‹qq÷ÕPVµ]Ķ]ĶtÖŻהжÉ£®±²æ·iµh­h£¶MD”;ZQuItI[€nt]•ŸFŸEQ•Zū-[+@@*eūū-ū8½ū;ģū@ū@īī4ņ¬·–¢Ā”Į»–³“¾uĘvǹ€­ąįĢ÷įÅā³ß¤Śü •’Š‘’Š‘‰’‰”ūp7ZYCYCq5‰(ŗ­‘¢’Æ—Æ£ÆÆµµŖ¹Ÿ½ž¼•¹“ …v÷ ł>ų¦‹ż>üĮł>-rż>-üÉł>śj7žż)śū žūż1śū’ś ÷;‹÷a÷u÷a÷÷b÷t÷aųś±vz  œ ”œyvvzyuų:uz  œ” œyvvzyvżĄūLR]]SüBR¹]ÄÄø¹ÄųBĆ]¹Sśøxž*ż.N¼ZČÕŒūwR¹]ĆĹ¹Ä÷w÷ūwR¹]ÄĹ¹Ä÷wÖǼ¼Čū|śĆŅ÷’‰”„„Ž‚‰‡„Cū¦NGšCCG|pNC÷‡’‚„ˆ„‡‰‚„Ņūū!C,ūū3ś1÷3,÷ū Óųqü|Ä]øRS]^RüBR¹]ĆĹ¹Äū”¼_“ŗ wė÷įœų½Ī·Ÿ÷ŸŸ}š„©» |’©wž‹«÷$éģ䔻kŖ•“i±Ģᦿ­›®ÅÆ”÷I÷7‚š÷ žJÉģł+śłk‰t•Œ–„Ÿ‹ā}•Ÿn~‹Œx•Žūóü?“ˆ†‚†z…}}†Œ‹}•’˜”™‰”ˆłėūūb¬ū‘ˆ;u{‰{~(0YP¹ū †KȇS{TƒSmŒŽ ”Ŗ”¦˜¬Œ«Œ©ˆƒ„€‚{qiTAsFƒG‚K’i±€˜wz‰ˆˆ†™‚–w0›oš_ewŒšk‘jÉ‹ "ŠĖ’”ĻlØs¤ūńh³zt”‚ u»|Ц¼”‡‡y(0u"Ļ5š·–©Į‘·@B•׊÷'Ŗ“\ćńϊ؊½øūøs½qĀף±”–§—‰•0@‚ø.&7ˆeŠ}”|™_¶¼gĶ—Ø•Ŗ˜«—®ž®•ˆ¬¤‘‰ž†Žƒ‹„€|qD|u„n‚lƒaKš©]„~’Ÿœ•”¤‘˜ Ž›œ˜”Ž‹ŁdŒ iŒqŒqq™u”Œzwˆ|†wŹŽ©«›Ć³ŠÆŠ„^Š=~ŞŸv™}M÷,÷–Æ„®™7†ƒ™Qu„p‚z•›„•„ĶT‡Sˆ“(š‰š‰±p¦†āzKY–N˜Gø“ūJ“€­¬ū Øūb/ѓ›Œ£•Æ„ēc÷cÖt·uØ•¹pĘ4™K6—gp1›„²zyżłĻˆ‰‹Š@ˆ‚Š“—”†‘‡‹…‰‰—ˆ‘‰—y‡rų7ūYŽ}‚{w\» ¢‹’’wž›™’xūF÷iˆ‡‰šƒ™ƒ‹…‡‘˜ŒŒ ŠsĮ÷}†€tކ‰x„…y‚’“š”–‹Ž• Ÿ““„ƒ“”„˜…ІųÉśĆoGž…÷qtŽū ÓsŪp½^ū)X)iz=JŸFŠdf…|oūL{1$+Žū–#~[G0`SQRnūe*wXjsˆIŠxŒ[œ™Ļæąū÷ū^‹£dāū7ū,vX„9Æ<ŸDœB–c–r’”‰•…¦Æ±Œ««~œ€„€„ˆŸ”–‘”™Ž¢‰Øˆ®‘ž—Ŗžš²}»\{zeugwTœqtmq“FˆXˆec_dˆ¬dą†ćy÷qŌ]Å‰ąˆ˜ą÷޲Œ±±Œ¶¶‹Š·ćˆm]Än¼rā• Ÿ§¦×ĖÄØ€@Ō°÷=Źū×ū÷ųćń{÷ų÷‹÷ ÷Üś”Æj<5x0ū3ū%Äčū‹”…‘†÷÷¦ų÷‹ŒŒŒēū„±ū\•QūMų󃈂‰‚ˆ‹ūöūūGūÓé #÷K÷.÷<(’‹’Œ’–÷؃š÷ęžff›f ÷hÜ8ūĻū¦Žz¶÷_÷÷=÷Kį”÷ ū8÷ū^ł@ūÓmūK#ū2ū'(„²h÷U5÷÷h¬÷KQ™‡ż¹łyŠŠŠ‹ŒŒ‹‹Œųāū%‰ˆ.ū"ū‹/ū÷bū÷7˜—½æ’Ą$÷:÷,M%÷÷süyƒŒūs¼ūvnX†–‡—†–}«|«|Ŗ÷—õō÷,ēūĀū#ū/÷„ K÷„ś=÷{÷0ś@÷Ģł±÷æą•ųmū_ūX-ūPūuūPļ÷ĀŖ½Ńö•ū.÷MćIJ¾ĖT•2”ū&Æū&®ūĒ÷<÷_÷]Ö÷A÷Q÷S@ūQdXJ*ˆ÷ū13SsVQÄ~×yós÷"k÷=OūB÷’ūmćmÜYĢ•»‘¾¾ųūĻ÷ĻüXX…[½J:©3ūhū@ū@ūh3©:½J[…XXü÷ĻūĻų¾¾‘•»YĢÜmćŲv ū÷ƒūƒV ‹÷j`Ėų”ŅŅ‹÷D҉Žü’ü’pqg}fo…r‘t˜xü*ų,p¦|®±°šÆ¦„÷ ÷ „„ƚ±°Æ{q„÷PūPų"ų#ū÷ DŅū‹DDüßüßDD‹ūŅDųßüßŅD÷‹ŃŅųßųß>ł•~~}†üŅüÓū÷•‚~}~~†‚ū ū xx‹kžwų+ü,“ƒ–†–ŠŠ‹é `‹™˜‘”•łnłnžŸ‹«xŸū÷“śŌ÷4‹÷4ų“÷ų“÷48łT÷T÷. ütÆś”Z ųtZž”ł4ų÷. ütÆłZ ųtZż÷4ł”¦ üł”÷”‹w w ųtž…žšū”ųĘcM»AüAM[Pcū”ü|…xxL «©›¦÷w÷éøūū‹ü/…ˆ€÷/÷Tū¤M¾YČ÷4ɽ½É÷¤÷T= —ˆ–…•ū‹ų/÷ø÷wūép©{«;ü4ł“Äżł”÷”‹÷TĖ÷tĖ÷tĖ÷Tś”łŌ÷8żøü4L F÷ōĖž$÷ ųdĖüd÷ ś$ĖūōL Fū“łōÄJ ł™÷~ūńųmp°k÷ šĪāĆŻ`¶Yy›¦uææ§”›¶½Ż¶įSńHkū pfų1H  ū”’ūÓ÷Ó÷xē~ē°ĄłūŅū–ū–ūŅūŅū–÷–÷Ņ÷Ņ÷–÷–÷Ņ÷Ņ÷–ū–ūŅ÷Øū©ޕЖ…“ūH÷Œ÷H÷Œ‘”Œ•ˆ•ˆ•ƒ’‚Žūøė÷Ę•†•ƒ‘‚‘‡ūø-ūH÷Œ›o‹{ūHūŒūøé‰‚…ƒ…†ūĘūø+‚ˆƒ„ˆˆŒ‘‚÷HūŒūHūŒ…ƒŠ€Žށ“„”ˆ÷ø+ūʁ“…”…•‰•÷øé÷HūŒƒ‘•†•••“‘÷H÷Œ÷ø-•‡•”‘“‘••÷Ę÷øėp”Ž“’Ž•t÷tU÷ō÷ī÷}ū%ū ūI3ūUūõū³÷³÷õ÷¶÷R÷ˆ÷žŚH!fūūü÷ĮūĮų°°Ž‘Æ÷_ą–£†Øxžxžor€iB?z<„÷ˆ÷Ą÷.Ź÷"÷󞝒؀¤£t›oŠü2|ūŁūåü3÷"÷¾÷¦÷C÷£÷ ł”÷Tː śŌłTU ū”hnØ®* ÷”dųŌ÷ ś€*žT( r'Ė€Iś*ū”( V A  vŸ ÷”÷÷÷Ō«@`ųŌIūt÷‹ļĶ÷A÷A÷÷ ūAūAżąūA÷A÷ rr‹c¤r÷AūAI‹'ūūtõ ÷tū¢2®Fū^ūwtpc„s€˜š†šœ’™˜÷K÷c‹÷ū÷I÷1 ž÷>÷÷ ‹÷ZūY÷,÷ūd÷e³Ņ¦é÷÷t'ütųŌ÷Eū#÷#ūEūEū#ū#ūEł÷)”vś‹Øƒ’ošŠ}śŒ‹}³4€ū“‰uŽ{‚‹‹z‚ƒu\ū O#‹ūūnWv™ZŖ˜źĻ÷h«ć,¢l’t:Œ$Œ4ŠZsj{rgš‰žˆ¶‚¢l‹¤b1–ūXl‹dvG®'÷b‹Qń^÷ƒ {–‹‹y™q°ū¦‰a|x‹‹|{™j÷jü‹÷ˆū‹‹÷sū}÷‘›‹÷®Žž‹‹›Š¬‰÷.Ó¢‹Ń”åū?ėI‹ŌYĀ–÷”÷ŒK÷‹†”kŠū.÷#Šū4÷) s÷V÷–÷ ÷1ŗė|“ 5ńŌ÷÷G÷c÷%÷1ū÷A÷Ø÷ų ģ÷X–Õ÷Rųf÷ õ÷÷ął7÷n]Mw] ^ }ĄØø§·ĒŸøxŗwšVo]é÷ ytƒy’y“†ž••œ”“…„‘wy÷B Ē÷A÷ū'±ū!Æū3EMūMūĒū!÷#]€÷([÷BÕĒ÷÷Ģ÷4žūWūtūIū½m@ū½nū”÷x÷Wx÷W÷t÷I÷½©÷½Ø÷”ūžūW÷ȇ÷ūŲ$«r“z˜¬§ÓŽÉl·QŽū3‡ūJ>ŒRq™¹§å‡×_¶(īū›%ūvūv÷ąū=ū=)ūGū/ū½ųūHųų{÷Ų÷Æ÷uAłRĖ6£=z@k„wl’k‘k«w«’÷ą‹±““§l§l“ae‹lœjŖŖ¬œ•Ŗ¤×{āRŹ÷I÷7ū ÷ūA¼ū5i‹fƒsg“f“f°s°“÷£÷hß.ß/”ūgū‹€gŸeÆÆ±Ÿ—Æé ½÷0l÷Fū ÷÷)ėśĢł÷X÷™÷Wł¹÷7”ū•`ūXūtū”ū¼ūŪ-÷Rē÷÷d÷‡ų÷3:ėūĪū”ūé‹ūˆ÷ūf÷S/;é[÷÷÷»÷Ūźł<żŠ”ūuū H9+Ü,æūūūWū:-÷C÷Sē÷÷d÷‡łūT÷”ūX÷tū•¶ūé‹ūˆ÷ūf÷R/Üé»÷÷   p¦@¦÷ ÷ ÷÷ ÷÷ ė®# @GRpw½ĮŹĪŅÖŻćēė 29GKPzƒˆ˜¢½ĆĒßęX`ƒŗįč-26:>Zam±ø¼ĄĘĖŠŌŻįīųż'+/8Aksy–›ŸØ·»ĆŹŪäė $)8=sx‚†™Ÿ¦±¹½ĆÉĶćöü #(-LRY]bjuy€…ŠŽ“¼ĮĘźö>BIPV[k¢“ĮŹŠÕŁł ;Zbmw|ƒŽ®ŗŌŪš    ( 6 C Q V \ d r ‚ ˜ Ø ¾ Č Ļ Õ Ś į å ś  # 7 > G O W \ o ‚ • ¦ ¬ ³ ŗ Į Č Ń × Ż į ę ī ų     $ * 2 6 < C H O V \ a p | ‹ ™ £ Ø µ » É Ļ Ō Ż ä ź ó ü     ( - : G K O V [ ` j v ‚ Š  • ›   „ Ŗ Æ µ Ą Ä É Š Õ Ū ą ę ń ü   ‰ ų<÷ģ÷ģų<! ¢`\ ś   ~ƒ††Ž~”÷ŌūŌ…’“ˆ“““Ž‘’÷Ó÷Ó „ ūT2 @ ūŌ# ÷Ō6 4 ł”üT1 ų”ūT4 ÷”Ė. K_ KDĖ *ū( ŅRÄD—ÄRŅwų”ŅRÄD—ÄRŅw÷ ūõū³ū³ūõūõū³÷³÷õ÷õ÷³÷³÷õ÷õ÷³ū³ūõ÷ + ų<ūģ÷ģü< =  /  7  y™} œ|šz O ® 6 œ|šzKz||zKzš|œĖœššœū”÷Ō4 L  üfüfĆ ųųųü…‘”‡“”“ø ½½Y <÷Ō! —RÄŅwŅÄRD ; œššœ ÷Ą÷ˆ¹„¹Kł”ü“) ‹ü<ūģūģü<ü<÷ģūģų<Ź}™Ō }y ™™ ®nØh @ ūT# ÷T6 ®ØØ® Y œ ū3ūūū3żŌ&łŌ÷3÷÷÷3 Ą`¶V E …‘Y½9üfüf/ųfüf7½½Y ÷!÷• Ė‹ūj]^÷‹häY¢‹E»ÖЋׅµBĪū ÷­·Ÿ’½Ÿ¬”Ÿū?žūGĶ÷ŗߩмĄƒŸqŁ“õ̟÷'(‹œČĶ”ĢĢĶ‚zČ‹÷'īĖwµ!q=ƒw¼V©F7ū»ūHJū?x = ÷d ł” ’ ūįūįūš*ü( ÷š÷įūį| 0 tzux‚ūuü[üŠBr‡lmy˜z—~ųūö5üˆЄЅ„q˜sؙ˜’˜ųU÷€ hnnhūhnØ®÷®ØØ®÷®Ønhūųg J ™÷T‹÷TųTśŌ5 śæüŌ÷ ż_ł^¾X*³Dü4EQQEü4D³*¾Ył_ż`t¢u ¢£ųų€¢ V¶`Ą % , hØn Iž.žųTüTb œ›’——ųTųTu  ‹G‹ 3ś€& r' ÷Fū÷/ūB“¦“™»¼÷ NPuc]÷T<ūO÷ūd¶ }Œ}Œ|ū1B&ū2ūBū‹÷]ū]÷‹śŌvN ųŌp $  \vŠ ÷!C U ū k  ųj‹ųiųh 9 ,KG üŌ- Ė1 ÷‹÷. ÷J ł”÷K ü<ūģūģü<ü<÷ģūģų<ų<÷ģ÷ģų<)  ū­ ‹÷t p d %ų”üM 7ųfųfY ÷8üøü!į5õ÷tókƒ K& Ė÷®÷z÷z÷® )ų) ÷= ÷hū@÷@ūhūhū@ū@ūhūh÷@ū@÷hv zš|œ : :łūŌ: Čż:›rš ż:€ r —{’z —›„œ 3ł€*ū”( €' 3CC÷$ Ø 3ÓCć Ü üfųfņYYĪųü÷H νYń ųfųf ¬}­­¬™ ÷!÷0 ū!  Z  . žT_ KDśTN “‡£ ÷Mū¤ūYū·ūū;÷–÷/÷Ž•›”›‘—Ž’’’Ž„Ž„‘„£a÷3ū÷Œ b * „{z÷/ ‡  ~—›…œ“”Ž“¢•›¢„ - · „ ūŌ2 ÷”÷÷”÷÷” ū!ū÷ = ćCÓ3 z|šœ ‰ µ ü”ü”rr‹c¤rų”ü” ) ü<ūģūģü<ü<÷ģūģų< v‹vO ¤  ÷”‹÷” K- ‹‘  € ÷š ; –  ÷® ćÓÓć ūū”$/ ł÷? ū”÷÷“«÷t÷ˆ÷¼ z{„ z Y½9 ūT @÷ 3ū* ÷ūV ū÷ f œ„›— ū÷” ų”÷ ūT  Ė‘ž™œųō•}y…vKy…x}züōy™‘ ¢¢™¬­ ”…‘ ŃÅÅŃ Ü:Š‹m‹‹_‹ū+‹c! %“€ž|Øy“¢œ§” Iś€*ś€ō —…›œœ‘›—— 3CÓćłŌ÷ yr•rrryy ²²’Æ•÷A·÷0Ż÷÷†ŗ¼ˆ¼ųƒų%÷²÷ö^ ssĪ j£ ÷tśŌ÷t ‹  Ø®®Ø U ż”œ ų”÷ü” ‰t‡x…}r|GzIyd€q{}u‚Œq…Œ‚Œ€–¢Œ 1cżTÆĖZ łTZK÷” ·gÆ__gg__Æg··ÆÆ· „{¢t•s•o†yx ūÆūyūyūÆ ÷; ‘‘ ÷Ō —•Œ“‘Œˆ€‚††ƒƒüü„1ųÜ  ł ū”÷”}ū ¢tÕtsA@¬ tł żTū''ūżTūļ&÷łT÷ļš÷ łäū4‚„„‚*<Śģ”’’””’„‚<ĢJŚ”’„‚ €ś@ē . ūT(÷TN C ÷!÷÷ € ų /½Y7 ÷3÷÷÷3 t‹÷Ÿę‹÷  ū”÷”÷* ÷% ų÷Ō żZżZ……‡…ˆ„ ū ,,ū ū ,ź÷ ÷ źź÷ ÷ ź,ū  2 śT6 yžots{tqüT( ųT §}t¹ĄĘ÷.÷+Ż­Ė’‘Ž ÷ųU ¤r‹crr }÷:™ ÷ūt÷t_ xy†o•ts•¢{„ ——›’÷<„— y¤¤¤¤• ų”I ÷y} ÷&šū ÷-) ü<ūģūģü< }™y–y™}:  ’““”‘”ųų¦äüĖūy÷ ÷ ÷t. ūŌ_ ūtü Ōe÷ 11eū BB±ū åå±÷ Ō ĄK ˜˜‹Ÿ~˜ ™÷K} ÷ ‘’“” @ STdJ,]ČÓÕ·ÄŃŪĪ49üö arwwvyrō/–˜—™˜– ¤ \ū;COLD|yz|r‹‹‹Š ū4‚„’””’’”÷4”’„‚ ÷Kw 83÷ hŸ‚¤¤ ®w”rr ÷(  ĆūūČū;ūfūvūeK Eūzł*ū6ūzż*E! ‹÷‹÷‹÷‹÷‹÷‹÷ ū!ū$ūūDūDū$• ÷÷ ū!¤÷! ÷÷Ÿ ˜~Ÿ‹˜˜ ū Žrł“ą ( rA./  - ÷: ™ øūČ ÷‹ū]÷]÷< 1ūTłTB ‹ sĒ ÷0ę … łĄ{ M½YÉɽ½É …@ ÷“÷Ōū“ Ķ ÷÷& r¤c‹rr t÷ y}|z œš|z ‹  ÷”ū” —›•œ“žŸ÷™š éūEQQE “‘–’–œ”—œÖĮ ÷÷÷÷;÷÷ ÷4÷ō÷÷ ūū! ÷÷Ė÷™÷ BKG ™œ÷”“‘‘‘ o –  ÷TI ūš&÷ ü4$h ‹÷ź ūDū$ū$ūD ÷šš÷ ÷D÷$÷$÷D 3żŌ ÷”÷” ł÷ ų”÷” ‹‹‹‹ ÷ ‹÷ ÷”“ qt{tsožy öĖ’—ŽŒŽ = c ÷ł4÷ ū÷ ś÷ Žƒ‚‚$ ‹÷÷»¶Ū ū ū ūŒ‚‹ Œ›™œ ūŌ$ ÷ żŌū3 Ą ÷T  v‹ ū‹ƒ ™N ū¹Vūļūvū6 Ü C  ĄłTó ÷  ÷÷  ÷š ÷ē ū_÷ūI÷bū rsyyū'ū& üü ū”÷ ū@ r apache-couchdb-1.6.0/src/fauxton/assets/less/0000755000175000001440000000000012332105600021036 5ustar00djcusers00000000000000apache-couchdb-1.6.0/src/fauxton/assets/less/couchdb.less0000644000175000001440000000420512332105522023341 0ustar00djcusers00000000000000/* Licensed under the Apache License, Version 2.0 (the "License"); you may not * use this file except in compliance with the License. You may obtain a copy of * the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the * License for the specific language governing permissions and limitations under * the License. */ /*! * * CouchDB less style files * */ @import "bootstrap/bootstrap.less"; // // Variables // -------------------------------------------------- // Global values // -------------------------------------------------- // Links @linkColor: #CA2530; @linkColorHover: darken(@linkColor, 15%); // Grays @black: #0C0C0C; @grayDark: #5A5A5A; @grayDarker: darken(@grayDark, 10%); @gray: #F80507; @grayLight: #E27B81; @grayLighter: #B95D40; @white: #FDFBFB; // Accent colors // ------------------------- @blue: #049cdb; @blueDark: #0064cd; @green: #46a546; @red: #9d261d; @yellow: #ffc40d; @orange: #f89406; @pink: #c3325f; @purple: #7a43b6; // Scaffolding // ------------------------- @bodyBackground: @white; @textColor: @grayDark; // Typography // ------------------------- @sansFontFamily: "Helvetica Neue", Helvetica, Arial, sans-serif; @serifFontFamily: Georgia, "Times New Roman", Times, serif; @monoFontFamily: Monaco, Menlo, Consolas, "Courier New", monospace; @baseFontSize: 14px; @baseFontFamily: @sansFontFamily; @baseLineHeight: 20px; @altFontFamily: @serifFontFamily; @headingsFontFamily: inherit; // empty to use BS default, @baseFontFamily @headingsFontWeight: bold; // instead of browser default, bold @headingsColor: inherit; // empty to use BS default, @textColor apache-couchdb-1.6.0/src/fauxton/assets/less/fauxton.less0000644000175000001440000003701512332105522023423 0ustar00djcusers00000000000000/* Licensed under the Apache License, Version 2.0 (the "License"); you may not * use this file except in compliance with the License. You may obtain a copy of * the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the * License for the specific language governing permissions and limitations under * the License. */ /*! * * Fauxton less style files * */ @import "bootstrap/variables.less"; @import "variables.less"; @import "bootstrap/bootstrap.less"; @import "bootstrap/mixins.less"; @import "prettyprint.less"; @import "icons.less"; /** * HTML-wide overrides **/ *, *:before, *:after { .box-sizing(border-box); } body { font-size: 16px; line-height:1.3; padding-bottom: 0px; color: #333; padding-top: 90px; background-color: @sidebarBG; } h2,h3,h4 {font-weight: 600;} a { .transition(all .25s linear); } a, a:visited, a:active { color: @linkColor; } a:hover { color: @red; } input[type=text], input[type=password] { .border-radius(0); padding: 12px; border: 1px solid #ccc; height: auto; font-size: 16px; margin-top: 0; } input[type="checkbox"], input[type="radio"] { box-sizing: border-box; padding: 0; } input[type="file"], input[type="checkbox"], input[type="radio"], select { margin: 0 0 1em 0; } /* bootstrap overrides */ .page-header { border-bottom: 1px solid #E3E3E3; margin-bottom: 10px; h3 { text-transform: capitalize; margin-bottom: 0; } } .nav-tabs > li { margin-right: 2px; > a { cursor: pointer; color: #333; border-color: #eeeeee #eeeeee #dddddd; text-decoration: none; background-color: #eeeeee; border-radius: 0; border-left: none; border-right: none; &:hover, &:focus { background-color: @linkRed; border-top: 1px solid @red; color: white; } } } .well { select { margin: 0; } .controls-group { &:first-child, &:last-child { margin-top: 24px; } margin-bottom: 8px; } .controls-row { margin-bottom: 8px; } .row-fluid { margin: 0; } .row-fluid .row-fluid:last-child .well-item { border: none; } .well-item { color: #666; font-size: 12px; border-bottom: 1px solid #e5e5e5; padding: 8px 4px; strong { font-size: 16px; } } } /*TABLE STYLES*/ table.table { table-layout: fixed; } table tr td{ word-wrap: break-word; &.select { width: 20px; } } thead { border-bottom: 2px solid @redButton; } tbody { padding-top: 10px; } .table-condensed td { padding: 18px 5px; } .table-striped tbody > tr:nth-child(odd) > td, .table-striped tbody > tr:nth-child(odd) > th { background-color: #F7F7F7; } /*form elements and buttons*/ .btn-group { > .btn + .dropdown-toggle, > .btn:first-child, > .btn:last-child, > .dropdown-toggle { .border-radius(0); background-image: none; text-shadow: none; } } .btn { .box-shadow(none); .border-radius(@baseBorderRadius); background-image: none; text-shadow: none; background-repeat: no-repeat; padding: 10px; margin-top: 0px; .icon { margin-right: 0.2em; } &.btn-small { padding: 5px 10px; .icon { margin-right: 0; font-size: inherit; } } &.btn-mini { padding: 3px 8px; .icon { margin-right: 0; font-size: inherit; } } } .btn-primary { background: @redButton; } .btn-primary a:visited { color: #fff; } .form-actions { background: none; border: none; } .input-append, .input-prepend { .add-on { font-size: 18px; padding: 14px 5px 30px; } .btn .icon { font-size: 21.5px; margin-right: 0; } } .row-fluid .input-append [class*="span"], .input-prepend input[class*="span"] { width: auto; } .form-inline { input[type=password], input[type=text] { width: auto; } } .checkbox { label { display: inline-block; padding-left:25px; } } label { margin-right: 15px; padding-left:0; display: block; cursor: pointer; position: relative; font-size: 14px; &.inline { display: inline-block; } } .help-block { font-size: 12px; } input[type=text].error { border: red 1px solid; } /** * Fauxton-specific Bootstrap additions **/ table.databases { clear: both; } .nav-tabs > li > a .fonticon:before { margin-right: 6px; font-size: 16px; } /* application specific stuff */ #main > footer { position: fixed; bottom: 0; font-size: 10px; margin-left: @navWidth; padding: 5px 10px; background-color: #F2F2F2; width: 100%; .closeMenu & { margin-left: @collapsedNavWidth; } } /* ajax loader */ .loader { background: url('../img/loader.gif') center center no-repeat; min-height: 100px; } #app-container.loader{ min-height: 400px; > *{ display: none; } } #global-notifications { position: fixed; top: 0px; display: block; z-index: 100000; left: @navWidth; .closeMenu & { left: @collapsedNavWidth; } width: 100%; } #app-container{ padding: 0; height: 100%; width: 100%; position: absolute; top: 0; left: 0; > .row-fluid { height: 100%; } } /* Fixed side navigation */ #primary-navbar { height: 100%; position: fixed; width: @navWidth; top: 0; bottom: 0; background-color: @primaryNav; #footer-links{ position: absolute; bottom: 0; width: 100%; } #user-create-admin{ font-size: 12px } .navbar { .brand { .box-sizing(content-box); .hide-text; .customTransition(left, 1s, 0.805, 0.005, 0.165, 0.985); margin: 10px 0 6px; width: 174px; height: 40px; padding: 10px; .icon{ .box-sizing(content-box); background: url(../img/couchdb-site.png) no-repeat 0 0; display: block; height: 100%; width: 100%; } .burger{ .transition(all @transitionSpeed @transitionEaseType); padding-top: 6px; left: -8px; position: absolute; div{ .transition(all @transitionSpeed @transitionEaseType); height: 4px; width: 8px; .border-radius(2); background-color: @navBG; margin: 4px 0px; } } &:hover .burger div{ background-color: @orange; } .closeMenu & { .icon { background: url(../img/minilogo.png) no-repeat 0 0; } width: 45px; .burger{ left: 0; } } } nav { .nav{ margin: 0; li{ .transition(all @transitionSpeed @transitionEaseType); padding: 0; font-size: 20px; line-height: 23px; width: @navWidth; font-weight: normal; font-family: helvetica; .box-sizing(border-box); background-color: @navBG; border-bottom: 1px solid @primaryNav; min-height: 55px; &.active, &:hover{ a{ .box-shadow(none); } background-color: @red; } &:hover .fonticon:before{ color: @white; } &.active .fonticon:before, &:hover .fonticon:before, { text-shadow: @boxShadow; color: @NavIconActive; } a{ padding: 17px 25px 12px 60px; background-color: transparent; color: #fff; text-shadow: @textShadowOff; &.closeMenu{ color: transparent; } .fonticon { position: relative; &:before { position: absolute; top: -5px; left: -44px; font-size: 28px; color: @NavIcon; text-shadow: @boxShadowOff; } } .closeMenu &{ color: transparent; } } } } ul#footer-nav-links{ li{ background-color: @primaryNav; border-top: 1px solid @red; border-bottom: none; font-size: 12px; padding: 12px; min-height: 44px; &.active, &:hover{ background-color: @linkRed; border-top: 1px solid @red; a{ color: white; } } a{ color: @red; } } } ul#bottom-nav-links{ margin-top: 0; li{ min-height: 46px; background-color: @bottomNav; &.active{ background-color:@linkRed; } &:hover{ background-color: @navBGHover; } a{ &.fonticon { position: relative; &:before { left: -40px; font-size: 22px; } } } } } } } } #dashboard { max-width: 1500px; .box-shadow(-6px 0 rgba(0, 0, 0, 0.1)); border-left: 1px solid #999; position: absolute; left: @navWidth; margin-left: 0; padding-left: 0; padding-right: 0; background-color: @sidebarBG; min-width: 600px; height: 100%; .closeMenu &{ left: @collapsedNavWidth; } &.one-pane{ min-width: 800px; margin-top: 0; overflow: auto; } } /*dashboard content can be in multiple templates*/ #dashboard-content{ &.row-fluid, &.window-resizeable{ /*remove gutter without rewriting variable*/ margin-left: 0px; } padding: 20px; .with-sidebar &{ border-left: 1px solid #999; border-right: 1px solid #999; width: auto; .box-shadow(-6px 0 rgba(0, 0, 0, 0.1)); padding: 0px; bottom: 0px; top: 60px; position: absolute; overflow-x: hidden; overflow-y: auto; left: @sidebarWidth; right: 0; .box-sizing(border-box); } > div.inner { display: block; } } .with-sidebar.content-area { position: absolute; top: 0; bottom: 0; left: 0; right: 0; } // .closeMenu .with-sidebar.content-area { // left: 0; // } /*tools*/ .row-fluid.content-area{ background-color: @background; } .fixed-header{ background-color: @breadcrumbBG; position: fixed; top: 0; right: 0; left: @navWidth; .closeMenu & { left: @collapsedNavWidth; } border-bottom: 5px solid @breadcrumbBorder; .box-shadow(0 4px 6px -2px #808080); z-index: 100; .one-pane & { position: relative; border: none; .box-shadow(none); left: auto; } } #breadcrumbs { padding: 15px 20px; .breadcrumb { margin-bottom: 0; background-color: transparent; padding: 0; li { .divider { font-size: 12px; color: @breadcrumbArrow; } &:first-child { font-size: 30px; } color: @breadcrumbText; font-size: 18px; text-shadow: none; &.active{ color: #333; } a{ color: @breadcrumbText; } } } } /*SIDEBAR TEMPLATE STYLES*/ .topmenu-defaults { height: 70px; padding: 12px 10px 0; border-bottom: 1px solid @darkRed; .box-sizing(border-box); } #dashboard-upper-menu{ position: fixed; z-index: 11; .topmenu-defaults; background-color: #CBCBCB; } #dashboard-lower-content{ padding: 20px; background-color: #F1F1F1; } #dashboard-upper-content{ .tab-content { padding-top: 70px; } .well{ padding: 20px; .border-radius(0); .box-shadow(none); } } #sidenav{ padding: 0; header { width: @sidebarWidth; .box-shadow(inset -7px 0 15px -6px #000); background: transparent url('../img/linen.png') repeat 0 0; .topmenu-defaults; } nav { .nav-list{ .divider { border: none; } li.active a { background-color: @darkRed; color: #fff; } a{ display: block; padding: 10px 5px 10px 15px; color: #333333; border-bottom: 1px solid #989898; .divider { background: none; color: #ccc; padding: 0 2px; } } .nav-header{ background-color: #B2B2B2; padding: 5px; text-shadow: none; color: #333333; border-bottom: 1px solid #989898; } } } } #sidebar-content { .box-shadow(-7px 0 15px -6px #000); position: absolute; bottom: 0px; top: 60px; width: @sidebarWidth; left: 0; overflow-x: hidden; overflow-y: auto; background-color: @secondarySidebar; > div.inner { display: block; } } /*ONE PANEL TEMPLATE ONLY STYLES AKA _all_dbs */ .result-tools{ border-bottom: 1px solid #999999; padding: 5px 0; border-bottom: 1px solid #999999; padding: 10px 0; float: left; width: 100%; margin-bottom: 10px; } #db-views-tabs-nav{ position: fixed; z-index: 12; margin-top: 31px; margin-bottom: 0; /*background-color: #f4f4f4;*/ padding: 0 20px; } .db-views-smaller { max-width: 500px; } /** table row selector thing **/ .select{ > a{ display: block; padding: 5px 15px 5px 5px; border: 1px solid #989898; position: relative; background-color: #FFFFFF; color: #666666; &:after { content: ''; width: 0; height: 0; border-left: 7px solid transparent; border-right: 7px solid transparent; border-top: 7px solid #989898; position: absolute; right: 9px; top: 12px; } &:before{ content: ''; border-left: 1px solid #989898; height: 30px; position: absolute; right: 30px; top: 0; } } } .custom-inputs{ input[type=radio], input[type=checkbox] { display: none; } .checkbox label:before { border-radius: 3px; } .controls > .radio:first-child, .controls > .checkbox:first-child { padding-top: 15px; } .radio.inline, .checkbox.inline { display: inline-block; padding-top: 15px; margin-bottom: 12px; vertical-align: middle; } input[type=checkbox]:checked + label:before { /*content: "\2713"; */ content: "\00d7"; text-shadow: 1px 1px 1px rgba(0, 0, 0, .2); font-size: 16px; background-color: @red; color: white; text-align: center; line-height: 15px; } label:before { content: ""; display: inline-block; width: 16px; height: 16px; margin-right: 10px; position: absolute; left: 0; bottom: 1px; background-color: #aaa; box-shadow: inset 0px 2px 3px 0px rgba(0, 0, 0, .3), 0px 1px 0px 0px rgba(255, 255, 255, .8); } .radio label:before { border-radius: 8px; } input[type=radio]:checked + label:before { content: "\2022"; color: #f3f3f3; font-size: 30px; text-align: center; line-height: 18px; } label.drop-down{ &:before{ display: none; } } } form.view-query-update, form.view-query-save { max-width: 100%; } /*logs*/ #log-sidebar{ padding: 20px; } /*documents and databases */ .view.show{ color: @fontGrey; } div.spinner { position: absolute; left: 50%; top: 50%; } #api-navbar{ position: relative; } .api-url-btn { position: absolute; right: 15px; top: -50px; .icon { font-size: 11px; } } .api-navbar { border-top: 1px solid @red; padding: 20px 20px 15px; .input-append.input-prepend { margin-bottom: 0px; .add-on { background: none; padding: 14px 12px 32px 12px; border: none; } .btn:last-child{ margin-left: -1px; background: none; padding: 13px 12px 11px 12px; &:hover{ background-color: @red; color: white; } } } } apache-couchdb-1.6.0/src/fauxton/assets/less/variables.less0000644000175000001440000000364712332105522023713 0ustar00djcusers00000000000000/* Licensed under the Apache License, Version 2.0 (the "License"); you may not * use this file except in compliance with the License. You may obtain a copy of * the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the * License for the specific language governing permissions and limitations under * the License. */ /* = color variables ---------------------------------------------------------------------- */ @brown: #3A2C2B; @red: #E33F3B; @darkRed: #AF2D24; @linkRed: #DA4F49; @greyBrown: #554D4C; @greyBrownLighter: #A59D9D; @fontGrey: #808080; @secondarySidebar: #E4DFDC; @orange: #F3622D; /*nav*/ @primaryNav : @brown; @navBG: @darkRed; @navBGHighlight: @red; @navBGHover: @red; @navIconColor: @darkRed; @navIconHighlight: #FFFFFF; @bottomNav: @greyBrown; /*top header*/ @breadcrumbBG: #F1F1F1; @breadcrumbText: @red; @breadcrumbArrow: #999999; @breadcrumbBorder: @red; /*background colors*/ @background: #F2F2F2; @leftPanel: @background; @rightPanel: #CBCBCB; @defaultText: #4D4D4D; @defaultHTag: #333333; @saveButton: #80A221; @collapsedNavWidth: 62px; @navWidth: 220px; @sidebarBG: #F2F2F2; @sidebarWidth: 330px; @NavIconActive: #ffffff; @NavIcon: @brown; /*buttons */ @redButton: @red; @linkColor: @red; @blue: #049cdb; @blueDark: #0064cd; @green: #7FA30C; //@red: #9d261d; @yellow: #ffcc00; @pink: #c3325f; @purple: #7a43b6; @boxShadow: 2px 2px rgba(0,0,0,0.2); @boxShadowOff: 2px 2px rgba(0,0,0,0); @textShadow: 1px 2px rgba(0,0,0,0.2); @textShadowOff: 1px 2px rgba(0,0,0,0); @radius: 4px; @baseBorderRadius: 0; @transitionSpeed: .25s; @transitionEaseType: linear; apache-couchdb-1.6.0/src/fauxton/assets/less/prettyprint.less0000644000175000001440000000152512332105522024340 0ustar00djcusers00000000000000/* Licensed under the Apache License, Version 2.0 (the "License"); you may not * use this file except in compliance with the License. You may obtain a copy of * the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the * License for the specific language governing permissions and limitations under * the License. */ pre.prettyprint { background: #E5E0DD; border: none; font-size: 83%; line-height: 1.4; margin: 0; padding: 16px; } .prettyprint { .pln, .pun, .typ { color: #333; } .kwd { color: #ff8300; } .str, .lit { color: @red; } .com { color: #666; } } apache-couchdb-1.6.0/src/fauxton/assets/less/icons.less0000644000175000001440000000760112332105522023050 0ustar00djcusers00000000000000/* Licensed under the Apache License, Version 2.0 (the "License"); you may not * use this file except in compliance with the License. You may obtain a copy of * the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the * License for the specific language governing permissions and limitations under * the License. */ @font-face { font-family: "fauxtonicon"; src: url("../img/fontcustom_fauxton.eot"); src: url("../img/fontcustom_fauxton.eot?#iefix") format("embedded-opentype"), url("../img/fontcustom_fauxton.woff") format("woff"), url("../img/fontcustom_fauxton.ttf") format("truetype"), url("../img/fontcustom_fauxton.svg#fontcustom_fauxton") format("svg"); font-weight: normal; font-style: normal; } .fonticon-activetasks:before, .fonticon-bookmark:before, .fonticon-carrot:before, .fonticon-circle-check:before, .fonticon-circle-minus:before, .fonticon-circle-plus:before, .fonticon-circle-x:before, .fonticon-cog:before, .fonticon-collapse:before, .fonticon-dashboard:before, .fonticon-database:before, .fonticon-document:before, .fonticon-documents:before, .fonticon-expand:before, .fonticon-eye:before, .fonticon-key:before, .fonticon-link:before, .fonticon-log:before, .fonticon-minus:before, .fonticon-mixer:before, .fonticon-new-database:before, .fonticon-paperclip:before, .fonticon-pencil:before, .fonticon-play:before, .fonticon-plus:before, .fonticon-profile:before, .fonticon-replicate:before, .fonticon-reply:before, .fonticon-save:before, .fonticon-search:before, .fonticon-stats:before, .fonticon-support:before, .fonticon-swap-arrows:before, .fonticon-trash:before, .fonticon-user:before, .fonticon-users:before, .fonticon-wrench:before, .fonticon-x:before { font-family: "fauxtonicon"; font-style: normal; font-weight: normal; font-variant: normal; text-transform: none; line-height: 1; -webkit-font-smoothing: antialiased; display: inline-block; text-decoration: inherit; } .fonticon-activetasks:before { content: "\f100"; } .fonticon-bookmark:before { content: "\f101"; } .fonticon-carrot:before { content: "\f102"; } .fonticon-circle-check:before { content: "\f103"; } .fonticon-circle-minus:before { content: "\f104"; } .fonticon-circle-plus:before { content: "\f105"; } .fonticon-circle-x:before { content: "\f106"; } .fonticon-cog:before { content: "\f107"; } .fonticon-collapse:before { content: "\f108"; } .fonticon-dashboard:before { content: "\f109"; } .fonticon-database:before { content: "\f10a"; } .fonticon-document:before { content: "\f10b"; } .fonticon-documents:before { content: "\f10c"; } .fonticon-expand:before { content: "\f10d"; } .fonticon-eye:before { content: "\f10e"; } .fonticon-key:before { content: "\f10f"; } .fonticon-link:before { content: "\f110"; } .fonticon-log:before { content: "\f111"; } .fonticon-minus:before { content: "\f112"; } .fonticon-mixer:before { content: "\f113"; } .fonticon-new-database:before { content: "\f114"; } .fonticon-paperclip:before { content: "\f115"; } .fonticon-pencil:before { content: "\f116"; } .fonticon-play:before { content: "\f117"; } .fonticon-plus:before { content: "\f118"; } .fonticon-profile:before { content: "\f119"; } .fonticon-replicate:before { content: "\f11a"; } .fonticon-reply:before { content: "\f11b"; } .fonticon-save:before { content: "\f11c"; } .fonticon-search:before { content: "\f11d"; } .fonticon-stats:before { content: "\f11e"; } .fonticon-support:before { content: "\f11f"; } .fonticon-swap-arrows:before { content: "\f120"; } .fonticon-trash:before { content: "\f121"; } .fonticon-user:before { content: "\f122"; } .fonticon-users:before { content: "\f123"; } .fonticon-wrench:before { content: "\f124"; } .fonticon-x:before { content: "\f125"; } apache-couchdb-1.6.0/src/fauxton/assets/less/bootstrap/0000755000175000001440000000000012332105600023053 5ustar00djcusers00000000000000apache-couchdb-1.6.0/src/fauxton/assets/less/bootstrap/pagination.less0000644000175000001440000000516612332105522026107 0ustar00djcusers00000000000000// // Pagination (multiple pages) // -------------------------------------------------- // Space out pagination from surrounding content .pagination { margin: @baseLineHeight 0; } .pagination ul { // Allow for text-based alignment display: inline-block; .ie7-inline-block(); // Reset default ul styles margin-left: 0; margin-bottom: 0; // Visuals .border-radius(@baseBorderRadius); .box-shadow(0 1px 2px rgba(0,0,0,.05)); } .pagination ul > li { display: inline; // Remove list-style and block-level defaults } .pagination ul > li > a, .pagination ul > li > span { float: left; // Collapse white-space padding: 4px 12px; line-height: @baseLineHeight; text-decoration: none; background-color: @paginationBackground; border: 1px solid @paginationBorder; border-left-width: 0; } .pagination ul > li > a:hover, .pagination ul > li > a:focus, .pagination ul > .active > a, .pagination ul > .active > span { background-color: @paginationActiveBackground; } .pagination ul > .active > a, .pagination ul > .active > span { color: @grayLight; cursor: default; } .pagination ul > .disabled > span, .pagination ul > .disabled > a, .pagination ul > .disabled > a:hover, .pagination ul > .disabled > a:focus { color: @grayLight; background-color: transparent; cursor: default; } .pagination ul > li:first-child > a, .pagination ul > li:first-child > span { border-left-width: 1px; .border-left-radius(@baseBorderRadius); } .pagination ul > li:last-child > a, .pagination ul > li:last-child > span { .border-right-radius(@baseBorderRadius); } // Alignment // -------------------------------------------------- .pagination-centered { text-align: center; } .pagination-right { text-align: right; } // Sizing // -------------------------------------------------- // Large .pagination-large { ul > li > a, ul > li > span { padding: @paddingLarge; font-size: @fontSizeLarge; } ul > li:first-child > a, ul > li:first-child > span { .border-left-radius(@borderRadiusLarge); } ul > li:last-child > a, ul > li:last-child > span { .border-right-radius(@borderRadiusLarge); } } // Small and mini .pagination-mini, .pagination-small { ul > li:first-child > a, ul > li:first-child > span { .border-left-radius(@borderRadiusSmall); } ul > li:last-child > a, ul > li:last-child > span { .border-right-radius(@borderRadiusSmall); } } // Small .pagination-small { ul > li > a, ul > li > span { padding: @paddingSmall; font-size: @fontSizeSmall; } } // Mini .pagination-mini { ul > li > a, ul > li > span { padding: @paddingMini; font-size: @fontSizeMini; } } apache-couchdb-1.6.0/src/fauxton/assets/less/bootstrap/scaffolding.less0000644000175000001440000000156512332105522026234 0ustar00djcusers00000000000000// // Scaffolding // -------------------------------------------------- // Body reset // ------------------------- body { margin: 0; font-family: @baseFontFamily; font-size: @baseFontSize; line-height: @baseLineHeight; color: @textColor; background-color: @bodyBackground; } // Links // ------------------------- a { color: @linkColor; text-decoration: none; } a:hover, a:focus { color: @linkColorHover; text-decoration: underline; } // Images // ------------------------- // Rounded corners .img-rounded { .border-radius(6px); } // Add polaroid-esque trim .img-polaroid { padding: 4px; background-color: #fff; border: 1px solid #ccc; border: 1px solid rgba(0,0,0,.2); .box-shadow(0 1px 3px rgba(0,0,0,.1)); } // Perfect circle .img-circle { .border-radius(500px); // crank the border-radius so it works with most reasonably sized images } apache-couchdb-1.6.0/src/fauxton/assets/less/bootstrap/responsive-navbar.less0000644000175000001440000001035012332105522027411 0ustar00djcusers00000000000000// // Responsive: Navbar // -------------------------------------------------- // TABLETS AND BELOW // ----------------- @media (max-width: @navbarCollapseWidth) { // UNFIX THE TOPBAR // ---------------- // Remove any padding from the body body { padding-top: 0; } // Unfix the navbars .navbar-fixed-top, .navbar-fixed-bottom { position: static; } .navbar-fixed-top { margin-bottom: @baseLineHeight; } .navbar-fixed-bottom { margin-top: @baseLineHeight; } .navbar-fixed-top .navbar-inner, .navbar-fixed-bottom .navbar-inner { padding: 5px; } .navbar .container { width: auto; padding: 0; } // Account for brand name .navbar .brand { padding-left: 10px; padding-right: 10px; margin: 0 0 0 -5px; } // COLLAPSIBLE NAVBAR // ------------------ // Nav collapse clears brand .nav-collapse { clear: both; } // Block-level the nav .nav-collapse .nav { float: none; margin: 0 0 (@baseLineHeight / 2); } .nav-collapse .nav > li { float: none; } .nav-collapse .nav > li > a { margin-bottom: 2px; } .nav-collapse .nav > .divider-vertical { display: none; } .nav-collapse .nav .nav-header { color: @navbarText; text-shadow: none; } // Nav and dropdown links in navbar .nav-collapse .nav > li > a, .nav-collapse .dropdown-menu a { padding: 9px 15px; font-weight: bold; color: @navbarLinkColor; .border-radius(3px); } // Buttons .nav-collapse .btn { padding: 4px 10px 4px; font-weight: normal; .border-radius(@baseBorderRadius); } .nav-collapse .dropdown-menu li + li a { margin-bottom: 2px; } .nav-collapse .nav > li > a:hover, .nav-collapse .nav > li > a:focus, .nav-collapse .dropdown-menu a:hover, .nav-collapse .dropdown-menu a:focus { background-color: @navbarBackground; } .navbar-inverse .nav-collapse .nav > li > a, .navbar-inverse .nav-collapse .dropdown-menu a { color: @navbarInverseLinkColor; } .navbar-inverse .nav-collapse .nav > li > a:hover, .navbar-inverse .nav-collapse .nav > li > a:focus, .navbar-inverse .nav-collapse .dropdown-menu a:hover, .navbar-inverse .nav-collapse .dropdown-menu a:focus { background-color: @navbarInverseBackground; } // Buttons in the navbar .nav-collapse.in .btn-group { margin-top: 5px; padding: 0; } // Dropdowns in the navbar .nav-collapse .dropdown-menu { position: static; top: auto; left: auto; float: none; display: none; max-width: none; margin: 0 15px; padding: 0; background-color: transparent; border: none; .border-radius(0); .box-shadow(none); } .nav-collapse .open > .dropdown-menu { display: block; } .nav-collapse .dropdown-menu:before, .nav-collapse .dropdown-menu:after { display: none; } .nav-collapse .dropdown-menu .divider { display: none; } .nav-collapse .nav > li > .dropdown-menu { &:before, &:after { display: none; } } // Forms in navbar .nav-collapse .navbar-form, .nav-collapse .navbar-search { float: none; padding: (@baseLineHeight / 2) 15px; margin: (@baseLineHeight / 2) 0; border-top: 1px solid @navbarBackground; border-bottom: 1px solid @navbarBackground; .box-shadow(~"inset 0 1px 0 rgba(255,255,255,.1), 0 1px 0 rgba(255,255,255,.1)"); } .navbar-inverse .nav-collapse .navbar-form, .navbar-inverse .nav-collapse .navbar-search { border-top-color: @navbarInverseBackground; border-bottom-color: @navbarInverseBackground; } // Pull right (secondary) nav content .navbar .nav-collapse .nav.pull-right { float: none; margin-left: 0; } // Hide everything in the navbar save .brand and toggle button */ .nav-collapse, .nav-collapse.collapse { overflow: hidden; height: 0; } // Navbar button .navbar .btn-navbar { display: block; } // STATIC NAVBAR // ------------- .navbar-static .navbar-inner { padding-left: 10px; padding-right: 10px; } } // DEFAULT DESKTOP // --------------- @media (min-width: @navbarCollapseDesktopWidth) { // Required to make the collapsing navbar work on regular desktops .nav-collapse.collapse { height: auto !important; overflow: visible !important; } } apache-couchdb-1.6.0/src/fauxton/assets/less/bootstrap/close.less0000644000175000001440000000120412332105522025050 0ustar00djcusers00000000000000// // Close icons // -------------------------------------------------- .close { float: right; font-size: 20px; font-weight: bold; line-height: @baseLineHeight; color: @black; text-shadow: 0 1px 0 rgba(255,255,255,1); .opacity(20); &:hover, &:focus { color: @black; text-decoration: none; cursor: pointer; .opacity(40); } } // Additional properties for button version // iOS requires the button element instead of an anchor tag. // If you want the anchor version, it requires `href="#"`. button.close { padding: 0; cursor: pointer; background: transparent; border: 0; -webkit-appearance: none; }apache-couchdb-1.6.0/src/fauxton/assets/less/bootstrap/responsive-1200px-min.less0000644000175000001440000000106512332105522027656 0ustar00djcusers00000000000000// // Responsive: Large desktop and up // -------------------------------------------------- @media (min-width: 1200px) { // Fixed grid #grid > .core(@gridColumnWidth1200, @gridGutterWidth1200); // Fluid grid #grid > .fluid(@fluidGridColumnWidth1200, @fluidGridGutterWidth1200); // Input grid #grid > .input(@gridColumnWidth1200, @gridGutterWidth1200); // Thumbnails .thumbnails { margin-left: -@gridGutterWidth1200; } .thumbnails > li { margin-left: @gridGutterWidth1200; } .row-fluid .thumbnails { margin-left: 0; } } apache-couchdb-1.6.0/src/fauxton/assets/less/bootstrap/tests/0000755000175000001440000000000012332105600024215 5ustar00djcusers00000000000000apache-couchdb-1.6.0/src/fauxton/assets/less/bootstrap/tests/css-tests.css0000644000175000001440000001254312332105522026667 0ustar00djcusers00000000000000/*! * Bootstrap CSS Tests */ /* Remove background image */ body { background-image: none; } /* Space out subhead */ .subhead { margin-bottom: 36px; } /*h4 { margin-bottom: 5px; } */ .type-test { margin-bottom: 20px; padding: 0 20px 20px; background: url(../../docs/assets/img/grid-baseline-20px.png); } .type-test h1, .type-test h2, .type-test h3, .type-test h4, .type-test h5, .type-test h6 { background-color: rgba(255,0,0,.2); } /* colgroup tests */ .col1 { background-color: rgba(255,0,0,.1); } .col2 { background-color: rgba(0,255,0,.1); } .col3 { background-color: rgba(0,0,255,.1); } /* Fluid row inputs */ #rowInputs .row > [class*=span], #fluidRowInputs .row-fluid > [class*=span] { background-color: rgba(255,0,0,.1); } /* Fluid grid */ .fluid-grid { margin-bottom: 45px; } .fluid-grid .row { height: 40px; padding-top: 10px; margin-top: 10px; color: #ddd; text-align: center; } .fluid-grid .span1 { background-color: #999; } /* Gradients */ [class^="gradient-"] { width: 100%; height: 400px; margin: 20px 0; -webkit-border-radius: 5px; -moz-border-radius: 5px; border-radius: 5px; } .gradient-horizontal { background-color: #333333; background-image: -moz-linear-gradient(left, #555555, #333333); background-image: -webkit-gradient(linear, 0 0, 100% 0, from(#555555), to(#333333)); background-image: -webkit-linear-gradient(left, #555555, #333333); background-image: -o-linear-gradient(left, #555555, #333333); background-image: linear-gradient(to right, #555555, #333333); background-repeat: repeat-x; filter: progid:dximagetransform.microsoft.gradient(startColorstr='#ff555555', endColorstr='#ff333333', GradientType=1); } .gradient-vertical { background-color: #474747; background-image: -moz-linear-gradient(top, #555555, #333333); background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#555555), to(#333333)); background-image: -webkit-linear-gradient(top, #555555, #333333); background-image: -o-linear-gradient(top, #555555, #333333); background-image: linear-gradient(to bottom, #555555, #333333); background-repeat: repeat-x; filter: progid:dximagetransform.microsoft.gradient(startColorstr='#ff555555', endColorstr='#ff333333', GradientType=0); } .gradient-directional { background-color: #333333; background-image: -moz-linear-gradient(45deg, #555555, #333333); background-image: -webkit-linear-gradient(45deg, #555555, #333333); background-image: -o-linear-gradient(45deg, #555555, #333333); background-image: linear-gradient(45deg, #555555, #333333); background-repeat: repeat-x; } .gradient-vertical-three { background-color: #8940a5; background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#00b3ee), color-stop(50%, #7a43b6), to(#c3325f)); background-image: -webkit-linear-gradient(#00b3ee, #7a43b6 50%, #c3325f); background-image: -moz-linear-gradient(top, #00b3ee, #7a43b6 50%, #c3325f); background-image: -o-linear-gradient(#00b3ee, #7a43b6 50%, #c3325f); background-image: linear-gradient(#00b3ee, #7a43b6 50%, #c3325f); background-repeat: no-repeat; filter: progid:dximagetransform.microsoft.gradient(startColorstr='#ff00b3ee', endColorstr='#ffc3325f', GradientType=0); } .gradient-radial { background-color: #333333; background-image: -webkit-gradient(radial, center center, 0, center center, 460, from(#555555), to(#333333)); background-image: -webkit-radial-gradient(circle, #555555, #333333); background-image: -moz-radial-gradient(circle, #555555, #333333); background-image: -o-radial-gradient(circle, #555555, #333333); background-repeat: no-repeat; } .gradient-striped { background-color: #555555; background-image: -webkit-gradient(linear, 0 100%, 100% 0, color-stop(0.25, rgba(255, 255, 255, 0.15)), color-stop(0.25, transparent), color-stop(0.5, transparent), color-stop(0.5, rgba(255, 255, 255, 0.15)), color-stop(0.75, rgba(255, 255, 255, 0.15)), color-stop(0.75, transparent), to(transparent)); background-image: -webkit-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); background-image: -moz-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); background-image: -o-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); background-image: linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); } .gradient-horizontal-three { background-color: #00b3ee; background-image: -webkit-gradient(left, linear, 0 0, 0 100%, from(#00b3ee), color-stop(50%, #7a43b6), to(#c3325f)); background-image: -webkit-linear-gradient(left, #00b3ee, #7a43b6 50%, #c3325f); background-image: -moz-linear-gradient(left, #00b3ee, #7a43b6 50%, #c3325f); background-image: -o-linear-gradient(left, #00b3ee, #7a43b6 50%, #c3325f); background-image: linear-gradient(to right, #00b3ee, #7a43b6 50%, #c3325f); background-repeat: no-repeat; filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#00b3ee', endColorstr='#c3325f', GradientType=0); } apache-couchdb-1.6.0/src/fauxton/assets/less/bootstrap/tests/buttons.html0000644000175000001440000001441312332105522026607 0ustar00djcusers00000000000000 Buttons · Bootstrap apache-couchdb-1.6.0/src/fauxton/assets/less/bootstrap/tooltip.less0000644000175000001440000000322412332105522025441 0ustar00djcusers00000000000000// // Tooltips // -------------------------------------------------- // Base class .tooltip { position: absolute; z-index: @zindexTooltip; display: block; visibility: visible; font-size: 11px; line-height: 1.4; .opacity(0); &.in { .opacity(80); } &.top { margin-top: -3px; padding: 5px 0; } &.right { margin-left: 3px; padding: 0 5px; } &.bottom { margin-top: 3px; padding: 5px 0; } &.left { margin-left: -3px; padding: 0 5px; } } // Wrapper for the tooltip content .tooltip-inner { max-width: 200px; padding: 8px; color: @tooltipColor; text-align: center; text-decoration: none; background-color: @tooltipBackground; .border-radius(@baseBorderRadius); } // Arrows .tooltip-arrow { position: absolute; width: 0; height: 0; border-color: transparent; border-style: solid; } .tooltip { &.top .tooltip-arrow { bottom: 0; left: 50%; margin-left: -@tooltipArrowWidth; border-width: @tooltipArrowWidth @tooltipArrowWidth 0; border-top-color: @tooltipArrowColor; } &.right .tooltip-arrow { top: 50%; left: 0; margin-top: -@tooltipArrowWidth; border-width: @tooltipArrowWidth @tooltipArrowWidth @tooltipArrowWidth 0; border-right-color: @tooltipArrowColor; } &.left .tooltip-arrow { top: 50%; right: 0; margin-top: -@tooltipArrowWidth; border-width: @tooltipArrowWidth 0 @tooltipArrowWidth @tooltipArrowWidth; border-left-color: @tooltipArrowColor; } &.bottom .tooltip-arrow { top: 0; left: 50%; margin-left: -@tooltipArrowWidth; border-width: 0 @tooltipArrowWidth @tooltipArrowWidth; border-bottom-color: @tooltipArrowColor; } } apache-couchdb-1.6.0/src/fauxton/assets/less/bootstrap/progress-bars.less0000644000175000001440000000545212332105522026545 0ustar00djcusers00000000000000// // Progress bars // -------------------------------------------------- // ANIMATIONS // ---------- // Webkit @-webkit-keyframes progress-bar-stripes { from { background-position: 40px 0; } to { background-position: 0 0; } } // Firefox @-moz-keyframes progress-bar-stripes { from { background-position: 40px 0; } to { background-position: 0 0; } } // IE9 @-ms-keyframes progress-bar-stripes { from { background-position: 40px 0; } to { background-position: 0 0; } } // Opera @-o-keyframes progress-bar-stripes { from { background-position: 0 0; } to { background-position: 40px 0; } } // Spec @keyframes progress-bar-stripes { from { background-position: 40px 0; } to { background-position: 0 0; } } // THE BARS // -------- // Outer container .progress { overflow: hidden; height: @baseLineHeight; margin-bottom: @baseLineHeight; #gradient > .vertical(#f5f5f5, #f9f9f9); .box-shadow(inset 0 1px 2px rgba(0,0,0,.1)); .border-radius(@baseBorderRadius); } // Bar of progress .progress .bar { width: 0%; height: 100%; color: @white; float: left; font-size: 12px; text-align: center; text-shadow: 0 -1px 0 rgba(0,0,0,.25); #gradient > .vertical(#149bdf, #0480be); .box-shadow(inset 0 -1px 0 rgba(0,0,0,.15)); .box-sizing(border-box); .transition(width .6s ease); } .progress .bar + .bar { .box-shadow(~"inset 1px 0 0 rgba(0,0,0,.15), inset 0 -1px 0 rgba(0,0,0,.15)"); } // Striped bars .progress-striped .bar { #gradient > .striped(#149bdf); .background-size(40px 40px); } // Call animation for the active one .progress.active .bar { -webkit-animation: progress-bar-stripes 2s linear infinite; -moz-animation: progress-bar-stripes 2s linear infinite; -ms-animation: progress-bar-stripes 2s linear infinite; -o-animation: progress-bar-stripes 2s linear infinite; animation: progress-bar-stripes 2s linear infinite; } // COLORS // ------ // Danger (red) .progress-danger .bar, .progress .bar-danger { #gradient > .vertical(#ee5f5b, #c43c35); } .progress-danger.progress-striped .bar, .progress-striped .bar-danger { #gradient > .striped(#ee5f5b); } // Success (green) .progress-success .bar, .progress .bar-success { #gradient > .vertical(#62c462, #57a957); } .progress-success.progress-striped .bar, .progress-striped .bar-success { #gradient > .striped(#62c462); } // Info (teal) .progress-info .bar, .progress .bar-info { #gradient > .vertical(#5bc0de, #339bb9); } .progress-info.progress-striped .bar, .progress-striped .bar-info { #gradient > .striped(#5bc0de); } // Warning (orange) .progress-warning .bar, .progress .bar-warning { #gradient > .vertical(lighten(@orange, 15%), @orange); } .progress-warning.progress-striped .bar, .progress-striped .bar-warning { #gradient > .striped(lighten(@orange, 15%)); } apache-couchdb-1.6.0/src/fauxton/assets/less/bootstrap/hero-unit.less0000644000175000001440000000101112332105522025651 0ustar00djcusers00000000000000// // Hero unit // -------------------------------------------------- .hero-unit { padding: 60px; margin-bottom: 30px; font-size: 18px; font-weight: 200; line-height: @baseLineHeight * 1.5; color: @heroUnitLeadColor; background-color: @heroUnitBackground; .border-radius(6px); h1 { margin-bottom: 0; font-size: 60px; line-height: 1; color: @heroUnitHeadingColor; letter-spacing: -1px; } li { line-height: @baseLineHeight * 1.5; // Reset since we specify in type.less } } apache-couchdb-1.6.0/src/fauxton/assets/less/bootstrap/sprites.less0000644000175000001440000002513112332105522025441 0ustar00djcusers00000000000000// // Sprites // -------------------------------------------------- // ICONS // ----- // All icons receive the styles of the tag with a base class // of .i and are then given a unique class to add width, height, // and background-position. Your resulting HTML will look like // . // For the white version of the icons, just add the .icon-white class: // [class^="icon-"], [class*=" icon-"] { display: inline-block; width: 14px; height: 14px; .ie7-restore-right-whitespace(); line-height: 14px; vertical-align: text-top; background-image: url("@{iconSpritePath}"); background-position: 14px 14px; background-repeat: no-repeat; margin-top: 1px; } /* White icons with optional class, or on hover/focus/active states of certain elements */ .icon-white, .nav-pills > .active > a > [class^="icon-"], .nav-pills > .active > a > [class*=" icon-"], .nav-list > .active > a > [class^="icon-"], .nav-list > .active > a > [class*=" icon-"], .navbar-inverse .nav > .active > a > [class^="icon-"], .navbar-inverse .nav > .active > a > [class*=" icon-"], .dropdown-menu > li > a:hover > [class^="icon-"], .dropdown-menu > li > a:focus > [class^="icon-"], .dropdown-menu > li > a:hover > [class*=" icon-"], .dropdown-menu > li > a:focus > [class*=" icon-"], .dropdown-menu > .active > a > [class^="icon-"], .dropdown-menu > .active > a > [class*=" icon-"], .dropdown-submenu:hover > a > [class^="icon-"], .dropdown-submenu:focus > a > [class^="icon-"], .dropdown-submenu:hover > a > [class*=" icon-"], .dropdown-submenu:focus > a > [class*=" icon-"] { background-image: url("@{iconWhiteSpritePath}"); } .icon-glass { background-position: 0 0; } .icon-music { background-position: -24px 0; } .icon-search { background-position: -48px 0; } .icon-envelope { background-position: -72px 0; } .icon-heart { background-position: -96px 0; } .icon-star { background-position: -120px 0; } .icon-star-empty { background-position: -144px 0; } .icon-user { background-position: -168px 0; } .icon-film { background-position: -192px 0; } .icon-th-large { background-position: -216px 0; } .icon-th { background-position: -240px 0; } .icon-th-list { background-position: -264px 0; } .icon-ok { background-position: -288px 0; } .icon-remove { background-position: -312px 0; } .icon-zoom-in { background-position: -336px 0; } .icon-zoom-out { background-position: -360px 0; } .icon-off { background-position: -384px 0; } .icon-signal { background-position: -408px 0; } .icon-cog { background-position: -432px 0; } .icon-trash { background-position: -456px 0; } .icon-home { background-position: 0 -24px; } .icon-file { background-position: -24px -24px; } .icon-time { background-position: -48px -24px; } .icon-road { background-position: -72px -24px; } .icon-download-alt { background-position: -96px -24px; } .icon-download { background-position: -120px -24px; } .icon-upload { background-position: -144px -24px; } .icon-inbox { background-position: -168px -24px; } .icon-play-circle { background-position: -192px -24px; } .icon-repeat { background-position: -216px -24px; } .icon-refresh { background-position: -240px -24px; } .icon-list-alt { background-position: -264px -24px; } .icon-lock { background-position: -287px -24px; } // 1px off .icon-flag { background-position: -312px -24px; } .icon-headphones { background-position: -336px -24px; } .icon-volume-off { background-position: -360px -24px; } .icon-volume-down { background-position: -384px -24px; } .icon-volume-up { background-position: -408px -24px; } .icon-qrcode { background-position: -432px -24px; } .icon-barcode { background-position: -456px -24px; } .icon-tag { background-position: 0 -48px; } .icon-tags { background-position: -25px -48px; } // 1px off .icon-book { background-position: -48px -48px; } .icon-bookmark { background-position: -72px -48px; } .icon-print { background-position: -96px -48px; } .icon-camera { background-position: -120px -48px; } .icon-font { background-position: -144px -48px; } .icon-bold { background-position: -167px -48px; } // 1px off .icon-italic { background-position: -192px -48px; } .icon-text-height { background-position: -216px -48px; } .icon-text-width { background-position: -240px -48px; } .icon-align-left { background-position: -264px -48px; } .icon-align-center { background-position: -288px -48px; } .icon-align-right { background-position: -312px -48px; } .icon-align-justify { background-position: -336px -48px; } .icon-list { background-position: -360px -48px; } .icon-indent-left { background-position: -384px -48px; } .icon-indent-right { background-position: -408px -48px; } .icon-facetime-video { background-position: -432px -48px; } .icon-picture { background-position: -456px -48px; } .icon-pencil { background-position: 0 -72px; } .icon-map-marker { background-position: -24px -72px; } .icon-adjust { background-position: -48px -72px; } .icon-tint { background-position: -72px -72px; } .icon-edit { background-position: -96px -72px; } .icon-share { background-position: -120px -72px; } .icon-check { background-position: -144px -72px; } .icon-move { background-position: -168px -72px; } .icon-step-backward { background-position: -192px -72px; } .icon-fast-backward { background-position: -216px -72px; } .icon-backward { background-position: -240px -72px; } .icon-play { background-position: -264px -72px; } .icon-pause { background-position: -288px -72px; } .icon-stop { background-position: -312px -72px; } .icon-forward { background-position: -336px -72px; } .icon-fast-forward { background-position: -360px -72px; } .icon-step-forward { background-position: -384px -72px; } .icon-eject { background-position: -408px -72px; } .icon-chevron-left { background-position: -432px -72px; } .icon-chevron-right { background-position: -456px -72px; } .icon-plus-sign { background-position: 0 -96px; } .icon-minus-sign { background-position: -24px -96px; } .icon-remove-sign { background-position: -48px -96px; } .icon-ok-sign { background-position: -72px -96px; } .icon-question-sign { background-position: -96px -96px; } .icon-info-sign { background-position: -120px -96px; } .icon-screenshot { background-position: -144px -96px; } .icon-remove-circle { background-position: -168px -96px; } .icon-ok-circle { background-position: -192px -96px; } .icon-ban-circle { background-position: -216px -96px; } .icon-arrow-left { background-position: -240px -96px; } .icon-arrow-right { background-position: -264px -96px; } .icon-arrow-up { background-position: -289px -96px; } // 1px off .icon-arrow-down { background-position: -312px -96px; } .icon-share-alt { background-position: -336px -96px; } .icon-resize-full { background-position: -360px -96px; } .icon-resize-small { background-position: -384px -96px; } .icon-plus { background-position: -408px -96px; } .icon-minus { background-position: -433px -96px; } .icon-asterisk { background-position: -456px -96px; } .icon-exclamation-sign { background-position: 0 -120px; } .icon-gift { background-position: -24px -120px; } .icon-leaf { background-position: -48px -120px; } .icon-fire { background-position: -72px -120px; } .icon-eye-open { background-position: -96px -120px; } .icon-eye-close { background-position: -120px -120px; } .icon-warning-sign { background-position: -144px -120px; } .icon-plane { background-position: -168px -120px; } .icon-calendar { background-position: -192px -120px; } .icon-random { background-position: -216px -120px; width: 16px; } .icon-comment { background-position: -240px -120px; } .icon-magnet { background-position: -264px -120px; } .icon-chevron-up { background-position: -288px -120px; } .icon-chevron-down { background-position: -313px -119px; } // 1px, 1px off .icon-retweet { background-position: -336px -120px; } .icon-shopping-cart { background-position: -360px -120px; } .icon-folder-close { background-position: -384px -120px; width: 16px; } .icon-folder-open { background-position: -408px -120px; width: 16px; } .icon-resize-vertical { background-position: -432px -119px; } // 1px, 1px off .icon-resize-horizontal { background-position: -456px -118px; } // 1px, 2px off .icon-hdd { background-position: 0 -144px; } .icon-bullhorn { background-position: -24px -144px; } .icon-bell { background-position: -48px -144px; } .icon-certificate { background-position: -72px -144px; } .icon-thumbs-up { background-position: -96px -144px; } .icon-thumbs-down { background-position: -120px -144px; } .icon-hand-right { background-position: -144px -144px; } .icon-hand-left { background-position: -168px -144px; } .icon-hand-up { background-position: -192px -144px; } .icon-hand-down { background-position: -216px -144px; } .icon-circle-arrow-right { background-position: -240px -144px; } .icon-circle-arrow-left { background-position: -264px -144px; } .icon-circle-arrow-up { background-position: -288px -144px; } .icon-circle-arrow-down { background-position: -312px -144px; } .icon-globe { background-position: -336px -144px; } .icon-wrench { background-position: -360px -144px; } .icon-tasks { background-position: -384px -144px; } .icon-filter { background-position: -408px -144px; } .icon-briefcase { background-position: -432px -144px; } .icon-fullscreen { background-position: -456px -144px; } apache-couchdb-1.6.0/src/fauxton/assets/less/bootstrap/type.less0000644000175000001440000001137112332105522024732 0ustar00djcusers00000000000000// // Typography // -------------------------------------------------- // Body text // ------------------------- p { margin: 0 0 @baseLineHeight / 2; } .lead { margin-bottom: @baseLineHeight; font-size: @baseFontSize * 1.5; font-weight: 200; line-height: @baseLineHeight * 1.5; } // Emphasis & misc // ------------------------- // Ex: 14px base font * 85% = about 12px small { font-size: 85%; } strong { font-weight: bold; } em { font-style: italic; } cite { font-style: normal; } // Utility classes .muted { color: @grayLight; } a.muted:hover, a.muted:focus { color: darken(@grayLight, 10%); } .text-warning { color: @warningText; } a.text-warning:hover, a.text-warning:focus { color: darken(@warningText, 10%); } .text-error { color: @errorText; } a.text-error:hover, a.text-error:focus { color: darken(@errorText, 10%); } .text-info { color: @infoText; } a.text-info:hover, a.text-info:focus { color: darken(@infoText, 10%); } .text-success { color: @successText; } a.text-success:hover, a.text-success:focus { color: darken(@successText, 10%); } .text-left { text-align: left; } .text-right { text-align: right; } .text-center { text-align: center; } // Headings // ------------------------- h1, h2, h3, h4, h5, h6 { margin: (@baseLineHeight / 2) 0; font-family: @headingsFontFamily; font-weight: @headingsFontWeight; line-height: @baseLineHeight; color: @headingsColor; text-rendering: optimizelegibility; // Fix the character spacing for headings small { font-weight: normal; line-height: 1; color: @grayLight; } } h1, h2, h3 { line-height: @baseLineHeight * 2; } h1 { font-size: @baseFontSize * 2.75; } // ~38px h2 { font-size: @baseFontSize * 2.25; } // ~32px h3 { font-size: @baseFontSize * 1.75; } // ~24px h4 { font-size: @baseFontSize * 1.25; } // ~18px h5 { font-size: @baseFontSize; } h6 { font-size: @baseFontSize * 0.85; } // ~12px h1 small { font-size: @baseFontSize * 1.75; } // ~24px h2 small { font-size: @baseFontSize * 1.25; } // ~18px h3 small { font-size: @baseFontSize; } h4 small { font-size: @baseFontSize; } // Page header // ------------------------- .page-header { padding-bottom: (@baseLineHeight / 2) - 1; margin: @baseLineHeight 0 (@baseLineHeight * 1.5); border-bottom: 1px solid @grayLighter; } // Lists // -------------------------------------------------- // Unordered and Ordered lists ul, ol { padding: 0; margin: 0 0 @baseLineHeight / 2 25px; } ul ul, ul ol, ol ol, ol ul { margin-bottom: 0; } li { line-height: @baseLineHeight; } // Remove default list styles ul.unstyled, ol.unstyled { margin-left: 0; list-style: none; } // Single-line list items ul.inline, ol.inline { margin-left: 0; list-style: none; > li { display: inline-block; .ie7-inline-block(); padding-left: 5px; padding-right: 5px; } } // Description Lists dl { margin-bottom: @baseLineHeight; } dt, dd { line-height: @baseLineHeight; } dt { font-weight: bold; } dd { margin-left: @baseLineHeight / 2; } // Horizontal layout (like forms) .dl-horizontal { .clearfix(); // Ensure dl clears floats if empty dd elements present dt { float: left; width: @horizontalComponentOffset - 20; clear: left; text-align: right; .text-overflow(); } dd { margin-left: @horizontalComponentOffset; } } // MISC // ---- // Horizontal rules hr { margin: @baseLineHeight 0; border: 0; border-top: 1px solid @hrBorder; border-bottom: 1px solid @white; } // Abbreviations and acronyms abbr[title], // Added data-* attribute to help out our tooltip plugin, per https://github.com/twitter/bootstrap/issues/5257 abbr[data-original-title] { cursor: help; border-bottom: 1px dotted @grayLight; } abbr.initialism { font-size: 90%; text-transform: uppercase; } // Blockquotes blockquote { padding: 0 0 0 15px; margin: 0 0 @baseLineHeight; border-left: 5px solid @grayLighter; p { margin-bottom: 0; font-size: @baseFontSize * 1.25; font-weight: 300; line-height: 1.25; } small { display: block; line-height: @baseLineHeight; color: @grayLight; &:before { content: '\2014 \00A0'; } } // Float right with text-align: right &.pull-right { float: right; padding-right: 15px; padding-left: 0; border-right: 5px solid @grayLighter; border-left: 0; p, small { text-align: right; } small { &:before { content: ''; } &:after { content: '\00A0 \2014'; } } } } // Quotes q:before, q:after, blockquote:before, blockquote:after { content: ""; } // Addresses address { display: block; margin-bottom: @baseLineHeight; font-style: normal; line-height: @baseLineHeight; } apache-couchdb-1.6.0/src/fauxton/assets/less/bootstrap/alerts.less0000644000175000001440000000253112332105522025241 0ustar00djcusers00000000000000// // Alerts // -------------------------------------------------- // Base styles // ------------------------- .alert { padding: 8px 35px 8px 14px; margin-bottom: @baseLineHeight; text-shadow: 0 1px 0 rgba(255,255,255,.5); background-color: @warningBackground; border: 1px solid @warningBorder; .border-radius(@baseBorderRadius); } .alert, .alert h4 { // Specified for the h4 to prevent conflicts of changing @headingsColor color: @warningText; } .alert h4 { margin: 0; } // Adjust close link position .alert .close { position: relative; top: -2px; right: -21px; line-height: @baseLineHeight; } // Alternate styles // ------------------------- .alert-success { background-color: @successBackground; border-color: @successBorder; color: @successText; } .alert-success h4 { color: @successText; } .alert-danger, .alert-error { background-color: @errorBackground; border-color: @errorBorder; color: @errorText; } .alert-danger h4, .alert-error h4 { color: @errorText; } .alert-info { background-color: @infoBackground; border-color: @infoBorder; color: @infoText; } .alert-info h4 { color: @infoText; } // Block alerts // ------------------------- .alert-block { padding-top: 14px; padding-bottom: 14px; } .alert-block > p, .alert-block > ul { margin-bottom: 0; } .alert-block p + p { margin-top: 5px; } apache-couchdb-1.6.0/src/fauxton/assets/less/bootstrap/labels-badges.less0000644000175000001440000000353412332105522026440 0ustar00djcusers00000000000000// // Labels and badges // -------------------------------------------------- // Base classes .label, .badge { display: inline-block; padding: 2px 4px; font-size: @baseFontSize * .846; font-weight: bold; line-height: 14px; // ensure proper line-height if floated color: @white; vertical-align: baseline; white-space: nowrap; text-shadow: 0 -1px 0 rgba(0,0,0,.25); background-color: @grayLight; } // Set unique padding and border-radii .label { .border-radius(3px); } .badge { padding-left: 9px; padding-right: 9px; .border-radius(9px); } // Empty labels/badges collapse .label, .badge { &:empty { display: none; } } // Hover/focus state, but only for links a { &.label:hover, &.label:focus, &.badge:hover, &.badge:focus { color: @white; text-decoration: none; cursor: pointer; } } // Colors // Only give background-color difference to links (and to simplify, we don't qualifty with `a` but [href] attribute) .label, .badge { // Important (red) &-important { background-color: @errorText; } &-important[href] { background-color: darken(@errorText, 10%); } // Warnings (orange) &-warning { background-color: @orange; } &-warning[href] { background-color: darken(@orange, 10%); } // Success (green) &-success { background-color: @successText; } &-success[href] { background-color: darken(@successText, 10%); } // Info (turquoise) &-info { background-color: @infoText; } &-info[href] { background-color: darken(@infoText, 10%); } // Inverse (black) &-inverse { background-color: @grayDark; } &-inverse[href] { background-color: darken(@grayDark, 10%); } } // Quick fix for labels/badges in buttons .btn { .label, .badge { position: relative; top: -1px; } } .btn-mini { .label, .badge { top: 0; } } apache-couchdb-1.6.0/src/fauxton/assets/less/bootstrap/responsive-utilities.less0000644000175000001440000000310212332105522030150 0ustar00djcusers00000000000000// // Responsive: Utility classes // -------------------------------------------------- // IE10 Metro responsive // Required for Windows 8 Metro split-screen snapping with IE10 // Source: http://timkadlec.com/2012/10/ie10-snap-mode-and-responsive-design/ @-ms-viewport{ width: device-width; } // Hide from screenreaders and browsers // Credit: HTML5 Boilerplate .hidden { display: none; visibility: hidden; } // Visibility utilities // For desktops .visible-phone { display: none !important; } .visible-tablet { display: none !important; } .hidden-phone { } .hidden-tablet { } .hidden-desktop { display: none !important; } .visible-desktop { display: inherit !important; } // Tablets & small desktops only @media (min-width: 768px) and (max-width: 979px) { // Hide everything else .hidden-desktop { display: inherit !important; } .visible-desktop { display: none !important ; } // Show .visible-tablet { display: inherit !important; } // Hide .hidden-tablet { display: none !important; } } // Phones only @media (max-width: 767px) { // Hide everything else .hidden-desktop { display: inherit !important; } .visible-desktop { display: none !important; } // Show .visible-phone { display: inherit !important; } // Use inherit to restore previous behavior // Hide .hidden-phone { display: none !important; } } // Print utilities .visible-print { display: none !important; } .hidden-print { } @media print { .visible-print { display: inherit !important; } .hidden-print { display: none !important; } } apache-couchdb-1.6.0/src/fauxton/assets/less/bootstrap/responsive-768px-979px.less0000644000175000001440000000071712332105522027740 0ustar00djcusers00000000000000// // Responsive: Tablet to desktop // -------------------------------------------------- @media (min-width: 768px) and (max-width: 979px) { // Fixed grid #grid > .core(@gridColumnWidth768, @gridGutterWidth768); // Fluid grid #grid > .fluid(@fluidGridColumnWidth768, @fluidGridGutterWidth768); // Input grid #grid > .input(@gridColumnWidth768, @gridGutterWidth768); // No need to reset .thumbnails here since it's the same @gridGutterWidth } apache-couchdb-1.6.0/src/fauxton/assets/less/bootstrap/navs.less0000644000175000001440000001774312332105522024731 0ustar00djcusers00000000000000// // Navs // -------------------------------------------------- // BASE CLASS // ---------- .nav { margin-left: 0; margin-bottom: @baseLineHeight; list-style: none; } // Make links block level .nav > li > a { display: block; } .nav > li > a:hover, .nav > li > a:focus { text-decoration: none; background-color: @grayLighter; } // Prevent IE8 from misplacing imgs // See https://github.com/h5bp/html5-boilerplate/issues/984#issuecomment-3985989 .nav > li > a > img { max-width: none; } // Redeclare pull classes because of specifity .nav > .pull-right { float: right; } // Nav headers (for dropdowns and lists) .nav-header { display: block; padding: 3px 15px; font-size: 11px; font-weight: bold; line-height: @baseLineHeight; color: @grayLight; text-shadow: 0 1px 0 rgba(255,255,255,.5); text-transform: uppercase; } // Space them out when they follow another list item (link) .nav li + .nav-header { margin-top: 9px; } // NAV LIST // -------- .nav-list { padding-left: 15px; padding-right: 15px; margin-bottom: 0; } .nav-list > li > a, .nav-list .nav-header { margin-left: -15px; margin-right: -15px; text-shadow: 0 1px 0 rgba(255,255,255,.5); } .nav-list > li > a { padding: 3px 15px; } .nav-list > .active > a, .nav-list > .active > a:hover, .nav-list > .active > a:focus { color: @white; text-shadow: 0 -1px 0 rgba(0,0,0,.2); background-color: @linkColor; } .nav-list [class^="icon-"], .nav-list [class*=" icon-"] { margin-right: 2px; } // Dividers (basically an hr) within the dropdown .nav-list .divider { .nav-divider(); } // TABS AND PILLS // ------------- // Common styles .nav-tabs, .nav-pills { .clearfix(); } .nav-tabs > li, .nav-pills > li { float: left; } .nav-tabs > li > a, .nav-pills > li > a { padding-right: 12px; padding-left: 12px; margin-right: 2px; line-height: 14px; // keeps the overall height an even number } // TABS // ---- // Give the tabs something to sit on .nav-tabs { border-bottom: 1px solid #ddd; } // Make the list-items overlay the bottom border .nav-tabs > li { margin-bottom: -1px; } // Actual tabs (as links) .nav-tabs > li > a { padding-top: 8px; padding-bottom: 8px; line-height: @baseLineHeight; border: 1px solid transparent; .border-radius(4px 4px 0 0); &:hover, &:focus { border-color: @grayLighter @grayLighter #ddd; } } // Active state, and it's :hover/:focus to override normal :hover/:focus .nav-tabs > .active > a, .nav-tabs > .active > a:hover, .nav-tabs > .active > a:focus { color: @gray; background-color: @bodyBackground; border: 1px solid #ddd; border-bottom-color: transparent; cursor: default; } // PILLS // ----- // Links rendered as pills .nav-pills > li > a { padding-top: 8px; padding-bottom: 8px; margin-top: 2px; margin-bottom: 2px; .border-radius(5px); } // Active state .nav-pills > .active > a, .nav-pills > .active > a:hover, .nav-pills > .active > a:focus { color: @white; background-color: @linkColor; } // STACKED NAV // ----------- // Stacked tabs and pills .nav-stacked > li { float: none; } .nav-stacked > li > a { margin-right: 0; // no need for the gap between nav items } // Tabs .nav-tabs.nav-stacked { border-bottom: 0; } .nav-tabs.nav-stacked > li > a { border: 1px solid #ddd; .border-radius(0); } .nav-tabs.nav-stacked > li:first-child > a { .border-top-radius(4px); } .nav-tabs.nav-stacked > li:last-child > a { .border-bottom-radius(4px); } .nav-tabs.nav-stacked > li > a:hover, .nav-tabs.nav-stacked > li > a:focus { border-color: #ddd; z-index: 2; } // Pills .nav-pills.nav-stacked > li > a { margin-bottom: 3px; } .nav-pills.nav-stacked > li:last-child > a { margin-bottom: 1px; // decrease margin to match sizing of stacked tabs } // DROPDOWNS // --------- .nav-tabs .dropdown-menu { .border-radius(0 0 6px 6px); // remove the top rounded corners here since there is a hard edge above the menu } .nav-pills .dropdown-menu { .border-radius(6px); // make rounded corners match the pills } // Default dropdown links // ------------------------- // Make carets use linkColor to start .nav .dropdown-toggle .caret { border-top-color: @linkColor; border-bottom-color: @linkColor; margin-top: 6px; } .nav .dropdown-toggle:hover .caret, .nav .dropdown-toggle:focus .caret { border-top-color: @linkColorHover; border-bottom-color: @linkColorHover; } /* move down carets for tabs */ .nav-tabs .dropdown-toggle .caret { margin-top: 8px; } // Active dropdown links // ------------------------- .nav .active .dropdown-toggle .caret { border-top-color: #fff; border-bottom-color: #fff; } .nav-tabs .active .dropdown-toggle .caret { border-top-color: @gray; border-bottom-color: @gray; } // Active:hover/:focus dropdown links // ------------------------- .nav > .dropdown.active > a:hover, .nav > .dropdown.active > a:focus { cursor: pointer; } // Open dropdowns // ------------------------- .nav-tabs .open .dropdown-toggle, .nav-pills .open .dropdown-toggle, .nav > li.dropdown.open.active > a:hover, .nav > li.dropdown.open.active > a:focus { color: @white; background-color: @grayLight; border-color: @grayLight; } .nav li.dropdown.open .caret, .nav li.dropdown.open.active .caret, .nav li.dropdown.open a:hover .caret, .nav li.dropdown.open a:focus .caret { border-top-color: @white; border-bottom-color: @white; .opacity(100); } // Dropdowns in stacked tabs .tabs-stacked .open > a:hover, .tabs-stacked .open > a:focus { border-color: @grayLight; } // TABBABLE // -------- // COMMON STYLES // ------------- // Clear any floats .tabbable { .clearfix(); } .tab-content { overflow: auto; // prevent content from running below tabs } // Remove border on bottom, left, right .tabs-below > .nav-tabs, .tabs-right > .nav-tabs, .tabs-left > .nav-tabs { border-bottom: 0; } // Show/hide tabbable areas .tab-content > .tab-pane, .pill-content > .pill-pane { display: none; } .tab-content > .active, .pill-content > .active { display: block; } // BOTTOM // ------ .tabs-below > .nav-tabs { border-top: 1px solid #ddd; } .tabs-below > .nav-tabs > li { margin-top: -1px; margin-bottom: 0; } .tabs-below > .nav-tabs > li > a { .border-radius(0 0 4px 4px); &:hover, &:focus { border-bottom-color: transparent; border-top-color: #ddd; } } .tabs-below > .nav-tabs > .active > a, .tabs-below > .nav-tabs > .active > a:hover, .tabs-below > .nav-tabs > .active > a:focus { border-color: transparent #ddd #ddd #ddd; } // LEFT & RIGHT // ------------ // Common styles .tabs-left > .nav-tabs > li, .tabs-right > .nav-tabs > li { float: none; } .tabs-left > .nav-tabs > li > a, .tabs-right > .nav-tabs > li > a { min-width: 74px; margin-right: 0; margin-bottom: 3px; } // Tabs on the left .tabs-left > .nav-tabs { float: left; margin-right: 19px; border-right: 1px solid #ddd; } .tabs-left > .nav-tabs > li > a { margin-right: -1px; .border-radius(4px 0 0 4px); } .tabs-left > .nav-tabs > li > a:hover, .tabs-left > .nav-tabs > li > a:focus { border-color: @grayLighter #ddd @grayLighter @grayLighter; } .tabs-left > .nav-tabs .active > a, .tabs-left > .nav-tabs .active > a:hover, .tabs-left > .nav-tabs .active > a:focus { border-color: #ddd transparent #ddd #ddd; *border-right-color: @white; } // Tabs on the right .tabs-right > .nav-tabs { float: right; margin-left: 19px; border-left: 1px solid #ddd; } .tabs-right > .nav-tabs > li > a { margin-left: -1px; .border-radius(0 4px 4px 0); } .tabs-right > .nav-tabs > li > a:hover, .tabs-right > .nav-tabs > li > a:focus { border-color: @grayLighter @grayLighter @grayLighter #ddd; } .tabs-right > .nav-tabs .active > a, .tabs-right > .nav-tabs .active > a:hover, .tabs-right > .nav-tabs .active > a:focus { border-color: #ddd #ddd #ddd transparent; *border-left-color: @white; } // DISABLED STATES // --------------- // Gray out text .nav > .disabled > a { color: @grayLight; } // Nuke hover/focus effects .nav > .disabled > a:hover, .nav > .disabled > a:focus { text-decoration: none; background-color: transparent; cursor: default; } apache-couchdb-1.6.0/src/fauxton/assets/less/bootstrap/navbar.less0000644000175000001440000002734212332105522025227 0ustar00djcusers00000000000000// // Navbars (Redux) // -------------------------------------------------- // COMMON STYLES // ------------- // Base class and wrapper .navbar { overflow: visible; margin-bottom: @baseLineHeight; // Fix for IE7's bad z-indexing so dropdowns don't appear below content that follows the navbar *position: relative; *z-index: 2; } // Inner for background effects // Gradient is applied to its own element because overflow visible is not honored by IE when filter is present .navbar-inner { min-height: @navbarHeight; padding-left: 20px; padding-right: 20px; #gradient > .vertical(@navbarBackgroundHighlight, @navbarBackground); border: 1px solid @navbarBorder; .border-radius(@baseBorderRadius); .box-shadow(0 1px 4px rgba(0,0,0,.065)); // Prevent floats from breaking the navbar .clearfix(); } // Set width to auto for default container // We then reset it for fixed navbars in the #gridSystem mixin .navbar .container { width: auto; } // Override the default collapsed state .nav-collapse.collapse { height: auto; overflow: visible; } // Brand: website or project name // ------------------------- .navbar .brand { float: left; display: block; // Vertically center the text given @navbarHeight padding: ((@navbarHeight - @baseLineHeight) / 2) 20px ((@navbarHeight - @baseLineHeight) / 2); margin-left: -20px; // negative indent to left-align the text down the page font-size: 20px; font-weight: 200; color: @navbarBrandColor; text-shadow: 0 1px 0 @navbarBackgroundHighlight; &:hover, &:focus { text-decoration: none; } } // Plain text in topbar // ------------------------- .navbar-text { margin-bottom: 0; line-height: @navbarHeight; color: @navbarText; } // Janky solution for now to account for links outside the .nav // ------------------------- .navbar-link { color: @navbarLinkColor; &:hover, &:focus { color: @navbarLinkColorHover; } } // Dividers in navbar // ------------------------- .navbar .divider-vertical { height: @navbarHeight; margin: 0 9px; border-left: 1px solid @navbarBackground; border-right: 1px solid @navbarBackgroundHighlight; } // Buttons in navbar // ------------------------- .navbar .btn, .navbar .btn-group { .navbarVerticalAlign(30px); // Vertically center in navbar } .navbar .btn-group .btn, .navbar .input-prepend .btn, .navbar .input-append .btn, .navbar .input-prepend .btn-group, .navbar .input-append .btn-group { margin-top: 0; // then undo the margin here so we don't accidentally double it } // Navbar forms // ------------------------- .navbar-form { margin-bottom: 0; // remove default bottom margin .clearfix(); input, select, .radio, .checkbox { .navbarVerticalAlign(30px); // Vertically center in navbar } input, select, .btn { display: inline-block; margin-bottom: 0; } input[type="image"], input[type="checkbox"], input[type="radio"] { margin-top: 3px; } .input-append, .input-prepend { margin-top: 5px; white-space: nowrap; // preven two items from separating within a .navbar-form that has .pull-left input { margin-top: 0; // remove the margin on top since it's on the parent } } } // Navbar search // ------------------------- .navbar-search { position: relative; float: left; .navbarVerticalAlign(30px); // Vertically center in navbar margin-bottom: 0; .search-query { margin-bottom: 0; padding: 4px 14px; #font > .sans-serif(13px, normal, 1); .border-radius(15px); // redeclare because of specificity of the type attribute } } // Static navbar // ------------------------- .navbar-static-top { position: static; margin-bottom: 0; // remove 18px margin for default navbar .navbar-inner { .border-radius(0); } } // Fixed navbar // ------------------------- // Shared (top/bottom) styles .navbar-fixed-top, .navbar-fixed-bottom { position: fixed; right: 0; left: 0; z-index: @zindexFixedNavbar; margin-bottom: 0; // remove 18px margin for default navbar } .navbar-fixed-top .navbar-inner, .navbar-static-top .navbar-inner { border-width: 0 0 1px; } .navbar-fixed-bottom .navbar-inner { border-width: 1px 0 0; } .navbar-fixed-top .navbar-inner, .navbar-fixed-bottom .navbar-inner { padding-left: 0; padding-right: 0; .border-radius(0); } // Reset container width // Required here as we reset the width earlier on and the grid mixins don't override early enough .navbar-static-top .container, .navbar-fixed-top .container, .navbar-fixed-bottom .container { #grid > .core > .span(@gridColumns); } // Fixed to top .navbar-fixed-top { top: 0; } .navbar-fixed-top, .navbar-static-top { .navbar-inner { .box-shadow(~"0 1px 10px rgba(0,0,0,.1)"); } } // Fixed to bottom .navbar-fixed-bottom { bottom: 0; .navbar-inner { .box-shadow(~"0 -1px 10px rgba(0,0,0,.1)"); } } // NAVIGATION // ---------- .navbar .nav { position: relative; left: 0; display: block; float: left; margin: 0 10px 0 0; } .navbar .nav.pull-right { float: right; // redeclare due to specificity margin-right: 0; // remove margin on float right nav } .navbar .nav > li { float: left; } // Links .navbar .nav > li > a { float: none; // Vertically center the text given @navbarHeight padding: ((@navbarHeight - @baseLineHeight) / 2) 15px ((@navbarHeight - @baseLineHeight) / 2); color: @navbarLinkColor; text-decoration: none; text-shadow: 0 1px 0 @navbarBackgroundHighlight; } .navbar .nav .dropdown-toggle .caret { margin-top: 8px; } // Hover/focus .navbar .nav > li > a:focus, .navbar .nav > li > a:hover { background-color: @navbarLinkBackgroundHover; // "transparent" is default to differentiate :hover/:focus from .active color: @navbarLinkColorHover; text-decoration: none; } // Active nav items .navbar .nav > .active > a, .navbar .nav > .active > a:hover, .navbar .nav > .active > a:focus { color: @navbarLinkColorActive; text-decoration: none; background-color: @navbarLinkBackgroundActive; .box-shadow(inset 0 3px 8px rgba(0,0,0,.125)); } // Navbar button for toggling navbar items in responsive layouts // These definitions need to come after '.navbar .btn' .navbar .btn-navbar { display: none; float: right; padding: 7px 10px; margin-left: 5px; margin-right: 5px; .buttonBackground(darken(@navbarBackgroundHighlight, 5%), darken(@navbarBackground, 5%)); .box-shadow(~"inset 0 1px 0 rgba(255,255,255,.1), 0 1px 0 rgba(255,255,255,.075)"); } .navbar .btn-navbar .icon-bar { display: block; width: 18px; height: 2px; background-color: #f5f5f5; .border-radius(1px); .box-shadow(0 1px 0 rgba(0,0,0,.25)); } .btn-navbar .icon-bar + .icon-bar { margin-top: 3px; } // Dropdown menus // -------------- // Menu position and menu carets .navbar .nav > li > .dropdown-menu { &:before { content: ''; display: inline-block; border-left: 7px solid transparent; border-right: 7px solid transparent; border-bottom: 7px solid #ccc; border-bottom-color: @dropdownBorder; position: absolute; top: -7px; left: 9px; } &:after { content: ''; display: inline-block; border-left: 6px solid transparent; border-right: 6px solid transparent; border-bottom: 6px solid @dropdownBackground; position: absolute; top: -6px; left: 10px; } } // Menu position and menu caret support for dropups via extra dropup class .navbar-fixed-bottom .nav > li > .dropdown-menu { &:before { border-top: 7px solid #ccc; border-top-color: @dropdownBorder; border-bottom: 0; bottom: -7px; top: auto; } &:after { border-top: 6px solid @dropdownBackground; border-bottom: 0; bottom: -6px; top: auto; } } // Caret should match text color on hover/focus .navbar .nav li.dropdown > a:hover .caret, .navbar .nav li.dropdown > a:focus .caret { border-top-color: @navbarLinkColorHover; border-bottom-color: @navbarLinkColorHover; } // Remove background color from open dropdown .navbar .nav li.dropdown.open > .dropdown-toggle, .navbar .nav li.dropdown.active > .dropdown-toggle, .navbar .nav li.dropdown.open.active > .dropdown-toggle { background-color: @navbarLinkBackgroundActive; color: @navbarLinkColorActive; } .navbar .nav li.dropdown > .dropdown-toggle .caret { border-top-color: @navbarLinkColor; border-bottom-color: @navbarLinkColor; } .navbar .nav li.dropdown.open > .dropdown-toggle .caret, .navbar .nav li.dropdown.active > .dropdown-toggle .caret, .navbar .nav li.dropdown.open.active > .dropdown-toggle .caret { border-top-color: @navbarLinkColorActive; border-bottom-color: @navbarLinkColorActive; } // Right aligned menus need alt position .navbar .pull-right > li > .dropdown-menu, .navbar .nav > li > .dropdown-menu.pull-right { left: auto; right: 0; &:before { left: auto; right: 12px; } &:after { left: auto; right: 13px; } .dropdown-menu { left: auto; right: 100%; margin-left: 0; margin-right: -1px; .border-radius(6px 0 6px 6px); } } // Inverted navbar // ------------------------- .navbar-inverse { .navbar-inner { #gradient > .vertical(@navbarInverseBackgroundHighlight, @navbarInverseBackground); border-color: @navbarInverseBorder; } .brand, .nav > li > a { color: @navbarInverseLinkColor; text-shadow: 0 -1px 0 rgba(0,0,0,.25); &:hover, &:focus { color: @navbarInverseLinkColorHover; } } .brand { color: @navbarInverseBrandColor; } .navbar-text { color: @navbarInverseText; } .nav > li > a:focus, .nav > li > a:hover { background-color: @navbarInverseLinkBackgroundHover; color: @navbarInverseLinkColorHover; } .nav .active > a, .nav .active > a:hover, .nav .active > a:focus { color: @navbarInverseLinkColorActive; background-color: @navbarInverseLinkBackgroundActive; } // Inline text links .navbar-link { color: @navbarInverseLinkColor; &:hover, &:focus { color: @navbarInverseLinkColorHover; } } // Dividers in navbar .divider-vertical { border-left-color: @navbarInverseBackground; border-right-color: @navbarInverseBackgroundHighlight; } // Dropdowns .nav li.dropdown.open > .dropdown-toggle, .nav li.dropdown.active > .dropdown-toggle, .nav li.dropdown.open.active > .dropdown-toggle { background-color: @navbarInverseLinkBackgroundActive; color: @navbarInverseLinkColorActive; } .nav li.dropdown > a:hover .caret, .nav li.dropdown > a:focus .caret { border-top-color: @navbarInverseLinkColorActive; border-bottom-color: @navbarInverseLinkColorActive; } .nav li.dropdown > .dropdown-toggle .caret { border-top-color: @navbarInverseLinkColor; border-bottom-color: @navbarInverseLinkColor; } .nav li.dropdown.open > .dropdown-toggle .caret, .nav li.dropdown.active > .dropdown-toggle .caret, .nav li.dropdown.open.active > .dropdown-toggle .caret { border-top-color: @navbarInverseLinkColorActive; border-bottom-color: @navbarInverseLinkColorActive; } // Navbar search .navbar-search { .search-query { color: @white; background-color: @navbarInverseSearchBackground; border-color: @navbarInverseSearchBorder; .box-shadow(~"inset 0 1px 2px rgba(0,0,0,.1), 0 1px 0 rgba(255,255,255,.15)"); .transition(none); .placeholder(@navbarInverseSearchPlaceholderColor); // Focus states (we use .focused since IE7-8 and down doesn't support :focus) &:focus, &.focused { padding: 5px 15px; color: @grayDark; text-shadow: 0 1px 0 @white; background-color: @navbarInverseSearchBackgroundFocus; border: 0; .box-shadow(0 0 3px rgba(0,0,0,.15)); outline: 0; } } } // Navbar collapse button .btn-navbar { .buttonBackground(darken(@navbarInverseBackgroundHighlight, 5%), darken(@navbarInverseBackground, 5%)); } } apache-couchdb-1.6.0/src/fauxton/assets/less/bootstrap/pager.less0000644000175000001440000000137012332105522025045 0ustar00djcusers00000000000000// // Pager pagination // -------------------------------------------------- .pager { margin: @baseLineHeight 0; list-style: none; text-align: center; .clearfix(); } .pager li { display: inline; } .pager li > a, .pager li > span { display: inline-block; padding: 5px 14px; background-color: #fff; border: 1px solid #ddd; .border-radius(15px); } .pager li > a:hover, .pager li > a:focus { text-decoration: none; background-color: #f5f5f5; } .pager .next > a, .pager .next > span { float: right; } .pager .previous > a, .pager .previous > span { float: left; } .pager .disabled > a, .pager .disabled > a:hover, .pager .disabled > a:focus, .pager .disabled > span { color: @grayLight; background-color: #fff; cursor: default; }apache-couchdb-1.6.0/src/fauxton/assets/less/bootstrap/media.less0000644000175000001440000000153412332105522025030 0ustar00djcusers00000000000000// Media objects // Source: http://stubbornella.org/content/?p=497 // -------------------------------------------------- // Common styles // ------------------------- // Clear the floats .media, .media-body { overflow: hidden; *overflow: visible; zoom: 1; } // Proper spacing between instances of .media .media, .media .media { margin-top: 15px; } .media:first-child { margin-top: 0; } // For images and videos, set to block .media-object { display: block; } // Reset margins on headings for tighter default spacing .media-heading { margin: 0 0 5px; } // Media image alignment // ------------------------- .media > .pull-left { margin-right: 10px; } .media > .pull-right { margin-left: 10px; } // Media list variation // ------------------------- // Undo default ul/ol styles .media-list { margin-left: 0; list-style: none; } apache-couchdb-1.6.0/src/fauxton/assets/less/bootstrap/bootstrap.less0000644000175000001440000000263012332105522025764 0ustar00djcusers00000000000000/*! * Bootstrap v2.3.2 * * Copyright 2012 Twitter, Inc * Licensed under the Apache License v2.0 * http://www.apache.org/licenses/LICENSE-2.0 * * Designed and built with all the love in the world @twitter by @mdo and @fat. */ // Core variables and mixins @import "mixins.less"; // CSS Reset @import "reset.less"; // Grid system and page structure @import "scaffolding.less"; @import "grid.less"; @import "layouts.less"; // Base CSS @import "type.less"; @import "code.less"; @import "forms.less"; @import "tables.less"; // Components: common @import "/font-awesome/font-awesome.less"; @import "dropdowns.less"; @import "wells.less"; @import "component-animations.less"; @import "close.less"; // Components: Buttons & Alerts @import "buttons.less"; @import "button-groups.less"; @import "alerts.less"; // Note: alerts share common CSS with buttons and thus have styles in buttons.less // Components: Nav @import "navs.less"; @import "navbar.less"; @import "breadcrumbs.less"; @import "pagination.less"; @import "pager.less"; // Components: Popovers @import "modals.less"; @import "tooltip.less"; @import "popovers.less"; // Components: Misc @import "thumbnails.less"; @import "media.less"; @import "labels-badges.less"; @import "progress-bars.less"; @import "accordion.less"; @import "carousel.less"; @import "hero-unit.less"; // Utility classes @import "utilities.less"; // Has to be last to override when necessary apache-couchdb-1.6.0/src/fauxton/assets/less/bootstrap/wells.less0000644000175000001440000000105012332105522025070 0ustar00djcusers00000000000000// // Wells // -------------------------------------------------- // Base class .well { min-height: 20px; padding: 19px; margin-bottom: 20px; background-color: @wellBackground; border: 1px solid darken(@wellBackground, 7%); .border-radius(@baseBorderRadius); .box-shadow(inset 0 1px 1px rgba(0,0,0,.05)); blockquote { border-color: #ddd; border-color: rgba(0,0,0,.15); } } // Sizes .well-large { padding: 24px; .border-radius(@borderRadiusLarge); } .well-small { padding: 9px; .border-radius(@borderRadiusSmall); } apache-couchdb-1.6.0/src/fauxton/assets/less/bootstrap/variables.less0000644000175000001440000002166612332105522025731 0ustar00djcusers00000000000000// // Variables // -------------------------------------------------- // Global values // -------------------------------------------------- // Grays // ------------------------- @black: #000; @grayDarker: #222; @grayDark: #333; @gray: #555; @grayLight: #999; @grayLighter: #eee; @white: #fff; // Accent colors // ------------------------- @blue: #049cdb; @blueDark: #0064cd; @green: #46a546; @red: #9d261d; @yellow: #ffc40d; @orange: #f89406; @pink: #c3325f; @purple: #7a43b6; // Scaffolding // ------------------------- @bodyBackground: @white; @textColor: @grayDark; // Links // ------------------------- @linkColor: #08c; @linkColorHover: darken(@linkColor, 15%); // Typography // ------------------------- @sansFontFamily: "Helvetica Neue", Helvetica, Arial, sans-serif; @serifFontFamily: Georgia, "Times New Roman", Times, serif; @monoFontFamily: Monaco, Menlo, Consolas, "Courier New", monospace; @baseFontSize: 14px; @baseFontFamily: @sansFontFamily; @baseLineHeight: 20px; @altFontFamily: @serifFontFamily; @headingsFontFamily: inherit; // empty to use BS default, @baseFontFamily @headingsFontWeight: bold; // instead of browser default, bold @headingsColor: inherit; // empty to use BS default, @textColor // Component sizing // ------------------------- // Based on 14px font-size and 20px line-height @fontSizeLarge: @baseFontSize * 1.25; // ~18px @fontSizeSmall: @baseFontSize * 0.85; // ~12px @fontSizeMini: @baseFontSize * 0.75; // ~11px @paddingLarge: 11px 19px; // 44px @paddingSmall: 2px 10px; // 26px @paddingMini: 0 6px; // 22px @baseBorderRadius: 4px; @borderRadiusLarge: 6px; @borderRadiusSmall: 3px; // Tables // ------------------------- @tableBackground: transparent; // overall background-color @tableBackgroundAccent: #f9f9f9; // for striping @tableBackgroundHover: #f5f5f5; // for hover @tableBorder: #ddd; // table and cell border // Buttons // ------------------------- @btnBackground: @white; @btnBackgroundHighlight: darken(@white, 10%); @btnBorder: #ccc; @btnPrimaryBackground: @linkColor; @btnPrimaryBackgroundHighlight: spin(@btnPrimaryBackground, 20%); @btnInfoBackground: #5bc0de; @btnInfoBackgroundHighlight: #2f96b4; @btnSuccessBackground: #62c462; @btnSuccessBackgroundHighlight: #51a351; @btnWarningBackground: lighten(@orange, 15%); @btnWarningBackgroundHighlight: @orange; @btnDangerBackground: #ee5f5b; @btnDangerBackgroundHighlight: #bd362f; @btnInverseBackground: #444; @btnInverseBackgroundHighlight: @grayDarker; // Forms // ------------------------- @inputBackground: @white; @inputBorder: #ccc; @inputBorderRadius: @baseBorderRadius; @inputDisabledBackground: @grayLighter; @formActionsBackground: #f5f5f5; @inputHeight: @baseLineHeight + 10px; // base line-height + 8px vertical padding + 2px top/bottom border // Dropdowns // ------------------------- @dropdownBackground: @white; @dropdownBorder: rgba(0,0,0,.2); @dropdownDividerTop: #e5e5e5; @dropdownDividerBottom: @white; @dropdownLinkColor: @grayDark; @dropdownLinkColorHover: @white; @dropdownLinkColorActive: @white; @dropdownLinkBackgroundActive: @linkColor; @dropdownLinkBackgroundHover: @dropdownLinkBackgroundActive; // COMPONENT VARIABLES // -------------------------------------------------- // Z-index master list // ------------------------- // Used for a bird's eye view of components dependent on the z-axis // Try to avoid customizing these :) @zindexDropdown: 1000; @zindexPopover: 1010; @zindexTooltip: 1030; @zindexFixedNavbar: 1030; @zindexModalBackdrop: 1040; @zindexModal: 1050; // Sprite icons path // ------------------------- @iconSpritePath: "../img/glyphicons-halflings.png"; @iconWhiteSpritePath: "../img/glyphicons-halflings-white.png"; // Input placeholder text color // ------------------------- @placeholderText: @grayLight; // Hr border color // ------------------------- @hrBorder: @grayLighter; // Horizontal forms & lists // ------------------------- @horizontalComponentOffset: 180px; // Wells // ------------------------- @wellBackground: #f5f5f5; // Navbar // ------------------------- @navbarCollapseWidth: 979px; @navbarCollapseDesktopWidth: @navbarCollapseWidth + 1; @navbarHeight: 40px; @navbarBackgroundHighlight: #ffffff; @navbarBackground: darken(@navbarBackgroundHighlight, 5%); @navbarBorder: darken(@navbarBackground, 12%); @navbarText: #777; @navbarLinkColor: #777; @navbarLinkColorHover: @grayDark; @navbarLinkColorActive: @gray; @navbarLinkBackgroundHover: transparent; @navbarLinkBackgroundActive: darken(@navbarBackground, 5%); @navbarBrandColor: @navbarLinkColor; // Inverted navbar @navbarInverseBackground: #111111; @navbarInverseBackgroundHighlight: #222222; @navbarInverseBorder: #252525; @navbarInverseText: @grayLight; @navbarInverseLinkColor: @grayLight; @navbarInverseLinkColorHover: @white; @navbarInverseLinkColorActive: @navbarInverseLinkColorHover; @navbarInverseLinkBackgroundHover: transparent; @navbarInverseLinkBackgroundActive: @navbarInverseBackground; @navbarInverseSearchBackground: lighten(@navbarInverseBackground, 25%); @navbarInverseSearchBackgroundFocus: @white; @navbarInverseSearchBorder: @navbarInverseBackground; @navbarInverseSearchPlaceholderColor: #ccc; @navbarInverseBrandColor: @navbarInverseLinkColor; // Pagination // ------------------------- @paginationBackground: #fff; @paginationBorder: #ddd; @paginationActiveBackground: #f5f5f5; // Hero unit // ------------------------- @heroUnitBackground: @grayLighter; @heroUnitHeadingColor: inherit; @heroUnitLeadColor: inherit; // Form states and alerts // ------------------------- @warningText: #c09853; @warningBackground: #fcf8e3; @warningBorder: darken(spin(@warningBackground, -10), 3%); @errorText: #b94a48; @errorBackground: #f2dede; @errorBorder: darken(spin(@errorBackground, -10), 3%); @successText: #468847; @successBackground: #dff0d8; @successBorder: darken(spin(@successBackground, -10), 5%); @infoText: #3a87ad; @infoBackground: #d9edf7; @infoBorder: darken(spin(@infoBackground, -10), 7%); // Tooltips and popovers // ------------------------- @tooltipColor: #fff; @tooltipBackground: #000; @tooltipArrowWidth: 5px; @tooltipArrowColor: @tooltipBackground; @popoverBackground: #fff; @popoverArrowWidth: 10px; @popoverArrowColor: #fff; @popoverTitleBackground: darken(@popoverBackground, 3%); // Special enhancement for popovers @popoverArrowOuterWidth: @popoverArrowWidth + 1; @popoverArrowOuterColor: rgba(0,0,0,.25); // GRID // -------------------------------------------------- // Default 940px grid // ------------------------- @gridColumns: 12; @gridColumnWidth: 60px; @gridGutterWidth: 20px; @gridRowWidth: (@gridColumns * @gridColumnWidth) + (@gridGutterWidth * (@gridColumns - 1)); // 1200px min @gridColumnWidth1200: 70px; @gridGutterWidth1200: 30px; @gridRowWidth1200: (@gridColumns * @gridColumnWidth1200) + (@gridGutterWidth1200 * (@gridColumns - 1)); // 768px-979px @gridColumnWidth768: 42px; @gridGutterWidth768: 20px; @gridRowWidth768: (@gridColumns * @gridColumnWidth768) + (@gridGutterWidth768 * (@gridColumns - 1)); // Fluid grid // ------------------------- @fluidGridColumnWidth: percentage(@gridColumnWidth/@gridRowWidth); @fluidGridGutterWidth: percentage(@gridGutterWidth/@gridRowWidth); // 1200px min @fluidGridColumnWidth1200: percentage(@gridColumnWidth1200/@gridRowWidth1200); @fluidGridGutterWidth1200: percentage(@gridGutterWidth1200/@gridRowWidth1200); // 768px-979px @fluidGridColumnWidth768: percentage(@gridColumnWidth768/@gridRowWidth768); @fluidGridGutterWidth768: percentage(@gridGutterWidth768/@gridRowWidth768); apache-couchdb-1.6.0/src/fauxton/assets/less/bootstrap/grid.less0000644000175000001440000000065512332105522024701 0ustar00djcusers00000000000000// // Grid system // -------------------------------------------------- // Fixed (940px) #grid > .core(@gridColumnWidth, @gridGutterWidth); // Fluid (940px) #grid > .fluid(@fluidGridColumnWidth, @fluidGridGutterWidth); // Reset utility classes due to specificity [class*="span"].hide, .row-fluid [class*="span"].hide { display: none; } [class*="span"].pull-right, .row-fluid [class*="span"].pull-right { float: right; } apache-couchdb-1.6.0/src/fauxton/assets/less/bootstrap/reset.less0000644000175000001440000001015112332105522025066 0ustar00djcusers00000000000000// // Reset CSS // Adapted from http://github.com/necolas/normalize.css // -------------------------------------------------- // Display in IE6-9 and FF3 // ------------------------- article, aside, details, figcaption, figure, footer, header, hgroup, nav, section { display: block; } // Display block in IE6-9 and FF3 // ------------------------- audio, canvas, video { display: inline-block; *display: inline; *zoom: 1; } // Prevents modern browsers from displaying 'audio' without controls // ------------------------- audio:not([controls]) { display: none; } // Base settings // ------------------------- html { font-size: 100%; -webkit-text-size-adjust: 100%; -ms-text-size-adjust: 100%; } // Focus states a:focus { .tab-focus(); } // Hover & Active a:hover, a:active { outline: 0; } // Prevents sub and sup affecting line-height in all browsers // ------------------------- sub, sup { position: relative; font-size: 75%; line-height: 0; vertical-align: baseline; } sup { top: -0.5em; } sub { bottom: -0.25em; } // Img border in a's and image quality // ------------------------- img { /* Responsive images (ensure images don't scale beyond their parents) */ max-width: 100%; /* Part 1: Set a maxium relative to the parent */ width: auto\9; /* IE7-8 need help adjusting responsive images */ height: auto; /* Part 2: Scale the height according to the width, otherwise you get stretching */ vertical-align: middle; border: 0; -ms-interpolation-mode: bicubic; } // Prevent max-width from affecting Google Maps #map_canvas img, .google-maps img { max-width: none; } // Forms // ------------------------- // Font size in all browsers, margin changes, misc consistency button, input, select, textarea { margin: 0; font-size: 100%; vertical-align: middle; } button, input { *overflow: visible; // Inner spacing ie IE6/7 line-height: normal; // FF3/4 have !important on line-height in UA stylesheet } button::-moz-focus-inner, input::-moz-focus-inner { // Inner padding and border oddities in FF3/4 padding: 0; border: 0; } button, html input[type="button"], // Avoid the WebKit bug in Android 4.0.* where (2) destroys native `audio` and `video` controls. input[type="reset"], input[type="submit"] { -webkit-appearance: button; // Corrects inability to style clickable `input` types in iOS. cursor: pointer; // Improves usability and consistency of cursor style between image-type `input` and others. } label, select, button, input[type="button"], input[type="reset"], input[type="submit"], input[type="radio"], input[type="checkbox"] { cursor: pointer; // Improves usability and consistency of cursor style between image-type `input` and others. } input[type="search"] { // Appearance in Safari/Chrome .box-sizing(content-box); -webkit-appearance: textfield; } input[type="search"]::-webkit-search-decoration, input[type="search"]::-webkit-search-cancel-button { -webkit-appearance: none; // Inner-padding issues in Chrome OSX, Safari 5 } textarea { overflow: auto; // Remove vertical scrollbar in IE6-9 vertical-align: top; // Readability and alignment cross-browser } // Printing // ------------------------- // Source: https://github.com/h5bp/html5-boilerplate/blob/master/css/main.css @media print { * { text-shadow: none !important; color: #000 !important; // Black prints faster: h5bp.com/s background: transparent !important; box-shadow: none !important; } a, a:visited { text-decoration: underline; } a[href]:after { content: " (" attr(href) ")"; } abbr[title]:after { content: " (" attr(title) ")"; } // Don't show links for images, or javascript/internal links .ir a:after, a[href^="javascript:"]:after, a[href^="#"]:after { content: ""; } pre, blockquote { border: 1px solid #999; page-break-inside: avoid; } thead { display: table-header-group; // h5bp.com/t } tr, img { page-break-inside: avoid; } img { max-width: 100% !important; } @page { margin: 0.5cm; } p, h2, h3 { orphans: 3; widows: 3; } h2, h3 { page-break-after: avoid; } } apache-couchdb-1.6.0/src/fauxton/assets/less/bootstrap/buttons.less0000644000175000001440000001123612332105522025447 0ustar00djcusers00000000000000// // Buttons // -------------------------------------------------- // Base styles // -------------------------------------------------- // Core .btn { display: inline-block; .ie7-inline-block(); padding: 4px 12px; margin-bottom: 0; // For input.btn font-size: @baseFontSize; line-height: @baseLineHeight; text-align: center; vertical-align: middle; cursor: pointer; .buttonBackground(@btnBackground, @btnBackgroundHighlight, @grayDark, 0 1px 1px rgba(255,255,255,.75)); border: 1px solid @btnBorder; *border: 0; // Remove the border to prevent IE7's black border on input:focus border-bottom-color: darken(@btnBorder, 10%); .border-radius(@baseBorderRadius); .ie7-restore-left-whitespace(); // Give IE7 some love .box-shadow(~"inset 0 1px 0 rgba(255,255,255,.2), 0 1px 2px rgba(0,0,0,.05)"); // Hover/focus state &:hover, &:focus { color: @grayDark; text-decoration: none; background-position: 0 -15px; // transition is only when going to hover/focus, otherwise the background // behind the gradient (there for IE<=9 fallback) gets mismatched .transition(background-position .1s linear); } // Focus state for keyboard and accessibility &:focus { .tab-focus(); } // Active state &.active, &:active { background-image: none; outline: 0; .box-shadow(~"inset 0 2px 4px rgba(0,0,0,.15), 0 1px 2px rgba(0,0,0,.05)"); } // Disabled state &.disabled, &[disabled] { cursor: default; background-image: none; .opacity(65); .box-shadow(none); } } // Button Sizes // -------------------------------------------------- // Large .btn-large { padding: @paddingLarge; font-size: @fontSizeLarge; .border-radius(@borderRadiusLarge); } .btn-large [class^="icon-"], .btn-large [class*=" icon-"] { margin-top: 4px; } // Small .btn-small { padding: @paddingSmall; font-size: @fontSizeSmall; .border-radius(@borderRadiusSmall); } .btn-small [class^="icon-"], .btn-small [class*=" icon-"] { margin-top: 0; } .btn-mini [class^="icon-"], .btn-mini [class*=" icon-"] { margin-top: -1px; } // Mini .btn-mini { padding: @paddingMini; font-size: @fontSizeMini; .border-radius(@borderRadiusSmall); } // Block button // ------------------------- .btn-block { display: block; width: 100%; padding-left: 0; padding-right: 0; .box-sizing(border-box); } // Vertically space out multiple block buttons .btn-block + .btn-block { margin-top: 5px; } // Specificity overrides input[type="submit"], input[type="reset"], input[type="button"] { &.btn-block { width: 100%; } } // Alternate buttons // -------------------------------------------------- // Provide *some* extra contrast for those who can get it .btn-primary.active, .btn-warning.active, .btn-danger.active, .btn-success.active, .btn-info.active, .btn-inverse.active { color: rgba(255,255,255,.75); } // Set the backgrounds // ------------------------- .btn-primary { .buttonBackground(@btnPrimaryBackground, @btnPrimaryBackgroundHighlight); } // Warning appears are orange .btn-warning { .buttonBackground(@btnWarningBackground, @btnWarningBackgroundHighlight); } // Danger and error appear as red .btn-danger { .buttonBackground(@btnDangerBackground, @btnDangerBackgroundHighlight); } // Success appears as green .btn-success { .buttonBackground(@btnSuccessBackground, @btnSuccessBackgroundHighlight); } // Info appears as a neutral blue .btn-info { .buttonBackground(@btnInfoBackground, @btnInfoBackgroundHighlight); } // Inverse appears as dark gray .btn-inverse { .buttonBackground(@btnInverseBackground, @btnInverseBackgroundHighlight); } // Cross-browser Jank // -------------------------------------------------- button.btn, input[type="submit"].btn { // Firefox 3.6 only I believe &::-moz-focus-inner { padding: 0; border: 0; } // IE7 has some default padding on button controls *padding-top: 3px; *padding-bottom: 3px; &.btn-large { *padding-top: 7px; *padding-bottom: 7px; } &.btn-small { *padding-top: 3px; *padding-bottom: 3px; } &.btn-mini { *padding-top: 1px; *padding-bottom: 1px; } } // Link buttons // -------------------------------------------------- // Make a button look and behave like a link .btn-link, .btn-link:active, .btn-link[disabled] { background-color: transparent; background-image: none; .box-shadow(none); } .btn-link { border-color: transparent; cursor: pointer; color: @linkColor; .border-radius(0); } .btn-link:hover, .btn-link:focus { color: @linkColorHover; text-decoration: underline; background-color: transparent; } .btn-link[disabled]:hover, .btn-link[disabled]:focus { color: @grayDark; text-decoration: none; } apache-couchdb-1.6.0/src/fauxton/assets/less/bootstrap/font-awesome/0000755000175000001440000000000012332105600025457 5ustar00djcusers00000000000000apache-couchdb-1.6.0/src/fauxton/assets/less/bootstrap/font-awesome/extras.less0000644000175000001440000000453612332105522027670 0ustar00djcusers00000000000000/* EXTRAS * -------------------------- */ /* Stacked and layered icon */ .icon-stack(); /* Animated rotating icon */ .icon-spin { display: inline-block; -moz-animation: spin 2s infinite linear; -o-animation: spin 2s infinite linear; -webkit-animation: spin 2s infinite linear; animation: spin 2s infinite linear; } /* Prevent stack and spinners from being taken inline when inside a link */ a .icon-stack, a .icon-spin { display: inline-block; text-decoration: none; } @-moz-keyframes spin { 0% { -moz-transform: rotate(0deg); } 100% { -moz-transform: rotate(359deg); } } @-webkit-keyframes spin { 0% { -webkit-transform: rotate(0deg); } 100% { -webkit-transform: rotate(359deg); } } @-o-keyframes spin { 0% { -o-transform: rotate(0deg); } 100% { -o-transform: rotate(359deg); } } @-ms-keyframes spin { 0% { -ms-transform: rotate(0deg); } 100% { -ms-transform: rotate(359deg); } } @keyframes spin { 0% { transform: rotate(0deg); } 100% { transform: rotate(359deg); } } /* Icon rotations and mirroring */ .icon-rotate-90:before { -webkit-transform: rotate(90deg); -moz-transform: rotate(90deg); -ms-transform: rotate(90deg); -o-transform: rotate(90deg); transform: rotate(90deg); filter: progid:DXImageTransform.Microsoft.BasicImage(rotation=1); } .icon-rotate-180:before { -webkit-transform: rotate(180deg); -moz-transform: rotate(180deg); -ms-transform: rotate(180deg); -o-transform: rotate(180deg); transform: rotate(180deg); filter: progid:DXImageTransform.Microsoft.BasicImage(rotation=2); } .icon-rotate-270:before { -webkit-transform: rotate(270deg); -moz-transform: rotate(270deg); -ms-transform: rotate(270deg); -o-transform: rotate(270deg); transform: rotate(270deg); filter: progid:DXImageTransform.Microsoft.BasicImage(rotation=3); } .icon-flip-horizontal:before { -webkit-transform: scale(-1, 1); -moz-transform: scale(-1, 1); -ms-transform: scale(-1, 1); -o-transform: scale(-1, 1); transform: scale(-1, 1); } .icon-flip-vertical:before { -webkit-transform: scale(1, -1); -moz-transform: scale(1, -1); -ms-transform: scale(1, -1); -o-transform: scale(1, -1); transform: scale(1, -1); } /* ensure rotation occurs inside anchor tags */ a { .icon-rotate-90, .icon-rotate-180, .icon-rotate-270, .icon-flip-horizontal, .icon-flip-vertical { &:before { display: inline-block; } } } apache-couchdb-1.6.0/src/fauxton/assets/less/bootstrap/font-awesome/path.less0000644000175000001440000000134612332105522027312 0ustar00djcusers00000000000000/* FONT PATH * -------------------------- */ @font-face { font-family: 'FontAwesome'; src: url('@{FontAwesomePath}/fontawesome-webfont.eot?v=@{FontAwesomeVersion}'); src: url('@{FontAwesomePath}/fontawesome-webfont.eot?#iefix&v=@{FontAwesomeVersion}') format('embedded-opentype'), url('@{FontAwesomePath}/fontawesome-webfont.woff?v=@{FontAwesomeVersion}') format('woff'), url('@{FontAwesomePath}/fontawesome-webfont.ttf?v=@{FontAwesomeVersion}') format('truetype'), url('@{FontAwesomePath}/fontawesome-webfont.svg#fontawesomeregular?v=@{FontAwesomeVersion}') format('svg'); // src: url('@{FontAwesomePath}/FontAwesome.otf') format('opentype'); // used when developing fonts font-weight: normal; font-style: normal; } apache-couchdb-1.6.0/src/fauxton/assets/less/bootstrap/font-awesome/font-awesome.less0000644000175000001440000000244712332105522030765 0ustar00djcusers00000000000000/*! * Font Awesome 3.2.1 * the iconic font designed for Bootstrap * ------------------------------------------------------------------------------ * The full suite of pictographic icons, examples, and documentation can be * found at http://fontawesome.io. Stay up to date on Twitter at * http://twitter.com/fontawesome. * * License * ------------------------------------------------------------------------------ * - The Font Awesome font is licensed under SIL OFL 1.1 - * http://scripts.sil.org/OFL * - Font Awesome CSS, LESS, and SASS files are licensed under MIT License - * http://opensource.org/licenses/mit-license.html * - Font Awesome documentation licensed under CC BY 3.0 - * http://creativecommons.org/licenses/by/3.0/ * - Attribution is no longer required in Font Awesome 3.0, but much appreciated: * "Font Awesome by Dave Gandy - http://fontawesome.io" * * Author - Dave Gandy * ------------------------------------------------------------------------------ * Email: dave@fontawesome.io * Twitter: http://twitter.com/davegandy * Work: Lead Product Designer @ Kyruus - http://kyruus.com */ @import "variables.less"; @import "mixins.less"; @import "path.less"; @import "core.less"; @import "bootstrap.less"; @import "extras.less"; @import "icons.less"; apache-couchdb-1.6.0/src/fauxton/assets/less/bootstrap/font-awesome/bootstrap.less0000644000175000001440000000404412332105522030371 0ustar00djcusers00000000000000/* BOOTSTRAP SPECIFIC CLASSES * -------------------------- */ /* Bootstrap 2.0 sprites.less reset */ [class^="icon-"], [class*=" icon-"] { display: inline; width: auto; height: auto; line-height: normal; vertical-align: baseline; background-image: none; background-position: 0% 0%; background-repeat: repeat; margin-top: 0; } /* more sprites.less reset */ .icon-white, .nav-pills > .active > a > [class^="icon-"], .nav-pills > .active > a > [class*=" icon-"], .nav-list > .active > a > [class^="icon-"], .nav-list > .active > a > [class*=" icon-"], .navbar-inverse .nav > .active > a > [class^="icon-"], .navbar-inverse .nav > .active > a > [class*=" icon-"], .dropdown-menu > li > a:hover > [class^="icon-"], .dropdown-menu > li > a:hover > [class*=" icon-"], .dropdown-menu > .active > a > [class^="icon-"], .dropdown-menu > .active > a > [class*=" icon-"], .dropdown-submenu:hover > a > [class^="icon-"], .dropdown-submenu:hover > a > [class*=" icon-"] { background-image: none; } /* keeps Bootstrap styles with and without icons the same */ .btn, .nav { [class^="icon-"], [class*=" icon-"] { // display: inline; &.icon-large { line-height: .9em; } &.icon-spin { display: inline-block; } } } .nav-tabs, .nav-pills { [class^="icon-"], [class*=" icon-"] { &, &.icon-large { line-height: .9em; } } } .btn { [class^="icon-"], [class*=" icon-"] { &.pull-left, &.pull-right { &.icon-2x { margin-top: .18em; } } &.icon-spin.icon-large { line-height: .8em; } } } .btn.btn-small { [class^="icon-"], [class*=" icon-"] { &.pull-left, &.pull-right { &.icon-2x { margin-top: .25em; } } } } .btn.btn-large { [class^="icon-"], [class*=" icon-"] { margin-top: 0; // overrides bootstrap default &.pull-left, &.pull-right { &.icon-2x { margin-top: .05em; } } &.pull-left.icon-2x { margin-right: .2em; } &.pull-right.icon-2x { margin-left: .2em; } } } /* Fixes alignment in nav lists */ .nav-list [class^="icon-"], .nav-list [class*=" icon-"] { line-height: inherit; } apache-couchdb-1.6.0/src/fauxton/assets/less/bootstrap/font-awesome/variables.less0000644000175000001440000002127212332105522030326 0ustar00djcusers00000000000000// Variables // -------------------------- //@FontAwesomePath: "../../img"; @FontAwesomePath: "//netdna.bootstrapcdn.com/font-awesome/3.2.1/font"; // for referencing Bootstrap CDN font files directly @FontAwesomeVersion: "3.2.1"; @borderColor: #eee; @iconMuted: #eee; @iconLight: #fff; @iconDark: #333; @icons-li-width: 30/14em; @glass: "\f000"; @music: "\f001"; @search: "\f002"; @envelope-alt: "\f003"; @heart: "\f004"; @star: "\f005"; @star-empty: "\f006"; @user: "\f007"; @film: "\f008"; @th-large: "\f009"; @th: "\f00a"; @th-list: "\f00b"; @ok: "\f00c"; @remove: "\f00d"; @zoom-in: "\f00e"; @zoom-out: "\f010"; @off: "\f011"; @signal: "\f012"; @cog: "\f013"; @trash: "\f014"; @home: "\f015"; @file-alt: "\f016"; @time: "\f017"; @road: "\f018"; @download-alt: "\f019"; @download: "\f01a"; @upload: "\f01b"; @inbox: "\f01c"; @play-circle: "\f01d"; @repeat: "\f01e"; @refresh: "\f021"; @list-alt: "\f022"; @lock: "\f023"; @flag: "\f024"; @headphones: "\f025"; @volume-off: "\f026"; @volume-down: "\f027"; @volume-up: "\f028"; @qrcode: "\f029"; @barcode: "\f02a"; @tag: "\f02b"; @tags: "\f02c"; @book: "\f02d"; @bookmark: "\f02e"; @print: "\f02f"; @camera: "\f030"; @font: "\f031"; @bold: "\f032"; @italic: "\f033"; @text-height: "\f034"; @text-width: "\f035"; @align-left: "\f036"; @align-center: "\f037"; @align-right: "\f038"; @align-justify: "\f039"; @list: "\f03a"; @indent-left: "\f03b"; @indent-right: "\f03c"; @facetime-video: "\f03d"; @picture: "\f03e"; @pencil: "\f040"; @map-marker: "\f041"; @adjust: "\f042"; @tint: "\f043"; @edit: "\f044"; @share: "\f045"; @check: "\f046"; @move: "\f047"; @step-backward: "\f048"; @fast-backward: "\f049"; @backward: "\f04a"; @play: "\f04b"; @pause: "\f04c"; @stop: "\f04d"; @forward: "\f04e"; @fast-forward: "\f050"; @step-forward: "\f051"; @eject: "\f052"; @chevron-left: "\f053"; @chevron-right: "\f054"; @plus-sign: "\f055"; @minus-sign: "\f056"; @remove-sign: "\f057"; @ok-sign: "\f058"; @question-sign: "\f059"; @info-sign: "\f05a"; @screenshot: "\f05b"; @remove-circle: "\f05c"; @ok-circle: "\f05d"; @ban-circle: "\f05e"; @arrow-left: "\f060"; @arrow-right: "\f061"; @arrow-up: "\f062"; @arrow-down: "\f063"; @share-alt: "\f064"; @resize-full: "\f065"; @resize-small: "\f066"; @plus: "\f067"; @minus: "\f068"; @asterisk: "\f069"; @exclamation-sign: "\f06a"; @gift: "\f06b"; @leaf: "\f06c"; @fire: "\f06d"; @eye-open: "\f06e"; @eye-close: "\f070"; @warning-sign: "\f071"; @plane: "\f072"; @calendar: "\f073"; @random: "\f074"; @comment: "\f075"; @magnet: "\f076"; @chevron-up: "\f077"; @chevron-down: "\f078"; @retweet: "\f079"; @shopping-cart: "\f07a"; @folder-close: "\f07b"; @folder-open: "\f07c"; @resize-vertical: "\f07d"; @resize-horizontal: "\f07e"; @bar-chart: "\f080"; @twitter-sign: "\f081"; @facebook-sign: "\f082"; @camera-retro: "\f083"; @key: "\f084"; @cogs: "\f085"; @comments: "\f086"; @thumbs-up-alt: "\f087"; @thumbs-down-alt: "\f088"; @star-half: "\f089"; @heart-empty: "\f08a"; @signout: "\f08b"; @linkedin-sign: "\f08c"; @pushpin: "\f08d"; @external-link: "\f08e"; @signin: "\f090"; @trophy: "\f091"; @github-sign: "\f092"; @upload-alt: "\f093"; @lemon: "\f094"; @phone: "\f095"; @check-empty: "\f096"; @bookmark-empty: "\f097"; @phone-sign: "\f098"; @twitter: "\f099"; @facebook: "\f09a"; @github: "\f09b"; @unlock: "\f09c"; @credit-card: "\f09d"; @rss: "\f09e"; @hdd: "\f0a0"; @bullhorn: "\f0a1"; @bell: "\f0a2"; @certificate: "\f0a3"; @hand-right: "\f0a4"; @hand-left: "\f0a5"; @hand-up: "\f0a6"; @hand-down: "\f0a7"; @circle-arrow-left: "\f0a8"; @circle-arrow-right: "\f0a9"; @circle-arrow-up: "\f0aa"; @circle-arrow-down: "\f0ab"; @globe: "\f0ac"; @wrench: "\f0ad"; @tasks: "\f0ae"; @filter: "\f0b0"; @briefcase: "\f0b1"; @fullscreen: "\f0b2"; @group: "\f0c0"; @link: "\f0c1"; @cloud: "\f0c2"; @beaker: "\f0c3"; @cut: "\f0c4"; @copy: "\f0c5"; @paper-clip: "\f0c6"; @save: "\f0c7"; @sign-blank: "\f0c8"; @reorder: "\f0c9"; @list-ul: "\f0ca"; @list-ol: "\f0cb"; @strikethrough: "\f0cc"; @underline: "\f0cd"; @table: "\f0ce"; @magic: "\f0d0"; @truck: "\f0d1"; @pinterest: "\f0d2"; @pinterest-sign: "\f0d3"; @google-plus-sign: "\f0d4"; @google-plus: "\f0d5"; @money: "\f0d6"; @caret-down: "\f0d7"; @caret-up: "\f0d8"; @caret-left: "\f0d9"; @caret-right: "\f0da"; @columns: "\f0db"; @sort: "\f0dc"; @sort-down: "\f0dd"; @sort-up: "\f0de"; @envelope: "\f0e0"; @linkedin: "\f0e1"; @undo: "\f0e2"; @legal: "\f0e3"; @dashboard: "\f0e4"; @comment-alt: "\f0e5"; @comments-alt: "\f0e6"; @bolt: "\f0e7"; @sitemap: "\f0e8"; @umbrella: "\f0e9"; @paste: "\f0ea"; @lightbulb: "\f0eb"; @exchange: "\f0ec"; @cloud-download: "\f0ed"; @cloud-upload: "\f0ee"; @user-md: "\f0f0"; @stethoscope: "\f0f1"; @suitcase: "\f0f2"; @bell-alt: "\f0f3"; @coffee: "\f0f4"; @food: "\f0f5"; @file-text-alt: "\f0f6"; @building: "\f0f7"; @hospital: "\f0f8"; @ambulance: "\f0f9"; @medkit: "\f0fa"; @fighter-jet: "\f0fb"; @beer: "\f0fc"; @h-sign: "\f0fd"; @plus-sign-alt: "\f0fe"; @double-angle-left: "\f100"; @double-angle-right: "\f101"; @double-angle-up: "\f102"; @double-angle-down: "\f103"; @angle-left: "\f104"; @angle-right: "\f105"; @angle-up: "\f106"; @angle-down: "\f107"; @desktop: "\f108"; @laptop: "\f109"; @tablet: "\f10a"; @mobile-phone: "\f10b"; @circle-blank: "\f10c"; @quote-left: "\f10d"; @quote-right: "\f10e"; @spinner: "\f110"; @circle: "\f111"; @reply: "\f112"; @github-alt: "\f113"; @folder-close-alt: "\f114"; @folder-open-alt: "\f115"; @expand-alt: "\f116"; @collapse-alt: "\f117"; @smile: "\f118"; @frown: "\f119"; @meh: "\f11a"; @gamepad: "\f11b"; @keyboard: "\f11c"; @flag-alt: "\f11d"; @flag-checkered: "\f11e"; @terminal: "\f120"; @code: "\f121"; @reply-all: "\f122"; @mail-reply-all: "\f122"; @star-half-empty: "\f123"; @location-arrow: "\f124"; @crop: "\f125"; @code-fork: "\f126"; @unlink: "\f127"; @question: "\f128"; @info: "\f129"; @exclamation: "\f12a"; @superscript: "\f12b"; @subscript: "\f12c"; @eraser: "\f12d"; @puzzle-piece: "\f12e"; @microphone: "\f130"; @microphone-off: "\f131"; @shield: "\f132"; @calendar-empty: "\f133"; @fire-extinguisher: "\f134"; @rocket: "\f135"; @maxcdn: "\f136"; @chevron-sign-left: "\f137"; @chevron-sign-right: "\f138"; @chevron-sign-up: "\f139"; @chevron-sign-down: "\f13a"; @html5: "\f13b"; @css3: "\f13c"; @anchor: "\f13d"; @unlock-alt: "\f13e"; @bullseye: "\f140"; @ellipsis-horizontal: "\f141"; @ellipsis-vertical: "\f142"; @rss-sign: "\f143"; @play-sign: "\f144"; @ticket: "\f145"; @minus-sign-alt: "\f146"; @check-minus: "\f147"; @level-up: "\f148"; @level-down: "\f149"; @check-sign: "\f14a"; @edit-sign: "\f14b"; @external-link-sign: "\f14c"; @share-sign: "\f14d"; @compass: "\f14e"; @collapse: "\f150"; @collapse-top: "\f151"; @expand: "\f152"; @eur: "\f153"; @gbp: "\f154"; @usd: "\f155"; @inr: "\f156"; @jpy: "\f157"; @cny: "\f158"; @krw: "\f159"; @btc: "\f15a"; @file: "\f15b"; @file-text: "\f15c"; @sort-by-alphabet: "\f15d"; @sort-by-alphabet-alt: "\f15e"; @sort-by-attributes: "\f160"; @sort-by-attributes-alt: "\f161"; @sort-by-order: "\f162"; @sort-by-order-alt: "\f163"; @thumbs-up: "\f164"; @thumbs-down: "\f165"; @youtube-sign: "\f166"; @youtube: "\f167"; @xing: "\f168"; @xing-sign: "\f169"; @youtube-play: "\f16a"; @dropbox: "\f16b"; @stackexchange: "\f16c"; @instagram: "\f16d"; @flickr: "\f16e"; @adn: "\f170"; @bitbucket: "\f171"; @bitbucket-sign: "\f172"; @tumblr: "\f173"; @tumblr-sign: "\f174"; @long-arrow-down: "\f175"; @long-arrow-up: "\f176"; @long-arrow-left: "\f177"; @long-arrow-right: "\f178"; @apple: "\f179"; @windows: "\f17a"; @android: "\f17b"; @linux: "\f17c"; @dribbble: "\f17d"; @skype: "\f17e"; @foursquare: "\f180"; @trello: "\f181"; @female: "\f182"; @male: "\f183"; @gittip: "\f184"; @sun: "\f185"; @moon: "\f186"; @archive: "\f187"; @bug: "\f188"; @vk: "\f189"; @weibo: "\f18a"; @renren: "\f18b"; apache-couchdb-1.6.0/src/fauxton/assets/less/bootstrap/font-awesome/core.less0000644000175000001440000000406512332105522027307 0ustar00djcusers00000000000000/* FONT AWESOME CORE * -------------------------- */ [class^="icon-"], [class*=" icon-"] { .icon-FontAwesome(); } [class^="icon-"]:before, [class*=" icon-"]:before { text-decoration: inherit; display: inline-block; speak: none; } /* makes the font 33% larger relative to the icon container */ .icon-large:before { vertical-align: -10%; font-size: 4/3em; } /* makes sure icons active on rollover in links */ a { [class^="icon-"], [class*=" icon-"] { display: inline; } } /* increased font size for icon-large */ [class^="icon-"], [class*=" icon-"] { &.icon-fixed-width { display: inline-block; width: 16/14em; text-align: right; padding-right: 4/14em; &.icon-large { width: 20/14em; } } } .icons-ul { margin-left: @icons-li-width; list-style-type: none; > li { position: relative; } .icon-li { position: absolute; left: -@icons-li-width; width: @icons-li-width; text-align: center; line-height: inherit; } } // allows usage of the hide class directly on font awesome icons [class^="icon-"], [class*=" icon-"] { &.hide { display: none; } } .icon-muted { color: @iconMuted; } .icon-light { color: @iconLight; } .icon-dark { color: @iconDark; } // Icon Borders // ------------------------- .icon-border { border: solid 1px @borderColor; padding: .2em .25em .15em; .border-radius(3px); } // Icon Sizes // ------------------------- .icon-2x { font-size: 2em; &.icon-border { border-width: 2px; .border-radius(4px); } } .icon-3x { font-size: 3em; &.icon-border { border-width: 3px; .border-radius(5px); } } .icon-4x { font-size: 4em; &.icon-border { border-width: 4px; .border-radius(6px); } } .icon-5x { font-size: 5em; &.icon-border { border-width: 5px; .border-radius(7px); } } // Floats & Margins // ------------------------- // Quick floats .pull-right { float: right; } .pull-left { float: left; } [class^="icon-"], [class*=" icon-"] { &.pull-left { margin-right: .3em; } &.pull-right { margin-left: .3em; } } apache-couchdb-1.6.0/src/fauxton/assets/less/bootstrap/font-awesome/mixins.less0000644000175000001440000000202112332105522027654 0ustar00djcusers00000000000000// Mixins // -------------------------- .icon(@icon) { .icon-FontAwesome(); content: @icon; } .icon-FontAwesome() { font-family: FontAwesome; font-weight: normal; font-style: normal; text-decoration: inherit; -webkit-font-smoothing: antialiased; *margin-right: .3em; // fixes ie7 issues } .border-radius(@radius) { -webkit-border-radius: @radius; -moz-border-radius: @radius; border-radius: @radius; } .icon-stack(@width: 2em, @height: 2em, @top-font-size: 1em, @base-font-size: 2em) { .icon-stack { position: relative; display: inline-block; width: @width; height: @height; line-height: @width; vertical-align: -35%; [class^="icon-"], [class*=" icon-"] { display: block; text-align: center; position: absolute; width: 100%; height: 100%; font-size: @top-font-size; line-height: inherit; *line-height: @height; } .icon-stack-base { font-size: @base-font-size; *line-height: @height / @base-font-size; } } } apache-couchdb-1.6.0/src/fauxton/assets/less/bootstrap/font-awesome/icons.less0000644000175000001440000004222312332105522027470 0ustar00djcusers00000000000000/* Font Awesome uses the Unicode Private Use Area (PUA) to ensure screen readers do not read off random characters that represent icons */ .icon-glass:before { content: @glass; } .icon-music:before { content: @music; } .icon-search:before { content: @search; } .icon-envelope-alt:before { content: @envelope-alt; } .icon-heart:before { content: @heart; } .icon-star:before { content: @star; } .icon-star-empty:before { content: @star-empty; } .icon-user:before { content: @user; } .icon-film:before { content: @film; } .icon-th-large:before { content: @th-large; } .icon-th:before { content: @th; } .icon-th-list:before { content: @th-list; } .icon-ok:before { content: @ok; } .icon-remove:before { content: @remove; } .icon-zoom-in:before { content: @zoom-in; } .icon-zoom-out:before { content: @zoom-out; } .icon-power-off:before, .icon-off:before { content: @off; } .icon-signal:before { content: @signal; } .icon-gear:before, .icon-cog:before { content: @cog; } .icon-trash:before { content: @trash; } .icon-home:before { content: @home; } .icon-file-alt:before { content: @file-alt; } .icon-time:before { content: @time; } .icon-road:before { content: @road; } .icon-download-alt:before { content: @download-alt; } .icon-download:before { content: @download; } .icon-upload:before { content: @upload; } .icon-inbox:before { content: @inbox; } .icon-play-circle:before { content: @play-circle; } .icon-rotate-right:before, .icon-repeat:before { content: @repeat; } .icon-refresh:before { content: @refresh; } .icon-list-alt:before { content: @list-alt; } .icon-lock:before { content: @lock; } .icon-flag:before { content: @flag; } .icon-headphones:before { content: @headphones; } .icon-volume-off:before { content: @volume-off; } .icon-volume-down:before { content: @volume-down; } .icon-volume-up:before { content: @volume-up; } .icon-qrcode:before { content: @qrcode; } .icon-barcode:before { content: @barcode; } .icon-tag:before { content: @tag; } .icon-tags:before { content: @tags; } .icon-book:before { content: @book; } .icon-bookmark:before { content: @bookmark; } .icon-print:before { content: @print; } .icon-camera:before { content: @camera; } .icon-font:before { content: @font; } .icon-bold:before { content: @bold; } .icon-italic:before { content: @italic; } .icon-text-height:before { content: @text-height; } .icon-text-width:before { content: @text-width; } .icon-align-left:before { content: @align-left; } .icon-align-center:before { content: @align-center; } .icon-align-right:before { content: @align-right; } .icon-align-justify:before { content: @align-justify; } .icon-list:before { content: @list; } .icon-indent-left:before { content: @indent-left; } .icon-indent-right:before { content: @indent-right; } .icon-facetime-video:before { content: @facetime-video; } .icon-picture:before { content: @picture; } .icon-pencil:before { content: @pencil; } .icon-map-marker:before { content: @map-marker; } .icon-adjust:before { content: @adjust; } .icon-tint:before { content: @tint; } .icon-edit:before { content: @edit; } .icon-share:before { content: @share; } .icon-check:before { content: @check; } .icon-move:before { content: @move; } .icon-step-backward:before { content: @step-backward; } .icon-fast-backward:before { content: @fast-backward; } .icon-backward:before { content: @backward; } .icon-play:before { content: @play; } .icon-pause:before { content: @pause; } .icon-stop:before { content: @stop; } .icon-forward:before { content: @forward; } .icon-fast-forward:before { content: @fast-forward; } .icon-step-forward:before { content: @step-forward; } .icon-eject:before { content: @eject; } .icon-chevron-left:before { content: @chevron-left; } .icon-chevron-right:before { content: @chevron-right; } .icon-plus-sign:before { content: @plus-sign; } .icon-minus-sign:before { content: @minus-sign; } .icon-remove-sign:before { content: @remove-sign; } .icon-ok-sign:before { content: @ok-sign; } .icon-question-sign:before { content: @question-sign; } .icon-info-sign:before { content: @info-sign; } .icon-screenshot:before { content: @screenshot; } .icon-remove-circle:before { content: @remove-circle; } .icon-ok-circle:before { content: @ok-circle; } .icon-ban-circle:before { content: @ban-circle; } .icon-arrow-left:before { content: @arrow-left; } .icon-arrow-right:before { content: @arrow-right; } .icon-arrow-up:before { content: @arrow-up; } .icon-arrow-down:before { content: @arrow-down; } .icon-mail-forward:before, .icon-share-alt:before { content: @share-alt; } .icon-resize-full:before { content: @resize-full; } .icon-resize-small:before { content: @resize-small; } .icon-plus:before { content: @plus; } .icon-minus:before { content: @minus; } .icon-asterisk:before { content: @asterisk; } .icon-exclamation-sign:before { content: @exclamation-sign; } .icon-gift:before { content: @gift; } .icon-leaf:before { content: @leaf; } .icon-fire:before { content: @fire; } .icon-eye-open:before { content: @eye-open; } .icon-eye-close:before { content: @eye-close; } .icon-warning-sign:before { content: @warning-sign; } .icon-plane:before { content: @plane; } .icon-calendar:before { content: @calendar; } .icon-random:before { content: @random; } .icon-comment:before { content: @comment; } .icon-magnet:before { content: @magnet; } .icon-chevron-up:before { content: @chevron-up; } .icon-chevron-down:before { content: @chevron-down; } .icon-retweet:before { content: @retweet; } .icon-shopping-cart:before { content: @shopping-cart; } .icon-folder-close:before { content: @folder-close; } .icon-folder-open:before { content: @folder-open; } .icon-resize-vertical:before { content: @resize-vertical; } .icon-resize-horizontal:before { content: @resize-horizontal; } .icon-bar-chart:before { content: @bar-chart; } .icon-twitter-sign:before { content: @twitter-sign; } .icon-facebook-sign:before { content: @facebook-sign; } .icon-camera-retro:before { content: @camera-retro; } .icon-key:before { content: @key; } .icon-gears:before, .icon-cogs:before { content: @cogs; } .icon-comments:before { content: @comments; } .icon-thumbs-up-alt:before { content: @thumbs-up-alt; } .icon-thumbs-down-alt:before { content: @thumbs-down-alt; } .icon-star-half:before { content: @star-half; } .icon-heart-empty:before { content: @heart-empty; } .icon-signout:before { content: @signout; } .icon-linkedin-sign:before { content: @linkedin-sign; } .icon-pushpin:before { content: @pushpin; } .icon-external-link:before { content: @external-link; } .icon-signin:before { content: @signin; } .icon-trophy:before { content: @trophy; } .icon-github-sign:before { content: @github-sign; } .icon-upload-alt:before { content: @upload-alt; } .icon-lemon:before { content: @lemon; } .icon-phone:before { content: @phone; } .icon-unchecked:before, .icon-check-empty:before { content: @check-empty; } .icon-bookmark-empty:before { content: @bookmark-empty; } .icon-phone-sign:before { content: @phone-sign; } .icon-twitter:before { content: @twitter; } .icon-facebook:before { content: @facebook; } .icon-github:before { content: @github; } .icon-unlock:before { content: @unlock; } .icon-credit-card:before { content: @credit-card; } .icon-rss:before { content: @rss; } .icon-hdd:before { content: @hdd; } .icon-bullhorn:before { content: @bullhorn; } .icon-bell:before { content: @bell; } .icon-certificate:before { content: @certificate; } .icon-hand-right:before { content: @hand-right; } .icon-hand-left:before { content: @hand-left; } .icon-hand-up:before { content: @hand-up; } .icon-hand-down:before { content: @hand-down; } .icon-circle-arrow-left:before { content: @circle-arrow-left; } .icon-circle-arrow-right:before { content: @circle-arrow-right; } .icon-circle-arrow-up:before { content: @circle-arrow-up; } .icon-circle-arrow-down:before { content: @circle-arrow-down; } .icon-globe:before { content: @globe; } .icon-wrench:before { content: @wrench; } .icon-tasks:before { content: @tasks; } .icon-filter:before { content: @filter; } .icon-briefcase:before { content: @briefcase; } .icon-fullscreen:before { content: @fullscreen; } .icon-group:before { content: @group; } .icon-link:before { content: @link; } .icon-cloud:before { content: @cloud; } .icon-beaker:before { content: @beaker; } .icon-cut:before { content: @cut; } .icon-copy:before { content: @copy; } .icon-paperclip:before, .icon-paper-clip:before { content: @paper-clip; } .icon-save:before { content: @save; } .icon-sign-blank:before { content: @sign-blank; } .icon-reorder:before { content: @reorder; } .icon-list-ul:before { content: @list-ul; } .icon-list-ol:before { content: @list-ol; } .icon-strikethrough:before { content: @strikethrough; } .icon-underline:before { content: @underline; } .icon-table:before { content: @table; } .icon-magic:before { content: @magic; } .icon-truck:before { content: @truck; } .icon-pinterest:before { content: @pinterest; } .icon-pinterest-sign:before { content: @pinterest-sign; } .icon-google-plus-sign:before { content: @google-plus-sign; } .icon-google-plus:before { content: @google-plus; } .icon-money:before { content: @money; } .icon-caret-down:before { content: @caret-down; } .icon-caret-up:before { content: @caret-up; } .icon-caret-left:before { content: @caret-left; } .icon-caret-right:before { content: @caret-right; } .icon-columns:before { content: @columns; } .icon-sort:before { content: @sort; } .icon-sort-down:before { content: @sort-down; } .icon-sort-up:before { content: @sort-up; } .icon-envelope:before { content: @envelope; } .icon-linkedin:before { content: @linkedin; } .icon-rotate-left:before, .icon-undo:before { content: @undo; } .icon-legal:before { content: @legal; } .icon-dashboard:before { content: @dashboard; } .icon-comment-alt:before { content: @comment-alt; } .icon-comments-alt:before { content: @comments-alt; } .icon-bolt:before { content: @bolt; } .icon-sitemap:before { content: @sitemap; } .icon-umbrella:before { content: @umbrella; } .icon-paste:before { content: @paste; } .icon-lightbulb:before { content: @lightbulb; } .icon-exchange:before { content: @exchange; } .icon-cloud-download:before { content: @cloud-download; } .icon-cloud-upload:before { content: @cloud-upload; } .icon-user-md:before { content: @user-md; } .icon-stethoscope:before { content: @stethoscope; } .icon-suitcase:before { content: @suitcase; } .icon-bell-alt:before { content: @bell-alt; } .icon-coffee:before { content: @coffee; } .icon-food:before { content: @food; } .icon-file-text-alt:before { content: @file-text-alt; } .icon-building:before { content: @building; } .icon-hospital:before { content: @hospital; } .icon-ambulance:before { content: @ambulance; } .icon-medkit:before { content: @medkit; } .icon-fighter-jet:before { content: @fighter-jet; } .icon-beer:before { content: @beer; } .icon-h-sign:before { content: @h-sign; } .icon-plus-sign-alt:before { content: @plus-sign-alt; } .icon-double-angle-left:before { content: @double-angle-left; } .icon-double-angle-right:before { content: @double-angle-right; } .icon-double-angle-up:before { content: @double-angle-up; } .icon-double-angle-down:before { content: @double-angle-down; } .icon-angle-left:before { content: @angle-left; } .icon-angle-right:before { content: @angle-right; } .icon-angle-up:before { content: @angle-up; } .icon-angle-down:before { content: @angle-down; } .icon-desktop:before { content: @desktop; } .icon-laptop:before { content: @laptop; } .icon-tablet:before { content: @tablet; } .icon-mobile-phone:before { content: @mobile-phone; } .icon-circle-blank:before { content: @circle-blank; } .icon-quote-left:before { content: @quote-left; } .icon-quote-right:before { content: @quote-right; } .icon-spinner:before { content: @spinner; } .icon-circle:before { content: @circle; } .icon-mail-reply:before, .icon-reply:before { content: @reply; } .icon-github-alt:before { content: @github-alt; } .icon-folder-close-alt:before { content: @folder-close-alt; } .icon-folder-open-alt:before { content: @folder-open-alt; } .icon-expand-alt:before { content: @expand-alt; } .icon-collapse-alt:before { content: @collapse-alt; } .icon-smile:before { content: @smile; } .icon-frown:before { content: @frown; } .icon-meh:before { content: @meh; } .icon-gamepad:before { content: @gamepad; } .icon-keyboard:before { content: @keyboard; } .icon-flag-alt:before { content: @flag-alt; } .icon-flag-checkered:before { content: @flag-checkered; } .icon-terminal:before { content: @terminal; } .icon-code:before { content: @code; } .icon-reply-all:before { content: @reply-all; } .icon-mail-reply-all:before { content: @mail-reply-all; } .icon-star-half-full:before, .icon-star-half-empty:before { content: @star-half-empty; } .icon-location-arrow:before { content: @location-arrow; } .icon-crop:before { content: @crop; } .icon-code-fork:before { content: @code-fork; } .icon-unlink:before { content: @unlink; } .icon-question:before { content: @question; } .icon-info:before { content: @info; } .icon-exclamation:before { content: @exclamation; } .icon-superscript:before { content: @superscript; } .icon-subscript:before { content: @subscript; } .icon-eraser:before { content: @eraser; } .icon-puzzle-piece:before { content: @puzzle-piece; } .icon-microphone:before { content: @microphone; } .icon-microphone-off:before { content: @microphone-off; } .icon-shield:before { content: @shield; } .icon-calendar-empty:before { content: @calendar-empty; } .icon-fire-extinguisher:before { content: @fire-extinguisher; } .icon-rocket:before { content: @rocket; } .icon-maxcdn:before { content: @maxcdn; } .icon-chevron-sign-left:before { content: @chevron-sign-left; } .icon-chevron-sign-right:before { content: @chevron-sign-right; } .icon-chevron-sign-up:before { content: @chevron-sign-up; } .icon-chevron-sign-down:before { content: @chevron-sign-down; } .icon-html5:before { content: @html5; } .icon-css3:before { content: @css3; } .icon-anchor:before { content: @anchor; } .icon-unlock-alt:before { content: @unlock-alt; } .icon-bullseye:before { content: @bullseye; } .icon-ellipsis-horizontal:before { content: @ellipsis-horizontal; } .icon-ellipsis-vertical:before { content: @ellipsis-vertical; } .icon-rss-sign:before { content: @rss-sign; } .icon-play-sign:before { content: @play-sign; } .icon-ticket:before { content: @ticket; } .icon-minus-sign-alt:before { content: @minus-sign-alt; } .icon-check-minus:before { content: @check-minus; } .icon-level-up:before { content: @level-up; } .icon-level-down:before { content: @level-down; } .icon-check-sign:before { content: @check-sign; } .icon-edit-sign:before { content: @edit-sign; } .icon-external-link-sign:before { content: @external-link-sign; } .icon-share-sign:before { content: @share-sign; } .icon-compass:before { content: @compass; } .icon-collapse:before { content: @collapse; } .icon-collapse-top:before { content: @collapse-top; } .icon-expand:before { content: @expand; } .icon-euro:before, .icon-eur:before { content: @eur; } .icon-gbp:before { content: @gbp; } .icon-dollar:before, .icon-usd:before { content: @usd; } .icon-rupee:before, .icon-inr:before { content: @inr; } .icon-yen:before, .icon-jpy:before { content: @jpy; } .icon-renminbi:before, .icon-cny:before { content: @cny; } .icon-won:before, .icon-krw:before { content: @krw; } .icon-bitcoin:before, .icon-btc:before { content: @btc; } .icon-file:before { content: @file; } .icon-file-text:before { content: @file-text; } .icon-sort-by-alphabet:before { content: @sort-by-alphabet; } .icon-sort-by-alphabet-alt:before { content: @sort-by-alphabet-alt; } .icon-sort-by-attributes:before { content: @sort-by-attributes; } .icon-sort-by-attributes-alt:before { content: @sort-by-attributes-alt; } .icon-sort-by-order:before { content: @sort-by-order; } .icon-sort-by-order-alt:before { content: @sort-by-order-alt; } .icon-thumbs-up:before { content: @thumbs-up; } .icon-thumbs-down:before { content: @thumbs-down; } .icon-youtube-sign:before { content: @youtube-sign; } .icon-youtube:before { content: @youtube; } .icon-xing:before { content: @xing; } .icon-xing-sign:before { content: @xing-sign; } .icon-youtube-play:before { content: @youtube-play; } .icon-dropbox:before { content: @dropbox; } .icon-stackexchange:before { content: @stackexchange; } .icon-instagram:before { content: @instagram; } .icon-flickr:before { content: @flickr; } .icon-adn:before { content: @adn; } .icon-bitbucket:before { content: @bitbucket; } .icon-bitbucket-sign:before { content: @bitbucket-sign; } .icon-tumblr:before { content: @tumblr; } .icon-tumblr-sign:before { content: @tumblr-sign; } .icon-long-arrow-down:before { content: @long-arrow-down; } .icon-long-arrow-up:before { content: @long-arrow-up; } .icon-long-arrow-left:before { content: @long-arrow-left; } .icon-long-arrow-right:before { content: @long-arrow-right; } .icon-apple:before { content: @apple; } .icon-windows:before { content: @windows; } .icon-android:before { content: @android; } .icon-linux:before { content: @linux; } .icon-dribbble:before { content: @dribbble; } .icon-skype:before { content: @skype; } .icon-foursquare:before { content: @foursquare; } .icon-trello:before { content: @trello; } .icon-female:before { content: @female; } .icon-male:before { content: @male; } .icon-gittip:before { content: @gittip; } .icon-sun:before { content: @sun; } .icon-moon:before { content: @moon; } .icon-archive:before { content: @archive; } .icon-bug:before { content: @bug; } .icon-vk:before { content: @vk; } .icon-weibo:before { content: @weibo; } .icon-renren:before { content: @renren; } apache-couchdb-1.6.0/src/fauxton/assets/less/bootstrap/font-awesome/font-awesome-ie7.less0000644000175000001440000004554312332105522031453 0ustar00djcusers00000000000000/*! * Font Awesome 3.2.1 * the iconic font designed for Bootstrap * ------------------------------------------------------------------------------ * The full suite of pictographic icons, examples, and documentation can be * found at http://fontawesome.io. Stay up to date on Twitter at * http://twitter.com/fontawesome. * * License * ------------------------------------------------------------------------------ * - The Font Awesome font is licensed under SIL OFL 1.1 - * http://scripts.sil.org/OFL * - Font Awesome CSS, LESS, and SASS files are licensed under MIT License - * http://opensource.org/licenses/mit-license.html * - Font Awesome documentation licensed under CC BY 3.0 - * http://creativecommons.org/licenses/by/3.0/ * - Attribution is no longer required in Font Awesome 3.0, but much appreciated: * "Font Awesome by Dave Gandy - http://fontawesome.io" * * Author - Dave Gandy * ------------------------------------------------------------------------------ * Email: dave@fontawesome.io * Twitter: http://twitter.com/davegandy * Work: Lead Product Designer @ Kyruus - http://kyruus.com */ .icon-large { font-size: 4/3em; margin-top: -4px; padding-top: 3px; margin-bottom: -4px; padding-bottom: 3px; vertical-align: middle; } .nav { [class^="icon-"], [class*=" icon-"] { vertical-align: inherit; margin-top: -4px; padding-top: 3px; margin-bottom: -4px; padding-bottom: 3px; &.icon-large { vertical-align: -25%; } } } .nav-pills, .nav-tabs { [class^="icon-"], [class*=" icon-"] { &.icon-large { line-height: .75em; margin-top: -7px; padding-top: 5px; margin-bottom: -5px; padding-bottom: 4px; } } } .btn { [class^="icon-"], [class*=" icon-"] { &.pull-left, &.pull-right { vertical-align: inherit; } &.icon-large { margin-top: -.5em; } } } a [class^="icon-"], a [class*=" icon-"] { cursor: pointer; } .ie7icon(@inner) { *zoom: ~"expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '@{inner}')"; } .icon-glass { .ie7icon(''); } .icon-music { .ie7icon(''); } .icon-search { .ie7icon(''); } .icon-envelope-alt { .ie7icon(''); } .icon-heart { .ie7icon(''); } .icon-star { .ie7icon(''); } .icon-star-empty { .ie7icon(''); } .icon-user { .ie7icon(''); } .icon-film { .ie7icon(''); } .icon-th-large { .ie7icon(''); } .icon-th { .ie7icon(''); } .icon-th-list { .ie7icon(''); } .icon-ok { .ie7icon(''); } .icon-remove { .ie7icon(''); } .icon-zoom-in { .ie7icon(''); } .icon-zoom-out { .ie7icon(''); } .icon-off { .ie7icon(''); } .icon-power-off { .ie7icon(''); } .icon-signal { .ie7icon(''); } .icon-cog { .ie7icon(''); } .icon-gear { .ie7icon(''); } .icon-trash { .ie7icon(''); } .icon-home { .ie7icon(''); } .icon-file-alt { .ie7icon(''); } .icon-time { .ie7icon(''); } .icon-road { .ie7icon(''); } .icon-download-alt { .ie7icon(''); } .icon-download { .ie7icon(''); } .icon-upload { .ie7icon(''); } .icon-inbox { .ie7icon(''); } .icon-play-circle { .ie7icon(''); } .icon-repeat { .ie7icon(''); } .icon-rotate-right { .ie7icon(''); } .icon-refresh { .ie7icon(''); } .icon-list-alt { .ie7icon(''); } .icon-lock { .ie7icon(''); } .icon-flag { .ie7icon(''); } .icon-headphones { .ie7icon(''); } .icon-volume-off { .ie7icon(''); } .icon-volume-down { .ie7icon(''); } .icon-volume-up { .ie7icon(''); } .icon-qrcode { .ie7icon(''); } .icon-barcode { .ie7icon(''); } .icon-tag { .ie7icon(''); } .icon-tags { .ie7icon(''); } .icon-book { .ie7icon(''); } .icon-bookmark { .ie7icon(''); } .icon-print { .ie7icon(''); } .icon-camera { .ie7icon(''); } .icon-font { .ie7icon(''); } .icon-bold { .ie7icon(''); } .icon-italic { .ie7icon(''); } .icon-text-height { .ie7icon(''); } .icon-text-width { .ie7icon(''); } .icon-align-left { .ie7icon(''); } .icon-align-center { .ie7icon(''); } .icon-align-right { .ie7icon(''); } .icon-align-justify { .ie7icon(''); } .icon-list { .ie7icon(''); } .icon-indent-left { .ie7icon(''); } .icon-indent-right { .ie7icon(''); } .icon-facetime-video { .ie7icon(''); } .icon-picture { .ie7icon(''); } .icon-pencil { .ie7icon(''); } .icon-map-marker { .ie7icon(''); } .icon-adjust { .ie7icon(''); } .icon-tint { .ie7icon(''); } .icon-edit { .ie7icon(''); } .icon-share { .ie7icon(''); } .icon-check { .ie7icon(''); } .icon-move { .ie7icon(''); } .icon-step-backward { .ie7icon(''); } .icon-fast-backward { .ie7icon(''); } .icon-backward { .ie7icon(''); } .icon-play { .ie7icon(''); } .icon-pause { .ie7icon(''); } .icon-stop { .ie7icon(''); } .icon-forward { .ie7icon(''); } .icon-fast-forward { .ie7icon(''); } .icon-step-forward { .ie7icon(''); } .icon-eject { .ie7icon(''); } .icon-chevron-left { .ie7icon(''); } .icon-chevron-right { .ie7icon(''); } .icon-plus-sign { .ie7icon(''); } .icon-minus-sign { .ie7icon(''); } .icon-remove-sign { .ie7icon(''); } .icon-ok-sign { .ie7icon(''); } .icon-question-sign { .ie7icon(''); } .icon-info-sign { .ie7icon(''); } .icon-screenshot { .ie7icon(''); } .icon-remove-circle { .ie7icon(''); } .icon-ok-circle { .ie7icon(''); } .icon-ban-circle { .ie7icon(''); } .icon-arrow-left { .ie7icon(''); } .icon-arrow-right { .ie7icon(''); } .icon-arrow-up { .ie7icon(''); } .icon-arrow-down { .ie7icon(''); } .icon-share-alt { .ie7icon(''); } .icon-mail-forward { .ie7icon(''); } .icon-resize-full { .ie7icon(''); } .icon-resize-small { .ie7icon(''); } .icon-plus { .ie7icon(''); } .icon-minus { .ie7icon(''); } .icon-asterisk { .ie7icon(''); } .icon-exclamation-sign { .ie7icon(''); } .icon-gift { .ie7icon(''); } .icon-leaf { .ie7icon(''); } .icon-fire { .ie7icon(''); } .icon-eye-open { .ie7icon(''); } .icon-eye-close { .ie7icon(''); } .icon-warning-sign { .ie7icon(''); } .icon-plane { .ie7icon(''); } .icon-calendar { .ie7icon(''); } .icon-random { .ie7icon(''); } .icon-comment { .ie7icon(''); } .icon-magnet { .ie7icon(''); } .icon-chevron-up { .ie7icon(''); } .icon-chevron-down { .ie7icon(''); } .icon-retweet { .ie7icon(''); } .icon-shopping-cart { .ie7icon(''); } .icon-folder-close { .ie7icon(''); } .icon-folder-open { .ie7icon(''); } .icon-resize-vertical { .ie7icon(''); } .icon-resize-horizontal { .ie7icon(''); } .icon-bar-chart { .ie7icon(''); } .icon-twitter-sign { .ie7icon(''); } .icon-facebook-sign { .ie7icon(''); } .icon-camera-retro { .ie7icon(''); } .icon-key { .ie7icon(''); } .icon-cogs { .ie7icon(''); } .icon-gears { .ie7icon(''); } .icon-comments { .ie7icon(''); } .icon-thumbs-up-alt { .ie7icon(''); } .icon-thumbs-down-alt { .ie7icon(''); } .icon-star-half { .ie7icon(''); } .icon-heart-empty { .ie7icon(''); } .icon-signout { .ie7icon(''); } .icon-linkedin-sign { .ie7icon(''); } .icon-pushpin { .ie7icon(''); } .icon-external-link { .ie7icon(''); } .icon-signin { .ie7icon(''); } .icon-trophy { .ie7icon(''); } .icon-github-sign { .ie7icon(''); } .icon-upload-alt { .ie7icon(''); } .icon-lemon { .ie7icon(''); } .icon-phone { .ie7icon(''); } .icon-check-empty { .ie7icon(''); } .icon-unchecked { .ie7icon(''); } .icon-bookmark-empty { .ie7icon(''); } .icon-phone-sign { .ie7icon(''); } .icon-twitter { .ie7icon(''); } .icon-facebook { .ie7icon(''); } .icon-github { .ie7icon(''); } .icon-unlock { .ie7icon(''); } .icon-credit-card { .ie7icon(''); } .icon-rss { .ie7icon(''); } .icon-hdd { .ie7icon(''); } .icon-bullhorn { .ie7icon(''); } .icon-bell { .ie7icon(''); } .icon-certificate { .ie7icon(''); } .icon-hand-right { .ie7icon(''); } .icon-hand-left { .ie7icon(''); } .icon-hand-up { .ie7icon(''); } .icon-hand-down { .ie7icon(''); } .icon-circle-arrow-left { .ie7icon(''); } .icon-circle-arrow-right { .ie7icon(''); } .icon-circle-arrow-up { .ie7icon(''); } .icon-circle-arrow-down { .ie7icon(''); } .icon-globe { .ie7icon(''); } .icon-wrench { .ie7icon(''); } .icon-tasks { .ie7icon(''); } .icon-filter { .ie7icon(''); } .icon-briefcase { .ie7icon(''); } .icon-fullscreen { .ie7icon(''); } .icon-group { .ie7icon(''); } .icon-link { .ie7icon(''); } .icon-cloud { .ie7icon(''); } .icon-beaker { .ie7icon(''); } .icon-cut { .ie7icon(''); } .icon-copy { .ie7icon(''); } .icon-paper-clip { .ie7icon(''); } .icon-paperclip { .ie7icon(''); } .icon-save { .ie7icon(''); } .icon-sign-blank { .ie7icon(''); } .icon-reorder { .ie7icon(''); } .icon-list-ul { .ie7icon(''); } .icon-list-ol { .ie7icon(''); } .icon-strikethrough { .ie7icon(''); } .icon-underline { .ie7icon(''); } .icon-table { .ie7icon(''); } .icon-magic { .ie7icon(''); } .icon-truck { .ie7icon(''); } .icon-pinterest { .ie7icon(''); } .icon-pinterest-sign { .ie7icon(''); } .icon-google-plus-sign { .ie7icon(''); } .icon-google-plus { .ie7icon(''); } .icon-money { .ie7icon(''); } .icon-caret-down { .ie7icon(''); } .icon-caret-up { .ie7icon(''); } .icon-caret-left { .ie7icon(''); } .icon-caret-right { .ie7icon(''); } .icon-columns { .ie7icon(''); } .icon-sort { .ie7icon(''); } .icon-sort-down { .ie7icon(''); } .icon-sort-up { .ie7icon(''); } .icon-envelope { .ie7icon(''); } .icon-linkedin { .ie7icon(''); } .icon-undo { .ie7icon(''); } .icon-rotate-left { .ie7icon(''); } .icon-legal { .ie7icon(''); } .icon-dashboard { .ie7icon(''); } .icon-comment-alt { .ie7icon(''); } .icon-comments-alt { .ie7icon(''); } .icon-bolt { .ie7icon(''); } .icon-sitemap { .ie7icon(''); } .icon-umbrella { .ie7icon(''); } .icon-paste { .ie7icon(''); } .icon-lightbulb { .ie7icon(''); } .icon-exchange { .ie7icon(''); } .icon-cloud-download { .ie7icon(''); } .icon-cloud-upload { .ie7icon(''); } .icon-user-md { .ie7icon(''); } .icon-stethoscope { .ie7icon(''); } .icon-suitcase { .ie7icon(''); } .icon-bell-alt { .ie7icon(''); } .icon-coffee { .ie7icon(''); } .icon-food { .ie7icon(''); } .icon-file-text-alt { .ie7icon(''); } .icon-building { .ie7icon(''); } .icon-hospital { .ie7icon(''); } .icon-ambulance { .ie7icon(''); } .icon-medkit { .ie7icon(''); } .icon-fighter-jet { .ie7icon(''); } .icon-beer { .ie7icon(''); } .icon-h-sign { .ie7icon(''); } .icon-plus-sign-alt { .ie7icon(''); } .icon-double-angle-left { .ie7icon(''); } .icon-double-angle-right { .ie7icon(''); } .icon-double-angle-up { .ie7icon(''); } .icon-double-angle-down { .ie7icon(''); } .icon-angle-left { .ie7icon(''); } .icon-angle-right { .ie7icon(''); } .icon-angle-up { .ie7icon(''); } .icon-angle-down { .ie7icon(''); } .icon-desktop { .ie7icon(''); } .icon-laptop { .ie7icon(''); } .icon-tablet { .ie7icon(''); } .icon-mobile-phone { .ie7icon(''); } .icon-circle-blank { .ie7icon(''); } .icon-quote-left { .ie7icon(''); } .icon-quote-right { .ie7icon(''); } .icon-spinner { .ie7icon(''); } .icon-circle { .ie7icon(''); } .icon-reply { .ie7icon(''); } .icon-mail-reply { .ie7icon(''); } .icon-github-alt { .ie7icon(''); } .icon-folder-close-alt { .ie7icon(''); } .icon-folder-open-alt { .ie7icon(''); } .icon-expand-alt { .ie7icon(''); } .icon-collapse-alt { .ie7icon(''); } .icon-smile { .ie7icon(''); } .icon-frown { .ie7icon(''); } .icon-meh { .ie7icon(''); } .icon-gamepad { .ie7icon(''); } .icon-keyboard { .ie7icon(''); } .icon-flag-alt { .ie7icon(''); } .icon-flag-checkered { .ie7icon(''); } .icon-terminal { .ie7icon(''); } .icon-code { .ie7icon(''); } .icon-reply-all { .ie7icon(''); } .icon-mail-reply-all { .ie7icon(''); } .icon-star-half-empty { .ie7icon(''); } .icon-star-half-full { .ie7icon(''); } .icon-location-arrow { .ie7icon(''); } .icon-crop { .ie7icon(''); } .icon-code-fork { .ie7icon(''); } .icon-unlink { .ie7icon(''); } .icon-question { .ie7icon(''); } .icon-info { .ie7icon(''); } .icon-exclamation { .ie7icon(''); } .icon-superscript { .ie7icon(''); } .icon-subscript { .ie7icon(''); } .icon-eraser { .ie7icon(''); } .icon-puzzle-piece { .ie7icon(''); } .icon-microphone { .ie7icon(''); } .icon-microphone-off { .ie7icon(''); } .icon-shield { .ie7icon(''); } .icon-calendar-empty { .ie7icon(''); } .icon-fire-extinguisher { .ie7icon(''); } .icon-rocket { .ie7icon(''); } .icon-maxcdn { .ie7icon(''); } .icon-chevron-sign-left { .ie7icon(''); } .icon-chevron-sign-right { .ie7icon(''); } .icon-chevron-sign-up { .ie7icon(''); } .icon-chevron-sign-down { .ie7icon(''); } .icon-html5 { .ie7icon(''); } .icon-css3 { .ie7icon(''); } .icon-anchor { .ie7icon(''); } .icon-unlock-alt { .ie7icon(''); } .icon-bullseye { .ie7icon(''); } .icon-ellipsis-horizontal { .ie7icon(''); } .icon-ellipsis-vertical { .ie7icon(''); } .icon-rss-sign { .ie7icon(''); } .icon-play-sign { .ie7icon(''); } .icon-ticket { .ie7icon(''); } .icon-minus-sign-alt { .ie7icon(''); } .icon-check-minus { .ie7icon(''); } .icon-level-up { .ie7icon(''); } .icon-level-down { .ie7icon(''); } .icon-check-sign { .ie7icon(''); } .icon-edit-sign { .ie7icon(''); } .icon-external-link-sign { .ie7icon(''); } .icon-share-sign { .ie7icon(''); } .icon-compass { .ie7icon(''); } .icon-collapse { .ie7icon(''); } .icon-collapse-top { .ie7icon(''); } .icon-expand { .ie7icon(''); } .icon-eur { .ie7icon(''); } .icon-euro { .ie7icon(''); } .icon-gbp { .ie7icon(''); } .icon-usd { .ie7icon(''); } .icon-dollar { .ie7icon(''); } .icon-inr { .ie7icon(''); } .icon-rupee { .ie7icon(''); } .icon-jpy { .ie7icon(''); } .icon-yen { .ie7icon(''); } .icon-cny { .ie7icon(''); } .icon-renminbi { .ie7icon(''); } .icon-krw { .ie7icon(''); } .icon-won { .ie7icon(''); } .icon-btc { .ie7icon(''); } .icon-bitcoin { .ie7icon(''); } .icon-file { .ie7icon(''); } .icon-file-text { .ie7icon(''); } .icon-sort-by-alphabet { .ie7icon(''); } .icon-sort-by-alphabet-alt { .ie7icon(''); } .icon-sort-by-attributes { .ie7icon(''); } .icon-sort-by-attributes-alt { .ie7icon(''); } .icon-sort-by-order { .ie7icon(''); } .icon-sort-by-order-alt { .ie7icon(''); } .icon-thumbs-up { .ie7icon(''); } .icon-thumbs-down { .ie7icon(''); } .icon-youtube-sign { .ie7icon(''); } .icon-youtube { .ie7icon(''); } .icon-xing { .ie7icon(''); } .icon-xing-sign { .ie7icon(''); } .icon-youtube-play { .ie7icon(''); } .icon-dropbox { .ie7icon(''); } .icon-stackexchange { .ie7icon(''); } .icon-instagram { .ie7icon(''); } .icon-flickr { .ie7icon(''); } .icon-adn { .ie7icon(''); } .icon-bitbucket { .ie7icon(''); } .icon-bitbucket-sign { .ie7icon(''); } .icon-tumblr { .ie7icon(''); } .icon-tumblr-sign { .ie7icon(''); } .icon-long-arrow-down { .ie7icon(''); } .icon-long-arrow-up { .ie7icon(''); } .icon-long-arrow-left { .ie7icon(''); } .icon-long-arrow-right { .ie7icon(''); } .icon-apple { .ie7icon(''); } .icon-windows { .ie7icon(''); } .icon-android { .ie7icon(''); } .icon-linux { .ie7icon(''); } .icon-dribbble { .ie7icon(''); } .icon-skype { .ie7icon(''); } .icon-foursquare { .ie7icon(''); } .icon-trello { .ie7icon(''); } .icon-female { .ie7icon(''); } .icon-male { .ie7icon(''); } .icon-gittip { .ie7icon(''); } .icon-sun { .ie7icon(''); } .icon-moon { .ie7icon(''); } .icon-archive { .ie7icon(''); } .icon-bug { .ie7icon(''); } .icon-vk { .ie7icon(''); } .icon-weibo { .ie7icon(''); } .icon-renren { .ie7icon(''); } apache-couchdb-1.6.0/src/fauxton/assets/less/bootstrap/carousel.less0000644000175000001440000000466212332105522025573 0ustar00djcusers00000000000000// // Carousel // -------------------------------------------------- .carousel { position: relative; margin-bottom: @baseLineHeight; line-height: 1; } .carousel-inner { overflow: hidden; width: 100%; position: relative; } .carousel-inner { > .item { display: none; position: relative; .transition(.6s ease-in-out left); // Account for jankitude on images > img, > a > img { display: block; line-height: 1; } } > .active, > .next, > .prev { display: block; } > .active { left: 0; } > .next, > .prev { position: absolute; top: 0; width: 100%; } > .next { left: 100%; } > .prev { left: -100%; } > .next.left, > .prev.right { left: 0; } > .active.left { left: -100%; } > .active.right { left: 100%; } } // Left/right controls for nav // --------------------------- .carousel-control { position: absolute; top: 40%; left: 15px; width: 40px; height: 40px; margin-top: -20px; font-size: 60px; font-weight: 100; line-height: 30px; color: @white; text-align: center; background: @grayDarker; border: 3px solid @white; .border-radius(23px); .opacity(50); // we can't have this transition here // because webkit cancels the carousel // animation if you trip this while // in the middle of another animation // ;_; // .transition(opacity .2s linear); // Reposition the right one &.right { left: auto; right: 15px; } // Hover/focus state &:hover, &:focus { color: @white; text-decoration: none; .opacity(90); } } // Carousel indicator pips // ----------------------------- .carousel-indicators { position: absolute; top: 15px; right: 15px; z-index: 5; margin: 0; list-style: none; li { display: block; float: left; width: 10px; height: 10px; margin-left: 5px; text-indent: -999px; background-color: #ccc; background-color: rgba(255,255,255,.25); border-radius: 5px; } .active { background-color: #fff; } } // Caption for text below images // ----------------------------- .carousel-caption { position: absolute; left: 0; right: 0; bottom: 0; padding: 15px; background: @grayDark; background: rgba(0,0,0,.75); } .carousel-caption h4, .carousel-caption p { color: @white; line-height: @baseLineHeight; } .carousel-caption h4 { margin: 0 0 5px; } .carousel-caption p { margin-bottom: 0; } apache-couchdb-1.6.0/src/fauxton/assets/less/bootstrap/code.less0000644000175000001440000000240212332105522024656 0ustar00djcusers00000000000000// // Code (inline and blocK) // -------------------------------------------------- // Inline and block code styles code, pre { padding: 0 3px 2px; #font > #family > .monospace; font-size: @baseFontSize - 2; color: @grayDark; .border-radius(3px); } // Inline code code { padding: 2px 4px; color: #d14; background-color: #f7f7f9; border: 1px solid #e1e1e8; white-space: nowrap; } // Blocks of code pre { display: block; padding: (@baseLineHeight - 1) / 2; margin: 0 0 @baseLineHeight / 2; font-size: @baseFontSize - 1; // 14px to 13px line-height: @baseLineHeight; word-break: break-all; word-wrap: break-word; white-space: pre; white-space: pre-wrap; background-color: #f5f5f5; border: 1px solid #ccc; // fallback for IE7-8 border: 1px solid rgba(0,0,0,.15); .border-radius(@baseBorderRadius); // Make prettyprint styles more spaced out for readability &.prettyprint { margin-bottom: @baseLineHeight; } // Account for some code outputs that place code tags in pre tags code { padding: 0; color: inherit; white-space: pre; white-space: pre-wrap; background-color: transparent; border: 0; } } // Enable scrollable blocks of code .pre-scrollable { max-height: 340px; overflow-y: scroll; }apache-couchdb-1.6.0/src/fauxton/assets/less/bootstrap/utilities.less0000644000175000001440000000051712332105522025764 0ustar00djcusers00000000000000// // Utility classes // -------------------------------------------------- // Quick floats .pull-right { float: right; } .pull-left { float: left; } // Toggling content .hide { display: none; } .show { display: block; } // Visibility .invisible { visibility: hidden; } // For Affix plugin .affix { position: fixed; } apache-couchdb-1.6.0/src/fauxton/assets/less/bootstrap/responsive.less0000644000175000001440000000205512332105522026145 0ustar00djcusers00000000000000/*! * Bootstrap Responsive v2.3.2 * * Copyright 2012 Twitter, Inc * Licensed under the Apache License v2.0 * http://www.apache.org/licenses/LICENSE-2.0 * * Designed and built with all the love in the world @twitter by @mdo and @fat. */ // Responsive.less // For phone and tablet devices // ------------------------------------------------------------- // REPEAT VARIABLES & MIXINS // ------------------------- // Required since we compile the responsive stuff separately @import "variables.less"; // Modify this for custom colors, font-sizes, etc @import "mixins.less"; // RESPONSIVE CLASSES // ------------------ @import "responsive-utilities.less"; // MEDIA QUERIES // ------------------ // Large desktops @import "responsive-1200px-min.less"; // Tablets to regular desktops @import "responsive-768px-979px.less"; // Phones to portrait tablets and narrow desktops @import "responsive-767px-max.less"; // RESPONSIVE NAVBAR // ------------------ // From 979px and below, show a button to toggle navbar contents @import "responsive-navbar.less"; apache-couchdb-1.6.0/src/fauxton/assets/less/bootstrap/forms.less0000644000175000001440000003677212332105522025113 0ustar00djcusers00000000000000// // Forms // -------------------------------------------------- // GENERAL STYLES // -------------- // Make all forms have space below them form { margin: 0 0 @baseLineHeight; } fieldset { padding: 0; margin: 0; border: 0; } // Groups of fields with labels on top (legends) legend { display: block; width: 100%; padding: 0; margin-bottom: @baseLineHeight; font-size: @baseFontSize * 1.5; line-height: @baseLineHeight * 2; color: @grayDark; border: 0; border-bottom: 1px solid #e5e5e5; // Small small { font-size: @baseLineHeight * .75; color: @grayLight; } } // Set font for forms label, input, button, select, textarea { #font > .shorthand(@baseFontSize,normal,@baseLineHeight); // Set size, weight, line-height here } input, button, select, textarea { font-family: @baseFontFamily; // And only set font-family here for those that need it (note the missing label element) } // Identify controls by their labels label { display: block; margin-bottom: 5px; } // Form controls // ------------------------- // Shared size and type resets select, textarea, input[type="text"], input[type="password"], input[type="datetime"], input[type="datetime-local"], input[type="date"], input[type="month"], input[type="time"], input[type="week"], input[type="number"], input[type="email"], input[type="url"], input[type="search"], input[type="tel"], input[type="color"], .uneditable-input { display: inline-block; height: @baseLineHeight; padding: 4px 6px; margin-bottom: @baseLineHeight / 2; font-size: @baseFontSize; line-height: @baseLineHeight; color: @gray; .border-radius(@inputBorderRadius); vertical-align: middle; } // Reset appearance properties for textual inputs and textarea // Declare width for legacy (can't be on input[type=*] selectors or it's too specific) input, textarea, .uneditable-input { width: 206px; // plus 12px padding and 2px border } // Reset height since textareas have rows textarea { height: auto; } // Everything else textarea, input[type="text"], input[type="password"], input[type="datetime"], input[type="datetime-local"], input[type="date"], input[type="month"], input[type="time"], input[type="week"], input[type="number"], input[type="email"], input[type="url"], input[type="search"], input[type="tel"], input[type="color"], .uneditable-input { background-color: @inputBackground; border: 1px solid @inputBorder; .box-shadow(inset 0 1px 1px rgba(0,0,0,.075)); .transition(~"border linear .2s, box-shadow linear .2s"); // Focus state &:focus { border-color: rgba(82,168,236,.8); outline: 0; outline: thin dotted \9; /* IE6-9 */ .box-shadow(~"inset 0 1px 1px rgba(0,0,0,.075), 0 0 8px rgba(82,168,236,.6)"); } } // Position radios and checkboxes better input[type="radio"], input[type="checkbox"] { margin: 4px 0 0; *margin-top: 0; /* IE7 */ margin-top: 1px \9; /* IE8-9 */ line-height: normal; } // Reset width of input images, buttons, radios, checkboxes input[type="file"], input[type="image"], input[type="submit"], input[type="reset"], input[type="button"], input[type="radio"], input[type="checkbox"] { width: auto; // Override of generic input selector } // Set the height of select and file controls to match text inputs select, input[type="file"] { height: @inputHeight; /* In IE7, the height of the select element cannot be changed by height, only font-size */ *margin-top: 4px; /* For IE7, add top margin to align select with labels */ line-height: @inputHeight; } // Make select elements obey height by applying a border select { width: 220px; // default input width + 10px of padding that doesn't get applied border: 1px solid @inputBorder; background-color: @inputBackground; // Chrome on Linux and Mobile Safari need background-color } // Make multiple select elements height not fixed select[multiple], select[size] { height: auto; } // Focus for select, file, radio, and checkbox select:focus, input[type="file"]:focus, input[type="radio"]:focus, input[type="checkbox"]:focus { .tab-focus(); } // Uneditable inputs // ------------------------- // Make uneditable inputs look inactive .uneditable-input, .uneditable-textarea { color: @grayLight; background-color: darken(@inputBackground, 1%); border-color: @inputBorder; .box-shadow(inset 0 1px 2px rgba(0,0,0,.025)); cursor: not-allowed; } // For text that needs to appear as an input but should not be an input .uneditable-input { overflow: hidden; // prevent text from wrapping, but still cut it off like an input does white-space: nowrap; } // Make uneditable textareas behave like a textarea .uneditable-textarea { width: auto; height: auto; } // Placeholder // ------------------------- // Placeholder text gets special styles because when browsers invalidate entire lines if it doesn't understand a selector input, textarea { .placeholder(); } // CHECKBOXES & RADIOS // ------------------- // Indent the labels to position radios/checkboxes as hanging .radio, .checkbox { min-height: @baseLineHeight; // clear the floating input if there is no label text padding-left: 20px; } .radio input[type="radio"], .checkbox input[type="checkbox"] { float: left; margin-left: -20px; } // Move the options list down to align with labels .controls > .radio:first-child, .controls > .checkbox:first-child { padding-top: 5px; // has to be padding because margin collaspes } // Radios and checkboxes on same line // TODO v3: Convert .inline to .control-inline .radio.inline, .checkbox.inline { display: inline-block; padding-top: 5px; margin-bottom: 0; vertical-align: middle; } .radio.inline + .radio.inline, .checkbox.inline + .checkbox.inline { margin-left: 10px; // space out consecutive inline controls } // INPUT SIZES // ----------- // General classes for quick sizes .input-mini { width: 60px; } .input-small { width: 90px; } .input-medium { width: 150px; } .input-large { width: 210px; } .input-xlarge { width: 270px; } .input-xxlarge { width: 530px; } // Grid style input sizes input[class*="span"], select[class*="span"], textarea[class*="span"], .uneditable-input[class*="span"], // Redeclare since the fluid row class is more specific .row-fluid input[class*="span"], .row-fluid select[class*="span"], .row-fluid textarea[class*="span"], .row-fluid .uneditable-input[class*="span"] { float: none; margin-left: 0; } // Ensure input-prepend/append never wraps .input-append input[class*="span"], .input-append .uneditable-input[class*="span"], .input-prepend input[class*="span"], .input-prepend .uneditable-input[class*="span"], .row-fluid input[class*="span"], .row-fluid select[class*="span"], .row-fluid textarea[class*="span"], .row-fluid .uneditable-input[class*="span"], .row-fluid .input-prepend [class*="span"], .row-fluid .input-append [class*="span"] { display: inline-block; } // GRID SIZING FOR INPUTS // ---------------------- // Grid sizes #grid > .input(@gridColumnWidth, @gridGutterWidth); // Control row for multiple inputs per line .controls-row { .clearfix(); // Clear the float from controls } // Float to collapse white-space for proper grid alignment .controls-row [class*="span"], // Redeclare the fluid grid collapse since we undo the float for inputs .row-fluid .controls-row [class*="span"] { float: left; } // Explicity set top padding on all checkboxes/radios, not just first-child .controls-row .checkbox[class*="span"], .controls-row .radio[class*="span"] { padding-top: 5px; } // DISABLED STATE // -------------- // Disabled and read-only inputs input[disabled], select[disabled], textarea[disabled], input[readonly], select[readonly], textarea[readonly] { cursor: not-allowed; background-color: @inputDisabledBackground; } // Explicitly reset the colors here input[type="radio"][disabled], input[type="checkbox"][disabled], input[type="radio"][readonly], input[type="checkbox"][readonly] { background-color: transparent; } // FORM FIELD FEEDBACK STATES // -------------------------- // Warning .control-group.warning { .formFieldState(@warningText, @warningText, @warningBackground); } // Error .control-group.error { .formFieldState(@errorText, @errorText, @errorBackground); } // Success .control-group.success { .formFieldState(@successText, @successText, @successBackground); } // Success .control-group.info { .formFieldState(@infoText, @infoText, @infoBackground); } // HTML5 invalid states // Shares styles with the .control-group.error above input:focus:invalid, textarea:focus:invalid, select:focus:invalid { color: #b94a48; border-color: #ee5f5b; &:focus { border-color: darken(#ee5f5b, 10%); @shadow: 0 0 6px lighten(#ee5f5b, 20%); .box-shadow(@shadow); } } // FORM ACTIONS // ------------ .form-actions { padding: (@baseLineHeight - 1) 20px @baseLineHeight; margin-top: @baseLineHeight; margin-bottom: @baseLineHeight; background-color: @formActionsBackground; border-top: 1px solid #e5e5e5; .clearfix(); // Adding clearfix to allow for .pull-right button containers } // HELP TEXT // --------- .help-block, .help-inline { color: lighten(@textColor, 15%); // lighten the text some for contrast } .help-block { display: block; // account for any element using help-block margin-bottom: @baseLineHeight / 2; } .help-inline { display: inline-block; .ie7-inline-block(); vertical-align: middle; padding-left: 5px; } // INPUT GROUPS // ------------ // Allow us to put symbols and text within the input field for a cleaner look .input-append, .input-prepend { display: inline-block; margin-bottom: @baseLineHeight / 2; vertical-align: middle; font-size: 0; // white space collapse hack white-space: nowrap; // Prevent span and input from separating // Reset the white space collapse hack input, select, .uneditable-input, .dropdown-menu, .popover { font-size: @baseFontSize; } input, select, .uneditable-input { position: relative; // placed here by default so that on :focus we can place the input above the .add-on for full border and box-shadow goodness margin-bottom: 0; // prevent bottom margin from screwing up alignment in stacked forms *margin-left: 0; vertical-align: top; .border-radius(0 @inputBorderRadius @inputBorderRadius 0); // Make input on top when focused so blue border and shadow always show &:focus { z-index: 2; } } .add-on { display: inline-block; width: auto; height: @baseLineHeight; min-width: 16px; padding: 4px 5px; font-size: @baseFontSize; font-weight: normal; line-height: @baseLineHeight; text-align: center; text-shadow: 0 1px 0 @white; background-color: @grayLighter; border: 1px solid #ccc; } .add-on, .btn, .btn-group > .dropdown-toggle { vertical-align: top; .border-radius(0); } .active { background-color: lighten(@green, 30); border-color: @green; } } .input-prepend { .add-on, .btn { margin-right: -1px; } .add-on:first-child, .btn:first-child { // FYI, `.btn:first-child` accounts for a button group that's prepended .border-radius(@inputBorderRadius 0 0 @inputBorderRadius); } } .input-append { input, select, .uneditable-input { .border-radius(@inputBorderRadius 0 0 @inputBorderRadius); + .btn-group .btn:last-child { .border-radius(0 @inputBorderRadius @inputBorderRadius 0); } } .add-on, .btn, .btn-group { margin-left: -1px; } .add-on:last-child, .btn:last-child, .btn-group:last-child > .dropdown-toggle { .border-radius(0 @inputBorderRadius @inputBorderRadius 0); } } // Remove all border-radius for inputs with both prepend and append .input-prepend.input-append { input, select, .uneditable-input { .border-radius(0); + .btn-group .btn { .border-radius(0 @inputBorderRadius @inputBorderRadius 0); } } .add-on:first-child, .btn:first-child { margin-right: -1px; .border-radius(@inputBorderRadius 0 0 @inputBorderRadius); } .add-on:last-child, .btn:last-child { margin-left: -1px; .border-radius(0 @inputBorderRadius @inputBorderRadius 0); } .btn-group:first-child { margin-left: 0; } } // SEARCH FORM // ----------- input.search-query { padding-right: 14px; padding-right: 4px \9; padding-left: 14px; padding-left: 4px \9; /* IE7-8 doesn't have border-radius, so don't indent the padding */ margin-bottom: 0; // Remove the default margin on all inputs .border-radius(15px); } /* Allow for input prepend/append in search forms */ .form-search .input-append .search-query, .form-search .input-prepend .search-query { .border-radius(0); // Override due to specificity } .form-search .input-append .search-query { .border-radius(14px 0 0 14px); } .form-search .input-append .btn { .border-radius(0 14px 14px 0); } .form-search .input-prepend .search-query { .border-radius(0 14px 14px 0); } .form-search .input-prepend .btn { .border-radius(14px 0 0 14px); } // HORIZONTAL & VERTICAL FORMS // --------------------------- // Common properties // ----------------- .form-search, .form-inline, .form-horizontal { input, textarea, select, .help-inline, .uneditable-input, .input-prepend, .input-append { display: inline-block; .ie7-inline-block(); margin-bottom: 0; vertical-align: middle; } // Re-hide hidden elements due to specifity .hide { display: none; } } .form-search label, .form-inline label, .form-search .btn-group, .form-inline .btn-group { display: inline-block; } // Remove margin for input-prepend/-append .form-search .input-append, .form-inline .input-append, .form-search .input-prepend, .form-inline .input-prepend { margin-bottom: 0; } // Inline checkbox/radio labels (remove padding on left) .form-search .radio, .form-search .checkbox, .form-inline .radio, .form-inline .checkbox { padding-left: 0; margin-bottom: 0; vertical-align: middle; } // Remove float and margin, set to inline-block .form-search .radio input[type="radio"], .form-search .checkbox input[type="checkbox"], .form-inline .radio input[type="radio"], .form-inline .checkbox input[type="checkbox"] { float: left; margin-right: 3px; margin-left: 0; } // Margin to space out fieldsets .control-group { margin-bottom: @baseLineHeight / 2; } // Legend collapses margin, so next element is responsible for spacing legend + .control-group { margin-top: @baseLineHeight; -webkit-margin-top-collapse: separate; } // Horizontal-specific styles // -------------------------- .form-horizontal { // Increase spacing between groups .control-group { margin-bottom: @baseLineHeight; .clearfix(); } // Float the labels left .control-label { float: left; width: @horizontalComponentOffset - 20; padding-top: 5px; text-align: right; } // Move over all input controls and content .controls { // Super jank IE7 fix to ensure the inputs in .input-append and input-prepend // don't inherit the margin of the parent, in this case .controls *display: inline-block; *padding-left: 20px; margin-left: @horizontalComponentOffset; *margin-left: 0; &:first-child { *padding-left: @horizontalComponentOffset; } } // Remove bottom margin on block level help text since that's accounted for on .control-group .help-block { margin-bottom: 0; } // And apply it only to .help-block instances that follow a form control input, select, textarea, .uneditable-input, .input-prepend, .input-append { + .help-block { margin-top: @baseLineHeight / 2; } } // Move over buttons in .form-actions to align with .controls .form-actions { padding-left: @horizontalComponentOffset; } } apache-couchdb-1.6.0/src/fauxton/assets/less/bootstrap/breadcrumbs.less0000644000175000001440000000065712332105522026247 0ustar00djcusers00000000000000// // Breadcrumbs // -------------------------------------------------- .breadcrumb { padding: 8px 15px; margin: 0 0 @baseLineHeight; list-style: none; background-color: #f5f5f5; .border-radius(@baseBorderRadius); > li { display: inline-block; .ie7-inline-block(); text-shadow: 0 1px 0 @white; > .divider { padding: 0 5px; color: #ccc; } } > .active { color: @grayLight; } } apache-couchdb-1.6.0/src/fauxton/assets/less/bootstrap/responsive-767px-max.less0000644000175000001440000000752012332105522027623 0ustar00djcusers00000000000000// // Responsive: Landscape phone to desktop/tablet // -------------------------------------------------- @media (max-width: 767px) { // Padding to set content in a bit body { padding-left: 20px; padding-right: 20px; } // Negative indent the now static "fixed" navbar .navbar-fixed-top, .navbar-fixed-bottom, .navbar-static-top { margin-left: -20px; margin-right: -20px; } // Remove padding on container given explicit padding set on body .container-fluid { padding: 0; } // TYPOGRAPHY // ---------- // Reset horizontal dl .dl-horizontal { dt { float: none; clear: none; width: auto; text-align: left; } dd { margin-left: 0; } } // GRID & CONTAINERS // ----------------- // Remove width from containers .container { width: auto; } // Fluid rows .row-fluid { width: 100%; } // Undo negative margin on rows and thumbnails .row, .thumbnails { margin-left: 0; } .thumbnails > li { float: none; margin-left: 0; // Reset the default margin for all li elements when no .span* classes are present } // Make all grid-sized elements block level again [class*="span"], .uneditable-input[class*="span"], // Makes uneditable inputs full-width when using grid sizing .row-fluid [class*="span"] { float: none; display: block; width: 100%; margin-left: 0; .box-sizing(border-box); } .span12, .row-fluid .span12 { width: 100%; .box-sizing(border-box); } .row-fluid [class*="offset"]:first-child { margin-left: 0; } // FORM FIELDS // ----------- // Make span* classes full width .input-large, .input-xlarge, .input-xxlarge, input[class*="span"], select[class*="span"], textarea[class*="span"], .uneditable-input { .input-block-level(); } // But don't let it screw up prepend/append inputs .input-prepend input, .input-append input, .input-prepend input[class*="span"], .input-append input[class*="span"] { display: inline-block; // redeclare so they don't wrap to new lines width: auto; } .controls-row [class*="span"] + [class*="span"] { margin-left: 0; } // Modals .modal { position: fixed; top: 20px; left: 20px; right: 20px; width: auto; margin: 0; &.fade { top: -100px; } &.fade.in { top: 20px; } } } // UP TO LANDSCAPE PHONE // --------------------- @media (max-width: 480px) { // Smooth out the collapsing/expanding nav .nav-collapse { -webkit-transform: translate3d(0, 0, 0); // activate the GPU } // Block level the page header small tag for readability .page-header h1 small { display: block; line-height: @baseLineHeight; } // Update checkboxes for iOS input[type="checkbox"], input[type="radio"] { border: 1px solid #ccc; } // Remove the horizontal form styles .form-horizontal { .control-label { float: none; width: auto; padding-top: 0; text-align: left; } // Move over all input controls and content .controls { margin-left: 0; } // Move the options list down to align with labels .control-list { padding-top: 0; // has to be padding because margin collaspes } // Move over buttons in .form-actions to align with .controls .form-actions { padding-left: 10px; padding-right: 10px; } } // Medias // Reset float and spacing to stack .media .pull-left, .media .pull-right { float: none; display: block; margin-bottom: 10px; } // Remove side margins since we stack instead of indent .media-object { margin-right: 0; margin-left: 0; } // Modals .modal { top: 10px; left: 10px; right: 10px; } .modal-header .close { padding: 10px; margin: -10px; } // Carousel .carousel-caption { position: static; } } apache-couchdb-1.6.0/src/fauxton/assets/less/bootstrap/thumbnails.less0000644000175000001440000000225012332105522026113 0ustar00djcusers00000000000000// // Thumbnails // -------------------------------------------------- // Note: `.thumbnails` and `.thumbnails > li` are overriden in responsive files // Make wrapper ul behave like the grid .thumbnails { margin-left: -@gridGutterWidth; list-style: none; .clearfix(); } // Fluid rows have no left margin .row-fluid .thumbnails { margin-left: 0; } // Float li to make thumbnails appear in a row .thumbnails > li { float: left; // Explicity set the float since we don't require .span* classes margin-bottom: @baseLineHeight; margin-left: @gridGutterWidth; } // The actual thumbnail (can be `a` or `div`) .thumbnail { display: block; padding: 4px; line-height: @baseLineHeight; border: 1px solid #ddd; .border-radius(@baseBorderRadius); .box-shadow(0 1px 3px rgba(0,0,0,.055)); .transition(all .2s ease-in-out); } // Add a hover/focus state for linked versions only a.thumbnail:hover, a.thumbnail:focus { border-color: @linkColor; .box-shadow(0 1px 4px rgba(0,105,214,.25)); } // Images and captions .thumbnail > img { display: block; max-width: 100%; margin-left: auto; margin-right: auto; } .thumbnail .caption { padding: 9px; color: @gray; } apache-couchdb-1.6.0/src/fauxton/assets/less/bootstrap/component-animations.less0000644000175000001440000000046212332105522030112 0ustar00djcusers00000000000000// // Component animations // -------------------------------------------------- .fade { opacity: 0; .transition(opacity .15s linear); &.in { opacity: 1; } } .collapse { position: relative; height: 0; overflow: hidden; .transition(height .35s ease); &.in { height: auto; } } apache-couchdb-1.6.0/src/fauxton/assets/less/bootstrap/tables.less0000644000175000001440000001415712332105522025230 0ustar00djcusers00000000000000// // Tables // -------------------------------------------------- // BASE TABLES // ----------------- table { max-width: 100%; background-color: @tableBackground; border-collapse: collapse; border-spacing: 0; } // BASELINE STYLES // --------------- .table { width: 100%; margin-bottom: @baseLineHeight; // Cells th, td { padding: 8px; line-height: @baseLineHeight; text-align: left; vertical-align: top; border-top: 1px solid @tableBorder; } th { font-weight: bold; } // Bottom align for column headings thead th { vertical-align: bottom; } // Remove top border from thead by default caption + thead tr:first-child th, caption + thead tr:first-child td, colgroup + thead tr:first-child th, colgroup + thead tr:first-child td, thead:first-child tr:first-child th, thead:first-child tr:first-child td { border-top: 0; } // Account for multiple tbody instances tbody + tbody { border-top: 2px solid @tableBorder; } // Nesting .table { background-color: @bodyBackground; } } // CONDENSED TABLE W/ HALF PADDING // ------------------------------- .table-condensed { th, td { padding: 4px 5px; } } // BORDERED VERSION // ---------------- .table-bordered { border: 1px solid @tableBorder; border-collapse: separate; // Done so we can round those corners! *border-collapse: collapse; // IE7 can't round corners anyway border-left: 0; .border-radius(@baseBorderRadius); th, td { border-left: 1px solid @tableBorder; } // Prevent a double border caption + thead tr:first-child th, caption + tbody tr:first-child th, caption + tbody tr:first-child td, colgroup + thead tr:first-child th, colgroup + tbody tr:first-child th, colgroup + tbody tr:first-child td, thead:first-child tr:first-child th, tbody:first-child tr:first-child th, tbody:first-child tr:first-child td { border-top: 0; } // For first th/td in the first row in the first thead or tbody thead:first-child tr:first-child > th:first-child, tbody:first-child tr:first-child > td:first-child, tbody:first-child tr:first-child > th:first-child { .border-top-left-radius(@baseBorderRadius); } // For last th/td in the first row in the first thead or tbody thead:first-child tr:first-child > th:last-child, tbody:first-child tr:first-child > td:last-child, tbody:first-child tr:first-child > th:last-child { .border-top-right-radius(@baseBorderRadius); } // For first th/td (can be either) in the last row in the last thead, tbody, and tfoot thead:last-child tr:last-child > th:first-child, tbody:last-child tr:last-child > td:first-child, tbody:last-child tr:last-child > th:first-child, tfoot:last-child tr:last-child > td:first-child, tfoot:last-child tr:last-child > th:first-child { .border-bottom-left-radius(@baseBorderRadius); } // For last th/td (can be either) in the last row in the last thead, tbody, and tfoot thead:last-child tr:last-child > th:last-child, tbody:last-child tr:last-child > td:last-child, tbody:last-child tr:last-child > th:last-child, tfoot:last-child tr:last-child > td:last-child, tfoot:last-child tr:last-child > th:last-child { .border-bottom-right-radius(@baseBorderRadius); } // Clear border-radius for first and last td in the last row in the last tbody for table with tfoot tfoot + tbody:last-child tr:last-child td:first-child { .border-bottom-left-radius(0); } tfoot + tbody:last-child tr:last-child td:last-child { .border-bottom-right-radius(0); } // Special fixes to round the left border on the first td/th caption + thead tr:first-child th:first-child, caption + tbody tr:first-child td:first-child, colgroup + thead tr:first-child th:first-child, colgroup + tbody tr:first-child td:first-child { .border-top-left-radius(@baseBorderRadius); } caption + thead tr:first-child th:last-child, caption + tbody tr:first-child td:last-child, colgroup + thead tr:first-child th:last-child, colgroup + tbody tr:first-child td:last-child { .border-top-right-radius(@baseBorderRadius); } } // ZEBRA-STRIPING // -------------- // Default zebra-stripe styles (alternating gray and transparent backgrounds) .table-striped { tbody { > tr:nth-child(odd) > td, > tr:nth-child(odd) > th { background-color: @tableBackgroundAccent; } } } // HOVER EFFECT // ------------ // Placed here since it has to come after the potential zebra striping .table-hover { tbody { tr:hover > td, tr:hover > th { background-color: @tableBackgroundHover; } } } // TABLE CELL SIZING // ----------------- // Reset default grid behavior table td[class*="span"], table th[class*="span"], .row-fluid table td[class*="span"], .row-fluid table th[class*="span"] { display: table-cell; float: none; // undo default grid column styles margin-left: 0; // undo default grid column styles } // Change the column widths to account for td/th padding .table td, .table th { &.span1 { .tableColumns(1); } &.span2 { .tableColumns(2); } &.span3 { .tableColumns(3); } &.span4 { .tableColumns(4); } &.span5 { .tableColumns(5); } &.span6 { .tableColumns(6); } &.span7 { .tableColumns(7); } &.span8 { .tableColumns(8); } &.span9 { .tableColumns(9); } &.span10 { .tableColumns(10); } &.span11 { .tableColumns(11); } &.span12 { .tableColumns(12); } } // TABLE BACKGROUNDS // ----------------- // Exact selectors below required to override .table-striped .table tbody tr { &.success > td { background-color: @successBackground; } &.error > td { background-color: @errorBackground; } &.warning > td { background-color: @warningBackground; } &.info > td { background-color: @infoBackground; } } // Hover states for .table-hover .table-hover tbody tr { &.success:hover > td { background-color: darken(@successBackground, 5%); } &.error:hover > td { background-color: darken(@errorBackground, 5%); } &.warning:hover > td { background-color: darken(@warningBackground, 5%); } &.info:hover > td { background-color: darken(@infoBackground, 5%); } } apache-couchdb-1.6.0/src/fauxton/assets/less/bootstrap/dropdowns.less0000644000175000001440000001307712332105522025775 0ustar00djcusers00000000000000// // Dropdown menus // -------------------------------------------------- // Use the .menu class on any
  • element within the topbar or ul.tabs and you'll get some superfancy dropdowns .dropup, .dropdown { position: relative; } .dropdown-toggle { // The caret makes the toggle a bit too tall in IE7 *margin-bottom: -3px; } .dropdown-toggle:active, .open .dropdown-toggle { outline: 0; } // Dropdown arrow/caret // -------------------- .caret { display: inline-block; width: 0; height: 0; vertical-align: top; border-top: 4px solid @black; border-right: 4px solid transparent; border-left: 4px solid transparent; content: ""; } // Place the caret .dropdown .caret { margin-top: 8px; margin-left: 2px; } // The dropdown menu (ul) // ---------------------- .dropdown-menu { position: absolute; top: 100%; left: 0; z-index: @zindexDropdown; display: none; // none by default, but block on "open" of the menu float: left; min-width: 160px; padding: 5px 0; margin: 2px 0 0; // override default ul list-style: none; background-color: @dropdownBackground; border: 1px solid #ccc; // Fallback for IE7-8 border: 1px solid @dropdownBorder; *border-right-width: 2px; *border-bottom-width: 2px; .border-radius(6px); .box-shadow(0 5px 10px rgba(0,0,0,.2)); -webkit-background-clip: padding-box; -moz-background-clip: padding; background-clip: padding-box; // Aligns the dropdown menu to right &.pull-right { right: 0; left: auto; } // Dividers (basically an hr) within the dropdown .divider { .nav-divider(@dropdownDividerTop, @dropdownDividerBottom); } // Links within the dropdown menu > li > a { display: block; padding: 3px 20px; clear: both; font-weight: normal; line-height: @baseLineHeight; color: @dropdownLinkColor; white-space: nowrap; } } // Hover/Focus state // ----------- .dropdown-menu > li > a:hover, .dropdown-menu > li > a:focus, .dropdown-submenu:hover > a, .dropdown-submenu:focus > a { text-decoration: none; color: @dropdownLinkColorHover; #gradient > .vertical(@dropdownLinkBackgroundHover, darken(@dropdownLinkBackgroundHover, 5%)); } // Active state // ------------ .dropdown-menu > .active > a, .dropdown-menu > .active > a:hover, .dropdown-menu > .active > a:focus { color: @dropdownLinkColorActive; text-decoration: none; outline: 0; #gradient > .vertical(@dropdownLinkBackgroundActive, darken(@dropdownLinkBackgroundActive, 5%)); } // Disabled state // -------------- // Gray out text and ensure the hover/focus state remains gray .dropdown-menu > .disabled > a, .dropdown-menu > .disabled > a:hover, .dropdown-menu > .disabled > a:focus { color: @grayLight; } // Nuke hover/focus effects .dropdown-menu > .disabled > a:hover, .dropdown-menu > .disabled > a:focus { text-decoration: none; background-color: transparent; background-image: none; // Remove CSS gradient .reset-filter(); cursor: default; } // Open state for the dropdown // --------------------------- .open { // IE7's z-index only goes to the nearest positioned ancestor, which would // make the menu appear below buttons that appeared later on the page *z-index: @zindexDropdown; & > .dropdown-menu { display: block; } } // Backdrop to catch body clicks on mobile, etc. // --------------------------- .dropdown-backdrop { position: fixed; left: 0; right: 0; bottom: 0; top: 0; z-index: @zindexDropdown - 10; } // Right aligned dropdowns // --------------------------- .pull-right > .dropdown-menu { right: 0; left: auto; } // Allow for dropdowns to go bottom up (aka, dropup-menu) // ------------------------------------------------------ // Just add .dropup after the standard .dropdown class and you're set, bro. // TODO: abstract this so that the navbar fixed styles are not placed here? .dropup, .navbar-fixed-bottom .dropdown { // Reverse the caret .caret { border-top: 0; border-bottom: 4px solid @black; content: ""; } // Different positioning for bottom up menu .dropdown-menu { top: auto; bottom: 100%; margin-bottom: 1px; } } // Sub menus // --------------------------- .dropdown-submenu { position: relative; } // Default dropdowns .dropdown-submenu > .dropdown-menu { top: 0; left: 100%; margin-top: -6px; margin-left: -1px; .border-radius(0 6px 6px 6px); } .dropdown-submenu:hover > .dropdown-menu { display: block; } // Dropups .dropup .dropdown-submenu > .dropdown-menu { top: auto; bottom: 0; margin-top: 0; margin-bottom: -2px; .border-radius(5px 5px 5px 0); } // Caret to indicate there is a submenu .dropdown-submenu > a:after { display: block; content: " "; float: right; width: 0; height: 0; border-color: transparent; border-style: solid; border-width: 5px 0 5px 5px; border-left-color: darken(@dropdownBackground, 20%); margin-top: 5px; margin-right: -10px; } .dropdown-submenu:hover > a:after { border-left-color: @dropdownLinkColorHover; } // Left aligned submenus .dropdown-submenu.pull-left { // Undo the float // Yes, this is awkward since .pull-left adds a float, but it sticks to our conventions elsewhere. float: none; // Positioning the submenu > .dropdown-menu { left: -100%; margin-left: 10px; .border-radius(6px 0 6px 6px); } } // Tweak nav headers // ----------------- // Increase padding from 15px to 20px on sides .dropdown .dropdown-menu .nav-header { padding-left: 20px; padding-right: 20px; } // Typeahead // --------- .typeahead { z-index: 1051; margin-top: 2px; // give it some space to breathe .border-radius(@baseBorderRadius); } apache-couchdb-1.6.0/src/fauxton/assets/less/bootstrap/modals.less0000644000175000001440000000367212332105522025235 0ustar00djcusers00000000000000// // Modals // -------------------------------------------------- // Background .modal-backdrop { position: fixed; top: 0; right: 0; bottom: 0; left: 0; z-index: @zindexModalBackdrop; background-color: @black; // Fade for backdrop &.fade { opacity: 0; } } .modal-backdrop, .modal-backdrop.fade.in { .opacity(80); } // Base modal .modal { position: fixed; top: 10%; left: 50%; z-index: @zindexModal; width: 560px; margin-left: -280px; background-color: @white; border: 1px solid #999; border: 1px solid rgba(0,0,0,.3); *border: 1px solid #999; /* IE6-7 */ .border-radius(6px); .box-shadow(0 3px 7px rgba(0,0,0,0.3)); .background-clip(padding-box); // Remove focus outline from opened modal outline: none; &.fade { .transition(e('opacity .3s linear, top .3s ease-out')); top: -25%; } &.fade.in { top: 10%; } } .modal-header { padding: 9px 15px; border-bottom: 1px solid #eee; // Close icon .close { margin-top: 2px; } // Heading h3 { margin: 0; line-height: 30px; } } // Body (where all modal content resides) .modal-body { position: relative; overflow-y: auto; max-height: 600px; padding: 15px; } // Remove bottom margin if need be .modal-form { margin-bottom: 0; } // Footer (for actions) .modal-footer { padding: 14px 15px 15px; margin-bottom: 0; text-align: right; // right align buttons background-color: #f5f5f5; border-top: 1px solid #ddd; .border-radius(0 0 6px 6px); .box-shadow(inset 0 1px 0 @white); .clearfix(); // clear it in case folks use .pull-* classes on buttons // Properly space out buttons .btn + .btn { margin-left: 5px; margin-bottom: 0; // account for input[type="submit"] which gets the bottom margin like all other inputs } // but override that for button groups .btn-group .btn + .btn { margin-left: -1px; } // and override it for block buttons as well .btn-block + .btn-block { margin-left: 0; } } apache-couchdb-1.6.0/src/fauxton/assets/less/bootstrap/button-groups.less0000644000175000001440000001311512332105522026577 0ustar00djcusers00000000000000// // Button groups // -------------------------------------------------- // Make the div behave like a button .btn-group { position: relative; display: inline-block; .ie7-inline-block(); font-size: 0; // remove as part 1 of font-size inline-block hack vertical-align: middle; // match .btn alignment given font-size hack above white-space: nowrap; // prevent buttons from wrapping when in tight spaces (e.g., the table on the tests page) .ie7-restore-left-whitespace(); } // Space out series of button groups .btn-group + .btn-group { margin-left: 5px; } // Optional: Group multiple button groups together for a toolbar .btn-toolbar { font-size: 0; // Hack to remove whitespace that results from using inline-block margin-top: @baseLineHeight / 2; margin-bottom: @baseLineHeight / 2; > .btn + .btn, > .btn-group + .btn, > .btn + .btn-group { margin-left: 5px; } } // Float them, remove border radius, then re-add to first and last elements .btn-group > .btn { position: relative; .border-radius(0); } .btn-group > .btn + .btn { margin-left: -1px; } .btn-group > .btn, .btn-group > .dropdown-menu, .btn-group > .popover { font-size: @baseFontSize; // redeclare as part 2 of font-size inline-block hack } // Reset fonts for other sizes .btn-group > .btn-mini { font-size: @fontSizeMini; } .btn-group > .btn-small { font-size: @fontSizeSmall; } .btn-group > .btn-large { font-size: @fontSizeLarge; } // Set corners individual because sometimes a single button can be in a .btn-group and we need :first-child and :last-child to both match .btn-group > .btn:first-child { margin-left: 0; .border-top-left-radius(@baseBorderRadius); .border-bottom-left-radius(@baseBorderRadius); } // Need .dropdown-toggle since :last-child doesn't apply given a .dropdown-menu immediately after it .btn-group > .btn:last-child, .btn-group > .dropdown-toggle { .border-top-right-radius(@baseBorderRadius); .border-bottom-right-radius(@baseBorderRadius); } // Reset corners for large buttons .btn-group > .btn.large:first-child { margin-left: 0; .border-top-left-radius(@borderRadiusLarge); .border-bottom-left-radius(@borderRadiusLarge); } .btn-group > .btn.large:last-child, .btn-group > .large.dropdown-toggle { .border-top-right-radius(@borderRadiusLarge); .border-bottom-right-radius(@borderRadiusLarge); } // On hover/focus/active, bring the proper btn to front .btn-group > .btn:hover, .btn-group > .btn:focus, .btn-group > .btn:active, .btn-group > .btn.active { z-index: 2; } // On active and open, don't show outline .btn-group .dropdown-toggle:active, .btn-group.open .dropdown-toggle { outline: 0; } // Split button dropdowns // ---------------------- // Give the line between buttons some depth .btn-group > .btn + .dropdown-toggle { padding-left: 8px; padding-right: 8px; .box-shadow(~"inset 1px 0 0 rgba(255,255,255,.125), inset 0 1px 0 rgba(255,255,255,.2), 0 1px 2px rgba(0,0,0,.05)"); *padding-top: 5px; *padding-bottom: 5px; } .btn-group > .btn-mini + .dropdown-toggle { padding-left: 5px; padding-right: 5px; *padding-top: 2px; *padding-bottom: 2px; } .btn-group > .btn-small + .dropdown-toggle { *padding-top: 5px; *padding-bottom: 4px; } .btn-group > .btn-large + .dropdown-toggle { padding-left: 12px; padding-right: 12px; *padding-top: 7px; *padding-bottom: 7px; } .btn-group.open { // The clickable button for toggling the menu // Remove the gradient and set the same inset shadow as the :active state .dropdown-toggle { background-image: none; .box-shadow(~"inset 0 2px 4px rgba(0,0,0,.15), 0 1px 2px rgba(0,0,0,.05)"); } // Keep the hover's background when dropdown is open .btn.dropdown-toggle { background-color: @btnBackgroundHighlight; } .btn-primary.dropdown-toggle { background-color: @btnPrimaryBackgroundHighlight; } .btn-warning.dropdown-toggle { background-color: @btnWarningBackgroundHighlight; } .btn-danger.dropdown-toggle { background-color: @btnDangerBackgroundHighlight; } .btn-success.dropdown-toggle { background-color: @btnSuccessBackgroundHighlight; } .btn-info.dropdown-toggle { background-color: @btnInfoBackgroundHighlight; } .btn-inverse.dropdown-toggle { background-color: @btnInverseBackgroundHighlight; } } // Reposition the caret .btn .caret { margin-top: 8px; margin-left: 0; } // Carets in other button sizes .btn-large .caret { margin-top: 6px; } .btn-large .caret { border-left-width: 5px; border-right-width: 5px; border-top-width: 5px; } .btn-mini .caret, .btn-small .caret { margin-top: 8px; } // Upside down carets for .dropup .dropup .btn-large .caret { border-bottom-width: 5px; } // Account for other colors .btn-primary, .btn-warning, .btn-danger, .btn-info, .btn-success, .btn-inverse { .caret { border-top-color: @white; border-bottom-color: @white; } } // Vertical button groups // ---------------------- .btn-group-vertical { display: inline-block; // makes buttons only take up the width they need .ie7-inline-block(); } .btn-group-vertical > .btn { display: block; float: none; max-width: 100%; .border-radius(0); } .btn-group-vertical > .btn + .btn { margin-left: 0; margin-top: -1px; } .btn-group-vertical > .btn:first-child { .border-radius(@baseBorderRadius @baseBorderRadius 0 0); } .btn-group-vertical > .btn:last-child { .border-radius(0 0 @baseBorderRadius @baseBorderRadius); } .btn-group-vertical > .btn-large:first-child { .border-radius(@borderRadiusLarge @borderRadiusLarge 0 0); } .btn-group-vertical > .btn-large:last-child { .border-radius(0 0 @borderRadiusLarge @borderRadiusLarge); } apache-couchdb-1.6.0/src/fauxton/assets/less/bootstrap/mixins.less0000644000175000001440000005634412332105522025271 0ustar00djcusers00000000000000// // Mixins // -------------------------------------------------- // UTILITY MIXINS // -------------------------------------------------- // Clearfix // -------- // For clearing floats like a boss h5bp.com/q .clearfix { *zoom: 1; &:before, &:after { display: table; content: ""; // Fixes Opera/contenteditable bug: // http://nicolasgallagher.com/micro-clearfix-hack/#comment-36952 line-height: 0; } &:after { clear: both; } } // Webkit-style focus // ------------------ .tab-focus() { // Default outline: thin dotted #333; // Webkit outline: 5px auto -webkit-focus-ring-color; outline-offset: -2px; } // Center-align a block level element // ---------------------------------- .center-block() { display: block; margin-left: auto; margin-right: auto; } // IE7 inline-block // ---------------- .ie7-inline-block() { *display: inline; /* IE7 inline-block hack */ *zoom: 1; } // IE7 likes to collapse whitespace on either side of the inline-block elements. // Ems because we're attempting to match the width of a space character. Left // version is for form buttons, which typically come after other elements, and // right version is for icons, which come before. Applying both is ok, but it will // mean that space between those elements will be .6em (~2 space characters) in IE7, // instead of the 1 space in other browsers. .ie7-restore-left-whitespace() { *margin-left: .3em; &:first-child { *margin-left: 0; } } .ie7-restore-right-whitespace() { *margin-right: .3em; } // Sizing shortcuts // ------------------------- .size(@height, @width) { width: @width; height: @height; } .square(@size) { .size(@size, @size); } // Placeholder text // ------------------------- .placeholder(@color: @placeholderText) { &:-moz-placeholder { color: @color; } &:-ms-input-placeholder { color: @color; } &::-webkit-input-placeholder { color: @color; } } // Text overflow // ------------------------- // Requires inline-block or block for proper styling .text-overflow() { overflow: hidden; text-overflow: ellipsis; white-space: nowrap; } // CSS image replacement // ------------------------- // Source: https://github.com/h5bp/html5-boilerplate/commit/aa0396eae757 .hide-text { font: 0/0 a; color: transparent; text-shadow: none; background-color: transparent; border: 0; } // FONTS // -------------------------------------------------- #font { #family { .serif() { font-family: @serifFontFamily; } .sans-serif() { font-family: @sansFontFamily; } .monospace() { font-family: @monoFontFamily; } } .shorthand(@size: @baseFontSize, @weight: normal, @lineHeight: @baseLineHeight) { font-size: @size; font-weight: @weight; line-height: @lineHeight; } .serif(@size: @baseFontSize, @weight: normal, @lineHeight: @baseLineHeight) { #font > #family > .serif; #font > .shorthand(@size, @weight, @lineHeight); } .sans-serif(@size: @baseFontSize, @weight: normal, @lineHeight: @baseLineHeight) { #font > #family > .sans-serif; #font > .shorthand(@size, @weight, @lineHeight); } .monospace(@size: @baseFontSize, @weight: normal, @lineHeight: @baseLineHeight) { #font > #family > .monospace; #font > .shorthand(@size, @weight, @lineHeight); } } // FORMS // -------------------------------------------------- // Block level inputs .input-block-level { display: block; width: 100%; min-height: @inputHeight; // Make inputs at least the height of their button counterpart (base line-height + padding + border) .box-sizing(border-box); // Makes inputs behave like true block-level elements } // Mixin for form field states .formFieldState(@textColor: #555, @borderColor: #ccc, @backgroundColor: #f5f5f5) { // Set the text color .control-label, .help-block, .help-inline { color: @textColor; } // Style inputs accordingly .checkbox, .radio, input, select, textarea { color: @textColor; } input, select, textarea { border-color: @borderColor; .box-shadow(inset 0 1px 1px rgba(0,0,0,.075)); // Redeclare so transitions work &:focus { border-color: darken(@borderColor, 10%); @shadow: inset 0 1px 1px rgba(0,0,0,.075), 0 0 6px lighten(@borderColor, 20%); .box-shadow(@shadow); } } // Give a small background color for input-prepend/-append .input-prepend .add-on, .input-append .add-on { color: @textColor; background-color: @backgroundColor; border-color: @textColor; } } // CSS3 PROPERTIES // -------------------------------------------------- // Border Radius .border-radius(@radius) { -webkit-border-radius: @radius; -moz-border-radius: @radius; border-radius: @radius; } // Single Corner Border Radius .border-top-left-radius(@radius) { -webkit-border-top-left-radius: @radius; -moz-border-radius-topleft: @radius; border-top-left-radius: @radius; } .border-top-right-radius(@radius) { -webkit-border-top-right-radius: @radius; -moz-border-radius-topright: @radius; border-top-right-radius: @radius; } .border-bottom-right-radius(@radius) { -webkit-border-bottom-right-radius: @radius; -moz-border-radius-bottomright: @radius; border-bottom-right-radius: @radius; } .border-bottom-left-radius(@radius) { -webkit-border-bottom-left-radius: @radius; -moz-border-radius-bottomleft: @radius; border-bottom-left-radius: @radius; } // Single Side Border Radius .border-top-radius(@radius) { .border-top-right-radius(@radius); .border-top-left-radius(@radius); } .border-right-radius(@radius) { .border-top-right-radius(@radius); .border-bottom-right-radius(@radius); } .border-bottom-radius(@radius) { .border-bottom-right-radius(@radius); .border-bottom-left-radius(@radius); } .border-left-radius(@radius) { .border-top-left-radius(@radius); .border-bottom-left-radius(@radius); } // Drop shadows .box-shadow(@shadow) { -webkit-box-shadow: @shadow; -moz-box-shadow: @shadow; box-shadow: @shadow; } // Transitions .transition(@transition) { -webkit-transition: @transition; -moz-transition: @transition; -o-transition: @transition; transition: @transition; } .transition-delay(@transition-delay) { -webkit-transition-delay: @transition-delay; -moz-transition-delay: @transition-delay; -o-transition-delay: @transition-delay; transition-delay: @transition-delay; } .transition-duration(@transition-duration) { -webkit-transition-duration: @transition-duration; -moz-transition-duration: @transition-duration; -o-transition-duration: @transition-duration; transition-duration: @transition-duration; } // Transformations .rotate(@degrees) { -webkit-transform: rotate(@degrees); -moz-transform: rotate(@degrees); -ms-transform: rotate(@degrees); -o-transform: rotate(@degrees); transform: rotate(@degrees); } .scale(@ratio) { -webkit-transform: scale(@ratio); -moz-transform: scale(@ratio); -ms-transform: scale(@ratio); -o-transform: scale(@ratio); transform: scale(@ratio); } .translate(@x, @y) { -webkit-transform: translate(@x, @y); -moz-transform: translate(@x, @y); -ms-transform: translate(@x, @y); -o-transform: translate(@x, @y); transform: translate(@x, @y); } .skew(@x, @y) { -webkit-transform: skew(@x, @y); -moz-transform: skew(@x, @y); -ms-transform: skewX(@x) skewY(@y); // See https://github.com/twitter/bootstrap/issues/4885 -o-transform: skew(@x, @y); transform: skew(@x, @y); -webkit-backface-visibility: hidden; // See https://github.com/twitter/bootstrap/issues/5319 } .translate3d(@x, @y, @z) { -webkit-transform: translate3d(@x, @y, @z); -moz-transform: translate3d(@x, @y, @z); -o-transform: translate3d(@x, @y, @z); transform: translate3d(@x, @y, @z); } // Backface visibility // Prevent browsers from flickering when using CSS 3D transforms. // Default value is `visible`, but can be changed to `hidden // See git pull https://github.com/dannykeane/bootstrap.git backface-visibility for examples .backface-visibility(@visibility){ -webkit-backface-visibility: @visibility; -moz-backface-visibility: @visibility; backface-visibility: @visibility; } // Background clipping // Heads up: FF 3.6 and under need "padding" instead of "padding-box" .background-clip(@clip) { -webkit-background-clip: @clip; -moz-background-clip: @clip; background-clip: @clip; } // Background sizing .background-size(@size) { -webkit-background-size: @size; -moz-background-size: @size; -o-background-size: @size; background-size: @size; } // Box sizing .box-sizing(@boxmodel) { -webkit-box-sizing: @boxmodel; -moz-box-sizing: @boxmodel; box-sizing: @boxmodel; } // User select // For selecting text on the page .user-select(@select) { -webkit-user-select: @select; -moz-user-select: @select; -ms-user-select: @select; -o-user-select: @select; user-select: @select; } // Resize anything .resizable(@direction) { resize: @direction; // Options: horizontal, vertical, both overflow: auto; // Safari fix } // CSS3 Content Columns .content-columns(@columnCount, @columnGap: @gridGutterWidth) { -webkit-column-count: @columnCount; -moz-column-count: @columnCount; column-count: @columnCount; -webkit-column-gap: @columnGap; -moz-column-gap: @columnGap; column-gap: @columnGap; } // Optional hyphenation .hyphens(@mode: auto) { word-wrap: break-word; -webkit-hyphens: @mode; -moz-hyphens: @mode; -ms-hyphens: @mode; -o-hyphens: @mode; hyphens: @mode; } // Opacity .opacity(@opacity) { opacity: @opacity / 100; filter: ~"alpha(opacity=@{opacity})"; } // BACKGROUNDS // -------------------------------------------------- // Add an alphatransparency value to any background or border color (via Elyse Holladay) #translucent { .background(@color: @white, @alpha: 1) { background-color: hsla(hue(@color), saturation(@color), lightness(@color), @alpha); } .border(@color: @white, @alpha: 1) { border-color: hsla(hue(@color), saturation(@color), lightness(@color), @alpha); .background-clip(padding-box); } } // Gradient Bar Colors for buttons and alerts .gradientBar(@primaryColor, @secondaryColor, @textColor: #fff, @textShadow: 0 -1px 0 rgba(0,0,0,.25)) { color: @textColor; text-shadow: @textShadow; #gradient > .vertical(@primaryColor, @secondaryColor); border-color: @secondaryColor @secondaryColor darken(@secondaryColor, 15%); border-color: rgba(0,0,0,.1) rgba(0,0,0,.1) fadein(rgba(0,0,0,.1), 15%); } // Gradients #gradient { .horizontal(@startColor: #555, @endColor: #333) { background-color: @endColor; background-image: -moz-linear-gradient(left, @startColor, @endColor); // FF 3.6+ background-image: -webkit-gradient(linear, 0 0, 100% 0, from(@startColor), to(@endColor)); // Safari 4+, Chrome 2+ background-image: -webkit-linear-gradient(left, @startColor, @endColor); // Safari 5.1+, Chrome 10+ background-image: -o-linear-gradient(left, @startColor, @endColor); // Opera 11.10 background-image: linear-gradient(to right, @startColor, @endColor); // Standard, IE10 background-repeat: repeat-x; filter: e(%("progid:DXImageTransform.Microsoft.gradient(startColorstr='%d', endColorstr='%d', GradientType=1)",argb(@startColor),argb(@endColor))); // IE9 and down } .vertical(@startColor: #555, @endColor: #333) { background-color: mix(@startColor, @endColor, 60%); background-image: -moz-linear-gradient(top, @startColor, @endColor); // FF 3.6+ background-image: -webkit-gradient(linear, 0 0, 0 100%, from(@startColor), to(@endColor)); // Safari 4+, Chrome 2+ background-image: -webkit-linear-gradient(top, @startColor, @endColor); // Safari 5.1+, Chrome 10+ background-image: -o-linear-gradient(top, @startColor, @endColor); // Opera 11.10 background-image: linear-gradient(to bottom, @startColor, @endColor); // Standard, IE10 background-repeat: repeat-x; filter: e(%("progid:DXImageTransform.Microsoft.gradient(startColorstr='%d', endColorstr='%d', GradientType=0)",argb(@startColor),argb(@endColor))); // IE9 and down } .directional(@startColor: #555, @endColor: #333, @deg: 45deg) { background-color: @endColor; background-repeat: repeat-x; background-image: -moz-linear-gradient(@deg, @startColor, @endColor); // FF 3.6+ background-image: -webkit-linear-gradient(@deg, @startColor, @endColor); // Safari 5.1+, Chrome 10+ background-image: -o-linear-gradient(@deg, @startColor, @endColor); // Opera 11.10 background-image: linear-gradient(@deg, @startColor, @endColor); // Standard, IE10 } .horizontal-three-colors(@startColor: #00b3ee, @midColor: #7a43b6, @colorStop: 50%, @endColor: #c3325f) { background-color: mix(@midColor, @endColor, 80%); background-image: -webkit-gradient(left, linear, 0 0, 0 100%, from(@startColor), color-stop(@colorStop, @midColor), to(@endColor)); background-image: -webkit-linear-gradient(left, @startColor, @midColor @colorStop, @endColor); background-image: -moz-linear-gradient(left, @startColor, @midColor @colorStop, @endColor); background-image: -o-linear-gradient(left, @startColor, @midColor @colorStop, @endColor); background-image: linear-gradient(to right, @startColor, @midColor @colorStop, @endColor); background-repeat: no-repeat; filter: e(%("progid:DXImageTransform.Microsoft.gradient(startColorstr='%d', endColorstr='%d', GradientType=0)",argb(@startColor),argb(@endColor))); // IE9 and down, gets no color-stop at all for proper fallback } .vertical-three-colors(@startColor: #00b3ee, @midColor: #7a43b6, @colorStop: 50%, @endColor: #c3325f) { background-color: mix(@midColor, @endColor, 80%); background-image: -webkit-gradient(linear, 0 0, 0 100%, from(@startColor), color-stop(@colorStop, @midColor), to(@endColor)); background-image: -webkit-linear-gradient(@startColor, @midColor @colorStop, @endColor); background-image: -moz-linear-gradient(top, @startColor, @midColor @colorStop, @endColor); background-image: -o-linear-gradient(@startColor, @midColor @colorStop, @endColor); background-image: linear-gradient(@startColor, @midColor @colorStop, @endColor); background-repeat: no-repeat; filter: e(%("progid:DXImageTransform.Microsoft.gradient(startColorstr='%d', endColorstr='%d', GradientType=0)",argb(@startColor),argb(@endColor))); // IE9 and down, gets no color-stop at all for proper fallback } .radial(@innerColor: #555, @outerColor: #333) { background-color: @outerColor; background-image: -webkit-gradient(radial, center center, 0, center center, 460, from(@innerColor), to(@outerColor)); background-image: -webkit-radial-gradient(circle, @innerColor, @outerColor); background-image: -moz-radial-gradient(circle, @innerColor, @outerColor); background-image: -o-radial-gradient(circle, @innerColor, @outerColor); background-repeat: no-repeat; } .striped(@color: #555, @angle: 45deg) { background-color: @color; background-image: -webkit-gradient(linear, 0 100%, 100% 0, color-stop(.25, rgba(255,255,255,.15)), color-stop(.25, transparent), color-stop(.5, transparent), color-stop(.5, rgba(255,255,255,.15)), color-stop(.75, rgba(255,255,255,.15)), color-stop(.75, transparent), to(transparent)); background-image: -webkit-linear-gradient(@angle, rgba(255,255,255,.15) 25%, transparent 25%, transparent 50%, rgba(255,255,255,.15) 50%, rgba(255,255,255,.15) 75%, transparent 75%, transparent); background-image: -moz-linear-gradient(@angle, rgba(255,255,255,.15) 25%, transparent 25%, transparent 50%, rgba(255,255,255,.15) 50%, rgba(255,255,255,.15) 75%, transparent 75%, transparent); background-image: -o-linear-gradient(@angle, rgba(255,255,255,.15) 25%, transparent 25%, transparent 50%, rgba(255,255,255,.15) 50%, rgba(255,255,255,.15) 75%, transparent 75%, transparent); background-image: linear-gradient(@angle, rgba(255,255,255,.15) 25%, transparent 25%, transparent 50%, rgba(255,255,255,.15) 50%, rgba(255,255,255,.15) 75%, transparent 75%, transparent); } } // Reset filters for IE .reset-filter() { filter: e(%("progid:DXImageTransform.Microsoft.gradient(enabled = false)")); } // COMPONENT MIXINS // -------------------------------------------------- // Horizontal dividers // ------------------------- // Dividers (basically an hr) within dropdowns and nav lists .nav-divider(@top: #e5e5e5, @bottom: @white) { // IE7 needs a set width since we gave a height. Restricting just // to IE7 to keep the 1px left/right space in other browsers. // It is unclear where IE is getting the extra space that we need // to negative-margin away, but so it goes. *width: 100%; height: 1px; margin: ((@baseLineHeight / 2) - 1) 1px; // 8px 1px *margin: -5px 0 5px; overflow: hidden; background-color: @top; border-bottom: 1px solid @bottom; } // Button backgrounds // ------------------ .buttonBackground(@startColor, @endColor, @textColor: #fff, @textShadow: 0 -1px 0 rgba(0,0,0,.25)) { // gradientBar will set the background to a pleasing blend of these, to support IE<=9 .gradientBar(@startColor, @endColor, @textColor, @textShadow); *background-color: @endColor; /* Darken IE7 buttons by default so they stand out more given they won't have borders */ .reset-filter(); // in these cases the gradient won't cover the background, so we override &:hover, &:focus, &:active, &.active, &.disabled, &[disabled] { color: @textColor; background-color: @endColor; *background-color: darken(@endColor, 5%); } // IE 7 + 8 can't handle box-shadow to show active, so we darken a bit ourselves &:active, &.active { background-color: darken(@endColor, 10%) e("\9"); } } // Navbar vertical align // ------------------------- // Vertically center elements in the navbar. // Example: an element has a height of 30px, so write out `.navbarVerticalAlign(30px);` to calculate the appropriate top margin. .navbarVerticalAlign(@elementHeight) { margin-top: (@navbarHeight - @elementHeight) / 2; } // Grid System // ----------- // Centered container element .container-fixed() { margin-right: auto; margin-left: auto; .clearfix(); } // Table columns .tableColumns(@columnSpan: 1) { float: none; // undo default grid column styles width: ((@gridColumnWidth) * @columnSpan) + (@gridGutterWidth * (@columnSpan - 1)) - 16; // 16 is total padding on left and right of table cells margin-left: 0; // undo default grid column styles } // Make a Grid // Use .makeRow and .makeColumn to assign semantic layouts grid system behavior .makeRow() { margin-left: @gridGutterWidth * -1; .clearfix(); } .makeColumn(@columns: 1, @offset: 0) { float: left; margin-left: (@gridColumnWidth * @offset) + (@gridGutterWidth * (@offset - 1)) + (@gridGutterWidth * 2); width: (@gridColumnWidth * @columns) + (@gridGutterWidth * (@columns - 1)); } // The Grid #grid { .core (@gridColumnWidth, @gridGutterWidth) { .spanX (@index) when (@index > 0) { .span@{index} { .span(@index); } .spanX(@index - 1); } .spanX (0) {} .offsetX (@index) when (@index > 0) { .offset@{index} { .offset(@index); } .offsetX(@index - 1); } .offsetX (0) {} .offset (@columns) { margin-left: (@gridColumnWidth * @columns) + (@gridGutterWidth * (@columns + 1)); } .span (@columns) { width: (@gridColumnWidth * @columns) + (@gridGutterWidth * (@columns - 1)); } .row { margin-left: @gridGutterWidth * -1; .clearfix(); } [class*="span"] { float: left; min-height: 1px; // prevent collapsing columns margin-left: @gridGutterWidth; } // Set the container width, and override it for fixed navbars in media queries .container, .navbar-static-top .container, .navbar-fixed-top .container, .navbar-fixed-bottom .container { .span(@gridColumns); } // generate .spanX and .offsetX .spanX (@gridColumns); .offsetX (@gridColumns); } .fluid (@fluidGridColumnWidth, @fluidGridGutterWidth) { .spanX (@index) when (@index > 0) { .span@{index} { .span(@index); } .spanX(@index - 1); } .spanX (0) {} .offsetX (@index) when (@index > 0) { .offset@{index} { .offset(@index); } .offset@{index}:first-child { .offsetFirstChild(@index); } .offsetX(@index - 1); } .offsetX (0) {} .offset (@columns) { margin-left: (@fluidGridColumnWidth * @columns) + (@fluidGridGutterWidth * (@columns - 1)) + (@fluidGridGutterWidth*2); *margin-left: (@fluidGridColumnWidth * @columns) + (@fluidGridGutterWidth * (@columns - 1)) - (.5 / @gridRowWidth * 100 * 1%) + (@fluidGridGutterWidth*2) - (.5 / @gridRowWidth * 100 * 1%); } .offsetFirstChild (@columns) { margin-left: (@fluidGridColumnWidth * @columns) + (@fluidGridGutterWidth * (@columns - 1)) + (@fluidGridGutterWidth); *margin-left: (@fluidGridColumnWidth * @columns) + (@fluidGridGutterWidth * (@columns - 1)) - (.5 / @gridRowWidth * 100 * 1%) + @fluidGridGutterWidth - (.5 / @gridRowWidth * 100 * 1%); } .span (@columns) { width: (@fluidGridColumnWidth * @columns) + (@fluidGridGutterWidth * (@columns - 1)); *width: (@fluidGridColumnWidth * @columns) + (@fluidGridGutterWidth * (@columns - 1)) - (.5 / @gridRowWidth * 100 * 1%); } .row-fluid { width: 100%; .clearfix(); [class*="span"] { .input-block-level(); float: left; margin-left: @fluidGridGutterWidth; *margin-left: @fluidGridGutterWidth - (.5 / @gridRowWidth * 100 * 1%); } [class*="span"]:first-child { margin-left: 0; } // Space grid-sized controls properly if multiple per line .controls-row [class*="span"] + [class*="span"] { margin-left: @fluidGridGutterWidth; } // generate .spanX and .offsetX .spanX (@gridColumns); .offsetX (@gridColumns); } } .input(@gridColumnWidth, @gridGutterWidth) { .spanX (@index) when (@index > 0) { input.span@{index}, textarea.span@{index}, .uneditable-input.span@{index} { .span(@index); } .spanX(@index - 1); } .spanX (0) {} .span(@columns) { width: ((@gridColumnWidth) * @columns) + (@gridGutterWidth * (@columns - 1)) - 14; } input, textarea, .uneditable-input { margin-left: 0; // override margin-left from core grid system } // Space grid-sized controls properly if multiple per line .controls-row [class*="span"] + [class*="span"] { margin-left: @gridGutterWidth; } // generate .spanX .spanX (@gridColumns); } } .customTransition(@prop, @delay, @a, @b, @c, @d){ -webkit-transition: @prop, @delay cubic-bezier(@a, @b, @c, @d); -moz-transition: @prop, @delay cubic-bezier(@a, @b, @c, @d); -ms-transition: @prop, @delay cubic-bezier(@a, @b, @c, @d); -o-transition: @prop, @delay cubic-bezier(@a, @b, @c, @d); transition: @prop, @delay cubic-bezier(@a, @b, @c, @d); /* custom */ -webkit-transition-timing-function: cubic-bezier(@a, @b, @c, @d); -moz-transition-timing-function: cubic-bezier(@a, @b, @c, @d); -ms-transition-timing-function: cubic-bezier(@a, @b, @c, @d); -o-transition-timing-function: cubic-bezier(@a, @b, @c, @d); transition-timing-function: cubic-bezier(@a, @b, @c, @d); /* custom */ } apache-couchdb-1.6.0/src/fauxton/assets/less/bootstrap/popovers.less0000644000175000001440000000600512332105522025624 0ustar00djcusers00000000000000// // Popovers // -------------------------------------------------- .popover { position: absolute; top: 0; left: 0; z-index: @zindexPopover; display: none; max-width: 276px; padding: 1px; text-align: left; // Reset given new insertion method background-color: @popoverBackground; -webkit-background-clip: padding-box; -moz-background-clip: padding; background-clip: padding-box; border: 1px solid #ccc; border: 1px solid rgba(0,0,0,.2); .border-radius(6px); .box-shadow(0 5px 10px rgba(0,0,0,.2)); // Overrides for proper insertion white-space: normal; // Offset the popover to account for the popover arrow &.top { margin-top: -10px; } &.right { margin-left: 10px; } &.bottom { margin-top: 10px; } &.left { margin-left: -10px; } } .popover-title { margin: 0; // reset heading margin padding: 8px 14px; font-size: 14px; font-weight: normal; line-height: 18px; background-color: @popoverTitleBackground; border-bottom: 1px solid darken(@popoverTitleBackground, 5%); .border-radius(5px 5px 0 0); &:empty { display: none; } } .popover-content { padding: 9px 14px; } // Arrows // // .arrow is outer, .arrow:after is inner .popover .arrow, .popover .arrow:after { position: absolute; display: block; width: 0; height: 0; border-color: transparent; border-style: solid; } .popover .arrow { border-width: @popoverArrowOuterWidth; } .popover .arrow:after { border-width: @popoverArrowWidth; content: ""; } .popover { &.top .arrow { left: 50%; margin-left: -@popoverArrowOuterWidth; border-bottom-width: 0; border-top-color: #999; // IE8 fallback border-top-color: @popoverArrowOuterColor; bottom: -@popoverArrowOuterWidth; &:after { bottom: 1px; margin-left: -@popoverArrowWidth; border-bottom-width: 0; border-top-color: @popoverArrowColor; } } &.right .arrow { top: 50%; left: -@popoverArrowOuterWidth; margin-top: -@popoverArrowOuterWidth; border-left-width: 0; border-right-color: #999; // IE8 fallback border-right-color: @popoverArrowOuterColor; &:after { left: 1px; bottom: -@popoverArrowWidth; border-left-width: 0; border-right-color: @popoverArrowColor; } } &.bottom .arrow { left: 50%; margin-left: -@popoverArrowOuterWidth; border-top-width: 0; border-bottom-color: #999; // IE8 fallback border-bottom-color: @popoverArrowOuterColor; top: -@popoverArrowOuterWidth; &:after { top: 1px; margin-left: -@popoverArrowWidth; border-top-width: 0; border-bottom-color: @popoverArrowColor; } } &.left .arrow { top: 50%; right: -@popoverArrowOuterWidth; margin-top: -@popoverArrowOuterWidth; border-right-width: 0; border-left-color: #999; // IE8 fallback border-left-color: @popoverArrowOuterColor; &:after { right: 1px; border-right-width: 0; border-left-color: @popoverArrowColor; bottom: -@popoverArrowWidth; } } } apache-couchdb-1.6.0/src/fauxton/assets/less/bootstrap/accordion.less0000644000175000001440000000117412332105522025712 0ustar00djcusers00000000000000// // Accordion // -------------------------------------------------- // Parent container .accordion { margin-bottom: @baseLineHeight; } // Group == heading + body .accordion-group { margin-bottom: 2px; border: 1px solid #e5e5e5; .border-radius(@baseBorderRadius); } .accordion-heading { border-bottom: 0; } .accordion-heading .accordion-toggle { display: block; padding: 8px 15px; } // General toggle styles .accordion-toggle { cursor: pointer; } // Inner needs the styles because you can't animate properly with any styles on the element .accordion-inner { padding: 9px 15px; border-top: 1px solid #e5e5e5; } apache-couchdb-1.6.0/src/fauxton/assets/less/bootstrap/layouts.less0000644000175000001440000000051112332105522025443 0ustar00djcusers00000000000000// // Layouts // -------------------------------------------------- // Container (centered, fixed-width layouts) .container { .container-fixed(); } // Fluid layouts (left aligned, with sidebar, min- & max-width content) .container-fluid { padding-right: @gridGutterWidth; padding-left: @gridGutterWidth; .clearfix(); }apache-couchdb-1.6.0/src/fauxton/assets/index.underscore0000644000175000001440000000257612332105522023307 0ustar00djcusers00000000000000 Project Fauxton <% if (base) { %> <% } %>
    apache-couchdb-1.6.0/src/fauxton/settings.json.default0000644000175000001440000000344012332105522022750 0ustar00djcusers00000000000000{ "deps": [ { "name": "fauxton" }, { "name": "databases" }, { "name": "documents" }, { "name": "pouchdb" }, { "name": "activetasks" }, { "name": "config" }, { "name": "logs" }, { "name": "stats" }, { "name": "replication" }, { "name": "plugins" }, { "name": "contribute" }, { "name": "permissions" }, { "name": "compaction" }, { "name": "auth" }, { "name": "verifyinstall" } ], "template": { "development": { "src": "assets/index.underscore", "dest": "dist/debug/index.html", "variables": { "requirejs": "/assets/js/libs/require.js", "css": "./css/index.css", "base": null, "cachebuster": "" }, "app": { "root": "/", "host": "../..", "version": "1.0.dev" } }, "release": { "src": "assets/index.underscore", "dest": "dist/debug/index.html", "variables": { "requirejs": "./js/require.js", "css": "./css/index.css", "base": null, "cachebuster": "?v1.0" }, "app": { "root": "/_utils/fauxton/", "host": "../..", "version": "1.0" } }, "couchapp": { "src": "assets/index.underscore", "dest": "dist/debug/index.html", "variables": { "requirejs": "./js/require.js", "css": "./css/index.css", "base": null, "cachebuster": "?v1.0" }, "app": { "root": "/", "host": "../../..", "version": "1.0" } } }, "couch_config": { "fauxton": { "db": "http://localhost:5984/fauxton", "app": "./couchapp.js", "options": { "okay_if_missing": true } } } } apache-couchdb-1.6.0/src/fauxton/settings.json.sample_external0000644000175000001440000000027212332105522024507 0ustar00djcusers00000000000000{ "deps": [ { "name": "fauxton-demo-plugin", "url": "git://github.com/chewbranca/fauxton-demo-plugin.git" }, { "name": "config" }, { "name": "logs" } ] } apache-couchdb-1.6.0/src/fauxton/couchapp.js0000644000175000001440000000236412332105522020736 0ustar00djcusers00000000000000// Licensed under the Apache License, Version 2.0 (the "License"); you may not // use this file except in compliance with the License. You may obtain a copy of // the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, WITHOUT // WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the // License for the specific language governing permissions and limitations under // the License. var couchapp = require('couchapp'), path = require('path'), ddoc; ddoc = { _id: '_design/fauxton', rewrites: [ { "from": "_db" , "to" : "../.." }, { "from": "_db/*" , "to" : "../../*" }, { "from": "_ddoc" , "to" : "" }, { "from": "_ddoc/*", "to" : "*"}, {from: '/', to: 'index.html'}, {from: '/*', to: '*'} ], views: {}, shows: {}, lists: {}, validate_doc_update: function(newDoc, oldDoc, userCtx) { /*if (newDoc._deleted === true && userCtx.roles.indexOf('_admin') === -1) { throw "Only admin can delete documents on this database."; }*/ } }; couchapp.loadAttachments(ddoc, path.join(__dirname, 'dist', 'release')); module.exports = ddoc; apache-couchdb-1.6.0/src/fauxton/settings.json.dev0000644000175000001440000000266712332105522022114 0ustar00djcusers00000000000000{ "deps": [ { "name": "fauxton" }, { "name": "databases" }, { "name": "documents" }, { "name": "pouchdb" }, { "name": "activetasks" }, { "name": "config" }, { "name": "logs" }, { "name": "stats" }, { "name": "replication" }, { "name": "plugins" }, { "name": "contribute" }, { "name": "permissions" }, { "name": "compaction" }, { "name": "auth" }, { "name": "verifyinstall" }, { "name": "styletests" } ], "template": { "development": { "src": "assets/index.underscore", "dest": "dist/debug/index.html", "variables": { "requirejs": "/assets/js/libs/require.js", "css": "./css/index.css", "base": null, "cachebuster": "" }, "app": { "root": "/", "host": "../..", "version": "1.0.dev" } }, "release": { "src": "assets/index.underscore", "dest": "dist/debug/index.html", "variables": { "requirejs": "./js/require.js", "css": "./css/index.css", "base": null, "cachebuster": "?v1.0" }, "app": { "root": "/_utils/fauxton/", "host": "../..", "version": "1.0" } } }, "couch_config": { "fauxton": { "db": "http://localhost:5984/fauxton", "app": "./couchapp.js", "options": { "okay_if_missing": true } } } } apache-couchdb-1.6.0/src/fauxton/extensions.md0000644000175000001440000000114712332105522021315 0ustar00djcusers00000000000000#Extensions Extensions allow Fauxton views to be have extra functionality. A module registers an extension by FauxtonAPI.registerExtension('extensionName', myObjectToRegister); Any other module wanting to use that extension can then get all objects registered for an extension by: var extensions = FauxtonAPI.getExtensions('extensionName'); // extensions will always be an array The module can then use those extensions to extend its functionality. An example of extensions in the compaction module (app/addons/compaction/base.js) and in documents module (app/modules/documents/views line 1003) apache-couchdb-1.6.0/src/fauxton/package.json0000644000175000001440000000231512332105522021060 0ustar00djcusers00000000000000{ "name": "fauxton", "version": "0.1.0", "description": "Fauxton is a modular CouchDB dashboard and Futon replacement.", "main": "grunt.js", "directories": { "test": "test" }, "dependencies": { "async": "~0.2.6", "grunt": "~0.4.1", "grunt-cli": "~0.1.6", "couchapp": "~0.9.1", "grunt-contrib-cssmin": "~0.5.0", "grunt-contrib-clean": "~0.4.1", "grunt-contrib-jshint": "~0.6.0", "grunt-contrib-concat": "~0.3.0", "grunt-contrib-less": "~0.5.0", "grunt-contrib-jst": "~0.5.0", "grunt-contrib-watch": "~0.4.4", "grunt-contrib-uglify": "~0.2.0", "grunt-contrib-copy": "~0.4.1", "grunt-couchapp": "~0.1.0", "grunt-exec": "~0.4.0", "grunt-init": "~0.2.0", "grunt-contrib-requirejs": "~0.4.1", "underscore": "~1.4.2", "url": "~0.7.9", "urls": "~0.0.3", "http-proxy": "~0.10.2", "send": "~0.1.1", "grunt-mocha-phantomjs": "~0.3.0" }, "scripts": { "test": "echo \"Error: no test specified\" && exit 1" }, "repository": { "type": "git", "url": "https://git-wip-us.apache.org/repos/asf/couchdb.git" }, "keywords": [ "couchdb", "futon", "fauxton" ], "author": "", "license": "Apache V2" } apache-couchdb-1.6.0/src/fauxton/readme.md0000644000175000001440000000613012332105522020350 0ustar00djcusers00000000000000Fauxton ======= This is the initial implementation of Fauxton, focused on fleshing out the various pieces of functionality and as a test bed for new ideas. Full functionality and design considerations will be added later. Current items of interest: * Live JSON editor with dynamic JS Hinting and error popups * Initial plugin system * Minimal externally loadable plugin example * Data popups for additional db info on \_all_dbs page * CouchDB API compliant urls ## Setup Fauxton ## A recent of [node.js](http://nodejs.org/) and npm is required. ### CouchDB Setup ### 1. Clone the CouchDB repo: https://github.com/apache/couchdb.git or http://git-wip-us.apache.org/repos/asf/couchdb.git cd couchdb ### Fauxton Setup ### cd src/fauxton # Install all dependencies npm install ### Dev Server Using the dev server is the easiest way to use fauxton, specially when developing for it. Copy or symlink the `settings.json.default` (or the `settings.json.dev` file if you'd like to see the `styletests` addon). And then... grunt dev #### (Optional) To avoid a npm global install # Add node_modules/.bin to your path # export PATH=./node_modules/.bin:$PATH # Or just use the wrappers in ./bin/ # Development mode, non minified files ./bin/grunt couchdebug # Or fully compiled install # ./bin/grunt couchdb ### Prepare Fauxton Release Follow the "Fauxton Setup" section, Edit settings.json variable root where the document will live. eg. "/_utils/fauxton/" then: ./bin/grunt couchdb This will install the latest version of Fauxton into `/share/www/fauxton` ### Running Tests There are two ways to run the tests. `grunt test` will run the tests via the commandline. It is also possible to view them via the url `http://localhost:8000/testrunner` when the dev server is running. Refreshing the url will rerun the tests via phantomjs and in the browser. ### To Deploy Fauxton ./bin/grunt couchapp_deploy - to deploy to your local [CouchDB instance] (http://localhost:5984/fauxton/_design/fauxton/index.html) ## Understang Fauxton Code layout Each bit of functionality is its own seperate module or addon. All core modules are stored under `app/module` and any addons that are optional are under `app/addons`. We use [backbone.js](http://backbonejs.org/) and [Backbone.layoutmanager](https://github.com/tbranyen/backbone.layoutmanager) quite heavily, so best to get an idea how they work. Its best at this point to read through a couple of the modules and addons to get an idea of how they work. Two good starting points are `app/addon/config` and `app/modules/databases`. Each module must have a `base.js` file, this is read and compile when Fauxton is deployed. A `resource.js` file is usually for your Backbone.Models and Backbone.Collections, `view.js` for your Backbone.Views. The `routes.js` is used to register a url path for your view along with what layout, data, breadcrumbs and api point is required for the view. ## Todo items Checkout [Jira](https://issues.apache.org/jira/browse/COUCHDB/component/12320406) for a list of items to do. apache-couchdb-1.6.0/src/fauxton/CONTRIBUTING.md0000644000175000001440000000274512332105522021032 0ustar00djcusers00000000000000Contributing to Fauxton ======================= Couchdb is an apache project, which is why we keep all our issues in Jira. You can find or submit issues for fauxton [here](https://issues.apache.org/jira/issues/?filter=12326543). We try to keep all tickets up to date with Skill level for you to have an idea of the level of effort or comfortability with the framework you'd need to complete the task. To fix an issue in Fauxton, fork the Couchdb project to your github account. The [Readme file](https://github.com/apache/couchdb/blob/master/src/fauxton/readme.md) has information about how to get the project running. To start working on a specific ticket, create a branch with the Jira ID # followed by a traincase description of the issue. > e.g. 1234-Added-support-for-list-functions If there is no Jira ticket for the issue you have, please create one. When you're ready for a review, submit a Pull Request. We regularly check the PR list for fauxton and should get back to you with a code review. If no one has responded to you yet, you can find us on IRC in #couchdb-dev. Ping **Garren** or **Deathbear**, though anyone in the room should be able to help you. We appreciate constructive feedback from people who use couchdb, so don't be shy. We know there are bugs and we know there is room for improvement. ʕ“•ᓄ•`Ź” Thanks! -- Fauxton team PS - If you are new to contributing to open source, or using github reach out to us on irc (#couchdb-dev)! We will happily help you. apache-couchdb-1.6.0/src/couch_plugins/0000755000175000001440000000000012332105600017744 5ustar00djcusers00000000000000apache-couchdb-1.6.0/src/couch_plugins/src/0000755000175000001440000000000012332105600020533 5ustar00djcusers00000000000000apache-couchdb-1.6.0/src/couch_plugins/src/couch_plugins.erl0000644000175000001440000002222112332105522024103 0ustar00djcusers00000000000000% Licensed under the Apache License, Version 2.0 (the "License"); you may not % use this file except in compliance with the License. You may obtain a copy of % the License at % % http://www.apache.org/licenses/LICENSE-2.0 % % Unless required by applicable law or agreed to in writing, software % distributed under the License is distributed on an "AS IS" BASIS, WITHOUT % WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the % License for the specific language governing permissions and limitations under % the License. -module(couch_plugins). -include("couch_db.hrl"). -export([install/1, uninstall/1]). % couch_plugins:install({"geocouch", "http://127.0.0.1:8000", "1.0.0", [{"R15B03", "+XOJP6GSzmuO2qKdnjO+mWckXVs="}]}). % couch_plugins:install({"geocouch", "http://people.apache.org/~jan/", "couchdb1.2.x_v0.3.0-11-gd83ba22", [{"R15B03", "ZetgdHj2bY2w37buulWVf3USOZs="}]}). plugin_dir() -> couch_config:get("couchdb", "plugin_dir"). log(T) -> ?LOG_DEBUG("[couch_plugins] ~p ~n", [T]). %% "geocouch", "http://localhost:8000/dist", "1.0.0" -type plugin() :: {string(), string(), string(), list()}. -spec install(plugin()) -> ok | {error, string()}. install({Name, _BaseUrl, Version, Checksums}=Plugin) -> log("Installing " ++ Name), {ok, LocalFilename} = download(Plugin), log("downloaded to " ++ LocalFilename), ok = verify_checksum(LocalFilename, Checksums), log("checksum verified"), ok = untargz(LocalFilename), log("extraction done"), ok = add_code_path(Name, Version), log("added code path"), ok = register_plugin(Name, Version), log("registered plugin"), load_config(Name, Version), log("loaded config"), ok. % Idempotent uninstall, if you uninstall a non-existant % plugin, you get an `ok`. -spec uninstall(plugin()) -> ok | {error, string()}. uninstall({Name, _BaseUrl, Version, _Checksums}) -> % unload config ok = unload_config(Name, Version), log("config unloaded"), % delete files ok = delete_files(Name, Version), log("files deleted"), % delete code path ok = del_code_path(Name, Version), log("deleted code path"), % unregister plugin ok = unregister_plugin(Name), log("unregistered plugin"), % done ok. %% * * * %% Plugin Registration %% On uninstall: %% - add plugins/name = version to config %% On uninstall: %% - remove plugins/name from config -spec register_plugin(string(), string()) -> ok. register_plugin(Name, Version) -> couch_config:set("plugins", Name, Version). -spec unregister_plugin(string()) -> ok. unregister_plugin(Name) -> couch_config:delete("plugins", Name). %% * * * %% Load Config %% Parses /priv/default.d/ and applies %% the contents to the config system, or removes them on uninstall -spec load_config(string(), string()) -> ok. load_config(Name, Version) -> loop_config(Name, Version, fun set_config/1). -spec unload_config(string(), string()) -> ok. unload_config(Name, Version) -> loop_config(Name, Version, fun delete_config/1). -spec loop_config(string(), string(), function()) -> ok. loop_config(Name, Version, Fun) -> lists:foreach(fun(File) -> load_config_file(File, Fun) end, filelib:wildcard(file_names(Name, Version))). -spec load_config_file(string(), function()) -> ok. load_config_file(File, Fun) -> {ok, Config} = couch_config:parse_ini_file(File), lists:foreach(Fun, Config). -spec set_config({{string(), string()}, string()}) -> ok. set_config({{Section, Key}, Value}) -> ok = couch_config:set(Section, Key, Value). -spec delete_config({{string(), string()}, _Value}) -> ok. delete_config({{Section, Key}, _Value}) -> ok = couch_config:delete(Section, Key). -spec file_names(string(), string()) -> string(). file_names(Name, Version) -> filename:join( [plugin_dir(), get_file_slug(Name, Version), "priv", "default.d", "*.ini"]). %% * * * %% Code Path Management %% The Erlang code path is where the Erlang runtime looks for `.beam` %% files to load on, say, `application:load()`. Since plugin directories %% are created on demand and named after CouchDB and Erlang versions, %% we manage the Erlang code path semi-automatically here. -spec add_code_path(string(), string()) -> ok | {error, bad_directory}. add_code_path(Name, Version) -> PluginPath = plugin_dir() ++ "/" ++ get_file_slug(Name, Version) ++ "/ebin", case code:add_path(PluginPath) of true -> ok; Else -> ?LOG_ERROR("Failed to add PluginPath: '~s'", [PluginPath]), Else end. -spec del_code_path(string(), string()) -> ok | {error, atom()}. del_code_path(Name, Version) -> PluginPath = plugin_dir() ++ "/" ++ get_file_slug(Name, Version) ++ "/ebin", case code:del_path(PluginPath) of true -> ok; _Else -> ?LOG_DEBUG("Failed to delete PluginPath: '~s', ignoring", [PluginPath]), ok end. %% * * * -spec untargz(string()) -> {ok, string()} | {error, string()}. untargz(Filename) -> % read .gz file {ok, GzData} = file:read_file(Filename), % gunzip log("unzipped"), TarData = zlib:gunzip(GzData), ok = filelib:ensure_dir(plugin_dir()), % untar erl_tar:extract({binary, TarData}, [{cwd, plugin_dir()}, keep_old_files]). -spec delete_files(string(), string()) -> ok | {error, atom()}. delete_files(Name, Version) -> PluginPath = plugin_dir() ++ "/" ++ get_file_slug(Name, Version), mochitemp:rmtempdir(PluginPath). % downloads a pluygin .tar.gz into a local plugins directory -spec download(string()) -> ok | {error, string()}. download({Name, _BaseUrl, Version, _Checksums}=Plugin) -> TargetFile = "/tmp/" ++ get_filename(Name, Version), case file_exists(TargetFile) of %% wipe and redownload true -> file:delete(TargetFile); _Else -> ok end, Url = get_url(Plugin), HTTPOptions = [ {connect_timeout, 30*1000}, % 30 seconds {timeout, 30*1000} % 30 seconds ], % todo: windows Options = [ {stream, TargetFile}, % /tmp/something {body_format, binary}, {full_result, false} ], % todo: reduce to just httpc:request() case httpc:request(get, {Url, []}, HTTPOptions, Options) of {ok, _Result} -> log("downloading " ++ Url), {ok, TargetFile}; Error -> Error end. -spec verify_checksum(string(), list()) -> ok | {error, string()}. verify_checksum(Filename, Checksums) -> CouchDBVersion = couchdb_version(), case proplists:get_value(CouchDBVersion, Checksums) of undefined -> ?LOG_ERROR("[couch_plugins] Can't find checksum for CouchDB Version '~s'", [CouchDBVersion]), {error, no_couchdb_checksum}; OTPChecksum -> OTPRelease = erlang:system_info(otp_release), case proplists:get_value(OTPRelease, OTPChecksum) of undefined -> ?LOG_ERROR("[couch_plugins] Can't find checksum for Erlang Version '~s'", [OTPRelease]), {error, no_erlang_checksum}; Checksum -> do_verify_checksum(Filename, Checksum) end end. -spec do_verify_checksum(string(), string()) -> ok | {error, string()}. do_verify_checksum(Filename, Checksum) -> ?LOG_DEBUG("Checking Filename: ~s", [Filename]), case file:read_file(Filename) of {ok, Data} -> ComputedChecksum = binary_to_list(base64:encode(crypto:sha(Data))), case ComputedChecksum of Checksum -> ok; _Else -> ?LOG_ERROR("Checksum mismatch. Wanted: '~p'. Got '~p'", [Checksum, ComputedChecksum]), {error, checksum_mismatch} end; Error -> Error end. %% utils -spec get_url(plugin()) -> string(). get_url({Name, BaseUrl, Version, _Checksums}) -> BaseUrl ++ "/" ++ get_filename(Name, Version). -spec get_filename(string(), string()) -> string(). get_filename(Name, Version) -> get_file_slug(Name, Version) ++ ".tar.gz". -spec get_file_slug(string(), string()) -> string(). get_file_slug(Name, Version) -> % OtpRelease does not include patch levels like the -1 in R15B03-1 OTPRelease = erlang:system_info(otp_release), CouchDBVersion = couchdb_version(), string:join([Name, Version, OTPRelease, CouchDBVersion], "-"). -spec file_exists(string()) -> boolean(). file_exists(Filename) -> does_file_exist(file:read_file_info(Filename)). -spec does_file_exist(term()) -> boolean(). does_file_exist({error, enoent}) -> false; does_file_exist(_Else) -> true. couchdb_version() -> couch_server:get_version(short). % installing a plugin: % - POST /_plugins -d {plugin-def} % - get plugin definition % - get download URL (matching erlang version) % - download archive % - match checksum % - untar-gz archive into a plugins dir % - code:add_path(ā€œgeocouch-{geocouch_version}-{erlang_version}/ebinā€) % - [cp geocouch-{geocouch_version}-{erlang_version}/etc/ ] % - application:start(geocouch) % - register plugin in plugin registry % Plugin registry impl: % - _plugins database % - pro: known db ops % - con: no need for replication, needs to be system db etc. % - _config/plugins namespace in config % - pro: lightweight, fits rarely-changing nature better % - con: potentially not flexible enough % /geocouch % /geocouch/dist/ % /geocouch/dist/geocouch-{geocouch_version}-{erlang_version}.tar.gz % tar.gz includes: % geocouch-{geocouch_version}-{erlang_version}/ % geocouch-{geocouch_version}-{erlang_version}/ebin % [geocouch-{geocouch_version}-{erlang_version}/config/config.erlt] % [geocouch-{geocouch_version}-{erlang_version}/share/] apache-couchdb-1.6.0/src/couch_plugins/src/couch_plugins.app.src0000644000175000001440000000143612332105522024674 0ustar00djcusers00000000000000% Licensed under the Apache License, Version 2.0 (the "License"); you may not % use this file except in compliance with the License. You may obtain a copy of % the License at % % http://www.apache.org/licenses/LICENSE-2.0 % % Unless required by applicable law or agreed to in writing, software % distributed under the License is distributed on an "AS IS" BASIS, WITHOUT % WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the % License for the specific language governing permissions and limitations under % the License. {application, couch_plugins, [ {description, "A CouchDB Plugin Installer"}, {vsn, "1"}, {registered, []}, {applications, [ kernel, stdlib ]}, {mod, { couch_plugins_app, []}}, {env, []} ]}. apache-couchdb-1.6.0/src/couch_plugins/src/couch_plugins_httpd.erl0000644000175000001440000000521512332105522025312 0ustar00djcusers00000000000000% Licensed under the Apache License, Version 2.0 (the "License"); you may not % use this file except in compliance with the License. You may obtain a copy of % the License at % % http://www.apache.org/licenses/LICENSE-2.0 % % Unless required by applicable law or agreed to in writing, software % distributed under the License is distributed on an "AS IS" BASIS, WITHOUT % WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the % License for the specific language governing permissions and limitations under % the License. -module(couch_plugins_httpd). -export([handle_req/1]). -include_lib("couch_db.hrl"). handle_req(#httpd{method='POST'}=Req) -> ok = couch_httpd:verify_is_server_admin(Req), couch_httpd:validate_ctype(Req, "application/json"), {PluginSpec} = couch_httpd:json_body_obj(Req), Url = binary_to_list(couch_util:get_value(<<"url">>, PluginSpec)), Name = binary_to_list(couch_util:get_value(<<"name">>, PluginSpec)), Version = binary_to_list(couch_util:get_value(<<"version">>, PluginSpec)), Delete = couch_util:get_value(<<"delete">>, PluginSpec), {Checksums0} = couch_util:get_value(<<"checksums">>, PluginSpec), Checksums = parse_checksums(Checksums0), Plugin = {Name, Url, Version, Checksums}, case do_install(Delete, Plugin) of ok -> couch_httpd:send_json(Req, 202, {[{ok, true}]}); Error -> ?LOG_DEBUG("Plugin Spec: ~p", [PluginSpec]), couch_httpd:send_error(Req, {bad_request, Error}) end; % handles /_plugins// % serves /---/ handle_req(#httpd{method='GET',path_parts=[_, Name0 | Path0]}=Req) -> Name = ?b2l(Name0), Path = lists:map(fun binary_to_list/1, Path0), OTPRelease = erlang:system_info(otp_release), PluginVersion = couch_config:get("plugins", Name), CouchDBVersion = couch_server:get_version(short), FullName = string:join([Name, PluginVersion, OTPRelease, CouchDBVersion], "-"), FullPath = filename:join([FullName, "priv", "www", string:join(Path, "/")]) ++ "/", ?LOG_DEBUG("Serving ~p from ~p", [FullPath, plugin_dir()]), couch_httpd:serve_file(Req, FullPath, plugin_dir()); handle_req(Req) -> couch_httpd:send_method_not_allowed(Req, "POST"). plugin_dir() -> couch_config:get("couchdb", "plugin_dir"). do_install(false, Plugin) -> couch_plugins:install(Plugin); do_install(true, Plugin) -> couch_plugins:uninstall(Plugin). parse_checksums(Checksums) -> lists:map(fun({K, {V}}) -> {binary_to_list(K), parse_checksums(V)}; ({K, V}) -> {binary_to_list(K), binary_to_list(V)} end, Checksums).apache-couchdb-1.6.0/src/couch_plugins/README.md0000644000175000001440000001240712332105522021232 0ustar00djcusers00000000000000Heya, I couldn’t help myself thinking about plugin stuff and ended up whipping up a proof of concept. Here’s a <1 minute demo video: https://dl.dropboxusercontent.com/u/82149/couchdb-plugins-demo.mov Alternative encoding: https://dl.dropboxusercontent.com/u/82149/couchdb-plugins-demo.m4v) In my head the whole plugin idea is a very wide area, but I was so intrigued by the idea of getting something running with a click on a button in Futon. So I looked for a minimally viable plugin system. ## Design principles It took me a day to put this all together and this was only possible because I took a lot of shortcuts. I believe they are all viable for a first iteration of a plugins system: 1. Install with one click on a button in Futon (or HTTP call) 2. Only pure Erlang plugins are allowed. 3. The plugin author must provide a binary package for each Erlang (and, later, each CouchDB version). 4. Complete trust-based system. You trust me to not do any nasty things when you click on the install button. No crypto, no nothing. Only people who can commit to Futon can release new versions of plugins. 5. Minimal user-friendlyness: won’t install plugins that don’t match the current Erlang version, gives semi-sensible error messages (wrapped in a HTTP 500 response :) 6. Require a pretty strict format for binary releases. ## Roadmap Here’s a list of things this first iterations does and doesn’t do: - Pure Erlang plugins only. No C-dependencies, no JavaScript, no nothing. - No C-dependencies. - Install a plugin via Futon (or HTTP call). Admin only. - A hardcoded list of plugins in Futon. - Loads a pre-packaged, pre-compiled .tar.gz file from a URL. - Only installs if Erlang version matches. - No security checking of binaries. - No identity checking of binaries. - Register installed plugins in the config system. - Make sure plugins start with the next restart of CouchDB. - Uninstall a plugin via Futon (or HTTP call). Admin only. - Show when a particular plugin is installed. - Only installs if CouchDB version matches. - Serve static web assets (for Futon/Fauxton) from `/_plugins//`. I hope you agree we can ship this with a few warnings so people can get a hang of it. A roadmap, progress and issues can be found here: https://issues.apache.org/jira/issues/?jql=component+%3D+Plugins+AND+project+%3D+COUCHDB+AND+resolution+%3D+Unresolved+ORDER+BY+priority+DESC ## How it works This plugin system lives in `src/couch_plugins` and is a tiny CouchDB module. It exposes one new API endpoint `/_plugins` that an admin user can POST to. The additional Futon page lives at `/_utils/plugins.html` it is hardcoded. Futon (or you) post an object to `/_plugins` with four properties: { "name": "geocouch", // name of the plugin, must be unique "url": "http://people.apache.org/~jan", // ā€œbase URLā€ for plugin releases (see below) "version": "couchdb1.2.x_v0.3.0-11-g4ea0bea", // whatever version internal to the plugin "checksums": { "R15B03": "ZetgdHj2bY2w37buulWVf3USOZs=" // base64’d sha hash over the binary } } `couch_plugins` then attempts to download a .tar.gz from this location: http://people.apache.org/~jan/geocouch-couchdb1.2.x_v0.3.0-12-g4ea0bea-R15B03.tar.gz It should be obvious how the URL is constructed from the POST data. (This url is live, feel free to play around with this tarball). Next it calculates the sha hash for the downloaded .tar.gz file and matches it against the correct version in the `checksums` parameter. If that succeeds, we unpack the .tar.gz file (currently in `/tmp`, need to find a better place for this) and adds the extracted directory to the Erlang code path (`code:add_path("/tmp/couchdb_plugins/geocouch-couchdb1.2.x_v0.3.0-12-g4ea0bea-R15B03/ebin")`) and loads the included application (`application:load(geocouch)`). Then it looks into the `./priv/default.d` directory that lives next to `ebin/` in the plugin directory for configuration `.ini` files and loads them. On next startup these configuration files are loaded after global defaults, and before any local configuration. If that all goes to plan, we report success back to the HTTP caller. That’s it! :) It’s deceptively simple, probably does a few things very wrong and leaves a few things open (see above). One open question I’d like an answer for is finding a good location to unpack & install the plugin files that isn’t `tmp`. If the answer is different for a pre-BigCouch/rcouch-merge and post-BigCouch/rcouch- merge world, I’d love to know :) ## Code The main branch for this is 1867-feature-plugins: ASF: https://git-wip-us.apache.org/repos/asf?p=couchdb.git;a=log;h=refs/heads/1867-feature-plugins GitHub: https://github.com/janl/couchdb/compare/apache:master...1867-feature-plugins I created a branch on GeoCouch that adds a few lines to its `Makefile` that shows how a binary package is built: https://github.com/janl/geocouch/compare/couchbase:couchdb1.3.x...couchdb1.3.x-plugins ## Build Build CouchDB as usual: ./bootstrap ./configure make make dev ./utils/run * * * I hope you like this :) Please comment and improve heavily! Let me know if you have any questions :) If you have any criticism, please phrase it in a way that we can use to improve this, thanks! Best, Jan -- apache-couchdb-1.6.0/src/couch_plugins/Makefile.am0000644000175000001440000000235012332105522022003 0ustar00djcusers00000000000000## Licensed under the Apache License, Version 2.0 (the "License"); you may not ## use this file except in compliance with the License. You may obtain a copy of ## the License at ## ## http://www.apache.org/licenses/LICENSE-2.0 ## ## Unless required by applicable law or agreed to in writing, software ## distributed under the License is distributed on an "AS IS" BASIS, WITHOUT ## WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the ## License for the specific language governing permissions and limitations under ## the License. couch_pluginslibdir = $(localerlanglibdir)/couch_plugins-0.1 couch_pluginsebindir = $(couch_pluginslibdir)/ebin couch_pluginsebin_DATA = $(compiled_files) source_files = \ src/couch_plugins.app.src \ src/couch_plugins.erl \ src/couch_plugins_httpd.erl compiled_files = \ ebin/couch_plugins.app \ ebin/couch_plugins.beam \ ebin/couch_plugins_httpd.beam EXTRA_DIST = $(source_files) README.md CLEANFILES = $(compiled_files) ebin/%.app: src/%.app.src @mkdir -p ebin/ sed -e "s|%version%|@version@|g" \ < $< > $@ ebin/%.beam: src/%.erl $(include_files) @mkdir -p ebin/ $(ERLC) -Wall -I$(top_srcdir)/src -I$(top_srcdir)/src/couchdb \ -o ebin/ $(ERLC_FLAGS) ${TEST} $<; apache-couchdb-1.6.0/src/couch_plugins/Makefile.in0000644000175000001440000003631212332105551022023 0ustar00djcusers00000000000000# Makefile.in generated by automake 1.11.6 from Makefile.am. # @configure_input@ # Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, # 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011 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__make_dryrun = \ { \ am__dry=no; \ case $$MAKEFLAGS in \ *\\[\ \ ]*) \ echo 'am--echo: ; @echo "AM" OK' | $(MAKE) -f - 2>/dev/null \ | grep '^AM OK$$' >/dev/null || am__dry=yes;; \ *) \ for am__flg in $$MAKEFLAGS; do \ case $$am__flg in \ *=*|--*) ;; \ *n*) am__dry=yes; break;; \ esac; \ done;; \ esac; \ test $$am__dry = yes; \ } 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/couch_plugins DIST_COMMON = $(srcdir)/Makefile.am $(srcdir)/Makefile.in ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 am__aclocal_m4_deps = $(top_srcdir)/m4/libtool.m4 \ $(top_srcdir)/m4/ltoptions.m4 $(top_srcdir)/m4/ltsugar.m4 \ $(top_srcdir)/m4/ltversion.m4 $(top_srcdir)/m4/lt~obsolete.m4 \ $(top_srcdir)/acinclude.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 \ $(top_builddir)/src/snappy/google-snappy/config.h CONFIG_CLEAN_FILES = CONFIG_CLEAN_VPATH_FILES = 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)$(couch_pluginsebindir)" DATA = $(couch_pluginsebin_DATA) DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) ACLOCAL = @ACLOCAL@ AMTAR = @AMTAR@ AR = @AR@ AS = @AS@ AUTOCONF = @AUTOCONF@ AUTOHEADER = @AUTOHEADER@ AUTOMAKE = @AUTOMAKE@ AWK = @AWK@ CC = @CC@ CCDEPMODE = @CCDEPMODE@ CFLAGS = @CFLAGS@ CPP = @CPP@ CPPFLAGS = @CPPFLAGS@ CURL_CFLAGS = @CURL_CFLAGS@ CURL_CONFIG = @CURL_CONFIG@ CURL_LIBS = @CURL_LIBS@ CXX = @CXX@ CXXCPP = @CXXCPP@ CXXDEPMODE = @CXXDEPMODE@ CXXFLAGS = @CXXFLAGS@ CYGPATH_W = @CYGPATH_W@ DEFS = @DEFS@ DEPDIR = @DEPDIR@ DLLTOOL = @DLLTOOL@ DSYMUTIL = @DSYMUTIL@ DUMPBIN = @DUMPBIN@ ECHO_C = @ECHO_C@ ECHO_N = @ECHO_N@ ECHO_T = @ECHO_T@ EGREP = @EGREP@ ERL = @ERL@ ERLANG_FLAGS = @ERLANG_FLAGS@ ERLC = @ERLC@ ERLC_FLAGS = @ERLC_FLAGS@ ESCRIPT = @ESCRIPT@ EXEEXT = @EXEEXT@ FGREP = @FGREP@ FLAGS = @FLAGS@ GREP = @GREP@ HAS_HELP2MAN = @HAS_HELP2MAN@ HAS_INSTALLINFO = @HAS_INSTALLINFO@ HAS_MAKEINFO = @HAS_MAKEINFO@ HAS_PDFLATEX = @HAS_PDFLATEX@ HAS_SPHINX_BUILD = @HAS_SPHINX_BUILD@ ICU_BIN = @ICU_BIN@ ICU_CFLAGS = @ICU_CFLAGS@ ICU_CONFIG = @ICU_CONFIG@ ICU_CPPFLAGS = @ICU_CPPFLAGS@ ICU_CXXFLAGS = @ICU_CXXFLAGS@ ICU_LIBS = @ICU_LIBS@ INNO_COMPILER_EXECUTABLE = @INNO_COMPILER_EXECUTABLE@ INSTALL = @INSTALL@ INSTALL_DATA = @INSTALL_DATA@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ INSTALL_SCRIPT = @INSTALL_SCRIPT@ INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ JS_CFLAGS = @JS_CFLAGS@ JS_LIBS = @JS_LIBS@ JS_LIB_BINARY = @JS_LIB_BINARY@ LD = @LD@ LDFLAGS = @LDFLAGS@ LIBOBJS = @LIBOBJS@ LIBS = @LIBS@ LIBTOOL = @LIBTOOL@ LIPO = @LIPO@ LN_S = @LN_S@ LTLIBOBJS = @LTLIBOBJS@ MAKEINFO = @MAKEINFO@ MANIFEST_TOOL = @MANIFEST_TOOL@ MKDIR_P = @MKDIR_P@ NM = @NM@ NMEDIT = @NMEDIT@ OBJDUMP = @OBJDUMP@ OBJEXT = @OBJEXT@ OTOOL = @OTOOL@ OTOOL64 = @OTOOL64@ PACKAGE = @PACKAGE@ PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ PACKAGE_NAME = @PACKAGE_NAME@ PACKAGE_STRING = @PACKAGE_STRING@ PACKAGE_TARNAME = @PACKAGE_TARNAME@ PACKAGE_URL = @PACKAGE_URL@ PACKAGE_VERSION = @PACKAGE_VERSION@ PATH_SEPARATOR = @PATH_SEPARATOR@ PKG_CONFIG = @PKG_CONFIG@ PKG_CONFIG_LIBDIR = @PKG_CONFIG_LIBDIR@ PKG_CONFIG_PATH = @PKG_CONFIG_PATH@ RANLIB = @RANLIB@ SED = @SED@ SET_MAKE = @SET_MAKE@ SHELL = @SHELL@ SNAPPY_MAJOR = @SNAPPY_MAJOR@ SNAPPY_MINOR = @SNAPPY_MINOR@ SNAPPY_PATCHLEVEL = @SNAPPY_PATCHLEVEL@ STRIP = @STRIP@ VERSION = @VERSION@ 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@ ac_cv_have_stddef_h = @ac_cv_have_stddef_h@ ac_cv_have_stdint_h = @ac_cv_have_stdint_h@ am__include = @am__include@ am__leading_dot = @am__leading_dot@ am__quote = @am__quote@ am__tar = @am__tar@ am__untar = @am__untar@ bindir = @bindir@ bug_uri = @bug_uri@ 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@ dvidir = @dvidir@ erlangbin = @erlangbin@ erlangversion = @erlangversion@ exec_prefix = @exec_prefix@ host = @host@ host_alias = @host_alias@ host_cpu = @host_cpu@ host_os = @host_os@ host_vendor = @host_vendor@ htmldir = @htmldir@ includedir = @includedir@ infodir = @infodir@ initdir = @initdir@ install_sh = @install_sh@ launchddir = @launchddir@ libdir = @libdir@ libexecdir = @libexecdir@ localconfdir = @localconfdir@ localdatadir = @localdatadir@ localdocdir = @localdocdir@ localedir = @localedir@ localerlanglibdir = @localerlanglibdir@ locallibbindir = @locallibbindir@ locallibdir = @locallibdir@ localstatedir = @localstatedir@ localstatelibdir = @localstatelibdir@ localstatelogdir = @localstatelogdir@ localstaterundir = @localstaterundir@ mandir = @mandir@ mkdir_p = @mkdir_p@ msvc_redist_dir = @msvc_redist_dir@ msvc_redist_name = @msvc_redist_name@ oldincludedir = @oldincludedir@ openssl_bin_dir = @openssl_bin_dir@ otp_release = @otp_release@ package_author_address = @package_author_address@ package_author_name = @package_author_name@ package_identifier = @package_identifier@ package_name = @package_name@ package_tarname = @package_tarname@ 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@ version = @version@ version_major = @version_major@ version_minor = @version_minor@ version_release = @version_release@ version_revision = @version_revision@ version_stage = @version_stage@ couch_pluginslibdir = $(localerlanglibdir)/couch_plugins-0.1 couch_pluginsebindir = $(couch_pluginslibdir)/ebin couch_pluginsebin_DATA = $(compiled_files) source_files = \ src/couch_plugins.app.src \ src/couch_plugins.erl \ src/couch_plugins_httpd.erl compiled_files = \ ebin/couch_plugins.app \ ebin/couch_plugins.beam \ ebin/couch_plugins_httpd.beam EXTRA_DIST = $(source_files) README.md CLEANFILES = $(compiled_files) 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) --foreign src/couch_plugins/Makefile'; \ $(am__cd) $(top_srcdir) && \ $(AUTOMAKE) --foreign src/couch_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 install-couch_pluginsebinDATA: $(couch_pluginsebin_DATA) @$(NORMAL_INSTALL) @list='$(couch_pluginsebin_DATA)'; test -n "$(couch_pluginsebindir)" || list=; \ if test -n "$$list"; then \ echo " $(MKDIR_P) '$(DESTDIR)$(couch_pluginsebindir)'"; \ $(MKDIR_P) "$(DESTDIR)$(couch_pluginsebindir)" || 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)$(couch_pluginsebindir)'"; \ $(INSTALL_DATA) $$files "$(DESTDIR)$(couch_pluginsebindir)" || exit $$?; \ done uninstall-couch_pluginsebinDATA: @$(NORMAL_UNINSTALL) @list='$(couch_pluginsebin_DATA)'; test -n "$(couch_pluginsebindir)" || list=; \ files=`for p in $$list; do echo $$p; done | sed -e 's|^.*/||'`; \ dir='$(DESTDIR)$(couch_pluginsebindir)'; $(am__uninstall_files_from_dir) tags: TAGS TAGS: ctags: CTAGS CTAGS: 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)$(couch_pluginsebindir)"; 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 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-couch_pluginsebinDATA 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-couch_pluginsebinDATA .MAKE: install-am install-strip .PHONY: all all-am check check-am clean clean-generic clean-libtool \ distclean distclean-generic distclean-libtool distdir dvi \ dvi-am html html-am info info-am install install-am \ install-couch_pluginsebinDATA 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 uninstall uninstall-am \ uninstall-couch_pluginsebinDATA ebin/%.app: src/%.app.src @mkdir -p ebin/ sed -e "s|%version%|@version@|g" \ < $< > $@ ebin/%.beam: src/%.erl $(include_files) @mkdir -p ebin/ $(ERLC) -Wall -I$(top_srcdir)/src -I$(top_srcdir)/src/couchdb \ -o ebin/ $(ERLC_FLAGS) ${TEST} $<; # 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: apache-couchdb-1.6.0/src/Makefile.am0000644000175000001440000004072412332105522017150 0ustar00djcusers00000000000000## Licensed under the Apache License, Version 2.0 (the "License"); you may not ## use this file except in compliance with the License. You may obtain a copy of ## the License at ## ## http://www.apache.org/licenses/LICENSE-2.0 ## ## Unless required by applicable law or agreed to in writing, software ## distributed under the License is distributed on an "AS IS" BASIS, WITHOUT ## WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the ## License for the specific language governing permissions and limitations under ## the License. SUBDIRS = \ couch_dbupdates \ couch_index \ couch_mrview \ couch_plugins \ couch_replicator \ couchdb \ ejson \ erlang-oauth \ etap \ ibrowse \ mochiweb \ snappy \ couchjs-node EXTRA_DIST = \ $(MY_FIRST_COUCHDB_PLUGIN_FILES) \ $(FAUXTON_FILES) MY_FIRST_COUCHDB_PLUGIN_FILES = \ my-first-couchdb-plugin/.gitignore \ my-first-couchdb-plugin/Makefile \ my-first-couchdb-plugin/priv/default.d/my_first_couchdb_plugin.ini \ my-first-couchdb-plugin/README.md \ my-first-couchdb-plugin/src/my_first_couchdb_plugin.app.src \ my-first-couchdb-plugin/src/my_first_couchdb_plugin.erl \ my-first-couchdb-plugin/test/my_first_couchdb_plugin_tests.erl FAUXTON_FILES = \ fauxton/app/addons/activetasks/assets/less/activetasks.less \ fauxton/app/addons/activetasks/base.js \ fauxton/app/addons/activetasks/resources.js \ fauxton/app/addons/activetasks/routes.js \ fauxton/app/addons/activetasks/templates/detail.html \ fauxton/app/addons/activetasks/templates/table.html \ fauxton/app/addons/activetasks/templates/tabledetail.html \ fauxton/app/addons/activetasks/templates/tabs.html \ fauxton/app/addons/activetasks/tests/viewsSpec.js \ fauxton/app/addons/activetasks/views.js \ fauxton/app/addons/auth/base.js \ fauxton/app/addons/auth/resources.js \ fauxton/app/addons/auth/routes.js \ fauxton/app/addons/auth/assets/less/auth.less \ fauxton/app/addons/auth/templates/change_password.html \ fauxton/app/addons/auth/templates/create_admin.html \ fauxton/app/addons/auth/templates/login.html \ fauxton/app/addons/auth/templates/nav_dropdown.html \ fauxton/app/addons/auth/templates/nav_link_title.html \ fauxton/app/addons/auth/templates/noAccess.html \ fauxton/app/addons/auth/test/baseSpec.js \ fauxton/app/addons/compaction/assets/less/compaction.less \ fauxton/app/addons/compaction/templates/compact_view.html \ fauxton/app/addons/compaction/templates/layout.html \ fauxton/app/addons/compaction/base.js \ fauxton/app/addons/compaction/resources.js \ fauxton/app/addons/compaction/routes.js \ fauxton/app/addons/compaction/views.js \ fauxton/app/addons/config/base.js \ fauxton/app/addons/config/resources.js \ fauxton/app/addons/config/views.js \ fauxton/app/addons/config/routes.js \ fauxton/app/addons/config/templates/modal.html \ fauxton/app/addons/config/templates/dashboard.html \ fauxton/app/addons/config/templates/item.html \ fauxton/app/addons/config/tests/resourcesSpec.js \ fauxton/app/addons/contribute/base.js \ fauxton/app/addons/exampleAuth/base.js \ fauxton/app/addons/exampleAuth/templates/noAccess.html \ fauxton/app/addons/logs/base.js \ fauxton/app/addons/logs/resources.js \ fauxton/app/addons/logs/routes.js \ fauxton/app/addons/logs/templates/dashboard.html \ fauxton/app/addons/logs/templates/filterItem.html \ fauxton/app/addons/logs/templates/sidebar.html \ fauxton/app/addons/logs/tests/baseSpec.js \ fauxton/app/addons/logs/tests/resourcesSpec.js \ fauxton/app/addons/permissions/assets/less/permissions.less \ fauxton/app/addons/permissions/base.js \ fauxton/app/addons/permissions/resources.js \ fauxton/app/addons/permissions/routes.js \ fauxton/app/addons/permissions/templates/item.html \ fauxton/app/addons/permissions/templates/permissions.html \ fauxton/app/addons/permissions/templates/section.html \ fauxton/app/addons/permissions/tests/resourceSpec.js \ fauxton/app/addons/permissions/tests/viewsSpec.js \ fauxton/app/addons/permissions/views.js \ fauxton/app/addons/plugins/base.js \ fauxton/app/addons/plugins/resources.js \ fauxton/app/addons/plugins/routes.js \ fauxton/app/addons/plugins/templates/plugins.html \ fauxton/app/addons/replication/assets/less/replication.less \ fauxton/app/addons/replication/base.js \ fauxton/app/addons/replication/resources.js \ fauxton/app/addons/replication/route.js \ fauxton/app/addons/replication/templates/form.html \ fauxton/app/addons/replication/templates/progress.html \ fauxton/app/addons/replication/tests/replicationSpec.js \ fauxton/app/addons/replication/views.js \ fauxton/app/addons/stats/assets/less/stats.less \ fauxton/app/addons/stats/base.js \ fauxton/app/addons/stats/resources.js \ fauxton/app/addons/stats/routes.js \ fauxton/app/addons/stats/templates/by_method.html \ fauxton/app/addons/stats/templates/pie_table.html \ fauxton/app/addons/stats/templates/stats.html \ fauxton/app/addons/stats/templates/statselect.html \ fauxton/app/addons/stats/views.js \ fauxton/app/addons/styletests/base.js \ fauxton/app/addons/styletests/resources.js \ fauxton/app/addons/styletests/routes.js \ fauxton/app/addons/styletests/views.js \ fauxton/app/addons/styletests/templates/theme.html \ fauxton/app/addons/verifyinstall/views.js \ fauxton/app/addons/verifyinstall/resources.js \ fauxton/app/addons/verifyinstall/base.js \ fauxton/app/addons/verifyinstall/routes.js \ fauxton/app/addons/verifyinstall/templates/main.html \ fauxton/app/addons/verifyinstall/assets/less/verifyinstall.less \ fauxton/app/core/api.js \ fauxton/app/core/auth.js \ fauxton/app/core/base.js \ fauxton/app/core/couchdbSession.js \ fauxton/app/core/layout.js \ fauxton/app/core/routeObject.js \ fauxton/app/core/router.js \ fauxton/app/core/utils.js \ fauxton/app/core/tests/layoutSpec.js \ fauxton/app/core/tests/routeObjectSpec.js \ fauxton/app/app.js \ fauxton/app/config.js \ fauxton/app/helpers.js \ fauxton/app/initialize.js.underscore \ fauxton/app/load_addons.js.underscore \ fauxton/app/main.js \ fauxton/app/addons/databases/base.js \ fauxton/app/addons/databases/resources.js \ fauxton/app/addons/databases/routes.js \ fauxton/app/addons/databases/views.js \ fauxton/app/addons/databases/tests/resourcesSpec.js \ fauxton/app/addons/documents/base.js \ fauxton/app/addons/documents/resources.js \ fauxton/app/addons/documents/routes.js \ fauxton/app/addons/documents/tests/resourcesSpec.js \ fauxton/app/addons/documents/views.js \ fauxton/app/addons/fauxton/base.js \ fauxton/app/addons/fauxton/components.js \ fauxton/app/addons/fauxton/resizeColumns.js \ fauxton/app/addons/fauxton/tests/baseSpec.js \ fauxton/app/addons/fauxton/tests/navbarSpec.js \ fauxton/app/addons/fauxton/tests/paginateSpec.js \ fauxton/app/addons/pouchdb/base.js \ fauxton/app/addons/pouchdb/pouch.collate.js \ fauxton/app/addons/pouchdb/pouchdb.mapreduce.js \ fauxton/app/addons/documents/assets/less/documents.less \ fauxton/app/addons/databases/templates/item.html \ fauxton/app/addons/databases/templates/list.html \ fauxton/app/addons/databases/templates/newdatabase.html \ fauxton/app/addons/databases/templates/sidebar.html \ fauxton/app/addons/documents/templates/advanced_options.html \ fauxton/app/addons/documents/templates/all_docs_item.html \ fauxton/app/addons/documents/templates/all_docs_layout.html \ fauxton/app/addons/documents/templates/all_docs_list.html \ fauxton/app/addons/documents/templates/all_docs_number.html \ fauxton/app/addons/documents/templates/changes.html \ fauxton/app/addons/documents/templates/ddoc_info.html \ fauxton/app/addons/documents/templates/delete_database_modal.html \ fauxton/app/addons/documents/templates/design_doc_selector.html \ fauxton/app/addons/documents/templates/doc.html \ fauxton/app/addons/documents/templates/doc_field_editor.html \ fauxton/app/addons/documents/templates/doc_field_editor_tabs.html \ fauxton/app/addons/documents/templates/duplicate_doc_modal.html \ fauxton/app/addons/documents/templates/edit_tools.html \ fauxton/app/addons/documents/templates/index_menu_item.html \ fauxton/app/addons/documents/templates/index_row_docular.html \ fauxton/app/addons/documents/templates/index_row_tabular.html \ fauxton/app/addons/documents/templates/jumpdoc.html \ fauxton/app/addons/documents/templates/search.html \ fauxton/app/addons/documents/templates/sidebar.html \ fauxton/app/addons/documents/templates/upload_modal.html \ fauxton/app/addons/documents/templates/view_editor.html \ fauxton/app/addons/documents/tests/resourcesSpec.js \ fauxton/app/addons/fauxton/templates/api_bar.html \ fauxton/app/addons/fauxton/templates/breadcrumbs.html \ fauxton/app/addons/fauxton/templates/footer.html \ fauxton/app/addons/fauxton/templates/index_pagination.html \ fauxton/app/addons/fauxton/templates/nav_bar.html \ fauxton/app/addons/fauxton/templates/notification.html \ fauxton/app/addons/fauxton/templates/pagination.html \ fauxton/app/templates/layouts/one_pane.html \ fauxton/app/templates/layouts/two_pane.html \ fauxton/app/templates/layouts/with_sidebar.html \ fauxton/app/templates/layouts/with_tabs.html \ fauxton/app/templates/layouts/with_tabs_sidebar.html \ fauxton/assets/css/nv.d3.css \ fauxton/assets/img/couchdb-site.png \ fauxton/assets/img/couchdblogo.png \ fauxton/assets/img/fontawesome-webfont.eot \ fauxton/assets/img/fontawesome-webfont.svg \ fauxton/assets/img/fontawesome-webfont.ttf \ fauxton/assets/img/fontawesome-webfont.woff \ fauxton/assets/img/FontAwesome.otf \ fauxton/assets/img/fontcustom_fauxton.eot \ fauxton/assets/img/fontcustom_fauxton.svg \ fauxton/assets/img/fontcustom_fauxton.ttf \ fauxton/assets/img/fontcustom_fauxton.woff \ fauxton/assets/img/glyphicons-halflings-white.png \ fauxton/assets/img/glyphicons-halflings.png \ fauxton/assets/img/linen.png \ fauxton/assets/img/loader.gif \ fauxton/assets/img/minilogo.png \ fauxton/assets/index.underscore \ fauxton/assets/js/libs/ace/ace.js \ fauxton/assets/js/libs/ace/ext-static_highlight.js \ fauxton/assets/js/libs/ace/ext-chromevox.js \ fauxton/assets/js/libs/ace/ext-statusbar.js \ fauxton/assets/js/libs/ace/ext-elastic_tabstops_lite.js \ fauxton/assets/js/libs/ace/ext-textarea.js \ fauxton/assets/js/libs/ace/ext-emmet.js \ fauxton/assets/js/libs/ace/ext-themelist.js \ fauxton/assets/js/libs/ace/ext-keybinding_menu.js \ fauxton/assets/js/libs/ace/ext-whitespace.js \ fauxton/assets/js/libs/ace/ext-language_tools.js \ fauxton/assets/js/libs/ace/mode-javascript.js \ fauxton/assets/js/libs/ace/ext-modelist.js \ fauxton/assets/js/libs/ace/mode-json.js \ fauxton/assets/js/libs/ace/ext-old_ie.js \ fauxton/assets/js/libs/ace/mode-jsoniq.js \ fauxton/assets/js/libs/ace/ext-options.js \ fauxton/assets/js/libs/ace/ext-searchbox.js \ fauxton/assets/js/libs/ace/theme-crimson_editor.js \ fauxton/assets/js/libs/ace/ext-settings_menu.js \ fauxton/assets/js/libs/ace/worker-javascript.js \ fauxton/assets/js/libs/ace/ext-spellcheck.js \ fauxton/assets/js/libs/ace/worker-json.js \ fauxton/assets/js/libs/ace/ext-split.js \ fauxton/assets/js/libs/ace/snippets/javascript.js \ fauxton/assets/js/libs/ace/snippets/json.js \ fauxton/assets/js/libs/ace/snippets/jsoniq.js \ fauxton/assets/js/libs/almond.js \ fauxton/assets/js/libs/backbone.js \ fauxton/assets/js/libs/bootstrap.js \ fauxton/assets/js/libs/d3.js \ fauxton/assets/js/libs/jquery.js \ fauxton/assets/js/libs/lodash.js \ fauxton/assets/js/libs/nv.d3.js \ fauxton/assets/js/libs/require.js \ fauxton/assets/js/libs/spin.min.js \ fauxton/assets/js/plugins/backbone.layoutmanager.js \ fauxton/assets/js/plugins/cloudant.pagingcollection.js \ fauxton/assets/js/plugins/jquery.form.js \ fauxton/assets/js/plugins/prettify.js \ fauxton/assets/js/plugins/beautify.js \ fauxton/assets/js/plugins/zeroclipboard/ZeroClipboard.js \ fauxton/assets/js/plugins/zeroclipboard/ZeroClipboard.swf \ fauxton/assets/less/bootstrap/accordion.less \ fauxton/assets/less/bootstrap/alerts.less \ fauxton/assets/less/bootstrap/bootstrap.less \ fauxton/assets/less/bootstrap/breadcrumbs.less \ fauxton/assets/less/bootstrap/button-groups.less \ fauxton/assets/less/bootstrap/buttons.less \ fauxton/assets/less/bootstrap/carousel.less \ fauxton/assets/less/bootstrap/close.less \ fauxton/assets/less/bootstrap/code.less \ fauxton/assets/less/bootstrap/component-animations.less \ fauxton/assets/less/bootstrap/dropdowns.less \ fauxton/assets/less/bootstrap/font-awesome/bootstrap.less \ fauxton/assets/less/bootstrap/font-awesome/core.less \ fauxton/assets/less/bootstrap/font-awesome/extras.less \ fauxton/assets/less/bootstrap/font-awesome/font-awesome-ie7.less \ fauxton/assets/less/bootstrap/font-awesome/font-awesome.less \ fauxton/assets/less/bootstrap/font-awesome/icons.less \ fauxton/assets/less/bootstrap/font-awesome/mixins.less \ fauxton/assets/less/bootstrap/font-awesome/path.less \ fauxton/assets/less/bootstrap/font-awesome/variables.less \ fauxton/assets/less/bootstrap/forms.less \ fauxton/assets/less/bootstrap/grid.less \ fauxton/assets/less/bootstrap/hero-unit.less \ fauxton/assets/less/bootstrap/labels-badges.less \ fauxton/assets/less/bootstrap/layouts.less \ fauxton/assets/less/bootstrap/media.less \ fauxton/assets/less/bootstrap/mixins.less \ fauxton/assets/less/bootstrap/modals.less \ fauxton/assets/less/bootstrap/navbar.less \ fauxton/assets/less/bootstrap/navs.less \ fauxton/assets/less/bootstrap/pager.less \ fauxton/assets/less/bootstrap/pagination.less \ fauxton/assets/less/bootstrap/popovers.less \ fauxton/assets/less/bootstrap/progress-bars.less \ fauxton/assets/less/bootstrap/reset.less \ fauxton/assets/less/bootstrap/responsive-1200px-min.less \ fauxton/assets/less/bootstrap/responsive-767px-max.less \ fauxton/assets/less/bootstrap/responsive-768px-979px.less \ fauxton/assets/less/bootstrap/responsive-navbar.less \ fauxton/assets/less/bootstrap/responsive-utilities.less \ fauxton/assets/less/bootstrap/responsive.less \ fauxton/assets/less/bootstrap/scaffolding.less \ fauxton/assets/less/bootstrap/sprites.less \ fauxton/assets/less/bootstrap/tables.less \ fauxton/assets/less/bootstrap/tests/buttons.html \ fauxton/assets/less/bootstrap/tests/css-tests.css \ fauxton/assets/less/bootstrap/thumbnails.less \ fauxton/assets/less/bootstrap/tooltip.less \ fauxton/assets/less/bootstrap/type.less \ fauxton/assets/less/bootstrap/utilities.less \ fauxton/assets/less/bootstrap/variables.less \ fauxton/assets/less/bootstrap/wells.less \ fauxton/app/addons/config/assets/less/config.less \ fauxton/assets/less/couchdb.less \ fauxton/app/addons/databases/assets/less/databases.less \ fauxton/assets/less/fauxton.less \ fauxton/assets/less/icons.less \ fauxton/app/addons/logs/assets/less/logs.less \ fauxton/assets/less/prettyprint.less \ fauxton/assets/less/variables.less \ fauxton/bin/grunt \ fauxton/couchapp.js \ fauxton/extensions.md \ fauxton/favicon.ico \ fauxton/Gruntfile.js \ fauxton/index.html \ fauxton/package.json \ fauxton/readme.md \ fauxton/settings.json.default \ fauxton/settings.json.dev \ fauxton/settings.json.sample_external \ fauxton/tasks/addon/rename.json \ fauxton/tasks/addon/root/base.js.underscore \ fauxton/tasks/addon/root/resources.js.underscore \ fauxton/tasks/addon/root/routes.js.underscore \ fauxton/tasks/addon/template.js \ fauxton/tasks/couchserver.js \ fauxton/tasks/fauxton.js \ fauxton/tasks/helper.js \ fauxton/test/mocha/chai.js \ fauxton/test/mocha/mocha.css \ fauxton/test/mocha/mocha.js \ fauxton/test/mocha/sinon-chai.js \ fauxton/test/mocha/sinon.js \ fauxton/test/mocha/testUtils.js \ fauxton/test/runner.html \ fauxton/test/test.config.underscore \ fauxton/TODO.md \ fauxton/CONTRIBUTING.md \ fauxton/writing_addons.md apache-couchdb-1.6.0/src/Makefile.in0000644000175000001440000010573712332105550017170 0ustar00djcusers00000000000000# Makefile.in generated by automake 1.11.6 from Makefile.am. # @configure_input@ # Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, # 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011 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__make_dryrun = \ { \ am__dry=no; \ case $$MAKEFLAGS in \ *\\[\ \ ]*) \ echo 'am--echo: ; @echo "AM" OK' | $(MAKE) -f - 2>/dev/null \ | grep '^AM OK$$' >/dev/null || am__dry=yes;; \ *) \ for am__flg in $$MAKEFLAGS; do \ case $$am__flg in \ *=*|--*) ;; \ *n*) am__dry=yes; break;; \ esac; \ done;; \ esac; \ test $$am__dry = yes; \ } 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.am $(srcdir)/Makefile.in ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 am__aclocal_m4_deps = $(top_srcdir)/m4/libtool.m4 \ $(top_srcdir)/m4/ltoptions.m4 $(top_srcdir)/m4/ltsugar.m4 \ $(top_srcdir)/m4/ltversion.m4 $(top_srcdir)/m4/lt~obsolete.m4 \ $(top_srcdir)/acinclude.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 \ $(top_builddir)/src/snappy/google-snappy/config.h CONFIG_CLEAN_FILES = CONFIG_CLEAN_VPATH_FILES = SOURCES = DIST_SOURCES = RECURSIVE_TARGETS = all-recursive check-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 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=) \ $(RECURSIVE_CLEAN_TARGETS:-recursive=) tags TAGS ctags CTAGS \ distdir 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@ AMTAR = @AMTAR@ AR = @AR@ AS = @AS@ AUTOCONF = @AUTOCONF@ AUTOHEADER = @AUTOHEADER@ AUTOMAKE = @AUTOMAKE@ AWK = @AWK@ CC = @CC@ CCDEPMODE = @CCDEPMODE@ CFLAGS = @CFLAGS@ CPP = @CPP@ CPPFLAGS = @CPPFLAGS@ CURL_CFLAGS = @CURL_CFLAGS@ CURL_CONFIG = @CURL_CONFIG@ CURL_LIBS = @CURL_LIBS@ CXX = @CXX@ CXXCPP = @CXXCPP@ CXXDEPMODE = @CXXDEPMODE@ CXXFLAGS = @CXXFLAGS@ CYGPATH_W = @CYGPATH_W@ DEFS = @DEFS@ DEPDIR = @DEPDIR@ DLLTOOL = @DLLTOOL@ DSYMUTIL = @DSYMUTIL@ DUMPBIN = @DUMPBIN@ ECHO_C = @ECHO_C@ ECHO_N = @ECHO_N@ ECHO_T = @ECHO_T@ EGREP = @EGREP@ ERL = @ERL@ ERLANG_FLAGS = @ERLANG_FLAGS@ ERLC = @ERLC@ ERLC_FLAGS = @ERLC_FLAGS@ ESCRIPT = @ESCRIPT@ EXEEXT = @EXEEXT@ FGREP = @FGREP@ FLAGS = @FLAGS@ GREP = @GREP@ HAS_HELP2MAN = @HAS_HELP2MAN@ HAS_INSTALLINFO = @HAS_INSTALLINFO@ HAS_MAKEINFO = @HAS_MAKEINFO@ HAS_PDFLATEX = @HAS_PDFLATEX@ HAS_SPHINX_BUILD = @HAS_SPHINX_BUILD@ ICU_BIN = @ICU_BIN@ ICU_CFLAGS = @ICU_CFLAGS@ ICU_CONFIG = @ICU_CONFIG@ ICU_CPPFLAGS = @ICU_CPPFLAGS@ ICU_CXXFLAGS = @ICU_CXXFLAGS@ ICU_LIBS = @ICU_LIBS@ INNO_COMPILER_EXECUTABLE = @INNO_COMPILER_EXECUTABLE@ INSTALL = @INSTALL@ INSTALL_DATA = @INSTALL_DATA@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ INSTALL_SCRIPT = @INSTALL_SCRIPT@ INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ JS_CFLAGS = @JS_CFLAGS@ JS_LIBS = @JS_LIBS@ JS_LIB_BINARY = @JS_LIB_BINARY@ LD = @LD@ LDFLAGS = @LDFLAGS@ LIBOBJS = @LIBOBJS@ LIBS = @LIBS@ LIBTOOL = @LIBTOOL@ LIPO = @LIPO@ LN_S = @LN_S@ LTLIBOBJS = @LTLIBOBJS@ MAKEINFO = @MAKEINFO@ MANIFEST_TOOL = @MANIFEST_TOOL@ MKDIR_P = @MKDIR_P@ NM = @NM@ NMEDIT = @NMEDIT@ OBJDUMP = @OBJDUMP@ OBJEXT = @OBJEXT@ OTOOL = @OTOOL@ OTOOL64 = @OTOOL64@ PACKAGE = @PACKAGE@ PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ PACKAGE_NAME = @PACKAGE_NAME@ PACKAGE_STRING = @PACKAGE_STRING@ PACKAGE_TARNAME = @PACKAGE_TARNAME@ PACKAGE_URL = @PACKAGE_URL@ PACKAGE_VERSION = @PACKAGE_VERSION@ PATH_SEPARATOR = @PATH_SEPARATOR@ PKG_CONFIG = @PKG_CONFIG@ PKG_CONFIG_LIBDIR = @PKG_CONFIG_LIBDIR@ PKG_CONFIG_PATH = @PKG_CONFIG_PATH@ RANLIB = @RANLIB@ SED = @SED@ SET_MAKE = @SET_MAKE@ SHELL = @SHELL@ SNAPPY_MAJOR = @SNAPPY_MAJOR@ SNAPPY_MINOR = @SNAPPY_MINOR@ SNAPPY_PATCHLEVEL = @SNAPPY_PATCHLEVEL@ STRIP = @STRIP@ VERSION = @VERSION@ 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@ ac_cv_have_stddef_h = @ac_cv_have_stddef_h@ ac_cv_have_stdint_h = @ac_cv_have_stdint_h@ am__include = @am__include@ am__leading_dot = @am__leading_dot@ am__quote = @am__quote@ am__tar = @am__tar@ am__untar = @am__untar@ bindir = @bindir@ bug_uri = @bug_uri@ 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@ dvidir = @dvidir@ erlangbin = @erlangbin@ erlangversion = @erlangversion@ exec_prefix = @exec_prefix@ host = @host@ host_alias = @host_alias@ host_cpu = @host_cpu@ host_os = @host_os@ host_vendor = @host_vendor@ htmldir = @htmldir@ includedir = @includedir@ infodir = @infodir@ initdir = @initdir@ install_sh = @install_sh@ launchddir = @launchddir@ libdir = @libdir@ libexecdir = @libexecdir@ localconfdir = @localconfdir@ localdatadir = @localdatadir@ localdocdir = @localdocdir@ localedir = @localedir@ localerlanglibdir = @localerlanglibdir@ locallibbindir = @locallibbindir@ locallibdir = @locallibdir@ localstatedir = @localstatedir@ localstatelibdir = @localstatelibdir@ localstatelogdir = @localstatelogdir@ localstaterundir = @localstaterundir@ mandir = @mandir@ mkdir_p = @mkdir_p@ msvc_redist_dir = @msvc_redist_dir@ msvc_redist_name = @msvc_redist_name@ oldincludedir = @oldincludedir@ openssl_bin_dir = @openssl_bin_dir@ otp_release = @otp_release@ package_author_address = @package_author_address@ package_author_name = @package_author_name@ package_identifier = @package_identifier@ package_name = @package_name@ package_tarname = @package_tarname@ 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@ version = @version@ version_major = @version_major@ version_minor = @version_minor@ version_release = @version_release@ version_revision = @version_revision@ version_stage = @version_stage@ SUBDIRS = \ couch_dbupdates \ couch_index \ couch_mrview \ couch_plugins \ couch_replicator \ couchdb \ ejson \ erlang-oauth \ etap \ ibrowse \ mochiweb \ snappy \ couchjs-node EXTRA_DIST = \ $(MY_FIRST_COUCHDB_PLUGIN_FILES) \ $(FAUXTON_FILES) MY_FIRST_COUCHDB_PLUGIN_FILES = \ my-first-couchdb-plugin/.gitignore \ my-first-couchdb-plugin/Makefile \ my-first-couchdb-plugin/priv/default.d/my_first_couchdb_plugin.ini \ my-first-couchdb-plugin/README.md \ my-first-couchdb-plugin/src/my_first_couchdb_plugin.app.src \ my-first-couchdb-plugin/src/my_first_couchdb_plugin.erl \ my-first-couchdb-plugin/test/my_first_couchdb_plugin_tests.erl FAUXTON_FILES = \ fauxton/app/addons/activetasks/assets/less/activetasks.less \ fauxton/app/addons/activetasks/base.js \ fauxton/app/addons/activetasks/resources.js \ fauxton/app/addons/activetasks/routes.js \ fauxton/app/addons/activetasks/templates/detail.html \ fauxton/app/addons/activetasks/templates/table.html \ fauxton/app/addons/activetasks/templates/tabledetail.html \ fauxton/app/addons/activetasks/templates/tabs.html \ fauxton/app/addons/activetasks/tests/viewsSpec.js \ fauxton/app/addons/activetasks/views.js \ fauxton/app/addons/auth/base.js \ fauxton/app/addons/auth/resources.js \ fauxton/app/addons/auth/routes.js \ fauxton/app/addons/auth/assets/less/auth.less \ fauxton/app/addons/auth/templates/change_password.html \ fauxton/app/addons/auth/templates/create_admin.html \ fauxton/app/addons/auth/templates/login.html \ fauxton/app/addons/auth/templates/nav_dropdown.html \ fauxton/app/addons/auth/templates/nav_link_title.html \ fauxton/app/addons/auth/templates/noAccess.html \ fauxton/app/addons/auth/test/baseSpec.js \ fauxton/app/addons/compaction/assets/less/compaction.less \ fauxton/app/addons/compaction/templates/compact_view.html \ fauxton/app/addons/compaction/templates/layout.html \ fauxton/app/addons/compaction/base.js \ fauxton/app/addons/compaction/resources.js \ fauxton/app/addons/compaction/routes.js \ fauxton/app/addons/compaction/views.js \ fauxton/app/addons/config/base.js \ fauxton/app/addons/config/resources.js \ fauxton/app/addons/config/views.js \ fauxton/app/addons/config/routes.js \ fauxton/app/addons/config/templates/modal.html \ fauxton/app/addons/config/templates/dashboard.html \ fauxton/app/addons/config/templates/item.html \ fauxton/app/addons/config/tests/resourcesSpec.js \ fauxton/app/addons/contribute/base.js \ fauxton/app/addons/exampleAuth/base.js \ fauxton/app/addons/exampleAuth/templates/noAccess.html \ fauxton/app/addons/logs/base.js \ fauxton/app/addons/logs/resources.js \ fauxton/app/addons/logs/routes.js \ fauxton/app/addons/logs/templates/dashboard.html \ fauxton/app/addons/logs/templates/filterItem.html \ fauxton/app/addons/logs/templates/sidebar.html \ fauxton/app/addons/logs/tests/baseSpec.js \ fauxton/app/addons/logs/tests/resourcesSpec.js \ fauxton/app/addons/permissions/assets/less/permissions.less \ fauxton/app/addons/permissions/base.js \ fauxton/app/addons/permissions/resources.js \ fauxton/app/addons/permissions/routes.js \ fauxton/app/addons/permissions/templates/item.html \ fauxton/app/addons/permissions/templates/permissions.html \ fauxton/app/addons/permissions/templates/section.html \ fauxton/app/addons/permissions/tests/resourceSpec.js \ fauxton/app/addons/permissions/tests/viewsSpec.js \ fauxton/app/addons/permissions/views.js \ fauxton/app/addons/plugins/base.js \ fauxton/app/addons/plugins/resources.js \ fauxton/app/addons/plugins/routes.js \ fauxton/app/addons/plugins/templates/plugins.html \ fauxton/app/addons/replication/assets/less/replication.less \ fauxton/app/addons/replication/base.js \ fauxton/app/addons/replication/resources.js \ fauxton/app/addons/replication/route.js \ fauxton/app/addons/replication/templates/form.html \ fauxton/app/addons/replication/templates/progress.html \ fauxton/app/addons/replication/tests/replicationSpec.js \ fauxton/app/addons/replication/views.js \ fauxton/app/addons/stats/assets/less/stats.less \ fauxton/app/addons/stats/base.js \ fauxton/app/addons/stats/resources.js \ fauxton/app/addons/stats/routes.js \ fauxton/app/addons/stats/templates/by_method.html \ fauxton/app/addons/stats/templates/pie_table.html \ fauxton/app/addons/stats/templates/stats.html \ fauxton/app/addons/stats/templates/statselect.html \ fauxton/app/addons/stats/views.js \ fauxton/app/addons/styletests/base.js \ fauxton/app/addons/styletests/resources.js \ fauxton/app/addons/styletests/routes.js \ fauxton/app/addons/styletests/views.js \ fauxton/app/addons/styletests/templates/theme.html \ fauxton/app/addons/verifyinstall/views.js \ fauxton/app/addons/verifyinstall/resources.js \ fauxton/app/addons/verifyinstall/base.js \ fauxton/app/addons/verifyinstall/routes.js \ fauxton/app/addons/verifyinstall/templates/main.html \ fauxton/app/addons/verifyinstall/assets/less/verifyinstall.less \ fauxton/app/core/api.js \ fauxton/app/core/auth.js \ fauxton/app/core/base.js \ fauxton/app/core/couchdbSession.js \ fauxton/app/core/layout.js \ fauxton/app/core/routeObject.js \ fauxton/app/core/router.js \ fauxton/app/core/utils.js \ fauxton/app/core/tests/layoutSpec.js \ fauxton/app/core/tests/routeObjectSpec.js \ fauxton/app/app.js \ fauxton/app/config.js \ fauxton/app/helpers.js \ fauxton/app/initialize.js.underscore \ fauxton/app/load_addons.js.underscore \ fauxton/app/main.js \ fauxton/app/addons/databases/base.js \ fauxton/app/addons/databases/resources.js \ fauxton/app/addons/databases/routes.js \ fauxton/app/addons/databases/views.js \ fauxton/app/addons/databases/tests/resourcesSpec.js \ fauxton/app/addons/documents/base.js \ fauxton/app/addons/documents/resources.js \ fauxton/app/addons/documents/routes.js \ fauxton/app/addons/documents/tests/resourcesSpec.js \ fauxton/app/addons/documents/views.js \ fauxton/app/addons/fauxton/base.js \ fauxton/app/addons/fauxton/components.js \ fauxton/app/addons/fauxton/resizeColumns.js \ fauxton/app/addons/fauxton/tests/baseSpec.js \ fauxton/app/addons/fauxton/tests/navbarSpec.js \ fauxton/app/addons/fauxton/tests/paginateSpec.js \ fauxton/app/addons/pouchdb/base.js \ fauxton/app/addons/pouchdb/pouch.collate.js \ fauxton/app/addons/pouchdb/pouchdb.mapreduce.js \ fauxton/app/addons/documents/assets/less/documents.less \ fauxton/app/addons/databases/templates/item.html \ fauxton/app/addons/databases/templates/list.html \ fauxton/app/addons/databases/templates/newdatabase.html \ fauxton/app/addons/databases/templates/sidebar.html \ fauxton/app/addons/documents/templates/advanced_options.html \ fauxton/app/addons/documents/templates/all_docs_item.html \ fauxton/app/addons/documents/templates/all_docs_layout.html \ fauxton/app/addons/documents/templates/all_docs_list.html \ fauxton/app/addons/documents/templates/all_docs_number.html \ fauxton/app/addons/documents/templates/changes.html \ fauxton/app/addons/documents/templates/ddoc_info.html \ fauxton/app/addons/documents/templates/delete_database_modal.html \ fauxton/app/addons/documents/templates/design_doc_selector.html \ fauxton/app/addons/documents/templates/doc.html \ fauxton/app/addons/documents/templates/doc_field_editor.html \ fauxton/app/addons/documents/templates/doc_field_editor_tabs.html \ fauxton/app/addons/documents/templates/duplicate_doc_modal.html \ fauxton/app/addons/documents/templates/edit_tools.html \ fauxton/app/addons/documents/templates/index_menu_item.html \ fauxton/app/addons/documents/templates/index_row_docular.html \ fauxton/app/addons/documents/templates/index_row_tabular.html \ fauxton/app/addons/documents/templates/jumpdoc.html \ fauxton/app/addons/documents/templates/search.html \ fauxton/app/addons/documents/templates/sidebar.html \ fauxton/app/addons/documents/templates/upload_modal.html \ fauxton/app/addons/documents/templates/view_editor.html \ fauxton/app/addons/documents/tests/resourcesSpec.js \ fauxton/app/addons/fauxton/templates/api_bar.html \ fauxton/app/addons/fauxton/templates/breadcrumbs.html \ fauxton/app/addons/fauxton/templates/footer.html \ fauxton/app/addons/fauxton/templates/index_pagination.html \ fauxton/app/addons/fauxton/templates/nav_bar.html \ fauxton/app/addons/fauxton/templates/notification.html \ fauxton/app/addons/fauxton/templates/pagination.html \ fauxton/app/templates/layouts/one_pane.html \ fauxton/app/templates/layouts/two_pane.html \ fauxton/app/templates/layouts/with_sidebar.html \ fauxton/app/templates/layouts/with_tabs.html \ fauxton/app/templates/layouts/with_tabs_sidebar.html \ fauxton/assets/css/nv.d3.css \ fauxton/assets/img/couchdb-site.png \ fauxton/assets/img/couchdblogo.png \ fauxton/assets/img/fontawesome-webfont.eot \ fauxton/assets/img/fontawesome-webfont.svg \ fauxton/assets/img/fontawesome-webfont.ttf \ fauxton/assets/img/fontawesome-webfont.woff \ fauxton/assets/img/FontAwesome.otf \ fauxton/assets/img/fontcustom_fauxton.eot \ fauxton/assets/img/fontcustom_fauxton.svg \ fauxton/assets/img/fontcustom_fauxton.ttf \ fauxton/assets/img/fontcustom_fauxton.woff \ fauxton/assets/img/glyphicons-halflings-white.png \ fauxton/assets/img/glyphicons-halflings.png \ fauxton/assets/img/linen.png \ fauxton/assets/img/loader.gif \ fauxton/assets/img/minilogo.png \ fauxton/assets/index.underscore \ fauxton/assets/js/libs/ace/ace.js \ fauxton/assets/js/libs/ace/ext-static_highlight.js \ fauxton/assets/js/libs/ace/ext-chromevox.js \ fauxton/assets/js/libs/ace/ext-statusbar.js \ fauxton/assets/js/libs/ace/ext-elastic_tabstops_lite.js \ fauxton/assets/js/libs/ace/ext-textarea.js \ fauxton/assets/js/libs/ace/ext-emmet.js \ fauxton/assets/js/libs/ace/ext-themelist.js \ fauxton/assets/js/libs/ace/ext-keybinding_menu.js \ fauxton/assets/js/libs/ace/ext-whitespace.js \ fauxton/assets/js/libs/ace/ext-language_tools.js \ fauxton/assets/js/libs/ace/mode-javascript.js \ fauxton/assets/js/libs/ace/ext-modelist.js \ fauxton/assets/js/libs/ace/mode-json.js \ fauxton/assets/js/libs/ace/ext-old_ie.js \ fauxton/assets/js/libs/ace/mode-jsoniq.js \ fauxton/assets/js/libs/ace/ext-options.js \ fauxton/assets/js/libs/ace/ext-searchbox.js \ fauxton/assets/js/libs/ace/theme-crimson_editor.js \ fauxton/assets/js/libs/ace/ext-settings_menu.js \ fauxton/assets/js/libs/ace/worker-javascript.js \ fauxton/assets/js/libs/ace/ext-spellcheck.js \ fauxton/assets/js/libs/ace/worker-json.js \ fauxton/assets/js/libs/ace/ext-split.js \ fauxton/assets/js/libs/ace/snippets/javascript.js \ fauxton/assets/js/libs/ace/snippets/json.js \ fauxton/assets/js/libs/ace/snippets/jsoniq.js \ fauxton/assets/js/libs/almond.js \ fauxton/assets/js/libs/backbone.js \ fauxton/assets/js/libs/bootstrap.js \ fauxton/assets/js/libs/d3.js \ fauxton/assets/js/libs/jquery.js \ fauxton/assets/js/libs/lodash.js \ fauxton/assets/js/libs/nv.d3.js \ fauxton/assets/js/libs/require.js \ fauxton/assets/js/libs/spin.min.js \ fauxton/assets/js/plugins/backbone.layoutmanager.js \ fauxton/assets/js/plugins/cloudant.pagingcollection.js \ fauxton/assets/js/plugins/jquery.form.js \ fauxton/assets/js/plugins/prettify.js \ fauxton/assets/js/plugins/beautify.js \ fauxton/assets/js/plugins/zeroclipboard/ZeroClipboard.js \ fauxton/assets/js/plugins/zeroclipboard/ZeroClipboard.swf \ fauxton/assets/less/bootstrap/accordion.less \ fauxton/assets/less/bootstrap/alerts.less \ fauxton/assets/less/bootstrap/bootstrap.less \ fauxton/assets/less/bootstrap/breadcrumbs.less \ fauxton/assets/less/bootstrap/button-groups.less \ fauxton/assets/less/bootstrap/buttons.less \ fauxton/assets/less/bootstrap/carousel.less \ fauxton/assets/less/bootstrap/close.less \ fauxton/assets/less/bootstrap/code.less \ fauxton/assets/less/bootstrap/component-animations.less \ fauxton/assets/less/bootstrap/dropdowns.less \ fauxton/assets/less/bootstrap/font-awesome/bootstrap.less \ fauxton/assets/less/bootstrap/font-awesome/core.less \ fauxton/assets/less/bootstrap/font-awesome/extras.less \ fauxton/assets/less/bootstrap/font-awesome/font-awesome-ie7.less \ fauxton/assets/less/bootstrap/font-awesome/font-awesome.less \ fauxton/assets/less/bootstrap/font-awesome/icons.less \ fauxton/assets/less/bootstrap/font-awesome/mixins.less \ fauxton/assets/less/bootstrap/font-awesome/path.less \ fauxton/assets/less/bootstrap/font-awesome/variables.less \ fauxton/assets/less/bootstrap/forms.less \ fauxton/assets/less/bootstrap/grid.less \ fauxton/assets/less/bootstrap/hero-unit.less \ fauxton/assets/less/bootstrap/labels-badges.less \ fauxton/assets/less/bootstrap/layouts.less \ fauxton/assets/less/bootstrap/media.less \ fauxton/assets/less/bootstrap/mixins.less \ fauxton/assets/less/bootstrap/modals.less \ fauxton/assets/less/bootstrap/navbar.less \ fauxton/assets/less/bootstrap/navs.less \ fauxton/assets/less/bootstrap/pager.less \ fauxton/assets/less/bootstrap/pagination.less \ fauxton/assets/less/bootstrap/popovers.less \ fauxton/assets/less/bootstrap/progress-bars.less \ fauxton/assets/less/bootstrap/reset.less \ fauxton/assets/less/bootstrap/responsive-1200px-min.less \ fauxton/assets/less/bootstrap/responsive-767px-max.less \ fauxton/assets/less/bootstrap/responsive-768px-979px.less \ fauxton/assets/less/bootstrap/responsive-navbar.less \ fauxton/assets/less/bootstrap/responsive-utilities.less \ fauxton/assets/less/bootstrap/responsive.less \ fauxton/assets/less/bootstrap/scaffolding.less \ fauxton/assets/less/bootstrap/sprites.less \ fauxton/assets/less/bootstrap/tables.less \ fauxton/assets/less/bootstrap/tests/buttons.html \ fauxton/assets/less/bootstrap/tests/css-tests.css \ fauxton/assets/less/bootstrap/thumbnails.less \ fauxton/assets/less/bootstrap/tooltip.less \ fauxton/assets/less/bootstrap/type.less \ fauxton/assets/less/bootstrap/utilities.less \ fauxton/assets/less/bootstrap/variables.less \ fauxton/assets/less/bootstrap/wells.less \ fauxton/app/addons/config/assets/less/config.less \ fauxton/assets/less/couchdb.less \ fauxton/app/addons/databases/assets/less/databases.less \ fauxton/assets/less/fauxton.less \ fauxton/assets/less/icons.less \ fauxton/app/addons/logs/assets/less/logs.less \ fauxton/assets/less/prettyprint.less \ fauxton/assets/less/variables.less \ fauxton/bin/grunt \ fauxton/couchapp.js \ fauxton/extensions.md \ fauxton/favicon.ico \ fauxton/Gruntfile.js \ fauxton/index.html \ fauxton/package.json \ fauxton/readme.md \ fauxton/settings.json.default \ fauxton/settings.json.dev \ fauxton/settings.json.sample_external \ fauxton/tasks/addon/rename.json \ fauxton/tasks/addon/root/base.js.underscore \ fauxton/tasks/addon/root/resources.js.underscore \ fauxton/tasks/addon/root/routes.js.underscore \ fauxton/tasks/addon/template.js \ fauxton/tasks/couchserver.js \ fauxton/tasks/fauxton.js \ fauxton/tasks/helper.js \ fauxton/test/mocha/chai.js \ fauxton/test/mocha/mocha.css \ fauxton/test/mocha/mocha.js \ fauxton/test/mocha/sinon-chai.js \ fauxton/test/mocha/sinon.js \ fauxton/test/mocha/testUtils.js \ fauxton/test/runner.html \ fauxton/test/test.config.underscore \ fauxton/TODO.md \ fauxton/CONTRIBUTING.md \ fauxton/writing_addons.md 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) --foreign src/Makefile'; \ $(am__cd) $(top_srcdir) && \ $(AUTOMAKE) --foreign src/Makefile .PRECIOUS: Makefile Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status @case '$?' in \ *config.status*) \ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ *) \ echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ esac; $(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(top_srcdir)/configure: $(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. $(RECURSIVE_TARGETS): @fail= failcom='exit 1'; \ for f in x $$MAKEFLAGS; do \ case $$f in \ *=* | --[!k]*);; \ *k*) failcom='fail=yes';; \ esac; \ done; \ dot_seen=no; \ target=`echo $@ | sed s/-recursive//`; \ list='$(SUBDIRS)'; for subdir in $$list; do \ echo "Making $$target in $$subdir"; \ if test "$$subdir" = "."; then \ dot_seen=yes; \ local_target="$$target-am"; \ else \ local_target="$$target"; \ fi; \ ($(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" $(RECURSIVE_CLEAN_TARGETS): @fail= failcom='exit 1'; \ for f in x $$MAKEFLAGS; do \ case $$f in \ *=* | --[!k]*);; \ *k*) failcom='fail=yes';; \ esac; \ done; \ dot_seen=no; \ case "$@" in \ distclean-* | maintainer-clean-*) list='$(DIST_SUBDIRS)' ;; \ *) list='$(SUBDIRS)' ;; \ esac; \ rev=''; for subdir in $$list; do \ if test "$$subdir" = "."; then :; else \ rev="$$subdir $$rev"; \ fi; \ done; \ rev="$$rev ."; \ target=`echo $@ | sed s/-recursive//`; \ for subdir in $$rev; do \ echo "Making $$target in $$subdir"; \ if test "$$subdir" = "."; then \ local_target="$$target-am"; \ else \ local_target="$$target"; \ fi; \ ($(am__cd) $$subdir && $(MAKE) $(AM_MAKEFLAGS) $$local_target) \ || eval $$failcom; \ done && test -z "$$fail" tags-recursive: list='$(SUBDIRS)'; for subdir in $$list; do \ test "$$subdir" = . || ($(am__cd) $$subdir && $(MAKE) $(AM_MAKEFLAGS) tags); \ done ctags-recursive: list='$(SUBDIRS)'; for subdir in $$list; do \ test "$$subdir" = . || ($(am__cd) $$subdir && $(MAKE) $(AM_MAKEFLAGS) ctags); \ done ID: $(HEADERS) $(SOURCES) $(LISP) $(TAGS_FILES) list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | \ $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ END { if (nonempty) { for (i in files) print i; }; }'`; \ mkid -fID $$unique tags: TAGS TAGS: tags-recursive $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ $(TAGS_FILES) $(LISP) 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; \ list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | \ $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ END { if (nonempty) { for (i in files) print i; }; }'`; \ 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 CTAGS: ctags-recursive $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ $(TAGS_FILES) $(LISP) list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | \ $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ END { if (nonempty) { for (i in files) print i; }; }'`; \ 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" 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: $(RECURSIVE_CLEAN_TARGETS) $(RECURSIVE_TARGETS) ctags-recursive \ install-am install-strip tags-recursive .PHONY: $(RECURSIVE_CLEAN_TARGETS) $(RECURSIVE_TARGETS) CTAGS GTAGS \ all all-am check check-am clean clean-generic clean-libtool \ ctags ctags-recursive 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-recursive \ 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: apache-couchdb-1.6.0/src/couch_mrview/0000755000175000001440000000000012332105600017574 5ustar00djcusers00000000000000apache-couchdb-1.6.0/src/couch_mrview/src/0000755000175000001440000000000012332105600020363 5ustar00djcusers00000000000000apache-couchdb-1.6.0/src/couch_mrview/src/couch_mrview_show.erl0000644000175000001440000003324712332105522024635 0ustar00djcusers00000000000000% Licensed under the Apache License, Version 2.0 (the "License"); you may not % use this file except in compliance with the License. You may obtain a copy of % the License at % % http://www.apache.org/licenses/LICENSE-2.0 % % Unless required by applicable law or agreed to in writing, software % distributed under the License is distributed on an "AS IS" BASIS, WITHOUT % WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the % License for the specific language governing permissions and limitations under % the License. -module(couch_mrview_show). -export([ handle_doc_show_req/3, handle_doc_update_req/3, handle_view_list_req/3 ]). -include("couch_db.hrl"). -include_lib("couch_mrview/include/couch_mrview.hrl"). -record(lacc, { db, req, resp, qserver, lname, etag, code, headers }). % /db/_design/foo/_show/bar/docid % show converts a json doc to a response of any content-type. % it looks up the doc an then passes it to the query server. % then it sends the response from the query server to the http client. maybe_open_doc(Db, DocId) -> case catch couch_httpd_db:couch_doc_open(Db, DocId, nil, [conflicts]) of #doc{} = Doc -> Doc; {not_found, _} -> nil end. handle_doc_show_req(#httpd{ path_parts=[_, _, _, _, ShowName, DocId] }=Req, Db, DDoc) -> % open the doc Doc = maybe_open_doc(Db, DocId), % we don't handle revs here b/c they are an internal api % returns 404 if there is no doc with DocId handle_doc_show(Req, Db, DDoc, ShowName, Doc, DocId); handle_doc_show_req(#httpd{ path_parts=[_, _, _, _, ShowName, DocId|Rest] }=Req, Db, DDoc) -> DocParts = [DocId|Rest], DocId1 = ?l2b(string:join([?b2l(P)|| P <- DocParts], "/")), % open the doc Doc = maybe_open_doc(Db, DocId1), % we don't handle revs here b/c they are an internal api % pass 404 docs to the show function handle_doc_show(Req, Db, DDoc, ShowName, Doc, DocId1); handle_doc_show_req(#httpd{ path_parts=[_, _, _, _, ShowName] }=Req, Db, DDoc) -> % with no docid the doc is nil handle_doc_show(Req, Db, DDoc, ShowName, nil); handle_doc_show_req(Req, _Db, _DDoc) -> couch_httpd:send_error(Req, 404, <<"show_error">>, <<"Invalid path.">>). handle_doc_show(Req, Db, DDoc, ShowName, Doc) -> handle_doc_show(Req, Db, DDoc, ShowName, Doc, null). handle_doc_show(Req, Db, DDoc, ShowName, Doc, DocId) -> % get responder for ddoc/showname CurrentEtag = show_etag(Req, Doc, DDoc, []), couch_httpd:etag_respond(Req, CurrentEtag, fun() -> JsonReq = couch_httpd_external:json_req_obj(Req, Db, DocId), JsonDoc = couch_query_servers:json_doc(Doc), [<<"resp">>, ExternalResp] = couch_query_servers:ddoc_prompt(DDoc, [<<"shows">>, ShowName], [JsonDoc, JsonReq]), JsonResp = apply_etag(ExternalResp, CurrentEtag), couch_httpd_external:send_external_response(Req, JsonResp) end). show_etag(#httpd{user_ctx=UserCtx}=Req, Doc, DDoc, More) -> Accept = couch_httpd:header_value(Req, "Accept"), DocPart = case Doc of nil -> nil; Doc -> couch_httpd:doc_etag(Doc) end, couch_httpd:make_etag({couch_httpd:doc_etag(DDoc), DocPart, Accept, {UserCtx#user_ctx.name, UserCtx#user_ctx.roles}, More}). % updates a doc based on a request % handle_doc_update_req(#httpd{method = 'GET'}=Req, _Db, _DDoc) -> % % anything but GET % send_method_not_allowed(Req, "POST,PUT,DELETE,ETC"); % This call is creating a new doc using an _update function to % modify the provided request body. % /db/_design/foo/_update/bar handle_doc_update_req(#httpd{ path_parts=[_, _, _, _, UpdateName] }=Req, Db, DDoc) -> send_doc_update_response(Req, Db, DDoc, UpdateName, nil, null); % /db/_design/foo/_update/bar/docid handle_doc_update_req(#httpd{ path_parts=[_, _, _, _, UpdateName | DocIdParts] }=Req, Db, DDoc) -> DocId = ?l2b(string:join([?b2l(P) || P <- DocIdParts], "/")), Doc = maybe_open_doc(Db, DocId), send_doc_update_response(Req, Db, DDoc, UpdateName, Doc, DocId); handle_doc_update_req(Req, _Db, _DDoc) -> couch_httpd:send_error(Req, 404, <<"update_error">>, <<"Invalid path.">>). send_doc_update_response(Req, Db, DDoc, UpdateName, Doc, DocId) -> JsonReq = couch_httpd_external:json_req_obj(Req, Db, DocId), JsonDoc = couch_query_servers:json_doc(Doc), Cmd = [<<"updates">>, UpdateName], UpdateResp = couch_query_servers:ddoc_prompt(DDoc, Cmd, [JsonDoc, JsonReq]), JsonResp = case UpdateResp of [<<"up">>, {NewJsonDoc}, {JsonResp0}] -> case couch_httpd:header_value( Req, "X-Couch-Full-Commit", "false") of "true" -> Options = [full_commit, {user_ctx, Req#httpd.user_ctx}]; _ -> Options = [{user_ctx, Req#httpd.user_ctx}] end, NewDoc = couch_doc:from_json_obj({NewJsonDoc}), couch_doc:validate_docid(NewDoc#doc.id), {ok, NewRev} = couch_db:update_doc(Db, NewDoc, Options), NewRevStr = couch_doc:rev_to_str(NewRev), {[ {<<"code">>, 201}, {<<"headers">>, {[ {<<"X-Couch-Update-NewRev">>, NewRevStr}, {<<"X-Couch-Id">>, NewDoc#doc.id} ]}} | JsonResp0]}; [<<"up">>, _Other, {JsonResp0}] -> {[{<<"code">>, 200} | JsonResp0]} end, % todo set location field couch_httpd_external:send_external_response(Req, JsonResp). handle_view_list_req(#httpd{method=Method}=Req, Db, DDoc) when Method =:= 'GET' orelse Method =:= 'OPTIONS' -> case Req#httpd.path_parts of [_, _, _DName, _, LName, VName] -> % Same design doc for view and list handle_view_list(Req, Db, DDoc, LName, DDoc, VName, undefined); [_, _, _, _, LName, DName, VName] -> % Different design docs for view and list VDocId = <<"_design/", DName/binary>>, {ok, VDDoc} = couch_db:open_doc(Db, VDocId, [ejson_body]), handle_view_list(Req, Db, DDoc, LName, VDDoc, VName, undefined); _ -> couch_httpd:send_error(Req, 404, <<"list_error">>, <<"Bad path.">>) end; handle_view_list_req(#httpd{method='POST'}=Req, Db, DDoc) -> {Props} = couch_httpd:json_body_obj(Req), Keys = proplists:get_value(<<"keys">>, Props), case Req#httpd.path_parts of [_, _, _DName, _, LName, VName] -> handle_view_list(Req, Db, DDoc, LName, DDoc, VName, Keys); [_, _, _, _, LName, DName, VName] -> % Different design docs for view and list VDocId = <<"_design/", DName/binary>>, {ok, VDDoc} = couch_db:open_doc(Db, VDocId, [ejson_body]), handle_view_list(Req, Db, DDoc, LName, VDDoc, VName, Keys); _ -> couch_httpd:send_error(Req, 404, <<"list_error">>, <<"Bad path.">>) end; handle_view_list_req(Req, _Db, _DDoc) -> couch_httpd:send_method_not_allowed(Req, "GET,POST,HEAD"). handle_view_list(Req, Db, DDoc, LName, VDDoc, VName, Keys) -> Args0 = couch_mrview_http:parse_qs(Req, Keys), ETagFun = fun(BaseSig, Acc0) -> UserCtx = Req#httpd.user_ctx, Name = UserCtx#user_ctx.name, Roles = UserCtx#user_ctx.roles, Accept = couch_httpd:header_value(Req, "Accept"), Parts = {couch_httpd:doc_etag(DDoc), Accept, {Name, Roles}}, ETag = couch_httpd:make_etag({BaseSig, Parts}), case couch_httpd:etag_match(Req, ETag) of true -> throw({etag_match, ETag}); false -> {ok, Acc0#lacc{etag=ETag}} end end, Args = Args0#mrargs{preflight_fun=ETagFun}, couch_httpd:etag_maybe(Req, fun() -> couch_query_servers:with_ddoc_proc(DDoc, fun(QServer) -> Acc = #lacc{db=Db, req=Req, qserver=QServer, lname=LName}, case VName of <<"_all_docs">> -> couch_mrview:query_all_docs(Db, Args, fun list_cb/2, Acc); _ -> couch_mrview:query_view(Db, VDDoc, VName, Args, fun list_cb/2, Acc) end end) end). list_cb({meta, Meta}, #lacc{code=undefined} = Acc) -> MetaProps = case couch_util:get_value(total, Meta) of undefined -> []; Total -> [{total_rows, Total}] end ++ case couch_util:get_value(offset, Meta) of undefined -> []; Offset -> [{offset, Offset}] end ++ case couch_util:get_value(update_seq, Meta) of undefined -> []; UpdateSeq -> [{update_seq, UpdateSeq}] end, start_list_resp({MetaProps}, Acc); list_cb({row, Row}, #lacc{code=undefined} = Acc) -> {ok, NewAcc} = start_list_resp({[]}, Acc), send_list_row(Row, NewAcc); list_cb({row, Row}, Acc) -> send_list_row(Row, Acc); list_cb(complete, Acc) -> #lacc{qserver = {Proc, _}, resp = Resp0} = Acc, if Resp0 =:= nil -> {ok, #lacc{resp = Resp}} = start_list_resp({[]}, Acc); true -> Resp = Resp0 end, case couch_query_servers:proc_prompt(Proc, [<<"list_end">>]) of [<<"end">>, Data, Headers] -> Acc2 = fixup_headers(Headers, Acc#lacc{resp=Resp}), #lacc{resp = Resp2} = send_non_empty_chunk(Acc2, Data); [<<"end">>, Data] -> #lacc{resp = Resp2} = send_non_empty_chunk(Acc#lacc{resp=Resp}, Data) end, couch_httpd:last_chunk(Resp2), {ok, Resp2}. start_list_resp(Head, Acc) -> #lacc{db=Db, req=Req, qserver=QServer, lname=LName} = Acc, JsonReq = couch_httpd_external:json_req_obj(Req, Db), [<<"start">>,Chunk,JsonResp] = couch_query_servers:ddoc_proc_prompt(QServer, [<<"lists">>, LName], [Head, JsonReq]), Acc2 = send_non_empty_chunk(fixup_headers(JsonResp, Acc), Chunk), {ok, Acc2}. fixup_headers(Headers, #lacc{etag=ETag} = Acc) -> Headers2 = apply_etag(Headers, ETag), #extern_resp_args{ code = Code, ctype = CType, headers = ExtHeaders } = couch_httpd_external:parse_external_response(Headers2), Headers3 = couch_httpd_external:default_or_content_type(CType, ExtHeaders), Acc#lacc{code=Code, headers=Headers3}. send_list_row(Row, #lacc{qserver = {Proc, _}, resp = Resp} = Acc) -> RowObj = case couch_util:get_value(id, Row) of undefined -> []; Id -> [{id, Id}] end ++ case couch_util:get_value(key, Row) of undefined -> []; Key -> [{key, Key}] end ++ case couch_util:get_value(value, Row) of undefined -> []; Val -> [{value, Val}] end ++ case couch_util:get_value(doc, Row) of undefined -> []; Doc -> [{doc, Doc}] end, try couch_query_servers:proc_prompt(Proc, [<<"list_row">>, {RowObj}]) of [<<"chunks">>, Chunk, Headers] -> Acc2 = send_non_empty_chunk(fixup_headers(Headers, Acc), Chunk), {ok, Acc2}; [<<"chunks">>, Chunk] -> Acc2 = send_non_empty_chunk(Acc, Chunk), {ok, Acc2}; [<<"end">>, Chunk, Headers] -> Acc2 = send_non_empty_chunk(fixup_headers(Headers, Acc), Chunk), #lacc{resp = Resp2} = Acc2, couch_httpd:last_chunk(Resp2), {stop, Acc2}; [<<"end">>, Chunk] -> Acc2 = send_non_empty_chunk(Acc, Chunk), #lacc{resp = Resp2} = Acc2, couch_httpd:last_chunk(Resp2), {stop, Acc2} catch Error -> case Resp of undefined -> {Code, _, _} = couch_httpd:error_info(Error), #lacc{req=Req, headers=Headers} = Acc, {ok, Resp2} = couch_httpd:start_chunked_response(Req, Code, Headers), Acc2 = Acc#lacc{resp=Resp2, code=Code}; _ -> Resp2 = Resp, Acc2 = Acc end, couch_httpd:send_chunked_error(Resp2, Error), {stop, Acc2} end. send_non_empty_chunk(Acc, []) -> Acc; send_non_empty_chunk(#lacc{resp=undefined} = Acc, Chunk) -> #lacc{req=Req, code=Code, headers=Headers} = Acc, {ok, Resp} = couch_httpd:start_chunked_response(Req, Code, Headers), send_non_empty_chunk(Acc#lacc{resp = Resp}, Chunk); send_non_empty_chunk(#lacc{resp=Resp} = Acc, Chunk) -> couch_httpd:send_chunk(Resp, Chunk), Acc. apply_etag({ExternalResponse}, CurrentEtag) -> % Here we embark on the delicate task of replacing or creating the % headers on the JsonResponse object. We need to control the Etag and % Vary headers. If the external function controls the Etag, we'd have to % run it to check for a match, which sort of defeats the purpose. case couch_util:get_value(<<"headers">>, ExternalResponse, nil) of nil -> % no JSON headers % add our Etag and Vary headers to the response {[{<<"headers">>, {[{<<"Etag">>, CurrentEtag}, {<<"Vary">>, <<"Accept">>}]}} | ExternalResponse]}; JsonHeaders -> {[case Field of {<<"headers">>, JsonHeaders} -> % add our headers JsonHeadersEtagged = json_apply_field({<<"Etag">>, CurrentEtag}, JsonHeaders), JsonHeadersVaried = json_apply_field({<<"Vary">>, <<"Accept">>}, JsonHeadersEtagged), {<<"headers">>, JsonHeadersVaried}; _ -> % skip non-header fields Field end || Field <- ExternalResponse]} end. % Maybe this is in the proplists API % todo move to couch_util json_apply_field(H, {L}) -> json_apply_field(H, L, []). json_apply_field({Key, NewValue}, [{Key, _OldVal} | Headers], Acc) -> % drop matching keys json_apply_field({Key, NewValue}, Headers, Acc); json_apply_field({Key, NewValue}, [{OtherKey, OtherVal} | Headers], Acc) -> % something else is next, leave it alone. json_apply_field({Key, NewValue}, Headers, [{OtherKey, OtherVal} | Acc]); json_apply_field({Key, NewValue}, [], Acc) -> % end of list, add ours {[{Key, NewValue}|Acc]}. apache-couchdb-1.6.0/src/couch_mrview/src/couch_mrview_updater.erl0000644000175000001440000002344212332105522025315 0ustar00djcusers00000000000000% Licensed under the Apache License, Version 2.0 (the "License"); you may not % use this file except in compliance with the License. You may obtain a copy of % the License at % % http://www.apache.org/licenses/LICENSE-2.0 % % Unless required by applicable law or agreed to in writing, software % distributed under the License is distributed on an "AS IS" BASIS, WITHOUT % WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the % License for the specific language governing permissions and limitations under % the License. -module(couch_mrview_updater). -export([start_update/3, purge/4, process_doc/3, finish_update/1]). -include("couch_db.hrl"). -include_lib("couch_mrview/include/couch_mrview.hrl"). start_update(Partial, State, NumChanges) -> QueueOpts = [{max_size, 100000}, {max_items, 500}], {ok, DocQueue} = couch_work_queue:new(QueueOpts), {ok, WriteQueue} = couch_work_queue:new(QueueOpts), InitState = State#mrst{ first_build=State#mrst.update_seq==0, partial_resp_pid=Partial, doc_acc=[], doc_queue=DocQueue, write_queue=WriteQueue }, Self = self(), MapFun = fun() -> couch_task_status:add_task([ {type, indexer}, {database, State#mrst.db_name}, {design_document, State#mrst.idx_name}, {progress, 0}, {changes_done, 0}, {total_changes, NumChanges} ]), couch_task_status:set_update_frequency(500), map_docs(Self, InitState) end, WriteFun = fun() -> write_results(Self, InitState) end, spawn_link(MapFun), spawn_link(WriteFun), {ok, InitState}. purge(_Db, PurgeSeq, PurgedIdRevs, State) -> #mrst{ id_btree=IdBtree, views=Views } = State, Ids = [Id || {Id, _Revs} <- PurgedIdRevs], {ok, Lookups, IdBtree2} = couch_btree:query_modify(IdBtree, Ids, [], Ids), MakeDictFun = fun ({ok, {DocId, ViewNumRowKeys}}, DictAcc) -> FoldFun = fun({ViewNum, RowKey}, DictAcc2) -> dict:append(ViewNum, {RowKey, DocId}, DictAcc2) end, lists:foldl(FoldFun, DictAcc, ViewNumRowKeys); ({not_found, _}, DictAcc) -> DictAcc end, KeysToRemove = lists:foldl(MakeDictFun, dict:new(), Lookups), RemKeysFun = fun(#mrview{id_num=Num, btree=Btree}=View) -> case dict:find(Num, KeysToRemove) of {ok, RemKeys} -> {ok, Btree2} = couch_btree:add_remove(Btree, [], RemKeys), NewPurgeSeq = case Btree2 /= Btree of true -> PurgeSeq; _ -> View#mrview.purge_seq end, View#mrview{btree=Btree2, purge_seq=NewPurgeSeq}; error -> View end end, Views2 = lists:map(RemKeysFun, Views), {ok, State#mrst{ id_btree=IdBtree2, views=Views2, purge_seq=PurgeSeq }}. process_doc(Doc, Seq, #mrst{doc_acc=Acc}=State) when length(Acc) > 100 -> couch_work_queue:queue(State#mrst.doc_queue, lists:reverse(Acc)), process_doc(Doc, Seq, State#mrst{doc_acc=[]}); process_doc(nil, Seq, #mrst{doc_acc=Acc}=State) -> {ok, State#mrst{doc_acc=[{nil, Seq, nil} | Acc]}}; process_doc(#doc{id=Id, deleted=true}, Seq, #mrst{doc_acc=Acc}=State) -> {ok, State#mrst{doc_acc=[{Id, Seq, deleted} | Acc]}}; process_doc(#doc{id=Id}=Doc, Seq, #mrst{doc_acc=Acc}=State) -> {ok, State#mrst{doc_acc=[{Id, Seq, Doc} | Acc]}}. finish_update(#mrst{doc_acc=Acc}=State) -> if Acc /= [] -> couch_work_queue:queue(State#mrst.doc_queue, Acc); true -> ok end, couch_work_queue:close(State#mrst.doc_queue), receive {new_state, NewState} -> {ok, NewState#mrst{ first_build=undefined, partial_resp_pid=undefined, doc_acc=undefined, doc_queue=undefined, write_queue=undefined, qserver=nil }} end. map_docs(Parent, State0) -> case couch_work_queue:dequeue(State0#mrst.doc_queue) of closed -> couch_query_servers:stop_doc_map(State0#mrst.qserver), couch_work_queue:close(State0#mrst.write_queue); {ok, Dequeued} -> % Run all the non deleted docs through the view engine and % then pass the results on to the writer process. State1 = case State0#mrst.qserver of nil -> start_query_server(State0); _ -> State0 end, QServer = State1#mrst.qserver, DocFun = fun ({nil, Seq, _}, {SeqAcc, Results}) -> {erlang:max(Seq, SeqAcc), Results}; ({Id, Seq, deleted}, {SeqAcc, Results}) -> {erlang:max(Seq, SeqAcc), [{Id, []} | Results]}; ({Id, Seq, Doc}, {SeqAcc, Results}) -> {ok, Res} = couch_query_servers:map_doc_raw(QServer, Doc), {erlang:max(Seq, SeqAcc), [{Id, Res} | Results]} end, FoldFun = fun(Docs, Acc) -> update_task(length(Docs)), lists:foldl(DocFun, Acc, Docs) end, Results = lists:foldl(FoldFun, {0, []}, Dequeued), couch_work_queue:queue(State1#mrst.write_queue, Results), map_docs(Parent, State1) end. write_results(Parent, State) -> case couch_work_queue:dequeue(State#mrst.write_queue) of closed -> Parent ! {new_state, State}; {ok, Info} -> EmptyKVs = [{V#mrview.id_num, []} || V <- State#mrst.views], {Seq, ViewKVs, DocIdKeys} = merge_results(Info, 0, EmptyKVs, []), NewState = write_kvs(State, Seq, ViewKVs, DocIdKeys), send_partial(NewState#mrst.partial_resp_pid, NewState), write_results(Parent, NewState) end. start_query_server(State) -> #mrst{ language=Language, lib=Lib, views=Views } = State, Defs = [View#mrview.def || View <- Views], {ok, QServer} = couch_query_servers:start_doc_map(Language, Defs, Lib), State#mrst{qserver=QServer}. merge_results([], SeqAcc, ViewKVs, DocIdKeys) -> {SeqAcc, ViewKVs, DocIdKeys}; merge_results([{Seq, Results} | Rest], SeqAcc, ViewKVs, DocIdKeys) -> Fun = fun(RawResults, {VKV, DIK}) -> merge_results(RawResults, VKV, DIK) end, {ViewKVs1, DocIdKeys1} = lists:foldl(Fun, {ViewKVs, DocIdKeys}, Results), merge_results(Rest, erlang:max(Seq, SeqAcc), ViewKVs1, DocIdKeys1). merge_results({DocId, []}, ViewKVs, DocIdKeys) -> {ViewKVs, [{DocId, []} | DocIdKeys]}; merge_results({DocId, RawResults}, ViewKVs, DocIdKeys) -> JsonResults = couch_query_servers:raw_to_ejson(RawResults), Results = [[list_to_tuple(Res) || Res <- FunRs] || FunRs <- JsonResults], {ViewKVs1, ViewIdKeys} = insert_results(DocId, Results, ViewKVs, [], []), {ViewKVs1, [ViewIdKeys | DocIdKeys]}. insert_results(DocId, [], [], ViewKVs, ViewIdKeys) -> {lists:reverse(ViewKVs), {DocId, ViewIdKeys}}; insert_results(DocId, [KVs | RKVs], [{Id, VKVs} | RVKVs], VKVAcc, VIdKeys) -> CombineDupesFun = fun ({Key, Val}, {[{Key, {dups, Vals}} | Rest], IdKeys}) -> {[{Key, {dups, [Val | Vals]}} | Rest], IdKeys}; ({Key, Val1}, {[{Key, Val2} | Rest], IdKeys}) -> {[{Key, {dups, [Val1, Val2]}} | Rest], IdKeys}; ({Key, _}=KV, {Rest, IdKeys}) -> {[KV | Rest], [{Id, Key} | IdKeys]} end, InitAcc = {[], VIdKeys}, {Duped, VIdKeys0} = lists:foldl(CombineDupesFun, InitAcc, lists:sort(KVs)), FinalKVs = [{{Key, DocId}, Val} || {Key, Val} <- Duped] ++ VKVs, insert_results(DocId, RKVs, RVKVs, [{Id, FinalKVs} | VKVAcc], VIdKeys0). write_kvs(State, UpdateSeq, ViewKVs, DocIdKeys) -> #mrst{ id_btree=IdBtree, first_build=FirstBuild } = State, {ok, ToRemove, IdBtree2} = update_id_btree(IdBtree, DocIdKeys, FirstBuild), ToRemByView = collapse_rem_keys(ToRemove, dict:new()), UpdateView = fun(#mrview{id_num=ViewId}=View, {ViewId, KVs}) -> ToRem = couch_util:dict_find(ViewId, ToRemByView, []), {ok, VBtree2} = couch_btree:add_remove(View#mrview.btree, KVs, ToRem), NewUpdateSeq = case VBtree2 =/= View#mrview.btree of true -> UpdateSeq; _ -> View#mrview.update_seq end, View#mrview{btree=VBtree2, update_seq=NewUpdateSeq} end, State#mrst{ views=lists:zipwith(UpdateView, State#mrst.views, ViewKVs), update_seq=UpdateSeq, id_btree=IdBtree2 }. update_id_btree(Btree, DocIdKeys, true) -> ToAdd = [{Id, DIKeys} || {Id, DIKeys} <- DocIdKeys, DIKeys /= []], couch_btree:query_modify(Btree, [], ToAdd, []); update_id_btree(Btree, DocIdKeys, _) -> ToFind = [Id || {Id, _} <- DocIdKeys], ToAdd = [{Id, DIKeys} || {Id, DIKeys} <- DocIdKeys, DIKeys /= []], ToRem = [Id || {Id, DIKeys} <- DocIdKeys, DIKeys == []], couch_btree:query_modify(Btree, ToFind, ToAdd, ToRem). collapse_rem_keys([], Acc) -> Acc; collapse_rem_keys([{ok, {DocId, ViewIdKeys}} | Rest], Acc) -> NewAcc = lists:foldl(fun({ViewId, Key}, Acc2) -> dict:append(ViewId, {Key, DocId}, Acc2) end, Acc, ViewIdKeys), collapse_rem_keys(Rest, NewAcc); collapse_rem_keys([{not_found, _} | Rest], Acc) -> collapse_rem_keys(Rest, Acc). send_partial(Pid, State) when is_pid(Pid) -> gen_server:cast(Pid, {new_state, State}); send_partial(_, _) -> ok. update_task(NumChanges) -> [Changes, Total] = couch_task_status:get([changes_done, total_changes]), Changes2 = Changes + NumChanges, Progress = case Total of 0 -> % updater restart after compaction finishes 0; _ -> (Changes2 * 100) div Total end, couch_task_status:update([{progress, Progress}, {changes_done, Changes2}]). apache-couchdb-1.6.0/src/couch_mrview/src/couch_mrview_http.erl0000644000175000001440000003252612332105522024633 0ustar00djcusers00000000000000% Licensed under the Apache License, Version 2.0 (the "License"); you may not % use this file except in compliance with the License. You may obtain a copy of % the License at % % http://www.apache.org/licenses/LICENSE-2.0 % % Unless required by applicable law or agreed to in writing, software % distributed under the License is distributed on an "AS IS" BASIS, WITHOUT % WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the % License for the specific language governing permissions and limitations under % the License. -module(couch_mrview_http). -export([ handle_all_docs_req/2, handle_view_req/3, handle_temp_view_req/2, handle_info_req/3, handle_compact_req/3, handle_cleanup_req/2, parse_qs/2 ]). -include("couch_db.hrl"). -include_lib("couch_mrview/include/couch_mrview.hrl"). -record(vacc, { db, req, resp, prepend, etag }). handle_all_docs_req(#httpd{method='GET'}=Req, Db) -> all_docs_req(Req, Db, undefined); handle_all_docs_req(#httpd{method='POST'}=Req, Db) -> Keys = get_view_keys(couch_httpd:json_body_obj(Req)), all_docs_req(Req, Db, Keys); handle_all_docs_req(Req, _Db) -> couch_httpd:send_method_not_allowed(Req, "GET,POST,HEAD"). handle_view_req(#httpd{method='GET'}=Req, Db, DDoc) -> [_, _, _, _, ViewName] = Req#httpd.path_parts, couch_stats_collector:increment({httpd, view_reads}), design_doc_view(Req, Db, DDoc, ViewName, undefined); handle_view_req(#httpd{method='POST'}=Req, Db, DDoc) -> [_, _, _, _, ViewName] = Req#httpd.path_parts, Keys = get_view_keys(couch_httpd:json_body_obj(Req)), couch_stats_collector:increment({httpd, view_reads}), design_doc_view(Req, Db, DDoc, ViewName, Keys); handle_view_req(Req, _Db, _DDoc) -> couch_httpd:send_method_not_allowed(Req, "GET,POST,HEAD"). handle_temp_view_req(#httpd{method='POST'}=Req, Db) -> couch_httpd:validate_ctype(Req, "application/json"), ok = couch_db:check_is_admin(Db), {Body} = couch_httpd:json_body_obj(Req), DDoc = couch_mrview_util:temp_view_to_ddoc({Body}), Keys = get_view_keys({Body}), couch_stats_collector:increment({httpd, temporary_view_reads}), design_doc_view(Req, Db, DDoc, <<"temp">>, Keys); handle_temp_view_req(Req, _Db) -> couch_httpd:send_method_not_allowed(Req, "POST"). handle_info_req(#httpd{method='GET'}=Req, Db, DDoc) -> [_, _, Name, _] = Req#httpd.path_parts, {ok, Info} = couch_mrview:get_info(Db, DDoc), couch_httpd:send_json(Req, 200, {[ {name, Name}, {view_index, {Info}} ]}); handle_info_req(Req, _Db, _DDoc) -> couch_httpd:send_method_not_allowed(Req, "GET"). handle_compact_req(#httpd{method='POST'}=Req, Db, DDoc) -> ok = couch_db:check_is_admin(Db), couch_httpd:validate_ctype(Req, "application/json"), ok = couch_mrview:compact(Db, DDoc), couch_httpd:send_json(Req, 202, {[{ok, true}]}); handle_compact_req(Req, _Db, _DDoc) -> couch_httpd:send_method_not_allowed(Req, "POST"). handle_cleanup_req(#httpd{method='POST'}=Req, Db) -> ok = couch_db:check_is_admin(Db), couch_httpd:validate_ctype(Req, "application/json"), ok = couch_mrview:cleanup(Db), couch_httpd:send_json(Req, 202, {[{ok, true}]}); handle_cleanup_req(Req, _Db) -> couch_httpd:send_method_not_allowed(Req, "POST"). all_docs_req(Req, Db, Keys) -> case couch_db:is_system_db(Db) of true -> case (catch couch_db:check_is_admin(Db)) of ok -> do_all_docs_req(Req, Db, Keys); _ -> DbName = ?b2l(Db#db.name), case couch_config:get("couch_httpd_auth", "authentication_db", "_users") of DbName -> UsersDbPublic = couch_config:get("couch_httpd_auth", "users_db_public", "false"), PublicFields = couch_config:get("couch_httpd_auth", "public_fields"), case {UsersDbPublic, PublicFields} of {"true", PublicFields} when PublicFields =/= undefined -> do_all_docs_req(Req, Db, Keys); {_, _} -> throw({forbidden, <<"Only admins can access _all_docs", " of system databases.">>}) end; _ -> throw({forbidden, <<"Only admins can access _all_docs", " of system databases.">>}) end end; false -> do_all_docs_req(Req, Db, Keys) end. do_all_docs_req(Req, Db, Keys) -> Args0 = parse_qs(Req, Keys), ETagFun = fun(Sig, Acc0) -> ETag = couch_httpd:make_etag(Sig), case couch_httpd:etag_match(Req, ETag) of true -> throw({etag_match, ETag}); false -> {ok, Acc0#vacc{etag=ETag}} end end, Args = Args0#mrargs{preflight_fun=ETagFun}, {ok, Resp} = couch_httpd:etag_maybe(Req, fun() -> VAcc0 = #vacc{db=Db, req=Req}, DbName = ?b2l(Db#db.name), UsersDbName = couch_config:get("couch_httpd_auth", "authentication_db", "_users"), IsAdmin = is_admin(Db), Callback = get_view_callback(DbName, UsersDbName, IsAdmin), couch_mrview:query_all_docs(Db, Args, Callback, VAcc0) end), case is_record(Resp, vacc) of true -> {ok, Resp#vacc.resp}; _ -> {ok, Resp} end. is_admin(Db) -> case catch couch_db:check_is_admin(Db) of {unauthorized, _} -> false; ok -> true end. % admin users always get all fields get_view_callback(_, _, true) -> fun view_cb/2; % if we are operating on the users db and we aren't % admin, filter the view get_view_callback(_DbName, _DbName, false) -> fun filtered_view_cb/2; % non _users databases get all fields get_view_callback(_, _, _) -> fun view_cb/2. design_doc_view(Req, Db, DDoc, ViewName, Keys) -> Args0 = parse_qs(Req, Keys), ETagFun = fun(Sig, Acc0) -> ETag = couch_httpd:make_etag(Sig), case couch_httpd:etag_match(Req, ETag) of true -> throw({etag_match, ETag}); false -> {ok, Acc0#vacc{etag=ETag}} end end, Args = Args0#mrargs{preflight_fun=ETagFun}, {ok, Resp} = couch_httpd:etag_maybe(Req, fun() -> VAcc0 = #vacc{db=Db, req=Req}, couch_mrview:query_view(Db, DDoc, ViewName, Args, fun view_cb/2, VAcc0) end), case is_record(Resp, vacc) of true -> {ok, Resp#vacc.resp}; _ -> {ok, Resp} end. filtered_view_cb({row, Row0}, Acc) -> Row1 = lists:map(fun({doc, null}) -> {doc, null}; ({doc, Body}) -> Doc = couch_users_db:strip_non_public_fields(#doc{body=Body}), {doc, Doc#doc.body}; (KV) -> KV end, Row0), view_cb({row, Row1}, Acc); filtered_view_cb(Obj, Acc) -> view_cb(Obj, Acc). view_cb({meta, Meta}, #vacc{resp=undefined}=Acc) -> Headers = [{"ETag", Acc#vacc.etag}], {ok, Resp} = couch_httpd:start_json_response(Acc#vacc.req, 200, Headers), % Map function starting Parts = case couch_util:get_value(total, Meta) of undefined -> []; Total -> [io_lib:format("\"total_rows\":~p", [Total])] end ++ case couch_util:get_value(offset, Meta) of undefined -> []; Offset -> [io_lib:format("\"offset\":~p", [Offset])] end ++ case couch_util:get_value(update_seq, Meta) of undefined -> []; UpdateSeq -> [io_lib:format("\"update_seq\":~p", [UpdateSeq])] end ++ ["\"rows\":["], Chunk = lists:flatten("{" ++ string:join(Parts, ",") ++ "\r\n"), couch_httpd:send_chunk(Resp, Chunk), {ok, Acc#vacc{resp=Resp, prepend=""}}; view_cb({row, Row}, #vacc{resp=undefined}=Acc) -> % Reduce function starting Headers = [{"ETag", Acc#vacc.etag}], {ok, Resp} = couch_httpd:start_json_response(Acc#vacc.req, 200, Headers), couch_httpd:send_chunk(Resp, ["{\"rows\":[\r\n", row_to_json(Row)]), {ok, #vacc{resp=Resp, prepend=",\r\n"}}; view_cb({row, Row}, Acc) -> % Adding another row couch_httpd:send_chunk(Acc#vacc.resp, [Acc#vacc.prepend, row_to_json(Row)]), {ok, Acc#vacc{prepend=",\r\n"}}; view_cb(complete, #vacc{resp=undefined}=Acc) -> % Nothing in view {ok, Resp} = couch_httpd:send_json(Acc#vacc.req, 200, {[{rows, []}]}), {ok, Acc#vacc{resp=Resp}}; view_cb(complete, Acc) -> % Finish view output couch_httpd:send_chunk(Acc#vacc.resp, "\r\n]}"), couch_httpd:end_json_response(Acc#vacc.resp), {ok, Acc}. row_to_json(Row) -> Id = couch_util:get_value(id, Row), row_to_json(Id, Row). row_to_json(error, Row) -> % Special case for _all_docs request with KEYS to % match prior behavior. Key = couch_util:get_value(key, Row), Val = couch_util:get_value(value, Row), Obj = {[{key, Key}, {error, Val}]}, ?JSON_ENCODE(Obj); row_to_json(Id0, Row) -> Id = case Id0 of undefined -> []; Id0 -> [{id, Id0}] end, Key = couch_util:get_value(key, Row, null), Val = couch_util:get_value(value, Row), Doc = case couch_util:get_value(doc, Row) of undefined -> []; Doc0 -> [{doc, Doc0}] end, Obj = {Id ++ [{key, Key}, {value, Val}] ++ Doc}, ?JSON_ENCODE(Obj). get_view_keys({Props}) -> case couch_util:get_value(<<"keys">>, Props) of undefined -> ?LOG_DEBUG("POST with no keys member.", []), undefined; Keys when is_list(Keys) -> Keys; _ -> throw({bad_request, "`keys` member must be a array."}) end. parse_qs(Req, Keys) -> Args = #mrargs{keys=Keys}, lists:foldl(fun({K, V}, Acc) -> parse_qs(K, V, Acc) end, Args, couch_httpd:qs(Req)). parse_qs(Key, Val, Args) -> case Key of "" -> Args; "reduce" -> Args#mrargs{reduce=parse_boolean(Val)}; "key" -> JsonKey = ?JSON_DECODE(Val), Args#mrargs{start_key=JsonKey, end_key=JsonKey}; "keys" -> Args#mrargs{keys=?JSON_DECODE(Val)}; "startkey" -> Args#mrargs{start_key=?JSON_DECODE(Val)}; "start_key" -> Args#mrargs{start_key=?JSON_DECODE(Val)}; "startkey_docid" -> Args#mrargs{start_key_docid=list_to_binary(Val)}; "start_key_doc_id" -> Args#mrargs{start_key_docid=list_to_binary(Val)}; "endkey" -> Args#mrargs{end_key=?JSON_DECODE(Val)}; "end_key" -> Args#mrargs{end_key=?JSON_DECODE(Val)}; "endkey_docid" -> Args#mrargs{end_key_docid=list_to_binary(Val)}; "end_key_doc_id" -> Args#mrargs{end_key_docid=list_to_binary(Val)}; "limit" -> Args#mrargs{limit=parse_pos_int(Val)}; "count" -> throw({query_parse_error, <<"QS param `count` is not `limit`">>}); "stale" when Val == "ok" -> Args#mrargs{stale=ok}; "stale" when Val == "update_after" -> Args#mrargs{stale=update_after}; "stale" -> throw({query_parse_error, <<"Invalid value for `stale`.">>}); "descending" -> case parse_boolean(Val) of true -> Args#mrargs{direction=rev}; _ -> Args#mrargs{direction=fwd} end; "skip" -> Args#mrargs{skip=parse_pos_int(Val)}; "group" -> case parse_boolean(Val) of true -> Args#mrargs{group_level=exact}; _ -> Args#mrargs{group_level=0} end; "group_level" -> Args#mrargs{group_level=parse_pos_int(Val)}; "inclusive_end" -> Args#mrargs{inclusive_end=parse_boolean(Val)}; "include_docs" -> Args#mrargs{include_docs=parse_boolean(Val)}; "attachments" -> case parse_boolean(Val) of true -> Opts = Args#mrargs.doc_options, Args#mrargs{doc_options=[attachments|Opts]}; false -> Args end; "att_encoding_info" -> case parse_boolean(Val) of true -> Opts = Args#mrargs.doc_options, Args#mrargs{doc_options=[att_encoding_info|Opts]}; false -> Args end; "update_seq" -> Args#mrargs{update_seq=parse_boolean(Val)}; "conflicts" -> Args#mrargs{conflicts=parse_boolean(Val)}; "list" -> Args#mrargs{list=list_to_binary(Val)}; "callback" -> Args#mrargs{callback=list_to_binary(Val)}; _ -> BKey = list_to_binary(Key), BVal = list_to_binary(Val), Args#mrargs{extra=[{BKey, BVal} | Args#mrargs.extra]} end. parse_boolean(Val) -> case string:to_lower(Val) of "true" -> true; "false" -> false; _ -> Msg = io_lib:format("Invalid boolean parameter: ~p", [Val]), throw({query_parse_error, ?l2b(Msg)}) end. parse_int(Val) -> case (catch list_to_integer(Val)) of IntVal when is_integer(IntVal) -> IntVal; _ -> Msg = io_lib:format("Invalid value for integer: ~p", [Val]), throw({query_parse_error, ?l2b(Msg)}) end. parse_pos_int(Val) -> case parse_int(Val) of IntVal when IntVal >= 0 -> IntVal; _ -> Fmt = "Invalid value for positive integer: ~p", Msg = io_lib:format(Fmt, [Val]), throw({query_parse_error, ?l2b(Msg)}) end. apache-couchdb-1.6.0/src/couch_mrview/src/couch_mrview.app.src0000644000175000001440000000171012332105522024347 0ustar00djcusers00000000000000% Licensed under the Apache License, Version 2.0 (the "License"); you may not % use this file except in compliance with the License. You may obtain a copy of % the License at % % http://www.apache.org/licenses/LICENSE-2.0 % % Unless required by applicable law or agreed to in writing, software % distributed under the License is distributed on an "AS IS" BASIS, WITHOUT % WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the % License for the specific language governing permissions and limitations under % the License. {application, couch_mrview, [ {description, "CouchDB Map/Reduce Views"}, {vsn, "%version%"}, {modules, [ couch_mrview, couch_mrview_compactor, couch_mrview_http, couch_mrview_index, couch_mrview_show, couch_mrview_test_util, couch_mrview_updater, couch_mrview_util ]}, {registered, []}, {applications, [kernel, stdlib, couch_index]} ]}. apache-couchdb-1.6.0/src/couch_mrview/src/couch_mrview.erl0000644000175000001440000003024012332105522023563 0ustar00djcusers00000000000000% Licensed under the Apache License, Version 2.0 (the "License"); you may not % use this file except in compliance with the License. You may obtain a copy of % the License at % % http://www.apache.org/licenses/LICENSE-2.0 % % Unless required by applicable law or agreed to in writing, software % distributed under the License is distributed on an "AS IS" BASIS, WITHOUT % WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the % License for the specific language governing permissions and limitations under % the License. -module(couch_mrview). -export([query_all_docs/2, query_all_docs/4]). -export([query_view/3, query_view/4, query_view/6]). -export([get_info/2]). -export([compact/2, compact/3, cancel_compaction/2]). -export([cleanup/1]). -include("couch_db.hrl"). -include_lib("couch_mrview/include/couch_mrview.hrl"). -record(mracc, { db, meta_sent=false, total_rows, offset, limit, skip, group_level, doc_info, callback, user_acc, last_go=ok, reduce_fun, update_seq, args }). query_all_docs(Db, Args) -> query_all_docs(Db, Args, fun default_cb/2, []). query_all_docs(Db, Args, Callback, Acc) when is_list(Args) -> query_all_docs(Db, to_mrargs(Args), Callback, Acc); query_all_docs(Db, Args0, Callback, Acc) -> Sig = couch_util:with_db(Db, fun(WDb) -> {ok, Info} = couch_db:get_db_info(WDb), couch_index_util:hexsig(couch_util:md5(term_to_binary(Info))) end), Args1 = Args0#mrargs{view_type=map}, Args2 = couch_mrview_util:validate_args(Args1), {ok, Acc1} = case Args2#mrargs.preflight_fun of PFFun when is_function(PFFun, 2) -> PFFun(Sig, Acc); _ -> {ok, Acc} end, all_docs_fold(Db, Args2, Callback, Acc1). query_view(Db, DDoc, VName) -> query_view(Db, DDoc, VName, #mrargs{}). query_view(Db, DDoc, VName, Args) when is_list(Args) -> query_view(Db, DDoc, VName, to_mrargs(Args), fun default_cb/2, []); query_view(Db, DDoc, VName, Args) -> query_view(Db, DDoc, VName, Args, fun default_cb/2, []). query_view(Db, DDoc, VName, Args, Callback, Acc) when is_list(Args) -> query_view(Db, DDoc, VName, to_mrargs(Args), Callback, Acc); query_view(Db, DDoc, VName, Args0, Callback, Acc0) -> {ok, VInfo, Sig, Args} = couch_mrview_util:get_view(Db, DDoc, VName, Args0), {ok, Acc1} = case Args#mrargs.preflight_fun of PFFun when is_function(PFFun, 2) -> PFFun(Sig, Acc0); _ -> {ok, Acc0} end, query_view(Db, VInfo, Args, Callback, Acc1). query_view(Db, {Type, View}, Args, Callback, Acc) -> case Type of map -> map_fold(Db, View, Args, Callback, Acc); red -> red_fold(Db, View, Args, Callback, Acc) end. get_info(Db, DDoc) -> {ok, Pid} = couch_index_server:get_index(couch_mrview_index, Db, DDoc), couch_index:get_info(Pid). compact(Db, DDoc) -> compact(Db, DDoc, []). compact(Db, DDoc, Opts) -> {ok, Pid} = couch_index_server:get_index(couch_mrview_index, Db, DDoc), couch_index:compact(Pid, Opts). cancel_compaction(Db, DDoc) -> {ok, IPid} = couch_index_server:get_index(couch_mrview_index, Db, DDoc), {ok, CPid} = couch_index:get_compactor_pid(IPid), ok = couch_index_compactor:cancel(CPid), % Cleanup the compaction file if it exists {ok, #mrst{sig=Sig, db_name=DbName}} = couch_index:get_state(IPid, 0), couch_mrview_util:delete_compaction_file(DbName, Sig), ok. cleanup(Db) -> couch_mrview_cleanup:run(Db). all_docs_fold(Db, #mrargs{keys=undefined}=Args, Callback, UAcc) -> {ok, Info} = couch_db:get_db_info(Db), Total = couch_util:get_value(doc_count, Info), UpdateSeq = couch_db:get_update_seq(Db), Acc = #mracc{ db=Db, total_rows=Total, limit=Args#mrargs.limit, skip=Args#mrargs.skip, callback=Callback, user_acc=UAcc, reduce_fun=fun couch_mrview_util:all_docs_reduce_to_count/1, update_seq=UpdateSeq, args=Args }, [Opts] = couch_mrview_util:all_docs_key_opts(Args), {ok, Offset, FinalAcc} = couch_db:enum_docs(Db, fun map_fold/3, Acc, Opts), finish_fold(FinalAcc, [{total, Total}, {offset, Offset}]); all_docs_fold(Db, #mrargs{direction=Dir, keys=Keys0}=Args, Callback, UAcc) -> {ok, Info} = couch_db:get_db_info(Db), Total = couch_util:get_value(doc_count, Info), UpdateSeq = couch_db:get_update_seq(Db), Acc = #mracc{ db=Db, total_rows=Total, limit=Args#mrargs.limit, skip=Args#mrargs.skip, callback=Callback, user_acc=UAcc, reduce_fun=fun couch_mrview_util:all_docs_reduce_to_count/1, update_seq=UpdateSeq, args=Args }, % Backwards compatibility hack. The old _all_docs iterates keys % in reverse if descending=true was passed. Here we'll just % reverse the list instead. Keys = if Dir =:= fwd -> Keys0; true -> lists:reverse(Keys0) end, FoldFun = fun(Key, Acc0) -> DocInfo = (catch couch_db:get_doc_info(Db, Key)), {Doc, Acc1} = case DocInfo of {ok, #doc_info{id=Id, revs=[RevInfo | _RestRevs]}=DI} -> Rev = couch_doc:rev_to_str(RevInfo#rev_info.rev), Props = [{rev, Rev}] ++ case RevInfo#rev_info.deleted of true -> [{deleted, true}]; false -> [] end, {{{Id, Id}, {Props}}, Acc0#mracc{doc_info=DI}}; not_found -> {{{Key, error}, not_found}, Acc0} end, {_, Acc2} = map_fold(Doc, {[], [{0, 0, 0}]}, Acc1), Acc2 end, FinalAcc = lists:foldl(FoldFun, Acc, Keys), finish_fold(FinalAcc, [{total, Total}]). map_fold(Db, View, Args, Callback, UAcc) -> {ok, Total} = couch_mrview_util:get_row_count(View), Acc = #mracc{ db=Db, total_rows=Total, limit=Args#mrargs.limit, skip=Args#mrargs.skip, callback=Callback, user_acc=UAcc, reduce_fun=fun couch_mrview_util:reduce_to_count/1, update_seq=View#mrview.update_seq, args=Args }, OptList = couch_mrview_util:key_opts(Args), {Reds, Acc2} = lists:foldl(fun(Opts, {_, Acc0}) -> {ok, R, A} = couch_mrview_util:fold(View, fun map_fold/3, Acc0, Opts), {R, A} end, {nil, Acc}, OptList), Offset = couch_mrview_util:reduce_to_count(Reds), finish_fold(Acc2, [{total, Total}, {offset, Offset}]). map_fold(#full_doc_info{} = FullDocInfo, OffsetReds, Acc) -> % matches for _all_docs and translates #full_doc_info{} -> KV pair case couch_doc:to_doc_info(FullDocInfo) of #doc_info{id=Id, revs=[#rev_info{deleted=false, rev=Rev}|_]} = DI -> Value = {[{rev, couch_doc:rev_to_str(Rev)}]}, map_fold({{Id, Id}, Value}, OffsetReds, Acc#mracc{doc_info=DI}); #doc_info{revs=[#rev_info{deleted=true}|_]} -> {ok, Acc} end; map_fold(_KV, _Offset, #mracc{skip=N}=Acc) when N > 0 -> {ok, Acc#mracc{skip=N-1, last_go=ok}}; map_fold(KV, OffsetReds, #mracc{offset=undefined}=Acc) -> #mracc{ total_rows=Total, callback=Callback, user_acc=UAcc0, reduce_fun=Reduce, update_seq=UpdateSeq, args=Args } = Acc, Offset = Reduce(OffsetReds), Meta = make_meta(Args, UpdateSeq, [{total, Total}, {offset, Offset}]), {Go, UAcc1} = Callback(Meta, UAcc0), Acc1 = Acc#mracc{meta_sent=true, offset=Offset, user_acc=UAcc1, last_go=Go}, case Go of ok -> map_fold(KV, OffsetReds, Acc1); stop -> {stop, Acc1} end; map_fold(_KV, _Offset, #mracc{limit=0}=Acc) -> {stop, Acc}; map_fold({{Key, Id}, Val}, _Offset, Acc) -> #mracc{ db=Db, limit=Limit, doc_info=DI, callback=Callback, user_acc=UAcc0, args=Args } = Acc, Doc = case DI of #doc_info{} -> couch_mrview_util:maybe_load_doc(Db, DI, Args); _ -> couch_mrview_util:maybe_load_doc(Db, Id, Val, Args) end, Row = [{id, Id}, {key, Key}, {value, Val}] ++ Doc, {Go, UAcc1} = Callback({row, Row}, UAcc0), {Go, Acc#mracc{ limit=Limit-1, doc_info=undefined, user_acc=UAcc1, last_go=Go }}. red_fold(Db, {_Nth, _Lang, View}=RedView, Args, Callback, UAcc) -> Acc = #mracc{ db=Db, total_rows=null, limit=Args#mrargs.limit, skip=Args#mrargs.skip, group_level=Args#mrargs.group_level, callback=Callback, user_acc=UAcc, update_seq=View#mrview.update_seq, args=Args }, GroupFun = group_rows_fun(Args#mrargs.group_level), OptList = couch_mrview_util:key_opts(Args, [{key_group_fun, GroupFun}]), Acc2 = lists:foldl(fun(Opts, Acc0) -> {ok, Acc1} = couch_mrview_util:fold_reduce(RedView, fun red_fold/3, Acc0, Opts), Acc1 end, Acc, OptList), finish_fold(Acc2, []). red_fold(_Key, _Red, #mracc{skip=N}=Acc) when N > 0 -> {ok, Acc#mracc{skip=N-1, last_go=ok}}; red_fold(Key, Red, #mracc{meta_sent=false}=Acc) -> #mracc{ args=Args, callback=Callback, user_acc=UAcc0, update_seq=UpdateSeq } = Acc, Meta = make_meta(Args, UpdateSeq, []), {Go, UAcc1} = Callback(Meta, UAcc0), Acc1 = Acc#mracc{user_acc=UAcc1, meta_sent=true, last_go=Go}, case Go of ok -> red_fold(Key, Red, Acc1); _ -> {Go, Acc1} end; red_fold(_Key, _Red, #mracc{limit=0} = Acc) -> {stop, Acc}; red_fold(_Key, Red, #mracc{group_level=0} = Acc) -> #mracc{ limit=Limit, callback=Callback, user_acc=UAcc0 } = Acc, Row = [{key, null}, {value, Red}], {Go, UAcc1} = Callback({row, Row}, UAcc0), {Go, Acc#mracc{user_acc=UAcc1, limit=Limit-1, last_go=Go}}; red_fold(Key, Red, #mracc{group_level=exact} = Acc) -> #mracc{ limit=Limit, callback=Callback, user_acc=UAcc0 } = Acc, Row = [{key, Key}, {value, Red}], {Go, UAcc1} = Callback({row, Row}, UAcc0), {Go, Acc#mracc{user_acc=UAcc1, limit=Limit-1, last_go=Go}}; red_fold(K, Red, #mracc{group_level=I} = Acc) when I > 0, is_list(K) -> #mracc{ limit=Limit, callback=Callback, user_acc=UAcc0 } = Acc, Row = [{key, lists:sublist(K, I)}, {value, Red}], {Go, UAcc1} = Callback({row, Row}, UAcc0), {Go, Acc#mracc{user_acc=UAcc1, limit=Limit-1, last_go=Go}}; red_fold(K, Red, #mracc{group_level=I} = Acc) when I > 0 -> #mracc{ limit=Limit, callback=Callback, user_acc=UAcc0 } = Acc, Row = [{key, K}, {value, Red}], {Go, UAcc1} = Callback({row, Row}, UAcc0), {Go, Acc#mracc{user_acc=UAcc1, limit=Limit-1, last_go=Go}}. finish_fold(#mracc{last_go=ok, update_seq=UpdateSeq}=Acc, ExtraMeta) -> #mracc{callback=Callback, user_acc=UAcc, args=Args}=Acc, % Possible send meta info Meta = make_meta(Args, UpdateSeq, ExtraMeta), {Go, UAcc1} = case Acc#mracc.meta_sent of false -> Callback(Meta, UAcc); _ -> {ok, Acc#mracc.user_acc} end, % Notify callback that the fold is complete. {_, UAcc2} = case Go of ok -> Callback(complete, UAcc1); _ -> {ok, UAcc1} end, {ok, UAcc2}; finish_fold(#mracc{user_acc=UAcc}, _ExtraMeta) -> {ok, UAcc}. make_meta(Args, UpdateSeq, Base) -> case Args#mrargs.update_seq of true -> {meta, Base ++ [{update_seq, UpdateSeq}]}; _ -> {meta, Base} end. group_rows_fun(exact) -> fun({Key1,_}, {Key2,_}) -> Key1 == Key2 end; group_rows_fun(0) -> fun(_A, _B) -> true end; group_rows_fun(GroupLevel) when is_integer(GroupLevel) -> fun({[_|_] = Key1,_}, {[_|_] = Key2,_}) -> lists:sublist(Key1, GroupLevel) == lists:sublist(Key2, GroupLevel); ({Key1,_}, {Key2,_}) -> Key1 == Key2 end. default_cb(complete, Acc) -> {ok, lists:reverse(Acc)}; default_cb({final, Info}, []) -> {ok, [Info]}; default_cb({final, _}, Acc) -> {ok, Acc}; default_cb(Row, Acc) -> {ok, [Row | Acc]}. to_mrargs(KeyList) -> lists:foldl(fun({Key, Value}, Acc) -> Index = lookup_index(couch_util:to_existing_atom(Key)), setelement(Index, Acc, Value) end, #mrargs{}, KeyList). lookup_index(Key) -> Index = lists:zip( record_info(fields, mrargs), lists:seq(2, record_info(size, mrargs)) ), couch_util:get_value(Key, Index). apache-couchdb-1.6.0/src/couch_mrview/src/couch_mrview_index.erl0000644000175000001440000001233612332105522024760 0ustar00djcusers00000000000000% Licensed under the Apache License, Version 2.0 (the "License"); you may not % use this file except in compliance with the License. You may obtain a copy of % the License at % % http://www.apache.org/licenses/LICENSE-2.0 % % Unless required by applicable law or agreed to in writing, software % distributed under the License is distributed on an "AS IS" BASIS, WITHOUT % WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the % License for the specific language governing permissions and limitations under % the License. -module(couch_mrview_index). -export([get/2]). -export([init/2, open/2, close/1, reset/1, delete/1]). -export([start_update/3, purge/4, process_doc/3, finish_update/1, commit/1]). -export([compact/3, swap_compacted/2]). -include("couch_db.hrl"). -include_lib("couch_mrview/include/couch_mrview.hrl"). get(Property, State) -> case Property of db_name -> State#mrst.db_name; idx_name -> State#mrst.idx_name; signature -> State#mrst.sig; update_seq -> State#mrst.update_seq; purge_seq -> State#mrst.purge_seq; update_options -> Opts = State#mrst.design_opts, IncDesign = couch_util:get_value(<<"include_design">>, Opts, false), LocalSeq = couch_util:get_value(<<"local_seq">>, Opts, false), if IncDesign -> [include_design]; true -> [] end ++ if LocalSeq -> [local_seq]; true -> [] end; info -> #mrst{ fd = Fd, sig = Sig, id_btree = Btree, language = Lang, update_seq = UpdateSeq, purge_seq = PurgeSeq, views = Views } = State, {ok, Size} = couch_file:bytes(Fd), {ok, DataSize} = couch_mrview_util:calculate_data_size(Btree,Views), {ok, [ {signature, list_to_binary(couch_index_util:hexsig(Sig))}, {language, Lang}, {disk_size, Size}, {data_size, DataSize}, {update_seq, UpdateSeq}, {purge_seq, PurgeSeq} ]}; Other -> throw({unknown_index_property, Other}) end. init(Db, DDoc) -> couch_mrview_util:ddoc_to_mrst(couch_db:name(Db), DDoc). open(Db, State) -> #mrst{ db_name=DbName, sig=Sig } = State, IndexFName = couch_mrview_util:index_file(DbName, Sig), % If we are upgrading from <=1.2.x, we upgrade the view % index file on the fly, avoiding an index reset. % % OldSig is `ok` if no upgrade happened. % % To remove suppport for 1.2.x auto-upgrades in the % future, just remove the next line and the code % between "upgrade code for <= 1.2.x" and % "end upgrade code for <= 1.2.x" and the corresponding % code in couch_mrview_util OldSig = couch_mrview_util:maybe_update_index_file(State), case couch_mrview_util:open_file(IndexFName) of {ok, Fd} -> case (catch couch_file:read_header(Fd)) of % upgrade code for <= 1.2.x {ok, {OldSig, Header}} -> % Matching view signatures. NewSt = couch_mrview_util:init_state(Db, Fd, State, Header), {ok, RefCounter} = couch_ref_counter:start([Fd]), {ok, NewSt#mrst{refc=RefCounter}}; % end of upgrade code for <= 1.2.x {ok, {Sig, Header}} -> % Matching view signatures. NewSt = couch_mrview_util:init_state(Db, Fd, State, Header), {ok, RefCounter} = couch_ref_counter:start([Fd]), {ok, NewSt#mrst{refc=RefCounter}}; _ -> NewSt = couch_mrview_util:reset_index(Db, Fd, State), {ok, RefCounter} = couch_ref_counter:start([Fd]), {ok, NewSt#mrst{refc=RefCounter}} end; {error, Reason} = Error -> ?LOG_ERROR("Failed to open view file '~s': ~s", [IndexFName, file:format_error(Reason)]), Error end. close(State) -> couch_file:close(State#mrst.fd). delete(#mrst{db_name=DbName, sig=Sig}=State) -> couch_file:close(State#mrst.fd), catch couch_mrview_util:delete_files(DbName, Sig). reset(State) -> couch_util:with_db(State#mrst.db_name, fun(Db) -> NewState = couch_mrview_util:reset_index(Db, State#mrst.fd, State), {ok, NewState} end). start_update(PartialDest, State, NumChanges) -> couch_mrview_updater:start_update(PartialDest, State, NumChanges). purge(Db, PurgeSeq, PurgedIdRevs, State) -> couch_mrview_updater:purge(Db, PurgeSeq, PurgedIdRevs, State). process_doc(Doc, Seq, State) -> couch_mrview_updater:process_doc(Doc, Seq, State). finish_update(State) -> couch_mrview_updater:finish_update(State). commit(State) -> Header = {State#mrst.sig, couch_mrview_util:make_header(State)}, couch_file:write_header(State#mrst.fd, Header). compact(Db, State, Opts) -> couch_mrview_compactor:compact(Db, State, Opts). swap_compacted(OldState, NewState) -> couch_mrview_compactor:swap_compacted(OldState, NewState). apache-couchdb-1.6.0/src/couch_mrview/src/couch_mrview_test_util.erl0000644000175000001440000000463712332105522025672 0ustar00djcusers00000000000000% Licensed under the Apache License, Version 2.0 (the "License"); you may not % use this file except in compliance with the License. You may obtain a copy of % the License at % % http://www.apache.org/licenses/LICENSE-2.0 % % Unless required by applicable law or agreed to in writing, software % distributed under the License is distributed on an "AS IS" BASIS, WITHOUT % WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the % License for the specific language governing permissions and limitations under % the License. -module(couch_mrview_test_util). -compile(export_all). -include("couch_db.hrl"). -define(ADMIN, #user_ctx{roles=[<<"_admin">>]}). init_db(Name, Type) -> init_db(Name, Type, 10). init_db(Name, Type, Count) -> {ok, Db} = new_db(Name, Type), Docs = make_docs(Count), save_docs(Db, Docs). new_db(Name, Type) -> couch_server:delete(Name, [{user_ctx, ?ADMIN}]), {ok, Db} = couch_db:create(Name, [{user_ctx, ?ADMIN}]), save_docs(Db, [ddoc(Type)]). save_docs(Db, Docs) -> {ok, _} = couch_db:update_docs(Db, Docs, []), couch_db:reopen(Db). make_docs(Count) -> make_docs(Count, []). make_docs(Count, Acc) when Count =< 0 -> Acc; make_docs(Count, Acc) -> make_docs(Count-1, [doc(Count) | Acc]). ddoc(map) -> couch_doc:from_json_obj({[ {<<"_id">>, <<"_design/bar">>}, {<<"views">>, {[ {<<"baz">>, {[ {<<"map">>, <<"function(doc) {emit(doc.val, doc.val);}">>} ]}}, {<<"bing">>, {[ {<<"map">>, <<"function(doc) {}">>} ]}}, {<<"zing">>, {[ {<<"map">>, << "function(doc) {\n" " if(doc.foo !== undefined)\n" " emit(doc.foo, 0);\n" "}" >>} ]}} ]}} ]}); ddoc(red) -> couch_doc:from_json_obj({[ {<<"_id">>, <<"_design/bar">>}, {<<"views">>, {[ {<<"baz">>, {[ {<<"map">>, << "function(doc) {\n" " emit([doc.val % 2, doc.val], doc.val);\n" "}\n" >>}, {<<"reduce">>, <<"function(keys, vals) {return sum(vals);}">>} ]}} ]}} ]}). doc(Id) -> couch_doc:from_json_obj({[ {<<"_id">>, list_to_binary(integer_to_list(Id))}, {<<"val">>, Id} ]}). apache-couchdb-1.6.0/src/couch_mrview/src/couch_mrview_compactor.erl0000644000175000001440000001331112332105522025632 0ustar00djcusers00000000000000% Licensed under the Apache License, Version 2.0 (the "License"); you may not % use this file except in compliance with the License. You may obtain a copy of % the License at % % http://www.apache.org/licenses/LICENSE-2.0 % % Unless required by applicable law or agreed to in writing, software % distributed under the License is distributed on an "AS IS" BASIS, WITHOUT % WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the % License for the specific language governing permissions and limitations under % the License. -module(couch_mrview_compactor). -include("couch_db.hrl"). -include_lib("couch_mrview/include/couch_mrview.hrl"). -export([compact/3, swap_compacted/2]). -record(acc, { btree = nil, last_id = nil, kvs = [], kvs_size = 0, changes = 0, total_changes }). compact(_Db, State, Opts) -> case lists:member(recompact, Opts) of false -> compact(State); true -> recompact(State) end. compact(State) -> #mrst{ db_name=DbName, idx_name=IdxName, sig=Sig, update_seq=Seq, id_btree=IdBtree, views=Views } = State, {EmptyState, NumDocIds} = couch_util:with_db(DbName, fun(Db) -> CompactFName = couch_mrview_util:compaction_file(DbName, Sig), {ok, Fd} = couch_mrview_util:open_file(CompactFName), ESt = couch_mrview_util:reset_index(Db, Fd, State), {ok, DbReduce} = couch_btree:full_reduce(Db#db.fulldocinfo_by_id_btree), Count = element(1, DbReduce), {ESt, Count} end), #mrst{ id_btree = EmptyIdBtree, views = EmptyViews } = EmptyState, TotalChanges = lists:foldl( fun(View, Acc) -> {ok, Kvs} = couch_mrview_util:get_row_count(View), Acc + Kvs end, NumDocIds, Views), couch_task_status:add_task([ {type, view_compaction}, {database, DbName}, {design_document, IdxName}, {progress, 0} ]), BufferSize0 = couch_config:get( "view_compaction", "keyvalue_buffer_size", "2097152" ), BufferSize = list_to_integer(BufferSize0), FoldFun = fun({DocId, _} = KV, Acc) -> #acc{btree = Bt, kvs = Kvs, kvs_size = KvsSize, last_id = LastId} = Acc, if DocId =:= LastId -> % COUCHDB-999 regression test ?LOG_ERROR("Duplicate docid `~s` detected in view group `~s`" ++ ", database `~s` - This view needs to be rebuilt.", [DocId, IdxName, DbName] ), exit({view_duplicate_id, DocId}); true -> ok end, KvsSize2 = KvsSize + ?term_size(KV), case KvsSize2 >= BufferSize of true -> {ok, Bt2} = couch_btree:add(Bt, lists:reverse([KV | Kvs])), Acc2 = update_task(Acc, 1 + length(Kvs)), {ok, Acc2#acc{ btree = Bt2, kvs = [], kvs_size = 0, last_id = DocId}}; _ -> {ok, Acc#acc{ kvs = [KV | Kvs], kvs_size = KvsSize2, last_id = DocId}} end end, InitAcc = #acc{total_changes = TotalChanges, btree = EmptyIdBtree}, {ok, _, FinalAcc} = couch_btree:foldl(IdBtree, FoldFun, InitAcc), #acc{btree = Bt3, kvs = Uncopied} = FinalAcc, {ok, NewIdBtree} = couch_btree:add(Bt3, lists:reverse(Uncopied)), FinalAcc2 = update_task(FinalAcc, length(Uncopied)), {NewViews, _} = lists:mapfoldl(fun({View, EmptyView}, Acc) -> compact_view(View, EmptyView, BufferSize, Acc) end, FinalAcc2, lists:zip(Views, EmptyViews)), unlink(EmptyState#mrst.fd), {ok, EmptyState#mrst{ id_btree=NewIdBtree, views=NewViews, update_seq=Seq }}. recompact(State) -> link(State#mrst.fd), {Pid, Ref} = erlang:spawn_monitor(fun() -> couch_index_updater:update(couch_mrview_index, State) end), receive {'DOWN', Ref, _, _, {updated, Pid, State2}} -> unlink(State#mrst.fd), {ok, State2} end. %% @spec compact_view(View, EmptyView, Retry, Acc) -> {CompactView, NewAcc} compact_view(View, EmptyView, BufferSize, Acc0) -> Fun = fun(KV, #acc{btree = Bt, kvs = Kvs, kvs_size = KvsSize} = Acc) -> KvsSize2 = KvsSize + ?term_size(KV), if KvsSize2 >= BufferSize -> {ok, Bt2} = couch_btree:add(Bt, lists:reverse([KV | Kvs])), Acc2 = update_task(Acc, 1 + length(Kvs)), {ok, Acc2#acc{btree = Bt2, kvs = [], kvs_size = 0}}; true -> {ok, Acc#acc{kvs = [KV | Kvs], kvs_size = KvsSize2}} end end, InitAcc = Acc0#acc{kvs = [], kvs_size = 0, btree = EmptyView#mrview.btree}, {ok, _, FinalAcc} = couch_btree:foldl(View#mrview.btree, Fun, InitAcc), #acc{btree = Bt3, kvs = Uncopied} = FinalAcc, {ok, NewBt} = couch_btree:add(Bt3, lists:reverse(Uncopied)), FinalAcc2 = update_task(FinalAcc, length(Uncopied)), {EmptyView#mrview{btree=NewBt}, FinalAcc2}. update_task(#acc{changes = Changes, total_changes = Total} = Acc, ChangesInc) -> Changes2 = Changes + ChangesInc, couch_task_status:update([{progress, (Changes2 * 100) div Total}]), Acc#acc{changes = Changes2}. swap_compacted(OldState, NewState) -> #mrst{ sig=Sig, db_name=DbName } = NewState, link(NewState#mrst.fd), RootDir = couch_index_util:root_dir(), IndexFName = couch_mrview_util:index_file(DbName, Sig), CompactFName = couch_mrview_util:compaction_file(DbName, Sig), ok = couch_file:delete(RootDir, IndexFName), ok = file:rename(CompactFName, IndexFName), unlink(OldState#mrst.fd), couch_ref_counter:drop(OldState#mrst.refc), {ok, NewRefCounter} = couch_ref_counter:start([NewState#mrst.fd]), {ok, NewState#mrst{refc=NewRefCounter}}. apache-couchdb-1.6.0/src/couch_mrview/src/couch_mrview_cleanup.erl0000644000175000001440000000315512332105522025277 0ustar00djcusers00000000000000% Licensed under the Apache License, Version 2.0 (the "License"); you may not % use this file except in compliance with the License. You may obtain a copy of % the License at % % http://www.apache.org/licenses/LICENSE-2.0 % % Unless required by applicable law or agreed to in writing, software % distributed under the License is distributed on an "AS IS" BASIS, WITHOUT % WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the % License for the specific language governing permissions and limitations under % the License. -module(couch_mrview_cleanup). -export([run/1]). -include("couch_db.hrl"). -include_lib("couch_mrview/include/couch_mrview.hrl"). run(Db) -> RootDir = couch_index_util:root_dir(), DbName = couch_db:name(Db), DesignDocs = couch_db:get_design_docs(Db), SigFiles = lists:foldl(fun(DDocInfo, SFAcc) -> {ok, DDoc} = couch_db:open_doc_int(Db, DDocInfo, [ejson_body]), {ok, InitState} = couch_mrview_util:ddoc_to_mrst(DbName, DDoc), Sig = InitState#mrst.sig, IFName = couch_mrview_util:index_file(DbName, Sig), CFName = couch_mrview_util:compaction_file(DbName, Sig), [IFName, CFName | SFAcc] end, [], [DD || DD <- DesignDocs, DD#full_doc_info.deleted == false]), IdxDir = couch_index_util:index_dir(mrview, DbName), DiskFiles = filelib:wildcard(filename:join(IdxDir, "*")), % We need to delete files that have no ddoc. ToDelete = DiskFiles -- SigFiles, lists:foreach(fun(FN) -> ?LOG_DEBUG("Deleting stale view file: ~s", [FN]), couch_file:delete(RootDir, FN, false) end, ToDelete), ok. apache-couchdb-1.6.0/src/couch_mrview/src/couch_mrview_util.erl0000644000175000001440000006143112332105522024626 0ustar00djcusers00000000000000% Licensed under the Apache License, Version 2.0 (the "License"); you may not % use this file except in compliance with the License. You may obtain a copy of % the License at % % http://www.apache.org/licenses/LICENSE-2.0 % % Unless required by applicable law or agreed to in writing, software % distributed under the License is distributed on an "AS IS" BASIS, WITHOUT % WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the % License for the specific language governing permissions and limitations under % the License. -module(couch_mrview_util). -export([get_view/4]). -export([ddoc_to_mrst/2, init_state/4, reset_index/3]). -export([make_header/1]). -export([index_file/2, compaction_file/2, open_file/1]). -export([delete_files/2, delete_index_file/2, delete_compaction_file/2]). -export([get_row_count/1, all_docs_reduce_to_count/1, reduce_to_count/1]). -export([all_docs_key_opts/1, all_docs_key_opts/2, key_opts/1, key_opts/2]). -export([fold/4, fold_reduce/4]). -export([temp_view_to_ddoc/1]). -export([calculate_data_size/2]). -export([validate_args/1]). -export([maybe_load_doc/3, maybe_load_doc/4]). -export([maybe_update_index_file/1]). -define(MOD, couch_mrview_index). -include("couch_db.hrl"). -include_lib("couch_mrview/include/couch_mrview.hrl"). get_view(Db, DDoc, ViewName, Args0) -> ArgCheck = fun(InitState) -> Args1 = set_view_type(Args0, ViewName, InitState#mrst.views), {ok, validate_args(Args1)} end, {ok, Pid, Args2} = couch_index_server:get_index(?MOD, Db, DDoc, ArgCheck), DbUpdateSeq = couch_util:with_db(Db, fun(WDb) -> couch_db:get_update_seq(WDb) end), MinSeq = case Args2#mrargs.stale of ok -> 0; update_after -> 0; _ -> DbUpdateSeq end, {ok, State} = case couch_index:get_state(Pid, MinSeq) of {ok, _} = Resp -> Resp; Error -> throw(Error) end, couch_ref_counter:add(State#mrst.refc), if Args2#mrargs.stale == update_after -> spawn(fun() -> catch couch_index:get_state(Pid, DbUpdateSeq) end); true -> ok end, #mrst{language=Lang, views=Views} = State, {Type, View, Args3} = extract_view(Lang, Args2, ViewName, Views), check_range(Args3, view_cmp(View)), Sig = view_sig(Db, State, View, Args3), {ok, {Type, View}, Sig, Args3}. ddoc_to_mrst(DbName, #doc{id=Id, body={Fields}}) -> MakeDict = fun({Name, {MRFuns}}, DictBySrcAcc) -> case couch_util:get_value(<<"map">>, MRFuns) of MapSrc when is_binary(MapSrc) -> RedSrc = couch_util:get_value(<<"reduce">>, MRFuns, null), {ViewOpts} = couch_util:get_value(<<"options">>, MRFuns, {[]}), View = case dict:find({MapSrc, ViewOpts}, DictBySrcAcc) of {ok, View0} -> View0; error -> #mrview{def=MapSrc, options=ViewOpts} end, {MapNames, RedSrcs} = case RedSrc of null -> MNames = [Name | View#mrview.map_names], {MNames, View#mrview.reduce_funs}; _ -> RedFuns = [{Name, RedSrc} | View#mrview.reduce_funs], {View#mrview.map_names, RedFuns} end, View2 = View#mrview{map_names=MapNames, reduce_funs=RedSrcs}, dict:store({MapSrc, ViewOpts}, View2, DictBySrcAcc); undefined -> DictBySrcAcc end end, {RawViews} = couch_util:get_value(<<"views">>, Fields, {[]}), BySrc = lists:foldl(MakeDict, dict:new(), RawViews), NumViews = fun({_, View}, N) -> {View#mrview{id_num=N}, N+1} end, {Views, _} = lists:mapfoldl(NumViews, 0, lists:sort(dict:to_list(BySrc))), Language = couch_util:get_value(<<"language">>, Fields, <<"javascript">>), {DesignOpts} = couch_util:get_value(<<"options">>, Fields, {[]}), {RawViews} = couch_util:get_value(<<"views">>, Fields, {[]}), Lib = couch_util:get_value(<<"lib">>, RawViews, {[]}), IdxState = #mrst{ db_name=DbName, idx_name=Id, lib=Lib, views=Views, language=Language, design_opts=DesignOpts }, SigInfo = {Views, Language, DesignOpts, couch_index_util:sort_lib(Lib)}, {ok, IdxState#mrst{sig=couch_util:md5(term_to_binary(SigInfo))}}. set_view_type(_Args, _ViewName, []) -> throw({not_found, missing_named_view}); set_view_type(Args, ViewName, [View | Rest]) -> RedNames = [N || {N, _} <- View#mrview.reduce_funs], case lists:member(ViewName, RedNames) of true -> case Args#mrargs.reduce of false -> Args#mrargs{view_type=map}; _ -> Args#mrargs{view_type=red} end; false -> case lists:member(ViewName, View#mrview.map_names) of true -> Args#mrargs{view_type=map}; false -> set_view_type(Args, ViewName, Rest) end end. extract_view(_Lang, _Args, _ViewName, []) -> throw({not_found, missing_named_view}); extract_view(Lang, #mrargs{view_type=map}=Args, Name, [View | Rest]) -> Names = View#mrview.map_names ++ [N || {N, _} <- View#mrview.reduce_funs], case lists:member(Name, Names) of true -> {map, View, Args}; _ -> extract_view(Lang, Args, Name, Rest) end; extract_view(Lang, #mrargs{view_type=red}=Args, Name, [View | Rest]) -> RedNames = [N || {N, _} <- View#mrview.reduce_funs], case lists:member(Name, RedNames) of true -> {red, {index_of(Name, RedNames), Lang, View}, Args}; false -> extract_view(Lang, Args, Name, Rest) end. view_sig(Db, State, View, #mrargs{include_docs=true}=Args) -> BaseSig = view_sig(Db, State, View, Args#mrargs{include_docs=false}), UpdateSeq = couch_db:get_update_seq(Db), PurgeSeq = couch_db:get_purge_seq(Db), Bin = term_to_binary({BaseSig, UpdateSeq, PurgeSeq}), couch_index_util:hexsig(couch_util:md5(Bin)); view_sig(Db, State, {_Nth, _Lang, View}, Args) -> view_sig(Db, State, View, Args); view_sig(_Db, State, View, Args0) -> Sig = State#mrst.sig, UpdateSeq = View#mrview.update_seq, PurgeSeq = View#mrview.purge_seq, Args = Args0#mrargs{ preflight_fun=undefined, extra=[] }, Bin = term_to_binary({Sig, UpdateSeq, PurgeSeq, Args}), couch_index_util:hexsig(couch_util:md5(Bin)). init_state(Db, Fd, #mrst{views=Views}=State, nil) -> Header = #mrheader{ seq=0, purge_seq=couch_db:get_purge_seq(Db), id_btree_state=nil, view_states=[{nil, 0, 0} || _ <- Views] }, init_state(Db, Fd, State, Header); % read <= 1.2.x header record and transpile it to >=1.3.x % header record init_state(Db, Fd, State, #index_header{ seq=Seq, purge_seq=PurgeSeq, id_btree_state=IdBtreeState, view_states=ViewStates}) -> init_state(Db, Fd, State, #mrheader{ seq=Seq, purge_seq=PurgeSeq, id_btree_state=IdBtreeState, view_states=ViewStates }); init_state(Db, Fd, State, Header) -> #mrst{language=Lang, views=Views} = State, #mrheader{ seq=Seq, purge_seq=PurgeSeq, id_btree_state=IdBtreeState, view_states=ViewStates } = Header, StateUpdate = fun ({_, _, _}=St) -> St; (St) -> {St, 0, 0} end, ViewStates2 = lists:map(StateUpdate, ViewStates), IdBtOpts = [{compression, couch_db:compression(Db)}], {ok, IdBtree} = couch_btree:open(IdBtreeState, Fd, IdBtOpts), OpenViewFun = fun(St, View) -> open_view(Db, Fd, Lang, St, View) end, Views2 = lists:zipwith(OpenViewFun, ViewStates2, Views), State#mrst{ fd=Fd, update_seq=Seq, purge_seq=PurgeSeq, id_btree=IdBtree, views=Views2 }. open_view(Db, Fd, Lang, {BTState, USeq, PSeq}, View) -> FunSrcs = [FunSrc || {_Name, FunSrc} <- View#mrview.reduce_funs], ReduceFun = fun(reduce, KVs) -> KVs2 = detuple_kvs(expand_dups(KVs, []), []), {ok, Result} = couch_query_servers:reduce(Lang, FunSrcs, KVs2), {length(KVs2), Result}; (rereduce, Reds) -> Count = lists:sum([Count0 || {Count0, _} <- Reds]), UsrReds = [UsrRedsList || {_, UsrRedsList} <- Reds], {ok, Result} = couch_query_servers:rereduce(Lang, FunSrcs, UsrReds), {Count, Result} end, Less = case couch_util:get_value(<<"collation">>, View#mrview.options) of <<"raw">> -> fun(A, B) -> A < B end; _ -> fun couch_ejson_compare:less_json_ids/2 end, ViewBtOpts = [ {less, Less}, {reduce, ReduceFun}, {compression, couch_db:compression(Db)} ], {ok, Btree} = couch_btree:open(BTState, Fd, ViewBtOpts), View#mrview{btree=Btree, update_seq=USeq, purge_seq=PSeq}. temp_view_to_ddoc({Props}) -> Language = couch_util:get_value(<<"language">>, Props, <<"javascript">>), Options = couch_util:get_value(<<"options">>, Props, {[]}), View0 = [{<<"map">>, couch_util:get_value(<<"map">>, Props)}], View1 = View0 ++ case couch_util:get_value(<<"reduce">>, Props) of RedSrc when is_binary(RedSrc) -> [{<<"reduce">>, RedSrc}]; _ -> [] end, DDoc = {[ {<<"_id">>, couch_uuids:random()}, {<<"language">>, Language}, {<<"options">>, Options}, {<<"views">>, {[ {<<"temp">>, {View1}} ]}} ]}, couch_doc:from_json_obj(DDoc). get_row_count(#mrview{btree=Bt}) -> {ok, {Count, _Reds}} = couch_btree:full_reduce(Bt), {ok, Count}. all_docs_reduce_to_count(Reductions) -> Reduce = fun couch_db_updater:btree_by_id_reduce/2, {Count, _, _} = couch_btree:final_reduce(Reduce, Reductions), Count. reduce_to_count(nil) -> 0; reduce_to_count(Reductions) -> Reduce = fun (reduce, KVs) -> Counts = [ case V of {dups, Vals} -> length(Vals); _ -> 1 end || {_,V} <- KVs ], {lists:sum(Counts), []}; (rereduce, Reds) -> {lists:sum([Count0 || {Count0, _} <- Reds]), []} end, {Count, _} = couch_btree:final_reduce(Reduce, Reductions), Count. fold(#mrview{btree=Bt}, Fun, Acc, Opts) -> WrapperFun = fun(KV, Reds, Acc2) -> fold_fun(Fun, expand_dups([KV], []), Reds, Acc2) end, {ok, _LastRed, _Acc} = couch_btree:fold(Bt, WrapperFun, Acc, Opts). fold_fun(_Fun, [], _, Acc) -> {ok, Acc}; fold_fun(Fun, [KV|Rest], {KVReds, Reds}, Acc) -> case Fun(KV, {KVReds, Reds}, Acc) of {ok, Acc2} -> fold_fun(Fun, Rest, {[KV|KVReds], Reds}, Acc2); {stop, Acc2} -> {stop, Acc2} end. fold_reduce({NthRed, Lang, View}, Fun, Acc, Options) -> #mrview{ btree=Bt, reduce_funs=RedFuns } = View, LPad = lists:duplicate(NthRed - 1, []), RPad = lists:duplicate(length(RedFuns) - NthRed, []), {_Name, FunSrc} = lists:nth(NthRed,RedFuns), ReduceFun = fun (reduce, KVs0) -> KVs1 = detuple_kvs(expand_dups(KVs0, []), []), {ok, Red} = couch_query_servers:reduce(Lang, [FunSrc], KVs1), {0, LPad ++ Red ++ RPad}; (rereduce, Reds) -> ExtractRed = fun({_, UReds0}) -> [lists:nth(NthRed, UReds0)] end, UReds = lists:map(ExtractRed, Reds), {ok, Red} = couch_query_servers:rereduce(Lang, [FunSrc], UReds), {0, LPad ++ Red ++ RPad} end, WrapperFun = fun({GroupedKey, _}, PartialReds, Acc0) -> {_, Reds} = couch_btree:final_reduce(ReduceFun, PartialReds), Fun(GroupedKey, lists:nth(NthRed, Reds), Acc0) end, couch_btree:fold_reduce(Bt, WrapperFun, Acc, Options). validate_args(Args) -> Reduce = Args#mrargs.reduce, case Reduce == undefined orelse is_boolean(Reduce) of true -> ok; _ -> mrverror(<<"Invalid `reduce` value.">>) end, case {Args#mrargs.view_type, Reduce} of {map, true} -> mrverror(<<"Reduce is invalid for map-only views.">>); _ -> ok end, case {Args#mrargs.view_type, Args#mrargs.group_level, Args#mrargs.keys} of {red, exact, _} -> ok; {red, _, KeyList} when is_list(KeyList) -> Msg = <<"Multi-key fetchs for reduce views must use `group=true`">>, mrverror(Msg); _ -> ok end, case Args#mrargs.keys of Keys when is_list(Keys) -> ok; undefined -> ok; _ -> mrverror(<<"`keys` must be an array of strings.">>) end, case {Args#mrargs.keys, Args#mrargs.start_key, Args#mrargs.end_key} of {undefined, _, _} -> ok; {[], _, _} -> ok; {[_|_], undefined, undefined} -> ok; _ -> mrverror(<<"`keys` is incompatible with `key`" ", `start_key` and `end_key`">>) end, case Args#mrargs.start_key_docid of undefined -> ok; SKDocId0 when is_binary(SKDocId0) -> ok; _ -> mrverror(<<"`start_key_docid` must be a string.">>) end, case Args#mrargs.end_key_docid of undefined -> ok; EKDocId0 when is_binary(EKDocId0) -> ok; _ -> mrverror(<<"`end_key_docid` must be a string.">>) end, case Args#mrargs.direction of fwd -> ok; rev -> ok; _ -> mrverror(<<"Invalid direction.">>) end, case {Args#mrargs.limit >= 0, Args#mrargs.limit == undefined} of {true, _} -> ok; {_, true} -> ok; _ -> mrverror(<<"`limit` must be a positive integer.">>) end, case Args#mrargs.skip < 0 of true -> mrverror(<<"`skip` must be >= 0">>); _ -> ok end, case {Args#mrargs.view_type, Args#mrargs.group_level} of {red, exact} -> ok; {_, 0} -> ok; {red, Int} when is_integer(Int), Int >= 0 -> ok; {red, _} -> mrverror(<<"`group_level` must be >= 0">>); {map, _} -> mrverror(<<"Invalid use of grouping on a map view.">>) end, case Args#mrargs.stale of ok -> ok; update_after -> ok; false -> ok; _ -> mrverror(<<"Invalid value for `stale`.">>) end, case is_boolean(Args#mrargs.inclusive_end) of true -> ok; _ -> mrverror(<<"Invalid value for `inclusive_end`.">>) end, case {Args#mrargs.view_type, Args#mrargs.include_docs} of {red, true} -> mrverror(<<"`include_docs` is invalid for reduce">>); {_, ID} when is_boolean(ID) -> ok; _ -> mrverror(<<"Invalid value for `include_docs`">>) end, case {Args#mrargs.view_type, Args#mrargs.conflicts} of {_, undefined} -> ok; {map, V} when is_boolean(V) -> ok; {red, undefined} -> ok; {map, _} -> mrverror(<<"Invalid value for `conflicts`.">>); {red, _} -> mrverror(<<"`conflicts` is invalid for reduce views.">>) end, SKDocId = case {Args#mrargs.direction, Args#mrargs.start_key_docid} of {fwd, undefined} -> <<>>; {rev, undefined} -> <<255>>; {_, SKDocId1} -> SKDocId1 end, EKDocId = case {Args#mrargs.direction, Args#mrargs.end_key_docid} of {fwd, undefined} -> <<255>>; {rev, undefined} -> <<>>; {_, EKDocId1} -> EKDocId1 end, Args#mrargs{ start_key_docid=SKDocId, end_key_docid=EKDocId }. check_range(#mrargs{start_key=undefined}, _Cmp) -> ok; check_range(#mrargs{end_key=undefined}, _Cmp) -> ok; check_range(#mrargs{start_key=K, end_key=K}, _Cmp) -> ok; check_range(Args, Cmp) -> #mrargs{ direction=Dir, start_key=SK, start_key_docid=SKD, end_key=EK, end_key_docid=EKD } = Args, case {Dir, Cmp({SK, SKD}, {EK, EKD})} of {fwd, false} -> throw({query_parse_error, <<"No rows can match your key range, reverse your ", "start_key and end_key or set descending=true">>}); {rev, true} -> throw({query_parse_error, <<"No rows can match your key range, reverse your ", "start_key and end_key or set descending=false">>}); _ -> ok end. view_cmp({_Nth, _Lang, View}) -> view_cmp(View); view_cmp(View) -> fun(A, B) -> couch_btree:less(View#mrview.btree, A, B) end. make_header(State) -> #mrst{ update_seq=Seq, purge_seq=PurgeSeq, id_btree=IdBtree, views=Views } = State, ViewStates = [ { couch_btree:get_state(V#mrview.btree), V#mrview.update_seq, V#mrview.purge_seq } || V <- Views ], #mrheader{ seq=Seq, purge_seq=PurgeSeq, id_btree_state=couch_btree:get_state(IdBtree), view_states=ViewStates }. index_file(DbName, Sig) -> FileName = couch_index_util:hexsig(Sig) ++ ".view", couch_index_util:index_file(mrview, DbName, FileName). compaction_file(DbName, Sig) -> FileName = couch_index_util:hexsig(Sig) ++ ".compact.view", couch_index_util:index_file(mrview, DbName, FileName). open_file(FName) -> case couch_file:open(FName, [nologifmissing]) of {ok, Fd} -> {ok, Fd}; {error, enoent} -> couch_file:open(FName, [create]); Error -> Error end. delete_files(DbName, Sig) -> delete_index_file(DbName, Sig), delete_compaction_file(DbName, Sig). delete_index_file(DbName, Sig) -> delete_file(index_file(DbName, Sig)). delete_compaction_file(DbName, Sig) -> delete_file(compaction_file(DbName, Sig)). delete_file(FName) -> case filelib:is_file(FName) of true -> RootDir = couch_index_util:root_dir(), couch_file:delete(RootDir, FName); _ -> ok end. reset_index(Db, Fd, #mrst{sig=Sig}=State) -> ok = couch_file:truncate(Fd, 0), ok = couch_file:write_header(Fd, {Sig, nil}), init_state(Db, Fd, reset_state(State), nil). reset_state(State) -> State#mrst{ fd=nil, qserver=nil, update_seq=0, id_btree=nil, views=[View#mrview{btree=nil} || View <- State#mrst.views] }. all_docs_key_opts(Args) -> all_docs_key_opts(Args, []). all_docs_key_opts(#mrargs{keys=undefined}=Args, Extra) -> all_docs_key_opts(Args#mrargs{keys=[]}, Extra); all_docs_key_opts(#mrargs{keys=[], direction=Dir}=Args, Extra) -> [[{dir, Dir}] ++ ad_skey_opts(Args) ++ ad_ekey_opts(Args) ++ Extra]; all_docs_key_opts(#mrargs{keys=Keys, direction=Dir}=Args, Extra) -> lists:map(fun(K) -> [{dir, Dir}] ++ ad_skey_opts(Args#mrargs{start_key=K}) ++ ad_ekey_opts(Args#mrargs{end_key=K}) ++ Extra end, Keys). ad_skey_opts(#mrargs{start_key=SKey}) when is_binary(SKey) -> [{start_key, SKey}]; ad_skey_opts(#mrargs{start_key_docid=SKeyDocId}) -> [{start_key, SKeyDocId}]. ad_ekey_opts(#mrargs{end_key=EKey}=Args) when is_binary(EKey) -> Type = if Args#mrargs.inclusive_end -> end_key; true -> end_key_gt end, [{Type, EKey}]; ad_ekey_opts(#mrargs{end_key_docid=EKeyDocId}=Args) -> Type = if Args#mrargs.inclusive_end -> end_key; true -> end_key_gt end, [{Type, EKeyDocId}]. key_opts(Args) -> key_opts(Args, []). key_opts(#mrargs{keys=undefined, direction=Dir}=Args, Extra) -> [[{dir, Dir}] ++ skey_opts(Args) ++ ekey_opts(Args) ++ Extra]; key_opts(#mrargs{keys=Keys, direction=Dir}=Args, Extra) -> lists:map(fun(K) -> [{dir, Dir}] ++ skey_opts(Args#mrargs{start_key=K}) ++ ekey_opts(Args#mrargs{end_key=K}) ++ Extra end, Keys). skey_opts(#mrargs{start_key=undefined}) -> []; skey_opts(#mrargs{start_key=SKey, start_key_docid=SKeyDocId}) -> [{start_key, {SKey, SKeyDocId}}]. ekey_opts(#mrargs{end_key=undefined}) -> []; ekey_opts(#mrargs{end_key=EKey, end_key_docid=EKeyDocId}=Args) -> case Args#mrargs.inclusive_end of true -> [{end_key, {EKey, EKeyDocId}}]; false -> [{end_key_gt, {EKey, reverse_key_default(EKeyDocId)}}] end. reverse_key_default(<<>>) -> <<255>>; reverse_key_default(<<255>>) -> <<>>; reverse_key_default(Key) -> Key. calculate_data_size(IdBt, Views) -> SumFun = fun(#mrview{btree=Bt}, Acc) -> sum_btree_sizes(Acc, couch_btree:size(Bt)) end, Size = lists:foldl(SumFun, couch_btree:size(IdBt), Views), {ok, Size}. sum_btree_sizes(nil, _) -> null; sum_btree_sizes(_, nil) -> null; sum_btree_sizes(Size1, Size2) -> Size1 + Size2. detuple_kvs([], Acc) -> lists:reverse(Acc); detuple_kvs([KV | Rest], Acc) -> {{Key,Id},Value} = KV, NKV = [[Key, Id], Value], detuple_kvs(Rest, [NKV | Acc]). expand_dups([], Acc) -> lists:reverse(Acc); expand_dups([{Key, {dups, Vals}} | Rest], Acc) -> Expanded = [{Key, Val} || Val <- Vals], expand_dups(Rest, Expanded ++ Acc); expand_dups([KV | Rest], Acc) -> expand_dups(Rest, [KV | Acc]). maybe_load_doc(_Db, _DI, #mrargs{include_docs=false}) -> []; maybe_load_doc(Db, #doc_info{}=DI, #mrargs{conflicts=true, doc_options=Opts}) -> doc_row(couch_index_util:load_doc(Db, DI, [conflicts]), Opts); maybe_load_doc(Db, #doc_info{}=DI, #mrargs{doc_options=Opts}) -> doc_row(couch_index_util:load_doc(Db, DI, []), Opts). maybe_load_doc(_Db, _Id, _Val, #mrargs{include_docs=false}) -> []; maybe_load_doc(Db, Id, Val, #mrargs{conflicts=true, doc_options=Opts}) -> doc_row(couch_index_util:load_doc(Db, docid_rev(Id, Val), [conflicts]), Opts); maybe_load_doc(Db, Id, Val, #mrargs{doc_options=Opts}) -> doc_row(couch_index_util:load_doc(Db, docid_rev(Id, Val), []), Opts). doc_row(null, _Opts) -> [{doc, null}]; doc_row(Doc, Opts) -> [{doc, couch_doc:to_json_obj(Doc, Opts)}]. docid_rev(Id, {Props}) -> DocId = couch_util:get_value(<<"_id">>, Props, Id), Rev = case couch_util:get_value(<<"_rev">>, Props, nil) of nil -> nil; Rev0 -> couch_doc:parse_rev(Rev0) end, {DocId, Rev}; docid_rev(Id, _) -> {Id, nil}. index_of(Key, List) -> index_of(Key, List, 1). index_of(_, [], _) -> throw({error, missing_named_view}); index_of(Key, [Key | _], Idx) -> Idx; index_of(Key, [_ | Rest], Idx) -> index_of(Key, Rest, Idx+1). mrverror(Mesg) -> throw({query_parse_error, Mesg}). %% Updates 1.2.x or earlier view files to 1.3.x or later view files %% transparently, the first time the 1.2.x view file is opened by %% 1.3.x or later. %% %% Here's how it works: %% %% Before opening a view index, %% If no matching index file is found in the new location: %% calculate the <= 1.2.x view signature %% if a file with that signature lives in the old location %% rename it to the new location with the new signature in the name. %% Then proceed to open the view index as usual. %% After opening, read its header. %% %% If the header matches the <= 1.2.x style #index_header record: %% upgrade the header to the new #mrheader record %% The next time the view is used, the new header is used. %% %% If we crash after the rename, but before the header upgrade, %% the header upgrade is done on the next view opening. %% %% If we crash between upgrading to the new header and writing %% that header to disk, we start with the old header again, %% do the upgrade and write to disk. maybe_update_index_file(State) -> DbName = State#mrst.db_name, NewIndexFile = index_file(DbName, State#mrst.sig), % open in read-only mode so we don't create % the file if it doesn't exist. case file:open(NewIndexFile, [read, raw]) of {ok, Fd_Read} -> % the new index file exists, there is nothing to do here. file:close(Fd_Read); _Error -> update_index_file(State) end. update_index_file(State) -> Sig = sig_vsn_12x(State), DbName = State#mrst.db_name, FileName = couch_index_util:hexsig(Sig) ++ ".view", IndexFile = couch_index_util:index_file("", DbName, FileName), % If we have an old index, rename it to the new position. case file:read_file_info(IndexFile) of {ok, _FileInfo} -> % Crash if the rename fails for any reason. % If the target exists, e.g. the next request will find the % new file and we are good. We might need to catch this % further up to avoid a full server crash. ?LOG_INFO("Attempting to update legacy view index file.", []), NewIndexFile = index_file(DbName, State#mrst.sig), ok = filelib:ensure_dir(NewIndexFile), ok = file:rename(IndexFile, NewIndexFile), ?LOG_INFO("Successfully updated legacy view index file.", []), Sig; _ -> % Ignore missing index file ok end. sig_vsn_12x(State) -> ViewInfo = [old_view_format(V) || V <- State#mrst.views], SigData = case State#mrst.lib of {[]} -> {ViewInfo, State#mrst.language, State#mrst.design_opts}; _ -> {ViewInfo, State#mrst.language, State#mrst.design_opts, couch_index_util:sort_lib(State#mrst.lib)} end, couch_util:md5(term_to_binary(SigData)). old_view_format(View) -> { view, View#mrview.id_num, View#mrview.map_names, View#mrview.def, View#mrview.btree, View#mrview.reduce_funs, View#mrview.options }. %% End of <= 1.2.x upgrade code. apache-couchdb-1.6.0/src/couch_mrview/test/0000755000175000001440000000000012332105600020553 5ustar00djcusers00000000000000apache-couchdb-1.6.0/src/couch_mrview/test/01-load.t0000644000175000001440000000202512332105522022077 0ustar00djcusers00000000000000#!/usr/bin/env escript %% -*- erlang -*- % Licensed under the Apache License, Version 2.0 (the "License"); you may not % use this file except in compliance with the License. You may obtain a copy of % the License at % % http://www.apache.org/licenses/LICENSE-2.0 % % Unless required by applicable law or agreed to in writing, software % distributed under the License is distributed on an "AS IS" BASIS, WITHOUT % WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the % License for the specific language governing permissions and limitations under % the License. % Test that we can load each module. main(_) -> test_util:init_code_path(), Modules = [ couch_mrview, couch_mrview_compactor, couch_mrview_http, couch_mrview_index, couch_mrview_updater, couch_mrview_util ], etap:plan(length(Modules)), lists:foreach( fun(Module) -> etap:loaded_ok(Module, lists:concat(["Loaded: ", Module])) end, Modules), etap:end_tests(). apache-couchdb-1.6.0/src/couch_mrview/test/03-red-views.t0000644000175000001440000000436212332105522023075 0ustar00djcusers00000000000000#!/usr/bin/env escript %% -*- erlang -*- % Licensed under the Apache License, Version 2.0 (the "License"); you may not % use this file except in compliance with the License. You may obtain a copy of % the License at % % http://www.apache.org/licenses/LICENSE-2.0 % % Unless required by applicable law or agreed to in writing, software % distributed under the License is distributed on an "AS IS" BASIS, WITHOUT % WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the % License for the specific language governing permissions and limitations under % the License. main(_) -> test_util:run(4, fun() -> test() end). test() -> couch_server_sup:start_link(test_util:config_files()), {ok, Db} = couch_mrview_test_util:init_db(<<"foo">>, red), test_basic(Db), test_key_range(Db), test_group_level(Db), test_group_exact(Db), ok. test_basic(Db) -> Result = run_query(Db, []), Expect = {ok, [ {meta, []}, {row, [{key, null}, {value, 55}]} ]}, etap:is(Result, Expect, "Simple reduce view works."). test_key_range(Db) -> Result = run_query(Db, [{start_key, [0, 2]}, {end_key, [0, 4]}]), Expect = {ok, [ {meta, []}, {row, [{key, null}, {value, 6}]} ]}, etap:is(Result, Expect, "Reduce with key range works."). test_group_level(Db) -> Result = run_query(Db, [{group_level, 1}]), Expect = {ok, [ {meta, []}, {row, [{key, [0]}, {value, 30}]}, {row, [{key, [1]}, {value, 25}]} ]}, etap:is(Result, Expect, "Group level works."). test_group_exact(Db) -> Result = run_query(Db, [{group_level, exact}]), Expect = {ok, [ {meta, []}, {row, [{key, [0, 2]}, {value, 2}]}, {row, [{key, [0, 4]}, {value, 4}]}, {row, [{key, [0, 6]}, {value, 6}]}, {row, [{key, [0, 8]}, {value, 8}]}, {row, [{key, [0, 10]}, {value, 10}]}, {row, [{key, [1, 1]}, {value, 1}]}, {row, [{key, [1, 3]}, {value, 3}]}, {row, [{key, [1, 5]}, {value, 5}]}, {row, [{key, [1, 7]}, {value, 7}]}, {row, [{key, [1, 9]}, {value, 9}]} ]}, etap:is(Result, Expect, "Group exact works."). run_query(Db, Opts) -> couch_mrview:query_view(Db, <<"_design/bar">>, <<"baz">>, Opts). apache-couchdb-1.6.0/src/couch_mrview/test/02-map-views.t0000644000175000001440000000753512332105522023104 0ustar00djcusers00000000000000#!/usr/bin/env escript %% -*- erlang -*- % Licensed under the Apache License, Version 2.0 (the "License"); you may not % use this file except in compliance with the License. You may obtain a copy of % the License at % % http://www.apache.org/licenses/LICENSE-2.0 % % Unless required by applicable law or agreed to in writing, software % distributed under the License is distributed on an "AS IS" BASIS, WITHOUT % WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the % License for the specific language governing permissions and limitations under % the License. main(_) -> test_util:init_code_path(), etap:plan(6), case (catch test()) of ok -> etap:end_tests(); Other -> etap:diag(io_lib:format("Test died abnormally: ~p", [Other])), etap:bail(Other) end, timer:sleep(300), ok. test() -> couch_server_sup:start_link(test_util:config_files()), {ok, Db} = couch_mrview_test_util:init_db(<<"foo">>, map), test_basic(Db), test_range(Db), test_rev_range(Db), test_limit_and_skip(Db), test_include_docs(Db), test_empty_view(Db), ok. test_basic(Db) -> Result = run_query(Db, []), Expect = {ok, [ {meta, [{total, 10}, {offset, 0}]}, {row, [{id, <<"1">>}, {key, 1}, {value, 1}]}, {row, [{id, <<"2">>}, {key, 2}, {value, 2}]}, {row, [{id, <<"3">>}, {key, 3}, {value, 3}]}, {row, [{id, <<"4">>}, {key, 4}, {value, 4}]}, {row, [{id, <<"5">>}, {key, 5}, {value, 5}]}, {row, [{id, <<"6">>}, {key, 6}, {value, 6}]}, {row, [{id, <<"7">>}, {key, 7}, {value, 7}]}, {row, [{id, <<"8">>}, {key, 8}, {value, 8}]}, {row, [{id, <<"9">>}, {key, 9}, {value, 9}]}, {row, [{id, <<"10">>}, {key, 10}, {value, 10}]} ]}, etap:is(Result, Expect, "Simple view query worked."). test_range(Db) -> Result = run_query(Db, [{start_key, 3}, {end_key, 5}]), Expect = {ok, [ {meta, [{total, 10}, {offset, 2}]}, {row, [{id, <<"3">>}, {key, 3}, {value, 3}]}, {row, [{id, <<"4">>}, {key, 4}, {value, 4}]}, {row, [{id, <<"5">>}, {key, 5}, {value, 5}]} ]}, etap:is(Result, Expect, "Query with range works."). test_rev_range(Db) -> Result = run_query(Db, [ {direction, rev}, {start_key, 5}, {end_key, 3}, {inclusive_end, true} ]), Expect = {ok, [ {meta, [{total, 10}, {offset, 5}]}, {row, [{id, <<"5">>}, {key, 5}, {value, 5}]}, {row, [{id, <<"4">>}, {key, 4}, {value, 4}]}, {row, [{id, <<"3">>}, {key, 3}, {value, 3}]} ]}, etap:is(Result, Expect, "Query with reversed range works."). test_limit_and_skip(Db) -> Result = run_query(Db, [ {start_key, 2}, {limit, 3}, {skip, 3} ]), Expect = {ok, [ {meta, [{total, 10}, {offset, 4}]}, {row, [{id, <<"5">>}, {key, 5}, {value, 5}]}, {row, [{id, <<"6">>}, {key, 6}, {value, 6}]}, {row, [{id, <<"7">>}, {key, 7}, {value, 7}]} ]}, etap:is(Result, Expect, "Query with limit and skip works."). test_include_docs(Db) -> Result = run_query(Db, [ {start_key, 8}, {end_key, 8}, {include_docs, true} ]), Doc = {[ {<<"_id">>,<<"8">>}, {<<"_rev">>, <<"1-55b9a29311341e07ec0a7ca13bc1b59f">>}, {<<"val">>,8} ]}, Expect = {ok, [ {meta, [{total, 10}, {offset, 7}]}, {row, [{id, <<"8">>}, {key, 8}, {value, 8}, {doc, Doc}]} ]}, etap:is(Result, Expect, "Query with include docs works."). test_empty_view(Db) -> Result = couch_mrview:query_view(Db, <<"_design/bar">>, <<"bing">>), Expect = {ok, [ {meta, [{total, 0}, {offset, 0}]} ]}, etap:is(Result, Expect, "Empty views are correct."). run_query(Db, Opts) -> couch_mrview:query_view(Db, <<"_design/bar">>, <<"baz">>, Opts). apache-couchdb-1.6.0/src/couch_mrview/test/04-index-info.t0000644000175000001440000000356212332105522023232 0ustar00djcusers00000000000000#!/usr/bin/env escript %% -*- erlang -*- % Licensed under the Apache License, Version 2.0 (the "License"); you may not % use this file except in compliance with the License. You may obtain a copy of % the License at % % http://www.apache.org/licenses/LICENSE-2.0 % % Unless required by applicable law or agreed to in writing, software % distributed under the License is distributed on an "AS IS" BASIS, WITHOUT % WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the % License for the specific language governing permissions and limitations under % the License. main(_) -> test_util:init_code_path(), etap:plan(9), case (catch test()) of ok -> etap:end_tests(); Other -> etap:diag(io_lib:format("Test died abnormally: ~p", [Other])), etap:bail(Other) end, timer:sleep(300), ok. sig() -> <<"276df562b152b3c4e5d34024f62672ed">>. test() -> couch_server_sup:start_link(test_util:config_files()), {ok, Db} = couch_mrview_test_util:init_db(<<"foo">>, map), couch_mrview:query_view(Db, <<"_design/bar">>, <<"baz">>), {ok, Info} = couch_mrview:get_info(Db, <<"_design/bar">>), etap:is(getval(signature, Info), sig(), "Signature is ok."), etap:is(getval(language, Info), <<"javascript">>, "Language is ok."), etap:is_greater(getval(disk_size, Info), 0, "Disk size is ok."), etap:is_greater(getval(data_size, Info), 0, "Data size is ok."), etap:is(getval(update_seq, Info), 11, "Update seq is ok."), etap:is(getval(purge_seq, Info), 0, "Purge seq is ok."), etap:is(getval(updater_running, Info), false, "No updater running."), etap:is(getval(compact_running, Info), false, "No compaction running."), etap:is(getval(waiting_clients, Info), 0, "No waiting clients."), ok. getval(Key, PL) -> {value, {Key, Val}} = lists:keysearch(Key, 1, PL), Val. apache-couchdb-1.6.0/src/couch_mrview/test/07-compact-swap.t0000644000175000001440000000326512332105522023573 0ustar00djcusers00000000000000#!/usr/bin/env escript %% -*- erlang -*- % Licensed under the Apache License, Version 2.0 (the "License"); you may not % use this file except in compliance with the License. You may obtain a copy of % the License at % % http://www.apache.org/licenses/LICENSE-2.0 % % Unless required by applicable law or agreed to in writing, software % distributed under the License is distributed on an "AS IS" BASIS, WITHOUT % WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the % License for the specific language governing permissions and limitations under % the License. main(_) -> test_util:run(1, fun() -> test() end). test() -> couch_server_sup:start_link(test_util:config_files()), {ok, Db} = couch_mrview_test_util:init_db(<<"foo">>, map, 1000), couch_mrview:query_view(Db, <<"_design/bar">>, <<"baz">>), test_swap(Db), ok. test_swap(Db) -> {ok, QPid} = start_query(Db), {ok, MonRef} = couch_mrview:compact(Db, <<"_design/bar">>, [monitor]), receive {'DOWN', MonRef, process, _, _} -> ok after 1000 -> throw(compaction_failed) end, QPid ! {self(), continue}, receive {QPid, Count} -> etap:is(Count, 1000, "View finished successfully.") after 1000 -> throw("query failed") end. start_query(Db) -> Self = self(), Pid = spawn(fun() -> CB = fun (_, wait) -> receive {Self, continue} -> {ok, 0} end; ({row, _}, Count) -> {ok, Count+1}; (_, Count) -> {ok, Count} end, {ok, Result} = couch_mrview:query_view(Db, <<"_design/bar">>, <<"baz">>, [], CB, wait), Self ! {self(), Result} end), {ok, Pid}. apache-couchdb-1.6.0/src/couch_mrview/test/06-all-docs.t0000644000175000001440000001013112332105522022660 0ustar00djcusers00000000000000#!/usr/bin/env escript %% -*- erlang -*- % Licensed under the Apache License, Version 2.0 (the "License"); you may not % use this file except in compliance with the License. You may obtain a copy of % the License at % % http://www.apache.org/licenses/LICENSE-2.0 % % Unless required by applicable law or agreed to in writing, software % distributed under the License is distributed on an "AS IS" BASIS, WITHOUT % WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the % License for the specific language governing permissions and limitations under % the License. main(_) -> test_util:run(6, fun() -> test() end). test() -> couch_server_sup:start_link(test_util:config_files()), {ok, Db} = couch_mrview_test_util:init_db(<<"foo">>, map), test_basic(Db), test_range(Db), test_rev_range(Db), test_limit_and_skip(Db), test_include_docs(Db), test_empty_view(Db), ok. test_basic(Db) -> Result = run_query(Db, []), Expect = {ok, [ {meta, [{total, 11}, {offset, 0}]}, mk_row(<<"1">>, <<"1-08d53a5760b95fce6df2e2c5b008be39">>), mk_row(<<"10">>, <<"1-a05b6ea2bc0243949f103d5b4f15f71e">>), mk_row(<<"2">>, <<"1-b57c77a9e6f7574ca6469f0d6dcd78bb">>), mk_row(<<"3">>, <<"1-7fbf84d56f8017880974402d60f5acd6">>), mk_row(<<"4">>, <<"1-fcaf5852c08ffb239ac8ce16c409f253">>), mk_row(<<"5">>, <<"1-aaac5d460fd40f9286e57b9bf12e23d2">>), mk_row(<<"6">>, <<"1-aca21c2e7bc5f8951424fcfc5d1209d8">>), mk_row(<<"7">>, <<"1-4374aeec17590d82f16e70f318116ad9">>), mk_row(<<"8">>, <<"1-55b9a29311341e07ec0a7ca13bc1b59f">>), mk_row(<<"9">>, <<"1-558c8487d9aee25399a91b5d31d90fe2">>), mk_row(<<"_design/bar">>, <<"1-a44e1dd1994a7717bf89c894ebd1f081">>) ]}, etap:is(Result, Expect, "Simple view query worked."). test_range(Db) -> Result = run_query(Db, [{start_key, <<"3">>}, {end_key, <<"5">>}]), Expect = {ok, [ {meta, [{total, 11}, {offset, 3}]}, mk_row(<<"3">>, <<"1-7fbf84d56f8017880974402d60f5acd6">>), mk_row(<<"4">>, <<"1-fcaf5852c08ffb239ac8ce16c409f253">>), mk_row(<<"5">>, <<"1-aaac5d460fd40f9286e57b9bf12e23d2">>) ]}, etap:is(Result, Expect, "Query with range works."). test_rev_range(Db) -> Result = run_query(Db, [ {direction, rev}, {start_key, <<"5">>}, {end_key, <<"3">>}, {inclusive_end, true} ]), Expect = {ok, [ {meta, [{total, 11}, {offset, 5}]}, mk_row(<<"5">>, <<"1-aaac5d460fd40f9286e57b9bf12e23d2">>), mk_row(<<"4">>, <<"1-fcaf5852c08ffb239ac8ce16c409f253">>), mk_row(<<"3">>, <<"1-7fbf84d56f8017880974402d60f5acd6">>) ]}, etap:is(Result, Expect, "Query with reversed range works."). test_limit_and_skip(Db) -> Result = run_query(Db, [ {start_key, <<"2">>}, {limit, 3}, {skip, 3} ]), Expect = {ok, [ {meta, [{total, 11}, {offset, 5}]}, mk_row(<<"5">>, <<"1-aaac5d460fd40f9286e57b9bf12e23d2">>), mk_row(<<"6">>, <<"1-aca21c2e7bc5f8951424fcfc5d1209d8">>), mk_row(<<"7">>, <<"1-4374aeec17590d82f16e70f318116ad9">>) ]}, etap:is(Result, Expect, "Query with limit and skip works."). test_include_docs(Db) -> Result = run_query(Db, [ {start_key, <<"8">>}, {end_key, <<"8">>}, {include_docs, true} ]), Doc = {[ {<<"_id">>,<<"8">>}, {<<"_rev">>, <<"1-55b9a29311341e07ec0a7ca13bc1b59f">>}, {<<"val">>, 8} ]}, Val = {[{rev, <<"1-55b9a29311341e07ec0a7ca13bc1b59f">>}]}, Expect = {ok, [ {meta, [{total, 11}, {offset, 8}]}, {row, [{id, <<"8">>}, {key, <<"8">>}, {value, Val}, {doc, Doc}]} ]}, etap:is(Result, Expect, "Query with include docs works."). test_empty_view(Db) -> Result = couch_mrview:query_view(Db, <<"_design/bar">>, <<"bing">>), Expect = {ok, [ {meta, [{total, 0}, {offset, 0}]} ]}, etap:is(Result, Expect, "Empty views are correct."). mk_row(Id, Rev) -> {row, [{id, Id}, {key, Id}, {value, {[{rev, Rev}]}}]}. run_query(Db, Opts) -> couch_mrview:query_all_docs(Db, Opts). apache-couchdb-1.6.0/src/couch_mrview/test/05-collation.t0000644000175000001440000001153012332105522023151 0ustar00djcusers00000000000000#!/usr/bin/env escript %% -*- erlang -*- % Licensed under the Apache License, Version 2.0 (the "License"); you may not % use this file except in compliance with the License. You may obtain a copy of % the License at % % http://www.apache.org/licenses/LICENSE-2.0 % % Unless required by applicable law or agreed to in writing, software % distributed under the License is distributed on an "AS IS" BASIS, WITHOUT % WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the % License for the specific language governing permissions and limitations under % the License. main(_) -> test_util:run(9, fun() -> test() end). test() -> couch_server_sup:start_link(test_util:config_files()), {ok, Db0} = couch_mrview_test_util:new_db(<<"foo">>, map), {ok, Db1} = couch_mrview_test_util:save_docs(Db0, docs()), test_collated_fwd(Db1), test_collated_rev(Db1), test_range_collation(Db1), test_inclusive_end(Db1), test_uninclusive_end(Db1), test_with_endkey_docid(Db1), ok. test_collated_fwd(Db) -> {ok, Results} = run_query(Db, []), Expect = [{meta, [{total, 26}, {offset, 0}]}] ++ rows(), etap:is(Results, Expect, "Values were collated correctly."). test_collated_rev(Db) -> {ok, Results} = run_query(Db, [{direction, rev}]), Expect = [{meta, [{total, 26}, {offset, 0}]}] ++ lists:reverse(rows()), etap:is(Results, Expect, "Values were collated correctly descending."). test_range_collation(Db) -> {_, Error} = lists:foldl(fun(V, {Count, Error}) -> {ok, Results} = run_query(Db, [{start_key, V}, {end_key, V}]), Id = list_to_binary(integer_to_list(Count)), Expect = [ {meta, [{total, 26}, {offset, Count}]}, {row, [{id, Id}, {key, V}, {value, 0}]} ], case Results == Expect of true -> {Count+1, Error}; _ -> {Count+1, true} end end, {0, false}, vals()), etap:is(Error, false, "Found each individual key correctly."). test_inclusive_end(Db) -> Opts = [{end_key, <<"b">>}, {inclusive_end, true}], {ok, Rows0} = run_query(Db, Opts), LastRow0 = lists:last(Rows0), Expect0 = {row, [{id,<<"10">>}, {key,<<"b">>}, {value,0}]}, etap:is(LastRow0, Expect0, "Inclusive end is correct."), {ok, Rows1} = run_query(Db, Opts ++ [{direction, rev}]), LastRow1 = lists:last(Rows1), Expect1 = {row, [{id,<<"10">>}, {key,<<"b">>}, {value,0}]}, etap:is(LastRow1, Expect1, "Inclusive end is correct with descending=true"). test_uninclusive_end(Db) -> Opts = [{end_key, <<"b">>}, {inclusive_end, false}], {ok, Rows0} = run_query(Db, Opts), LastRow0 = lists:last(Rows0), Expect0 = {row, [{id,<<"9">>}, {key,<<"aa">>}, {value,0}]}, etap:is(LastRow0, Expect0, "Uninclusive end is correct."), {ok, Rows1} = run_query(Db, Opts ++ [{direction, rev}]), LastRow1 = lists:last(Rows1), Expect1 = {row, [{id,<<"11">>}, {key,<<"B">>}, {value,0}]}, etap:is(LastRow1, Expect1, "Uninclusive end is correct with descending=true"). test_with_endkey_docid(Db) -> {ok, Rows0} = run_query(Db, [ {end_key, <<"b">>}, {end_key_docid, <<"10">>}, {inclusive_end, false} ]), Result0 = lists:last(Rows0), Expect0 = {row, [{id,<<"9">>}, {key,<<"aa">>}, {value,0}]}, etap:is(Result0, Expect0, "Uninclsuive end with endkey_docid set is ok."), {ok, Rows1} = run_query(Db, [ {end_key, <<"b">>}, {end_key_docid, <<"11">>}, {inclusive_end, false} ]), Result1 = lists:last(Rows1), Expect1 = {row, [{id,<<"10">>}, {key,<<"b">>}, {value,0}]}, etap:is(Result1, Expect1, "Uninclsuive end with endkey_docid set is ok."). run_query(Db, Opts) -> couch_mrview:query_view(Db, <<"_design/bar">>, <<"zing">>, Opts). docs() -> {Docs, _} = lists:foldl(fun(V, {Docs0, Count}) -> Doc = couch_doc:from_json_obj({[ {<<"_id">>, list_to_binary(integer_to_list(Count))}, {<<"foo">>, V} ]}), {[Doc | Docs0], Count+1} end, {[], 0}, vals()), Docs. rows() -> {Rows, _} = lists:foldl(fun(V, {Rows0, Count}) -> Id = list_to_binary(integer_to_list(Count)), Row = {row, [{id, Id}, {key, V}, {value, 0}]}, {[Row | Rows0], Count+1} end, {[], 0}, vals()), lists:reverse(Rows). vals() -> [ null, false, true, 1, 2, 3.0, 4, <<"a">>, <<"A">>, <<"aa">>, <<"b">>, <<"B">>, <<"ba">>, <<"bb">>, [<<"a">>], [<<"b">>], [<<"b">>, <<"c">>], [<<"b">>, <<"c">>, <<"a">>], [<<"b">>, <<"d">>], [<<"b">>, <<"d">>, <<"e">>], {[{<<"a">>, 1}]}, {[{<<"a">>, 2}]}, {[{<<"b">>, 1}]}, {[{<<"b">>, 2}]}, {[{<<"b">>, 2}, {<<"a">>, 1}]}, {[{<<"b">>, 2}, {<<"c">>, 2}]} ]. apache-couchdb-1.6.0/src/couch_mrview/Makefile.am0000644000175000001440000000423212332105522021634 0ustar00djcusers00000000000000## Licensed under the Apache License, Version 2.0 (the "License"); you may not ## use this file except in compliance with the License. You may obtain a copy of ## the License at ## ## http://www.apache.org/licenses/LICENSE-2.0 ## ## Unless required by applicable law or agreed to in writing, software ## distributed under the License is distributed on an "AS IS" BASIS, WITHOUT ## WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the ## License for the specific language governing permissions and limitations under ## the License. couch_mrviewlibdir = $(localerlanglibdir)/couch_mrview-0.1 couch_mrviewincludedir = $(couch_mrviewlibdir)/include couch_mrviewebindir = $(couch_mrviewlibdir)/ebin couch_mrviewinclude_DATA = $(include_files) couch_mrviewebin_DATA = $(compiled_files) include_files = \ include/couch_mrview.hrl source_files = \ src/couch_mrview.app.src \ src/couch_mrview.erl \ src/couch_mrview_cleanup.erl \ src/couch_mrview_compactor.erl \ src/couch_mrview_http.erl \ src/couch_mrview_index.erl \ src/couch_mrview_show.erl \ src/couch_mrview_test_util.erl \ src/couch_mrview_updater.erl \ src/couch_mrview_util.erl test_files = \ test/01-load.t \ test/02-map-views.t \ test/03-red-views.t \ test/04-index-info.t \ test/05-collation.t \ test/06-all-docs.t \ test/07-compact-swap.t compiled_files = \ ebin/couch_mrview.app \ ebin/couch_mrview.beam \ ebin/couch_mrview_cleanup.beam \ ebin/couch_mrview_compactor.beam \ ebin/couch_mrview_http.beam \ ebin/couch_mrview_index.beam \ ebin/couch_mrview_show.beam \ ebin/couch_mrview_test_util.beam \ ebin/couch_mrview_updater.beam \ ebin/couch_mrview_util.beam EXTRA_DIST = $(include_files) $(source_files) $(test_files) CLEANFILES = $(compiled_files) check: if TESTS $(abs_top_builddir)/test/etap/run $(abs_top_srcdir)/src/couch_mrview/test endif ebin/%.app: src/%.app.src @mkdir -p ebin/ sed -e "s|%version%|@version@|g" \ < $< > $@ ebin/%.beam: src/%.erl $(include_files) @mkdir -p ebin/ $(ERLC) -Wall -I$(top_srcdir)/src -I$(top_srcdir)/src/couchdb \ -o ebin/ $(ERLC_FLAGS) ${TEST} $<; apache-couchdb-1.6.0/src/couch_mrview/Makefile.in0000644000175000001440000004240012332105551021646 0ustar00djcusers00000000000000# Makefile.in generated by automake 1.11.6 from Makefile.am. # @configure_input@ # Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, # 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011 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__make_dryrun = \ { \ am__dry=no; \ case $$MAKEFLAGS in \ *\\[\ \ ]*) \ echo 'am--echo: ; @echo "AM" OK' | $(MAKE) -f - 2>/dev/null \ | grep '^AM OK$$' >/dev/null || am__dry=yes;; \ *) \ for am__flg in $$MAKEFLAGS; do \ case $$am__flg in \ *=*|--*) ;; \ *n*) am__dry=yes; break;; \ esac; \ done;; \ esac; \ test $$am__dry = yes; \ } 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/couch_mrview DIST_COMMON = $(srcdir)/Makefile.am $(srcdir)/Makefile.in ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 am__aclocal_m4_deps = $(top_srcdir)/m4/libtool.m4 \ $(top_srcdir)/m4/ltoptions.m4 $(top_srcdir)/m4/ltsugar.m4 \ $(top_srcdir)/m4/ltversion.m4 $(top_srcdir)/m4/lt~obsolete.m4 \ $(top_srcdir)/acinclude.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 \ $(top_builddir)/src/snappy/google-snappy/config.h CONFIG_CLEAN_FILES = CONFIG_CLEAN_VPATH_FILES = 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)$(couch_mrviewebindir)" \ "$(DESTDIR)$(couch_mrviewincludedir)" DATA = $(couch_mrviewebin_DATA) $(couch_mrviewinclude_DATA) DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) ACLOCAL = @ACLOCAL@ AMTAR = @AMTAR@ AR = @AR@ AS = @AS@ AUTOCONF = @AUTOCONF@ AUTOHEADER = @AUTOHEADER@ AUTOMAKE = @AUTOMAKE@ AWK = @AWK@ CC = @CC@ CCDEPMODE = @CCDEPMODE@ CFLAGS = @CFLAGS@ CPP = @CPP@ CPPFLAGS = @CPPFLAGS@ CURL_CFLAGS = @CURL_CFLAGS@ CURL_CONFIG = @CURL_CONFIG@ CURL_LIBS = @CURL_LIBS@ CXX = @CXX@ CXXCPP = @CXXCPP@ CXXDEPMODE = @CXXDEPMODE@ CXXFLAGS = @CXXFLAGS@ CYGPATH_W = @CYGPATH_W@ DEFS = @DEFS@ DEPDIR = @DEPDIR@ DLLTOOL = @DLLTOOL@ DSYMUTIL = @DSYMUTIL@ DUMPBIN = @DUMPBIN@ ECHO_C = @ECHO_C@ ECHO_N = @ECHO_N@ ECHO_T = @ECHO_T@ EGREP = @EGREP@ ERL = @ERL@ ERLANG_FLAGS = @ERLANG_FLAGS@ ERLC = @ERLC@ ERLC_FLAGS = @ERLC_FLAGS@ ESCRIPT = @ESCRIPT@ EXEEXT = @EXEEXT@ FGREP = @FGREP@ FLAGS = @FLAGS@ GREP = @GREP@ HAS_HELP2MAN = @HAS_HELP2MAN@ HAS_INSTALLINFO = @HAS_INSTALLINFO@ HAS_MAKEINFO = @HAS_MAKEINFO@ HAS_PDFLATEX = @HAS_PDFLATEX@ HAS_SPHINX_BUILD = @HAS_SPHINX_BUILD@ ICU_BIN = @ICU_BIN@ ICU_CFLAGS = @ICU_CFLAGS@ ICU_CONFIG = @ICU_CONFIG@ ICU_CPPFLAGS = @ICU_CPPFLAGS@ ICU_CXXFLAGS = @ICU_CXXFLAGS@ ICU_LIBS = @ICU_LIBS@ INNO_COMPILER_EXECUTABLE = @INNO_COMPILER_EXECUTABLE@ INSTALL = @INSTALL@ INSTALL_DATA = @INSTALL_DATA@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ INSTALL_SCRIPT = @INSTALL_SCRIPT@ INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ JS_CFLAGS = @JS_CFLAGS@ JS_LIBS = @JS_LIBS@ JS_LIB_BINARY = @JS_LIB_BINARY@ LD = @LD@ LDFLAGS = @LDFLAGS@ LIBOBJS = @LIBOBJS@ LIBS = @LIBS@ LIBTOOL = @LIBTOOL@ LIPO = @LIPO@ LN_S = @LN_S@ LTLIBOBJS = @LTLIBOBJS@ MAKEINFO = @MAKEINFO@ MANIFEST_TOOL = @MANIFEST_TOOL@ MKDIR_P = @MKDIR_P@ NM = @NM@ NMEDIT = @NMEDIT@ OBJDUMP = @OBJDUMP@ OBJEXT = @OBJEXT@ OTOOL = @OTOOL@ OTOOL64 = @OTOOL64@ PACKAGE = @PACKAGE@ PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ PACKAGE_NAME = @PACKAGE_NAME@ PACKAGE_STRING = @PACKAGE_STRING@ PACKAGE_TARNAME = @PACKAGE_TARNAME@ PACKAGE_URL = @PACKAGE_URL@ PACKAGE_VERSION = @PACKAGE_VERSION@ PATH_SEPARATOR = @PATH_SEPARATOR@ PKG_CONFIG = @PKG_CONFIG@ PKG_CONFIG_LIBDIR = @PKG_CONFIG_LIBDIR@ PKG_CONFIG_PATH = @PKG_CONFIG_PATH@ RANLIB = @RANLIB@ SED = @SED@ SET_MAKE = @SET_MAKE@ SHELL = @SHELL@ SNAPPY_MAJOR = @SNAPPY_MAJOR@ SNAPPY_MINOR = @SNAPPY_MINOR@ SNAPPY_PATCHLEVEL = @SNAPPY_PATCHLEVEL@ STRIP = @STRIP@ VERSION = @VERSION@ 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@ ac_cv_have_stddef_h = @ac_cv_have_stddef_h@ ac_cv_have_stdint_h = @ac_cv_have_stdint_h@ am__include = @am__include@ am__leading_dot = @am__leading_dot@ am__quote = @am__quote@ am__tar = @am__tar@ am__untar = @am__untar@ bindir = @bindir@ bug_uri = @bug_uri@ 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@ dvidir = @dvidir@ erlangbin = @erlangbin@ erlangversion = @erlangversion@ exec_prefix = @exec_prefix@ host = @host@ host_alias = @host_alias@ host_cpu = @host_cpu@ host_os = @host_os@ host_vendor = @host_vendor@ htmldir = @htmldir@ includedir = @includedir@ infodir = @infodir@ initdir = @initdir@ install_sh = @install_sh@ launchddir = @launchddir@ libdir = @libdir@ libexecdir = @libexecdir@ localconfdir = @localconfdir@ localdatadir = @localdatadir@ localdocdir = @localdocdir@ localedir = @localedir@ localerlanglibdir = @localerlanglibdir@ locallibbindir = @locallibbindir@ locallibdir = @locallibdir@ localstatedir = @localstatedir@ localstatelibdir = @localstatelibdir@ localstatelogdir = @localstatelogdir@ localstaterundir = @localstaterundir@ mandir = @mandir@ mkdir_p = @mkdir_p@ msvc_redist_dir = @msvc_redist_dir@ msvc_redist_name = @msvc_redist_name@ oldincludedir = @oldincludedir@ openssl_bin_dir = @openssl_bin_dir@ otp_release = @otp_release@ package_author_address = @package_author_address@ package_author_name = @package_author_name@ package_identifier = @package_identifier@ package_name = @package_name@ package_tarname = @package_tarname@ 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@ version = @version@ version_major = @version_major@ version_minor = @version_minor@ version_release = @version_release@ version_revision = @version_revision@ version_stage = @version_stage@ couch_mrviewlibdir = $(localerlanglibdir)/couch_mrview-0.1 couch_mrviewincludedir = $(couch_mrviewlibdir)/include couch_mrviewebindir = $(couch_mrviewlibdir)/ebin couch_mrviewinclude_DATA = $(include_files) couch_mrviewebin_DATA = $(compiled_files) include_files = \ include/couch_mrview.hrl source_files = \ src/couch_mrview.app.src \ src/couch_mrview.erl \ src/couch_mrview_cleanup.erl \ src/couch_mrview_compactor.erl \ src/couch_mrview_http.erl \ src/couch_mrview_index.erl \ src/couch_mrview_show.erl \ src/couch_mrview_test_util.erl \ src/couch_mrview_updater.erl \ src/couch_mrview_util.erl test_files = \ test/01-load.t \ test/02-map-views.t \ test/03-red-views.t \ test/04-index-info.t \ test/05-collation.t \ test/06-all-docs.t \ test/07-compact-swap.t compiled_files = \ ebin/couch_mrview.app \ ebin/couch_mrview.beam \ ebin/couch_mrview_cleanup.beam \ ebin/couch_mrview_compactor.beam \ ebin/couch_mrview_http.beam \ ebin/couch_mrview_index.beam \ ebin/couch_mrview_show.beam \ ebin/couch_mrview_test_util.beam \ ebin/couch_mrview_updater.beam \ ebin/couch_mrview_util.beam EXTRA_DIST = $(include_files) $(source_files) $(test_files) CLEANFILES = $(compiled_files) 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) --foreign src/couch_mrview/Makefile'; \ $(am__cd) $(top_srcdir) && \ $(AUTOMAKE) --foreign src/couch_mrview/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-couch_mrviewebinDATA: $(couch_mrviewebin_DATA) @$(NORMAL_INSTALL) @list='$(couch_mrviewebin_DATA)'; test -n "$(couch_mrviewebindir)" || list=; \ if test -n "$$list"; then \ echo " $(MKDIR_P) '$(DESTDIR)$(couch_mrviewebindir)'"; \ $(MKDIR_P) "$(DESTDIR)$(couch_mrviewebindir)" || 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)$(couch_mrviewebindir)'"; \ $(INSTALL_DATA) $$files "$(DESTDIR)$(couch_mrviewebindir)" || exit $$?; \ done uninstall-couch_mrviewebinDATA: @$(NORMAL_UNINSTALL) @list='$(couch_mrviewebin_DATA)'; test -n "$(couch_mrviewebindir)" || list=; \ files=`for p in $$list; do echo $$p; done | sed -e 's|^.*/||'`; \ dir='$(DESTDIR)$(couch_mrviewebindir)'; $(am__uninstall_files_from_dir) install-couch_mrviewincludeDATA: $(couch_mrviewinclude_DATA) @$(NORMAL_INSTALL) @list='$(couch_mrviewinclude_DATA)'; test -n "$(couch_mrviewincludedir)" || list=; \ if test -n "$$list"; then \ echo " $(MKDIR_P) '$(DESTDIR)$(couch_mrviewincludedir)'"; \ $(MKDIR_P) "$(DESTDIR)$(couch_mrviewincludedir)" || 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)$(couch_mrviewincludedir)'"; \ $(INSTALL_DATA) $$files "$(DESTDIR)$(couch_mrviewincludedir)" || exit $$?; \ done uninstall-couch_mrviewincludeDATA: @$(NORMAL_UNINSTALL) @list='$(couch_mrviewinclude_DATA)'; test -n "$(couch_mrviewincludedir)" || list=; \ files=`for p in $$list; do echo $$p; done | sed -e 's|^.*/||'`; \ dir='$(DESTDIR)$(couch_mrviewincludedir)'; $(am__uninstall_files_from_dir) tags: TAGS TAGS: ctags: CTAGS CTAGS: 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)$(couch_mrviewebindir)" "$(DESTDIR)$(couch_mrviewincludedir)"; 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 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-couch_mrviewebinDATA \ install-couch_mrviewincludeDATA 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-couch_mrviewebinDATA \ uninstall-couch_mrviewincludeDATA .MAKE: install-am install-strip .PHONY: all all-am check check-am clean clean-generic clean-libtool \ distclean distclean-generic distclean-libtool distdir dvi \ dvi-am html html-am info info-am install install-am \ install-couch_mrviewebinDATA install-couch_mrviewincludeDATA \ 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 uninstall uninstall-am \ uninstall-couch_mrviewebinDATA \ uninstall-couch_mrviewincludeDATA check: @TESTS_TRUE@ $(abs_top_builddir)/test/etap/run $(abs_top_srcdir)/src/couch_mrview/test ebin/%.app: src/%.app.src @mkdir -p ebin/ sed -e "s|%version%|@version@|g" \ < $< > $@ ebin/%.beam: src/%.erl $(include_files) @mkdir -p ebin/ $(ERLC) -Wall -I$(top_srcdir)/src -I$(top_srcdir)/src/couchdb \ -o ebin/ $(ERLC_FLAGS) ${TEST} $<; # 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: apache-couchdb-1.6.0/src/couch_mrview/include/0000755000175000001440000000000012332105600021217 5ustar00djcusers00000000000000apache-couchdb-1.6.0/src/couch_mrview/include/couch_mrview.hrl0000644000175000001440000000271012332105522024423 0ustar00djcusers00000000000000% Licensed under the Apache License, Version 2.0 (the "License"); you may not % use this file except in compliance with the License. You may obtain a copy of % the License at % % http://www.apache.org/licenses/LICENSE-2.0 % % Unless required by applicable law or agreed to in writing, software % distributed under the License is distributed on an "AS IS" BASIS, WITHOUT % WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the % License for the specific language governing permissions and limitations under % the License. -record(mrst, { sig=nil, fd=nil, refc, db_name, idx_name, language, design_opts=[], lib, views, id_btree=nil, update_seq=0, purge_seq=0, first_build, partial_resp_pid, doc_acc, doc_queue, write_queue, qserver=nil }). -record(mrview, { id_num, update_seq=0, purge_seq=0, map_names=[], reduce_funs=[], def, btree=nil, options=[] }). -record(mrheader, { seq=0, purge_seq=0, id_btree_state=nil, view_states=nil }). -record(mrargs, { view_type, reduce, preflight_fun, start_key, start_key_docid, end_key, end_key_docid, keys, direction = fwd, limit = 16#10000000, skip = 0, group_level = 0, stale = false, inclusive_end = true, include_docs = false, doc_options = [], update_seq=false, conflicts, callback, list, extra = [] }). apache-couchdb-1.6.0/src/snappy/0000755000175000001440000000000012332105603016417 5ustar00djcusers00000000000000apache-couchdb-1.6.0/src/snappy/google-snappy/0000755000175000001440000000000012332105603021203 5ustar00djcusers00000000000000apache-couchdb-1.6.0/src/snappy/google-snappy/snappy.cc0000644000175000001440000011504012332105522023025 0ustar00djcusers00000000000000// Copyright 2005 Google Inc. All Rights Reserved. // // 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 Google Inc. nor the names of its // contributors may be used to endorse or promote products derived from // this software without specific prior written permission. // // THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS // "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT // LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR // A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT // OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, // SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT // LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, // DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY // THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT // (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE // OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. #include "snappy.h" #include "snappy-internal.h" #include "snappy-sinksource.h" #include #include #include #include namespace snappy { // Any hash function will produce a valid compressed bitstream, but a good // hash function reduces the number of collisions and thus yields better // compression for compressible input, and more speed for incompressible // input. Of course, it doesn't hurt if the hash function is reasonably fast // either, as it gets called a lot. static inline uint32 HashBytes(uint32 bytes, int shift) { uint32 kMul = 0x1e35a7bd; return (bytes * kMul) >> shift; } static inline uint32 Hash(const char* p, int shift) { return HashBytes(UNALIGNED_LOAD32(p), shift); } size_t MaxCompressedLength(size_t source_len) { // Compressed data can be defined as: // compressed := item* literal* // item := literal* copy // // The trailing literal sequence has a space blowup of at most 62/60 // since a literal of length 60 needs one tag byte + one extra byte // for length information. // // Item blowup is trickier to measure. Suppose the "copy" op copies // 4 bytes of data. Because of a special check in the encoding code, // we produce a 4-byte copy only if the offset is < 65536. Therefore // the copy op takes 3 bytes to encode, and this type of item leads // to at most the 62/60 blowup for representing literals. // // Suppose the "copy" op copies 5 bytes of data. If the offset is big // enough, it will take 5 bytes to encode the copy op. Therefore the // worst case here is a one-byte literal followed by a five-byte copy. // I.e., 6 bytes of input turn into 7 bytes of "compressed" data. // // This last factor dominates the blowup, so the final estimate is: return 32 + source_len + source_len/6; } enum { LITERAL = 0, COPY_1_BYTE_OFFSET = 1, // 3 bit length + 3 bits of offset in opcode COPY_2_BYTE_OFFSET = 2, COPY_4_BYTE_OFFSET = 3 }; // Copy "len" bytes from "src" to "op", one byte at a time. Used for // handling COPY operations where the input and output regions may // overlap. For example, suppose: // src == "ab" // op == src + 2 // len == 20 // After IncrementalCopy(src, op, len), the result will have // eleven copies of "ab" // ababababababababababab // Note that this does not match the semantics of either memcpy() // or memmove(). static inline void IncrementalCopy(const char* src, char* op, int len) { DCHECK_GT(len, 0); do { *op++ = *src++; } while (--len > 0); } // Equivalent to IncrementalCopy except that it can write up to ten extra // bytes after the end of the copy, and that it is faster. // // The main part of this loop is a simple copy of eight bytes at a time until // we've copied (at least) the requested amount of bytes. However, if op and // src are less than eight bytes apart (indicating a repeating pattern of // length < 8), we first need to expand the pattern in order to get the correct // results. For instance, if the buffer looks like this, with the eight-byte // and patterns marked as intervals: // // abxxxxxxxxxxxx // [------] src // [------] op // // a single eight-byte copy from to will repeat the pattern once, // after which we can move two bytes without moving : // // ababxxxxxxxxxx // [------] src // [------] op // // and repeat the exercise until the two no longer overlap. // // This allows us to do very well in the special case of one single byte // repeated many times, without taking a big hit for more general cases. // // The worst case of extra writing past the end of the match occurs when // op - src == 1 and len == 1; the last copy will read from byte positions // [0..7] and write to [4..11], whereas it was only supposed to write to // position 1. Thus, ten excess bytes. namespace { const int kMaxIncrementCopyOverflow = 10; } // namespace static inline void IncrementalCopyFastPath(const char* src, char* op, int len) { while (op - src < 8) { UnalignedCopy64(src, op); len -= op - src; op += op - src; } while (len > 0) { UnalignedCopy64(src, op); src += 8; op += 8; len -= 8; } } static inline char* EmitLiteral(char* op, const char* literal, int len, bool allow_fast_path) { int n = len - 1; // Zero-length literals are disallowed if (n < 60) { // Fits in tag byte *op++ = LITERAL | (n << 2); // The vast majority of copies are below 16 bytes, for which a // call to memcpy is overkill. This fast path can sometimes // copy up to 15 bytes too much, but that is okay in the // main loop, since we have a bit to go on for both sides: // // - The input will always have kInputMarginBytes = 15 extra // available bytes, as long as we're in the main loop, and // if not, allow_fast_path = false. // - The output will always have 32 spare bytes (see // MaxCompressedLength). if (allow_fast_path && len <= 16) { UnalignedCopy64(literal, op); UnalignedCopy64(literal + 8, op + 8); return op + len; } } else { // Encode in upcoming bytes char* base = op; int count = 0; op++; while (n > 0) { *op++ = n & 0xff; n >>= 8; count++; } assert(count >= 1); assert(count <= 4); *base = LITERAL | ((59+count) << 2); } memcpy(op, literal, len); return op + len; } static inline char* EmitCopyLessThan64(char* op, size_t offset, int len) { DCHECK_LE(len, 64); DCHECK_GE(len, 4); DCHECK_LT(offset, 65536); if ((len < 12) && (offset < 2048)) { size_t len_minus_4 = len - 4; assert(len_minus_4 < 8); // Must fit in 3 bits *op++ = COPY_1_BYTE_OFFSET | ((len_minus_4) << 2) | ((offset >> 8) << 5); *op++ = offset & 0xff; } else { *op++ = COPY_2_BYTE_OFFSET | ((len-1) << 2); LittleEndian::Store16(op, offset); op += 2; } return op; } static inline char* EmitCopy(char* op, size_t offset, int len) { // Emit 64 byte copies but make sure to keep at least four bytes reserved while (len >= 68) { op = EmitCopyLessThan64(op, offset, 64); len -= 64; } // Emit an extra 60 byte copy if have too much data to fit in one copy if (len > 64) { op = EmitCopyLessThan64(op, offset, 60); len -= 60; } // Emit remainder op = EmitCopyLessThan64(op, offset, len); return op; } bool GetUncompressedLength(const char* start, size_t n, size_t* result) { uint32 v = 0; const char* limit = start + n; if (Varint::Parse32WithLimit(start, limit, &v) != NULL) { *result = v; return true; } else { return false; } } namespace internal { uint16* WorkingMemory::GetHashTable(size_t input_size, int* table_size) { // Use smaller hash table when input.size() is smaller, since we // fill the table, incurring O(hash table size) overhead for // compression, and if the input is short, we won't need that // many hash table entries anyway. assert(kMaxHashTableSize >= 256); size_t htsize = 256; while (htsize < kMaxHashTableSize && htsize < input_size) { htsize <<= 1; } CHECK_EQ(0, htsize & (htsize - 1)) << ": must be power of two"; CHECK_LE(htsize, kMaxHashTableSize) << ": hash table too large"; uint16* table; if (htsize <= ARRAYSIZE(small_table_)) { table = small_table_; } else { if (large_table_ == NULL) { large_table_ = new uint16[kMaxHashTableSize]; } table = large_table_; } *table_size = htsize; memset(table, 0, htsize * sizeof(*table)); return table; } } // end namespace internal // For 0 <= offset <= 4, GetUint32AtOffset(GetEightBytesAt(p), offset) will // equal UNALIGNED_LOAD32(p + offset). Motivation: On x86-64 hardware we have // empirically found that overlapping loads such as // UNALIGNED_LOAD32(p) ... UNALIGNED_LOAD32(p+1) ... UNALIGNED_LOAD32(p+2) // are slower than UNALIGNED_LOAD64(p) followed by shifts and casts to uint32. // // We have different versions for 64- and 32-bit; ideally we would avoid the // two functions and just inline the UNALIGNED_LOAD64 call into // GetUint32AtOffset, but GCC (at least not as of 4.6) is seemingly not clever // enough to avoid loading the value multiple times then. For 64-bit, the load // is done when GetEightBytesAt() is called, whereas for 32-bit, the load is // done at GetUint32AtOffset() time. #ifdef ARCH_K8 typedef uint64 EightBytesReference; static inline EightBytesReference GetEightBytesAt(const char* ptr) { return UNALIGNED_LOAD64(ptr); } static inline uint32 GetUint32AtOffset(uint64 v, int offset) { DCHECK_GE(offset, 0); DCHECK_LE(offset, 4); return v >> (LittleEndian::IsLittleEndian() ? 8 * offset : 32 - 8 * offset); } #else typedef const char* EightBytesReference; static inline EightBytesReference GetEightBytesAt(const char* ptr) { return ptr; } static inline uint32 GetUint32AtOffset(const char* v, int offset) { DCHECK_GE(offset, 0); DCHECK_LE(offset, 4); return UNALIGNED_LOAD32(v + offset); } #endif // Flat array compression that does not emit the "uncompressed length" // prefix. Compresses "input" string to the "*op" buffer. // // REQUIRES: "input" is at most "kBlockSize" bytes long. // REQUIRES: "op" points to an array of memory that is at least // "MaxCompressedLength(input.size())" in size. // REQUIRES: All elements in "table[0..table_size-1]" are initialized to zero. // REQUIRES: "table_size" is a power of two // // Returns an "end" pointer into "op" buffer. // "end - op" is the compressed size of "input". namespace internal { char* CompressFragment(const char* input, size_t input_size, char* op, uint16* table, const int table_size) { // "ip" is the input pointer, and "op" is the output pointer. const char* ip = input; CHECK_LE(input_size, kBlockSize); CHECK_EQ(table_size & (table_size - 1), 0) << ": table must be power of two"; const int shift = 32 - Bits::Log2Floor(table_size); DCHECK_EQ(static_cast(kuint32max >> shift), table_size - 1); const char* ip_end = input + input_size; const char* base_ip = ip; // Bytes in [next_emit, ip) will be emitted as literal bytes. Or // [next_emit, ip_end) after the main loop. const char* next_emit = ip; const size_t kInputMarginBytes = 15; if (PREDICT_TRUE(input_size >= kInputMarginBytes)) { const char* ip_limit = input + input_size - kInputMarginBytes; for (uint32 next_hash = Hash(++ip, shift); ; ) { DCHECK_LT(next_emit, ip); // The body of this loop calls EmitLiteral once and then EmitCopy one or // more times. (The exception is that when we're close to exhausting // the input we goto emit_remainder.) // // In the first iteration of this loop we're just starting, so // there's nothing to copy, so calling EmitLiteral once is // necessary. And we only start a new iteration when the // current iteration has determined that a call to EmitLiteral will // precede the next call to EmitCopy (if any). // // Step 1: Scan forward in the input looking for a 4-byte-long match. // If we get close to exhausting the input then goto emit_remainder. // // Heuristic match skipping: If 32 bytes are scanned with no matches // found, start looking only at every other byte. If 32 more bytes are // scanned, look at every third byte, etc.. When a match is found, // immediately go back to looking at every byte. This is a small loss // (~5% performance, ~0.1% density) for compressible data due to more // bookkeeping, but for non-compressible data (such as JPEG) it's a huge // win since the compressor quickly "realizes" the data is incompressible // and doesn't bother looking for matches everywhere. // // The "skip" variable keeps track of how many bytes there are since the // last match; dividing it by 32 (ie. right-shifting by five) gives the // number of bytes to move ahead for each iteration. uint32 skip = 32; const char* next_ip = ip; const char* candidate; do { ip = next_ip; uint32 hash = next_hash; DCHECK_EQ(hash, Hash(ip, shift)); uint32 bytes_between_hash_lookups = skip++ >> 5; next_ip = ip + bytes_between_hash_lookups; if (PREDICT_FALSE(next_ip > ip_limit)) { goto emit_remainder; } next_hash = Hash(next_ip, shift); candidate = base_ip + table[hash]; DCHECK_GE(candidate, base_ip); DCHECK_LT(candidate, ip); table[hash] = ip - base_ip; } while (PREDICT_TRUE(UNALIGNED_LOAD32(ip) != UNALIGNED_LOAD32(candidate))); // Step 2: A 4-byte match has been found. We'll later see if more // than 4 bytes match. But, prior to the match, input // bytes [next_emit, ip) are unmatched. Emit them as "literal bytes." DCHECK_LE(next_emit + 16, ip_end); op = EmitLiteral(op, next_emit, ip - next_emit, true); // Step 3: Call EmitCopy, and then see if another EmitCopy could // be our next move. Repeat until we find no match for the // input immediately after what was consumed by the last EmitCopy call. // // If we exit this loop normally then we need to call EmitLiteral next, // though we don't yet know how big the literal will be. We handle that // by proceeding to the next iteration of the main loop. We also can exit // this loop via goto if we get close to exhausting the input. EightBytesReference input_bytes; uint32 candidate_bytes = 0; do { // We have a 4-byte match at ip, and no need to emit any // "literal bytes" prior to ip. const char* base = ip; int matched = 4 + FindMatchLength(candidate + 4, ip + 4, ip_end); ip += matched; size_t offset = base - candidate; DCHECK_EQ(0, memcmp(base, candidate, matched)); op = EmitCopy(op, offset, matched); // We could immediately start working at ip now, but to improve // compression we first update table[Hash(ip - 1, ...)]. const char* insert_tail = ip - 1; next_emit = ip; if (PREDICT_FALSE(ip >= ip_limit)) { goto emit_remainder; } input_bytes = GetEightBytesAt(insert_tail); uint32 prev_hash = HashBytes(GetUint32AtOffset(input_bytes, 0), shift); table[prev_hash] = ip - base_ip - 1; uint32 cur_hash = HashBytes(GetUint32AtOffset(input_bytes, 1), shift); candidate = base_ip + table[cur_hash]; candidate_bytes = UNALIGNED_LOAD32(candidate); table[cur_hash] = ip - base_ip; } while (GetUint32AtOffset(input_bytes, 1) == candidate_bytes); next_hash = HashBytes(GetUint32AtOffset(input_bytes, 2), shift); ++ip; } } emit_remainder: // Emit the remaining bytes as a literal if (next_emit < ip_end) { op = EmitLiteral(op, next_emit, ip_end - next_emit, false); } return op; } } // end namespace internal // Signature of output types needed by decompression code. // The decompression code is templatized on a type that obeys this // signature so that we do not pay virtual function call overhead in // the middle of a tight decompression loop. // // class DecompressionWriter { // public: // // Called before decompression // void SetExpectedLength(size_t length); // // // Called after decompression // bool CheckLength() const; // // // Called repeatedly during decompression // bool Append(const char* ip, size_t length); // bool AppendFromSelf(uint32 offset, size_t length); // // // The difference between TryFastAppend and Append is that TryFastAppend // // is allowed to read up to bytes from the input buffer, // // whereas Append is allowed to read . // // // // Also, TryFastAppend is allowed to return false, declining the append, // // without it being a fatal error -- just "return false" would be // // a perfectly legal implementation of TryFastAppend. The intention // // is for TryFastAppend to allow a fast path in the common case of // // a small append. // // // // NOTE(user): TryFastAppend must always return decline (return false) // // if is 61 or more, as in this case the literal length is not // // decoded fully. In practice, this should not be a big problem, // // as it is unlikely that one would implement a fast path accepting // // this much data. // bool TryFastAppend(const char* ip, size_t available, size_t length); // }; // ----------------------------------------------------------------------- // Lookup table for decompression code. Generated by ComputeTable() below. // ----------------------------------------------------------------------- // Mapping from i in range [0,4] to a mask to extract the bottom 8*i bits static const uint32 wordmask[] = { 0u, 0xffu, 0xffffu, 0xffffffu, 0xffffffffu }; // Data stored per entry in lookup table: // Range Bits-used Description // ------------------------------------ // 1..64 0..7 Literal/copy length encoded in opcode byte // 0..7 8..10 Copy offset encoded in opcode byte / 256 // 0..4 11..13 Extra bytes after opcode // // We use eight bits for the length even though 7 would have sufficed // because of efficiency reasons: // (1) Extracting a byte is faster than a bit-field // (2) It properly aligns copy offset so we do not need a <<8 static const uint16 char_table[256] = { 0x0001, 0x0804, 0x1001, 0x2001, 0x0002, 0x0805, 0x1002, 0x2002, 0x0003, 0x0806, 0x1003, 0x2003, 0x0004, 0x0807, 0x1004, 0x2004, 0x0005, 0x0808, 0x1005, 0x2005, 0x0006, 0x0809, 0x1006, 0x2006, 0x0007, 0x080a, 0x1007, 0x2007, 0x0008, 0x080b, 0x1008, 0x2008, 0x0009, 0x0904, 0x1009, 0x2009, 0x000a, 0x0905, 0x100a, 0x200a, 0x000b, 0x0906, 0x100b, 0x200b, 0x000c, 0x0907, 0x100c, 0x200c, 0x000d, 0x0908, 0x100d, 0x200d, 0x000e, 0x0909, 0x100e, 0x200e, 0x000f, 0x090a, 0x100f, 0x200f, 0x0010, 0x090b, 0x1010, 0x2010, 0x0011, 0x0a04, 0x1011, 0x2011, 0x0012, 0x0a05, 0x1012, 0x2012, 0x0013, 0x0a06, 0x1013, 0x2013, 0x0014, 0x0a07, 0x1014, 0x2014, 0x0015, 0x0a08, 0x1015, 0x2015, 0x0016, 0x0a09, 0x1016, 0x2016, 0x0017, 0x0a0a, 0x1017, 0x2017, 0x0018, 0x0a0b, 0x1018, 0x2018, 0x0019, 0x0b04, 0x1019, 0x2019, 0x001a, 0x0b05, 0x101a, 0x201a, 0x001b, 0x0b06, 0x101b, 0x201b, 0x001c, 0x0b07, 0x101c, 0x201c, 0x001d, 0x0b08, 0x101d, 0x201d, 0x001e, 0x0b09, 0x101e, 0x201e, 0x001f, 0x0b0a, 0x101f, 0x201f, 0x0020, 0x0b0b, 0x1020, 0x2020, 0x0021, 0x0c04, 0x1021, 0x2021, 0x0022, 0x0c05, 0x1022, 0x2022, 0x0023, 0x0c06, 0x1023, 0x2023, 0x0024, 0x0c07, 0x1024, 0x2024, 0x0025, 0x0c08, 0x1025, 0x2025, 0x0026, 0x0c09, 0x1026, 0x2026, 0x0027, 0x0c0a, 0x1027, 0x2027, 0x0028, 0x0c0b, 0x1028, 0x2028, 0x0029, 0x0d04, 0x1029, 0x2029, 0x002a, 0x0d05, 0x102a, 0x202a, 0x002b, 0x0d06, 0x102b, 0x202b, 0x002c, 0x0d07, 0x102c, 0x202c, 0x002d, 0x0d08, 0x102d, 0x202d, 0x002e, 0x0d09, 0x102e, 0x202e, 0x002f, 0x0d0a, 0x102f, 0x202f, 0x0030, 0x0d0b, 0x1030, 0x2030, 0x0031, 0x0e04, 0x1031, 0x2031, 0x0032, 0x0e05, 0x1032, 0x2032, 0x0033, 0x0e06, 0x1033, 0x2033, 0x0034, 0x0e07, 0x1034, 0x2034, 0x0035, 0x0e08, 0x1035, 0x2035, 0x0036, 0x0e09, 0x1036, 0x2036, 0x0037, 0x0e0a, 0x1037, 0x2037, 0x0038, 0x0e0b, 0x1038, 0x2038, 0x0039, 0x0f04, 0x1039, 0x2039, 0x003a, 0x0f05, 0x103a, 0x203a, 0x003b, 0x0f06, 0x103b, 0x203b, 0x003c, 0x0f07, 0x103c, 0x203c, 0x0801, 0x0f08, 0x103d, 0x203d, 0x1001, 0x0f09, 0x103e, 0x203e, 0x1801, 0x0f0a, 0x103f, 0x203f, 0x2001, 0x0f0b, 0x1040, 0x2040 }; // In debug mode, allow optional computation of the table at startup. // Also, check that the decompression table is correct. #ifndef NDEBUG DEFINE_bool(snappy_dump_decompression_table, false, "If true, we print the decompression table at startup."); static uint16 MakeEntry(unsigned int extra, unsigned int len, unsigned int copy_offset) { // Check that all of the fields fit within the allocated space DCHECK_EQ(extra, extra & 0x7); // At most 3 bits DCHECK_EQ(copy_offset, copy_offset & 0x7); // At most 3 bits DCHECK_EQ(len, len & 0x7f); // At most 7 bits return len | (copy_offset << 8) | (extra << 11); } static void ComputeTable() { uint16 dst[256]; // Place invalid entries in all places to detect missing initialization int assigned = 0; for (int i = 0; i < 256; i++) { dst[i] = 0xffff; } // Small LITERAL entries. We store (len-1) in the top 6 bits. for (unsigned int len = 1; len <= 60; len++) { dst[LITERAL | ((len-1) << 2)] = MakeEntry(0, len, 0); assigned++; } // Large LITERAL entries. We use 60..63 in the high 6 bits to // encode the number of bytes of length info that follow the opcode. for (unsigned int extra_bytes = 1; extra_bytes <= 4; extra_bytes++) { // We set the length field in the lookup table to 1 because extra // bytes encode len-1. dst[LITERAL | ((extra_bytes+59) << 2)] = MakeEntry(extra_bytes, 1, 0); assigned++; } // COPY_1_BYTE_OFFSET. // // The tag byte in the compressed data stores len-4 in 3 bits, and // offset/256 in 5 bits. offset%256 is stored in the next byte. // // This format is used for length in range [4..11] and offset in // range [0..2047] for (unsigned int len = 4; len < 12; len++) { for (unsigned int offset = 0; offset < 2048; offset += 256) { dst[COPY_1_BYTE_OFFSET | ((len-4)<<2) | ((offset>>8)<<5)] = MakeEntry(1, len, offset>>8); assigned++; } } // COPY_2_BYTE_OFFSET. // Tag contains len-1 in top 6 bits, and offset in next two bytes. for (unsigned int len = 1; len <= 64; len++) { dst[COPY_2_BYTE_OFFSET | ((len-1)<<2)] = MakeEntry(2, len, 0); assigned++; } // COPY_4_BYTE_OFFSET. // Tag contents len-1 in top 6 bits, and offset in next four bytes. for (unsigned int len = 1; len <= 64; len++) { dst[COPY_4_BYTE_OFFSET | ((len-1)<<2)] = MakeEntry(4, len, 0); assigned++; } // Check that each entry was initialized exactly once. CHECK_EQ(assigned, 256); for (int i = 0; i < 256; i++) { CHECK_NE(dst[i], 0xffff); } if (FLAGS_snappy_dump_decompression_table) { printf("static const uint16 char_table[256] = {\n "); for (int i = 0; i < 256; i++) { printf("0x%04x%s", dst[i], ((i == 255) ? "\n" : (((i%8) == 7) ? ",\n " : ", "))); } printf("};\n"); } // Check that computed table matched recorded table for (int i = 0; i < 256; i++) { CHECK_EQ(dst[i], char_table[i]); } } #endif /* !NDEBUG */ // Helper class for decompression class SnappyDecompressor { private: Source* reader_; // Underlying source of bytes to decompress const char* ip_; // Points to next buffered byte const char* ip_limit_; // Points just past buffered bytes uint32 peeked_; // Bytes peeked from reader (need to skip) bool eof_; // Hit end of input without an error? char scratch_[5]; // Temporary buffer for PeekFast() boundaries // Ensure that all of the tag metadata for the next tag is available // in [ip_..ip_limit_-1]. Also ensures that [ip,ip+4] is readable even // if (ip_limit_ - ip_ < 5). // // Returns true on success, false on error or end of input. bool RefillTag(); public: explicit SnappyDecompressor(Source* reader) : reader_(reader), ip_(NULL), ip_limit_(NULL), peeked_(0), eof_(false) { } ~SnappyDecompressor() { // Advance past any bytes we peeked at from the reader reader_->Skip(peeked_); } // Returns true iff we have hit the end of the input without an error. bool eof() const { return eof_; } // Read the uncompressed length stored at the start of the compressed data. // On succcess, stores the length in *result and returns true. // On failure, returns false. bool ReadUncompressedLength(uint32* result) { DCHECK(ip_ == NULL); // Must not have read anything yet // Length is encoded in 1..5 bytes *result = 0; uint32 shift = 0; while (true) { if (shift >= 32) return false; size_t n; const char* ip = reader_->Peek(&n); if (n == 0) return false; const unsigned char c = *(reinterpret_cast(ip)); reader_->Skip(1); *result |= static_cast(c & 0x7f) << shift; if (c < 128) { break; } shift += 7; } return true; } // Process the next item found in the input. // Returns true if successful, false on error or end of input. template void DecompressAllTags(Writer* writer) { const char* ip = ip_; // We could have put this refill fragment only at the beginning of the loop. // However, duplicating it at the end of each branch gives the compiler more // scope to optimize the expression based on the local // context, which overall increases speed. #define MAYBE_REFILL() \ if (ip_limit_ - ip < 5) { \ ip_ = ip; \ if (!RefillTag()) return; \ ip = ip_; \ } MAYBE_REFILL(); for ( ;; ) { const unsigned char c = *(reinterpret_cast(ip++)); if ((c & 0x3) == LITERAL) { size_t literal_length = (c >> 2) + 1u; if (writer->TryFastAppend(ip, ip_limit_ - ip, literal_length)) { DCHECK_LT(literal_length, 61); ip += literal_length; MAYBE_REFILL(); continue; } if (PREDICT_FALSE(literal_length >= 61)) { // Long literal. const size_t literal_length_length = literal_length - 60; literal_length = (LittleEndian::Load32(ip) & wordmask[literal_length_length]) + 1; ip += literal_length_length; } size_t avail = ip_limit_ - ip; while (avail < literal_length) { if (!writer->Append(ip, avail)) return; literal_length -= avail; reader_->Skip(peeked_); size_t n; ip = reader_->Peek(&n); avail = n; peeked_ = avail; if (avail == 0) return; // Premature end of input ip_limit_ = ip + avail; } if (!writer->Append(ip, literal_length)) { return; } ip += literal_length; MAYBE_REFILL(); } else { const uint32 entry = char_table[c]; const uint32 trailer = LittleEndian::Load32(ip) & wordmask[entry >> 11]; const uint32 length = entry & 0xff; ip += entry >> 11; // copy_offset/256 is encoded in bits 8..10. By just fetching // those bits, we get copy_offset (since the bit-field starts at // bit 8). const uint32 copy_offset = entry & 0x700; if (!writer->AppendFromSelf(copy_offset + trailer, length)) { return; } MAYBE_REFILL(); } } #undef MAYBE_REFILL } }; bool SnappyDecompressor::RefillTag() { const char* ip = ip_; if (ip == ip_limit_) { // Fetch a new fragment from the reader reader_->Skip(peeked_); // All peeked bytes are used up size_t n; ip = reader_->Peek(&n); peeked_ = n; if (n == 0) { eof_ = true; return false; } ip_limit_ = ip + n; } // Read the tag character DCHECK_LT(ip, ip_limit_); const unsigned char c = *(reinterpret_cast(ip)); const uint32 entry = char_table[c]; const uint32 needed = (entry >> 11) + 1; // +1 byte for 'c' DCHECK_LE(needed, sizeof(scratch_)); // Read more bytes from reader if needed uint32 nbuf = ip_limit_ - ip; if (nbuf < needed) { // Stitch together bytes from ip and reader to form the word // contents. We store the needed bytes in "scratch_". They // will be consumed immediately by the caller since we do not // read more than we need. memmove(scratch_, ip, nbuf); reader_->Skip(peeked_); // All peeked bytes are used up peeked_ = 0; while (nbuf < needed) { size_t length; const char* src = reader_->Peek(&length); if (length == 0) return false; uint32 to_add = min(needed - nbuf, length); memcpy(scratch_ + nbuf, src, to_add); nbuf += to_add; reader_->Skip(to_add); } DCHECK_EQ(nbuf, needed); ip_ = scratch_; ip_limit_ = scratch_ + needed; } else if (nbuf < 5) { // Have enough bytes, but move into scratch_ so that we do not // read past end of input memmove(scratch_, ip, nbuf); reader_->Skip(peeked_); // All peeked bytes are used up peeked_ = 0; ip_ = scratch_; ip_limit_ = scratch_ + nbuf; } else { // Pass pointer to buffer returned by reader_. ip_ = ip; } return true; } template static bool InternalUncompress(Source* r, Writer* writer, uint32 max_len) { // Read the uncompressed length from the front of the compressed input SnappyDecompressor decompressor(r); uint32 uncompressed_len = 0; if (!decompressor.ReadUncompressedLength(&uncompressed_len)) return false; return InternalUncompressAllTags( &decompressor, writer, uncompressed_len, max_len); } template static bool InternalUncompressAllTags(SnappyDecompressor* decompressor, Writer* writer, uint32 uncompressed_len, uint32 max_len) { // Protect against possible DoS attack if (static_cast(uncompressed_len) > max_len) { return false; } writer->SetExpectedLength(uncompressed_len); // Process the entire input decompressor->DecompressAllTags(writer); return (decompressor->eof() && writer->CheckLength()); } bool GetUncompressedLength(Source* source, uint32* result) { SnappyDecompressor decompressor(source); return decompressor.ReadUncompressedLength(result); } size_t Compress(Source* reader, Sink* writer) { size_t written = 0; size_t N = reader->Available(); char ulength[Varint::kMax32]; char* p = Varint::Encode32(ulength, N); writer->Append(ulength, p-ulength); written += (p - ulength); internal::WorkingMemory wmem; char* scratch = NULL; char* scratch_output = NULL; while (N > 0) { // Get next block to compress (without copying if possible) size_t fragment_size; const char* fragment = reader->Peek(&fragment_size); DCHECK_NE(fragment_size, 0) << ": premature end of input"; const size_t num_to_read = min(N, kBlockSize); size_t bytes_read = fragment_size; size_t pending_advance = 0; if (bytes_read >= num_to_read) { // Buffer returned by reader is large enough pending_advance = num_to_read; fragment_size = num_to_read; } else { // Read into scratch buffer if (scratch == NULL) { // If this is the last iteration, we want to allocate N bytes // of space, otherwise the max possible kBlockSize space. // num_to_read contains exactly the correct value scratch = new char[num_to_read]; } memcpy(scratch, fragment, bytes_read); reader->Skip(bytes_read); while (bytes_read < num_to_read) { fragment = reader->Peek(&fragment_size); size_t n = min(fragment_size, num_to_read - bytes_read); memcpy(scratch + bytes_read, fragment, n); bytes_read += n; reader->Skip(n); } DCHECK_EQ(bytes_read, num_to_read); fragment = scratch; fragment_size = num_to_read; } DCHECK_EQ(fragment_size, num_to_read); // Get encoding table for compression int table_size; uint16* table = wmem.GetHashTable(num_to_read, &table_size); // Compress input_fragment and append to dest const int max_output = MaxCompressedLength(num_to_read); // Need a scratch buffer for the output, in case the byte sink doesn't // have room for us directly. if (scratch_output == NULL) { scratch_output = new char[max_output]; } else { // Since we encode kBlockSize regions followed by a region // which is <= kBlockSize in length, a previously allocated // scratch_output[] region is big enough for this iteration. } char* dest = writer->GetAppendBuffer(max_output, scratch_output); char* end = internal::CompressFragment(fragment, fragment_size, dest, table, table_size); writer->Append(dest, end - dest); written += (end - dest); N -= num_to_read; reader->Skip(pending_advance); } delete[] scratch; delete[] scratch_output; return written; } // ----------------------------------------------------------------------- // Flat array interfaces // ----------------------------------------------------------------------- // A type that writes to a flat array. // Note that this is not a "ByteSink", but a type that matches the // Writer template argument to SnappyDecompressor::DecompressAllTags(). class SnappyArrayWriter { private: char* base_; char* op_; char* op_limit_; public: inline explicit SnappyArrayWriter(char* dst) : base_(dst), op_(dst) { } inline void SetExpectedLength(size_t len) { op_limit_ = op_ + len; } inline bool CheckLength() const { return op_ == op_limit_; } inline bool Append(const char* ip, size_t len) { char* op = op_; const size_t space_left = op_limit_ - op; if (space_left < len) { return false; } memcpy(op, ip, len); op_ = op + len; return true; } inline bool TryFastAppend(const char* ip, size_t available, size_t len) { char* op = op_; const size_t space_left = op_limit_ - op; if (len <= 16 && available >= 16 && space_left >= 16) { // Fast path, used for the majority (about 95%) of invocations. UnalignedCopy64(ip, op); UnalignedCopy64(ip + 8, op + 8); op_ = op + len; return true; } else { return false; } } inline bool AppendFromSelf(size_t offset, size_t len) { char* op = op_; const size_t space_left = op_limit_ - op; if (op - base_ <= offset - 1u) { // -1u catches offset==0 return false; } if (len <= 16 && offset >= 8 && space_left >= 16) { // Fast path, used for the majority (70-80%) of dynamic invocations. UnalignedCopy64(op - offset, op); UnalignedCopy64(op - offset + 8, op + 8); } else { if (space_left >= len + kMaxIncrementCopyOverflow) { IncrementalCopyFastPath(op - offset, op, len); } else { if (space_left < len) { return false; } IncrementalCopy(op - offset, op, len); } } op_ = op + len; return true; } }; bool RawUncompress(const char* compressed, size_t n, char* uncompressed) { ByteArraySource reader(compressed, n); return RawUncompress(&reader, uncompressed); } bool RawUncompress(Source* compressed, char* uncompressed) { SnappyArrayWriter output(uncompressed); return InternalUncompress(compressed, &output, kuint32max); } bool Uncompress(const char* compressed, size_t n, string* uncompressed) { size_t ulength; if (!GetUncompressedLength(compressed, n, &ulength)) { return false; } // Protect against possible DoS attack if ((static_cast(ulength) + uncompressed->size()) > uncompressed->max_size()) { return false; } STLStringResizeUninitialized(uncompressed, ulength); return RawUncompress(compressed, n, string_as_array(uncompressed)); } // A Writer that drops everything on the floor and just does validation class SnappyDecompressionValidator { private: size_t expected_; size_t produced_; public: inline SnappyDecompressionValidator() : produced_(0) { } inline void SetExpectedLength(size_t len) { expected_ = len; } inline bool CheckLength() const { return expected_ == produced_; } inline bool Append(const char* ip, size_t len) { produced_ += len; return produced_ <= expected_; } inline bool TryFastAppend(const char* ip, size_t available, size_t length) { return false; } inline bool AppendFromSelf(size_t offset, size_t len) { if (produced_ <= offset - 1u) return false; // -1u catches offset==0 produced_ += len; return produced_ <= expected_; } }; bool IsValidCompressedBuffer(const char* compressed, size_t n) { ByteArraySource reader(compressed, n); SnappyDecompressionValidator writer; return InternalUncompress(&reader, &writer, kuint32max); } void RawCompress(const char* input, size_t input_length, char* compressed, size_t* compressed_length) { ByteArraySource reader(input, input_length); UncheckedByteArraySink writer(compressed); Compress(&reader, &writer); // Compute how many bytes were added *compressed_length = (writer.CurrentDestination() - compressed); } size_t Compress(const char* input, size_t input_length, string* compressed) { // Pre-grow the buffer to the max length of the compressed output compressed->resize(MaxCompressedLength(input_length)); size_t compressed_length; RawCompress(input, input_length, string_as_array(compressed), &compressed_length); compressed->resize(compressed_length); return compressed_length; } } // end namespace snappy apache-couchdb-1.6.0/src/snappy/google-snappy/snappy-stubs-public.h.in0000644000175000001440000000571112332105522025711 0ustar00djcusers00000000000000// Copyright 2011 Google Inc. All Rights Reserved. // Author: sesse@google.com (Steinar H. Gunderson) // // 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 Google Inc. nor the names of its // contributors may be used to endorse or promote products derived from // this software without specific prior written permission. // // THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS // "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT // LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR // A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT // OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, // SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT // LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, // DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY // THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT // (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE // OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. // // Various type stubs for the open-source version of Snappy. // // This file cannot include config.h, as it is included from snappy.h, // which is a public header. Instead, snappy-stubs-public.h is generated by // from snappy-stubs-public.h.in at configure time. #ifndef UTIL_SNAPPY_OPENSOURCE_SNAPPY_STUBS_PUBLIC_H_ #define UTIL_SNAPPY_OPENSOURCE_SNAPPY_STUBS_PUBLIC_H_ #if @ac_cv_have_stdint_h@ #include #endif #if @ac_cv_have_stddef_h@ #include #endif #define SNAPPY_MAJOR @SNAPPY_MAJOR@ #define SNAPPY_MINOR @SNAPPY_MINOR@ #define SNAPPY_PATCHLEVEL @SNAPPY_PATCHLEVEL@ #define SNAPPY_VERSION \ ((SNAPPY_MAJOR << 16) | (SNAPPY_MINOR << 8) | SNAPPY_PATCHLEVEL) #include namespace snappy { #if @ac_cv_have_stdint_h@ typedef int8_t int8; typedef uint8_t uint8; typedef int16_t int16; typedef uint16_t uint16; typedef int32_t int32; typedef uint32_t uint32; typedef int64_t int64; typedef uint64_t uint64; #else typedef signed char int8; typedef unsigned char uint8; typedef short int16; typedef unsigned short uint16; typedef int int32; typedef unsigned int uint32; typedef long long int64; typedef unsigned long long uint64; #endif typedef std::string string; #define DISALLOW_COPY_AND_ASSIGN(TypeName) \ TypeName(const TypeName&); \ void operator=(const TypeName&) } // namespace snappy #endif // UTIL_SNAPPY_OPENSOURCE_SNAPPY_STUBS_PUBLIC_H_ apache-couchdb-1.6.0/src/snappy/google-snappy/snappy-internal.h0000644000175000001440000001252612332105522024506 0ustar00djcusers00000000000000// Copyright 2008 Google Inc. All Rights Reserved. // // 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 Google Inc. nor the names of its // contributors may be used to endorse or promote products derived from // this software without specific prior written permission. // // THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS // "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT // LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR // A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT // OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, // SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT // LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, // DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY // THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT // (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE // OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. // // Internals shared between the Snappy implementation and its unittest. #ifndef UTIL_SNAPPY_SNAPPY_INTERNAL_H_ #define UTIL_SNAPPY_SNAPPY_INTERNAL_H_ #include "snappy-stubs-internal.h" namespace snappy { namespace internal { class WorkingMemory { public: WorkingMemory() : large_table_(NULL) { } ~WorkingMemory() { delete[] large_table_; } // Allocates and clears a hash table using memory in "*this", // stores the number of buckets in "*table_size" and returns a pointer to // the base of the hash table. uint16* GetHashTable(size_t input_size, int* table_size); private: uint16 small_table_[1<<10]; // 2KB uint16* large_table_; // Allocated only when needed DISALLOW_COPY_AND_ASSIGN(WorkingMemory); }; // Flat array compression that does not emit the "uncompressed length" // prefix. Compresses "input" string to the "*op" buffer. // // REQUIRES: "input_length <= kBlockSize" // REQUIRES: "op" points to an array of memory that is at least // "MaxCompressedLength(input_length)" in size. // REQUIRES: All elements in "table[0..table_size-1]" are initialized to zero. // REQUIRES: "table_size" is a power of two // // Returns an "end" pointer into "op" buffer. // "end - op" is the compressed size of "input". char* CompressFragment(const char* input, size_t input_length, char* op, uint16* table, const int table_size); // Return the largest n such that // // s1[0,n-1] == s2[0,n-1] // and n <= (s2_limit - s2). // // Does not read *s2_limit or beyond. // Does not read *(s1 + (s2_limit - s2)) or beyond. // Requires that s2_limit >= s2. // // Separate implementation for x86_64, for speed. Uses the fact that // x86_64 is little endian. #if defined(ARCH_K8) static inline int FindMatchLength(const char* s1, const char* s2, const char* s2_limit) { DCHECK_GE(s2_limit, s2); int matched = 0; // Find out how long the match is. We loop over the data 64 bits at a // time until we find a 64-bit block that doesn't match; then we find // the first non-matching bit and use that to calculate the total // length of the match. while (PREDICT_TRUE(s2 <= s2_limit - 8)) { if (PREDICT_FALSE(UNALIGNED_LOAD64(s2) == UNALIGNED_LOAD64(s1 + matched))) { s2 += 8; matched += 8; } else { // On current (mid-2008) Opteron models there is a 3% more // efficient code sequence to find the first non-matching byte. // However, what follows is ~10% better on Intel Core 2 and newer, // and we expect AMD's bsf instruction to improve. uint64 x = UNALIGNED_LOAD64(s2) ^ UNALIGNED_LOAD64(s1 + matched); int matching_bits = Bits::FindLSBSetNonZero64(x); matched += matching_bits >> 3; return matched; } } while (PREDICT_TRUE(s2 < s2_limit)) { if (PREDICT_TRUE(s1[matched] == *s2)) { ++s2; ++matched; } else { return matched; } } return matched; } #else static inline int FindMatchLength(const char* s1, const char* s2, const char* s2_limit) { // Implementation based on the x86-64 version, above. DCHECK_GE(s2_limit, s2); int matched = 0; while (s2 <= s2_limit - 4 && UNALIGNED_LOAD32(s2) == UNALIGNED_LOAD32(s1 + matched)) { s2 += 4; matched += 4; } if (LittleEndian::IsLittleEndian() && s2 <= s2_limit - 4) { uint32 x = UNALIGNED_LOAD32(s2) ^ UNALIGNED_LOAD32(s1 + matched); int matching_bits = Bits::FindLSBSetNonZero(x); matched += matching_bits >> 3; } else { while ((s2 < s2_limit) && (s1[matched] == *s2)) { ++s2; ++matched; } } return matched; } #endif } // end namespace internal } // end namespace snappy #endif // UTIL_SNAPPY_SNAPPY_INTERNAL_H_ apache-couchdb-1.6.0/src/snappy/google-snappy/config.h.in0000644000175000001440000000643412332105522023235 0ustar00djcusers00000000000000/* config.h.in. Generated from configure.ac by autoheader. */ /* Define if building universal (internal helper macro) */ #undef AC_APPLE_UNIVERSAL_BUILD /* Define to 1 if the compiler supports __builtin_ctz and friends. */ #undef HAVE_BUILTIN_CTZ /* Define to 1 if the compiler supports __builtin_expect. */ #undef HAVE_BUILTIN_EXPECT /* Define to 1 if you have the header file. */ #undef HAVE_BYTESWAP_H /* Define to 1 if you have the header file. */ #undef HAVE_DLFCN_H /* Use the gflags package for command-line parsing. */ #undef HAVE_GFLAGS /* Defined when Google Test is available. */ #undef HAVE_GTEST /* Define to 1 if you have the header file. */ #undef HAVE_INTTYPES_H /* Define to 1 if you have the `fastlz' library (-lfastlz). */ #undef HAVE_LIBFASTLZ /* Define to 1 if you have the `lzf' library (-llzf). */ #undef HAVE_LIBLZF /* Define to 1 if you have the `lzo2' library (-llzo2). */ #undef HAVE_LIBLZO2 /* Define to 1 if you have the `quicklz' library (-lquicklz). */ #undef HAVE_LIBQUICKLZ /* Define to 1 if you have the `z' library (-lz). */ #undef HAVE_LIBZ /* Define to 1 if you have the header file. */ #undef HAVE_MEMORY_H /* Define to 1 if you have the header file. */ #undef HAVE_STDDEF_H /* 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 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_BYTESWAP_H /* Define to 1 if you have the header file. */ #undef HAVE_SYS_ENDIAN_H /* Define to 1 if you have the header file. */ #undef HAVE_SYS_MMAN_H /* Define to 1 if you have the header file. */ #undef HAVE_SYS_RESOURCE_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_UNISTD_H /* Define to 1 if you have the header file. */ #undef HAVE_WINDOWS_H /* Define to the sub-directory in which libtool stores uninstalled libraries. */ #undef LT_OBJDIR /* 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 /* Version number of package */ #undef VERSION /* Define WORDS_BIGENDIAN to 1 if your processor stores words with the most significant byte first (like Motorola and SPARC, unlike Intel). */ #if defined AC_APPLE_UNIVERSAL_BUILD # if defined __BIG_ENDIAN__ # define WORDS_BIGENDIAN 1 # endif #else # ifndef WORDS_BIGENDIAN # undef WORDS_BIGENDIAN # endif #endif apache-couchdb-1.6.0/src/snappy/google-snappy/snappy-sinksource.h0000644000175000001440000001150312332105522025051 0ustar00djcusers00000000000000// Copyright 2011 Google Inc. All Rights Reserved. // // 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 Google Inc. nor the names of its // contributors may be used to endorse or promote products derived from // this software without specific prior written permission. // // THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS // "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT // LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR // A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT // OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, // SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT // LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, // DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY // THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT // (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE // OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. #ifndef UTIL_SNAPPY_SNAPPY_SINKSOURCE_H_ #define UTIL_SNAPPY_SNAPPY_SINKSOURCE_H_ #include namespace snappy { // A Sink is an interface that consumes a sequence of bytes. class Sink { public: Sink() { } virtual ~Sink(); // Append "bytes[0,n-1]" to this. virtual void Append(const char* bytes, size_t n) = 0; // Returns a writable buffer of the specified length for appending. // May return a pointer to the caller-owned scratch buffer which // must have at least the indicated length. The returned buffer is // only valid until the next operation on this Sink. // // After writing at most "length" bytes, call Append() with the // pointer returned from this function and the number of bytes // written. Many Append() implementations will avoid copying // bytes if this function returned an internal buffer. // // If a non-scratch buffer is returned, the caller may only pass a // prefix of it to Append(). That is, it is not correct to pass an // interior pointer of the returned array to Append(). // // The default implementation always returns the scratch buffer. virtual char* GetAppendBuffer(size_t length, char* scratch); private: // No copying Sink(const Sink&); void operator=(const Sink&); }; // A Source is an interface that yields a sequence of bytes class Source { public: Source() { } virtual ~Source(); // Return the number of bytes left to read from the source virtual size_t Available() const = 0; // Peek at the next flat region of the source. Does not reposition // the source. The returned region is empty iff Available()==0. // // Returns a pointer to the beginning of the region and store its // length in *len. // // The returned region is valid until the next call to Skip() or // until this object is destroyed, whichever occurs first. // // The returned region may be larger than Available() (for example // if this ByteSource is a view on a substring of a larger source). // The caller is responsible for ensuring that it only reads the // Available() bytes. virtual const char* Peek(size_t* len) = 0; // Skip the next n bytes. Invalidates any buffer returned by // a previous call to Peek(). // REQUIRES: Available() >= n virtual void Skip(size_t n) = 0; private: // No copying Source(const Source&); void operator=(const Source&); }; // A Source implementation that yields the contents of a flat array class ByteArraySource : public Source { public: ByteArraySource(const char* p, size_t n) : ptr_(p), left_(n) { } virtual ~ByteArraySource(); virtual size_t Available() const; virtual const char* Peek(size_t* len); virtual void Skip(size_t n); private: const char* ptr_; size_t left_; }; // A Sink implementation that writes to a flat array without any bound checks. class UncheckedByteArraySink : public Sink { public: explicit UncheckedByteArraySink(char* dest) : dest_(dest) { } virtual ~UncheckedByteArraySink(); virtual void Append(const char* data, size_t n); virtual char* GetAppendBuffer(size_t len, char* scratch); // Return the current output pointer so that a caller can see how // many bytes were produced. // Note: this is not a Sink method. char* CurrentDestination() const { return dest_; } private: char* dest_; }; } #endif // UTIL_SNAPPY_SNAPPY_SINKSOURCE_H_ apache-couchdb-1.6.0/src/snappy/google-snappy/snappy-stubs-internal.h0000644000175000001440000004166012332105522025645 0ustar00djcusers00000000000000// Copyright 2011 Google Inc. All Rights Reserved. // // 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 Google Inc. nor the names of its // contributors may be used to endorse or promote products derived from // this software without specific prior written permission. // // THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS // "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT // LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR // A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT // OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, // SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT // LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, // DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY // THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT // (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE // OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. // // Various stubs for the open-source version of Snappy. #ifndef UTIL_SNAPPY_OPENSOURCE_SNAPPY_STUBS_INTERNAL_H_ #define UTIL_SNAPPY_OPENSOURCE_SNAPPY_STUBS_INTERNAL_H_ #ifdef HAVE_CONFIG_H #include "config.h" #endif #include #include #include #include #include #ifdef HAVE_SYS_MMAN_H #include #endif #include "snappy-stubs-public.h" #if defined(__x86_64__) // Enable 64-bit optimized versions of some routines. #define ARCH_K8 1 #endif // Needed by OS X, among others. #ifndef MAP_ANONYMOUS #define MAP_ANONYMOUS MAP_ANON #endif // Pull in std::min, std::ostream, and the likes. This is safe because this // header file is never used from any public header files. using namespace std; // The size of an array, if known at compile-time. // Will give unexpected results if used on a pointer. // We undefine it first, since some compilers already have a definition. #ifdef ARRAYSIZE #undef ARRAYSIZE #endif #define ARRAYSIZE(a) (sizeof(a) / sizeof(*(a))) // Static prediction hints. #ifdef HAVE_BUILTIN_EXPECT #define PREDICT_FALSE(x) (__builtin_expect(x, 0)) #define PREDICT_TRUE(x) (__builtin_expect(!!(x), 1)) #else #define PREDICT_FALSE(x) x #define PREDICT_TRUE(x) x #endif // This is only used for recomputing the tag byte table used during // decompression; for simplicity we just remove it from the open-source // version (anyone who wants to regenerate it can just do the call // themselves within main()). #define DEFINE_bool(flag_name, default_value, description) \ bool FLAGS_ ## flag_name = default_value #define DECLARE_bool(flag_name) \ extern bool FLAGS_ ## flag_name namespace snappy { static const uint32 kuint32max = static_cast(0xFFFFFFFF); static const int64 kint64max = static_cast(0x7FFFFFFFFFFFFFFFLL); // Logging. #define LOG(level) LogMessage() #define VLOG(level) true ? (void)0 : \ snappy::LogMessageVoidify() & snappy::LogMessage() class LogMessage { public: LogMessage() { } ~LogMessage() { cerr << endl; } LogMessage& operator<<(const std::string& msg) { cerr << msg; return *this; } LogMessage& operator<<(int x) { cerr << x; return *this; } }; // Asserts, both versions activated in debug mode only, // and ones that are always active. #define CRASH_UNLESS(condition) \ PREDICT_TRUE(condition) ? (void)0 : \ snappy::LogMessageVoidify() & snappy::LogMessageCrash() class LogMessageCrash : public LogMessage { public: LogMessageCrash() { } ~LogMessageCrash() { cerr << endl; abort(); } }; // This class is used to explicitly ignore values in the conditional // logging macros. This avoids compiler warnings like "value computed // is not used" and "statement has no effect". class LogMessageVoidify { public: LogMessageVoidify() { } // This has to be an operator with a precedence lower than << but // higher than ?: void operator&(const LogMessage&) { } }; #define CHECK(cond) CRASH_UNLESS(cond) #define CHECK_LE(a, b) CRASH_UNLESS((a) <= (b)) #define CHECK_GE(a, b) CRASH_UNLESS((a) >= (b)) #define CHECK_EQ(a, b) CRASH_UNLESS((a) == (b)) #define CHECK_NE(a, b) CRASH_UNLESS((a) != (b)) #define CHECK_LT(a, b) CRASH_UNLESS((a) < (b)) #define CHECK_GT(a, b) CRASH_UNLESS((a) > (b)) #ifdef NDEBUG #define DCHECK(cond) CRASH_UNLESS(true) #define DCHECK_LE(a, b) CRASH_UNLESS(true) #define DCHECK_GE(a, b) CRASH_UNLESS(true) #define DCHECK_EQ(a, b) CRASH_UNLESS(true) #define DCHECK_NE(a, b) CRASH_UNLESS(true) #define DCHECK_LT(a, b) CRASH_UNLESS(true) #define DCHECK_GT(a, b) CRASH_UNLESS(true) #else #define DCHECK(cond) CHECK(cond) #define DCHECK_LE(a, b) CHECK_LE(a, b) #define DCHECK_GE(a, b) CHECK_GE(a, b) #define DCHECK_EQ(a, b) CHECK_EQ(a, b) #define DCHECK_NE(a, b) CHECK_NE(a, b) #define DCHECK_LT(a, b) CHECK_LT(a, b) #define DCHECK_GT(a, b) CHECK_GT(a, b) #endif // Potentially unaligned loads and stores. // x86 and PowerPC can simply do these loads and stores native. #if defined(__i386__) || defined(__x86_64__) || defined(__powerpc__) #define UNALIGNED_LOAD16(_p) (*reinterpret_cast(_p)) #define UNALIGNED_LOAD32(_p) (*reinterpret_cast(_p)) #define UNALIGNED_LOAD64(_p) (*reinterpret_cast(_p)) #define UNALIGNED_STORE16(_p, _val) (*reinterpret_cast(_p) = (_val)) #define UNALIGNED_STORE32(_p, _val) (*reinterpret_cast(_p) = (_val)) #define UNALIGNED_STORE64(_p, _val) (*reinterpret_cast(_p) = (_val)) // ARMv7 and newer support native unaligned accesses, but only of 16-bit // and 32-bit values (not 64-bit); older versions either raise a fatal signal, // do an unaligned read and rotate the words around a bit, or do the reads very // slowly (trip through kernel mode). There's no simple #define that says just // ā€œARMv7 or higherā€, so we have to filter away all ARMv5 and ARMv6 // sub-architectures. // // This is a mess, but there's not much we can do about it. #elif defined(__arm__) && \ !defined(__ARM_ARCH_5__) && \ !defined(__ARM_ARCH_5T__) && \ !defined(__ARM_ARCH_5TE__) && \ !defined(__ARM_ARCH_5TEJ__) && \ !defined(__ARM_ARCH_6__) && \ !defined(__ARM_ARCH_6J__) && \ !defined(__ARM_ARCH_6K__) && \ !defined(__ARM_ARCH_6Z__) && \ !defined(__ARM_ARCH_6ZK__) && \ !defined(__ARM_ARCH_6T2__) #define UNALIGNED_LOAD16(_p) (*reinterpret_cast(_p)) #define UNALIGNED_LOAD32(_p) (*reinterpret_cast(_p)) #define UNALIGNED_STORE16(_p, _val) (*reinterpret_cast(_p) = (_val)) #define UNALIGNED_STORE32(_p, _val) (*reinterpret_cast(_p) = (_val)) // TODO(user): NEON supports unaligned 64-bit loads and stores. // See if that would be more efficient on platforms supporting it, // at least for copies. inline uint64 UNALIGNED_LOAD64(const void *p) { uint64 t; memcpy(&t, p, sizeof t); return t; } inline void UNALIGNED_STORE64(void *p, uint64 v) { memcpy(p, &v, sizeof v); } #else // These functions are provided for architectures that don't support // unaligned loads and stores. inline uint16 UNALIGNED_LOAD16(const void *p) { uint16 t; memcpy(&t, p, sizeof t); return t; } inline uint32 UNALIGNED_LOAD32(const void *p) { uint32 t; memcpy(&t, p, sizeof t); return t; } inline uint64 UNALIGNED_LOAD64(const void *p) { uint64 t; memcpy(&t, p, sizeof t); return t; } inline void UNALIGNED_STORE16(void *p, uint16 v) { memcpy(p, &v, sizeof v); } inline void UNALIGNED_STORE32(void *p, uint32 v) { memcpy(p, &v, sizeof v); } inline void UNALIGNED_STORE64(void *p, uint64 v) { memcpy(p, &v, sizeof v); } #endif // This can be more efficient than UNALIGNED_LOAD64 + UNALIGNED_STORE64 // on some platforms, in particular ARM. inline void UnalignedCopy64(const void *src, void *dst) { if (sizeof(void *) == 8) { UNALIGNED_STORE64(dst, UNALIGNED_LOAD64(src)); } else { const char *src_char = reinterpret_cast(src); char *dst_char = reinterpret_cast(dst); UNALIGNED_STORE32(dst_char, UNALIGNED_LOAD32(src_char)); UNALIGNED_STORE32(dst_char + 4, UNALIGNED_LOAD32(src_char + 4)); } } // The following guarantees declaration of the byte swap functions. #ifdef WORDS_BIGENDIAN #ifdef HAVE_SYS_BYTEORDER_H #include #endif #ifdef HAVE_SYS_ENDIAN_H #include #endif #ifdef _MSC_VER #include #define bswap_16(x) _byteswap_ushort(x) #define bswap_32(x) _byteswap_ulong(x) #define bswap_64(x) _byteswap_uint64(x) #elif defined(__APPLE__) // Mac OS X / Darwin features #include #define bswap_16(x) OSSwapInt16(x) #define bswap_32(x) OSSwapInt32(x) #define bswap_64(x) OSSwapInt64(x) #elif defined(HAVE_BYTESWAP_H) #include #elif defined(bswap32) // FreeBSD defines bswap{16,32,64} in (already #included). #define bswap_16(x) bswap16(x) #define bswap_32(x) bswap32(x) #define bswap_64(x) bswap64(x) #elif defined(BSWAP_64) // Solaris 10 defines BSWAP_{16,32,64} in (already #included). #define bswap_16(x) BSWAP_16(x) #define bswap_32(x) BSWAP_32(x) #define bswap_64(x) BSWAP_64(x) #else inline uint16 bswap_16(uint16 x) { return (x << 8) | (x >> 8); } inline uint32 bswap_32(uint32 x) { x = ((x & 0xff00ff00UL) >> 8) | ((x & 0x00ff00ffUL) << 8); return (x >> 16) | (x << 16); } inline uint64 bswap_64(uint64 x) { x = ((x & 0xff00ff00ff00ff00ULL) >> 8) | ((x & 0x00ff00ff00ff00ffULL) << 8); x = ((x & 0xffff0000ffff0000ULL) >> 16) | ((x & 0x0000ffff0000ffffULL) << 16); return (x >> 32) | (x << 32); } #endif #endif // WORDS_BIGENDIAN // Convert to little-endian storage, opposite of network format. // Convert x from host to little endian: x = LittleEndian.FromHost(x); // convert x from little endian to host: x = LittleEndian.ToHost(x); // // Store values into unaligned memory converting to little endian order: // LittleEndian.Store16(p, x); // // Load unaligned values stored in little endian converting to host order: // x = LittleEndian.Load16(p); class LittleEndian { public: // Conversion functions. #ifdef WORDS_BIGENDIAN static uint16 FromHost16(uint16 x) { return bswap_16(x); } static uint16 ToHost16(uint16 x) { return bswap_16(x); } static uint32 FromHost32(uint32 x) { return bswap_32(x); } static uint32 ToHost32(uint32 x) { return bswap_32(x); } static bool IsLittleEndian() { return false; } #else // !defined(WORDS_BIGENDIAN) static uint16 FromHost16(uint16 x) { return x; } static uint16 ToHost16(uint16 x) { return x; } static uint32 FromHost32(uint32 x) { return x; } static uint32 ToHost32(uint32 x) { return x; } static bool IsLittleEndian() { return true; } #endif // !defined(WORDS_BIGENDIAN) // Functions to do unaligned loads and stores in little-endian order. static uint16 Load16(const void *p) { return ToHost16(UNALIGNED_LOAD16(p)); } static void Store16(void *p, uint16 v) { UNALIGNED_STORE16(p, FromHost16(v)); } static uint32 Load32(const void *p) { return ToHost32(UNALIGNED_LOAD32(p)); } static void Store32(void *p, uint32 v) { UNALIGNED_STORE32(p, FromHost32(v)); } }; // Some bit-manipulation functions. class Bits { public: // Return floor(log2(n)) for positive integer n. Returns -1 iff n == 0. static int Log2Floor(uint32 n); // Return the first set least / most significant bit, 0-indexed. Returns an // undefined value if n == 0. FindLSBSetNonZero() is similar to ffs() except // that it's 0-indexed. static int FindLSBSetNonZero(uint32 n); static int FindLSBSetNonZero64(uint64 n); private: DISALLOW_COPY_AND_ASSIGN(Bits); }; #ifdef HAVE_BUILTIN_CTZ inline int Bits::Log2Floor(uint32 n) { return n == 0 ? -1 : 31 ^ __builtin_clz(n); } inline int Bits::FindLSBSetNonZero(uint32 n) { return __builtin_ctz(n); } inline int Bits::FindLSBSetNonZero64(uint64 n) { return __builtin_ctzll(n); } #else // Portable versions. inline int Bits::Log2Floor(uint32 n) { if (n == 0) return -1; int log = 0; uint32 value = n; for (int i = 4; i >= 0; --i) { int shift = (1 << i); uint32 x = value >> shift; if (x != 0) { value = x; log += shift; } } assert(value == 1); return log; } inline int Bits::FindLSBSetNonZero(uint32 n) { int rc = 31; for (int i = 4, shift = 1 << 4; i >= 0; --i) { const uint32 x = n << shift; if (x != 0) { n = x; rc -= shift; } shift >>= 1; } return rc; } // FindLSBSetNonZero64() is defined in terms of FindLSBSetNonZero(). inline int Bits::FindLSBSetNonZero64(uint64 n) { const uint32 bottombits = static_cast(n); if (bottombits == 0) { // Bottom bits are zero, so scan in top bits return 32 + FindLSBSetNonZero(static_cast(n >> 32)); } else { return FindLSBSetNonZero(bottombits); } } #endif // End portable versions. // Variable-length integer encoding. class Varint { public: // Maximum lengths of varint encoding of uint32. static const int kMax32 = 5; // Attempts to parse a varint32 from a prefix of the bytes in [ptr,limit-1]. // Never reads a character at or beyond limit. If a valid/terminated varint32 // was found in the range, stores it in *OUTPUT and returns a pointer just // past the last byte of the varint32. Else returns NULL. On success, // "result <= limit". static const char* Parse32WithLimit(const char* ptr, const char* limit, uint32* OUTPUT); // REQUIRES "ptr" points to a buffer of length sufficient to hold "v". // EFFECTS Encodes "v" into "ptr" and returns a pointer to the // byte just past the last encoded byte. static char* Encode32(char* ptr, uint32 v); // EFFECTS Appends the varint representation of "value" to "*s". static void Append32(string* s, uint32 value); }; inline const char* Varint::Parse32WithLimit(const char* p, const char* l, uint32* OUTPUT) { const unsigned char* ptr = reinterpret_cast(p); const unsigned char* limit = reinterpret_cast(l); uint32 b, result; if (ptr >= limit) return NULL; b = *(ptr++); result = b & 127; if (b < 128) goto done; if (ptr >= limit) return NULL; b = *(ptr++); result |= (b & 127) << 7; if (b < 128) goto done; if (ptr >= limit) return NULL; b = *(ptr++); result |= (b & 127) << 14; if (b < 128) goto done; if (ptr >= limit) return NULL; b = *(ptr++); result |= (b & 127) << 21; if (b < 128) goto done; if (ptr >= limit) return NULL; b = *(ptr++); result |= (b & 127) << 28; if (b < 16) goto done; return NULL; // Value is too long to be a varint32 done: *OUTPUT = result; return reinterpret_cast(ptr); } inline char* Varint::Encode32(char* sptr, uint32 v) { // Operate on characters as unsigneds unsigned char* ptr = reinterpret_cast(sptr); static const int B = 128; if (v < (1<<7)) { *(ptr++) = v; } else if (v < (1<<14)) { *(ptr++) = v | B; *(ptr++) = v>>7; } else if (v < (1<<21)) { *(ptr++) = v | B; *(ptr++) = (v>>7) | B; *(ptr++) = v>>14; } else if (v < (1<<28)) { *(ptr++) = v | B; *(ptr++) = (v>>7) | B; *(ptr++) = (v>>14) | B; *(ptr++) = v>>21; } else { *(ptr++) = v | B; *(ptr++) = (v>>7) | B; *(ptr++) = (v>>14) | B; *(ptr++) = (v>>21) | B; *(ptr++) = v>>28; } return reinterpret_cast(ptr); } // If you know the internal layout of the std::string in use, you can // replace this function with one that resizes the string without // filling the new space with zeros (if applicable) -- // it will be non-portable but faster. inline void STLStringResizeUninitialized(string* s, size_t new_size) { s->resize(new_size); } // Return a mutable char* pointing to a string's internal buffer, // which may not be null-terminated. Writing through this pointer will // modify the string. // // string_as_array(&str)[i] is valid for 0 <= i < str.size() until the // next call to a string method that invalidates iterators. // // As of 2006-04, there is no standard-blessed way of getting a // mutable reference to a string's internal buffer. However, issue 530 // (http://www.open-std.org/JTC1/SC22/WG21/docs/lwg-defects.html#530) // proposes this as the method. It will officially be part of the standard // for C++0x. This should already work on all current implementations. inline char* string_as_array(string* str) { return str->empty() ? NULL : &*str->begin(); } } // namespace snappy #endif // UTIL_SNAPPY_OPENSOURCE_SNAPPY_STUBS_INTERNAL_H_ apache-couchdb-1.6.0/src/snappy/google-snappy/snappy-sinksource.cc0000644000175000001440000000447712332105522025223 0ustar00djcusers00000000000000// Copyright 2011 Google Inc. All Rights Reserved. // // 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 Google Inc. nor the names of its // contributors may be used to endorse or promote products derived from // this software without specific prior written permission. // // THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS // "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT // LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR // A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT // OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, // SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT // LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, // DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY // THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT // (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE // OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. #include #include "snappy-sinksource.h" namespace snappy { Source::~Source() { } Sink::~Sink() { } char* Sink::GetAppendBuffer(size_t length, char* scratch) { return scratch; } ByteArraySource::~ByteArraySource() { } size_t ByteArraySource::Available() const { return left_; } const char* ByteArraySource::Peek(size_t* len) { *len = left_; return ptr_; } void ByteArraySource::Skip(size_t n) { left_ -= n; ptr_ += n; } UncheckedByteArraySink::~UncheckedByteArraySink() { } void UncheckedByteArraySink::Append(const char* data, size_t n) { // Do no copying if the caller filled in the result of GetAppendBuffer() if (data != dest_) { memcpy(dest_, data, n); } dest_ += n; } char* UncheckedByteArraySink::GetAppendBuffer(size_t len, char* scratch) { return dest_; } } apache-couchdb-1.6.0/src/snappy/google-snappy/AUTHORS0000644000175000001440000000002612332105522022251 0ustar00djcusers00000000000000opensource@google.com apache-couchdb-1.6.0/src/snappy/google-snappy/snappy.h0000644000175000001440000001536512332105522022700 0ustar00djcusers00000000000000// Copyright 2005 and onwards Google Inc. // // 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 Google Inc. nor the names of its // contributors may be used to endorse or promote products derived from // this software without specific prior written permission. // // THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS // "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT // LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR // A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT // OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, // SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT // LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, // DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY // THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT // (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE // OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. // // A light-weight compression algorithm. It is designed for speed of // compression and decompression, rather than for the utmost in space // savings. // // For getting better compression ratios when you are compressing data // with long repeated sequences or compressing data that is similar to // other data, while still compressing fast, you might look at first // using BMDiff and then compressing the output of BMDiff with // Snappy. #ifndef UTIL_SNAPPY_SNAPPY_H__ #define UTIL_SNAPPY_SNAPPY_H__ #include #include #include "snappy-stubs-public.h" namespace snappy { class Source; class Sink; // ------------------------------------------------------------------------ // Generic compression/decompression routines. // ------------------------------------------------------------------------ // Compress the bytes read from "*source" and append to "*sink". Return the // number of bytes written. size_t Compress(Source* source, Sink* sink); bool GetUncompressedLength(Source* source, uint32* result); // ------------------------------------------------------------------------ // Higher-level string based routines (should be sufficient for most users) // ------------------------------------------------------------------------ // Sets "*output" to the compressed version of "input[0,input_length-1]". // Original contents of *output are lost. // // REQUIRES: "input[]" is not an alias of "*output". size_t Compress(const char* input, size_t input_length, string* output); // Decompresses "compressed[0,compressed_length-1]" to "*uncompressed". // Original contents of "*uncompressed" are lost. // // REQUIRES: "compressed[]" is not an alias of "*uncompressed". // // returns false if the message is corrupted and could not be decompressed bool Uncompress(const char* compressed, size_t compressed_length, string* uncompressed); // ------------------------------------------------------------------------ // Lower-level character array based routines. May be useful for // efficiency reasons in certain circumstances. // ------------------------------------------------------------------------ // REQUIRES: "compressed" must point to an area of memory that is at // least "MaxCompressedLength(input_length)" bytes in length. // // Takes the data stored in "input[0..input_length]" and stores // it in the array pointed to by "compressed". // // "*compressed_length" is set to the length of the compressed output. // // Example: // char* output = new char[snappy::MaxCompressedLength(input_length)]; // size_t output_length; // RawCompress(input, input_length, output, &output_length); // ... Process(output, output_length) ... // delete [] output; void RawCompress(const char* input, size_t input_length, char* compressed, size_t* compressed_length); // Given data in "compressed[0..compressed_length-1]" generated by // calling the Snappy::Compress routine, this routine // stores the uncompressed data to // uncompressed[0..GetUncompressedLength(compressed)-1] // returns false if the message is corrupted and could not be decrypted bool RawUncompress(const char* compressed, size_t compressed_length, char* uncompressed); // Given data from the byte source 'compressed' generated by calling // the Snappy::Compress routine, this routine stores the uncompressed // data to // uncompressed[0..GetUncompressedLength(compressed,compressed_length)-1] // returns false if the message is corrupted and could not be decrypted bool RawUncompress(Source* compressed, char* uncompressed); // Returns the maximal size of the compressed representation of // input data that is "source_bytes" bytes in length; size_t MaxCompressedLength(size_t source_bytes); // REQUIRES: "compressed[]" was produced by RawCompress() or Compress() // Returns true and stores the length of the uncompressed data in // *result normally. Returns false on parsing error. // This operation takes O(1) time. bool GetUncompressedLength(const char* compressed, size_t compressed_length, size_t* result); // Returns true iff the contents of "compressed[]" can be uncompressed // successfully. Does not return the uncompressed data. Takes // time proportional to compressed_length, but is usually at least // a factor of four faster than actual decompression. bool IsValidCompressedBuffer(const char* compressed, size_t compressed_length); // *** DO NOT CHANGE THE VALUE OF kBlockSize *** // // New Compression code chops up the input into blocks of at most // the following size. This ensures that back-references in the // output never cross kBlockSize block boundaries. This can be // helpful in implementing blocked decompression. However the // decompression code should not rely on this guarantee since older // compression code may not obey it. static const int kBlockLog = 15; static const size_t kBlockSize = 1 << kBlockLog; static const int kMaxHashTableBits = 14; static const size_t kMaxHashTableSize = 1 << kMaxHashTableBits; } // end namespace snappy #endif // UTIL_SNAPPY_SNAPPY_H__ apache-couchdb-1.6.0/src/snappy/google-snappy/COPYING0000644000175000001440000000270312332105522022240 0ustar00djcusers00000000000000Copyright 2011, Google Inc. All rights reserved. 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 Google Inc. nor the names of its contributors may be used to endorse or promote products derived from this software without specific prior written permission. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. apache-couchdb-1.6.0/src/snappy/google-snappy/snappy-stubs-internal.cc0000644000175000001440000000344312332105522026000 0ustar00djcusers00000000000000// Copyright 2011 Google Inc. All Rights Reserved. // // 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 Google Inc. nor the names of its // contributors may be used to endorse or promote products derived from // this software without specific prior written permission. // // THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS // "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT // LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR // A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT // OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, // SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT // LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, // DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY // THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT // (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE // OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. #include #include #include "snappy-stubs-internal.h" namespace snappy { void Varint::Append32(string* s, uint32 value) { char buf[Varint::kMax32]; const char* p = Varint::Encode32(buf, value); s->append(buf, p - buf); } } // namespace snappy apache-couchdb-1.6.0/src/snappy/Makefile.am0000644000175000001440000000372712332105522020464 0ustar00djcusers00000000000000## Licensed under the Apache License, Version 2.0 (the "License"); you may not ## use this file except in compliance with the License. You may obtain a copy of ## the License at ## ## http://www.apache.org/licenses/LICENSE-2.0 ## ## Unless required by applicable law or agreed to in writing, software ## distributed under the License is distributed on an "AS IS" BASIS, WITHOUT ## WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the ## License for the specific language governing permissions and limitations under ## the License. AUTOMAKE_OPTIONS = subdir-objects snappyebindir = $(localerlanglibdir)/snappy-1.0.5/ebin snappyprivdir = $(localerlanglibdir)/snappy-1.0.5/priv snappy_cxx_srcs = \ snappy_nif.cc \ google-snappy/snappy.cc \ google-snappy/snappy-sinksource.cc \ google-snappy/snappy-stubs-internal.cc snappy_cxx_hdrs = \ erl_nif_compat.h \ google-snappy/snappy.h \ google-snappy/snappy-internal.h \ google-snappy/snappy-sinksource.h \ google-snappy/snappy-stubs-internal.h \ google-snappy/snappy-stubs-public.h.in snappy_file_collection = \ snappy.app.in \ snappy.erl snappyebin_make_generated_file_list = \ snappy.app \ snappy.beam EXTRA_DIST = \ google-snappy/AUTHORS \ google-snappy/COPYING \ $(snappy_cxx_hdrs) \ $(snappy_file_collection) CLEANFILES = \ $(snappyebin_make_generated_file_list) \ priv/snappy_nif.so snappyebin_DATA = \ $(snappyebin_make_generated_file_list) if USE_OTP_NIFS snappypriv_LTLIBRARIES = snappy_nif.la snappy_nif_la_SOURCES = $(snappy_cxx_srcs) snappy_nif_la_CXXFLAGS = $(ERLANG_FLAGS) snappy_nif_la_LDFLAGS = -module -avoid-version if WINDOWS snappy_nif_la_LDFLAGS += -no-undefined snappy_nif_la_CXXFLAGS += -EHsc -Ox SNAPPY_SO_NAME = snappy_nif.dll else SNAPPY_SO_NAME = snappy_nif.so endif priv/$(SNAPPY_SO_NAME): snappy_nif.la @mkdir -p ./priv cp .libs/$(SNAPPY_SO_NAME) $@ all: priv/$(SNAPPY_SO_NAME) endif %.app: %.app.in cp $< $@ %.beam: %.erl $(ERLC) $(ERLC_FLAGS) $< apache-couchdb-1.6.0/src/snappy/Makefile.in0000644000175000001440000007227112332105552020500 0ustar00djcusers00000000000000# Makefile.in generated by automake 1.11.6 from Makefile.am. # @configure_input@ # Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, # 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011 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__make_dryrun = \ { \ am__dry=no; \ case $$MAKEFLAGS in \ *\\[\ \ ]*) \ echo 'am--echo: ; @echo "AM" OK' | $(MAKE) -f - 2>/dev/null \ | grep '^AM OK$$' >/dev/null || am__dry=yes;; \ *) \ for am__flg in $$MAKEFLAGS; do \ case $$am__flg in \ *=*|--*) ;; \ *n*) am__dry=yes; break;; \ esac; \ done;; \ esac; \ test $$am__dry = yes; \ } 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@ @USE_OTP_NIFS_TRUE@@WINDOWS_TRUE@am__append_1 = -no-undefined @USE_OTP_NIFS_TRUE@@WINDOWS_TRUE@am__append_2 = -EHsc -Ox subdir = src/snappy DIST_COMMON = $(srcdir)/Makefile.am $(srcdir)/Makefile.in ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 am__aclocal_m4_deps = $(top_srcdir)/m4/libtool.m4 \ $(top_srcdir)/m4/ltoptions.m4 $(top_srcdir)/m4/ltsugar.m4 \ $(top_srcdir)/m4/ltversion.m4 $(top_srcdir)/m4/lt~obsolete.m4 \ $(top_srcdir)/acinclude.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 \ $(top_builddir)/src/snappy/google-snappy/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)$(snappyprivdir)" \ "$(DESTDIR)$(snappyebindir)" LTLIBRARIES = $(snappypriv_LTLIBRARIES) snappy_nif_la_LIBADD = am__snappy_nif_la_SOURCES_DIST = snappy_nif.cc google-snappy/snappy.cc \ google-snappy/snappy-sinksource.cc \ google-snappy/snappy-stubs-internal.cc am__dirstamp = $(am__leading_dot)dirstamp am__objects_1 = snappy_nif_la-snappy_nif.lo \ google-snappy/snappy_nif_la-snappy.lo \ google-snappy/snappy_nif_la-snappy-sinksource.lo \ google-snappy/snappy_nif_la-snappy-stubs-internal.lo @USE_OTP_NIFS_TRUE@am_snappy_nif_la_OBJECTS = $(am__objects_1) snappy_nif_la_OBJECTS = $(am_snappy_nif_la_OBJECTS) snappy_nif_la_LINK = $(LIBTOOL) --tag=CXX $(AM_LIBTOOLFLAGS) \ $(LIBTOOLFLAGS) --mode=link $(CXXLD) $(snappy_nif_la_CXXFLAGS) \ $(CXXFLAGS) $(snappy_nif_la_LDFLAGS) $(LDFLAGS) -o $@ @USE_OTP_NIFS_TRUE@am_snappy_nif_la_rpath = -rpath $(snappyprivdir) DEFAULT_INCLUDES = -I.@am__isrc@ -I$(top_builddir) -I$(top_builddir)/src/snappy/google-snappy depcomp = $(SHELL) $(top_srcdir)/build-aux/depcomp am__depfiles_maybe = depfiles am__mv = mv -f CXXCOMPILE = $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) \ $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) LTCXXCOMPILE = $(LIBTOOL) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) \ --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) \ $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) CXXLD = $(CXX) CXXLINK = $(LIBTOOL) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) \ --mode=link $(CXXLD) $(AM_CXXFLAGS) $(CXXFLAGS) $(AM_LDFLAGS) \ $(LDFLAGS) -o $@ SOURCES = $(snappy_nif_la_SOURCES) DIST_SOURCES = $(am__snappy_nif_la_SOURCES_DIST) am__can_run_installinfo = \ case $$AM_UPDATE_INFO_DIR in \ n|no|NO) false;; \ *) (install-info --version) >/dev/null 2>&1;; \ esac DATA = $(snappyebin_DATA) ETAGS = etags CTAGS = ctags DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) ACLOCAL = @ACLOCAL@ AMTAR = @AMTAR@ AR = @AR@ AS = @AS@ AUTOCONF = @AUTOCONF@ AUTOHEADER = @AUTOHEADER@ AUTOMAKE = @AUTOMAKE@ AWK = @AWK@ CC = @CC@ CCDEPMODE = @CCDEPMODE@ CFLAGS = @CFLAGS@ CPP = @CPP@ CPPFLAGS = @CPPFLAGS@ CURL_CFLAGS = @CURL_CFLAGS@ CURL_CONFIG = @CURL_CONFIG@ CURL_LIBS = @CURL_LIBS@ CXX = @CXX@ CXXCPP = @CXXCPP@ CXXDEPMODE = @CXXDEPMODE@ CXXFLAGS = @CXXFLAGS@ CYGPATH_W = @CYGPATH_W@ DEFS = @DEFS@ DEPDIR = @DEPDIR@ DLLTOOL = @DLLTOOL@ DSYMUTIL = @DSYMUTIL@ DUMPBIN = @DUMPBIN@ ECHO_C = @ECHO_C@ ECHO_N = @ECHO_N@ ECHO_T = @ECHO_T@ EGREP = @EGREP@ ERL = @ERL@ ERLANG_FLAGS = @ERLANG_FLAGS@ ERLC = @ERLC@ ERLC_FLAGS = @ERLC_FLAGS@ ESCRIPT = @ESCRIPT@ EXEEXT = @EXEEXT@ FGREP = @FGREP@ FLAGS = @FLAGS@ GREP = @GREP@ HAS_HELP2MAN = @HAS_HELP2MAN@ HAS_INSTALLINFO = @HAS_INSTALLINFO@ HAS_MAKEINFO = @HAS_MAKEINFO@ HAS_PDFLATEX = @HAS_PDFLATEX@ HAS_SPHINX_BUILD = @HAS_SPHINX_BUILD@ ICU_BIN = @ICU_BIN@ ICU_CFLAGS = @ICU_CFLAGS@ ICU_CONFIG = @ICU_CONFIG@ ICU_CPPFLAGS = @ICU_CPPFLAGS@ ICU_CXXFLAGS = @ICU_CXXFLAGS@ ICU_LIBS = @ICU_LIBS@ INNO_COMPILER_EXECUTABLE = @INNO_COMPILER_EXECUTABLE@ INSTALL = @INSTALL@ INSTALL_DATA = @INSTALL_DATA@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ INSTALL_SCRIPT = @INSTALL_SCRIPT@ INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ JS_CFLAGS = @JS_CFLAGS@ JS_LIBS = @JS_LIBS@ JS_LIB_BINARY = @JS_LIB_BINARY@ LD = @LD@ LDFLAGS = @LDFLAGS@ LIBOBJS = @LIBOBJS@ LIBS = @LIBS@ LIBTOOL = @LIBTOOL@ LIPO = @LIPO@ LN_S = @LN_S@ LTLIBOBJS = @LTLIBOBJS@ MAKEINFO = @MAKEINFO@ MANIFEST_TOOL = @MANIFEST_TOOL@ MKDIR_P = @MKDIR_P@ NM = @NM@ NMEDIT = @NMEDIT@ OBJDUMP = @OBJDUMP@ OBJEXT = @OBJEXT@ OTOOL = @OTOOL@ OTOOL64 = @OTOOL64@ PACKAGE = @PACKAGE@ PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ PACKAGE_NAME = @PACKAGE_NAME@ PACKAGE_STRING = @PACKAGE_STRING@ PACKAGE_TARNAME = @PACKAGE_TARNAME@ PACKAGE_URL = @PACKAGE_URL@ PACKAGE_VERSION = @PACKAGE_VERSION@ PATH_SEPARATOR = @PATH_SEPARATOR@ PKG_CONFIG = @PKG_CONFIG@ PKG_CONFIG_LIBDIR = @PKG_CONFIG_LIBDIR@ PKG_CONFIG_PATH = @PKG_CONFIG_PATH@ RANLIB = @RANLIB@ SED = @SED@ SET_MAKE = @SET_MAKE@ SHELL = @SHELL@ SNAPPY_MAJOR = @SNAPPY_MAJOR@ SNAPPY_MINOR = @SNAPPY_MINOR@ SNAPPY_PATCHLEVEL = @SNAPPY_PATCHLEVEL@ STRIP = @STRIP@ VERSION = @VERSION@ 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@ ac_cv_have_stddef_h = @ac_cv_have_stddef_h@ ac_cv_have_stdint_h = @ac_cv_have_stdint_h@ am__include = @am__include@ am__leading_dot = @am__leading_dot@ am__quote = @am__quote@ am__tar = @am__tar@ am__untar = @am__untar@ bindir = @bindir@ bug_uri = @bug_uri@ 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@ dvidir = @dvidir@ erlangbin = @erlangbin@ erlangversion = @erlangversion@ exec_prefix = @exec_prefix@ host = @host@ host_alias = @host_alias@ host_cpu = @host_cpu@ host_os = @host_os@ host_vendor = @host_vendor@ htmldir = @htmldir@ includedir = @includedir@ infodir = @infodir@ initdir = @initdir@ install_sh = @install_sh@ launchddir = @launchddir@ libdir = @libdir@ libexecdir = @libexecdir@ localconfdir = @localconfdir@ localdatadir = @localdatadir@ localdocdir = @localdocdir@ localedir = @localedir@ localerlanglibdir = @localerlanglibdir@ locallibbindir = @locallibbindir@ locallibdir = @locallibdir@ localstatedir = @localstatedir@ localstatelibdir = @localstatelibdir@ localstatelogdir = @localstatelogdir@ localstaterundir = @localstaterundir@ mandir = @mandir@ mkdir_p = @mkdir_p@ msvc_redist_dir = @msvc_redist_dir@ msvc_redist_name = @msvc_redist_name@ oldincludedir = @oldincludedir@ openssl_bin_dir = @openssl_bin_dir@ otp_release = @otp_release@ package_author_address = @package_author_address@ package_author_name = @package_author_name@ package_identifier = @package_identifier@ package_name = @package_name@ package_tarname = @package_tarname@ 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@ version = @version@ version_major = @version_major@ version_minor = @version_minor@ version_release = @version_release@ version_revision = @version_revision@ version_stage = @version_stage@ AUTOMAKE_OPTIONS = subdir-objects snappyebindir = $(localerlanglibdir)/snappy-1.0.5/ebin snappyprivdir = $(localerlanglibdir)/snappy-1.0.5/priv snappy_cxx_srcs = \ snappy_nif.cc \ google-snappy/snappy.cc \ google-snappy/snappy-sinksource.cc \ google-snappy/snappy-stubs-internal.cc snappy_cxx_hdrs = \ erl_nif_compat.h \ google-snappy/snappy.h \ google-snappy/snappy-internal.h \ google-snappy/snappy-sinksource.h \ google-snappy/snappy-stubs-internal.h \ google-snappy/snappy-stubs-public.h.in snappy_file_collection = \ snappy.app.in \ snappy.erl snappyebin_make_generated_file_list = \ snappy.app \ snappy.beam EXTRA_DIST = \ google-snappy/AUTHORS \ google-snappy/COPYING \ $(snappy_cxx_hdrs) \ $(snappy_file_collection) CLEANFILES = \ $(snappyebin_make_generated_file_list) \ priv/snappy_nif.so snappyebin_DATA = \ $(snappyebin_make_generated_file_list) @USE_OTP_NIFS_TRUE@snappypriv_LTLIBRARIES = snappy_nif.la @USE_OTP_NIFS_TRUE@snappy_nif_la_SOURCES = $(snappy_cxx_srcs) @USE_OTP_NIFS_TRUE@snappy_nif_la_CXXFLAGS = $(ERLANG_FLAGS) \ @USE_OTP_NIFS_TRUE@ $(am__append_2) @USE_OTP_NIFS_TRUE@snappy_nif_la_LDFLAGS = -module -avoid-version \ @USE_OTP_NIFS_TRUE@ $(am__append_1) @USE_OTP_NIFS_TRUE@@WINDOWS_FALSE@SNAPPY_SO_NAME = snappy_nif.so @USE_OTP_NIFS_TRUE@@WINDOWS_TRUE@SNAPPY_SO_NAME = snappy_nif.dll all: all-am .SUFFIXES: .SUFFIXES: .cc .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) --foreign src/snappy/Makefile'; \ $(am__cd) $(top_srcdir) && \ $(AUTOMAKE) --foreign src/snappy/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-snappyprivLTLIBRARIES: $(snappypriv_LTLIBRARIES) @$(NORMAL_INSTALL) @list='$(snappypriv_LTLIBRARIES)'; test -n "$(snappyprivdir)" || 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)$(snappyprivdir)'"; \ $(MKDIR_P) "$(DESTDIR)$(snappyprivdir)" || exit 1; \ echo " $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=install $(INSTALL) $(INSTALL_STRIP_FLAG) $$list2 '$(DESTDIR)$(snappyprivdir)'"; \ $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=install $(INSTALL) $(INSTALL_STRIP_FLAG) $$list2 "$(DESTDIR)$(snappyprivdir)"; \ } uninstall-snappyprivLTLIBRARIES: @$(NORMAL_UNINSTALL) @list='$(snappypriv_LTLIBRARIES)'; test -n "$(snappyprivdir)" || list=; \ for p in $$list; do \ $(am__strip_dir) \ echo " $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=uninstall rm -f '$(DESTDIR)$(snappyprivdir)/$$f'"; \ $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=uninstall rm -f "$(DESTDIR)$(snappyprivdir)/$$f"; \ done clean-snappyprivLTLIBRARIES: -test -z "$(snappypriv_LTLIBRARIES)" || rm -f $(snappypriv_LTLIBRARIES) @list='$(snappypriv_LTLIBRARIES)'; for p in $$list; do \ dir="`echo $$p | sed -e 's|/[^/]*$$||'`"; \ test "$$dir" != "$$p" || dir=.; \ echo "rm -f \"$${dir}/so_locations\""; \ rm -f "$${dir}/so_locations"; \ done google-snappy/$(am__dirstamp): @$(MKDIR_P) google-snappy @: > google-snappy/$(am__dirstamp) google-snappy/$(DEPDIR)/$(am__dirstamp): @$(MKDIR_P) google-snappy/$(DEPDIR) @: > google-snappy/$(DEPDIR)/$(am__dirstamp) google-snappy/snappy_nif_la-snappy.lo: google-snappy/$(am__dirstamp) \ google-snappy/$(DEPDIR)/$(am__dirstamp) google-snappy/snappy_nif_la-snappy-sinksource.lo: \ google-snappy/$(am__dirstamp) \ google-snappy/$(DEPDIR)/$(am__dirstamp) google-snappy/snappy_nif_la-snappy-stubs-internal.lo: \ google-snappy/$(am__dirstamp) \ google-snappy/$(DEPDIR)/$(am__dirstamp) snappy_nif.la: $(snappy_nif_la_OBJECTS) $(snappy_nif_la_DEPENDENCIES) $(EXTRA_snappy_nif_la_DEPENDENCIES) $(snappy_nif_la_LINK) $(am_snappy_nif_la_rpath) $(snappy_nif_la_OBJECTS) $(snappy_nif_la_LIBADD) $(LIBS) mostlyclean-compile: -rm -f *.$(OBJEXT) -rm -f google-snappy/snappy_nif_la-snappy-sinksource.$(OBJEXT) -rm -f google-snappy/snappy_nif_la-snappy-sinksource.lo -rm -f google-snappy/snappy_nif_la-snappy-stubs-internal.$(OBJEXT) -rm -f google-snappy/snappy_nif_la-snappy-stubs-internal.lo -rm -f google-snappy/snappy_nif_la-snappy.$(OBJEXT) -rm -f google-snappy/snappy_nif_la-snappy.lo distclean-compile: -rm -f *.tab.c @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/snappy_nif_la-snappy_nif.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@google-snappy/$(DEPDIR)/snappy_nif_la-snappy-sinksource.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@google-snappy/$(DEPDIR)/snappy_nif_la-snappy-stubs-internal.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@google-snappy/$(DEPDIR)/snappy_nif_la-snappy.Plo@am__quote@ .cc.o: @am__fastdepCXX_TRUE@ depbase=`echo $@ | sed 's|[^/]*$$|$(DEPDIR)/&|;s|\.o$$||'`;\ @am__fastdepCXX_TRUE@ $(CXXCOMPILE) -MT $@ -MD -MP -MF $$depbase.Tpo -c -o $@ $< &&\ @am__fastdepCXX_TRUE@ $(am__mv) $$depbase.Tpo $$depbase.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(CXXCOMPILE) -c -o $@ $< .cc.obj: @am__fastdepCXX_TRUE@ depbase=`echo $@ | sed 's|[^/]*$$|$(DEPDIR)/&|;s|\.obj$$||'`;\ @am__fastdepCXX_TRUE@ $(CXXCOMPILE) -MT $@ -MD -MP -MF $$depbase.Tpo -c -o $@ `$(CYGPATH_W) '$<'` &&\ @am__fastdepCXX_TRUE@ $(am__mv) $$depbase.Tpo $$depbase.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(CXXCOMPILE) -c -o $@ `$(CYGPATH_W) '$<'` .cc.lo: @am__fastdepCXX_TRUE@ depbase=`echo $@ | sed 's|[^/]*$$|$(DEPDIR)/&|;s|\.lo$$||'`;\ @am__fastdepCXX_TRUE@ $(LTCXXCOMPILE) -MT $@ -MD -MP -MF $$depbase.Tpo -c -o $@ $< &&\ @am__fastdepCXX_TRUE@ $(am__mv) $$depbase.Tpo $$depbase.Plo @AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(LTCXXCOMPILE) -c -o $@ $< snappy_nif_la-snappy_nif.lo: snappy_nif.cc @am__fastdepCXX_TRUE@ $(LIBTOOL) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(snappy_nif_la_CXXFLAGS) $(CXXFLAGS) -MT snappy_nif_la-snappy_nif.lo -MD -MP -MF $(DEPDIR)/snappy_nif_la-snappy_nif.Tpo -c -o snappy_nif_la-snappy_nif.lo `test -f 'snappy_nif.cc' || echo '$(srcdir)/'`snappy_nif.cc @am__fastdepCXX_TRUE@ $(am__mv) $(DEPDIR)/snappy_nif_la-snappy_nif.Tpo $(DEPDIR)/snappy_nif_la-snappy_nif.Plo @AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='snappy_nif.cc' object='snappy_nif_la-snappy_nif.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(LIBTOOL) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(snappy_nif_la_CXXFLAGS) $(CXXFLAGS) -c -o snappy_nif_la-snappy_nif.lo `test -f 'snappy_nif.cc' || echo '$(srcdir)/'`snappy_nif.cc google-snappy/snappy_nif_la-snappy.lo: google-snappy/snappy.cc @am__fastdepCXX_TRUE@ $(LIBTOOL) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(snappy_nif_la_CXXFLAGS) $(CXXFLAGS) -MT google-snappy/snappy_nif_la-snappy.lo -MD -MP -MF google-snappy/$(DEPDIR)/snappy_nif_la-snappy.Tpo -c -o google-snappy/snappy_nif_la-snappy.lo `test -f 'google-snappy/snappy.cc' || echo '$(srcdir)/'`google-snappy/snappy.cc @am__fastdepCXX_TRUE@ $(am__mv) google-snappy/$(DEPDIR)/snappy_nif_la-snappy.Tpo google-snappy/$(DEPDIR)/snappy_nif_la-snappy.Plo @AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='google-snappy/snappy.cc' object='google-snappy/snappy_nif_la-snappy.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(LIBTOOL) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(snappy_nif_la_CXXFLAGS) $(CXXFLAGS) -c -o google-snappy/snappy_nif_la-snappy.lo `test -f 'google-snappy/snappy.cc' || echo '$(srcdir)/'`google-snappy/snappy.cc google-snappy/snappy_nif_la-snappy-sinksource.lo: google-snappy/snappy-sinksource.cc @am__fastdepCXX_TRUE@ $(LIBTOOL) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(snappy_nif_la_CXXFLAGS) $(CXXFLAGS) -MT google-snappy/snappy_nif_la-snappy-sinksource.lo -MD -MP -MF google-snappy/$(DEPDIR)/snappy_nif_la-snappy-sinksource.Tpo -c -o google-snappy/snappy_nif_la-snappy-sinksource.lo `test -f 'google-snappy/snappy-sinksource.cc' || echo '$(srcdir)/'`google-snappy/snappy-sinksource.cc @am__fastdepCXX_TRUE@ $(am__mv) google-snappy/$(DEPDIR)/snappy_nif_la-snappy-sinksource.Tpo google-snappy/$(DEPDIR)/snappy_nif_la-snappy-sinksource.Plo @AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='google-snappy/snappy-sinksource.cc' object='google-snappy/snappy_nif_la-snappy-sinksource.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(LIBTOOL) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(snappy_nif_la_CXXFLAGS) $(CXXFLAGS) -c -o google-snappy/snappy_nif_la-snappy-sinksource.lo `test -f 'google-snappy/snappy-sinksource.cc' || echo '$(srcdir)/'`google-snappy/snappy-sinksource.cc google-snappy/snappy_nif_la-snappy-stubs-internal.lo: google-snappy/snappy-stubs-internal.cc @am__fastdepCXX_TRUE@ $(LIBTOOL) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(snappy_nif_la_CXXFLAGS) $(CXXFLAGS) -MT google-snappy/snappy_nif_la-snappy-stubs-internal.lo -MD -MP -MF google-snappy/$(DEPDIR)/snappy_nif_la-snappy-stubs-internal.Tpo -c -o google-snappy/snappy_nif_la-snappy-stubs-internal.lo `test -f 'google-snappy/snappy-stubs-internal.cc' || echo '$(srcdir)/'`google-snappy/snappy-stubs-internal.cc @am__fastdepCXX_TRUE@ $(am__mv) google-snappy/$(DEPDIR)/snappy_nif_la-snappy-stubs-internal.Tpo google-snappy/$(DEPDIR)/snappy_nif_la-snappy-stubs-internal.Plo @AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='google-snappy/snappy-stubs-internal.cc' object='google-snappy/snappy_nif_la-snappy-stubs-internal.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(LIBTOOL) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(snappy_nif_la_CXXFLAGS) $(CXXFLAGS) -c -o google-snappy/snappy_nif_la-snappy-stubs-internal.lo `test -f 'google-snappy/snappy-stubs-internal.cc' || echo '$(srcdir)/'`google-snappy/snappy-stubs-internal.cc mostlyclean-libtool: -rm -f *.lo clean-libtool: -rm -rf .libs _libs -rm -rf google-snappy/.libs google-snappy/_libs install-snappyebinDATA: $(snappyebin_DATA) @$(NORMAL_INSTALL) @list='$(snappyebin_DATA)'; test -n "$(snappyebindir)" || list=; \ if test -n "$$list"; then \ echo " $(MKDIR_P) '$(DESTDIR)$(snappyebindir)'"; \ $(MKDIR_P) "$(DESTDIR)$(snappyebindir)" || 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)$(snappyebindir)'"; \ $(INSTALL_DATA) $$files "$(DESTDIR)$(snappyebindir)" || exit $$?; \ done uninstall-snappyebinDATA: @$(NORMAL_UNINSTALL) @list='$(snappyebin_DATA)'; test -n "$(snappyebindir)" || list=; \ files=`for p in $$list; do echo $$p; done | sed -e 's|^.*/||'`; \ dir='$(DESTDIR)$(snappyebindir)'; $(am__uninstall_files_from_dir) ID: $(HEADERS) $(SOURCES) $(LISP) $(TAGS_FILES) list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | \ $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ END { if (nonempty) { for (i in files) print i; }; }'`; \ mkid -fID $$unique tags: TAGS TAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ $(TAGS_FILES) $(LISP) set x; \ here=`pwd`; \ list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | \ $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ END { if (nonempty) { for (i in files) print i; }; }'`; \ 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 CTAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ $(TAGS_FILES) $(LISP) list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | \ $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ END { if (nonempty) { for (i in files) print i; }; }'`; \ 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" 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) installdirs: for dir in "$(DESTDIR)$(snappyprivdir)" "$(DESTDIR)$(snappyebindir)"; 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) -rm -f google-snappy/$(DEPDIR)/$(am__dirstamp) -rm -f google-snappy/$(am__dirstamp) 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-snappyprivLTLIBRARIES \ mostlyclean-am distclean: distclean-am -rm -rf ./$(DEPDIR) google-snappy/$(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-snappyebinDATA install-snappyprivLTLIBRARIES 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) google-snappy/$(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-snappyebinDATA uninstall-snappyprivLTLIBRARIES .MAKE: install-am install-strip .PHONY: CTAGS GTAGS all all-am check check-am clean clean-generic \ clean-libtool clean-snappyprivLTLIBRARIES ctags 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-snappyebinDATA install-snappyprivLTLIBRARIES \ install-strip installcheck installcheck-am installdirs \ maintainer-clean maintainer-clean-generic mostlyclean \ mostlyclean-compile mostlyclean-generic mostlyclean-libtool \ pdf pdf-am ps ps-am tags uninstall uninstall-am \ uninstall-snappyebinDATA uninstall-snappyprivLTLIBRARIES @USE_OTP_NIFS_TRUE@priv/$(SNAPPY_SO_NAME): snappy_nif.la @USE_OTP_NIFS_TRUE@ @mkdir -p ./priv @USE_OTP_NIFS_TRUE@ cp .libs/$(SNAPPY_SO_NAME) $@ @USE_OTP_NIFS_TRUE@all: priv/$(SNAPPY_SO_NAME) %.app: %.app.in cp $< $@ %.beam: %.erl $(ERLC) $(ERLC_FLAGS) $< # 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: apache-couchdb-1.6.0/src/snappy/erl_nif_compat.h0000644000175000001440000000721712332105522021560 0ustar00djcusers00000000000000/* Copyright (c) 2010-2011 Basho Technologies, Inc. * With some minor modifications by Filipe David Manana * * * This file is provided to you under the Apache License, * Version 2.0 (the "License"); you may not use this file * except in compliance with the License. You may obtain * a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, * software distributed under the License is distributed on an * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY * KIND, either express or implied. See the License for the * specific language governing permissions and limitations * under the License. */ #ifndef ERL_NIF_COMPAT_H_ #define ERL_NIF_COMPAT_H_ #ifdef __cplusplus extern "C" { #endif /* __cplusplus */ #include "erl_nif.h" #if ERL_NIF_MAJOR_VERSION == 0 && ERL_NIF_MINOR_VERSION == 1 #define OTP_R13B03 #elif ERL_NIF_MAJOR_VERSION == 1 && ERL_NIF_MINOR_VERSION == 0 #define OTP_R13B04 #elif ERL_NIF_MAJOR_VERSION == 2 && ERL_NIF_MINOR_VERSION == 0 #define OTP_R14A #define OTP_R14B #define OTP_R14B01 #elif ERL_NIF_MAJOR_VERSION == 2 && ERL_NIF_MINOR_VERSION == 1 #define OTP_R14B02 #endif #ifdef OTP_R13B03 #define enif_open_resource_type_compat enif_open_resource_type #define enif_alloc_resource_compat enif_alloc_resource #define enif_release_resource_compat enif_release_resource #define enif_alloc_binary_compat enif_alloc_binary #define enif_alloc_compat enif_alloc #define enif_release_binary_compat enif_release_binary #define enif_free_compat enif_free #define enif_get_atom_compat enif_get_atom #define enif_priv_data_compat enif_get_data #define enif_make_uint_compat enif_make_ulong #define enif_make_existing_atom_compat(E, N, R, Enc) \ enif_make_existing_atom(E, N, R) #define enif_make_string_compat(E, B, Enc) \ enif_make_string(E, B) #endif /* R13B03 */ #ifdef OTP_R13B04 #define enif_open_resource_type_compat enif_open_resource_type #define enif_alloc_resource_compat enif_alloc_resource #define enif_release_resource_compat enif_release_resource #define enif_alloc_binary_compat enif_alloc_binary #define enif_realloc_binary_compat enif_realloc_binary #define enif_release_binary_compat enif_release_binary #define enif_alloc_compat enif_alloc #define enif_free_compat enif_free #define enif_get_atom_compat enif_get_atom #define enif_priv_data_compat enif_priv_data #define enif_make_string_compat enif_make_string #define enif_make_uint_compat enif_make_uint #define enif_make_existing_atom_compat(E, N, R, Enc) \ enif_make_existing_atom(E, N, R) #endif /* R13B04 */ /* OTP R14A and future releases */ #if !defined(OTP_R13B03) && !defined(OTP_R13B04) #define enif_open_resource_type_compat(E, N, D, F, T) \ enif_open_resource_type(E, NULL, N, D, F, T) #define enif_alloc_resource_compat(E, T, S) \ enif_alloc_resource(T, S) #define enif_release_resource_compat(E, H) \ enif_release_resource(H) #define enif_alloc_binary_compat(E, S, B) \ enif_alloc_binary(S, B) #define enif_realloc_binary_compat(E, S, B) \ enif_realloc_binary(S, B) #define enif_release_binary_compat(E, B) \ enif_release_binary(B) #define enif_alloc_compat(E, S) \ enif_alloc(S) #define enif_free_compat(E, P) \ enif_free(P) #define enif_get_atom_compat(E, T, B, S) \ enif_get_atom(E, T, B, S, ERL_NIF_LATIN1) #define enif_priv_data_compat enif_priv_data #define enif_make_string_compat enif_make_string #define enif_make_existing_atom_compat enif_make_existing_atom #define enif_make_uint_compat enif_make_uint #endif /* R14 and future releases */ #ifdef __cplusplus } #endif /* __cplusplus */ #endif /* ERL_NIF_COMPAT_H_ */ apache-couchdb-1.6.0/src/snappy/snappy.app.in0000644000175000001440000000041012332105522021033 0ustar00djcusers00000000000000{application, snappy, [ {description, "snappy compressor/decompressor Erlang NIF wrapper"}, {vsn, "1.0.5"}, {registered, []}, {applications, [ kernel, stdlib ]}, {env, []}, {modules, [snappy]} ]}. apache-couchdb-1.6.0/src/snappy/snappy.erl0000644000175000001440000000275212332105522020443 0ustar00djcusers00000000000000%% Copyright 2011, Filipe David Manana %% Web: http://github.com/fdmanana/snappy-erlang-nif %% %% Licensed under the Apache License, Version 2.0 (the "License"); you may not %% use this file except in compliance with the License. You may obtain a copy of %% the License at %% %% http://www.apache.org/licenses/LICENSE-2.0 %% %% Unless required by applicable law or agreed to in writing, software %% distributed under the License is distributed on an "AS IS" BASIS, WITHOUT %% WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the %% License for the specific language governing permissions and limitations under %% the License. -module(snappy). -export([compress/1, decompress/1]). -export([uncompressed_length/1, is_valid/1]). -on_load(init/0). init() -> SoName = case code:priv_dir(?MODULE) of {error, bad_name} -> case filelib:is_dir(filename:join(["..", "priv"])) of true -> filename:join(["..", "priv", "snappy_nif"]); false -> filename:join(["priv", "snappy_nif"]) end; Dir -> filename:join(Dir, "snappy_nif") end, (catch erlang:load_nif(SoName, 0)), case erlang:system_info(otp_release) of "R13B03" -> true; _ -> ok end. compress(_IoList) -> exit(snappy_nif_not_loaded). decompress(_IoList) -> exit(snappy_nif_not_loaded). uncompressed_length(_IoList) -> exit(snappy_nif_not_loaded). is_valid(_IoList) -> exit(snappy_nif_not_loaded). apache-couchdb-1.6.0/src/snappy/snappy_nif.cc0000644000175000001440000001366712332105522021111 0ustar00djcusers00000000000000/** * Copyright 2011, Filipe David Manana * Web: http://github.com/fdmanana/snappy-erlang-nif * * Licensed under the Apache License, Version 2.0 (the "License"); you may not * use this file except in compliance with the License. You may obtain a copy of * the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the * License for the specific language governing permissions and limitations under * the License. **/ #include #include #include "erl_nif_compat.h" #include "google-snappy/snappy.h" #include "google-snappy/snappy-sinksource.h" #ifdef OTP_R13B03 #error OTP R13B03 not supported. Upgrade to R13B04 or later. #endif #ifdef __cplusplus #define BEGIN_C extern "C" { #define END_C } #else #define BEGIN_C #define END_C #endif #define SC_PTR(c) reinterpret_cast(c) class SnappyNifSink : public snappy::Sink { public: SnappyNifSink(ErlNifEnv* e); ~SnappyNifSink(); void Append(const char* data, size_t n); char* GetAppendBuffer(size_t len, char* scratch); ErlNifBinary& getBin(); private: ErlNifEnv* env; ErlNifBinary bin; size_t length; }; SnappyNifSink::SnappyNifSink(ErlNifEnv* e) : env(e), length(0) { if(!enif_alloc_binary_compat(env, 0, &bin)) { env = NULL; throw std::bad_alloc(); } } SnappyNifSink::~SnappyNifSink() { if(env != NULL) { enif_release_binary_compat(env, &bin); } } void SnappyNifSink::Append(const char *data, size_t n) { if(data != (SC_PTR(bin.data) + length)) { memcpy(bin.data + length, data, n); } length += n; } char* SnappyNifSink::GetAppendBuffer(size_t len, char* scratch) { size_t sz; if((length + len) > bin.size) { sz = (len * 4) < 8192 ? 8192 : (len * 4); if(!enif_realloc_binary_compat(env, &bin, bin.size + sz)) { throw std::bad_alloc(); } } return SC_PTR(bin.data) + length; } ErlNifBinary& SnappyNifSink::getBin() { if(bin.size > length) { if(!enif_realloc_binary_compat(env, &bin, length)) { throw std::bad_alloc(); } } return bin; } static inline ERL_NIF_TERM make_atom(ErlNifEnv* env, const char* name) { ERL_NIF_TERM ret; if(enif_make_existing_atom_compat(env, name, &ret, ERL_NIF_LATIN1)) { return ret; } return enif_make_atom(env, name); } static inline ERL_NIF_TERM make_ok(ErlNifEnv* env, ERL_NIF_TERM mesg) { ERL_NIF_TERM ok = make_atom(env, "ok"); return enif_make_tuple2(env, ok, mesg); } static inline ERL_NIF_TERM make_error(ErlNifEnv* env, const char* mesg) { ERL_NIF_TERM error = make_atom(env, "error"); return enif_make_tuple2(env, error, make_atom(env, mesg)); } BEGIN_C ERL_NIF_TERM snappy_compress(ErlNifEnv* env, int argc, const ERL_NIF_TERM argv[]) { ErlNifBinary input; if(!enif_inspect_iolist_as_binary(env, argv[0], &input)) { return enif_make_badarg(env); } try { snappy::ByteArraySource source(SC_PTR(input.data), input.size); SnappyNifSink sink(env); snappy::Compress(&source, &sink); return make_ok(env, enif_make_binary(env, &sink.getBin())); } catch(std::bad_alloc e) { return make_error(env, "insufficient_memory"); } catch(...) { return make_error(env, "unknown"); } } ERL_NIF_TERM snappy_decompress(ErlNifEnv* env, int argc, const ERL_NIF_TERM argv[]) { ErlNifBinary bin; ErlNifBinary ret; size_t len; if(!enif_inspect_iolist_as_binary(env, argv[0], &bin)) { return enif_make_badarg(env); } try { if(!snappy::GetUncompressedLength(SC_PTR(bin.data), bin.size, &len)) { return make_error(env, "data_not_compressed"); } if(!enif_alloc_binary_compat(env, len, &ret)) { return make_error(env, "insufficient_memory"); } if(!snappy::RawUncompress(SC_PTR(bin.data), bin.size, SC_PTR(ret.data))) { return make_error(env, "corrupted_data"); } return make_ok(env, enif_make_binary(env, &ret)); } catch(...) { return make_error(env, "unknown"); } } ERL_NIF_TERM snappy_uncompressed_length(ErlNifEnv* env, int argc, const ERL_NIF_TERM argv[]) { ErlNifBinary bin; size_t len; if(!enif_inspect_iolist_as_binary(env, argv[0], &bin)) { return enif_make_badarg(env); } try { if(!snappy::GetUncompressedLength(SC_PTR(bin.data), bin.size, &len)) { return make_error(env, "data_not_compressed"); } return make_ok(env, enif_make_ulong(env, len)); } catch(...) { return make_error(env, "unknown"); } } ERL_NIF_TERM snappy_is_valid(ErlNifEnv* env, int argc, const ERL_NIF_TERM argv[]) { ErlNifBinary bin; if (!enif_inspect_iolist_as_binary(env, argv[0], &bin)) { return enif_make_badarg(env); } try { if(snappy::IsValidCompressedBuffer(SC_PTR(bin.data), bin.size)) { return make_atom(env, "true"); } else { return make_atom(env, "false"); } } catch(...) { return make_error(env, "unknown"); } } int on_load(ErlNifEnv* env, void** priv, ERL_NIF_TERM info) { return 0; } int on_reload(ErlNifEnv* env, void** priv, ERL_NIF_TERM info) { return 0; } int on_upgrade(ErlNifEnv* env, void** priv, void** old_priv, ERL_NIF_TERM info) { return 0; } static ErlNifFunc nif_functions[] = { {"compress", 1, snappy_compress}, {"decompress", 1, snappy_decompress}, {"uncompressed_length", 1, snappy_uncompressed_length}, {"is_valid", 1, snappy_is_valid} }; ERL_NIF_INIT(snappy, nif_functions, &on_load, &on_reload, &on_upgrade, NULL); END_C apache-couchdb-1.6.0/src/couch_index/0000755000175000001440000000000012332105600017372 5ustar00djcusers00000000000000apache-couchdb-1.6.0/src/couch_index/src/0000755000175000001440000000000012332105600020161 5ustar00djcusers00000000000000apache-couchdb-1.6.0/src/couch_index/src/couch_index.app.src0000644000175000001440000000144312332105522023746 0ustar00djcusers00000000000000% Licensed under the Apache License, Version 2.0 (the "License"); you may not % use this file except in compliance with the License. You may obtain a copy of % the License at % % http://www.apache.org/licenses/LICENSE-2.0 % % Unless required by applicable law or agreed to in writing, software % distributed under the License is distributed on an "AS IS" BASIS, WITHOUT % WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the % License for the specific language governing permissions and limitations under % the License. {application, couch_index, [ {description, "CouchDB Secondary Index Manager"}, {vsn, "@version@"}, {modules, [ couch_index, couch_index_server ]}, {registered, [couch_index_server]}, {applications, [kernel, stdlib]} ]}. apache-couchdb-1.6.0/src/couch_index/src/couch_index_server.erl0000644000175000001440000001475412332105522024561 0ustar00djcusers00000000000000% Licensed under the Apache License, Version 2.0 (the "License"); you may not % use this file except in compliance with the License. You may obtain a copy of % the License at % % http://www.apache.org/licenses/LICENSE-2.0 % % Unless required by applicable law or agreed to in writing, software % distributed under the License is distributed on an "AS IS" BASIS, WITHOUT % WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the % License for the specific language governing permissions and limitations under % the License. -module(couch_index_server). -behaviour(gen_server). -export([start_link/0, get_index/4, get_index/3, get_index/2]). -export([config_change/2, update_notify/1]). -export([init/1, terminate/2, code_change/3]). -export([handle_call/3, handle_cast/2, handle_info/2]). -include("couch_db.hrl"). -define(BY_SIG, couchdb_indexes_by_sig). -define(BY_PID, couchdb_indexes_by_pid). -define(BY_DB, couchdb_indexes_by_db). -record(st, {root_dir}). start_link() -> gen_server:start_link({local, ?MODULE}, ?MODULE, [], []). get_index(Module, DbName, DDoc) -> get_index(Module, DbName, DDoc, nil). get_index(Module, DbName, DDoc, Fun) when is_binary(DbName) -> couch_util:with_db(DbName, fun(Db) -> get_index(Module, Db, DDoc, Fun) end); get_index(Module, Db, DDoc, Fun) when is_binary(DDoc) -> case couch_db:open_doc(Db, DDoc, [ejson_body]) of {ok, Doc} -> get_index(Module, Db, Doc, Fun); Error -> Error end; get_index(Module, Db, DDoc, Fun) when is_function(Fun, 1) -> {ok, InitState} = Module:init(Db, DDoc), {ok, FunResp} = Fun(InitState), {ok, Pid} = get_index(Module, InitState), {ok, Pid, FunResp}; get_index(Module, Db, DDoc, _Fun) -> {ok, InitState} = Module:init(Db, DDoc), get_index(Module, InitState). get_index(Module, IdxState) -> DbName = Module:get(db_name, IdxState), Sig = Module:get(signature, IdxState), case ets:lookup(?BY_SIG, {DbName, Sig}) of [{_, Pid}] when is_pid(Pid) -> {ok, Pid}; _ -> Args = {Module, IdxState, DbName, Sig}, gen_server:call(?MODULE, {get_index, Args}, infinity) end. init([]) -> process_flag(trap_exit, true), couch_config:register(fun ?MODULE:config_change/2), ets:new(?BY_SIG, [protected, set, named_table]), ets:new(?BY_PID, [private, set, named_table]), ets:new(?BY_DB, [protected, bag, named_table]), couch_db_update_notifier:start_link(fun ?MODULE:update_notify/1), RootDir = couch_index_util:root_dir(), couch_file:init_delete_dir(RootDir), {ok, #st{root_dir=RootDir}}. terminate(_Reason, _State) -> Pids = [Pid || {Pid, _} <- ets:tab2list(?BY_PID)], lists:map(fun couch_util:shutdown_sync/1, Pids), ok. handle_call({get_index, {_Mod, _IdxState, DbName, Sig}=Args}, From, State) -> case ets:lookup(?BY_SIG, {DbName, Sig}) of [] -> spawn_link(fun() -> new_index(Args) end), ets:insert(?BY_SIG, {{DbName, Sig}, [From]}), {noreply, State}; [{_, Waiters}] when is_list(Waiters) -> ets:insert(?BY_SIG, {{DbName, Sig}, [From | Waiters]}), {noreply, State}; [{_, Pid}] when is_pid(Pid) -> {reply, {ok, Pid}, State} end; handle_call({async_open, {DbName, DDocId, Sig}, {ok, Pid}}, _From, State) -> [{_, Waiters}] = ets:lookup(?BY_SIG, {DbName, Sig}), [gen_server:reply(From, {ok, Pid}) || From <- Waiters], link(Pid), add_to_ets(DbName, Sig, DDocId, Pid), {reply, ok, State}; handle_call({async_error, {DbName, _DDocId, Sig}, Error}, _From, State) -> [{_, Waiters}] = ets:lookup(?BY_SIG, {DbName, Sig}), [gen_server:reply(From, Error) || From <- Waiters], ets:delete(?BY_SIG, {DbName, Sig}), {reply, ok, State}; handle_call({reset_indexes, DbName}, _From, State) -> reset_indexes(DbName, State#st.root_dir), {reply, ok, State}. handle_cast({reset_indexes, DbName}, State) -> reset_indexes(DbName, State#st.root_dir), {noreply, State}. handle_info({'EXIT', Pid, Reason}, Server) -> case ets:lookup(?BY_PID, Pid) of [{Pid, {DbName, Sig}}] -> [{DbName, {DDocId, Sig}}] = ets:match_object(?BY_DB, {DbName, {'$1', Sig}}), rem_from_ets(DbName, Sig, DDocId, Pid); [] when Reason /= normal -> exit(Reason); _Else -> ok end, {noreply, Server}. code_change(_OldVsn, State, _Extra) -> {ok, State}. new_index({Mod, IdxState, DbName, Sig}) -> DDocId = Mod:get(idx_name, IdxState), case couch_index:start_link({Mod, IdxState}) of {ok, Pid} -> ok = gen_server:call( ?MODULE, {async_open, {DbName, DDocId, Sig}, {ok, Pid}}), unlink(Pid); Error -> ok = gen_server:call( ?MODULE, {async_error, {DbName, DDocId, Sig}, Error}) end. reset_indexes(DbName, Root) -> % shutdown all the updaters and clear the files, the db got changed Fun = fun({_, {DDocId, Sig}}) -> [{_, Pid}] = ets:lookup(?BY_SIG, {DbName, Sig}), MRef = erlang:monitor(process, Pid), gen_server:cast(Pid, delete), receive {'DOWN', MRef, _, _, _} -> ok end, rem_from_ets(DbName, Sig, DDocId, Pid) end, lists:foreach(Fun, ets:lookup(?BY_DB, DbName)), Path = couch_index_util:index_dir("", DbName), couch_file:nuke_dir(Root, Path). add_to_ets(DbName, Sig, DDocId, Pid) -> ets:insert(?BY_SIG, {{DbName, Sig}, Pid}), ets:insert(?BY_PID, {Pid, {DbName, Sig}}), ets:insert(?BY_DB, {DbName, {DDocId, Sig}}). rem_from_ets(DbName, Sig, DDocId, Pid) -> ets:delete(?BY_SIG, {DbName, Sig}), ets:delete(?BY_PID, Pid), ets:delete_object(?BY_DB, {DbName, {DDocId, Sig}}). config_change("couchdb", "view_index_dir") -> exit(whereis(?MODULE), config_change); config_change("couchdb", "index_dir") -> exit(whereis(?MODULE), config_change). update_notify({deleted, DbName}) -> gen_server:cast(?MODULE, {reset_indexes, DbName}); update_notify({created, DbName}) -> gen_server:cast(?MODULE, {reset_indexes, DbName}); update_notify({ddoc_updated, {DbName, DDocId}}) -> lists:foreach( fun({_DbName, {_DDocId, Sig}}) -> case ets:lookup(?BY_SIG, {DbName, Sig}) of [{_, IndexPid}] -> (catch gen_server:cast(IndexPid, ddoc_updated)); [] -> ok end end, ets:match_object(?BY_DB, {DbName, {DDocId, '$1'}})); update_notify(_) -> ok. apache-couchdb-1.6.0/src/couch_index/src/couch_index.erl0000644000175000001440000002605012332105522023163 0ustar00djcusers00000000000000% Licensed under the Apache License, Version 2.0 (the "License"); you may not % use this file except in compliance with the License. You may obtain a copy of % the License at % % http://www.apache.org/licenses/LICENSE-2.0 % % Unless required by applicable law or agreed to in writing, software % distributed under the License is distributed on an "AS IS" BASIS, WITHOUT % WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the % License for the specific language governing permissions and limitations under % the License. -module(couch_index). -behaviour(gen_server). %% API -export([start_link/1, stop/1, get_state/2, get_info/1]). -export([compact/1, compact/2, get_compactor_pid/1]). -export([config_change/3]). %% gen_server callbacks -export([init/1, terminate/2, code_change/3]). -export([handle_call/3, handle_cast/2, handle_info/2]). -include("couch_db.hrl"). -record(st, { mod, idx_state, updater, compactor, waiters=[], commit_delay, committed=true, shutdown=false }). start_link({Module, IdxState}) -> proc_lib:start_link(?MODULE, init, [{Module, IdxState}]). stop(Pid) -> gen_server:cast(Pid, stop). get_state(Pid, RequestSeq) -> gen_server:call(Pid, {get_state, RequestSeq}, infinity). get_info(Pid) -> gen_server:call(Pid, get_info). compact(Pid) -> compact(Pid, []). compact(Pid, Options) -> {ok, CPid} = gen_server:call(Pid, compact), case lists:member(monitor, Options) of true -> {ok, erlang:monitor(process, CPid)}; false -> ok end. get_compactor_pid(Pid) -> gen_server:call(Pid, get_compactor_pid). config_change("query_server_config", "commit_freq", NewValue) -> ok = gen_server:cast(?MODULE, {config_update, NewValue}). init({Mod, IdxState}) -> ok = couch_config:register(fun ?MODULE:config_change/3), DbName = Mod:get(db_name, IdxState), Resp = couch_util:with_db(DbName, fun(Db) -> case Mod:open(Db, IdxState) of {ok, IdxSt} -> couch_db:monitor(Db), {ok, IdxSt}; Error -> Error end end), case Resp of {ok, NewIdxState} -> {ok, UPid} = couch_index_updater:start_link(self(), Mod), {ok, CPid} = couch_index_compactor:start_link(self(), Mod), Delay = couch_config:get("query_server_config", "commit_freq", "5"), MsDelay = 1000 * list_to_integer(Delay), State = #st{ mod=Mod, idx_state=NewIdxState, updater=UPid, compactor=CPid, commit_delay=MsDelay }, Args = [ Mod:get(db_name, IdxState), Mod:get(idx_name, IdxState), couch_index_util:hexsig(Mod:get(signature, IdxState)) ], ?LOG_INFO("Opening index for db: ~s idx: ~s sig: ~p", Args), proc_lib:init_ack({ok, self()}), gen_server:enter_loop(?MODULE, [], State); Other -> proc_lib:init_ack(Other) end. terminate(Reason, State) -> #st{mod=Mod, idx_state=IdxState}=State, Mod:close(IdxState), send_all(State#st.waiters, Reason), couch_util:shutdown_sync(State#st.updater), couch_util:shutdown_sync(State#st.compactor), Args = [ Mod:get(db_name, IdxState), Mod:get(idx_name, IdxState), couch_index_util:hexsig(Mod:get(signature, IdxState)), Reason ], ?LOG_INFO("Closing index for db: ~s idx: ~s sig: ~p~nreason: ~p", Args), ok. handle_call({get_state, ReqSeq}, From, State) -> #st{ mod=Mod, idx_state=IdxState, waiters=Waiters } = State, IdxSeq = Mod:get(update_seq, IdxState), case ReqSeq =< IdxSeq of true -> {reply, {ok, IdxState}, State}; _ -> % View update required couch_index_updater:run(State#st.updater, IdxState), Waiters2 = [{From, ReqSeq} | Waiters], {noreply, State#st{waiters=Waiters2}, infinity} end; handle_call(get_info, _From, State) -> #st{mod=Mod} = State, {ok, Info0} = Mod:get(info, State#st.idx_state), IsUpdating = couch_index_updater:is_running(State#st.updater), IsCompacting = couch_index_compactor:is_running(State#st.compactor), Info = Info0 ++ [ {updater_running, IsUpdating}, {compact_running, IsCompacting}, {waiting_commit, State#st.committed == false}, {waiting_clients, length(State#st.waiters)} ], {reply, {ok, Info}, State}; handle_call(reset, _From, State) -> #st{ mod=Mod, idx_state=IdxState } = State, {ok, NewIdxState} = Mod:reset(IdxState), {reply, {ok, NewIdxState}, State#st{idx_state=NewIdxState}}; handle_call(compact, _From, State) -> Resp = couch_index_compactor:run(State#st.compactor, State#st.idx_state), {reply, Resp, State}; handle_call(get_compactor_pid, _From, State) -> {reply, {ok, State#st.compactor}, State}; handle_call({compacted, NewIdxState}, _From, State) -> #st{ mod=Mod, idx_state=OldIdxState, updater=Updater, commit_delay=Delay } = State, assert_signature_match(Mod, OldIdxState, NewIdxState), NewSeq = Mod:get(update_seq, NewIdxState), OldSeq = Mod:get(update_seq, OldIdxState), % For indices that require swapping files, we have to make sure we're % up to date with the current index. Otherwise indexes could roll back % (perhaps considerably) to previous points in history. case NewSeq >= OldSeq of true -> {ok, NewIdxState1} = Mod:swap_compacted(OldIdxState, NewIdxState), % Restart the indexer if it's running. case couch_index_updater:is_running(Updater) of true -> ok = couch_index_updater:restart(Updater, NewIdxState1); false -> ok end, case State#st.committed of true -> erlang:send_after(Delay, self(), commit); false -> ok end, {reply, ok, State#st{ idx_state=NewIdxState1, committed=false }}; _ -> {reply, recompact, State} end. handle_cast({config_change, NewDelay}, State) -> MsDelay = 1000 * list_to_integer(NewDelay), {noreply, State#st{commit_delay=MsDelay}}; handle_cast({updated, NewIdxState}, State) -> {noreply, NewState} = handle_cast({new_state, NewIdxState}, State), case NewState#st.shutdown andalso (NewState#st.waiters =:= []) of true -> {stop, normal, NewState}; false -> maybe_restart_updater(NewState), {noreply, NewState} end; handle_cast({new_state, NewIdxState}, State) -> #st{ mod=Mod, idx_state=OldIdxState, commit_delay=Delay } = State, assert_signature_match(Mod, OldIdxState, NewIdxState), CurrSeq = Mod:get(update_seq, NewIdxState), Args = [ Mod:get(db_name, NewIdxState), Mod:get(idx_name, NewIdxState), CurrSeq ], ?LOG_DEBUG("Updated index for db: ~s idx: ~s seq: ~B", Args), Rest = send_replies(State#st.waiters, CurrSeq, NewIdxState), case State#st.committed of true -> erlang:send_after(Delay, self(), commit); false -> ok end, {noreply, State#st{ idx_state=NewIdxState, waiters=Rest, committed=false }}; handle_cast({update_error, Error}, State) -> send_all(State#st.waiters, Error), {noreply, State#st{waiters=[]}}; handle_cast(stop, State) -> {stop, normal, State}; handle_cast(delete, State) -> #st{mod=Mod, idx_state=IdxState} = State, ok = Mod:delete(IdxState), {stop, normal, State}; handle_cast(ddoc_updated, State) -> #st{mod = Mod, idx_state = IdxState, waiters = Waiters} = State, DbName = Mod:get(db_name, IdxState), DDocId = Mod:get(idx_name, IdxState), Shutdown = couch_util:with_db(DbName, fun(Db) -> case couch_db:open_doc(Db, DDocId, [ejson_body]) of {not_found, deleted} -> true; {ok, DDoc} -> {ok, NewIdxState} = Mod:init(Db, DDoc), Mod:get(signature, NewIdxState) =/= Mod:get(signature, IdxState) end end), case Shutdown of true -> case Waiters of [] -> {stop, normal, State}; _ -> {noreply, State#st{shutdown = true}} end; false -> {noreply, State#st{shutdown = false}} end; handle_cast(_Mesg, State) -> {stop, unhandled_cast, State}. handle_info(commit, #st{committed=true}=State) -> {noreply, State}; handle_info(commit, State) -> #st{mod=Mod, idx_state=IdxState, commit_delay=Delay} = State, DbName = Mod:get(db_name, IdxState), GetCommSeq = fun(Db) -> couch_db:get_committed_update_seq(Db) end, CommittedSeq = couch_util:with_db(DbName, GetCommSeq), case CommittedSeq >= Mod:get(update_seq, IdxState) of true -> % Commit the updates ok = Mod:commit(IdxState), {noreply, State#st{committed=true}}; _ -> % We can't commit the header because the database seq that's % fully committed to disk is still behind us. If we committed % now and the database lost those changes our view could be % forever out of sync with the database. But a crash before we % commit these changes, no big deal, we only lose incremental % changes since last committal. erlang:send_after(Delay, self(), commit), {noreply, State} end; handle_info({'DOWN', _, _, _Pid, _}, #st{mod=Mod, idx_state=IdxState}=State) -> Args = [Mod:get(db_name, IdxState), Mod:get(idx_name, IdxState)], ?LOG_INFO("Index shutdown by monitor notice for db: ~s idx: ~s", Args), catch send_all(State#st.waiters, shutdown), {stop, normal, State#st{waiters=[]}}. code_change(_OldVsn, State, _Extra) -> {ok, State}. maybe_restart_updater(#st{waiters=[]}) -> ok; maybe_restart_updater(#st{mod=Mod, idx_state=IdxState}=State) -> couch_util:with_db(Mod:get(db_name, IdxState), fun(Db) -> UpdateSeq = couch_db:get_update_seq(Db), CommittedSeq = couch_db:get_committed_update_seq(Db), CanUpdate = UpdateSeq > CommittedSeq, UOpts = Mod:get(update_options, IdxState), case CanUpdate and lists:member(committed_only, UOpts) of true -> couch_db:ensure_full_commit(Db); false -> ok end end), couch_index_updater:run(State#st.updater, IdxState). send_all(Waiters, Reply) -> [gen_server:reply(From, Reply) || {From, _} <- Waiters]. send_replies(Waiters, UpdateSeq, IdxState) -> Pred = fun({_, S}) -> S =< UpdateSeq end, {ToSend, Remaining} = lists:partition(Pred, Waiters), [gen_server:reply(From, {ok, IdxState}) || {From, _} <- ToSend], Remaining. assert_signature_match(Mod, OldIdxState, NewIdxState) -> case {Mod:get(signature, OldIdxState), Mod:get(signature, NewIdxState)} of {Sig, Sig} -> ok; _ -> erlang:error(signature_mismatch) end. apache-couchdb-1.6.0/src/couch_index/src/couch_index_compactor.erl0000644000175000001440000000611312332105522025230 0ustar00djcusers00000000000000% Licensed under the Apache License, Version 2.0 (the "License"); you may not % use this file except in compliance with the License. You may obtain a copy of % the License at % % http://www.apache.org/licenses/LICENSE-2.0 % % Unless required by applicable law or agreed to in writing, software % distributed under the License is distributed on an "AS IS" BASIS, WITHOUT % WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the % License for the specific language governing permissions and limitations under % the License. -module(couch_index_compactor). -behaviour(gen_server). %% API -export([start_link/2, run/2, cancel/1, is_running/1]). %% gen_server callbacks -export([init/1, terminate/2, code_change/3]). -export([handle_call/3, handle_cast/2, handle_info/2]). -include("couch_db.hrl"). -record(st, { idx, mod, pid }). start_link(Index, Module) -> gen_server:start_link(?MODULE, {Index, Module}, []). run(Pid, IdxState) -> gen_server:call(Pid, {compact, IdxState}). cancel(Pid) -> gen_server:call(Pid, cancel). is_running(Pid) -> gen_server:call(Pid, is_running). init({Index, Module}) -> process_flag(trap_exit, true), {ok, #st{idx=Index, mod=Module}}. terminate(_Reason, State) -> couch_util:shutdown_sync(State#st.pid), ok. handle_call({compact, _}, _From, #st{pid=Pid}=State) when is_pid(Pid) -> {reply, {ok, Pid}, State}; handle_call({compact, IdxState}, _From, #st{idx=Idx}=State) -> Pid = spawn_link(fun() -> compact(Idx, State#st.mod, IdxState) end), {reply, {ok, Pid}, State#st{pid=Pid}}; handle_call(cancel, _From, #st{pid=undefined}=State) -> {reply, ok, State}; handle_call(cancel, _From, #st{pid=Pid}=State) -> unlink(Pid), exit(Pid, kill), {reply, ok, State#st{pid=undefined}}; handle_call(is_running, _From, #st{pid=Pid}=State) when is_pid(Pid) -> {reply, true, State}; handle_call(is_running, _From, State) -> {reply, false, State}. handle_cast(_Mesg, State) -> {stop, unknown_cast, State}. handle_info({'EXIT', Pid, normal}, #st{pid=Pid}=State) -> {noreply, State#st{pid=undefined}}; handle_info({'EXIT', _Pid, normal}, State) -> {noreply, State}; handle_info({'EXIT', Pid, _Reason}, #st{idx=Pid}=State) -> {stop, normal, State}; handle_info(_Mesg, State) -> {stop, unknown_info, State}. code_change(_OldVsn, State, _Extra) -> {ok, State}. compact(Parent, Mod, IdxState) -> compact(Parent, Mod, IdxState, []). compact(Idx, Mod, IdxState, Opts) -> DbName = Mod:get(db_name, IdxState), Args = [DbName, Mod:get(idx_name, IdxState)], ?LOG_INFO("Compaction started for db: ~s idx: ~s", Args), {ok, NewIdxState} = couch_util:with_db(DbName, fun(Db) -> Mod:compact(Db, IdxState, Opts) end), ok = Mod:commit(NewIdxState), case gen_server:call(Idx, {compacted, NewIdxState}) of recompact -> ?LOG_INFO("Compaction restarting for db: ~s idx: ~s", Args), compact(Idx, Mod, NewIdxState, [recompact]); _ -> ?LOG_INFO("Compaction finished for db: ~s idx: ~s", Args), ok end. apache-couchdb-1.6.0/src/couch_index/src/couch_index_util.erl0000644000175000001440000000462512332105522024224 0ustar00djcusers00000000000000% Licensed under the Apache License, Version 2.0 (the "License"); you may not % use this file except in compliance with the License. You may obtain a copy of % the License at % % http://www.apache.org/licenses/LICENSE-2.0 % % Unless required by applicable law or agreed to in writing, software % distributed under the License is distributed on an "AS IS" BASIS, WITHOUT % WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the % License for the specific language governing permissions and limitations under % the License. -module(couch_index_util). -export([root_dir/0, index_dir/2, index_file/3]). -export([load_doc/3, sort_lib/1, hexsig/1]). -include("couch_db.hrl"). root_dir() -> couch_config:get("couchdb", "view_index_dir"). index_dir(Module, DbName) when is_binary(DbName) -> DbDir = "." ++ binary_to_list(DbName) ++ "_design", filename:join([root_dir(), DbDir, Module]); index_dir(Module, #db{}=Db) -> index_dir(Module, couch_db:name(Db)). index_file(Module, DbName, FileName) -> filename:join(index_dir(Module, DbName), FileName). load_doc(Db, #doc_info{}=DI, Opts) -> Deleted = lists:member(deleted, Opts), case (catch couch_db:open_doc(Db, DI, Opts)) of {ok, #doc{deleted=false}=Doc} -> Doc; {ok, #doc{deleted=true}=Doc} when Deleted -> Doc; _Else -> null end; load_doc(Db, {DocId, Rev}, Opts) -> case (catch load_doc(Db, DocId, Rev, Opts)) of #doc{deleted=false} = Doc -> Doc; _ -> null end. load_doc(Db, DocId, Rev, Options) -> case Rev of nil -> % open most recent rev case (catch couch_db:open_doc(Db, DocId, Options)) of {ok, Doc} -> Doc; _Error -> null end; _ -> % open a specific rev (deletions come back as stubs) case (catch couch_db:open_doc_revs(Db, DocId, [Rev], Options)) of {ok, [{ok, Doc}]} -> Doc; {ok, [{{not_found, missing}, Rev}]} -> null; {ok, [_Else]} -> null end end. sort_lib({Lib}) -> sort_lib(Lib, []). sort_lib([], LAcc) -> lists:keysort(1, LAcc); sort_lib([{LName, {LObj}}|Rest], LAcc) -> LSorted = sort_lib(LObj, []), % descend into nested object sort_lib(Rest, [{LName, LSorted}|LAcc]); sort_lib([{LName, LCode}|Rest], LAcc) -> sort_lib(Rest, [{LName, LCode}|LAcc]). hexsig(Sig) -> couch_util:to_hex(binary_to_list(Sig)). apache-couchdb-1.6.0/src/couch_index/src/couch_index_api.erl0000644000175000001440000000203012332105522024004 0ustar00djcusers00000000000000% Licensed under the Apache License, Version 2.0 (the "License"); you may not % use this file except in compliance with the License. You may obtain a copy of % the License at % % http://www.apache.org/licenses/LICENSE-2.0 % % Unless required by applicable law or agreed to in writing, software % distributed under the License is distributed on an "AS IS" BASIS, WITHOUT % WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the % License for the specific language governing permissions and limitations under % the License. -module(couch_index_api). get(Field, State) -> ok. init(Db, Ddoc) -> ok. open(Db, State) -> ok. close(State) -> ok. delete(State) -> ok. reset(State) -> ok. start_update(State, PurgedState, NumChanges) -> {ok, State}. purge(Db, PurgeSeq, PurgedIdRevs, State) -> ok. process_doc(Doc, Seq, State) -> ok. finish_update(State) -> {ok, State}. commit(State) -> ok. compact(Parent, State, Opts) -> ok. swap_compacted(OldState, NewState) -> ok. apache-couchdb-1.6.0/src/couch_index/src/couch_index_updater.erl0000644000175000001440000001500512332105522024705 0ustar00djcusers00000000000000% Licensed under the Apache License, Version 2.0 (the "License"); you may not % use this file except in compliance with the License. You may obtain a copy of % the License at % % http://www.apache.org/licenses/LICENSE-2.0 % % Unless required by applicable law or agreed to in writing, software % distributed under the License is distributed on an "AS IS" BASIS, WITHOUT % WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the % License for the specific language governing permissions and limitations under % the License. -module(couch_index_updater). -behaviour(gen_server). %% API -export([start_link/2, run/2, is_running/1, update/2, restart/2]). %% gen_server callbacks -export([init/1, terminate/2, code_change/3]). -export([handle_call/3, handle_cast/2, handle_info/2]). -include("couch_db.hrl"). -record(st, { idx, mod, pid=nil }). start_link(Index, Module) -> gen_server:start_link(?MODULE, {Index, Module}, []). run(Pid, IdxState) -> gen_server:call(Pid, {update, IdxState}, infinity). is_running(Pid) -> gen_server:call(Pid, is_running). update(Mod, State) -> update(nil, Mod, State). restart(Pid, IdxState) -> gen_server:call(Pid, {restart, IdxState}). init({Index, Module}) -> process_flag(trap_exit, true), {ok, #st{idx=Index, mod=Module}}. terminate(_Reason, State) -> couch_util:shutdown_sync(State#st.pid), ok. handle_call({update, _IdxState}, _From, #st{pid=Pid}=State) when is_pid(Pid) -> {reply, ok, State}; handle_call({update, IdxState}, _From, #st{idx=Idx, mod=Mod}=State) -> Args = [Mod:get(db_name, IdxState), Mod:get(idx_name, IdxState)], ?LOG_INFO("Starting index update for db: ~s idx: ~s", Args), Pid = spawn_link(fun() -> update(Idx, Mod, IdxState) end), {reply, ok, State#st{pid=Pid}}; handle_call({restart, IdxState}, _From, #st{idx=Idx, mod=Mod}=State) -> Args = [Mod:get(db_name, IdxState), Mod:get(idx_name, IdxState)], ?LOG_INFO("Restarting index update for db: ~s idx: ~s", Args), case is_pid(State#st.pid) of true -> couch_util:shutdown_sync(State#st.pid); _ -> ok end, Pid = spawn_link(fun() -> update(Idx, State#st.mod, IdxState) end), {reply, ok, State#st{pid=Pid}}; handle_call(is_running, _From, #st{pid=Pid}=State) when is_pid(Pid) -> {reply, true, State}; handle_call(is_running, _From, State) -> {reply, false, State}. handle_cast(_Mesg, State) -> {stop, unknown_cast, State}. handle_info({'EXIT', _, {updated, Pid, IdxState}}, #st{pid=Pid}=State) -> Mod = State#st.mod, Args = [Mod:get(db_name, IdxState), Mod:get(idx_name, IdxState)], ?LOG_INFO("Index update finished for db: ~s idx: ~s", Args), ok = gen_server:cast(State#st.idx, {updated, IdxState}), {noreply, State#st{pid=undefined}}; handle_info({'EXIT', _, {reset, Pid}}, #st{idx=Idx, pid=Pid}=State) -> {ok, NewIdxState} = gen_server:call(State#st.idx, reset), Pid2 = spawn_link(fun() -> update(Idx, State#st.mod, NewIdxState) end), {noreply, State#st{pid=Pid2}}; handle_info({'EXIT', Pid, normal}, #st{pid=Pid}=State) -> {noreply, State#st{pid=undefined}}; handle_info({'EXIT', Pid, {{nocatch, Error}, _Trace}}, State) -> handle_info({'EXIT', Pid, Error}, State); handle_info({'EXIT', Pid, Error}, #st{pid=Pid}=State) -> ok = gen_server:cast(State#st.idx, {update_error, Error}), {noreply, State#st{pid=undefined}}; handle_info({'EXIT', Pid, _Reason}, #st{idx=Pid}=State) -> {stop, normal, State}; handle_info({'EXIT', _Pid, normal}, State) -> {noreply, State}; handle_info(_Mesg, State) -> {stop, unknown_info, State}. code_change(_OldVsn, State, _Extra) -> {ok, State}. update(Idx, Mod, IdxState) -> DbName = Mod:get(db_name, IdxState), CurrSeq = Mod:get(update_seq, IdxState), UpdateOpts = Mod:get(update_options, IdxState), CommittedOnly = lists:member(committed_only, UpdateOpts), IncludeDesign = lists:member(include_design, UpdateOpts), DocOpts = case lists:member(local_seq, UpdateOpts) of true -> [conflicts, deleted_conflicts, local_seq]; _ -> [conflicts, deleted_conflicts] end, couch_util:with_db(DbName, fun(Db) -> DbUpdateSeq = couch_db:get_update_seq(Db), DbCommittedSeq = couch_db:get_committed_update_seq(Db), PurgedIdxState = case purge_index(Db, Mod, IdxState) of {ok, IdxState0} -> IdxState0; reset -> exit({reset, self()}) end, NumChanges = couch_db:count_changes_since(Db, CurrSeq), LoadDoc = fun(DocInfo) -> #doc_info{ id=DocId, high_seq=Seq, revs=[#rev_info{deleted=Deleted} | _] } = DocInfo, case {IncludeDesign, DocId} of {false, <<"_design/", _/binary>>} -> {nil, Seq}; _ when Deleted -> {#doc{id=DocId, deleted=true}, Seq}; _ -> {ok, Doc} = couch_db:open_doc_int(Db, DocInfo, DocOpts), {Doc, Seq} end end, Proc = fun(DocInfo, _, {IdxStateAcc, _}) -> HighSeq = DocInfo#doc_info.high_seq, case CommittedOnly and (HighSeq > DbCommittedSeq) of true -> {stop, {IdxStateAcc, false}}; false -> {Doc, Seq} = LoadDoc(DocInfo), {ok, NewSt} = Mod:process_doc(Doc, Seq, IdxStateAcc), {ok, {NewSt, true}} end end, {ok, InitIdxState} = Mod:start_update(Idx, PurgedIdxState, NumChanges), Acc0 = {InitIdxState, true}, {ok, _, Acc} = couch_db:enum_docs_since(Db, CurrSeq, Proc, Acc0, []), {ProcIdxSt, SendLast} = Acc, % If we didn't bail due to hitting the last committed seq we need % to send our last update_seq through. {ok, LastIdxSt} = case SendLast of true -> Mod:process_doc(nil, DbUpdateSeq, ProcIdxSt); _ -> {ok, ProcIdxSt} end, {ok, FinalIdxState} = Mod:finish_update(LastIdxSt), exit({updated, self(), FinalIdxState}) end). purge_index(Db, Mod, IdxState) -> DbPurgeSeq = couch_db:get_purge_seq(Db), IdxPurgeSeq = Mod:get(purge_seq, IdxState), if DbPurgeSeq == IdxPurgeSeq -> {ok, IdxState}; DbPurgeSeq == IdxPurgeSeq + 1 -> {ok, PurgedIdRevs} = couch_db:get_last_purged(Db), Mod:purge(Db, DbPurgeSeq, PurgedIdRevs, IdxState); true -> reset end. apache-couchdb-1.6.0/src/couch_index/Makefile.am0000644000175000001440000000242312332105522021432 0ustar00djcusers00000000000000## Licensed under the Apache License, Version 2.0 (the "License"); you may not ## use this file except in compliance with the License. You may obtain a copy of ## the License at ## ## http://www.apache.org/licenses/LICENSE-2.0 ## ## Unless required by applicable law or agreed to in writing, software ## distributed under the License is distributed on an "AS IS" BASIS, WITHOUT ## WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the ## License for the specific language governing permissions and limitations under ## the License. couch_indexlibdir = $(localerlanglibdir)/couch_index-0.1 couch_indexebindir = $(couch_indexlibdir)/ebin couch_indexebin_DATA = $(compiled_files) EXTRA_DIST = $(source_files) CLEANFILES = $(compiled_files) source_files = \ src/couch_index.erl \ src/couch_index_api.erl \ src/couch_index.app.src \ src/couch_index_compactor.erl \ src/couch_index_server.erl \ src/couch_index_updater.erl \ src/couch_index_util.erl compiled_files = \ ebin/couch_index.beam \ ebin/couch_index_compactor.beam \ ebin/couch_index_server.beam \ ebin/couch_index_updater.beam \ ebin/couch_index_util.beam ebin/%.beam: src/%.erl @mkdir -p ebin/ $(ERLC) -I$(top_srcdir)/src/couchdb -o ebin/ $(ERLC_FLAGS) ${TEST} $<; apache-couchdb-1.6.0/src/couch_index/Makefile.in0000644000175000001440000003630612332105551021454 0ustar00djcusers00000000000000# Makefile.in generated by automake 1.11.6 from Makefile.am. # @configure_input@ # Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, # 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011 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__make_dryrun = \ { \ am__dry=no; \ case $$MAKEFLAGS in \ *\\[\ \ ]*) \ echo 'am--echo: ; @echo "AM" OK' | $(MAKE) -f - 2>/dev/null \ | grep '^AM OK$$' >/dev/null || am__dry=yes;; \ *) \ for am__flg in $$MAKEFLAGS; do \ case $$am__flg in \ *=*|--*) ;; \ *n*) am__dry=yes; break;; \ esac; \ done;; \ esac; \ test $$am__dry = yes; \ } 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/couch_index DIST_COMMON = $(srcdir)/Makefile.am $(srcdir)/Makefile.in ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 am__aclocal_m4_deps = $(top_srcdir)/m4/libtool.m4 \ $(top_srcdir)/m4/ltoptions.m4 $(top_srcdir)/m4/ltsugar.m4 \ $(top_srcdir)/m4/ltversion.m4 $(top_srcdir)/m4/lt~obsolete.m4 \ $(top_srcdir)/acinclude.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 \ $(top_builddir)/src/snappy/google-snappy/config.h CONFIG_CLEAN_FILES = CONFIG_CLEAN_VPATH_FILES = 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)$(couch_indexebindir)" DATA = $(couch_indexebin_DATA) DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) ACLOCAL = @ACLOCAL@ AMTAR = @AMTAR@ AR = @AR@ AS = @AS@ AUTOCONF = @AUTOCONF@ AUTOHEADER = @AUTOHEADER@ AUTOMAKE = @AUTOMAKE@ AWK = @AWK@ CC = @CC@ CCDEPMODE = @CCDEPMODE@ CFLAGS = @CFLAGS@ CPP = @CPP@ CPPFLAGS = @CPPFLAGS@ CURL_CFLAGS = @CURL_CFLAGS@ CURL_CONFIG = @CURL_CONFIG@ CURL_LIBS = @CURL_LIBS@ CXX = @CXX@ CXXCPP = @CXXCPP@ CXXDEPMODE = @CXXDEPMODE@ CXXFLAGS = @CXXFLAGS@ CYGPATH_W = @CYGPATH_W@ DEFS = @DEFS@ DEPDIR = @DEPDIR@ DLLTOOL = @DLLTOOL@ DSYMUTIL = @DSYMUTIL@ DUMPBIN = @DUMPBIN@ ECHO_C = @ECHO_C@ ECHO_N = @ECHO_N@ ECHO_T = @ECHO_T@ EGREP = @EGREP@ ERL = @ERL@ ERLANG_FLAGS = @ERLANG_FLAGS@ ERLC = @ERLC@ ERLC_FLAGS = @ERLC_FLAGS@ ESCRIPT = @ESCRIPT@ EXEEXT = @EXEEXT@ FGREP = @FGREP@ FLAGS = @FLAGS@ GREP = @GREP@ HAS_HELP2MAN = @HAS_HELP2MAN@ HAS_INSTALLINFO = @HAS_INSTALLINFO@ HAS_MAKEINFO = @HAS_MAKEINFO@ HAS_PDFLATEX = @HAS_PDFLATEX@ HAS_SPHINX_BUILD = @HAS_SPHINX_BUILD@ ICU_BIN = @ICU_BIN@ ICU_CFLAGS = @ICU_CFLAGS@ ICU_CONFIG = @ICU_CONFIG@ ICU_CPPFLAGS = @ICU_CPPFLAGS@ ICU_CXXFLAGS = @ICU_CXXFLAGS@ ICU_LIBS = @ICU_LIBS@ INNO_COMPILER_EXECUTABLE = @INNO_COMPILER_EXECUTABLE@ INSTALL = @INSTALL@ INSTALL_DATA = @INSTALL_DATA@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ INSTALL_SCRIPT = @INSTALL_SCRIPT@ INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ JS_CFLAGS = @JS_CFLAGS@ JS_LIBS = @JS_LIBS@ JS_LIB_BINARY = @JS_LIB_BINARY@ LD = @LD@ LDFLAGS = @LDFLAGS@ LIBOBJS = @LIBOBJS@ LIBS = @LIBS@ LIBTOOL = @LIBTOOL@ LIPO = @LIPO@ LN_S = @LN_S@ LTLIBOBJS = @LTLIBOBJS@ MAKEINFO = @MAKEINFO@ MANIFEST_TOOL = @MANIFEST_TOOL@ MKDIR_P = @MKDIR_P@ NM = @NM@ NMEDIT = @NMEDIT@ OBJDUMP = @OBJDUMP@ OBJEXT = @OBJEXT@ OTOOL = @OTOOL@ OTOOL64 = @OTOOL64@ PACKAGE = @PACKAGE@ PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ PACKAGE_NAME = @PACKAGE_NAME@ PACKAGE_STRING = @PACKAGE_STRING@ PACKAGE_TARNAME = @PACKAGE_TARNAME@ PACKAGE_URL = @PACKAGE_URL@ PACKAGE_VERSION = @PACKAGE_VERSION@ PATH_SEPARATOR = @PATH_SEPARATOR@ PKG_CONFIG = @PKG_CONFIG@ PKG_CONFIG_LIBDIR = @PKG_CONFIG_LIBDIR@ PKG_CONFIG_PATH = @PKG_CONFIG_PATH@ RANLIB = @RANLIB@ SED = @SED@ SET_MAKE = @SET_MAKE@ SHELL = @SHELL@ SNAPPY_MAJOR = @SNAPPY_MAJOR@ SNAPPY_MINOR = @SNAPPY_MINOR@ SNAPPY_PATCHLEVEL = @SNAPPY_PATCHLEVEL@ STRIP = @STRIP@ VERSION = @VERSION@ 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@ ac_cv_have_stddef_h = @ac_cv_have_stddef_h@ ac_cv_have_stdint_h = @ac_cv_have_stdint_h@ am__include = @am__include@ am__leading_dot = @am__leading_dot@ am__quote = @am__quote@ am__tar = @am__tar@ am__untar = @am__untar@ bindir = @bindir@ bug_uri = @bug_uri@ 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@ dvidir = @dvidir@ erlangbin = @erlangbin@ erlangversion = @erlangversion@ exec_prefix = @exec_prefix@ host = @host@ host_alias = @host_alias@ host_cpu = @host_cpu@ host_os = @host_os@ host_vendor = @host_vendor@ htmldir = @htmldir@ includedir = @includedir@ infodir = @infodir@ initdir = @initdir@ install_sh = @install_sh@ launchddir = @launchddir@ libdir = @libdir@ libexecdir = @libexecdir@ localconfdir = @localconfdir@ localdatadir = @localdatadir@ localdocdir = @localdocdir@ localedir = @localedir@ localerlanglibdir = @localerlanglibdir@ locallibbindir = @locallibbindir@ locallibdir = @locallibdir@ localstatedir = @localstatedir@ localstatelibdir = @localstatelibdir@ localstatelogdir = @localstatelogdir@ localstaterundir = @localstaterundir@ mandir = @mandir@ mkdir_p = @mkdir_p@ msvc_redist_dir = @msvc_redist_dir@ msvc_redist_name = @msvc_redist_name@ oldincludedir = @oldincludedir@ openssl_bin_dir = @openssl_bin_dir@ otp_release = @otp_release@ package_author_address = @package_author_address@ package_author_name = @package_author_name@ package_identifier = @package_identifier@ package_name = @package_name@ package_tarname = @package_tarname@ 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@ version = @version@ version_major = @version_major@ version_minor = @version_minor@ version_release = @version_release@ version_revision = @version_revision@ version_stage = @version_stage@ couch_indexlibdir = $(localerlanglibdir)/couch_index-0.1 couch_indexebindir = $(couch_indexlibdir)/ebin couch_indexebin_DATA = $(compiled_files) EXTRA_DIST = $(source_files) CLEANFILES = $(compiled_files) source_files = \ src/couch_index.erl \ src/couch_index_api.erl \ src/couch_index.app.src \ src/couch_index_compactor.erl \ src/couch_index_server.erl \ src/couch_index_updater.erl \ src/couch_index_util.erl compiled_files = \ ebin/couch_index.beam \ ebin/couch_index_compactor.beam \ ebin/couch_index_server.beam \ ebin/couch_index_updater.beam \ ebin/couch_index_util.beam 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) --foreign src/couch_index/Makefile'; \ $(am__cd) $(top_srcdir) && \ $(AUTOMAKE) --foreign src/couch_index/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-couch_indexebinDATA: $(couch_indexebin_DATA) @$(NORMAL_INSTALL) @list='$(couch_indexebin_DATA)'; test -n "$(couch_indexebindir)" || list=; \ if test -n "$$list"; then \ echo " $(MKDIR_P) '$(DESTDIR)$(couch_indexebindir)'"; \ $(MKDIR_P) "$(DESTDIR)$(couch_indexebindir)" || 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)$(couch_indexebindir)'"; \ $(INSTALL_DATA) $$files "$(DESTDIR)$(couch_indexebindir)" || exit $$?; \ done uninstall-couch_indexebinDATA: @$(NORMAL_UNINSTALL) @list='$(couch_indexebin_DATA)'; test -n "$(couch_indexebindir)" || list=; \ files=`for p in $$list; do echo $$p; done | sed -e 's|^.*/||'`; \ dir='$(DESTDIR)$(couch_indexebindir)'; $(am__uninstall_files_from_dir) tags: TAGS TAGS: ctags: CTAGS CTAGS: 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)$(couch_indexebindir)"; 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 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-couch_indexebinDATA 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-couch_indexebinDATA .MAKE: install-am install-strip .PHONY: all all-am check check-am clean clean-generic clean-libtool \ distclean distclean-generic distclean-libtool distdir dvi \ dvi-am html html-am info info-am install install-am \ install-couch_indexebinDATA 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 uninstall uninstall-am uninstall-couch_indexebinDATA ebin/%.beam: src/%.erl @mkdir -p ebin/ $(ERLC) -I$(top_srcdir)/src/couchdb -o ebin/ $(ERLC_FLAGS) ${TEST} $<; # 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: apache-couchdb-1.6.0/src/my-first-couchdb-plugin/0000755000175000001440000000000012332105600021555 5ustar00djcusers00000000000000apache-couchdb-1.6.0/src/my-first-couchdb-plugin/src/0000755000175000001440000000000012332105600022344 5ustar00djcusers00000000000000apache-couchdb-1.6.0/src/my-first-couchdb-plugin/src/my_first_couchdb_plugin.app.src0000644000175000001440000000140312332105522030536 0ustar00djcusers00000000000000% Licensed under the Apache License, Version 2.0 (the "License"); you may not % use this file except in compliance with the License. You may obtain a copy of % the License at % % http://www.apache.org/licenses/LICENSE-2.0 % % Unless required by applicable law or agreed to in writing, software % distributed under the License is distributed on an "AS IS" BASIS, WITHOUT % WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the % License for the specific language governing permissions and limitations under % the License. %% -*- mode: erlang -*- {application, my_first_couchdb_plugin, [ {description, "My First CouchDB Plugin"}, {vsn, "0.0.0"}, {modules, []}, {registered, []}, {applications, [kernel, stdlib]}, {env, []} ]}. apache-couchdb-1.6.0/src/my-first-couchdb-plugin/src/my_first_couchdb_plugin.erl0000644000175000001440000000115612332105522027757 0ustar00djcusers00000000000000% Licensed under the Apache License, Version 2.0 (the "License"); you may not % use this file except in compliance with the License. You may obtain a copy of % the License at % % http://www.apache.org/licenses/LICENSE-2.0 % % Unless required by applicable law or agreed to in writing, software % distributed under the License is distributed on an "AS IS" BASIS, WITHOUT % WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the % License for the specific language governing permissions and limitations under % the License. -module(my_first_couchdb_plugin). -export([my_func/0]). my_func() -> ok. apache-couchdb-1.6.0/src/my-first-couchdb-plugin/priv/0000755000175000001440000000000012332105600022535 5ustar00djcusers00000000000000apache-couchdb-1.6.0/src/my-first-couchdb-plugin/priv/default.d/0000755000175000001440000000000012332105600024403 5ustar00djcusers00000000000000apache-couchdb-1.6.0/src/my-first-couchdb-plugin/priv/default.d/my_first_couchdb_plugin.ini0000644000175000001440000000010112332105522032000 0ustar00djcusers00000000000000;per-plugin configuration goes here ;[plugin-name] ;config=value apache-couchdb-1.6.0/src/my-first-couchdb-plugin/test/0000755000175000001440000000000012332105600022534 5ustar00djcusers00000000000000apache-couchdb-1.6.0/src/my-first-couchdb-plugin/test/my_first_couchdb_plugin_tests.erl0000644000175000001440000000116112332105522031365 0ustar00djcusers00000000000000% Licensed under the Apache License, Version 2.0 (the "License"); you may not % use this file except in compliance with the License. You may obtain a copy of % the License at % % http://www.apache.org/licenses/LICENSE-2.0 % % Unless required by applicable law or agreed to in writing, software % distributed under the License is distributed on an "AS IS" BASIS, WITHOUT % WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the % License for the specific language governing permissions and limitations under % the License. -module(my_first_couchdb_plugin_tests). -include_lib("eunit/include/eunit.hrl"). apache-couchdb-1.6.0/src/my-first-couchdb-plugin/Makefile0000644000175000001440000000262312332105522023223 0ustar00djcusers00000000000000## Licensed under the Apache License, Version 2.0 (the "License"); you may not ## use this file except in compliance with the License. You may obtain a copy of ## the License at ## ## http://www.apache.org/licenses/LICENSE-2.0 ## ## Unless required by applicable law or agreed to in writing, software ## distributed under the License is distributed on an "AS IS" BASIS, WITHOUT ## WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the ## License for the specific language governing permissions and limitations under ## the License. # Customize here NAME=my_first_couchdb_plugin VERSION=1.0.0 # Stop customizing here ERL=$(shell couch-config --erl-bin) ERLANG_VERSION=$(shell couch-config --erlang-version) COUCHDB_VERSION=$(shell couch-config --couch-version | sed 's/\+.*//') PLUGIN_DIRS=ebin priv PLUGIN_VERSION_SLUG=$(NAME)-$(VERSION)-$(ERLANG_VERSION)-$(COUCHDB_VERSION) PLUGIN_DIST=$(PLUGIN_VERSION_SLUG) all: compile compile: ERL_LIBS=$(shell couch-config --erl-libs-dir):$(ERL_LIBS) rebar compile dev: @ERL_LIBS=$(shell pwd) couchdb -i -a priv/default.d/*.ini plugin: compile @mkdir -p $(PLUGIN_DIRS) @mkdir -p $(PLUGIN_DIST) @cp -r $(PLUGIN_DIRS) $(PLUGIN_DIST) @tar czf $(PLUGIN_VERSION_SLUG).tar.gz $(PLUGIN_DIST) @$(ERL) -eval 'File = "$(PLUGIN_VERSION_SLUG).tar.gz", {ok, Data} = file:read_file(File),io:format("~s: ~s~n", [File, base64:encode(crypto:sha(Data))]),halt()' -noshell apache-couchdb-1.6.0/src/my-first-couchdb-plugin/README.md0000644000175000001440000002154612332105522023047 0ustar00djcusers00000000000000# My First CouchDB Plugin A practical guide to developing CouchDB plugins. *NOTE: this feature is considered beta, possibly subject to change and expects that you understand some Erlang. ## Preparation To get started, you need to install CouchDB from source, grab the CouchDB sources: git clone https://github.com/apache/couchdb.git cd couchdb Follow the instructions in `couchdb/INSTALL.Unix` and `couchdb/DEVELOPERS` to get a development environment going. Be sure to install CouchDB into your system. If you want to install CouchDB into a development directory, make sure that the `bin/` folder of that directory is in your `PATH`. Next, install *rebar* from . Rebar is a build tool for Erlang projects and it makes our lives a lot easier. ## Quick Start `my_first_couchdb_plugin` includes two directories `src` and `test` with an `.erl` file in them each. `src/my_first_couchdb_plugin.erl` is where our module code will live and `test/my_first_couchdb_plugin_tests.erl` will contain any tests for that code. `src/my_first_couchdb_plugin.erl` now should look like this: -module(my_first_couchdb_plugin). -export([my_func/0]). my_func() -> ok. It doesn’t do much, but you get your first module going. Let’s try to compile it. `my_first_couchdb_plugin` comes with a `Makefile` that helps you with common tasks. To compile your code, simply run: make The output should be something like this: rebar compile ==> my_first_couchdb_plugin (compile) Compiled src/my_first_couchdb_plugin.erl The compiled results are stored in a directory called `ebin/`. Poke around in there if you are interested on how this all looks. To run CouchDB with your new plugin make sure CouchDB isn’t already running elsewhere and then do this: make dev The output should look something like this: Erlang R15B03 (erts-5.9.3.1) [source] [64-bit] [smp:4:4] [async-threads:4] [hipe] [kernel-poll:true] [dtrace] Eshell V5.9.3.1 (abort with ^G) 1> Apache CouchDB 1.3.0 (LogLevel=info) is starting. Apache CouchDB has started. Time to relax. [info] [<0.36.0>] Apache CouchDB has started on http://127.0.0.1:5984/ That means, CouchDB is now running normally, in the foreground as opposed to in the background like you would normally, so you get status and error messages in the terminal. And one more thing, this drops you into an interactive Erlang shell that runs inside your CouchDB instance. To see it, just hit enter and you will get: 1> This is the Erlang command prompt and you can enter arbitrary commands. To call our module function, type this: my_first_couchdb_plugin:my_func(). And then enter. The full stop at the end is essential. The output should look like this: 1> my_first_couchdb_plugin:my_func(). ok 2> `ok` is the return value of your function, if you remember the code of `my_first_couchdb_plugin,erl`, you see `ok` is the last statement before the final full stop in the function definition of `my_func()` and thus, it is the return value of that function and we see it in the command prompt. Then the command prompt waits for your next line of input with `2>` (the number increases with each entered command). To get out of the command prompt and to stop CouchDB, just hit `ctrl-c` twice. Note: from now on you can just type `make dev`, it will run `make` for you internally and compile all changes you may have made in the meantime. * * * That is all that is needed to get started building a CouchDB plugin. The rest of this guide will explain how to hook into the various parts of CouchDB that allow you to do all sorts of fun things. That means you can write different types of plugins, ones that handle HTTP requests, others that operate on database changes, and yet others that provide a daemon that does useful things for us. * * * ## Publishing a Plugin Publishing a plugin is both simple and not so simple. The mechanics are trivial, just type: make plugin and you will see something like this: > make plugin rebar compile ==> my_first_couchdb_plugin (compile) my_first_couchdb_plugin-1.0.0-R15B03-1.4.0.tar.gz: 1/MeXYfxeBK7DQyk10/6ucIRusc= That’s the easy part. The hard part is publishing the plugin. And since this is subject to change a lot in the near future, we will punt on explaining this in detail here, but to see how it works, look into this file in the CouchDB source distribution: `share/www/plugins.html` * * * ## Creating an HTTP Handler Our module above is not very useful on its own. You can call it when you are in the Erlang command prompt for your local CouchDB, but CouchDB itself doesn’t know what to do with it and you can’t do anything with it from CouchDB’s HTTP API. Let’s fix that! CouchDB’s main API is HTTP and thus we can expect to have a lot of infrastructure to work with. Luckily, it is mostly straightforward to get into and we don’t need to learn a whole lot before can get started, and learn more as we go along. Before we get going, let’s create another file that handles all our HTTP handler code. Create `src/my_first_couchdb_plugin_httpd.erl` and put in the following contents: -module(my_first_couchdb_plugin_httpd). -export([handle_req/1]). -include_lib("couch/include/couch_db.hrl"). handle_req(#httpd{method='GET'}=Req) -> couch_httpd:send_json(Req, {[{<<"hello">>, <<"world">>}]}); handle_req(Req) -> couch_httpd:send_method_not_allowed(Req, "GET"). Let’s go through this line by line: 1. We define the module name, nothing to see here, move along. 3. We export the function `handle_req`, e.g. we make it available to other modules. 5. We include the standard CouchDB header. That gives us access to the internal data structures. 7. We define the function `handle_req`. In particular, we define a clause of that function in a way that it gets invoked whenever CouchDB receives an HTTP `GET` request. It takes one argument, `Req` and it it includes all HTTP request information. `Req` is an instance of the record type `#httpd{}` that we will learn a lot more about in the future. 8. We return a bit of JSON, the Erlang, or ejson, equivalent of `{"hello":"world"}`. 9. We define the final, or default clause for the `handle_req` function. This is a default for all `handle_req` functions and handles the case when an API endpoint was called with an unsupported HTTP method, or path or other request parameters. In our case it will say that our `handle_req` only ever will handle `GET` requests and if it ever sees anything else, a standard ā€œmethod not allowedā€ response will be generated for us. ### Registering an HTTP Handler Now we have a function that can handle HTTP requests, but we haven’t told CouchDB yet, for what API endpoint this should be called. To do this, we need to take a little detour into the CouchDB configuration system, as CouchDB’s HTTP routing is fully dynamic and configurable at runtime. To get an idea, open this file in CouchDB source directory: `etc/couchdb/default.ini.tpl.in`, don’t mind the triple file extensions, this is essentially an `.ini` file. Now scroll down to the section `[httpd_global_handlers]`. You will find a list of API endpoints with mapping to the code in CouchDB that handles it. for example: _utils = {couch_httpd_misc_handlers, handle_utils_dir_req, "%localdatadir%/www"} This means that `/_utils` is handled by the erlang module `couch_httpd_misc_handlers` and its function `handle_utils_dir_req` and it takes one additional argument that is the document root for Futon. Another example: _all_dbs = {couch_httpd_misc_handlers, handle_all_dbs_req} This means that `/_all_dbs`, the API endpoint that allows you to list all databases in CouchDB is handled by, again, `couch_httpd_misc_handlers` but this time its function `handle_all_dbs_req`, which does not take an additional argument. Say we want to make our `handle_req` function answer under the endpoint `/_my_plugin` (you want to start with an underscore here, as CouchDB will consider all other characters as real database names), we would add something like this: _my_plugin = {my_first_couchdb_plugin, handle_req} But don’t add that to `etc/couchdb/default.ini.tpl.in`! Instead, craete a new `.ini` file in your plugin at `priv/default.d/my_first_couchdb_plugin.ini` with these contents: [httpd_global_handlers] _my_plugin = {my_first_couchdb_plugin_httpd, handle_req} Don’t miss the new line at the end. Now run `make dev` again, and then open a second terminal: curl http://127.0.0.1:5984/_my_plugin {"hello":"world"} It worked, yay! When we do a `POST` request, that should fail: curl -X POST http://127.0.0.1:5984/_my_plugin TODO: - show that POST fails as expected - exploring #httpd{} and how to react to different kinds of HTTP requests - hook up `handle_req` with `my_func` ... * * * ## Creating a Daemon TBD TODO: - add ā€œwhat can go wrong at this stepā€ apache-couchdb-1.6.0/src/my-first-couchdb-plugin/.gitignore0000644000175000001440000000000512332105522023543 0ustar00djcusers00000000000000ebin apache-couchdb-1.6.0/src/ibrowse/0000755000175000001440000000000012332105603016557 5ustar00djcusers00000000000000apache-couchdb-1.6.0/src/ibrowse/ibrowse_lib.erl0000644000175000001440000003662712332105522021601 0ustar00djcusers00000000000000%%% File : ibrowse_lib.erl %%% Author : Chandrashekhar Mullaparthi %%% Description : %%% Created : 27 Feb 2004 by Chandrashekhar Mullaparthi %% @doc Module with a few useful functions -module(ibrowse_lib). -author('chandru'). -ifdef(debug). -compile(export_all). -endif. -include("ibrowse.hrl"). -ifdef(EUNIT). -include_lib("eunit/include/eunit.hrl"). -endif. -export([ get_trace_status/2, do_trace/2, do_trace/3, url_encode/1, decode_rfc822_date/1, status_code/1, encode_base64/1, decode_base64/1, get_value/2, get_value/3, parse_url/1, printable_date/0 ]). get_trace_status(Host, Port) -> ibrowse:get_config_value({trace, Host, Port}, false). %% @doc URL-encodes a string based on RFC 1738. Returns a flat list. %% @spec url_encode(Str) -> UrlEncodedStr %% Str = string() %% UrlEncodedStr = string() url_encode(Str) when is_list(Str) -> url_encode_char(lists:reverse(Str), []). url_encode_char([X | T], Acc) when X >= $0, X =< $9 -> url_encode_char(T, [X | Acc]); url_encode_char([X | T], Acc) when X >= $a, X =< $z -> url_encode_char(T, [X | Acc]); url_encode_char([X | T], Acc) when X >= $A, X =< $Z -> url_encode_char(T, [X | Acc]); url_encode_char([X | T], Acc) when X == $-; X == $_; X == $. -> url_encode_char(T, [X | Acc]); url_encode_char([32 | T], Acc) -> url_encode_char(T, [$+ | Acc]); url_encode_char([X | T], Acc) -> url_encode_char(T, [$%, d2h(X bsr 4), d2h(X band 16#0f) | Acc]); url_encode_char([], Acc) -> Acc. d2h(N) when N<10 -> N+$0; d2h(N) -> N+$a-10. decode_rfc822_date(String) when is_list(String) -> case catch decode_rfc822_date_1(string:tokens(String, ", \t\r\n")) of {'EXIT', _} -> {error, invalid_date}; Res -> Res end. % TODO: Have to handle the Zone decode_rfc822_date_1([_,DayInt,Month,Year, Time,Zone]) -> decode_rfc822_date_1([DayInt,Month,Year, Time,Zone]); decode_rfc822_date_1([Day,Month,Year, Time,_Zone]) -> DayI = list_to_integer(Day), MonthI = month_int(Month), YearI = list_to_integer(Year), TimeTup = case string:tokens(Time, ":") of [H,M] -> {list_to_integer(H), list_to_integer(M), 0}; [H,M,S] -> {list_to_integer(H), list_to_integer(M), list_to_integer(S)} end, {{YearI,MonthI,DayI}, TimeTup}. month_int("Jan") -> 1; month_int("Feb") -> 2; month_int("Mar") -> 3; month_int("Apr") -> 4; month_int("May") -> 5; month_int("Jun") -> 6; month_int("Jul") -> 7; month_int("Aug") -> 8; month_int("Sep") -> 9; month_int("Oct") -> 10; month_int("Nov") -> 11; month_int("Dec") -> 12. %% @doc Given a status code, returns an atom describing the status code. %% @spec status_code(StatusCode::status_code()) -> StatusDescription %% status_code() = string() | integer() %% StatusDescription = atom() status_code(100) -> continue; status_code(101) -> switching_protocols; status_code(102) -> processing; status_code(200) -> ok; status_code(201) -> created; status_code(202) -> accepted; status_code(203) -> non_authoritative_information; status_code(204) -> no_content; status_code(205) -> reset_content; status_code(206) -> partial_content; status_code(207) -> multi_status; status_code(300) -> multiple_choices; status_code(301) -> moved_permanently; status_code(302) -> found; status_code(303) -> see_other; status_code(304) -> not_modified; status_code(305) -> use_proxy; status_code(306) -> unused; status_code(307) -> temporary_redirect; status_code(400) -> bad_request; status_code(401) -> unauthorized; status_code(402) -> payment_required; status_code(403) -> forbidden; status_code(404) -> not_found; status_code(405) -> method_not_allowed; status_code(406) -> not_acceptable; status_code(407) -> proxy_authentication_required; status_code(408) -> request_timeout; status_code(409) -> conflict; status_code(410) -> gone; status_code(411) -> length_required; status_code(412) -> precondition_failed; status_code(413) -> request_entity_too_large; status_code(414) -> request_uri_too_long; status_code(415) -> unsupported_media_type; status_code(416) -> requested_range_not_satisfiable; status_code(417) -> expectation_failed; status_code(422) -> unprocessable_entity; status_code(423) -> locked; status_code(424) -> failed_dependency; status_code(500) -> internal_server_error; status_code(501) -> not_implemented; status_code(502) -> bad_gateway; status_code(503) -> service_unavailable; status_code(504) -> gateway_timeout; status_code(505) -> http_version_not_supported; status_code(507) -> insufficient_storage; status_code(X) when is_list(X) -> status_code(list_to_integer(X)); status_code(_) -> unknown_status_code. %% @doc Implements the base64 encoding algorithm. The output data type matches in the input data type. %% @spec encode_base64(In) -> Out %% In = string() | binary() %% Out = string() | binary() encode_base64(List) when is_list(List) -> binary_to_list(base64:encode(List)); encode_base64(Bin) when is_binary(Bin) -> base64:encode(Bin). %% @doc Implements the base64 decoding algorithm. The output data type matches in the input data type. %% @spec decode_base64(In) -> Out | exit({error, invalid_input}) %% In = string() | binary() %% Out = string() | binary() decode_base64(List) when is_list(List) -> binary_to_list(base64:decode(List)); decode_base64(Bin) when is_binary(Bin) -> base64:decode(Bin). get_value(Tag, TVL, DefVal) -> case lists:keysearch(Tag, 1, TVL) of false -> DefVal; {value, {_, Val}} -> Val end. get_value(Tag, TVL) -> {value, {_, V}} = lists:keysearch(Tag,1,TVL), V. parse_url(Url) -> try case parse_url(Url, get_protocol, #url{abspath=Url}, []) of #url{host_type = undefined, host = Host} = UrlRec -> case inet_parse:address(Host) of {ok, {_, _, _, _, _, _, _, _}} -> UrlRec#url{host_type = ipv6_address}; {ok, {_, _, _, _}} -> UrlRec#url{host_type = ipv4_address}; _ -> UrlRec#url{host_type = hostname} end; #url{} = UrlRec -> UrlRec; _ -> {error, invalid_uri} end catch _:_ -> {error, invalid_uri} end. parse_url([$:, $/, $/ | _], get_protocol, Url, []) -> {invalid_uri_1, Url}; parse_url([$:, $/, $/ | T], get_protocol, Url, TmpAcc) -> Prot = list_to_existing_atom(lists:reverse(TmpAcc)), parse_url(T, get_username, Url#url{protocol = Prot}, []); parse_url([H | T], get_username, Url, TmpAcc) when H == $/; H == $? -> Path = case H of $/ -> [$/ | T]; $? -> [$/, $? | T] end, %% No username/password. No port number Url#url{host = lists:reverse(TmpAcc), port = default_port(Url#url.protocol), path = Path}; parse_url([$: | T], get_username, Url, TmpAcc) -> %% It is possible that no username/password has been %% specified. But we'll continue with the assumption that there is %% a username/password. If we encounter a '@' later on, there is a %% username/password indeed. If we encounter a '/', it was %% actually the hostname parse_url(T, get_password, Url#url{username = lists:reverse(TmpAcc)}, []); parse_url([$@ | T], get_username, Url, TmpAcc) -> parse_url(T, get_host, Url#url{username = lists:reverse(TmpAcc), password = ""}, []); parse_url([$[ | T], get_username, Url, []) -> % IPv6 address literals are enclosed by square brackets: % http://www.ietf.org/rfc/rfc2732.txt parse_url(T, get_ipv6_address, Url#url{host_type = ipv6_address}, []); parse_url([$[ | T], get_username, _Url, TmpAcc) -> {error, {invalid_username_or_host, lists:reverse(TmpAcc) ++ "[" ++ T}}; parse_url([$[ | _], get_password, _Url, []) -> {error, missing_password}; parse_url([$[ | T], get_password, Url, TmpAcc) -> % IPv6 address literals are enclosed by square brackets: % http://www.ietf.org/rfc/rfc2732.txt parse_url(T, get_ipv6_address, Url#url{host_type = ipv6_address, password = lists:reverse(TmpAcc)}, []); parse_url([$@ | T], get_password, Url, TmpAcc) -> parse_url(T, get_host, Url#url{password = lists:reverse(TmpAcc)}, []); parse_url([H | T], get_password, Url, TmpAcc) when H == $/; H == $? -> %% Ok, what we thought was the username/password was the hostname %% and portnumber #url{username=User} = Url, Port = list_to_integer(lists:reverse(TmpAcc)), Path = case H of $/ -> [$/ | T]; $? -> [$/, $? | T] end, Url#url{host = User, port = Port, username = undefined, password = undefined, path = Path}; parse_url([$] | T], get_ipv6_address, #url{protocol = Prot} = Url, TmpAcc) -> Addr = lists:reverse(TmpAcc), case inet_parse:address(Addr) of {ok, {_, _, _, _, _, _, _, _}} -> Url2 = Url#url{host = Addr, port = default_port(Prot)}, case T of [$: | T2] -> parse_url(T2, get_port, Url2, []); [$/ | T2] -> Url2#url{path = [$/ | T2]}; [$? | T2] -> Url2#url{path = [$/, $? | T2]}; [] -> Url2#url{path = "/"}; _ -> {error, {invalid_host, "[" ++ Addr ++ "]" ++ T}} end; _ -> {error, {invalid_ipv6_address, Addr}} end; parse_url([$[ | T], get_host, #url{} = Url, []) -> parse_url(T, get_ipv6_address, Url#url{host_type = ipv6_address}, []); parse_url([$: | T], get_host, #url{} = Url, TmpAcc) -> parse_url(T, get_port, Url#url{host = lists:reverse(TmpAcc)}, []); parse_url([H | T], get_host, #url{protocol=Prot} = Url, TmpAcc) when H == $/; H == $? -> Path = case H of $/ -> [$/ | T]; $? -> [$/, $? | T] end, Url#url{host = lists:reverse(TmpAcc), port = default_port(Prot), path = Path}; parse_url([H | T], get_port, #url{protocol=Prot} = Url, TmpAcc) when H == $/; H == $? -> Path = case H of $/ -> [$/ | T]; $? -> [$/, $? | T] end, Port = case TmpAcc of [] -> default_port(Prot); _ -> list_to_integer(lists:reverse(TmpAcc)) end, Url#url{port = Port, path = Path}; parse_url([H | T], State, Url, TmpAcc) -> parse_url(T, State, Url, [H | TmpAcc]); parse_url([], get_host, Url, TmpAcc) when TmpAcc /= [] -> Url#url{host = lists:reverse(TmpAcc), port = default_port(Url#url.protocol), path = "/"}; parse_url([], get_username, Url, TmpAcc) when TmpAcc /= [] -> Url#url{host = lists:reverse(TmpAcc), port = default_port(Url#url.protocol), path = "/"}; parse_url([], get_port, #url{protocol=Prot} = Url, TmpAcc) -> Port = case TmpAcc of [] -> default_port(Prot); _ -> list_to_integer(lists:reverse(TmpAcc)) end, Url#url{port = Port, path = "/"}; parse_url([], get_password, Url, TmpAcc) -> %% Ok, what we thought was the username/password was the hostname %% and portnumber #url{username=User} = Url, Port = case TmpAcc of [] -> default_port(Url#url.protocol); _ -> list_to_integer(lists:reverse(TmpAcc)) end, Url#url{host = User, port = Port, username = undefined, password = undefined, path = "/"}; parse_url([], State, Url, TmpAcc) -> {invalid_uri_2, State, Url, TmpAcc}. default_port(socks5) -> 1080; default_port(http) -> 80; default_port(https) -> 443; default_port(ftp) -> 21. printable_date() -> {{Y,Mo,D},{H, M, S}} = calendar:local_time(), {_,_,MicroSecs} = now(), [integer_to_list(Y), $-, integer_to_list(Mo), $-, integer_to_list(D), $_, integer_to_list(H), $:, integer_to_list(M), $:, integer_to_list(S), $:, integer_to_list(MicroSecs div 1000)]. do_trace(Fmt, Args) -> do_trace(get(my_trace_flag), Fmt, Args). -ifdef(DEBUG). do_trace(_, Fmt, Args) -> io:format("~s -- (~s) - "++Fmt, [printable_date(), get(ibrowse_trace_token) | Args]). -else. do_trace(true, Fmt, Args) -> io:format("~s -- (~s) - "++Fmt, [printable_date(), get(ibrowse_trace_token) | Args]); do_trace(_, _, _) -> ok. -endif. -ifdef(EUNIT). parse_url_test() -> Urls = [{"http://[FEDC:BA98:7654:3210:FEDC:BA98:7654:3210]:80/index.html", #url{abspath = "http://[FEDC:BA98:7654:3210:FEDC:BA98:7654:3210]:80/index.html", host = "FEDC:BA98:7654:3210:FEDC:BA98:7654:3210", port = 80, protocol = http, path = "/index.html", host_type = ipv6_address}}, {"http://[1080:0:0:0:8:800:200C:417A]/index.html", #url{abspath = "http://[1080:0:0:0:8:800:200C:417A]/index.html", host_type = ipv6_address, port = 80, protocol = http, host = "1080:0:0:0:8:800:200C:417A", path = "/index.html"}}, {"http://[3ffe:2a00:100:7031::1]", #url{abspath = "http://[3ffe:2a00:100:7031::1]", host_type = ipv6_address, port = 80, protocol = http, host = "3ffe:2a00:100:7031::1", path = "/"}}, {"http://[1080::8:800:200C:417A]/foo", #url{abspath = "http://[1080::8:800:200C:417A]/foo", host_type = ipv6_address, port = 80, protocol = http, host = "1080::8:800:200C:417A", path = "/foo"}}, {"http://[::192.9.5.5]/ipng", #url{abspath = "http://[::192.9.5.5]/ipng", host_type = ipv6_address, port = 80, protocol = http, host = "::192.9.5.5", path = "/ipng"}}, {"http://[::FFFF:129.144.52.38]:80/index.html", #url{abspath = "http://[::FFFF:129.144.52.38]:80/index.html", host_type = ipv6_address, port = 80, protocol = http, host = "::FFFF:129.144.52.38", path = "/index.html"}}, {"http://[2010:836B:4179::836B:4179]", #url{abspath = "http://[2010:836B:4179::836B:4179]", host_type = ipv6_address, port = 80, protocol = http, host = "2010:836B:4179::836B:4179", path = "/"}} ], lists:foreach( fun({Url, Expected_result}) -> ?assertMatch(Expected_result, parse_url(Url)) end, Urls). -endif. apache-couchdb-1.6.0/src/ibrowse/ibrowse_http_client.erl0000644000175000001440000023634012332105522023342 0ustar00djcusers00000000000000%%%------------------------------------------------------------------- %%% File : ibrowse_http_client.erl %%% Author : Chandrashekhar Mullaparthi %%% Description : The name says it all %%% %%% Created : 11 Oct 2003 by Chandrashekhar Mullaparthi %%%------------------------------------------------------------------- -module(ibrowse_http_client). -behaviour(gen_server). %%-------------------------------------------------------------------- %% Include files %%-------------------------------------------------------------------- %%-------------------------------------------------------------------- %% External exports -export([ start_link/1, start/1, stop/1, send_req/7 ]). -ifdef(debug). -compile(export_all). -endif. %% gen_server callbacks -export([ init/1, handle_call/3, handle_cast/2, handle_info/2, terminate/2, code_change/3 ]). -include("ibrowse.hrl"). -include_lib("kernel/include/inet.hrl"). -record(state, {host, port, connect_timeout, inactivity_timer_ref, use_http_proxy = false, http_proxy_auth_digest, socks5_host, socks5_port, socks5_user, socks5_password, ssl_options = [], is_ssl = false, socket, proxy_tunnel_setup = false, tunnel_setup_queue = [], reqs=queue:new(), cur_req, status=idle, http_status_code, reply_buffer = <<>>, rep_buf_size=0, streamed_size = 0, recvd_headers=[], status_line, raw_headers, is_closing, content_length, deleted_crlf = false, transfer_encoding, chunk_size, chunk_size_buffer = <<>>, recvd_chunk_size, interim_reply_sent = false, lb_ets_tid, cur_pipeline_size = 0, prev_req_id }). -record(request, {url, method, options, from, stream_to, caller_controls_socket = false, caller_socket_options = [], req_id, stream_chunk_size, save_response_to_file = false, tmp_file_name, tmp_file_fd, preserve_chunked_encoding, response_format, timer_ref}). -import(ibrowse_lib, [ get_value/2, get_value/3, do_trace/2 ]). -define(DEFAULT_STREAM_CHUNK_SIZE, 1024*1024). -define(dec2hex(X), erlang:integer_to_list(X, 16)). %%==================================================================== %% External functions %%==================================================================== %%-------------------------------------------------------------------- %% Function: start_link/0 %% Description: Starts the server %%-------------------------------------------------------------------- start(Args) -> gen_server:start(?MODULE, Args, []). start_link(Args) -> gen_server:start_link(?MODULE, Args, []). stop(Conn_pid) -> case catch gen_server:call(Conn_pid, stop) of {'EXIT', {timeout, _}} -> exit(Conn_pid, kill), ok; _ -> ok end. send_req(Conn_Pid, Url, Headers, Method, Body, Options, Timeout) -> gen_server:call( Conn_Pid, {send_req, {Url, Headers, Method, Body, Options, Timeout}}, Timeout). %%==================================================================== %% Server functions %%==================================================================== %%-------------------------------------------------------------------- %% Function: init/1 %% Description: Initiates the server %% Returns: {ok, State} | %% {ok, State, Timeout} | %% ignore | %% {stop, Reason} %%-------------------------------------------------------------------- init({Lb_Tid, #url{host = Host, port = Port}, {SSLOptions, Is_ssl}}) -> State = #state{host = Host, port = Port, ssl_options = SSLOptions, is_ssl = Is_ssl, lb_ets_tid = Lb_Tid}, put(ibrowse_trace_token, [Host, $:, integer_to_list(Port)]), put(my_trace_flag, ibrowse_lib:get_trace_status(Host, Port)), {ok, set_inac_timer(State)}; init(Url) when is_list(Url) -> case catch ibrowse_lib:parse_url(Url) of #url{protocol = Protocol} = Url_rec -> init({undefined, Url_rec, {[], Protocol == https}}); {'EXIT', _} -> {error, invalid_url} end; init({Host, Port}) -> State = #state{host = Host, port = Port}, put(ibrowse_trace_token, [Host, $:, integer_to_list(Port)]), put(my_trace_flag, ibrowse_lib:get_trace_status(Host, Port)), {ok, set_inac_timer(State)}. %%-------------------------------------------------------------------- %% Function: handle_call/3 %% Description: Handling call messages %% Returns: {reply, Reply, State} | %% {reply, Reply, State, Timeout} | %% {noreply, State} | %% {noreply, State, Timeout} | %% {stop, Reason, Reply, State} | (terminate/2 is called) %% {stop, Reason, State} (terminate/2 is called) %%-------------------------------------------------------------------- %% Received a request when the remote server has already sent us a %% Connection: Close header handle_call({send_req, _}, _From, #state{is_closing = true} = State) -> {reply, {error, connection_closing}, State}; handle_call({send_req, {Url, Headers, Method, Body, Options, Timeout}}, From, State) -> send_req_1(From, Url, Headers, Method, Body, Options, Timeout, State); handle_call(stop, _From, State) -> do_close(State), do_error_reply(State, closing_on_request), {stop, normal, ok, State}; handle_call(Request, _From, State) -> Reply = {unknown_request, Request}, {reply, Reply, State}. %%-------------------------------------------------------------------- %% Function: handle_cast/2 %% Description: Handling cast messages %% Returns: {noreply, State} | %% {noreply, State, Timeout} | %% {stop, Reason, State} (terminate/2 is called) %%-------------------------------------------------------------------- handle_cast(_Msg, State) -> {noreply, State}. %%-------------------------------------------------------------------- %% Function: handle_info/2 %% Description: Handling all non call/cast messages %% Returns: {noreply, State} | %% {noreply, State, Timeout} | %% {stop, Reason, State} (terminate/2 is called) %%-------------------------------------------------------------------- handle_info({tcp, _Sock, Data}, #state{status = Status} = State) -> do_trace("Data recvd in state: ~p. Size: ~p. ~p~n~n", [Status, size(Data), Data]), handle_sock_data(Data, State); handle_info({ssl, _Sock, Data}, State) -> handle_sock_data(Data, State); handle_info({stream_next, Req_id}, #state{socket = Socket, cur_req = #request{req_id = Req_id}} = State) -> do_setopts(Socket, [{active, once}], State), {noreply, set_inac_timer(State)}; handle_info({stream_next, _Req_id}, State) -> _Cur_req_id = case State#state.cur_req of #request{req_id = Cur} -> Cur; _ -> undefined end, {noreply, State}; handle_info({stream_close, _Req_id}, State) -> shutting_down(State), do_close(State), do_error_reply(State, closing_on_request), {stop, normal, State}; handle_info({tcp_closed, _Sock}, State) -> do_trace("TCP connection closed by peer!~n", []), handle_sock_closed(State), {stop, normal, State}; handle_info({ssl_closed, _Sock}, State) -> do_trace("SSL connection closed by peer!~n", []), handle_sock_closed(State), {stop, normal, State}; handle_info({tcp_error, _Sock, Reason}, State) -> do_trace("Error on connection to ~1000.p:~1000.p -> ~1000.p~n", [State#state.host, State#state.port, Reason]), handle_sock_closed(State), {stop, normal, State}; handle_info({ssl_error, _Sock, Reason}, State) -> do_trace("Error on SSL connection to ~1000.p:~1000.p -> ~1000.p~n", [State#state.host, State#state.port, Reason]), handle_sock_closed(State), {stop, normal, State}; handle_info({req_timedout, From}, State) -> case lists:keymember(From, #request.from, queue:to_list(State#state.reqs)) of false -> {noreply, State}; true -> shutting_down(State), %% do_error_reply(State, req_timedout), {stop, normal, State} end; handle_info(timeout, State) -> do_trace("Inactivity timeout triggered. Shutting down connection~n", []), shutting_down(State), do_error_reply(State, req_timedout), {stop, normal, State}; handle_info({trace, Bool}, State) -> put(my_trace_flag, Bool), {noreply, State}; handle_info(Info, State) -> io:format("Unknown message recvd for ~1000.p:~1000.p -> ~p~n", [State#state.host, State#state.port, Info]), io:format("Recvd unknown message ~p when in state: ~p~n", [Info, State]), {noreply, State}. %%-------------------------------------------------------------------- %% Function: terminate/2 %% Description: Shutdown the server %% Returns: any (ignored by gen_server) %%-------------------------------------------------------------------- terminate(_Reason, State) -> do_close(State), ok. %%-------------------------------------------------------------------- %% Func: code_change/3 %% Purpose: Convert process state when code is changed %% Returns: {ok, NewState} %%-------------------------------------------------------------------- code_change(_OldVsn, State, _Extra) -> {ok, State}. %%-------------------------------------------------------------------- %%% Internal functions %%-------------------------------------------------------------------- %%-------------------------------------------------------------------- %% Handles data recvd on the socket %%-------------------------------------------------------------------- handle_sock_data(Data, #state{status=idle}=State) -> do_trace("Data recvd on socket in state idle!. ~1000.p~n", [Data]), shutting_down(State), do_error_reply(State, data_in_status_idle), do_close(State), {stop, normal, State}; handle_sock_data(Data, #state{status = get_header}=State) -> case parse_response(Data, State) of {error, _Reason} -> shutting_down(State), {stop, normal, State}; #state{socket = Socket, status = Status, cur_req = CurReq} = State_1 -> case {Status, CurReq} of {get_header, #request{caller_controls_socket = true}} -> do_setopts(Socket, [{active, once}], State_1); _ -> active_once(State_1) end, {noreply, set_inac_timer(State_1)} end; handle_sock_data(Data, #state{status = get_body, socket = Socket, content_length = CL, http_status_code = StatCode, recvd_headers = Headers, chunk_size = CSz} = State) -> case (CL == undefined) and (CSz == undefined) of true -> case accumulate_response(Data, State) of {error, Reason} -> shutting_down(State), fail_pipelined_requests(State, {error, {Reason, {stat_code, StatCode}, Headers}}), {stop, normal, State}; State_1 -> active_once(State_1), State_2 = set_inac_timer(State_1), {noreply, State_2} end; _ -> case parse_11_response(Data, State) of {error, Reason} -> shutting_down(State), fail_pipelined_requests(State, {error, {Reason, {stat_code, StatCode}, Headers}}), {stop, normal, State}; #state{cur_req = #request{caller_controls_socket = Ccs}, interim_reply_sent = Irs} = State_1 -> case Irs of true -> active_once(State_1); false when Ccs == true -> do_setopts(Socket, [{active, once}], State); false -> active_once(State_1) end, State_2 = State_1#state{interim_reply_sent = false}, case Ccs of true -> cancel_timer(State_2#state.inactivity_timer_ref, {eat_message, timeout}), {noreply, State_2#state{inactivity_timer_ref = undefined}}; _ -> {noreply, set_inac_timer(State_2)} end; State_1 -> active_once(State_1), State_2 = set_inac_timer(State_1), {noreply, State_2} end end. accumulate_response(Data, #state{ cur_req = #request{save_response_to_file = Srtf, tmp_file_fd = undefined} = CurReq, http_status_code=[$2 | _]}=State) when Srtf /= false -> TmpFilename = make_tmp_filename(Srtf), Mode = file_mode(Srtf), case file:open(TmpFilename, [Mode, delayed_write, raw]) of {ok, Fd} -> accumulate_response(Data, State#state{ cur_req = CurReq#request{ tmp_file_fd = Fd, tmp_file_name = TmpFilename}}); {error, Reason} -> {error, {file_open_error, Reason}} end; accumulate_response(Data, #state{cur_req = #request{save_response_to_file = Srtf, tmp_file_fd = Fd}, transfer_encoding=chunked, reply_buffer = Reply_buf, http_status_code=[$2 | _] } = State) when Srtf /= false -> case file:write(Fd, [Reply_buf, Data]) of ok -> State#state{reply_buffer = <<>>}; {error, Reason} -> {error, {file_write_error, Reason}} end; accumulate_response(Data, #state{cur_req = #request{save_response_to_file = Srtf, tmp_file_fd = Fd}, reply_buffer = RepBuf, http_status_code=[$2 | _] } = State) when Srtf /= false -> case file:write(Fd, [RepBuf, Data]) of ok -> State#state{reply_buffer = <<>>}; {error, Reason} -> {error, {file_write_error, Reason}} end; accumulate_response(Data, #state{reply_buffer = RepBuf, rep_buf_size = RepBufSize, streamed_size = Streamed_size, cur_req = CurReq}=State) -> #request{stream_to = StreamTo, req_id = ReqId, stream_chunk_size = Stream_chunk_size, response_format = Response_format, caller_controls_socket = Caller_controls_socket} = CurReq, RepBuf_1 = <>, New_data_size = RepBufSize - Streamed_size, case StreamTo of undefined -> State#state{reply_buffer = RepBuf_1}; _ when Caller_controls_socket == true -> do_interim_reply(StreamTo, Response_format, ReqId, RepBuf_1), State#state{reply_buffer = <<>>, interim_reply_sent = true, streamed_size = Streamed_size + size(RepBuf_1)}; _ when New_data_size >= Stream_chunk_size -> {Stream_chunk, Rem_data} = split_binary(RepBuf_1, Stream_chunk_size), do_interim_reply(StreamTo, Response_format, ReqId, Stream_chunk), State_1 = State#state{ reply_buffer = <<>>, interim_reply_sent = true, streamed_size = Streamed_size + Stream_chunk_size}, case Rem_data of <<>> -> State_1; _ -> accumulate_response(Rem_data, State_1) end; _ -> State#state{reply_buffer = RepBuf_1} end. make_tmp_filename(true) -> DownloadDir = ibrowse:get_config_value(download_dir, filename:absname("./")), {A,B,C} = now(), filename:join([DownloadDir, "ibrowse_tmp_file_"++ integer_to_list(A) ++ integer_to_list(B) ++ integer_to_list(C)]); make_tmp_filename(File) when is_list(File) -> File; make_tmp_filename({append, File}) when is_list(File) -> File. file_mode({append, _File}) -> append; file_mode(_Srtf) -> write. %%-------------------------------------------------------------------- %% Handles the case when the server closes the socket %%-------------------------------------------------------------------- handle_sock_closed(#state{status=get_header} = State) -> shutting_down(State), do_error_reply(State, connection_closed); handle_sock_closed(#state{cur_req=undefined} = State) -> shutting_down(State); %% We check for IsClosing because this the server could have sent a %% Connection-Close header and has closed the socket to indicate end %% of response. There maybe requests pipelined which need a response. handle_sock_closed(#state{reply_buffer = Buf, reqs = Reqs, http_status_code = SC, is_closing = IsClosing, cur_req = #request{tmp_file_name=TmpFilename, tmp_file_fd=Fd} = CurReq, status = get_body, recvd_headers = Headers, status_line = Status_line, raw_headers = Raw_headers }=State) -> #request{from=From, stream_to=StreamTo, req_id=ReqId, response_format = Resp_format, options = Options} = CurReq, case IsClosing of true -> {_, Reqs_1} = queue:out(Reqs), Body = case TmpFilename of undefined -> Buf; _ -> ok = file:close(Fd), {file, TmpFilename} end, Reply = case get_value(give_raw_headers, Options, false) of true -> {ok, Status_line, Raw_headers, Body}; false -> {ok, SC, Headers, Buf} end, State_1 = do_reply(State, From, StreamTo, ReqId, Resp_format, Reply), ok = do_error_reply(State_1#state{reqs = Reqs_1}, connection_closed), State_1; _ -> ok = do_error_reply(State, connection_closed), State end. do_connect(Host, Port, Options, #state{socks5_host = SocksHost}=State, Timeout) when SocksHost /= undefined -> ProxyOptions = [ {user, State#state.socks5_user}, {password, State#state.socks5_password}, {host, SocksHost}, {port, State#state.socks5_port}, {is_ssl, State#state.is_ssl}, {ssl_opts, State#state.ssl_options}], ibrowse_socks5:connect(Host, Port, ProxyOptions, get_sock_options(SocksHost, Options, []), Timeout); do_connect(Host, Port, Options, #state{is_ssl = true, use_http_proxy = false, ssl_options = SSLOptions}, Timeout) -> ssl:connect(Host, Port, get_sock_options(Host, Options, SSLOptions), Timeout); do_connect(Host, Port, Options, _State, Timeout) -> gen_tcp:connect(Host, Port, get_sock_options(Host, Options, []), Timeout). get_sock_options(Host, Options, SSLOptions) -> Caller_socket_options = get_value(socket_options, Options, []), Ipv6Options = case is_ipv6_host(Host) of true -> [inet6]; false -> [] end, Other_sock_options = filter_sock_options(SSLOptions ++ Caller_socket_options ++ Ipv6Options), case lists:keysearch(nodelay, 1, Other_sock_options) of false -> [{nodelay, true}, binary, {active, false} | Other_sock_options]; {value, _} -> [binary, {active, false} | Other_sock_options] end. is_ipv6_host(Host) -> case inet_parse:address(Host) of {ok, {_, _, _, _, _, _, _, _}} -> true; {ok, {_, _, _, _}} -> false; _ -> case inet:gethostbyname(Host) of {ok, #hostent{h_addrtype = inet6}} -> true; _ -> false end end. %% We don't want the caller to specify certain options filter_sock_options(Opts) -> lists:filter(fun({active, _}) -> false; ({packet, _}) -> false; (list) -> false; (_) -> true end, Opts). do_send(Req, #state{socket = Sock, is_ssl = true, use_http_proxy = true, proxy_tunnel_setup = Pts}) when Pts /= done -> gen_tcp:send(Sock, Req); do_send(Req, #state{socket = Sock, is_ssl = true}) -> ssl:send(Sock, Req); do_send(Req, #state{socket = Sock, is_ssl = false}) -> gen_tcp:send(Sock, Req). %% @spec do_send_body(Sock::socket_descriptor(), Source::source_descriptor(), IsSSL::boolean()) -> ok | error() %% source_descriptor() = fun_arity_0 | %% {fun_arity_0} | %% {fun_arity_1, term()} %% error() = term() do_send_body(Source, State, TE) when is_function(Source) -> do_send_body({Source}, State, TE); do_send_body({Source}, State, TE) when is_function(Source) -> do_send_body1(Source, Source(), State, TE); do_send_body({Source, Source_state}, State, TE) when is_function(Source) -> do_send_body1(Source, Source(Source_state), State, TE); do_send_body(Body, State, _TE) -> do_send(Body, State). do_send_body1(Source, Resp, State, TE) -> case Resp of {ok, Data} when Data == []; Data == <<>> -> do_send_body({Source}, State, TE); {ok, Data} -> do_send(maybe_chunked_encode(Data, TE), State), do_send_body({Source}, State, TE); {ok, Data, New_source_state} when Data == []; Data == <<>> -> do_send_body({Source, New_source_state}, State, TE); {ok, Data, New_source_state} -> do_send(maybe_chunked_encode(Data, TE), State), do_send_body({Source, New_source_state}, State, TE); eof when TE == true -> do_send(<<"0\r\n\r\n">>, State), ok; eof -> ok; Err -> Err end. maybe_chunked_encode(Data, false) -> Data; maybe_chunked_encode(Data, true) -> [?dec2hex(iolist_size(Data)), "\r\n", Data, "\r\n"]. do_close(#state{socket = undefined}) -> ok; do_close(#state{socket = Sock, is_ssl = true, use_http_proxy = true, proxy_tunnel_setup = Pts }) when Pts /= done -> catch gen_tcp:close(Sock); do_close(#state{socket = Sock, is_ssl = true}) -> catch ssl:close(Sock); do_close(#state{socket = Sock, is_ssl = false}) -> catch gen_tcp:close(Sock). active_once(#state{cur_req = #request{caller_controls_socket = true}}) -> ok; active_once(#state{socket = Socket} = State) -> do_setopts(Socket, [{active, once}], State). do_setopts(_Sock, [], _) -> ok; do_setopts(Sock, Opts, #state{is_ssl = true, use_http_proxy = true, proxy_tunnel_setup = Pts} ) when Pts /= done -> inet:setopts(Sock, Opts); do_setopts(Sock, Opts, #state{is_ssl = true}) -> ssl:setopts(Sock, Opts); do_setopts(Sock, Opts, _) -> inet:setopts(Sock, Opts). check_ssl_options(Options, State) -> case get_value(is_ssl, Options, false) of false -> State; true -> State#state{is_ssl=true, ssl_options=get_value(ssl_options, Options)} end. send_req_1(From, #url{host = Host, port = Port} = Url, Headers, Method, Body, Options, Timeout, #state{socket = undefined} = State) -> ProxyHost = get_value(proxy_host, Options, false), ProxyProtocol = get_value(proxy_protocol, Options, http), {Host_1, Port_1, State_1} = case {ProxyHost, ProxyProtocol} of {false, _} -> {Host, Port, State}; {_, http} -> ProxyUser = get_value(proxy_user, Options, []), ProxyPassword = get_value(proxy_password, Options, []), Digest = http_auth_digest(ProxyUser, ProxyPassword), {ProxyHost, get_value(proxy_port, Options, 80), State#state{use_http_proxy = true, http_proxy_auth_digest = Digest}}; {_, socks5} -> ProxyUser = list_to_binary(get_value(proxy_user, Options, [])), ProxyPassword = list_to_binary(get_value(proxy_password, Options, [])), ProxyPort = get_value(proxy_port, Options, 1080), {Host, Port, State#state{socks5_host = ProxyHost, socks5_port = ProxyPort, socks5_user = ProxyUser, socks5_password = ProxyPassword}} end, State_2 = check_ssl_options(Options, State_1), do_trace("Connecting...~n", []), Conn_timeout = get_value(connect_timeout, Options, Timeout), case do_connect(Host_1, Port_1, Options, State_2, Conn_timeout) of {ok, Sock} -> do_trace("Connected! Socket: ~1000.p~n", [Sock]), State_3 = State_2#state{socket = Sock, connect_timeout = Conn_timeout}, send_req_1(From, Url, Headers, Method, Body, Options, Timeout, State_3); Err -> shutting_down(State_2), do_trace("Error connecting. Reason: ~1000.p~n", [Err]), gen_server:reply(From, {error, {conn_failed, Err}}), {stop, normal, State_2} end; %% Send a CONNECT request. %% Wait for 200 OK %% Upgrade to SSL connection %% Then send request send_req_1(From, #url{ host = Server_host, port = Server_port } = Url, Headers, Method, Body, Options, Timeout, #state{ proxy_tunnel_setup = false, use_http_proxy = true, is_ssl = true} = State) -> Ref = case Timeout of infinity -> undefined; _ -> erlang:send_after(Timeout, self(), {req_timedout, From}) end, NewReq = #request{ method = connect, preserve_chunked_encoding = get_value(preserve_chunked_encoding, Options, false), options = Options, timer_ref = Ref }, State_1 = State#state{reqs=queue:in(NewReq, State#state.reqs)}, Pxy_auth_headers = maybe_modify_headers(Url, Method, Options, [], State_1), Path = [Server_host, $:, integer_to_list(Server_port)], {Req, Body_1} = make_request(connect, Pxy_auth_headers, Path, Path, [], Options, State_1, undefined), TE = is_chunked_encoding_specified(Options), trace_request(Req), case do_send(Req, State) of ok -> case do_send_body(Body_1, State_1, TE) of ok -> trace_request_body(Body_1), active_once(State_1), State_1_1 = inc_pipeline_counter(State_1), State_2 = State_1_1#state{status = get_header, cur_req = NewReq, proxy_tunnel_setup = in_progress, tunnel_setup_queue = [{From, Url, Headers, Method, Body, Options, Timeout}]}, State_3 = set_inac_timer(State_2), {noreply, State_3}; Err -> shutting_down(State_1), do_trace("Send failed... Reason: ~p~n", [Err]), gen_server:reply(From, {error, {send_failed, Err}}), {stop, normal, State_1} end; Err -> shutting_down(State_1), do_trace("Send failed... Reason: ~p~n", [Err]), gen_server:reply(From, {error, {send_failed, Err}}), {stop, normal, State_1} end; send_req_1(From, Url, Headers, Method, Body, Options, Timeout, #state{proxy_tunnel_setup = in_progress, tunnel_setup_queue = Q} = State) -> do_trace("Queued SSL request awaiting tunnel setup: ~n" "URL : ~s~n" "Method : ~p~n" "Headers : ~p~n", [Url, Method, Headers]), {noreply, State#state{tunnel_setup_queue = [{From, Url, Headers, Method, Body, Options, Timeout} | Q]}}; send_req_1(From, #url{abspath = AbsPath, path = RelPath} = Url, Headers, Method, Body, Options, Timeout, #state{status = Status, socket = Socket} = State) -> cancel_timer(State#state.inactivity_timer_ref, {eat_message, timeout}), ReqId = make_req_id(), Resp_format = get_value(response_format, Options, list), Caller_socket_options = get_value(socket_options, Options, []), {StreamTo, Caller_controls_socket} = case get_value(stream_to, Options, undefined) of {Caller, once} when is_pid(Caller) or is_atom(Caller) -> Async_pid_rec = {{req_id_pid, ReqId}, self()}, true = ets:insert(ibrowse_stream, Async_pid_rec), {Caller, true}; undefined -> {undefined, false}; Caller when is_pid(Caller) or is_atom(Caller) -> {Caller, false}; Stream_to_inv -> exit({invalid_option, {stream_to, Stream_to_inv}}) end, SaveResponseToFile = get_value(save_response_to_file, Options, false), Ref = case Timeout of infinity -> undefined; _ -> erlang:send_after(Timeout, self(), {req_timedout, From}) end, NewReq = #request{url = Url, method = Method, stream_to = StreamTo, caller_controls_socket = Caller_controls_socket, caller_socket_options = Caller_socket_options, options = Options, req_id = ReqId, save_response_to_file = SaveResponseToFile, stream_chunk_size = get_stream_chunk_size(Options), response_format = Resp_format, from = From, preserve_chunked_encoding = get_value(preserve_chunked_encoding, Options, false), timer_ref = Ref }, State_1 = State#state{reqs=queue:in(NewReq, State#state.reqs)}, Headers_1 = maybe_modify_headers(Url, Method, Options, Headers, State_1), {Req, Body_1} = make_request(Method, Headers_1, AbsPath, RelPath, Body, Options, State_1, ReqId), trace_request(Req), do_setopts(Socket, Caller_socket_options, State_1), TE = is_chunked_encoding_specified(Options), case do_send(Req, State_1) of ok -> case do_send_body(Body_1, State_1, TE) of ok -> trace_request_body(Body_1), State_2 = inc_pipeline_counter(State_1), active_once(State_2), State_3 = case Status of idle -> State_2#state{status = get_header, cur_req = NewReq}; _ -> State_2 end, case StreamTo of undefined -> ok; _ -> gen_server:reply(From, {ibrowse_req_id, ReqId}) end, State_4 = set_inac_timer(State_3), {noreply, State_4}; Err -> shutting_down(State_1), do_trace("Send failed... Reason: ~p~n", [Err]), gen_server:reply(From, {error, {send_failed, Err}}), {stop, normal, State_1} end; Err -> shutting_down(State_1), do_trace("Send failed... Reason: ~p~n", [Err]), gen_server:reply(From, {error, {send_failed, Err}}), {stop, normal, State_1} end. maybe_modify_headers(#url{}, connect, _, Headers, State) -> add_proxy_auth_headers(State, Headers); maybe_modify_headers(#url{host = Host, port = Port} = Url, _Method, Options, Headers, State) -> case get_value(headers_as_is, Options, false) of false -> Headers_1 = add_auth_headers(Url, Options, Headers, State), HostHeaderValue = case lists:keysearch(host_header, 1, Options) of false -> case Port of 80 -> Host; 443 -> Host; _ -> [Host, ":", integer_to_list(Port)] end; {value, {_, Host_h_val}} -> Host_h_val end, [{"Host", HostHeaderValue} | Headers_1]; true -> Headers end. add_auth_headers(#url{username = User, password = UPw}, Options, Headers, State) -> Headers_1 = case User of undefined -> case get_value(basic_auth, Options, undefined) of undefined -> Headers; {U,P} -> [{"Authorization", ["Basic ", http_auth_digest(U, P)]} | Headers] end; _ -> [{"Authorization", ["Basic ", http_auth_digest(User, UPw)]} | Headers] end, add_proxy_auth_headers(State, Headers_1). add_proxy_auth_headers(#state{use_http_proxy = false}, Headers) -> Headers; add_proxy_auth_headers(#state{http_proxy_auth_digest = []}, Headers) -> Headers; add_proxy_auth_headers(#state{http_proxy_auth_digest = Auth_digest}, Headers) -> [{"Proxy-Authorization", ["Basic ", Auth_digest]} | Headers]. http_auth_digest([], []) -> []; http_auth_digest(Username, Password) -> ibrowse_lib:encode_base64(Username ++ [$: | Password]). make_request(Method, Headers, AbsPath, RelPath, Body, Options, #state{use_http_proxy = UseHttpProxy, is_ssl = Is_ssl}, ReqId) -> HttpVsn = http_vsn_string(get_value(http_vsn, Options, {1,1})), Fun1 = fun({X, Y}) when is_atom(X) -> {to_lower(atom_to_list(X)), X, Y}; ({X, Y}) when is_list(X) -> {to_lower(X), X, Y} end, Headers_0 = [Fun1(X) || X <- Headers], Headers_1 = case lists:keysearch("content-length", 1, Headers_0) of false when (Body =:= [] orelse Body =:= <<>>) andalso (Method =:= post orelse Method =:= put) -> [{"content-length", "Content-Length", "0"} | Headers_0]; false when is_binary(Body) orelse is_list(Body) -> [{"content-length", "Content-Length", integer_to_list(iolist_size(Body))} | Headers_0]; _ -> %% Content-Length is already specified or Body is a %% function or function/state pair Headers_0 end, {Headers_2, Body_1} = case is_chunked_encoding_specified(Options) of false -> {[{Y, Z} || {_, Y, Z} <- Headers_1], Body}; true -> Chunk_size_1 = case get_value(transfer_encoding, Options) of chunked -> 5120; {chunked, Chunk_size} -> Chunk_size end, {[{Y, Z} || {X, Y, Z} <- Headers_1, X /= "content-length"] ++ [{"Transfer-Encoding", "chunked"}], chunk_request_body(Body, Chunk_size_1)} end, Headers_3 = case lists:member({include_ibrowse_req_id, true}, Options) of true -> [{"x-ibrowse-request-id", io_lib:format("~1000.p",[ReqId])} | Headers_2]; false -> Headers_2 end, Headers_4 = cons_headers(Headers_3), Uri = case get_value(use_absolute_uri, Options, false) or UseHttpProxy of true -> case Is_ssl of true -> RelPath; false -> AbsPath end; false -> RelPath end, {[method(Method), " ", Uri, " ", HttpVsn, crnl(), Headers_4, crnl()], Body_1}. is_chunked_encoding_specified(Options) -> case get_value(transfer_encoding, Options, false) of false -> false; {chunked, _} -> true; chunked -> true end. http_vsn_string({0,9}) -> "HTTP/0.9"; http_vsn_string({1,0}) -> "HTTP/1.0"; http_vsn_string({1,1}) -> "HTTP/1.1". cons_headers(Headers) -> cons_headers(Headers, []). cons_headers([], Acc) -> encode_headers(Acc); cons_headers([{basic_auth, {U,P}} | T], Acc) -> cons_headers(T, [{"Authorization", ["Basic ", ibrowse_lib:encode_base64(U++":"++P)]} | Acc]); cons_headers([{cookie, Cookie} | T], Acc) -> cons_headers(T, [{"Cookie", Cookie} | Acc]); cons_headers([{content_length, L} | T], Acc) -> cons_headers(T, [{"Content-Length", L} | Acc]); cons_headers([{content_type, L} | T], Acc) -> cons_headers(T, [{"Content-Type", L} | Acc]); cons_headers([H | T], Acc) -> cons_headers(T, [H | Acc]). encode_headers(L) -> encode_headers(L, []). encode_headers([{http_vsn, _Val} | T], Acc) -> encode_headers(T, Acc); encode_headers([{Name,Val} | T], Acc) when is_list(Name) -> encode_headers(T, [[Name, ": ", fmt_val(Val), crnl()] | Acc]); encode_headers([{Name,Val} | T], Acc) when is_atom(Name) -> encode_headers(T, [[atom_to_list(Name), ": ", fmt_val(Val), crnl()] | Acc]); encode_headers([], Acc) -> lists:reverse(Acc). chunk_request_body(Body, _ChunkSize) when is_tuple(Body) orelse is_function(Body) -> Body; chunk_request_body(Body, ChunkSize) -> chunk_request_body(Body, ChunkSize, []). chunk_request_body(Body, _ChunkSize, Acc) when Body == <<>>; Body == [] -> LastChunk = "0\r\n", lists:reverse(["\r\n", LastChunk | Acc]); chunk_request_body(Body, ChunkSize, Acc) when is_binary(Body), size(Body) >= ChunkSize -> <> = Body, Chunk = [?dec2hex(ChunkSize),"\r\n", ChunkBody, "\r\n"], chunk_request_body(Rest, ChunkSize, [Chunk | Acc]); chunk_request_body(Body, _ChunkSize, Acc) when is_binary(Body) -> BodySize = size(Body), Chunk = [?dec2hex(BodySize),"\r\n", Body, "\r\n"], LastChunk = "0\r\n", lists:reverse(["\r\n", LastChunk, Chunk | Acc]); chunk_request_body(Body, ChunkSize, Acc) when length(Body) >= ChunkSize -> {ChunkBody, Rest} = split_list_at(Body, ChunkSize), Chunk = [?dec2hex(ChunkSize),"\r\n", ChunkBody, "\r\n"], chunk_request_body(Rest, ChunkSize, [Chunk | Acc]); chunk_request_body(Body, _ChunkSize, Acc) when is_list(Body) -> BodySize = length(Body), Chunk = [?dec2hex(BodySize),"\r\n", Body, "\r\n"], LastChunk = "0\r\n", lists:reverse(["\r\n", LastChunk, Chunk | Acc]). parse_response(<<>>, #state{cur_req = undefined}=State) -> State#state{status = idle}; parse_response(Data, #state{cur_req = undefined}) -> do_trace("Data left to process when no pending request. ~1000.p~n", [Data]), {error, data_in_status_idle}; parse_response(Data, #state{reply_buffer = Acc, reqs = Reqs, cur_req = CurReq} = State) -> #request{from=From, stream_to=StreamTo, req_id=ReqId, method=Method, response_format = Resp_format, options = Options, timer_ref = T_ref } = CurReq, MaxHeaderSize = ibrowse:get_config_value(max_headers_size, infinity), case scan_header(Acc, Data) of {yes, Headers, Data_1} -> do_trace("Recvd Header Data -> ~s~n----~n", [Headers]), do_trace("Recvd headers~n--- Headers Begin ---~n~s~n--- Headers End ---~n~n", [Headers]), {HttpVsn, StatCode, Headers_1, Status_line, Raw_headers} = parse_headers(Headers), do_trace("HttpVsn: ~p StatusCode: ~p Headers_1 -> ~1000.p~n", [HttpVsn, StatCode, Headers_1]), LCHeaders = [{to_lower(X), Y} || {X,Y} <- Headers_1], ConnClose = to_lower(get_value("connection", LCHeaders, "false")), IsClosing = is_connection_closing(HttpVsn, ConnClose), State_0 = case IsClosing of true -> shutting_down(State), State#state{is_closing = IsClosing}; false -> State end, Give_raw_headers = get_value(give_raw_headers, Options, false), State_1 = case Give_raw_headers of true -> State_0#state{recvd_headers=Headers_1, status=get_body, reply_buffer = <<>>, status_line = Status_line, raw_headers = Raw_headers, http_status_code=StatCode}; false -> State_0#state{recvd_headers=Headers_1, status=get_body, reply_buffer = <<>>, http_status_code=StatCode} end, put(conn_close, ConnClose), TransferEncoding = to_lower(get_value("transfer-encoding", LCHeaders, "false")), Head_response_with_body = lists:member({workaround, head_response_with_body}, Options), case get_value("content-length", LCHeaders, undefined) of _ when Method == connect, hd(StatCode) == $2 -> {_, Reqs_1} = queue:out(Reqs), cancel_timer(T_ref), upgrade_to_ssl(set_cur_request(State_0#state{reqs = Reqs_1, recvd_headers = [], status = idle })); _ when Method == connect -> {_, Reqs_1} = queue:out(Reqs), do_error_reply(State#state{reqs = Reqs_1}, {error, proxy_tunnel_failed}), {error, proxy_tunnel_failed}; _ when Method =:= head, Head_response_with_body =:= false -> %% This (HEAD response with body) is not supposed %% to happen, but it does. An Apache server was %% observed to send an "empty" body, but in a %% Chunked-Transfer-Encoding way, which meant %% there was still a body. Issue #67 on Github {_, Reqs_1} = queue:out(Reqs), send_async_headers(ReqId, StreamTo, Give_raw_headers, State_1), State_1_1 = do_reply(State_1, From, StreamTo, ReqId, Resp_format, {ok, StatCode, Headers_1, []}), cancel_timer(T_ref, {eat_message, {req_timedout, From}}), State_2 = reset_state(State_1_1), State_3 = set_cur_request(State_2#state{reqs = Reqs_1}), parse_response(Data_1, State_3); _ when hd(StatCode) =:= $1 -> %% No message body is expected. Server may send %% one or more 1XX responses before a proper %% response. send_async_headers(ReqId, StreamTo, Give_raw_headers, State_1), do_trace("Recvd a status code of ~p. Ignoring and waiting for a proper response~n", [StatCode]), parse_response(Data_1, State_1#state{recvd_headers = [], status = get_header}); _ when StatCode =:= "204"; StatCode =:= "304" -> %% No message body is expected for these Status Codes. %% RFC2616 - Sec 4.4 {_, Reqs_1} = queue:out(Reqs), send_async_headers(ReqId, StreamTo, Give_raw_headers, State_1), State_1_1 = do_reply(State_1, From, StreamTo, ReqId, Resp_format, {ok, StatCode, Headers_1, []}), cancel_timer(T_ref, {eat_message, {req_timedout, From}}), State_2 = reset_state(State_1_1), State_3 = set_cur_request(State_2#state{reqs = Reqs_1}), parse_response(Data_1, State_3); _ when TransferEncoding =:= "chunked" -> do_trace("Chunked encoding detected...~n",[]), send_async_headers(ReqId, StreamTo, Give_raw_headers, State_1), case parse_11_response(Data_1, State_1#state{transfer_encoding=chunked, chunk_size=chunk_start, reply_buffer = <<>>}) of {error, Reason} -> fail_pipelined_requests(State_1, {error, {Reason, {stat_code, StatCode}, Headers_1}}), {error, Reason}; State_2 -> State_2 end; undefined when HttpVsn =:= "HTTP/1.0"; ConnClose =:= "close" -> send_async_headers(ReqId, StreamTo, Give_raw_headers, State_1), State_1#state{reply_buffer = Data_1}; undefined -> fail_pipelined_requests(State_1, {error, {content_length_undefined, {stat_code, StatCode}, Headers}}), {error, content_length_undefined}; V -> case catch list_to_integer(V) of V_1 when is_integer(V_1), V_1 >= 0 -> send_async_headers(ReqId, StreamTo, Give_raw_headers, State_1), do_trace("Recvd Content-Length of ~p~n", [V_1]), State_2 = State_1#state{rep_buf_size=0, reply_buffer = <<>>, content_length=V_1}, case parse_11_response(Data_1, State_2) of {error, Reason} -> fail_pipelined_requests(State_1, {error, {Reason, {stat_code, StatCode}, Headers_1}}), {error, Reason}; State_3 -> State_3 end; _ -> fail_pipelined_requests(State_1, {error, {content_length_undefined, {stat_code, StatCode}, Headers}}), {error, content_length_undefined} end end; {no, Acc_1} when MaxHeaderSize == infinity -> State#state{reply_buffer = Acc_1}; {no, Acc_1} when size(Acc_1) < MaxHeaderSize -> State#state{reply_buffer = Acc_1}; {no, _Acc_1} -> fail_pipelined_requests(State, {error, max_headers_size_exceeded}), {error, max_headers_size_exceeded} end. upgrade_to_ssl(#state{socket = Socket, connect_timeout = Conn_timeout, ssl_options = Ssl_options, tunnel_setup_queue = Q} = State) -> case ssl:connect(Socket, Ssl_options, Conn_timeout) of {ok, Ssl_socket} -> do_trace("Upgraded to SSL socket!!~n", []), State_1 = State#state{socket = Ssl_socket, proxy_tunnel_setup = done}, send_queued_requests(lists:reverse(Q), State_1); Err -> do_trace("Upgrade to SSL socket failed. Reson: ~p~n", [Err]), do_error_reply(State, {error, {send_failed, Err}}), {error, send_failed} end. send_queued_requests([], State) -> do_trace("Sent all queued requests via SSL connection~n", []), State#state{tunnel_setup_queue = []}; send_queued_requests([{From, Url, Headers, Method, Body, Options, Timeout} | Q], State) -> case send_req_1(From, Url, Headers, Method, Body, Options, Timeout, State) of {noreply, State_1} -> send_queued_requests(Q, State_1); Err -> do_trace("Error sending queued SSL request: ~n" "URL : ~s~n" "Method : ~p~n" "Headers : ~p~n", [Url, Method, Headers]), do_error_reply(State, {error, {send_failed, Err}}), {error, send_failed} end. is_connection_closing("HTTP/0.9", _) -> true; is_connection_closing(_, "close") -> true; is_connection_closing("HTTP/1.0", "false") -> true; is_connection_closing(_, _) -> false. %% This clause determines the chunk size when given data from the beginning of the chunk parse_11_response(DataRecvd, #state{transfer_encoding = chunked, chunk_size = chunk_start, chunk_size_buffer = Chunk_sz_buf } = State) -> case scan_crlf(Chunk_sz_buf, DataRecvd) of {yes, ChunkHeader, Data_1} -> State_1 = maybe_accumulate_ce_data(State, <>), ChunkSize = parse_chunk_header(ChunkHeader), %% %% Do we have to preserve the chunk encoding when %% streaming? NO. This should be transparent to the client %% process. Chunked encoding was only introduced to make %% it efficient for the server. %% RemLen = size(Data_1), do_trace("Determined chunk size: ~p. Already recvd: ~p~n", [ChunkSize, RemLen]), parse_11_response(Data_1, State_1#state{chunk_size_buffer = <<>>, deleted_crlf = true, recvd_chunk_size = 0, chunk_size = ChunkSize}); {no, Data_1} -> State#state{chunk_size_buffer = Data_1} end; %% This clause is to remove the CRLF between two chunks %% parse_11_response(DataRecvd, #state{transfer_encoding = chunked, chunk_size = tbd, chunk_size_buffer = Buf } = State) -> case scan_crlf(Buf, DataRecvd) of {yes, _, NextChunk} -> State_1 = maybe_accumulate_ce_data(State, <<$\r, $\n>>), State_2 = State_1#state{chunk_size = chunk_start, chunk_size_buffer = <<>>, deleted_crlf = true}, parse_11_response(NextChunk, State_2); {no, Data_1} -> State#state{chunk_size_buffer = Data_1} end; %% This clause deals with the end of a chunked transfer. ibrowse does %% not support Trailers in the Chunked Transfer encoding. Any trailer %% received is silently discarded. parse_11_response(DataRecvd, #state{transfer_encoding = chunked, chunk_size = 0, cur_req = CurReq, deleted_crlf = DelCrlf, chunk_size_buffer = Trailer, reqs = Reqs} = State) -> do_trace("Detected end of chunked transfer...~n", []), DataRecvd_1 = case DelCrlf of false -> DataRecvd; true -> <<$\r, $\n, DataRecvd/binary>> end, case scan_header(Trailer, DataRecvd_1) of {yes, TEHeaders, Rem} -> {_, Reqs_1} = queue:out(Reqs), State_1 = maybe_accumulate_ce_data(State, <>), State_2 = handle_response(CurReq, State_1#state{reqs = Reqs_1}), parse_response(Rem, reset_state(State_2)); {no, Rem} -> accumulate_response(<<>>, State#state{chunk_size_buffer = Rem, deleted_crlf = false}) end; %% This clause extracts a chunk, given the size. parse_11_response(DataRecvd, #state{transfer_encoding = chunked, chunk_size = CSz, recvd_chunk_size = Recvd_csz, rep_buf_size = RepBufSz} = State) -> NeedBytes = CSz - Recvd_csz, DataLen = size(DataRecvd), do_trace("Recvd more data: size: ~p. NeedBytes: ~p~n", [DataLen, NeedBytes]), case DataLen >= NeedBytes of true -> {RemChunk, RemData} = split_binary(DataRecvd, NeedBytes), do_trace("Recvd another chunk...~p~n", [RemChunk]), do_trace("RemData -> ~p~n", [RemData]), case accumulate_response(RemChunk, State) of {error, Reason} -> do_trace("Error accumulating response --> ~p~n", [Reason]), {error, Reason}; #state{} = State_1 -> State_2 = State_1#state{chunk_size=tbd}, parse_11_response(RemData, State_2) end; false -> accumulate_response(DataRecvd, State#state{rep_buf_size = RepBufSz + DataLen, recvd_chunk_size = Recvd_csz + DataLen}) end; %% This clause to extract the body when Content-Length is specified parse_11_response(DataRecvd, #state{content_length=CL, rep_buf_size=RepBufSz, reqs=Reqs}=State) -> NeedBytes = CL - RepBufSz, DataLen = size(DataRecvd), case DataLen >= NeedBytes of true -> {RemBody, Rem} = split_binary(DataRecvd, NeedBytes), {_, Reqs_1} = queue:out(Reqs), State_1 = accumulate_response(RemBody, State), State_2 = handle_response(State_1#state.cur_req, State_1#state{reqs=Reqs_1}), State_3 = reset_state(State_2), parse_response(Rem, State_3); false -> accumulate_response(DataRecvd, State#state{rep_buf_size = (RepBufSz+DataLen)}) end. maybe_accumulate_ce_data(#state{cur_req = #request{preserve_chunked_encoding = false}} = State, _) -> State; maybe_accumulate_ce_data(State, Data) -> accumulate_response(Data, State). handle_response(#request{from=From, stream_to=StreamTo, req_id=ReqId, response_format = Resp_format, save_response_to_file = SaveResponseToFile, tmp_file_name = TmpFilename, tmp_file_fd = Fd, options = Options, timer_ref = ReqTimer }, #state{http_status_code = SCode, status_line = Status_line, raw_headers = Raw_headers, reply_buffer = RepBuf, recvd_headers = RespHeaders}=State) when SaveResponseToFile /= false -> Body = RepBuf, case Fd of undefined -> ok; _ -> ok = file:close(Fd) end, ResponseBody = case TmpFilename of undefined -> Body; _ -> {file, TmpFilename} end, {Resp_headers_1, Raw_headers_1} = maybe_add_custom_headers(RespHeaders, Raw_headers, Options), Reply = case get_value(give_raw_headers, Options, false) of true -> {ok, Status_line, Raw_headers_1, ResponseBody}; false -> {ok, SCode, Resp_headers_1, ResponseBody} end, State_1 = do_reply(State, From, StreamTo, ReqId, Resp_format, Reply), cancel_timer(ReqTimer, {eat_message, {req_timedout, From}}), set_cur_request(State_1); handle_response(#request{from=From, stream_to=StreamTo, req_id=ReqId, response_format = Resp_format, options = Options, timer_ref = ReqTimer}, #state{http_status_code = SCode, status_line = Status_line, raw_headers = Raw_headers, recvd_headers = Resp_headers, reply_buffer = RepBuf } = State) -> Body = RepBuf, {Resp_headers_1, Raw_headers_1} = maybe_add_custom_headers(Resp_headers, Raw_headers, Options), Reply = case get_value(give_raw_headers, Options, false) of true -> {ok, Status_line, Raw_headers_1, Body}; false -> {ok, SCode, Resp_headers_1, Body} end, State_1 = do_reply(State, From, StreamTo, ReqId, Resp_format, Reply), cancel_timer(ReqTimer, {eat_message, {req_timedout, From}}), set_cur_request(State_1). reset_state(State) -> State#state{status = get_header, rep_buf_size = 0, streamed_size = 0, content_length = undefined, reply_buffer = <<>>, chunk_size_buffer = <<>>, recvd_headers = [], status_line = undefined, raw_headers = undefined, deleted_crlf = false, http_status_code = undefined, chunk_size = undefined, transfer_encoding = undefined }. set_cur_request(#state{reqs = Reqs, socket = Socket} = State) -> case queue:peek(Reqs) of empty -> State#state{cur_req = undefined}; {value, #request{caller_controls_socket = Ccs} = NextReq} -> case Ccs of true -> do_setopts(Socket, [{active, once}], State); _ -> ok end, State#state{cur_req = NextReq} end. parse_headers(Headers) -> case scan_crlf(Headers) of {yes, StatusLine, T} -> parse_headers(StatusLine, T); {no, StatusLine} -> parse_headers(StatusLine, <<>>) end. parse_headers(StatusLine, Headers) -> Headers_1 = parse_headers_1(Headers), case parse_status_line(StatusLine) of {ok, HttpVsn, StatCode, _Msg} -> put(http_prot_vsn, HttpVsn), {HttpVsn, StatCode, Headers_1, StatusLine, Headers}; _ -> %% A HTTP 0.9 response? put(http_prot_vsn, "HTTP/0.9"), {"HTTP/0.9", undefined, Headers, StatusLine, Headers} end. % From RFC 2616 % % HTTP/1.1 header field values can be folded onto multiple lines if % the continuation line begins with a space or horizontal tab. All % linear white space, including folding, has the same semantics as % SP. A recipient MAY replace any linear white space with a single % SP before interpreting the field value or forwarding the message % downstream. parse_headers_1(B) when is_binary(B) -> parse_headers_1(binary_to_list(B)); parse_headers_1(String) -> parse_headers_1(String, [], []). parse_headers_1([$\n, H |T], [$\r | L], Acc) when H =:= 32; H =:= $\t -> parse_headers_1(lists:dropwhile(fun(X) -> is_whitespace(X) end, T), [32 | L], Acc); parse_headers_1([$\n, H |T], L, Acc) when H =:= 32; H =:= $\t -> parse_headers_1(lists:dropwhile(fun(X) -> is_whitespace(X) end, T), [32 | L], Acc); parse_headers_1([$\n|T], [$\r | L], Acc) -> case parse_header(lists:reverse(L)) of invalid -> parse_headers_1(T, [], Acc); NewHeader -> parse_headers_1(T, [], [NewHeader | Acc]) end; parse_headers_1([$\n|T], L, Acc) -> case parse_header(lists:reverse(L)) of invalid -> parse_headers_1(T, [], Acc); NewHeader -> parse_headers_1(T, [], [NewHeader | Acc]) end; parse_headers_1([H|T], L, Acc) -> parse_headers_1(T, [H|L], Acc); parse_headers_1([], [], Acc) -> lists:reverse(Acc); parse_headers_1([], L, Acc) -> Acc_1 = case parse_header(lists:reverse(L)) of invalid -> Acc; NewHeader -> [NewHeader | Acc] end, lists:reverse(Acc_1). parse_status_line(Line) when is_binary(Line) -> parse_status_line(binary_to_list(Line)); parse_status_line(Line) -> parse_status_line(Line, get_prot_vsn, [], []). parse_status_line([32 | T], get_prot_vsn, ProtVsn, StatCode) -> parse_status_line(T, get_status_code, ProtVsn, StatCode); parse_status_line([32 | T], get_status_code, ProtVsn, StatCode) -> {ok, lists:reverse(ProtVsn), lists:reverse(StatCode), T}; parse_status_line([], get_status_code, ProtVsn, StatCode) -> {ok, lists:reverse(ProtVsn), lists:reverse(StatCode), []}; parse_status_line([H | T], get_prot_vsn, ProtVsn, StatCode) -> parse_status_line(T, get_prot_vsn, [H|ProtVsn], StatCode); parse_status_line([H | T], get_status_code, ProtVsn, StatCode) -> parse_status_line(T, get_status_code, ProtVsn, [H | StatCode]); parse_status_line([], _, _, _) -> http_09. parse_header(L) -> parse_header(L, []). parse_header([$: | V], Acc) -> {lists:reverse(Acc), string:strip(V)}; parse_header([H | T], Acc) -> parse_header(T, [H | Acc]); parse_header([], _) -> invalid. scan_header(Bin) -> case get_crlf_crlf_pos(Bin, 0) of {yes, Pos} -> {Headers, <<_:4/binary, Body/binary>>} = split_binary(Bin, Pos), {yes, Headers, Body}; {yes_dodgy, Pos} -> {Headers, <<_:2/binary, Body/binary>>} = split_binary(Bin, Pos), {yes, Headers, Body}; no -> {no, Bin} end. scan_header(Bin1, Bin2) when size(Bin1) < 4 -> scan_header(<>); scan_header(Bin1, <<>>) -> scan_header(Bin1); scan_header(Bin1, Bin2) -> Bin1_already_scanned_size = size(Bin1) - 4, <> = Bin1, Bin_to_scan = <>, case get_crlf_crlf_pos(Bin_to_scan, 0) of {yes, Pos} -> {Headers_suffix, <<_:4/binary, Body/binary>>} = split_binary(Bin_to_scan, Pos), {yes, <>, Body}; {yes_dodgy, Pos} -> {Headers_suffix, <<_:2/binary, Body/binary>>} = split_binary(Bin_to_scan, Pos), {yes, <>, Body}; no -> {no, <>} end. get_crlf_crlf_pos(<<$\r, $\n, $\r, $\n, _/binary>>, Pos) -> {yes, Pos}; get_crlf_crlf_pos(<<$\n, $\n, _/binary>>, Pos) -> {yes_dodgy, Pos}; get_crlf_crlf_pos(<<_, Rest/binary>>, Pos) -> get_crlf_crlf_pos(Rest, Pos + 1); get_crlf_crlf_pos(<<>>, _) -> no. scan_crlf(Bin) -> case get_crlf_pos(Bin) of {yes, Offset, Pos} -> {Prefix, <<_:Offset/binary, Suffix/binary>>} = split_binary(Bin, Pos), {yes, Prefix, Suffix}; no -> {no, Bin} end. scan_crlf(<<>>, Bin2) -> scan_crlf(Bin2); scan_crlf(Bin1, Bin2) when size(Bin1) < 2 -> scan_crlf(<>); scan_crlf(Bin1, Bin2) -> scan_crlf_1(size(Bin1) - 2, Bin1, Bin2). scan_crlf_1(Bin1_head_size, Bin1, Bin2) -> <> = Bin1, Bin3 = <>, case get_crlf_pos(Bin3) of {yes, Offset, Pos} -> {Prefix, <<_:Offset/binary, Suffix/binary>>} = split_binary(Bin3, Pos), {yes, list_to_binary([Bin1_head, Prefix]), Suffix}; no -> {no, list_to_binary([Bin1, Bin2])} end. get_crlf_pos(Bin) -> get_crlf_pos(Bin, 0). get_crlf_pos(<<$\r, $\n, _/binary>>, Pos) -> {yes, 2, Pos}; get_crlf_pos(<<$\n, _/binary>>, Pos) -> {yes, 1, Pos}; get_crlf_pos(<<_, Rest/binary>>, Pos) -> get_crlf_pos(Rest, Pos + 1); get_crlf_pos(<<>>, _) -> no. fmt_val(L) when is_list(L) -> L; fmt_val(I) when is_integer(I) -> integer_to_list(I); fmt_val(A) when is_atom(A) -> atom_to_list(A); fmt_val(Term) -> io_lib:format("~p", [Term]). crnl() -> "\r\n". method(connect) -> "CONNECT"; method(delete) -> "DELETE"; method(get) -> "GET"; method(head) -> "HEAD"; method(options) -> "OPTIONS"; method(post) -> "POST"; method(put) -> "PUT"; method(trace) -> "TRACE"; %% webdav method(copy) -> "COPY"; method(lock) -> "LOCK"; method(mkcol) -> "MKCOL"; method(move) -> "MOVE"; method(propfind) -> "PROPFIND"; method(proppatch) -> "PROPPATCH"; method(search) -> "SEARCH"; method(unlock) -> "UNLOCK"; %% subversion %% method(report) -> "REPORT"; method(mkactivity) -> "MKACTIVITY"; method(checkout) -> "CHECKOUT"; method(merge) -> "MERGE"; %% upnp method(msearch) -> "MSEARCH"; method(notify) -> "NOTIFY"; method(subscribe) -> "SUBSCRIBE"; method(unsubscribe) -> "UNSUBSCRIBE"; %% rfc-5789 method(patch) -> "PATCH"; method(purge) -> "PURGE". %% From RFC 2616 %% % The chunked encoding modifies the body of a message in order to % transfer it as a series of chunks, each with its own size indicator, % followed by an OPTIONAL trailer containing entity-header % fields. This allows dynamically produced content to be transferred % along with the information necessary for the recipient to verify % that it has received the full message. % Chunked-Body = *chunk % last-chunk % trailer % CRLF % chunk = chunk-size [ chunk-extension ] CRLF % chunk-data CRLF % chunk-size = 1*HEX % last-chunk = 1*("0") [ chunk-extension ] CRLF % chunk-extension= *( ";" chunk-ext-name [ "=" chunk-ext-val ] ) % chunk-ext-name = token % chunk-ext-val = token | quoted-string % chunk-data = chunk-size(OCTET) % trailer = *(entity-header CRLF) % The chunk-size field is a string of hex digits indicating the size % of the chunk. The chunked encoding is ended by any chunk whose size % is zero, followed by the trailer, which is terminated by an empty % line. %% %% The parsing implemented here discards all chunk extensions. It also %% strips trailing spaces from the chunk size fields as Apache 1.3.27 was %% sending them. parse_chunk_header(ChunkHeader) -> parse_chunk_header(ChunkHeader, []). parse_chunk_header(<<$;, _/binary>>, Acc) -> hexlist_to_integer(lists:reverse(Acc)); parse_chunk_header(<>, Acc) -> case is_whitespace(H) of true -> parse_chunk_header(T, Acc); false -> parse_chunk_header(T, [H | Acc]) end; parse_chunk_header(<<>>, Acc) -> hexlist_to_integer(lists:reverse(Acc)). is_whitespace($\s) -> true; is_whitespace($\r) -> true; is_whitespace($\n) -> true; is_whitespace($\t) -> true; is_whitespace(_) -> false. send_async_headers(_ReqId, undefined, _, _State) -> ok; send_async_headers(ReqId, StreamTo, Give_raw_headers, #state{status_line = Status_line, raw_headers = Raw_headers, recvd_headers = Headers, http_status_code = StatCode, cur_req = #request{options = Opts} }) -> {Headers_1, Raw_headers_1} = maybe_add_custom_headers(Headers, Raw_headers, Opts), case Give_raw_headers of false -> catch StreamTo ! {ibrowse_async_headers, ReqId, StatCode, Headers_1}; true -> catch StreamTo ! {ibrowse_async_headers, ReqId, Status_line, Raw_headers_1} end. maybe_add_custom_headers(Headers, Raw_headers, Opts) -> Custom_headers = get_value(add_custom_headers, Opts, []), Headers_1 = Headers ++ Custom_headers, Raw_headers_1 = case Custom_headers of [_ | _] when is_binary(Raw_headers) -> Custom_headers_bin = list_to_binary(string:join([[X, $:, Y] || {X, Y} <- Custom_headers], "\r\n")), <>; _ -> Raw_headers end, {Headers_1, Raw_headers_1}. format_response_data(Resp_format, Body) -> case Resp_format of list when is_list(Body) -> flatten(Body); list when is_binary(Body) -> binary_to_list(Body); binary when is_list(Body) -> list_to_binary(Body); _ -> %% This is to cater for sending messages such as %% {chunk_start, _}, chunk_end etc Body end. do_reply(State, From, undefined, _, Resp_format, {ok, St_code, Headers, Body}) -> Msg_1 = {ok, St_code, Headers, format_response_data(Resp_format, Body)}, gen_server:reply(From, Msg_1), dec_pipeline_counter(State); do_reply(State, From, undefined, _, _, Msg) -> gen_server:reply(From, Msg), dec_pipeline_counter(State); do_reply(#state{prev_req_id = Prev_req_id} = State, _From, StreamTo, ReqId, Resp_format, {ok, _, _, Body}) -> State_1 = dec_pipeline_counter(State), case Body of [] -> ok; _ -> Body_1 = format_response_data(Resp_format, Body), catch StreamTo ! {ibrowse_async_response, ReqId, Body_1} end, catch StreamTo ! {ibrowse_async_response_end, ReqId}, %% We don't want to delete the Req-id to Pid mapping straightaway %% as the client may send a stream_next message just while we are %% sending back this ibrowse_async_response_end message. If we %% deleted this mapping straightaway, the caller will see a %% {error, unknown_req_id} when it calls ibrowse:stream_next/1. To %% get around this, we store the req id, and clear it after the %% next request. If there are wierd combinations of stream, %% stream_once and sync requests on the same connection, it will %% take a while for the req_id-pid mapping to get cleared, but it %% should do no harm. ets:delete(ibrowse_stream, {req_id_pid, Prev_req_id}), State_1#state{prev_req_id = ReqId}; do_reply(State, _From, StreamTo, ReqId, Resp_format, Msg) -> State_1 = dec_pipeline_counter(State), Msg_1 = format_response_data(Resp_format, Msg), catch StreamTo ! {ibrowse_async_response, ReqId, Msg_1}, State_1. do_interim_reply(undefined, _, _ReqId, _Msg) -> ok; do_interim_reply(StreamTo, Response_format, ReqId, Msg) -> Msg_1 = format_response_data(Response_format, Msg), catch StreamTo ! {ibrowse_async_response, ReqId, Msg_1}. do_error_reply(#state{reqs = Reqs, tunnel_setup_queue = Tun_q} = State, Err) -> ReqList = queue:to_list(Reqs), lists:foreach(fun(#request{from=From, stream_to=StreamTo, req_id=ReqId, response_format = Resp_format}) -> ets:delete(ibrowse_stream, {req_id_pid, ReqId}), do_reply(State, From, StreamTo, ReqId, Resp_format, {error, Err}) end, ReqList), lists:foreach( fun({From, _Url, _Headers, _Method, _Body, _Options, _Timeout}) -> do_reply(State, From, undefined, undefined, undefined, Err) end, Tun_q). fail_pipelined_requests(#state{reqs = Reqs, cur_req = CurReq} = State, Reply) -> {_, Reqs_1} = queue:out(Reqs), #request{from=From, stream_to=StreamTo, req_id=ReqId, response_format = Resp_format} = CurReq, State_1 = do_reply(State, From, StreamTo, ReqId, Resp_format, Reply), do_error_reply(State_1#state{reqs = Reqs_1}, previous_request_failed). split_list_at(List, N) -> split_list_at(List, N, []). split_list_at([], _, Acc) -> {lists:reverse(Acc), []}; split_list_at(List2, 0, List1) -> {lists:reverse(List1), List2}; split_list_at([H | List2], N, List1) -> split_list_at(List2, N-1, [H | List1]). hexlist_to_integer(List) -> hexlist_to_integer(lists:reverse(List), 1, 0). hexlist_to_integer([H | T], Multiplier, Acc) -> hexlist_to_integer(T, Multiplier*16, Multiplier*to_ascii(H) + Acc); hexlist_to_integer([], _, Acc) -> Acc. to_ascii($A) -> 10; to_ascii($a) -> 10; to_ascii($B) -> 11; to_ascii($b) -> 11; to_ascii($C) -> 12; to_ascii($c) -> 12; to_ascii($D) -> 13; to_ascii($d) -> 13; to_ascii($E) -> 14; to_ascii($e) -> 14; to_ascii($F) -> 15; to_ascii($f) -> 15; to_ascii($1) -> 1; to_ascii($2) -> 2; to_ascii($3) -> 3; to_ascii($4) -> 4; to_ascii($5) -> 5; to_ascii($6) -> 6; to_ascii($7) -> 7; to_ascii($8) -> 8; to_ascii($9) -> 9; to_ascii($0) -> 0. cancel_timer(undefined) -> ok; cancel_timer(Ref) -> _ = erlang:cancel_timer(Ref), ok. cancel_timer(Ref, {eat_message, Msg}) -> cancel_timer(Ref), receive Msg -> ok after 0 -> ok end. make_req_id() -> now(). to_lower(Str) -> to_lower(Str, []). to_lower([H|T], Acc) when H >= $A, H =< $Z -> to_lower(T, [H+32|Acc]); to_lower([H|T], Acc) -> to_lower(T, [H|Acc]); to_lower([], Acc) -> lists:reverse(Acc). shutting_down(#state{lb_ets_tid = undefined}) -> ok; shutting_down(#state{lb_ets_tid = Tid, cur_pipeline_size = _Sz}) -> catch ets:delete(Tid, self()). inc_pipeline_counter(#state{is_closing = true} = State) -> State; inc_pipeline_counter(#state{lb_ets_tid = undefined} = State) -> State; inc_pipeline_counter(#state{cur_pipeline_size = Pipe_sz, lb_ets_tid = Tid} = State) -> update_counter(Tid, self(), {2,1,99999,9999}), State#state{cur_pipeline_size = Pipe_sz + 1}. update_counter(Tid, Key, Args) -> ets:update_counter(Tid, Key, Args). dec_pipeline_counter(#state{is_closing = true} = State) -> State; dec_pipeline_counter(#state{lb_ets_tid = undefined} = State) -> State; dec_pipeline_counter(#state{cur_pipeline_size = Pipe_sz, lb_ets_tid = Tid} = State) -> try update_counter(Tid, self(), {2,-1,0,0}), update_counter(Tid, self(), {3,-1,0,0}) catch _:_ -> ok end, State#state{cur_pipeline_size = Pipe_sz - 1}. flatten([H | _] = L) when is_integer(H) -> L; flatten([H | _] = L) when is_list(H) -> lists:flatten(L); flatten([]) -> []. get_stream_chunk_size(Options) -> case lists:keysearch(stream_chunk_size, 1, Options) of {value, {_, V}} when V > 0 -> V; _ -> ?DEFAULT_STREAM_CHUNK_SIZE end. set_inac_timer(State) -> cancel_timer(State#state.inactivity_timer_ref), set_inac_timer(State#state{inactivity_timer_ref = undefined}, get_inac_timeout(State)). set_inac_timer(State, Timeout) when is_integer(Timeout) -> Ref = erlang:send_after(Timeout, self(), timeout), State#state{inactivity_timer_ref = Ref}; set_inac_timer(State, _) -> State. get_inac_timeout(#state{cur_req = #request{options = Opts}}) -> get_value(inactivity_timeout, Opts, infinity); get_inac_timeout(#state{cur_req = undefined}) -> case ibrowse:get_config_value(inactivity_timeout, undefined) of Val when is_integer(Val) -> Val; _ -> case application:get_env(ibrowse, inactivity_timeout) of {ok, Val} when is_integer(Val), Val > 0 -> Val; _ -> 10000 end end. trace_request(Req) -> case get(my_trace_flag) of true -> %%Avoid the binary operations if trace is not on... NReq = to_binary(Req), do_trace("Sending request: ~n" "--- Request Begin ---~n~s~n" "--- Request End ---~n", [NReq]); _ -> ok end. trace_request_body(Body) -> case get(my_trace_flag) of true -> %%Avoid the binary operations if trace is not on... NBody = to_binary(Body), case size(NBody) > 1024 of true -> ok; false -> do_trace("Sending request body: ~n" "--- Request Body Begin ---~n~s~n" "--- Request Body End ---~n", [NBody]) end; false -> ok end. to_binary(X) when is_list(X) -> list_to_binary(X); to_binary(X) when is_binary(X) -> X. apache-couchdb-1.6.0/src/ibrowse/ibrowse_sup.erl0000644000175000001440000000474012332105522021631 0ustar00djcusers00000000000000%%%------------------------------------------------------------------- %%% File : ibrowse_sup.erl %%% Author : Chandrashekhar Mullaparthi %%% Description : %%% %%% Created : 15 Oct 2003 by Chandrashekhar Mullaparthi %%%------------------------------------------------------------------- -module(ibrowse_sup). -behaviour(supervisor). %%-------------------------------------------------------------------- %% Include files %%-------------------------------------------------------------------- %%-------------------------------------------------------------------- %% External exports %%-------------------------------------------------------------------- -export([ start_link/0 ]). %%-------------------------------------------------------------------- %% Internal exports %%-------------------------------------------------------------------- -export([ init/1 ]). %%-------------------------------------------------------------------- %% Macros %%-------------------------------------------------------------------- -define(SERVER, ?MODULE). %%-------------------------------------------------------------------- %% Records %%-------------------------------------------------------------------- %%==================================================================== %% External functions %%==================================================================== %%-------------------------------------------------------------------- %% Function: start_link/0 %% Description: Starts the supervisor %%-------------------------------------------------------------------- start_link() -> supervisor:start_link({local, ?SERVER}, ?MODULE, []). %%==================================================================== %% Server functions %%==================================================================== %%-------------------------------------------------------------------- %% Func: init/1 %% Returns: {ok, {SupFlags, [ChildSpec]}} | %% ignore | %% {error, Reason} %%-------------------------------------------------------------------- init([]) -> AChild = {ibrowse,{ibrowse,start_link,[]}, permanent,2000,worker,[ibrowse, ibrowse_http_client]}, {ok,{{one_for_all,10,1}, [AChild]}}. %%==================================================================== %% Internal functions %%==================================================================== apache-couchdb-1.6.0/src/ibrowse/Makefile.am0000644000175000001440000000250112332105522020611 0ustar00djcusers00000000000000## Licensed under the Apache License, Version 2.0 (the "License"); you may not ## use this file except in compliance with the License. You may obtain a copy of ## the License at ## ## http://www.apache.org/licenses/LICENSE-2.0 ## ## Unless required by applicable law or agreed to in writing, software ## distributed under the License is distributed on an "AS IS" BASIS, WITHOUT ## WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the ## License for the specific language governing permissions and limitations under ## the License. ibrowseebindir = $(localerlanglibdir)/ibrowse-2.2.0/ebin ibrowse_file_collection = \ ibrowse.app.in \ ibrowse.erl \ ibrowse_app.erl \ ibrowse_http_client.erl \ ibrowse_lb.erl \ ibrowse_lib.erl \ ibrowse_socks5.erl \ ibrowse_sup.erl \ ibrowse_test.erl ibrowseebin_make_generated_file_list = \ ibrowse.app \ ibrowse.beam \ ibrowse_app.beam \ ibrowse_http_client.beam \ ibrowse_lb.beam \ ibrowse_lib.beam \ ibrowse_socks5.beam \ ibrowse_sup.beam \ ibrowse_test.beam ibrowseebin_DATA = \ $(ibrowseebin_make_generated_file_list) EXTRA_DIST = \ $(ibrowse_file_collection) \ ibrowse.hrl CLEANFILES = \ $(ibrowseebin_make_generated_file_list) %.app: %.app.in cp $< $@ %.beam: %.erl $(ERLC) $(ERLC_FLAGS) $< apache-couchdb-1.6.0/src/ibrowse/Makefile.in0000644000175000001440000003623612332105552020641 0ustar00djcusers00000000000000# Makefile.in generated by automake 1.11.6 from Makefile.am. # @configure_input@ # Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, # 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011 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__make_dryrun = \ { \ am__dry=no; \ case $$MAKEFLAGS in \ *\\[\ \ ]*) \ echo 'am--echo: ; @echo "AM" OK' | $(MAKE) -f - 2>/dev/null \ | grep '^AM OK$$' >/dev/null || am__dry=yes;; \ *) \ for am__flg in $$MAKEFLAGS; do \ case $$am__flg in \ *=*|--*) ;; \ *n*) am__dry=yes; break;; \ esac; \ done;; \ esac; \ test $$am__dry = yes; \ } 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/ibrowse DIST_COMMON = $(srcdir)/Makefile.am $(srcdir)/Makefile.in ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 am__aclocal_m4_deps = $(top_srcdir)/m4/libtool.m4 \ $(top_srcdir)/m4/ltoptions.m4 $(top_srcdir)/m4/ltsugar.m4 \ $(top_srcdir)/m4/ltversion.m4 $(top_srcdir)/m4/lt~obsolete.m4 \ $(top_srcdir)/acinclude.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 \ $(top_builddir)/src/snappy/google-snappy/config.h CONFIG_CLEAN_FILES = CONFIG_CLEAN_VPATH_FILES = 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)$(ibrowseebindir)" DATA = $(ibrowseebin_DATA) DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) ACLOCAL = @ACLOCAL@ AMTAR = @AMTAR@ AR = @AR@ AS = @AS@ AUTOCONF = @AUTOCONF@ AUTOHEADER = @AUTOHEADER@ AUTOMAKE = @AUTOMAKE@ AWK = @AWK@ CC = @CC@ CCDEPMODE = @CCDEPMODE@ CFLAGS = @CFLAGS@ CPP = @CPP@ CPPFLAGS = @CPPFLAGS@ CURL_CFLAGS = @CURL_CFLAGS@ CURL_CONFIG = @CURL_CONFIG@ CURL_LIBS = @CURL_LIBS@ CXX = @CXX@ CXXCPP = @CXXCPP@ CXXDEPMODE = @CXXDEPMODE@ CXXFLAGS = @CXXFLAGS@ CYGPATH_W = @CYGPATH_W@ DEFS = @DEFS@ DEPDIR = @DEPDIR@ DLLTOOL = @DLLTOOL@ DSYMUTIL = @DSYMUTIL@ DUMPBIN = @DUMPBIN@ ECHO_C = @ECHO_C@ ECHO_N = @ECHO_N@ ECHO_T = @ECHO_T@ EGREP = @EGREP@ ERL = @ERL@ ERLANG_FLAGS = @ERLANG_FLAGS@ ERLC = @ERLC@ ERLC_FLAGS = @ERLC_FLAGS@ ESCRIPT = @ESCRIPT@ EXEEXT = @EXEEXT@ FGREP = @FGREP@ FLAGS = @FLAGS@ GREP = @GREP@ HAS_HELP2MAN = @HAS_HELP2MAN@ HAS_INSTALLINFO = @HAS_INSTALLINFO@ HAS_MAKEINFO = @HAS_MAKEINFO@ HAS_PDFLATEX = @HAS_PDFLATEX@ HAS_SPHINX_BUILD = @HAS_SPHINX_BUILD@ ICU_BIN = @ICU_BIN@ ICU_CFLAGS = @ICU_CFLAGS@ ICU_CONFIG = @ICU_CONFIG@ ICU_CPPFLAGS = @ICU_CPPFLAGS@ ICU_CXXFLAGS = @ICU_CXXFLAGS@ ICU_LIBS = @ICU_LIBS@ INNO_COMPILER_EXECUTABLE = @INNO_COMPILER_EXECUTABLE@ INSTALL = @INSTALL@ INSTALL_DATA = @INSTALL_DATA@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ INSTALL_SCRIPT = @INSTALL_SCRIPT@ INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ JS_CFLAGS = @JS_CFLAGS@ JS_LIBS = @JS_LIBS@ JS_LIB_BINARY = @JS_LIB_BINARY@ LD = @LD@ LDFLAGS = @LDFLAGS@ LIBOBJS = @LIBOBJS@ LIBS = @LIBS@ LIBTOOL = @LIBTOOL@ LIPO = @LIPO@ LN_S = @LN_S@ LTLIBOBJS = @LTLIBOBJS@ MAKEINFO = @MAKEINFO@ MANIFEST_TOOL = @MANIFEST_TOOL@ MKDIR_P = @MKDIR_P@ NM = @NM@ NMEDIT = @NMEDIT@ OBJDUMP = @OBJDUMP@ OBJEXT = @OBJEXT@ OTOOL = @OTOOL@ OTOOL64 = @OTOOL64@ PACKAGE = @PACKAGE@ PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ PACKAGE_NAME = @PACKAGE_NAME@ PACKAGE_STRING = @PACKAGE_STRING@ PACKAGE_TARNAME = @PACKAGE_TARNAME@ PACKAGE_URL = @PACKAGE_URL@ PACKAGE_VERSION = @PACKAGE_VERSION@ PATH_SEPARATOR = @PATH_SEPARATOR@ PKG_CONFIG = @PKG_CONFIG@ PKG_CONFIG_LIBDIR = @PKG_CONFIG_LIBDIR@ PKG_CONFIG_PATH = @PKG_CONFIG_PATH@ RANLIB = @RANLIB@ SED = @SED@ SET_MAKE = @SET_MAKE@ SHELL = @SHELL@ SNAPPY_MAJOR = @SNAPPY_MAJOR@ SNAPPY_MINOR = @SNAPPY_MINOR@ SNAPPY_PATCHLEVEL = @SNAPPY_PATCHLEVEL@ STRIP = @STRIP@ VERSION = @VERSION@ 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@ ac_cv_have_stddef_h = @ac_cv_have_stddef_h@ ac_cv_have_stdint_h = @ac_cv_have_stdint_h@ am__include = @am__include@ am__leading_dot = @am__leading_dot@ am__quote = @am__quote@ am__tar = @am__tar@ am__untar = @am__untar@ bindir = @bindir@ bug_uri = @bug_uri@ 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@ dvidir = @dvidir@ erlangbin = @erlangbin@ erlangversion = @erlangversion@ exec_prefix = @exec_prefix@ host = @host@ host_alias = @host_alias@ host_cpu = @host_cpu@ host_os = @host_os@ host_vendor = @host_vendor@ htmldir = @htmldir@ includedir = @includedir@ infodir = @infodir@ initdir = @initdir@ install_sh = @install_sh@ launchddir = @launchddir@ libdir = @libdir@ libexecdir = @libexecdir@ localconfdir = @localconfdir@ localdatadir = @localdatadir@ localdocdir = @localdocdir@ localedir = @localedir@ localerlanglibdir = @localerlanglibdir@ locallibbindir = @locallibbindir@ locallibdir = @locallibdir@ localstatedir = @localstatedir@ localstatelibdir = @localstatelibdir@ localstatelogdir = @localstatelogdir@ localstaterundir = @localstaterundir@ mandir = @mandir@ mkdir_p = @mkdir_p@ msvc_redist_dir = @msvc_redist_dir@ msvc_redist_name = @msvc_redist_name@ oldincludedir = @oldincludedir@ openssl_bin_dir = @openssl_bin_dir@ otp_release = @otp_release@ package_author_address = @package_author_address@ package_author_name = @package_author_name@ package_identifier = @package_identifier@ package_name = @package_name@ package_tarname = @package_tarname@ 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@ version = @version@ version_major = @version_major@ version_minor = @version_minor@ version_release = @version_release@ version_revision = @version_revision@ version_stage = @version_stage@ ibrowseebindir = $(localerlanglibdir)/ibrowse-2.2.0/ebin ibrowse_file_collection = \ ibrowse.app.in \ ibrowse.erl \ ibrowse_app.erl \ ibrowse_http_client.erl \ ibrowse_lb.erl \ ibrowse_lib.erl \ ibrowse_socks5.erl \ ibrowse_sup.erl \ ibrowse_test.erl ibrowseebin_make_generated_file_list = \ ibrowse.app \ ibrowse.beam \ ibrowse_app.beam \ ibrowse_http_client.beam \ ibrowse_lb.beam \ ibrowse_lib.beam \ ibrowse_socks5.beam \ ibrowse_sup.beam \ ibrowse_test.beam ibrowseebin_DATA = \ $(ibrowseebin_make_generated_file_list) EXTRA_DIST = \ $(ibrowse_file_collection) \ ibrowse.hrl CLEANFILES = \ $(ibrowseebin_make_generated_file_list) 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) --foreign src/ibrowse/Makefile'; \ $(am__cd) $(top_srcdir) && \ $(AUTOMAKE) --foreign src/ibrowse/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-ibrowseebinDATA: $(ibrowseebin_DATA) @$(NORMAL_INSTALL) @list='$(ibrowseebin_DATA)'; test -n "$(ibrowseebindir)" || list=; \ if test -n "$$list"; then \ echo " $(MKDIR_P) '$(DESTDIR)$(ibrowseebindir)'"; \ $(MKDIR_P) "$(DESTDIR)$(ibrowseebindir)" || 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)$(ibrowseebindir)'"; \ $(INSTALL_DATA) $$files "$(DESTDIR)$(ibrowseebindir)" || exit $$?; \ done uninstall-ibrowseebinDATA: @$(NORMAL_UNINSTALL) @list='$(ibrowseebin_DATA)'; test -n "$(ibrowseebindir)" || list=; \ files=`for p in $$list; do echo $$p; done | sed -e 's|^.*/||'`; \ dir='$(DESTDIR)$(ibrowseebindir)'; $(am__uninstall_files_from_dir) tags: TAGS TAGS: ctags: CTAGS CTAGS: 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)$(ibrowseebindir)"; 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 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-ibrowseebinDATA 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-ibrowseebinDATA .MAKE: install-am install-strip .PHONY: all all-am check check-am clean clean-generic clean-libtool \ 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-ibrowseebinDATA 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 uninstall uninstall-am uninstall-ibrowseebinDATA %.app: %.app.in cp $< $@ %.beam: %.erl $(ERLC) $(ERLC_FLAGS) $< # 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: apache-couchdb-1.6.0/src/ibrowse/ibrowse_app.erl0000644000175000001440000000422012332105522021573 0ustar00djcusers00000000000000%%%------------------------------------------------------------------- %%% File : ibrowse_app.erl %%% Author : Chandrashekhar Mullaparthi %%% Description : %%% %%% Created : 15 Oct 2003 by Chandrashekhar Mullaparthi %%%------------------------------------------------------------------- -module(ibrowse_app). -behaviour(application). %%-------------------------------------------------------------------- %% Include files %%-------------------------------------------------------------------- %%-------------------------------------------------------------------- %% External exports %%-------------------------------------------------------------------- -export([ start/2, stop/1 ]). %%-------------------------------------------------------------------- %% Internal exports %%-------------------------------------------------------------------- -export([ ]). %%-------------------------------------------------------------------- %% Macros %%-------------------------------------------------------------------- %%-------------------------------------------------------------------- %% Records %%-------------------------------------------------------------------- %%==================================================================== %% External functions %%==================================================================== %%-------------------------------------------------------------------- %% Func: start/2 %% Returns: {ok, Pid} | %% {ok, Pid, State} | %% {error, Reason} %%-------------------------------------------------------------------- start(_Type, _StartArgs) -> case ibrowse_sup:start_link() of {ok, Pid} -> {ok, Pid}; Error -> Error end. %%-------------------------------------------------------------------- %% Func: stop/1 %% Returns: any %%-------------------------------------------------------------------- stop(_State) -> ok. %%==================================================================== %% Internal functions %%==================================================================== apache-couchdb-1.6.0/src/ibrowse/ibrowse_test.erl0000644000175000001440000005566212332105522022012 0ustar00djcusers00000000000000%%% File : ibrowse_test.erl %%% Author : Chandrashekhar Mullaparthi %%% Description : Test ibrowse %%% Created : 14 Oct 2003 by Chandrashekhar Mullaparthi -module(ibrowse_test). -export([ load_test/3, send_reqs_1/3, do_send_req/2, unit_tests/0, unit_tests/1, unit_tests_1/2, ue_test/0, ue_test/1, verify_chunked_streaming/0, verify_chunked_streaming/1, test_chunked_streaming_once/0, i_do_async_req_list/4, test_stream_once/3, test_stream_once/4, test_20122010/0, test_20122010/1, test_pipeline_head_timeout/0, test_pipeline_head_timeout/1, do_test_pipeline_head_timeout/4, test_head_transfer_encoding/0, test_head_transfer_encoding/1, test_head_response_with_body/0, test_head_response_with_body/1 ]). test_stream_once(Url, Method, Options) -> test_stream_once(Url, Method, Options, 5000). test_stream_once(Url, Method, Options, Timeout) -> case ibrowse:send_req(Url, [], Method, [], [{stream_to, {self(), once}} | Options], Timeout) of {ibrowse_req_id, Req_id} -> case ibrowse:stream_next(Req_id) of ok -> test_stream_once(Req_id); Err -> Err end; Err -> Err end. test_stream_once(Req_id) -> receive {ibrowse_async_headers, Req_id, StatCode, Headers} -> io:format("Recvd headers~n~p~n", [{ibrowse_async_headers, Req_id, StatCode, Headers}]), case ibrowse:stream_next(Req_id) of ok -> test_stream_once(Req_id); Err -> Err end; {ibrowse_async_response, Req_id, {error, Err}} -> io:format("Recvd error: ~p~n", [Err]); {ibrowse_async_response, Req_id, Body_1} -> io:format("Recvd body part: ~n~p~n", [{ibrowse_async_response, Req_id, Body_1}]), case ibrowse:stream_next(Req_id) of ok -> test_stream_once(Req_id); Err -> Err end; {ibrowse_async_response_end, Req_id} -> ok end. %% Use ibrowse:set_max_sessions/3 and ibrowse:set_max_pipeline_size/3 to %% tweak settings before running the load test. The defaults are 10 and 10. load_test(Url, NumWorkers, NumReqsPerWorker) when is_list(Url), is_integer(NumWorkers), is_integer(NumReqsPerWorker), NumWorkers > 0, NumReqsPerWorker > 0 -> proc_lib:spawn(?MODULE, send_reqs_1, [Url, NumWorkers, NumReqsPerWorker]). send_reqs_1(Url, NumWorkers, NumReqsPerWorker) -> Start_time = now(), ets:new(pid_table, [named_table, public]), ets:new(ibrowse_test_results, [named_table, public]), ets:new(ibrowse_errors, [named_table, public, ordered_set]), init_results(), process_flag(trap_exit, true), log_msg("Starting spawning of workers...~n", []), spawn_workers(Url, NumWorkers, NumReqsPerWorker), log_msg("Finished spawning workers...~n", []), do_wait(Url), End_time = now(), log_msg("All workers are done...~n", []), log_msg("ibrowse_test_results table: ~n~p~n", [ets:tab2list(ibrowse_test_results)]), log_msg("Start time: ~1000.p~n", [calendar:now_to_local_time(Start_time)]), log_msg("End time : ~1000.p~n", [calendar:now_to_local_time(End_time)]), Elapsed_time_secs = trunc(timer:now_diff(End_time, Start_time) / 1000000), log_msg("Elapsed : ~p~n", [Elapsed_time_secs]), log_msg("Reqs/sec : ~p~n", [round(trunc((NumWorkers*NumReqsPerWorker) / Elapsed_time_secs))]), dump_errors(). init_results() -> ets:insert(ibrowse_test_results, {crash, 0}), ets:insert(ibrowse_test_results, {send_failed, 0}), ets:insert(ibrowse_test_results, {other_error, 0}), ets:insert(ibrowse_test_results, {success, 0}), ets:insert(ibrowse_test_results, {retry_later, 0}), ets:insert(ibrowse_test_results, {trid_mismatch, 0}), ets:insert(ibrowse_test_results, {success_no_trid, 0}), ets:insert(ibrowse_test_results, {failed, 0}), ets:insert(ibrowse_test_results, {timeout, 0}), ets:insert(ibrowse_test_results, {req_id, 0}). spawn_workers(_Url, 0, _) -> ok; spawn_workers(Url, NumWorkers, NumReqsPerWorker) -> Pid = proc_lib:spawn_link(?MODULE, do_send_req, [Url, NumReqsPerWorker]), ets:insert(pid_table, {Pid, []}), spawn_workers(Url, NumWorkers - 1, NumReqsPerWorker). do_wait(Url) -> receive {'EXIT', _, normal} -> catch ibrowse:show_dest_status(Url), catch ibrowse:show_dest_status(), do_wait(Url); {'EXIT', Pid, Reason} -> ets:delete(pid_table, Pid), ets:insert(ibrowse_errors, {Pid, Reason}), ets:update_counter(ibrowse_test_results, crash, 1), do_wait(Url); Msg -> io:format("Recvd unknown message...~p~n", [Msg]), do_wait(Url) after 1000 -> case ets:info(pid_table, size) of 0 -> done; _ -> catch ibrowse:show_dest_status(Url), catch ibrowse:show_dest_status(), do_wait(Url) end end. do_send_req(Url, NumReqs) -> do_send_req_1(Url, NumReqs). do_send_req_1(_Url, 0) -> ets:delete(pid_table, self()); do_send_req_1(Url, NumReqs) -> Counter = integer_to_list(ets:update_counter(ibrowse_test_results, req_id, 1)), case ibrowse:send_req(Url, [{"ib_req_id", Counter}], get, [], [], 10000) of {ok, _Status, Headers, _Body} -> case lists:keysearch("ib_req_id", 1, Headers) of {value, {_, Counter}} -> ets:update_counter(ibrowse_test_results, success, 1); {value, _} -> ets:update_counter(ibrowse_test_results, trid_mismatch, 1); false -> ets:update_counter(ibrowse_test_results, success_no_trid, 1) end; {error, req_timedout} -> ets:update_counter(ibrowse_test_results, timeout, 1); {error, send_failed} -> ets:update_counter(ibrowse_test_results, send_failed, 1); {error, retry_later} -> ets:update_counter(ibrowse_test_results, retry_later, 1); Err -> ets:insert(ibrowse_errors, {now(), Err}), ets:update_counter(ibrowse_test_results, other_error, 1), ok end, do_send_req_1(Url, NumReqs-1). dump_errors() -> case ets:info(ibrowse_errors, size) of 0 -> ok; _ -> {A, B, C} = now(), Filename = lists:flatten( io_lib:format("ibrowse_errors_~p_~p_~p.txt" , [A, B, C])), case file:open(Filename, [write, delayed_write, raw]) of {ok, Iod} -> dump_errors(ets:first(ibrowse_errors), Iod); Err -> io:format("failed to create file ~s. Reason: ~p~n", [Filename, Err]), ok end end. dump_errors('$end_of_table', Iod) -> file:close(Iod); dump_errors(Key, Iod) -> [{_, Term}] = ets:lookup(ibrowse_errors, Key), file:write(Iod, io_lib:format("~p~n", [Term])), dump_errors(ets:next(ibrowse_errors, Key), Iod). %%------------------------------------------------------------------------------ %% Unit Tests %%------------------------------------------------------------------------------ -define(TEST_LIST, [{"http://intranet/messenger", get}, {"http://www.google.co.uk", get}, {"http://www.google.com", get}, {"http://www.google.com", options}, {"https://mail.google.com", get}, {"http://www.sun.com", get}, {"http://www.oracle.com", get}, {"http://www.bbc.co.uk", get}, {"http://www.bbc.co.uk", trace}, {"http://www.bbc.co.uk", options}, {"http://yaws.hyber.org", get}, {"http://jigsaw.w3.org/HTTP/ChunkedScript", get}, {"http://jigsaw.w3.org/HTTP/TE/foo.txt", get}, {"http://jigsaw.w3.org/HTTP/TE/bar.txt", get}, {"http://jigsaw.w3.org/HTTP/connection.html", get}, {"http://jigsaw.w3.org/HTTP/cc.html", get}, {"http://jigsaw.w3.org/HTTP/cc-private.html", get}, {"http://jigsaw.w3.org/HTTP/cc-proxy-revalidate.html", get}, {"http://jigsaw.w3.org/HTTP/cc-nocache.html", get}, {"http://jigsaw.w3.org/HTTP/h-content-md5.html", get}, {"http://jigsaw.w3.org/HTTP/h-retry-after.html", get}, {"http://jigsaw.w3.org/HTTP/h-retry-after-date.html", get}, {"http://jigsaw.w3.org/HTTP/neg", get}, {"http://jigsaw.w3.org/HTTP/negbad", get}, {"http://jigsaw.w3.org/HTTP/400/toolong/", get}, {"http://jigsaw.w3.org/HTTP/300/", get}, {"http://jigsaw.w3.org/HTTP/Basic/", get, [{basic_auth, {"guest", "guest"}}]}, {"http://jigsaw.w3.org/HTTP/CL/", get}, {"http://www.httpwatch.com/httpgallery/chunked/", get}, {"https://github.com", get, [{ssl_options, [{depth, 2}]}]}, {local_test_fun, test_20122010, []}, {local_test_fun, test_pipeline_head_timeout, []}, {local_test_fun, test_head_transfer_encoding, []}, {local_test_fun, test_head_response_with_body, []} ]). unit_tests() -> unit_tests([]). unit_tests(Options) -> application:start(crypto), application:start(public_key), application:start(ssl), (catch ibrowse_test_server:start_server(8181, tcp)), ibrowse:start(), Options_1 = Options ++ [{connect_timeout, 5000}], Test_timeout = proplists:get_value(test_timeout, Options, 60000), {Pid, Ref} = erlang:spawn_monitor(?MODULE, unit_tests_1, [self(), Options_1]), receive {done, Pid} -> ok; {'DOWN', Ref, _, _, Info} -> io:format("Test process crashed: ~p~n", [Info]) after Test_timeout -> exit(Pid, kill), io:format("Timed out waiting for tests to complete~n", []) end, catch ibrowse_test_server:stop_server(8181), ok. unit_tests_1(Parent, Options) -> lists:foreach(fun({local_test_fun, Fun_name, Args}) -> execute_req(local_test_fun, Fun_name, Args); ({Url, Method}) -> execute_req(Url, Method, Options); ({Url, Method, X_Opts}) -> execute_req(Url, Method, X_Opts ++ Options) end, ?TEST_LIST), Parent ! {done, self()}. verify_chunked_streaming() -> verify_chunked_streaming([]). verify_chunked_streaming(Options) -> io:format("~nVerifying that chunked streaming is working...~n", []), Url = "http://www.httpwatch.com/httpgallery/chunked/", io:format(" URL: ~s~n", [Url]), io:format(" Fetching data without streaming...~n", []), Result_without_streaming = ibrowse:send_req( Url, [], get, [], [{response_format, binary} | Options]), io:format(" Fetching data with streaming as list...~n", []), Async_response_list = do_async_req_list( Url, get, [{response_format, list} | Options]), io:format(" Fetching data with streaming as binary...~n", []), Async_response_bin = do_async_req_list( Url, get, [{response_format, binary} | Options]), io:format(" Fetching data with streaming as binary, {active, once}...~n", []), Async_response_bin_once = do_async_req_list( Url, get, [once, {response_format, binary} | Options]), Res1 = compare_responses(Result_without_streaming, Async_response_list, Async_response_bin), Res2 = compare_responses(Result_without_streaming, Async_response_list, Async_response_bin_once), case {Res1, Res2} of {success, success} -> io:format(" Chunked streaming working~n", []); _ -> ok end. test_chunked_streaming_once() -> test_chunked_streaming_once([]). test_chunked_streaming_once(Options) -> io:format("~nTesting chunked streaming with the {stream_to, {Pid, once}} option...~n", []), Url = "http://www.httpwatch.com/httpgallery/chunked/", io:format(" URL: ~s~n", [Url]), io:format(" Fetching data with streaming as binary, {active, once}...~n", []), case do_async_req_list(Url, get, [once, {response_format, binary} | Options]) of {ok, _, _, _} -> io:format(" Success!~n", []); Err -> io:format(" Fail: ~p~n", [Err]) end. compare_responses({ok, St_code, _, Body}, {ok, St_code, _, Body}, {ok, St_code, _, Body}) -> success; compare_responses({ok, St_code, _, Body_1}, {ok, St_code, _, Body_2}, {ok, St_code, _, Body_3}) -> case Body_1 of Body_2 -> io:format("Body_1 and Body_2 match~n", []); Body_3 -> io:format("Body_1 and Body_3 match~n", []); _ when Body_2 == Body_3 -> io:format("Body_2 and Body_3 match~n", []); _ -> io:format("All three bodies are different!~n", []) end, io:format("Body_1 -> ~p~n", [Body_1]), io:format("Body_2 -> ~p~n", [Body_2]), io:format("Body_3 -> ~p~n", [Body_3]), fail_bodies_mismatch; compare_responses(R1, R2, R3) -> io:format("R1 -> ~p~n", [R1]), io:format("R2 -> ~p~n", [R2]), io:format("R3 -> ~p~n", [R3]), fail. %% do_async_req_list(Url) -> %% do_async_req_list(Url, get). %% do_async_req_list(Url, Method) -> %% do_async_req_list(Url, Method, [{stream_to, self()}, %% {stream_chunk_size, 1000}]). do_async_req_list(Url, Method, Options) -> {Pid,_} = erlang:spawn_monitor(?MODULE, i_do_async_req_list, [self(), Url, Method, Options ++ [{stream_chunk_size, 1000}]]), %% io:format("Spawned process ~p~n", [Pid]), wait_for_resp(Pid). wait_for_resp(Pid) -> receive {async_result, Pid, Res} -> Res; {async_result, Other_pid, _} -> io:format("~p: Waiting for result from ~p: got from ~p~n", [self(), Pid, Other_pid]), wait_for_resp(Pid); {'DOWN', _, _, Pid, Reason} -> {'EXIT', Reason}; {'DOWN', _, _, _, _} -> wait_for_resp(Pid); Msg -> io:format("Recvd unknown message: ~p~n", [Msg]), wait_for_resp(Pid) after 100000 -> {error, timeout} end. i_do_async_req_list(Parent, Url, Method, Options) -> Options_1 = case lists:member(once, Options) of true -> [{stream_to, {self(), once}} | (Options -- [once])]; false -> [{stream_to, self()} | Options] end, Res = ibrowse:send_req(Url, [], Method, [], Options_1), case Res of {ibrowse_req_id, Req_id} -> Result = wait_for_async_resp(Req_id, Options, undefined, undefined, []), Parent ! {async_result, self(), Result}; Err -> Parent ! {async_result, self(), Err} end. wait_for_async_resp(Req_id, Options, Acc_Stat_code, Acc_Headers, Body) -> receive {ibrowse_async_headers, Req_id, StatCode, Headers} -> %% io:format("Recvd headers...~n", []), maybe_stream_next(Req_id, Options), wait_for_async_resp(Req_id, Options, StatCode, Headers, Body); {ibrowse_async_response_end, Req_id} -> %% io:format("Recvd end of response.~n", []), Body_1 = list_to_binary(lists:reverse(Body)), {ok, Acc_Stat_code, Acc_Headers, Body_1}; {ibrowse_async_response, Req_id, Data} -> maybe_stream_next(Req_id, Options), %% io:format("Recvd data...~n", []), wait_for_async_resp(Req_id, Options, Acc_Stat_code, Acc_Headers, [Data | Body]); {ibrowse_async_response, Req_id, {error, _} = Err} -> {ok, Acc_Stat_code, Acc_Headers, Err}; Err -> {ok, Acc_Stat_code, Acc_Headers, Err} after 10000 -> {timeout, Acc_Stat_code, Acc_Headers, Body} end. maybe_stream_next(Req_id, Options) -> case lists:member(once, Options) of true -> ibrowse:stream_next(Req_id); false -> ok end. execute_req(local_test_fun, Method, Args) -> io:format(" ~-54.54w: ", [Method]), Result = (catch apply(?MODULE, Method, Args)), io:format("~p~n", [Result]); execute_req(Url, Method, Options) -> io:format("~7.7w, ~50.50s: ", [Method, Url]), Result = (catch ibrowse:send_req(Url, [], Method, [], Options)), case Result of {ok, SCode, _H, _B} -> io:format("Status code: ~p~n", [SCode]); Err -> io:format("~p~n", [Err]) end. ue_test() -> ue_test(lists:duplicate(1024, $?)). ue_test(Data) -> {Time, Res} = timer:tc(ibrowse_lib, url_encode, [Data]), io:format("Time -> ~p~n", [Time]), io:format("Data Length -> ~p~n", [length(Data)]), io:format("Res Length -> ~p~n", [length(Res)]). % io:format("Result -> ~s~n", [Res]). log_msg(Fmt, Args) -> io:format("~s -- " ++ Fmt, [ibrowse_lib:printable_date() | Args]). %%------------------------------------------------------------------------------ %% Test what happens when the response to a HEAD request is a %% Chunked-Encoding response with a non-empty body. Issue #67 on %% Github %% ------------------------------------------------------------------------------ test_head_transfer_encoding() -> clear_msg_q(), test_head_transfer_encoding("http://localhost:8181/ibrowse_head_test"). test_head_transfer_encoding(Url) -> case ibrowse:send_req(Url, [], head) of {ok, "200", _, _} -> success; Res -> {test_failed, Res} end. %%------------------------------------------------------------------------------ %% Test what happens when the response to a HEAD request is a %% Chunked-Encoding response with a non-empty body. Issue #67 on %% Github %% ------------------------------------------------------------------------------ test_head_response_with_body() -> clear_msg_q(), test_head_response_with_body("http://localhost:8181/ibrowse_head_transfer_enc"). test_head_response_with_body(Url) -> case ibrowse:send_req(Url, [], head, [], [{workaround, head_response_with_body}]) of {ok, "400", _, _} -> success; Res -> {test_failed, Res} end. %%------------------------------------------------------------------------------ %% Test what happens when the request at the head of a pipeline times out %%------------------------------------------------------------------------------ test_pipeline_head_timeout() -> clear_msg_q(), test_pipeline_head_timeout("http://localhost:8181/ibrowse_inac_timeout_test"). test_pipeline_head_timeout(Url) -> {ok, Pid} = ibrowse:spawn_worker_process(Url), Test_parent = self(), Fun = fun({fixed, Timeout}) -> spawn(fun() -> do_test_pipeline_head_timeout(Url, Pid, Test_parent, Timeout) end); (Timeout_mult) -> spawn(fun() -> Timeout = 1000 + Timeout_mult*1000, do_test_pipeline_head_timeout(Url, Pid, Test_parent, Timeout) end) end, Pids = [Fun(X) || X <- [{fixed, 32000} | lists:seq(1,10)]], Result = accumulate_worker_resp(Pids), case lists:all(fun({_, X_res}) -> X_res == {error,req_timedout} end, Result) of true -> success; false -> {test_failed, Result} end. do_test_pipeline_head_timeout(Url, Pid, Test_parent, Req_timeout) -> Resp = ibrowse:send_req_direct( Pid, Url, [], get, [], [{socket_options,[{keepalive,true}]}, {inactivity_timeout,180000}, {connect_timeout,180000}], Req_timeout), Test_parent ! {self(), Resp}. accumulate_worker_resp(Pids) -> accumulate_worker_resp(Pids, []). accumulate_worker_resp([_ | _] = Pids, Acc) -> receive {Pid, Res} when is_pid(Pid) -> accumulate_worker_resp(Pids -- [Pid], [{Pid, Res} | Acc]); Err -> io:format("Received unexpected: ~p~n", [Err]) end; accumulate_worker_resp([], Acc) -> lists:reverse(Acc). clear_msg_q() -> receive _ -> clear_msg_q() after 0 -> ok end. %%------------------------------------------------------------------------------ %% %%------------------------------------------------------------------------------ test_20122010() -> test_20122010("http://localhost:8181"). test_20122010(Url) -> {ok, Pid} = ibrowse:spawn_worker_process(Url), Expected_resp = <<"1-2-3-4-5-6-7-8-9-10-11-12-13-14-15-16-17-18-19-20-21-22-23-24-25-26-27-28-29-30-31-32-33-34-35-36-37-38-39-40-41-42-43-44-45-46-47-48-49-50-51-52-53-54-55-56-57-58-59-60-61-62-63-64-65-66-67-68-69-70-71-72-73-74-75-76-77-78-79-80-81-82-83-84-85-86-87-88-89-90-91-92-93-94-95-96-97-98-99-100">>, Test_parent = self(), Fun = fun() -> do_test_20122010(Url, Pid, Expected_resp, Test_parent) end, Pids = [erlang:spawn_monitor(Fun) || _ <- lists:seq(1,10)], wait_for_workers(Pids). wait_for_workers([{Pid, _Ref} | Pids]) -> receive {Pid, success} -> wait_for_workers(Pids) after 60000 -> test_failed end; wait_for_workers([]) -> success. do_test_20122010(Url, Pid, Expected_resp, Test_parent) -> do_test_20122010(10, Url, Pid, Expected_resp, Test_parent). do_test_20122010(0, _Url, _Pid, _Expected_resp, Test_parent) -> Test_parent ! {self(), success}; do_test_20122010(Rem_count, Url, Pid, Expected_resp, Test_parent) -> {ibrowse_req_id, Req_id} = ibrowse:send_req_direct( Pid, Url ++ "/ibrowse_stream_once_chunk_pipeline_test", [], get, [], [{stream_to, {self(), once}}, {inactivity_timeout, 10000}, {include_ibrowse_req_id, true}]), do_trace("~p -- sent request ~1000.p~n", [self(), Req_id]), Req_id_str = lists:flatten(io_lib:format("~1000.p",[Req_id])), receive {ibrowse_async_headers, Req_id, "200", Headers} -> case lists:keysearch("x-ibrowse-request-id", 1, Headers) of {value, {_, Req_id_str}} -> ok; {value, {_, Req_id_1}} -> do_trace("~p -- Sent req-id: ~1000.p. Recvd: ~1000.p~n", [self(), Req_id, Req_id_1]), exit(req_id_mismatch) end after 5000 -> do_trace("~p -- response headers not received~n", [self()]), exit({timeout, test_failed}) end, do_trace("~p -- response headers received~n", [self()]), ok = ibrowse:stream_next(Req_id), case do_test_20122010_1(Expected_resp, Req_id, []) of true -> do_test_20122010(Rem_count - 1, Url, Pid, Expected_resp, Test_parent); false -> Test_parent ! {self(), failed} end. do_test_20122010_1(Expected_resp, Req_id, Acc) -> receive {ibrowse_async_response, Req_id, Body_part} -> ok = ibrowse:stream_next(Req_id), do_test_20122010_1(Expected_resp, Req_id, [Body_part | Acc]); {ibrowse_async_response_end, Req_id} -> Acc_1 = list_to_binary(lists:reverse(Acc)), Result = Acc_1 == Expected_resp, do_trace("~p -- End of response. Result: ~p~n", [self(), Result]), Result after 1000 -> exit({timeout, test_failed}) end. do_trace(Fmt, Args) -> do_trace(get(my_trace_flag), Fmt, Args). do_trace(true, Fmt, Args) -> io:format("~s -- " ++ Fmt, [ibrowse_lib:printable_date() | Args]); do_trace(_, _, _) -> ok. apache-couchdb-1.6.0/src/ibrowse/ibrowse.app.in0000644000175000001440000000035612332105522021344 0ustar00djcusers00000000000000{application, ibrowse, [{description, "Erlang HTTP client application"}, {vsn, "4.0.1"}, {registered, [ibrowse_sup, ibrowse]}, {applications, [kernel,stdlib]}, {env, []}, {mod, {ibrowse_app, []}}]}. apache-couchdb-1.6.0/src/ibrowse/ibrowse_socks5.erl0000644000175000001440000000667112332105522022236 0ustar00djcusers00000000000000% Licensed under the Apache License, Version 2.0 (the "License"); you may not % use this file except in compliance with the License. You may obtain a copy of % the License at % % http://www.apache.org/licenses/LICENSE-2.0 % % Unless required by applicable law or agreed to in writing, software % distributed under the License is distributed on an "AS IS" BASIS, WITHOUT % WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the % License for the specific language governing permissions and limitations under % the License. -module(ibrowse_socks5). -define(VERSION, 5). -define(CONNECT, 1). -define(NO_AUTH, 0). -define(USERPASS, 2). -define(UNACCEPTABLE, 16#FF). -define(RESERVED, 0). -define(ATYP_IPV4, 1). -define(ATYP_DOMAINNAME, 3). -define(ATYP_IPV6, 4). -define(SUCCEEDED, 0). -export([connect/5]). -import(ibrowse_lib, [get_value/2, get_value/3]). connect(TargetHost, TargetPort, ProxyOptions, Options, Timeout) -> case gen_tcp:connect(get_value(host, ProxyOptions), get_value(port, ProxyOptions), Options, Timeout) of {ok, Socket} -> case handshake(Socket, Options) of ok -> case connect(TargetHost, TargetPort, Socket) of ok -> maybe_ssl(Socket, ProxyOptions, Timeout); Else -> gen_tcp:close(Socket), Else end; Else -> gen_tcp:close(Socket), Else end; Else -> Else end. handshake(Socket, ProxyOptions) when is_port(Socket) -> {Handshake, Success} = case get_value(user, ProxyOptions, <<>>) of <<>> -> {<>, ?NO_AUTH}; User -> Password = get_value(password, ProxyOptions, <<>>), {<>, ?USERPASS} end, ok = gen_tcp:send(Socket, Handshake), case gen_tcp:recv(Socket, 0) of {ok, <>} -> ok; {ok, <>} -> {error, unacceptable}; {error, Reason} -> {error, Reason} end. connect(Host, Port, Via) when is_list(Host) -> connect(list_to_binary(Host), Port, Via); connect(Host, Port, Via) when is_binary(Host), is_integer(Port), is_port(Via) -> ok = gen_tcp:send(Via, <>), case gen_tcp:recv(Via, 0) of {ok, <>} -> ok; {ok, <>} -> {error, rep(Rep)}; {error, Reason} -> {error, Reason} end. maybe_ssl(Socket, ProxyOptions, Timeout) -> IsSsl = get_value(is_ssl, ProxyOptions, false), SslOpts = get_value(ssl_opts, ProxyOptions, []), case IsSsl of false -> {ok, Socket}; true -> ssl:connect(Socket, SslOpts, Timeout) end. rep(0) -> succeeded; rep(1) -> server_fail; rep(2) -> disallowed_by_ruleset; rep(3) -> network_unreachable; rep(4) -> host_unreachable; rep(5) -> connection_refused; rep(6) -> ttl_expired; rep(7) -> command_not_supported; rep(8) -> address_type_not_supported. apache-couchdb-1.6.0/src/ibrowse/ibrowse.erl0000644000175000001440000011170012332105522020735 0ustar00djcusers00000000000000%%%------------------------------------------------------------------- %%% File : ibrowse.erl %%% Author : Chandrashekhar Mullaparthi %%% Description : Load balancer process for HTTP client connections. %%% %%% Created : 11 Oct 2003 by Chandrashekhar Mullaparthi %%%------------------------------------------------------------------- %% @author Chandrashekhar Mullaparthi %% @copyright 2005-2012 Chandrashekhar Mullaparthi %% @doc The ibrowse application implements an HTTP 1.1 client in erlang. This %% module implements the API of the HTTP client. There is one named %% process called 'ibrowse' which assists in load balancing and maintaining configuration. There is one load balancing process per unique webserver. There is %% one process to handle one TCP connection to a webserver %% (implemented in the module ibrowse_http_client). Multiple connections to a %% webserver are setup based on the settings for each webserver. The %% ibrowse process also determines which connection to pipeline a %% certain request on. The functions to call are send_req/3, %% send_req/4, send_req/5, send_req/6. %% %%

    Here are a few sample invocations.

    %% %% %% ibrowse:send_req("http://intranet/messenger/", [], get). %%

    %% %% ibrowse:send_req("http://www.google.com/", [], get, [], %% [{proxy_user, "XXXXX"}, %% {proxy_password, "XXXXX"}, %% {proxy_host, "proxy"}, %% {proxy_port, 8080}], 1000). %%

    %% %%ibrowse:send_req("http://www.erlang.org/download/otp_src_R10B-3.tar.gz", [], get, [], %% [{proxy_user, "XXXXX"}, %% {proxy_password, "XXXXX"}, %% {proxy_host, "proxy"}, %% {proxy_port, 8080}, %% {save_response_to_file, true}], 1000). %%

    %% %% ibrowse:send_req("http://www.erlang.org", [], head). %% %%

    %% ibrowse:send_req("http://www.sun.com", [], options). %% %%

    %% ibrowse:send_req("http://www.bbc.co.uk", [], trace). %% %%

    %% ibrowse:send_req("http://www.google.com", [], get, [], %% [{stream_to, self()}]). %%
    %% -module(ibrowse). -behaviour(gen_server). %%-------------------------------------------------------------------- %% Include files %%-------------------------------------------------------------------- %%-------------------------------------------------------------------- %% External exports -export([start_link/0, start/0, stop/0]). %% gen_server callbacks -export([init/1, handle_call/3, handle_cast/2, handle_info/2, terminate/2, code_change/3]). %% API interface -export([ rescan_config/0, rescan_config/1, add_config/1, get_config_value/1, get_config_value/2, spawn_worker_process/1, spawn_worker_process/2, spawn_link_worker_process/1, spawn_link_worker_process/2, stop_worker_process/1, send_req/3, send_req/4, send_req/5, send_req/6, send_req_direct/4, send_req_direct/5, send_req_direct/6, send_req_direct/7, stream_next/1, stream_close/1, set_max_sessions/3, set_max_pipeline_size/3, set_dest/3, trace_on/0, trace_off/0, trace_on/2, trace_off/2, all_trace_off/0, show_dest_status/0, show_dest_status/1, show_dest_status/2, get_metrics/0, get_metrics/2 ]). -ifdef(debug). -compile(export_all). -endif. -import(ibrowse_lib, [ parse_url/1, get_value/3, do_trace/2 ]). -record(state, {trace = false}). -include("ibrowse.hrl"). -include_lib("stdlib/include/ms_transform.hrl"). -define(DEF_MAX_SESSIONS,10). -define(DEF_MAX_PIPELINE_SIZE,10). %%==================================================================== %% External functions %%==================================================================== %%-------------------------------------------------------------------- %% Function: start_link/0 %% Description: Starts the server %%-------------------------------------------------------------------- %% @doc Starts the ibrowse process linked to the calling process. Usually invoked by the supervisor ibrowse_sup %% @spec start_link() -> {ok, pid()} start_link() -> gen_server:start_link({local, ?MODULE}, ?MODULE, [], []). %% @doc Starts the ibrowse process without linking. Useful when testing using the shell start() -> gen_server:start({local, ?MODULE}, ?MODULE, [], [{debug, []}]). %% @doc Stop the ibrowse process. Useful when testing using the shell. stop() -> case catch gen_server:call(ibrowse, stop) of {'EXIT',{noproc,_}} -> ok; Res -> Res end. %% @doc This is the basic function to send a HTTP request. %% The Status return value indicates the HTTP status code returned by the webserver %% @spec send_req(Url::string(), Headers::headerList(), Method::method()) -> response() %% headerList() = [{header(), value()}] %% header() = atom() | string() %% value() = term() %% method() = get | post | head | options | put | delete | trace | mkcol | propfind | proppatch | lock | unlock | move | copy %% Status = string() %% ResponseHeaders = [respHeader()] %% respHeader() = {headerName(), headerValue()} %% headerName() = string() %% headerValue() = string() %% response() = {ok, Status, ResponseHeaders, ResponseBody} | {ibrowse_req_id, req_id() } | {error, Reason} %% req_id() = term() %% ResponseBody = string() | {file, Filename} %% Reason = term() send_req(Url, Headers, Method) -> send_req(Url, Headers, Method, [], []). %% @doc Same as send_req/3. %% If a list is specified for the body it has to be a flat list. The body can also be a fun/0 or a fun/1.
    %% If fun/0, the connection handling process will repeatdely call the fun until it returns an error or eof.
    Fun() = {ok, Data} | eof

    %% If fun/1, the connection handling process will repeatedly call the fun with the supplied state until it returns an error or eof.
    Fun(State) = {ok, Data} | {ok, Data, NewState} | eof
    %% @spec send_req(Url, Headers, Method::method(), Body::body()) -> response() %% body() = [] | string() | binary() | fun_arity_0() | {fun_arity_1(), initial_state()} %% initial_state() = term() send_req(Url, Headers, Method, Body) -> send_req(Url, Headers, Method, Body, []). %% @doc Same as send_req/4. %% For a description of SSL Options, look in the ssl manpage. If the %% HTTP Version to use is not specified, the default is 1.1. %%
    %%
      %%
    • The host_header option is useful in the case where ibrowse is %% connecting to a component such as stunnel which then sets up a %% secure connection to a webserver. In this case, the URL supplied to %% ibrowse must have the stunnel host/port details, but that won't %% make sense to the destination webserver. This option can then be %% used to specify what should go in the Host header in %% the request.
    • %%
    • The stream_to option can be used to have the HTTP %% response streamed to a process as messages as data arrives on the %% socket. If the calling process wishes to control the rate at which %% data is received from the server, the option {stream_to, %% {process(), once}} can be specified. The calling process %% will have to invoke ibrowse:stream_next(Request_id) to %% receive the next packet.
    • %% %%
    • When both the options save_response_to_file and stream_to %% are specified, the former takes precedence.
    • %% %%
    • For the save_response_to_file option, the response body is saved to %% file only if the status code is in the 200-299 range. If not, the response body is returned %% as a string.
    • %%
    • Whenever an error occurs in the processing of a request, ibrowse will return as much %% information as it has, such as HTTP Status Code and HTTP Headers. When this happens, the response %% is of the form {error, {Reason, {stat_code, StatusCode}, HTTP_headers}}
    • %% %%
    • The inactivity_timeout option is useful when %% dealing with large response bodies and/or slow links. In these %% cases, it might be hard to estimate how long a request will take to %% complete. In such cases, the client might want to timeout if no %% data has been received on the link for a certain time interval. %% %% This value is also used to close connections which are not in use for %% the specified timeout value. %%
    • %% %%
    • %% The connect_timeout option is to specify how long the %% client process should wait for connection establishment. This is %% useful in scenarios where connections to servers are usually setup %% very fast, but responses might take much longer compared to %% connection setup. In such cases, it is better for the calling %% process to timeout faster if there is a problem (DNS lookup %% delays/failures, network routing issues, etc). The total timeout %% value specified for the request will enforced. To illustrate using %% an example: %% %% ibrowse:send_req("http://www.example.com/cgi-bin/request", [], get, [], [{connect_timeout, 100}], 1000). %% %% In the above invocation, if the connection isn't established within %% 100 milliseconds, the request will fail with %% {error, conn_failed}.
      %% If connection setup succeeds, the total time allowed for the %% request to complete will be 1000 milliseconds minus the time taken %% for connection setup. %%
    • %% %%
    • The socket_options option can be used to set %% specific options on the socket. The {active, true | false | once} %% and {packet_type, Packet_type} will be filtered out by ibrowse.
    • %% %%
    • The headers_as_is option is to enable the caller %% to send headers exactly as specified in the request without ibrowse %% adding some of its own. Required for some picky servers apparently.
    • %% %%
    • The give_raw_headers option is to enable the %% caller to get access to the raw status line and raw unparsed %% headers. Not quite sure why someone would want this, but one of my %% users asked for it, so here it is.
    • %% %%
    • The preserve_chunked_encoding option enables the caller %% to receive the raw data stream when the Transfer-Encoding of the server %% response is Chunked. %%
    • %%
    %% %% @spec send_req(Url::string(), Headers::headerList(), Method::method(), Body::body(), Options::optionList()) -> response() %% optionList() = [option()] %% option() = {max_sessions, integer()} | %% {response_format,response_format()}| %% {stream_chunk_size, integer()} | %% {max_pipeline_size, integer()} | %% {trace, boolean()} | %% {is_ssl, boolean()} | %% {ssl_options, [SSLOpt]} | %% {pool_name, atom()} | %% {proxy_host, string()} | %% {proxy_port, integer()} | %% {proxy_user, string()} | %% {proxy_password, string()} | %% {use_absolute_uri, boolean()} | %% {basic_auth, {username(), password()}} | %% {cookie, string()} | %% {content_length, integer()} | %% {content_type, string()} | %% {save_response_to_file, srtf()} | %% {stream_to, stream_to()} | %% {http_vsn, {MajorVsn, MinorVsn}} | %% {host_header, string()} | %% {inactivity_timeout, integer()} | %% {connect_timeout, integer()} | %% {socket_options, Sock_opts} | %% {transfer_encoding, {chunked, ChunkSize}} | %% {headers_as_is, boolean()} | %% {give_raw_headers, boolean()} | %% {preserve_chunked_encoding,boolean()} | %% {workaround, head_response_with_body} %% %% stream_to() = process() | {process(), once} %% process() = pid() | atom() %% username() = string() %% password() = string() %% SSLOpt = term() %% Sock_opts = [Sock_opt] %% Sock_opt = term() %% ChunkSize = integer() %% srtf() = boolean() | filename() | {append, filename()} %% filename() = string() %% response_format() = list | binary send_req(Url, Headers, Method, Body, Options) -> send_req(Url, Headers, Method, Body, Options, 30000). %% @doc Same as send_req/5. %% All timeout values are in milliseconds. %% @spec send_req(Url, Headers::headerList(), Method::method(), Body::body(), Options::optionList(), Timeout) -> response() %% Timeout = integer() | infinity send_req(Url, Headers, Method, Body, Options, Timeout) -> case catch parse_url(Url) of #url{host = Host, port = Port, protocol = Protocol} = Parsed_url -> Lb_pid = case ets:lookup(ibrowse_lb, {Host, Port}) of [] -> get_lb_pid(Parsed_url); [#lb_pid{pid = Lb_pid_1}] -> Lb_pid_1 end, Max_sessions = get_max_sessions(Host, Port, Options), Max_pipeline_size = get_max_pipeline_size(Host, Port, Options), Options_1 = merge_options(Host, Port, Options), {SSLOptions, IsSSL} = case (Protocol == https) orelse get_value(is_ssl, Options_1, false) of false -> {[], false}; true -> {get_value(ssl_options, Options_1, []), true} end, try_routing_request(Lb_pid, Parsed_url, Max_sessions, Max_pipeline_size, {SSLOptions, IsSSL}, Headers, Method, Body, Options_1, Timeout, 0); Err -> {error, {url_parsing_failed, Err}} end. try_routing_request(Lb_pid, Parsed_url, Max_sessions, Max_pipeline_size, {SSLOptions, IsSSL}, Headers, Method, Body, Options_1, Timeout, Try_count) when Try_count < 3 -> case ibrowse_lb:spawn_connection(Lb_pid, Parsed_url, Max_sessions, Max_pipeline_size, {SSLOptions, IsSSL}) of {ok, Conn_Pid} -> case do_send_req(Conn_Pid, Parsed_url, Headers, Method, Body, Options_1, Timeout) of {error, sel_conn_closed} -> try_routing_request(Lb_pid, Parsed_url, Max_sessions, Max_pipeline_size, {SSLOptions, IsSSL}, Headers, Method, Body, Options_1, Timeout, Try_count + 1); Res -> Res end; Err -> Err end; try_routing_request(_, _, _, _, _, _, _, _, _, _, _) -> {error, retry_later}. merge_options(Host, Port, Options) -> Config_options = get_config_value({options, Host, Port}, []) ++ get_config_value({options, global}, []), lists:foldl( fun({Key, Val}, Acc) -> case lists:keysearch(Key, 1, Options) of false -> [{Key, Val} | Acc]; _ -> Acc end end, Options, Config_options). get_lb_pid(Url) -> gen_server:call(?MODULE, {get_lb_pid, Url}). get_max_sessions(Host, Port, Options) -> get_value(max_sessions, Options, get_config_value({max_sessions, Host, Port}, default_max_sessions())). get_max_pipeline_size(Host, Port, Options) -> get_value(max_pipeline_size, Options, get_config_value({max_pipeline_size, Host, Port}, default_max_pipeline_size())). default_max_sessions() -> safe_get_env(ibrowse, default_max_sessions, ?DEF_MAX_SESSIONS). default_max_pipeline_size() -> safe_get_env(ibrowse, default_max_pipeline_size, ?DEF_MAX_PIPELINE_SIZE). safe_get_env(App, Key, Def_val) -> case application:get_env(App, Key) of undefined -> Def_val; {ok, Val} -> Val end. %% @doc Deprecated. Use set_max_sessions/3 and set_max_pipeline_size/3 %% for achieving the same effect. set_dest(Host, Port, [{max_sessions, Max} | T]) -> set_max_sessions(Host, Port, Max), set_dest(Host, Port, T); set_dest(Host, Port, [{max_pipeline_size, Max} | T]) -> set_max_pipeline_size(Host, Port, Max), set_dest(Host, Port, T); set_dest(Host, Port, [{trace, Bool} | T]) when Bool == true; Bool == false -> ibrowse ! {trace, true, Host, Port}, set_dest(Host, Port, T); set_dest(_Host, _Port, [H | _]) -> exit({invalid_option, H}); set_dest(_, _, []) -> ok. %% @doc Set the maximum number of connections allowed to a specific Host:Port. %% @spec set_max_sessions(Host::string(), Port::integer(), Max::integer()) -> ok set_max_sessions(Host, Port, Max) when is_integer(Max), Max > 0 -> gen_server:call(?MODULE, {set_config_value, {max_sessions, Host, Port}, Max}). %% @doc Set the maximum pipeline size for each connection to a specific Host:Port. %% @spec set_max_pipeline_size(Host::string(), Port::integer(), Max::integer()) -> ok set_max_pipeline_size(Host, Port, Max) when is_integer(Max), Max > 0 -> gen_server:call(?MODULE, {set_config_value, {max_pipeline_size, Host, Port}, Max}). do_send_req(Conn_Pid, Parsed_url, Headers, Method, Body, Options, Timeout) -> case catch ibrowse_http_client:send_req(Conn_Pid, Parsed_url, Headers, Method, ensure_bin(Body), Options, Timeout) of {'EXIT', {timeout, _}} -> {error, req_timedout}; {'EXIT', {noproc, {gen_server, call, [Conn_Pid, _, _]}}} -> {error, sel_conn_closed}; {'EXIT', {normal, _}} -> {error, req_timedout}; {error, connection_closed} -> {error, sel_conn_closed}; {'EXIT', Reason} -> {error, {'EXIT', Reason}}; {ok, St_code, Headers, Body} = Ret when is_binary(Body) -> case get_value(response_format, Options, list) of list -> {ok, St_code, Headers, binary_to_list(Body)}; binary -> Ret end; Ret -> Ret end. ensure_bin(L) when is_list(L) -> list_to_binary(L); ensure_bin(B) when is_binary(B) -> B; ensure_bin(Fun) when is_function(Fun) -> Fun; ensure_bin({Fun}) when is_function(Fun) -> Fun; ensure_bin({Fun, _} = Body) when is_function(Fun) -> Body. %% @doc Creates a HTTP client process to the specified Host:Port which %% is not part of the load balancing pool. This is useful in cases %% where some requests to a webserver might take a long time whereas %% some might take a very short time. To avoid getting these quick %% requests stuck in the pipeline behind time consuming requests, use %% this function to get a handle to a connection process.
    %% Note: Calling this function only creates a worker process. No connection %% is setup. The connection attempt is made only when the first %% request is sent via any of the send_req_direct/4,5,6,7 functions.
    %% Note: It is the responsibility of the calling process to control %% pipeline size on such connections. %% %% @spec spawn_worker_process(Url::string()) -> {ok, pid()} spawn_worker_process(Url) -> ibrowse_http_client:start(Url). %% @doc Same as spawn_worker_process/1 but takes as input a Host and Port %% instead of a URL. %% @spec spawn_worker_process(Host::string(), Port::integer()) -> {ok, pid()} spawn_worker_process(Host, Port) -> ibrowse_http_client:start({Host, Port}). %% @doc Same as spawn_worker_process/1 except the the calling process %% is linked to the worker process which is spawned. %% @spec spawn_link_worker_process(Url::string()) -> {ok, pid()} spawn_link_worker_process(Url) -> ibrowse_http_client:start_link(Url). %% @doc Same as spawn_worker_process/2 except the the calling process %% is linked to the worker process which is spawned. %% @spec spawn_link_worker_process(Host::string(), Port::integer()) -> {ok, pid()} spawn_link_worker_process(Host, Port) -> ibrowse_http_client:start_link({Host, Port}). %% @doc Terminate a worker process spawned using %% spawn_worker_process/2 or spawn_link_worker_process/2. Requests in %% progress will get the error response
    {error, closing_on_request}
    %% @spec stop_worker_process(Conn_pid::pid()) -> ok stop_worker_process(Conn_pid) -> ibrowse_http_client:stop(Conn_pid). %% @doc Same as send_req/3 except that the first argument is the PID %% returned by spawn_worker_process/2 or spawn_link_worker_process/2 send_req_direct(Conn_pid, Url, Headers, Method) -> send_req_direct(Conn_pid, Url, Headers, Method, [], []). %% @doc Same as send_req/4 except that the first argument is the PID %% returned by spawn_worker_process/2 or spawn_link_worker_process/2 send_req_direct(Conn_pid, Url, Headers, Method, Body) -> send_req_direct(Conn_pid, Url, Headers, Method, Body, []). %% @doc Same as send_req/5 except that the first argument is the PID %% returned by spawn_worker_process/2 or spawn_link_worker_process/2 send_req_direct(Conn_pid, Url, Headers, Method, Body, Options) -> send_req_direct(Conn_pid, Url, Headers, Method, Body, Options, 30000). %% @doc Same as send_req/6 except that the first argument is the PID %% returned by spawn_worker_process/2 or spawn_link_worker_process/2 send_req_direct(Conn_pid, Url, Headers, Method, Body, Options, Timeout) -> case catch parse_url(Url) of #url{host = Host, port = Port} = Parsed_url -> Options_1 = merge_options(Host, Port, Options), case do_send_req(Conn_pid, Parsed_url, Headers, Method, Body, Options_1, Timeout) of {error, {'EXIT', {noproc, _}}} -> {error, worker_is_dead}; Ret -> Ret end; Err -> {error, {url_parsing_failed, Err}} end. %% @doc Tell ibrowse to stream the next chunk of data to the %% caller. Should be used in conjunction with the %% stream_to option %% @spec stream_next(Req_id :: req_id()) -> ok | {error, unknown_req_id} stream_next(Req_id) -> case ets:lookup(ibrowse_stream, {req_id_pid, Req_id}) of [] -> {error, unknown_req_id}; [{_, Pid}] -> catch Pid ! {stream_next, Req_id}, ok end. %% @doc Tell ibrowse to close the connection associated with the %% specified stream. Should be used in conjunction with the %% stream_to option. Note that all requests in progress on %% the connection which is serving this Req_id will be aborted, and an %% error returned. %% @spec stream_close(Req_id :: req_id()) -> ok | {error, unknown_req_id} stream_close(Req_id) -> case ets:lookup(ibrowse_stream, {req_id_pid, Req_id}) of [] -> {error, unknown_req_id}; [{_, Pid}] -> catch Pid ! {stream_close, Req_id}, ok end. %% @doc Turn tracing on for the ibrowse process trace_on() -> ibrowse ! {trace, true}. %% @doc Turn tracing off for the ibrowse process trace_off() -> ibrowse ! {trace, false}. %% @doc Turn tracing on for all connections to the specified HTTP %% server. Host is whatever is specified as the domain name in the URL %% @spec trace_on(Host, Port) -> ok %% Host = string() %% Port = integer() trace_on(Host, Port) -> ibrowse ! {trace, true, Host, Port}, ok. %% @doc Turn tracing OFF for all connections to the specified HTTP %% server. %% @spec trace_off(Host, Port) -> ok trace_off(Host, Port) -> ibrowse ! {trace, false, Host, Port}, ok. %% @doc Turn Off ALL tracing %% @spec all_trace_off() -> ok all_trace_off() -> ibrowse ! all_trace_off, ok. %% @doc Shows some internal information about load balancing. Info %% about workers spawned using spawn_worker_process/2 or %% spawn_link_worker_process/2 is not included. show_dest_status() -> io:format("~-40.40s | ~-5.5s | ~-10.10s | ~s~n", ["Server:port", "ETS", "Num conns", "LB Pid"]), io:format("~80.80.=s~n", [""]), Metrics = get_metrics(), lists:foreach( fun({Host, Port, Lb_pid, Tid, Size}) -> io:format("~40.40s | ~-5.5s | ~-5.5s | ~p~n", [Host ++ ":" ++ integer_to_list(Port), integer_to_list(Tid), integer_to_list(Size), Lb_pid]) end, Metrics). show_dest_status(Url) -> #url{host = Host, port = Port} = ibrowse_lib:parse_url(Url), show_dest_status(Host, Port). %% @doc Shows some internal information about load balancing to a %% specified Host:Port. Info about workers spawned using %% spawn_worker_process/2 or spawn_link_worker_process/2 is not %% included. show_dest_status(Host, Port) -> case get_metrics(Host, Port) of {Lb_pid, MsgQueueSize, Tid, Size, {{First_p_sz, First_speculative_sz}, {Last_p_sz, Last_speculative_sz}}} -> io:format("Load Balancer Pid : ~p~n" "LB process msg q size : ~p~n" "LB ETS table id : ~p~n" "Num Connections : ~p~n" "Smallest pipeline : ~p:~p~n" "Largest pipeline : ~p:~p~n", [Lb_pid, MsgQueueSize, Tid, Size, First_p_sz, First_speculative_sz, Last_p_sz, Last_speculative_sz]); _Err -> io:format("Metrics not available~n", []) end. get_metrics() -> Dests = lists:filter(fun({lb_pid, {Host, Port}, _}) when is_list(Host), is_integer(Port) -> true; (_) -> false end, ets:tab2list(ibrowse_lb)), All_ets = ets:all(), lists:map(fun({lb_pid, {Host, Port}, Lb_pid}) -> case lists:dropwhile( fun(Tid) -> ets:info(Tid, owner) /= Lb_pid end, All_ets) of [] -> {Host, Port, Lb_pid, unknown, 0}; [Tid | _] -> Size = case catch (ets:info(Tid, size)) of N when is_integer(N) -> N; _ -> 0 end, {Host, Port, Lb_pid, Tid, Size} end end, Dests). get_metrics(Host, Port) -> case ets:lookup(ibrowse_lb, {Host, Port}) of [] -> no_active_processes; [#lb_pid{pid = Lb_pid}] -> MsgQueueSize = (catch process_info(Lb_pid, message_queue_len)), %% {Lb_pid, MsgQueueSize, case lists:dropwhile( fun(Tid) -> ets:info(Tid, owner) /= Lb_pid end, ets:all()) of [] -> {Lb_pid, MsgQueueSize, unknown, 0, unknown}; [Tid | _] -> try Size = ets:info(Tid, size), case Size of 0 -> ok; _ -> First = ets:first(Tid), Last = ets:last(Tid), [{_, First_p_sz, First_speculative_sz}] = ets:lookup(Tid, First), [{_, Last_p_sz, Last_speculative_sz}] = ets:lookup(Tid, Last), {Lb_pid, MsgQueueSize, Tid, Size, {{First_p_sz, First_speculative_sz}, {Last_p_sz, Last_speculative_sz}}} end catch _:_ -> not_available end end end. %% @doc Clear current configuration for ibrowse and load from the file %% ibrowse.conf in the IBROWSE_EBIN/../priv directory. Current %% configuration is cleared only if the ibrowse.conf file is readable %% using file:consult/1 rescan_config() -> gen_server:call(?MODULE, rescan_config). %% Clear current configuration for ibrowse and load from the specified %% file. Current configuration is cleared only if the specified %% file is readable using file:consult/1 rescan_config([{_,_}|_]=Terms) -> gen_server:call(?MODULE, {rescan_config_terms, Terms}); rescan_config(File) when is_list(File) -> gen_server:call(?MODULE, {rescan_config, File}). %% @doc Add additional configuration elements at runtime. add_config([{_,_}|_]=Terms) -> gen_server:call(?MODULE, {add_config_terms, Terms}). %%==================================================================== %% Server functions %%==================================================================== %%-------------------------------------------------------------------- %% Function: init/1 %% Description: Initiates the server %% Returns: {ok, State} | %% {ok, State, Timeout} | %% ignore | %% {stop, Reason} %%-------------------------------------------------------------------- init(_) -> process_flag(trap_exit, true), State = #state{}, put(my_trace_flag, State#state.trace), put(ibrowse_trace_token, "ibrowse"), ibrowse_lb = ets:new(ibrowse_lb, [named_table, public, {keypos, 2}]), ibrowse_conf = ets:new(ibrowse_conf, [named_table, protected, {keypos, 2}]), ibrowse_stream = ets:new(ibrowse_stream, [named_table, public]), import_config(), {ok, #state{}}. import_config() -> case code:priv_dir(ibrowse) of {error, _} -> ok; PrivDir -> Filename = filename:join(PrivDir, "ibrowse.conf"), import_config(Filename) end. import_config(Filename) -> case file:consult(Filename) of {ok, Terms} -> apply_config(Terms); _Err -> ok end. apply_config(Terms) -> ets:delete_all_objects(ibrowse_conf), insert_config(Terms). insert_config(Terms) -> Fun = fun({dest, Host, Port, MaxSess, MaxPipe, Options}) when is_list(Host), is_integer(Port), is_integer(MaxSess), MaxSess > 0, is_integer(MaxPipe), MaxPipe > 0, is_list(Options) -> I = [{{max_sessions, Host, Port}, MaxSess}, {{max_pipeline_size, Host, Port}, MaxPipe}, {{options, Host, Port}, Options}], lists:foreach( fun({X, Y}) -> ets:insert(ibrowse_conf, #ibrowse_conf{key = X, value = Y}) end, I); ({K, V}) -> ets:insert(ibrowse_conf, #ibrowse_conf{key = K, value = V}); (X) -> io:format("Skipping unrecognised term: ~p~n", [X]) end, lists:foreach(Fun, Terms). %% @doc Internal export get_config_value(Key) -> try [#ibrowse_conf{value = V}] = ets:lookup(ibrowse_conf, Key), V catch error:badarg -> throw({error, ibrowse_not_running}) end. %% @doc Internal export get_config_value(Key, DefVal) -> try case ets:lookup(ibrowse_conf, Key) of [] -> DefVal; [#ibrowse_conf{value = V}] -> V end catch error:badarg -> throw({error, ibrowse_not_running}) end. set_config_value(Key, Val) -> ets:insert(ibrowse_conf, #ibrowse_conf{key = Key, value = Val}). %%-------------------------------------------------------------------- %% Function: handle_call/3 %% Description: Handling call messages %% Returns: {reply, Reply, State} | %% {reply, Reply, State, Timeout} | %% {noreply, State} | %% {noreply, State, Timeout} | %% {stop, Reason, Reply, State} | (terminate/2 is called) %% {stop, Reason, State} (terminate/2 is called) %%-------------------------------------------------------------------- handle_call({get_lb_pid, #url{host = Host, port = Port} = Url}, _From, State) -> Pid = do_get_connection(Url, ets:lookup(ibrowse_lb, {Host, Port})), {reply, Pid, State}; handle_call(stop, _From, State) -> do_trace("IBROWSE shutting down~n", []), ets:foldl(fun(#lb_pid{pid = Pid}, Acc) -> ibrowse_lb:stop(Pid), Acc end, [], ibrowse_lb), {stop, normal, ok, State}; handle_call({set_config_value, Key, Val}, _From, State) -> set_config_value(Key, Val), {reply, ok, State}; handle_call(rescan_config, _From, State) -> Ret = (catch import_config()), {reply, Ret, State}; handle_call({rescan_config, File}, _From, State) -> Ret = (catch import_config(File)), {reply, Ret, State}; handle_call({rescan_config_terms, Terms}, _From, State) -> Ret = (catch apply_config(Terms)), {reply, Ret, State}; handle_call({add_config_terms, Terms}, _From, State) -> Ret = (catch insert_config(Terms)), {reply, Ret, State}; handle_call(Request, _From, State) -> Reply = {unknown_request, Request}, {reply, Reply, State}. %%-------------------------------------------------------------------- %% Function: handle_cast/2 %% Description: Handling cast messages %% Returns: {noreply, State} | %% {noreply, State, Timeout} | %% {stop, Reason, State} (terminate/2 is called) %%-------------------------------------------------------------------- handle_cast(_Msg, State) -> {noreply, State}. %%-------------------------------------------------------------------- %% Function: handle_info/2 %% Description: Handling all non call/cast messages %% Returns: {noreply, State} | %% {noreply, State, Timeout} | %% {stop, Reason, State} (terminate/2 is called) %%-------------------------------------------------------------------- handle_info(all_trace_off, State) -> Mspec = [{{ibrowse_conf,{trace,'$1','$2'},true},[],[{{'$1','$2'}}]}], Trace_on_dests = ets:select(ibrowse_conf, Mspec), Fun = fun(#lb_pid{host_port = {H, P}, pid = Pid}, _) -> case lists:member({H, P}, Trace_on_dests) of false -> ok; true -> catch Pid ! {trace, false} end; (_, Acc) -> Acc end, ets:foldl(Fun, undefined, ibrowse_lb), ets:select_delete(ibrowse_conf, [{{ibrowse_conf,{trace,'$1','$2'},true},[],['true']}]), {noreply, State}; handle_info({trace, Bool}, State) -> put(my_trace_flag, Bool), {noreply, State}; handle_info({trace, Bool, Host, Port}, State) -> Fun = fun(#lb_pid{host_port = {H, P}, pid = Pid}, _) when H == Host, P == Port -> catch Pid ! {trace, Bool}; (_, Acc) -> Acc end, ets:foldl(Fun, undefined, ibrowse_lb), ets:insert(ibrowse_conf, #ibrowse_conf{key = {trace, Host, Port}, value = Bool}), {noreply, State}; handle_info(_Info, State) -> {noreply, State}. %%-------------------------------------------------------------------- %% Function: terminate/2 %% Description: Shutdown the server %% Returns: any (ignored by gen_server) %%-------------------------------------------------------------------- terminate(_Reason, _State) -> ok. %%-------------------------------------------------------------------- %% Func: code_change/3 %% Purpose: Convert process state when code is changed %% Returns: {ok, NewState} %%-------------------------------------------------------------------- code_change(_OldVsn, State, _Extra) -> {ok, State}. %%-------------------------------------------------------------------- %%% Internal functions %%-------------------------------------------------------------------- do_get_connection(#url{host = Host, port = Port}, []) -> {ok, Pid} = ibrowse_lb:start_link([Host, Port]), ets:insert(ibrowse_lb, #lb_pid{host_port = {Host, Port}, pid = Pid}), Pid; do_get_connection(_Url, [#lb_pid{pid = Pid}]) -> Pid. apache-couchdb-1.6.0/src/ibrowse/ibrowse.hrl0000644000175000001440000000065312332105522020744 0ustar00djcusers00000000000000-ifndef(IBROWSE_HRL). -define(IBROWSE_HRL, "ibrowse.hrl"). -record(url, { abspath, host, port, username, password, path, protocol, host_type % 'hostname', 'ipv4_address' or 'ipv6_address' }). -record(lb_pid, {host_port, pid}). -record(client_conn, {key, cur_pipeline_size = 0, reqs_served = 0}). -record(ibrowse_conf, {key, value}). -endif. apache-couchdb-1.6.0/src/ibrowse/ibrowse_lb.erl0000644000175000001440000002130612332105522021414 0ustar00djcusers00000000000000%%%------------------------------------------------------------------- %%% File : ibrowse_lb.erl %%% Author : chandru %%% Description : %%% %%% Created : 6 Mar 2008 by chandru %%%------------------------------------------------------------------- -module(ibrowse_lb). -author(chandru). -behaviour(gen_server). %%-------------------------------------------------------------------- %% Include files %%-------------------------------------------------------------------- %%-------------------------------------------------------------------- %% External exports -export([ start_link/1, spawn_connection/5, stop/1 ]). %% gen_server callbacks -export([ init/1, handle_call/3, handle_cast/2, handle_info/2, terminate/2, code_change/3 ]). -record(state, {parent_pid, ets_tid, host, port, max_sessions, max_pipeline_size, num_cur_sessions = 0, proc_state }). -include("ibrowse.hrl"). %%==================================================================== %% External functions %%==================================================================== %%-------------------------------------------------------------------- %% Function: start_link/0 %% Description: Starts the server %%-------------------------------------------------------------------- start_link(Args) -> gen_server:start_link(?MODULE, Args, []). %%==================================================================== %% Server functions %%==================================================================== %%-------------------------------------------------------------------- %% Function: init/1 %% Description: Initiates the server %% Returns: {ok, State} | %% {ok, State, Timeout} | %% ignore | %% {stop, Reason} %%-------------------------------------------------------------------- init([Host, Port]) -> process_flag(trap_exit, true), Max_sessions = ibrowse:get_config_value({max_sessions, Host, Port}, 10), Max_pipe_sz = ibrowse:get_config_value({max_pipeline_size, Host, Port}, 10), put(my_trace_flag, ibrowse_lib:get_trace_status(Host, Port)), put(ibrowse_trace_token, ["LB: ", Host, $:, integer_to_list(Port)]), Tid = ets:new(ibrowse_lb, [public, ordered_set]), {ok, #state{parent_pid = whereis(ibrowse), host = Host, port = Port, ets_tid = Tid, max_pipeline_size = Max_pipe_sz, max_sessions = Max_sessions}}. spawn_connection(Lb_pid, Url, Max_sessions, Max_pipeline_size, SSL_options) when is_pid(Lb_pid), is_record(Url, url), is_integer(Max_pipeline_size), is_integer(Max_sessions) -> gen_server:call(Lb_pid, {spawn_connection, Url, Max_sessions, Max_pipeline_size, SSL_options}). stop(Lb_pid) -> case catch gen_server:call(Lb_pid, stop) of {'EXIT', {timeout, _}} -> exit(Lb_pid, kill); ok -> ok end. %%-------------------------------------------------------------------- %% Function: handle_call/3 %% Description: Handling call messages %% Returns: {reply, Reply, State} | %% {reply, Reply, State, Timeout} | %% {noreply, State} | %% {noreply, State, Timeout} | %% {stop, Reason, Reply, State} | (terminate/2 is called) %% {stop, Reason, State} (terminate/2 is called) %%-------------------------------------------------------------------- handle_call(stop, _From, #state{ets_tid = undefined} = State) -> gen_server:reply(_From, ok), {stop, normal, State}; handle_call(stop, _From, #state{ets_tid = Tid} = State) -> ets:foldl(fun({Pid, _, _}, Acc) -> ibrowse_http_client:stop(Pid), Acc end, [], Tid), gen_server:reply(_From, ok), {stop, normal, State}; handle_call(_, _From, #state{proc_state = shutting_down} = State) -> {reply, {error, shutting_down}, State}; %% Update max_sessions in #state with supplied value handle_call({spawn_connection, _Url, Max_sess, Max_pipe, _}, _From, #state{num_cur_sessions = Num} = State) when Num >= Max_sess -> State_1 = maybe_create_ets(State), Reply = find_best_connection(State_1#state.ets_tid, Max_pipe), {reply, Reply, State_1#state{max_sessions = Max_sess, max_pipeline_size = Max_pipe}}; handle_call({spawn_connection, Url, Max_sess, Max_pipe, SSL_options}, _From, #state{num_cur_sessions = Cur} = State) -> State_1 = maybe_create_ets(State), Tid = State_1#state.ets_tid, {ok, Pid} = ibrowse_http_client:start_link({Tid, Url, SSL_options}), ets:insert(Tid, {Pid, 0, 0}), {reply, {ok, Pid}, State_1#state{num_cur_sessions = Cur + 1, max_sessions = Max_sess, max_pipeline_size = Max_pipe}}; handle_call(Request, _From, State) -> Reply = {unknown_request, Request}, {reply, Reply, State}. %%-------------------------------------------------------------------- %% Function: handle_cast/2 %% Description: Handling cast messages %% Returns: {noreply, State} | %% {noreply, State, Timeout} | %% {stop, Reason, State} (terminate/2 is called) %%-------------------------------------------------------------------- handle_cast(_Msg, State) -> {noreply, State}. %%-------------------------------------------------------------------- %% Function: handle_info/2 %% Description: Handling all non call/cast messages %% Returns: {noreply, State} | %% {noreply, State, Timeout} | %% {stop, Reason, State} (terminate/2 is called) %%-------------------------------------------------------------------- handle_info({'EXIT', Parent, _Reason}, #state{parent_pid = Parent} = State) -> {stop, normal, State}; handle_info({'EXIT', _Pid, _Reason}, #state{ets_tid = undefined} = State) -> {noreply, State}; handle_info({'EXIT', Pid, _Reason}, #state{num_cur_sessions = Cur, ets_tid = Tid} = State) -> ets:match_delete(Tid, {{'_', Pid}, '_'}), Cur_1 = Cur - 1, case Cur_1 of 0 -> ets:delete(Tid), {noreply, State#state{ets_tid = undefined, num_cur_sessions = 0}, 10000}; _ -> {noreply, State#state{num_cur_sessions = Cur_1}} end; handle_info({trace, Bool}, #state{ets_tid = undefined} = State) -> put(my_trace_flag, Bool), {noreply, State}; handle_info({trace, Bool}, #state{ets_tid = Tid} = State) -> ets:foldl(fun({{_, Pid}, _}, Acc) when is_pid(Pid) -> catch Pid ! {trace, Bool}, Acc; (_, Acc) -> Acc end, undefined, Tid), put(my_trace_flag, Bool), {noreply, State}; handle_info(timeout, State) -> %% We can't shutdown the process immediately because a request %% might be in flight. So we first remove the entry from the %% ibrowse_lb ets table, and then shutdown a couple of seconds %% later ets:delete(ibrowse_lb, {State#state.host, State#state.port}), erlang:send_after(2000, self(), shutdown), {noreply, State#state{proc_state = shutting_down}}; handle_info(shutdown, State) -> {stop, normal, State}; handle_info(_Info, State) -> {noreply, State}. %%-------------------------------------------------------------------- %% Function: terminate/2 %% Description: Shutdown the server %% Returns: any (ignored by gen_server) %%-------------------------------------------------------------------- terminate(_Reason, _State) -> ok. %%-------------------------------------------------------------------- %% Func: code_change/3 %% Purpose: Convert process state when code is changed %% Returns: {ok, NewState} %%-------------------------------------------------------------------- code_change(_OldVsn, State, _Extra) -> {ok, State}. %%-------------------------------------------------------------------- %%% Internal functions %%-------------------------------------------------------------------- find_best_connection(Tid, Max_pipe) -> Res = find_best_connection(ets:first(Tid), Tid, Max_pipe), Res. find_best_connection('$end_of_table', _, _) -> {error, retry_later}; find_best_connection(Pid, Tid, Max_pipe) -> case ets:lookup(Tid, Pid) of [{Pid, Cur_sz, Speculative_sz}] when Cur_sz < Max_pipe, Speculative_sz < Max_pipe -> ets:update_counter(Tid, Pid, {3, 1, 9999999, 9999999}), {ok, Pid}; _ -> find_best_connection(ets:next(Tid, Pid), Tid, Max_pipe) end. maybe_create_ets(#state{ets_tid = undefined} = State) -> Tid = ets:new(ibrowse_lb, [public, ordered_set]), State#state{ets_tid = Tid}; maybe_create_ets(State) -> State. apache-couchdb-1.6.0/src/couch_dbupdates/0000755000175000001440000000000012332105600020236 5ustar00djcusers00000000000000apache-couchdb-1.6.0/src/couch_dbupdates/src/0000755000175000001440000000000012332105600021025 5ustar00djcusers00000000000000apache-couchdb-1.6.0/src/couch_dbupdates/src/couch_dbupdates.app.src0000644000175000001440000000031512332105522025453 0ustar00djcusers00000000000000{application, couch_dbupdates, [ {description, ""}, {vsn, "@version@"}, {registered, []}, {applications, [ kernel, stdlib ]}, {env, []} ]}. apache-couchdb-1.6.0/src/couch_dbupdates/src/couch_dbupdates_httpd.erl0000644000175000001440000000445012332105522026076 0ustar00djcusers00000000000000-module(couch_dbupdates_httpd). -export([handle_req/1]). -include_lib("couch_db.hrl"). -record(state, {resp, feed}). handle_req(#httpd{method='GET'}=Req) -> ok = couch_httpd:verify_is_server_admin(Req), Qs = couch_httpd:qs(Req), Feed = proplists:get_value("feed", Qs, "longpoll"), Timeout = list_to_integer( proplists:get_value("timeout", Qs, "60000") ), Heartbeat0 = proplists:get_value("heartbeat", Qs), Heartbeat = case {Feed, Heartbeat0} of {"longpoll", _} -> false; {_, "false"} -> false; _ -> true end, Options = [{timeout, Timeout}, {heartbeat, Heartbeat}], {ok, Resp} = case Feed of "eventsource" -> Headers = [ {"Content-Type", "text/event-stream"}, {"Cache-Control", "no-cache"} ], couch_httpd:start_json_response(Req, 200, Headers); _ -> couch_httpd:start_json_response(Req, 200) end, State = #state{resp=Resp, feed=Feed}, couch_dbupdates:handle_dbupdates(fun handle_update/2, State, Options); handle_req(Req) -> couch_httpd:send_method_not_allowed(Req, "GET"). handle_update(stop, #state{resp=Resp}) -> couch_httpd:end_json_response(Resp); handle_update(heartbeat, #state{resp=Resp}=State) -> {ok, Resp1} = couch_httpd:send_chunk(Resp, "\n"), {ok, State#state{resp=Resp1}}; handle_update(Event, #state{resp=Resp, feed="eventsource"}=State) -> EventObj = event_obj(Event), {ok, Resp1} = couch_httpd:send_chunk(Resp, ["data: ", ?JSON_ENCODE(EventObj), "\n\n"]), {ok, State#state{resp=Resp1}}; handle_update(Event, #state{resp=Resp, feed="continuous"}=State) -> EventObj = event_obj(Event), {ok, Resp1} = couch_httpd:send_chunk(Resp, [?JSON_ENCODE(EventObj) | "\n"]), {ok, State#state{resp=Resp1}}; handle_update(Event, #state{resp=Resp, feed="longpoll"}) -> {Props} = event_obj(Event), JsonObj = {[{<<"ok">>, true} | Props]}, couch_httpd:send_chunk(Resp, ?JSON_ENCODE(JsonObj)), stop. event_obj({Type, DbName}) -> {[{<<"type">>, couch_util:to_binary(Type)}, {<<"db_name">>, couch_util:to_binary(DbName)}]}. apache-couchdb-1.6.0/src/couch_dbupdates/src/couch_dbupdates.erl0000644000175000001440000000207012332105522024667 0ustar00djcusers00000000000000-module(couch_dbupdates). -export([handle_dbupdates/3]). handle_dbupdates(Fun, Acc, Options) -> NotifierPid = db_update_notifier(), try loop(Fun, Acc, Options) after couch_db_update_notifier:stop(NotifierPid) end. loop(Fun, Acc, Options) -> [{timeout, Timeout}, {heartbeat, Heartbeat}] = Options, receive {db_updated, Event} -> case Fun(Event, Acc) of {ok, Acc1} -> loop(Fun, Acc1, Options); stop -> Fun(stop, Acc) end after Timeout -> case Heartbeat of true -> case Fun(heartbeat, Acc) of {ok, Acc1} -> loop(Fun, Acc1, Options); stop -> Fun(stop, Acc) end; _ -> Fun(stop, Acc) end end. db_update_notifier() -> Self = self(), {ok, Notifier} = couch_db_update_notifier:start_link(fun(Event) -> Self ! {db_updated, Event} end), Notifier. apache-couchdb-1.6.0/src/couch_dbupdates/Makefile.am0000644000175000001440000000211312332105522022272 0ustar00djcusers00000000000000## Licensed under the Apache License, Version 2.0 (the "License"); you may not ## use this file except in compliance with the License. You may obtain a copy of ## the License at ## ## http://www.apache.org/licenses/LICENSE-2.0 ## ## Unless required by applicable law or agreed to in writing, software ## distributed under the License is distributed on an "AS IS" BASIS, WITHOUT ## WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the ## License for the specific language governing permissions and limitations under ## the License. couch_dbupdateslibdir = $(localerlanglibdir)/couch_dbupdates-0.1 couch_dbupdatesebindir = $(couch_dbupdateslibdir)/ebin couch_dbupdatesebin_DATA = $(compiled_files) EXTRA_DIST = $(source_files) CLEANFILES = $(compiled_files) source_files = \ src/couch_dbupdates.erl \ src/couch_dbupdates.app.src \ src/couch_dbupdates_httpd.erl compiled_files = \ ebin/couch_dbupdates.beam \ ebin/couch_dbupdates_httpd.beam ebin/%.beam: src/%.erl @mkdir -p ebin/ $(ERLC) -I$(top_srcdir)/src/couchdb -o ebin/ $(ERLC_FLAGS) ${TEST} $<; apache-couchdb-1.6.0/src/couch_dbupdates/Makefile.in0000644000175000001440000003613112332105551022314 0ustar00djcusers00000000000000# Makefile.in generated by automake 1.11.6 from Makefile.am. # @configure_input@ # Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, # 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011 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__make_dryrun = \ { \ am__dry=no; \ case $$MAKEFLAGS in \ *\\[\ \ ]*) \ echo 'am--echo: ; @echo "AM" OK' | $(MAKE) -f - 2>/dev/null \ | grep '^AM OK$$' >/dev/null || am__dry=yes;; \ *) \ for am__flg in $$MAKEFLAGS; do \ case $$am__flg in \ *=*|--*) ;; \ *n*) am__dry=yes; break;; \ esac; \ done;; \ esac; \ test $$am__dry = yes; \ } 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/couch_dbupdates DIST_COMMON = $(srcdir)/Makefile.am $(srcdir)/Makefile.in ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 am__aclocal_m4_deps = $(top_srcdir)/m4/libtool.m4 \ $(top_srcdir)/m4/ltoptions.m4 $(top_srcdir)/m4/ltsugar.m4 \ $(top_srcdir)/m4/ltversion.m4 $(top_srcdir)/m4/lt~obsolete.m4 \ $(top_srcdir)/acinclude.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 \ $(top_builddir)/src/snappy/google-snappy/config.h CONFIG_CLEAN_FILES = CONFIG_CLEAN_VPATH_FILES = 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)$(couch_dbupdatesebindir)" DATA = $(couch_dbupdatesebin_DATA) DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) ACLOCAL = @ACLOCAL@ AMTAR = @AMTAR@ AR = @AR@ AS = @AS@ AUTOCONF = @AUTOCONF@ AUTOHEADER = @AUTOHEADER@ AUTOMAKE = @AUTOMAKE@ AWK = @AWK@ CC = @CC@ CCDEPMODE = @CCDEPMODE@ CFLAGS = @CFLAGS@ CPP = @CPP@ CPPFLAGS = @CPPFLAGS@ CURL_CFLAGS = @CURL_CFLAGS@ CURL_CONFIG = @CURL_CONFIG@ CURL_LIBS = @CURL_LIBS@ CXX = @CXX@ CXXCPP = @CXXCPP@ CXXDEPMODE = @CXXDEPMODE@ CXXFLAGS = @CXXFLAGS@ CYGPATH_W = @CYGPATH_W@ DEFS = @DEFS@ DEPDIR = @DEPDIR@ DLLTOOL = @DLLTOOL@ DSYMUTIL = @DSYMUTIL@ DUMPBIN = @DUMPBIN@ ECHO_C = @ECHO_C@ ECHO_N = @ECHO_N@ ECHO_T = @ECHO_T@ EGREP = @EGREP@ ERL = @ERL@ ERLANG_FLAGS = @ERLANG_FLAGS@ ERLC = @ERLC@ ERLC_FLAGS = @ERLC_FLAGS@ ESCRIPT = @ESCRIPT@ EXEEXT = @EXEEXT@ FGREP = @FGREP@ FLAGS = @FLAGS@ GREP = @GREP@ HAS_HELP2MAN = @HAS_HELP2MAN@ HAS_INSTALLINFO = @HAS_INSTALLINFO@ HAS_MAKEINFO = @HAS_MAKEINFO@ HAS_PDFLATEX = @HAS_PDFLATEX@ HAS_SPHINX_BUILD = @HAS_SPHINX_BUILD@ ICU_BIN = @ICU_BIN@ ICU_CFLAGS = @ICU_CFLAGS@ ICU_CONFIG = @ICU_CONFIG@ ICU_CPPFLAGS = @ICU_CPPFLAGS@ ICU_CXXFLAGS = @ICU_CXXFLAGS@ ICU_LIBS = @ICU_LIBS@ INNO_COMPILER_EXECUTABLE = @INNO_COMPILER_EXECUTABLE@ INSTALL = @INSTALL@ INSTALL_DATA = @INSTALL_DATA@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ INSTALL_SCRIPT = @INSTALL_SCRIPT@ INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ JS_CFLAGS = @JS_CFLAGS@ JS_LIBS = @JS_LIBS@ JS_LIB_BINARY = @JS_LIB_BINARY@ LD = @LD@ LDFLAGS = @LDFLAGS@ LIBOBJS = @LIBOBJS@ LIBS = @LIBS@ LIBTOOL = @LIBTOOL@ LIPO = @LIPO@ LN_S = @LN_S@ LTLIBOBJS = @LTLIBOBJS@ MAKEINFO = @MAKEINFO@ MANIFEST_TOOL = @MANIFEST_TOOL@ MKDIR_P = @MKDIR_P@ NM = @NM@ NMEDIT = @NMEDIT@ OBJDUMP = @OBJDUMP@ OBJEXT = @OBJEXT@ OTOOL = @OTOOL@ OTOOL64 = @OTOOL64@ PACKAGE = @PACKAGE@ PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ PACKAGE_NAME = @PACKAGE_NAME@ PACKAGE_STRING = @PACKAGE_STRING@ PACKAGE_TARNAME = @PACKAGE_TARNAME@ PACKAGE_URL = @PACKAGE_URL@ PACKAGE_VERSION = @PACKAGE_VERSION@ PATH_SEPARATOR = @PATH_SEPARATOR@ PKG_CONFIG = @PKG_CONFIG@ PKG_CONFIG_LIBDIR = @PKG_CONFIG_LIBDIR@ PKG_CONFIG_PATH = @PKG_CONFIG_PATH@ RANLIB = @RANLIB@ SED = @SED@ SET_MAKE = @SET_MAKE@ SHELL = @SHELL@ SNAPPY_MAJOR = @SNAPPY_MAJOR@ SNAPPY_MINOR = @SNAPPY_MINOR@ SNAPPY_PATCHLEVEL = @SNAPPY_PATCHLEVEL@ STRIP = @STRIP@ VERSION = @VERSION@ 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@ ac_cv_have_stddef_h = @ac_cv_have_stddef_h@ ac_cv_have_stdint_h = @ac_cv_have_stdint_h@ am__include = @am__include@ am__leading_dot = @am__leading_dot@ am__quote = @am__quote@ am__tar = @am__tar@ am__untar = @am__untar@ bindir = @bindir@ bug_uri = @bug_uri@ 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@ dvidir = @dvidir@ erlangbin = @erlangbin@ erlangversion = @erlangversion@ exec_prefix = @exec_prefix@ host = @host@ host_alias = @host_alias@ host_cpu = @host_cpu@ host_os = @host_os@ host_vendor = @host_vendor@ htmldir = @htmldir@ includedir = @includedir@ infodir = @infodir@ initdir = @initdir@ install_sh = @install_sh@ launchddir = @launchddir@ libdir = @libdir@ libexecdir = @libexecdir@ localconfdir = @localconfdir@ localdatadir = @localdatadir@ localdocdir = @localdocdir@ localedir = @localedir@ localerlanglibdir = @localerlanglibdir@ locallibbindir = @locallibbindir@ locallibdir = @locallibdir@ localstatedir = @localstatedir@ localstatelibdir = @localstatelibdir@ localstatelogdir = @localstatelogdir@ localstaterundir = @localstaterundir@ mandir = @mandir@ mkdir_p = @mkdir_p@ msvc_redist_dir = @msvc_redist_dir@ msvc_redist_name = @msvc_redist_name@ oldincludedir = @oldincludedir@ openssl_bin_dir = @openssl_bin_dir@ otp_release = @otp_release@ package_author_address = @package_author_address@ package_author_name = @package_author_name@ package_identifier = @package_identifier@ package_name = @package_name@ package_tarname = @package_tarname@ 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@ version = @version@ version_major = @version_major@ version_minor = @version_minor@ version_release = @version_release@ version_revision = @version_revision@ version_stage = @version_stage@ couch_dbupdateslibdir = $(localerlanglibdir)/couch_dbupdates-0.1 couch_dbupdatesebindir = $(couch_dbupdateslibdir)/ebin couch_dbupdatesebin_DATA = $(compiled_files) EXTRA_DIST = $(source_files) CLEANFILES = $(compiled_files) source_files = \ src/couch_dbupdates.erl \ src/couch_dbupdates.app.src \ src/couch_dbupdates_httpd.erl compiled_files = \ ebin/couch_dbupdates.beam \ ebin/couch_dbupdates_httpd.beam 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) --foreign src/couch_dbupdates/Makefile'; \ $(am__cd) $(top_srcdir) && \ $(AUTOMAKE) --foreign src/couch_dbupdates/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-couch_dbupdatesebinDATA: $(couch_dbupdatesebin_DATA) @$(NORMAL_INSTALL) @list='$(couch_dbupdatesebin_DATA)'; test -n "$(couch_dbupdatesebindir)" || list=; \ if test -n "$$list"; then \ echo " $(MKDIR_P) '$(DESTDIR)$(couch_dbupdatesebindir)'"; \ $(MKDIR_P) "$(DESTDIR)$(couch_dbupdatesebindir)" || 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)$(couch_dbupdatesebindir)'"; \ $(INSTALL_DATA) $$files "$(DESTDIR)$(couch_dbupdatesebindir)" || exit $$?; \ done uninstall-couch_dbupdatesebinDATA: @$(NORMAL_UNINSTALL) @list='$(couch_dbupdatesebin_DATA)'; test -n "$(couch_dbupdatesebindir)" || list=; \ files=`for p in $$list; do echo $$p; done | sed -e 's|^.*/||'`; \ dir='$(DESTDIR)$(couch_dbupdatesebindir)'; $(am__uninstall_files_from_dir) tags: TAGS TAGS: ctags: CTAGS CTAGS: 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)$(couch_dbupdatesebindir)"; 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 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-couch_dbupdatesebinDATA 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-couch_dbupdatesebinDATA .MAKE: install-am install-strip .PHONY: all all-am check check-am clean clean-generic clean-libtool \ distclean distclean-generic distclean-libtool distdir dvi \ dvi-am html html-am info info-am install install-am \ install-couch_dbupdatesebinDATA 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 uninstall uninstall-am \ uninstall-couch_dbupdatesebinDATA ebin/%.beam: src/%.erl @mkdir -p ebin/ $(ERLC) -I$(top_srcdir)/src/couchdb -o ebin/ $(ERLC_FLAGS) ${TEST} $<; # 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: apache-couchdb-1.6.0/var/0000755000175000001440000000000012332106073015110 5ustar00djcusers00000000000000apache-couchdb-1.6.0/var/Makefile.am0000644000175000001440000000174412332105522017150 0ustar00djcusers00000000000000## Licensed under the Apache License, Version 2.0 (the "License"); you may not ## use this file except in compliance with the License. You may obtain a copy of ## the License at ## ## http://www.apache.org/licenses/LICENSE-2.0 ## ## Unless required by applicable law or agreed to in writing, software ## distributed under the License is distributed on an "AS IS" BASIS, WITHOUT ## WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the ## License for the specific language governing permissions and limitations under ## the License. install-data-hook: if test ! "$(mkdir_p)" = ""; then \ $(mkdir_p) "$(DESTDIR)$(localstatelibdir)"; \ $(mkdir_p) "$(DESTDIR)$(localstatelogdir)"; \ $(mkdir_p) "$(DESTDIR)$(localstaterundir)"; \ else \ echo "WARNING: You may have to create these directories by hand."; \ mkdir -p "$(DESTDIR)$(localstatelibdir)"; \ mkdir -p "$(DESTDIR)$(localstatelogdir)"; \ mkdir -p "$(DESTDIR)$(localstaterundir)"; \ fi apache-couchdb-1.6.0/var/Makefile.in0000644000175000001440000003111712332105553017162 0ustar00djcusers00000000000000# Makefile.in generated by automake 1.11.6 from Makefile.am. # @configure_input@ # Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, # 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011 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__make_dryrun = \ { \ am__dry=no; \ case $$MAKEFLAGS in \ *\\[\ \ ]*) \ echo 'am--echo: ; @echo "AM" OK' | $(MAKE) -f - 2>/dev/null \ | grep '^AM OK$$' >/dev/null || am__dry=yes;; \ *) \ for am__flg in $$MAKEFLAGS; do \ case $$am__flg in \ *=*|--*) ;; \ *n*) am__dry=yes; break;; \ esac; \ done;; \ esac; \ test $$am__dry = yes; \ } 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 = var DIST_COMMON = $(srcdir)/Makefile.am $(srcdir)/Makefile.in ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 am__aclocal_m4_deps = $(top_srcdir)/m4/libtool.m4 \ $(top_srcdir)/m4/ltoptions.m4 $(top_srcdir)/m4/ltsugar.m4 \ $(top_srcdir)/m4/ltversion.m4 $(top_srcdir)/m4/lt~obsolete.m4 \ $(top_srcdir)/acinclude.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 \ $(top_builddir)/src/snappy/google-snappy/config.h CONFIG_CLEAN_FILES = CONFIG_CLEAN_VPATH_FILES = 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 DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) ACLOCAL = @ACLOCAL@ AMTAR = @AMTAR@ AR = @AR@ AS = @AS@ AUTOCONF = @AUTOCONF@ AUTOHEADER = @AUTOHEADER@ AUTOMAKE = @AUTOMAKE@ AWK = @AWK@ CC = @CC@ CCDEPMODE = @CCDEPMODE@ CFLAGS = @CFLAGS@ CPP = @CPP@ CPPFLAGS = @CPPFLAGS@ CURL_CFLAGS = @CURL_CFLAGS@ CURL_CONFIG = @CURL_CONFIG@ CURL_LIBS = @CURL_LIBS@ CXX = @CXX@ CXXCPP = @CXXCPP@ CXXDEPMODE = @CXXDEPMODE@ CXXFLAGS = @CXXFLAGS@ CYGPATH_W = @CYGPATH_W@ DEFS = @DEFS@ DEPDIR = @DEPDIR@ DLLTOOL = @DLLTOOL@ DSYMUTIL = @DSYMUTIL@ DUMPBIN = @DUMPBIN@ ECHO_C = @ECHO_C@ ECHO_N = @ECHO_N@ ECHO_T = @ECHO_T@ EGREP = @EGREP@ ERL = @ERL@ ERLANG_FLAGS = @ERLANG_FLAGS@ ERLC = @ERLC@ ERLC_FLAGS = @ERLC_FLAGS@ ESCRIPT = @ESCRIPT@ EXEEXT = @EXEEXT@ FGREP = @FGREP@ FLAGS = @FLAGS@ GREP = @GREP@ HAS_HELP2MAN = @HAS_HELP2MAN@ HAS_INSTALLINFO = @HAS_INSTALLINFO@ HAS_MAKEINFO = @HAS_MAKEINFO@ HAS_PDFLATEX = @HAS_PDFLATEX@ HAS_SPHINX_BUILD = @HAS_SPHINX_BUILD@ ICU_BIN = @ICU_BIN@ ICU_CFLAGS = @ICU_CFLAGS@ ICU_CONFIG = @ICU_CONFIG@ ICU_CPPFLAGS = @ICU_CPPFLAGS@ ICU_CXXFLAGS = @ICU_CXXFLAGS@ ICU_LIBS = @ICU_LIBS@ INNO_COMPILER_EXECUTABLE = @INNO_COMPILER_EXECUTABLE@ INSTALL = @INSTALL@ INSTALL_DATA = @INSTALL_DATA@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ INSTALL_SCRIPT = @INSTALL_SCRIPT@ INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ JS_CFLAGS = @JS_CFLAGS@ JS_LIBS = @JS_LIBS@ JS_LIB_BINARY = @JS_LIB_BINARY@ LD = @LD@ LDFLAGS = @LDFLAGS@ LIBOBJS = @LIBOBJS@ LIBS = @LIBS@ LIBTOOL = @LIBTOOL@ LIPO = @LIPO@ LN_S = @LN_S@ LTLIBOBJS = @LTLIBOBJS@ MAKEINFO = @MAKEINFO@ MANIFEST_TOOL = @MANIFEST_TOOL@ MKDIR_P = @MKDIR_P@ NM = @NM@ NMEDIT = @NMEDIT@ OBJDUMP = @OBJDUMP@ OBJEXT = @OBJEXT@ OTOOL = @OTOOL@ OTOOL64 = @OTOOL64@ PACKAGE = @PACKAGE@ PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ PACKAGE_NAME = @PACKAGE_NAME@ PACKAGE_STRING = @PACKAGE_STRING@ PACKAGE_TARNAME = @PACKAGE_TARNAME@ PACKAGE_URL = @PACKAGE_URL@ PACKAGE_VERSION = @PACKAGE_VERSION@ PATH_SEPARATOR = @PATH_SEPARATOR@ PKG_CONFIG = @PKG_CONFIG@ PKG_CONFIG_LIBDIR = @PKG_CONFIG_LIBDIR@ PKG_CONFIG_PATH = @PKG_CONFIG_PATH@ RANLIB = @RANLIB@ SED = @SED@ SET_MAKE = @SET_MAKE@ SHELL = @SHELL@ SNAPPY_MAJOR = @SNAPPY_MAJOR@ SNAPPY_MINOR = @SNAPPY_MINOR@ SNAPPY_PATCHLEVEL = @SNAPPY_PATCHLEVEL@ STRIP = @STRIP@ VERSION = @VERSION@ 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@ ac_cv_have_stddef_h = @ac_cv_have_stddef_h@ ac_cv_have_stdint_h = @ac_cv_have_stdint_h@ am__include = @am__include@ am__leading_dot = @am__leading_dot@ am__quote = @am__quote@ am__tar = @am__tar@ am__untar = @am__untar@ bindir = @bindir@ bug_uri = @bug_uri@ 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@ dvidir = @dvidir@ erlangbin = @erlangbin@ erlangversion = @erlangversion@ exec_prefix = @exec_prefix@ host = @host@ host_alias = @host_alias@ host_cpu = @host_cpu@ host_os = @host_os@ host_vendor = @host_vendor@ htmldir = @htmldir@ includedir = @includedir@ infodir = @infodir@ initdir = @initdir@ install_sh = @install_sh@ launchddir = @launchddir@ libdir = @libdir@ libexecdir = @libexecdir@ localconfdir = @localconfdir@ localdatadir = @localdatadir@ localdocdir = @localdocdir@ localedir = @localedir@ localerlanglibdir = @localerlanglibdir@ locallibbindir = @locallibbindir@ locallibdir = @locallibdir@ localstatedir = @localstatedir@ localstatelibdir = @localstatelibdir@ localstatelogdir = @localstatelogdir@ localstaterundir = @localstaterundir@ mandir = @mandir@ mkdir_p = @mkdir_p@ msvc_redist_dir = @msvc_redist_dir@ msvc_redist_name = @msvc_redist_name@ oldincludedir = @oldincludedir@ openssl_bin_dir = @openssl_bin_dir@ otp_release = @otp_release@ package_author_address = @package_author_address@ package_author_name = @package_author_name@ package_identifier = @package_identifier@ package_name = @package_name@ package_tarname = @package_tarname@ 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@ version = @version@ version_major = @version_major@ version_minor = @version_minor@ version_release = @version_release@ version_revision = @version_revision@ version_stage = @version_stage@ 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) --foreign var/Makefile'; \ $(am__cd) $(top_srcdir) && \ $(AUTOMAKE) --foreign var/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 TAGS: ctags: CTAGS CTAGS: 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: @$(NORMAL_INSTALL) $(MAKE) $(AM_MAKEFLAGS) install-data-hook 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-data-am install-strip .PHONY: all all-am check check-am clean clean-generic clean-libtool \ distclean distclean-generic distclean-libtool distdir dvi \ dvi-am html html-am info info-am install install-am \ install-data install-data-am install-data-hook 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 \ uninstall uninstall-am install-data-hook: if test ! "$(mkdir_p)" = ""; then \ $(mkdir_p) "$(DESTDIR)$(localstatelibdir)"; \ $(mkdir_p) "$(DESTDIR)$(localstatelogdir)"; \ $(mkdir_p) "$(DESTDIR)$(localstaterundir)"; \ else \ echo "WARNING: You may have to create these directories by hand."; \ mkdir -p "$(DESTDIR)$(localstatelibdir)"; \ mkdir -p "$(DESTDIR)$(localstatelogdir)"; \ mkdir -p "$(DESTDIR)$(localstaterundir)"; \ fi # 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: apache-couchdb-1.6.0/BUGS0000644000175000001440000000030212332105522014774 0ustar00djcusers00000000000000Apache CouchDB BUGS =================== Visit our issue tracker: https://issues.apache.org/jira/browse/CouchDB You can use this to report bugs, request features, or suggest enhancements. apache-couchdb-1.6.0/test/0000755000175000001440000000000012332106073015277 5ustar00djcusers00000000000000apache-couchdb-1.6.0/test/etap/0000755000175000001440000000000012332106073016230 5ustar00djcusers00000000000000apache-couchdb-1.6.0/test/etap/090-task-status.t0000755000175000001440000001552112332105522021213 0ustar00djcusers00000000000000#!/usr/bin/env escript %% -*- erlang -*- % Licensed under the Apache License, Version 2.0 (the "License"); you may not % use this file except in compliance with the License. You may obtain a copy of % the License at % % http://www.apache.org/licenses/LICENSE-2.0 % % Unless required by applicable law or agreed to in writing, software % distributed under the License is distributed on an "AS IS" BASIS, WITHOUT % WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the % License for the specific language governing permissions and limitations under % the License. main(_) -> test_util:init_code_path(), etap:plan(28), case (catch test()) of ok -> etap:end_tests(); Other -> etap:diag(io_lib:format("Test died abnormally: ~p", [Other])), etap:bail(Other) end, ok. get_task_prop(Pid, Prop) -> From = list_to_binary(pid_to_list(Pid)), Element = lists:foldl( fun(PropList,Acc) -> case couch_util:get_value(pid,PropList) of From -> [PropList | Acc]; _ -> [] end end, [], couch_task_status:all() ), case couch_util:get_value(Prop, hd(Element), nil) of nil -> etap:bail("Could not get property '" ++ couch_util:to_list(Prop) ++ "' for task " ++ pid_to_list(Pid)); Value -> Value end. loop() -> receive {add, Props, From} -> Resp = couch_task_status:add_task(Props), From ! {ok, self(), Resp}, loop(); {update, Props, From} -> Resp = couch_task_status:update(Props), From ! {ok, self(), Resp}, loop(); {update_frequency, Msecs, From} -> Resp = couch_task_status:set_update_frequency(Msecs), From ! {ok, self(), Resp}, loop(); {done, From} -> From ! {ok, self(), ok} end. call(Pid, Command) -> Pid ! {Command, self()}, wait(Pid). call(Pid, Command, Arg) -> Pid ! {Command, Arg, self()}, wait(Pid). wait(Pid) -> receive {ok, Pid, Msg} -> Msg after 1000 -> throw(timeout_error) end. test() -> {ok, TaskStatusPid} = couch_task_status:start_link(), TaskUpdater = fun() -> loop() end, % create three updaters Pid1 = spawn(TaskUpdater), Pid2 = spawn(TaskUpdater), Pid3 = spawn(TaskUpdater), ok = call(Pid1, add, [{type, replication}, {progress, 0}]), etap:is( length(couch_task_status:all()), 1, "Started a task" ), Task1StartTime = get_task_prop(Pid1, started_on), etap:is( is_integer(Task1StartTime), true, "Task start time is defined." ), etap:is( get_task_prop(Pid1, updated_on), Task1StartTime, "Task's start time is the same as the update time before an update." ), etap:is( call(Pid1, add, [{type, compaction}, {progress, 0}]), {add_task_error, already_registered}, "Unable to register multiple tasks for a single Pid." ), etap:is( get_task_prop(Pid1, type), replication, "Task type is 'replication'." ), etap:is( get_task_prop(Pid1, progress), 0, "Task progress is 0." ), ok = timer:sleep(1000), call(Pid1, update, [{progress, 25}]), etap:is( get_task_prop(Pid1, progress), 25, "Task progress is 25." ), etap:is( get_task_prop(Pid1, updated_on) > Task1StartTime, true, "Task's last update time has increased after an update." ), call(Pid2, add, [{type, compaction}, {progress, 0}]), etap:is( length(couch_task_status:all()), 2, "Started a second task." ), Task2StartTime = get_task_prop(Pid2, started_on), etap:is( is_integer(Task2StartTime), true, "Second task's start time is defined." ), etap:is( get_task_prop(Pid2, updated_on), Task2StartTime, "Second task's start time is the same as the update time before an update." ), etap:is( get_task_prop(Pid2, type), compaction, "Second task's type is 'compaction'." ), etap:is( get_task_prop(Pid2, progress), 0, "Second task's progress is 0." ), ok = timer:sleep(1000), call(Pid2, update, [{progress, 33}]), etap:is( get_task_prop(Pid2, progress), 33, "Second task's progress updated to 33." ), etap:is( get_task_prop(Pid2, updated_on) > Task2StartTime, true, "Second task's last update time has increased after an update." ), call(Pid3, add, [{type, indexer}, {progress, 0}]), etap:is( length(couch_task_status:all()), 3, "Registered a third task." ), Task3StartTime = get_task_prop(Pid3, started_on), etap:is( is_integer(Task3StartTime), true, "Third task's start time is defined." ), etap:is( get_task_prop(Pid3, updated_on), Task3StartTime, "Third task's start time is the same as the update time before an update." ), etap:is( get_task_prop(Pid3, type), indexer, "Third task's type is 'indexer'." ), etap:is( get_task_prop(Pid3, progress), 0, "Third task's progress is 0." ), ok = timer:sleep(1000), call(Pid3, update, [{progress, 50}]), etap:is( get_task_prop(Pid3, progress), 50, "Third task's progress updated to 50." ), etap:is( get_task_prop(Pid3, updated_on) > Task3StartTime, true, "Third task's last update time has increased after an update." ), call(Pid3, update_frequency, 500), call(Pid3, update, [{progress, 66}]), etap:is( get_task_prop(Pid3, progress), 66, "Third task's progress updated to 66." ), call(Pid3, update, [{progress, 67}]), etap:is( get_task_prop(Pid3, progress), 66, "Task update dropped because of frequency limit." ), call(Pid3, update_frequency, 0), call(Pid3, update, [{progress, 77}]), etap:is( get_task_prop(Pid3, progress), 77, "Task updated after reseting frequency limit." ), call(Pid1, done), etap:is( length(couch_task_status:all()), 2, "First task finished." ), call(Pid2, done), etap:is( length(couch_task_status:all()), 1, "Second task finished." ), call(Pid3, done), etap:is( length(couch_task_status:all()), 0, "Third task finished." ), erlang:monitor(process, TaskStatusPid), couch_task_status:stop(), receive {'DOWN', _, _, TaskStatusPid, _} -> ok after 1000 -> throw(timeout_error) end, ok. apache-couchdb-1.6.0/test/etap/073-changes.t0000755000175000001440000004251212332105522020341 0ustar00djcusers00000000000000#!/usr/bin/env escript %% -*- erlang -*- % Licensed under the Apache License, Version 2.0 (the "License"); you may not % use this file except in compliance with the License. You may obtain a copy of % the License at % % http://www.apache.org/licenses/LICENSE-2.0 % % Unless required by applicable law or agreed to in writing, software % distributed under the License is distributed on an "AS IS" BASIS, WITHOUT % WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the % License for the specific language governing permissions and limitations under % the License. % Verify that compacting databases that are being used as the source or % target of a replication doesn't affect the replication and that the % replication doesn't hold their reference counters forever. -record(user_ctx, { name = null, roles = [], handler }). -record(changes_args, { feed = "normal", dir = fwd, since = 0, limit = 1000000000000000, style = main_only, heartbeat, timeout, filter = "", filter_fun, filter_args = [], include_docs = false, doc_options = [], conflicts = false, db_open_options = [] }). -record(row, { id, seq, deleted = false }). test_db_name() -> <<"couch_test_changes">>. main(_) -> test_util:init_code_path(), etap:plan(43), case (catch test()) of ok -> etap:end_tests(); Other -> etap:diag(io_lib:format("Test died abnormally: ~p", [Other])), etap:bail(Other) end, ok. test() -> couch_server_sup:start_link(test_util:config_files()), test_by_doc_ids(), test_by_doc_ids_with_since(), test_by_doc_ids_continuous(), test_design_docs_only(), test_heartbeat(), couch_server_sup:stop(), ok. test_by_doc_ids() -> {ok, Db} = create_db(test_db_name()), {ok, _Rev1} = save_doc(Db, {[{<<"_id">>, <<"doc1">>}]}), {ok, _Rev2} = save_doc(Db, {[{<<"_id">>, <<"doc2">>}]}), {ok, Rev3} = save_doc(Db, {[{<<"_id">>, <<"doc3">>}]}), {ok, _Rev4} = save_doc(Db, {[{<<"_id">>, <<"doc4">>}]}), {ok, _Rev5} = save_doc(Db, {[{<<"_id">>, <<"doc5">>}]}), {ok, _Rev3_2} = save_doc(Db, {[{<<"_id">>, <<"doc3">>}, {<<"_rev">>, Rev3}]}), {ok, _Rev6} = save_doc(Db, {[{<<"_id">>, <<"doc6">>}]}), {ok, _Rev7} = save_doc(Db, {[{<<"_id">>, <<"doc7">>}]}), {ok, _Rev8} = save_doc(Db, {[{<<"_id">>, <<"doc8">>}]}), etap:diag("Folding changes in ascending order with _doc_ids filter"), ChangesArgs = #changes_args{ filter = "_doc_ids" }, DocIds = [<<"doc3">>, <<"doc4">>, <<"doc9999">>], Req = {json_req, {[{<<"doc_ids">>, DocIds}]}}, Consumer = spawn_consumer(test_db_name(), ChangesArgs, Req), {Rows, LastSeq} = wait_finished(Consumer), {ok, Db2} = couch_db:open_int(test_db_name(), []), UpSeq = couch_db:get_update_seq(Db2), couch_db:close(Db2), etap:is(length(Rows), 2, "Received 2 changes rows"), etap:is(LastSeq, UpSeq, "LastSeq is same as database update seq number"), [#row{seq = Seq1, id = Id1}, #row{seq = Seq2, id = Id2}] = Rows, etap:is(Id1, <<"doc4">>, "First row is for doc doc4"), etap:is(Seq1, 4, "First row has seq 4"), etap:is(Id2, <<"doc3">>, "Second row is for doc doc3"), etap:is(Seq2, 6, "Second row has seq 6"), stop(Consumer), etap:diag("Folding changes in descending order with _doc_ids filter"), ChangesArgs2 = #changes_args{ filter = "_doc_ids", dir = rev }, Consumer2 = spawn_consumer(test_db_name(), ChangesArgs2, Req), {Rows2, LastSeq2} = wait_finished(Consumer2), etap:is(length(Rows2), 2, "Received 2 changes rows"), etap:is(LastSeq2, 4, "LastSeq is 4"), [#row{seq = Seq1_2, id = Id1_2}, #row{seq = Seq2_2, id = Id2_2}] = Rows2, etap:is(Id1_2, <<"doc3">>, "First row is for doc doc3"), etap:is(Seq1_2, 6, "First row has seq 4"), etap:is(Id2_2, <<"doc4">>, "Second row is for doc doc4"), etap:is(Seq2_2, 4, "Second row has seq 6"), stop(Consumer2), delete_db(Db). test_by_doc_ids_with_since() -> {ok, Db} = create_db(test_db_name()), {ok, _Rev1} = save_doc(Db, {[{<<"_id">>, <<"doc1">>}]}), {ok, _Rev2} = save_doc(Db, {[{<<"_id">>, <<"doc2">>}]}), {ok, Rev3} = save_doc(Db, {[{<<"_id">>, <<"doc3">>}]}), {ok, _Rev4} = save_doc(Db, {[{<<"_id">>, <<"doc4">>}]}), {ok, _Rev5} = save_doc(Db, {[{<<"_id">>, <<"doc5">>}]}), {ok, Rev3_2} = save_doc(Db, {[{<<"_id">>, <<"doc3">>}, {<<"_rev">>, Rev3}]}), {ok, _Rev6} = save_doc(Db, {[{<<"_id">>, <<"doc6">>}]}), {ok, _Rev7} = save_doc(Db, {[{<<"_id">>, <<"doc7">>}]}), {ok, _Rev8} = save_doc(Db, {[{<<"_id">>, <<"doc8">>}]}), ChangesArgs = #changes_args{ filter = "_doc_ids", since = 5 }, DocIds = [<<"doc3">>, <<"doc4">>, <<"doc9999">>], Req = {json_req, {[{<<"doc_ids">>, DocIds}]}}, Consumer = spawn_consumer(test_db_name(), ChangesArgs, Req), {Rows, LastSeq} = wait_finished(Consumer), {ok, Db2} = couch_db:open_int(test_db_name(), []), UpSeq = couch_db:get_update_seq(Db2), couch_db:close(Db2), etap:is(LastSeq, UpSeq, "LastSeq is same as database update seq number"), etap:is(length(Rows), 1, "Received 1 changes rows"), [#row{seq = Seq1, id = Id1}] = Rows, etap:is(Id1, <<"doc3">>, "First row is for doc doc3"), etap:is(Seq1, 6, "First row has seq 6"), stop(Consumer), ChangesArgs2 = #changes_args{ filter = "_doc_ids", since = 6 }, Consumer2 = spawn_consumer(test_db_name(), ChangesArgs2, Req), {Rows2, LastSeq2} = wait_finished(Consumer2), {ok, Db3} = couch_db:open_int(test_db_name(), []), UpSeq2 = couch_db:get_update_seq(Db3), couch_db:close(Db3), etap:is(LastSeq2, UpSeq2, "LastSeq is same as database update seq number"), etap:is(length(Rows2), 0, "Received 0 change rows"), stop(Consumer2), {ok, _Rev3_3} = save_doc( Db, {[{<<"_id">>, <<"doc3">>}, {<<"_deleted">>, true}, {<<"_rev">>, Rev3_2}]}), ChangesArgs3 = #changes_args{ filter = "_doc_ids", since = 9 }, Consumer3 = spawn_consumer(test_db_name(), ChangesArgs3, Req), {Rows3, LastSeq3} = wait_finished(Consumer3), {ok, Db4} = couch_db:open_int(test_db_name(), []), UpSeq3 = couch_db:get_update_seq(Db4), couch_db:close(Db4), etap:is(LastSeq3, UpSeq3, "LastSeq is same as database update seq number"), etap:is(length(Rows3), 1, "Received 1 changes rows"), etap:is( [#row{seq = LastSeq3, id = <<"doc3">>, deleted = true}], Rows3, "Received row with doc3 deleted"), stop(Consumer3), delete_db(Db). test_by_doc_ids_continuous() -> {ok, Db} = create_db(test_db_name()), {ok, _Rev1} = save_doc(Db, {[{<<"_id">>, <<"doc1">>}]}), {ok, _Rev2} = save_doc(Db, {[{<<"_id">>, <<"doc2">>}]}), {ok, Rev3} = save_doc(Db, {[{<<"_id">>, <<"doc3">>}]}), {ok, Rev4} = save_doc(Db, {[{<<"_id">>, <<"doc4">>}]}), {ok, _Rev5} = save_doc(Db, {[{<<"_id">>, <<"doc5">>}]}), {ok, Rev3_2} = save_doc(Db, {[{<<"_id">>, <<"doc3">>}, {<<"_rev">>, Rev3}]}), {ok, _Rev6} = save_doc(Db, {[{<<"_id">>, <<"doc6">>}]}), {ok, _Rev7} = save_doc(Db, {[{<<"_id">>, <<"doc7">>}]}), {ok, _Rev8} = save_doc(Db, {[{<<"_id">>, <<"doc8">>}]}), ChangesArgs = #changes_args{ filter = "_doc_ids", feed = "continuous" }, DocIds = [<<"doc3">>, <<"doc4">>, <<"doc9999">>], Req = {json_req, {[{<<"doc_ids">>, DocIds}]}}, Consumer = spawn_consumer(test_db_name(), ChangesArgs, Req), pause(Consumer), Rows = get_rows(Consumer), etap:is(length(Rows), 2, "Received 2 changes rows"), [#row{seq = Seq1, id = Id1}, #row{seq = Seq2, id = Id2}] = Rows, etap:is(Id1, <<"doc4">>, "First row is for doc doc4"), etap:is(Seq1, 4, "First row has seq 4"), etap:is(Id2, <<"doc3">>, "Second row is for doc doc3"), etap:is(Seq2, 6, "Second row has seq 6"), clear_rows(Consumer), {ok, _Rev9} = save_doc(Db, {[{<<"_id">>, <<"doc9">>}]}), {ok, _Rev10} = save_doc(Db, {[{<<"_id">>, <<"doc10">>}]}), unpause(Consumer), pause(Consumer), etap:is(get_rows(Consumer), [], "No new rows"), {ok, Rev4_2} = save_doc(Db, {[{<<"_id">>, <<"doc4">>}, {<<"_rev">>, Rev4}]}), {ok, _Rev11} = save_doc(Db, {[{<<"_id">>, <<"doc11">>}]}), {ok, _Rev4_3} = save_doc(Db, {[{<<"_id">>, <<"doc4">>}, {<<"_rev">>, Rev4_2}]}), {ok, _Rev12} = save_doc(Db, {[{<<"_id">>, <<"doc12">>}]}), {ok, Rev3_3} = save_doc(Db, {[{<<"_id">>, <<"doc3">>}, {<<"_rev">>, Rev3_2}]}), unpause(Consumer), pause(Consumer), NewRows = get_rows(Consumer), etap:is(length(NewRows), 2, "Received 2 new rows"), [Row14, Row16] = NewRows, etap:is(Row14#row.seq, 14, "First row has seq 14"), etap:is(Row14#row.id, <<"doc4">>, "First row is for doc doc4"), etap:is(Row16#row.seq, 16, "Second row has seq 16"), etap:is(Row16#row.id, <<"doc3">>, "Second row is for doc doc3"), clear_rows(Consumer), {ok, _Rev3_4} = save_doc(Db, {[{<<"_id">>, <<"doc3">>}, {<<"_rev">>, Rev3_3}]}), unpause(Consumer), pause(Consumer), etap:is(get_rows(Consumer), [#row{seq = 17, id = <<"doc3">>}], "Got row for seq 17, doc doc3"), unpause(Consumer), stop(Consumer), delete_db(Db). test_design_docs_only() -> {ok, Db} = create_db(test_db_name()), {ok, _Rev1} = save_doc(Db, {[{<<"_id">>, <<"doc1">>}]}), {ok, _Rev2} = save_doc(Db, {[{<<"_id">>, <<"doc2">>}]}), {ok, Rev3} = save_doc(Db, {[{<<"_id">>, <<"_design/foo">>}]}), ChangesArgs = #changes_args{ filter = "_design" }, Consumer = spawn_consumer(test_db_name(), ChangesArgs, {json_req, null}), {Rows, LastSeq} = wait_finished(Consumer), {ok, Db2} = couch_db:open_int(test_db_name(), []), UpSeq = couch_db:get_update_seq(Db2), couch_db:close(Db2), etap:is(LastSeq, UpSeq, "LastSeq is same as database update seq number"), etap:is(length(Rows), 1, "Received 1 changes rows"), etap:is(Rows, [#row{seq = 3, id = <<"_design/foo">>}], "Received row with ddoc"), stop(Consumer), {ok, Db3} = couch_db:open_int( test_db_name(), [{user_ctx, #user_ctx{roles = [<<"_admin">>]}}]), {ok, _Rev3_2} = save_doc( Db3, {[{<<"_id">>, <<"_design/foo">>}, {<<"_rev">>, Rev3}, {<<"_deleted">>, true}]}), Consumer2 = spawn_consumer(test_db_name(), ChangesArgs, {json_req, null}), {Rows2, LastSeq2} = wait_finished(Consumer2), UpSeq2 = UpSeq + 1, couch_db:close(Db3), etap:is(LastSeq2, UpSeq2, "LastSeq is same as database update seq number"), etap:is(length(Rows2), 1, "Received 1 changes rows"), etap:is( Rows2, [#row{seq = 4, id = <<"_design/foo">>, deleted = true}], "Received row with deleted ddoc"), stop(Consumer2), delete_db(Db). test_heartbeat() -> {ok, Db} = create_db(test_db_name()), {ok, _} = save_doc(Db, {[ {<<"_id">>, <<"_design/foo">>}, {<<"language">>, <<"javascript">>}, {<<"filters">>, {[ {<<"foo">>, <<"function(doc) { if ((doc._id == 'doc10') || (doc._id == 'doc11') || (doc._id == 'doc12')) { return true; } else { return false; }}">> }]}} ]}), ChangesArgs = #changes_args{ filter = "foo/foo", feed = "continuous", timeout = 10000, heartbeat = 1000 }, Consumer = spawn_consumer(test_db_name(), ChangesArgs, {json_req, null}), {ok, _Rev1} = save_doc(Db, {[{<<"_id">>, <<"doc1">>}]}), timer:sleep(200), {ok, _Rev2} = save_doc(Db, {[{<<"_id">>, <<"doc2">>}]}), timer:sleep(200), {ok, _Rev3} = save_doc(Db, {[{<<"_id">>, <<"doc3">>}]}), timer:sleep(200), {ok, _Rev4} = save_doc(Db, {[{<<"_id">>, <<"doc4">>}]}), timer:sleep(200), {ok, _Rev5} = save_doc(Db, {[{<<"_id">>, <<"doc5">>}]}), timer:sleep(200), {ok, _Rev6} = save_doc(Db, {[{<<"_id">>, <<"doc6">>}]}), timer:sleep(200), {ok, _Rev7} = save_doc(Db, {[{<<"_id">>, <<"doc7">>}]}), timer:sleep(200), {ok, _Rev8} = save_doc(Db, {[{<<"_id">>, <<"doc8">>}]}), timer:sleep(200), {ok, _Rev9} = save_doc(Db, {[{<<"_id">>, <<"doc9">>}]}), Heartbeats = get_heartbeats(Consumer), etap:is(Heartbeats, 2, "Received 2 heartbeats now"), {ok, _Rev10} = save_doc(Db, {[{<<"_id">>, <<"doc10">>}]}), timer:sleep(200), {ok, _Rev11} = save_doc(Db, {[{<<"_id">>, <<"doc11">>}]}), timer:sleep(200), {ok, _Rev12} = save_doc(Db, {[{<<"_id">>, <<"doc12">>}]}), Heartbeats2 = get_heartbeats(Consumer), etap:is(Heartbeats2, 3, "Received 3 heartbeats now"), Rows = get_rows(Consumer), etap:is(length(Rows), 3, "Received 3 changes rows"), {ok, _Rev13} = save_doc(Db, {[{<<"_id">>, <<"doc13">>}]}), timer:sleep(200), {ok, _Rev14} = save_doc(Db, {[{<<"_id">>, <<"doc14">>}]}), timer:sleep(200), Heartbeats3 = get_heartbeats(Consumer), etap:is(Heartbeats3, 6, "Received 6 heartbeats now"), stop(Consumer), couch_db:close(Db), delete_db(Db). save_doc(Db, Json) -> Doc = couch_doc:from_json_obj(Json), {ok, Rev} = couch_db:update_doc(Db, Doc, []), {ok, couch_doc:rev_to_str(Rev)}. get_rows(Consumer) -> Ref = make_ref(), Consumer ! {get_rows, Ref}, receive {rows, Ref, Rows} -> Rows after 3000 -> etap:bail("Timeout getting rows from consumer") end. get_heartbeats(Consumer) -> Ref = make_ref(), Consumer ! {get_heartbeats, Ref}, receive {hearthbeats, Ref, HeartBeats} -> HeartBeats after 3000 -> etap:bail("Timeout getting heartbeats from consumer") end. clear_rows(Consumer) -> Ref = make_ref(), Consumer ! {reset, Ref}, receive {ok, Ref} -> ok after 3000 -> etap:bail("Timeout clearing consumer rows") end. stop(Consumer) -> Ref = make_ref(), Consumer ! {stop, Ref}, receive {ok, Ref} -> ok after 3000 -> etap:bail("Timeout stopping consumer") end. pause(Consumer) -> Ref = make_ref(), Consumer ! {pause, Ref}, receive {paused, Ref} -> ok after 3000 -> etap:bail("Timeout pausing consumer") end. unpause(Consumer) -> Ref = make_ref(), Consumer ! {continue, Ref}, receive {ok, Ref} -> ok after 3000 -> etap:bail("Timeout unpausing consumer") end. wait_finished(_Consumer) -> receive {consumer_finished, Rows, LastSeq} -> {Rows, LastSeq} after 30000 -> etap:bail("Timeout waiting for consumer to finish") end. spawn_consumer(DbName, ChangesArgs0, Req) -> Parent = self(), spawn(fun() -> put(heartbeat_count, 0), Callback = fun({change, {Change}, _}, _, Acc) -> Id = couch_util:get_value(<<"id">>, Change), Seq = couch_util:get_value(<<"seq">>, Change), Del = couch_util:get_value(<<"deleted">>, Change, false), [#row{id = Id, seq = Seq, deleted = Del} | Acc]; ({stop, LastSeq}, _, Acc) -> Parent ! {consumer_finished, lists:reverse(Acc), LastSeq}, stop_loop(Parent, Acc); (timeout, _, Acc) -> put(heartbeat_count, get(heartbeat_count) + 1), maybe_pause(Parent, Acc); (_, _, Acc) -> maybe_pause(Parent, Acc) end, {ok, Db} = couch_db:open_int(DbName, []), ChangesArgs = case (ChangesArgs0#changes_args.timeout =:= undefined) andalso (ChangesArgs0#changes_args.heartbeat =:= undefined) of true -> ChangesArgs0#changes_args{timeout = 10, heartbeat = 10}; false -> ChangesArgs0 end, FeedFun = couch_changes:handle_changes(ChangesArgs, Req, Db), try FeedFun({Callback, []}) catch throw:{stop, _} -> ok end, catch couch_db:close(Db) end). maybe_pause(Parent, Acc) -> receive {get_rows, Ref} -> Parent ! {rows, Ref, lists:reverse(Acc)}, maybe_pause(Parent, Acc); {get_heartbeats, Ref} -> Parent ! {hearthbeats, Ref, get(heartbeat_count)}, maybe_pause(Parent, Acc); {reset, Ref} -> Parent ! {ok, Ref}, maybe_pause(Parent, []); {pause, Ref} -> Parent ! {paused, Ref}, pause_loop(Parent, Acc); {stop, Ref} -> Parent ! {ok, Ref}, throw({stop, Acc}) after 0 -> Acc end. pause_loop(Parent, Acc) -> receive {stop, Ref} -> Parent ! {ok, Ref}, throw({stop, Acc}); {reset, Ref} -> Parent ! {ok, Ref}, pause_loop(Parent, []); {continue, Ref} -> Parent ! {ok, Ref}, Acc; {get_rows, Ref} -> Parent ! {rows, Ref, lists:reverse(Acc)}, pause_loop(Parent, Acc) end. stop_loop(Parent, Acc) -> receive {get_rows, Ref} -> Parent ! {rows, Ref, lists:reverse(Acc)}, stop_loop(Parent, Acc); {stop, Ref} -> Parent ! {ok, Ref}, Acc end. create_db(DbName) -> couch_db:create( DbName, [{user_ctx, #user_ctx{roles = [<<"_admin">>]}}, overwrite]). delete_db(Db) -> ok = couch_server:delete( couch_db:name(Db), [{user_ctx, #user_ctx{roles = [<<"_admin">>]}}]). apache-couchdb-1.6.0/test/etap/180-http-proxy.ini0000644000175000001440000000167212332105522021401 0ustar00djcusers00000000000000; Licensed to the Apache Software Foundation (ASF) under one ; or more contributor license agreements. See the NOTICE file ; distributed with this work for additional information ; regarding copyright ownership. The ASF licenses this file ; to you under the Apache License, Version 2.0 (the ; "License"); you may not use this file except in compliance ; with the License. You may obtain a copy of the License at ; ; http://www.apache.org/licenses/LICENSE-2.0 ; ; Unless required by applicable law or agreed to in writing, ; software distributed under the License is distributed on an ; "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY ; KIND, either express or implied. See the License for the ; specific language governing permissions and limitations ; under the License. ; 49151 is IANA Reserved, let's assume no one is listening there [httpd_global_handlers] _error = {couch_httpd_proxy, handle_proxy_req, <<"http://127.0.0.1:49151/">>} apache-couchdb-1.6.0/test/etap/031-doc-to-json.t0000755000175000001440000001501712332105522021057 0ustar00djcusers00000000000000#!/usr/bin/env escript %% -*- erlang -*- %%! -pa ./src/couchdb -pa ./src/mochiweb -sasl errlog_type false -noshell % Licensed under the Apache License, Version 2.0 (the "License"); you may not % use this file except in compliance with the License. You may obtain a copy of % the License at % % http://www.apache.org/licenses/LICENSE-2.0 % % Unless required by applicable law or agreed to in writing, software % distributed under the License is distributed on an "AS IS" BASIS, WITHOUT % WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the % License for the specific language governing permissions and limitations under % the License. %% XXX: Figure out how to -include("couch_db.hrl") -record(doc, {id= <<"">>, revs={0, []}, body={[]}, atts=[], deleted=false, meta=[]}). -record(att, {name, type, att_len, disk_len, md5= <<>>, revpos=0, data, encoding=identity}). main(_) -> test_util:init_code_path(), etap:plan(12), case (catch test()) of ok -> etap:end_tests(); Other -> etap:diag(io_lib:format("Test died abnormally: ~p", [Other])), etap:bail() end, ok. test() -> couch_config:start_link(test_util:config_files()), couch_config:set("attachments", "compression_level", "0", false), ok = test_to_json_success(), ok. test_to_json_success() -> Cases = [ { #doc{}, {[{<<"_id">>, <<"">>}]}, "Empty docs are {\"_id\": \"\"}" }, { #doc{id= <<"foo">>}, {[{<<"_id">>, <<"foo">>}]}, "_id is added." }, { #doc{revs={5, ["foo"]}}, {[{<<"_id">>, <<>>}, {<<"_rev">>, <<"5-foo">>}]}, "_rev is added." }, { [revs], #doc{revs={5, [<<"first">>, <<"second">>]}}, {[ {<<"_id">>, <<>>}, {<<"_rev">>, <<"5-first">>}, {<<"_revisions">>, {[ {<<"start">>, 5}, {<<"ids">>, [<<"first">>, <<"second">>]} ]}} ]}, "_revisions include with revs option" }, { #doc{body={[{<<"foo">>, <<"bar">>}]}}, {[{<<"_id">>, <<>>}, {<<"foo">>, <<"bar">>}]}, "Arbitrary fields are added." }, { #doc{deleted=true, body={[{<<"foo">>, <<"bar">>}]}}, {[{<<"_id">>, <<>>}, {<<"foo">>, <<"bar">>}, {<<"_deleted">>, true}]}, "Deleted docs no longer drop body members." }, { #doc{meta=[ {revs_info, 4, [{<<"fin">>, deleted}, {<<"zim">>, missing}]} ]}, {[ {<<"_id">>, <<>>}, {<<"_revs_info">>, [ {[{<<"rev">>, <<"4-fin">>}, {<<"status">>, <<"deleted">>}]}, {[{<<"rev">>, <<"3-zim">>}, {<<"status">>, <<"missing">>}]} ]} ]}, "_revs_info field is added correctly." }, { #doc{meta=[{local_seq, 5}]}, {[{<<"_id">>, <<>>}, {<<"_local_seq">>, 5}]}, "_local_seq is added as an integer." }, { #doc{meta=[{conflicts, [{3, <<"yep">>}, {1, <<"snow">>}]}]}, {[ {<<"_id">>, <<>>}, {<<"_conflicts">>, [<<"3-yep">>, <<"1-snow">>]} ]}, "_conflicts is added as an array of strings." }, { #doc{meta=[{deleted_conflicts, [{10923, <<"big_cowboy_hat">>}]}]}, {[ {<<"_id">>, <<>>}, {<<"_deleted_conflicts">>, [<<"10923-big_cowboy_hat">>]} ]}, "_deleted_conflicsts is added as an array of strings." }, { #doc{atts=[ #att{ name = <<"big.xml">>, type = <<"xml/sucks">>, data = fun() -> ok end, revpos = 1, att_len = 400, disk_len = 400 }, #att{ name = <<"fast.json">>, type = <<"json/ftw">>, data = <<"{\"so\": \"there!\"}">>, revpos = 1, att_len = 16, disk_len = 16 } ]}, {[ {<<"_id">>, <<>>}, {<<"_attachments">>, {[ {<<"big.xml">>, {[ {<<"content_type">>, <<"xml/sucks">>}, {<<"revpos">>, 1}, {<<"length">>, 400}, {<<"stub">>, true} ]}}, {<<"fast.json">>, {[ {<<"content_type">>, <<"json/ftw">>}, {<<"revpos">>, 1}, {<<"length">>, 16}, {<<"stub">>, true} ]}} ]}} ]}, "Attachments attached as stubs only include a length." }, { [attachments], #doc{atts=[ #att{ name = <<"stuff.txt">>, type = <<"text/plain">>, data = fun() -> <<"diet pepsi">> end, revpos = 1, att_len = 10, disk_len = 10 }, #att{ name = <<"food.now">>, type = <<"application/food">>, revpos = 1, data = <<"sammich">> } ]}, {[ {<<"_id">>, <<>>}, {<<"_attachments">>, {[ {<<"stuff.txt">>, {[ {<<"content_type">>, <<"text/plain">>}, {<<"revpos">>, 1}, {<<"data">>, <<"ZGlldCBwZXBzaQ==">>} ]}}, {<<"food.now">>, {[ {<<"content_type">>, <<"application/food">>}, {<<"revpos">>, 1}, {<<"data">>, <<"c2FtbWljaA==">>} ]}} ]}} ]}, "Attachments included inline with attachments option." } ], lists:foreach(fun ({Doc, EJson, Mesg}) -> etap:is(couch_doc:to_json_obj(Doc, []), EJson, Mesg); ({Options, Doc, EJson, Mesg}) -> etap:is(couch_doc:to_json_obj(Doc, Options), EJson, Mesg) end, Cases), ok. apache-couchdb-1.6.0/test/etap/210-os-proc-pool.t0000755000175000001440000001173112332105522021252 0ustar00djcusers00000000000000#!/usr/bin/env escript %% -*- erlang -*- % Licensed under the Apache License, Version 2.0 (the "License"); you may not % use this file except in compliance with the License. You may obtain a copy of % the License at % % http://www.apache.org/licenses/LICENSE-2.0 % % Unless required by applicable law or agreed to in writing, software % distributed under the License is distributed on an "AS IS" BASIS, WITHOUT % WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the % License for the specific language governing permissions and limitations under % the License. main(_) -> test_util:init_code_path(), etap:plan(21), case (catch test()) of ok -> etap:end_tests(); Other -> etap:diag(io_lib:format("Test died abnormally: ~p", [Other])), etap:bail(Other) end, ok. test() -> couch_server_sup:start_link(test_util:config_files()), couch_config:set("query_server_config", "os_process_limit", "3", false), test_pool_full(), test_client_unexpected_exit(), couch_server_sup:stop(), ok. test_pool_full() -> Client1 = spawn_client(), Client2 = spawn_client(), Client3 = spawn_client(), etap:diag("Check that we can spawn the max number of processes."), etap:is(ping_client(Client1), ok, "Client 1 started ok."), etap:is(ping_client(Client2), ok, "Client 2 started ok."), etap:is(ping_client(Client3), ok, "Client 3 started ok."), Proc1 = get_client_proc(Client1, "1"), Proc2 = get_client_proc(Client2, "2"), Proc3 = get_client_proc(Client3, "3"), etap:isnt(Proc1, Proc2, "Clients 1 and 2 got different procs."), etap:isnt(Proc2, Proc3, "Clients 2 and 3 got different procs."), etap:isnt(Proc1, Proc3, "Clients 1 and 3 got different procs."), etap:diag("Check that client 4 blocks waiting for a process."), Client4 = spawn_client(), etap:is(ping_client(Client4), timeout, "Client 4 blocked while waiting."), etap:diag("Check that stopping a client gives up its process."), etap:is(stop_client(Client1), ok, "First client stopped."), etap:diag("And check that our blocked process has been unblocked."), etap:is(ping_client(Client4), ok, "Client was unblocked."), Proc4 = get_client_proc(Client4, "4"), etap:is(Proc4, Proc1, "Client 4 got proc that client 1 got before."), lists:map(fun(C) -> ok = stop_client(C) end, [Client2, Client3, Client4]). test_client_unexpected_exit() -> Client1 = spawn_client(), Client2 = spawn_client(), Client3 = spawn_client(), etap:diag("Check that up to os_process_limit clients started."), etap:is(ping_client(Client1), ok, "Client 1 started ok."), etap:is(ping_client(Client2), ok, "Client 2 started ok."), etap:is(ping_client(Client3), ok, "Client 3 started ok."), Proc1 = get_client_proc(Client1, "1"), Proc2 = get_client_proc(Client2, "2"), Proc3 = get_client_proc(Client3, "3"), etap:isnt(Proc1, Proc2, "Clients 1 and 2 got different procs."), etap:isnt(Proc2, Proc3, "Clients 2 and 3 got different procs."), etap:isnt(Proc1, Proc3, "Clients 1 and 3 got different procs."), etap:diag("Check that killing a client frees an os_process."), etap:is(kill_client(Client1), ok, "Client 1 died all right."), etap:diag("Check that a new client is not blocked on boot."), Client4 = spawn_client(), etap:is(ping_client(Client4), ok, "New client booted without blocking."), Proc4 = get_client_proc(Client4, "4"), etap:isnt(Proc4, Proc1, "Client 4 got a proc different from the one client 1 got before."), etap:isnt(Proc4, Proc2, "Client 4's proc different from client 2's proc."), etap:isnt(Proc4, Proc3, "Client 4's proc different from client 3's proc."), lists:map(fun(C) -> ok = stop_client(C) end, [Client2, Client3, Client4]). spawn_client() -> Parent = self(), Ref = make_ref(), Pid = spawn(fun() -> Proc = couch_query_servers:get_os_process(<<"javascript">>), loop(Parent, Ref, Proc) end), {Pid, Ref}. ping_client({Pid, Ref}) -> Pid ! ping, receive {pong, Ref} -> ok after 3000 -> timeout end. get_client_proc({Pid, Ref}, ClientName) -> Pid ! get_proc, receive {proc, Ref, Proc} -> Proc after 3000 -> etap:bail("Timeout getting client " ++ ClientName ++ " proc.") end. stop_client({Pid, Ref}) -> Pid ! stop, receive {stop, Ref} -> ok after 3000 -> timeout end. kill_client({Pid, Ref}) -> Pid ! die, receive {die, Ref} -> ok after 3000 -> timeout end. loop(Parent, Ref, Proc) -> receive ping -> Parent ! {pong, Ref}, loop(Parent, Ref, Proc); get_proc -> Parent ! {proc, Ref, Proc}, loop(Parent, Ref, Proc); stop -> couch_query_servers:ret_os_process(Proc), Parent ! {stop, Ref}; die -> Parent ! {die, Ref}, exit(some_error) end. apache-couchdb-1.6.0/test/etap/172-os-daemon-errors.t0000755000175000001440000001005112332105522022116 0ustar00djcusers00000000000000#!/usr/bin/env escript %% -*- erlang -*- % Licensed under the Apache License, Version 2.0 (the "License"); you may not % use this file except in compliance with the License. You may obtain a copy of % the License at % % http://www.apache.org/licenses/LICENSE-2.0 % % Unless required by applicable law or agreed to in writing, software % distributed under the License is distributed on an "AS IS" BASIS, WITHOUT % WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the % License for the specific language governing permissions and limitations under % the License. -record(daemon, { port, name, cmd, kill, status=running, cfg_patterns=[], errors=[], buf=[] }). config_files() -> lists:map(fun test_util:build_file/1, [ "etc/couchdb/default_dev.ini" ]). bad_perms() -> test_util:source_file("test/etap/172-os-daemon-errors.1.sh"). die_on_boot() -> test_util:source_file("test/etap/172-os-daemon-errors.2.sh"). die_quickly() -> test_util:source_file("test/etap/172-os-daemon-errors.3.sh"). can_reboot() -> test_util:source_file("test/etap/172-os-daemon-errors.4.sh"). main(_) -> test_util:init_code_path(), etap:plan(36), case (catch test()) of ok -> etap:end_tests(); Other -> etap:diag(io_lib:format("Test died abnormally: ~p", [Other])), etap:bail(Other) end, ok. test() -> couch_config:start_link(config_files()), couch_os_daemons:start_link(), etap:diag("Daemon not executable."), test_halts("foo", bad_perms(), 1000), etap:diag("Daemon dies on boot."), test_halts("bar", die_on_boot(), 1000), etap:diag("Daemon dies quickly after boot."), test_halts("baz", die_quickly(), 4000), etap:diag("Daemon dies, but not quickly enough to be halted."), test_runs("bam", can_reboot()), ok. test_halts(Name, Cmd, Time) -> couch_config:set("os_daemons", Name, Cmd ++ " 2> /dev/null", false), timer:sleep(Time), {ok, [D]} = couch_os_daemons:info([table]), check_dead(D, Name, Cmd), couch_config:delete("os_daemons", Name, false). test_runs(Name, Cmd) -> couch_config:set("os_daemons", Name, Cmd, false), timer:sleep(1000), {ok, [D1]} = couch_os_daemons:info([table]), check_daemon(D1, Name, Cmd, 0), % Should reboot every two seconds. We're at 1s, so wait % utnil 3s to be in the middle of the next invocation's % life span. timer:sleep(2000), {ok, [D2]} = couch_os_daemons:info([table]), check_daemon(D2, Name, Cmd, 1), % If the kill command changed, that means we rebooted the process. etap:isnt(D1#daemon.kill, D2#daemon.kill, "Kill command changed."). check_dead(D, Name, Cmd) -> BaseName = filename:basename(Cmd) ++ " 2> /dev/null", BaseLen = length(BaseName), CmdLen = length(D#daemon.cmd), CmdName = lists:sublist(D#daemon.cmd, CmdLen-BaseLen+1, BaseLen), etap:is(is_port(D#daemon.port), true, "Daemon port is a port."), etap:is(D#daemon.name, Name, "Daemon name was set correctly."), etap:is(CmdName, BaseName, "Command name was set correctly."), etap:isnt(D#daemon.kill, undefined, "Kill command was set."), etap:is(D#daemon.status, halted, "Daemon has been halted."), etap:is(D#daemon.errors, nil, "Errors have been disabled."), etap:is(D#daemon.buf, nil, "Buffer has been switched off."). check_daemon(D, Name, Cmd, Errs) -> BaseName = filename:basename(Cmd), BaseLen = length(BaseName), CmdLen = length(D#daemon.cmd), CmdName = lists:sublist(D#daemon.cmd, CmdLen-BaseLen+1, BaseLen), etap:is(is_port(D#daemon.port), true, "Daemon port is a port."), etap:is(D#daemon.name, Name, "Daemon name was set correctly."), etap:is(CmdName, BaseName, "Command name was set correctly."), etap:isnt(D#daemon.kill, undefined, "Kill command was set."), etap:is(D#daemon.status, running, "Daemon still running."), etap:is(length(D#daemon.errors), Errs, "Found expected number of errors."), etap:is(D#daemon.buf, [], "No extra data left in the buffer."). apache-couchdb-1.6.0/test/etap/020-btree-basics.t0000755000175000001440000002255112332105522021265 0ustar00djcusers00000000000000#!/usr/bin/env escript %% -*- erlang -*- %%! -pa ./src/couchdb -sasl errlog_type error -boot start_sasl -noshell % Licensed under the Apache License, Version 2.0 (the "License"); you may not % use this file except in compliance with the License. You may obtain a copy of % the License at % % http://www.apache.org/licenses/LICENSE-2.0 % % Unless required by applicable law or agreed to in writing, software % distributed under the License is distributed on an "AS IS" BASIS, WITHOUT % WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the % License for the specific language governing permissions and limitations under % the License. filename() -> test_util:build_file("test/etap/temp.020"). rows() -> 250. -record(btree, { fd, root, extract_kv, assemble_kv, less, reduce, compression }). main(_) -> test_util:init_code_path(), etap:plan(75), case (catch test()) of ok -> etap:end_tests(); Other -> etap:diag(io_lib:format("Test died abnormally: ~p", [Other])), etap:bail() end, ok. %% @todo Determine if this number should be greater to see if the btree was %% broken into multiple nodes. AKA "How do we appropiately detect if multiple %% nodes were created." test()-> Sorted = [{Seq, random:uniform()} || Seq <- lists:seq(1, rows())], etap:ok(test_kvs(Sorted), "Testing sorted keys"), etap:ok(test_kvs(lists:reverse(Sorted)), "Testing reversed sorted keys"), etap:ok(test_kvs(shuffle(Sorted)), "Testing shuffled keys."), ok. test_kvs(KeyValues) -> ReduceFun = fun (reduce, KVs) -> length(KVs); (rereduce, Reds) -> lists:sum(Reds) end, Keys = [K || {K, _} <- KeyValues], {ok, Fd} = couch_file:open(filename(), [create,overwrite]), {ok, Btree} = couch_btree:open(nil, Fd, [{compression, none}]), etap:ok(is_record(Btree, btree), "Created btree is really a btree record"), etap:is(Btree#btree.fd, Fd, "Btree#btree.fd is set correctly."), etap:is(Btree#btree.root, nil, "Btree#btree.root is set correctly."), etap:is(0, couch_btree:size(Btree), "Empty btrees have a 0 size."), Btree1 = couch_btree:set_options(Btree, [{reduce, ReduceFun}]), etap:is(Btree1#btree.reduce, ReduceFun, "Reduce function was set"), {ok, _, EmptyRes} = couch_btree:foldl(Btree1, fun(_, X) -> {ok, X+1} end, 0), etap:is(EmptyRes, 0, "Folding over an empty btree"), {ok, Btree2} = couch_btree:add_remove(Btree1, KeyValues, []), etap:ok(test_btree(Btree2, KeyValues), "Adding all keys at once returns a complete btree."), etap:is((couch_btree:size(Btree2) > 0), true, "Non empty btrees have a size > 0."), etap:is((couch_btree:size(Btree2) =< couch_file:bytes(Fd)), true, "Btree size is <= file size."), etap:fun_is( fun ({ok, {kp_node, _}}) -> true; (_) -> false end, couch_file:pread_term(Fd, element(1, Btree2#btree.root)), "Btree root pointer is a kp_node." ), {ok, Btree3} = couch_btree:add_remove(Btree2, [], Keys), etap:ok(test_btree(Btree3, []), "Removing all keys at once returns an empty btree."), etap:is(0, couch_btree:size(Btree3), "After removing all keys btree size is 0."), {Btree4, _} = lists:foldl(fun(KV, {BtAcc, PrevSize}) -> {ok, BtAcc2} = couch_btree:add_remove(BtAcc, [KV], []), case couch_btree:size(BtAcc2) > PrevSize of true -> ok; false -> etap:bail("After inserting a value, btree size did not increase.") end, {BtAcc2, couch_btree:size(BtAcc2)} end, {Btree3, couch_btree:size(Btree3)}, KeyValues), etap:ok(test_btree(Btree4, KeyValues), "Adding all keys one at a time returns a complete btree."), etap:is((couch_btree:size(Btree4) > 0), true, "Non empty btrees have a size > 0."), {Btree5, _} = lists:foldl(fun({K, _}, {BtAcc, PrevSize}) -> {ok, BtAcc2} = couch_btree:add_remove(BtAcc, [], [K]), case couch_btree:size(BtAcc2) < PrevSize of true -> ok; false -> etap:bail("After removing a key, btree size did not decrease.") end, {BtAcc2, couch_btree:size(BtAcc2)} end, {Btree4, couch_btree:size(Btree4)}, KeyValues), etap:ok(test_btree(Btree5, []), "Removing all keys one at a time returns an empty btree."), etap:is(0, couch_btree:size(Btree5), "After removing all keys, one by one, btree size is 0."), KeyValuesRev = lists:reverse(KeyValues), {Btree6, _} = lists:foldl(fun(KV, {BtAcc, PrevSize}) -> {ok, BtAcc2} = couch_btree:add_remove(BtAcc, [KV], []), case couch_btree:size(BtAcc2) > PrevSize of true -> ok; false -> etap:is(false, true, "After inserting a value, btree size did not increase.") end, {BtAcc2, couch_btree:size(BtAcc2)} end, {Btree5, couch_btree:size(Btree5)}, KeyValuesRev), etap:ok(test_btree(Btree6, KeyValues), "Adding all keys in reverse order returns a complete btree."), {_, Rem2Keys0, Rem2Keys1} = lists:foldl(fun(X, {Count, Left, Right}) -> case Count rem 2 == 0 of true-> {Count+1, [X | Left], Right}; false -> {Count+1, Left, [X | Right]} end end, {0, [], []}, KeyValues), etap:ok(test_add_remove(Btree6, Rem2Keys0, Rem2Keys1), "Add/Remove every other key."), etap:ok(test_add_remove(Btree6, Rem2Keys1, Rem2Keys0), "Add/Remove opposite every other key."), Size1 = couch_btree:size(Btree6), {ok, Btree7} = couch_btree:add_remove(Btree6, [], [K||{K,_}<-Rem2Keys1]), Size2 = couch_btree:size(Btree7), etap:is((Size2 < Size1), true, "Btree size decreased"), {ok, Btree8} = couch_btree:add_remove(Btree7, [], [K||{K,_}<-Rem2Keys0]), Size3 = couch_btree:size(Btree8), etap:is((Size3 < Size2), true, "Btree size decreased"), etap:is(Size3, 0, "Empty btree has size 0."), etap:ok(test_btree(Btree8, []), "Removing both halves of every other key returns an empty btree."), %% Third chunk (close out) etap:is(couch_file:close(Fd), ok, "closing out"), true. test_btree(Btree, KeyValues) -> ok = test_key_access(Btree, KeyValues), ok = test_lookup_access(Btree, KeyValues), ok = test_final_reductions(Btree, KeyValues), ok = test_traversal_callbacks(Btree, KeyValues), true. test_add_remove(Btree, OutKeyValues, RemainingKeyValues) -> Btree2 = lists:foldl(fun({K, _}, BtAcc) -> {ok, BtAcc2} = couch_btree:add_remove(BtAcc, [], [K]), BtAcc2 end, Btree, OutKeyValues), true = test_btree(Btree2, RemainingKeyValues), Btree3 = lists:foldl(fun(KV, BtAcc) -> {ok, BtAcc2} = couch_btree:add_remove(BtAcc, [KV], []), BtAcc2 end, Btree2, OutKeyValues), true = test_btree(Btree3, OutKeyValues ++ RemainingKeyValues). test_key_access(Btree, List) -> FoldFun = fun(Element, {[HAcc|TAcc], Count}) -> case Element == HAcc of true -> {ok, {TAcc, Count + 1}}; _ -> {ok, {TAcc, Count + 1}} end end, Length = length(List), Sorted = lists:sort(List), {ok, _, {[], Length}} = couch_btree:foldl(Btree, FoldFun, {Sorted, 0}), {ok, _, {[], Length}} = couch_btree:fold(Btree, FoldFun, {Sorted, 0}, [{dir, rev}]), ok. test_lookup_access(Btree, KeyValues) -> FoldFun = fun({Key, Value}, {Key, Value}) -> {stop, true} end, lists:foreach(fun({Key, Value}) -> [{ok, {Key, Value}}] = couch_btree:lookup(Btree, [Key]), {ok, _, true} = couch_btree:foldl(Btree, FoldFun, {Key, Value}, [{start_key, Key}]) end, KeyValues). test_final_reductions(Btree, KeyValues) -> KVLen = length(KeyValues), FoldLFun = fun(_X, LeadingReds, Acc) -> CountToStart = KVLen div 3 + Acc, CountToStart = couch_btree:final_reduce(Btree, LeadingReds), {ok, Acc+1} end, FoldRFun = fun(_X, LeadingReds, Acc) -> CountToEnd = KVLen - KVLen div 3 + Acc, CountToEnd = couch_btree:final_reduce(Btree, LeadingReds), {ok, Acc+1} end, {LStartKey, _} = case KVLen of 0 -> {nil, nil}; _ -> lists:nth(KVLen div 3 + 1, lists:sort(KeyValues)) end, {RStartKey, _} = case KVLen of 0 -> {nil, nil}; _ -> lists:nth(KVLen div 3, lists:sort(KeyValues)) end, {ok, _, FoldLRed} = couch_btree:foldl(Btree, FoldLFun, 0, [{start_key, LStartKey}]), {ok, _, FoldRRed} = couch_btree:fold(Btree, FoldRFun, 0, [{dir, rev}, {start_key, RStartKey}]), KVLen = FoldLRed + FoldRRed, ok. test_traversal_callbacks(Btree, _KeyValues) -> FoldFun = fun (visit, _GroupedKey, _Unreduced, Acc) -> {ok, Acc andalso false}; (traverse, _LK, _Red, Acc) -> {skip, Acc andalso true} end, % With 250 items the root is a kp. Always skipping should reduce to true. {ok, _, true} = couch_btree:fold(Btree, FoldFun, true, [{dir, fwd}]), ok. shuffle(List) -> randomize(round(math:log(length(List)) + 0.5), List). randomize(1, List) -> randomize(List); randomize(T, List) -> lists:foldl(fun(_E, Acc) -> randomize(Acc) end, randomize(List), lists:seq(1, (T - 1))). randomize(List) -> D = lists:map(fun(A) -> {random:uniform(), A} end, List), {_, D1} = lists:unzip(lists:keysort(1, D)), D1. apache-couchdb-1.6.0/test/etap/250-upgrade-legacy-view-files.t0000644000175000001440000001143612332105522023665 0ustar00djcusers00000000000000#!/usr/bin/env escript %% -*- erlang -*- % Licensed under the Apache License, Version 2.0 (the "License"); you may not % use this file except in compliance with the License. You may obtain a copy of % the License at % % http://www.apache.org/licenses/LICENSE-2.0 % % Unless required by applicable law or agreed to in writing, software % distributed under the License is distributed on an "AS IS" BASIS, WITHOUT % WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the % License for the specific language governing permissions and limitations under % the License. main(_) -> test_util:init_code_path(), etap:plan(8), case (catch test()) of ok -> etap:end_tests(); Other -> etap:diag(io_lib:format("Test died abnormally: ~p", [Other])), etap:bail(Other) end, ok. test() -> couch_server_sup:start_link(test_util:config_files()), % commit sofort ok = couch_config:set("query_server_config", "commit_freq", "0"), test_upgrade(), couch_server_sup:stop(), ok. fixture_path() -> test_util:source_file("test/etap/fixtures"). old_db() -> fixture_path() ++ "/" ++ old_db_name(). old_db_name() -> "test.couch". old_view() -> fixture_path() ++ "/" ++ old_view_name(). old_view_name() -> "3b835456c235b1827e012e25666152f3.view". new_view_name() -> "a1c5929f912aca32f13446122cc6ce50.view". couch_url() -> "http://" ++ addr() ++ ":" ++ port(). addr() -> couch_config:get("httpd", "bind_address", "127.0.0.1"). port() -> integer_to_list(mochiweb_socket_server:get(couch_httpd, port)). % <= 1.2.x -record(index_header, {seq=0, purge_seq=0, id_btree_state=nil, view_states=nil }). % >= 1.3.x -record(mrheader, { seq=0, purge_seq=0, id_btree_state=nil, view_states=nil }). ensure_header(File, MatchFun, Msg) -> {ok, Fd} = couch_file:open(File), {ok, {_Sig, Header}} = couch_file:read_header(Fd), couch_file:close(Fd), etap:fun_is(MatchFun, Header, "ensure " ++ Msg ++ " header for file: " ++ File). file_exists(File) -> % open without creating case file:open(File, [read, raw]) of {ok, Fd_Read} -> file:close(Fd_Read), true; _Error -> false end. cleanup() -> DbDir = couch_config:get("couchdb", "database_dir"), Files = [ DbDir ++ "/test.couch", DbDir ++ "/.test_design/" ++ old_view_name(), DbDir ++ "/.test_design/mrview/" ++ new_view_name() ], lists:foreach(fun(File) -> file:delete(File) end, Files), etap:ok(true, "cleanup"). test_upgrade() -> cleanup(), % copy old db file into db dir DbDir = couch_config:get("couchdb", "database_dir"), DbTarget = DbDir ++ "/" ++ old_db_name(), filelib:ensure_dir(DbDir), OldDbName = old_db(), {ok, _} = file:copy(OldDbName, DbTarget), % copy old view file into view dir ViewDir = couch_config:get("couchdb", "view_index_dir"), ViewTarget = ViewDir ++ "/.test_design/" ++ old_view_name(), filelib:ensure_dir(ViewTarget), OldViewName = old_view(), {ok, _} = file:copy(OldViewName, ViewTarget), % ensure old header ensure_header(ViewTarget, fun(#index_header{}) -> true; (_) -> false end, "old"), % query view ViewUrl = couch_url() ++ "/test/_design/test/_view/test", {ok, Code, _Headers, Body} = test_util:request(ViewUrl, [], get), % expect results etap:is(Code, 200, "valid view result http status code"), ExpectBody = <<"{\"total_rows\":2,\"offset\":0,\"rows\":[\r\n{\"id\":\"193f2f9c596ddc7ad326f7da470009ec\",\"key\":1,\"value\":null},\r\n{\"id\":\"193f2f9c596ddc7ad326f7da470012b6\",\"key\":2,\"value\":null}\r\n]}\n">>, etap:is(Body, ExpectBody, "valid view result"), % ensure old file gone. etap:is(file_exists(ViewTarget), false, "ensure old file is gone"), % ensure new header NewViewFile = ViewDir ++ "/.test_design/mrview/" ++ new_view_name(), % add doc(s) test_util:request( couch_url() ++ "/test/boo", [{"Content-Type", "application/json"}], put, <<"{\"a\":3}">>), % query again {ok, Code2, _Headers2, Body2} = test_util:request(ViewUrl, [], get), % expect results etap:is(Code2, 200, "valid view result http status code"), ExpectBody2 = <<"{\"total_rows\":3,\"offset\":0,\"rows\":[\r\n{\"id\":\"193f2f9c596ddc7ad326f7da470009ec\",\"key\":1,\"value\":null},\r\n{\"id\":\"193f2f9c596ddc7ad326f7da470012b6\",\"key\":2,\"value\":null},\r\n{\"id\":\"boo\",\"key\":3,\"value\":null}\r\n]}\n">>, etap:is(Body2, ExpectBody2, "valid view result after doc add"), % ensure no rebuild % TBD no idea how to actually test this. % ensure new header. timer:sleep(2000), ensure_header(NewViewFile, fun(#mrheader{}) -> true; (_) -> false end, "new"), ok. apache-couchdb-1.6.0/test/etap/041-uuid-gen-seq.ini0000644000175000001440000000146212332105522021537 0ustar00djcusers00000000000000; Licensed to the Apache Software Foundation (ASF) under one ; or more contributor license agreements. See the NOTICE file ; distributed with this work for additional information ; regarding copyright ownership. The ASF licenses this file ; to you under the Apache License, Version 2.0 (the ; "License"); you may not use this file except in compliance ; with the License. You may obtain a copy of the License at ; ; http://www.apache.org/licenses/LICENSE-2.0 ; ; Unless required by applicable law or agreed to in writing, ; software distributed under the License is distributed on an ; "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY ; KIND, either express or implied. See the License for the ; specific language governing permissions and limitations ; under the License. [uuids] algorithm = sequential apache-couchdb-1.6.0/test/etap/075-auth-cache.t0000755000175000001440000002223312332105522020733 0ustar00djcusers00000000000000#!/usr/bin/env escript %% -*- erlang -*- % Licensed under the Apache License, Version 2.0 (the "License"); you may not % use this file except in compliance with the License. You may obtain a copy of % the License at % % http://www.apache.org/licenses/LICENSE-2.0 % % Unless required by applicable law or agreed to in writing, software % distributed under the License is distributed on an "AS IS" BASIS, WITHOUT % WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the % License for the specific language governing permissions and limitations under % the License. -record(user_ctx, { name = null, roles = [], handler }). -record(db, { main_pid = nil, update_pid = nil, compactor_pid = nil, instance_start_time, % number of microsecs since jan 1 1970 as a binary string fd, updater_fd, fd_ref_counter, header, committed_update_seq, fulldocinfo_by_id_btree, docinfo_by_seq_btree, local_docs_btree, update_seq, name, filepath, validate_doc_funs = [], security = [], security_ptr = nil, user_ctx = #user_ctx{}, waiting_delayed_commit = nil, revs_limit = 1000, fsync_options = [], options = [], compression, before_doc_update = nil, % nil | fun(Doc, Db) -> NewDoc after_doc_read = nil % nil | fun(Doc, Db) -> NewDoc }). auth_db_name() -> <<"couch_test_auth_db">>. auth_db_2_name() -> <<"couch_test_auth_db_2">>. salt() -> <<"SALT">>. main(_) -> test_util:init_code_path(), etap:plan(19), case (catch test()) of ok -> etap:end_tests(); Other -> etap:diag(io_lib:format("Test died abnormally: ~p", [Other])), etap:bail(Other) end, ok. test() -> couch_server_sup:start_link(test_util:config_files()), OrigName = couch_config:get("couch_httpd_auth", "authentication_db"), couch_config:set( "couch_httpd_auth", "authentication_db", binary_to_list(auth_db_name()), false), delete_db(auth_db_name()), delete_db(auth_db_2_name()), test_auth_db_crash(), couch_config:set("couch_httpd_auth", "authentication_db", OrigName, false), delete_db(auth_db_name()), delete_db(auth_db_2_name()), couch_server_sup:stop(), ok. test_auth_db_crash() -> Creds0 = couch_auth_cache:get_user_creds("joe"), etap:is(Creds0, nil, "Got nil when getting joe's credentials"), etap:diag("Adding first version of Joe's user doc"), PasswordHash1 = hash_password("pass1"), {ok, Rev1} = update_user_doc(auth_db_name(), "joe", "pass1"), Creds1 = couch_auth_cache:get_user_creds("joe"), etap:is(is_list(Creds1), true, "Got joe's credentials from cache"), etap:is(couch_util:get_value(<<"password_sha">>, Creds1), PasswordHash1, "Cached credentials have the right password"), etap:diag("Updating Joe's user doc password"), PasswordHash2 = hash_password("pass2"), {ok, _Rev2} = update_user_doc(auth_db_name(), "joe", "pass2", Rev1), Creds2 = couch_auth_cache:get_user_creds("joe"), etap:is(is_list(Creds2), true, "Got joe's credentials from cache"), etap:is(couch_util:get_value(<<"password_sha">>, Creds2), PasswordHash2, "Cached credentials have the new password"), etap:diag("Shutting down the auth database process"), shutdown_db(auth_db_name()), {ok, UpdateRev} = get_doc_rev(auth_db_name(), "joe"), PasswordHash3 = hash_password("pass3"), {ok, _Rev3} = update_user_doc(auth_db_name(), "joe", "pass3", UpdateRev), etap:is(get_user_doc_password_sha(auth_db_name(), "joe"), PasswordHash3, "Latest Joe's doc revision has the new password hash"), Creds3 = couch_auth_cache:get_user_creds("joe"), etap:is(is_list(Creds3), true, "Got joe's credentials from cache"), etap:is(couch_util:get_value(<<"password_sha">>, Creds3), PasswordHash3, "Cached credentials have the new password"), etap:diag("Deleting Joe's user doc"), delete_user_doc(auth_db_name(), "joe"), Creds4 = couch_auth_cache:get_user_creds("joe"), etap:is(nil, Creds4, "Joe's credentials not found in cache after user doc was deleted"), etap:diag("Adding new user doc for Joe"), PasswordHash5 = hash_password("pass5"), {ok, _NewRev1} = update_user_doc(auth_db_name(), "joe", "pass5"), Creds5 = couch_auth_cache:get_user_creds("joe"), etap:is(is_list(Creds5), true, "Got joe's credentials from cache"), etap:is(couch_util:get_value(<<"password_sha">>, Creds5), PasswordHash5, "Cached credentials have the right password"), full_commit(auth_db_name()), etap:diag("Changing the auth database"), couch_config:set( "couch_httpd_auth", "authentication_db", binary_to_list(auth_db_2_name()), false), ok = timer:sleep(500), Creds6 = couch_auth_cache:get_user_creds("joe"), etap:is(nil, Creds6, "Joe's credentials not found in cache after auth database changed"), etap:diag("Adding first version of Joe's user doc to new auth database"), PasswordHash7 = hash_password("pass7"), {ok, _} = update_user_doc(auth_db_2_name(), "joe", "pass7"), Creds7 = couch_auth_cache:get_user_creds("joe"), etap:is(is_list(Creds7), true, "Got joe's credentials from cache"), etap:is(couch_util:get_value(<<"password_sha">>, Creds7), PasswordHash7, "Cached credentials have the right password"), etap:diag("Shutting down the auth database process"), shutdown_db(auth_db_2_name()), {ok, UpdateRev2} = get_doc_rev(auth_db_2_name(), "joe"), PasswordHash8 = hash_password("pass8"), {ok, _Rev8} = update_user_doc(auth_db_2_name(), "joe", "pass8", UpdateRev2), etap:is(get_user_doc_password_sha(auth_db_2_name(), "joe"), PasswordHash8, "Latest Joe's doc revision has the new password hash"), Creds8 = couch_auth_cache:get_user_creds("joe"), etap:is(is_list(Creds8), true, "Got joe's credentials from cache"), etap:is(couch_util:get_value(<<"password_sha">>, Creds8), PasswordHash8, "Cached credentials have the new password"), etap:diag("Changing the auth database again"), couch_config:set( "couch_httpd_auth", "authentication_db", binary_to_list(auth_db_name()), false), ok = timer:sleep(500), Creds9 = couch_auth_cache:get_user_creds("joe"), etap:is(Creds9, Creds5, "Got same credentials as before the firt auth database change"), etap:is(couch_util:get_value(<<"password_sha">>, Creds9), PasswordHash5, "Cached credentials have the right password"), ok. update_user_doc(DbName, UserName, Password) -> update_user_doc(DbName, UserName, Password, nil). update_user_doc(DbName, UserName, Password, Rev) -> User = iolist_to_binary(UserName), Doc = couch_doc:from_json_obj({[ {<<"_id">>, <<"org.couchdb.user:", User/binary>>}, {<<"name">>, User}, {<<"type">>, <<"user">>}, {<<"salt">>, salt()}, {<<"password_sha">>, hash_password(Password)}, {<<"roles">>, []} ] ++ case Rev of nil -> []; _ -> [{<<"_rev">>, Rev}] end}), {ok, AuthDb} = open_auth_db(DbName), {ok, NewRev} = couch_db:update_doc(AuthDb, Doc, []), ok = couch_db:close(AuthDb), {ok, couch_doc:rev_to_str(NewRev)}. hash_password(Password) -> list_to_binary( couch_util:to_hex(crypto:sha(iolist_to_binary([Password, salt()])))). shutdown_db(DbName) -> {ok, AuthDb} = open_auth_db(DbName), ok = couch_db:close(AuthDb), couch_util:shutdown_sync(AuthDb#db.main_pid), ok = timer:sleep(1000). get_doc_rev(DbName, UserName) -> DocId = iolist_to_binary([<<"org.couchdb.user:">>, UserName]), {ok, AuthDb} = open_auth_db(DbName), UpdateRev = case couch_db:open_doc(AuthDb, DocId, []) of {ok, Doc} -> {Props} = couch_doc:to_json_obj(Doc, []), couch_util:get_value(<<"_rev">>, Props); {not_found, missing} -> nil end, ok = couch_db:close(AuthDb), {ok, UpdateRev}. get_user_doc_password_sha(DbName, UserName) -> DocId = iolist_to_binary([<<"org.couchdb.user:">>, UserName]), {ok, AuthDb} = open_auth_db(DbName), {ok, Doc} = couch_db:open_doc(AuthDb, DocId, []), ok = couch_db:close(AuthDb), {Props} = couch_doc:to_json_obj(Doc, []), couch_util:get_value(<<"password_sha">>, Props). delete_user_doc(DbName, UserName) -> DocId = iolist_to_binary([<<"org.couchdb.user:">>, UserName]), {ok, AuthDb} = open_auth_db(DbName), {ok, Doc} = couch_db:open_doc(AuthDb, DocId, []), {Props} = couch_doc:to_json_obj(Doc, []), DeletedDoc = couch_doc:from_json_obj({[ {<<"_id">>, DocId}, {<<"_rev">>, couch_util:get_value(<<"_rev">>, Props)}, {<<"_deleted">>, true} ]}), {ok, _} = couch_db:update_doc(AuthDb, DeletedDoc, []), ok = couch_db:close(AuthDb). full_commit(DbName) -> {ok, AuthDb} = open_auth_db(DbName), {ok, _} = couch_db:ensure_full_commit(AuthDb), ok = couch_db:close(AuthDb). open_auth_db(DbName) -> couch_db:open_int( DbName, [{user_ctx, #user_ctx{roles = [<<"_admin">>]}}]). delete_db(Name) -> couch_server:delete( Name, [{user_ctx, #user_ctx{roles = [<<"_admin">>]}}]). apache-couchdb-1.6.0/test/etap/072-cleanup.t0000755000175000001440000000750112332105522020356 0ustar00djcusers00000000000000#!/usr/bin/env escript %% -*- erlang -*- % Licensed under the Apache License, Version 2.0 (the "License"); you may not % use this file except in compliance with the License. You may obtain a copy of % the License at % % http://www.apache.org/licenses/LICENSE-2.0 % % Unless required by applicable law or agreed to in writing, software % distributed under the License is distributed on an "AS IS" BASIS, WITHOUT % WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the % License for the specific language governing permissions and limitations under % the License. -define(TEST_DB, <<"etap-test-db">>). -record(user_ctx, { name = null, roles = [], handler }). -define(ADMIN_USER, #user_ctx{roles=[<<"_admin">>]}). main(_) -> test_util:init_code_path(), etap:plan(7), try test() of ok -> etap:end_tests() catch Other -> etap:diag(io_lib:format("Test died abnormally: ~p", [Other])), timer:sleep(1000), etap:bail(Other) end, ok. test() -> {ok, _} = couch_server_sup:start_link(test_util:config_files()), couch_server:delete(?TEST_DB, []), timer:sleep(1000), couch_db:create(?TEST_DB, []), {ok, AllDbs} = couch_server:all_databases(), etap:ok(lists:member(?TEST_DB, AllDbs), "Database was created."), FooRev = create_design_doc(<<"_design/foo">>, <<"bar">>), query_view("foo", "bar"), BoozRev = create_design_doc(<<"_design/booz">>, <<"baz">>), query_view("booz", "baz"), {ok, _Db} = couch_db:open(?TEST_DB, [{user_ctx, ?ADMIN_USER}]), view_cleanup(), etap:is(count_index_files(), 2, "Two index files before any deletions."), delete_design_doc(<<"_design/foo">>, FooRev), view_cleanup(), etap:is(count_index_files(), 1, "One index file after first deletion and cleanup."), delete_design_doc(<<"_design/booz">>, BoozRev), view_cleanup(), etap:is(count_index_files(), 0, "No index files after second deletion and cleanup."), couch_server:delete(?TEST_DB, []), {ok, AllDbs2} = couch_server:all_databases(), etap:ok(not lists:member(?TEST_DB, AllDbs2), "Database was deleted."), ok. create_design_doc(DDName, ViewName) -> {ok, Db} = couch_db:open(?TEST_DB, [{user_ctx, ?ADMIN_USER}]), DDoc = couch_doc:from_json_obj({[ {<<"_id">>, DDName}, {<<"language">>, <<"javascript">>}, {<<"views">>, {[ {ViewName, {[ {<<"map">>, <<"function(doc) { emit(doc.value, 1); }">>} ]}} ]}} ]}), {ok, Rev} = couch_db:update_doc(Db, DDoc, []), couch_db:ensure_full_commit(Db), couch_db:close(Db), Rev. delete_design_doc(DDName, Rev) -> {ok, Db} = couch_db:open(?TEST_DB, [{user_ctx, ?ADMIN_USER}]), DDoc = couch_doc:from_json_obj({[ {<<"_id">>, DDName}, {<<"_rev">>, couch_doc:rev_to_str(Rev)}, {<<"_deleted">>, true} ]}), {ok, _} = couch_db:update_doc(Db, DDoc, [Rev]), couch_db:close(Db). db_url() -> Addr = couch_config:get("httpd", "bind_address", "127.0.0.1"), Port = integer_to_list(mochiweb_socket_server:get(couch_httpd, port)), "http://" ++ Addr ++ ":" ++ Port ++ "/" ++ binary_to_list(?TEST_DB). query_view(DDoc, View) -> {ok, Code, _Headers, _Body} = test_util:request( db_url() ++ "/_design/" ++ DDoc ++ "/_view/" ++ View, [], get), etap:is(Code, 200, "Built view index for " ++ DDoc ++ "."), ok. view_cleanup() -> {ok, Db} = couch_db:open(?TEST_DB, [{user_ctx, ?ADMIN_USER}]), couch_mrview:cleanup(Db), couch_db:close(Db). count_index_files() -> % call server to fetch the index files RootDir = couch_config:get("couchdb", "view_index_dir"), length(filelib:wildcard(RootDir ++ "/." ++ binary_to_list(?TEST_DB) ++ "_design"++"/mrview/*")). apache-couchdb-1.6.0/test/etap/test_util.erl.in0000644000175000001440000000472712332105522021365 0ustar00djcusers00000000000000% Licensed under the Apache License, Version 2.0 (the "License"); you may not % use this file except in compliance with the License. You may obtain a copy of % the License at % % http://www.apache.org/licenses/LICENSE-2.0 % % Unless required by applicable law or agreed to in writing, software % distributed under the License is distributed on an "AS IS" BASIS, WITHOUT % WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the % License for the specific language governing permissions and limitations under % the License. -module(test_util). -export([init_code_path/0]). -export([source_file/1, build_file/1, config_files/0]). -export([run/2]). -export([request/3, request/4]). srcdir() -> "@abs_top_srcdir@". builddir() -> "@abs_top_builddir@". init_code_path() -> Paths = [ "etap", "couchdb", "ejson", "erlang-oauth", "ibrowse", "mochiweb", "snappy" ], lists:foreach(fun(Name) -> code:add_patha(filename:join([builddir(), "src", Name])) end, Paths). source_file(Name) -> filename:join([srcdir(), Name]). build_file(Name) -> filename:join([builddir(), Name]). config_files() -> [ build_file("etc/couchdb/default_dev.ini"), source_file("test/random_port.ini"), build_file("etc/couchdb/local_dev.ini") ]. run(Plan, Fun) -> test_util:init_code_path(), etap:plan(Plan), case (catch Fun()) of ok -> etap:end_tests(); Other -> etap:diag(io_lib:format("Test died abnormally:~n~p", [Other])), timer:sleep(500), etap:bail(Other) end, ok. request(Url, Headers, Method) -> request(Url, Headers, Method, []). request(Url, Headers, Method, Body) -> request(Url, Headers, Method, Body, 3). request(_Url, _Headers, _Method, _Body, 0) -> {error, request_failed}; request(Url, Headers, Method, Body, N) -> case code:is_loaded(ibrowse) of false -> {ok, _} = ibrowse:start(); _ -> ok end, case ibrowse:send_req(Url, Headers, Method, Body) of {ok, Code0, RespHeaders, RespBody0} -> Code = list_to_integer(Code0), RespBody = iolist_to_binary(RespBody0), {ok, Code, RespHeaders, RespBody}; {error, {'EXIT', {normal, _}}} -> % Connection closed right after a successful request that % used the same connection. request(Url, Headers, Method, Body, N - 1); Error -> Error end. apache-couchdb-1.6.0/test/etap/170-os-daemons.es0000755000175000001440000000134712332105522021141 0ustar00djcusers00000000000000#! /usr/bin/env escript % Licensed under the Apache License, Version 2.0 (the "License"); you may not % use this file except in compliance with the License. You may obtain a copy of % the License at % % http://www.apache.org/licenses/LICENSE-2.0 % % Unless required by applicable law or agreed to in writing, software % distributed under the License is distributed on an "AS IS" BASIS, WITHOUT % WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the % License for the specific language governing permissions and limitations under % the License. loop() -> loop(io:read("")). loop({ok, _}) -> loop(io:read("")); loop(eof) -> stop; loop({error, Reason}) -> throw({error, Reason}). main([]) -> loop(). apache-couchdb-1.6.0/test/etap/130-attachments-md5.t0000755000175000001440000001754012332105522021724 0ustar00djcusers00000000000000#!/usr/bin/env escript % Licensed under the Apache License, Version 2.0 (the "License"); you may not % use this file except in compliance with the License. You may obtain a copy of % the License at % % http://www.apache.org/licenses/LICENSE-2.0 % % Unless required by applicable law or agreed to in writing, software % distributed under the License is distributed on an "AS IS" BASIS, WITHOUT % WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the % License for the specific language governing permissions and limitations under % the License. test_db_name() -> <<"etap-test-db">>. docid() -> case get(docid) of undefined -> put(docid, 1), "1"; Count -> put(docid, Count+1), integer_to_list(Count+1) end. main(_) -> test_util:init_code_path(), etap:plan(16), case (catch test()) of ok -> etap:end_tests(); Other -> etap:diag(io_lib:format("Test died abnormally: ~p", [Other])), etap:bail(Other) end, ok. test() -> couch_server_sup:start_link(test_util:config_files()), Addr = couch_config:get("httpd", "bind_address", any), put(addr, Addr), put(port, mochiweb_socket_server:get(couch_httpd, port)), timer:sleep(1000), couch_server:delete(test_db_name(), []), couch_db:create(test_db_name(), []), test_identity_without_md5(), test_chunked_without_md5(), test_identity_with_valid_md5(), test_chunked_with_valid_md5_header(), test_chunked_with_valid_md5_trailer(), test_identity_with_invalid_md5(), test_chunked_with_invalid_md5_header(), test_chunked_with_invalid_md5_trailer(), couch_server:delete(test_db_name(), []), couch_server_sup:stop(), ok. test_identity_without_md5() -> Data = [ "PUT /", test_db_name(), "/", docid(), "/readme.txt HTTP/1.1\r\n", "Content-Type: text/plain\r\n", "Content-Length: 34\r\n", "\r\n", "We all live in a yellow submarine!"], {Code, Json} = do_request(Data), etap:is(Code, 201, "Stored with identity encoding and no MD5"), etap:is(get_json(Json, [<<"ok">>]), true, "Body indicates success."). test_chunked_without_md5() -> AttData = <<"We all live in a yellow submarine!">>, <> = AttData, Data = [ "PUT /", test_db_name(), "/", docid(), "/readme.txt HTTP/1.1\r\n", "Content-Type: text/plain\r\n", "Transfer-Encoding: chunked\r\n", "\r\n", to_hex(size(Part1)), "\r\n", Part1, "\r\n", to_hex(size(Part2)), "\r\n", Part2, "\r\n" "0\r\n" "\r\n"], {Code, Json} = do_request(Data), etap:is(Code, 201, "Stored with chunked encoding and no MD5"), etap:is(get_json(Json, [<<"ok">>]), true, "Body indicates success."). test_identity_with_valid_md5() -> AttData = "We all live in a yellow submarine!", Data = [ "PUT /", test_db_name(), "/", docid(), "/readme.txt HTTP/1.1\r\n", "Content-Type: text/plain\r\n", "Content-Length: 34\r\n", "Content-MD5: ", base64:encode(couch_util:md5(AttData)), "\r\n", "\r\n", AttData], {Code, Json} = do_request(Data), etap:is(Code, 201, "Stored with identity encoding and valid MD5"), etap:is(get_json(Json, [<<"ok">>]), true, "Body indicates success."). test_chunked_with_valid_md5_header() -> AttData = <<"We all live in a yellow submarine!">>, <> = AttData, Data = [ "PUT /", test_db_name(), "/", docid(), "/readme.txt HTTP/1.1\r\n", "Content-Type: text/plain\r\n", "Transfer-Encoding: chunked\r\n", "Content-MD5: ", base64:encode(couch_util:md5(AttData)), "\r\n", "\r\n", to_hex(size(Part1)), "\r\n", Part1, "\r\n", to_hex(size(Part2)), "\r\n", Part2, "\r\n", "0\r\n", "\r\n"], {Code, Json} = do_request(Data), etap:is(Code, 201, "Stored with chunked encoding and valid MD5 header."), etap:is(get_json(Json, [<<"ok">>]), true, "Body indicates success."). test_chunked_with_valid_md5_trailer() -> AttData = <<"We all live in a yellow submarine!">>, <> = AttData, Data = [ "PUT /", test_db_name(), "/", docid(), "/readme.txt HTTP/1.1\r\n", "Content-Type: text/plain\r\n", "Transfer-Encoding: chunked\r\n", "Trailer: Content-MD5\r\n", "\r\n", to_hex(size(Part1)), "\r\n", Part1, "\r\n", to_hex(size(Part2)), "\r\n", Part2, "\r\n", "0\r\n", "Content-MD5: ", base64:encode(couch_util:md5(AttData)), "\r\n", "\r\n"], {Code, Json} = do_request(Data), etap:is(Code, 201, "Stored with chunked encoding and valid MD5 trailer."), etap:is(get_json(Json, [<<"ok">>]), true, "Body indicates success."). test_identity_with_invalid_md5() -> Data = [ "PUT /", test_db_name(), "/", docid(), "/readme.txt HTTP/1.1\r\n", "Content-Type: text/plain\r\n", "Content-Length: 34\r\n", "Content-MD5: ", base64:encode(<<"foobar!">>), "\r\n", "\r\n", "We all live in a yellow submarine!"], {Code, Json} = do_request(Data), etap:is(Code, 400, "Invalid MD5 header causes an error: identity"), etap:is( get_json(Json, [<<"error">>]), <<"content_md5_mismatch">>, "Body indicates reason for failure." ). test_chunked_with_invalid_md5_header() -> AttData = <<"We all live in a yellow submarine!">>, <> = AttData, Data = [ "PUT /", test_db_name(), "/", docid(), "/readme.txt HTTP/1.1\r\n", "Content-Type: text/plain\r\n", "Transfer-Encoding: chunked\r\n", "Content-MD5: ", base64:encode(<<"so sneaky...">>), "\r\n", "\r\n", to_hex(size(Part1)), "\r\n", Part1, "\r\n", to_hex(size(Part2)), "\r\n", Part2, "\r\n", "0\r\n", "\r\n"], {Code, Json} = do_request(Data), etap:is(Code, 400, "Invalid MD5 header causes an error: chunked"), etap:is( get_json(Json, [<<"error">>]), <<"content_md5_mismatch">>, "Body indicates reason for failure." ). test_chunked_with_invalid_md5_trailer() -> AttData = <<"We all live in a yellow submarine!">>, <> = AttData, Data = [ "PUT /", test_db_name(), "/", docid(), "/readme.txt HTTP/1.1\r\n", "Content-Type: text/plain\r\n", "Transfer-Encoding: chunked\r\n", "Trailer: Content-MD5\r\n", "\r\n", to_hex(size(Part1)), "\r\n", Part1, "\r\n", to_hex(size(Part2)), "\r\n", Part2, "\r\n", "0\r\n", "Content-MD5: ", base64:encode(<<"Kool-Aid Fountain!">>), "\r\n", "\r\n"], {Code, Json} = do_request(Data), etap:is(Code, 400, "Invalid MD5 Trailer causes an error"), etap:is( get_json(Json, [<<"error">>]), <<"content_md5_mismatch">>, "Body indicates reason for failure." ). get_socket() -> Options = [binary, {packet, 0}, {active, false}], {ok, Sock} = gen_tcp:connect(get(addr), get(port), Options), Sock. do_request(Request) -> Sock = get_socket(), gen_tcp:send(Sock, list_to_binary(lists:flatten(Request))), timer:sleep(1000), {ok, R} = gen_tcp:recv(Sock, 0), gen_tcp:close(Sock), [Header, Body] = re:split(R, "\r\n\r\n", [{return, binary}]), {ok, {http_response, _, Code, _}, _} = erlang:decode_packet(http, Header, []), Json = ejson:decode(Body), {Code, Json}. get_json(Json, Path) -> couch_util:get_nested_json_value(Json, Path). to_hex(Val) -> to_hex(Val, []). to_hex(0, Acc) -> Acc; to_hex(Val, Acc) -> to_hex(Val div 16, [hex_char(Val rem 16) | Acc]). hex_char(V) when V < 10 -> $0 + V; hex_char(V) -> $A + V - 10. apache-couchdb-1.6.0/test/etap/180-http-proxy.t0000755000175000001440000002675612332105522021102 0ustar00djcusers00000000000000#!/usr/bin/env escript % Licensed under the Apache License, Version 2.0 (the "License"); you may not % use this file except in compliance with the License. You may obtain a copy of % the License at % % http://www.apache.org/licenses/LICENSE-2.0 % % Unless required by applicable law or agreed to in writing, software % distributed under the License is distributed on an "AS IS" BASIS, WITHOUT % WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the % License for the specific language governing permissions and limitations under % the License. -record(req, {method=get, path="", headers=[], body="", opts=[]}). server() -> lists:concat([ "http://127.0.0.1:", mochiweb_socket_server:get(couch_httpd, port), "/_test/" ]). proxy() -> "http://127.0.0.1:" ++ integer_to_list(test_web:get_port()) ++ "/". external() -> "https://www.google.com/". main(_) -> test_util:init_code_path(), etap:plan(61), case (catch test()) of ok -> etap:end_tests(); Other -> etap:diag("Test died abnormally: ~p", [Other]), etap:bail("Bad return value.") end, ok. check_request(Name, Req, Remote, Local) -> case Remote of no_remote -> ok; _ -> test_web:set_assert(Remote) end, Url = case proplists:lookup(url, Req#req.opts) of none -> server() ++ Req#req.path; {url, DestUrl} -> DestUrl end, Opts = [{headers_as_is, true} | Req#req.opts], Resp =ibrowse:send_req( Url, Req#req.headers, Req#req.method, Req#req.body, Opts ), %etap:diag("ibrowse response: ~p", [Resp]), case Local of no_local -> ok; _ -> etap:fun_is(Local, Resp, Name) end, case {Remote, Local} of {no_remote, _} -> ok; {_, no_local} -> ok; _ -> etap:is(test_web:check_last(), was_ok, Name ++ " - request handled") end, Resp. test() -> ExtraConfig = [test_util:source_file("test/etap/180-http-proxy.ini")], couch_server_sup:start_link(test_util:config_files() ++ ExtraConfig), ibrowse:start(), crypto:start(), % start the test_web server on a random port test_web:start_link(), Url = lists:concat([ "{couch_httpd_proxy, handle_proxy_req, <<\"http://127.0.0.1:", test_web:get_port(), "/\">>}" ]), couch_config:set("httpd_global_handlers", "_test", Url, false), % let couch_httpd restart timer:sleep(100), test_basic(), test_alternate_status(), test_trailing_slash(), test_passes_header(), test_passes_host_header(), test_passes_header_back(), test_rewrites_location_headers(), test_doesnt_rewrite_external_locations(), test_rewrites_relative_location(), test_uses_same_version(), test_passes_body(), test_passes_eof_body_back(), test_passes_chunked_body(), test_passes_chunked_body_back(), test_connect_error(), ok. test_basic() -> Remote = fun(Req) -> 'GET' = Req:get(method), "/" = Req:get(path), 0 = Req:get(body_length), <<>> = Req:recv_body(), {ok, {200, [{"Content-Type", "text/plain"}], "ok"}} end, Local = fun({ok, "200", _, "ok"}) -> true; (_) -> false end, check_request("Basic proxy test", #req{}, Remote, Local). test_alternate_status() -> Remote = fun(Req) -> "/alternate_status" = Req:get(path), {ok, {201, [], "ok"}} end, Local = fun({ok, "201", _, "ok"}) -> true; (_) -> false end, Req = #req{path="alternate_status"}, check_request("Alternate status", Req, Remote, Local). test_trailing_slash() -> Remote = fun(Req) -> "/trailing_slash/" = Req:get(path), {ok, {200, [], "ok"}} end, Local = fun({ok, "200", _, "ok"}) -> true; (_) -> false end, Req = #req{path="trailing_slash/"}, check_request("Trailing slash", Req, Remote, Local). test_passes_header() -> Remote = fun(Req) -> "/passes_header" = Req:get(path), "plankton" = Req:get_header_value("X-CouchDB-Ralph"), {ok, {200, [], "ok"}} end, Local = fun({ok, "200", _, "ok"}) -> true; (_) -> false end, Req = #req{ path="passes_header", headers=[{"X-CouchDB-Ralph", "plankton"}] }, check_request("Passes header", Req, Remote, Local). test_passes_host_header() -> Remote = fun(Req) -> "/passes_host_header" = Req:get(path), "www.google.com" = Req:get_header_value("Host"), {ok, {200, [], "ok"}} end, Local = fun({ok, "200", _, "ok"}) -> true; (_) -> false end, Req = #req{ path="passes_host_header", headers=[{"Host", "www.google.com"}] }, check_request("Passes host header", Req, Remote, Local). test_passes_header_back() -> Remote = fun(Req) -> "/passes_header_back" = Req:get(path), {ok, {200, [{"X-CouchDB-Plankton", "ralph"}], "ok"}} end, Local = fun ({ok, "200", Headers, "ok"}) -> lists:member({"X-CouchDB-Plankton", "ralph"}, Headers); (_) -> false end, Req = #req{path="passes_header_back"}, check_request("Passes header back", Req, Remote, Local). test_rewrites_location_headers() -> etap:diag("Testing location header rewrites."), do_rewrite_tests([ {"Location", proxy() ++ "foo/bar", server() ++ "foo/bar"}, {"Content-Location", proxy() ++ "bing?q=2", server() ++ "bing?q=2"}, {"Uri", proxy() ++ "zip#frag", server() ++ "zip#frag"}, {"Destination", proxy(), server()} ]). test_doesnt_rewrite_external_locations() -> etap:diag("Testing no rewrite of external locations."), do_rewrite_tests([ {"Location", external() ++ "search", external() ++ "search"}, {"Content-Location", external() ++ "s?q=2", external() ++ "s?q=2"}, {"Uri", external() ++ "f#f", external() ++ "f#f"}, {"Destination", external() ++ "f?q=2#f", external() ++ "f?q=2#f"} ]). test_rewrites_relative_location() -> etap:diag("Testing relative rewrites."), do_rewrite_tests([ {"Location", "/foo", server() ++ "foo"}, {"Content-Location", "bar", server() ++ "bar"}, {"Uri", "/zing?q=3", server() ++ "zing?q=3"}, {"Destination", "bing?q=stuff#yay", server() ++ "bing?q=stuff#yay"} ]). do_rewrite_tests(Tests) -> lists:foreach(fun({Header, Location, Url}) -> do_rewrite_test(Header, Location, Url) end, Tests). do_rewrite_test(Header, Location, Url) -> Remote = fun(Req) -> "/rewrite_test" = Req:get(path), {ok, {302, [{Header, Location}], "ok"}} end, Local = fun ({ok, "302", Headers, "ok"}) -> etap:is( couch_util:get_value(Header, Headers), Url, "Header rewritten correctly." ), true; (_) -> false end, Req = #req{path="rewrite_test"}, Label = "Rewrite test for ", check_request(Label ++ Header, Req, Remote, Local). test_uses_same_version() -> Remote = fun(Req) -> "/uses_same_version" = Req:get(path), {1, 0} = Req:get(version), {ok, {200, [], "ok"}} end, Local = fun({ok, "200", _, "ok"}) -> true; (_) -> false end, Req = #req{ path="uses_same_version", opts=[{http_vsn, {1, 0}}] }, check_request("Uses same version", Req, Remote, Local). test_passes_body() -> Remote = fun(Req) -> 'PUT' = Req:get(method), "/passes_body" = Req:get(path), <<"Hooray!">> = Req:recv_body(), {ok, {201, [], "ok"}} end, Local = fun({ok, "201", _, "ok"}) -> true; (_) -> false end, Req = #req{ method=put, path="passes_body", body="Hooray!" }, check_request("Passes body", Req, Remote, Local). test_passes_eof_body_back() -> BodyChunks = [<<"foo">>, <<"bar">>, <<"bazinga">>], Remote = fun(Req) -> 'GET' = Req:get(method), "/passes_eof_body" = Req:get(path), {raw, {200, [{"Connection", "close"}], BodyChunks}} end, Local = fun({ok, "200", _, "foobarbazinga"}) -> true; (_) -> false end, Req = #req{path="passes_eof_body"}, check_request("Passes eof body", Req, Remote, Local). test_passes_chunked_body() -> BodyChunks = [<<"foo">>, <<"bar">>, <<"bazinga">>], Remote = fun(Req) -> 'POST' = Req:get(method), "/passes_chunked_body" = Req:get(path), RecvBody = fun ({Length, Chunk}, [Chunk | Rest]) -> Length = size(Chunk), Rest; ({0, []}, []) -> ok end, ok = Req:stream_body(1024*1024, RecvBody, BodyChunks), {ok, {201, [], "ok"}} end, Local = fun({ok, "201", _, "ok"}) -> true; (_) -> false end, Req = #req{ method=post, path="passes_chunked_body", headers=[{"Transfer-Encoding", "chunked"}], body=mk_chunked_body(BodyChunks) }, check_request("Passes chunked body", Req, Remote, Local). test_passes_chunked_body_back() -> Name = "Passes chunked body back", Remote = fun(Req) -> 'GET' = Req:get(method), "/passes_chunked_body_back" = Req:get(path), BodyChunks = [<<"foo">>, <<"bar">>, <<"bazinga">>], {chunked, {200, [{"Transfer-Encoding", "chunked"}], BodyChunks}} end, Req = #req{ path="passes_chunked_body_back", opts=[{stream_to, self()}] }, Resp = check_request(Name, Req, Remote, no_local), etap:fun_is( fun({ibrowse_req_id, _}) -> true; (_) -> false end, Resp, "Received an ibrowse request id." ), {_, ReqId} = Resp, % Grab headers from response receive {ibrowse_async_headers, ReqId, "200", Headers} -> etap:is( proplists:get_value("Transfer-Encoding", Headers), "chunked", "Response included the Transfer-Encoding: chunked header" ), ibrowse:stream_next(ReqId) after 1000 -> throw({error, timeout}) end, % Check body received % TODO: When we upgrade to ibrowse >= 2.0.0 this check needs to % check that the chunks returned are what we sent from the % Remote test. etap:diag("TODO: UPGRADE IBROWSE"), etap:is(recv_body(ReqId, []), <<"foobarbazinga">>, "Decoded chunked body."), % Check test_web server. etap:is(test_web:check_last(), was_ok, Name ++ " - request handled"). test_connect_error() -> Local = fun({ok, "500", _Headers, _Body}) -> true; (_) -> false end, Url = lists:concat([ "http://127.0.0.1:", mochiweb_socket_server:get(couch_httpd, port), "/_error" ]), Req = #req{opts=[{url, Url}]}, check_request("Connect error", Req, no_remote, Local). mk_chunked_body(Chunks) -> mk_chunked_body(Chunks, []). mk_chunked_body([], Acc) -> iolist_to_binary(lists:reverse(Acc, "0\r\n\r\n")); mk_chunked_body([Chunk | Rest], Acc) -> Size = to_hex(size(Chunk)), mk_chunked_body(Rest, ["\r\n", Chunk, "\r\n", Size | Acc]). to_hex(Val) -> to_hex(Val, []). to_hex(0, Acc) -> Acc; to_hex(Val, Acc) -> to_hex(Val div 16, [hex_char(Val rem 16) | Acc]). hex_char(V) when V < 10 -> $0 + V; hex_char(V) -> $A + V - 10. recv_body(ReqId, Acc) -> receive {ibrowse_async_response, ReqId, Data} -> recv_body(ReqId, [Data | Acc]); {ibrowse_async_response_end, ReqId} -> iolist_to_binary(lists:reverse(Acc)); Else -> throw({error, unexpected_mesg, Else}) after 5000 -> throw({error, timeout}) end. apache-couchdb-1.6.0/test/etap/074-doc-update-conflicts.t0000755000175000001440000001613012332105522022736 0ustar00djcusers00000000000000#!/usr/bin/env escript %% -*- erlang -*- % Licensed under the Apache License, Version 2.0 (the "License"); you may not % use this file except in compliance with the License. You may obtain a copy of % the License at % % http://www.apache.org/licenses/LICENSE-2.0 % % Unless required by applicable law or agreed to in writing, software % distributed under the License is distributed on an "AS IS" BASIS, WITHOUT % WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the % License for the specific language governing permissions and limitations under % the License. -record(user_ctx, { name = null, roles = [], handler }). -define(i2l(I), integer_to_list(I)). test_db_name() -> <<"couch_test_update_conflicts">>. main(_) -> test_util:init_code_path(), etap:plan(35), case (catch test()) of ok -> etap:end_tests(); Other -> etap:diag(io_lib:format("Test died abnormally: ~p", [Other])), etap:bail(Other) end, ok. test() -> couch_server_sup:start_link(test_util:config_files()), couch_config:set("couchdb", "delayed_commits", "true", false), lists:foreach( fun(NumClients) -> test_concurrent_doc_update(NumClients) end, [100, 500, 1000, 2000, 5000]), test_bulk_delete_create(), couch_server_sup:stop(), ok. % Verify that if multiple clients try to update the same document % simultaneously, only one of them will get success response and all % the other ones will get a conflict error. Also validate that the % client which got the success response got its document version % persisted into the database. test_concurrent_doc_update(NumClients) -> {ok, Db} = create_db(test_db_name()), Doc = couch_doc:from_json_obj({[ {<<"_id">>, <<"foobar">>}, {<<"value">>, 0} ]}), {ok, Rev} = couch_db:update_doc(Db, Doc, []), ok = couch_db:close(Db), RevStr = couch_doc:rev_to_str(Rev), etap:diag("Created first revision of test document"), etap:diag("Spawning " ++ ?i2l(NumClients) ++ " clients to update the document"), Clients = lists:map( fun(Value) -> ClientDoc = couch_doc:from_json_obj({[ {<<"_id">>, <<"foobar">>}, {<<"_rev">>, RevStr}, {<<"value">>, Value} ]}), Pid = spawn_client(ClientDoc), {Value, Pid, erlang:monitor(process, Pid)} end, lists:seq(1, NumClients)), lists:foreach(fun({_, Pid, _}) -> Pid ! go end, Clients), etap:diag("Waiting for clients to finish"), {NumConflicts, SavedValue} = lists:foldl( fun({Value, Pid, MonRef}, {AccConflicts, AccValue}) -> receive {'DOWN', MonRef, process, Pid, {ok, _NewRev}} -> {AccConflicts, Value}; {'DOWN', MonRef, process, Pid, conflict} -> {AccConflicts + 1, AccValue}; {'DOWN', MonRef, process, Pid, Error} -> etap:bail("Client " ++ ?i2l(Value) ++ " got update error: " ++ couch_util:to_list(Error)) after 60000 -> etap:bail("Timeout waiting for client " ++ ?i2l(Value) ++ " to die") end end, {0, nil}, Clients), etap:diag("Verifying client results"), etap:is( NumConflicts, NumClients - 1, "Got " ++ ?i2l(NumClients - 1) ++ " client conflicts"), {ok, Db2} = couch_db:open_int(test_db_name(), []), {ok, Leaves} = couch_db:open_doc_revs(Db2, <<"foobar">>, all, []), ok = couch_db:close(Db2), etap:is(length(Leaves), 1, "Only one document revision was persisted"), [{ok, Doc2}] = Leaves, {JsonDoc} = couch_doc:to_json_obj(Doc2, []), etap:is( couch_util:get_value(<<"value">>, JsonDoc), SavedValue, "Persisted doc has the right value"), ok = timer:sleep(1000), etap:diag("Restarting the server"), couch_server_sup:stop(), ok = timer:sleep(1000), couch_server_sup:start_link(test_util:config_files()), {ok, Db3} = couch_db:open_int(test_db_name(), []), {ok, Leaves2} = couch_db:open_doc_revs(Db3, <<"foobar">>, all, []), ok = couch_db:close(Db3), etap:is(length(Leaves2), 1, "Only one document revision was persisted"), [{ok, Doc3}] = Leaves, etap:is(Doc3, Doc2, "Got same document after server restart"), delete_db(Db3). % COUCHDB-188 test_bulk_delete_create() -> {ok, Db} = create_db(test_db_name()), Doc = couch_doc:from_json_obj({[ {<<"_id">>, <<"foobar">>}, {<<"value">>, 0} ]}), {ok, Rev} = couch_db:update_doc(Db, Doc, []), DeletedDoc = couch_doc:from_json_obj({[ {<<"_id">>, <<"foobar">>}, {<<"_rev">>, couch_doc:rev_to_str(Rev)}, {<<"_deleted">>, true} ]}), NewDoc = couch_doc:from_json_obj({[ {<<"_id">>, <<"foobar">>}, {<<"value">>, 666} ]}), {ok, Results} = couch_db:update_docs(Db, [DeletedDoc, NewDoc], []), ok = couch_db:close(Db), etap:is(length([ok || {ok, _} <- Results]), 2, "Deleted and non-deleted versions got an ok reply"), [{ok, Rev1}, {ok, Rev2}] = Results, {ok, Db2} = couch_db:open_int(test_db_name(), []), {ok, [{ok, Doc1}]} = couch_db:open_doc_revs( Db2, <<"foobar">>, [Rev1], [conflicts, deleted_conflicts]), {ok, [{ok, Doc2}]} = couch_db:open_doc_revs( Db2, <<"foobar">>, [Rev2], [conflicts, deleted_conflicts]), ok = couch_db:close(Db2), {Doc1Props} = couch_doc:to_json_obj(Doc1, []), {Doc2Props} = couch_doc:to_json_obj(Doc2, []), etap:is(couch_util:get_value(<<"_deleted">>, Doc1Props), true, "Document was deleted"), etap:is(couch_util:get_value(<<"_deleted">>, Doc2Props), undefined, "New document not flagged as deleted"), etap:is(couch_util:get_value(<<"value">>, Doc2Props), 666, "New leaf revision has the right value"), etap:is(couch_util:get_value(<<"_conflicts">>, Doc1Props), undefined, "Deleted document has no conflicts"), etap:is(couch_util:get_value(<<"_deleted_conflicts">>, Doc1Props), undefined, "Deleted document has no deleted conflicts"), etap:is(couch_util:get_value(<<"_conflicts">>, Doc2Props), undefined, "New leaf revision doesn't have conflicts"), etap:is(couch_util:get_value(<<"_deleted_conflicts">>, Doc2Props), undefined, "New leaf revision doesn't have deleted conflicts"), etap:is(element(1, Rev1), 2, "Deleted revision has position 2"), etap:is(element(1, Rev2), 1, "New leaf revision has position 1"), delete_db(Db2). spawn_client(Doc) -> spawn(fun() -> {ok, Db} = couch_db:open_int(test_db_name(), []), receive go -> ok end, erlang:yield(), Result = try couch_db:update_doc(Db, Doc, []) catch _:Error -> Error end, ok = couch_db:close(Db), exit(Result) end). create_db(DbName) -> couch_db:create( DbName, [{user_ctx, #user_ctx{roles = [<<"_admin">>]}}, overwrite]). delete_db(Db) -> ok = couch_server:delete( couch_db:name(Db), [{user_ctx, #user_ctx{roles = [<<"_admin">>]}}]). apache-couchdb-1.6.0/test/etap/190-json-stream-parse.t0000755000175000001440000001451012332105522022300 0ustar00djcusers00000000000000#!/usr/bin/env escript % Licensed under the Apache License, Version 2.0 (the "License"); you may not % use this file except in compliance with the License. You may obtain a copy of % the License at % % http://www.apache.org/licenses/LICENSE-2.0 % % Unless required by applicable law or agreed to in writing, software % distributed under the License is distributed on an "AS IS" BASIS, WITHOUT % WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the % License for the specific language governing permissions and limitations under % the License. main(_) -> test_util:init_code_path(), etap:plan(99), case (catch test()) of ok -> etap:end_tests(); Other -> etap:diag("Test died abnormally: ~p", [Other]), etap:bail("Bad return value.") end, ok. test() -> crypto:start(), ok = test_raw_json_input(), ok = test_1_byte_data_function(), ok = test_multiple_bytes_data_function(). test_raw_json_input() -> etap:diag("Tests with raw JSON string as the input."), lists:foreach( fun({EJson, JsonString, Desc}) -> etap:is( equiv(EJson, json_stream_parse:to_ejson(JsonString)), true, Desc) end, cases()), ok. test_1_byte_data_function() -> etap:diag("Tests with a 1 byte output data function as the input."), lists:foreach( fun({EJson, JsonString, Desc}) -> DataFun = fun() -> single_byte_data_fun(JsonString) end, etap:is( equiv(EJson, json_stream_parse:to_ejson(DataFun)), true, Desc) end, cases()), ok. test_multiple_bytes_data_function() -> etap:diag("Tests with a multiple bytes output data function as the input."), lists:foreach( fun({EJson, JsonString, Desc}) -> DataFun = fun() -> multiple_bytes_data_fun(JsonString) end, etap:is( equiv(EJson, json_stream_parse:to_ejson(DataFun)), true, Desc) end, cases()), ok. cases() -> [ {1, "1", "integer numeric literial"}, {3.1416, "3.14160", "float numeric literal"}, % text representation may truncate, trail zeroes {-1, "-1", "negative integer numeric literal"}, {-3.1416, "-3.14160", "negative float numeric literal"}, {12.0e10, "1.20000e+11", "float literal in scientific notation"}, {1.234E+10, "1.23400e+10", "another float literal in scientific notation"}, {-1.234E-10, "-1.23400e-10", "negative float literal in scientific notation"}, {10.0, "1.0e+01", "yet another float literal in scientific notation"}, {123.456, "1.23456E+2", "yet another float literal in scientific notation"}, {10.0, "1e1", "yet another float literal in scientific notation"}, {<<"foo">>, "\"foo\"", "string literal"}, {<<"foo", 5, "bar">>, "\"foo\\u0005bar\"", "string literal with \\u0005"}, {<<"">>, "\"\"", "empty string literal"}, {<<"\n\n\n">>, "\"\\n\\n\\n\"", "only new lines literal"}, {<<"\" \b\f\r\n\t\"">>, "\"\\\" \\b\\f\\r\\n\\t\\\"\"", "only white spaces string literal"}, {null, "null", "null literal"}, {true, "true", "true literal"}, {false, "false", "false literal"}, {<<"null">>, "\"null\"", "null string literal"}, {<<"true">>, "\"true\"", "true string literal"}, {<<"false">>, "\"false\"", "false string literal"}, {{[]}, "{}", "empty object literal"}, {{[{<<"foo">>, <<"bar">>}]}, "{\"foo\":\"bar\"}", "simple object literal"}, {{[{<<"foo">>, <<"bar">>}, {<<"baz">>, 123}]}, "{\"foo\":\"bar\",\"baz\":123}", "another simple object literal"}, {[], "[]", "empty array literal"}, {[[]], "[[]]", "empty array literal inside a single element array literal"}, {[1, <<"foo">>], "[1,\"foo\"]", "simple non-empty array literal"}, {[1199344435545.0, 1], "[1199344435545.0,1]", "another simple non-empty array literal"}, {[false, true, 321, null], "[false, true, 321, null]", "array of literals"}, {{[{<<"foo">>, [123]}]}, "{\"foo\":[123]}", "object literal with an array valued property"}, {{[{<<"foo">>, {[{<<"bar">>, true}]}}]}, "{\"foo\":{\"bar\":true}}", "nested object literal"}, {{[{<<"foo">>, []}, {<<"bar">>, {[{<<"baz">>, true}]}}, {<<"alice">>, <<"bob">>}]}, "{\"foo\":[],\"bar\":{\"baz\":true},\"alice\":\"bob\"}", "complex object literal"}, {[-123, <<"foo">>, {[{<<"bar">>, []}]}, null], "[-123,\"foo\",{\"bar\":[]},null]", "complex array literal"} ]. %% Test for equivalence of Erlang terms. %% Due to arbitrary order of construction, equivalent objects might %% compare unequal as erlang terms, so we need to carefully recurse %% through aggregates (tuples and objects). equiv({Props1}, {Props2}) -> equiv_object(Props1, Props2); equiv(L1, L2) when is_list(L1), is_list(L2) -> equiv_list(L1, L2); equiv(N1, N2) when is_number(N1), is_number(N2) -> N1 == N2; equiv(B1, B2) when is_binary(B1), is_binary(B2) -> B1 == B2; equiv(true, true) -> true; equiv(false, false) -> true; equiv(null, null) -> true. %% Object representation and traversal order is unknown. %% Use the sledgehammer and sort property lists. equiv_object(Props1, Props2) -> L1 = lists:keysort(1, Props1), L2 = lists:keysort(1, Props2), Pairs = lists:zip(L1, L2), true = lists:all( fun({{K1, V1}, {K2, V2}}) -> equiv(K1, K2) andalso equiv(V1, V2) end, Pairs). %% Recursively compare tuple elements for equivalence. equiv_list([], []) -> true; equiv_list([V1 | L1], [V2 | L2]) -> equiv(V1, V2) andalso equiv_list(L1, L2). single_byte_data_fun([]) -> done; single_byte_data_fun([H | T]) -> {<>, fun() -> single_byte_data_fun(T) end}. multiple_bytes_data_fun([]) -> done; multiple_bytes_data_fun(L) -> N = crypto:rand_uniform(0, 7), {Part, Rest} = split(L, N), {list_to_binary(Part), fun() -> multiple_bytes_data_fun(Rest) end}. split(L, N) when length(L) =< N -> {L, []}; split(L, N) -> take(N, L, []). take(0, L, Acc) -> {lists:reverse(Acc), L}; take(N, [H|L], Acc) -> take(N - 1, L, [H | Acc]). apache-couchdb-1.6.0/test/etap/160-vhosts.t0000755000175000001440000003364512332105522020263 0ustar00djcusers00000000000000#!/usr/bin/env escript %% -*- erlang -*- % Licensed under the Apache License, Version 2.0 (the "License"); you may not % use this file except in compliance with the License. You may obtain a copy of % the License at % % http://www.apache.org/licenses/LICENSE-2.0 % % Unless required by applicable law or agreed to in writing, software % distributed under the License is distributed on an "AS IS" BASIS, WITHOUT % WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the % License for the specific language governing permissions and limitations under % the License. -record(user_ctx, { name = null, roles = [], handler }). server() -> lists:concat([ "http://127.0.0.1:", mochiweb_socket_server:get(couch_httpd, port), "/" ]). dbname() -> "etap-test-db". admin_user_ctx() -> {user_ctx, #user_ctx{roles=[<<"_admin">>]}}. main(_) -> test_util:init_code_path(), etap:plan(20), case (catch test()) of ok -> etap:end_tests(); Other -> etap:diag(io_lib:format("Test died abnormally: ~p", [Other])), etap:bail(Other) end, ok. test() -> couch_server_sup:start_link(test_util:config_files()), ibrowse:start(), crypto:start(), timer:sleep(1000), couch_server:delete(list_to_binary(dbname()), [admin_user_ctx()]), {ok, Db} = couch_db:create(list_to_binary(dbname()), [admin_user_ctx()]), Doc = couch_doc:from_json_obj({[ {<<"_id">>, <<"doc1">>}, {<<"value">>, 666} ]}), Doc1 = couch_doc:from_json_obj({[ {<<"_id">>, <<"_design/doc1">>}, {<<"shows">>, {[ {<<"test">>, <<"function(doc, req) { return { json: { requested_path: '/' + req.requested_path.join('/'), path: '/' + req.path.join('/') }}; }">>} ]}}, {<<"rewrites">>, [ {[ {<<"from">>, <<"/">>}, {<<"to">>, <<"_show/test">>} ]} ]} ]}), {ok, _} = couch_db:update_docs(Db, [Doc, Doc1]), couch_db:ensure_full_commit(Db), %% end boilerplate, start test ok = couch_config:set("vhosts", "example.com", "/etap-test-db", false), ok = couch_config:set("vhosts", "*.example.com", "/etap-test-db/_design/doc1/_rewrite", false), ok = couch_config:set("vhosts", "example.com/test", "/etap-test-db", false), ok = couch_config:set("vhosts", "example1.com", "/etap-test-db/_design/doc1/_rewrite/", false), ok = couch_config:set("vhosts",":appname.:dbname.example1.com", "/:dbname/_design/:appname/_rewrite/", false), ok = couch_config:set("vhosts", ":dbname.example1.com", "/:dbname", false), ok = couch_config:set("vhosts", "*.example2.com", "/*", false), ok = couch_config:set("vhosts", "*.example2.com/test", "/*", false), ok = couch_config:set("vhosts", "*/test", "/etap-test-db", false), ok = couch_config:set("vhosts", "*/test1", "/etap-test-db/_design/doc1/_show/test", false), ok = couch_config:set("vhosts", "example3.com", "/", false), %% reload rules couch_httpd_vhost:reload(), test_regular_request(), test_vhost_request(), test_vhost_request_with_qs(), test_vhost_request_with_global(), test_vhost_requested_path(), test_vhost_requested_path_path(), test_vhost_request_wildcard(), test_vhost_request_replace_var(), test_vhost_request_replace_var1(), test_vhost_request_replace_wildcard(), test_vhost_request_path(), test_vhost_request_path1(), test_vhost_request_path2(), test_vhost_request_path3(), test_vhost_request_to_root(), test_vhost_request_with_oauth(Db), %% restart boilerplate couch_db:close(Db), ok = couch_server:delete(couch_db:name(Db), [admin_user_ctx()]), timer:sleep(3000), couch_server_sup:stop(), ok. test_regular_request() -> case ibrowse:send_req(server(), [], get, []) of {ok, _, _, Body} -> {Props} = ejson:decode(Body), Couchdb = couch_util:get_value(<<"couchdb">>, Props), Version = couch_util:get_value(<<"version">>, Props), Vendor = couch_util:get_value(<<"vendor">>, Props), etap:isnt(Couchdb, undefined, "Found couchdb property"), etap:isnt(Version, undefined, "Found version property"), etap:isnt(Vendor, undefined, "Found vendor property"); _Else -> etap:bail("http GET / request failed") end. test_vhost_request() -> case ibrowse:send_req(server(), [], get, [], [{host_header, "example.com"}]) of {ok, _, _, Body} -> {JsonBody} = ejson:decode(Body), HasDbNameInfo = proplists:is_defined(<<"db_name">>, JsonBody), etap:is(HasDbNameInfo, true, "should return database info"); _Else -> etap:is(false, true, <<"ibrowse fail">>) end. test_vhost_request_with_qs() -> Url = server() ++ "doc1?revs_info=true", case ibrowse:send_req(Url, [], get, [], [{host_header, "example.com"}]) of {ok, _, _, Body} -> {JsonProps} = ejson:decode(Body), HasRevsInfo = proplists:is_defined(<<"_revs_info">>, JsonProps), etap:is(HasRevsInfo, true, "should return _revs_info"); _Else -> etap:is(false, true, <<"ibrowse fail">>) end. test_vhost_request_with_global() -> Url2 = server() ++ "_utils/index.html", case ibrowse:send_req(Url2, [], get, [], [{host_header, "example.com"}]) of {ok, _, _, Body2} -> " etap:is(false, true, <<"ibrowse fail">>) end. test_vhost_requested_path() -> case ibrowse:send_req(server(), [], get, [], [{host_header, "example1.com"}]) of {ok, _, _, Body} -> {Json} = ejson:decode(Body), etap:is(case proplists:get_value(<<"requested_path">>, Json) of <<"/">> -> true; _ -> false end, true, <<"requested path in req ok">>); _Else -> etap:is(false, true, <<"ibrowse fail">>) end. test_vhost_requested_path_path() -> case ibrowse:send_req(server(), [], get, [], [{host_header, "example1.com"}]) of {ok, _, _, Body} -> {Json} = ejson:decode(Body), etap:is(case proplists:get_value(<<"path">>, Json) of <<"/etap-test-db/_design/doc1/_show/test">> -> true; _ -> false end, true, <<"path in req ok">>); _Else -> etap:is(false, true, <<"ibrowse fail">>) end. test_vhost_request_wildcard()-> case ibrowse:send_req(server(), [], get, [], [{host_header, "test.example.com"}]) of {ok, _, _, Body} -> {Json} = ejson:decode(Body), etap:is(case proplists:get_value(<<"path">>, Json) of <<"/etap-test-db/_design/doc1/_show/test">> -> true; _ -> false end, true, <<"wildcard ok">>); _Else -> etap:is(false, true, <<"ibrowse fail">>) end. test_vhost_request_replace_var() -> case ibrowse:send_req(server(), [], get, [], [{host_header,"etap-test-db.example1.com"}]) of {ok, _, _, Body} -> {JsonBody} = ejson:decode(Body), HasDbNameInfo = proplists:is_defined(<<"db_name">>, JsonBody), etap:is(HasDbNameInfo, true, "should return database info"); _Else -> etap:is(false, true, <<"ibrowse fail">>) end. test_vhost_request_replace_var1() -> case ibrowse:send_req(server(), [], get, [], [{host_header, "doc1.etap-test-db.example1.com"}]) of {ok, _, _, Body} -> {Json} = ejson:decode(Body), etap:is(case proplists:get_value(<<"path">>, Json) of <<"/etap-test-db/_design/doc1/_show/test">> -> true; _ -> false end, true, <<"wildcard ok">>); _Else -> etap:is(false, true, <<"ibrowse fail">>) end. test_vhost_request_replace_wildcard() -> case ibrowse:send_req(server(), [], get, [], [{host_header,"etap-test-db.example2.com"}]) of {ok, _, _, Body} -> {JsonBody} = ejson:decode(Body), HasDbNameInfo = proplists:is_defined(<<"db_name">>, JsonBody), etap:is(HasDbNameInfo, true, "should return database info"); _Else -> etap:is(false, true, <<"ibrowse fail">>) end. test_vhost_request_path() -> Uri = server() ++ "test", case ibrowse:send_req(Uri, [], get, [], [{host_header, "example.com"}]) of {ok, _, _, Body} -> {JsonBody} = ejson:decode(Body), HasDbNameInfo = proplists:is_defined(<<"db_name">>, JsonBody), etap:is(HasDbNameInfo, true, "should return database info"); _Else -> etap:is(false, true, <<"ibrowse fail">>) end. test_vhost_request_path1() -> Url = server() ++ "test/doc1?revs_info=true", case ibrowse:send_req(Url, [], get, [], []) of {ok, _, _, Body} -> {JsonProps} = ejson:decode(Body), HasRevsInfo = proplists:is_defined(<<"_revs_info">>, JsonProps), etap:is(HasRevsInfo, true, "should return _revs_info"); _Else -> etap:is(false, true, <<"ibrowse fail">>) end. test_vhost_request_path2() -> Uri = server() ++ "test", case ibrowse:send_req(Uri, [], get, [], [{host_header,"etap-test-db.example2.com"}]) of {ok, _, _, Body} -> {JsonBody} = ejson:decode(Body), HasDbNameInfo = proplists:is_defined(<<"db_name">>, JsonBody), etap:is(HasDbNameInfo, true, "should return database info"); _Else -> etap:is(false, true, <<"ibrowse fail">>) end. test_vhost_request_path3() -> Uri = server() ++ "test1", case ibrowse:send_req(Uri, [], get, [], []) of {ok, _, _, Body} -> {Json} = ejson:decode(Body), etap:is(case proplists:get_value(<<"path">>, Json) of <<"/etap-test-db/_design/doc1/_show/test">> -> true; _ -> false end, true, <<"path in req ok">>); _Else -> etap:is(false, true, <<"ibrowse fail">>) end. test_vhost_request_to_root() -> Uri = server(), case ibrowse:send_req(Uri, [], get, [], []) of {ok, _, _, Body} -> {JsonBody} = ejson:decode(Body), HasCouchDBWelcome = proplists:is_defined(<<"couchdb">>, JsonBody), etap:is(HasCouchDBWelcome, true, "should allow redirect to /"); _Else -> etap:is(false, true, <<"ibrowse fail">>) end. test_vhost_request_with_oauth(Db) -> {ok, AuthDb} = couch_db:create( <<"tap_test_sec_db">>, [admin_user_ctx(), overwrite]), PrevAuthDbName = couch_config:get("couch_httpd_auth", "authentication_db"), couch_config:set("couch_httpd_auth", "authentication_db", "tap_test_sec_db", false), couch_config:set("oauth_token_users", "otoksec1", "joe", false), couch_config:set("oauth_consumer_secrets", "consec1", "foo", false), couch_config:set("oauth_token_secrets", "otoksec1", "foobar", false), couch_config:set("couch_httpd_auth", "require_valid_user", "true", false), DDoc = couch_doc:from_json_obj({[ {<<"_id">>, <<"_design/test">>}, {<<"language">>, <<"javascript">>}, {<<"rewrites">>, [ {[ {<<"from">>, <<"foobar">>}, {<<"to">>, <<"_info">>} ]} ]} ]}), {ok, _} = couch_db:update_doc(Db, DDoc, []), RewritePath = "/etap-test-db/_design/test/_rewrite/foobar", ok = couch_config:set("vhosts", "oauth-example.com", RewritePath, false), couch_httpd_vhost:reload(), case ibrowse:send_req(server(), [], get, [], [{host_header, "oauth-example.com"}]) of {ok, "401", _, Body} -> {JsonBody} = ejson:decode(Body), etap:is( couch_util:get_value(<<"error">>, JsonBody), <<"unauthorized">>, "Request without OAuth credentials failed"); Error -> etap:bail("Request without OAuth credentials did not fail: " ++ couch_util:to_list(Error)) end, JoeDoc = couch_doc:from_json_obj({[ {<<"_id">>, <<"org.couchdb.user:joe">>}, {<<"type">>, <<"user">>}, {<<"name">>, <<"joe">>}, {<<"roles">>, []}, {<<"password_sha">>, <<"fe95df1ca59a9b567bdca5cbaf8412abd6e06121">>}, {<<"salt">>, <<"4e170ffeb6f34daecfd814dfb4001a73">>} ]}), {ok, _} = couch_db:update_doc(AuthDb, JoeDoc, []), Url = "http://oauth-example.com/", Consumer = {"consec1", "foo", hmac_sha1}, SignedParams = oauth:sign( "GET", Url, [], Consumer, "otoksec1", "foobar"), OAuthUrl = oauth:uri(server(), SignedParams), case ibrowse:send_req(OAuthUrl, [], get, [], [{host_header, "oauth-example.com"}]) of {ok, "200", _, Body2} -> {JsonBody2} = ejson:decode(Body2), etap:is(couch_util:get_value(<<"name">>, JsonBody2), <<"test">>, "should return ddoc info with OAuth credentials"); Error2 -> etap:bail("Failed to access vhost with OAuth credentials: " ++ couch_util:to_list(Error2)) end, Consumer2 = {"consec1", "bad_secret", hmac_sha1}, SignedParams2 = oauth:sign( "GET", Url, [], Consumer2, "otoksec1", "foobar"), OAuthUrl2 = oauth:uri(server(), SignedParams2), case ibrowse:send_req(OAuthUrl2, [], get, [], [{host_header, "oauth-example.com"}]) of {ok, "401", _, Body3} -> {JsonBody3} = ejson:decode(Body3), etap:is( couch_util:get_value(<<"error">>, JsonBody3), <<"unauthorized">>, "Request with bad OAuth credentials failed"); Error3 -> etap:bail("Failed to access vhost with bad OAuth credentials: " ++ couch_util:to_list(Error3)) end, couch_config:set("couch_httpd_auth", "authentication_db", PrevAuthDbName, false), couch_config:set("couch_httpd_auth", "require_valid_user", "false", false), ok = couch_server:delete(couch_db:name(AuthDb), [admin_user_ctx()]). apache-couchdb-1.6.0/test/etap/021-btree-reductions.t0000755000175000001440000002076312332105522022204 0ustar00djcusers00000000000000#!/usr/bin/env escript %% -*- erlang -*- %%! -pa ./src/couchdb -sasl errlog_type error -boot start_sasl -noshell % Licensed under the Apache License, Version 2.0 (the "License"); you may not % use this file except in compliance with the License. You may obtain a copy of % the License at % % http://www.apache.org/licenses/LICENSE-2.0 % % Unless required by applicable law or agreed to in writing, software % distributed under the License is distributed on an "AS IS" BASIS, WITHOUT % WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the % License for the specific language governing permissions and limitations under % the License. filename() -> "./test/etap/temp.021". rows() -> 1000. main(_) -> test_util:init_code_path(), etap:plan(20), case (catch test()) of ok -> etap:end_tests(); Other -> etap:diag(io_lib:format("Test died abnormally: ~p", [Other])), etap:bail() end, ok. test()-> ReduceFun = fun (reduce, KVs) -> length(KVs); (rereduce, Reds) -> lists:sum(Reds) end, {ok, Fd} = couch_file:open(filename(), [create,overwrite]), {ok, Btree} = couch_btree:open(nil, Fd, [{reduce, ReduceFun}]), % Create a list, of {"even", Value} or {"odd", Value} pairs. {_, EvenOddKVs} = lists:foldl(fun(Idx, {Key, Acc}) -> case Key of "even" -> {"odd", [{{Key, Idx}, 1} | Acc]}; _ -> {"even", [{{Key, Idx}, 1} | Acc]} end end, {"odd", []}, lists:seq(1, rows())), {ok, Btree2} = couch_btree:add_remove(Btree, EvenOddKVs, []), GroupFun = fun({K1, _}, {K2, _}) -> K1 == K2 end, FoldFun = fun(GroupedKey, Unreduced, Acc) -> {ok, [{GroupedKey, couch_btree:final_reduce(Btree2, Unreduced)} | Acc]} end, {SK1, EK1} = {{"even", -1}, {"even", foo}}, {SK2, EK2} = {{"odd", -1}, {"odd", foo}}, etap:fun_is( fun ({ok, [{{"odd", _}, 500}, {{"even", _}, 500}]}) -> true; (_) -> false end, couch_btree:fold_reduce(Btree2, FoldFun, [], [{key_group_fun, GroupFun}]), "Reduction works with no specified direction, startkey, or endkey." ), etap:fun_is( fun ({ok, [{{"odd", _}, 500}, {{"even", _}, 500}]}) -> true; (_) -> false end, couch_btree:fold_reduce(Btree2, FoldFun, [], [{key_group_fun, GroupFun}, {dir, fwd}]), "Reducing forward works with no startkey or endkey." ), etap:fun_is( fun ({ok, [{{"even", _}, 500}, {{"odd", _}, 500}]}) -> true; (_) -> false end, couch_btree:fold_reduce(Btree2, FoldFun, [], [{key_group_fun, GroupFun}, {dir, rev}]), "Reducing backwards works with no startkey or endkey." ), etap:fun_is( fun ({ok, [{{"odd", _}, 500}, {{"even", _}, 500}]}) -> true; (_) -> false end, couch_btree:fold_reduce(Btree2, FoldFun, [], [{dir, fwd}, {key_group_fun, GroupFun}, {start_key, SK1}, {end_key, EK2}]), "Reducing works over the entire range with startkey and endkey set." ), etap:fun_is( fun ({ok, [{{"even", _}, 500}]}) -> true; (_) -> false end, couch_btree:fold_reduce(Btree2, FoldFun, [], [{dir, fwd}, {key_group_fun, GroupFun}, {start_key, SK1}, {end_key, EK1}]), "Reducing forward over first half works with a startkey and endkey." ), etap:fun_is( fun ({ok, [{{"odd", _}, 500}]}) -> true; (_) -> false end, couch_btree:fold_reduce(Btree2, FoldFun, [], [{dir, fwd}, {key_group_fun, GroupFun}, {start_key, SK2}, {end_key, EK2}]), "Reducing forward over second half works with second startkey and endkey" ), etap:fun_is( fun ({ok, [{{"odd", _}, 500}]}) -> true; (_) -> false end, couch_btree:fold_reduce(Btree2, FoldFun, [], [{dir, rev}, {key_group_fun, GroupFun}, {start_key, EK2}, {end_key, SK2}]), "Reducing in reverse works after swapping the startkey and endkey." ), etap:fun_is( fun ({ok, [{{"even", _}, 500}, {{"odd", _}, 500}]}) -> true; (_) -> false end, couch_btree:fold_reduce(Btree2, FoldFun, [], [{dir, rev}, {key_group_fun, GroupFun}, {start_key, EK2}, {end_key, SK1}]), "Reducing in reverse results in reversed accumulator." ), etap:is( couch_btree:fold_reduce(Btree2, FoldFun, [], [ {dir, fwd}, {key_group_fun, GroupFun}, {start_key, {"even", 0}}, {end_key, {"odd", rows() + 1}} ]), {ok, [{{"odd", 1}, 500}, {{"even", 2}, 500}]}, "Right fold reduce value for whole range with inclusive end key"), etap:is( couch_btree:fold_reduce(Btree2, FoldFun, [], [ {dir, fwd}, {key_group_fun, GroupFun}, {start_key, {"even", 0}}, {end_key_gt, {"odd", 999}} ]), {ok, [{{"odd", 1}, 499}, {{"even", 2}, 500}]}, "Right fold reduce value for whole range without inclusive end key"), etap:is( couch_btree:fold_reduce(Btree2, FoldFun, [], [ {dir, rev}, {key_group_fun, GroupFun}, {start_key, {"odd", 999}}, {end_key, {"even", 2}} ]), {ok, [{{"even", 1000}, 500}, {{"odd", 999}, 500}]}, "Right fold reduce value for whole reversed range with inclusive end key"), etap:is( couch_btree:fold_reduce(Btree2, FoldFun, [], [ {dir, rev}, {key_group_fun, GroupFun}, {start_key, {"odd", 999}}, {end_key_gt, {"even", 2}} ]), {ok, [{{"even", 1000}, 499}, {{"odd", 999}, 500}]}, "Right fold reduce value for whole reversed range without inclusive end key"), etap:is( couch_btree:fold_reduce(Btree2, FoldFun, [], [ {dir, fwd}, {key_group_fun, GroupFun}, {start_key, {"even", 0}}, {end_key, {"odd", 499}} ]), {ok, [{{"odd", 1}, 250}, {{"even", 2}, 500}]}, "Right fold reduce value for first half with inclusive end key"), etap:is( couch_btree:fold_reduce(Btree2, FoldFun, [], [ {dir, fwd}, {key_group_fun, GroupFun}, {start_key, {"even", 0}}, {end_key_gt, {"odd", 499}} ]), {ok, [{{"odd", 1}, 249}, {{"even", 2}, 500}]}, "Right fold reduce value for first half without inclusive end key"), etap:is( couch_btree:fold_reduce(Btree2, FoldFun, [], [ {dir, rev}, {key_group_fun, GroupFun}, {start_key, {"odd", 999}}, {end_key, {"even", 500}} ]), {ok, [{{"even", 1000}, 251}, {{"odd", 999}, 500}]}, "Right fold reduce value for first half reversed with inclusive end key"), etap:is( couch_btree:fold_reduce(Btree2, FoldFun, [], [ {dir, rev}, {key_group_fun, GroupFun}, {start_key, {"odd", 999}}, {end_key_gt, {"even", 500}} ]), {ok, [{{"even", 1000}, 250}, {{"odd", 999}, 500}]}, "Right fold reduce value for first half reversed without inclusive end key"), etap:is( couch_btree:fold_reduce(Btree2, FoldFun, [], [ {dir, fwd}, {key_group_fun, GroupFun}, {start_key, {"even", 500}}, {end_key, {"odd", 999}} ]), {ok, [{{"odd", 1}, 500}, {{"even", 500}, 251}]}, "Right fold reduce value for second half with inclusive end key"), etap:is( couch_btree:fold_reduce(Btree2, FoldFun, [], [ {dir, fwd}, {key_group_fun, GroupFun}, {start_key, {"even", 500}}, {end_key_gt, {"odd", 999}} ]), {ok, [{{"odd", 1}, 499}, {{"even", 500}, 251}]}, "Right fold reduce value for second half without inclusive end key"), etap:is( couch_btree:fold_reduce(Btree2, FoldFun, [], [ {dir, rev}, {key_group_fun, GroupFun}, {start_key, {"odd", 501}}, {end_key, {"even", 2}} ]), {ok, [{{"even", 1000}, 500}, {{"odd", 501}, 251}]}, "Right fold reduce value for second half reversed with inclusive end key"), etap:is( couch_btree:fold_reduce(Btree2, FoldFun, [], [ {dir, rev}, {key_group_fun, GroupFun}, {start_key, {"odd", 501}}, {end_key_gt, {"even", 2}} ]), {ok, [{{"even", 1000}, 499}, {{"odd", 501}, 251}]}, "Right fold reduce value for second half reversed without inclusive end key"), couch_file:close(Fd). apache-couchdb-1.6.0/test/etap/100-ref-counter.t0000755000175000001440000000555212332105522021154 0ustar00djcusers00000000000000#!/usr/bin/env escript %% -*- erlang -*- % Licensed under the Apache License, Version 2.0 (the "License"); you may not % use this file except in compliance with the License. You may obtain a copy of % the License at % % http://www.apache.org/licenses/LICENSE-2.0 % % Unless required by applicable law or agreed to in writing, software % distributed under the License is distributed on an "AS IS" BASIS, WITHOUT % WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the % License for the specific language governing permissions and limitations under % the License. main(_) -> test_util:init_code_path(), etap:plan(8), case (catch test()) of ok -> etap:end_tests(); Other -> etap:diag(io_lib:format("Test died abnormally: ~p", [Other])), etap:bail(Other) end, ok. loop() -> receive close -> ok end. wait() -> receive {'DOWN', _, _, _, _} -> ok after 1000 -> throw(timeout_error) end. test() -> {ok, RefCtr} = couch_ref_counter:start([]), etap:is( couch_ref_counter:count(RefCtr), 1, "A ref_counter is initialized with the calling process as a referer." ), ChildPid1 = spawn(fun() -> loop() end), % This is largely implicit in that nothing else breaks % as ok is just returned from gen_server:cast() etap:is( couch_ref_counter:drop(RefCtr, ChildPid1), ok, "Dropping an unknown Pid is ignored." ), couch_ref_counter:add(RefCtr, ChildPid1), etap:is( couch_ref_counter:count(RefCtr), 2, "Adding a Pid to the ref_counter increases it's count." ), couch_ref_counter:add(RefCtr, ChildPid1), etap:is( couch_ref_counter:count(RefCtr), 2, "Readding the same Pid maintains the count but increments it's refs." ), couch_ref_counter:drop(RefCtr, ChildPid1), etap:is( couch_ref_counter:count(RefCtr), 2, "Droping the doubly added Pid only removes a ref, not a referer." ), couch_ref_counter:drop(RefCtr, ChildPid1), etap:is( couch_ref_counter:count(RefCtr), 1, "Dropping the second ref drops the referer." ), couch_ref_counter:add(RefCtr, ChildPid1), etap:is( couch_ref_counter:count(RefCtr), 2, "Sanity checking that the Pid was re-added." ), erlang:monitor(process, ChildPid1), ChildPid1 ! close, wait(), CheckFun = fun (Iter, nil) -> case couch_ref_counter:count(RefCtr) of 1 -> Iter; _ -> nil end; (_, Acc) -> Acc end, Result = lists:foldl(CheckFun, nil, lists:seq(1, 10000)), etap:isnt( Result, nil, "The referer count was decremented automatically on process exit." ), ok. apache-couchdb-1.6.0/test/etap/010-file-basics.t0000755000175000001440000001030312332105522021072 0ustar00djcusers00000000000000#!/usr/bin/env escript %% -*- erlang -*- % Licensed under the Apache License, Version 2.0 (the "License"); you may not % use this file except in compliance with the License. You may obtain a copy of % the License at % % http://www.apache.org/licenses/LICENSE-2.0 % % Unless required by applicable law or agreed to in writing, software % distributed under the License is distributed on an "AS IS" BASIS, WITHOUT % WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the % License for the specific language governing permissions and limitations under % the License. -define(etap_match(Got, Expected, Desc), etap:fun_is(fun(XXXXXX) -> case XXXXXX of Expected -> true; _ -> false end end, Got, Desc)). filename() -> test_util:build_file("test/etap/temp.010"). main(_) -> test_util:init_code_path(), etap:plan(19), case (catch test()) of ok -> etap:end_tests(); Other -> etap:diag(io_lib:format("Test died abnormally: ~p", [Other])), etap:bail() end, ok. test() -> etap:is({error, enoent}, couch_file:open("not a real file"), "Opening a non-existant file should return an enoent error."), etap:fun_is( fun({ok, _}) -> true; (_) -> false end, couch_file:open(filename() ++ ".1", [create, invalid_option]), "Invalid flags to open are ignored." ), {ok, Fd} = couch_file:open(filename() ++ ".0", [create, overwrite]), etap:ok(is_pid(Fd), "Returned file descriptor is a Pid"), etap:is({ok, 0}, couch_file:bytes(Fd), "Newly created files have 0 bytes."), ?etap_match(couch_file:append_term(Fd, foo), {ok, 0, _}, "Appending a term returns the previous end of file position."), {ok, Size} = couch_file:bytes(Fd), etap:is_greater(Size, 0, "Writing a term increased the file size."), ?etap_match(couch_file:append_binary(Fd, <<"fancy!">>), {ok, Size, _}, "Appending a binary returns the current file size."), etap:is({ok, foo}, couch_file:pread_term(Fd, 0), "Reading the first term returns what we wrote: foo"), etap:is({ok, <<"fancy!">>}, couch_file:pread_binary(Fd, Size), "Reading back the binary returns what we wrote: <<\"fancy\">>."), etap:is({ok, couch_compress:compress(foo, snappy)}, couch_file:pread_binary(Fd, 0), "Reading a binary at a term position returns the term as binary." ), {ok, BinPos, _} = couch_file:append_binary(Fd, <<131,100,0,3,102,111,111>>), etap:is({ok, foo}, couch_file:pread_term(Fd, BinPos), "Reading a term from a written binary term representation succeeds."), BigBin = list_to_binary(lists:duplicate(100000, 0)), {ok, BigBinPos, _} = couch_file:append_binary(Fd, BigBin), etap:is({ok, BigBin}, couch_file:pread_binary(Fd, BigBinPos), "Reading a large term from a written representation succeeds."), ok = couch_file:write_header(Fd, hello), etap:is({ok, hello}, couch_file:read_header(Fd), "Reading a header succeeds."), {ok, BigBinPos2, _} = couch_file:append_binary(Fd, BigBin), etap:is({ok, BigBin}, couch_file:pread_binary(Fd, BigBinPos2), "Reading a large term from a written representation succeeds 2."), % append_binary == append_iolist? % Possible bug in pread_iolist or iolist() -> append_binary {ok, IOLPos, _} = couch_file:append_binary(Fd, ["foo", $m, <<"bam">>]), {ok, IoList} = couch_file:pread_iolist(Fd, IOLPos), etap:is(<<"foombam">>, iolist_to_binary(IoList), "Reading an results in a binary form of the written iolist()"), % XXX: How does on test fsync? etap:is(ok, couch_file:sync(Fd), "Syncing does not cause an error."), etap:is(ok, couch_file:truncate(Fd, Size), "Truncating a file succeeds."), %etap:is(eof, (catch couch_file:pread_binary(Fd, Size)), % "Reading data that was truncated fails.") etap:skip(fun() -> ok end, "No idea how to test reading beyond EOF"), etap:is({ok, foo}, couch_file:pread_term(Fd, 0), "Truncating does not affect data located before the truncation mark."), etap:is(ok, couch_file:close(Fd), "Files close properly."), ok. apache-couchdb-1.6.0/test/etap/172-os-daemon-errors.1.sh0000644000175000001440000000120712332105522022424 0ustar00djcusers00000000000000#!/bin/sh -e # # Licensed under the Apache License, Version 2.0 (the "License"); you may not # use this file except in compliance with the License. You may obtain a copy of # the License at # # http://www.apache.org/licenses/LICENSE-2.0 # # Unless required by applicable law or agreed to in writing, software # distributed under the License is distributed on an "AS IS" BASIS, WITHOUT # WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the # License for the specific language governing permissions and limitations under # the License. # # Please do not make this file executable as that's the error being tested. sleep 5 apache-couchdb-1.6.0/test/etap/172-os-daemon-errors.2.sh0000755000175000001440000000106712332105522022434 0ustar00djcusers00000000000000#!/bin/sh -e # # Licensed under the Apache License, Version 2.0 (the "License"); you may not # use this file except in compliance with the License. You may obtain a copy of # the License at # # http://www.apache.org/licenses/LICENSE-2.0 # # Unless required by applicable law or agreed to in writing, software # distributed under the License is distributed on an "AS IS" BASIS, WITHOUT # WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the # License for the specific language governing permissions and limitations under # the License. exit 1 apache-couchdb-1.6.0/test/etap/172-os-daemon-errors.3.sh0000755000175000001440000000107012332105522022427 0ustar00djcusers00000000000000#!/bin/sh -e # # Licensed under the Apache License, Version 2.0 (the "License"); you may not # use this file except in compliance with the License. You may obtain a copy of # the License at # # http://www.apache.org/licenses/LICENSE-2.0 # # Unless required by applicable law or agreed to in writing, software # distributed under the License is distributed on an "AS IS" BASIS, WITHOUT # WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the # License for the specific language governing permissions and limitations under # the License. sleep 1 apache-couchdb-1.6.0/test/etap/172-os-daemon-errors.4.sh0000755000175000001440000000107012332105522022430 0ustar00djcusers00000000000000#!/bin/sh -e # # Licensed under the Apache License, Version 2.0 (the "License"); you may not # use this file except in compliance with the License. You may obtain a copy of # the License at # # http://www.apache.org/licenses/LICENSE-2.0 # # Unless required by applicable law or agreed to in writing, software # distributed under the License is distributed on an "AS IS" BASIS, WITHOUT # WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the # License for the specific language governing permissions and limitations under # the License. sleep 2 apache-couchdb-1.6.0/test/etap/040-util.t0000755000175000001440000000532512332105522017701 0ustar00djcusers00000000000000#!/usr/bin/env escript %% -*- erlang -*- % Licensed under the Apache License, Version 2.0 (the "License"); you may not % use this file except in compliance with the License. You may obtain a copy of % the License at % % http://www.apache.org/licenses/LICENSE-2.0 % % Unless required by applicable law or agreed to in writing, software % distributed under the License is distributed on an "AS IS" BASIS, WITHOUT % WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the % License for the specific language governing permissions and limitations under % the License. main(_) -> test_util:init_code_path(), application:start(crypto), etap:plan(14), case (catch test()) of ok -> etap:end_tests(); Other -> etap:diag(io_lib:format("Test died abnormally: ~p", [Other])), etap:bail(Other) end, ok. test() -> % to_existing_atom etap:is(true, couch_util:to_existing_atom(true), "An atom is an atom."), etap:is(foo, couch_util:to_existing_atom(<<"foo">>), "A binary foo is the atom foo."), etap:is(foobarbaz, couch_util:to_existing_atom("foobarbaz"), "A list of atoms is one munged atom."), % implode etap:is([1, 38, 2, 38, 3], couch_util:implode([1,2,3],"&"), "use & as separator in list."), % trim Strings = [" foo", "foo ", "\tfoo", " foo ", "foo\t", "foo\n", "\nfoo"], etap:ok(lists:all(fun(S) -> couch_util:trim(S) == "foo" end, Strings), "everything here trimmed should be foo."), % abs_pathname {ok, Cwd} = file:get_cwd(), etap:is(Cwd ++ "/foo", couch_util:abs_pathname("./foo"), "foo is in this directory."), % should_flush etap:ok(not couch_util:should_flush(), "Not using enough memory to flush."), AcquireMem = fun() -> _IntsToAGazillion = lists:seq(1, 200000), _LotsOfData = lists:map( fun(Int) -> {Int, <<"foobar">>} end, lists:seq(1, 500000)), etap:ok(couch_util:should_flush(), "Allocation 200K tuples puts us above the memory threshold.") end, AcquireMem(), etap:ok(not couch_util:should_flush(), "Checking to flush invokes GC."), % verify etap:is(true, couch_util:verify("It4Vooya", "It4Vooya"), "String comparison."), etap:is(false, couch_util:verify("It4VooyaX", "It4Vooya"), "String comparison (unequal lengths)."), etap:is(true, couch_util:verify(<<"ahBase3r">>, <<"ahBase3r">>), "Binary comparison."), etap:is(false, couch_util:verify(<<"ahBase3rX">>, <<"ahBase3r">>), "Binary comparison (unequal lengths)."), etap:is(false, couch_util:verify(nil, <<"ahBase3r">>), "Binary comparison with atom."), ok. apache-couchdb-1.6.0/test/etap/171-os-daemons-config.t0000755000175000001440000000422412332105522022236 0ustar00djcusers00000000000000#!/usr/bin/env escript %% -*- erlang -*- % Licensed under the Apache License, Version 2.0 (the "License"); you may not % use this file except in compliance with the License. You may obtain a copy of % the License at % % http://www.apache.org/licenses/LICENSE-2.0 % % Unless required by applicable law or agreed to in writing, software % distributed under the License is distributed on an "AS IS" BASIS, WITHOUT % WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the % License for the specific language governing permissions and limitations under % the License. -record(daemon, { port, name, cmd, kill, status=running, cfg_patterns=[], errors=[], buf=[] }). config_files() -> lists:map(fun test_util:build_file/1, [ "etc/couchdb/default_dev.ini" ]). daemon_cmd() -> test_util:source_file("test/etap/171-os-daemons-config.es"). main(_) -> test_util:init_code_path(), etap:plan(6), case (catch test()) of ok -> etap:end_tests(); Other -> etap:diag(io_lib:format("Test died abnormally: ~p", [Other])), etap:bail(Other) end, ok. test() -> couch_config:start_link(config_files()), couch_config:set("log", "level", "debug", false), couch_log:start_link(), couch_os_daemons:start_link(), % "foo" is a required name by this test. couch_config:set("os_daemons", "foo", daemon_cmd(), false), timer:sleep(1000), {ok, [D1]} = couch_os_daemons:info([table]), check_daemon(D1, "foo"), ok. check_daemon(D, Name) -> BaseName = "171-os-daemons-config.es", BaseLen = length(BaseName), CmdLen = length(D#daemon.cmd), CmdName = lists:sublist(D#daemon.cmd, CmdLen-BaseLen+1, BaseLen), etap:is(is_port(D#daemon.port), true, "Daemon port is a port."), etap:is(D#daemon.name, Name, "Daemon name was set correctly."), etap:is(CmdName, BaseName, "Command name was set correctly."), etap:isnt(D#daemon.kill, undefined, "Kill command was set."), etap:is(D#daemon.errors, [], "No errors occurred while booting."), etap:is(D#daemon.buf, [], "No extra data left in the buffer."). apache-couchdb-1.6.0/test/etap/070-couch-db.t0000755000175000001440000000453712332105522020417 0ustar00djcusers00000000000000#!/usr/bin/env escript %% -*- erlang -*- % Licensed under the Apache License, Version 2.0 (the "License"); you may not % use this file except in compliance with the License. You may obtain a copy of % the License at % % http://www.apache.org/licenses/LICENSE-2.0 % % Unless required by applicable law or agreed to in writing, software % distributed under the License is distributed on an "AS IS" BASIS, WITHOUT % WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the % License for the specific language governing permissions and limitations under % the License. main(_) -> test_util:init_code_path(), etap:plan(4), case (catch test()) of ok -> etap:end_tests(); Other -> etap:diag(io_lib:format("Test died abnormally: ~p", [Other])), etap:bail(Other) end, ok. test() -> couch_server_sup:start_link(test_util:config_files()), couch_db:create(<<"etap-test-db">>, []), {ok, AllDbs} = couch_server:all_databases(), etap:ok(lists:member(<<"etap-test-db">>, AllDbs), "Database was created."), couch_server:delete(<<"etap-test-db">>, []), {ok, AllDbs2} = couch_server:all_databases(), etap:ok(not lists:member(<<"etap-test-db">>, AllDbs2), "Database was deleted."), gen_server:call(couch_server, {set_max_dbs_open, 3}), MkDbName = fun(Int) -> list_to_binary("lru-" ++ integer_to_list(Int)) end, lists:foreach(fun(Int) -> {ok, TestDbs} = couch_server:all_databases(), ok = case lists:member(MkDbName(Int), TestDbs) of true -> couch_server:delete(MkDbName(Int), []); _ -> ok end, {ok, Db} = couch_db:create(MkDbName(Int), []), ok = couch_db:close(Db) end, lists:seq(1, 6)), {ok, AllDbs3} = couch_server:all_databases(), NumCreated = lists:foldl(fun(Int, Acc) -> true = lists:member(MkDbName(Int), AllDbs3), Acc+1 end, 0, lists:seq(1, 6)), etap:is(6, NumCreated, "Created all databases."), lists:foreach(fun(Int) -> ok = couch_server:delete(MkDbName(Int), []) end, lists:seq(1, 6)), {ok, AllDbs4} = couch_server:all_databases(), NumDeleted = lists:foldl(fun(Int, Acc) -> false = lists:member(MkDbName(Int), AllDbs4), Acc+1 end, 0, lists:seq(1, 6)), etap:is(6, NumDeleted, "Deleted all databases."), ok. apache-couchdb-1.6.0/test/etap/082-config-register.t0000755000175000001440000000504412332105522022017 0ustar00djcusers00000000000000#!/usr/bin/env escript %% -*- erlang -*- % Licensed under the Apache License, Version 2.0 (the "License"); you may not % use this file except in compliance with the License. You may obtain a copy of % the License at % % http://www.apache.org/licenses/LICENSE-2.0 % % Unless required by applicable law or agreed to in writing, software % distributed under the License is distributed on an "AS IS" BASIS, WITHOUT % WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the % License for the specific language governing permissions and limitations under % the License. default_config() -> test_util:build_file("etc/couchdb/default_dev.ini"). main(_) -> test_util:init_code_path(), etap:plan(5), case (catch test()) of ok -> etap:end_tests(); Other -> etap:diag(io_lib:format("Test died abnormally: ~p", [Other])), etap:bail(Other) end, ok. test() -> couch_config:start_link([default_config()]), etap:is( couch_config:get("httpd", "port"), "5984", "{httpd, port} is 5984 by default." ), ok = couch_config:set("httpd", "port", "4895", false), etap:is( couch_config:get("httpd", "port"), "4895", "{httpd, port} changed to 4895" ), SentinelFunc = fun() -> % Ping/Pong to make sure we wait for this % process to die receive {ping, From} -> From ! pong end end, SentinelPid = spawn(SentinelFunc), couch_config:register( fun("httpd", "port", Value) -> etap:is(Value, "8080", "Registered function got notification.") end, SentinelPid ), ok = couch_config:set("httpd", "port", "8080", false), % Implicitly checking that we *don't* call the function etap:is( couch_config:get("httpd", "bind_address"), "127.0.0.1", "{httpd, bind_address} is not '0.0.0.0'" ), ok = couch_config:set("httpd", "bind_address", "0.0.0.0", false), % Ping-Pong kill process SentinelPid ! {ping, self()}, receive _Any -> ok after 1000 -> throw({timeout_error, registered_pid}) end, ok = couch_config:set("httpd", "port", "80", false), etap:is( couch_config:get("httpd", "port"), "80", "Implicitly test that the function got de-registered" ), % test passing of Persist flag couch_config:register( fun("httpd", _, _, Persist) -> etap:is(Persist, false) end), ok = couch_config:set("httpd", "port", "80", false), ok. apache-couchdb-1.6.0/test/etap/201-view-group-shutdown.t0000755000175000001440000002034212332105522022674 0ustar00djcusers00000000000000#!/usr/bin/env escript %% -*- erlang -*- % Licensed under the Apache License, Version 2.0 (the "License"); you may not % use this file except in compliance with the License. You may obtain a copy of % the License at % % http://www.apache.org/licenses/LICENSE-2.0 % % Unless required by applicable law or agreed to in writing, software % distributed under the License is distributed on an "AS IS" BASIS, WITHOUT % WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the % License for the specific language governing permissions and limitations under % the License. -record(user_ctx, { name = null, roles = [], handler }). -record(db, { main_pid = nil, update_pid = nil, compactor_pid = nil, instance_start_time, % number of microsecs since jan 1 1970 as a binary string fd, updater_fd, fd_ref_counter, header = nil, committed_update_seq, fulldocinfo_by_id_btree, docinfo_by_seq_btree, local_docs_btree, update_seq, name, filepath, validate_doc_funs = [], security = [], security_ptr = nil, user_ctx = #user_ctx{}, waiting_delayed_commit = nil, revs_limit = 1000, fsync_options = [], options = [], compression, before_doc_update, after_doc_read }). main_db_name() -> <<"couch_test_view_group_shutdown">>. main(_) -> test_util:init_code_path(), etap:plan(17), case (catch test()) of ok -> etap:end_tests(); Other -> etap:diag(io_lib:format("Test died abnormally: ~p", [Other])), etap:bail(Other) end, ok. test() -> couch_server_sup:start_link(test_util:config_files()), ok = couch_config:set("couchdb", "max_dbs_open", "3", false), ok = couch_config:set("couchdb", "delayed_commits", "false", false), crypto:start(), % Test that while a view group is being compacted its database can not % be closed by the database LRU system. test_view_group_compaction(), couch_server_sup:stop(), ok. test_view_group_compaction() -> {ok, DbWriter3} = create_db(<<"couch_test_view_group_shutdown_w3">>), ok = couch_db:close(DbWriter3), {ok, MainDb} = create_main_db(), ok = couch_db:close(MainDb), {ok, DbWriter1} = create_db(<<"couch_test_view_group_shutdown_w1">>), ok = couch_db:close(DbWriter1), {ok, DbWriter2} = create_db(<<"couch_test_view_group_shutdown_w2">>), ok = couch_db:close(DbWriter2), Writer1 = spawn_writer(DbWriter1#db.name), Writer2 = spawn_writer(DbWriter2#db.name), etap:is(is_process_alive(Writer1), true, "Spawned writer 1"), etap:is(is_process_alive(Writer2), true, "Spawned writer 2"), etap:is(get_writer_status(Writer1), ok, "Writer 1 opened his database"), etap:is(get_writer_status(Writer2), ok, "Writer 2 opened his database"), {ok, MonRef} = couch_mrview:compact(MainDb#db.name, <<"_design/foo">>, [monitor]), % Add some more docs to database and trigger view update {ok, MainDb2} = couch_db:open_int(MainDb#db.name, []), ok = populate_main_db(MainDb2, 3, 3), update_view(MainDb2#db.name, <<"_design/foo">>, <<"foo">>), ok = couch_db:close(MainDb2), % Assuming the view compaction takes more than 50ms to complete ok = timer:sleep(50), Writer3 = spawn_writer(DbWriter3#db.name), etap:is(is_process_alive(Writer3), true, "Spawned writer 3"), etap:is(get_writer_status(Writer3), {error, all_dbs_active}, "Writer 3 got {error, all_dbs_active} when opening his database"), etap:is(is_process_alive(Writer1), true, "Writer 1 still alive"), etap:is(is_process_alive(Writer2), true, "Writer 2 still alive"), etap:is(is_process_alive(Writer3), true, "Writer 3 still alive"), receive {'DOWN', MonRef, process, _, normal} -> etap:diag("View group compaction successful"), ok; {'DOWN', MonRef, process, _, _Reason} -> etap:bail("Failure compacting view group") end, ok = timer:sleep(2000), etap:is(writer_try_again(Writer3), ok, "Told writer 3 to try open his database again"), etap:is(get_writer_status(Writer3), ok, "Writer 3 was able to open his database"), etap:is(is_process_alive(Writer1), true, "Writer 1 still alive"), etap:is(is_process_alive(Writer2), true, "Writer 2 still alive"), etap:is(is_process_alive(Writer3), true, "Writer 3 still alive"), etap:is(stop_writer(Writer1), ok, "Stopped writer 1"), etap:is(stop_writer(Writer2), ok, "Stopped writer 2"), etap:is(stop_writer(Writer3), ok, "Stopped writer 3"), delete_db(MainDb), delete_db(DbWriter1), delete_db(DbWriter2), delete_db(DbWriter3). create_main_db() -> {ok, Db} = create_db(main_db_name()), DDoc = couch_doc:from_json_obj({[ {<<"_id">>, <<"_design/foo">>}, {<<"language">>, <<"javascript">>}, {<<"views">>, {[ {<<"foo">>, {[ {<<"map">>, <<"function(doc) { emit(doc._id, doc); }">>} ]}}, {<<"foo2">>, {[ {<<"map">>, <<"function(doc) { emit(doc._id, doc); }">>} ]}}, {<<"foo3">>, {[ {<<"map">>, <<"function(doc) { emit(doc._id, doc); }">>} ]}}, {<<"foo4">>, {[ {<<"map">>, <<"function(doc) { emit(doc._id, doc); }">>} ]}}, {<<"foo5">>, {[ {<<"map">>, <<"function(doc) { emit(doc._id, doc); }">>} ]}} ]}} ]}), {ok, _} = couch_db:update_doc(Db, DDoc, []), ok = populate_main_db(Db, 1000, 20000), update_view(Db#db.name, <<"_design/foo">>, <<"foo">>), {ok, Db}. populate_main_db(Db, BatchSize, N) when N > 0 -> Docs = lists:map( fun(_) -> couch_doc:from_json_obj({[ {<<"_id">>, couch_uuids:new()}, {<<"value">>, base64:encode(crypto:rand_bytes(1000))} ]}) end, lists:seq(1, BatchSize)), {ok, _} = couch_db:update_docs(Db, Docs, []), populate_main_db(Db, BatchSize, N - length(Docs)); populate_main_db(_Db, _, _) -> ok. update_view(DbName, DDocName, ViewName) -> {ok, Db} = couch_db:open_int(DbName, []), {ok, DDoc} = couch_db:open_doc(Db, DDocName, [ejson_body]), couch_mrview:query_view(Db, DDoc, ViewName, [{stale, false}]), ok = couch_db:close(Db), etap:diag("View group updated"). create_db(DbName) -> {ok, Db} = couch_db:create( DbName, [{user_ctx, #user_ctx{roles = [<<"_admin">>]}}, overwrite]), {ok, Db}. delete_db(#db{name = DbName, main_pid = Pid}) -> ok = couch_server:delete( DbName, [{user_ctx, #user_ctx{roles = [<<"_admin">>]}}]), MonRef = erlang:monitor(process, Pid), receive {'DOWN', MonRef, process, Pid, _Reason} -> ok after 30000 -> etap:bail("Timeout deleting database") end. spawn_writer(DbName) -> Parent = self(), spawn(fun() -> process_flag(priority, high), writer_loop(DbName, Parent) end). get_writer_status(Writer) -> Ref = make_ref(), Writer ! {get_status, Ref}, receive {db_open, Ref} -> ok; {db_open_error, Error, Ref} -> Error after 5000 -> timeout end. writer_try_again(Writer) -> Ref = make_ref(), Writer ! {try_again, Ref}, receive {ok, Ref} -> ok after 5000 -> timeout end. stop_writer(Writer) -> Ref = make_ref(), Writer ! {stop, Ref}, receive {ok, Ref} -> ok after 5000 -> etap:bail("Timeout stopping writer process") end. % Just keep the database open, no need to actually do something on it. writer_loop(DbName, Parent) -> case couch_db:open_int(DbName, []) of {ok, Db} -> writer_loop_1(Db, Parent); Error -> writer_loop_2(DbName, Parent, Error) end. writer_loop_1(Db, Parent) -> receive {get_status, Ref} -> Parent ! {db_open, Ref}, writer_loop_1(Db, Parent); {stop, Ref} -> ok = couch_db:close(Db), Parent ! {ok, Ref} end. writer_loop_2(DbName, Parent, Error) -> receive {get_status, Ref} -> Parent ! {db_open_error, Error, Ref}, writer_loop_2(DbName, Parent, Error); {try_again, Ref} -> Parent ! {ok, Ref}, writer_loop(DbName, Parent) end. apache-couchdb-1.6.0/test/etap/run.tpl0000644000175000001440000000154212332105522017555 0ustar00djcusers00000000000000#!/bin/sh -e # Licensed under the Apache License, Version 2.0 (the "License"); you may not # use this file except in compliance with the License. You may obtain a copy of # the License at # # http://www.apache.org/licenses/LICENSE-2.0 # # Unless required by applicable law or agreed to in writing, software # distributed under the License is distributed on an "AS IS" BASIS, WITHOUT # WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the # License for the specific language governing permissions and limitations under # the License. SRCDIR="%abs_top_srcdir%" BUILDDIR="%abs_top_builddir%" export ERL_LIBS="$BUILDDIR/src/:$ERL_LIBS" export ERL_FLAGS="$ERL_FLAGS -pa $BUILDDIR/test/etap/" if test $# -eq 1; then OPTS="" TGT=$1 else OPTS=$1 TGT=$2 fi if test -f $TGT; then prove $OPTS $TGT else prove $OPTS $TGT/*.t fi apache-couchdb-1.6.0/test/etap/050-stream.t0000755000175000001440000000625712332105522020225 0ustar00djcusers00000000000000#!/usr/bin/env escript %% -*- erlang -*- % Licensed under the Apache License, Version 2.0 (the "License"); you may not % use this file except in compliance with the License. You may obtain a copy of % the License at % % http://www.apache.org/licenses/LICENSE-2.0 % % Unless required by applicable law or agreed to in writing, software % distributed under the License is distributed on an "AS IS" BASIS, WITHOUT % WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the % License for the specific language governing permissions and limitations under % the License. main(_) -> test_util:init_code_path(), etap:plan(13), case (catch test()) of ok -> etap:end_tests(); Other -> etap:diag(io_lib:format("Test died abnormally: ~p", [Other])), etap:bail(Other) end, ok. read_all(Fd, PosList) -> Data = couch_stream:foldl(Fd, PosList, fun(Bin, Acc) -> [Bin, Acc] end, []), iolist_to_binary(Data). test() -> {ok, Fd} = couch_file:open("test/etap/temp.050", [create,overwrite]), {ok, Stream} = couch_stream:open(Fd), etap:is(ok, couch_stream:write(Stream, <<"food">>), "Writing to streams works."), etap:is(ok, couch_stream:write(Stream, <<"foob">>), "Consecutive writing to streams works."), etap:is(ok, couch_stream:write(Stream, <<>>), "Writing an empty binary does nothing."), {Ptrs, Length, _, _, _} = couch_stream:close(Stream), etap:is(Ptrs, [{0, 8}], "Close returns the file pointers."), etap:is(Length, 8, "Close also returns the number of bytes written."), etap:is(<<"foodfoob">>, read_all(Fd, Ptrs), "Returned pointers are valid."), % Remember where we expect the pointer to be. {ok, ExpPtr} = couch_file:bytes(Fd), {ok, Stream2} = couch_stream:open(Fd), OneBits = <<1:(8*10)>>, etap:is(ok, couch_stream:write(Stream2, OneBits), "Successfully wrote 79 zero bits and 1 one bit."), ZeroBits = <<0:(8*10)>>, etap:is(ok, couch_stream:write(Stream2, ZeroBits), "Successfully wrote 80 0 bits."), {Ptrs2, Length2, _, _, _} = couch_stream:close(Stream2), etap:is(Ptrs2, [{ExpPtr, 20}], "Closing stream returns the file pointers."), etap:is(Length2, 20, "Length written is 160 bytes."), AllBits = iolist_to_binary([OneBits,ZeroBits]), etap:is(AllBits, read_all(Fd, Ptrs2), "Returned pointers are valid."), % Stream more the 4K chunk size. {ok, ExpPtr2} = couch_file:bytes(Fd), {ok, Stream3} = couch_stream:open(Fd, [{buffer_size, 4096}]), lists:foldl(fun(_, Acc) -> Data = <<"a1b2c">>, couch_stream:write(Stream3, Data), [Data | Acc] end, [], lists:seq(1, 1024)), {Ptrs3, Length3, _, _, _} = couch_stream:close(Stream3), % 4095 because of 5 * 4096 rem 5 (last write before exceeding threshold) % + 5 puts us over the threshold % + 4 bytes for the term_to_binary adding a length header % + 1 byte every 4K for tail append headers SecondPtr = ExpPtr2 + 4095 + 5 + 4 + 1, etap:is(Ptrs3, [{ExpPtr2, 4100}, {SecondPtr, 1020}], "Pointers every 4K bytes."), etap:is(Length3, 5120, "Wrote the expected 5K bytes."), couch_file:close(Fd), ok. apache-couchdb-1.6.0/test/etap/063-kt-get-leaves.t0000755000175000001440000000532112332105522021375 0ustar00djcusers00000000000000#!/usr/bin/env escript %% -*- erlang -*- % Licensed under the Apache License, Version 2.0 (the "License"); you may not % use this file except in compliance with the License. You may obtain a copy of % the License at % % http://www.apache.org/licenses/LICENSE-2.0 % % Unless required by applicable law or agreed to in writing, software % distributed under the License is distributed on an "AS IS" BASIS, WITHOUT % WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the % License for the specific language governing permissions and limitations under % the License. main(_) -> test_util:init_code_path(), etap:plan(11), case (catch test()) of ok -> etap:end_tests(); Other -> etap:diag(io_lib:format("Test died abnormally: ~p", [Other])), etap:bail(Other) end, ok. test() -> TwoChildSibs = [{0, {"1","foo", [{"1a", "bar", []}, {"1b", "bar", []}]}}], Stemmed = [{1, {"1a", "bar", [{"1aa", "bar", []}]}}], etap:is( {[{"foo", {0, ["1"]}}],[]}, couch_key_tree:get(TwoChildSibs, [{0, "1"}]), "extract a subtree." ), etap:is( {[{"bar", {1, ["1a", "1"]}}],[]}, couch_key_tree:get(TwoChildSibs, [{1, "1a"}]), "extract a subtree." ), etap:is( {[],[{0,"x"}]}, couch_key_tree:get_key_leafs(TwoChildSibs, [{0, "x"}]), "gather up the leaves." ), etap:is( {[{"bar", {1, ["1a","1"]}}],[]}, couch_key_tree:get_key_leafs(TwoChildSibs, [{1, "1a"}]), "gather up the leaves." ), etap:is( {[{"bar", {1, ["1a","1"]}},{"bar",{1, ["1b","1"]}}],[]}, couch_key_tree:get_key_leafs(TwoChildSibs, [{0, "1"}]), "gather up the leaves." ), etap:is( {[{0,[{"1", "foo"}]}],[]}, couch_key_tree:get_full_key_paths(TwoChildSibs, [{0, "1"}]), "retrieve full key paths." ), etap:is( {[{1,[{"1a", "bar"},{"1", "foo"}]}],[]}, couch_key_tree:get_full_key_paths(TwoChildSibs, [{1, "1a"}]), "retrieve full key paths." ), etap:is( [{2, [{"1aa", "bar"},{"1a", "bar"}]}], couch_key_tree:get_all_leafs_full(Stemmed), "retrieve all leaves." ), etap:is( [{1, [{"1a", "bar"},{"1", "foo"}]}, {1, [{"1b", "bar"},{"1", "foo"}]}], couch_key_tree:get_all_leafs_full(TwoChildSibs), "retrieve all the leaves." ), etap:is( [{"bar", {2, ["1aa","1a"]}}], couch_key_tree:get_all_leafs(Stemmed), "retrieve all leaves." ), etap:is( [{"bar", {1, ["1a", "1"]}}, {"bar", {1, ["1b","1"]}}], couch_key_tree:get_all_leafs(TwoChildSibs), "retrieve all the leaves." ), ok. apache-couchdb-1.6.0/test/etap/043-find-in-binary.t0000755000175000001440000000442612332105522021536 0ustar00djcusers00000000000000#!/usr/bin/env escript %% -*- erlang -*- % Licensed under the Apache License, Version 2.0 (the "License"); you may not % use this file except in compliance with the License. You may obtain a copy of % the License at % % http://www.apache.org/licenses/LICENSE-2.0 % % Unless required by applicable law or agreed to in writing, software % distributed under the License is distributed on an "AS IS" BASIS, WITHOUT % WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the % License for the specific language governing permissions and limitations under % the License. main(_) -> test_util:init_code_path(), etap:plan(length(cases())), case (catch test()) of ok -> etap:end_tests(); Other -> etap:diag(io_lib:format("Test died abnormally: ~p", [Other])), etap:bail(Other) end, ok. test() -> lists:foreach(fun({Needle, Haystack, Result}) -> try Msg = io_lib:format("Looking for ~s in ~s", [Needle, Haystack]), etap:is(couch_util:find_in_binary(Needle, Haystack), Result, Msg) catch _T:_R -> etap:diag("~p", [{_T, _R}]) end end, cases()), ok. cases() -> [ {<<"foo">>, <<"foobar">>, {exact, 0}}, {<<"foo">>, <<"foofoo">>, {exact, 0}}, {<<"foo">>, <<"barfoo">>, {exact, 3}}, {<<"foo">>, <<"barfo">>, {partial, 3}}, {<<"f">>, <<"fobarfff">>, {exact, 0}}, {<<"f">>, <<"obarfff">>, {exact, 4}}, {<<"f">>, <<"obarggf">>, {exact, 6}}, {<<"f">>, <<"f">>, {exact, 0}}, {<<"f">>, <<"g">>, not_found}, {<<"foo">>, <<"f">>, {partial, 0}}, {<<"foo">>, <<"g">>, not_found}, {<<"foo">>, <<"">>, not_found}, {<<"fofo">>, <<"foofo">>, {partial, 3}}, {<<"foo">>, <<"gfobarfo">>, {partial, 6}}, {<<"foo">>, <<"gfobarf">>, {partial, 6}}, {<<"foo">>, <<"gfobar">>, not_found}, {<<"fog">>, <<"gbarfogquiz">>, {exact, 4}}, {<<"ggg">>, <<"ggg">>, {exact, 0}}, {<<"ggg">>, <<"ggggg">>, {exact, 0}}, {<<"ggg">>, <<"bggg">>, {exact, 1}}, {<<"ggg">>, <<"bbgg">>, {partial, 2}}, {<<"ggg">>, <<"bbbg">>, {partial, 3}}, {<<"ggg">>, <<"bgbggbggg">>, {exact, 6}}, {<<"ggg">>, <<"bgbggb">>, not_found} ]. apache-couchdb-1.6.0/test/etap/064-kt-counting.t0000755000175000001440000000266612332105522021201 0ustar00djcusers00000000000000#!/usr/bin/env escript %% -*- erlang -*- % Licensed under the Apache License, Version 2.0 (the "License"); you may not % use this file except in compliance with the License. You may obtain a copy of % the License at % % http://www.apache.org/licenses/LICENSE-2.0 % % Unless required by applicable law or agreed to in writing, software % distributed under the License is distributed on an "AS IS" BASIS, WITHOUT % WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the % License for the specific language governing permissions and limitations under % the License. main(_) -> test_util:init_code_path(), etap:plan(4), case (catch test()) of ok -> etap:end_tests(); Other -> etap:diag(io_lib:format("Test died abnormally: ~p", [Other])), etap:bail(Other) end, ok. test() -> EmptyTree = [], One = [{0, {"1","foo",[]}}], TwoChildSibs = [{0, {"1","foo", [{"1a", "bar", []}, {"1b", "bar", []}]}}], Stemmed = [{2, {"1bb", "boo", []}}], etap:is(0, couch_key_tree:count_leafs(EmptyTree), "Empty trees have no leaves."), etap:is(1, couch_key_tree:count_leafs(One), "Single node trees have a single leaf."), etap:is(2, couch_key_tree:count_leafs(TwoChildSibs), "Two children siblings counted as two leaves."), etap:is(1, couch_key_tree:count_leafs(Stemmed), "Stemming does not affect leaf counting."), ok. apache-couchdb-1.6.0/test/etap/041-uuid-gen-id.ini0000644000175000001440000000150212332105522021336 0ustar00djcusers00000000000000; Licensed to the Apache Software Foundation (ASF) under one ; or more contributor license agreements. See the NOTICE file ; distributed with this work for additional information ; regarding copyright ownership. The ASF licenses this file ; to you under the Apache License, Version 2.0 (the ; "License"); you may not use this file except in compliance ; with the License. You may obtain a copy of the License at ; ; http://www.apache.org/licenses/LICENSE-2.0 ; ; Unless required by applicable law or agreed to in writing, ; software distributed under the License is distributed on an ; "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY ; KIND, either express or implied. See the License for the ; specific language governing permissions and limitations ; under the License. [uuids] algorithm = utc_id utc_id_suffix = bozo apache-couchdb-1.6.0/test/etap/002-icu-driver.t0000755000175000001440000000202112332105522020761 0ustar00djcusers00000000000000#!/usr/bin/env escript % Licensed under the Apache License, Version 2.0 (the "License"); you may not % use this file except in compliance with the License. You may obtain a copy of % the License at % % http://www.apache.org/licenses/LICENSE-2.0 % % Unless required by applicable law or agreed to in writing, software % distributed under the License is distributed on an "AS IS" BASIS, WITHOUT % WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the % License for the specific language governing permissions and limitations under % the License. main(_) -> test_util:init_code_path(), couch_config:start_link(test_util:config_files()), etap:plan(3), etap:is( element(1, couch_drv:start_link()), ok, "Started couch_icu_driver." ), etap:is( couch_util:collate(<<"foo">>, <<"bar">>), 1, "Can collate stuff" ), etap:is( couch_util:collate(<<"A">>, <<"aa">>), -1, "Collate's non-ascii style." ), etap:end_tests(). apache-couchdb-1.6.0/test/etap/001-load.t0000755000175000001440000000362012332105522017634 0ustar00djcusers00000000000000#!/usr/bin/env escript %% -*- erlang -*- % Licensed under the Apache License, Version 2.0 (the "License"); you may not % use this file except in compliance with the License. You may obtain a copy of % the License at % % http://www.apache.org/licenses/LICENSE-2.0 % % Unless required by applicable law or agreed to in writing, software % distributed under the License is distributed on an "AS IS" BASIS, WITHOUT % WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the % License for the specific language governing permissions and limitations under % the License. % Test that we can load each module. main(_) -> test_util:init_code_path(), Modules = [ couch_auth_cache, couch_btree, couch_changes, couch_compress, couch_config, couch_config_writer, couch_db, couch_db_update_notifier, couch_db_update_notifier_sup, couch_db_updater, couch_doc, % Fails unless couch_config gen_server is started. % couch_ejson_compare, couch_event_sup, couch_external_manager, couch_external_server, couch_file, couch_httpd, couch_httpd_db, couch_httpd_external, couch_httpd_misc_handlers, couch_httpd_rewrite, couch_httpd_stats_handlers, couch_key_tree, couch_log, couch_os_process, couch_query_servers, couch_ref_counter, couch_server, couch_server_sup, couch_stats_aggregator, couch_stats_collector, couch_stream, couch_task_status, couch_util, couch_work_queue, json_stream_parse ], etap:plan(length(Modules)), lists:foreach( fun(Module) -> etap:loaded_ok( Module, lists:concat(["Loaded: ", Module]) ) end, Modules), etap:end_tests(). apache-couchdb-1.6.0/test/etap/121-stats-aggregates.t0000755000175000001440000001275212332105522022173 0ustar00djcusers00000000000000#!/usr/bin/env escript %% -*- erlang -*- % Licensed under the Apache License, Version 2.0 (the "License"); you may not % use this file except in compliance with the License. You may obtain a copy of % the License at % % http://www.apache.org/licenses/LICENSE-2.0 % % Unless required by applicable law or agreed to in writing, software % distributed under the License is distributed on an "AS IS" BASIS, WITHOUT % WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the % License for the specific language governing permissions and limitations under % the License. ini_file() -> test_util:source_file("test/etap/121-stats-aggregates.ini"). cfg_file() -> test_util:source_file("test/etap/121-stats-aggregates.cfg"). main(_) -> test_util:init_code_path(), etap:plan(17), case (catch test()) of ok -> etap:end_tests(); Other -> etap:diag(io_lib:format("Test died abnormally: ~p", [Other])), etap:bail() end, ok. test() -> couch_config:start_link([ini_file()]), couch_stats_collector:start(), couch_stats_aggregator:start(cfg_file()), ok = test_all_empty(), ok = test_get_empty(), ok = test_count_stats(), ok = test_abs_stats(), ok. test_all_empty() -> {Aggs} = couch_stats_aggregator:all(), etap:is(length(Aggs), 2, "There are only two aggregate types in testing."), etap:is( couch_util:get_value(testing, Aggs), {[{stuff, make_agg(<<"yay description">>, null, null, null, null, null)}]}, "{testing, stuff} is empty at start." ), etap:is( couch_util:get_value(number, Aggs), {[{'11', make_agg(<<"randomosity">>, null, null, null, null, null)}]}, "{number, '11'} is empty at start." ), ok. test_get_empty() -> etap:is( couch_stats_aggregator:get_json({testing, stuff}), make_agg(<<"yay description">>, null, null, null, null, null), "Getting {testing, stuff} returns an empty aggregate." ), etap:is( couch_stats_aggregator:get_json({number, '11'}), make_agg(<<"randomosity">>, null, null, null, null, null), "Getting {number, '11'} returns an empty aggregate." ), ok. test_count_stats() -> lists:foreach(fun(_) -> couch_stats_collector:increment({testing, stuff}) end, lists:seq(1, 100)), couch_stats_aggregator:collect_sample(), etap:is( couch_stats_aggregator:get_json({testing, stuff}), make_agg(<<"yay description">>, 100, 100, null, 100, 100), "COUNT: Adding values changes the stats." ), etap:is( couch_stats_aggregator:get_json({testing, stuff}, 1), make_agg(<<"yay description">>, 100, 100, null, 100, 100), "COUNT: Adding values changes stats for all times." ), timer:sleep(500), couch_stats_aggregator:collect_sample(), etap:is( couch_stats_aggregator:get_json({testing, stuff}), make_agg(<<"yay description">>, 100, 50, 70.711, 0, 100), "COUNT: Removing values changes stats." ), etap:is( couch_stats_aggregator:get_json({testing, stuff}, 1), make_agg(<<"yay description">>, 100, 50, 70.711, 0, 100), "COUNT: Removing values changes stats for all times." ), timer:sleep(600), couch_stats_aggregator:collect_sample(), etap:is( couch_stats_aggregator:get_json({testing, stuff}), make_agg(<<"yay description">>, 100, 33.333, 57.735, 0, 100), "COUNT: Letting time passes doesn't remove data from time 0 aggregates" ), etap:is( couch_stats_aggregator:get_json({testing, stuff}, 1), make_agg(<<"yay description">>, 0, 0, 0, 0, 0), "COUNT: Letting time pass removes data from other time aggregates." ), ok. test_abs_stats() -> lists:foreach(fun(X) -> couch_stats_collector:record({number, 11}, X) end, lists:seq(0, 10)), couch_stats_aggregator:collect_sample(), etap:is( couch_stats_aggregator:get_json({number, 11}), make_agg(<<"randomosity">>, 5, 5, null, 5, 5), "ABS: Adding values changes the stats." ), etap:is( couch_stats_aggregator:get_json({number, 11}, 1), make_agg(<<"randomosity">>, 5, 5, null, 5, 5), "ABS: Adding values changes stats for all times." ), timer:sleep(500), couch_stats_collector:record({number, 11}, 15), couch_stats_aggregator:collect_sample(), etap:is( couch_stats_aggregator:get_json({number, 11}), make_agg(<<"randomosity">>, 20, 10, 7.071, 5, 15), "ABS: New values changes stats" ), etap:is( couch_stats_aggregator:get_json({number, 11}, 1), make_agg(<<"randomosity">>, 20, 10, 7.071, 5, 15), "ABS: Removing values changes stats for all times." ), timer:sleep(600), couch_stats_aggregator:collect_sample(), etap:is( couch_stats_aggregator:get_json({number, 11}), make_agg(<<"randomosity">>, 20, 10, 7.071, 5, 15), "ABS: Letting time passes doesn't remove data from time 0 aggregates" ), etap:is( couch_stats_aggregator:get_json({number, 11}, 1), make_agg(<<"randomosity">>, 15, 15, null, 15, 15), "ABS: Letting time pass removes data from other time aggregates." ), ok. make_agg(Desc, Sum, Mean, StdDev, Min, Max) -> {[ {description, Desc}, {current, Sum}, {sum, Sum}, {mean, Mean}, {stddev, StdDev}, {min, Min}, {max, Max} ]}. apache-couchdb-1.6.0/test/etap/121-stats-aggregates.cfg0000644000175000001440000000152712332105522022462 0ustar00djcusers00000000000000% Licensed to the Apache Software Foundation (ASF) under one % or more contributor license agreements. See the NOTICE file % distributed with this work for additional information % regarding copyright ownership. The ASF licenses this file % to you under the Apache License, Version 2.0 (the % "License"); you may not use this file except in compliance % with the License. You may obtain a copy of the License at % % http://www.apache.org/licenses/LICENSE-2.0 % % Unless required by applicable law or agreed to in writing, % software distributed under the License is distributed on an % "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY % KIND, either express or implied. See the License for the % specific language governing permissions and limitations % under the License. {testing, stuff, "yay description"}. {number, '11', "randomosity"}. apache-couchdb-1.6.0/test/etap/121-stats-aggregates.ini0000644000175000001440000000154012332105522022475 0ustar00djcusers00000000000000; Licensed to the Apache Software Foundation (ASF) under one ; or more contributor license agreements. See the NOTICE file ; distributed with this work for additional information ; regarding copyright ownership. The ASF licenses this file ; to you under the Apache License, Version 2.0 (the ; "License"); you may not use this file except in compliance ; with the License. You may obtain a copy of the License at ; ; http://www.apache.org/licenses/LICENSE-2.0 ; ; Unless required by applicable law or agreed to in writing, ; software distributed under the License is distributed on an ; "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY ; KIND, either express or implied. See the License for the ; specific language governing permissions and limitations ; under the License. [stats] rate = 10000000 ; We call collect_sample in testing samples = [0, 1] apache-couchdb-1.6.0/test/etap/060-kt-merging.t0000755000175000001440000001231112332105522020763 0ustar00djcusers00000000000000#!/usr/bin/env escript %% -*- erlang -*- % Licensed under the Apache License, Version 2.0 (the "License"); you may not % use this file except in compliance with the License. You may obtain a copy of % the License at % % http://www.apache.org/licenses/LICENSE-2.0 % % Unless required by applicable law or agreed to in writing, software % distributed under the License is distributed on an "AS IS" BASIS, WITHOUT % WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the % License for the specific language governing permissions and limitations under % the License. main(_) -> test_util:init_code_path(), etap:plan(16), case (catch test()) of ok -> etap:end_tests(); Other -> etap:diag(io_lib:format("Test died abnormally: ~p", [Other])), etap:bail(Other) end, ok. test() -> One = {1, {"1","foo",[]}}, etap:is( {[One], no_conflicts}, couch_key_tree:merge([], One, 10), "The empty tree is the identity for merge." ), etap:is( {[One], no_conflicts}, couch_key_tree:merge([One], One, 10), "Merging is reflexive." ), TwoSibs = [{1, {"1","foo",[]}}, {1, {"2","foo",[]}}], etap:is( {TwoSibs, no_conflicts}, couch_key_tree:merge(TwoSibs, One, 10), "Merging a prefix of a tree with the tree yields the tree." ), Three = {1, {"3","foo",[]}}, ThreeSibs = [{1, {"1","foo",[]}}, {1, {"2","foo",[]}}, {1, {"3","foo",[]}}], etap:is( {ThreeSibs, conflicts}, couch_key_tree:merge(TwoSibs, Three, 10), "Merging a third unrelated branch leads to a conflict." ), TwoChild = {1, {"1","foo", [{"1a", "bar", [{"1aa", "bar", []}]}]}}, etap:is( {[TwoChild], no_conflicts}, couch_key_tree:merge([TwoChild], TwoChild, 10), "Merging two children is still reflexive." ), TwoChildSibs = {1, {"1","foo", [{"1a", "bar", []}, {"1b", "bar", []}]}}, etap:is( {[TwoChildSibs], no_conflicts}, couch_key_tree:merge([TwoChildSibs], TwoChildSibs, 10), "Merging a tree to itself is itself."), TwoChildPlusSibs = {1, {"1","foo", [{"1a", "bar", [{"1aa", "bar", []}]}, {"1b", "bar", []}]}}, etap:is( {[TwoChildPlusSibs], no_conflicts}, couch_key_tree:merge([TwoChild], TwoChildSibs, 10), "Merging tree of uneven length at node 2."), Stemmed1b = {2, {"1a", "bar", []}}, etap:is( {[TwoChildSibs], no_conflicts}, couch_key_tree:merge([TwoChildSibs], Stemmed1b, 10), "Merging a tree with a stem." ), TwoChildSibs2 = {1, {"1","foo", [{"1a", "bar", []}, {"1b", "bar", [{"1bb", "boo", []}]}]}}, Stemmed1bb = {3, {"1bb", "boo", []}}, etap:is( {[TwoChildSibs2], no_conflicts}, couch_key_tree:merge([TwoChildSibs2], Stemmed1bb, 10), "Merging a stem at a deeper level." ), StemmedTwoChildSibs2 = [{2,{"1a", "bar", []}}, {2,{"1b", "bar", [{"1bb", "boo", []}]}}], etap:is( {StemmedTwoChildSibs2, no_conflicts}, couch_key_tree:merge(StemmedTwoChildSibs2, Stemmed1bb, 10), "Merging a stem at a deeper level against paths at deeper levels." ), Stemmed1aa = {3, {"1aa", "bar", []}}, etap:is( {[TwoChild], no_conflicts}, couch_key_tree:merge([TwoChild], Stemmed1aa, 10), "Merging a single tree with a deeper stem." ), Stemmed1a = {2, {"1a", "bar", [{"1aa", "bar", []}]}}, etap:is( {[TwoChild], no_conflicts}, couch_key_tree:merge([TwoChild], Stemmed1a, 10), "Merging a larger stem." ), etap:is( {[Stemmed1a], no_conflicts}, couch_key_tree:merge([Stemmed1a], Stemmed1aa, 10), "More merging." ), OneChild = {1, {"1","foo",[{"1a", "bar", []}]}}, Expect1 = [OneChild, Stemmed1aa], etap:is( {Expect1, conflicts}, couch_key_tree:merge([OneChild], Stemmed1aa, 10), "Merging should create conflicts." ), etap:is( {[TwoChild], no_conflicts}, couch_key_tree:merge(Expect1, TwoChild, 10), "Merge should have no conflicts." ), %% this test is based on couch-902-test-case2.py %% foo has conflicts from replication at depth two %% foo3 is the current value Foo = {1, {"foo", "val1", [{"foo2","val2",[]}, {"foo3", "val3", []} ]}}, %% foo now has an attachment added, which leads to foo4 and val4 %% off foo3 Bar = {1, {"foo", [], [{"foo3", [], [{"foo4","val4",[]} ]}]}}, %% this is what the merge returns %% note that it ignore the conflicting branch as there's no match FooBar = {1, {"foo", "val1", [{"foo2","val2",[]}, {"foo3", "val3", [{"foo4","val4",[]}]} ]}}, etap:is( {[FooBar], no_conflicts}, couch_key_tree:merge([Foo],Bar,10), "Merging trees with conflicts ought to behave." ), ok. apache-couchdb-1.6.0/test/etap/231-cors.t0000644000175000001440000003657212332105522017701 0ustar00djcusers00000000000000#!/usr/bin/env escript %% -*- erlang -*- % Licensed under the Apache License, Version 2.0 (the "License"); you may not % use this file except in compliance with the License. You may obtain a copy of % the License at % % http://www.apache.org/licenses/LICENSE-2.0 % % Unless required by applicable law or agreed to in writing, software % distributed under the License is distributed on an "AS IS" BASIS, WITHOUT % WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the % License for the specific language governing permissions and limitations under % the License. -record(user_ctx, { name = null, roles = [], handler }). -define(SUPPORTED_METHODS, "GET, HEAD, POST, PUT, DELETE, TRACE, CONNECT, COPY, OPTIONS"). server() -> lists:concat([ "http://127.0.0.1:", mochiweb_socket_server:get(couch_httpd, port), "/" ]). main(_) -> test_util:init_code_path(), etap:plan(29), case (catch test()) of ok -> etap:end_tests(); Other -> etap:diag(io_lib:format("Test died abnormally: ~p", [Other])), etap:bail(Other) end, ok. dbname() -> "etap-test-db". dbname1() -> "etap-test-db1". dbname2() -> "etap-test-db2". admin_user_ctx() -> {user_ctx, #user_ctx{roles=[<<"_admin">>]}}. set_admin_password(UserName, Password) -> Hashed = couch_passwords:hash_admin_password(Password), couch_config:set("admins", UserName, Hashed, false). cycle_db(DbName) -> couch_server:delete(list_to_binary(DbName), [admin_user_ctx()]), {ok, Db} = couch_db:create(list_to_binary(DbName), [admin_user_ctx()]), Db. test() -> %% launch couchdb couch_server_sup:start_link(test_util:config_files()), %% initialize db timer:sleep(1000), Db = cycle_db(dbname()), Db1 = cycle_db(dbname1()), Db2 = cycle_db(dbname2()), % CORS is disabled by default test_no_headers_server(), test_no_headers_db(), % Now enable CORS ok = couch_config:set("httpd", "enable_cors", "true", false), ok = couch_config:set("cors", "origins", "http://example.com", false), %% do tests test_incorrect_origin_simple_request(), test_incorrect_origin_preflight_request(), test_preflight_request(), test_db_request(), test_doc_with_attachment_request(), test_doc_with_attachment_range_request(), test_db_preflight_request(), test_db1_origin_request(), test_preflight_with_port1(), test_preflight_with_scheme1(), test_if_none_match_header(), ok = couch_config:set("cors", "origins", "http://example.com:5984", false), test_preflight_with_port2(), ok = couch_config:set("cors", "origins", "https://example.com:5984", false), test_preflight_with_scheme2(), ok = couch_config:set("cors", "origins", "*", false), test_preflight_with_wildcard(), ok = couch_config:set("cors", "origins", "http://example.com", false), test_case_sensitive_mismatch_of_allowed_origins(), % http://www.w3.org/TR/cors/#supports-credentials % 6.1.3 % If the resource supports credentials add a single % Access-Control-Allow-Origin header, with the value % of the Origin header as value, and add a single % Access-Control-Allow-Credentials header with the % case-sensitive string "true" as value. % Otherwise, add a single Access-Control-Allow-Origin % header, with either the value of the Origin header % or the string "*" as value. % Note: The string "*" cannot be used for a resource % that supports credentials. test_db_request_credentials_header_off(), ok = couch_config:set("cors", "credentials", "true", false), test_db_request_credentials_header_on(), % We don’t test wildcards & credentials as that would % fall into the realm of validating config values % which we don’t do at all yet % test with vhosts ok = couch_config:set("vhosts", "example.com", "/", false), test_preflight_request(true), test_db_request(true), test_db_preflight_request(true), test_db1_origin_request(true), test_preflight_with_port1(true), test_preflight_with_scheme1(true), % TBD % test multiple per-host configuration %% do tests with auth ok = set_admin_password("test", <<"test">>), test_db_preflight_auth_request(), test_db_origin_auth_request(), %% restart boilerplate catch couch_db:close(Db), catch couch_db:close(Db1), catch couch_db:close(Db2), couch_server:delete(list_to_binary(dbname()), [admin_user_ctx()]), couch_server:delete(list_to_binary(dbname1()), [admin_user_ctx()]), couch_server:delete(list_to_binary(dbname2()), [admin_user_ctx()]), timer:sleep(3000), couch_server_sup:stop(), ok. test_preflight_request() -> test_preflight_request(false). test_db_request() -> test_db_request(false). test_db_preflight_request() -> test_db_preflight_request(false). test_db1_origin_request() -> test_db1_origin_request(false). test_preflight_with_port1() -> test_preflight_with_port1(false). test_preflight_with_scheme1() -> test_preflight_with_scheme1(false). %% Cors is disabled, should not return Access-Control-Allow-Origin test_no_headers_server() -> Headers = [{"Origin", "http://127.0.0.1"}], {ok, _, Resp, _} = ibrowse:send_req(server(), Headers, get, []), etap:is(proplists:get_value("Access-Control-Allow-Origin", Resp), undefined, "No CORS Headers when disabled"). %% Cors is disabled, should not return Access-Control-Allow-Origin test_no_headers_db() -> Headers = [{"Origin", "http://127.0.0.1"}], Url = server() ++ "etap-test-db", {ok, _, Resp, _} = ibrowse:send_req(Url, Headers, get, []), etap:is(proplists:get_value("Access-Control-Allow-Origin", Resp), undefined, "No CORS Headers when disabled"). test_incorrect_origin_simple_request() -> Headers = [{"Origin", "http://127.0.0.1"}], {ok, _, RespHeaders, _} = ibrowse:send_req(server(), Headers, get, []), etap:is(proplists:get_value("Access-Control-Allow-Origin", RespHeaders), undefined, "Specified invalid origin, no Access"). test_incorrect_origin_preflight_request() -> Headers = [{"Origin", "http://127.0.0.1"}, {"Access-Control-Request-Method", "GET"}], {ok, _, RespHeaders, _} = ibrowse:send_req(server(), Headers, options, []), etap:is(proplists:get_value("Access-Control-Allow-Origin", RespHeaders), undefined, "invalid origin"). test_preflight_request(VHost) -> Headers = [{"Origin", "http://example.com"}, {"Access-Control-Request-Method", "GET"}] ++ maybe_append_vhost(VHost), case ibrowse:send_req(server(), Headers, options, []) of {ok, _, RespHeaders, _} -> etap:is(proplists:get_value("Access-Control-Allow-Methods", RespHeaders), ?SUPPORTED_METHODS, "test_preflight_request Access-Control-Allow-Methods ok"); _ -> etap:is(false, true, "ibrowse failed") end. test_db_request(VHost) -> Headers = [{"Origin", "http://example.com"}] ++ maybe_append_vhost(VHost), Url = server() ++ "etap-test-db", case ibrowse:send_req(Url, Headers, get, []) of {ok, _, RespHeaders, _Body} -> etap:is(proplists:get_value("Access-Control-Allow-Origin", RespHeaders), "http://example.com", "db Access-Control-Allow-Origin ok"), etap:is(proplists:get_value("Access-Control-Expose-Headers", RespHeaders), "Cache-Control, Content-Type, Server", "db Access-Control-Expose-Headers ok"); _ -> etap:is(false, true, "ibrowse failed") end. % COUCHDB-1689 test_doc_with_attachment_request() -> DocUrl = server() ++ "etap-test-db/doc1", ibrowse:send_req(DocUrl ++ "/attachment.txt", [{"Content-Type", "text/plain"}], put, "this is a text attachment"), Headers = [{"Origin", "http://example.com"}], Url = DocUrl ++ "?attachments=true", case ibrowse:send_req(Url, Headers, get, []) of {ok, Code, _RespHeaders, _Body} -> etap:is(Code, "200", "Response without errors"); _ -> etap:is(false, true, "ibrowse failed") end. % COUCHDB-1689 test_doc_with_attachment_range_request() -> AttachmentUrl = server() ++ "etap-test-db/doc2/attachment.bin", % Use a Content-Type that doesn't get compressed ibrowse:send_req(AttachmentUrl, [{"Content-Type", "application/octet-stream"}], put, "this is an attachment"), Headers = [{"Origin", "http://example.com"}, {"Range", "bytes=0-6"}], case ibrowse:send_req(AttachmentUrl, Headers, get, []) of {ok, Code, _RespHeaders, _Body} -> etap:is(Code, "206", "Response without errors"); _ -> etap:is(false, true, "ibrowse failed") end. % COUCHDB-1697 test_if_none_match_header() -> Url = server() ++ "etap-test-db/doc2", Headers = [{"Origin", "http://example.com"}], {ok, _, _RespHeaders, _} = ibrowse:send_req(Url, Headers, get, []), ETag = proplists:get_value("ETag", _RespHeaders), Headers2 = [{"Origin", "http://example.com"}, {"If-None-Match", ETag}], case ibrowse:send_req(Url, Headers2, get, []) of {ok, Code, _RespHeaders2, _} -> etap:is(Code, "304", "Responded with Not Modified"); _ -> etap:is(false, true, "ibrowse failed") end. test_db_request_credentials_header_off() -> Headers = [{"Origin", "http://example.com"}], Url = server() ++ "etap-test-db", case ibrowse:send_req(Url, Headers, get, []) of {ok, _, RespHeaders, _Body} -> etap:is(proplists:get_value("Access-Control-Allow-Credentials", RespHeaders), undefined, "db Access-Control-Allow-Credentials off"); _ -> etap:is(false, true, "ibrowse failed") end. test_db_request_credentials_header_on() -> Headers = [{"Origin", "http://example.com"}], Url = server() ++ "etap-test-db", case ibrowse:send_req(Url, Headers, get, []) of {ok, _, RespHeaders, _Body} -> etap:is(proplists:get_value("Access-Control-Allow-Credentials", RespHeaders), "true", "db Access-Control-Allow-Credentials ok"); _ -> etap:is(false, true, "ibrowse failed") end. test_db_preflight_request(VHost) -> Url = server() ++ "etap-test-db", Headers = [{"Origin", "http://example.com"}, {"Access-Control-Request-Method", "GET"}] ++ maybe_append_vhost(VHost), case ibrowse:send_req(Url, Headers, options, []) of {ok, _, RespHeaders, _} -> etap:is(proplists:get_value("Access-Control-Allow-Methods", RespHeaders), ?SUPPORTED_METHODS, "db Access-Control-Allow-Methods ok"); _ -> etap:is(false, true, "ibrowse failed") end. test_db1_origin_request(VHost) -> Headers = [{"Origin", "http://example.com"}] ++ maybe_append_vhost(VHost), Url = server() ++ "etap-test-db1", case ibrowse:send_req(Url, Headers, get, [], [{host_header, "example.com"}]) of {ok, _, RespHeaders, _Body} -> etap:is(proplists:get_value("Access-Control-Allow-Origin", RespHeaders), "http://example.com", "db origin ok"); _Else -> io:format("else ~p~n", [_Else]), etap:is(false, true, "ibrowse failed") end. test_db_preflight_auth_request() -> Url = server() ++ "etap-test-db2", Headers = [{"Origin", "http://example.com"}, {"Access-Control-Request-Method", "GET"}], case ibrowse:send_req(Url, Headers, options, []) of {ok, _Status, RespHeaders, _} -> etap:is(proplists:get_value("Access-Control-Allow-Methods", RespHeaders), ?SUPPORTED_METHODS, "db Access-Control-Allow-Methods ok"); _ -> etap:is(false, true, "ibrowse failed") end. test_db_origin_auth_request() -> Headers = [{"Origin", "http://example.com"}], Url = server() ++ "etap-test-db2", case ibrowse:send_req(Url, Headers, get, [], [{basic_auth, {"test", "test"}}]) of {ok, _, RespHeaders, _Body} -> etap:is(proplists:get_value("Access-Control-Allow-Origin", RespHeaders), "http://example.com", "db origin ok"); _ -> etap:is(false, true, "ibrowse failed") end. test_preflight_with_wildcard() -> Headers = [{"Origin", "http://example.com"}, {"Access-Control-Request-Method", "GET"}], case ibrowse:send_req(server(), Headers, options, []) of {ok, _, RespHeaders, _} -> % I would either expect the current origin or a wildcard to be returned etap:is(proplists:get_value("Access-Control-Allow-Origin", RespHeaders), "http://example.com", "db origin ok"); _ -> etap:is(false, true, "ibrowse failed") end. test_preflight_with_port1(VHost) -> Headers = [{"Origin", "http://example.com:5984"}, {"Access-Control-Request-Method", "GET"}] ++ maybe_append_vhost(VHost), case ibrowse:send_req(server(), Headers, options, []) of {ok, _, RespHeaders, _} -> % I would either expect the current origin or a wildcard to be returned etap:is(proplists:get_value("Access-Control-Allow-Origin", RespHeaders), undefined, "check non defined host:port in origin ok"); _ -> etap:is(false, true, "ibrowse failed") end. test_preflight_with_port2() -> Headers = [{"Origin", "http://example.com:5984"}, {"Access-Control-Request-Method", "GET"}], case ibrowse:send_req(server(), Headers, options, []) of {ok, _, RespHeaders, _} -> % I would either expect the current origin or a wildcard to be returned etap:is(proplists:get_value("Access-Control-Allow-Origin", RespHeaders), "http://example.com:5984", "check host:port in origin ok"); _ -> etap:is(false, true, "ibrowse failed") end. test_preflight_with_scheme1(VHost) -> Headers = [{"Origin", "https://example.com:5984"}, {"Access-Control-Request-Method", "GET"}] ++ maybe_append_vhost(VHost), case ibrowse:send_req(server(), Headers, options, []) of {ok, _, RespHeaders, _} -> % I would either expect the current origin or a wildcard to be returned etap:is(proplists:get_value("Access-Control-Allow-Origin", RespHeaders), undefined, "check non defined scheme in origin ok"); _ -> etap:is(false, true, "ibrowse failed") end. test_preflight_with_scheme2() -> Headers = [{"Origin", "https://example.com:5984"}, {"Access-Control-Request-Method", "GET"}], case ibrowse:send_req(server(), Headers, options, []) of {ok, _, RespHeaders, _} -> % I would either expect the current origin or a wildcard to be returned etap:is(proplists:get_value("Access-Control-Allow-Origin", RespHeaders), "https://example.com:5984", "check scheme in origin ok"); _ -> etap:is(false, true, "ibrowse failed") end. test_case_sensitive_mismatch_of_allowed_origins() -> Headers = [{"Origin", "http://EXAMPLE.COM"}], Url = server() ++ "etap-test-db", case ibrowse:send_req(Url, Headers, get, []) of {ok, _, RespHeaders, _Body} -> etap:is(proplists:get_value("Access-Control-Allow-Origin", RespHeaders), undefined, "db access config case mismatch"); _ -> etap:is(false, true, "ibrowse failed") end. maybe_append_vhost(true) -> [{"Host", "http://example.com"}]; maybe_append_vhost(Else) -> []. apache-couchdb-1.6.0/test/etap/Makefile.am0000644000175000001440000000563712332105522020275 0ustar00djcusers00000000000000## Licensed under the Apache License, Version 2.0 (the "License"); you may not ## use this file except in compliance with the License. You may obtain a copy of ## the License at ## ## http://www.apache.org/licenses/LICENSE-2.0 ## ## Unless required by applicable law or agreed to in writing, software ## distributed under the License is distributed on an "AS IS" BASIS, WITHOUT ## WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the ## License for the specific language governing permissions and limitations under ## the License. noinst_SCRIPTS = run noinst_DATA = test_util.beam test_web.beam noinst_PROGRAMS = test_cfg_register test_cfg_register_SOURCES = test_cfg_register.c test_cfg_register_CFLAGS = -D_BSD_SOURCE %.beam: %.erl $(ERLC) $< run: run.tpl sed -e "s|%abs_top_srcdir%|@abs_top_srcdir@|g" \ -e "s|%abs_top_builddir%|@abs_top_builddir@|g" > \ $@ < $< chmod +x $@ # @@ wildcards are NOT portable, please replace with clean-local rules CLEANFILES = run *.beam DISTCLEANFILES = temp.* fixture_files = \ fixtures/3b835456c235b1827e012e25666152f3.view \ fixtures/test.couch tap_files = \ 001-load.t \ 002-icu-driver.t \ 010-file-basics.t \ 011-file-headers.t \ 020-btree-basics.t \ 021-btree-reductions.t \ 030-doc-from-json.t \ 031-doc-to-json.t \ 040-util.t \ 041-uuid-gen-id.ini \ 041-uuid-gen-seq.ini \ 041-uuid-gen-utc.ini \ 041-uuid-gen.t \ 042-work-queue.t \ 043-find-in-binary.t \ 050-stream.t \ 060-kt-merging.t \ 061-kt-missing-leaves.t \ 062-kt-remove-leaves.t \ 063-kt-get-leaves.t \ 064-kt-counting.t \ 065-kt-stemming.t \ 070-couch-db.t \ 072-cleanup.t \ 073-changes.t \ 074-doc-update-conflicts.t \ 075-auth-cache.t \ 076-file-compression.t \ 077-couch-db-fast-db-delete-create.t \ 080-config-get-set.t \ 081-config-override.1.ini \ 081-config-override.2.ini \ 081-config-override.t \ 082-config-register.t \ 083-config-no-files.t \ 090-task-status.t \ 100-ref-counter.t \ 120-stats-collect.t \ 121-stats-aggregates.cfg \ 121-stats-aggregates.ini \ 121-stats-aggregates.t \ 130-attachments-md5.t \ 140-attachment-comp.t \ 150-invalid-view-seq.t \ 160-vhosts.t \ 170-os-daemons.es \ 170-os-daemons.t \ 171-os-daemons-config.es \ 171-os-daemons-config.t \ 172-os-daemon-errors.1.sh \ 172-os-daemon-errors.2.sh \ 172-os-daemon-errors.3.sh \ 172-os-daemon-errors.4.sh \ 172-os-daemon-errors.t \ 173-os-daemon-cfg-register.t \ 180-http-proxy.ini \ 180-http-proxy.t \ 190-json-stream-parse.t \ 200-view-group-no-db-leaks.t \ 201-view-group-shutdown.t \ 210-os-proc-pool.t \ 220-compaction-daemon.t \ 230-pbkfd2.t \ 231-cors.t \ 250-upgrade-legacy-view-files.t EXTRA_DIST = \ run.tpl \ test_web.erl \ $(fixture_files) \ $(tap_files) apache-couchdb-1.6.0/test/etap/Makefile.in0000644000175000001440000005335412332105553020311 0ustar00djcusers00000000000000# Makefile.in generated by automake 1.11.6 from Makefile.am. # @configure_input@ # Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, # 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011 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__make_dryrun = \ { \ am__dry=no; \ case $$MAKEFLAGS in \ *\\[\ \ ]*) \ echo 'am--echo: ; @echo "AM" OK' | $(MAKE) -f - 2>/dev/null \ | grep '^AM OK$$' >/dev/null || am__dry=yes;; \ *) \ for am__flg in $$MAKEFLAGS; do \ case $$am__flg in \ *=*|--*) ;; \ *n*) am__dry=yes; break;; \ esac; \ done;; \ esac; \ test $$am__dry = yes; \ } 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 = test_cfg_register$(EXEEXT) subdir = test/etap DIST_COMMON = $(srcdir)/Makefile.am $(srcdir)/Makefile.in \ $(srcdir)/test_util.erl.in ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 am__aclocal_m4_deps = $(top_srcdir)/m4/libtool.m4 \ $(top_srcdir)/m4/ltoptions.m4 $(top_srcdir)/m4/ltsugar.m4 \ $(top_srcdir)/m4/ltversion.m4 $(top_srcdir)/m4/lt~obsolete.m4 \ $(top_srcdir)/acinclude.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 \ $(top_builddir)/src/snappy/google-snappy/config.h CONFIG_CLEAN_FILES = test_util.erl CONFIG_CLEAN_VPATH_FILES = PROGRAMS = $(noinst_PROGRAMS) am_test_cfg_register_OBJECTS = \ test_cfg_register-test_cfg_register.$(OBJEXT) test_cfg_register_OBJECTS = $(am_test_cfg_register_OBJECTS) test_cfg_register_LDADD = $(LDADD) test_cfg_register_LINK = $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) \ $(LIBTOOLFLAGS) --mode=link $(CCLD) \ $(test_cfg_register_CFLAGS) $(CFLAGS) $(AM_LDFLAGS) $(LDFLAGS) \ -o $@ SCRIPTS = $(noinst_SCRIPTS) DEFAULT_INCLUDES = -I.@am__isrc@ -I$(top_builddir) -I$(top_builddir)/src/snappy/google-snappy depcomp = $(SHELL) $(top_srcdir)/build-aux/depcomp am__depfiles_maybe = depfiles am__mv = mv -f COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \ $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) LTCOMPILE = $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) \ --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) \ $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) CCLD = $(CC) LINK = $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) \ --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) $(AM_LDFLAGS) \ $(LDFLAGS) -o $@ SOURCES = $(test_cfg_register_SOURCES) DIST_SOURCES = $(test_cfg_register_SOURCES) am__can_run_installinfo = \ case $$AM_UPDATE_INFO_DIR in \ n|no|NO) false;; \ *) (install-info --version) >/dev/null 2>&1;; \ esac DATA = $(noinst_DATA) ETAGS = etags CTAGS = ctags DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) ACLOCAL = @ACLOCAL@ AMTAR = @AMTAR@ AR = @AR@ AS = @AS@ AUTOCONF = @AUTOCONF@ AUTOHEADER = @AUTOHEADER@ AUTOMAKE = @AUTOMAKE@ AWK = @AWK@ CC = @CC@ CCDEPMODE = @CCDEPMODE@ CFLAGS = @CFLAGS@ CPP = @CPP@ CPPFLAGS = @CPPFLAGS@ CURL_CFLAGS = @CURL_CFLAGS@ CURL_CONFIG = @CURL_CONFIG@ CURL_LIBS = @CURL_LIBS@ CXX = @CXX@ CXXCPP = @CXXCPP@ CXXDEPMODE = @CXXDEPMODE@ CXXFLAGS = @CXXFLAGS@ CYGPATH_W = @CYGPATH_W@ DEFS = @DEFS@ DEPDIR = @DEPDIR@ DLLTOOL = @DLLTOOL@ DSYMUTIL = @DSYMUTIL@ DUMPBIN = @DUMPBIN@ ECHO_C = @ECHO_C@ ECHO_N = @ECHO_N@ ECHO_T = @ECHO_T@ EGREP = @EGREP@ ERL = @ERL@ ERLANG_FLAGS = @ERLANG_FLAGS@ ERLC = @ERLC@ ERLC_FLAGS = @ERLC_FLAGS@ ESCRIPT = @ESCRIPT@ EXEEXT = @EXEEXT@ FGREP = @FGREP@ FLAGS = @FLAGS@ GREP = @GREP@ HAS_HELP2MAN = @HAS_HELP2MAN@ HAS_INSTALLINFO = @HAS_INSTALLINFO@ HAS_MAKEINFO = @HAS_MAKEINFO@ HAS_PDFLATEX = @HAS_PDFLATEX@ HAS_SPHINX_BUILD = @HAS_SPHINX_BUILD@ ICU_BIN = @ICU_BIN@ ICU_CFLAGS = @ICU_CFLAGS@ ICU_CONFIG = @ICU_CONFIG@ ICU_CPPFLAGS = @ICU_CPPFLAGS@ ICU_CXXFLAGS = @ICU_CXXFLAGS@ ICU_LIBS = @ICU_LIBS@ INNO_COMPILER_EXECUTABLE = @INNO_COMPILER_EXECUTABLE@ INSTALL = @INSTALL@ INSTALL_DATA = @INSTALL_DATA@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ INSTALL_SCRIPT = @INSTALL_SCRIPT@ INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ JS_CFLAGS = @JS_CFLAGS@ JS_LIBS = @JS_LIBS@ JS_LIB_BINARY = @JS_LIB_BINARY@ LD = @LD@ LDFLAGS = @LDFLAGS@ LIBOBJS = @LIBOBJS@ LIBS = @LIBS@ LIBTOOL = @LIBTOOL@ LIPO = @LIPO@ LN_S = @LN_S@ LTLIBOBJS = @LTLIBOBJS@ MAKEINFO = @MAKEINFO@ MANIFEST_TOOL = @MANIFEST_TOOL@ MKDIR_P = @MKDIR_P@ NM = @NM@ NMEDIT = @NMEDIT@ OBJDUMP = @OBJDUMP@ OBJEXT = @OBJEXT@ OTOOL = @OTOOL@ OTOOL64 = @OTOOL64@ PACKAGE = @PACKAGE@ PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ PACKAGE_NAME = @PACKAGE_NAME@ PACKAGE_STRING = @PACKAGE_STRING@ PACKAGE_TARNAME = @PACKAGE_TARNAME@ PACKAGE_URL = @PACKAGE_URL@ PACKAGE_VERSION = @PACKAGE_VERSION@ PATH_SEPARATOR = @PATH_SEPARATOR@ PKG_CONFIG = @PKG_CONFIG@ PKG_CONFIG_LIBDIR = @PKG_CONFIG_LIBDIR@ PKG_CONFIG_PATH = @PKG_CONFIG_PATH@ RANLIB = @RANLIB@ SED = @SED@ SET_MAKE = @SET_MAKE@ SHELL = @SHELL@ SNAPPY_MAJOR = @SNAPPY_MAJOR@ SNAPPY_MINOR = @SNAPPY_MINOR@ SNAPPY_PATCHLEVEL = @SNAPPY_PATCHLEVEL@ STRIP = @STRIP@ VERSION = @VERSION@ 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@ ac_cv_have_stddef_h = @ac_cv_have_stddef_h@ ac_cv_have_stdint_h = @ac_cv_have_stdint_h@ am__include = @am__include@ am__leading_dot = @am__leading_dot@ am__quote = @am__quote@ am__tar = @am__tar@ am__untar = @am__untar@ bindir = @bindir@ bug_uri = @bug_uri@ 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@ dvidir = @dvidir@ erlangbin = @erlangbin@ erlangversion = @erlangversion@ exec_prefix = @exec_prefix@ host = @host@ host_alias = @host_alias@ host_cpu = @host_cpu@ host_os = @host_os@ host_vendor = @host_vendor@ htmldir = @htmldir@ includedir = @includedir@ infodir = @infodir@ initdir = @initdir@ install_sh = @install_sh@ launchddir = @launchddir@ libdir = @libdir@ libexecdir = @libexecdir@ localconfdir = @localconfdir@ localdatadir = @localdatadir@ localdocdir = @localdocdir@ localedir = @localedir@ localerlanglibdir = @localerlanglibdir@ locallibbindir = @locallibbindir@ locallibdir = @locallibdir@ localstatedir = @localstatedir@ localstatelibdir = @localstatelibdir@ localstatelogdir = @localstatelogdir@ localstaterundir = @localstaterundir@ mandir = @mandir@ mkdir_p = @mkdir_p@ msvc_redist_dir = @msvc_redist_dir@ msvc_redist_name = @msvc_redist_name@ oldincludedir = @oldincludedir@ openssl_bin_dir = @openssl_bin_dir@ otp_release = @otp_release@ package_author_address = @package_author_address@ package_author_name = @package_author_name@ package_identifier = @package_identifier@ package_name = @package_name@ package_tarname = @package_tarname@ 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@ version = @version@ version_major = @version_major@ version_minor = @version_minor@ version_release = @version_release@ version_revision = @version_revision@ version_stage = @version_stage@ noinst_SCRIPTS = run noinst_DATA = test_util.beam test_web.beam test_cfg_register_SOURCES = test_cfg_register.c test_cfg_register_CFLAGS = -D_BSD_SOURCE # @@ wildcards are NOT portable, please replace with clean-local rules CLEANFILES = run *.beam DISTCLEANFILES = temp.* fixture_files = \ fixtures/3b835456c235b1827e012e25666152f3.view \ fixtures/test.couch tap_files = \ 001-load.t \ 002-icu-driver.t \ 010-file-basics.t \ 011-file-headers.t \ 020-btree-basics.t \ 021-btree-reductions.t \ 030-doc-from-json.t \ 031-doc-to-json.t \ 040-util.t \ 041-uuid-gen-id.ini \ 041-uuid-gen-seq.ini \ 041-uuid-gen-utc.ini \ 041-uuid-gen.t \ 042-work-queue.t \ 043-find-in-binary.t \ 050-stream.t \ 060-kt-merging.t \ 061-kt-missing-leaves.t \ 062-kt-remove-leaves.t \ 063-kt-get-leaves.t \ 064-kt-counting.t \ 065-kt-stemming.t \ 070-couch-db.t \ 072-cleanup.t \ 073-changes.t \ 074-doc-update-conflicts.t \ 075-auth-cache.t \ 076-file-compression.t \ 077-couch-db-fast-db-delete-create.t \ 080-config-get-set.t \ 081-config-override.1.ini \ 081-config-override.2.ini \ 081-config-override.t \ 082-config-register.t \ 083-config-no-files.t \ 090-task-status.t \ 100-ref-counter.t \ 120-stats-collect.t \ 121-stats-aggregates.cfg \ 121-stats-aggregates.ini \ 121-stats-aggregates.t \ 130-attachments-md5.t \ 140-attachment-comp.t \ 150-invalid-view-seq.t \ 160-vhosts.t \ 170-os-daemons.es \ 170-os-daemons.t \ 171-os-daemons-config.es \ 171-os-daemons-config.t \ 172-os-daemon-errors.1.sh \ 172-os-daemon-errors.2.sh \ 172-os-daemon-errors.3.sh \ 172-os-daemon-errors.4.sh \ 172-os-daemon-errors.t \ 173-os-daemon-cfg-register.t \ 180-http-proxy.ini \ 180-http-proxy.t \ 190-json-stream-parse.t \ 200-view-group-no-db-leaks.t \ 201-view-group-shutdown.t \ 210-os-proc-pool.t \ 220-compaction-daemon.t \ 230-pbkfd2.t \ 231-cors.t \ 250-upgrade-legacy-view-files.t EXTRA_DIST = \ run.tpl \ test_web.erl \ $(fixture_files) \ $(tap_files) 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) --foreign test/etap/Makefile'; \ $(am__cd) $(top_srcdir) && \ $(AUTOMAKE) --foreign test/etap/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): test_util.erl: $(top_builddir)/config.status $(srcdir)/test_util.erl.in cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ 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 test_cfg_register$(EXEEXT): $(test_cfg_register_OBJECTS) $(test_cfg_register_DEPENDENCIES) $(EXTRA_test_cfg_register_DEPENDENCIES) @rm -f test_cfg_register$(EXEEXT) $(test_cfg_register_LINK) $(test_cfg_register_OBJECTS) $(test_cfg_register_LDADD) $(LIBS) mostlyclean-compile: -rm -f *.$(OBJEXT) distclean-compile: -rm -f *.tab.c @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/test_cfg_register-test_cfg_register.Po@am__quote@ .c.o: @am__fastdepCC_TRUE@ $(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< @am__fastdepCC_TRUE@ $(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(COMPILE) -c $< .c.obj: @am__fastdepCC_TRUE@ $(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ `$(CYGPATH_W) '$<'` @am__fastdepCC_TRUE@ $(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(COMPILE) -c `$(CYGPATH_W) '$<'` .c.lo: @am__fastdepCC_TRUE@ $(LTCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< @am__fastdepCC_TRUE@ $(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(LTCOMPILE) -c -o $@ $< test_cfg_register-test_cfg_register.o: test_cfg_register.c @am__fastdepCC_TRUE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(test_cfg_register_CFLAGS) $(CFLAGS) -MT test_cfg_register-test_cfg_register.o -MD -MP -MF $(DEPDIR)/test_cfg_register-test_cfg_register.Tpo -c -o test_cfg_register-test_cfg_register.o `test -f 'test_cfg_register.c' || echo '$(srcdir)/'`test_cfg_register.c @am__fastdepCC_TRUE@ $(am__mv) $(DEPDIR)/test_cfg_register-test_cfg_register.Tpo $(DEPDIR)/test_cfg_register-test_cfg_register.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ source='test_cfg_register.c' object='test_cfg_register-test_cfg_register.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(test_cfg_register_CFLAGS) $(CFLAGS) -c -o test_cfg_register-test_cfg_register.o `test -f 'test_cfg_register.c' || echo '$(srcdir)/'`test_cfg_register.c test_cfg_register-test_cfg_register.obj: test_cfg_register.c @am__fastdepCC_TRUE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(test_cfg_register_CFLAGS) $(CFLAGS) -MT test_cfg_register-test_cfg_register.obj -MD -MP -MF $(DEPDIR)/test_cfg_register-test_cfg_register.Tpo -c -o test_cfg_register-test_cfg_register.obj `if test -f 'test_cfg_register.c'; then $(CYGPATH_W) 'test_cfg_register.c'; else $(CYGPATH_W) '$(srcdir)/test_cfg_register.c'; fi` @am__fastdepCC_TRUE@ $(am__mv) $(DEPDIR)/test_cfg_register-test_cfg_register.Tpo $(DEPDIR)/test_cfg_register-test_cfg_register.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ source='test_cfg_register.c' object='test_cfg_register-test_cfg_register.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(test_cfg_register_CFLAGS) $(CFLAGS) -c -o test_cfg_register-test_cfg_register.obj `if test -f 'test_cfg_register.c'; then $(CYGPATH_W) 'test_cfg_register.c'; else $(CYGPATH_W) '$(srcdir)/test_cfg_register.c'; fi` mostlyclean-libtool: -rm -f *.lo clean-libtool: -rm -rf .libs _libs ID: $(HEADERS) $(SOURCES) $(LISP) $(TAGS_FILES) list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | \ $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ END { if (nonempty) { for (i in files) print i; }; }'`; \ mkid -fID $$unique tags: TAGS TAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ $(TAGS_FILES) $(LISP) set x; \ here=`pwd`; \ list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | \ $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ END { if (nonempty) { for (i in files) print i; }; }'`; \ 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 CTAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ $(TAGS_FILES) $(LISP) list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | \ $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ END { if (nonempty) { for (i in files) print i; }; }'`; \ 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" 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) $(SCRIPTS) $(DATA) 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) -test -z "$(DISTCLEANFILES)" || rm -f $(DISTCLEANFILES) 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 all all-am check check-am clean clean-generic \ clean-libtool clean-noinstPROGRAMS ctags 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 uninstall uninstall-am %.beam: %.erl $(ERLC) $< run: run.tpl sed -e "s|%abs_top_srcdir%|@abs_top_srcdir@|g" \ -e "s|%abs_top_builddir%|@abs_top_builddir@|g" > \ $@ < $< chmod +x $@ # 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: apache-couchdb-1.6.0/test/etap/fixtures/0000755000175000001440000000000012332106073020101 5ustar00djcusers00000000000000apache-couchdb-1.6.0/test/etap/fixtures/3b835456c235b1827e012e25666152f3.view0000644000175000001440000001014012332105522024702 0ustar00djcusers00000000000000.uEė×e]¶„TŖ^ŻY®ƒhm;ƒTVĀ5±‚~.%faRódnil\yąƒhdkv_nodelhm 193f2f9c596ddc7ad326f7da470009ec,haajŠ3@12b6lhaajj]wšDƒhdkv_nodelhham 193f2f9c596ddc7ad326f7da470009ecdnullh2‚2,12b6dnullj[4'ÖłœCqÄ‚ĪŠØóƒhm;ƒTVĀ5±‚~.%faRóhd index_headeraaha3ja`lhha“hajaaaajapache-couchdb-1.6.0/test/etap/fixtures/test.couch0000644000175000001440000004014212332105522022102 0ustar00djcusers00000000000000JSŠ’½\4f†¦ģ,`gƒh d db_headeraaadnildnildniladnildnilbč€yIO09užFųž”®øžŃƒhmƒhjmƒjklš>ƒhdkv_nodelhm 193f2f9c596ddc7ad326f7da470009echaa 2 ah6t–zßõą*ŻA‘8«³(MhaaOaa'jjjbdš<ƒhdkv_nodelhahm 193f2f9c596ddc7ad326f7da470009ec 020\–zßõą*ŻA‘8«³(MaaOjjjTCmwĶb…€iź‰9rƒh d db_headeraaahavhaaa'aohaåaafdniladnildnilbč€"ŻU÷Øæa=IķņæSv'źƒhmƒhlhmaajmƒjŽ–š>ƒhdkv_nodelhm 193f2f9c596ddc7ad326f7da470009echaa 2 ah6h–zßõą*ŻA‘8«³(MhaaOaa' * &ƒhdkv_nodelhm 193f2f9c596ddc7ad326f7da470009echaa2hah6h–zßõą*ŻA‘8«³(MhaaOaa' * &X&function(doc) { emit8.a, null); }jjjmƒjķŗš>ƒhdkv_nodelhm 193f2f9c596ddc7ad326f7da470009echaa2hah6h–zßõą*ŻA‘8«³(MhaaOaa' * &@d•čˆ¤U4žkˆysab0_jjj]m±Ęw^üč1»ƒŅšæQttƒh d db_headeraaahb0ōhaabańhb1åaaĘdniladnildnilbčapache-couchdb-1.6.0/test/etap/230-pbkfd2.t0000644000175000001440000000340712332105522020071 0ustar00djcusers00000000000000#!/usr/bin/env escript %% -*- erlang -*- % Licensed under the Apache License, Version 2.0 (the "License"); you may not % use this file except in compliance with the License. You may obtain a copy of % the License at % % http://www.apache.org/licenses/LICENSE-2.0 % % Unless required by applicable law or agreed to in writing, software % distributed under the License is distributed on an "AS IS" BASIS, WITHOUT % WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the % License for the specific language governing permissions and limitations under % the License. main(_) -> test_util:init_code_path(), etap:plan(6), etap:is(couch_passwords:pbkdf2(<<"password">>, <<"salt">>, 1, 20), {ok, <<"0c60c80f961f0e71f3a9b524af6012062fe037a6">>}, "test vector #1"), etap:is(couch_passwords:pbkdf2(<<"password">>, <<"salt">>, 2, 20), {ok, <<"ea6c014dc72d6f8ccd1ed92ace1d41f0d8de8957">>}, "test vector #2"), etap:is(couch_passwords:pbkdf2(<<"password">>, <<"salt">>, 4096, 20), {ok, <<"4b007901b765489abead49d926f721d065a429c1">>}, "test vector #3"), etap:is(couch_passwords:pbkdf2(<<"passwordPASSWORDpassword">>, <<"saltSALTsaltSALTsaltSALTsaltSALTsalt">>, 4096, 25), {ok, <<"3d2eec4fe41c849b80c8d83662c0e44a8b291a964cf2f07038">>}, "test vector #4"), etap:is(couch_passwords:pbkdf2(<<"pass\0word">>, <<"sa\0lt">>, 4096, 16), {ok, <<"56fa6aa75548099dcc37d7f03425e0c3">>}, "test vector #5"), etap:is(couch_passwords:pbkdf2(<<"password">>, <<"salt">>, 16777216, 20), {ok, <<"eefe3d61cd4da4e4e9945b3d6ba2158c2634e984">>}, "test vector #6"), etap:end_tests(). apache-couchdb-1.6.0/test/etap/041-uuid-gen-utc.ini0000644000175000001440000000146212332105522021542 0ustar00djcusers00000000000000; Licensed to the Apache Software Foundation (ASF) under one ; or more contributor license agreements. See the NOTICE file ; distributed with this work for additional information ; regarding copyright ownership. The ASF licenses this file ; to you under the Apache License, Version 2.0 (the ; "License"); you may not use this file except in compliance ; with the License. You may obtain a copy of the License at ; ; http://www.apache.org/licenses/LICENSE-2.0 ; ; Unless required by applicable law or agreed to in writing, ; software distributed under the License is distributed on an ; "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY ; KIND, either express or implied. See the License for the ; specific language governing permissions and limitations ; under the License. [uuids] algorithm = utc_random apache-couchdb-1.6.0/test/etap/042-work-queue.t0000755000175000001440000004406212332105522021033 0ustar00djcusers00000000000000#!/usr/bin/env escript %% -*- erlang -*- % Licensed under the Apache License, Version 2.0 (the "License"); you may not % use this file except in compliance with the License. You may obtain a copy of % the License at % % http://www.apache.org/licenses/LICENSE-2.0 % % Unless required by applicable law or agreed to in writing, software % distributed under the License is distributed on an "AS IS" BASIS, WITHOUT % WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the % License for the specific language governing permissions and limitations under % the License. main(_) -> test_util:init_code_path(), etap:plan(155), case (catch test()) of ok -> etap:end_tests(); Other -> etap:diag(io_lib:format("Test died abnormally: ~p", [Other])), etap:bail(Other) end, ok. test() -> ok = crypto:start(), test_single_consumer_max_item_count(), test_single_consumer_max_size(), test_single_consumer_max_item_count_and_size(), test_multiple_consumers(), ok. test_single_consumer_max_item_count() -> etap:diag("Spawning a queue with 3 max items, 1 producer and 1 consumer"), {ok, Q} = couch_work_queue:new([{max_items, 3}]), Producer = spawn_producer(Q), Consumer = spawn_consumer(Q), etap:is(couch_work_queue:item_count(Q), 0, "Queue item count is 0"), consume(Consumer, 1), etap:is(ping(Consumer), timeout, "Consumer blocked when attempting to dequeue 1 item from empty queue"), Item1 = produce(Producer, 10), etap:is(ping(Producer), ok, "Producer not blocked"), etap:is(ping(Consumer), ok, "Consumer unblocked"), etap:is(last_consumer_items(Consumer), {ok, [Item1]}, "Consumer received the right item"), Item2 = produce(Producer, 20), etap:is(ping(Producer), ok, "Producer not blocked with non full queue"), etap:is(couch_work_queue:item_count(Q), 1, "Queue item count is 1"), Item3 = produce(Producer, 15), etap:is(ping(Producer), ok, "Producer not blocked with non full queue"), etap:is(couch_work_queue:item_count(Q), 2, "Queue item count is 2"), Item4 = produce(Producer, 3), etap:is(couch_work_queue:item_count(Q), 3, "Queue item count is 3"), etap:is(ping(Producer), timeout, "Producer blocked with full queue"), consume(Consumer, 2), etap:is(ping(Consumer), ok, "Consumer not blocked when attempting to dequeue 2 items from queue"), etap:is(last_consumer_items(Consumer), {ok, [Item2, Item3]}, "Consumer received the right items"), etap:is(couch_work_queue:item_count(Q), 1, "Queue item count is 1"), consume(Consumer, 2), etap:is(ping(Consumer), ok, "Consumer not blocked when attempting to dequeue 2 items from queue"), etap:is(last_consumer_items(Consumer), {ok, [Item4]}, "Consumer received the right item"), etap:is(couch_work_queue:item_count(Q), 0, "Queue item count is 0"), consume(Consumer, 100), etap:is(ping(Consumer), timeout, "Consumer blocked when attempting to dequeue 100 items from empty queue"), etap:is(couch_work_queue:item_count(Q), 0, "Queue item count is 0"), Item5 = produce(Producer, 11), etap:is(ping(Producer), ok, "Producer not blocked with empty queue"), etap:is(couch_work_queue:item_count(Q), 0, "Queue item count is 0"), Item6 = produce(Producer, 19), etap:is(ping(Producer), ok, "Producer not blocked with non full queue"), etap:is(couch_work_queue:item_count(Q), 1, "Queue item count is 1"), Item7 = produce(Producer, 2), etap:is(ping(Producer), ok, "Producer not blocked with non full queue"), etap:is(couch_work_queue:item_count(Q), 2, "Queue item count is 2"), Item8 = produce(Producer, 33), etap:is(ping(Producer), timeout, "Producer blocked with full queue"), etap:is(couch_work_queue:item_count(Q), 3, "Queue item count is 3"), etap:is(ping(Consumer), ok, "Consumer unblocked"), etap:is(last_consumer_items(Consumer), {ok, [Item5]}, "Consumer received the first queued item"), etap:is(couch_work_queue:item_count(Q), 3, "Queue item count is 3"), consume(Consumer, all), etap:is(ping(Consumer), ok, "Consumer not blocked when attempting to dequeue all items from queue"), etap:is(last_consumer_items(Consumer), {ok, [Item6, Item7, Item8]}, "Consumer received all queued items"), etap:is(couch_work_queue:item_count(Q), 0, "Queue item count is 0"), etap:is(close_queue(Q), ok, "Closed queue"), consume(Consumer, 1), etap:is(last_consumer_items(Consumer), closed, "Consumer got closed queue"), etap:is(couch_work_queue:item_count(Q), closed, "Queue closed"), etap:is(couch_work_queue:size(Q), closed, "Queue closed"), stop(Producer, "producer"), stop(Consumer, "consumer"). test_single_consumer_max_size() -> etap:diag("Spawning a queue with max size of 160 bytes, " "1 producer and 1 consumer"), {ok, Q} = couch_work_queue:new([{max_size, 160}]), Producer = spawn_producer(Q), Consumer = spawn_consumer(Q), etap:is(couch_work_queue:item_count(Q), 0, "Queue item count is 0"), etap:is(couch_work_queue:size(Q), 0, "Queue size is 0 bytes"), consume(Consumer, 1), etap:is(ping(Consumer), timeout, "Consumer blocked when attempting to dequeue 1 item from empty queue"), Item1 = produce(Producer, 50), etap:is(ping(Producer), ok, "Producer not blocked"), etap:is(ping(Consumer), ok, "Consumer unblocked"), etap:is(last_consumer_items(Consumer), {ok, [Item1]}, "Consumer received the right item"), etap:is(couch_work_queue:item_count(Q), 0, "Queue item count is 0"), etap:is(couch_work_queue:size(Q), 0, "Queue size is 0 bytes"), Item2 = produce(Producer, 50), etap:is(ping(Producer), ok, "Producer not blocked"), etap:is(couch_work_queue:item_count(Q), 1, "Queue item count is 1"), etap:is(couch_work_queue:size(Q), 50, "Queue size is 50 bytes"), Item3 = produce(Producer, 50), etap:is(ping(Producer), ok, "Producer not blocked"), etap:is(couch_work_queue:item_count(Q), 2, "Queue item count is 2"), etap:is(couch_work_queue:size(Q), 100, "Queue size is 100 bytes"), Item4 = produce(Producer, 61), etap:is(ping(Producer), timeout, "Producer blocked"), etap:is(couch_work_queue:item_count(Q), 3, "Queue item count is 3"), etap:is(couch_work_queue:size(Q), 161, "Queue size is 161 bytes"), consume(Consumer, 1), etap:is(ping(Consumer), ok, "Consumer not blocked when attempting to dequeue 1 item from full queue"), etap:is(last_consumer_items(Consumer), {ok, [Item2]}, "Consumer received the right item"), etap:is(couch_work_queue:item_count(Q), 2, "Queue item count is 2"), etap:is(couch_work_queue:size(Q), 111, "Queue size is 111 bytes"), Item5 = produce(Producer, 20), etap:is(ping(Producer), ok, "Producer not blocked"), etap:is(couch_work_queue:item_count(Q), 3, "Queue item count is 3"), etap:is(couch_work_queue:size(Q), 131, "Queue size is 131 bytes"), Item6 = produce(Producer, 40), etap:is(ping(Producer), timeout, "Producer blocked"), etap:is(couch_work_queue:item_count(Q), 4, "Queue item count is 4"), etap:is(couch_work_queue:size(Q), 171, "Queue size is 171 bytes"), etap:is(close_queue(Q), timeout, "Timeout when trying to close non-empty queue"), consume(Consumer, 2), etap:is(ping(Consumer), ok, "Consumer not blocked when attempting to dequeue 2 items from full queue"), etap:is(last_consumer_items(Consumer), {ok, [Item3, Item4]}, "Consumer received the right items"), etap:is(couch_work_queue:item_count(Q), 2, "Queue item count is 2"), etap:is(couch_work_queue:size(Q), 60, "Queue size is 60 bytes"), etap:is(close_queue(Q), timeout, "Timeout when trying to close non-empty queue"), consume(Consumer, all), etap:is(ping(Consumer), ok, "Consumer not blocked when attempting to dequeue all items from queue"), etap:is(last_consumer_items(Consumer), {ok, [Item5, Item6]}, "Consumer received the right items"), etap:is(couch_work_queue:item_count(Q), closed, "Queue closed"), etap:is(couch_work_queue:size(Q), closed, "Queue closed"), consume(Consumer, all), etap:is(last_consumer_items(Consumer), closed, "Consumer got closed queue"), stop(Producer, "producer"), stop(Consumer, "consumer"). test_single_consumer_max_item_count_and_size() -> etap:diag("Spawning a queue with 3 max items, max size of 200 bytes, " "1 producer and 1 consumer"), {ok, Q} = couch_work_queue:new([{max_items, 3}, {max_size, 200}]), Producer = spawn_producer(Q), Consumer = spawn_consumer(Q), etap:is(couch_work_queue:item_count(Q), 0, "Queue item count is 0"), etap:is(couch_work_queue:size(Q), 0, "Queue size is 0 bytes"), Item1 = produce(Producer, 100), etap:is(ping(Producer), ok, "Producer not blocked"), etap:is(couch_work_queue:item_count(Q), 1, "Queue item count is 1"), etap:is(couch_work_queue:size(Q), 100, "Queue size is 100 bytes"), Item2 = produce(Producer, 110), etap:is(ping(Producer), timeout, "Producer blocked when queue size >= max_size"), etap:is(couch_work_queue:item_count(Q), 2, "Queue item count is 2"), etap:is(couch_work_queue:size(Q), 210, "Queue size is 210 bytes"), consume(Consumer, all), etap:is(ping(Consumer), ok, "Consumer not blocked when attempting to dequeue all items from queue"), etap:is(last_consumer_items(Consumer), {ok, [Item1, Item2]}, "Consumer received the right items"), etap:is(couch_work_queue:item_count(Q), 0, "Queue item count is 0"), etap:is(couch_work_queue:size(Q), 0, "Queue size is 0 bytes"), etap:is(ping(Producer), ok, "Producer not blocked anymore"), Item3 = produce(Producer, 10), etap:is(ping(Producer), ok, "Producer not blocked"), etap:is(couch_work_queue:item_count(Q), 1, "Queue item count is 1"), etap:is(couch_work_queue:size(Q), 10, "Queue size is 10 bytes"), Item4 = produce(Producer, 4), etap:is(ping(Producer), ok, "Producer not blocked"), etap:is(couch_work_queue:item_count(Q), 2, "Queue item count is 2"), etap:is(couch_work_queue:size(Q), 14, "Queue size is 14 bytes"), Item5 = produce(Producer, 2), etap:is(ping(Producer), timeout, "Producer blocked when queue item count = max_items"), etap:is(couch_work_queue:item_count(Q), 3, "Queue item count is 3"), etap:is(couch_work_queue:size(Q), 16, "Queue size is 16 bytes"), consume(Consumer, 1), etap:is(ping(Consumer), ok, "Consumer not blocked when attempting to dequeue 1 item from queue"), etap:is(last_consumer_items(Consumer), {ok, [Item3]}, "Consumer received 1 item"), etap:is(couch_work_queue:item_count(Q), 2, "Queue item count is 2"), etap:is(couch_work_queue:size(Q), 6, "Queue size is 6 bytes"), etap:is(close_queue(Q), timeout, "Timeout when trying to close non-empty queue"), consume(Consumer, 1), etap:is(ping(Consumer), ok, "Consumer not blocked when attempting to dequeue 1 item from queue"), etap:is(last_consumer_items(Consumer), {ok, [Item4]}, "Consumer received 1 item"), etap:is(couch_work_queue:item_count(Q), 1, "Queue item count is 1"), etap:is(couch_work_queue:size(Q), 2, "Queue size is 2 bytes"), Item6 = produce(Producer, 50), etap:is(ping(Producer), ok, "Producer not blocked when queue is not full and already received" " a close request"), etap:is(couch_work_queue:item_count(Q), 2, "Queue item count is 2"), etap:is(couch_work_queue:size(Q), 52, "Queue size is 52 bytes"), consume(Consumer, all), etap:is(ping(Consumer), ok, "Consumer not blocked when attempting to dequeue all items from queue"), etap:is(last_consumer_items(Consumer), {ok, [Item5, Item6]}, "Consumer received all queued items"), etap:is(couch_work_queue:item_count(Q), closed, "Queue closed"), etap:is(couch_work_queue:size(Q), closed, "Queue closed"), consume(Consumer, 1), etap:is(last_consumer_items(Consumer), closed, "Consumer got closed queue"), stop(Producer, "producer"), stop(Consumer, "consumer"). test_multiple_consumers() -> etap:diag("Spawning a queue with 3 max items, max size of 200 bytes, " "1 producer and 3 consumers"), {ok, Q} = couch_work_queue:new( [{max_items, 3}, {max_size, 200}, {multi_workers, true}]), Producer = spawn_producer(Q), Consumer1 = spawn_consumer(Q), Consumer2 = spawn_consumer(Q), Consumer3 = spawn_consumer(Q), etap:is(couch_work_queue:item_count(Q), 0, "Queue item count is 0"), etap:is(couch_work_queue:size(Q), 0, "Queue size is 0 bytes"), consume(Consumer1, 1), etap:is(ping(Consumer1), timeout, "Consumer 1 blocked when attempting to dequeue 1 item from empty queue"), consume(Consumer2, 2), etap:is(ping(Consumer2), timeout, "Consumer 2 blocked when attempting to dequeue 2 items from empty queue"), consume(Consumer3, 1), etap:is(ping(Consumer3), timeout, "Consumer 3 blocked when attempting to dequeue 1 item from empty queue"), Item1 = produce(Producer, 50), etap:is(ping(Producer), ok, "Producer not blocked"), etap:is(couch_work_queue:item_count(Q), 0, "Queue item count is 0"), etap:is(couch_work_queue:size(Q), 0, "Queue size is 0 bytes"), Item2 = produce(Producer, 50), etap:is(ping(Producer), ok, "Producer not blocked"), etap:is(couch_work_queue:item_count(Q), 0, "Queue item count is 0"), etap:is(couch_work_queue:size(Q), 0, "Queue size is 0 bytes"), Item3 = produce(Producer, 50), etap:is(ping(Producer), ok, "Producer not blocked"), etap:is(couch_work_queue:item_count(Q), 0, "Queue item count is 0"), etap:is(couch_work_queue:size(Q), 0, "Queue size is 0 bytes"), etap:is(ping(Consumer1), ok, "Consumer 1 unblocked"), etap:is(last_consumer_items(Consumer1), {ok, [Item1]}, "Consumer 1 received 1 item"), etap:is(couch_work_queue:item_count(Q), 0, "Queue item count is 0"), etap:is(couch_work_queue:size(Q), 0, "Queue size is 0 bytes"), etap:is(ping(Consumer2), ok, "Consumer 2 unblocked"), etap:is(last_consumer_items(Consumer2), {ok, [Item2]}, "Consumer 2 received 1 item"), etap:is(couch_work_queue:item_count(Q), 0, "Queue item count is 0"), etap:is(couch_work_queue:size(Q), 0, "Queue size is 0 bytes"), etap:is(ping(Consumer3), ok, "Consumer 3 unblocked"), etap:is(last_consumer_items(Consumer3), {ok, [Item3]}, "Consumer 3 received 1 item"), etap:is(couch_work_queue:item_count(Q), 0, "Queue item count is 0"), etap:is(couch_work_queue:size(Q), 0, "Queue size is 0 bytes"), consume(Consumer1, 1), etap:is(ping(Consumer1), timeout, "Consumer 1 blocked when attempting to dequeue 1 item from empty queue"), consume(Consumer2, 2), etap:is(ping(Consumer2), timeout, "Consumer 2 blocked when attempting to dequeue 1 item from empty queue"), consume(Consumer3, 1), etap:is(ping(Consumer3), timeout, "Consumer 3 blocked when attempting to dequeue 1 item from empty queue"), Item4 = produce(Producer, 50), etap:is(ping(Producer), ok, "Producer not blocked"), etap:is(couch_work_queue:item_count(Q), 0, "Queue item count is 0"), etap:is(couch_work_queue:size(Q), 0, "Queue size is 0 bytes"), etap:is(close_queue(Q), ok, "Closed queue"), etap:is(ping(Consumer1), ok, "Consumer 1 unblocked"), etap:is(last_consumer_items(Consumer1), {ok, [Item4]}, "Consumer 1 received 1 item"), etap:is(couch_work_queue:item_count(Q), closed, "Queue closed"), etap:is(couch_work_queue:size(Q), closed, "Queue closed"), etap:is(ping(Consumer2), ok, "Consumer 2 unblocked"), etap:is(last_consumer_items(Consumer2), closed, "Consumer 2 received 'closed' atom"), etap:is(ping(Consumer3), ok, "Consumer 3 unblocked"), etap:is(last_consumer_items(Consumer3), closed, "Consumer 3 received 'closed' atom"), stop(Producer, "producer"), stop(Consumer1, "consumer 1"), stop(Consumer2, "consumer 2"), stop(Consumer3, "consumer 3"). close_queue(Q) -> ok = couch_work_queue:close(Q), MonRef = erlang:monitor(process, Q), receive {'DOWN', MonRef, process, Q, _Reason} -> etap:diag("Queue closed") after 3000 -> erlang:demonitor(MonRef), timeout end. spawn_consumer(Q) -> Parent = self(), spawn(fun() -> consumer_loop(Parent, Q, nil) end). consumer_loop(Parent, Q, PrevItem) -> receive {stop, Ref} -> Parent ! {ok, Ref}; {ping, Ref} -> Parent ! {pong, Ref}, consumer_loop(Parent, Q, PrevItem); {last_item, Ref} -> Parent ! {item, Ref, PrevItem}, consumer_loop(Parent, Q, PrevItem); {consume, N} -> Result = couch_work_queue:dequeue(Q, N), consumer_loop(Parent, Q, Result) end. spawn_producer(Q) -> Parent = self(), spawn(fun() -> producer_loop(Parent, Q) end). producer_loop(Parent, Q) -> receive {stop, Ref} -> Parent ! {ok, Ref}; {ping, Ref} -> Parent ! {pong, Ref}, producer_loop(Parent, Q); {produce, Ref, Size} -> Item = crypto:rand_bytes(Size), Parent ! {item, Ref, Item}, ok = couch_work_queue:queue(Q, Item), producer_loop(Parent, Q) end. consume(Consumer, N) -> Consumer ! {consume, N}. last_consumer_items(Consumer) -> Ref = make_ref(), Consumer ! {last_item, Ref}, receive {item, Ref, Items} -> Items after 3000 -> timeout end. produce(Producer, Size) -> Ref = make_ref(), Producer ! {produce, Ref, Size}, receive {item, Ref, Item} -> Item after 3000 -> etap:bail("Timeout asking producer to produce an item") end. ping(Pid) -> Ref = make_ref(), Pid ! {ping, Ref}, receive {pong, Ref} -> ok after 3000 -> timeout end. stop(Pid, Name) -> Ref = make_ref(), Pid ! {stop, Ref}, receive {ok, Ref} -> etap:diag("Stopped " ++ Name) after 3000 -> etap:bail("Timeout stopping " ++ Name) end. apache-couchdb-1.6.0/test/etap/171-os-daemons-config.es0000755000175000001440000000426012332105522022402 0ustar00djcusers00000000000000#! /usr/bin/env escript % Licensed under the Apache License, Version 2.0 (the "License"); you may not % use this file except in compliance with the License. You may obtain a copy of % the License at % % http://www.apache.org/licenses/LICENSE-2.0 % % Unless required by applicable law or agreed to in writing, software % distributed under the License is distributed on an "AS IS" BASIS, WITHOUT % WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the % License for the specific language governing permissions and limitations under % the License. filename() -> list_to_binary(test_util:source_file("test/etap/171-os-daemons-config.es")). read() -> case io:get_line('') of eof -> stop; Data -> ejson:decode(Data) end. write(Mesg) -> Data = iolist_to_binary(ejson:encode(Mesg)), io:format(binary_to_list(Data) ++ "\n", []). get_cfg(Section) -> write([<<"get">>, Section]), read(). get_cfg(Section, Name) -> write([<<"get">>, Section, Name]), read(). log(Mesg) -> write([<<"log">>, Mesg]). log(Mesg, Level) -> write([<<"log">>, Mesg, {[{<<"level">>, Level}]}]). test_get_cfg1() -> FileName = filename(), {[{<<"foo">>, FileName}]} = get_cfg(<<"os_daemons">>). test_get_cfg2() -> FileName = filename(), FileName = get_cfg(<<"os_daemons">>, <<"foo">>), <<"sequential">> = get_cfg(<<"uuids">>, <<"algorithm">>). test_get_unknown_cfg() -> {[]} = get_cfg(<<"aal;3p4">>), null = get_cfg(<<"aal;3p4">>, <<"313234kjhsdfl">>). test_log() -> log(<<"foobar!">>), log(<<"some stuff!">>, <<"debug">>), log(2), log(true), write([<<"log">>, <<"stuff">>, 2]), write([<<"log">>, 3, null]), write([<<"log">>, [1, 2], {[{<<"level">>, <<"debug">>}]}]), write([<<"log">>, <<"true">>, {[]}]). do_tests() -> test_get_cfg1(), test_get_cfg2(), test_get_unknown_cfg(), test_log(), loop(io:read("")). loop({ok, _}) -> loop(io:read("")); loop(eof) -> init:stop(); loop({error, _Reason}) -> init:stop(). main([]) -> test_util:init_code_path(), couch_config:start_link(test_util:config_files()), couch_drv:start_link(), do_tests(). apache-couchdb-1.6.0/test/etap/076-file-compression.t0000755000175000001440000001332112332105522022206 0ustar00djcusers00000000000000#!/usr/bin/env escript %% -*- erlang -*- % Licensed under the Apache License, Version 2.0 (the "License"); you may not % use this file except in compliance with the License. You may obtain a copy of % the License at % % http://www.apache.org/licenses/LICENSE-2.0 % % Unless required by applicable law or agreed to in writing, software % distributed under the License is distributed on an "AS IS" BASIS, WITHOUT % WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the % License for the specific language governing permissions and limitations under % the License. -record(user_ctx, { name = null, roles = [], handler }). test_db_name() -> <<"couch_test_file_compression">>. ddoc_id() -> <<"_design/test">>. num_docs() -> 5000. main(_) -> test_util:init_code_path(), etap:plan(10), case (catch test()) of ok -> etap:end_tests(); Other -> etap:diag(io_lib:format("Test died abnormally: ~p", [Other])), etap:bail(Other) end, ok. test() -> couch_server_sup:start_link(test_util:config_files()), couch_config:set("couchdb", "file_compression", "none", false), create_database(), compact_db(), compact_view(), DbDiskSize1 = db_disk_size(), ViewDiskSize1 = view_disk_size(), couch_config:set("couchdb", "file_compression", "snappy", false), compact_db(), compact_view(), DbDiskSize2 = db_disk_size(), ViewDiskSize2 = view_disk_size(), etap:is(DbDiskSize2 < DbDiskSize1, true, "Database disk size decreased"), etap:is(ViewDiskSize2 < ViewDiskSize1, true, "Index disk size decreased"), couch_config:set("couchdb", "file_compression", "deflate_9", false), compact_db(), compact_view(), DbDiskSize3 = db_disk_size(), ViewDiskSize3 = view_disk_size(), etap:is(DbDiskSize3 < DbDiskSize2, true, "Database disk size decreased again"), etap:is(ViewDiskSize3 < ViewDiskSize2, true, "Index disk size decreased again"), couch_config:set("couchdb", "file_compression", "deflate_1", false), compact_db(), compact_view(), DbDiskSize4 = db_disk_size(), ViewDiskSize4 = view_disk_size(), etap:is(DbDiskSize4 > DbDiskSize3, true, "Database disk size increased"), etap:is(ViewDiskSize4 > ViewDiskSize3, true, "Index disk size increased"), couch_config:set("couchdb", "file_compression", "snappy", false), compact_db(), compact_view(), DbDiskSize5 = db_disk_size(), ViewDiskSize5 = view_disk_size(), etap:is(DbDiskSize5 > DbDiskSize4, true, "Database disk size increased again"), etap:is(ViewDiskSize5 > ViewDiskSize4, true, "Index disk size increased again"), couch_config:set("couchdb", "file_compression", "none", false), compact_db(), compact_view(), DbDiskSize6 = db_disk_size(), ViewDiskSize6 = view_disk_size(), etap:is(DbDiskSize6 > DbDiskSize5, true, "Database disk size increased again"), etap:is(ViewDiskSize6 > ViewDiskSize5, true, "Index disk size increased again"), delete_db(), couch_server_sup:stop(), ok. create_database() -> {ok, Db} = couch_db:create( test_db_name(), [{user_ctx, #user_ctx{roles = [<<"_admin">>]}}, overwrite]), ok = populate_db(Db, num_docs()), DDoc = couch_doc:from_json_obj({[ {<<"_id">>, ddoc_id()}, {<<"language">>, <<"javascript">>}, {<<"views">>, {[ {<<"view1">>, {[ {<<"map">>, <<"function(doc) { emit(doc._id, doc.string); }">>} ]}} ]} } ]}), {ok, _} = couch_db:update_doc(Db, DDoc, []), refresh_index(), ok = couch_db:close(Db). populate_db(_Db, NumDocs) when NumDocs =< 0 -> ok; populate_db(Db, NumDocs) -> Docs = lists:map( fun(_) -> couch_doc:from_json_obj({[ {<<"_id">>, couch_uuids:random()}, {<<"string">>, list_to_binary(lists:duplicate(1000, $X))} ]}) end, lists:seq(1, 500)), {ok, _} = couch_db:update_docs(Db, Docs, []), populate_db(Db, NumDocs - 500). refresh_index() -> {ok, Db} = couch_db:open_int(test_db_name(), []), {ok, DDoc} = couch_db:open_doc(Db, ddoc_id(), [ejson_body]), couch_mrview:query_view(Db, DDoc, <<"view1">>, [{stale, false}]), ok = couch_db:close(Db). compact_db() -> {ok, Db} = couch_db:open_int(test_db_name(), []), {ok, CompactPid} = couch_db:start_compact(Db), MonRef = erlang:monitor(process, CompactPid), receive {'DOWN', MonRef, process, CompactPid, normal} -> ok; {'DOWN', MonRef, process, CompactPid, Reason} -> etap:bail("Error compacting database: " ++ couch_util:to_list(Reason)) after 120000 -> etap:bail("Timeout waiting for database compaction") end, ok = couch_db:close(Db). compact_view() -> {ok, MonRef} = couch_mrview:compact(test_db_name(), ddoc_id(), [monitor]), receive {'DOWN', MonRef, process, _CompactPid, normal} -> ok; {'DOWN', MonRef, process, _CompactPid, Reason} -> etap:bail("Error compacting view group: " ++ couch_util:to_list(Reason)) after 120000 -> etap:bail("Timeout waiting for view group compaction") end. db_disk_size() -> {ok, Db} = couch_db:open_int(test_db_name(), []), {ok, Info} = couch_db:get_db_info(Db), ok = couch_db:close(Db), couch_util:get_value(disk_size, Info). view_disk_size() -> {ok, Db} = couch_db:open_int(test_db_name(), []), {ok, DDoc} = couch_db:open_doc(Db, ddoc_id(), [ejson_body]), {ok, Info} = couch_mrview:get_info(Db, DDoc), ok = couch_db:close(Db), couch_util:get_value(disk_size, Info). delete_db() -> ok = couch_server:delete( test_db_name(), [{user_ctx, #user_ctx{roles = [<<"_admin">>]}}]). apache-couchdb-1.6.0/test/etap/220-compaction-daemon.t0000755000175000001440000001627412332105522022326 0ustar00djcusers00000000000000#!/usr/bin/env escript %% -*- erlang -*- % Licensed under the Apache License, Version 2.0 (the "License"); you may not % use this file except in compliance with the License. You may obtain a copy of % the License at % % http://www.apache.org/licenses/LICENSE-2.0 % % Unless required by applicable law or agreed to in writing, software % distributed under the License is distributed on an "AS IS" BASIS, WITHOUT % WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the % License for the specific language governing permissions and limitations under % the License. -record(user_ctx, { name = null, roles = [], handler }). test_db_name() -> <<"couch_test_compaction_daemon">>. main(_) -> test_util:init_code_path(), etap:plan(10), case (catch test()) of ok -> etap:end_tests(); Other -> etap:diag(io_lib:format("Test died abnormally: ~p", [Other])), etap:bail(Other) end, ok. test() -> couch_server_sup:start_link(test_util:config_files()), timer:sleep(1000), put(addr, couch_config:get("httpd", "bind_address", "127.0.0.1")), put(port, integer_to_list(mochiweb_socket_server:get(couch_httpd, port))), disable_compact_daemon(), delete_db(), {ok, Db} = create_db(), add_design_doc(Db), couch_db:close(Db), populate(70, 70, 200 * 1024), {_, DbFileSize} = get_db_frag(), {_, ViewFileSize} = get_view_frag(), % enable automatic compaction ok = couch_config:set("compaction_daemon", "check_interval", "3", false), ok = couch_config:set("compaction_daemon", "min_file_size", "100000", false), ok = couch_config:set( "compactions", binary_to_list(test_db_name()), "[{db_fragmentation, \"70%\"}, {view_fragmentation, \"70%\"}]", false), ok = timer:sleep(4000), % something >= check_interval wait_compaction_finished(), {DbFrag2, DbFileSize2} = get_db_frag(), {ViewFrag2, ViewFileSize2} = get_view_frag(), etap:is(true, (DbFrag2 < 70), "Database fragmentation is < 70% after compaction"), etap:is(true, (ViewFrag2 < 70), "View fragmentation is < 70% after compaction"), etap:is(true, (DbFileSize2 < DbFileSize), "Database file size decreased"), etap:is(true, (ViewFileSize2 < ViewFileSize), "View file size decreased"), disable_compact_daemon(), ok = timer:sleep(6000), % 2 times check_interval etap:is(couch_db:is_idle(Db), true, "Database is idle"), populate(70, 70, 200 * 1024), {_, DbFileSize3} = get_db_frag(), {_, ViewFileSize3} = get_view_frag(), % enable automatic compaction ok = couch_config:set( "compactions", "_default", "[{db_fragmentation, \"70%\"}, {view_fragmentation, \"70%\"}]", false), ok = timer:sleep(4000), % something >= check_interval wait_compaction_finished(), {DbFrag4, DbFileSize4} = get_db_frag(), {ViewFrag4, ViewFileSize4} = get_view_frag(), etap:is(true, (DbFrag4 < 70), "Database fragmentation is < 70% after compaction"), etap:is(true, (ViewFrag4 < 70), "View fragmentation is < 70% after compaction"), etap:is(true, (DbFileSize4 < DbFileSize3), "Database file size decreased again"), etap:is(true, (ViewFileSize4 < ViewFileSize3), "View file size decreased again"), ok = timer:sleep(6000), % 2 times check_interval etap:is(couch_db:is_idle(Db), true, "Database is idle"), delete_db(), couch_server_sup:stop(), ok. disable_compact_daemon() -> Configs = couch_config:get("compactions"), lists:foreach( fun({DbName, _}) -> ok = couch_config:delete("compactions", DbName, false) end, Configs). admin_user_ctx() -> {user_ctx, #user_ctx{roles = [<<"_admin">>]}}. create_db() -> {ok, _} = couch_db:create(test_db_name(), [admin_user_ctx()]). delete_db() -> couch_server:delete(test_db_name(), [admin_user_ctx()]). add_design_doc(Db) -> DDoc = couch_doc:from_json_obj({[ {<<"_id">>, <<"_design/foo">>}, {<<"language">>, <<"javascript">>}, {<<"views">>, {[ {<<"foo">>, {[ {<<"map">>, <<"function(doc) { emit(doc._id, doc); }">>} ]}}, {<<"foo2">>, {[ {<<"map">>, <<"function(doc) { emit(doc._id, doc); }">>} ]}}, {<<"foo3">>, {[ {<<"map">>, <<"function(doc) { emit(doc._id, doc); }">>} ]}} ]}} ]}), {ok, _} = couch_db:update_docs(Db, [DDoc]), {ok, _} = couch_db:ensure_full_commit(Db), ok. populate(DbFrag, ViewFrag, MinFileSize) -> {CurDbFrag, DbFileSize} = get_db_frag(), {CurViewFrag, ViewFileSize} = get_view_frag(), populate( DbFrag, ViewFrag, MinFileSize, CurDbFrag, CurViewFrag, lists:min([DbFileSize, ViewFileSize])). populate(DbFrag, ViewFrag, MinFileSize, CurDbFrag, CurViewFrag, FileSize) when CurDbFrag >= DbFrag, CurViewFrag >= ViewFrag, FileSize >= MinFileSize -> ok; populate(DbFrag, ViewFrag, MinFileSize, _, _, _) -> update(), {CurDbFrag, DbFileSize} = get_db_frag(), {CurViewFrag, ViewFileSize} = get_view_frag(), populate( DbFrag, ViewFrag, MinFileSize, CurDbFrag, CurViewFrag, lists:min([DbFileSize, ViewFileSize])). update() -> {ok, Db} = couch_db:open_int(test_db_name(), []), lists:foreach(fun(_) -> Doc = couch_doc:from_json_obj({[{<<"_id">>, couch_uuids:new()}]}), {ok, _} = couch_db:update_docs(Db, [Doc]), query_view() end, lists:seq(1, 100)), couch_db:close(Db). db_url() -> "http://" ++ get(addr) ++ ":" ++ get(port) ++ "/" ++ binary_to_list(test_db_name()). query_view() -> {ok, Code, _Headers, _Body} = test_util:request( db_url() ++ "/_design/foo/_view/foo", [], get), case Code of 200 -> ok; _ -> etap:bail("error querying view") end. get_db_frag() -> {ok, Db} = couch_db:open_int(test_db_name(), []), {ok, Info} = couch_db:get_db_info(Db), couch_db:close(Db), FileSize = couch_util:get_value(disk_size, Info), DataSize = couch_util:get_value(data_size, Info), {round((FileSize - DataSize) / FileSize * 100), FileSize}. get_view_frag() -> {ok, Db} = couch_db:open_int(test_db_name(), []), {ok, Info} = couch_mrview:get_info(Db, <<"_design/foo">>), couch_db:close(Db), FileSize = couch_util:get_value(disk_size, Info), DataSize = couch_util:get_value(data_size, Info), {round((FileSize - DataSize) / FileSize * 100), FileSize}. wait_compaction_finished() -> Parent = self(), Loop = spawn_link(fun() -> wait_loop(Parent) end), receive {done, Loop} -> etap:diag("Database and view compaction have finished") after 60000 -> etap:bail("Compaction not triggered") end. wait_loop(Parent) -> {ok, Db} = couch_db:open_int(test_db_name(), []), {ok, DbInfo} = couch_db:get_db_info(Db), {ok, ViewInfo} = couch_mrview:get_info(Db, <<"_design/foo">>), couch_db:close(Db), case (couch_util:get_value(compact_running, ViewInfo) =:= true) orelse (couch_util:get_value(compact_running, DbInfo) =:= true) of false -> Parent ! {done, self()}; true -> ok = timer:sleep(500), wait_loop(Parent) end. apache-couchdb-1.6.0/test/etap/065-kt-stemming.t0000755000175000001440000000261612332105522021172 0ustar00djcusers00000000000000#!/usr/bin/env escript %% -*- erlang -*- % Licensed under the Apache License, Version 2.0 (the "License"); you may not % use this file except in compliance with the License. You may obtain a copy of % the License at % % http://www.apache.org/licenses/LICENSE-2.0 % % Unless required by applicable law or agreed to in writing, software % distributed under the License is distributed on an "AS IS" BASIS, WITHOUT % WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the % License for the specific language governing permissions and limitations under % the License. main(_) -> test_util:init_code_path(), etap:plan(3), case (catch test()) of ok -> etap:end_tests(); Other -> etap:diag(io_lib:format("Test died abnormally: ~p", [Other])), etap:bail(Other) end, ok. test() -> TwoChild = [{0, {"1","foo", [{"1a", "bar", [{"1aa", "bar", []}]}]}}], Stemmed1 = [{1, {"1a", "bar", [{"1aa", "bar", []}]}}], Stemmed2 = [{2, {"1aa", "bar", []}}], etap:is(TwoChild, couch_key_tree:stem(TwoChild, 3), "Stemming more levels than what exists does nothing."), etap:is(Stemmed1, couch_key_tree:stem(TwoChild, 2), "Stemming with a depth of two returns the deepest two nodes."), etap:is(Stemmed2, couch_key_tree:stem(TwoChild, 1), "Stemming to a depth of one returns the deepest node."), ok. apache-couchdb-1.6.0/test/etap/080-config-get-set.t0000755000175000001440000000642412332105522021544 0ustar00djcusers00000000000000#!/usr/bin/env escript %% -*- erlang -*- % Licensed under the Apache License, Version 2.0 (the "License"); you may not % use this file except in compliance with the License. You may obtain a copy of % the License at % % http://www.apache.org/licenses/LICENSE-2.0 % % Unless required by applicable law or agreed to in writing, software % distributed under the License is distributed on an "AS IS" BASIS, WITHOUT % WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the % License for the specific language governing permissions and limitations under % the License. default_config() -> test_util:build_file("etc/couchdb/default_dev.ini"). main(_) -> test_util:init_code_path(), etap:plan(12), case (catch test()) of ok -> etap:end_tests(); Other -> etap:diag(io_lib:format("Test died abnormally: ~p", [Other])), etap:bail(Other) end, ok. test() -> % start couch_config with default couch_config:start_link([default_config()]), % Check that we can get values etap:fun_is( fun(List) -> length(List) > 0 end, couch_config:all(), "Data was loaded from the INI file." ), etap:fun_is( fun(List) -> length(List) > 0 end, couch_config:get("daemons"), "There are settings in the [daemons] section of the INI file." ), etap:is( couch_config:get("httpd_design_handlers", "_view"), "{couch_mrview_http, handle_view_req}", "The {httpd_design_handlers, view} is the expected default." ), etap:is( couch_config:get("httpd", "foo", "bar"), "bar", "Returns the default when key doesn't exist in config." ), etap:is( couch_config:get("httpd", "foo"), undefined, "The default default is the atom 'undefined'." ), etap:is( couch_config:get("httpd", "port", "bar"), "5984", "Only returns the default when the config setting does not exist." ), % Check that setting values works. ok = couch_config:set("log", "level", "severe", false), etap:is( couch_config:get("log", "level"), "severe", "Non persisted changes take effect." ), etap:is( couch_config:get("new_section", "bizzle"), undefined, "Section 'new_section' does not exist." ), ok = couch_config:set("new_section", "bizzle", "bang", false), etap:is( couch_config:get("new_section", "bizzle"), "bang", "New section 'new_section' was created for a new key/value pair." ), % Check that deleting works ok = couch_config:delete("new_section", "bizzle", false), etap:is( couch_config:get("new_section", "bizzle"), undefined, "Deleting sets the value to \"\"" ), % Check ge/set/delete binary strings ok = couch_config:set(<<"foo">>, <<"bar">>, <<"baz">>, false), etap:is( couch_config:get(<<"foo">>, <<"bar">>), <<"baz">>, "Can get and set with binary section and key values." ), ok = couch_config:delete(<<"foo">>, <<"bar">>, false), etap:is( couch_config:get(<<"foo">>, <<"bar">>), undefined, "Deleting with binary section/key pairs sets the value to \"\"" ), ok. apache-couchdb-1.6.0/test/etap/test_web.erl0000644000175000001440000000641512332105522020554 0ustar00djcusers00000000000000% Licensed under the Apache License, Version 2.0 (the "License"); you may not % use this file except in compliance with the License. You may obtain a copy of % the License at % % http://www.apache.org/licenses/LICENSE-2.0 % % Unless required by applicable law or agreed to in writing, software % distributed under the License is distributed on an "AS IS" BASIS, WITHOUT % WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the % License for the specific language governing permissions and limitations under % the License. -module(test_web). -behaviour(gen_server). -export([start_link/0, loop/1, get_port/0, set_assert/1, check_last/0]). -export([init/1, terminate/2, code_change/3]). -export([handle_call/3, handle_cast/2, handle_info/2]). -define(SERVER, test_web_server). -define(HANDLER, test_web_handler). start_link() -> gen_server:start({local, ?HANDLER}, ?MODULE, [], []), mochiweb_http:start([ {name, ?SERVER}, {loop, {?MODULE, loop}}, {port, 0} ]). loop(Req) -> %etap:diag("Handling request: ~p", [Req]), case gen_server:call(?HANDLER, {check_request, Req}) of {ok, RespInfo} -> {ok, Req:respond(RespInfo)}; {raw, {Status, Headers, BodyChunks}} -> Resp = Req:start_response({Status, Headers}), lists:foreach(fun(C) -> Resp:send(C) end, BodyChunks), erlang:put(mochiweb_request_force_close, true), {ok, Resp}; {chunked, {Status, Headers, BodyChunks}} -> Resp = Req:respond({Status, Headers, chunked}), timer:sleep(500), lists:foreach(fun(C) -> Resp:write_chunk(C) end, BodyChunks), Resp:write_chunk([]), {ok, Resp}; {error, Reason} -> etap:diag("Error: ~p", [Reason]), Body = lists:flatten(io_lib:format("Error: ~p", [Reason])), {ok, Req:respond({200, [], Body})} end. get_port() -> mochiweb_socket_server:get(?SERVER, port). set_assert(Fun) -> ok = gen_server:call(?HANDLER, {set_assert, Fun}). check_last() -> gen_server:call(?HANDLER, last_status). init(_) -> {ok, nil}. terminate(_Reason, _State) -> ok. handle_call({check_request, Req}, _From, State) when is_function(State, 1) -> Resp2 = case (catch State(Req)) of {ok, Resp} -> {reply, {ok, Resp}, was_ok}; {raw, Resp} -> {reply, {raw, Resp}, was_ok}; {chunked, Resp} -> {reply, {chunked, Resp}, was_ok}; Error -> {reply, {error, Error}, not_ok} end, Req:cleanup(), Resp2; handle_call({check_request, _Req}, _From, _State) -> {reply, {error, no_assert_function}, not_ok}; handle_call(last_status, _From, State) when is_atom(State) -> {reply, State, nil}; handle_call(last_status, _From, State) -> {reply, {error, not_checked}, State}; handle_call({set_assert, Fun}, _From, nil) -> {reply, ok, Fun}; handle_call({set_assert, _}, _From, State) -> {reply, {error, assert_function_set}, State}; handle_call(Msg, _From, State) -> {reply, {ignored, Msg}, State}. handle_cast(Msg, State) -> etap:diag("Ignoring cast message: ~p", [Msg]), {noreply, State}. handle_info(Msg, State) -> etap:diag("Ignoring info message: ~p", [Msg]), {noreply, State}. code_change(_OldVsn, State, _Extra) -> {ok, State}. apache-couchdb-1.6.0/test/etap/150-invalid-view-seq.t0000755000175000001440000001303712332105522022111 0ustar00djcusers00000000000000#!/usr/bin/env escript %% -*- erlang -*- % Licensed under the Apache License, Version 2.0 (the "License"); you may not % use this file except in compliance with the License. You may obtain a copy of % the License at % % http://www.apache.org/licenses/LICENSE-2.0 % % Unless required by applicable law or agreed to in writing, software % distributed under the License is distributed on an "AS IS" BASIS, WITHOUT % WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the % License for the specific language governing permissions and limitations under % the License. -record(user_ctx, { name = null, roles = [], handler }). test_db_name() -> <<"couch_test_invalid_view_seq">>. main(_) -> test_util:init_code_path(), etap:plan(10), case (catch test()) of ok -> etap:end_tests(); Other -> etap:diag(io_lib:format("Test died abnormally: ~p", [Other])), etap:bail(Other) end, ok. %% NOTE: since during the test we stop the server, %% a huge and ugly but harmless stack trace is sent to stderr %% test() -> couch_server_sup:start_link(test_util:config_files()), timer:sleep(1000), delete_db(), create_db(), create_docs(), create_design_doc(), % make DB file backup backup_db_file(), put(addr, couch_config:get("httpd", "bind_address", "127.0.0.1")), put(port, integer_to_list(mochiweb_socket_server:get(couch_httpd, port))), create_new_doc(), query_view_before_restore_backup(), % restore DB file backup after querying view restore_backup_db_file(), query_view_after_restore_backup(), delete_db(), couch_server_sup:stop(), ok. admin_user_ctx() -> {user_ctx, #user_ctx{roles=[<<"_admin">>]}}. create_db() -> {ok, _} = couch_db:create(test_db_name(), [admin_user_ctx()]). delete_db() -> couch_server:delete(test_db_name(), [admin_user_ctx()]). create_docs() -> {ok, Db} = couch_db:open(test_db_name(), [admin_user_ctx()]), Doc1 = couch_doc:from_json_obj({[ {<<"_id">>, <<"doc1">>}, {<<"value">>, 1} ]}), Doc2 = couch_doc:from_json_obj({[ {<<"_id">>, <<"doc2">>}, {<<"value">>, 2} ]}), Doc3 = couch_doc:from_json_obj({[ {<<"_id">>, <<"doc3">>}, {<<"value">>, 3} ]}), {ok, _} = couch_db:update_docs(Db, [Doc1, Doc2, Doc3]), couch_db:ensure_full_commit(Db), couch_db:close(Db). create_design_doc() -> {ok, Db} = couch_db:open(test_db_name(), [admin_user_ctx()]), DDoc = couch_doc:from_json_obj({[ {<<"_id">>, <<"_design/foo">>}, {<<"language">>, <<"javascript">>}, {<<"views">>, {[ {<<"bar">>, {[ {<<"map">>, <<"function(doc) { emit(doc.value, 1); }">>} ]}} ]}} ]}), {ok, _} = couch_db:update_docs(Db, [DDoc]), couch_db:ensure_full_commit(Db), couch_db:close(Db). backup_db_file() -> DbFile = test_util:build_file("tmp/lib/" ++ binary_to_list(test_db_name()) ++ ".couch"), {ok, _} = file:copy(DbFile, DbFile ++ ".backup"), ok. create_new_doc() -> {ok, Db} = couch_db:open(test_db_name(), [admin_user_ctx()]), Doc666 = couch_doc:from_json_obj({[ {<<"_id">>, <<"doc666">>}, {<<"value">>, 999} ]}), {ok, _} = couch_db:update_docs(Db, [Doc666]), couch_db:ensure_full_commit(Db), couch_db:close(Db). db_url() -> "http://" ++ get(addr) ++ ":" ++ get(port) ++ "/" ++ binary_to_list(test_db_name()). query_view_before_restore_backup() -> {ok, Code, _Headers, Body} = test_util:request( db_url() ++ "/_design/foo/_view/bar", [], get), etap:is(Code, 200, "Got view response before restoring backup."), ViewJson = ejson:decode(Body), Rows = couch_util:get_nested_json_value(ViewJson, [<<"rows">>]), HasDoc1 = has_doc("doc1", Rows), HasDoc2 = has_doc("doc2", Rows), HasDoc3 = has_doc("doc3", Rows), HasDoc666 = has_doc("doc666", Rows), etap:is(HasDoc1, true, "Before backup restore, view has doc1"), etap:is(HasDoc2, true, "Before backup restore, view has doc2"), etap:is(HasDoc3, true, "Before backup restore, view has doc3"), etap:is(HasDoc666, true, "Before backup restore, view has doc666"), ok. has_doc(DocId1, Rows) -> DocId = iolist_to_binary(DocId1), lists:any( fun({R}) -> lists:member({<<"id">>, DocId}, R) end, Rows ). restore_backup_db_file() -> couch_server_sup:stop(), timer:sleep(3000), DbFile = test_util:build_file("tmp/lib/" ++ binary_to_list(test_db_name()) ++ ".couch"), ok = file:delete(DbFile), ok = file:rename(DbFile ++ ".backup", DbFile), couch_server_sup:start_link(test_util:config_files()), timer:sleep(1000), put(port, integer_to_list(mochiweb_socket_server:get(couch_httpd, port))), ok. query_view_after_restore_backup() -> {ok, Code, _Headers, Body} = test_util:request( db_url() ++ "/_design/foo/_view/bar", [], get), etap:is(Code, 200, "Got view response after restoring backup."), ViewJson = ejson:decode(Body), Rows = couch_util:get_nested_json_value(ViewJson, [<<"rows">>]), HasDoc1 = has_doc("doc1", Rows), HasDoc2 = has_doc("doc2", Rows), HasDoc3 = has_doc("doc3", Rows), HasDoc666 = has_doc("doc666", Rows), etap:is(HasDoc1, true, "After backup restore, view has doc1"), etap:is(HasDoc2, true, "After backup restore, view has doc2"), etap:is(HasDoc3, true, "After backup restore, view has doc3"), etap:is(HasDoc666, false, "After backup restore, view does not have doc666"), ok. apache-couchdb-1.6.0/test/etap/083-config-no-files.t0000755000175000001440000000270612332105522021712 0ustar00djcusers00000000000000#!/usr/bin/env escript %% -*- erlang -*- % Licensed under the Apache License, Version 2.0 (the "License"); you may not % use this file except in compliance with the License. You may obtain a copy of % the License at % % http://www.apache.org/licenses/LICENSE-2.0 % % Unless required by applicable law or agreed to in writing, software % distributed under the License is distributed on an "AS IS" BASIS, WITHOUT % WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the % License for the specific language governing permissions and limitations under % the License. main(_) -> test_util:init_code_path(), etap:plan(3), case (catch test()) of ok -> etap:end_tests(); Other -> etap:diag(io_lib:format("Test died abnormally: ~p", [Other])), etap:bail(Other) end, ok. test() -> couch_config:start_link([]), etap:fun_is( fun(KVPairs) -> length(KVPairs) == 0 end, couch_config:all(), "No INI files specified returns 0 key/value pairs." ), ok = couch_config:set("httpd", "port", "80", false), etap:is( couch_config:get("httpd", "port"), "80", "Created a new non-persisted k/v pair." ), ok = couch_config:set("httpd", "bind_address", "127.0.0.1"), etap:is( couch_config:get("httpd", "bind_address"), "127.0.0.1", "Asking for a persistent key/value pair doesn't choke." ), ok. apache-couchdb-1.6.0/test/etap/200-view-group-no-db-leaks.t0000755000175000001440000002272612332105522023124 0ustar00djcusers00000000000000#!/usr/bin/env escript %% -*- erlang -*- % Licensed under the Apache License, Version 2.0 (the "License"); you may not % use this file except in compliance with the License. You may obtain a copy of % the License at % % http://www.apache.org/licenses/LICENSE-2.0 % % Unless required by applicable law or agreed to in writing, software % distributed under the License is distributed on an "AS IS" BASIS, WITHOUT % WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the % License for the specific language governing permissions and limitations under % the License. -record(user_ctx, { name = null, roles = [], handler }). -record(db, { main_pid = nil, update_pid = nil, compactor_pid = nil, instance_start_time, % number of microsecs since jan 1 1970 as a binary string fd, updater_fd, fd_ref_counter, header = nil, committed_update_seq, fulldocinfo_by_id_btree, docinfo_by_seq_btree, local_docs_btree, update_seq, name, filepath, validate_doc_funs = [], security = [], security_ptr = nil, user_ctx = #user_ctx{}, waiting_delayed_commit = nil, revs_limit = 1000, fsync_options = [], options = [], compression, before_doc_update, after_doc_read }). test_db_name() -> <<"couch_test_view_group_db_leaks">>. ddoc_name() -> <<"foo">>. main(_) -> test_util:init_code_path(), etap:plan(28), case (catch test()) of ok -> etap:end_tests(); Other -> etap:diag(io_lib:format("Test died abnormally: ~p", [Other])), etap:bail(Other) end, ok. test() -> couch_server_sup:start_link(test_util:config_files()), timer:sleep(1000), put(addr, couch_config:get("httpd", "bind_address", "127.0.0.1")), put(port, integer_to_list(mochiweb_socket_server:get(couch_httpd, port))), delete_db(), create_db(), create_docs(), {ok, DDocRev} = create_design_doc(), {ok, IndexerPid} = couch_index_server:get_index( couch_mrview_index, test_db_name(), <<"_design/", (ddoc_name())/binary>> ), etap:is(is_pid(IndexerPid), true, "got view group pid"), etap:is(is_process_alive(IndexerPid), true, "view group pid is alive"), query_view(3, null, false), check_db_ref_count(), etap:is(is_process_alive(IndexerPid), true, "view group pid is alive"), create_new_doc(<<"doc1000">>), query_view(4, null, false), check_db_ref_count(), etap:is(is_process_alive(IndexerPid), true, "view group pid is alive"), Ref1 = get_db_ref_counter(), compact_db(), check_db_ref_count(), Ref2 = get_db_ref_counter(), etap:isnt(Ref1, Ref2, "DB ref counter changed"), etap:is(false, is_process_alive(Ref1), "old DB ref counter is not alive"), etap:is(is_process_alive(IndexerPid), true, "view group pid is alive"), compact_view_group(), check_db_ref_count(), Ref3 = get_db_ref_counter(), etap:is(Ref3, Ref2, "DB ref counter didn't change"), etap:is(is_process_alive(IndexerPid), true, "view group pid is alive"), create_new_doc(<<"doc1001">>), query_view(5, null, false), check_db_ref_count(), etap:is(is_process_alive(IndexerPid), true, "view group pid is alive"), etap:diag("updating the design document with a new view definition"), {ok, _NewDDocRev} = update_ddoc_view(DDocRev), {ok, NewIndexerPid} = couch_index_server:get_index( couch_mrview_index, test_db_name(), <<"_design/", (ddoc_name())/binary>> ), etap:is(is_pid(NewIndexerPid), true, "got new view group pid"), etap:is(is_process_alive(NewIndexerPid), true, "new view group pid is alive"), etap:isnt(NewIndexerPid, IndexerPid, "new view group has a different pid"), etap:diag("querying view with ?stale=ok, must return empty row set"), query_view(0, foo, ok), etap:diag("querying view (without stale), must return 5 rows with value 1"), query_view(5, 1, false), MonRef = erlang:monitor(process, IndexerPid), receive {'DOWN', MonRef, _, _, _} -> etap:diag("old view group is dead after ddoc update") after 5000 -> etap:bail("old view group is not dead after ddoc update") end, etap:diag("deleting database"), MonRef2 = erlang:monitor(process, NewIndexerPid), ok = couch_server:delete(test_db_name(), []), receive {'DOWN', MonRef2, _, _, _} -> etap:diag("new view group is dead after DB deletion") after 5000 -> etap:bail("new view group did not die after DB deletion") end, ok = timer:sleep(1000), delete_db(), couch_server_sup:stop(), ok. admin_user_ctx() -> {user_ctx, #user_ctx{roles=[<<"_admin">>]}}. create_db() -> {ok, #db{main_pid = Pid} = Db} = couch_db:create( test_db_name(), [admin_user_ctx()]), put(db_main_pid, Pid), ok = couch_db:close(Db). delete_db() -> couch_server:delete(test_db_name(), [admin_user_ctx()]). compact_db() -> {ok, Db} = couch_db:open_int(test_db_name(), []), {ok, _} = couch_db:start_compact(Db), ok = couch_db:close(Db), wait_db_compact_done(10). wait_db_compact_done(0) -> etap:bail("DB compaction failed to finish."); wait_db_compact_done(N) -> {ok, Db} = couch_db:open_int(test_db_name(), []), ok = couch_db:close(Db), case is_pid(Db#db.compactor_pid) of false -> ok; true -> ok = timer:sleep(500), wait_db_compact_done(N - 1) end. compact_view_group() -> DDoc = list_to_binary("_design/" ++ binary_to_list(ddoc_name())), ok = couch_mrview:compact(test_db_name(), DDoc), wait_view_compact_done(10). wait_view_compact_done(0) -> etap:bail("View group compaction failed to finish."); wait_view_compact_done(N) -> {ok, Code, _Headers, Body} = test_util:request( db_url() ++ "/_design/" ++ binary_to_list(ddoc_name()) ++ "/_info", [], get), case Code of 200 -> ok; _ -> etap:bail("Invalid view group info.") end, {Info} = ejson:decode(Body), {IndexInfo} = couch_util:get_value(<<"view_index">>, Info), CompactRunning = couch_util:get_value(<<"compact_running">>, IndexInfo), case CompactRunning of false -> ok; true -> ok = timer:sleep(500), wait_view_compact_done(N - 1) end. get_db_ref_counter() -> {ok, #db{fd_ref_counter = Ref} = Db} = couch_db:open_int(test_db_name(), []), ok = couch_db:close(Db), Ref. check_db_ref_count() -> {ok, #db{fd_ref_counter = Ref} = Db} = couch_db:open_int(test_db_name(), []), ok = couch_db:close(Db), timer:sleep(200), % sleep a bit to prevent race condition etap:is(couch_ref_counter:count(Ref), 2, "DB ref counter is only held by couch_db and couch_db_updater"), ok. create_docs() -> {ok, Db} = couch_db:open(test_db_name(), [admin_user_ctx()]), Doc1 = couch_doc:from_json_obj({[ {<<"_id">>, <<"doc1">>}, {<<"value">>, 1} ]}), Doc2 = couch_doc:from_json_obj({[ {<<"_id">>, <<"doc2">>}, {<<"value">>, 2} ]}), Doc3 = couch_doc:from_json_obj({[ {<<"_id">>, <<"doc3">>}, {<<"value">>, 3} ]}), {ok, _} = couch_db:update_docs(Db, [Doc1, Doc2, Doc3]), couch_db:ensure_full_commit(Db), couch_db:close(Db). create_design_doc() -> {ok, Db} = couch_db:open(test_db_name(), [admin_user_ctx()]), DDoc = couch_doc:from_json_obj({[ {<<"_id">>, <<"_design/", (ddoc_name())/binary>>}, {<<"language">>, <<"javascript">>}, {<<"views">>, {[ {<<"bar">>, {[ {<<"map">>, <<"function(doc) { emit(doc._id, null); }">>} ]}} ]}} ]}), {ok, Rev} = couch_db:update_doc(Db, DDoc, []), couch_db:ensure_full_commit(Db), couch_db:close(Db), {ok, Rev}. update_ddoc_view(DDocRev) -> {ok, Db} = couch_db:open(test_db_name(), [admin_user_ctx()]), DDoc = couch_doc:from_json_obj({[ {<<"_id">>, <<"_design/", (ddoc_name())/binary>>}, {<<"_rev">>, couch_doc:rev_to_str(DDocRev)}, {<<"language">>, <<"javascript">>}, {<<"views">>, {[ {<<"bar">>, {[ {<<"map">>, <<"function(doc) { emit(doc._id, 1); }">>} ]}} ]}} ]}), {ok, NewRev} = couch_db:update_doc(Db, DDoc, []), couch_db:ensure_full_commit(Db), couch_db:close(Db), {ok, NewRev}. create_new_doc(Id) -> {ok, Db} = couch_db:open(test_db_name(), [admin_user_ctx()]), Doc666 = couch_doc:from_json_obj({[ {<<"_id">>, Id}, {<<"value">>, 999} ]}), {ok, _} = couch_db:update_docs(Db, [Doc666]), couch_db:ensure_full_commit(Db), couch_db:close(Db). db_url() -> "http://" ++ get(addr) ++ ":" ++ get(port) ++ "/" ++ binary_to_list(test_db_name()). query_view(ExpectedRowCount, ExpectedRowValue, Stale) -> {ok, Code, _Headers, Body} = test_util:request( db_url() ++ "/_design/" ++ binary_to_list(ddoc_name()) ++ "/_view/bar" ++ case Stale of false -> []; _ -> "?stale=" ++ atom_to_list(Stale) end, [], get), etap:is(Code, 200, "got view response"), {Props} = ejson:decode(Body), Rows = couch_util:get_value(<<"rows">>, Props, []), etap:is(length(Rows), ExpectedRowCount, "result set has correct # of rows"), lists:foreach( fun({Row}) -> case couch_util:get_value(<<"value">>, Row) of ExpectedRowValue -> ok; _ -> etap:bail("row has incorrect value") end end, Rows). apache-couchdb-1.6.0/test/etap/140-attachment-comp.t0000755000175000001440000005750512332105522022020 0ustar00djcusers00000000000000#!/usr/bin/env escript %% -*- erlang -*- % Licensed under the Apache License, Version 2.0 (the "License"); you may not % use this file except in compliance with the License. You may obtain a copy of % the License at % % http://www.apache.org/licenses/LICENSE-2.0 % % Unless required by applicable law or agreed to in writing, software % distributed under the License is distributed on an "AS IS" BASIS, WITHOUT % WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the % License for the specific language governing permissions and limitations under % the License. test_db_name() -> <<"couch_test_atts_compression">>. main(_) -> test_util:init_code_path(), etap:plan(85), case (catch test()) of ok -> etap:end_tests(); Other -> etap:diag(io_lib:format("Test died abnormally: ~p", [Other])), etap:bail(Other) end, ok. test() -> couch_server_sup:start_link(test_util:config_files()), put(addr, couch_config:get("httpd", "bind_address", "127.0.0.1")), put(port, integer_to_list(mochiweb_socket_server:get(couch_httpd, port))), timer:sleep(1000), couch_server:delete(test_db_name(), []), couch_db:create(test_db_name(), []), couch_config:set("attachments", "compression_level", "8", false), couch_config:set("attachments", "compressible_types", "text/*", false), create_1st_text_att(), create_1st_png_att(), create_2nd_text_att(), create_2nd_png_att(), tests_for_1st_text_att(), tests_for_1st_png_att(), tests_for_2nd_text_att(), tests_for_2nd_png_att(), create_already_compressed_att(db_url() ++ "/doc_comp_att", "readme.txt"), test_already_compressed_att(db_url() ++ "/doc_comp_att", "readme.txt"), test_create_already_compressed_att_with_invalid_content_encoding( db_url() ++ "/doc_att_deflate", "readme.txt", zlib:compress(test_text_data()), "deflate" ), % COUCHDB-1711 - avoid weird timng/scheduling/request handling issue timer:sleep(100), test_create_already_compressed_att_with_invalid_content_encoding( db_url() ++ "/doc_att_compress", "readme.txt", % Note: As of OTP R13B04, it seems there's no LZW compression % (i.e. UNIX compress utility implementation) lib in OTP. % However there's a simple working Erlang implementation at: % http://scienceblogs.com/goodmath/2008/01/simple_lempelziv_compression_i.php test_text_data(), "compress" ), test_compressible_type_with_parameters(), timer:sleep(3000), % to avoid mochiweb socket closed exceptions couch_server:delete(test_db_name(), []), couch_server_sup:stop(), ok. db_url() -> "http://" ++ get(addr) ++ ":" ++ get(port) ++ "/" ++ binary_to_list(test_db_name()). create_1st_text_att() -> {ok, Code, _Headers, _Body} = test_util:request( db_url() ++ "/testdoc1/readme.txt", [{"Content-Type", "text/plain"}], put, test_text_data()), etap:is(Code, 201, "Created text attachment using the standalone api"), ok. create_1st_png_att() -> {ok, Code, _Headers, _Body} = test_util:request( db_url() ++ "/testdoc2/icon.png", [{"Content-Type", "image/png"}], put, test_png_data()), etap:is(Code, 201, "Created png attachment using the standalone api"), ok. % create a text attachment using the non-standalone attachment api create_2nd_text_att() -> DocJson = {[ {<<"_attachments">>, {[ {<<"readme.txt">>, {[ {<<"content_type">>, <<"text/plain">>}, {<<"data">>, base64:encode(test_text_data())} ]} }]}} ]}, {ok, Code, _Headers, _Body} = test_util:request( db_url() ++ "/testdoc3", [{"Content-Type", "application/json"}], put, ejson:encode(DocJson)), etap:is(Code, 201, "Created text attachment using the non-standalone api"), ok. % create a png attachment using the non-standalone attachment api create_2nd_png_att() -> DocJson = {[ {<<"_attachments">>, {[ {<<"icon.png">>, {[ {<<"content_type">>, <<"image/png">>}, {<<"data">>, base64:encode(test_png_data())} ]} }]}} ]}, {ok, Code, _Headers, _Body} = test_util:request( db_url() ++ "/testdoc4", [{"Content-Type", "application/json"}], put, ejson:encode(DocJson)), etap:is(Code, 201, "Created png attachment using the non-standalone api"), ok. create_already_compressed_att(DocUri, AttName) -> {ok, Code, _Headers, _Body} = test_util:request( DocUri ++ "/" ++ AttName, [{"Content-Type", "text/plain"}, {"Content-Encoding", "gzip"}], put, zlib:gzip(test_text_data())), etap:is( Code, 201, "Created already compressed attachment using the standalone api" ), ok. tests_for_1st_text_att() -> test_get_1st_text_att_with_accept_encoding_gzip(), test_get_1st_text_att_without_accept_encoding_header(), test_get_1st_text_att_with_accept_encoding_deflate(), test_get_1st_text_att_with_accept_encoding_deflate_only(), test_get_doc_with_1st_text_att(), test_1st_text_att_stub(). tests_for_1st_png_att() -> test_get_1st_png_att_without_accept_encoding_header(), test_get_1st_png_att_with_accept_encoding_gzip(), test_get_1st_png_att_with_accept_encoding_deflate(), test_get_doc_with_1st_png_att(), test_1st_png_att_stub(). tests_for_2nd_text_att() -> test_get_2nd_text_att_with_accept_encoding_gzip(), test_get_2nd_text_att_without_accept_encoding_header(), test_get_doc_with_2nd_text_att(), test_2nd_text_att_stub(). tests_for_2nd_png_att() -> test_get_2nd_png_att_without_accept_encoding_header(), test_get_2nd_png_att_with_accept_encoding_gzip(), test_get_doc_with_2nd_png_att(), test_2nd_png_att_stub(). test_get_1st_text_att_with_accept_encoding_gzip() -> {ok, Code, Headers, Body} = test_util:request( db_url() ++ "/testdoc1/readme.txt", [{"Accept-Encoding", "gzip"}], get), etap:is(Code, 200, "HTTP response code is 200"), Gziped = lists:member({"Content-Encoding", "gzip"}, Headers), etap:is(Gziped, true, "received body is gziped"), Uncompressed = zlib:gunzip(iolist_to_binary(Body)), etap:is( Uncompressed, test_text_data(), "received data for the 1st text attachment is ok" ), ok. test_get_1st_text_att_without_accept_encoding_header() -> {ok, Code, Headers, Body} = test_util:request( db_url() ++ "/testdoc1/readme.txt", [], get), etap:is(Code, 200, "HTTP response code is 200"), Gziped = lists:member({"Content-Encoding", "gzip"}, Headers), etap:is(Gziped, false, "received body is not gziped"), etap:is( iolist_to_binary(Body), test_text_data(), "received data for the 1st text attachment is ok" ), ok. test_get_1st_text_att_with_accept_encoding_deflate() -> {ok, Code, Headers, Body} = test_util:request( db_url() ++ "/testdoc1/readme.txt", [{"Accept-Encoding", "deflate"}], get), etap:is(Code, 200, "HTTP response code is 200"), Gziped = lists:member({"Content-Encoding", "gzip"}, Headers), etap:is(Gziped, false, "received body is not gziped"), Deflated = lists:member({"Content-Encoding", "deflate"}, Headers), etap:is(Deflated, false, "received body is not deflated"), etap:is( iolist_to_binary(Body), test_text_data(), "received data for the 1st text attachment is ok" ), ok. test_get_1st_text_att_with_accept_encoding_deflate_only() -> {ok, Code, _Headers, _Body} = test_util:request( db_url() ++ "/testdoc1/readme.txt", [{"Accept-Encoding", "deflate, *;q=0"}], get), etap:is( Code, 406, "HTTP response code is 406 for an unsupported content encoding request" ), ok. test_get_1st_png_att_without_accept_encoding_header() -> {ok, Code, Headers, Body} = test_util:request( db_url() ++ "/testdoc2/icon.png", [], get), etap:is(Code, 200, "HTTP response code is 200"), Encoding = couch_util:get_value("Content-Encoding", Headers), etap:is(Encoding, undefined, "received body is not gziped"), etap:is( iolist_to_binary(Body), test_png_data(), "received data for the 1st png attachment is ok" ), ok. test_get_1st_png_att_with_accept_encoding_gzip() -> {ok, Code, Headers, Body} = test_util:request( db_url() ++ "/testdoc2/icon.png", [{"Accept-Encoding", "gzip"}], get), etap:is(Code, 200, "HTTP response code is 200"), Encoding = couch_util:get_value("Content-Encoding", Headers), etap:is(Encoding, undefined, "received body is not gziped"), etap:is( iolist_to_binary(Body), test_png_data(), "received data for the 1st png attachment is ok" ), ok. test_get_1st_png_att_with_accept_encoding_deflate() -> {ok, Code, Headers, Body} = test_util:request( db_url() ++ "/testdoc2/icon.png", [{"Accept-Encoding", "deflate"}], get), etap:is(Code, 200, "HTTP response code is 200"), Encoding = couch_util:get_value("Content-Encoding", Headers), etap:is(Encoding, undefined, "received body is in identity form"), etap:is( iolist_to_binary(Body), test_png_data(), "received data for the 1st png attachment is ok" ), ok. test_get_doc_with_1st_text_att() -> {ok, Code, _Headers, Body} = test_util:request( db_url() ++ "/testdoc1?attachments=true", [{"Accept", "application/json"}], get), etap:is(Code, 200, "HTTP response code is 200"), Json = ejson:decode(Body), TextAttJson = couch_util:get_nested_json_value( Json, [<<"_attachments">>, <<"readme.txt">>] ), TextAttType = couch_util:get_nested_json_value( TextAttJson, [<<"content_type">>] ), TextAttData = couch_util:get_nested_json_value( TextAttJson, [<<"data">>] ), etap:is( TextAttType, <<"text/plain">>, "1st text attachment has type text/plain" ), %% check the attachment's data is the base64 encoding of the plain text %% and not the base64 encoding of the gziped plain text etap:is( TextAttData, base64:encode(test_text_data()), "1st text attachment data is properly base64 encoded" ), ok. test_1st_text_att_stub() -> {ok, Code, _Headers, Body} = test_util:request( db_url() ++ "/testdoc1?att_encoding_info=true", [], get), etap:is(Code, 200, "HTTP response code is 200"), Json = ejson:decode(Body), {TextAttJson} = couch_util:get_nested_json_value( Json, [<<"_attachments">>, <<"readme.txt">>] ), TextAttLength = couch_util:get_value(<<"length">>, TextAttJson), etap:is( TextAttLength, byte_size(test_text_data()), "1st text attachment stub length matches the uncompressed length" ), TextAttEncoding = couch_util:get_value(<<"encoding">>, TextAttJson), etap:is( TextAttEncoding, <<"gzip">>, "1st text attachment stub has the encoding field set to gzip" ), TextAttEncLength = couch_util:get_value(<<"encoded_length">>, TextAttJson), etap:is( TextAttEncLength, iolist_size(zlib:gzip(test_text_data())), "1st text attachment stub encoded_length matches the compressed length" ), ok. test_get_doc_with_1st_png_att() -> {ok, Code, _Headers, Body} = test_util:request( db_url() ++ "/testdoc2?attachments=true", [{"Accept", "application/json"}], get), etap:is(Code, 200, "HTTP response code is 200"), Json = ejson:decode(Body), PngAttJson = couch_util:get_nested_json_value( Json, [<<"_attachments">>, <<"icon.png">>] ), PngAttType = couch_util:get_nested_json_value( PngAttJson, [<<"content_type">>] ), PngAttData = couch_util:get_nested_json_value( PngAttJson, [<<"data">>] ), etap:is(PngAttType, <<"image/png">>, "attachment has type image/png"), etap:is( PngAttData, base64:encode(test_png_data()), "1st png attachment data is properly base64 encoded" ), ok. test_1st_png_att_stub() -> {ok, Code, _Headers, Body} = test_util:request( db_url() ++ "/testdoc2?att_encoding_info=true", [{"Accept", "application/json"}], get), etap:is(Code, 200, "HTTP response code is 200"), Json = ejson:decode(Body), {PngAttJson} = couch_util:get_nested_json_value( Json, [<<"_attachments">>, <<"icon.png">>] ), PngAttLength = couch_util:get_value(<<"length">>, PngAttJson), etap:is( PngAttLength, byte_size(test_png_data()), "1st png attachment stub length matches the uncompressed length" ), PngEncoding = couch_util:get_value(<<"encoding">>, PngAttJson), etap:is( PngEncoding, undefined, "1st png attachment stub doesn't have an encoding field" ), PngEncLength = couch_util:get_value(<<"encoded_length">>, PngAttJson), etap:is( PngEncLength, undefined, "1st png attachment stub doesn't have an encoded_length field" ), ok. test_get_2nd_text_att_with_accept_encoding_gzip() -> {ok, Code, Headers, Body} = test_util:request( db_url() ++ "/testdoc3/readme.txt", [{"Accept-Encoding", "gzip"}], get), etap:is(Code, 200, "HTTP response code is 200"), Gziped = lists:member({"Content-Encoding", "gzip"}, Headers), etap:is(Gziped, true, "received body is gziped"), Uncompressed = zlib:gunzip(iolist_to_binary(Body)), etap:is( Uncompressed, test_text_data(), "received data for the 2nd text attachment is ok" ), ok. test_get_2nd_text_att_without_accept_encoding_header() -> {ok, Code, Headers, Body} = test_util:request( db_url() ++ "/testdoc3/readme.txt", [], get), etap:is(Code, 200, "HTTP response code is 200"), Gziped = lists:member({"Content-Encoding", "gzip"}, Headers), etap:is(Gziped, false, "received body is not gziped"), etap:is( Body, test_text_data(), "received data for the 2nd text attachment is ok" ), ok. test_get_2nd_png_att_without_accept_encoding_header() -> {ok, Code, Headers, Body} = test_util:request( db_url() ++ "/testdoc4/icon.png", [], get), etap:is(Code, 200, "HTTP response code is 200"), Gziped = lists:member({"Content-Encoding", "gzip"}, Headers), etap:is(Gziped, false, "received body is not gziped"), etap:is( Body, test_png_data(), "received data for the 2nd png attachment is ok" ), ok. test_get_2nd_png_att_with_accept_encoding_gzip() -> {ok, Code, Headers, Body} = test_util:request( db_url() ++ "/testdoc4/icon.png", [{"Accept-Encoding", "gzip"}], get), etap:is(Code, 200, "HTTP response code is 200"), Gziped = lists:member({"Content-Encoding", "gzip"}, Headers), etap:is(Gziped, false, "received body is not gziped"), etap:is( Body, test_png_data(), "received data for the 2nd png attachment is ok" ), ok. test_get_doc_with_2nd_text_att() -> {ok, Code, _Headers, Body} = test_util:request( db_url() ++ "/testdoc3?attachments=true", [{"Accept", "application/json"}], get), etap:is(Code, 200, "HTTP response code is 200"), Json = ejson:decode(Body), TextAttJson = couch_util:get_nested_json_value( Json, [<<"_attachments">>, <<"readme.txt">>] ), TextAttType = couch_util:get_nested_json_value( TextAttJson, [<<"content_type">>] ), TextAttData = couch_util:get_nested_json_value( TextAttJson, [<<"data">>] ), etap:is(TextAttType, <<"text/plain">>, "attachment has type text/plain"), %% check the attachment's data is the base64 encoding of the plain text %% and not the base64 encoding of the gziped plain text etap:is( TextAttData, base64:encode(test_text_data()), "2nd text attachment data is properly base64 encoded" ), ok. test_2nd_text_att_stub() -> {ok, Code, _Headers, Body} = test_util:request( db_url() ++ "/testdoc3?att_encoding_info=true", [], get), etap:is(Code, 200, "HTTP response code is 200"), Json = ejson:decode(Body), {TextAttJson} = couch_util:get_nested_json_value( Json, [<<"_attachments">>, <<"readme.txt">>] ), TextAttLength = couch_util:get_value(<<"length">>, TextAttJson), etap:is( TextAttLength, byte_size(test_text_data()), "2nd text attachment stub length matches the uncompressed length" ), TextAttEncoding = couch_util:get_value(<<"encoding">>, TextAttJson), etap:is( TextAttEncoding, <<"gzip">>, "2nd text attachment stub has the encoding field set to gzip" ), TextAttEncLength = couch_util:get_value(<<"encoded_length">>, TextAttJson), etap:is( TextAttEncLength, iolist_size(zlib:gzip(test_text_data())), "2nd text attachment stub encoded_length matches the compressed length" ), ok. test_get_doc_with_2nd_png_att() -> {ok, Code, _Headers, Body} = test_util:request( db_url() ++ "/testdoc4?attachments=true", [{"Accept", "application/json"}], get), etap:is(Code, 200, "HTTP response code is 200"), Json = ejson:decode(Body), PngAttJson = couch_util:get_nested_json_value( Json, [<<"_attachments">>, <<"icon.png">>] ), PngAttType = couch_util:get_nested_json_value( PngAttJson, [<<"content_type">>] ), PngAttData = couch_util:get_nested_json_value( PngAttJson, [<<"data">>] ), etap:is(PngAttType, <<"image/png">>, "attachment has type image/png"), etap:is( PngAttData, base64:encode(test_png_data()), "2nd png attachment data is properly base64 encoded" ), ok. test_2nd_png_att_stub() -> {ok, Code, _Headers, Body} = test_util:request( db_url() ++ "/testdoc4?att_encoding_info=true", [], get), etap:is(Code, 200, "HTTP response code is 200"), Json = ejson:decode(Body), {PngAttJson} = couch_util:get_nested_json_value( Json, [<<"_attachments">>, <<"icon.png">>] ), PngAttLength = couch_util:get_value(<<"length">>, PngAttJson), etap:is( PngAttLength, byte_size(test_png_data()), "2nd png attachment stub length matches the uncompressed length" ), PngEncoding = couch_util:get_value(<<"encoding">>, PngAttJson), etap:is( PngEncoding, undefined, "2nd png attachment stub doesn't have an encoding field" ), PngEncLength = couch_util:get_value(<<"encoded_length">>, PngAttJson), etap:is( PngEncLength, undefined, "2nd png attachment stub doesn't have an encoded_length field" ), ok. test_already_compressed_att(DocUri, AttName) -> test_get_already_compressed_att_with_accept_gzip(DocUri, AttName), test_get_already_compressed_att_without_accept(DocUri, AttName), test_get_already_compressed_att_stub(DocUri, AttName). test_get_already_compressed_att_with_accept_gzip(DocUri, AttName) -> {ok, Code, Headers, Body} = test_util:request( DocUri ++ "/" ++ AttName, [{"Accept-Encoding", "gzip"}], get), etap:is(Code, 200, "HTTP response code is 200"), Gziped = lists:member({"Content-Encoding", "gzip"}, Headers), etap:is(Gziped, true, "received body is gziped"), etap:is( Body, zlib:gzip(test_text_data()), "received data for the already compressed attachment is ok" ), ok. test_get_already_compressed_att_without_accept(DocUri, AttName) -> {ok, Code, Headers, Body} = test_util:request( DocUri ++ "/" ++ AttName, [], get), etap:is(Code, 200, "HTTP response code is 200"), Gziped = lists:member({"Content-Encoding", "gzip"}, Headers), etap:is(Gziped, false, "received body is not gziped"), etap:is( Body, test_text_data(), "received data for the already compressed attachment is ok" ), ok. test_get_already_compressed_att_stub(DocUri, AttName) -> {ok, Code, _Headers, Body} = test_util:request( DocUri ++ "?att_encoding_info=true", [], get), etap:is(Code, 200, "HTTP response code is 200"), Json = ejson:decode(Body), {AttJson} = couch_util:get_nested_json_value( Json, [<<"_attachments">>, iolist_to_binary(AttName)] ), AttLength = couch_util:get_value(<<"length">>, AttJson), etap:is( AttLength, iolist_size((zlib:gzip(test_text_data()))), "Already compressed attachment stub length matches the " "compressed length" ), Encoding = couch_util:get_value(<<"encoding">>, AttJson), etap:is( Encoding, <<"gzip">>, "Already compressed attachment stub has the encoding field set to gzip" ), EncLength = couch_util:get_value(<<"encoded_length">>, AttJson), etap:is( EncLength, AttLength, "Already compressed attachment stub encoded_length matches the " "length field value" ), ok. test_create_already_compressed_att_with_invalid_content_encoding( DocUri, AttName, AttData, Encoding) -> {ok, Code, _Headers, _Body} = test_util:request( DocUri ++ "/" ++ AttName, [{"Content-Encoding", Encoding}, {"Content-Type", "text/plain"}], put, AttData), etap:is( Code, 415, "Couldn't create an already compressed attachment using the " "unsupported encoding '" ++ Encoding ++ "'" ), ok. test_compressible_type_with_parameters() -> {ok, Code, _Headers, _Body} = test_util:request( db_url() ++ "/testdoc5/readme.txt", [{"Content-Type", "text/plain; charset=UTF-8"}], put, test_text_data()), etap:is(Code, 201, "Created text attachment with MIME type " "'text/plain; charset=UTF-8' using the standalone api"), {ok, Code2, Headers2, Body} = test_util:request( db_url() ++ "/testdoc5/readme.txt", [{"Accept-Encoding", "gzip"}], get), etap:is(Code2, 200, "HTTP response code is 200"), Gziped = lists:member({"Content-Encoding", "gzip"}, Headers2), etap:is(Gziped, true, "received body is gziped"), Uncompressed = zlib:gunzip(iolist_to_binary(Body)), etap:is(Uncompressed, test_text_data(), "received data is gzipped"), {ok, Code3, _Headers3, Body3} = test_util:request( db_url() ++ "/testdoc5?att_encoding_info=true", [], get), etap:is(Code3, 200, "HTTP response code is 200"), Json = ejson:decode(Body3), {TextAttJson} = couch_util:get_nested_json_value( Json, [<<"_attachments">>, <<"readme.txt">>] ), TextAttLength = couch_util:get_value(<<"length">>, TextAttJson), etap:is( TextAttLength, byte_size(test_text_data()), "text attachment stub length matches the uncompressed length" ), TextAttEncoding = couch_util:get_value(<<"encoding">>, TextAttJson), etap:is( TextAttEncoding, <<"gzip">>, "text attachment stub has the encoding field set to gzip" ), TextAttEncLength = couch_util:get_value(<<"encoded_length">>, TextAttJson), etap:is( TextAttEncLength, iolist_size(zlib:gzip(test_text_data())), "text attachment stub encoded_length matches the compressed length" ), ok. test_png_data() -> {ok, Data} = file:read_file( test_util:source_file("share/www/image/logo.png") ), Data. test_text_data() -> {ok, Data} = file:read_file( test_util:source_file("README.rst") ), Data. apache-couchdb-1.6.0/test/etap/170-os-daemons.t0000755000175000001440000000653412332105522021000 0ustar00djcusers00000000000000#!/usr/bin/env escript %% -*- erlang -*- % Licensed under the Apache License, Version 2.0 (the "License"); you may not % use this file except in compliance with the License. You may obtain a copy of % the License at % % http://www.apache.org/licenses/LICENSE-2.0 % % Unless required by applicable law or agreed to in writing, software % distributed under the License is distributed on an "AS IS" BASIS, WITHOUT % WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the % License for the specific language governing permissions and limitations under % the License. -record(daemon, { port, name, cmd, kill, status=running, cfg_patterns=[], errors=[], buf=[] }). config_files() -> lists:map(fun test_util:build_file/1, [ "etc/couchdb/default_dev.ini" ]). daemon_cmd() -> test_util:source_file("test/etap/170-os-daemons.es"). main(_) -> test_util:init_code_path(), etap:plan(49), case (catch test()) of ok -> etap:end_tests(); Other -> etap:diag(io_lib:format("Test died abnormally: ~p", [Other])), etap:bail(Other) end, ok. test() -> couch_config:start_link(config_files()), couch_os_daemons:start_link(), etap:diag("Daemons boot after configuration added."), couch_config:set("os_daemons", "foo", daemon_cmd(), false), timer:sleep(1000), {ok, [D1]} = couch_os_daemons:info([table]), check_daemon(D1, "foo"), % Check table form {ok, Tab1} = couch_os_daemons:info(), [T1] = ets:tab2list(Tab1), check_daemon(T1, "foo"), etap:diag("Daemons stop after configuration removed."), couch_config:delete("os_daemons", "foo", false), timer:sleep(500), {ok, []} = couch_os_daemons:info([table]), {ok, Tab2} = couch_os_daemons:info(), etap:is(ets:tab2list(Tab2), [], "As table returns empty table."), etap:diag("Adding multiple daemons causes both to boot."), couch_config:set("os_daemons", "bar", daemon_cmd(), false), couch_config:set("os_daemons", "baz", daemon_cmd(), false), timer:sleep(500), {ok, Daemons} = couch_os_daemons:info([table]), lists:foreach(fun(D) -> check_daemon(D) end, Daemons), {ok, Tab3} = couch_os_daemons:info(), lists:foreach(fun(D) -> check_daemon(D) end, ets:tab2list(Tab3)), etap:diag("Removing one daemon leaves the other alive."), couch_config:delete("os_daemons", "bar", false), timer:sleep(500), {ok, [D2]} = couch_os_daemons:info([table]), check_daemon(D2, "baz"), % Check table version {ok, Tab4} = couch_os_daemons:info(), [T4] = ets:tab2list(Tab4), check_daemon(T4, "baz"), ok. check_daemon(D) -> check_daemon(D, D#daemon.name). check_daemon(D, Name) -> BaseName = "170-os-daemons.es", BaseLen = length(BaseName), CmdLen = length(D#daemon.cmd), CmdName = lists:sublist(D#daemon.cmd, CmdLen-BaseLen+1, BaseLen), etap:is(is_port(D#daemon.port), true, "Daemon port is a port."), etap:is(D#daemon.name, Name, "Daemon name was set correctly."), etap:is(CmdName, BaseName, "Command name was set correctly."), etap:isnt(D#daemon.kill, undefined, "Kill command was set."), etap:is(D#daemon.errors, [], "No errors occurred while booting."), etap:is(D#daemon.buf, [], "No extra data left in the buffer."). apache-couchdb-1.6.0/test/etap/120-stats-collect.t0000755000175000001440000000767712332105522021520 0ustar00djcusers00000000000000#!/usr/bin/env escript %% -*- erlang -*- % Licensed under the Apache License, Version 2.0 (the "License"); you may not % use this file except in compliance with the License. You may obtain a copy of % the License at % % http://www.apache.org/licenses/LICENSE-2.0 % % Unless required by applicable law or agreed to in writing, software % distributed under the License is distributed on an "AS IS" BASIS, WITHOUT % WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the % License for the specific language governing permissions and limitations under % the License. main(_) -> test_util:init_code_path(), etap:plan(11), case (catch test()) of ok -> etap:end_tests(); Other -> etap:diag(io_lib:format("Test died abnormally: ~p", [Other])), etap:bail() end, ok. test() -> couch_stats_collector:start(), ok = test_counters(), ok = test_abs_values(), ok = test_proc_counting(), ok = test_all(), ok. test_counters() -> AddCount = fun() -> couch_stats_collector:increment(foo) end, RemCount = fun() -> couch_stats_collector:decrement(foo) end, repeat(AddCount, 100), repeat(RemCount, 25), repeat(AddCount, 10), repeat(RemCount, 5), etap:is( couch_stats_collector:get(foo), 80, "Incrememnt tracks correctly." ), repeat(RemCount, 80), etap:is( couch_stats_collector:get(foo), 0, "Decremented to zaro." ), ok. test_abs_values() -> lists:map(fun(Val) -> couch_stats_collector:record(bar, Val) end, lists:seq(1, 15)), etap:is( couch_stats_collector:get(bar), lists:seq(1, 15), "Absolute values are recorded correctly." ), couch_stats_collector:clear(bar), etap:is( couch_stats_collector:get(bar), nil, "Absolute values are cleared correctly." ), ok. test_proc_counting() -> Self = self(), OnePid = spawn(fun() -> couch_stats_collector:track_process_count(hoopla), Self ! reporting, receive sepuku -> ok end end), R1 = erlang:monitor(process, OnePid), receive reporting -> ok end, etap:is( couch_stats_collector:get(hoopla), 1, "track_process_count increments the counter." ), TwicePid = spawn(fun() -> couch_stats_collector:track_process_count(hoopla), couch_stats_collector:track_process_count(hoopla), Self ! reporting, receive sepuku -> ok end end), R2 = erlang:monitor(process, TwicePid), receive reporting -> ok end, etap:is( couch_stats_collector:get(hoopla), 3, "track_process_count allows more than one incrememnt per Pid" ), OnePid ! sepuku, receive {'DOWN', R1, _, _, _} -> ok end, timer:sleep(250), etap:is( couch_stats_collector:get(hoopla), 2, "Process count is decremented when process exits." ), TwicePid ! sepuku, receive {'DOWN', R2, _, _, _} -> ok end, timer:sleep(250), etap:is( couch_stats_collector:get(hoopla), 0, "Process count is decremented for each call to track_process_count." ), ok. test_all() -> couch_stats_collector:record(bar, 0.0), couch_stats_collector:record(bar, 1.0), etap:is( lists:sort(couch_stats_collector:all()), [ {bar,[1.0,0.0]}, {foo,0}, { hoopla,0} ], "all/0 returns all counters and absolute values." ), etap:is( lists:sort(couch_stats_collector:all(incremental)), [ {foo, 0}, {hoopla, 0} ], "all/1 returns only the specified type." ), couch_stats_collector:record(zing, 90), etap:is( lists:sort(couch_stats_collector:all(absolute)), [ {bar,[1.0,0.0]}, {zing,"Z"} ], "all/1 returns only the specified type." ), ok. repeat(_, 0) -> ok; repeat(Fun, Count) -> Fun(), repeat(Fun, Count-1). apache-couchdb-1.6.0/test/etap/081-config-override.t0000755000175000001440000001310612332105522022007 0ustar00djcusers00000000000000#!/usr/bin/env escript %% -*- erlang -*- % Licensed under the Apache License, Version 2.0 (the "License"); you may not % use this file except in compliance with the License. You may obtain a copy of % the License at % % http://www.apache.org/licenses/LICENSE-2.0 % % Unless required by applicable law or agreed to in writing, software % distributed under the License is distributed on an "AS IS" BASIS, WITHOUT % WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the % License for the specific language governing permissions and limitations under % the License. default_config() -> test_util:build_file("etc/couchdb/default_dev.ini"). local_config_1() -> test_util:source_file("test/etap/081-config-override.1.ini"). local_config_2() -> test_util:source_file("test/etap/081-config-override.2.ini"). local_config_write() -> test_util:build_file("test/etap/temp.081"). % Run tests and wait for the config gen_server to shutdown. run_tests(IniFiles, Tests) -> {ok, Pid} = couch_config:start_link(IniFiles), erlang:monitor(process, Pid), Tests(), couch_config:stop(), receive {'DOWN', _, _, Pid, _} -> ok; _Other -> etap:diag("OTHER: ~p~n", [_Other]) after 1000 -> throw({timeout_error, config_stop}) end. main(_) -> test_util:init_code_path(), etap:plan(17), case (catch test()) of ok -> etap:end_tests(); Other -> etap:diag(io_lib:format("Test died abnormally: ~p", [Other])), etap:bail(Other) end, ok. test() -> CheckStartStop = fun() -> ok end, run_tests([default_config()], CheckStartStop), CheckDefaults = fun() -> etap:is( couch_config:get("couchdb", "max_dbs_open"), "100", "{couchdb, max_dbs_open} is 100 by defualt." ), etap:is( couch_config:get("httpd","port"), "5984", "{httpd, port} is 5984 by default" ), etap:is( couch_config:get("fizbang", "unicode"), undefined, "{fizbang, unicode} is undefined by default" ) end, run_tests([default_config()], CheckDefaults), % Check that subsequent files override values appropriately CheckOverride = fun() -> etap:is( couch_config:get("couchdb", "max_dbs_open"), "10", "{couchdb, max_dbs_open} was overriden with the value 10" ), etap:is( couch_config:get("httpd", "port"), "4895", "{httpd, port} was overriden with the value 4895" ) end, run_tests([default_config(), local_config_1()], CheckOverride), % Check that overrides can create new sections CheckOverride2 = fun() -> etap:is( couch_config:get("httpd", "port"), "80", "{httpd, port} is overriden with the value 80" ), etap:is( couch_config:get("fizbang", "unicode"), "normalized", "{fizbang, unicode} was created by override INI file" ) end, run_tests([default_config(), local_config_2()], CheckOverride2), % Check that values can be overriden multiple times CheckOverride3 = fun() -> etap:is( couch_config:get("httpd", "port"), "80", "{httpd, port} value was taken from the last specified INI file." ) end, run_tests( [default_config(), local_config_1(), local_config_2()], CheckOverride3 ), % Check persistence to last file. % Empty the file in case it exists. {ok, Fd} = file:open(local_config_write(), write), ok = file:truncate(Fd), ok = file:close(Fd), % Open and write a value CheckCanWrite = fun() -> etap:is( couch_config:get("httpd", "port"), "5984", "{httpd, port} is still 5984 by default" ), etap:is( couch_config:set("httpd", "port", "8080"), ok, "Writing {httpd, port} is kosher." ), etap:is( couch_config:get("httpd", "port"), "8080", "{httpd, port} was updated to 8080 successfully." ), etap:is( couch_config:delete("httpd", "bind_address"), ok, "Deleting {httpd, bind_address} succeeds" ), etap:is( couch_config:get("httpd", "bind_address"), undefined, "{httpd, bind_address} was actually deleted." ) end, run_tests([default_config(), local_config_write()], CheckCanWrite), % Open and check where we don't expect persistence. CheckDidntWrite = fun() -> etap:is( couch_config:get("httpd", "port"), "5984", "{httpd, port} was not persisted to the primary INI file." ), etap:is( couch_config:get("httpd", "bind_address"), "127.0.0.1", "{httpd, bind_address} was not deleted form the primary INI file." ) end, run_tests([default_config()], CheckDidntWrite), % Open and check we have only the persistence we expect. CheckDidWrite = fun() -> etap:is( couch_config:get("httpd", "port"), "8080", "{httpd, port} is still 8080 after reopening the config." ), etap:is( couch_config:get("httpd", "bind_address"), undefined, "{httpd, bind_address} is still \"\" after reopening." ) end, run_tests([local_config_write()], CheckDidWrite), ok. apache-couchdb-1.6.0/test/etap/081-config-override.1.ini0000644000175000001440000000150012332105522022452 0ustar00djcusers00000000000000; Licensed to the Apache Software Foundation (ASF) under one ; or more contributor license agreements. See the NOTICE file ; distributed with this work for additional information ; regarding copyright ownership. The ASF licenses this file ; to you under the Apache License, Version 2.0 (the ; "License"); you may not use this file except in compliance ; with the License. You may obtain a copy of the License at ; ; http://www.apache.org/licenses/LICENSE-2.0 ; ; Unless required by applicable law or agreed to in writing, ; software distributed under the License is distributed on an ; "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY ; KIND, either express or implied. See the License for the ; specific language governing permissions and limitations ; under the License. [couchdb] max_dbs_open=10 [httpd] port=4895 apache-couchdb-1.6.0/test/etap/081-config-override.2.ini0000644000175000001440000000150512332105522022460 0ustar00djcusers00000000000000; Licensed to the Apache Software Foundation (ASF) under one ; or more contributor license agreements. See the NOTICE file ; distributed with this work for additional information ; regarding copyright ownership. The ASF licenses this file ; to you under the Apache License, Version 2.0 (the ; "License"); you may not use this file except in compliance ; with the License. You may obtain a copy of the License at ; ; http://www.apache.org/licenses/LICENSE-2.0 ; ; Unless required by applicable law or agreed to in writing, ; software distributed under the License is distributed on an ; "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY ; KIND, either express or implied. See the License for the ; specific language governing permissions and limitations ; under the License. [httpd] port = 80 [fizbang] unicode = normalized apache-couchdb-1.6.0/test/etap/041-uuid-gen.t0000755000175000001440000001077312332105522020445 0ustar00djcusers00000000000000#!/usr/bin/env escript %% -*- erlang -*- % Licensed under the Apache License, Version 2.0 (the "License"); you may not % use this file except in compliance with the License. You may obtain a copy of % the License at % % http://www.apache.org/licenses/LICENSE-2.0 % % Unless required by applicable law or agreed to in writing, software % distributed under the License is distributed on an "AS IS" BASIS, WITHOUT % WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the % License for the specific language governing permissions and limitations under % the License. default_config() -> test_util:build_file("etc/couchdb/default_dev.ini"). seq_alg_config() -> test_util:source_file("test/etap/041-uuid-gen-seq.ini"). utc_alg_config() -> test_util:source_file("test/etap/041-uuid-gen-utc.ini"). utc_id_alg_config() -> test_util:source_file("test/etap/041-uuid-gen-id.ini"). % Run tests and wait for the gen_servers to shutdown run_test(IniFiles, Test) -> {ok, Pid} = couch_config:start_link(IniFiles), erlang:monitor(process, Pid), couch_uuids:start(), Test(), couch_uuids:stop(), couch_config:stop(), receive {'DOWN', _, _, Pid, _} -> ok; _Other -> etap:diag("OTHER: ~p~n", [_Other]) after 1000 -> throw({timeout_error, config_stop}) end. main(_) -> test_util:init_code_path(), application:start(crypto), etap:plan(9), case (catch test()) of ok -> etap:end_tests(); Other -> etap:diag(io_lib:format("Test died abnormally: ~p", [Other])), etap:bail(Other) end, ok. test() -> TestUnique = fun() -> etap:is( test_unique(10000, couch_uuids:new()), true, "Can generate 10K unique IDs" ) end, run_test([default_config()], TestUnique), run_test([default_config(), seq_alg_config()], TestUnique), run_test([default_config(), utc_alg_config()], TestUnique), run_test([default_config(), utc_id_alg_config()], TestUnique), TestMonotonic = fun () -> etap:is( couch_uuids:new() < couch_uuids:new(), true, "should produce monotonically increasing ids" ) end, run_test([default_config(), seq_alg_config()], TestMonotonic), run_test([default_config(), utc_alg_config()], TestMonotonic), run_test([default_config(), utc_id_alg_config()], TestMonotonic), % Pretty sure that the average of a uniform distribution is the % midpoint of the range. Thus, to exceed a threshold, we need % approximately Total / (Range/2 + RangeMin) samples. % % In our case this works out to be 8194. (0xFFF000 / 0x7FF) % These tests just fudge the limits for a good generator at 25% % in either direction. Technically it should be possible to generate % bounds that will show if your random number generator is not % sufficiently random but I hated statistics in school. TestRollOver = fun() -> UUID = binary_to_list(couch_uuids:new()), Prefix = element(1, lists:split(26, UUID)), N = gen_until_pref_change(Prefix,0), etap:diag("N is: ~p~n",[N]), etap:is( N >= 5000 andalso N =< 11000, true, "should roll over every so often." ) end, run_test([default_config(), seq_alg_config()], TestRollOver), TestSuffix = fun() -> UUID = binary_to_list(couch_uuids:new()), Suffix = get_suffix(UUID), etap:is( test_same_suffix(100, Suffix), true, "utc_id ids should have the same suffix." ) end, run_test([default_config(), utc_id_alg_config()], TestSuffix). test_unique(0, _) -> true; test_unique(N, UUID) -> case couch_uuids:new() of UUID -> etap:diag("N: ~p~n", [N]), false; Else -> test_unique(N-1, Else) end. get_prefix(UUID) -> element(1, lists:split(26, binary_to_list(UUID))). gen_until_pref_change(_, Count) when Count > 8251 -> Count; gen_until_pref_change(Prefix, N) -> case get_prefix(couch_uuids:new()) of Prefix -> gen_until_pref_change(Prefix, N+1); _ -> N end. get_suffix(UUID) when is_binary(UUID)-> get_suffix(binary_to_list(UUID)); get_suffix(UUID) -> element(2, lists:split(14, UUID)). test_same_suffix(0, _) -> true; test_same_suffix(N, Suffix) -> case get_suffix(couch_uuids:new()) of Suffix -> test_same_suffix(N-1, Suffix); _ -> false end. apache-couchdb-1.6.0/test/etap/test_cfg_register.c0000644000175000001440000000161412332105522022076 0ustar00djcusers00000000000000// Licensed under the Apache License, Version 2.0 (the "License"); you may not // use this file except in compliance with the License. You may obtain a copy of // the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, WITHOUT // WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the // License for the specific language governing permissions and limitations under // the License. #include #include int main(int argc, const char * argv[]) { char c = '\0'; size_t num = 1; fprintf(stdout, "[\"register\", \"s1\"]\n"); fprintf(stdout, "[\"register\", \"s2\", \"k\"]\n"); fflush(stdout); while(c != '\n' && num > 0) { num = fread(&c, 1, 1, stdin); } exit(0); } apache-couchdb-1.6.0/test/etap/030-doc-from-json.t0000755000175000001440000001624612332105522021404 0ustar00djcusers00000000000000#!/usr/bin/env escript %% -*- erlang -*- %%! -pa ./src/couchdb -pa ./src/mochiweb -sasl errlog_type false -noshell % Licensed under the Apache License, Version 2.0 (the "License"); you may not % use this file except in compliance with the License. You may obtain a copy of % the License at % % http://www.apache.org/licenses/LICENSE-2.0 % % Unless required by applicable law or agreed to in writing, software % distributed under the License is distributed on an "AS IS" BASIS, WITHOUT % WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the % License for the specific language governing permissions and limitations under % the License. %% XXX: Figure out how to -include("couch_db.hrl") -record(doc, {id= <<"">>, revs={0, []}, body={[]}, atts=[], deleted=false, meta=[]}). -record(att, {name, type, att_len, disk_len, md5= <<>>, revpos=0, data, encoding=identity}). main(_) -> test_util:init_code_path(), etap:plan(26), case (catch test()) of ok -> etap:end_tests(); Other -> etap:diag(io_lib:format("Test died abnormally: ~p", [Other])), etap:bail() end, ok. test() -> couch_config:start_link(test_util:config_files()), couch_config:set("attachments", "compression_level", "0", false), ok = test_from_json_success(), ok = test_from_json_errors(), ok. test_from_json_success() -> Cases = [ { {[]}, #doc{}, "Return an empty document for an empty JSON object." }, { {[{<<"_id">>, <<"zing!">>}]}, #doc{id= <<"zing!">>}, "Parses document ids." }, { {[{<<"_id">>, <<"_design/foo">>}]}, #doc{id= <<"_design/foo">>}, "_design/document ids." }, { {[{<<"_id">>, <<"_local/bam">>}]}, #doc{id= <<"_local/bam">>}, "_local/document ids." }, { {[{<<"_rev">>, <<"4-230234">>}]}, #doc{revs={4, [<<"230234">>]}}, "_rev stored in revs." }, { {[{<<"soap">>, 35}]}, #doc{body={[{<<"soap">>, 35}]}}, "Non underscore prefixed fields stored in body." }, { {[{<<"_attachments">>, {[ {<<"my_attachment.fu">>, {[ {<<"stub">>, true}, {<<"content_type">>, <<"application/awesome">>}, {<<"length">>, 45} ]}}, {<<"noahs_private_key.gpg">>, {[ {<<"data">>, <<"SSBoYXZlIGEgcGV0IGZpc2gh">>}, {<<"content_type">>, <<"application/pgp-signature">>} ]}} ]}}]}, #doc{atts=[ #att{ name = <<"my_attachment.fu">>, data = stub, type = <<"application/awesome">>, att_len = 45, disk_len = 45, revpos = nil }, #att{ name = <<"noahs_private_key.gpg">>, data = <<"I have a pet fish!">>, type = <<"application/pgp-signature">>, att_len = 18, disk_len = 18, revpos = 0 } ]}, "Attachments are parsed correctly." }, { {[{<<"_deleted">>, true}]}, #doc{deleted=true}, "_deleted controls the deleted field." }, { {[{<<"_deleted">>, false}]}, #doc{}, "{\"_deleted\": false} is ok." }, { {[ {<<"_revisions">>, {[ {<<"start">>, 4}, {<<"ids">>, [<<"foo1">>, <<"phi3">>, <<"omega">>]} ]}}, {<<"_rev">>, <<"6-something">>} ]}, #doc{revs={4, [<<"foo1">>, <<"phi3">>, <<"omega">>]}}, "_revisions attribute are preferred to _rev." }, { {[{<<"_revs_info">>, dropping}]}, #doc{}, "Drops _revs_info." }, { {[{<<"_local_seq">>, dropping}]}, #doc{}, "Drops _local_seq." }, { {[{<<"_conflicts">>, dropping}]}, #doc{}, "Drops _conflicts." }, { {[{<<"_deleted_conflicts">>, dropping}]}, #doc{}, "Drops _deleted_conflicts." } ], lists:foreach(fun({EJson, Expect, Mesg}) -> etap:is(couch_doc:from_json_obj(EJson), Expect, Mesg) end, Cases), ok. test_from_json_errors() -> Cases = [ { [], {bad_request, "Document must be a JSON object"}, "arrays are invalid" }, { 4, {bad_request, "Document must be a JSON object"}, "integers are invalid" }, { true, {bad_request, "Document must be a JSON object"}, "literals are invalid" }, { {[{<<"_id">>, {[{<<"foo">>, 5}]}}]}, {bad_request, <<"Document id must be a string">>}, "Document id must be a string." }, { {[{<<"_id">>, <<"_random">>}]}, {bad_request, <<"Only reserved document ids may start with underscore.">>}, "Disallow arbitrary underscore prefixed docids." }, { {[{<<"_rev">>, 5}]}, {bad_request, <<"Invalid rev format">>}, "_rev must be a string" }, { {[{<<"_rev">>, "foobar"}]}, {bad_request, <<"Invalid rev format">>}, "_rev must be %d-%s" }, { {[{<<"_rev">>, "foo-bar"}]}, "Error if _rev's integer expection is broken." }, { {[{<<"_revisions">>, {[{<<"start">>, true}]}}]}, {doc_validation, "_revisions.start isn't an integer."}, "_revisions.start must be an integer." }, { {[{<<"_revisions">>, {[ {<<"start">>, 0}, {<<"ids">>, 5} ]}}]}, {doc_validation, "_revisions.ids isn't a array."}, "_revions.ids must be a list." }, { {[{<<"_revisions">>, {[ {<<"start">>, 0}, {<<"ids">>, [5]} ]}}]}, {doc_validation, "RevId isn't a string"}, "Revision ids must be strings." }, { {[{<<"_something">>, 5}]}, {doc_validation, <<"Bad special document member: _something">>}, "Underscore prefix fields are reserved." } ], lists:foreach(fun ({EJson, Expect, Mesg}) -> Error = (catch couch_doc:from_json_obj(EJson)), etap:is(Error, Expect, Mesg); ({EJson, Mesg}) -> try couch_doc:from_json_obj(EJson), etap:ok(false, "Conversion failed to raise an exception.") catch _:_ -> etap:ok(true, Mesg) end end, Cases), ok. apache-couchdb-1.6.0/test/etap/062-kt-remove-leaves.t0000755000175000001440000000402112332105522022106 0ustar00djcusers00000000000000#!/usr/bin/env escript %% -*- erlang -*- % Licensed under the Apache License, Version 2.0 (the "License"); you may not % use this file except in compliance with the License. You may obtain a copy of % the License at % % http://www.apache.org/licenses/LICENSE-2.0 % % Unless required by applicable law or agreed to in writing, software % distributed under the License is distributed on an "AS IS" BASIS, WITHOUT % WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the % License for the specific language governing permissions and limitations under % the License. main(_) -> test_util:init_code_path(), etap:plan(6), case (catch test()) of ok -> etap:end_tests(); Other -> etap:diag(io_lib:format("Test died abnormally: ~p", [Other])), etap:bail(Other) end, ok. test() -> OneChild = [{0, {"1","foo",[{"1a", "bar", []}]}}], TwoChildSibs = [{0, {"1","foo", [{"1a", "bar", []}, {"1b", "bar", []}]}}], Stemmed = [{1, {"1a", "bar", [{"1aa", "bar", []}]}}], etap:is( {TwoChildSibs, []}, couch_key_tree:remove_leafs(TwoChildSibs, []), "Removing no leaves has no effect on the tree." ), etap:is( {TwoChildSibs, []}, couch_key_tree:remove_leafs(TwoChildSibs, [{0, "1"}]), "Removing a non-existant branch has no effect." ), etap:is( {OneChild, [{1, "1b"}]}, couch_key_tree:remove_leafs(TwoChildSibs, [{1, "1b"}]), "Removing a leaf removes the leaf." ), etap:is( {[], [{1, "1b"},{1, "1a"}]}, couch_key_tree:remove_leafs(TwoChildSibs, [{1, "1a"}, {1, "1b"}]), "Removing all leaves returns an empty tree." ), etap:is( {Stemmed, []}, couch_key_tree:remove_leafs(Stemmed, [{1, "1a"}]), "Removing a non-existant node has no effect." ), etap:is( {[], [{2, "1aa"}]}, couch_key_tree:remove_leafs(Stemmed, [{2, "1aa"}]), "Removing the last leaf returns an empty tree." ), ok. apache-couchdb-1.6.0/test/etap/077-couch-db-fast-db-delete-create.t0000644000175000001440000000303412332105522024431 0ustar00djcusers00000000000000#!/usr/bin/env escript %% -*- erlang -*- % Licensed under the Apache License, Version 2.0 (the "License"); you may not % use this file except in compliance with the License. You may obtain a copy of % the License at % % http://www.apache.org/licenses/LICENSE-2.0 % % Unless required by applicable law or agreed to in writing, software % distributed under the License is distributed on an "AS IS" BASIS, WITHOUT % WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the % License for the specific language governing permissions and limitations under % the License. main(_) -> test_util:init_code_path(), etap:plan(unknown), case (catch test()) of ok -> etap:end_tests(); Other -> Msg = io_lib:format("Test died abnormally: ~p", [Other]), etap:diag(Msg), etap:bail(Msg) end, ok. loop(0) -> ok; loop(N) -> ok = cycle(), loop(N - 1). cycle() -> ok = couch_server:delete(<<"etap-test-db">>, []), {ok, _Db} = couch_db:create(<<"etap-test-db">>, []), ok. test() -> couch_server_sup:start_link(test_util:config_files()), {ok, _Db} = couch_db:create(<<"etap-test-db">>, []), ok = loop(1), ok = loop(10), ok = loop(100), ok = loop(1000), % for more thorough testing: % ok = loop(10000), % ok = loop(100000), % ok = loop(1000000), % ok = loop(10000000), ok = couch_server:delete(<<"etap-test-db">>, []), etap:is(true, true, "lots of creating and deleting of a database"), ok. apache-couchdb-1.6.0/test/etap/173-os-daemon-cfg-register.t0000755000175000001440000000714412332105522023175 0ustar00djcusers00000000000000#!/usr/bin/env escript %% -*- erlang -*- % Licensed under the Apache License, Version 2.0 (the "License"); you may not % use this file except in compliance with the License. You may obtain a copy of % the License at % % http://www.apache.org/licenses/LICENSE-2.0 % % Unless required by applicable law or agreed to in writing, software % distributed under the License is distributed on an "AS IS" BASIS, WITHOUT % WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the % License for the specific language governing permissions and limitations under % the License. -record(daemon, { port, name, cmd, kill, status=running, cfg_patterns=[], errors=[], buf=[] }). daemon_name() -> "wheee". daemon_cmd() -> test_util:build_file("test/etap/test_cfg_register"). main(_) -> test_util:init_code_path(), etap:plan(27), case (catch test()) of ok -> etap:end_tests(); Other -> etap:diag(io_lib:format("Test died abnormally: ~p", [Other])), etap:bail(Other) end, ok. test() -> couch_config:start_link(test_util:config_files()), couch_os_daemons:start_link(), DaemonCmd = daemon_cmd() ++ " 2> /dev/null", etap:diag("Booting the daemon"), couch_config:set("os_daemons", daemon_name(), DaemonCmd, false), wait_for_start(10), {ok, [D1]} = couch_os_daemons:info([table]), check_daemon(D1, running), etap:diag("Daemon restarts when section changes."), couch_config:set("s1", "k", "foo", false), wait_for_restart(10), {ok, [D2]} = couch_os_daemons:info([table]), check_daemon(D2, running), etap:isnt(D2#daemon.kill, D1#daemon.kill, "Kill command shows restart."), etap:diag("Daemon doesn't restart for ignored section key."), couch_config:set("s2", "k2", "baz", false), timer:sleep(1000), % Message travel time. {ok, [D3]} = couch_os_daemons:info([table]), etap:is(D3, D2, "Same daemon info after ignored config change."), etap:diag("Daemon restarts for specific section/key pairs."), couch_config:set("s2", "k", "bingo", false), wait_for_restart(10), {ok, [D4]} = couch_os_daemons:info([table]), check_daemon(D4, running), etap:isnt(D4#daemon.kill, D3#daemon.kill, "Kill command changed again."), ok. wait_for_start(0) -> throw({error, wait_for_start}); wait_for_start(N) -> case couch_os_daemons:info([table]) of {ok, []} -> timer:sleep(200), wait_for_start(N-1); _ -> timer:sleep(1000) end. wait_for_restart(0) -> throw({error, wait_for_restart}); wait_for_restart(N) -> {ok, [D]} = couch_os_daemons:info([table]), case D#daemon.status of restarting -> timer:sleep(200), wait_for_restart(N-1); _ -> timer:sleep(1000) end. check_daemon(D, Status) -> BaseName = filename:basename(daemon_cmd()) ++ " 2> /dev/null", BaseLen = length(BaseName), CmdLen = length(D#daemon.cmd), CmdName = lists:sublist(D#daemon.cmd, CmdLen-BaseLen+1, BaseLen), etap:is(is_port(D#daemon.port), true, "Daemon port is a port."), etap:is(D#daemon.name, daemon_name(), "Daemon name was set correctly."), etap:is(CmdName, BaseName, "Command name was set correctly."), etap:isnt(D#daemon.kill, undefined, "Kill command was set."), etap:is(D#daemon.status, Status, "Daemon status is correct."), etap:is(D#daemon.cfg_patterns, [{"s1"}, {"s2", "k"}], "Cfg patterns set"), etap:is(D#daemon.errors, [], "No errors have occurred."), etap:isnt(D#daemon.buf, nil, "Buffer is active."). apache-couchdb-1.6.0/test/etap/011-file-headers.t0000755000175000001440000001306612332105522021253 0ustar00djcusers00000000000000#!/usr/bin/env escript %% -*- erlang -*- %%! -pa ./src/couchdb -sasl errlog_type error -boot start_sasl -noshell % Licensed under the Apache License, Version 2.0 (the "License"); you may not % use this file except in compliance with the License. You may obtain a copy of % the License at % % http://www.apache.org/licenses/LICENSE-2.0 % % Unless required by applicable law or agreed to in writing, software % distributed under the License is distributed on an "AS IS" BASIS, WITHOUT % WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the % License for the specific language governing permissions and limitations under % the License. filename() -> test_util:build_file("test/etap/temp.011"). sizeblock() -> 4096. % Need to keep this in sync with couch_file.erl main(_) -> test_util:init_code_path(), {S1, S2, S3} = now(), random:seed(S1, S2, S3), etap:plan(18), case (catch test()) of ok -> etap:end_tests(); Other -> etap:diag(io_lib:format("Test died abnormally: ~p", [Other])), etap:bail() end, ok. test() -> {ok, Fd} = couch_file:open(filename(), [create,overwrite]), etap:is({ok, 0}, couch_file:bytes(Fd), "File should be initialized to contain zero bytes."), etap:is(ok, couch_file:write_header(Fd, {<<"some_data">>, 32}), "Writing a header succeeds."), {ok, Size1} = couch_file:bytes(Fd), etap:is_greater(Size1, 0, "Writing a header allocates space in the file."), etap:is({ok, {<<"some_data">>, 32}}, couch_file:read_header(Fd), "Reading the header returns what we wrote."), etap:is(ok, couch_file:write_header(Fd, [foo, <<"more">>]), "Writing a second header succeeds."), {ok, Size2} = couch_file:bytes(Fd), etap:is_greater(Size2, Size1, "Writing a second header allocates more space."), etap:is({ok, [foo, <<"more">>]}, couch_file:read_header(Fd), "Reading the second header does not return the first header."), % Delete the second header. ok = couch_file:truncate(Fd, Size1), etap:is({ok, {<<"some_data">>, 32}}, couch_file:read_header(Fd), "Reading the header after a truncation returns a previous header."), couch_file:write_header(Fd, [foo, <<"more">>]), etap:is({ok, Size2}, couch_file:bytes(Fd), "Rewriting the same second header returns the same second size."), couch_file:write_header(Fd, erlang:make_tuple(5000, <<"CouchDB">>)), etap:is( couch_file:read_header(Fd), {ok, erlang:make_tuple(5000, <<"CouchDB">>)}, "Headers larger than the block size can be saved (COUCHDB-1319)" ), ok = couch_file:close(Fd), % Now for the fun stuff. Try corrupting the second header and see % if we recover properly. % Destroy the 0x1 byte that marks a header check_header_recovery(fun(CouchFd, RawFd, Expect, HeaderPos) -> etap:isnt(Expect, couch_file:read_header(CouchFd), "Should return a different header before corruption."), file:pwrite(RawFd, HeaderPos, <<0>>), etap:is(Expect, couch_file:read_header(CouchFd), "Corrupting the byte marker should read the previous header.") end), % Corrupt the size. check_header_recovery(fun(CouchFd, RawFd, Expect, HeaderPos) -> etap:isnt(Expect, couch_file:read_header(CouchFd), "Should return a different header before corruption."), % +1 for 0x1 byte marker file:pwrite(RawFd, HeaderPos+1, <<10/integer>>), etap:is(Expect, couch_file:read_header(CouchFd), "Corrupting the size should read the previous header.") end), % Corrupt the MD5 signature check_header_recovery(fun(CouchFd, RawFd, Expect, HeaderPos) -> etap:isnt(Expect, couch_file:read_header(CouchFd), "Should return a different header before corruption."), % +5 = +1 for 0x1 byte and +4 for term size. file:pwrite(RawFd, HeaderPos+5, <<"F01034F88D320B22">>), etap:is(Expect, couch_file:read_header(CouchFd), "Corrupting the MD5 signature should read the previous header.") end), % Corrupt the data check_header_recovery(fun(CouchFd, RawFd, Expect, HeaderPos) -> etap:isnt(Expect, couch_file:read_header(CouchFd), "Should return a different header before corruption."), % +21 = +1 for 0x1 byte, +4 for term size and +16 for MD5 sig file:pwrite(RawFd, HeaderPos+21, <<"some data goes here!">>), etap:is(Expect, couch_file:read_header(CouchFd), "Corrupting the header data should read the previous header.") end), ok. check_header_recovery(CheckFun) -> {ok, Fd} = couch_file:open(filename(), [create,overwrite]), {ok, RawFd} = file:open(filename(), [read, write, raw, binary]), {ok, _} = write_random_data(Fd), ExpectHeader = {some_atom, <<"a binary">>, 756}, ok = couch_file:write_header(Fd, ExpectHeader), {ok, HeaderPos} = write_random_data(Fd), ok = couch_file:write_header(Fd, {2342, <<"corruption! greed!">>}), CheckFun(Fd, RawFd, {ok, ExpectHeader}, HeaderPos), ok = file:close(RawFd), ok = couch_file:close(Fd), ok. write_random_data(Fd) -> write_random_data(Fd, 100 + random:uniform(1000)). write_random_data(Fd, 0) -> {ok, Bytes} = couch_file:bytes(Fd), {ok, (1 + Bytes div sizeblock()) * sizeblock()}; write_random_data(Fd, N) -> Choices = [foo, bar, <<"bizzingle">>, "bank", ["rough", stuff]], Term = lists:nth(random:uniform(4) + 1, Choices), {ok, _, _} = couch_file:append_term(Fd, Term), write_random_data(Fd, N-1). apache-couchdb-1.6.0/test/etap/061-kt-missing-leaves.t0000755000175000001440000000343212332105522022266 0ustar00djcusers00000000000000#!/usr/bin/env escript %% -*- erlang -*- % Licensed under the Apache License, Version 2.0 (the "License"); you may not % use this file except in compliance with the License. You may obtain a copy of % the License at % % http://www.apache.org/licenses/LICENSE-2.0 % % Unless required by applicable law or agreed to in writing, software % distributed under the License is distributed on an "AS IS" BASIS, WITHOUT % WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the % License for the specific language governing permissions and limitations under % the License. main(_) -> test_util:init_code_path(), etap:plan(4), case (catch test()) of ok -> etap:end_tests(); Other -> etap:diag(io_lib:format("Test died abnormally: ~p", [Other])), etap:bail(Other) end, ok. test() -> TwoChildSibs = [{0, {"1","foo", [{"1a", "bar", []}, {"1b", "bar", []}]}}], Stemmed1 = [{1, {"1a", "bar", [{"1aa", "bar", []}]}}], Stemmed2 = [{2, {"1aa", "bar", []}}], etap:is( [], couch_key_tree:find_missing(TwoChildSibs, [{0,"1"}, {1,"1a"}]), "Look for missing keys." ), etap:is( [{0, "10"}, {100, "x"}], couch_key_tree:find_missing( TwoChildSibs, [{0,"1"}, {0, "10"}, {1,"1a"}, {100, "x"}] ), "Look for missing keys." ), etap:is( [{0, "1"}, {100, "x"}], couch_key_tree:find_missing( Stemmed1, [{0,"1"}, {1,"1a"}, {100, "x"}] ), "Look for missing keys." ), etap:is( [{0, "1"}, {1,"1a"}, {100, "x"}], couch_key_tree:find_missing( Stemmed2, [{0,"1"}, {1,"1a"}, {100, "x"}] ), "Look for missing keys." ), ok. apache-couchdb-1.6.0/test/bench/0000755000175000001440000000000012332106073016356 5ustar00djcusers00000000000000apache-couchdb-1.6.0/test/bench/run.tpl0000755000175000001440000000162412332105522017707 0ustar00djcusers00000000000000#!/bin/sh -e # Licensed under the Apache License, Version 2.0 (the "License"); you may not # use this file except in compliance with the License. You may obtain a copy of # the License at # # http://www.apache.org/licenses/LICENSE-2.0 # # Unless required by applicable law or agreed to in writing, software # distributed under the License is distributed on an "AS IS" BASIS, WITHOUT # WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the # License for the specific language governing permissions and limitations under # the License. SRC_DIR=%abs_top_srcdir% SCRIPT_DIR=$SRC_DIR/share/www/script JS_TEST_DIR=$SRC_DIR/test/javascript JS_BENCH_DIR=$SRC_DIR/test/bench COUCHJS=%abs_top_builddir%/src/couchdb/priv/couchjs cat $SCRIPT_DIR/json2.js \ $SCRIPT_DIR/couch.js \ $JS_TEST_DIR/couch_http.js \ $JS_BENCH_DIR/bench_marks.js \ $JS_TEST_DIR/cli_runner.js \ | $COUCHJS - apache-couchdb-1.6.0/test/bench/Makefile.am0000644000175000001440000000141512332105522020411 0ustar00djcusers00000000000000## Licensed under the Apache License, Version 2.0 (the "License"); you may not ## use this file except in compliance with the License. You may obtain a copy of ## the License at ## ## http://www.apache.org/licenses/LICENSE-2.0 ## ## Unless required by applicable law or agreed to in writing, software ## distributed under the License is distributed on an "AS IS" BASIS, WITHOUT ## WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the ## License for the specific language governing permissions and limitations under ## the License. EXTRA_DIST = benchbulk.sh bench_marks.js run.tpl noinst_SCRIPTS = run CLEANFILES = run run: run.tpl sed -e "s|%abs_top_srcdir%|$(abs_top_srcdir)|" \ -e "s|%abs_top_builddir%|$(abs_top_builddir)|" \ < $< > $@ chmod +x $@ apache-couchdb-1.6.0/test/bench/Makefile.in0000644000175000001440000003060112332105553020425 0ustar00djcusers00000000000000# Makefile.in generated by automake 1.11.6 from Makefile.am. # @configure_input@ # Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, # 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011 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__make_dryrun = \ { \ am__dry=no; \ case $$MAKEFLAGS in \ *\\[\ \ ]*) \ echo 'am--echo: ; @echo "AM" OK' | $(MAKE) -f - 2>/dev/null \ | grep '^AM OK$$' >/dev/null || am__dry=yes;; \ *) \ for am__flg in $$MAKEFLAGS; do \ case $$am__flg in \ *=*|--*) ;; \ *n*) am__dry=yes; break;; \ esac; \ done;; \ esac; \ test $$am__dry = yes; \ } 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 = test/bench DIST_COMMON = $(srcdir)/Makefile.am $(srcdir)/Makefile.in ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 am__aclocal_m4_deps = $(top_srcdir)/m4/libtool.m4 \ $(top_srcdir)/m4/ltoptions.m4 $(top_srcdir)/m4/ltsugar.m4 \ $(top_srcdir)/m4/ltversion.m4 $(top_srcdir)/m4/lt~obsolete.m4 \ $(top_srcdir)/acinclude.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 \ $(top_builddir)/src/snappy/google-snappy/config.h CONFIG_CLEAN_FILES = CONFIG_CLEAN_VPATH_FILES = SCRIPTS = $(noinst_SCRIPTS) 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 DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) ACLOCAL = @ACLOCAL@ AMTAR = @AMTAR@ AR = @AR@ AS = @AS@ AUTOCONF = @AUTOCONF@ AUTOHEADER = @AUTOHEADER@ AUTOMAKE = @AUTOMAKE@ AWK = @AWK@ CC = @CC@ CCDEPMODE = @CCDEPMODE@ CFLAGS = @CFLAGS@ CPP = @CPP@ CPPFLAGS = @CPPFLAGS@ CURL_CFLAGS = @CURL_CFLAGS@ CURL_CONFIG = @CURL_CONFIG@ CURL_LIBS = @CURL_LIBS@ CXX = @CXX@ CXXCPP = @CXXCPP@ CXXDEPMODE = @CXXDEPMODE@ CXXFLAGS = @CXXFLAGS@ CYGPATH_W = @CYGPATH_W@ DEFS = @DEFS@ DEPDIR = @DEPDIR@ DLLTOOL = @DLLTOOL@ DSYMUTIL = @DSYMUTIL@ DUMPBIN = @DUMPBIN@ ECHO_C = @ECHO_C@ ECHO_N = @ECHO_N@ ECHO_T = @ECHO_T@ EGREP = @EGREP@ ERL = @ERL@ ERLANG_FLAGS = @ERLANG_FLAGS@ ERLC = @ERLC@ ERLC_FLAGS = @ERLC_FLAGS@ ESCRIPT = @ESCRIPT@ EXEEXT = @EXEEXT@ FGREP = @FGREP@ FLAGS = @FLAGS@ GREP = @GREP@ HAS_HELP2MAN = @HAS_HELP2MAN@ HAS_INSTALLINFO = @HAS_INSTALLINFO@ HAS_MAKEINFO = @HAS_MAKEINFO@ HAS_PDFLATEX = @HAS_PDFLATEX@ HAS_SPHINX_BUILD = @HAS_SPHINX_BUILD@ ICU_BIN = @ICU_BIN@ ICU_CFLAGS = @ICU_CFLAGS@ ICU_CONFIG = @ICU_CONFIG@ ICU_CPPFLAGS = @ICU_CPPFLAGS@ ICU_CXXFLAGS = @ICU_CXXFLAGS@ ICU_LIBS = @ICU_LIBS@ INNO_COMPILER_EXECUTABLE = @INNO_COMPILER_EXECUTABLE@ INSTALL = @INSTALL@ INSTALL_DATA = @INSTALL_DATA@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ INSTALL_SCRIPT = @INSTALL_SCRIPT@ INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ JS_CFLAGS = @JS_CFLAGS@ JS_LIBS = @JS_LIBS@ JS_LIB_BINARY = @JS_LIB_BINARY@ LD = @LD@ LDFLAGS = @LDFLAGS@ LIBOBJS = @LIBOBJS@ LIBS = @LIBS@ LIBTOOL = @LIBTOOL@ LIPO = @LIPO@ LN_S = @LN_S@ LTLIBOBJS = @LTLIBOBJS@ MAKEINFO = @MAKEINFO@ MANIFEST_TOOL = @MANIFEST_TOOL@ MKDIR_P = @MKDIR_P@ NM = @NM@ NMEDIT = @NMEDIT@ OBJDUMP = @OBJDUMP@ OBJEXT = @OBJEXT@ OTOOL = @OTOOL@ OTOOL64 = @OTOOL64@ PACKAGE = @PACKAGE@ PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ PACKAGE_NAME = @PACKAGE_NAME@ PACKAGE_STRING = @PACKAGE_STRING@ PACKAGE_TARNAME = @PACKAGE_TARNAME@ PACKAGE_URL = @PACKAGE_URL@ PACKAGE_VERSION = @PACKAGE_VERSION@ PATH_SEPARATOR = @PATH_SEPARATOR@ PKG_CONFIG = @PKG_CONFIG@ PKG_CONFIG_LIBDIR = @PKG_CONFIG_LIBDIR@ PKG_CONFIG_PATH = @PKG_CONFIG_PATH@ RANLIB = @RANLIB@ SED = @SED@ SET_MAKE = @SET_MAKE@ SHELL = @SHELL@ SNAPPY_MAJOR = @SNAPPY_MAJOR@ SNAPPY_MINOR = @SNAPPY_MINOR@ SNAPPY_PATCHLEVEL = @SNAPPY_PATCHLEVEL@ STRIP = @STRIP@ VERSION = @VERSION@ 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@ ac_cv_have_stddef_h = @ac_cv_have_stddef_h@ ac_cv_have_stdint_h = @ac_cv_have_stdint_h@ am__include = @am__include@ am__leading_dot = @am__leading_dot@ am__quote = @am__quote@ am__tar = @am__tar@ am__untar = @am__untar@ bindir = @bindir@ bug_uri = @bug_uri@ 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@ dvidir = @dvidir@ erlangbin = @erlangbin@ erlangversion = @erlangversion@ exec_prefix = @exec_prefix@ host = @host@ host_alias = @host_alias@ host_cpu = @host_cpu@ host_os = @host_os@ host_vendor = @host_vendor@ htmldir = @htmldir@ includedir = @includedir@ infodir = @infodir@ initdir = @initdir@ install_sh = @install_sh@ launchddir = @launchddir@ libdir = @libdir@ libexecdir = @libexecdir@ localconfdir = @localconfdir@ localdatadir = @localdatadir@ localdocdir = @localdocdir@ localedir = @localedir@ localerlanglibdir = @localerlanglibdir@ locallibbindir = @locallibbindir@ locallibdir = @locallibdir@ localstatedir = @localstatedir@ localstatelibdir = @localstatelibdir@ localstatelogdir = @localstatelogdir@ localstaterundir = @localstaterundir@ mandir = @mandir@ mkdir_p = @mkdir_p@ msvc_redist_dir = @msvc_redist_dir@ msvc_redist_name = @msvc_redist_name@ oldincludedir = @oldincludedir@ openssl_bin_dir = @openssl_bin_dir@ otp_release = @otp_release@ package_author_address = @package_author_address@ package_author_name = @package_author_name@ package_identifier = @package_identifier@ package_name = @package_name@ package_tarname = @package_tarname@ 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@ version = @version@ version_major = @version_major@ version_minor = @version_minor@ version_release = @version_release@ version_revision = @version_revision@ version_stage = @version_stage@ EXTRA_DIST = benchbulk.sh bench_marks.js run.tpl noinst_SCRIPTS = run CLEANFILES = run 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) --foreign test/bench/Makefile'; \ $(am__cd) $(top_srcdir) && \ $(AUTOMAKE) --foreign test/bench/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 TAGS: ctags: CTAGS CTAGS: 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 $(SCRIPTS) 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 check check-am clean clean-generic clean-libtool \ 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 uninstall uninstall-am run: run.tpl sed -e "s|%abs_top_srcdir%|$(abs_top_srcdir)|" \ -e "s|%abs_top_builddir%|$(abs_top_builddir)|" \ < $< > $@ chmod +x $@ # 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: apache-couchdb-1.6.0/test/bench/bench_marks.js0000644000175000001440000000511112332105522021164 0ustar00djcusers00000000000000// Licensed under the Apache License, Version 2.0 (the "License"); you may not // use this file except in compliance with the License. You may obtain a copy of // the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, WITHOUT // WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the // License for the specific language governing permissions and limitations under // the License. var NUM_DOCS = 2000; var NUM_BATCHES = 20; var init = function() { var db = new CouchDB("bench_mark_db", {"X-Couch-Full-Commit": "false"}); db.deleteDb(); db.createDb(); return db; }; var timeit = function(func) { var startTime = (new Date()).getTime(); func(); return ((new Date()).getTime() - startTime) / 1000; }; var report = function(name, rate) { rate = Math.round(parseFloat(rate) * 100) / 100; console.log("" + name + ": " + rate + " docs/second"); }; var makeDocs = function(n) { docs = []; for (var i=0; i < n; i++) { docs.push({"foo":"bar"}); }; return docs; }; var couchTests = {}; couchTests.single_doc_insert = function() { var db = init(); var len = timeit(function() { for(var i = 0; i < NUM_DOCS; i++) { db.save({"foo": "bar"}); } }); report("Single doc inserts", NUM_DOCS/len); }; couchTests.batch_ok_doc_insert = function() { var db = init(); var len = timeit(function() { for(var i = 0; i < NUM_DOCS; i++) { db.save({"foo":"bar"}, {"batch":"ok"}); } }); report("Single doc inserts with batch=ok", NUM_DOCS/len); }; couchTests.bulk_doc_100 = function() { var db = init(); var len = timeit(function() { for(var i = 0; i < NUM_BATCHES; i++) { db.bulkSave(makeDocs(100)); } }); report("Bulk docs - 100", (NUM_BATCHES*100)/len); }; couchTests.bulk_doc_1000 = function() { var db = init(); var len = timeit(function() { for(var i = 0; i < NUM_BATCHES; i++) { db.bulkSave(makeDocs(1000)); } }); report("Bulk docs - 1000", (NUM_BATCHES*1000)/len); }; couchTests.bulk_doc_5000 = function() { var db = init(); var len = timeit(function() { for(var i = 0; i < NUM_BATCHES; i++) { db.bulkSave(makeDocs(5000)); } }); report("Bulk docs - 5000", (NUM_BATCHES*5000)/len); }; couchTests.bulk_doc_10000 = function() { var db = init(); var len = timeit(function() { for(var i = 0; i < NUM_BATCHES; i++) { db.bulkSave(makeDocs(10000)); } }); report("Bulk docs - 10000", (NUM_BATCHES*10000)/len); }; apache-couchdb-1.6.0/test/bench/benchbulk.sh0000755000175000001440000000351612332105522020655 0ustar00djcusers00000000000000#!/bin/sh -e # Licensed under the Apache License, Version 2.0 (the "License"); you may not # use this file except in compliance with the License. You may obtain a copy of # the License at # # http://www.apache.org/licenses/LICENSE-2.0 # # Unless required by applicable law or agreed to in writing, software # distributed under the License is distributed on an "AS IS" BASIS, WITHOUT # WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the # License for the specific language governing permissions and limitations under # the License. # # usage: time benchbulk.sh # it takes about 30 seconds to run on my old MacBook with bulksize 1000 BULKSIZE=100 DOCSIZE=10 INSERTS=10 ROUNDS=10 DBURL="http://127.0.0.1:5984/benchbulk" POSTURL="$DBURL/_bulk_docs" function make_bulk_docs() { ROW=0 SIZE=$(($1-1)) START=$2 BODYSIZE=$3 BODY=$(printf "%0${BODYSIZE}d") echo '{"docs":[' while [ $ROW -lt $SIZE ]; do printf '{"_id":"%020d", "body":"'$BODY'"},' $(($ROW + $START)) let ROW=ROW+1 done printf '{"_id":"%020d", "body":"'$BODY'"}' $(($ROW + $START)) echo ']}' } echo "Making $INSERTS bulk inserts of $BULKSIZE docs each" echo "Attempt to delete db at $DBURL" curl -X DELETE $DBURL -w\\n echo "Attempt to create db at $DBURL" curl -X PUT $DBURL -w\\n echo "Running $ROUNDS rounds of $INSERTS concurrent inserts to $POSTURL" RUN=0 while [ $RUN -lt $ROUNDS ]; do POSTS=0 while [ $POSTS -lt $INSERTS ]; do STARTKEY=$[ POSTS * BULKSIZE + RUN * BULKSIZE * INSERTS ] echo "startkey $STARTKEY bulksize $BULKSIZE" DOCS=$(make_bulk_docs $BULKSIZE $STARTKEY $DOCSIZE) # echo $DOCS echo $DOCS | curl -T - -H Content-Type:application/json -X POST $POSTURL -w%{http_code}\ %{time_total}\ sec\\n >/dev/null 2>&1 & let POSTS=POSTS+1 done echo "waiting" wait let RUN=RUN+1 done curl $DBURL -w\\n apache-couchdb-1.6.0/test/javascript/0000755000175000001440000000000012332106073017445 5ustar00djcusers00000000000000apache-couchdb-1.6.0/test/javascript/cli_runner.js0000644000175000001440000000253012332105522022141 0ustar00djcusers00000000000000// Licensed under the Apache License, Version 2.0 (the "License"); you may not // use this file except in compliance with the License. You may obtain a copy of // the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, WITHOUT // WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the // License for the specific language governing permissions and limitations under // the License. // /* * Futon test suite was designed to be able to run all tests populated into * couchTests. Here we should only be loading one test, so we'll pop the first * test off the list and run the test. If more than one item is loaded in the * test object, return an error. */ function runTest() { var count = 0; var start = new Date().getTime(); for(var name in couchTests) { count++; } if (count !== 1) { console.log('Only one test per file is allowed.'); quit(1); } try { // Add artificial wait for each test of 1 sec while (new Date().getTime() < start + 1200); couchTests[name](); print('OK'); } catch(e) { console.log("FAIL\nReason: " + e.message); fmtStack(e.stack); quit(1); } } waitForSuccess(CouchDB.isRunning, 'isRunning'); runTest(); apache-couchdb-1.6.0/test/javascript/run.tpl0000644000175000001440000000573112332105522020776 0ustar00djcusers00000000000000#!/bin/sh -e # Licensed under the Apache License, Version 2.0 (the "License"); you may not # use this file except in compliance with the License. You may obtain a copy of # the License at # # http://www.apache.org/licenses/LICENSE-2.0 # # Unless required by applicable law or agreed to in writing, software # distributed under the License is distributed on an "AS IS" BASIS, WITHOUT # WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the # License for the specific language governing permissions and limitations under # the License. SRC_DIR=%abs_top_srcdir% BUILD_DIR=%abs_top_builddir% SCRIPT_DIR=$SRC_DIR/share/www/script JS_TEST_DIR=$SRC_DIR/test/javascript COUCHJS=%abs_top_builddir%/src/couchdb/priv/couchjs COUCH_URI_FILE=%localstaterundir%/couch.uri # make check-js calls us with MAKE=$(MAKE) so BSDish `gmake` invocations # will get passed on correctly. If $0 gets run manually, default to # `make` if [ -z "$MAKE" ]; then MAKE=make fi trap 'abort' EXIT INT start() { ./utils/run -b -r 0 -n \ -a $BUILD_DIR/etc/couchdb/default_dev.ini \ -a $SRC_DIR/test/random_port.ini \ -a $BUILD_DIR/etc/couchdb/local_dev.ini 1>/dev/null } stop() { ./utils/run -d 1>/dev/null } restart() { stop start } abort() { trap - 0 stop exit 2 } process_response() { while read data do if [ $data = 'restart' ]; then if [ -z $COUCHDB_NO_START ]; then restart fi else echo "$data" fi done } run() { # start the tests /bin/echo -n "$1 ... " $COUCHJS -H -u $COUCH_URI_FILE \ $SCRIPT_DIR/json2.js \ $SCRIPT_DIR/sha1.js \ $SCRIPT_DIR/oauth.js \ $SCRIPT_DIR/couch.js \ $SCRIPT_DIR/replicator_db_inc.js \ $SCRIPT_DIR/couch_test_runner.js \ $JS_TEST_DIR/couch_http.js \ $JS_TEST_DIR/test_setup.js \ $1 \ $JS_TEST_DIR/cli_runner.js | process_response if [ -z $RESULT ]; then RESULT=$? elif [ "$?" -eq 1 ]; then RESULT=$? fi } run_files() { COUNTER=1 FILE_COUNT=$(ls -l $1 | wc -l) FILE_COUNT=$(expr $FILE_COUNT + 0) for TEST_SRC in $1 do /bin/echo -n "$COUNTER/$FILE_COUNT " COUNTER=$(expr $COUNTER + 1) run $TEST_SRC done } # start CouchDB if [ -z $COUCHDB_NO_START ]; then $MAKE dev start fi echo "Running javascript tests ..." if [ "$#" -eq 0 ]; then run_files "$SCRIPT_DIR/test/*.js" else if [ -d $1 ]; then run_files "$1/*.js" else TEST_SRC="$1" if [ ! -f $TEST_SRC ]; then TEST_SRC="$SCRIPT_DIR/test/$1" if [ ! -f $TEST_SRC ]; then TEST_SRC="$SCRIPT_DIR/test/$1.js" if [ ! -f $TEST_SRC ]; then echo "file $1 does not exist" exit 1 fi fi fi fi run $TEST_SRC fi if [ -z $COUCHDB_NO_START ]; then stop fi trap - 0 exit $RESULT apache-couchdb-1.6.0/test/javascript/couch_http.js0000644000175000001440000000423012332105522022140 0ustar00djcusers00000000000000// Licensed under the Apache License, Version 2.0 (the "License"); you may not // use this file except in compliance with the License. You may obtain a copy of // the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, WITHOUT // WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the // License for the specific language governing permissions and limitations under // the License. (function() { if(typeof(CouchHTTP) != "undefined") { CouchHTTP.prototype.open = function(method, url, async) { if(!/^\s*http:\/\//.test(url)) { if(/^\//.test(url)) { // The couch.uri file (base_url) has a trailing slash url = this.base_url + url.slice(1); } else { url = this.base_url + url; } } return this._open(method, url, async); }; CouchHTTP.prototype.setRequestHeader = function(name, value) { // Drop content-length headers because cURL will set it for us // based on body length if(name.toLowerCase().replace(/^\s+|\s+$/g, '') != "content-length") { this._setRequestHeader(name, value); } } CouchHTTP.prototype.send = function(body) { this._send(body || ""); var headers = {}; this._headers.forEach(function(hdr) { var pair = hdr.split(":"); var name = pair.shift(); headers[name] = pair.join(":").replace(/^\s+|\s+$/g, ""); }); this.headers = headers; }; CouchHTTP.prototype.getResponseHeader = function(name) { for(var hdr in this.headers) { if(hdr.toLowerCase() == name.toLowerCase()) { return this.headers[hdr]; } } return null; }; } })(); CouchDB.urlPrefix = ""; CouchDB.newXhr = function() { return new CouchHTTP(); }; CouchDB.xhrheader = function(xhr, header) { if(typeof(xhr) == "CouchHTTP") { return xhr.getResponseHeader(header); } else { return xhr.headers[header]; } } CouchDB.xhrbody = function(xhr) { return xhr.responseText || xhr.body; } apache-couchdb-1.6.0/test/javascript/Makefile.am0000644000175000001440000000154312332105522021502 0ustar00djcusers00000000000000## Licensed under the Apache License, Version 2.0 (the "License"); you may not ## use this file except in compliance with the License. You may obtain a copy of ## the License at ## ## http://www.apache.org/licenses/LICENSE-2.0 ## ## Unless required by applicable law or agreed to in writing, software ## distributed under the License is distributed on an "AS IS" BASIS, WITHOUT ## WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the ## License for the specific language governing permissions and limitations under ## the License. EXTRA_DIST = \ cli_runner.js \ couch_http.js \ test_setup.js \ run.tpl noinst_SCRIPTS = run CLEANFILES = run run: run.tpl sed -e "s|%abs_top_srcdir%|$(abs_top_srcdir)|" \ -e "s|%abs_top_builddir%|$(abs_top_builddir)|" \ -e "s|%localstaterundir%|$(abs_top_builddir)/tmp/run|g" \ < $< > $@ chmod +x $@ apache-couchdb-1.6.0/test/javascript/Makefile.in0000644000175000001440000003074712332105553021527 0ustar00djcusers00000000000000# Makefile.in generated by automake 1.11.6 from Makefile.am. # @configure_input@ # Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, # 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011 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__make_dryrun = \ { \ am__dry=no; \ case $$MAKEFLAGS in \ *\\[\ \ ]*) \ echo 'am--echo: ; @echo "AM" OK' | $(MAKE) -f - 2>/dev/null \ | grep '^AM OK$$' >/dev/null || am__dry=yes;; \ *) \ for am__flg in $$MAKEFLAGS; do \ case $$am__flg in \ *=*|--*) ;; \ *n*) am__dry=yes; break;; \ esac; \ done;; \ esac; \ test $$am__dry = yes; \ } 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 = test/javascript DIST_COMMON = $(srcdir)/Makefile.am $(srcdir)/Makefile.in ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 am__aclocal_m4_deps = $(top_srcdir)/m4/libtool.m4 \ $(top_srcdir)/m4/ltoptions.m4 $(top_srcdir)/m4/ltsugar.m4 \ $(top_srcdir)/m4/ltversion.m4 $(top_srcdir)/m4/lt~obsolete.m4 \ $(top_srcdir)/acinclude.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 \ $(top_builddir)/src/snappy/google-snappy/config.h CONFIG_CLEAN_FILES = CONFIG_CLEAN_VPATH_FILES = SCRIPTS = $(noinst_SCRIPTS) 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 DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) ACLOCAL = @ACLOCAL@ AMTAR = @AMTAR@ AR = @AR@ AS = @AS@ AUTOCONF = @AUTOCONF@ AUTOHEADER = @AUTOHEADER@ AUTOMAKE = @AUTOMAKE@ AWK = @AWK@ CC = @CC@ CCDEPMODE = @CCDEPMODE@ CFLAGS = @CFLAGS@ CPP = @CPP@ CPPFLAGS = @CPPFLAGS@ CURL_CFLAGS = @CURL_CFLAGS@ CURL_CONFIG = @CURL_CONFIG@ CURL_LIBS = @CURL_LIBS@ CXX = @CXX@ CXXCPP = @CXXCPP@ CXXDEPMODE = @CXXDEPMODE@ CXXFLAGS = @CXXFLAGS@ CYGPATH_W = @CYGPATH_W@ DEFS = @DEFS@ DEPDIR = @DEPDIR@ DLLTOOL = @DLLTOOL@ DSYMUTIL = @DSYMUTIL@ DUMPBIN = @DUMPBIN@ ECHO_C = @ECHO_C@ ECHO_N = @ECHO_N@ ECHO_T = @ECHO_T@ EGREP = @EGREP@ ERL = @ERL@ ERLANG_FLAGS = @ERLANG_FLAGS@ ERLC = @ERLC@ ERLC_FLAGS = @ERLC_FLAGS@ ESCRIPT = @ESCRIPT@ EXEEXT = @EXEEXT@ FGREP = @FGREP@ FLAGS = @FLAGS@ GREP = @GREP@ HAS_HELP2MAN = @HAS_HELP2MAN@ HAS_INSTALLINFO = @HAS_INSTALLINFO@ HAS_MAKEINFO = @HAS_MAKEINFO@ HAS_PDFLATEX = @HAS_PDFLATEX@ HAS_SPHINX_BUILD = @HAS_SPHINX_BUILD@ ICU_BIN = @ICU_BIN@ ICU_CFLAGS = @ICU_CFLAGS@ ICU_CONFIG = @ICU_CONFIG@ ICU_CPPFLAGS = @ICU_CPPFLAGS@ ICU_CXXFLAGS = @ICU_CXXFLAGS@ ICU_LIBS = @ICU_LIBS@ INNO_COMPILER_EXECUTABLE = @INNO_COMPILER_EXECUTABLE@ INSTALL = @INSTALL@ INSTALL_DATA = @INSTALL_DATA@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ INSTALL_SCRIPT = @INSTALL_SCRIPT@ INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ JS_CFLAGS = @JS_CFLAGS@ JS_LIBS = @JS_LIBS@ JS_LIB_BINARY = @JS_LIB_BINARY@ LD = @LD@ LDFLAGS = @LDFLAGS@ LIBOBJS = @LIBOBJS@ LIBS = @LIBS@ LIBTOOL = @LIBTOOL@ LIPO = @LIPO@ LN_S = @LN_S@ LTLIBOBJS = @LTLIBOBJS@ MAKEINFO = @MAKEINFO@ MANIFEST_TOOL = @MANIFEST_TOOL@ MKDIR_P = @MKDIR_P@ NM = @NM@ NMEDIT = @NMEDIT@ OBJDUMP = @OBJDUMP@ OBJEXT = @OBJEXT@ OTOOL = @OTOOL@ OTOOL64 = @OTOOL64@ PACKAGE = @PACKAGE@ PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ PACKAGE_NAME = @PACKAGE_NAME@ PACKAGE_STRING = @PACKAGE_STRING@ PACKAGE_TARNAME = @PACKAGE_TARNAME@ PACKAGE_URL = @PACKAGE_URL@ PACKAGE_VERSION = @PACKAGE_VERSION@ PATH_SEPARATOR = @PATH_SEPARATOR@ PKG_CONFIG = @PKG_CONFIG@ PKG_CONFIG_LIBDIR = @PKG_CONFIG_LIBDIR@ PKG_CONFIG_PATH = @PKG_CONFIG_PATH@ RANLIB = @RANLIB@ SED = @SED@ SET_MAKE = @SET_MAKE@ SHELL = @SHELL@ SNAPPY_MAJOR = @SNAPPY_MAJOR@ SNAPPY_MINOR = @SNAPPY_MINOR@ SNAPPY_PATCHLEVEL = @SNAPPY_PATCHLEVEL@ STRIP = @STRIP@ VERSION = @VERSION@ 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@ ac_cv_have_stddef_h = @ac_cv_have_stddef_h@ ac_cv_have_stdint_h = @ac_cv_have_stdint_h@ am__include = @am__include@ am__leading_dot = @am__leading_dot@ am__quote = @am__quote@ am__tar = @am__tar@ am__untar = @am__untar@ bindir = @bindir@ bug_uri = @bug_uri@ 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@ dvidir = @dvidir@ erlangbin = @erlangbin@ erlangversion = @erlangversion@ exec_prefix = @exec_prefix@ host = @host@ host_alias = @host_alias@ host_cpu = @host_cpu@ host_os = @host_os@ host_vendor = @host_vendor@ htmldir = @htmldir@ includedir = @includedir@ infodir = @infodir@ initdir = @initdir@ install_sh = @install_sh@ launchddir = @launchddir@ libdir = @libdir@ libexecdir = @libexecdir@ localconfdir = @localconfdir@ localdatadir = @localdatadir@ localdocdir = @localdocdir@ localedir = @localedir@ localerlanglibdir = @localerlanglibdir@ locallibbindir = @locallibbindir@ locallibdir = @locallibdir@ localstatedir = @localstatedir@ localstatelibdir = @localstatelibdir@ localstatelogdir = @localstatelogdir@ localstaterundir = @localstaterundir@ mandir = @mandir@ mkdir_p = @mkdir_p@ msvc_redist_dir = @msvc_redist_dir@ msvc_redist_name = @msvc_redist_name@ oldincludedir = @oldincludedir@ openssl_bin_dir = @openssl_bin_dir@ otp_release = @otp_release@ package_author_address = @package_author_address@ package_author_name = @package_author_name@ package_identifier = @package_identifier@ package_name = @package_name@ package_tarname = @package_tarname@ 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@ version = @version@ version_major = @version_major@ version_minor = @version_minor@ version_release = @version_release@ version_revision = @version_revision@ version_stage = @version_stage@ EXTRA_DIST = \ cli_runner.js \ couch_http.js \ test_setup.js \ run.tpl noinst_SCRIPTS = run CLEANFILES = run 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) --foreign test/javascript/Makefile'; \ $(am__cd) $(top_srcdir) && \ $(AUTOMAKE) --foreign test/javascript/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 TAGS: ctags: CTAGS CTAGS: 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 $(SCRIPTS) 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 check check-am clean clean-generic clean-libtool \ 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 uninstall uninstall-am run: run.tpl sed -e "s|%abs_top_srcdir%|$(abs_top_srcdir)|" \ -e "s|%abs_top_builddir%|$(abs_top_builddir)|" \ -e "s|%localstaterundir%|$(abs_top_builddir)/tmp/run|g" \ < $< > $@ chmod +x $@ # 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: apache-couchdb-1.6.0/test/javascript/test_setup.js0000644000175000001440000000454212332105522022205 0ustar00djcusers00000000000000// Licensed under the Apache License, Version 2.0 (the "License"); you may not // use this file except in compliance with the License. You may obtain a copy of // the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, WITHOUT // WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the // License for the specific language governing permissions and limitations under // the License. /* * Add global couchTests object required for existing tests. */ var couchTests = {}; var console = { log: function(arg) { var msg = (arg.toString()).replace(/\n/g, "\n "); print(msg, true); } }; var fmtStack = function(stack) { if(!stack) { console.log("No stack information"); return; } console.log("Trace back (most recent call first):\n"); var re = new RegExp("(.*?)@([^:]*):(.*)$"); var lines = stack.split("\n"); for(var i = 0; i < lines.length; i++) { var line = lines[i]; if(!line.length) continue; var match = re.exec(line); if(!match) continue var match = re.exec(line); if(!match) continue var source = match[1].substr(0, 70); var file = match[2]; var lnum = match[3]; while(lnum.length < 3) lnum = " " + lnum; console.log(" " + lnum + ": " + file); console.log(" " + source); } } function T(arg1, arg2) { if(!arg1) { var result = (arg2 ? arg2 : arg1); throw((result instanceof Error ? result : Error(result))); } } function waitForSuccess(fun, tag) { var start = new Date().getTime(); var complete = false; while (!complete) { var now = new Date().getTime(); if (now > start + 5000) { complete = true; print('FAIL'); print(tag); quit(1); } try { while (new Date().getTime() < now + 500); complete = fun(); } catch (e) {} } } function restartServer() { print('restart'); var start = new Date().getTime(); while (new Date().getTime() < start + 1000); waitForSuccess(CouchDB.isRunning, 'restart'); } /* * If last_req is an object, we got something back. This might be an error, but * CouchDB is up and running! */ CouchDB.isRunning = function() { CouchDB.last_req = CouchDB.request("GET", "/"); return typeof CouchDB.last_req == 'object'; }; apache-couchdb-1.6.0/test/random_port.ini0000644000175000001440000000144312332105522020324 0ustar00djcusers00000000000000; Licensed to the Apache Software Foundation (ASF) under one ; or more contributor license agreements. See the NOTICE file ; distributed with this work for additional information ; regarding copyright ownership. The ASF licenses this file ; to you under the Apache License, Version 2.0 (the ; "License"); you may not use this file except in compliance ; with the License. You may obtain a copy of the License at ; ; http://www.apache.org/licenses/LICENSE-2.0 ; ; Unless required by applicable law or agreed to in writing, ; software distributed under the License is distributed on an ; "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY ; KIND, either express or implied. See the License for the ; specific language governing permissions and limitations ; under the License. [httpd] port = 0 apache-couchdb-1.6.0/test/Makefile.am0000644000175000001440000000116412332105522017333 0ustar00djcusers00000000000000## Licensed under the Apache License, Version 2.0 (the "License"); you may not ## use this file except in compliance with the License. You may obtain a copy of ## the License at ## ## http://www.apache.org/licenses/LICENSE-2.0 ## ## Unless required by applicable law or agreed to in writing, software ## distributed under the License is distributed on an "AS IS" BASIS, WITHOUT ## WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the ## License for the specific language governing permissions and limitations under ## the License. SUBDIRS = bench etap javascript view_server EXTRA_DIST = random_port.ini apache-couchdb-1.6.0/test/Makefile.in0000644000175000001440000004620012332105552017347 0ustar00djcusers00000000000000# Makefile.in generated by automake 1.11.6 from Makefile.am. # @configure_input@ # Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, # 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011 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__make_dryrun = \ { \ am__dry=no; \ case $$MAKEFLAGS in \ *\\[\ \ ]*) \ echo 'am--echo: ; @echo "AM" OK' | $(MAKE) -f - 2>/dev/null \ | grep '^AM OK$$' >/dev/null || am__dry=yes;; \ *) \ for am__flg in $$MAKEFLAGS; do \ case $$am__flg in \ *=*|--*) ;; \ *n*) am__dry=yes; break;; \ esac; \ done;; \ esac; \ test $$am__dry = yes; \ } 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 = test DIST_COMMON = $(srcdir)/Makefile.am $(srcdir)/Makefile.in ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 am__aclocal_m4_deps = $(top_srcdir)/m4/libtool.m4 \ $(top_srcdir)/m4/ltoptions.m4 $(top_srcdir)/m4/ltsugar.m4 \ $(top_srcdir)/m4/ltversion.m4 $(top_srcdir)/m4/lt~obsolete.m4 \ $(top_srcdir)/acinclude.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 \ $(top_builddir)/src/snappy/google-snappy/config.h CONFIG_CLEAN_FILES = CONFIG_CLEAN_VPATH_FILES = SOURCES = DIST_SOURCES = RECURSIVE_TARGETS = all-recursive check-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 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=) \ $(RECURSIVE_CLEAN_TARGETS:-recursive=) tags TAGS ctags CTAGS \ distdir 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@ AMTAR = @AMTAR@ AR = @AR@ AS = @AS@ AUTOCONF = @AUTOCONF@ AUTOHEADER = @AUTOHEADER@ AUTOMAKE = @AUTOMAKE@ AWK = @AWK@ CC = @CC@ CCDEPMODE = @CCDEPMODE@ CFLAGS = @CFLAGS@ CPP = @CPP@ CPPFLAGS = @CPPFLAGS@ CURL_CFLAGS = @CURL_CFLAGS@ CURL_CONFIG = @CURL_CONFIG@ CURL_LIBS = @CURL_LIBS@ CXX = @CXX@ CXXCPP = @CXXCPP@ CXXDEPMODE = @CXXDEPMODE@ CXXFLAGS = @CXXFLAGS@ CYGPATH_W = @CYGPATH_W@ DEFS = @DEFS@ DEPDIR = @DEPDIR@ DLLTOOL = @DLLTOOL@ DSYMUTIL = @DSYMUTIL@ DUMPBIN = @DUMPBIN@ ECHO_C = @ECHO_C@ ECHO_N = @ECHO_N@ ECHO_T = @ECHO_T@ EGREP = @EGREP@ ERL = @ERL@ ERLANG_FLAGS = @ERLANG_FLAGS@ ERLC = @ERLC@ ERLC_FLAGS = @ERLC_FLAGS@ ESCRIPT = @ESCRIPT@ EXEEXT = @EXEEXT@ FGREP = @FGREP@ FLAGS = @FLAGS@ GREP = @GREP@ HAS_HELP2MAN = @HAS_HELP2MAN@ HAS_INSTALLINFO = @HAS_INSTALLINFO@ HAS_MAKEINFO = @HAS_MAKEINFO@ HAS_PDFLATEX = @HAS_PDFLATEX@ HAS_SPHINX_BUILD = @HAS_SPHINX_BUILD@ ICU_BIN = @ICU_BIN@ ICU_CFLAGS = @ICU_CFLAGS@ ICU_CONFIG = @ICU_CONFIG@ ICU_CPPFLAGS = @ICU_CPPFLAGS@ ICU_CXXFLAGS = @ICU_CXXFLAGS@ ICU_LIBS = @ICU_LIBS@ INNO_COMPILER_EXECUTABLE = @INNO_COMPILER_EXECUTABLE@ INSTALL = @INSTALL@ INSTALL_DATA = @INSTALL_DATA@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ INSTALL_SCRIPT = @INSTALL_SCRIPT@ INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ JS_CFLAGS = @JS_CFLAGS@ JS_LIBS = @JS_LIBS@ JS_LIB_BINARY = @JS_LIB_BINARY@ LD = @LD@ LDFLAGS = @LDFLAGS@ LIBOBJS = @LIBOBJS@ LIBS = @LIBS@ LIBTOOL = @LIBTOOL@ LIPO = @LIPO@ LN_S = @LN_S@ LTLIBOBJS = @LTLIBOBJS@ MAKEINFO = @MAKEINFO@ MANIFEST_TOOL = @MANIFEST_TOOL@ MKDIR_P = @MKDIR_P@ NM = @NM@ NMEDIT = @NMEDIT@ OBJDUMP = @OBJDUMP@ OBJEXT = @OBJEXT@ OTOOL = @OTOOL@ OTOOL64 = @OTOOL64@ PACKAGE = @PACKAGE@ PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ PACKAGE_NAME = @PACKAGE_NAME@ PACKAGE_STRING = @PACKAGE_STRING@ PACKAGE_TARNAME = @PACKAGE_TARNAME@ PACKAGE_URL = @PACKAGE_URL@ PACKAGE_VERSION = @PACKAGE_VERSION@ PATH_SEPARATOR = @PATH_SEPARATOR@ PKG_CONFIG = @PKG_CONFIG@ PKG_CONFIG_LIBDIR = @PKG_CONFIG_LIBDIR@ PKG_CONFIG_PATH = @PKG_CONFIG_PATH@ RANLIB = @RANLIB@ SED = @SED@ SET_MAKE = @SET_MAKE@ SHELL = @SHELL@ SNAPPY_MAJOR = @SNAPPY_MAJOR@ SNAPPY_MINOR = @SNAPPY_MINOR@ SNAPPY_PATCHLEVEL = @SNAPPY_PATCHLEVEL@ STRIP = @STRIP@ VERSION = @VERSION@ 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@ ac_cv_have_stddef_h = @ac_cv_have_stddef_h@ ac_cv_have_stdint_h = @ac_cv_have_stdint_h@ am__include = @am__include@ am__leading_dot = @am__leading_dot@ am__quote = @am__quote@ am__tar = @am__tar@ am__untar = @am__untar@ bindir = @bindir@ bug_uri = @bug_uri@ 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@ dvidir = @dvidir@ erlangbin = @erlangbin@ erlangversion = @erlangversion@ exec_prefix = @exec_prefix@ host = @host@ host_alias = @host_alias@ host_cpu = @host_cpu@ host_os = @host_os@ host_vendor = @host_vendor@ htmldir = @htmldir@ includedir = @includedir@ infodir = @infodir@ initdir = @initdir@ install_sh = @install_sh@ launchddir = @launchddir@ libdir = @libdir@ libexecdir = @libexecdir@ localconfdir = @localconfdir@ localdatadir = @localdatadir@ localdocdir = @localdocdir@ localedir = @localedir@ localerlanglibdir = @localerlanglibdir@ locallibbindir = @locallibbindir@ locallibdir = @locallibdir@ localstatedir = @localstatedir@ localstatelibdir = @localstatelibdir@ localstatelogdir = @localstatelogdir@ localstaterundir = @localstaterundir@ mandir = @mandir@ mkdir_p = @mkdir_p@ msvc_redist_dir = @msvc_redist_dir@ msvc_redist_name = @msvc_redist_name@ oldincludedir = @oldincludedir@ openssl_bin_dir = @openssl_bin_dir@ otp_release = @otp_release@ package_author_address = @package_author_address@ package_author_name = @package_author_name@ package_identifier = @package_identifier@ package_name = @package_name@ package_tarname = @package_tarname@ 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@ version = @version@ version_major = @version_major@ version_minor = @version_minor@ version_release = @version_release@ version_revision = @version_revision@ version_stage = @version_stage@ SUBDIRS = bench etap javascript view_server EXTRA_DIST = random_port.ini 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) --foreign test/Makefile'; \ $(am__cd) $(top_srcdir) && \ $(AUTOMAKE) --foreign 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): 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. $(RECURSIVE_TARGETS): @fail= failcom='exit 1'; \ for f in x $$MAKEFLAGS; do \ case $$f in \ *=* | --[!k]*);; \ *k*) failcom='fail=yes';; \ esac; \ done; \ dot_seen=no; \ target=`echo $@ | sed s/-recursive//`; \ list='$(SUBDIRS)'; for subdir in $$list; do \ echo "Making $$target in $$subdir"; \ if test "$$subdir" = "."; then \ dot_seen=yes; \ local_target="$$target-am"; \ else \ local_target="$$target"; \ fi; \ ($(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" $(RECURSIVE_CLEAN_TARGETS): @fail= failcom='exit 1'; \ for f in x $$MAKEFLAGS; do \ case $$f in \ *=* | --[!k]*);; \ *k*) failcom='fail=yes';; \ esac; \ done; \ dot_seen=no; \ case "$@" in \ distclean-* | maintainer-clean-*) list='$(DIST_SUBDIRS)' ;; \ *) list='$(SUBDIRS)' ;; \ esac; \ rev=''; for subdir in $$list; do \ if test "$$subdir" = "."; then :; else \ rev="$$subdir $$rev"; \ fi; \ done; \ rev="$$rev ."; \ target=`echo $@ | sed s/-recursive//`; \ for subdir in $$rev; do \ echo "Making $$target in $$subdir"; \ if test "$$subdir" = "."; then \ local_target="$$target-am"; \ else \ local_target="$$target"; \ fi; \ ($(am__cd) $$subdir && $(MAKE) $(AM_MAKEFLAGS) $$local_target) \ || eval $$failcom; \ done && test -z "$$fail" tags-recursive: list='$(SUBDIRS)'; for subdir in $$list; do \ test "$$subdir" = . || ($(am__cd) $$subdir && $(MAKE) $(AM_MAKEFLAGS) tags); \ done ctags-recursive: list='$(SUBDIRS)'; for subdir in $$list; do \ test "$$subdir" = . || ($(am__cd) $$subdir && $(MAKE) $(AM_MAKEFLAGS) ctags); \ done ID: $(HEADERS) $(SOURCES) $(LISP) $(TAGS_FILES) list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | \ $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ END { if (nonempty) { for (i in files) print i; }; }'`; \ mkid -fID $$unique tags: TAGS TAGS: tags-recursive $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ $(TAGS_FILES) $(LISP) 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; \ list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | \ $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ END { if (nonempty) { for (i in files) print i; }; }'`; \ 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 CTAGS: ctags-recursive $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ $(TAGS_FILES) $(LISP) list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | \ $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ END { if (nonempty) { for (i in files) print i; }; }'`; \ 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" 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: $(RECURSIVE_CLEAN_TARGETS) $(RECURSIVE_TARGETS) ctags-recursive \ install-am install-strip tags-recursive .PHONY: $(RECURSIVE_CLEAN_TARGETS) $(RECURSIVE_TARGETS) CTAGS GTAGS \ all all-am check check-am clean clean-generic clean-libtool \ ctags ctags-recursive 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-recursive \ 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: apache-couchdb-1.6.0/test/view_server/0000755000175000001440000000000012332106073017637 5ustar00djcusers00000000000000apache-couchdb-1.6.0/test/view_server/run_native_process.es0000755000175000001440000000332512332105522024104 0ustar00djcusers00000000000000#! /usr/bin/env escript % Licensed under the Apache License, Version 2.0 (the "License"); you may not % use this file except in compliance with the License. You may obtain a copy of % the License at % % http://www.apache.org/licenses/LICENSE-2.0 % % Unless required by applicable law or agreed to in writing, software % distributed under the License is distributed on an "AS IS" BASIS, WITHOUT % WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the % License for the specific language governing permissions and limitations under % the License. read() -> case io:get_line('') of eof -> stop; Data -> couch_util:json_decode(Data) end. send(Data) when is_binary(Data) -> send(binary_to_list(Data)); send(Data) when is_list(Data) -> io:format(Data ++ "\n", []). write(Data) -> % log("~p", [Data]), case (catch couch_util:json_encode(Data)) of % when testing, this is what prints your errors {json_encode, Error} -> write({[{<<"error">>, Error}]}); Json -> send(Json) end. % log(Mesg) -> % log(Mesg, []). % log(Mesg, Params) -> % io:format(standard_error, Mesg, Params). % jlog(Mesg) -> % write([<<"log">>, list_to_binary(io_lib:format("~p",[Mesg]))]). loop(Pid) -> case read() of stop -> ok; Json -> case (catch couch_native_process:prompt(Pid, Json)) of {error, Reason} -> ok = write([error, Reason, Reason]); Resp -> ok = write(Resp), loop(Pid) end end. main([]) -> code:add_pathz("src/couchdb"), code:add_pathz("src/mochiweb"), {ok, Pid} = couch_native_process:start_link(), loop(Pid). apache-couchdb-1.6.0/test/view_server/Makefile.am0000644000175000001440000000115012332105522021666 0ustar00djcusers00000000000000## Licensed under the Apache License, Version 2.0 (the "License"); you may not ## use this file except in compliance with the License. You may obtain a copy of ## the License at ## ## http://www.apache.org/licenses/LICENSE-2.0 ## ## Unless required by applicable law or agreed to in writing, software ## distributed under the License is distributed on an "AS IS" BASIS, WITHOUT ## WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the ## License for the specific language governing permissions and limitations under ## the License. EXTRA_DIST = \ query_server_spec.rb \ run_native_process.es apache-couchdb-1.6.0/test/view_server/Makefile.in0000644000175000001440000003022712332105553021712 0ustar00djcusers00000000000000# Makefile.in generated by automake 1.11.6 from Makefile.am. # @configure_input@ # Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, # 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011 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__make_dryrun = \ { \ am__dry=no; \ case $$MAKEFLAGS in \ *\\[\ \ ]*) \ echo 'am--echo: ; @echo "AM" OK' | $(MAKE) -f - 2>/dev/null \ | grep '^AM OK$$' >/dev/null || am__dry=yes;; \ *) \ for am__flg in $$MAKEFLAGS; do \ case $$am__flg in \ *=*|--*) ;; \ *n*) am__dry=yes; break;; \ esac; \ done;; \ esac; \ test $$am__dry = yes; \ } 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 = test/view_server DIST_COMMON = $(srcdir)/Makefile.am $(srcdir)/Makefile.in ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 am__aclocal_m4_deps = $(top_srcdir)/m4/libtool.m4 \ $(top_srcdir)/m4/ltoptions.m4 $(top_srcdir)/m4/ltsugar.m4 \ $(top_srcdir)/m4/ltversion.m4 $(top_srcdir)/m4/lt~obsolete.m4 \ $(top_srcdir)/acinclude.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 \ $(top_builddir)/src/snappy/google-snappy/config.h CONFIG_CLEAN_FILES = CONFIG_CLEAN_VPATH_FILES = 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 DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) ACLOCAL = @ACLOCAL@ AMTAR = @AMTAR@ AR = @AR@ AS = @AS@ AUTOCONF = @AUTOCONF@ AUTOHEADER = @AUTOHEADER@ AUTOMAKE = @AUTOMAKE@ AWK = @AWK@ CC = @CC@ CCDEPMODE = @CCDEPMODE@ CFLAGS = @CFLAGS@ CPP = @CPP@ CPPFLAGS = @CPPFLAGS@ CURL_CFLAGS = @CURL_CFLAGS@ CURL_CONFIG = @CURL_CONFIG@ CURL_LIBS = @CURL_LIBS@ CXX = @CXX@ CXXCPP = @CXXCPP@ CXXDEPMODE = @CXXDEPMODE@ CXXFLAGS = @CXXFLAGS@ CYGPATH_W = @CYGPATH_W@ DEFS = @DEFS@ DEPDIR = @DEPDIR@ DLLTOOL = @DLLTOOL@ DSYMUTIL = @DSYMUTIL@ DUMPBIN = @DUMPBIN@ ECHO_C = @ECHO_C@ ECHO_N = @ECHO_N@ ECHO_T = @ECHO_T@ EGREP = @EGREP@ ERL = @ERL@ ERLANG_FLAGS = @ERLANG_FLAGS@ ERLC = @ERLC@ ERLC_FLAGS = @ERLC_FLAGS@ ESCRIPT = @ESCRIPT@ EXEEXT = @EXEEXT@ FGREP = @FGREP@ FLAGS = @FLAGS@ GREP = @GREP@ HAS_HELP2MAN = @HAS_HELP2MAN@ HAS_INSTALLINFO = @HAS_INSTALLINFO@ HAS_MAKEINFO = @HAS_MAKEINFO@ HAS_PDFLATEX = @HAS_PDFLATEX@ HAS_SPHINX_BUILD = @HAS_SPHINX_BUILD@ ICU_BIN = @ICU_BIN@ ICU_CFLAGS = @ICU_CFLAGS@ ICU_CONFIG = @ICU_CONFIG@ ICU_CPPFLAGS = @ICU_CPPFLAGS@ ICU_CXXFLAGS = @ICU_CXXFLAGS@ ICU_LIBS = @ICU_LIBS@ INNO_COMPILER_EXECUTABLE = @INNO_COMPILER_EXECUTABLE@ INSTALL = @INSTALL@ INSTALL_DATA = @INSTALL_DATA@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ INSTALL_SCRIPT = @INSTALL_SCRIPT@ INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ JS_CFLAGS = @JS_CFLAGS@ JS_LIBS = @JS_LIBS@ JS_LIB_BINARY = @JS_LIB_BINARY@ LD = @LD@ LDFLAGS = @LDFLAGS@ LIBOBJS = @LIBOBJS@ LIBS = @LIBS@ LIBTOOL = @LIBTOOL@ LIPO = @LIPO@ LN_S = @LN_S@ LTLIBOBJS = @LTLIBOBJS@ MAKEINFO = @MAKEINFO@ MANIFEST_TOOL = @MANIFEST_TOOL@ MKDIR_P = @MKDIR_P@ NM = @NM@ NMEDIT = @NMEDIT@ OBJDUMP = @OBJDUMP@ OBJEXT = @OBJEXT@ OTOOL = @OTOOL@ OTOOL64 = @OTOOL64@ PACKAGE = @PACKAGE@ PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ PACKAGE_NAME = @PACKAGE_NAME@ PACKAGE_STRING = @PACKAGE_STRING@ PACKAGE_TARNAME = @PACKAGE_TARNAME@ PACKAGE_URL = @PACKAGE_URL@ PACKAGE_VERSION = @PACKAGE_VERSION@ PATH_SEPARATOR = @PATH_SEPARATOR@ PKG_CONFIG = @PKG_CONFIG@ PKG_CONFIG_LIBDIR = @PKG_CONFIG_LIBDIR@ PKG_CONFIG_PATH = @PKG_CONFIG_PATH@ RANLIB = @RANLIB@ SED = @SED@ SET_MAKE = @SET_MAKE@ SHELL = @SHELL@ SNAPPY_MAJOR = @SNAPPY_MAJOR@ SNAPPY_MINOR = @SNAPPY_MINOR@ SNAPPY_PATCHLEVEL = @SNAPPY_PATCHLEVEL@ STRIP = @STRIP@ VERSION = @VERSION@ 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@ ac_cv_have_stddef_h = @ac_cv_have_stddef_h@ ac_cv_have_stdint_h = @ac_cv_have_stdint_h@ am__include = @am__include@ am__leading_dot = @am__leading_dot@ am__quote = @am__quote@ am__tar = @am__tar@ am__untar = @am__untar@ bindir = @bindir@ bug_uri = @bug_uri@ 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@ dvidir = @dvidir@ erlangbin = @erlangbin@ erlangversion = @erlangversion@ exec_prefix = @exec_prefix@ host = @host@ host_alias = @host_alias@ host_cpu = @host_cpu@ host_os = @host_os@ host_vendor = @host_vendor@ htmldir = @htmldir@ includedir = @includedir@ infodir = @infodir@ initdir = @initdir@ install_sh = @install_sh@ launchddir = @launchddir@ libdir = @libdir@ libexecdir = @libexecdir@ localconfdir = @localconfdir@ localdatadir = @localdatadir@ localdocdir = @localdocdir@ localedir = @localedir@ localerlanglibdir = @localerlanglibdir@ locallibbindir = @locallibbindir@ locallibdir = @locallibdir@ localstatedir = @localstatedir@ localstatelibdir = @localstatelibdir@ localstatelogdir = @localstatelogdir@ localstaterundir = @localstaterundir@ mandir = @mandir@ mkdir_p = @mkdir_p@ msvc_redist_dir = @msvc_redist_dir@ msvc_redist_name = @msvc_redist_name@ oldincludedir = @oldincludedir@ openssl_bin_dir = @openssl_bin_dir@ otp_release = @otp_release@ package_author_address = @package_author_address@ package_author_name = @package_author_name@ package_identifier = @package_identifier@ package_name = @package_name@ package_tarname = @package_tarname@ 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@ version = @version@ version_major = @version_major@ version_minor = @version_minor@ version_release = @version_release@ version_revision = @version_revision@ version_stage = @version_stage@ EXTRA_DIST = \ query_server_spec.rb \ run_native_process.es 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) --foreign test/view_server/Makefile'; \ $(am__cd) $(top_srcdir) && \ $(AUTOMAKE) --foreign test/view_server/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 TAGS: ctags: CTAGS CTAGS: 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 \ 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 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: apache-couchdb-1.6.0/test/view_server/query_server_spec.rb0000644000175000001440000005417012332105522023736 0ustar00djcusers00000000000000# Licensed under the Apache License, Version 2.0 (the "License"); you may not # use this file except in compliance with the License. You may obtain a copy of # the License at # # http://www.apache.org/licenses/LICENSE-2.0 # # Unless required by applicable law or agreed to in writing, software # distributed under the License is distributed on an "AS IS" BASIS, WITHOUT # WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the # License for the specific language governing permissions and limitations under # the License. # to run (requires ruby and rspec): # spec test/view_server/query_server_spec.rb -f specdoc --color # # environment options: # QS_TRACE=true # shows full output from the query server # QS_LANG=lang # run tests on the query server (for now, one of: js, erlang) # COUCH_ROOT = "#{File.dirname(__FILE__)}/../.." unless defined?(COUCH_ROOT) LANGUAGE = ENV["QS_LANG"] || "js" puts "Running query server specs for #{LANGUAGE} query server" require 'rspec' require 'json' class OSProcessRunner def self.run trace = ENV["QS_TRACE"] || false puts "launching #{run_command}" if trace if block_given? IO.popen(run_command, "r+") do |io| qs = QueryServerRunner.new(io, trace) yield qs end else io = IO.popen(run_command, "r+") QueryServerRunner.new(io, trace) end end def initialize io, trace = false @qsio = io @trace = trace end def close @qsio.close end def reset! run(["reset"]) end def add_fun(fun) run(["add_fun", fun]) end def teach_ddoc(ddoc) run(["ddoc", "new", ddoc_id(ddoc), ddoc]) end def ddoc_run(ddoc, fun_path, args) run(["ddoc", ddoc_id(ddoc), fun_path, args]) end def ddoc_id(ddoc) d_id = ddoc["_id"] raise 'ddoc must have _id' unless d_id d_id end def get_chunks resp = jsgets raise "not a chunk" unless resp.first == "chunks" return resp[1] end def run json rrun json jsgets end def rrun json line = json.to_json puts "run: #{line}" if @trace @qsio.puts line end def rgets resp = @qsio.gets puts "got: #{resp}" if @trace resp end def jsgets resp = rgets # err = @qserr.gets # puts "err: #{err}" if err if resp begin rj = JSON.parse("[#{resp.chomp}]")[0] rescue JSON::ParserError puts "JSON ERROR (dump under trace mode)" # puts resp.chomp while resp = rgets # puts resp.chomp end end if rj.respond_to?(:[]) && rj.is_a?(Array) if rj[0] == "log" log = rj[1] puts "log: #{log}" if @trace rj = jsgets end end rj else raise "no response" end end end class QueryServerRunner < OSProcessRunner COMMANDS = { "js" => "#{COUCH_ROOT}/bin/couchjs_dev #{COUCH_ROOT}/share/server/main.js", "erlang" => "#{COUCH_ROOT}/test/view_server/run_native_process.es" } def self.run_command COMMANDS[LANGUAGE] end end class ExternalRunner < OSProcessRunner def self.run_command "#{COUCH_ROOT}/src/couchdb/couchjs #{COUCH_ROOT}/share/server/echo.js" end end # we could organize this into a design document per language. # that would make testing future languages really easy. functions = { "emit-twice" => { "js" => %{function(doc){emit("foo",doc.a); emit("bar",doc.a)}}, "erlang" => <<-ERLANG fun({Doc}) -> A = couch_util:get_value(<<"a">>, Doc, null), Emit(<<"foo">>, A), Emit(<<"bar">>, A) end. ERLANG }, "emit-once" => { "js" => <<-JS, function(doc){ emit("baz",doc.a) } JS "erlang" => <<-ERLANG fun({Doc}) -> A = couch_util:get_value(<<"a">>, Doc, null), Emit(<<"baz">>, A) end. ERLANG }, "reduce-values-length" => { "js" => %{function(keys, values, rereduce) { return values.length; }}, "erlang" => %{fun(Keys, Values, ReReduce) -> length(Values) end.} }, "reduce-values-sum" => { "js" => %{function(keys, values, rereduce) { return sum(values); }}, "erlang" => %{fun(Keys, Values, ReReduce) -> lists:sum(Values) end.} }, "validate-forbidden" => { "js" => <<-JS, function(newDoc, oldDoc, userCtx) { if(newDoc.bad) throw({forbidden:"bad doc"}); "foo bar"; } JS "erlang" => <<-ERLANG fun({NewDoc}, _OldDoc, _UserCtx) -> case couch_util:get_value(<<"bad">>, NewDoc) of undefined -> 1; _ -> {[{forbidden, <<"bad doc">>}]} end end. ERLANG }, "show-simple" => { "js" => <<-JS, function(doc, req) { log("ok"); return [doc.title, doc.body].join(' - '); } JS "erlang" => <<-ERLANG fun({Doc}, Req) -> Title = couch_util:get_value(<<"title">>, Doc), Body = couch_util:get_value(<<"body">>, Doc), Resp = <>, {[{<<"body">>, Resp}]} end. ERLANG }, "show-headers" => { "js" => <<-JS, function(doc, req) { var resp = {"code":200, "headers":{"X-Plankton":"Rusty"}}; resp.body = [doc.title, doc.body].join(' - '); return resp; } JS "erlang" => <<-ERLANG fun({Doc}, Req) -> Title = couch_util:get_value(<<"title">>, Doc), Body = couch_util:get_value(<<"body">>, Doc), Resp = <<Title/binary, " - ", Body/binary>>, {[ {<<"code">>, 200}, {<<"headers">>, {[{<<"X-Plankton">>, <<"Rusty">>}]}}, {<<"body">>, Resp} ]} end. ERLANG }, "show-sends" => { "js" => <<-JS, function(head, req) { start({headers:{"Content-Type" : "text/plain"}}); send("first chunk"); send('second "chunk"'); return "tail"; }; JS "erlang" => <<-ERLANG fun(Head, Req) -> Resp = {[ {<<"headers">>, {[{<<"Content-Type">>, <<"text/plain">>}]}} ]}, Start(Resp), Send(<<"first chunk">>), Send(<<"second \\\"chunk\\\"">>), <<"tail">> end. ERLANG }, "show-while-get-rows" => { "js" => <<-JS, function(head, req) { send("first chunk"); send(req.q); var row; log("about to getRow " + typeof(getRow)); while(row = getRow()) { send(row.key); }; return "tail"; }; JS "erlang" => <<-ERLANG, fun(Head, {Req}) -> Send(<<"first chunk">>), Send(couch_util:get_value(<<"q">>, Req)), Fun = fun({Row}, _) -> Send(couch_util:get_value(<<"key">>, Row)), {ok, nil} end, {ok, _} = FoldRows(Fun, nil), <<"tail">> end. ERLANG }, "show-while-get-rows-multi-send" => { "js" => <<-JS, function(head, req) { send("bacon"); var row; log("about to getRow " + typeof(getRow)); while(row = getRow()) { send(row.key); send("eggs"); }; return "tail"; }; JS "erlang" => <<-ERLANG, fun(Head, Req) -> Send(<<"bacon">>), Fun = fun({Row}, _) -> Send(couch_util:get_value(<<"key">>, Row)), Send(<<"eggs">>), {ok, nil} end, FoldRows(Fun, nil), <<"tail">> end. ERLANG }, "list-simple" => { "js" => <<-JS, function(head, req) { send("first chunk"); send(req.q); var row; while(row = getRow()) { send(row.key); }; return "early"; }; JS "erlang" => <<-ERLANG, fun(Head, {Req}) -> Send(<<"first chunk">>), Send(couch_util:get_value(<<"q">>, Req)), Fun = fun({Row}, _) -> Send(couch_util:get_value(<<"key">>, Row)), {ok, nil} end, FoldRows(Fun, nil), <<"early">> end. ERLANG }, "list-chunky" => { "js" => <<-JS, function(head, req) { send("first chunk"); send(req.q); var row, i=0; while(row = getRow()) { send(row.key); i += 1; if (i > 2) { return('early tail'); } }; }; JS "erlang" => <<-ERLANG, fun(Head, {Req}) -> Send(<<"first chunk">>), Send(couch_util:get_value(<<"q">>, Req)), Fun = fun ({Row}, Count) when Count < 2 -> Send(couch_util:get_value(<<"key">>, Row)), {ok, Count+1}; ({Row}, Count) when Count == 2 -> Send(couch_util:get_value(<<"key">>, Row)), {stop, <<"early tail">>} end, {ok, Tail} = FoldRows(Fun, 0), Tail end. ERLANG }, "list-old-style" => { "js" => <<-JS, function(head, req, foo, bar) { return "stuff"; } JS "erlang" => <<-ERLANG, fun(Head, Req, Foo, Bar) -> <<"stuff">> end. ERLANG }, "list-capped" => { "js" => <<-JS, function(head, req) { send("bacon") var row, i = 0; while(row = getRow()) { send(row.key); i += 1; if (i > 2) { return('early'); } }; } JS "erlang" => <<-ERLANG, fun(Head, Req) -> Send(<<"bacon">>), Fun = fun ({Row}, Count) when Count < 2 -> Send(couch_util:get_value(<<"key">>, Row)), {ok, Count+1}; ({Row}, Count) when Count == 2 -> Send(couch_util:get_value(<<"key">>, Row)), {stop, <<"early">>} end, {ok, Tail} = FoldRows(Fun, 0), Tail end. ERLANG }, "list-raw" => { "js" => <<-JS, function(head, req) { // log(this.toSource()); // log(typeof send); send("first chunk"); send(req.q); var row; while(row = getRow()) { send(row.key); }; return "tail"; }; JS "erlang" => <<-ERLANG, fun(Head, {Req}) -> Send(<<"first chunk">>), Send(couch_util:get_value(<<"q">>, Req)), Fun = fun({Row}, _) -> Send(couch_util:get_value(<<"key">>, Row)), {ok, nil} end, FoldRows(Fun, nil), <<"tail">> end. ERLANG }, "filter-basic" => { "js" => <<-JS, function(doc, req) { if (doc.good) { return true; } } JS "erlang" => <<-ERLANG, fun({Doc}, Req) -> couch_util:get_value(<<"good">>, Doc) end. ERLANG }, "update-basic" => { "js" => <<-JS, function(doc, req) { doc.world = "hello"; var resp = [doc, "hello doc"]; return resp; } JS "erlang" => <<-ERLANG, fun({Doc}, Req) -> Doc2 = [{<<"world">>, <<"hello">>}|Doc], [{Doc2}, {[{<<"body">>, <<"hello doc">>}]}] end. ERLANG }, "error" => { "js" => <<-JS, function() { throw(["error","error_key","testing"]); } JS "erlang" => <<-ERLANG fun(A, B) -> throw([<<"error">>,<<"error_key">>,<<"testing">>]) end. ERLANG }, "fatal" => { "js" => <<-JS, function() { throw(["fatal","error_key","testing"]); } JS "erlang" => <<-ERLANG fun(A, B) -> throw([<<"fatal">>,<<"error_key">>,<<"testing">>]) end. ERLANG } } def make_ddoc(fun_path, fun_str) doc = {"_id"=>"foo"} d = doc while p = fun_path.shift l = p if !fun_path.empty? d[p] = {} d = d[p] end end d[l] = fun_str doc end describe "query server normal case" do before(:all) do `cd #{COUCH_ROOT} && make` @qs = QueryServerRunner.run end after(:all) do @qs.close end it "should reset" do @qs.run(["reset"]).should == true end it "should not erase ddocs on reset" do @fun = functions["show-simple"][LANGUAGE] @ddoc = make_ddoc(["shows","simple"], @fun) @qs.teach_ddoc(@ddoc) @qs.run(["reset"]).should == true @qs.ddoc_run(@ddoc, ["shows","simple"], [{:title => "Best ever", :body => "Doc body"}, {}]).should == ["resp", {"body" => "Best ever - Doc body"}] end it "should run map funs" do @qs.reset! @qs.run(["add_fun", functions["emit-twice"][LANGUAGE]]).should == true @qs.run(["add_fun", functions["emit-once"][LANGUAGE]]).should == true rows = @qs.run(["map_doc", {:a => "b"}]) rows[0][0].should == ["foo", "b"] rows[0][1].should == ["bar", "b"] rows[1][0].should == ["baz", "b"] end describe "reduce" do before(:all) do @fun = functions["reduce-values-length"][LANGUAGE] @qs.reset! end it "should reduce" do kvs = (0...10).collect{|i|[i,i*2]} @qs.run(["reduce", [@fun], kvs]).should == [true, [10]] end end describe "rereduce" do before(:all) do @fun = functions["reduce-values-sum"][LANGUAGE] @qs.reset! end it "should rereduce" do vs = (0...10).collect{|i|i} @qs.run(["rereduce", [@fun], vs]).should == [true, [45]] end end describe "design docs" do before(:all) do @ddoc = { "_id" => "foo" } @qs.reset! end it "should learn design docs" do @qs.teach_ddoc(@ddoc).should == true end end # it "should validate" describe "validation" do before(:all) do @fun = functions["validate-forbidden"][LANGUAGE] @ddoc = make_ddoc(["validate_doc_update"], @fun) @qs.teach_ddoc(@ddoc) end it "should allow good updates" do @qs.ddoc_run(@ddoc, ["validate_doc_update"], [{"good" => true}, {}, {}]).should == 1 end it "should reject invalid updates" do @qs.ddoc_run(@ddoc, ["validate_doc_update"], [{"bad" => true}, {}, {}]).should == {"forbidden"=>"bad doc"} end end describe "show" do before(:all) do @fun = functions["show-simple"][LANGUAGE] @ddoc = make_ddoc(["shows","simple"], @fun) @qs.teach_ddoc(@ddoc) end it "should show" do @qs.ddoc_run(@ddoc, ["shows","simple"], [{:title => "Best ever", :body => "Doc body"}, {}]).should == ["resp", {"body" => "Best ever - Doc body"}] end end describe "show with headers" do before(:all) do # TODO we can make real ddocs up there. @fun = functions["show-headers"][LANGUAGE] @ddoc = make_ddoc(["shows","headers"], @fun) @qs.teach_ddoc(@ddoc) end it "should show headers" do @qs.ddoc_run( @ddoc, ["shows","headers"], [{:title => "Best ever", :body => "Doc body"}, {}] ). should == ["resp", {"code"=>200,"headers" => {"X-Plankton"=>"Rusty"}, "body" => "Best ever - Doc body"}] end end describe "recoverable error" do before(:all) do @fun = functions["error"][LANGUAGE] @ddoc = make_ddoc(["shows","error"], @fun) @qs.teach_ddoc(@ddoc) end it "should not exit" do @qs.ddoc_run(@ddoc, ["shows","error"], [{"foo"=>"bar"}, {"q" => "ok"}]). should == ["error", "error_key", "testing"] # still running @qs.run(["reset"]).should == true end end describe "changes filter" do before(:all) do @fun = functions["filter-basic"][LANGUAGE] @ddoc = make_ddoc(["filters","basic"], @fun) @qs.teach_ddoc(@ddoc) end it "should only return true for good docs" do @qs.ddoc_run(@ddoc, ["filters","basic"], [[{"key"=>"bam", "good" => true}, {"foo" => "bar"}, {"good" => true}], {"req" => "foo"}] ). should == [true, [true, false, true]] end end describe "update" do before(:all) do # in another patch we can remove this duplication # by setting up the design doc for each language ahead of time. @fun = functions["update-basic"][LANGUAGE] @ddoc = make_ddoc(["updates","basic"], @fun) @qs.teach_ddoc(@ddoc) end it "should return a doc and a resp body" do up, doc, resp = @qs.ddoc_run(@ddoc, ["updates","basic"], [{"foo" => "gnarly"}, {"method" => "POST"}] ) up.should == "up" doc.should == {"foo" => "gnarly", "world" => "hello"} resp["body"].should == "hello doc" end end # end # LIST TESTS # __END__ describe "ddoc list" do before(:all) do @ddoc = { "_id" => "foo", "lists" => { "simple" => functions["list-simple"][LANGUAGE], "headers" => functions["show-sends"][LANGUAGE], "rows" => functions["show-while-get-rows"][LANGUAGE], "buffer-chunks" => functions["show-while-get-rows-multi-send"][LANGUAGE], "chunky" => functions["list-chunky"][LANGUAGE] } } @qs.teach_ddoc(@ddoc) end describe "example list" do it "should run normal" do @qs.ddoc_run(@ddoc, ["lists","simple"], [{"foo"=>"bar"}, {"q" => "ok"}] ).should == ["start", ["first chunk", "ok"], {"headers"=>{}}] @qs.run(["list_row", {"key"=>"baz"}]).should == ["chunks", ["baz"]] @qs.run(["list_row", {"key"=>"bam"}]).should == ["chunks", ["bam"]] @qs.run(["list_row", {"key"=>"foom"}]).should == ["chunks", ["foom"]] @qs.run(["list_row", {"key"=>"fooz"}]).should == ["chunks", ["fooz"]] @qs.run(["list_row", {"key"=>"foox"}]).should == ["chunks", ["foox"]] @qs.run(["list_end"]).should == ["end" , ["early"]] end end describe "headers" do it "should do headers proper" do @qs.ddoc_run(@ddoc, ["lists","headers"], [{"total_rows"=>1000}, {"q" => "ok"}] ).should == ["start", ["first chunk", 'second "chunk"'], {"headers"=>{"Content-Type"=>"text/plain"}}] @qs.rrun(["list_end"]) @qs.jsgets.should == ["end", ["tail"]] end end describe "with rows" do it "should list em" do @qs.ddoc_run(@ddoc, ["lists","rows"], [{"foo"=>"bar"}, {"q" => "ok"}]). should == ["start", ["first chunk", "ok"], {"headers"=>{}}] @qs.rrun(["list_row", {"key"=>"baz"}]) @qs.get_chunks.should == ["baz"] @qs.rrun(["list_row", {"key"=>"bam"}]) @qs.get_chunks.should == ["bam"] @qs.rrun(["list_end"]) @qs.jsgets.should == ["end", ["tail"]] end it "should work with zero rows" do @qs.ddoc_run(@ddoc, ["lists","rows"], [{"foo"=>"bar"}, {"q" => "ok"}]). should == ["start", ["first chunk", "ok"], {"headers"=>{}}] @qs.rrun(["list_end"]) @qs.jsgets.should == ["end", ["tail"]] end end describe "should buffer multiple chunks sent for a single row." do it "should should buffer em" do @qs.ddoc_run(@ddoc, ["lists","buffer-chunks"], [{"foo"=>"bar"}, {"q" => "ok"}]). should == ["start", ["bacon"], {"headers"=>{}}] @qs.rrun(["list_row", {"key"=>"baz"}]) @qs.get_chunks.should == ["baz", "eggs"] @qs.rrun(["list_row", {"key"=>"bam"}]) @qs.get_chunks.should == ["bam", "eggs"] @qs.rrun(["list_end"]) @qs.jsgets.should == ["end", ["tail"]] end end it "should end after 2" do @qs.ddoc_run(@ddoc, ["lists","chunky"], [{"foo"=>"bar"}, {"q" => "ok"}]). should == ["start", ["first chunk", "ok"], {"headers"=>{}}] @qs.run(["list_row", {"key"=>"baz"}]). should == ["chunks", ["baz"]] @qs.run(["list_row", {"key"=>"bam"}]). should == ["chunks", ["bam"]] @qs.run(["list_row", {"key"=>"foom"}]). should == ["end", ["foom", "early tail"]] # here's where js has to discard quit properly @qs.run(["reset"]). should == true end end end def should_have_exited qs begin qs.run(["reset"]) "raise before this (except Erlang)".should == true rescue RuntimeError => e e.message.should == "no response" rescue Errno::EPIPE true.should == true end end describe "query server that exits" do before(:each) do @qs = QueryServerRunner.run @ddoc = { "_id" => "foo", "lists" => { "capped" => functions["list-capped"][LANGUAGE], "raw" => functions["list-raw"][LANGUAGE] }, "shows" => { "fatal" => functions["fatal"][LANGUAGE] } } @qs.teach_ddoc(@ddoc) end after(:each) do @qs.close end describe "only goes to 2 list" do it "should exit if erlang sends too many rows" do @qs.ddoc_run(@ddoc, ["lists","capped"], [{"foo"=>"bar"}, {"q" => "ok"}]). should == ["start", ["bacon"], {"headers"=>{}}] @qs.run(["list_row", {"key"=>"baz"}]).should == ["chunks", ["baz"]] @qs.run(["list_row", {"key"=>"foom"}]).should == ["chunks", ["foom"]] @qs.run(["list_row", {"key"=>"fooz"}]).should == ["end", ["fooz", "early"]] e = @qs.run(["list_row", {"key"=>"foox"}]) e[0].should == "error" e[1].should == "unknown_command" should_have_exited @qs end end describe "raw list" do it "should exit if it gets a non-row in the middle" do @qs.ddoc_run(@ddoc, ["lists","raw"], [{"foo"=>"bar"}, {"q" => "ok"}]). should == ["start", ["first chunk", "ok"], {"headers"=>{}}] e = @qs.run(["reset"]) e[0].should == "error" e[1].should == "list_error" should_have_exited @qs end end describe "fatal error" do it "should exit" do @qs.ddoc_run(@ddoc, ["shows","fatal"], [{"foo"=>"bar"}, {"q" => "ok"}]). should == ["error", "error_key", "testing"] should_have_exited @qs end end end describe "thank you for using the tests" do it "for more info run with QS_TRACE=true or see query_server_spec.rb file header" do end end ��������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������apache-couchdb-1.6.0/license.skip�������������������������������������������������������������������0000644�0001750�0000144�00000011305�12332105522�016630� 0����������������������������������������������������������������������������������������������������ustar�00djc�����������������������������users���������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������^.*.DS_Store ^AUTHORS ^BUGS ^CHANGES ^DEVELOPERS ^DEVELOPERS.gz ^INSTALL ^INSTALL.Unix ^INSTALL.Unix.gz ^INSTALL.Windows ^INSTALL.Windows.gz ^INSTALL.gz ^LICENSE.gz ^Makefile ^Makefile.in ^NEWS ^NOTICE ^README ^THANKS ^aclocal.m4 ^apache-couchdb-.* ^autom4te.cache/.* ^bin/Makefile ^bin/Makefile.in ^bin/couchdb.1 ^bin/couchjs.1 ^bin/erlang-version.escript ^build-aux/.* ^config..* ^configure ^couchdb.stderr ^couchdb.stdout ^cover/.*.coverdata ^cover/.*.html ^erl_crash.dump ^etc/Makefile ^etc/Makefile.in ^etc/couchdb/Makefile ^etc/couchdb/Makefile.in ^etc/couchdb/default.* ^etc/couchdb/local.* ^etc/default/Makefile ^etc/default/Makefile.in ^etc/default/couchdb ^etc/init/Makefile ^etc/init/Makefile.in ^etc/launchd/Makefile ^etc/launchd/Makefile.in ^etc/launchd/org.apache.couchdb.plist ^etc/logrotate.d/Makefile ^etc/logrotate.d/Makefile.in ^etc/logrotate.d/couchdb.* ^etc/windows/Makefile ^etc/windows/README.txt.tpl ^libtool ^license.skip ^m4/.* ^share/Makefile ^share/Makefile.in ^share/doc/Makefile ^share/doc/Makefile.in ^share/doc/build/.* ^share/doc/ext/__pycache__/.* ^share/doc/ext/.*.pyc ^share/doc/ext/httpdomain.py ^share/doc/ext/http-api-descr.json ^share/doc/images/.* ^share/doc/src/conf.pyc ^share/doc/static/rtd.css ^share/doc/templates/couchdb/domainindex.html ^share/server/json2.js ^share/server/mimeparse.js ^share/server/coffee-script.js ^share/www/favicon.ico ^share/www/image/.* ^share/www/script/jquery..* ^share/www/script/json2.js ^share/www/script/jspec/.* ^share/www/script/sha1.js ^share/www/script/base64.js ^share/www/script/test/lorem.* ^share/www/style/jquery-ui-1.8.11.custom.css ^share/www/fauxton/img/.* ^share/www/fauxton/js/ace/mode-javascript.js ^share/www/fauxton/js/ace/mode-json.js ^share/www/fauxton/js/ace/theme-crimson_editor.js ^share/www/fauxton/js/ace/worker-javascript.js ^share/www/fauxton/js/ace/worker-json.js ^src/Makefile ^src/Makefile.in ^src/couch_index/Makefile ^src/couch_index/Makefile.in ^src/couch_index/ebin/.*.beam ^src/couch_mrview/Makefile ^src/couch_mrview/Makefile.in ^src/couch_mrview/ebin/.*.beam ^src/couch_plugins/README.md ^src/couch_plugins/Makefile ^src/couch_plugins/Makefile.in ^src/couch_plugins/ebin/.*.beam ^src/couch_replicator/Makefile ^src/couch_replicator/Makefile.in ^src/couch_replicator/ebin/.*.beam ^src/couchdb/.*.beam ^src/couchdb/.deps/.* ^src/couchdb/Makefile ^src/couchdb/Makefile.in ^src/couchdb/couch.app.* ^src/couchdb/priv/.*.o ^src/couchdb/priv/.deps/.* ^src/couchdb/priv/Makefile ^src/couchdb/priv/Makefile.in ^src/couchdb/priv/couch_icu_driver.la ^src/couchdb/priv/couchjs ^src/couchdb/priv/couchspawnkillable ^src/couchdb/priv/stat_descriptions.cfg ^src/couchjs-node/package.json ^src/couchjs-node/sandbox.js ^src/couchjs-node/README.md ^src/couchjs-node/Makefile ^src/couchjs-node/Makefile.in ^src/erlang-oauth/.* ^src/couch_dbupdates ^src/ejson/.* ^src/etap/.* ^src/fauxton/app/addons/config/assets/less/config.less ^src/fauxton/assets/css/codemirror.css ^src/fauxton/assets/css/nv.d3.css ^src/fauxton/assets/img/.* ^src/fauxton/assets/js/libs/.*.js ^src/fauxton/assets/js/libs/ace/.*.js ^src/fauxton/assets/js/libs/ace/snippets/.*.js ^src/fauxton/assets/js/plugins/.*.js ^src/fauxton/assets/js/plugins/zeroclipboard/ZeroClipboard.swf ^src/fauxton/assets/less/bootstrap/.*.less ^src/fauxton/assets/less/bootstrap/tests/css-tests.css ^src/fauxton/assets/less/bootstrap/tests/buttons.html ^src/fauxton/favicon.ico ^src/fauxton/package.json ^src/fauxton/extensions.md ^src/fauxton/readme.md ^src/fauxton/writing_addons.md ^src/fauxton/TODO.md ^src/fauxton/CONTRIBUTING.md ^src/fauxton/settings.json.* ^src/fauxton/test/test.config.underscore ^src/fauxton/test/mocha/chai.js ^src/fauxton/test/mocha/mocha.css ^src/fauxton/test/mocha/mocha.js ^src/fauxton/test/mocha/sinon.js ^src/fauxton/test/mocha/sinon-chai.js ^src/fauxton/tasks/addon/rename.json ^src/fauxton/assets/lib/ace/.* ^src/fauxton/app/addons/pouchdb/pouch.collate.js ^src/fauxton/app/addons/pouchdb/pouchdb.mapreduce.js ^src/ibrowse/.* ^src/mochiweb/.* ^src/my-first-couchdb-plugin/priv/*/* ^src/my-first-couchdb-plugin/README.md ^src/my-first-couchdb-plugin/.gitignore ^src/my-first-couchdb-plugin/Makefile ^src/my-first-couchdb-plugin/Makefile.in ^src/snappy/.* ^stamp-h1 ^test/Makefile ^test/Makefile.in ^test/bench/Makefile ^test/bench/Makefile.in ^test/etap/.*.beam ^test/etap/.*.o ^test/etap/.deps/.* ^test/etap/test_cfg_register ^test/etap/Makefile ^test/etap/Makefile.in ^test/etap/temp..* ^test/etap/fixtures/* ^test/javascript/Makefile ^test/javascript/Makefile.in ^test/local.ini ^test/view_server/Makefile ^test/view_server/Makefile.in ^tmp/.* ^utils/Makefile ^utils/Makefile.in ^var/Makefile ^var/Makefile.in ^Vagrantfile ^share/www/fauxton/Makefile ^share/www/fauxton/Makefile.in ^share/www/Makefile ^share/www/Makefile.in ���������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������apache-couchdb-1.6.0/LICENSE������������������������������������������������������������������������0000644�0001750�0000144�00000177761�12332105522�015346� 0����������������������������������������������������������������������������������������������������ustar�00djc�����������������������������users���������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������ Apache License Version 2.0, January 2004 http://www.apache.org/licenses/ TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION 1. Definitions. "License" shall mean the terms and conditions for use, reproduction, and distribution as defined by Sections 1 through 9 of this document. "Licensor" shall mean the copyright owner or entity authorized by the copyright owner that is granting the License. "Legal Entity" shall mean the union of the acting entity and all other entities that control, are controlled by, or are under common control with that entity. For the purposes of this definition, "control" means (i) the power, direct or indirect, to cause the direction or management of such entity, whether by contract or otherwise, or (ii) ownership of fifty percent (50%) or more of the outstanding shares, or (iii) beneficial ownership of such entity. "You" (or "Your") shall mean an individual or Legal Entity exercising permissions granted by this License. "Source" form shall mean the preferred form for making modifications, including but not limited to software source code, documentation source, and configuration files. "Object" form shall mean any form resulting from mechanical transformation or translation of a Source form, including but not limited to compiled object code, generated documentation, and conversions to other media types. "Work" shall mean the work of authorship, whether in Source or Object form, made available under the License, as indicated by a copyright notice that is included in or attached to the work (an example is provided in the Appendix below). "Derivative Works" shall mean any work, whether in Source or Object form, that is based on (or derived from) the Work and for which the editorial revisions, annotations, elaborations, or other modifications represent, as a whole, an original work of authorship. For the purposes of this License, Derivative Works shall not include works that remain separable from, or merely link (or bind by name) to the interfaces of, the Work and Derivative Works thereof. "Contribution" shall mean any work of authorship, including the original version of the Work and any modifications or additions to that Work or Derivative Works thereof, that is intentionally submitted to Licensor for inclusion in the Work by the copyright owner or by an individual or Legal Entity authorized to submit on behalf of the copyright owner. For the purposes of this definition, "submitted" means any form of electronic, verbal, or written communication sent to the Licensor or its representatives, including but not limited to communication on electronic mailing lists, source code control systems, and issue tracking systems that are managed by, or on behalf of, the Licensor for the purpose of discussing and improving the Work, but excluding communication that is conspicuously marked or otherwise designated in writing by the copyright owner as "Not a Contribution." "Contributor" shall mean Licensor and any individual or Legal Entity on behalf of whom a Contribution has been received by Licensor and subsequently incorporated within the Work. 2. Grant of Copyright License. Subject to the terms and conditions of this License, each Contributor hereby grants to You a perpetual, worldwide, non-exclusive, no-charge, royalty-free, irrevocable copyright license to reproduce, prepare Derivative Works of, publicly display, publicly perform, sublicense, and distribute the Work and such Derivative Works in Source or Object form. 3. Grant of Patent License. Subject to the terms and conditions of this License, each Contributor hereby grants to You a perpetual, worldwide, non-exclusive, no-charge, royalty-free, irrevocable (except as stated in this section) patent license to make, have made, use, offer to sell, sell, import, and otherwise transfer the Work, where such license applies only to those patent claims licensable by such Contributor that are necessarily infringed by their Contribution(s) alone or by combination of their Contribution(s) with the Work to which such Contribution(s) was submitted. If You institute patent litigation against any entity (including a cross-claim or counterclaim in a lawsuit) alleging that the Work or a Contribution incorporated within the Work constitutes direct or contributory patent infringement, then any patent licenses granted to You under this License for that Work shall terminate as of the date such litigation is filed. 4. Redistribution. You may reproduce and distribute copies of the Work or Derivative Works thereof in any medium, with or without modifications, and in Source or Object form, provided that You meet the following conditions: (a) You must give any other recipients of the Work or Derivative Works a copy of this License; and (b) You must cause any modified files to carry prominent notices stating that You changed the files; and (c) You must retain, in the Source form of any Derivative Works that You distribute, all copyright, patent, trademark, and attribution notices from the Source form of the Work, excluding those notices that do not pertain to any part of the Derivative Works; and (d) If the Work includes a "NOTICE" text file as part of its distribution, then any Derivative Works that You distribute must include a readable copy of the attribution notices contained within such NOTICE file, excluding those notices that do not pertain to any part of the Derivative Works, in at least one of the following places: within a NOTICE text file distributed as part of the Derivative Works; within the Source form or documentation, if provided along with the Derivative Works; or, within a display generated by the Derivative Works, if and wherever such third-party notices normally appear. The contents of the NOTICE file are for informational purposes only and do not modify the License. You may add Your own attribution notices within Derivative Works that You distribute, alongside or as an addendum to the NOTICE text from the Work, provided that such additional attribution notices cannot be construed as modifying the License. You may add Your own copyright statement to Your modifications and may provide additional or different license terms and conditions for use, reproduction, or distribution of Your modifications, or for any such Derivative Works as a whole, provided Your use, reproduction, and distribution of the Work otherwise complies with the conditions stated in this License. 5. Submission of Contributions. Unless You explicitly state otherwise, any Contribution intentionally submitted for inclusion in the Work by You to the Licensor shall be under the terms and conditions of this License, without any additional terms or conditions. Notwithstanding the above, nothing herein shall supersede or modify the terms of any separate license agreement you may have executed with Licensor regarding such Contributions. 6. Trademarks. This License does not grant permission to use the trade names, trademarks, service marks, or product names of the Licensor, except as required for reasonable and customary use in describing the origin of the Work and reproducing the content of the NOTICE file. 7. Disclaimer of Warranty. Unless required by applicable law or agreed to in writing, Licensor provides the Work (and each Contributor provides its Contributions) on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied, including, without limitation, any warranties or conditions of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A PARTICULAR PURPOSE. You are solely responsible for determining the appropriateness of using or redistributing the Work and assume any risks associated with Your exercise of permissions under this License. 8. Limitation of Liability. In no event and under no legal theory, whether in tort (including negligence), contract, or otherwise, unless required by applicable law (such as deliberate and grossly negligent acts) or agreed to in writing, shall any Contributor be liable to You for damages, including any direct, indirect, special, incidental, or consequential damages of any character arising as a result of this License or out of the use or inability to use the Work (including but not limited to damages for loss of goodwill, work stoppage, computer failure or malfunction, or any and all other commercial damages or losses), even if such Contributor has been advised of the possibility of such damages. 9. Accepting Warranty or Additional Liability. While redistributing the Work or Derivative Works thereof, You may choose to offer, and charge a fee for, acceptance of support, warranty, indemnity, or other liability obligations and/or rights consistent with this License. However, in accepting such obligations, You may act only on Your own behalf and on Your sole responsibility, not on behalf of any other Contributor, and only if You agree to indemnify, defend, and hold each Contributor harmless for any liability incurred by, or claims asserted against, such Contributor by reason of your accepting any such warranty or additional liability. END OF TERMS AND CONDITIONS APPENDIX: How to apply the Apache License to your work. To apply the Apache License to your work, attach the following boilerplate notice, with the fields enclosed by brackets "[]" replaced with your own identifying information. (Don't include the brackets!) The text should be enclosed in the appropriate comment syntax for the file format. We also recommend that a file or class name and description of purpose be included on the same "printed page" as the copyright notice for easier identification within third-party archives. Copyright [yyyy] [name of copyright owner] Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. You may obtain a copy of the License at http://www.apache.org/licenses/LICENSE-2.0 Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License. Apache CouchDB Subcomponents The Apache CouchDB project includes a number of subcomponents with separate copyright notices and license terms. Your use of the code for the these subcomponents is subject to the terms and conditions of the following licenses. For the share/doc/build/html/_static components: Copyright (c) 2007-2011 by the Sphinx team (see AUTHORS file). All rights reserved. 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. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. For the share/doc/build/html/_static/jquery.js component: Copyright 2010, John Resig Copyright 2010, The Dojo Foundation Copyright 2012 jQuery Foundation and other contributors http://jquery.com/ 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 AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. For the share/doc/build/html/_static/underscore.js component: Copyright (c) 2009-2012 Jeremy Ashkenas, DocumentCloud 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 AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. For the share/doc/static/rtd.css component: Copyright (c) 2007-2011 by the Sphinx team (see AUTHORS file). All rights reserved. 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. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. For the share/www/script/jquery.js component: Copyright 2012 jQuery Foundation and other contributors http://jquery.com/ 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 AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. For the share/www/script/jquery-ui-* components: Copyright (c) 2011 Paul Bakaus, http://jqueryui.com/ This software consists of voluntary contributions made by many individuals (AUTHORS.txt, http://jqueryui.com/about) For exact contribution history, see the revision history and logs, available at http://jquery-ui.googlecode.com/svn/ 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 AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. For the share/www/script/jquery.form.js component: For the src/fauxton/assets/js/plugins/jquery.form.js component: http://malsup.com/jquery/form/ 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 AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. For the share/www/script/json2.js component: Public Domain No warranty expressed or implied. Use at your own risk. For the src/mochiweb component: Copyright (c) 2007 Mochi Media, Inc. 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 AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. For the src/ibrowse component: Copyright (c) 2006, Chandrashekhar Mullaparthi All rights reserved. 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 the T-Mobile nor the names of its contributors may be used to endorse or promote products derived from this software without specific prior written permission. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. For the src/erlang-oauth component: Copyright the authors and contributors. All rights reserved. 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 AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. For the src/etap component: Copyright (c) 2008-2009 Nick Gerakines <nick@gerakines.net> 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 AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. For the src/ejson/yajl component Copyright 2010, Lloyd Hilaiel. Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: 1. Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. 2. Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. 3. Neither the name of Lloyd Hilaiel nor the names of its contributors may be used to endorse or promote products derived from this software without specific prior written permission. THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR 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. For the src/ejson/erl_nif_compat.h file Copyright (c) 2010-2011 Basho Technologies, Inc. With some minor modifications for Apache CouchDB. This file is provided to you under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. You may obtain a copy of the License at http://www.apache.org/licenses/LICENSE-2.0 Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License. For the src/snappy/google-snappy component Copyright 2005 and onwards Google Inc. 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 Google Inc. nor the names of its contributors may be used to endorse or promote products derived from this software without specific prior written permission. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. For the share/server/coffee-script.js file Copyright (c) 2011 Jeremy Ashkenas 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 AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. For src/fauxton/apps/modules/pouchdb Copyright (c) 2012 Dale Harvey et al Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. You may obtain a copy of the License at http://www.apache.org/licenses/LICENSE-2.0 Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License. For src/fauxton/assets/js/libs/almond.js Copyright (c) 2010-2011, The Dojo Foundation All rights reserved. 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 the Dojo Foundation nor the names of its contributors may be used to endorse or promote products derived from this software without specific prior written permission. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. For src/fauxton/assets/js/libs/backbone.js Copyright (c) 2010-2013 Jeremy Ashkenas, DocumentCloud 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 AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. For src/fauxton/assets/js/libs/bootstrap.js And for src/fauxton/assets/less/bootstrap Apache License Version 2.0, January 2004 http://www.apache.org/licenses/ For src/fauxton/assets/less/bootstrap Apache License Version 2.0, January 2004 http://www.apache.org/licenses/ For src/fauxton/assets/js/libs/d3.js Copyright (c) 2010-2014, Michael Bostock All rights reserved. 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. * The name Michael Bostock may not be used to endorse or promote products derived from this software without specific prior written permission. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL MICHAEL BOSTOCK 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. For src/fauxton/assets/js/libs/lodash.js Copyright 2012-2013 The Dojo Foundation <http://dojofoundation.org/> Based on Underscore.js 1.4.3, copyright 2009-2013 Jeremy Ashkenas, DocumentCloud Inc. <http://underscorejs.org/> 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 AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. For src/fauxton/assets/js/libs/nv.d3.js Copyright (c) 2011, 2012 [Novus Partners, Inc.][novus] Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. You may obtain a copy of the License at http://www.apache.org/licenses/LICENSE-2.0 Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License. [novus]: https://www.novus.com/ For src/fauxton/assets/js/libs/require.js Copyright (c) 2010-2011, The Dojo Foundation All rights reserved. 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 the Dojo Foundation nor the names of its contributors may be used to endorse or promote products derived from this software without specific prior written permission. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. For src/fauxton/assets/js/plugins/backbone.layoutmanager.js Copyright (c) 2013 Tim Branyen 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 AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. For src/fauxton/assets/js/plugins/prettify.js Apache License Version 2.0, January 2004 http://www.apache.org/licenses/ For the src/couch_dbupdates component 2009-2012 (c) BenoĆ®t Chesneau <benoitc@e-engura.org> Apache 2 License, see above. If not otherwise noted, the extensions in this package are licensed under the following license. For src/fauxton/test/mocha/mocha.js and src/fauxton/test/mocha/mocha.js Copyright (c) 2011-2013 TJ Holowaychuk <tj@vision-media.ca> 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 AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. For src/fauxton/test/mocha/chai.js Copyright (c) 2011-2013 Jake Luer jake@alogicalparadox.com 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 AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. for src/fauxton/test/mocha/sinon-chai.js DO WHAT THE FUCK YOU WANT TO PUBLIC LICENSE Version 2, December 2004 Copyright Ā© 2012–2013 Domenic Denicola <domenic@domenicdenicola.com> Everyone is permitted to copy and distribute verbatim or modified copies of this license document, and changing it is allowed as long as the name is changed. DO WHAT THE FUCK YOU WANT TO PUBLIC LICENSE TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION 0. You just DO WHAT THE FUCK YOU WANT TO. for src/fauxton/js/libs/spin.js The MIT License Copyright (c) 2011 Felix Gnass [fgnass at neteye dot de] 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 AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. for src/fauxton/assets/img/font-awesome.* SIL OPEN FONT LICENSE Version 1.1 - 26 February 2007 PREAMBLE The goals of the Open Font License (OFL) are to stimulate worldwide development of collaborative font projects, to support the font creation efforts of academic and linguistic communities, and to provide a free and open framework in which fonts may be shared and improved in partnership with others. The OFL allows the licensed fonts to be used, studied, modified and redistributed freely as long as they are not sold by themselves. The fonts, including any derivative works, can be bundled, embedded, redistributed and/or sold with any software provided that any reserved names are not used by derivative works. The fonts and derivatives, however, cannot be released under any other type of license. The requirement for fonts to remain under this license does not apply to any document created using the fonts or their derivatives. DEFINITIONS "Font Software" refers to the set of files released by the Copyright Holder(s) under this license and clearly marked as such. This may include source files, build scripts and documentation. "Reserved Font Name" refers to any names specified as such after the copyright statement(s). "Original Version" refers to the collection of Font Software components as distributed by the Copyright Holder(s). "Modified Version" refers to any derivative made by adding to, deleting, or substituting — in part or in whole — any of the components of the Original Version, by changing formats or by porting the Font Software to a new environment. "Author" refers to any designer, engineer, programmer, technical writer or other person who contributed to the Font Software. PERMISSION & CONDITIONS Permission is hereby granted, free of charge, to any person obtaining a copy of the Font Software, to use, study, copy, merge, embed, modify, redistribute, and sell modified and unmodified copies of the Font Software, subject to the following conditions: 1) Neither the Font Software nor any of its individual components, in Original or Modified Versions, may be sold by itself. 2) Original or Modified Versions of the Font Software may be bundled, redistributed and/or sold with any software, provided that each copy contains the above copyright notice and this license. These can be included either as stand-alone text files, human-readable headers or in the appropriate machine-readable metadata fields within text or binary files as long as those fields can be easily viewed by the user. 3) No Modified Version of the Font Software may use the Reserved Font Name(s) unless explicit written permission is granted by the corresponding Copyright Holder. This restriction only applies to the primary font name as presented to the users. 4) The name(s) of the Copyright Holder(s) or the Author(s) of the Font Software shall not be used to promote, endorse or advertise any Modified Version, except to acknowledge the contribution(s) of the Copyright Holder(s) and the Author(s) or with their explicit written permission. 5) The Font Software, modified or unmodified, in part or in whole, must be distributed entirely under this license, and must not be distributed under any other license. The requirement for fonts to remain under this license does not apply to any document created using the Font Software. TERMINATION This license becomes null and void if any of the above conditions are not met. DISCLAIMER THE FONT SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO ANY WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT OF COPYRIGHT, PATENT, TRADEMARK, OR OTHER RIGHT. IN NO EVENT SHALL THE COPYRIGHT HOLDER BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, INCLUDING ANY GENERAL, SPECIAL, INDIRECT, INCIDENTAL, OR CONSEQUENTIAL DAMAGES, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF THE USE OR INABILITY TO USE THE FONT SOFTWARE OR FROM OTHER DEALINGS IN THE FONT SOFTWARE. for src/fauxton/assets/less/bootstrap/font-awesome/* The MIT License (MIT) Copyright (c) 2013 Dave Gandy 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 AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. For share/doc/ext/httpdomain.py Copyright (c) 2010 by the contributors Hong Minhee <minhee@dahlia.kr>. All rights reserved. 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. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. for src/fauxton/assets/js/lib/ace/* Copyright (c) 2010, Ajax.org B.V. All rights reserved. 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 Ajax.org B.V. nor the names of its contributors may be used to endorse or promote products derived from this software without specific prior written permission. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL AJAX.ORG B.V. 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. for src/fauxton/assets/js/plugins/beautify.js The MIT License (MIT) Copyright (c) 2007-2013 Einar Lielmanis and contributors. 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 AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. for src/fauxton/assets/js/plugins/cloudant.pagingcollection.js Apache License Version 2.0, January 2004 http://www.apache.org/licenses/ TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION 1. Definitions. "License" shall mean the terms and conditions for use, reproduction, and distribution as defined by Sections 1 through 9 of this document. "Licensor" shall mean the copyright owner or entity authorized by the copyright owner that is granting the License. "Legal Entity" shall mean the union of the acting entity and all other entities that control, are controlled by, or are under common control with that entity. For the purposes of this definition, "control" means (i) the power, direct or indirect, to cause the direction or management of such entity, whether by contract or otherwise, or (ii) ownership of fifty percent (50%) or more of the outstanding shares, or (iii) beneficial ownership of such entity. "You" (or "Your") shall mean an individual or Legal Entity exercising permissions granted by this License. "Source" form shall mean the preferred form for making modifications, including but not limited to software source code, documentation source, and configuration files. "Object" form shall mean any form resulting from mechanical transformation or translation of a Source form, including but not limited to compiled object code, generated documentation, and conversions to other media types. "Work" shall mean the work of authorship, whether in Source or Object form, made available under the License, as indicated by a copyright notice that is included in or attached to the work (an example is provided in the Appendix below). "Derivative Works" shall mean any work, whether in Source or Object form, that is based on (or derived from) the Work and for which the editorial revisions, annotations, elaborations, or other modifications represent, as a whole, an original work of authorship. For the purposes of this License, Derivative Works shall not include works that remain separable from, or merely link (or bind by name) to the interfaces of, the Work and Derivative Works thereof. "Contribution" shall mean any work of authorship, including the original version of the Work and any modifications or additions to that Work or Derivative Works thereof, that is intentionally submitted to Licensor for inclusion in the Work by the copyright owner or by an individual or Legal Entity authorized to submit on behalf of the copyright owner. For the purposes of this definition, "submitted" means any form of electronic, verbal, or written communication sent to the Licensor or its representatives, including but not limited to communication on electronic mailing lists, source code control systems, and issue tracking systems that are managed by, or on behalf of, the Licensor for the purpose of discussing and improving the Work, but excluding communication that is conspicuously marked or otherwise designated in writing by the copyright owner as "Not a Contribution." "Contributor" shall mean Licensor and any individual or Legal Entity on behalf of whom a Contribution has been received by Licensor and subsequently incorporated within the Work. 2. Grant of Copyright License. Subject to the terms and conditions of this License, each Contributor hereby grants to You a perpetual, worldwide, non-exclusive, no-charge, royalty-free, irrevocable copyright license to reproduce, prepare Derivative Works of, publicly display, publicly perform, sublicense, and distribute the Work and such Derivative Works in Source or Object form. 3. Grant of Patent License. Subject to the terms and conditions of this License, each Contributor hereby grants to You a perpetual, worldwide, non-exclusive, no-charge, royalty-free, irrevocable (except as stated in this section) patent license to make, have made, use, offer to sell, sell, import, and otherwise transfer the Work, where such license applies only to those patent claims licensable by such Contributor that are necessarily infringed by their Contribution(s) alone or by combination of their Contribution(s) with the Work to which such Contribution(s) was submitted. If You institute patent litigation against any entity (including a cross-claim or counterclaim in a lawsuit) alleging that the Work or a Contribution incorporated within the Work constitutes direct or contributory patent infringement, then any patent licenses granted to You under this License for that Work shall terminate as of the date such litigation is filed. 4. Redistribution. You may reproduce and distribute copies of the Work or Derivative Works thereof in any medium, with or without modifications, and in Source or Object form, provided that You meet the following conditions: (a) You must give any other recipients of the Work or Derivative Works a copy of this License; and (b) You must cause any modified files to carry prominent notices stating that You changed the files; and (c) You must retain, in the Source form of any Derivative Works that You distribute, all copyright, patent, trademark, and attribution notices from the Source form of the Work, excluding those notices that do not pertain to any part of the Derivative Works; and (d) If the Work includes a "NOTICE" text file as part of its distribution, then any Derivative Works that You distribute must include a readable copy of the attribution notices contained within such NOTICE file, excluding those notices that do not pertain to any part of the Derivative Works, in at least one of the following places: within a NOTICE text file distributed as part of the Derivative Works; within the Source form or documentation, if provided along with the Derivative Works; or, within a display generated by the Derivative Works, if and wherever such third-party notices normally appear. The contents of the NOTICE file are for informational purposes only and do not modify the License. You may add Your own attribution notices within Derivative Works that You distribute, alongside or as an addendum to the NOTICE text from the Work, provided that such additional attribution notices cannot be construed as modifying the License. You may add Your own copyright statement to Your modifications and may provide additional or different license terms and conditions for use, reproduction, or distribution of Your modifications, or for any such Derivative Works as a whole, provided Your use, reproduction, and distribution of the Work otherwise complies with the conditions stated in this License. 5. Submission of Contributions. Unless You explicitly state otherwise, any Contribution intentionally submitted for inclusion in the Work by You to the Licensor shall be under the terms and conditions of this License, without any additional terms or conditions. Notwithstanding the above, nothing herein shall supersede or modify the terms of any separate license agreement you may have executed with Licensor regarding such Contributions. 6. Trademarks. This License does not grant permission to use the trade names, trademarks, service marks, or product names of the Licensor, except as required for reasonable and customary use in describing the origin of the Work and reproducing the content of the NOTICE file. 7. Disclaimer of Warranty. Unless required by applicable law or agreed to in writing, Licensor provides the Work (and each Contributor provides its Contributions) on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied, including, without limitation, any warranties or conditions of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A PARTICULAR PURPOSE. You are solely responsible for determining the appropriateness of using or redistributing the Work and assume any risks associated with Your exercise of permissions under this License. 8. Limitation of Liability. In no event and under no legal theory, whether in tort (including negligence), contract, or otherwise, unless required by applicable law (such as deliberate and grossly negligent acts) or agreed to in writing, shall any Contributor be liable to You for damages, including any direct, indirect, special, incidental, or consequential damages of any character arising as a result of this License or out of the use or inability to use the Work (including but not limited to damages for loss of goodwill, work stoppage, computer failure or malfunction, or any and all other commercial damages or losses), even if such Contributor has been advised of the possibility of such damages. 9. Accepting Warranty or Additional Liability. While redistributing the Work or Derivative Works thereof, You may choose to offer, and charge a fee for, acceptance of support, warranty, indemnity, or other liability obligations and/or rights consistent with this License. However, in accepting such obligations, You may act only on Your own behalf and on Your sole responsibility, not on behalf of any other Contributor, and only if You agree to indemnify, defend, and hold each Contributor harmless for any liability incurred by, or claims asserted against, such Contributor by reason of your accepting any such warranty or additional liability. END OF TERMS AND CONDITIONS APPENDIX: How to apply the Apache License to your work. To apply the Apache License to your work, attach the following boilerplate notice, with the fields enclosed by brackets "{}" replaced with your own identifying information. (Don't include the brackets!) The text should be enclosed in the appropriate comment syntax for the file format. We also recommend that a file or class name and description of purpose be included on the same "printed page" as the copyright notice for easier identification within third-party archives. Copyright {yyyy} {name of copyright owner} Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. You may obtain a copy of the License at http://www.apache.org/licenses/LICENSE-2.0 Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License. ���������������apache-couchdb-1.6.0/aclocal.m4���������������������������������������������������������������������0000644�0001750�0000144�00000166201�12332105545�016171� 0����������������������������������������������������������������������������������������������������ustar�00djc�����������������������������users���������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������# generated automatically by aclocal 1.11.6 -*- Autoconf -*- # Copyright (C) 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004, # 2005, 2006, 2007, 2008, 2009, 2010, 2011 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_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'.])]) # =========================================================================== # http://www.gnu.org/software/autoconf-archive/ax_check_icu.html # =========================================================================== # # SYNOPSIS # # AX_CHECK_ICU(version, action-if, action-if-not) # # DESCRIPTION # # Defines ICU_LIBS, ICU_CFLAGS, ICU_CXXFLAGS. See icu-config(1) man page. # # LICENSE # # Copyright (c) 2008 Akos Maroy <darkeye@tyrell.hu> # # Copying and distribution of this file, with or without modification, are # permitted in any medium without royalty provided the copyright notice # and this notice are preserved. This file is offered as-is, without any # warranty. #serial 6 AU_ALIAS([AC_CHECK_ICU], [AX_CHECK_ICU]) AC_DEFUN([AX_CHECK_ICU], [ succeeded=no if test -z "$ICU_CONFIG"; then AC_PATH_PROG(ICU_CONFIG, icu-config, no) fi if test "$ICU_CONFIG" = "no" ; then echo "*** The icu-config script could not be found. Make sure it is" echo "*** in your path, and that taglib is properly installed." echo "*** Or see http://ibm.com/software/globalization/icu/" else ICU_VERSION=`$ICU_CONFIG --version` AC_MSG_CHECKING(for ICU >= $1) VERSION_CHECK=`expr $ICU_VERSION \>\= $1` if test "$VERSION_CHECK" = "1" ; then AC_MSG_RESULT(yes) succeeded=yes AC_MSG_CHECKING(ICU_CPPFLAGS) ICU_CPPFLAGS=`$ICU_CONFIG --cppflags` AC_MSG_RESULT($ICU_CPPFLAGS) AC_MSG_CHECKING(ICU_CFLAGS) ICU_CFLAGS=`$ICU_CONFIG --cflags` AC_MSG_RESULT($ICU_CFLAGS) AC_MSG_CHECKING(ICU_CXXFLAGS) ICU_CXXFLAGS=`$ICU_CONFIG --cxxflags` AC_MSG_RESULT($ICU_CXXFLAGS) AC_MSG_CHECKING(ICU_LIBS) ICU_LIBS=`$ICU_CONFIG --ldflags` AC_MSG_RESULT($ICU_LIBS) else ICU_CPPFLAGS="" ICU_CFLAGS="" ICU_CXXFLAGS="" ICU_LIBS="" ## If we have a custom action on failure, don't print errors, but ## do set a variable so people can do so. ifelse([$3], ,echo "can't find ICU >= $1",) fi AC_SUBST(ICU_CPPFLAGS) AC_SUBST(ICU_CFLAGS) AC_SUBST(ICU_CXXFLAGS) AC_SUBST(ICU_LIBS) fi if test $succeeded = yes; then ifelse([$2], , :, [$2]) else ifelse([$3], , AC_MSG_ERROR([Library requirements (ICU) not met.]), [$3]) fi ]) # =========================================================================== # http://www.gnu.org/software/autoconf-archive/ax_compare_version.html # =========================================================================== # # SYNOPSIS # # AX_COMPARE_VERSION(VERSION_A, OP, VERSION_B, [ACTION-IF-TRUE], [ACTION-IF-FALSE]) # # DESCRIPTION # # This macro compares two version strings. Due to the various number of # minor-version numbers that can exist, and the fact that string # comparisons are not compatible with numeric comparisons, this is not # necessarily trivial to do in a autoconf script. This macro makes doing # these comparisons easy. # # The six basic comparisons are available, as well as checking equality # limited to a certain number of minor-version levels. # # The operator OP determines what type of comparison to do, and can be one # of: # # eq - equal (test A == B) # ne - not equal (test A != B) # le - less than or equal (test A <= B) # ge - greater than or equal (test A >= B) # lt - less than (test A < B) # gt - greater than (test A > B) # # Additionally, the eq and ne operator can have a number after it to limit # the test to that number of minor versions. # # eq0 - equal up to the length of the shorter version # ne0 - not equal up to the length of the shorter version # eqN - equal up to N sub-version levels # neN - not equal up to N sub-version levels # # When the condition is true, shell commands ACTION-IF-TRUE are run, # otherwise shell commands ACTION-IF-FALSE are run. The environment # variable 'ax_compare_version' is always set to either 'true' or 'false' # as well. # # Examples: # # AX_COMPARE_VERSION([3.15.7],[lt],[3.15.8]) # AX_COMPARE_VERSION([3.15],[lt],[3.15.8]) # # would both be true. # # AX_COMPARE_VERSION([3.15.7],[eq],[3.15.8]) # AX_COMPARE_VERSION([3.15],[gt],[3.15.8]) # # would both be false. # # AX_COMPARE_VERSION([3.15.7],[eq2],[3.15.8]) # # would be true because it is only comparing two minor versions. # # AX_COMPARE_VERSION([3.15.7],[eq0],[3.15]) # # would be true because it is only comparing the lesser number of minor # versions of the two values. # # Note: The characters that separate the version numbers do not matter. An # empty string is the same as version 0. OP is evaluated by autoconf, not # configure, so must be a string, not a variable. # # The author would like to acknowledge Guido Draheim whose advice about # the m4_case and m4_ifvaln functions make this macro only include the # portions necessary to perform the specific comparison specified by the # OP argument in the final configure script. # # LICENSE # # Copyright (c) 2008 Tim Toolan <toolan@ele.uri.edu> # # Copying and distribution of this file, with or without modification, are # permitted in any medium without royalty provided the copyright notice # and this notice are preserved. This file is offered as-is, without any # warranty. #serial 11 dnl ######################################################################### AC_DEFUN([AX_COMPARE_VERSION], [ AC_REQUIRE([AC_PROG_AWK]) # Used to indicate true or false condition ax_compare_version=false # Convert the two version strings to be compared into a format that # allows a simple string comparison. The end result is that a version # string of the form 1.12.5-r617 will be converted to the form # 0001001200050617. In other words, each number is zero padded to four # digits, and non digits are removed. AS_VAR_PUSHDEF([A],[ax_compare_version_A]) A=`echo "$1" | sed -e 's/\([[0-9]]*\)/Z\1Z/g' \ -e 's/Z\([[0-9]]\)Z/Z0\1Z/g' \ -e 's/Z\([[0-9]][[0-9]]\)Z/Z0\1Z/g' \ -e 's/Z\([[0-9]][[0-9]][[0-9]]\)Z/Z0\1Z/g' \ -e 's/[[^0-9]]//g'` AS_VAR_PUSHDEF([B],[ax_compare_version_B]) B=`echo "$3" | sed -e 's/\([[0-9]]*\)/Z\1Z/g' \ -e 's/Z\([[0-9]]\)Z/Z0\1Z/g' \ -e 's/Z\([[0-9]][[0-9]]\)Z/Z0\1Z/g' \ -e 's/Z\([[0-9]][[0-9]][[0-9]]\)Z/Z0\1Z/g' \ -e 's/[[^0-9]]//g'` dnl # In the case of le, ge, lt, and gt, the strings are sorted as necessary dnl # then the first line is used to determine if the condition is true. dnl # The sed right after the echo is to remove any indented white space. m4_case(m4_tolower($2), [lt],[ ax_compare_version=`echo "x$A x$B" | sed 's/^ *//' | sort -r | sed "s/x${A}/false/;s/x${B}/true/;1q"` ], [gt],[ ax_compare_version=`echo "x$A x$B" | sed 's/^ *//' | sort | sed "s/x${A}/false/;s/x${B}/true/;1q"` ], [le],[ ax_compare_version=`echo "x$A x$B" | sed 's/^ *//' | sort | sed "s/x${A}/true/;s/x${B}/false/;1q"` ], [ge],[ ax_compare_version=`echo "x$A x$B" | sed 's/^ *//' | sort -r | sed "s/x${A}/true/;s/x${B}/false/;1q"` ],[ dnl Split the operator from the subversion count if present. m4_bmatch(m4_substr($2,2), [0],[ # A count of zero means use the length of the shorter version. # Determine the number of characters in A and B. ax_compare_version_len_A=`echo "$A" | $AWK '{print(length)}'` ax_compare_version_len_B=`echo "$B" | $AWK '{print(length)}'` # Set A to no more than B's length and B to no more than A's length. A=`echo "$A" | sed "s/\(.\{$ax_compare_version_len_B\}\).*/\1/"` B=`echo "$B" | sed "s/\(.\{$ax_compare_version_len_A\}\).*/\1/"` ], [[0-9]+],[ # A count greater than zero means use only that many subversions A=`echo "$A" | sed "s/\(\([[0-9]]\{4\}\)\{m4_substr($2,2)\}\).*/\1/"` B=`echo "$B" | sed "s/\(\([[0-9]]\{4\}\)\{m4_substr($2,2)\}\).*/\1/"` ], [.+],[ AC_WARNING( [illegal OP numeric parameter: $2]) ],[]) # Pad zeros at end of numbers to make same length. ax_compare_version_tmp_A="$A`echo $B | sed 's/./0/g'`" B="$B`echo $A | sed 's/./0/g'`" A="$ax_compare_version_tmp_A" # Check for equality or inequality as necessary. m4_case(m4_tolower(m4_substr($2,0,2)), [eq],[ test "x$A" = "x$B" && ax_compare_version=true ], [ne],[ test "x$A" != "x$B" && ax_compare_version=true ],[ AC_WARNING([illegal OP parameter: $2]) ]) ]) AS_VAR_POPDEF([A])dnl AS_VAR_POPDEF([B])dnl dnl # Execute ACTION-IF-TRUE / ACTION-IF-FALSE. if test "$ax_compare_version" = "true" ; then m4_ifvaln([$4],[$4],[:])dnl m4_ifvaln([$5],[else $5])dnl fi ]) dnl AX_COMPARE_VERSION # =========================================================================== # http://www.gnu.org/software/autoconf-archive/ax_lib_curl.html # =========================================================================== # # SYNOPSIS # # AX_LIB_CURL([VERSION],[ACTION-IF-SUCCESS],[ACTION-IF-FAILURE]) # # DESCRIPTION # # Checks for minimum curl library version VERSION. If successfull executes # ACTION-IF-SUCCESS otherwise ACTION-IF-FAILURE. # # Defines CURL_LIBS and CURL_CFLAGS. # # A simple example: # # AX_LIB_CURL([7.19.4],,[ # AC_MSG_ERROR([Your system lacks of libcurl >= 7.19.4]) # ]) # # This macro is a rearranged version of AC_LIB_CURL from Akos Maroy. # # LICENSE # # Copyright (c) 2009 Francesco Salvestrini <salvestrini@users.sourceforge.net> # # Copying and distribution of this file, with or without modification, are # permitted in any medium without royalty provided the copyright notice # and this notice are preserved. This file is offered as-is, without any # warranty. #serial 7 AU_ALIAS([AC_CHECK_CURL], [AX_LIB_CURL]) AC_DEFUN([AX_LIB_CURL], [ AX_PATH_GENERIC([curl],[$1],'s/^libcurl\ \+//',[$2],[$3]) ]) # =========================================================================== # http://www.gnu.org/software/autoconf-archive/ax_path_generic.html # =========================================================================== # # SYNOPSIS # # AX_PATH_GENERIC(LIBRARY,[MINIMUM-VERSION,[SED-EXPR-EXTRACTOR]],[ACTION-IF-FOUND],[ACTION-IF-NOT-FOUND],[CONFIG-SCRIPTS],[CFLAGS-ARG],[LIBS-ARG]) # # DESCRIPTION # # Runs the LIBRARY-config script and defines LIBRARY_CFLAGS and # LIBRARY_LIBS unless the user had predefined them in the environment. # # The script must support `--cflags' and `--libs' args. If MINIMUM-VERSION # is specified, the script must also support the `--version' arg. If the # `--with-library-[exec-]prefix' arguments to ./configure are given, it # must also support `--prefix' and `--exec-prefix'. Prefereable use # CONFIG-SCRIPTS as config script, CFLAGS-ARG instead of `--cflags` and # LIBS-ARG instead of `--libs`, if given. # # The SED-EXPR-EXTRACTOR parameter representes the expression used in sed # to extract the version number. Use it if your 'foo-config --version' # dumps something like 'Foo library v1.0.0 (alfa)' instead of '1.0.0'. # # The macro respects LIBRARY_CONFIG, LIBRARY_CFLAGS and LIBRARY_LIBS # variables. If the first one is defined, it specifies the name of the # config script to use. If the latter two are defined, the script is not # ran at all and their values are used instead (if only one of them is # defined, the empty value of the remaining one is still used). # # Example: # # AX_PATH_GENERIC(Foo, 1.0.0) # # would run `foo-config --version' and check that it is at least 1.0.0, if # successful the following variables would be defined and substituted: # # FOO_CFLAGS to `foo-config --cflags` # FOO_LIBS to `foo-config --libs` # # Example: # # AX_PATH_GENERIC([Bar],,,[ # AC_MSG_ERROR([Cannot find Bar library]) # ]) # # would check for bar-config program, defining and substituting the # following variables: # # BAR_CFLAGS to `bar-config --cflags` # BAR_LIBS to `bar-config --libs` # # Example: # # ./configure BAZ_LIBS=/usr/lib/libbaz.a # # would link with a static version of baz library even if `baz-config # --libs` returns just "-lbaz" that would normally result in using the # shared library. # # This macro is a rearranged version of AC_PATH_GENERIC from Angus Lees. # # LICENSE # # Copyright (c) 2009 Francesco Salvestrini <salvestrini@users.sourceforge.net> # # Copying and distribution of this file, with or without modification, are # permitted in any medium without royalty provided the copyright notice # and this notice are preserved. This file is offered as-is, without any # warranty. #serial 11 AU_ALIAS([AC_PATH_GENERIC], [AX_PATH_GENERIC]) AC_DEFUN([AX_PATH_GENERIC],[ AC_REQUIRE([AC_PROG_SED]) dnl we're going to need uppercase and lowercase versions of the dnl string `LIBRARY' pushdef([UP], translit([$1], [a-z], [A-Z]))dnl pushdef([DOWN], translit([$1], [A-Z], [a-z]))dnl AC_ARG_WITH(DOWN-prefix,[AS_HELP_STRING([--with-]DOWN[-prefix=PREFIX], [Prefix where $1 is installed (optional)])], DOWN[]_config_prefix="$withval", DOWN[]_config_prefix="") AC_ARG_WITH(DOWN-exec-prefix,[AS_HELP_STRING([--with-]DOWN[-exec-prefix=EPREFIX], [Exec prefix where $1 is installed (optional)])], DOWN[]_config_exec_prefix="$withval", DOWN[]_config_exec_prefix="") AC_ARG_VAR(UP[]_CONFIG, [config script used for $1]) AC_ARG_VAR(UP[]_CFLAGS, [CFLAGS used for $1]) AC_ARG_VAR(UP[]_LIBS, [LIBS used for $1]) AS_IF([test x$UP[]_CFLAGS != x -o x$UP[]_LIBS != x],[ dnl Don't run config script at all, use user-provided values instead. AC_SUBST(UP[]_CFLAGS) AC_SUBST(UP[]_LIBS) : $4 ],[ AS_IF([test x$DOWN[]_config_exec_prefix != x],[ DOWN[]_config_args="$DOWN[]_config_args --exec-prefix=$DOWN[]_config_exec_prefix" AS_IF([test x${UP[]_CONFIG+set} != xset],[ UP[]_CONFIG=$DOWN[]_config_exec_prefix/bin/DOWN-config ]) ]) AS_IF([test x$DOWN[]_config_prefix != x],[ DOWN[]_config_args="$DOWN[]_config_args --prefix=$DOWN[]_config_prefix" AS_IF([test x${UP[]_CONFIG+set} != xset],[ UP[]_CONFIG=$DOWN[]_config_prefix/bin/DOWN-config ]) ]) AC_PATH_PROGS(UP[]_CONFIG,[$6 DOWN-config],[no]) AS_IF([test "$UP[]_CONFIG" == "no"],[ : $5 ],[ dnl Get the CFLAGS from LIBRARY-config script AS_IF([test x"$7" == x],[ UP[]_CFLAGS="`$UP[]_CONFIG $DOWN[]_config_args --cflags`" ],[ UP[]_CFLAGS="`$UP[]_CONFIG $DOWN[]_config_args $7`" ]) dnl Get the LIBS from LIBRARY-config script AS_IF([test x"$8" == x],[ UP[]_LIBS="`$UP[]_CONFIG $DOWN[]_config_args --libs`" ],[ UP[]_LIBS="`$UP[]_CONFIG $DOWN[]_config_args $8`" ]) AS_IF([test x"$2" != x],[ dnl Check for provided library version AS_IF([test x"$3" != x],[ dnl Use provided sed expression DOWN[]_version="`$UP[]_CONFIG $DOWN[]_config_args --version | $SED -e $3`" ],[ DOWN[]_version="`$UP[]_CONFIG $DOWN[]_config_args --version | $SED -e 's/^\ *\(.*\)\ *$/\1/'`" ]) AC_MSG_CHECKING([for $1 ($DOWN[]_version) >= $2]) AX_COMPARE_VERSION($DOWN[]_version,[ge],[$2],[ AC_MSG_RESULT([yes]) AC_SUBST(UP[]_CFLAGS) AC_SUBST(UP[]_LIBS) : $4 ],[ AC_MSG_RESULT([no]) : $5 ]) ],[ AC_SUBST(UP[]_CFLAGS) AC_SUBST(UP[]_LIBS) : $4 ]) ]) ]) popdef([UP]) popdef([DOWN]) ]) # =========================================================================== # http://www.gnu.org/software/autoconf-archive/ax_python_module.html # =========================================================================== # # SYNOPSIS # # AX_PYTHON_MODULE(modname[, fatal]) # # DESCRIPTION # # Checks for Python module. # # If fatal is non-empty then absence of a module will trigger an error. # # LICENSE # # Copyright (c) 2008 Andrew Collier # # Copying and distribution of this file, with or without modification, are # permitted in any medium without royalty provided the copyright notice # and this notice are preserved. This file is offered as-is, without any # warranty. #serial 6 AU_ALIAS([AC_PYTHON_MODULE], [AX_PYTHON_MODULE]) AC_DEFUN([AX_PYTHON_MODULE],[ if test -z $PYTHON; then PYTHON="python" fi PYTHON_NAME=`basename $PYTHON` AC_MSG_CHECKING($PYTHON_NAME 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 ]) # pkg.m4 - Macros to locate and utilise pkg-config. -*- Autoconf -*- # serial 1 (pkg-config-0.24) # # Copyright Ā© 2004 Scott James Remnant <scott@netsplit.com>. # # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 2 of the License, or # (at your option) any later version. # # This program is distributed in the hope that it will be useful, but # WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU # General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program; if not, write to the Free Software # Foundation, Inc., 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 <http://pkg-config.freedesktop.org/>.])[]dnl ]) else $1[]_CFLAGS=$pkg_cv_[]$1[]_CFLAGS $1[]_LIBS=$pkg_cv_[]$1[]_LIBS AC_MSG_RESULT([yes]) $3 fi[]dnl ])# PKG_CHECK_MODULES # PKG_INSTALLDIR(DIRECTORY) # ------------------------- # Substitutes the variable pkgconfigdir as the location where a module # should install pkg-config .pc files. By default the directory is # $libdir/pkgconfig, but the default can be changed by passing # DIRECTORY. The user can override through the --with-pkgconfigdir # parameter. AC_DEFUN([PKG_INSTALLDIR], [m4_pushdef([pkg_default], [m4_default([$1], ['${libdir}/pkgconfig'])]) m4_pushdef([pkg_description], [pkg-config installation directory @<:@]pkg_default[@:>@]) AC_ARG_WITH([pkgconfigdir], [AS_HELP_STRING([--with-pkgconfigdir], pkg_description)],, [with_pkgconfigdir=]pkg_default) AC_SUBST([pkgconfigdir], [$with_pkgconfigdir]) m4_popdef([pkg_default]) m4_popdef([pkg_description]) ]) dnl PKG_INSTALLDIR # PKG_NOARCH_INSTALLDIR(DIRECTORY) # ------------------------- # Substitutes the variable noarch_pkgconfigdir as the location where a # module should install arch-independent pkg-config .pc files. By # default the directory is $datadir/pkgconfig, but the default can be # changed by passing DIRECTORY. The user can override through the # --with-noarch-pkgconfigdir parameter. AC_DEFUN([PKG_NOARCH_INSTALLDIR], [m4_pushdef([pkg_default], [m4_default([$1], ['${datadir}/pkgconfig'])]) m4_pushdef([pkg_description], [pkg-config arch-independent installation directory @<:@]pkg_default[@:>@]) AC_ARG_WITH([noarch-pkgconfigdir], [AS_HELP_STRING([--with-noarch-pkgconfigdir], pkg_description)],, [with_noarch_pkgconfigdir=]pkg_default) AC_SUBST([noarch_pkgconfigdir], [$with_noarch_pkgconfigdir]) m4_popdef([pkg_default]) m4_popdef([pkg_description]) ]) dnl PKG_NOARCH_INSTALLDIR # PKG_CHECK_VAR(VARIABLE, MODULE, CONFIG-VARIABLE, # [ACTION-IF-FOUND], [ACTION-IF-NOT-FOUND]) # ------------------------------------------- # Retrieves the value of the pkg-config variable for the given module. AC_DEFUN([PKG_CHECK_VAR], [AC_REQUIRE([PKG_PROG_PKG_CONFIG])dnl AC_ARG_VAR([$1], [value of $3 for $2, overriding pkg-config])dnl _PKG_CONFIG([$1], [variable="][$3]["], [$2]) AS_VAR_COPY([$1], [pkg_cv_][$1]) AS_VAR_IF([$1], [""], [$5], [$4])dnl ])# PKG_CHECK_VAR # Copyright (C) 2002, 2003, 2005, 2006, 2007, 2008, 2011 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. # serial 1 # 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.11' 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.11.6], [], [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.11.6])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, 2003, 2005, 2011 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. # serial 1 # 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, 2000, 2001, 2003, 2004, 2005, 2006, 2008 # 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. # serial 9 # AM_CONDITIONAL(NAME, SHELL-CONDITION) # ------------------------------------- # Define a conditional. AC_DEFUN([AM_CONDITIONAL], [AC_PREREQ(2.52)dnl ifelse([$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, 2000, 2001, 2002, 2003, 2004, 2005, 2006, 2009, # 2010, 2011 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. # serial 12 # There are a few dirty hacks below to avoid letting `AC_PROG_CC' be # written in clear, in which case automake, when reading aclocal.m4, # will think it sees a *use*, and therefore will trigger all it's # C support machinery. Also note that it means that autoscan, seeing # CC etc. in the Makefile, will ask for an AC_PROG_CC use... # _AM_DEPENDENCIES(NAME) # ---------------------- # See how the compiler implements dependency checking. # NAME is "CC", "CXX", "GCJ", or "OBJC". # We try a few techniques and use that to set a single cache variable. # # We don't AC_REQUIRE the corresponding AC_PROG_CC since the latter was # modified to invoke _AM_DEPENDENCIES(CC); we would have a circular # dependency, and given that the user is not expected to run this macro, # just rely on AC_PROG_CC. AC_DEFUN([_AM_DEPENDENCIES], [AC_REQUIRE([AM_SET_DEPDIR])dnl AC_REQUIRE([AM_OUTPUT_DEPENDENCY_COMMANDS])dnl AC_REQUIRE([AM_MAKE_INCLUDE])dnl AC_REQUIRE([AM_DEP_TRACK])dnl ifelse([$1], CC, [depcc="$CC" am_compiler_list=], [$1], CXX, [depcc="$CXX" am_compiler_list=], [$1], OBJC, [depcc="$OBJC" am_compiler_list='gcc3 gcc'], [$1], 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 8's {/usr,}/bin/sh. touch 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, [ --disable-dependency-tracking speeds up one-time build --enable-dependency-tracking do not reject slow dependency extractors]) 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, 2000, 2001, 2002, 2003, 2004, 2005, 2008 # 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. #serial 5 # _AM_OUTPUT_DEPENDENCY_COMMANDS # ------------------------------ AC_DEFUN([_AM_OUTPUT_DEPENDENCY_COMMANDS], [{ # Autoconf 2.62 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"` # When using ansi2knr, U may be empty or an underscore; expand it U=`sed -n 's/^U = //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' -e 's/\$U/'"$U"'/g'`; do # Make sure the directory exists. test -f "$dirpart/$file" && continue fdir=`AS_DIRNAME(["$file"])` AS_MKDIR_P([$dirpart/$fdir]) # echo "creating $dirpart/$file" echo '# dummy' > "$dirpart/$file" done done } ])# _AM_OUTPUT_DEPENDENCY_COMMANDS # AM_OUTPUT_DEPENDENCY_COMMANDS # ----------------------------- # This macro should only be invoked once -- use via AC_REQUIRE. # # This code is only required when automatic dependency tracking # is enabled. FIXME. This creates each `.P' file that we will # need in order to bootstrap the dependency handling code. AC_DEFUN([AM_OUTPUT_DEPENDENCY_COMMANDS], [AC_CONFIG_COMMANDS([depfiles], [test x"$AMDEP_TRUE" != x"" || _AM_OUTPUT_DEPENDENCY_COMMANDS], [AMDEP_TRUE="$AMDEP_TRUE" ac_aux_dir="$ac_aux_dir"]) ]) # Do all the work for Automake. -*- Autoconf -*- # Copyright (C) 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004, # 2005, 2006, 2008, 2009 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. # serial 16 # 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. # 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.62])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], [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], 1)m4_ifdef([AC_PACKAGE_VERSION], 1), 11,, [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([AM_PROG_MKDIR_P])dnl # 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)], [define([AC_PROG_CC], defn([AC_PROG_CC])[_AM_DEPENDENCIES(CC)])])dnl AC_PROVIDE_IFELSE([AC_PROG_CXX], [_AM_DEPENDENCIES(CXX)], [define([AC_PROG_CXX], defn([AC_PROG_CXX])[_AM_DEPENDENCIES(CXX)])])dnl AC_PROVIDE_IFELSE([AC_PROG_OBJC], [_AM_DEPENDENCIES(OBJC)], [define([AC_PROG_OBJC], defn([AC_PROG_OBJC])[_AM_DEPENDENCIES(OBJC)])])dnl ]) _AM_IF_OPTION([silent-rules], [AC_REQUIRE([AM_SILENT_RULES])])dnl dnl The `parallel-tests' driver may need to know about EXEEXT, so add the dnl `am__EXEEXT' conditional if _AM_COMPILER_EXEEXT was seen. This macro dnl 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 ]) 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, 2003, 2005, 2008, 2011 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. # serial 1 # 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, 2005 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. # serial 2 # 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, 2002, 2003, 2005, 2009 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. # serial 4 # 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, 1999, 2000, 2001, 2003, 2004, 2005, 2008 # 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. # serial 6 # AM_MISSING_PROG(NAME, PROGRAM) # ------------------------------ AC_DEFUN([AM_MISSING_PROG], [AC_REQUIRE([AM_MISSING_HAS_RUN]) $1=${$1-"${am_missing_run}$2"} AC_SUBST($1)]) # AM_MISSING_HAS_RUN # ------------------ # Define MISSING if not defined so far and test if it supports --run. # If it does, set am_missing_run to use it, otherwise, to nothing. AC_DEFUN([AM_MISSING_HAS_RUN], [AC_REQUIRE([AM_AUX_DIR_EXPAND])dnl 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 --run true"; then am_missing_run="$MISSING --run " else am_missing_run= AC_MSG_WARN([`missing' script is too old or missing]) fi ]) # Copyright (C) 2003, 2004, 2005, 2006, 2011 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. # serial 1 # AM_PROG_MKDIR_P # --------------- # Check for `mkdir -p'. AC_DEFUN([AM_PROG_MKDIR_P], [AC_PREREQ([2.60])dnl AC_REQUIRE([AC_PROG_MKDIR_P])dnl dnl Automake 1.8 to 1.9.6 used to define mkdir_p. We now use MKDIR_P, dnl while keeping a definition of mkdir_p for backward compatibility. dnl @MKDIR_P@ is magic: AC_OUTPUT adjusts its value for each Makefile. dnl However we cannot define mkdir_p as $(MKDIR_P) for the sake of dnl Makefile.ins that do not define MKDIR_P, so we do our own dnl adjustment using top_builddir (which is defined more often than dnl MKDIR_P). AC_SUBST([mkdir_p], ["$MKDIR_P"])dnl case $mkdir_p in [[\\/$]]* | ?:[[\\/]]*) ;; */*) mkdir_p="\$(top_builddir)/$mkdir_p" ;; esac ]) # Helper functions for option handling. -*- Autoconf -*- # Copyright (C) 2001, 2002, 2003, 2005, 2008, 2010 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. # serial 5 # _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) 2001, 2003, 2005, 2011 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. # serial 1 # 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, 1997, 2000, 2001, 2003, 2005, 2008 # 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. # serial 5 # AM_SANITY_CHECK # --------------- AC_DEFUN([AM_SANITY_CHECK], [AC_MSG_CHECKING([whether build environment is sane]) # Just in case sleep 1 echo timestamp > conftest.file # 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 ( set X `ls -Lt "$srcdir/configure" conftest.file 2> /dev/null` if test "$[*]" = "X"; then # -L didn't work. set X `ls -t "$srcdir/configure" conftest.file` fi rm -f conftest.file if test "$[*]" != "X $srcdir/configure conftest.file" \ && test "$[*]" != "X conftest.file $srcdir/configure"; then # If neither matched, then we have a broken ls. This can happen # if, for instance, CONFIG_SHELL is bash and it inherits a # broken ls alias from the environment. This has actually # happened. Such a system could not be considered "sane". AC_MSG_ERROR([ls -t appears to fail. Make sure there is not a broken alias in your environment]) fi test "$[2]" = conftest.file ) then # Ok. : else AC_MSG_ERROR([newly created file is older than distributed files! Check your system clock]) fi AC_MSG_RESULT(yes)]) # Copyright (C) 2001, 2003, 2005, 2011 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. # serial 1 # 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, 2008, 2010 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. # serial 3 # _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, 2005, 2012 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. # serial 2 # _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}']) m4_if([$1], [v7], [am__tar='$${TAR-tar} chof - "$$tardir"' am__untar='$${TAR-tar} xf -'], [m4_case([$1], [ustar],, [pax],, [m4_fatal([Unknown tar format])]) AC_MSG_CHECKING([how to create a $1 tar archive]) # Loop over all known methods to create a tar archive until one works. _am_tools='gnutar m4_if([$1], [ustar], [plaintar]) pax cpio none' _am_tools=${am_cv_prog_tar_$1-$_am_tools} # Do not fold the above two line into one, because Tru64 sh and # Solaris sh will not grok spaces in the rhs of `-'. 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 <conftest.tar]) grep GrepMe conftest.dir/file >/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/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([acinclude.m4]) �����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������apache-couchdb-1.6.0/NOTICE�������������������������������������������������������������������������0000644�0001750�0000144�00000011334�12332105522�015224� 0����������������������������������������������������������������������������������������������������ustar�00djc�����������������������������users���������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������Apache CouchDB Copyright 2009-2014 The Apache Software Foundation This product includes software developed at The Apache Software Foundation (http://www.apache.org/). This product also includes the following third-party components: * ac_check_icu.m4 (http://autoconf-archive.cryp.to/ac_check_icu.html) Copyright 2008, Akos Maroy <darkeye@tyrell.hu> * ac_check_curl.m4 (http://autoconf-archive.cryp.to/ac_check_curl.html) Copyright 2008, Akos Maroy <darkeye@tyrell.hu> * pkg.m4 (http://http://pkg-config.freedesktop.org/wiki/) Copyright 2004, Scott James Remnant <scott@netsplit.com> * jQuery (http://jquery.org/) Copyright 2012 jQuery Foundation and other contributors * jQuery UI (http://jqueryui.com) Copyright 2011, Paul Bakaus * json2.js (http://www.json.org/) Public domain * MochiWeb (http://code.google.com/p/mochiweb/) Copyright 2007, Mochi Media Coporation * ibrowse (http://github.com/cmullaparthi/ibrowse/tree/master) Copyright 2005-2012, Chandrashekhar Mullaparthi * Erlang OAuth (http://github.com/tim/erlang-oauth) Copyright 2012, the authors and contributors * ETap (http://github.com/ngerakines/etap/) Copyright 2009, Nick Gerakines <nick@gerakines.net> * mimeparse.js (http://code.google.com/p/mimeparse/) Copyright 2009, Chris Anderson <jchris@apache.org> * base64.js Copyright 1999, Masanao Izumo <iz@onicos.co.jp> * jspec.js (http://visionmedia.github.com/jspec/) Copyright 2010 TJ Holowaychuk <tj@vision-media.ca> * yajl (http://lloyd.github.com/yajl/) Copyright 2010, Lloyd Hilaiel * snappy (http://code.google.com/p/snappy/) Copyright 2005, Google Inc. * snappy-erlang-nif (https://github.com/fdmanana/snappy-erlang-nif) Copyright 2011, Filipe David Manana <fdmanana@apache.org> * CoffeeScript (http://coffeescript.org/) Copyright 2011, Jeremy Ashkenas * Sphinx (http://sphinx-doc.org/) Copyright 2011, the Sphinx team * Sizzle (http://sizzlejs.com/) Copyright 2010, The Dojo Foundation * Underscore.js 1.4.2 (http://underscorejs.org) Copyright 2012, Jeremy Ashkenas * almond.js (http://github.com/jrburke/almond) Copyright 2011, The Dojo Foundation * backbone.js (http://backbonejs.org/) Copyright 2012, Jeremy Ashkenas, DocumentCloud Inc. * Bootstrap (http://twitter.github.com/bootstrap/) Copyright 2012, Twitter, Inc. * d3.js (http://d3js.org) Copyright 2012, Michael Bostock * Lodash (http://lodash.com/) Copyright 2012, John-David Dalton <http://allyoucanleet.com/> * nvd3.js (http://nvd3.org/) Copyright 2012, Novus Partners, Inc. * backbone.layoutmanager.js (https://github.com/tbranyen/backbone.layoutmanager) Copyright 2012, Tim Branyen (@tbranyen) * prettify.js (http://code.google.com/p/google-code-prettify/) Copyright 2011, Mike Samuel et al * PouchDB (https://github.com/daleharvey/pouchdb) Copyright 2012, Dale Harvey et al * require.js (https://github.com/jrburke/requirejs) Copyright (c) 2010-2011, The Dojo Foundation * jquery.form.js (https://github.com/malsup/form/) Copyright 2006-2013 (c) M. Alsup * couch_dbupdates Copyright 2012, BenoĆ®t Chesneau <benoitc@refuge.io> * mocha.js (https://github.com/visionmedia/mocha) Copyright (c) 2011-2013 TJ Holowaychuk <tj@vision-media.ca> * chaijs https://github.com/chaijs Copyright (c) 2011-2013 Jake Luer jake@alogicalparadox.com * sinon-chai Copyright Ā© 2012–2013 Domenic Denicola <domenic@domenicdenicola.com> * spin.js Copyright (c) 2011 Felix Gnass [fgnass at neteye dot de] * font-awesome http://fortawesome.github.io/Font-Awesome/ Copyright (c) 2013 Dave Gandy * httpdomain.py (https://bitbucket.org/birkenfeld/sphinx-contrib/src/6a3a8ca714cfce957530890d0431d9a7b88c930f/httpdomain/sphinxcontrib/httpdomain.py?at=httpdomain-1.1.9) Copyright (c) 2010, Hong Minhee <minhee@dahlia.kr> * externals.rst (http://davispj.com/2010/09/26/new-couchdb-externals-api.html) Copyright 2008-2010, Paul Joseph Davis <paul.joseph.davis@gmail.com> * protocol.rst (http://www.dataprotocols.org/en/latest/couchdb_replication.html) Copyright 2011-2013, BenoĆ®t Chesneau <benoitc@refuge.io> * views/intro.rst views/nosql.rst views/pagination.rst Copyright 2013, Creative Commons Attribution license * share/doc/src/couchapp/views/joins.rst (Using View Collation) Copyright 2007, Christopher Lenz <cmlenz@gmail.com> * share/doc/src/templates/couchdb/domainindex.html Copyright 2007-2011 by the Sphinx team * sandbox.js https://github.com/KlausTrainer/sandbox.js (c) 2013 Klaus Trainer * ace editor https://github.com/ajaxorg/ace Copyright (c) 2010, Ajax.org B.V. * src/fauxton/asserts/js/plugins/cloudant.pagingcollection.js Copyright (c) 2014, Cloudant http://cloudant.com ����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������apache-couchdb-1.6.0/share/�������������������������������������������������������������������������0000755�0001750�0000144�00000000000�12332105604�015421� 5����������������������������������������������������������������������������������������������������ustar�00djc�����������������������������users���������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������apache-couchdb-1.6.0/share/doc/���������������������������������������������������������������������0000755�0001750�0000144�00000000000�12332106072�016166� 5����������������������������������������������������������������������������������������������������ustar�00djc�����������������������������users���������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������apache-couchdb-1.6.0/share/doc/ext/�����������������������������������������������������������������0000755�0001750�0000144�00000000000�12332106073�016767� 5����������������������������������������������������������������������������������������������������ustar�00djc�����������������������������users���������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������apache-couchdb-1.6.0/share/doc/ext/httpdomain.py����������������������������������������������������0000644�0001750�0000144�00000051506�12332105522�021515� 0����������������������������������������������������������������������������������������������������ustar�00djc�����������������������������users���������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������""" sphinxcontrib.httpdomain ~~~~~~~~~~~~~~~~~~~~~~~~ The HTTP domain for documenting RESTful HTTP APIs. :copyright: Copyright 2011 by Hong Minhee :license: BSD, see LICENSE for details. """ import re from docutils import nodes from docutils.parsers.rst.roles import set_classes from pygments.lexer import RegexLexer, bygroups from pygments.lexers import get_lexer_by_name from pygments.token import Literal, Text, Operator, Keyword, Name, Number from pygments.util import ClassNotFound from sphinx import addnodes from sphinx.roles import XRefRole from sphinx.domains import Domain, ObjType, Index from sphinx.directives import ObjectDescription, directives from sphinx.util.nodes import make_refnode from sphinx.util.docfields import GroupedField, TypedField class DocRef(object): """Represents a link to an RFC which defines an HTTP method.""" def __init__(self, base_url, anchor, section): """Stores the specified attributes which represent a URL which links to an RFC which defines an HTTP method. """ self.base_url = base_url self.anchor = anchor self.section = section def __repr__(self): """Returns the URL which this object represents, which points to the location of the RFC which defines some HTTP method. """ return '{0}#{1}{2}'.format(self.base_url, self.anchor, self.section) class RFC2616Ref(DocRef): def __init__(self, section): url = 'http://www.w3.org/Protocols/rfc2616/rfc2616-sec{0:d}.html' url = url.format(int(section)) super(RFC2616Ref, self).__init__(url, 'sec', section) class IETFRef(DocRef): def __init__(self, rfc, section): url = 'http://tools.ietf.org/html/rfc{0:d}'.format(rfc) super(IETFRef, self).__init__(url, 'section-', section) class EventSourceRef(DocRef): def __init__(self, section): url = 'http://www.w3.org/TR/eventsource/' super(EventSourceRef, self).__init__(url, section, '') #: Mapping from lowercase HTTP method name to :class:`DocRef` object which #: maintains the URL which points to the section of the RFC which defines that #: HTTP method. METHOD_REFS = { 'patch': IETFRef(5789, 2), 'options': RFC2616Ref(9.2), 'get': RFC2616Ref(9.3), 'head': RFC2616Ref(9.4), 'post': RFC2616Ref(9.5), 'put': RFC2616Ref(9.6), 'delete': RFC2616Ref(9.7), 'trace': RFC2616Ref(9.8), 'connect': RFC2616Ref(9.9), 'copy': IETFRef(2518, 8.8), 'any': '' } #: Mapping from HTTP header name to :class:`DocRef` object which #: maintains the URL which points to the related section of the RFC. HEADER_REFS = { 'Accept': RFC2616Ref(14.1), 'Accept-Charset': RFC2616Ref(14.2), 'Accept-Encoding': RFC2616Ref(14.3), 'Accept-Language': RFC2616Ref(14.4), 'Accept-Ranges': RFC2616Ref(14.5), 'Age': RFC2616Ref(14.6), 'Allow': RFC2616Ref(14.7), 'Authorization': RFC2616Ref(14.8), 'Cache-Control': RFC2616Ref(14.9), 'Cookie': IETFRef(2109, '4.3.4'), 'Connection': RFC2616Ref(14.10), 'Content-Encoding': RFC2616Ref(14.11), 'Content-Language': RFC2616Ref(14.12), 'Content-Length': RFC2616Ref(14.13), 'Content-Location': RFC2616Ref(14.14), 'Content-MD5': RFC2616Ref(14.15), 'Content-Range': RFC2616Ref(14.16), 'Content-Type': RFC2616Ref(14.17), 'Date': RFC2616Ref(14.18), 'Destination': IETFRef(2518, 9.3), 'ETag': RFC2616Ref(14.19), 'Expect': RFC2616Ref(14.20), 'Expires': RFC2616Ref(14.21), 'From': RFC2616Ref(14.22), 'Host': RFC2616Ref(14.23), 'If-Match': RFC2616Ref(14.24), 'If-Modified-Since': RFC2616Ref(14.25), 'If-None-Match': RFC2616Ref(14.26), 'If-Range': RFC2616Ref(14.27), 'If-Unmodified-Since': RFC2616Ref(14.28), 'Last-Event-ID': EventSourceRef('last-event-id'), 'Last-Modified': RFC2616Ref(14.29), 'Location': RFC2616Ref(14.30), 'Max-Forwards': RFC2616Ref(14.31), 'Pragma': RFC2616Ref(14.32), 'Proxy-Authenticate': RFC2616Ref(14.33), 'Proxy-Authorization': RFC2616Ref(14.34), 'Range': RFC2616Ref(14.35), 'Referer': RFC2616Ref(14.36), 'Retry-After': RFC2616Ref(14.37), 'Server': RFC2616Ref(14.38), 'Set-Cookie': IETFRef(2109, '4.2.2'), 'TE': RFC2616Ref(14.39), 'Trailer': RFC2616Ref(14.40), 'Transfer-Encoding': RFC2616Ref(14.41), 'Upgrade': RFC2616Ref(14.42), 'User-Agent': RFC2616Ref(14.43), 'Vary': RFC2616Ref(14.44), 'Via': RFC2616Ref(14.45), 'Warning': RFC2616Ref(14.46), 'WWW-Authenticate': RFC2616Ref(14.47) } HTTP_STATUS_CODES = { 100: 'Continue', 101: 'Switching Protocols', 102: 'Processing', 200: 'OK', 201: 'Created', 202: 'Accepted', 203: 'Non Authoritative Information', 204: 'No Content', 205: 'Reset Content', 206: 'Partial Content', 207: 'Multi Status', 226: 'IM Used', # see RFC 3229 300: 'Multiple Choices', 301: 'Moved Permanently', 302: 'Found', 303: 'See Other', 304: 'Not Modified', 305: 'Use Proxy', 307: 'Temporary Redirect', 400: 'Bad Request', 401: 'Unauthorized', 402: 'Payment Required', # unused 403: 'Forbidden', 404: 'Not Found', 405: 'Method Not Allowed', 406: 'Not Acceptable', 407: 'Proxy Authentication Required', 408: 'Request Timeout', 409: 'Conflict', 410: 'Gone', 411: 'Length Required', 412: 'Precondition Failed', 413: 'Request Entity Too Large', 414: 'Request URI Too Long', 415: 'Unsupported Media Type', 416: 'Requested Range Not Satisfiable', 417: 'Expectation Failed', 418: "I'm a teapot", # see RFC 2324 422: 'Unprocessable Entity', 423: 'Locked', 424: 'Failed Dependency', 426: 'Upgrade Required', 449: 'Retry With', # proprietary MS extension 500: 'Internal Server Error', 501: 'Not Implemented', 502: 'Bad Gateway', 503: 'Service Unavailable', 504: 'Gateway Timeout', 505: 'HTTP Version Not Supported', 507: 'Insufficient Storage', 510: 'Not Extended' } http_sig_param_re = re.compile(r'\((?:(?P<type>[^:)]+):)?(?P<name>[\w_]+)\)', re.VERBOSE) def sort_by_method(entries): def cmp(item): order = ['HEAD', 'GET', 'POST', 'PUT', 'DELETE', 'COPY', 'OPTIONS'] method = item[0].split(' ', 1)[0] if method in order: return order.index(method) return 100 return sorted(entries, key=cmp) def http_resource_anchor(method, path): path = re.sub(r'[{}]', '', re.sub(r'[<>:/]', '-', path)) return method.lower() + '-' + path class HTTPResource(ObjectDescription): doc_field_types = [ TypedField('parameter', label='Parameters', names=('param', 'parameter', 'arg', 'argument'), typerolename='obj', typenames=('paramtype', 'type')), TypedField('jsonobject', label='JSON Object', names=('jsonparameter', 'jsonparam', 'json'), typerolename='obj', typenames=('jsonparamtype', 'jsontype')), TypedField('requestjsonobject', label='Request JSON Object', names=('reqjsonobj', 'reqjson', '<jsonobj', '<json'), typerolename='obj', typenames=('reqjsontype', '<jsontype')), TypedField('requestjsonarray', label='Request JSON Array of Objects', names=('reqjsonarr', '<jsonarr'), typerolename='obj', typenames=('reqjsonarrtype', '<jsonarrtype')), TypedField('responsejsonobject', label='Response JSON Object', names=('resjsonobj', 'resjson', '>jsonobj', '>json'), typerolename='obj', typenames=('resjsontype', '>jsontype')), TypedField('responsejsonarray', label='Response JSON Array of Objects', names=('resjsonarr', '>jsonarr'), typerolename='obj', typenames=('resjsonarrtype', '>jsonarrtype')), TypedField('queryparameter', label='Query Parameters', names=('queryparameter', 'queryparam', 'qparam', 'query'), typerolename='obj', typenames=('queryparamtype', 'querytype', 'qtype')), GroupedField('formparameter', label='Form Parameters', names=('formparameter', 'formparam', 'fparam', 'form')), GroupedField('requestheader', label='Request Headers', rolename='mailheader', names=('<header', 'reqheader', 'requestheader')), GroupedField('responseheader', label='Response Headers', rolename='mailheader', names=('>header', 'resheader', 'responseheader')), GroupedField('statuscode', label='Status Codes', rolename='statuscode', names=('statuscode', 'status', 'code')) ] option_spec = { 'deprecated': directives.flag, 'noindex': directives.flag, 'synopsis': lambda x: x, } method = NotImplemented def handle_signature(self, sig, signode): method = self.method.upper() + ' ' signode += addnodes.desc_name(method, method) offset = 0 path = None for match in http_sig_param_re.finditer(sig): path = sig[offset:match.start()] signode += addnodes.desc_name(path, path) params = addnodes.desc_parameterlist() typ = match.group('type') if typ: typ += ': ' params += addnodes.desc_annotation(typ, typ) name = match.group('name') params += addnodes.desc_parameter(name, name) signode += params offset = match.end() if offset < len(sig): path = sig[offset:len(sig)] signode += addnodes.desc_name(path, path) if path is None: assert False, 'no matches for sig: %s' % sig fullname = self.method.upper() + ' ' + path signode['method'] = self.method signode['path'] = sig signode['fullname'] = fullname return (fullname, self.method, sig) def needs_arglist(self): return False def add_target_and_index(self, name_cls, sig, signode): signode['ids'].append(http_resource_anchor(*name_cls[1:])) if 'noindex' not in self.options: self.env.domaindata['http'][self.method][sig] = ( self.env.docname, self.options.get('synopsis', ''), 'deprecated' in self.options) def get_index_text(self, modname, name): return '' class HTTPOptions(HTTPResource): method = 'options' class HTTPHead(HTTPResource): method = 'head' class HTTPPatch(HTTPResource): method = 'patch' class HTTPPost(HTTPResource): method = 'post' class HTTPGet(HTTPResource): method = 'get' class HTTPPut(HTTPResource): method = 'put' class HTTPDelete(HTTPResource): method = 'delete' class HTTPTrace(HTTPResource): method = 'trace' class HTTPCopy(HTTPResource): method = 'copy' class HTTPAny(HTTPResource): method = 'any' def http_statuscode_role(name, rawtext, text, lineno, inliner, options=None, content=None): if options is None: options = {} if content is None: content = [] if text.isdigit(): code = int(text) try: status = HTTP_STATUS_CODES[code] except KeyError: msg = inliner.reporter.error('%d is invalid HTTP status code' % code, lineno=lineno) prb = inliner.problematic(rawtext, rawtext, msg) return [prb], [msg] else: try: code, status = re.split(r'\s', text.strip(), 1) code = int(code) except ValueError: msg = inliner.reporter.error( 'HTTP status code must be an integer (e.g. `200`) or ' 'start with an integer (e.g. `200 OK`); %r is invalid' % text, line=lineno ) prb = inliner.problematic(rawtext, rawtext, msg) return [prb], [msg] nodes.reference(rawtext) if code == 226: url = 'http://www.ietf.org/rfc/rfc3229.txt' elif code == 418: url = 'http://www.ietf.org/rfc/rfc2324.txt' elif code == 449: url = 'http://msdn.microsoft.com/en-us/library/dd891478(v=prot.10).aspx' elif code in HTTP_STATUS_CODES: url = 'http://www.w3.org/Protocols/rfc2616/rfc2616-sec10.html' \ '#sec10.' + ('%d.%d' % (code // 100, 1 + code % 100)) else: url = '' set_classes(options) node = nodes.reference(rawtext, '%d %s' % (code, status), refuri=url, **options) return [node], [] def http_method_role(name, rawtext, text, lineno, inliner, options=None, content=None): if options is None: options = {} if content is None: content = [] method = str(text).lower() if method not in METHOD_REFS: msg = inliner.reporter.error('%s is not valid HTTP method' % method, lineno=lineno) prb = inliner.problematic(rawtext, rawtext, msg) return [prb], [msg] url = str(METHOD_REFS[method]) node = nodes.reference(rawtext, method.upper(), refuri=url, **options) return [node], [] def http_header_role(name, rawtext, text, lineno, inliner, options=None, content=None): if options is None: options = {} if content is None: content = [] header = str(text) if header not in HEADER_REFS: header = header.title() if header not in HEADER_REFS: if header.startswith(('X-Couch-', 'Couch-')): return [nodes.strong(header, header)], [] msg = inliner.reporter.error('%s is not unknown HTTP header' % header, lineno=lineno) prb = inliner.problematic(rawtext, rawtext, msg) return [prb], [msg] url = str(HEADER_REFS[header]) node = nodes.reference(rawtext, header, refuri=url, **options) return [node], [] class HTTPXRefRole(XRefRole): def __init__(self, method, **kwargs): XRefRole.__init__(self, **kwargs) self.method = method def process_link(self, env, refnode, has_explicit_title, title, target): if not target.startswith('/'): pass if not has_explicit_title: title = self.method.upper() + ' ' + title return title, target class HTTPIndex(Index): name = 'api' localname = 'HTTP API Reference' shortname = 'API Reference' def generate(self, docnames=None): content = {} items = ((method, path, info) for method, routes in self.domain.routes.items() for path, info in routes.items()) items = sorted(items, key=lambda item: item[1]) for method, path, info in items: entries = content.setdefault(path, []) entry_name = method.upper() + ' ' + path entries.append([ entry_name, 0, info[0], http_resource_anchor(method, path), '', 'Deprecated' if info[2] else '', info[1] ]) items = sorted( (path, sort_by_method(entries)) for path, entries in content.items() ) return (items, True) class HTTPDomain(Domain): """HTTP domain.""" name = 'http' label = 'HTTP' object_types = { 'options': ObjType('options', 'options', 'obj'), 'head': ObjType('head', 'head', 'obj'), 'post': ObjType('post', 'post', 'obj'), 'get': ObjType('get', 'get', 'obj'), 'put': ObjType('put', 'put', 'obj'), 'patch': ObjType('patch', 'patch', 'obj'), 'delete': ObjType('delete', 'delete', 'obj'), 'trace': ObjType('trace', 'trace', 'obj'), 'copy': ObjType('copy', 'copy', 'obj'), 'any': ObjType('any', 'any', 'obj') } directives = { 'options': HTTPOptions, 'head': HTTPHead, 'post': HTTPPost, 'get': HTTPGet, 'put': HTTPPut, 'patch': HTTPPatch, 'delete': HTTPDelete, 'trace': HTTPTrace, 'copy': HTTPCopy, 'any': HTTPAny } roles = { 'options': HTTPXRefRole('options'), 'head': HTTPXRefRole('head'), 'post': HTTPXRefRole('post'), 'get': HTTPXRefRole('get'), 'put': HTTPXRefRole('put'), 'patch': HTTPXRefRole('patch'), 'delete': HTTPXRefRole('delete'), 'trace': HTTPXRefRole('trace'), 'copy': HTTPXRefRole('copy'), 'all': HTTPXRefRole('all'), 'statuscode': http_statuscode_role, 'method': http_method_role, 'header': http_header_role } initial_data = { 'options': {}, # path: (docname, synopsis) 'head': {}, 'post': {}, 'get': {}, 'put': {}, 'patch': {}, 'delete': {}, 'trace': {}, 'copy': {}, 'any': {} } indices = [HTTPIndex] @property def routes(self): return dict((key, self.data[key]) for key in self.object_types) def clear_doc(self, docname): for typ, routes in self.routes.items(): for path, info in list(routes.items()): if info[0] == docname: del routes[path] def resolve_xref(self, env, fromdocname, builder, typ, target, node, contnode): try: info = self.data[str(typ)][target] except KeyError: text = contnode.rawsource if typ == 'statuscode': return http_statuscode_role(None, text, text, None, None)[0][0] elif typ == 'mailheader': return http_header_role(None, text, text, None, None)[0][0] else: return nodes.emphasis(text, text) else: anchor = http_resource_anchor(typ, target) title = typ.upper() + ' ' + target return make_refnode(builder, fromdocname, info[0], anchor, contnode, title) def get_objects(self): for method, routes in self.routes.items(): for path, info in routes.items(): anchor = http_resource_anchor(method, path) yield (path, path, method, info[0], anchor, 1) class HTTPLexer(RegexLexer): """Lexer for HTTP sessions.""" name = 'HTTP' aliases = ['http'] flags = re.DOTALL def header_callback(self, match): if match.group(1).lower() == 'content-type': content_type = match.group(5).strip() if ';' in content_type: content_type = content_type[:content_type.find(';')].strip() self.content_type = content_type yield match.start(1), Name.Attribute, match.group(1) yield match.start(2), Text, match.group(2) yield match.start(3), Operator, match.group(3) yield match.start(4), Text, match.group(4) yield match.start(5), Literal, match.group(5) yield match.start(6), Text, match.group(6) def continuous_header_callback(self, match): yield match.start(1), Text, match.group(1) yield match.start(2), Literal, match.group(2) yield match.start(3), Text, match.group(3) def content_callback(self, match): content_type = getattr(self, 'content_type', None) content = match.group() offset = match.start() if content_type: from pygments.lexers import get_lexer_for_mimetype try: lexer = get_lexer_for_mimetype(content_type) except ClassNotFound: pass else: for idx, token, value in lexer.get_tokens_unprocessed(content): yield offset + idx, token, value return yield offset, Text, content tokens = { 'root': [ (r'(GET|POST|PUT|PATCH|DELETE|HEAD|OPTIONS|TRACE|COPY)' r'( +)([^ ]+)( +)' r'(HTTPS?)(/)(1\.[01])(\r?\n|$)', bygroups(Name.Function, Text, Name.Namespace, Text, Keyword.Reserved, Operator, Number, Text), 'headers'), (r'(HTTPS?)(/)(1\.[01])( +)(\d{3})( +)([^\r\n]+)(\r?\n|$)', bygroups(Keyword.Reserved, Operator, Number, Text, Number, Text, Name.Exception, Text), 'headers'), ], 'headers': [ (r'([^\s:]+)( *)(:)( *)([^\r\n]+)(\r?\n|$)', header_callback), (r'([\t ]+)([^\r\n]+)(\r?\n|$)', continuous_header_callback), (r'\r?\n', Text, 'content') ], 'content': [ (r'.+', content_callback) ] } def setup(app): app.add_domain(HTTPDomain) try: get_lexer_by_name('http') except ClassNotFound: app.add_lexer('http', HTTPLexer()) ������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������apache-couchdb-1.6.0/share/doc/ext/configdomain.py��������������������������������������������������0000644�0001750�0000144�00000007416�12332105522�022004� 0����������������������������������������������������������������������������������������������������ustar�00djc�����������������������������users���������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������## Licensed under the Apache License, Version 2.0 (the "License"); you may not ## use this file except in compliance with the License. You may obtain a copy of ## the License at ## ## http://www.apache.org/licenses/LICENSE-2.0 ## ## Unless required by applicable law or agreed to in writing, software ## distributed under the License is distributed on an "AS IS" BASIS, WITHOUT ## WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the ## License for the specific language governing permissions and limitations under ## the License. from sphinx import addnodes from sphinx.roles import XRefRole from sphinx.domains import Domain, ObjType, Index from sphinx.directives import ObjectDescription from sphinx.util.nodes import make_refnode class ConfigObject(ObjectDescription): def handle_signature(self, sig, signode): if '::' in sig: name, descr = map(lambda i: i.strip(), sig.split('::')) else: name, descr = sig.strip(), '' signode['name'] = name signode['descr'] = descr domain, objtype = self.name.split(':') if objtype == 'section': self.env.temp_data['section'] = signode['name'] name = '[%s]' % signode['name'] signode += addnodes.desc_name(name, name) return signode['name'] def needs_arglist(self): return False def add_target_and_index(self, name, sig, signode): section = self.env.temp_data['section'] domain, objtype = self.name.split(':') data = self.env.domaindata[domain][objtype] if objtype == 'section': data[name] = (self.env.docname, signode['descr']) signode['ids'].append(signode['name']) elif objtype == 'option': idx = '%s/%s' % (section, signode['name']) data[idx] = (self.env.docname, signode['descr']) signode['ids'].append(idx) else: assert 'unknown object type %r' % objtype class ConfigIndex(Index): name = 'ref' localname = 'Configuration Reference' shortname = 'Config Reference' def generate(self, docnames=None): content = dict( (name, [(name, 1, info[0], name, '', '', info[1])]) for name, info in self.domain.data['section'].items() ) options = self.domain.data['option'] for idx, info in sorted(options.items()): path, descr = info section, name = idx.split('/', 1) content[section].append(( name, 2, path, '%s/%s' % (section, name), '', '', descr )) return (sorted(content.items()), False) class ConfigDomain(Domain): name = 'config' label = 'CONFIG' object_types = { 'section': ObjType('section', 'section', 'obj'), 'option': ObjType('option', 'option', 'obj'), } directives = { 'section': ConfigObject, 'option': ConfigObject, } roles = { 'section': XRefRole(), 'option': XRefRole(), } initial_data = { 'section': {}, 'option': {} } indices = [ConfigIndex] def resolve_xref(self, env, fromdocname, builder, typ, target, node, contnode): if typ == 'section': info = self.data[typ][target] title = '[%s]' % target elif typ == 'option': assert '/' in target, 'option without section: %r' % target section, option = target.split('/', 1) info = self.data[typ][target] title = option else: assert 'unknown role %r for target %r' % (typ, target) return make_refnode(builder, fromdocname, info[0], target, contnode, title) def setup(app): app.add_domain(ConfigDomain) ��������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������apache-couchdb-1.6.0/share/doc/ext/github.py��������������������������������������������������������0000644�0001750�0000144�00000003367�12332105522�020632� 0����������������������������������������������������������������������������������������������������ustar�00djc�����������������������������users���������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������## Licensed under the Apache License, Version 2.0 (the "License"); you may not ## use this file except in compliance with the License. You may obtain a copy of ## the License at ## ## http://www.apache.org/licenses/LICENSE-2.0 ## ## Unless required by applicable law or agreed to in writing, software ## distributed under the License is distributed on an "AS IS" BASIS, WITHOUT ## WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the ## License for the specific language governing permissions and limitations under ## the License. import os def get_github_url(app, view, path): return 'https://github.com/{project}/{view}/{branch}/{path}'.format( project=app.config.github_project, view=view, branch=app.config.github_branch, path=path) def html_page_context(app, pagename, templatename, context, doctree): # base template for common sphinx pages like search or genindex # there is no need to provide github show/edit links for them if templatename != 'page.html': return # ok, I'm aware about that this is wrong way to concat url segments # but this is one is most portable between 2.x and 3.x versions # plus it fits our current requirements. But still, patches are welcome (: path = os.path.join( app.config.github_docs_path, os.path.relpath(doctree.get('source'), app.builder.srcdir)) context['github_show_url'] = get_github_url(app, 'blob', path) context['github_edit_url'] = get_github_url(app, 'edit', path) def setup(app): app.add_config_value('github_project', '', True) app.add_config_value('github_branch', 'master', True) app.add_config_value('github_docs_path', '', True) app.connect('html-page-context', html_page_context) �������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������apache-couchdb-1.6.0/share/doc/src/�����������������������������������������������������������������0000755�0001750�0000144�00000000000�12332106072�016755� 5����������������������������������������������������������������������������������������������������ustar�00djc�����������������������������users���������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������apache-couchdb-1.6.0/share/doc/src/api/�������������������������������������������������������������0000755�0001750�0000144�00000000000�12332106072�017526� 5����������������������������������������������������������������������������������������������������ustar�00djc�����������������������������users���������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������apache-couchdb-1.6.0/share/doc/src/api/ddoc/��������������������������������������������������������0000755�0001750�0000144�00000000000�12332106072�020437� 5����������������������������������������������������������������������������������������������������ustar�00djc�����������������������������users���������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������apache-couchdb-1.6.0/share/doc/src/api/ddoc/render.rst����������������������������������������������0000644�0001750�0000144�00000024307�12332105522�022455� 0����������������������������������������������������������������������������������������������������ustar�00djc�����������������������������users���������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������.. Licensed under the Apache License, Version 2.0 (the "License"); you may not .. use this file except in compliance with the License. You may obtain a copy of .. the License at .. .. http://www.apache.org/licenses/LICENSE-2.0 .. .. Unless required by applicable law or agreed to in writing, software .. distributed under the License is distributed on an "AS IS" BASIS, WITHOUT .. WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the .. License for the specific language governing permissions and limitations under .. the License. .. _api/ddoc/show: ``/db/_design/design-doc/_show/show-name`` ========================================== .. http:get:: /{db}/_design/{ddoc}/_show/{func} :synopsis: Executes a show function against null document .. http:post:: /{db}/_design/{ddoc}/_show/{func} :synopsis: Same as GET method for the related endpoint Applies :ref:`show function <showfun>` for `null` document. The request and response parameters are depended upon function implementation. :param db: Database name :param ddoc: Design document name :param func: Show function name :>header ETag: Response signature :query boolean details: Indicates whether details should be included :query string format: Format of the returned response. Used by :js:func:`provides` function :code 200: Request completed successfully :code 500: Query server error **Function**: .. code-block:: javascript function(doc, req) { if (!doc) { return {body: "no doc"} } else { return {body: doc.description} } } **Request**: .. code-block:: http GET /recipes/_design/recipe/_show/description HTTP/1.1 Accept: application/json Host: localhost:5984 **Response**: .. code-block:: http HTTP/1.1 200 OK Content-Length: 6 Content-Type: text/html; charset=utf-8 Date: Wed, 21 Aug 2013 12:34:07 GMT Etag: "7Z2TO7FPEMZ0F4GH0RJCRIOAU" Server: CouchDB (Erlang/OTP) Vary: Accept no doc .. _api/ddoc/show/id: ``/db/_design/design-doc/_show/show-name/doc-id`` ================================================= .. http:get:: /{db}/_design/{ddoc}/_show/{func}/{docid} :synopsis: Executes a show function against the specified document .. http:post:: /{db}/_design/{ddoc}/_show/{func}/{docid} :synopsis: Same as GET method for the related endpoint Applies :ref:`show function <showfun>` for the specified document. The request and response parameters are depended upon function implementation. :param db: Database name :param ddoc: Design document name :param func: Show function name :param docid: Document ID :>header ETag: Response signature :query boolean details: Indicates whether details should be included :query string format: Format of the returned response. Used by :js:func:`provides` function :code 200: Request completed successfully :code 500: Query server error **Function**: .. code-block:: javascript function(doc, req) { if (!doc) { return {body: "no doc"} } else { return {body: doc.description} } } **Request**: .. code-block:: http GET /recipes/_design/recipe/_show/description/SpaghettiWithMeatballs HTTP/1.1 Accept: application/json Host: localhost:5984 **Response**: .. code-block:: http HTTP/1.1 200 OK Content-Length: 88 Content-Type: text/html; charset=utf-8 Date: Wed, 21 Aug 2013 12:38:08 GMT Etag: "8IEBO8103EI98HDZL5Z4I1T0C" Server: CouchDB (Erlang/OTP) Vary: Accept An Italian-American dish that usually consists of spaghetti, tomato sauce and meatballs. .. _api/ddoc/list: ``/db/_design/design-doc/_list/list-name/view-name`` ==================================================== .. http:get:: /{db}/_design/{ddoc}/_list/{func}/{view} :synopsis: Executes a list function against the view from the same design document .. http:post:: /{db}/_design/{ddoc}/_list/{func}/{view} :synopsis: Same as GET method for the related endpoint Applies :ref:`list function <listfun>` for the :ref:`view function <viewfun>` from the same design document. The request and response parameters are depended upon function implementation. :param db: Database name :param ddoc: Design document name :param func: List function name :param view: View function name :>header ETag: Response signature :>header Transfer-Encoding: ``chunked`` :query string format: Format of the returned response. Used by :js:func:`provides` function :code 200: Request completed successfully :code 500: Query server error **Function**: .. code-block:: javascript function(head, req) { var row = getRow(); if (!row){ return 'no ingredients' } send(row.key); while(row=getRow()){ send(', ' + row.key); } } **Request**: .. code-block:: http GET /recipes/_design/recipe/_list/ingredients/by_name HTTP/1.1 Accept: text/plain Host: localhost:5984 **Response**: .. code-block:: http HTTP/1.1 200 OK Content-Type: text/plain; charset=utf-8 Date: Wed, 21 Aug 2013 12:49:15 GMT Etag: "D52L2M1TKQYDD1Y8MEYJR8C84" Server: CouchDB (Erlang/OTP) Transfer-Encoding: chunked Vary: Accept meatballs, spaghetti, tomato sauce .. _api/ddoc/list/ddoc: ``/db/_design/design-doc/_list/list-name/other-ddoc/view-name`` =============================================================== .. http:get:: /{db}/_design/{ddoc}/_list/{func}/{other-ddoc}/{view} :synopsis: Executes a list function against the view from other design document .. http:post:: /{db}/_design/{ddoc}/_list/{func}/{other-ddoc}/{view} :synopsis: Same as GET method for the related endpoint Applies :ref:`list function <listfun>` for the :ref:`view function <viewfun>` from the other design document. The request and response parameters are depended upon function implementation. :param db: Database name :param ddoc: Design document name :param func: List function name :param other-ddoc: Other design document name that holds view function :param view: View function name :>header ETag: Response signature :>header Transfer-Encoding: ``chunked`` :query string format: Format of the returned response. Used by :js:func:`provides` function :code 200: Request completed successfully :code 500: Query server error **Function**: .. code-block:: javascript function(head, req) { var row = getRow(); if (!row){ return 'no ingredients' } send(row.key); while(row=getRow()){ send(', ' + row.key); } } **Request**: .. code-block:: http GET /recipes/_design/ingredient/_list/ingredients/recipe/by_ingredient?key="spaghetti" HTTP/1.1 Accept: text/plain Host: localhost:5984 **Response**: .. code-block:: http HTTP/1.1 200 OK Content-Type: text/plain; charset=utf-8 Date: Wed, 21 Aug 2013 12:49:15 GMT Etag: "5L0975X493R0FB5Z3043POZHD" Server: CouchDB (Erlang/OTP) Transfer-Encoding: chunked Vary: Accept spaghetti .. _api/ddoc/update: ``/db/_design/design-doc/_update/update-name`` ============================================== .. http:post:: /{db}/_design/{ddoc}/_update/{func} :synopsis: Executes an update function against the null document Executes :ref:`update function <updatefun>` on server side for ``null`` document. :param db: Database name :param ddoc: Design document name :param func: Update function name :>header X-Couch-Id: Created/updated document's ID :>header X-Couch-Update-NewRev: Created/updated document's revision :code 200: No document was created or updated :code 201: Document was created or updated :code 500: Query server error **Function**: .. code-block:: javascript function(doc, req) { if (!doc){ return [null, {'code': 400, 'json': {'error': 'missed', 'reason': 'no document to update'}}] } else { doc.ingredients.push(req.body); return [doc, {'json': {'status': 'ok'}}]; } } **Request**: .. code-block:: http POST /recipes/_design/recipe/_update/ingredients HTTP/1.1 Accept: application/json Content-Length: 10 Content-Type: application/json Host: localhost:5984 something **Response**: .. code-block:: http HTTP/1.1 404 Object Not Found Cache-Control: must-revalidate Content-Length: 52 Content-Type: application/json Date: Wed, 21 Aug 2013 14:00:58 GMT Server: CouchDB (Erlang/OTP) { "error": "missed", "reason": "no document to update" } .. _api/ddoc/update/id: ``/db/_design/design-doc/_update/update-name/doc-id`` ===================================================== .. http:put:: /{db}/_design/{ddoc}/_update/{func}/{docid} :synopsis: Executes an update function against the specified document Executes :ref:`update function <updatefun>` on server side for the specified document. :param db: Database name :param ddoc: Design document name :param func: Update function name :param docid: Document ID :>header X-Couch-Id: Created/updated document's ID :>header X-Couch-Update-NewRev: Created/updated document's revision :code 200: No document was created or updated :code 201: Document was created or updated :code 500: Query server error **Function**: .. code-block:: javascript function(doc, req) { if (!doc){ return [null, {'code': 400, 'json': {'error': 'missed', 'reason': 'no document to update'}}] } else { doc.ingredients.push(req.body); return [doc, {'json': {'status': 'ok'}}]; } } **Request**: .. code-block:: http POST /recipes/_design/recipe/_update/ingredients/SpaghettiWithMeatballs HTTP/1.1 Accept: application/json Content-Length: 5 Content-Type: application/json Host: localhost:5984 love **Response**: .. code-block:: http HTTP/1.1 201 Created Cache-Control: must-revalidate Content-Length: 16 Content-Type: application/json Date: Wed, 21 Aug 2013 14:11:34 GMT Server: CouchDB (Erlang/OTP) X-Couch-Id: SpaghettiWithMeatballs X-Couch-Update-NewRev: 12-a5e099df5720988dae90c8b664496baf { "status": "ok" } �������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������apache-couchdb-1.6.0/share/doc/src/api/ddoc/views.rst�����������������������������������������������0000644�0001750�0000144�00000056075�12332105522�022342� 0����������������������������������������������������������������������������������������������������ustar�00djc�����������������������������users���������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������.. Licensed under the Apache License, Version 2.0 (the "License"); you may not .. use this file except in compliance with the License. You may obtain a copy of .. the License at .. .. http://www.apache.org/licenses/LICENSE-2.0 .. .. Unless required by applicable law or agreed to in writing, software .. distributed under the License is distributed on an "AS IS" BASIS, WITHOUT .. WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the .. License for the specific language governing permissions and limitations under .. the License. .. _api/ddoc/view: ``/db/_design/design-doc/_view/view-name`` ========================================== .. http:get:: /{db}/_design/{ddoc}/_view/{view} :synopsis: Returns results for the specified stored view Executes the specified view function from the specified design document. :param db: Database name :param ddoc: Design document name :param view: View function name :<header Accept: - :mimetype:`application/json` - :mimetype:`text/plain` :query boolean conflicts: Includes `conflicts` information in response. Ignored if `include_docs` isn't ``true``. Default is ``false`` :query boolean descending: Return the documents in descending by key order. Default is ``false`` :query string endkey: Stop returning records when the specified key is reached. *Optional* :query string end_key: Alias for `endkey` param :query string endkey_docid: Stop returning records when the specified document ID is reached. *Optional* :query string end_key_doc_id: Alias for `endkey_docid` param :query boolean group: Group the results using the reduce function to a group or single row. Default is ``false`` :query number group_level: Specify the group level to be used. *Optional* :query boolean include_docs: Include the associated document with each row. Default is ``false``. :query boolean attachments: Include the Base64-encoded content of :ref:`attachments <api/doc/attachments>` in the documents that are included if `include_docs` is ``true``. Ignored if `include_docs` isn't ``true``. Default is ``false``. :query boolean att_encoding_info: Include encoding information in attachment stubs if `include_docs` is ``true`` and the particular attachment is compressed. Ignored if `include_docs` isn't ``true``. Default is ``false``. :query boolean inclusive_end: Specifies whether the specified end key should be included in the result. Default is ``true`` :query string key: Return only documents that match the specified key. *Optional* :query number limit: Limit the number of the returned documents to the specified number. *Optional* :query boolean reduce: Use the reduction function. Default is ``true`` :query number skip: Skip this number of records before starting to return the results. Default is ``0`` :query string stale: Allow the results from a stale view to be used. Supported values: ``ok`` and ``update_after``. *Optional* :query string startkey: Return records starting with the specified key. *Optional* :query string start_key: Alias for `startkey` param :query string startkey_docid: Return records starting with the specified document ID. *Optional* :query string start_key_doc_id: Alias for `startkey_docid` param :query boolean update_seq: Response includes an ``update_seq`` value indicating which sequence id of the database the view reflects. Default is ``false`` :>header Content-Type: - :mimetype:`application/json` - :mimetype:`text/plain; charset=utf-8` :>header ETag: Response signature :>header Transfer-Encoding: ``chunked`` :>json number offset: Offset where the document list started :>json array rows: Array of view row objects. By default the information returned contains only the document ID and revision :>json number total_rows: Number of documents in the database/view :>json number update_seq: Current update sequence for the database :code 200: Request completed successfully :code 400: Invalid request :code 401: Read permission required :code 404: Specified database, design document or view is missed :code 500: View function execution error **Request**: .. code-block:: http GET /recipes/_design/ingredients/_view/by_name HTTP/1.1 Accept: application/json Host: localhost:5984 **Response**: .. code-block:: http HTTP/1.1 200 OK Cache-Control: must-revalidate Content-Type: application/json Date: Wed, 21 Aug 2013 09:12:06 GMT ETag: "2FOLSBSW4O6WB798XU4AQYA9B" Server: CouchDB (Erlang/OTP) Transfer-Encoding: chunked { "offset": 0, "rows": [ { "id": "SpaghettiWithMeatballs", "key": "meatballs", "value": 1 }, { "id": "SpaghettiWithMeatballs", "key": "spaghetti", "value": 1 }, { "id": "SpaghettiWithMeatballs", "key": "tomato sauce", "value": 1 } ], "total_rows": 3 } .. versionchanged:: 1.6.0 added ``attachments`` and ``att_encoding_info`` parameters .. warning:: Using the ``attachments`` parameter to include attachments in view results is not recommended for large attachment sizes. Also note that the Base64-encoding that is used leads to a 33% overhead (i.e. one third) in transfer size for attachments. .. http:post:: /{db}/_design/{ddoc}/_view/{view} :synopsis: Returns certain rows for the specified stored view Executes the specified view function from the specified design document. Unlike :get:`/{db}/_design/{ddoc}/_view/{view}` for accessing views, the :method:`POST` method supports the specification of explicit keys to be retrieved from the view results. The remainder of the :method:`POST` view functionality is identical to the :get:`/{db}/_design/{ddoc}/_view/{view}` API. **Request**: .. code-block:: http POST /recipes/_design/ingredients/_view/by_name HTTP/1.1 Accept: application/json Content-Length: 37 Host: localhost:5984 { "keys": [ "meatballs", "spaghetti" ] } **Response**: .. code-block:: http HTTP/1.1 200 OK Cache-Control: must-revalidate Content-Type: application/json Date: Wed, 21 Aug 2013 09:14:13 GMT ETag: "6R5NM8E872JIJF796VF7WI3FZ" Server: CouchDB (Erlang/OTP) Transfer-Encoding: chunked { "offset": 0, "rows": [ { "id": "SpaghettiWithMeatballs", "key": "meatballs", "value": 1 }, { "id": "SpaghettiWithMeatballs", "key": "spaghetti", "value": 1 } ], "total_rows": 3 } .. _api/ddoc/view/options: View Options ------------ There are two view indexing options that can be defined in a design document as boolean properties of an ``options`` object. Unlike the others querying options, these aren't URL parameters because they take effect when the view index is generated, not when it's accessed: - **local_seq** (*boolean*): Makes documents' local sequence numbers available to map functions (as a ``_local_seq`` document property) - **include_design** (*boolean*): Allows map functions to be called on design documents as well as regular documents In additional to these options, you may specify :ref:`any other <api/ddoc/view>` with their default value. E.g. having option ``"include_docs": true`` will automatically includes document body for view results response. You still may override such by explicitly defining same query parameter name with other value. .. _api/ddoc/view/indexing: Querying Views and Indexes -------------------------- The definition of a view within a design document also creates an index based on the key information defined within each view. The production and use of the index significantly increases the speed of access and searching or selecting documents from the view. However, the index is not updated when new documents are added or modified in the database. Instead, the index is generated or updated, either when the view is first accessed, or when the view is accessed after a document has been updated. In each case, the index is updated before the view query is executed against the database. View indexes are updated incrementally in the following situations: - A new document has been added to the database. - A document has been deleted from the database. - A document in the database has been updated. View indexes are rebuilt entirely when the view definition changes. To achieve this, a 'fingerprint' of the view definition is created when the design document is updated. If the fingerprint changes, then the view indexes are entirely rebuilt. This ensures that changes to the view definitions are reflected in the view indexes. .. note:: View index rebuilds occur when one view from the same the view group (i.e. all the views defined within a single a design document) has been determined as needing a rebuild. For example, if if you have a design document with different views, and you update the database, all three view indexes within the design document will be updated. Because the view is updated when it has been queried, it can result in a delay in returned information when the view is accessed, especially if there are a large number of documents in the database and the view index does not exist. There are a number of ways to mitigate, but not completely eliminate, these issues. These include: - Create the view definition (and associated design documents) on your database before allowing insertion or updates to the documents. If this is allowed while the view is being accessed, the index can be updated incrementally. - Manually force a view request from the database. You can do this either before users are allowed to use the view, or you can access the view manually after documents are added or updated. - Use the :ref:`changes feed <api/db/changes>` to monitor for changes to the database and then access the view to force the corresponding view index to be updated. - Use a monitor with the :ref:`update notification <update-notifications>` section of the CouchDB configuration file to monitor for changes to your database, and trigger a view query to force the view to be updated. None of these can completely eliminate the need for the indexes to be rebuilt or updated when the view is accessed, but they may lessen the effects on end-users of the index update affecting the user experience. Another alternative is to allow users to access a 'stale' version of the view index, rather than forcing the index to be updated and displaying the updated results. Using a stale view may not return the latest information, but will return the results of the view query using an existing version of the index. For example, to access the existing stale view ``by_recipe`` in the ``recipes`` design document: .. code-block:: text http://localhost:5984/recipes/_design/recipes/_view/by_recipe?stale=ok Accessing a stale view: - Does not trigger a rebuild of the view indexes, even if there have been changes since the last access. - Returns the current version of the view index, if a current version exists. - Returns an empty result set if the given view index does exist. As an alternative, you use the ``update_after`` value to the ``stale`` parameter. This causes the view to be returned as a stale view, but for the update process to be triggered after the view information has been returned to the client. In addition to using stale views, you can also make use of the ``update_seq`` query argument. Using this query argument generates the view information including the update sequence of the database from which the view was generated. The returned value can be compared this to the current update sequence exposed in the database information (returned by :get:`/{db}`). .. _api/ddoc/view/sorting: Sorting Returned Rows --------------------- Each element within the returned array is sorted using native UTF-8 sorting according to the contents of the key portion of the emitted content. The basic order of output is as follows: - ``null`` - ``false`` - ``true`` - Numbers - Text (case sensitive, lowercase first) - Arrays (according to the values of each element, in order) - Objects (according to the values of keys, in key order) **Request**: .. code-block:: http GET /db/_design/test/_view/sorting HTTP/1.1 Accept: application/json Host: localhost:5984 **Response**: .. code-block:: http HTTP/1.1 200 OK Cache-Control: must-revalidate Content-Type: application/json Date: Wed, 21 Aug 2013 10:09:25 GMT ETag: "8LA1LZPQ37B6R9U8BK9BGQH27" Server: CouchDB (Erlang/OTP) Transfer-Encoding: chunked { "offset": 0, "rows": [ { "id": "dummy-doc", "key": null, "value": null }, { "id": "dummy-doc", "key": false, "value": null }, { "id": "dummy-doc", "key": true, "value": null }, { "id": "dummy-doc", "key": 0, "value": null }, { "id": "dummy-doc", "key": 1, "value": null }, { "id": "dummy-doc", "key": 10, "value": null }, { "id": "dummy-doc", "key": 42, "value": null }, { "id": "dummy-doc", "key": "10", "value": null }, { "id": "dummy-doc", "key": "hello", "value": null }, { "id": "dummy-doc", "key": "Hello", "value": null }, { "id": "dummy-doc", "key": "\u043f\u0440\u0438\u0432\u0435\u0442", "value": null }, { "id": "dummy-doc", "key": [], "value": null }, { "id": "dummy-doc", "key": [ 1, 2, 3 ], "value": null }, { "id": "dummy-doc", "key": [ 2, 3 ], "value": null }, { "id": "dummy-doc", "key": [ 3 ], "value": null }, { "id": "dummy-doc", "key": {}, "value": null }, { "id": "dummy-doc", "key": { "foo": "bar" }, "value": null } ], "total_rows": 17 } You can reverse the order of the returned view information by using the ``descending`` query value set to true: **Request**: .. code-block:: http GET /db/_design/test/_view/sorting?descending=true HTTP/1.1 Accept: application/json Host: localhost:5984 **Response**: .. code-block:: http HTTP/1.1 200 OK Cache-Control: must-revalidate Content-Type: application/json Date: Wed, 21 Aug 2013 10:09:25 GMT ETag: "Z4N468R15JBT98OM0AMNSR8U" Server: CouchDB (Erlang/OTP) Transfer-Encoding: chunked { "offset": 0, "rows": [ { "id": "dummy-doc", "key": { "foo": "bar" }, "value": null }, { "id": "dummy-doc", "key": {}, "value": null }, { "id": "dummy-doc", "key": [ 3 ], "value": null }, { "id": "dummy-doc", "key": [ 2, 3 ], "value": null }, { "id": "dummy-doc", "key": [ 1, 2, 3 ], "value": null }, { "id": "dummy-doc", "key": [], "value": null }, { "id": "dummy-doc", "key": "\u043f\u0440\u0438\u0432\u0435\u0442", "value": null }, { "id": "dummy-doc", "key": "Hello", "value": null }, { "id": "dummy-doc", "key": "hello", "value": null }, { "id": "dummy-doc", "key": "10", "value": null }, { "id": "dummy-doc", "key": 42, "value": null }, { "id": "dummy-doc", "key": 10, "value": null }, { "id": "dummy-doc", "key": 1, "value": null }, { "id": "dummy-doc", "key": 0, "value": null }, { "id": "dummy-doc", "key": true, "value": null }, { "id": "dummy-doc", "key": false, "value": null }, { "id": "dummy-doc", "key": null, "value": null } ], "total_rows": 17 } Sorting order and startkey/endkey ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ The sorting direction is applied before the filtering applied using the ``startkey`` and ``endkey`` query arguments. For example the following query: .. code-block:: http GET http://couchdb:5984/recipes/_design/recipes/_view/by_ingredient?startkey=%22carrots%22&endkey=%22egg%22 Accept: application/json will operate correctly when listing all the matching entries between ``carrots`` and ``egg``. If the order of output is reversed with the ``descending`` query argument, the view request will return no entries: .. code-block:: http GET /recipes/_design/recipes/_view/by_ingredient?descending=true&startkey=%22carrots%22&endkey=%22egg%22 HTTP/1.1 Accept: application/json Host: localhost:5984 { "total_rows" : 26453, "rows" : [], "offset" : 21882 } The results will be empty because the entries in the view are reversed before the key filter is applied, and therefore the ``endkey`` of ā€œeggā€ will be seen before the ``startkey`` of ā€œcarrotsā€, resulting in an empty list. Instead, you should reverse the values supplied to the ``startkey`` and ``endkey`` parameters to match the descending sorting applied to the keys. Changing the previous example to: .. code-block:: http GET /recipes/_design/recipes/_view/by_ingredient?descending=true&startkey=%22egg%22&endkey=%22carrots%22 HTTP/1.1 Accept: application/json Host: localhost:5984 .. _api/ddoc/view/sorting/raw: Raw collation ^^^^^^^^^^^^^ By default CouchDB using `ICU`_ driver for sorting view results. It's possible use binary collation instead for faster view builds where Unicode collation is not important. To use raw collation add ``"collation": "raw"`` key-value pair to the design documents ``options`` object at the root level. After that, views will be regenerated and new order applied. .. seealso:: :ref:`views/collation` .. _ICU: http://site.icu-project.org/ .. _api/ddoc/view/limiting: Using Limits and Skipping Rows ------------------------------ By default requestion views result returns all records for it. That's ok when they are small, but this may lead to problems when there are billions of them since the clients might have to read them all and consume all available memory. But it's possible to reduce output result rows by specifying ``limit`` query parameter. For example, retrieving the list of recipes using the ``by_title`` view and limited to 5 returns only 5 records, while there are total 2667 records in view: **Request**: .. code-block:: http GET /recipes/_design/recipes/_view/by_title?limit=5 HTTP/1.1 Accept: application/json Host: localhost:5984 **Response**: .. code-block:: http HTTP/1.1 200 OK Cache-Control: must-revalidate Content-Type: application/json Date: Wed, 21 Aug 2013 09:14:13 GMT ETag: "9Q6Q2GZKPH8D5F8L7PB6DBSS9" Server: CouchDB (Erlang/OTP) Transfer-Encoding: chunked { "offset" : 0, "rows" : [ { "id" : "3-tiersalmonspinachandavocadoterrine", "key" : "3-tier salmon, spinach and avocado terrine", "value" : [ null, "3-tier salmon, spinach and avocado terrine" ] }, { "id" : "Aberffrawcake", "key" : "Aberffraw cake", "value" : [ null, "Aberffraw cake" ] }, { "id" : "Adukiandorangecasserole-microwave", "key" : "Aduki and orange casserole - microwave", "value" : [ null, "Aduki and orange casserole - microwave" ] }, { "id" : "Aioli-garlicmayonnaise", "key" : "Aioli - garlic mayonnaise", "value" : [ null, "Aioli - garlic mayonnaise" ] }, { "id" : "Alabamapeanutchicken", "key" : "Alabama peanut chicken", "value" : [ null, "Alabama peanut chicken" ] } ], "total_rows" : 2667 } To omit some records you may use ``skip`` query parameter: **Request**: .. code-block:: http GET /recipes/_design/recipes/_view/by_title?limit=3&skip=2 HTTP/1.1 Accept: application/json Host: localhost:5984 **Response**: .. code-block:: http HTTP/1.1 200 OK Cache-Control: must-revalidate Content-Type: application/json Date: Wed, 21 Aug 2013 09:14:13 GMT ETag: "H3G7YZSNIVRRHO5FXPE16NJHN" Server: CouchDB (Erlang/OTP) Transfer-Encoding: chunked { "offset" : 2, "rows" : [ { "id" : "Adukiandorangecasserole-microwave", "key" : "Aduki and orange casserole - microwave", "value" : [ null, "Aduki and orange casserole - microwave" ] }, { "id" : "Aioli-garlicmayonnaise", "key" : "Aioli - garlic mayonnaise", "value" : [ null, "Aioli - garlic mayonnaise" ] }, { "id" : "Alabamapeanutchicken", "key" : "Alabama peanut chicken", "value" : [ null, "Alabama peanut chicken" ] } ], "total_rows" : 2667 } .. warning:: Using ``limit`` and ``skip`` parameters is not recommended for results pagination. Read :ref:`pagination recipe <views/pagination>` why it's so and how to make it better. �������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������apache-couchdb-1.6.0/share/doc/src/api/ddoc/index.rst�����������������������������������������������0000644�0001750�0000144�00000002420�12332105522�022275� 0����������������������������������������������������������������������������������������������������ustar�00djc�����������������������������users���������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������.. Licensed under the Apache License, Version 2.0 (the "License"); you may not .. use this file except in compliance with the License. You may obtain a copy of .. the License at .. .. http://www.apache.org/licenses/LICENSE-2.0 .. .. Unless required by applicable law or agreed to in writing, software .. distributed under the License is distributed on an "AS IS" BASIS, WITHOUT .. WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the .. License for the specific language governing permissions and limitations under .. the License. .. _api/design-docs: ================ Design Documents ================ In CouchDB, design documents provide the main interface for building a CouchDB application. The design document defines the views used to extract information from CouchDB through one or more views. Design documents are created within your CouchDB instance in the same way as you create database documents, but the content and definition of the documents is different. Design Documents are named using an ID defined with the design document URL path, and this URL can then be used to access the database contents. Views and lists operate together to provide automated (and formatted) output from your database. .. toctree:: common views render rewrites ������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������apache-couchdb-1.6.0/share/doc/src/api/ddoc/common.rst����������������������������������������������0000644�0001750�0000144�00000016201�12332105522�022460� 0����������������������������������������������������������������������������������������������������ustar�00djc�����������������������������users���������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������.. Licensed under the Apache License, Version 2.0 (the "License"); you may not .. use this file except in compliance with the License. You may obtain a copy of .. the License at .. .. http://www.apache.org/licenses/LICENSE-2.0 .. .. Unless required by applicable law or agreed to in writing, software .. distributed under the License is distributed on an "AS IS" BASIS, WITHOUT .. WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the .. License for the specific language governing permissions and limitations under .. the License. .. _api/ddoc: ``/db/_design/design-doc`` ========================== .. http:head:: /{db}/_design/{ddoc} :synopsis: Returns bare information in the HTTP Headers for the design document Returns the HTTP Headers containing a minimal amount of information about the specified design document. .. seealso:: :head:`/{db}/{docid}` .. http:get:: /{db}/_design/{ddoc} :synopsis: Returns the design document Returns the contents of the design document specified with the name of the design document and from the specified database from the URL. Unless you request a specific revision, the latest revision of the document will always be returned. .. seealso:: :get:`/{db}/{docid}` .. http:put:: /{db}/_design/{ddoc} :synopsis: Creates a new design document or new version of an existing one The :method:`PUT` method creates a new named design document, or creates a new revision of the existing design document. The design documents have some agreement upon their fields and structure. Currently it is the following: * **language** (*string*): Defines :ref:`Query Server <query-server>` :config:section:`key <query_servers>` to process design document functions * **options** (*object*): View's default options * **filters** (*object*): :ref:`Filter functions <filterfun>` definition * **lists** (*object*): :ref:`List functions <listfun>` definition * **rewrites** (*array*): Rewrite rules definition * **shows** (*object*): :ref:`Show functions <showfun>` definition * **updates** (*object*): :ref:`Update functions <updatefun>` definition * **validate_doc_update** (*string*): :ref:`Validate document update <vdufun>` function source * **views** (*object*): :ref:`View functions <viewfun>` definition. Note, that for ``filters``, ``lists``, ``shows`` and ``updates`` fields objects are mapping of function name to string function source code. For ``views`` mapping is the same except that values are objects with ``map`` and ``reduce`` (optional) keys which also contains functions source code. .. seealso:: :put:`/{db}/{docid}` .. http:delete:: /{db}/_design/{ddoc} :synopsis: Deletes the design document Deletes the specified document from the database. You must supply the current (latest) revision, either by using the ``rev`` parameter to specify the revision. .. seealso:: :delete:`/{db}/{docid}` .. http:copy:: /{db}/_design/{ddoc} :synopsis: Copies the design document The :method:`COPY` (which is non-standard HTTP) copies an existing design document to a new or existing one. .. note:: Copying a design document does automatically reconstruct the view indexes. These will be recreated, as with other views, the first time the new view is accessed. .. seealso:: :copy:`/{db}/{docid}` .. _api/ddoc/attachment: ``/db/_design/design-doc/attachment`` ===================================== .. http:head:: /{db}/_design/{ddoc}/{attname} :synopsis: Returns bare information in the HTTP Headers for the attachment Returns the HTTP headers containing a minimal amount of information about the specified attachment. .. seealso:: :head:`/{db}/{docid}/{attname}` .. http:get:: /{db}/_design/{ddoc}/{attname} :synopsis: Gets the attachment of a design document Returns the file attachment associated with the design document. The raw data of the associated attachment is returned (just as if you were accessing a static file. .. seealso:: :get:`/{db}/{docid}/{attname}` .. http:put:: /{db}/_design/{ddoc}/{attname} :synopsis: Adds an attachment of a design document Uploads the supplied content as an attachment to the specified design document. The attachment name provided must be a URL encoded string. .. seealso:: :put:`/{db}/{docid}/{attname}` .. http:delete:: /{db}/_design/{ddoc}/{attname} :synopsis: Deletes an attachment of a design document Deletes the attachment of the specified design document. .. seealso:: :delete:`/{db}/{docid}/{attname}` .. _api/ddoc/info: ``/db/_design/design-doc/_info`` ================================ .. http:get:: /{db}/_design/{ddoc}/_info :synopsis: Returns view index information for the specified design document Obtains information about the specified design document, including the index, index size and current status of the design document and associated index information. :param db: Database name :param ddoc: Design document name :<header Accept: - :mimetype:`application/json` - :mimetype:`text/plain` :>header Content-Type: - :mimetype:`application/json` - :mimetype:`text/plain; charset=utf-8` :>json string name: Design document name :>json object view_index: :ref:`api/ddoc/view_index_info` :code 200: Request completed successfully **Request**: .. code-block:: http GET /recipes/_design/recipe/_info HTTP/1.1 Accept: application/json Host: localhost:5984 **Response**: .. code-block:: http HTTP/1.1 200 OK Cache-Control: must-revalidate Content-Length: 263 Content-Type: application/json Date: Sat, 17 Aug 2013 12:54:17 GMT Server: CouchDB (Erlang/OTP) { "name": "recipe", "view_index": { "compact_running": false, "data_size": 926691, "disk_size": 1982704, "language": "python", "purge_seq": 0, "signature": "a59a1bb13fdf8a8a584bc477919c97ac", "update_seq": 12397, "updater_running": false, "waiting_clients": 0, "waiting_commit": false } } .. _api/ddoc/view_index_info: View Index Information ---------------------- The response from :get:`/{db}/_design/{ddoc}/_info` contains ``view_index`` (*object*) field with the next structure: * **compact_running** (*boolean*): Indicates whether a compaction routine is currently running on the view * **data_size** (*number*): Actual size in bytes of the view * **disk_size** (*number*): Size in bytes of the view as stored on disk * **language** (*string*): Language for the defined views * **purge_seq** (*number*): The purge sequence that has been processed * **signature** (*string*): MD5 signature of the views for the design document * **update_seq** (*number*): The update sequence of the corresponding database that has been indexed * **updater_running** (*boolean*): Indicates if the view is currently being updated * **waiting_clients** (*number*): Number of clients waiting on views from this design document * **waiting_commit** (*boolean*): Indicates if there are outstanding commits to the underlying database that need to processed �����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������apache-couchdb-1.6.0/share/doc/src/api/ddoc/rewrites.rst��������������������������������������������0000644�0001750�0000144�00000010655�12332105522�023043� 0����������������������������������������������������������������������������������������������������ustar�00djc�����������������������������users���������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������.. Licensed under the Apache License, Version 2.0 (the "License"); you may not .. use this file except in compliance with the License. You may obtain a copy of .. the License at .. .. http://www.apache.org/licenses/LICENSE-2.0 .. .. Unless required by applicable law or agreed to in writing, software .. distributed under the License is distributed on an "AS IS" BASIS, WITHOUT .. WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the .. License for the specific language governing permissions and limitations under .. the License. .. _api/ddoc/rewrite: ``/db/_design/design-doc/_rewrite/path`` ======================================== .. http:any:: /{db}/_design/{ddoc}/_rewrite/{path} :synopsis: Rewrites HTTP request for the specified path by using stored routing rules Rewrites the specified path by rules defined in the specified design document. The rewrite rules are defined in *array* field of the design document called ``rewrites``. Each rule is an *object* with next structure: - **from** (*string*): The path rule used to bind current uri to the rule. It use pattern matching for that - **to** (*string*): Rule to rewrite an url. It can contain variables depending on binding variables discovered during pattern matching and query args (url args and from the query member) - **method** (*string*): HTTP request method to bind the request method to the rule. Default is ``"*"`` - **query** (*object*): Query args you want to define they can contain dynamic variable by binding the key The ``to``and ``from`` paths may contains string patterns with leading ``:`` or ``*`` characters. For example: ``/somepath/:var/*`` - This path is converted in Erlang list by splitting ``/`` - Each ``var`` are converted in atom - ``""`` are converted to ``''`` atom - The pattern matching is done by splitting ``/`` in request url in a list of token - A string pattern will match equal token - The star atom (``'*'`` in single quotes) will match any number of tokens, but may only be present as the last `pathterm` in a `pathspec` - If all tokens are matched and all `pathterms` are used, then the `pathspec` matches The pattern matching is done by first matching the HTTP request method to a rule. ``method`` is equal to ``"*"`` by default, and will match any HTTP method. It will then try to match the path to one rule. If no rule matches, then a :statuscode:`404` response returned. Once a rule is found we rewrite the request url using the ``to`` and ``query`` fields. The identified token are matched to the rule and will replace var. If ``'*'`` is found in the rule it will contain the remaining part if it exists. Examples: +--------------------------------------+----------+------------------+-------+ | Rule | Url | Rewrite to | Tokens| +======================================+==========+==================+=======+ | {"from": "/a", "to": "/some"} | /a | /some | | +--------------------------------------+----------+------------------+-------+ | {"from": "/a/\*", "to": "/some/\*} | /a/b/c | /some/b/c | | +--------------------------------------+----------+------------------+-------+ | {"from": "/a/b", "to": "/some"} | /a/b?k=v | /some?k=v | k=v | +--------------------------------------+----------+------------------+-------+ | {"from": "/a/b", "to": "/some/:var"} | /a/b | /some/b?var=b | var=b | +--------------------------------------+----------+------------------+-------+ | {"from": "/a/:foo/", | /a/b/c | /some/b/c?foo=b | foo=b | | "to": "/some/:foo/"} | | | | +--------------------------------------+----------+------------------+-------+ | {"from": "/a/:foo", "to": "/some", | /a/b | /some/?k=b&foo=b | foo=b | | "query": { "k": ":foo" }} | | | | +--------------------------------------+----------+------------------+-------+ | {"from": "/a", "to": "/some/:foo"} | /a?foo=b | /some/?b&foo=b | foo=b | +--------------------------------------+----------+------------------+-------+ Request method, header, query parameters, request payload and response body are depended on endpoint to which url will be rewritten. :param db: Database name :param ddoc: Design document name :param path: URL path to rewrite �����������������������������������������������������������������������������������apache-couchdb-1.6.0/share/doc/src/api/database/����������������������������������������������������0000755�0001750�0000144�00000000000�12332106072�021272� 5����������������������������������������������������������������������������������������������������ustar�00djc�����������������������������users���������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������apache-couchdb-1.6.0/share/doc/src/api/database/index.rst�������������������������������������������0000644�0001750�0000144�00000002350�12332105522�023132� 0����������������������������������������������������������������������������������������������������ustar�00djc�����������������������������users���������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������.. Licensed under the Apache License, Version 2.0 (the "License"); you may not .. use this file except in compliance with the License. You may obtain a copy of .. the License at .. .. http://www.apache.org/licenses/LICENSE-2.0 .. .. Unless required by applicable law or agreed to in writing, software .. distributed under the License is distributed on an "AS IS" BASIS, WITHOUT .. WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the .. License for the specific language governing permissions and limitations under .. the License. .. _api/database: ========= Databases ========= The Database endpoint provides an interface to an entire database with in CouchDB. These are database-level, rather than document-level requests. For all these requests, the database name within the URL path should be the database name that you wish to perform the operation on. For example, to obtain the meta information for the database ``recipes``, you would use the HTTP request: .. code-block:: http GET /recipes For clarity, the form below is used in the URL paths: .. code-block:: http GET /db Where ``db`` is the name of any database. .. toctree:: common bulk-api changes compact security temp-views misc ����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������apache-couchdb-1.6.0/share/doc/src/api/database/temp-views.rst��������������������������������������0000644�0001750�0000144�00000004410�12332105522�024122� 0����������������������������������������������������������������������������������������������������ustar�00djc�����������������������������users���������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������.. Licensed under the Apache License, Version 2.0 (the "License"); you may not .. use this file except in compliance with the License. You may obtain a copy of .. the License at .. .. http://www.apache.org/licenses/LICENSE-2.0 .. .. Unless required by applicable law or agreed to in writing, software .. distributed under the License is distributed on an "AS IS" BASIS, WITHOUT .. WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the .. License for the specific language governing permissions and limitations under .. the License. .. _api/db/temp_view: ``/db/_temp_view`` ================== .. http:post:: /{db}/_temp_view :synopsis: Executes a given view function for all documents and returns the result Creates (and executes) a temporary view based on the view function supplied in the JSON request. The arguments also available to standard view requests also apply to temporary views, but the execution of the view may take some time as it relies on being executed at the time of the request. This means that for every temporary view you create, the entire database will be read one doc at a time and passed through the view function. This should not be used on production CouchDB instances, and is purely a convenience function for quick development testing. You should use a defined view if you want to achieve the best performance. See :ref:`api/ddoc/view` for more info. **Request**: .. code-block:: http POST /db/_temp_view?group=true HTTP/1.1 Accept: application/json Content-Length: 92 Content-Type: application/json Host: localhost:5984 { "map": "function(doc) { if (doc.value) { emit(doc.value, null); } }", "reduce": "_count" } **Response**: .. code-block:: http HTTP/1.1 200 OK Cache-Control: must-revalidate Content-Type: application/json Date: Tue, 13 Aug 2013 12:28:12 GMT ETag: "AU33B3N7S9K4SAZSFA048HVB4" Server: CouchDB (Erlang/OTP) Transfer-Encoding: chunked { "rows": [ { "key": -10, "value": 1 }, { "key": 10, "value": 2 }, { "key": 15, "value": 1 } ] } ��������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������apache-couchdb-1.6.0/share/doc/src/api/database/misc.rst��������������������������������������������0000644�0001750�0000144�00000025660�12332105522�022767� 0����������������������������������������������������������������������������������������������������ustar�00djc�����������������������������users���������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������.. Licensed under the Apache License, Version 2.0 (the "License"); you may not .. use this file except in compliance with the License. You may obtain a copy of .. the License at .. .. http://www.apache.org/licenses/LICENSE-2.0 .. .. Unless required by applicable law or agreed to in writing, software .. distributed under the License is distributed on an "AS IS" BASIS, WITHOUT .. WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the .. License for the specific language governing permissions and limitations under .. the License. .. _api/db/purge: ``/db/_purge`` ============== .. http:post:: /{db}/_purge :synopsis: Purges some historical documents entirely from database history A database purge permanently removes the references to deleted documents from the database. Normal deletion of a document within CouchDB does not remove the document from the database, instead, the document is marked as ``_deleted=true`` (and a new revision is created). This is to ensure that deleted documents can be replicated to other databases as having been deleted. This also means that you can check the status of a document and identify that the document has been deleted by its absence. .. warning:: Purging a document from a database should only be done as a last resort when sensitive information has been introduced inadvertently into a database. In clustered or replicated environments it is very difficult to guarantee that a particular purged document has been removed from all replicas. Do not rely on this API as a way of doing secure deletion. The purge operation removes the references to the deleted documents from the database. The purging of old documents is not replicated to other databases. If you are replicating between databases and have deleted a large number of documents you should run purge on each database. .. note:: Purging documents does not remove the space used by them on disk. To reclaim disk space, you should run a database compact (see :ref:`api/db/compact`), and compact views (see :ref:`api/db/compact/ddoc`). The format of the request must include the document ID and one or more revisions that must be purged. The response will contain the purge sequence number, and a list of the document IDs and revisions successfully purged. :param db: Database name :<header Accept: - :mimetype:`application/json` - :mimetype:`text/plain` :<header Content-Type: :mimetype:`application/json` :<json object: Mapping of document ID to list of revisions to purge :>header Content-Type: - :mimetype:`application/json` - :mimetype:`text/plain; charset=utf-8` :>json number purge_seq: Purge sequence number :>json object purged: Mapping of document ID to list of purged revisions :code 200: Request completed successfully :code 400: Invalid database name or JSON payload :code 415: Bad :header:`Content-Type` value **Request**: .. code-block:: http POST /db/_purge HTTP/1.1 Accept: application/json Content-Length: 76 Content-Type: application/json Host: localhost:5984 { "c6114c65e295552ab1019e2b046b10e": [ "3-b06fcd1c1c9e0ec7c480ee8aa467bf3b", "3-0e871ef78849b0c206091f1a7af6ec41" ] } **Response**: .. code-block:: http HTTP/1.1 200 OK Cache-Control: must-revalidate Content-Length: 103 Content-Type: application/json Date: Mon, 12 Aug 2013 10:53:24 GMT Server: CouchDB (Erlang/OTP) { "purge_seq":3, "purged":{ "c6114c65e295552ab1019e2b046b10e": [ "3-b06fcd1c1c9e0ec7c480ee8aa467bf3b" ] } } Updating Indexes ---------------- The number of purges on a database is tracked using a purge sequence. This is used by the view indexer to optimize the updating of views that contain the purged documents. When the indexer identifies that the purge sequence on a database has changed, it compares the purge sequence of the database with that stored in the view index. If the difference between the stored sequence and database is sequence is only 1, then the indexer uses a cached list of the most recently purged documents, and then removes these documents from the index individually. This prevents completely rebuilding the index from scratch. If the difference between the stored sequence number and current database sequence is greater than 1, then the view index is entirely rebuilt. This is an expensive operation as every document in the database must be examined. .. _api/db/missing_revs: ``/db/_missing_revs`` ===================== .. http:post:: /{db}/_missing_revs :synopsis: By given list of document revisions returns the document revisions that do not exist in the database With given a list of document revisions, returns the document revisions that do not exist in the database. :param db: Database name :<header Accept: - :mimetype:`application/json` - :mimetype:`text/plain` :<header Content-Type: :mimetype:`application/json` :<json object: Mapping of document ID to list of revisions to lookup :>header Content-Type: - :mimetype:`application/json` - :mimetype:`text/plain; charset=utf-8` :>json object missing_revs: Mapping of document ID to list of missed revisions :code 200: Request completed successfully :code 400: Invalid database name or JSON payload **Request**: .. code-block:: http POST /db/_missing_revs HTTP/1.1 Accept: application/json Content-Length: 76 Content-Type: application/json Host: localhost:5984 { "c6114c65e295552ab1019e2b046b10e": [ "3-b06fcd1c1c9e0ec7c480ee8aa467bf3b", "3-0e871ef78849b0c206091f1a7af6ec41" ] } **Response**: .. code-block:: http HTTP/1.1 200 OK Cache-Control: must-revalidate Content-Length: 64 Content-Type: application/json Date: Mon, 12 Aug 2013 10:53:24 GMT Server: CouchDB (Erlang/OTP) { "missed_revs":{ "c6114c65e295552ab1019e2b046b10e": [ "3-b06fcd1c1c9e0ec7c480ee8aa467bf3b" ] } } .. _api/db/revs_diff: ``/db/_revs_diff`` ================== .. http:post:: /{db}/_revs_diff :synopsis: By given list of document revisions returns differences between the given revisions and ones that are in the database Given a set of document/revision IDs, returns the subset of those that do not correspond to revisions stored in the database. Its primary use is by the replicator, as an important optimization: after receiving a set of new revision IDs from the source database, the replicator sends this set to the destination database's ``_revs_diff`` to find out which of them already exist there. It can then avoid fetching and sending already-known document bodies. Both the request and response bodies are JSON objects whose keys are document IDs; but the values are structured differently: - In the request, a value is an array of revision IDs for that document. - In the response, a value is an object with a ``missing``: key, whose value is a list of revision IDs for that document (the ones that are not stored in the database) and optionally a ``possible_ancestors`` key, whose value is an array of revision IDs that are known that might be ancestors of the missing revisions. :param db: Database name :<header Accept: - :mimetype:`application/json` - :mimetype:`text/plain` :<header Content-Type: :mimetype:`application/json` :<json object: Mapping of document ID to list of revisions to lookup :>header Content-Type: - :mimetype:`application/json` - :mimetype:`text/plain; charset=utf-8` :>json array missing: List of missed revisions for specified document :>json array possible_ancestors: List of revisions that *may be* ancestors for specified document and its current revision in requested database :code 200: Request completed successfully :code 400: Invalid database name or JSON payload **Request**: .. code-block:: http POST /db/_revs_diff HTTP/1.1 Accept: application/json Content-Length: 113 Content-Type: application/json Host: localhost:5984 { "190f721ca3411be7aa9477db5f948bbb": [ "3-bb72a7682290f94a985f7afac8b27137", "4-10265e5a26d807a3cfa459cf1a82ef2e", "5-067a00dff5e02add41819138abb3284d" ] } **Response**: .. code-block:: http HTTP/1.1 200 OK Cache-Control: must-revalidate Content-Length: 88 Content-Type: application/json Date: Mon, 12 Aug 2013 16:56:02 GMT Server: CouchDB (Erlang/OTP) { "190f721ca3411be7aa9477db5f948bbb": { "missing": [ "3-bb72a7682290f94a985f7afac8b27137", "5-067a00dff5e02add41819138abb3284d" ], "possible_ancestors": [ "4-10265e5a26d807a3cfa459cf1a82ef2e" ] } } .. _api/db/revs_limit: ``/db/_revs_limit`` =================== .. http:get:: /{db}/_revs_limit :synopsis: Returns the limit of historical revisions to store for a single document in the database Gets the current ``revs_limit`` (revision limit) setting. :param db: Database name :<header Accept: - :mimetype:`application/json` - :mimetype:`text/plain` :>header Content-Type: - :mimetype:`application/json` - :mimetype:`text/plain; charset=utf-8` :code 200: Request completed successfully **Request**: .. code-block:: http GET /db/_revs_limit HTTP/1.1 Accept: application/json Host: localhost:5984 **Response**: .. code-block:: http HTTP/1.1 200 OK Cache-Control: must-revalidate Content-Length: 5 Content-Type: application/json Date: Mon, 12 Aug 2013 17:27:30 GMT Server: CouchDB (Erlang/OTP) 1000 .. http:put:: /{db}/_revs_limit :synopsis: Sets the limit of historical revisions to store for a single document in the database Sets the maximum number of document revisions that will be tracked by CouchDB, even after compaction has occurred. You can set the revision limit on a database with a scalar integer of the limit that you want to set as the request body. :param db: Database name :<header Accept: - :mimetype:`application/json` - :mimetype:`text/plain` :<header Content-Type: :mimetype:`application/json` :>header Content-Type: - :mimetype:`application/json` - :mimetype:`text/plain; charset=utf-8` :>json boolean ok: Operation status :code 200: Request completed successfully :code 400: Invalid JSON data **Request**: .. code-block:: http PUT /db/_revs_limit HTTP/1.1 Accept: application/json Content-Length: 5 Content-Type: application/json Host: localhost:5984 1000 **Response**: .. code-block:: http HTTP/1.1 200 OK Cache-Control: must-revalidate Content-Length: 12 Content-Type: application/json Date: Mon, 12 Aug 2013 17:47:52 GMT Server: CouchDB (Erlang/OTP) { "ok": true } ��������������������������������������������������������������������������������apache-couchdb-1.6.0/share/doc/src/api/database/bulk-api.rst����������������������������������������0000644�0001750�0000144�00000052152�12332105522�023534� 0����������������������������������������������������������������������������������������������������ustar�00djc�����������������������������users���������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������.. Licensed under the Apache License, Version 2.0 (the "License"); you may not .. use this file except in compliance with the License. You may obtain a copy of .. the License at .. .. http://www.apache.org/licenses/LICENSE-2.0 .. .. Unless required by applicable law or agreed to in writing, software .. distributed under the License is distributed on an "AS IS" BASIS, WITHOUT .. WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the .. License for the specific language governing permissions and limitations under .. the License. .. _api/db/all_docs: ``/db/_all_docs`` ================= .. http:get:: /{db}/_all_docs :synopsis: Returns a built-in view of all documents in this database Returns a JSON structure of all of the documents in a given database. The information is returned as a JSON structure containing meta information about the return structure, including a list of all documents and basic contents, consisting the ID, revision and key. The key is the from the document's ``_id``. :param db: Database name :<header Accept: - :mimetype:`application/json` - :mimetype:`text/plain` :query boolean conflicts: Includes `conflicts` information in response. Ignored if `include_docs` isn't ``true``. Default is ``false``. :query boolean descending: Return the documents in descending by key order. Default is ``false``. :query string endkey: Stop returning records when the specified key is reached. *Optional*. :query string end_key: Alias for `endkey` param. :query string endkey_docid: Stop returning records when the specified document ID is reached. *Optional*. :query string end_key_doc_id: Alias for `endkey_docid` param. :query boolean include_docs: Include the full content of the documents in the return. Default is ``false``. :query boolean inclusive_end: Specifies whether the specified end key should be included in the result. Default is ``true``. :query string key: Return only documents that match the specified key. *Optional*. :query number limit: Limit the number of the returned documents to the specified number. *Optional*. :query number skip: Skip this number of records before starting to return the results. Default is ``0``. :query string stale: Allow the results from a stale view to be used, without triggering a rebuild of all views within the encompassing design doc. Supported values: ``ok`` and ``update_after``. *Optional*. :query string startkey: Return records starting with the specified key. *Optional*. :query string start_key: Alias for `startkey` param. :query string startkey_docid: Return records starting with the specified document ID. *Optional*. :query string start_key_doc_id: Alias for `startkey_docid` param. :query boolean update_seq: Response includes an ``update_seq`` value indicating which sequence id of the underlying database the view reflects. Default is ``false``. :>header Content-Type: - :mimetype:`application/json` - :mimetype:`text/plain; charset=utf-8` :>header ETag: Response signature :>json number offset: Offset where the document list started :>json array rows: Array of view row objects. By default the information returned contains only the document ID and revision. :>json number total_rows: Number of documents in the database/view. Note that this is not the number of rows returned in the actual query. :>json number update_seq: Current update sequence for the database :code 200: Request completed successfully **Request**: .. code-block:: http GET /db/_all_docs HTTP/1.1 Accept: application/json Host: localhost:5984 **Response**: .. code-block:: http HTTP/1.1 200 OK Cache-Control: must-revalidate Content-Type: application/json Date: Sat, 10 Aug 2013 16:22:56 GMT ETag: "1W2DJUZFZSZD9K78UFA3GZWB4" Server: CouchDB (Erlang/OTP) Transfer-Encoding: chunked { "offset": 0, "rows": [ { "id": "16e458537602f5ef2a710089dffd9453", "key": "16e458537602f5ef2a710089dffd9453", "value": { "rev": "1-967a00dff5e02add41819138abb3284d" } }, { "id": "a4c51cdfa2069f3e905c431114001aff", "key": "a4c51cdfa2069f3e905c431114001aff", "value": { "rev": "1-967a00dff5e02add41819138abb3284d" } }, { "id": "a4c51cdfa2069f3e905c4311140034aa", "key": "a4c51cdfa2069f3e905c4311140034aa", "value": { "rev": "5-6182c9c954200ab5e3c6bd5e76a1549f" } }, { "id": "a4c51cdfa2069f3e905c431114003597", "key": "a4c51cdfa2069f3e905c431114003597", "value": { "rev": "2-7051cbe5c8faecd085a3fa619e6e6337" } }, { "id": "f4ca7773ddea715afebc4b4b15d4f0b3", "key": "f4ca7773ddea715afebc4b4b15d4f0b3", "value": { "rev": "2-7051cbe5c8faecd085a3fa619e6e6337" } } ], "total_rows": 5 } .. http:post:: /{db}/_all_docs :synopsis: Returns certain rows from the built-in view of all documents The ``POST`` to ``_all_docs`` allows to specify multiple keys to be selected from the database. This enables you to request multiple documents in a single request, in place of multiple :get:`/{db}/{docid}` requests. The request body should contain a list of the keys to be returned as an array to a ``keys`` object. For example: .. code-block:: http POST /db/_all_docs HTTP/1.1 Accept: application/json Content-Length: 70 Content-Type: application/json Host: localhost:5984 { "keys" : [ "Zingylemontart", "Yogurtraita" ] } The returned JSON is the all documents structure, but with only the selected keys in the output: .. code-block:: javascript { "total_rows" : 2666, "rows" : [ { "value" : { "rev" : "1-a3544d296de19e6f5b932ea77d886942" }, "id" : "Zingylemontart", "key" : "Zingylemontart" }, { "value" : { "rev" : "1-91635098bfe7d40197a1b98d7ee085fc" }, "id" : "Yogurtraita", "key" : "Yogurtraita" } ], "offset" : 0 } .. _api/db/bulk_docs: ``/db/_bulk_docs`` ================== .. http:post:: /{db}/_bulk_docs :synopsis: Inserts or updates multiple documents in to the database in a single request The bulk document API allows you to create and update multiple documents at the same time within a single request. The basic operation is similar to creating or updating a single document, except that you batch the document structure and information. When creating new documents the document ID (``_id``) is optional. For updating existing documents, you must provide the document ID, revision information (``_rev``), and new document values. In case of batch deleting documents all fields as document ID, revision information and deletion status (``_deleted``) are required. :param db: Database name :<header Accept: - :mimetype:`application/json` - :mimetype:`text/plain` :<header Content-Type: :mimetype:`application/json` :<header X-Couch-Full-Commit: Overrides server's :config:option:`commit policy <couchdb/delayed_commits>`. Possible values are: ``false`` and ``true``. *Optional* :<json boolean all_or_nothing: Sets the database commit mode to use :ref:`all-or-nothing <api/db/bulk_docs/semantics>` semantics. Default is ``false``. *Optional* :<json array docs: List of documents objects :<json boolean new_edits: If ``false``, prevents the database from assigning them new revision IDs. Default is ``true``. *Optional* :>header Content-Type: - :mimetype:`application/json` - :mimetype:`text/plain; charset=utf-8` :>jsonarr string id: Document ID :>jsonarr string rev: New document revision token. Available if document have saved without errors. *Optional* :>jsonarr string error: Error type. *Optional* :>jsonarr string reason: Error reason. *Optional* :code 201: Document(s) have been created or updated :code 400: The request provided invalid JSON data :code 417: Occurs when ``all_or_nothing`` option set as ``true`` and at least one document was rejected by :ref:`validation function <vdufun>` :code 500: Malformed data provided, while it's still valid JSON **Request**: .. code-block:: http POST /db/_bulk_docs HTTP/1.1 Accept: application/json Content-Length: 109 Content-Type:application/json Host: localhost:5984 { "docs": [ { "_id": "FishStew" }, { "_id": "LambStew", "_rev": "2-0786321986194c92dd3b57dfbfc741ce", "_deleted": true } ] } **Response**: .. code-block:: http HTTP/1.1 201 Created Cache-Control: must-revalidate Content-Length: 144 Content-Type: application/json Date: Mon, 12 Aug 2013 00:15:05 GMT Server: CouchDB (Erlang/OTP) [ { "ok": true, "id": "FishStew", "rev":" 1-967a00dff5e02add41819138abb3284d" }, { "ok": true, "id": "LambStew", "rev": "3-f9c62b2169d0999103e9f41949090807" } ] Inserting Documents in Bulk --------------------------- Each time a document is stored or updated in CouchDB, the internal B-tree is updated. Bulk insertion provides efficiency gains in both storage space, and time, by consolidating many of the updates to intermediate B-tree nodes. It is not intended as a way to perform ``ACID``-like transactions in CouchDB, the only transaction boundary within CouchDB is a single update to a single database. The constraints are detailed in :ref:`api/db/bulk_docs/semantics`. To insert documents in bulk into a database you need to supply a JSON structure with the array of documents that you want to add to the database. You can either include a document ID, or allow the document ID to be automatically generated. For example, the following update inserts three new documents, two with the supplied document IDs, and one which will have a document ID generated: .. code-block:: http POST /source/_bulk_docs HTTP/1.1 Accept: application/json Content-Length: 323 Content-Type: application/json Host: localhost:5984 { "docs": [ { "_id": "FishStew", "servings": 4, "subtitle": "Delicious with freshly baked bread", "title": "FishStew" }, { "_id": "LambStew", "servings": 6, "subtitle": "Serve with a whole meal scone topping", "title": "LambStew" }, { "_id": "BeefStew", "servings": 8, "subtitle": "Hand-made dumplings make a great accompaniment", "title": "BeefStew" } ] } The return type from a bulk insertion will be :statuscode:`201`, with the content of the returned structure indicating specific success or otherwise messages on a per-document basis. The return structure from the example above contains a list of the documents created, here with the combination and their revision IDs: .. code-block:: http HTTP/1.1 201 Created Cache-Control: must-revalidate Content-Length: 215 Content-Type: application/json Date: Sat, 26 Oct 2013 00:10:39 GMT Server: CouchDB (Erlang OTP) [ { "id": "FishStew", "ok": true, "rev": "1-6a466d5dfda05e613ba97bd737829d67" }, { "id": "LambStew", "ok": true, "rev": "1-648f1b989d52b8e43f05aa877092cc7c" }, { "id": "BeefStew", "ok": true, "rev": "1-e4602845fc4c99674f50b1d5a804fdfa" } ] The content and structure of the returned JSON will depend on the transaction semantics being used for the bulk update; see :ref:`api/db/bulk_docs/semantics` for more information. Conflicts and validation errors when updating documents in bulk must be handled separately; see :ref:`api/db/bulk_docs/validation`. Updating Documents in Bulk -------------------------- The bulk document update procedure is similar to the insertion procedure, except that you must specify the document ID and current revision for every document in the bulk update JSON string. For example, you could send the following request: .. code-block:: http POST /recipes/_bulk_docs HTTP/1.1 Accept: application/json Content-Length: 464 Content-Type: application/json Host: localhost:5984 { "docs": [ { "_id": "FishStew", "_rev": "1-6a466d5dfda05e613ba97bd737829d67", "servings": 4, "subtitle": "Delicious with freshly baked bread", "title": "FishStew" }, { "_id": "LambStew", "_rev": "1-648f1b989d52b8e43f05aa877092cc7c", "servings": 6, "subtitle": "Serve with a whole meal scone topping", "title": "LambStew" }, { "_id": "BeefStew", "_rev": "1-e4602845fc4c99674f50b1d5a804fdfa", "servings": 8, "subtitle": "Hand-made dumplings make a great accompaniment", "title": "BeefStew" } ] } The return structure is the JSON of the updated documents, with the new revision and ID information: .. code-block:: http HTTP/1.1 201 Created Cache-Control: must-revalidate Content-Length: 215 Content-Type: application/json Date: Sat, 26 Oct 2013 00:10:39 GMT Server: CouchDB (Erlang OTP) [ { "id": "FishStew", "ok": true, "rev": "2-2bff94179917f1dec7cd7f0209066fb8" }, { "id": "LambStew", "ok": true, "rev": "2-6a7aae7ac481aa98a2042718d09843c4" }, { "id": "BeefStew", "ok": true, "rev": "2-9801936a42f06a16f16c30027980d96f" } ] You can optionally delete documents during a bulk update by adding the ``_deleted`` field with a value of ``true`` to each document ID/revision combination within the submitted JSON structure. The return type from a bulk insertion will be :statuscode:`201`, with the content of the returned structure indicating specific success or otherwise messages on a per-document basis. The content and structure of the returned JSON will depend on the transaction semantics being used for the bulk update; see :ref:`api/db/bulk_docs/semantics` for more information. Conflicts and validation errors when updating documents in bulk must be handled separately; see :ref:`api/db/bulk_docs/validation`. .. _api/db/bulk_docs/semantics: Bulk Documents Transaction Semantics ------------------------------------ CouchDB supports two different modes for updating (or inserting) documents using the bulk documentation system. Each mode affects both the state of the documents in the event of system failure, and the level of conflict checking performed on each document. The two modes are: - **non-atomic** The default mode is `non-atomic`, that is, CouchDB will only guarantee that some of the documents will be saved when you send the request. The response will contain the list of documents successfully inserted or updated during the process. In the event of a crash, some of the documents may have been successfully saved, and some will have been lost. In this mode, the response structure will indicate whether the document was updated by supplying the new ``_rev`` parameter indicating a new document revision was created. If the update failed, then you will get an ``error`` of type ``conflict``. For example: .. code-block:: javascript [ { "id" : "FishStew", "error" : "conflict", "reason" : "Document update conflict." }, { "id" : "LambStew", "error" : "conflict", "reason" : "Document update conflict." }, { "id" : "BeefStew", "error" : "conflict", "reason" : "Document update conflict." } ] In this case no new revision has been created and you will need to submit the document update, with the correct revision tag, to update the document. - **all-or-nothing** In `all-or-nothing` mode, either all documents are written to the database, or no documents are written to the database, in the event of a system failure during commit. In addition, the per-document conflict checking is not performed. Instead a new revision of the document is created, even if the new revision is in conflict with the current revision in the database. The returned structure contains the list of documents with new revisions: .. code-block:: http HTTP/1.1 201 Created Cache-Control: must-revalidate Content-Length: 215 Content-Type: application/json Date: Sat, 26 Oct 2013 00:13:33 GMT Server: CouchDB (Erlang OTP) [ { "id": "FishStew", "ok": true, "rev": "1-6a466d5dfda05e613ba97bd737829d67" }, { "id": "LambStew", "ok": true, "rev": "1-648f1b989d52b8e43f05aa877092cc7c" }, { "id": "BeefStew", "ok": true, "rev": "1-e4602845fc4c99674f50b1d5a804fdfa" } ] When updating documents using this mode the revision of a document included in views will be arbitrary. You can check the conflict status for a document by using the ``conflicts=true`` query argument when accessing the view. Conflicts should be handled individually to ensure the consistency of your database. To use this mode, you must include the ``all_or_nothing`` field (set to true) within the main body of the JSON of the request. The effects of different database operations on the different modes are summarized below: * **Transaction Mode**: ``Non-atomic`` * **Transaction**: ``Insert`` * **Cause**: Requested document ID already exists * **Resolution**: Resubmit with different document ID, or update the existing document * **Transaction**: ``Update`` * **Cause**: Revision missing or incorrect * **Resolution**: Resubmit with correct revision * **Transaction Mode**: ``All-or-nothing`` * **Transaction**: ``Insert`` / ``Update`` * **Cause**: Additional revision inserted * **Resolution**: Resolve conflicted revisions Replication of documents is independent of the type of insert or update. The documents and revisions created during a bulk insert or update are replicated in the same way as any other document. This can mean that if you make use of the `all-or-nothing` mode the exact list of documents, revisions (and their conflict state) may or may not be replicated to other databases correctly. .. _api/db/bulk_docs/validation: Bulk Document Validation and Conflict Errors -------------------------------------------- The JSON returned by the ``_bulk_docs`` operation consists of an array of JSON structures, one for each document in the original submission. The returned JSON structure should be examined to ensure that all of the documents submitted in the original request were successfully added to the database. When a document (or document revision) is not correctly committed to the database because of an error, you should check the ``error`` field to determine error type and course of action. Errors will be one of the following type: - **conflict** The document as submitted is in conflict. If you used the default bulk transaction mode then the new revision will not have been created and you will need to re-submit the document to the database. If you used ``all-or-nothing`` mode then you will need to manually resolve the conflicted revisions of the document. Conflict resolution of documents added using the bulk docs interface is identical to the resolution procedures used when resolving conflict errors during replication. - **forbidden** Entries with this error type indicate that the validation routine applied to the document during submission has returned an error. For example, if your :ref:`validation routine <vdufun>` includes the following: .. code-block:: javascript throw({forbidden: 'invalid recipe ingredient'}); The error response returned will be: .. code-block:: http HTTP/1.1 417 Expectation Failed Cache-Control: must-revalidate Content-Length: 120 Content-Type: application/json Date: Sat, 26 Oct 2013 00:05:17 GMT Server: CouchDB (Erlang OTP) { "error": "forbidden", "id": "LambStew", "reason": "invalid recipe ingredient", "rev": "1-34c318924a8f327223eed702ddfdc66d" } ����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������apache-couchdb-1.6.0/share/doc/src/api/database/security.rst����������������������������������������0000644�0001750�0000144�00000013220�12332105522�023670� 0����������������������������������������������������������������������������������������������������ustar�00djc�����������������������������users���������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������.. Licensed under the Apache License, Version 2.0 (the "License"); you may not .. use this file except in compliance with the License. You may obtain a copy of .. the License at .. .. http://www.apache.org/licenses/LICENSE-2.0 .. .. Unless required by applicable law or agreed to in writing, software .. distributed under the License is distributed on an "AS IS" BASIS, WITHOUT .. WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the .. License for the specific language governing permissions and limitations under .. the License. .. _api/db/security: ``/db/_security`` ================= .. http:get:: /{db}/_security :synopsis: Returns the special security object for the database Returns the current security object from the specified database. The security object consists of two compulsory elements, ``admins`` and ``members``, which are used to specify the list of users and/or roles that have admin and members rights to the database respectively: - ``members``: they can read all types of documents from the DB, and they can write (and edit) documents to the DB except for design documents. - ``admins``: they have all the privileges of ``members`` plus the privileges: write (and edit) design documents, add/remove database admins and members, set the :ref:`database revisions limit <api/db/revs_limit>` and execute :ref:`temporary views <api/db/temp_view>` against the database. They can not create a database nor delete a database. Both ``members`` and ``admins`` objects are contains two array-typed fields: - ``users``: List of CouchDB user names - ``roles``: List of users roles Any other additional fields in the security object are optional. The entire security object is made available to validation and other internal functions so that the database can control and limit functionality. If both the names and roles fields of either the admins or members properties are empty arrays, it means the database has no admins or members. Having no admins, only server admins (with the reserved ``_admin`` role) are able to update design document and make other admin level changes. Having no members, any user can write regular documents (any non-design document) and read documents from the database. If there are any member names or roles defined for a database, then only authenticated users having a matching name or role are allowed to read documents from the database (or do a :get:`/{db}` call). .. note:: If the security object for a database has never been set, then the value returned will be empty. Also note, that security objects are not regular versioned documents (that is, they are not under MVCC rules). This is a design choice to speedup authorization checks (avoids traversing a database`s documents B-Tree). :param db: Database name :<header Accept: - :mimetype:`application/json` - :mimetype:`text/plain` :>header Content-Type: - :mimetype:`application/json` - :mimetype:`text/plain; charset=utf-8` :>json object admins: Object with two fields as ``names`` and ``roles``. See description above for more info. :>json object members: Object with two fields as ``names`` and ``roles``. See description above for more info. :code 200: Request completed successfully **Request**: .. code-block:: http GET /db/_security HTTP/1.1 Accept: application/json Host: localhost:5984 **Response**: .. code-block:: http HTTP/1.1 200 OK Cache-Control: must-revalidate Content-Length: 109 Content-Type: application/json Date: Mon, 12 Aug 2013 19:05:29 GMT Server: CouchDB (Erlang/OTP) { "admins": { "names": [ "superuser" ], "roles": [ "admins" ] }, "members": { "names": [ "user1", "user2" ], "roles": [ "developers" ] } } .. http:put:: /{db}/_security :synopsis: Sets the special security object for the database Sets the security object for the given database. :param db: Database name :<header Accept: - :mimetype:`application/json` - :mimetype:`text/plain` :<header Content-Type: :mimetype:`application/json` :<json object admins: Object with two fields as ``names`` and ``roles``. :ref:`See description above for more info <api/db/security>`. :<json object members: Object with two fields as ``names`` and ``roles``. :ref:`See description above for more info <api/db/security>`. :>header Content-Type: - :mimetype:`application/json` - :mimetype:`text/plain; charset=utf-8` :>json boolean ok: Operation status :code 200: Request completed successfully :code 401: CouchDB Server Administrator privileges required **Request**: .. code-block:: http PUT /db/_security HTTP/1.1 Accept: application/json Content-Length: 121 Content-Type: application/json Host: localhost:5984 { "admins": { "names": [ "superuser" ], "roles": [ "admins" ] }, "members": { "names": [ "user1", "user2" ], "roles": [ "developers" ] } } **Response**: .. code-block:: http HTTP/1.1 200 OK Cache-Control: must-revalidate Content-Length: 12 Content-Type: application/json Date: Tue, 13 Aug 2013 11:26:28 GMT Server: CouchDB (Erlang/OTP) { "ok": true } ��������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������apache-couchdb-1.6.0/share/doc/src/api/database/common.rst������������������������������������������0000644�0001750�0000144�00000030224�12332105522�023314� 0����������������������������������������������������������������������������������������������������ustar�00djc�����������������������������users���������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������.. Licensed under the Apache License, Version 2.0 (the "License"); you may not .. use this file except in compliance with the License. You may obtain a copy of .. the License at .. .. http://www.apache.org/licenses/LICENSE-2.0 .. .. Unless required by applicable law or agreed to in writing, software .. distributed under the License is distributed on an "AS IS" BASIS, WITHOUT .. WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the .. License for the specific language governing permissions and limitations under .. the License. .. _api/db: ``/db`` ======= .. http:head:: /{db} :synopsis: Checks the database existence Returns the HTTP Headers containing a minimal amount of information about the specified database. Since the response body is empty, using the HEAD method is a lightweight way to check if the database exists already or not. :param db: Database name :code 200: Database exists :code 404: Requested database not found **Request**: .. code-block:: http HEAD /test HTTP/1.1 Host: localhost:5984 **Response**: .. code-block:: http HTTP/1.1 200 OK Cache-Control: must-revalidate Content-Type: application/json Date: Mon, 12 Aug 2013 01:27:41 GMT Server: CouchDB (Erlang/OTP) .. http:get:: /{db} :synopsis: Returns the database information Gets information about the specified database. :param db: Database name :<header Accept: - :mimetype:`application/json` - :mimetype:`text/plain` :>header Content-Type: - :mimetype:`application/json` - :mimetype:`text/plain; charset=utf-8` :>json number committed_update_seq: The number of committed update. :>json boolean compact_running: Set to ``true`` if the database compaction routine is operating on this database. :>json string db_name: The name of the database. :>json number disk_format_version: The version of the physical format used for the data when it is stored on disk. :>json number data_size: Actual data size in bytes of the database data. :>json number disk_size: Size in bytes of the data as stored on the disk. Views indexes are not included in the calculation. :>json number doc_count: A count of the documents in the specified database. :>json number doc_del_count: Number of deleted documents :>json string instance_start_time: Timestamp of when the database was opened, expressed in microseconds since the epoch. :>json number purge_seq: The number of purge operations on the database. :>json number update_seq: The current number of updates to the database. :code 200: Request completed successfully :code 404: Requested database not found **Request**: .. code-block:: http GET /receipts HTTP/1.1 Accept: application/json Host: localhost:5984 **Response**: .. code-block:: http HTTP/1.1 200 OK Cache-Control: must-revalidate Content-Length: 258 Content-Type: application/json Date: Mon, 12 Aug 2013 01:38:57 GMT Server: CouchDB (Erlang/OTP) { "committed_update_seq": 292786, "compact_running": false, "data_size": 65031503, "db_name": "receipts", "disk_format_version": 6, "disk_size": 137433211, "doc_count": 6146, "doc_del_count": 64637, "instance_start_time": "1376269325408900", "purge_seq": 0, "update_seq": 292786 } .. http:put:: /{db} :synopsis: Creates a new database Creates a new database. The database name ``{db}`` must be composed by following next rules: - Name must begin with a lowercase letter (``a-z``) - Lowercase characters (``a-z``) - Digits (``0-9``) - Any of the characters ``_``, ``$``, ``(``, ``)``, ``+``, ``-``, and ``/``. If you're familiar with `Regular Expressions`_, the rules above could be written as ``^[a-z][a-z0-9_$()+/-]*$``. :param db: Database name :<header Accept: - :mimetype:`application/json` - :mimetype:`text/plain` :>header Content-Type: - :mimetype:`application/json` - :mimetype:`text/plain; charset=utf-8` :>header Location: Database URI location :>json boolean ok: Operation status. Available in case of success :>json string error: Error type. Available if response code is ``4xx`` :>json string reason: Error description. Available if response code is ``4xx`` :code 201: Database created successfully :code 400: Invalid database name :code 401: CouchDB Server Administrator privileges required :code 412: Database already exists **Request**: .. code-block:: http PUT /db HTTP/1.1 Accept: application/json Host: localhost:5984 **Response**: .. code-block:: http HTTP/1.1 201 Created Cache-Control: must-revalidate Content-Length: 12 Content-Type: application/json Date: Mon, 12 Aug 2013 08:01:45 GMT Location: http://localhost:5984/db Server: CouchDB (Erlang/OTP) { "ok": true } If we repeat the same request to CouchDB, it will response with :code:`412` since the database already exists: **Request**: .. code-block:: http PUT /db HTTP/1.1 Accept: application/json Host: localhost:5984 **Response**: .. code-block:: http HTTP/1.1 412 Precondition Failed Cache-Control: must-revalidate Content-Length: 95 Content-Type: application/json Date: Mon, 12 Aug 2013 08:01:16 GMT Server: CouchDB (Erlang/OTP) { "error": "file_exists", "reason": "The database could not be created, the file already exists." } If an invalid database name is supplied, CouchDB returns response with :code:`400`: **Request**: .. code-block:: http PUT /_db HTTP/1.1 Accept: application/json Host: localhost:5984 **Request**: .. code-block:: http HTTP/1.1 400 Bad Request Cache-Control: must-revalidate Content-Length: 194 Content-Type: application/json Date: Mon, 12 Aug 2013 08:02:10 GMT Server: CouchDB (Erlang/OTP) { "error": "illegal_database_name", "reason": "Name: '_db'. Only lowercase characters (a-z), digits (0-9), and any of the characters _, $, (, ), +, -, and / are allowed. Must begin with a letter." } .. http:delete:: /{db} :synopsis: Deletes an existing database Deletes the specified database, and all the documents and attachments contained within it. .. note:: To avoid deleting a database, CouchDB will respond with the HTTP status code 400 when the request URL includes a ?rev= parameter. This suggests that one wants to delete a document but forgot to add the document id to the URL. :param db: Database name :<header Accept: - :mimetype:`application/json` - :mimetype:`text/plain` :>header Content-Type: - :mimetype:`application/json` - :mimetype:`text/plain; charset=utf-8` :>json boolean ok: Operation status :code 200: Database removed successfully :code 400: Invalid database name or forgotten document id by accident :code 401: CouchDB Server Administrator privileges required :code 404: Database doesn't exist **Request**: .. code-block:: http DELETE /db HTTP/1.1 Accept: application/json Host: localhost:5984 **Response**: .. code-block:: http HTTP/1.1 200 OK Cache-Control: must-revalidate Content-Length: 12 Content-Type: application/json Date: Mon, 12 Aug 2013 08:54:00 GMT Server: CouchDB (Erlang/OTP) { "ok": true } .. http:post:: /{db} :synopsis: Creates a new document with generated ID if _id is not specified Creates a new document in the specified database, using the supplied JSON document structure. If the JSON structure includes the ``_id`` field, then the document will be created with the specified document ID. If the ``_id`` field is not specified, a new unique ID will be generated, following whatever UUID algorithm is configured for that server. :param db: Database name :<header Accept: - :mimetype:`application/json` - :mimetype:`text/plain` :<header Content-Type: :mimetype:`application/json` :<header X-Couch-Full-Commit: Overrides server's :config:option:`commit policy <couchdb/delayed_commits>`. Possible values are: ``false`` and ``true``. *Optional*. :query string batch: Stores document in :ref:`batch mode <api/doc/batch-writes>` Possible values: ``ok``. *Optional* :>header Content-Type: - :mimetype:`application/json` - :mimetype:`text/plain; charset=utf-8` :>header ETag: Quoted new document's revision :>header Location: Document's URI :>json string id: Document ID :>json boolean ok: Operation status :>json string rev: Revision info :code 201: Document created and stored on disk :code 202: Document data accepted, but not yet stored on disk :code 400: Invalid database name :code 401: Write privileges required :code 404: Database doesn't exist :code 409: A Conflicting Document with same ID already exists **Request**: .. code-block:: http POST /db HTTP/1.1 Accept: application/json Content-Length: 81 Content-Type: application/json { "servings": 4, "subtitle": "Delicious with fresh bread", "title": "Fish Stew" } **Response**: .. code-block:: http HTTP/1.1 201 Created Cache-Control: must-revalidate Content-Length: 95 Content-Type: application/json Date: Tue, 13 Aug 2013 15:19:25 GMT ETag: "1-9c65296036141e575d32ba9c034dd3ee" Location: http://localhost:5984/db/ab39fe0993049b84cfa81acd6ebad09d Server: CouchDB (Erlang/OTP) { "id": "ab39fe0993049b84cfa81acd6ebad09d", "ok": true, "rev": "1-9c65296036141e575d32ba9c034dd3ee" } Specifying the Document ID -------------------------- The document ID can be specified by including the ``_id`` field in the JSON of the submitted record. The following request will create the same document with the ID ``FishStew``. **Request**: .. code-block:: http POST /db HTTP/1.1 Accept: application/json Content-Length: 98 Content-Type: application/json { "_id": "FishStew", "servings": 4, "subtitle": "Delicious with fresh bread", "title": "Fish Stew" } **Response**: .. code-block:: http HTTP/1.1 201 Created Cache-Control: must-revalidate Content-Length: 71 Content-Type: application/json Date: Tue, 13 Aug 2013 15:19:25 GMT ETag: "1-9c65296036141e575d32ba9c034dd3ee" Location: http://localhost:5984/db/FishStew Server: CouchDB (Erlang/OTP) { "id": "FishStew", "ok": true, "rev": "1-9c65296036141e575d32ba9c034dd3ee" } .. _api/doc/batch-writes: Batch Mode Writes ----------------- You can write documents to the database at a higher rate by using the batch option. This collects document writes together in memory (on a user-by-user basis) before they are committed to disk. This increases the risk of the documents not being stored in the event of a failure, since the documents are not written to disk immediately. To use the batched mode, append the ``batch=ok`` query argument to the URL of the ``PUT`` or :post:`/{db}` request. The CouchDB server will respond with a HTTP :statuscode:`202` response code immediately. .. note:: Creating or updating documents with batch mode doesn't guarantee that all documents will be successfully stored on disk. For example, individual documents may not be saved due to conflicts, rejection by :ref:`validation function <vdufun>` or by other reasons, even if overall the batch was sucessfully submitted. **Request**: .. code-block:: http POST /db?batch=ok HTTP/1.1 Accept: application/json Content-Length: 98 Content-Type: application/json { "_id": "FishStew", "servings": 4, "subtitle": "Delicious with fresh bread", "title": "Fish Stew" } **Response**: .. code-block:: http HTTP/1.1 202 Accepted Cache-Control: must-revalidate Content-Length: 28 Content-Type: application/json Date: Tue, 13 Aug 2013 15:19:25 GMT Location: http://localhost:5984/db/FishStew Server: CouchDB (Erlang/OTP) { "id": "FishStew", "ok": true } .. _Regular Expressions: http://en.wikipedia.org/wiki/Regular_expression ����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������apache-couchdb-1.6.0/share/doc/src/api/database/compact.rst�����������������������������������������0000644�0001750�0000144�00000017107�12332105522�023457� 0����������������������������������������������������������������������������������������������������ustar�00djc�����������������������������users���������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������.. Licensed under the Apache License, Version 2.0 (the "License"); you may not .. use this file except in compliance with the License. You may obtain a copy of .. the License at .. .. http://www.apache.org/licenses/LICENSE-2.0 .. .. Unless required by applicable law or agreed to in writing, software .. distributed under the License is distributed on an "AS IS" BASIS, WITHOUT .. WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the .. License for the specific language governing permissions and limitations under .. the License. .. _api/db/compact: ``/db/_compact`` ================ .. http:post:: /{db}/_compact :synopsis: Starts a compaction for the database Request compaction of the specified database. Compaction compresses the disk database file by performing the following operations: - Writes a new, optimised, version of the database file, removing any unused sections from the new version during write. Because a new file is temporarily created for this purpose, you may require up to twice the current storage space of the specified database in order for the compaction routine to complete. - Removes old revisions of documents from the database, up to the per-database limit specified by the ``_revs_limit`` database parameter. Compaction can only be requested on an individual database; you cannot compact all the databases for a CouchDB instance. The compaction process runs as a background process. You can determine if the compaction process is operating on a database by obtaining the database meta information, the ``compact_running`` value of the returned database structure will be set to true. See :get:`/{db}`. You can also obtain a list of running processes to determine whether compaction is currently running. See :ref:`api/server/active_tasks`. :param db: Database name :<header Accept: - :mimetype:`application/json` - :mimetype:`text/plain` :<header Content-Type: :mimetype:`application/json` :>header Content-Type: - :mimetype:`application/json` - :mimetype:`text/plain; charset=utf-8` :>json boolean ok: Operation status :code 202: Compaction request has been accepted :code 400: Invalid database name :code 401: CouchDB Server Administrator privileges required :code 415: Bad :header:`Content-Type` value **Request**: .. code-block:: http POST /db/_compact HTTP/1.1 Accept: application/json Content-Type: application/json Host: localhost:5984 **Response**: .. code-block:: http HTTP/1.1 202 Accepted Cache-Control: must-revalidate Content-Length: 12 Content-Type: application/json Date: Mon, 12 Aug 2013 09:27:43 GMT Server: CouchDB (Erlang/OTP) { "ok": true } .. _api/db/compact/ddoc: ``/db/_compact/design-doc`` =========================== .. http:post:: /{db}/_compact/{ddoc} :synopsis: Starts a compaction for all the views in the selected design document Compacts the view indexes associated with the specified design document. If may be that compacting a large view can return more storage than compacting the actual db. Thus, you can use this in place of the full database compaction if you know a specific set of view indexes have been affected by a recent database change. :param db: Database name :param ddoc: Design document name :<header Accept: - :mimetype:`application/json` - :mimetype:`text/plain` :<header Content-Type: :mimetype:`application/json` :>header Content-Type: - :mimetype:`application/json` - :mimetype:`text/plain; charset=utf-8` :>json boolean ok: Operation status :code 202: Compaction request has been accepted :code 400: Invalid database name :code 401: CouchDB Server Administrator privileges required :code 404: Design document not found :code 415: Bad :header:`Content-Type` value **Request**: .. code-block:: http POST /db/_compact/posts HTTP/1.1 Accept: application/json Content-Type: application/json Host: localhost:5984 **Response**: .. code-block:: http HTTP/1.1 202 Accepted Cache-Control: must-revalidate Content-Length: 12 Content-Type: application/json Date: Mon, 12 Aug 2013 09:36:44 GMT Server: CouchDB (Erlang/OTP) { "ok": true } .. note:: View indexes are stored in a separate ``.couch`` file based on a hash of the design document's relevant functions, in a sub directory of where the main ``.couch`` database files are located. .. _api/db/ensure_full_commit: ``/db/_ensure_full_commit`` =========================== .. http:post:: /{db}/_ensure_full_commit :synopsis: Makes sure all uncommitted changes are written and synchronized to the disk Commits any recent changes to the specified database to disk. You should call this if you want to ensure that recent changes have been flushed. This function is likely not required, assuming you have the recommended configuration setting of ``delayed_commits=false``, which requires CouchDB to ensure changes are written to disk before a 200 or similar result is returned. :param db: Database name :<header Accept: - :mimetype:`application/json` - :mimetype:`text/plain` :<header Content-Type: :mimetype:`application/json` :>header Content-Type: - :mimetype:`application/json` - :mimetype:`text/plain; charset=utf-8` :>json string instance_start_time: Timestamp of when the database was opened, expressed in microseconds since the epoch. :>json boolean ok: Operation status :code 201: Commit completed successfully :code 400: Invalid database name :code 415: Bad :header:`Content-Type` value **Request**: .. code-block:: http POST /db/_ensure_full_commit HTTP/1.1 Accept: application/json Content-Type: application/json Host: localhost:5984 **Response**: .. code-block:: http HTTP/1.1 201 Created Cache-Control: must-revalidate Content-Length: 53 Content-Type: application/json Date: Mon, 12 Aug 2013 10:22:19 GMT Server: CouchDB (Erlang/OTP) { "instance_start_time": "1376269047459338", "ok": true } .. _api/db/view_cleanup: ``/db/_view_cleanup`` ===================== .. http:post:: /{db}/_view_cleanup :synopsis: Removes view files that are not used by any design document Removes view index files that are no longer required by CouchDB as a result of changed views within design documents. As the view filename is based on a hash of the view functions, over time old views will remain, consuming storage. This call cleans up the cached view output on disk for a given view. :param db: Database name :<header Accept: - :mimetype:`application/json` - :mimetype:`text/plain` :<header Content-Type: :mimetype:`application/json` :>header Content-Type: - :mimetype:`application/json` - :mimetype:`text/plain; charset=utf-8` :>json boolean ok: Operation status :code 202: Compaction request has been accepted :code 400: Invalid database name :code 401: CouchDB Server Administrator privileges required :code 415: Bad :header:`Content-Type` value **Request**: .. code-block:: http POST /db/_view_cleanup HTTP/1.1 Accept: application/json Content-Type: application/json Host: localhost:5984 **Response**: .. code-block:: http HTTP/1.1 202 Accepted Cache-Control: must-revalidate Content-Length: 12 Content-Type: application/json Date: Mon, 12 Aug 2013 09:27:43 GMT Server: CouchDB (Erlang/OTP) { "ok": true } ���������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������apache-couchdb-1.6.0/share/doc/src/api/database/changes.rst�����������������������������������������0000644�0001750�0000144�00000045462�12332105522�023446� 0����������������������������������������������������������������������������������������������������ustar�00djc�����������������������������users���������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������.. Licensed under the Apache License, Version 2.0 (the "License"); you may not .. use this file except in compliance with the License. You may obtain a copy of .. the License at .. .. http://www.apache.org/licenses/LICENSE-2.0 .. .. Unless required by applicable law or agreed to in writing, software .. distributed under the License is distributed on an "AS IS" BASIS, WITHOUT .. WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the .. License for the specific language governing permissions and limitations under .. the License. .. _api/db/changes: ================ ``/db/_changes`` ================ .. http:get:: /{db}/_changes :synopsis: Returns changes for the given database Returns a sorted list of changes made to documents in the database, in time order of application, can be obtained from the database's ``_changes`` resource. Only the most recent change for a given document is guaranteed to be provided, for example if a document has had fields added, and then deleted, an API client checking for changes will not necessarily receive the intermediate state of added documents. This can be used to listen for update and modifications to the database for post processing or synchronization, and for practical purposes, a continuously connected ``_changes`` feed is a reasonable approach for generating a real-time log for most applications. :param db: Database name :<header Accept: - :mimetype:`application/json` - :mimetype:`text/event-stream` - :mimetype:`text/plain` :<header Last-Event-ID: ID of the last events received by the server on a previous connection. Overrides `since` query parameter. :query array doc_ids: List of document IDs to filter the changes feed as valid JSON array. Used with :ref:`_doc_ids <changes/filter/doc_ids>` filter. Since `length of URL is limited`_, it is better to use :post:`/{db}/_changes` instead. :query boolean conflicts: Includes `conflicts` information in response. Ignored if `include_docs` isn't ``true``. Default is ``false``. :query boolean descending: Return the change results in descending sequence order (most recent change first). Default is ``false``. :query string feed: see :ref:`changes`. Default is ``normal``. :query string filter: Reference to a :ref:`filter function <filterfun>` from a design document that will filter whole stream emitting only filtered events. See the section `Change Notifications in the book CouchDB The Definitive Guide`_ for more information. :query number heartbeat: Period in *milliseconds* after which an empty line is sent in the results. Only applicable for :ref:`longpoll <changes/longpoll>` or :ref:`continuous <changes/continuous>` feeds. Overrides any timeout to keep the feed alive indefinitely. Default is ``60000``. May be ``true`` to use default value. :query boolean include_docs: Include the associated document with each result. If there are conflicts, only the winning revision is returned. Default is ``false``. :query boolean attachments: Include the Base64-encoded content of :ref:`attachments <api/doc/attachments>` in the documents that are included if `include_docs` is ``true``. Ignored if `include_docs` isn't ``true``. Default is ``false``. :query boolean att_encoding_info: Include encoding information in attachment stubs if `include_docs` is ``true`` and the particular attachment is compressed. Ignored if `include_docs` isn't ``true``. Default is ``false``. :query number last-event-id: Alias of `Last-Event-ID` header. :query number limit: Limit number of result rows to the specified value (note that using ``0`` here has the same effect as ``1``). :query since: Start the results from the change immediately after the given sequence number. Can be integer number or ``now`` value. Default is ``0``. :query string style: Specifies how many revisions are returned in the changes array. The default, ``main_only``, will only return the current "winning" revision; ``all_docs`` will return all leaf revisions (including conflicts and deleted former conflicts). :query number timeout: Maximum period in *milliseconds* to wait for a change before the response is sent, even if there are no results. Only applicable for :ref:`longpoll <changes/longpoll>` or :ref:`continuous <changes/continuous>` feeds. Default value is specified by :config:option:`httpd/changes_timeout` configuration option. Note that ``60000`` value is also the default maximum timeout to prevent undetected dead connections. :query string view: Allows to use view functions as filters. Documents counted as "passed" for view filter in case if map function emits at least one record for them. See :ref:`changes/filter/view` for more info. :>header Cache-Control: ``no-cache`` if changes feed is :ref:`eventsource <changes/eventsource>` :>header Content-Type: - :mimetype:`application/json` - :mimetype:`text/event-stream` - :mimetype:`text/plain; charset=utf-8` :>header ETag: Response hash is changes feed is `normal` :>header Transfer-Encoding: ``chunked`` :>json number last_seq: Last change sequence number :>json array results: Changes made to a database :code 200: Request completed successfully :code 400: Bad request The ``result`` field of database changes :json array changes: List of document`s leafs with single field ``rev`` :json string id: Document ID :json number seq: Update sequence number **Request**: .. code-block:: http GET /db/_changes?style=all_docs HTTP/1.1 Accept: application/json Host: localhost:5984 **Response**: .. code-block:: http HTTP/1.1 200 OK Cache-Control: must-revalidate Content-Type: application/json Date: Mon, 12 Aug 2013 00:54:58 GMT ETag: "6ASLEKEMSRABT0O5XY9UPO9Z" Server: CouchDB (Erlang/OTP) Transfer-Encoding: chunked { "last_seq": 11, "results": [ { "changes": [ { "rev": "2-7051cbe5c8faecd085a3fa619e6e6337" } ], "id": "6478c2ae800dfc387396d14e1fc39626", "seq": 6 }, { "changes": [ { "rev": "3-7379b9e515b161226c6559d90c4dc49f" } ], "deleted": true, "id": "5bbc9ca465f1b0fcd62362168a7c8831", "seq": 9 }, { "changes": [ { "rev": "6-460637e73a6288cb24d532bf91f32969" }, { "rev": "5-eeaa298781f60b7bcae0c91bdedd1b87" } ], "id": "729eb57437745e506b333068fff665ae", "seq": 11 } ] } .. _length of URL is limited: http://stackoverflow.com/a/417184/965635 .. versionchanged:: 0.11.0 added ``include_docs`` parameter .. versionchanged:: 1.2.0 added ``view`` parameter and special value `_view` for ``filter`` one .. versionchanged:: 1.3.0 ``since`` parameter could take `now` value to start listen changes since current seq number. .. versionchanged:: 1.3.0 ``eventsource`` feed type added. .. versionchanged:: 1.4.0 Support ``Last-Event-ID`` header. .. versionchanged:: 1.6.0 added ``attachments`` and ``att_encoding_info`` parameters .. warning:: Using the ``attachments`` parameter to include attachments in the changes feed is not recommended for large attachment sizes. Also note that the Base64-encoding that is used leads to a 33% overhead (i.e. one third) in transfer size for attachments. .. http:post:: /{db}/_changes :synopsis: Returns changes for the given database for certain document IDs Requests the database changes feed in the same way as :get:`/{db}/_changes` does, but is widely used with ``?filter=_doc_ids`` query parameter and allows one to pass a larger list of document IDs to filter. **Request**: .. code-block:: http POST /recipes/_changes?filter=_doc_ids HTTP/1.1 Accept: application/json Content-Length: 40 Content-Type: application/json Host: localhost:5984 { "doc_ids": [ "SpaghettiWithMeatballs" ] } **Response**: .. code-block:: http HTTP/1.1 200 OK Cache-Control: must-revalidate Content-Type: application/json Date: Sat, 28 Sep 2013 07:23:09 GMT ETag: "ARIHFWL3I7PIS0SPVTFU6TLR2" Server: CouchDB (Erlang OTP) Transfer-Encoding: chunked { "last_seq": 38, "results": [ { "changes": [ { "rev": "13-bcb9d6388b60fd1e960d9ec4e8e3f29e" } ], "id": "SpaghettiWithMeatballs", "seq": 38 } ] } .. _changes: Changes Feeds ============= .. _changes/normal: Polling ------- By default all changes are immediately returned within the JSON body:: GET /somedatabase/_changes HTTP/1.1 .. code-block:: javascript {"results":[ {"seq":1,"id":"fresh","changes":[{"rev":"1-967a00dff5e02add41819138abb3284d"}]}, {"seq":3,"id":"updated","changes":[{"rev":"2-7051cbe5c8faecd085a3fa619e6e6337"}]}, {"seq":5,"id":"deleted","changes":[{"rev":"2-eec205a9d413992850a6e32678485900"}],"deleted":true} ], "last_seq":5} ``results`` is the list of changes in sequential order. New and changed documents only differ in the value of the rev; deleted documents include the ``"deleted": true`` attribute. (In the ``style=all_docs mode``, deleted applies only to the current/winning revision. The other revisions listed might be deleted even if there is no deleted property; you have to ``GET`` them individually to make sure.) ``last_seq`` is the sequence number of the last update returned. (Currently it will always be the same as the seq of the last item in results.) Sending a ``since`` param in the query string skips all changes up to and including the given sequence number:: GET /somedatabase/_changes?since=3 HTTP/1.1 The return structure for ``normal`` and ``longpoll`` modes is a JSON array of changes objects, and the last update sequence number. In the return format for ``continuous`` mode, the server sends a ``CRLF`` (carriage-return, linefeed) delimited line for each change. Each line contains the `JSON object` described above. You can also request the full contents of each document change (instead of just the change notification) by using the ``include_docs`` parameter. .. code-block:: javascript { "last_seq": 5 "results": [ { "changes": [ { "rev": "2-eec205a9d413992850a6e32678485900" } ], "deleted": true, "id": "deleted", "seq": 5, } ] } .. _changes/longpoll: Long Polling ------------ The `longpoll` feed, probably most applicable for a browser, is a more efficient form of polling that waits for a change to occur before the response is sent. `longpoll` avoids the need to frequently poll CouchDB to discover nothing has changed! The request to the server will remain open until a change is made on the database and is subsequently transferred, and then the connection will close. This is low load for both server and client. The response is basically the same JSON as is sent for the `normal` feed. Because the wait for a change can be significant you can set a timeout before the connection is automatically closed (the ``timeout`` argument). You can also set a heartbeat interval (using the ``heartbeat`` query argument), which sends a newline to keep the connection active. .. _changes/continuous: Continuous ---------- Continually polling the CouchDB server is not ideal - setting up new HTTP connections just to tell the client that nothing happened puts unnecessary strain on CouchDB. A continuous feed stays open and connected to the database until explicitly closed and changes are sent to the client as they happen, i.e. in near real-time. As with the `longpoll` feed type you can set both the timeout and heartbeat intervals to ensure that the connection is kept open for new changes and updates. The continuous feed's response is a little different than the other feed types to simplify the job of the client - each line of the response is either empty or a JSON object representing a single change, as found in the normal feed's results. .. code-block:: text GET /somedatabase/_changes?feed=continuous HTTP/1.1 .. code-block:: javascript {"seq":1,"id":"fresh","changes":[{"rev":"1-967a00dff5e02add41819138abb3284d"}]} {"seq":3,"id":"updated","changes":[{"rev":"2-7051cbe5c8faecd085a3fa619e6e6337"}]} {"seq":5,"id":"deleted","changes":[{"rev":"2-eec205a9d413992850a6e32678485900"}],"deleted":true} ... tum tee tum ... {"seq":6,"id":"updated","changes":[{"rev":"3-825cb35de44c433bfb2df415563a19de"}]} Obviously, `... tum tee tum ...` does not appear in the actual response, but represents a long pause before the change with seq 6 occurred. Ā  .. _Change Notifications in the book CouchDB The Definitive Guide: http://guide.couchdb.org/draft/notifications.html .. _changes/eventsource: Event Source ------------ The `eventsource` feed provides push notifications that can be consumed in the form of DOM events in the browser. Refer to the `W3C eventsource specification`_ for further details. CouchDB also honours the ``Last-Event-ID`` parameter. .. code-block:: text GET /somedatabase/_changes?feed=eventsource HTTP/1.1 .. code-block:: javascript // define the event handling function if (window.EventSource) { var source = new EventSource("/somedatabase/_changes?feed=eventsource"); source.onerror = function(e) { alert('EventSource failed.'); }; var results = []; var sourceListener = function(e) { var data = JSON.parse(e.data); results.push(data); }; // start listening for events source.addEventListener('message', sourceListener, false); // stop listening for events source.removeEventListener('message', sourceListener, false); } .. note:: EventSource connections are subject to cross-origin resource sharing restrictions. You might need to configure :ref:`CORS support <cors>` to get the EventSource to work in your application. .. _W3C eventsource specification: http://www.w3.org/TR/eventsource/ .. _changes/filter: Filtering ========= You can filter the contents of the changes feed in a number of ways. The most basic way is to specify one or more document IDs to the query. This causes the returned structure value to only contain changes for the specified IDs. Note that the value of this query argument should be a JSON formatted array. You can also filter the ``_changes`` feed by defining a filter function within a design document. The specification for the filter is the same as for replication filters. You specify the name of the filter function to the ``filter`` parameter, specifying the design document name and :ref:`filter name <filterfun>`. For example: .. code-block:: http GET /db/_changes?filter=design_doc/filtername Additionally, there are couple of builtin filters are available and described below. .. _changes/filter/doc_ids: _doc_ids -------- This filter accepts only changes for documents which ID in specified in ``doc_ids`` query parameter or payload's object array. See :post:`/{db}/_changes` for an example. .. _changes/filter/design: _design ------- The ``_design`` filter accepts only changes for any design document within the requested database. **Request**: .. code-block:: http GET /recipes/_changes?filter=_design HTTP/1.1 Accept: application/json Host: localhost:5984 **Response**: .. code-block:: http HTTP/1.1 200 OK Cache-Control: must-revalidate Content-Type: application/json Date: Sat, 28 Sep 2013 07:28:28 GMT ETag: "ARIHFWL3I7PIS0SPVTFU6TLR2" Server: CouchDB (Erlang OTP) Transfer-Encoding: chunked { "last_seq": 38, "results": [ { "changes": [ { "rev": "10-304cae84fd862832ea9814f02920d4b2" } ], "id": "_design/ingredients", "seq": 29 }, { "changes": [ { "rev": "123-6f7c1b7c97a9e4f0d22bdf130e8fd817" } ], "deleted": true, "id": "_design/cookbook", "seq": 35 }, { "changes": [ { "rev": "6-5b8a52c22580e922e792047cff3618f3" } ], "deleted": true, "id": "_design/meta", "seq": 36 } ] } .. _changes/filter/view: _view ----- .. versionadded:: 1.2 The special filter ``_view`` allows to use existing :ref:`map function <mapfun>` as the :ref:`filter <filterfun>`. If the map function emits anything for the processed document it counts as accepted and the changes event emits to the feed. For most use-practice cases `filter` functions are very similar to `map` ones, so this feature helps to reduce amount of duplicated code. .. warning:: While :ref:`map functions <mapfun>` doesn't process the design documents, using ``_view`` filter forces them to do this. You need to be sure, that they are ready to handle documents with *alien* structure without panic crush. .. note:: Using ``_view`` filter doesn't queries the view index files, so you cannot use common :ref:`view query parameters <api/ddoc/view>` to additionally filter the changes feed by index key. Also, CouchDB doesn't returns the result instantly as it does for views - it really uses the specified map function as filter. Moreover, you cannot make such filters dynamic e.g. process the request query parameters or handle the :ref:`userctx_object` - the map function is only operates with the document. **Request**: .. code-block:: http GET /recipes/_changes?filter=_view&view=ingredients/by_recipe HTTP/1.1 Accept: application/json Host: localhost:5984 **Response**: .. code-block:: http HTTP/1.1 200 OK Cache-Control: must-revalidate Content-Type: application/json Date: Sat, 28 Sep 2013 07:36:40 GMT ETag: "ARIHFWL3I7PIS0SPVTFU6TLR2" Server: CouchDB (Erlang OTP) Transfer-Encoding: chunked { "last_seq": 38, "results": [ { "changes": [ { "rev": "13-bcb9d6388b60fd1e960d9ec4e8e3f29e" } ], "id": "SpaghettiWithMeatballs", "seq": 38 } ] } ��������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������apache-couchdb-1.6.0/share/doc/src/api/index.rst����������������������������������������������������0000644�0001750�0000144�00000002557�12332105522�021377� 0����������������������������������������������������������������������������������������������������ustar�00djc�����������������������������users���������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������.. Licensed under the Apache License, Version 2.0 (the "License"); you may not .. use this file except in compliance with the License. You may obtain a copy of .. the License at .. .. http://www.apache.org/licenses/LICENSE-2.0 .. .. Unless required by applicable law or agreed to in writing, software .. distributed under the License is distributed on an "AS IS" BASIS, WITHOUT .. WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the .. License for the specific language governing permissions and limitations under .. the License. .. _api: ============= API Reference ============= The components of the API URL path help determine the part of the CouchDB server that is being accessed. The result is the structure of the URL request both identifies and effectively describes the area of the database you are accessing. As with all URLs, the individual components are separated by a forward slash. As a general rule, URL components and JSON fields starting with the ``_`` (underscore) character represent a special component or entity within the server or returned object. For example, the URL fragment ``/_all_dbs`` gets a list of all of the databases in a CouchDB instance. This reference is structured according to the URL structure, as below. .. toctree:: :maxdepth: 2 basics server/index database/index document/index ddoc/index local �������������������������������������������������������������������������������������������������������������������������������������������������apache-couchdb-1.6.0/share/doc/src/api/server/������������������������������������������������������0000755�0001750�0000144�00000000000�12332106072�021034� 5����������������������������������������������������������������������������������������������������ustar�00djc�����������������������������users���������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������apache-couchdb-1.6.0/share/doc/src/api/server/index.rst���������������������������������������������0000644�0001750�0000144�00000001450�12332105522�022674� 0����������������������������������������������������������������������������������������������������ustar�00djc�����������������������������users���������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������.. Licensed under the Apache License, Version 2.0 (the "License"); you may not .. use this file except in compliance with the License. You may obtain a copy of .. the License at .. .. http://www.apache.org/licenses/LICENSE-2.0 .. .. Unless required by applicable law or agreed to in writing, software .. distributed under the License is distributed on an "AS IS" BASIS, WITHOUT .. WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the .. License for the specific language governing permissions and limitations under .. the License. .. _api/server: ====== Server ====== The CouchDB server interface provides the basic interface to a CouchDB server for obtaining CouchDB information and getting and setting configuration information. .. toctree:: common authn configuration ������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������apache-couchdb-1.6.0/share/doc/src/api/server/configuration.rst�������������������������������������0000644�0001750�0000144�00000026034�12332105522�024441� 0����������������������������������������������������������������������������������������������������ustar�00djc�����������������������������users���������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������.. Licensed under the Apache License, Version 2.0 (the "License"); you may not .. use this file except in compliance with the License. You may obtain a copy of .. the License at .. .. http://www.apache.org/licenses/LICENSE-2.0 .. .. Unless required by applicable law or agreed to in writing, software .. distributed under the License is distributed on an "AS IS" BASIS, WITHOUT .. WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the .. License for the specific language governing permissions and limitations under .. the License. .. _api/config: ============= Configuration ============= The CouchDB Server Configuration API provide an interface to query and update the various configuration values within a running CouchDB instance. ``/_config`` ============ .. http:get:: /_config :synopsis: Obtains a list of the entire server configuration Returns the entire CouchDB server configuration as a JSON structure. The structure is organized by different configuration sections, with individual values. :<header Accept: - :mimetype:`application/json` - :mimetype:`text/plain` :>header Content-Type: - :mimetype:`application/json` - :mimetype:`text/plain; charset=utf-8` :code 200: Request completed successfully :code 401: CouchDB Server Administrator privileges required **Request** .. code-block:: http GET /_config HTTP/1.1 Accept: application/json Host: localhost:5984 **Response**: .. code-block:: http HTTP/1.1 200 OK Cache-Control: must-revalidate Content-Length: 4148 Content-Type: application/json Date: Sat, 10 Aug 2013 12:01:42 GMT Server: CouchDB (Erlang/OTP) { "attachments": { "compressible_types": "text/*, application/javascript, application/json, application/xml", "compression_level": "8" }, "couch_httpd_auth": { "auth_cache_size": "50", "authentication_db": "_users", "authentication_redirect": "/_utils/session.html", "require_valid_user": "false", "timeout": "600" }, "couchdb": { "database_dir": "/var/lib/couchdb", "delayed_commits": "true", "max_attachment_chunk_size": "4294967296", "max_dbs_open": "100", "max_document_size": "4294967296", "os_process_timeout": "5000", "uri_file": "/var/lib/couchdb/couch.uri", "util_driver_dir": "/usr/lib64/couchdb/erlang/lib/couch-1.5.0/priv/lib", "view_index_dir": "/var/lib/couchdb" }, "daemons": { "auth_cache": "{couch_auth_cache, start_link, []}", "db_update_notifier": "{couch_db_update_notifier_sup, start_link, []}", "external_manager": "{couch_external_manager, start_link, []}", "httpd": "{couch_httpd, start_link, []}", "query_servers": "{couch_query_servers, start_link, []}", "stats_aggregator": "{couch_stats_aggregator, start, []}", "stats_collector": "{couch_stats_collector, start, []}", "uuids": "{couch_uuids, start, []}", "view_manager": "{couch_view, start_link, []}" }, "httpd": { "allow_jsonp": "false", "authentication_handlers": "{couch_httpd_oauth, oauth_authentication_handler}, {couch_httpd_auth, cookie_authentication_handler}, {couch_httpd_auth, default_authentication_handler}", "bind_address": "192.168.0.2", "default_handler": "{couch_httpd_db, handle_request}", "max_connections": "2048", "port": "5984", "secure_rewrites": "true", "vhost_global_handlers": "_utils, _uuids, _session, _oauth, _users" }, "httpd_db_handlers": { "_changes": "{couch_httpd_db, handle_changes_req}", "_compact": "{couch_httpd_db, handle_compact_req}", "_design": "{couch_httpd_db, handle_design_req}", "_temp_view": "{couch_httpd_view, handle_temp_view_req}", "_view_cleanup": "{couch_httpd_db, handle_view_cleanup_req}" }, "httpd_design_handlers": { "_info": "{couch_httpd_db, handle_design_info_req}", "_list": "{couch_httpd_show, handle_view_list_req}", "_rewrite": "{couch_httpd_rewrite, handle_rewrite_req}", "_show": "{couch_httpd_show, handle_doc_show_req}", "_update": "{couch_httpd_show, handle_doc_update_req}", "_view": "{couch_httpd_view, handle_view_req}" }, "httpd_global_handlers": { "/": "{couch_httpd_misc_handlers, handle_welcome_req, <<\"Welcome\">>}", "_active_tasks": "{couch_httpd_misc_handlers, handle_task_status_req}", "_all_dbs": "{couch_httpd_misc_handlers, handle_all_dbs_req}", "_config": "{couch_httpd_misc_handlers, handle_config_req}", "_log": "{couch_httpd_misc_handlers, handle_log_req}", "_oauth": "{couch_httpd_oauth, handle_oauth_req}", "_replicate": "{couch_httpd_misc_handlers, handle_replicate_req}", "_restart": "{couch_httpd_misc_handlers, handle_restart_req}", "_session": "{couch_httpd_auth, handle_session_req}", "_stats": "{couch_httpd_stats_handlers, handle_stats_req}", "_utils": "{couch_httpd_misc_handlers, handle_utils_dir_req, \"/usr/share/couchdb/www\"}", "_uuids": "{couch_httpd_misc_handlers, handle_uuids_req}", "favicon.ico": "{couch_httpd_misc_handlers, handle_favicon_req, \"/usr/share/couchdb/www\"}" }, "log": { "file": "/var/log/couchdb/couch.log", "include_sasl": "true", "level": "info" }, "query_server_config": { "reduce_limit": "true" }, "query_servers": { "javascript": "/usr/bin/couchjs /usr/share/couchdb/server/main.js" }, "replicator": { "max_http_pipeline_size": "10", "max_http_sessions": "10" }, "stats": { "rate": "1000", "samples": "[0, 60, 300, 900]" }, "uuids": { "algorithm": "utc_random" } } .. _api/config/section: ``/_config/section`` ==================== .. http:get:: /_config/{section} :synopsis: Returns all the configuration values for the specified section Gets the configuration structure for a single section. :param section: Configuration section name :<header Accept: - :mimetype:`application/json` - :mimetype:`text/plain` :>header Content-Type: - :mimetype:`application/json` - :mimetype:`text/plain; charset=utf-8` :code 200: Request completed successfully :code 401: CouchDB Server Administrator privileges required **Request**: .. code-block:: http GET /_config/httpd HTTP/1.1 Accept: application/json Host: localhost:5984 **Response**: .. code-block:: http HTTP/1.1 200 OK Cache-Control: must-revalidate Content-Length: 444 Content-Type: application/json Date: Sat, 10 Aug 2013 12:10:40 GMT Server: CouchDB (Erlang/OTP) { "allow_jsonp": "false", "authentication_handlers": "{couch_httpd_oauth, oauth_authentication_handler}, {couch_httpd_auth, cookie_authentication_handler}, {couch_httpd_auth, default_authentication_handler}", "bind_address": "127.0.0.1", "default_handler": "{couch_httpd_db, handle_request}", "enable_cors": "false", "log_max_chunk_size": "1000000", "port": "5984", "secure_rewrites": "true", "vhost_global_handlers": "_utils, _uuids, _session, _oauth, _users" } .. _api/config/section/key: ``/_config/section/key`` ======================== .. http:get:: /_config/{section}/{key} :synopsis: Returns a specific section/configuration value Gets a single configuration value from within a specific configuration section. :param section: Configuration section name :param key: Configuration option name :<header Accept: - :mimetype:`application/json` - :mimetype:`text/plain` :>header Content-Type: - :mimetype:`application/json` - :mimetype:`text/plain; charset=utf-8` :code 200: Request completed successfully :code 401: CouchDB Server Administrator privileges required **Request**: .. code-block:: http GET /_config/log/level HTTP/1.1 Accept: application/json Host: localhost:5984 **Response**: .. code-block:: http HTTP/1.1 200 OK Cache-Control: must-revalidate Content-Length: 8 Content-Type: application/json Date: Sat, 10 Aug 2013 12:12:59 GMT Server: CouchDB (Erlang/OTP) "debug" .. note:: The returned value will be the JSON of the value, which may be a string or numeric value, or an array or object. Some client environments may not parse simple strings or numeric values as valid JSON. .. http:put:: /_config/{section}/{key} :synopsis: Sets the specified configuration value Updates a configuration value. The new value should be supplied in the request body in the corresponding JSON format. If you are setting a string value, you must supply a valid JSON string. In response CouchDB sends old value for target section key. :param section: Configuration section name :param key: Configuration option name :<header Accept: - :mimetype:`application/json` - :mimetype:`text/plain` :<header Content-Type: :mimetype:`application/json` :>header Content-Type: - :mimetype:`application/json` - :mimetype:`text/plain; charset=utf-8` :code 200: Request completed successfully :code 400: Invalid JSON request body :code 401: CouchDB Server Administrator privileges required :code 500: Error setting configuration **Request**: .. code-block:: http PUT /_config/log/level HTTP/1.1 Accept: application/json Content-Length: 7 Content-Type: application/json Host: localhost:5984 "info" **Response**: .. code-block:: http HTTP/1.1 200 OK Cache-Control: must-revalidate Content-Length: 8 Content-Type: application/json Date: Sat, 10 Aug 2013 12:12:59 GMT Server: CouchDB (Erlang/OTP) "debug" .. http:delete:: /_config/{section}/{key} :synopsis: Removes the current setting Deletes a configuration value. The returned JSON will be the value of the configuration parameter before it was deleted. :param section: Configuration section name :param key: Configuration option name :<header Accept: - :mimetype:`application/json` - :mimetype:`text/plain` :>header Content-Type: - :mimetype:`application/json` - :mimetype:`text/plain; charset=utf-8` :code 200: Request completed successfully :code 401: CouchDB Server Administrator privileges required :code 404: Specified configuration option not found **Request**: .. code-block:: http DELETE /_config/log/level HTTP/1.1 Accept: application/json Host: localhost:5984 **Response**: .. code-block:: http HTTP/1.1 200 OK Cache-Control: must-revalidate Content-Length: 7 Content-Type: application/json Date: Sat, 10 Aug 2013 12:29:03 GMT Server: CouchDB (Erlang/OTP) "info" ����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������apache-couchdb-1.6.0/share/doc/src/api/server/authn.rst���������������������������������������������0000644�0001750�0000144�00000030511�12332105522�022704� 0����������������������������������������������������������������������������������������������������ustar�00djc�����������������������������users���������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������.. Licensed under the Apache License, Version 2.0 (the "License"); you may not .. use this file except in compliance with the License. You may obtain a copy of .. the License at .. .. http://www.apache.org/licenses/LICENSE-2.0 .. .. Unless required by applicable law or agreed to in writing, software .. distributed under the License is distributed on an "AS IS" BASIS, WITHOUT .. WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the .. License for the specific language governing permissions and limitations under .. the License. .. _api/auth: ============== Authentication ============== Interfaces for obtaining session and authorization data. .. note:: We're also strongly recommend you to :ref:`setup SSL <config/ssl>` to improve all authentication methods security. .. _api/auth/basic: Basic Authentication ==================== `Basic authentication`_ (:rfc:`2617`) is a quick and simple way to authenticate with CouchDB. The main drawback is the need to send user credentials with each request which may be insecure and could hurt operation performance (since CouchDB must compute password hash with every request): **Request**: .. code-block:: http GET / HTTP/1.1 Accept: application/json Authorization: Basic cm9vdDpyZWxheA== Host: localhost:5984 **Response**: .. code-block:: http HTTP/1.1 200 OK Cache-Control: must-revalidate Content-Length: 177 Content-Type: application/json Date: Mon, 03 Dec 2012 00:44:47 GMT Server: CouchDB (Erlang/OTP) { "couchdb":"Welcome", "uuid":"0a959b9b8227188afc2ac26ccdf345a6", "version":"1.3.0", "vendor": { "version":"1.3.0", "name":"The Apache Software Foundation" } } .. _Basic authentication: http://en.wikipedia.org/wiki/Basic_access_authentication .. _api/auth/cookie: Cookie Authentication ===================== For cookie authentication (:rfc:`2109`) CouchDB generates a token that the client can use for the next few requests to CouchDB. Tokens are valid until a timeout. When CouchDB sees a valid token in a subsequent request, it will authenticate user by this token without requesting the password again. By default, cookies are valid for 10 minutes, but it's :config:option:`adjustable <couch_httpd_auth/timeout>`. Also it's possible to make cookies :config:option:`persistent <couch_httpd_auth/allow_persistent_cookies>` To obtain the first token and thus authenticate a user for the first time, the `username` and `password` must be sent to the :ref:`_session API <api/auth/session>`. .. _api/auth/session: ``/_session`` ------------- .. http:post:: /_session :synopsis: Authenticates user by Cookie-based user login Initiates new session for specified user credentials by providing `Cookie` value. :<header Content-Type: - :mimetype:`application/x-www-form-urlencoded` - :mimetype:`application/json` :query string next: Enforces redirect after successful login to the specified location. This location is relative from server root. *Optional*. :form name: User name :form password: Password :>header Set-Cookie: Authorization token :>json boolean ok: Operation status :>json string name: Username :>json array roles: List of user roles :code 200: Successfully authenticated :code 302: Redirect after successful authentication :code 401: Username or password wasn't recognized **Request**: .. code-block:: http POST /_session HTTP/1.1 Accept: application/json Content-Length: 24 Content-Type: application/x-www-form-urlencoded Host: localhost:5984 name=root&password=relax It's also possible to send data as JSON: .. code-block:: http POST /_session HTTP/1.1 Accept: application/json Content-Length: 37 Content-Type: application/json Host: localhost:5984 { "name": "root", "password": "relax" } **Response**: .. code-block:: http HTTP/1.1 200 OK Cache-Control: must-revalidate Content-Length: 43 Content-Type: application/json Date: Mon, 03 Dec 2012 01:23:14 GMT Server: CouchDB (Erlang/OTP) Set-Cookie: AuthSession=cm9vdDo1MEJCRkYwMjq0LO0ylOIwShrgt8y-UkhI-c6BGw; Version=1; Path=/; HttpOnly {"ok":true,"name":"root","roles":["_admin"]} If ``next`` query parameter was provided the response will trigger redirection to the specified location in case of successful authentication: **Request**: .. code-block:: http POST /_session?next=/blog/_design/sofa/_rewrite/recent-posts HTTP/1.1 Accept: application/json Content-Type: application/x-www-form-urlencoded Host: localhost:5984 name=root&password=relax **Response**: .. code-block:: http HTTP/1.1 302 Moved Temporarily Cache-Control: must-revalidate Content-Length: 43 Content-Type: application/json Date: Mon, 03 Dec 2012 01:32:46 GMT Location: http://localhost:5984/blog/_design/sofa/_rewrite/recent-posts Server: CouchDB (Erlang/OTP) Set-Cookie: AuthSession=cm9vdDo1MEJDMDEzRTp7Vu5GKCkTxTVxwXbpXsBARQWnhQ; Version=1; Path=/; HttpOnly {"ok":true,"name":null,"roles":["_admin"]} .. http:get:: /_session :synopsis: Returns Cookie-based login user information Returns complete information about authenticated user. This information contains :ref:`userctx_object`, authentication method and available ones and authentication database. :query boolean basic: Accept `Basic Auth` by requesting this resource. *Optional*. :code 200: Successfully authenticated. :code 401: Username or password wasn't recognized. **Request**: .. code-block:: http GET /_session HTTP/1.1 Host: localhost:5984 Accept: application/json Cookie: AuthSession=cm9vdDo1MEJDMDQxRDpqb-Ta9QfP9hpdPjHLxNTKg_Hf9w **Response**: .. code-block:: http HTTP/1.1 200 OK Cache-Control: must-revalidate Content-Length: 175 Content-Type: application/json Date: Fri, 09 Aug 2013 20:27:45 GMT Server: CouchDB (Erlang/OTP) Set-Cookie: AuthSession=cm9vdDo1MjA1NTBDMTqmX2qKt1KDR--GUC80DQ6-Ew_XIw; Version=1; Path=/; HttpOnly { "info": { "authenticated": "cookie", "authentication_db": "_users", "authentication_handlers": [ "oauth", "cookie", "default" ] }, "ok": true, "userCtx": { "name": "root", "roles": [ "_admin" ] } } .. http:delete:: /_session :synopsis: Logout Cookie-based user Closes user's session. :code 200: Successfully close session. :code 401: User wasn't authenticated. **Request**: .. code-block:: http DELETE /_session HTTP/1.1 Accept: application/json Cookie: AuthSession=cm9vdDo1MjA1NEVGMDo1QXNQkqC_0Qmgrk8Fw61_AzDeXw Host: localhost:5984 **Response**: .. code-block:: http HTTP/1.1 200 OK Cache-Control: must-revalidate Content-Length: 12 Content-Type: application/json Date: Fri, 09 Aug 2013 20:30:12 GMT Server: CouchDB (Erlang/OTP) Set-Cookie: AuthSession=; Version=1; Path=/; HttpOnly { "ok": true } .. _api/auth/proxy: Proxy Authentication ==================== .. note:: To use this authentication method make sure that the ``{couch_httpd_auth, proxy_authentication_handler}`` value in added to the list of the active :config:option:`httpd/authentication_handlers`: .. code-block:: ini [httpd] authentication_handlers = {couch_httpd_oauth, oauth_authentication_handler}, {couch_httpd_auth, cookie_authentication_handler}, {couch_httpd_auth, proxy_authentication_handler}, {couch_httpd_auth, default_authentication_handler} `Proxy authentication` is very useful in case your application already uses some external authentication service and you don't want to duplicate users and their roles in CouchDB. This authentication method allows creation of a :ref:`userctx_object` for remotely authenticated user. By default, the client just need to pass specific headers to CouchDB with related request: - :config:option:`X-Auth-CouchDB-UserName <couch_httpd_auth/x_auth_username>`: username; - :config:option:`X-Auth-CouchDB-Roles <couch_httpd_auth/x_auth_roles>`: list of user roles separated by a comma (``,``); - :config:option:`X-Auth-CouchDB-Token <couch_httpd_auth/x_auth_token>`: authentication token. Optional, but strongly recommended to :config:option:`force token be required <couch_httpd_auth/proxy_use_secret>` to prevent requests from untrusted sources. **Request**: .. code-block:: http GET /_session HTTP/1.1 Host: localhost:5984 Accept: application/json Content-Type: application/json; charset=utf-8 X-Auth-CouchDB-Roles: users,blogger X-Auth-CouchDB-UserName: foo **Response**: .. code-block:: http HTTP/1.1 200 OK Cache-Control: must-revalidate Content-Length: 190 Content-Type: application/json Date: Fri, 14 Jun 2013 10:16:03 GMT Server: CouchDB (Erlang/OTP) { "info": { "authenticated": "proxy", "authentication_db": "_users", "authentication_handlers": [ "oauth", "cookie", "proxy", "default" ] }, "ok": true, "userCtx": { "name": "foo", "roles": [ "users", "blogger" ] } } Note that you don't need to request :ref:`session <api/auth/session>` to be authenticated by this method if all required HTTP headers are provided. .. _api/auth/oauth: OAuth Authentication ==================== CouchDB supports OAuth 1.0 authentication (:rfc:`5849`). OAuth provides a method for clients to access server resources without sharing real credentials (username and password). First, :ref:`configure oauth <config/oauth>`, by setting consumer and token with their secrets and binding token to real CouchDB username. Probably, it's not good idea to work with plain curl, let use some scripting language like Python: .. code-block:: python #!/usr/bin/env python2 from oauth import oauth # pip install oauth import httplib URL = 'http://localhost:5984/_session' CONSUMER_KEY = 'consumer1' CONSUMER_SECRET = 'sekr1t' TOKEN = 'token1' SECRET = 'tokensekr1t' consumer = oauth.OAuthConsumer(CONSUMER_KEY, CONSUMER_SECRET) token = oauth.OAuthToken(TOKEN, SECRET) req = oauth.OAuthRequest.from_consumer_and_token( consumer, token=token, http_method='GET', http_url=URL, parameters={} ) req.sign_request(oauth.OAuthSignatureMethod_HMAC_SHA1(), consumer,token) headers = req.to_header() headers['Accept'] = 'application/json' con = httplib.HTTPConnection('localhost', 5984) con.request('GET', URL, headers=headers) resp = con.getresponse() print resp.read() or Ruby: .. code-block:: ruby #!/usr/bin/env ruby require 'oauth' # gem install oauth URL = 'http://localhost:5984' CONSUMER_KEY = 'consumer1' CONSUMER_SECRET = 'sekr1t' TOKEN = 'token1' SECRET = 'tokensekr1t' @consumer = OAuth::Consumer.new CONSUMER_KEY, CONSUMER_SECRET, {:site => URL} @access_token = OAuth::AccessToken.new(@consumer, TOKEN, SECRET) puts @access_token.get('/_session').body Both snippets produces similar request and response pair: .. code-block:: http GET /_session HTTP/1.1 Host: localhost:5984 Accept: application/json Authorization: OAuth realm="", oauth_nonce="81430018", oauth_timestamp="1374561749", oauth_consumer_key="consumer1", oauth_signature_method="HMAC-SHA1", oauth_version="1.0", oauth_token="token1", oauth_signature="o4FqJ8%2B9IzUpXH%2Bk4rgnv7L6eTY%3D" .. code-block:: http HTTP/1.1 200 OK Cache-Control : must-revalidate Content-Length : 167 Content-Type : application/json Date : Tue, 23 Jul 2013 06:51:15 GMT Server: CouchDB (Erlang/OTP) { "ok": true, "info": { "authenticated": "oauth", "authentication_db": "_users", "authentication_handlers": ["oauth", "cookie", "default"] }, "userCtx": { "name": "couchdb_username", "roles": [] } } There we request the :ref:`_session <api/auth/session>` resource to ensure that authentication was successful and the target CouchDB username is correct. Change the target URL to request required resource. ���������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������apache-couchdb-1.6.0/share/doc/src/api/server/common.rst��������������������������������������������0000644�0001750�0000144�00000102706�12332105522�023063� 0����������������������������������������������������������������������������������������������������ustar�00djc�����������������������������users���������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������.. Licensed under the Apache License, Version 2.0 (the "License"); you may not .. use this file except in compliance with the License. You may obtain a copy of .. the License at .. .. http://www.apache.org/licenses/LICENSE-2.0 .. .. Unless required by applicable law or agreed to in writing, software .. distributed under the License is distributed on an "AS IS" BASIS, WITHOUT .. WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the .. License for the specific language governing permissions and limitations under .. the License. .. _api/server/root: ``/`` ===== .. http:get:: / :synopsis: Returns the welcome message and version information Accessing the root of a CouchDB instance returns meta information about the instance. The response is a JSON structure containing information about the server, including a welcome message and the version of the server. :<header Accept: - :mimetype:`application/json` - :mimetype:`text/plain` :>header Content-Type: - :mimetype:`application/json` - :mimetype:`text/plain; charset=utf-8` :code 200: Request completed successfully **Request**: .. code-block:: http GET / HTTP/1.1 Accept: application/json Host: localhost:5984 **Response**: .. code-block:: http HTTP/1.1 200 OK Cache-Control: must-revalidate Content-Length: 179 Content-Type: application/json Date: Sat, 10 Aug 2013 06:33:33 GMT Server: CouchDB (Erlang/OTP) { "couchdb": "Welcome", "uuid": "85fb71bf700c17267fef77535820e371", "vendor": { "name": "The Apache Software Foundation", "version": "1.3.1" }, "version": "1.3.1" } .. _api/server/active_tasks: ``/_active_tasks`` ================== .. http:get:: /_active_tasks :synopsis: Obtains a list of the tasks running in the server List of running tasks, including the task type, name, status and process ID. The result is a JSON array of the currently running tasks, with each task being described with a single object. Depending on operation type set of response object fields might be different. :<header Accept: - :mimetype:`application/json` - :mimetype:`text/plain` :>header Content-Type: - :mimetype:`application/json` - :mimetype:`text/plain; charset=utf-8` :>json number changes_done: Processed changes :>json string database: Source database :>json string pid: Process ID :>json number progress: Current percentage progress :>json number started_on: Task start time as unix timestamp :>json string status: Task status message :>json string task: Task name :>json number total_changes: Total changes to process :>json string type: Operation Type :>json number updated_on: Unix timestamp of last operation update :code 200: Request completed successfully :code 401: CouchDB Server Administrator privileges required **Request**: .. code-block:: http GET /_active_tasks HTTP/1.1 Accept: application/json Host: localhost:5984 **Response**: .. code-block:: http HTTP/1.1 200 OK Cache-Control: must-revalidate Content-Length: 1690 Content-Type: application/json Date: Sat, 10 Aug 2013 06:37:31 GMT Server: CouchDB (Erlang/OTP) [ { "changes_done": 64438, "database": "mailbox", "pid": "<0.12986.1>", "progress": 84, "started_on": 1376116576, "total_changes": 76215, "type": "database_compaction", "updated_on": 1376116619 }, { "changes_done": 14443, "database": "mailbox", "design_document": "c9753817b3ba7c674d92361f24f59b9f", "pid": "<0.10461.3>", "progress": 18, "started_on": 1376116621, "total_changes": 76215, "type": "indexer", "updated_on": 1376116650 }, { "changes_done": 5454, "database": "mailbox", "design_document": "_design/meta", "pid": "<0.6838.4>", "progress": 7, "started_on": 1376116632, "total_changes": 76215, "type": "indexer", "updated_on": 1376116651 }, { "checkpointed_source_seq": 68585, "continuous": false, "doc_id": null, "doc_write_failures": 0, "docs_read": 4524, "docs_written": 4524, "missing_revisions_found": 4524, "pid": "<0.1538.5>", "progress": 44, "replication_id": "9bc1727d74d49d9e157e260bb8bbd1d5", "revisions_checked": 4524, "source": "mailbox", "source_seq": 154419, "started_on": 1376116644, "target": "http://mailsrv:5984/mailbox", "type": "replication", "updated_on": 1376116651 } ] .. _api/server/all_dbs: ``/_all_dbs`` ============= .. http:get:: /_all_dbs :synopsis: Returns a list of all the databases Returns a list of all the databases in the CouchDB instance. :<header Accept: - :mimetype:`application/json` - :mimetype:`text/plain` :>header Content-Type: - :mimetype:`application/json` - :mimetype:`text/plain; charset=utf-8` :code 200: Request completed successfully **Request**: .. code-block:: http GET /_all_dbs HTTP/1.1 Accept: application/json Host: localhost:5984 **Response**: .. code-block:: http HTTP/1.1 200 OK Cache-Control: must-revalidate Content-Length: 52 Content-Type: application/json Date: Sat, 10 Aug 2013 06:57:48 GMT Server: CouchDB (Erlang/OTP) [ "_users", "contacts", "docs", "invoices", "locations" ] .. _api/server/db_updates: ``/_db_updates`` ================ .. versionadded:: 1.4 .. http:get:: /_db_updates :synopsis: Return the server changes of databases Returns a list of all database events in the CouchDB instance. :<header Accept: - :mimetype:`application/json` - :mimetype:`text/plain` :query string feed: - **longpoll**: Closes the connection after the first event. - **continuous**: Send a line of JSON per event. Keeps the socket open until ``timeout``. - **eventsource**: Like, ``continuous``, but sends the events in `EventSource <http://dev.w3.org/html5/eventsource/>`_ format. :query number timeout: Number of seconds until CouchDB closes the connection. Default is ``60``. :query boolean heartbeat: Whether CouchDB will send a newline character (``\n``) on ``timeout``. Default is ``true``. :>header Content-Type: - :mimetype:`application/json` - :mimetype:`text/plain; charset=utf-8` :>header Transfer-Encoding: ``chunked`` :>json string db_name: Database name :>json boolean ok: Event operation status :>json string type: A database event is one of ``created``, ``updated``, ``deleted`` :code 200: Request completed successfully :code 401: CouchDB Server Administrator privileges required **Request**: .. code-block:: http GET /_db_updates HTTP/1.1 Accept: application/json Host: localhost:5984 **Response**: .. code-block:: http HTTP/1.1 200 OK Cache-Control: must-revalidate Content-Type: application/json Date: Sat, 10 Aug 2013 07:02:41 GMT Server: CouchDB (Erlang/OTP) Transfer-Encoding: chunked { "db_name": "mailbox", "ok": true, "type": "created" } .. _api/server/log: ``/_log`` ========= .. http:get:: /_log :synopsis: Returns the server log file Gets the CouchDB log, equivalent to accessing the local log file of the corresponding CouchDB instance. :<header Accept: - :mimetype:`text/plain` :query number bytes: Bytes to be returned. Default is ``1000``. :query number offset: Offset in bytes where the log tail should be started. Default is ``0``. :>header Content-Type: :mimetype:`text/plain; charset=utf-8` :>header Transfer-Encoding: ``chunked`` :code 200: Request completed successfully :code 401: CouchDB Server Administrator privileges required **Request**: .. code-block:: http GET /_log HTTP/1.1 Accept: application/json Host: localhost:5984 **Response**: .. code-block:: text [Wed, 27 Oct 2010 10:49:42 GMT] [info] [<0.23338.2>] 192.168.0.2 - - 'PUT' /authdb 401 [Wed, 27 Oct 2010 11:02:19 GMT] [info] [<0.23428.2>] 192.168.0.116 - - 'GET' /recipes/FishStew 200 [Wed, 27 Oct 2010 11:02:19 GMT] [info] [<0.23428.2>] 192.168.0.116 - - 'GET' /_session 200 [Wed, 27 Oct 2010 11:02:19 GMT] [info] [<0.24199.2>] 192.168.0.116 - - 'GET' / 200 [Wed, 27 Oct 2010 13:03:38 GMT] [info] [<0.24207.2>] 192.168.0.116 - - 'GET' /_log?offset=5 200 If you want to pick out specific parts of the log information you can use the ``bytes`` argument, which specifies the number of bytes to be returned, and ``offset``, which specifies where the reading of the log should start, counted back from the end. For example, if you use the following request: .. code-block:: http GET /_log?bytes=500&offset=2000 Reading of the log will start at 2000 bytes from the end of the log, and 500 bytes will be shown. **How bytes/offset works?** CouchDB reads specified amount of ``bytes`` from the end of log file, jumping to ``offset`` bytes towards the beginning of the file first: .. code-block:: text Log File FilePos ---------- | | 10 | | 20 | | 30 | | 40 | | 50 | | 60 | | 70 -- Bytes = 20 -- | | 80 | Chunk | | 90 -- Offset = 10 -- |__________| 100 .. _api/server/replicate: ``/_replicate`` =============== .. http:post:: /_replicate :synopsis: Starts or cancels the replication Request, configure, or stop, a replication operation. :<header Accept: - :mimetype:`application/json` - :mimetype:`text/plain` :<header Content-Type: :mimetype:`application/json` :<json boolean cancel: Cancels the replication :<json boolean continuous: Configure the replication to be continuous :<json boolean create_target: Creates the target database. Required administrator's privileges on target server. :<json array doc_ids: Array of document IDs to be synchronized :<json string proxy: Address of a proxy server through which replication should occur (protocol can be "http" or "socks5") :<json string source: Source database name or URL :<json string target: Target database name or URL :>header Content-Type: - :mimetype:`application/json` - :mimetype:`text/plain; charset=utf-8` :>json array history: Replication history (see below) :>json boolean ok: Replication status :>json number replication_id_version: Replication protocol version :>json string session_id: Unique session ID :>json number source_last_seq: Last sequence number read from source database :code 200: Replication request successfully completed :code 202: Continuous replication request has been accepted :code 400: Invalid JSON data :code 401: CouchDB Server Administrator privileges required :code 404: Either the source or target DB is not found or attempt to cancel unknown replication task :code 500: JSON specification was invalid The specification of the replication request is controlled through the JSON content of the request. The JSON should be an object with the fields defining the source, target and other options. The `Replication history` is an array of objects with following structure: :json number doc_write_failures: Number of document write failures :json number docs_read: Number of documents read :json number docs_written: Number of documents written to target :json number end_last_seq: Last sequence number in changes stream :json string end_time: Date/Time replication operation completed in :rfc:`2822` format :json number missing_checked: Number of missing documents checked :json number missing_found: Number of missing documents found :json number recorded_seq: Last recorded sequence number :json string session_id: Session ID for this replication operation :json number start_last_seq: First sequence number in changes stream :json string start_time: Date/Time replication operation started in :rfc:`2822` format **Request** .. code-block:: http POST /_replicate HTTP/1.1 Accept: application/json Content-Length: 36 Content-Type: application/json Host: localhost:5984 { "source": "db_a", "target": "db_b" } **Response** .. code-block:: http HTTP/1.1 200 OK Cache-Control: must-revalidate Content-Length: 692 Content-Type: application/json Date: Sun, 11 Aug 2013 20:38:50 GMT Server: CouchDB (Erlang/OTP) { "history": [ { "doc_write_failures": 0, "docs_read": 10, "docs_written": 10, "end_last_seq": 28, "end_time": "Sun, 11 Aug 2013 20:38:50 GMT", "missing_checked": 10, "missing_found": 10, "recorded_seq": 28, "session_id": "142a35854a08e205c47174d91b1f9628", "start_last_seq": 1, "start_time": "Sun, 11 Aug 2013 20:38:50 GMT" }, { "doc_write_failures": 0, "docs_read": 1, "docs_written": 1, "end_last_seq": 1, "end_time": "Sat, 10 Aug 2013 15:41:54 GMT", "missing_checked": 1, "missing_found": 1, "recorded_seq": 1, "session_id": "6314f35c51de3ac408af79d6ee0c1a09", "start_last_seq": 0, "start_time": "Sat, 10 Aug 2013 15:41:54 GMT" } ], "ok": true, "replication_id_version": 3, "session_id": "142a35854a08e205c47174d91b1f9628", "source_last_seq": 28 } Replication Operation --------------------- The aim of the replication is that at the end of the process, all active documents on the source database are also in the destination database and all documents that were deleted in the source databases are also deleted (if they exist) on the destination database. Replication can be described as either push or pull replication: - *Pull replication* is where the ``source`` is the remote CouchDB instance, and the ``target`` is the local database. Pull replication is the most useful solution to use if your source database has a permanent IP address, and your destination (local) database may have a dynamically assigned IP address (for example, through DHCP). This is particularly important if you are replicating to a mobile or other device from a central server. - *Push replication* is where the ``source`` is a local database, and ``target`` is a remote database. Specifying the Source and Target Database ----------------------------------------- You must use the URL specification of the CouchDB database if you want to perform replication in either of the following two situations: - Replication with a remote database (i.e. another instance of CouchDB on the same host, or a different host) - Replication with a database that requires authentication For example, to request replication between a database local to the CouchDB instance to which you send the request, and a remote database you might use the following request: .. code-block:: http POST http://couchdb:5984/_replicate Content-Type: application/json Accept: application/json { "source" : "recipes", "target" : "http://coucdb-remote:5984/recipes", } In all cases, the requested databases in the ``source`` and ``target`` specification must exist. If they do not, an error will be returned within the JSON object: .. code-block:: javascript { "error" : "db_not_found" "reason" : "could not open http://couchdb-remote:5984/ol1ka/", } You can create the target database (providing your user credentials allow it) by adding the ``create_target`` field to the request object: .. code-block:: http POST http://couchdb:5984/_replicate Content-Type: application/json Accept: application/json { "create_target" : true "source" : "recipes", "target" : "http://couchdb-remote:5984/recipes", } The ``create_target`` field is not destructive. If the database already exists, the replication proceeds as normal. Single Replication ------------------ You can request replication of a database so that the two databases can be synchronized. By default, the replication process occurs one time and synchronizes the two databases together. For example, you can request a single synchronization between two databases by supplying the ``source`` and ``target`` fields within the request JSON content. .. code-block:: http POST http://couchdb:5984/_replicate Accept: application/json Content-Type: application/json { "source" : "recipes", "target" : "recipes-snapshot", } In the above example, the databases ``recipes`` and ``recipes-snapshot`` will be synchronized. These databases are local to the CouchDB instance where the request was made. The response will be a JSON structure containing the success (or failure) of the synchronization process, and statistics about the process: .. code-block:: javascript { "ok" : true, "history" : [ { "docs_read" : 1000, "session_id" : "52c2370f5027043d286daca4de247db0", "recorded_seq" : 1000, "end_last_seq" : 1000, "doc_write_failures" : 0, "start_time" : "Thu, 28 Oct 2010 10:24:13 GMT", "start_last_seq" : 0, "end_time" : "Thu, 28 Oct 2010 10:24:14 GMT", "missing_checked" : 0, "docs_written" : 1000, "missing_found" : 1000 } ], "session_id" : "52c2370f5027043d286daca4de247db0", "source_last_seq" : 1000 } Continuous Replication ---------------------- Synchronization of a database with the previously noted methods happens only once, at the time the replicate request is made. To have the target database permanently replicated from the source, you must set the ``continuous`` field of the JSON object within the request to true. With continuous replication changes in the source database are replicated to the target database in perpetuity until you specifically request that replication ceases. .. code-block:: http POST http://couchdb:5984/_replicate Accept: application/json Content-Type: application/json { "continuous" : true "source" : "recipes", "target" : "http://couchdb-remote:5984/recipes", } Changes will be replicated between the two databases as long as a network connection is available between the two instances. .. note:: Two keep two databases synchronized with each other, you need to set replication in both directions; that is, you must replicate from ``source`` to ``target``, and separately from ``target`` to ``source``. Canceling Continuous Replication -------------------------------- You can cancel continuous replication by adding the ``cancel`` field to the JSON request object and setting the value to true. Note that the structure of the request must be identical to the original for the cancellation request to be honoured. For example, if you requested continuous replication, the cancellation request must also contain the ``continuous`` field. For example, the replication request: .. code-block:: http POST http://couchdb:5984/_replicate Content-Type: application/json Accept: application/json { "source" : "recipes", "target" : "http://couchdb-remote:5984/recipes", "create_target" : true, "continuous" : true } Must be canceled using the request: .. code-block:: http POST http://couchdb:5984/_replicate Accept: application/json Content-Type: application/json { "cancel" : true, "continuous" : true "create_target" : true, "source" : "recipes", "target" : "http://couchdb-remote:5984/recipes", } Requesting cancellation of a replication that does not exist results in a 404 error. .. _api/server/restart: ``/_restart`` ============= .. http:post:: /_restart :synopsis: Restarts the server Restarts the CouchDB instance. You must be authenticated as a user with administration privileges for this to work. :<header Accept: - :mimetype:`application/json` - :mimetype:`text/plain` :<header Content-Type: :mimetype:`application/json` :>header Content-Type: - :mimetype:`application/json` - :mimetype:`text/plain; charset=utf-8` :code 202: Server goes to restart (there is no guarantee that it will be alive after) :code 401: CouchDB Server Administrator privileges required :code 415: Bad request`s :header:`Content-Type` **Request**: .. code-block:: http POST /_restart HTTP/1.1 Accept: application/json Host: localhost:5984 **Response**: .. code-block:: http HTTP/1.1 202 Accepted Cache-Control: must-revalidate Content-Length: 12 Content-Type: application/json Date: Sat, 10 Aug 2013 11:33:50 GMT Server: CouchDB (Erlang/OTP) { "ok": true } .. _api/server/stats: ``/_stats`` =========== .. http:get:: /_stats :synopsis: Returns server statistics The ``_stats`` resource returns a JSON object containing the statistics for the running server. The object is structured with top-level sections collating the statistics for a range of entries, with each individual statistic being easily identified, and the content of each statistic is self-describing :<header Accept: - :mimetype:`application/json` - :mimetype:`text/plain` :>header Content-Type: - :mimetype:`application/json` - :mimetype:`text/plain; charset=utf-8` :code 200: Request completed successfully **Request**: .. code-block:: http GET /_stats/couchdb/request_time HTTP/1.1 Accept: application/json Host: localhost:5984 **Response**: .. code-block:: http HTTP/1.1 200 OK Cache-Control: must-revalidate Content-Length: 187 Content-Type: application/json Date: Sat, 10 Aug 2013 11:41:11 GMT Server: CouchDB (Erlang/OTP) { "couchdb": { "request_time": { "current": 21.0, "description": "length of a request inside CouchDB without MochiWeb", "max": 19.0, "mean": 7.0, "min": 1.0, "stddev": 10.392, "sum": 21.0 } } } The fields provide the current, minimum and maximum, and a collection of statistical means and quantities. The quantity in each case is not defined, but the descriptions below provide The statistics are divided into the following top-level sections: ``couchdb`` ----------- Describes statistics specific to the internals of CouchDB +-------------------------+-------------------------------------------------------+----------------+ | Statistic ID | Description | Unit | +=========================+=======================================================+================+ | ``auth_cache_hits`` | Number of authentication cache hits | number | +-------------------------+-------------------------------------------------------+----------------+ | ``auth_cache_misses`` | Number of authentication cache misses | number | +-------------------------+-------------------------------------------------------+----------------+ | ``database_reads`` | Number of times a document was read from a database | number | +-------------------------+-------------------------------------------------------+----------------+ | ``database_writes`` | Number of times a database was changed | number | +-------------------------+-------------------------------------------------------+----------------+ | ``open_databases`` | Number of open databases | number | +-------------------------+-------------------------------------------------------+----------------+ | ``open_os_files`` | Number of file descriptors CouchDB has open | number | +-------------------------+-------------------------------------------------------+----------------+ | ``request_time`` | Length of a request inside CouchDB without MochiWeb | milliseconds | +-------------------------+-------------------------------------------------------+----------------+ ``httpd_request_methods`` ------------------------- +----------------+----------------------------------+----------+ | Statistic ID | Description | Unit | +================+==================================+==========+ | ``COPY`` | Number of HTTP COPY requests | number | +----------------+----------------------------------+----------+ | ``DELETE`` | Number of HTTP DELETE requests | number | +----------------+----------------------------------+----------+ | ``GET`` | Number of HTTP GET requests | number | +----------------+----------------------------------+----------+ | ``HEAD`` | Number of HTTP HEAD requests | number | +----------------+----------------------------------+----------+ | ``POST`` | Number of HTTP POST requests | number | +----------------+----------------------------------+----------+ | ``PUT`` | Number of HTTP PUT requests | number | +----------------+----------------------------------+----------+ ``httpd_status_codes`` ---------------------- +----------------+------------------------------------------------------+----------+ | Statistic ID | Description | Unit | +================+======================================================+==========+ | ``200`` | Number of HTTP 200 OK responses | number | +----------------+------------------------------------------------------+----------+ | ``201`` | Number of HTTP 201 Created responses | number | +----------------+------------------------------------------------------+----------+ | ``202`` | Number of HTTP 202 Accepted responses | number | +----------------+------------------------------------------------------+----------+ | ``301`` | Number of HTTP 301 Moved Permanently responses | number | +----------------+------------------------------------------------------+----------+ | ``304`` | Number of HTTP 304 Not Modified responses | number | +----------------+------------------------------------------------------+----------+ | ``400`` | Number of HTTP 400 Bad Request responses | number | +----------------+------------------------------------------------------+----------+ | ``401`` | Number of HTTP 401 Unauthorized responses | number | +----------------+------------------------------------------------------+----------+ | ``403`` | Number of HTTP 403 Forbidden responses | number | +----------------+------------------------------------------------------+----------+ | ``404`` | Number of HTTP 404 Not Found responses | number | +----------------+------------------------------------------------------+----------+ | ``405`` | Number of HTTP 405 Method Not Allowed responses | number | +----------------+------------------------------------------------------+----------+ | ``409`` | Number of HTTP 409 Conflict responses | number | +----------------+------------------------------------------------------+----------+ | ``412`` | Number of HTTP 412 Precondition Failed responses | number | +----------------+------------------------------------------------------+----------+ | ``500`` | Number of HTTP 500 Internal Server Error responses | number | +----------------+------------------------------------------------------+----------+ ``httpd`` --------- +----------------------------------+----------------------------------------------+----------+ | Statistic ID | Description | Unit | +==================================+==============================================+==========+ | ``bulk_requests`` | Number of bulk requests | number | +----------------------------------+----------------------------------------------+----------+ | ``clients_requesting_changes`` | Number of clients for continuous _changes | number | +----------------------------------+----------------------------------------------+----------+ | ``requests`` | Number of HTTP requests | number | +----------------------------------+----------------------------------------------+----------+ | ``temporary_view_reads`` | Number of temporary view reads | number | +----------------------------------+----------------------------------------------+----------+ | ``view_reads`` | Number of view reads | number | +----------------------------------+----------------------------------------------+----------+ You can also access individual statistics by quoting the statistics sections and statistic ID as part of the URL path. For example, to get the ``request_time`` statistics, you can use: .. code-block:: http GET /_stats/couchdb/request_time This returns an entire statistics object, as with the full request, but containing only the request individual statistic. Hence, the returned structure is as follows: .. code-block:: javascript { "couchdb" : { "request_time" : { "stddev" : 7454.305, "min" : 1, "max" : 34185, "current" : 34697.803, "mean" : 1652.276, "sum" : 34697.803, "description" : "length of a request inside CouchDB without MochiWeb" } } } .. _api/server/utils: ``/_utils`` =========== .. http:get:: /_utils :synopsis: Redirects to /_utils/ Accesses the built-in Futon administration interface for CouchDB. :>header Location: New URI location :code 301: Redirects to :get:`/_utils/` .. http:get:: /_utils/ :synopsis: CouchDB administration interface (Futon) :>header Content-Type: :mimetype:`text/html` :>header Last-Modified: Static files modification timestamp :code 200: Request completed successfully .. _api/server/uuids: ``/_uuids`` =========== .. versionchanged:: 1.5.1 .. http:get:: /_uuids :synopsis: Generates a list of UUIDs from the server Requests one or more Universally Unique Identifiers (UUIDs) from the CouchDB instance. The response is a JSON object providing a list of UUIDs. :<header Accept: - :mimetype:`application/json` - :mimetype:`text/plain` :query number count: Number of UUIDs to return. Default is ``1``. :>header Content-Type: - :mimetype:`application/json` - :mimetype:`text/plain; charset=utf-8` :>header ETag: Response hash :code 200: Request completed successfully :code 403: Requested more UUIDs than is :config:option:`allowed <uuids/max_count>` to retrieve **Request**: .. code-block:: http GET /_uuids?count=10 HTTP/1.1 Accept: application/json Host: localhost:5984 **Response**: .. code-block:: http HTTP/1.1 200 OK Content-Length: 362 Content-Type: application/json Date: Sat, 10 Aug 2013 11:46:25 GMT ETag: "DGRWWQFLUDWN5MRKSLKQ425XV" Expires: Fri, 01 Jan 1990 00:00:00 GMT Pragma: no-cache Server: CouchDB (Erlang/OTP) { "uuids": [ "75480ca477454894678e22eec6002413", "75480ca477454894678e22eec600250b", "75480ca477454894678e22eec6002c41", "75480ca477454894678e22eec6003b90", "75480ca477454894678e22eec6003fca", "75480ca477454894678e22eec6004bef", "75480ca477454894678e22eec600528f", "75480ca477454894678e22eec6005e0b", "75480ca477454894678e22eec6006158", "75480ca477454894678e22eec6006161" ] } The UUID type is determined by the :config:option:`UUID algorithm <uuids/algorithm>` setting in the CouchDB configuration. The UUID type may be changed at any time through the :ref:`Configuration API <api/config/section/key>`. For example, the UUID type could be changed to ``random`` by sending this HTTP request: .. code-block:: http PUT http://couchdb:5984/_config/uuids/algorithm Content-Type: application/json Accept: */* "random" You can verify the change by obtaining a list of UUIDs: .. code-block:: javascript { "uuids" : [ "031aad7b469956cf2826fcb2a9260492", "6ec875e15e6b385120938df18ee8e496", "cff9e881516483911aa2f0e98949092d", "b89d37509d39dd712546f9510d4a9271", "2e0dbf7f6c4ad716f21938a016e4e59f" ] } .. _api/server/favicon: ``/favicon.ico`` ================ .. http:get:: /favicon.ico :synopsis: Returns the site icon Binary content for the `favicon.ico` site icon. :>header Content-Type: :mimetype:`image/x-icon` :code 200: Request completed successfully :code 404: The requested content could not be found ����������������������������������������������������������apache-couchdb-1.6.0/share/doc/src/api/local.rst����������������������������������������������������0000644�0001750�0000144�00000007274�12332105522�021363� 0����������������������������������������������������������������������������������������������������ustar�00djc�����������������������������users���������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������.. Licensed under the Apache License, Version 2.0 (the "License"); you may not .. use this file except in compliance with the License. You may obtain a copy of .. the License at .. .. http://www.apache.org/licenses/LICENSE-2.0 .. .. Unless required by applicable law or agreed to in writing, software .. distributed under the License is distributed on an "AS IS" BASIS, WITHOUT .. WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the .. License for the specific language governing permissions and limitations under .. the License. .. _api/local: ================================= Local (non-replicating) Documents ================================= The Local (non-replicating) document interface allows you to create local documents that are not replicated to other databases. These documents can be used to hold configuration or other information that is required specifically on the local CouchDB instance. Local documents have the following limitations: - Local documents are not replicated to other databases. - The ID of the local document must be known for the document to accessed. You cannot obtain a list of local documents from the database. - Local documents are not output by views, or the :ref:`api/db/all_docs` view. Local documents can be used when you want to store configuration or other information for the current (local) instance of a given database. A list of the available methods and URL paths are provided below: +--------+-------------------------+-------------------------------------------+ | Method | Path | Description | +========+=========================+===========================================+ | GET | /db/_local/id | Returns the latest revision of the | | | | non-replicated document | +--------+-------------------------+-------------------------------------------+ | PUT | /db/_local/id | Inserts a new version of the | | | | non-replicated document | +--------+-------------------------+-------------------------------------------+ | DELETE | /db/_local/id | Deletes the non-replicated document | +--------+-------------------------+-------------------------------------------+ | COPY | /db/_local/id | Copies the non-replicated document | +--------+-------------------------+-------------------------------------------+ .. _api/local/doc: ``/db/_local/id`` ======================== .. http:get:: /{db}/_local/{docid} :synopsis: Returns the latest revision of the local document Gets the specified local document. The semantics are identical to accessing a standard document in the specified database, except that the document is not replicated. See :get:`/{db}/{docid}`. .. http:put:: /{db}/_local/{docid} :synopsis: Inserts a new version of the local document Stores the specified local document. The semantics are identical to storing a standard document in the specified database, except that the document is not replicated. See :put:`/{db}/{docid}`. .. http:delete:: /{db}/_local/{docid} :synopsis: Deletes the local document Deletes the specified local document. The semantics are identical to deleting a standard document in the specified database, except that the document is not replicated. See :delete:`/{db}/{docid}`. .. http:copy:: /{db}/_local/{docid} :synopsis: Copies the local document within the same database Copies the specified local document. The semantics are identical to copying a standard document in the specified database, except that the document is not replicated. See :copy:`/{db}/{docid}`. ������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������apache-couchdb-1.6.0/share/doc/src/api/basics.rst���������������������������������������������������0000644�0001750�0000144�00000050462�12332105522�021532� 0����������������������������������������������������������������������������������������������������ustar�00djc�����������������������������users���������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������.. Licensed under the Apache License, Version 2.0 (the "License"); you may not .. use this file except in compliance with the License. You may obtain a copy of .. the License at .. .. http://www.apache.org/licenses/LICENSE-2.0 .. .. Unless required by applicable law or agreed to in writing, software .. distributed under the License is distributed on an "AS IS" BASIS, WITHOUT .. WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the .. License for the specific language governing permissions and limitations under .. the License. .. _api/basics: ========== API Basics ========== The CouchDB API is the primary method of interfacing to a CouchDB instance. Requests are made using HTTP and requests are used to request information from the database, store new data, and perform views and formatting of the information stored within the documents. Requests to the API can be categorised by the different areas of the CouchDB system that you are accessing, and the HTTP method used to send the request. Different methods imply different operations, for example retrieval of information from the database is typically handled by the ``GET`` operation, while updates are handled by either a ``POST`` or ``PUT`` request. There are some differences between the information that must be supplied for the different methods. For a guide to the basic HTTP methods and request structure, see :ref:`api/format`. For nearly all operations, the submitted data, and the returned data structure, is defined within a JavaScript Object Notation (JSON) object. Basic information on the content and data types for JSON are provided in :ref:`json`. Errors when accessing the CouchDB API are reported using standard HTTP Status Codes. A guide to the generic codes returned by CouchDB are provided in :ref:`errors`. When accessing specific areas of the CouchDB API, specific information and examples on the HTTP methods and request, JSON structures, and error codes are provided. .. _api/format: Request Format and Responses ============================ CouchDB supports the following HTTP request methods: - ``GET`` Request the specified item. As with normal HTTP requests, the format of the URL defines what is returned. With CouchDB this can include static items, database documents, and configuration and statistical information. In most cases the information is returned in the form of a JSON document. - ``HEAD`` The ``HEAD`` method is used to get the HTTP header of a ``GET`` request without the body of the response. - ``POST`` Upload data. Within CouchDB ``POST`` is used to set values, including uploading documents, setting document values, and starting certain administration commands. - ``PUT`` Used to put a specified resource. In CouchDB ``PUT`` is used to create new objects, including databases, documents, views and design documents. - ``DELETE`` Deletes the specified resource, including documents, views, and design documents. - ``COPY`` A special method that can be used to copy documents and objects. If you use the an unsupported HTTP request type with a URL that does not support the specified type, a 405 error will be returned, listing the supported HTTP methods. For example: .. code-block:: javascript { "error":"method_not_allowed", "reason":"Only GET,HEAD allowed" } The CouchDB design document API and the functions when returning HTML (for example as part of a show or list) enables you to include custom HTTP headers through the ``headers`` block of the return object. HTTP Headers ============ Because CouchDB uses HTTP for all communication, you need to ensure that the correct HTTP headers are supplied (and processed on retrieval) so that you get the right format and encoding. Different environments and clients will be more or less strict on the effect of these HTTP headers (especially when not present). Where possible you should be as specific as possible. Request Headers --------------- - ``Content-type`` Specifies the content type of the information being supplied within the request. The specification uses MIME type specifications. For the majority of requests this will be JSON (``application/json``). For some settings the MIME type will be plain text. When uploading attachments it should be the corresponding MIME type for the attachment or binary (``application/octet-stream``). The use of the ``Content-type`` on a request is highly recommended. - ``Accept`` Specifies the list of accepted data types to be returned by the server (i.e. that are accepted/understandable by the client). The format should be a list of one or more MIME types, separated by colons. For the majority of requests the definition should be for JSON data (``application/json``). For attachments you can either specify the MIME type explicitly, or use ``*/*`` to specify that all file types are supported. If the ``Accept`` header is not supplied, then the ``*/*`` MIME type is assumed (i.e. client accepts all formats). The use of ``Accept`` in queries for CouchDB is not required, but is highly recommended as it helps to ensure that the data returned can be processed by the client. If you specify a data type using the ``Accept`` header, CouchDB will honor the specified type in the ``Content-type`` header field returned. For example, if you explicitly request ``application/json`` in the ``Accept`` of a request, the returned HTTP headers will use the value in the returned ``Content-type`` field. For example, when sending a request without an explicit ``Accept`` header, or when specifying ``*/*``: .. code-block:: http GET /recipes HTTP/1.1 Host: couchdb:5984 Accept: */* The returned headers are: .. code-block:: http Server: CouchDB (Erlang/OTP) Date: Thu, 13 Jan 2011 13:39:34 GMT Content-Type: text/plain;charset=utf-8 Content-Length: 227 Cache-Control: must-revalidate Note that the returned content type is ``text/plain`` even though the information returned by the request is in JSON format. Explicitly specifying the ``Accept`` header: .. code-block:: http GET /recipes HTTP/1.1 Host: couchdb:5984 Accept: application/json The headers returned include the ``application/json`` content type: .. code-block:: http Server: CouchDB (Erlang/OTP) Date: Thu, 13 Jan 2013 13:40:11 GMT Content-Type: application/json Content-Length: 227 Cache-Control: must-revalidate Response Headers ---------------- Response headers are returned by the server when sending back content and include a number of different header fields, many of which are standard HTTP response header and have no significance to CouchDB operation. The list of response headers important to CouchDB are listed below. - ``Content-type`` Specifies the MIME type of the returned data. For most request, the returned MIME type is ``text/plain``. All text is encoded in Unicode (UTF-8), and this is explicitly stated in the returned ``Content-type``, as ``text/plain;charset=utf-8``. - ``Cache-control`` The cache control HTTP response header provides a suggestion for client caching mechanisms on how to treat the returned information. CouchDB typically returns the ``must-revalidate``, which indicates that the information should be revalidated if possible. This is used to ensure that the dynamic nature of the content is correctly updated. - ``Content-length`` The length (in bytes) of the returned content. - ``Etag`` The ``Etag`` HTTP header field is used to show the revision for a document, or a view. ETags have been assigned to a map/reduce group (the collection of views in a single design document). Any change to any of the indexes for those views would generate a new ETag for all view URLs in a single design doc, even if that specific view's results had not changed. Each ``_view`` URL has its own ETag which only gets updated when changes are made to the database that effect that index. If the index for that specific view does not change, that view keeps the original ETag head (therefore sending back 304 Not Modified more often). .. _json: JSON Basics =========== The majority of requests and responses to CouchDB use the JavaScript Object Notation (JSON) for formatting the content and structure of the data and responses. JSON is used because it is the simplest and easiest to use solution for working with data within a web browser, as JSON structures can be evaluated and used as JavaScript objects within the web browser environment. JSON also integrates with the server-side JavaScript used within CouchDB. JSON supports the same basic types as supported by JavaScript, these are: - Number (either integer or floating-point). - String; this should be enclosed by double-quotes and supports Unicode characters and backslash escaping. For example: .. code-block:: javascript "A String" - Boolean - a ``true`` or ``false`` value. You can use these strings directly. For example: .. code-block:: javascript { "value": true} - Array - a list of values enclosed in square brackets. For example: .. code-block:: javascript ["one", "two", "three"] - Object - a set of key/value pairs (i.e. an associative array, or hash). The key must be a string, but the value can be any of the supported JSON values. For example: .. code-block:: javascript { "servings" : 4, "subtitle" : "Easy to make in advance, and then cook when ready", "cooktime" : 60, "title" : "Chicken Coriander" } In CouchDB, the JSON object is used to represent a variety of structures, including the main CouchDB document. Parsing JSON into a JavaScript object is supported through the ``JSON.parse()`` function in JavaScript, or through various libraries that will perform the parsing of the content into a JavaScript object for you. Libraries for parsing and generating JSON are available in many languages, including Perl, Python, Ruby, Erlang and others. .. warning:: Care should be taken to ensure that your JSON structures are valid, invalid structures will cause CouchDB to return an HTTP status code of 500 (server error). .. _json/numbers: Number Handling --------------- Developers and users new to computer handling of numbers often encounter suprises when expecting that a number stored in JSON format does not necessarily return as the same number as compared character by character. Any numbers defined in JSON that contain a decimal point or exponent will be passed through the Erlang VM's idea of the "double" data type. Any numbers that are used in views will pass through the view server's idea of a number (the common JavaScript case means even integers pass through a double due to JavaScript's definition of a number). Consider this document that we write to CouchDB: .. code-block:: javascript { "_id":"30b3b38cdbd9e3a587de9b8122000cff", "number": 1.1 } Now let’s read that document back from CouchDB: .. code-block:: javascript { "_id":"30b3b38cdbd9e3a587de9b8122000cff", "_rev":"1-f065cee7c3fd93aa50f6c97acde93030", "number":1.1000000000000000888 } What happens is CouchDB is changing the textual representation of the result of decoding what it was given into some numerical format. In most cases this is an `IEEE 754`_ double precision floating point number which is exactly what almost all other languages use as well. .. _IEEE 754: https://en.wikipedia.org/wiki/IEEE_754-2008 What Erlang does a bit differently than other languages is that it does not attempt to pretty print the resulting output to use the shortest number of characters. For instance, this is why we have this relationship: .. code-block:: erlang ejson:encode(ejson:decode(<<"1.1">>)). <<"1.1000000000000000888">> What can be confusing here is that internally those two formats decode into the same IEEE-754 representation. And more importantly, it will decode into a fairly close representation when passed through all major parsers that we know about. While we've only been discussing cases where the textual representation changes, another important case is when an input value contains more precision than can actually represented in a double. (You could argue that this case is actually "losing" data if you don't accept that numbers are stored in doubles). Here's a log for a couple of the more common JSON libraries that happen to be on the author's machine: Spidermonkey:: $ js -h 2>&1 | head -n 1 JavaScript-C 1.8.5 2011-03-31 $ js js> JSON.stringify(JSON.parse("1.01234567890123456789012345678901234567890")) "1.0123456789012346" js> var f = JSON.stringify(JSON.parse("1.01234567890123456789012345678901234567890")) js> JSON.stringify(JSON.parse(f)) "1.0123456789012346" Node:: $ node -v v0.6.15 $ node JSON.stringify(JSON.parse("1.01234567890123456789012345678901234567890")) '1.0123456789012346' var f = JSON.stringify(JSON.parse("1.01234567890123456789012345678901234567890")) undefined JSON.stringify(JSON.parse(f)) '1.0123456789012346' Python:: $ python Python 2.7.2 (default, Jun 20 2012, 16:23:33) [GCC 4.2.1 Compatible Apple Clang 4.0 (tags/Apple/clang-418.0.60)] on darwin Type "help", "copyright", "credits" or "license" for more information. import json json.dumps(json.loads("1.01234567890123456789012345678901234567890")) '1.0123456789012346' f = json.dumps(json.loads("1.01234567890123456789012345678901234567890")) json.dumps(json.loads(f)) '1.0123456789012346' Ruby:: $ irb --version irb 0.9.5(05/04/13) require 'JSON' => true JSON.dump(JSON.load("[1.01234567890123456789012345678901234567890]")) => "[1.01234567890123]" f = JSON.dump(JSON.load("[1.01234567890123456789012345678901234567890]")) => "[1.01234567890123]" JSON.dump(JSON.load(f)) => "[1.01234567890123]" .. note:: A small aside on Ruby, it requires a top level object or array, so I just wrapped the value. Should be obvious it doesn't affect the result of parsing the number though. Ejson (CouchDB's current parser) at CouchDB sha 168a663b:: $ ./utils/run -i Erlang R14B04 (erts-5.8.5) [source] [64-bit] [smp:2:2] [rq:2] [async-threads:4] [hipe] [kernel-poll:true] Eshell V5.8.5 (abort with ^G) 1> ejson:encode(ejson:decode(<<"1.01234567890123456789012345678901234567890">>)). <<"1.0123456789012346135">> 2> F = ejson:encode(ejson:decode(<<"1.01234567890123456789012345678901234567890">>)). <<"1.0123456789012346135">> 3> ejson:encode(ejson:decode(F)). <<"1.0123456789012346135">> As you can see they all pretty much behave the same except for Ruby actually does appear to be losing some precision over the other libraries. The astute observer will notice that ejson (the CouchDB JSON library) reported an extra three digits. While its tempting to think that this is due to some internal difference, its just a more specific case of the 1.1 input as described above. The important point to realize here is that a double can only hold a finite number of values. What we're doing here is generating a string that when passed through the "standard" floating point parsing algorithms (ie, ``strtod``) will result in the same bit pattern in memory as we started with. Or, slightly different, the bytes in a JSON serialized number are chosen such that they refer to a single specific value that a double can represent. The important point to understand is that we're mapping from one infinite set onto a finite set. An easy way to see this is by reflecting on this:: 1.0 == 1.00 == 1.000 = 1.(infinite zeroes) Obviously a computer can't hold infinite bytes so we have to decimate our infinitely sized set to a finite set that can be represented concisely. The game that other JSON libraries are playing is merely: "How few characters do I have to use to select this specific value for a double" And that game has lots and lots of subtle details that are difficult to duplicate in C without a significant amount of effort (it took Python over a year to get it sorted with their fancy build systems that automatically run on a number of different architectures). Hopefully we've shown that CouchDB is not doing anything "funky" by changing input. Its behaving the same as any other common JSON library does, its just not pretty printing its output. On the other hand, if you actually are in a position where an IEEE-754 double is not a satisfactory datatype for your numbers, then the answer as has been stated is to not pass your numbers through this representation. In JSON this is accomplished by encoding them as a string or by using integer types (although integer types can still bite you if you use a platform that has a different integer representation than normal, ie, JavaScript). Further information can be found easily, including the `Floating Point Guide`_, and `David Goldberg's Reference`_. .. _Floating Point Guide: http://floating-point-gui.de/ .. _David Goldberg's Reference: http://docs.oracle.com/cd/E19957-01/806-3568/ncg_goldberg.html Also, if anyone is really interested in changing this behavior, we're all ears for contributions to `jiffy`_ (which is theoretically going to replace ejson when we get around to updating the build system). The places we've looked for inspiration are TCL and Python. If you know a decent implementation of this float printing algorithm give us a holler. .. _jiffy: https://github.com/davisp/jiffy .. _errors: HTTP Status Codes ================= With the interface to CouchDB working through HTTP, error codes and statuses are reported using a combination of the HTTP status code number, and corresponding data in the body of the response data. A list of the error codes returned by CouchDB, and generic descriptions of the related errors are provided below. The meaning of different status codes for specific request types are provided in the corresponding API call reference. - ``200 - OK`` Request completed successfully. - ``201 - Created`` Document created successfully. - ``202 - Accepted`` Request has been accepted, but the corresponding operation may not have completed. This is used for background operations, such as database compaction. - ``304 - Not Modified`` The additional content requested has not been modified. This is used with the ETag system to identify the version of information returned. - ``400 - Bad Request`` Bad request structure. The error can indicate an error with the request URL, path or headers. Differences in the supplied MD5 hash and content also trigger this error, as this may indicate message corruption. - ``401 - Unauthorized`` The item requested was not available using the supplied authorization, or authorization was not supplied. - ``403 - Forbidden`` The requested item or operation is forbidden. - ``404 - Not Found`` The requested content could not be found. The content will include further information, as a JSON object, if available. The structure will contain two keys, ``error`` and ``reason``. For example: .. code-block:: javascript {"error":"not_found","reason":"no_db_file"} - ``405 - Resource Not Allowed`` A request was made using an invalid HTTP request type for the URL requested. For example, you have requested a ``PUT`` when a ``POST`` is required. Errors of this type can also triggered by invalid URL strings. - ``406 - Not Acceptable`` The requested content type is not supported by the server. - ``409 - Conflict`` Request resulted in an update conflict. - ``412 - Precondition Failed`` The request headers from the client and the capabilities of the server do not match. - ``415 - Bad Content Type`` The content types supported, and the content type of the information being requested or submitted indicate that the content type is not supported. - ``416 - Requested Range Not Satisfiable`` The range specified in the request header cannot be satisfied by the server. - ``417 - Expectation Failed`` When sending documents in bulk, the bulk load operation failed. - ``500 - Internal Server Error`` The request was invalid, either because the supplied JSON was invalid, or invalid information was supplied as part of the request. ��������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������apache-couchdb-1.6.0/share/doc/src/api/document/����������������������������������������������������0000755�0001750�0000144�00000000000�12332106072�021344� 5����������������������������������������������������������������������������������������������������ustar�00djc�����������������������������users���������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������apache-couchdb-1.6.0/share/doc/src/api/document/attachments.rst�������������������������������������0000644�0001750�0000144�00000027032�12332105522�024414� 0����������������������������������������������������������������������������������������������������ustar�00djc�����������������������������users���������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������.. Licensed under the Apache License, Version 2.0 (the "License"); you may not .. use this file except in compliance with the License. You may obtain a copy of .. the License at .. .. http://www.apache.org/licenses/LICENSE-2.0 .. .. Unless required by applicable law or agreed to in writing, software .. distributed under the License is distributed on an "AS IS" BASIS, WITHOUT .. WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the .. License for the specific language governing permissions and limitations under .. the License. .. _api/doc/attachment: ``/db/doc/attachment`` ====================== .. http:head:: /{db}/{docid}/{attname} :synopsis: Returns bare information in the HTTP Headers for the attachment Returns the HTTP headers containing a minimal amount of information about the specified attachment. The method supports the same query arguments as the :get:`/{db}/{docid}/{attname}` method, but only the header information (including attachment size, encoding and the MD5 hash as an :header:`ETag`), is returned. :param db: Database name :param docid: Document ID :param attname: Attachment name :<header If-Match: Document's revision. Alternative to `rev` query parameter :<header If-None-Match: Attachment's base64 encoded MD5 binary digest. *Optional* :query string rev: Document's revision. *Optional* :>header Accept-Ranges: :ref:`Range request aware <api/doc/attachment/range>`. Used for attachments with :mimetype:`application/octet-stream` content type :>header Content-Encoding: Used compression codec. Available if attachment's ``content_type`` is in :config:option:`list of compressiable types <attachments/compressible_types>` :>header Content-Length: Attachment size. If compression codec was used, this value is about compressed size, not actual :>header Content-MD5: Base64 encoded MD5 binary digest :>header ETag: Double quoted base64 encoded MD5 binary digest :code 200: Attachment exists :code 304: Attachment wasn't modified if :header:`ETag` equals specified :header:`If-None-Match` header :code 401: Read privilege required :code 404: Specified database, document or attachment was not found **Request**: .. code-block:: http HEAD /recipes/SpaghettiWithMeatballs/recipe.txt HTTP/1.1 Host: localhost:5984 **Response**: .. code-block:: http HTTP/1.1 200 OK Accept-Ranges: none Cache-Control: must-revalidate Content-Encoding: gzip Content-Length: 100 Content-MD5: vVa/YgiE1+Gh0WfoFJAcSg== Content-Type: text/plain Date: Thu, 15 Aug 2013 12:42:42 GMT ETag: "vVa/YgiE1+Gh0WfoFJAcSg==" Server: CouchDB (Erlang/OTP) .. http:get:: /{db}/{docid}/{attname} :synopsis: Gets the attachment of a document Returns the file attachment associated with the document. The raw data of the associated attachment is returned (just as if you were accessing a static file. The returned :header:`Content-Type` will be the same as the content type set when the document attachment was submitted into the database. :param db: Database name :param docid: Document ID :param attname: Attachment name :<header If-Match: Document's revision. Alternative to `rev` query parameter :<header If-None-Match: Attachment's base64 encoded MD5 binary digest. *Optional* :query string rev: Document's revision. *Optional* :>header Accept-Ranges: :ref:`Range request aware <api/doc/attachment/range>`. Used for attachments with :mimetype:`application/octet-stream` :>header Content-Encoding: Used compression codec. Available if attachment's ``content_type`` is in :config:option:`list of compressiable types <attachments/compressible_types>` :>header Content-Length: Attachment size. If compression codec is used, this value is about compressed size, not actual :>header Content-MD5: Base64 encoded MD5 binary digest :>header ETag: Double quoted base64 encoded MD5 binary digest :response: Stored content :code 200: Attachment exists :code 304: Attachment wasn't modified if :header:`ETag` equals specified :header:`If-None-Match` header :code 401: Read privilege required :code 404: Specified database, document or attachment was not found .. http:put:: /{db}/{docid}/{attname} :synopsis: Adds an attachment of a document Uploads the supplied content as an attachment to the specified document. The attachment name provided must be a URL encoded string. You must also supply either the ``rev`` query argument or the :header:`If-Match` HTTP header for validation, and the HTTP headers (to set the attachment content type). If case when uploading an attachment using an existing attachment name, CouchDB will update the corresponding stored content of the database. Since you must supply the revision information to add an attachment to the document, this serves as validation to update the existing attachment. .. note:: Uploading an attachment updates the corresponding document revision. Revisions are tracked for the parent document, not individual attachments. :param db: Database name :param docid: Document ID :param attname: Attachment name :<header Content-Type: Attachment MIME type. *Required* :<header If-Match: Document revision. Alternative to `rev` query parameter :query string rev: Document revision. *Required* :>header Accept-Ranges: :ref:`Range request aware <api/doc/attachment/range>`. Used for attachments with :mimetype:`application/octet-stream` :>header Content-Encoding: Used compression codec. Available if attachment's ``content_type`` is in :config:option:`list of compressiable types <attachments/compressible_types>` :>header Content-Length: Attachment size. If compression codec is used, this value is about compressed size, not actual :>header Content-MD5: Base64 encoded MD5 binary digest :>header ETag: Double quoted base64 encoded MD5 binary digest :>json string id: Document ID :>json boolean ok: Operation status :>json string rev: Revision MVCC token :code 200: Attachment successfully removed :code 202: Request was accepted, but changes are not yet stored on disk :code 400: Invalid request body or parameters :code 401: Write privileges required :code 404: Specified database, document or attachment was not found :code 409: Document's revision wasn't specified or it's not the latest **Request**: .. code-block:: http PUT /recipes/SpaghettiWithMeatballs/recipe.txt HTTP/1.1 Accept: application/json Content-Length: 86 Content-Type: text/plain Host: localhost:5984 If-Match: 1-917fa2381192822767f010b95b45325b 1. Cook spaghetti 2. Cook meatballs 3. Mix them 4. Add tomato sauce 5. ... 6. PROFIT! **Response**: .. code-block:: http HTTP/1.1 201 Created Cache-Control: must-revalidate Content-Length: 85 Content-Type: application/json Date: Thu, 15 Aug 2013 12:38:04 GMT ETag: "2-ce91aed0129be8f9b0f650a2edcfd0a4" Location: http://localhost:5984/recipes/SpaghettiWithMeatballs/recipe.txt Server: CouchDB (Erlang/OTP) { "id": "SpaghettiWithMeatballs", "ok": true, "rev": "2-ce91aed0129be8f9b0f650a2edcfd0a4" } .. http:delete:: /{db}/{docid}/{attname} :synopsis: Deletes an attachment of a document Deletes the attachment ``attachment`` of the specified ``doc``. You must supply the ``rev`` query parameter or :header:`If-Match` with the current revision to delete the attachment. .. note:: Deleting an attachment updates the corresponding document revision. Revisions are tracked for the parent document, not individual attachments. :param db: Database name :param docid: Document ID :<header Accept: - :mimetype:`application/json` - :mimetype:`text/plain` :<header If-Match: Document revision. Alternative to `rev` query parameter :<header X-Couch-Full-Commit: Overrides server's :config:option:`commit policy <couchdb/delayed_commits>`. Possible values are: ``false`` and ``true``. *Optional* :query string rev: Document revision. *Required* :query string batch: Store changes in :ref:`batch mode <api/doc/batch-writes>` Possible values: ``ok``. *Optional* :>header Content-Type: - :mimetype:`application/json` - :mimetype:`text/plain; charset=utf-8` :>header ETag: Double quoted document's new revision :>json string id: Document ID :>json boolean ok: Operation status :>json string rev: Revision MVCC token :code 200: Attachment successfully removed :code 202: Request was accepted, but changes are not yet stored on disk :code 400: Invalid request body or parameters :code 401: Write privileges required :code 404: Specified database, document or attachment was not found :code 409: Document's revision wasn't specified or it's not the latest **Request**: .. code-block:: http DELETE /recipes/SpaghettiWithMeatballs?rev=6-440b2dd39c20413045748b42c6aba6e2 HTTP/1.1 Accept: application/json Host: localhost:5984 Alternatively, instead of ``rev`` query parameter you may use :header:`If-Match` header: .. code-block:: http DELETE /recipes/SpaghettiWithMeatballs HTTP/1.1 Accept: application/json If-Match: 6-440b2dd39c20413045748b42c6aba6e2 Host: localhost:5984 **Response**: .. code-block:: http HTTP/1.1 200 OK Cache-Control: must-revalidate Content-Length: 85 Content-Type: application/json Date: Wed, 14 Aug 2013 12:23:13 GMT ETag: "7-05185cf5fcdf4b6da360af939431d466" Server: CouchDB (Erlang/OTP) { "id": "SpaghettiWithMeatballs", "ok": true, "rev": "7-05185cf5fcdf4b6da360af939431d466" } .. _api/doc/attachment/range: HTTP Range Requests ------------------- HTTP allows you to specify byte ranges for requests. This allows the implementation of resumable downloads and skippable audio and video streams alike. This is available for all attachments inside CouchDB. This is just a real quick run through how this looks under the hood. Usually, you will have larger binary files to serve from CouchDB, like MP3s and videos, but to make things a little more obvious, I use a text file here (Note that I use the :mimetype:`application/octet-stream` :header`Content-Type` instead of :mimetype:`text/plain`). .. code-block:: bash shell> cat file.txt My hovercraft is full of eels! Now let's store this text file as an attachment in CouchDB. First, we create a database: .. code-block:: bash shell> curl -X PUT http://127.0.0.1:5984/test {"ok":true} Then we create a new document and the file attachment in one go: .. code-block:: bash shell> curl -X PUT http://127.0.0.1:5984/test/doc/file.txt \ -H "Content-Type: application/octet-stream" -d@file.txt {"ok":true,"id":"doc","rev":"1-287a28fa680ae0c7fb4729bf0c6e0cf2"} Now we can request the whole file easily: .. code-block:: bash shell> curl -X GET http://127.0.0.1:5984/test/doc/file.txt My hovercraft is full of eels! But say we only want the first 13 bytes: .. code-block:: bash shell> curl -X GET http://127.0.0.1:5984/test/doc/file.txt \ -H "Range: bytes=0-12" My hovercraft HTTP supports many ways to specify single and even multiple byte ranges. Read all about it in :rfc:`2616#section-14.27`. .. note:: Databases that have been created with CouchDB 1.0.2 or earlier will support range requests in |version|, but they are using a less-optimal algorithm. If you plan to make heavy use of this feature, make sure to compact your database with CouchDB |version| to take advantage of a better algorithm to find byte ranges. ������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������apache-couchdb-1.6.0/share/doc/src/api/document/index.rst�������������������������������������������0000644�0001750�0000144�00000001324�12332105522�023204� 0����������������������������������������������������������������������������������������������������ustar�00djc�����������������������������users���������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������.. Licensed under the Apache License, Version 2.0 (the "License"); you may not .. use this file except in compliance with the License. You may obtain a copy of .. the License at .. .. http://www.apache.org/licenses/LICENSE-2.0 .. .. Unless required by applicable law or agreed to in writing, software .. distributed under the License is distributed on an "AS IS" BASIS, WITHOUT .. WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the .. License for the specific language governing permissions and limitations under .. the License. .. _api/document: ========= Documents ========= Details on how to create, read, update and delete documents within a database. .. toctree:: common attachments ������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������apache-couchdb-1.6.0/share/doc/src/api/document/common.rst������������������������������������������0000644�0001750�0000144�00000110223�12332105522�023364� 0����������������������������������������������������������������������������������������������������ustar�00djc�����������������������������users���������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������.. Licensed under the Apache License, Version 2.0 (the "License"); you may not .. use this file except in compliance with the License. You may obtain a copy of .. the License at .. .. http://www.apache.org/licenses/LICENSE-2.0 .. .. Unless required by applicable law or agreed to in writing, software .. distributed under the License is distributed on an "AS IS" BASIS, WITHOUT .. WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the .. License for the specific language governing permissions and limitations under .. the License. .. _api/doc: ``/db/doc`` =========== .. http:head:: /{db}/{docid} :synopsis: Returns bare information in the HTTP Headers for the document Returns the HTTP Headers containing a minimal amount of information about the specified document. The method supports the same query arguments as the :get:`/{db}/{docid}` method, but only the header information (including document size, and the revision as an ETag), is returned. The :header:`ETag` header shows the current revision for the requested document, and the :header:`Content-Length` specifies the length of the data, if the document were requested in full. Adding any of the query arguments (see :get:`/{db}/{docid}`), then the resulting HTTP Headers will correspond to what would be returned. :param db: Database name :param docid: Document ID :<header If-None-Match: Double quoted document's revision token :>header Content-Length: Document size :>header ETag: Double quoted document's revision token :code 200: Document exists :code 304: Document wasn't modified since specified revision :code 401: Read privilege required :code 404: Document not found **Request**: .. code-block:: http GET /db/SpaghettiWithMeatballs HTTP/1.1 Accept: application/json Host: localhost:5984 **Response**: .. code-block:: http HTTP/1.1 200 OK Cache-Control: must-revalidate Content-Length: 660 Content-Type: application/json Date: Tue, 13 Aug 2013 21:35:37 GMT ETag: "12-151bb8678d45aaa949ec3698ef1c7e78" Server: CouchDB (Erlang/OTP) .. http:get:: /{db}/{docid} :synopsis: Returns the document Returns document by the specified ``docid`` from the specified ``db``. Unless you request a specific revision, the latest revision of the document will always be returned. :param db: Database name :param docid: Document ID :<header Accept: - :mimetype:`application/json` - :mimetype:`multipart/mixed` - :mimetype:`text/plain` :<header If-None-Match: Double quoted document's revision token :query boolean attachments: Includes attachments bodies in response. Default is ``false`` :query boolean att_encoding_info: Includes encoding information in attachment stubs if the particular attachment is compressed. Default is ``false``. :query array atts_since: Includes attachments only since specified revisions. Doesn't includes attachments for specified revisions. *Optional* :query boolean conflicts: Includes information about conflicts in document. Default is ``false`` :query boolean deleted_conflicts: Includes information about deleted conflicted revisions. Default is ``false`` :query boolean latest: Forces retrieving latest "leaf" revision, no matter what `rev` was requested. Default is ``false`` :query boolean local_seq: Includes last update sequence number for the document. Default is ``false`` :query boolean meta: Acts same as specifying all `conflicts`, `deleted_conflicts` and `open_revs` query parameters. Default is ``false`` :query array open_revs: Retrieves documents of specified leaf revisions. Additionally, it accepts value as ``all`` to return all leaf revisions. *Optional* :query string rev: Retrieves document of specified revision. *Optional* :query boolean revs: Includes list of all known document revisions. Default is ``false`` :query boolean revs_info: Includes detailed information for all known document revisions. Default is ``false`` :>header Content-Type: - :mimetype:`application/json` - :mimetype:`multipart/mixed` - :mimetype:`text/plain; charset=utf-8` :>header ETag: Double quoted document's revision token. Not available when retrieving conflicts-related information :>header Transfer-Encoding: ``chunked``. Available if requested with query parameter ``open_revs`` :>json string _id: Document ID :>json string _rev: Revision MVCC token :>json boolean _deleted: Deletion flag. Available if document was removed :>json object _attachments: Attachment's stubs. Available if document has any attachments :>json array _conflicts: List of conflicted revisions. Available if requested with ``conflicts=true`` query parameter :>json array _deleted_conflicts: List of deleted conflicted revisions. Available if requested with ``deleted_conflicts=true`` query parameter :>json number _local_seq: Document's sequence number in current database. Available if requested with ``local_seq=true`` query parameter :>json array _revs_info: List of objects with information about local revisions and their status. Available if requested with ``open_revs`` query parameter :>json object _revisions: List of local revision tokens without. Available if requested with ``revs=true`` query parameter :code 200: Request completed successfully :code 304: Document wasn't modified since specified revision :code 400: The format of the request or revision was invalid :code 401: Read privilege required :code 404: Document not found **Request**: .. code-block:: http GET /recipes/SpaghettiWithMeatballs HTTP/1.1 Accept: application/json Host: localhost:5984 **Response**: .. code-block:: http HTTP/1.1 200 OK Cache-Control: must-revalidate Content-Length: 660 Content-Type: application/json Date: Tue, 13 Aug 2013 21:35:37 GMT ETag: "1-917fa2381192822767f010b95b45325b" Server: CouchDB (Erlang/OTP) { "_id": "SpaghettiWithMeatballs", "_rev": "1-917fa2381192822767f010b95b45325b", "description": "An Italian-American dish that usually consists of spaghetti, tomato sauce and meatballs.", "ingredients": [ "spaghetti", "tomato sauce", "meatballs" ], "name": "Spaghetti with meatballs" } .. http:put:: /{db}/{docid} :synopsis: Creates a new document or new version of an existing document The :method:`PUT` method creates a new named document, or creates a new revision of the existing document. Unlike the :post:`/{db}`, you must specify the document ID in the request URL. :param db: Database name :param docid: Document ID :<header Accept: - :mimetype:`application/json` - :mimetype:`text/plain` :<header Content-Type: :mimetype:`application/json` :<header If-Match: Document's revision. Alternative to `rev` query parameter :<header X-Couch-Full-Commit: Overrides server's :config:option:`commit policy <couchdb/delayed_commits>`. Possible values are: ``false`` and ``true``. *Optional* :query string batch: Stores document in :ref:`batch mode <api/doc/batch-writes>` Possible values: ``ok``. *Optional* :>header Content-Type: - :mimetype:`application/json` - :mimetype:`text/plain; charset=utf-8` :>header ETag: Quoted document's new revision :>header Location: Document URI :>json string id: Document ID :>json boolean ok: Operation status :>json string rev: Revision MVCC token :code 201: Document created and stored on disk :code 202: Document data accepted, but not yet stored on disk :code 400: Invalid request body or parameters :code 401: Write privileges required :code 404: Specified database or document ID doesn't exists :code 409: Document with the specified ID already exists or specified revision is not latest for target document **Request**: .. code-block:: http PUT /recipes/SpaghettiWithMeatballs HTTP/1.1 Accept: application/json Content-Length: 196 Content-Type: application/json Host: localhost:5984 { "description": "An Italian-American dish that usually consists of spaghetti, tomato sauce and meatballs.", "ingredients": [ "spaghetti", "tomato sauce", "meatballs" ], "name": "Spaghetti with meatballs" } **Response**: .. code-block:: http HTTP/1.1 201 Created Cache-Control: must-revalidate Content-Length: 85 Content-Type: application/json Date: Wed, 14 Aug 2013 20:31:39 GMT ETag: "1-917fa2381192822767f010b95b45325b" Location: http://localhost:5984/recipes/SpaghettiWithMeatballs Server: CouchDB (Erlang/OTP) { "id": "SpaghettiWithMeatballs", "ok": true, "rev": "1-917fa2381192822767f010b95b45325b" } .. http:delete:: /{db}/{docid} :synopsis: Deletes the document Marks the specified document as deleted by adding a field ``_deleted`` with the value ``true``. Documents with this field will not be returned within requests anymore, but stay in the database. You must supply the current (latest) revision, either by using the ``rev`` parameter or by using the :header:`If-Match` header to specify the revision. .. seealso:: :ref:`Retrieving Deleted Documents <api/doc/retrieving-deleted-documents>` .. note:: CouchDB doesn't actually delete documents. The reason is the need to track them correctly during the replication process between databases to prevent accidental document recovery for any previous state. :param db: Database name :param docid: Document ID :<header Accept: - :mimetype:`application/json` - :mimetype:`text/plain` :<header If-Match: Document's revision. Alternative to `rev` query parameter :<header X-Couch-Full-Commit: Overrides server's :config:option:`commit policy <couchdb/delayed_commits>`. Possible values are: ``false`` and ``true``. *Optional* :query string rev: Actual document's revision :query string batch: Stores document in :ref:`batch mode <api/doc/batch-writes>` Possible values: ``ok``. *Optional* :>header Content-Type: - :mimetype:`application/json` - :mimetype:`text/plain; charset=utf-8` :>header ETag: Double quoted document's new revision :>json string id: Document ID :>json boolean ok: Operation status :>json string rev: Revision MVCC token :code 200: Document successfully removed :code 202: Request was accepted, but changes are not yet stored on disk :code 400: Invalid request body or parameters :code 401: Write privileges required :code 404: Specified database or document ID doesn't exists :code 409: Specified revision is not the latest for target document **Request**: .. code-block:: http DELETE /recipes/FishStew?rev=1-9c65296036141e575d32ba9c034dd3ee HTTP/1.1 Accept: application/json Host: localhost:5984 Alternatively, instead of ``rev`` query parameter you may use :header:`If-Match` header: .. code-block:: http DELETE /recipes/FishStew HTTP/1.1 Accept: application/json If-Match: 1-9c65296036141e575d32ba9c034dd3ee Host: localhost:5984 **Response**: .. code-block:: http HTTP/1.1 200 OK Cache-Control: must-revalidate Content-Length: 71 Content-Type: application/json Date: Wed, 14 Aug 2013 12:23:13 GMT ETag: "2-056f5f44046ecafc08a2bc2b9c229e20" Server: CouchDB (Erlang/OTP) { "id": "FishStew", "ok": true, "rev": "2-056f5f44046ecafc08a2bc2b9c229e20" } .. http:copy:: /{db}/{docid} :synopsis: Copies the document within the same database The :method:`COPY` (which is non-standard HTTP) copies an existing document to a new or existing document. The source document is specified on the request line, with the :header:`Destination` header of the request specifying the target document. :param db: Database name :param docid: Document ID :<header Accept: - :mimetype:`application/json` - :mimetype:`text/plain` :<header Destination: Destination document :<header If-Match: Source document's revision. Alternative to `rev` query parameter :<header X-Couch-Full-Commit: Overrides server's :config:option:`commit policy <couchdb/delayed_commits>`. Possible values are: ``false`` and ``true``. *Optional* :query string rev: Revision to copy from. *Optional* :query string batch: Stores document in :ref:`batch mode <api/doc/batch-writes>` Possible values: ``ok``. *Optional* :>header Content-Type: - :mimetype:`application/json` - :mimetype:`text/plain; charset=utf-8` :>header ETag: Double quoted document's new revision :>header Location: Document URI :>json string id: Document document ID :>json boolean ok: Operation status :>json string rev: Revision MVCC token :code 201: Document successfully created :code 202: Request was accepted, but changes are not yet stored on disk :code 400: Invalid request body or parameters :code 401: Read or write privileges required :code 404: Specified database, document ID or revision doesn't exists :code 409: Document with the specified ID already exists or specified revision is not latest for target document **Request**: .. code-block:: http COPY /recipes/SpaghettiWithMeatballs HTTP/1.1 Accept: application/json Destination: SpaghettiWithMeatballs_Italian Host: localhost:5984 **Response**: .. code-block:: http HTTP/1.1 201 Created Cache-Control: must-revalidate Content-Length: 93 Content-Type: application/json Date: Wed, 14 Aug 2013 14:21:00 GMT ETag: "1-e86fdf912560c2321a5fcefc6264e6d9" Location: http://localhost:5984/recipes/SpaghettiWithMeatballs_Italian Server: CouchDB (Erlang/OTP) { "id": "SpaghettiWithMeatballs_Italian", "ok": true, "rev": "1-e86fdf912560c2321a5fcefc6264e6d9" } .. _api/doc/attachments: Attachments ----------- If the document includes attachments, then the returned structure will contain a summary of the attachments associated with the document, but not the attachment data itself. The JSON for the returned document will include the ``_attachments`` field, with one or more attachment definitions. The ``_attachments`` object keys are attachments names while values are information objects with next structure: - **content_type** (*string*): Attachment MIME type - **data** (*string*): Base64-encoded content. Available if attachment content is requested by using the following query parameters: - ``attachments=true`` when querying a document - ``attachments=true&include_docs=true`` when querying a :ref:`changes feed <api/db/changes>` or a :ref:`view <api/ddoc/view>` - ``atts_since``. - **digest** (*string*): Content hash digest. It starts with prefix which announce hash type (``md5-``) and continues with Base64-encoded hash digest - **encoded_length** (*number*): Compressed attachment size in bytes. Available if ``content_type`` is in :config:option:`list of compressible types <attachments/compressible_types>` when the attachment was added and the following query parameters are specified: - ``att_encoding_info=true`` when querying a document - ``att_encoding_info=true&include_docs=true`` when querying a :ref:`changes feed <api/db/changes>` or a :ref:`view <api/ddoc/view>` - **encoding** (*string*): Compression codec. Available if ``content_type`` is in :config:option:`list of compressible types <attachments/compressible_types>` when the attachment was added and the following query parameters are specified: - ``att_encoding_info=true`` when querying a document - ``att_encoding_info=true&include_docs=true`` when querying a :ref:`changes feed <api/db/changes>` or a :ref:`view <api/ddoc/view>` - **length** (*number*): Real attachment size in bytes. Not available if attachment content requested - **revpos** (*number*): Revision *number* when attachment was added - **stub** (*boolean*): Has ``true`` value if object contains stub info and no content. Otherwise omitted in response Basic Attachments Info ^^^^^^^^^^^^^^^^^^^^^^ **Request**: .. code-block:: http GET /recipes/SpaghettiWithMeatballs HTTP/1.1 Accept: application/json Host: localhost:5984 **Response**: .. code-block:: http HTTP/1.1 200 OK Cache-Control: must-revalidate Content-Length: 660 Content-Type: application/json Date: Tue, 13 Aug 2013 21:35:37 GMT ETag: "5-fd96acb3256302bf0dd2f32713161f2a" Server: CouchDB (Erlang/OTP) { "_attachments": { "grandma_recipe.txt": { "content_type": "text/plain", "digest": "md5-Ids41vtv725jyrN7iUvMcQ==", "length": 1872, "revpos": 4, "stub": true }, "my_recipe.txt": { "content_type": "text/plain", "digest": "md5-198BPPNiT5fqlLxoYYbjBA==", "length": 85, "revpos": 5, "stub": true }, "photo.jpg": { "content_type": "image/jpeg", "digest": "md5-7Pv4HW2822WY1r/3WDbPug==", "length": 165504, "revpos": 2, "stub": true } }, "_id": "SpaghettiWithMeatballs", "_rev": "5-fd96acb3256302bf0dd2f32713161f2a", "description": "An Italian-American dish that usually consists of spaghetti, tomato sauce and meatballs.", "ingredients": [ "spaghetti", "tomato sauce", "meatballs" ], "name": "Spaghetti with meatballs" } .. _api/doc/retrieving-deleted-documents: Retrieving Attachments Content ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ It's possible to retrieve document with all attached files content by using ``attachements=true`` query parameter: **Request**: .. code-block:: http GET /db/pixel?attachments=true HTTP/1.1 Accept: application/json Host: localhost:5984 **Response**: .. code-block:: http HTTP/1.1 200 OK Cache-Control: must-revalidate Content-Length: 553 Content-Type: application/json Date: Wed, 14 Aug 2013 11:32:40 GMT ETag: "4-f1bcae4bf7bbb92310079e632abfe3f4" Server: CouchDB (Erlang/OTP) { "_attachments": { "pixel.gif": { "content_type": "image/gif", "data": "R0lGODlhAQABAIAAAAAAAP///yH5BAEAAAAALAAAAAABAAEAAAIBRAA7", "digest": "md5-2JdGiI2i2VELZKnwMers1Q==", "revpos": 2 }, "pixel.png": { "content_type": "image/png", "data": "iVBORw0KGgoAAAANSUhEUgAAAAEAAAABAQMAAAAl21bKAAAAAXNSR0IArs4c6QAAAANQTFRFAAAAp3o92gAAAAF0Uk5TAEDm2GYAAAABYktHRACIBR1IAAAACXBIWXMAAAsTAAALEwEAmpwYAAAAB3RJTUUH3QgOCx8VHgmcNwAAAApJREFUCNdjYAAAAAIAAeIhvDMAAAAASUVORK5CYII=", "digest": "md5-Dgf5zxgGuchWrve73evvGQ==", "revpos": 3 } }, "_id": "pixel", "_rev": "4-f1bcae4bf7bbb92310079e632abfe3f4" } Or retrieve attached files content since specific revision using ``atts_since`` query parameter: **Request**: .. code-block:: http GET /recipes/SpaghettiWithMeatballs?atts_since=[%224-874985bc28906155ba0e2e0538f67b05%22] HTTP/1.1 Accept: application/json Host: localhost:5984 **Response**: .. code-block:: http HTTP/1.1 200 OK Cache-Control: must-revalidate Content-Length: 760 Content-Type: application/json Date: Tue, 13 Aug 2013 21:35:37 GMT ETag: "5-fd96acb3256302bf0dd2f32713161f2a" Server: CouchDB (Erlang/OTP) { "_attachments": { "grandma_recipe.txt": { "content_type": "text/plain", "digest": "md5-Ids41vtv725jyrN7iUvMcQ==", "length": 1872, "revpos": 4, "stub": true }, "my_recipe.txt": { "content_type": "text/plain", "data": "MS4gQ29vayBzcGFnaGV0dGkKMi4gQ29vayBtZWV0YmFsbHMKMy4gTWl4IHRoZW0KNC4gQWRkIHRvbWF0byBzYXVjZQo1LiAuLi4KNi4gUFJPRklUIQ==", "digest": "md5-198BPPNiT5fqlLxoYYbjBA==", "revpos": 5 }, "photo.jpg": { "content_type": "image/jpeg", "digest": "md5-7Pv4HW2822WY1r/3WDbPug==", "length": 165504, "revpos": 2, "stub": true } }, "_id": "SpaghettiWithMeatballs", "_rev": "5-fd96acb3256302bf0dd2f32713161f2a", "description": "An Italian-American dish that usually consists of spaghetti, tomato sauce and meatballs.", "ingredients": [ "spaghetti", "tomato sauce", "meatballs" ], "name": "Spaghetti with meatballs" } Efficient Multiple Attachments Retrieving ````````````````````````````````````````` As you had noted above, retrieving document with ``attachements=true`` returns large JSON object where all attachments are included. While you document and files are smaller it's ok, but if you have attached something bigger like media files (audio/video), parsing such response might be very expensive. To solve this problem, CouchDB allows to get documents in :mimetype:`multipart/related` format: **Request**: .. code-block:: http GET /recipes/secret?attachments=true HTTP/1.1 Accept: multipart/related Host: localhost:5984 **Response**: .. code-block:: http HTTP/1.1 200 OK Content-Length: 538 Content-Type: multipart/related; boundary="e89b3e29388aef23453450d10e5aaed0" Date: Sat, 28 Sep 2013 08:08:22 GMT ETag: "2-c1c6c44c4bc3c9344b037c8690468605" Server: CouchDB (Erlang OTP) --e89b3e29388aef23453450d10e5aaed0 Content-Type: application/json {"_id":"secret","_rev":"2-c1c6c44c4bc3c9344b037c8690468605","_attachments":{"recipe.txt":{"content_type":"text/plain","revpos":2,"digest":"md5-HV9aXJdEnu0xnMQYTKgOFA==","length":86,"follows":true}}} --e89b3e29388aef23453450d10e5aaed0 Content-Disposition: attachment; filename="recipe.txt" Content-Type: text/plain Content-Length: 86 1. Take R 2. Take E 3. Mix with L 4. Add some A 5. Serve with X --e89b3e29388aef23453450d10e5aaed0-- In this response the document contains only attachments stub information and quite short while all attachments goes as separate entities which reduces memory footprint and processing overhead (you'd noticed, that attachment content goes as raw data, not in base64 encoding, right?). Retrieving Attachments Encoding Info ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ By using ``att_encoding_info=true`` query parameter you may retrieve information about compressed attachments size and used codec. **Request**: .. code-block:: http GET /recipes/SpaghettiWithMeatballs?att_encoding_info=true HTTP/1.1 Accept: application/json Host: localhost:5984 **Response**: .. code-block:: http HTTP/1.1 200 OK Cache-Control: must-revalidate Content-Length: 736 Content-Type: application/json Date: Tue, 13 Aug 2013 21:35:37 GMT ETag: "5-fd96acb3256302bf0dd2f32713161f2a" Server: CouchDB (Erlang/OTP) { "_attachments": { "grandma_recipe.txt": { "content_type": "text/plain", "digest": "md5-Ids41vtv725jyrN7iUvMcQ==", "encoded_length": 693, "encoding": "gzip", "length": 1872, "revpos": 4, "stub": true }, "my_recipe.txt": { "content_type": "text/plain", "digest": "md5-198BPPNiT5fqlLxoYYbjBA==", "encoded_length": 100, "encoding": "gzip", "length": 85, "revpos": 5, "stub": true }, "photo.jpg": { "content_type": "image/jpeg", "digest": "md5-7Pv4HW2822WY1r/3WDbPug==", "length": 165504, "revpos": 2, "stub": true } }, "_id": "SpaghettiWithMeatballs", "_rev": "5-fd96acb3256302bf0dd2f32713161f2a", "description": "An Italian-American dish that usually consists of spaghetti, tomato sauce and meatballs.", "ingredients": [ "spaghetti", "tomato sauce", "meatballs" ], "name": "Spaghetti with meatballs" } Creating Multiple Attachments ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ To create a document with multiple attachments with single request you need just inline base64 encoded attachments data into the document body: .. code-block:: javascript { "_id":"multiple_attachments", "_attachments": { "foo.txt": { "content_type":"text\/plain", "data": "VGhpcyBpcyBhIGJhc2U2NCBlbmNvZGVkIHRleHQ=" }, "bar.txt": { "content_type":"text\/plain", "data": "VGhpcyBpcyBhIGJhc2U2NCBlbmNvZGVkIHRleHQ=" } } } Alternatively, you can upload a document with attachments more efficiently in :mimetype:`multipart/related` format. This avoids having to Base64-encode the attachments, saving CPU and bandwidth. To do this, set the :header:`Content-Type` header of the :put:`/{db}/{docid}` request to :mimetype:`multipart/related`. The first MIME body is the document itself, which should have its own :header:`Content-Type` of :mimetype:`application/json"`. It also should include an ``_attachments`` metadata object in which each attachment object has a key ``follows`` with value ``true``. The subsequent MIME bodies are the attachments. **Request**: .. code-block:: http PUT /temp/somedoc HTTP/1.1 Accept: application/json Content-Length: 372 Content-Type: multipart/related;boundary="abc123" Host: localhost:5984 User-Agent: HTTPie/0.6.0 --abc123 Content-Type: application/json { "body": "This is a body.", "_attachments": { "foo.txt": { "follows": true, "content_type": "text/plain", "length": 21 }, "bar.txt": { "follows": true, "content_type": "text/plain", "length": 20 } } } --abc123 this is 21 chars long --abc123 this is 20 chars lon --abc123-- **Response**: .. code-block:: http HTTP/1.1 201 Created Cache-Control: must-revalidate Content-Length: 72 Content-Type: application/json Date: Sat, 28 Sep 2013 09:13:24 GMT ETag: "1-5575e26acdeb1df561bb5b70b26ba151" Location: http://localhost:5984/temp/somedoc Server: CouchDB (Erlang OTP) { "id": "somedoc", "ok": true, "rev": "1-5575e26acdeb1df561bb5b70b26ba151" } Getting a List of Revisions --------------------------- You can obtain a list of the revisions for a given document by adding the ``revs=true`` parameter to the request URL: **Request**: .. code-block:: http GET /recipes/SpaghettiWithMeatballs?revs=true HTTP/1.1 Accept: application/json Host: localhost:5984 **Response**: .. code-block:: http HTTP/1.1 200 OK Cache-Control: must-revalidate Content-Length: 584 Content-Type: application/json Date: Wed, 14 Aug 2013 11:38:26 GMT ETag: "5-fd96acb3256302bf0dd2f32713161f2a" Server: CouchDB (Erlang/OTP) { "_id": "SpaghettiWithMeatballs", "_rev": "8-6f5ad8db0f34af24a6e0984cd1a6cfb9", "_revisions": { "ids": [ "6f5ad8db0f34af24a6e0984cd1a6cfb9", "77fba3a059497f51ec99b9b478b569d2", "136813b440a00a24834f5cb1ddf5b1f1", "fd96acb3256302bf0dd2f32713161f2a", "874985bc28906155ba0e2e0538f67b05", "0de77a37463bf391d14283e626831f2e", "d795d1b924777732fdea76538c558b62", "917fa2381192822767f010b95b45325b" ], "start": 8 }, "description": "An Italian-American dish that usually consists of spaghetti, tomato sauce and meatballs.", "ingredients": [ "spaghetti", "tomato sauce", "meatballs" ], "name": "Spaghetti with meatballs" } The returned JSON structure includes the original document, including a ``_revisions`` structure that includes the revision information in next form: - **ids** (*array*): Array of valid revision IDs, in reverse order (latest first) - **start** (*number*): Prefix number for the latest revision Obtaining an Extended Revision History -------------------------------------- You can get additional information about the revisions for a given document by supplying the ``revs_info`` argument to the query: **Request**: .. code-block:: http GET /recipes/SpaghettiWithMeatballs?revs_info=true HTTP/1.1 Accept: application/json Host: localhost:5984 **Response**: .. code-block:: http HTTP/1.1 200 OK Cache-Control: must-revalidate Content-Length: 802 Content-Type: application/json Date: Wed, 14 Aug 2013 11:40:55 GMT Server: CouchDB (Erlang/OTP) { "_id": "SpaghettiWithMeatballs", "_rev": "8-6f5ad8db0f34af24a6e0984cd1a6cfb9", "_revs_info": [ { "rev": "8-6f5ad8db0f34af24a6e0984cd1a6cfb9", "status": "available" }, { "rev": "7-77fba3a059497f51ec99b9b478b569d2", "status": "deleted" }, { "rev": "6-136813b440a00a24834f5cb1ddf5b1f1", "status": "available" }, { "rev": "5-fd96acb3256302bf0dd2f32713161f2a", "status": "missing" }, { "rev": "4-874985bc28906155ba0e2e0538f67b05", "status": "missing" }, { "rev": "3-0de77a37463bf391d14283e626831f2e", "status": "missing" }, { "rev": "2-d795d1b924777732fdea76538c558b62", "status": "missing" }, { "rev": "1-917fa2381192822767f010b95b45325b", "status": "missing" } ], "description": "An Italian-American dish that usually consists of spaghetti, tomato sauce and meatballs.", "ingredients": [ "spaghetti", "tomato sauce", "meatballs" ], "name": "Spaghetti with meatballs" } The returned document contains ``_revs_info`` field with extended revision information, including the availability and status of each revision. This array field contains objects with following structure: - **rev** (*string*): Full revision string - **status** (*string*): Status of the revision. Maybe one of: - ``available``: Revision is available for retrieving with `rev` query parameter - ``missing``: Revision is not available - ``deleted``: Revision belongs to deleted document Obtaining a Specific Revision ----------------------------- To get a specific revision, use the ``rev`` argument to the request, and specify the full revision number. The specified revision of the document will be returned, including a ``_rev`` field specifying the revision that was requested. **Request**: .. code-block:: http GET /recipes/SpaghettiWithMeatballs?rev=6-136813b440a00a24834f5cb1ddf5b1f1 HTTP/1.1 Accept: application/json Host: localhost:5984 **Response**: .. code-block:: http HTTP/1.1 200 OK Cache-Control: must-revalidate Content-Length: 271 Content-Type: application/json Date: Wed, 14 Aug 2013 11:40:55 GMT Server: CouchDB (Erlang/OTP) { "_id": "SpaghettiWithMeatballs", "_rev": "6-136813b440a00a24834f5cb1ddf5b1f1", "description": "An Italian-American dish that usually consists of spaghetti, tomato sauce and meatballs.", "ingredients": [ "spaghetti", "tomato sauce", "meatballs" ], "name": "Spaghetti with meatballs" } Retrieving Deleted Documents ^^^^^^^^^^^^^^^^^^^^^^^^^^^^ CouchDB doesn't actually deletes documents via :delete:`/{db}/{docid}`. Instead of this, it leaves tombstone with very basic information about document. If you just :get:`/{db}/{docid}` CouchDB returns :statuscode:`404` response: **Request**: .. code-block:: http GET /recipes/FishStew HTTP/1.1 Accept: application/json Host: localhost:5984 **Response**: .. code-block:: http HTTP/1.1 404 Object Not Found Cache-Control: must-revalidate Content-Length: 41 Content-Type: application/json Date: Wed, 14 Aug 2013 12:23:27 GMT Server: CouchDB (Erlang/OTP) { "error": "not_found", "reason": "deleted" } However, you may retrieve document's tombstone by using ``rev`` query parameter with :get:`/{db}/{docid}` request: **Request**: .. code-block:: http GET /recipes/FishStew?rev=2-056f5f44046ecafc08a2bc2b9c229e20 HTTP/1.1 Accept: application/json Host: localhost:5984 **Response**: .. code-block:: http HTTP/1.1 200 OK Cache-Control: must-revalidate Content-Length: 79 Content-Type: application/json Date: Wed, 14 Aug 2013 12:30:22 GMT ETag: "2-056f5f44046ecafc08a2bc2b9c229e20" Server: CouchDB (Erlang/OTP) { "_deleted": true, "_id": "FishStew", "_rev": "2-056f5f44046ecafc08a2bc2b9c229e20" } Updating an Existing Document ----------------------------- To update an existing document you must specify the current revision number within the ``_rev`` parameter. **Request**: .. code-block:: http PUT /recipes/SpaghettiWithMeatballs HTTP/1.1 Accept: application/json Content-Length: 258 Content-Type: application/json Host: localhost:5984 { "_rev": "1-917fa2381192822767f010b95b45325b", "description": "An Italian-American dish that usually consists of spaghetti, tomato sauce and meatballs.", "ingredients": [ "spaghetti", "tomato sauce", "meatballs" ], "name": "Spaghetti with meatballs", "serving": "hot" } Alternatively, you can supply the current revision number in the ``If-Match`` HTTP header of the request: .. code-block:: http PUT /recipes/SpaghettiWithMeatballs HTTP/1.1 Accept: application/json Content-Length: 258 Content-Type: application/json If-Match: 1-917fa2381192822767f010b95b45325b Host: localhost:5984 { "description": "An Italian-American dish that usually consists of spaghetti, tomato sauce and meatballs.", "ingredients": [ "spaghetti", "tomato sauce", "meatballs" ], "name": "Spaghetti with meatballs", "serving": "hot" } **Response**: .. code-block:: http HTTP/1.1 201 Created Cache-Control: must-revalidate Content-Length: 85 Content-Type: application/json Date: Wed, 14 Aug 2013 20:33:56 GMT ETag: "2-790895a73b63fb91dd863388398483dd" Location: http://localhost:5984/recipes/SpaghettiWithMeatballs Server: CouchDB (Erlang/OTP) { "id": "SpaghettiWithMeatballs", "ok": true, "rev": "2-790895a73b63fb91dd863388398483dd" } Copying from a Specific Revision -------------------------------- To copy *from* a specific version, use the ``rev`` argument to the query string or :header:`If-Match`: **Request**: .. code-block:: http COPY /recipes/SpaghettiWithMeatballs HTTP/1.1 Accept: application/json Destination: http://localhost:5984/recipes_old/SpaghettiWithMeatballs_Original If-Match: 1-917fa2381192822767f010b95b45325b Host: localhost:5984 **Response**: .. code-block:: http HTTP/1.1 201 Created Cache-Control: must-revalidate Content-Length: 93 Content-Type: application/json Date: Wed, 14 Aug 2013 14:21:00 GMT ETag: "1-917fa2381192822767f010b95b45325b" Location: http://localhost:5984/recipes_old/SpaghettiWithMeatballs_Original Server: CouchDB (Erlang/OTP) { "id": "SpaghettiWithMeatballs_Original", "ok": true, "rev": "1-917fa2381192822767f010b95b45325b" } Copying to an Existing Document ------------------------------- To copy to an existing document, you must specify the current revision string for the target document by appending the ``rev`` parameter to the :header:`Destination` header string. **Request**: .. code-block:: http COPY /recipes/SpaghettiWithMeatballs?rev=8-6f5ad8db0f34af24a6e0984cd1a6cfb9 HTTP/1.1 Accept: application/json Destination: http://localhost:5984/recipes_old/SpaghettiWithMeatballs_Original?rev=1-917fa2381192822767f010b95b45325b Host: localhost:5984 **Response**: .. code-block:: http HTTP/1.1 201 Created Cache-Control: must-revalidate Content-Length: 93 Content-Type: application/json Date: Wed, 14 Aug 2013 14:21:00 GMT ETag: "2-62e778c9ec09214dd685a981dcc24074"" Location: http://localhost:5984/recipes_old/SpaghettiWithMeatballs_Original Server: CouchDB (Erlang/OTP) { "id": "SpaghettiWithMeatballs_Original", "ok": true, "rev": "2-62e778c9ec09214dd685a981dcc24074" } �����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������apache-couchdb-1.6.0/share/doc/src/cve/�������������������������������������������������������������0000755�0001750�0000144�00000000000�12332106072�017532� 5����������������������������������������������������������������������������������������������������ustar�00djc�����������������������������users���������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������apache-couchdb-1.6.0/share/doc/src/cve/2010-0009.rst������������������������������������������������0000644�0001750�0000144�00000003137�12332105522�021237� 0����������������������������������������������������������������������������������������������������ustar�00djc�����������������������������users���������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������.. Licensed under the Apache License, Version 2.0 (the "License"); you may not .. use this file except in compliance with the License. You may obtain a copy of .. the License at .. .. http://www.apache.org/licenses/LICENSE-2.0 .. .. Unless required by applicable law or agreed to in writing, software .. distributed under the License is distributed on an "AS IS" BASIS, WITHOUT .. WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the .. License for the specific language governing permissions and limitations under .. the License. .. _cve/2010-0009: ========================================================= CVE-2010-0009: Apache CouchDB Timing Attack Vulnerability ========================================================= :Date: 31.03.2010 :Affected: Apache CouchDB 0.8.0 to 0.10.1 :Severity: Important :Vendor: The Apache Software Foundation Description =========== Apache CouchDB versions prior to version :ref:`0.11.0 <release/0.11.0>` are vulnerable to timing attacks, also known as side-channel information leakage, due to using simple break-on-inequality string comparisons when verifying hashes and passwords. Mitigation ========== All users should upgrade to CouchDB :ref:`0.11.0 <release/0.11.0>`. Upgrades from the :ref:`0.10.x <release/0.10.x>` series should be seamless. Users on earlier versions should consult with :ref:`upgrade notes <release/0.10.x/upgrade>`. Example ======= A canonical description of the attack can be found in http://codahale.com/a-lesson-in-timing-attacks/ Credit ====== This issue was discovered by *Jason Davies* of the Apache CouchDB development team. ���������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������apache-couchdb-1.6.0/share/doc/src/cve/2010-3854.rst������������������������������������������������0000644�0001750�0000144�00000003215�12332105522�021247� 0����������������������������������������������������������������������������������������������������ustar�00djc�����������������������������users���������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������.. Licensed under the Apache License, Version 2.0 (the "License"); you may not .. use this file except in compliance with the License. You may obtain a copy of .. the License at .. .. http://www.apache.org/licenses/LICENSE-2.0 .. .. Unless required by applicable law or agreed to in writing, software .. distributed under the License is distributed on an "AS IS" BASIS, WITHOUT .. WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the .. License for the specific language governing permissions and limitations under .. the License. .. _cve/2010-3854: ======================================================== CVE-2010-3854: Apache CouchDB Cross Site Scripting Issue ======================================================== :Date: 28.01.2011 :Affected: Apache CouchDB 0.8.0 to 1.0.1 :Severity: Important :Vendor: The Apache Software Foundation Description =========== Apache CouchDB versions prior to version :ref:`1.0.2 <release/1.0.2>` are vulnerable to `Cross Site Scripting`_ (XSS) attacks. .. _Cross Site Scripting: http://en.wikipedia.org/wiki/Cross-site_scripting Mitigation ========== All users should upgrade to CouchDB :ref:`1.0.2 <release/1.0.2>`. Upgrades from the :ref:`0.11.x <release/0.11.x>` and :ref:`0.10.x <release/0.10.x>` series should be seamless. Users on earlier versions should consult with upgrade notes. Example ======= Due to inadequate validation of request parameters and cookie data in Futon, CouchDB's web-based administration UI, a malicious site can execute arbitrary code in the context of a user's browsing session. Credit ====== This XSS issue was discovered by a source that wishes to stay anonymous. �����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������apache-couchdb-1.6.0/share/doc/src/cve/2014-2668.rst������������������������������������������������0000644�0001750�0000144�00000003124�12332105522�021254� 0����������������������������������������������������������������������������������������������������ustar�00djc�����������������������������users���������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������.. Licensed under the Apache License, Version 2.0 (the "License"); you may not .. use this file except in compliance with the License. You may obtain a copy of .. the License at .. .. http://www.apache.org/licenses/LICENSE-2.0 .. .. Unless required by applicable law or agreed to in writing, software .. distributed under the License is distributed on an "AS IS" BASIS, WITHOUT .. WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the .. License for the specific language governing permissions and limitations under .. the License. .. _cve/2014-2668: ================================================================================== CVE-2014-2668: DoS (CPU and memory consumption) via the count parameter to /_uuids ================================================================================== :Date: 26.03.2014 :Affected: Apache CouchDB releases up to and including 1.3.1, 1.4.0, and 1.5.0 are vulnerable. :Severity: Moderate :Vendor: The Apache Software Foundation Description =========== The :ref:`api/server/uuids` resource's `count` query parameter is able to take unreasonable huge numeric value which leads to exhaustion of server resources (CPU and memory) and to DoS as the result. Mitigation ========== Upgrade to a supported CouchDB release that includes this fix, such as: - :ref:`1.5.1 <release/1.5.1>` - :ref:`1.6.0 <release/1.6.0>` All listed releases have included a specific fix to Work-Around =========== Disable the :ref:`api/server/uuids` handler completely, by adapting `local.ini` and restarting CouchDB:: [httpd_global_handlers] _uuids = ��������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������apache-couchdb-1.6.0/share/doc/src/cve/index.rst����������������������������������������������������0000644�0001750�0000144�00000005437�12332105522�021403� 0����������������������������������������������������������������������������������������������������ustar�00djc�����������������������������users���������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������.. Licensed under the Apache License, Version 2.0 (the "License"); you may not .. use this file except in compliance with the License. You may obtain a copy of .. the License at .. .. http://www.apache.org/licenses/LICENSE-2.0 .. .. Unless required by applicable law or agreed to in writing, software .. distributed under the License is distributed on an "AS IS" BASIS, WITHOUT .. WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the .. License for the specific language governing permissions and limitations under .. the License. .. _cve: Security Issues Information =========================== .. toctree:: :maxdepth: 1 :glob: * .. _cve/report: Reporting New Security Problems with Apache CouchDB =================================================== The Apache Software Foundation takes a very active stance in eliminating security problems and denial of service attacks against Apache CouchDB. We strongly encourage folks to report such problems to our private security mailing list first, before disclosing them in a public forum. Please note that the security mailing list should only be used for reporting undisclosed security vulnerabilities in Apache CouchDB and managing the process of fixing such vulnerabilities. We cannot accept regular bug reports or other queries at this address. All mail sent to this address that does not relate to an undisclosed security problem in the Apache CouchDB source code will be ignored. If you need to report a bug that isn't an undisclosed security vulnerability, please use the `bug reporting page`_. Questions about: - How to configure CouchDB securely - If a vulnerability applies to your particular application - Obtaining further information on a published vulnerability - Availability of patches and/or new releases should be address to the `users mailing list`_. Please see the `mailing lists page`_ for details of how to subscribe. The private security mailing address is: `security@couchdb.apache.org`_ Please read `how the Apache Software Foundation handles security`_ reports to know what to expect. Note that all networked servers are subject to denial of service attacks, and we cannot promise magic workarounds to generic problems (such as a client streaming lots of data to your server, or re-requesting the same URL repeatedly). In general our philosophy is to avoid any attacks which can cause the server to consume resources in a non-linear relationship to the size of inputs. .. _bug reporting page: https://issues.apache.org/jira/browse/COUCHDB .. _mailing lists page: http://couchdb.apache.org/#mailing-list .. _how the Apache Software Foundation handles security: http://apache.org/security/committers.html .. _security@couchdb.apache.org: mailto:security@couchdb.apache.org .. _users mailing list: mailto:user@couchdb.apache.org ���������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������apache-couchdb-1.6.0/share/doc/src/cve/2012-5641.rst������������������������������������������������0000644�0001750�0000144�00000005220�12332105522�021243� 0����������������������������������������������������������������������������������������������������ustar�00djc�����������������������������users���������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������.. Licensed under the Apache License, Version 2.0 (the "License"); you may not .. use this file except in compliance with the License. You may obtain a copy of .. the License at .. .. http://www.apache.org/licenses/LICENSE-2.0 .. .. Unless required by applicable law or agreed to in writing, software .. distributed under the License is distributed on an "AS IS" BASIS, WITHOUT .. WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the .. License for the specific language governing permissions and limitations under .. the License. .. _cve/2012-5641: ================================================================================== CVE-2012-5641: Information disclosure via unescaped backslashes in URLs on Windows ================================================================================== :Date: 14.01.2013 :Affected: All Windows-based releases of Apache CouchDB, up to and including 1.0.3, 1.1.1, and 1.2.0 are vulnerable. :Severity: Moderate :Vendor: The Apache Software Foundation Description =========== A specially crafted request could be used to access content directly that would otherwise be protected by inbuilt CouchDB security mechanisms. This request could retrieve in binary form any CouchDB database, including the `_users` or `_replication` databases, or any other file that the user account used to run CouchDB might have read access to on the local filesystem. This exploit is due to a vulnerability in the included MochiWeb HTTP library. Mitigation ========== Upgrade to a supported CouchDB release that includes this fix, such as: - :ref:`1.0.4 <release/1.0.4>` - :ref:`1.1.2 <release/1.1.2>` - :ref:`1.2.1 <release/1.2.1>` - :ref:`1.3.x <release/1.3.x>` All listed releases have included a specific fix for the MochiWeb component. Work-Around =========== Users may simply exclude any file-based web serving components directly within their configuration file, typically in `local.ini`. On a default CouchDB installation, this requires amending the :config:option:`httpd_global_handlers/favicon.ico` and :config:option:`httpd_global_handlers/_utils` lines within :config:section:`httpd_global_handlers`:: [httpd_global_handlers] favicon.ico = {couch_httpd_misc_handlers, handle_welcome_req, <<"Forbidden">>} _utils = {couch_httpd_misc_handlers, handle_welcome_req, <<"Forbidden">>} If additional handlers have been added, such as to support Adobe's Flash `crossdomain.xml` files, these would also need to be excluded. Acknowledgement =============== The issue was found and reported by Sriram Melkote to the upstream MochiWeb project. References ========== - https://github.com/melkote/mochiweb/commit/ac2bf ��������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������apache-couchdb-1.6.0/share/doc/src/cve/2012-5649.rst������������������������������������������������0000644�0001750�0000144�00000002716�12332105522�021262� 0����������������������������������������������������������������������������������������������������ustar�00djc�����������������������������users���������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������.. Licensed under the Apache License, Version 2.0 (the "License"); you may not .. use this file except in compliance with the License. You may obtain a copy of .. the License at .. .. http://www.apache.org/licenses/LICENSE-2.0 .. .. Unless required by applicable law or agreed to in writing, software .. distributed under the License is distributed on an "AS IS" BASIS, WITHOUT .. WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the .. License for the specific language governing permissions and limitations under .. the License. .. _cve/2012-5649: ============================================================== CVE-2012-5649: JSONP arbitrary code execution with Adobe Flash ============================================================== :Date: 14.01.2013 :Affected: Releases up to and including 1.0.3, 1.1.1, and 1.2.0 are vulnerable, if administrators have enabled JSONP. :Severity: Moderate :Vendor: The Apache Software Foundation Description =========== A hand-crafted JSONP callback and response can be used to run arbitrary code inside client-side browsers via Adobe Flash. Mitigation ========== Upgrade to a supported CouchDB release that includes this fix, such as: - :ref:`1.0.4 <release/1.0.4>` - :ref:`1.1.2 <release/1.1.2>` - :ref:`1.2.1 <release/1.2.1>` - :ref:`1.3.x <release/1.3.x>` All listed releases have included a specific fix. Work-Around =========== Disable JSONP or don't enable it since it's disabled by default. ��������������������������������������������������apache-couchdb-1.6.0/share/doc/src/cve/2012-5650.rst������������������������������������������������0000644�0001750�0000144�00000003715�12332105522�021252� 0����������������������������������������������������������������������������������������������������ustar�00djc�����������������������������users���������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������.. Licensed under the Apache License, Version 2.0 (the "License"); you may not .. use this file except in compliance with the License. You may obtain a copy of .. the License at .. .. http://www.apache.org/licenses/LICENSE-2.0 .. .. Unless required by applicable law or agreed to in writing, software .. distributed under the License is distributed on an "AS IS" BASIS, WITHOUT .. WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the .. License for the specific language governing permissions and limitations under .. the License. .. _cve/2012-5650: ========================================================== CVE-2012-5650: DOM based Cross-Site Scripting via Futon UI ========================================================== :Date: 14.01.2013 :Affected: Apache CouchDB releases up to and including 1.0.3, 1.1.1, and 1.2.0 are vulnerable. :Severity: Moderate :Vendor: The Apache Software Foundation Description =========== Query parameters passed into the browser-based test suite are not sanitised, and can be used to load external resources. An attacker may execute JavaScript code in the browser, using the context of the remote user. Mitigation ========== Upgrade to a supported CouchDB release that includes this fix, such as: - :ref:`1.0.4 <release/1.0.4>` - :ref:`1.1.2 <release/1.1.2>` - :ref:`1.2.1 <release/1.2.1>` - :ref:`1.3.x <release/1.3.x>` All listed releases have included a specific fix. Work-Around =========== Disable the Futon user interface completely, by adapting `local.ini` and restarting CouchDB:: [httpd_global_handlers] _utils = {couch_httpd_misc_handlers, handle_welcome_req, <<"Forbidden">>} Or by removing the UI test suite components: - share/www/verify_install.html - share/www/couch_tests.html - share/www/custom_test.html Acknowledgement =============== This vulnerability was discovered & reported to the Apache Software Foundation by `Frederik Braun`_. .. _Frederik Braun: https://frederik-braun.com/ ���������������������������������������������������apache-couchdb-1.6.0/share/doc/src/cve/2010-2234.rst������������������������������������������������0000644�0001750�0000144�00000003560�12332105522�021241� 0����������������������������������������������������������������������������������������������������ustar�00djc�����������������������������users���������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������.. Licensed under the Apache License, Version 2.0 (the "License"); you may not .. use this file except in compliance with the License. You may obtain a copy of .. the License at .. .. http://www.apache.org/licenses/LICENSE-2.0 .. .. Unless required by applicable law or agreed to in writing, software .. distributed under the License is distributed on an "AS IS" BASIS, WITHOUT .. WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the .. License for the specific language governing permissions and limitations under .. the License. .. _cve/2010-2234: =============================================================== CVE-2010-2234: Apache CouchDB Cross Site Request Forgery Attack =============================================================== :Date: 21.02.2010 :Affected: Apache CouchDB 0.8.0 to 0.11.1 :Severity: Important :Vendor: The Apache Software Foundation Description =========== Apache CouchDB versions prior to version :ref:`0.11.1 <release/0.11.1>` are vulnerable to `Cross Site Request Forgery`_ (CSRF) attacks. .. _Cross Site Request Forgery: http://en.wikipedia.org/wiki/Cross-site_request_forgery Mitigation ========== All users should upgrade to CouchDB :ref:`0.11.2 <release/0.11.2>` or :ref:`1.0.1 <release/1.0.1>`. Upgrades from the :ref:`0.11.x <release/0.11.x>` and :ref:`0.10.x <release/0.10.x>` series should be seamless. Users on earlier versions should consult with upgrade notes. Example ======= A malicious website can `POST` arbitrary JavaScript code to well known CouchDB installation URLs (like http://localhost:5984/) and make the browser execute the injected JavaScript in the security context of CouchDB's admin interface Futon. Unrelated, but in addition the JSONP API has been turned off by default to avoid potential information leakage. Credit ====== This CSRF issue was discovered by a source that wishes to stay anonymous. ������������������������������������������������������������������������������������������������������������������������������������������������apache-couchdb-1.6.0/share/doc/src/json-structure.rst�����������������������������������������������0000644�0001750�0000144�00000110631�12332105522�022517� 0����������������������������������������������������������������������������������������������������ustar�00djc�����������������������������users���������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������.. Licensed under the Apache License, Version 2.0 (the "License"); you may not .. use this file except in compliance with the License. You may obtain a copy of .. the License at .. .. http://www.apache.org/licenses/LICENSE-2.0 .. .. Unless required by applicable law or agreed to in writing, software .. distributed under the License is distributed on an "AS IS" BASIS, WITHOUT .. WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the .. License for the specific language governing permissions and limitations under .. the License. ======================== JSON Structure Reference ======================== The following appendix provides a quick reference to all the JSON structures that you can supply to CouchDB, or get in return to requests. All Database Documents ====================== +--------------------------------+---------------------------------------------+ | Field | Description | +================================+=============================================+ | total_rows | Number of documents in the database/view | +--------------------------------+---------------------------------------------+ | offset | Offset where the document list started | +--------------------------------+---------------------------------------------+ | update_seq (optional) | Current update sequence for the database | +--------------------------------+---------------------------------------------+ | rows [array] | Array of document object | +--------------------------------+---------------------------------------------+ Bulk Document Response ====================== +--------------------------------+---------------------------------------------+ | Field | Description | +================================+=============================================+ | docs [array] | Bulk Docs Returned Documents | +--------------------------------+---------------------------------------------+ | id | Document ID | +--------------------------------+---------------------------------------------+ | error | Error type | +--------------------------------+---------------------------------------------+ | reason | Error string with extended reason | +--------------------------------+---------------------------------------------+ Bulk Documents ============== +--------------------------------+---------------------------------------------+ | Field | Description | +================================+=============================================+ | all_or_nothing (optional) | Sets the database commit mode to use | | | all-or-nothing semantics | +--------------------------------+---------------------------------------------+ | docs [array] | Bulk Documents Document | +--------------------------------+---------------------------------------------+ | _id (optional) | Document ID | +--------------------------------+---------------------------------------------+ | _rev (optional) | Revision ID (when updating an existing | | | document) | +--------------------------------+---------------------------------------------+ | _deleted (optional) | Whether the document should be deleted | +--------------------------------+---------------------------------------------+ Changes information for a database ================================== +--------------------------------+---------------------------------------------+ | Field | Description | +================================+=============================================+ | last_seq | Last change sequence number | +--------------------------------+---------------------------------------------+ | results [array] | Changes made to a database | +--------------------------------+---------------------------------------------+ | seq | Update sequence number | +--------------------------------+---------------------------------------------+ | id | Document ID | +--------------------------------+---------------------------------------------+ | changes [array] | List of changes, field-by-field, for this | | | document | +--------------------------------+---------------------------------------------+ CouchDB Document ================ +--------------------------------+---------------------------------------------+ | Field | Description | +================================+=============================================+ | _id (optional) | Document ID | +--------------------------------+---------------------------------------------+ | _rev (optional) | Revision ID (when updating an existing | | | document) | +--------------------------------+---------------------------------------------+ CouchDB Error Status ==================== +--------------------------------+---------------------------------------------+ | Field | Description | +================================+=============================================+ | id | Document ID | +--------------------------------+---------------------------------------------+ | error | Error type | +--------------------------------+---------------------------------------------+ | reason | Error string with extended reason | +--------------------------------+---------------------------------------------+ .. _dbinfo_object: CouchDB database information object =================================== +--------------------------------+---------------------------------------------+ | Field | Description | +================================+=============================================+ | db_name | The name of the database. | +--------------------------------+---------------------------------------------+ | committed_update_seq | The number of committed updates. | +--------------------------------+---------------------------------------------+ | doc_count | The number of documents in the database. | +--------------------------------+---------------------------------------------+ | doc_del_count | The number of deleted documents. | +--------------------------------+---------------------------------------------+ | compact_running | Set to true if the database compaction | | | routine is operating on this database. | +--------------------------------+---------------------------------------------+ | disk_format_version | The version of the physical format used for | | | the data when it is stored on hard disk. | +--------------------------------+---------------------------------------------+ | disk_size | Size in bytes of the data as stored on disk.| | | View indexes are not included in the | | | calculation. | +--------------------------------+---------------------------------------------+ | instance_start_time | Timestamp indicating when the database was | | | opened, expressed in microseconds since the | | | epoch. | +--------------------------------+---------------------------------------------+ | purge_seq | The number of purge operations on the | | | database. | +--------------------------------+---------------------------------------------+ | update_seq | The current number of updates made in the | | | database. | +--------------------------------+---------------------------------------------+ Design Document =============== +--------------------------------+---------------------------------------------+ | Field | Description | +================================+=============================================+ | _id | Design Document ID | +--------------------------------+---------------------------------------------+ | _rev | Design Document Revision | +--------------------------------+---------------------------------------------+ | views | View | +--------------------------------+---------------------------------------------+ | viewname | View Definition | +--------------------------------+---------------------------------------------+ | map | Map Function for View | +--------------------------------+---------------------------------------------+ | reduce (optional) | Reduce Function for View | +--------------------------------+---------------------------------------------+ Design Document Information =========================== +--------------------------------+---------------------------------------------+ | Field | Description | +================================+=============================================+ | name | Name/ID of Design Document | +--------------------------------+---------------------------------------------+ | view_index | View Index | +--------------------------------+---------------------------------------------+ | compact_running | Indicates whether a compaction routine is | | | currently running on the view | +--------------------------------+---------------------------------------------+ | disk_size | Size in bytes of the view as stored on disk | +--------------------------------+---------------------------------------------+ | language | Language for the defined views | +--------------------------------+---------------------------------------------+ | purge_seq | The purge sequence that has been processed | +--------------------------------+---------------------------------------------+ | signature | MD5 signature of the views for the design | | | document | +--------------------------------+---------------------------------------------+ | update_seq | The update sequence of the corresponding | | | database that has been indexed | +--------------------------------+---------------------------------------------+ | updater_running | Indicates if the view is currently being | | | updated | +--------------------------------+---------------------------------------------+ | waiting_clients | Number of clients waiting on views from this| | | design document | +--------------------------------+---------------------------------------------+ | waiting_commit | Indicates if there are outstanding commits | | | to the underlying database that need to | | | processed | +--------------------------------+---------------------------------------------+ Document with Attachments ========================= +--------------------------------+---------------------------------------------+ | Field | Description | +================================+=============================================+ | _id (optional) | Document ID | +--------------------------------+---------------------------------------------+ | _rev (optional) | Revision ID (when updating an existing | | | document) | +--------------------------------+---------------------------------------------+ | _attachments (optional) | Document Attachment | +--------------------------------+---------------------------------------------+ | filename | Attachment information | +--------------------------------+---------------------------------------------+ | content_type | MIME Content type string | +--------------------------------+---------------------------------------------+ | data | File attachment content, Base64 encoded | +--------------------------------+---------------------------------------------+ List of Active Tasks ==================== +--------------------------------+---------------------------------------------+ | Field | Description | +================================+=============================================+ | tasks [array] | Active Tasks | +--------------------------------+---------------------------------------------+ | pid | Process ID | +--------------------------------+---------------------------------------------+ | status | Task status message | +--------------------------------+---------------------------------------------+ | task | Task name | +--------------------------------+---------------------------------------------+ | type | Operation Type | +--------------------------------+---------------------------------------------+ .. _replication-settings: Replication Settings ==================== +--------------------------------+---------------------------------------------+ | Field | Description | +================================+=============================================+ | source | Source database name or URL | +--------------------------------+---------------------------------------------+ | target | Target database name or URL | +--------------------------------+---------------------------------------------+ | create_target (optional) | Creates the target database | +--------------------------------+---------------------------------------------+ | continuous (optional) | Configure the replication to be continuous | +--------------------------------+---------------------------------------------+ | cancel (optional) | Cancels the replication | +--------------------------------+---------------------------------------------+ | doc_ids (optional) | Array of document IDs to be synchronized | +--------------------------------+---------------------------------------------+ | proxy (optional) | Address of a proxy server through which | | | replication should occur | +--------------------------------+---------------------------------------------+ | since_seq (optional) | Sequence from which the replication should | | | start | +--------------------------------+---------------------------------------------+ | filter (optional) | name of the filter function in the form of | | | ``ddoc/myfilter`` | +--------------------------------+---------------------------------------------+ | query_params (optional) | Query parameter that are passed to the | | | filter function; the value should be a | | | document containing parameters as members | +--------------------------------+---------------------------------------------+ | use_checkpoints (optional) | Whether to use replication checkpoints | | | or not | +--------------------------------+---------------------------------------------+ | checkpoint_interval (optional) | Specifies the checkpoint interval in ms. | +--------------------------------+---------------------------------------------+ .. _replication-status: Replication Status ================== +--------------------------------+---------------------------------------------+ | Field | Description | +================================+=============================================+ | ok | Replication status | +--------------------------------+---------------------------------------------+ | session_id | Unique session ID | +--------------------------------+---------------------------------------------+ | source_last_seq | Last sequence number read from the source | | | database | +--------------------------------+---------------------------------------------+ | history [array] | Replication History | +--------------------------------+---------------------------------------------+ | session_id | Session ID for this replication operation | +--------------------------------+---------------------------------------------+ | recorded_seq | Last recorded sequence number | +--------------------------------+---------------------------------------------+ | docs_read | Number of documents read | +--------------------------------+---------------------------------------------+ | docs_written | Number of documents written to target | +--------------------------------+---------------------------------------------+ | doc_write_failures | Number of document write failures | +--------------------------------+---------------------------------------------+ | start_time | Date/Time replication operation started | +--------------------------------+---------------------------------------------+ | start_last_seq | First sequence number in changes stream | +--------------------------------+---------------------------------------------+ | end_time | Date/Time replication operation completed | +--------------------------------+---------------------------------------------+ | end_last_seq | Last sequence number in changes stream | +--------------------------------+---------------------------------------------+ | missing_checked | Number of missing documents checked | +--------------------------------+---------------------------------------------+ | missing_found | Number of missing documents found | +--------------------------------+---------------------------------------------+ .. _request_object: Request object ============== +--------------------------------+---------------------------------------------+ | Field | Description | +================================+=============================================+ | body | Request body data as `string`. | | | If the request method is `GET` this field | | | contains the value ``"undefined"``. If the | | | method is `DELETE` or `HEAD` the value is | | | ``""`` (empty string). | +--------------------------------+---------------------------------------------+ | cookie | Cookies `object`. | +--------------------------------+---------------------------------------------+ | form | Form data `object`. | | | Contains the decoded body as key-value | | | pairs if the `Content-Type` header was | | | ``application/x-www-form-urlencoded``. | +--------------------------------+---------------------------------------------+ | headers | Request headers `object`. | +--------------------------------+---------------------------------------------+ | id | Requested document id `string` if it was | | | specified or ``null`` otherwise. | +--------------------------------+---------------------------------------------+ | info | :ref:`Database information <dbinfo_object>` | +--------------------------------+---------------------------------------------+ | method | Request method as `string` or `array`. | | | String value is a method as one of: `HEAD`, | | | `GET`, `POST`, `PUT`, `DELETE`, `OPTIONS`, | | | and `TRACE`. Otherwise it will be | | | represented as an array of char codes. | +--------------------------------+---------------------------------------------+ | path | List of requested path sections. | +--------------------------------+---------------------------------------------+ | peer | Request source IP address. | +--------------------------------+---------------------------------------------+ | query | URL query parameters `object`. | | | Note that multiple keys are not supported | | | and the last key value suppresses others. | +--------------------------------+---------------------------------------------+ | requested_path | List of actual requested path section. | +--------------------------------+---------------------------------------------+ | raw_path | Raw requested path `string`. | +--------------------------------+---------------------------------------------+ | secObj | :ref:`security_object`. | +--------------------------------+---------------------------------------------+ | userCtx | :ref:`userctx_object`. | +--------------------------------+---------------------------------------------+ | uuid | Generated UUID by a specified algorithm in | | | the config file. | +--------------------------------+---------------------------------------------+ .. code-block:: javascript { "body": "undefined", "cookie": { "AuthSession": "cm9vdDo1MDZBRjQzRjrfcuikzPRfAn-EA37FmjyfM8G8Lw", "m": "3234" }, "form": {}, "headers": { "Accept": "text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8", "Accept-Charset": "ISO-8859-1,utf-8;q=0.7,*;q=0.3", "Accept-Encoding": "gzip,deflate,sdch", "Accept-Language": "en-US,en;q=0.8", "Connection": "keep-alive", "Cookie": "m=3234:t|3247:t|6493:t|6967:t|34e2:|18c3:t|2c69:t|5acb:t|ca3:t|c01:t|5e55:t|77cb:t|2a03:t|1d98:t|47ba:t|64b8:t|4a01:t; AuthSession=cm9vdDo1MDZBRjQzRjrfcuikzPRfAn-EA37FmjyfM8G8Lw", "Host": "127.0.0.1:5984", "User-Agent": "Mozilla/5.0 (Windows NT 5.2) AppleWebKit/535.7 (KHTML, like Gecko) Chrome/16.0.912.75 Safari/535.7" }, "id": "foo", "info": { "committed_update_seq": 2701412, "compact_running": false, "data_size": 7580843252, "db_name": "mailbox", "disk_format_version": 6, "disk_size": 14325313673, "doc_count": 2262757, "doc_del_count": 560, "instance_start_time": "1347601025628957", "purge_seq": 0, "update_seq": 2701412 }, "method": "GET", "path": [ "mailbox", "_design", "request", "_show", "dump", "foo" ], "peer": "127.0.0.1", "query": {}, "raw_path": "/mailbox/_design/request/_show/dump/foo", "requested_path": [ "mailbox", "_design", "request", "_show", "dump", "foo" ], "secObj": { "admins": { "names": [ "Bob" ], "roles": [] }, "members": { "names": [ "Mike", "Alice" ], "roles": [] } }, "userCtx": { "db": "mailbox", "name": "Mike", "roles": [ "user" ] }, "uuid": "3184f9d1ea934e1f81a24c71bde5c168" } .. _response_object: Response object =============== +--------------------------------+---------------------------------------------+ | Field | Description | +================================+=============================================+ | code | HTTP status code `number`. | +--------------------------------+---------------------------------------------+ | json | JSON encodable `object`. | | | Implicitly sets `Content-Type` header as | | | ``application/json``. | +--------------------------------+---------------------------------------------+ | body | Raw response text `string`. | | | Implicitly sets `Content-Type` header as | | | ``text/html; charset=utf-8``. | +--------------------------------+---------------------------------------------+ | base64 | Base64 encoded `string`. | | | Implicitly sets `Content-Type` header as | | | ``application/binary``. | +--------------------------------+---------------------------------------------+ | headers | Response headers `object`. | | | `Content-Type` header from this object | | | overrides any implicitly assigned one. | +--------------------------------+---------------------------------------------+ | stop | `boolean` signal to stop iteration over | | | view result rows (for list functions only) | +--------------------------------+---------------------------------------------+ .. warning:: The ``body``, ``base64`` and ``json`` object keys are overlapping each other where the last one wins. Since most realizations of key-value objects do not preserve the key order or if they are mixed, confusing situations can occure. Try to use only one of them. .. note:: Any custom property makes CouchDB raise an internal exception. Furthermore, the `Response object` could be a simple string value which would be implicitly wrapped into a ``{"body": ...}`` object. Returned CouchDB Document with Detailed Revision Info ===================================================== +--------------------------------+---------------------------------------------+ | Field | Description | +================================+=============================================+ | _id (optional) | Document ID | +--------------------------------+---------------------------------------------+ | _rev (optional) | Revision ID (when updating an existing | | | document) | +--------------------------------+---------------------------------------------+ | _revs_info [array] | CouchDB document extended revision info | +--------------------------------+---------------------------------------------+ | rev | Full revision string | +--------------------------------+---------------------------------------------+ | status | Status of the revision | +--------------------------------+---------------------------------------------+ Returned CouchDB Document with Revision Info ============================================ +--------------------------------+---------------------------------------------+ | Field | Description | +================================+=============================================+ | _id (optional) | Document ID | +--------------------------------+---------------------------------------------+ | _rev (optional) | Revision ID (when updating an existing | | | document) | +--------------------------------+---------------------------------------------+ | _revisions | CouchDB document revisions | +--------------------------------+---------------------------------------------+ | ids [array] | Array of valid revision IDs, in reverse | | | order (latest first) | +--------------------------------+---------------------------------------------+ | start | Prefix number for the latest revision | +--------------------------------+---------------------------------------------+ Returned Document with Attachments ================================== +--------------------------------+---------------------------------------------+ | Field | Description | +================================+=============================================+ | _id (optional) | Document ID | +--------------------------------+---------------------------------------------+ | _rev (optional) | Revision ID (when updating an existing | | | document) | +--------------------------------+---------------------------------------------+ | _attachments (optional) | Document attachment | +--------------------------------+---------------------------------------------+ | filename | Attachment | +--------------------------------+---------------------------------------------+ | stub | Indicates whether the attachment is a stub | +--------------------------------+---------------------------------------------+ | content_type | MIME Content type string | +--------------------------------+---------------------------------------------+ | length | Length (bytes) of the attachment data | +--------------------------------+---------------------------------------------+ | revpos | Revision where this attachment exists | +--------------------------------+---------------------------------------------+ .. _security_object: Security Object =============== +--------------------------------+---------------------------------------------+ | Field | Description | +================================+=============================================+ | admins | Roles/Users with admin privileges | +--------------------------------+---------------------------------------------+ | roles [array] | List of roles with parent privilege | +--------------------------------+---------------------------------------------+ | users [array] | List of users with parent privilege | +--------------------------------+---------------------------------------------+ | readers | Roles/Users with reader privileges | +--------------------------------+---------------------------------------------+ | roles [array] | List of roles with parent privilege | +--------------------------------+---------------------------------------------+ | users [array] | List of users with parent privilege | +--------------------------------+---------------------------------------------+ .. code-block:: javascript { "admins": { "names": [ "Bob" ], "roles": [] }, "members": { "names": [ "Mike", "Alice" ], "roles": [] } } .. _userctx_object: User Context Object =================== +--------------------------------+---------------------------------------------+ | Field | Description | +================================+=============================================+ | db | Database name in the context of the | | | provided operation. | +--------------------------------+---------------------------------------------+ | name | User name. | +--------------------------------+---------------------------------------------+ | roles | List of user roles. | +--------------------------------+---------------------------------------------+ .. code-block:: javascript { "db": "mailbox", "name": null, "roles": [ "_admin" ] } .. _view_head_info_object: View Head Information ===================== +--------------------------------+---------------------------------------------+ | Field | Description | +================================+=============================================+ | total_rows | Number of documents in the view | +--------------------------------+---------------------------------------------+ | offset | Offset where the document list started | +--------------------------------+---------------------------------------------+ .. code-block:: javascript { "total_rows": 42, "offset": 3 } �������������������������������������������������������������������������������������������������������apache-couchdb-1.6.0/share/doc/src/conf.py����������������������������������������������������������0000644�0001750�0000144�00000007354�12332105522�020264� 0����������������������������������������������������������������������������������������������������ustar�00djc�����������������������������users���������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������## Licensed under the Apache License, Version 2.0 (the "License"); you may not ## use this file except in compliance with the License. You may obtain a copy of ## the License at ## ## http://www.apache.org/licenses/LICENSE-2.0 ## ## Unless required by applicable law or agreed to in writing, software ## distributed under the License is distributed on an "AS IS" BASIS, WITHOUT ## WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the ## License for the specific language governing permissions and limitations under ## the License. import datetime import os import re import sys sys.path.insert(0, os.path.abspath('../ext')) extensions = ["sphinx.ext.todo", "sphinx.ext.extlinks", 'github', 'httpdomain', 'configdomain'] _info = {} _regex = re.compile('m4_define\(\[(.+)\],\s+\[(.+)\]\)') _acinclude_m4 = '../../../acinclude.m4' _acinclude_m4_in = '../../../acinclude.m4.in' if os.path.exists(_acinclude_m4): _source = _acinclude_m4 elif os.path.exists(_acinclude_m4_in): _source = _acinclude_m4_in else: _source = None if _source is not None: _info = dict(_regex.findall(open(_source).read())) else: raise ValueError('''Project information source wasn't found. We're assume that it's located within "acinclude.m4" file at the root of the project, but looks like there is no such file there.''') source_suffix = ".rst" nitpicky = True version = '.'.join([ _info['LOCAL_VERSION_MAJOR'], _info['LOCAL_VERSION_MINOR'] ]) release = '.'.join([ _info['LOCAL_VERSION_MAJOR'], _info['LOCAL_VERSION_MINOR'], _info['LOCAL_VERSION_REVISION'] ]) if _info.get('LOCAL_VERSION_RELEASE') == '.%revision%': release += '-dev' elif _info.get('LOCAL_VERSION_RELEASE'): # jenkins hack, the release name is too long or uses # characters that cause pain down the road. Example: # 1.6.0+build.jenkins-ERLANG_VERSION=R14B04,label=Mac-OS-10-8-2-832-76-g2996574 # which breaks the LaTeX PDF build. Let’s strip this # down to the git hash at the end. if 'jenkins' in _info['LOCAL_VERSION_RELEASE']: release += _info['LOCAL_VERSION_RELEASE'][-9:] else: # regular case release += _info['LOCAL_VERSION_STAGE'] + _info['LOCAL_VERSION_RELEASE'] project = _info['LOCAL_PACKAGE_NAME'] copyright = '%d, %s' % ( datetime.datetime.now().year, _info['LOCAL_PACKAGE_AUTHOR_NAME'] ) highlight_language = "json" primary_domain = "http" pygments_style = "sphinx" html_theme = "couchdb" html_theme_path = ['../templates'] templates_path = ["../templates"] html_static_path = ["../static"] html_title = ' '.join([ project, version, 'Documentation' ]) html_style = "rtd.css" html_logo = "../images/logo.png" html_favicon = "../images/favicon.ico" html_use_index = False html_additional_pages = { 'download': 'pages/download.html', 'index': 'pages/index.html' } html_context = { "ga_code": "UA-658988-6" } html_sidebars = { "**": [ "searchbox.html", "localtoc.html", "relations.html", "utilities.html", "help.html", "tracking.html", ] } text_newlines = "native" latex_documents = [( "contents", "CouchDB.tex", project, "", "manual", True )] latex_elements = { "papersize": "a4paper" } texinfo_documents = [( "contents", "CouchDB", project, "", "CouchDB", "The Apache CouchDB database", "Databases", True )] extlinks = { 'issue': ('%s-%%s' % _info['LOCAL_BUG_URI'], 'COUCHDB-'), 'commit': ('https://git-wip-us.apache.org/repos/asf?p=couchdb.git;a=commit;h=%s', '#') } github_project = 'apache/couchdb' html_context['git_branch'] = github_branch = 'master' github_docs_path = 'share/doc/src' del _info, _regex, _acinclude_m4, _acinclude_m4_in, _source ������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������apache-couchdb-1.6.0/share/doc/src/maintenance/�����������������������������������������������������0000755�0001750�0000144�00000000000�12332106072�021237� 5����������������������������������������������������������������������������������������������������ustar�00djc�����������������������������users���������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������apache-couchdb-1.6.0/share/doc/src/maintenance/compaction.rst���������������������������������������0000644�0001750�0000144�00000014026�12332105522�024127� 0����������������������������������������������������������������������������������������������������ustar�00djc�����������������������������users���������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������.. Licensed under the Apache License, Version 2.0 (the "License")you may not .. use this file except in compliance with the License. You may obtain a copy of .. the License at .. .. http://www.apache.org/licenses/LICENSE-2.0 .. .. Unless required by applicable law or agreed to in writing, software .. distributed under the License is distributed on an "AS IS" BASIS, WITHOUT .. WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the .. License for the specific language governing permissions and limitations under .. the License. .. _compact: Compaction ========== The `compaction` operation is the way to reduce disk space usage by removing unused and old data from database or view index files. This operation is a very similar to the `vacuum` (`SQLite`_ ex.) available for other database management systems. .. _SQLite: http://www.sqlite.org/lang_vacuum.html During compaction of the `target` CouchDB creates new file with the ``.compact`` extension and transfers only actual data into. Because of this, CouchDB checks first for the available disk space - it should be *twice greater* than the compacted file's data. When all actual data is successfully transferred to the `compacted` file CouchDB replaces the `target` with the `compacted` file. .. _compact/db: Database Compaction ------------------- Database compaction compresses the database file by removing unused file sections created during updates. Old documents revisions are replaced with small amount of metadata called `tombstone` which are used for conflicts resolution during replication. The number of stored revisions (and their `tombstones`) can be configured by using the :get:`_revs_limit </{db}/_revs_limit>` URL endpoint. Compaction is manually triggered operation per database and runs as a background task. To start it for specific database there is need to send HTTP :post:`/{db}/_compact` sub-resource of the target database:: curl -H "Content-Type: application/json" -X POST http://localhost:5984/my_db/_compact On success, HTTP status :statuscode:`202` is returned immediately: .. code-block:: http HTTP/1.1 202 Accepted Cache-Control: must-revalidate Content-Length: 12 Content-Type: text/plain; charset=utf-8 Date: Wed, 19 Jun 2013 09:43:52 GMT Server: CouchDB (Erlang/OTP) .. code-block:: javascript {"ok":true} Although the request body is not used you must still specify :header:`Content-Type` header with :mimetype:`application/json` value for the request. If you don't, you will be aware about with HTTP status :statuscode:`415` response: .. code-block:: http HTTP/1.1 415 Unsupported Media Type Cache-Control: must-revalidate Content-Length: 78 Content-Type: application/json Date: Wed, 19 Jun 2013 09:43:44 GMT Server: CouchDB (Erlang/OTP) {"error":"bad_content_type","reason":"Content-Type must be application/json"} When the compaction is successful started and running it is possible to get information about it via :ref:`database information resource <api/db>`:: curl http://localhost:5984/my_db .. code-block:: http HTTP/1.1 200 OK Cache-Control: must-revalidate Content-Length: 246 Content-Type: application/json Date: Wed, 19 Jun 2013 16:51:20 GMT Server: CouchDB (Erlang/OTP) { "committed_update_seq": 76215, "compact_running": true, "data_size": 3787996, "db_name": "my_db", "disk_format_version": 6, "disk_size": 17703025, "doc_count": 5091, "doc_del_count": 0, "instance_start_time": "1371660751878859", "purge_seq": 0, "update_seq": 76215 } Note that ``compaction_running`` field is ``true`` indicating that compaction is actually running. To track the compaction progress you may query the :get:`_active_tasks </_active_tasks>` resource:: curl http://localhost:5984/my_db .. code-block:: http HTTP/1.1 200 OK Cache-Control: must-revalidate Content-Length: 175 Content-Type: application/json Date: Wed, 19 Jun 2013 16:27:23 GMT Server: CouchDB (Erlang/OTP) [ { "changes_done": 44461, "database": "my_db", "pid": "<0.218.0>", "progress": 58, "started_on": 1371659228, "total_changes": 76215, "type": "database_compaction", "updated_on": 1371659241 } ] .. _compact/views: Views Compaction ---------------- `Views` are also need compaction like databases, unlike databases views are compacted by groups per `design document`. To start their compaction there is need to send HTTP :post:`/{db}/_compact/{ddoc}` request:: curl -H "Content-Type: application/json" -X POST http://localhost:5984/dbname/_compact/designname .. code-block:: javascript {"ok":true} This compacts the view index from the current version of the specified design document. The HTTP response code is :statuscode:`202` (like :ref:`compaction for databases <compact/db>`) and a compaction background task will be created. .. _compact/views/cleanup: Views cleanup ^^^^^^^^^^^^^ View indexes on disk are named after their `MD5` hash of the view definition. When you change a view, old indexes remain on disk. To clean up all outdated view indexes (files named after the MD5 representation of views, that does not exist anymore) you can trigger a :ref:`view cleanup <api/db/view_cleanup>`:: curl -H "Content-Type: application/json" -X POST http://localhost:5984/dbname/_view_cleanup .. code-block:: javascript {"ok":true} .. _compact/auto: Automatic Compaction -------------------- While both :ref:`database <compact/db>` and :ref:`views <compact/views>` compactions are required be manually triggered, it is also possible to configure automatic compaction, so that compaction of databases and views is automatically triggered based on various criteria. Automatic compaction is configured in CouchDB's :ref:`configuration files <config/intro>`. The :config:option:`daemons/compaction_daemon` is responsible for triggering the compaction. It is automatically started, but disabled by default. The criteria for triggering the compactions is configured in the :config:section:`compactions` section. ����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������apache-couchdb-1.6.0/share/doc/src/maintenance/performance.rst��������������������������������������0000644�0001750�0000144�00000026240�12332105522�024275� 0����������������������������������������������������������������������������������������������������ustar�00djc�����������������������������users���������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������.. Licensed under the Apache License, Version 2.0 (the "License"); you may not .. use this file except in compliance with the License. You may obtain a copy of .. the License at .. .. http://www.apache.org/licenses/LICENSE-2.0 .. .. Unless required by applicable law or agreed to in writing, software .. distributed under the License is distributed on an "AS IS" BASIS, WITHOUT .. WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the .. License for the specific language governing permissions and limitations under .. the License. .. _performance: =========== Performance =========== With up to tens of thousands of documents you will generally find CouchDB to perform well no matter how you write your code. Once you start getting into the millions of documents you need to be a lot more careful. Disk I/O ======== File Size --------- The smaller your file size, the less `I/O` operations there will be, the more of the file can be cached by CouchDB and the operating system, the quicker it is to replicate, backup etc. Consequently you should carefully examine the data you are storing. For example it would be silly to use keys that are hundreds of characters long, but your program would be hard to maintain if you only used single character keys. Carefully consider data that is duplicated by putting it in views. Disk and File System Performance -------------------------------- Using faster disks, striped RAID arrays and modern file systems can all speed up your CouchDB deployment. However, there is one option that can increase the responsiveness of your CouchDB server when disk performance is a bottleneck. From the Erlang documentation for the file module: On operating systems with thread support, it is possible to let file operations be performed in threads of their own, allowing other Erlang processes to continue executing in parallel with the file operations. See the `command line flag +A in erl(1)`_. Setting this argument to a number greater than zero can keep your CouchDB installation responsive even during periods of heavy disk utilization. The easiest way to set this option is through the ``ERL_FLAGS`` environment variable. For example, to give Erlang four threads with which to perform I/O operations add the following to ``(prefix)/etc/defaults/couchdb`` (or equivalent):: export ERL_FLAGS="+A 4" .. _command line flag +A in erl(1): http://erlang.org/doc/man/erl.html System Resource Limits ====================== One of the problems that administrators run into as their deployments become large are resource limits imposed by the system and by the application configuration. Raising these limits can allow your deployment to grow beyond what the default configuration will support. CouchDB Configuration Options ----------------------------- delayed_commits ^^^^^^^^^^^^^^^ The :config:option:`delayed commits <couchdb/delayed_commits>` allows to achieve better write performance for some workloads while sacrificing a small amount of durability. The setting causes CouchDB to wait up to a full second before committing new data after an update. If the server crashes before the header is written then any writes since the last commit are lost. Keep this option enabled on your own risk. max_dbs_open ^^^^^^^^^^^^ In your :ref:`configuration <config>` (local.ini or similar) familiarize yourself with the :config:option:`couchdb/max_dbs_open`: .. code-block:: ini [couchdb] max_dbs_open = 100 This option places an upper bound on the number of databases that can be open at one time. CouchDB reference counts database accesses internally and will close idle databases when it must. Sometimes it is necessary to keep more than the default open at once, such as in deployments where many databases will be continuously replicating. Erlang ------ Even if you've increased the maximum connections CouchDB will allow, the Erlang runtime system will not allow more than 1024 connections by default. Adding the following directive to ``(prefix)/etc/default/couchdb`` (or equivalent) will increase this limit (in this case to 4096):: export ERL_MAX_PORTS=4096 CouchDB versions up to 1.1.x also create Erlang Term Storage (`ETS`_) tables for each replication. If you are using a version of CouchDB older than 1.2 and must support many replications, also set the ``ERL_MAX_ETS_TABLES`` variable. The default is approximately 1400 tables. Note that on Mac OS X, Erlang will not actually increase the file descriptor limit past 1024 (i.e. the system header–defined value of ``FD_SETSIZE``). See `this tip for a possible workaround`_ and `this thread for a deeper explanation`_. .. _ETS: http://www.erlang.org/doc/man/ets.html .. _this tip for a possible workaround: http://erlang.org/pipermail/erlang-questions/2011-December/063119.html .. _this thread for a deeper explanation: http://erlang.org/pipermail/erlang-questions/2011-October/061971.html PAM and ulimit -------------- Finally, most \*nix operating systems impose various resource limits on every process. If your system is set up to use the Pluggable Authentication Modules (`PAM`_) system, increasing this limit is straightforward. For example, creating a file named ``/etc/security/limits.d/100-couchdb.conf`` with the following contents will ensure that CouchDB can open enough file descriptors to service your increased maximum open databases and Erlang ports:: #<domain> <type> <item> <value> couchdb hard nofile 4096 couchdb soft nofile 4096 If your system does not use PAM, a `ulimit` command is usually available for use in a custom script to launch CouchDB with increased resource limits. If necessary, feel free to increase this limits as long as your hardware can handle the load. .. _PAM: http://www.linux-pam.org/ Network ======= There is latency overhead making and receiving each request/response. In general you should do your requests in batches. Most APIs have some mechanism to do batches, usually by supplying lists of documents or keys in the request body. Be careful what size you pick for the batches. The larger batch requires more time your client has to spend encoding the items into JSON and more time is spent decoding that number of responses. Do some benchmarking with your own configuration and typical data to find the sweet spot. It is likely to be between one and ten thousand documents. If you have a fast I/O system then you can also use concurrency - have multiple requests/responses at the same time. This mitigates the latency involved in assembling JSON, doing the networking and decoding JSON. As of CouchDB 1.1.0, users often report lower write performance of documents compared to older releases. The main reason is that this release ships with the more recent version of the HTTP server library Mochiweb, which by default sets the TCP socket option `SO_NODELAY`_ to false. This means that small data sent to the TCP socket, like the reply to a document write request (or reading a very small document), will not be sent immediately to the network - TCP will buffer it for a while hoping that it will be asked to send more data through the same socket and then send all the data at once for increased performance. This TCP buffering behaviour can be disabled via :config:option:`httpd/socket_options`: .. code-block:: ini [httpd] socket_options = [{nodelay, true}] .. _SO_NODELAY: http://en.wikipedia.org/wiki/Nagle%27s_algorithm .. seealso:: Bulk :ref:`load <api/db/all_docs>` and :ref:`store <api/db/bulk_docs>` API. CouchDB ======= DELETE operation ---------------- When you :method:`DELETE` a document the database will create a new revision which contains the ``_id`` and ``_rev`` fields as well as the `_deleted` flag. This revision will remain even after a `database compaction` so that the deletion can be replicated. Deleted documents, like non-deleted documents, can affect view build times, :method:`PUT` and :method:`DELETE` requests time and size of database on disk, since they increase the size of the B+Tree's. You can see the number of deleted documents in :get:`database information </{db}>`. If your use case creates lots of deleted documents (for example, if you are storing short-term data like logfile entries, message queues, etc), you might want to periodically switch to a new database and delete the old one (once the entries in it have all expired). Document's ID ------------- The db file size is derived from your document and view sizes but also on a multiple of your ``_id`` sizes. Not only is the ``_id`` present in the document, but it and parts of it are duplicated in the binary tree structure CouchDB uses to navigate the file to find the document in the first place. As a real world example for one user switching from 16 byte ids to 4 byte ids made a database go from 21GB to 4GB with 10 million documents (the raw JSON text when from 2.5GB to 2GB). Inserting with sequential (and at least sorted) ids is faster than random ids. Consequently you should consider generating ids yourself, allocating them sequentially and using an encoding scheme that consumes fewer bytes. For example, something that takes 16 hex digits to represent can be done in 4 base 62 digits (10 numerals, 26 lower case, 26 upper case). Views ===== Views Generation ---------------- Views with the Javascript query server are extremely slow to generate when there are a non-trivial number of documents to process. The generation process won't even saturate a single CPU let alone your I/O. The cause is the latency involved in the CouchDB server and separate `couchjs` query server, dramatically indicating how important it is to take latency out of your implementation. You can let view access be "stale" but it isn't practical to determine when that will occur giving you a quick response and when views will be updated which will take a long time. (A 10 million document database took about 10 minutes to load into CouchDB but about 4 hours to do view generation). View information isn't replicated - it is rebuilt on each database so you can't do the view generation on a separate sever. Builtin Reduce Functions ------------------------ If you’re using a very simple view function that only performs a sum or count reduction, you can call native Erlang implementations of them by simply writing ``_sum`` or ``_count`` in place of your function declaration. This will speed up things dramatically, as it cuts down on IO between CouchDB and the :ref:`JavaScript query server <query-server/js>`. For example, as `mentioned on the mailing list`_, the time for outputting an (already indexed and cached) view with about 78,000 items went down from 60 seconds to 4 seconds. Before: .. code-block:: javascript { "_id": "_design/foo", "views": { "bar": { "map": "function (doc) { emit(doc.author, 1); }", "reduce": "function (keys, values, rereduce) { return sum(values); }" } } } After: .. code-block:: javascript { "_id": "_design/foo", "views": { "bar": { "map": "function (doc) { emit(doc.author, 1); }", "reduce": "_sum" } } } .. _mentioned on the mailing list: http://mail-archives.apache.org/mod_mbox/couchdb-user/201003.mbox/%3c5E07E00E-3D69-4A8C-ADA3-1B20CF0BA4C8@julianstahnke.com%3e .. seealso:: :ref:`reducefun/builtin` ����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������apache-couchdb-1.6.0/share/doc/src/maintenance/index.rst��������������������������������������������0000644�0001750�0000144�00000001217�12332105522�023100� 0����������������������������������������������������������������������������������������������������ustar�00djc�����������������������������users���������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������.. Licensed under the Apache License, Version 2.0 (the "License")you may not .. use this file except in compliance with the License. You may obtain a copy of .. the License at .. .. http://www.apache.org/licenses/LICENSE-2.0 .. .. Unless required by applicable law or agreed to in writing, software .. distributed under the License is distributed on an "AS IS" BASIS, WITHOUT .. WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the .. License for the specific language governing permissions and limitations under .. the License. =================== CouchDB Maintenance =================== .. toctree:: compaction performance ���������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������apache-couchdb-1.6.0/share/doc/src/intro/�����������������������������������������������������������0000755�0001750�0000144�00000000000�12332106072�020110� 5����������������������������������������������������������������������������������������������������ustar�00djc�����������������������������users���������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������apache-couchdb-1.6.0/share/doc/src/intro/consistency.rst��������������������������������������������0000644�0001750�0000144�00000051011�12332105522�023200� 0����������������������������������������������������������������������������������������������������ustar�00djc�����������������������������users���������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������.. Licensed under the Apache License, Version 2.0 (the "License"); you may not .. use this file except in compliance with the License. You may obtain a copy of .. the License at .. .. http://www.apache.org/licenses/LICENSE-2.0 .. .. Unless required by applicable law or agreed to in writing, software .. distributed under the License is distributed on an "AS IS" BASIS, WITHOUT .. WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the .. License for the specific language governing permissions and limitations under .. the License. .. _intro/consistency: ==================== Eventual Consistency ==================== In the previous document :ref:`intro/why`, we saw that CouchDB's flexibility allows us to evolve our data as our applications grow and change. In this topic, we'll explore how working "with the grain" of CouchDB promotes simplicity in our applications and helps us naturally build scalable, distributed systems. Working with the Grain ====================== A *distributed system* is a system that operates robustly over a wide network. A particular feature of network computing is that network links can potentially disappear, and there are plenty of strategies for managing this type of network segmentation. CouchDB differs from others by accepting eventual consistency, as opposed to putting absolute consistency ahead of raw availability, like `RDBMS`_ or `Paxos`_. What these systems have in common is an awareness that data acts differently when many people are accessing it simultaneously. Their approaches differ when it comes to which aspects of *consistency*, *availability*, or *partition* tolerance they prioritize. Engineering distributed systems is tricky. Many of the caveats and "gotchas" you will face over time aren't immediately obvious. We don't have all the solutions, and CouchDB isn't a panacea, but when you work with CouchDB's grain rather than against it, the path of least resistance leads you to naturally scalable applications. Of course, building a distributed system is only the beginning. A website with a database that is available only half the time is next to worthless. Unfortunately, the traditional relational database approach to consistency makes it very easy for application programmers to rely on global state, global clocks, and other high availability no-nos, without even realizing that they're doing so. Before examining how CouchDB promotes scalability, we'll look at the constraints faced by a distributed system. After we've seen the problems that arise when parts of your application can't rely on being in constant contact with each other, we'll see that CouchDB provides an intuitive and useful way for modeling applications around high availability. .. _RDBMS: http://en.wikipedia.org/wiki/Relational_database_management_system .. _Paxos: http://en.wikipedia.org/wiki/Paxos_%28computer_science%29 .. _cap: The CAP Theorem =============== The CAP theorem describes a few different strategies for distributing application logic across networks. CouchDB's solution uses replication to propagate application changes across participating nodes. This is a fundamentally different approach from consensus algorithms and relational databases, which operate at different intersections of consistency, availability, and partition tolerance. The CAP theorem, shown in :ref:`intro/consistency-01`, identifies three distinct concerns: - **Consistency**: All database clients see the same data, even with concurrent updates. - **Availability**: All database clients are able to access some version of the data. - **Partition tolerance**: The database can be split over multiple servers. Pick two. .. _intro/consistency-01: .. figure:: ../../images/intro-consistency-01.png :align: center :alt: The CAP theorem Figure 1. The CAP theorem When a system grows large enough that a single database node is unable to handle the load placed on it, a sensible solution is to add more servers. When we add nodes, we have to start thinking about how to partition data between them. Do we have a few databases that share exactly the same data? Do we put different sets of data on different database servers? Do we let only certain database servers write data and let others handle the reads? Regardless of which approach we take, the one problem we'll keep bumping into is that of keeping all these database servers in sync. If you write some information to one node, how are you going to make sure that a read request to another database server reflects this newest information? These events might be milliseconds apart. Even with a modest collection of database servers, this problem can become extremely complex. When it's absolutely critical that all clients see a consistent view of the database, the users of one node will have to wait for any other nodes to come into agreement before being able to read or write to the database. In this instance, we see that availability takes a backseat to consistency. However, there are situations where availability trumps consistency: Each node in a system should be able to make decisions purely based on local state. If you need to do something under high load with failures occurring and you need to reach agreement, you're lost. If you're concerned about scalability, any algorithm that forces you to run agreement will eventually become your bottleneck. Take that as a given. -- Werner Vogels, Amazon CTO and Vice President If availability is a priority, we can let clients write data to one node of the database without waiting for other nodes to come into agreement. If the database knows how to take care of reconciling these operations between nodes, we achieve a sort of "eventual consistency" in exchange for high availability. This is a surprisingly applicable trade-off for many applications. Unlike traditional relational databases, where each action performed is necessarily subject to database-wide consistency checks, CouchDB makes it really simple to build applications that sacrifice immediate consistency for the huge performance improvements that come with simple distribution. Local Consistency ================= Before we attempt to understand how CouchDB operates in a cluster, it's important that we understand the inner workings of a single CouchDB node. The CouchDB API is designed to provide a convenient but thin wrapper around the database core. By taking a closer look at the structure of the database core, we'll have a better understanding of the API that surrounds it. The Key to Your Data -------------------- At the heart of CouchDB is a powerful *B-tree* storage engine. A B-tree is a sorted data structure that allows for searches, insertions, and deletions in logarithmic time. As :ref:`intro/consistency-02` illustrates, CouchDB uses this B-tree storage engine for all internal data, documents, and views. If we understand one, we will understand them all. .. _intro/consistency-02: .. figure:: ../../images/intro-consistency-02.png :align: center :alt: Anatomy of a view request Figure 2. Anatomy of a view request CouchDB uses MapReduce to compute the results of a view. MapReduce makes use of two functions, "map" and "reduce", which are applied to each document in isolation. Being able to isolate these operations means that view computation lends itself to parallel and incremental computation. More important, because these functions produce key/value pairs, CouchDB is able to insert them into the B-tree storage engine, sorted by key. Lookups by key, or key range, are extremely efficient operations with a B-tree, described in `big O` notation as ``O(log N)`` and ``O(log N + K)``, respectively. In CouchDB, we access documents and view results by key or key range. This is a direct mapping to the underlying operations performed on CouchDB's B-tree storage engine. Along with document inserts and updates, this direct mapping is the reason we describe CouchDB's API as being a thin wrapper around the database core. Being able to access results by key alone is a very important restriction because it allows us to make huge performance gains. As well as the massive speed improvements, we can partition our data over multiple nodes, without affecting our ability to query each node in isolation. `BigTable`_, `Hadoop`_, `SimpleDB`_, and `memcached`_ restrict object lookups by key for exactly these reasons. .. _BigTable: http://en.wikipedia.org/wiki/BigTable .. _Hadoop: http://hadoop.apache.org .. _SimpleDB: http://aws.amazon.com/simpledb/ .. _memcached: http://memcached.org No Locking ---------- A table in a relational database is a single data structure. If you want to modify a table -- say, update a row -- the database system must ensure that nobody else is trying to update that row and that nobody can read from that row while it is being updated. The common way to handle this uses what's known as a lock. If multiple clients want to access a table, the first client gets the lock, making everybody else wait. When the first client's request is processed, the next client is given access while everybody else waits, and so on. This serial execution of requests, even when they arrived in parallel, wastes a significant amount of your server's processing power. Under high load, a relational database can spend more time figuring out who is allowed to do what, and in which order, than it does doing any actual work. .. note:: Modern relational databases avoid locks by implementing MVCC under the hood, but hide it from the end user, requiring them to coordinate concurrent changes of single rows or fields. Instead of locks, CouchDB uses `Multi-Version Concurrency Control` (MVCC) to manage concurrent access to the database. :ref:`intro/consistency-03` illustrates the differences between MVCC and traditional locking mechanisms. MVCC means that CouchDB can run at full speed, all the time, even under high load. Requests are run in parallel, making excellent use of every last drop of processing power your server has to offer. .. _intro/consistency-03: .. figure:: ../../images/intro-consistency-03.png :align: center :alt: MVCC means no locking Figure 3. MVCC means no locking Documents in CouchDB are versioned, much like they would be in a regular version control system such as `Subversion`_. If you want to change a value in a document, you create an entire new version of that document and save it over the old one. After doing this, you end up with two versions of the same document, one old and one new. How does this offer an improvement over locks? Consider a set of requests wanting to access a document. The first request reads the document. While this is being processed, a second request changes the document. Since the second request includes a completely new version of the document, CouchDB can simply append it to the database without having to wait for the read request to finish. When a third request wants to read the same document, CouchDB will point it to the new version that has just been written. During this whole process, the first request could still be reading the original version. A read request will always see the most recent snapshot of your database at the time of the beginning of the request. .. _Subversion: http://subversion.apache.org/ Validation ========== As application developers, we have to think about what sort of input we should accept and what we should reject. The expressive power to do this type of validation over complex data within a traditional relational database leaves a lot to be desired. Fortunately, CouchDB provides a powerful way to perform per-document validation from within the database. CouchDB can validate documents using JavaScript functions similar to those used for MapReduce. Each time you try to modify a document, CouchDB will pass the validation function a copy of the existing document, a copy of the new document, and a collection of additional information, such as user authentication details. The validation function now has the opportunity to approve or deny the update. By working with the grain and letting CouchDB do this for us, we save ourselves a tremendous amount of CPU cycles that would otherwise have been spent serializing object graphs from SQL, converting them into domain objects, and using those objects to do application-level validation. Distributed Consistency ======================= Maintaining consistency within a single database node is relatively easy for most databases. The real problems start to surface when you try to maintain consistency between multiple database servers. If a client makes a write operation on server `A`, how do we make sure that this is consistent with server `B`, or `C`, or `D`? For relational databases, this is a very complex problem with entire books devoted to its solution. You could use multi-master, master/slave, partitioning, sharding, write-through caches, and all sorts of other complex techniques. Incremental Replication ======================= CouchDB's operations take place within the context of a single document. As CouchDB achieves eventual consistency between multiple databases by using incremental replication you no longer have to worry about your database servers being able to stay in constant communication. Incremental replication is a process where document changes are periodically copied between servers. We are able to build what's known as a *shared nothing* cluster of databases where each node is independent and self-sufficient, leaving no single point of contention across the system. Need to scale out your CouchDB database cluster? Just throw in another server. As illustrated in :ref:`intro/consistency-04`, with CouchDB's incremental replication, you can synchronize your data between any two databases however you like and whenever you like. After replication, each database is able to work independently. You could use this feature to synchronize database servers within a cluster or between data centers using a job scheduler such as cron, or you could use it to synchronize data with your laptop for offline work as you travel. Each database can be used in the usual fashion, and changes between databases can be synchronized later in both directions. .. _intro/consistency-04: .. figure:: ../../images/intro-consistency-04.png :align: center :alt: Incremental replication between CouchDB nodes Figure 4. Incremental replication between CouchDB nodes What happens when you change the same document in two different databases and want to synchronize these with each other? CouchDB's replication system comes with automatic conflict detection and resolution. When CouchDB detects that a document has been changed in both databases, it flags this document as being in conflict, much like they would be in a regular version control system. This isn't as troublesome as it might first sound. When two versions of a document conflict during replication, the winning version is saved as the most recent version in the document's history. Instead of throwing the losing version away, as you might expect, CouchDB saves this as a previous version in the document's history, so that you can access it if you need to. This happens automatically and consistently, so both databases will make exactly the same choice. It is up to you to handle conflicts in a way that makes sense for your application. You can leave the chosen document versions in place, revert to the older version, or try to merge the two versions and save the result. Case Study ========== Greg Borenstein, a friend and coworker, built a small library for converting Songbird playlists to JSON objects and decided to store these in CouchDB as part of a backup application. The completed software uses CouchDB's MVCC and document revisions to ensure that Songbird playlists are backed up robustly between nodes. .. note:: `Songbird`_ is a free software media player with an integrated web browser, based on the Mozilla XULRunner platform. Songbird is available for Microsoft Windows, Apple Mac OS X, Solaris, and Linux. .. _Songbird: http://en.wikipedia.org/wiki/Songbird_%28software%29 Let's examine the workflow of the Songbird backup application, first as a user backing up from a single computer, and then using Songbird to synchronize playlists between multiple computers. We'll see how document revisions turn what could have been a hairy problem into something that *just works*. The first time we use this backup application, we feed our playlists to the application and initiate a backup. Each playlist is converted to a JSON object and handed to a CouchDB database. As illustrated in :ref:`intro/consistency-05`, CouchDB hands back the document ID and revision of each playlist as it's saved to the database. .. _intro/consistency-05: .. figure:: ../../images/intro-consistency-05.png :align: center :alt: Backing up to a single database Figure 5. Backing up to a single database After a few days, we find that our playlists have been updated and we want to back up our changes. After we have fed our playlists to the backup application, it fetches the latest versions from CouchDB, along with the corresponding document revisions. When the application hands back the new playlist document, CouchDB requires that the document revision is included in the request. CouchDB then makes sure that the document revision handed to it in the request matches the current revision held in the database. Because CouchDB updates the revision with every modification, if these two are out of sync it suggests that someone else has made changes to the document between the time we requested it from the database and the time we sent our updates. Making changes to a document after someone else has modified it without first inspecting those changes is usually a bad idea. Forcing clients to hand back the correct document revision is the heart of CouchDB's optimistic concurrency. We have a laptop we want to keep synchronized with our desktop computer. With all our playlists on our desktop, the first step is to "restore from backup" onto our laptop. This is the first time we've done this, so afterward our laptop should hold an exact replica of our desktop playlist collection. After editing our Argentine Tango playlist on our laptop to add a few new songs we've purchased, we want to save our changes. The backup application replaces the playlist document in our laptop CouchDB database and a new document revision is generated. A few days later, we remember our new songs and want to copy the playlist across to our desktop computer. As illustrated in :ref:`intro/consistency-06`, the backup application copies the new document and the new revision to the desktop CouchDB database. Both CouchDB databases now have the same document revision. .. _intro/consistency-06: .. figure:: ../../images/intro-consistency-06.png :align: center :alt: Synchronizing between two databases Figure 6. Synchronizing between two databases Because CouchDB tracks document revisions, it ensures that updates like these will work only if they are based on current information. If we had made modifications to the playlist backups between synchronization, things wouldn't go as smoothly. We back up some changes on our laptop and forget to synchronize. A few days later, we're editing playlists on our desktop computer, make a backup, and want to synchronize this to our laptop. As illustrated in :ref:`intro/consistency-07`, when our backup application tries to replicate between the two databases, CouchDB sees that the changes being sent from our desktop computer are modifications of out-of-date documents and helpfully informs us that there has been a conflict. Recovering from this error is easy to accomplish from an application perspective. Just download CouchDB's version of the playlist and provide an opportunity to merge the changes or save local modifications into a new playlist. .. _intro/consistency-07: .. figure:: ../../images/intro-consistency-07.png :align: center :alt: Synchronization conflicts between two databases Figure 7. Synchronization conflicts between two databases Wrapping Up =========== CouchDB's design borrows heavily from web architecture and the lessons learned deploying massively distributed systems on that architecture. By understanding why this architecture works the way it does, and by learning to spot which parts of your application can be easily distributed and which parts cannot, you'll enhance your ability to design distributed and scalable applications, with CouchDB or without it. We've covered the main issues surrounding CouchDB's consistency model and hinted at some of the benefits to be had when you work *with* CouchDB and not against it. But enough theory -- let's get up and running and see what all the fuss is about! �����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������apache-couchdb-1.6.0/share/doc/src/intro/overview.rst�����������������������������������������������0000644�0001750�0000144�00000042711�12332105522�022514� 0����������������������������������������������������������������������������������������������������ustar�00djc�����������������������������users���������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������.. Licensed under the Apache License, Version 2.0 (the "License"); you may not .. use this file except in compliance with the License. You may obtain a copy of .. the License at .. .. http://www.apache.org/licenses/LICENSE-2.0 .. .. Unless required by applicable law or agreed to in writing, software .. distributed under the License is distributed on an "AS IS" BASIS, WITHOUT .. WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the .. License for the specific language governing permissions and limitations under .. the License. .. _intro/overview: ================== Technical Overview ================== Document Storage ================ A CouchDB server hosts named databases, which store **documents**. Each document is uniquely named in the database, and CouchDB provides a `RESTful`_ :ref:`HTTP API <api/basics>` for reading and updating (add, edit, delete) database documents. Documents are the primary unit of data in CouchDB and consist of any number of fields and attachments. Documents also include metadata that’s maintained by the database system. Document fields are uniquely named and contain values of :ref:`varying types <json>` (text, number, boolean, lists, etc), and there is no set limit to text size or element count. The CouchDB document update model is lockless and optimistic. Document edits are made by client applications loading documents, applying changes, and saving them back to the database. If another client editing the same document saves their changes first, the client gets an edit conflict error on save. To resolve the update conflict, the latest document version can be opened, the edits reapplied and the update tried again. Document updates (add, edit, delete) are all or nothing, either succeeding entirely or failing completely. The database never contains partially saved or edited documents. .. _RESTful: http://en.wikipedia.org/wiki/REST ACID Properties =============== The CouchDB file layout and commitment system features all `Atomic Consistent Isolated Durable` (`ACID`_) properties. On-disk, CouchDB never overwrites committed data or associated structures, ensuring the database file is always in a consistent state. This is a "crash-only" design where the CouchDB server does not go through a shut down process, it's simply terminated. Document updates (add, edit, delete) are serialized, except for binary blobs which are written concurrently. Database readers are never locked out and never have to wait on writers or other readers. Any number of clients can be reading documents without being locked out or interrupted by concurrent updates, even on the same document. CouchDB read operations use a `Multi-Version Concurrency Control` (`MVCC`_) model where each client sees a consistent snapshot of the database from the beginning to the end of the read operation. Documents are indexed in `B-trees`_ by their name (DocID) and a Sequence ID. Each update to a database instance generates a new sequential number. Sequence IDs are used later for incrementally finding changes in a database. These B-tree indexes are updated simultaneously when documents are saved or deleted. The index updates always occur at the end of the file (append-only updates). Documents have the advantage of data being already conveniently packaged for storage rather than split out across numerous tables and rows in most database systems. When documents are committed to disk, the document fields and metadata are packed into buffers, sequentially one document after another (helpful later for efficient building of views). When CouchDB documents are updated, all data and associated indexes are flushed to disk and the transactional commit always leaves the database in a completely consistent state. Commits occur in two steps: #. All document data and associated index updates are synchronously flushed to disk. #. The updated database header is written in two consecutive, identical chunks to make up the first 4k of the file, and then synchronously flushed to disk. In the event of an OS crash or power failure during step 1, the partially flushed updates are simply forgotten on restart. If such a crash happens during step 2 (committing the header), a surviving copy of the previous identical headers will remain, ensuring coherency of all previously committed data. Excepting the header area, consistency checks or fix-ups after a crash or a power failure are never necessary. .. _ACID: http://en.wikipedia.org/wiki/ACID .. _MVCC: http://en.wikipedia.org/wiki/Multiversion_concurrency_control .. _B-trees: http://en.wikipedia.org/wiki/B-tree Compaction ========== Wasted space is recovered by occasional compaction. On schedule, or when the database file exceeds a certain amount of wasted space, the compaction process clones all the active data to a new file and then discards the old file. The database remains completely online the entire time and all updates and reads are allowed to complete successfully. The old database file is deleted only when all the data has been copied and all users transitioned to the new file. Views ===== ACID properties only deal with storage and updates, but we also need the ability to show our data in interesting and useful ways. Unlike SQL databases where data must be carefully decomposed into tables, data in CouchDB is stored in semi-structured documents. CouchDB documents are flexible and each has its own implicit structure, which alleviates the most difficult problems and pitfalls of bi-directionally replicating table schemas and their contained data. But beyond acting as a fancy file server, a simple document model for data storage and sharing is too simple to build real applications on -- it simply doesn't do enough of the things we want and expect. We want to slice and dice and see our data in many different ways. What is needed is a way to filter, organize and report on data that hasn't been decomposed into tables. .. seealso:: :ref:`views` View Model ---------- To address this problem of adding structure back to unstructured and semi-structured data, CouchDB integrates a view model. Views are the method of aggregating and reporting on the documents in a database, and are built on-demand to aggregate, join and report on database documents. Because views are built dynamically and don’t affect the underlying document, you can have as many different view representations of the same data as you like. View definitions are strictly virtual and only display the documents from the current database instance, making them separate from the data they display and compatible with replication. CouchDB views are defined inside special **design documents** and can replicate across database instances like regular documents, so that not only data replicates in CouchDB, but entire application designs replicate too. Javascript View Functions ------------------------- Views are defined using Javascript functions acting as the map part in a `map-reduce system`_. A :ref:`view function <viewfun>` takes a CouchDB document as an argument and then does whatever computation it needs to do to determine the data that is to be made available through the view, if any. It can add multiple rows to the view based on a single document, or it can add no rows at all. .. _map-reduce system: http://en.wikipedia.org/wiki/MapReduce .. seealso:: :ref:`viewfun` View Indexes ------------ Views are a dynamic representation of the actual document contents of a database, and CouchDB makes it easy to create useful views of data. But generating a view of a database with hundreds of thousands or millions of documents is time and resource consuming, it's not something the system should do from scratch each time. To keep view querying fast, the view engine maintains indexes of its views, and incrementally updates them to reflect changes in the database. CouchDB’s core design is largely optimized around the need for efficient, incremental creation of views and their indexes. Views and their functions are defined inside special "design" documents, and a design document may contain any number of uniquely named view functions. When a user opens a view and its index is automatically updated, all the views in the same design document are indexed as a single group. The view builder uses the database sequence ID to determine if the view group is fully up-to-date with the database. If not, the view engine examines the all database documents (in packed sequential order) changed since the last refresh. Documents are read in the order they occur in the disk file, reducing the frequency and cost of disk head seeks. The views can be read and queried simultaneously while also being refreshed. If a client is slowly streaming out the contents of a large view, the same view can be concurrently opened and refreshed for another client without blocking the first client. This is true for any number of simultaneous client readers, who can read and query the view while the index is concurrently being refreshed for other clients without causing problems for the readers. As documents are processed by the view engine through your 'map' and 'reduce' functions, their previous row values are removed from the view indexes, if they exist. If the document is selected by a view function, the function results are inserted into the view as a new row. When view index changes are written to disk, the updates are always appended at the end of the file, serving to both reduce disk head seek times during disk commits and to ensure crashes and power failures can not cause corruption of indexes. If a crash occurs while updating a view index, the incomplete index updates are simply lost and rebuilt incrementally from its previously committed state. Security and Validation ======================= To protect who can read and update documents, CouchDB has a simple reader access and update validation model that can be extended to implement custom security models. .. seealso:: :ref:`api/db/security` Administrator Access -------------------- CouchDB database instances have administrator accounts. Administrator accounts can create other administrator accounts and update design documents. Design documents are special documents containing view definitions and other special formulas, as well as regular fields and blobs. Update Validation ----------------- As documents written to disk, they can be validated dynamically by javascript functions for both security and data validation. When the document passes all the formula validation criteria, the update is allowed to continue. If the validation fails, the update is aborted and the user client gets an error response. Both the user's credentials and the updated document are given as inputs to the validation formula, and can be used to implement custom security models by validating a user's permissions to update a document. A basic "author only" update document model is trivial to implement, where document updates are validated to check if the user is listed in an "author" field in the existing document. More dynamic models are also possible, like checking a separate user account profile for permission settings. The update validations are enforced for both live usage and replicated updates, ensuring security and data validation in a shared, distributed system. .. seealso:: :ref:`vdufun` Distributed Updates and Replication =================================== CouchDB is a peer-based distributed database system. It allows users and servers to access and update the same shared data while disconnected. Those changes can then be replicated bi-directionally later. The CouchDB document storage, view and security models are designed to work together to make true bi-directional replication efficient and reliable. Both documents and designs can replicate, allowing full database applications (including application design, logic and data) to be replicated to laptops for offline use, or replicated to servers in remote offices where slow or unreliable connections make sharing data difficult. The replication process is incremental. At the database level, replication only examines documents updated since the last replication. Then for each updated document, only fields and blobs that have changed are replicated across the network. If replication fails at any step, due to network problems or crash for example, the next replication restarts at the same document where it left off. Partial replicas can be created and maintained. Replication can be filtered by a javascript function, so that only particular documents or those meeting specific criteria are replicated. This can allow users to take subsets of a large shared database application offline for their own use, while maintaining normal interaction with the application and that subset of data. Conflicts --------- Conflict detection and management are key issues for any distributed edit system. The CouchDB storage system treats edit conflicts as a common state, not an exceptional one. The conflict handling model is simple and "non-destructive" while preserving single document semantics and allowing for decentralized conflict resolution. CouchDB allows for any number of conflicting documents to exist simultaneously in the database, with each database instance deterministically deciding which document is the "winner" and which are conflicts. Only the winning document can appear in views, while "losing" conflicts are still accessible and remain in the database until deleted or purged during database compaction. Because conflict documents are still regular documents, they replicate just like regular documents and are subject to the same security and validation rules. When distributed edit conflicts occur, every database replica sees the same winning revision and each has the opportunity to resolve the conflict. Resolving conflicts can be done manually or, depending on the nature of the data and the conflict, by automated agents. The system makes decentralized conflict resolution possible while maintaining single document database semantics. Conflict management continues to work even if multiple disconnected users or agents attempt to resolve the same conflicts. If resolved conflicts result in more conflicts, the system accommodates them in the same manner, determining the same winner on each machine and maintaining single document semantics. .. seealso:: :ref:`replication/conflicts` Applications ------------ Using just the basic replication model, many traditionally single server database applications can be made distributed with almost no extra work. CouchDB replication is designed to be immediately useful for basic database applications, while also being extendable for more elaborate and full-featured uses. With very little database work, it is possible to build a distributed document management application with granular security and full revision histories. Updates to documents can be implemented to exploit incremental field and blob replication, where replicated updates are nearly as efficient and incremental as the actual edit differences ("diffs"). The CouchDB replication model can be modified for other distributed update models. If the storage engine is enhanced to allow multi-document update transactions, it is possible to perform Subversion-like "all or nothing" atomic commits when replicating with an upstream server, such that any single document conflict or validation failure will cause the entire update to fail. Like Subversion, conflicts would be resolved by doing a "pull" replication to force the conflicts locally, then merging and re-replicating to the upstream server. Implementation ============== CouchDB is built on the `Erlang OTP platform`_, a functional, concurrent programming language and development platform. Erlang was developed for real-time telecom applications with an extreme emphasis on reliability and availability. Both in syntax and semantics, Erlang is very different from conventional programming languages like C or Java. Erlang uses lightweight "processes" and message passing for concurrency, it has no shared state threading and all data is immutable. The robust, concurrent nature of Erlang is ideal for a database server. CouchDB is designed for lock-free concurrency, in the conceptual model and the actual Erlang implementation. Reducing bottlenecks and avoiding locks keeps the entire system working predictably under heavy loads. CouchDB can accommodate many clients replicating changes, opening and updating documents, and querying views whose indexes are simultaneously being refreshed for other clients, without needing locks. For higher availability and more concurrent users, CouchDB is designed for "shared nothing" clustering. In a "shared nothing" cluster, each machine is independent and replicates data with its cluster mates, allowing individual server failures with zero downtime. And because consistency scans and fix-ups aren’t needed on restart, if the entire cluster fails -- due to a power outage in a datacenter, for example -- the entire CouchDB distributed system becomes immediately available after a restart. CouchDB is built from the start with a consistent vision of a distributed document database system. Unlike cumbersome attempts to bolt distributed features on top of the same legacy models and databases, it is the result of careful ground-up design, engineering and integration. The document, view, security and replication models, the special purpose query language, the efficient and robust disk layout and the concurrent and reliable nature of the Erlang platform are all carefully integrated for a reliable and efficient system. .. _Erlang OTP platform: http://www.erlang.org/ �������������������������������������������������������apache-couchdb-1.6.0/share/doc/src/intro/curl.rst���������������������������������������������������0000644�0001750�0000144�00000007756�12332105522�021625� 0����������������������������������������������������������������������������������������������������ustar�00djc�����������������������������users���������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������.. Licensed under the Apache License, Version 2.0 (the "License"); you may not .. use this file except in compliance with the License. You may obtain a copy of .. the License at .. .. http://www.apache.org/licenses/LICENSE-2.0 .. .. Unless required by applicable law or agreed to in writing, software .. distributed under the License is distributed on an "AS IS" BASIS, WITHOUT .. WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the .. License for the specific language governing permissions and limitations under .. the License. .. _intro/curl: ============================== cURL: Your Command Line Friend ============================== The ``curl`` utility is a command line tool available on Unix, Linux, Mac OS X and Windows and many other platforms. ``curl`` provides easy access to the HTTP protocol (among others) directly from the command-line and is therefore an ideal way of interacting with CouchDB over the HTTP REST API. For simple ``GET`` requests you can supply the URL of the request. For example, to get the database information: .. code-block:: bash shell> curl http://127.0.0.1:5984 This returns the database information (formatted in the output below for clarity): .. code-block:: json { "couchdb": "Welcome", "uuid": "85fb71bf700c17267fef77535820e371", "vendor": { "name": "The Apache Software Foundation", "version": "1.4.0" }, "version": "1.4.0" } .. note:: For some URLs, especially those that include special characters such as ampersand, exclamation mark, or question mark, you should quote the URL you are specifying on the command line. For example: .. code-block:: bash shell> curl 'http://couchdb:5984/_uuids?count=5' You can explicitly set the HTTP command using the ``-X`` command line option. For example, when creating a database, you set the name of the database in the URL you send using a PUT request: .. code-block:: bash shell> curl -X PUT http://127.0.0.1:5984/demo {"ok":true} But to obtain the database information you use a ``GET`` request (with the return information formatted for clarity): .. code-block:: bash shell> curl -X GET http://127.0.0.1:5984/demo { "compact_running" : false, "doc_count" : 0, "db_name" : "demo", "purge_seq" : 0, "committed_update_seq" : 0, "doc_del_count" : 0, "disk_format_version" : 5, "update_seq" : 0, "instance_start_time" : "1306421773496000", "disk_size" : 79 } For certain operations, you must specify the content type of request, which you do by specifying the ``Content-Type`` header using the ``-H`` command-line option: .. code-block:: bash shell> curl -H 'Content-Type: application/json' http://127.0.0.1:5984/_uuids You can also submit 'payload' data, that is, data in the body of the HTTP request using the ``-d`` option. This is useful if you need to submit JSON structures, for example document data, as part of the request. For example, to submit a simple document to the ``demo`` database: .. code-block:: bash shell> curl -H 'Content-Type: application/json' \ -X POST http://127.0.0.1:5984/demo \ -d '{"company": "Example, Inc."}' {"ok":true,"id":"8843faaf0b831d364278331bc3001bd8", "rev":"1-33b9fbce46930280dab37d672bbc8bb9"} In the above example, the argument after the ``-d`` option is the JSON of the document we want to submit. The document can be accessed by using the automatically generated document ID that was returned: .. code-block:: bash shell> curl -X GET http://127.0.0.1:5984/demo/8843faaf0b831d364278331bc3001bd8 {"_id":"8843faaf0b831d364278331bc3001bd8", "_rev":"1-33b9fbce46930280dab37d672bbc8bb9", "company":"Example, Inc."} The API samples in the :ref:`api/basics` show the HTTP command, URL and any payload information that needs to be submitted (and the expected return value). All of these examples can be reproduced using ``curl`` with the command-line examples shown above. ������������������apache-couchdb-1.6.0/share/doc/src/intro/index.rst��������������������������������������������������0000644�0001750�0000144�00000004247�12332105522�021757� 0����������������������������������������������������������������������������������������������������ustar�00djc�����������������������������users���������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������.. Licensed under the Apache License, Version 2.0 (the "License"); you may not .. use this file except in compliance with the License. You may obtain a copy of .. the License at .. .. http://www.apache.org/licenses/LICENSE-2.0 .. .. Unless required by applicable law or agreed to in writing, software .. distributed under the License is distributed on an "AS IS" BASIS, WITHOUT .. WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the .. License for the specific language governing permissions and limitations under .. the License. .. _intro: ============ Introduction ============ CouchDB is a database that completely embraces the web. Store your data with JSON documents. Access your documents with your web browser, :ref:`via HTTP <api/basics>`. :ref:`Query <api/doc>`, :ref:`combine <views>`, and :ref:`transform <listfun>` your documents with :ref:`JavaScript <query-server/js>`. CouchDB works well with modern web and mobile apps. You can even serve web apps directly out of CouchDB. And you can distribute your data, or your apps, efficiently using CouchDB’s :ref:`incremental replication <replication/intro>`. CouchDB supports master-master setups with :ref:`automatic conflict <replication/conflicts>` detection. CouchDB comes with a suite of features, such as on-the-fly document transformation and real-time :ref:`change notifications <changes>`, that makes :ref:`web app <couchapp>` development a breeze. It even comes with an easy to use :ref:`web administration console <intro/futon>`. You guessed it, served up directly out of CouchDB! We care a lot about `distributed scaling`_. CouchDB is highly available and partition tolerant, but is also :ref:`eventually consistent <intro/consistency>`. And we care *a lot* about your data. CouchDB has a fault-tolerant storage engine that puts the safety of your data first. In this section you'll learn about every basic bit of CouchDB, see upon what conceptions and technologies it built and walk through short tutorial that teach how to use CouchDB. .. _distributed scaling: http://en.wikipedia.org/wiki/CAP_theorem .. toctree:: :maxdepth: 2 overview why consistency tour api security futon curl ���������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������apache-couchdb-1.6.0/share/doc/src/intro/futon.rst��������������������������������������������������0000644�0001750�0000144�00000015012�12332105522�021773� 0����������������������������������������������������������������������������������������������������ustar�00djc�����������������������������users���������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������.. Licensed under the Apache License, Version 2.0 (the "License"); you may not .. use this file except in compliance with the License. You may obtain a copy of .. the License at .. .. http://www.apache.org/licenses/LICENSE-2.0 .. .. Unless required by applicable law or agreed to in writing, software .. distributed under the License is distributed on an "AS IS" BASIS, WITHOUT .. WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the .. License for the specific language governing permissions and limitations under .. the License. .. _intro/futon: =================================== Futon: Web GUI Administration Panel =================================== Futon is a native web-based interface built into CouchDB. It provides a basic interface to the majority of the functionality, including the ability to create, update, delete and view documents and views, provides access to the configuration parameters, and an interface for initiating replication. The default view is the Overview page which provides you with a list of the databases. The basic structure of the page is consistent regardless of the section you are in. The main panel on the left provides the main interface to the databases, configuration or replication systems. The side panel on the right provides navigation to the main areas of Futon interface: .. figure:: ../../images/futon-overview.png :align: center :alt: Futon Overview Futon Overview The main sections are: - Overview The main overview page, which provides a list of the databases and provides the interface for querying the database and creating and updating documents. See :ref:`futon-management`. - Configuration An interface into the configuration of your CouchDB installation. The interface allows you to edit the different configurable parameters. For more details on configuration, see :ref:`config` section. - Replicator An interface to the replication system, enabling you to initiate replication between local and remote databases. See :ref:`futon-replication`. - Status Displays a list of the running background tasks on the server. Background tasks include view index building, compaction and replication. The Status page is an interface to the :ref:`Active Tasks <api/server/active_tasks>` API call. - Verify Installation The Verify Installation allows you to check whether all of the components of your CouchDB installation are correctly installed. - Test Suite The Test Suite section allows you to run the built-in test suite. This executes a number of test routines entirely within your browser to test the API and functionality of your CouchDB installation. If you select this page, you can run the tests by using the Run All button. This will execute all the tests, which may take some time. .. _futon-management: Managing Databases and Documents ================================ You can manage databases and documents within Futon using the main Overview section of the Futon interface. To create a new database, click the Create Database ELLIPSIS button. You will be prompted for the database name, as shown in the figure below. .. figure:: ../../images/futon-createdb.png :align: center :alt: Creating a Database Creating a Database Once you have created the database (or selected an existing one), you will be shown a list of the current documents. If you create a new document, or select an existing document, you will be presented with the edit document display. Editing documents within Futon requires selecting the document and then editing (and setting) the fields for the document individually before saving the document back into the database. For example, the figure below shows the editor for a single document, a newly created document with a single ID, the document ``_id`` field. .. figure:: ../../images/futon-editdoc.png :align: center :alt: Editing a Document Editing a Document To add a field to the document: 1. Click Add Field. 2. In the fieldname box, enter the name of the field you want to create. For example, ā€œcompanyā€. 3. Click the green tick next to the field name to confirm the field name change. 4. Double-click the corresponding Value cell. 5. Enter a company name, for example ā€œExampleā€. 6. Click the green tick next to the field value to confirm the field value. 7. The document is still not saved as this point. You must explicitly save the document by clicking the Save Document button at the top of the page. This will save the document, and then display the new document with the saved revision information (the ``_rev`` field). .. figure:: ../../images/futon-editeddoc.png :align: center :alt: Edited Document Edited Document The same basic interface is used for all editing operations within Futon. You *must* remember to save the individual element (fieldname, value) using the green tick button, before then saving the document. .. _futon-replication: Configuring Replication ======================= When you click the Replicator option within the Tools menu you are presented with the Replicator screen. This allows you to start replication between two databases by filling in or select the appropriate options within the form provided. .. figure:: ../../images/futon-replform.png :align: center :alt: Replication Form Replication Form To start a replication process, either the select the local database or enter a remote database name into the corresponding areas of the form. Replication occurs from the database on the left to the database on the right. If you are specifying a remote database name, you must specify the full URL of the remote database (including the host, port number and database name). If the remote instance requires authentication, you can specify the username and password as part of the URL, for example ``http://username:pass@remotehost:5984/demo``. To enable continuous replication, click the Continuous checkbox. To start the replication process, click the Replicate button. The replication process should start and will continue in the background. If the replication process will take a long time, you can monitor the status of the replication using the Status option under the Tools menu. Once replication has been completed, the page will show the information returned when the replication process completes by the API. The Replicator tool is an interface to the underlying replication API. For more information, see :ref:`api/server/replicate`. For more information on replication, see :ref:`replication`. ����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������apache-couchdb-1.6.0/share/doc/src/intro/api.rst����������������������������������������������������0000644�0001750�0000144�00000074576�12332105522�021435� 0����������������������������������������������������������������������������������������������������ustar�00djc�����������������������������users���������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������.. Licensed under the Apache License, Version 2.0 (the "License"); you may not .. use this file except in compliance with the License. You may obtain a copy of .. the License at .. .. http://www.apache.org/licenses/LICENSE-2.0 .. .. Unless required by applicable law or agreed to in writing, software .. distributed under the License is distributed on an "AS IS" BASIS, WITHOUT .. WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the .. License for the specific language governing permissions and limitations under .. the License. .. _intro/api: ============ The Core API ============ This document explores the CouchDB in minute detail. It shows all the nitty-gritty and clever bits. We show you best practices and guide you around common pitfalls. We start out by revisiting the basic operations we ran in the previous document :ref:`intro/tour`, looking behind the scenes. We also show what Futon needs to do behind its user interface to give us the nice features we saw earlier. This document is both an introduction to the core CouchDB API as well as a reference. If you can't remember how to run a particular request or why some parameters are needed, you can always come back here and look things up (we are probably the heaviest users of this document). While explaining the API bits and pieces, we sometimes need to take a larger detour to explain the reasoning for a particular request. This is a good opportunity for us to tell you why CouchDB works the way it does. The API can be subdivided into the following sections. We'll explore them individually: .. contents:: :depth: 1 :local: Server ====== This one is basic and simple. It can serve as a sanity check to see if CouchDB is running at all. It can also act as a safety guard for libraries that require a certain version of CouchDB. We're using the `curl`_ utility again:: curl http://127.0.0.1:5984/ CouchDB replies, all excited to get going: .. code-block:: javascript { "couchdb": "Welcome", "uuid": "85fb71bf700c17267fef77535820e371", "vendor": { "name": "The Apache Software Foundation", "version": "1.5.0" }, "version": "1.5.0" } You get back a JSON string, that, if parsed into a native object or data structure of your programming language, gives you access to the welcome string and version information. This is not terribly useful, but it illustrates nicely the way CouchDB behaves. You send an HTTP request and you receive a JSON string in the HTTP response as a result. .. _curl: http://curl.haxx.se/ Databases ========= Now let's do something a little more useful: *create databases*. For the strict, CouchDB is a *database management system* (DMS). That means it can hold multiple databases. A database is a bucket that holds "related data". We'll explore later what that means exactly. In practice, the terminology is overlapping -- often people refer to a DMS as "a database" and also a database within the DMS as "a database." We might follow that slight oddity, so don't get confused by it. In general, it should be clear from the context if we are talking about the whole of CouchDB or a single database within CouchDB. Now let's make one! We want to store our favorite music albums, and we creatively give our database the name albums. Note that we're now using the ``-X`` option again to tell curl to send a :method:`PUT` request instead of the default :method:`GET` request:: curl -X PUT http://127.0.0.1:5984/albums CouchDB replies: .. code-block:: javascript {"ok":true} That's it. You created a database and CouchDB told you that all went well. What happens if you try to create a database that already exists? Let's try to create that database again:: curl -X PUT http://127.0.0.1:5984/albums CouchDB replies: .. code-block:: javascript {"error":"file_exists","reason":"The database could not be created, the file already exists."} We get back an error. This is pretty convenient. We also learn a little bit about how CouchDB works. CouchDB stores each database in a single file. Very simple. Let's create another database, this time with curl's ``-v`` (for "verbose") option. The verbose option tells curl to show us not only the essentials -- the HTTP response body -- but all the underlying request and response details:: curl -vX PUT http://127.0.0.1:5984/albums-backup curl elaborates:: * About to connect() to 127.0.0.1 port 5984 (#0) * Trying 127.0.0.1... connected * Connected to 127.0.0.1 (127.0.0.1) port 5984 (#0) > PUT /albums-backup HTTP/1.1 > User-Agent: curl/7.16.3 (powerpc-apple-darwin9.0) libcurl/7.16.3 OpenSSL/0.9.7l zlib/1.2.3 > Host: 127.0.0.1:5984 > Accept: */* > < HTTP/1.1 201 Created < Server: CouchDB (Erlang/OTP) < Date: Sun, 05 Jul 2009 22:48:28 GMT < Content-Type: text/plain;charset=utf-8 < Content-Length: 12 < Cache-Control: must-revalidate < {"ok":true} * Connection #0 to host 127.0.0.1 left intact * Closing connection #0 What a mouthful. Let's step through this line by line to understand what's going on and find out what's important. Once you've seen this output a few times, you'll be able to spot the important bits more easily. :: * About to connect() to 127.0.0.1 port 5984 (#0) This is curl telling us that it is going to establish a TCP connection to the CouchDB server we specified in our request URI. Not at all important, except when debugging networking issues. :: * Trying 127.0.0.1... connected * Connected to 127.0.0.1 (127.0.0.1) port 5984 (#0) curl tells us it successfully connected to CouchDB. Again, not important if you aren't trying to find problems with your network. The following lines are prefixed with ``>`` and ``<`` characters. The ``>`` means the line was sent to CouchDB verbatim (without the actual ``>``). The ``<`` means the line was sent back to curl by CouchDB. :: > PUT /albums-backup HTTP/1.1 This initiates an HTTP request. Its *method* is :method:`PUT`, the *URI* is ``/albums-backup``, and the HTTP version is ``HTTP/1.1``. There is also ``HTTP/1.0``, which is simpler in some cases, but for all practical reasons you should be using ``HTTP/1.1``. Next, we see a number of *request headers*. These are used to provide additional details about the request to CouchDB. :: > User-Agent: curl/7.16.3 (powerpc-apple-darwin9.0) libcurl/7.16.3 OpenSSL/0.9.7l zlib/1.2.3 The User-Agent header tells CouchDB which piece of client software is doing the HTTP request. We don't learn anything new: it's curl. This header is often useful in web development when there are known errors in client implementations that a server might want to prepare the response for. It also helps to determine which platform a user is on. This information can be used for technical and statistical reasons. For CouchDB, the :header:`User-Agent` header is irrelevant. :: > Host: 127.0.0.1:5984 The :header:`Host` header is required by ``HTTP 1.1``. It tells the server the hostname that came with the request. :: > Accept: */* The :header:`Accept` header tells CouchDB that curl accepts any media type. We'll look into why this is useful a little later. :: > An empty line denotes that the request headers are now finished and the rest of the request contains data we're sending to the server. In this case, we're not sending any data, so the rest of the curl output is dedicated to the HTTP response. :: < HTTP/1.1 201 Created The first line of CouchDB's HTTP response includes the HTTP version information (again, to acknowledge that the requested version could be processed), an HTTP *status code*, and a *status code message*. Different requests trigger different response codes. There's a whole range of them telling the client (curl in our case) what effect the request had on the server. Or, if an error occurred, what kind of error. :rfc:`2616` (the HTTP 1.1 specification) defines clear behavior for response codes. CouchDB fully follows the RFC. The :statuscode:`201` status code tells the client that the resource the request was made against was successfully created. No surprise here, but if you remember that we got an error message when we tried to create this database twice, you now know that this response could include a different response code. Acting upon responses based on response codes is a common practice. For example, all response codes of :statuscode:`400` or larger tell you that some error occurred. If you want to shortcut your logic and immediately deal with the error, you could just check a >= ``400`` response code. :: < Server: CouchDB (Erlang/OTP) The :header:`Server` header is good for diagnostics. It tells us which CouchDB version and which underlying Erlang version we are talking to. In general, you can ignore this header, but it is good to know it's there if you need it. :: < Date: Sun, 05 Jul 2009 22:48:28 GMT The :header:`Date` header tells you the time of the server. Since client and server time are not necessarily synchronized, this header is purely informational. You shouldn't build any critical application logic on top of this! :: < Content-Type: text/plain;charset=utf-8 The :header:`Content-Type` header tells you which MIME type the HTTP response body is and its encoding. We already know CouchDB returns JSON strings. The appropriate :header:`Content-Type` header is :mimetype:`application/json`. Why do we see :mimetype:`text/plain`? This is where pragmatism wins over purity. Sending an :mimetype:`application/json` :header:`Content-Type` header will make a browser offer you the returned JSON for download instead of just displaying it. Since it is extremely useful to be able to test CouchDB from a browser, CouchDB sends a :mimetype:`text/plain` content type, so all browsers will display the JSON as text. .. note:: There are some extensions that make your browser JSON-aware, but they are not installed by default. For more information, look at the popular `JSONView`_ extension, available for both Firefox and Chrome. .. _JSONView: http://jsonview.com/ Do you remember the :header:`Accept` request header and how it is set to ``\*/\* -> */*`` to express interest in any MIME type? If you send ``Accept: application/json`` in your request, CouchDB knows that you can deal with a pure JSON response with the proper :header:`Content-Type` header and will use it instead of :mimetype:`text/plain`. :: < Content-Length: 12 The :header:`Content-Length` header simply tells us how many bytes the response body has. :: < Cache-Control: must-revalidate This :header:`Cache-Control` header tells you, or any proxy server between CouchDB and you, not to cache this response. :: < This empty line tells us we're done with the response headers and what follows now is the response body. .. code-block:: javascript {"ok":true} We've seen this before. :: * Connection #0 to host 127.0.0.1 left intact * Closing connection #0 The last two lines are curl telling us that it kept the TCP connection it opened in the beginning open for a moment, but then closed it after it received the entire response. Throughout the documents, we'll show more requests with the ``-v`` option, but we'll omit some of the headers we've seen here and include only those that are important for the particular request. Creating databases is all fine, but how do we get rid of one? Easy -- just change the HTTP method:: > curl -vX DELETE http://127.0.0.1:5984/albums-backup This deletes a CouchDB database. The request will remove the file that the database contents are stored in. There is no *"Are you sure?"* safety net or any *"Empty the trash"* magic you've got to do to delete a database. Use this command with care. Your data will be deleted without a chance to bring it back easily if you don't have a backup copy. This section went knee-deep into HTTP and set the stage for discussing the rest of the core CouchDB API. Next stop: documents. Documents ========= .. _GUID: http://en.wikipedia.org/wiki/Globally_unique_identifier .. _UUID: http://en.wikipedia.org/wiki/Universally_unique_identifier Documents are CouchDB's central data structure. The idea behind a document is, unsurprisingly, that of a real-world document -- a sheet of paper such as an invoice, a recipe, or a business card. We already learned that CouchDB uses the JSON format to store documents. Let's see how this storing works at the lowest level. Each document in CouchDB has an *ID*. This ID is unique per database. You are free to choose any string to be the ID, but for best results we recommend a `UUID`_ (or `GUID`_), i.e., a Universally (or Globally) Unique IDentifier. UUIDs are random numbers that have such a low collision probability that everybody can make thousands of UUIDs a minute for millions of years without ever creating a duplicate. This is a great way to ensure two independent people cannot create two different documents with the same ID. Why should you care what somebody else is doing? For one, that somebody else could be you at a later time or on a different computer; secondly, CouchDB replication lets you share documents with others and using UUIDs ensures that it all works. But more on that later; let's make some documents:: curl -X PUT http://127.0.0.1:5984/albums/6e1295ed6c29495e54cc05947f18c8af -d '{"title":"There is Nothing Left to Lose","artist":"Foo Fighters"}' CouchDB replies: .. code-block:: javascript {"ok":true,"id":"6e1295ed6c29495e54cc05947f18c8af","rev":"1-2902191555"} The curl command appears complex, but let's break it down. First, ``-X PUT`` tells curl to make a :method:`PUT` request. It is followed by the URL that specifies your CouchDB IP address and port. The resource part of the URL ``/albums/6e1295ed6c29495e54cc05947f18c8af`` specifies the location of a document inside our albums database. The wild collection of numbers and characters is a UUID. This UUID is your document's ID. Finally, the ``-d`` flag tells curl to use the following string as the body for the :method:`PUT` request. The string is a simple JSON structure including ``title`` and ``artist`` attributes with their respective values. .. note:: If you don't have a UUID handy, you can ask CouchDB to give you one (in fact, that is what we did just now without showing you). Simply send a :get:`/_uuids` request:: curl -X GET http://127.0.0.1:5984/_uuids CouchDB replies: .. code-block:: javascript {"uuids":["6e1295ed6c29495e54cc05947f18c8af"]} VoilĆ , a UUID. If you need more than one, you can pass in the ``?count=10`` HTTP parameter to request 10 UUIDs, or really, any number you need. To double-check that CouchDB isn't lying about having saved your document (it usually doesn't), try to retrieve it by sending a GET request:: curl -X GET http://127.0.0.1:5984/albums/6e1295ed6c29495e54cc05947f18c8af We hope you see a pattern here. Everything in CouchDB has an address, a URI, and you use the different HTTP methods to operate on these URIs. CouchDB replies: .. code-block:: javascript {"_id":"6e1295ed6c29495e54cc05947f18c8af","_rev":"1-2902191555","title":"There is Nothing Left to Lose","artist":"Foo Fighters"} This looks a lot like the document you asked CouchDB to save, which is good. But you should notice that CouchDB added two fields to your JSON structure. The first is ``_id``, which holds the UUID we asked CouchDB to save our document under. We always know the ID of a document if it is included, which is very convenient. The second field is ``_rev``. It stands for *revision*. Revisions --------- If you want to change a document in CouchDB, you don't tell it to go and find a field in a specific document and insert a new value. Instead, you load the full document out of CouchDB, make your changes in the JSON structure (or object, when you are doing actual programming), and save the entire new revision (or version) of that document back into CouchDB. Each revision is identified by a new ``_rev`` value. If you want to update or delete a document, CouchDB expects you to include the ``_rev`` field of the revision you wish to change. When CouchDB accepts the change, it will generate a new revision number. This mechanism ensures that, in case somebody else made a change without you knowing before you got to request the document update, CouchDB will not accept your update because you are likely to overwrite data you didn't know existed. Or simplified: whoever saves a change to a document first, wins. Let's see what happens if we don't provide a ``_rev`` field (which is equivalent to providing a outdated value):: curl -X PUT http://127.0.0.1:5984/albums/6e1295ed6c29495e54cc05947f18c8af \ -d '{"title":"There is Nothing Left to Lose","artist":"Foo Fighters","year":"1997"}' CouchDB replies: .. code-block:: javascript {"error":"conflict","reason":"Document update conflict."} If you see this, add the latest revision number of your document to the JSON structure:: curl -X PUT http://127.0.0.1:5984/albums/6e1295ed6c29495e54cc05947f18c8af \ -d '{"_rev":"1-2902191555","title":"There is Nothing Left to Lose","artist":"Foo Fighters","year":"1997"}' Now you see why it was handy that CouchDB returned that ``_rev`` when we made the initial request. CouchDB replies: .. code-block:: javascript {"ok":true,"id":"6e1295ed6c29495e54cc05947f18c8af","rev":"2-8aff9ee9d06671fa89c99d20a4b3ae"} CouchDB accepted your write and also generated a new revision number. The revision number is the *MD5 hash* of the transport representation of a document with an ``N-`` prefix denoting the number of times a document got updated. This is useful for replication. See :ref:`replication/conflicts` for more information. There are multiple reasons why CouchDB uses this revision system, which is also called Multi-Version Concurrency Control (`MVCC`_). They all work hand-in-hand, and this is a good opportunity to explain some of them. .. _MVCC: http://en.wikipedia.org/wiki/Multiversion_concurrency_control One of the aspects of the HTTP protocol that CouchDB uses is that it is stateless. What does that mean? When talking to CouchDB you need to make requests. Making a request includes opening a network connection to CouchDB, exchanging bytes, and closing the connection. This is done every time you make a request. Other protocols allow you to open a connection, exchange bytes, keep the connection open, exchange more bytes later -- maybe depending on the bytes you exchanged at the beginning -- and eventually close the connection. Holding a connection open for later use requires the server to do extra work. One common pattern is that for the lifetime of a connection, the client has a consistent and static view of the data on the server. Managing huge amounts of parallel connections is a significant amount of work. HTTP connections are usually short-lived, and making the same guarantees is a lot easier. As a result, CouchDB can handle many more concurrent connections. Another reason CouchDB uses MVCC is that this model is simpler conceptually and, as a consequence, easier to program. CouchDB uses less code to make this work, and less code is always good because the ratio of defects per lines of code is static. The revision system also has positive effects on replication and storage mechanisms, but we'll explore these later in the documents. .. warning:: The terms *version* and *revision* might sound familiar (if you are programming without version control, stop reading this guide right now and start learning one of the popular systems). Using new versions for document changes works a lot like version control, but there's an important difference: **CouchDB does not guarantee that older versions are kept around**. Documents in Detail ------------------- Now let's have a closer look at our document creation requests with the curl ``-v`` flag that was helpful when we explored the database API earlier. This is also a good opportunity to create more documents that we can use in later examples. We'll add some more of our favorite music albums. Get a fresh UUID from the ``/_uuids`` resource. If you don't remember how that works, you can look it up a few pages back. :: curl -vX PUT http://127.0.0.1:5984/albums/70b50bfa0a4b3aed1f8aff9e92dc16a0 \ -d '{"title":"Blackened Sky","artist":"Biffy Clyro","year":2002}' .. note:: By the way, if you happen to know more information about your favorite albums, don't hesitate to add more properties. And don't worry about not knowing all the information for all the albums. CouchDB's schema-less documents can contain whatever you know. After all, you should relax and not worry about data. Now with the ``-v`` option, CouchDB's reply (with only the important bits shown) looks like this:: > PUT /albums/70b50bfa0a4b3aed1f8aff9e92dc16a0 HTTP/1.1 > < HTTP/1.1 201 Created < Location: http://127.0.0.1:5984/albums/70b50bfa0a4b3aed1f8aff9e92dc16a0 < ETag: "1-e89c99d29d06671fa0a4b3ae8aff9e" < {"ok":true,"id":"70b50bfa0a4b3aed1f8aff9e92dc16a0","rev":"1-e89c99d29d06671fa0a4b3ae8aff9e"} We're getting back the :statuscode:`201` HTTP status code in the response headers, as we saw earlier when we created a database. The :header:`Location` header gives us a full URL to our newly created document. And there's a new header. An :header:`ETag` in HTTP-speak identifies a specific version of a resource. In this case, it identifies a specific version (the first one) of our new document. Sound familiar? Yes, conceptually, an :header:`ETag` is the same as a CouchDB document revision number, and it shouldn't come as a surprise that CouchDB uses revision numbers for ETags. ETags are useful for caching infrastructures. Attachments ----------- CouchDB documents can have attachments just like an email message can have attachments. An attachment is identified by a name and includes its MIME type (or :header:`Content-Type`) and the number of bytes the attachment contains. Attachments can be any data. It is easiest to think about attachments as files attached to a document. These files can be text, images, Word documents, music, or movie files. Let's make one. Attachments get their own URL where you can upload data. Say we want to add the album artwork to the ``6e1295ed6c29495e54cc05947f18c8af`` document (*"There is Nothing Left to Lose"*), and let's also say the artwork is in a file `artwork.jpg` in the current directory:: curl -vX PUT http://127.0.0.1:5984/albums/6e1295ed6c29495e54cc05947f18c8af/artwork.jpg?rev=2-2739352689 \ --data-binary @artwork.jpg -H "Content-Type:image/jpg" .. note:: The ``--data-binary`` ``@`` option tells curl to read a file's contents into the HTTP request body. We're using the ``-H`` option to tell CouchDB that we're uploading a JPEG file. CouchDB will keep this information around and will send the appropriate header when requesting this attachment; in case of an image like this, a browser will render the image instead of offering you the data for download. This will come in handy later. Note that you need to provide the current revision number of the document you're attaching the artwork to, just as if you would update the document. Because, after all, attaching some data is changing the document. You should now see your artwork image if you point your browser to http://127.0.0.1:5984/albums/6e1295ed6c29495e54cc05947f18c8af/artwork.jpg If you request the document again, you'll see a new member:: curl http://127.0.0.1:5984/albums/6e1295ed6c29495e54cc05947f18c8af CouchDB replies: .. code-block:: javascript { "_id": "6e1295ed6c29495e54cc05947f18c8af", "_rev": "3-131533518", "title": "There is Nothing Left to Lose", "artist": "Foo Fighters", "year": "1997", "_attachments": { "artwork.jpg": { "stub": true, "content_type": "image/jpg", "length": 52450 } } } ``_attachments`` is a list of keys and values where the values are JSON objects containing the attachment metadata. ``stub=true`` tells us that this entry is just the metadata. If we use the ``?attachments=true`` HTTP option when requesting this document, we'd get a `Base64`_ encoded string containing the attachment data. .. _Base64: http://en.wikipedia.org/wiki/Base64 We'll have a look at more document request options later as we explore more features of CouchDB, such as replication, which is the next topic. Replication =========== CouchDB replication is a mechanism to synchronize databases. Much like `rsync`_ synchronizes two directories locally or over a network, replication synchronizes two databases locally or remotely. .. _rsync: http://en.wikipedia.org/wiki/Rsync In a simple :method:`POST` request, you tell CouchDB the *source* and the *target* of a replication and CouchDB will figure out which documents and new document revisions are on *source* that are not yet on *target*, and will proceed to move the missing documents and revisions over. We'll take an in-depth look at replication in the document :ref:`replication/intro`; in this document, we'll just show you how to use it. First, we'll create a target database. Note that CouchDB won't automatically create a target database for you, and will return a replication failure if the target doesn't exist (likewise for the source, but that mistake isn't as easy to make):: curl -X PUT http://127.0.0.1:5984/albums-replica Now we can use the database `albums-replica` as a replication target:: curl -vX POST http://127.0.0.1:5984/_replicate \ -d '{"source":"albums","target":"albums-replica"}' \ -H "Content-Type: application/json" .. note:: CouchDB supports the option ``"create_target":true`` placed in the JSON POSTed to the :ref:`_replicate <api/server/replicate>` URL. It implicitly creates the target database if it doesn't exist. CouchDB replies (this time we formatted the output so you can read it more easily): .. code-block:: javascript { "history": [ { "start_last_seq": 0, "missing_found": 2, "docs_read": 2, "end_last_seq": 5, "missing_checked": 2, "docs_written": 2, "doc_write_failures": 0, "end_time": "Sat, 11 Jul 2009 17:36:21 GMT", "start_time": "Sat, 11 Jul 2009 17:36:20 GMT" } ], "source_last_seq": 5, "session_id": "924e75e914392343de89c99d29d06671", "ok": true } CouchDB maintains a *session history* of replications. The response for a replication request contains the history entry for this *replication session*. It is also worth noting that the request for replication will stay open until replication closes. If you have a lot of documents, it'll take a while until they are all replicated and you won't get back the replication response until all documents are replicated. It is important to note that replication replicates the database only as it was at the point in time when replication was started. So, any additions, modifications, or deletions subsequent to the start of replication will not be replicated. We'll punt on the details again -- the ``"ok": true`` at the end tells us all went well. If you now have a look at the albums-replica database, you should see all the documents that you created in the albums database. Neat, eh? What you just did is called local replication in CouchDB terms. You created a local copy of a database. This is useful for backups or to keep snapshots of a specific state of your data around for later. You might want to do this if you are developing your applications but want to be able to roll back to a stable version of your code and data. There are more types of replication useful in other situations. The source and target members of our replication request are actually links (like in HTML) and so far we've seen links relative to the server we're working on (hence local). You can also specify a remote database as the target:: curl -vX POST http://127.0.0.1:5984/_replicate \ -d '{"source":"albums","target":"http://example.org:5984/albums-replica"}' \ -H "Content-Type:application/json" Using a *local source* and a *remote target* database is called *push replication*. We're pushing changes to a remote server. .. note:: Since we don't have a second CouchDB server around just yet, we'll just use the absolute address of our single server, but you should be able to infer from this that you can put any remote server in there. This is great for sharing local changes with remote servers or buddies next door. You can also use a *remote source* and a *local target* to do a *pull replication*. This is great for getting the latest changes from a server that is used by others:: curl -vX POST http://127.0.0.1:5984/_replicate \ -d '{"source":"http://example.org:5984/albums-replica","target":"albums"}' \ -H "Content-Type:application/json" Finally, you can run remote replication, which is mostly useful for management operations:: curl -vX POST http://127.0.0.1:5984/_replicate \ -d '{"source":"http://example.org:5984/albums","target":"http://example.org:5984/albums-replica"}' \ -H"Content-Type: application/json" .. note:: **CouchDB and REST** CouchDB prides itself on having a `RESTful`_ API, but these replication requests don't look very RESTy to the trained eye. What's up with that? While CouchDB's core database, document, and attachment API are RESTful, not all of CouchDB's API is. The replication API is one example. There are more, as we'll see later in the documents. Why are there RESTful and non-RESTful APIs mixed up here? Have the developers been too lazy to go REST all the way? Remember, REST is an architectural style that lends itself to certain architectures (such as the CouchDB document API). But it is not a one-size-fits-all. Triggering an event like replication does not make a whole lot of sense in the REST world. It is more like a traditional remote procedure call. And there is nothing wrong with this. We very much believe in the "use the right tool for the job" philosophy, and REST does not fit every job. For support, we refer to Leonard Richardson and Sam Ruby who wrote `RESTful Web Services`_ (O'Reilly), as they share our view. .. _RESTful: http://en.wikipedia.org/wiki/Representational_state_transfer .. _RESTful Web Services: http://oreilly.com/catalog/9780596529260 Wrapping Up =========== This is still not the full CouchDB API, but we discussed the essentials in great detail. We're going to fill in the blanks as we go. For now, we believe you're ready to start building CouchDB applications. .. seealso:: :ref:`Complete HTTP API Reference <api>`: - :ref:`Server API Reference <api/server>` - :ref:`Database API Reference <api/database>` - :ref:`Document API Reference <api/document>` - :ref:`Replication API <api/server/replicate>` ����������������������������������������������������������������������������������������������������������������������������������apache-couchdb-1.6.0/share/doc/src/intro/tour.rst���������������������������������������������������0000644�0001750�0000144�00000045165�12332105522�021645� 0����������������������������������������������������������������������������������������������������ustar�00djc�����������������������������users���������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������.. Licensed under the Apache License, Version 2.0 (the "License"); you may not .. use this file except in compliance with the License. You may obtain a copy of .. the License at .. .. http://www.apache.org/licenses/LICENSE-2.0 .. .. Unless required by applicable law or agreed to in writing, software .. distributed under the License is distributed on an "AS IS" BASIS, WITHOUT .. WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the .. License for the specific language governing permissions and limitations under .. the License. .. _intro/tour: =============== Getting Started =============== In this document, we'll take a quick tour of CouchDB's features, familiarizing ourselves with Futon, the built-in administration interface. We'll create our first document and experiment with CouchDB views. All Systems Are Go! =================== We'll have a very quick look at CouchDB's bare-bones Application Programming Interface (API) by using the command-line utility curl. Please note that this is not the only way of talking to CouchDB. We will show you plenty more throughout the rest of the documents. What's interesting about curl is that it gives you control over raw HTTP requests, and you can see exactly what is going on "underneath the hood" of your database. Make sure CouchDB is still running, and then do:: curl http://127.0.0.1:5984/ This issues a GET request to your newly installed CouchDB instance. The reply should look something like: .. code-block:: javascript { "couchdb": "Welcome", "uuid": "85fb71bf700c17267fef77535820e371", "version": "1.4.0", "vendor": { "version": "1.4.0", "name": "The Apache Software Foundation" } } Not all that spectacular. CouchDB is saying "hello" with the running version number. Next, we can get a list of databases:: curl -X GET http://127.0.0.1:5984/_all_dbs All we added to the previous request is the _all_dbs string. The response should look like:: ["_replicator","_users"] Oh, that's right, we didn't create any databases yet! All we see is an empty list. .. note:: The curl command issues GET requests by default. You can issue POST requests using ``curl -X POST``. To make it easy to work with our terminal history, we usually use the ``-X`` option even when issuing GET requests. If we want to send a POST next time, all we have to change is the method. HTTP does a bit more under the hood than you can see in the examples here. If you're interested in every last detail that goes over the wire, pass in the ``-v`` option (e.g., ``curl -vX GET``), which will show you the server curl tries to connect to, the request headers it sends, and response headers it receives back. Great for debugging! Let's create a database:: curl -X PUT http://127.0.0.1:5984/baseball CouchDB will reply with:: {"ok":true} Retrieving the list of databases again shows some useful results this time:: curl -X GET http://127.0.0.1:5984/_all_dbs :: ["baseball"] .. note:: We should mention JavaScript Object Notation (JSON) here, the data format CouchDB speaks. JSON is a lightweight data interchange format based on JavaScript syntax. Because JSON is natively compatible with JavaScript, your web browser is an ideal client for CouchDB. Brackets (``[]``) represent ordered lists, and curly braces (``{}``) represent key/value dictionaries. Keys must be strings, delimited by quotes (``"``), and values can be strings, numbers, booleans, lists, or key/value dictionaries. For a more detailed description of JSON, see Appendix E, JSON Primer. Let's create another database:: curl -X PUT http://127.0.0.1:5984/baseball CouchDB will reply with:: {"error":"file_exists","reason":"The database could not be created, the file already exists."} We already have a database with that name, so CouchDB will respond with an error. Let's try again with a different database name:: curl -X PUT http://127.0.0.1:5984/plankton CouchDB will reply with:: {"ok":true} Retrieving the list of databases yet again shows some useful results:: curl -X GET http://127.0.0.1:5984/_all_dbs CouchDB will respond with:: ["baseball", "plankton"] To round things off, let's delete the second database:: curl -X DELETE http://127.0.0.1:5984/plankton CouchDB will reply with:: {"ok":true} The list of databases is now the same as it was before:: curl -X GET http://127.0.0.1:5984/_all_dbs CouchDB will respond with:: ["baseball"] For brevity, we'll skip working with documents, as the next section covers a different and potentially easier way of working with CouchDB that should provide experience with this. As we work through the example, keep in mind that "under the hood" everything is being done by the application exactly as you have been doing here manually. Everything is done using GET, PUT, POST, and DELETE with a URI. Welcome to Futon ================ After having seen CouchDB's raw API, let's get our feet wet by playing with Futon, the built-in administration interface. Futon provides full access to all of CouchDB's features and makes it easy to work with some of the more complex ideas involved. With Futon we can create and destroy databases; view and edit documents; compose and run MapReduce views; and trigger replication between databases. To load Futon in your browser, visit:: http://127.0.0.1:5984/_utils/ If you're running version 0.9 or later, you should see something similar to :ref:`intro/tour-01`. In later documents, we'll focus on using CouchDB from server-side languages such as Ruby and Python. As such, this document is a great opportunity to showcase an example of natively serving up a dynamic web application using nothing more than CouchDB's integrated web server, something you may wish to do with your own applications. The first thing we should do with a fresh installation of CouchDB is run the test suite to verify that everything is working properly. This assures us that any problems we may run into aren't due to bothersome issues with our setup. By the same token, failures in the Futon test suite are a red flag, telling us to double-check our installation before attempting to use a potentially broken database server, saving us the confusion when nothing seems to be working quite like we expect! .. _intro/tour-01: .. figure:: ../../images/intro-tour-01.png :align: center :alt: The Futon welcome screen Figure 1. The Futon welcome screen Some common network configurations cause the replication test to fail when accessed via the localhost address. You can fix this by accessing CouchDB via 127.0.0.1, e.g. http://127.0.0.1:5984/_utils/. Navigate to the test suite by clicking "Test Suite" on the Futon sidebar, then click "run all" at the top to kick things off. :ref:`intro/tour-02` shows the Futon test suite running some tests. .. _intro/tour-02: .. figure:: ../../images/intro-tour-02.png :align: center :alt: The Futon test suite running some tests Figure 2. The Futon test suite running some tests Because the test suite is run from the browser, not only does it test that CouchDB is functioning properly, it also verifies that your browser's connection to the database is properly configured, which can be very handy for diagnosing misbehaving proxies or other HTTP middleware. If the test suite has an inordinate number of failures, you'll need to see the troubleshooting section in Appendix D, Installing from Source for the next steps to fix your installation. Now that the test suite is finished, you've verified that your CouchDB installation is successful and you're ready to see what else Futon has to offer. Your First Database and Document ================================ Creating a database in Futon is simple. From the overview page, click "Create Database." When asked for a name, enter hello-world and click the Create button. After your database has been created, Futon will display a list of all its documents. This list will start out empty (:ref:`intro/tour-03`), so let's create our first document. Click the "New Document" link and then the Create button in the pop up. Make sure to leave the document ID blank, and CouchDB will generate a UUID for you. For demoing purposes, having CouchDB assign a UUID is fine. When you write your first programs, we recommend assigning your own UUIDs. If your rely on the server to generate the UUID and you end up making two POST requests because the first POST request bombed out, you might generate two docs and never find out about the first one because only the second one will be reported back. Generating your own UUIDs makes sure that you'll never end up with duplicate documents. Futon will display the newly created document, with its _id and _rev as the only fields. To create a new field, click the "Add Field" button. We'll call the new field hello. Click the green check icon (or hit the Enter key) to finalize creating the hello field. Double-click the hello field's value (default null) to edit it. You can experiment with other JSON values; e.g., ``[1, 2, "c"]`` or ``{"foo": "bar"}``. Once you've entered your values into the document, make a note of its ``_rev`` attribute and click "Save Document." The result should look like :ref:`intro/tour-04`. .. _intro/tour-03: .. figure:: ../../images/intro-tour-03.png :align: center :alt: An empty database in Futon Figure 3. An empty database in Futon .. _intro/tour-04: .. figure:: ../../images/intro-tour-04.png :align: center :alt: A "hello world" document in Futon Figure 4. A "hello world" document in Futon You'll notice that the document's _rev has changed. We'll go into more detail about this in later documents, but for now, the important thing to note is that _rev acts like a safety feature when saving a document. As long as you and CouchDB agree on the most recent _rev of a document, you can successfully save your changes. Futon also provides a way to display the underlying JSON data, which can be more compact and easier to read, depending on what sort of data you are dealing with. To see the JSON version of our "hello world" document, click the Source tab. The result should look like :ref:`intro/tour-05`. .. _intro/tour-05: .. figure:: ../../images/intro-tour-05.png :align: center :alt: The JSON source of a "hello world" document in Futon Figure 5. The JSON source of a "hello world" document in Futon Running a Query Using MapReduce =============================== Traditional relational databases allow you to run any queries you like as long as your data is structured correctly. In contrast, CouchDB uses predefined map and reduce functions in a style known as MapReduce. These functions provide great flexibility because they can adapt to variations in document structure, and indexes for each document can be computed independently and in parallel. The combination of a map and a reduce function is called a view in CouchDB terminology. For experienced relational database programmers, MapReduce can take some getting used to. Rather than declaring which rows from which tables to include in a result set and depending on the database to determine the most efficient way to run the query, reduce queries are based on simple range requests against the indexes generated by your map functions. Map functions are called once with each document as the argument. The function can choose to skip the document altogether or emit one or more view rows as key/value pairs. Map functions may not depend on any information outside of the document. This independence is what allows CouchDB views to be generated incrementally and in parallel. CouchDB views are stored as rows that are kept sorted by key. This makes retrieving data from a range of keys efficient even when there are thousands or millions of rows. When writing CouchDB map functions, your primary goal is to build an index that stores related data under nearby keys. Before we can run an example MapReduce view, we'll need some data to run it on. We'll create documents carrying the price of various supermarket items as found at different shops. Let's create documents for apples, oranges, and bananas. (Allow CouchDB to generate the _id and _rev fields.) Use Futon to create documents that have a final JSON structure that looks like this: .. code-block:: javascript { "_id": "00a271787f89c0ef2e10e88a0c0001f4", "_rev": "1-2628a75ac8c3abfffc8f6e30c9949fd6", "item": "apple", "prices": { "Fresh Mart": 1.59, "Price Max": 5.99, "Apples Express": 0.79 } } This document should look like :ref:`intro/tour-06` when entered into Futon. .. _intro/tour-06: .. figure:: ../../images/intro-tour-06.png :align: center :alt: An example document with apple prices in Futon Figure 6. An example document with apple prices in Futon OK, now that that's done, let's create the document for oranges: .. code-block:: javascript { "_id": "00a271787f89c0ef2e10e88a0c0003f0", "_rev": "1-e9680c5d9a688b4ff8dd68549e8e072c", "item": "orange", "prices": { "Fresh Mart": 1.99, "Price Max": 3.19, "Citrus Circus": 1.09 } } And finally, the document for bananas: .. code-block:: javascript { "_id": "00a271787f89c0ef2e10e88a0c00048b", "_rev": "1-60e25d93dc12884676d037400a6fa189", "item": "banana", "prices": { "Fresh Mart": 1.99, "Price Max": 0.79, "Banana Montana": 4.22 } } Imagine we're catering a big luncheon, but the client is very price-sensitive. To find the lowest prices, we're going to create our first view, which shows each fruit sorted by price. Click "hello-world" to return to the hello-world overview, and then from the "select view" menu choose "Temporary view…" to create a new view. .. figure:: ../../images/intro-tour-07.png :align: center :alt: A temporary view in Futon Figure 7. A temporary view in Futon Edit the map function, on the left, so that it looks like the following: .. code-block:: javascript function(doc) { var shop, price, value; if (doc.item && doc.prices) { for (shop in doc.prices) { price = doc.prices[shop]; value = [doc.item, shop]; emit(price, value); } } } This is a JavaScript function that CouchDB runs for each of our documents as it computes the view. We'll leave the reduce function blank for the time being. Click "Run" and you should see result rows like in :ref:`intro/tour-08`, with the various items sorted by price. This map function could be even more useful if it grouped the items by type so that all the prices for bananas were next to each other in the result set. CouchDB's key sorting system allows any valid JSON object as a key. In this case, we'll emit an array of [item, price] so that CouchDB groups by item type and price. .. _intro/tour-08: .. figure:: ../../images/intro-tour-08.png :align: center :alt: The results of running a view in Futon Figure 8. The results of running a view in Futon Let's modify the view function so that it looks like this: .. code-block:: javascript function(doc) { var shop, price, key; if (doc.item && doc.prices) { for (shop in doc.prices) { price = doc.prices[shop]; key = [doc.item, price]; emit(key, shop); } } } Here, we first check that the document has the fields we want to use. CouchDB recovers gracefully from a few isolated map function failures, but when a map function fails regularly (due to a missing required field or other JavaScript exception), CouchDB shuts off its indexing to prevent any further resource usage. For this reason, it's important to check for the existence of any fields before you use them. In this case, our map function will skip the first "hello world" document we created without emitting any rows or encountering any errors. The result of this query should look like :ref:`intro/tour-09`. .. _intro/tour-09: .. figure:: ../../images/intro-tour-09.png :align: center :alt: The results of running a view after grouping by item type and price Figure 9. The results of running a view after grouping by item type and price Once we know we've got a document with an item type and some prices, we iterate over the item's prices and emit key/values pairs. The key is an array of the item and the price, and forms the basis for CouchDB's sorted index. In this case, the value is the name of the shop where the item can be found for the listed price. View rows are sorted by their keys -- in this example, first by item, then by price. This method of complex sorting is at the heart of creating useful indexes with CouchDB. MapReduce can be challenging, especially if you've spent years working with relational databases. The important things to keep in mind are that map functions give you an opportunity to sort your data using any key you choose, and that CouchDB's design is focused on providing fast, efficient access to data within a range of keys. Triggering Replication ====================== Futon can trigger replication between two local databases, between a local and remote database, or even between two remote databases. We'll show you how to replicate data from one local database to another, which is a simple way of making backups of your databases as we're working through the examples. First we'll need to create an empty database to be the target of replication. Return to the overview and create a database called hello-replication. Now click "Replicator" in the sidebar and choose hello-world as the source and hello-replication as the target. Click "Replicate" to replicate your database. The result should look something like :ref:`intro/tour-10`. .. _intro/tour-10: .. figure:: ../../images/intro-tour-10.png :align: center :alt: Running database replication in Futon Figure 10. Running database replication in Futon .. note:: For larger databases, replication can take much longer. It is important to leave the browser window open while replication is taking place. As an alternative, you can trigger replication via curl or some other HTTP client that can handle long-running connections. If your client closes the connection before replication finishes, you'll have to retrigger it. Luckily, CouchDB's replication can take over from where it left off instead of starting from scratch. Wrapping Up =========== Now that you've seen most of Futon's features, you'll be prepared to dive in and inspect your data as we build our example application in the next few documents. Futon's pure JavaScript approach to managing CouchDB shows how it's possible to build a fully featured web application using only CouchDB's HTTP API and integrated web server. But before we get there, we'll have another look at CouchDB's HTTP API -- now with a magnifying glass. Let's curl up on the couch and relax. �����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������apache-couchdb-1.6.0/share/doc/src/intro/security.rst�����������������������������������������������0000644�0001750�0000144�00000051016�12332105522�022513� 0����������������������������������������������������������������������������������������������������ustar�00djc�����������������������������users���������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������.. Licensed under the Apache License, Version 2.0 (the "License"); you may not .. use this file except in compliance with the License. You may obtain a copy of .. the License at .. .. http://www.apache.org/licenses/LICENSE-2.0 .. .. Unless required by applicable law or agreed to in writing, software .. distributed under the License is distributed on an "AS IS" BASIS, WITHOUT .. WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the .. License for the specific language governing permissions and limitations under .. the License. .. _intro/security: ******** Security ******** In this document, we'll look at the basic security mechanisms in CouchDB: the `Admin Party`, `Basic Authentication`, `Cookie Authentication`; how CouchDB handles users and protects their credentials. ============== Authentication ============== .. _intro/security/admin_party: The Admin Party =============== When you start out fresh, CouchDB allows any request to be made by anyone. Create a database? No problem, here you go. Delete some documents? Same deal. CouchDB calls this the `Admin Party`. Everybody has privileges to do anything. Neat. While it is incredibly easy to get started with CouchDB that way, it should be obvious that putting a default installation into the wild is adventurous. Any rogue client could come along and delete a database. A note of relief: by default, CouchDB will listen only on your loopback network interface (``127.0.0.1`` or ``localhost``) and thus only you will be able to make requests to CouchDB, nobody else. But when you start to open up your CouchDB to the public (that is, by telling it to bind to your machine's public IP address), you will want to think about restricting access so that the next bad guy doesn't ruin your admin party. In our previous discussions, we dropped some keywords about how things without the `Admin Party` work. First, there's *admin* itself, which implies some sort of super user. Then there are *privileges*. Let's explore these terms a little more. CouchDB has the idea of an *admin user* (e.g. an administrator, a super user, or root) that is allowed to do anything to a CouchDB installation. By default, everybody is an admin. If you don't like that, you can create specific admin users with a username and password as their credentials. CouchDB also defines a set of requests that only admin users are allowed to do. If you have defined one or more specific admin users, CouchDB will ask for identification for certain requests: - Creating a database (:put:`PUT /database </{db}>`) - Deleting a database (:put:`DELETE /database </{db}>`) - Setup a database security (:put:`PUT /database/_security </{db}/_security>`) - Creating a design document (:put:`PUT /database/_design/app </{db}/_design/{ddoc}>`) - Updating a design document (:put:`PUT /database/_design/app?rev=1-4E2 </{db}/_design/{ddoc}>`) - Deleting a design document (:delete:`DELETE /database/_design/app?rev=2-6A7 </{db}/_design/{ddoc}>`) - Execute a temporary view (:post:`POST /database/_temp_view </{db}/_temp_view>`) - Triggering compaction (:post:`POST /database/_compact </{db}/_compact>`) - Reading the task status list (:get:`GET /_active_tasks </_active_tasks>`) - Restarting the server (:post:`POST /_restart </_restart>`) - Reading the active configuration (:get:`GET /_config </_config>`) - Updating the active configuration (:put:`PUT /_config/section/key </_config/{section}/{key}>`) Creating New Admin User ----------------------- Let's do another walk through the API using `curl` to see how CouchDB behaves when you add admin users. :: > HOST="http://127.0.0.1:5984" > curl -X PUT $HOST/database {"ok":true} When starting out fresh, we can add a database. Nothing unexpected. Now let's create an admin user. We'll call her ``anna``, and her password is ``secret``. Note the double quotes in the following code; they are needed to denote a string value for the :ref:`configuration API <api/config>`:: > curl -X PUT $HOST/_config/admins/anna -d '"secret"' "" As per the :ref:`_config <api/config>` API's behavior, we're getting the previous value for the config item we just wrote. Since our admin user didn't exist, we get an empty string. Hashing Passwords ----------------- Seeing the plain-text password is scary, isn't it? No worries, CouchDB doesn't show up the plain-text password anywhere. It gets hashed right away. The hash is that big, ugly, long string that starts out with ``-hashed-``. How does that work? #. Creates a new 128-bit UUID. This is our *salt*. #. Creates a sha1 hash of the concatenation of the bytes of the plain-text password and the salt ``(sha1(password + salt))``. #. Prefixes the result with ``-hashed-`` and appends ``,salt``. To compare a plain-text password during authentication with the stored hash, the same procedure is run and the resulting hash is compared to the stored hash. The probability of two identical hashes for different passwords is too insignificant to mention (c.f. `Bruce Schneier`_). Should the stored hash fall into the hands of an attacker, it is, by current standards, way too inconvenient (i.e., it'd take a lot of money and time) to find the plain-text password from the hash. .. _Bruce Schneier: http://en.wikipedia.org/wiki/Bruce_Schneier But what's with the ``-hashed-`` prefix? When CouchDB starts up, it reads a set of `.ini` files with config settings. It loads these settings into an internal data store (not a database). The config API lets you read the current configuration as well as change it and create new entries. CouchDB is writing any changes back to the `.ini` files. The `.ini` files can also be edited by hand when CouchDB is not running. Instead of creating the admin user as we showed previously, you could have stopped CouchDB, opened your `local.ini`, added ``anna = secret`` to the :config:section:`admins`, and restarted CouchDB. Upon reading the new line from `local.ini`, CouchDB would run the hashing algorithm and write back the hash to `local.ini`, replacing the plain-text password. To make sure CouchDB only hashes plain-text passwords and not an existing hash a second time, it prefixes the hash with ``-hashed-``, to distinguish between plain-text passwords and hashed passwords. This means your plain-text password can't start with the characters ``-hashed-``, but that's pretty unlikely to begin with. .. note:: Since :ref:`1.3.0 release <release/1.3.0>` CouchDB uses ``-pbkdf2-`` prefix by default to sign about using `PBKDF2`_ hashing algorithm instead of `SHA1`. .. _PBKDF2: http://en.wikipedia.org/wiki/PBKDF2 .. _intro/security/basicauth: Basic Authentication ==================== Now that we have defined an admin, CouchDB will not allow us to create new databases unless we give the correct admin user credentials. Let's verify:: > curl -X PUT $HOST/somedatabase {"error":"unauthorized","reason":"You are not a server admin."} That looks about right. Now we try again with the correct credentials:: > HOST="http://anna:secret@127.0.0.1:5984" > curl -X PUT $HOST/somedatabase {"ok":true} If you have ever accessed a website or FTP server that was password-protected, the ``username:password@`` URL variant should look familiar. If you are security conscious, the missing ``s`` in ``http://`` will make you nervous. We're sending our password to CouchDB in plain text. This is a bad thing, right? Yes, but consider our scenario: CouchDB listens on ``127.0.0.1`` on a development box that we're the sole user of. Who could possibly sniff our password? If you are in a production environment, however, you need to reconsider. Will your CouchDB instance communicate over a public network? Even a LAN shared with other collocation customers is public. There are multiple ways to secure communication between you or your application and CouchDB that exceed the scope of this documentation. CouchDB as of version :ref:`1.1.0 <release/1.1.0>` comes with :ref:`SSL built in <config/ssl>`. .. seealso:: :ref:`Basic Authentication API Reference <api/auth/basic>` .. _intro/security/cookie: Cookie Authentication ===================== Basic authentication that uses plain-text passwords is nice and convenient, but not very secure if no extra measures are taken. It is also a very poor user experience. If you use basic authentication to identify admins, your application's users need to deal with an ugly, unstylable browser modal dialog that says non-professional at work more than anything else. To remedy some of these concerns, CouchDB supports cookie authentication. With cookie authentication your application doesn't have to include the ugly login dialog that the users' browsers come with. You can use a regular HTML form to submit logins to CouchDB. Upon receipt, CouchDB will generate a one-time token that the client can use in its next request to CouchDB. When CouchDB sees the token in a subsequent request, it will authenticate the user based on the token without the need to see the password again. By default, a token is valid for 10 minutes. To obtain the first token and thus authenticate a user for the first time, the username and password must be sent to the :ref:`_session <api/auth/session>` API. The API is smart enough to decode HTML form submissions, so you don't have to resort to any smarts in your application. If you are not using HTML forms to log in, you need to send an HTTP request that looks as if an HTML form generated it. Luckily, this is super simple:: > HOST="http://127.0.0.1:5984" > curl -vX POST $HOST/_session \ -H 'Content-Type:application/x-www-form-urlencoded' \ -d 'name=anna&password=secret' CouchDB replies, and we'll give you some more detail:: < HTTP/1.1 200 OK < Set-Cookie: AuthSession=YW5uYTo0QUIzOTdFQjrC4ipN-D-53hw1sJepVzcVxnriEw; < Version=1; Path=/; HttpOnly > ... < {"ok":true} A :statuscode:`200` response code tells us all is well, a :header:`Set-Cookie` header includes the token we can use for the next request, and the standard JSON response tells us again that the request was successful. Now we can use this token to make another request as the same user without sending the username and password again:: > curl -vX PUT $HOST/mydatabase \ --cookie AuthSession=YW5uYTo0QUIzOTdFQjrC4ipN-D-53hw1sJepVzcVxnriEw \ -H "X-CouchDB-WWW-Authenticate: Cookie" \ -H "Content-Type:application/x-www-form-urlencoded" {"ok":true} You can keep using this token for 10 minutes by default. After 10 minutes you need to authenticate your user again. The token lifetime can be configured with the timeout (in seconds) setting in the :ref:`couch_httpd_auth <config/couch_httpd_auth>` configuration section. .. seealso:: :ref:`Cookie Authentication API Reference <api/auth/cookie>` ======================= Authentication Database ======================= You may already note, that CouchDB administrators are defined within config file and you now wondering does regular users are also stored there. No, they don't. CouchDB has special `authentication database` -- ``_users`` by default -- that stores all registered users as JSON documents. CouchDB uses special database (called ``_users`` by default) to store information about registered users. This is a `system database` -- this means that while it shares common :ref:`database API <api/database>`, there are some special security-related constraints applied and used agreements on documents structure. So how `authentication database` is different from others? - Only administrators may browse list of all documents (:get:`GET /_users/_all_docs </{db}/_all_docs>`) - Only administrators may listen :ref:`changes feed <changes>` (:get:`GET /_users/_changes </{db}/_changes>`) - Only administrators may execute design functions like :ref:`views <viewfun>`, :ref:`shows <showfun>` and :ref:`others <ddocs>` - Only administrators may :method:`GET`, :method:`PUT` or :method:`DELETE` any document (to be honest, that they always can do) - There is special design document ``_auth`` that cannot be modified - Every document (of course, except `design documents`) represents registered CouchDB users and belong to them - Users may only access (:get:`GET /_users/org.couchdb.user:Jan </{db}/{docid}>`) or modify (:put:`PUT /_users/org.couchdb.user:Jan </{db}/{docid}>`) documents that they owns These draconian rules are reasonable: CouchDB cares about user's personal information and doesn't discloses it for everyone. Often, users documents are contains not only system information like `login`, `password hash` and `roles`, but also sensitive personal information like: real name, email, phone, special internal identifications and more - this is not right information that you want to share with the World. Users Documents =============== Each CouchDB user is stored in document format. These documents are contains several *mandatory* fields, that CouchDB handles for correct authentication process: - **_id** (*string*): Document ID. Contains user's login with special prefix :ref:`org.couchdb.user` - **derived_key** (*string*): `PBKDF2`_ key - **name** (*string*): User's name aka login. **Immutable** e.g. you cannot rename existed user - you have to create new one - **roles** (*array* of *string*): List of user roles. CouchDB doesn't provides any builtin roles, so you're free to define your own depending on your needs. However, you cannot set system roles like ``_admin`` there. Also, only administrators may assign roles to users - by default all users have no roles - **password_sha** (*string*): Hashed password with salt. Used for ``simple`` `password_scheme` - **password_scheme** (*string*): Password hashing scheme. May be ``simple`` or ``pbkdf2`` - **salt** (*string*): Hash salt. Used for ``simple`` `password_scheme` - **type** (*string*): Document type. Constantly have value ``user`` Additionally, you may specify any custom fields that are relates to the target user. This is good place to store user's private information because only the target user and CouchDB administrators may browse it. .. _org.couchdb.user: Why ``org.couchdb.user:`` prefix? --------------------------------- The reason to have special prefix before user's login name is to have namespaces which users are belongs to. This prefix is designed to prevent replication conflicts when you'll try to merge two `_user` databases or more. For current CouchDB releases, all users are belongs to the same ``org.couchdb.user`` namespace and this cannot be changed, but we'd made such design decision for future releases. Creating New User ================= Creating new user is a very trivial operation. You need just to send single :method:`PUT` request with user's data to CouchDB. Let's create user with login `jan` and password `apple`:: curl -X PUT http://localhost:5984/_users/org.couchdb.user:jan \ -H "Accept: application/json" \ -H "Content-Type: application/json" \ -d '{"name": "jan", "password": "apple", "roles": [], "type": "user"}' This `curl` command will produce next HTTP request: .. code-block:: http PUT /_users/org.couchdb.user:jan HTTP/1.1 Accept: application/json Content-Length: 62 Content-Type: application/json Host: localhost:5984 User-Agent: curl/7.31.0 And CouchDB responds with: .. code-block:: http HTTP/1.1 201 Created Cache-Control: must-revalidate Content-Length: 83 Content-Type: application/json Date: Fri, 27 Sep 2013 07:33:28 GMT ETag: "1-e0ebfb84005b920488fc7a8cc5470cc0" Location: http://localhost:5984/_users/org.couchdb.user:jan Server: CouchDB (Erlang OTP) {"ok":true,"id":"org.couchdb.user:jan","rev":"1-e0ebfb84005b920488fc7a8cc5470cc0"} Document successfully created what also means that user `jan` have created too! Let's check is this true:: curl -X POST http://localhost:5984/_session -d 'name=jan&password=apple' CouchDB should respond with: .. code-block:: javascript {"ok":true,"name":"jan","roles":[]} Which means that username was recognized and password's hash matches with stored one. If we specify wrong login and/or password, CouchDB will notify us with the next error message: .. code-block:: javascript {"error":"unauthorized","reason":"Name or password is incorrect."} Password Changing ================= This is quite common situation: user had forgot their password, it was leaked somehow (via copy-paste, screenshot, or by typing in wrong chat window) or something else. Let's change password for our user `jan`. First of all, let's define what is the password changing from the point of CouchDB and the authentication database. Since "users" are "documents", this operation is nothing, but updating the document with special field ``password`` which contains the *plain text password*. Scared? No need to: the authentication database has special internal hook on document update which looks for this field and replaces it with the *secured hash*, depending on chosen ``password_scheme``. Summarizing above, we need to get document content, add ``password`` field with new plain text password value and store JSON result to the authentication database. :: curl -X GET http://localhost:5984/_users/org.couchdb.user:jan .. code-block:: javascript { "_id": "org.couchdb.user:jan", "_rev": "1-e0ebfb84005b920488fc7a8cc5470cc0", "derived_key": "e579375db0e0c6a6fc79cd9e36a36859f71575c3", "iterations": 10, "name": "jan", "password_scheme": "pbkdf2", "roles": [], "salt": "1112283cf988a34f124200a050d308a1", "type": "user" } Here is our user's document. We may strip hashes from stored document to reduce amount of posted data:: curl -X PUT http://localhost:5984/_users/org.couchdb.user:jan \ -H "Accept: application/json" \ -H "Content-Type: application/json" \ -H "If-Match: 1-e0ebfb84005b920488fc7a8cc5470cc0" \ -d '{"name":"jan", "roles":[], "type":"user", "password":"orange"}' .. code-block:: javascript {"ok":true,"id":"org.couchdb.user:jan","rev":"2-ed293d3a0ae09f0c624f10538ef33c6f"} Updated! Now let's check that password was really changed:: curl -X POST http://localhost:5984/_session -d 'name=jan&password=apple' CouchDB should respond with: .. code-block:: javascript {"error":"unauthorized","reason":"Name or password is incorrect."} Looks like the password ``apple`` is wrong, what about ``orange``? :: curl -X POST http://localhost:5984/_session -d 'name=jan&password=orange' CouchDB should respond with: .. code-block:: javascript {"ok":true,"name":"jan","roles":[]} Hooray! You may wonder why so complex: need to retrieve user's document, add special field to it, post it back - where is one big button that changes the password without worry about document's content? Actually, :ref:`Futon <intro/futon>` has such at the right bottom corner if you have logged in - all implementation details are hidden from your sight. .. note:: There is no password confirmation for API request: you should implement it on your application layer like Futon does. Users Public Information ======================== .. versionadded:: 1.4 Sometimes users *wants* to share some information with the World. For instance, their contact email to let other users get in touch with them. To solve this problem, but still keep sensitive and private information secured there is special :ref:`configuration <config>` option :config:option:`public_fields <couch_httpd_auth/public_fields>`. In this options you may define comma separated list of users document fields that will be publicity available. Normally, if you request any user's document and you're not administrator or this document owner, CouchDB will respond with :statuscode:`404`:: curl http://localhost:5984/_users/org.couchdb.user:robert .. code-block:: javascript {"error":"not_found","reason":"missing"} This response is constant for both cases when user exists or not exists - by security reasons. Now let's share field ``name``. First, setup the ``public_fields`` configuration option. Remember, that this action requires administrator's privileges and the next command will ask for password for user `admin`, assuming that they are the server administrator:: curl -X PUT http://localhost:5984/_config/couch_http_auth/public_fields \ -H "Content-Type: application/json" \ -d '"name"' \ -u admin What have changed? Let's check Robert's document once again:: curl http://localhost:5984/_users/org.couchdb.user:robert .. code-block:: javascript {"_id":"org.couchdb.user:robert","_rev":"6-869e2d3cbd8b081f9419f190438ecbe7","name":"robert"} Good news! Now we may read field ``name`` from *every user's document without need to be an administrator*. That's important note: don't publish sensitive information, especially without user's acknowledge - they may not like such actions from your side. ������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������apache-couchdb-1.6.0/share/doc/src/intro/why.rst����������������������������������������������������0000644�0001750�0000144�00000034163�12332105522�021457� 0����������������������������������������������������������������������������������������������������ustar�00djc�����������������������������users���������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������.. Licensed under the Apache License, Version 2.0 (the "License"); you may not .. use this file except in compliance with the License. You may obtain a copy of .. the License at .. .. http://www.apache.org/licenses/LICENSE-2.0 .. .. Unless required by applicable law or agreed to in writing, software .. distributed under the License is distributed on an "AS IS" BASIS, WITHOUT .. WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the .. License for the specific language governing permissions and limitations under .. the License. .. _intro/why: ============ Why CouchDB? ============ Apache CouchDB is one of a new breed of database management systems. This topic explains why there's a need for new systems as well as the motivations behind building CouchDB. As CouchDB developers, we're naturally very excited to be using CouchDB. In this topic we'll share with you the reasons for our enthusiasm. We'll show you how CouchDB's schema-free document model is a better fit for common applications, how the built-in query engine is a powerful way to use and process your data, and how CouchDB's design lends itself to modularization and scalability. Relax ===== If there's one word to describe CouchDB, it is *relax*. It is the byline to CouchDB's official logo and when you start CouchDB, you see:: Apache CouchDB has started. Time to relax. Why is relaxation important? Developer productivity roughly doubled in the last five years. The chief reason for the boost is more powerful tools that are easier to use. Take Ruby on Rails as an example. It is an infinitely complex framework, but it's easy to get started with. Rails is a success story because of the core design focus on ease of use. This is one reason why CouchDB is relaxing: learning CouchDB and understanding its core concepts should feel natural to most everybody who has been doing any work on the Web. And it is still pretty easy to explain to non-technical people. Getting out of the way when creative people try to build specialized solutions is in itself a core feature and one thing that CouchDB aims to get right. We found existing tools too cumbersome to work with during development or in production, and decided to focus on making CouchDB easy, even a pleasure, to use. Another area of relaxation for CouchDB users is the production setting. If you have a live running application, CouchDB again goes out of its way to avoid troubling you. Its internal architecture is fault-tolerant, and failures occur in a controlled environment and are dealt with gracefully. Single problems do not cascade through an entire server system but stay isolated in single requests. CouchDB's core concepts are simple (yet powerful) and well understood. Operations teams (if you have a team; otherwise, that's you) do not have to fear random behavior and untraceable errors. If anything should go wrong, you can easily find out what the problem is, but these situations are rare. CouchDB is also designed to handle varying traffic gracefully. For instance, if a website is experiencing a sudden spike in traffic, CouchDB will generally absorb a lot of concurrent requests without falling over. It may take a little more time for each request, but they all get answered. When the spike is over, CouchDB will work with regular speed again. The third area of relaxation is growing and shrinking the underlying hardware of your application. This is commonly referred to as scaling. CouchDB enforces a set of limits on the programmer. On first look, CouchDB might seem inflexible, but some features are left out by design for the simple reason that if CouchDB supported them, it would allow a programmer to create applications that couldn't deal with scaling up or down. .. note:: CouchDB doesn't let you do things that would get you in trouble later on. This sometimes means you'll have to unlearn best practices you might have picked up in your current or past work. A Different Way to Model Your Data ================================== We believe that CouchDB will drastically change the way you build document-based applications. CouchDB combines an intuitive document storage model with a powerful query engine in a way that's so simple you'll probably be tempted to ask, ā€œWhy has no one built something like this before?ā€ Django may be built for the Web, but CouchDB is built of the Web. I've never seen software that so completely embraces the philosophies behind HTTP. CouchDB makes Django look old-school in the same way that Django makes ASP look outdated. -- Jacob Kaplan-Moss, Django developer CouchDB's design borrows heavily from web architecture and the concepts of resources, methods, and representations. It augments this with powerful ways to query, map, combine, and filter your data. Add fault tolerance, extreme scalability, and incremental replication, and CouchDB defines a sweet spot for document databases. A Better Fit for Common Applications ==================================== We write software to improve our lives and the lives of others. Usually this involves taking some mundane information such as contacts, invoices, or receipts and manipulating it using a computer application. CouchDB is a great fit for common applications like this because it embraces the natural idea of evolving, self-contained documents as the very core of its data model. Self-Contained Data ------------------- An invoice contains all the pertinent information about a single transaction the seller, the buyer, the date, and a list of the items or services sold. As shown in :ref:`intro/why-01`, there's no abstract reference on this piece of paper that points to some other piece of paper with the seller's name and address. Accountants appreciate the simplicity of having everything in one place. And given the choice, programmers appreciate that, too. .. _intro/why-01: .. figure:: ../../images/intro-why-01.png :align: center :alt: Self-contained documents Figure 1. Self-contained documents Yet using references is exactly how we model our data in a relational database! Each invoice is stored in a table as a row that refers to other rows in other tables one row for seller information, one for the buyer, one row for each item billed, and more rows still to describe the item details, manufacturer details, and so on and so forth. This isn't meant as a detraction of the relational model, which is widely applicable and extremely useful for a number of reasons. Hopefully, though, it illustrates the point that sometimes your model may not ā€œfitā€ your data in the way it occurs in the real world. Let's take a look at the humble contact database to illustrate a different way of modeling data, one that more closely ā€œfitsā€ its real-world counterpart -- a pile of business cards. Much like our invoice example, a business card contains all the important information, right there on the cardstock. We call this ā€œself-containedā€ data, and it's an important concept in understanding document databases like CouchDB. Syntax and Semantics -------------------- Most business cards contain roughly the same information -- someone's identity, an affiliation, and some contact information. While the exact form of this information can vary between business cards, the general information being conveyed remains the same, and we're easily able to recognize it as a business card. In this sense, we can describe a business card as a *real-world document*. Jan's business card might contain a phone number but no fax number, whereas J. Chris's business card contains both a phone and a fax number. Jan does not have to make his lack of a fax machine explicit by writing something as ridiculous as ā€œFax: Noneā€ on the business card. Instead, simply omitting a fax number implies that he doesn't have one. We can see that real-world documents of the same type, such as business cards, tend to be very similar in *semantics* -- the sort of information they carry, but can vary hugely in *syntax*, or how that information is structured. As human beings, we're naturally comfortable dealing with this kind of variation. While a traditional relational database requires you to model your data *up front*, CouchDB's schema-free design unburdens you with a powerful way to aggregate your data *after the fact*, just like we do with real-world documents. We'll look in depth at how to design applications with this underlying storage paradigm. Building Blocks for Larger Systems ================================== CouchDB is a storage system useful on its own. You can build many applications with the tools CouchDB gives you. But CouchDB is designed with a bigger picture in mind. Its components can be used as building blocks that solve storage problems in slightly different ways for larger and more complex systems. Whether you need a system that's crazy fast but isn't too concerned with reliability (think logging), or one that guarantees storage in two or more physically separated locations for reliability, but you're willing to take a performance hit, CouchDB lets you build these systems. There are a multitude of knobs you could turn to make a system work better in one area, but you'll affect another area when doing so. One example would be the CAP theorem discussed in :ref:`intro/consistency`. To give you an idea of other things that affect storage systems, see :ref:`Figure 2 <intro/why-figure-02>` and :ref:`Figure 3 <intro/why-figure-03>`. By reducing latency for a given system (and that is true not only for storage systems), you affect concurrency and throughput capabilities. .. _intro/why-figure-02: .. figure:: ../../images/intro-why-02.png :align: center :alt: Throughput, latency, or concurrency Figure 2. Throughput, latency, or concurrency .. _intro/why-figure-03: .. figure:: ../../images/intro-why-03.png :align: center :alt: Scaling: read requests, write requests, or data Figure 3. Scaling: read requests, write requests, or data When you want to scale out, there are three distinct issues to deal with: scaling read requests, write requests, and data. Orthogonal to all three and to the items shown in :ref:`Figure 2 <intro/why-figure-02>` and :ref:`Figure 3 <intro/why-figure-03>` are many more attributes like reliability or simplicity. You can draw many of these graphs that show how different features or attributes pull into different directions and thus shape the system they describe. CouchDB is very flexible and gives you enough building blocks to create a system shaped to suit your exact problem. That's not saying that CouchDB can be bent to solve any problem -- CouchDB is no silver bullet -- but in the area of data storage, it can get you a long way. CouchDB Replication =================== CouchDB replication is one of these building blocks. Its fundamental function is to synchronize two or more CouchDB databases. This may sound simple, but the simplicity is key to allowing replication to solve a number of problems: reliably synchronize databases between multiple machines for redundant data storage; distribute data to a cluster of CouchDB instances that share a subset of the total number of requests that hit the cluster (load balancing); and distribute data between physically distant locations, such as one office in New York and another in Tokyo. CouchDB replication uses the same REST API all clients use. HTTP is ubiquitous and well understood. Replication works incrementally; that is, if during replication anything goes wrong, like dropping your network connection, it will pick up where it left off the next time it runs. It also only transfers data that is needed to synchronize databases. A core assumption CouchDB makes is that things can go wrong, like network connection troubles, and it is designed for graceful error recovery instead of assuming all will be well. The replication system's incremental design shows that best. The ideas behind ā€œthings that can go wrongā€ are embodied in the `Fallacies of Distributed Computing`_: - The network is reliable. - Latency is zero. - Bandwidth is infinite. - The network is secure. - Topology doesn't change. - There is one administrator. - Transport cost is zero. - The network is homogeneous. Existing tools often try to hide the fact that there is a network and that any or all of the previous conditions don't exist for a particular system. This usually results in fatal error scenarios when something finally goes wrong. In contrast, CouchDB doesn't try to hide the network; it just handles errors gracefully and lets you know when actions on your end are required. .. _Fallacies of Distributed Computing: http://en.wikipedia.org/wiki/Fallacies_of_Distributed_Computing Local Data Is King ================== CouchDB takes quite a few lessons learned from the Web, but there is one thing that could be improved about the Web: latency. Whenever you have to wait for an application to respond or a website to render, you almost always wait for a network connection that isn't as fast as you want it at that point. Waiting a few seconds instead of milliseconds greatly affects user experience and thus user satisfaction. What do you do when you are offline? This happens all the time -- your DSL or cable provider has issues, or your iPhone, G1, or Blackberry has no bars, and no connectivity means no way to get to your data. CouchDB can solve this scenario as well, and this is where scaling is important again. This time it is scaling down. Imagine CouchDB installed on phones and other mobile devices that can synchronize data with centrally hosted CouchDBs when they are on a network. The synchronization is not bound by user interface constraints like subsecond response times. It is easier to tune for high bandwidth and higher latency than for low bandwidth and very low latency. Mobile applications can then use the local CouchDB to fetch data, and since no remote networking is required for that, latency is low by default. Can you really use CouchDB on a phone? Erlang, CouchDB's implementation language has been designed to run on embedded devices magnitudes smaller and less powerful than today's phones. Wrapping Up =========== The next document :ref:`intro/consistency` further explores the distributed nature of CouchDB. We should have given you enough bites to whet your interest. Let's go! �������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������apache-couchdb-1.6.0/share/doc/src/contributing.rst�������������������������������������������������0000644�0001750�0000144�00000012533�12332105522�022221� 0����������������������������������������������������������������������������������������������������ustar�00djc�����������������������������users���������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������.. Licensed under the Apache License, Version 2.0 (the "License"); you may not .. use this file except in compliance with the License. You may obtain a copy of .. the License at .. .. http://www.apache.org/licenses/LICENSE-2.0 .. .. Unless required by applicable law or agreed to in writing, software .. distributed under the License is distributed on an "AS IS" BASIS, WITHOUT .. WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the .. License for the specific language governing permissions and limitations under .. the License. .. _contributing: ================================== Contributing to this Documentation ================================== The documentation lives in the CouchDB source tree. We'll start by forking and closing the CouchDB GitHub mirror. That will allow us to send the contribution to CouchDB with a pull request. If you don't have a GitHub account yet, it is a good time to get one, they are free. If you don't want to use GitHub, there are alternate ways to contributing back, that we'll cover next time. Go to https://github.com/apache/couchdb and click the "fork" button in the top right. This will create a fork of CouchDB in your GitHub account. Mine is `janl`, so my fork lives at https://github.com/janl/couchdb. In the header, it tells me me my "GitHub Clone URL". We need to copy that and start a terminal: .. code-block:: bash $ git clone https://github.com/janl/couchdb.git $ cd couchdb $ subl . I'm opening the whole CouchDB source tree in my favourite editor. It gives me the usual directory listing: .. code-block:: bash .git/ .gitignore .mailmap .travis.yml AUTHORS BUGS CHANGES DEVELOPERS INSTALL INSTALL.Unix INSTALL.Windows LICENSE Makefile.am NEWS NOTICE README THANKS.in acinclude.m4.in bin/ bootstrap build-aux/ configure.ac etc/ license.skip share/ src/ test/ utils/ var/ The documentation sources live in `share/doc/src`, you can safely ignore all the other files and directories. First we should determine where we want to document this inside the documentation. We can look through http://docs.couchdb.org/en/latest/ for inspiration. The `JSON Structure Reference`_ looks like a fine place to write this up. .. _JSON Structure Reference: http://docs.couchdb.org/en/latest/json-structure.html The current state includes mostly tables describing the JSON structure (after all, that's the title of this chapter), but some prose about the number representation can't hurt. For future reference, since the topic in the thread includes views and different encoding in views (as opposed to the storage engine), we should remember to make a note in the views documentation as well, but we'll leave this for later. Let's try and find the source file that builds the file http://docs.couchdb.org/en/latest/json-structure.html -- we are in luck, under `share/doc/src` we find the file `json-structure.rst`. That looks promising. `.rst` stands for ReStructured Text (see http://thomas-cokelaer.info/tutorials/sphinx/rest_syntax.html for a markup reference), which is an ascii format for writing documents, documentation in this case. Let's have a look and open it. We see ascii tables with some additional formatting, all looking like the final HTML. So far so easy. For now, let's just add to the bottom of this. We can worry about organising this better later. We start by adding a new headline:: Number Handling =============== Now we paste in the rest of the main email of the thread. It is mostly text, but it includes some code listings. Let's mark them up. We'll turn:: ejson:encode(ejson:decode(<<"1.1">>)). <<"1.1000000000000000888">> Into:: .. code-block:: erlang ejson:encode(ejson:decode(<<"1.1">>)). <<"1.1000000000000000888">> And we follow along with the other code samples. We turn:: Spidermonkey $ js -h 2>&1 | head -n 1 JavaScript-C 1.8.5 2011-03-31 $ js js> JSON.stringify(JSON.parse("1.01234567890123456789012345678901234567890")) "1.0123456789012346" js> var f = JSON.stringify(JSON.parse("1.01234567890123456789012345678901234567890")) js> JSON.stringify(JSON.parse(f)) "1.0123456789012346" into:: Spidermonkey:: $ js -h 2>&1 | head -n 1 JavaScript-C 1.8.5 2011-03-31 $ js js> JSON.stringify(JSON.parse("1.01234567890123456789012345678901234567890")) "1.0123456789012346" js> var f = JSON.stringify(JSON.parse("1.01234567890123456789012345678901234567890")) js> JSON.stringify(JSON.parse(f)) "1.0123456789012346" And then follow all the other ones. I cleaned up the text a little but to make it sound more like a documentation entry as opposed to a post on a mailing list. The next step would be to validate that we got all the markup right. I'll leave this for later. For now we'll contribute our change back to CouchDB. First, we commit our changes:: $ > git commit -am 'document number encoding' [master a84b2cf] document number encoding 1 file changed, 199 insertions(+) Then we push the commit to our CouchDB fork:: $ git push origin master Next, we go back to our GitHub page https://github.com/janl/couchdb and click the "Pull Request" button. Fill in the description with something useful and hit the "Send Pull Request" button. And we're done! ���������������������������������������������������������������������������������������������������������������������������������������������������������������������apache-couchdb-1.6.0/share/doc/src/fauxton/���������������������������������������������������������0000755�0001750�0000144�00000000000�12332106072�020441� 5����������������������������������������������������������������������������������������������������ustar�00djc�����������������������������users���������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������apache-couchdb-1.6.0/share/doc/src/fauxton/addons.rst�����������������������������������������������0000644�0001750�0000144�00000012245�12332105522�022446� 0����������������������������������������������������������������������������������������������������ustar�00djc�����������������������������users���������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������.. Licensed under the Apache License, Version 2.0 (the "License"); you may not .. use this file except in compliance with the License. You may obtain a copy of .. the License at .. .. http://www.apache.org/licenses/LICENSE-2.0 .. .. Unless required by applicable law or agreed to in writing, software .. distributed under the License is distributed on an "AS IS" BASIS, WITHOUT .. WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the .. License for the specific language governing permissions and limitations under .. the License. .. _fauxton/addons: =============== Writting Addons =============== Addons allow you to extend Fauxton for a specific use case. Usually, they have the following structure:: + my_addon/ | ---+ assets [optional] | \ ---+ less | \ ---- my_addon.less | ---+ templates/ | \ ---- my_addon.html - underscore template fragments | ---- resources.js - models and collections of the addon | ---- routes.js - URL routing for the addon | ---- views.js - views that the model provides Generating an Addon =================== We have a `grunt-init` template that lets you create a skeleton addon, including all the boiler plate code. Run ``grunt-init tasks/addon`` and answer the questions it asks to create an addon:: ± grunt-init tasks/addon path.existsSync is now called `fs.existsSync`. Running "addon" task Please answer the following: [?] Add on Name (WickedCool) SuperAddon [?] Location of add ons (app/addons) [?] Do you need an assets folder?(for .less) (y/N) [?] Do you need to make any changes to the above before continuing? (y/N) Created addon SuperAddon in app/addons Done, without errors. Once the addon is created add the name to the settings.json file to get it compiled and added on the next install. Routes and hooks ================ An addon can insert itself into Fauxton in two ways; via a route or via a hook. Routes ------ An addon will override an existing route should one exist, but in all other ways is just a normal backbone `route/view`. This is how you would add a whole new feature. Hooks ----- Hooks let you modify/extend an existing feature. They modify a DOM element by selector for a named set of routes, for example: .. code-block:: javascript var Search = new FauxtonAPI.addon(); Search.hooks = { // Render additional content into the sidebar "#sidebar-content": { routes:[ "database/:database/_design/:ddoc/_search/:search", "database/:database/_design/:ddoc/_view/:view", "database/:database/_:handler"], callback: searchSidebar } }; return Search; adds the `searchSidebar` callback to `#sidebar-content` for three routes. Hello world Addon ================= First create the addon skeleton:: ± bbb addon path.existsSync is now called `fs.existsSync`. Running "addon" task Please answer the following: [?] Add on Name (WickedCool) Hello [?] Location of add ons (app/addons) [?] Do you need to make any changes to the above before continuing? (y/N) Created addon Hello in app/addons Done, without errors. In `app/addons/hello/templates/hello.html` place: .. code-block:: html <h1>Hello!</h1> Next, we'll defined a simple view in `resources.js` (for more complex addons you may want to have a views.js) that renders that template: .. code-block:: javascript define([ "app", "api" ], function (app, FauxtonAPI) { var Resources = {}; Resources.Hello = FauxtonAPI.View.extend({ template: "addons/hello/templates/hello" }); return Resources; }); Then define a route in `routes.js` that the addon is accessible at: .. code-block:: javascript define([ "app", "api", "addons/hello/resources" ], function(app, FauxtonAPI, Resources) { var helloRoute = function () { console.log('helloRoute callback yo'); return { layout: "one_pane", crumbs: [ {"name": "Hello","link": "_hello"} ], views: { "#dashboard-content": new Resources.Hello({}) }, apiUrl: 'hello' }; }; Routes = { "_hello": helloRoute }; return Routes; }); Then wire it all together in base.js: .. code-block:: javascript define([ "app", "api", "addons/hello/routes" ], function(app, FauxtonAPI, HelloRoutes) { var Hello = new FauxtonAPI.addon(); console.log('hello from hello'); Hello.initialize = function() { FauxtonAPI.addHeaderLink({title: "Hello", href: "#_hello"}); }; Hello.Routes = HelloRoutes; console.log(Hello); return Hello; }); Once the code is in place include the add on in your `settings.json` so that it gets included by the `require` task. Your addon is included in one of three ways; a local path, a git URL or a name. Named plugins assume the plugin is in the Fauxton base directory, addons with a git URL will be cloned into the application, local paths will be copied. Addons included from a local path will be cleaned out by the clean task, others are left alone. �����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������apache-couchdb-1.6.0/share/doc/src/fauxton/install.rst����������������������������������������������0000644�0001750�0000144�00000005361�12332105522�022645� 0����������������������������������������������������������������������������������������������������ustar�00djc�����������������������������users���������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������.. Licensed under the Apache License, Version 2.0 (the "License"); you may not .. use this file except in compliance with the License. You may obtain a copy of .. the License at .. .. http://www.apache.org/licenses/LICENSE-2.0 .. .. Unless required by applicable law or agreed to in writing, software .. distributed under the License is distributed on an "AS IS" BASIS, WITHOUT .. WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the .. License for the specific language governing permissions and limitations under .. the License. .. _fauxton/install: ============ Installation ============ A recent of `node.js`_ and `npm`_ is required. .. _node.js: http://nodejs.org/ .. _npm: https://npmjs.org/doc/README.html Get the source -------------- Clone the CouchDB repo:: $ git clone http://git-wip-us.apache.org/repos/asf/couchdb.git $ cd couchdb Fauxton Setup ------------- Install all dependencies:: couchdb/ $ cd src/fauxton couchdb/src/fauxton/ $ npm install .. note:: To avoid a npm global install add ``node_modules/.bin`` to your path:: export PATH=./node_modules/.bin:$PATH Or just use the wrappers in ``./bin/``. Development mode, non minified files:: ./bin/grunt couchdebug Or fully compiled install:: ./bin/grunt couchdb Dev Server ---------- Using the dev server is the easiest way to use Fauxton, specially when developing for it:: grunt dev Deploy Fauxton -------------- Deploy Fauxton to your local CouchDB instance: ./bin/grunt couchapp_deploy The Fauxton be available by http://localhost:5984/fauxton/_design/fauxton/index.html Understang Fauxton Code layout ============================== Each bit of functionality is its own separate module or addon. All core modules are stored under `app/module` and any addons that are optional are under `app/addons`. We use `backbone.js`_ and `Backbone.layoutmanager`_ quite heavily, so best to get an idea how they work. Its best at this point to read through a couple of the modules and addons to get an idea of how they work. Two good starting points are `app/addon/config` and `app/modules/databases`. Each module must have a `base.js` file, this is read and compile when Fauxton is deployed. The `resource.js` file is usually for your ``Backbone.Models`` and ``Backbone.Collections``, `view.js` for your ``Backbone.Views``. The `routes.js` is used to register a url path for your view along with what layout, data, breadcrumbs and api point is required for the view. .. _backbone.js: http://backbonejs.org/ .. _Backbone.layoutmanager: https://github.com/tbranyen/backbone.layoutmanager ToDo items ========== Checkout `JIRA`_ for a list of items to do. .. _JIRA: https://issues.apache.org/jira/browse/COUCHDB/component/12320406 �������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������apache-couchdb-1.6.0/share/doc/src/fauxton/index.rst������������������������������������������������0000644�0001750�0000144�00000001165�12332105522�022304� 0����������������������������������������������������������������������������������������������������ustar�00djc�����������������������������users���������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������.. Licensed under the Apache License, Version 2.0 (the "License"); you may not .. use this file except in compliance with the License. You may obtain a copy of .. the License at .. .. http://www.apache.org/licenses/LICENSE-2.0 .. .. Unless required by applicable law or agreed to in writing, software .. distributed under the License is distributed on an "AS IS" BASIS, WITHOUT .. WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the .. License for the specific language governing permissions and limitations under .. the License. .. _fauxton: ======= Fauxton ======= .. toctree:: install addons �����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������apache-couchdb-1.6.0/share/doc/src/whatsnew/��������������������������������������������������������0000755�0001750�0000144�00000000000�12332106072�020615� 5����������������������������������������������������������������������������������������������������ustar�00djc�����������������������������users���������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������apache-couchdb-1.6.0/share/doc/src/whatsnew/0.10.rst������������������������������������������������0000644�0001750�0000144�00000006522�12332105522�021731� 0����������������������������������������������������������������������������������������������������ustar�00djc�����������������������������users���������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������.. Licensed under the Apache License, Version 2.0 (the "License"); you may not .. use this file except in compliance with the License. You may obtain a copy of .. the License at .. .. http://www.apache.org/licenses/LICENSE-2.0 .. .. Unless required by applicable law or agreed to in writing, software .. distributed under the License is distributed on an "AS IS" BASIS, WITHOUT .. WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the .. License for the specific language governing permissions and limitations under .. the License. .. _release/0.10.x: ============= 0.10.x Branch ============= .. contents:: :depth: 1 :local: .. _release/0.10.x/upgrade: Upgrade Notes ============= .. warning:: :ref:`release/0.10.2` contains important security fixes. Previous `0.10.x` releases are not recommended for regular usage. Modular Configuration Directories --------------------------------- CouchDB now loads configuration from the following places (`glob(7)`_ syntax) in order: - PREFIX/default.ini - PREFIX/default.d/* - PREFIX/local.ini - PREFIX/local.d/* The configuration options for `couchdb` script have changed to:: -a FILE add configuration FILE to chain -A DIR add configuration DIR to chain -n reset configuration file chain (including system default) -c print configuration file chain and exit .. _glob(7): http://linux.die.net/man/7/glob Show and List API change ------------------------ Show and List functions must have a new structure in 0.10. See `Formatting_with_Show_and_List`_ for details. .. _Formatting_with_Show_and_List: http://wiki.apache.org/couchdb/Formatting_with_Show_and_List Stricter enforcing of reduciness in reduce-functions ---------------------------------------------------- Reduce functions are now required to reduce the number of values for a key. View query reduce parameter strictness -------------------------------------- CouchDB now considers the parameter ``reduce=false`` to be an error for queries of map-only views, and responds with status code 400. .. _release/0.10.2: Version 0.10.2 ============== Build and System Integration ---------------------------- * Fixed distribution preparation for building on Mac OS X. Security -------- * Fixed :ref:`cve/2010-0009` Replicator ---------- * Avoid leaking file descriptors on automatic replication restarts. .. _release/0.10.1: Version 0.10.1 ============== Build and System Integration ---------------------------- * Test suite now works with the distcheck target. Replicator ---------- * Stability enhancements regarding redirects, timeouts, OAuth. Query Server ------------ * Avoid process leaks * Allow list and view to span languages Stats ----- * Eliminate new process flood on system wake .. _release/0.10.0: Version 0.10.0 ============== Build and System Integration ---------------------------- * Changed `couchdb` script configuration options. * Added default.d and local.d configuration directories to load sequence. HTTP Interface -------------- * Added optional cookie-based authentication handler. * Added optional two-legged OAuth authentication handler. Storage Format -------------- * Add move headers with checksums to the end of database files for extra robust storage and faster storage. View Server ----------- * Added native Erlang views for high-performance applications. ������������������������������������������������������������������������������������������������������������������������������������������������������������������������������apache-couchdb-1.6.0/share/doc/src/whatsnew/0.11.rst������������������������������������������������0000644�0001750�0000144�00000026214�12332105522�021732� 0����������������������������������������������������������������������������������������������������ustar�00djc�����������������������������users���������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������.. Licensed under the Apache License, Version 2.0 (the "License"); you may not .. use this file except in compliance with the License. You may obtain a copy of .. the License at .. .. http://www.apache.org/licenses/LICENSE-2.0 .. .. Unless required by applicable law or agreed to in writing, software .. distributed under the License is distributed on an "AS IS" BASIS, WITHOUT .. WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the .. License for the specific language governing permissions and limitations under .. the License. .. _release/0.11.x: ============= 0.11.x Branch ============= .. contents:: :depth: 1 :local: .. _release/0.11.x/upgrade: Upgrade Notes ============= .. warning:: :ref:`release/0.11.2` contains important security fixes. Previous `0.11.x` releases are not recommended for regular usage. Changes Between 0.11.0 and 0.11.1 --------------------------------- - ``_log`` and ``_temp_views`` are now admin-only resources. - ``_bulk_docs`` now requires a valid `Content-Type` header of ``application/json``. - `JSONP` is disabled by default. An .ini option was added to selectively enable it. - The ``key``, ``startkey`` and ``endkey`` properties of the request object passed to :ref:`list <listfun>` and :ref:`show <showfun>` functions now contain JSON objects representing the URL encoded string values in the query string. Previously, these properties contained strings which needed to be converted to JSON before using. Changes Between 0.10.x and 0.11.0 --------------------------------- show, list, update and validation functions ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ The ``req`` argument to show, list, update and validation functions now contains the member method with the specified HTTP method of the current request. Previously, this member was called ``verb``. ``method`` is following :rfc:`2616` (HTTP 1.1) closer. _admins -> _security ^^^^^^^^^^^^^^^^^^^^ The `/db/_admins` handler has been removed and replaced with a :ref:`/db/_security <api/db/security>` object. Any existing `_admins` will be dropped and need to be added to the security object again. The reason for this is that the old system made no distinction between names and roles, while the new one does, so there is no way to automatically upgrade the old admins list. The security object has 2 special fields, ``admins`` and ``readers``, which contain lists of names and roles which are admins or readers on that database. Anything else may be stored in other fields on the security object. The entire object is made available to validation functions. json2.js ^^^^^^^^ JSON handling in the query server has been upgraded to use `json2.js`_. This allows us to use faster native JSON serialization when it is available. In previous versions, attempts to serialize undefined would throw an exception, causing the doc that emitted undefined to be dropped from the view index. The new behavior is to serialize undefined as null. Applications depending on the old behavior will need to explicitly check for undefined. Another change is that E4X's XML objects will not automatically be stringified. XML users will need to call ``my_xml_object.toXMLString()`` to return a string value. :commit:`8d3b7ab3` .. _json2.js: https://github.com/douglascrockford/JSON-js/blob/master/json2.js WWW-Authenticate ^^^^^^^^^^^^^^^^ The default configuration has been changed to avoid causing basic-auth popups which result from sending the WWW-Authenticate header. To enable basic-auth popups, uncomment the :config:option:`httpd/WWW-Authenticate` line in `local.ini`. Query server line protocol ^^^^^^^^^^^^^^^^^^^^^^^^^^ The query server line protocol has changed for all functions except :ref:`map <qs/map_doc>`, :ref:`reduce <qs/reduce>`, and :ref:`rereduce <qs/rereduce>`. This allows us to cache the entire design document in the query server process, which results in faster performance for common operations. It also gives more flexibility to query server implementators and shouldn't require major changes in the future when adding new query server features. UTF8 JSON ^^^^^^^^^ JSON request bodies are validated for proper UTF-8 before saving, instead of waiting to fail on subsequent read requests. _changes line format ^^^^^^^^^^^^^^^^^^^^ Continuous changes are now newline delimited, instead of having each line followed by a comma. .. _release/0.11.2: Version 0.11.2 ============== Authentication -------------- * User documents can now be deleted by admins or the user. Futon ----- * Add some Futon files that were missing from the Makefile. HTTP Interface -------------- * Better error messages on invalid URL requests. Replicator ---------- * Fix bug when pushing design docs by non-admins, which was hanging the replicator for no good reason. * Fix bug when pulling design documents from a source that requires basic-auth. Security -------- * Avoid potential DOS attack by guarding all creation of atoms. * Fixed :ref:`cve/2010-2234` .. _release/0.11.1: Version 0.11.1 ============== Build and System Integration ---------------------------- * Output of `couchdb --help` has been improved. * Fixed compatibility with the Erlang R14 series. * Fixed warnings on Linux builds. * Fixed build error when aclocal needs to be called during the build. * Require ICU 4.3.1. * Fixed compatibility with Solaris. Configuration System -------------------- * Fixed timeout with large .ini files. Futon ----- * Use "expando links" for over-long document values in Futon. * Added continuous replication option. * Added option to replicating test results anonymously to a community CouchDB instance. * Allow creation and deletion of config entries. * Fixed display issues with doc ids that have escaped characters. * Fixed various UI issues. HTTP Interface -------------- * Mask passwords in active tasks and logging. * Update mochijson2 to allow output of BigNums not in float form. * Added support for X-HTTP-METHOD-OVERRIDE. * Better error message for database names. * Disable jsonp by default. * Accept gzip encoded standalone attachments. * Made max_concurrent_connections configurable. * Made changes API more robust. * Send newly generated document rev to callers of an update function. JavaScript Clients ------------------ * Added tests for couch.js and jquery.couch.js * Added changes handler to jquery.couch.js. * Added cache busting to jquery.couch.js if the user agent is msie. * Added support for multi-document-fetch (via _all_docs) to jquery.couch.js. * Added attachment versioning to jquery.couch.js. * Added option to control ensure_full_commit to jquery.couch.js. * Added list functionality to jquery.couch.js. * Fixed issues where bulkSave() wasn't sending a POST body. Log System ---------- * Log HEAD requests as HEAD, not GET. * Keep massive JSON blobs out of the error log. * Fixed a timeout issue. Replication System ------------------ * Refactored various internal APIs related to attachment streaming. * Fixed hanging replication. * Fixed keepalive issue. Security -------- * Added authentication redirect URL to log in clients. * Fixed query parameter encoding issue in oauth.js. * Made authentication timeout configurable. * Temporary views are now admin-only resources. Storage System -------------- * Don't require a revpos for attachment stubs. * Added checking to ensure when a revpos is sent with an attachment stub, it's correct. * Make file deletions async to avoid pauses during compaction and db deletion. * Fixed for wrong offset when writing headers and converting them to blocks, only triggered when header is larger than 4k. * Preserve _revs_limit and instance_start_time after compaction. Test Suite ---------- * Made the test suite overall more reliable. View Server ----------- * Provide a UUID to update functions (and all other functions) that they can use to create new docs. * Upgrade CommonJS modules support to 1.1.1. * Fixed erlang filter funs and normalize filter fun API. * Fixed hang in view shutdown. URL Rewriter & Vhosts --------------------- * Allow more complex keys in rewriter. * Allow global rewrites so system defaults are available in vhosts. * Allow isolation of databases with vhosts. * Fix issue with passing variables to query parameters. .. _release/0.11.0: Version 0.11.0 ============== Build and System Integration ---------------------------- * Updated and improved source documentation. * Fixed distribution preparation for building on Mac OS X. * Added support for building a Windows installer as part of 'make dist'. * Bug fix for building couch.app's module list. * ETap tests are now run during make distcheck. This included a number of updates to the build system to properly support VPATH builds. * Gavin McDonald setup a build-bot instance. More info can be found at http://ci.apache.org/buildbot.html Futon ----- * Added a button for view compaction. * JSON strings are now displayed as-is in the document view, without the escaping of new-lines and quotes. That dramatically improves readability of multi-line strings. * Same goes for editing of JSON string values. When a change to a field value is submitted, and the value is not valid JSON it is assumed to be a string. This improves editing of multi-line strings a lot. * Hitting tab in textareas no longer moves focus to the next form field, but simply inserts a tab character at the current caret position. * Fixed some font declarations. HTTP Interface -------------- * Provide Content-MD5 header support for attachments. * Added URL Rewriter handler. * Added virtual host handling. Replication ----------- * Added option to implicitly create replication target databases. * Avoid leaking file descriptors on automatic replication restarts. * Added option to replicate a list of documents by id. * Allow continuous replication to be cancelled. Runtime Statistics ------------------ * Statistics are now calculated for a moving window instead of non-overlapping timeframes. * Fixed a problem with statistics timers and system sleep. * Moved statistic names to a term file in the priv directory. Security -------- * Fixed CVE-2010-0009: Apache CouchDB Timing Attack Vulnerability. * Added default cookie-authentication and users database. * Added Futon user interface for user signup and login. * Added per-database reader access control lists. * Added per-database security object for configuration data in validation functions. * Added proxy authentication handler Storage System -------------- * Adds batching of multiple updating requests, to improve throughput with many writers. Removed the now redundant couch_batch_save module. * Adds configurable compression of attachments. View Server ----------- * Added optional 'raw' binary collation for faster view builds where Unicode collation is not important. * Improved view index build time by reducing ICU collation callouts. * Improved view information objects. * Bug fix for partial updates during view builds. * Move query server to a design-doc based protocol. * Use json2.js for JSON serialization for compatiblity with native JSON. * Major refactoring of couchjs to lay the groundwork for disabling cURL support. The new HTTP interaction acts like a synchronous XHR. Example usage of the new system is in the JavaScript CLI test runner. ������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������apache-couchdb-1.6.0/share/doc/src/whatsnew/index.rst�����������������������������������������������0000644�0001750�0000144�00000001303�12332105522�022452� 0����������������������������������������������������������������������������������������������������ustar�00djc�����������������������������users���������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������.. Licensed under the Apache License, Version 2.0 (the "License"); you may not .. use this file except in compliance with the License. You may obtain a copy of .. the License at .. .. http://www.apache.org/licenses/LICENSE-2.0 .. .. Unless required by applicable law or agreed to in writing, software .. distributed under the License is distributed on an "AS IS" BASIS, WITHOUT .. WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the .. License for the specific language governing permissions and limitations under .. the License. .. _releases: Release History =============== .. toctree:: :glob: 1.6 1.5 1.4 1.3 1.2 1.1 1.0 0.11 0.10 0.9 0.8 �����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������apache-couchdb-1.6.0/share/doc/src/whatsnew/0.8.rst�������������������������������������������������0000644�0001750�0000144�00000016423�12332105522�021661� 0����������������������������������������������������������������������������������������������������ustar�00djc�����������������������������users���������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������.. Licensed under the Apache License, Version 2.0 (the "License"); you may not .. use this file except in compliance with the License. You may obtain a copy of .. the License at .. .. http://www.apache.org/licenses/LICENSE-2.0 .. .. Unless required by applicable law or agreed to in writing, software .. distributed under the License is distributed on an "AS IS" BASIS, WITHOUT .. WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the .. License for the specific language governing permissions and limitations under .. the License. .. _release/0.8.x: ============ 0.8.x Branch ============ .. contents:: :depth: 1 :local: .. _release/0.8.1: Version 0.8.1-incubating ======================== Build and System Integration ---------------------------- * The `couchdb` script no longer uses `awk` for configuration checks as this was causing portability problems. * Updated `sudo` example in `README` to use the `-i` option, this fixes problems when invoking from a directory the `couchdb` user cannot access. Database Core ------------- * Fix for replication problems where the write queues can get backed up if the writes aren't happening fast enough to keep up with the reads. For a large replication, this can exhaust memory and crash, or slow down the machine dramatically. The fix keeps only one document in the write queue at a time. * Fix for databases sometimes incorrectly reporting that they contain 0 documents after compaction. * CouchDB now uses ibrowse instead of inets for its internal HTTP client implementation. This means better replication stability. Futon ----- * The view selector dropdown should now work in Opera and Internet Explorer even when it includes optgroups for design documents. (:issue:`81`) JavaScript View Server ---------------------- * Sealing of documents has been disabled due to an incompatibility with SpiderMonkey 1.9. * Improve error handling for undefined values emitted by map functions. (:issue:`83`) HTTP Interface -------------- * Fix for chunked responses where chunks were always being split into multiple TCP packets, which caused problems with the test suite under Safari, and in some other cases. * Fix for an invalid JSON response body being returned for some kinds of views. (:issue:`84`) * Fix for connections not getting closed after rejecting a chunked request. (:issue:`55`) * CouchDB can now be bound to IPv6 addresses. * The HTTP `Server` header now contains the versions of CouchDB and Erlang. .. _release/0.8.0: Version 0.8.0-incubating ======================== Build and System Integration ---------------------------- * CouchDB can automatically respawn following a server crash. * Database server no longer refuses to start with a stale PID file. * System logrotate configuration provided. * Improved handling of ICU shared libraries. * The `couchdb` script now automatically enables SMP support in Erlang. * The `couchdb` and `couchjs` scripts have been improved for portability. * The build and system integration have been improved for portability. Database Core ------------- * The view engine has been completely decoupled from the storage engine. Index data is now stored in separate files, and the format of the main database file has changed. * Databases can now be compacted to reclaim space used for deleted documents and old document revisions. * Support for incremental map/reduce views has been added. * To support map/reduce, the structure of design documents has changed. View values are now JSON objects containing at least a `map` member, and optionally a `reduce` member. * View servers are now identified by name (for example `javascript`) instead of by media type. * Automatically generated document IDs are now based on proper UUID generation using the crypto module. * The field `content-type` in the JSON representation of attachments has been renamed to `content_type` (underscore). Futon ----- * When adding a field to a document, Futon now just adds a field with an autogenerated name instead of prompting for the name with a dialog. The name is automatically put into edit mode so that it can be changed immediately. * Fields are now sorted alphabetically by name when a document is displayed. * Futon can be used to create and update permanent views. * The maximum number of rows to display per page on the database page can now be adjusted. * Futon now uses the XMLHTTPRequest API asynchronously to communicate with the CouchDB HTTP server, so that most operations no longer block the browser. * View results sorting can now be switched between ascending and descending by clicking on the `Key` column header. * Fixed a bug where documents that contained a `@` character could not be viewed. (:issue:`12`) * The database page now provides a `Compact` button to trigger database compaction. (:issue:`38`) * Fixed portential double encoding of document IDs and other URI segments in many instances. (:issue:`39`) * Improved display of attachments. * The JavaScript Shell has been removed due to unresolved licensing issues. JavaScript View Server ---------------------- * SpiderMonkey is no longer included with CouchDB, but rather treated as a normal external dependency. A simple C program (`_couchjs`) is provided that links against an existing SpiderMonkey installation and uses the interpreter embedding API. * View functions using the default JavaScript view server can now do logging using the global `log(message)` function. Log messages are directed into the CouchDB log at `INFO` level. (:issue:`59`) * The global `map(key, value)` function made available to view code has been renamed to `emit(key, value)`. * Fixed handling of exceptions raised by view functions. HTTP Interface -------------- * CouchDB now uses MochiWeb instead of inets for the HTTP server implementation. Among other things, this means that the extra configuration files needed for inets (such as `couch_httpd.conf`) are no longer used. * The HTTP interface now completely supports the `HEAD` method. (:issue:`3`) * Improved compliance of `Etag` handling with the HTTP specification. (:issue:`13`) * Etags are no longer included in responses to document `GET` requests that include query string parameters causing the JSON response to change without the revision or the URI having changed. * The bulk document update API has changed slightly on both the request and the response side. In addition, bulk updates are now atomic. * CouchDB now uses `TCP_NODELAY` to fix performance problems with persistent connections on some platforms due to nagling. * Including a `?descending=false` query string parameter in requests to views no longer raises an error. * Requests to unknown top-level reserved URLs (anything with a leading underscore) now return a `unknown_private_path` error instead of the confusing `illegal_database_name`. * The Temporary view handling now expects a JSON request body, where the JSON is an object with at least a `map` member, and optional `reduce` and `language` members. * Temporary views no longer determine the view server based on the Content-Type header of the `POST` request, but rather by looking for a `language` member in the JSON body of the request. * The status code of responses to `DELETE` requests is now 200 to reflect that that the deletion is performed synchronously. ���������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������apache-couchdb-1.6.0/share/doc/src/whatsnew/0.9.rst�������������������������������������������������0000644�0001750�0000144�00000020210�12332105522�021647� 0����������������������������������������������������������������������������������������������������ustar�00djc�����������������������������users���������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������.. Licensed under the Apache License, Version 2.0 (the "License"); you may not .. use this file except in compliance with the License. You may obtain a copy of .. the License at .. .. http://www.apache.org/licenses/LICENSE-2.0 .. .. Unless required by applicable law or agreed to in writing, software .. distributed under the License is distributed on an "AS IS" BASIS, WITHOUT .. WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the .. License for the specific language governing permissions and limitations under .. the License. .. _release/0.9.x: ============ 0.9.x Branch ============ .. contents:: :depth: 1 :local: .. _release/0.9.x/upgrade: Upgrade Notes ============= Response to Bulk Creation/Updates --------------------------------- The response to a bulk creation / update now looks like this .. code-block:: javascript [ {"id": "0", "rev": "3682408536"}, {"id": "1", "rev": "3206753266"}, {"id": "2", "error": "conflict", "reason": "Document update conflict."} ] Database File Format -------------------- The database file format has changed. CouchDB itself does yet not provide any tools for migrating your data. In the meantime, you can use third-party scripts to deal with the migration, such as the dump/load tools that come with the development version (trunk) of `couchdb-python`_. .. _couchdb-python: http://code.google.com/p/couchdb-python/ Renamed "count" to "limit" -------------------------- The view query API has been changed: ``count`` has become ``limit``. This is a better description of what the parameter does, and should be a simple update in any client code. Moved View URLs --------------- The view URLs have been moved to design document resources. This means that paths that used to be like http://hostname:5984/mydb/_view/designname/viewname?limit=10 will now look like http://hostname:5984/mydb/_design/designname/_view/viewname?limit=10. See the `REST, Hypermedia, and CouchApps`_ thread on dev for details. .. _REST, Hypermedia, and CouchApps: http://mail-archives.apache.org/mod_mbox/couchdb-dev/200902.mbox/%3Ce282921e0902242116n2cd207c4x7a9d0feced3f10d9@mail.gmail.com%3E Attachments ----------- Names of attachments are no longer allowed to start with an underscore. Error Codes ----------- Some refinements have been made to error handling. CouchDB will send 400 instead of 500 on invalid query parameters. Most notably, document update conflicts now respond with `409 Conflict` instead of `412 Precondition Failed`. The error code for when attempting to create a database that already exists is now 412 instead of 409. ini file format --------------- CouchDB 0.9 changes sections and configuration variable names in configuration files. Old .ini files won't work. Also note that CouchDB now ships with two .ini files where 0.8 used couch.ini there are now `default.ini` and `local.ini`. `default.ini` contains CouchDB's standard configuration values. local.ini is meant for local changes. `local.ini` is not overwritten on CouchDB updates, so your edits are safe. In addition, the new runtime configuration system persists changes to the configuration in `local.ini`. .. _release/0.9.2: Version 0.9.2 ============= Build and System Integration ---------------------------- * Remove branch callbacks to allow building couchjs against newer versions of Spidermonkey. Replication ----------- * Fix replication with 0.10 servers initiated by an 0.9 server (:issue:`559`). .. _release/0.9.1: Version 0.9.1 ============= Build and System Integration ---------------------------- * PID file directory is now created by the SysV/BSD daemon scripts. * Fixed the environment variables shown by the configure script. * Fixed the build instructions shown by the configure script. * Updated ownership and permission advice in `README` for better security. Configuration and stats system ------------------------------ * Corrected missing configuration file error message. * Fixed incorrect recording of request time. Database Core ------------- * Document validation for underscore prefixed variables. * Made attachment storage less sparse. * Fixed problems when a database with delayed commits pending is considered idle, and subject to losing changes when shutdown. (:issue:`334`) External Handlers ----------------- * Fix POST requests. Futon ----- * Redirect when loading a deleted view URI from the cookie. HTTP Interface -------------- * Attachment requests respect the "rev" query-string parameter. JavaScript View Server ---------------------- * Useful JavaScript Error messages. Replication ----------- * Added support for Unicode characters transmitted as UTF-16 surrogate pairs. * URL-encode attachment names when necessary. * Pull specific revisions of an attachment, instead of just the latest one. * Work around a rare chunk-merging problem in ibrowse. * Work with documents containing Unicode characters outside the Basic Multilingual Plane. .. _release/0.9.0: Version 0.9.0 ============= Build and System Integration ---------------------------- * The `couchdb` script now supports system chainable configuration files. * The Mac OS X daemon script now redirects STDOUT and STDERR like SysV/BSD. * The build and system integration have been improved for portability. * Added COUCHDB_OPTIONS to etc/default/couchdb file. * Remove COUCHDB_INI_FILE and COUCHDB_PID_FILE from etc/default/couchdb file. * Updated `configure.ac` to manually link `libm` for portability. * Updated `configure.ac` to extended default library paths. * Removed inets configuration files. * Added command line test runner. * Created dev target for make. Configuration and stats system ------------------------------ * Separate default and local configuration files. * HTTP interface for configuration changes. * Statistics framework with HTTP query API. Database Core ------------- * Faster B-tree implementation. * Changed internal JSON term format. * Improvements to Erlang VM interactions under heavy load. * User context and administrator role. * Update validations with design document validation functions. * Document purge functionality. * Ref-counting for database file handles. Design Document Resource Paths ------------------------------ * Added httpd_design_handlers config section. * Moved _view to httpd_design_handlers. * Added ability to render documents as non-JSON content-types with _show and _list functions, which are also httpd_design_handlers. Futon Utility Client -------------------- * Added pagination to the database listing page. * Implemented attachment uploading from the document page. * Added page that shows the current configuration, and allows modification of option values. * Added a JSON "source view" for document display. * JSON data in view rows is now syntax highlighted. * Removed the use of an iframe for better integration with browser history and bookmarking. * Full database listing in the sidebar has been replaced by a short list of recent databases. * The view editor now allows selection of the view language if there is more than one configured. * Added links to go to the raw view or document URI. * Added status page to display currently running tasks in CouchDB. * JavaScript test suite split into multiple files. * Pagination for reduce views. HTTP Interface -------------- * Added client side UUIDs for idempotent document creation * HTTP COPY for documents * Streaming of chunked attachment PUTs to disk * Remove negative count feature * Add include_docs option for view queries * Add multi-key view post for views * Query parameter validation * Use stale=ok to request potentially cached view index * External query handler module for full-text or other indexers. * Etags for attachments, views, shows and lists * Show and list functions for rendering documents and views as developer controlled content-types. * Attachment names may use slashes to allow uploading of nested directories (useful for static web hosting). * Option for a view to run over design documents. * Added newline to JSON responses. Closes bike-shed. Replication ----------- * Using ibrowse. * Checkpoint replications so failures are less expensive. * Automatically retry of failed replications. * Stream attachments in pull-replication. ����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������apache-couchdb-1.6.0/share/doc/src/whatsnew/1.0.rst�������������������������������������������������0000644�0001750�0000144�00000016502�12332105522�021650� 0����������������������������������������������������������������������������������������������������ustar�00djc�����������������������������users���������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������.. Licensed under the Apache License, Version 2.0 (the "License"); you may not .. use this file except in compliance with the License. You may obtain a copy of .. the License at .. .. http://www.apache.org/licenses/LICENSE-2.0 .. .. Unless required by applicable law or agreed to in writing, software .. distributed under the License is distributed on an "AS IS" BASIS, WITHOUT .. WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the .. License for the specific language governing permissions and limitations under .. the License. .. _release/1.0.x: ============ 1.0.x Branch ============ .. contents:: :depth: 1 :local: .. _release/1.0.x/upgrade: Upgrade Notes ============= Note, to replicate with a 1.0 CouchDB instance you must first upgrade in-place your current CouchDB to 1.0 or 0.11.1 -- backporting so that 0.10.x can replicate to 1.0 wouldn't be that hard. All that is required is patching the replicator to use the ``application/json`` content type. - ``_log`` and ``_temp_views`` are now admin-only resources. - ``_bulk_docs`` now requires a valid `Content-Type` header of ``application/json``. - `JSONP` is disabled by default. An .ini option was added to selectively enable it. - The ``key``, ``startkey`` and ``endkey`` properties of the request object passed to :ref:`list <listfun>` and :ref:`show <showfun>` functions now contain JSON objects representing the URL encoded string values in the query string. Previously, these properties contained strings which needed to be converted to JSON before using. .. warning:: :ref:`release/1.0.4` contains important security fixes. Previous `1.0.x` releases are not recommended for regular usage. .. _release/1.0.4: Version 1.0.4 ============= HTTP Interface -------------- * Fix missing revisions in ``_changes?style=all_docs``. * Fix validation of attachment names. Log System ---------- * Fix file descriptor leak in ``_log``. Replicator ---------- * Fix a race condition where replications can go stale Security -------- * Fixed :ref:`cve/2012-5641` * Fixed :ref:`cve/2012-5649` * Fixed :ref:`cve/2012-5650` View System ----------- * Avoid invalidating view indexes when running out of file descriptors. .. _release/1.0.3: Version 1.0.3 ============= General ------- * Fixed compatibility issues with Erlang R14B02. Etap Test Suite --------------- * Etap tests no longer require use of port 5984. They now use a randomly selected port so they won't clash with a running CouchDB. Futon ----- * Made compatible with jQuery 1.5.x. HTTP Interface -------------- * Fix bug that allows invalid UTF-8 after valid escapes. * The query parameter `include_docs` now honors the parameter `conflicts`. This applies to queries against map views, _all_docs and _changes. * Added support for inclusive_end with reduce views. Replicator ---------- * Enabled replication over IPv6. * Fixed for crashes in continuous and filtered changes feeds. * Fixed error when restarting replications in OTP R14B02. * Upgrade ibrowse to version 2.2.0. * Fixed bug when using a filter and a limit of 1. Security -------- * Fixed OAuth signature computation in OTP R14B02. * Handle passwords with : in them. Storage System -------------- * More performant queries against _changes and _all_docs when using the `include_docs` parameter. Windows ------- * Windows builds now require ICU >= 4.4.0 and Erlang >= R14B03. See :issue:`1152`, and :issue:`963` + OTP-9139 for more information. .. _release/1.0.2: Version 1.0.2 ============= Futon ----- * Make test suite work with Safari and Chrome. * Fixed animated progress spinner. * Fix raw view document link due to overzealous URI encoding. * Spell javascript correctly in loadScript(uri). HTTP Interface -------------- * Allow reduce=false parameter in map-only views. * Fix parsing of Accept headers. * Fix for multipart GET APIs when an attachment was created during a local-local replication. See :issue:`1022` for details. Log System ---------- * Reduce lengthy stack traces. * Allow logging of native <xml> types. Replicator ---------- * Updated ibrowse library to 2.1.2 fixing numerous replication issues. * Make sure that the replicator respects HTTP settings defined in the config. * Fix error when the ibrowse connection closes unexpectedly. * Fix authenticated replication (with HTTP basic auth) of design documents with attachments. * Various fixes to make replication more resilient for edge-cases. Storage System -------------- * Fix leaking file handles after compacting databases and views. * Fix databases forgetting their validation function after compaction. * Fix occasional timeout errors after successfully compacting large databases. * Fix ocassional error when writing to a database that has just been compacted. * Fix occasional timeout errors on systems with slow or heavily loaded IO. * Fix for OOME when compactions include documents with many conflicts. * Fix for missing attachment compression when MIME types included parameters. * Preserve purge metadata during compaction to avoid spurious view rebuilds. * Fix spurious conflicts introduced when uploading an attachment after a doc has been in a conflict. See :issue:`902` for details. * Fix for frequently edited documents in multi-master deployments being duplicated in _changes and _all_docs. See :issue:`968` for details on how to repair. * Significantly higher read and write throughput against database and view index files. View Server ----------- * Don't trigger view updates when requesting `_design/doc/_info`. * Fix for circular references in CommonJS requires. * Made isArray() function available to functions executed in the query server. * Documents are now sealed before being passed to map functions. * Force view compaction failure when duplicated document data exists. When this error is seen in the logs users should rebuild their views from scratch to fix the issue. See :issue:`999` for details. .. _release/1.0.1: Version 1.0.1 ============= Authentication -------------- * Enable basic-auth popup when required to access the server, to prevent people from getting locked out. Build and System Integration ---------------------------- * Included additional source files for distribution. Futon ----- * User interface element for querying stale (cached) views. HTTP Interface -------------- * Expose `committed_update_seq` for monitoring purposes. * Show fields saved along with _deleted=true. Allows for auditing of deletes. * More robust Accept-header detection. Replicator ---------- * Added support for replication via an HTTP/HTTPS proxy. * Fix pull replication of attachments from 0.11 to 1.0.x. * Make the _changes feed work with non-integer seqnums. Storage System -------------- * Fix data corruption bug :issue:`844`. Please see http://couchdb.apache.org/notice/1.0.1.html for details. .. _release/1.0.0: Version 1.0.0 ============= Security -------- * Added authentication caching, to avoid repeated opening and closing of the users database for each request requiring authentication. Storage System -------------- * Small optimization for reordering result lists. * More efficient header commits. * Use O_APPEND to save lseeks. * Faster implementation of pread_iolist(). Further improves performance on concurrent reads. View Server ----------- * Faster default view collation. * Added option to include update_seq in view responses. ����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������apache-couchdb-1.6.0/share/doc/src/whatsnew/1.1.rst�������������������������������������������������0000644�0001750�0000144�00000011523�12332105522�021647� 0����������������������������������������������������������������������������������������������������ustar�00djc�����������������������������users���������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������.. Licensed under the Apache License, Version 2.0 (the "License"); you may not .. use this file except in compliance with the License. You may obtain a copy of .. the License at .. .. http://www.apache.org/licenses/LICENSE-2.0 .. .. Unless required by applicable law or agreed to in writing, software .. distributed under the License is distributed on an "AS IS" BASIS, WITHOUT .. WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the .. License for the specific language governing permissions and limitations under .. the License. .. _release/1.1.x: ============ 1.1.x Branch ============ .. contents:: :depth: 1 :local: .. _release/1.1.x/upgrade: Upgrade Notes ============= .. warning:: :ref:`release/1.1.2` contains important security fixes. Previous `1.1.x` releases are not recommended for regular usage. .. _release/1.1.2: Version 1.1.2 ============= Build System ------------ * Don't `ln` the `couchjs` install target on Windows * Remove ICU version dependency on Windows. * Improve SpiderMonkey version detection. HTTP Interface -------------- * ETag of attachment changes only when the attachment changes, not the document. * Fix retrieval of headers larger than 4k. * Allow OPTIONS HTTP method for list requests. * Don't attempt to encode invalid json. Log System ---------- * Improvements to log messages for file-related errors. Replicator ---------- * Fix pull replication of documents with many revisions. * Fix replication from an HTTP source to an HTTP target. Security -------- * Fixed :ref:`cve/2012-5641` * Fixed :ref:`cve/2012-5649` * Fixed :ref:`cve/2012-5650` View Server ----------- * Avoid invalidating view indexes when running out of file descriptors. .. _release/1.1.1: Version 1.1.1 ============= * Support SpiderMonkey 1.8.5 * Add configurable maximum to the number of bytes returned by _log. * Allow CommonJS modules to be an empty string. * Bump minimum Erlang version to R13B02. * Do not run deleted validate_doc_update functions. * ETags for views include current sequence if include_docs=true. * Fix bug where duplicates can appear in _changes feed. * Fix bug where update handlers break after conflict resolution. * Fix bug with _replicator where include "filter" could crash couch. * Fix crashes when compacting large views. * Fix file descriptor leak in _log * Fix missing revisions in _changes?style=all_docs. * Improve handling of compaction at max_dbs_open limit. * JSONP responses now send "text/javascript" for Content-Type. * Link to ICU 4.2 on Windows. * Permit forward slashes in path to update functions. * Reap couchjs processes that hit reduce_overflow error. * Status code can be specified in update handlers. * Support provides() in show functions. * _view_cleanup when ddoc has no views now removes all index files. * max_replication_retry_count now supports "infinity". * Fix replication crash when source database has a document with empty ID. * Fix deadlock when assigning couchjs processes to serve requests. * Fixes to the document multipart PUT API. * Fixes regarding file descriptor leaks for databases with views. .. _release/1.1.0: Version 1.1.0 ============= .. note:: All CHANGES for 1.0.2 and 1.0.3 also apply to 1.1.0. Externals --------- * Added OS Process module to manage daemons outside of CouchDB. * Added HTTP Proxy handler for more scalable externals. Futon ----- * Added a "change password"-feature to Futon. HTTP Interface -------------- * Native SSL support. * Added support for HTTP range requests for attachments. * Added built-in filters for `_changes`: `_doc_ids` and `_design`. * Added configuration option for TCP_NODELAY aka "Nagle". * Allow POSTing arguments to `_changes`. * Allow `keys` parameter for GET requests to views. * Allow wildcards in vhosts definitions. * More granular ETag support for views. * More flexible URL rewriter. * Added support for recognizing "Q values" and media parameters in HTTP Accept headers. * Validate doc ids that come from a PUT to a URL. Replicator ---------- * Added `_replicator` database to manage replications. * Fixed issues when an endpoint is a remote database accessible via SSL. * Added support for continuous by-doc-IDs replication. * Fix issue where revision info was omitted when replicating attachments. * Integrity of attachment replication is now verified by MD5. Storage System -------------- * Multiple micro-optimizations when reading data. URL Rewriter & Vhosts --------------------- * Fix for variable substituion View Server ----------- * Added CommonJS support to map functions. * Added `stale=update_after` query option that triggers a view update after returning a `stale=ok` response. * Warn about empty result caused by `startkey` and `endkey` limiting. * Built-in reduce function `_sum` now accepts lists of integers as input. * Added view query aliases start_key, end_key, start_key_doc_id and end_key_doc_id. �����������������������������������������������������������������������������������������������������������������������������������������������������������������������������apache-couchdb-1.6.0/share/doc/src/whatsnew/1.2.rst�������������������������������������������������0000644�0001750�0000144�00000016731�12332105522�021656� 0����������������������������������������������������������������������������������������������������ustar�00djc�����������������������������users���������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������.. Licensed under the Apache License, Version 2.0 (the "License"); you may not .. use this file except in compliance with the License. You may obtain a copy of .. the License at .. .. http://www.apache.org/licenses/LICENSE-2.0 .. .. Unless required by applicable law or agreed to in writing, software .. distributed under the License is distributed on an "AS IS" BASIS, WITHOUT .. WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the .. License for the specific language governing permissions and limitations under .. the License. .. _release/1.2.x: ============ 1.2.x Branch ============ .. contents:: :depth: 1 :local: .. _release/1.2.x/upgrade: Upgrade Notes ============= .. warning:: This version drops support for the database format that was introduced in version 0.9.0. Compact your older databases (that have not been compacted for a long time) before upgrading, or they will become inaccessible. .. warning:: :ref:`release/1.2.1` contains important security fixes. Previous `1.2.x` releases are not recommended for regular usage. Security changes ---------------- The interface to the ``_users`` and ``_replicator`` databases have been changed so that non-administrator users can see less information: * In the ``_users`` database: * User documents can now only be read by the respective users, as well as administrators. Other users cannot read these documents. * Views can only be defined and queried by administrator users. * The ``_changes`` feed can only be queried by administrator users. * In the ``_replicator`` database: * Documents now have a forced ``owner`` field that corresponds to the authenticated user that created them. * Non-owner users will not see confidential information like passwords or OAuth tokens in replication documents; they can still see the other contents of those documents. Administrators can see everything. * Views can only be defined and queried by administrators. Database Compression -------------------- The new optional (but enabled by default) compression of disk files requires an upgrade of the on-disk format (5 -> 6) which occurs on creation for new databases and views, and on compaction for existing files. This format is not supported in previous releases, so rollback would require replication to the previous CouchDB release or restoring from backup. Compression can be disabled by setting ``compression = none`` in your ``local.ini`` ``[couchdb]`` section, but the on-disk format will still be upgraded. .. _release/1.2.2: Version 1.2.2 ============= Build System ------------ * Fixed issue in `couchdb` script where stopped status returns before process exits. HTTP Interface -------------- * Reset rewrite counter on new request, avoiding unnecessary request failures due to bogus rewrite limit reports. .. _release/1.2.1: Version 1.2.1 ============= Build System ------------ * Fix couchdb start script. * Win: fix linker invocations. Futon ----- * Disable buttons that aren't available for the logged-in user. HTTP Interface -------------- * No longer rewrites the ``X-CouchDB-Requested-Path`` during recursive calls to the rewriter. * Limit recursion depth in the URL rewriter. Defaults to a maximum of 100 invocations but is configurable. Security -------- * Fixed :ref:`cve/2012-5641` * Fixed :ref:`cve/2012-5649` * Fixed :ref:`cve/2012-5650` Replication ----------- * Fix potential timeouts. View Server ----------- * Change use of signals to avoid broken view groups. .. _release/1.2.0: Version 1.2.0 ============= Authentication -------------- * Fix use of OAuth with VHosts and URL rewriting. * OAuth secrets can now be stored in the users system database as an alternative to key value pairs in the .ini configuration. By default this is disabled (secrets are stored in the .ini) but can be enabled via the .ini configuration key `use_users_db` in the `couch_httpd_oauth` section. * Documents in the _users database are no longer publicly readable. * Confidential information in the _replication database is no longer publicly readable. * Password hashes are now calculated by CouchDB. Clients are no longer required to do this manually. * Cookies used for authentication can be made persistent by enabling the .ini configuration key `allow_persistent_cookies` in the `couch_httpd_auth` section. Build System ------------ * cURL is no longer required to build CouchDB as it is only used by the command line JS test runner. If cURL is available when building CouchJS you can enable the HTTP bindings by passing -H on the command line. * Temporarily made `make check` pass with R15B. A more thorough fix is in the works (:issue:`1424`). * Fixed --with-js-include and --with-js-lib options. * Added --with-js-lib-name option. Futon ----- * The `Status` screen (active tasks) now displays two new task status fields: `Started on` and `Updated on`. * Futon remembers view code every time it is saved, allowing to save an edit that amounts to a revert. HTTP Interface -------------- * Added a native JSON parser. * The _active_tasks API now offers more granular fields. Each task type is now able to expose different properties. * Added built-in changes feed filter `_view`. * Fixes to the `_changes` feed heartbeat option which caused heartbeats to be missed when used with a filter. This caused timeouts of continuous pull replications with a filter. * Properly restart the SSL socket on configuration changes. OAuth ----- * Updated bundled `erlang_oauth` library to the latest version. Replicator ---------- * A new replicator implementation. It offers more performance and configuration options. * Passing non-string values to query_params is now a 400 bad request. This is to reduce the surprise that all parameters are converted to strings internally. * Added optional field `since_seq` to replication objects/documents. It allows to bootstrap a replication from a specific source sequence number. * Simpler replication cancellation. In addition to the current method, replications can now be canceled by specifying the replication ID instead of the original replication object/document. Storage System -------------- * Added optional database and view index file compression (using Google's snappy or zlib's deflate). This feature is enabled by default, but it can be disabled by adapting local.ini accordingly. The on-disk format is upgraded on compaction and new DB/view creation to support this. * Several performance improvements, most notably regarding database writes and view indexing. * Computation of the size of the latest MVCC snapshot data and all its supporting metadata, both for database and view index files. This information is exposed as the `data_size` attribute in the database and view group information URIs. * The size of the buffers used for database and view compaction is now configurable. * Added support for automatic database and view compaction. This feature is disabled by default, but it can be enabled via the .ini configuration. * Performance improvements for the built-in changes feed filters `_doc_ids` and `_design`. View Server ----------- * Add CoffeeScript (http://coffeescript.org/) as a first class view server language. * Fixed old index file descriptor leaks after a view cleanup. * The requested_path property keeps the pre-rewrite path even when no VHost configuration is matched. * Fixed incorrect reduce query results when using pagination parameters. * Made icu_driver work with Erlang R15B and later. ���������������������������������������apache-couchdb-1.6.0/share/doc/src/whatsnew/1.3.rst�������������������������������������������������0000644�0001750�0000144�00000022272�12332105522�021654� 0����������������������������������������������������������������������������������������������������ustar�00djc�����������������������������users���������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������.. Licensed under the Apache License, Version 2.0 (the "License"); you may not .. use this file except in compliance with the License. You may obtain a copy of .. the License at .. .. http://www.apache.org/licenses/LICENSE-2.0 .. .. Unless required by applicable law or agreed to in writing, software .. distributed under the License is distributed on an "AS IS" BASIS, WITHOUT .. WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the .. License for the specific language governing permissions and limitations under .. the License. .. _release/1.3.x: ============ 1.3.x Branch ============ .. contents:: :depth: 1 :local: .. warning:: :ref:`release/1.3.x` is affected by the issue described in :ref:`cve/2014-2668`. Upgrading to a more recent release is strongly recommended. .. _release/1.3.x/upgrade: Upgrade Notes ============= You can upgrade your existing CouchDB 1.0.x installation to 1.3.0 without any specific steps or migration. When you run CouchDB, the existing data and index files will be opened and used as normal. The first time you run a compaction routine on your database within 1.3.0, the data structure and indexes will be updated to the new version of the CouchDB database format that can only be read by CouchDB 1.3.0 and later. This step is not reversible. Once the data files have been updated and migrated to the new version the data files will no longer work with a CouchDB 1.0.x release. .. warning:: If you want to retain support for opening the data files in CouchDB 1.0.x you must back up your data files before performing the upgrade and compaction process. .. _release/1.3.1: Version 1.3.1 ============= Replicator ---------- * :issue:`1788`: Tolerate missing source and target fields in _replicator docs. :commit:`869f42e2` Log System ---------- * :issue:`1794`: Fix bug in WARN level logging from 1.3.0. * Don't log about missing .compact files. :commit:`06f1a8dc` View Server ----------- * :issue:`1792`: Fix the -S option to couchjs to increase memory limits. :commit:`cfaa66cd` Miscellaneous ------------- * :issue:`1784`: Improvements to test suite and VPATH build system. :commit:`01afaa4f` * Improve documentation: better structure, improve language, less duplication. .. _release/1.3.0: Version 1.3.0 ============= Database core ------------- * :issue:`1512`: Validate bind address before assignment. :commit:`09ead8a0` * Restore ``max_document_size`` protection. :commit:`bf1eb135` Documentation ------------- * :issue:`1523`: Import CouchBase documentation and convert them into `Sphinx docs <http://sphinx.pocoo.org/>`_ Futon ----- * :issue:`509`: Added view request duration to Futon. :commit:`2d2c7d1e` * :issue:`627`: Support all timezones. :commit:`b1a049bb` * :issue:`1383`: Futon view editor won't allow you to save original view after saving a revision. :commit:`ce48342` * :issue:`1470`: Futon raises popup on attempt to navigate to missed/deleted document. :commit:`5da40eef` * :issue:`1473`, :issue:`1472`: Disable buttons for actions that the user doesn't have permissions to. :commit:`7156254d` HTTP Interface -------------- * :issue:`431`: Introduce experimental :ref:`CORS support <cors>`. :commit:`b90e4021` * :issue:`764`, :issue:`514`, :issue:`430`: Fix sending HTTP headers from ``_list`` function, :commit:`2a74f88375` * :issue:`887`: Fix ``bytes`` and ``offset`` parameters semantic for `_log` resource (`explanation <https://git-wip-us.apache.org/repos/asf?p=couchdb.git;a=blobdiff;f=src/couchdb/couch_log.erl;h=1b05f4db2;hp=0befe7aab;hb=ad700014;hpb=7809f3ca>`_) :commit:`ad700014` * :issue:`986`: Added Server-Sent Events protocol to db changes API. See http://www.w3.org/TR/eventsource/ for details. :commit:`093d2aa6` * :issue:`1026`: Database names are encoded with respect of special characters in the rewriter now. :commit:`272d6415` * :issue:`1097`: Allow `OPTIONS` request to shows and lists functions. :commit:`9f53704a` * :issue:`1210`: Files starting with underscore can be attached and updated now. :commit:`05858792` * :issue:`1277`: Better query parameter support and code clarity: :commit:`7e3c69ba` * Responses to documents created/modified via form data `POST` to /db/doc or copied with `COPY` should now include `Location` header. * Form data POST to /db/doc now includes an `ETag` response header. * ``?batch=ok`` is now supported for `COPY` and `POST` /db/doc updates. * ``?new_edits=false`` is now supported for more operations. * :issue:`1285`: Allow configuration of vendor and modules version in CouchDB welcome message. :commit:`3c24a94d` * :issue:`1321`: Variables in rewrite rules breaks OAuth authentication. :commit:`c307ba95` * :issue:`1337`: Use MD5 for attachment ETag header value. :commit:`6d912c9f` * :issue:`1381`: Add jquery.couch support for Windows 8 Metro apps. :commit:`dfc5d37c` * :issue:`1441`: Limit recursion depth in the URL rewriter. Defaults to a maximum of 100 invocations but is configurable. :commit:`d076976c` * :issue:`1442`: No longer rewrites the `X-CouchDB-Requested-Path` during recursive calls to the rewriter. :commit:`56744f2f` * :issue:`1501`: :ref:`Changes feed <changes>` now can take special parameter ``since=now`` to emit changes since current point of time. :commit:`3bbb2612` * :issue:`1502`: Allow users to delete own _users doc. :commit:`f0d6f19bc8` * :issue:`1511`: CouchDB checks `roles` field for `_users` database documents with more care. :commit:`41205000` * :issue:`1537`: Include user name in show/list `ETags`. :commit:`ac320479` * Send a 202 response for `_restart`. :commit:`b213e16f` * Make password hashing synchronous when using the /_config/admins API. :commit:`08071a80` * Add support to serve single file with CouchDB, :commit:`2774531ff2` * Allow any 2xx code to indicate success, :commit:`0d50103cfd` * Fix `_session` for IE7. * Restore 400 error for empty PUT, :commit:`2057b895` * Return ``X-Couch-Id`` header if doc is created, :commit:`98515bf0b9` * Support auth cookies with ``:`` characters, :commit:`d9566c831d` Log System ---------- * :issue:`1380`: Minor fixes for logrotate support. * Improve file I/O error logging and handling, :commit:`4b6475da` * Module Level Logging, :commit:`b58f069167` * Log 5xx responses at error level, :commit:`e896b0b7` * Log problems opening database at ERROR level except for auto-created system dbs, :commit:`41667642f7` Replicator ---------- * :issue:`1248`: `HTTP 500` error now doesn't occurs when replicating with ``?doc_ids=null``. :commit:`bea76dbf` * :issue:`1259`: Stabilize replication id, :commit:`c6252d6d7f` * :issue:`1323`: Replicator now acts as standalone application. :commit:`f913ca6e` * :issue:`1363`: Fix rarely occurred, but still race condition in changes feed if a quick burst of changes happens while replication is starting the replication can go stale. :commit:`573a7bb9` * :issue:`1557`: Upgrade some code to use BIFs bring good improvements for replication. Security -------- * :issue:`1060`: Passwords are now hashed using the PBKDF2 algorithm with a configurable work factor. :commit:`7d418134` Source Repository ----------------- * The source repository was migrated from `SVN`_ to `Git`_. .. _SVN: https://svn.apache.org/repos/asf/couchdb .. _Git: https://git-wip-us.apache.org/repos/asf/couchdb.git Storage System -------------- * Fixed unnecessary conflict when deleting and creating a document in the same batch. Test Suite ---------- * :issue:`1321`: Moved the JS test suite to the CLI. * :issue:`1338`: Start CouchDB with ``port=0``. While CouchDB might be already running on the default port 5984, port number 0 let the TCP stack figure out a free port to run. :commit:`127cbe3` * :issue:`1339`: Use shell trap to catch dying beam processes during test runs. :commit:`2921c78` * :issue:`1389`: Improved tracebacks printed by the JS CLI tests. * :issue:`1563`: Ensures urlPrefix is set in all ajax requests. :commit:`07a6af222` * Fix race condition for test running on faster hardware. * Improved the reliability of a number of tests. URL Rewriter & Vhosts --------------------- * :issue:`1026`: Database name is encoded during rewriting (allowing embedded /'s, etc). :commit:`272d6415` UUID Algorithms --------------- * :issue:`1373`: Added the utc_id algorithm :commit:`5ab712a2` Query and View Server --------------------- * :issue:`111`: Improve the errors reported by the javascript view server to provide a more friendly error report when something goes wrong. :commit:`0c619ed` * :issue:`410`: More graceful error handling for JavaScript validate_doc_update functions. * :issue:`1372`: `_stats` builtin reduce function no longer produces error for empty view result. * :issue:`1444`: Fix missed_named_view error that occurs on existed design documents and views. :commit:`b59ac98b` * :issue:`1445`: CouchDB tries no more to delete view file if it couldn't open it, even if the error is `emfile`. * :issue:`1483`: Update handlers requires valid doc ids. :commit:`72ea7e38` * :issue:`1491`: Clenaup view tables. :commit:`c37204b7` * Deprecate E4X support, :commit:`cdfdda2314` Windows ------- * :issue:`1482`: Use correct linker flag to build `snappy_nif.dll` on Windows. :commit:`a6eaf9f1` * Allows building cleanly on Windows without cURL, :commit:`fb670f5712` ��������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������apache-couchdb-1.6.0/share/doc/src/whatsnew/1.4.rst�������������������������������������������������0000644�0001750�0000144�00000004475�12332105522�021662� 0����������������������������������������������������������������������������������������������������ustar�00djc�����������������������������users���������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������.. Licensed under the Apache License, Version 2.0 (the "License"); you may not .. use this file except in compliance with the License. You may obtain a copy of .. the License at .. .. http://www.apache.org/licenses/LICENSE-2.0 .. .. Unless required by applicable law or agreed to in writing, software .. distributed under the License is distributed on an "AS IS" BASIS, WITHOUT .. WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the .. License for the specific language governing permissions and limitations under .. the License. .. _release/1.4.x: ============ 1.4.x Branch ============ .. contents:: :depth: 1 :local: .. warning:: :ref:`release/1.4.x` is affected by the issue described in :ref:`cve/2014-2668`. Upgrading to a more recent release is strongly recommended. .. _release/1.4.x/upgrade: Upgrade Notes ============= We now support Erlang/OTP R16B and R16B01; the minimum required version is R14B. User document role values must now be strings. Other types of values will be refused when saving the user document. .. _release/1.4.0: Version 1.4.0 ============= * :issue:`1139`: it's possible to apply :ref:`list <listfun>` functions to ``_all_docs`` view. :commit:`54fd258e` * :issue:`1632`: Ignore epilogues in ``multipart/related`` MIME attachments. :commit:`2b4ab67a` * :issue:`1634`: Reduce PBKDF2 work factor. :commit:`f726bc4d` * :issue:`1684`: Support for server-wide changes feed reporting on creation, updates and deletion of databases. :commit:`917d8988` * :issue:`1772`: Prevent invalid JSON output when using `all_or_nothing` :ref:`of bulk API <api/db/bulk_docs>`. :commit:`dfd39d57` * Add a :config:option:`configurable whitelist <couch_httpd_auth/public_fields>` of user document properties. :commit:`8d7ab8b1` * :issue:`1852`: Support Last-Event-ID header in EventSource changes feeds. :commit:`dfd2199a` * Allow storing pre-hashed admin passwords via :ref:`config API <api/config>`. :commit:`c98ba561` * Automatic loading of CouchDB plugins. :commit:`3fab6bb5` * Much improved documentation, including an :ref:`expanded description <vdufun>` of `validate_doc_update` functions (commit:`ef9ac469`) and a description of how CouchDB handles JSON :ref:`number values <json/numbers>` (:commit:`bbd93f77`). * Split up `replicator_db` tests into multiple independent tests. ���������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������apache-couchdb-1.6.0/share/doc/src/whatsnew/1.5.rst�������������������������������������������������0000644�0001750�0000144�00000004334�12332105522�021655� 0����������������������������������������������������������������������������������������������������ustar�00djc�����������������������������users���������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������.. Licensed under the Apache License, Version 2.0 (the "License"); you may not .. use this file except in compliance with the License. You may obtain a copy of .. the License at .. .. http://www.apache.org/licenses/LICENSE-2.0 .. .. Unless required by applicable law or agreed to in writing, software .. distributed under the License is distributed on an "AS IS" BASIS, WITHOUT .. WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the .. License for the specific language governing permissions and limitations under .. the License. .. _release/1.5.x: ============ 1.5.x Branch ============ .. contents:: :depth: 1 :local: .. warning:: :ref:`release/1.5.1` contains important security fixes. Previous `1.5.x` releases are not recommended for regular usage. .. _release/1.5.1: Version 1.5.1 ============= * Add the ``max_count`` option (:ref:`config/uuids`) to allow rate-limiting the amount of UUIDs that can be requested from the :ref:`api/server/uuids` handler in a single request (:ref:`CVE 2014-2668 <cve/2014-2668>`). .. _release/1.5.0: Version 1.5.0 ============= * :issue:`1781`: The official documentation has been overhauled. A lot of content from other sources have been merged, and the index page has been rebuilt to make the docs much more accessible. :commit:`54813a7` * A new administration UI, codenamed Fauxton, has been included as an experimental preview. It can be accessed at ``/_utils/fauxton/``. There are too many improvements here to list them all. We are looking for feedback from the community on this preview release. * :issue:`1888`: Fixed an issue where admin users would be restricted by the ``public_fields`` feature. * Fixed an issue with the JavaScript CLI test runner. :commit:`be76882`, :commit:`54813a7` * :issue:`1867`: An experimental plugin feature has been added. See ``src/couch_plugin/README.md`` for details. We invite the community to test and report any findings. * :issue:`1894`: An experimental Node.js-based query server runtime has been added. See :ref:`experimental` for details. We invite the community to test and report any findings. * :issue:`1901`: Better retry mechanism for transferring attachments during replication. :commit:`4ca2cec` ����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������apache-couchdb-1.6.0/share/doc/src/whatsnew/1.6.rst�������������������������������������������������0000644�0001750�0000144�00000007366�12332105522�021666� 0����������������������������������������������������������������������������������������������������ustar�00djc�����������������������������users���������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������.. Licensed under the Apache License, Version 2.0 (the "License"); you may not .. use this file except in compliance with the License. You may obtain a copy of .. the License at .. .. http://www.apache.org/licenses/LICENSE-2.0 .. .. Unless required by applicable law or agreed to in writing, software .. distributed under the License is distributed on an "AS IS" BASIS, WITHOUT .. WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the .. License for the specific language governing permissions and limitations under .. the License. .. _release/1.6.x: ============ 1.6.x Branch ============ .. contents:: :depth: 1 :local: .. _release/1.6.x/upgrade: Upgrade Notes ============= The :ref:`Proxy Authentication <api/auth/proxy>` handler was renamed to ``proxy_authentication_handler`` to follow the ``*_authentication_handler`` form of all other handlers. The old ``proxy_authentification_handler`` name is marked as deprecated and will be removed in future releases. It's strongly recommended to update :config:option:`httpd/authentication_handlers` option with new value in case if you had used such handler. .. _release/1.6.0: Version 1.6.0 ============= * :issue:`2200`: support Erlang/OTP 17.0 :commit:`35e16032` * Fauxton: many improvements in our experimental new user interface, including switching the code editor from CodeMirror to Ace as well as better support for various browsers. * Add the ``max_count`` option (:ref:`config/uuids`) to allow rate-limiting the amount of UUIDs that can be requested from the :ref:`api/server/uuids` handler in a single request (:ref:`CVE 2014-2668 <cve/2014-2668>`). * :issue:`1986`: increase socket buffer size to improve replication speed for large documents and attachments, and fix tests on BSD-like systems. :commit:`9a0e561b` * :issue:`1953`: improve performance of multipart/related requests. :commit:`ce3e89dc` * :issue:`2221`: verify that authentication-related configuration settings are well-formed. :commit:`dbe769c6` * :issue:`1922`: fix CORS exposed headers. :commit:`4f619833` * :issue:`1795`: ensure the startup script clears the pid file on termination. :commit:`818ef4f9` * :issue:`1962`: replication can now be performed without having write access to the source database (:commit:`1d5fe2aa`), the replication checkpoint interval is now configurable (:commit:`0693f98e`). * :issue:`2025`: add support for SOCKS5 proxies for replication. :commit:`fcd76c9` * :issue:`1930`: redirect to the correct page after submitting a new document with a different ID than the one suggested by Futon. :commit:`4906b591` * :issue:`1923`: add support for `attachments` and `att_encoding_info` options (formerly only available on the documents API) to the view API. :commit:`ca41964b` * :issue:`1780`: upgrade password hashes from SHA-1 to PBKDF2 scheme on successful authentication. :commit:`34888938` * :issue:`2059`: allow run-time configuration of maximum URL length. :commit:`f7ca266b` * :issue:`2054`: accept gzipped JSON request bodies. :commit:`4d893387` * Rename ``proxy_authentification_handler`` to ``proxy_authentication_handler``. :commit:`c66ac4a8` * :issue:`1647`: for failed replications originating from a document in the `_replicator` database, store the failure reason in the document. :commit:`08cac68b` * :issue:`2053`: send better error messages when both `key` and `keys` parameters are specified in view requests. :commit:`2bc07840` * :issue:`2040`: send better error messages when incorrect checksums are encountered during compaction. :commit:`e7fdc16a` * :issue:`2028`: allow intermedia certificates when using SSL/TLS. :commit:`2d080449` * :issue:`2031`: fix rewriting of paths with query string parameters. :commit:`37c84596` * Numerous improvements to the documentation. ��������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������apache-couchdb-1.6.0/share/doc/src/config/����������������������������������������������������������0000755�0001750�0000144�00000000000�12332106072�020222� 5����������������������������������������������������������������������������������������������������ustar�00djc�����������������������������users���������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������apache-couchdb-1.6.0/share/doc/src/config/intro.rst�������������������������������������������������0000644�0001750�0000144�00000014717�12332105522�022120� 0����������������������������������������������������������������������������������������������������ustar�00djc�����������������������������users���������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������.. Licensed under the Apache License, Version 2.0 (the "License"); you may not .. use this file except in compliance with the License. You may obtain a copy of .. the License at .. .. http://www.apache.org/licenses/LICENSE-2.0 .. .. Unless required by applicable law or agreed to in writing, software .. distributed under the License is distributed on an "AS IS" BASIS, WITHOUT .. WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the .. License for the specific language governing permissions and limitations under .. the License. .. default-domain:: config .. highlight:: ini .. _config/intro: ============================= Introduction Into Configuring ============================= Configuration files ------------------- .. warning:: The following section covering load order of config files applies only to UNIX-ish systems. For Windows, only the provided ``default.ini`` and ``local.ini`` files are relevant. These can of course have content appended, which achieves the same type of functionality as outlined for UNIX-ish systems below. By default, CouchDB reads configuration files from the following locations, in the following order: #. ``LOCALCONFDIR/default.ini`` #. ``LOCALCONFDIR/default.d/*.ini`` #. ``PLUGINS_DIR/*/priv/default.d/*.ini`` #. ``LOCALCONFDIR/local.ini`` #. ``LOCALCONFDIR/local.d/*.ini`` The ``LOCALCONFDIR`` points to the directory that contains configuration files (``/usr/local/etc/couchdb`` by default). This variable may vary from the target operation system and may be changed during building from the source code. For binary distributions, it mostly points to the installation path (e.g. ``C:\Program Files\CouchDB\etc\couchdb`` for Windows). To see the actual configuration files chain run in shell:: couchdb -c This will print out all *actual* configuration files that will form the result CouchDB configuration:: /etc/couchdb/default.ini /etc/couchdb/default.d/geocouch.ini /etc/couchdb/local.ini /etc/couchdb/local.d/geocouch.ini /etc/couchdb/local.d/vendor.ini Settings in successive documents override the settings in earlier entries. For example, setting the :option:`httpd/bind_address` parameter in ``local.ini`` would override any setting in ``default.ini``. .. warning:: The ``default.ini`` file may be overwritten during an upgrade or re-installation, so localised changes should be made to the ``local.ini`` file or files within the ``local.d`` directory. The configuration files chain may be changed by specifying additional sources by using next command line options: - ``-a``: adds configuration file to the chain - ``-A``: adds configuration directory to the chain Let's add these options and see how the configuration chain changes:: shell> couchdb -c -a /home/couchdb/custom.ini /etc/couchdb/default.ini /etc/couchdb/default.d/geocouch.ini /etc/couchdb/local.ini /etc/couchdb/local.d/geocouch.ini /etc/couchdb/local.d/vendor.ini /home/couchdb/custom.ini In case when `/home/couchdb/custom.ini` exists it will be added to the configuration chain. Parameter names and values -------------------------- All parameter names are *case-sensitive*. Every parameter takes a value of one of five types: `boolean`, `integer`, `string`, `tuple`_ and `proplist`_. Boolean values can be written as ``true`` or ``false``. Parameters with value type of `tuple` or `proplist` are following the Erlang requirement for style and naming. .. _proplist: http://www.erlang.org/doc/man/proplists.html .. _tuple: http://www.erlang.org/doc/reference_manual/data_types.html#id66049 Setting parameters via the configuration file --------------------------------------------- The common way to set some parameters is to edit the `local.ini` file which is mostly located in the `etc/couchdb` directory relative your installation path root. For example:: ; This is a comment [section] param = value ; inline comments are allowed Each configuration file line may contains `section` definition, `parameter` specification, empty (space and newline characters only) or `commented` line. You can setup `inline` commentaries for `sections` or `parameters`. The `section` defines group of parameters that are belongs to some specific CouchDB subsystem. For instance, :section:`httpd` section holds not only HTTP server parameters, but also others that directly interacts with it. The `parameter` specification contains two parts divided by the `equal` sign (``=``): the parameter name on the left side and the parameter value on the right one. The leading and following whitespace for ``=`` is an optional to improve configuration readability. .. note:: In case when you'd like to remove some parameter from the `default.ini` without modifying that file, you may override in `local.ini`, but without any value:: [httpd_global_handlers] _all_dbs = This could be read as: "remove the `_all_dbs` parameter from the `httpd_global_handlers` section if it was ever set before". The semicolon (``;``) signs about `commentary` start: everything after this character is counted as commentary and doesn't process by CouchDB. After editing of configuration file CouchDB server instance should be restarted to apply these changes. Setting parameters via the HTTP API ----------------------------------- Alternatively, configuration parameters could be set via the :ref:`HTTP API <api/config>`. This API allows to change CouchDB configuration on-the-fly without requiring a server restart:: curl -X PUT http://localhost:5984/_config/uuids/algorithm -d '"random"' In the response the old parameter's value returns:: "sequential" You should be careful with changing configuration via the HTTP API since it's easy to make CouchDB unavailable. For instance, if you'd like to change the :option:`httpd/bind_address` for a new one:: curl -X PUT http://localhost:5984/_config/httpd/bind_address -d '"10.10.0.128"' However, if you make a typo, or the specified IP address is not available from your network, CouchDB will be unavailable for you in both cases and the only way to resolve this will be by remoting into the server, correcting the errant file, and restarting CouchDB. To protect yourself against such accidents you may set the :option:`httpd/config_whitelist` of permitted configuration parameters for updates via the HTTP API. Once this option is set, further changes to non-whitelisted parameters must take place via the configuration file, and in most cases, also requires a server restart before hand-edited options take effect. �������������������������������������������������apache-couchdb-1.6.0/share/doc/src/config/compaction.rst��������������������������������������������0000644�0001750�0000144�00000013770�12332105522�023117� 0����������������������������������������������������������������������������������������������������ustar�00djc�����������������������������users���������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������.. Licensed under the Apache License, Version 2.0 (the "License")you may not .. use this file except in compliance with the License. You may obtain a copy of .. the License at .. .. http://www.apache.org/licenses/LICENSE-2.0 .. .. Unless required by applicable law or agreed to in writing, software .. distributed under the License is distributed on an "AS IS" BASIS, WITHOUT .. WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the .. License for the specific language governing permissions and limitations under .. the License. .. default-domain:: config .. highlight:: ini ======================== Compaction Configuration ======================== .. _conifg/database_compaction: Database Compaction Options =========================== .. config:section:: database_compaction :: Database Compaction Options .. config:option:: doc_buffer_size :: Documents buffer size Specifies the copy buffer's maximum size in bytes:: [database_compaction] doc_buffer_size = 524288 .. config:option:: checkpoint_after :: Checkpoint trigger Triggers a checkpoint after the specified amount of bytes were successfully copied to the compacted database:: [database_compaction] checkpoint_after = 5242880 .. _config/compactions: Compaction Daemon Rules ======================= .. config:section:: compactions :: Compaction Daemon Rules A list of rules to determine when to run automatic compaction. The :option:`daemons/compaction_daemon` compacts databases and their respective view groups when all the condition parameters are satisfied. Configuration can be per-database or global, and it has the following format:: [compactions] database_name = [ {ParamName, ParamValue}, {ParamName, ParamValue}, ... ] _default = [ {ParamName, ParamValue}, {ParamName, ParamValue}, ... ] For example:: [compactions] _default = [{db_fragmentation, "70%"}, {view_fragmentation, "60%"}, {from, "23:00"}, {to, "04:00"}] - ``db_fragmentation``: If the ratio of legacy data, including metadata, to current data in the database file size is equal to or greater than this value, this condition is satisfied. The percentage is expressed as an integer percentage. This value is computed as:: (file_size - data_size) / file_size * 100 The data_size and file_size values can be obtained when querying :http:get:`/{db}`. - ``view_fragmentation``: If the ratio of legacy data, including metadata, to current data in a view index file size is equal to or greater then this value, this database compaction condition is satisfied. The percentage is expressed as an integer percentage. This value is computed as:: (file_size - data_size) / file_size * 100 The data_size and file_size values can be obtained when querying a :ref:`view group's information URI <api/ddoc/info>`. - ``from`` and ``to``: The period for which a database (and its view group) compaction is allowed. The value for these parameters must obey the format:: HH:MM - HH:MM (HH in [0..23], MM in [0..59]) - ``strict_window``: If a compaction is still running after the end of the allowed period, it will be canceled if this parameter is set to `true`. It defaults to `false` and is meaningful only if the *period* parameter is also specified. - ``parallel_view_compaction``: If set to `true`, the database and its views are compacted in parallel. This is only useful on certain setups, like for example when the database and view index directories point to different disks. It defaults to `false`. Before a compaction is triggered, an estimation of how much free disk space is needed is computed. This estimation corresponds to two times the data size of the database or view index. When there's not enough free disk space to compact a particular database or view index, a warning message is logged. Examples: #. ``[{db_fragmentation, "70%"}, {view_fragmentation, "60%"}]`` The `foo` database is compacted if its fragmentation is 70% or more. Any view index of this database is compacted only if its fragmentation is 60% or more. #. ``[{db_fragmentation, "70%"}, {view_fragmentation, "60%"}, {from, "00:00"}, {to, "04:00"}]`` Similar to the preceding example but a compaction (database or view index) is only triggered if the current time is between midnight and 4 AM. #. ``[{db_fragmentation, "70%"}, {view_fragmentation, "60%"}, {from, "00:00"}, {to, "04:00"}, {strict_window, true}]`` Similar to the preceding example - a compaction (database or view index) is only triggered if the current time is between midnight and 4 AM. If at 4 AM the database or one of its views is still compacting, the compaction process will be canceled. #. ``[{db_fragmentation, "70%"}, {view_fragmentation, "60%"}, {from, "00:00"}, {to, "04:00"}, {strict_window, true}, {parallel_view_compaction, true}]`` Similar to the preceding example, but a database and its views can be compacted in parallel. .. _config/compaction_daemon: Configuration of Compaction Daemon ================================== .. config:section:: compaction_daemon :: Configuration of Compaction Daemon .. config:option:: check_interval The delay, in seconds, between each check for which database and view indexes need to be compacted:: [compaction_daemon] check_interval = 300 .. config:option:: min_file_size If a database or view index file is smaller than this value (in bytes), compaction will not happen. Very small files always have high fragmentation, so compacting them is inefficient. :: [compaction_daemon] min_file_size = 131072 .. _config/view_compaction: Views Compaction Options ======================== .. config:section:: view_compaction :: Views Compaction Options .. config:option:: keyvalue_buffer_size :: Key-Values buffer size Specifies maximum copy buffer size in bytes used during compaction:: [view_compaction] keyvalue_buffer_size = 2097152 ��������apache-couchdb-1.6.0/share/doc/src/config/query-servers.rst�����������������������������������������0000644�0001750�0000144�00000012711�12332105522�023611� 0����������������������������������������������������������������������������������������������������ustar�00djc�����������������������������users���������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������.. Licensed under the Apache License, Version 2.0 (the "License"); you may not .. use this file except in compliance with the License. You may obtain a copy of .. the License at .. .. http://www.apache.org/licenses/LICENSE-2.0 .. .. Unless required by applicable law or agreed to in writing, software .. distributed under the License is distributed on an "AS IS" BASIS, WITHOUT .. WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the .. License for the specific language governing permissions and limitations under .. the License. .. highlight:: ini ============= Query Servers ============= .. _config/query_servers: Query Servers Definition ======================== .. config:section:: query_servers :: Query Servers Definition .. versionchanged:: 1.2: Added CoffeeScript query server CouchDB delegates computation of :ref:`design documents <ddocs>` functions to external query servers. The external query server is a special OS process which communicates with CouchDB over standard input/output using a very simple line-based protocol with JSON messages. The external query server may be defined in configuration file following next pattern:: [query_servers] LANGUAGE = PATH ARGS Where: - ``LANGUAGE``: is a programming language which code this query server may execute. For instance, there are `python`, `ruby`, `clojure` and other query servers in wild. This value is also used for `ddoc` field ``language`` to determine which query server processes the functions. Note, that you may setup multiple query servers for the same programming language, but you have to name them different (like `python-dev` etc.). - ``PATH``: is a system path to the executable binary program that runs the query server. - ``ARGS``: optionally, you may specify additional command line arguments for the executable ``PATH``. The default query server is written in :ref:`JavaScript <query-server/js>`, running via `Mozilla SpiderMonkey`_:: [query_servers] javascript = /usr/bin/couchjs /usr/share/couchdb/server/main.js coffeescript = /usr/bin/couchjs /usr/share/couchdb/server/main-coffee.js .. _Mozilla SpiderMonkey: https://developer.mozilla.org/en/docs/SpiderMonkey .. seealso:: :ref:`Native Erlang Query Server <config/native_query_servers>` that allows to process Erlang `ddocs` and runs within CouchDB bypassing stdio communication and JSON serialization/deserialization round trip overhead. .. _config/query_server_config: Query Servers Configuration =========================== .. config:section:: query_server_config :: Query Servers Configuration .. config:option:: commit_freq :: View index commit delay Specifies the delay in seconds before view index changes are committed to disk. The default value is ``5``:: [query_server_config] commit_freq = 5 .. config:option:: os_process_limit :: Query Server operation timeout Amount of time in seconds that the Query Server may process CouchDB command:: [query_server_config] os_process_limit = 10 CouchDB will raise `os_process_timeout` error and kill the process in case the Query Server doesn't return any result within this limit. .. config:option:: reduce_limit :: Reduce limit control Controls `Reduce overflow` error that raises when output of :ref:`reduce functions <reducefun>` is too big:: [query_server_config] reduce_limit = true Normally, you don't have to disable (by setting ``false`` value) this option since main propose of `reduce` functions is to *reduce* the input. .. _config/native_query_servers: Native Erlang Query Server ========================== .. config:section:: native_query_servers :: Native Erlang Query Server .. warning:: Due to security restrictions, the Erlang query server is disabled by default. Unlike the JavaScript query server, the Erlang one does not runs in a sandbox mode. This means that Erlang code has full access to your OS, filesystem and network, which may lead to security issues. While Erlang functions are faster than JavaScript ones, you need to be careful about running them, especially if they were written by someone else. CouchDB has a native Erlang query server, allowing you to write your map/reduce functions in Erlang. First, you'll need to edit your `local.ini` to include a ``[native_query_servers]`` section:: [native_query_servers] erlang = {couch_native_process, start_link, []} To see these changes you will also need to restart the server. To test out using :ref:`Erlang views <query-server/erlang>`, visit the `Futon` admin interface, create a new database and open a temporary view. You should now be able to select ``erlang`` from the language drop-down. Let's try an example of map/reduce functions which count the total documents at each number of revisions (there are x many documents at version "1", and y documents at "2"... etc). Add a few documents to the database, then enter the following functions as a temporary view: .. code-block:: erlang %% Map Function fun({Doc}) -> <<K,_/binary>> = proplists:get_value(<<"_rev">>, Doc, null), V = proplists:get_value(<<"_id">>, Doc, null), Emit(<<K>>, V) end. %% Reduce Function fun(Keys, Values, ReReduce) -> length(Values) end. If all has gone well, after running the view you should see a list of the total number of documents at each revision number. �������������������������������������������������������apache-couchdb-1.6.0/share/doc/src/config/auth.rst��������������������������������������������������0000644�0001750�0000144�00000025175�12332105522�021726� 0����������������������������������������������������������������������������������������������������ustar�00djc�����������������������������users���������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������.. Licensed under the Apache License, Version 2.0 (the "License"); you may not .. use this file except in compliance with the License. You may obtain a copy of .. the License at .. .. http://www.apache.org/licenses/LICENSE-2.0 .. .. Unless required by applicable law or agreed to in writing, software .. distributed under the License is distributed on an "AS IS" BASIS, WITHOUT .. WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the .. License for the specific language governing permissions and limitations under .. the License. .. default-domain:: config .. highlight:: ini ================================ Authentication and Authorization ================================ .. _config/admins: Server Administrators ===================== .. config:section:: admins :: Server Administrators A default CouchDB install provides admin-level access to all connecting users. This configuration is known as `Admin Party`, and is not recommended for in-production usage. You can crash the party simply by creating the first admin account. CouchDB server administrators and passwords are not stored in the ``_users`` database, but in the ``local.ini`` file, which should be appropriately secured and readable only by system administrators:: [admins] ;admin = mysecretpassword admin = -hashed-6d3c30241ba0aaa4e16c6ea99224f915687ed8cd,7f4a3e05e0cbc6f48a0035e3508eef90 architect = -pbkdf2-43ecbd256a70a3a2f7de40d2374b6c3002918834,921a12f74df0c1052b3e562a23cd227f,10000 Administrators can be added directly to the ``[admins]`` section, and when CouchDB is restarted, the passwords will be salted and encrypted. You may also use the HTTP interface to create administrator accounts; this way, you don't need to restart CouchDB, and there's no need to temporarily store or transmit passwords in plaintext. The HTTP ``_config/admins`` endpoint supports querying, deleting or creating new admin accounts: .. code-block:: http GET /_config/admins HTTP/1.1 Accept: application/json Host: localhost:5984 .. code-block:: http HTTP/1.1 200 OK Cache-Control: must-revalidate Content-Length: 196 Content-Type: application/json Date: Fri, 30 Nov 2012 11:37:18 GMT Server: CouchDB (Erlang/OTP) .. code-block:: json { "admin": "-hashed-6d3c30241ba0aaa4e16c6ea99224f915687ed8cd,7f4a3e05e0cbc6f48a0035e3508eef90", "architect": "-pbkdf2-43ecbd256a70a3a2f7de40d2374b6c3002918834,921a12f74df0c1052b3e562a23cd227f,10000" } If you already have a salted, encrypted password string (for example, from an old ``local.ini`` file, or from a different CouchDB server), then you can store the "raw" encrypted string, without having CouchDB doubly encrypt it. .. code-block:: http PUT /_config/admins/architect?raw=true HTTP/1.1 Accept: application/json Content-Type: application/json Content-Length: 89 Host: localhost:5984 "-pbkdf2-43ecbd256a70a3a2f7de40d2374b6c3002918834,921a12f74df0c1052b3e562a23cd227f,10000" .. code-block:: http HTTP/1.1 200 OK Cache-Control: must-revalidate Content-Length: 89 Content-Type: application/json Date: Fri, 30 Nov 2012 11:39:18 GMT Server: CouchDB (Erlang/OTP) "-pbkdf2-43ecbd256a70a3a2f7de40d2374b6c3002918834,921a12f74df0c1052b3e562a23cd227f,10000" Further details are available in `security`, including configuring the work factor for ``PBKDF2``, and the algorithm itself at `PBKDF2 (RFC-2898) <http://tools.ietf.org/html/rfc2898>`_. .. versionchanged:: 1.4 `PBKDF2` server-side hashed salted password support added, now as a synchronous call for the ``_config/admins`` API. .. _config/couch_httpd_auth: Authentication Configuration ============================ .. config:section:: couch_httpd_auth :: Authentication Configuration .. config:option:: allow_persistent_cookies :: Persistent cookies Makes cookies persistent if ``true``. :: [couch_httpd_auth] allow_persistent_cookies = false .. config:option:: auth_cache_size :: Authentication cache Number of :ref:`userctx_object` to cache in memory, to reduce disk lookups. :: [couch_httpd_auth] auth_cache_size = 50 .. config:option:: authentication_db :: Users database Specifies the name of the system database for storing CouchDB users. :: [couch_httpd_auth] authentication_db = _users .. warning:: If you change the database name, do not forget to remove or clean up the old database, since it will no longer be protected by CouchDB. .. config:option:: authentication_redirect :: Default redirect for authentication requests Specifies the location for redirection on successful authentication if a ``text/html`` response is accepted by the client (via an ``Accept`` header). :: [couch_httpd_auth] authentication_redirect = /_utils/session.html .. config:option:: iterations :: PBKDF2 iterations count .. versionadded:: 1.3 The number of iterations for password hashing by the PBKDF2 algorithm. A higher number provides better hash durability, but comes at a cost in performance for each request that requires authentication. :: [couch_httpd_auth] iterations = 10000 .. config:option:: min_iterations :: Minimum PBKDF2 iterations count .. versionadded:: 1.6 The minimum number of iterations allowed for passwords hashed by the PBKDF2 algorithm. Any user with fewer iterations is forbidden. :: [couch_httpd_auth] min_iterations = 100 .. config:option:: max_iterations :: Maximum PBKDF2 iterations count .. versionadded:: 1.6 The maximum number of iterations allowed for passwords hashed by the PBKDF2 algorithm. Any user with greater iterations is forbidden. :: [couch_httpd_auth] max_iterations = 100000 .. config:option:: proxy_use_secret :: Force proxy auth use secret token When this option is set to ``true``, the :option:`couch_httpd_auth/secret` option is required for :ref:`api/auth/proxy`. :: [couch_httpd_auth] proxy_use_secret = false .. config:option:: public_fields :: User documents public fields .. versionadded:: 1.4 A comma-separated list of field names in user documents (in :option:`couch_httpd_auth/authentication_db`) that can be read by any user. If unset or not specified, authenticated users can only retrieve their own document. :: [couch_httpd_auth] public_fields = first_name, last_name, contacts, url .. note:: Using the ``public_fields`` whitelist for user document properties requires setting the :option:`couch_httpd_auth/users_db_public` option to ``true`` (the latter option has no other purpose):: [couch_httpd_auth] users_db_public = true .. config:option:: require_valid_user :: Force user authentication When this option is set to ``true``, no requests are allowed from anonymous users. Everyone must be authenticated. :: [couch_httpd_auth] require_valid_user = false .. config:option:: secret :: Proxy Auth secret token The secret token used for :ref:`api/auth/proxy` method. :: [couch_httpd_auth] secret = 92de07df7e7a3fe14808cef90a7cc0d91 .. config:option:: timeout :: Session timeout Number of seconds since the last request before sessions will be expired. :: [couch_httpd_auth] timeout = 600 .. config:option:: users_db_public :: Publish user documents .. versionadded:: 1.4 Allow all users to view user documents. By default, only admins may browse all users documents, while users may browse only their own document. :: [couch_httpd_auth] users_db_public = false .. config:option:: x_auth_roles :: Proxy Auth roles header The HTTP header name (``X-Auth-CouchDB-Roles`` by default) that contains the list of a user's roles, separated by a comma. Used for :ref:`api/auth/proxy`. :: [couch_httpd_auth] x_auth_roles = X-Auth-CouchDB-Roles .. config:option:: x_auth_token :: Proxy Auth token header The HTTP header name (``X-Auth-CouchDB-Token`` by default) containing the token used to authenticate the authorization. This token is an `HMAC-SHA1` created from the :option:`couch_httpd_auth/secret` and :option:`couch_httpd_auth/x_auth_username`. The secret key should be the same on the client and the CouchDB node. This token is optional if the value of the :option:`couch_httpd_auth/proxy_use_secret` option is not ``true``. Used for :ref:`api/auth/proxy`. :: [couch_httpd_auth] x_auth_roles = X-Auth-CouchDB-Token .. config:option:: x_auth_username :: Proxy Auth username header The HTTP header name (``X-Auth-CouchDB-UserName`` by default) containing the username. Used for :ref:`api/auth/proxy`. :: [couch_httpd_auth] x_auth_username = X-Auth-CouchDB-UserName .. _config/couch_httpd_oauth: HTTP OAuth Configuration ======================== .. config:section:: couch_httpd_oauth :: HTTP OAuth Configuration .. versionadded:: 1.2 .. config:option:: use_users_db CouchDB is able to store OAuth credentials within user documents instead of config file by using this option:: [couch_httpd_oauth] use_users_db = true If set to ``true``, OAuth token and consumer secrets will be looked up in the :option:`authentication database <couch_httpd_auth/authentication_db>`. These secrets are stored in a top level field named ``"oauth"`` in user documents, as below. .. code-block:: javascript { "_id": "org.couchdb.user:joe", "type": "user", "name": "joe", "password_sha": "fe95df1ca59a9b567bdca5cbaf8412abd6e06121", "salt": "4e170ffeb6f34daecfd814dfb4001a73" "roles": ["foo", "bar"], "oauth": { "consumer_keys": { "consumerKey1": "key1Secret", "consumerKey2": "key2Secret" }, "tokens": { "token1": "token1Secret", "token2": "token2Secret" } } } .. _config/oauth: OAuth Configuration =================== .. config:section:: oauth_* :: OAuth Configuration To let users be authenticated by :ref:`api/auth/oauth` (:rfc:`5849`), three special sections must be set up in the :ref:`configuration <config>` file: 1. The Consumer secret: :: [oauth_consumer_secrets] consumer1 = sekr1t 2. Token secrets: :: [oauth_token_secrets] token1 = tokensekr1t 3. A mapping from tokens to users: :: [oauth_token_users] token1 = couchdb_username ���������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������apache-couchdb-1.6.0/share/doc/src/config/http.rst��������������������������������������������������0000644�0001750�0000144�00000044644�12332105522�021746� 0����������������������������������������������������������������������������������������������������ustar�00djc�����������������������������users���������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������.. Licensed under the Apache License, Version 2.0 (the "License"); you may not .. use this file except in compliance with the License. You may obtain a copy of .. the License at .. .. http://www.apache.org/licenses/LICENSE-2.0 .. .. Unless required by applicable law or agreed to in writing, software .. distributed under the License is distributed on an "AS IS" BASIS, WITHOUT .. WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the .. License for the specific language governing permissions and limitations under .. the License. .. default-domain:: config .. highlight:: ini =================== CouchDB HTTP Server =================== .. _config/httpd: HTTP Server Options =================== .. config:section:: httpd :: HTTP Server Options .. config:option:: allow_jsonp :: Enables JSONP support The ``true`` value of this option enables `JSONP`_ support (it's ``false`` by default):: [httpd] allow_jsonp = false .. _JSONP: http://www.json-p.org/ .. config:option:: authentication_handlers :: Authentication handlers List of used authentication handlers that used by CouchDB. You may extend them via third-party plugins or remove some of them if you won't let users to use one of provided methods:: [httpd] authentication_handlers = {couch_httpd_oauth, oauth_authentication_handler}, {couch_httpd_auth, cookie_authentication_handler}, {couch_httpd_auth, default_authentication_handler} - ``{couch_httpd_oauth, oauth_authentication_handler}``: handles OAuth; - ``{couch_httpd_auth, cookie_authentication_handler}``: used for Cookie auth; - ``{couch_httpd_auth, proxy_authentication_handler}``: used for Proxy auth; - ``{couch_httpd_auth, default_authentication_handler}``: used for Basic auth; - ``{couch_httpd_auth, null_authentication_handler}``: disables auth. Everlasting `Admin Party`! .. config:option:: bind_address :: Listen IP address Defines the IP address by which CouchDB will be accessible:: [httpd] bind_address = 127.0.0.1 To let CouchDB listen any available IP address, just setup ``0.0.0.0`` value:: [httpd] bind_address = 0.0.0.0 For IPv6 support you need to set ``::1`` if you want to let CouchDB listen local address:: [httpd] bind_address = ::1 or ``::`` for any available:: [httpd] bind_address = :: .. config:option:: changes_timeout :: Changes feed timeout Specifies default `timeout` value for :ref:`Changes Feed <changes>` in milliseconds (60000 by default):: [httpd] changes_feed = 60000 ; 60 seconds .. config:option:: config_whitelist :: Config options while list Sets the configuration modification whitelist. Only whitelisted values may be changed via the :ref:`config API <api/config>`. To allow the admin to change this value over HTTP, remember to include ``{httpd,config_whitelist}`` itself. Excluding it from the list would require editing this file to update the whitelist:: [httpd] config_whitelist = [{httpd,config_whitelist}, {log,level}, {etc,etc}] .. config:option:: default_handler :: Default request handler Specifies default HTTP requests handler:: [httpd] default_handler = {couch_httpd_db, handle_request} .. config:option:: enable_cors :: Activates CORS .. versionadded:: 1.3 Controls :ref:`CORS <config/cors>` feature:: [httpd] enable_cors = false .. config:option:: log_max_chunk_size :: Logs chunk size Defines maximum chunk size in bytes for :ref:`_log <api/server/log>` resource:: [httpd] log_max_chunk_size = 1000000 .. config:option:: port :: Listen port Defined the port number to listen:: [httpd] port = 5984 To let CouchDB handle any free port, set this option to ``0``:: [httpd] port = 0 After that, CouchDB URI could be located within the URI file. .. config:option:: redirect_vhost_handler :: Virtual Hosts custom redirect handler This option customizes the default function that handles requests to :section:`virtual hosts <vhosts>`:: [httpd] redirect_vhost_handler = {Module, Fun} The specified function take 2 arguments: the Mochiweb request object and the target path. .. config:option:: server_options :: MochiWeb Server Options Server options for the `MochiWeb`_ component of CouchDB can be added to the configuration files:: [httpd] server_options = [{backlog, 128}, {acceptor_pool_size, 16}] .. _MochiWeb: https://github.com/mochi/mochiweb .. config:option:: secure_rewrites :: Default request handler This option allow to isolate databases via subdomains:: [httpd] secure_rewrites = true .. config:option:: socket_options :: Socket Options The socket options for the listening socket in CouchDB can be specified as a list of tuples. For example:: [httpd] socket_options = [{recbuf, 262144}, {sndbuf, 262144}, {nodelay, true}] The options supported are a subset of full options supported by the TCP/IP stack. A list of the supported options are provided in the `Erlang inet`_ documentation. .. _Erlang inet: http://www.erlang.org/doc/man/inet.html#setopts-2 .. config:option:: vhost_global_handlers :: Virtual hosts global handlers List of global handlers that are available for :section:`virtual hosts <vhosts>`:: [httpd] vhost_global_handlers = _utils, _uuids, _session, _oauth, _users .. config:option:: x_forwarded_host :: X-Forwarder-Host The `x_forwarded_host` header (``X-Forwarded-Host`` by default) is used to forward the original value of the ``Host`` header field in case, for example, if a reverse proxy is rewriting the "Host" header field to some internal host name before forward the request to CouchDB:: [httpd] x_forwarded_host = X-Forwarded-Host This header has higher priority above ``Host`` one, if only it exists in the request. .. config:option:: x_forwarded_proto :: X-Forwarder-Proto `x_forwarded_proto` header (``X-Forwarder-Proto`` by default) is used for identifying the originating protocol of an HTTP request, since a reverse proxy may communicate with CouchDB instance using HTTP even if the request to the reverse proxy is HTTPS:: [httpd] x_forwarded_proto = X-Forwarded-Proto .. config:option:: x_forwarded_ssl :: X-Forwarder-Ssl The `x_forwarded_ssl` header (``X-Forwarded-Ssl`` by default) tells CouchDB that it should use the `https` scheme instead of the `http`. Actually, it's a synonym for ``X-Forwarded-Proto: https`` header, but used by some reverse proxies:: [httpd] x_forwarded_ssl = X-Forwarded-Ssl .. config:option:: WWW-Authenticate :: Force basic auth Set this option to trigger basic-auth popup on unauthorized requests:: [httpd] WWW-Authenticate = Basic realm="Welcome to the Couch!" .. _config/ssl: Secure Socket Level Options =========================== .. config:section:: ssl :: Secure Socket Level Options CouchDB supports SSL natively. All your secure connection needs can now be served without needing to setup and maintain a separate proxy server that handles SSL. SSL setup can be tricky, but the configuration in CouchDB was designed to be as easy as possible. All you need is two files; a certificate and a private key. If you bought an official SSL certificate from a certificate authority, both should be in your possession already. If you just want to try this out and don't want to pay anything upfront, you can create a self-signed certificate. Everything will work the same, but clients will get a warning about an insecure certificate. You will need the `OpenSSL`_ command line tool installed. It probably already is. .. code-block:: bash shell> mkdir /etc/couchdb/cert shell> cd /etc/couchdb/cert shell> openssl genrsa > privkey.pem shell> openssl req -new -x509 -key privkey.pem -out couchdb.pem -days 1095 shell> chmod 600 privkey.pem couchdb.pem shell> chown couchdb privkey.pem couchdb.pem Now, you need to edit CouchDB's configuration, either by editing your ``local.ini`` file or using the ``/_config`` API calls or the configuration screen in Futon. Here is what you need to do in ``local.ini``, you can infer what needs doing in the other places. At first, :option:`enable the HTTPS daemon <daemons/httpsd>`:: [daemons] httpsd = {couch_httpd, start_link, [https]} Next, under ``[ssl]`` section setup newly generated certificates:: [ssl] cert_file = /etc/couchdb/cert/couchdb.pem key_file = /etc/couchdb/cert/privkey.pem For more information please read `certificates HOWTO`_. Now start (or restart) CouchDB. You should be able to connect to it using HTTPS on port 6984: .. code-block:: bash shell> curl https://127.0.0.1:6984/ curl: (60) SSL certificate problem, verify that the CA cert is OK. Details: error:14090086:SSL routines:SSL3_GET_SERVER_CERTIFICATE:certificate verify failed More details here: http://curl.haxx.se/docs/sslcerts.html curl performs SSL certificate verification by default, using a "bundle" of Certificate Authority (CA) public keys (CA certs). If the default bundle file isn't adequate, you can specify an alternate file using the --cacert option. If this HTTPS server uses a certificate signed by a CA represented in the bundle, the certificate verification probably failed due to a problem with the certificate (it might be expired, or the name might not match the domain name in the URL). If you'd like to turn off curl's verification of the certificate, use the -k (or --insecure) option. Oh no! What happened?! Remember, clients will notify their users that your certificate is self signed. ``curl`` is the client in this case and it notifies you. Luckily you trust yourself (don't you?) and you can specify the ``-k`` option as the message reads: .. code-block:: bash shell> curl -k https://127.0.0.1:6984/ {"couchdb":"Welcome","version":"1.5.0"} All done. .. _`certificates HOWTO`: http://www.openssl.org/docs/HOWTO/certificates.txt .. _OpenSSL: http://www.openssl.org/ .. config:option:: cacert_file :: CA Certificate file Path to file containing PEM encoded CA certificates (trusted certificates used for verifying a peer certificate). May be omitted if you do not want to verify the peer:: [ssl] cacert_file = /etc/ssl/certs/ca-certificates.crt .. config:option:: cert_file :: Certificate file Path to a file containing the user's certificate:: [ssl] cert_file = /etc/couchdb/cert/couchdb.pem .. config:option:: key_file :: Certificate key file Path to file containing user's private PEM encoded key:: [ssl] key_file = /etc/couchdb/cert/privkey.pem .. config:option:: password :: Certificate key password String containing the user's password. Only used if the private keyfile is password protected:: [ssl] password = somepassword .. config:option:: ssl_certificate_max_depth :: Maximum peer certificate depth Maximum peer certificate depth (must be set even if certificate validation is off):: [ssl] ssl_certificate_max_depth = 1 .. config:option:: verify_fun :: SSL verification function The verification fun (optional) if not specified, the default verification fun will be used:: [ssl] verify_fun = {Module, VerifyFun} .. config:option:: verify_ssl_certificates :: Enable certificate verification Set to `true` to validate peer certificates:: [ssl] verify_ssl_certificates = false .. _cors: .. _config/cors: Cross-Origin Resource Sharing ============================= .. config:section:: cors :: Cross-Origin Resource Sharing .. versionadded:: 1.3 added CORS support, see JIRA :issue:`431` `CORS`, or "Cross-Origin Resource Sharing", allows a resource such as a web page running JavaScript inside a browser, to make AJAX requests (XMLHttpRequests) to a different domain, without compromising the security of either party. A typical use case is to have a static website hosted on a CDN make requests to another resource, such as a hosted CouchDB instance. This avoids needing an intermediary proxy, using `JSONP` or similar workarounds to retrieve and host content. While CouchDB's integrated HTTP server has support for document attachments makes this less of a constraint for pure CouchDB projects, there are many cases where separating the static content from the database access is desirable, and CORS makes this very straightforward. By supporting CORS functionality, a CouchDB instance can accept direct connections to protected databases and instances, without the browser functionality being blocked due to same-origin constraints. CORS is supported today on over 90% of recent browsers. CORS support is provided as experimental functionality in 1.3, and as such will need to be enabled specifically in CouchDB's configuration. While all origins are forbidden from making requests by default, support is available for simple requests, preflight requests and per-vhost configuration. This section requires :option:`httpd/enable_cors` option have ``true`` value:: [httpd] enable_cors = true .. config:option:: credentials By default, neither authentication headers nor cookies are included in requests and responses. To do so requires both setting ``XmlHttpRequest.withCredentials = true`` on the request object in the browser and enabling credentials support in CouchDB. :: [cors] credentials = true CouchDB will respond to a credentials-enabled CORS request with an additional header, ``Access-Control-Allow-Credentials=true``. .. config:option:: origins List of origins separated by a comma, ``*`` means accept all. You can’t set ``origins = *`` and ``credentials = true`` option at the same time:: [cors] origins = * Access can be restricted by protocol, host and optionally by port. Origins must follow the scheme: http://example.com:80:: [cors] origins = http://localhost, https://localhost, http://couch.mydev.name:8080 Note that by default, no origins are accepted. You must define them explicitly. .. config:option:: headers List of accepted headers separated by a comma:: [cors] headers = X-Couch-Id, X-Couch-Rev .. config:option:: methods List of accepted methods:: [cors] methods = GET,POST .. seealso:: Original JIRA `implementation ticket <https://issues.apache.org/jira/browse/COUCHDB-431>`_ Standards and References: - IETF RFCs relating to methods: :rfc:`2618`, :rfc:`2817`, :rfc:`5789` - IETF RFC for Web Origins: :rfc:`6454` - W3C `CORS standard <http://www.w3.org/TR/cors>`_ Mozilla Developer Network Resources: - `Same origin policy for URIs <https://developer.mozilla.org/en-US/docs/Same-origin_policy_for_file:_URIs>`_ - `HTTP Access Control <https://developer.mozilla.org/En/HTTP_access_control>`_ - `Server-side Access Control <https://developer.mozilla.org/En/Server-Side_Access_Control>`_ - `Javascript same origin policy <https://developer.mozilla.org/en-US/docs/Same_origin_policy_for_JavaScript>`_ Client-side CORS support and usage: - `CORS browser support matrix <http://caniuse.com/cors>`_ - `COS tutorial <http://www.html5rocks.com/en/tutorials/cors/>`_ - `XHR with CORS <http://hacks.mozilla.org/2009/07/cross-site-xmlhttprequest-with-cors/>`_ Per Virtual Host Configuration ------------------------------ To set the options for a :section:`vhosts`, you will need to create a section with the vhost name prefixed by ``cors:``. Example case for the vhost `example.com`:: [cors:example.com] credentials = false ; List of origins separated by a comma origins = * ; List of accepted headers separated by a comma headers = X-CouchDB-Header ; List of accepted methods methods = HEAD, GET .. _config/vhosts: Virtual Hosts ============= .. config:section:: vhosts :: Virtual Hosts CouchDB can map requests to different locations based on the ``Host`` header, even if they arrive on the same inbound IP address. This allows different virtual hosts on the same machine to map to different databases or design documents, etc. The most common use case is to map a virtual host to a :ref:`Rewrite Handler <api/ddoc/rewrite>`, to provide full control over the application's URIs. To add a virtual host, add a `CNAME` pointer to the DNS for your domain name. For development and testing, it is sufficient to add an entry in the hosts file, typically `/etc/hosts`` on Unix-like operating systems: .. code-block:: text # CouchDB vhost definitions, refer to local.ini for further details 127.0.0.1 couchdb.local Test that this is working: .. code-block:: bash $ ping -n 2 couchdb.local PING couchdb.local (127.0.0.1) 56(84) bytes of data. 64 bytes from localhost (127.0.0.1): icmp_req=1 ttl=64 time=0.025 ms 64 bytes from localhost (127.0.0.1): icmp_req=2 ttl=64 time=0.051 ms Finally, add an entry to your :ref:`configuration file <config>` in the ``[vhosts]`` section:: [vhosts] couchdb.local:5984 = /example *.couchdb.local:5984 = /example If your CouchDB is listening on the the default HTTP port (80), or is sitting behind a proxy, then you don't need to specify a port number in the `vhost` key. The first line will rewrite the request to display the content of the `example` database. This rule works only if the ``Host`` header is ``couchdb.local`` and won't work for `CNAMEs`. The second rule, on the other hand, matches all `CNAMEs` to `example` db, so that both `www.couchdb.local` and `db.couchdb.local` will work. Rewriting Hosts to a Path ------------------------- Like in the :ref:`_rewrite <api/ddoc/rewrite>` handler you can match some variable and use them to create the target path. Some examples:: [vhosts] *.couchdb.local = /* :dbname. = /:dbname :ddocname.:dbname.example.com = /:dbname/_design/:ddocname/_rewrite The first rule passes the wildcard as `dbname`. The second one does the same, but uses a variable name. And the third one allows you to use any URL with `ddocname` in any database with `dbname`. You could also change the default function to handle request by changing the setting :option:`httpd/redirect_vhost_handler`. ��������������������������������������������������������������������������������������������apache-couchdb-1.6.0/share/doc/src/config/http-handlers.rst�����������������������������������������0000644�0001750�0000144�00000013430�12332105522�023531� 0����������������������������������������������������������������������������������������������������ustar�00djc�����������������������������users���������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������.. Licensed under the Apache License, Version 2.0 (the "License"); you may not .. use this file except in compliance with the License. You may obtain a copy of .. the License at .. .. http://www.apache.org/licenses/LICENSE-2.0 .. .. Unless required by applicable law or agreed to in writing, software .. distributed under the License is distributed on an "AS IS" BASIS, WITHOUT .. WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the .. License for the specific language governing permissions and limitations under .. the License. .. highlight:: ini ====================== HTTP Resource Handlers ====================== .. _config/httpd_global_handlers: Global HTTP Handlers ==================== .. config:section:: httpd_global_handlers :: Global HTTP Handlers These HTTP resources are provided for CouchDB server root level. .. config:option:: / :: [httpd_global_handlers] / = {couch_httpd_misc_handlers, handle_welcome_req, <<"Welcome">>} .. config:option:: favicon.ico The favicon handler looks for `favicon.ico` file within specified directory:: [httpd_global_handlers] favicon.ico = {couch_httpd_misc_handlers, handle_favicon_req, "/usr/share/couchdb/www"} .. config:option:: _active_tasks :: [httpd_global_handlers] _active_tasks = {couch_httpd_misc_handlers, handle_task_status_req} .. config:option:: _all_dbs Provides a list of all server's databases:: [httpd_global_handlers] _all_dbs = {couch_httpd_misc_handlers, handle_all_dbs_req} .. note:: Sometimes you don't want to disclose database names for everyone, but you also don't like/want/able to setup any proxies in front of CouchDB. Removing this handler disables ``_all_dbs`` resource and there will be no way to get list of available databases. The same also is true for other resource handlers. .. config:option:: _config Provides resource to work with CouchDB config :ref:`remotely <api/config>`. Any config changes that was made via HTTP API are applied automatically on fly and doesn't requires server instance to be restarted:: [httpd_global_handlers] _config = {couch_httpd_misc_handlers, handle_config_req} .. config:option:: _log :: [httpd_global_handlers] _log = {couch_httpd_misc_handlers, handle_log_req} .. config:option:: _oauth :: [httpd_global_handlers] _oauth = {couch_httpd_oauth, handle_oauth_req} .. config:option:: _replicate Provides an API to run :ref:`temporary replications <api/server/replicate>`:: [httpd_global_handlers] _replicate = {couch_replicator_httpd, handle_req} .. config:option:: _restart :: [httpd_global_handlers] _restart = {couch_httpd_misc_handlers, handle_restart_req} .. config:option:: _session Provides a resource with information about the current user's session:: [httpd_global_handlers] _session = {couch_httpd_auth, handle_session_req} .. config:option:: _stats :: [httpd_global_handlers] _stats = {couch_httpd_stats_handlers, handle_stats_req} .. config:option:: _utils The :ref:`_utils <api/server/utils>` handler serves `Futon`'s web administration page:: [httpd_global_handlers] _utils = {couch_httpd_misc_handlers, handle_utils_dir_req, "/usr/share/couchdb/www"} In similar way, you may setup custom handler to let CouchDB serve any static files. .. config:option:: _uuids Provides a resource to get UUIDs generated by CouchDB:: [httpd_global_handlers] _uuids = {couch_httpd_misc_handlers, handle_uuids_req} This is useful when your client environment isn't capable of providing truly random IDs (web browsers e.g.). .. _config/httpd_db_handlers: Database HTTP Handlers ====================== .. config:section:: httpd_db_handlers :: Database HTTP Handlers These HTTP resources are available on every CouchDB database. .. config:option:: _all_docs :: [httpd_db_handlers] _all_docs = {couch_mrview_http, handle_all_docs_req} .. config:option:: _changes :: [httpd_db_handlers] _changes = {couch_httpd_db, handle_changes_req} .. config:option:: _compact :: [httpd_db_handlers] _compact = {couch_httpd_db, handle_compact_req} .. config:option:: _design :: [httpd_db_handlers] _design = {couch_httpd_db, handle_design_req} .. config:option:: _temp_view :: [httpd_db_handlers] _temp_view = {couch_mrview_http, handle_temp_view_req} .. config:option:: _view_cleanup :: [httpd_db_handlers] _view_cleanup = {couch_mrview_http, handle_cleanup_req} .. _config/httpd_design_handlers: Design Documents HTTP Handlers ============================== .. config:section:: httpd_design_handlers :: Design Documents HTTP Handlers These HTTP resources are provided for design documents. .. config:option:: _compact :: [httpd_design_handlers] _compact = {couch_mrview_http, handle_compact_req} .. config:option:: _info :: [httpd_design_handlers] _info = {couch_mrview_http, handle_info_req} .. config:option:: _list :: [httpd_design_handlers] _list = {couch_mrview_show, handle_view_list_req} .. config:option:: _rewrite :: [httpd_design_handlers] _rewrite = {couch_httpd_rewrite, handle_rewrite_req} .. config:option:: _show :: [httpd_design_handlers] _show = {couch_mrview_show, handle_doc_show_req} .. config:option:: _update :: [httpd_design_handlers] _update = {couch_mrview_show, handle_doc_update_req} .. config:option:: _view :: [httpd_design_handlers] _view = {couch_mrview_http, handle_view_req} ����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������apache-couchdb-1.6.0/share/doc/src/config/index.rst�������������������������������������������������0000644�0001750�0000144�00000001454�12332105522�022066� 0����������������������������������������������������������������������������������������������������ustar�00djc�����������������������������users���������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������.. Licensed under the Apache License, Version 2.0 (the "License"); you may not .. use this file except in compliance with the License. You may obtain a copy of .. the License at .. .. http://www.apache.org/licenses/LICENSE-2.0 .. .. Unless required by applicable law or agreed to in writing, software .. distributed under the License is distributed on an "AS IS" BASIS, WITHOUT .. WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the .. License for the specific language governing permissions and limitations under .. the License. .. _config: =================== Configuring CouchDB =================== .. toctree:: :maxdepth: 2 intro couchdb http auth compaction logging replicator query-servers externals http-handlers services misc proxying ��������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������apache-couchdb-1.6.0/share/doc/src/config/misc.rst��������������������������������������������������0000644�0001750�0000144�00000015475�12332105522�021722� 0����������������������������������������������������������������������������������������������������ustar�00djc�����������������������������users���������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������.. Licensed under the Apache License, Version 2.0 (the "License"); you may not .. use this file except in compliance with the License. You may obtain a copy of .. the License at .. .. http://www.apache.org/licenses/LICENSE-2.0 .. .. Unless required by applicable law or agreed to in writing, software .. distributed under the License is distributed on an "AS IS" BASIS, WITHOUT .. WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the .. License for the specific language governing permissions and limitations under .. the License. .. default-domain:: config .. highlight:: ini ======================== Miscellaneous Parameters ======================== .. _config/attachments: Configuration of Attachment Storage =================================== .. config:section:: attachments :: Configuration of Attachment Storage .. config:option:: compression_level Defines zlib compression level for the attachments from ``1`` (lowest, fastest) to ``9`` (highest, slowest). A value of ``0`` disables compression :: [attachments] compression_level = 8 .. config:option:: compressible_types Since compression is ineffective for some types of files, it is possible to let CouchDB compress only some types of attachments, specified by their MIME type:: [attachments] compressible_types = text/*, application/javascript, application/json, application/xml .. _config/stats: Statistic Calculation ===================== .. config:section:: stats :: Statistic Calculation .. config:option:: rate Rate of statistics gathering in milliseconds:: [stats] rate = 1000 .. config:option:: samples Samples are used to track the mean and standard value deviation within specified intervals (in seconds):: [stats] samples = [0, 60, 300, 900] .. _config/uuids: UUIDs Configuration =================== .. config:section:: uuids :: UUIDs Configuration .. config:option:: algorithm :: Generation Algorithm .. versionchanged:: 1.3 Added ``utc_id`` algorithm. CouchDB provides various algorithms to generate the UUID values that are used for document `_id`'s by default:: [uuids] algorithm = sequential Available algorithms: - ``random``: 128 bits of random awesome. All awesome, all the time: .. code-block:: javascript { "uuids": [ "5fcbbf2cb171b1d5c3bc6df3d4affb32", "9115e0942372a87a977f1caf30b2ac29", "3840b51b0b81b46cab99384d5cd106e3", "b848dbdeb422164babf2705ac18173e1", "b7a8566af7e0fc02404bb676b47c3bf7", "a006879afdcae324d70e925c420c860d", "5f7716ee487cc4083545d4ca02cd45d4", "35fdd1c8346c22ccc43cc45cd632e6d6", "97bbdb4a1c7166682dc026e1ac97a64c", "eb242b506a6ae330bda6969bb2677079" ] } - ``sequential``: Monotonically increasing ids with random increments. The first 26 hex characters are random, the last 6 increment in random amounts until an overflow occurs. On overflow, the random prefix is regenerated and the process starts over. .. code-block:: javascript { "uuids": [ "4e17c12963f4bee0e6ec90da54804894", "4e17c12963f4bee0e6ec90da5480512f", "4e17c12963f4bee0e6ec90da54805c25", "4e17c12963f4bee0e6ec90da54806ba1", "4e17c12963f4bee0e6ec90da548072b3", "4e17c12963f4bee0e6ec90da54807609", "4e17c12963f4bee0e6ec90da54807718", "4e17c12963f4bee0e6ec90da54807754", "4e17c12963f4bee0e6ec90da54807e5d", "4e17c12963f4bee0e6ec90da54808d28" ] } - ``utc_random``: The time since Jan 1, 1970 UTC, in microseconds. The first 14 characters are the time in hex. The last 18 are random. .. code-block:: javascript { "uuids": [ "04dd32b3af699659b6db9486a9c58c62", "04dd32b3af69bb1c2ac7ebfee0a50d88", "04dd32b3af69d8591b99a8e86a76e0fb", "04dd32b3af69f4a18a76efd89867f4f4", "04dd32b3af6a1f7925001274bbfde952", "04dd32b3af6a3fe8ea9b120ed906a57f", "04dd32b3af6a5b5c518809d3d4b76654", "04dd32b3af6a78f6ab32f1e928593c73", "04dd32b3af6a99916c665d6bbf857475", "04dd32b3af6ab558dd3f2c0afacb7d66" ] } - ``utc_id``: The time since Jan 1, 1970 UTC, in microseconds, plus the ``utc_id_suffix`` string. The first 14 characters are the time in hex. The :option:`uuids/utc_id_suffix` string value is appended to these. .. code-block:: javascript { "uuids": [ "04dd32bd5eabcc@mycouch", "04dd32bd5eabee@mycouch", "04dd32bd5eac05@mycouch", "04dd32bd5eac28@mycouch", "04dd32bd5eac43@mycouch", "04dd32bd5eac58@mycouch", "04dd32bd5eac6e@mycouch", "04dd32bd5eac84@mycouch", "04dd32bd5eac98@mycouch", "04dd32bd5eacad@mycouch" ] } .. note:: **Impact of UUID choices:** the choice of UUID has a significant impact on the layout of the B-tree, prior to compaction. For example, using a sequential UUID algorithm while uploading a large batch of documents will avoid the need to rewrite many intermediate B-tree nodes. A random UUID algorithm may require rewriting intermediate nodes on a regular basis, resulting in significantly decreased throughput and wasted disk space space due to the append-only B-tree design. It is generally recommended to set your own UUIDs, or use the sequential algorithm unless you have a specific need and take into account the likely need for compaction to re-balance the B-tree and reclaim wasted space. .. config:option:: utc_id_suffix :: UTC ID Suffix .. versionadded:: 1.3 The ``utc_id_suffix`` value will be appended to UUIDs generated by the ``utc_id`` algorithm. Replicating instances should have unique ``utc_id_suffix`` values to ensure uniqueness of ``utc_id`` ids. :: [uuid] utc_id_suffix = my-awesome-suffix .. config:option:: max_count :: Per-Request UUID Limit .. versionadded:: 1.5.1 No more than this number of UUIDs will be sent in a single request. If more UUIDs are requested, an HTTP error response will be thrown. :: [uuid] max_count = 1000 .. _config/vendor: Vendor information ================== .. config:section:: vendor :: Vendor information .. versionadded:: 1.3 CouchDB distributors have the option of customizing CouchDB's welcome message. This is returned when requesting ``GET /``. :: [vendor] name = The Apache Software Foundation version = 1.5.0 ���������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������apache-couchdb-1.6.0/share/doc/src/config/services.rst����������������������������������������������0000644�0001750�0000144�00000006301�12332105522�022576� 0����������������������������������������������������������������������������������������������������ustar�00djc�����������������������������users���������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������.. Licensed under the Apache License, Version 2.0 (the "License"); you may not .. use this file except in compliance with the License. You may obtain a copy of .. the License at .. .. http://www.apache.org/licenses/LICENSE-2.0 .. .. Unless required by applicable law or agreed to in writing, software .. distributed under the License is distributed on an "AS IS" BASIS, WITHOUT .. WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the .. License for the specific language governing permissions and limitations under .. the License. .. highlight:: ini ========================= CouchDB Internal Services ========================= .. _config/daemons: CouchDB Daemonized Mini Apps ============================ .. config:section:: daemons :: CouchDB Daemonized Mini Apps .. config:option:: auth_cache This daemon provides authentication caching to avoid repeated opening and closing of the `_users` database for each request requiring authentication:: [daemons] auth_cache={couch_auth_cache, start_link, []} .. config:option:: compaction_daemon :ref:`Automatic compaction <config/compactions>` daemon:: [daemons] compaction_daemon={couch_compaction_daemon, start_link, []} .. config:option:: external_manager `External` processes manager:: [daemons] external_manager={couch_external_manager, start_link, []} .. config:option:: httpd HTTP server daemon:: [daemons] httpd={couch_httpd, start_link, []} .. config:option:: httpsd Provides :ref:`SSL support <config/ssl>`. The default ssl port CouchDB listens on is `6984`:: [daemons] httpsd = {couch_httpd, start_link, [https]} .. config:option:: index_server The `couch_index` application is responsible for managing all of the different types of indexers. This manages the process handling for keeping track of the index state as well as managing the updater and compactor handling:: [daemons] index_server={couch_index_server, start_link, []} .. config:option:: os_daemons :ref:`OS Daemons <config/os_daemons>` manager:: [daemons] os_daemons={couch_os_daemons, start_link, []} .. config:option:: query_servers :ref:`Query servers <config/query_servers>` manager:: [daemons] query_servers={couch_query_servers, start_link, []} .. config:option:: replicator_manager Replications manager:: [daemons] replicator_manager={couch_replicator_manager, start_link, []} .. config:option:: stats_aggregator Runtime statistics aggregator:: [daemons] stats_aggregator={couch_stats_aggregator, start, []} .. config:option:: stats_collector Runtime statistics collector:: [daemons] stats_collector={couch_stats_collector, start, []} .. config:option:: uuids :ref:`UUIDs <config/uuids>` generator daemon:: [daemons] uuids={couch_uuids, start, []} .. config:option:: vhosts :ref:`Virtual hosts <config/vhosts>` manager. Provides dynamic add of vhosts without restart, wildcards support and dynamic routing via pattern matching :: [daemons] vhosts={couch_httpd_vhost, start_link, []} �������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������apache-couchdb-1.6.0/share/doc/src/config/proxying.rst����������������������������������������������0000644�0001750�0000144�00000006070�12332105522�022635� 0����������������������������������������������������������������������������������������������������ustar�00djc�����������������������������users���������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������.. Licensed under the Apache License, Version 2.0 (the "License"); you may not .. use this file except in compliance with the License. You may obtain a copy of .. the License at .. .. http://www.apache.org/licenses/LICENSE-2.0 .. .. Unless required by applicable law or agreed to in writing, software .. distributed under the License is distributed on an "AS IS" BASIS, WITHOUT .. WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the .. License for the specific language governing permissions and limitations under .. the License. .. highlight:: ini .. _config/proxy: ====================== Proxying Configuration ====================== .. _http-proxying: .. _config/proxy/couchdb: CouchDB As Proxy ================ The HTTP proxy feature makes it easy to map and redirect different content through your CouchDB URL. The proxy works by mapping a pathname and passing all content after that prefix through to the configured proxy address. Configuration of the proxy redirect is handled through the ``[httpd_global_handlers]`` section of the CouchDB configuration file (typically ``local.ini``). The format is:: [httpd_global_handlers] PREFIX = {couch_httpd_proxy, handle_proxy_req, <<"DESTINATION">>} Where: - ``PREFIX`` Is the string that will be matched. The string can be any valid qualifier, although to ensure that existing database names are not overridden by a proxy configuration, you can use an underscore prefix. - ``DESTINATION`` The fully-qualified URL to which the request should be sent. The destination must include the ``http`` prefix. The content is used verbatim in the original request, so you can also forward to servers on different ports and to specific paths on the target host. The proxy process then translates requests of the form: .. code-block:: text http://couchdb:5984/PREFIX/path To: .. code-block:: text DESTINATION/path .. note:: Everything after ``PREFIX`` including the required forward slash will be appended to the ``DESTINATION``. The response is then communicated back to the original client. For example, the following configuration:: [httpd_global_handlers] _google = {couch_httpd_proxy, handle_proxy_req, <<"http://www.google.com">>} Would forward all requests for ``http://couchdb:5984/_google`` to the Google website. The service can also be used to forward to related CouchDB services, such as `Lucene`:: [httpd_global_handlers] _fti = {couch_httpd_proxy, handle_proxy_req, <<"http://127.0.0.1:5985">>} .. note:: The proxy service is basic. If the request is not identified by the ``DESTINATION``, or the remainder of the ``PATH`` specification is incomplete, the original request URL is interpreted as if the ``PREFIX`` component of that URL does not exist. For example, requesting ``http://couchdb:5984/_intranet/media`` when ``/media`` on the proxy destination does not exist, will cause the request URL to be interpreted as ``http://couchdb:5984/media``. Care should be taken to ensure that both requested URLs and destination URLs are able to cope. ������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������apache-couchdb-1.6.0/share/doc/src/config/couchdb.rst�����������������������������������������������0000644�0001750�0000144�00000014271�12332105522�022367� 0����������������������������������������������������������������������������������������������������ustar�00djc�����������������������������users���������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������.. Licensed under the Apache License, Version 2.0 (the "License"); you may not .. use this file except in compliance with the License. You may obtain a copy of .. the License at .. .. http://www.apache.org/licenses/LICENSE-2.0 .. .. Unless required by applicable law or agreed to in writing, software .. distributed under the License is distributed on an "AS IS" BASIS, WITHOUT .. WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the .. License for the specific language governing permissions and limitations under .. the License. .. default-domain:: config .. highlight:: ini ================== Base Configuration ================== .. _config/couchdb: Base CouchDB Options ==================== .. config:section:: couchdb :: Base CouchDB Options .. config:option:: attachment_stream_buffer_size :: Attachment streaming buffer Higher values may result in better read performance due to fewer read operations and/or more OS page cache hits. However, they can also increase overall response time for writes when there are many attachment write requests in parallel. :: [couchdb] attachment_stream_buffer_size = 4096 .. config:option:: database_dir :: Databases location directory Specifies location of CouchDB database files (``*.couch`` named). This location should be writable and readable for the user the CouchDB service runs as (``couchdb`` by default). :: [couchdb] database_dir = /var/lib/couchdb .. config:option:: delayed_commits :: Delayed commits When this config value as ``false`` the CouchDB provides guaranty of `fsync` call before return :http:statuscode:`201` response on each document saving. Setting this config value as ``true`` may raise some overall performance with cost of losing durability - it's strongly not recommended to do such in production:: [couchdb] delayed_commits = false .. warning:: Delayed commits are a feature of CouchDB that allows it to achieve better write performance for some workloads while sacrificing a small amount of durability. The setting causes CouchDB to wait up to a full second before committing new data after an update. If the server crashes before the header is written then any writes since the last commit are lost. .. config:option:: file_compression :: Compression method for documents .. versionchanged:: 1.2 Added `Google Snappy`_ compression algorithm. Method used to compress everything that is appended to database and view index files, except for attachments (see the :section:`attachments` section). Available methods are: * ``none``: no compression * ``snappy``: use Google Snappy, a very fast compressor/decompressor * ``deflate_N``: use zlib's deflate; ``N`` is the compression level which ranges from ``1`` (fastest, lowest compression ratio) to ``9`` (slowest, highest compression ratio) :: [couchdb] file_compression = snappy .. _Google Snappy: http://code.google.com/p/snappy/ .. config:option:: fsync_options :: Fsync options Specifies when to make `fsync` calls. `fsync` makes sure that the contents of any file system buffers kept by the operating system are flushed to disk. There is generally no need to modify this parameter. :: [couchdb] fsync_options = [before_header, after_header, on_file_open] .. config:option:: max_dbs_open :: Limit of simultaneously opened databases This option places an upper bound on the number of databases that can be open at once. CouchDB reference counts database accesses internally and will close idle databases as needed. Sometimes it is necessary to keep more than the default open at once, such as in deployments where many databases will be replicating continuously. :: [couchdb] max_dbs_open = 100 .. config:option:: max_document_size :: Maximum document size .. versionchanged:: 1.3 This option now actually works. Defines a maximum size for JSON documents, in bytes. This limit does not apply to attachments, since they are transferred as a stream of chunks. If you set this to a small value, you might be unable to modify configuration options, database security and other larger documents until a larger value is restored by editing the configuration file. :: [couchdb] max_document_size = 4294967296 ; 4 GB .. config:option:: os_process_timeout :: External processes time limit If an external process, such as a query server or external process, runs for this amount of microseconds without returning any results, it will be terminated. Keeping this value smaller ensures you get expedient errors, but you may want to tweak it for your specific needs. :: [couchdb] os_process_timeout = 5000 ; 5 sec .. config:option:: uri_file :: Discovery CouchDB help file This file contains the full `URI`_ that can be used to access this instance of CouchDB. It is used to help discover the port CouchDB is running on (if it was set to ``0`` (e.g. automatically assigned any free one). This file should be writable and readable for the user that runs the CouchDB service (``couchdb`` by default). :: [couchdb] uri_file = /var/run/couchdb/couchdb.uri .. _URI: http://en.wikipedia.org/wiki/URI .. config:option:: util_driver_dir :: CouchDB binary utility drivers Specifies location of binary drivers (`icu`, `ejson`, etc.). This location and its contents should be readable for the user that runs the CouchDB service. :: [couchdb] util_driver_dir = /usr/lib/couchdb/erlang/lib/couch-1.5.0/priv/lib .. config:option:: uuid :: CouchDB server UUID .. versionadded:: 1.3 Unique identifier for this CouchDB server instance. :: [couchdb] uuid = 0a959b9b8227188afc2ac26ccdf345a6 .. config:option:: view_index_dir :: View indexes location directory Specifies location of CouchDB view index files. This location should be writable and readable for the user that runs the CouchDB service (``couchdb`` by default). :: [couchdb] view_index_dir = /var/lib/couchdb ���������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������apache-couchdb-1.6.0/share/doc/src/config/replicator.rst��������������������������������������������0000644�0001750�0000144�00000011235�12332105522�023121� 0����������������������������������������������������������������������������������������������������ustar�00djc�����������������������������users���������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������.. Licensed under the Apache License, Version 2.0 (the "License"); you may not .. use this file except in compliance with the License. You may obtain a copy of .. the License at .. .. http://www.apache.org/licenses/LICENSE-2.0 .. .. Unless required by applicable law or agreed to in writing, software .. distributed under the License is distributed on an "AS IS" BASIS, WITHOUT .. WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the .. License for the specific language governing permissions and limitations under .. the License. .. highlight:: ini ========== Replicator ========== .. _config/replicator: Replicator Database Configuration ================================= .. config:section:: replicator :: Replicator Database Configuration .. versionadded:: 1.2 .. config:option:: db Specifies replicator database name:: [replicator] db = _replicator .. config:option:: max_replication_retry_count Maximum replication retry count can be a non-negative integer or "infinity" :: [replicator] max_replication_retry_count = 10 .. config:option:: worker_batch_size With lower batch sizes checkpoints are done more frequently. Lower batch sizes also reduce the total amount of used RAM memory:: [replicator] worker_batch_size = 500 .. config:option:: worker_processes More worker processes can give higher network throughput but can also imply more disk and network IO:: [replicator] worker_processes = 4 .. config:option:: http_connections Maximum number of HTTP connections per replication:: [replicator] http_connections = 20 .. config:option:: connection_timeout HTTP connection timeout per replication. Even for very fast/reliable networks it might need to be increased if a remote database is too busy:: [replicator] connection_timeout = 30000 .. config:option:: retries_per_request If a request fails, the replicator will retry it up to N times:: [replicator] retries_per_request = 10 .. config:option:: socket_options Some socket options that might boost performance in some scenarios: - ``{nodelay, boolean()}`` - ``{sndbuf, integer()}`` - ``{recbuf, integer()}`` - ``{priority, integer()}`` See the `inet`_ Erlang module's man page for the full list of options:: [replicator] socket_options = [{keepalive, true}, {nodelay, false}] .. _inet: http://www.erlang.org/doc/man/inet.html#setopts-2 .. config:option:: checkpoint_interval .. versionadded:: 1.6 Defines replication checkpoint interval in milliseconds. :ref:`Replicator <replicator>` will :get:`requests </{db}>` from the Source database at the specified interval:: [replicator] checkpoint_interval = 5000 Lower intervals may be useful for frequently changing data, while higher values will lower bandwidth and make fewer requests for infrequently updated databases. .. config:option:: use_checkpoints .. versionadded:: 1.6 If ``use_checkpoints`` is set to ``true``, CouchDB will make checkpoints during replication and at the completion of replication. CouchDB can efficiently resume replication from any of these checkpoints:: [replicator] use_checkpoints = true .. note:: Checkpoints are stored in :ref:`local documents <api/local>` on both the source and target databases (which requires write access). .. warning:: Disabling checkpoints is **not recommended** as CouchDB will scan the Source database's changes feed from the beginning. .. config:option:: cert_file Path to a file containing the user's certificate:: [replicator] cert_file = /full/path/to/server_cert.pem .. config:option:: key_file Path to file containing user's private PEM encoded key:: [replicator] key_file = /full/path/to/server_key.pem .. config:option:: password String containing the user's password. Only used if the private keyfile is password protected:: [replicator] password = somepassword .. config:option:: verify_ssl_certificates Set to true to validate peer certificates:: [replicator] verify_ssl_certificates = false .. config:option:: ssl_trusted_certificates_file File containing a list of peer trusted certificates (in the PEM format):: [replicator] ssl_trusted_certificates_file = /etc/ssl/certs/ca-certificates.crt .. config:option:: ssl_certificate_max_depth Maximum peer certificate depth (must be set even if certificate validation is off):: [replicator] ssl_certificate_max_depth = 3 �������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������apache-couchdb-1.6.0/share/doc/src/config/externals.rst���������������������������������������������0000644�0001750�0000144�00000012541�12332105522�022763� 0����������������������������������������������������������������������������������������������������ustar�00djc�����������������������������users���������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������.. Licensed under the Apache License, Version 2.0 (the "License"); you may not .. use this file except in compliance with the License. You may obtain a copy of .. the License at .. .. http://www.apache.org/licenses/LICENSE-2.0 .. .. Unless required by applicable law or agreed to in writing, software .. distributed under the License is distributed on an "AS IS" BASIS, WITHOUT .. WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the .. License for the specific language governing permissions and limitations under .. the License. .. default-domain:: config .. highlight:: ini ================== External Processes ================== .. _config/os_daemons: OS Daemons ========== .. config:section:: os_daemons :: OS Daemons This is a simple feature that allows users to configure CouchDB so that it maintains a given OS level process alive. If the process dies for any reason, CouchDB will restart it. If the process restarts too often, then CouchDB will mark it has halted and not attempt to restart it. The default max restart rate is ``3`` times in the last ``5`` seconds. These parameters are :section:`adjustable <os_daemon_settings>`. Commands that are started in this manner will have access to a simple API over stdio to request configuration parameters or to add log statements to CouchDB's logs. To configure an OS process as a CouchDB os_daemon, create a section in your `local.ini` like such:: [os_daemons] daemon_name = /path/to/command -with args This will make CouchDB bring up the command and attempt to keep it alive. To request a configuration parameter, an `os_daemon` can write a simple JSON message to stdout like such:: ["get", "os_daemons"]\n which would return:: {"daemon_name": "/path/to/command -with args"}\n Or:: ["get", "os_daemons", "daemon_name"]\n which would return:: "/path/to/command -with args"\n There's no restriction on what configuration variables are visible. There's also no method for altering the configuration. If you would like your OS daemon to be restarted in the event that the configuration changes, you can send the following messages:: ["register", $(SECTION)]\n When anything in that section changes, your OS process will be rebooted so it can pick up the new configuration settings. If you want to listen for changes on a specific key, you can send something like:: ["register", $(SECTION), $(KEY)]\n In this case, CouchDB will only restart your daemon if that exact section/key pair changes, instead of anything in that entire section. Logging commands look like:: ["log", $(JSON_MESSAGE)]\n Where ``$(JSON_MESSAGE)`` is arbitrary JSON data. These messages are logged at the 'info' level. If you want to log at a different level you can pass messages like such:: ["log", $(JSON_MESSAGE), {"level": $(LEVEL)}]\n Where ``$(LEVEL)`` is one of "debug", "info", or "error". When implementing a daemon process to be managed by CouchDB you should remember to use a method like checking the parent process id or if stdin has been closed. These flags can tell you if your daemon process has been orphaned so you can exit cleanly. There is no interactivity between CouchDB and the running process, but you can use the OS Daemons service to create new HTTP servers and responders and then use the new proxy service to redirect requests and output to the CouchDB managed service. For more information on proxying, see :ref:`http-proxying`. For further background on the OS Daemon service, see :ref:`externals`. .. _config/os_daemon_settings: OS Daemons settings =================== .. config:section:: os_daemon_settings :: OS Daemons settings .. config:option:: max_retries :: Maximum restart retries Specifies maximum attempts to run :section:`os_daemons` before mark them halted:: [os_daemon_settings] max_retries = 3 .. config:option:: retry_time :: Delay between restart attempts Delay in seconds between :section:`os_daemons` restarts:: [os_daemon_settings] retry_time = 5 .. _update-notifications: .. _config/update_notification: Update notifications ==================== .. config:section:: update_notification :: Update notifications CouchDB is able to spawn OS processes to notify them about recent databases updates. The notifications are in form of JSON messages sent as a line of text, terminated by ``CR`` (``\n``) character, to the OS processes through `stdout`:: [update_notification] ;unique notifier name=/full/path/to/exe -with "cmd line arg" index_updater = ruby /usr/local/bin/index_updater.rb The update notification messages are depend upon of event type: - **Database created**: .. code-block:: javascript {"type":"created","db":"dbname"} - **Database updated**: this event raises when any document gets updated for specified database: .. code-block:: javascript {"type":"updated","db":"dbname"} - **Design document updated**: for design document updates there is special event raised in additional to regular db update one: .. code-block:: javascript {"type":"ddoc_updated","db":"dbname","id":"_design/ddoc_name"} - **Database deleted**: .. code-block:: javascript {"type":"deleted","db":"dbname"} .. note:: New line (``\n``) trailing character was removed from examples. ���������������������������������������������������������������������������������������������������������������������������������������������������������������apache-couchdb-1.6.0/share/doc/src/config/logging.rst�����������������������������������������������0000644�0001750�0000144�00000005033�12332105522�022402� 0����������������������������������������������������������������������������������������������������ustar�00djc�����������������������������users���������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������.. Licensed under the Apache License, Version 2.0 (the "License"); you may not .. use this file except in compliance with the License. You may obtain a copy of .. the License at .. .. http://www.apache.org/licenses/LICENSE-2.0 .. .. Unless required by applicable law or agreed to in writing, software .. distributed under the License is distributed on an "AS IS" BASIS, WITHOUT .. WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the .. License for the specific language governing permissions and limitations under .. the License. .. default-domain:: config .. highlight:: ini ======= Logging ======= .. _config/log: Logging options ================ .. config:section:: log :: Logging options CouchDB logging configuration. .. config:option:: file :: Logging file path Specifies the location of file for logging output:: [log] file = /var/log/couchdb/couch.log This path should be readable and writable for user that runs CouchDB service (`couchdb` by default). .. config:option:: level :: Logging verbose level .. versionchanged:: 1.3: Added ``warning`` level. Logging level defines how verbose and detailed logging will be:: [log] level = info Available levels: - ``debug``: Very informative and detailed debug logging. Includes HTTP headers, external processes communications, authorization information and more; - ``info``: Informative logging. Includes HTTP requests headlines, startup of an external processes etc. - ``warning``: Warning messages are alerts about edge situations that may lead to errors. For instance, compaction daemon alerts about low or insufficient disk space at this level. - ``error``: Error level includes only things that going wrong, crush reports and HTTP error responses (5xx codes). - ``none``: Disables logging any messages. .. config:option:: include_sasl Includes `SASL`_ information in logs:: [log] include_sasl = true .. _SASL: http://www.erlang.org/doc/apps/sasl/ .. _config/log_level_by_module: Per module logging ================== .. config:section:: log_level_by_module :: Per module logging .. versionadded:: 1.3 In this section you can specify :option:`log level <log/level>` on a per-module basis:: [log_level_by_module] couch_httpd = debug couch_replicator = info couch_query_servers = error See `src/*/*.erl`_ for available modules. .. _src/*/*.erl: https://git-wip-us.apache.org/repos/asf?p=couchdb.git;a=tree;f=src;hb=HEAD �����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������apache-couchdb-1.6.0/share/doc/src/query-server/����������������������������������������������������0000755�0001750�0000144�00000000000�12332106072�021426� 5����������������������������������������������������������������������������������������������������ustar�00djc�����������������������������users���������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������apache-couchdb-1.6.0/share/doc/src/query-server/protocol.rst����������������������������������������0000644�0001750�0000144�00000061344�12332105522�024030� 0����������������������������������������������������������������������������������������������������ustar�00djc�����������������������������users���������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������.. Licensed under the Apache License, Version 2.0 (the "License"); you may not .. use this file except in compliance with the License. You may obtain a copy of .. the License at .. .. http://www.apache.org/licenses/LICENSE-2.0 .. .. Unless required by applicable law or agreed to in writing, software .. distributed under the License is distributed on an "AS IS" BASIS, WITHOUT .. WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the .. License for the specific language governing permissions and limitations under .. the License. .. _query-server/protocol: ===================== Query Server Protocol ===================== The `Query Server` is an external process that communicates with CouchDB via a JSON protocol over stdio and processes all design functions calls: `views`, `shows`, `lists`, `filters`, `updates` and `validate_doc_update`. CouchDB communicates with the Query Server process though stdio interface by JSON messages that terminated by newline character. Messages that are sent to the Query Server are always `array`-typed that could be matched by the pattern ``[<command>, <*arguments>]\n``. .. note:: To simplify examples reading we omitted trailing ``\n`` character to let Sphinx highlight them well. Also, all examples contain formatted JSON values while real data transfers in compact mode without formatting spaces. .. _qs/reset: ``reset`` ========= :Command: ``reset`` :Arguments: :ref:`Query server state <config/query_server_config>` (optional) :Returns: ``true`` This resets the state of the Query Server and makes it forget all previous input. If applicable, this is the point to run garbage collection. CouchDB sends:: ["reset"] The Query Server answers:: true To set up new Query Server state the second argument is used with object data. This argument is used CouchDB sends:: ["reset", {"reduce_limit": true, "timeout": 5000}] The Query Server answers:: true .. _qs/add_lib: ``add_lib`` =========== :Command: ``add_lib`` :Arguments: CommonJS library object by ``views/lib`` path :Returns: ``true`` Adds :ref:`CommonJS <commonjs>` library to Query Server state for further usage in `map` functions. CouchDB sends:: [ "add_lib", { "utils": "exports.MAGIC = 42;" } ] The Query Server answers:: true .. note:: This library shouldn't have any side effects nor track its own state or you'll have a lot of happy debugging time if something went wrong. Remember that a complete index rebuild is a heavy operation and this is the only way to fix your mistakes with shared state. .. _qs/add_fun: ``add_fun`` ----------- :Command: ``add_fun`` :Arguments: Map function source code. :Returns: ``true`` When creating or updating a view the Query Server gets sent the view function for evaluation. The Query Server should parse, compile and evaluate the function it receives to make it callable later. If this fails, the Query Server returns an error. CouchDB might store several functions before sending in any actual documents. CouchDB sends:: [ "add_fun", "function(doc) { if(doc.score > 50) emit(null, {'player_name': doc.name}); }" ] The Query Server answers:: true .. _qs/map_doc: ``map_doc`` =========== :Command: ``map_doc`` :Arguments: Document object :Returns: Array of key-value pairs per applied :ref:`function <qs/add_fun>` When the view function is stored in the Query Server, CouchDB starts sending in all the documents in the database, one at a time. The Query Server calls the previously stored functions one after another with a document and stores its result. When all functions have been called, the result is returned as a JSON string. CouchDB sends:: [ "map_doc", { "_id": "8877AFF9789988EE", "_rev": "3-235256484", "name": "John Smith", "score": 60 } ] If the function above is the only function stored, the Query Server answers:: [ [ [null, {"player_name": "John Smith"}] ] ] That is, an array with the result for every function for the given document. If a document is to be excluded from the view, the array should be empty. CouchDB sends:: [ "map_doc", { "_id": "9590AEB4585637FE", "_rev": "1-674684684", "name": "Jane Parker", "score": 43 } ] The Query Server answers:: [[]] .. _qs/reduce: ``reduce`` ========== :Command: ``reduce`` :Arguments: - Reduce function source - Array of :ref:`map function <mapfun>` results where each item represented in format ``[[key, id-of-doc], value]`` :Returns: Array with pair values: ``true`` and another array with reduced result If the view has a reduce function defined, CouchDB will enter into the reduce phase. The view server will receive a list of reduce functions and some map results on which it can apply them. CouchDB sends:: [ "reduce", [ "function(k, v) { return sum(v); }" ], [ [[1, "699b524273605d5d3e9d4fd0ff2cb272"], 10], [[2, "c081d0f69c13d2ce2050d684c7ba2843"], 20], [[null, "foobar"], 3] ] ] The Query Server answers:: [ true, [33] ] Note that even though the view server receives the map results in the form ``[[key, id-of-doc], value]``, the function may receive them in a different form. For example, the JavaScript Query Server applies functions on the list of keys and the list of values. .. _qs/rereduce: ``rereduce`` ============ :Command: ``rereduce`` :Arguments: List of values. When building a view, CouchDB will apply the reduce step directly to the output of the map step and the rereduce step to the output of a previous reduce step. CouchDB will send a list of values, with no keys or document ids, to the rereduce step. CouchDB sends:: [ "rereduce", [ "function(k, v, r) { return sum(v); }" ], [ 33, 55, 66 ] ] The Query Server answers:: [ true, [154] ] .. _qs/ddoc: ``ddoc`` ======== :Command: ``ddoc`` :Arguments: Array of objects. - First phase (ddoc initialization): - ``"new"`` - Design document ``_id`` - Design document object - Second phase (design function execution): - Design document ``_id`` - Function path as an array of object keys - Array of function arguments :Returns: - First phase (ddoc initialization): ``true`` - Second phase (design function execution): custom object depending on executed function This command acts in two phases: `ddoc` registration and `design function` execution. In the first phase CouchDB sends a full design document content to the Query Server to let it cache it by ``_id`` value for further function execution. To do this, CouchDB sends:: [ "ddoc", "new", "_design/temp", { "_id": "_design/temp", "_rev": "8-d7379de23a751dc2a19e5638a7bbc5cc", "language": "javascript", "shows": { "request": "function(doc,req){ return {json: req}; }", "hello": "function(doc,req){ return {body: 'Hello, ' + (doc || {})._id + '!'}; }" } } ] The Query Server answers:: true After than this design document is ready to serve next subcommands - that's the second phase. .. note:: Each ``ddoc`` subcommand is the root design document key, so they are not actually subcommands, but first elements of the JSON path that may be handled and processed. The pattern for subcommand execution is common: ``["ddoc", <design_doc_id>, [<subcommand>, <funcname>], [<argument1>, <argument2>, ...]]`` .. _qs/ddoc/shows: ``shows`` --------- :Command: ``ddoc`` :SubCommand: ``shows`` :Arguments: - Document object or ``null`` if document `id` wasn't specified in request - :ref:`request_object` :Returns: Array with two elements: - ``"resp"`` - :ref:`response_object` Executes :ref:`show function <showfun>`. Couchdb sends:: [ "ddoc", "_design/temp", [ "shows", "doc" ], [ null, { "info": { "db_name": "test", "doc_count": 8, "doc_del_count": 0, "update_seq": 105, "purge_seq": 0, "compact_running": false, "disk_size": 15818856, "data_size": 1535048, "instance_start_time": "1359952188595857", "disk_format_version": 6, "committed_update_seq": 105 }, "id": null, "uuid": "169cb4cc82427cc7322cb4463d0021bb", "method": "GET", "requested_path": [ "api", "_design", "temp", "_show", "request" ], "path": [ "api", "_design", "temp", "_show", "request" ], "raw_path": "/api/_design/temp/_show/request", "query": {}, "headers": { "Accept": "*/*", "Host": "localhost:5984", "User-Agent": "curl/7.26.0" }, "body": "undefined", "peer": "127.0.0.1", "form": {}, "cookie": {}, "userCtx": { "db": "api", "name": null, "roles": [ "_admin" ] }, "secObj": {} } ] ] The Query Server sends:: [ "resp", { "body": "Hello, undefined!" } ] .. _qs/ddoc/lists: ``lists`` --------- :Command: ``ddoc`` :SubCommand: ``lists`` :Arguments: - :ref:`view_head_info_object`: - :ref:`request_object` :Returns: Array. See below for details. Executes :ref:`list function <listfun>`. The communication protocol for `list` functions is a bit complex so let's use an example for illustration. Let's assume that we have view a function that emits `id-rev` pairs:: function(doc) { emit(doc._id, doc._rev); } And we'd like to emulate ``_all_docs`` JSON response with list function. Our *first* version of the list functions looks like this:: function(head, req){ start({'headers': {'Content-Type': 'application/json'}}); var resp = head; var rows = []; while(row=getRow()){ rows.push(row); } resp.rows = rows; return toJSON(resp); } The whole communication session during list function execution could be divided on three parts: #. Initialization The first returned object from list function is an array of next structure:: ["start", <chunks>, <headers>] Where ``<chunks>`` is an array of text chunks that will be sent to client and ``<headers>`` is an object with response HTTP headers. This message is sent from the Query Server to CouchDB on the :js:func:`start` call which initialize HTTP response to the client:: [ "start", [], { "headers": { "Content-Type": "application/json" } } ] After this, the list function may start to process view rows. #. View Processing Since view results can be extremely large, it is not wise to pass all its rows in a single command. Instead, CouchDB can send view rows one by one to the Query Server allowing processing view and output generation in a streaming way. CouchDB sends a special array that carries view row data:: [ "list_row", { "id": "0cb42c267fe32d4b56b3500bc503e030", "key": "0cb42c267fe32d4b56b3500bc503e030", "value": "1-967a00dff5e02add41819138abb3284d" } ] If Query Server has something to return on this, it returns an array with a ``"chunks"`` item in the head and an array of data in the tail. Now, for our case it has nothing to return, so the response will be:: [ "chunks", [] ] When there is no more view rows to process, CouchDB sends special message, that signs about that there is no more data to send from its side:: ["list_end"] #. Finalization The last stage of the communication process is the returning *list tail*: the last data chunk. After this, processing list function will be completed and client will receive complete response. For our example the last message will be the next:: [ "end", [ "{\"total_rows\":2,\"offset\":0,\"rows\":[{\"id\":\"0cb42c267fe32d4b56b3500bc503e030\",\"key\":\"0cb42c267fe32d4b56b3500bc503e030\",\"value\":\"1-967a00dff5e02add41819138abb3284d\"},{\"id\":\"431926a69504bde41851eb3c18a27b1f\",\"key\":\"431926a69504bde41851eb3c18a27b1f\",\"value\":\"1-967a00dff5e02add41819138abb3284d\"}]}" ] ] There, we had made a big mistake: we had returned out result in a single message from the Query Server. That's ok when there are only a few rows in the view result, but it's not acceptable for millions documents and millions view rows Let's fix our list function and see the changes in communication:: function(head, req){ start({'headers': {'Content-Type': 'application/json'}}); send('{'); send('"total_rows":' + toJSON(head.total_rows) + ','); send('"offset":' + toJSON(head.offset) + ','); send('"rows":['); if (row=getRow()){ send(toJSON(row)); } while(row=getRow()){ send(',' + toJSON(row)); } send(']'); return '}'; } "Wait, what?" - you'd like to ask. Yes, we'd build JSON response manually by string chunks, but let's take a look on logs:: [Wed, 24 Jul 2013 05:45:30 GMT] [debug] [<0.19191.1>] OS Process #Port<0.4444> Output :: ["start",["{","\"total_rows\":2,","\"offset\":0,","\"rows\":["],{"headers":{"Content-Type":"application/json"}}] [Wed, 24 Jul 2013 05:45:30 GMT] [info] [<0.18963.1>] 127.0.0.1 - - GET /blog/_design/post/_list/index/all_docs 200 [Wed, 24 Jul 2013 05:45:30 GMT] [debug] [<0.19191.1>] OS Process #Port<0.4444> Input :: ["list_row",{"id":"0cb42c267fe32d4b56b3500bc503e030","key":"0cb42c267fe32d4b56b3500bc503e030","value":"1-967a00dff5e02add41819138abb3284d"}] [Wed, 24 Jul 2013 05:45:30 GMT] [debug] [<0.19191.1>] OS Process #Port<0.4444> Output :: ["chunks",["{\"id\":\"0cb42c267fe32d4b56b3500bc503e030\",\"key\":\"0cb42c267fe32d4b56b3500bc503e030\",\"value\":\"1-967a00dff5e02add41819138abb3284d\"}"]] [Wed, 24 Jul 2013 05:45:30 GMT] [debug] [<0.19191.1>] OS Process #Port<0.4444> Input :: ["list_row",{"id":"431926a69504bde41851eb3c18a27b1f","key":"431926a69504bde41851eb3c18a27b1f","value":"1-967a00dff5e02add41819138abb3284d"}] [Wed, 24 Jul 2013 05:45:30 GMT] [debug] [<0.19191.1>] OS Process #Port<0.4444> Output :: ["chunks",[",{\"id\":\"431926a69504bde41851eb3c18a27b1f\",\"key\":\"431926a69504bde41851eb3c18a27b1f\",\"value\":\"1-967a00dff5e02add41819138abb3284d\"}"]] [Wed, 24 Jul 2013 05:45:30 GMT] [debug] [<0.19191.1>] OS Process #Port<0.4444> Input :: ["list_end"] [Wed, 24 Jul 2013 05:45:30 GMT] [debug] [<0.19191.1>] OS Process #Port<0.4444> Output :: ["end",["]","}"]] Note, that now the Query Server sends response by lightweight chunks and if our communication process was extremely slow, the client will see how response data appears on their screen. Chunk by chunk, without waiting for the complete result, like they have for our previous list function. .. _qs/ddoc/updates: ``updates`` ----------- :Command: ``ddoc`` :SubCommand: ``updates`` :Arguments: - Document object or ``null`` if document `id` wasn't specified in request - :ref:`request_object` :Returns: Array with there elements: - ``"up"`` - Document object or ``null`` if nothing should be stored - :ref:`response_object` Executes :ref:`update function <updatefun>`. CouchDB sends:: [ "ddoc", "_design/id", [ "updates", "nothing" ], [ null, { "info": { "db_name": "test", "doc_count": 5, "doc_del_count": 0, "update_seq": 16, "purge_seq": 0, "compact_running": false, "disk_size": 8044648, "data_size": 7979601, "instance_start_time": "1374612186131612", "disk_format_version": 6, "committed_update_seq": 16 }, "id": null, "uuid": "7b695cb34a03df0316c15ab529002e69", "method": "POST", "requested_path": [ "test", "_design", "1139", "_update", "nothing" ], "path": [ "test", "_design", "1139", "_update", "nothing" ], "raw_path": "/test/_design/1139/_update/nothing", "query": {}, "headers": { "Accept": "*/*", "Accept-Encoding": "identity, gzip, deflate, compress", "Content-Length": "0", "Host": "localhost:5984" }, "body": "", "peer": "127.0.0.1", "form": {}, "cookie": {}, "userCtx": { "db": "test", "name": null, "roles": [ "_admin" ] }, "secObj": {} } ] ] The Query Server answers:: [ "up", null, {"body": "document id wasn't provided"} ] or in case of successful update:: [ "up", { "_id": "7b695cb34a03df0316c15ab529002e69", "hello": "world!" }, {"body": "document was updated"} ] .. _qs/ddoc/filters: ``filters`` ----------- :Command: ``ddoc`` :SubCommand: ``filters`` :Arguments: - Array of document objects - :ref:`request_object` :Returns: Array of two elements: - ``true`` - Array of booleans in the same order of input documents. Executes :ref:`filter function <filterfun>`. CouchDB sends:: [ "ddoc", "_design/test", [ "filters", "random" ], [ [ { "_id": "431926a69504bde41851eb3c18a27b1f", "_rev": "1-967a00dff5e02add41819138abb3284d", "_revisions": { "start": 1, "ids": [ "967a00dff5e02add41819138abb3284d" ] } }, { "_id": "0cb42c267fe32d4b56b3500bc503e030", "_rev": "1-967a00dff5e02add41819138abb3284d", "_revisions": { "start": 1, "ids": [ "967a00dff5e02add41819138abb3284d" ] } } ], { "info": { "db_name": "test", "doc_count": 5, "doc_del_count": 0, "update_seq": 19, "purge_seq": 0, "compact_running": false, "disk_size": 8056936, "data_size": 7979745, "instance_start_time": "1374612186131612", "disk_format_version": 6, "committed_update_seq": 19 }, "id": null, "uuid": "7b695cb34a03df0316c15ab529023a81", "method": "GET", "requested_path": [ "test", "_changes?filter=test", "random" ], "path": [ "test", "_changes" ], "raw_path": "/test/_changes?filter=test/random", "query": { "filter": "test/random" }, "headers": { "Accept": "application/json", "Accept-Encoding": "identity, gzip, deflate, compress", "Content-Length": "0", "Content-Type": "application/json; charset=utf-8", "Host": "localhost:5984" }, "body": "", "peer": "127.0.0.1", "form": {}, "cookie": {}, "userCtx": { "db": "test", "name": null, "roles": [ "_admin" ] }, "secObj": {} } ] ] The Query Server answers:: [ true, [ true, false ] ] .. _qs/ddoc/views: ``views`` --------- :Command: ``ddoc`` :SubCommand: ``views`` :Arguments: Array of document objects :Returns: Array of two elements: - ``true`` - Array of booleans in the same order of input documents. .. versionadded:: 1.2 Executes :ref:`view function <viewfilter>` in place of the filter. Acts in the same way as :ref:`qs/ddoc/filters` command. .. _qs/ddoc/validate_doc_update: ``validate_doc_update`` ----------------------- :Command: ``ddoc`` :SubCommand: ``validate_doc_update`` :Arguments: - Document object that will be stored - Document object that will be replaced - :ref:`userctx_object` - :ref:`security_object` :Returns: ``1`` Executes :ref:`validation function <vdufun>`. CouchDB send:: [ "ddoc", "_design/id", ["validate_doc_update"], [ { "_id": "docid", "_rev": "2-e0165f450f6c89dc6b071c075dde3c4d", "score": 10 }, { "_id": "docid", "_rev": "1-9f798c6ad72a406afdbf470b9eea8375", "score": 4 }, { "name": "Mike", "roles": ["player"] }, { "admins": {}, "members": [] } ] ] The Query Server answers:: 1 .. note:: While the only valid response for this command is ``true`` to prevent document save the Query Server need to raise an error: ``forbidden`` or ``unauthorized`` - these errors will be turned into correct ``HTTP 403`` and ``HTTP 401`` responses respectively. .. _qs/errors: Raising errors ============== When something went wrong the Query Server is able to inform CouchDB about such a situation by sending special message in response of received command. Error messages prevent further command execution and return an error description to CouchDB. All errors are logically divided into two groups: - `Common errors`. These errors only break the current Query Server command and return the error info to the CouchDB instance *without* terminating the Query Server process. - `Fatal errors`. The fatal errors signal about something really bad that hurts the overall Query Server process stability and productivity. For instance, if you're using Python Query Server and some design function is unable to import some third party module, it's better to count such error as fatal and terminate whole process or you still have to do the same after import fixing, but manually. .. _qs/error: ``error`` --------- To raise an error, the Query Server have to answer:: ["error", "error_name", "reason why"] The ``"error_name"`` helps to classify problems by their type e.g. if it's ``"value_error"`` so probably user have entered wrong data, ``"not_found"`` notifies about missed resource and ``"type_error"`` definitely says about invalid and non expected input from user. The ``"reason why"`` is the error message that explains why it raised and, if possible, what is needed to do to fix it. For example, calling :ref:`updatefun` against non existent document could produce next error message:: ["error", "not_found", "Update function requires existent document"] .. _qs/error/forbidden: ``forbidden`` ------------- The `forbidden` error is widely used by :ref:`vdufun` to stop further function processing and prevent on disk store of the new document version. Since this error actually is not an error, but an assertion against user actions, CouchDB doesn't log it at `"error"` level, but returns `HTTP 403 Forbidden` response with error information object. To raise this error, the Query Server have to answer:: {"forbidden": "reason why"} .. _qs/error/unauthorized: ``unauthorized`` ---------------- The `unauthorized` error mostly acts like `forbidden` one, but with the meaning of *please authorize first*. This small difference helps end users to understand what they can do to solve the problem. CouchDB doesn't log it at `"error"` level, but returns `HTTP 401 Unauthorized` response with error information object. To raise this error, the Query Server have to answer:: {"unauthorized": "reason why"} .. _qs/log: Logging ======= At any time, the Query Server may send some information that will be saved in CouchDB's log file. This is done by sending a special object with just one field, log, on a separate line:: ["log", "some message"] CouchDB responds nothing, but writes received message into log file:: [Sun, 13 Feb 2009 23:31:30 GMT] [info] [<0.72.0>] Query Server Log Message: some message These messages are only logged at :config:option:`info level <log/level>`. ��������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������apache-couchdb-1.6.0/share/doc/src/query-server/index.rst�������������������������������������������0000644�0001750�0000144�00000002731�12332105522�023271� 0����������������������������������������������������������������������������������������������������ustar�00djc�����������������������������users���������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������.. Licensed under the Apache License, Version 2.0 (the "License"); you may not .. use this file except in compliance with the License. You may obtain a copy of .. the License at .. .. http://www.apache.org/licenses/LICENSE-2.0 .. .. Unless required by applicable law or agreed to in writing, software .. distributed under the License is distributed on an "AS IS" BASIS, WITHOUT .. WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the .. License for the specific language governing permissions and limitations under .. the License. .. _query-server: ============ Query Server ============ The `Query server` is an external process that communicates with CouchDB by JSON protocol through stdio interface and processed all :ref:`design functions <ddocs>` calls: :ref:`views <viewfun>`, :ref:`shows <showfun>`, :ref:`lists <listfun>` and more. The default query server is written in :ref:`JavaScript <query-server/js>`, running via `Mozilla SpiderMonkey`_. You can use other languages by setting a Query server key in the ``language`` property of a design document or the `Content-Type` header of a `temporary view`. Design documents that do not specify a ``language`` property are assumed to be of type `javascript`, as are ad hoc queries that are POSTed to :ref:`_temp_view <api/db/temp_view>` without a `Content-Type` header. .. _Mozilla SpiderMonkey: https://developer.mozilla.org/en/docs/SpiderMonkey .. toctree:: :maxdepth: 2 protocol javascript erlang ���������������������������������������apache-couchdb-1.6.0/share/doc/src/query-server/javascript.rst��������������������������������������0000644�0001750�0000144�00000021674�12332105522�024337� 0����������������������������������������������������������������������������������������������������ustar�00djc�����������������������������users���������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������.. Licensed under the Apache License, Version 2.0 (the "License"); you may not .. use this file except in compliance with the License. You may obtain a copy of .. the License at .. .. http://www.apache.org/licenses/LICENSE-2.0 .. .. Unless required by applicable law or agreed to in writing, software .. distributed under the License is distributed on an "AS IS" BASIS, WITHOUT .. WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the .. License for the specific language governing permissions and limitations under .. the License. .. default-domain:: js .. _query-server/js: JavaScript ========== .. note:: While every design function has access to all JavaScript objects, the table below describes appropriate usage cases. For example, you may use :func:`emit` in :ref:`listfun`, but :func:`getRow` is not permitted during :ref:`mapfun`. +--------------------------------+---------------------------------------------+ | JS Function | Reasonable to use in design doc functions | +================================+=============================================+ | :func:`emit` | :ref:`mapfun` | +--------------------------------+---------------------------------------------+ | :func:`getRow` | :ref:`listfun` | +--------------------------------+---------------------------------------------+ | :data:`JSON` | any | +--------------------------------+---------------------------------------------+ | :func:`isArray` | any | +--------------------------------+---------------------------------------------+ | :func:`log` | any | +--------------------------------+---------------------------------------------+ | :func:`provides` | :ref:`showfun`, :ref:`listfun` | +--------------------------------+---------------------------------------------+ | :func:`registerType` | :ref:`showfun`, :ref:`listfun` | +--------------------------------+---------------------------------------------+ | :func:`require` | any, except :ref:`reducefun` | +--------------------------------+---------------------------------------------+ | :func:`send` | :ref:`listfun` | +--------------------------------+---------------------------------------------+ | :func:`start` | :ref:`listfun` | +--------------------------------+---------------------------------------------+ | :func:`sum` | any | +--------------------------------+---------------------------------------------+ | :func:`toJSON` | any | +--------------------------------+---------------------------------------------+ Design functions context ------------------------ Each design function executes in a special context of predefined objects, modules and functions: .. function:: emit(key, value) Emits a `key`-`value` pair for further processing by CouchDB after the map function is done. :param key: The view key :param value: The `key`'s associated value .. code-block:: javascript function(doc){ emit(doc._id, doc._rev); } .. function:: getRow() Extracts the next row from a related view result. :return: View result row :rtype: object .. code-block:: javascript function(head, req){ send('['); row = getRow(); if (row){ send(toJSON(row)); while(row = getRow()){ send(','); send(toJSON(row)); } } return ']'; } .. data:: JSON `JSON2 <https://git-wip-us.apache.org/repos/asf?p=couchdb.git;a=blob;f=share/server/json2.js>`_ object. .. function:: isArray(obj) A helper function to check if the provided value is an `Array`. :param obj: Any Javascript value :return: ``true`` if `obj` is `Array`-typed, ``false`` otherwise :rtype: boolean .. function:: log(message) Log a message to the CouchDB log (at the `INFO` level). :param message: Message to be logged .. code-block:: javascript function(doc){ log('Procesing doc ' + doc['_id']); emit(doc['_id'], null); } After the map function has run, the following line can be found in CouchDB logs (e.g. at `/var/log/couchdb/couch.log`): .. code-block:: text [Sat, 03 Nov 2012 17:38:02 GMT] [info] [<0.7543.0>] OS Process #Port<0.3289> Log :: Processing doc 8d300b86622d67953d102165dbe99467 .. function:: provides(key, func) Registers callable handler for specified MIME key. :param key: MIME key previously defined by :func:`registerType` :param func: MIME type handler .. function:: registerType(key, *mimes) Registers list of MIME types by associated `key`. :param key: MIME types :param mimes: MIME types enumeration Predefined mappings (`key`-`array`): - **all**: ``*/*`` - **text**: ``text/plain; charset=utf-8``, ``txt`` - **html**: ``text/html; charset=utf-8`` - **xhtml**: ``application/xhtml+xml``, ``xhtml`` - **xml**: ``application/xml``, ``text/xml``, ``application/x-xml`` - **js**: ``text/javascript``, ``application/javascript``, ``application/x-javascript`` - **css**: ``text/css`` - **ics**: ``text/calendar`` - **csv**: ``text/csv`` - **rss**: ``application/rss+xml`` - **atom**: ``application/atom+xml`` - **yaml**: ``application/x-yaml``, ``text/yaml`` - **multipart_form**: ``multipart/form-data`` - **url_encoded_form**: ``application/x-www-form-urlencoded`` - **json**: ``application/json``, ``text/x-json`` .. function:: require(path) Loads CommonJS module by a specified `path`. The path should not start with a slash. :param path: A CommonJS module path started from design document root :return: Exported statements .. function:: send(chunk) Sends a single string `chunk` in response. :param chunk: Text chunk .. code-block:: javascript function(head, req){ send('Hello,'); send(' '); send('Couch'); return ! } .. function:: start(init_resp) Initiates chunked response. As an option, a custom :ref:`response <response_object>` object may be sent at this point. For `list`-functions only! .. note:: list functions may set the `HTTP response code` and `headers` by calling this function. This function must be called before :func:`send`, :func:`getRow` or a `return` statement; otherwise, the query server will implicitly call this function with the empty object (``{}``). .. code-block:: javascript function(head, req){ start({ "code": 302, "headers": { "Location": "http://couchdb.apache.org" } }); return "Relax!"; } .. function:: sum(arr) Sum `arr`'s items. :param arr: Array of numbers :rtype: number .. function:: toJSON(obj) Encodes `obj` to JSON string. This is an alias for the ``JSON.stringify`` method. :param obj: JSON encodable object :return: JSON string .. _commonjs: CommonJS Modules ---------------- Support for `CommonJS Modules <http://wiki.commonjs.org/wiki/Modules/1.1.1>`_ (introduced in CouchDB 0.11.0) allows you to create modular design functions without the need for duplication of functionality. Here's a CommonJS module that checks user permissions: .. code-block:: javascript function user_context(userctx, secobj) { var is_admin = function() { return userctx.indexOf('_admin') != -1; } return {'is_admin': is_admin} } exports['user'] = user_context Each module has access to additional global variables: - **module** (`object`): Contains information about the stored module - **id** (`string`): The module id; a JSON path in ddoc context - **current** (`code`): Compiled module code object - **parent** (`object`): Parent frame - **exports** (`object`): Export statements - **exports** (`object`): Shortcut to the ``module.exports`` object The CommonJS module can be added to a design document, like so: .. code-block:: javascript { "views": { "lib": { "security": "function user_context(userctx, secobj) { ... }" } }, "validate_doc_update": "function(newdoc, olddoc, userctx, secobj) { user = require('lib/security').user(userctx, secobj); return user.is_admin(); }" "_id": "_design/test" } Modules paths are relative to the design document's ``views`` object, but modules can only be loaded from the object referenced via ``lib``. The ``lib`` structure can still be used for view functions as well, by simply storing view functions at e.g. ``views.lib.map``, ``views.lib.reduce``, etc. ��������������������������������������������������������������������apache-couchdb-1.6.0/share/doc/src/query-server/erlang.rst������������������������������������������0000644�0001750�0000144�00000007173�12332105522�023437� 0����������������������������������������������������������������������������������������������������ustar�00djc�����������������������������users���������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������.. Licensed under the Apache License, Version 2.0 (the "License"); you may not .. use this file except in compliance with the License. You may obtain a copy of .. the License at .. .. http://www.apache.org/licenses/LICENSE-2.0 .. .. Unless required by applicable law or agreed to in writing, software .. distributed under the License is distributed on an "AS IS" BASIS, WITHOUT .. WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the .. License for the specific language governing permissions and limitations under .. the License. .. default-domain:: js .. _query-server/erlang: Erlang ====== .. note:: The Erlang query server is disabled by default. Read :ref:`configuration guide <config/native_query_servers>` about reasons why and how to enable it. .. function:: Emit(Id, Value) Emits `key`-`value` pairs to view indexer process. .. code-block:: erlang fun({Doc}) -> <<K,_/binary>> = proplists:get_value(<<"_rev">>, Doc, null), V = proplists:get_value(<<"_id">>, Doc, null), Emit(<<K>>, V) end. .. function:: FoldRows(Fun, Acc) Helper to iterate over all rows in a list function. :param Fun: Function object. :param Acc: The value previously returned by `Fun`. .. code-block:: erlang fun(Head, {Req}) -> Fun = fun({Row}, Acc) -> Id = couch_util:get_value(<<"id">>, Row), Send(list_to_binary(io_lib:format("Previous doc id: ~p~n", [Acc]))), Send(list_to_binary(io_lib:format("Current doc id: ~p~n", [Id]))), {ok, Id} end, FoldRows(Fun, nil), "" end. .. function:: GetRow() Retrieves the next row from a related view result. .. code-block:: erlang %% FoldRows background implementation. %% https://git-wip-us.apache.org/repos/asf?p=couchdb.git;a=blob;f=src/couchdb/couch_native_process.erl;hb=HEAD#l368 %% foldrows(GetRow, ProcRow, Acc) -> case GetRow() of nil -> {ok, Acc}; Row -> case (catch ProcRow(Row, Acc)) of {ok, Acc2} -> foldrows(GetRow, ProcRow, Acc2); {stop, Acc2} -> {ok, Acc2} end end. .. function:: Log(Msg) :param Msg: Log a message at the `INFO` level. .. code-block:: erlang fun({Doc}) -> <<K,_/binary>> = proplists:get_value(<<"_rev">>, Doc, null), V = proplists:get_value(<<"_id">>, Doc, null), Log(lists:flatten(io_lib:format("Hello from ~s doc!", [V]))), Emit(<<K>>, V) end. After the map function has run, the following line can be found in CouchDB logs (e.g. at `/var/log/couchdb/couch.log`): .. code-block:: text [Sun, 04 Nov 2012 11:33:58 GMT] [info] [<0.9144.2>] Hello from 8d300b86622d67953d102165dbe99467 doc! .. function:: Send(Chunk) Sends a single string `Chunk` in response. .. code-block:: erlang fun(Head, {Req}) -> Send("Hello,"), Send(" "), Send("Couch"), "!" end. The function above produces the following response: .. code-block:: text Hello, Couch! .. function:: Start(Headers) :param Headers: Proplist of :ref:`response object<response_object>`. Initialize :ref:`listfun` response. At this point, response code and headers may be defined. For example, this function redirects to the CouchDB web site: .. code-block:: erlang fun(Head, {Req}) -> Start({[{<<"code">>, 302}, {<<"headers">>, {[ {<<"Location">>, <<"http://couchdb.apache.org">>}] }} ]}), "Relax!" end. �����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������apache-couchdb-1.6.0/share/doc/src/couchapp/��������������������������������������������������������0000755�0001750�0000144�00000000000�12332106072�020557� 5����������������������������������������������������������������������������������������������������ustar�00djc�����������������������������users���������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������apache-couchdb-1.6.0/share/doc/src/couchapp/views/��������������������������������������������������0000755�0001750�0000144�00000000000�12332106072�021714� 5����������������������������������������������������������������������������������������������������ustar�00djc�����������������������������users���������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������apache-couchdb-1.6.0/share/doc/src/couchapp/views/collation.rst�������������������������������������0000644�0001750�0000144�00000016472�12332105522�024443� 0����������������������������������������������������������������������������������������������������ustar�00djc�����������������������������users���������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������.. Licensed under the Apache License, Version 2.0 (the "License"); you may not .. use this file except in compliance with the License. You may obtain a copy of .. the License at .. .. http://www.apache.org/licenses/LICENSE-2.0 .. .. Unless required by applicable law or agreed to in writing, software .. distributed under the License is distributed on an "AS IS" BASIS, WITHOUT .. WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the .. License for the specific language governing permissions and limitations under .. the License. .. _views/collation: =============== Views Collation =============== Basics ====== View functions specify a key and a value to be returned for each row. CouchDB collates the view rows by this key. In the following example, the ``LastName`` property serves as the key, thus the result will be sorted by ``LastName``: .. code-block:: javascript function(doc) { if (doc.Type == "customer") { emit(doc.LastName, {FirstName: doc.FirstName, Address: doc.Address}); } } CouchDB allows arbitrary JSON structures to be used as keys. You can use JSON arrays as keys for fine-grained control over sorting and grouping. Examples ======== The following clever trick would return both customer and order documents. The key is composed of a customer ``_id`` and a sorting token. Because the key for order documents begins with the ``_id`` of a customer document, all the orders will be sorted by customer. Because the sorting token for customers is lower than the token for orders, the customer document will come before the associated orders. The values 0 and 1 for the sorting token are arbitrary. .. code-block:: javascript function(doc) { if (doc.Type == "customer") { emit([doc._id, 0], null); } else if (doc.Type == "order") { emit([doc.customer_id, 1], null); } } To list a specific customer with ``_id`` XYZ, and all of that customer's orders, limit the startkey and endkey ranges to cover only documents for that customer's ``_id``:: startkey=["XYZ"]&endkey=["XYZ", {}] It is not recommended to emit the document itself in the view. Instead, to include the bodies of the documents when requesting the view, request the view with ``?include_docs=true``. Sorting by Dates ================ It maybe be convenient to store date attributes in a human readable format (i.e. as a `string`), but still sort by date. This can be done by converting the date to a `number` in the :js:func:`emit` function. For example, given a document with a created_at attribute of ``'Wed Jul 23 16:29:21 +0100 2013'``, the following emit function would sort by date: .. code-block:: javascript emit(Date.parse(doc.created_at).getTime(), null); Alternatively, if you use a date format which sorts lexicographically, such as ``"2013/06/09 13:52:11 +0000"`` you can just .. code-block:: javascript emit(doc.created_at, null); and avoid the conversion. As a bonus, this date format is compatible with the JavaScript date parser, so you can use ``new Date(doc.created_at)`` in your client side JavaScript to make date sorting easy in the browser. String Ranges ============= If you need start and end keys that encompass every string with a given prefix, it is better to use a high value unicode character, than to use a ``'ZZZZ'`` suffix. That is, rather than:: startkey="abc"&endkey="abcZZZZZZZZZ" You should use:: startkey="abc"&endkey="abc\ufff0" Collation Specification ======================= This section is based on the view_collation function in `view_collation.js`_: .. _view_collation.js: https://git-wip-us.apache.org/repos/asf?p=couchdb.git;a=blob;f=share/www/script/test/view_collation.js;hb=HEAD .. code-block:: javascript // special values sort before all other types null false true // then numbers 1 2 3.0 4 // then text, case sensitive "a" "A" "aa" "b" "B" "ba" "bb" // then arrays. compared element by element until different. // Longer arrays sort after their prefixes ["a"] ["b"] ["b","c"] ["b","c", "a"] ["b","d"] ["b","d", "e"] // then object, compares each key value in the list until different. // larger objects sort after their subset objects. {a:1} {a:2} {b:1} {b:2} {b:2, a:1} // Member order does matter for collation. // CouchDB preserves member order // but doesn't require that clients will. // this test might fail if used with a js engine // that doesn't preserve order {b:2, c:2} Comparison of strings is done using `ICU`_ which implements the `Unicode Collation Algorithm`_, giving a dictionary sorting of keys. This can give surprising results if you were expecting ASCII ordering. Note that: - All symbols sort before numbers and letters (even the "high" symbols like tilde, ``0x7e``) - Differing sequences of letters are compared without regard to case, so ``a < aa`` but also ``A < aa`` and ``a < AA`` - Identical sequences of letters are compared with regard to case, with lowercase before uppercase, so ``a < A`` .. _ICU: http://site.icu-project.org/ .. _Unicode Collation Algorithm: http://www.unicode.org/unicode/reports/tr10/ You can demonstrate the collation sequence for 7-bit ASCII characters like this: .. code-block:: ruby require 'rubygems' require 'restclient' require 'json' DB="http://127.0.0.1:5984/collator" RestClient.delete DB rescue nil RestClient.put "#{DB}","" (32..126).each do |c| RestClient.put "#{DB}/#{c.to_s(16)}", {"x"=>c.chr}.to_json end RestClient.put "#{DB}/_design/test", <<EOS { "views":{ "one":{ "map":"function (doc) { emit(doc.x,null); }" } } } EOS puts RestClient.get("#{DB}/_design/test/_view/one") This shows the collation sequence to be:: ` ^ _ - , ; : ! ? . ' " ( ) [ ] { } @ * / \ & # % + < = > | ~ $ 0 1 2 3 4 5 6 7 8 9 a A b B c C d D e E f F g G h H i I j J k K l L m M n N o O p P q Q r R s S t T u U v V w W x X y Y z Z Key ranges ---------- Take special care when querying key ranges. For example: the query:: startkey="Abc"&endkey="AbcZZZZ" will match "ABC" and "abc1", but not "abc". This is because UCA sorts as:: abc < Abc < ABC < abc1 < AbcZZZZZ For most applications, to avoid problems you should lowercase the `startkey`:: startkey="abc"&endkey="abcZZZZZZZZ" will match all keys starting with ``[aA][bB][cC]`` Complex keys ------------ The query ``startkey=["foo"]&endkey=["foo",{}]`` will match most array keys with "foo" in the first element, such as ``["foo","bar"]`` and ``["foo",["bar","baz"]]``. However it will not match ``["foo",{"an":"object"}]`` _all_docs ========= The :ref:`_all_docs <api/db/all_docs>` view is a special case because it uses ASCII collation for doc ids, not UCA:: startkey="_design/"&endkey="_design/ZZZZZZZZ" will not find ``_design/abc`` because `'Z'` comes before `'a'` in the ASCII sequence. A better solution is:: startkey="_design/"&endkey="_design0" Raw collation ============= To squeeze a little more performance out of views, you can specify ``"options":{"collation":"raw"}`` within the view definition for native Erlang collation, especially if you don't require UCA. This gives a different collation sequence: .. code-block:: javascript 1 false null true {"a":"a"}, ["a"] "a" Beware that ``{}`` is no longer a suitable "high" key sentinel value. Use a string like ``"\ufff0"`` instead. ������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������apache-couchdb-1.6.0/share/doc/src/couchapp/views/intro.rst�����������������������������������������0000644�0001750�0000144�00000061746�12332105522�023616� 0����������������������������������������������������������������������������������������������������ustar�00djc�����������������������������users���������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������.. Licensed under the Apache License, Version 2.0 (the "License"); you may not .. use this file except in compliance with the License. You may obtain a copy of .. the License at .. .. http://www.apache.org/licenses/LICENSE-2.0 .. .. Unless required by applicable law or agreed to in writing, software .. distributed under the License is distributed on an "AS IS" BASIS, WITHOUT .. WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the .. License for the specific language governing permissions and limitations under .. the License. .. _views/intro: =========================== Introduction Into The Views =========================== Views are useful for many purposes: - Filtering the documents in your database to find those relevant to a particular process. - Extracting data from your documents and presenting it in a specific order. - Building efficient indexes to find documents by any value or structure that resides in them. - Use these indexes to represent relationships among documents. - Finally, with views you can make all sorts of calculations on the data in your documents. For example, if documents represent your company’s financial transactions, a view can answer the question of what the spending was in the last week, month, or year. What Is a View? =============== Let’s go through the different use cases. First is extracting data that you might need for a special purpose in a specific order. For a front page, we want a list of blog post titles sorted by date. We’ll work with a set of example documents as we walk through how views work: .. code-block:: javascript { "_id":"biking", "_rev":"AE19EBC7654", "title":"Biking", "body":"My biggest hobby is mountainbiking. The other day...", "date":"2009/01/30 18:04:11" } .. code-block:: javascript { "_id":"bought-a-cat", "_rev":"4A3BBEE711", "title":"Bought a Cat", "body":"I went to the the pet store earlier and brought home a little kitty...", "date":"2009/02/17 21:13:39" } .. code-block:: javascript { "_id":"hello-world", "_rev":"43FBA4E7AB", "title":"Hello World", "body":"Well hello and welcome to my new blog...", "date":"2009/01/15 15:52:20" } Three will do for the example. Note that the documents are sorted by "_id", which is how they are stored in the database. Now we define a view. Bear with us without an explanation while we show you some code: .. code-block:: javascript function(doc) { if(doc.date && doc.title) { emit(doc.date, doc.title); } } This is a `map function`, and it is written in JavaScript. If you are not familiar with JavaScript but have used C or any other C-like language such as Java, PHP, or C#, this should look familiar. It is a simple function definition. You provide CouchDB with view functions as strings stored inside the ``views`` field of a design document. You don’t run it yourself. Instead, when you `query your view`, CouchDB takes the source code and runs it for you on every document in the database your view was defined in. You `query your view` to retrieve the `view result`. All map functions have a single parameter doc. This is a single document in the database. Our map function checks whether our document has a ``date`` and a ``title`` attribute — luckily, all of our documents have them — and then calls the built-in :js:func:`emit` function with these two attributes as arguments. The :js:func:`emit` function always takes two arguments: the first is ``key``, and the second is ``value``. The ``emit(key, value)`` function creates an entry in our `view result`. One more thing: the ``emit()`` function can be called multiple times in the map function to create multiple entries in the view results from a single document, but we are not doing that yet. CouchDB takes whatever you pass into the emit() function and puts it into a list (see Table 1, ā€œView resultsā€ below). Each row in that list includes the `key` and `value`. More importantly, the list is sorted by key (by ``doc.date`` in our case). The most important feature of a view result is that it is sorted by `key`. We will come back to that over and over again to do neat things. Stay tuned. Table 1. View results: +-----------------------+------------------+ | Key | Value | +=======================+==================+ | "2009/01/15 15:52:20" | "Hello World" | +-----------------------+------------------+ | "2009/01/30 18:04:11" | "Biking" | +-----------------------+------------------+ | "2009/02/17 21:13:39" | "Bought a Cat" | +-----------------------+------------------+ When you query your view, CouchDB takes the source code and runs it for you on every document in the database. If you have a lot of documents, that takes quite a bit of time and you might wonder if it is not horribly inefficient to do this. Yes, it would be, but CouchDB is designed to avoid any extra costs: it only runs through all documents once, when you first query your view. If a document is changed, the map function is only run once, to recompute the keys and values for that single document. The view result is stored in a B-tree, just like the structure that is responsible for holding your documents. View B-trees are stored in their own file, so that for high-performance CouchDB usage, you can keep views on their own disk. The B-tree provides very fast lookups of rows by key, as well as efficient streaming of rows in a key range. In our example, a single view can answer all questions that involve time: ā€œGive me all the blog posts from last weekā€ or ā€œlast monthā€ or ā€œthis year.ā€ Pretty neat. When we query our view, we get back a list of all documents sorted by date. Each row also includes the post title so we can construct links to posts. Table 1 is just a graphical representation of the view result. The actual result is JSON-encoded and contains a little more metadata: .. code-block:: javascript { "total_rows": 3, "offset": 0, "rows": [ { "key": "2009/01/15 15:52:20", "id": "hello-world", "value": "Hello World" }, { "key": "2009/01/30 18:04:11", "id": "biking", "value": "Biking" }, { "key": "2009/02/17 21:13:39", "id": "bought-a-cat", "value": "Bought a Cat" } ] } Now, the actual result is not as nicely formatted and doesn’t include any superfluous whitespace or newlines, but this is better for you (and us!) to read and understand. Where does that "id" member in the result rows come from? That wasn’t there before. That’s because we omitted it earlier to avoid confusion. CouchDB automatically includes the document ID of the document that created the entry in the view result. We’ll use this as well when constructing links to the blog post pages. Efficient Lookups ================= Let’s move on to the second use case for views: ā€œbuilding efficient indexes to find documents by any value or structure that resides in them.ā€ We already explained the efficient indexing, but we skipped a few details. This is a good time to finish this discussion as we are looking at map functions that are a little more complex. First, back to the B-trees! We explained that the B-tree that backs the key-sorted view result is built only once, when you first query a view, and all subsequent queries will just read the B-tree instead of executing the map function for all documents again. What happens, though, when you change a document, add a new one, or delete one? Easy: CouchDB is smart enough to find the rows in the view result that were created by a specific document. It marks them invalid so that they no longer show up in view results. If the document was deleted, we’re good — the resulting B-tree reflects the state of the database. If a document got updated, the new document is run through the map function and the resulting new lines are inserted into the B-tree at the correct spots. New documents are handled in the same way. The B-tree is a very efficient data structure for our needs, and the crash-only design of CouchDB databases is carried over to the view indexes as well. To add one more point to the efficiency discussion: usually multiple documents are updated between view queries. The mechanism explained in the previous paragraph gets applied to all changes in the database since the last time the view was queried in a batch operation, which makes things even faster and is generally a better use of your resources. Find One -------- On to more complex map functions. We said ā€œfind documents by any value or structure that resides in them.ā€ We already explained how to extract a value by which to sort a list of views (our date field). The same mechanism is used for fast lookups. The URI to query to get a view’s result is ``/database/_design/designdocname/_view/viewname``. This gives you a list of all rows in the view. We have only three documents, so things are small, but with thousands of documents, this can get long. You can add view parameters to the URI to constrain the result set. Say we know the date of a blog post. To find a single document, we would use ``/blog/_design/docs/_view/by_date?key="2009/01/30 18:04:11"`` to get the ā€œBikingā€ blog post. Remember that you can place whatever you like in the key parameter to the emit() function. Whatever you put in there, we can now use to look up exactly — and fast. Note that in the case where multiple rows have the same key (perhaps we design a view where the key is the name of the post’s author), key queries can return more than one row. Find Many --------- We talked about ā€œgetting all posts for last month.ā€ If it’s February now, this is as easy as ``/blog/_design/docs/_view/by_date?startkey="2010/01/01 00:00:00"&endkey="2010/02/00 00:00:00"``. The ``startkey`` and ``endkey`` parameters specify an inclusive range on which we can search. To make things a little nicer and to prepare for a future example, we are going to change the format of our date field. Instead of a string, we are going to use an array, where individual members are part of a timestamp in decreasing significance. This sounds fancy, but it is rather easy. Instead of:: { "date": "2009/01/31 00:00:00" } we use:: { "date": [2009, 1, 31, 0, 0, 0] } Our map function does not have to change for this, but our view result looks a little different: Table 2. New view results: +---------------------------+------------------+ | Key | Value | +===========================+==================+ | [2009, 1, 15, 15, 52, 20] | "Hello World" | +---------------------------+------------------+ | [2009, 2, 17, 21, 13, 39] | "Biking" | +---------------------------+------------------+ | [2009, 1, 30, 18, 4, 11] | "Bought a Cat" | +---------------------------+------------------+ And our queries change to ``/blog/_design/docs/_view/by_date?startkey=[2010, 1, 1, 0, 0, 0]&endkey=[2010, 2, 1, 0, 0, 0]``. For all you care, this is just a change in syntax, not meaning. But it shows you the power of views. Not only can you construct an index with scalar values like strings and integers, you can also use JSON structures as keys for your views. Say we tag our documents with a list of tags and want to see all tags, but we don’t care for documents that have not been tagged. .. code-block:: javascript { ... tags: ["cool", "freak", "plankton"], ... } .. code-block:: javascript { ... tags: [], ... } .. code-block:: javascript function(doc) { if(doc.tags.length > 0) { for(var idx in doc.tags) { emit(doc.tags[idx], null); } } } This shows a few new things. You can have conditions on structure (``if(doc.tags.length > 0)``) instead of just values. This is also an example of how a map function calls :js:func:`emit` multiple times per document. And finally, you can pass null instead of a value to the value parameter. The same is true for the key parameter. We’ll see in a bit how that is useful. Reversed Results ---------------- To retrieve view results in reverse order, use the ``descending=true`` query parameter. If you are using a ``startkey`` parameter, you will find that CouchDB returns different rows or no rows at all. What’s up with that? It’s pretty easy to understand when you see how view query options work under the hood. A view is stored in a tree structure for fast lookups. Whenever you query a view, this is how CouchDB operates: #. Starts reading at the top, or at the position that ``startkey`` specifies, if present. #. Returns one row at a time until the end or until it hits ``endkey``, if present. If you specify ``descending=true``, the reading direction is reversed, not the sort order of the rows in the view. In addition, the same two-step procedure is followed. Say you have a view result that looks like this: +-----+-------+ | Key | Value | +=====+=======+ | 0 | "foo" | +-----+-------+ | 1 | "bar" | +-----+-------+ | 2 | "baz" | +-----+-------+ Here are potential query options: ``?startkey=1&descending=true``. What will CouchDB do? See #1 above: it jumps to ``startkey``, which is the row with the key ``1``, and starts reading backward until it hits the end of the view. So the particular result would be: +-----+-------+ | Key | Value | +=====+=======+ | 1 | "bar" | +-----+-------+ | 0 | "foo" | +-----+-------+ This is very likely not what you want. To get the rows with the indexes ``1`` and ``2`` in reverse order, you need to switch the ``startkey`` to ``endkey``: ``endkey=1&descending=true``: +-----+-------+ | Key | Value | +=====+=======+ | 2 | "baz" | +-----+-------+ | 1 | "bar" | +-----+-------+ Now that looks a lot better. CouchDB started reading at the bottom of the view and went backward until it hit ``endkey``. The View to Get Comments for Posts ================================== We use an array key here to support the ``group_level`` reduce query parameter. CouchDB’s views are stored in the B-tree file structure. Because of the way B-trees are structured, we can cache the intermediate reduce results in the non-leaf nodes of the tree, so reduce queries can be computed along arbitrary key ranges in logarithmic time. See Figure 1, ā€œComments map functionā€. In the blog app, we use ``group_leve``l reduce queries to compute the count of comments both on a per-post and total basis, achieved by querying the same view index with different methods. With some array keys, and assuming each key has the value ``1``: .. code-block:: javascript ["a","b","c"] ["a","b","e"] ["a","c","m"] ["b","a","c"] ["b","a","g"] the reduce view: .. code-block:: javascript function(keys, values, rereduce) { return sum(values) } returns the total number of rows between the start and end key. So with ``startkey=["a","b"]&endkey=["b"]`` (which includes the first three of the above keys) the result would equal ``3``. The effect is to count rows. If you’d like to count rows without depending on the row value, you can switch on the ``rereduce`` parameter: .. code-block:: javascript function(keys, values, rereduce) { if (rereduce) { return sum(values); } else { return values.length; } } .. note:: JavaScript function about could be effectively replaced by builtin ``_count`` one. .. figure:: ../../../images/views-intro-01.png :align: center :scale: 50 % :alt: Comments map function Figure 1. Comments map function This is the reduce view used by the example app to count comments, while utilizing the map to output the comments, which are more useful than just ``1`` over and over. It pays to spend some time playing around with map and reduce functions. Futon is OK for this, but it doesn’t give full access to all the query parameters. Writing your own test code for views in your language of choice is a great way to explore the nuances and capabilities of CouchDB’s incremental MapReduce system. Anyway, with a ``group_level`` query, you’re basically running a series of reduce range queries: one for each group that shows up at the level you query. Let’s reprint the key list from earlier, grouped at level ``1``: .. code-block:: javascript ["a"] 3 ["b"] 2 And at ``group_level=2``: .. code-block:: javascript ["a","b"] 2 ["a","c"] 1 ["b","a"] 2 Using the parameter ``group=true`` makes it behave as though it were ``group_level=exact``, so in the case of our current example, it would give the number ``1`` for each key, as there are no exactly duplicated keys. Reduce/Rereduce =============== We briefly talked about the ``rereduce`` parameter to your reduce function. We’ll explain what’s up with it in this section. By now, you should have learned that your view result is stored in B-tree index structure for efficiency. The existence and use of the ``rereduce`` parameter is tightly coupled to how the B-tree index works. Consider the map result are: .. code-block:: javascript "afrikan", 1 "afrikan", 1 "chinese", 1 "chinese", 1 "chinese", 1 "chinese", 1 "french", 1 "italian", 1 "italian", 1 "spanish", 1 "vietnamese", 1 "vietnamese", 1 Example 1. Example view result (mmm, food) When we want to find out how many dishes there are per origin, we can reuse the simple reduce function shown earlier: .. code-block:: javascript function(keys, values, rereduce) { return sum(values); } Figure 2, ā€œThe B-tree indexā€ shows a simplified version of what the B-tree index looks like. We abbreviated the key strings. .. figure:: ../../../images/views-intro-02.png :align: center :alt: The B-tree index Figure 2. The B-tree index The view result is what computer science grads call a ā€œpre-orderā€ walk through the tree. We look at each element in each node starting from the left. Whenever we see that there is a subnode to descend into, we descend and start reading the elements in that subnode. When we have walked through the entire tree, we’re done. You can see that CouchDB stores both keys and values inside each leaf node. In our case, it is simply always ``1``, but you might have a value where you count other results and then all rows have a different value. What’s important is that CouchDB runs all elements that are within a node into the reduce function (setting the ``rereduce`` parameter to false) and stores the result inside the parent node along with the edge to the subnode. In our case, each edge has a 3 representing the reduce value for the node it points to. .. note:: In reality, nodes have more than 1,600 elements in them. CouchDB computes the result for all the elements in multiple iterations over the elements in a single node, not all at once (which would be disastrous for memory consumption). Now let’s see what happens when we run a query. We want to know how many "chinese" entries we have. The query option is simple: ``?key="chinese"``. See Figure 3, ā€œThe B-tree index reduce resultā€. .. figure:: ../../../images/views-intro-03.png :align: center :alt: The B-tree index reduce result Figure 3. The B-tree index reduce result CouchDB detects that all values in the subnode include the "chinese" key. It concludes that it can take just the 3 values associated with that node to compute the final result. It then finds the node left to it and sees that it’s a node with keys outside the requested range (``key=`` requests a range where the beginning and the end are the same value). It concludes that it has to use the "chinese" element’s value and the other node’s value and run them through the reduce function with the ``rereduce`` parameter set to true. The reduce function effectively calculates 3 + 1 on query time and returns the desired result. The next example shows some pseudocode that shows the last invocation of the reduce function with actual values: .. code-block:: javascript function(null, [3, 1], true) { return sum([3, 1]); } Now, we said your reduce function must actually reduce your values. If you see the B-tree, it should become obvious what happens when you don’t reduce your values. Consider the following map result and reduce function. This time we want to get a list of all the unique labels in our view: .. code-block:: javascript "abc", "afrikan" "cef", "afrikan" "fhi", "chinese" "hkl", "chinese" "ino", "chinese" "lqr", "chinese" "mtu", "french" "owx", "italian" "qza", "italian" "tdx", "spanish" "xfg", "vietnamese" "zul", "vietnamese" We don’t care for the key here and only list all the labels we have. Our reduce function removes duplicates: .. code-block:: javascript function(keys, values, rereduce) { var unique_labels = {}; values.forEach(function(label) { if(!unique_labels[label]) { unique_labels[label] = true; } }); return unique_labels; } This translates to Figure 4, ā€œAn overflowing reduce indexā€. We hope you get the picture. The way the B-tree storage works means that if you don’t actually reduce your data in the reduce function, you end up having CouchDB copy huge amounts of data around that grow linearly, if not faster with the number of rows in your view. CouchDB will be able to compute the final result, but only for views with a few rows. Anything larger will experience a ridiculously slow view build time. To help with that, CouchDB since version 0.10.0 will throw an error if your reduce function does not reduce its input values. .. figure:: ../../../images/views-intro-04.png :align: center :alt: An overflowing reduce index Figure 4. An overflowing reduce index Lessons Learned =============== - If you don’t use the key field in the map function, you are probably doing it wrong. - If you are trying to make a list of values unique in the reduce functions, you are probably doing it wrong. - If you don’t reduce your values to a single scalar value or a small fixed-sized object or array with a fixed number of scalar values of small sizes, you are probably doing it wrong. Wrapping Up =========== Map functions are side effect–free functions that take a document as argument and `emit` key/value pairs. CouchDB stores the emitted rows by constructing a sorted B-tree index, so row lookups by key, as well as streaming operations across a range of rows, can be accomplished in a small memory and processing footprint, while writes avoid seeks. Generating a view takes ``O(N)``, where ``N`` is the total number of rows in the view. However, querying a view is very quick, as the B-tree remains shallow even when it contains many, many keys. Reduce functions operate on the sorted rows emitted by map view functions. CouchDB’s reduce functionality takes advantage of one of the fundamental properties of B-tree indexes: for every leaf node (a sorted row), there is a chain of internal nodes reaching back to the root. Each leaf node in the B-tree carries a few rows (on the order of tens, depending on row size), and each internal node may link to a few leaf nodes or other internal nodes. The reduce function is run on every node in the tree in order to calculate the final reduce value. The end result is a reduce function that can be incrementally updated upon changes to the map function, while recalculating the reduction values for a minimum number of nodes. The initial reduction is calculated once per each node (inner and leaf) in the tree. When run on leaf nodes (which contain actual map rows), the reduce function’s third parameter, ``rereduce``, is false. The arguments in this case are the keys and values as output by the map function. The function has a single returned reduction value, which is stored on the inner node that a working set of leaf nodes have in common, and is used as a cache in future reduce calculations. When the reduce function is run on inner nodes, the ``rereduce`` flag is ``true``. This allows the function to account for the fact that it will be receiving its own prior output. When ``rereduce`` is true, the values passed to the function are intermediate reduction values as cached from previous calculations. When the tree is more than two levels deep, the `rereduce` phase is repeated, consuming chunks of the previous level’s output until the final reduce value is calculated at the root node. A common mistake new CouchDB users make is attempting to construct complex aggregate values with a reduce function. Full reductions should result in a scalar value, like 5, and not, for instance, a JSON hash with a set of unique keys and the count of each. The problem with this approach is that you’ll end up with a very large final value. The number of unique keys can be nearly as large as the number of total keys, even for a large set. It is fine to combine a few scalar calculations into one reduce function; for instance, to find the total, average, and standard deviation of a set of numbers in a single function. If you’re interested in pushing the edge of CouchDB’s incremental reduce functionality, have a look at `Google’s paper on Sawzall`_, which gives examples of some of the more exotic reductions that can be accomplished in a system with similar constraints. .. _Google’s paper on Sawzall: http://research.google.com/archive/sawzall.html ��������������������������apache-couchdb-1.6.0/share/doc/src/couchapp/views/nosql.rst�����������������������������������������0000644�0001750�0000144�00000040106�12332105522�023602� 0����������������������������������������������������������������������������������������������������ustar�00djc�����������������������������users���������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������.. Licensed under the Apache License, Version 2.0 (the "License"); you may not .. use this file except in compliance with the License. You may obtain a copy of .. the License at .. .. http://www.apache.org/licenses/LICENSE-2.0 .. .. Unless required by applicable law or agreed to in writing, software .. distributed under the License is distributed on an "AS IS" BASIS, WITHOUT .. WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the .. License for the specific language governing permissions and limitations under .. the License. .. _views/nosql: ============================= View Cookbook for SQL Jockeys ============================= This is a collection of some common SQL queries and how to get the same result in CouchDB. The key to remember here is that CouchDB does not work like an SQL database at all and that best practices from the SQL world do not translate well or at all to CouchDB. This documents’s ā€œcookbookā€ assumes that you are familiar with the CouchDB basics such as creating and updating databases and documents. Using Views =========== How you would do this in SQL:: CREATE TABLE or:: ALTER TABLE How you can do this in CouchDB? Using views is a two-step process. First you define a view; then you query it. This is analogous to defining a table structure (with indexes) using ``CREATE TABLE`` or ``ALTER TABLE`` and querying it using an SQL query. Defining a View --------------- Defining a view is done by creating a special document in a CouchDB database. The only real specialness is the ``_id`` of the document, which starts with ``_design/`` — for example, _design/application. Other than that, it is just a regular CouchDB document. To make sure CouchDB understands that you are defining a view, you need to prepare the contents of that design document in a special format. Here is an example: .. code-block:: javascript { "_id": "_design/application", "_rev": "1-C1687D17", "views": { "viewname": { "map": "function(doc) { ... }", "reduce": "function(keys, values) { ... }" } } } We are defining a view `viewname`. The definition of the view consists of two functions: the map function and the reduce function. Specifying a reduce function is optional. We’ll look at the nature of the functions later. Note that `viewname` can be whatever you like: ``users``, ``by-name``, or ``by-date`` are just some examples. A single design document can also include multiple view definitions, each identified by a unique name: .. code-block:: javascript { "_id": "_design/application", "_rev": "1-C1687D17", "views": { "viewname": { "map": "function(doc) { ... }", "reduce": "function(keys, values) { ... }" }, "anotherview": { "map": "function(doc) { ... }", "reduce": "function(keys, values) { ... }" } } } Querying a View --------------- The name of the design document and the name of the view are significant for querying the view. To query the view `viewname`, you perform an HTTP ``GET`` request to the following URI:: /database/_design/application/_view/viewname database is the name of the database you created your design document in. Next up is the design document name, and then the view name prefixed with ``_view/``. To query `anotherview`, replace `viewname` in that URI with `anotherview`. If you want to query a view in a different design document, adjust the design document name. MapReduce Functions ------------------- MapReduce is a concept that solves problems by applying a two-step process, aptly named the map phase and the reduce phase. The map phase looks at all documents in CouchDB separately one after the other and creates a `map result`. The map result is an ordered list of key/value pairs. Both key and value can be specified by the user writing the map function. A map function may call the built-in ``emit(key, value)`` function 0 to N times per document, creating a row in the map result per invocation. CouchDB is smart enough to run a map function only once for every document, even on subsequent queries on a view. Only changes to documents or new documents need to be processed anew. Map functions ------------- Map functions run in isolation for every document. They can’t modify the document, and they can’t talk to the outside world—they can’t have side effects. This is required so that CouchDB can guarantee correct results without having to recalculate a complete result when only one document gets changed. The map result looks like this: .. code-block:: javascript {"total_rows":3,"offset":0,"rows":[ {"id":"fc2636bf50556346f1ce46b4bc01fe30","key":"Lena","value":5}, {"id":"1fb2449f9b9d4e466dbfa47ebe675063","key":"Lisa","value":4}, {"id":"8ede09f6f6aeb35d948485624b28f149","key":"Sarah","value":6} ]} It is a list of rows sorted by the value of key. The id is added automatically and refers back to the document that created this row. The value is the data you’re looking for. For example purposes, it’s the girl’s age. The map function that produces this result is: .. code-block:: javascript function(doc) { if(doc.name && doc.age) { emit(doc.name, doc.age); } } It includes the if statement as a sanity check to ensure that we’re operating on the right fields and calls the emit function with the name and age as the key and value. Look Up by Key ============== How you would do this in SQL:: SELECT field FROM table WHERE value="searchterm" How you can do this in CouchDB? Use case: get a result (which can be a record or set of records) associated with a key ("searchterm"). To look something up quickly, regardless of the storage mechanism, an index is needed. An index is a data structure optimized for quick search and retrieval. CouchDB’s map result is stored in such an index, which happens to be a B+ tree. To look up a value by "searchterm", we need to put all values into the key of a view. All we need is a simple map function: .. code-block:: javascript function(doc) { if(doc.value) { emit(doc.value, null); } } This creates a list of documents that have a value field sorted by the data in the value field. To find all the records that match "searchterm", we query the view and specify the search term as a query parameter:: /database/_design/application/_view/viewname?key="searchterm" Consider the documents from the previous section, and say we’re indexing on the age field of the documents to find all the five-year-olds: .. code-block:: javascript function(doc) { if(doc.age && doc.name) { emit(doc.age, doc.name); } } Query:: /ladies/_design/ladies/_view/age?key=5 Result: .. code-block:: javascript {"total_rows":3,"offset":1,"rows":[ {"id":"fc2636bf50556346f1ce46b4bc01fe30","key":5,"value":"Lena"} ]} Easy. Note that you have to emit a value. The view result includes the associated document ID in every row. We can use it to look up more data from the document itself. We can also use the ``?include_docs=true`` parameter to have CouchDB fetch the documents individually for us. Look Up by Prefix ================= How you would do this in SQL:: SELECT field FROM table WHERE value LIKE "searchterm%" How you can do this in CouchDB? Use case: find all documents that have a field value that starts with `searchterm`. For example, say you stored a MIME type (like `text/html` or `image/jpg`) for each document and now you want to find all documents that are images according to the MIME type. The solution is very similar to the previous example: all we need is a map function that is a little more clever than the first one. But first, an example document: .. code-block:: javascript { "_id": "Hugh Laurie", "_rev": "1-9fded7deef52ac373119d05435581edf", "mime-type": "image/jpg", "description": "some dude" } The clue lies in extracting the prefix that we want to search for from our document and putting it into our view index. We use a regular expression to match our prefix: .. code-block:: javascript function(doc) { if(doc["mime-type"]) { // from the start (^) match everything that is not a slash ([^\/]+) until // we find a slash (\/). Slashes needs to be escaped with a backslash (\/) var prefix = doc["mime-type"].match(/^[^\/]+\//); if(prefix) { emit(prefix, null); } } } We can now query this view with our desired MIME type prefix and not only find all images, but also text, video, and all other formats:: /files/_design/finder/_view/by-mime-type?key="image/" Aggregate Functions =================== How you would do this in SQL:: SELECT COUNT(field) FROM table How you can do this in CouchDB? Use case: calculate a derived value from your data. We haven’t explained reduce functions yet. Reduce functions are similar to aggregate functions in SQL. They compute a value over multiple documents. To explain the mechanics of reduce functions, we’ll create one that doesn’t make a whole lot of sense. But this example is easy to understand. We’ll explore more useful reductions later. Reduce functions operate on the output of the map function (also called the map result or intermediate result). The reduce function’s job, unsurprisingly, is to reduce the list that the map function produces. Here’s what our summing reduce function looks like: .. code-block:: javascript function(keys, values) { var sum = 0; for(var idx in values) { sum = sum + values[idx]; } return sum; } Here’s an alternate, more idiomatic JavaScript version: .. code-block:: javascript function(keys, values) { var sum = 0; values.forEach(function(element) { sum = sum + element; }); return sum; } .. note:: Don't miss effective builtin :ref:`reduce functions <reducefun>` like ``_sum`` and ``_count`` This reduce function takes two arguments: a list of keys and a list of values. For our summing purposes we can ignore the keys-list and consider only the value list. We’re looping over the list and add each item to a running total that we’re returning at the end of the function. You’ll see one difference between the map and the reduce function. The map function uses ``emit()`` to create its result, whereas the reduce function returns a value. For example, from a list of integer values that specify the age, calculate the sum of all years of life for the news headline, `ā€œ786 life years present at event.ā€` A little contrived, but very simple and thus good for demonstration purposes. Consider the documents and the map view we used earlier in this document. The reduce function to calculate the total age of all girls is: .. code-block:: javascript function(keys, values) { return sum(values); } Note that, instead of the two earlier versions, we use CouchDB’s predefined :js:func:`sum` function. It does the same thing as the other two, but it is such a common piece of code that CouchDB has it included. The result for our reduce view now looks like this: .. code-block:: javascript {"rows":[ {"key":null,"value":15} ]} The total sum of all age fields in all our documents is 15. Just what we wanted. The key member of the result object is null, as we can’t know anymore which documents took part in the creation of the reduced result. We’ll cover more advanced reduce cases later on. As a rule of thumb, the reduce function should reduce to a single scalar value. That is, an integer; a string; or a small, fixed-size list or object that includes an aggregated value (or values) from the values argument. It should never just return values or similar. CouchDB will give you a warning if you try to use reduce ā€œthe wrong wayā€: .. code-block:: javascript { "error":"reduce_overflow_error", "message":"Reduce output must shrink more rapidly: Current output: ..." } Get Unique Values ================= How you would do this in SQL:: SELECT DISTINCT field FROM table How you can do this in CouchDB? Getting unique values is not as easy as adding a keyword. But a reduce view and a special query parameter give us the same result. Let’s say you want a list of tags that your users have tagged themselves with and no duplicates. First, let’s look at the source documents. We punt on ``_id`` and ``_rev`` attributes here: .. code-block:: javascript { "name":"Chris", "tags":["mustache", "music", "couchdb"] } .. code-block:: javascript { "name":"Noah", "tags":["hypertext", "philosophy", "couchdb"] } .. code-block:: javascript { "name":"Jan", "tags":["drums", "bike", "couchdb"] } Next, we need a list of all tags. A map function will do the trick: .. code-block:: javascript function(doc) { if(doc.name && doc.tags) { doc.tags.forEach(function(tag) { emit(tag, null); }); } } The result will look like this: .. code-block:: javascript {"total_rows":9,"offset":0,"rows":[ {"id":"3525ab874bc4965fa3cda7c549e92d30","key":"bike","value":null}, {"id":"3525ab874bc4965fa3cda7c549e92d30","key":"couchdb","value":null}, {"id":"53f82b1f0ff49a08ac79a9dff41d7860","key":"couchdb","value":null}, {"id":"da5ea89448a4506925823f4d985aabbd","key":"couchdb","value":null}, {"id":"3525ab874bc4965fa3cda7c549e92d30","key":"drums","value":null}, {"id":"53f82b1f0ff49a08ac79a9dff41d7860","key":"hypertext","value":null}, {"id":"da5ea89448a4506925823f4d985aabbd","key":"music","value":null}, {"id":"da5ea89448a4506925823f4d985aabbd","key":"mustache","value":null}, {"id":"53f82b1f0ff49a08ac79a9dff41d7860","key":"philosophy","value":null} ]} As promised, these are all the tags, including duplicates. Since each document gets run through the map function in isolation, it cannot know if the same key has been emitted already. At this stage, we need to live with that. To achieve uniqueness, we need a reduce: .. code-block:: javascript function(keys, values) { return true; } This reduce doesn’t do anything, but it allows us to specify a special query parameter when querying the view:: /dudes/_design/dude-data/_view/tags?group=true CouchDB replies: .. code-block:: javascript {"rows":[ {"key":"bike","value":true}, {"key":"couchdb","value":true}, {"key":"drums","value":true}, {"key":"hypertext","value":true}, {"key":"music","value":true}, {"key":"mustache","value":true}, {"key":"philosophy","value":true} ]} In this case, we can ignore the value part because it is always true, but the result includes a list of all our tags and no duplicates! With a small change we can put the reduce to good use, too. Let’s see how many of the non-unique tags are there for each tag. To calculate the tag frequency, we just use the summing up we already learned about. In the map function, we emit a 1 instead of null: .. code-block:: javascript function(doc) { if(doc.name && doc.tags) { doc.tags.forEach(function(tag) { emit(tag, 1); }); } } In the reduce function, we return the sum of all values: .. code-block:: javascript function(keys, values) { return sum(values); } Now, if we query the view with the ``?group=true`` parameter, we get back the count for each tag: .. code-block:: javascript {"rows":[ {"key":"bike","value":1}, {"key":"couchdb","value":3}, {"key":"drums","value":1}, {"key":"hypertext","value":1}, {"key":"music","value":1}, {"key":"mustache","value":1}, {"key":"philosophy","value":1} ]} Enforcing Uniqueness ==================== How you would do this in SQL:: UNIQUE KEY(column) How you can do this in CouchDB? Use case: your applications require that a certain value exists only once in a database. This is an easy one: within a CouchDB database, each document must have a unique ``_id`` field. If you require unique values in a database, just assign them to a document’s ``_id`` field and CouchDB will enforce uniqueness for you. There’s one caveat, though: in the distributed case, when you are running more than one CouchDB node that accepts write requests, uniqueness can be guaranteed only per node or outside of CouchDB. CouchDB will allow two identical IDs to be written to two different nodes. On replication, CouchDB will detect a conflict and flag the document accordingly. ����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������apache-couchdb-1.6.0/share/doc/src/couchapp/views/pagination.rst������������������������������������0000644�0001750�0000144�00000023761�12332105522�024607� 0����������������������������������������������������������������������������������������������������ustar�00djc�����������������������������users���������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������.. Licensed under the Apache License, Version 2.0 (the "License"); you may not .. use this file except in compliance with the License. You may obtain a copy of .. the License at .. .. http://www.apache.org/licenses/LICENSE-2.0 .. .. Unless required by applicable law or agreed to in writing, software .. distributed under the License is distributed on an "AS IS" BASIS, WITHOUT .. WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the .. License for the specific language governing permissions and limitations under .. the License. .. _views/pagination: ================= Pagination Recipe ================= This recipe explains how to paginate over view results. Pagination is a user interface (UI) pattern that allows the display of a large number of rows (`the result set`) without loading all the rows into the UI at once. A fixed-size subset, the `page`, is displayed along with next and previous links or buttons that can move the `viewport` over the result set to an adjacent page. We assume you’re familiar with creating and querying documents and views as well as the multiple view query options. Example Data ============ To have some data to work with, we’ll create a list of bands, one document per band:: { "name":"Biffy Clyro" } { "name":"Foo Fighters" } { "name":"Tool" } { "name":"Nirvana" } { "name":"Helmet" } { "name":"Tenacious D" } { "name":"Future of the Left" } { "name":"A Perfect Circle" } { "name":"Silverchair" } { "name":"Queens of the Stone Age" } { "name":"Kerub" } A View ======= We need a simple map function that gives us an alphabetical list of band names. This should be easy, but we’re adding extra smarts to filter out ā€œTheā€ and ā€œAā€ in front of band names to put them into the right position: .. code-block:: javascript function(doc) { if(doc.name) { var name = doc.name.replace(/^(A|The) /, ""); emit(name, null); } } The views result is an alphabetical list of band names. Now say we want to display band names five at a time and have a link pointing to the next five names that make up one page, and a link for the previous five, if we’re not on the first page. We learned how to use the ``startkey``, ``limit``, and ``skip`` parameters in earlier documents. We’ll use these again here. First, let’s have a look at the full result set: .. code-block:: javascript {"total_rows":11,"offset":0,"rows":[ {"id":"a0746072bba60a62b01209f467ca4fe2","key":"Biffy Clyro","value":null}, {"id":"b47d82284969f10cd1b6ea460ad62d00","key":"Foo Fighters","value":null}, {"id":"45ccde324611f86ad4932555dea7fce0","key":"Tenacious D","value":null}, {"id":"d7ab24bb3489a9010c7d1a2087a4a9e4","key":"Future of the Left","value":null}, {"id":"ad2f85ef87f5a9a65db5b3a75a03cd82","key":"Helmet","value":null}, {"id":"a2f31cfa68118a6ae9d35444fcb1a3cf","key":"Nirvana","value":null}, {"id":"67373171d0f626b811bdc34e92e77901","key":"Kerub","value":null}, {"id":"3e1b84630c384f6aef1a5c50a81e4a34","key":"Perfect Circle","value":null}, {"id":"84a371a7b8414237fad1b6aaf68cd16a","key":"Queens of the Stone Age","value":null}, {"id":"dcdaf08242a4be7da1a36e25f4f0b022","key":"Silverchair","value":null}, {"id":"fd590d4ad53771db47b0406054f02243","key":"Tool","value":null} ]} Setup ===== The mechanics of paging are very simple: - Display first page - If there are more rows to show, show next link - Draw subsequent page - If this is not the first page, show a previous link - If there are more rows to show, show next link Or in a pseudo-JavaScript snippet: .. code-block:: javascript var result = new Result(); var page = result.getPage(); page.display(); if(result.hasPrev()) { page.display_link('prev'); } if(result.hasNext()) { page.display_link('next'); } Paging ====== To get the first five rows from the view result, you use the ``?limit=5`` query parameter:: curl -X GET http://127.0.0.1:5984/artists/_design/artists/_view/by-name?limit=5 The result: .. code-block:: javascript {"total_rows":11,"offset":0,"rows":[ {"id":"a0746072bba60a62b01209f467ca4fe2","key":"Biffy Clyro","value":null}, {"id":"b47d82284969f10cd1b6ea460ad62d00","key":"Foo Fighters","value":null}, {"id":"45ccde324611f86ad4932555dea7fce0","key":"Tenacious D","value":null}, {"id":"d7ab24bb3489a9010c7d1a2087a4a9e4","key":"Future of the Left","value":null}, {"id":"ad2f85ef87f5a9a65db5b3a75a03cd82","key":"Helmet","value":null} ]} By comparing the ``total_rows`` value to our ``limit`` value, we can determine if there are more pages to display. We also know by the `offset` member that we are on the first page. We can calculate the value for ``skip=`` to get the results for the next page: .. code-block:: javascript var rows_per_page = 5; var page = (offset / rows_per_page) + 1; // == 1 var skip = page * rows_per_page; // == 5 for the first page, 10 for the second ... So we query CouchDB with:: curl -X GET 'http://127.0.0.1:5984/artists/_design/artists/_view/by-name?limit=5&skip=5' Note we have to use ``'`` (single quotes) to escape the ``&`` character that is special to the shell we execute curl in. The result: .. code-block:: javascript {"total_rows":11,"offset":5,"rows":[ {"id":"a2f31cfa68118a6ae9d35444fcb1a3cf","key":"Nirvana","value":null}, {"id":"67373171d0f626b811bdc34e92e77901","key":"Kerub","value":null}, {"id":"3e1b84630c384f6aef1a5c50a81e4a34","key":"Perfect Circle","value":null}, {"id":"84a371a7b8414237fad1b6aaf68cd16a","key":"Queens of the Stone Age", "value":null}, {"id":"dcdaf08242a4be7da1a36e25f4f0b022","key":"Silverchair","value":null} ]} Implementing the ``hasPrev()`` and ``hasNext()`` method is pretty straightforward: .. code-block:: javascript function hasPrev() { return page > 1; } function hasNext() { var last_page = Math.floor(total_rows / rows_per_page) + (total_rows % rows_per_page); return page != last_page; } Paging (Alternate Method) ========================= The method described above performed poorly with large skip values until CouchDB 1.2. Additionally, some use cases may call for the following alternate method even with newer versions of CouchDB. One such case is when duplicate results should be prevented. Using skip alone it is possible for new documents to be inserted during pagination which could change the offset of the start of the subsequent page. A correct solution is not much harder. Instead of slicing the result set into equally sized pages, we look at 10 rows at a time and use ``startkey`` to jump to the next 10 rows. We even use skip, but only with the value 1. Here is how it works: - Request `rows_per_page + 1` rows from the view - Display `rows_per_page` rows, `store + 1` row as `next_startkey` and `next_startkey_docid` - As page information, keep ``startkey`` and `next_startkey` - Use the `next_*` values to create the next link, and use the others to create the previous link The trick to finding the next page is pretty simple. Instead of requesting 10 rows for a page, you request 11 rows, but display only 10 and use the values in the 11th row as the ``startkey`` for the next page. Populating the link to the previous page is as simple as carrying the current ``startkey`` over to the next page. If there’s no previous ``startkey``, we are on the first page. We stop displaying the link to the next page if we get `rows_per_page` or less rows back. This is called linked list pagination, as we go from page to page, or list item to list item, instead of jumping directly to a pre-computed page. There is one caveat, though. Can you spot it? CouchDB view keys do not have to be unique; you can have multiple index entries read. What if you have more index entries for a key than rows that should be on a page? ``startkey`` jumps to the first row, and you’d be screwed if CouchDB didn’t have an additional parameter for you to use. All view keys with the same value are internally sorted by `docid`, that is, the ID of the document that created that view row. You can use the ``startkey_docid`` and ``endkey_docid`` parameters to get subsets of these rows. For pagination, we still don’t need ``endkey_docid``, but ``startkey_docid`` is very handy. In addition to ``startkey`` and ``limit``, you also use ``startkey_docid`` for pagination if, and only if, the extra row you fetch to find the next page has the same key as the current ``startkey``. It is important to note that the `*_docid` parameters only work in addition to the `*key` parameters and are only useful to further narrow down the result set of a view for a single key. They do not work on their own (the one exception being the built-in :ref:`_all_docs view <api/db/all_docs>` that already sorts by document ID). The advantage of this approach is that all the key operations can be performed on the super-fast B-tree index behind the view. Looking up a page doesn’t include scanning through hundreds and thousands of rows unnecessarily. Jump to Page ============ One drawback of the linked list style pagination is that you can’t pre-compute the rows for a particular page from the page number and the rows per page. Jumping to a specific page doesn’t really work. Our gut reaction, if that concern is raised, is, ā€œNot even Google is doing that!ā€ and we tend to get away with it. Google always pretends on the first page to find 10 more pages of results. Only if you click on the second page (something very few people actually do) might Google display a reduced set of pages. If you page through the results, you get links for the previous and next 10 pages, but no more. Pre-computing the necessary ``startkey`` and ``startkey_docid`` for 20 pages is a feasible operation and a pragmatic optimization to know the rows for every page in a result set that is potentially tens of thousands of rows long, or more. If you really do need to jump to a page over the full range of documents (we have seen applications that require that), you can still maintain an integer value index as the view index and take a hybrid approach at solving pagination. ���������������apache-couchdb-1.6.0/share/doc/src/couchapp/views/index.rst�����������������������������������������0000644�0001750�0000144�00000001531�12332105522�023554� 0����������������������������������������������������������������������������������������������������ustar�00djc�����������������������������users���������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������.. Licensed under the Apache License, Version 2.0 (the "License"); you may not .. use this file except in compliance with the License. You may obtain a copy of .. the License at .. .. http://www.apache.org/licenses/LICENSE-2.0 .. .. Unless required by applicable law or agreed to in writing, software .. distributed under the License is distributed on an "AS IS" BASIS, WITHOUT .. WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the .. License for the specific language governing permissions and limitations under .. the License. .. _views: ============== Guide to Views ============== Views are the primary tool used for querying and reporting on CouchDB documents. There you'll learn how they works and how to use them to build effective applications with CouchDB .. toctree:: intro collation joins nosql pagination �����������������������������������������������������������������������������������������������������������������������������������������������������������������������apache-couchdb-1.6.0/share/doc/src/couchapp/views/joins.rst�����������������������������������������0000644�0001750�0000144�00000033546�12332105522�023602� 0����������������������������������������������������������������������������������������������������ustar�00djc�����������������������������users���������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������.. Licensed under the Apache License, Version 2.0 (the "License"); you may not .. use this file except in compliance with the License. You may obtain a copy of .. the License at .. .. http://www.apache.org/licenses/LICENSE-2.0 .. .. Unless required by applicable law or agreed to in writing, software .. distributed under the License is distributed on an "AS IS" BASIS, WITHOUT .. WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the .. License for the specific language governing permissions and limitations under .. the License. .. _views/json: ================ Joins With Views ================ Linked Documents ================ If your :ref:`map function <mapfun>` emits an object value which has ``{'_id': XXX}`` and you :ref:`query view <api/ddoc/view>` with ``include_docs=true`` parameter, then CouchDB will fetch the document with id ``XXX`` rather than the document which was processed to emit the key/value pair. This means that if one document contains the ids of other documents, it can cause those documents to be fetched in the view too, adjacent to the same key if required. For example, if you have the following hierarchically-linked documents: .. code-block:: javascript [ { "_id": "11111" }, { "_id": "22222", "ancestors": ["11111"], "value": "hello" }, { "_id": "33333", "ancestors": ["22222","11111"], "value": "world" } ] You can emit the values with the ancestor documents adjacent to them in the view like this: .. code-block:: javascript function(doc) { if (doc.value) { emit([doc.value, 0], null); if (doc.ancestors) { for (var i in doc.ancestors) { emit([doc.value, Number(i)+1], {_id: doc.ancestors[i]}); } } } } The result you get is: .. code-block:: javascript { "total_rows": 5, "offset": 0, "rows": [ { "id": "22222", "key": [ "hello", 0 ], "value": null, "doc": { "_id": "22222", "_rev": "1-0eee81fecb5aa4f51e285c621271ff02", "ancestors": [ "11111" ], "value": "hello" } }, { "id": "22222", "key": [ "hello", 1 ], "value": { "_id": "11111" }, "doc": { "_id": "11111", "_rev": "1-967a00dff5e02add41819138abb3284d" } }, { "id": "33333", "key": [ "world", 0 ], "value": null, "doc": { "_id": "33333", "_rev": "1-11e42b44fdb3d3784602eca7c0332a43", "ancestors": [ "22222", "11111" ], "value": "world" } }, { "id": "33333", "key": [ "world", 1 ], "value": { "_id": "22222" }, "doc": { "_id": "22222", "_rev": "1-0eee81fecb5aa4f51e285c621271ff02", "ancestors": [ "11111" ], "value": "hello" } }, { "id": "33333", "key": [ "world", 2 ], "value": { "_id": "11111" }, "doc": { "_id": "11111", "_rev": "1-967a00dff5e02add41819138abb3284d" } } ] } which makes it very cheap to fetch a document plus all its ancestors in one query. Note that the ``"id"`` in the row is still that of the originating document. The only difference is that ``include_docs`` fetches a different doc. The current revision of the document is resolved at query time, not at the time the view is generated. This means that if a new revision of the linked document is added later, it will appear in view queries even though the view itself hasn't changed. To force a specific revision of a linked document to be used, emit a ``"_rev"`` property as well as ``"_id"``. Using View Collation ==================== :Author: Christopher Lenz :Date: 2007-10-05 :Source: http://www.cmlenz.net/archives/2007/10/couchdb-joins Just today, there was a discussion on IRC how you'd go about modeling a simple blogging system with ā€œpostā€ and ā€œcommentā€ entities, where any blog post might have N comments. If you'd be using an SQL database, you'd obviously have two tables with foreign keys and you'd be using joins. (At least until you needed to add some `denormalization`_). .. _denormalization: http://en.wikipedia.org/wiki/Denormalization But what would the ā€œobviousā€ approach in CouchDB look like? Approach #1: Comments Inlined ----------------------------- A simple approach would be to have one document per blog post, and store the comments inside that document: .. code-block:: javascript { "_id": "myslug", "_rev": "123456", "author": "john", "title": "My blog post", "content": "Bla bla bla …", "comments": [ {"author": "jack", "content": "…"}, {"author": "jane", "content": "…"} ] } .. note:: Of course the model of an actual blogging system would be more extensive, you'd have tags, timestamps, etc etc. This is just to demonstrate the basics. The obvious advantage of this approach is that the data that belongs together is stored in one place. Delete the post, and you automatically delete the corresponding comments, and so on. You may be thinking that putting the comments inside the blog post document would not allow us to query for the comments themselves, but you'd be wrong. You could trivially write a CouchDB view that would return all comments across all blog posts, keyed by author: .. code-block:: javascript function(doc) { for (var i in doc.comments) { emit(doc.comments[i].author, doc.comments[i].content); } } Now you could list all comments by a particular user by invoking the view and passing it a ``?key="username"`` query string parameter. However, this approach has a drawback that can be quite significant for many applications: To add a comment to a post, you need to: - Fetch the blog post document - Add the new comment to the JSON structure - Send the updated document to the server Now if you have multiple client processes adding comments at roughly the same time, some of them will get a `HTTP 409 Conflict` error on step 3 (that's optimistic concurrency in action). For some applications this makes sense, but in many other apps, you'd want to append new related data regardless of whether other data has been added in the meantime. The only way to allow non-conflicting addition of related data is by putting that related data into separate documents. Approach #2: Comments Separate ------------------------------ Using this approach you'd have one document per blog post, and one document per comment. The comment documents would have a ā€œbacklinkā€ to the post they belong to. The blog post document would look similar to the above, minus the comments property. Also, we'd now have a type property on all our documents so that we can tell the difference between posts and comments: .. code-block:: javascript { "_id": "myslug", "_rev": "123456", "type": "post", "author": "john", "title": "My blog post", "content": "Bla bla bla …" } The comments themselves are stored in separate documents, which also have a type property (this time with the value ā€œcommentā€), and in addition feature a post property containing the ID of the post document they belong to: .. code-block:: javascript { "_id": "ABCDEF", "_rev": "123456", "type": "comment", "post": "myslug", "author": "jack", "content": "…" } .. code-block:: javascript { "_id": "DEFABC", "_rev": "123456", "type": "comment", "post": "myslug", "author": "jane", "content": "…" } To list all comments per blog post, you'd add a simple view, keyed by blog post ID: .. code-block:: javascript function(doc) { if (doc.type == "comment") { emit(doc.post, {author: doc.author, content: doc.content}); } } And you'd invoke that view passing it a ``?key="post_id"`` query string parameter. Viewing all comments by author is just as easy as before: .. code-block:: javascript function(doc) { if (doc.type == "comment") { emit(doc.author, {post: doc.post, content: doc.content}); } } So this is better in some ways, but it also has a disadvantage. Imagine you want to display a blog post with all the associated comments on the same web page. With our first approach, we needed just a single request to the CouchDB server, namely a ``GET`` request to the document. With this second approach, we need two requests: a ``GET`` request to the post document, and a ``GET`` request to the view that returns all comments for the post. That is okay, but not quite satisfactory. Just imagine you wanted to added threaded comments: you'd now need an additional fetch per comment. What we'd probably want then would be a way to join the blog post and the various comments together to be able to retrieve them with a single HTTP request. This was when Damien Katz, the author of CouchDB, chimed in to the discussion on IRC to show us the way. Optimization: Using the Power of View Collation ----------------------------------------------- Obvious to Damien, but not at all obvious to the rest of us: it's fairly simple to make a view that includes both the content of the blog post document, and the content of all the comments associated with that post. The way you do that is by using `complex keys`. Until now we've been using simple string values for the view keys, but in fact they can be arbitrary JSON values, so let's make some use of that: .. code-block:: javascript function(doc) { if (doc.type == "post") { emit([doc._id, 0], doc); } else if (doc.type == "comment") { emit([doc.post, 1], doc); } } Okay, this may be confusing at first. Let's take a step back and look at what views in CouchDB are really about. CouchDB views are basically highly efficient on-disk dictionaries that map keys to values, where the key is automatically indexed and can be used to filter and/or sort the results you get back from your views. When you ā€œinvokeā€ a view, you can say that you're only interested in a subset of the view rows by specifying a ``?key=foo`` query string parameter. Or you can specify ``?startkey=foo`` and/or ``?endkey=bar`` query string parameters to fetch rows over a range of keys. It's also important to note that keys are always used for collating (i.e. sorting) the rows. CouchDB has well defined (but as of yet undocumented) rules for comparing arbitrary JSON objects for collation. For example, the JSON value ``["foo", 2]`` is sorted after (considered ā€œgreater thanā€) the values ``["foo"]`` or ``["foo", 1, "bar"]``, but before e.g. ``["foo", 2, "bar"]``. This feature enables a whole class of tricks that are rather non-obvious... .. seealso:: :ref:`views/collation` With that in mind, let's return to the view function above. First note that, unlike the previous view functions we've used here, this view handles both "post" and "comment" documents, and both of them end up as rows in the same view. Also, the key in this view is not just a simple string, but an array. The first element in that array is always the ID of the post, regardless of whether we're processing an actual post document, or a comment associated with a post. The second element is 0 for post documents, and 1 for comment documents. Let's assume we have two blog posts in our database. Without limiting the view results via ``key``, ``startkey``, or ``endkey``, we'd get back something like the following: .. code-block:: javascript { "total_rows": 5, "offset": 0, "rows": [{ "id": "myslug", "key": ["myslug", 0], "value": {...} }, { "id": "ABCDEF", "key": ["myslug", 1], "value": {...} }, { "id": "DEFABC", "key": ["myslug", 1], "value": {...} }, { "id": "other_slug", "key": ["other_slug", 0], "value": {...} }, { "id": "CDEFAB", "key": ["other_slug", 1], "value": {...} }, ] } .. note:: The ``...`` placeholder here would contain the complete JSON encoding of the corresponding document Now, to get a specific blog post and all associated comments, we'd invoke that view with the query string:: ?startkey=["myslug"]&endkey;=["myslug", 2] We'd get back the first three rows, those that belong to the ``myslug`` post, but not the others. Et voila, we now have the data we need to display a post with all associated comments, retrieved via a single ``GET`` request. You may be asking what the 0 and 1 parts of the keys are for. They're simply to ensure that the post document is always sorted before the the associated comment documents. So when you get back the results from this view for a specific post, you'll know that the first row contains the data for the blog post itself, and the remaining rows contain the comment data. One remaining problem with this model is that comments are not ordered, but that's simply because we don't have date/time information associated with them. If we had, we'd add the timestamp as third element of the key array, probably as ISO date/time strings. Now we would continue using the query string ``?startkey=["myslug"]&endkey=["myslug", 2]`` to fetch the blog post and all associated comments, only now they'd be in chronological order. ����������������������������������������������������������������������������������������������������������������������������������������������������������apache-couchdb-1.6.0/share/doc/src/couchapp/ddocs.rst�����������������������������������������������0000644�0001750�0000144�00000063470�12332105522�022416� 0����������������������������������������������������������������������������������������������������ustar�00djc�����������������������������users���������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������.. Licensed under the Apache License, Version 2.0 (the "License"); you may not .. use this file except in compliance with the License. You may obtain a copy of .. the License at .. .. http://www.apache.org/licenses/LICENSE-2.0 .. .. Unless required by applicable law or agreed to in writing, software .. distributed under the License is distributed on an "AS IS" BASIS, WITHOUT .. WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the .. License for the specific language governing permissions and limitations under .. the License. .. default-domain:: js .. _ddocs: ================ Design Functions ================ In this section we'll show how to write design documents, using the built-in :ref:`JavaScript Query Server <query-server/js>`. But before we start to write our first function, let's take a look at the list of common objects that will be used during our code journey - we'll be using them extensively within each function: - :ref:`Database information object <dbinfo_object>` - :ref:`Request object <request_object>` - :ref:`Response object <response_object>` - :ref:`UserCtx object <userctx_object>` - :ref:`Database Security object <security_object>` - :ref:`Guide to JavaScript Query Server <query-server/js>` .. _viewfun: View functions ============== Views are the primary tool used for querying and reporting on CouchDB databases. .. _mapfun: Map functions ------------- .. function:: mapfun(doc) :param doc: Processed document object. Map functions accept a single document as the argument and (optionally) :func:`emit` key/value pairs that are stored in a view. .. code-block:: javascript function (doc) { if (doc.type === 'post' && doc.tags && Array.isArray(doc.tags)) { doc.tags.forEach(function (tag) { emit(tag.toLowerCase(), 1); }); } } In this example a key/value pair is emitted for each value in the `tags` array of a document with a `type` of "post". Note that :func:`emit` may be called many times for a single document, so the same document may be available by several different keys. Also keep in mind that each document is *sealed* to prevent situation when one map function changes document state and the other one received a modified version. For efficiency reasons, documents are passed to a group of map functions - each document is processed by group of map functions from all views of related design document. This means that if you trigger index update for one view in ddoc, all others will get updated too. Since `1.1.0` release `map` function supports :ref:`CommonJS <commonjs>` modules and access to :func:`require` function. .. _reducefun: Reduce and rereduce functions ----------------------------- .. function:: redfun(keys, values[, rereduce]) :param keys: Array of pairs docid-key for related map function result. Always ``null`` if rereduce is running (has ``true`` value). :param values: Array of map function result values. :param rereduce: Boolean sign of rereduce run. :return: Reduces `values` Reduce functions takes two required arguments of keys and values lists - the result of the related map function - and optional third one which indicates if `rereduce` mode is active or not. `Rereduce` is using for additional reduce values list, so when it is ``true`` there is no information about related `keys` (first argument is ``null``). Note, that if produced result by `reduce` function is longer than initial values list then a Query Server error will be raised. However, this behavior could be disabled by setting ``reduce_limit`` config option to ``false``: .. code-block:: ini [query_server_config] reduce_limit = false While disabling ``reduce_limit`` might be useful for debug proposes, remember, that main task of reduce functions is to *reduce* mapped result, not to make it even bigger. Generally, your reduce function should converge rapidly to a single value - which could be an array or similar object. .. _reducefun/builtin: Builtin reduce functions ^^^^^^^^^^^^^^^^^^^^^^^^ Additionally, CouchDB has three built-in reduce functions. These are implemented in Erlang and runs inside CouchDB, so they are much faster than the equivalent JavaScript functions: ``_sum``, ``_count`` and ``_stats``. Their equivalents in JavaScript below: .. code-block:: javascript // could be replaced by _sum function(keys, values) { return sum(values); } // could be replaced by _count function(keys, values, rereduce) { if (rereduce) { return sum(values); } else { return values.length; } } // could be replaced by _stats function(keys, values, rereduce) { if (rereduce) { return { 'sum': values.reduce(function(a, b) { return a + b.sum }, 0), 'min': values.reduce(function(a, b) { return Math.min(a, b.min) }, Infinity), 'max': values.reduce(function(a, b) { return Math.max(a, b.max) }, -Infinity), 'count': values.reduce(function(a, b) { return a + b.count }, 0), 'sumsqr': values.reduce(function(a, b) { return a + b.sumsqr }, 0) } } else { return { 'sum': sum(values), 'min': Math.min.apply(null, values), 'max': Math.max.apply(null, values), 'count': values.length, 'sumsqr': (function() { var sumsqr = 0; values.forEach(function (value) { sumsqr += value * value; }); return sumsqr; })(), } } } .. note:: **Why don't reduce functions support CommonJS modules?** While `map` functions have limited access to stored modules through :func:`require` function there is no such feature for `reduce` functions. The reason lies deep inside in mechanism how `map` and `reduce` functions are processed by Query Server. Let's take a look on `map` functions first: #. CouchDB sends all `map` functions for processed design document to Query Server. #. Query Server handles them one by one, compiles and puts them onto an internal stack. #. After all `map` functions had been processed, CouchDB will send the remaining documents to index one by one. #. The Query Server receives the document object and applies it to every function from the stack. The emitted results are then joined into a single array and sent back to CouchDB. Now let's see how `reduce` functions are handled: #. CouchDB sends *as single command* list of available `reduce` functions with result list of key-value pairs that was previously received as result of `map` functions work. #. Query Server compiles reduce functions and applies them to key-value lists. Reduced result sends back to CouchDB. As you may note, `reduce` functions been applied in single shot while `map` ones are applied in an iterative way per each document. This means that it's possible for `map` functions to precompile CommonJS libraries and use them during the entire view processing, but for `reduce` functions it will be compiled again and again for each view result reduction, which will lead to performance degradation (`reduce` function are already does hard work to make large result smaller). .. _showfun: Show functions ============== .. function:: showfun(doc, req) :param doc: Processed document, may be omitted. :param req: :ref:`Request object <request_object>`. :return: :ref:`Response object <response_object>` :rtype: object or string Show functions are used to represent documents in various formats, commonly as HTML page with nicer formatting. They can also be used to run server-side functions without requiring a pre-existing document. Basic example of show function could be: .. code-block:: javascript function(doc, req){ if (doc) { return "Hello from " + doc._id + "!"; } else { return "Hello, world!"; } } Also, there is more simple way to return json encoded data: .. code-block:: javascript function(doc, req){ return { 'json': { 'id': doc['_id'], 'rev': doc['_rev'] } } } and even files (this one is CouchDB logo): .. code-block:: javascript function(doc, req){ return { 'headers': { 'Content-Type' : 'image/png', }, 'base64': ''.concat( 'iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAMAAAAoLQ9TAAAAsV', 'BMVEUAAAD////////////////////////5ur3rEBn////////////////wDBL/', 'AADuBAe9EB3IEBz/7+//X1/qBQn2AgP/f3/ilpzsDxfpChDtDhXeCA76AQH/v7', '/84eLyWV/uc3bJPEf/Dw/uw8bRWmP1h4zxSlD6YGHuQ0f6g4XyQkXvCA36MDH6', 'wMH/z8/yAwX64ODeh47BHiv/Ly/20dLQLTj98PDXWmP/Pz//39/wGyJ7Iy9JAA', 'AADHRSTlMAbw8vf08/bz+Pv19jK/W3AAAAg0lEQVR4Xp3LRQ4DQRBD0QqTm4Y5', 'zMxw/4OleiJlHeUtv2X6RbNO1Uqj9g0RMCuQO0vBIg4vMFeOpCWIWmDOw82fZx', 'vaND1c8OG4vrdOqD8YwgpDYDxRgkSm5rwu0nQVBJuMg++pLXZyr5jnc1BaH4GT', 'LvEliY253nA3pVhQqdPt0f/erJkMGMB8xucAAAAASUVORK5CYII=') } } But what if you need to represent data in different formats via a single function? Functions :func:`registerType` and :func:`provides` are your the best friends in that question: .. code-block:: javascript function(doc, req){ provides('json', function(){ return {'json': doc} }); provides('html', function(){ return '<pre>' + toJSON(doc) + '</pre>' }) provides('xml', function(){ return { 'headers': {'Content-Type': 'application/xml'}, 'body' : ''.concat( '<?xml version="1.0" encoding="utf-8"?>\n', '<doc>', (function(){ escape = function(s){ return s.replace(/"/g, '"') .replace(/>/g, '>') .replace(/</g, '<') .replace(/&/g, '&'); }; var content = ''; for(var key in doc){ if(!doc.hasOwnProperty(key)) continue; var value = escape(toJSON(doc[key])); var key = escape(key); content += ''.concat( '<' + key + '>', value '</' + key + '>' ) } return content; })(), '</doc>' ) } }) registerType('text-json', 'text/json') provides('text-json', function(){ return toJSON(doc); }) } This function may return `html`, `json` , `xml` or our custom `text json` format representation of same document object with same processing rules. Probably, the `xml` provider in our function needs more care to handle nested objects correctly, and keys with invalid characters, but you've got the idea! .. seealso:: CouchDB Wiki: - `Showing Documents <http://wiki.apache.org/couchdb/Formatting_with_Show_and_List#Showing_Documents>`_ CouchDB Guide: - `Show Functions <http://guide.couchdb.org/editions/1/en/show.html>`_ .. _listfun: List functions ============== .. function:: listfun(head, req) :param head: :ref:`view_head_info_object` :param req: :ref:`Request object <request_object>`. :return: Last chunk. :rtype: string While :ref:`showfun` are used to customize document presentation, :ref:`listfun` are used for same purpose, but against :ref:`viewfun` results. The next list function formats view and represents it as a very simple HTML page: .. code-block:: javascript function(head, req){ start({ 'headers': { 'Content-Type': 'text/html' } }); send('<html><body><table>'); send('<tr><th>ID</th><th>Key</th><th>Value</th></tr>') while(row = getRow()){ send(''.concat( '<tr>', '<td>' + toJSON(row.id) + '</td>', '<td>' + toJSON(row.key) + '</td>', '<td>' + toJSON(row.value) + '</td>', '</tr>' )); } send('</table></body></html>'); } Templates and styles could obviously be used to present data in a nicer fashion, but this is an excellent starting point. Note that you may also use :func:`registerType` and :func:`provides` functions in the same way as for :ref:`showfun`! .. seealso:: CouchDB Wiki: - `Listing Views with CouchDB 0.10 and later <http://wiki.apache.org/couchdb/Formatting_with_Show_and_List#Listing_Views_with_CouchDB_0.10_and_later>`_ CouchDB Guide: - `Transforming Views with List Functions <http://guide.couchdb.org/draft/transforming.html>`_ .. _updatefun: Update functions ================ .. function:: updatefun(doc, req) :param doc: Update function target document. :param req: :ref:`request_object` :returns: Two-element array: the first element is the (updated or new) document, which is committed to the database. If the first element is ``null`` no document will be committed to the database. If you are updating an existing, it should already have an ``_id`` set, and if you are creating a new document, make sure to set its ``_id`` to something, either generated based on the input or the ``req.uuid`` provided. The second element is the response that will be sent back to the caller. Update handlers are functions that clients can request to invoke server-side logic that will create or update a document. This feature allows a range of use cases such as providing a server-side last modified timestamp, updating individual fields in a document without first getting the latest revision, etc. When the request to an update handler includes a document ID in the URL, the server will provide the function with the most recent version of that document. You can provide any other values needed by the update handler function via the ``POST``/``PUT`` entity body or query string parameters of the request. The basic example that demonstrates all use-cases of update handlers below: .. code-block:: javascript function(doc, req){ if (!doc){ if ('id' in req && req['id']){ // create new document return [{'_id': req['id']}, 'New World'] } // change nothing in database return [null, 'Empty World'] } doc['world'] = 'hello'; doc['edited_by'] = req['userCtx']['name'] return [doc, 'Edited World!'] } .. seealso:: CouchDB Wiki: - `Document Update Handlers <http://wiki.apache.org/couchdb/Document_Update_Handlers>`_ .. _filterfun: Filter functions ================ .. function:: filterfun(doc, req) :param doc: Processed document object. :param req: :ref:`request_object` :return: Boolean value: ``true`` means that `doc` passes the filter rules, ``false`` means that it does not. Filter functions mostly act like :ref:`showfun` and :ref:`listfun`: they format, or *filter* the :ref:`changes feed<changes>`. Classic filters --------------- By default the changes feed emits all database documents changes. But if you're waiting for some special changes, processing all documents is inefficient. Filters are special design document functions that allow the changes feed to emit only specific documents that pass filter rules. Let's assume that our database is a mailbox and we need to handle only new mail events (documents with status `new`). Our filter function will look like this: .. code-block:: javascript function(doc, req){ // we need only `mail` documents if (doc.type != 'mail'){ return false; } // we're interested only in `new` ones if (doc.status != 'new'){ return false; } return true; // passed! } Ā  Filter functions must return ``true`` if a document passed all defined rules. Now, if you apply this function to the changes feed it will emit only changes about "new mails":: GET /somedatabase/_changes?filter=mailbox/new_mail HTTP/1.1 .. code-block:: javascript {"results":[ {"seq":1,"id":"df8eca9da37dade42ee4d7aa3401f1dd","changes":[{"rev":"1-c2e0085a21d34fa1cecb6dc26a4ae657"}]}, {"seq":7,"id":"df8eca9da37dade42ee4d7aa34024714","changes":[{"rev":"1-29d748a6e87b43db967fe338bcb08d74"}]}, ], "last_seq":27} Note that the value of ``last_seq`` is 27, but we'd received only two records. Seems like any other changes were for documents that haven't passed our filter. We probably need to filter the changes feed of our mailbox by more than a single status value. We're also interested in statuses like "spam" to update spam-filter heuristic rules, "outgoing" to let a mail daemon actually send mails, and so on. Creating a lot of similar functions that actually do similar work isn't good idea - so we need a dynamic filter. You may have noticed that filter functions take a second argument named :ref:`request <request_object>` - it allows creating dynamic filters based on query parameters, :ref:`user context <userctx_object>` and more. The dynamic version of our filter looks like this: .. code-block:: javascript function(doc, req){ // we need only `mail` documents if (doc.type != 'mail'){ return false; } // we're interested only in requested status if (doc.status != req.query.status){ return false; } return true; // passed! } and now we have passed the `status` query parameter in request to let our filter match only required documents:: GET /somedatabase/_changes?filter=mailbox/by_status&status=new HTTP/1.1 .. code-block:: javascript {"results":[ {"seq":1,"id":"df8eca9da37dade42ee4d7aa3401f1dd","changes":[{"rev":"1-c2e0085a21d34fa1cecb6dc26a4ae657"}]}, {"seq":7,"id":"df8eca9da37dade42ee4d7aa34024714","changes":[{"rev":"1-29d748a6e87b43db967fe338bcb08d74"}]}, ], "last_seq":27} and we can easily change filter behavior with:: GET /somedatabase/_changes?filter=mailbox/by_status&status=spam HTTP/1.1 .. code-block:: javascript {"results":[ {"seq":11,"id":"8960e91220798fc9f9d29d24ed612e0d","changes":[{"rev":"3-cc6ff71af716ddc2ba114967025c0ee0"}]}, ], "last_seq":27} Combining filters with a `continuous` feed allows creating powerful event-driven systems. .. _viewfilter: View filters ------------ View filters are the same as above, with one small difference: they use views `map` function instead to `filter` one to process the changes feed. Each time when a key-value pair could be emitted, a change is returned. This allows to avoid creating filter functions that are mostly does same works as views. To use them just specify `_view` value for ``filter`` parameter and `designdoc/viewname` for ``view`` one:: GET /somedatabase/_changes?filter=_view&view=dname/viewname HTTP/1.1 .. note:: Since view filters uses `map` functions as filters, they can't show any dynamic behavior since :ref:`request object<request_object>` is not available. .. seealso:: CouchDB Guide: - `Guide to filter change notification <http://guide.couchdb.org/draft/notifications.html#filters>`_ CouchDB Wiki: - `Filtered replication <http://wiki.apache.org/couchdb/Replication#Filtered_Replication>`_ .. _vdufun: Validate document update functions ================================== .. function:: validatefun(newDoc, oldDoc, userCtx, secObj) :param newDoc: New version of document that will be stored. :param oldDoc: Previous version of document that is already stored. :param userCtx: :ref:`userctx_object` :param secObj: :ref:`security_object` :throws: ``forbidden`` error to gracefully prevent document storing. :throws: ``unauthorized`` error to prevent storage and allow the user to re-auth. A design document may contain a function named `validate_doc_update` which can be used to prevent invalid or unauthorized document update requests from being stored. The function is passed the new document from the update request, the current document stored in the database, a :ref:`userctx_object` containing information about the user writing the document (if present), and a :ref:`security_object` with lists of database security roles. Validation functions typically examine the structure of the new document to ensure that required fields are present and to verify that the requesting user should be allowed to make changes to the document properties. For example, an application may require that a user must be authenticated in order to create a new document or that specific document fields be present when a document is updated. The validation function can abort the pending document write by throwing one of two error objects: .. code-block:: javascript // user is not authorized to make the change but may re-authenticate throw({ unauthorized: 'Error message here.' }); // change is not allowed throw({ forbidden: 'Error message here.' }); Document validation is optional, and each design document in the database may have at most one validation function. When a write request is received for a given database, the validation function in each design document in that database is called in an unspecified order. If any of the validation functions throw an error, the write will not succeed. **Example**: The ``_design/_auth`` ddoc from `_users` database uses a validation function to ensure that documents contain some required fields and are only modified by a user with the ``_admin`` role: .. code-block:: javascript function(newDoc, oldDoc, userCtx, secObj) { if (newDoc._deleted === true) { // allow deletes by admins and matching users // without checking the other fields if ((userCtx.roles.indexOf('_admin') !== -1) || (userCtx.name == oldDoc.name)) { return; } else { throw({forbidden: 'Only admins may delete other user docs.'}); } } if ((oldDoc && oldDoc.type !== 'user') || newDoc.type !== 'user') { throw({forbidden : 'doc.type must be user'}); } // we only allow user docs for now if (!newDoc.name) { throw({forbidden: 'doc.name is required'}); } if (!newDoc.roles) { throw({forbidden: 'doc.roles must exist'}); } if (!isArray(newDoc.roles)) { throw({forbidden: 'doc.roles must be an array'}); } if (newDoc._id !== ('org.couchdb.user:' + newDoc.name)) { throw({ forbidden: 'Doc ID must be of the form org.couchdb.user:name' }); } if (oldDoc) { // validate all updates if (oldDoc.name !== newDoc.name) { throw({forbidden: 'Usernames can not be changed.'}); } } if (newDoc.password_sha && !newDoc.salt) { throw({ forbidden: 'Users with password_sha must have a salt.' + 'See /_utils/script/couch.js for example code.' }); } var is_server_or_database_admin = function(userCtx, secObj) { // see if the user is a server admin if(userCtx.roles.indexOf('_admin') !== -1) { return true; // a server admin } // see if the user a database admin specified by name if(secObj && secObj.admins && secObj.admins.names) { if(secObj.admins.names.indexOf(userCtx.name) !== -1) { return true; // database admin } } // see if the user a database admin specified by role if(secObj && secObj.admins && secObj.admins.roles) { var db_roles = secObj.admins.roles; for(var idx = 0; idx < userCtx.roles.length; idx++) { var user_role = userCtx.roles[idx]; if(db_roles.indexOf(user_role) !== -1) { return true; // role matches! } } } return false; // default to no admin } if (!is_server_or_database_admin(userCtx, secObj)) { if (oldDoc) { // validate non-admin updates if (userCtx.name !== newDoc.name) { throw({ forbidden: 'You may only update your own user document.' }); } // validate role updates var oldRoles = oldDoc.roles.sort(); var newRoles = newDoc.roles.sort(); if (oldRoles.length !== newRoles.length) { throw({forbidden: 'Only _admin may edit roles'}); } for (var i = 0; i < oldRoles.length; i++) { if (oldRoles[i] !== newRoles[i]) { throw({forbidden: 'Only _admin may edit roles'}); } } } else if (newDoc.roles.length > 0) { throw({forbidden: 'Only _admin may set roles'}); } } // no system roles in users db for (var i = 0; i < newDoc.roles.length; i++) { if (newDoc.roles[i][0] === '_') { throw({ forbidden: 'No system roles (starting with underscore) in users db.' }); } } // no system names as names if (newDoc.name[0] === '_') { throw({forbidden: 'Username may not start with underscore.'}); } var badUserNameChars = [':']; for (var i = 0; i < badUserNameChars.length; i++) { if (newDoc.name.indexOf(badUserNameChars[i]) >= 0) { throw({forbidden: 'Character `' + badUserNameChars[i] + '` is not allowed in usernames.'}); } } } .. note:: The ``return`` statement used only for function, it has no impact on the validation process. .. seealso:: CouchDB Guide: - `Validation Functions <http://guide.couchdb.org/editions/1/en/validation.html>`_ CouchDB Wiki: - `Document Update Validation <http://wiki.apache.org/couchdb/Document_Update_Validation>`_ ��������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������apache-couchdb-1.6.0/share/doc/src/couchapp/index.rst�����������������������������������������������0000644�0001750�0000144�00000001741�12332105522�022422� 0����������������������������������������������������������������������������������������������������ustar�00djc�����������������������������users���������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������.. Licensed under the Apache License, Version 2.0 (the "License"); you may not .. use this file except in compliance with the License. You may obtain a copy of .. the License at .. .. http://www.apache.org/licenses/LICENSE-2.0 .. .. Unless required by applicable law or agreed to in writing, software .. distributed under the License is distributed on an "AS IS" BASIS, WITHOUT .. WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the .. License for the specific language governing permissions and limitations under .. the License. .. _couchapp: ======== CouchApp ======== `CouchApps`_ are web applications served directly from CouchDB, mostly driven by JavaScript and HTML5. If you can fit your application into those constraints, then you get CouchDB's scalability and flexibility "for free" (and deploying your app is as simple as replicating it to the production server). .. _CouchApps: http://couchapp.org/ .. toctree:: :maxdepth: 2 ddocs views/index �������������������������������apache-couchdb-1.6.0/share/doc/src/about.rst��������������������������������������������������������0000644�0001750�0000144�00000001324�12332105522�020620� 0����������������������������������������������������������������������������������������������������ustar�00djc�����������������������������users���������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������.. Licensed under the Apache License, Version 2.0 (the "License"); you may not .. use this file except in compliance with the License. You may obtain a copy of .. the License at .. .. http://www.apache.org/licenses/LICENSE-2.0 .. .. Unless required by applicable law or agreed to in writing, software .. distributed under the License is distributed on an "AS IS" BASIS, WITHOUT .. WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the .. License for the specific language governing permissions and limitations under .. the License. .. _about: =========================== About CouchDB Documentation =========================== License ======= .. literalinclude:: ../../../LICENSE :lines: 1-202 ������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������apache-couchdb-1.6.0/share/doc/src/replication/�����������������������������������������������������0000755�0001750�0000144�00000000000�12332106072�021266� 5����������������������������������������������������������������������������������������������������ustar�00djc�����������������������������users���������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������apache-couchdb-1.6.0/share/doc/src/replication/intro.rst��������������������������������������������0000644�0001750�0000144�00000010201�12332105522�023144� 0����������������������������������������������������������������������������������������������������ustar�00djc�����������������������������users���������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������.. Licensed under the Apache License, Version 2.0 (the "License"); you may not .. use this file except in compliance with the License. You may obtain a copy of .. the License at .. .. http://www.apache.org/licenses/LICENSE-2.0 .. .. Unless required by applicable law or agreed to in writing, software .. distributed under the License is distributed on an "AS IS" BASIS, WITHOUT .. WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the .. License for the specific language governing permissions and limitations under .. the License. .. _replication/intro: Introduction Into Replications ============================== One of CouchDB's strengths is the ability to synchronize two copies of the same database. This enables users to distribute data across several nodes or datacenters, but also to move data more closely to clients. Replication involves a source and a destination database, which can be one the same or on different CouchDB instances. The aim of the replication is that at the end of the process, all active documents on the source database are also in the destination database and all documents that were deleted in the source databases are also deleted on the destination database (if they even existed). Triggering Replication ---------------------- Replication is controlled through documents in the :ref:`replicator`, where each document describes one replication process (see :ref:`replication-settings`). A replication is triggered by storing a replication document in the replicator database. Its status can be inspected through the active tasks API (see :ref:`api/server/active_tasks` and :ref:`replication-status`). A replication can be stopped by deleting the document, or by updating it with its `cancel` property set to `true`. Replication Procedure --------------------- During replication, CouchDB will compare the source and the destination database to determine which documents differ between the source and the destination database. It does so by following the :ref:`changes` on the source and comparing the documents to the destination. Changes are submitted to the destination in batches where they can introduce conflicts. Documents that already exist on the destination in the same revision are not transferred. As the deletion of documents is represented by a new revision, a document deleted on the source will also be deleted on the target. A replication task will finish once it reaches the end of the changes feed. If its `continuous` property is set to true, it will wait for new changes to appear until the task is cancelled. Replication tasks also create checkpoint documents on the destination to ensure that a restarted task can continue from where it stopped, for example after it has crashed. When a replication task is initiated on the sending node, it is called *push* replication, if it is initiated by the receiving node, it is called *pull* replication. Master - Master replication --------------------------- One replication task will only transfer changes in one direction. To achieve master-master replication it is possible to set up two replication tasks in different directions. When a change is replication from database A to B by the first task, the second will discover that the new change on B already exists in A and will wait for further changes. Controlling which Documents to Replicate ---------------------------------------- There are two ways for controlling which documents are replicated, and which are skipped. *Local* documents are never replicated (see :ref:`api/local`). Additionally, :ref:`filterfun` can be used in a replication documents (see :ref:`replication-settings`). The replication task will then evaluate the filter function for each document in the changes feed. The document will only be replicated if the filter returns `true`. Migrating Data to Clients ------------------------- Replication can be especially useful for bringing data closer to clients. `PouchDB <http://pouchdb.com/>`_ implements the replication algorithm of CouchDB in JavaScript, making it possible to make data from a CouchDB database available in an offline browser application, and synchronize changes back to CouchDB. �����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������apache-couchdb-1.6.0/share/doc/src/replication/protocol.rst�����������������������������������������0000644�0001750�0000144�00000014326�12332105522�023666� 0����������������������������������������������������������������������������������������������������ustar�00djc�����������������������������users���������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������.. Licensed under the Apache License, Version 2.0 (the "License"); you may not .. use this file except in compliance with the License. You may obtain a copy of .. the License at .. .. http://www.apache.org/licenses/LICENSE-2.0 .. .. Unless required by applicable law or agreed to in writing, software .. distributed under the License is distributed on an "AS IS" BASIS, WITHOUT .. WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the .. License for the specific language governing permissions and limitations under .. the License. .. _replication/protocol: ============================ CouchDB Replication Protocol ============================ The **CouchDB Replication protocol** is a protocol for synchronizing documents between 2 peers over HTTP/1.1. Language -------- The key words "MUST", "MUST NOT", "REQUIRED", "SHALL", "SHALL NOT", "SHOULD", "SHOULD NOT", "RECOMMENDED", "MAY", and "OPTIONAL" in this document are to be interpreted as described in :rfc:`2119`. Goals ----- The CouchDB Replication protocol is a synchronization protocol for synchronizing documents between 2 peers over HTTP/1.1. In theory the CouchDB protocol can be used between products that implement it. However the reference implementation, written in Erlang_, is provided by the couch_replicator_ module available in Apache CouchDB. The CouchDB_ replication protocol is using the `CouchDB REST API <http://wiki.apache.org/couchdb/Reference>`_ and so is based on HTTP and the Apache CouchDB MVCC Data model. The primary goal of this specification is to describe the CouchDB replication algorithm. Definitions ----------- ID: An identifier (could be an UUID) as described in :rfc:`4122` Sequence: An ID provided by the changes feed. It can be numeric but not necessarily. Revision: (to define) Document A document is JSON entity with a unique ID and revision. Database A collection of documents with a unique URI URI An uri is defined by the :rfc:`2396` . It can be an URL as defined in :rfc:`1738`. Source Database from where the Documents are replicated Target Database where the Document are replicated Checkpoint Last source sequence ID Algorithm --------- 1. Get unique identifiers for the Source and Target based on their URI if replication task ID is not available. 2. Save this identifier in a special Document named `_local/<uniqueid>` on the Target database. This document isn't replicated. It will collect the last Source sequence ID, the Checkpoint, from the previous replication process. 3. Get the Source changes feed by passing it the Checkpoint using the `since` parameter by calling the `/<source>/_changes` URL. The changes feed only return a list of current revisions. .. note:: This step can be done continuously using the `feed=longpoll` or `feed=continuous` parameters. Then the feed will continuously get the changes. 4. Collect a group of Document/Revisions ID pairs from the **changes feed** and send them to the target databases on the `/<target>/_revs_diffs` URL. The result will contain the list of revisions **NOT** in the Target. 5. GET each revisions from the source Database by calling the URL `/<source>/<docid>?revs=true&open_revs`=<revision>` . This will get the document with its parent revisions. Also don't forget to get attachments that aren't already stored at the target. As an optimisation you can use the HTTP multipart api to get all. 6. Collect a group of revisions fetched at previous step and store them on the target database using the `Bulk Docs <http://wiki.apache.org/couchdb/HTTP_Document_API#Bulk_Docs>`_ API with the `new_edit: false` JSON property to preserve their revisions ID. 7. After the group of revision is stored on the Target, save the new Checkpoint on the Source. .. note:: - Even if some revisions have been ignored the sequence should be take in consideration for the Checkpoint. - To compare non numeric sequence ordering, you will have to keep an ordered list of the sequences IDS as they appear in the _changes feed and compare their indices. Filter replication ------------------ The replication can be filtered by passing the `filter` parameter to the changes feeds with a function name. This will call a function on each changes. If this function return True, the document will be added to the feed. Optimisations ------------- - The system should run each steps in parallel to reduce the latency. - The number of revisions passed to the step 3 and 6 should be large enough to reduce the bandwidth and make sure to reduce the latency. API Reference ------------- - :head:`/{db}` -- Check Database existence - :post:`/{db}/_ensure_full_commit` -- Ensure that all changes are stored on disk - :get:`/{db}/_local/{id}` -- Read the last Checkpoint - :put:`/{db}/_local/{id}` -- Save a new Checkpoint Push Only ~~~~~~~~~ - :put:`/{db}` -- Create Target if it not exists and option was provided - :post:`/{db}/_revs_diff` -- Locate Revisions that are not known to the Target - :post:`/{db}/_bulk_docs` -- Upload Revisions to the Target - :put:`/{db}/{docid}`?new_edits=false -- Upload a single Document with attachments to the Target Pull Only ~~~~~~~~~ - :get:`/{db}/_changes` -- Locate changes since on Source the last pull. The request uses next query parameters: - ``style=all_docs`` - ``feed=feed`` , where feed is :ref:`normal <changes/normal>` or :ref:`longpoll <changes/longpoll>` - ``limit=limit`` - ``heartbeat=heartbeat`` - :get:`/{db}/{docid}` -- Retrieve a single Document from Source with attachments. The request uses next query parameters: - ``open_revs=revid`` - where ``revid`` is the actual Document Revision at the moment of the pull request - ``revs=true`` - ``atts_since=lastrev`` Reference --------- * `TouchDB iOS wiki <https://github.com/couchbaselabs/TouchDB-iOS/wiki/Replication-Algorithm>`_ * `CouchDB documentation <http://wiki.apache.org/couchdb/Replication>`_ * CouchDB `change notifications`_ .. _CouchDB: http://couchdb.apache.org .. _Erlang: http://erlang.org .. _couch_replicator: https://github.com/apache/couchdb/tree/master/src/couch_replicator .. _change notifications: http://guide.couchdb.org/draft/notifications.html ����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������apache-couchdb-1.6.0/share/doc/src/replication/index.rst��������������������������������������������0000644�0001750�0000144�00000002320�12332105522�023123� 0����������������������������������������������������������������������������������������������������ustar�00djc�����������������������������users���������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������.. Licensed under the Apache License, Version 2.0 (the "License"); you may not .. use this file except in compliance with the License. You may obtain a copy of .. the License at .. .. http://www.apache.org/licenses/LICENSE-2.0 .. .. Unless required by applicable law or agreed to in writing, software .. distributed under the License is distributed on an "AS IS" BASIS, WITHOUT .. WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the .. License for the specific language governing permissions and limitations under .. the License. .. _replication: =========== Replication =========== The replication is an incremental one way process involving two databases (a source and a destination). The aim of the replication is that at the end of the process, all active documents on the source database are also in the destination database and all documents that were deleted in the source databases are also deleted (if exists) on the destination database. The replication process only copies the last revision of a document, so all previous revisions that were only on the source database are not copied to the destination database. .. toctree:: :maxdepth: 2 intro protocol replicator conflicts ����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������apache-couchdb-1.6.0/share/doc/src/replication/replicator.rst���������������������������������������0000644�0001750�0000144�00000033635�12332105522�024175� 0����������������������������������������������������������������������������������������������������ustar�00djc�����������������������������users���������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������.. Licensed under the Apache License, Version 2.0 (the "License"); you may not .. use this file except in compliance with the License. You may obtain a copy of .. the License at .. .. http://www.apache.org/licenses/LICENSE-2.0 .. .. Unless required by applicable law or agreed to in writing, software .. distributed under the License is distributed on an "AS IS" BASIS, WITHOUT .. WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the .. License for the specific language governing permissions and limitations under .. the License. .. _replicator: Replicator Database =================== The ``_replicator`` database works like any other in CouchDB, but documents added to it will trigger replications. Creating (``PUT`` or ``POST``) a document to start a replication. ``DELETE`` a replicaiton document to cancel an ongoing replication. These documents have exactly the same content as the JSON objects we use to ``POST`` to ``_replicate`` (fields ``source``, ``target``, ``create_target``, ``continuous``, ``doc_ids``, ``filter``, ``query_params``, ``use_checkpoints``, ``checkpoint_interval``). Replication documents can have a user defined ``_id`` (handy for finding a specific replication request later). Design Documents (and ``_local`` documents) added to the replicator database are ignored. The default name of this database is ``_replicator``. The name can be changed in the ``local.ini`` configuration, section ``[replicator]``, parameter ``db``. Basics ------ Let's say you POST the following document into ``_replicator``: .. code-block:: javascript { "_id": "my_rep", "source": "http://myserver.com:5984/foo", "target": "bar", "create_target": true } In the couch log you'll see 2 entries like these: .. code-block:: text [Thu, 17 Feb 2011 19:43:59 GMT] [info] [<0.291.0>] Document `my_rep` triggered replication `c0ebe9256695ff083347cbf95f93e280+create_target` [Thu, 17 Feb 2011 19:44:37 GMT] [info] [<0.124.0>] Replication `c0ebe9256695ff083347cbf95f93e280+create_target` finished (triggered by document `my_rep`) As soon as the replication is triggered, the document will be updated by CouchDB with 3 new fields: .. code-block:: javascript { "_id": "my_rep", "source": "http://myserver.com:5984/foo", "target": "bar", "create_target": true, "_replication_id": "c0ebe9256695ff083347cbf95f93e280", "_replication_state": "triggered", "_replication_state_time": 1297974122 } Special fields set by the replicator start with the prefix ``_replication_``. - ``_replication_id`` The ID internally assigned to the replication. This is also the ID exposed by ``/_active_tasks``. - ``_replication_state`` The current state of the replication. - ``_replication_state_time`` A Unix timestamp (number of seconds since 1 Jan 1970) that tells us when the current replication state (marked in ``_replication_state``) was set. - ``_replication_state_reason`` If ``replication_state`` is ``error``, this field contains the reason. .. code-block:: javascript { "_id": "my_rep", "_rev": "2-9f2c0d9372f4ee4dc75652ab8f8e7c70", "source": "foodb", "target": "bardb", "_replication_state": "error", "_replication_state_time": "2013-12-13T18:48:00+01:00", "_replication_state_reason": "db_not_found: could not open foodb", "_replication_id": "fe965cdc47b4d5f6c02811d9d351ac3d" } When the replication finishes, it will update the ``_replication_state`` field (and ``_replication_state_time``) with the value ``completed``, so the document will look like: .. code-block:: javascript { "_id": "my_rep", "source": "http://myserver.com:5984/foo", "target": "bar", "create_target": true, "_replication_id": "c0ebe9256695ff083347cbf95f93e280", "_replication_state": "completed", "_replication_state_time": 1297974122 } When an error happens during replication, the ``_replication_state`` field is set to ``error`` (and ``_replication_state_reason`` and ``_replication_state_time`` are updated). When you PUT/POST a document to the ``_replicator`` database, CouchDB will attempt to start the replication up to 10 times (configurable under ``[replicator]``, parameter ``max_replication_retry_count``). If it fails on the first attempt, it waits 5 seconds before doing a second attempt. If the second attempt fails, it waits 10 seconds before doing a third attempt. If the third attempt fails, it waits 20 seconds before doing a fourth attempt (each attempt doubles the previous wait period). When an attempt fails, the Couch log will show you something like: .. code-block:: text [error] [<0.149.0>] Error starting replication `67c1bb92010e7abe35d7d629635f18b6+create_target` (document `my_rep_2`): {db_not_found,<<"could not open http://myserver:5986/foo/">> .. note:: The ``_replication_state`` field is only set to ``error`` when all the attempts were unsuccessful. There are only 3 possible values for the ``_replication_state`` field: ``triggered``, ``completed`` and ``error``. Continuous replications never get their state set to ``completed``. Documents describing the same replication ----------------------------------------- Lets suppose 2 documents are added to the ``_replicator`` database in the following order: .. code-block:: javascript { "_id": "doc_A", "source": "http://myserver.com:5984/foo", "target": "bar" } and .. code-block:: javascript { "_id": "doc_B", "source": "http://myserver.com:5984/foo", "target": "bar" } Both describe exactly the same replication (only their ``_ids`` differ). In this case document ``doc_A`` triggers the replication, getting updated by CouchDB with the fields ``_replication_state``, ``_replication_state_time`` and ``_replication_id``, just like it was described before. Document ``doc_B`` however, is only updated with one field, the ``_replication_id`` so it will look like this: .. code-block:: javascript { "_id": "doc_B", "source": "http://myserver.com:5984/foo", "target": "bar", "_replication_id": "c0ebe9256695ff083347cbf95f93e280" } While document ``doc_A`` will look like this: .. code-block:: javascript { "_id": "doc_A", "source": "http://myserver.com:5984/foo", "target": "bar", "_replication_id": "c0ebe9256695ff083347cbf95f93e280", "_replication_state": "triggered", "_replication_state_time": 1297974122 } Note that both document get exactly the same value for the ``_replication_id`` field. This way you can identify which documents refer to the same replication - you can for example define a view which maps replication IDs to document IDs. Canceling replications ---------------------- To cancel a replication simply ``DELETE`` the document which triggered the replication. The Couch log will show you an entry like the following: .. code-block:: text [Thu, 17 Feb 2011 20:16:29 GMT] [info] [<0.125.0>] Stopped replication `c0ebe9256695ff083347cbf95f93e280+continuous+create_target` because replication document `doc_A` was deleted .. note:: You need to ``DELETE`` the document that triggered the replication. ``DELETE``-ing another document that describes the same replication but did not trigger it, will not cancel the replication. Server restart -------------- When CouchDB is restarted, it checks its ``_replicator`` database and restarts any replication that is described by a document that either has its ``_replication_state`` field set to ``triggered`` or it doesn't have yet the ``_replication_state`` field set. .. note:: Continuous replications always have a ``_replication_state`` field with the value ``triggered``, therefore they're always restarted when CouchDB is restarted. Changing the Replicator Database -------------------------------- Imagine your replicator database (default name is ``_replicator``) has the two following documents that represent pull replications from servers A and B: .. code-block:: javascript { "_id": "rep_from_A", "source": "http://aserver.com:5984/foo", "target": "foo_a", "continuous": true, "_replication_id": "c0ebe9256695ff083347cbf95f93e280", "_replication_state": "triggered", "_replication_state_time": 1297971311 } .. code-block:: javascript { "_id": "rep_from_B", "source": "http://bserver.com:5984/foo", "target": "foo_b", "continuous": true, "_replication_id": "231bb3cf9d48314eaa8d48a9170570d1", "_replication_state": "triggered", "_replication_state_time": 1297974122 } Now without stopping and restarting CouchDB, you change the name of the replicator database to ``another_replicator_db``: .. code-block:: bash $ curl -X PUT http://localhost:5984/_config/replicator/db -d '"another_replicator_db"' "_replicator" As soon as this is done, both pull replications defined before, are stopped. This is explicitly mentioned in CouchDB's log: .. code-block:: text [Fri, 11 Mar 2011 07:44:20 GMT] [info] [<0.104.0>] Stopping all ongoing replications because the replicator database was deleted or changed [Fri, 11 Mar 2011 07:44:20 GMT] [info] [<0.127.0>] 127.0.0.1 - - PUT /_config/replicator/db 200 Imagine now you add a replication document to the new replicator database named ``another_replicator_db``: .. code-block:: javascript { "_id": "rep_from_X", "source": "http://xserver.com:5984/foo", "target": "foo_x", "continuous": true } From now own you have a single replication going on in your system: a pull replication pulling from server X. Now you change back the replicator database to the original one ``_replicator``: :: $ curl -X PUT http://localhost:5984/_config/replicator/db -d '"_replicator"' "another_replicator_db" Immediately after this operation, the replication pulling from server X will be stopped and the replications defined in the ``_replicator`` database (pulling from servers A and B) will be resumed. Changing again the replicator database to ``another_replicator_db`` will stop the pull replications pulling from servers A and B, and resume the pull replication pulling from server X. Replicating the replicator database ----------------------------------- Imagine you have in server C a replicator database with the two following pull replication documents in it: .. code-block:: javascript { "_id": "rep_from_A", "source": "http://aserver.com:5984/foo", "target": "foo_a", "continuous": true, "_replication_id": "c0ebe9256695ff083347cbf95f93e280", "_replication_state": "triggered", "_replication_state_time": 1297971311 } .. code-block:: javascript { "_id": "rep_from_B", "source": "http://bserver.com:5984/foo", "target": "foo_b", "continuous": true, "_replication_id": "231bb3cf9d48314eaa8d48a9170570d1", "_replication_state": "triggered", "_replication_state_time": 1297974122 } Now you would like to have the same pull replications going on in server D, that is, you would like to have server D pull replicating from servers A and B. You have two options: - Explicitly add two documents to server's D replicator database - Replicate server's C replicator database into server's D replicator database Both alternatives accomplish exactly the same goal. Delegations ----------- Replication documents can have a custom ``user_ctx`` property. This property defines the user context under which a replication runs. For the old way of triggering replications (POSTing to ``/_replicate/``), this property was not needed (it didn't exist in fact) - this is because at the moment of triggering the replication it has information about the authenticated user. With the replicator database, since it's a regular database, the information about the authenticated user is only present at the moment the replication document is written to the database - the replicator database implementation is like a ``_changes`` feed consumer (with ``?include_docs=true``) that reacts to what was written to the replicator database - in fact this feature could be implemented with an external script/program. This implementation detail implies that for non admin users, a ``user_ctx`` property, containing the user's name and a subset of their roles, must be defined in the replication document. This is ensured by the document update validation function present in the default design document of the replicator database. This validation function also ensure that a non admin user can set a user name property in the ``user_ctx`` property that doesn't match their own name (same principle applies for the roles). For admins, the ``user_ctx`` property is optional, and if it's missing it defaults to a user context with name null and an empty list of roles - this mean design documents will not be written to local targets. If writing design documents to local targets is desired, the a user context with the roles ``_admin`` must be set explicitly. Also, for admins the ``user_ctx`` property can be used to trigger a replication on behalf of another user. This is the user context that will be passed to local target database document validation functions. .. note:: The ``user_ctx`` property only has effect for local endpoints. Example delegated replication document: .. code-block:: javascript { "_id": "my_rep", "source": "http://bserver.com:5984/foo", "target": "bar", "continuous": true, "user_ctx": { "name": "joe", "roles": ["erlanger", "researcher"] } } As stated before, for admins the ``user_ctx`` property is optional, while for regular (non admin) users it's mandatory. When the roles property of ``user_ctx`` is missing, it defaults to the empty list ``[ ]``. ���������������������������������������������������������������������������������������������������apache-couchdb-1.6.0/share/doc/src/replication/conflicts.rst����������������������������������������0000644�0001750�0000144�00000076150�12332105522�024014� 0����������������������������������������������������������������������������������������������������ustar�00djc�����������������������������users���������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������.. Licensed under the Apache License, Version 2.0 (the "License"); you may not .. use this file except in compliance with the License. You may obtain a copy of .. the License at .. .. http://www.apache.org/licenses/LICENSE-2.0 .. .. Unless required by applicable law or agreed to in writing, software .. distributed under the License is distributed on an "AS IS" BASIS, WITHOUT .. WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the .. License for the specific language governing permissions and limitations under .. the License. .. _replication/conflicts: ============================== Replication and conflict model ============================== Let's take the following example to illustrate replication and conflict handling. - Alice has a document containing Bob's business card; - She synchronizes it between her desktop PC and her laptop; - On the desktop PC, she updates Bob's E-mail address; Without syncing again, she updates Bob's mobile number on the laptop; - Then she replicates the two to each other again. So on the desktop the document has Bob's new E-mail address and his old mobile number, and on the laptop it has his old E-mail address and his new mobile number. The question is, what happens to these conflicting updated documents? CouchDB replication =================== CouchDB works with JSON documents inside databases. Replication of databases takes place over HTTP, and can be either a "pull" or a "push", but is unidirectional. So the easiest way to perform a full sync is to do a "push" followed by a "pull" (or vice versa). So, Alice creates v1 and sync it. She updates to v2a on one side and v2b on the other, and then replicates. What happens? The answer is simple: both versions exist on both sides! .. code-block:: text DESKTOP LAPTOP +---------+ | /db/bob | INITIAL | v1 | CREATION +---------+ +---------+ +---------+ | /db/bob | -----------------> | /db/bob | PUSH | v1 | | v1 | +---------+ +---------+ +---------+ +---------+ INDEPENDENT | /db/bob | | /db/bob | LOCAL | v2a | | v2b | EDITS +---------+ +---------+ +---------+ +---------+ | /db/bob | -----------------> | /db/bob | PUSH | v2a | | v2a | +---------+ | v2b | +---------+ +---------+ +---------+ | /db/bob | <----------------- | /db/bob | PULL | v2a | | v2a | | v2b | | v2b | +---------+ +---------+ After all, this is not a filesystem, so there's no restriction that only one document can exist with the name /db/bob. These are just "conflicting" revisions under the same name. Because the changes are always replicated, the data is safe. Both machines have identical copies of both documents, so failure of a hard drive on either side won't lose any of the changes. Another thing to notice is that peers do not have to be configured or tracked. You can do regular replications to peers, or you can do one-off, ad-hoc pushes or pulls. After the replication has taken place, there is no record kept of which peer any particular document or revision came from. So the question now is: what happens when you try to read /db/bob? By default, CouchDB picks one arbitrary revision as the "winner", using a deterministic algorithm so that the same choice will be made on all peers. The same happens with views: the deterministically-chosen winner is the only revision fed into your map function. Let's say that the winner is v2a. On the desktop, if Alice reads the document she'll see v2a, which is what she saved there. But on the laptop, after replication, she'll also see only v2a. It could look as if the changes she made there have been lost - but of course they have not, they have just been hidden away as a conflicting revision. But eventually she'll need these changes merged into Bob's business card, otherwise they will effectively have been lost. Any sensible business-card application will, at minimum, have to present the conflicting versions to Alice and allow her to create a new version incorporating information from them all. Ideally it would merge the updates itself. Conflict avoidance ================== When working on a single node, CouchDB will avoid creating conflicting revisions by returning a :statuscode:`409` error. This is because, when you PUT a new version of a document, you must give the ``_rev`` of the previous version. If that ``_rev`` has already been superseded, the update is rejected with a :statuscode:`409` response. So imagine two users on the same node are fetching Bob's business card, updating it concurrently, and writing it back: .. code-block:: text USER1 -----------> GET /db/bob <----------- {"_rev":"1-aaa", ...} USER2 -----------> GET /db/bob <----------- {"_rev":"1-aaa", ...} USER1 -----------> PUT /db/bob?rev=1-aaa <----------- {"_rev":"2-bbb", ...} USER2 -----------> PUT /db/bob?rev=1-aaa <----------- 409 Conflict (not saved) User2's changes are rejected, so it's up to the app to fetch /db/bob again, and either: #. apply the same changes as were applied to the earlier revision, and submit a new PUT #. redisplay the document so the user has to edit it again #. just overwrite it with the document being saved before (which is not advisable, as user1's changes will be silently lost) So when working in this mode, your application still has to be able to handle these conflicts and have a suitable retry strategy, but these conflicts never end up inside the database itself. Conflicts in batches ==================== There are two different ways that conflicts can end up in the database: - Conflicting changes made on different databases, which are replicated to each other, as shown earlier. - Changes are written to the database using ``_bulk_docs`` and all_or_nothing, which bypasses the 409 mechanism. The :ref:`_bulk_docs API <api/db/bulk_docs>` lets you submit multiple updates (and/or deletes) in a single HTTP POST. Normally, these are treated as independent updates; some in the batch may fail because the `_rev` is stale (just like a 409 from a PUT) whilst others are written successfully. The response from ``_bulk_docs`` lists the success/fail separately for each document in the batch. However there is another mode of working, whereby you specify ``{"all_or_nothing":true}`` as part of the request. This is CouchDB's nearest equivalent of a "transaction", but it's not the same as a database transaction which can fail and roll back. Rather, it means that all of the changes in the request will be forcibly applied to the database, even if that introduces conflicts. The only guarantee you are given is that they will either all be applied to the database, or none of them (e.g. if the power is pulled out before the update is finished writing to disk). So this gives you a way to introduce conflicts within a single database instance. If you choose to do this instead of PUT, it means you don't have to write any code for the possibility of getting a 409 response, because you will never get one. Rather, you have to deal with conflicts appearing later in the database, which is what you'd have to do in a multi-master application anyway. .. code-block:: http POST /db/_bulk_docs .. code-block:: javascript { "all_or_nothing": true, "docs": [ {"_id":"x", "_rev":"1-xxx", ...}, {"_id":"y", "_rev":"1-yyy", ...}, ... ] } Revision tree ============= When you update a document in CouchDB, it keeps a list of the previous revisions. In the case where conflicting updates are introduced, this history branches into a tree, where the current conflicting revisions for this document form the tips (leaf nodes) of this tree: .. code-block:: text ,--> r2a r1 --> r2b `--> r2c Each branch can then extend its history - for example if you read revision r2b and then PUT with ?rev=r2b then you will make a new revision along that particular branch. .. code-block:: text ,--> r2a -> r3a -> r4a r1 --> r2b -> r3b `--> r2c -> r3c Here, (r4a, r3b, r3c) are the set of conflicting revisions. The way you resolve a conflict is to delete the leaf nodes along the other branches. So when you combine (r4a+r3b+r3c) into a single merged document, you would replace r4a and delete r3b and r3c. .. code-block:: text ,--> r2a -> r3a -> r4a -> r5a r1 --> r2b -> r3b -> (r4b deleted) `--> r2c -> r3c -> (r4c deleted) Note that r4b and r4c still exist as leaf nodes in the history tree, but as deleted docs. You can retrieve them but they will be marked ``"_deleted":true``. When you compact a database, the bodies of all the non-leaf documents are discarded. However, the list of historical _revs is retained, for the benefit of later conflict resolution in case you meet any old replicas of the database at some time in future. There is "revision pruning" to stop this getting arbitrarily large. Working with conflicting documents ================================== The basic :get:`/{doc}/{docid}` operation will not show you any information about conflicts. You see only the deterministically-chosen winner, and get no indication as to whether other conflicting revisions exist or not: .. code-block:: javascript { "_id":"test", "_rev":"2-b91bb807b4685080c6a651115ff558f5", "hello":"bar" } If you do ``GET /db/bob?conflicts=true``, and the document is in a conflict state, then you will get the winner plus a _conflicts member containing an array of the revs of the other, conflicting revision(s). You can then fetch them individually using subsequent ``GET /db/bob?rev=xxxx`` operations: .. code-block:: javascript { "_id":"test", "_rev":"2-b91bb807b4685080c6a651115ff558f5", "hello":"bar", "_conflicts":[ "2-65db2a11b5172bf928e3bcf59f728970", "2-5bc3c6319edf62d4c624277fdd0ae191" ] } If you do ``GET /db/bob?open_revs=all`` then you will get all the leaf nodes of the revision tree. This will give you all the current conflicts, but will also give you leaf nodes which have been deleted (i.e. parts of the conflict history which have since been resolved). You can remove these by filtering out documents with ``"_deleted":true``: .. code-block:: javascript [ {"ok":{"_id":"test","_rev":"2-5bc3c6319edf62d4c624277fdd0ae191","hello":"foo"}}, {"ok":{"_id":"test","_rev":"2-65db2a11b5172bf928e3bcf59f728970","hello":"baz"}}, {"ok":{"_id":"test","_rev":"2-b91bb807b4685080c6a651115ff558f5","hello":"bar"}} ] The ``"ok"`` tag is an artifact of ``open_revs``, which also lets you list explicit revisions as a JSON array, e.g. ``open_revs=[rev1,rev2,rev3]``. In this form, it would be possible to request a revision which is now missing, because the database has been compacted. .. note:: The order of revisions returned by ``open_revs=all`` is **NOT** related to the deterministic "winning" algorithm. In the above example, the winning revision is 2-b91b... and happens to be returned last, but in other cases it can be returned in a different position. Once you have retrieved all the conflicting revisions, your application can then choose to display them all to the user. Or it could attempt to merge them, write back the merged version, and delete the conflicting versions - that is, to resolve the conflict permanently. As described above, you need to update one revision and delete all the conflicting revisions explicitly. This can be done using a single `POST` to ``_bulk_docs``, setting ``"_deleted":true`` on those revisions you wish to delete. Multiple document API ===================== You can fetch multiple documents at once using ``include_docs=true`` on a view. However, a ``conflicts=true`` request is ignored; the "doc" part of the value never includes a ``_conflicts`` member. Hence you would need to do another query to determine for each document whether it is in a conflicting state: .. code-block:: bash $ curl 'http://127.0.0.1:5984/conflict_test/_all_docs?include_docs=true&conflicts=true' .. code-block:: javascript { "total_rows":1, "offset":0, "rows":[ { "id":"test", "key":"test", "value":{"rev":"2-b91bb807b4685080c6a651115ff558f5"}, "doc":{ "_id":"test", "_rev":"2-b91bb807b4685080c6a651115ff558f5", "hello":"bar" } } ] } .. code-block:: bash $ curl 'http://127.0.0.1:5984/conflict_test/test?conflicts=true' .. code-block:: javascript { "_id":"test", "_rev":"2-b91bb807b4685080c6a651115ff558f5", "hello":"bar", "_conflicts":[ "2-65db2a11b5172bf928e3bcf59f728970", "2-5bc3c6319edf62d4c624277fdd0ae191" ] } View map functions ================== Views only get the winning revision of a document. However they do also get a ``_conflicts`` member if there are any conflicting revisions. This means you can write a view whose job is specifically to locate documents with conflicts. Here is a simple map function which achieves this: .. code-block:: javascript function(doc) { if (doc._conflicts) { emit(null, [doc._rev].concat(doc._conflicts)); } } which gives the following output: .. code-block:: javascript { "total_rows":1, "offset":0, "rows":[ { "id":"test", "key":null, "value":[ "2-b91bb807b4685080c6a651115ff558f5", "2-65db2a11b5172bf928e3bcf59f728970", "2-5bc3c6319edf62d4c624277fdd0ae191" ] } ] } If you do this, you can have a separate "sweep" process which periodically scans your database, looks for documents which have conflicts, fetches the conflicting revisions, and resolves them. Whilst this keeps the main application simple, the problem with this approach is that there will be a window between a conflict being introduced and it being resolved. From a user's viewpoint, this may appear that the document they just saved successfully may suddenly lose their changes, only to be resurrected some time later. This may or may not be acceptable. Also, it's easy to forget to start the sweeper, or not to implement it properly, and this will introduce odd behaviour which will be hard to track down. CouchDB's "winning" revision algorithm may mean that information drops out of a view until a conflict has been resolved. Consider Bob's business card again; suppose Alice has a view which emits mobile numbers, so that her telephony application can display the caller's name based on caller ID. If there are conflicting documents with Bob's old and new mobile numbers, and they happen to be resolved in favour of Bob's old number, then the view won't be able to recognise his new one. In this particular case, the application might have preferred to put information from both the conflicting documents into the view, but this currently isn't possible. Suggested algorithm to fetch a document with conflict resolution: #. Get document via ``GET docid?conflicts=true`` request; #. For each member in the ``_conflicts`` array call ``GET docid?rev=xxx``. If any errors occur at this stage, restart from step 1. (There could be a race where someone else has already resolved this conflict and deleted that rev) #. Perform application-specific merging #. Write ``_bulk_docs`` with an update to the first rev and deletes of the other revs. This could either be done on every read (in which case you could replace all calls to GET in your application with calls to a library which does the above), or as part of your sweeper code. And here is an example of this in Ruby using the low-level `RestClient`_: .. _RestClient: https://rubygems.org/gems/rest-client .. code-block:: ruby require 'rubygems' require 'rest_client' require 'json' DB="http://127.0.0.1:5984/conflict_test" # Write multiple documents as all_or_nothing, can introduce conflicts def writem(docs) JSON.parse(RestClient.post("#{DB}/_bulk_docs", { "all_or_nothing" => true, "docs" => docs, }.to_json)) end # Write one document, return the rev def write1(doc, id=nil, rev=nil) doc['_id'] = id if id doc['_rev'] = rev if rev writem([doc]).first['rev'] end # Read a document, return *all* revs def read1(id) retries = 0 loop do # FIXME: escape id res = [JSON.parse(RestClient.get("#{DB}/#{id}?conflicts=true"))] if revs = res.first.delete('_conflicts') begin revs.each do |rev| res << JSON.parse(RestClient.get("#{DB}/#{id}?rev=#{rev}")) end rescue retries += 1 raise if retries >= 5 next end end return res end end # Create DB RestClient.delete DB rescue nil RestClient.put DB, {}.to_json # Write a document rev1 = write1({"hello"=>"xxx"},"test") p read1("test") # Make three conflicting versions write1({"hello"=>"foo"},"test",rev1) write1({"hello"=>"bar"},"test",rev1) write1({"hello"=>"baz"},"test",rev1) res = read1("test") p res # Now let's replace these three with one res.first['hello'] = "foo+bar+baz" res.each_with_index do |r,i| unless i == 0 r.replace({'_id'=>r['_id'], '_rev'=>r['_rev'], '_deleted'=>true}) end end writem(res) p read1("test") An application written this way never has to deal with a ``PUT 409``, and is automatically multi-master capable. You can see that it's straightforward enough when you know what you're doing. It's just that CouchDB doesn't currently provide a convenient HTTP API for "fetch all conflicting revisions", nor "PUT to supersede these N revisions", so you need to wrap these yourself. I also don't know of any client-side libraries which provide support for this. Merging and revision history ============================ Actually performing the merge is an application-specific function. It depends on the structure of your data. Sometimes it will be easy: e.g. if a document contains a list which is only ever appended to, then you can perform a union of the two list versions. Some merge strategies look at the changes made to an object, compared to its previous version. This is how git's merge function works. For example, to merge Bob's business card versions v2a and v2b, you could look at the differences between v1 and v2b, and then apply these changes to v2a as well. With CouchDB, you can sometimes get hold of old revisions of a document. For example, if you fetch ``/db/bob?rev=v2b&revs_info=true`` you'll get a list of the previous revision ids which ended up with revision v2b. Doing the same for v2a you can find their common ancestor revision. However if the database has been compacted, the content of that document revision will have been lost. ``revs_info`` will still show that v1 was an ancestor, but report it as "missing":: BEFORE COMPACTION AFTER COMPACTION ,-> v2a v2a v1 `-> v2b v2b So if you want to work with diffs, the recommended way is to store those diffs within the new revision itself. That is: when you replace v1 with v2a, include an extra field or attachment in v2a which says which fields were changed from v1 to v2a. This unfortunately does mean additional book-keeping for your application. Comparison with other replicating data stores ============================================= The same issues arise with other replicating systems, so it can be instructive to look at these and see how they compare with CouchDB. Please feel free to add other examples. Unison ------ `Unison`_ is a bi-directional file synchronisation tool. In this case, the business card would be a file, say `bob.vcf`. .. _Unison: http://www.cis.upenn.edu/~bcpierce/unison/ When you run unison, changes propagate both ways. If a file has changed on one side but not the other, the new replaces the old. Unison maintains a local state file so that it knows whether a file has changed since the last successful replication. In our example it has changed on both sides. Only one file called `bob.vcf` can exist within the filesystem. Unison solves the problem by simply ducking out: the user can choose to replace the remote version with the local version, or vice versa (both of which would lose data), but the default action is to leave both sides unchanged. From Alice's point of view, at least this is a simple solution. Whenever she's on the desktop she'll see the version she last edited on the desktop, and whenever she's on the laptop she'll see the version she last edited there. But because no replication has actually taken place, the data is not protected. If her laptop hard drive dies, she'll lose all her changes made on the laptop; ditto if her desktop hard drive dies. It's up to her to copy across one of the versions manually (under a different filename), merge the two, and then finally push the merged version to the other side. Note also that the original file (version v1) has been lost by this point. So it's not going to be known from inspection alone which of v2a and v2b has the most up-to-date E-mail address for Bob, and which has the most up-to-date mobile number. Alice has to remember which she entered last. Git ---- `Git`_ is a well-known distributed source control system. Like Unison, git deals with files. However, git considers the state of a whole set of files as a single object, the "tree". Whenever you save an update, you create a "commit" which points to both the updated tree and the previous commit(s), which in turn point to the previous tree(s). You therefore have a full history of all the states of the files. This forms a branch, and a pointer is kept to the tip of the branch, from which you can work backwards to any previous state. The "pointer" is actually an SHA1 hash of the tip commit. .. _Git: http://git-scm.com/ If you are replicating with one or more peers, a separate branch is made for each of the peers. For example, you might have:: master -- my local branch remotes/foo/master -- branch on peer 'foo' remotes/bar/master -- branch on peer 'bar' In the normal way of working, replication is a "pull", importing changes from a remote peer into the local repository. A "pull" does two things: first "fetch" the state of the peer into the remote tracking branch for that peer; and then attempt to "merge" those changes into the local branch. Now let's consider the business card. Alice has created a git repo containing ``bob.vcf``, and cloned it across to the other machine. The branches look like this, where ``AAAAAAAA`` is the SHA1 of the commit:: ---------- desktop ---------- ---------- laptop ---------- master: AAAAAAAA master: AAAAAAAA remotes/laptop/master: AAAAAAAA remotes/desktop/master: AAAAAAAA Now she makes a change on the desktop, and commits it into the desktop repo; then she makes a different change on the laptop, and commits it into the laptop repo:: ---------- desktop ---------- ---------- laptop ---------- master: BBBBBBBB master: CCCCCCCC remotes/laptop/master: AAAAAAAA remotes/desktop/master: AAAAAAAA Now on the desktop she does ``git pull laptop``. Firstly, the remote objects are copied across into the local repo and the remote tracking branch is updated:: ---------- desktop ---------- ---------- laptop ---------- master: BBBBBBBB master: CCCCCCCC remotes/laptop/master: CCCCCCCC remotes/desktop/master: AAAAAAAA .. note:: repo still contains AAAAAAAA because commits BBBBBBBB and CCCCCCCC point to it Then git will attempt to merge the changes in. It can do this because it knows the parent commit to ``CCCCCCCC`` is ``AAAAAAAA``, so it takes a diff between ``AAAAAAAA`` and ``CCCCCCCC`` and tries to apply it to ``BBBBBBBB``. If this is successful, then you'll get a new version with a merge commit:: ---------- desktop ---------- ---------- laptop ---------- master: DDDDDDDD master: CCCCCCCC remotes/laptop/master: CCCCCCCC remotes/desktop/master: AAAAAAAA Then Alice has to logon to the laptop and run ``git pull desktop``. A similar process occurs. The remote tracking branch is updated:: ---------- desktop ---------- ---------- laptop ---------- master: DDDDDDDD master: CCCCCCCC remotes/laptop/master: CCCCCCCC remotes/desktop/master: DDDDDDDD Then a merge takes place. This is a special-case: ``CCCCCCCC`` one of the parent commits of ``DDDDDDDD``, so the laptop can `fast forward` update from ``CCCCCCCC`` to ``DDDDDDDD`` directly without having to do any complex merging. This leaves the final state as:: ---------- desktop ---------- ---------- laptop ---------- master: DDDDDDDD master: DDDDDDDD remotes/laptop/master: CCCCCCCC remotes/desktop/master: DDDDDDDD Now this is all and good, but you may wonder how this is relevant when thinking about CouchDB. Firstly, note what happens in the case when the merge algorithm fails. The changes are still propagated from the remote repo into the local one, and are available in the remote tracking branch; so unlike Unison, you know the data is protected. It's just that the local working copy may fail to update, or may diverge from the remote version. It's up to you to create and commit the combined version yourself, but you are guaranteed to have all the history you might need to do this. Note that whilst it's possible to build new merge algorithms into Git, the standard ones are focused on line-based changes to source code. They don't work well for XML or JSON if it's presented without any line breaks. The other interesting consideration is multiple peers. In this case you have multiple remote tracking branches, some of which may match your local branch, some of which may be behind you, and some of which may be ahead of you (i.e. contain changes that you haven't yet merged):: master: AAAAAAAA remotes/foo/master: BBBBBBBB remotes/bar/master: CCCCCCCC remotes/baz/master: AAAAAAAA Note that each peer is explicitly tracked, and therefore has to be explicitly created. If a peer becomes stale or is no longer needed, it's up to you to remove it from your configuration and delete the remote tracking branch. This is different to CouchDB, which doesn't keep any peer state in the database. Another difference with git is that it maintains all history back to time zero - git compaction keeps diffs between all those versions in order to reduce size, but CouchDB discards them. If you are constantly updating a document, the size of a git repo would grow forever. It is possible (with some effort) to use "history rewriting" to make git forget commits earlier than a particular one. .. _replication/conflicts/git: What is the CouchDB replication protocol? Is it like Git? ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ :Author: Jason Smith :Date: 2011-01-29 :Source: http://stackoverflow.com/questions/4766391/what-is-the-couchdb-replication-protocol-is-it-like-git **Key points** **If you know Git, then you know how Couch replication works.** Replicating is *very* similar to pushing or pulling with distributed source managers like Git. **CouchDB replication does not have its own protocol.** A replicator simply connects to two DBs as a client, then reads from one and writes to the other. Push replication is reading the local data and updating the remote DB; pull replication is vice versa. * **Fun fact 1**: The replicator is actually an independent Erlang application, in its own process. It connects to both couches, then reads records from one and writes them to the other. * **Fun fact 2**: CouchDB has no way of knowing who is a normal client and who is a replicator (let alone whether the replication is push or pull). It all looks like client connections. Some of them read records. Some of them write records. **Everything flows from the data model** The replication algorithm is trivial, uninteresting. A trained monkey could design it. It's simple because the cleverness is the data model, which has these useful characteristics: #. Every record in CouchDB is completely independent of all others. That sucks if you want to do a JOIN or a transaction, but it's awesome if you want to write a replicator. Just figure out how to replicate one record, and then repeat that for each record. #. Like Git, records have a linked-list revision history. A record's revision ID is the checksum of its own data. Subsequent revision IDs are checksums of: the new data, plus the revision ID of the previous. #. In addition to application data (``{"name": "Jason", "awesome": true}``), every record stores the evolutionary timeline of all previous revision IDs leading up to itself. - Exercise: Take a moment of quiet reflection. Consider any two different records, A and B. If A's revision ID appears in B's timeline, then B definitely evolved from A. Now consider Git's fast-forward merges. Do you hear that? That is the sound of your mind being blown. #. Git isn't really a linear list. It has forks, when one parent has multiple children. CouchDB has that too. - Exercise: Compare two different records, A and B. A's revision ID does not appear in B's timeline; however, one revision ID, C, is in both A's and B's timeline. Thus A didn't evolve from B. B didn't evolve from A. But rather, A and B have a common ancestor C. In Git, that is a "fork." In CouchDB, it's a "conflict." - In Git, if both children go on to develop their timelines independently, that's cool. Forks totally support that. - In CouchDB, if both children go on to develop their timelines independently, that cool too. Conflicts totally support that. - **Fun fact 3**: CouchDB "conflicts" do not correspond to Git "conflicts." A Couch conflict is a divergent revision history, what Git calls a "fork." For this reason the CouchDB community pronounces "conflict" with a silent `n`: "co-flicked." #. Git also has merges, when one child has multiple parents. CouchDB *sort* of has that too. - **In the data model, there is no merge.** The client simply marks one timeline as deleted and continues to work with the only extant timeline. - **In the application, it feels like a merge.** Typically, the client merges the *data* from each timeline in an application-specific way. Then it writes the new data to the timeline. In Git, this is like copying and pasting the changes from branch A into branch B, then commiting to branch B and deleting branch A. The data was merged, but there was no `git merge`. - These behaviors are different because, in Git, the timeline itself is important; but in CouchDB, the data is important and the timeline is incidental—it's just there to support replication. That is one reason why CouchDB's built-in revisioning is inappropriate for storing revision data like a wiki page. **Final notes** At least one sentence in this writeup (possibly this one) is complete BS. ������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������apache-couchdb-1.6.0/share/doc/src/externals.rst����������������������������������������������������0000644�0001750�0000144�00000022212�12332105522�021512� 0����������������������������������������������������������������������������������������������������ustar�00djc�����������������������������users���������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������.. Licensed under the Apache License, Version 2.0 (the "License"); you may not .. use this file except in compliance with the License. You may obtain a copy of .. the License at .. .. http://www.apache.org/licenses/LICENSE-2.0 .. .. Unless required by applicable law or agreed to in writing, software .. distributed under the License is distributed on an "AS IS" BASIS, WITHOUT .. WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the .. License for the specific language governing permissions and limitations under .. the License. .. _externals: ===================== CouchDB Externals API ===================== :Author: Paul Joseph Davis :Date: 2010-09-26 :Source: http://davispj.com/2010/09/26/new-couchdb-externals-api.html For a bit of background, CouchDB has had an API for managing `external OS processes`_ that are capable of handling HTTP requests for a given URL prefix. These OS processes communicate with CouchDB using JSON over stdio. They're dead simple to write and provide CouchDB users an easy way to extend CouchDB functionality. Even though they're dead simple to write, there are a few issues. The implementation in CouchDB does not provide fancy pooling semantics. The current API is explicitly synchronous which prevents people from writing event driven code in an external handler. In the end, they may be simple, but their simplicity is also quite limiting. During CouchCamp a few weeks ago I had multiple discussions with various people that wanted to see the _externals API modified in slight ways that weren't mutually compatible. After having multiple discussions with multiple people we formed a general consensus on what a new API could look like. The New Hotness --------------- So the first idea for improving the _external API was to make CouchDB act as a reverse proxy. This would allow people to write an HTTP server that was as simple or as complicated as they wanted. It will allow people to change their networking configuration more easily and also allow for external processes to be hosted on nodes other than the one running CouchDB. Bottom line, it not only allows us to have similar semantics as _externals, it provides a lot more fringe benefits as well. I'm always a fan of extra awesomeness. After hitting on the idea of adding a reverse proxy, people quickly pointed out that it would require users to start manually managing their external processes using something like `Runit`_ or `Supervisord`_. After some more discussions I ran into people that wanted something like _externals that didn't handle HTTP requests. After that it was easy to see that adding a second feature that managed OS processes was the way to go. I spent this weekend implementing both of these features. Both are at the stage of working but requiring more testing. In the case of the HTTP proxy I have no tests because I can't decide how to test the thing. If you have ideas, I'd sure like to hear them. **[Update]**: I woke up the other morning realizing that I was being an idiot and that Erlang is awesome. There's no reason that I can't have an HTTP client, proxy, and server all hosted in the same process. So that's what I did. It turns out to be a fairly nice way of configuring matching assertions between the client and the server to test the proxy transmissions. How does it work? - HTTP Proxying --------------------------------- To configure a :ref:`proxy handler <config/proxy>`, edit your `local.ini` and add a section like such:: [httpd_global_handlers] _fti = {couch_httpd_proxy, handle_proxy_req, <<"http://127.0.0.1:5985">>} This would be approximately what you'd need to do to get `CouchDB-Lucene`_ handled through this interface. The URL you use to access a query would be: http://127.0.0.1:5984/_fti/db_name/_design/foo/by_content?q=hello A couple things to note here. Anything in the path after the configured proxy name ("_fti" in this case) will be appended to the configured destination URL ("http://127.0.0.1:5985" in this case). The query string and any associated body will also be proxied transparently. Also, of note is that there's nothing that limits on what resources can be proxied. You're free to choose any destination that the CouchDB node is capable of communicating with. How does it work? - OS Daemons ------------------------------ The second part of the new API gives CouchDB simple OS process management. When CouchDB boots it will start each configured OS daemon. If one of these daemons fails at some point, it will be restarted. If one of these daemons fails too often, CouchDB will stop attempting to start it. OS daemons are one-to-one. For each daemon, CouchDB will make sure that exactly one instance of it is alive. If you have something where you want multiple processes, you need to either tell CouchDB about each one, or have a main process that forks off the required sub-processes. To configure an :config:section:`OS daemon <os_daemons>`, add this to your `local.ini`:: [os_daemons] my_daemon = /path/to/command -with args Configuration API +++++++++++++++++ As an added benefit, because stdio is now free, I implemented a simple API that OS daemons can use to read the configuration of their CouchDB host. This way you can have them store their configuration inside CouchDB's config system if you desire. Or they can peek at things like the :config:option:`httpd/bind_address` and :config:option:`httpd/port` that CouchDB is using. A request for a config section looks like this:: ["get", "os_daemons"]\n And the response:: {"my_daemon": "/path/to/command -with args"}\n Or to get a specific key:: ["get", "os_daemons", "my_daemon"]\n And the response:: "/path/to/command -with args"\n All requests and responses are terminated with a newline (indicated by ``\n``). Logging API +++++++++++ There's also an API for adding messages to CouchDB's logs. Its simply:: ["log", $MESG]\n Where ``$MESG`` is any arbitrary JSON. There is no response from this command. As with the config API, the trailing ``\n`` represents a newline byte. Dynamic Daemons +++++++++++++++ The OS daemons react in real time to changes to the configuration system. If you set or delete keys in the :config:section:`os_daemons` section, the corresponding daemons will be started or killed as appropriate. Neat. But So What? ------------------ It was suggested that a good first demo would be a `Node.js`_ handler. So, I present to you a "Hello, World" Node.js handler. Also, remember that this currently relies on code in my fork on `GitHub`_. File `node-hello-world.js`: .. code-block:: javascript var http = require('http'); var sys = require('sys'); // Send a log message to be included in CouchDB's // log files. var log = function(mesg) { console.log(JSON.stringify(["log", mesg])); } // The Node.js example HTTP server var server = http.createServer(function (req, resp) { resp.writeHead(200, {'Content-Type': 'text/plain'}); resp.end('Hello World\n'); log(req.method + " " + req.url); }) // We use stdin in a couple ways. First, we // listen for data that will be the requested // port information. We also listen for it // to close which indicates that CouchDB has // exited and that means its time for us to // exit as well. var stdin = process.openStdin(); stdin.on('data', function(d) { server.listen(parseInt(JSON.parse(d))); }); stdin.on('end', function () { process.exit(0); }); // Send the request for the port to listen on. console.log(JSON.stringify(["get", "node_hello", "port"])); File `local.ini` (Just add these to what you have): .. code-block:: ini [log] level = info [os_daemons] node_hello = /path/to/node-hello-world.js [node_hello] port = 8000 [httpd_global_handlers] _hello = {couch_httpd_proxy, handle_proxy_req, <<"http://127.0.0.1:8000">>} And then start CouchDB and try: .. code-block:: bash $ curl -v http://127.0.0.1:5984/_hello * About to connect() to 127.0.0.1 port 5984 (#0) * Trying 127.0.0.1... connected * Connected to 127.0.0.1 (127.0.0.1) port 5984 (#0) > GET /_hello HTTP/1.1 > User-Agent: curl/7.19.7 (universal-apple-darwin10.0) libcurl/7.19.7 OpenSSL/0.9.8l zlib/1.2.3 > Host: 127.0.0.1:5984 > Accept: */* > < HTTP/1.1 200 < Transfer-Encoding: chunked < Server: CouchDB (Erlang/OTP) < Date: Mon, 27 Sep 2010 01:13:37 GMT < Content-Type: text/plain < Connection: keep-alive < Hello World * Connection #0 to host 127.0.0.1 left intact * Closing connection #0 The corresponding CouchDB logs look like:: Apache CouchDB 1.5.0 (LogLevel=info) is starting. Apache CouchDB has started. Time to relax. [info] [<0.31.0>] Apache CouchDB has started on http://127.0.0.1:5984/ [info] [<0.105.0>] 127.0.0.1 - - 'GET' /_hello 200 [info] [<0.95.0>] Daemon "node-hello" :: GET / .. _external OS processes: http://wiki.apache.org/couchdb/ExternalProcesses .. _Runit: http://smarden.org/runit/ .. _Supervisord: http://supervisord.org/ .. _Node.js: http://nodejs.org/ .. _GitHub: http://github.com/davisp/couchdb/tree/new_externals .. _CouchDB-Lucene: https://github.com/rnewson/couchdb-lucene ��������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������apache-couchdb-1.6.0/share/doc/src/install/���������������������������������������������������������0000755�0001750�0000144�00000000000�12332106072�020423� 5����������������������������������������������������������������������������������������������������ustar�00djc�����������������������������users���������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������apache-couchdb-1.6.0/share/doc/src/install/freebsd.rst����������������������������������������������0000644�0001750�0000144�00000004727�12332105522�022600� 0����������������������������������������������������������������������������������������������������ustar�00djc�����������������������������users���������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������.. Licensed under the Apache License, Version 2.0 (the "License"); you may not .. use this file except in compliance with the License. You may obtain a copy of .. the License at .. .. http://www.apache.org/licenses/LICENSE-2.0 .. .. Unless required by applicable law or agreed to in writing, software .. distributed under the License is distributed on an "AS IS" BASIS, WITHOUT .. WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the .. License for the specific language governing permissions and limitations under .. the License. .. _install/freebsd: ======================= Installation on FreeBSD ======================= Installation from ports ======================= .. code-block:: text cd /usr/ports/databases/couchdb make install clean This will install CouchDB from the ports collection. Start script ------------ The following options for ``/etc/rc.conf`` or ``/etc/rc.conf.local`` are supported by the start script (defaults shown):: couchdb_enable="NO" couchdb_enablelogs="YES" couchdb_user="couchdb" After enabling the couchdb rc service use the following command to start CouchDB:: /usr/local/etc/rc.d/couchdb start This script responds to the arguments `start`, `stop`, `status`, `rcvar` etc.. The start script will also use settings from the following config files: - /usr/local/etc/couchdb/default.ini - /usr/local/etc/couchdb/local.ini Administrators should use ``default.ini`` as reference and only modify the ``local.ini`` file. Post install ------------ In case the install script fails to install a noninteractive user "couchdb" to be used for the database, the user needs to be created manually: I used the ``pw`` command to add a user "couchdb" in group "couchdb": .. code-block:: text pw user add couchdb pw user mod couchdb -c 'CouchDB, time to relax' -s /usr/sbin/nologin -d /var/lib/couchdb pw group add couchdb The user is added to ``/etc/passwd`` and should look similar to the following: .. code-block:: text shell# grep couchdb /etc/passwd couchdb:*:1013:1013:Couchdb, time to relax:/var/lib/couchdb/:/usr/sbin/nologin To change any of these settings, please refrain from editing `/etc/passwd` and instead use ``pw user mod ...`` or ``vipw``. Make sure that the user has no shell, but instead uses ``/usr/sbin/nologin``. The '*' in the second field means that this user can not login via password authorization. For details use `man 5 passwd`_. .. _man 5 passwd: http://linux.die.net/man/5/passwd �����������������������������������������apache-couchdb-1.6.0/share/doc/src/install/unix.rst�������������������������������������������������0000644�0001750�0000144�00000020301�12332105522�022133� 0����������������������������������������������������������������������������������������������������ustar�00djc�����������������������������users���������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������.. Licensed under the Apache License, Version 2.0 (the "License"); you may not .. use this file except in compliance with the License. You may obtain a copy of .. the License at .. .. http://www.apache.org/licenses/LICENSE-2.0 .. .. Unless required by applicable law or agreed to in writing, software .. distributed under the License is distributed on an "AS IS" BASIS, WITHOUT .. WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the .. License for the specific language governing permissions and limitations under .. the License. .. _install/unix: ================================= Installation on Unix-like systems ================================= A high-level guide to Unix-like systems, inc. Mac OS X and Ubuntu. This document is the canonical source of installation information. However, many systems have gotchas that you need to be aware of. In addition, dependencies frequently change as distributions update their archives. If you're running into trouble, be sure to check out the wiki. If you have any tips to share, please also update the wiki so that others can benefit from your experience. .. seealso:: `Community installation guides`_ .. _Community installation guides: http://wiki.apache.org/couchdb/Installation Troubleshooting --------------- * There is a `troubleshooting guide`_. * There is a `wiki`_ for general documentation. * There are collection of `friendly mailing lists`_. Please work through these in order if you experience any problems. .. _troubleshooting guide: http://wiki.apache.org/couchdb/Troubleshooting .. _wiki: http://wiki.apache.org/couchdb .. _friendly mailing lists: http://couchdb.apache.org/community/lists.html .. _install/unix/dependencies: Dependencies ------------ You should have the following installed: * `Erlang OTP (>=R14B01, =<R17) <http://erlang.org/>`_ * `ICU <http://icu-project.org/>`_ * `OpenSSL <http://www.openssl.org/>`_ * `Mozilla SpiderMonkey (1.8.5) <http://www.mozilla.org/js/spidermonkey/>`_ * `GNU Make <http://www.gnu.org/software/make/>`_ * `GNU Compiler Collection <http://gcc.gnu.org/>`_ * `libcurl <http://curl.haxx.se/libcurl/>`_ * `help2man <http://www.gnu.org/s/help2man/>`_ * `Python (>=2.7) for docs <http://python.org/>`_ * `Python Sphinx (>=1.1.3) <http://pypi.python.org/pypi/Sphinx>`_ It is recommended that you install Erlang OTP R13B-4 or above where possible. You will only need libcurl if you plan to run the JavaScript test suite. And help2man is only need if you plan on installing the CouchDB man pages. Python and Sphinx are only required for building the online documentation. Debian-based Systems ~~~~~~~~~~~~~~~~~~~~ You can install the dependencies by running:: sudo apt-get install build-essential sudo apt-get install erlang-base-hipe sudo apt-get install erlang-dev sudo apt-get install erlang-manpages sudo apt-get install erlang-eunit sudo apt-get install erlang-nox sudo apt-get install libicu-dev sudo apt-get install libmozjs-dev sudo apt-get install libcurl4-openssl-dev There are lots of Erlang packages. If there is a problem with your install, try a different mix. There is more information on the wiki. Additionally, you might want to install some of the optional Erlang tools which may also be useful. Be sure to update the version numbers to match your system's available packages. Unfortunately, it seems that installing dependencies on Ubuntu is troublesome. .. seealso:: * `Installing on Debian <http://wiki.apache.org/couchdb/Installing_on_Debian>`_ * `Installing on Ubuntu <http://wiki.apache.org/couchdb/Installing_on_Ubuntu>`_ RedHat-based (Fedora, Centos, RHEL) Systems ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ You can install the dependencies by running:: sudo yum install autoconf sudo yum install autoconf-archive sudo yum install automake sudo yum install curl-devel sudo yum install erlang-asn1 sudo yum install erlang-erts sudo yum install erlang-eunit sudo yum install erlang-os_mon sudo yum install erlang-xmerl sudo yum install help2man sudo yum install js-devel sudo yum install libicu-devel sudo yum install libtool sudo yum install perl-Test-Harness While CouchDB builds against the default js-devel-1.7.0 included in some distributions, it's recommended to use a more recent js-devel-1.8.5. Mac OS X ~~~~~~~~ Follow :ref:`install/mac/homebrew` reference till `brew install couchdb` step. Installing ---------- Once you have satisfied the dependencies you should run:: ./configure This script will configure CouchDB to be installed into `/usr/local` by default. If you wish to customise the installation, pass `--help` to this script. If everything was successful you should see the following message:: You have configured Apache CouchDB, time to relax. Relax. To install CouchDB you should run:: make && sudo make install You only need to use `sudo` if you're installing into a system directory. Try `gmake` if `make` is giving you any problems. If everything was successful you should see the following message:: You have installed Apache CouchDB, time to relax. Relax. First Run --------- You can start the CouchDB server by running:: sudo -i -u couchdb couchdb This uses the `sudo` command to run the `couchdb` command as the `couchdb` user. When CouchDB starts it should eventually display the following message:: Apache CouchDB has started, time to relax. Relax. To check that everything has worked, point your web browser to:: http://127.0.0.1:5984/_utils/index.html From here you should verify your installation by pointing your web browser to:: http://localhost:5984/_utils/verify_install.html Security Considerations ----------------------- You should create a special `couchdb` user for CouchDB. On many Unix-like systems you can run:: adduser --system \ --home /usr/local/var/lib/couchdb \ --no-create-home \ --shell /bin/bash \ --group --gecos \ "CouchDB Administrator" couchdb On Mac OS X you can use the `Workgroup Manager`_ to create users. You must make sure that: * The user has a working POSIX shell * The user's home directory is `/usr/local/var/lib/couchdb` You can test this by: * Trying to log in as the `couchdb` user * Running `pwd` and checking the present working directory Change the ownership of the CouchDB directories by running:: chown -R couchdb:couchdb /usr/local/etc/couchdb chown -R couchdb:couchdb /usr/local/var/lib/couchdb chown -R couchdb:couchdb /usr/local/var/log/couchdb chown -R couchdb:couchdb /usr/local/var/run/couchdb Change the permission of the CouchDB directories by running:: chmod 0770 /usr/local/etc/couchdb chmod 0770 /usr/local/var/lib/couchdb chmod 0770 /usr/local/var/log/couchdb chmod 0770 /usr/local/var/run/couchdb .. _Workgroup Manager: http://www.apple.com/support/downloads/serveradmintools1047.html Running as a Daemon ------------------- SysV/BSD-style Systems ~~~~~~~~~~~~~~~~~~~~~~ You can use the `couchdb` init script to control the CouchDB daemon. On SysV-style systems, the init script will be installed into:: /usr/local/etc/init.d On BSD-style systems, the init script will be installed into:: /usr/local/etc/rc.d We use the `[init.d|rc.d]` notation to refer to both of these directories. You can control the CouchDB daemon by running:: /usr/local/etc/[init.d|rc.d]/couchdb [start|stop|restart|status] If you wish to configure how the init script works, you can edit:: /usr/local/etc/default/couchdb Comment out the `COUCHDB_USER` setting if you're running as a non-superuser. To start the daemon on boot, copy the init script to:: /etc/[init.d|rc.d] You should then configure your system to run the init script automatically. You may be able to run:: sudo update-rc.d couchdb defaults If this fails, consult your system documentation for more information. A `logrotate` configuration is installed into:: /usr/local/etc/logrotate.d/couchdb Consult your `logrotate` documentation for more information. It is critical that the CouchDB logs are rotated so as not to fill your disk. �������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������apache-couchdb-1.6.0/share/doc/src/install/mac.rst��������������������������������������������������0000644�0001750�0000144�00000013741�12332105522�021722� 0����������������������������������������������������������������������������������������������������ustar�00djc�����������������������������users���������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������.. Licensed under the Apache License, Version 2.0 (the "License"); you may not .. use this file except in compliance with the License. You may obtain a copy of .. the License at .. .. http://www.apache.org/licenses/LICENSE-2.0 .. .. Unless required by applicable law or agreed to in writing, software .. distributed under the License is distributed on an "AS IS" BASIS, WITHOUT .. WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the .. License for the specific language governing permissions and limitations under .. the License. .. _install/mac: ======================== Installation on Mac OS X ======================== .. _install/mac/binary: Installation using the Apache CouchDB native application ======================================================== The easiest way to run CouchDB on Mac OS X is through the native Mac OS X application. Just follow the below instructions: #. `Download Apache CouchDB for Mac OS X`_. Old releases are available at `archive`_. #. Double click on the Zip file #. Drag and drop the Apache CouchDB.app into Applications folder .. _Download Apache CouchDB for Mac OS X: http://couchdb.org/#download .. _archive: http://archive.apache.org/dist/couchdb/binary/mac/ That's all, now CouchDB is installed on your Mac: #. Run Apache CouchDB application #. `Open up Futon`_, the CouchDB admin interface #. Time to Relax! .. _Open up Futon: http://localhost:5984/_utils .. _install/mac/homebrew: Installation with HomeBrew ========================== You can install the build tools by running:: open /Applications/Installers/Xcode\ Tools/XcodeTools.mpkg You will need `Homebrew`_ installed to use the `brew` command. To install the other :ref:`dependencies <install/unix/dependencies>` run next commands:: brew install autoconf brew install autoconf-archive brew install automake brew install libtool brew install erlang brew install icu4c brew install spidermonkey brew install curl You may want to link ICU so that CouchDB can find the header files automatically:: brew link icu4c The same is true for recent versions of Erlang:: brew link erlang Now it's time to brew CouchDB:: brew install couchdb The above Erlang install will use the bottled (pre-compiled) version if you are: using `/usr/local` for `homebrew`, and on 10.6 or 10.7. If you're not on one of these, `homebrew` will build from source, so consider doing:: brew install erlang --no-docs to trim down compilation time. If you're hacking on CouchDB, and we hope you will, you may try the current git-based master (head) branch, or the next development release using this ``couchdb`` recipe, using either ``--head`` or ``--devel`` options respectively. This will allow quick installation of the future release branch when it becomes active. If you're not sure if you need this, then you probably don't. In both cases we assume you are comfortable identifying bugs, and handling any potential upgrades between commits to the codebase. :: brew install [--devel|--head] couchdb .. note:: OS X Lion might hang on the final brew. See the thread at https://github.com/mxcl/homebrew/issues/7024 it seems in most cases to be resolved by breaking out with ``CTRL-C`` and then repeating with ``brew install -v couchdb``. If you wish to have CouchDB run as a daemon then, set up the account, using the "User & Groups" preference pane: - Create a standard user `couchdb` with home directory as `/usr/local/var/lib/couchdb` - Create a group called `couchdb` and add yourself, the `couchdb` user, and any others you want to be able to edit config or db files directly to it. Use the `advanced` group options to ensure the internal name is also correctly called `couchdb`. Some versions of Mac OS X ship a problematic OpenSSL library. If you're experiencing troubles with CouchDB crashing intermittently with a segmentation fault or a bus error, you will need to install your own version of OpenSSL. .. _Homebrew: http://mxcl.github.com/homebrew/ Running as a Daemon ------------------- You can use the `launchctl` command to control the CouchDB daemon. You can load the configuration by running:: sudo launchctl load \ /usr/local/Library/LaunchDaemons/org.apache.couchdb.plist You can stop the CouchDB daemon by running:: sudo launchctl unload \ /usr/local/Library/LaunchDaemons/org.apache.couchdb.plist You can start CouchDB by running:: sudo launchctl start org.apache.couchdb You can restart CouchDB by running:: sudo launchctl stop org.apache.couchdb You can edit the launchd configuration by running:: open /usr/local/Library/LaunchDaemons/org.apache.couchdb.plist To start the daemon on boot, copy the configuration file to:: /Library/LaunchDaemons Consult your system documentation for more information. .. _install/mac/macports: Installation from MacPorts ========================== To install CouchDB using MacPorts you have 2 package choices: - ``couchdb`` - the latest release version - ``couchdb-devel`` - updated every few weeks with the latest from the master branch :: $ sudo port install couchdb should be enough. MacPorts takes care of installing all necessary dependencies. If you have already installed some of the CouchDB dependencies via MacPorts, run this command to check and upgrade any outdated ones, after installing CouchDB:: $ sudo port upgrade couchdb This will upgrade dependencies recursively, if there are more recent versions available. If you want to run CouchDB as a service controlled by the OS, load the launchd configuration which comes with the project, with this command:: $ sudo port load couchdb and it should be up and accessible via Futon at http://127.0.0.1:5984/_utils. It should also be restarted automatically after reboot. Updating the ports collection. The collection of port files has to be updated to reflect the latest versions of available packages. In order to do that run:: $ sudo port selfupdate to update the port tree, and then install just as explained. �������������������������������apache-couchdb-1.6.0/share/doc/src/install/index.rst������������������������������������������������0000644�0001750�0000144�00000001244�12332105522�022264� 0����������������������������������������������������������������������������������������������������ustar�00djc�����������������������������users���������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������.. Licensed under the Apache License, Version 2.0 (the "License"); you may not .. use this file except in compliance with the License. You may obtain a copy of .. the License at .. .. http://www.apache.org/licenses/LICENSE-2.0 .. .. Unless required by applicable law or agreed to in writing, software .. distributed under the License is distributed on an "AS IS" BASIS, WITHOUT .. WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the .. License for the specific language governing permissions and limitations under .. the License. .. _install: ============ Installation ============ .. toctree:: :maxdepth: 2 unix windows mac freebsd ������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������apache-couchdb-1.6.0/share/doc/src/install/windows.rst����������������������������������������������0000644�0001750�0000144�00000020340�12332105522�022645� 0����������������������������������������������������������������������������������������������������ustar�00djc�����������������������������users���������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������.. Licensed under the Apache License, Version 2.0 (the "License"); you may not .. use this file except in compliance with the License. You may obtain a copy of .. the License at .. .. http://www.apache.org/licenses/LICENSE-2.0 .. .. Unless required by applicable law or agreed to in writing, software .. distributed under the License is distributed on an "AS IS" BASIS, WITHOUT .. WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the .. License for the specific language governing permissions and limitations under .. the License. .. _install/windows: ======================= Installation on Windows ======================= There are two ways to install CouchDB on Windows. Installation from binaries ========================== This is the simplest way to go. #. Get `the latest Windows binaries`_ from `CouchDB web site`_. Old releases are available at `archive`_. #. Follow the installation wizard steps: - Next on "Welcome" screen - Accept the License agreement - Select the installation directory - Specify "Start Menu" group name - Approve that you'd like to install CouchDB as service and let it be started automatically after installation (probably, you'd like so) - Verify installation settings - Install CouchDB #. `Open up Futon`_ (if you hadn't selected autostart CouchDB after installation, you have to start it first manually) #. It's time to Relax! .. note:: In some cases you might been asked to reboot Windows to complete installation process, because of using on different Microsoft Visual C++ runtimes by CouchDB. .. note:: **Upgrading note** It's recommended to uninstall previous CouchDB version before upgrading, especially if the new one is built against different Erlang release. The reason is simple: there may be leftover libraries with alternative or incompatible versions from old Erlang release that may create conflicts, errors and weird crashes. In this case, make sure you backup of your `local.ini` config and CouchDB database/index files. .. _Open up Futon: http://localhost:5984/_utils .. _CouchDB web site: http://couchdb.org/ .. _archive: http://archive.apache.org/dist/couchdb/binary/win/ .. _the latest Windows binaries: http://couchdb.org/#download Installation from sources ========================= If you're Windows geek, this section is for you! Troubleshooting --------------- * There is a `troubleshooting guide`_. * There is a `wiki`_ for general documentation. * And some `Windows-specific tips`_. * There are collection of `friendly mailing lists`_. Please work through these in order if you experience any problems. .. _troubleshooting guide: http://wiki.apache.org/couchdb/Troubleshooting .. _wiki: http://wiki.apache.org/couchdb .. _friendly mailing lists: http://couchdb.apache.org/community/lists.html .. _Windows-specific tips: http://wiki.apache.org/couchdb/Quirks_on_Windows Dependencies ------------ You should have the following installed: * `Erlang OTP (>=14B01, <R17) <http://erlang.org/>`_ * `ICU (>=4.*) <http://icu-project.org/>`_ * `OpenSSL (>0.9.8r) <http://www.openssl.org/>`_ * `Mozilla SpiderMonkey (=1.8.5) <http://www.mozilla.org/js/spidermonkey/>`_ * `Cygwin <http://www.cygwin.com/>`_ * `Microsoft SDK 7.0 or 7.1 <http://www.microsoft.com/en-us/download/details.aspx?id=8279>`_ * `libcurl (>=7.20) <http://curl.haxx.se/libcurl/>`_ * `help2man <http://www.gnu.org/s/help2man/>`_ * `Python (>=2.7) for docs <http://python.org/>`_ * `Python Sphinx (>=1.1.3) <http://pypi.python.org/pypi/Sphinx>`_ You will only need libcurl if you plan to run the JavaScript test suite. And help2man is only need if you plan on installing the CouchDB man pages. Python and Sphinx are only required for building the online documentation. General Notes ------------- * When installing Cygwin, be sure to select all the `development` tools. * When installing Erlang, you must build it from source. * The CouchDB build requires a number of the Erlang build scripts. * All dependent libraries should be built with the same version of Microsoft SDK. * Do not try to link against libraries built with, or included in, Cygwin or MingW. They are not compatible with the Erlang/OTP or CouchDB build scripts. * ICU version 4.6 and later will build cleanly using MSBuild. * Python and Sphinx are optional for building the online documentation. Use cygwin-provided Python and install Sphinx via easy_install or pip. Further information is here http://pypi.python.org/pypi/setuptools#id4 Setting Up Cygwin ----------------- Before starting any Cygwin terminals, run:: set CYGWIN=nontsec To set up your environment, run:: [VS_BIN]/vcvars32.bat Replace ``[VS_BIN]`` with the path to your Visual Studio `bin` directory. You must check that: * The ``which link`` command points to the Microsoft linker. * The ``which cl`` command points to the Microsoft compiler. * The ``which mc`` command points to the Microsoft message compiler. * The ``which mt`` command points to the Microsoft manifest tool. * The ``which nmake`` command points to the Microsoft make tool. If you do not do this, the build may fail due to Cygwin ones found in `/usr/bin` being used instead. Building Erlang --------------- You must include Win32 OpenSSL, built statically from source. Use exactly the same version as required by the Erlang/OTP build process. However, you can skip the GUI tools by running:: echo "skipping gs" > lib/gs/SKIP echo "skipping ic" > lib/ic/SKIP echo "skipping jinterface" > lib/jinterface/SKIP Follow the rest of the Erlang instructions as described. After running:: ./otp_build release -a You should run:: ./release/win32/Install.exe -s This will set up the release/win32/bin directory correctly. The CouchDB installation scripts currently write their data directly into this location. To set up your environment for building CouchDB, run:: eval `./otp_build env_win32` To set up the `ERL_TOP` environment variable, run:: export ERL_TOP=[ERL_TOP] Replace ``[ERL_TOP]`` with the Erlang source directory name. Remember to use `/cygdrive/c/` instead of `c:/` as the directory prefix. To set up your path, run:: export PATH=$ERL_TOP/release/win32/erts-5.8.5/bin:$PATH If everything was successful, you should be ready to build CouchDB. Relax. Building CouchDB ---------------- Note that `win32-curl` is only required if you wish to run the developer tests. The documentation step may be skipped using ``--disable-docs`` if you wish. Once you have satisfied the dependencies you should run:: ./configure \ --with-js-include=/cygdrive/c/path_to_spidermonkey_include \ --with-js-lib=/cygdrive/c/path_to_spidermonkey_lib \ --with-win32-icu-binaries=/cygdrive/c/path_to_icu_binaries_root \ --with-erlang=$ERL_TOP/release/win32/usr/include \ --with-win32-curl=/cygdrive/c/path/to/curl/root/directory \ --with-openssl-bin-dir=/cygdrive/c/openssl/bin \ --with-msvc-redist-dir=/cygdrive/c/dir/with/vcredist_platform_executable \ --disable-init \ --disable-launchd \ --prefix=$ERL_TOP/release/win32 This command could take a while to complete. If everything was successful you should see the following message:: You have configured Apache CouchDB, time to relax. Relax. To install CouchDB you should run:: make install If everything was successful you should see the following message:: You have installed Apache CouchDB, time to relax. Relax. To build the .exe installer package, you should run:: make dist Alternatively, you may run CouchDB directly from the build tree, but to avoid any contamination do not run `make dist` after this. First Run --------- You can start the CouchDB server by running:: $ERL_TOP/release/win32/bin/couchdb.bat When CouchDB starts it should eventually display the following message:: Apache CouchDB has started, time to relax. Relax. To check that everything has worked, point your web browser to:: http://127.0.0.1:5984/_utils/index.html From here you should run the verification tests in Firefox. .. seealso:: `Glazier: Automate building of CouchDB from source on Windows <https://github.com/dch/glazier>`_ ������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������apache-couchdb-1.6.0/share/doc/src/experimental.rst�������������������������������������������������0000644�0001750�0000144�00000004524�12332105522�022210� 0����������������������������������������������������������������������������������������������������ustar�00djc�����������������������������users���������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������.. Licensed under the Apache License, Version 2.0 (the "License"); you may not .. use this file except in compliance with the License. You may obtain a copy of .. the License at .. .. http://www.apache.org/licenses/LICENSE-2.0 .. .. Unless required by applicable law or agreed to in writing, software .. distributed under the License is distributed on an "AS IS" BASIS, WITHOUT .. WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the .. License for the specific language governing permissions and limitations under .. the License. .. _experimental: ===================== Experimental Features ===================== This is a list of experimental features in CouchDB. They are included in a release because the development team is requesting feedback from the larger developer community. As such, please play around with these features and send us feedback, thanks! Use at your own risk! Do not rely on these features for critical applications. NodeJS Query Server =================== The NodeJS Query Server is an alternative runtime environment for the default JavaScript Query Server that runs on top of Node.JS and not SpiderMonkey like the default Query Server. Setup ----- You will need to install Node.JS version 0.10.0 or later. See `Node.JS Downloads <http://nodejs.org/download/>`_ for options. 1. Install the `couchjs-node` binary. Either from the CouchDB sources:: cd src/couchjs-node npm link Or via NPM:: npm install -g couchjs .. note:: **NPM in non-standard locations** If your Node.JS installation doesn’t store binaries in `/usr/local/bin` you will need to adjust CouchDB’s configuration. Add this to your `local.ini` file: .. code-block:: ini [query_servers] nodejs = /path/to/couchjs-node /path/to/couchdb/share/server/main.js And then restart your CouchDB instance. 2. Done. Now you can create design documents with the `language` parameter set to `nodejs` and all JavaScript functions in this design document will be processed by the Node.JS query server. Enjoy! Differences from the SpiderMonkey Query Server ---------------------------------------------- V8 and SpiderMonkey roughly behave similar, but there might be engine- specific differences that make or break a JavaScript function in one or the other server. Plugins ======= See `src/couch_plugins/README.md`. ����������������������������������������������������������������������������������������������������������������������������������������������������������������������������apache-couchdb-1.6.0/share/doc/src/contents.rst�����������������������������������������������������0000644�0001750�0000144�00000002201�12332105522�021336� 0����������������������������������������������������������������������������������������������������ustar�00djc�����������������������������users���������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������.. Licensed under the Apache License, Version 2.0 (the "License"); you may not .. use this file except in compliance with the License. You may obtain a copy of .. the License at .. .. http://www.apache.org/licenses/LICENSE-2.0 .. .. Unless required by applicable law or agreed to in writing, software .. distributed under the License is distributed on an "AS IS" BASIS, WITHOUT .. WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the .. License for the specific language governing permissions and limitations under .. the License. |Apache CouchDB(TM)|_ |release| Documentation ============================================= .. toctree:: :maxdepth: 3 :numbered: 3 intro/index install/index config/index replication/index maintenance/index couchapp/index externals query-server/index fauxton/index api/index json-structure experimental contributing whatsnew/index cve/index about .. This is how you get a TM sign into a link. Haha. Seriously. .. |Apache CouchDB(TM)| unicode:: Apache U+0020 CouchDB U+2122 .. _Apache CouchDB(TM): http://couchdb.apache.org/ �����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������apache-couchdb-1.6.0/share/doc/build/���������������������������������������������������������������0000755�0001750�0000144�00000000000�12332106072�017265� 5����������������������������������������������������������������������������������������������������ustar�00djc�����������������������������users���������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������apache-couchdb-1.6.0/share/doc/build/html/����������������������������������������������������������0000755�0001750�0000144�00000000000�12332106073�020232� 5����������������������������������������������������������������������������������������������������ustar�00djc�����������������������������users���������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������apache-couchdb-1.6.0/share/doc/build/html/api/������������������������������������������������������0000755�0001750�0000144�00000000000�12332106072�021002� 5����������������������������������������������������������������������������������������������������ustar�00djc�����������������������������users���������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������apache-couchdb-1.6.0/share/doc/build/html/api/ddoc/�������������������������������������������������0000755�0001750�0000144�00000000000�12332106072�021713� 5����������������������������������������������������������������������������������������������������ustar�00djc�����������������������������users���������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������apache-couchdb-1.6.0/share/doc/build/html/api/ddoc/common.html��������������������������������������0000644�0001750�0000144�00000064054�12332105710�024100� 0����������������������������������������������������������������������������������������������������ustar�00djc�����������������������������users���������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������ <!-- Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. You may obtain a copy of the License at http://www.apache.org/licenses/LICENSE-2.0 Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License. --> <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <html xmlns="http://www.w3.org/1999/xhtml"> <head> <meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> <title>10.5.1. /db/_design/design-doc — Apache CouchDB 1.6 Documentation

    10.5.1. /db/_design/design-doc¶

    HEAD /{db}/_design/{ddoc}¶

    Returns the HTTP Headers containing a minimal amount of information about the specified design document.

    GET /{db}/_design/{ddoc}¶

    Returns the contents of the design document specified with the name of the design document and from the specified database from the URL. Unless you request a specific revision, the latest revision of the document will always be returned.

    PUT /{db}/_design/{ddoc}¶

    The PUT method creates a new named design document, or creates a new revision of the existing design document.

    The design documents have some agreement upon their fields and structure. Currently it is the following:

    Note, that for filters, lists, shows and updates fields objects are mapping of function name to string function source code. For views mapping is the same except that values are objects with map and reduce (optional) keys which also contains functions source code.

    DELETE /{db}/_design/{ddoc}¶

    Deletes the specified document from the database. You must supply the current (latest) revision, either by using the rev parameter to specify the revision.

    COPY /{db}/_design/{ddoc}¶

    The COPY (which is non-standard HTTP) copies an existing design document to a new or existing one.

    Note

    Copying a design document does automatically reconstruct the view indexes. These will be recreated, as with other views, the first time the new view is accessed.

    10.5.2. /db/_design/design-doc/attachment¶

    HEAD /{db}/_design/{ddoc}/{attname}¶

    Returns the HTTP headers containing a minimal amount of information about the specified attachment.

    GET /{db}/_design/{ddoc}/{attname}¶

    Returns the file attachment associated with the design document. The raw data of the associated attachment is returned (just as if you were accessing a static file.

    PUT /{db}/_design/{ddoc}/{attname}¶

    Uploads the supplied content as an attachment to the specified design document. The attachment name provided must be a URL encoded string.

    DELETE /{db}/_design/{ddoc}/{attname}¶

    Deletes the attachment of the specified design document.

    10.5.3. /db/_design/design-doc/_info¶

    GET /{db}/_design/{ddoc}/_info¶

    Obtains information about the specified design document, including the index, index size and current status of the design document and associated index information.

    Parameters:
    • db – Database name
    • ddoc – Design document name
    Request Headers:
     
    • Accept
      • application/json
      • text/plain
    Response Headers:
     
    • Content-Type
      • application/json
      • text/plain; charset=utf-8
    Response JSON Object:
     
    Status Codes:
    • 200 OK – Request completed successfully

    Request:

    GET /recipes/_design/recipe/_info HTTP/1.1
    Accept: application/json
    Host: localhost:5984
    

    Response:

    HTTP/1.1 200 OK
    Cache-Control: must-revalidate
    Content-Length: 263
    Content-Type: application/json
    Date: Sat, 17 Aug 2013 12:54:17 GMT
    Server: CouchDB (Erlang/OTP)
    
    {
        "name": "recipe",
        "view_index": {
            "compact_running": false,
            "data_size": 926691,
            "disk_size": 1982704,
            "language": "python",
            "purge_seq": 0,
            "signature": "a59a1bb13fdf8a8a584bc477919c97ac",
            "update_seq": 12397,
            "updater_running": false,
            "waiting_clients": 0,
            "waiting_commit": false
        }
    }
    

    View Index Information¶

    The response from GET /{db}/_design/{ddoc}/_info contains view_index (object) field with the next structure:

    • compact_running (boolean): Indicates whether a compaction routine is currently running on the view
    • data_size (number): Actual size in bytes of the view
    • disk_size (number): Size in bytes of the view as stored on disk
    • language (string): Language for the defined views
    • purge_seq (number): The purge sequence that has been processed
    • signature (string): MD5 signature of the views for the design document
    • update_seq (number): The update sequence of the corresponding database that has been indexed
    • updater_running (boolean): Indicates if the view is currently being updated
    • waiting_clients (number): Number of clients waiting on views from this design document
    • waiting_commit (boolean): Indicates if there are outstanding commits to the underlying database that need to processed
    apache-couchdb-1.6.0/share/doc/build/html/api/ddoc/index.html0000644000175000001440000003001712332105710023707 0ustar00djcusers00000000000000 10.5. Design Documents — Apache CouchDB 1.6 Documentation

    10.5. Design Documents¶

    In CouchDB, design documents provide the main interface for building a CouchDB application. The design document defines the views used to extract information from CouchDB through one or more views. Design documents are created within your CouchDB instance in the same way as you create database documents, but the content and definition of the documents is different. Design Documents are named using an ID defined with the design document URL path, and this URL can then be used to access the database contents.

    Views and lists operate together to provide automated (and formatted) output from your database.

    Previous topic

    10.4.2. /db/doc/attachment

    Next topic

    10.5.1. /db/_design/design-doc

    Utilities

    More Help

    apache-couchdb-1.6.0/share/doc/build/html/api/ddoc/render.html0000644000175000001440000012526612332105711024073 0ustar00djcusers00000000000000 10.5.5. /db/_design/design-doc/_show/show-name — Apache CouchDB 1.6 Documentation

    10.5.5. /db/_design/design-doc/_show/show-name¶

    GET /{db}/_design/{ddoc}/_show/{func}¶
    POST /{db}/_design/{ddoc}/_show/{func}¶

    Applies show function for null document.

    The request and response parameters are depended upon function implementation.

    Parameters:
    • db – Database name
    • ddoc – Design document name
    • func – Show function name
    Response Headers:
     
    • ETag – Response signature
    Query Parameters:
     
    • details (boolean) – Indicates whether details should be included
    • format (string) – Format of the returned response. Used by provides() function
    Status Codes:

    Function:

    function(doc, req) {
      if (!doc) {
        return {body: "no doc"}
      } else {
        return {body: doc.description}
      }
    }
    

    Request:

    GET /recipes/_design/recipe/_show/description HTTP/1.1
    Accept: application/json
    Host: localhost:5984
    

    Response:

    HTTP/1.1 200 OK
    Content-Length: 6
    Content-Type: text/html; charset=utf-8
    Date: Wed, 21 Aug 2013 12:34:07 GMT
    Etag: "7Z2TO7FPEMZ0F4GH0RJCRIOAU"
    Server: CouchDB (Erlang/OTP)
    Vary: Accept
    
    no doc
    

    10.5.6. /db/_design/design-doc/_show/show-name/doc-id¶

    GET /{db}/_design/{ddoc}/_show/{func}/{docid}¶
    POST /{db}/_design/{ddoc}/_show/{func}/{docid}¶

    Applies show function for the specified document.

    The request and response parameters are depended upon function implementation.

    Parameters:
    • db – Database name
    • ddoc – Design document name
    • func – Show function name
    • docid – Document ID
    Response Headers:
     
    • ETag – Response signature
    Query Parameters:
     
    • details (boolean) – Indicates whether details should be included
    • format (string) – Format of the returned response. Used by provides() function
    Status Codes:

    Function:

    function(doc, req) {
      if (!doc) {
        return {body: "no doc"}
      } else {
        return {body: doc.description}
      }
    }
    

    Request:

    GET /recipes/_design/recipe/_show/description/SpaghettiWithMeatballs HTTP/1.1
    Accept: application/json
    Host: localhost:5984
    

    Response:

    HTTP/1.1 200 OK
    Content-Length: 88
    Content-Type: text/html; charset=utf-8
    Date: Wed, 21 Aug 2013 12:38:08 GMT
    Etag: "8IEBO8103EI98HDZL5Z4I1T0C"
    Server: CouchDB (Erlang/OTP)
    Vary: Accept
    
    An Italian-American dish that usually consists of spaghetti, tomato sauce and meatballs.
    

    10.5.7. /db/_design/design-doc/_list/list-name/view-name¶

    GET /{db}/_design/{ddoc}/_list/{func}/{view}¶
    POST /{db}/_design/{ddoc}/_list/{func}/{view}¶

    Applies list function for the view function from the same design document.

    The request and response parameters are depended upon function implementation.

    Parameters:
    • db – Database name
    • ddoc – Design document name
    • func – List function name
    • view – View function name
    Response Headers:
     
    Query Parameters:
     
    • format (string) – Format of the returned response. Used by provides() function
    Status Codes:

    Function:

    function(head, req) {
      var row = getRow();
      if (!row){
        return 'no ingredients'
      }
      send(row.key);
      while(row=getRow()){
        send(', ' + row.key);
      }
    }
    

    Request:

    GET /recipes/_design/recipe/_list/ingredients/by_name HTTP/1.1
    Accept: text/plain
    Host: localhost:5984
    

    Response:

    HTTP/1.1 200 OK
    Content-Type: text/plain; charset=utf-8
    Date: Wed, 21 Aug 2013 12:49:15 GMT
    Etag: "D52L2M1TKQYDD1Y8MEYJR8C84"
    Server: CouchDB (Erlang/OTP)
    Transfer-Encoding: chunked
    Vary: Accept
    
    meatballs, spaghetti, tomato sauce
    

    10.5.8. /db/_design/design-doc/_list/list-name/other-ddoc/view-name¶

    GET /{db}/_design/{ddoc}/_list/{func}/{other-ddoc}/{view}¶
    POST /{db}/_design/{ddoc}/_list/{func}/{other-ddoc}/{view}¶

    Applies list function for the view function from the other design document.

    The request and response parameters are depended upon function implementation.

    Parameters:
    • db – Database name
    • ddoc – Design document name
    • func – List function name
    • other-ddoc – Other design document name that holds view function
    • view – View function name
    Response Headers:
     
    Query Parameters:
     
    • format (string) – Format of the returned response. Used by provides() function
    Status Codes:

    Function:

    function(head, req) {
      var row = getRow();
      if (!row){
        return 'no ingredients'
      }
      send(row.key);
      while(row=getRow()){
        send(', ' + row.key);
      }
    }
    

    Request:

    GET /recipes/_design/ingredient/_list/ingredients/recipe/by_ingredient?key="spaghetti" HTTP/1.1
    Accept: text/plain
    Host: localhost:5984
    

    Response:

    HTTP/1.1 200 OK
    Content-Type: text/plain; charset=utf-8
    Date: Wed, 21 Aug 2013 12:49:15 GMT
    Etag: "5L0975X493R0FB5Z3043POZHD"
    Server: CouchDB (Erlang/OTP)
    Transfer-Encoding: chunked
    Vary: Accept
    
    spaghetti
    

    10.5.9. /db/_design/design-doc/_update/update-name¶

    POST /{db}/_design/{ddoc}/_update/{func}¶

    Executes update function on server side for null document.

    Parameters:
    • db – Database name
    • ddoc – Design document name
    • func – Update function name
    Response Headers:
     
    • X-Couch-Id – Created/updated document’s ID
    • X-Couch-Update-Newrev – Created/updated document’s revision
    Status Codes:

    Function:

    function(doc, req) {
      if (!doc){
        return [null, {'code': 400,
                       'json': {'error': 'missed',
                                'reason': 'no document to update'}}]
      } else {
        doc.ingredients.push(req.body);
        return [doc, {'json': {'status': 'ok'}}];
      }
    }
    

    Request:

    POST /recipes/_design/recipe/_update/ingredients HTTP/1.1
    Accept: application/json
    Content-Length: 10
    Content-Type: application/json
    Host: localhost:5984
    
    something

    Response:

    HTTP/1.1 404 Object Not Found
    Cache-Control: must-revalidate
    Content-Length: 52
    Content-Type: application/json
    Date: Wed, 21 Aug 2013 14:00:58 GMT
    Server: CouchDB (Erlang/OTP)
    
    {
        "error": "missed",
        "reason": "no document to update"
    }
    

    10.5.10. /db/_design/design-doc/_update/update-name/doc-id¶

    PUT /{db}/_design/{ddoc}/_update/{func}/{docid}¶

    Executes update function on server side for the specified document.

    Parameters:
    • db – Database name
    • ddoc – Design document name
    • func – Update function name
    • docid – Document ID
    Response Headers:
     
    • X-Couch-Id – Created/updated document’s ID
    • X-Couch-Update-Newrev – Created/updated document’s revision
    Status Codes:

    Function:

    function(doc, req) {
      if (!doc){
        return [null, {'code': 400,
                       'json': {'error': 'missed',
                                'reason': 'no document to update'}}]
      } else {
        doc.ingredients.push(req.body);
        return [doc, {'json': {'status': 'ok'}}];
      }
    }
    

    Request:

    POST /recipes/_design/recipe/_update/ingredients/SpaghettiWithMeatballs HTTP/1.1
    Accept: application/json
    Content-Length: 5
    Content-Type: application/json
    Host: localhost:5984
    
    love

    Response:

    HTTP/1.1 201 Created
    Cache-Control: must-revalidate
    Content-Length: 16
    Content-Type: application/json
    Date: Wed, 21 Aug 2013 14:11:34 GMT
    Server: CouchDB (Erlang/OTP)
    X-Couch-Id: SpaghettiWithMeatballs
    X-Couch-Update-NewRev: 12-a5e099df5720988dae90c8b664496baf
    
    {
        "status": "ok"
    }
    
    apache-couchdb-1.6.0/share/doc/build/html/api/ddoc/views.html0000644000175000001440000020452312332105713023745 0ustar00djcusers00000000000000 10.5.4. /db/_design/design-doc/_view/view-name — Apache CouchDB 1.6 Documentation

    10.5.4. /db/_design/design-doc/_view/view-name¶

    GET /{db}/_design/{ddoc}/_view/{view}¶

    Executes the specified view function from the specified design document.

    Parameters:
    • db – Database name
    • ddoc – Design document name
    • view – View function name
    Request Headers:
     
    • Accept
      • application/json
      • text/plain
    Query Parameters:
     
    • conflicts (boolean) – Includes conflicts information in response. Ignored if include_docs isn’t true. Default is false
    • descending (boolean) – Return the documents in descending by key order. Default is false
    • endkey (string) – Stop returning records when the specified key is reached. Optional
    • end_key (string) – Alias for endkey param
    • endkey_docid (string) – Stop returning records when the specified document ID is reached. Optional
    • end_key_doc_id (string) – Alias for endkey_docid param
    • group (boolean) – Group the results using the reduce function to a group or single row. Default is false
    • group_level (number) – Specify the group level to be used. Optional
    • include_docs (boolean) – Include the associated document with each row. Default is false.
    • attachments (boolean) – Include the Base64-encoded content of attachments in the documents that are included if include_docs is true. Ignored if include_docs isn’t true. Default is false.
    • att_encoding_info (boolean) – Include encoding information in attachment stubs if include_docs is true and the particular attachment is compressed. Ignored if include_docs isn’t true. Default is false.
    • inclusive_end (boolean) – Specifies whether the specified end key should be included in the result. Default is true
    • key (string) – Return only documents that match the specified key. Optional
    • limit (number) – Limit the number of the returned documents to the specified number. Optional
    • reduce (boolean) – Use the reduction function. Default is true
    • skip (number) – Skip this number of records before starting to return the results. Default is 0
    • stale (string) – Allow the results from a stale view to be used. Supported values: ok and update_after. Optional
    • startkey (string) – Return records starting with the specified key. Optional
    • start_key (string) – Alias for startkey param
    • startkey_docid (string) – Return records starting with the specified document ID. Optional
    • start_key_doc_id (string) – Alias for startkey_docid param
    • update_seq (boolean) – Response includes an update_seq value indicating which sequence id of the database the view reflects. Default is false
    Response Headers:
     
    Response JSON Object:
     
    • offset (number) – Offset where the document list started
    • rows (array) – Array of view row objects. By default the information returned contains only the document ID and revision
    • total_rows (number) – Number of documents in the database/view
    • update_seq (number) – Current update sequence for the database
    Status Codes:

    Request:

    GET /recipes/_design/ingredients/_view/by_name HTTP/1.1
    Accept: application/json
    Host: localhost:5984
    

    Response:

    HTTP/1.1 200 OK
    Cache-Control: must-revalidate
    Content-Type: application/json
    Date: Wed, 21 Aug 2013 09:12:06 GMT
    ETag: "2FOLSBSW4O6WB798XU4AQYA9B"
    Server: CouchDB (Erlang/OTP)
    Transfer-Encoding: chunked
    
    {
        "offset": 0,
        "rows": [
            {
                "id": "SpaghettiWithMeatballs",
                "key": "meatballs",
                "value": 1
            },
            {
                "id": "SpaghettiWithMeatballs",
                "key": "spaghetti",
                "value": 1
            },
            {
                "id": "SpaghettiWithMeatballs",
                "key": "tomato sauce",
                "value": 1
            }
        ],
        "total_rows": 3
    }
    

    Changed in version 1.6.0: added attachments and att_encoding_info parameters

    Warning

    Using the attachments parameter to include attachments in view results is not recommended for large attachment sizes. Also note that the Base64-encoding that is used leads to a 33% overhead (i.e. one third) in transfer size for attachments.

    POST /{db}/_design/{ddoc}/_view/{view}¶

    Executes the specified view function from the specified design document. Unlike GET /{db}/_design/{ddoc}/_view/{view} for accessing views, the POST method supports the specification of explicit keys to be retrieved from the view results. The remainder of the POST view functionality is identical to the GET /{db}/_design/{ddoc}/_view/{view} API.

    Request:

    POST /recipes/_design/ingredients/_view/by_name HTTP/1.1
    Accept: application/json
    Content-Length: 37
    Host: localhost:5984
    
    {
        "keys": [
            "meatballs",
            "spaghetti"
        ]
    }
    

    Response:

    HTTP/1.1 200 OK
    Cache-Control: must-revalidate
    Content-Type: application/json
    Date: Wed, 21 Aug 2013 09:14:13 GMT
    ETag: "6R5NM8E872JIJF796VF7WI3FZ"
    Server: CouchDB (Erlang/OTP)
    Transfer-Encoding: chunked
    
    {
        "offset": 0,
        "rows": [
            {
                "id": "SpaghettiWithMeatballs",
                "key": "meatballs",
                "value": 1
            },
            {
                "id": "SpaghettiWithMeatballs",
                "key": "spaghetti",
                "value": 1
            }
        ],
        "total_rows": 3
    }
    

    View Options¶

    There are two view indexing options that can be defined in a design document as boolean properties of an options object. Unlike the others querying options, these aren’t URL parameters because they take effect when the view index is generated, not when it’s accessed:

    • local_seq (boolean): Makes documents’ local sequence numbers available to map functions (as a _local_seq document property)
    • include_design (boolean): Allows map functions to be called on design documents as well as regular documents

    In additional to these options, you may specify any other with their default value. E.g. having option "include_docs": true will automatically includes document body for view results response. You still may override such by explicitly defining same query parameter name with other value.

    Querying Views and Indexes¶

    The definition of a view within a design document also creates an index based on the key information defined within each view. The production and use of the index significantly increases the speed of access and searching or selecting documents from the view.

    However, the index is not updated when new documents are added or modified in the database. Instead, the index is generated or updated, either when the view is first accessed, or when the view is accessed after a document has been updated. In each case, the index is updated before the view query is executed against the database.

    View indexes are updated incrementally in the following situations:

    • A new document has been added to the database.
    • A document has been deleted from the database.
    • A document in the database has been updated.

    View indexes are rebuilt entirely when the view definition changes. To achieve this, a ‘fingerprint’ of the view definition is created when the design document is updated. If the fingerprint changes, then the view indexes are entirely rebuilt. This ensures that changes to the view definitions are reflected in the view indexes.

    Note

    View index rebuilds occur when one view from the same the view group (i.e. all the views defined within a single a design document) has been determined as needing a rebuild. For example, if if you have a design document with different views, and you update the database, all three view indexes within the design document will be updated.

    Because the view is updated when it has been queried, it can result in a delay in returned information when the view is accessed, especially if there are a large number of documents in the database and the view index does not exist. There are a number of ways to mitigate, but not completely eliminate, these issues. These include:

    • Create the view definition (and associated design documents) on your database before allowing insertion or updates to the documents. If this is allowed while the view is being accessed, the index can be updated incrementally.
    • Manually force a view request from the database. You can do this either before users are allowed to use the view, or you can access the view manually after documents are added or updated.
    • Use the changes feed to monitor for changes to the database and then access the view to force the corresponding view index to be updated.
    • Use a monitor with the update notification section of the CouchDB configuration file to monitor for changes to your database, and trigger a view query to force the view to be updated.

    None of these can completely eliminate the need for the indexes to be rebuilt or updated when the view is accessed, but they may lessen the effects on end-users of the index update affecting the user experience.

    Another alternative is to allow users to access a ‘stale’ version of the view index, rather than forcing the index to be updated and displaying the updated results. Using a stale view may not return the latest information, but will return the results of the view query using an existing version of the index.

    For example, to access the existing stale view by_recipe in the recipes design document:

    http://localhost:5984/recipes/_design/recipes/_view/by_recipe?stale=ok
    

    Accessing a stale view:

    • Does not trigger a rebuild of the view indexes, even if there have been changes since the last access.
    • Returns the current version of the view index, if a current version exists.
    • Returns an empty result set if the given view index does exist.

    As an alternative, you use the update_after value to the stale parameter. This causes the view to be returned as a stale view, but for the update process to be triggered after the view information has been returned to the client.

    In addition to using stale views, you can also make use of the update_seq query argument. Using this query argument generates the view information including the update sequence of the database from which the view was generated. The returned value can be compared this to the current update sequence exposed in the database information (returned by GET /{db}).

    Sorting Returned Rows¶

    Each element within the returned array is sorted using native UTF-8 sorting according to the contents of the key portion of the emitted content. The basic order of output is as follows:

    • null
    • false
    • true
    • Numbers
    • Text (case sensitive, lowercase first)
    • Arrays (according to the values of each element, in order)
    • Objects (according to the values of keys, in key order)

    Request:

    GET /db/_design/test/_view/sorting HTTP/1.1
    Accept: application/json
    Host: localhost:5984
    

    Response:

    HTTP/1.1 200 OK
    Cache-Control: must-revalidate
    Content-Type: application/json
    Date: Wed, 21 Aug 2013 10:09:25 GMT
    ETag: "8LA1LZPQ37B6R9U8BK9BGQH27"
    Server: CouchDB (Erlang/OTP)
    Transfer-Encoding: chunked
    
    {
        "offset": 0,
        "rows": [
            {
                "id": "dummy-doc",
                "key": null,
                "value": null
            },
            {
                "id": "dummy-doc",
                "key": false,
                "value": null
            },
            {
                "id": "dummy-doc",
                "key": true,
                "value": null
            },
            {
                "id": "dummy-doc",
                "key": 0,
                "value": null
            },
            {
                "id": "dummy-doc",
                "key": 1,
                "value": null
            },
            {
                "id": "dummy-doc",
                "key": 10,
                "value": null
            },
            {
                "id": "dummy-doc",
                "key": 42,
                "value": null
            },
            {
                "id": "dummy-doc",
                "key": "10",
                "value": null
            },
            {
                "id": "dummy-doc",
                "key": "hello",
                "value": null
            },
            {
                "id": "dummy-doc",
                "key": "Hello",
                "value": null
            },
            {
                "id": "dummy-doc",
                "key": "\u043f\u0440\u0438\u0432\u0435\u0442",
                "value": null
            },
            {
                "id": "dummy-doc",
                "key": [],
                "value": null
            },
            {
                "id": "dummy-doc",
                "key": [
                    1,
                    2,
                    3
                ],
                "value": null
            },
            {
                "id": "dummy-doc",
                "key": [
                    2,
                    3
                ],
                "value": null
            },
            {
                "id": "dummy-doc",
                "key": [
                    3
                ],
                "value": null
            },
            {
                "id": "dummy-doc",
                "key": {},
                "value": null
            },
            {
                "id": "dummy-doc",
                "key": {
                    "foo": "bar"
                },
                "value": null
            }
        ],
        "total_rows": 17
    }
    

    You can reverse the order of the returned view information by using the descending query value set to true:

    Request:

    GET /db/_design/test/_view/sorting?descending=true HTTP/1.1
    Accept: application/json
    Host: localhost:5984
    

    Response:

    HTTP/1.1 200 OK
    Cache-Control: must-revalidate
    Content-Type: application/json
    Date: Wed, 21 Aug 2013 10:09:25 GMT
    ETag: "Z4N468R15JBT98OM0AMNSR8U"
    Server: CouchDB (Erlang/OTP)
    Transfer-Encoding: chunked
    
    {
        "offset": 0,
        "rows": [
            {
                "id": "dummy-doc",
                "key": {
                    "foo": "bar"
                },
                "value": null
            },
            {
                "id": "dummy-doc",
                "key": {},
                "value": null
            },
            {
                "id": "dummy-doc",
                "key": [
                    3
                ],
                "value": null
            },
            {
                "id": "dummy-doc",
                "key": [
                    2,
                    3
                ],
                "value": null
            },
            {
                "id": "dummy-doc",
                "key": [
                    1,
                    2,
                    3
                ],
                "value": null
            },
            {
                "id": "dummy-doc",
                "key": [],
                "value": null
            },
            {
                "id": "dummy-doc",
                "key": "\u043f\u0440\u0438\u0432\u0435\u0442",
                "value": null
            },
            {
                "id": "dummy-doc",
                "key": "Hello",
                "value": null
            },
            {
                "id": "dummy-doc",
                "key": "hello",
                "value": null
            },
            {
                "id": "dummy-doc",
                "key": "10",
                "value": null
            },
            {
                "id": "dummy-doc",
                "key": 42,
                "value": null
            },
            {
                "id": "dummy-doc",
                "key": 10,
                "value": null
            },
            {
                "id": "dummy-doc",
                "key": 1,
                "value": null
            },
            {
                "id": "dummy-doc",
                "key": 0,
                "value": null
            },
            {
                "id": "dummy-doc",
                "key": true,
                "value": null
            },
            {
                "id": "dummy-doc",
                "key": false,
                "value": null
            },
            {
                "id": "dummy-doc",
                "key": null,
                "value": null
            }
        ],
        "total_rows": 17
    }
    

    Sorting order and startkey/endkey¶

    The sorting direction is applied before the filtering applied using the startkey and endkey query arguments. For example the following query:

    GET http://couchdb:5984/recipes/_design/recipes/_view/by_ingredient?startkey=%22carrots%22&endkey=%22egg%22
    Accept: application/json

    will operate correctly when listing all the matching entries between carrots and egg. If the order of output is reversed with the descending query argument, the view request will return no entries:

    GET /recipes/_design/recipes/_view/by_ingredient?descending=true&startkey=%22carrots%22&endkey=%22egg%22 HTTP/1.1
    Accept: application/json
    Host: localhost:5984
    
    {
       "total_rows" : 26453,
       "rows" : [],
       "offset" : 21882
    }
    

    The results will be empty because the entries in the view are reversed before the key filter is applied, and therefore the endkey of ā€œeggā€ will be seen before the startkey of ā€œcarrotsā€, resulting in an empty list.

    Instead, you should reverse the values supplied to the startkey and endkey parameters to match the descending sorting applied to the keys. Changing the previous example to:

    GET /recipes/_design/recipes/_view/by_ingredient?descending=true&startkey=%22egg%22&endkey=%22carrots%22 HTTP/1.1
    Accept: application/json
    Host: localhost:5984
    

    Raw collation¶

    By default CouchDB using ICU driver for sorting view results. It’s possible use binary collation instead for faster view builds where Unicode collation is not important.

    To use raw collation add "collation": "raw" key-value pair to the design documents options object at the root level. After that, views will be regenerated and new order applied.

    See also

    Views Collation

    Using Limits and Skipping Rows¶

    By default requestion views result returns all records for it. That’s ok when they are small, but this may lead to problems when there are billions of them since the clients might have to read them all and consume all available memory.

    But it’s possible to reduce output result rows by specifying limit query parameter. For example, retrieving the list of recipes using the by_title view and limited to 5 returns only 5 records, while there are total 2667 records in view:

    Request:

    GET /recipes/_design/recipes/_view/by_title?limit=5 HTTP/1.1
    Accept: application/json
    Host: localhost:5984
    

    Response:

    HTTP/1.1 200 OK
    Cache-Control: must-revalidate
    Content-Type: application/json
    Date: Wed, 21 Aug 2013 09:14:13 GMT
    ETag: "9Q6Q2GZKPH8D5F8L7PB6DBSS9"
    Server: CouchDB (Erlang/OTP)
    Transfer-Encoding: chunked
    
    {
       "offset" : 0,
       "rows" : [
          {
             "id" : "3-tiersalmonspinachandavocadoterrine",
             "key" : "3-tier salmon, spinach and avocado terrine",
             "value" : [
                null,
                "3-tier salmon, spinach and avocado terrine"
             ]
          },
          {
             "id" : "Aberffrawcake",
             "key" : "Aberffraw cake",
             "value" : [
                null,
                "Aberffraw cake"
             ]
          },
          {
             "id" : "Adukiandorangecasserole-microwave",
             "key" : "Aduki and orange casserole - microwave",
             "value" : [
                null,
                "Aduki and orange casserole - microwave"
             ]
          },
          {
             "id" : "Aioli-garlicmayonnaise",
             "key" : "Aioli - garlic mayonnaise",
             "value" : [
                null,
                "Aioli - garlic mayonnaise"
             ]
          },
          {
             "id" : "Alabamapeanutchicken",
             "key" : "Alabama peanut chicken",
             "value" : [
                null,
                "Alabama peanut chicken"
             ]
          }
       ],
       "total_rows" : 2667
    }
    

    To omit some records you may use skip query parameter:

    Request:

    GET /recipes/_design/recipes/_view/by_title?limit=3&skip=2 HTTP/1.1
    Accept: application/json
    Host: localhost:5984
    

    Response:

    HTTP/1.1 200 OK
    Cache-Control: must-revalidate
    Content-Type: application/json
    Date: Wed, 21 Aug 2013 09:14:13 GMT
    ETag: "H3G7YZSNIVRRHO5FXPE16NJHN"
    Server: CouchDB (Erlang/OTP)
    Transfer-Encoding: chunked
    
    {
       "offset" : 2,
       "rows" : [
          {
             "id" : "Adukiandorangecasserole-microwave",
             "key" : "Aduki and orange casserole - microwave",
             "value" : [
                null,
                "Aduki and orange casserole - microwave"
             ]
          },
          {
             "id" : "Aioli-garlicmayonnaise",
             "key" : "Aioli - garlic mayonnaise",
             "value" : [
                null,
                "Aioli - garlic mayonnaise"
             ]
          },
          {
             "id" : "Alabamapeanutchicken",
             "key" : "Alabama peanut chicken",
             "value" : [
                null,
                "Alabama peanut chicken"
             ]
          }
       ],
       "total_rows" : 2667
    }
    

    Warning

    Using limit and skip parameters is not recommended for results pagination. Read pagination recipe why it’s so and how to make it better.

    apache-couchdb-1.6.0/share/doc/build/html/api/ddoc/rewrites.html0000644000175000001440000003406212332105711024451 0ustar00djcusers00000000000000 10.5.11. /db/_design/design-doc/_rewrite/path — Apache CouchDB 1.6 Documentation

    10.5.11. /db/_design/design-doc/_rewrite/path¶

    ANY /{db}/_design/{ddoc}/_rewrite/{path}¶

    Rewrites the specified path by rules defined in the specified design document.

    The rewrite rules are defined in array field of the design document called rewrites. Each rule is an object with next structure:

    • from (string): The path rule used to bind current uri to the rule. It use pattern matching for that
    • to (string): Rule to rewrite an url. It can contain variables depending on binding variables discovered during pattern matching and query args (url args and from the query member)
    • method (string): HTTP request method to bind the request method to the rule. Default is "*"
    • query (object): Query args you want to define they can contain dynamic variable by binding the key

    The to``and ``from paths may contains string patterns with leading : or * characters.

    For example: /somepath/:var/*

    • This path is converted in Erlang list by splitting /
    • Each var are converted in atom
    • "" are converted to '' atom
    • The pattern matching is done by splitting / in request url in a list of token
    • A string pattern will match equal token
    • The star atom ('*' in single quotes) will match any number of tokens, but may only be present as the last pathterm in a pathspec
    • If all tokens are matched and all pathterms are used, then the pathspec matches

    The pattern matching is done by first matching the HTTP request method to a rule. method is equal to "*" by default, and will match any HTTP method. It will then try to match the path to one rule. If no rule matches, then a 404 Not Found response returned.

    Once a rule is found we rewrite the request url using the to and query fields. The identified token are matched to the rule and will replace var. If '*' is found in the rule it will contain the remaining part if it exists.

    Examples:

    Rule Url Rewrite to Tokens
    {“from”: “/a”, “to”: “/some”} /a /some  
    {“from”: “/a/*”, “to”: “/some/*} /a/b/c /some/b/c  
    {“from”: “/a/b”, “to”: “/some”} /a/b?k=v /some?k=v k=v
    {“from”: “/a/b”, “to”: “/some/:var”} /a/b /some/b?var=b var=b
    {“from”: “/a/:foo/”, “to”: “/some/:foo/”} /a/b/c /some/b/c?foo=b foo=b
    {“from”: “/a/:foo”, “to”: “/some”, “query”: { “k”: ”:foo” }} /a/b /some/?k=b&foo=b foo=b
    {“from”: “/a”, “to”: “/some/:foo”} /a?foo=b /some/?b&foo=b foo=b

    Request method, header, query parameters, request payload and response body are depended on endpoint to which url will be rewritten.

    Parameters:
    • db – Database name
    • ddoc – Design document name
    • path – URL path to rewrite
    apache-couchdb-1.6.0/share/doc/build/html/api/database/0000755000175000001440000000000012332106072022546 5ustar00djcusers00000000000000apache-couchdb-1.6.0/share/doc/build/html/api/database/bulk-api.html0000644000175000001440000016305212332105702025146 0ustar00djcusers00000000000000 10.3.2. /db/_all_docs — Apache CouchDB 1.6 Documentation

    10.3.2. /db/_all_docs¶

    GET /{db}/_all_docs¶

    Returns a JSON structure of all of the documents in a given database. The information is returned as a JSON structure containing meta information about the return structure, including a list of all documents and basic contents, consisting the ID, revision and key. The key is the from the document’s _id.

    Parameters:
    • db – Database name
    Request Headers:
     
    • Accept
      • application/json
      • text/plain
    Query Parameters:
     
    • conflicts (boolean) – Includes conflicts information in response. Ignored if include_docs isn’t true. Default is false.
    • descending (boolean) – Return the documents in descending by key order. Default is false.
    • endkey (string) – Stop returning records when the specified key is reached. Optional.
    • end_key (string) – Alias for endkey param.
    • endkey_docid (string) – Stop returning records when the specified document ID is reached. Optional.
    • end_key_doc_id (string) – Alias for endkey_docid param.
    • include_docs (boolean) – Include the full content of the documents in the return. Default is false.
    • inclusive_end (boolean) – Specifies whether the specified end key should be included in the result. Default is true.
    • key (string) – Return only documents that match the specified key. Optional.
    • limit (number) – Limit the number of the returned documents to the specified number. Optional.
    • skip (number) – Skip this number of records before starting to return the results. Default is 0.
    • stale (string) – Allow the results from a stale view to be used, without triggering a rebuild of all views within the encompassing design doc. Supported values: ok and update_after. Optional.
    • startkey (string) – Return records starting with the specified key. Optional.
    • start_key (string) – Alias for startkey param.
    • startkey_docid (string) – Return records starting with the specified document ID. Optional.
    • start_key_doc_id (string) – Alias for startkey_docid param.
    • update_seq (boolean) – Response includes an update_seq value indicating which sequence id of the underlying database the view reflects. Default is false.
    Response Headers:
     
    • Content-Type
      • application/json
      • text/plain; charset=utf-8
    • ETag – Response signature
    Response JSON Object:
     
    • offset (number) – Offset where the document list started
    • rows (array) – Array of view row objects. By default the information returned contains only the document ID and revision.
    • total_rows (number) – Number of documents in the database/view. Note that this is not the number of rows returned in the actual query.
    • update_seq (number) – Current update sequence for the database
    Status Codes:
    • 200 OK – Request completed successfully

    Request:

    GET /db/_all_docs HTTP/1.1
    Accept: application/json
    Host: localhost:5984
    

    Response:

    HTTP/1.1 200 OK
    Cache-Control: must-revalidate
    Content-Type: application/json
    Date: Sat, 10 Aug 2013 16:22:56 GMT
    ETag: "1W2DJUZFZSZD9K78UFA3GZWB4"
    Server: CouchDB (Erlang/OTP)
    Transfer-Encoding: chunked
    
    {
        "offset": 0,
        "rows": [
            {
                "id": "16e458537602f5ef2a710089dffd9453",
                "key": "16e458537602f5ef2a710089dffd9453",
                "value": {
                    "rev": "1-967a00dff5e02add41819138abb3284d"
                }
            },
            {
                "id": "a4c51cdfa2069f3e905c431114001aff",
                "key": "a4c51cdfa2069f3e905c431114001aff",
                "value": {
                    "rev": "1-967a00dff5e02add41819138abb3284d"
                }
            },
            {
                "id": "a4c51cdfa2069f3e905c4311140034aa",
                "key": "a4c51cdfa2069f3e905c4311140034aa",
                "value": {
                    "rev": "5-6182c9c954200ab5e3c6bd5e76a1549f"
                }
            },
            {
                "id": "a4c51cdfa2069f3e905c431114003597",
                "key": "a4c51cdfa2069f3e905c431114003597",
                "value": {
                    "rev": "2-7051cbe5c8faecd085a3fa619e6e6337"
                }
            },
            {
                "id": "f4ca7773ddea715afebc4b4b15d4f0b3",
                "key": "f4ca7773ddea715afebc4b4b15d4f0b3",
                "value": {
                    "rev": "2-7051cbe5c8faecd085a3fa619e6e6337"
                }
            }
        ],
        "total_rows": 5
    }
    
    POST /{db}/_all_docs¶

    The POST to _all_docs allows to specify multiple keys to be selected from the database. This enables you to request multiple documents in a single request, in place of multiple GET /{db}/{docid} requests.

    The request body should contain a list of the keys to be returned as an array to a keys object. For example:

    POST /db/_all_docs HTTP/1.1
    Accept: application/json
    Content-Length: 70
    Content-Type: application/json
    Host: localhost:5984
    
    {
       "keys" : [
          "Zingylemontart",
          "Yogurtraita"
       ]
    }
    

    The returned JSON is the all documents structure, but with only the selected keys in the output:

    {
       "total_rows" : 2666,
       "rows" : [
          {
             "value" : {
                "rev" : "1-a3544d296de19e6f5b932ea77d886942"
             },
             "id" : "Zingylemontart",
             "key" : "Zingylemontart"
          },
          {
             "value" : {
                "rev" : "1-91635098bfe7d40197a1b98d7ee085fc"
             },
             "id" : "Yogurtraita",
             "key" : "Yogurtraita"
          }
       ],
       "offset" : 0
    }
    

    10.3.3. /db/_bulk_docs¶

    POST /{db}/_bulk_docs¶

    The bulk document API allows you to create and update multiple documents at the same time within a single request. The basic operation is similar to creating or updating a single document, except that you batch the document structure and information.

    When creating new documents the document ID (_id) is optional.

    For updating existing documents, you must provide the document ID, revision information (_rev), and new document values.

    In case of batch deleting documents all fields as document ID, revision information and deletion status (_deleted) are required.

    Parameters:
    • db – Database name
    Request Headers:
     
    • Accept
      • application/json
      • text/plain
    • Content-Typeapplication/json
    • X-Couch-Full-Commit – Overrides server’s commit policy. Possible values are: false and true. Optional
    Request JSON Object:
     
    • all_or_nothing (boolean) – Sets the database commit mode to use all-or-nothing semantics. Default is false. Optional
    • docs (array) – List of documents objects
    • new_edits (boolean) – If false, prevents the database from assigning them new revision IDs. Default is true. Optional
    Response Headers:
     
    • Content-Type
      • application/json
      • text/plain; charset=utf-8
    Response JSON Array of Objects:
     
    • id (string) – Document ID
    • rev (string) – New document revision token. Available if document have saved without errors. Optional
    • error (string) – Error type. Optional
    • reason (string) – Error reason. Optional
    Status Codes:

    Request:

    POST /db/_bulk_docs HTTP/1.1
    Accept: application/json
    Content-Length: 109
    Content-Type:application/json
    Host: localhost:5984
    
    {
      "docs": [
        {
          "_id": "FishStew"
        },
        {
          "_id": "LambStew",
          "_rev": "2-0786321986194c92dd3b57dfbfc741ce",
          "_deleted": true
        }
      ]
    }
    

    Response:

    HTTP/1.1 201 Created
    Cache-Control: must-revalidate
    Content-Length: 144
    Content-Type: application/json
    Date: Mon, 12 Aug 2013 00:15:05 GMT
    Server: CouchDB (Erlang/OTP)
    
    [
      {
        "ok": true,
        "id": "FishStew",
        "rev":" 1-967a00dff5e02add41819138abb3284d"
      },
      {
        "ok": true,
        "id": "LambStew",
        "rev": "3-f9c62b2169d0999103e9f41949090807"
      }
    ]
    

    Inserting Documents in Bulk¶

    Each time a document is stored or updated in CouchDB, the internal B-tree is updated. Bulk insertion provides efficiency gains in both storage space, and time, by consolidating many of the updates to intermediate B-tree nodes.

    It is not intended as a way to perform ACID-like transactions in CouchDB, the only transaction boundary within CouchDB is a single update to a single database. The constraints are detailed in Bulk Documents Transaction Semantics.

    To insert documents in bulk into a database you need to supply a JSON structure with the array of documents that you want to add to the database. You can either include a document ID, or allow the document ID to be automatically generated.

    For example, the following update inserts three new documents, two with the supplied document IDs, and one which will have a document ID generated:

    POST /source/_bulk_docs HTTP/1.1
    Accept: application/json
    Content-Length: 323
    Content-Type: application/json
    Host: localhost:5984
    
    {
        "docs": [
            {
                "_id": "FishStew",
                "servings": 4,
                "subtitle": "Delicious with freshly baked bread",
                "title": "FishStew"
            },
            {
                "_id": "LambStew",
                "servings": 6,
                "subtitle": "Serve with a whole meal scone topping",
                "title": "LambStew"
            },
            {
                "_id": "BeefStew",
                "servings": 8,
                "subtitle": "Hand-made dumplings make a great accompaniment",
                "title": "BeefStew"
            }
        ]
    }
    

    The return type from a bulk insertion will be 201 Created, with the content of the returned structure indicating specific success or otherwise messages on a per-document basis.

    The return structure from the example above contains a list of the documents created, here with the combination and their revision IDs:

    HTTP/1.1 201 Created
    Cache-Control: must-revalidate
    Content-Length: 215
    Content-Type: application/json
    Date: Sat, 26 Oct 2013 00:10:39 GMT
    Server: CouchDB (Erlang OTP)
    
    [
        {
            "id": "FishStew",
            "ok": true,
            "rev": "1-6a466d5dfda05e613ba97bd737829d67"
        },
        {
            "id": "LambStew",
            "ok": true,
            "rev": "1-648f1b989d52b8e43f05aa877092cc7c"
        },
        {
            "id": "BeefStew",
            "ok": true,
            "rev": "1-e4602845fc4c99674f50b1d5a804fdfa"
        }
    ]
    

    The content and structure of the returned JSON will depend on the transaction semantics being used for the bulk update; see Bulk Documents Transaction Semantics for more information. Conflicts and validation errors when updating documents in bulk must be handled separately; see Bulk Document Validation and Conflict Errors.

    Updating Documents in Bulk¶

    The bulk document update procedure is similar to the insertion procedure, except that you must specify the document ID and current revision for every document in the bulk update JSON string.

    For example, you could send the following request:

    POST /recipes/_bulk_docs HTTP/1.1
    Accept: application/json
    Content-Length: 464
    Content-Type: application/json
    Host: localhost:5984
    
    {
        "docs": [
            {
                "_id": "FishStew",
                "_rev": "1-6a466d5dfda05e613ba97bd737829d67",
                "servings": 4,
                "subtitle": "Delicious with freshly baked bread",
                "title": "FishStew"
            },
            {
                "_id": "LambStew",
                "_rev": "1-648f1b989d52b8e43f05aa877092cc7c",
                "servings": 6,
                "subtitle": "Serve with a whole meal scone topping",
                "title": "LambStew"
            },
            {
                "_id": "BeefStew",
                "_rev": "1-e4602845fc4c99674f50b1d5a804fdfa",
                "servings": 8,
                "subtitle": "Hand-made dumplings make a great accompaniment",
                "title": "BeefStew"
            }
        ]
    }
    

    The return structure is the JSON of the updated documents, with the new revision and ID information:

    HTTP/1.1 201 Created
    Cache-Control: must-revalidate
    Content-Length: 215
    Content-Type: application/json
    Date: Sat, 26 Oct 2013 00:10:39 GMT
    Server: CouchDB (Erlang OTP)
    
    [
        {
            "id": "FishStew",
            "ok": true,
            "rev": "2-2bff94179917f1dec7cd7f0209066fb8"
        },
        {
            "id": "LambStew",
            "ok": true,
            "rev": "2-6a7aae7ac481aa98a2042718d09843c4"
        },
        {
            "id": "BeefStew",
            "ok": true,
            "rev": "2-9801936a42f06a16f16c30027980d96f"
        }
    ]
    

    You can optionally delete documents during a bulk update by adding the _deleted field with a value of true to each document ID/revision combination within the submitted JSON structure.

    The return type from a bulk insertion will be 201 Created, with the content of the returned structure indicating specific success or otherwise messages on a per-document basis.

    The content and structure of the returned JSON will depend on the transaction semantics being used for the bulk update; see Bulk Documents Transaction Semantics for more information. Conflicts and validation errors when updating documents in bulk must be handled separately; see Bulk Document Validation and Conflict Errors.

    Bulk Documents Transaction Semantics¶

    CouchDB supports two different modes for updating (or inserting) documents using the bulk documentation system. Each mode affects both the state of the documents in the event of system failure, and the level of conflict checking performed on each document. The two modes are:

    • non-atomic

      The default mode is non-atomic, that is, CouchDB will only guarantee that some of the documents will be saved when you send the request. The response will contain the list of documents successfully inserted or updated during the process. In the event of a crash, some of the documents may have been successfully saved, and some will have been lost.

      In this mode, the response structure will indicate whether the document was updated by supplying the new _rev parameter indicating a new document revision was created. If the update failed, then you will get an error of type conflict. For example:

      [
         {
            "id" : "FishStew",
            "error" : "conflict",
            "reason" : "Document update conflict."
         },
         {
            "id" : "LambStew",
            "error" : "conflict",
            "reason" : "Document update conflict."
         },
         {
            "id" : "BeefStew",
            "error" : "conflict",
            "reason" : "Document update conflict."
         }
      ]
      

      In this case no new revision has been created and you will need to submit the document update, with the correct revision tag, to update the document.

    • all-or-nothing

      In all-or-nothing mode, either all documents are written to the database, or no documents are written to the database, in the event of a system failure during commit.

      In addition, the per-document conflict checking is not performed. Instead a new revision of the document is created, even if the new revision is in conflict with the current revision in the database. The returned structure contains the list of documents with new revisions:

      HTTP/1.1 201 Created
      Cache-Control: must-revalidate
      Content-Length: 215
      Content-Type: application/json
      Date: Sat, 26 Oct 2013 00:13:33 GMT
      Server: CouchDB (Erlang OTP)
      
      [
          {
              "id": "FishStew",
              "ok": true,
              "rev": "1-6a466d5dfda05e613ba97bd737829d67"
          },
          {
              "id": "LambStew",
              "ok": true,
              "rev": "1-648f1b989d52b8e43f05aa877092cc7c"
          },
          {
              "id": "BeefStew",
              "ok": true,
              "rev": "1-e4602845fc4c99674f50b1d5a804fdfa"
          }
      ]
      

      When updating documents using this mode the revision of a document included in views will be arbitrary. You can check the conflict status for a document by using the conflicts=true query argument when accessing the view. Conflicts should be handled individually to ensure the consistency of your database.

      To use this mode, you must include the all_or_nothing field (set to true) within the main body of the JSON of the request.

    The effects of different database operations on the different modes are summarized below:

    • Transaction Mode: Non-atomic
      • Transaction: Insert
        • Cause: Requested document ID already exists
        • Resolution: Resubmit with different document ID, or update the existing document
      • Transaction: Update
        • Cause: Revision missing or incorrect
        • Resolution: Resubmit with correct revision
    • Transaction Mode: All-or-nothing
      • Transaction: Insert / Update
        • Cause: Additional revision inserted
        • Resolution: Resolve conflicted revisions

    Replication of documents is independent of the type of insert or update. The documents and revisions created during a bulk insert or update are replicated in the same way as any other document. This can mean that if you make use of the all-or-nothing mode the exact list of documents, revisions (and their conflict state) may or may not be replicated to other databases correctly.

    Bulk Document Validation and Conflict Errors¶

    The JSON returned by the _bulk_docs operation consists of an array of JSON structures, one for each document in the original submission. The returned JSON structure should be examined to ensure that all of the documents submitted in the original request were successfully added to the database.

    When a document (or document revision) is not correctly committed to the database because of an error, you should check the error field to determine error type and course of action. Errors will be one of the following type:

    • conflict

      The document as submitted is in conflict. If you used the default bulk transaction mode then the new revision will not have been created and you will need to re-submit the document to the database. If you used all-or-nothing mode then you will need to manually resolve the conflicted revisions of the document.

      Conflict resolution of documents added using the bulk docs interface is identical to the resolution procedures used when resolving conflict errors during replication.

    • forbidden

      Entries with this error type indicate that the validation routine applied to the document during submission has returned an error.

      For example, if your validation routine includes the following:

      throw({forbidden: 'invalid recipe ingredient'});
      

      The error response returned will be:

      HTTP/1.1 417 Expectation Failed
      Cache-Control: must-revalidate
      Content-Length: 120
      Content-Type: application/json
      Date: Sat, 26 Oct 2013 00:05:17 GMT
      Server: CouchDB (Erlang OTP)
      
      {
          "error": "forbidden",
          "id": "LambStew",
          "reason": "invalid recipe ingredient",
          "rev": "1-34c318924a8f327223eed702ddfdc66d"
      }
      
    apache-couchdb-1.6.0/share/doc/build/html/api/database/common.html0000644000175000001440000013005512332105705024732 0ustar00djcusers00000000000000 10.3.1. /db — Apache CouchDB 1.6 Documentation

    10.3.1. /db¶

    HEAD /{db}¶

    Returns the HTTP Headers containing a minimal amount of information about the specified database. Since the response body is empty, using the HEAD method is a lightweight way to check if the database exists already or not.

    Parameters:
    • db – Database name
    Status Codes:

    Request:

    HEAD /test HTTP/1.1
    Host: localhost:5984
    

    Response:

    HTTP/1.1 200 OK
    Cache-Control: must-revalidate
    Content-Type: application/json
    Date: Mon, 12 Aug 2013 01:27:41 GMT
    Server: CouchDB (Erlang/OTP)
    
    GET /{db}¶

    Gets information about the specified database.

    Parameters:
    • db – Database name
    Request Headers:
     
    • Accept
      • application/json
      • text/plain
    Response Headers:
     
    • Content-Type
      • application/json
      • text/plain; charset=utf-8
    Response JSON Object:
     
    • committed_update_seq (number) – The number of committed update.
    • compact_running (boolean) – Set to true if the database compaction routine is operating on this database.
    • db_name (string) – The name of the database.
    • disk_format_version (number) – The version of the physical format used for the data when it is stored on disk.
    • data_size (number) – Actual data size in bytes of the database data.
    • disk_size (number) – Size in bytes of the data as stored on the disk. Views indexes are not included in the calculation.
    • doc_count (number) – A count of the documents in the specified database.
    • doc_del_count (number) – Number of deleted documents
    • instance_start_time (string) – Timestamp of when the database was opened, expressed in microseconds since the epoch.
    • purge_seq (number) – The number of purge operations on the database.
    • update_seq (number) – The current number of updates to the database.
    Status Codes:

    Request:

    GET /receipts HTTP/1.1
    Accept: application/json
    Host: localhost:5984
    

    Response:

    HTTP/1.1 200 OK
    Cache-Control: must-revalidate
    Content-Length: 258
    Content-Type: application/json
    Date: Mon, 12 Aug 2013 01:38:57 GMT
    Server: CouchDB (Erlang/OTP)
    
    {
        "committed_update_seq": 292786,
        "compact_running": false,
        "data_size": 65031503,
        "db_name": "receipts",
        "disk_format_version": 6,
        "disk_size": 137433211,
        "doc_count": 6146,
        "doc_del_count": 64637,
        "instance_start_time": "1376269325408900",
        "purge_seq": 0,
        "update_seq": 292786
    }
    
    PUT /{db}¶

    Creates a new database. The database name {db} must be composed by following next rules:

    • Name must begin with a lowercase letter (a-z)
    • Lowercase characters (a-z)
    • Digits (0-9)
    • Any of the characters _, $, (, ), +, -, and /.

    If you’re familiar with Regular Expressions, the rules above could be written as ^[a-z][a-z0-9_$()+/-]*$.

    Parameters:
    • db – Database name
    Request Headers:
     
    • Accept
      • application/json
      • text/plain
    Response Headers:
     
    Response JSON Object:
     
    • ok (boolean) – Operation status. Available in case of success
    • error (string) – Error type. Available if response code is 4xx
    • reason (string) – Error description. Available if response code is 4xx
    Status Codes:

    Request:

    PUT /db HTTP/1.1
    Accept: application/json
    Host: localhost:5984
    

    Response:

    HTTP/1.1 201 Created
    Cache-Control: must-revalidate
    Content-Length: 12
    Content-Type: application/json
    Date: Mon, 12 Aug 2013 08:01:45 GMT
    Location: http://localhost:5984/db
    Server: CouchDB (Erlang/OTP)
    
    {
        "ok": true
    }
    

    If we repeat the same request to CouchDB, it will response with 412 since the database already exists:

    Request:

    PUT /db HTTP/1.1
    Accept: application/json
    Host: localhost:5984
    

    Response:

    HTTP/1.1 412 Precondition Failed
    Cache-Control: must-revalidate
    Content-Length: 95
    Content-Type: application/json
    Date: Mon, 12 Aug 2013 08:01:16 GMT
    Server: CouchDB (Erlang/OTP)
    
    {
        "error": "file_exists",
        "reason": "The database could not be created, the file already exists."
    }
    

    If an invalid database name is supplied, CouchDB returns response with 400:

    Request:

    PUT /_db HTTP/1.1
    Accept: application/json
    Host: localhost:5984
    

    Request:

    HTTP/1.1 400 Bad Request
    Cache-Control: must-revalidate
    Content-Length: 194
    Content-Type: application/json
    Date: Mon, 12 Aug 2013 08:02:10 GMT
    Server: CouchDB (Erlang/OTP)
    
    {
        "error": "illegal_database_name",
        "reason": "Name: '_db'. Only lowercase characters (a-z), digits (0-9), and any of the characters _, $, (, ), +, -, and / are allowed. Must begin with a letter."
    }
    
    DELETE /{db}¶

    Deletes the specified database, and all the documents and attachments contained within it.

    Note

    To avoid deleting a database, CouchDB will respond with the HTTP status code 400 when the request URL includes a ?rev= parameter. This suggests that one wants to delete a document but forgot to add the document id to the URL.

    Parameters:
    • db – Database name
    Request Headers:
     
    • Accept
      • application/json
      • text/plain
    Response Headers:
     
    • Content-Type
      • application/json
      • text/plain; charset=utf-8
    Response JSON Object:
     
    • ok (boolean) – Operation status
    Status Codes:

    Request:

    DELETE /db HTTP/1.1
    Accept: application/json
    Host: localhost:5984
    

    Response:

    HTTP/1.1 200 OK
    Cache-Control: must-revalidate
    Content-Length: 12
    Content-Type: application/json
    Date: Mon, 12 Aug 2013 08:54:00 GMT
    Server: CouchDB (Erlang/OTP)
    
    {
        "ok": true
    }
    
    POST /{db}¶

    Creates a new document in the specified database, using the supplied JSON document structure.

    If the JSON structure includes the _id field, then the document will be created with the specified document ID.

    If the _id field is not specified, a new unique ID will be generated, following whatever UUID algorithm is configured for that server.

    Parameters:
    • db – Database name
    Request Headers:
     
    • Accept
      • application/json
      • text/plain
    • Content-Typeapplication/json
    • X-Couch-Full-Commit – Overrides server’s commit policy. Possible values are: false and true. Optional.
    Query Parameters:
     
    • batch (string) – Stores document in batch mode Possible values: ok. Optional
    Response Headers:
     
    • Content-Type
      • application/json
      • text/plain; charset=utf-8
    • ETag – Quoted new document’s revision
    • Location – Document’s URI
    Response JSON Object:
     
    • id (string) – Document ID
    • ok (boolean) – Operation status
    • rev (string) – Revision info
    Status Codes:

    Request:

    POST /db HTTP/1.1
    Accept: application/json
    Content-Length: 81
    Content-Type: application/json
    
    {
        "servings": 4,
        "subtitle": "Delicious with fresh bread",
        "title": "Fish Stew"
    }
    

    Response:

    HTTP/1.1 201 Created
    Cache-Control: must-revalidate
    Content-Length: 95
    Content-Type: application/json
    Date: Tue, 13 Aug 2013 15:19:25 GMT
    ETag: "1-9c65296036141e575d32ba9c034dd3ee"
    Location: http://localhost:5984/db/ab39fe0993049b84cfa81acd6ebad09d
    Server: CouchDB (Erlang/OTP)
    
    {
        "id": "ab39fe0993049b84cfa81acd6ebad09d",
        "ok": true,
        "rev": "1-9c65296036141e575d32ba9c034dd3ee"
    }
    

    Specifying the Document ID¶

    The document ID can be specified by including the _id field in the JSON of the submitted record. The following request will create the same document with the ID FishStew.

    Request:

    POST /db HTTP/1.1
    Accept: application/json
    Content-Length: 98
    Content-Type: application/json
    
    {
        "_id": "FishStew",
        "servings": 4,
        "subtitle": "Delicious with fresh bread",
        "title": "Fish Stew"
    }
    

    Response:

    HTTP/1.1 201 Created
    Cache-Control: must-revalidate
    Content-Length: 71
    Content-Type: application/json
    Date: Tue, 13 Aug 2013 15:19:25 GMT
    ETag: "1-9c65296036141e575d32ba9c034dd3ee"
    Location: http://localhost:5984/db/FishStew
    Server: CouchDB (Erlang/OTP)
    
    {
        "id": "FishStew",
        "ok": true,
        "rev": "1-9c65296036141e575d32ba9c034dd3ee"
    }
    

    Batch Mode Writes¶

    You can write documents to the database at a higher rate by using the batch option. This collects document writes together in memory (on a user-by-user basis) before they are committed to disk. This increases the risk of the documents not being stored in the event of a failure, since the documents are not written to disk immediately.

    To use the batched mode, append the batch=ok query argument to the URL of the PUT or POST /{db} request. The CouchDB server will respond with a HTTP 202 Accepted response code immediately.

    Note

    Creating or updating documents with batch mode doesn’t guarantee that all documents will be successfully stored on disk. For example, individual documents may not be saved due to conflicts, rejection by validation function or by other reasons, even if overall the batch was sucessfully submitted.

    Request:

    POST /db?batch=ok HTTP/1.1
    Accept: application/json
    Content-Length: 98
    Content-Type: application/json
    
    {
        "_id": "FishStew",
        "servings": 4,
        "subtitle": "Delicious with fresh bread",
        "title": "Fish Stew"
    }
    

    Response:

    HTTP/1.1 202 Accepted
    Cache-Control: must-revalidate
    Content-Length: 28
    Content-Type: application/json
    Date: Tue, 13 Aug 2013 15:19:25 GMT
    Location: http://localhost:5984/db/FishStew
    Server: CouchDB (Erlang/OTP)
    
    {
        "id": "FishStew",
        "ok": true
    }
    
    apache-couchdb-1.6.0/share/doc/build/html/api/database/security.html0000644000175000001440000005355012332105707025317 0ustar00djcusers00000000000000 10.3.9. /db/_security — Apache CouchDB 1.6 Documentation

    10.3.9. /db/_security¶

    GET /{db}/_security¶

    Returns the current security object from the specified database.

    The security object consists of two compulsory elements, admins and members, which are used to specify the list of users and/or roles that have admin and members rights to the database respectively:

    • members: they can read all types of documents from the DB, and they can write (and edit) documents to the DB except for design documents.
    • admins: they have all the privileges of members plus the privileges: write (and edit) design documents, add/remove database admins and members, set the database revisions limit and execute temporary views against the database. They can not create a database nor delete a database.

    Both members and admins objects are contains two array-typed fields:

    • users: List of CouchDB user names
    • roles: List of users roles

    Any other additional fields in the security object are optional. The entire security object is made available to validation and other internal functions so that the database can control and limit functionality.

    If both the names and roles fields of either the admins or members properties are empty arrays, it means the database has no admins or members.

    Having no admins, only server admins (with the reserved _admin role) are able to update design document and make other admin level changes.

    Having no members, any user can write regular documents (any non-design document) and read documents from the database.

    If there are any member names or roles defined for a database, then only authenticated users having a matching name or role are allowed to read documents from the database (or do a GET /{db} call).

    Note

    If the security object for a database has never been set, then the value returned will be empty.

    Also note, that security objects are not regular versioned documents (that is, they are not under MVCC rules). This is a design choice to speedup authorization checks (avoids traversing a database`s documents B-Tree).

    Parameters:
    • db – Database name
    Request Headers:
     
    • Accept
      • application/json
      • text/plain
    Response Headers:
     
    • Content-Type
      • application/json
      • text/plain; charset=utf-8
    Response JSON Object:
     
    • admins (object) – Object with two fields as names and roles. See description above for more info.
    • members (object) – Object with two fields as names and roles. See description above for more info.
    Status Codes:
    • 200 OK – Request completed successfully

    Request:

    GET /db/_security HTTP/1.1
    Accept: application/json
    Host: localhost:5984
    

    Response:

    HTTP/1.1 200 OK
    Cache-Control: must-revalidate
    Content-Length: 109
    Content-Type: application/json
    Date: Mon, 12 Aug 2013 19:05:29 GMT
    Server: CouchDB (Erlang/OTP)
    
    {
        "admins": {
            "names": [
                "superuser"
            ],
            "roles": [
                "admins"
            ]
        },
        "members": {
            "names": [
                "user1",
                "user2"
            ],
            "roles": [
                "developers"
            ]
        }
    }
    
    PUT /{db}/_security¶

    Sets the security object for the given database.

    Parameters:
    • db – Database name
    Request Headers:
     
    Request JSON Object:
     
    Response Headers:
     
    • Content-Type
      • application/json
      • text/plain; charset=utf-8
    Response JSON Object:
     
    • ok (boolean) – Operation status
    Status Codes:
    • 200 OK – Request completed successfully
    • 401 Unauthorized – CouchDB Server Administrator privileges required

    Request:

    PUT /db/_security HTTP/1.1
    Accept: application/json
    Content-Length: 121
    Content-Type: application/json
    Host: localhost:5984
    
    {
        "admins": {
            "names": [
                "superuser"
            ],
            "roles": [
                "admins"
            ]
        },
        "members": {
            "names": [
                "user1",
                "user2"
            ],
            "roles": [
                "developers"
            ]
        }
    }
    

    Response:

    HTTP/1.1 200 OK
    Cache-Control: must-revalidate
    Content-Length: 12
    Content-Type: application/json
    Date: Tue, 13 Aug 2013 11:26:28 GMT
    Server: CouchDB (Erlang/OTP)
    
    {
        "ok": true
    }
    

    Previous topic

    10.3.5. /db/_compact

    Next topic

    10.3.10. /db/_temp_view

    Utilities

    More Help

    apache-couchdb-1.6.0/share/doc/build/html/api/database/index.html0000644000175000001440000003202312332105706024546 0ustar00djcusers00000000000000 10.3. Databases — Apache CouchDB 1.6 Documentation

    10.3. Databases¶

    The Database endpoint provides an interface to an entire database with in CouchDB. These are database-level, rather than document-level requests.

    For all these requests, the database name within the URL path should be the database name that you wish to perform the operation on. For example, to obtain the meta information for the database recipes, you would use the HTTP request:

    GET /recipes

    For clarity, the form below is used in the URL paths:

    GET /db

    Where db is the name of any database.

    Previous topic

    10.2.13. Configuration

    Next topic

    10.3.1. /db

    Utilities

    More Help

    apache-couchdb-1.6.0/share/doc/build/html/api/database/compact.html0000644000175000001440000007216312332105705025075 0ustar00djcusers00000000000000 10.3.5. /db/_compact — Apache CouchDB 1.6 Documentation

    10.3.5. /db/_compact¶

    POST /{db}/_compact¶

    Request compaction of the specified database. Compaction compresses the disk database file by performing the following operations:

    • Writes a new, optimised, version of the database file, removing any unused sections from the new version during write. Because a new file is temporarily created for this purpose, you may require up to twice the current storage space of the specified database in order for the compaction routine to complete.
    • Removes old revisions of documents from the database, up to the per-database limit specified by the _revs_limit database parameter.

    Compaction can only be requested on an individual database; you cannot compact all the databases for a CouchDB instance. The compaction process runs as a background process.

    You can determine if the compaction process is operating on a database by obtaining the database meta information, the compact_running value of the returned database structure will be set to true. See GET /{db}.

    You can also obtain a list of running processes to determine whether compaction is currently running. See /_active_tasks.

    Parameters:
    • db – Database name
    Request Headers:
     
    Response Headers:
     
    • Content-Type
      • application/json
      • text/plain; charset=utf-8
    Response JSON Object:
     
    • ok (boolean) – Operation status
    Status Codes:

    Request:

    POST /db/_compact HTTP/1.1
    Accept: application/json
    Content-Type: application/json
    Host: localhost:5984
    

    Response:

    HTTP/1.1 202 Accepted
    Cache-Control: must-revalidate
    Content-Length: 12
    Content-Type: application/json
    Date: Mon, 12 Aug 2013 09:27:43 GMT
    Server: CouchDB (Erlang/OTP)
    
    {
        "ok": true
    }
    

    10.3.6. /db/_compact/design-doc¶

    POST /{db}/_compact/{ddoc}¶

    Compacts the view indexes associated with the specified design document. If may be that compacting a large view can return more storage than compacting the actual db. Thus, you can use this in place of the full database compaction if you know a specific set of view indexes have been affected by a recent database change.

    Parameters:
    • db – Database name
    • ddoc – Design document name
    Request Headers:
     
    Response Headers:
     
    • Content-Type
      • application/json
      • text/plain; charset=utf-8
    Response JSON Object:
     
    • ok (boolean) – Operation status
    Status Codes:

    Request:

    POST /db/_compact/posts HTTP/1.1
    Accept: application/json
    Content-Type: application/json
    Host: localhost:5984
    

    Response:

    HTTP/1.1 202 Accepted
    Cache-Control: must-revalidate
    Content-Length: 12
    Content-Type: application/json
    Date: Mon, 12 Aug 2013 09:36:44 GMT
    Server: CouchDB (Erlang/OTP)
    
    {
        "ok": true
    }
    
    .. note::
    
      View indexes are stored in a separate ``.couch`` file based on
      a hash of the design document's relevant functions, in a sub directory
      of where the main ``.couch`` database files are located.

    10.3.7. /db/_ensure_full_commit¶

    POST /{db}/_ensure_full_commit¶

    Commits any recent changes to the specified database to disk. You should call this if you want to ensure that recent changes have been flushed. This function is likely not required, assuming you have the recommended configuration setting of delayed_commits=false, which requires CouchDB to ensure changes are written to disk before a 200 or similar result is returned.

    Parameters:
    • db – Database name
    Request Headers:
     
    Response Headers:
     
    • Content-Type
      • application/json
      • text/plain; charset=utf-8
    Response JSON Object:
     
    • instance_start_time (string) – Timestamp of when the database was opened, expressed in microseconds since the epoch.
    • ok (boolean) – Operation status
    Status Codes:

    Request:

    POST /db/_ensure_full_commit HTTP/1.1
    Accept: application/json
    Content-Type: application/json
    Host: localhost:5984
    

    Response:

    HTTP/1.1 201 Created
    Cache-Control: must-revalidate
    Content-Length: 53
    Content-Type: application/json
    Date: Mon, 12 Aug 2013 10:22:19 GMT
    Server: CouchDB (Erlang/OTP)
    
    {
        "instance_start_time": "1376269047459338",
        "ok": true
    }
    

    10.3.8. /db/_view_cleanup¶

    POST /{db}/_view_cleanup¶

    Removes view index files that are no longer required by CouchDB as a result of changed views within design documents. As the view filename is based on a hash of the view functions, over time old views will remain, consuming storage. This call cleans up the cached view output on disk for a given view.

    Parameters:
    • db – Database name
    Request Headers:
     
    Response Headers:
     
    • Content-Type
      • application/json
      • text/plain; charset=utf-8
    Response JSON Object:
     
    • ok (boolean) – Operation status
    Status Codes:

    Request:

    POST /db/_view_cleanup HTTP/1.1
    Accept: application/json
    Content-Type: application/json
    Host: localhost:5984
    

    Response:

    HTTP/1.1 202 Accepted
    Cache-Control: must-revalidate
    Content-Length: 12
    Content-Type: application/json
    Date: Mon, 12 Aug 2013 09:27:43 GMT
    Server: CouchDB (Erlang/OTP)
    
    {
        "ok": true
    }
    
    apache-couchdb-1.6.0/share/doc/build/html/api/database/temp-views.html0000644000175000001440000003015712332105707025546 0ustar00djcusers00000000000000 10.3.10. /db/_temp_view — Apache CouchDB 1.6 Documentation

    10.3.10. /db/_temp_view¶

    POST /{db}/_temp_view¶

    Creates (and executes) a temporary view based on the view function supplied in the JSON request.

    The arguments also available to standard view requests also apply to temporary views, but the execution of the view may take some time as it relies on being executed at the time of the request. This means that for every temporary view you create, the entire database will be read one doc at a time and passed through the view function.

    This should not be used on production CouchDB instances, and is purely a convenience function for quick development testing. You should use a defined view if you want to achieve the best performance.

    See /db/_design/design-doc/_view/view-name for more info.

    Request:

    POST /db/_temp_view?group=true HTTP/1.1
    Accept: application/json
    Content-Length: 92
    Content-Type: application/json
    Host: localhost:5984
    
    {
        "map": "function(doc) { if (doc.value) { emit(doc.value, null); } }",
        "reduce": "_count"
    }
    

    Response:

    HTTP/1.1 200 OK
    Cache-Control: must-revalidate
    Content-Type: application/json
    Date: Tue, 13 Aug 2013 12:28:12 GMT
    ETag: "AU33B3N7S9K4SAZSFA048HVB4"
    Server: CouchDB (Erlang/OTP)
    Transfer-Encoding: chunked
    
    {
        "rows": [
            {
                "key": -10,
                "value": 1
            },
            {
                "key": 10,
                "value": 2
            },
            {
                "key": 15,
                "value": 1
            }
        ]
    }
    

    Previous topic

    10.3.9. /db/_security

    Next topic

    10.3.11. /db/_purge

    Utilities

    More Help

    apache-couchdb-1.6.0/share/doc/build/html/api/database/changes.html0000644000175000001440000015165212332105704025057 0ustar00djcusers00000000000000 10.3.4. /db/_changes — Apache CouchDB 1.6 Documentation

    10.3.4. /db/_changes¶

    GET /{db}/_changes¶

    Returns a sorted list of changes made to documents in the database, in time order of application, can be obtained from the database’s _changes resource. Only the most recent change for a given document is guaranteed to be provided, for example if a document has had fields added, and then deleted, an API client checking for changes will not necessarily receive the intermediate state of added documents.

    This can be used to listen for update and modifications to the database for post processing or synchronization, and for practical purposes, a continuously connected _changes feed is a reasonable approach for generating a real-time log for most applications.

    Parameters:
    • db – Database name
    Request Headers:
     
    • Accept
      • application/json
      • text/event-stream
      • text/plain
    • Last-Event-ID – ID of the last events received by the server on a previous connection. Overrides since query parameter.
    Query Parameters:
     
    • doc_ids (array) – List of document IDs to filter the changes feed as valid JSON array. Used with _doc_ids filter. Since length of URL is limited, it is better to use POST /{db}/_changes instead.
    • conflicts (boolean) – Includes conflicts information in response. Ignored if include_docs isn’t true. Default is false.
    • descending (boolean) – Return the change results in descending sequence order (most recent change first). Default is false.
    • feed (string) – see Changes Feeds. Default is normal.
    • filter (string) – Reference to a filter function from a design document that will filter whole stream emitting only filtered events. See the section Change Notifications in the book CouchDB The Definitive Guide for more information.
    • heartbeat (number) – Period in milliseconds after which an empty line is sent in the results. Only applicable for longpoll or continuous feeds. Overrides any timeout to keep the feed alive indefinitely. Default is 60000. May be true to use default value.
    • include_docs (boolean) – Include the associated document with each result. If there are conflicts, only the winning revision is returned. Default is false.
    • attachments (boolean) – Include the Base64-encoded content of attachments in the documents that are included if include_docs is true. Ignored if include_docs isn’t true. Default is false.
    • att_encoding_info (boolean) – Include encoding information in attachment stubs if include_docs is true and the particular attachment is compressed. Ignored if include_docs isn’t true. Default is false.
    • last-event-id (number) – Alias of Last-Event-ID header.
    • limit (number) – Limit number of result rows to the specified value (note that using 0 here has the same effect as 1).
    • since – Start the results from the change immediately after the given sequence number. Can be integer number or now value. Default is 0.
    • style (string) – Specifies how many revisions are returned in the changes array. The default, main_only, will only return the current “winning” revision; all_docs will return all leaf revisions (including conflicts and deleted former conflicts).
    • timeout (number) – Maximum period in milliseconds to wait for a change before the response is sent, even if there are no results. Only applicable for longpoll or continuous feeds. Default value is specified by httpd/changes_timeout configuration option. Note that 60000 value is also the default maximum timeout to prevent undetected dead connections.
    • view (string) – Allows to use view functions as filters. Documents counted as “passed” for view filter in case if map function emits at least one record for them. See _view for more info.
    Response Headers:
     
    Response JSON Object:
     
    • last_seq (number) – Last change sequence number
    • results (array) – Changes made to a database
    Status Codes:

    The result field of database changes

    JSON Object:
    • changes (array) – List of document`s leafs with single field rev
    • id (string) – Document ID
    • seq (number) – Update sequence number

    Request:

    GET /db/_changes?style=all_docs HTTP/1.1
    Accept: application/json
    Host: localhost:5984
    

    Response:

    HTTP/1.1 200 OK
    Cache-Control: must-revalidate
    Content-Type: application/json
    Date: Mon, 12 Aug 2013 00:54:58 GMT
    ETag: "6ASLEKEMSRABT0O5XY9UPO9Z"
    Server: CouchDB (Erlang/OTP)
    Transfer-Encoding: chunked
    
    {
        "last_seq": 11,
        "results": [
            {
                "changes": [
                    {
                        "rev": "2-7051cbe5c8faecd085a3fa619e6e6337"
                    }
                ],
                "id": "6478c2ae800dfc387396d14e1fc39626",
                "seq": 6
            },
            {
                "changes": [
                    {
                        "rev": "3-7379b9e515b161226c6559d90c4dc49f"
                    }
                ],
                "deleted": true,
                "id": "5bbc9ca465f1b0fcd62362168a7c8831",
                "seq": 9
            },
            {
                "changes": [
                    {
                        "rev": "6-460637e73a6288cb24d532bf91f32969"
                    },
                    {
                        "rev": "5-eeaa298781f60b7bcae0c91bdedd1b87"
                    }
                ],
                "id": "729eb57437745e506b333068fff665ae",
                "seq": 11
            }
        ]
    }
    

    Changed in version 0.11.0: added include_docs parameter

    Changed in version 1.2.0: added view parameter and special value _view for filter one

    Changed in version 1.3.0: since parameter could take now value to start listen changes since current seq number.

    Changed in version 1.3.0: eventsource feed type added.

    Changed in version 1.4.0: Support Last-Event-ID header.

    Changed in version 1.6.0: added attachments and att_encoding_info parameters

    Warning

    Using the attachments parameter to include attachments in the changes feed is not recommended for large attachment sizes. Also note that the Base64-encoding that is used leads to a 33% overhead (i.e. one third) in transfer size for attachments.

    POST /{db}/_changes¶

    Requests the database changes feed in the same way as GET /{db}/_changes does, but is widely used with ?filter=_doc_ids query parameter and allows one to pass a larger list of document IDs to filter.

    Request:

    POST /recipes/_changes?filter=_doc_ids HTTP/1.1
    Accept: application/json
    Content-Length: 40
    Content-Type: application/json
    Host: localhost:5984
    
    {
        "doc_ids": [
            "SpaghettiWithMeatballs"
        ]
    }
    

    Response:

    HTTP/1.1 200 OK
    Cache-Control: must-revalidate
    Content-Type: application/json
    Date: Sat, 28 Sep 2013 07:23:09 GMT
    ETag: "ARIHFWL3I7PIS0SPVTFU6TLR2"
    Server: CouchDB (Erlang OTP)
    Transfer-Encoding: chunked
    
    {
        "last_seq": 38,
        "results": [
            {
                "changes": [
                    {
                        "rev": "13-bcb9d6388b60fd1e960d9ec4e8e3f29e"
                    }
                ],
                "id": "SpaghettiWithMeatballs",
                "seq": 38
            }
        ]
    }
    

    Changes Feeds¶

    Polling¶

    By default all changes are immediately returned within the JSON body:

    GET /somedatabase/_changes HTTP/1.1
    {"results":[
    {"seq":1,"id":"fresh","changes":[{"rev":"1-967a00dff5e02add41819138abb3284d"}]},
    {"seq":3,"id":"updated","changes":[{"rev":"2-7051cbe5c8faecd085a3fa619e6e6337"}]},
    {"seq":5,"id":"deleted","changes":[{"rev":"2-eec205a9d413992850a6e32678485900"}],"deleted":true}
    ],
    "last_seq":5}
    

    results is the list of changes in sequential order. New and changed documents only differ in the value of the rev; deleted documents include the "deleted": true attribute. (In the style=all_docs mode, deleted applies only to the current/winning revision. The other revisions listed might be deleted even if there is no deleted property; you have to GET them individually to make sure.)

    last_seq is the sequence number of the last update returned. (Currently it will always be the same as the seq of the last item in results.)

    Sending a since param in the query string skips all changes up to and including the given sequence number:

    GET /somedatabase/_changes?since=3 HTTP/1.1

    The return structure for normal and longpoll modes is a JSON array of changes objects, and the last update sequence number.

    In the return format for continuous mode, the server sends a CRLF (carriage-return, linefeed) delimited line for each change. Each line contains the JSON object described above.

    You can also request the full contents of each document change (instead of just the change notification) by using the include_docs parameter.

    {
        "last_seq": 5
        "results": [
            {
                "changes": [
                    {
                        "rev": "2-eec205a9d413992850a6e32678485900"
                    }
                ],
                "deleted": true,
                "id": "deleted",
                "seq": 5,
            }
        ]
    }
    

    Long Polling¶

    The longpoll feed, probably most applicable for a browser, is a more efficient form of polling that waits for a change to occur before the response is sent. longpoll avoids the need to frequently poll CouchDB to discover nothing has changed!

    The request to the server will remain open until a change is made on the database and is subsequently transferred, and then the connection will close. This is low load for both server and client.

    The response is basically the same JSON as is sent for the normal feed.

    Because the wait for a change can be significant you can set a timeout before the connection is automatically closed (the timeout argument). You can also set a heartbeat interval (using the heartbeat query argument), which sends a newline to keep the connection active.

    Continuous¶

    Continually polling the CouchDB server is not ideal - setting up new HTTP connections just to tell the client that nothing happened puts unnecessary strain on CouchDB.

    A continuous feed stays open and connected to the database until explicitly closed and changes are sent to the client as they happen, i.e. in near real-time.

    As with the longpoll feed type you can set both the timeout and heartbeat intervals to ensure that the connection is kept open for new changes and updates.

    The continuous feed’s response is a little different than the other feed types to simplify the job of the client - each line of the response is either empty or a JSON object representing a single change, as found in the normal feed’s results.

    GET /somedatabase/_changes?feed=continuous HTTP/1.1
    
    {"seq":1,"id":"fresh","changes":[{"rev":"1-967a00dff5e02add41819138abb3284d"}]}
    {"seq":3,"id":"updated","changes":[{"rev":"2-7051cbe5c8faecd085a3fa619e6e6337"}]}
    {"seq":5,"id":"deleted","changes":[{"rev":"2-eec205a9d413992850a6e32678485900"}],"deleted":true}
    ... tum tee tum ...
    {"seq":6,"id":"updated","changes":[{"rev":"3-825cb35de44c433bfb2df415563a19de"}]}
    

    Obviously, ... tum tee tum ... does not appear in the actual response, but represents a long pause before the change with seq 6 occurred.

    Event Source¶

    The eventsource feed provides push notifications that can be consumed in the form of DOM events in the browser. Refer to the W3C eventsource specification for further details. CouchDB also honours the Last-Event-ID parameter.

    GET /somedatabase/_changes?feed=eventsource HTTP/1.1
    
    // define the event handling function
    if (window.EventSource) {
    
      var source = new EventSource("/somedatabase/_changes?feed=eventsource");
      source.onerror = function(e) {
        alert('EventSource failed.');
      };
    
      var results = [];
      var sourceListener = function(e) {
        var data = JSON.parse(e.data);
        results.push(data);
      };
    
      // start listening for events
      source.addEventListener('message', sourceListener, false);
    
      // stop listening for events
      source.removeEventListener('message', sourceListener, false);
    
    }
    

    Note

    EventSource connections are subject to cross-origin resource sharing restrictions. You might need to configure CORS support to get the EventSource to work in your application.

    Filtering¶

    You can filter the contents of the changes feed in a number of ways. The most basic way is to specify one or more document IDs to the query. This causes the returned structure value to only contain changes for the specified IDs. Note that the value of this query argument should be a JSON formatted array.

    You can also filter the _changes feed by defining a filter function within a design document. The specification for the filter is the same as for replication filters. You specify the name of the filter function to the filter parameter, specifying the design document name and filter name. For example:

    GET /db/_changes?filter=design_doc/filtername

    Additionally, there are couple of builtin filters are available and described below.

    _doc_ids¶

    This filter accepts only changes for documents which ID in specified in doc_ids query parameter or payload’s object array. See POST /{db}/_changes for an example.

    _design¶

    The _design filter accepts only changes for any design document within the requested database.

    Request:

    GET /recipes/_changes?filter=_design HTTP/1.1
    Accept: application/json
    Host: localhost:5984
    

    Response:

    HTTP/1.1 200 OK
    Cache-Control: must-revalidate
    Content-Type: application/json
    Date: Sat, 28 Sep 2013 07:28:28 GMT
    ETag: "ARIHFWL3I7PIS0SPVTFU6TLR2"
    Server: CouchDB (Erlang OTP)
    Transfer-Encoding: chunked
    
    {
        "last_seq": 38,
        "results": [
            {
                "changes": [
                    {
                        "rev": "10-304cae84fd862832ea9814f02920d4b2"
                    }
                ],
                "id": "_design/ingredients",
                "seq": 29
            },
            {
                "changes": [
                    {
                        "rev": "123-6f7c1b7c97a9e4f0d22bdf130e8fd817"
                    }
                ],
                "deleted": true,
                "id": "_design/cookbook",
                "seq": 35
            },
            {
                "changes": [
                    {
                        "rev": "6-5b8a52c22580e922e792047cff3618f3"
                    }
                ],
                "deleted": true,
                "id": "_design/meta",
                "seq": 36
            }
        ]
    }
    

    _view¶

    New in version 1.2.

    The special filter _view allows to use existing map function as the filter. If the map function emits anything for the processed document it counts as accepted and the changes event emits to the feed. For most use-practice cases filter functions are very similar to map ones, so this feature helps to reduce amount of duplicated code.

    Warning

    While map functions doesn’t process the design documents, using _view filter forces them to do this. You need to be sure, that they are ready to handle documents with alien structure without panic crush.

    Note

    Using _view filter doesn’t queries the view index files, so you cannot use common view query parameters to additionally filter the changes feed by index key. Also, CouchDB doesn’t returns the result instantly as it does for views - it really uses the specified map function as filter.

    Moreover, you cannot make such filters dynamic e.g. process the request query parameters or handle the User Context Object - the map function is only operates with the document.

    Request:

    GET /recipes/_changes?filter=_view&view=ingredients/by_recipe HTTP/1.1
    Accept: application/json
    Host: localhost:5984
    

    Response:

    HTTP/1.1 200 OK
    Cache-Control: must-revalidate
    Content-Type: application/json
    Date: Sat, 28 Sep 2013 07:36:40 GMT
    ETag: "ARIHFWL3I7PIS0SPVTFU6TLR2"
    Server: CouchDB (Erlang OTP)
    Transfer-Encoding: chunked
    
    {
        "last_seq": 38,
        "results": [
            {
                "changes": [
                    {
                        "rev": "13-bcb9d6388b60fd1e960d9ec4e8e3f29e"
                    }
                ],
                "id": "SpaghettiWithMeatballs",
                "seq": 38
            }
        ]
    }
    
    apache-couchdb-1.6.0/share/doc/build/html/api/database/misc.html0000644000175000001440000011057012332105707024377 0ustar00djcusers00000000000000 10.3.11. /db/_purge — Apache CouchDB 1.6 Documentation

    10.3.11. /db/_purge¶

    POST /{db}/_purge¶

    A database purge permanently removes the references to deleted documents from the database. Normal deletion of a document within CouchDB does not remove the document from the database, instead, the document is marked as _deleted=true (and a new revision is created). This is to ensure that deleted documents can be replicated to other databases as having been deleted. This also means that you can check the status of a document and identify that the document has been deleted by its absence.

    Warning

    Purging a document from a database should only be done as a last resort when sensitive information has been introduced inadvertently into a database. In clustered or replicated environments it is very difficult to guarantee that a particular purged document has been removed from all replicas. Do not rely on this API as a way of doing secure deletion.

    The purge operation removes the references to the deleted documents from the database. The purging of old documents is not replicated to other databases. If you are replicating between databases and have deleted a large number of documents you should run purge on each database.

    Note

    Purging documents does not remove the space used by them on disk. To reclaim disk space, you should run a database compact (see /db/_compact), and compact views (see /db/_compact/design-doc).

    The format of the request must include the document ID and one or more revisions that must be purged.

    The response will contain the purge sequence number, and a list of the document IDs and revisions successfully purged.

    Parameters:
    • db – Database name
    Request Headers:
     
    Request JSON Object:
     
    • object – Mapping of document ID to list of revisions to purge
    Response Headers:
     
    • Content-Type
      • application/json
      • text/plain; charset=utf-8
    Response JSON Object:
     
    • purge_seq (number) – Purge sequence number
    • purged (object) – Mapping of document ID to list of purged revisions
    Status Codes:

    Request:

    POST /db/_purge HTTP/1.1
    Accept: application/json
    Content-Length: 76
    Content-Type: application/json
    Host: localhost:5984
    
    {
      "c6114c65e295552ab1019e2b046b10e": [
        "3-b06fcd1c1c9e0ec7c480ee8aa467bf3b",
        "3-0e871ef78849b0c206091f1a7af6ec41"
      ]
    }
    

    Response:

    HTTP/1.1 200 OK
    Cache-Control: must-revalidate
    Content-Length: 103
    Content-Type: application/json
    Date: Mon, 12 Aug 2013 10:53:24 GMT
    Server: CouchDB (Erlang/OTP)
    
    {
      "purge_seq":3,
      "purged":{
        "c6114c65e295552ab1019e2b046b10e": [
          "3-b06fcd1c1c9e0ec7c480ee8aa467bf3b"
        ]
      }
    }
    

    Updating Indexes¶

    The number of purges on a database is tracked using a purge sequence. This is used by the view indexer to optimize the updating of views that contain the purged documents.

    When the indexer identifies that the purge sequence on a database has changed, it compares the purge sequence of the database with that stored in the view index. If the difference between the stored sequence and database is sequence is only 1, then the indexer uses a cached list of the most recently purged documents, and then removes these documents from the index individually. This prevents completely rebuilding the index from scratch.

    If the difference between the stored sequence number and current database sequence is greater than 1, then the view index is entirely rebuilt. This is an expensive operation as every document in the database must be examined.

    10.3.12. /db/_missing_revs¶

    POST /{db}/_missing_revs¶

    With given a list of document revisions, returns the document revisions that do not exist in the database.

    Parameters:
    • db – Database name
    Request Headers:
     
    Request JSON Object:
     
    • object – Mapping of document ID to list of revisions to lookup
    Response Headers:
     
    • Content-Type
      • application/json
      • text/plain; charset=utf-8
    Response JSON Object:
     
    • missing_revs (object) – Mapping of document ID to list of missed revisions
    Status Codes:

    Request:

    POST /db/_missing_revs HTTP/1.1
    Accept: application/json
    Content-Length: 76
    Content-Type: application/json
    Host: localhost:5984
    
    {
      "c6114c65e295552ab1019e2b046b10e": [
        "3-b06fcd1c1c9e0ec7c480ee8aa467bf3b",
        "3-0e871ef78849b0c206091f1a7af6ec41"
      ]
    }
    

    Response:

    HTTP/1.1 200 OK
    Cache-Control: must-revalidate
    Content-Length: 64
    Content-Type: application/json
    Date: Mon, 12 Aug 2013 10:53:24 GMT
    Server: CouchDB (Erlang/OTP)
    
    {
      "missed_revs":{
        "c6114c65e295552ab1019e2b046b10e": [
          "3-b06fcd1c1c9e0ec7c480ee8aa467bf3b"
        ]
      }
    }
    

    10.3.13. /db/_revs_diff¶

    POST /{db}/_revs_diff¶

    Given a set of document/revision IDs, returns the subset of those that do not correspond to revisions stored in the database.

    Its primary use is by the replicator, as an important optimization: after receiving a set of new revision IDs from the source database, the replicator sends this set to the destination database’s _revs_diff to find out which of them already exist there. It can then avoid fetching and sending already-known document bodies.

    Both the request and response bodies are JSON objects whose keys are document IDs; but the values are structured differently:

    • In the request, a value is an array of revision IDs for that document.
    • In the response, a value is an object with a missing: key, whose value is a list of revision IDs for that document (the ones that are not stored in the database) and optionally a possible_ancestors key, whose value is an array of revision IDs that are known that might be ancestors of the missing revisions.
    Parameters:
    • db – Database name
    Request Headers:
     
    Request JSON Object:
     
    • object – Mapping of document ID to list of revisions to lookup
    Response Headers:
     
    • Content-Type
      • application/json
      • text/plain; charset=utf-8
    Response JSON Object:
     
    • missing (array) – List of missed revisions for specified document
    • possible_ancestors (array) – List of revisions that may be ancestors for specified document and its current revision in requested database
    Status Codes:

    Request:

    POST /db/_revs_diff HTTP/1.1
    Accept: application/json
    Content-Length: 113
    Content-Type: application/json
    Host: localhost:5984
    
    {
      "190f721ca3411be7aa9477db5f948bbb": [
        "3-bb72a7682290f94a985f7afac8b27137",
        "4-10265e5a26d807a3cfa459cf1a82ef2e",
        "5-067a00dff5e02add41819138abb3284d"
      ]
    }
    

    Response:

    HTTP/1.1 200 OK
    Cache-Control: must-revalidate
    Content-Length: 88
    Content-Type: application/json
    Date: Mon, 12 Aug 2013 16:56:02 GMT
    Server: CouchDB (Erlang/OTP)
    
    {
      "190f721ca3411be7aa9477db5f948bbb": {
        "missing": [
          "3-bb72a7682290f94a985f7afac8b27137",
          "5-067a00dff5e02add41819138abb3284d"
        ],
        "possible_ancestors": [
          "4-10265e5a26d807a3cfa459cf1a82ef2e"
        ]
      }
    }
    

    10.3.14. /db/_revs_limit¶

    GET /{db}/_revs_limit¶

    Gets the current revs_limit (revision limit) setting.

    Parameters:
    • db – Database name
    Request Headers:
     
    • Accept
      • application/json
      • text/plain
    Response Headers:
     
    • Content-Type
      • application/json
      • text/plain; charset=utf-8
    Status Codes:
    • 200 OK – Request completed successfully

    Request:

    GET /db/_revs_limit HTTP/1.1
    Accept: application/json
    Host: localhost:5984
    

    Response:

    HTTP/1.1 200 OK
    Cache-Control: must-revalidate
    Content-Length: 5
    Content-Type: application/json
    Date: Mon, 12 Aug 2013 17:27:30 GMT
    Server: CouchDB (Erlang/OTP)
    
    1000
    
    PUT /{db}/_revs_limit¶

    Sets the maximum number of document revisions that will be tracked by CouchDB, even after compaction has occurred. You can set the revision limit on a database with a scalar integer of the limit that you want to set as the request body.

    Parameters:
    • db – Database name
    Request Headers:
     
    Response Headers:
     
    • Content-Type
      • application/json
      • text/plain; charset=utf-8
    Response JSON Object:
     
    • ok (boolean) – Operation status
    Status Codes:

    Request:

    PUT /db/_revs_limit HTTP/1.1
    Accept: application/json
    Content-Length: 5
    Content-Type: application/json
    Host: localhost:5984
    
    1000
    

    Response:

    HTTP/1.1 200 OK
    Cache-Control: must-revalidate
    Content-Length: 12
    Content-Type: application/json
    Date: Mon, 12 Aug 2013 17:47:52 GMT
    Server: CouchDB (Erlang/OTP)
    
    {
        "ok": true
    }
    
    apache-couchdb-1.6.0/share/doc/build/html/api/local.html0000644000175000001440000003166612332105720022775 0ustar00djcusers00000000000000 10.6. Local (non-replicating) Documents — Apache CouchDB 1.6 Documentation

    10.6. Local (non-replicating) Documents¶

    The Local (non-replicating) document interface allows you to create local documents that are not replicated to other databases. These documents can be used to hold configuration or other information that is required specifically on the local CouchDB instance.

    Local documents have the following limitations:

    • Local documents are not replicated to other databases.
    • The ID of the local document must be known for the document to accessed. You cannot obtain a list of local documents from the database.
    • Local documents are not output by views, or the /db/_all_docs view.

    Local documents can be used when you want to store configuration or other information for the current (local) instance of a given database.

    A list of the available methods and URL paths are provided below:

    Method Path Description
    GET /db/_local/id Returns the latest revision of the non-replicated document
    PUT /db/_local/id Inserts a new version of the non-replicated document
    DELETE /db/_local/id Deletes the non-replicated document
    COPY /db/_local/id Copies the non-replicated document

    10.6.1. /db/_local/id¶

    GET /{db}/_local/{docid}¶

    Gets the specified local document. The semantics are identical to accessing a standard document in the specified database, except that the document is not replicated. See GET /{db}/{docid}.

    PUT /{db}/_local/{docid}¶

    Stores the specified local document. The semantics are identical to storing a standard document in the specified database, except that the document is not replicated. See PUT /{db}/{docid}.

    DELETE /{db}/_local/{docid}¶

    Deletes the specified local document. The semantics are identical to deleting a standard document in the specified database, except that the document is not replicated. See DELETE /{db}/{docid}.

    COPY /{db}/_local/{docid}¶

    Copies the specified local document. The semantics are identical to copying a standard document in the specified database, except that the document is not replicated. See COPY /{db}/{docid}.

    apache-couchdb-1.6.0/share/doc/build/html/api/index.html0000644000175000001440000004203512332105720023002 0ustar00djcusers00000000000000 10. API Reference — Apache CouchDB 1.6 Documentation

    10. API Reference¶

    The components of the API URL path help determine the part of the CouchDB server that is being accessed. The result is the structure of the URL request both identifies and effectively describes the area of the database you are accessing.

    As with all URLs, the individual components are separated by a forward slash.

    As a general rule, URL components and JSON fields starting with the _ (underscore) character represent a special component or entity within the server or returned object. For example, the URL fragment /_all_dbs gets a list of all of the databases in a CouchDB instance.

    This reference is structured according to the URL structure, as below.

    Previous topic

    9.2. Writting Addons

    Next topic

    10.1. API Basics

    Utilities

    More Help

    apache-couchdb-1.6.0/share/doc/build/html/api/basics.html0000644000175000001440000011562612332105701023145 0ustar00djcusers00000000000000 10.1. API Basics — Apache CouchDB 1.6 Documentation

    10.1. API Basics¶

    The CouchDB API is the primary method of interfacing to a CouchDB instance. Requests are made using HTTP and requests are used to request information from the database, store new data, and perform views and formatting of the information stored within the documents.

    Requests to the API can be categorised by the different areas of the CouchDB system that you are accessing, and the HTTP method used to send the request. Different methods imply different operations, for example retrieval of information from the database is typically handled by the GET operation, while updates are handled by either a POST or PUT request. There are some differences between the information that must be supplied for the different methods. For a guide to the basic HTTP methods and request structure, see Request Format and Responses.

    For nearly all operations, the submitted data, and the returned data structure, is defined within a JavaScript Object Notation (JSON) object. Basic information on the content and data types for JSON are provided in JSON Basics.

    Errors when accessing the CouchDB API are reported using standard HTTP Status Codes. A guide to the generic codes returned by CouchDB are provided in HTTP Status Codes.

    When accessing specific areas of the CouchDB API, specific information and examples on the HTTP methods and request, JSON structures, and error codes are provided.

    10.1.1. Request Format and Responses¶

    CouchDB supports the following HTTP request methods:

    • GET

      Request the specified item. As with normal HTTP requests, the format of the URL defines what is returned. With CouchDB this can include static items, database documents, and configuration and statistical information. In most cases the information is returned in the form of a JSON document.

    • HEAD

      The HEAD method is used to get the HTTP header of a GET request without the body of the response.

    • POST

      Upload data. Within CouchDB POST is used to set values, including uploading documents, setting document values, and starting certain administration commands.

    • PUT

      Used to put a specified resource. In CouchDB PUT is used to create new objects, including databases, documents, views and design documents.

    • DELETE

      Deletes the specified resource, including documents, views, and design documents.

    • COPY

      A special method that can be used to copy documents and objects.

    If you use the an unsupported HTTP request type with a URL that does not support the specified type, a 405 error will be returned, listing the supported HTTP methods. For example:

    {
        "error":"method_not_allowed",
        "reason":"Only GET,HEAD allowed"
    }
    

    The CouchDB design document API and the functions when returning HTML (for example as part of a show or list) enables you to include custom HTTP headers through the headers block of the return object.

    10.1.2. HTTP Headers¶

    Because CouchDB uses HTTP for all communication, you need to ensure that the correct HTTP headers are supplied (and processed on retrieval) so that you get the right format and encoding. Different environments and clients will be more or less strict on the effect of these HTTP headers (especially when not present). Where possible you should be as specific as possible.

    Request Headers¶

    • Content-type

      Specifies the content type of the information being supplied within the request. The specification uses MIME type specifications. For the majority of requests this will be JSON (application/json). For some settings the MIME type will be plain text. When uploading attachments it should be the corresponding MIME type for the attachment or binary (application/octet-stream).

      The use of the Content-type on a request is highly recommended.

    • Accept

      Specifies the list of accepted data types to be returned by the server (i.e. that are accepted/understandable by the client). The format should be a list of one or more MIME types, separated by colons.

      For the majority of requests the definition should be for JSON data (application/json). For attachments you can either specify the MIME type explicitly, or use */* to specify that all file types are supported. If the Accept header is not supplied, then the */* MIME type is assumed (i.e. client accepts all formats).

      The use of Accept in queries for CouchDB is not required, but is highly recommended as it helps to ensure that the data returned can be processed by the client.

      If you specify a data type using the Accept header, CouchDB will honor the specified type in the Content-type header field returned. For example, if you explicitly request application/json in the Accept of a request, the returned HTTP headers will use the value in the returned Content-type field.

      For example, when sending a request without an explicit Accept header, or when specifying */*:

      GET /recipes HTTP/1.1
      Host: couchdb:5984
      Accept: */*
      

      The returned headers are:

      Server: CouchDB (Erlang/OTP)
      Date: Thu, 13 Jan 2011 13:39:34 GMT
      Content-Type: text/plain;charset=utf-8
      Content-Length: 227
      Cache-Control: must-revalidate

      Note that the returned content type is text/plain even though the information returned by the request is in JSON format.

      Explicitly specifying the Accept header:

      GET /recipes HTTP/1.1
      Host: couchdb:5984
      Accept: application/json
      

      The headers returned include the application/json content type:

      Server: CouchDB (Erlang/OTP)
      Date: Thu, 13 Jan 2013 13:40:11 GMT
      Content-Type: application/json
      Content-Length: 227
      Cache-Control: must-revalidate

    Response Headers¶

    Response headers are returned by the server when sending back content and include a number of different header fields, many of which are standard HTTP response header and have no significance to CouchDB operation. The list of response headers important to CouchDB are listed below.

    • Content-type

      Specifies the MIME type of the returned data. For most request, the returned MIME type is text/plain. All text is encoded in Unicode (UTF-8), and this is explicitly stated in the returned Content-type, as text/plain;charset=utf-8.

    • Cache-control

      The cache control HTTP response header provides a suggestion for client caching mechanisms on how to treat the returned information. CouchDB typically returns the must-revalidate, which indicates that the information should be revalidated if possible. This is used to ensure that the dynamic nature of the content is correctly updated.

    • Content-length

      The length (in bytes) of the returned content.

    • Etag

      The Etag HTTP header field is used to show the revision for a document, or a view.

      ETags have been assigned to a map/reduce group (the collection of views in a single design document). Any change to any of the indexes for those views would generate a new ETag for all view URLs in a single design doc, even if that specific view’s results had not changed.

      Each _view URL has its own ETag which only gets updated when changes are made to the database that effect that index. If the index for that specific view does not change, that view keeps the original ETag head (therefore sending back 304 Not Modified more often).

    10.1.3. JSON Basics¶

    The majority of requests and responses to CouchDB use the JavaScript Object Notation (JSON) for formatting the content and structure of the data and responses.

    JSON is used because it is the simplest and easiest to use solution for working with data within a web browser, as JSON structures can be evaluated and used as JavaScript objects within the web browser environment. JSON also integrates with the server-side JavaScript used within CouchDB.

    JSON supports the same basic types as supported by JavaScript, these are:

    • Number (either integer or floating-point).

    • String; this should be enclosed by double-quotes and supports Unicode characters and backslash escaping. For example:

      "A String"
      
    • Boolean - a true or false value. You can use these strings directly. For example:

      { "value": true}
      
    • Array - a list of values enclosed in square brackets. For example:

      ["one", "two", "three"]
      
    • Object - a set of key/value pairs (i.e. an associative array, or hash). The key must be a string, but the value can be any of the supported JSON values. For example:

      {
         "servings" : 4,
         "subtitle" : "Easy to make in advance, and then cook when ready",
         "cooktime" : 60,
         "title" : "Chicken Coriander"
      }
      

      In CouchDB, the JSON object is used to represent a variety of structures, including the main CouchDB document.

    Parsing JSON into a JavaScript object is supported through the JSON.parse() function in JavaScript, or through various libraries that will perform the parsing of the content into a JavaScript object for you. Libraries for parsing and generating JSON are available in many languages, including Perl, Python, Ruby, Erlang and others.

    Warning

    Care should be taken to ensure that your JSON structures are valid, invalid structures will cause CouchDB to return an HTTP status code of 500 (server error).

    Number Handling¶

    Developers and users new to computer handling of numbers often encounter suprises when expecting that a number stored in JSON format does not necessarily return as the same number as compared character by character.

    Any numbers defined in JSON that contain a decimal point or exponent will be passed through the Erlang VM’s idea of the “double” data type. Any numbers that are used in views will pass through the view server’s idea of a number (the common JavaScript case means even integers pass through a double due to JavaScript’s definition of a number).

    Consider this document that we write to CouchDB:

    {
      "_id":"30b3b38cdbd9e3a587de9b8122000cff",
      "number": 1.1
    }
    

    Now let’s read that document back from CouchDB:

    {
      "_id":"30b3b38cdbd9e3a587de9b8122000cff",
      "_rev":"1-f065cee7c3fd93aa50f6c97acde93030",
      "number":1.1000000000000000888
    }
    

    What happens is CouchDB is changing the textual representation of the result of decoding what it was given into some numerical format. In most cases this is an IEEE 754 double precision floating point number which is exactly what almost all other languages use as well.

    What Erlang does a bit differently than other languages is that it does not attempt to pretty print the resulting output to use the shortest number of characters. For instance, this is why we have this relationship:

    ejson:encode(ejson:decode(<<"1.1">>)).
    <<"1.1000000000000000888">>
    

    What can be confusing here is that internally those two formats decode into the same IEEE-754 representation. And more importantly, it will decode into a fairly close representation when passed through all major parsers that we know about.

    While we’ve only been discussing cases where the textual representation changes, another important case is when an input value contains more precision than can actually represented in a double. (You could argue that this case is actually “losing” data if you don’t accept that numbers are stored in doubles).

    Here’s a log for a couple of the more common JSON libraries that happen to be on the author’s machine:

    Spidermonkey:

    $ js -h 2>&1 | head -n 1
    JavaScript-C 1.8.5 2011-03-31
    $ js
    js> JSON.stringify(JSON.parse("1.01234567890123456789012345678901234567890"))
    "1.0123456789012346"
    js> var f = JSON.stringify(JSON.parse("1.01234567890123456789012345678901234567890"))
    js> JSON.stringify(JSON.parse(f))
    "1.0123456789012346"

    Node:

    $ node -v
    v0.6.15
    $ node
    JSON.stringify(JSON.parse("1.01234567890123456789012345678901234567890"))
    '1.0123456789012346'
    var f = JSON.stringify(JSON.parse("1.01234567890123456789012345678901234567890"))
    undefined
    JSON.stringify(JSON.parse(f))
    '1.0123456789012346'

    Python:

    $ python
    Python 2.7.2 (default, Jun 20 2012, 16:23:33)
    [GCC 4.2.1 Compatible Apple Clang 4.0 (tags/Apple/clang-418.0.60)] on darwin
    Type "help", "copyright", "credits" or "license" for more information.
    import json
    json.dumps(json.loads("1.01234567890123456789012345678901234567890"))
    '1.0123456789012346'
    f = json.dumps(json.loads("1.01234567890123456789012345678901234567890"))
    json.dumps(json.loads(f))
    '1.0123456789012346'

    Ruby:

    $ irb --version
    irb 0.9.5(05/04/13)
    require 'JSON'
    => true
    JSON.dump(JSON.load("[1.01234567890123456789012345678901234567890]"))
    => "[1.01234567890123]"
    f = JSON.dump(JSON.load("[1.01234567890123456789012345678901234567890]"))
    => "[1.01234567890123]"
    JSON.dump(JSON.load(f))
    => "[1.01234567890123]"

    Note

    A small aside on Ruby, it requires a top level object or array, so I just wrapped the value. Should be obvious it doesn’t affect the result of parsing the number though.

    Ejson (CouchDB’s current parser) at CouchDB sha 168a663b:

    $ ./utils/run -i
    Erlang R14B04 (erts-5.8.5) [source] [64-bit] [smp:2:2] [rq:2]
    [async-threads:4] [hipe] [kernel-poll:true]
    
    Eshell V5.8.5  (abort with ^G)
    1> ejson:encode(ejson:decode(<<"1.01234567890123456789012345678901234567890">>)).
    <<"1.0123456789012346135">>
    2> F = ejson:encode(ejson:decode(<<"1.01234567890123456789012345678901234567890">>)).
    <<"1.0123456789012346135">>
    3> ejson:encode(ejson:decode(F)).
    <<"1.0123456789012346135">>

    As you can see they all pretty much behave the same except for Ruby actually does appear to be losing some precision over the other libraries.

    The astute observer will notice that ejson (the CouchDB JSON library) reported an extra three digits. While its tempting to think that this is due to some internal difference, its just a more specific case of the 1.1 input as described above.

    The important point to realize here is that a double can only hold a finite number of values. What we’re doing here is generating a string that when passed through the “standard” floating point parsing algorithms (ie, strtod) will result in the same bit pattern in memory as we started with. Or, slightly different, the bytes in a JSON serialized number are chosen such that they refer to a single specific value that a double can represent.

    The important point to understand is that we’re mapping from one infinite set onto a finite set. An easy way to see this is by reflecting on this:

    1.0 == 1.00 == 1.000 = 1.(infinite zeroes)

    Obviously a computer can’t hold infinite bytes so we have to decimate our infinitely sized set to a finite set that can be represented concisely.

    The game that other JSON libraries are playing is merely:

    “How few characters do I have to use to select this specific value for a double”

    And that game has lots and lots of subtle details that are difficult to duplicate in C without a significant amount of effort (it took Python over a year to get it sorted with their fancy build systems that automatically run on a number of different architectures).

    Hopefully we’ve shown that CouchDB is not doing anything “funky” by changing input. Its behaving the same as any other common JSON library does, its just not pretty printing its output.

    On the other hand, if you actually are in a position where an IEEE-754 double is not a satisfactory datatype for your numbers, then the answer as has been stated is to not pass your numbers through this representation. In JSON this is accomplished by encoding them as a string or by using integer types (although integer types can still bite you if you use a platform that has a different integer representation than normal, ie, JavaScript).

    Further information can be found easily, including the Floating Point Guide, and David Goldberg’s Reference.

    Also, if anyone is really interested in changing this behavior, we’re all ears for contributions to jiffy (which is theoretically going to replace ejson when we get around to updating the build system). The places we’ve looked for inspiration are TCL and Python. If you know a decent implementation of this float printing algorithm give us a holler.

    10.1.4. HTTP Status Codes¶

    With the interface to CouchDB working through HTTP, error codes and statuses are reported using a combination of the HTTP status code number, and corresponding data in the body of the response data.

    A list of the error codes returned by CouchDB, and generic descriptions of the related errors are provided below. The meaning of different status codes for specific request types are provided in the corresponding API call reference.

    • 200 - OK

      Request completed successfully.

    • 201 - Created

      Document created successfully.

    • 202 - Accepted

      Request has been accepted, but the corresponding operation may not have completed. This is used for background operations, such as database compaction.

    • 304 - Not Modified

      The additional content requested has not been modified. This is used with the ETag system to identify the version of information returned.

    • 400 - Bad Request

      Bad request structure. The error can indicate an error with the request URL, path or headers. Differences in the supplied MD5 hash and content also trigger this error, as this may indicate message corruption.

    • 401 - Unauthorized

      The item requested was not available using the supplied authorization, or authorization was not supplied.

    • 403 - Forbidden

      The requested item or operation is forbidden.

    • 404 - Not Found

      The requested content could not be found. The content will include further information, as a JSON object, if available. The structure will contain two keys, error and reason. For example:

      {"error":"not_found","reason":"no_db_file"}
      
    • 405 - Resource Not Allowed

      A request was made using an invalid HTTP request type for the URL requested. For example, you have requested a PUT when a POST is required. Errors of this type can also triggered by invalid URL strings.

    • 406 - Not Acceptable

      The requested content type is not supported by the server.

    • 409 - Conflict

      Request resulted in an update conflict.

    • 412 - Precondition Failed

      The request headers from the client and the capabilities of the server do not match.

    • 415 - Bad Content Type

      The content types supported, and the content type of the information being requested or submitted indicate that the content type is not supported.

    • 416 - Requested Range Not Satisfiable

      The range specified in the request header cannot be satisfied by the server.

    • 417 - Expectation Failed

      When sending documents in bulk, the bulk load operation failed.

    • 500 - Internal Server Error

      The request was invalid, either because the supplied JSON was invalid, or invalid information was supplied as part of the request.

    apache-couchdb-1.6.0/share/doc/build/html/api/server/0000755000175000001440000000000012332106072022310 5ustar00djcusers00000000000000apache-couchdb-1.6.0/share/doc/build/html/api/server/common.html0000644000175000001440000026340612332105724024504 0ustar00djcusers00000000000000 10.2.1. / — Apache CouchDB 1.6 Documentation

    10.2.1. /¶

    GET /¶

    Accessing the root of a CouchDB instance returns meta information about the instance. The response is a JSON structure containing information about the server, including a welcome message and the version of the server.

    Request Headers:
     
    • Accept
      • application/json
      • text/plain
    Response Headers:
     
    • Content-Type
      • application/json
      • text/plain; charset=utf-8
    Status Codes:
    • 200 OK – Request completed successfully

    Request:

    GET / HTTP/1.1
    Accept: application/json
    Host: localhost:5984
    

    Response:

    HTTP/1.1 200 OK
    Cache-Control: must-revalidate
    Content-Length: 179
    Content-Type: application/json
    Date: Sat, 10 Aug 2013 06:33:33 GMT
    Server: CouchDB (Erlang/OTP)
    
    {
        "couchdb": "Welcome",
        "uuid": "85fb71bf700c17267fef77535820e371",
        "vendor": {
            "name": "The Apache Software Foundation",
            "version": "1.3.1"
        },
        "version": "1.3.1"
    }
    

    10.2.2. /_active_tasks¶

    GET /_active_tasks¶

    List of running tasks, including the task type, name, status and process ID. The result is a JSON array of the currently running tasks, with each task being described with a single object. Depending on operation type set of response object fields might be different.

    Request Headers:
     
    • Accept
      • application/json
      • text/plain
    Response Headers:
     
    • Content-Type
      • application/json
      • text/plain; charset=utf-8
    Response JSON Object:
     
    • changes_done (number) – Processed changes
    • database (string) – Source database
    • pid (string) – Process ID
    • progress (number) – Current percentage progress
    • started_on (number) – Task start time as unix timestamp
    • status (string) – Task status message
    • task (string) – Task name
    • total_changes (number) – Total changes to process
    • type (string) – Operation Type
    • updated_on (number) – Unix timestamp of last operation update
    Status Codes:
    • 200 OK – Request completed successfully
    • 401 Unauthorized – CouchDB Server Administrator privileges required

    Request:

    GET /_active_tasks HTTP/1.1
    Accept: application/json
    Host: localhost:5984
    

    Response:

    HTTP/1.1 200 OK
    Cache-Control: must-revalidate
    Content-Length: 1690
    Content-Type: application/json
    Date: Sat, 10 Aug 2013 06:37:31 GMT
    Server: CouchDB (Erlang/OTP)
    
    [
        {
            "changes_done": 64438,
            "database": "mailbox",
            "pid": "<0.12986.1>",
            "progress": 84,
            "started_on": 1376116576,
            "total_changes": 76215,
            "type": "database_compaction",
            "updated_on": 1376116619
        },
        {
            "changes_done": 14443,
            "database": "mailbox",
            "design_document": "c9753817b3ba7c674d92361f24f59b9f",
            "pid": "<0.10461.3>",
            "progress": 18,
            "started_on": 1376116621,
            "total_changes": 76215,
            "type": "indexer",
            "updated_on": 1376116650
        },
        {
            "changes_done": 5454,
            "database": "mailbox",
            "design_document": "_design/meta",
            "pid": "<0.6838.4>",
            "progress": 7,
            "started_on": 1376116632,
            "total_changes": 76215,
            "type": "indexer",
            "updated_on": 1376116651
        },
        {
            "checkpointed_source_seq": 68585,
            "continuous": false,
            "doc_id": null,
            "doc_write_failures": 0,
            "docs_read": 4524,
            "docs_written": 4524,
            "missing_revisions_found": 4524,
            "pid": "<0.1538.5>",
            "progress": 44,
            "replication_id": "9bc1727d74d49d9e157e260bb8bbd1d5",
            "revisions_checked": 4524,
            "source": "mailbox",
            "source_seq": 154419,
            "started_on": 1376116644,
            "target": "http://mailsrv:5984/mailbox",
            "type": "replication",
            "updated_on": 1376116651
        }
    ]
    

    10.2.3. /_all_dbs¶

    GET /_all_dbs¶

    Returns a list of all the databases in the CouchDB instance.

    Request Headers:
     
    • Accept
      • application/json
      • text/plain
    Response Headers:
     
    • Content-Type
      • application/json
      • text/plain; charset=utf-8
    Status Codes:
    • 200 OK – Request completed successfully

    Request:

    GET /_all_dbs HTTP/1.1
    Accept: application/json
    Host: localhost:5984
    

    Response:

    HTTP/1.1 200 OK
    Cache-Control: must-revalidate
    Content-Length: 52
    Content-Type: application/json
    Date: Sat, 10 Aug 2013 06:57:48 GMT
    Server: CouchDB (Erlang/OTP)
    
    [
       "_users",
       "contacts",
       "docs",
       "invoices",
       "locations"
    ]
    

    10.2.4. /_db_updates¶

    New in version 1.4.

    GET /_db_updates¶

    Returns a list of all database events in the CouchDB instance.

    Request Headers:
     
    • Accept
      • application/json
      • text/plain
    Query Parameters:
     
    • feed (string) –
      • longpoll: Closes the connection after the first event.
      • continuous: Send a line of JSON per event. Keeps the socket open until timeout.
      • eventsource: Like, continuous, but sends the events in EventSource format.
    • timeout (number) – Number of seconds until CouchDB closes the connection. Default is 60.
    • heartbeat (boolean) – Whether CouchDB will send a newline character (\n) on timeout. Default is true.
    Response Headers:
     
    Response JSON Object:
     
    • db_name (string) – Database name
    • ok (boolean) – Event operation status
    • type (string) – A database event is one of created, updated, deleted
    Status Codes:
    • 200 OK – Request completed successfully
    • 401 Unauthorized – CouchDB Server Administrator privileges required

    Request:

    GET /_db_updates HTTP/1.1
    Accept: application/json
    Host: localhost:5984
    

    Response:

    HTTP/1.1 200 OK
    Cache-Control: must-revalidate
    Content-Type: application/json
    Date: Sat, 10 Aug 2013 07:02:41 GMT
    Server: CouchDB (Erlang/OTP)
    Transfer-Encoding: chunked
    
    {
        "db_name": "mailbox",
        "ok": true,
        "type": "created"
    }
    

    10.2.5. /_log¶

    GET /_log¶

    Gets the CouchDB log, equivalent to accessing the local log file of the corresponding CouchDB instance.

    Request Headers:
     
    Query Parameters:
     
    • bytes (number) – Bytes to be returned. Default is 1000.
    • offset (number) – Offset in bytes where the log tail should be started. Default is 0.
    Response Headers:
     
    Status Codes:
    • 200 OK – Request completed successfully
    • 401 Unauthorized – CouchDB Server Administrator privileges required

    Request:

    GET /_log HTTP/1.1
    Accept: application/json
    Host: localhost:5984
    

    Response:

    [Wed, 27 Oct 2010 10:49:42 GMT] [info] [<0.23338.2>] 192.168.0.2 - - 'PUT' /authdb 401
    [Wed, 27 Oct 2010 11:02:19 GMT] [info] [<0.23428.2>] 192.168.0.116 - - 'GET' /recipes/FishStew 200
    [Wed, 27 Oct 2010 11:02:19 GMT] [info] [<0.23428.2>] 192.168.0.116 - - 'GET' /_session 200
    [Wed, 27 Oct 2010 11:02:19 GMT] [info] [<0.24199.2>] 192.168.0.116 - - 'GET' / 200
    [Wed, 27 Oct 2010 13:03:38 GMT] [info] [<0.24207.2>] 192.168.0.116 - - 'GET' /_log?offset=5 200
    

    If you want to pick out specific parts of the log information you can use the bytes argument, which specifies the number of bytes to be returned, and offset, which specifies where the reading of the log should start, counted back from the end. For example, if you use the following request:

    GET /_log?bytes=500&offset=2000

    Reading of the log will start at 2000 bytes from the end of the log, and 500 bytes will be shown.

    How bytes/offset works?

    CouchDB reads specified amount of bytes from the end of log file, jumping to offset bytes towards the beginning of the file first:

     Log File    FilePos
     ----------
    |          |  10
    |          |  20
    |          |  30
    |          |  40
    |          |  50
    |          |  60
    |          |  70 -- Bytes = 20  --
    |          |  80                 | Chunk
    |          |  90 -- Offset = 10 --
    |__________| 100
    

    10.2.6. /_replicate¶

    POST /_replicate¶

    Request, configure, or stop, a replication operation.

    Request Headers:
     
    Request JSON Object:
     
    • cancel (boolean) – Cancels the replication
    • continuous (boolean) – Configure the replication to be continuous
    • create_target (boolean) – Creates the target database. Required administrator’s privileges on target server.
    • doc_ids (array) – Array of document IDs to be synchronized
    • proxy (string) – Address of a proxy server through which replication should occur (protocol can be “http” or “socks5”)
    • source (string) – Source database name or URL
    • target (string) – Target database name or URL
    Response Headers:
     
    • Content-Type
      • application/json
      • text/plain; charset=utf-8
    Response JSON Object:
     
    • history (array) – Replication history (see below)
    • ok (boolean) – Replication status
    • replication_id_version (number) – Replication protocol version
    • session_id (string) – Unique session ID
    • source_last_seq (number) – Last sequence number read from source database
    Status Codes:

    The specification of the replication request is controlled through the JSON content of the request. The JSON should be an object with the fields defining the source, target and other options.

    The Replication history is an array of objects with following structure:

    JSON Object:
    • doc_write_failures (number) – Number of document write failures
    • docs_read (number) – Number of documents read
    • docs_written (number) – Number of documents written to target
    • end_last_seq (number) – Last sequence number in changes stream
    • end_time (string) – Date/Time replication operation completed in RFC 2822 format
    • missing_checked (number) – Number of missing documents checked
    • missing_found (number) – Number of missing documents found
    • recorded_seq (number) – Last recorded sequence number
    • session_id (string) – Session ID for this replication operation
    • start_last_seq (number) – First sequence number in changes stream
    • start_time (string) – Date/Time replication operation started in RFC 2822 format

    Request

    POST /_replicate HTTP/1.1
    Accept: application/json
    Content-Length: 36
    Content-Type: application/json
    Host: localhost:5984
    
    {
        "source": "db_a",
        "target": "db_b"
    }
    

    Response

    HTTP/1.1 200 OK
    Cache-Control: must-revalidate
    Content-Length: 692
    Content-Type: application/json
    Date: Sun, 11 Aug 2013 20:38:50 GMT
    Server: CouchDB (Erlang/OTP)
    
    {
        "history": [
            {
                "doc_write_failures": 0,
                "docs_read": 10,
                "docs_written": 10,
                "end_last_seq": 28,
                "end_time": "Sun, 11 Aug 2013 20:38:50 GMT",
                "missing_checked": 10,
                "missing_found": 10,
                "recorded_seq": 28,
                "session_id": "142a35854a08e205c47174d91b1f9628",
                "start_last_seq": 1,
                "start_time": "Sun, 11 Aug 2013 20:38:50 GMT"
            },
            {
                "doc_write_failures": 0,
                "docs_read": 1,
                "docs_written": 1,
                "end_last_seq": 1,
                "end_time": "Sat, 10 Aug 2013 15:41:54 GMT",
                "missing_checked": 1,
                "missing_found": 1,
                "recorded_seq": 1,
                "session_id": "6314f35c51de3ac408af79d6ee0c1a09",
                "start_last_seq": 0,
                "start_time": "Sat, 10 Aug 2013 15:41:54 GMT"
            }
        ],
        "ok": true,
        "replication_id_version": 3,
        "session_id": "142a35854a08e205c47174d91b1f9628",
        "source_last_seq": 28
    }
    

    Replication Operation¶

    The aim of the replication is that at the end of the process, all active documents on the source database are also in the destination database and all documents that were deleted in the source databases are also deleted (if they exist) on the destination database.

    Replication can be described as either push or pull replication:

    • Pull replication is where the source is the remote CouchDB instance, and the target is the local database.

      Pull replication is the most useful solution to use if your source database has a permanent IP address, and your destination (local) database may have a dynamically assigned IP address (for example, through DHCP). This is particularly important if you are replicating to a mobile or other device from a central server.

    • Push replication is where the source is a local database, and target is a remote database.

    Specifying the Source and Target Database¶

    You must use the URL specification of the CouchDB database if you want to perform replication in either of the following two situations:

    • Replication with a remote database (i.e. another instance of CouchDB on the same host, or a different host)
    • Replication with a database that requires authentication

    For example, to request replication between a database local to the CouchDB instance to which you send the request, and a remote database you might use the following request:

    POST http://couchdb:5984/_replicate
    Content-Type: application/json
    Accept: application/json
    
    {
       "source" : "recipes",
       "target" : "http://coucdb-remote:5984/recipes",
    }

    In all cases, the requested databases in the source and target specification must exist. If they do not, an error will be returned within the JSON object:

    {
       "error" : "db_not_found"
       "reason" : "could not open http://couchdb-remote:5984/ol1ka/",
    }
    

    You can create the target database (providing your user credentials allow it) by adding the create_target field to the request object:

    POST http://couchdb:5984/_replicate
    Content-Type: application/json
    Accept: application/json
    
    {
       "create_target" : true
       "source" : "recipes",
       "target" : "http://couchdb-remote:5984/recipes",
    }

    The create_target field is not destructive. If the database already exists, the replication proceeds as normal.

    Single Replication¶

    You can request replication of a database so that the two databases can be synchronized. By default, the replication process occurs one time and synchronizes the two databases together. For example, you can request a single synchronization between two databases by supplying the source and target fields within the request JSON content.

    POST http://couchdb:5984/_replicate
    Accept: application/json
    Content-Type: application/json
    
    {
       "source" : "recipes",
       "target" : "recipes-snapshot",
    }

    In the above example, the databases recipes and recipes-snapshot will be synchronized. These databases are local to the CouchDB instance where the request was made. The response will be a JSON structure containing the success (or failure) of the synchronization process, and statistics about the process:

    {
       "ok" : true,
       "history" : [
          {
             "docs_read" : 1000,
             "session_id" : "52c2370f5027043d286daca4de247db0",
             "recorded_seq" : 1000,
             "end_last_seq" : 1000,
             "doc_write_failures" : 0,
             "start_time" : "Thu, 28 Oct 2010 10:24:13 GMT",
             "start_last_seq" : 0,
             "end_time" : "Thu, 28 Oct 2010 10:24:14 GMT",
             "missing_checked" : 0,
             "docs_written" : 1000,
             "missing_found" : 1000
          }
       ],
       "session_id" : "52c2370f5027043d286daca4de247db0",
       "source_last_seq" : 1000
    }
    

    Continuous Replication¶

    Synchronization of a database with the previously noted methods happens only once, at the time the replicate request is made. To have the target database permanently replicated from the source, you must set the continuous field of the JSON object within the request to true.

    With continuous replication changes in the source database are replicated to the target database in perpetuity until you specifically request that replication ceases.

    POST http://couchdb:5984/_replicate
    Accept: application/json
    Content-Type: application/json
    
    {
       "continuous" : true
       "source" : "recipes",
       "target" : "http://couchdb-remote:5984/recipes",
    }

    Changes will be replicated between the two databases as long as a network connection is available between the two instances.

    Note

    Two keep two databases synchronized with each other, you need to set replication in both directions; that is, you must replicate from source to target, and separately from target to source.

    Canceling Continuous Replication¶

    You can cancel continuous replication by adding the cancel field to the JSON request object and setting the value to true. Note that the structure of the request must be identical to the original for the cancellation request to be honoured. For example, if you requested continuous replication, the cancellation request must also contain the continuous field.

    For example, the replication request:

    POST http://couchdb:5984/_replicate
    Content-Type: application/json
    Accept: application/json
    
    {
       "source" : "recipes",
       "target" : "http://couchdb-remote:5984/recipes",
       "create_target" : true,
       "continuous" : true
    }

    Must be canceled using the request:

    POST http://couchdb:5984/_replicate
    Accept: application/json
    Content-Type: application/json
    
    {
        "cancel" : true,
        "continuous" : true
        "create_target" : true,
        "source" : "recipes",
        "target" : "http://couchdb-remote:5984/recipes",
    }

    Requesting cancellation of a replication that does not exist results in a 404 error.

    10.2.7. /_restart¶

    POST /_restart¶

    Restarts the CouchDB instance. You must be authenticated as a user with administration privileges for this to work.

    Request Headers:
     
    Response Headers:
     
    • Content-Type
      • application/json
      • text/plain; charset=utf-8
    Status Codes:

    Request:

    POST /_restart HTTP/1.1
    Accept: application/json
    Host: localhost:5984
    

    Response:

    HTTP/1.1 202 Accepted
    Cache-Control: must-revalidate
    Content-Length: 12
    Content-Type: application/json
    Date: Sat, 10 Aug 2013 11:33:50 GMT
    Server: CouchDB (Erlang/OTP)
    
    {
        "ok": true
    }
    

    10.2.8. /_stats¶

    GET /_stats¶

    The _stats resource returns a JSON object containing the statistics for the running server. The object is structured with top-level sections collating the statistics for a range of entries, with each individual statistic being easily identified, and the content of each statistic is self-describing

    Request Headers:
     
    • Accept
      • application/json
      • text/plain
    Response Headers:
     
    • Content-Type
      • application/json
      • text/plain; charset=utf-8
    Status Codes:
    • 200 OK – Request completed successfully

    Request:

    GET /_stats/couchdb/request_time HTTP/1.1
    Accept: application/json
    Host: localhost:5984
    

    Response:

    HTTP/1.1 200 OK
    Cache-Control: must-revalidate
    Content-Length: 187
    Content-Type: application/json
    Date: Sat, 10 Aug 2013 11:41:11 GMT
    Server: CouchDB (Erlang/OTP)
    
    {
        "couchdb": {
            "request_time": {
                "current": 21.0,
                "description": "length of a request inside CouchDB without MochiWeb",
                "max": 19.0,
                "mean": 7.0,
                "min": 1.0,
                "stddev": 10.392,
                "sum": 21.0
            }
        }
    }
    

    The fields provide the current, minimum and maximum, and a collection of statistical means and quantities. The quantity in each case is not defined, but the descriptions below provide

    The statistics are divided into the following top-level sections:

    couchdb¶

    Describes statistics specific to the internals of CouchDB

    Statistic ID Description Unit
    auth_cache_hits Number of authentication cache hits number
    auth_cache_misses Number of authentication cache misses number
    database_reads Number of times a document was read from a database number
    database_writes Number of times a database was changed number
    open_databases Number of open databases number
    open_os_files Number of file descriptors CouchDB has open number
    request_time Length of a request inside CouchDB without MochiWeb milliseconds

    httpd_request_methods¶

    Statistic ID Description Unit
    COPY Number of HTTP COPY requests number
    DELETE Number of HTTP DELETE requests number
    GET Number of HTTP GET requests number
    HEAD Number of HTTP HEAD requests number
    POST Number of HTTP POST requests number
    PUT Number of HTTP PUT requests number

    httpd_status_codes¶

    Statistic ID Description Unit
    200 Number of HTTP 200 OK responses number
    201 Number of HTTP 201 Created responses number
    202 Number of HTTP 202 Accepted responses number
    301 Number of HTTP 301 Moved Permanently responses number
    304 Number of HTTP 304 Not Modified responses number
    400 Number of HTTP 400 Bad Request responses number
    401 Number of HTTP 401 Unauthorized responses number
    403 Number of HTTP 403 Forbidden responses number
    404 Number of HTTP 404 Not Found responses number
    405 Number of HTTP 405 Method Not Allowed responses number
    409 Number of HTTP 409 Conflict responses number
    412 Number of HTTP 412 Precondition Failed responses number
    500 Number of HTTP 500 Internal Server Error responses number

    httpd¶

    Statistic ID Description Unit
    bulk_requests Number of bulk requests number
    clients_requesting_changes Number of clients for continuous _changes number
    requests Number of HTTP requests number
    temporary_view_reads Number of temporary view reads number
    view_reads Number of view reads number

    You can also access individual statistics by quoting the statistics sections and statistic ID as part of the URL path. For example, to get the request_time statistics, you can use:

    GET /_stats/couchdb/request_time

    This returns an entire statistics object, as with the full request, but containing only the request individual statistic. Hence, the returned structure is as follows:

    {
       "couchdb" : {
          "request_time" : {
             "stddev" : 7454.305,
             "min" : 1,
             "max" : 34185,
             "current" : 34697.803,
             "mean" : 1652.276,
             "sum" : 34697.803,
             "description" : "length of a request inside CouchDB without MochiWeb"
          }
       }
    }
    

    10.2.9. /_utils¶

    GET /_utils¶

    Accesses the built-in Futon administration interface for CouchDB.

    Response Headers:
     
    Status Codes:
    GET /_utils/¶
    Response Headers:
     
    Status Codes:
    • 200 OK – Request completed successfully

    10.2.10. /_uuids¶

    Changed in version 1.5.1.

    GET /_uuids¶

    Requests one or more Universally Unique Identifiers (UUIDs) from the CouchDB instance. The response is a JSON object providing a list of UUIDs.

    Request Headers:
     
    • Accept
      • application/json
      • text/plain
    Query Parameters:
     
    • count (number) – Number of UUIDs to return. Default is 1.
    Response Headers:
     
    • Content-Type
      • application/json
      • text/plain; charset=utf-8
    • ETag – Response hash
    Status Codes:

    Request:

    GET /_uuids?count=10 HTTP/1.1
    Accept: application/json
    Host: localhost:5984
    

    Response:

    HTTP/1.1 200 OK
    Content-Length: 362
    Content-Type: application/json
    Date: Sat, 10 Aug 2013 11:46:25 GMT
    ETag: "DGRWWQFLUDWN5MRKSLKQ425XV"
    Expires: Fri, 01 Jan 1990 00:00:00 GMT
    Pragma: no-cache
    Server: CouchDB (Erlang/OTP)
    
    {
        "uuids": [
            "75480ca477454894678e22eec6002413",
            "75480ca477454894678e22eec600250b",
            "75480ca477454894678e22eec6002c41",
            "75480ca477454894678e22eec6003b90",
            "75480ca477454894678e22eec6003fca",
            "75480ca477454894678e22eec6004bef",
            "75480ca477454894678e22eec600528f",
            "75480ca477454894678e22eec6005e0b",
            "75480ca477454894678e22eec6006158",
            "75480ca477454894678e22eec6006161"
        ]
    }
    

    The UUID type is determined by the UUID algorithm setting in the CouchDB configuration.

    The UUID type may be changed at any time through the Configuration API. For example, the UUID type could be changed to random by sending this HTTP request:

    PUT http://couchdb:5984/_config/uuids/algorithm
    Content-Type: application/json
    Accept: */*
    
    "random"

    You can verify the change by obtaining a list of UUIDs:

    {
       "uuids" : [
          "031aad7b469956cf2826fcb2a9260492",
          "6ec875e15e6b385120938df18ee8e496",
          "cff9e881516483911aa2f0e98949092d",
          "b89d37509d39dd712546f9510d4a9271",
          "2e0dbf7f6c4ad716f21938a016e4e59f"
       ]
    }
    

    10.2.11. /favicon.ico¶

    GET /favicon.ico¶

    Binary content for the favicon.ico site icon.

    Response Headers:
     
    Status Codes:
    • 200 OK – Request completed successfully
    • 404 Not Found – The requested content could not be found
    apache-couchdb-1.6.0/share/doc/build/html/api/server/index.html0000644000175000001440000003115712332105725024320 0ustar00djcusers00000000000000 10.2. Server — Apache CouchDB 1.6 Documentation apache-couchdb-1.6.0/share/doc/build/html/api/server/authn.html0000644000175000001440000012741212332105721024324 0ustar00djcusers00000000000000 10.2.12. Authentication — Apache CouchDB 1.6 Documentation

    10.2.12. Authentication¶

    Interfaces for obtaining session and authorization data.

    Note

    We’re also strongly recommend you to setup SSL to improve all authentication methods security.

    Basic Authentication¶

    Basic authentication (RFC 2617) is a quick and simple way to authenticate with CouchDB. The main drawback is the need to send user credentials with each request which may be insecure and could hurt operation performance (since CouchDB must compute password hash with every request):

    Request:

    GET / HTTP/1.1
    Accept: application/json
    Authorization: Basic cm9vdDpyZWxheA==
    Host: localhost:5984
    

    Response:

    HTTP/1.1 200 OK
    Cache-Control: must-revalidate
    Content-Length: 177
    Content-Type: application/json
    Date: Mon, 03 Dec 2012 00:44:47 GMT
    Server: CouchDB (Erlang/OTP)
    
    {
      "couchdb":"Welcome",
      "uuid":"0a959b9b8227188afc2ac26ccdf345a6",
      "version":"1.3.0",
      "vendor": {
        "version":"1.3.0",
        "name":"The Apache Software Foundation"
      }
    }
    

    Proxy Authentication¶

    Note

    To use this authentication method make sure that the {couch_httpd_auth, proxy_authentication_handler} value in added to the list of the active httpd/authentication_handlers:

    [httpd]
    authentication_handlers = {couch_httpd_oauth, oauth_authentication_handler}, {couch_httpd_auth, cookie_authentication_handler}, {couch_httpd_auth, proxy_authentication_handler}, {couch_httpd_auth, default_authentication_handler}
    

    Proxy authentication is very useful in case your application already uses some external authentication service and you don’t want to duplicate users and their roles in CouchDB.

    This authentication method allows creation of a User Context Object for remotely authenticated user. By default, the client just need to pass specific headers to CouchDB with related request:

    Request:

    GET /_session HTTP/1.1
    Host: localhost:5984
    Accept: application/json
    Content-Type: application/json; charset=utf-8
    X-Auth-CouchDB-Roles: users,blogger
    X-Auth-CouchDB-UserName: foo
    

    Response:

    HTTP/1.1 200 OK
    Cache-Control: must-revalidate
    Content-Length: 190
    Content-Type: application/json
    Date: Fri, 14 Jun 2013 10:16:03 GMT
    Server: CouchDB (Erlang/OTP)
    
    {
        "info": {
            "authenticated": "proxy",
            "authentication_db": "_users",
            "authentication_handlers": [
                "oauth",
                "cookie",
                "proxy",
                "default"
            ]
        },
        "ok": true,
        "userCtx": {
            "name": "foo",
            "roles": [
                "users",
                "blogger"
            ]
        }
    }
    

    Note that you don’t need to request session to be authenticated by this method if all required HTTP headers are provided.

    OAuth Authentication¶

    CouchDB supports OAuth 1.0 authentication (RFC 5849). OAuth provides a method for clients to access server resources without sharing real credentials (username and password).

    First, configure oauth, by setting consumer and token with their secrets and binding token to real CouchDB username.

    Probably, it’s not good idea to work with plain curl, let use some scripting language like Python:

    #!/usr/bin/env python2
    from oauth import oauth # pip install oauth
    import httplib
    
    URL = 'http://localhost:5984/_session'
    CONSUMER_KEY = 'consumer1'
    CONSUMER_SECRET = 'sekr1t'
    TOKEN = 'token1'
    SECRET = 'tokensekr1t'
    
    consumer = oauth.OAuthConsumer(CONSUMER_KEY, CONSUMER_SECRET)
    token = oauth.OAuthToken(TOKEN, SECRET)
    req = oauth.OAuthRequest.from_consumer_and_token(
        consumer,
        token=token,
        http_method='GET',
        http_url=URL,
        parameters={}
    )
    req.sign_request(oauth.OAuthSignatureMethod_HMAC_SHA1(), consumer,token)
    
    headers = req.to_header()
    headers['Accept'] = 'application/json'
    
    con = httplib.HTTPConnection('localhost', 5984)
    con.request('GET', URL, headers=headers)
    resp = con.getresponse()
    print resp.read()
    

    or Ruby:

    #!/usr/bin/env ruby
    
    require 'oauth' # gem install oauth
    
    URL = 'http://localhost:5984'
    CONSUMER_KEY = 'consumer1'
    CONSUMER_SECRET = 'sekr1t'
    TOKEN = 'token1'
    SECRET = 'tokensekr1t'
    
    @consumer = OAuth::Consumer.new CONSUMER_KEY,
                                    CONSUMER_SECRET,
                                    {:site => URL}
    
    @access_token = OAuth::AccessToken.new(@consumer, TOKEN, SECRET)
    
    puts @access_token.get('/_session').body
    

    Both snippets produces similar request and response pair:

    GET /_session HTTP/1.1
    Host: localhost:5984
    Accept: application/json
    Authorization: OAuth realm="", oauth_nonce="81430018", oauth_timestamp="1374561749", oauth_consumer_key="consumer1", oauth_signature_method="HMAC-SHA1", oauth_version="1.0", oauth_token="token1", oauth_signature="o4FqJ8%2B9IzUpXH%2Bk4rgnv7L6eTY%3D"
    
    HTTP/1.1 200 OK
    Cache-Control : must-revalidate
    Content-Length : 167
    Content-Type : application/json
    Date : Tue, 23 Jul 2013 06:51:15 GMT
    Server: CouchDB (Erlang/OTP)
    
    
    {
      "ok": true,
      "info": {
        "authenticated": "oauth",
        "authentication_db": "_users",
        "authentication_handlers": ["oauth", "cookie", "default"]
      },
      "userCtx": {
        "name": "couchdb_username",
        "roles": []
      }
    }
    

    There we request the _session resource to ensure that authentication was successful and the target CouchDB username is correct. Change the target URL to request required resource.

    apache-couchdb-1.6.0/share/doc/build/html/api/server/configuration.html0000644000175000001440000012207512332105725026060 0ustar00djcusers00000000000000 10.2.13. Configuration — Apache CouchDB 1.6 Documentation

    10.2.13. Configuration¶

    The CouchDB Server Configuration API provide an interface to query and update the various configuration values within a running CouchDB instance.

    /_config¶

    GET /_config¶

    Returns the entire CouchDB server configuration as a JSON structure. The structure is organized by different configuration sections, with individual values.

    Request Headers:
     
    • Accept
      • application/json
      • text/plain
    Response Headers:
     
    • Content-Type
      • application/json
      • text/plain; charset=utf-8
    Status Codes:
    • 200 OK – Request completed successfully
    • 401 Unauthorized – CouchDB Server Administrator privileges required

    Request

    GET /_config HTTP/1.1
    Accept: application/json
    Host: localhost:5984
    

    Response:

    HTTP/1.1 200 OK
    Cache-Control: must-revalidate
    Content-Length: 4148
    Content-Type: application/json
    Date: Sat, 10 Aug 2013 12:01:42 GMT
    Server: CouchDB (Erlang/OTP)
    
    {
      "attachments": {
          "compressible_types": "text/*, application/javascript, application/json,  application/xml",
          "compression_level": "8"
      },
      "couch_httpd_auth": {
          "auth_cache_size": "50",
          "authentication_db": "_users",
          "authentication_redirect": "/_utils/session.html",
          "require_valid_user": "false",
          "timeout": "600"
      },
      "couchdb": {
          "database_dir": "/var/lib/couchdb",
          "delayed_commits": "true",
          "max_attachment_chunk_size": "4294967296",
          "max_dbs_open": "100",
          "max_document_size": "4294967296",
          "os_process_timeout": "5000",
          "uri_file": "/var/lib/couchdb/couch.uri",
          "util_driver_dir": "/usr/lib64/couchdb/erlang/lib/couch-1.5.0/priv/lib",
          "view_index_dir": "/var/lib/couchdb"
      },
      "daemons": {
          "auth_cache": "{couch_auth_cache, start_link, []}",
          "db_update_notifier": "{couch_db_update_notifier_sup, start_link, []}",
          "external_manager": "{couch_external_manager, start_link, []}",
          "httpd": "{couch_httpd, start_link, []}",
          "query_servers": "{couch_query_servers, start_link, []}",
          "stats_aggregator": "{couch_stats_aggregator, start, []}",
          "stats_collector": "{couch_stats_collector, start, []}",
          "uuids": "{couch_uuids, start, []}",
          "view_manager": "{couch_view, start_link, []}"
      },
      "httpd": {
          "allow_jsonp": "false",
          "authentication_handlers": "{couch_httpd_oauth, oauth_authentication_handler}, {couch_httpd_auth, cookie_authentication_handler}, {couch_httpd_auth, default_authentication_handler}",
          "bind_address": "192.168.0.2",
          "default_handler": "{couch_httpd_db, handle_request}",
          "max_connections": "2048",
          "port": "5984",
          "secure_rewrites": "true",
          "vhost_global_handlers": "_utils, _uuids, _session, _oauth, _users"
      },
      "httpd_db_handlers": {
          "_changes": "{couch_httpd_db, handle_changes_req}",
          "_compact": "{couch_httpd_db, handle_compact_req}",
          "_design": "{couch_httpd_db, handle_design_req}",
          "_temp_view": "{couch_httpd_view, handle_temp_view_req}",
          "_view_cleanup": "{couch_httpd_db, handle_view_cleanup_req}"
      },
      "httpd_design_handlers": {
          "_info": "{couch_httpd_db,   handle_design_info_req}",
          "_list": "{couch_httpd_show, handle_view_list_req}",
          "_rewrite": "{couch_httpd_rewrite, handle_rewrite_req}",
          "_show": "{couch_httpd_show, handle_doc_show_req}",
          "_update": "{couch_httpd_show, handle_doc_update_req}",
          "_view": "{couch_httpd_view, handle_view_req}"
      },
      "httpd_global_handlers": {
          "/": "{couch_httpd_misc_handlers, handle_welcome_req, <<\"Welcome\">>}",
          "_active_tasks": "{couch_httpd_misc_handlers, handle_task_status_req}",
          "_all_dbs": "{couch_httpd_misc_handlers, handle_all_dbs_req}",
          "_config": "{couch_httpd_misc_handlers, handle_config_req}",
          "_log": "{couch_httpd_misc_handlers, handle_log_req}",
          "_oauth": "{couch_httpd_oauth, handle_oauth_req}",
          "_replicate": "{couch_httpd_misc_handlers, handle_replicate_req}",
          "_restart": "{couch_httpd_misc_handlers, handle_restart_req}",
          "_session": "{couch_httpd_auth, handle_session_req}",
          "_stats": "{couch_httpd_stats_handlers, handle_stats_req}",
          "_utils": "{couch_httpd_misc_handlers, handle_utils_dir_req, \"/usr/share/couchdb/www\"}",
          "_uuids": "{couch_httpd_misc_handlers, handle_uuids_req}",
          "favicon.ico": "{couch_httpd_misc_handlers, handle_favicon_req, \"/usr/share/couchdb/www\"}"
      },
      "log": {
          "file": "/var/log/couchdb/couch.log",
          "include_sasl": "true",
          "level": "info"
      },
      "query_server_config": {
          "reduce_limit": "true"
      },
      "query_servers": {
          "javascript": "/usr/bin/couchjs /usr/share/couchdb/server/main.js"
      },
      "replicator": {
          "max_http_pipeline_size": "10",
          "max_http_sessions": "10"
      },
      "stats": {
          "rate": "1000",
          "samples": "[0, 60, 300, 900]"
      },
      "uuids": {
          "algorithm": "utc_random"
      }
    }
    

    /_config/section¶

    GET /_config/{section}¶

    Gets the configuration structure for a single section.

    Parameters:
    • section – Configuration section name
    Request Headers:
     
    • Accept
      • application/json
      • text/plain
    Response Headers:
     
    • Content-Type
      • application/json
      • text/plain; charset=utf-8
    Status Codes:
    • 200 OK – Request completed successfully
    • 401 Unauthorized – CouchDB Server Administrator privileges required

    Request:

    GET /_config/httpd HTTP/1.1
    Accept: application/json
    Host: localhost:5984
    

    Response:

    HTTP/1.1 200 OK
    Cache-Control: must-revalidate
    Content-Length: 444
    Content-Type: application/json
    Date: Sat, 10 Aug 2013 12:10:40 GMT
    Server: CouchDB (Erlang/OTP)
    
    {
        "allow_jsonp": "false",
        "authentication_handlers": "{couch_httpd_oauth, oauth_authentication_handler}, {couch_httpd_auth, cookie_authentication_handler}, {couch_httpd_auth, default_authentication_handler}",
        "bind_address": "127.0.0.1",
        "default_handler": "{couch_httpd_db, handle_request}",
        "enable_cors": "false",
        "log_max_chunk_size": "1000000",
        "port": "5984",
        "secure_rewrites": "true",
        "vhost_global_handlers": "_utils, _uuids, _session, _oauth, _users"
    }
    

    /_config/section/key¶

    GET /_config/{section}/{key}¶

    Gets a single configuration value from within a specific configuration section.

    Parameters:
    • section – Configuration section name
    • key – Configuration option name
    Request Headers:
     
    • Accept
      • application/json
      • text/plain
    Response Headers:
     
    • Content-Type
      • application/json
      • text/plain; charset=utf-8
    Status Codes:
    • 200 OK – Request completed successfully
    • 401 Unauthorized – CouchDB Server Administrator privileges required

    Request:

    GET /_config/log/level HTTP/1.1
    Accept: application/json
    Host: localhost:5984
    

    Response:

    HTTP/1.1 200 OK
    Cache-Control: must-revalidate
    Content-Length: 8
    Content-Type: application/json
    Date: Sat, 10 Aug 2013 12:12:59 GMT
    Server: CouchDB (Erlang/OTP)
    
    "debug"
    

    Note

    The returned value will be the JSON of the value, which may be a string or numeric value, or an array or object. Some client environments may not parse simple strings or numeric values as valid JSON.

    PUT /_config/{section}/{key}¶

    Updates a configuration value. The new value should be supplied in the request body in the corresponding JSON format. If you are setting a string value, you must supply a valid JSON string. In response CouchDB sends old value for target section key.

    Parameters:
    • section – Configuration section name
    • key – Configuration option name
    Request Headers:
     
    Response Headers:
     
    • Content-Type
      • application/json
      • text/plain; charset=utf-8
    Status Codes:

    Request:

    PUT /_config/log/level HTTP/1.1
    Accept: application/json
    Content-Length: 7
    Content-Type: application/json
    Host: localhost:5984
    
    "info"
    

    Response:

    HTTP/1.1 200 OK
    Cache-Control: must-revalidate
    Content-Length: 8
    Content-Type: application/json
    Date: Sat, 10 Aug 2013 12:12:59 GMT
    Server: CouchDB (Erlang/OTP)
    
    "debug"
    
    DELETE /_config/{section}/{key}¶

    Deletes a configuration value. The returned JSON will be the value of the configuration parameter before it was deleted.

    Parameters:
    • section – Configuration section name
    • key – Configuration option name
    Request Headers:
     
    • Accept
      • application/json
      • text/plain
    Response Headers:
     
    • Content-Type
      • application/json
      • text/plain; charset=utf-8
    Status Codes:

    Request:

    DELETE /_config/log/level HTTP/1.1
    Accept: application/json
    Host: localhost:5984
    

    Response:

    HTTP/1.1 200 OK
    Cache-Control: must-revalidate
    Content-Length: 7
    Content-Type: application/json
    Date: Sat, 10 Aug 2013 12:29:03 GMT
    Server: CouchDB (Erlang/OTP)
    
    "info"
    
    apache-couchdb-1.6.0/share/doc/build/html/api/document/0000755000175000001440000000000012332106072022620 5ustar00djcusers00000000000000apache-couchdb-1.6.0/share/doc/build/html/api/document/common.html0000644000175000001440000033010112332105717025001 0ustar00djcusers00000000000000 10.4.1. /db/doc — Apache CouchDB 1.6 Documentation

    10.4.1. /db/doc¶

    HEAD /{db}/{docid}¶

    Returns the HTTP Headers containing a minimal amount of information about the specified document. The method supports the same query arguments as the GET /{db}/{docid} method, but only the header information (including document size, and the revision as an ETag), is returned.

    The ETag header shows the current revision for the requested document, and the Content-Length specifies the length of the data, if the document were requested in full.

    Adding any of the query arguments (see GET /{db}/{docid}), then the resulting HTTP Headers will correspond to what would be returned.

    Parameters:
    • db – Database name
    • docid – Document ID
    Request Headers:
     
    Response Headers:
     
    Status Codes:

    Request:

    GET /db/SpaghettiWithMeatballs HTTP/1.1
    Accept: application/json
    Host: localhost:5984
    

    Response:

    HTTP/1.1 200 OK
    Cache-Control: must-revalidate
    Content-Length: 660
    Content-Type: application/json
    Date: Tue, 13 Aug 2013 21:35:37 GMT
    ETag: "12-151bb8678d45aaa949ec3698ef1c7e78"
    Server: CouchDB (Erlang/OTP)
    
    GET /{db}/{docid}¶

    Returns document by the specified docid from the specified db. Unless you request a specific revision, the latest revision of the document will always be returned.

    Parameters:
    • db – Database name
    • docid – Document ID
    Request Headers:
     
    • Accept
      • application/json
      • multipart/mixed
      • text/plain
    • If-None-Match – Double quoted document’s revision token
    Query Parameters:
     
    • attachments (boolean) – Includes attachments bodies in response. Default is false
    • att_encoding_info (boolean) – Includes encoding information in attachment stubs if the particular attachment is compressed. Default is false.
    • atts_since (array) – Includes attachments only since specified revisions. Doesn’t includes attachments for specified revisions. Optional
    • conflicts (boolean) – Includes information about conflicts in document. Default is false
    • deleted_conflicts (boolean) – Includes information about deleted conflicted revisions. Default is false
    • latest (boolean) – Forces retrieving latest “leaf” revision, no matter what rev was requested. Default is false
    • local_seq (boolean) – Includes last update sequence number for the document. Default is false
    • meta (boolean) – Acts same as specifying all conflicts, deleted_conflicts and open_revs query parameters. Default is false
    • open_revs (array) – Retrieves documents of specified leaf revisions. Additionally, it accepts value as all to return all leaf revisions. Optional
    • rev (string) – Retrieves document of specified revision. Optional
    • revs (boolean) – Includes list of all known document revisions. Default is false
    • revs_info (boolean) – Includes detailed information for all known document revisions. Default is false
    Response Headers:
     
    • Content-Type
      • application/json
      • multipart/mixed
      • text/plain; charset=utf-8
    • ETag – Double quoted document’s revision token. Not available when retrieving conflicts-related information
    • Transfer-Encodingchunked. Available if requested with query parameter open_revs
    Response JSON Object:
     
    • _id (string) – Document ID
    • _rev (string) – Revision MVCC token
    • _deleted (boolean) – Deletion flag. Available if document was removed
    • _attachments (object) – Attachment’s stubs. Available if document has any attachments
    • _conflicts (array) – List of conflicted revisions. Available if requested with conflicts=true query parameter
    • _deleted_conflicts (array) – List of deleted conflicted revisions. Available if requested with deleted_conflicts=true query parameter
    • _local_seq (number) – Document’s sequence number in current database. Available if requested with local_seq=true query parameter
    • _revs_info (array) – List of objects with information about local revisions and their status. Available if requested with open_revs query parameter
    • _revisions (object) – List of local revision tokens without. Available if requested with revs=true query parameter
    Status Codes:

    Request:

    GET /recipes/SpaghettiWithMeatballs HTTP/1.1
    Accept: application/json
    Host: localhost:5984
    

    Response:

    HTTP/1.1 200 OK
    Cache-Control: must-revalidate
    Content-Length: 660
    Content-Type: application/json
    Date: Tue, 13 Aug 2013 21:35:37 GMT
    ETag: "1-917fa2381192822767f010b95b45325b"
    Server: CouchDB (Erlang/OTP)
    
    {
        "_id": "SpaghettiWithMeatballs",
        "_rev": "1-917fa2381192822767f010b95b45325b",
        "description": "An Italian-American dish that usually consists of spaghetti, tomato sauce and meatballs.",
        "ingredients": [
            "spaghetti",
            "tomato sauce",
            "meatballs"
        ],
        "name": "Spaghetti with meatballs"
    }
    
    PUT /{db}/{docid}¶

    The PUT method creates a new named document, or creates a new revision of the existing document. Unlike the POST /{db}, you must specify the document ID in the request URL.

    Parameters:
    • db – Database name
    • docid – Document ID
    Request Headers:
     
    • Accept
      • application/json
      • text/plain
    • Content-Typeapplication/json
    • If-Match – Document’s revision. Alternative to rev query parameter
    • X-Couch-Full-Commit – Overrides server’s commit policy. Possible values are: false and true. Optional
    Query Parameters:
     
    • batch (string) – Stores document in batch mode Possible values: ok. Optional
    Response Headers:
     
    • Content-Type
      • application/json
      • text/plain; charset=utf-8
    • ETag – Quoted document’s new revision
    • Location – Document URI
    Response JSON Object:
     
    • id (string) – Document ID
    • ok (boolean) – Operation status
    • rev (string) – Revision MVCC token
    Status Codes:
    • 201 Created – Document created and stored on disk
    • 202 Accepted – Document data accepted, but not yet stored on disk
    • 400 Bad Request – Invalid request body or parameters
    • 401 Unauthorized – Write privileges required
    • 404 Not Found – Specified database or document ID doesn’t exists
    • 409 Conflict – Document with the specified ID already exists or specified revision is not latest for target document

    Request:

    PUT /recipes/SpaghettiWithMeatballs HTTP/1.1
    Accept: application/json
    Content-Length: 196
    Content-Type: application/json
    Host: localhost:5984
    
    {
        "description": "An Italian-American dish that usually consists of spaghetti, tomato sauce and meatballs.",
        "ingredients": [
            "spaghetti",
            "tomato sauce",
            "meatballs"
        ],
        "name": "Spaghetti with meatballs"
    }
    

    Response:

    HTTP/1.1 201 Created
    Cache-Control: must-revalidate
    Content-Length: 85
    Content-Type: application/json
    Date: Wed, 14 Aug 2013 20:31:39 GMT
    ETag: "1-917fa2381192822767f010b95b45325b"
    Location: http://localhost:5984/recipes/SpaghettiWithMeatballs
    Server: CouchDB (Erlang/OTP)
    
    {
        "id": "SpaghettiWithMeatballs",
        "ok": true,
        "rev": "1-917fa2381192822767f010b95b45325b"
    }
    
    DELETE /{db}/{docid}¶

    Marks the specified document as deleted by adding a field _deleted with the value true. Documents with this field will not be returned within requests anymore, but stay in the database. You must supply the current (latest) revision, either by using the rev parameter or by using the If-Match header to specify the revision.

    Note

    CouchDB doesn’t actually delete documents. The reason is the need to track them correctly during the replication process between databases to prevent accidental document recovery for any previous state.

    Parameters:
    • db – Database name
    • docid – Document ID
    Request Headers:
     
    • Accept
      • application/json
      • text/plain
    • If-Match – Document’s revision. Alternative to rev query parameter
    • X-Couch-Full-Commit – Overrides server’s commit policy. Possible values are: false and true. Optional
    Query Parameters:
     
    • rev (string) – Actual document’s revision
    • batch (string) – Stores document in batch mode Possible values: ok. Optional
    Response Headers:
     
    • Content-Type
      • application/json
      • text/plain; charset=utf-8
    • ETag – Double quoted document’s new revision
    Response JSON Object:
     
    • id (string) – Document ID
    • ok (boolean) – Operation status
    • rev (string) – Revision MVCC token
    Status Codes:

    Request:

    DELETE /recipes/FishStew?rev=1-9c65296036141e575d32ba9c034dd3ee HTTP/1.1
    Accept: application/json
    Host: localhost:5984
    

    Alternatively, instead of rev query parameter you may use If-Match header:

    DELETE /recipes/FishStew HTTP/1.1
    Accept: application/json
    If-Match: 1-9c65296036141e575d32ba9c034dd3ee
    Host: localhost:5984
    

    Response:

    HTTP/1.1 200 OK
    Cache-Control: must-revalidate
    Content-Length: 71
    Content-Type: application/json
    Date: Wed, 14 Aug 2013 12:23:13 GMT
    ETag: "2-056f5f44046ecafc08a2bc2b9c229e20"
    Server: CouchDB (Erlang/OTP)
    
    {
        "id": "FishStew",
        "ok": true,
        "rev": "2-056f5f44046ecafc08a2bc2b9c229e20"
    }
    
    COPY /{db}/{docid}¶

    The COPY (which is non-standard HTTP) copies an existing document to a new or existing document.

    The source document is specified on the request line, with the Destination header of the request specifying the target document.

    Parameters:
    • db – Database name
    • docid – Document ID
    Request Headers:
     
    • Accept
      • application/json
      • text/plain
    • Destination – Destination document
    • If-Match – Source document’s revision. Alternative to rev query parameter
    • X-Couch-Full-Commit – Overrides server’s commit policy. Possible values are: false and true. Optional
    Query Parameters:
     
    • rev (string) – Revision to copy from. Optional
    • batch (string) – Stores document in batch mode Possible values: ok. Optional
    Response Headers:
     
    • Content-Type
      • application/json
      • text/plain; charset=utf-8
    • ETag – Double quoted document’s new revision
    • Location – Document URI
    Response JSON Object:
     
    • id (string) – Document document ID
    • ok (boolean) – Operation status
    • rev (string) – Revision MVCC token
    Status Codes:
    • 201 Created – Document successfully created
    • 202 Accepted – Request was accepted, but changes are not yet stored on disk
    • 400 Bad Request – Invalid request body or parameters
    • 401 Unauthorized – Read or write privileges required
    • 404 Not Found – Specified database, document ID or revision doesn’t exists
    • 409 Conflict – Document with the specified ID already exists or specified revision is not latest for target document

    Request:

    COPY /recipes/SpaghettiWithMeatballs HTTP/1.1
    Accept: application/json
    Destination: SpaghettiWithMeatballs_Italian
    Host: localhost:5984

    Response:

    HTTP/1.1 201 Created
    Cache-Control: must-revalidate
    Content-Length: 93
    Content-Type: application/json
    Date: Wed, 14 Aug 2013 14:21:00 GMT
    ETag: "1-e86fdf912560c2321a5fcefc6264e6d9"
    Location: http://localhost:5984/recipes/SpaghettiWithMeatballs_Italian
    Server: CouchDB (Erlang/OTP)
    
    {
        "id": "SpaghettiWithMeatballs_Italian",
        "ok": true,
        "rev": "1-e86fdf912560c2321a5fcefc6264e6d9"
    }
    

    Attachments¶

    If the document includes attachments, then the returned structure will contain a summary of the attachments associated with the document, but not the attachment data itself.

    The JSON for the returned document will include the _attachments field, with one or more attachment definitions.

    The _attachments object keys are attachments names while values are information objects with next structure:

    • content_type (string): Attachment MIME type

    • data (string): Base64-encoded content. Available if attachment content is requested by using the following query parameters:

      • attachments=true when querying a document
      • attachments=true&include_docs=true when querying a changes feed or a view
      • atts_since.
    • digest (string): Content hash digest. It starts with prefix which announce hash type (md5-) and continues with Base64-encoded hash digest

    • encoded_length (number): Compressed attachment size in bytes. Available if content_type is in list of compressible types when the attachment was added and the following query parameters are specified:

      • att_encoding_info=true when querying a document
      • att_encoding_info=true&include_docs=true when querying a changes feed or a view
    • encoding (string): Compression codec. Available if content_type is in list of compressible types when the attachment was added and the following query parameters are specified:

      • att_encoding_info=true when querying a document
      • att_encoding_info=true&include_docs=true when querying a changes feed or a view
    • length (number): Real attachment size in bytes. Not available if attachment content requested

    • revpos (number): Revision number when attachment was added

    • stub (boolean): Has true value if object contains stub info and no content. Otherwise omitted in response

    Basic Attachments Info¶

    Request:

    GET /recipes/SpaghettiWithMeatballs HTTP/1.1
    Accept: application/json
    Host: localhost:5984
    

    Response:

    HTTP/1.1 200 OK
    Cache-Control: must-revalidate
    Content-Length: 660
    Content-Type: application/json
    Date: Tue, 13 Aug 2013 21:35:37 GMT
    ETag: "5-fd96acb3256302bf0dd2f32713161f2a"
    Server: CouchDB (Erlang/OTP)
    
    {
        "_attachments": {
            "grandma_recipe.txt": {
                "content_type": "text/plain",
                "digest": "md5-Ids41vtv725jyrN7iUvMcQ==",
                "length": 1872,
                "revpos": 4,
                "stub": true
            },
            "my_recipe.txt": {
                "content_type": "text/plain",
                "digest": "md5-198BPPNiT5fqlLxoYYbjBA==",
                "length": 85,
                "revpos": 5,
                "stub": true
            },
            "photo.jpg": {
                "content_type": "image/jpeg",
                "digest": "md5-7Pv4HW2822WY1r/3WDbPug==",
                "length": 165504,
                "revpos": 2,
                "stub": true
            }
        },
        "_id": "SpaghettiWithMeatballs",
        "_rev": "5-fd96acb3256302bf0dd2f32713161f2a",
        "description": "An Italian-American dish that usually consists of spaghetti, tomato sauce and meatballs.",
        "ingredients": [
            "spaghetti",
            "tomato sauce",
            "meatballs"
        ],
        "name": "Spaghetti with meatballs"
    }
    

    Retrieving Attachments Content¶

    It’s possible to retrieve document with all attached files content by using attachements=true query parameter:

    Request:

    GET /db/pixel?attachments=true HTTP/1.1
    Accept: application/json
    Host: localhost:5984
    

    Response:

    HTTP/1.1 200 OK
    Cache-Control: must-revalidate
    Content-Length: 553
    Content-Type: application/json
    Date: Wed, 14 Aug 2013 11:32:40 GMT
    ETag: "4-f1bcae4bf7bbb92310079e632abfe3f4"
    Server: CouchDB (Erlang/OTP)
    
    {
        "_attachments": {
            "pixel.gif": {
                "content_type": "image/gif",
                "data": "R0lGODlhAQABAIAAAAAAAP///yH5BAEAAAAALAAAAAABAAEAAAIBRAA7",
                "digest": "md5-2JdGiI2i2VELZKnwMers1Q==",
                "revpos": 2
            },
            "pixel.png": {
                "content_type": "image/png",
                "data": "iVBORw0KGgoAAAANSUhEUgAAAAEAAAABAQMAAAAl21bKAAAAAXNSR0IArs4c6QAAAANQTFRFAAAAp3o92gAAAAF0Uk5TAEDm2GYAAAABYktHRACIBR1IAAAACXBIWXMAAAsTAAALEwEAmpwYAAAAB3RJTUUH3QgOCx8VHgmcNwAAAApJREFUCNdjYAAAAAIAAeIhvDMAAAAASUVORK5CYII=",
                "digest": "md5-Dgf5zxgGuchWrve73evvGQ==",
                "revpos": 3
            }
        },
        "_id": "pixel",
        "_rev": "4-f1bcae4bf7bbb92310079e632abfe3f4"
    }
    

    Or retrieve attached files content since specific revision using atts_since query parameter:

    Request:

    GET /recipes/SpaghettiWithMeatballs?atts_since=[%224-874985bc28906155ba0e2e0538f67b05%22]  HTTP/1.1
    Accept: application/json
    Host: localhost:5984
    

    Response:

    HTTP/1.1 200 OK
    Cache-Control: must-revalidate
    Content-Length: 760
    Content-Type: application/json
    Date: Tue, 13 Aug 2013 21:35:37 GMT
    ETag: "5-fd96acb3256302bf0dd2f32713161f2a"
    Server: CouchDB (Erlang/OTP)
    
    {
        "_attachments": {
            "grandma_recipe.txt": {
                "content_type": "text/plain",
                "digest": "md5-Ids41vtv725jyrN7iUvMcQ==",
                "length": 1872,
                "revpos": 4,
                "stub": true
            },
            "my_recipe.txt": {
                "content_type": "text/plain",
                "data": "MS4gQ29vayBzcGFnaGV0dGkKMi4gQ29vayBtZWV0YmFsbHMKMy4gTWl4IHRoZW0KNC4gQWRkIHRvbWF0byBzYXVjZQo1LiAuLi4KNi4gUFJPRklUIQ==",
                "digest": "md5-198BPPNiT5fqlLxoYYbjBA==",
                "revpos": 5
            },
            "photo.jpg": {
                "content_type": "image/jpeg",
                "digest": "md5-7Pv4HW2822WY1r/3WDbPug==",
                "length": 165504,
                "revpos": 2,
                "stub": true
            }
        },
        "_id": "SpaghettiWithMeatballs",
        "_rev": "5-fd96acb3256302bf0dd2f32713161f2a",
        "description": "An Italian-American dish that usually consists of spaghetti, tomato sauce and meatballs.",
        "ingredients": [
            "spaghetti",
            "tomato sauce",
            "meatballs"
        ],
        "name": "Spaghetti with meatballs"
    }
    

    Efficient Multiple Attachments Retrieving¶

    As you had noted above, retrieving document with attachements=true returns large JSON object where all attachments are included. While you document and files are smaller it’s ok, but if you have attached something bigger like media files (audio/video), parsing such response might be very expensive.

    To solve this problem, CouchDB allows to get documents in multipart/related format:

    Request:

    GET /recipes/secret?attachments=true HTTP/1.1
    Accept: multipart/related
    Host: localhost:5984
    

    Response:

    HTTP/1.1 200 OK
    Content-Length: 538
    Content-Type: multipart/related; boundary="e89b3e29388aef23453450d10e5aaed0"
    Date: Sat, 28 Sep 2013 08:08:22 GMT
    ETag: "2-c1c6c44c4bc3c9344b037c8690468605"
    Server: CouchDB (Erlang OTP)
    
    --e89b3e29388aef23453450d10e5aaed0
    Content-Type: application/json
    
    {"_id":"secret","_rev":"2-c1c6c44c4bc3c9344b037c8690468605","_attachments":{"recipe.txt":{"content_type":"text/plain","revpos":2,"digest":"md5-HV9aXJdEnu0xnMQYTKgOFA==","length":86,"follows":true}}}
    --e89b3e29388aef23453450d10e5aaed0
    Content-Disposition: attachment; filename="recipe.txt"
    Content-Type: text/plain
    Content-Length: 86
    
    1. Take R
    2. Take E
    3. Mix with L
    4. Add some A
    5. Serve with X
    
    --e89b3e29388aef23453450d10e5aaed0--
    

    In this response the document contains only attachments stub information and quite short while all attachments goes as separate entities which reduces memory footprint and processing overhead (you’d noticed, that attachment content goes as raw data, not in base64 encoding, right?).

    Retrieving Attachments Encoding Info¶

    By using att_encoding_info=true query parameter you may retrieve information about compressed attachments size and used codec.

    Request:

    GET /recipes/SpaghettiWithMeatballs?att_encoding_info=true HTTP/1.1
    Accept: application/json
    Host: localhost:5984
    

    Response:

    HTTP/1.1 200 OK
    Cache-Control: must-revalidate
    Content-Length: 736
    Content-Type: application/json
    Date: Tue, 13 Aug 2013 21:35:37 GMT
    ETag: "5-fd96acb3256302bf0dd2f32713161f2a"
    Server: CouchDB (Erlang/OTP)
    
    {
        "_attachments": {
            "grandma_recipe.txt": {
                "content_type": "text/plain",
                "digest": "md5-Ids41vtv725jyrN7iUvMcQ==",
                "encoded_length": 693,
                "encoding": "gzip",
                "length": 1872,
                "revpos": 4,
                "stub": true
            },
            "my_recipe.txt": {
                "content_type": "text/plain",
                "digest": "md5-198BPPNiT5fqlLxoYYbjBA==",
                "encoded_length": 100,
                "encoding": "gzip",
                "length": 85,
                "revpos": 5,
                "stub": true
            },
            "photo.jpg": {
                "content_type": "image/jpeg",
                "digest": "md5-7Pv4HW2822WY1r/3WDbPug==",
                "length": 165504,
                "revpos": 2,
                "stub": true
            }
        },
        "_id": "SpaghettiWithMeatballs",
        "_rev": "5-fd96acb3256302bf0dd2f32713161f2a",
        "description": "An Italian-American dish that usually consists of spaghetti, tomato sauce and meatballs.",
        "ingredients": [
            "spaghetti",
            "tomato sauce",
            "meatballs"
        ],
        "name": "Spaghetti with meatballs"
    }
    

    Creating Multiple Attachments¶

    To create a document with multiple attachments with single request you need just inline base64 encoded attachments data into the document body:

    {
      "_id":"multiple_attachments",
      "_attachments":
      {
        "foo.txt":
        {
          "content_type":"text\/plain",
          "data": "VGhpcyBpcyBhIGJhc2U2NCBlbmNvZGVkIHRleHQ="
        },
    
       "bar.txt":
        {
          "content_type":"text\/plain",
          "data": "VGhpcyBpcyBhIGJhc2U2NCBlbmNvZGVkIHRleHQ="
        }
      }
    }
    

    Alternatively, you can upload a document with attachments more efficiently in multipart/related format. This avoids having to Base64-encode the attachments, saving CPU and bandwidth. To do this, set the Content-Type header of the PUT /{db}/{docid} request to multipart/related.

    The first MIME body is the document itself, which should have its own Content-Type of application/json". It also should include an _attachments metadata object in which each attachment object has a key follows with value true.

    The subsequent MIME bodies are the attachments.

    Request:

    PUT /temp/somedoc HTTP/1.1
    Accept: application/json
    Content-Length: 372
    Content-Type: multipart/related;boundary="abc123"
    Host: localhost:5984
    User-Agent: HTTPie/0.6.0
    
    --abc123
    Content-Type: application/json
    
    {
        "body": "This is a body.",
        "_attachments": {
            "foo.txt": {
                "follows": true,
                "content_type": "text/plain",
                "length": 21
            },
            "bar.txt": {
                "follows": true,
                "content_type": "text/plain",
                "length": 20
            }
        }
    }
    
    --abc123
    
    this is 21 chars long
    --abc123
    
    this is 20 chars lon
    --abc123--
    

    Response:

    HTTP/1.1 201 Created
    Cache-Control: must-revalidate
    Content-Length: 72
    Content-Type: application/json
    Date: Sat, 28 Sep 2013 09:13:24 GMT
    ETag: "1-5575e26acdeb1df561bb5b70b26ba151"
    Location: http://localhost:5984/temp/somedoc
    Server: CouchDB (Erlang OTP)
    
    {
        "id": "somedoc",
        "ok": true,
        "rev": "1-5575e26acdeb1df561bb5b70b26ba151"
    }
    

    Getting a List of Revisions¶

    You can obtain a list of the revisions for a given document by adding the revs=true parameter to the request URL:

    Request:

    GET /recipes/SpaghettiWithMeatballs?revs=true  HTTP/1.1
    Accept: application/json
    Host: localhost:5984
    

    Response:

    HTTP/1.1 200 OK
    Cache-Control: must-revalidate
    Content-Length: 584
    Content-Type: application/json
    Date: Wed, 14 Aug 2013 11:38:26 GMT
    ETag: "5-fd96acb3256302bf0dd2f32713161f2a"
    Server: CouchDB (Erlang/OTP)
    
    {
        "_id": "SpaghettiWithMeatballs",
        "_rev": "8-6f5ad8db0f34af24a6e0984cd1a6cfb9",
        "_revisions": {
            "ids": [
                "6f5ad8db0f34af24a6e0984cd1a6cfb9",
                "77fba3a059497f51ec99b9b478b569d2",
                "136813b440a00a24834f5cb1ddf5b1f1",
                "fd96acb3256302bf0dd2f32713161f2a",
                "874985bc28906155ba0e2e0538f67b05",
                "0de77a37463bf391d14283e626831f2e",
                "d795d1b924777732fdea76538c558b62",
                "917fa2381192822767f010b95b45325b"
            ],
            "start": 8
        },
        "description": "An Italian-American dish that usually consists of spaghetti, tomato sauce and meatballs.",
        "ingredients": [
            "spaghetti",
            "tomato sauce",
            "meatballs"
        ],
        "name": "Spaghetti with meatballs"
    }
    

    The returned JSON structure includes the original document, including a _revisions structure that includes the revision information in next form:

    • ids (array): Array of valid revision IDs, in reverse order (latest first)
    • start (number): Prefix number for the latest revision

    Obtaining an Extended Revision History¶

    You can get additional information about the revisions for a given document by supplying the revs_info argument to the query:

    Request:

    GET /recipes/SpaghettiWithMeatballs?revs_info=true  HTTP/1.1
    Accept: application/json
    Host: localhost:5984
    

    Response:

    HTTP/1.1 200 OK
    Cache-Control: must-revalidate
    Content-Length: 802
    Content-Type: application/json
    Date: Wed, 14 Aug 2013 11:40:55 GMT
    Server: CouchDB (Erlang/OTP)
    
    {
        "_id": "SpaghettiWithMeatballs",
        "_rev": "8-6f5ad8db0f34af24a6e0984cd1a6cfb9",
        "_revs_info": [
            {
                "rev": "8-6f5ad8db0f34af24a6e0984cd1a6cfb9",
                "status": "available"
            },
            {
                "rev": "7-77fba3a059497f51ec99b9b478b569d2",
                "status": "deleted"
            },
            {
                "rev": "6-136813b440a00a24834f5cb1ddf5b1f1",
                "status": "available"
            },
            {
                "rev": "5-fd96acb3256302bf0dd2f32713161f2a",
                "status": "missing"
            },
            {
                "rev": "4-874985bc28906155ba0e2e0538f67b05",
                "status": "missing"
            },
            {
                "rev": "3-0de77a37463bf391d14283e626831f2e",
                "status": "missing"
            },
            {
                "rev": "2-d795d1b924777732fdea76538c558b62",
                "status": "missing"
            },
            {
                "rev": "1-917fa2381192822767f010b95b45325b",
                "status": "missing"
            }
        ],
        "description": "An Italian-American dish that usually consists of spaghetti, tomato sauce and meatballs.",
        "ingredients": [
            "spaghetti",
            "tomato sauce",
            "meatballs"
        ],
        "name": "Spaghetti with meatballs"
    }
    

    The returned document contains _revs_info field with extended revision information, including the availability and status of each revision. This array field contains objects with following structure:

    • rev (string): Full revision string
    • status (string): Status of the revision. Maybe one of:
      • available: Revision is available for retrieving with rev query parameter
      • missing: Revision is not available
      • deleted: Revision belongs to deleted document

    Obtaining a Specific Revision¶

    To get a specific revision, use the rev argument to the request, and specify the full revision number. The specified revision of the document will be returned, including a _rev field specifying the revision that was requested.

    Request:

    GET /recipes/SpaghettiWithMeatballs?rev=6-136813b440a00a24834f5cb1ddf5b1f1  HTTP/1.1
    Accept: application/json
    Host: localhost:5984
    

    Response:

    HTTP/1.1 200 OK
    Cache-Control: must-revalidate
    Content-Length: 271
    Content-Type: application/json
    Date: Wed, 14 Aug 2013 11:40:55 GMT
    Server: CouchDB (Erlang/OTP)
    
    {
        "_id": "SpaghettiWithMeatballs",
        "_rev": "6-136813b440a00a24834f5cb1ddf5b1f1",
        "description": "An Italian-American dish that usually consists of spaghetti, tomato sauce and meatballs.",
        "ingredients": [
            "spaghetti",
            "tomato sauce",
            "meatballs"
        ],
        "name": "Spaghetti with meatballs"
    }
    

    Retrieving Deleted Documents¶

    CouchDB doesn’t actually deletes documents via DELETE /{db}/{docid}. Instead of this, it leaves tombstone with very basic information about document. If you just GET /{db}/{docid} CouchDB returns 404 Not Found response:

    Request:

    GET /recipes/FishStew  HTTP/1.1
    Accept: application/json
    Host: localhost:5984
    

    Response:

    HTTP/1.1 404 Object Not Found
    Cache-Control: must-revalidate
    Content-Length: 41
    Content-Type: application/json
    Date: Wed, 14 Aug 2013 12:23:27 GMT
    Server: CouchDB (Erlang/OTP)
    
    {
        "error": "not_found",
        "reason": "deleted"
    }
    

    However, you may retrieve document’s tombstone by using rev query parameter with GET /{db}/{docid} request:

    Request:

    GET /recipes/FishStew?rev=2-056f5f44046ecafc08a2bc2b9c229e20  HTTP/1.1
    Accept: application/json
    Host: localhost:5984
    

    Response:

    HTTP/1.1 200 OK
    Cache-Control: must-revalidate
    Content-Length: 79
    Content-Type: application/json
    Date: Wed, 14 Aug 2013 12:30:22 GMT
    ETag: "2-056f5f44046ecafc08a2bc2b9c229e20"
    Server: CouchDB (Erlang/OTP)
    
    {
        "_deleted": true,
        "_id": "FishStew",
        "_rev": "2-056f5f44046ecafc08a2bc2b9c229e20"
    }
    

    Updating an Existing Document¶

    To update an existing document you must specify the current revision number within the _rev parameter.

    Request:

    PUT /recipes/SpaghettiWithMeatballs HTTP/1.1
    Accept: application/json
    Content-Length: 258
    Content-Type: application/json
    Host: localhost:5984
    
    {
        "_rev": "1-917fa2381192822767f010b95b45325b",
        "description": "An Italian-American dish that usually consists of spaghetti, tomato sauce and meatballs.",
        "ingredients": [
            "spaghetti",
            "tomato sauce",
            "meatballs"
        ],
        "name": "Spaghetti with meatballs",
        "serving": "hot"
    }
    

    Alternatively, you can supply the current revision number in the If-Match HTTP header of the request:

    PUT /recipes/SpaghettiWithMeatballs HTTP/1.1
    Accept: application/json
    Content-Length: 258
    Content-Type: application/json
    If-Match: 1-917fa2381192822767f010b95b45325b
    Host: localhost:5984
    
    {
        "description": "An Italian-American dish that usually consists of spaghetti, tomato sauce and meatballs.",
        "ingredients": [
            "spaghetti",
            "tomato sauce",
            "meatballs"
        ],
        "name": "Spaghetti with meatballs",
        "serving": "hot"
    }
    

    Response:

    HTTP/1.1 201 Created
    Cache-Control: must-revalidate
    Content-Length: 85
    Content-Type: application/json
    Date: Wed, 14 Aug 2013 20:33:56 GMT
    ETag: "2-790895a73b63fb91dd863388398483dd"
    Location: http://localhost:5984/recipes/SpaghettiWithMeatballs
    Server: CouchDB (Erlang/OTP)
    
    {
        "id": "SpaghettiWithMeatballs",
        "ok": true,
        "rev": "2-790895a73b63fb91dd863388398483dd"
    }
    

    Copying from a Specific Revision¶

    To copy from a specific version, use the rev argument to the query string or If-Match:

    Request:

    COPY /recipes/SpaghettiWithMeatballs HTTP/1.1
    Accept: application/json
    Destination: http://localhost:5984/recipes_old/SpaghettiWithMeatballs_Original
    If-Match: 1-917fa2381192822767f010b95b45325b
    Host: localhost:5984

    Response:

    HTTP/1.1 201 Created
    Cache-Control: must-revalidate
    Content-Length: 93
    Content-Type: application/json
    Date: Wed, 14 Aug 2013 14:21:00 GMT
    ETag: "1-917fa2381192822767f010b95b45325b"
    Location: http://localhost:5984/recipes_old/SpaghettiWithMeatballs_Original
    Server: CouchDB (Erlang/OTP)
    
    {
        "id": "SpaghettiWithMeatballs_Original",
        "ok": true,
        "rev": "1-917fa2381192822767f010b95b45325b"
    }
    

    Copying to an Existing Document¶

    To copy to an existing document, you must specify the current revision string for the target document by appending the rev parameter to the Destination header string.

    Request:

    COPY /recipes/SpaghettiWithMeatballs?rev=8-6f5ad8db0f34af24a6e0984cd1a6cfb9 HTTP/1.1
    Accept: application/json
    Destination: http://localhost:5984/recipes_old/SpaghettiWithMeatballs_Original?rev=1-917fa2381192822767f010b95b45325b
    Host: localhost:5984

    Response:

    HTTP/1.1 201 Created
    Cache-Control: must-revalidate
    Content-Length: 93
    Content-Type: application/json
    Date: Wed, 14 Aug 2013 14:21:00 GMT
    ETag: "2-62e778c9ec09214dd685a981dcc24074""
    Location: http://localhost:5984/recipes_old/SpaghettiWithMeatballs_Original
    Server: CouchDB (Erlang/OTP)
    
    {
        "id": "SpaghettiWithMeatballs_Original",
        "ok": true,
        "rev": "2-62e778c9ec09214dd685a981dcc24074"
    }
    
    apache-couchdb-1.6.0/share/doc/build/html/api/document/index.html0000644000175000001440000002476212332105717024635 0ustar00djcusers00000000000000 10.4. Documents — Apache CouchDB 1.6 Documentation apache-couchdb-1.6.0/share/doc/build/html/api/document/attachments.html0000644000175000001440000011462412332105714026033 0ustar00djcusers00000000000000 10.4.2. /db/doc/attachment — Apache CouchDB 1.6 Documentation

    10.4.2. /db/doc/attachment¶

    HEAD /{db}/{docid}/{attname}¶

    Returns the HTTP headers containing a minimal amount of information about the specified attachment. The method supports the same query arguments as the GET /{db}/{docid}/{attname} method, but only the header information (including attachment size, encoding and the MD5 hash as an ETag), is returned.

    Parameters:
    • db – Database name
    • docid – Document ID
    • attname – Attachment name
    Request Headers:
     
    • If-Match – Document’s revision. Alternative to rev query parameter
    • If-None-Match – Attachment’s base64 encoded MD5 binary digest. Optional
    Query Parameters:
     
    • rev (string) – Document’s revision. Optional
    Response Headers:
     
    Status Codes:

    Request:

    HEAD /recipes/SpaghettiWithMeatballs/recipe.txt HTTP/1.1
    Host: localhost:5984
    

    Response:

    HTTP/1.1 200 OK
    Accept-Ranges: none
    Cache-Control: must-revalidate
    Content-Encoding: gzip
    Content-Length: 100
    Content-MD5: vVa/YgiE1+Gh0WfoFJAcSg==
    Content-Type: text/plain
    Date: Thu, 15 Aug 2013 12:42:42 GMT
    ETag: "vVa/YgiE1+Gh0WfoFJAcSg=="
    Server: CouchDB (Erlang/OTP)
    
    GET /{db}/{docid}/{attname}¶

    Returns the file attachment associated with the document. The raw data of the associated attachment is returned (just as if you were accessing a static file. The returned Content-Type will be the same as the content type set when the document attachment was submitted into the database.

    Parameters:
    • db – Database name
    • docid – Document ID
    • attname – Attachment name
    Request Headers:
     
    • If-Match – Document’s revision. Alternative to rev query parameter
    • If-None-Match – Attachment’s base64 encoded MD5 binary digest. Optional
    Query Parameters:
     
    • rev (string) – Document’s revision. Optional
    Response Headers:
     
    Response :

    Stored content

    Status Codes:
    PUT /{db}/{docid}/{attname}¶

    Uploads the supplied content as an attachment to the specified document. The attachment name provided must be a URL encoded string. You must also supply either the rev query argument or the If-Match HTTP header for validation, and the HTTP headers (to set the attachment content type).

    If case when uploading an attachment using an existing attachment name, CouchDB will update the corresponding stored content of the database. Since you must supply the revision information to add an attachment to the document, this serves as validation to update the existing attachment.

    Note

    Uploading an attachment updates the corresponding document revision. Revisions are tracked for the parent document, not individual attachments.

    Parameters:
    • db – Database name
    • docid – Document ID
    • attname – Attachment name
    Request Headers:
     
    • Content-Type – Attachment MIME type. Required
    • If-Match – Document revision. Alternative to rev query parameter
    Query Parameters:
     
    • rev (string) – Document revision. Required
    Response Headers:
     
    Response JSON Object:
     
    • id (string) – Document ID
    • ok (boolean) – Operation status
    • rev (string) – Revision MVCC token
    Status Codes:
    • 200 OK – Attachment successfully removed
    • 202 Accepted – Request was accepted, but changes are not yet stored on disk
    • 400 Bad Request – Invalid request body or parameters
    • 401 Unauthorized – Write privileges required
    • 404 Not Found – Specified database, document or attachment was not found
    • 409 Conflict – Document’s revision wasn’t specified or it’s not the latest

    Request:

    PUT /recipes/SpaghettiWithMeatballs/recipe.txt HTTP/1.1
    Accept: application/json
    Content-Length: 86
    Content-Type: text/plain
    Host: localhost:5984
    If-Match: 1-917fa2381192822767f010b95b45325b
    
    1. Cook spaghetti
    2. Cook meatballs
    3. Mix them
    4. Add tomato sauce
    5. ...
    6. PROFIT!
    

    Response:

    HTTP/1.1 201 Created
    Cache-Control: must-revalidate
    Content-Length: 85
    Content-Type: application/json
    Date: Thu, 15 Aug 2013 12:38:04 GMT
    ETag: "2-ce91aed0129be8f9b0f650a2edcfd0a4"
    Location: http://localhost:5984/recipes/SpaghettiWithMeatballs/recipe.txt
    Server: CouchDB (Erlang/OTP)
    
    {
        "id": "SpaghettiWithMeatballs",
        "ok": true,
        "rev": "2-ce91aed0129be8f9b0f650a2edcfd0a4"
    }
    
    DELETE /{db}/{docid}/{attname}¶

    Deletes the attachment attachment of the specified doc. You must supply the rev query parameter or If-Match with the current revision to delete the attachment.

    Note

    Deleting an attachment updates the corresponding document revision. Revisions are tracked for the parent document, not individual attachments.

    Parameters:
    • db – Database name
    • docid – Document ID
    Request Headers:
     
    • Accept
      • application/json
      • text/plain
    • If-Match – Document revision. Alternative to rev query parameter
    • X-Couch-Full-Commit – Overrides server’s commit policy. Possible values are: false and true. Optional
    Query Parameters:
     
    • rev (string) – Document revision. Required
    • batch (string) – Store changes in batch mode Possible values: ok. Optional
    Response Headers:
     
    • Content-Type
      • application/json
      • text/plain; charset=utf-8
    • ETag – Double quoted document’s new revision
    Response JSON Object:
     
    • id (string) – Document ID
    • ok (boolean) – Operation status
    • rev (string) – Revision MVCC token
    Status Codes:
    • 200 OK – Attachment successfully removed
    • 202 Accepted – Request was accepted, but changes are not yet stored on disk
    • 400 Bad Request – Invalid request body or parameters
    • 401 Unauthorized – Write privileges required
    • 404 Not Found – Specified database, document or attachment was not found
    • 409 Conflict – Document’s revision wasn’t specified or it’s not the latest

    Request:

    DELETE /recipes/SpaghettiWithMeatballs?rev=6-440b2dd39c20413045748b42c6aba6e2 HTTP/1.1
    Accept: application/json
    Host: localhost:5984
    

    Alternatively, instead of rev query parameter you may use If-Match header:

    DELETE /recipes/SpaghettiWithMeatballs HTTP/1.1
    Accept: application/json
    If-Match: 6-440b2dd39c20413045748b42c6aba6e2
    Host: localhost:5984
    

    Response:

    HTTP/1.1 200 OK
    Cache-Control: must-revalidate
    Content-Length: 85
    Content-Type: application/json
    Date: Wed, 14 Aug 2013 12:23:13 GMT
    ETag: "7-05185cf5fcdf4b6da360af939431d466"
    Server: CouchDB (Erlang/OTP)
    
    {
        "id": "SpaghettiWithMeatballs",
        "ok": true,
        "rev": "7-05185cf5fcdf4b6da360af939431d466"
    }
    

    HTTP Range Requests¶

    HTTP allows you to specify byte ranges for requests. This allows the implementation of resumable downloads and skippable audio and video streams alike. This is available for all attachments inside CouchDB.

    This is just a real quick run through how this looks under the hood. Usually, you will have larger binary files to serve from CouchDB, like MP3s and videos, but to make things a little more obvious, I use a text file here (Note that I use the application/octet-stream :header`Content-Type` instead of text/plain).

    shell> cat file.txt
    My hovercraft is full of eels!
    

    Now let’s store this text file as an attachment in CouchDB. First, we create a database:

    shell> curl -X PUT http://127.0.0.1:5984/test
    {"ok":true}
    

    Then we create a new document and the file attachment in one go:

    shell> curl -X PUT http://127.0.0.1:5984/test/doc/file.txt \
                -H "Content-Type: application/octet-stream" -d@file.txt
    {"ok":true,"id":"doc","rev":"1-287a28fa680ae0c7fb4729bf0c6e0cf2"}
    

    Now we can request the whole file easily:

    shell> curl -X GET http://127.0.0.1:5984/test/doc/file.txt
    My hovercraft is full of eels!
    

    But say we only want the first 13 bytes:

    shell> curl -X GET http://127.0.0.1:5984/test/doc/file.txt \
                -H "Range: bytes=0-12"
    My hovercraft
    

    HTTP supports many ways to specify single and even multiple byte ranges. Read all about it in RFC 2616.

    Note

    Databases that have been created with CouchDB 1.0.2 or earlier will support range requests in 1.6, but they are using a less-optimal algorithm. If you plan to make heavy use of this feature, make sure to compact your database with CouchDB 1.6 to take advantage of a better algorithm to find byte ranges.

    apache-couchdb-1.6.0/share/doc/build/html/cve/0000755000175000001440000000000012332106073021007 5ustar00djcusers00000000000000apache-couchdb-1.6.0/share/doc/build/html/cve/2012-5641.html0000644000175000001440000003227112332105746022671 0ustar00djcusers00000000000000 15.4. CVE-2012-5641: Information disclosure via unescaped backslashes in URLs on Windows — Apache CouchDB 1.6 Documentation

    15.4. CVE-2012-5641: Information disclosure via unescaped backslashes in URLs on Windows¶

    Date:14.01.2013
    Affected:All Windows-based releases of Apache CouchDB, up to and including 1.0.3, 1.1.1, and 1.2.0 are vulnerable.
    Severity:Moderate
    Vendor:The Apache Software Foundation

    15.4.1. Description¶

    A specially crafted request could be used to access content directly that would otherwise be protected by inbuilt CouchDB security mechanisms. This request could retrieve in binary form any CouchDB database, including the _users or _replication databases, or any other file that the user account used to run CouchDB might have read access to on the local filesystem. This exploit is due to a vulnerability in the included MochiWeb HTTP library.

    15.4.2. Mitigation¶

    Upgrade to a supported CouchDB release that includes this fix, such as:

    All listed releases have included a specific fix for the MochiWeb component.

    15.4.3. Work-Around¶

    Users may simply exclude any file-based web serving components directly within their configuration file, typically in local.ini. On a default CouchDB installation, this requires amending the httpd_global_handlers/favicon.ico and httpd_global_handlers/_utils lines within httpd_global_handlers:

    [httpd_global_handlers]
    favicon.ico = {couch_httpd_misc_handlers, handle_welcome_req, <<"Forbidden">>}
    _utils = {couch_httpd_misc_handlers, handle_welcome_req, <<"Forbidden">>}

    If additional handlers have been added, such as to support Adobe’s Flash crossdomain.xml files, these would also need to be excluded.

    15.4.4. Acknowledgement¶

    The issue was found and reported by Sriram Melkote to the upstream MochiWeb project.

    apache-couchdb-1.6.0/share/doc/build/html/cve/2012-5649.html0000644000175000001440000002552412332105746022704 0ustar00djcusers00000000000000 15.5. CVE-2012-5649: JSONP arbitrary code execution with Adobe Flash — Apache CouchDB 1.6 Documentation

    15.5. CVE-2012-5649: JSONP arbitrary code execution with Adobe Flash¶

    Date:14.01.2013
    Affected:Releases up to and including 1.0.3, 1.1.1, and 1.2.0 are vulnerable, if administrators have enabled JSONP.
    Severity:Moderate
    Vendor:The Apache Software Foundation

    15.5.1. Description¶

    A hand-crafted JSONP callback and response can be used to run arbitrary code inside client-side browsers via Adobe Flash.

    15.5.2. Mitigation¶

    Upgrade to a supported CouchDB release that includes this fix, such as:

    All listed releases have included a specific fix.

    15.5.3. Work-Around¶

    Disable JSONP or don’t enable it since it’s disabled by default.

    apache-couchdb-1.6.0/share/doc/build/html/cve/2012-5650.html0000644000175000001440000002730112332105746022667 0ustar00djcusers00000000000000 15.6. CVE-2012-5650: DOM based Cross-Site Scripting via Futon UI — Apache CouchDB 1.6 Documentation

    15.6. CVE-2012-5650: DOM based Cross-Site Scripting via Futon UI¶

    Date:14.01.2013
    Affected:Apache CouchDB releases up to and including 1.0.3, 1.1.1, and 1.2.0 are vulnerable.
    Severity:Moderate
    Vendor:The Apache Software Foundation

    15.6.1. Description¶

    Query parameters passed into the browser-based test suite are not sanitised, and can be used to load external resources. An attacker may execute JavaScript code in the browser, using the context of the remote user.

    15.6.2. Mitigation¶

    Upgrade to a supported CouchDB release that includes this fix, such as:

    All listed releases have included a specific fix.

    15.6.3. Work-Around¶

    Disable the Futon user interface completely, by adapting local.ini and restarting CouchDB:

    [httpd_global_handlers]
    _utils = {couch_httpd_misc_handlers, handle_welcome_req, <<"Forbidden">>}

    Or by removing the UI test suite components:

    • share/www/verify_install.html
    • share/www/couch_tests.html
    • share/www/custom_test.html

    15.6.4. Acknowledgement¶

    This vulnerability was discovered & reported to the Apache Software Foundation by Frederik Braun.

    apache-couchdb-1.6.0/share/doc/build/html/cve/index.html0000644000175000001440000002746612332105747023032 0ustar00djcusers00000000000000 15. Security Issues Information — Apache CouchDB 1.6 Documentation

    16. Reporting New Security Problems with Apache CouchDB¶

    The Apache Software Foundation takes a very active stance in eliminating security problems and denial of service attacks against Apache CouchDB.

    We strongly encourage folks to report such problems to our private security mailing list first, before disclosing them in a public forum.

    Please note that the security mailing list should only be used for reporting undisclosed security vulnerabilities in Apache CouchDB and managing the process of fixing such vulnerabilities. We cannot accept regular bug reports or other queries at this address. All mail sent to this address that does not relate to an undisclosed security problem in the Apache CouchDB source code will be ignored.

    If you need to report a bug that isn’t an undisclosed security vulnerability, please use the bug reporting page.

    Questions about:

    • How to configure CouchDB securely
    • If a vulnerability applies to your particular application
    • Obtaining further information on a published vulnerability
    • Availability of patches and/or new releases

    should be address to the users mailing list. Please see the mailing lists page for details of how to subscribe.

    The private security mailing address is: security@couchdb.apache.org

    Please read how the Apache Software Foundation handles security reports to know what to expect.

    Note that all networked servers are subject to denial of service attacks, and we cannot promise magic workarounds to generic problems (such as a client streaming lots of data to your server, or re-requesting the same URL repeatedly). In general our philosophy is to avoid any attacks which can cause the server to consume resources in a non-linear relationship to the size of inputs.

    apache-couchdb-1.6.0/share/doc/build/html/cve/2010-2234.html0000644000175000001440000002667312332105746022673 0ustar00djcusers00000000000000 15.2. CVE-2010-2234: Apache CouchDB Cross Site Request Forgery Attack — Apache CouchDB 1.6 Documentation

    15.2. CVE-2010-2234: Apache CouchDB Cross Site Request Forgery Attack¶

    Date:21.02.2010
    Affected:Apache CouchDB 0.8.0 to 0.11.1
    Severity:Important
    Vendor:The Apache Software Foundation

    15.2.1. Description¶

    Apache CouchDB versions prior to version 0.11.1 are vulnerable to Cross Site Request Forgery (CSRF) attacks.

    15.2.2. Mitigation¶

    All users should upgrade to CouchDB 0.11.2 or 1.0.1.

    Upgrades from the 0.11.x and 0.10.x series should be seamless.

    Users on earlier versions should consult with upgrade notes.

    15.2.3. Example¶

    A malicious website can POST arbitrary JavaScript code to well known CouchDB installation URLs (like http://localhost:5984/) and make the browser execute the injected JavaScript in the security context of CouchDB’s admin interface Futon.

    Unrelated, but in addition the JSONP API has been turned off by default to avoid potential information leakage.

    15.2.4. Credit¶

    This CSRF issue was discovered by a source that wishes to stay anonymous.

    apache-couchdb-1.6.0/share/doc/build/html/cve/2010-0009.html0000644000175000001440000002574612332105746022671 0ustar00djcusers00000000000000 15.1. CVE-2010-0009: Apache CouchDB Timing Attack Vulnerability — Apache CouchDB 1.6 Documentation

    15.1. CVE-2010-0009: Apache CouchDB Timing Attack Vulnerability¶

    Date:31.03.2010
    Affected:Apache CouchDB 0.8.0 to 0.10.1
    Severity:Important
    Vendor:The Apache Software Foundation

    15.1.1. Description¶

    Apache CouchDB versions prior to version 0.11.0 are vulnerable to timing attacks, also known as side-channel information leakage, due to using simple break-on-inequality string comparisons when verifying hashes and passwords.

    15.1.2. Mitigation¶

    All users should upgrade to CouchDB 0.11.0. Upgrades from the 0.10.x series should be seamless. Users on earlier versions should consult with upgrade notes.

    15.1.3. Example¶

    A canonical description of the attack can be found in http://codahale.com/a-lesson-in-timing-attacks/

    15.1.4. Credit¶

    This issue was discovered by Jason Davies of the Apache CouchDB development team.

    apache-couchdb-1.6.0/share/doc/build/html/cve/2010-3854.html0000644000175000001440000002630612332105746022675 0ustar00djcusers00000000000000 15.3. CVE-2010-3854: Apache CouchDB Cross Site Scripting Issue — Apache CouchDB 1.6 Documentation

    15.3. CVE-2010-3854: Apache CouchDB Cross Site Scripting Issue¶

    Date:28.01.2011
    Affected:Apache CouchDB 0.8.0 to 1.0.1
    Severity:Important
    Vendor:The Apache Software Foundation

    15.3.1. Description¶

    Apache CouchDB versions prior to version 1.0.2 are vulnerable to Cross Site Scripting (XSS) attacks.

    15.3.2. Mitigation¶

    All users should upgrade to CouchDB 1.0.2.

    Upgrades from the 0.11.x and 0.10.x series should be seamless.

    Users on earlier versions should consult with upgrade notes.

    15.3.3. Example¶

    Due to inadequate validation of request parameters and cookie data in Futon, CouchDB’s web-based administration UI, a malicious site can execute arbitrary code in the context of a user’s browsing session.

    15.3.4. Credit¶

    This XSS issue was discovered by a source that wishes to stay anonymous.

    apache-couchdb-1.6.0/share/doc/build/html/maintenance/0000755000175000001440000000000012332106073022514 5ustar00djcusers00000000000000apache-couchdb-1.6.0/share/doc/build/html/maintenance/compaction.html0000644000175000001440000005313412332105756025553 0ustar00djcusers00000000000000 5.1. Compaction — Apache CouchDB 1.6 Documentation

    5.1. Compaction¶

    The compaction operation is the way to reduce disk space usage by removing unused and old data from database or view index files. This operation is a very similar to the vacuum (SQLite ex.) available for other database management systems.

    During compaction of the target CouchDB creates new file with the .compact extension and transfers only actual data into. Because of this, CouchDB checks first for the available disk space - it should be twice greater than the compacted file’s data.

    When all actual data is successfully transferred to the compacted file CouchDB replaces the target with the compacted file.

    5.1.1. Database Compaction¶

    Database compaction compresses the database file by removing unused file sections created during updates. Old documents revisions are replaced with small amount of metadata called tombstone which are used for conflicts resolution during replication. The number of stored revisions (and their tombstones) can be configured by using the _revs_limit URL endpoint.

    Compaction is manually triggered operation per database and runs as a background task. To start it for specific database there is need to send HTTP POST /{db}/_compact sub-resource of the target database:

    curl -H "Content-Type: application/json" -X POST http://localhost:5984/my_db/_compact

    On success, HTTP status 202 Accepted is returned immediately:

    HTTP/1.1 202 Accepted
    Cache-Control: must-revalidate
    Content-Length: 12
    Content-Type: text/plain; charset=utf-8
    Date: Wed, 19 Jun 2013 09:43:52 GMT
    Server: CouchDB (Erlang/OTP)
    
    {"ok":true}
    

    Although the request body is not used you must still specify Content-Type header with application/json value for the request. If you don’t, you will be aware about with HTTP status 415 Unsupported Media Type response:

    HTTP/1.1 415 Unsupported Media Type
    Cache-Control: must-revalidate
    Content-Length: 78
    Content-Type: application/json
    Date: Wed, 19 Jun 2013 09:43:44 GMT
    Server: CouchDB (Erlang/OTP)
    
    {"error":"bad_content_type","reason":"Content-Type must be application/json"}
    

    When the compaction is successful started and running it is possible to get information about it via database information resource:

    curl http://localhost:5984/my_db
    HTTP/1.1 200 OK
    Cache-Control: must-revalidate
    Content-Length: 246
    Content-Type: application/json
    Date: Wed, 19 Jun 2013 16:51:20 GMT
    Server: CouchDB (Erlang/OTP)
    
    {
        "committed_update_seq": 76215,
        "compact_running": true,
        "data_size": 3787996,
        "db_name": "my_db",
        "disk_format_version": 6,
        "disk_size": 17703025,
        "doc_count": 5091,
        "doc_del_count": 0,
        "instance_start_time": "1371660751878859",
        "purge_seq": 0,
        "update_seq": 76215
    }
    

    Note that compaction_running field is true indicating that compaction is actually running. To track the compaction progress you may query the _active_tasks resource:

    curl http://localhost:5984/my_db
    HTTP/1.1 200 OK
    Cache-Control: must-revalidate
    Content-Length: 175
    Content-Type: application/json
    Date: Wed, 19 Jun 2013 16:27:23 GMT
    Server: CouchDB (Erlang/OTP)
    
    [
        {
            "changes_done": 44461,
            "database": "my_db",
            "pid": "<0.218.0>",
            "progress": 58,
            "started_on": 1371659228,
            "total_changes": 76215,
            "type": "database_compaction",
            "updated_on": 1371659241
        }
    ]
    

    5.1.2. Views Compaction¶

    Views are also need compaction like databases, unlike databases views are compacted by groups per design document. To start their compaction there is need to send HTTP POST /{db}/_compact/{ddoc} request:

    curl -H "Content-Type: application/json" -X POST http://localhost:5984/dbname/_compact/designname
    {"ok":true}
    

    This compacts the view index from the current version of the specified design document. The HTTP response code is 202 Accepted (like compaction for databases) and a compaction background task will be created.

    Views cleanup¶

    View indexes on disk are named after their MD5 hash of the view definition. When you change a view, old indexes remain on disk. To clean up all outdated view indexes (files named after the MD5 representation of views, that does not exist anymore) you can trigger a view cleanup:

    curl -H "Content-Type: application/json" -X POST http://localhost:5984/dbname/_view_cleanup
    {"ok":true}
    

    5.1.3. Automatic Compaction¶

    While both database and views compactions are required be manually triggered, it is also possible to configure automatic compaction, so that compaction of databases and views is automatically triggered based on various criteria. Automatic compaction is configured in CouchDB’s configuration files.

    The daemons/compaction_daemon is responsible for triggering the compaction. It is automatically started, but disabled by default. The criteria for triggering the compactions is configured in the compactions section.

    apache-couchdb-1.6.0/share/doc/build/html/maintenance/index.html0000644000175000001440000002463612332105756024533 0ustar00djcusers00000000000000 5. CouchDB Maintenance — Apache CouchDB 1.6 Documentation apache-couchdb-1.6.0/share/doc/build/html/maintenance/performance.html0000644000175000001440000006411512332105756025721 0ustar00djcusers00000000000000 5.2. Performance — Apache CouchDB 1.6 Documentation

    5.2. Performance¶

    With up to tens of thousands of documents you will generally find CouchDB to perform well no matter how you write your code. Once you start getting into the millions of documents you need to be a lot more careful.

    5.2.1. Disk I/O¶

    File Size¶

    The smaller your file size, the less I/O operations there will be, the more of the file can be cached by CouchDB and the operating system, the quicker it is to replicate, backup etc. Consequently you should carefully examine the data you are storing. For example it would be silly to use keys that are hundreds of characters long, but your program would be hard to maintain if you only used single character keys. Carefully consider data that is duplicated by putting it in views.

    Disk and File System Performance¶

    Using faster disks, striped RAID arrays and modern file systems can all speed up your CouchDB deployment. However, there is one option that can increase the responsiveness of your CouchDB server when disk performance is a bottleneck. From the Erlang documentation for the file module:

    On operating systems with thread support, it is possible to let file operations be performed in threads of their own, allowing other Erlang processes to continue executing in parallel with the file operations. See the command line flag +A in erl(1).

    Setting this argument to a number greater than zero can keep your CouchDB installation responsive even during periods of heavy disk utilization. The easiest way to set this option is through the ERL_FLAGS environment variable. For example, to give Erlang four threads with which to perform I/O operations add the following to (prefix)/etc/defaults/couchdb (or equivalent):

    export ERL_FLAGS="+A 4"

    5.2.2. System Resource Limits¶

    One of the problems that administrators run into as their deployments become large are resource limits imposed by the system and by the application configuration. Raising these limits can allow your deployment to grow beyond what the default configuration will support.

    CouchDB Configuration Options¶

    delayed_commits¶

    The delayed commits allows to achieve better write performance for some workloads while sacrificing a small amount of durability. The setting causes CouchDB to wait up to a full second before committing new data after an update. If the server crashes before the header is written then any writes since the last commit are lost. Keep this option enabled on your own risk.

    max_dbs_open¶

    In your configuration (local.ini or similar) familiarize yourself with the couchdb/max_dbs_open:

    [couchdb]
    max_dbs_open = 100
    

    This option places an upper bound on the number of databases that can be open at one time. CouchDB reference counts database accesses internally and will close idle databases when it must. Sometimes it is necessary to keep more than the default open at once, such as in deployments where many databases will be continuously replicating.

    Erlang¶

    Even if you’ve increased the maximum connections CouchDB will allow, the Erlang runtime system will not allow more than 1024 connections by default. Adding the following directive to (prefix)/etc/default/couchdb (or equivalent) will increase this limit (in this case to 4096):

    export ERL_MAX_PORTS=4096

    CouchDB versions up to 1.1.x also create Erlang Term Storage (ETS) tables for each replication. If you are using a version of CouchDB older than 1.2 and must support many replications, also set the ERL_MAX_ETS_TABLES variable. The default is approximately 1400 tables.

    Note that on Mac OS X, Erlang will not actually increase the file descriptor limit past 1024 (i.e. the system header–defined value of FD_SETSIZE). See this tip for a possible workaround and this thread for a deeper explanation.

    PAM and ulimit¶

    Finally, most *nix operating systems impose various resource limits on every process. If your system is set up to use the Pluggable Authentication Modules (PAM) system, increasing this limit is straightforward. For example, creating a file named /etc/security/limits.d/100-couchdb.conf with the following contents will ensure that CouchDB can open enough file descriptors to service your increased maximum open databases and Erlang ports:

    #<domain>    <type>    <item>    <value>
    couchdb      hard      nofile    4096
    couchdb      soft      nofile    4096

    If your system does not use PAM, a ulimit command is usually available for use in a custom script to launch CouchDB with increased resource limits. If necessary, feel free to increase this limits as long as your hardware can handle the load.

    5.2.3. Network¶

    There is latency overhead making and receiving each request/response. In general you should do your requests in batches. Most APIs have some mechanism to do batches, usually by supplying lists of documents or keys in the request body. Be careful what size you pick for the batches. The larger batch requires more time your client has to spend encoding the items into JSON and more time is spent decoding that number of responses. Do some benchmarking with your own configuration and typical data to find the sweet spot. It is likely to be between one and ten thousand documents.

    If you have a fast I/O system then you can also use concurrency - have multiple requests/responses at the same time. This mitigates the latency involved in assembling JSON, doing the networking and decoding JSON.

    As of CouchDB 1.1.0, users often report lower write performance of documents compared to older releases. The main reason is that this release ships with the more recent version of the HTTP server library Mochiweb, which by default sets the TCP socket option SO_NODELAY to false. This means that small data sent to the TCP socket, like the reply to a document write request (or reading a very small document), will not be sent immediately to the network - TCP will buffer it for a while hoping that it will be asked to send more data through the same socket and then send all the data at once for increased performance. This TCP buffering behaviour can be disabled via httpd/socket_options:

    [httpd]
    socket_options = [{nodelay, true}]
    

    See also

    Bulk load and store API.

    5.2.4. CouchDB¶

    DELETE operation¶

    When you DELETE a document the database will create a new revision which contains the _id and _rev fields as well as the _deleted flag. This revision will remain even after a database compaction so that the deletion can be replicated. Deleted documents, like non-deleted documents, can affect view build times, PUT and DELETE requests time and size of database on disk, since they increase the size of the B+Tree’s. You can see the number of deleted documents in database information. If your use case creates lots of deleted documents (for example, if you are storing short-term data like logfile entries, message queues, etc), you might want to periodically switch to a new database and delete the old one (once the entries in it have all expired).

    Document’s ID¶

    The db file size is derived from your document and view sizes but also on a multiple of your _id sizes. Not only is the _id present in the document, but it and parts of it are duplicated in the binary tree structure CouchDB uses to navigate the file to find the document in the first place. As a real world example for one user switching from 16 byte ids to 4 byte ids made a database go from 21GB to 4GB with 10 million documents (the raw JSON text when from 2.5GB to 2GB).

    Inserting with sequential (and at least sorted) ids is faster than random ids. Consequently you should consider generating ids yourself, allocating them sequentially and using an encoding scheme that consumes fewer bytes. For example, something that takes 16 hex digits to represent can be done in 4 base 62 digits (10 numerals, 26 lower case, 26 upper case).

    5.2.5. Views¶

    Views Generation¶

    Views with the Javascript query server are extremely slow to generate when there are a non-trivial number of documents to process. The generation process won’t even saturate a single CPU let alone your I/O. The cause is the latency involved in the CouchDB server and separate couchjs query server, dramatically indicating how important it is to take latency out of your implementation.

    You can let view access be “stale” but it isn’t practical to determine when that will occur giving you a quick response and when views will be updated which will take a long time. (A 10 million document database took about 10 minutes to load into CouchDB but about 4 hours to do view generation).

    View information isn’t replicated - it is rebuilt on each database so you can’t do the view generation on a separate sever.

    Builtin Reduce Functions¶

    If you’re using a very simple view function that only performs a sum or count reduction, you can call native Erlang implementations of them by simply writing _sum or _count in place of your function declaration. This will speed up things dramatically, as it cuts down on IO between CouchDB and the JavaScript query server. For example, as mentioned on the mailing list, the time for outputting an (already indexed and cached) view with about 78,000 items went down from 60 seconds to 4 seconds.

    Before:

    {
      "_id": "_design/foo",
      "views": {
        "bar": {
          "map": "function (doc) { emit(doc.author, 1); }",
          "reduce": "function (keys, values, rereduce) { return sum(values); }"
        }
      }
    }
    

    After:

    {
      "_id": "_design/foo",
      "views": {
        "bar": {
          "map": "function (doc) { emit(doc.author, 1); }",
          "reduce": "_sum"
        }
      }
    }
    
    apache-couchdb-1.6.0/share/doc/build/html/intro/0000755000175000001440000000000012332106073021365 5ustar00djcusers00000000000000apache-couchdb-1.6.0/share/doc/build/html/intro/tour.html0000644000175000001440000011475412332105754023265 0ustar00djcusers00000000000000 1.4. Getting Started — Apache CouchDB 1.6 Documentation

    1.4. Getting Started¶

    In this document, we’ll take a quick tour of CouchDB’s features, familiarizing ourselves with Futon, the built-in administration interface. We’ll create our first document and experiment with CouchDB views.

    1.4.1. All Systems Are Go!¶

    We’ll have a very quick look at CouchDB’s bare-bones Application Programming Interface (API) by using the command-line utility curl. Please note that this is not the only way of talking to CouchDB. We will show you plenty more throughout the rest of the documents. What’s interesting about curl is that it gives you control over raw HTTP requests, and you can see exactly what is going on “underneath the hood” of your database.

    Make sure CouchDB is still running, and then do:

    curl http://127.0.0.1:5984/

    This issues a GET request to your newly installed CouchDB instance.

    The reply should look something like:

    {
      "couchdb": "Welcome",
      "uuid": "85fb71bf700c17267fef77535820e371",
      "version": "1.4.0",
      "vendor": {
          "version": "1.4.0",
          "name": "The Apache Software Foundation"
      }
    }
    

    Not all that spectacular. CouchDB is saying “hello” with the running version number.

    Next, we can get a list of databases:

    curl -X GET http://127.0.0.1:5984/_all_dbs

    All we added to the previous request is the _all_dbs string.

    The response should look like:

    ["_replicator","_users"]
    

    Oh, that’s right, we didn’t create any databases yet! All we see is an empty list.

    Note

    The curl command issues GET requests by default. You can issue POST requests using curl -X POST. To make it easy to work with our terminal history, we usually use the -X option even when issuing GET requests. If we want to send a POST next time, all we have to change is the method.

    HTTP does a bit more under the hood than you can see in the examples here. If you’re interested in every last detail that goes over the wire, pass in the -v option (e.g., curl -vX GET), which will show you the server curl tries to connect to, the request headers it sends, and response headers it receives back. Great for debugging!

    Let’s create a database:

    curl -X PUT http://127.0.0.1:5984/baseball

    CouchDB will reply with:

    {"ok":true}
    

    Retrieving the list of databases again shows some useful results this time:

    curl -X GET http://127.0.0.1:5984/_all_dbs
    ["baseball"]
    

    Note

    We should mention JavaScript Object Notation (JSON) here, the data format CouchDB speaks. JSON is a lightweight data interchange format based on JavaScript syntax. Because JSON is natively compatible with JavaScript, your web browser is an ideal client for CouchDB.

    Brackets ([]) represent ordered lists, and curly braces ({}) represent key/value dictionaries. Keys must be strings, delimited by quotes ("), and values can be strings, numbers, booleans, lists, or key/value dictionaries. For a more detailed description of JSON, see Appendix E, JSON Primer.

    Let’s create another database:

    curl -X PUT http://127.0.0.1:5984/baseball

    CouchDB will reply with:

    {"error":"file_exists","reason":"The database could not be created,
    the file already exists."}
    

    We already have a database with that name, so CouchDB will respond with an error. Let’s try again with a different database name:

    curl -X PUT http://127.0.0.1:5984/plankton

    CouchDB will reply with:

    {"ok":true}
    

    Retrieving the list of databases yet again shows some useful results:

    curl -X GET http://127.0.0.1:5984/_all_dbs

    CouchDB will respond with:

    ["baseball", "plankton"]
    

    To round things off, let’s delete the second database:

    curl -X DELETE http://127.0.0.1:5984/plankton

    CouchDB will reply with:

    {"ok":true}
    

    The list of databases is now the same as it was before:

    curl -X GET http://127.0.0.1:5984/_all_dbs

    CouchDB will respond with:

    ["baseball"]
    

    For brevity, we’ll skip working with documents, as the next section covers a different and potentially easier way of working with CouchDB that should provide experience with this. As we work through the example, keep in mind that “under the hood” everything is being done by the application exactly as you have been doing here manually. Everything is done using GET, PUT, POST, and DELETE with a URI.

    1.4.2. Welcome to Futon¶

    After having seen CouchDB’s raw API, let’s get our feet wet by playing with Futon, the built-in administration interface. Futon provides full access to all of CouchDB’s features and makes it easy to work with some of the more complex ideas involved. With Futon we can create and destroy databases; view and edit documents; compose and run MapReduce views; and trigger replication between databases.

    To load Futon in your browser, visit:

    http://127.0.0.1:5984/_utils/

    If you’re running version 0.9 or later, you should see something similar to Figure 1. The Futon welcome screen. In later documents, we’ll focus on using CouchDB from server-side languages such as Ruby and Python. As such, this document is a great opportunity to showcase an example of natively serving up a dynamic web application using nothing more than CouchDB’s integrated web server, something you may wish to do with your own applications.

    The first thing we should do with a fresh installation of CouchDB is run the test suite to verify that everything is working properly. This assures us that any problems we may run into aren’t due to bothersome issues with our setup. By the same token, failures in the Futon test suite are a red flag, telling us to double-check our installation before attempting to use a potentially broken database server, saving us the confusion when nothing seems to be working quite like we expect!

    The Futon welcome screen

    Figure 1. The Futon welcome screen

    Some common network configurations cause the replication test to fail when accessed via the localhost address. You can fix this by accessing CouchDB via 127.0.0.1, e.g. http://127.0.0.1:5984/_utils/.

    Navigate to the test suite by clicking “Test Suite” on the Futon sidebar, then click “run all” at the top to kick things off. Figure 2. The Futon test suite running some tests shows the Futon test suite running some tests.

    The Futon test suite running some tests

    Figure 2. The Futon test suite running some tests

    Because the test suite is run from the browser, not only does it test that CouchDB is functioning properly, it also verifies that your browser’s connection to the database is properly configured, which can be very handy for diagnosing misbehaving proxies or other HTTP middleware.

    If the test suite has an inordinate number of failures, you’ll need to see the troubleshooting section in Appendix D, Installing from Source for the next steps to fix your installation.

    Now that the test suite is finished, you’ve verified that your CouchDB installation is successful and you’re ready to see what else Futon has to offer.

    1.4.3. Your First Database and Document¶

    Creating a database in Futon is simple. From the overview page, click “Create Database.” When asked for a name, enter hello-world and click the Create button.

    After your database has been created, Futon will display a list of all its documents. This list will start out empty (Figure 3. An empty database in Futon), so let’s create our first document. Click the “New Document” link and then the Create button in the pop up. Make sure to leave the document ID blank, and CouchDB will generate a UUID for you.

    For demoing purposes, having CouchDB assign a UUID is fine. When you write your first programs, we recommend assigning your own UUIDs. If your rely on the server to generate the UUID and you end up making two POST requests because the first POST request bombed out, you might generate two docs and never find out about the first one because only the second one will be reported back. Generating your own UUIDs makes sure that you’ll never end up with duplicate documents.

    Futon will display the newly created document, with its _id and _rev as the only fields. To create a new field, click the “Add Field” button. We’ll call the new field hello. Click the green check icon (or hit the Enter key) to finalize creating the hello field. Double-click the hello field’s value (default null) to edit it.

    You can experiment with other JSON values; e.g., [1, 2, "c"] or {"foo": "bar"}. Once you’ve entered your values into the document, make a note of its _rev attribute and click “Save Document.” The result should look like Figure 4. A “hello world” document in Futon.

    An empty database in Futon

    Figure 3. An empty database in Futon

    A "hello world" document in Futon

    Figure 4. A “hello world” document in Futon

    You’ll notice that the document’s _rev has changed. We’ll go into more detail about this in later documents, but for now, the important thing to note is that _rev acts like a safety feature when saving a document. As long as you and CouchDB agree on the most recent _rev of a document, you can successfully save your changes.

    Futon also provides a way to display the underlying JSON data, which can be more compact and easier to read, depending on what sort of data you are dealing with. To see the JSON version of our “hello world” document, click the Source tab. The result should look like Figure 5. The JSON source of a “hello world” document in Futon.

    The JSON source of a "hello world" document in Futon

    Figure 5. The JSON source of a “hello world” document in Futon

    1.4.4. Running a Query Using MapReduce¶

    Traditional relational databases allow you to run any queries you like as long as your data is structured correctly. In contrast, CouchDB uses predefined map and reduce functions in a style known as MapReduce. These functions provide great flexibility because they can adapt to variations in document structure, and indexes for each document can be computed independently and in parallel. The combination of a map and a reduce function is called a view in CouchDB terminology.

    For experienced relational database programmers, MapReduce can take some getting used to. Rather than declaring which rows from which tables to include in a result set and depending on the database to determine the most efficient way to run the query, reduce queries are based on simple range requests against the indexes generated by your map functions.

    Map functions are called once with each document as the argument. The function can choose to skip the document altogether or emit one or more view rows as key/value pairs. Map functions may not depend on any information outside of the document. This independence is what allows CouchDB views to be generated incrementally and in parallel.

    CouchDB views are stored as rows that are kept sorted by key. This makes retrieving data from a range of keys efficient even when there are thousands or millions of rows. When writing CouchDB map functions, your primary goal is to build an index that stores related data under nearby keys.

    Before we can run an example MapReduce view, we’ll need some data to run it on. We’ll create documents carrying the price of various supermarket items as found at different shops. Let’s create documents for apples, oranges, and bananas. (Allow CouchDB to generate the _id and _rev fields.) Use Futon to create documents that have a final JSON structure that looks like this:

    {
     "_id": "00a271787f89c0ef2e10e88a0c0001f4",
     "_rev": "1-2628a75ac8c3abfffc8f6e30c9949fd6",
     "item": "apple",
     "prices": {
         "Fresh Mart": 1.59,
         "Price Max": 5.99,
         "Apples Express": 0.79
     }
    }
    

    This document should look like Figure 6. An example document with apple prices in Futon when entered into Futon.

    An example document with apple prices in Futon

    Figure 6. An example document with apple prices in Futon

    OK, now that that’s done, let’s create the document for oranges:

    {
     "_id": "00a271787f89c0ef2e10e88a0c0003f0",
     "_rev": "1-e9680c5d9a688b4ff8dd68549e8e072c",
     "item": "orange",
     "prices": {
         "Fresh Mart": 1.99,
         "Price Max": 3.19,
         "Citrus Circus": 1.09
     }
    }
    

    And finally, the document for bananas:

    {
     "_id": "00a271787f89c0ef2e10e88a0c00048b",
     "_rev": "1-60e25d93dc12884676d037400a6fa189",
     "item": "banana",
     "prices": {
         "Fresh Mart": 1.99,
         "Price Max": 0.79,
         "Banana Montana": 4.22
     }
    }
    

    Imagine we’re catering a big luncheon, but the client is very price-sensitive. To find the lowest prices, we’re going to create our first view, which shows each fruit sorted by price. Click “hello-world” to return to the hello-world overview, and then from the “select view” menu choose “Temporary view…” to create a new view.

    A temporary view in Futon

    Figure 7. A temporary view in Futon

    Edit the map function, on the left, so that it looks like the following:

    function(doc) {
      var shop, price, value;
      if (doc.item && doc.prices) {
          for (shop in doc.prices) {
              price = doc.prices[shop];
              value = [doc.item, shop];
              emit(price, value);
          }
      }
    }
    

    This is a JavaScript function that CouchDB runs for each of our documents as it computes the view. We’ll leave the reduce function blank for the time being.

    Click “Run” and you should see result rows like in Figure 8. The results of running a view in Futon, with the various items sorted by price. This map function could be even more useful if it grouped the items by type so that all the prices for bananas were next to each other in the result set. CouchDB’s key sorting system allows any valid JSON object as a key. In this case, we’ll emit an array of [item, price] so that CouchDB groups by item type and price.

    The results of running a view in Futon

    Figure 8. The results of running a view in Futon

    Let’s modify the view function so that it looks like this:

    function(doc) {
      var shop, price, key;
      if (doc.item && doc.prices) {
          for (shop in doc.prices) {
              price = doc.prices[shop];
              key = [doc.item, price];
              emit(key, shop);
          }
      }
    }
    

    Here, we first check that the document has the fields we want to use. CouchDB recovers gracefully from a few isolated map function failures, but when a map function fails regularly (due to a missing required field or other JavaScript exception), CouchDB shuts off its indexing to prevent any further resource usage. For this reason, it’s important to check for the existence of any fields before you use them. In this case, our map function will skip the first “hello world” document we created without emitting any rows or encountering any errors. The result of this query should look like Figure 9. The results of running a view after grouping by item type and price.

    The results of running a view after grouping by item type and price

    Figure 9. The results of running a view after grouping by item type and price

    Once we know we’ve got a document with an item type and some prices, we iterate over the item’s prices and emit key/values pairs. The key is an array of the item and the price, and forms the basis for CouchDB’s sorted index. In this case, the value is the name of the shop where the item can be found for the listed price.

    View rows are sorted by their keys – in this example, first by item, then by price. This method of complex sorting is at the heart of creating useful indexes with CouchDB.

    MapReduce can be challenging, especially if you’ve spent years working with relational databases. The important things to keep in mind are that map functions give you an opportunity to sort your data using any key you choose, and that CouchDB’s design is focused on providing fast, efficient access to data within a range of keys.

    1.4.5. Triggering Replication¶

    Futon can trigger replication between two local databases, between a local and remote database, or even between two remote databases. We’ll show you how to replicate data from one local database to another, which is a simple way of making backups of your databases as we’re working through the examples.

    First we’ll need to create an empty database to be the target of replication. Return to the overview and create a database called hello-replication. Now click “Replicator” in the sidebar and choose hello-world as the source and hello-replication as the target. Click “Replicate” to replicate your database. The result should look something like Figure 10. Running database replication in Futon.

    Running database replication in Futon

    Figure 10. Running database replication in Futon

    Note

    For larger databases, replication can take much longer. It is important to leave the browser window open while replication is taking place. As an alternative, you can trigger replication via curl or some other HTTP client that can handle long-running connections. If your client closes the connection before replication finishes, you’ll have to retrigger it. Luckily, CouchDB’s replication can take over from where it left off instead of starting from scratch.

    1.4.6. Wrapping Up¶

    Now that you’ve seen most of Futon’s features, you’ll be prepared to dive in and inspect your data as we build our example application in the next few documents. Futon’s pure JavaScript approach to managing CouchDB shows how it’s possible to build a fully featured web application using only CouchDB’s HTTP API and integrated web server.

    But before we get there, we’ll have another look at CouchDB’s HTTP API – now with a magnifying glass. Let’s curl up on the couch and relax.

    apache-couchdb-1.6.0/share/doc/build/html/intro/security.html0000644000175000001440000013251012332105754024131 0ustar00djcusers00000000000000 1.6. Security — Apache CouchDB 1.6 Documentation

    1.6. Security¶

    In this document, we’ll look at the basic security mechanisms in CouchDB: the Admin Party, Basic Authentication, Cookie Authentication; how CouchDB handles users and protects their credentials.

    1.6.1. Authentication¶

    The Admin Party¶

    When you start out fresh, CouchDB allows any request to be made by anyone. Create a database? No problem, here you go. Delete some documents? Same deal. CouchDB calls this the Admin Party. Everybody has privileges to do anything. Neat.

    While it is incredibly easy to get started with CouchDB that way, it should be obvious that putting a default installation into the wild is adventurous. Any rogue client could come along and delete a database.

    A note of relief: by default, CouchDB will listen only on your loopback network interface (127.0.0.1 or localhost) and thus only you will be able to make requests to CouchDB, nobody else. But when you start to open up your CouchDB to the public (that is, by telling it to bind to your machine’s public IP address), you will want to think about restricting access so that the next bad guy doesn’t ruin your admin party.

    In our previous discussions, we dropped some keywords about how things without the Admin Party work. First, there’s admin itself, which implies some sort of super user. Then there are privileges. Let’s explore these terms a little more.

    CouchDB has the idea of an admin user (e.g. an administrator, a super user, or root) that is allowed to do anything to a CouchDB installation. By default, everybody is an admin. If you don’t like that, you can create specific admin users with a username and password as their credentials.

    CouchDB also defines a set of requests that only admin users are allowed to do. If you have defined one or more specific admin users, CouchDB will ask for identification for certain requests:

    Creating New Admin User¶

    Let’s do another walk through the API using curl to see how CouchDB behaves when you add admin users.

    > HOST="http://127.0.0.1:5984"
    > curl -X PUT $HOST/database
    {"ok":true}

    When starting out fresh, we can add a database. Nothing unexpected. Now let’s create an admin user. We’ll call her anna, and her password is secret. Note the double quotes in the following code; they are needed to denote a string value for the configuration API:

    > curl -X PUT $HOST/_config/admins/anna -d '"secret"'
    ""

    As per the _config API’s behavior, we’re getting the previous value for the config item we just wrote. Since our admin user didn’t exist, we get an empty string.

    Hashing Passwords¶

    Seeing the plain-text password is scary, isn’t it? No worries, CouchDB doesn’t show up the plain-text password anywhere. It gets hashed right away. The hash is that big, ugly, long string that starts out with -hashed-. How does that work?

    1. Creates a new 128-bit UUID. This is our salt.
    2. Creates a sha1 hash of the concatenation of the bytes of the plain-text password and the salt (sha1(password + salt)).
    3. Prefixes the result with -hashed- and appends ,salt.

    To compare a plain-text password during authentication with the stored hash, the same procedure is run and the resulting hash is compared to the stored hash. The probability of two identical hashes for different passwords is too insignificant to mention (c.f. Bruce Schneier). Should the stored hash fall into the hands of an attacker, it is, by current standards, way too inconvenient (i.e., it’d take a lot of money and time) to find the plain-text password from the hash.

    But what’s with the -hashed- prefix? When CouchDB starts up, it reads a set of .ini files with config settings. It loads these settings into an internal data store (not a database). The config API lets you read the current configuration as well as change it and create new entries. CouchDB is writing any changes back to the .ini files.

    The .ini files can also be edited by hand when CouchDB is not running. Instead of creating the admin user as we showed previously, you could have stopped CouchDB, opened your local.ini, added anna = secret to the admins, and restarted CouchDB. Upon reading the new line from local.ini, CouchDB would run the hashing algorithm and write back the hash to local.ini, replacing the plain-text password. To make sure CouchDB only hashes plain-text passwords and not an existing hash a second time, it prefixes the hash with -hashed-, to distinguish between plain-text passwords and hashed passwords. This means your plain-text password can’t start with the characters -hashed-, but that’s pretty unlikely to begin with.

    Note

    Since 1.3.0 release CouchDB uses -pbkdf2- prefix by default to sign about using PBKDF2 hashing algorithm instead of SHA1.

    Basic Authentication¶

    Now that we have defined an admin, CouchDB will not allow us to create new databases unless we give the correct admin user credentials. Let’s verify:

    > curl -X PUT $HOST/somedatabase
    {"error":"unauthorized","reason":"You are not a server admin."}

    That looks about right. Now we try again with the correct credentials:

    > HOST="http://anna:secret@127.0.0.1:5984"
    > curl -X PUT $HOST/somedatabase
    {"ok":true}

    If you have ever accessed a website or FTP server that was password-protected, the username:password@ URL variant should look familiar.

    If you are security conscious, the missing s in http:// will make you nervous. We’re sending our password to CouchDB in plain text. This is a bad thing, right? Yes, but consider our scenario: CouchDB listens on 127.0.0.1 on a development box that we’re the sole user of. Who could possibly sniff our password?

    If you are in a production environment, however, you need to reconsider. Will your CouchDB instance communicate over a public network? Even a LAN shared with other collocation customers is public. There are multiple ways to secure communication between you or your application and CouchDB that exceed the scope of this documentation. CouchDB as of version 1.1.0 comes with SSL built in.

    1.6.2. Authentication Database¶

    You may already note, that CouchDB administrators are defined within config file and you now wondering does regular users are also stored there. No, they don’t. CouchDB has special authentication database_users by default – that stores all registered users as JSON documents.

    CouchDB uses special database (called _users by default) to store information about registered users. This is a system database – this means that while it shares common database API, there are some special security-related constraints applied and used agreements on documents structure. So how authentication database is different from others?

    These draconian rules are reasonable: CouchDB cares about user’s personal information and doesn’t discloses it for everyone. Often, users documents are contains not only system information like login, password hash and roles, but also sensitive personal information like: real name, email, phone, special internal identifications and more - this is not right information that you want to share with the World.

    Users Documents¶

    Each CouchDB user is stored in document format. These documents are contains several mandatory fields, that CouchDB handles for correct authentication process:

    • _id (string): Document ID. Contains user’s login with special prefix Why org.couchdb.user: prefix?
    • derived_key (string): PBKDF2 key
    • name (string): User’s name aka login. Immutable e.g. you cannot rename existed user - you have to create new one
    • roles (array of string): List of user roles. CouchDB doesn’t provides any builtin roles, so you’re free to define your own depending on your needs. However, you cannot set system roles like _admin there. Also, only administrators may assign roles to users - by default all users have no roles
    • password_sha (string): Hashed password with salt. Used for simple password_scheme
    • password_scheme (string): Password hashing scheme. May be simple or pbkdf2
    • salt (string): Hash salt. Used for simple password_scheme
    • type (string): Document type. Constantly have value user

    Additionally, you may specify any custom fields that are relates to the target user. This is good place to store user’s private information because only the target user and CouchDB administrators may browse it.

    Why org.couchdb.user: prefix?¶

    The reason to have special prefix before user’s login name is to have namespaces which users are belongs to. This prefix is designed to prevent replication conflicts when you’ll try to merge two _user databases or more.

    For current CouchDB releases, all users are belongs to the same org.couchdb.user namespace and this cannot be changed, but we’d made such design decision for future releases.

    Creating New User¶

    Creating new user is a very trivial operation. You need just to send single PUT request with user’s data to CouchDB. Let’s create user with login jan and password apple:

    curl -X PUT http://localhost:5984/_users/org.couchdb.user:jan \
         -H "Accept: application/json" \
         -H "Content-Type: application/json" \
         -d '{"name": "jan", "password": "apple", "roles": [], "type": "user"}'

    This curl command will produce next HTTP request:

    PUT /_users/org.couchdb.user:jan HTTP/1.1
    Accept: application/json
    Content-Length: 62
    Content-Type: application/json
    Host: localhost:5984
    User-Agent: curl/7.31.0
    

    And CouchDB responds with:

    HTTP/1.1 201 Created
    Cache-Control: must-revalidate
    Content-Length: 83
    Content-Type: application/json
    Date: Fri, 27 Sep 2013 07:33:28 GMT
    ETag: "1-e0ebfb84005b920488fc7a8cc5470cc0"
    Location: http://localhost:5984/_users/org.couchdb.user:jan
    Server: CouchDB (Erlang OTP)
    
    {"ok":true,"id":"org.couchdb.user:jan","rev":"1-e0ebfb84005b920488fc7a8cc5470cc0"}
    

    Document successfully created what also means that user jan have created too! Let’s check is this true:

    curl -X POST http://localhost:5984/_session -d 'name=jan&password=apple'

    CouchDB should respond with:

    {"ok":true,"name":"jan","roles":[]}
    

    Which means that username was recognized and password’s hash matches with stored one. If we specify wrong login and/or password, CouchDB will notify us with the next error message:

    {"error":"unauthorized","reason":"Name or password is incorrect."}
    

    Password Changing¶

    This is quite common situation: user had forgot their password, it was leaked somehow (via copy-paste, screenshot, or by typing in wrong chat window) or something else. Let’s change password for our user jan.

    First of all, let’s define what is the password changing from the point of CouchDB and the authentication database. Since “users” are “documents”, this operation is nothing, but updating the document with special field password which contains the plain text password. Scared? No need to: the authentication database has special internal hook on document update which looks for this field and replaces it with the secured hash, depending on chosen password_scheme.

    Summarizing above, we need to get document content, add password field with new plain text password value and store JSON result to the authentication database.

    curl -X GET http://localhost:5984/_users/org.couchdb.user:jan
    {
      "_id": "org.couchdb.user:jan",
      "_rev": "1-e0ebfb84005b920488fc7a8cc5470cc0",
      "derived_key": "e579375db0e0c6a6fc79cd9e36a36859f71575c3",
      "iterations": 10,
      "name": "jan",
      "password_scheme": "pbkdf2",
      "roles": [],
      "salt": "1112283cf988a34f124200a050d308a1",
      "type": "user"
    }
    

    Here is our user’s document. We may strip hashes from stored document to reduce amount of posted data:

    curl -X PUT http://localhost:5984/_users/org.couchdb.user:jan \
         -H "Accept: application/json" \
         -H "Content-Type: application/json" \
         -H "If-Match: 1-e0ebfb84005b920488fc7a8cc5470cc0" \
         -d '{"name":"jan", "roles":[], "type":"user", "password":"orange"}'
    {"ok":true,"id":"org.couchdb.user:jan","rev":"2-ed293d3a0ae09f0c624f10538ef33c6f"}
    

    Updated! Now let’s check that password was really changed:

    curl -X POST http://localhost:5984/_session -d 'name=jan&password=apple'

    CouchDB should respond with:

    {"error":"unauthorized","reason":"Name or password is incorrect."}
    

    Looks like the password apple is wrong, what about orange?

    curl -X POST http://localhost:5984/_session -d 'name=jan&password=orange'

    CouchDB should respond with:

    {"ok":true,"name":"jan","roles":[]}
    

    Hooray! You may wonder why so complex: need to retrieve user’s document, add special field to it, post it back - where is one big button that changes the password without worry about document’s content? Actually, Futon has such at the right bottom corner if you have logged in - all implementation details are hidden from your sight.

    Note

    There is no password confirmation for API request: you should implement it on your application layer like Futon does.

    Users Public Information¶

    New in version 1.4.

    Sometimes users wants to share some information with the World. For instance, their contact email to let other users get in touch with them. To solve this problem, but still keep sensitive and private information secured there is special configuration option public_fields. In this options you may define comma separated list of users document fields that will be publicity available.

    Normally, if you request any user’s document and you’re not administrator or this document owner, CouchDB will respond with 404 Not Found:

    curl http://localhost:5984/_users/org.couchdb.user:robert
    {"error":"not_found","reason":"missing"}
    

    This response is constant for both cases when user exists or not exists - by security reasons.

    Now let’s share field name. First, setup the public_fields configuration option. Remember, that this action requires administrator’s privileges and the next command will ask for password for user admin, assuming that they are the server administrator:

    curl -X PUT http://localhost:5984/_config/couch_http_auth/public_fields \
         -H "Content-Type: application/json" \
         -d '"name"' \
         -u admin

    What have changed? Let’s check Robert’s document once again:

    curl http://localhost:5984/_users/org.couchdb.user:robert
    {"_id":"org.couchdb.user:robert","_rev":"6-869e2d3cbd8b081f9419f190438ecbe7","name":"robert"}
    

    Good news! Now we may read field name from every user’s document without need to be an administrator. That’s important note: don’t publish sensitive information, especially without user’s acknowledge - they may not like such actions from your side.

    apache-couchdb-1.6.0/share/doc/build/html/intro/api.html0000644000175000001440000015626712332105752023050 0ustar00djcusers00000000000000 1.5. The Core API — Apache CouchDB 1.6 Documentation

    1.5. The Core API¶

    This document explores the CouchDB in minute detail. It shows all the nitty-gritty and clever bits. We show you best practices and guide you around common pitfalls.

    We start out by revisiting the basic operations we ran in the previous document Getting Started, looking behind the scenes. We also show what Futon needs to do behind its user interface to give us the nice features we saw earlier.

    This document is both an introduction to the core CouchDB API as well as a reference. If you can’t remember how to run a particular request or why some parameters are needed, you can always come back here and look things up (we are probably the heaviest users of this document).

    While explaining the API bits and pieces, we sometimes need to take a larger detour to explain the reasoning for a particular request. This is a good opportunity for us to tell you why CouchDB works the way it does.

    The API can be subdivided into the following sections. We’ll explore them individually:

    1.5.1. Server¶

    This one is basic and simple. It can serve as a sanity check to see if CouchDB is running at all. It can also act as a safety guard for libraries that require a certain version of CouchDB. We’re using the curl utility again:

    curl http://127.0.0.1:5984/

    CouchDB replies, all excited to get going:

    {
      "couchdb": "Welcome",
      "uuid": "85fb71bf700c17267fef77535820e371",
      "vendor": {
          "name": "The Apache Software Foundation",
          "version": "1.5.0"
      },
      "version": "1.5.0"
    }
    

    You get back a JSON string, that, if parsed into a native object or data structure of your programming language, gives you access to the welcome string and version information.

    This is not terribly useful, but it illustrates nicely the way CouchDB behaves. You send an HTTP request and you receive a JSON string in the HTTP response as a result.

    1.5.2. Databases¶

    Now let’s do something a little more useful: create databases. For the strict, CouchDB is a database management system (DMS). That means it can hold multiple databases. A database is a bucket that holds “related data”. We’ll explore later what that means exactly. In practice, the terminology is overlapping – often people refer to a DMS as “a database” and also a database within the DMS as “a database.” We might follow that slight oddity, so don’t get confused by it. In general, it should be clear from the context if we are talking about the whole of CouchDB or a single database within CouchDB.

    Now let’s make one! We want to store our favorite music albums, and we creatively give our database the name albums. Note that we’re now using the -X option again to tell curl to send a PUT request instead of the default GET request:

    curl -X PUT http://127.0.0.1:5984/albums

    CouchDB replies:

    {"ok":true}
    

    That’s it. You created a database and CouchDB told you that all went well. What happens if you try to create a database that already exists? Let’s try to create that database again:

    curl -X PUT http://127.0.0.1:5984/albums

    CouchDB replies:

    {"error":"file_exists","reason":"The database could not be created, the file already exists."}
    

    We get back an error. This is pretty convenient. We also learn a little bit about how CouchDB works. CouchDB stores each database in a single file. Very simple.

    Let’s create another database, this time with curl’s -v (for “verbose”) option. The verbose option tells curl to show us not only the essentials – the HTTP response body – but all the underlying request and response details:

    curl -vX PUT http://127.0.0.1:5984/albums-backup

    curl elaborates:

    * About to connect() to 127.0.0.1 port 5984 (#0)
    *   Trying 127.0.0.1... connected
    * Connected to 127.0.0.1 (127.0.0.1) port 5984 (#0)
    > PUT /albums-backup HTTP/1.1
    > User-Agent: curl/7.16.3 (powerpc-apple-darwin9.0) libcurl/7.16.3 OpenSSL/0.9.7l zlib/1.2.3
    > Host: 127.0.0.1:5984
    > Accept: */*
    >
    < HTTP/1.1 201 Created
    < Server: CouchDB (Erlang/OTP)
    < Date: Sun, 05 Jul 2009 22:48:28 GMT
    < Content-Type: text/plain;charset=utf-8
    < Content-Length: 12
    < Cache-Control: must-revalidate
    <
    {"ok":true}
    * Connection #0 to host 127.0.0.1 left intact
    * Closing connection #0

    What a mouthful. Let’s step through this line by line to understand what’s going on and find out what’s important. Once you’ve seen this output a few times, you’ll be able to spot the important bits more easily.

    * About to connect() to 127.0.0.1 port 5984 (#0)

    This is curl telling us that it is going to establish a TCP connection to the CouchDB server we specified in our request URI. Not at all important, except when debugging networking issues.

    *   Trying 127.0.0.1... connected
    * Connected to 127.0.0.1 (127.0.0.1) port 5984 (#0)

    curl tells us it successfully connected to CouchDB. Again, not important if you aren’t trying to find problems with your network.

    The following lines are prefixed with > and < characters. The > means the line was sent to CouchDB verbatim (without the actual >). The < means the line was sent back to curl by CouchDB.

    > PUT /albums-backup HTTP/1.1

    This initiates an HTTP request. Its method is PUT, the URI is /albums-backup, and the HTTP version is HTTP/1.1. There is also HTTP/1.0, which is simpler in some cases, but for all practical reasons you should be using HTTP/1.1.

    Next, we see a number of request headers. These are used to provide additional details about the request to CouchDB.

    > User-Agent: curl/7.16.3 (powerpc-apple-darwin9.0) libcurl/7.16.3 OpenSSL/0.9.7l zlib/1.2.3

    The User-Agent header tells CouchDB which piece of client software is doing the HTTP request. We don’t learn anything new: it’s curl. This header is often useful in web development when there are known errors in client implementations that a server might want to prepare the response for. It also helps to determine which platform a user is on. This information can be used for technical and statistical reasons. For CouchDB, the User-Agent header is irrelevant.

    > Host: 127.0.0.1:5984

    The Host header is required by HTTP 1.1. It tells the server the hostname that came with the request.

    > Accept: */*

    The Accept header tells CouchDB that curl accepts any media type. We’ll look into why this is useful a little later.

    >

    An empty line denotes that the request headers are now finished and the rest of the request contains data we’re sending to the server. In this case, we’re not sending any data, so the rest of the curl output is dedicated to the HTTP response.

    < HTTP/1.1 201 Created

    The first line of CouchDB’s HTTP response includes the HTTP version information (again, to acknowledge that the requested version could be processed), an HTTP status code, and a status code message. Different requests trigger different response codes. There’s a whole range of them telling the client (curl in our case) what effect the request had on the server. Or, if an error occurred, what kind of error. RFC 2616 (the HTTP 1.1 specification) defines clear behavior for response codes. CouchDB fully follows the RFC.

    The 201 Created status code tells the client that the resource the request was made against was successfully created. No surprise here, but if you remember that we got an error message when we tried to create this database twice, you now know that this response could include a different response code. Acting upon responses based on response codes is a common practice. For example, all response codes of 400 Bad Request or larger tell you that some error occurred. If you want to shortcut your logic and immediately deal with the error, you could just check a >= 400 response code.

    < Server: CouchDB (Erlang/OTP)

    The Server header is good for diagnostics. It tells us which CouchDB version and which underlying Erlang version we are talking to. In general, you can ignore this header, but it is good to know it’s there if you need it.

    < Date: Sun, 05 Jul 2009 22:48:28 GMT

    The Date header tells you the time of the server. Since client and server time are not necessarily synchronized, this header is purely informational. You shouldn’t build any critical application logic on top of this!

    < Content-Type: text/plain;charset=utf-8

    The Content-Type header tells you which MIME type the HTTP response body is and its encoding. We already know CouchDB returns JSON strings. The appropriate Content-Type header is application/json. Why do we see text/plain? This is where pragmatism wins over purity. Sending an application/json Content-Type header will make a browser offer you the returned JSON for download instead of just displaying it. Since it is extremely useful to be able to test CouchDB from a browser, CouchDB sends a text/plain content type, so all browsers will display the JSON as text.

    Note

    There are some extensions that make your browser JSON-aware, but they are not installed by default. For more information, look at the popular JSONView extension, available for both Firefox and Chrome.

    Do you remember the Accept request header and how it is set to \*/\* -> */* to express interest in any MIME type? If you send Accept: application/json in your request, CouchDB knows that you can deal with a pure JSON response with the proper Content-Type header and will use it instead of text/plain.

    < Content-Length: 12

    The Content-Length header simply tells us how many bytes the response body has.

    < Cache-Control: must-revalidate

    This Cache-Control header tells you, or any proxy server between CouchDB and you, not to cache this response.

    <

    This empty line tells us we’re done with the response headers and what follows now is the response body.

    {"ok":true}
    

    We’ve seen this before.

    * Connection #0 to host 127.0.0.1 left intact
    * Closing connection #0

    The last two lines are curl telling us that it kept the TCP connection it opened in the beginning open for a moment, but then closed it after it received the entire response.

    Throughout the documents, we’ll show more requests with the -v option, but we’ll omit some of the headers we’ve seen here and include only those that are important for the particular request.

    Creating databases is all fine, but how do we get rid of one? Easy – just change the HTTP method:

    > curl -vX DELETE http://127.0.0.1:5984/albums-backup

    This deletes a CouchDB database. The request will remove the file that the database contents are stored in. There is no “Are you sure?” safety net or any “Empty the trash” magic you’ve got to do to delete a database. Use this command with care. Your data will be deleted without a chance to bring it back easily if you don’t have a backup copy.

    This section went knee-deep into HTTP and set the stage for discussing the rest of the core CouchDB API. Next stop: documents.

    1.5.3. Documents¶

    Documents are CouchDB’s central data structure. The idea behind a document is, unsurprisingly, that of a real-world document – a sheet of paper such as an invoice, a recipe, or a business card. We already learned that CouchDB uses the JSON format to store documents. Let’s see how this storing works at the lowest level.

    Each document in CouchDB has an ID. This ID is unique per database. You are free to choose any string to be the ID, but for best results we recommend a UUID (or GUID), i.e., a Universally (or Globally) Unique IDentifier. UUIDs are random numbers that have such a low collision probability that everybody can make thousands of UUIDs a minute for millions of years without ever creating a duplicate. This is a great way to ensure two independent people cannot create two different documents with the same ID. Why should you care what somebody else is doing? For one, that somebody else could be you at a later time or on a different computer; secondly, CouchDB replication lets you share documents with others and using UUIDs ensures that it all works. But more on that later; let’s make some documents:

    curl -X PUT http://127.0.0.1:5984/albums/6e1295ed6c29495e54cc05947f18c8af -d '{"title":"There is Nothing Left to Lose","artist":"Foo Fighters"}'

    CouchDB replies:

    {"ok":true,"id":"6e1295ed6c29495e54cc05947f18c8af","rev":"1-2902191555"}
    

    The curl command appears complex, but let’s break it down. First, -X PUT tells curl to make a PUT request. It is followed by the URL that specifies your CouchDB IP address and port. The resource part of the URL /albums/6e1295ed6c29495e54cc05947f18c8af specifies the location of a document inside our albums database. The wild collection of numbers and characters is a UUID. This UUID is your document’s ID. Finally, the -d flag tells curl to use the following string as the body for the PUT request. The string is a simple JSON structure including title and artist attributes with their respective values.

    Note

    If you don’t have a UUID handy, you can ask CouchDB to give you one (in fact, that is what we did just now without showing you). Simply send a GET /_uuids request:

    curl -X GET http://127.0.0.1:5984/_uuids

    CouchDB replies:

    {"uuids":["6e1295ed6c29495e54cc05947f18c8af"]}
    

    VoilĆ , a UUID. If you need more than one, you can pass in the ?count=10 HTTP parameter to request 10 UUIDs, or really, any number you need.

    To double-check that CouchDB isn’t lying about having saved your document (it usually doesn’t), try to retrieve it by sending a GET request:

    curl -X GET http://127.0.0.1:5984/albums/6e1295ed6c29495e54cc05947f18c8af

    We hope you see a pattern here. Everything in CouchDB has an address, a URI, and you use the different HTTP methods to operate on these URIs.

    CouchDB replies:

    {"_id":"6e1295ed6c29495e54cc05947f18c8af","_rev":"1-2902191555","title":"There is Nothing Left to Lose","artist":"Foo Fighters"}
    

    This looks a lot like the document you asked CouchDB to save, which is good. But you should notice that CouchDB added two fields to your JSON structure. The first is _id, which holds the UUID we asked CouchDB to save our document under. We always know the ID of a document if it is included, which is very convenient.

    The second field is _rev. It stands for revision.

    Revisions¶

    If you want to change a document in CouchDB, you don’t tell it to go and find a field in a specific document and insert a new value. Instead, you load the full document out of CouchDB, make your changes in the JSON structure (or object, when you are doing actual programming), and save the entire new revision (or version) of that document back into CouchDB. Each revision is identified by a new _rev value.

    If you want to update or delete a document, CouchDB expects you to include the _rev field of the revision you wish to change. When CouchDB accepts the change, it will generate a new revision number. This mechanism ensures that, in case somebody else made a change without you knowing before you got to request the document update, CouchDB will not accept your update because you are likely to overwrite data you didn’t know existed. Or simplified: whoever saves a change to a document first, wins. Let’s see what happens if we don’t provide a _rev field (which is equivalent to providing a outdated value):

    curl -X PUT http://127.0.0.1:5984/albums/6e1295ed6c29495e54cc05947f18c8af \
         -d '{"title":"There is Nothing Left to Lose","artist":"Foo Fighters","year":"1997"}'

    CouchDB replies:

    {"error":"conflict","reason":"Document update conflict."}
    

    If you see this, add the latest revision number of your document to the JSON structure:

    curl -X PUT http://127.0.0.1:5984/albums/6e1295ed6c29495e54cc05947f18c8af \
         -d '{"_rev":"1-2902191555","title":"There is Nothing Left to Lose","artist":"Foo Fighters","year":"1997"}'

    Now you see why it was handy that CouchDB returned that _rev when we made the initial request. CouchDB replies:

    {"ok":true,"id":"6e1295ed6c29495e54cc05947f18c8af","rev":"2-8aff9ee9d06671fa89c99d20a4b3ae"}
    

    CouchDB accepted your write and also generated a new revision number. The revision number is the MD5 hash of the transport representation of a document with an N- prefix denoting the number of times a document got updated. This is useful for replication. See Replication and conflict model for more information.

    There are multiple reasons why CouchDB uses this revision system, which is also called Multi-Version Concurrency Control (MVCC). They all work hand-in-hand, and this is a good opportunity to explain some of them.

    One of the aspects of the HTTP protocol that CouchDB uses is that it is stateless. What does that mean? When talking to CouchDB you need to make requests. Making a request includes opening a network connection to CouchDB, exchanging bytes, and closing the connection. This is done every time you make a request. Other protocols allow you to open a connection, exchange bytes, keep the connection open, exchange more bytes later – maybe depending on the bytes you exchanged at the beginning – and eventually close the connection. Holding a connection open for later use requires the server to do extra work. One common pattern is that for the lifetime of a connection, the client has a consistent and static view of the data on the server. Managing huge amounts of parallel connections is a significant amount of work. HTTP connections are usually short-lived, and making the same guarantees is a lot easier. As a result, CouchDB can handle many more concurrent connections.

    Another reason CouchDB uses MVCC is that this model is simpler conceptually and, as a consequence, easier to program. CouchDB uses less code to make this work, and less code is always good because the ratio of defects per lines of code is static.

    The revision system also has positive effects on replication and storage mechanisms, but we’ll explore these later in the documents.

    Warning

    The terms version and revision might sound familiar (if you are programming without version control, stop reading this guide right now and start learning one of the popular systems). Using new versions for document changes works a lot like version control, but there’s an important difference: CouchDB does not guarantee that older versions are kept around.

    Documents in Detail¶

    Now let’s have a closer look at our document creation requests with the curl -v flag that was helpful when we explored the database API earlier. This is also a good opportunity to create more documents that we can use in later examples.

    We’ll add some more of our favorite music albums. Get a fresh UUID from the /_uuids resource. If you don’t remember how that works, you can look it up a few pages back.

    curl -vX PUT http://127.0.0.1:5984/albums/70b50bfa0a4b3aed1f8aff9e92dc16a0 \
         -d '{"title":"Blackened Sky","artist":"Biffy Clyro","year":2002}'

    Note

    By the way, if you happen to know more information about your favorite albums, don’t hesitate to add more properties. And don’t worry about not knowing all the information for all the albums. CouchDB’s schema-less documents can contain whatever you know. After all, you should relax and not worry about data.

    Now with the -v option, CouchDB’s reply (with only the important bits shown) looks like this:

    > PUT /albums/70b50bfa0a4b3aed1f8aff9e92dc16a0 HTTP/1.1
    >
    < HTTP/1.1 201 Created
    < Location: http://127.0.0.1:5984/albums/70b50bfa0a4b3aed1f8aff9e92dc16a0
    < ETag: "1-e89c99d29d06671fa0a4b3ae8aff9e"
    <
    {"ok":true,"id":"70b50bfa0a4b3aed1f8aff9e92dc16a0","rev":"1-e89c99d29d06671fa0a4b3ae8aff9e"}

    We’re getting back the 201 Created HTTP status code in the response headers, as we saw earlier when we created a database. The Location header gives us a full URL to our newly created document. And there’s a new header. An ETag in HTTP-speak identifies a specific version of a resource. In this case, it identifies a specific version (the first one) of our new document. Sound familiar? Yes, conceptually, an ETag is the same as a CouchDB document revision number, and it shouldn’t come as a surprise that CouchDB uses revision numbers for ETags. ETags are useful for caching infrastructures.

    Attachments¶

    CouchDB documents can have attachments just like an email message can have attachments. An attachment is identified by a name and includes its MIME type (or Content-Type) and the number of bytes the attachment contains. Attachments can be any data. It is easiest to think about attachments as files attached to a document. These files can be text, images, Word documents, music, or movie files. Let’s make one.

    Attachments get their own URL where you can upload data. Say we want to add the album artwork to the 6e1295ed6c29495e54cc05947f18c8af document (“There is Nothing Left to Lose”), and let’s also say the artwork is in a file artwork.jpg in the current directory:

    curl -vX PUT http://127.0.0.1:5984/albums/6e1295ed6c29495e54cc05947f18c8af/artwork.jpg?rev=2-2739352689 \
         --data-binary @artwork.jpg -H "Content-Type:image/jpg"

    Note

    The --data-binary @ option tells curl to read a file’s contents into the HTTP request body. We’re using the -H option to tell CouchDB that we’re uploading a JPEG file. CouchDB will keep this information around and will send the appropriate header when requesting this attachment; in case of an image like this, a browser will render the image instead of offering you the data for download. This will come in handy later. Note that you need to provide the current revision number of the document you’re attaching the artwork to, just as if you would update the document. Because, after all, attaching some data is changing the document.

    You should now see your artwork image if you point your browser to http://127.0.0.1:5984/albums/6e1295ed6c29495e54cc05947f18c8af/artwork.jpg

    If you request the document again, you’ll see a new member:

    curl http://127.0.0.1:5984/albums/6e1295ed6c29495e54cc05947f18c8af

    CouchDB replies:

    {
      "_id": "6e1295ed6c29495e54cc05947f18c8af",
      "_rev": "3-131533518",
      "title": "There is Nothing Left to Lose",
      "artist": "Foo Fighters",
      "year": "1997",
      "_attachments": {
          "artwork.jpg": {
              "stub": true,
              "content_type": "image/jpg",
              "length": 52450
          }
      }
    }
    

    _attachments is a list of keys and values where the values are JSON objects containing the attachment metadata. stub=true tells us that this entry is just the metadata. If we use the ?attachments=true HTTP option when requesting this document, we’d get a Base64 encoded string containing the attachment data.

    We’ll have a look at more document request options later as we explore more features of CouchDB, such as replication, which is the next topic.

    1.5.4. Replication¶

    CouchDB replication is a mechanism to synchronize databases. Much like rsync synchronizes two directories locally or over a network, replication synchronizes two databases locally or remotely.

    In a simple POST request, you tell CouchDB the source and the target of a replication and CouchDB will figure out which documents and new document revisions are on source that are not yet on target, and will proceed to move the missing documents and revisions over.

    We’ll take an in-depth look at replication in the document Introduction Into Replications; in this document, we’ll just show you how to use it.

    First, we’ll create a target database. Note that CouchDB won’t automatically create a target database for you, and will return a replication failure if the target doesn’t exist (likewise for the source, but that mistake isn’t as easy to make):

    curl -X PUT http://127.0.0.1:5984/albums-replica

    Now we can use the database albums-replica as a replication target:

    curl -vX POST http://127.0.0.1:5984/_replicate \
         -d '{"source":"albums","target":"albums-replica"}' \
         -H "Content-Type: application/json"

    Note

    CouchDB supports the option "create_target":true placed in the JSON POSTed to the _replicate URL. It implicitly creates the target database if it doesn’t exist.

    CouchDB replies (this time we formatted the output so you can read it more easily):

    {
      "history": [
        {
          "start_last_seq": 0,
          "missing_found": 2,
          "docs_read": 2,
          "end_last_seq": 5,
          "missing_checked": 2,
          "docs_written": 2,
          "doc_write_failures": 0,
          "end_time": "Sat, 11 Jul 2009 17:36:21 GMT",
          "start_time": "Sat, 11 Jul 2009 17:36:20 GMT"
        }
      ],
      "source_last_seq": 5,
      "session_id": "924e75e914392343de89c99d29d06671",
      "ok": true
    }
    

    CouchDB maintains a session history of replications. The response for a replication request contains the history entry for this replication session. It is also worth noting that the request for replication will stay open until replication closes. If you have a lot of documents, it’ll take a while until they are all replicated and you won’t get back the replication response until all documents are replicated. It is important to note that replication replicates the database only as it was at the point in time when replication was started. So, any additions, modifications, or deletions subsequent to the start of replication will not be replicated.

    We’ll punt on the details again – the "ok": true at the end tells us all went well. If you now have a look at the albums-replica database, you should see all the documents that you created in the albums database. Neat, eh?

    What you just did is called local replication in CouchDB terms. You created a local copy of a database. This is useful for backups or to keep snapshots of a specific state of your data around for later. You might want to do this if you are developing your applications but want to be able to roll back to a stable version of your code and data.

    There are more types of replication useful in other situations. The source and target members of our replication request are actually links (like in HTML) and so far we’ve seen links relative to the server we’re working on (hence local). You can also specify a remote database as the target:

    curl -vX POST http://127.0.0.1:5984/_replicate \
         -d '{"source":"albums","target":"http://example.org:5984/albums-replica"}' \
         -H "Content-Type:application/json"

    Using a local source and a remote target database is called push replication. We’re pushing changes to a remote server.

    Note

    Since we don’t have a second CouchDB server around just yet, we’ll just use the absolute address of our single server, but you should be able to infer from this that you can put any remote server in there.

    This is great for sharing local changes with remote servers or buddies next door.

    You can also use a remote source and a local target to do a pull replication. This is great for getting the latest changes from a server that is used by others:

    curl -vX POST http://127.0.0.1:5984/_replicate \
         -d '{"source":"http://example.org:5984/albums-replica","target":"albums"}' \
         -H "Content-Type:application/json"

    Finally, you can run remote replication, which is mostly useful for management operations:

    curl -vX POST http://127.0.0.1:5984/_replicate \
         -d '{"source":"http://example.org:5984/albums","target":"http://example.org:5984/albums-replica"}' \
         -H"Content-Type: application/json"

    Note

    CouchDB and REST

    CouchDB prides itself on having a RESTful API, but these replication requests don’t look very RESTy to the trained eye. What’s up with that? While CouchDB’s core database, document, and attachment API are RESTful, not all of CouchDB’s API is. The replication API is one example. There are more, as we’ll see later in the documents.

    Why are there RESTful and non-RESTful APIs mixed up here? Have the developers been too lazy to go REST all the way? Remember, REST is an architectural style that lends itself to certain architectures (such as the CouchDB document API). But it is not a one-size-fits-all. Triggering an event like replication does not make a whole lot of sense in the REST world. It is more like a traditional remote procedure call. And there is nothing wrong with this.

    We very much believe in the “use the right tool for the job” philosophy, and REST does not fit every job. For support, we refer to Leonard Richardson and Sam Ruby who wrote RESTful Web Services (O’Reilly), as they share our view.

    1.5.5. Wrapping Up¶

    This is still not the full CouchDB API, but we discussed the essentials in great detail. We’re going to fill in the blanks as we go. For now, we believe you’re ready to start building CouchDB applications.

    apache-couchdb-1.6.0/share/doc/build/html/intro/index.html0000644000175000001440000003663312332105753023401 0ustar00djcusers00000000000000 1. Introduction — Apache CouchDB 1.6 Documentation

    1. Introduction¶

    CouchDB is a database that completely embraces the web. Store your data with JSON documents. Access your documents with your web browser, via HTTP. Query, combine, and transform your documents with JavaScript. CouchDB works well with modern web and mobile apps. You can even serve web apps directly out of CouchDB. And you can distribute your data, or your apps, efficiently using CouchDB’s incremental replication. CouchDB supports master-master setups with automatic conflict detection.

    CouchDB comes with a suite of features, such as on-the-fly document transformation and real-time change notifications, that makes web app development a breeze. It even comes with an easy to use web administration console. You guessed it, served up directly out of CouchDB! We care a lot about distributed scaling. CouchDB is highly available and partition tolerant, but is also eventually consistent. And we care a lot about your data. CouchDB has a fault-tolerant storage engine that puts the safety of your data first.

    In this section you’ll learn about every basic bit of CouchDB, see upon what conceptions and technologies it built and walk through short tutorial that teach how to use CouchDB.

    Previous topic

    Apache CouchDBā„¢ 1.6.0 Documentation

    Next topic

    1.1. Technical Overview

    Utilities

    More Help

    apache-couchdb-1.6.0/share/doc/build/html/intro/overview.html0000644000175000001440000007324312332105753024136 0ustar00djcusers00000000000000 1.1. Technical Overview — Apache CouchDB 1.6 Documentation

    1.1. Technical Overview¶

    1.1.1. Document Storage¶

    A CouchDB server hosts named databases, which store documents. Each document is uniquely named in the database, and CouchDB provides a RESTful HTTP API for reading and updating (add, edit, delete) database documents.

    Documents are the primary unit of data in CouchDB and consist of any number of fields and attachments. Documents also include metadata that’s maintained by the database system. Document fields are uniquely named and contain values of varying types (text, number, boolean, lists, etc), and there is no set limit to text size or element count.

    The CouchDB document update model is lockless and optimistic. Document edits are made by client applications loading documents, applying changes, and saving them back to the database. If another client editing the same document saves their changes first, the client gets an edit conflict error on save. To resolve the update conflict, the latest document version can be opened, the edits reapplied and the update tried again.

    Document updates (add, edit, delete) are all or nothing, either succeeding entirely or failing completely. The database never contains partially saved or edited documents.

    1.1.2. ACID Properties¶

    The CouchDB file layout and commitment system features all Atomic Consistent Isolated Durable (ACID) properties. On-disk, CouchDB never overwrites committed data or associated structures, ensuring the database file is always in a consistent state. This is a “crash-only” design where the CouchDB server does not go through a shut down process, it’s simply terminated.

    Document updates (add, edit, delete) are serialized, except for binary blobs which are written concurrently. Database readers are never locked out and never have to wait on writers or other readers. Any number of clients can be reading documents without being locked out or interrupted by concurrent updates, even on the same document. CouchDB read operations use a Multi-Version Concurrency Control (MVCC) model where each client sees a consistent snapshot of the database from the beginning to the end of the read operation.

    Documents are indexed in B-trees by their name (DocID) and a Sequence ID. Each update to a database instance generates a new sequential number. Sequence IDs are used later for incrementally finding changes in a database. These B-tree indexes are updated simultaneously when documents are saved or deleted. The index updates always occur at the end of the file (append-only updates).

    Documents have the advantage of data being already conveniently packaged for storage rather than split out across numerous tables and rows in most database systems. When documents are committed to disk, the document fields and metadata are packed into buffers, sequentially one document after another (helpful later for efficient building of views).

    When CouchDB documents are updated, all data and associated indexes are flushed to disk and the transactional commit always leaves the database in a completely consistent state. Commits occur in two steps:

    1. All document data and associated index updates are synchronously flushed to disk.
    2. The updated database header is written in two consecutive, identical chunks to make up the first 4k of the file, and then synchronously flushed to disk.

    In the event of an OS crash or power failure during step 1, the partially flushed updates are simply forgotten on restart. If such a crash happens during step 2 (committing the header), a surviving copy of the previous identical headers will remain, ensuring coherency of all previously committed data. Excepting the header area, consistency checks or fix-ups after a crash or a power failure are never necessary.

    1.1.3. Compaction¶

    Wasted space is recovered by occasional compaction. On schedule, or when the database file exceeds a certain amount of wasted space, the compaction process clones all the active data to a new file and then discards the old file. The database remains completely online the entire time and all updates and reads are allowed to complete successfully. The old database file is deleted only when all the data has been copied and all users transitioned to the new file.

    1.1.4. Views¶

    ACID properties only deal with storage and updates, but we also need the ability to show our data in interesting and useful ways. Unlike SQL databases where data must be carefully decomposed into tables, data in CouchDB is stored in semi-structured documents. CouchDB documents are flexible and each has its own implicit structure, which alleviates the most difficult problems and pitfalls of bi-directionally replicating table schemas and their contained data.

    But beyond acting as a fancy file server, a simple document model for data storage and sharing is too simple to build real applications on – it simply doesn’t do enough of the things we want and expect. We want to slice and dice and see our data in many different ways. What is needed is a way to filter, organize and report on data that hasn’t been decomposed into tables.

    See also

    Guide to Views

    View Model¶

    To address this problem of adding structure back to unstructured and semi-structured data, CouchDB integrates a view model. Views are the method of aggregating and reporting on the documents in a database, and are built on-demand to aggregate, join and report on database documents. Because views are built dynamically and don’t affect the underlying document, you can have as many different view representations of the same data as you like.

    View definitions are strictly virtual and only display the documents from the current database instance, making them separate from the data they display and compatible with replication. CouchDB views are defined inside special design documents and can replicate across database instances like regular documents, so that not only data replicates in CouchDB, but entire application designs replicate too.

    Javascript View Functions¶

    Views are defined using Javascript functions acting as the map part in a map-reduce system. A view function takes a CouchDB document as an argument and then does whatever computation it needs to do to determine the data that is to be made available through the view, if any. It can add multiple rows to the view based on a single document, or it can add no rows at all.

    See also

    View functions

    View Indexes¶

    Views are a dynamic representation of the actual document contents of a database, and CouchDB makes it easy to create useful views of data. But generating a view of a database with hundreds of thousands or millions of documents is time and resource consuming, it’s not something the system should do from scratch each time.

    To keep view querying fast, the view engine maintains indexes of its views, and incrementally updates them to reflect changes in the database. CouchDB’s core design is largely optimized around the need for efficient, incremental creation of views and their indexes.

    Views and their functions are defined inside special “design” documents, and a design document may contain any number of uniquely named view functions. When a user opens a view and its index is automatically updated, all the views in the same design document are indexed as a single group.

    The view builder uses the database sequence ID to determine if the view group is fully up-to-date with the database. If not, the view engine examines the all database documents (in packed sequential order) changed since the last refresh. Documents are read in the order they occur in the disk file, reducing the frequency and cost of disk head seeks.

    The views can be read and queried simultaneously while also being refreshed. If a client is slowly streaming out the contents of a large view, the same view can be concurrently opened and refreshed for another client without blocking the first client. This is true for any number of simultaneous client readers, who can read and query the view while the index is concurrently being refreshed for other clients without causing problems for the readers.

    As documents are processed by the view engine through your ‘map’ and ‘reduce’ functions, their previous row values are removed from the view indexes, if they exist. If the document is selected by a view function, the function results are inserted into the view as a new row.

    When view index changes are written to disk, the updates are always appended at the end of the file, serving to both reduce disk head seek times during disk commits and to ensure crashes and power failures can not cause corruption of indexes. If a crash occurs while updating a view index, the incomplete index updates are simply lost and rebuilt incrementally from its previously committed state.

    1.1.5. Security and Validation¶

    To protect who can read and update documents, CouchDB has a simple reader access and update validation model that can be extended to implement custom security models.

    See also

    /db/_security

    Administrator Access¶

    CouchDB database instances have administrator accounts. Administrator accounts can create other administrator accounts and update design documents. Design documents are special documents containing view definitions and other special formulas, as well as regular fields and blobs.

    Update Validation¶

    As documents written to disk, they can be validated dynamically by javascript functions for both security and data validation. When the document passes all the formula validation criteria, the update is allowed to continue. If the validation fails, the update is aborted and the user client gets an error response.

    Both the user’s credentials and the updated document are given as inputs to the validation formula, and can be used to implement custom security models by validating a user’s permissions to update a document.

    A basic “author only” update document model is trivial to implement, where document updates are validated to check if the user is listed in an “author” field in the existing document. More dynamic models are also possible, like checking a separate user account profile for permission settings.

    The update validations are enforced for both live usage and replicated updates, ensuring security and data validation in a shared, distributed system.

    1.1.6. Distributed Updates and Replication¶

    CouchDB is a peer-based distributed database system. It allows users and servers to access and update the same shared data while disconnected. Those changes can then be replicated bi-directionally later.

    The CouchDB document storage, view and security models are designed to work together to make true bi-directional replication efficient and reliable. Both documents and designs can replicate, allowing full database applications (including application design, logic and data) to be replicated to laptops for offline use, or replicated to servers in remote offices where slow or unreliable connections make sharing data difficult.

    The replication process is incremental. At the database level, replication only examines documents updated since the last replication. Then for each updated document, only fields and blobs that have changed are replicated across the network. If replication fails at any step, due to network problems or crash for example, the next replication restarts at the same document where it left off.

    Partial replicas can be created and maintained. Replication can be filtered by a javascript function, so that only particular documents or those meeting specific criteria are replicated. This can allow users to take subsets of a large shared database application offline for their own use, while maintaining normal interaction with the application and that subset of data.

    Conflicts¶

    Conflict detection and management are key issues for any distributed edit system. The CouchDB storage system treats edit conflicts as a common state, not an exceptional one. The conflict handling model is simple and “non-destructive” while preserving single document semantics and allowing for decentralized conflict resolution.

    CouchDB allows for any number of conflicting documents to exist simultaneously in the database, with each database instance deterministically deciding which document is the “winner” and which are conflicts. Only the winning document can appear in views, while “losing” conflicts are still accessible and remain in the database until deleted or purged during database compaction. Because conflict documents are still regular documents, they replicate just like regular documents and are subject to the same security and validation rules.

    When distributed edit conflicts occur, every database replica sees the same winning revision and each has the opportunity to resolve the conflict. Resolving conflicts can be done manually or, depending on the nature of the data and the conflict, by automated agents. The system makes decentralized conflict resolution possible while maintaining single document database semantics.

    Conflict management continues to work even if multiple disconnected users or agents attempt to resolve the same conflicts. If resolved conflicts result in more conflicts, the system accommodates them in the same manner, determining the same winner on each machine and maintaining single document semantics.

    Applications¶

    Using just the basic replication model, many traditionally single server database applications can be made distributed with almost no extra work. CouchDB replication is designed to be immediately useful for basic database applications, while also being extendable for more elaborate and full-featured uses.

    With very little database work, it is possible to build a distributed document management application with granular security and full revision histories. Updates to documents can be implemented to exploit incremental field and blob replication, where replicated updates are nearly as efficient and incremental as the actual edit differences (“diffs”).

    The CouchDB replication model can be modified for other distributed update models. If the storage engine is enhanced to allow multi-document update transactions, it is possible to perform Subversion-like “all or nothing” atomic commits when replicating with an upstream server, such that any single document conflict or validation failure will cause the entire update to fail. Like Subversion, conflicts would be resolved by doing a “pull” replication to force the conflicts locally, then merging and re-replicating to the upstream server.

    1.1.7. Implementation¶

    CouchDB is built on the Erlang OTP platform, a functional, concurrent programming language and development platform. Erlang was developed for real-time telecom applications with an extreme emphasis on reliability and availability.

    Both in syntax and semantics, Erlang is very different from conventional programming languages like C or Java. Erlang uses lightweight “processes” and message passing for concurrency, it has no shared state threading and all data is immutable. The robust, concurrent nature of Erlang is ideal for a database server.

    CouchDB is designed for lock-free concurrency, in the conceptual model and the actual Erlang implementation. Reducing bottlenecks and avoiding locks keeps the entire system working predictably under heavy loads. CouchDB can accommodate many clients replicating changes, opening and updating documents, and querying views whose indexes are simultaneously being refreshed for other clients, without needing locks.

    For higher availability and more concurrent users, CouchDB is designed for “shared nothing” clustering. In a “shared nothing” cluster, each machine is independent and replicates data with its cluster mates, allowing individual server failures with zero downtime. And because consistency scans and fix-ups aren’t needed on restart, if the entire cluster fails – due to a power outage in a datacenter, for example – the entire CouchDB distributed system becomes immediately available after a restart.

    CouchDB is built from the start with a consistent vision of a distributed document database system. Unlike cumbersome attempts to bolt distributed features on top of the same legacy models and databases, it is the result of careful ground-up design, engineering and integration. The document, view, security and replication models, the special purpose query language, the efficient and robust disk layout and the concurrent and reliable nature of the Erlang platform are all carefully integrated for a reliable and efficient system.

    apache-couchdb-1.6.0/share/doc/build/html/intro/curl.html0000644000175000001440000003435212332105752023232 0ustar00djcusers00000000000000 1.8. cURL: Your Command Line Friend — Apache CouchDB 1.6 Documentation

    1.8. cURL: Your Command Line Friend¶

    The curl utility is a command line tool available on Unix, Linux, Mac OS X and Windows and many other platforms. curl provides easy access to the HTTP protocol (among others) directly from the command-line and is therefore an ideal way of interacting with CouchDB over the HTTP REST API.

    For simple GET requests you can supply the URL of the request. For example, to get the database information:

    shell> curl http://127.0.0.1:5984
    

    This returns the database information (formatted in the output below for clarity):

    {
        "couchdb": "Welcome",
        "uuid": "85fb71bf700c17267fef77535820e371",
        "vendor": {
            "name": "The Apache Software Foundation",
            "version": "1.4.0"
        },
        "version": "1.4.0"
    }
    

    Note

    For some URLs, especially those that include special characters such as ampersand, exclamation mark, or question mark, you should quote the URL you are specifying on the command line. For example:

    shell> curl 'http://couchdb:5984/_uuids?count=5'
    

    You can explicitly set the HTTP command using the -X command line option. For example, when creating a database, you set the name of the database in the URL you send using a PUT request:

    shell> curl -X PUT http://127.0.0.1:5984/demo
    {"ok":true}
    

    But to obtain the database information you use a GET request (with the return information formatted for clarity):

    shell> curl -X GET http://127.0.0.1:5984/demo
    {
       "compact_running" : false,
       "doc_count" : 0,
       "db_name" : "demo",
       "purge_seq" : 0,
       "committed_update_seq" : 0,
       "doc_del_count" : 0,
       "disk_format_version" : 5,
       "update_seq" : 0,
       "instance_start_time" : "1306421773496000",
       "disk_size" : 79
    }
    

    For certain operations, you must specify the content type of request, which you do by specifying the Content-Type header using the -H command-line option:

    shell> curl -H 'Content-Type: application/json' http://127.0.0.1:5984/_uuids
    

    You can also submit ‘payload’ data, that is, data in the body of the HTTP request using the -d option. This is useful if you need to submit JSON structures, for example document data, as part of the request. For example, to submit a simple document to the demo database:

    shell> curl -H 'Content-Type: application/json' \
                -X POST http://127.0.0.1:5984/demo \
                -d '{"company": "Example, Inc."}'
    {"ok":true,"id":"8843faaf0b831d364278331bc3001bd8",
     "rev":"1-33b9fbce46930280dab37d672bbc8bb9"}
    

    In the above example, the argument after the -d option is the JSON of the document we want to submit.

    The document can be accessed by using the automatically generated document ID that was returned:

    shell> curl -X GET http://127.0.0.1:5984/demo/8843faaf0b831d364278331bc3001bd8
    {"_id":"8843faaf0b831d364278331bc3001bd8",
     "_rev":"1-33b9fbce46930280dab37d672bbc8bb9",
     "company":"Example, Inc."}
    

    The API samples in the API Basics show the HTTP command, URL and any payload information that needs to be submitted (and the expected return value). All of these examples can be reproduced using curl with the command-line examples shown above.

    Previous topic

    1.7. Futon: Web GUI Administration Panel

    Next topic

    2. Installation

    Utilities

    More Help

    apache-couchdb-1.6.0/share/doc/build/html/intro/why.html0000644000175000001440000006165412332105755023104 0ustar00djcusers00000000000000 1.2. Why CouchDB? — Apache CouchDB 1.6 Documentation

    1.2. Why CouchDB?¶

    Apache CouchDB is one of a new breed of database management systems. This topic explains why there’s a need for new systems as well as the motivations behind building CouchDB.

    As CouchDB developers, we’re naturally very excited to be using CouchDB. In this topic we’ll share with you the reasons for our enthusiasm. We’ll show you how CouchDB’s schema-free document model is a better fit for common applications, how the built-in query engine is a powerful way to use and process your data, and how CouchDB’s design lends itself to modularization and scalability.

    1.2.1. Relax¶

    If there’s one word to describe CouchDB, it is relax. It is the byline to CouchDB’s official logo and when you start CouchDB, you see:

    Apache CouchDB has started. Time to relax.

    Why is relaxation important? Developer productivity roughly doubled in the last five years. The chief reason for the boost is more powerful tools that are easier to use. Take Ruby on Rails as an example. It is an infinitely complex framework, but it’s easy to get started with. Rails is a success story because of the core design focus on ease of use. This is one reason why CouchDB is relaxing: learning CouchDB and understanding its core concepts should feel natural to most everybody who has been doing any work on the Web. And it is still pretty easy to explain to non-technical people.

    Getting out of the way when creative people try to build specialized solutions is in itself a core feature and one thing that CouchDB aims to get right. We found existing tools too cumbersome to work with during development or in production, and decided to focus on making CouchDB easy, even a pleasure, to use.

    Another area of relaxation for CouchDB users is the production setting. If you have a live running application, CouchDB again goes out of its way to avoid troubling you. Its internal architecture is fault-tolerant, and failures occur in a controlled environment and are dealt with gracefully. Single problems do not cascade through an entire server system but stay isolated in single requests.

    CouchDB’s core concepts are simple (yet powerful) and well understood. Operations teams (if you have a team; otherwise, that’s you) do not have to fear random behavior and untraceable errors. If anything should go wrong, you can easily find out what the problem is, but these situations are rare.

    CouchDB is also designed to handle varying traffic gracefully. For instance, if a website is experiencing a sudden spike in traffic, CouchDB will generally absorb a lot of concurrent requests without falling over. It may take a little more time for each request, but they all get answered. When the spike is over, CouchDB will work with regular speed again.

    The third area of relaxation is growing and shrinking the underlying hardware of your application. This is commonly referred to as scaling. CouchDB enforces a set of limits on the programmer. On first look, CouchDB might seem inflexible, but some features are left out by design for the simple reason that if CouchDB supported them, it would allow a programmer to create applications that couldn’t deal with scaling up or down.

    Note

    CouchDB doesn’t let you do things that would get you in trouble later on. This sometimes means you’ll have to unlearn best practices you might have picked up in your current or past work.

    1.2.2. A Different Way to Model Your Data¶

    We believe that CouchDB will drastically change the way you build document-based applications. CouchDB combines an intuitive document storage model with a powerful query engine in a way that’s so simple you’ll probably be tempted to ask, ā€œWhy has no one built something like this before?ā€

    Django may be built for the Web, but CouchDB is built of the Web. I’ve never seen software that so completely embraces the philosophies behind HTTP. CouchDB makes Django look old-school in the same way that Django makes ASP look outdated.

    —Jacob Kaplan-Moss, Django developer

    CouchDB’s design borrows heavily from web architecture and the concepts of resources, methods, and representations. It augments this with powerful ways to query, map, combine, and filter your data. Add fault tolerance, extreme scalability, and incremental replication, and CouchDB defines a sweet spot for document databases.

    1.2.3. A Better Fit for Common Applications¶

    We write software to improve our lives and the lives of others. Usually this involves taking some mundane information such as contacts, invoices, or receipts and manipulating it using a computer application. CouchDB is a great fit for common applications like this because it embraces the natural idea of evolving, self-contained documents as the very core of its data model.

    Self-Contained Data¶

    An invoice contains all the pertinent information about a single transaction the seller, the buyer, the date, and a list of the items or services sold. As shown in Figure 1. Self-contained documents, there’s no abstract reference on this piece of paper that points to some other piece of paper with the seller’s name and address. Accountants appreciate the simplicity of having everything in one place. And given the choice, programmers appreciate that, too.

    Self-contained documents

    Figure 1. Self-contained documents

    Yet using references is exactly how we model our data in a relational database! Each invoice is stored in a table as a row that refers to other rows in other tables one row for seller information, one for the buyer, one row for each item billed, and more rows still to describe the item details, manufacturer details, and so on and so forth.

    This isn’t meant as a detraction of the relational model, which is widely applicable and extremely useful for a number of reasons. Hopefully, though, it illustrates the point that sometimes your model may not ā€œfitā€ your data in the way it occurs in the real world.

    Let’s take a look at the humble contact database to illustrate a different way of modeling data, one that more closely ā€œfitsā€ its real-world counterpart – a pile of business cards. Much like our invoice example, a business card contains all the important information, right there on the cardstock. We call this ā€œself-containedā€ data, and it’s an important concept in understanding document databases like CouchDB.

    Syntax and Semantics¶

    Most business cards contain roughly the same information – someone’s identity, an affiliation, and some contact information. While the exact form of this information can vary between business cards, the general information being conveyed remains the same, and we’re easily able to recognize it as a business card. In this sense, we can describe a business card as a real-world document.

    Jan’s business card might contain a phone number but no fax number, whereas J. Chris’s business card contains both a phone and a fax number. Jan does not have to make his lack of a fax machine explicit by writing something as ridiculous as ā€œFax: Noneā€ on the business card. Instead, simply omitting a fax number implies that he doesn’t have one.

    We can see that real-world documents of the same type, such as business cards, tend to be very similar in semantics – the sort of information they carry, but can vary hugely in syntax, or how that information is structured. As human beings, we’re naturally comfortable dealing with this kind of variation.

    While a traditional relational database requires you to model your data up front, CouchDB’s schema-free design unburdens you with a powerful way to aggregate your data after the fact, just like we do with real-world documents. We’ll look in depth at how to design applications with this underlying storage paradigm.

    1.2.4. Building Blocks for Larger Systems¶

    CouchDB is a storage system useful on its own. You can build many applications with the tools CouchDB gives you. But CouchDB is designed with a bigger picture in mind. Its components can be used as building blocks that solve storage problems in slightly different ways for larger and more complex systems.

    Whether you need a system that’s crazy fast but isn’t too concerned with reliability (think logging), or one that guarantees storage in two or more physically separated locations for reliability, but you’re willing to take a performance hit, CouchDB lets you build these systems.

    There are a multitude of knobs you could turn to make a system work better in one area, but you’ll affect another area when doing so. One example would be the CAP theorem discussed in Eventual Consistency. To give you an idea of other things that affect storage systems, see Figure 2 and Figure 3.

    By reducing latency for a given system (and that is true not only for storage systems), you affect concurrency and throughput capabilities.

    Throughput, latency, or concurrency

    Figure 2. Throughput, latency, or concurrency

    Scaling: read requests, write requests, or data

    Figure 3. Scaling: read requests, write requests, or data

    When you want to scale out, there are three distinct issues to deal with: scaling read requests, write requests, and data. Orthogonal to all three and to the items shown in Figure 2 and Figure 3 are many more attributes like reliability or simplicity. You can draw many of these graphs that show how different features or attributes pull into different directions and thus shape the system they describe.

    CouchDB is very flexible and gives you enough building blocks to create a system shaped to suit your exact problem. That’s not saying that CouchDB can be bent to solve any problem – CouchDB is no silver bullet – but in the area of data storage, it can get you a long way.

    1.2.5. CouchDB Replication¶

    CouchDB replication is one of these building blocks. Its fundamental function is to synchronize two or more CouchDB databases. This may sound simple, but the simplicity is key to allowing replication to solve a number of problems: reliably synchronize databases between multiple machines for redundant data storage; distribute data to a cluster of CouchDB instances that share a subset of the total number of requests that hit the cluster (load balancing); and distribute data between physically distant locations, such as one office in New York and another in Tokyo.

    CouchDB replication uses the same REST API all clients use. HTTP is ubiquitous and well understood. Replication works incrementally; that is, if during replication anything goes wrong, like dropping your network connection, it will pick up where it left off the next time it runs. It also only transfers data that is needed to synchronize databases.

    A core assumption CouchDB makes is that things can go wrong, like network connection troubles, and it is designed for graceful error recovery instead of assuming all will be well. The replication system’s incremental design shows that best. The ideas behind ā€œthings that can go wrongā€ are embodied in the Fallacies of Distributed Computing:

    • The network is reliable.
    • Latency is zero.
    • Bandwidth is infinite.
    • The network is secure.
    • Topology doesn’t change.
    • There is one administrator.
    • Transport cost is zero.
    • The network is homogeneous.

    Existing tools often try to hide the fact that there is a network and that any or all of the previous conditions don’t exist for a particular system. This usually results in fatal error scenarios when something finally goes wrong. In contrast, CouchDB doesn’t try to hide the network; it just handles errors gracefully and lets you know when actions on your end are required.

    1.2.6. Local Data Is King¶

    CouchDB takes quite a few lessons learned from the Web, but there is one thing that could be improved about the Web: latency. Whenever you have to wait for an application to respond or a website to render, you almost always wait for a network connection that isn’t as fast as you want it at that point. Waiting a few seconds instead of milliseconds greatly affects user experience and thus user satisfaction.

    What do you do when you are offline? This happens all the time – your DSL or cable provider has issues, or your iPhone, G1, or Blackberry has no bars, and no connectivity means no way to get to your data.

    CouchDB can solve this scenario as well, and this is where scaling is important again. This time it is scaling down. Imagine CouchDB installed on phones and other mobile devices that can synchronize data with centrally hosted CouchDBs when they are on a network. The synchronization is not bound by user interface constraints like subsecond response times. It is easier to tune for high bandwidth and higher latency than for low bandwidth and very low latency. Mobile applications can then use the local CouchDB to fetch data, and since no remote networking is required for that, latency is low by default.

    Can you really use CouchDB on a phone? Erlang, CouchDB’s implementation language has been designed to run on embedded devices magnitudes smaller and less powerful than today’s phones.

    1.2.7. Wrapping Up¶

    The next document Eventual Consistency further explores the distributed nature of CouchDB. We should have given you enough bites to whet your interest. Let’s go!

    apache-couchdb-1.6.0/share/doc/build/html/intro/futon.html0000644000175000001440000003726412332105752023425 0ustar00djcusers00000000000000 1.7. Futon: Web GUI Administration Panel — Apache CouchDB 1.6 Documentation

    1.7. Futon: Web GUI Administration Panel¶

    Futon is a native web-based interface built into CouchDB. It provides a basic interface to the majority of the functionality, including the ability to create, update, delete and view documents and views, provides access to the configuration parameters, and an interface for initiating replication.

    The default view is the Overview page which provides you with a list of the databases. The basic structure of the page is consistent regardless of the section you are in. The main panel on the left provides the main interface to the databases, configuration or replication systems. The side panel on the right provides navigation to the main areas of Futon interface:

    Futon Overview

    Futon Overview

    The main sections are:

    • Overview

      The main overview page, which provides a list of the databases and provides the interface for querying the database and creating and updating documents. See Managing Databases and Documents.

    • Configuration

      An interface into the configuration of your CouchDB installation. The interface allows you to edit the different configurable parameters. For more details on configuration, see Configuring CouchDB section.

    • Replicator

      An interface to the replication system, enabling you to initiate replication between local and remote databases. See Configuring Replication.

    • Status

      Displays a list of the running background tasks on the server. Background tasks include view index building, compaction and replication. The Status page is an interface to the Active Tasks API call.

    • Verify Installation

      The Verify Installation allows you to check whether all of the components of your CouchDB installation are correctly installed.

    • Test Suite

      The Test Suite section allows you to run the built-in test suite. This executes a number of test routines entirely within your browser to test the API and functionality of your CouchDB installation. If you select this page, you can run the tests by using the Run All button. This will execute all the tests, which may take some time.

    1.7.1. Managing Databases and Documents¶

    You can manage databases and documents within Futon using the main Overview section of the Futon interface.

    To create a new database, click the Create Database ELLIPSIS button. You will be prompted for the database name, as shown in the figure below.

    Creating a Database

    Creating a Database

    Once you have created the database (or selected an existing one), you will be shown a list of the current documents. If you create a new document, or select an existing document, you will be presented with the edit document display.

    Editing documents within Futon requires selecting the document and then editing (and setting) the fields for the document individually before saving the document back into the database.

    For example, the figure below shows the editor for a single document, a newly created document with a single ID, the document _id field.

    Editing a Document

    Editing a Document

    To add a field to the document:

    1. Click Add Field.

    2. In the fieldname box, enter the name of the field you want to create. For example, ā€œcompanyā€.

    3. Click the green tick next to the field name to confirm the field name change.

    4. Double-click the corresponding Value cell.

    5. Enter a company name, for example ā€œExampleā€.

    6. Click the green tick next to the field value to confirm the field value.

    7. The document is still not saved as this point. You must explicitly save the document by clicking the Save Document button at the top of the page. This will save the document, and then display the new document with the saved revision information (the _rev field).

      Edited Document

      Edited Document

    The same basic interface is used for all editing operations within Futon. You must remember to save the individual element (fieldname, value) using the green tick button, before then saving the document.

    1.7.2. Configuring Replication¶

    When you click the Replicator option within the Tools menu you are presented with the Replicator screen. This allows you to start replication between two databases by filling in or select the appropriate options within the form provided.

    Replication Form

    Replication Form

    To start a replication process, either the select the local database or enter a remote database name into the corresponding areas of the form. Replication occurs from the database on the left to the database on the right.

    If you are specifying a remote database name, you must specify the full URL of the remote database (including the host, port number and database name). If the remote instance requires authentication, you can specify the username and password as part of the URL, for example http://username:pass@remotehost:5984/demo.

    To enable continuous replication, click the Continuous checkbox.

    To start the replication process, click the Replicate button. The replication process should start and will continue in the background. If the replication process will take a long time, you can monitor the status of the replication using the Status option under the Tools menu.

    Once replication has been completed, the page will show the information returned when the replication process completes by the API.

    The Replicator tool is an interface to the underlying replication API. For more information, see /_replicate. For more information on replication, see Replication.

    apache-couchdb-1.6.0/share/doc/build/html/intro/consistency.html0000644000175000001440000010061412332105752024621 0ustar00djcusers00000000000000 1.3. Eventual Consistency — Apache CouchDB 1.6 Documentation

    1.3. Eventual Consistency¶

    In the previous document Why CouchDB?, we saw that CouchDB’s flexibility allows us to evolve our data as our applications grow and change. In this topic, we’ll explore how working “with the grain” of CouchDB promotes simplicity in our applications and helps us naturally build scalable, distributed systems.

    1.3.1. Working with the Grain¶

    A distributed system is a system that operates robustly over a wide network. A particular feature of network computing is that network links can potentially disappear, and there are plenty of strategies for managing this type of network segmentation. CouchDB differs from others by accepting eventual consistency, as opposed to putting absolute consistency ahead of raw availability, like RDBMS or Paxos. What these systems have in common is an awareness that data acts differently when many people are accessing it simultaneously. Their approaches differ when it comes to which aspects of consistency, availability, or partition tolerance they prioritize.

    Engineering distributed systems is tricky. Many of the caveats and “gotchas” you will face over time aren’t immediately obvious. We don’t have all the solutions, and CouchDB isn’t a panacea, but when you work with CouchDB’s grain rather than against it, the path of least resistance leads you to naturally scalable applications.

    Of course, building a distributed system is only the beginning. A website with a database that is available only half the time is next to worthless. Unfortunately, the traditional relational database approach to consistency makes it very easy for application programmers to rely on global state, global clocks, and other high availability no-nos, without even realizing that they’re doing so. Before examining how CouchDB promotes scalability, we’ll look at the constraints faced by a distributed system. After we’ve seen the problems that arise when parts of your application can’t rely on being in constant contact with each other, we’ll see that CouchDB provides an intuitive and useful way for modeling applications around high availability.

    1.3.2. The CAP Theorem¶

    The CAP theorem describes a few different strategies for distributing application logic across networks. CouchDB’s solution uses replication to propagate application changes across participating nodes. This is a fundamentally different approach from consensus algorithms and relational databases, which operate at different intersections of consistency, availability, and partition tolerance.

    The CAP theorem, shown in Figure 1. The CAP theorem, identifies three distinct concerns:

    • Consistency: All database clients see the same data, even with concurrent updates.
    • Availability: All database clients are able to access some version of the data.
    • Partition tolerance: The database can be split over multiple servers.

    Pick two.

    The CAP theorem

    Figure 1. The CAP theorem

    When a system grows large enough that a single database node is unable to handle the load placed on it, a sensible solution is to add more servers. When we add nodes, we have to start thinking about how to partition data between them. Do we have a few databases that share exactly the same data? Do we put different sets of data on different database servers? Do we let only certain database servers write data and let others handle the reads?

    Regardless of which approach we take, the one problem we’ll keep bumping into is that of keeping all these database servers in sync. If you write some information to one node, how are you going to make sure that a read request to another database server reflects this newest information? These events might be milliseconds apart. Even with a modest collection of database servers, this problem can become extremely complex.

    When it’s absolutely critical that all clients see a consistent view of the database, the users of one node will have to wait for any other nodes to come into agreement before being able to read or write to the database. In this instance, we see that availability takes a backseat to consistency. However, there are situations where availability trumps consistency:

    Each node in a system should be able to make decisions purely based on local state. If you need to do something under high load with failures occurring and you need to reach agreement, you’re lost. If you’re concerned about scalability, any algorithm that forces you to run agreement will eventually become your bottleneck. Take that as a given.

    – Werner Vogels, Amazon CTO and Vice President

    If availability is a priority, we can let clients write data to one node of the database without waiting for other nodes to come into agreement. If the database knows how to take care of reconciling these operations between nodes, we achieve a sort of “eventual consistency” in exchange for high availability. This is a surprisingly applicable trade-off for many applications.

    Unlike traditional relational databases, where each action performed is necessarily subject to database-wide consistency checks, CouchDB makes it really simple to build applications that sacrifice immediate consistency for the huge performance improvements that come with simple distribution.

    1.3.3. Local Consistency¶

    Before we attempt to understand how CouchDB operates in a cluster, it’s important that we understand the inner workings of a single CouchDB node. The CouchDB API is designed to provide a convenient but thin wrapper around the database core. By taking a closer look at the structure of the database core, we’ll have a better understanding of the API that surrounds it.

    The Key to Your Data¶

    At the heart of CouchDB is a powerful B-tree storage engine. A B-tree is a sorted data structure that allows for searches, insertions, and deletions in logarithmic time. As Figure 2. Anatomy of a view request illustrates, CouchDB uses this B-tree storage engine for all internal data, documents, and views. If we understand one, we will understand them all.

    Anatomy of a view request

    Figure 2. Anatomy of a view request

    CouchDB uses MapReduce to compute the results of a view. MapReduce makes use of two functions, “map” and “reduce”, which are applied to each document in isolation. Being able to isolate these operations means that view computation lends itself to parallel and incremental computation. More important, because these functions produce key/value pairs, CouchDB is able to insert them into the B-tree storage engine, sorted by key. Lookups by key, or key range, are extremely efficient operations with a B-tree, described in big O notation as O(log N) and O(log N + K), respectively.

    In CouchDB, we access documents and view results by key or key range. This is a direct mapping to the underlying operations performed on CouchDB’s B-tree storage engine. Along with document inserts and updates, this direct mapping is the reason we describe CouchDB’s API as being a thin wrapper around the database core.

    Being able to access results by key alone is a very important restriction because it allows us to make huge performance gains. As well as the massive speed improvements, we can partition our data over multiple nodes, without affecting our ability to query each node in isolation. BigTable, Hadoop, SimpleDB, and memcached restrict object lookups by key for exactly these reasons.

    No Locking¶

    A table in a relational database is a single data structure. If you want to modify a table – say, update a row – the database system must ensure that nobody else is trying to update that row and that nobody can read from that row while it is being updated. The common way to handle this uses what’s known as a lock. If multiple clients want to access a table, the first client gets the lock, making everybody else wait. When the first client’s request is processed, the next client is given access while everybody else waits, and so on. This serial execution of requests, even when they arrived in parallel, wastes a significant amount of your server’s processing power. Under high load, a relational database can spend more time figuring out who is allowed to do what, and in which order, than it does doing any actual work.

    Note

    Modern relational databases avoid locks by implementing MVCC under the hood, but hide it from the end user, requiring them to coordinate concurrent changes of single rows or fields.

    Instead of locks, CouchDB uses Multi-Version Concurrency Control (MVCC) to manage concurrent access to the database. Figure 3. MVCC means no locking illustrates the differences between MVCC and traditional locking mechanisms. MVCC means that CouchDB can run at full speed, all the time, even under high load. Requests are run in parallel, making excellent use of every last drop of processing power your server has to offer.

    MVCC means no locking

    Figure 3. MVCC means no locking

    Documents in CouchDB are versioned, much like they would be in a regular version control system such as Subversion. If you want to change a value in a document, you create an entire new version of that document and save it over the old one. After doing this, you end up with two versions of the same document, one old and one new.

    How does this offer an improvement over locks? Consider a set of requests wanting to access a document. The first request reads the document. While this is being processed, a second request changes the document. Since the second request includes a completely new version of the document, CouchDB can simply append it to the database without having to wait for the read request to finish.

    When a third request wants to read the same document, CouchDB will point it to the new version that has just been written. During this whole process, the first request could still be reading the original version.

    A read request will always see the most recent snapshot of your database at the time of the beginning of the request.

    1.3.4. Validation¶

    As application developers, we have to think about what sort of input we should accept and what we should reject. The expressive power to do this type of validation over complex data within a traditional relational database leaves a lot to be desired. Fortunately, CouchDB provides a powerful way to perform per-document validation from within the database.

    CouchDB can validate documents using JavaScript functions similar to those used for MapReduce. Each time you try to modify a document, CouchDB will pass the validation function a copy of the existing document, a copy of the new document, and a collection of additional information, such as user authentication details. The validation function now has the opportunity to approve or deny the update.

    By working with the grain and letting CouchDB do this for us, we save ourselves a tremendous amount of CPU cycles that would otherwise have been spent serializing object graphs from SQL, converting them into domain objects, and using those objects to do application-level validation.

    1.3.5. Distributed Consistency¶

    Maintaining consistency within a single database node is relatively easy for most databases. The real problems start to surface when you try to maintain consistency between multiple database servers. If a client makes a write operation on server A, how do we make sure that this is consistent with server B, or C, or D? For relational databases, this is a very complex problem with entire books devoted to its solution. You could use multi-master, master/slave, partitioning, sharding, write-through caches, and all sorts of other complex techniques.

    1.3.6. Incremental Replication¶

    CouchDB’s operations take place within the context of a single document. As CouchDB achieves eventual consistency between multiple databases by using incremental replication you no longer have to worry about your database servers being able to stay in constant communication. Incremental replication is a process where document changes are periodically copied between servers. We are able to build what’s known as a shared nothing cluster of databases where each node is independent and self-sufficient, leaving no single point of contention across the system.

    Need to scale out your CouchDB database cluster? Just throw in another server.

    As illustrated in Figure 4. Incremental replication between CouchDB nodes, with CouchDB’s incremental replication, you can synchronize your data between any two databases however you like and whenever you like. After replication, each database is able to work independently.

    You could use this feature to synchronize database servers within a cluster or between data centers using a job scheduler such as cron, or you could use it to synchronize data with your laptop for offline work as you travel. Each database can be used in the usual fashion, and changes between databases can be synchronized later in both directions.

    Incremental replication between CouchDB nodes

    Figure 4. Incremental replication between CouchDB nodes

    What happens when you change the same document in two different databases and want to synchronize these with each other? CouchDB’s replication system comes with automatic conflict detection and resolution. When CouchDB detects that a document has been changed in both databases, it flags this document as being in conflict, much like they would be in a regular version control system.

    This isn’t as troublesome as it might first sound. When two versions of a document conflict during replication, the winning version is saved as the most recent version in the document’s history. Instead of throwing the losing version away, as you might expect, CouchDB saves this as a previous version in the document’s history, so that you can access it if you need to. This happens automatically and consistently, so both databases will make exactly the same choice.

    It is up to you to handle conflicts in a way that makes sense for your application. You can leave the chosen document versions in place, revert to the older version, or try to merge the two versions and save the result.

    1.3.7. Case Study¶

    Greg Borenstein, a friend and coworker, built a small library for converting Songbird playlists to JSON objects and decided to store these in CouchDB as part of a backup application. The completed software uses CouchDB’s MVCC and document revisions to ensure that Songbird playlists are backed up robustly between nodes.

    Note

    Songbird is a free software media player with an integrated web browser, based on the Mozilla XULRunner platform. Songbird is available for Microsoft Windows, Apple Mac OS X, Solaris, and Linux.

    Let’s examine the workflow of the Songbird backup application, first as a user backing up from a single computer, and then using Songbird to synchronize playlists between multiple computers. We’ll see how document revisions turn what could have been a hairy problem into something that just works.

    The first time we use this backup application, we feed our playlists to the application and initiate a backup. Each playlist is converted to a JSON object and handed to a CouchDB database. As illustrated in Figure 5. Backing up to a single database, CouchDB hands back the document ID and revision of each playlist as it’s saved to the database.

    Backing up to a single database

    Figure 5. Backing up to a single database

    After a few days, we find that our playlists have been updated and we want to back up our changes. After we have fed our playlists to the backup application, it fetches the latest versions from CouchDB, along with the corresponding document revisions. When the application hands back the new playlist document, CouchDB requires that the document revision is included in the request.

    CouchDB then makes sure that the document revision handed to it in the request matches the current revision held in the database. Because CouchDB updates the revision with every modification, if these two are out of sync it suggests that someone else has made changes to the document between the time we requested it from the database and the time we sent our updates. Making changes to a document after someone else has modified it without first inspecting those changes is usually a bad idea.

    Forcing clients to hand back the correct document revision is the heart of CouchDB’s optimistic concurrency.

    We have a laptop we want to keep synchronized with our desktop computer. With all our playlists on our desktop, the first step is to “restore from backup” onto our laptop. This is the first time we’ve done this, so afterward our laptop should hold an exact replica of our desktop playlist collection.

    After editing our Argentine Tango playlist on our laptop to add a few new songs we’ve purchased, we want to save our changes. The backup application replaces the playlist document in our laptop CouchDB database and a new document revision is generated. A few days later, we remember our new songs and want to copy the playlist across to our desktop computer. As illustrated in Figure 6. Synchronizing between two databases, the backup application copies the new document and the new revision to the desktop CouchDB database. Both CouchDB databases now have the same document revision.

    Synchronizing between two databases

    Figure 6. Synchronizing between two databases

    Because CouchDB tracks document revisions, it ensures that updates like these will work only if they are based on current information. If we had made modifications to the playlist backups between synchronization, things wouldn’t go as smoothly.

    We back up some changes on our laptop and forget to synchronize. A few days later, we’re editing playlists on our desktop computer, make a backup, and want to synchronize this to our laptop. As illustrated in Figure 7. Synchronization conflicts between two databases, when our backup application tries to replicate between the two databases, CouchDB sees that the changes being sent from our desktop computer are modifications of out-of-date documents and helpfully informs us that there has been a conflict.

    Recovering from this error is easy to accomplish from an application perspective. Just download CouchDB’s version of the playlist and provide an opportunity to merge the changes or save local modifications into a new playlist.

    Synchronization conflicts between two databases

    Figure 7. Synchronization conflicts between two databases

    1.3.8. Wrapping Up¶

    CouchDB’s design borrows heavily from web architecture and the lessons learned deploying massively distributed systems on that architecture. By understanding why this architecture works the way it does, and by learning to spot which parts of your application can be easily distributed and which parts cannot, you’ll enhance your ability to design distributed and scalable applications, with CouchDB or without it.

    We’ve covered the main issues surrounding CouchDB’s consistency model and hinted at some of the benefits to be had when you work with CouchDB and not against it. But enough theory – let’s get up and running and see what all the fuss is about!

    apache-couchdb-1.6.0/share/doc/build/html/experimental.html0000644000175000001440000002600612332105747023630 0ustar00djcusers00000000000000 12. Experimental Features — Apache CouchDB 1.6 Documentation

    12. Experimental Features¶

    This is a list of experimental features in CouchDB. They are included in a release because the development team is requesting feedback from the larger developer community. As such, please play around with these features and send us feedback, thanks!

    Use at your own risk! Do not rely on these features for critical applications.

    12.1. NodeJS Query Server¶

    The NodeJS Query Server is an alternative runtime environment for the default JavaScript Query Server that runs on top of Node.JS and not SpiderMonkey like the default Query Server.

    12.1.1. Setup¶

    You will need to install Node.JS version 0.10.0 or later. See Node.JS Downloads for options.

    1. Install the couchjs-node binary. Either from the CouchDB sources:

      cd src/couchjs-node
      npm link

    Or via NPM:

    npm install -g couchjs

    Note

    NPM in non-standard locations

    If your Node.JS installation doesn’t store binaries in /usr/local/bin you will need to adjust CouchDB’s configuration. Add this to your local.ini file:

    [query_servers]
    nodejs = /path/to/couchjs-node /path/to/couchdb/share/server/main.js
    

    And then restart your CouchDB instance.

    2. Done. Now you can create design documents with the language parameter set to nodejs and all JavaScript functions in this design document will be processed by the Node.JS query server.

    Enjoy!

    12.1.2. Differences from the SpiderMonkey Query Server¶

    V8 and SpiderMonkey roughly behave similar, but there might be engine- specific differences that make or break a JavaScript function in one or the other server.

    12.2. Plugins¶

    See src/couch_plugins/README.md.

    apache-couchdb-1.6.0/share/doc/build/html/json-structure.html0000644000175000001440000013010412332105755024134 0ustar00djcusers00000000000000 11. JSON Structure Reference — Apache CouchDB 1.6 Documentation

    11. JSON Structure Reference¶

    The following appendix provides a quick reference to all the JSON structures that you can supply to CouchDB, or get in return to requests.

    11.1. All Database Documents¶

    Field Description
    total_rows Number of documents in the database/view
    offset Offset where the document list started
    update_seq (optional) Current update sequence for the database
    rows [array] Array of document object

    11.2. Bulk Document Response¶

    Field Description
    docs [array] Bulk Docs Returned Documents
    id Document ID
    error Error type
    reason Error string with extended reason

    11.3. Bulk Documents¶

    Field Description
    all_or_nothing (optional) Sets the database commit mode to use all-or-nothing semantics
    docs [array] Bulk Documents Document
    _id (optional) Document ID
    _rev (optional) Revision ID (when updating an existing document)
    _deleted (optional) Whether the document should be deleted

    11.4. Changes information for a database¶

    Field Description
    last_seq Last change sequence number
    results [array] Changes made to a database
    seq Update sequence number
    id Document ID
    changes [array] List of changes, field-by-field, for this document

    11.5. CouchDB Document¶

    Field Description
    _id (optional) Document ID
    _rev (optional) Revision ID (when updating an existing document)

    11.6. CouchDB Error Status¶

    Field Description
    id Document ID
    error Error type
    reason Error string with extended reason

    11.7. CouchDB database information object¶

    Field Description
    db_name The name of the database.
    committed_update_seq The number of committed updates.
    doc_count The number of documents in the database.
    doc_del_count The number of deleted documents.
    compact_running Set to true if the database compaction routine is operating on this database.
    disk_format_version The version of the physical format used for the data when it is stored on hard disk.
    disk_size Size in bytes of the data as stored on disk. View indexes are not included in the calculation.
    instance_start_time Timestamp indicating when the database was opened, expressed in microseconds since the epoch.
    purge_seq The number of purge operations on the database.
    update_seq The current number of updates made in the database.

    11.8. Design Document¶

    Field Description
    _id Design Document ID
    _rev Design Document Revision
    views View
    viewname View Definition
    map Map Function for View
    reduce (optional) Reduce Function for View

    11.9. Design Document Information¶

    Field Description
    name Name/ID of Design Document
    view_index View Index
    compact_running Indicates whether a compaction routine is currently running on the view
    disk_size Size in bytes of the view as stored on disk
    language Language for the defined views
    purge_seq The purge sequence that has been processed
    signature MD5 signature of the views for the design document
    update_seq The update sequence of the corresponding database that has been indexed
    updater_running Indicates if the view is currently being updated
    waiting_clients Number of clients waiting on views from this design document
    waiting_commit Indicates if there are outstanding commits to the underlying database that need to processed

    11.10. Document with Attachments¶

    Field Description
    _id (optional) Document ID
    _rev (optional) Revision ID (when updating an existing document)
    _attachments (optional) Document Attachment
    filename Attachment information
    content_type MIME Content type string
    data File attachment content, Base64 encoded

    11.11. List of Active Tasks¶

    Field Description
    tasks [array] Active Tasks
    pid Process ID
    status Task status message
    task Task name
    type Operation Type

    11.12. Replication Settings¶

    Field Description
    source Source database name or URL
    target Target database name or URL
    create_target (optional) Creates the target database
    continuous (optional) Configure the replication to be continuous
    cancel (optional) Cancels the replication
    doc_ids (optional) Array of document IDs to be synchronized
    proxy (optional) Address of a proxy server through which replication should occur
    since_seq (optional) Sequence from which the replication should start
    filter (optional) name of the filter function in the form of ddoc/myfilter
    query_params (optional) Query parameter that are passed to the filter function; the value should be a document containing parameters as members
    use_checkpoints (optional) Whether to use replication checkpoints or not
    checkpoint_interval (optional) Specifies the checkpoint interval in ms.

    11.13. Replication Status¶

    Field Description
    ok Replication status
    session_id Unique session ID
    source_last_seq Last sequence number read from the source database
    history [array] Replication History
    session_id Session ID for this replication operation
    recorded_seq Last recorded sequence number
    docs_read Number of documents read
    docs_written Number of documents written to target
    doc_write_failures Number of document write failures
    start_time Date/Time replication operation started
    start_last_seq First sequence number in changes stream
    end_time Date/Time replication operation completed
    end_last_seq Last sequence number in changes stream
    missing_checked Number of missing documents checked
    missing_found Number of missing documents found

    11.14. Request object¶

    Field Description
    body Request body data as string. If the request method is GET this field contains the value "undefined". If the method is DELETE or HEAD the value is "" (empty string).
    cookie Cookies object.
    form Form data object. Contains the decoded body as key-value pairs if the Content-Type header was application/x-www-form-urlencoded.
    headers Request headers object.
    id Requested document id string if it was specified or null otherwise.
    info Database information
    method Request method as string or array. String value is a method as one of: HEAD, GET, POST, PUT, DELETE, OPTIONS, and TRACE. Otherwise it will be represented as an array of char codes.
    path List of requested path sections.
    peer Request source IP address.
    query URL query parameters object. Note that multiple keys are not supported and the last key value suppresses others.
    requested_path List of actual requested path section.
    raw_path Raw requested path string.
    secObj Security Object.
    userCtx User Context Object.
    uuid Generated UUID by a specified algorithm in the config file.
    {
        "body": "undefined",
        "cookie": {
            "AuthSession": "cm9vdDo1MDZBRjQzRjrfcuikzPRfAn-EA37FmjyfM8G8Lw",
            "m": "3234"
        },
        "form": {},
        "headers": {
            "Accept": "text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8",
            "Accept-Charset": "ISO-8859-1,utf-8;q=0.7,*;q=0.3",
            "Accept-Encoding": "gzip,deflate,sdch",
            "Accept-Language": "en-US,en;q=0.8",
            "Connection": "keep-alive",
            "Cookie": "m=3234:t|3247:t|6493:t|6967:t|34e2:|18c3:t|2c69:t|5acb:t|ca3:t|c01:t|5e55:t|77cb:t|2a03:t|1d98:t|47ba:t|64b8:t|4a01:t; AuthSession=cm9vdDo1MDZBRjQzRjrfcuikzPRfAn-EA37FmjyfM8G8Lw",
            "Host": "127.0.0.1:5984",
            "User-Agent": "Mozilla/5.0 (Windows NT 5.2) AppleWebKit/535.7 (KHTML, like Gecko) Chrome/16.0.912.75 Safari/535.7"
        },
        "id": "foo",
        "info": {
            "committed_update_seq": 2701412,
            "compact_running": false,
            "data_size": 7580843252,
            "db_name": "mailbox",
            "disk_format_version": 6,
            "disk_size": 14325313673,
            "doc_count": 2262757,
            "doc_del_count": 560,
            "instance_start_time": "1347601025628957",
            "purge_seq": 0,
            "update_seq": 2701412
        },
        "method": "GET",
        "path": [
            "mailbox",
            "_design",
            "request",
            "_show",
            "dump",
            "foo"
        ],
        "peer": "127.0.0.1",
        "query": {},
        "raw_path": "/mailbox/_design/request/_show/dump/foo",
        "requested_path": [
            "mailbox",
            "_design",
            "request",
            "_show",
            "dump",
            "foo"
        ],
        "secObj": {
            "admins": {
                "names": [
                    "Bob"
                ],
                "roles": []
            },
            "members": {
                "names": [
                    "Mike",
                    "Alice"
                ],
                "roles": []
            }
        },
        "userCtx": {
            "db": "mailbox",
            "name": "Mike",
            "roles": [
                "user"
            ]
        },
        "uuid": "3184f9d1ea934e1f81a24c71bde5c168"
    }
    

    11.15. Response object¶

    Field Description
    code HTTP status code number.
    json JSON encodable object. Implicitly sets Content-Type header as application/json.
    body Raw response text string. Implicitly sets Content-Type header as text/html; charset=utf-8.
    base64 Base64 encoded string. Implicitly sets Content-Type header as application/binary.
    headers Response headers object. Content-Type header from this object overrides any implicitly assigned one.
    stop boolean signal to stop iteration over view result rows (for list functions only)

    Warning

    The body, base64 and json object keys are overlapping each other where the last one wins. Since most realizations of key-value objects do not preserve the key order or if they are mixed, confusing situations can occure. Try to use only one of them.

    Note

    Any custom property makes CouchDB raise an internal exception. Furthermore, the Response object could be a simple string value which would be implicitly wrapped into a {"body": ...} object.

    11.16. Returned CouchDB Document with Detailed Revision Info¶

    Field Description
    _id (optional) Document ID
    _rev (optional) Revision ID (when updating an existing document)
    _revs_info [array] CouchDB document extended revision info
    rev Full revision string
    status Status of the revision

    11.17. Returned CouchDB Document with Revision Info¶

    Field Description
    _id (optional) Document ID
    _rev (optional) Revision ID (when updating an existing document)
    _revisions CouchDB document revisions
    ids [array] Array of valid revision IDs, in reverse order (latest first)
    start Prefix number for the latest revision

    11.18. Returned Document with Attachments¶

    Field Description
    _id (optional) Document ID
    _rev (optional) Revision ID (when updating an existing document)
    _attachments (optional) Document attachment
    filename Attachment
    stub Indicates whether the attachment is a stub
    content_type MIME Content type string
    length Length (bytes) of the attachment data
    revpos Revision where this attachment exists

    11.19. Security Object¶

    Field Description
    admins Roles/Users with admin privileges
    roles [array] List of roles with parent privilege
    users [array] List of users with parent privilege
    readers Roles/Users with reader privileges
    roles [array] List of roles with parent privilege
    users [array] List of users with parent privilege
    {
        "admins": {
            "names": [
                "Bob"
            ],
            "roles": []
        },
        "members": {
            "names": [
                "Mike",
                "Alice"
            ],
            "roles": []
        }
      }
    

    11.20. User Context Object¶

    Field Description
    db Database name in the context of the provided operation.
    name User name.
    roles List of user roles.
    {
        "db": "mailbox",
        "name": null,
        "roles": [
            "_admin"
        ]
    }
    

    11.21. View Head Information¶

    Field Description
    total_rows Number of documents in the view
    offset Offset where the document list started
    {
        "total_rows": 42,
        "offset": 3
    }
    
    apache-couchdb-1.6.0/share/doc/build/html/fauxton/0000755000175000001440000000000012332106073021716 5ustar00djcusers00000000000000apache-couchdb-1.6.0/share/doc/build/html/fauxton/index.html0000644000175000001440000002214612332105747023727 0ustar00djcusers00000000000000 9. Fauxton — Apache CouchDB 1.6 Documentation apache-couchdb-1.6.0/share/doc/build/html/fauxton/install.html0000644000175000001440000003046412332105747024270 0ustar00djcusers00000000000000 9.1. Installation — Apache CouchDB 1.6 Documentation

    9.1. Installation¶

    A recent of node.js and npm is required.

    9.1.1. Get the source¶

    Clone the CouchDB repo:

    $ git clone http://git-wip-us.apache.org/repos/asf/couchdb.git
    $ cd couchdb

    9.1.2. Fauxton Setup¶

    Install all dependencies:

    couchdb/ $ cd src/fauxton
    couchdb/src/fauxton/ $ npm install

    Note

    To avoid a npm global install add node_modules/.bin to your path:

    export PATH=./node_modules/.bin:$PATH

    Or just use the wrappers in ./bin/.

    Development mode, non minified files:

    ./bin/grunt couchdebug

    Or fully compiled install:

    ./bin/grunt couchdb

    9.1.3. Dev Server¶

    Using the dev server is the easiest way to use Fauxton, specially when developing for it:

    grunt dev

    9.1.4. Deploy Fauxton¶

    Deploy Fauxton to your local CouchDB instance:

    ./bin/grunt couchapp_deploy

    The Fauxton be available by http://localhost:5984/fauxton/_design/fauxton/index.html

    Understang Fauxton Code layout¶

    Each bit of functionality is its own separate module or addon.

    All core modules are stored under app/module and any addons that are optional are under app/addons.

    We use backbone.js and Backbone.layoutmanager quite heavily, so best to get an idea how they work. Its best at this point to read through a couple of the modules and addons to get an idea of how they work.

    Two good starting points are app/addon/config and app/modules/databases.

    Each module must have a base.js file, this is read and compile when Fauxton is deployed.

    The resource.js file is usually for your Backbone.Models and Backbone.Collections, view.js for your Backbone.Views.

    The routes.js is used to register a url path for your view along with what layout, data, breadcrumbs and api point is required for the view.

    ToDo items¶

    Checkout JIRA for a list of items to do.

    apache-couchdb-1.6.0/share/doc/build/html/fauxton/addons.html0000644000175000001440000004574512332105747024102 0ustar00djcusers00000000000000 9.2. Writting Addons — Apache CouchDB 1.6 Documentation

    9.2. Writting Addons¶

    Addons allow you to extend Fauxton for a specific use case. Usually, they have the following structure:

    + my_addon/
    | ---+ assets [optional]
    |    \ ---+ less
    |         \ ---- my_addon.less
    | ---+ templates/
    |    \ ---- my_addon.html - underscore template fragments
    | ---- resources.js - models and collections of the addon
    | ---- routes.js - URL routing for the addon
    | ---- views.js - views that the model provides

    9.2.1. Generating an Addon¶

    We have a grunt-init template that lets you create a skeleton addon, including all the boiler plate code. Run grunt-init tasks/addon and answer the questions it asks to create an addon:

    ± grunt-init tasks/addon
    path.existsSync is now called `fs.existsSync`.
    Running "addon" task
    
    Please answer the following:
    [?] Add on Name (WickedCool) SuperAddon
    [?] Location of add ons (app/addons)
    [?] Do you need an assets folder?(for .less) (y/N)
    [?] Do you need to make any changes to the above before continuing? (y/N)
    
    Created addon SuperAddon in app/addons
    
    Done, without errors.

    Once the addon is created add the name to the settings.json file to get it compiled and added on the next install.

    9.2.2. Routes and hooks¶

    An addon can insert itself into Fauxton in two ways; via a route or via a hook.

    Routes¶

    An addon will override an existing route should one exist, but in all other ways is just a normal backbone route/view. This is how you would add a whole new feature.

    Hooks¶

    Hooks let you modify/extend an existing feature. They modify a DOM element by selector for a named set of routes, for example:

    var Search = new FauxtonAPI.addon();
    Search.hooks = {
      // Render additional content into the sidebar
      "#sidebar-content": {
        routes:[
          "database/:database/_design/:ddoc/_search/:search",
          "database/:database/_design/:ddoc/_view/:view",
          "database/:database/_:handler"],
        callback: searchSidebar
      }
    };
    return Search;
    

    adds the searchSidebar callback to #sidebar-content for three routes.

    9.2.3. Hello world Addon¶

    First create the addon skeleton:

    ± bbb addon
    path.existsSync is now called `fs.existsSync`.
    Running "addon" task
    
    Please answer the following:
    [?] Add on Name (WickedCool) Hello
    [?] Location of add ons (app/addons)
    [?] Do you need to make any changes to the above before continuing? (y/N)
    
    Created addon Hello in app/addons
    
    Done, without errors.

    In app/addons/hello/templates/hello.html place:

    <h1>Hello!</h1>
    

    Next, we’ll defined a simple view in resources.js (for more complex addons you may want to have a views.js) that renders that template:

    define([
      "app",
      "api"
    ],
    
    function (app, FauxtonAPI) {
      var Resources = {};
    
      Resources.Hello = FauxtonAPI.View.extend({
        template: "addons/hello/templates/hello"
      });
    
      return Resources;
    });
    

    Then define a route in routes.js that the addon is accessible at:

    define([
      "app",
      "api",
      "addons/hello/resources"
    ],
    
    function(app, FauxtonAPI, Resources) {
      var helloRoute = function () {
        console.log('helloRoute callback yo');
        return {
          layout: "one_pane",
          crumbs: [
            {"name": "Hello","link": "_hello"}
          ],
          views: {
            "#dashboard-content": new Resources.Hello({})
          },
          apiUrl: 'hello'
        };
      };
    
      Routes = {
        "_hello": helloRoute
      };
    
      return Routes;
    });
    

    Then wire it all together in base.js:

    define([
      "app",
      "api",
      "addons/hello/routes"
    ],
    
    function(app, FauxtonAPI, HelloRoutes) {
      var Hello = new FauxtonAPI.addon();
      console.log('hello from hello');
    
      Hello.initialize = function() {
        FauxtonAPI.addHeaderLink({title: "Hello", href: "#_hello"});
      };
    
      Hello.Routes = HelloRoutes;
      console.log(Hello);
      return Hello;
    });
    

    Once the code is in place include the add on in your settings.json so that it gets included by the require task. Your addon is included in one of three ways; a local path, a git URL or a name. Named plugins assume the plugin is in the Fauxton base directory, addons with a git URL will be cloned into the application, local paths will be copied. Addons included from a local path will be cleaned out by the clean task, others are left alone.

    apache-couchdb-1.6.0/share/doc/build/html/whatsnew/0000755000175000001440000000000012332106073022072 5ustar00djcusers00000000000000apache-couchdb-1.6.0/share/doc/build/html/whatsnew/1.4.html0000644000175000001440000003171412332105765023277 0ustar00djcusers00000000000000 14.3. 1.4.x Branch — Apache CouchDB 1.6 Documentation

    14.3. 1.4.x Branch¶

    Warning

    1.4.x Branch is affected by the issue described in CVE-2014-2668: DoS (CPU and memory consumption) via the count parameter to /_uuids. Upgrading to a more recent release is strongly recommended.

    14.3.1. Upgrade Notes¶

    We now support Erlang/OTP R16B and R16B01; the minimum required version is R14B.

    User document role values must now be strings. Other types of values will be refused when saving the user document.

    14.3.2. Version 1.4.0¶

    apache-couchdb-1.6.0/share/doc/build/html/whatsnew/1.5.html0000644000175000001440000002755512332105765023310 0ustar00djcusers00000000000000 14.2. 1.5.x Branch — Apache CouchDB 1.6 Documentation

    14.2. 1.5.x Branch¶

    Warning

    Version 1.5.1 contains important security fixes. Previous 1.5.x releases are not recommended for regular usage.

    14.2.1. Version 1.5.1¶

    14.2.2. Version 1.5.0¶

    • COUCHDB-1781: The official documentation has been overhauled. A lot of content from other sources have been merged, and the index page has been rebuilt to make the docs much more accessible. #54813a7
    • A new administration UI, codenamed Fauxton, has been included as an experimental preview. It can be accessed at /_utils/fauxton/. There are too many improvements here to list them all. We are looking for feedback from the community on this preview release.
    • COUCHDB-1888: Fixed an issue where admin users would be restricted by the public_fields feature.
    • Fixed an issue with the JavaScript CLI test runner. #be76882, #54813a7
    • COUCHDB-1867: An experimental plugin feature has been added. See src/couch_plugin/README.md for details. We invite the community to test and report any findings.
    • COUCHDB-1894: An experimental Node.js-based query server runtime has been added. See Experimental Features for details. We invite the community to test and report any findings.
    • COUCHDB-1901: Better retry mechanism for transferring attachments during replication. #4ca2cec
    apache-couchdb-1.6.0/share/doc/build/html/whatsnew/1.6.html0000644000175000001440000004071612332105765023303 0ustar00djcusers00000000000000 14.1. 1.6.x Branch — Apache CouchDB 1.6 Documentation

    14.1. 1.6.x Branch¶

    14.1.1. Upgrade Notes¶

    The Proxy Authentication handler was renamed to proxy_authentication_handler to follow the *_authentication_handler form of all other handlers. The old proxy_authentification_handler name is marked as deprecated and will be removed in future releases. It’s strongly recommended to update httpd/authentication_handlers option with new value in case if you had used such handler.

    14.1.2. Version 1.6.0¶

    • COUCHDB-2200: support Erlang/OTP 17.0 #35e16032
    • Fauxton: many improvements in our experimental new user interface, including switching the code editor from CodeMirror to Ace as well as better support for various browsers.
    • Add the max_count option (UUIDs Configuration) to allow rate-limiting the amount of UUIDs that can be requested from the /_uuids handler in a single request (CVE 2014-2668).
    • COUCHDB-1986: increase socket buffer size to improve replication speed for large documents and attachments, and fix tests on BSD-like systems. #9a0e561b
    • COUCHDB-1953: improve performance of multipart/related requests. #ce3e89dc
    • COUCHDB-2221: verify that authentication-related configuration settings are well-formed. #dbe769c6
    • COUCHDB-1922: fix CORS exposed headers. #4f619833
    • COUCHDB-1795: ensure the startup script clears the pid file on termination. #818ef4f9
    • COUCHDB-1962: replication can now be performed without having write access to the source database (#1d5fe2aa), the replication checkpoint interval is now configurable (#0693f98e).
    • COUCHDB-2025: add support for SOCKS5 proxies for replication. #fcd76c9
    • COUCHDB-1930: redirect to the correct page after submitting a new document with a different ID than the one suggested by Futon. #4906b591
    • COUCHDB-1923: add support for attachments and att_encoding_info options (formerly only available on the documents API) to the view API. #ca41964b
    • COUCHDB-1780: upgrade password hashes from SHA-1 to PBKDF2 scheme on successful authentication. #34888938
    • COUCHDB-2059: allow run-time configuration of maximum URL length. #f7ca266b
    • COUCHDB-2054: accept gzipped JSON request bodies. #4d893387
    • Rename proxy_authentification_handler to proxy_authentication_handler. #c66ac4a8
    • COUCHDB-1647: for failed replications originating from a document in the _replicator database, store the failure reason in the document. #08cac68b
    • COUCHDB-2053: send better error messages when both key and keys parameters are specified in view requests. #2bc07840
    • COUCHDB-2040: send better error messages when incorrect checksums are encountered during compaction. #e7fdc16a
    • COUCHDB-2028: allow intermedia certificates when using SSL/TLS. #2d080449
    • COUCHDB-2031: fix rewriting of paths with query string parameters. #37c84596
    • Numerous improvements to the documentation.
    apache-couchdb-1.6.0/share/doc/build/html/whatsnew/0.10.html0000644000175000001440000004031512332105762023345 0ustar00djcusers00000000000000 14.9. 0.10.x Branch — Apache CouchDB 1.6 Documentation

    14.9. 0.10.x Branch¶

    14.9.1. Upgrade Notes¶

    Warning

    Version 0.10.2 contains important security fixes. Previous 0.10.x releases are not recommended for regular usage.

    Modular Configuration Directories¶

    CouchDB now loads configuration from the following places (glob(7) syntax) in order:

    • PREFIX/default.ini
    • PREFIX/default.d/*
    • PREFIX/local.ini
    • PREFIX/local.d/*

    The configuration options for couchdb script have changed to:

    -a FILE     add configuration FILE to chain
    -A DIR      add configuration DIR to chain
    -n          reset configuration file chain (including system default)
    -c          print configuration file chain and exit

    Show and List API change¶

    Show and List functions must have a new structure in 0.10. See Formatting_with_Show_and_List for details.

    Stricter enforcing of reduciness in reduce-functions¶

    Reduce functions are now required to reduce the number of values for a key.

    View query reduce parameter strictness¶

    CouchDB now considers the parameter reduce=false to be an error for queries of map-only views, and responds with status code 400.

    14.9.2. Version 0.10.2¶

    Build and System Integration¶

    • Fixed distribution preparation for building on Mac OS X.

    Replicator¶

    • Avoid leaking file descriptors on automatic replication restarts.

    14.9.3. Version 0.10.1¶

    Build and System Integration¶

    • Test suite now works with the distcheck target.

    Replicator¶

    • Stability enhancements regarding redirects, timeouts, OAuth.

    Query Server¶

    • Avoid process leaks
    • Allow list and view to span languages

    Stats¶

    • Eliminate new process flood on system wake

    14.9.4. Version 0.10.0¶

    Build and System Integration¶

    • Changed couchdb script configuration options.
    • Added default.d and local.d configuration directories to load sequence.

    HTTP Interface¶

    • Added optional cookie-based authentication handler.
    • Added optional two-legged OAuth authentication handler.

    Storage Format¶

    • Add move headers with checksums to the end of database files for extra robust storage and faster storage.

    View Server¶

    • Added native Erlang views for high-performance applications.
    apache-couchdb-1.6.0/share/doc/build/html/whatsnew/0.11.html0000644000175000001440000007434412332105763023360 0ustar00djcusers00000000000000 14.8. 0.11.x Branch — Apache CouchDB 1.6 Documentation

    14.8. 0.11.x Branch¶

    14.8.1. Upgrade Notes¶

    Warning

    Version 0.11.2 contains important security fixes. Previous 0.11.x releases are not recommended for regular usage.

    Changes Between 0.11.0 and 0.11.1¶

    • _log and _temp_views are now admin-only resources.
    • _bulk_docs now requires a valid Content-Type header of application/json.
    • JSONP is disabled by default. An .ini option was added to selectively enable it.
    • The key, startkey and endkey properties of the request object passed to list and show functions now contain JSON objects representing the URL encoded string values in the query string. Previously, these properties contained strings which needed to be converted to JSON before using.

    Changes Between 0.10.x and 0.11.0¶

    show, list, update and validation functions¶

    The req argument to show, list, update and validation functions now contains the member method with the specified HTTP method of the current request. Previously, this member was called verb. method is following RFC 2616 (HTTP 1.1) closer.

    _admins -> _security¶

    The /db/_admins handler has been removed and replaced with a /db/_security object. Any existing _admins will be dropped and need to be added to the security object again. The reason for this is that the old system made no distinction between names and roles, while the new one does, so there is no way to automatically upgrade the old admins list.

    The security object has 2 special fields, admins and readers, which contain lists of names and roles which are admins or readers on that database. Anything else may be stored in other fields on the security object. The entire object is made available to validation functions.

    json2.js¶

    JSON handling in the query server has been upgraded to use json2.js. This allows us to use faster native JSON serialization when it is available.

    In previous versions, attempts to serialize undefined would throw an exception, causing the doc that emitted undefined to be dropped from the view index. The new behavior is to serialize undefined as null. Applications depending on the old behavior will need to explicitly check for undefined.

    Another change is that E4X’s XML objects will not automatically be stringified. XML users will need to call my_xml_object.toXMLString() to return a string value. #8d3b7ab3

    WWW-Authenticate¶

    The default configuration has been changed to avoid causing basic-auth popups which result from sending the WWW-Authenticate header. To enable basic-auth popups, uncomment the httpd/WWW-Authenticate line in local.ini.

    Query server line protocol¶

    The query server line protocol has changed for all functions except map, reduce, and rereduce. This allows us to cache the entire design document in the query server process, which results in faster performance for common operations. It also gives more flexibility to query server implementators and shouldn’t require major changes in the future when adding new query server features.

    UTF8 JSON¶

    JSON request bodies are validated for proper UTF-8 before saving, instead of waiting to fail on subsequent read requests.

    _changes line format¶

    Continuous changes are now newline delimited, instead of having each line followed by a comma.

    14.8.2. Version 0.11.2¶

    Authentication¶

    • User documents can now be deleted by admins or the user.

    Futon¶

    • Add some Futon files that were missing from the Makefile.

    HTTP Interface¶

    • Better error messages on invalid URL requests.

    Replicator¶

    • Fix bug when pushing design docs by non-admins, which was hanging the replicator for no good reason.
    • Fix bug when pulling design documents from a source that requires basic-auth.

    Security¶

    14.8.3. Version 0.11.1¶

    Build and System Integration¶

    • Output of couchdb –help has been improved.
    • Fixed compatibility with the Erlang R14 series.
    • Fixed warnings on Linux builds.
    • Fixed build error when aclocal needs to be called during the build.
    • Require ICU 4.3.1.
    • Fixed compatibility with Solaris.

    Configuration System¶

    • Fixed timeout with large .ini files.

    Futon¶

    • Use “expando links” for over-long document values in Futon.
    • Added continuous replication option.
    • Added option to replicating test results anonymously to a community CouchDB instance.
    • Allow creation and deletion of config entries.
    • Fixed display issues with doc ids that have escaped characters.
    • Fixed various UI issues.

    HTTP Interface¶

    • Mask passwords in active tasks and logging.
    • Update mochijson2 to allow output of BigNums not in float form.
    • Added support for X-HTTP-METHOD-OVERRIDE.
    • Better error message for database names.
    • Disable jsonp by default.
    • Accept gzip encoded standalone attachments.
    • Made max_concurrent_connections configurable.
    • Made changes API more robust.
    • Send newly generated document rev to callers of an update function.

    JavaScript Clients¶

    • Added tests for couch.js and jquery.couch.js
    • Added changes handler to jquery.couch.js.
    • Added cache busting to jquery.couch.js if the user agent is msie.
    • Added support for multi-document-fetch (via _all_docs) to jquery.couch.js.
    • Added attachment versioning to jquery.couch.js.
    • Added option to control ensure_full_commit to jquery.couch.js.
    • Added list functionality to jquery.couch.js.
    • Fixed issues where bulkSave() wasn’t sending a POST body.

    Log System¶

    • Log HEAD requests as HEAD, not GET.
    • Keep massive JSON blobs out of the error log.
    • Fixed a timeout issue.

    Replication System¶

    • Refactored various internal APIs related to attachment streaming.
    • Fixed hanging replication.
    • Fixed keepalive issue.

    Security¶

    • Added authentication redirect URL to log in clients.
    • Fixed query parameter encoding issue in oauth.js.
    • Made authentication timeout configurable.
    • Temporary views are now admin-only resources.

    Storage System¶

    • Don’t require a revpos for attachment stubs.
    • Added checking to ensure when a revpos is sent with an attachment stub, it’s correct.
    • Make file deletions async to avoid pauses during compaction and db deletion.
    • Fixed for wrong offset when writing headers and converting them to blocks, only triggered when header is larger than 4k.
    • Preserve _revs_limit and instance_start_time after compaction.

    Test Suite¶

    • Made the test suite overall more reliable.

    View Server¶

    • Provide a UUID to update functions (and all other functions) that they can use to create new docs.
    • Upgrade CommonJS modules support to 1.1.1.
    • Fixed erlang filter funs and normalize filter fun API.
    • Fixed hang in view shutdown.

    URL Rewriter & Vhosts¶

    • Allow more complex keys in rewriter.
    • Allow global rewrites so system defaults are available in vhosts.
    • Allow isolation of databases with vhosts.
    • Fix issue with passing variables to query parameters.

    14.8.4. Version 0.11.0¶

    Build and System Integration¶

    • Updated and improved source documentation.
    • Fixed distribution preparation for building on Mac OS X.
    • Added support for building a Windows installer as part of ‘make dist’.
    • Bug fix for building couch.app’s module list.
    • ETap tests are now run during make distcheck. This included a number of updates to the build system to properly support VPATH builds.
    • Gavin McDonald setup a build-bot instance. More info can be found at http://ci.apache.org/buildbot.html

    Futon¶

    • Added a button for view compaction.
    • JSON strings are now displayed as-is in the document view, without the escaping of new-lines and quotes. That dramatically improves readability of multi-line strings.
    • Same goes for editing of JSON string values. When a change to a field value is submitted, and the value is not valid JSON it is assumed to be a string. This improves editing of multi-line strings a lot.
    • Hitting tab in textareas no longer moves focus to the next form field, but simply inserts a tab character at the current caret position.
    • Fixed some font declarations.

    HTTP Interface¶

    • Provide Content-MD5 header support for attachments.
    • Added URL Rewriter handler.
    • Added virtual host handling.

    Replication¶

    • Added option to implicitly create replication target databases.
    • Avoid leaking file descriptors on automatic replication restarts.
    • Added option to replicate a list of documents by id.
    • Allow continuous replication to be cancelled.

    Runtime Statistics¶

    • Statistics are now calculated for a moving window instead of non-overlapping timeframes.
    • Fixed a problem with statistics timers and system sleep.
    • Moved statistic names to a term file in the priv directory.

    Security¶

    • Fixed CVE-2010-0009: Apache CouchDB Timing Attack Vulnerability.
    • Added default cookie-authentication and users database.
    • Added Futon user interface for user signup and login.
    • Added per-database reader access control lists.
    • Added per-database security object for configuration data in validation functions.
    • Added proxy authentication handler

    Storage System¶

    • Adds batching of multiple updating requests, to improve throughput with many writers. Removed the now redundant couch_batch_save module.
    • Adds configurable compression of attachments.

    View Server¶

    • Added optional ‘raw’ binary collation for faster view builds where Unicode collation is not important.
    • Improved view index build time by reducing ICU collation callouts.
    • Improved view information objects.
    • Bug fix for partial updates during view builds.
    • Move query server to a design-doc based protocol.
    • Use json2.js for JSON serialization for compatiblity with native JSON.
    • Major refactoring of couchjs to lay the groundwork for disabling cURL support. The new HTTP interaction acts like a synchronous XHR. Example usage of the new system is in the JavaScript CLI test runner.
    apache-couchdb-1.6.0/share/doc/build/html/whatsnew/index.html0000644000175000001440000007411412332105765024105 0ustar00djcusers00000000000000 14. Release History — Apache CouchDB 1.6 Documentation

    14. Release History¶

    Previous topic

    13. Contributing to this Documentation

    Next topic

    14.1. 1.6.x Branch

    Utilities

    More Help

    apache-couchdb-1.6.0/share/doc/build/html/whatsnew/0.8.html0000644000175000001440000004636112332105763023304 0ustar00djcusers00000000000000 14.11. 0.8.x Branch — Apache CouchDB 1.6 Documentation

    14.11. 0.8.x Branch¶

    14.11.1. Version 0.8.1-incubating¶

    Build and System Integration¶

    • The couchdb script no longer uses awk for configuration checks as this was causing portability problems.
    • Updated sudo example in README to use the -i option, this fixes problems when invoking from a directory the couchdb user cannot access.

    Database Core¶

    • Fix for replication problems where the write queues can get backed up if the writes aren’t happening fast enough to keep up with the reads. For a large replication, this can exhaust memory and crash, or slow down the machine dramatically. The fix keeps only one document in the write queue at a time.
    • Fix for databases sometimes incorrectly reporting that they contain 0 documents after compaction.
    • CouchDB now uses ibrowse instead of inets for its internal HTTP client implementation. This means better replication stability.

    Futon¶

    • The view selector dropdown should now work in Opera and Internet Explorer even when it includes optgroups for design documents. (COUCHDB-81)

    JavaScript View Server¶

    • Sealing of documents has been disabled due to an incompatibility with SpiderMonkey 1.9.
    • Improve error handling for undefined values emitted by map functions. (COUCHDB-83)

    HTTP Interface¶

    • Fix for chunked responses where chunks were always being split into multiple TCP packets, which caused problems with the test suite under Safari, and in some other cases.
    • Fix for an invalid JSON response body being returned for some kinds of views. (COUCHDB-84)
    • Fix for connections not getting closed after rejecting a chunked request. (COUCHDB-55)
    • CouchDB can now be bound to IPv6 addresses.
    • The HTTP Server header now contains the versions of CouchDB and Erlang.

    14.11.2. Version 0.8.0-incubating¶

    Build and System Integration¶

    • CouchDB can automatically respawn following a server crash.
    • Database server no longer refuses to start with a stale PID file.
    • System logrotate configuration provided.
    • Improved handling of ICU shared libraries.
    • The couchdb script now automatically enables SMP support in Erlang.
    • The couchdb and couchjs scripts have been improved for portability.
    • The build and system integration have been improved for portability.

    Database Core¶

    • The view engine has been completely decoupled from the storage engine. Index data is now stored in separate files, and the format of the main database file has changed.
    • Databases can now be compacted to reclaim space used for deleted documents and old document revisions.
    • Support for incremental map/reduce views has been added.
    • To support map/reduce, the structure of design documents has changed. View values are now JSON objects containing at least a map member, and optionally a reduce member.
    • View servers are now identified by name (for example javascript) instead of by media type.
    • Automatically generated document IDs are now based on proper UUID generation using the crypto module.
    • The field content-type in the JSON representation of attachments has been renamed to content_type (underscore).

    Futon¶

    • When adding a field to a document, Futon now just adds a field with an autogenerated name instead of prompting for the name with a dialog. The name is automatically put into edit mode so that it can be changed immediately.
    • Fields are now sorted alphabetically by name when a document is displayed.
    • Futon can be used to create and update permanent views.
    • The maximum number of rows to display per page on the database page can now be adjusted.
    • Futon now uses the XMLHTTPRequest API asynchronously to communicate with the CouchDB HTTP server, so that most operations no longer block the browser.
    • View results sorting can now be switched between ascending and descending by clicking on the Key column header.
    • Fixed a bug where documents that contained a @ character could not be viewed. (COUCHDB-12)
    • The database page now provides a Compact button to trigger database compaction. (COUCHDB-38)
    • Fixed portential double encoding of document IDs and other URI segments in many instances. (COUCHDB-39)
    • Improved display of attachments.
    • The JavaScript Shell has been removed due to unresolved licensing issues.

    JavaScript View Server¶

    • SpiderMonkey is no longer included with CouchDB, but rather treated as a normal external dependency. A simple C program (_couchjs) is provided that links against an existing SpiderMonkey installation and uses the interpreter embedding API.
    • View functions using the default JavaScript view server can now do logging using the global log(message) function. Log messages are directed into the CouchDB log at INFO level. (COUCHDB-59)
    • The global map(key, value) function made available to view code has been renamed to emit(key, value).
    • Fixed handling of exceptions raised by view functions.

    HTTP Interface¶

    • CouchDB now uses MochiWeb instead of inets for the HTTP server implementation. Among other things, this means that the extra configuration files needed for inets (such as couch_httpd.conf) are no longer used.
    • The HTTP interface now completely supports the HEAD method. (COUCHDB-3)
    • Improved compliance of Etag handling with the HTTP specification. (COUCHDB-13)
    • Etags are no longer included in responses to document GET requests that include query string parameters causing the JSON response to change without the revision or the URI having changed.
    • The bulk document update API has changed slightly on both the request and the response side. In addition, bulk updates are now atomic.
    • CouchDB now uses TCP_NODELAY to fix performance problems with persistent connections on some platforms due to nagling.
    • Including a ?descending=false query string parameter in requests to views no longer raises an error.
    • Requests to unknown top-level reserved URLs (anything with a leading underscore) now return a unknown_private_path error instead of the confusing illegal_database_name.
    • The Temporary view handling now expects a JSON request body, where the JSON is an object with at least a map member, and optional reduce and language members.
    • Temporary views no longer determine the view server based on the Content-Type header of the POST request, but rather by looking for a language member in the JSON body of the request.
    • The status code of responses to DELETE requests is now 200 to reflect that that the deletion is performed synchronously.
    apache-couchdb-1.6.0/share/doc/build/html/whatsnew/0.9.html0000644000175000001440000006070712332105763023305 0ustar00djcusers00000000000000 14.10. 0.9.x Branch — Apache CouchDB 1.6 Documentation

    14.10. 0.9.x Branch¶

    14.10.1. Upgrade Notes¶

    Response to Bulk Creation/Updates¶

    The response to a bulk creation / update now looks like this

    [
        {"id": "0", "rev": "3682408536"},
        {"id": "1", "rev": "3206753266"},
        {"id": "2", "error": "conflict", "reason": "Document update conflict."}
    ]
    

    Database File Format¶

    The database file format has changed. CouchDB itself does yet not provide any tools for migrating your data. In the meantime, you can use third-party scripts to deal with the migration, such as the dump/load tools that come with the development version (trunk) of couchdb-python.

    Renamed “count” to “limit”¶

    The view query API has been changed: count has become limit. This is a better description of what the parameter does, and should be a simple update in any client code.

    Moved View URLs¶

    The view URLs have been moved to design document resources. This means that paths that used to be like http://hostname:5984/mydb/_view/designname/viewname?limit=10 will now look like http://hostname:5984/mydb/_design/designname/_view/viewname?limit=10. See the REST, Hypermedia, and CouchApps thread on dev for details.

    Attachments¶

    Names of attachments are no longer allowed to start with an underscore.

    Error Codes¶

    Some refinements have been made to error handling. CouchDB will send 400 instead of 500 on invalid query parameters. Most notably, document update conflicts now respond with 409 Conflict instead of 412 Precondition Failed. The error code for when attempting to create a database that already exists is now 412 instead of 409.

    ini file format¶

    CouchDB 0.9 changes sections and configuration variable names in configuration files. Old .ini files won’t work. Also note that CouchDB now ships with two .ini files where 0.8 used couch.ini there are now default.ini and local.ini. default.ini contains CouchDB’s standard configuration values. local.ini is meant for local changes. local.ini is not overwritten on CouchDB updates, so your edits are safe. In addition, the new runtime configuration system persists changes to the configuration in local.ini.

    14.10.2. Version 0.9.2¶

    Build and System Integration¶

    • Remove branch callbacks to allow building couchjs against newer versions of Spidermonkey.

    Replication¶

    • Fix replication with 0.10 servers initiated by an 0.9 server (COUCHDB-559).

    14.10.3. Version 0.9.1¶

    Build and System Integration¶

    • PID file directory is now created by the SysV/BSD daemon scripts.
    • Fixed the environment variables shown by the configure script.
    • Fixed the build instructions shown by the configure script.
    • Updated ownership and permission advice in README for better security.

    Configuration and stats system¶

    • Corrected missing configuration file error message.
    • Fixed incorrect recording of request time.

    Database Core¶

    • Document validation for underscore prefixed variables.
    • Made attachment storage less sparse.
    • Fixed problems when a database with delayed commits pending is considered idle, and subject to losing changes when shutdown. (COUCHDB-334)

    External Handlers¶

    • Fix POST requests.

    Futon¶

    • Redirect when loading a deleted view URI from the cookie.

    HTTP Interface¶

    • Attachment requests respect the “rev” query-string parameter.

    JavaScript View Server¶

    • Useful JavaScript Error messages.

    Replication¶

    • Added support for Unicode characters transmitted as UTF-16 surrogate pairs.
    • URL-encode attachment names when necessary.
    • Pull specific revisions of an attachment, instead of just the latest one.
    • Work around a rare chunk-merging problem in ibrowse.
    • Work with documents containing Unicode characters outside the Basic Multilingual Plane.

    14.10.4. Version 0.9.0¶

    Build and System Integration¶

    • The couchdb script now supports system chainable configuration files.
    • The Mac OS X daemon script now redirects STDOUT and STDERR like SysV/BSD.
    • The build and system integration have been improved for portability.
    • Added COUCHDB_OPTIONS to etc/default/couchdb file.
    • Remove COUCHDB_INI_FILE and COUCHDB_PID_FILE from etc/default/couchdb file.
    • Updated configure.ac to manually link libm for portability.
    • Updated configure.ac to extended default library paths.
    • Removed inets configuration files.
    • Added command line test runner.
    • Created dev target for make.

    Configuration and stats system¶

    • Separate default and local configuration files.
    • HTTP interface for configuration changes.
    • Statistics framework with HTTP query API.

    Database Core¶

    • Faster B-tree implementation.
    • Changed internal JSON term format.
    • Improvements to Erlang VM interactions under heavy load.
    • User context and administrator role.
    • Update validations with design document validation functions.
    • Document purge functionality.
    • Ref-counting for database file handles.

    Design Document Resource Paths¶

    • Added httpd_design_handlers config section.
    • Moved _view to httpd_design_handlers.
    • Added ability to render documents as non-JSON content-types with _show and _list functions, which are also httpd_design_handlers.

    Futon Utility Client¶

    • Added pagination to the database listing page.
    • Implemented attachment uploading from the document page.
    • Added page that shows the current configuration, and allows modification of option values.
    • Added a JSON “source view” for document display.
    • JSON data in view rows is now syntax highlighted.
    • Removed the use of an iframe for better integration with browser history and bookmarking.
    • Full database listing in the sidebar has been replaced by a short list of recent databases.
    • The view editor now allows selection of the view language if there is more than one configured.
    • Added links to go to the raw view or document URI.
    • Added status page to display currently running tasks in CouchDB.
    • JavaScript test suite split into multiple files.
    • Pagination for reduce views.

    HTTP Interface¶

    • Added client side UUIDs for idempotent document creation
    • HTTP COPY for documents
    • Streaming of chunked attachment PUTs to disk
    • Remove negative count feature
    • Add include_docs option for view queries
    • Add multi-key view post for views
    • Query parameter validation
    • Use stale=ok to request potentially cached view index
    • External query handler module for full-text or other indexers.
    • Etags for attachments, views, shows and lists
    • Show and list functions for rendering documents and views as developer controlled content-types.
    • Attachment names may use slashes to allow uploading of nested directories (useful for static web hosting).
    • Option for a view to run over design documents.
    • Added newline to JSON responses. Closes bike-shed.

    Replication¶

    • Using ibrowse.
    • Checkpoint replications so failures are less expensive.
    • Automatically retry of failed replications.
    • Stream attachments in pull-replication.
    apache-couchdb-1.6.0/share/doc/build/html/whatsnew/1.0.html0000644000175000001440000006240712332105764023275 0ustar00djcusers00000000000000 14.7. 1.0.x Branch — Apache CouchDB 1.6 Documentation

    14.7. 1.0.x Branch¶

    14.7.1. Upgrade Notes¶

    Note, to replicate with a 1.0 CouchDB instance you must first upgrade in-place your current CouchDB to 1.0 or 0.11.1 – backporting so that 0.10.x can replicate to 1.0 wouldn’t be that hard. All that is required is patching the replicator to use the application/json content type.

    • _log and _temp_views are now admin-only resources.
    • _bulk_docs now requires a valid Content-Type header of application/json.
    • JSONP is disabled by default. An .ini option was added to selectively enable it.
    • The key, startkey and endkey properties of the request object passed to list and show functions now contain JSON objects representing the URL encoded string values in the query string. Previously, these properties contained strings which needed to be converted to JSON before using.

    Warning

    Version 1.0.4 contains important security fixes. Previous 1.0.x releases are not recommended for regular usage.

    14.7.2. Version 1.0.4¶

    HTTP Interface¶

    • Fix missing revisions in _changes?style=all_docs.
    • Fix validation of attachment names.

    Log System¶

    • Fix file descriptor leak in _log.

    Replicator¶

    • Fix a race condition where replications can go stale

    View System¶

    • Avoid invalidating view indexes when running out of file descriptors.

    14.7.3. Version 1.0.3¶

    General¶

    • Fixed compatibility issues with Erlang R14B02.

    Etap Test Suite¶

    • Etap tests no longer require use of port 5984. They now use a randomly selected port so they won’t clash with a running CouchDB.

    Futon¶

    • Made compatible with jQuery 1.5.x.

    HTTP Interface¶

    • Fix bug that allows invalid UTF-8 after valid escapes.
    • The query parameter include_docs now honors the parameter conflicts. This applies to queries against map views, _all_docs and _changes.
    • Added support for inclusive_end with reduce views.

    Replicator¶

    • Enabled replication over IPv6.
    • Fixed for crashes in continuous and filtered changes feeds.
    • Fixed error when restarting replications in OTP R14B02.
    • Upgrade ibrowse to version 2.2.0.
    • Fixed bug when using a filter and a limit of 1.

    Security¶

    • Fixed OAuth signature computation in OTP R14B02.
    • Handle passwords with : in them.

    Storage System¶

    • More performant queries against _changes and _all_docs when using the include_docs parameter.

    Windows¶

    • Windows builds now require ICU >= 4.4.0 and Erlang >= R14B03. See COUCHDB-1152, and COUCHDB-963 + OTP-9139 for more information.

    14.7.4. Version 1.0.2¶

    Futon¶

    • Make test suite work with Safari and Chrome.
    • Fixed animated progress spinner.
    • Fix raw view document link due to overzealous URI encoding.
    • Spell javascript correctly in loadScript(uri).

    HTTP Interface¶

    • Allow reduce=false parameter in map-only views.
    • Fix parsing of Accept headers.
    • Fix for multipart GET APIs when an attachment was created during a local-local replication. See COUCHDB-1022 for details.

    Log System¶

    • Reduce lengthy stack traces.
    • Allow logging of native <xml> types.

    Replicator¶

    • Updated ibrowse library to 2.1.2 fixing numerous replication issues.
    • Make sure that the replicator respects HTTP settings defined in the config.
    • Fix error when the ibrowse connection closes unexpectedly.
    • Fix authenticated replication (with HTTP basic auth) of design documents with attachments.
    • Various fixes to make replication more resilient for edge-cases.

    Storage System¶

    • Fix leaking file handles after compacting databases and views.
    • Fix databases forgetting their validation function after compaction.
    • Fix occasional timeout errors after successfully compacting large databases.
    • Fix ocassional error when writing to a database that has just been compacted.
    • Fix occasional timeout errors on systems with slow or heavily loaded IO.
    • Fix for OOME when compactions include documents with many conflicts.
    • Fix for missing attachment compression when MIME types included parameters.
    • Preserve purge metadata during compaction to avoid spurious view rebuilds.
    • Fix spurious conflicts introduced when uploading an attachment after a doc has been in a conflict. See COUCHDB-902 for details.
    • Fix for frequently edited documents in multi-master deployments being duplicated in _changes and _all_docs. See COUCHDB-968 for details on how to repair.
    • Significantly higher read and write throughput against database and view index files.

    View Server¶

    • Don’t trigger view updates when requesting _design/doc/_info.
    • Fix for circular references in CommonJS requires.
    • Made isArray() function available to functions executed in the query server.
    • Documents are now sealed before being passed to map functions.
    • Force view compaction failure when duplicated document data exists. When this error is seen in the logs users should rebuild their views from scratch to fix the issue. See COUCHDB-999 for details.

    14.7.5. Version 1.0.1¶

    Authentication¶

    • Enable basic-auth popup when required to access the server, to prevent

      people from getting locked out.

    Build and System Integration¶

    • Included additional source files for distribution.

    Futon¶

    • User interface element for querying stale (cached) views.

    HTTP Interface¶

    • Expose committed_update_seq for monitoring purposes.
    • Show fields saved along with _deleted=true. Allows for auditing of deletes.
    • More robust Accept-header detection.

    Replicator¶

    • Added support for replication via an HTTP/HTTPS proxy.
    • Fix pull replication of attachments from 0.11 to 1.0.x.
    • Make the _changes feed work with non-integer seqnums.

    Storage System¶

    14.7.6. Version 1.0.0¶

    Security¶

    • Added authentication caching, to avoid repeated opening and closing of the users database for each request requiring authentication.

    Storage System¶

    • Small optimization for reordering result lists.
    • More efficient header commits.
    • Use O_APPEND to save lseeks.
    • Faster implementation of pread_iolist(). Further improves performance on concurrent reads.

    View Server¶

    • Faster default view collation.
    • Added option to include update_seq in view responses.
    apache-couchdb-1.6.0/share/doc/build/html/whatsnew/1.1.html0000644000175000001440000004337312332105764023277 0ustar00djcusers00000000000000 14.6. 1.1.x Branch — Apache CouchDB 1.6 Documentation

    14.6. 1.1.x Branch¶

    14.6.1. Upgrade Notes¶

    Warning

    Version 1.1.2 contains important security fixes. Previous 1.1.x releases are not recommended for regular usage.

    14.6.2. Version 1.1.2¶

    Build System¶

    • Don’t ln the couchjs install target on Windows
    • Remove ICU version dependency on Windows.
    • Improve SpiderMonkey version detection.

    HTTP Interface¶

    • ETag of attachment changes only when the attachment changes, not the document.
    • Fix retrieval of headers larger than 4k.
    • Allow OPTIONS HTTP method for list requests.
    • Don’t attempt to encode invalid json.

    Log System¶

    • Improvements to log messages for file-related errors.

    Replicator¶

    • Fix pull replication of documents with many revisions.
    • Fix replication from an HTTP source to an HTTP target.

    View Server¶

    • Avoid invalidating view indexes when running out of file descriptors.

    14.6.3. Version 1.1.1¶

    • Support SpiderMonkey 1.8.5
    • Add configurable maximum to the number of bytes returned by _log.
    • Allow CommonJS modules to be an empty string.
    • Bump minimum Erlang version to R13B02.
    • Do not run deleted validate_doc_update functions.
    • ETags for views include current sequence if include_docs=true.
    • Fix bug where duplicates can appear in _changes feed.
    • Fix bug where update handlers break after conflict resolution.
    • Fix bug with _replicator where include “filter” could crash couch.
    • Fix crashes when compacting large views.
    • Fix file descriptor leak in _log
    • Fix missing revisions in _changes?style=all_docs.
    • Improve handling of compaction at max_dbs_open limit.
    • JSONP responses now send “text/javascript” for Content-Type.
    • Link to ICU 4.2 on Windows.
    • Permit forward slashes in path to update functions.
    • Reap couchjs processes that hit reduce_overflow error.
    • Status code can be specified in update handlers.
    • Support provides() in show functions.
    • _view_cleanup when ddoc has no views now removes all index files.
    • max_replication_retry_count now supports “infinity”.
    • Fix replication crash when source database has a document with empty ID.
    • Fix deadlock when assigning couchjs processes to serve requests.
    • Fixes to the document multipart PUT API.
    • Fixes regarding file descriptor leaks for databases with views.

    14.6.4. Version 1.1.0¶

    Note

    All CHANGES for 1.0.2 and 1.0.3 also apply to 1.1.0.

    Externals¶

    • Added OS Process module to manage daemons outside of CouchDB.
    • Added HTTP Proxy handler for more scalable externals.

    Futon¶

    • Added a “change password”-feature to Futon.

    HTTP Interface¶

    • Native SSL support.
    • Added support for HTTP range requests for attachments.
    • Added built-in filters for _changes: _doc_ids and _design.
    • Added configuration option for TCP_NODELAY aka “Nagle”.
    • Allow POSTing arguments to _changes.
    • Allow keys parameter for GET requests to views.
    • Allow wildcards in vhosts definitions.
    • More granular ETag support for views.
    • More flexible URL rewriter.
    • Added support for recognizing “Q values” and media parameters in HTTP Accept headers.
    • Validate doc ids that come from a PUT to a URL.

    Replicator¶

    • Added _replicator database to manage replications.
    • Fixed issues when an endpoint is a remote database accessible via SSL.
    • Added support for continuous by-doc-IDs replication.
    • Fix issue where revision info was omitted when replicating attachments.
    • Integrity of attachment replication is now verified by MD5.

    Storage System¶

    • Multiple micro-optimizations when reading data.

    URL Rewriter & Vhosts¶

    • Fix for variable substituion

    View Server¶

    • Added CommonJS support to map functions.
    • Added stale=update_after query option that triggers a view update after returning a stale=ok response.
    • Warn about empty result caused by startkey and endkey limiting.
    • Built-in reduce function _sum now accepts lists of integers as input.
    • Added view query aliases start_key, end_key, start_key_doc_id and end_key_doc_id.
    apache-couchdb-1.6.0/share/doc/build/html/whatsnew/1.2.html0000644000175000001440000005366412332105764023304 0ustar00djcusers00000000000000 14.5. 1.2.x Branch — Apache CouchDB 1.6 Documentation

    14.5. 1.2.x Branch¶

    14.5.1. Upgrade Notes¶

    Warning

    This version drops support for the database format that was introduced in version 0.9.0. Compact your older databases (that have not been compacted for a long time) before upgrading, or they will become inaccessible.

    Warning

    Version 1.2.1 contains important security fixes. Previous 1.2.x releases are not recommended for regular usage.

    Security changes¶

    The interface to the _users and _replicator databases have been changed so that non-administrator users can see less information:

    • In the _users database:
      • User documents can now only be read by the respective users, as well as administrators. Other users cannot read these documents.
      • Views can only be defined and queried by administrator users.
      • The _changes feed can only be queried by administrator users.
    • In the _replicator database:
      • Documents now have a forced owner field that corresponds to the authenticated user that created them.
      • Non-owner users will not see confidential information like passwords or OAuth tokens in replication documents; they can still see the other contents of those documents. Administrators can see everything.
      • Views can only be defined and queried by administrators.

    Database Compression¶

    The new optional (but enabled by default) compression of disk files requires an upgrade of the on-disk format (5 -> 6) which occurs on creation for new databases and views, and on compaction for existing files. This format is not supported in previous releases, so rollback would require replication to the previous CouchDB release or restoring from backup.

    Compression can be disabled by setting compression = none in your local.ini [couchdb] section, but the on-disk format will still be upgraded.

    14.5.2. Version 1.2.2¶

    Build System¶

    • Fixed issue in couchdb script where stopped status returns before process exits.

    HTTP Interface¶

    • Reset rewrite counter on new request, avoiding unnecessary request failures due to bogus rewrite limit reports.

    14.5.3. Version 1.2.1¶

    Build System¶

    • Fix couchdb start script.
    • Win: fix linker invocations.

    Futon¶

    • Disable buttons that aren’t available for the logged-in user.

    HTTP Interface¶

    • No longer rewrites the X-CouchDB-Requested-Path during recursive calls to the rewriter.
    • Limit recursion depth in the URL rewriter. Defaults to a maximum of 100 invocations but is configurable.

    Replication¶

    • Fix potential timeouts.

    View Server¶

    • Change use of signals to avoid broken view groups.

    14.5.4. Version 1.2.0¶

    Authentication¶

    • Fix use of OAuth with VHosts and URL rewriting.
    • OAuth secrets can now be stored in the users system database as an alternative to key value pairs in the .ini configuration. By default this is disabled (secrets are stored in the .ini) but can be enabled via the .ini configuration key use_users_db in the couch_httpd_oauth section.
    • Documents in the _users database are no longer publicly readable.
    • Confidential information in the _replication database is no longer publicly readable.
    • Password hashes are now calculated by CouchDB. Clients are no longer required to do this manually.
    • Cookies used for authentication can be made persistent by enabling the .ini configuration key allow_persistent_cookies in the couch_httpd_auth section.

    Build System¶

    • cURL is no longer required to build CouchDB as it is only used by the command line JS test runner. If cURL is available when building CouchJS you can enable the HTTP bindings by passing -H on the command line.
    • Temporarily made make check pass with R15B. A more thorough fix is in the works (COUCHDB-1424).
    • Fixed –with-js-include and –with-js-lib options.
    • Added –with-js-lib-name option.

    Futon¶

    • The Status screen (active tasks) now displays two new task status fields: Started on and Updated on.
    • Futon remembers view code every time it is saved, allowing to save an edit that amounts to a revert.

    HTTP Interface¶

    • Added a native JSON parser.
    • The _active_tasks API now offers more granular fields. Each task type is now able to expose different properties.
    • Added built-in changes feed filter _view.
    • Fixes to the _changes feed heartbeat option which caused heartbeats to be missed when used with a filter. This caused timeouts of continuous pull replications with a filter.
    • Properly restart the SSL socket on configuration changes.

    OAuth¶

    • Updated bundled erlang_oauth library to the latest version.

    Replicator¶

    • A new replicator implementation. It offers more performance and configuration options.
    • Passing non-string values to query_params is now a 400 bad request. This is to reduce the surprise that all parameters are converted to strings internally.
    • Added optional field since_seq to replication objects/documents. It allows to bootstrap a replication from a specific source sequence number.
    • Simpler replication cancellation. In addition to the current method, replications can now be canceled by specifying the replication ID instead of the original replication object/document.

    Storage System¶

    • Added optional database and view index file compression (using Google’s snappy or zlib’s deflate). This feature is enabled by default, but it can be disabled by adapting local.ini accordingly. The on-disk format is upgraded on compaction and new DB/view creation to support this.
    • Several performance improvements, most notably regarding database writes and view indexing.
    • Computation of the size of the latest MVCC snapshot data and all its supporting metadata, both for database and view index files. This information is exposed as the data_size attribute in the database and view group information URIs.
    • The size of the buffers used for database and view compaction is now configurable.
    • Added support for automatic database and view compaction. This feature is disabled by default, but it can be enabled via the .ini configuration.
    • Performance improvements for the built-in changes feed filters _doc_ids and _design.

    View Server¶

    • Add CoffeeScript (http://coffeescript.org/) as a first class view server language.
    • Fixed old index file descriptor leaks after a view cleanup.
    • The requested_path property keeps the pre-rewrite path even when no VHost configuration is matched.
    • Fixed incorrect reduce query results when using pagination parameters.
    • Made icu_driver work with Erlang R15B and later.
    apache-couchdb-1.6.0/share/doc/build/html/whatsnew/1.3.html0000644000175000001440000010437212332105765023277 0ustar00djcusers00000000000000 14.4. 1.3.x Branch — Apache CouchDB 1.6 Documentation

    14.4. 1.3.x Branch¶

    Warning

    1.3.x Branch is affected by the issue described in CVE-2014-2668: DoS (CPU and memory consumption) via the count parameter to /_uuids. Upgrading to a more recent release is strongly recommended.

    14.4.1. Upgrade Notes¶

    You can upgrade your existing CouchDB 1.0.x installation to 1.3.0 without any specific steps or migration. When you run CouchDB, the existing data and index files will be opened and used as normal.

    The first time you run a compaction routine on your database within 1.3.0, the data structure and indexes will be updated to the new version of the CouchDB database format that can only be read by CouchDB 1.3.0 and later. This step is not reversible. Once the data files have been updated and migrated to the new version the data files will no longer work with a CouchDB 1.0.x release.

    Warning

    If you want to retain support for opening the data files in CouchDB 1.0.x you must back up your data files before performing the upgrade and compaction process.

    14.4.2. Version 1.3.1¶

    Replicator¶

    Log System¶

    • COUCHDB-1794: Fix bug in WARN level logging from 1.3.0.
    • Don’t log about missing .compact files. #06f1a8dc

    View Server¶

    Miscellaneous¶

    • COUCHDB-1784: Improvements to test suite and VPATH build system. #01afaa4f
    • Improve documentation: better structure, improve language, less duplication.

    14.4.3. Version 1.3.0¶

    Database core¶

    Documentation¶

    Futon¶

    HTTP Interface¶

    Log System¶

    • COUCHDB-1380: Minor fixes for logrotate support.
    • Improve file I/O error logging and handling, #4b6475da
    • Module Level Logging, #b58f069167
    • Log 5xx responses at error level, #e896b0b7
    • Log problems opening database at ERROR level except for auto-created system dbs, #41667642f7

    Replicator¶

    Security¶

    • COUCHDB-1060: Passwords are now hashed using the PBKDF2 algorithm with a configurable work factor. #7d418134

    Source Repository¶

    • The source repository was migrated from SVN to Git.

    Storage System¶

    • Fixed unnecessary conflict when deleting and creating a document in the same batch.

    Test Suite¶

    • COUCHDB-1321: Moved the JS test suite to the CLI.
    • COUCHDB-1338: Start CouchDB with port=0. While CouchDB might be already running on the default port 5984, port number 0 let the TCP stack figure out a free port to run. #127cbe3
    • COUCHDB-1339: Use shell trap to catch dying beam processes during test runs. #2921c78
    • COUCHDB-1389: Improved tracebacks printed by the JS CLI tests.
    • COUCHDB-1563: Ensures urlPrefix is set in all ajax requests. #07a6af222
    • Fix race condition for test running on faster hardware.
    • Improved the reliability of a number of tests.

    URL Rewriter & Vhosts¶

    UUID Algorithms¶

    Query and View Server¶

    • COUCHDB-111: Improve the errors reported by the javascript view server to provide a more friendly error report when something goes wrong. #0c619ed
    • COUCHDB-410: More graceful error handling for JavaScript validate_doc_update functions.
    • COUCHDB-1372: _stats builtin reduce function no longer produces error for empty view result.
    • COUCHDB-1444: Fix missed_named_view error that occurs on existed design documents and views. #b59ac98b
    • COUCHDB-1445: CouchDB tries no more to delete view file if it couldn’t open it, even if the error is emfile.
    • COUCHDB-1483: Update handlers requires valid doc ids. #72ea7e38
    • COUCHDB-1491: Clenaup view tables. #c37204b7
    • Deprecate E4X support, #cdfdda2314

    Windows¶

    apache-couchdb-1.6.0/share/doc/build/html/index.html0000644000175000001440000002652312332105766022247 0ustar00djcusers00000000000000 Overview — Apache CouchDB 1.6 Documentation

    Apache CouchDB 1.6 Documentation

    Welcome! This is the documentation for Apache CouchDB 1.6.0.

    Meet CouchDB

    Getting started

    Reference Documentation & Advanced Topics

    Links

    Utilities

    More Help

    apache-couchdb-1.6.0/share/doc/build/html/_images/0000755000175000001440000000000012332106072021635 5ustar00djcusers00000000000000apache-couchdb-1.6.0/share/doc/build/html/_images/intro-why-01.png0000644000175000001440000006223312332105522024526 0ustar00djcusers00000000000000‰PNG  IHDR*OąŚ pHYsgŸŅR cHRMz%€ƒł’€éu0ź`:˜o’_ÅFd!IDATxŚģ½{pSgž&üźblć‹L‚cKv÷6īŽ*œN§Éd¢ł!ā  ŁķvƒĮąt:—ĻU/)>°Łl” ½^/=Ö‘Ų·oŸĻē›…å„—^ZVļa9Ćėõ¶““ƒĮeuÕŚ„wI‹„»» Ļ©Žįpx½^I’ģv;7†z<Y–AV«Õf³ŻŃ8ĪŖÜr C*,¤ ƒi p8šjŲl6ž»|Æ×ėt:±Kä*^–åH»­b ƒė²Ūķ‘ā;ņŅųÉćBN,‘ye’āŖ=ƒĮn·‹ž+‡WĮYv»=X­V~±~3i0°q °ŁlÜT …\.—Ēć …BйåēĘ''ˆpœę_“}˲ģr¹$IŠó ąG€$I8[ŏFŵX,ģˆ_ …B‹…;fā_Zœƒ“I|(’Óćń8ĪP(d2™°VÜ5‡Ć …"5Č8Ļ›āQ‰3“.— ?ł¤Y–ł…+N[üó®ž1w§Ó‰»ƒĒ>ž3†»ÉoŸĆįĄ#ē.“’ I ¾µµµų†æ‹/ĀöĶŃŃŃ!Ś@EÆC"vOŃrŚßߏ?[[[§¦¦źėėł¬vuuÅ’]~ž‘NžcŒ$ҬYVV¦Ų†Ūs£^·s`ūXóėŖ;::Äķ®ž+üō°£^Æēr“tü[ Óé¢īé1ās+žŸģ(ĪP__½Z[[#÷Rܿȣć»ĒŸœ­^ÆĒ]ĘɈ·8ź³뱉j²ś čõz\µ8 /½ō’xpN×ßß/^ö5›Ķ ’Aüē#žLVWWĒzŅÄ1õ‘ĘŸwõŒ‰G/9Ī3yćß儁%Å/½ōÜł»Š—°¬¬¬«« OŽģŲŃŃŃÕÕÅÅ1Üų| Źnžˆą1ĀWÕÕÕSSSxČōz}WW>ėtŗØBPqĢ‹/ā³^ÆēÉüJĶf3ĶųĖõŅśūūł„éõśĘĘFŠX¬yˆÅøœźźź®®.!ŖÜŌétõõõ\(ˆ—#Šæų·QģuńāÅĘĘFüŗāĀł»]__Ļ?‹/¹N§ėččąā¢'©8įČIØ­­ķźźźččąG4ք(„ Ī<ņ‰ÅŽq.-(d7—’āW/^äĖ—źźjžčāqU°]$ÄŽqQg’_Qcc£ųΊļ‘N§3›Ķ[H„īųŒŻøqƒ‡Btttˆaqž±®®.ž„˜Ķfܑųw™ų yć‹8pيūĒ;1fąĘüYW¬ŗŗŗnÜøŃ%@üVü, Ź—^zI|įÅw Gąē‰o|Ą‰…”ųnG„„7nš5 āżŒ¼“8b%źĘQł@”#qdīB"—ēąĘŚ„‹/F•}ųi[‹²€ĻŲH܋‹†XQ1żżż\Xˆ74քšk)++ż@žņu .?“Q/Mq .^¼ČŸIS¼Rž€q^ĮZ„Ÿ Ö¶\¬+$,.JĮ‰øć3Ɵ+ĢN B?ž3^’.S|QŅ”¬¬ ̲°ż‰F@ŽaOÄæ‹eÕŖUūöķ‹ćVŖ’’Źćń@ßÄį}²X,ܕ #·3Š®‚²²²ØvX¾ ø±ĢŁš‘˜Ķ樆ŚD.mvć•`Œ¹ŻnńJ#”8+ü©¼ćOĆŌy‡C’¤‡~Xōó“‰œ:Æ×‡¹ć„;Ęq™pXĘ CQQQ[[Ū,&D“\óėœzi ŲķvžLĀŅ iĖ/Ņ īžŠ&ņXĘņXÄŽytńėüGń”»»;ąÅ±Z­wk‘æć3ĘOÉårĮłĮSLl¬glv=ł““xÉ+++Ćį°Ėå²ŪķÜ„¬x!,K8Öėõ‹%rž„ń•÷Ws÷š×ėå5ČF§Ó™L&N<‰?Źsˆ/móy>ŸÆ»»ļĘģ²fńÓ\¶““`±ļńxxæŻQ}ļ\®A“Ż-dY~ā‰'øä’ą„š;f ƒMMM ^š¢ÜÄo!ŒĻ$d«Ļēóz½øp<“qęgK\uŌĒ@¼¹æäČ©ž…x™“Ēžų`Aƒ‹t:]8F2-Æ­­oĀ ‰¼^Æ×ė%ŒL&SdüŁl„Ća¼iŻŻŻŲ,‘hłF‚—6‹łģAßjii ‡Ć‡ƒcĢßyŠāó„—^Bøš‰Č2³Ł,Ž#$HBX$ʲģp8D>˜Ż„čõz1B i±.-źŅGńä755q!åp8š'ę$Ė;2P"t5kDZ•ļsõŲ,(L&_ā%į¹*1 ³Xa-9ĀWjŠ šāń߅=„k—‰¼–<^V–e«Õė%'aIuĮ’Ņų^³›I’)ėółųśnśĮ,~š’\¤mø\.‹Å"ž˜8ó‘•?p³ąkĀ!šc4ījBpļńÕø1‹@F\`8öz½0•••ł|>½^U|“ ×ŠåI1Ī󦹤X3‰#šÅ³Łl2™°†ƒIGń0`2gMü’£VŻø+ c®{āƒ…Į`Ąsފ¦¦&D ³™fl†²_0äŽo«ÕŹ-ä0!ī9AĮ§`Qü™“Z­øj}˜p4»ŻŽŌŌ‡QĢb±8\N0“Z­³¾6›Ķét†Ćažī …l6Ūļß „„é xTīż±Oj,½üƒČ>1¾˜E °SŖ'Rw…ĖV1āGŒDʤ‹Gćoo¬"E¢ĒBŚ(Ę䈳 ŲL}yiŠc£nģĮcKų ( ¼(3“)^iā· Īü(ņ3Ä«ć#<‚^į ā±.¢1Oøāī‹Ūˆ‘”wœØ“I “&Ī„E>6±^„ŁšųN18Rń»:gN™ėy‹5K‘3©Č’ą»ßøqCLMĄøĀĀõ OäiimmUd!®/ž^йR¼Ī‘wyi`)č|­‡å·±@ń4™LČ{ÄjŃ`0p“NGG2=B¦h䣢µµ5š5ĻCWC]]]Q³ń Š+‚:`”†­Éf³E]±J’„DÓ@ ³’-ć_Nģāŋ ,/>PÄ­:Ī%ßƇ@ > ”€÷Fy±~'@ø#Č@ ʖX?@ įž@ž!UAĘŽä„J„JÕ3§GŠ@H] ÷7i™ Yō!õČ@ń/±B’0ųo*²ńzd055599É?¢ |ØÕj|Ą īKŖ°Ł‹„T"ŠĄääääääÄÄÄä HKXt&P©TF-€§ %~@ ¤˜fš7ó7@@įL@”°šdĄ{蔇Č@«ÕjµZĶ Ōj5W’ŸH? Rƒ€‰‰‰ōōtšdƏ~ō£æū»æ»ļ¾ūV¬X‘6×’_K > R†&&&&&&233cb÷ĀbĮėõīŪ·Ÿæóļ¼śź«kÖ¬IŸøA”($3+½ˆ@H2)ƒTĮ;y——7::śį‡ž—’ņ_^|ńÅŅŅŅĢĢLxw¦¦¦ŅŅҦW߂“99)ņ“ „T¢D’:TTTōŁgŸķٳ緿żķšššĶ›7æųā‹/æüņ믿ŻžÉi˜!> R†JDS‘„(..%ŒŽŽŚķö7ß|sxxxddä‹/¾ųꫯ@ 0÷%3%©¤"$-²³³=ŗeĖĘŲįƇ9J…–pėÖ­$§ņ©D ’ä°Ūķyyyķķķ7oŽ“Ūķ÷ߤ„ˆ%•/ō!õ“B2ćg?ūY}}=cģ7æłĶ3Ļ<388ČŻ _}õÕ­[·`;ā$‘<4O|@ sŒżčG‡ŹŹŹŗråŹĻžsÆ×;22"RĀųųøH IĀōā0÷(--=tčP^^ŽŠŠŠ¾}ūŽ~ūm‘’3čˆų€@ ęÅÅÅ---:ś’ć¼łę›įpęä :"> „łBvvö”C‡tō÷’÷’ų’˜ĢAG_D óK v»=++ėŌ©So¼ńĘõė×Ċå,i‚ŽH? „yĒĪ;yŠŃßüĶß$tD|@ KbŠQ}}żƒŽžˆaĄƒŽ®\¹²oß¾‹/&UŠń@ ,Ä £æżŪæEŠŃĶ›7AG‹B ā° ˆtJė”.|ŠÅĀ"P‚ŻngŒ={AG[aó.x tDś@ ,ģv;:Ŗ««ä© ‘ęŠˆaŃš£żØ””]¼xQ‡Ź)aBQ‰a1±iÓ&‡ŗoß>Æ×55A$ƒy¢ā@XdŸ8qAG’ķæż·ł—į¶#PĀÄ”ĀāAG7n=räČkƽ¶šAGā,”pąĄÄ”žć?žć’üŸ’“§&pJ@ń»yņ0BA :śÆ’õæ"č(VY‹¹„ā@H.š £¾¾¾½{÷~ųᇱ(anƒŽˆ!é ķܹ32u>‚Žˆ!!V:Z˜ #ā@HR¬[·īŠ”CF£qa‚Žˆ!y‘żw÷w tD|@ ɻݾcĒ6ĻAG␨®®®ÆÆēAGstD|@ ©±ćęĻ~ö³9:"> „”"ččWæśÕB*A :r8’ņ/’2WAGābƒŽžžļ’>NŠŃ]Qń@ ¤$Ä £^xįŽƒŽˆ!U #ĘŲļ~÷;t$v܄¢ FÅaā@HaüčG?jii‰t$j ńā@Hm:tH :ā毾śŠ{˜ļH ā°¤(”±±1jŠŃ=ĢⰐ}ōčQtō’šĆĆĆ###_|ńE‚” „I$„%»Żž——×ŽŽŽŃŃqóęĶśśśx€[ŠŅÓÓ±™F£aŒ©TŖ©©)•JEś@ ,Aüģg?ć7÷īŻ‹8Ō8†#Ņan0::Ś×חT§“nŻŗ;vœ8qāŹ•+?’łĻ›››ĖŹŹš•jjµšWTsŲ‹™@ ̰ޛ˜˜ūņĖ/׬YĆę“‹:aÖšx<•••ÉžF£±„„%777'''+++333##C«Õj4°ų€ō@˜%L&Suuu(JŚ3 …B>ŸobbbddD­Vk4ķ ŌjµZ}›Ė€ų€@ f I’dYN~ fbbāęĶ›Z­6--mŊiiiiiiZ­Ŗ'÷*“?™@ –8&&&¾ųā d,+ŅӘ`{$ż`Y#Ž š‡ „TĒää$˜ąėÆæŽģ¤Ę_vāƒåN‘#<ä€X@X2/žŲŲļ–å`rrR!ˆ–ˆņĻ¢ō’&ųģö\ŗB:Adeq3āƒåČÜhØų ŗD Ā’Į¤€X…Ɖ–>ˆ.£©Ū'ć½÷ŽcŒFD"«%KF>p&€„(ÄK‡bq·āiĄįwŽyūķ·ßyē¾¾¾p8œ››ūo’öo’$if Õjcœh¶ „„j3 >X‚7U”€ 8 ÜøqƒĄ;ļ¼£8ģššpggēü據ÆP÷ŠTa HųżŃˆRžb‚&''ƒĮąŪoæżŽ{ļ½óĪ;~æ_NK^Æ”`±X|>ĘŻnwkk«‚“¢¶RY†ĄfĀ 8ŽyēäqĢE%Fļ¹?žń………b7%ĪØeÄØ‡ZźČ8ʘÉdĀÓ`0@”ĄFÆ$I XĆr߀Ēにר [..!ųøÅ#Ȳ H’˜AĶfƒŠdĮ`0Ø×ėķvū¾}ūZZZÄÅ»,Ėz½Žd2y<Akk«Żn÷ł|.—Ėf³‰v$H’²²2>"Ė2ˆ$ aneYöł|‡jĻēÓét@Ąét6559ŽÅē…XTü»ä9€ąĪ€«WƂzzz"E%ĘŅņĶ‹č ˜JĖ+ĄõW…ØS`ŊZ­–s€Z­ūē+$-ąNØ­­•e9Cŗy½^—ĖÕŅŅĀėźź²X,N§ŽøqC\ē2ĘöķŪǤv»K]ž²Ą£€ĻŲĢårŁķvüVSSSmm­ĖåJ‰¹{¦¦&… la·ŪG8–e+śP(äv»ėėėłff³Łf³É²ģv»eY¶Łl¢2„¹Ėå*++3 .— “ęp8$IŚ·oØ\ ž¶X,MMMQIkAł –4E)įŽĪÅõršūżēfé (Ś`Dr@28fcycG>žų㯾śź«Æ¾śņĖ/‘ž¦ÕjĮØhÄ+žņRwägNf“µµéõzĘX8öł|ĒjµBŽĆŲ ”c6›%Ir8 ƒśśzĒćółģv»Åbµ¾ nkk…] Ø««cŒUWWĆøŃÖÖf³ŁRBK€@T€ q &“©»»›ū ²!ß1Č7s»Ż ·×ėÅ”ø ų|¾—^z‰ļn6›±;nLU\Ÿƒ¶‡¹]4>P¬ŽEĪ” „XĘ®8U"¦¦¦Ī –•“‹AÉé ˜µ~€UĻ7222222ŅÓÓÓŅŅ ÷'&&ŅŅŅxĆŌ¼ć„ˆ ’:Īėõʲ a C¹N§ ‡ĆC¢ĮėŁ²²2§Ó)ĖņOģ„Óé"kōƒ©©)Y–žóŸC©YžČ[_0Ć)ą ˜­Š°Łß{īąĮƒQæżŽ÷¾÷ė_’:--M«ÕjµŚ©©)p7%+$!`mP,š- Ö°”P/µÕj ü³ø’õx< >€,ò.I’ Ōx“Œ$Iąƒ%9«¢±(ˆŅ_a,Šæ£ĶfŪ·oī ō¼Ećqįģõz—!¤®3`Ö×ėļ=ėŪ÷ßdd=sV¬X!zHEH-€ŗ»»±ŚÕétpŠĘ’}±ÖČ¢æöŸĻæÅ҆h,Jću:]TcQü_AŠQGG‡Ćįšł|prĢSJ`¢ö"^³ēٚ=Ļ%•hę<æłó6ĄŌŌ›šłēSPšņžšīł÷ß½šž»ēæø9¢X#/gĄ¬MFo½ńŹŖµėžß]ūrt«r¤ūr¤UŁ9ŗŒ¬ģ§’ś»Œ±p8ĢKŸr2ąRRV«‚rmM: Q;IŻYŠŗxljĘ"¬ÜžŽØqD\Ž+ŌƒĮiq2™Lø/µµµŲ·²²ę»y 1JŌ^oAR@l˜bSĀ’&§¦ŲäŌäŌäŌäūæ?’‡ßŸ’Ż \¼ qI:fk/Ŗ`ŒŻųüśÄÄÄÄųŲÄųųŖœĪÜżP(“råJ< ܗ@Õ,RQŅA„a„ĮÄ„ü Ü#)Ó- ä¢*¹ōł|Üp“4fIt“ą_„ĀX„…ČĶš'\ō¢±H–eŃXd2™ŚŚŚÄŻu:$IpBšDńī,2,ź;Æą€Ūu‚čįÉ©©É›Ćį÷žżwĻ>ü ’ ż—°3`ą½q}ū!ÓÄÄŲäųųäÄųäÄ6‡Ć覙6Ź^NQ”„„b²F’$Čt$p'AdN¬ĶfC\¦Żn£8N«Õźół‚Į Õj…æ!Ģ_°ü‚ĶR[[›,Ė<+ĶjµF*UŅõx<@@LRćŖ€^Æē#”PØ»»[¤Øk gQugć€qčyAķE‹DÅō L±X04pķļž’÷ēƒü ųĒÄ#ņ¾1ĖÄ0; 7ΧWū‹6'ĘĒ'&6Ķ###*•*--÷Ģį‘fD©‹Å‚ØS½^ĻŖN§F‰U«Va¤ŗŗ:Қd0›ššĀį0bµZņ§Ün7Ļ`ˆ«šB°ŪķmmmüŠjkk “DšÄåƒĮ¢¢"L)'BD)”v»ļĮ`0TWW»Żī‡~#ˆ#B\ww7’ ”„Ķ_É m|&P°Ā¢pĄ7Ÿæńą„&#ß’Óg·I·™¾1ĖŠ0; 7ĪąÕ~‹Ęg(ߎŽŽ¦„„edd a7$’É( °+ž”$ rél±X0"Ź‹ÅĀ]—:Īf³ńGŲŌįpX,ŌēįńKHvƒz£„V1TƒĮ€9 A˜č:˜ Y–BY’$Y–‘½Q]]ĶÓŠ€Į`ą™įœD߀T>Y– ƒÓéÄ|Śķv$…ąvŌÖ֊ nsUœ×˜{’ĒĒĒoŻŗõæž×’:räČ\ū“ļč ą\4u{†Ų7Ī€ąߏt“3`Öø>puē£?`Œķ|”9['åJ÷åH÷eēJū’ldŒ>|X’¤Õ«WÆ^½ś¾ūīÓétŁŁŁHMą±F„¹\%MMMMMMLLŒ}łå—kÖ¬!^D D¤üģŽp%Qļö·*++õzż®]»šę®Y³fõźÕ’$åäädffŠoīŻÕ«˜Pź‘įÉ©I65us8ōrĢ?xoœąĒß~Ølb.åq|{ėÖ-4ÉI­lDa®€Ņ÷h©KĪK[°z׳w¼’īł?üžBšļ“3`Į€Ž8žl»&ǧł@ĢN§>9ĀRĀ]šĮŻæłwå ˜ńLNȰŲ@oœOÆöOūĘĒ'füÉbé*°Lł q`³u’ųAŌģ°yj"OˆōĘłō“ĄäÄ8ĻBąw‘ĢDńA"pwĪ€Ą‡ļGĶƒ39bt“¼7ĪēŸ dfē€D>˜­ŹH –ܓ3 ’Ć÷?x÷B,g@Q‰‘ĀÉōĘłÓgƒł†oO|ćO&{°Üł@X~£$ī €ĖPTb$‡p²½q>½ŚoüįęH{)©ōD›“@Ä_ņŽj‰ƒ·oć;ĪÉYń2t—ē˜¢YЧx•8rĢ!®\eŒĶ‚o‡c-žŁTõŲkĶ\zć|z­:Ž4Ā@·,„įr¹šššęä>z½ŽŹŹJ“ZK|/•J…¼čīīn³ŁŒ~ńsrV(•±Tėl/Df&óČĀ©©©É‰ rĢ!n‡ķ?­¼f,ß|ØÕųŽķĒŸzżxŽśĀ¢ć…Ī3Y9ŗ9äܬŃįpųß’¼2+{|| ćd/"ĢÕBé¾^Æ×b±ŲķöT鬹Œų@tr&ąńęl:]y Ī€Ą‡ļ’įŻóä øGp=©’’?Īf}½=§^?>:ŽTµuŪS»cY9ŗŃ‘įžĖž”Į«Œ±Ń‘9īNŽ8śl ożƒÜ@ńEĘXQQQcc㜘›L&/Ó¬&(śČƒĘĒĒQÆ|ą’·s×? Ęr—);lvʙN÷Éёį+—ś¢2čY¹½åĄ^|ö÷ž»rÉoo~Q”Œ±Ń‘įĻIĢ!ø aĆ_ü`BČGć‹ˆ– ŠėtnĶĒ /Vʁ>č»ÉĖņ ¼O(r8Üv/˲ĖåBø8ŽI’"{m”>(‡FQX–$Ir:'źOø\.—Ėe±Xxż%Æ×‹ā?v»gˆ£™L&Tā£Ē@I¢Z011Joæżö¹sēc¼{įażXZ^Q“ĮHŁa÷,y7wŗOBÖ÷_ņ·;2:ŽńüAŲ®\<žä®Ń‘įN÷ÉN÷É-Öķ„åˆ eŒUUoŸū5ą#cŒ»D{QŅ4Ć Ģģv»Ēćq:(^ ɈA‡Ća·ŪĄĖØ9§Óép8Šwd€…æÓé“X,¼„ZTė“Ų=@=mš’Œó4™Lv»Żf³y<Ø "®dx½^Ēc³ŁĄdØFnĄ ņx<²,£ä=Qōƒ©©©7n\¼x±»»ū·æżķŪoæ-ng”rĢ­~0£œģæ°H¬#ø\.ĒƒĪ0w%‘ÅßāŸE‹“XÓ»„„=jÄę”bōQāT“¼ģEbQUõv*×®vŗOöõöģxž`āys8Ü~ģp’e?,l‡źk1ŽPg}õWæ_—_ČWś;ž?øiĖÖёš…Ī3Cƒ×Ο=ĶŅPgxŗšęp˜»śzĻĶap‘ "lę½qDż@Œ7£Gb šd+žå}øī„t9[YYg‹Åb³Łf‘ø8ųł|>ŸĻ»›é !nCˆb/šœœü«æś«ś§Z—_0ņe ąBē™öcGcż—üwäƒöc‡ūz{6Umå† ļ9h]Y9:Œ“;bo~¹T°ü0ʶToǟż—żHĄ^[¬ŪEc]vīō ďMš5ŠKŒŒ1ōĘQŲ‹Äā¦Ä K÷~[ć'% †…¬üLv”;B­øżSSSŒ±+ó#_R W.õµ;ܼ÷éę½OŸzż82æų’<ź]øŠ]®\ź›±šœ;ńāžĖ~¾#c¬¾łåęV9+'—[~ĕ>clӖ­ÜFT“Įˆ-óņ `_Ā8_ƒ6pzs­T0Ę®ėU(ō"ƒ”L+hg†M&Āoī„oū½aNĄÆØ¬¬lŃO&•ų€Ū‹¾÷½ļq!µlqžģé?ž¾ż§UķĒŽ\čžä.¬ĮGG†O¼x rI~ؾ¶żŲ‘³ī“Lˆź›^õO’‰ž¦ŖĒD”ĻŁBTś/ūQ»BĢ/«ŁóčĮß{®żŲ‘žĖž¬œÜ”«Œ±ĒŸÜżĻē>:ńėwēÉŪKųógƒųSŃ ‡”ƒ”śō¶µµqwquuµĆį@ti}}½Į`@hSSRˆÅŽæZĒ7æ8Nä#{ąnĻÓjµ¢³ĶfÓéī.vN’$Dįbcv»Ż`0šØ'ŖfŃėUlŚ“é׿žµæ÷ܲ (ā’ŗØÄˆ(Ļ?žžŠą5Ųō‘Ø9¾iĖVt—„ˆ’&RH)ńĻįhœ-¶=µ[į ę‡mس¢CclSÕVØ-ov•ŪūzĻeåä—7VmE€é|g~—;ŻģÓ«ż‘ö"āƒT’°Z[[¹”GŠ%¶§±FŠŽńŲ…/· Ccc#ģNāg“É„<$©)Ž5½YAl’ĖåBŠ*Ž)nė³Ķf3 ^Æ×…Ė”$Éćńx<Æ×‹KcIÜ·r± ³‘yĆī’żæ’wSSÓĘŖĒ޾¶l§¦ž'•š÷žņĪk?vnäęV™Ķ„śŌģy¶fĻsΆgźüegqIióާAŚ_W )ć€W²rrŪ÷1cl›q-LC-ovõõöą°<ˬhƒ±¹U^Ü\æ+—śģ?­JKOūśk¼lėÖ­{ą|šĮx`͚5’$­\¹2==wå¦÷jnŽåÆēš5kłš Óee„^Æßµk—$I«WÆ^³fĶźÕ«%IŹÉÉÉĢĢLKKćoī7ö"•øśSŁ„ĢĶś÷`'Ł,Z~¾1%å䖮n*ŁRį3€ˆ»D 7lj¦'¾es«¼ćłƒ;ž?øčdĄfz〠X“žÉ$˜„„„’@„R©ÕźĶ›7³?gŠ^Ų”ś§a֏uss8Ü×Ūõ2E±~}ąźYł$c,o}lhܚϢų n‹RŠ'Ń ”•“;4x5;Wēüeē)’ēÅ%„ŪžŚ½ķ©ŻIRÄ(䢣ЉčU¦·ˆ@X‚|0­2ØÕjµś/’ņ/Y*Gq)ĢĖ?Dā¬Ü¾óŃļ7ŌYw>śgĆ3±„`ū±#;ż¬ł;ž?©=ĄgĄ§K@ź‰d īB@øźćOīvž²³żwcÆätŲϜ3›ńpŹKœ4Ķ#<ĀWø©‚+—śx6ÆńöU9ōQW8ötˁ½£#ƈ§ģtŸT—²suų Č[_°æ„§(Vż«¶Ā Ō~ģ0?(XØśĄ•‰ā’Ņż-mÆžź÷pSgēź’ßiG? “°łn@N ›6mb)åBxõ öŸVļ<ƒ?E«żł³§gō€ļó Z”ŖŖŽ~ā×ļn¬zŒ1Ę3Ī"å`żĮ£'~ż.'ƒČU’ėv®LŖÆ…ŗĄŁbŪS»š[å>÷7mٚZU@ÄŚ…`‚ńńq"aiņ‚ 4 \ó”õ:˜©ŻÓ×ŪÓ~ģ°ø*o9š ĀuFG†ķ­‘Ōēcėņ cč0:2¬°• ?ǵīŲ8“[•“ ‡šž–6č ˆ%M钱Ü>ĘķE\Q DeĀ’*ߑ~ÅdōŻļ~—„ˆ ”Æ·'+GMCµżŲ‘+—śøĖŹŃķoi= ^óģĪŹ'wüųū¼NœĀŁ P¢ZQx¤PĆŃן­?xōÕ_½ ‡š¦-[—L[®"Lk‘(I é,±ˆVĖm~\.Wd ¾P(„¤Ø»Äźė§ßÜģ»|Ąƒ?Y£ŃlÜø1–(L6œzż8/ ·¾ fϳyė ¹ŪbݾiĖ֚=ĻāO$`u?4xmhšZŽś‚Ŗźķ;ž?Č×ųwGµ›mŖzģń'wÕ<š·¾pę‡j¶Xk–dk nćóDJ 9›B|Ąk|Ę烦¦¦eȼ—×,ĖŖU«*++‹ŠŠęĘ7v:*•źį‡Np\q#$Izųį‡y«†ųć m¤r ŗ”].Wœųœ{ĮĶįš…ĪÓ}½ēÖåŌģy.‘]®\m?vdhšjŃcĶžēD±»„z{VŽ&£Uį€ŠHq±_ĆOFYl;IźN_øŖ0śoڲUō(,mšŁūśėÆEż€›ŒČXDHi„B!‹ÅāółcMMMØ“qT@ņł|Į`wóx<ūöķcŒéõśDĘæeµZĆį0¶©««³X,ƒ!Öų"č ‚Z­Fˆ‘~BŒ²su-övŗOž?{&‘ķÆ\ź³’“²Ó}Ņß{ī­7^iسŠŽM[¶Ś›_Ęg~¼L^Š8Ÿ-3„åN½žŹĶį0ź’F毕–WĖ7?žä®ež¶šŁūóŸ’ 2@cmJL#, 8NŸĻ§×ė;:::::x14Ōōz½Œ±`0ˆ%?ŹiŌÖÖāĻ`0ˆ>£±ĘV)}^Uēˆ:¾˜ö"N «V­ŹĻϟ?“QŌBĶ7‡ĆÆž¢a]µ³įŃŠhoķčȰ±|32ś/ūßzćųØ0ń Cߦ-[±}§ūäĻ6{ē£?h?v$2ÄhŪS»µŗw¾ŠL}0]įp˜«¢K™Ść¤.jŲ” ±h»Ąøhø°Ūķ’$ .ęP3 īSŚ’ĘC­$ćb«5¾ŗgŒ¹Żn J’Ł ˆ5.S'ö¤Ć6±Ę“@ †»ęÉ„¬į‡Ehē£ßėWü½ē:Ż'ķ?­]ø ŪNĶžē¶=µşO½~üŽŒØ$q۟ū[^ Po¬zl’Ńז¤õN€¬4Q?PøˆRč/ļńxŚŚŚDŃ/˲×ėµŪķuuuܰŽõ2ŚŁc0 rdŌä¾ÓéŒ_ÄĶ>&“‰;wz½ŽXćQ¹M¬ńE汊‘F£A¼éŹčöcGFG†³rrkö< GOßs_q’%’©×£ŠdEīČĘq!Ąbo~ł”’sT‰h8śšhOˆzæžżß’kœķŅ)Ē’$™L&³Ł,JC‡Ć!Iā‘Ą(*I’Żn‡Ć\EƒN§ss®$étŗp8\YYµ£2fĄl6K’ÕÓ …b+FÄõš?Ē_0(żÉSSS‘.„yŹJ‹,)‡pUõv8„A:OēĶŲjŠ~Č[_ H ą10ī“ČŲb­A­Ph ėņ å›óÖnŗ=ŽhŁ–õ¾+Ą34xmhhh͚5œ YTß45~ ½—Üžc6›±ų ‡ĆÜlņėc§ō  ĒcµZƒĮ`KK »Żv/Ėrww7hc ?1ķEą½^Ÿ““3½qDÆܒs¾óL©ŠUęń'wķoiCÅrž÷n?väŌėÆ`Uk,ßĢIµŗķĶ//Ÿø łP>’üóH—2ł“Szi,Ś@¢"źāw‰µCĆ†ŚŚZĘXKK æŽP(¶«®®ŽÓ2!–ū$·J¬†?wŪh¾ų Ā…pn~äK”šŅPÖå‚-ś§M=Ó[Öģyy^×®FÖ%ŻńüAl™·¾޾‡0½ös”ŅmĘė1Ń^DĐBšz½MMM²,;Ī… mLN 1יøź‡ĖŹŹøs%*+ ĻhŌqňŁlŽŗM¬ńÅä1 2ź[—2$8ēž¼üé”1ĘŲ¶'§KJŲZ‰†õ;żģK įP«ū”’óæ~—8`īõ¹#ōƒÉÉÉńDÖ:„‰J!ˆ1-q¬I‹²‰KI .™yąČ܃Ā=Ģn·ݤŕ>b‡°1LI˜ŸXć^Æ@łˆ¢guœńEÖøÉˆ»”ēɅ pš¢7$c ½éQ‚bŗóš–­° ^CĆzĘXŖŌVZ2˜ī36ö§?ż‰ū“ń/‘Aꮈ¹åGaU`0h2™@ 9…Į„IJ,©TŖ'žx‚1V[[‹ģb$—…Ćį‡~ eø`Ar:ˆLÕėõųkÜįpøŻnø[°Mww·ĶfgÄ_4>³Ņ`22§ĖžĢGo^nhąclcÕcž'^<Š~ģš…ĪÓl¦”4cĢŽürs«üų“»P[‚—Œ&,$@įŸ}öĢDccc‘ö"B’Ć2—ĖeµZu:"ī–n›Z,³Ł ”ęt:ŪŚŚģv»Õj­­­]J|`0Ģf³N§Óét­­­XČĒqŲķö²²²p8 ķ[™bcnńÆÉdŖÆÆgŒµµµ1ĘĎÓQĒ ŖČw«¼ÉÉɱ±±ÆæžśęĶ›’é?ż§ŽŽŽśƒG·Xkęü mŠĻŹķ-öņo³rr_żÕ»”<8õśń/ųÖ·¾õųćÆ_æžĮ\æ~}^^ŽŖU«²²²ŠEY­VS”Ńbū'Q 0 ƒĮE&“ %L&S(ņz½&“ *‚;\.—Édā[8ęŅą\7a"™ƒ‹ieY­V…ąŽ…BPø Čėõʲ,ŽÄŸµ,ńžÉŚųö"īBčķķķė=7·|påRßYł$Ȁ‡Šn±Öäåž•O ^--ÆxüÉŻDIø>ūģ3n,ÓD—2QBr®‚#—œƒAa—$ ’12ŠŌ`0(b.£3E”Į|b“āĒy&‡ų[Q%~¬ń€6ą}† ½3ē܅pźõWøC˜eŒ•–WP^XŅ·ftt4Æ[·Ž{•…Œˆ ©ˆ”N©»wD/b·GM»”ēŗ7zŃl¬z¬¹U¦„€ĀĄÄ#r)KDbą½6lŲĄęŗQĶžēØJDźŖ<ÄHA 4?Āä&D–——³éC˜ż B”DMT&n –(zć€ę)K™Zą¾ųā …~@µ+„„ĘÜČMFÓ.åłé•FH-šŽ8WÆ^‹bD ¤@¬z×ĖZ?`·g„I’ōĄ02Ķ Æ·§żŲįżuÕ5|k^>\ŹCCC¢½ˆzg¦ŠĆ@‘eynĖvĘŖüĢe®ĆįHĪęĢ.—«²²rĮ~.V{ƒn{ˆ¬ Ńh~šƒ°yė“ąE^Ūnسž?{¦hƒ±žąĖĖp*ąR¾zõ*\ŹcccŠDer!$-šššŅßįp455ĶįOŲl¶8ō@ ©©)9ł€·ż¹£– Š2€b<źīG’¤‡~XŃ~.ÖųĀ@{ĒkęYiėׯg3Ķč—®\ķtŸģėķļIŌĘņ ʎ“¼Łµle ²Ņ>łäh0‰.eF)iI `šł|”PˆW.ByEóÅ^ŠÜŚų@A‹”›‹Å‚©hjjņz½w›qłL„ēB”ÕjE«ä`0XWWg±Xu|ńõž…ĄƒKY­V³eąR†!ØyļÓųóBē™öcGŠ6Ńt €Ž8Œ±žžžH“y’0Dčõz¾žõx<(³G”&vāŻ,KʵĒq:>ŸOÆ×wtttttÜńü» K(³TVVĘæÜ×årAčŌCE\¬ń¤°q2€–Ą×zóŌgŃqVnßf\ C„_ļ|”M0Čæ]Ī@Ōi0›Wȅä0™L"(Vż(lĒėR ŖVżX2c«R©¬V+ÄVÓ^Æ]Ę\._\;ƒĮ I’Ķf‹dTIĀ·‹;'˜›ĶfĮ9…Bčj‰]Ąø‘ūŠ5Ęń/öŠ5ž| °q>X*ĀĶįšł³§_żECżO*¹*€ņŚ’|7»āWN]—_ČŪńćļo3®­’IåR%Čų@oœO?żT” !É”Óé,‹Č ™Įm·Ūa61 Ö6› ĮwćĘ ¢»»ŪjµĀ¾P®rĶėõz<ž¶¶¶Hƒ8,K@`Ńł€w;øŪų"ńŚŚZ±:¬×ėu¹\±4*ØbųEģ¹kT_ŪŁæiĖc¼tRV®Ž1¦(Ÿ‡ĄŹėWūz{Är?¹«¾łåż-mŒ±†:ė|Or@s ƒqBŒˆ ’S9€”< Įy ąˆxčpoņn-‹²ŽįpH’d·Ū»»»¹ŌCm…½Ūb±ąč·¬8™īīnč‹^Õįpčtŗp8\YY™xׁP(„ŚŌ\ŸąpźźźŠA!rÆ`0؁†k|Į MP?å©bts8<:ĘZ>bm[Į;ŌźŃzAŠĆĪG€?yŃo®@Ė+v>śżSÆ_nĶŠgtdx``ą¾ūīćö"±–ł““ ¼ė–N§ƒ¬×ėõųWTPr™Ek€#„B!ŽPŒ‹¼Xk|ŌӎźÆ6›ĶčŽ¼čRaé²Z­Į`°„„…%f»Ē,”FœN'&Ēét†Ćah?©ņx$oŹf¼Nęåp_o A?Ūüķ–Ļܕ€cŒ9žŁ_Wżź/ø6°æ„ķ”’ó>÷QUõö–{źQv®ĪX^±<3õąBčļļW2"—rņ&#H@n£ą_űžóˆLä1˜Ķęųżā!īcÉDČS4²OĶÉėõÖÖÖ2ĘZZZ‘ćą ‘”E9| ¹4x¤_4>ˆŌ’ME€3ąüŁÓųóŌėĒ;Ż'7my¬¹UVh±ĀEŒėņ Š6;Ż'ꬠŌ^ĶĪÕŁ›_Ī[_pV>™ąŃ–< f]¹rEt)‹&#²%3Ą¬Æ0Ō8NÆ×ėõzćgØyÄ BE`’,ĖN§3Ŗ I’Ēć1 IŸ*IW īȁ@ń©Q#±N¤VIEqʓK?ˆĢŖčK—ņ©×C8T_Ė—ķÅ%Ę¢cĶžēā”MĶĖ/ģæäÆyä[یk›÷>ĶU–7»jö<·ó…ęęV¹’²Ÿ·gWÄCƒJŻčB發õ…ĖP¦Ą…šé§ŸŠśAd ßääƒīīīȾfh”gÉWq/bĄL| ·P7ńÓø£ Ģ”×ė£Jm~|ėõz­V+<źĮ܂gĖM?‡ĆŸž¹rJ…+’ˆb3.I’øč‡ˆ—$ ėYquĢ3× Üõz=×ā'%ˆ;F]n‹_-® A–墢"•JõÄO0Ęjkkļx>`;…óĘ"›Ķ†”ļśśzL‚Ćįp»ŻŲśDww·ĶfC Vüńdį±°>o(ū!clhšŚÜöƹ#œ Ļ@čæģēö™ułył =AW.õʼnƒ*.)ŻöŌīŅņŠ-֚żG_ėæģēę&…°SŅ…ĪÓ|¼åĄ3-žÉ[_čüeWTÆõr }üńĒžän ¶’īc’/„垎sü±Åbįś7Ńü$œN'—Ėbü ¢b Ż.^¼ˆ w¼¦“Æ×ĖÅĶ#m #]]]Üøa³ŁĄ4ø„ õč%Iššš‚"¾Sz`·ŪyĀ]"Éø įŠļźź‚©GQŽ1 Éf³É²¹YŌńdį±}&cL­R~kƇ}ļöĶ\øźļķéė=ēļķŁöŌīmOķŽÜ&;W—•›±8­8öĢ©×Ž„7V=¹Ÿ·¾ĄłĖĪā’ŅėWķ­mس¾ś«w/tžn9°×X¾¹“¼bcÕcŠćˆÖč=o½q¼’²Ē 184x1¶ćłƒ6SX§ūdVNī<>õƒ ʎ FöJ{)Sģi’@1¢ ?ĒéóėOEĮ`ą4 £‡bćEĻ<ˆsńõ‰Ø‹÷X9ɒ$)\ōqęyį™ą.ōƒŪŽd•zƒé‡’*·ßc–ņõ«Y9:ݟ•“k,ÆŲöŌīHa=£D»¼z¾óōŠĄµöcGĄM7ėņ ÷mŪłč.tžŽXµõ”æ&֙ō_öo{jžüŁęoƒTö·“qÓPĆŃ×ę|źQ)/+GWU½}ē£ßĻ[_ŲŁ?4x­fĻs©„0Ę>ūģ³›7oJ’+E™Č€*śÓr¾|ķŻī R©JŹŹŁl{ćœ•Ū” ^«Łó,d–ķńå`Q‰ńŌėĒ›÷>=:ŽTµ:DŃ#7Ś8ži9°×X^!šņQvmhšš"ėāxhšŚŠĄU”«ć sē/;ŁL.Ā<įÕ_4¬Ė/l?vøØÄčļ=wźõć5{žŪöŌīę½Oćsj=CEŒż—ż}ōŃ<099©č’Fd@ ¤ Ō nĒķE*•*;Wz°ų?° W\øzVnw6<ýµ'^<ŠÉæķ©ŻĪ_vŽ­ą+*1—óÖžxń€³įv{m‰ĻdŒ]č<“ąŃFGĀ uÖöcG¶X·7·Ź|¼ø¤tnÉąępŲŁšLżO* ĻĄ5:2Ü~ģpĶžēµŗkö<;4x ›5{žN‰r ø³ČūĆŹ`pp1&Ņł“ „%؈ė;•J„Öh ¾µį“+ō÷öĉńßńćļ ^ƒ!(kFp•KĖ+‚D‚÷KĖ+ųo—O¼x`ŪS»DĮ&Ž£#·E=õõö ^3F;Éā’R43˜ōõöų{{ŖŖ·ÆĖ/ōé•K}±¬ķQ#‚²suķĒŽ0v4ŠÜ*gēźxÜ*dhū±#5{žŪńüA{ó˱eÖ¹MU[ŁL;³”k£#įśƒGįL^—_«rŃq¾ót,>@ĆĘŖ­Ł¹ŗ›ĆaūO«6V=ęļķŁ$ÄDł{{ņÖ“"‡Ō9ØŒ±M[;õśńH8Ńy`†ē*;Ņ·°&£ėW”‡ł{Ļ)ĀVfē¬}ąĮ¼õ«Ö¬żõ›’Ä3 YYY™™™YYY ƒÜÜ\|ČĪĪĪĢĢĢČȀ¢@d@H!> I˜~ĄT*µZ„V« æõśŌß{.—ūz{śźŖ³rt[Ŗ·Cčo¬z Võ¾ŽžC{Ÿ†=]Ü öōžĖžØéĮٹŗėWO¼x–%JiyE^uÄō=NGœå9ō•¬Ż©×_Ė7_č<³æ„M‘‡Į³ŲĄLY9¹\(Ś`„Õ„øÄŲé>‰+‚#€«^ĻĪ‹tčī[“÷ĄƒŅš¼¼üĀģ\Z­A»T|›‘‘2ČĪĪĪĶĶÕét¹¹¹P²³³³²²222V¬X”Ńh4 Q°”ł@5Ż-M³”ģ‡Žßu÷õöÄZMgåčņÖ®Ė/čėķ9T_‹äN„å;ž?Ųr`ļõ«b„hßr’e? Ė7C"Cį˜ĆM,Ļį8=ßyšGĮ"WąÕ_ż>+Gg’iå‰Ų›_FjndRžĀ̲±jė…Ī3pŠpæ:ģ]ČńVp@s« «Śœƒūc"kČ_ūĄƒŅš¼uė Ņ3WŖÕµF­Vk4Z-žÕh¦H’¤ÓéĄ+W®ĢĢĢĢĢĢ„ÕˆLF„”ƒĖår¹\‹[Y/ų@š'3•Z­VkJŹ~Čā¶ćąś(€?yŊ<ĈGR²,£ŒJ„Ŗ­­Åg«ÕЦ•ŻŻŻmmm^Æ9Ģ(_*Āl6Ūl6Ē£ų**X­V·ŪĶs»Ż.—‹×5ž¬| b*•Z„V«5š‚āļ|Ų÷n’%’ÅYT9ŽŠ=ŖžŽs'^ “éŠŽŚ”ĮkUÕŪ‡ÆnŖŚš·¾š­7^éĘX¾¹’²Ÿ«o½ń Ļ8ßyzSÕ֚=ϊ‘QÜb†\³ģ\ŻŽēŖÆŻ_W]Z^Ń×Ū³æåµ-֚¢c’%żĮ—Årsuć;Ö>šąŖ5yyėĢÖ­R«ÕjF­Öh4ZF£ž–Ż3Bš Ņ8_i8dff‚ ąCFF†D¢ŃĄ¤(ę0’¬!$9<*]—••±™B¤Œ1»Żn0P}Čē󵓓 w“Ų»Ęėõ†Ća±čN§‹SƒČćń@č·¶¶ŚķvŸĻēr¹Ą%QĒ“Y?`*•J­RĮ…šaß»}½ēī(Į‘ŸŒÅēĻžęįŒõĀ «ŒŻ]ĮX¾9²ƒ —[¬5ēĻž>T_k,ߌß:ńāžŁßŪsV> ī[o¼ÆĘŗüBH|ų®#CQÅ_l9šŒæ·§żwoڲµ¹U†2 (6iĻ :Vd¬TC Šhųņ?‚Ņ4Z ¤æö6&Šh4ÓJƒz†ŅÓÓWŠP"@Ō @L؄H²†üĄŖŸ«¼Æƒøŗax½^tå&¦¢¢"6¤„½ÅbAw„ØĄO@ŸeŁķv˲l³Łb'/LwĘQ«‘•öÖÆÄq! ~¦Æ·§żŲcłf.ūz{Š6ÅÅņœ¢ö+JxƒĻŹ';Ż'·Xkøź±.v¾ÜXõj]@š÷öąÜŠJŒCƒW³suUÕŪO½~¼Ŗz; —&’GŽśb+fSĻ-ÄrH«óÖ>Ķ0-śįÖjµj­V«™śZ-FÕų ™žh@­F2Į4¤„„„„„ķ "mDD„T€Ó@¤įž(¾‚Üē]ŅxMļ8æ…\hd<˜L&·Ū‘XćI­Ģx4%¦ædŒ ^SÄq¼õĘqød«Ŗ·£¾clӖ­óŌ8aŗ½ū%qIi’%?L’\jƒ'ÄD6quƐģ\éY—_grĶžgķ?=ŻPgŻ“å±ė׆Æju•”:0Ęv¾Š|W=ڲĆb9¤Õk×>PpGg€`ŗĶ$H-w#ƒET3ńEjµZ„R«ÕjÕL¼)w( ˆ&"& ¤Š’Ģķv[,—ĖYĖr?Ņł×ō†ojj‚©'Ŗó 2}˜c'¹½hŗj…Z£FoœžKžØ|šų“»åEŒ÷’€Žē;O‹y ü«/¼ŗķÉŻ›¶lĶĪÕqQ¹<ćt@ē¹ā’R1Ć@ä Q-0–W\č<}}ąŁuł…×®!Ÿ`]~as«Ü~ģWn0+inÖ»AD:¤ÕyyėLÜ0ķųĘ-¬Õhnć€i5%¤–šUųO„Xņ«Ø¢„ !łĄćń“µµuww›L&téµs½¼^Æ¢K\ ojj …B)TC{Vś<j•Z­‰ßkó{““;¼ķÉŻ‡ZŻČDėėķŁłBs_oOCµŖz; ŲŖÆE‰cyģW°M!ØQCW.ł™aP\R*ņ„Ø YģŠŽŚ¬Ü\1"Øø¤t>!°™Rq±œŅ}k×ęĢŽ0½“$—iÕZ57+©g4•zŚØR©˜zš÷‘rĀŲ“”' ,Uø\.“Éäp8Āį°Õjm56›-ėt:@֛Ķf®O`$ Łl6·ŪĶżĻK•TÓrYisŃ'ĪJ¹żŲįż-ÆA½X—_ŲpōµśŸT^ø:•Ōsā×ļ2ĘźR‰O”…ŁĒX¾™×†C.1›‰tˆ<Į¦kHō0ƊJŒyė ömėtŸ¬ŁóÜ<„ /“3@­Qk“3‰f‚ R«Ō*S«Ō*~oEąŠÉ Ā’‡Żn7™L•••Į`I°!ģĒårEuDŗ|%I²ŪķŲ žgń[½^­‚AM±Ę“]?`*¦V©Ō5ļ’źÜžÜ‰Ō|łŽzćx_oĻŽēÖģyöŌėĒw¾Š\“ĮČ;hn{jWˁ½W.õqĀŗüBŃ4T\bäī1H“ØÄČżį„å›”m”–W€fę¶5Ķ¢8¦ĀpØŌÓÅFŌ*nšim1M‘@K²‚Ā= ī¹QˆėHMPŒsēn\BčŖÉd ƒ¢™·”Ž:ž¼|頚6©Ńē“+ŒZqxõ Å%Ęų1©p\¹äē] Īæ.æšępųPżÓ[Ŗ·Ž g¤<_ņ3Ę6VmelÆæ÷ܶ§vē­/€ż ¦”ógOoڲ5/æ}ćųʍ,–¢Ūb­™óöÅIė ą]±Ł8€Ų€°,ąp8€Į`@ ©N§³X,”Płh:ŽĶĞņÉPjkkE„ZE ĄĘ<īČįp455™ĶfĒƒ¤3Ēšs`”XćI­ØTl #•Z­Ńlų‹Ęļs”óĢŠąµų¢¶”Κ•››•£kس6·ŹÅ%„ż—żÅ%Fh [Ŗ·o±ÖœuŸdBO4qÉOņõ«3KžsXęgåäžzćxQ‰ń¬|2+'īø: ŠĢG°wō_ņG-·Ī€Ū9@Åķ}‘B?A ŸaIĀėõ¼!Yļõzį‡Å¬cH|l/Šģ@ PYY©Š!8O°™"«Õźp8‚Į ōz=TXćÉČĀūÆR©¦xZZį·70Ęātqqž²K!.Q hӖĒ`¹r©Æ’²’ŸĻ}”«Ū_WŻ~ģHĆŃ×øēBēi« ĄL4ć žNČĖ/€'å£!īQ2oē£?ØŖŽ¾Ę<ÉÜ€jāWČĖ[_·¾`Ęz“Ī€Ūåy¢Ā‡1”‹*ź@qø‹y•E2Ž×ėÅWŠ%¼Łl†ŠÆ®®¶ŪķÜs`·Ū»»»ėėėqXY–‡Ūķ®®®ęH±Ę“W?čėķ™šbŒMMMNMNNLŒ6dwźóÖĒ7V=V\Rzs8ÜPgŻXµuŪSxńŖÅaįæ©jė‰Ügåč`Ķę:ŠƔ”·¾ą¬ū$4”kņbéŠ-ÖcyÅčHxnsƒ™ą čæģzķ¼`T©?_’ōß?æ>ķ†W)-9üsŌĮé!ßż!ōU*µŠÆ×…l`‹ž 67Īžj ‘4!¤:$I²X, w1O£noµZ#9ÜÜu{±w¬ÉdŠšĄk<¹ų€æóžŽs±DœruķĒŽdåč`FĢžŠąµöcGx>W󎧔Ė7Ž„‹JŒØrĮƒQhhąŚ•Kž¾Žä @EčtŸ¬’I%clt$ŒC—”¢¶™Ćhī čæäW8„#1vėÖ`šŹ`šŹ{mxN2U¬#,=¤P®ĄBóJ„”įßµk×­[·¾žśėÆfšõ×_ßŗuėÖ­[żżżŸ|ņ‰¢Ņ'Ā:Ņ#·xüÉŻķĒŽ\č<łž·¾žƒi£PŽīÄ/0Žq~$¼ćłƒgŻ'ĻŹ'¹łØøÄŲéf5{žķæģG›9ē€8Ī€¬¬,I’ŠŒŻnXŠØ‘ū¼ŌO¤•_LōZB¹žŸO¹¬R©4 ļ€Ę ‘–@XJˆ_gbYóB¬Zµźæ’÷’>22žĮĶ›7o޼9::śŪßžö“O>‰Ó‡‡ō ś?w#E`ŪS»QźN“źdēźņņ ®\ź«?ųņ[o/ŚšX¤ļ—Ÿ˜ŪĄŠ8Ī€U¦-8·C4§šB‘’ŠŪšƒpĪP~ˆ,‡ę‰ ŌjµV«E;@lr@d@ , >ąĖXF£ÕjW¬X‘™™966655…‘ōōt£Ńų«_ż*Na;^ŖÆoQ“ĮĆ˶§vŸzżųėvPņ‡·=µ»„aos«,Š{Ń*„č*3kÄqhµŚ5kÖ¬Y³fõźÕ:NA A/~PŌöQ7¶ˆ¤KEˆÆ%,ų––†b×\K J –—~ Šƒōōō‰‰‰©©)­V›–––‘‘ńå—_bĮ§7Æ“ÅZ“·¾ą|ēHpī(~üÉŻēĻžiس•‡®ååju—–Wl{jWCuŪS»ņņ ‡®žuŸTDĖ+īhŹ 8®\ņGf‡eeeååå­]»vÕŖU’$EŹq…øUāMQėM”(T84°Ŗ@Ō»ĻķEØlŠʜÄp#z£„„Ļ*•J«ÕNNNNNN2Ę87Ą™™i4{{{cõĘ«Õģy¶åĄ^äõõö arv®®¹UītŸ =łM3]č<ćļķÉŹŃńŚŪžŚ=:Nšjį ørÉ™vß}÷Ż’ż÷ß’}÷Ż—““Uōs¹‘’ņ°®Då‘c¢’€Åī°č¢–S(¬Ąõ¢a¹Ų‹ ¦¦¦ŅŅŅš†£[·n¾ūŻļöööĘéĆ«m±Öōõžkسę­/¼ŠB” „Øī‡uł…qZåÜ1“Īp€Ā°~k×®ĶČȈE¼øæövˆ_‰L źqTØ& $dqMĄÆ€‚ ĀRę„qYĄ×"ōƒ±±±ōōōōōōĶ›7æöŚkq]›;Ż'‘&fo~¹ÆwūŠĄÕU[ē¼źœ¼›ųՊ+|šĮ|pķŚµ‘Ņ?ŖÜŅŅŅ_),E¢J”p D6ˆ”žI.Rŀ(<QŪ„%n/āҊKŗÉÉÉ“““‰‰ wų׿×,noœiOņL™£Ņņ 6wIĀqœ¹¹¹ėÖ­[·n7ęˆ€?!ńq9¼ķ—Ų’+’"Uųz@R9fA Lč ą<2ĖĀ^ÄU|˜šš‚łH£ŃLLL@"LNN–——Ć…•Ćsrźqœyyyz½žžūļ—$)ŖżG\ų‹ 2A,õv§єš n‹z„a)ėbb’¬Ąyb||ü‘GéķķżyåR›):4kÄi"_XXXXXX¹re,ˆ*ż#µ;źqŚĀ,V–Ą³Ā’!90{ōƒH¹éłŠC±…ŒP¶Øhƒńn•ƒ›ĆįžĖžØ}cŅÓÓ ļæ’~½^o0"=Qõ€Ø4Ē% ČS˜ƒXlĄ’d‚åvuńAB/æĀp¤Ńh6ožnYŁ';W·’čk ’Įõ«3J€Ņ Óé ×­[g0īæ’ž8~ਠ’DōEhTH9o0@˜c>ˆ% }“jÕŖļ~÷»|šAŌŽ8ńÉąŹ„¾žKžØ}cņņņōz=8`ÕŖUq”€8€Ø D倨qA±ŅÄXj:„ a~ł€ ÉJ›6mśąƒtßŃp’ż÷ †XĪ€XŅ?ҤHˆĒ!L@ ˆī¬š‚p!ÄźsGg”€ØĪ ŹÉąŽž€Xł‘õ昐'ĢāŗI‰„Äģv;: ›L&»Ż~ļ Ń²fN S{<ü …dYF×ĢØÉ\.—Żn’$y½^Y–cm©8ņ]Įćń`÷nŽvÆ| †¢BŚ>ņČ#ģv—ņŻ:žDžßtĒä¶$2„¤å·Ū]__/I’ĖåB²{¤—Ėuļ‚ŅćńŲķvŸĻ×ŃŃĮĻĒd2įsww·ĖåŠģlćt:ķv;®„®®Īl6{½^ĒƛbĘ:rāG°Łl²,›L¦Č#§Œ½ˆS‚^ÆĻĻĻxõ £#ĆQėÖ­CDP¤3@ĮwŌxĪ09„$D*ÖņPǽȸ@ ‡ļ±Kd®Åbńł|¢Čöz½čęp8ššš (ˆ×uĒćńŌÕÕuttX­V§Ó¹oß>§Ó‰c9Į#ø\®¶¶¶®®.‹ÅĀp8÷®Q-40”ź¦M›Ž|óĶ·Žx…U\\œ——‡ä€ĢĢĢ8Ī€ųžE:qŌĄPrÉŽd˜1&I’ÕjÕN2ń2ĘxSāŁĮb±8N§Óév»EjįĶ2-K$8,ķ‡ŁlF³LģīõzqJ±ŽœądY.++Ć”šÓŠsH>P”µłĻ’ł?’įČĢĢ,)))..ĪĻϒꫯĘĒĒaYāµ"¢‚bU‰H0C˜œB²ń(» C0ä2×b±8,œ”7@öŁķv—ˇ±x@N› lGXb{½^®vX­V“Éäp8€,ĖŲR”(øJīš—ö0÷{½ŽīīīŽŽŽXšG¬#'r„P(Ä9Éćńčtŗ{d¾…ęƒHĀü’±££cxxxxxxdddtttŊh™Ą›źÄO¾£C˜œBņ# ƒĮض@ ŠŻŻĶ…ĒćéīīŲl6wÆ×ŪŌŌd³ŁFü+˲Ķfs8V«5 µµµ¼^ÆŪķŲķv¬Ó£JUÆ×‹z$°Nē¢Y\Ś£Ł=ß̑ȑ9‚ÕjŻ·o_ …Bš4,š-›{{šäŒ”SBZZŚ­[·&&&Ä&kq*‰§b(9„äW«ģP(¤×ėĮ¢Ł‡/Ø=O[[ŪŋM&“$I‘FÆ×k2™ śm6[SS“āGN§^ÆĒ‘­V«$I±–ŲĮ`0Ŗ)&“µµµ¶¶F.ķńY\ūGµ_E9Į#@1²Z­p3(t£Ōć^ ŃhĄ ÜXÄł –3@ŃJ,VzFĪ!ų@”•<øĖ|N|Aķt:«««1īt:“P(‡#ƒ‹`īg3£\ŒŚl¶X‘HŠPŲ|ōz½ø#_Ś3Ęŗ»»EņŠétwH¼TÜä R”ŹŹŹÄ. €^Æē¾ öx«Ÿ¢g’ ĻĮää$ēEßyrK˜D³‰h7Å(_P#–4 …B!»Żn³ŁD¹Éf\¬¢VĻ<ĘÅ^ r÷ķŪ÷ŅK/‰"Žįpš3QR(ņł|/½ōRü#'r\rcc#ęĒįpŌÕÕ-ppŃŪ‹ųZžĶōŌĄ‘Ął ²• 9„„ŸĻ'ŗUaه(æā jRvc qQ9šł|0 qŻ¢»»;Į¼åHQ …¬Vkmm­čÅÅ1c%L(<ĆQœądY‡Ćü§%Ų”1¦žC2£Œ`5JOOĻČČȜAFFFzz:ŗ±+ņŠ#‚:2)wn6q¹\ŻŻŻß ‹ŠĖåŌp5Ēā¾ŲE”Ų,›ĶęSÕŗ»»[Z,I’tāp8jkkc e—Ėe6›ß*ŽœąpÕ\³ĮŸ Lsʱ(®cNb†ē€X–"ā!u‰f2™:YWWW[[ ˾aér¹|>ä ÅbŃét|)i=ē¹ ^Æ·„„E”Żf³ŁķvG:cń »ŻÄo³Ł€ĒćmMXŚ‹A>Ų»G~yäď Į%‡B!$¬-<°©9¬C3æ&oǁ@ˆżZMLLÜŗukttōOśÓ|¼¹sŽśśz.dt:]cc#’źĘŒ1½^o6›«««Ķf3’VŒņ¬®®V³¬¬L§Ó!X³µµUüŹl6ėõzqæõÜš+żżżųSį`Œ•••į˜µµµ‘×…sŠétŠsˆ<ņ]_^Æ/++»qćƜ܈®®.Ģvssó’ł?’ēäɓ’śÆ’zńāÅžžž?żéO£££Č˜öņbāę–`īJ„ ‰,Ś&&&ĘĘƾüņĖ5kÖÜՋ¶Xś·DŚpoc2™¬V+Ŗńµ0vŒŗT ,ēŵs(2 N§SŌdYŽ•|€Ÿą_ńSå$) UVVö÷÷G­Qēȏēn€ń¹­lŠÓŠėõ»vķ’$iõźÕkÖ¬Y½zµ$I999™™™ˆžWńÖĒó÷Ė“Hą‚†p/| æó éO ę”Pqś Ŗæ$”„) ) ‹Å?š=VĄ&„Ō†Ó錦†Œ@|@ –~@“0‡PӁų€@ ā@ > ń@ ˆ@|@ ā@ ²G"Meˆa¹šų'ń@ ,G2P“ƏŗÕ/"RģŎ³¾#b=6b£bŽ„˜ō!µUž‡zˆ¦‚pWX½zuzz:śŲƒ¢śH? RI3P«ÕæłĶoFFFĀ3žā‹/¾žśėńńqފœ¦‹qÆV«µZmzzśŹ•+3333228%Ąj$Rń2Æ7ģæ&---##ćÖ­[ćć㌱““4|&> Dåƒ+VdfffeeqJ(¬FÄBj¼ŪSSSx½ÓŅŅV¬X‘‘‘2Ąźolllbbbrr’QkeĀķ %_@dff®\¹2##†#Nœˆ„”!•JąŠ+ ō±ō[¹råųųųÄĉ\Źć™Ńjµ °ĀŠ+øcY¤ā!e V«§¦¦“Z-į”p2€~@ ˆĻŒH +V¬X±bEzzŗV«…½Hܘų€@H=õśķÕjÓŅŅ&&&D2 å€łĢpĶžīOV&©ŃÓC ¤šŖĀc<99999 ‡@ndBVóŃDO²"Ĉų€@H1J€čē@jį®žŒ¦p&©J z ™!$¢%0ĮĻĢ"²Ü‰„”¤„ČĻB‚ŠBägāaé0 J > BP=;@ 0ĘŲ’?ļDõ…IEND®B`‚apache-couchdb-1.6.0/share/doc/build/html/_images/intro-why-02.png0000644000175000001440000001346112332105522024526 0ustar00djcusers00000000000000‰PNG  IHDRN[5*š pHYsgŸŅR cHRMz%€ƒł’€éu0ź`:˜o’_ÅF·IDATxŚģOˆ$×}€_k¼`Ŗo¼‡®Å ]a”.‚#+čšÄ—\Ü5‡äbŲ.”Sˆ`Z—$ėHt R¼± L BŹō. ˜Ü5ŗų¹«sr'Óķ kVŲ™ź$ŽW3U³ŅAxMēšCR÷LOĻģōn×ėļ;,ż§źUMmõ{æ÷^½WF*GĒAÄq¬Ą JcŖ;Ž3 ŗŻ®ėŗ\cx"’& ĆĮ` ”ņ}ŸK`¦źišA Æ‡Ć”~ F©A–ełŸ¦)ĄØ\=I’«WƎ}×h4Śķ6ץÕ]×ķõz“_ļīī:ŽĆe0”Ēń‘ž+„šĶ&ץØnŪöp8÷I)¦³€G­z³Ł\]]ķ÷ūg(+Š"×uK„R©Tr'Š"¹wčJ»¼ÖʆahŪv©T²m[6–ĘŁ&ŽcłÖ÷żü­'MÓ0 ]×u]7 C9Øėŗ2‹†Āu]] („ŌčÓŌj5„T·ŪģX«ÕĘ>Æ×ėc…w»Żn·;ö”ģø¾¾>¹ńh4jµZņÖ²,żU£ŃCT«Uży«ÕŚßߗ×õz}4mooĖŪŻŻŻ|Ā“¹śh4:[ćY³ŁÜßߍFNGĒyĒq“ķÕjµŪķ†a˜$ÉÖ֖Rjssóąą R©HĻ—fŪ¶.Ggųžēɜ¶õz½Õj9ŽcŪ¶Č/5é&¬T*Lž0-ŖĻĀqQ]čv»:2ėmĘŽź ōŪJ„’’ŖÓéčZ†œēīīn>€ktA×,t-„ńx™dīlK>ōū}Ļó¦Lh3ŁĪ/óŪH(Ūqrp®ŽklšzĻó¤ŽDZE—Ą Ķrg&MS×u‡ĆaµZÕļéõz½^o–»ƒāČ»€ėŗ’Ų÷ū}©Ž£:ĄćQ]¦?C¢Ūn·eł8ŽO|ZFo0Łh7=€orÜ®ēy·oߖ°_©T˜Wą„Øī8Žėŗgx²-rė–O’D¾ė~ÓL?„Ž@Ņ×’Ƥ÷žI/NV]:ĘgÓÖėõJŸDZ®xž7¹ä›“– ‡Ć§Ÿ~:ß÷„Õż•W^‘›‹ć8'Ō¶ķF£!å\½zµT*éĪó¼ŽŌŽꘫ{ž'^;;;q‹Éš ņżäår9Š"i] ½^o0Ģ2n' Ć|‡¼®É—ĖeŻßŽź“œeÉÉšė8ŽŌŪ£(JÓTĘ·%IR.—óiæģ˜W1IŃUJ˜ü¤ßļÕłÕ'OΌ}(ĖE×ėuĘÉœ¬zAi·Ū/¾ų¢RŠ•įfŖĄ7›M×uĻ6žqŃl6ÅóZ­†ē3©Žļ÷{½^±–[–³­V«TŻŽćB“‰÷ŁśŪ#—.]śīwæĖģ—†ēźpŗ <ÓH,‹ź,ł`,ł@®äź@®‹­:«€)Q}NK>Ąb©ž0K>¹:«QĪ_õ٧‘¢:,v®.Ó6źIĄLÕ€\ČÕ`ŸšĀ÷}×uYŽ€\Š_/ā’pjՋøä«¹:ĄŅVą™F`YTgIósu–| Wru W€ÅRČÕĄ”ØĪ’K”:K>«¹:Õ`±TgI¢:˜’«³äĄRØPhŅwžõāŹŹ“Ļ^ēR«ƒi|ųŽŽ’Üžūw’dżŸÆ’ęo¼Ä9’‹\("Ów~ōĖ·¾ó£žæśó „ōUgIXšžĖ·»’÷O?ųhļī‘”Ÿ’2WiVÕ¹(°øŖļŻ~ēo¦l`=’Ū\„™ru–|€EęņZż™[ÆOŁ€Ø>«ź,łÅµD\L³żĮįż’¼õķ±Ļ?÷ÕU.¹:˜ĆƒĆĆ:;$źUgIX|Ļ7^śhļī…••ŹĖL¢~ĘØŽn·{½uxX|Ļ«wŽ|ņŁėŸ¹ņ…÷o¾¦”śĢ•/\ŗr…K4«ź,łņ\ņv„Ōū7_#¤O‡1šP`Ļ5÷:;WV>÷ÕßćBĶŖz»ŻN’Ä÷}*šPĻaXņš|)UĄsru<7%Ŗ³äąłRØĪ’€ēäźxN®€ēØ0#’ęż!ž?Š <ÓHĀcäīĶWńœ\Ģ÷üƒĪ[xžˆ*š,łxN®0GĻ•RĻÜz]žTruĄs W<‡c`IĄsru<7µĻ’€ēK”:K>ž“«ą9¹:žØĻ’€ēĖ¢:ÓHž›Ÿ«³äą9¹:ž“«ąy*š,ĻēŽĪĪi=o6›GߊćŲu]I0Ć0|,Ž>·‚> v‘_$ĢÉsY õTń\FpłÕqŸ?2¦œŪC’¦iæß—{Ł£SĒWįqy®>iNÓt0(„*•ŠńµKĻóvvvjµŚ¼Õ»8yėb8ĻÆÜųśiós©œĒq¼ŗŗŖ”ņ}?³/×ĪĪĪ£9K>Ą\<’üŚ×¾ų?›Ē!‚ (—˶m·Ūmł¤Żn»®+¹“mŪśī [–J%Ēq¢(Ņæp×uumyģ­ģeŪv¹\n·Ū2N\Hˆ¢H6h6›śC)$Š"ß÷K„Rž™1łJo¬ßę+ķņ:_ął3ś4µZM)ÕķvG§äߋzמė]{nļĻ’āaŹév»ņćlµZśĆ#½£ŃØÕj)„,ĖŖT*zÆz}¼B!æjł…ė_žŲ[)j )Po™§ÓéäOϲ,żU„RÉU«ÕĘŽź?S£·™OLęź£ŃhŽ-`v<ævėłh{{[kœĻo³,‡’ŽĒq,ćV«upp ž3Ó4• ²¬N§s¤ŪJ©õõu}GK°³,Ó§7ĒŖ“ ŚöjµŚķvēŚ¹Ą„SP$ĻkµšļūZڱL³^Æ'Iāū¾6Š÷żr¹ģyžRj0L:»ßļgY&uxĻóŽk&ĆP5vrzĒ};F¹\Ö1U^K«ä#Ri$aa=?} Š?`iĄ×ĶųÓŻÓ{=¤rz÷…jó"Ŗƒ!žĆt.NVN¤³KÅõüø®āé]Č:ų?ä,Lz÷…ź±~b²īįŗ.źPčx®s`éc“š¹eYł#q§išÜCG8ݽŚćJiŗcONCeÄŹqUś$Ię=˹:Xo÷Ą‘žn¼“ õö0 ]וP7–įOGF³/r/5¹:ĢäłÆļßg<\””fņÜzžĖÕ;Ē).,ł'{žŁė×¾ō bT®Ī’0éyõĪ›ŸzŠkbTĻ—„Ļ’xŽē伀ē`„ź€ēxN®x¦Dõ~æ/ģsišLV%šĻÉÕρ\šˆź€ē°XŖ3$žQ įĮį!ž/{®ĪśźKāłG{wń|©U<ru0ÄóĻ\łž“«ƒįž_XYłŅwB<_6˜Fré<ÆŽyóÉgÆsMČÕĻa *š,ł€ē°Ŗ³äž¹:ą9«žC*šL#‰ē°,Ŗ3$žƒł¹:K>ą9«ž¹:ą9«žĆb©Eρ\Ż|īŽ|õƒĪ[x§‹ź,ł€ē°Ŗ³äž¹:,œēJ©/~ćOńČÕ ÷ü™[Æ_^«sA€ØŽēG©Ī4’xDuĄs0%WgÉ<‡„PšČÕρ\š¦‘Äs W<S+š,ł€ē°Ŗ³äž¹:ą9«ĆypƳóžĶךę^gI<‡eQi$ńĢĻÕYņįńz~åĘ×ńČÕ ÷üók_»vė .«ć9¹:žĢ®:ą9«žƒ)Q%š–Bu–|Ąs W<ruĄs ŖžĆb©Ī4’xDuĄs0%WgÉ<‡„PĪ‘ßŪū÷µ?Ās W7ÜóĮ—šČÕĶ÷ü×÷ļć9,L#9Gϭ翌ē@®nøēŸ½~­zēĶ‹O=Å5E¬Ą³äžĆRØĪ’x伀ē@®ŽēxŖĄ3$žĆ²ØĪ4’xęēź,ł€ē@®xäźx@®Žē‹„:ą9«ć9žƒ)Ŗ3 Ķq<8<ü—ß’<C*š,łpœēÄs W_ Ļ?Ś»‹ē@®n¾ēVV¾ņö÷ńˆź†{N<£TgÉć<ņŁė\ Ŗć9@”ru:Ūš–BuĄs WĒsru<X`˜Fρ\ĻL­Ą/į’xĖØś²-ł€ē@®ŽēäźxPč üņL#łīĖM<‡„V}¦‘¼{óÕģį9,o®¾ K>ܽłź·šČՕńž+„~«óxäź‰Łž?sėu<ru3sõ¼ē—ןüßĆR«n|½ρ\Ļ–&Ŗ÷ūż8ŽM‹ēŹų%šĄü\ĻĢĻÕńĄü؎ē'ØnĄ4’x`~TĒs€™rõB/ł€ē³ŖN< W_\~öĶoį9€į¹ś½ĪĪĻļüžL”šÓHŽėģ¼ó5<09WĒs€3Vą “äƒöüók_Ćs€Ó©^”%ņž_»õ’‘ęźx`~®ŽēēP_ši$ńąÜT_Ųi$ńąÜrõ…]ņĻĢĻÕńĄü\ĻĢĻÕń`.ŖSo WĒsS¢ś‚,ł€ēóU}–|ĄsósõßŪūŁ7æē&ēź¾·7øńŅÆļßĒsc£:ž<:Õ×4’ŚóĻ^æ†ēfFõ¼ēÕ;oņæ0÷\żŃ/ł0ęłÅ§žā`īŖ?ŽxŽēęźx`~®Žē’Ē3$ž˜Ÿ«ć9ĄćÆĄĻ{É<XÕēŗäž˜Ÿ«ć9€ł¹:ž,V~ÓHā9Ą"Ŗ~¾ÓHā9Ą"ęźē»äƃĆĆw_nā9€É¹śƒĆĆĮ—>Ś»‹ēĘęźx°ŠQŻuŻ^Æ×ķv]×}xĻ/¬¬|åķļć9ĄĀEõs¬·_XY!ž˜™«yžä³×¹Ä‹ÕfÉ<(Œźg^ņĻĢĻÕńĄü\ĻĢźxPHÕO5$ž˜Õń Ą¹śŒK>ą9@±U'ž«ć9ĄräźxPPN7ä»/7ńĄš\żīĶW?č¼…ē&Tą[ņĻŒRżČ%Äs„ž›«kϟ¹õ:ž, I’œøLĖ ¹zŽóĖku®)ĄAĒAL™'nŚ4’xPz½ŽźźŖļūĒĶ{ģ’xP8nß¾ķ8N'«ī8N­Vūą[ēE$˲ Ū¶£(š¦z†ū;æūū’…ēÅe8®­­}Ŗć|ōi~ś—Õ»ö\ļŚsæų^“»»[«ÕjµŚīīīh4Źæ^__ÆÕjŪŪŪśõśśśh4ŚŽŽÖÆõīł×EQuīEÕėÓBr£Ń888ļl»÷īO”R·~ńßß_«ļÅqÆ×SJI7{žµtæKsŸ¼–Ż“$ŃÆÓ4|MQEQē^Ōō)ž£(ņjĻóN|rÕŠĒX—²ć8ØN®†{®”:88˜¾0ŖÆŽ~õźU„”eYQÉ0R<§¦Ńn·åE†2b$ļyĒaŹ„ĶfSjõI’Č^AČ$M®ėŹńÉĢß¶m×ue{×u]×Õ»ĖŪ8Žć8¶mŪó<™jYo/å§i†”RŖßļ‡a(3ĄA '3¶{’$¾ļū¾Ÿ’ūż¾"E3õ3§šŪ·oĖ‹4M劍F£ÓéX–•eY~BØ,ĖŅ4ÕŽź©cšĶ¦"· ž:Ōė§?©NT˜ŒÉ‚DK„”Lį eȇåF£‘ŒŻnw4Itµ,Kvœ ćGFu‰’cµ˲¤LŠe9bµZĶļ.QZW4F£Ńžž¾.łąą@’ir†ņ'ĖėĶĶM¢:,)zŠ% Ė:8ē×–äv,E‡J)ĻófŒēłŽ€±lYÖSČTęb–s ł'OFļ5֎ ] ‘³24Ķr`Õju0L.:6}J–)ķłyńNÅd³æžDŸĢäóäg8×u·¶¶²,“Ę?˲fæ+”:ĒqƒA–eҐž„MŹy¾čźśĆœŒēy’ķėijf/“ <Ż/åy^¾r®Č7_(†ć8ŅJ×n·'m—0{†»€>ØėŗAŽ÷’¾ŗÉÆdz)ŻP‡ź`2®ėJó{–e«««„R©T*å‚ Š"¹ ä;®ŽCšŹ³,“õüŗH·oßn6›cŽ3Žä"ēA4›Ķɤcņ¾#ZÆ×““Ń-óy½‰ź°,DQ4ÖŁDZć8ŅŠ½³³³¶¶–e™eY“įńHÕ„¹>˲^Æ'÷]¾RńvvlŪĆPjŻ[[[[[[ł:Čq„a(mņŅ™7Y7©T*§jV W‡#“Øź!e¶mK3U†ŽćČ 7YŲH²_Ū¶%ga“6ŗ <Š¢ü5¹›H˹”E‘žĪil÷Éņu`÷ <Ļ“ķ^ƗmŠ*źžē„išoįƒŠŖVO’ä駟łY­Vó}ŸkčuŪ¶£(:ųćN§S­V¹L€ų0 ͹RŹu]® I«nšfÆ×;źˆV«å8W Xhg”R;;;cŽx’ż÷ėõś£>ŹÅ8źqńÅcŽHÓōüłó/¾ų" Xģ|žµļūI’ŌėuÓ4¹:€¶Q „oŒ¼ö}ßó¼$Iø4€ęQ___'ź€fĪŽ¼–f ĆąŅŌźØÕĢŽ÷ż(ŠlŪs³ĶuŻ8޳æć8Ģc,X^¾÷2~š„„„‘=S}®Żnó¤-pŹų0 ‡Ćį$­t¹\n4årY)µ½½=ÉTžē†±ŗŗŹuN¹Ućx0T«Õ1ƒšŅŖ[–†”ÜėõJ„Ņ}§²Č¾*ĖX pŹ­ŗėŗW®\ÉJńū2 CzćišŹ<³q;ŽcĘŅŅ’išYkoŪvvZŪ¶„ćpŌĮflųu–e)„‚ MŽhY–¼lµZ²gccc8nllŒüFćŠf|ĢĮfėųµz¾a— éĄ;Ž#Ÿ·nŻ*•J2'•JEŽ ‚ ‚1˜­³3?£iš¦iĘq†”aišŹ„Ó¶mg ŁGÉQ8ŁØOr³m|ó> Ē9j«S `fĆrǐ­ś$ĻĻKtK„ŅÖÖVÖc?ŹT˜Ł°\§Ó ‚ ßļO>,—ETŽ.Ū­V+äĖž—‘—ć0C‡³mržēIu]«Õ²‘¹|gžŠwÅq\­V'<Ąģ[õÉo¶å•Ėeéōū}ŁS©TÖÖÖFž—ü­5˲Ę ąo¶C­V‹ćXZfĆ0$“Żnwsss¤ü®×ėł=ć0CĒ™FRž•¬Śįo·Ūq×ėuĆ0ä ¹üxžČ³·ćp"Q „CžĻ?¬@ĻØĒqEƒį€fFo¶ÕėõńSŠ V° x¦‘Šu–|ōÆÕYņ V@­€ZĄ|Eµ:]Zu™Ń‘cĶ£>ķ’ØÕP« Up²Q·m{ii)›Ś­:€…­Õ'Y_ĄĀGµ:jusŒi$juŗvąYņ(DŌYņ V@­`:šL# %źL# č_«³ä@­€Zµ:€łŠ:juŗ“ź,ł"ź,łP« V@«`¾¢Ī4’­:]ju–| u`” >ų׳ĖĖ?{‰KA­Ż|öńī’l’żG²öĻ—~ó§WÆqAu–K€EtošĮ‡æzļ'ƒ>üā—’›ķ?C“>aŌ™FsŽ€’ź½ą’žé'Ÿļīz€ńĀó\„I£ĪEĮüF}wÆ÷Öߌ9 ōĀos•&ŖÕYņóģüźŹ37Žs­ś¤QgÉ,nŚ)Ō©Õ”[ŚļķßżĻ?Ł’Ķļ^įāP«C÷ö÷ļ“v(ŌØĻ4’˜’œwÆ^ū|wļĢņrł•?¦P?f«īū~Eōį1’9ÆÜ|ūńg/=rį©O®æ®”zäĀS^øĄ%š4ź,ł€ʹŌķJ©O®æN“>ĻĄcsž¹ŻŚ9»¼üĶļžjŅØū¾Ÿ$I½^§EÉ9&Į’ ē…Œ:@Ī©Õr®K«Ī’ ē…ˆ:K>€œS«äœZ ēD˜Šæ9HĪFži$qŠö®æFΩՔĪļ“Ž!ē©Ļ’ ēŌźĄ ę\)õĢ7ä›j V9µ:Č9ŽĄ4’ ēŌź9׵ϒ ē…ˆ:K>€œS«äœZ ē ԁgɐó¢Di$AĪõÆÕYņäœZ ēŌź9§VGŻnķL›sy‚˶ķģÉy™=Ó%/]×=ōķ¾ļóŲ¤Qf•sY uŖöÜ0Œ(Š¢(’øŹ]QµŪm9@^5–ōņĖ/GQäy^~gö^¢ž5a‡CŪ¶¹4xČ9WJeĻnI«žõ.e#ūnµ T©Tņ?õ<Ļ0ŒÕÕU~#źą<³Š`V9æpõ{ÓÖēYJć8v'ėŠT”G=͆a’$ŁIĀ0LӔßČį­:K>`&9rõ„o}’Ϧ}{–RiÕ³æĆ(жźYļŗīŅŅ’RŹq×u„’?XįgłÆV«KKK†a仜ķv;Ūßl65üŻ æĪ²,„TC`JŸžø]|.ŗųÜűO"p˲†Ća¹\VJ•J%„Ō­[·†ōŅåČ|§]ž’eCŽ{čŸz«ÕŁŁh4†Ćał[[[śżvØÕ1ūöüā7}ž|ē¼×ėY–%mx’$ŅJźŻnWā=rž ²O $ĢŅąÆ¬¬ ‡Ć••„”4ąņÆ|ˆōū}ĒqōļĄ§˜ó,ÉQIwŻ4M6ŹV =XØw:ƒ³!ڶ7I> Ć^Ƨ”Ŗ×ėYģÓ4ĶžÅql†–UL#‰9Źy¾Ń–š¦9²g¤Ė™5ū÷•żU{ž—æ9Ÿ$‰„?MÓĖ—/uӞVä|f9Ļ7ŚŅ]ĻfOČŚäŸL”ŪķFQ$=į8ĪĘʆlonnŽÜ™×ĆčͶf³)7Ūų#ĘĆĻy¾U÷}_^JwZzļ„RéŲQĻŗåłæpŁ–õĒéõzĶfSĆ“3nŒSo3Ɣ*—ĖłĮvõÕčz~ē˜=ŁX]§Ó‡NG^ʰ\^æß— ä×2Ōź˜—öü`>k{³šOÕßĢŅ/_¾lŪvµZ•Q÷Ó4e¬NZo×u«ÕŖmŪ2/‡Q«ƒœŸ`Īóy>ø1Uļ½^ÆgŸYQP«Õ”R½^/’°}’$RĄ§ijY–Ōšż¾ŗļū2 ÉL’8•œKšd°=+ŌīQ_Ø†‘vd:ģYļĮ` 7M3? 8 ņ{4:pŗ9ĒCźĄ³äČy!¢Ī’8Ōgļ’ó…Ę’˜(ēŻ«×Č9µ:ōĻł—wļ’s­¢Ī<Ķyé…ē+7’Ž ¢O­Ī4’8˜óĒ.]üö[M.ˆVµ:K>ą`Ī+7ß>{īׄZä ؁gÉrNĪ©ÕAĪ”EŌAĪÉ9µ:Č9tiÕć8Īęė9‡¶QgÉrNĪ©ÕAĪA­rZusĢWŌ™F’œƒVšø·æOĪ‹^«³¾zAržłī9/tŌAĪA­MržČ…§Č9µ:4Ļł™ååoæÕ$ēEĆ4’…ĖyåęŪ?{‰kB­rŽtąYņœ£QgÉrjusP«ƒœc:šL#IĪQ”Ø3$9‡žµ:K>sP«ƒœƒZäŌź 瘯Øc‘sP«ėoļśkwZļsL×Ŗ³ä9G!¢Ī’äŌź˜»œ+„¾õż?%ē V×<ēĻÜxćüź “źä8,źL#IĪA«r]ju–| ē(DŌAĪA­rjusĢ1¦‘$ē V9‡®x–| ē(DŌYņœƒZäŌź˜…Ū­O®æNĪqāx¦‘$ē(JŌ™F’œC’Z%N7ē®~œƒZ]óœ?¹śŅÅorA@­NĪjurLusP«ƒœC—V%Č9 u–| ē V9µ:Č9hÕAĪ1_QgIrZusčR«³ä9G!¢ŽśģćŻ_ż#rjuĶs޽zœƒZ]’œy÷.9ǜ`ÉĢyé…ēÉ9ØÕ5Ļłc—.Vn¾}öÜ9® ę±Ļ’ä…ˆ:K>sP«ƒœƒZœ“s,Pži$É9Šu¦‘$ēŠæVgÉrjusP«“s€ZœóusP«“sr]¢Ī,4G¹·æ’/æ’äštąYņįØœÓžƒZ½9’|wœƒZ]’œŸY^žĪ{ļ’sŠŖkžsŚshu¦‘<*ē?{‰kZur,T­ĪĶ6rŽBDäŌźä V'ēĄcIrjur茁/ą’äEŒzі| ē V'ēµ:9ŗ_œi$?zÅ%ē(tŌ‹0äŽõ×Ņ>$ē(n­^„%ö®æv§õ9µŗŅ>ēJ©ßjż#9µz¢wΟ¹ń9µŗžµz>ēēWWųŻ£ŠQ×¾ßNĪA­N΁“źq‡aØÓƒ±äPŚ/ł@Īżkurč_«“s@’Vœ÷‰ŗÓH’s@’VœÕź ½ä9&:ķ9@­>æ~ńƒ’s@óZżvkē—7’œc,ü4’·[;Ÿ\œ:ןä8f~–|ČržäźKä˜.ꋲäC>ēo¼É/аV'ē€žµ:9fЁŸói$É90³ØĻķ4’ä˜Y­>·K>s@’Zœś×źäŠæV'ēĄ‰D~;@­NĪ]Zõ9Yņœ'õyXņœś×źŸ}¼ū‹üˆœ:ןŸ}¼Ū½zķĖ»wÉ9 m«N΁‡õӚF2Ėłc—.’s@ĻV=ŸóŹĶ·ł­'^«?ü%Fr~öÜ9~+Ą‰GżtŪsrhX«“s@’ZœÓéL#IĪżkurœ~ž¤—| ēĄ\DżD—| ē€žµ:9ōÆÕÉ90_ų“˜F’œóõŁN#I΁y¬Õg»äýżż^qÉ9 s­~oæ{õŚē»{äжV'ēĄ\·ź¶mGQmŪžó3ĖĖßyļ]rĢ]«>Ć~ū™åeŚs@ĻZ}$ē?{‰K Ģc«ž K>s`a¢~ģ%Č9 ­NĪżkurčßŖ“s`!£>Õ4’äŠæU'ēĄן.ł@ĪÅŽ:ķ9@­N΁bŌźäXPÓM#łŃ+.94ÆÕ÷®æv§õ9t襵ä9“Šś”K>HĪ•RäжVĻržĢ7Č90‡’$¹ļ2-÷©Õó9?æŗĀ5ęēyazž7fžøqÓH’s`QDQtåŹ•z½~Ō°G.ł@΁…³½½]­V=ϻԫժeYw~ų×äXDi𮯯›¦Łn·ĒE½ŁlžķļüīoÜś/r,®^Æ·ŗŗśµēĆÆūł_žUtń¹čāsŸžøŻét,˲,«Óé ‡ĆüöŚŚšeY[[[ŁöŚŚŚp8ÜŚŚŹ¶³·ē·9§āT3?ÕŹŹø&¹V«õūżŃ›m·?ś™RźĘ§’żīźŹnFQ¤”’Ūģłm¹ż.Ć}²-oO’$Ū ·9§āT3?Õų)žŪķ¶ć8£7Ū~žÓ’øww’öÆmŪö`0Ö_¾¾._w“młZ»iš¦iʶaÕj5I’$Id;{;§āTœźDOåŗīęęę”9o4®ė†q‚Ė3x8<Ļ[__ŁiY–ļūŁ£5g¹L€fŹå²ļū#Ó|ƒėh£T*mll$Irš±9¢hbmm-I×uż)µ:°šĀ0”!½1Ēu čĄ…ĄC u˜Ŗ )Ēż ˆ#Š\o( }A‘HĢ]CD`(¢/¢9éGŖŚŸÕ>}Me„I3"½÷¾ŚĻõĀ:ĶĄˆJc³¹ Ō, bŹš¹š“ “ƒ!š[WCA ņę3DDDDDDDd9•u¤*ĢkÖ&!R õó|¹Ī1„@ˆŚAYk‰X¢†ˆ±ĪR5ƒ!šA[÷¦Ö1–"""""""2S‚†šŹį0üÜ®4²Ž¬µDĢŃ­¹”ĢŠķD³fˆ0Ł”ņ PµĄY޾QfōÕ)»7é>ēkĪ A“rcivĀŖ/Ķj©n@ÄP³}Į Ż`ˆģŠ ˆŲį~@ÄVgĶ’¾ĪUõ½'"""""""Ė14Ü®¾€ˆčŠ}Ę׌ū+uŽ)ō5"…ö(45n6cé"Ā }ˆhNš;T Ščv²ŖYX¬%BDDDDDDd}ŗ£Ģ(5^u"„:ūi8u Ķē|a?!0˜qč]sD¤:óŗĆéjÖöŠm&£oŅ ˆhĮ«ŪY«&Hˆˆˆˆˆˆˆ,Æ*Ćģ  ač¶‘@Ń=®0p\ĶNW«ĶÜ5Dōõ¢Ł'ˆ¾~C MšA)ōwŅŖ/(¢™"""""""Ŗ9c£ĖčNŗµC„€†fsM%0žŒÆŅY_'jˆčW7¢/¢ ‘į~Ķ}ĶĄP1š¢™"""""""2/•eŗ”y‹f ”)Œ¾>G…eeØŲ:D7 Ķ€H;X5÷°»šA C}…ó2W;÷ŗ£Ķč6æŃ ø°O""""""¢Ś£€Šģ/D·fˆęp»¶P,X° Ji ģģģšæ’ż-[¶DŸ>}ōīg®mōٽ{76n܈ᅭ¾Śe¬ļśvķŚUė½R©¬ņ=²sēN“ņV™L†ŠŠPŒ5 ŽŽŽā=‰’’½i+•Źßąąą€™3gbĈšņņBZZvļŽüÅÅÅÕΟ)ecʵ5%m""s*))’ļØ ‰DgggH$5®!ODuƒn% @»b…f ŻŚ!fū"ØI@Db`™fōFw^81ŻčY"666˜1cüüüpųšaüõ×_H$xą0vģX<ōŠCųõ×_”TšeČā*Ū¹s' ­’vuČårČår¤¦¦Z;+ÕVßŹÜŚ¼óęĶƘ1cóēĻćį‡Ę믿™L†+V|šA,Y² ¢&OžŒ‚‚¼ųā‹P*•xé„—šä“Obٲe8{ö,†Ž>ų¹¹¹ųēŸLΟ——¾ūī;8pĖ–-ƒ——ŽyēČd2„……!99O?żt…żŒ±cĒāęĶ›€ńćĒcīܹXŗt)Nž<‰€€ĢŸ?EEEųć?ØQū÷ļĒŹ•+µŽ• &§„iƌh޼¹Ńs4×6ÕUY뻾ŗļ«s˜ĖüłóŃÆ_?¼ūzõ*xą|ųį‡pwwĒ'Ÿ|¢7msÜšŽ{ļ!((øzõ*|šA̟? …~ųaµóW›eCDdNEEEø~ż:ÜÜÜjtœ’’¤§§ĆĻĻR)+—5ŗ5A4cŽ-ŠCT«ęƒ9‡ŻÕ—˜tkˆčė1¶Z €¶mŪā‡~Ąµk×Äå—/_FBB¦OŸŽ>}śąŠ”Cf:ķŖ¹|ł²UŅ­®ŌŌTŠóõQ}+sCjėZŲŁŁaȐ!X¹r%6mŚøxń"ڶm‹Q£F‰‘¶mŪāĒÄÖ­[„÷XnnnHHHĄõė×!“Éšä“ObõźÕŲ°aąĀ… hÓ¦ fΜY„€ČÓO?““4ü÷æ’…J„B||<,Xź?˜ĪŸ?Ƶ““ƌƒ+V ??0sęL¬_æ^ĢĻÕ«Wįēē‡gŸ}VėųܹsŽ'05-AėÖ­ńōÓOcżśõ˜2eŠŽcšk›šØ¬ŒuÆÆ¾÷U½GĢE"‘`ųšįųå—_pāÄ Ą±cĒšĒ`üųńāCænŚęøœˆåĖ—ćĻ?’\ŗt ­[·Ę˜1cšį‡V;µY6DDęęć惑#GÖč%%%8~ü8.^¼ˆŽ;Zū”ˆØę„ę2śZ“蛿q‡±Tg¦ŗ‘S#5Ö»woœ={V+"øpį®]»†Ž½{抔Cxķµ×p÷ī]¬^½ZÜęÉ'Ÿ„‡‡¾ųā H$ 4AAApuuENNŽ?Žżū÷‹Ķn>žųclٲ=zō@aa!œœœŒS·łFei¼óĪ;8|ų0öļßčŽ½;&OžŒ 6 &&Šæōė×OüåŃÜ222ŠŖU+–}×-˟~śÉ¤k`ccƒ#F r¹8|ų0Ž; b“™÷Ž{ŃŃŃpqqA÷īŻ!“ÉpķŚ5üžūļ⯼¦¤Ū¦M >M›6…D"AJJ vķŚ„÷Ž«O×¢““Ɔ «°<%%EėaXxŲ3ä×_E‡'NœĄć?™L&>„ ¢££ńę›oĀĮĮEEEšńńĮœ9sggg¤¦¦bĖ–-Xµj•XöĮĮĮŲøq£Vó·³gĻĶό3‘‘ķŪ·|}}ѬY38p@k»C‡aŚ“ihÕŖ’““«ÕTI7-T*Żヒ7āŹ•+z÷5Ē6vvvxå•W0bÄøøøąĘX³f 6oެuŒyóęaŌØQpttDLL >ųąܹsǤ2Ö½¾/^ÄC=$¾ļÕ«W•ļ‘^½z™”·ŹīaŅ­R-,חö¤I“Ģr?äååaųšį–;99‰ūU'¦–Meۘ’6Q]%“ÉŠ·o_Čårœ={:uāw‘•ݼywīÜAnn.Z“h???ŲŁŁ™ŗ»ś;P*;Œõ!"¬ÆÖBM’JŽkfÜŠØ3ŗmƒŖĶÓÓ...øté’Įm.\øOOOø»»‹æŚ J$“iÓ.\ 2 ĄĪ;±xńbüłēŸ0`,Ƽ¼}śōĮ„K—š÷ßWzL]•„‘ >€ŸŸī޽ ___q™ÆÆÆEĀ…?“[µj‹„£[–¦^ƒqćĘ”k×®Ųøq#–-[†Ć‡ć±ĒĪt)•JōéÓåååųꫯ‰¦M›bŚ“i&_™L†éÓ§ćęĶ›X¶l–.]Ф¤$̘1r¹¼Ž_ }zöģ‰Ó§O›¼żĢ™3qāÄ ģßæ}śō1ųKff&¤R©ŲōcįĀ…hÕŖ^yå„„„ą—_~Į+Ƽ‚±cĒP?X6oŽųä“OpąĄģßæļ½÷õ¦įé鉩S§ā«Æ¾›Ÿ”7nhm+¼Ö»øø cĒŽųå—_pčŠ!ģŽ½óę̓L&39-Įĉįķķļ¾ūĪ`¹™c› `Ų°ax’ż÷1yņd¬]»o¼ń}ōQq”>>øsēš7oGGG\¼x2™ żśõĆĮƒŇĄøø84kÖ }ūöž}ū T*”T*‘““ƒ={öØOR"1xL]¦¤qķŚ5 8PÜĒßß'Nœ@ēĪÅe¾¾¾Ų»woM‹Ļ ĀĀBäęęĀÅÅÅ¢µtĖŅ”ņqpp@PP6mŚ$Ā222ÄŚ!†௿ž·ß»w/&L˜…B‚‚‚JÓõōō„½½=āā␕•@ŻWILLŒE;%¬­k”kāÄ‰čŁ³'ž{ī9“÷)--…R©„J„BII n޼‰’’tėÖMėś÷²š =oŽ<­ćlŚ“ 'NÄ#<‚?žųC¬„2kÖ,üšĆX±bzč!¼õÖ[J„Ɛ—'žxIII8|ų°øLų¾ŠmŅRPP ®—J„(//‡··7~żõWܼyxłå—!—ĖõÖŹŅ—4iŅƼņ Žzė-ƒ}ژcWWW<öŲcųšĆÅ<ÜøqClž$ČĻĻŠÆ]»†~ų’łĻФIńįŽXė^_ŽWõ1%owīÜ©ō€o¾łMš4ĮĻ?’,n·mŪ6üųćzÓ¶Äżšā‹/¢_æ~(,,ď?žØÕ,¬Ŗł3µlL٦²“‰ˆź:©TŠĪ;ĆÉÉ QQQxųį‡įąą€²²2kgØQ(,,ĕ+W“jļźŚ"7oŽDYYڵkgŹÅś*J˜:éS­Z"– ©źĖ°¾@‰fˆæ śåVs•J…¤¤$¢mŪ¶ŌķŻóņņpćĘ xyyA&“įźÕ«Zū_»v r¹ŽŽŽā2Ķ_S—)i$$$ĄÕÕnnnĖåšņņ±cĒąćć™L…BWWW‹Ö >ō–­ YN¦”O³fĶ •JqėÖ­*„“ õ>%%ąķķmRŗiiiHKKƔ)S0pą@“hŃ*• wīÜ1é—ńšØ­k!˜{öģĮłóēńŪoæį‡~@HHˆÖ÷@ei-\ø’üóO…@‰¹·yšĮaccc“¦ÄĘĘj½¶÷÷÷Ær››±¼¢yĄo¼īŻ»ćÕW_Åȑ#ńŹ+Æ {÷īXøpaµóUÕūa޼yčŪ·/,X€)S¦hÕŅØnžL)›Ź¶±DŁYC›6m0hŠ œ;wNk<"²œŅŅRÄÅʼnĮ“k×ķŚµkÜŽ¹sG¬ĮeC¦ÖŚpR–źCD߉ź;q³UuÉÉÉø»»ÜFųƒ9;;J„W®\A›6mšĻ?’ mŪ¶øtéT*•ųkį¬Y³ōĒŁŁY¼ 4„5vL]¦¤qķŚ5 eĖ–(++ĆķŪ·‘——‡ōōt“jÕ NNNČÉÉAzzŗY/–µh–„)åćąąUžOPwč7Ķ”0…j—•]ūoæż @Ļž=1|ųpdeeaēĪFź³—_~O<ńŽyē±ęNM¬X±vvv˜;w.lllšĻ?’૯¾Ā¢E‹p÷ī]@‡šÜsĻ”C‡pssƒ ¤R)Ž?ąž/öŗCŁž9sR©¾¾¾ZA£Ž½{ĆŁŁ»wļÖŚ^ų¾prrB^^žø\øļ„õś=zƼņ Ś“iƒ“““JÓ6lŗté‚É“'<¦¹¶qrr€J‡7Ō,#ąžgO.—W¹ŒĶĶXŽ€Źļ‘ęĶ›cҤIųĻžƒ#GŽŅŅҰ|łr|śé§ˆŒŒ¬DµÄżØ;Ā/ž†śŽ0D÷Cioo/¦)T·¬ģŚēēēćĻ?’ğž oooōļߏ?ž8RSS-ś@Q[×ā„—^ĀäɓńꫯŠųÖTII >łä­‘,¦L™‚œœ¤¦¦ĀÕÕ_}õbccńĀ / %%%%%X¶l™xŅŅŅPXXX!š)ŌjīĮ#<‚sēĪUx MLL nr¦Ł!„ŠW„°^CµŠ „Õ§Oø¹¹a×®]ö9qā~žłgųųų˜e”9ReC:;;k½>U.cs3–7Sī‘-Z@"‘TE¹yóę>£ę¼\]]‘——§õ‡¹¶§§'ģģ쪜?SŹĘ”mŖS6DDuUBB>ŒŽ½{ĆŃŃQüq…ˆĢư°P †ŲŁŁiÕŃäļļ;;;\øp………ˆ‹‹ĆC=WWW}‡54KeŪi.Æ1K5™©¬m¾×;räZ·n-öĪÆéĄC=¤UÕüŅ„KpttD·nŻ`cc#ž"š’’‚²²2x{{#??æĀd¬zæ”cź25„„“lŁžžžā±ÉÉÉhÕŖ|}}+4ķ07įR!ŻŚ~הņIIIR©4Z•^Ÿ–-[j½oÖ¬uõ.SŅuuuE›6mÄżÓŅҰiÓ&(•JńX–P[×bŠ Axź©§šŚkƙ-£FŅź’F"‘`̘1ˆŠŠ‚J„æ,W¬X¤¤$”””ĄĮĮAkh=•J…’żW«o BII ’““µ–÷čŃCo>7oŽÄõė×1`Ą€ ēž€[·nĮĘĘ>>>b @Š·o_”••Uh–b(­„K—bŌØQZÓgŸ}†’’Œ5 «V­2Ū6ńńń(//G·n݌^‹‡~Xė}ūöķ؛†UµŒĶĶXŽL¹G„‡ūÖ­[kĒĻĻō>š›ė~čŽ½;öķŪ‡   ½ētżśõjåĻ”²1e›š¤MDT—œėÖ­CóęĶ1sęLÄĒĒ£E‹°±±Ayy9~žłgüōÓOx÷Żwńū ̄]»v ÅŚµkµ~)Ōæxz€’ī»ļ°hŃ"$''ćŌ©SčŁ³'ʎ‹·Žz €ŗƒØß’‡Āŗu됟Ÿ^½zį駟ʶõė+4M0”VNNN…Z#½¦y͵ĶöķŪ1}śt$''#>>]ŗtĮŪoæ÷ß_¬]āć惙3gbūöķhŚ“)žyę=zTl~W•26¤:÷Hey“Ė啎#·nŻĀĮƒńņĖ/#++ W®\ææ?^zé%8pĄąCæ9ī‡ŲŲX\øpļ½÷V¬Xėׯ£C‡xžłēń×_‰°W'¦\7S¶©nŚDDÕ„;ŌwM?ēĪĆ!C`cc£U³ˆ,«sēΆj{hiҤ ģģģPXXhlūŹZ“T6Š­Y˜3 bJ­C'k*• æžś+zõź…   ōźÕ *• ©©©Ų²e bbb*ōēqéŅ% 8Pl.ųóĻ?QXXˆŃ£GĆÕÕEEEøzõ*¶mŪVi> S—)iæL‹Lß¹sööö(((@FF†9‹°OOĻZ†T„|¶n݊āāb„„„ĄĮĮ™™™Ųµk—Ń!b?GGGĢž=2™ W®\Įļæ’nrŗńńńŲ¼y3śöķ‹Q£FA„RįöķŪųå—_*ō!Pß®…ææ?š7oŽęĶ›cŲ°aÖO›6 ńńńxūķ·Ń½{wqłäɓž-&NœØ·‰Į‡~ˆ ąż÷߇££#Īž=‹^xAüÕ:99K–,ĮōéÓńŌSOįŹ•+ųüóĻ”R©°téRģܹC‡Åłóē1{öl¼śź«ų駟““ƒ7ā믿ÖJĻÅÅ2™L«OM»vķ‚ƒƒ¦OŸŽ9sęąÖ­[x’ż÷ÅaŸSRRšüóĻć¹ēžĆ§Ÿ~ '''ܾ}ß}÷]… heiÕ¦O>łłłłXøp!œ‘’’‚ƾśJ †ŲŚŚbõźÕšņņš5k —ĖqģŲ1ü÷撏ajS{¤²¼™z¼óĪ;xę™g°pįBųųų 55QQQųᇠę×÷ƒR©ÄģŁ³ńÜsĻį•W^‡‡īܹƒõė×㧟~ÓŖNžL¹n¦lS“‰ˆź‚²²2ÄÄÄ >>½zõ²ųߥDtŸn-ZS£CV‘)5EĢŖ: čFel5&{ä5&į½°Ž^s \`é“„ŖF0±F0ÄRŽyē=zŌ¢C[BC¼DDDŌšåęę"99¹Āh\UUPP€¼¼<<ņČ#b ÉŚ&ŌĢf¢š“H$Šk¼(P _ćU˜¶-P¦1ź!w…Édµ5Ź ÕC………Vū‡“ńZQ}äččˆV­ZA*•B"‘Tč‹É‰ …īīīü{ˆØa²x÷†ŌF@¤VšĖłń?œŗƒ×‚ˆˆˆź#­Žįk¢.4M%¢†…5DØQłąƒ¬""""""2¬Ö*OXjŲ]"""""""¢:‹"""""""jt!""""""¢F‡"""""""jt!""""""¢F‡£ĢÕqegĻC•]év77Ųvźh•“«Āīį€BaÖcVYVJĻ]°nź€:q-¬„"""""¢:.į»(;tøŅķlķ ·ķæ[%m“ø)ąüuDŻxW(`×·7ŹĪžGyŅu”ĒCYÜY”īųĖŚ9«U®;6Ć®ookgĆ*!""""""‹“M›—ĀėF0Dƒm§ŽźZ5£Gīvé ÕõėÖĪՂ:9qℵ³@DDDDDÕ R©Œ¾7“ĢZūēgćŌÉœ>uŅäsģŚ­;ŗu“T6h__ø|³¼ŽŌBp\ų:ņ_šmķlP-Ø3"""""¢Ś Cę¼ł®ÉūD|ņ_ĄĄa£­żzÅžÅYp~s^«bŒĆØįČwSŁYÖĪ Y"DDDDDŌØĮ¬ōŪ&ļóųŌ©X·f "&’vī —o–›½ƒ×Z”PĄ~Śdó½µsBĘaw‰ˆˆˆˆˆČlä ߀ūĮ=õ3rćK³¬Ŗ¬!BDDDDDTOÉJ‹`WV"¾·)Ź3{ŽEy(/Ģ©t;›~ż`³ņ'H[µ“v±Ō˜“UKxģ¢?wY;+f“/wµvźDˆˆˆˆˆˆź)e9J ļ/(/©žĮ °+/fŗ , ˜3Ēü' deU}ßeĖ*ę)<X“ČäC8˜’Œ¬†‘ŠŲd†ˆˆˆˆˆčž·vꗐ !”īC`ī\`Ę +Õu ˆį~0„A(ĄęĶźÉ#ČŌ4"ˆŒ‚‚j~j!""""¢FO7Ā ˆsęØk…„„Xęųę †hÆ[7õ+‘DˆˆˆˆˆØQ3ü`PD‡æ?°æŗoKŌ Ģ $&ŖmŁ2¢z…ŖQ£Ö«g(¼š\Ÿ•~ŪŚY“¾°0u‡¤–d©`ˆ + ˆŠ²ģ9P½Ā€5z &葛kžcZŖŸMB öõAµˆMfˆˆˆˆˆˆŠ˜ó×ä°t0$+ ˜8‘ĮŖu¬!BDDDDDNŹõ+ÖĪ‚å,Z«§ŗ.+K]3„ž’0 BDDDDDĪŗ5k¬Ė?^=Œ„kwŌƒ!de ˆQ£óź¼łP*•P–+”T–C©TB„¼?ÆT–ß[§žW©Tõ+ˆ’•„ŠģßoķœĪƒ!deģC„ˆˆˆˆˆØ!ŠŠ""¬‹Š ”:‚"""""¢†(0ŠŚ9؈ĮŖCŲd†ˆˆˆˆˆØ” ž| üż­m †PÓ "ˆ‰‰AZZŅÓÓ^^^šööF`` ­E2‚ׯęX†d Ž'DDD D]‚h?žĮŖS\@äąĮƒøpįB…åéééHOOĒ… Š”Cōė×ĻŚY%=xżjŽeH¦ą}BDDTæI;w†Ć“ɰ3hÕŅŚŁ1ĶģŁź~Mź¢ŠP`Ü8ąƒ“iDT@dÓ¦M⯜Ę\øpiii˜0a‚µ³LtƟ\.‡““ ??………xżŒįg€LĮū„ˆˆØ~Ņ ‚HėKDSH0gNŻéč50xåu¾„į‰ƒƒ3€-[¬;Ŗ ¦SՃVś~FF222PTT„ōōtūģ3x{{£øø͚5ĆäɓѤI+—lķ0tżŹĖĖįźź*Īė2vżK–,Aaa!Ž}÷]ƒŪ¬X±ƒF‡*]žœœŒÅ‹ĆÓÓS\ˆ¦M›āęĶ›I?tč’““1uźT“Ņ®iŹårøøø ((ĪĪ΀޽{ćĉ UŪF_ĘĒĒcÓ¦MXøp”øģÓO?EHHŚ·o_„s¬ŖŹŹÄ”kZ]ńńńŲ¹s'^{ķ5³».мO„€£L&Ó xČårōķŪ%%%8~ü8 Ž'Õłī2×}R“<ÕKšķõŻĘ@·nźNVkKH0}ŗśÕįįźžXęĪ­Ż|R­j5Db*ićegg‡=z k×®šó󃛛›Ń}óóó±aĆĢž=o¾ł&Ž|óMœ>}©©©;‡&Mš ,, }ōzōč+Vč Ō„„„ųģ³ĻĢr,Cׯ““YYYČŹŹBiii•öŌĮ‹ņņr8;;ćŅ„Kf;w¼’žūā4nÜ8ōźÕĖŖĶ 4ĖĮÕÕ-[¶Ä#<///( ( xyyį‘GAĖ–-Å@SeeX×ŗ¦š÷£9ļMK±VuƵL&ƒƒƒ† xxx`芔ppp€L&3ŗÆĄÜß]Õ)›ĘüżIDDT/łū+WZ>Ą@u”ĢLu­Sƒ!‚ŠP`ļŽŗŻQ-ÕHƒØ!’––°±±Ńś#¾°°xųį‡Ń¶m[q[¹\.>` ūj*))Ayy9T*ĄĮĮ , –üōÓOP*•())AēĪ1räH,Y²cƌĮC=@żĖūŸž‰×_Ū¶mƵk× T*ѬY3<žųćH$Ļē‘GĮ‘#GpęĢtėÖ [¶lĮ•+W ‘Hąėė‹I“&8€#GŽ@*•B”P`śōéøxń"Ž9‚ēŸšÅ_`ĈČÉÉĮɓ'QVV†7n`Üøq8zō(²³³ńĘo@.—ėĶē„K—°oß>ŲŪŪćĪ;pvvĘ+Ƽ‚_ż7oŽÄڵk1eʳ\?”ĻįAF„RA”P ØØH|¶³³ƒŲ§ˆ¾ė'Ų·oz÷ī ™L†ØØ(<ųąƒ„R‰ŸžwļŽ…‡‡ŠŠŠŒ.7…ęÆŽśŹQP“4L)CpqqA«V­ nŪŖU+ ''§Ā¾¦8wīöģŁGGGdddĄĆĆĻ<óŒÖ6śīYCŸŖ”‰”kŖy?ˆócĒŽÕ›& ’óØk#żüóĻø}ū6\\\šņĖ/ćäɓuöóSŻū$??ÄŠ”C>śØÖ¶k™zŸč~wū,Š»^·lųżIDDŌ@YŖ?…B}ģW^1OӜĄ@ąŌ)õ9uµCXŖ¶śMÉdhŃ¢ģķķ‘””„‚‚<ōŠCāCÓÕ«W‘””¤õG¾¾~G„~ĀĆĆńąƒ¢cĒŽčŽ½»ųĄ.T§W©Txė­·ŠÆ_?<śč£ųēŸĀČįÇѿ\¼x·oßĘģŁ³?üšΜ9ƒ®]»=§–-[āĪ;øpį._¾Œłóē–.]гgĻB”P ::o½õlmm±qćFDEE”iÓ¦z'•JqēμóĪ;Ų“iNœ8Ł³gćŪoæÅåĖ—!“ÉōęS.—揕+ųļ’ '''|üńĒHLLĈ#pūöm³ü1/\” æ««+ŠŠŠÄ_©e2{ģ1qYNNŽX•ßPæ1yyy8}ś4üqH„R¬_æ™™™pwwĒéÓ§‘ŸŸ  ØØo½õ\^†®·Ąi+CČĶĶűcĒąęę†Ī;Ć××ššŠøø8dggC*•źŻ×R©IIIųšĆįččˆåĖ—#66V\očžķŌ©“ŽĻĪåĖ—M*c×Tó~¼uė–Ö½©/ͬ¬,½ŸÜøq³fĶļ÷„„„:żł©ī}"|:t>śØXs.;;‡Baaa„ߕśß]•} ­×,~5pĖ–±±ę 4„„ØG‰ 5> `’~ug«‘‘µYBda " "°³³ƒB”@Ė–-įääggg“iÓnnnHNNʵk×P^^nRUź±cĒbŠ A8ž-[¶ąĶ7߄‹‹ VÆ^¢¢"ŲŚŚ¢°°yyy ÄęĶ›QTT„R‰+W® 44»wļFRR–-[&»¤¤¤Ņō„R)T*о}{ńŃvķŚ!)) éééxą`k«¾„'N­]-Z“€D"‹‹‹øŸ‹‹ qćĘ ½ł”ĖåhÕŖ•Ų©©‡‡ņóóįąą`ŃkYÓć8p]»v„`Üøqøyó&Ś“i#¦#Ō¦0“\Wjj*Ž{ļ=ńż!CÄƵk׌^oSÓØ ”ꇐ¶P㢤¤ŁŁŁČĖĖ«q¾¾¾bmŚ“ĮķŪ·”ø×®ÕŠ=ūĄčżģ˜Z&Ę®©!ÅÅÅzÓ¼r劎ĻO||¼ųżØļ÷‚‚õėócMĀwWeŸ…ŹÖ›ŗ±<4ÖļO""¢zeóf uėźõÓįļÆŹ7$¤všµ¬\  ŒPƒŠ "^^^HOOGii)RSSѲeKųūū‹}'dgg‹5C4ńöÕ§¤¤Dk”“Õ«W#&&vvvH$xłå—@lJcgg‡€€ÄÄÄ ¬¬ AAAāĶŻŗuĆ’żß’Uéœ0lŲ0Üøq£Ā:į{”I¾uĶąf­Ķy¾|ĘĒĒĆĘĘFk™¾tĶqżņóóqüųq1Ļžžž¼WĶ-&& 6™1tż”J%¢££įźźŠ>śH\ž™™‰Ń£GWČæšŽŠr]>>>ÓéuśŠ”CFĖQXojÕ-Ćźī«ĖŽŽ¾Āg%??r¹¼B@E„RmĀØļĖƇėżģ˜R&•]SC „i¬ģ ŻļuõóSš÷‰\.‡\.›Źdgg‹Ū=śč£Ų³g€ū5I }WźŅüī2öY0Tf·nŻŖ“\«’] ķū“ˆˆźÆŅĆG3z|…åö/Ī‚óĒļ[;{µGÕeą@Ó·:H ®żü††;C†4˜ĪVõ݇†øīŲ »¾½­e³iŖz{{P1²²²płņeH$4mډēϟGnnn…<Ķ}5:u Ÿž9Š‹‹eeeøsē¼¼¼PXX@\\ņóóÅ?šūõė‡ćĒćčŃ£čׯ mŪ¶ˆ‹‹ū,łį‡*üĮÆėß’Evv6:vģˆ6mŚąŅ„KP©TP©Tø|ł2Z·nvķŚįüłóbwģ؁­[·ĀŃŃ™™™Ō°ÉÉÉ&•aUó)‘HĢÖi”p „&0™™™ČĢĢŌŗ^………āņōōtq¾ėwņäIųųųąķ·ßĘžóqj޼9Nž<‰fĶšįŚµkŌĶ0®_æ—WEeåhŽ4Œ•”¹ömŃ¢ ļ^¼xÅÅÅhŃ¢uē¦BĶ“„„q9ƒ÷¬”ĻŽ)eRŁ5Õ¼5ē „ičóS]ÖüüT÷Z;99‰ßS€:P”¬čׯŸÖpצÜcšß]••‰”õšeĆļO""jŒ¤@4ĮĮ•s¬®”‘ ~µF0D ō+bĶįƒÉ,D ‘ĄĄ@\øpåååČĻĻGJJ \\\ąįį;wīąīŻ»› 깉»u놔”,^¼vvv(//G@@‘žžŽo¾łׯ_‡ÆÆ/ €5kÖ`žüłhٲ%Š‹‹!“ÉÄ!|šAaéŅ„H$xąмyó i޹s‹-Byy9<<<šŚkÆĮÖÖ=ō.^¼ˆĻ?’€ŗŹ·0銔CńłēŸĆĘĘ®®® …½½=är9>śč#4mŚmŪ¶…R©¬“ å3>>^ļöžžž(--Å·ß~‹^xĮ,×O—ŠTAw¾²ė·oß>Œ1¢ĀņĮƒ㯿žĀ믿Ž'N`ńāÅšņņB›6m R© wyU*Gįßi˜Z†R©EEEbࢨØHļ/ŪśŹŠÖÖĻ?’<~ūķ7”””ĄĮĮ/¾ų¢ø‹-°~żz¤„„ĮÕÕ]»vÅ?’üļYooo½Ÿ9sęTZ&•]Ó¹sēŠ÷ćĢ™3Åł‰'ü¼źūü˜ślźu7õó³mŪ6cāĉP*•xńÅńĶ7ß@*•bÓ¦M°³³ĆŲ±cĶ~ŸĶO4;PݳgśõėW”iJ ’š }wUöY0“¾¤¤D«lĆ÷gm]"Įڵk­…ĆP_@,c˳ęč~d!įį@t“v"žžźš ””uo¤õ4sē²_‘zLRĶ}$ūŚjL2öČ8pŗ7/¼wŠŲFŲŽ^„R-0= @į½÷¼°] €2 T“ÉD @]½;-- ééé(//Æ“?///ž_‡h^?Š§ˆ0Æ‰×Æ"Ż2ĢÉÉŃ ~čb6Nš÷‰¾f„ŗ}-ń>!""¢Z£P÷šÆÖ+sęØkŒĢ˜Ń`śi,D"‚ &ˆÕ”éŠ”«ŁÕAŗ×OčSD÷Į×ϰŚų t芁µCź9~W™YHˆŗ k‡Õ+ ¦†ˆ _æ~ DLLŒÖÆå^^^šööF`` 8\(Õ=¼~5Ē2$Sš>!"""2³Ą@uPdüxķ¾P,,ŁŽ—åī”e¼?<§ĀäĖ]k-’ÖŌą"ąččČ*ŽõÆ_ͱ ɼOˆˆˆ€¹sŲX½«RģįõĆ×°óó³v.…Ųæ_}]"",šT¦­=.8z HjŚc½CI”IŪ ˆQ]k°6B‘ƒ+ā^~Ż·Æ·v.ŸeĖ€®]Ձ ō+’ąąŠ‡F8D³™5Ø>Dˆˆˆˆˆˆč¾¬ĆG‘üĶOÖĪFćŖnB£P˜ķ™¶öųǵƒ!fĀ€Q–°xJ“’¬Ę)0HH0Kg« ®8åģcrŖ"DDDDdVŃŃŃ5j”ÖōŁgŸįĢ™35jvķŚetcŪżžūļ5j._¾lķÓ“ŗŪ·ocżśõˆŒŒÄO?ż„_ż×®]³v¶ČŅbb€ČČ*ķR–“ƒø—ß°vĪ/…8qB]c¤¬Q+DŖ,Ƶ“¬‰”%""""²ˆ‘#G¢K—.€&MšĄ××K—.E³fͬµaĖ–-xģ±ĒмysĄõė×±yóf<’üóppp°vöČRrs3€Ó§ÕżT˜Hh:ÓźÅg¬}×Ź•÷ū1ŃyGܖ9Y;ē "DDDDdķŪ·Ē€Ä÷gΜĮĀ… 1{öl >ēĪĆ?žˆÄÄDxzzāłēŸG=*gŻŗuŲ“i :v쨵nūöķŲ“i222ąé鉉'bŌØQÖ>u‹S*•(,,DYY™øĢ××Ƽņ lll‰‰‰8|ų0@„R”wļŽhŪ¶-RSS±eĖ̚5KÜ÷Ė/æÄÓO?¢¢"ģܹŽŽŽČĪĪĘŌ©SqłņeüóĻ?(//‡†;;;\æ~Ńæ“jÕŹŚEÓxDD&ļ’°xšŽĀQg4¤ķŲ…Ėo-Bē’ż—Ī[>Į9s€€õмF:[­ź2T=l2CDDDDµ.++ ļ½÷<<<°råJōźÕ ‹/F~~¾ÖvIIIXµjŗvķŠ×_±Ƌ&%%į믿ƈ#šć?b芔X¹r%nŻŗeķÓ³8©TŠG}›7oʶmŪ‡¼¼<1RPP€ķŪ·cäȑxā‰'0fĢüłēŸŹW— ²²²ŠŖU+L:łłłŲ»w/&Nœˆ™3gB„R!66………Ų¾};†Ž'žxƆ ƶmŪPRRbķ¢i\bb€ÄD“7gәūJ“’prĢdÄ=łŠ’oąx’‘HłmCķ$ œ:e°_‘óŽģ+¤–0 BDDDD±|łr±‘•+Wj­;vģ 1jŌ(( L˜0………b=zt…'EEE€Ó§Oćāŋ>|86lŲ 6!ičzōč3fĄßßÉÉÉųå—_°wļ^źę3>>>ššš( 4iŅׯ_Æōø*• :u ®eҬY389©«ģ;=zō@RR|||ąååšöö†§§'’““­],T Ž:$óŽō¬ĆGµ–_xłuÄæ^;™š÷W@Ŗž"sÄ?®ĶŲD¦1äDDDDD”هˆÆÆ/rssÅuwļŽ¼ūī»Zū¤¦¦¢iÓ¦āūœœ€‹‹ ĄĶķ~§‚>ų žyęlŲ°ü1u`įĀ…ĖåÖ>żZįźźŠĪ;£sēĪ(--;VĶĻĻÆPr¹šōō4zLH$źš&ööö¶)((@JJ V­Z„µ¼¼¼qtÄXß5Ö¦3„IIˆ{ł M7¾żeŁ9xąć0Ų¹YøS…BݯȽ¼įš1(AÖ”£(J¾aķāj!""""‹Š×‡ˆ@x( C·nŻÄå6668wīœųŽÕÕÄ`Jff¦V’÷’‡ &ąśõė8pąÖ¬Yƒ`ųšįÖ>}‹***BNN|||ÄevvvpqqA^^œœœPXXصOaa!œœœ •J”R©ÄåJ„„„„zÓqtt¬payÓ¦M1iŅ$kEƒSøų38īŚĢž „„X$ ”éL÷ķė­}ŗµ&ań2$óŹīY¹½f#ņāĪ£Ūöu–ŠÜcēē‡f~~h6Mż™*MJBśįcČd€Ä¢Ųd†ˆˆˆˆj]PP°mŪ6¤¤¤`ćʍ˜6m®^½ŖµŠtcūöķøté8 ®;|ų0¦L™‚ćĒĆÉÉ ž÷Ŗ;::Zūō,.''ėÖ­ĆĶ›7Åe×®]Ć­[·Š²eKųśś"55U¬‰s÷ī]¤¦¦Ā××ĪĪĪ(,,D^^u J3@¢ÉĻĻ)))bM={öąšįĆšóóCjj*ŅŅŅØkŒüśėÆzƒ'T QQźN7[·Vwžj¤óĶźj,MgrćĪįXæHųd™IĮAŽŁó8Ņ„/rćĪ™¼9ŁŻ Žtüz)śœłżb¢ĆWŸ£å 3įÜ©cĶ ¬!BDDDDVąīīŽššpüų揘={6<<<0sęL“oß^«&IŪ¶mńųćcŪ¶møyó&śõė‡ß’„„„čÕ«Īž=‹/¾ų999pwwĒO<G}ŌŚ§gq>>>5j¢¢¢ÄŽR1nÜ8±ß1cĘąÆæž÷3fŒ,źÕ«Ö¬Y¹\Ž|®®®zƒ"ĪĪĪ:t(6mŚ„R ōļßööö;v,vļŽ „R „R‰=z4š¦Jµ&1Q=Dė¢EźŚ"aaf=|Co:“°x>1}hb]e9985ęq<šq˜XsĆZÄ$øWƒ$;Y‡Ž"ań2ä=oÕ¼Õg’jī#ŃŲ×Vc’°ą@Ą€Ó½yὃĘ6Āöö*•jµ ƒˆˆˆØ”[»v- dķlŌ{ūöķƔ)Sō®[»v- ŒA5ƒ &@… ޾ Ž¾eß}±ÆĪ›Æę”+”T–C©TB„¼?ÆT–ß[§žW©TX·f ę¼ł.Ģ”ōšäŒÆwgöĆ;śū›<²L‚ƒ+Œ7łPō}¤Į5ÉÅ šM›Ū{}-QÕ1 BDDDDDԈ%,^¦å¤Ė1īfīl·±Øw=z“µ³@DµlĒŽüģQĮ’“¬gĒŽÖĪBƒŠ¬¤ĶJ d ÓÖ)2'dŁŚ#żĻŻHŪ± Ž£‡[;‹ZJ“’÷ņČ:|ŌŚY©Ōķß6¢żĒįĘ7ŅäHJŗ?ŠPl¬zYT½ ˆZ; Ddüģ™Ÿnķ‘“ŠĄåó€Baķ¬’æł ‹—Õ™Z!в"q^³ÜĀ|^*0cąēœ>}?°Į GS/"DDDDDDdŽé)@·n@H0`€śÕ j³Vˆ¾ ‡ƒ² Źr€sy ģT*ÓY«eEÕÓą"*• *• J„Rœ—H$‰D"N •JC »R©ē5GDÖ#|.5?ļĀēXxÕ÷™ÆģóNDDDŌ(%&ź ‚ƒqć€9sj%ł„ÅːšÉ²jļÆf”Ż›/‡\œæ䊬ŻASƒ ˆäēēcҤIpvvÖZ>lŲ0 :ƽöÖ®] ‰D~233ńĢ3Ļ`͚5P*•°±±ųõŌSOaŃ¢EhÖ¬¤R)lmmÅc‘uĢž=#GŽD’žż!‘H`kk‹ččhlŪ¶ ‹/†J„‚ķĻ|eŸw""""ŗ'*J=…†Z¼)ͱ~#wö|…冂 Ąƒęa[^ŠiĆĪmPĮ²eźHbYY™°°µµÅŹ•+QZZ*žr,•J”T*ÅŚ$‰Dü•¹øøeeeāC”­­­ø]QQ `kk GGGDˆ¬¬wļŽ8~ü8zõźpppĄ±cĒŠ«W/©«?ŖT*Čd2£Ÿw[[õW¢šŖYĖDs^óR©”5ňˆˆØńˆŠ²xšVŹpČKß3ČQūlīÕ¢ičd@¤¬¬L|p±±±L&Cnn.^{ķ5¬Zµ pīÜ9¬]»VÜnŹ”)čŌ©JJJ R©PRR‚ŅŅRüż÷ßŲ½{7ѵkWźŽ ąąą{{{ŲŚŚņaˆČŠz÷ī7¢ØØH tœ:u ćĒGqq1žż÷_ģܹ666P*•xśé§Ń±cG­ĻūÕ«WńÕW_᫯¾Byy9lll0mŚ4DDDĄĆĆēĻŸĒźÕ«+|gß1666ü ""¢“ē[; ĘEG[< ҬoOąų?Ö>Sjd@DųÕWØž.“ÉĚåååČĪĪFDDŽ~ūm“hŃ×®]ƒ%KšÉ'Ÿ ¼\ +++CZZÖ®]‹O?żnnn8pą²²²PZZŠ’’Čd2­¾ˆČ:Zµjwww\¾|mŪ¶ÅÕ«Wįīīoooäääą’ūžūß’ĀĖĖ 111ųöŪońÉ'Ÿˆ£Ö”——kÕ¾; ““©©©X²d Ž~ūm4oŽ āw†‹‹ ĄŽŽžµÅˆˆˆØį;xŠņi pæļ" j‘ ˆó‰O>ł$ØnΜ9___x{{£°°Mš4AÓ¦MqöģY“nŻ€śéŅ„KhÓ¦ Q\\Œ^½z!22Rü˜Į¢ŗA*•¢wļŽˆ‹‹C»vķpņäI”¼¼ųśėÆaccƒņņr“kש©©(,,›ÓP())ŃŖķQZZŠóēĻ£U«VšššØš ö[Ā€5x11ź”c-ŁHp°µĻ’‰zÉĪĪÖ»¼  .Ž4coo;;;dggC„R!//iiiøzõ*Žyē­żóņņ——'n—™™ ™L†œœH„RŲŁŁA.—£¼¼„„„(((€D"Aqq1«ŹÕCŸ}čŅ„ ¾żö[Œ1§NĀSO=%~v7mŚ„ųųx±É äę梠 *• łłł(**‚R©D~~>$‰ŲœFųĪøvķĀĀĀ“ŅĢĖĖCnn.JKKÅ>‡ų]@DDD ž„ūQ(€Ą@uš…Č‚źe@ÄĀ/¶¶¶¶°³³¹•H$pqqA«V­0kÖ,(•Jq“ČÉɏ!—ĖÅ&A~~¾Ų‰"ÕķŚµCQQQZZ (•Jœ9sqqqXøp! ++ oæż¶4 v²¬łYW*•(.Vwą%|g<ūģ³P©TbGĶĎUYcŒˆˆˆŲX‹÷#‚~ż!‹“Öüu0¬®L&ƒ\.‡\.‡½½½ś„„R“oß7oŽÄķŪ·!•J‘››‹%K– °°P|ȑJ„hÓ¦ ÅŚ% ®^χ¢ŗE"‘ 00Ū·oGēĪµśquuksķŁ³Gœ>Ē*• nnnČĻĻGNNN…Ļ{»vķpóęMܹs§Āw† lll(%""¢:'ÓÖ™¶öę?pt“å3?`€åÓØg„ė™ikW$8øā¼£N:{‹UMƒ¬!"D„Ś!vvvZæęŗŗŗā™gžĮʍQVV„R‰AƒĮŁŁYlcccŒ5 _}õģķķѹsgxyy‰Uéuą„ˆź†ž={bĻž=1b„Xs£G8qā>ųąČårŒ=wīÜĮ/æü‚iÓ¦‰ū:99aŲ°aX¾|9œœœwww”””ĄŻŻ”””Ųøq£Ų«š!•J!•JŁÕ9Y¶öHpp(ʊą ,‡{Y¼J aW“x£¢,Ÿł{}@6BŠ*K#x%,+’Ś¢HjŚc»¢¬ČڧRļTēēL‰Ę؃*Ā$`Ą€€#§{óĀ{m„ķķU*ÕS_»v- ®/++Cqq1ŹŹŹ`kk+‹ @¦¬¬Lü5·¼¼\¬ń”Ł1¢R©„R©„D"D"AYY™Ųń¢ŠĢĘŽŽāhDd9111F?ū€ŗ¦Gqq1 Å”sår9¤R)Š‹‹QRR"~~…$BąDØéØæGŹŹŹÄ!|…fuĀwƒęw†ęHV Y^LL &L˜ ā śjqė[öŻKšź¼łźæłĖ•P*ļ8§¼?ÆT–ß[§žW©TX·f ę¼ł®YĪ£ōšäŒ_a¹¼8ŽEyfIC]‹ĄMļ:eœĖKą^V ēņRø—Wķąū÷[¾óÓÖ­ÄD˦a!B@#Ļęž³bš\œĻ²u0{šŠ²"tĻK3˱ œQhļTa¹ėŽĶ°ėŪ»ĘĒ—H$Šߛ„ł‚{óy ļ½ę…ķJ”iL Ņ˜LÖąjˆŸ UŲ5P„”4…$¤R©z„ż€ū•J[[[­¦2B:|"Ŗ[„„šłŽ Ć⠁NMĀ÷”Ļ»,$ŗßš£ŅÕB̓t;Gq™¢¬īeÅpP–U^‹$*Źņ‘ą` 2ŅŚE%ŗ_kĆF¬µ‘«šŠ,KŖ\@DųÅVųõ¶²u666P©Tā2a µfē‹Ų_Q$6d2™Ög€XĖC3 ¢ūY×÷y×Ü_X¦ļ;ƒßDDDTßeŁ:hÕ\pP–AQV w±¹F-’ŚźGÄĀĶ>V„&+…R[ImÄ2”†«AD4_+[gģ!Fsū ŖŒ'„€IeŒ}Žų ""¢Ę¢Hj‹Ū2[ܖŻo:!Ō"Q:wKg 5Pt›¬äŚČÄ GUśå †w™D³I·CGąžhĶū“0Čß_=ŻėGD_“ķ¬ĶAUS/"1šØQāgŸˆˆˆ:©²ÜŚY0Y^ÜyĖDœ9·×l“ö©RU/"Olķ,Q-»Ÿ‰Ś[¼b&ÕqėÖžmķ,Š=™‡Ž Õ‹ĻX4 —Ī3 BĆ!RˆˆˆˆˆˆØŹ²µxŠG±öiRʀUYYNrćĪY4 —ĪĆÖÕÕŚ§J "DDDDDDT-¬%Bõ"DDDDDDT-™‡ŽX< KwÜJ"DDDDDDT-yqē-žkˆŌ¾ś4ŚQĪÓŚ """""¢ś©(łJ“’,šū©}%…ÖĪB­`@„ˆˆˆˆˆˆŖ-żš1‹§ĮZ"d ˆQƒ”›[„Ėń©ā«9mß‹Į«&”Ē÷#­}šõZMĖĻŲuØī5Ņ·Ÿ%Æs]ŗ—Ŗzī5ÉóɘėZÆDDTæÕF?".¶öiRdkķ 4R‰zõźŽ#Gwź]?vĢŲ±cRÓ.ĀĖĖĆŚŁ%jRne£y nŻĢBó ­u’ŽbUģ\Læ g™3z¶Ą«½fĀĒÉKė!ļų¬æōū»æā›1Ÿ ½gqYröM|zųkÄ„^„£ƒZ÷Åk½žĢFVi^÷%ĀŖŲ ør7%å%bŚś8Ż\±÷éu()/Åg‡æĘžkĆŚĄ}_‚ŌVļ~¹;¦@©Rį…ķ p*ål…2Øīŗź0T.Ę®ƒ±uÕ½¶Õ{ūVū—3ķ=Ūą•ž3ѵiG£éU÷Śž{ć$~9½±·ĻĮÉNŽĪM:ą•ž3ŠŚŻ·Śy±Ä¹ēåĆŁŁ^|%"¢śÆÖFšłÄŚgJ "f°ió*xx(¬ "Ņ`ģ”kŻŁ?0³ŪtkÖ J•ėĪž7v’«Ę/78¤ę§Uxh ‹ś}Zań·Q®Rā—Óėń}Ģj¼Ņs¦Ń|īK8„ÅW`Į£/£g‹npµw×é>“æµ÷#tš~š[ÜfÜĢIĮśIßŽŪ’ÖŻŠ'»üŸŽ}M9¦ąēSk`'µÓ»u×U•±r1vŒ­«īµ­®·ö~„Ł<‹`’>€ØÄ°pļ‡ųėÉ’MÆŗ×öq›ńt׉ų|x”*%ö%ĘÜ]aŲ2eeµób‰sO¹•fĶŻÄW""Ŗ’„~Dģüü,–Gš!K`@Ä BB¬_ՙˆ“uōÕzÕōÕč“ŽOé4+c×VzL}M „‡Ó+ ųjōGŪ:fLĮS›^Å+=gŠŪŚHmš€GkĢļó¢ųĖüŖŲ ˜Ū{†“ég4ķĖw{ūĀ‚_ģ¼²aęĮĒÉ šJĻ™ųčĄrń”ŁŗĒ€ø;°ńüv¬ž°#W?”µ}uÖ”āĖBtāQ¤dh•|ul%ÖžŻŠ]ŪO†¾ē·æ‰·’^ hęģƒļĘ~Ziz5¹¶šĮV®Ķń͘Å5Ź‹±s7¶ĪXzDDd\}Ż#7īša’EÓp“7"dVģTÕĢRSÓ1uŹsČÉÉÅź’}‹Ś·Åß“v¶ˆHā²¼»ļSÄŽ>‡×ū¼X£c… ˜‡˜[g0rõ˜“ž9Člģ •ŖæbßŒÅ“/”ßĻ!˜õĒHĖĻ÷S©”(*+ĘśIßćĻ'V# Y',Šś\ėŲēÓāq1ż &t­7mĶT@ż€»ė©5ˆžń;–ü/2 ³¶I„Ē\|hśśö@?ß^ŅØīŗ‰G1ÆĻózƒ!0µSķ䘌)§oŸ«R¹Ō&Cł4vmZŃ ĘžŠŲŗ£ŚĘĒæ¬RŗU½¶Ēgż…#ĻnƦĒDצćó#ßÕ8/†ĪŻŲ:sœ;Õ/µÖ‘1 bf{÷F£ØØĻ=÷BBFbįĀ׊©ÓCÖĪéHĢJF薣°³±Ć-‹Ģ©FĒkåÖ_ŽśŃ36a瓿”‰³7Śy“,Š^ŠYAO"zęfDĻŲTā~Mœ½ńt×Ipµw†£S:Ć„ō«ZĒžöų/˜Łm d6÷ūēhę҉™Éāū„ĢėhīÜDk?[©-|ŻZ`nļY8~+¶Ņcīŗ… ē¶”Ē÷#ŚĀku×€J„‚)$I•ŹÅZ4óiģŚĘ¤œĮS]'ĀYꙞī: §nŸ­ōų5½¶¶R[“ŗ·īhrLņbģ܍­3WzDDTä=Ņģl‹¦Į~DČÜ1³;wŅ͚ßocݲeskg‹ˆ4숒Æžłžé> ļ ˜+61‡Ü’|ü}ķ"Žü öłP\V …ƒJĖKńćÉß“¶öļƒ_No@nI> J ±öģV<čÕV\śöy$eßÄø‡†kķ7¢Ż@¬8¶iłHĖĻĄWĒVbTūĮZŪØ BZ~~ˆYnM;UzĢć³žŅš„e5Y×ß’,;ņ=Ņ īź-Æuēž@Ai!֝ū]›ÜNƲr©m†ņiģŚ¶óh-žC^I>~=½ķ<ü+M«ŗ×öŻļćlź%”*ːQ‰Ož}Ś×(/ĘĪŻŲŗš¤GDDõ×ń~#‘°x™E#о¬%BęĆ>DĢĢĒGŻi\Ź­ŪⲄ„$kg‹ˆ4„G©›¼µ÷#¼„±}m5&{ä8Ż›Ž;hl#loÆR©LśKiķŚµx|Ź`S6­5šŖŽ¾ æīpwwĆ7ß.A\Üy|ōį2— 5ķ"¼¼“w·v6ˆˆˆČŹÖ­ż&ØĄŠm–©Æ™¦¾eß}±ÆĪ›„R e¹Je9”J%TŹūóJeł½uźy•J…ukÖ`Ī›ļšå88 …3f ­åF-&&yyyˆŠŠ—iĪk®›š:`Ą€j§¬¬,ÄĘĘMW3½€€ųłłY»Čj"DDDDDDuTRR"""‰¬¬,£Ū ½[¶lAxx8‚ƒƒ±’~kŸB£5ž|ƒ}¶lŁ¢õ>88””” ›››ILjŽŽFpp°IŪźę-00ƾś*¦OŸnÅR«]l2CDDDDDT-Z“ˆˆˆØ4¢O@@€µOj ** ”””š÷÷ĒņåĖ-ž^LL BCC1pą@dgg[ūōkE½¬!"·µ³@Dµ.“Ÿ}"""j²³³1xšą MbŖŹŌšT·eeeaΜ9Ų²e ¶lŁbrm‘źŠŠŠB@@bcc-ž–µÕĖ€QCdJ0Dč÷A7ą…ŲŲX±6Éøqć¬}:¤C”P 88øBķÄÄD$&&mb…Įƒć÷߯r””” ­p¼mŪ¶é½×1gά\¹ŅŚEfQ ˆÕ•C‚ƒƒ1gĪƒŽ°°0ꦇ²öéŲ¼y³ĮõŁŁŁb0‰‰‰ÖĒÄÄą’žļ’š÷ßW©öFhhh…ŽZ €°°0lŻŗ”””šeEFF"<<¼Aw¶Ź>Dˆˆˆˆˆˆź€ššp½Į…BČČHģ߿ߤZ˜={¶µO‡ŖĮĶĶ Ó§OGBBĀĆĆõncp]uŒ7ĪąńŖŅ)l}Ā‘•EGG#""Bļŗ½{÷6Ŗ‘?H-,, ‘‘‘z×EDD ))Élié6§諄Ґ°É ‘•ś…>""M;)) ±±±ˆ—  Ž4—HJJŖŠ‡ææ?üżż+4©źq£¢¢ÄĄ@pppŽWUÓ§O;SÕn¶>>z穆0 BDDDDDdEĀC·®ąą`‹5}ÉĪĪFdd$"""ŒÖš÷÷Ghh(ęĢ™SéC³D"©°,<<\ģŪÄÜū ēšėÆæV:"OHHˆŃ¾;tEGG#<<\ļuQ(˜3gN„ł3—ČČH(Š Ė·lŁb¶€ˆ”Ś& }¤"6™!"""""²"}枆›1ŌTtt40gΜJ›D$&&"<<5؜¶nŻ Ģ™3Ǥ|iÖ~©ĢŖU«l°’Œ¬¬,„‡‡cąĄµr®nnnzļ…¬¬,DGG›% }͵jZ»¦>`@„ˆ¤ÜÜ\ÄĒĒ‹Æęō}P„ŪlßŽA«™“­9ö³Ä9ŌuµquõśY+½ŗBųƒ·.żANDd†"–č7DxŲÆj߉‰‰ ĀÖ­[­PBŚęĪ‹ £¢cjM‡ČČH“QQQQ˜;wn­œ³”ü›£ÓÓE‹é ˆźÓ¦!a“"jnŻŗ…-ZąęĶ›hŃ¢…Ö:͇ȳN˜5ŻoO|‹oĒ|‹öžķÅe%å%ųģšgŲ}m7`xŪįx£ļ°“ŚŻO T)ńĀöp2夘ßŲŪ±ųņŲ—øœqŠŽ³=^ķł*ŗ6ķZķ¼›’O}y1ę@ŅDĘFābśE8˜ѳEO¼Öė5ų8ł½śōĶ}­ĢIßõÓwnnųūéæk|ššžpģėŁ×ńéįO—';' l=³{͆ĢF&nkĪūĢ÷g^^œÅW"¢†ÄPss‹ŽŽ6ų°ļļļ( dee!22RoĄ!44{÷īµxæ&†,_¾Ü胺Šo žL¢W% R˜3gŽÅūZéŌ©“Žå¦¶tkČdee!** [¶lŃ{ŒČČH“F4Ŗļ!¢ÉŲƓš°g‰_×SóS+5~‹ū 7rn`Ƥ €w÷拵g×ā©.OŻOšó©Ÿa+Õžŗ^øw!f?2żÕU5÷'īĒ›{ßÄĪ'wV;ļ¦äS_^ŒY{v-žéö ŗ5ė„J‰ug×ažīłųeü/•^‡ŗŃ„ļśéęįŽ…ččŻQk]uļAC÷‹”2  GļV½ńɐOP®*ĒŖÓ«š]Ģwxµē«ā6ę¼Ļ,qŽŗu Ķ›7_‰ˆŠģģl½ĖĢž–”`HDDD…¾J–-[†3fTdeeažüłŲæ­—Utt4ęĢ™£w]HHŽy罁š­[·V¹<ĆĆĆ ???dggcĖ–-˜3gŽŽ QDD–-[fŃs7€25 bØÜtłūū#22²Į7•°É 5HĀęžõbűxōēG1cĖ Ü̹).ś>AßA©RŠó‚æ®ü…W{½ 'ų8łąÕžÆāĻų?+ŻĪÜ9ƒ ē7ążļk-÷vō†Ä’{’l$6šqņÜ-¼‹y»ę”’Źž˜¼a2āRćL:cł4–cé}=śkōõķ G;G8˜1„Ó\ͼj±ė`,/„X|h1F®Y”¬oęÜÄĢ­3Ńļē~Xql…VZĘö«ģś .ß½ŒŲŪ±˜üšäJĻĶŲ9˜š^…ō3.ćÉ.OĀIęW{WĢ ˜‰}×öUzm«{ŸUw?cėŚ·oń•ˆØ”0Ō·…¾N4kbÕŖUzžõC+W®DHHH…åQQQf뻢* Ä‰Ķ›7ü»oÜøqUŖĮ‰°°0q777LŸ>{÷īÕ»½”&OõMc † ˆŌŲµk× ‘Hšā‹/bäȑ读7u¤nņäÉhÖ¬är9† ‚ .zõź©TŠ““4@ZZlllŠÆ_?kŸUĀĮÖ»ŸŚ¾¾}ńŁ?Ÿ‰ĖOĢ:!ž:Æ9)¹)hķŽ0gē“qoƒ[y·*Ż/Æ$ļģ{ļō^Ž^Złųdč'XqlśžÜ}ī‹/’ż‹‡,,łg †µ†½OļÅÜŽsńĮL:cł4–—ŹŅÓō͉o0¤Ķ“ŹzŲÆĆŠē§>Y‚/žż„•žƒ±¼|~äsä•äį— æT(ėĻžł }ZõĮ®§vi5#©l?c×Oė¼ƒéÓį`ėPéy;‡ŹŅ3Tfķ½ŚcķŁµ((-@nI.~=ó+nēŻ¶Ų}VŻżŖr/QÕ|łå—–łūūW:Š”ę)UmZRS111z›…††šµÆcĒ Ō Ŗj,uUbb"‚ƒƒŌhśėb“™’ÉŌ8o޼½zõĀ“iÓPTT„įƇ#33æžś+<<<šĀ /ą±Ēƅ 0iŅ$;v »vķĀ“O>‰?’üJ„S§NµöéŒ÷12µÓT8Ś9bj§©óۘ*;bD„Öƒ½1śś>Š~¾ƒ„‹-ĘčFć‰.O@VŸY~Œ/G}‰£7Žb÷ÕŻā¶R‰vģŪ”sŠĶ§±¼T–—ćƒ !+ߌł¦ŅsʽLY†[¹·°ņŌJ„ķĆgĆ>3zĘņr ńÖO^w÷ éÅŽŽÅ‡ƒ>„£#¦už†ļc¾7i?SœO;‹éŀ@eL)ĻŖ–YŲ€0|zųS¬<µr;9ųqH„ŅJÆmuļ³źīWŻs'""撒’ō>ąšŅŒĀĻĻ!!!jA˜sČWSlß¾]ļrCµFŖK_ĄCw½¾!111VéWÅԚDZ5,5ūWŃw.AAAˆŒŒ“HǾu "fāźź*öøü×_!>> .ÄšįĆaaa7nvī܉‰'ā7ŽĄĪ;ńä“ObŪ¶m°±±Į¤I“¬}DÓū®H$&m×Ģ„2Äž#2ŠÜ¹ņ>v]ŁXn½ø,čū œ˜u1)1Xå„²ō³Åž3~|ģG“jIl„¶šuóÅÜŽs1vĶŲJĻ”²¼ØT*“Ó6Ē~€ŗvČ3Żž©PóĐŖ\?SĖĢ×Ķ+FŻo ōēå?ŃĪ£ĖÜgÕŻÆ¦ēNDTź(ŗ*#ØTĘP SūÕØČŹŹBvv6ÜÜÜj”” w "ŖÄŗsėPPZ€uēÖ”kÓFĢŁn$V[ŌüT¤ę§bűÕ~T„ū M"t›I@;vXuzrKrÕĶ9N’">ą>Ņņ¬8¶¹%¹U:cł4–céķˆßWž|Ļvļ xÆJĮPA…ŌüT|ó=ŗ5ķVé9ĖK’žXzd)Ņ Ņ+¬ėŚ“«xĢ5gט¼_eNß>¤ģ$Œ{Čō^Ś+»~Õ-3Č-ÉÅß×žĘ²#ĖÄĪr-qŸUw暞;Q}dčaÓPß"ÕahhVSūŠ04B‹9óX}AKŒÄSW j ИjÜøqŲææĮš6óēĻ·ö©[kˆ˜‰­ķż¢ōõõ ūµ×^ÓŚNˆ8Nš4 ,Ą—_~‰œœL™2ÅŚ§@ŌhčvŠ ˜^+¤LY†aæĆąƒA¦õo0­ó4ÜȹIŌµĄ†µ†)jö™’`Šųģšgū›ŗ@—&]šßA’Ģļ3Ÿžć֌CNqN…ó3tÕͧ±ō¢¨GŃt`Ęō_ŁßąuŽK%Rx9zįQßGµ:ü4tĘņņzļ×ńÅæ_ąÉMOŠĮ aŻü>óńī¾wńó©ŸŖ•WcūUę›ßąŁīĻV½ÅŲ=XŁõ3ÄX™ ėd62“óh‡.0©/—źŽgÕŻÆŗēNDTßVh¾U«50źŗ†ŅOGuźøÕ\A”°°0DEEUžEEE!))ÉāĆ [‹iõ½+ī#ŃŲ×Vc’°ą@Ą€Ó½yὃĘ6Āöö*•j)‰Æ]»¶NnÜøV­Zį’žļ’°qćF@QQ:uź„ĀĀB|ńÅšššĄāŋ‹’żžžžHHH@›6mąåå…ÜÜ\ܹs‡_vDFÄĒĒ£}ūö5?Õkk׮ń TlŅØÆ‰£¾eß}±ÆĪ›„R e¹Je9”J%TŹūóJeł½uźy•J…ukÖ`Ī›ļšżœō o Ąl}8,Z“Ho S›„FGGė}šŽŠŠŅŖe¢Æ9qxx8ĀĀŒߔżŖ{ģšžSMö8p`…Cppp•‡,ĪĪĪÖŪ”Gx®4Ēyźę3śśP±D_"‰$@€ā{“0_po>@į½÷¼°] €2 T“ÉŲdʰk×.ōźÕ /½ōƌƒœœ¬^½Z¬ŅŌŗuk!==#FŒ`0„ˆˆˆˆØ‘2Ō‘§¹: 5Ō¬ĀŌ‘D 51µ’ KCm6ٱ&C#ż„††š5Cż§4äŚ9l2SC-[¶ŌYmŪ¶-6mŚdtßćĒ[;ūDDDDDdećʍƒææ…ĻÄÄD,Z“ØŚµ :uŅ»üģŁ³&u˜©/šąļļoŅŗęz˜ÖW>”YQLLŒĮĄ˜)£U…9;ņ­/©DVV–ĮˆĢ›7®®®ÖĪ&Õc”””z|ĆĆĆįļļ_£& P(xMi ‘­·’ }Ķ2 õ…bŒ0RgeBBB*KxV«iĄØ®Š‰‰Į!śūü 7{ ČŅż”ŌE ˆTB”P˜}lk""""""MaaaŲ¶m›Žf,”””ˆ­ŃCpHHH…~J¢¢¢m“o‰ššp½5ō5×hÕŖU…ü'&&L#;;ŪäZ!!!z· ǘ1cÜŠ°Ė—/7XöfÆ­·…BaņhDõū!"""""Ŗ¾ūī;ƒż8DDDĄßßsēĪ5Ś÷GLL V­Z…¹sēj-7ō#oHHˆĮć­ZµJomłąą`½ɆjčK#)) ƒ6¹IŸŸŸĮ>3‚‚‚°hŃ"dggė]Ÿmp]]ƒE‹”uė֘3gŽŽ`ˆB”Ąwß}g¶Ś!ŁŁŁX“h‘ĮkgīĄK]Ć"DDDDDDu@`` """ >ų MD„ …ęClnnn… Ć²eĖÄy???„‡‡WŒdee!((”””bŗB:śš»( ,Y²Dož ÕāŅ „‹‹‹Ž¼š"<<[¶lŃ(GDD‚ƒƒÅĪ^'öĆQšÖDEEaąĄZĖL-lÜø±Zµa"##µ®gVVbcc6i²DM”ŗ†"""""¢:bśōéš÷÷GHHH„\VÖ?‡nS•°°0$&&āWßr]Čżüü0gĪƒ}0zčר1tü-[¶¬Ķ••…-[¶čķ £.HSŁuÓGhņTݚ!¦\[Mųūļæt‡µ›ĢÕ) @bbb‡UÕX¹reµŽ«P(°eĖ–J;a ÆR †ČČČ*uŚ9`Ąœ8qĀąPĀU)‹ś@čLvóę͵œoĮ€"""""¢:ĒĶĶ +W®Ä‰'j°oCŦ#ŗV®\‰ØØ(“ …sęĢAbb"ʍgR¾’žūļJƒ.8qāDµFĻ ;™5µ\<==«œŽ5( „„„ ""‰‰‰Ų¼ys­tjŒˆˆdee!,,¬QC6™!"""""Ŗ³±råJ¬\¹ŃŃшEVVV…fBpCčC£²Ś`’žżˆ‰‰Į”C‡«ÕĮ©pœąąą*? Įœššš }WWč”5  Āł8;;WšFXXĀĀĀØØ($&&Šē…B€€ĄĻĻOk}i Ė©Ź~ū÷ļGtt“ų^øvš„< Ē0©¬…>HöﯰJØA“——g0Mį:ź~It˦1‘Ts‰Ę¾¶“ €=rŽœīĶ ļ4¶¶·W©T LI|ķŚµ˜2eŠµĖˆjY||<Ś·ooķl‘•­]»&LØT*­uŗļ -ūī‹%xuŽ|(•J(Ė•P*Ė”T*”RޟW*Ėļ­SĻ«T*¬[³sŽ|׌E@äŽ£øž{»¾H$Šߛ„ł‚{óy ļ½ę…ķJ”iL Ņ˜LV/kˆØfķ,‘š³ODDDDDęĀ>DˆˆˆˆˆˆˆØŃa@„ˆˆˆˆˆˆˆDˆˆˆˆˆˆˆĢmą@`ī\ + ˜1pwōtȊÄÄūė% uk 2²zi Ē RK"ʏbbōo?c†:Ÿśņ5~¼zžNYŠzهQ&ʏWĻ..ŚŪ$&Żŗ©ēCC…B½ķŒĄéÓĄ²eUKsłrõž!!ĄŲ±źćGFŖ—ķŻ jo?}ŗ:葘œ:„N-¶lĀĆļ/k€!""""""²„ŲXu@!!š÷Æø~Ę õ«f°",L¤ˆˆfĻÖæŸ!aaƒ(]»ŖkŖ¬X¬\©½.8XōWA–-S×& Wē',ĢŚ%hQl2CDDDDDDd YYź ƒ¾ Fb¢ŗęFhhڳg«_W­ŖZzśjsĢ™£~ݲE’>aaźō#"ŌĮłóÕĒłī;k—žÅ±†‘„„„č_.4©ÉŹR×ĪŠ”˜x›źŌŅŲ²EŻäF³oc}|÷ŗß‘!Cīqtƒ4 Pƒ ˆäääćęĶTd¤g£øøöö2xz¹”E øŗ:Y;{DDDDDDԘ%%©_«ŪŖ>11ĄÄ‰ź€Jp°zōwšŖ)0P]S%2R]›EØUŅĄ5Ȁȅ øu3MkYqq nŻLĆ­›ihŽĀ:“¶v6‰ČŹ”J^xįNLĒńć¤`Ud<.^Ģ‚³³zöōĮ«Æ= ¹µ³KDDDD Ńžż÷5‘•„®į'Nhך7¾oLŒ:¢P؃)‹5ųžC€Ų‡ˆ ‘ĖåĖµ`„e·n¦įĀ…kg•ˆ¬ģēŸ/ĮĪVūkpŻŚk˜łĢƒŲ³w4~ß4ž­]šĘü­U""""jh PænŻjžćEFŖƒ"sęT½¹ĖóĻ«ƒ!{÷Ŗkˆ„‡Ŗ·iP‘œœ|1ҹs :w„³³zX#ggq™ÉÉÉ·v–‰ČJāĪÜÅĘ Xō¾ö_}Ż}ū6…££-œķ0eJ[\½šcķģQC¬BŒšŹĪVæź+"Āų~‹©ƒB E„ęłē­]B× "7o¦j½wuuCĒŽ]įå华»ĀÕÕĶčöĘQQ‡±2ņKDų™™Ł÷ŲS(++ƒLfŲ¼łOČd2LöÖ¾DuÖācŃ÷Ѧčׯ©ĮmŠ‹Ėńī»'›×ēw±v–‰ˆˆˆØ! 6oV,ęĪTO3fVķXžžĄŹ•źł3ŌljŒT? @½\³öHV–ŗV ā»+WŖóŌĄ›Ī4ØNU‹‹KÄł¼¼\\»v ;@&“”¤¤×®]B^^®ŽķqqqFŅõSw”••!  žż÷$JKKÅķÜÜ\ńżK’>†M›v ))eee€S§ā0ļõńÖ[³akk‹»w³šĆæāŠ”įį”@JŹ|÷żēx~Öėˆ=‹Ū·SQZZŠQ£‡b’žCˆæŠ… _Ćšįļ…ĶGČø§±sē>tøŗŗ`ĖÖ_¬})ˆź“]»n6¬æ&.ė“YģX511o-<†ŻńƏżįą`cķ,Q}£R™¶fŒÜ{Ļ«Ę:Y5vÜŠPõøøÜļKDßń Į@ߚ ™iµ¢«- * bo/ƒĪĪ.hÓęA1"“ÉЦ̓(**ƒ"öö2“Ž[^^Ž>ŒĄĘŪ’r¶¶6(..J„By¹RÜ®]»ū#×x{{ŠŠŠ1lX0<ė×oşīE»v­±÷ļß1dHČd2Dķ?;;;4mźƒ™3§į½wcĒŽ=ČŹĢ†ƒƒ= ź‡Õ«7/ž‹”•æĖ—Ɖ‘ŽŪ[ū2ÕyBąC  ٱć:¾żęfĻéĦ2DDDDT{ŖŚŖ1굦hPMf<½Ō}„Čår±Ļu3™Xę3]ÅŃg„ķ+óÕW?céŅošŌS“—Ÿˆü‚ėčܹC…ķ$‰Žże2Ö¬ż·RĪāŻw_Ē•+ ųå—õpvvĀ£ö¾}‡°gOFŒ9»wķǾ}1pą£pt”Ć×·%`īÜp-!Fkš1cŖ˜–­mƒŠqÕŗš°ܾ]€·C ĶāTPPfķ¬‘5؀H‹>Zļ…>CŅÓÓÄ>EŒmoH^žz4š¤¤düõ×ßxfęlÜøq €ŗ³ÕŹüšĆÆšōhC‡žE+_õ/Ī®®źŃoFŽŒ“'ĻąäÉ8Œ3 0jōPüūļIÄĘžÅØŃCĮĮ}Ѷ­?Ö­Ū‚˜˜ÓHHHĀ ĻæŽGz GVGĄ Ŗ Ķ#ĒOŒ×;9:2ŲHDDDDԐ4؀ˆ««š·šFaa!āāb#6ÉĖĖ—¢y oøŗ:™tܗ_ž‰Q£†`óę?ńܳsįć慭¬FĖ–Ķńü¬y•ī?yņ8 Š3B_ÅóĆńä“1kÖӀQ£† ¼¼‰C‡ŖĒ”6,*• *• £F 88Ųcē®õčÕ«;^~iʎy99¹ųuõ7š÷oeķ¢'""""""ŖWÜOž:Øūńøu3­Ā:at™ę-¼ÅķLįī®ĄöæUX~=9VœWŖ“‡šżęŪĻšĶ·Ÿ‰ļ7m^e æķ+ģėźź‚ā’›¶mŪÖæoŠŌ{œ–-›W8é׹"€:(Ņ¢…nŽLEFz6Š‹K`o/ƒ§—Z“š1¹f5L 2 Ø›Ļøŗš^ „ˆˆˆˆˆˆˆՇ‘)!""""""¢F‡"""""""jt!""""""¢F‡"""""""jt!""""""¢F‡"""""""jtl­źX·öokgˆ¬ąäIkē€ˆˆˆˆˆŠz4hµ³@DDDDDV°oß>kgˆ6™!""""""¢F‡"""""""jt!""""""¢F‡"""""""jt!""""""¢F‡"""""""jt!""""""¢F‡"""""""jtl­"""¢ĘJ„RaėÖ­ppp—ŁŪŪćᇆO_TT„Ż»wć±Ē³ų¹DEE”M›6šõõ—%''挵k0`€YŅØ­ółć?LNcėÖ­šõõE·nŻÄe*• üńʍW­ō8€žżūk-kHåKŚÖ®]‹œœ½ė\]]1eʳ„õż÷ßĆĮĮO?ż“µO›ØN`@„ˆˆˆČŹ ¹\HKKƱcĒ0dČŲŪŪ×čø;vl­œCóęĶqūöm­öŪ·o£Y³ffK£6ĻĒTR©ø{÷.<<}}ūöÕśÅ?55.\ ®ÅšŠC”iÓ¦ČĪĪĘæ’ž‹aƆ‰łŲ±cGGG\¼x)))H$P*•hҤ :vģ‰D"n߬Y3\¾|YĢ—J„Bjj*:tč󝕕Uį „W\\lŅłäēēćŸžAŪ¶m‘œœŒāābųłłįĮ4ūõR*•čܹ3NŸ>ąą`­2:÷³gĻB©T¢K—.ˆ…²²²PTT„“'O¢{÷ī¾|ĶŚEńńń())A=“jŽ‘e0 BDDDTĒ(•JH„RH„Räåå”M›6šóóCII Ž?޾}ūĀÕÕ9998|ų0† ///ܽ{ŽŽŽČČČØŠä¦øøĒG’žżįāā‚üü|DEEašąĮFór÷ī]Üŗu  /^¼ˆ‚‚899‰Ū¹øøĄĮĮb^ąģģl4ßŗēh,=“ĪG"‘ °°R© @aa!öģŁƒÖ­[C&“™żzłųų )) hÓ¦Ö:cēŽ®];DEE”}ūöHIIĮ AƒP\\Œ£GjC{ł’śzœ×ß¾}...°µµÕ ˆŲŪŪWؽP\\ {{ū ³*•Jk_777±Ÿƒüü|œ8qŽŽŽhÕŖ•ÖńÜŻŻQVV†ŒŒ (•Jø¹¹Ušo}£kJO³Ö‹±ó±–vķŚa’žżČČČ0łš%$$ yóęHHHØ“SֆT¾„„„øzõ*zč!K\Š%// P(“–»¹¹!%%999āē×Ų6ŗGGG 8'OžÄŃ£G666xšĮѧOH„lL@ "DDDDfœœŒ‹/āāŋÖµkם:uŖqŽŽŽ8}ś4rrrąźźŠāāb9r}śōL&ƒ··7®]»V”¹Œę¾¹¹¹pqqAnn.rrrąķķ ‰D‚’’ĮĮĮ‰‰‰ā~ĀƔŠa¦““ ÖhÖ¬.^¼Ø5ś‰±|ė25=cēS^^^ W¼"©TŠ.]ŗąĢ™3āƤ±sjv 4{öģA^^¤R©Ńü×Ēņ={ö,®\¹¢w““S…Ąisvvdeei-šČi6w2eMķŚµC»vķPTT„““4œ>@žYpY»IDAT}ēϟGóęĶ+ō‡CŌ1 BDDDd­ZµBAAZµjGGG‹¤!“ÉгgOœ:u *• J„<š€Ų“ĮŪŪW®\GŃdoo=ząäɓⲠ  ń’öķŪ楁°··GóęĶ!—Ė”R©ąķķ””ģŪ·666ā2C±Ķ›7Ē”C‡“ņ`,ßŗżNKO³Ę‚±ó)((°ōå6ČŪŪ[ TvīgΜAėÖ­acc???\ŗt ŻŗuƒL&ƁĦõ½|;uźT! XPP€äädCLŠ¢E xxx 55D³fĶpėÖ-ܹsb_2¦l£)%%{÷īE³fĶÄ&SĀw‰„¾ĆˆźI5÷‘hģk«1ÉŲp ąĄé޼šŽAca{{•JµĄ”Ä×®]‹AƒY»Üˆˆˆˆō*++cüzī?ž‡ž%ĖØÉēdß¾}˜0aTØŁ¢Æę’¾eß}±ÆĪ›Æī“\ „²J„*åży„²üŽ:õ¼J„Āŗ5k0ēĶw-V.‘‘‘())ĮÓO?­5ģnqq1bbbpżśuäēēĆÉÉ ~~~čŽ½»Ō4e›ļæ’xśé§gΜĮŋÅf9nnnčܹs…>eˆĢM"‘D(P|oę īĶē(¼÷^˜¶+P¦1€Jc2’·&"""2#Cˆ*Ēω~”””z—ŪŪŪ£OŸ>ū¢1u›Y³fi½ļŅ„ ŗtébķÓ&²ö”CDDDDDDD"DDDDDŲ\†ˆØq`@„ˆˆˆˆˆˆˆDˆˆˆˆˆˆˆØŃa@„ˆˆˆˆˆˆˆDˆˆˆˆˆˆˆØŃa@„ˆˆˆˆˆØłēŸšģ³Ļ¢_æ~Ę /¼€cĒŽY4͌Œ ”  ĄŚ§OdDˆˆˆˆˆˆ;wbįĀ…?~öķŪg±tŻŻŻ±k×.Čårk‘Il­""""""2ŅŅR,]ŗ/¼šF-.=z4²²²šé§Ÿ"88R©ł—J„šōō“v™¬^D,Õ$"""""ŖÆĪž=‹ĢĢLŒ?¾ĀŗńćĒ#""gĻžÅ¢E‹šÜsĻaĈŲ½{7~ųįlŲ°'NœĄņåĖQPP'''Ģ›78ž<ęϟ”C‡"..ŁŁŁö’öŪo1|ųp8pŽŽŽ5zōh,^¼;wĘéÓ§ńĢ3ĻąēŸF—.]pīÜ9̟?żõ—µ‹’z™2eе³@DDDDDT*•Ń÷†–Õt_Ŗ(%%žžžz›­8::ĀÓÓ·oßFPPΟ?#F ..=zō@VV^żu|öŁgčŁ³'Ž;†×_Ū·o‡L&CNN –/_Ž+VTŲ_“±cįĢ™3čܹ3Nž<‰N:!66]ŗtĮéÓ§+‹ČRŲ‡Qakk „Rip½R©„D"A`` .\øˆ‹‹ƒMš4AĻž=={ö„»»;Nœ8‰D‚¢¢"Lš4 ...z÷×dģX=zōĄéÓ§§NĀŌ©SqźŌ)@ll,zõźeķb¤F‚"""""¢¢E‹ø{÷.ņņņ*¬+((ĄŻ»wŃ¢E įŅ„K(..ĘåĖ—ˆŒŒ ÜøqcĒŽ§āābäēēģģģąģģ z÷×dģX={öD\\”J%1dČ\½z*• gΜ©\!²”z×d†ˆˆˆˆˆˆōėŠ”|||°qćF„††j­ūż÷ßѼyst芉Mš4ĮĪ;Ѷm[øøøĄÓÓžžžųķ·ß*÷źÕ«H$ā{ ūgddˆė är9¢¢¢Š¶m[ŲŲŲ U«V8pą\\\ąķķmķb¤F‚5Dˆˆˆˆˆˆ©TŠ… āēŸĘüĀĀBaĒŽų駟°pįB1°„-[¶ˆ52zõź…[·nįäɓ€›7obҤIČĪĪ֛–īžš*;VPPž÷æ’”[·n€®]»bõźÕ¬BµŠ5DˆˆˆˆˆˆžżūcéŅ„ųńDZtéR@ĒŽ±lŁ21؃6lĄ /¼pssƒ%K°lŁ2äęęĀÖÖ3gĪ„››ŅÓÓ+¤£»æ&cĒŌ}ŠlŚ“ ³gĻ ˆ|’ż÷xź©§¬]|ԈHŖ¹Dc_[IĄ€9GN÷ę…÷ŪŪŪ«TŖÖ. """""Ŗ:k2SŻ}æūb ^7J„Źr%”Źr(•Jؔ÷ē•Źņ{ėŌó*• ėÖ¬Įœ7ßµriÕ‰$@€ā{“0_po>@į½÷¼°] €2 T“ÉŲd†ˆˆˆˆˆˆˆDˆˆˆˆˆˆˆØŃa@„ˆˆˆˆˆˆˆDˆˆˆˆˆˆˆØŃa@„ˆˆˆˆˆˆˆDˆˆˆˆˆˆˆØŃa@„ˆˆˆˆˆˆˆDˆˆˆˆˆˆˆØŃa@„ˆˆˆˆˆØ‰ŠŠĀÓO?¾}ū"88³fĶĀ”C‡j|܏>śƆ CZZ‚‚‚PPP`•óĖČȰjśŌ00 BDDDDDŌ€ģŚµ aaa˜>}:¢¢¢šēŸbĀ„ ųų揑Pķć*•JlŻŗß~ū-<==±k×.ČåņZ;Æ?ü111ww÷ZOŸ[kg€ˆˆˆˆˆˆĢ£¼¼K—.ŋ/¾ˆĮƒģģģ0bÄŒ1¢FĒ...Fyy9ÜÜÜ •JįééY«ēvõźUqŽéSĆĆ"DDDDDD ą ‘‘1cĘŻīȑ#˜6m&L˜€)S¦ąĄ€ėׯcąĄŲ±c&Mš„”C‡āūļæ¼õÖ[€Y³fUh2³vķZŒ3S§NÅüąŚµkˆGŸ>}ÄtĖĖĖ„[·nįüłó5j–-[†™3gvļŽ‰'bģŲ±˜2e Nž< X²d Ī;‡E‹į?’łO…&3Õ9"Ö!"""""j nß¾ WWW8;;ÜęīŻ»X°`–/_ŽīŻ»ćĢ™3xńűuėVŲŚŚ"??wīÜĮ† pžüy„††bŹ”)ųč£Šæ’ …›7obٲeųß’ž‡vķŚałņå(,,„Tjü÷w™L†œœ( qŸÅ‹ć‹/¾@§N°~żz¼’žūŲ²e ęϟŻ»w#,, ČČČØńłøŗŗZūr‘•±†Qacc„Rit›ćĒ£iÓ¦čŽ½; K—.hŃ¢Nœ8@ŻWȄ ;v„T*EjjŖĮćÅĘĘ¢mŪ¶h×®`źŌ©•ę$ ŠŠŠ0iŅ$øøø@.—cß¾}čŌ© GøqćF­Ÿ5¬!BDDDDDŌ@4oŽyyyø{÷.<<<ōn“‘‘www­e …wļŽß»øøˆóR©ŌhP"++ …B|ļååer~ķģģÄŚ,J„ß|ó <™L†’’€J„2z sŸ5¬!BDDDDDŌ@“oß>>>Ų°aƒĮm<==‘™™©µ,33³J M...ČĖĖß§¤¤ˆóŗĮ‡œœ­}%‰8æoß>ģŲ±ß~ū-~łå¼’žū&„oīó”ʃ"""""¢B"‘`޼yXµj6oތĀĀB¤§§c÷īŻ ĮłóēѳgOܹs±±±€S§NįĪ;čŃ£GµŅģŌ©āć摜œ Ųŗu«čšöö†R©Ä„K—›6m2Ų·HNN\\\ąźźŠ¢¢"¬]»ĎSķģģ]a?sŸ5l2CDDDDDŌ€ 2r¹?żō>’üsŲŚŚā”‡ĀüłóѱcGĄ'Ÿ|‚O?żEEEĖåųōÓOįīīŽĀĀĀ*§×¦M̜9Ļ=÷¼½½ńŌSOA"‘@"‘ĄĶĶ Ļ>ū,^}õUø¹¹!44z›¬ :;wīĘ1cŠ“iS,X°WÆ^ŋ/¾ˆÕ«WcģŲ±X“h~ūķ7|ņÉ'ā~īīīf=j<$ÕÜG¢±Æ­Ę$`Ą€€#§{óĀ{m„ķķU*ÕkUnśś|0Ō„5öżī‹%xuŽ|(•J(Ė•P*Ė”T*”RޟW*Ėļ­SĻ«T*¬[³sŽ|׏„]÷ ’žŲ³gO…¾=ˆ@"‘D(P|oę īĶē(¼÷^˜¶+P¦1€Jc2›ĢQµbęĢ™ˆlŪ¶ ¾¾¾ †PĒ&3DDDDDDTmr¹ćʍĆo¼ņņrxzzā£>²v¶ˆ*ŀÕČøqć0nÜ8kgƒØJŲd†ˆˆˆˆˆˆˆDˆˆˆˆˆˆˆØŃa@„ˆˆˆˆˆˆˆDˆˆˆˆˆˆˆØŃa@„ˆˆˆˆˆˆˆŽ2CDDDDDŌ€ōģŁ666H$aĮ‚šņņŖöq3220|ųp8p………’ߎGGU%ś’Uež'!LyBTŃ}bPé'żšk+ŹÅ¶•„¶«ū9-}¶/ÆÕ¾WE®×”le"s@"a 2UR*©sŽI••„$ SßĻZgå ūģ³Ļ&’äĒŽūø÷CCC½żŹ@«0BŚ™7ß|S[¶lі-[“råJ†”gžy¦Ķź‰‰ŃŗuėrQõ¼šĀ śį‡¼Ü[šU"ŠŽEFFjΜ9ڱc‡ŖŖŖŚ¤N«ÕŖøø8÷(”ÖŹŹŹņv÷Ą‡ˆ@;ē B¬Öš?ÓÓÓuļ½÷źĪ;ļŌģŁ³µ{÷nIŅ‘#G4~üx-Y²DÓ¦MÓ’ų’C‹/>ƾüü|%''«¬¬L’tųšaĶ;WS¦LQjjŖŽxć †!IZæ~½¦OŸ®ŌŌT͜9S;wī”$„„„)##CĻ>ū¬žzź)IŅÖ­[5kÖ,M›6M3gĪŌ¦M›$IŠ-·Ü¢W^yEsęĢńvw¢` >mē÷›½vu恎nŽE;wīœŽzė-7N~~~***Ņc=¦’ū’ÆRRR“}ūv=öŲcśģ³ĻdµZe·Ūåp8ōĻžS‡ҽ÷Ž«±cĒ6ŗVHee„~ųa=üšĆŗłę›URR¢x@]»vÕ¤I“ōŅK/éoū› ¤eĖ–é¹ēžÓŹ•+µ`Į­_æ^O?ż“FŒ”‚‚=žųćzķµ×4|ųpķŻ»W>ų >żōSŹf³)::Zƽöš·»ķŸ6śĘ)^;s꘷›×*óęĶ“Õj•aŖ¬¬ŌŌ©Sõč£J’¶oß®N:)%%ERĶ"¬111JOOW·nŻdš¦n»ķ6IRß¾}•””¤={öčśėÆošY»wļ–aŗłę›%Iśč£Ü×7nÜčŽ9r¤^~łe†į­ā²cĒ%$$hųšį’¤!C†ØK—.JOO×ÕW_­ŠŠ ͘1CįįįŽī^“"|Zyi‘ Ɛi2 § ×O§įķ¦µŚėÆæ®aƆ©ŖŖJÓ§O׹ĮƒŻAB~~¾²³³•ššZē»ŻīŽŠŠrļGFFŹf³5ś¬³gĻ*::ŗĮk†ačĶ7ßŌ·ß~«ĄĄ@9I’išē•ĶĻĻWLLLsŃŃŃ*(($† MˆšiķyŹL@@€ęĶ›§““4Mš4IįįįŠ‹‹ÓUW]Ug‡Ė±cĒ$I6›ĶŠø¦Ŗ4¦C‡:wīœLÓ­=N™ńd±XōČ#č”‡Ņ“iÓŌ£G„„„é•W^QII‰üżż5gĪEEE©°°P~~~²X,ŗė®»d·Ūõč£*11Qłłł Ö¤W_}Uiiizļ½÷äēē§_żźWš>}ŗŹŹŹ“vķZŻzė­JHHŠć?®¬¬,=ųąƒśšĆ•ššŖgŸ}V}ō‘Žyēżå/ŃĖ/權Š …„„čå—_VLLŒ{Ś Š–Z3ęČā±I5”Šk ”$)XRˆ¤PIaµū®ć`2®ņA¦i>īķĪŠrõ׃hh}ˆ†ĪyėŽ·ž–¦ł.Ø >œ†Ņ·njōŻ®ī7P†į”išśĒ’%zä‰?_®nõŠcĒŽéī»ļÖ÷ßļķ¦ ³X,ÆJŖTY»¹öĖj÷K%•×»ö]å’Ŗ=6I2=¶fc„ŸÖæ2s1  €ö†@€OkļSf4ŒEU’¤«®ŗJŪ·o÷v3€Ė‚@ųąsD€Ļ!>‡@ų>» ķˆŻn×Ā… õĶ7ߨ¬¬L‹E={öŌ}÷ݧ””o7øb0BŚ‘_|Qyyyśąƒ“aĆ­]»VÓ§O׏•+U]]-Izį…ōĆ?4«¾–”~I!ķHzzŗžyęEGGK’üüü4yņdMž<Ł]&++«Łõµ¤,šKĀhGzöģ©%K–čĢ™3 ^OKKSFF†ž}öY=õŌS’¤õė×kśōéJMMÕĢ™3µsēĪĖfffjŌØQN§’““•““#IZ“h‘¦M›¦;īøC·ß~»-Z$Ó4½Ż%@ƒD łÓŸž¤ŅŅRM™2E³fĶŅ_’śWķŁ³Ē}}Į‚ŠŠŠŅÓO?­_|Qåååzé„—ōĢ3ĻhÕŖUš6mšž{ī¹Ė6eß¾}Z±b…>üšC­X±B|š>¬'Nx»K€ˆ@;ҵkW½÷Ž{Z¶l™næżveggkīܹzņÉ'­¢7jŠ A’¤‘#G*;;[†a“č¹²ŪķZ¹r„Nž<©ČČH½üņĖźŃ£‡·»hkˆ@;Ō³gOõģŁSwŻu—Ž9¢{ī¹Gééé9rdr†ačĶ7ßŌ·ß~«ĄĄ@9IjńT—«®ŗJo½õ––-[¦Å‹K’īøćĶ™3GV+’+“sIIIЉ‰Qqqńy×6nÜØÕ«Wė£>Rtt“2335kÖ¬ė±Z­uFŽŲl¶:×ū÷ﯧŸ~Z’täČ-X°@ ŗõÖ[½ŻĄyˆé 8qā„&Ož¬/æüR’¤ŅŅR½żöŪr8JNN–$øĆ›Ķ¦ˆˆEFFŖ¢¢BK—.•$•••W¶cĒŽ2 C‡’$żóŸ’tžX³fžō§?©²²RRĶŌččhUÅ‹@Ś‰īŻ»ė™gžŃ'Ÿ|¢[o½UcĒŽÕ]wŻ„£GźŻwßuŠ755UĻ>ū¬ī»ļ>Mš4IQQQŗõÖ[õŠCé®»īŅĄõąƒžW6**J÷ŻwŸęϟÆ3f(!!AĮĮĮ2 C'NThhئOŸ®©S§źī»ļÖ°aĆ4eŹow Š K+ļ±xÜėļ±J ’,)DRؤ°Ś}×q°GWł Ó4÷vgh¹ś#ŠŲ(oÜūÖßŅ4’Ń2 C†Óa8e†Lćē}ĆpÖ^«Ł7MS’X²D<ńg/÷6šĖg±X^•T!©²vsķ—Õī—J*Æ=vķ»Ź9$U{l’dzlĶĘąsD€Ļ!>‡@ųąsD€Ļ!>‡@ųąsD€Ļ!>‡@ųąsD€Ļ!>‡@ųąsD€Ļń÷vĄWUTTčƒ>p[,…„„ØsēĪŗęškėķ&žā,Z“HĮĮĮš={¶·›‚+#DĄĖ¬V« ¤~żś)<<\YYYZ±b…Nž<éķ¦]6§NŅ¢E‹TVVvQ÷Œ=Z)))Ž~ü0B¼Ģßß_£Frļßæ_[¶lŃ7ß|£{ī¹G~~~Žnā%wüųń6¹gąĄŽ~üBˆĄfŠ A:pą€ŠŠŠ”——§ÄÄDUVVjēĪ:~üøŹŹŹŖ.]ŗ(99Y!!!’$»Ż®ļæ’^¹¹¹r8źŌ©“®æžzÅÄÄØ¬¬L~ų”bbb4cĘ ÷³Ž{ļ=™¦©ū·s—ILLTRR’vģŲ”€€?^eeeŚŗu«$éśėÆWļŽ½%I‡C»wļÖ±cĒTZZŖuėÖM#GŽTPPLÓŌŪoæ­ččh;V›7oVqq±¢££uĆ 7(>>^«V­Rnn®$éĆ?Trr²†®œœ„§§+??_‹Eńńń5j”¢££½§ž”™ õ[sڇö‰)3pŠ‹‹“$Łl6†”U«Viß¾}JLLŌŲ±cÕ½{w\YYYZ·n¤šuQ¬V«ŹĖ˵mŪ6õģŁS‰‰‰:wīœ6nÜ(IJIIQDD„$iĀ„ źŻ»·*++µnŻ:hüųń1b„²³³µaƆF﩯9żÖœö”}b„\LӔTRœ:uJŠ×Ų±c%I½{÷V~~¾rssuśōi†”ĀĀBuķŚUÉÉɒjĀ”ƒ*;;[;w¾ą3-‹¤šQ'N”ÕjÕŃ£GUTT¤›nŗIQQQŹĪĪVQQ‘ģv»JJJtīÜ9ÅÅÅ)>>^†a(""BŻ»w×O?ż¤Ó§O+!!A‹E•••?~¼¢££e†žž÷æĖf³¹G²J’ŗt颊ŠPIŅoū[™¦)‹Å"Ć0“k×.Č0ŒFļńԜ~KLL¼`ū\ĻAūB WÓ4uīÜ9IRTT”ņóó%IŃŃŃuŹEEE)77W6›Ķ}.<<ܽŻu×éŗė®“¤-V*’š?U^^®ØØ(IRHHˆŠŠŠät:ŻujķŚµuźš÷÷—ĶfSBB‚ūŲÕ~«ÕŖŠŠPUVVŖŗŗŗĮĄĮ0 mŪ¶MGUYY™; rõOs”––^°ß[Õ>üņˆĄf’žż²ŁlŠŒŒT||¼{ŹKQQQr………’¤°°0÷¹’’÷žīŻ»µsēN„¤¤ØOŸ>’j‚Ć0dµZUXXØźźźV/Śźzn||¼¦NŚ¦}‘‘”żū÷«WÆ^5j”üüü“xńbUUU5»W8Ԝ~ƒļ!/«®®Ö–-[d𦠔››+7NRĶ”ŲŲX9sFß~ū­:wœååå)66V]ŗt‘išŠŠŠŅ©S§“cĒ…‡‡kļŽ½²Z­źŁ³§”’’}ńÅźŲ±£Ž?®   … ž§Ó§Oė»ļ¾S×®]Ż‹¬†”Ūoæ]ĮĮĮĶŖĖ5"eļŽ½JJJr·Én·ėŲ±c:zōØ»­YYYźŻ»÷y÷Ō_µ9żßE ^f†öļß/I VĻž=5|ųp÷ĀŖV«U©©©śį‡tāÄ eff*,,LƒÖšįĆeµÖ|/ć–[nŃ÷߯C‡Éįp(>>^×]w{$ÄĉõŻwß);;[%%%ŗį†“iÓ¦f/ŗZŸÅbє)SÜ_™9t萔 äääf‡!RĶēr‹ŠŠ”™™©ŠŠP 8P§OŸÖéÓ§URR¢aƆiȐ!Ś“i“ŅÓÓÕ³gĻóī©ˆ4·ßą›,­¼ĒāqÆæĒ()HR°¤I”’Āj÷]ĒĮe\åƒLÓ|ÜŪ åźÆēŠŠś­łą{ßś[šę?ŗ ęĖ,NC†į¬łbŠńó¾a8kÆÕ웦©,Y¢Gžų³—{ųå³X,ÆJŖTY»¹öĖj÷K%•×»ö]å’Ŗ=6I2=¶f#>‡@ųąsD€Ļ!>‡@ųhGn¼ńFMŸ>½Įk³fĶŅ7Žč•våēē+99YeeeŽģĄ@ڻݮĢĢĢ:ēNœ8”¢¢"o7 øbˆ@;“’’¢µk×Ö9·~żz1ĀŪM®"ŠĪŒ7N_|ń…LÓtŸ[æ~½ĘŽ[§Üśõė5}śt„¦¦ję̙ڹs§¤šŃ$&LŠźÕ«5cĘ Mš4I‹-’$effjŌØQī:œN§’““•““ÓdĄ•†@Ś™¤¤$…††jß¾}’¤#GŽČb±())É]¦¼¼\/½ō’žyę­ZµJÓ¦MÓsĻ='Iņ÷÷—ŻnW^^ž>žųc½öŚkzēwd³Łš|nSuWh‡nŗé&­[·NRĶØÉ“'×¹¢7jŠ A’¤‘#G*;;[†aH’ ĆŠ“iÓ$I Õjՙ3gš|ꅼ®$žŽn ķŻtÓMš3gŽ{ģ1}ńÅzå•WTUUå¾n†Ž|óM}ūķ· ”Ćᐤ:Ól"""ÜūV«õ‚ĮFsź®"ŠuéŅE Z±b…BBBŌ½{weee¹ÆoÜøQ«WÆÖG}¤ččheffjÖ¬Y¬·~0ā9¦µuŽĄ”h§nŗé&½óĪ;ēM—‘j‚ŒˆˆEFFŖ¢¢BK—.•$•••5YgĒŽe†:$Iśē?’)«ÕzQuŽ@ ķŌ¤I“”ŸŸÆ_żźW ^‹ŠŠŅ­·ŽŖ‡zHwŻu—Ø|°É:£¢¢tß}÷ižüłš1c†,Ć0Z]'ą –VŽcńø×ßc ”$)XRˆ¤PIaµū®ć`2®ņA¦i>īķĪŠrõׇhh½ˆĘ֐šĘ½oż-Mó] Ć0d8 †S†aČ4~Ž7 gķµš}Ó4õ%KōČöroæ|‹åUI’*k7×~Yķ~©¤ņŚc×¾«œCRµĒ&I¦ĒÖlŒ>‡@ųąsD€Ļ!>‡@ųąsD€Ļ!>‡@ųąsD€Ļ!>‡@ųąsD€Ļ!>‡@ųo7|UEE…>ųą÷±ÅbQHHˆ:wī¬k®¹F±±±īk‹-Rpp°fĻžķķf·‰öö>ųå!/³Z­0`€œN§ņó󕕕„cĒŽiņäÉźÖ­›$iōčŃņóóóvS[åŌ©SZ½zµžē’üŸ żÅæŚš25Ź}¼’~mٲEß|óī¹ēłłłiąĄŽnf«?~ü¼sæä÷Aū@ W˜Aƒ饁***R^^žĻ›b’““£ōōtåēēĖb±(>>^£FRtt“$©  @ß}÷ņóó¬‘#G*==]%%%śŻļ~'Ó4õöŪo+::ZcĒŽÕęĶ›U\\¬ččhŻpĆ Š—$UVVjēĪ:~üøŹŹŹŖ.]ŗ(99Y!!!’¤“'Oź‡~Paa”LÓTll¬’““ÕµkW­ZµJ¹¹¹’¤?üPÉÉÉ>|ųyļc·Ūõż÷ß+77W‡C:uŅõ×_Ƙ˜˜ >h U€+P\\œ$Éf³w­²²RėÖ­SAAĘÆ#F(;;[6l$9N­]»V§OŸVß¾}5bÄČ4ĶǽŻZ®žšõ;ē­{ßś[šę?ŗ@†aČp2 § Ɛiü¼oĪŚk5ū¦iźK–č‘'žģåŽn=‡Ć”÷ß_‘‘‘š9s¦·›f±X^•T!©²vsķ—Õī—J*Æ=vķ»Ź9$U{l’dzlĶĘh‡VÆ^­‚‚ :T‘‘‘ŹĢĢ”$ÖŪjˆ@;tķµ×jūöķŚ¹s§œN§"""”œœ¬aƆy»iĄ@Ś”:č–[nńv3€+k>‡@ųąsD xą“pįĀƽłę›ząZT_~~¾’““UVV&IzńÅ5yņd†Ń¢z’““uąĄĖŅžm®ßžÖ¾7Ś'h'¦NŖ5kÖČ4Ķ:ēMÓŌēŸ®Ūn»­EõÅÄÄhŻŗu ‘aśōÓOµpįBY­—’OÉ^xA?üšĆe©ßó½Ń~ˆ@;qć7ŖØØH»wļ®s~×®]*..Öĉ[TŸÕjU\\œ,‹*++åt:å•wĖŹŹŗlõ{¾7Ś/h'‚ƒƒ5iŅ$­^½ŗĪłÕ«WkņäÉ –$„§§ėŽ{ļ՝wީٳg»”č–[nŃ+Ƽ¢9sęŌ™:ņĒ?žQ’t’ż÷ėwæū>ųąƒ:ĻX¶l™ī»ļ¾&ŪwāÄ M˜0A«WÆÖŒ34iŅ$-Z“Č}}Ń¢Eš6mšīøćŻ~ūķZ“h‘LÓTZZš222ōģ³Ļź©§ž’$­_æ^Ó§OWjjŖfΜ©;w^°»§~żõ§ĢlŻŗU³fĶŅ“iÓ4sęLmŚ“©Yļƒ+“#S§NՆ äp8$I‡C_~ł„¦N*I***Ņc=¦łóēė“O>Ńæ’ūæė±ĒSyy¹e³Ł­×^{­N½/¾ų¢¤šŠbęĢ™Z¾|yµDžõÆiƌM¶Ķßß_v»]yyyśųćõŚkÆéwŽ‘ĶfÓ¾}ū“bÅ }ųį‡Z±b…>ųą>|X'NœŠ‚ „§Ÿ~Z/¾ų¢ŹĖĖõŅK/é™gžŃŖU«4mŚ4=÷ÜsM>»©{ź×ļ©  @?žø,X žóŸzź©§ōĒ?žQēĪkņ}på#€vd芔ŠÕ7ß|#IśśėÆÕ±cG hg¦L™¢E‹éŌ©Sڱc‡ž÷’žßīkqqqŗźŖ«ōŃGw_VVV³6mšŽ{ļ=śHŃŃŃŹĢĢŌ¬Y³š¬»5÷øś«°°°Ī¹ĀĀBučŠį¢ßŽÅ”hg:vģØäädżŸ’ótķµ×*66Ö}ķŚkÆUNNŽ{AŃS§Niƌ*..nŃ3¢¢¢4iŅ$żéORæ~ż”˜˜xQm^³fžō§?©²²R’ŌµkWEGG»GpøŪh³Ł”ČČHUTThéŅ„’ä^µ!ŗĒ³~O)))ŹĖĖs/<»k×.åååiäȑ—ę— “CS§NÕ¶mŪ܋©ŗDEE)--MƼņŠnæżvżž÷æ×oūŪV}NwęĢ™ŹČČŠōéÓ/ŗ½'NThhئOŸ®©S§źī»ļÖ°aĆ4eŹIRjjŖž}öYŻwß}š4i’¢¢¢t뭷ꔇŅ]wŻ„źĮl“ž ŻćY様˜żå/ŃĖ/æ¬iÓ¦)--M/æüņyÓhšĖӚ*[<6©fŚk ”$)XRˆ¤PIaµū®ć`2®ņA¦i>īķĪŠrõ×`hhM†ĘÖišĘ½oż-Mó] Ć0d8 †S†aČ4~Ž7 gķµš}Ó4õ%KōČöro_Y222ōä“OźÓO?=o 1‹åUI’*k7×~Yķ~©¤ņŚc×¾«œCRµĒ&I¦ĒÖlüĘZĢn·ė’żæ’§{ļ½—0æHüÖZä½÷ŽSjjŖśöķ«3fx»9@«š•@‹Ģ™3GsęĢńv3€‹ĀąsD€Ļ!>‡@ųąsD€Ļ!>‡@ųąsü½Żų„8s挷› 0BųąsD€Ļ!>‡@ų¾2^āp8“f͚óĪ«C‡0`€BCC½ŻĢ‹~/‹Å¢   učŠA}śōQddä%}žæžõ/Y,„¦¦z»+pc„x™ÕjUÆ^½Ō«W/%%%)88XŁŁŁŚŗu«LÓōvóĪsöģY­\¹RĶzÆ=z($$DŁŁŁśśėƕ——×ęĻZŠ"ąe~~~­ŒŒ •••)22RC† QLLŒ$]°Ž¼¼<:tH6›M¦i***JżśõS|||³’=.T¼‹)3ąeN§SūöķÓ¾}ū“wļ^}óĶ7ŖØØP||¼ĀĆĆeš¦6oެÇ«{÷ī5j”śõė§ģģlmŪ¶M’d†6oެģģlõčŃCTAA6oެŖŖŖfÕa±XdµZUQQ”żū÷«sēĪźŲ±£Š‹‹•žž.IuÖ51b„ŗvķŚ¢wŠŠ’$ŁķvUUUiŪ¶m²Łl>|øśõė§3gĪhĒŽ>ėB÷ø†”Ƈ«wļŽŗźŖ«TXXØļæ’^N§ó‚uTUU¹Ė>\#FŒaڵkW³ūņBuĄū!^f†²²²źœėÕ«—  IŹĻĻWQQ‘¢¢¢+Ó4Ŗ„„÷ÓO?éĒŌ€}Į:.µ#GŽČn·+,,L111ŹŹŹRVV–ŗvķŖĮƒĖjµjŻŗuŖ®®n“Ž£G6ėžźźjUTTøG•”––J’BBBšUG·nŻŌ­[7UVVŖØØH‡ÖŃ£GÕ”C‡fż{\؎.]ŗxåß?#€+ˆŸŸŸś÷ļÆ]»viß¾}š0a‚bcc„üü|ķŁ³GńńńīE=MÓŌøqćŌ”C…‡‡ėģŁ³:xš BBBōÓO?Éb±ØK—. ŗ`Ķn£$>|X]ŗtq/TZŸkm×Ȑüü|łłłiųšį’ä ŹĖĖ•››«œœØŗŗZ§NR·nŻĪ{Vsī‘jFcüšĆźŽ½»ŠŠŠTTT¤ŠŠPÅĘĘ*??æÉ:BBB”žž®:øėó÷Æłó988øY’6›M;vģh“x\aŗwﮬ¬,Łl6=zTIII=z“ū«&Ē—æææāāāŌæw1jŌ(eddčųńćŖŖŖRLLŒ äž¼9u4GRR’JKKuāÄ 7ˆx®ØÄÄDõķŪ×½°jĻž=•ŸŸÆüü|ŁķvõéÓG½{÷Ö®]»ōć?*11ń¼g5ēĆ0¬«®ŗJPEE…āāā4tčPY­Ö Ö1qāD]}õÕ:~üø{”Õššp >Ü=­čB}Ł”C‡ Öļjͤ%‹Ē&Մ*®-PR¤`I!’B%…Õī»Žƒ=ŹøŹ™¦łø·;@ĖÕ_ė””µ[Ā÷¾õ·4Ķt Ɛį4dN†!Óųyß0œµ×jöMÓŌ?–,Ѭß>ąåŽ~ł:uźōŖ¤ I•µ›kæ¬væTRyķ±kßUĪ!©Śc“$Óck6>» |š9¬!Ķ“råJo7@!€fjlńPæ‡@ų@ĮĮĮš1c†üżYeķ ŽŹŹJ­ZµJÕÕÕŽn pɈź0MSŽnpI1ž ډ˜˜=Z'OžT\\œ6nÜØųųx 2DžžžŖ®®ÖīŻ»uīÜ9IRTT”† ¦ššpIŅńćĒ•‘‘”   „¦¦jŊ Õĉ•‘‘”^½zÉßß_™™™ŹĢĢ”¤&ė0`€zōčįnßńćĒuąĄow ‰@Ś Ć0ØŹŹJ}ūķ· ŅØQ£“eĖ9sFńńń=z“VÆ^-Ó45fĢķŻ»W'NœP@@€ĘÆŅŅR>}Ś]§iš ŸŸŸÖ®]«ččhżźWæRNNŽŖŖŖ­?**JIIIZ»v­Ŗ««Ø#F(""B%%%Žī*€@Ś???eee©ŖŖJŻŗuSyy¹Īœ9#I:sęŒ*++Õ±cG†!‹Å¢'NH’ŖŖŖōÅ_HŖYTµ¾£GJ’ŠŠŠd³ŁŌ”C9ĪFė/--U@@€’’’”““£ŅŅRmŻŗÕŪŻøˆ@;b†ŖŖŖ$Õaaaš2eJ2²Z­Ŗ¬¬lv½že‡ešf£õ—””č믿VļŽ½uõÕWKŖ U<(Ó4½ŻM“W*))qüšŌ©S§G‚4&00P‡Ć½_YY)Ć0­_’ µcĒIRdd¤F„²²2;vĢŪ]š•hÆņņņ¦Ž;J’ĀĀĀtÓM7)00PēĪ“aźŻ»·¤šQ'Nt×׳gOI5 ±FFFźÜ¹sMÖߣG]{ķµņóó“$Łķvw \ !ķ”ĆįŠ–-[4tčPČ4Mļ|EE…>žųc÷±Åb©ó©ŻęŌļt:õĆ?x»K€F1eųąsD*))ŃņåĖ½Ż  ĶˆŸĆ¢ŖŠLćʍóv“FˆŸC |Sf ™āćć½Żm„"ĄēˆŸC |š9"ĄēˆŸC |Žæ·æ{öģńv“h¦N:y» ŚSf€Ļ!>‡@ųąsD€Ļ!>‡@pI<÷Üs:{ö¬$Én·kīܹ*))‘$;wNO?żt£÷Śl6½ōŅKŽ~…V9zōØęĶ›§4Zęƒ>ŠĮƒ›U_ii©-ZŌģēŸ={V?ü°ŅŅŅ”––¦^xA+V¬h³÷s:śĆžpé:š2!\ Š?ž(IśńĒÕ„K:tH’tčŠ! 8ŠŪMlRUU•.\Ųāū6nÜØY³fé믿n“v„‡‡ėžūļoŃ=‰‰‰Z°`,X §žzJ'NœPFFF›¼·ŸŸŸŚäݼÉßŪ “O ŠęĶ›5fĢ:tH“'OÖĮƒ•œœ¬C‡)%%E¦ijéŅ„*..–$EEEéž{ī9Æ®Ļ>ūLGŽQ`` œN§&Ož¬^½zińāÅ*--•ÅbQPPfĻž­Ć‡ė‹/¾PTT”rss•””$Ó4UXXØāāb=ņČ#ņ÷÷æąsW¬X”#GŽč“O>ŃwÜŃą³üüüźÜc³Ł”ŸŸÆŃ£GkėÖ­*,,TLLŒ‡Ž~ūmłłł)$$Dłłł’j‚” µµ¼¼\o¼ń†ž|ņI:tH6lPDD„ŹŹŹTVV¦łóē7PX,uļŽ]łłł²Ūķz’ż÷ ŹŹJuģŲQ3gĪŌęĶ›µwļ^Y­VÅÄÄøßūȑ#śõÆ­ÄÄD={Vļ¾ū®ž|ņI{ū×ė¢1BpI\}õÕ:zōØ$éĉ9r¤rrr$I‡VŸ>}“cĒłłłiīܹš;w®$i×®]uź9pą€rrrōšĆkīܹš7ož®¾śjmß¾]V«U>ų ęĪ«mß¾]‹E%%%ŗ÷Ž{õŲcé믿֯~õ+Ż’żŠŽŽÖ±cǚõÜnøAŻŗuӝwŽŁč³źŪ“i“ʍ'Iš8q¢¾łęIŅöķŪÕ©S'Ķ;WæłĶod·Ū%©Ymõd±XTPP {ļ½WsēĪUxxø²²²šüw8wīœöķŪ§>}ś(,,LóęĶÓż÷߯łóē+++K²X,²X,ząź¼÷„ “iÓ&IŅ–-[4vģXIRPP·½.#D—D@@€:vģØüQ²Z­ŠŽŽÖ”C‡§ĄĄ@åęę*33³É)§NR÷īŻĻ;Ÿ——§nŻŗ¹uęĢÅÅÅ)!!ARĶōŽˆˆÅÄÄH’BBBäp8šõÜę<Ė“ÓéŌŽ;„Ķ›7K’ •ššŖüü|uźŌ©Īż.jk}‰‰‰²X,’¤ˆˆˆĖäääčÆż«,‹"""4sęL%$$ذ°PK–,QXX˜,‹Š‹‹Ż÷{¶Ļåšk®ŃŖU«TYY©}ūöé‰'ž¤v1B„@pÉ 8PėׯwÆҧOŸ:lj‰‰²Ūķš5kVūl6›{æK—.śź«ÆĪ«;!!”Īčˆģģl%%%5«]=·>Ć0šż¬;wjȐ!ŗóĪ;ŻēV¬X”ōōtÅÄÄ(//O’d𦲳³/iæ'&&źŃG=ļüę͛շo_Żxć²ŪķŹČȐiš’$«õēI$®÷öóóSrr²–-[¦«Æ¾Ś=5ē±Ē»¤ķæ˜2ød  ŒŒ õéÓG’Ō·o_ķßæ_ $%''Ėb±č7ŽŠŪoæ­·ß~»NāŖ£GzõÕWõśėÆėõ×_WFF†FŽ)Ć0“pįB-\øPN§S)))ĶjWsž«sēĪéż÷ßoÖ³6nܨ믿¾Ī¹ėÆæ^_}õ•®½öZåääčõ×_×{ļ½§ØØ(wq9 ŠČ‘#Õæ’KśģŖÜ¼³Pž:¹Ļ÷ äŁžµRŃ3Ż¢śG³T¶c»¢ļŗ§Īy£ĢŽŖś®D"€6—˜˜ØĒ’å}L4<<¼ĶĀĖżģ€.];ēüū›^TU©čㄊžuÆ$Éb9’Ɠ֊°v†H"€Ėč„—^Ҝ9sÆÓ§Oėæ’ūæõųćkéŅ„*..–$EEEéž{īŃęĶ›µwļ^Y­VŁl6żś×æVbb¢Īž=«wß}W?žø/^¬ŅŅRY,iöģŁ:|ų°6lŲ ˆˆ•••©¬¬LóēĻ—ææƒĻńd³ŁōĘočÉ'ŸTFF†V­Z%‹Å¢Ūn»­Ī軯®÷ß_Ŗ¬¬TĒŽ5sęL9½żöŪņóóSHHˆņóó%I‡Ņ_|”ØØ(åęę*))I¦iŖ°°PÅÅÅzä‘GT^^ī~ö”C‡|‡€€€õ·QZ¢ĀßWÜÜł*ŪśŒ²2…ß8Y%kWĖ/&V”×^’ó»ń¹ŖNWÉŚÕ źŪOĪR›l+?‘QR"ĆQ©ŲŁsdTVøė«üéJ7~!É¢ˆI7)0©··½Z„@Šęrrr”––VēÜžš=ZŪ¶mÓŌ©SµuėV3F;v쐟ŸŸęĪ+IZ²d‰vķŚ%‹Å"‹Å¢x@éé錓i“fΜ©-[¶hģرھ}»¬V«|šAIŅŅ„Kµ}ūvÅÅÅ©  @=ō,‹-Z¤¬¬,Łl¶ŸsĶ5×4ųŗžśė5lŲ0wˆā¦yóę¹_xį襁źŌ©“¦OŸ.Izžłē%Ռ¶())Ńæ’ūæĖétź÷æ’½žžyÅÄÄčķ·ßÖ±cĒŌÉcŗ‹ÅbišššrTu*[ł‹^w‡Ž¼NAW÷łłųśTōŃßU¶m‹œE…ŠøyJūCG\+ē¹|Eܧ!“'OÖņå˵uėVŻu×]u®jɒ% “ÅbQqq±‡ņóó뉉‰īż„„I’ŸŸŸ"""#I ‘Ćįh°ėæCSš2c”–Ō9›p£ņ’óuxx.ÄæS‚Tū|kHˆLGUė”7ŒUÉŚÕ*ß¹C‘SnkVŸ^ID—MPPŗuė¦uėÖ©OŸ> Tbb¢ģv»f͚U§ģ–-[dµÖ|ÕĻĻOÉÉÉZ¶l™®¾śj(!!AYYYīņŁŁŁJJJjōŁ=§1'NœŠÆżk9rD6lس¾Ēę͛շo_Żxć²ŪķŹČȐišŠ‰‰Q^^ž$É4Megg{»Ėf*Y»Z1æž_²­ł—b’×}īĄC’d‘d:›]]uNŽ¢n›&lj²ožö·¶ Ķåääčå—_®snäȑš0a‚nøį½ņŹ+zņÉ'%IÉÉÉ:|ų°Žxć ÷wß}÷yuŽ7NO<ń„ž~śiw}?żō“{ÄGXX˜RRRtųšįŪŌŲs"##,_QQ”’ų’ÕjՍ7ŽXēŚąĮƒµxńb=zT”””1b„–/_®ūļæ_o½õ–^żu+**J¦i¶Y憔?üįzķµ×Z|oé†u 8XAŖŗ°@„Ö)|ŅĶīė~QŃŖĪ/Pń'Ė2|Äė3++TšßļÉbµ*lŌ möŽ—‹„•÷X<īõ÷Ų%I –")TRXķ¾ė8Ų£Œ«|išæ¼å‡œ÷Ē^Cü5ö”7ī}ėoiš’č†!ĆiČ0œ2 C¦ńó¾a8kÆÕ웦©,Y¢™æł—{Ū·åęęjłņåš?¾·›‚‹Š¹sēW%UHŖ¬Ż\ūeµū„’Źk]ū®rIÕ›$™[³1BpÅ[æ~½öģŁ£ßüę7Žn Ś Ąoņäɚ\6EēN7»lyY©·›ŪföīŻ«ŒŒ ŻsĻ=’¤wß}WcƌŃīŻ»uäČ}ņÉ'ŗćŽ;“xńb•––Źb±(((H³gĻÖįƇµaĆEDDج¬Leeeš?¾Üõ†Ńź{%Éf³)??_£GÖÖ­[UXXؘ˜8p@_~ł„ĀĆĆUVV&Ć0t’ż÷«ŗŗZļæ’¾TYY©Ž;jęĢ™’¤Ļ>ūLGŽQ`` œN§&Ož,I*..Öß’žwŁl6UTTčį‡–æææ–.]ŖāābIRTT”»\öķŪ§Ŗ[·n’$«ÕŖūÉ÷ĪČČh°æūōéÓ¢öÕ×­[7 :T{öģQŸ>}źō’‰'”Šąæ’ōéӕ‘‘ŃäļH~~¾¶mŪ¦éÓ§ėĖ/æ<ļś?žØk®¹Ę};v¬BCC,{Ć 7(//OwŽy§¶mŪ&«ÕŖ|P’“téRmß¾]qqq*((ŠC=$‹Å¢E‹)++Kżśõs׳}ūöVß+I›6mŅøqć$I'NŌ7ß|£Ūoæ]‹Eš7ož¬V«–-[¦ķŪ·k̘1š7ožūž^xA:}ś“rrrĪ 233UZZŖß’ž÷²Z­z÷Żw•••%›Ķ&???÷™%K–h×®]užš/,,T\\\ƒż×Ų{‡……5XžĄ-j_HHČyuøśT’rrrō׿žU’TZZŖŃ£G·ś÷ęĆ?Ō¬Y³ät:¼n·ŪÕ©S'÷qhhØNŸn~ĄØ†ęnmęb‘ 5¦¹aSf 54efļŽ½¼///Ļ= BŖ™ŽqęĢÅÅÅ)11Ń=•"""B‡£Ķīu:Ś±c‡¢¢¢“yófI5!DjjŖ$©{÷īīµ::w‚jɒ% “ÅbQqq±‡N:å^S£¾ÄÄDw=”””r8ŹĶĶUff¦.\ŲhæDFFźšįĆ-ź³ĘFM““} "gĻžu?311±Īæõ;CݻwkŲ°aü÷öōå—_jąĄJLLŌɓ',ć„ćb·ŪђĒ46*¤9įGSŸēm‘Ö"¦$KēźæXCs\לĒFķ1ą ”Żn—$™¦©S§N¹ÆFĶąż„„eee¹Ļggg+))©Yõ_̽;wīԐ!CtēwŗĻ­X±Béé銌Œ¬ÓÖÓ§O«sēĪŚ¼y³śöķ«o¼Qv»]2MS]ŗtŃW_}Õģ~ILL”Żn׬Y³-3tčP­\¹²ĪzĖ—/W=}ļĘś»„ķ«/;;[{÷īUjjjpĀSUUU‹ė---Uvv¶:¤ņņr={V_}õ•&L˜ą.3`Ą­\¹Rcƌ‘$ķŚµKÓ¦MkÉcœŖ›xf­#bŌ;__‹Ć‘¶^C¤±D:?rztSfxÅ÷Ūw4zķŚ”‘Žn^›KJJŅgŸ}¦… *,,Lńńń2MS±±±:wīœŽ’}Ķž=[?żō“{“DXX˜RRRįiäȑ­¾wćʍŗ÷Ž{뜻žśėõžūļė¶ŪnShhØ>ųą•••Éétź¶ŪnSnn®/^¬£G*44T#FŒŠņåĖ5ž|9rDƾśŖ{’ńćǟ·f‰Krr²>¬7ŽxĆ]ęī»ļVdd¤»LXX˜ęĶ›§?žŲ=ŗeąĄ1b„$5ųŽÕÕÕ ö÷€ZŌ>éēÆļ†!«ÕŖ¹sē*,,LeeeŹÉÉQZZĶדŖ««Õ£Gw»\œN§^yåŁķv•––*--MwŽy§zōč”?üįzķµ×tŪm·¹ĖŸ<Ć«Głś_”ńģ(«~žĀLCė…47 !4 õZ<4“–HC‹«z#®ó†ŅŠZ¤m¢­U­ß8Ļ#®pĆuγ|ż/ÓųéēÅT/“f”—Gs¦¬46JÄ3i*ičĖ“m„ø\L RDˆE qq½µö§_åŁI iĶ(pé4ˆø¦¾44ZÄ©óQm( ©’œ61r)¦Ģøć¹ļÉóåć¹žhżP¤ždL5†“äłĶÖÖkˆ4‚4Ä~Ō’LÆ„Mjzda—ß…Ö©lԟ1r”¤±Ÿm¢­Ā„¦B K? ? Ck3”—ŁŒó Ķ ҜµB.:iĖ įBĮ…„?/fD”—^K¦±4ŠØ?/TēEiė”9£7,ŲæŠĀ©\™š /ZśÅ˜ę|ā·Õ.EøŠ’ĶUr9ŪšēBEkF{4g:ĪE»TĀÅ„ üņ4'°hMŲѦAˆĖ„ZRkŚB8€÷“&¬hī=—$q¹œĀ„ś¢ š¾¶0.iāɛįĮ¾ķ² õ]é”ĕŽ>Š8ÆĄeņ’“Ŗ…3"-^3%tEXtdate:create2013-09-04T19:29:44+04:00÷ēž%tEXtdate:modify2013-09-04T19:29:44+04:00yŖ_BIEND®B`‚apache-couchdb-1.6.0/share/doc/build/html/_images/futon-editdoc.png0000644000175000001440000014677512332105522025132 0ustar00djcusers00000000000000‰PNG  IHDRD8cµ<£gAMA± üa cHRMz&€„ś€ču0ź`:˜pœŗQ<bKGDłC» pHYsÄÄ•+€IDATxŚģŻyxÕŽšo’6Mŗ¦t²”² Ś‚€@Ł‘E ""^„ąŹµ*"zUŠW½źE(¾z©+ˆEŹ®ŠBŁwڲŗŠ½é:y’3¦i’¦mŅtł~žgžNf9ēĢ™$0æœ """"""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""² ™£ ŠČĖGDDDDDDDęé]sp`°ƒˆˆˆˆˆˆØysXĄ¤>ƒ¶Č‹A""""""¢†«®Žz Ų;ĄP“ōkSHˆˆˆˆˆˆˆ§6 kϱkpÄ^…źŅ•Łé\"""""""rœź‚ŗZœg—Ąˆ=‚ ²l—Õšu}”Ÿˆˆˆˆˆˆˆ¬WÓ`†®ū­Ķ§ĘlPØiŠCfa›µé9śš‰ˆˆˆˆˆˆš {Œ¢3±ĻŅ6kŅŖ3[¬mķaéom$öø"""""""2­&-BtžšŪgi½ŗü­f« BMZ@ ˜ym©¼ „Õæźŗ¶˜ ‚/@Ķ$–ņ¶š“ * ¶-A ¹™ķęҰ”?ÕK ć ‡€ŹĮčKyȌŽ“YqžE¶ˆŖIÄ0"7Z7,·F!""""""¢śaĶx!ĘĮĮ`]†ŖAĆódfžŚD]"µķcQ¬G`š×ŚńD¬ŁODDDDDDDÕ³fĢs¦C*šwPDŒī7—‡© H$¶n!"2 11\Œƒ#5O„ˆˆˆˆˆˆˆźŸ©®2āb‘ß~]ŹĻõā>ĆĄˆĪą›N¹ Ō- bĶō¹†‹•ƒ!†'ƒæę‚"@õŻgˆˆˆˆˆˆˆČ~ŖHU\7l".b ¤ śēł £4Ä@ˆ•ƒ""›¶±G Kƒ„C ƒ NFÆ­m%b© DDDDDDDdÖĢu•!ā3>`ž¹]°°ß¦­Dl1n¹aĢ0İeˆø8£ś P³ĄŁ©YfLµ)æ½?箋A“ £“ a5•g­Ō6 b®ŪŠ©ą…q0D vDœńw@ÄÉčĆ’©ĮUM½&"""""""ū17Ż®©€ˆč0~Ę7Œˆē FiŠcČQyš:w›±w ń‚Å1D ƈ3ŖEŒY5¬,¶!""""""r<ćYfƒæĘ‘2£ó €¾‰įs¾xžl8õ®­"r£ućét [{w“1µD §ą5¬Õ$DDDDDDDöW“ivÅĄ†øˆŒ{Č Š§+Ī@#¦k8čj­Łŗ…ˆ©qC Ē15nˆ¹Å0ˆ"‡éAZME ĖCDDDDDDDugivćÅøuˆŠ0ģ.cØ–ŸńuFūD SSāCLBŒƒ!JüŻ2ÄT@Ä00T ¼–‡ˆˆˆˆˆˆˆlKgf›q DģŽbŲBDģ cjĢQq[9Ŗö1ĪĆ0 RēVm=ķ®aĀÜX!āŗŅ௳ĮkćŁfŒ»ß\8¦Qż1 @ŽbÜ2Äpŗ]'č čĒ1~¦7|Ž7ī2c¼ŲLm"23ŪÄ톭:Œ[ƒ(QżŲ!†sAsŻhˆˆˆˆˆˆˆČ~ĢĶ&c1?Äpŗ]ㆠü,1žuĘTĖsŻfjܕĘÖcˆ˜k!¢4ś[%²Ö†e!"""""²™K—.nŻŗåč¢5z2™l:ž7ÄxlqŻ0b8‰ĶZ‰Ų" bĮ1ŒōT7^ˆńBDDDDDDDMŸ Ŗ¶1ģõaŲŚ¤ĀÄ1bÜ”ĀŹüL²U@Dü+öż1×mFi°w‘!""""""¢¦ĻUgS5ŒUŒ+Gź<å.`’iw Ē1×2„""""""¢ęCģ%bŠa8 ‡įbČ&ŻfäuMU§»•l71µĪ€Qóą„æc†½JLC 'q1$³*' l1•žńĄ(ĘŻiÄ /œ""""""¢ęĮ°‰ÜhŻŌģ3ę‚"uR×Äd¶Žk|A†­D°}`†ˆˆˆˆˆˆˆ&ĆńAÄø€q/Ąō”¼†źŌJÄֳ̘śk1žkxń6”P(0`ĄōéÓ~~~HHHĄĮƒ”ÓÕy ŚZ{öŁgqżśuüüóĻ+CMxxx ??ßŃÅØ“ĘVēę8ś^<łä“˜:u*F-msuuÅ?’łOL›6 ’ūß’[éœ>}śąķ·ß†——† AŠ©S'Ģ›7½zõ‚V«E||<>üšC”J%"##1nÜ8ųłł!==æżöbccQZZZ£2WW¾źtźŌ ?žų£Łż3fĢĄ¹sēšį‡b芔UöļŲ±óēĻ«ŽqrrĀ£>Š & e˖ҵÆ\¹eee5ŗ7¶ŖŸiÓ¦aśō額7°jÕ*¬Y³ĘęuhČŁŁß’=ڶm‹JŪ·mŪ†µk×āóĻ?·*oSéX[SļŻźØT*Ģž=cĒŽ…ÆÆ/222°mŪ6|łå—())±:o…BĒ'N„®^½Š/æü[·n­ó½±ō^1WļÖŖė{…ˆš®ŅŅRéßłŗÉdpww‡LVēņDŌ07’*7¬0l`aÜ:Äf_u ˆČĢl3ŒŽƋfż±I@D”P`Ö¬Yhß¾=öķŪ‡ß~ū 2™ ]ŗtĮĉqĒwąŪoæµź?·ö°eĖhµZ‡ä]jµjµéééŽ.J­5¶:7§”Ż‹nŻŗańāÅHNN6ؘ6mŠŠŠ0gĪ‚___,_¾»wļĘŅ„Kįėė‹×_J„ .Ģ›7ƒĘo¼‹/¢K—.xēwąķķ÷ßߦå«Ī•+Wšč£VŁ>bÄLœ8×®] Vķܹ+W®¬t\nn®“nĶ1/¾ų"&L˜€˜˜œ:u wŽy'^zé%(•J|üńĒõ~’&OžŒ^xK–,ĮįƇŒyó攸øæüņ‹MėŠŠ¬Y³Šŗuė:_£©t¬-ń{×o¾ł&BCCƒ‹/¢[·n˜7o4 Žyē«ó~ź©§šüK—.ʼn'0f̼żöŪČĻĻĒžżūmvolYļö(5ÅÅÅø|ł2¼¼¼ź”Nii)233Ѿ}{Čål\NŌ·1ŒČ`>¶`.Q«–¶œv×x]ff1n!bjÄŲZ:t(:uź„/¾ų—.]’¶Ÿ?ÉÉɘ9s&ˆ½{÷Śč²kęüłóÉ·¶ŅÓÓ"­7F­ĪĶih÷¢S§NųņĖ/±aĆÄĒĒ›<ĘĖĖ ÉÉÉø|ł2ąŃGEFFžżļC§Óįܹs˜?>Z“h@’ĖϘ1cšĶ7ß !!pšąAüņĖ/˜žųcŠ;Nž}z­ÆĻ\:֖Ēų½[www„„„`ٲeŲ¼y3ąģŁ³čŠ”&L˜€wŽyĒŖ¼•J%žńą»ļ¾“źżōéÓčŲ±#fĻž-DlqolYļ¶.5=žžžø÷Ž{ė”Fii):„3gĪ G޾$"Ŗ;±»Œ©Ž$¦ĄtÜ”Nģ5˜©qäƚĄH 0'NœØ >}—.]Ā€°wļ^<÷Üsøuė¾ūī;é˜üćhŃ¢>śč#Čd2 >”””šōōD^^:„;wJŻnžóŸ’ ..aaaŠjµpss³˜¦q÷źņxżõ×±oß>ģܹŠ·o_L›6 ?żōC† ĮąĮƒńĪ;ļŲåFfee”]»vģū n\—+V¬°ź( Œ;ĮĮĮP«ÕČŹŹĀ¾}ūpšąAU»Ģ¼łę›Ųµk<<<Š·o_(•J\ŗt ?’ü³ōk½5łvģŲcƌA«V­ “ɐ––†­[·š|ļ5¶{įććƒżė_čßæ?“Z-6oŽ\„©«ųŠgĪ·ß~‹īݻ‡cķŚµ•ŗ­8qBZ×étŠétUšĀŠŪEžžžˆŠŠBhh(ÜŻŻ‘žžŽøø8|żõ×ŅqÕ•ĻŚtŒĶš5 YYYųõ×_„mÖtgŖī˜²²2“ŻŅŅҤ€‘µ÷F.—cöģŁøļ¾ūąļļ/]׏•+­®ŸĄĄ@`÷īŻ•¶ļŻ»3fĢ@»vķpåŹ«ņ²¦ÅræńĘX»v-.\ø`ņ\¹\Ž_|ćʍƒ««+ńöŪoćęĶ›5JĒRyL½wu:Åė,((Ą˜1cŖ¤ķęęfń¾ēݦM(•J) (ڵk^yåØT*ųūū[uo¬yÆXS_ÕŻckß+DDu„T*1hŠ ØÕjœ8q={öthWx"®]»†›7o"??mŚ“Aūöķįģģlķér˜@Øģ°4†ˆøæV_u DČŖymXps³Ī÷ Ŗ5xxxąģٳf9}ś4|||ąķķ-żz'>|Éd2tģŲ§OŸŒ9C‡Ŗ-[šŽ{ļaóęĶ:t(FŒ!„WQQāģŁ³Ų¾}{µi«.ääd錷o[·n!00PŚhׇpńA£]»vš÷÷·[>Ęuiķ=˜4iīŗė.¬]»K—.ž}ūpß}÷įŽ;ī0™ 8p ***šÉ'Ÿ 66­ZµĀŒ3¬¾/J„3gĪĵk×°téR,Y²©©©˜5kŌju£æo½õŗuė†9sęąį‡F~~>"""j”ĘģŁ³‘€;wbąĄP©ThŻŗ5ŠŠŠšžūļc÷īŻŲ¹s'Ž|óMøŗŗJē­Y³S§NEļŽ½”T*ѳgOLœ8±ŅŲ ,@»vķ0wī\DDDą›o¾Įܹs1qāÄ•±¦éųųųą”‡Ā'Ÿ|R©…‡‡zōčo¾ł{÷īŶmŪšā‹/B©TÖčSśõ뇣GÖčŽ<ńĘ9s&>łäŒ?Ė–-Cdd$žxā «ėFü޹zõj„ķākqMó2W‡0uźTųłłałņåfĖ%Ž›'Ÿ|QQQčܹ3Ž~ūķ§c©<ĘļŻŠŠŠ]g—.]0xš`DEEa̘1X²d‰Õy›ėŸ ¹\ŽÖ­[[}o¬żWW_Õ]»µå!"²•ąą`ōéÓ§OŸFYY»Ļ9@YYNŸ>Ó§O#??eeeHII±źĒ(¦Z…˜k!bĢ\ą¤ĘjŪBDfaŻT”M]–/²F<<<Tī“o,;;[:öܹs6lüżżqóęM“nŻ®®®8sę ”J%Œ={öH#ĒG@@ „;v@‚€¼¼<üžūļś‹”É̦i̚<.]ŗ„aƆIē!!!½zõ’¶ā?žØkõ™„Õj‘ŸŸ»¶N0®KkźG„R!44ėÖ­“aYYYRėsŠŠŠšŪoæIĒ’ńĒ˜2e 4 ŠŠŠŖĶ×ĒĒ...8~ü8rrrčĒ*ILL¬õx å^ųłł”’žxēwpģŲ1Ą_|Įƒ£U«VV§SVVA ÓéPZZŠ–-[Š?Č~ńÅųųćqĒwąÕW_…\.Gtt4ąÓO?EĖ–-ńÕW_IimÜø_~ł„ōśÅ_¬”×ŗuė0uźTÜ}÷Ż5jž_Ót~ųa¤¦¦bß¾}Ņ6¹\ŽŠŠ ųłłįŪoæÅµk׌gžyjµļ¼óŽUǘ2uźTōė×Ozš“ęŽøŗŗāį‡Ęwß}' ¹}ūvtķŚÓ§ONJ+PQQQm݈ߧĘ]ZŠŠŠ¤żµÉĖT@Ė–-1wī\¼śź«Ēü),,” —.]Ā_|×^{ -[¶ÄĶ›7­NĒRyŒß»5½Ī9sę`šąĮŠjµųņĖ/„n.Öä}ķŚ5”––¢OŸ>•¾ĒÄļ|WWW«īµŸćźźĖšk·¦>wŽy'T*ŹĖĖ]4¢fA«ÕāĀ… Ņµāµ×®]Ƶk×P^^ŽĪ;[óC±©†Ö.¦ŌŖ•ˆ=CŖ¦ l*P"‡ "āH-żā*£Ó鐚š ­V‹N:Š÷©/((ĄÕ«Wįėė „R‰‹/V:’Ņ„KP«Õšóó“¶ž*f)McÖ䑜œ OOOxyyA­VĆ×ׄææ?”J%4 <==ķŚB€ōŠŲ·u‚a=YS?Ėåø~żzņINN®ō:-- €žÓš|322‘‘éÓ§cŲ°ahÓ¦ t:n޼iÕĆf]Ųū^tčŠŖ““:yņdŅU(ōć&ļܹ?żō®\¹‚ß’_|ńʍFxłå—Ń·o_<ūģ³ø÷Ž{1wī\ōķŪ ,°˜ž7¤4źĀ\:J„Ņų"A0|ųp̜9æ’ž;N:…~ų_|ń"""¤™®Ŗ;ĘŲ“iÓšņĖ/ćķ·ß–h­¹7ķŚµƒ««+:Té˜ÄÄDxzz¢}ūöu®£Śęe®}kżū÷W ”KJJŖōZ¬‹   „S]yźr/¾ų" „łóēcśōéUZ°XŹ»¤¤k×®Å#<‚ū˜>}ŗŌĒŚļk?ĒÕÕW}¾ŸˆˆjŖcĒŽ>|8Nži2wwwéM`ų«š„4Y“Ē„K—PTT„¶mŪ¢¼¼7nÜ@AA233Ń®];ø¹¹!//™™™6½YŽbX—ÖŌJ„€’#h܏¾¤¤€ž!ElvYݽ’ģ³Ļ0tčPōė×cƌANN¶lŁR偭±qss3YGuJWüµŲxŠÕcĒŽA.—#00®®®xąšŚkÆįĄ€ŒŒ ,[¶ |šbccqżśutļŽO<ńŗwļ///( Čåņ*mÕ©I: €»»;¶mŪfUŚžł'ęĪ‹Ž;"##£FĒ<óĢ3xųį‡ńśėÆK-¦¬½7¾¾¾`vjZ«Øā÷©››[„ōÅĻe^^^ó2W‡£GFļŽ½1mŚ“jĖežžĪP«Õ5JĒRyŒÕ¦NKKKńēŸāć?Ę[o½…O?ż“Ņ8–ņžųćįģģŒ^x …ū÷ļĒ'Ÿ|‚E‹įÖ­[Ҙ2–ī5ļkźĖšk·ę½BDdO‚ @”P8lI¢ę"//gΜ‘žmļŽ½»_«Õj¤¦¦āÖ­[8xš śöķk©„ˆ¬†ėvaYfŒ·››ĘÜ1µ’››‹ĢĢLÜyēfg‘éڵ+ŅÓÓ„›xöģYÜ{ļ½P(芔ƒ4B¾ų€¼bÅ “­,Ķ„n.McÖä”Óé¤qDAf<ø|ł2įęęf÷Ö!*cråŹ•z™åĚś6ƒĀĘJ)O±¹eu÷¾°°›7oĘęĶ›įēē‡!C†ąĮDzzz[¬Ō„½ļ…ų€)›Du*/##Z­¶JĄRl9RRR‚6mŚ@&“U™ŁCœŽ“uėÖ(((Ą'Ÿ|‚¤¤$<żōÓHKKCii)–.]*ŻGkxzzÖ(»ļ¾'Ož“śį®ŗ±AĢóĻžÓ¦MóĻ>+ œ\“{#v[˜;w®É®zÖ¶RRRč»äX*Ž‘’’"µN²6/su8pą@xyyI]2 %$$૯¾Ā’ž÷?ś€¤!ń³\TT„ššp«Ó±TcÖÖ©§§' *ż‡\|ļśųųT ˆXŹ»““ļæ’~„Y•¦OŸŽ¼¼<¤§§ĆÉÉ©Ś{#®[zÆXSļbwK×.v‡³T""{HNNƾ}ū0`ĄøŗŗāÖ­[Ž.Q“„Õj„`ˆ³³s„!†‚‚‚ąģģŒÓ§OC«ÕāųńćøćŽ;ąééi*Ys±Twœįö:³W—™źśö˜ś[g@‡¤ uéŅwÜqG„¦ĮgĻž…««+śōé…B!żz––†ņņrųłł”°°°Źb©Ł²¹4Y›Grr2ڶm‹   éAńŹ•+h×®«tķ°5Ćžßõ ±¶~ŅŅŅ ‚±VŪ¶m+½ oŽeM¾žžžčŲ±£t~FFÖ­[A¤“ģ”>ī…ųšŅ„K—JŪūōéS§tu:žśėÆJcā@hh(JKKqåŹéįQlī/›å_æ~]śBżų揑ššŠŅŅRØTŖOæWÓtĀĀĀL>* ųūūKŃ AƒP^^޳gĻZu ><ņž{ī¹*Įkļ͹sēPZZŠöķŪ#''§Źbm’źk×®įņåĖ:th„ķƇGrr2®_æ^ć¼ĢÕį’%K0nÜøJĖ’ū_”––bÜøqųśėÆ„cļ¼óĪJēvķŚ€¾K[MұTcÖ\gß¾}±cĒ„††V:W,ÆqĻRŽćʍ«4N”L&Ƅ NgÕ½±ę½bM}Ysķ֔‡ˆČÖ>ŒķŪ·#$$^^^ †ŁŁĮƒ‘——µZ^½z™ †ˆŚ“iƒ^½zA­V#//ϚqŻĢA +¶Õ™=ŗĢT©é>«‰ŻT~ųaģßæ_ FtéŅƒ ĀńćĒ+ T—ŸŸ““4 <)))R«„’’üłēŸ1bņņņšš 777 >NNNųę›oĢ–Į\šĘ¬Ķ#99Ɔ ƒ³³3Ö®] @’0‰““4ddd`ņäÉU~inß¾½Ō,_.—Ćßß_ &\øpĮäą²_}õV¬X7Žx?’ü3:wīŒČČH¬^½EEE(**Āž={šĢ3Ļ ''.\@PPžłĻb÷īŻø~ż: t:ƌƒü­[·ĘģŁ³qīÜ9“iÓ …Ֆ/--ĶŖtD­[·69uØææ?~žłgģŻ»?žų# Ńæ<śč£X³f rrrPķ1J„QQQŲ¹s'ŹŹŹŖf.^¼hÕ½)**ĀŚµkńÄO ##G…··7{ģ1øøøHÉZs’–/_ŽE‹įŹ•+8räśõ뇉'āÕW_­Q^ÕÕa^^^•–āgŃų}īļļŁ³gć×_E«V­šŲcįĻ?’”ŗ Z›Ž„ņ³ę:“’’pśōi¼łę›ųųćqłņetļŽO=õ~ūķ·*’Q·”÷ AƒŒwŽy™™™˜6mڶm‹W^yE:¦ŗ{cĶ{ÅŚz·ęWW"jŽĢĶ U[§NĀɓ'1räH(ŠJ­ÓˆČ¾zõźe®µG%-[¶„³³3“Z­„ć«ėMRŻ,¶6aĖ€ˆ5­BĢ]¬Mčt:|ūķ·čßæ?BCCŃæčt:¤§§#..‰‰‰UĘó8{ö,† Ve܀͛7C«ÕbüųńšōōDqq1.^¼ˆ7V[si³&ń!°¤¤DśOõĶ›7įāā‚¢¢"deeٲ «›z×g0¤&õ³aĆ””” ""*• ŁŁŁŲŗu«Ł`:t®®®xžłē”T*qįĀüüóĻVē{īÜ9¬_æƒ Āøqć ÓépćĘ |óĶ7fĒ‹hL÷āõ×_Ē믿Ž˜˜hµZlŚ“ «V­Āć?.óÆż }ūö•^O›6M‹`źŌ©&›ÉŸ:u Ļ?’<ž}öY¬X±yyyX»vm„n Ææž:{ģ1,X°žžžHOOG||<¾ųā ś`Šāŋ1sęL<ņČ#øpį>üšCčt:,Y²[¶lĮØQ£¬*Ÿ5鶖9J„Ņdw“““4<õŌSxā‰'šĮĄĶĶ 7nÜĄņåĖ„ ¦5Ē”uėÖhŻŗ5F]%Ÿ3fąÜ¹sVŻ›˜˜äēē#** žžžČĻĻGBB/^\£ū·uėVØT*̜9QQQø~ż:Žzė-iZlkóŖ®­åää„ļ¾ū¾¾¾XµjŌj5<ˆ’ūß5N«¦å©ī:AĄóĻ?'žxsēĪE‹-póęM¬Y³+V¬ØQŽļ¼óęϟ·Žz ®®®8qāž~śi©«ī5ļ[\»µå!"Ŗ«ņņr$&&āܹsčßææŻ’LD3n j qܳ²¦„ˆMÕ&㨌“Į¢ą@@ ĄÕ`_‹ū] —łö¾XŖqŒGCģåõ×_ǟžiשŠķ”)Ž """jśņóóqåŹ“³ŖÕDQQ p÷ŻwK-Śź›Ų2›]tˆźN&“Å(Pbš·@-€Bƒæāŗxl)€rƒŠO¹+.V«ÆYfØŅjµū‡*ć½ ""¢ĘČÕÕķŚµƒ\.‡L&«2¦–5d24 ¼½½ł’!¢¦ÉīĆk˜S‘zé.C¶ĒpŽ """jŒ E„įė¢.]/‰ˆLa jVŽ~ūmGˆˆˆˆˆˆĢ«·Ęöšv—ˆˆˆˆˆˆˆØĮb@„ˆˆˆˆˆˆˆšDˆˆˆˆˆˆˆØŁa@„ˆˆˆˆˆˆˆšDˆˆˆˆˆˆˆØŁį,3DDDDDD \ł‰SŠåęV{œĢĖ N={8$ļšp¾³; ŃŲ4ĶĖÉAŁÉӎ-CŠ ī…ƒ0 BDDDDDŌĄ.xå{÷U{œÓ=ƒąõėĻÉŪ*^ø’/¦a<€k4p4å'N”"õ2*ŽŸDłń(Ūō›£KVÆ<7­‡ó Ž.†C0 BDDDDDDv§œ1ļF7Œ`ˆ§ž=ō­jʏÜźŻŗĖ—],Ŗ & ’ąč"Q-čt:‹ÆĶmsŌ¹%…¹8r8G¶śļźÓ}ś†Ų« ›4Y` <>]ÖhZ!ø.x …’|ŽŃÅ zŠ`"DDDDDDõA †D½ņ†Õēļ’oĄ°Ńć]üFÅeĪ“påÅ×*ÄÕø1(ōҹ9Ž. Ł"DDDDDŌ¬ˆĮŠņ2‚”¢‚P”¢FÆÅż>ō~\µŠ+É{õ‚ǧĖl>Ąk½Šhą2cJ>żÜŃ%!;ć“»DDDDDDd3ź/Ć{Ļļ3r›ė?Ÿttذ…Q#„,+†sy©ōZQ\`ó<\‹ P”Ķ«ö8ÅąĮP¬\y»¶Ž®–:“·k ŸaP¼y«£‹b3…jOG”Įa@„ˆˆˆˆˆØ‘RP•j’ŽPQZūÄĢp®(…³aĘ4`įB *Źö˜˜Œ ääŌüÜ„K«–):X“Čź$T¶æ"‡a@¤*v™!"""""ŗĶĖŪ×ŃEh\""€ää† €^fĶr`åPCĒ€wÆoߖŽ.JƧŃė×ė{Ģ S×`ˆ(6 ­{:Ō$1 BDDDDDĶž«»W„×>žm]¤†+*Jß*$"Ā>éŪ*b˜^Ÿ>śæD8†5k*W7“ŪżqóZŠ£‹×p+WįįöĖĆÖĮQJŠ>Żą`ū•DˆˆˆˆˆØY+.*„ ”CØØ@… @ØØ^ ‚ąčā5 ź$µ'{CD99@|¼}ƁDˆˆˆˆˆˆšŠü|Ū§iÆqB ‰-88ÖÕ#Ž!BDDDDDŌT$&ھ%‡½ƒ!99ĄŌ© †P½c """""jvŅ._ptģgŃ"ż8öėĆVrrō-C8ą)9"DDDDDŌģüøj•£‹`_“'ėg‚±wėŽŗ`0„Œ"""""jv¢^^Pćsbžūž£‹m½œ}PdēNG—Ä|ł !c@„ˆˆˆˆˆš„²²RA?›ŒNų{]*nļÓÆėt:G·ęā恘 *ŹŃ%©ŒĮj 8Ø*QSāčTÅ`5 l!BDDDDDŌT„„’ų9ŗ4•1B L“ ˆ!11ČĢĢųśśĀĻĻ!!!puuutÉŽæŗc5# 9bhņdCØAir‘={öąōéÓU¶gff"33§OŸF÷īŻ1xš`G•Ląż«;Ö!QÓ'ļÕ ŖÓą2į^ ][GĒ:Ļ?Æפ!ŠŒ&MŽ~›A›f¤IDÖ­['żnÉéÓ§‘‘‘)S¦8ŗČdĄųž©Õjø¹¹ ”ÕjšžYĀĻQÓe‘7– ˆ”ˆżÆ11Ž.‰^H0w®¾\āōÄįįĄ¬Y@\œ£KGõ É ŖŗgĻžj³²²••…āābdffbĻž=Ž.6Żfźž¹¹¹!,, aaaR`DÄūW•qŖÕjx{{cųšį>|8¼½½”V«„ż¬C"""¢ĘĆė»šŽó;ŌsžhœĮŃŅ„ŽģU£Ńe’“„}Ė1"ī_æXøŠ”ÕDõ£I“)**2ŁEĄN§Chh(ąäɓō撛O᯿žĀöķŪ”P(P\\Œ»ļ¾cƌ±KłSSSńß’ž~~~())A@@¦M›†–-[:øf뇹ūWQQOOOiݘ„ū'Z¼x1“Z-Žxć ³Ē|üńĒ1bŗwļ^ķö+W®ą½÷ރ“-$$­ZµĀµk×̶øŲ»w/®\¹‚‡zČŖ¼ėZ‡jµ …»»;`Ą€HHH€J­mLÕį¹sē°nŻ:,X°@ŚöĮ ""]»v­Ń5ÖTuubĶ=­­sēĪaĖ–-xī¹ēlž6Q>“7vk×}śčY­/ĄĢ™śæÖˆŽÖĒņĀ õ[NŖWM¢…Hb5}¼œ†»īŗ ķŪ·‡———Ås ńÓO?įłēŸĒ+Ƽ‚W^yGEzzŗŻ®”eĖ–Xøp!Ž}÷]„……įć?6h(ŹŹŹšß’ž×&i™»eeeČÉÉANNŹŹŹjt. ^TTTĄŻŻgĻžµŁµūūūć­·Ž’–I“&”’žķ~bXžžžhŪ¶-ī¾ūnųśśB£Ń@£ŃĄ××wß}7ڶm+šŖ«Ć†ĘÜ=5|?Śņ½i/”ŒDDDDv¬\i’|BBō-R²³õ­>¬ †ˆ"#?žhŲÕR4‰"…B„R)m×jµ(**ĀwމN:IĒŖÕjé[<×Pii)*** Óé*• óēĻ –¬X±‚  ““½zõ½÷ދŋcĀ„ øćŽ;čyß¼y3^zé%lÜø—.]‚ Ąƒ>™Lfözī¾ūn8pĒŽCŸ>}‡ .@&“!00<š`÷īŻ8pąär94 fΜ‰3gĪąĄxź©§}ōʎ‹¼¼<>|åååøzõ*&Mš„?’ü¹¹¹xłå—”V«M–óģŁ³Ų±c\\\póęMø»»cīܹųöŪoqķŚ5¬^½Ó§O·ÉżĒ A:ÅÅÅŅC°³³3 …4¦ˆ©ū'ڱc „R‰ųųxtėÖ ¾śź+Üŗu -Z“@qq±ÅķÖ0laŖEuÉÚ:“k×Īģ±ķڵCQQņņņŖœk“'Oā÷߇««+²²²Š¢E <öŲc•Ž1õž5÷Ł©I˜»§†ļĒ¢¢"i}āĉ&óL~}k¤Æ¾ś 7n܀‡‡žyę>|øĮ~~ˆˆˆˆ%{'¢ŃčӞ;×6]sBB€#Gō3ä4Ōa©ÖšD@D7A©T¢M›6pqqAjj*ŠŠŠpĒwHM/^DjjŖŌ]Ąš\Cāø ŃŃŃčÖ­zō聾}ūJģbszN‡W_}ƒĘ=÷܃żū÷K‘}ūöaȐ!8sę nÜøēŸšÅ_ąŲ±cøė®»,^SŪ¶mqóęMœ>}ēϟǼyóK–,Į‰' Ńh°k×.¼śź«prrĀŚµkV­Z™LO.—ćęĶ›xżõ×±nŻ:$$$ąłēŸĒgŸ}†óēĻC©Tš,§Z­Ę… šļ’nnnųĻžƒ””Œ;7nܰÉÜxÄ1C<==Q\\ •J„R „R‰ūī»OŚ–——‡C‡A«Õš7¦  GŃ>¹\Ž5kÖ ;;ŽŽŽ8zō( 1ž|ćÕW_³ŪkĀÜżŁ"Kułłł8xš ¼¼¼Š«W/ŅÓÓqüųqäęęB.—›<×r¹©©©xēwąźźŠeĖ–!))IŚoī=Ū³gO“ŸóēĻ[U'–ī©įūńśõė•Ž›¦ņĢÉÉ1łł ĀÕ«Wńä“OJļ÷äääżł!"""j“–.’’lhˆˆŠĻiūrj4ĄĪśĮVcc볆ČΚD@Däģģ Fƒ¶mŪĀĶĶ īīīčŲ±#¼¼¼påŹ\ŗt VuE™8q"†ŽS§NįčŃ£ˆ‹‹Ć+Ƽ|÷Żw(..†“““Z- ‚õė×£øø‚ ąĀ… ˆŒŒÄ¶mېššŠ„K—Ji—––V›æ\.‡N§Crr2ŗvķ*µ(éܹ3RSS‘™™‰.]ŗĄÉI §N •¾µiÓ2™ ŅyŠjµøzõŖÉrŖÕj“k×NŌ“E‹(,,„J„²ė½¬kś»wļĘ]wŻ%„ŠŻ»wcҤIøvķ:vģ(å#¶¦0·ŻXzz:Ž|óMéõȑ#„Ć„K—,ŽokóØ ±å‡˜·Ų⢓“¹¹¹(((ØsŅø#;vč7 ¹ŻÆÕÜ{¶K—.&?;Ö։„{jNII‰É;ÖŌIu÷Ōšżhøn.OsŸŸŚräē‡ˆˆˆš¹ĮĶFxxõÓ܆‡ė[h$'ė’:""ĒqäōĮdM¢…HHHNŸ>ŠŠ "-- hŃ¢n޼‰[·n™ķ&bāMܧO¤„„į½÷ރ³³3***ŒdffāÓO?ÅåĖ—ˆ”C‡bÕŖU˜7oڶm‹’’(•JiŹÜnŻŗ!44K–,L&C—.]Šŗuė*y޼y‹-BEEZ“hēž{NNNøćŽ;pęĢ|ųį‡ōŻÄéHG…?ü …žžžˆŒŒ„‹‹ Ōj5Ž}÷]“jÕ :u‚ ÕÖ”¹rž;wĪäń>>>(++ĆgŸ}†§Ÿ~Ś&÷ϘŲUĮx½ŗū·cĒŒ;¶Źö#Fą·ß~ĆK/½„„„¼÷Ž{šõõEĒŽ”Óélr{M˜«GńßyX[‡r¹ÅÅÅRࢸøŲdĖSučä䄧žz ?üšJKK”R©0gĪéü6mŚ`͚5ČČȀ§§'īŗė.ģßæ̾gżüüL~v¢¢¢Ŗ­“źīé /¼ ½gĻž-­O:ÕģēÕŌēĒŚ¢µ÷ŻŚĻĻʍQRR‚©S§BĢ™3Ÿ~ś)är9Ö­[gggLœ8±Īļ""X½zµ£‹Šd˜ ŠulŽœŻģ$:Ųµ«ņx"AAś– ‘‘ o¦—  ż 4/¼ĄqE1Y-Ļ‘œėd°(øPPpąv{]|­28F<ŽE§ÓĶ·¾UķŁ³Gz T(šöö† ĖåČĪĪ6łkl÷īŻ„–äX†÷Oäėė‹°°0Ą”C‡Ŗt įż«Ģø===@VVŅŅŅ*1R›:<}ś4¶oߎ¹sē:ś’‰ˆØVÆ^įƇ;ŗŽŽ;,DBų˱Ż$&&JkŗŽšŚ¶ü£ÅˆzyŹŹJ!T„ ‚š÷ŗ TÜŽ§_×étųqÕ*D½ņ†M®Ć\—õ‚—įŗą%GW³cääčĒH­é4¹Ž£Œ4pY^-ėœ†­ŗĢČd²ÅJn/āzŃķõŚŪÆÅuńøRå č «5‰"€¾»JFF233QQQQķx ¾¾¾|˜n@ ļŸHSD\7ÄūW•qęååU ~cQƒ¢Ń·»’7*QQś#³f5™qEš‹&1†ˆhŹ”)RwKŗwļĪfv ńżĒ13ąż³¤>>Ż»wgė"""""Cś.4lÖØ4™"¢Įƒ#$$‰‰‰•~-÷õõ…ŸŸBBB¤éB©įįż«;Ö!‘„„čƒ"“'W ÅĪ®øøć¼ŚĆs,‡ē¦Ķ³2E PķYoåw¤&WWWvhÄx’źŽuHDDDŌL¼š”drWš³+|æųœŪ·wt)›Ų¹S_bbģšU¶“ N»¶@±ÜŗĒzU©ÖŖćDˆˆˆˆˆˆØ”KJ2Ū”Xå‰ćϼŒ¾æ®qt)›Ÿ„K»īŅFģ0®H²ŹÉŖf8E³5©1Dˆˆˆˆˆˆčo9ūžÄ•OW8ŗĶSd¤¾ Fc³$³\°ß3€Įa@„ˆˆˆˆˆØ K~o)ŹRS]Œę)$HN¶É`«É*Oq÷·ŗ‹ U""""²©]»vaÜøq•–’ž÷æ8vģʍ‡­[·Z<ßŅq?’ü3ʍ‡óēĻ;ś2īʍX³f bcc±bÅ |ūķ·øt钣‹Eö–˜ÄĘÖč”ņ¼<ęeG—¼łŅh€„}‹‘ZpD«¹PQoy9CKDDDDd÷Ž{/z÷ī hٲ%±dÉ8ŗhMB\\ī»ļ>“nŻpłņe¬_æO=õT*•£‹Gö’Ÿ̚=Ŗ§ĀJbיvssō4_+Wž=®ˆ•N¹¶Ą „›£KŽd1 BDDDDvѵkW :Tz}ģŲ1,X°Ļ?’<ƌƒ“'OāĖ/æDJJ |||šŌSO!,,¬J:?žų#Ö­[Fƒ=zTŚ÷믿bŻŗuČŹŹ‚¦NŠqćĘ9śŅķNhµZ”——KŪ1wī\( @JJ öķŪŠét0`:uź„ōōtÄÅÅįÉ'Ÿ”Īżæ’ū?<śč£(..ʖ-[ąēē‡ÜÜ\<ōŠC8ž<öļߏŠŠ ųūūc̘1pvvĘåĖ—±gĻ)!C† ]»vŽ®šę#&Ų³ČŹ²ś”ä÷–¢Õø‘œuĘ@ʦ­8’ź"ōśž xōŗÓžFEĮĮś©y- ¶ZÓdØvŲe†ˆˆˆˆź]NNŽ|óM“hŃ+W®D’žżńŽ{ļ”°°°Ņq©©©ųśėÆq×]wį„—^B’Įō¢©©©ųß’ž‡±cĒāĖ/æÄØQ£°råJ\æ~ŻŃ—gwr¹÷ÜsÖÆ_7āųńć(((‚!EEEųõ×_qļ½÷āį‡ʄ °yóę*õkL”P ''ķŚµĆC=„ĀĀBüńĒ˜:u*fĻž N‡¤¤$hµZüśėÆ3f ~ųaŒ=7nDii©£«¦yILRR¬>œ]gžV–šŠĆ¦įų?ž@ń•«84ä^¤żšSżd9bv\‘S®-8VH=a@„ˆˆˆˆģbٲeŅ"+W®¬“ļąĮƒŠjµ7n4 ¦L™­V+µh‰ńćĒWiqR\\ 8zō(Μ9ƒ1cĘą§Ÿ~’ŗ4uaaa˜5k‚‚‚påŹ|óĶ7ųć?č»Ļųūū£E‹Fƒ–-[āņåĖÕ¦«Ó銳gOśV&psÓ7ٟ8q"šš ųśśüüüąććƒ+W®8ŗZØœuøņé 29ūž¬“żō3/įÜ«ŃõSˆ  ż 4‘‘śuiJWģ÷ `™zĐŁ…į"ČĻĻ—öŻŗu šĘoT:'==­Zµ’^ēåå<<<^^*Ų­[7<öŲcų駟šŸ’ü€>H°`ĮØÕjG_~½šōōDÆ^½Š«W/”••I«V©µZ¢¢"ųųųXLS„RA&“Š·4qqq©rLQQŅŅŅšõ×_WŚ^QŃ<blģškי²ŌTęå*CW?ū å¹yčņŸ…pö²ó ¦~\‘ŪeþƒŠģ=€œ½¢ųŹUGWW³Ą€Ł…©1DDāCłĀ… ѧOi»B”ĄÉ“'„מžž S²³³+åq’ż÷cŹ”)ø|ł2vļŽU«Va÷īŻ3fŒ£/߮Ћ‹‘——i›³³3<<]ņŪAVKn¬Z‹‚ć§Šē×ķ¹Ķ¹}{“o€śĻTYj*2÷D6$vÅ.3DDDDTļBCC”R©°qćF¤„„aķŚµ˜1c.^¼Xé8±ėĘÆæžŠ³gĻb÷īŻŅ¾}ūöaśōé8tčÜÜÜt»Ł¹«««£/Ļīņņņšć?āŚµkҶK—.įśõėhŪ¶-‘žž.µÄ¹uėŅÓÓwwwhµZŠŖ $†Ś·o““4©„Īļæ’Ž}ūö”}ūöHOOGFF}‹‘oæżÖdš„j!>^?čf‡śĮS- ¾Y[Ķ„ėLžń“88x,’ß_jU0DTpāō„üć'­>Ē–œoGzüo ŪĮI{Šż“ŃöéŁpļŁ£ī¶!""""šööFtt4¾üņK<’üóhŃ¢fĻž®]»VjIŅ©S'<ųąƒŲøq#®]»†ĮƒćēŸFYYś÷ļ'Ną£>B^^¼½½ńšĆćž{īqōåŁææ?ʍ‡ųųxi TwwwLš4I7dĀ„ ųķ·ß¤s&L˜ ‹ś÷ļU«VA­V£[·nšōō4qwwĒØQ£°nŻ:‚€-Z`Ȑ!pqqĮĉ±mŪ6‚AÖlŗ*՛”ż­‹é[‹,\hÓä›zיä÷–"ł}ė§&6Vž—‡#D—’,”Zn8ŠŌ‚·[äę"gļŸH~o) NœrhŁ3Y-Ļ‘œėd°(øPPpąv{]|­28F<ŽE§ÓĶwte5u«WÆĘšįĆ]ŒFoĒŽ˜>}ŗÉ}«WÆFˆ™Ł#Øī1eŹØÄ1Ō1µmłG‹õņ”••BØ :įļuAØø½Oæ®ÓéšćŖUˆzå ŲBپČ?Łä>ŸÜ›ęO ²zf™d•'’U–»|hŻŻäŗĪdļ=€óÆ.²i  Ė» ŃnĪc޾“*Ņ~ų §Ÿy 0<Ēvƒg{ųB+Ŗl÷Ü“΃Ō9}™L @ÉķE\/ŗ½^@{ūµø.W  Ü`Įb5v™!"""""j,j0Ķ®5šRי²Ü\œ{5G&>hóVē_[„S’|ŃїXEĄŒąt{¬%Ŗ9Dˆˆˆˆˆˆš±ä÷–źg9iIJ÷Ą”Į÷āźg_Ł-«Öāąą±(ĖĶuōåVŅjĘTG”Ńb@„ˆˆˆˆˆØgiŒŹrsqźŸ/āČÄėe&–‚§pdƒlՔOĻrt-Dˆˆˆˆˆˆš My |ˊ¬:¶1vÉŲ“zĀUkė5_1(’½÷@•}Žhićܾ=4ƒī®÷|›Dˆˆˆˆˆˆš ļņō.ĢĀšœ+čSŽV„…P åfo,]gŹrsqģįĒqüOŌh*][*ĻĖƑ‰"ķ‡Ÿč7=ČT#5õļY„’’ōūČ®e@D«Õ:ŗDäüģŁžqė‘ŒČYĄłS€Fć袮|ŗÉļ-m0­B4åÅŅŗa½iÄõ‚t`Ö, }{ąčŃæ r482 BDDDDDDöį—™ōéDDC‡ź’:@}¶ 1äP åP ÷ŠR8ėtÖ'[ÆuEµÓä"::‚ Hė2™ “ɤär¹Å4DĘĒ ‚ ­¦GDŽ#~. ?ļāēXükź3_ŻēˆˆˆØYJIbbō „‡“&QQõ’}ņ{K‘üžŅZŸÆf”ß^ƀZZ’;ČaŲŗƒš§&),,Ä<ww÷JŪGQ£Fį¹ēžĆźÕ«!“É P(T}ųÉĪĪĘc=†U«VA( 8;;KY<ņ-Z„€€Čår899Ii‘c<’üóø÷Ž{1dČČd2899a×®]Ųøq#Ž{ļ=čt:8;;Øü™ÆīóNDDDD·ÅĒė—ČH»w„98x, NœŖ²Ż\CcŲ`Ć6œ*ŹP*ośĻ¹M* "ZŗTI,//—NNNX¹r%ŹŹŹ¤_Žår9AZ“Čd2éW꒒”——KQNNNŅqÅÅÅ(**‚““\]]!r°ąŠ”Cčßæ?@„RįąĮƒčßæ?Š‹õĶu:”J„ÅĻ»““ž+QükŲŹÄpŻ0 ¹\Ī–bDDDŌ|ÄĒŪ½ M»’|Ø Ņ„× rŌ?ÅķV4M]“ ˆ”——K. …J„łłłxī¹ēšõ×_Nž<‰Õ«WKĒMŸ>={öDii)t:JKKQVV†ķŪ·cŪ¶mpuuÅ]wŻ@?°cQQT*\\\ąääć!"0`Ö®]‹āāb)ŠqäČLž<%%%ų믿°eĖ( ‚€G}=zōØōyæxń">łä|ņÉ'ØØØ€B”ĄŒ3ƒ-ZąŌ©Sųī»ļŖ|gˆß1 …‚ßDDDTgź’BGĮ²]»ģ Ō8“ßŃWJĶ@“ ˆˆæśŠĶߕJ„ŌŅ£¢¢¹¹¹ˆ‰‰Įæžõ/“iÓ—.]ĀāŋńžūB +//GFFVÆ^>ų^^^Ų½{7rrrPVV†ŅŅR(•ŹJc‘c“k×ŽŽŽ8ž<:uź„‹/ĀŪŪ~~~ČĖĖĆ÷ߏ’ūßšõõEbb">ūģ3¼’žūҬ5•Z€‰ßPVV†ōōt,^¼’ś×æŠŗuk$''Kß¶#""¢¦oĻūē1tčßc—ŁQ“ ˆĢŸ?_Z—ÉdųĒ?žąą`ś‡›cĒŽ!00~~~Šjµhٲ%Zµj…'N C‡ōHgĻžEĒŽįźźŠ’’ōļß±±±ŅÆĄ †5 r¹ ĄńćĒѹsg>|”””ØØØ€J„Ā’ž÷?( TTT sēĪHOO‡V«•ŗÓˆP(--­ŌŚ£¬¬ §NB»vķŠ¢E‹*ßĮĮĮŅø% ˆQ“—˜ØŸ:֞戄‡;ś*©™h”‘ÜÜ\“Ū‹ŠŠŃŃŃŅL3...pvvFnn.t: ‘‘‹/āõ×_Æt~AA ¤ć²³³”T*‘——¹\gggØÕjTTT ¬¬ EEEÉd())aSy¢z`ī³½{÷ĘgŸ}†±cĒāȑ#xä‘G¤ĻīŗuėpīÜ9©Ė äē磨Ø:………(..† (,,„L&“ŗÓˆß—.]ĀĀ… +åYPP€üü|”••Icń»€ˆˆˆš<{#¢Ń!!śą ‘5Ź€ˆ5Ä_lœœąģģ,żr+“ÉąįįvķŚįÉ'Ÿ„ Ņl1——'„”V«„&Qaa”4ˆ"5;wFqq1RRRPVV‚€cĒŽįųńćX°` ''’ś×椠)ieĆĻŗ ()Ńą%~g<žųćŠétŅ@ͤUŁbŒˆˆˆš¤$»#‚Įƒ!»“×=‰†GœVW©TB­VC­VĆÅÅEĮr9ŗvķŠk×®įʍĖåČĻĻĒāŋ”Õj„‡¹\ŽŽ;"%%Ej]²{÷nśęõ|ų!jXd2BBBšėÆæ¢WÆ^•Ęńōō”ZsżžūļŅŗų9ÖétšņņBaa!ņņņŖ|Ž;wīŒk×®įęĶ›U¾3  „DDDŌąd;¹ ŪÉÅö ļŚe’Āj’<ń~f;¹ Yå‰d•'N¹¶Ąaw?i”ši’-DˆŲ:ÄŁŁ¹ŅÆ¹žžžxģ±Ē°vķZ”——C >īīīR7…BŒ7Ÿ|ņ \\\Š«W/ųśśJMé}ą„ˆ†~żśį÷ßĒŲ±c„–aaaHHHĄŪoæ µZńćĒćęĶ›ųę›o0cĘ é\777Œ=Ė–-ƒ››‚ƒƒįķķŅŅRx{{#22k×®•`æ3är9är9Ē!""¢'ĒÉÉ*/€¦¼*”ŽåÅš-Ó¹.?šĘĒŪæš·Ē€lÄ UŽAšJÜV,wB±ÜŗĒvMy±£/„Ń©ĶĻ™2ƒŠUÄE Ą€ €€+·Ūėāk•Į1āń.:n¾5™Æ^½!!!f÷———£¤¤åååprr’¦Å ĶS^^.żš[QQ!µų0Q‚™L™L†ņņriąE±›‹‹ T*•4ŁObb¢ÅĻ> oéQRR­V+M«V«!—ĖQRR‚ŅŅRéó+¶ 'bK@’=R^^.Mį+v«æ æ3 g²b€”ˆˆČž1eŹU'90ՊŪŌ¶å-FŌĖ PVV ”B€ ܞqNų{]*nļÓÆėt:üøj¢^yĆ&×Q¶ļņĘO®²]]R×ā›ä”oEąerŸJ(‡{E)¼ĖKą^Qļņ’š%¾s§ż?ķŠHI±ov"4 ?+f8«„õ'•ĶóŌ”£oA†MŅ*R¹CėāVe»ē¦õp4 ĪéĖd²ÅJn/āzŃķõŚŪÆÅuńøRå č «5¹"āą§bvĆq*Mq ¹\.Dćń<ąļĄ‡N§ƒ““S„®2b>|"jXÄ„ųł_‹Ó⊁NCā÷¹Ļ»,$Ę߆³Ņ5b˃LgWi›¦¼Žå%P åÕ·"‰·@$<ˆutUIžnµ”Zmä< ė’‡&±½­nŸB”€N§“¶‰ €JǾ€ć5@b`C©TVśLZyDŒ?ė¦>ļ†ē‹ŪL}gšū€ˆˆˆ»'U„– *”šņxKŻm Z‘Ō×8"vˆޱ"vYŃŹP,WHuBMW“ ˆž­nŸ„‡Ć}€Øq°œ&Õ±ōygąƒˆˆˆš‹b¹n(pCłw× ±‰fļxŪ»uhbÜe%_””‚5—ƒš6¾ ˆˆˆˆˆˆČ*†­Hśģ=ļ{ź>ž„YAAśåö8"¦ŗ¬TnįĮÖT32 ’ČłØ‰š%~ö‰ˆˆØ©“ Ž.‚Õ ŽŸ²o@Ą©{'ćĘŖµŽ¾Tj¢e@äĮé#]"ŖgēĻe£KW»7Ģ$""¢īĒÕŪ]ŗ-{ļ“›ó˜]óšču'"d7œ"…ˆˆˆˆˆˆj,gļŸvĻCsĻŻŽ¾LjĀ!"""""¢+ĻĖCžń“vĶĆ£×pņōtō„RŀÕ [‰PcʀÕJöŽvĻĆŽ·RóÕ(U%"Ŗ‰/>_ļč"5XO<9ŁŃE F¬ąų)»ēĮ"õÆ1ĶvT ˆQ³šä“O:ŗDDD Ī„K—]j䊯\EYj*œŪ··[ā8"åyy޾ÜfCUŖE”ŗéŻĀ€5+-Yčč"5[ϽøČŃE "¹~½k’śWT§Qę\ē2“+īŽ©żAėÖŹjĻæq­‰_~÷Ć'”Ō£T­BAß;ņų£hÕ¦śó©aÉÜwv ˆśV"™›·9śR©‰į"DŌģÕō!­{`<õĻ|ø3£1֋=ĖÜŲŽ/„œDä8‰GSšAā+8«ND‘¬eå(’į¬:$¾‚Ä£)Ļ?žW2Ī>õ"Zģ>eAPQ eAZģ>€³O½ˆć%;ś©†źc^w:ś2© b ĖüŃæ_ųs‹Éż'<ŒM›~GzĘųś¶ptq‰ČƇAs­Iī4ė~ŠEFʍJŪ;w遐°{ąėŪ '')Öm1hš(ųśµd¤ßĄ¾=æ#ķśå:—„ŗóDÅÅEųüļ›Ü'¦mi_ĒNŻ6ž-PRRŒ+—/aߞßQ_ū¦«–®O”pĀŠį抵[OĄ¹3DZkēfTTTX¦ńµ‹d2¦<0 mڶÆQ½š:Ϛü̽_Ģ lß !a÷ uė@”–• ķśUģßū;neeXĢOćķƒšįćŃ* -JKKpńüiģŻ³ ååµ®ĻŚÖ™¹üˆØń»~½ߦĠܩ2£Æé=ŸĀ_×ćńmJ ü>0ŁRäʵRÜzó}hZ¶„“»+ņNœ–öyöģŽņ‚"Üzó}Üųź#¶iDźm¦™÷ėž‘!Dl`ŻśÆŃ¢…ĘŃÅ "°ō +rw÷4 6rā·oĀåĖ—PR¬•öŻ;aöīŽ†‹ēõ’éėŌ„;ĘMœ†Ė×¹,–Ī3Ģ?żęu³ū-+ŗ«ĻŻ8ō×.\»š ™\Ž»‚ūcüÄéųń‡ĻķR×}B@ćÕß}ż1`ōŲūqWŸ»q8a_®ĀśP‹ĀLgM~¦Ž/–ō ˆÄC{±ńŚeČårtźÜ#Ę×+b,ę7jģd¤&_Ąę?B&—#4ģÜ=`öķł½ÖõYŪ:3—5~kö}beP^y{'Ÿ;pOū`ģø“Å(š}_#ź'ŖœŸ°|%Zh‹!@‡nļ½‰ä„Ÿ"cūnų‚/ĢĮń¹ÆĄY[Œ„å+1į­§}¹d„śG„3͐=0 b÷:ŗDT^^Ž=ī~ųś¶ÄŃ#Y}žįƒ»ø.> †„Żƒ=ń[qžÜÉ*ēäC'č¤×:A'µ¬Ó™™7±kĒęj[ŽŌä<_æ–hŻ&æo©ŪL;ė×~]éõŃ#"¬’ąjėÓÕÕ#F߇6mƒŸŸ‹ķŪ6ąFŚÕjóėvGoü¾u½TOū÷žŽį#ļĆį„}V§iźŚŚ”÷]ż°ź»ĻšŲSó*?šž‘ī{723nbėęµČĶͶźŽ•zGdŠŻČŁg’Ö(Ō|0 bĘ]f6lŲ‚ł/G挵4<ų`„ÕM’‰Ø~ 6©Éē·öō dõy†-Œ©÷õm wO<žŌĖprvFŚõ+ˆß± ¹9·°y揘2mʎŸ ČĻĖĮĻkVVJS.—£U@;Ü;ž|õŇV—„ŗóī8‰‡ö¢¼¼LŚöÄÓó”Tŗ   /œĘ_ℇhKū 4\ žXŖĻ!ĆīŹ3'°yć“m„£&įūo>©öś<<½}+p_ÄĆųmÓOšōŅŌ(MćkWŗØ0fÜżŲžūęW9¾¼¼ _|śś„ ĄŠaćšKÜ÷Vg.?Kļ—ź®Į0˜’“s ėŠ­6æĢŒø«OK:™L†>!įįįUm}Zŗ–®ŻŅ5XŹˆ7­P Üžg”…«/ne¢_ūĮōīŒw}€ņr}ø¤Å&Ļw*(€ų?悋qõ‡5č0ēq$ś% .^¬t\s„*ÕÖ=Č?~xĄ®yxß3€²)Dl,==M^^žųīūĻpęĢy|÷ŻZG‹ˆ “nˆ-›×¢¬¬G@’įuOT&ƒ³³3¾żścčwõéQc&cķ+0lÄœ9•„Ɖ Š7t †œˆ ė¾E»ĄŽŪwB×n=1÷t:ė®ĻŠ/qßĆŁYY£4M]ūš’|É—Ī™Ģ'鹟(++EŅį?1뉭>Ļ\~–Tw -YXé> æ›6®¶˜ßļ[ć>|-Ż?K×nķ½5Īˆ7ēb”Č‹1¾×żø·×düē·×0¹÷ ü|ų;Iǹ*“绪ą\Øąo9j8ŚĪ˜†S ßA—Ÿ…öF:nž¾Pę¦vō„R qjŒ±±?žŲ…āāĢ›÷Čķ®4÷ā§5päČqGˆģØ ?‰‡ö”““€žį:“Ÿ¾KI›vAųmÓOҾÄCūšųÓ/FމĄīæ!%ł '<=÷5«ņ³ę¼»Ē”æv£¢¢¼Ź>AØ@NvvļŚŠYæ`Õ>ļ¾7an޼޵«WTjubŽN§Ć§’÷ŽÉV&–äēåĀ»…Æ4>F ?äåęX¦©kļzG/@ļą~Ņ6S­7ngR£ó,ÕumėÅš>Ģ6ИĖ/'; q?#½¾£Ē]ČŹLƶ>-±tķ–®Į\~¾~-­Ŗ"jø:+{ćxńAüqb3BbĮŲw™—Žķ'*O.ŠYÕŪäłEw‡Āsūnxõŗ]^œ‹Ćs^@aJ ņĻ_BßO—B{ćrŸDŃŻ”޾TŖ”‚§P–› g//»åĮqDČÖ8ķ®Ż¼™hŻJŚÖ¶mkG‹ˆ \æ~wõégg%‚m4ŠćÅ §6..*(•.ī{72Ņõife¦’½ĻE…¾”ƒ™q€¾Å…V[…Ā żīju~՝Š:ŽŽ>8yā°™dpw÷ÄŻĀqżjjµūŗ÷FÄżāąŸ»šĒÖøJĮKõy9õŽ3..*ŌÄŁ3Ē0hš(ø»{ĀŻŻƒī…3§Z•¦¹k’hÉĀJ‹øM$^Ć]}śćśõ+VŸW}]WeéĘß÷Z“…B”€«›;śß=7o\·:?:wķĮCĒHƒ¦ZŖOK÷Ļҵ[ŗKłQćöšČYp.uAQQŽŻš/dę¦ćŪ=ŸCW¦“ēR<¼ädTčtČKNÖæ¾pÅjś?żD KF Į”Į÷"ł½„(Ė͵[šA¤›l‡-DlĢßߐvżļ’“Sk›ŁĮī›1śŽūÖī©“ĻŅ@˜–ü¹'ī2’ˆœ gg%Ņ®_Įļ[õƒ]nݼC‡“Z[¤]æ‚mæż Ųæć'N‡\.ǟvZ]Kēś1>ž¹«ŹĢ b::…łHI>‡m[ÖU»oŌŲÉō³š#żé’½c±>wļü C‡CäcQpQ©+]ƒ„ė;’x^^ŽųGä\Ą¹³'pōȟզi錫#—+šÄœłŅ ŖÖŖM~–®įıC~/üüPR¢ÅåŌ‹•ŹSݽ­(/GVV:ā·o–Ęy±\Ÿęļ_mÆĮ\~÷ ]£{BD O@€3ę |Ÿģł/ ˵ų÷ś”Ų`Ģ Ø0gšĖp6y~«6ĪhóŸ…øŗąM8߬<WńĶ(sU£ķ{o”UgPćS|å*’ß_Šä÷—¢ÕCSŃćKlž‡{ÆG„lFVĖsdē:,J.TŌ\øŻ^_« ŽwŃétó­É|õźÕxpśG×[%†ƒŖŽø‘Ž ö}įķķ…O?[ŒćĒOįŻw–¢¤¤égąėŪĀŃÅ%j”ĪŸĖF—®Žµ:÷‹Ļ×ćÉ'Ÿ`]pƒˆģ£¦SH‘ż]ŗt :zŌų¼““2|»ł+œŹ>‚Ć*ōšīƒGĘĶ6 1tćZ)|ŗNū’‚¢°n®(Ųę<…Vm,;ōćźķ˜2e €Ŗć™ĻČŌ¶å-FŌĖ PVV ”B€ T@脿×”āö>żŗN§Ć«V!ź•7lR÷eū oüä*Ū}roŚ$}HVy"Yeæ.,Õé³ńG›wsÉŲ“Ē’ĮD¦hʋѷ ĆféeyUķźź¹i=œÕżžŹd²ÅJn/āzŃķõŚŪÆÅuńøRč'’@? žøX-Dl¬U+¬ŒżÆ.x>ņO<üšTDDŒĆ?Ę”““f}艈ˆˆˆ¢€gĢģ©ZŸßŖ“ß~Ą³Ž¾”ĒŌChmÉūøWpü”Ķ"š{ŲeƜ'•Mß?Ķ"6 čŅ+½~č”)xč”)•¶­Zż¹£‹IDDDDDTo²÷@»9Ł4Mg//ø÷쁂§}yŌ0 Rœœ\,‹1ĢxįŧįéYóf†Däl²ODDD "°Ō ^¶kmd2ų;š<=ķ’n·/ ōÄI^YĆ„ÖÕØĒH)Ū9śmŠ‘jh4^Xmß/*"²æK—.9ŗDDDDy»¶p]š’]ópuōEډ×ų1Ąų1Ž.5 ˆQ“÷ē“ėž5)rG€ˆˆˆˆˆˆˆØ¾1 BDDDDDDDĶ"DDDDDDŌ¬ģŚµ 2™¬Ź²k×.GźĒ!"""""j6lŲ€¤¤$ÄĒĒ#??‰‰‰•ö‡‡‡C£Ń 88&L@HHˆ£‹Ü¬%&&¢  ńńńŅ6ĆuCā}’:“ÖłīŚµ 999HJJ²˜Æa~ĮĮĮhß¾½£«¬Ž1 BDDDDDŌ@„¦¦"&&±±±ČÉɱx¬ųЇččh„‡‡cēĪŽ¾„fk޼yf ¦ÄÅÅUzŽČČHDDDĄĖĖĖŖ4vķŚ…ššp«Ž5.[HHž}öY̜9ӁµVæŲe†ˆˆˆˆˆØZ“h‚ƒƒSm0Ĕąą`G_ÕA||<"##„eĖ–Ł=æÄÄDDFFbŲ°aČĶĶuōå׋FŁBäĒÕŪ]"r€Ć‡]""""ūĖĶĶň#Ŗt‰©)k[ PƖ““ƒØØ(ÄÅÅ!..ĪźÖ"µąą`$%%Ł=/Gk”‘įƇ;ŗDDDDDä;vģptģŹš`ˆ8īƒqĄ#>>IIIRk’I“&9śrȈF£Axxx•Ö;)))HII±ŲÅ&>>#FŒĄĻ?’\ćń>"##Y%½7š|Æ„¤¤ ** +W®tt•ŁU£ ˆ55ÕCĀĆĆe6бpįBś®{÷īuōå ĮĮĮXæ~½Łż¹¹¹Ņ0)))Uö'&&āžūļĒöķŪkŌz#22²Ź@­C‡ÅĀ… ±aĆDFFVé–‹ččč&=Ų*Ē!"""""j¢££MC4 bcc±sēN«Z}„„„ąłēŸwōåP-xyyaęĢ™HNNFtt“ÉcĶī«I“&™MÆ&ƒĀ6F ˆ9Ų®]»crßüѬfž ½… "66Ö侘˜¤¦¦Ś,/ćī4"S­Tšv™!"""""r0sæŠĒÄÄ $$Ä®y§¦¦")) IIIҶąą`7šī©©©UĘą BPPP•®"5M7>>^ „‡‡×)½šš9s¦4˜Ŗ±ččh›ńŃŌO5‡""""""ŗ…‡‡Ū­ėKnn.bccc±@PP"##UķC³L&«²-::ZŪÄÖē‰×šķ·ßV;#ODD„ű;Œķڵ ŃŃŃ&ļ‹F£ATTTµå³•ŲŲXh4š*Ūćāāl1׌¤©ĻTÄ.3DDDDDDdź×Ą|7†ŗŚµk‚ƒƒUm—ˆ””DGG#88øĪÓŪ҆ „ØØ(«ŹeŲś„:_ż5ĀĆĆĶŽŸ‘““ƒččh 6¬^®ÕĖĖĖä{!''»vķ²I¦ŗkÕµuMcĄ€‘™ ˆŲcÜńaæ¦cC¤¤¤ 446lp@ UöĀ / ""¢Ź¬(–XŪŅ!66Öź@T||<^xį…z¹fså·Å §‹-217¦MSĀ.3DDDDDDd®»Œ­ķڵĖģĆ~PP""" Ńh““ƒŲŲX“‡ČČHüńĒv×ĜeĖ–Y|PĒ €üü|©õHM"5ƒØØ(»µŅ³gO“Ū­ l·ÉÉÉA||<āāāL¦kՌF[ˆ9ˆN§C\\¶lŁ"-;wīDzzŗMŅ/..Ę/æüR/×Ė—/WŚvåŹ›5ē®Ļė©I6lĄ‘#G*mÓétuś}÷īŻU¶5„ś„ŹrssMn¶y^ę‚!111HNNĘŅ„K±pįB,]ŗŁŁŁf»iĢ›7Ļ!uµk×.DEE™Ü„„$''cēĪŲ¹s'¤ļٚ˜¢££‘’’N'ˆLć!֟½™ @Y‰ŠŠBxxø“DDD˜?&((ńńńĶfV#Dˆˆˆˆl芔;v,ʎ‹ž={āŠ”C())©sŗ*• 'N¬—khŻŗ5nÜøQiŪ7`³<źóz¬%—Ė‘••…[·nŁ$½ņņrWŁŽ\ė·907¶…¹‡ļŚśśėÆM><ĒÄĘøuåŹ•ˆˆˆØ²=>>ަĮ8k™›‰'66ėׯ74˜4iRZpÄĘĘbįĀ…Ņ9^^^˜9s&žųć“Ē›ėņŌŲ!66¶Ébˆ]fˆˆˆˆ???øŗŗāÖ­[P«Õ8rä<==QTT„Įƒ#33§N‚N§ƒL&C=ąėė‹ķŪ·£wļŽšóóCff&Ž=ŠAƒaŪ¶møļ¾ūééé8}ś4}+†;īø­ZµBnn.žśė/Œ=Z*ǦM›0lŲ0øŗŗāĢ™3HKKƒL&ƒ hٲ%zōčQifˆ€€œ?^*—N§Czz:ŗwļfĖ““SåĶåWRRbÕõb’žżčŌ©®\¹‚’’“o߯ŗu³łż½zõĀŃ£Gnr¶ s×~āÄ ‚€Ž½{#)) ĪĪĪČÉÉAqq1>Œ¾}ū6ūś%Ūłæ’ūæ*Ū‚‚‚ŖÅ&&&Ęä}?8'&&šģZiÓÖ –Ņ ADDD•śØéx, UJJ ĀĆĆ‚åĖ—;¬[T}b """¢FČårČårĄ×׃Fii):„ąą` :ĮĮĮ8tčŹĖĖįėė+µRČŹŹ‚ææ„4KJJpčŠ!ōķŪC‡EXXM¶F0tėÖ-\æ~½RSk™L†¢¢¢JĒyxx@„R!++K:O„RĮŻŻŻb¹ÆŃŚü,]L&ƒV«…\.ĒŠ”C1xš`œ={„„„v¹_žžžpssCrrr•}–®½sēĪø~ż:Š‹‹‘––†Ī;£WÆ^P©T•‚!ͽ~©īRSSMĪÄb®ū‰”öķŪ›l%Rß­"~żõW“Ū͵©-S×jĶ~GĶĄcmK¢JŸ{KĮŽÄÄD„††ā믿vČ5Õ'DˆˆˆˆApłņe”••ĮĒĒGŚ@’‹½——<==žžžššš@ff&üüü @’°ģēēW)파 h4xxxÜÜÜ Ńh™™i±LJ„ÅÅÅHIIAQQär9zōč77·*ĒąęĶ›ōŻ9Ś“iSm¹ÆŃŚüŖ»N'5wW«Õpqq©6ųS½zõ¹sēŖtu²tķ*• mŚ“Į_ż…ĄĄ@øøøXĢ£9×oSęīīnr{MfP©Ž¹ ֎Sb긜œ³ćŸŲƒ¹gm=˜iuqĄVcv½~s]”¬½‡~ų”4¶Šµć«DFF6Ø©–ķ]fˆˆˆˆlج¬ ĪĪĪ5:Gü®\.‡§§'''żӜ„n%%%ČĪĪĘĪ;+/|}}qōčQčt:dgg#,, åååŅ1%%%P*••ĪS*•())‘zMqwwĒ AƒpéŅ%œ?€žć®]»Vé€Ć‡ćĪ;ļč7Zm¹ÆŃR~†,]899U*ŸŲĶÄ^Ōj5:vģˆ'NTjŻQݵ·nŻ/^DÆ^½ŖĶ£)Õom>'M•¹_źĶ-Rę¦fµ¶Ė‹¹ꤤ¤zė6c*Øc™x*sA-skMš4 “&MĀ¢E‹L¶¶™7o^•ļ–¦„""""9sę kü 7tčPØÕźjS©TšööĘĄĶīæqć<<<ąääT) āāāR„õBII \\\Ŗ<ĢźtŗJēzyy”OŸ>€ĀĀB$$$ĄÕÕķŚµ«”ž··7ŹĖĖ‘••AąååUm¹óņņŖl3—Ÿa«K×ć(;wĘĪ;„n-Öܳääd“nŻÉÉÉhŃ¢…Åō›Rż–••įāŋøćŽ;ģq+*æÄĒĒĒ#77WŗĻĶ]S§£¶ĢuQ²UPhįĀ…ˆÆ<‹GjjŖŻ§vv™!"""²+W®ąĢ™3Ų¶māāā*-'Nœ°I~~~ČÉɑrKJJ/Żąēē‡K—.Ué.#īĖĶĶE~~> ??yyyšóóƒJ„Bii©ŌåĮšĮ#-- gĻž•^»¹¹A„R™m €3gĪTšż¤ŗr²6?K×ć(r¹½{÷ʱcĒ —Ė«½öüü|dgg#$$(((€\.GEE…Ł<cżž8q¢ŹgbŪ¶m8sę ®\¹ā°ūՐ˜k!ŌTf/”ŗÉĶĶ5ł^ ²i Āܘ2ęZ5l!BDDDdķŚµCQQڵkWWW»ä”T*ŃÆ_?9r:‚  K—.R×???\øpAšyЋ‹ ĀĀĀpųšai[hhØō‹×®]±{÷nøøø uėÖP«ÕŠétšóóCZZvģŲ…B!m3n"jŻŗ5öīŻ[© –Źm<ī„„ü [,XŗćBė“ŸŸ<<<¤@‚„k?vģ:tč…BöķŪćģŁ³čÓ§”J%vļŽ!C†4‰śķٳ'zöģYi[QQ®\¹bö}ŌÜDDD 66¶Źöččh›Ģ b®[Ebb¢U3‰˜ė¾cķų¶T„•ˆ-»5d111&·GFFŚ4sć§4åÖ9 ˆŁH·nŻ*u5©ŽL&³8£§§'ʎ[i›ÆÆÆŁ>ū-[¶¬”žJ„’¦Pō³”Ļ>cXvĆiS»té"­Ļxb‰ÆÆÆÉk2Wnćktrr2›Ÿµ×ćźźŠńćĒWŚf8„°-Mš4©Ź¶°°0«®]@„Lj#š|ż*•JNÓk`ҤI&ųSRR°hŃ",\ø°Né¤D'NœØu@$((ČŖī<¶z˜6U?Ķ”[Qbb¢Ł™t¬™%Ø&l9ocĮ.3DDDD6$†JDęńsR•¹_ū£££ė<żiHHˆÉ_’MµJ1f®»†©±+LWŖėn±aĆ«®ĮT 0''Ēl뉦 11#GŽ4¹/::Śę {SŅ1 BDDDDDä` .4ŪZ#22/¼šB¦¹5Pˆ7;«(::ŚdĖSS] RRRĢꑛ›ku+s­é¢££›äŌ°Ė–-Ćȑ#MÖ}HHˆĶ[‡ģڵĖd€L£ŃŌŪLBŽĄ€‘Ćn#DõiłņåfĒqˆ‰‰APP^xį‹€ÄÄD|żõ×xį…*m7×ķ"""Ālz_żµÉįįį&’͵$0•Gjj*FŒau—šöķŪ›mEŠE‹™ åęęÖ)˜T_±hŃ"tčŠQQQ&ƒ!Ė—/·YėÜÜ\,Z“Čģ½³uą„”a[5"""""¢ $$111füÅ."bĀš!6??æJŠaéŅ„Ņzūöķ]%0’““ƒŠŠPDFFJłŠł˜źī¢Ńh°xńb“勈ˆ0ł-ę" :\›VŃŃш‹‹3(ˆŽŽFLL ĀĆĆ„Į^SRRpüųqiŽŗŽÅb ńńń6lX„mÖÖGPPÖ®]kÕø/Ębcc+ŻĻœœ$%%YģŅd–( "DDDDDD ÄĢ™3„ˆˆˆj¹¬n|Ž]»vUjɱpįB¤¤¤˜ģk՘"111fČŪ·oØØ(³ćz˜{č7Ø1—~\\œŁÖ 999ŅŌĪĘҌ4µ™ĘVœ‰Ø¶-C¬¹·†BBB°}ūö&=`-Ą.3DDDDDD ŹŠ”C‘’’RēiUMV®\Y«t5 āāāŖ8::ŗF-bcck4hēŠ”C‘`v*įšŌEcųųx¬_澎‚ŃŃŃĶ"0 BDDDDDŌąxyyaåŹ•HHH@dd¤Ł±EĢ ‘ŗŽ[¹r%āćć­ Dh4DEE!%%Åä4Ӧʽ}ūöjƒ.!!!HHHØ6Ąbīܤ¤$DGG[]/>>>5ĪĒ4 """ƒ””¬_æ¾^5 GLL rrr°pįĀf Y-Ļ‘œėd°(øPPpąv{]|­28F<ŽE§ÓĶ·&óÕ«WcųšįŽ®7"""""r€;v`Ź”)NWiŸńksŪ–“Q//@YY)„ ‚PA ž^„ŠŪūōė:?®Z…ØWŽpŲµļŚµ IIIČÉÉ©ŅķB nˆchXū@›˜˜ˆ½{÷"))©Ņ§b:įįįµ~8NMM­2vExxx•AYsss«“ąpww·ŗ„É®]»””邃ƒ”ŃhŒąą`“oß¾Ņ9¦ņϳt½5=Ļp†ńŽĖhMŽq ’;MīNLLDAAŁ<ÅūčĒ%1®›ś “Éb(¹½ˆėE·× hoæ×ÅćJ”, 3X¬/GmŹDˆˆˆˆˆČšs@„ »ż(®«Ń³ƒŅP"ģ2CDDDDDDDĶN£œefĒŽŽ.5b. 2}śtGˆˆˆˆˆ Ō¶ėJ]Ļ%"Ŗ v™!""""""²µaƀ^rr€Y³ooĄh0\@JŹßūe2 C 6¶vyŠi…†źÓ’ɀɓÄDÓĒϚ„/§©rMž¬ßgbPÖ¦¢Ńµ!""""""jšÄ ĆäÉśõšpĄĆ£ņ1))@Ÿ>śõČH@£Ń;kpō(°tiĶņ\¶L~D0q¢>żŲXż¶?žŒgī™9SōHIŽŃē‹qq@tōßۚ Dˆˆˆˆˆˆˆģ!)IPHN‚‚ŖīŸ5K’×0X±p”>H<’¼éóĢYø°jå®»ō-U>žX¹²ņ¾šp}Š#:ZYŗTߚ$:Z_ž… ]ƒvÅ.3DDDDDDDö“£2˜ j¤¤č[nDFVm¹ńüóśæ_]³üLµęˆŠŅ’‹3}ĪĀ…śücbōĮyóōé,_īčŚ³;¶!""""""²—ˆÓŪÅ.599śÖ†RRž>¦6­4āāō]n DZ4ČņåśqGFŽü;ˆc¤i‚!""""""Ŗo©©śæµ@ՔÄD`źT}@%<\æ¦M5¢o©«oĶ"¶*iā!""""""r”;’\ŌEN޾…$$TnįmłÜÄD}0D£ŃS-jņć‡C„ˆˆˆˆˆˆØž Ŗ’»aƒmŅ‹ÕE¢¢jŽŻå©§ōĮ?žŠ·‰Ž6?UoĀ€Q} ×!Ä@F]åęź’§cł¼E‹ōĮ1"ĪRóŌSŽ®!»c@„ˆˆˆˆˆˆČ–.Õ0:tŠ.āćõKl¬~ŖÜš˜9S’76VæÄĒėƒ‹™ž}0=ÅnD„~IL¬:Ųkƀ‘#DFė×ė/¼ ¦_fĶöģ©YZAAĄŹ•śõY³ōéÄĘźÓÖo7l=’“£€Ø:ÅīŹ•ś25ń®3T•ˆˆˆˆˆˆČÖt:ėŽ3l‘‘ŸÆßfiUKéFFź—ųxĄĆćļ±DL„§ŃÉɦÓŃh€ģl‡U]}a@„ˆˆˆˆˆˆČŃj:Ŗ%¶˜µ¦`—"""""""jv!""""""¢f‡"""""""jv!""""""¢f‡"""""""jv!""""""¢f‡"""""""jv!""""""¢f‡"""""""jv!""""""¢f‡"""""""jv!""""""¢f‡"""""""jv!""""""¢f‡"""""""jv!""""""¢f‡"""""""jv!""""""¢f‡"""""""jv!""""""¢f‡"""""""jv!""""""¢f‡"""""""jvœ]"""""¢ęjõźÕČĖĖ3¹ĻÓÓÓ§O·Y^Ÿž9T*}ōQG_6QƒĄ€‘ƒtėÖ Z­pźŌ)‚€īŻ»C”P@­V;ŗxDM"DDDDDDҧOiżÜ¹s(--EXXT*•£‹FŌä1 BDDDDDŌ€•””ąšįĆHMMEQQ\]]ѦM„††J­H¬9ĘŲ•+W˜˜ˆģģlčt:“hŃ”””hŪ¶­£/™Ø^pPU"""""¢JlÜøĒGėÖ­1dČāōéÓųķ·ß ‚UĒ+--ÅÖ­[QQQššp„‡‡C§Óa×®](--uōeÕ ¶!"""""j ®]»†[·nĮßßC† tīÜYYYHKKƍ7PQQQķ1­[·®”nyy9t:“Z-ņóóįļļ‰'ĀɉˆŌ|šŻNDDDDDŌ@4M„ķ^^^HKKC^^t:]µĒD\]]1lŲ0>|žł'@”P [·n8p ärv& ¦"""""¢ŹŻŻ““Si{vv6ĄĶĶMŚfĶ1†:wīŒĪ;£øø8zō(N:…Ö­[£cĒŽŽ¾t"»c@„ˆˆˆˆˆØjÓ¦ Z“hōōtģŁ³ø~ż:n޼‰-Z M›6`Õ1†ŅŅŅšĒ ]»v(•JśÖ#DĶ"DDDDDD ”\.Ēĉ‘˜˜ˆĖ—/ćܹspssCÆ^½Š·o_©k‹5Ē Ą]wŻ…3gĪą?ž ļbŽV­Z9ś²‰ź"DDDDDD @dd¤Éķ...8p hö\kŽyņÉ'+½īŻ»7z÷īķčĖ&rŽ”CDDDDDDDĶ"DDDDDDDŌģ0 BDDDDDDDĶ"DDDDDDDŌģ0 BDDDDDDDĶ"DDDDDDDŌģ0 BDDDDDŌÄģßæ?ž8Œššp<żōÓ8xš ]óĢŹŹBhh(ŠŠŠ}łDVa@„ˆˆˆˆˆØ ٲe ,X€É“'cŪ¶mŲ²e &NœˆyóęaĒŽvĖ×ŪŪ[·n…Z­vtYÅÉŃ """"""Ū(++ƒ%KšōÓOcüųńŅöńćĒ#''|šĀĆĆ!—Ūž·q¹\GW‘ÕŲB„ˆˆˆˆˆØ‰8qā²³³1yņä*ū&OžŒ¬¬,œ8q÷ß?¶lŁŲ¶mxą@BByäÜ’żxōŃG‘””8uźʍ‡„K—böģŁ&Ļ7ī2c.­ńćĒćųń〣G"44ĒŽœ(ńÓO?į駟xyyańāÅXŗt)ņóóįä䄣³gĆĖĖ ™™™Uņ1>ߐ„“ż˜"ėÖ­ĆóĻ?@łüóĻńČ#8ŗśØ‘Õņ™Į¹N‹€ 5Wn·×Å×*ƒcÄć]t:Ż|GW՜N§³ųŚÜ6G»ü£ÅˆzyŹŹJ!T„ ‚š÷ŗ TÜŽ§_×étųqÕ*D½ņ†ƒk›Øń“Éd1Š”Ü^Äõ¢Ūė“·_‹ėāq„Ź Š,Vc—"""""""jv!""""""¢f‡"""""""jv!""""""¢f‡"""""""jv!""""""¢f‡"""""""jv!""""""¢f‡"""""¢&&>>>ś( „ššp<łä“Ų»woÓ}÷Żw1zōhddd 44EEE¹¾¬¬,‡ęOM"DDDDDDMČÖ­[±pįB̜9ńńńŲ¼y3¦L™‚’üē?HNN®uŗ‚ `Ɔ ųģ³Ļąć惭[·B­V×Ūu½óĪ;HLLx{{×{žŌō89ŗDDDDDDdX²d ęĢ™ƒ#Fœ1vģXŒ;¶Ni—”” ¢¢^^^Ėåšńń©×k»xń¢“īˆü©éa """""¢&āōéÓČŹŹĀ„ ,wąĄ̘1S¦LĮōéÓ±{÷nĄåĖ—1lŲ0lŚ“ <šF…Ļ?’šź«Æž|ņÉ*]fVÆ^ &ą”‡Ā/æü‚”C‡āŅ„K8wī(å[QQŠŠP\æ~§NĀøqć°téRĢž=°mŪ6L:'NÄōéÓqųšaĄāŋqņäI,Z“ƽöZ•.3µ¹"¶!"""""j"nÜøOOOø»»›=ęÖ­[˜?>–-[†¾}ūāŲ±c˜3g6lŲ'''āęĶ›ų駟pźŌ)DFFbśōéx÷Żw1dȐ*…k×®aéŅ„ųžūļѹsg,[¶ Z­r¹åßߕJ%ņņņ Ńh¤sŽ{ļ=|ōŃGčŁ³'Ö¬Yƒ·Žz qqq˜7o¶mŪ†… "$$YYYu¾OOOGß.r0¶!"""""j" A°xĢ”C‡ŠŖU+ōķŪŠ»wo“iÓ ōc…L™2Š£GČår¤§§›M/)) :uBēĪ=ōPµe™L†āāb<šĄššš€Z­ĘŽ;гgO@XX®^½Zļ×CĶ[ˆ5­[·FAAnŻŗ…-Z˜<&++ ŽŽŽ•¶i4ÜŗuKzķįį!­Ėår‹A‰œœh4éµÆÆÆÕåuvv–Z³‚€O?ż{öģR©Dii)@§ÓYLĆÖ×CĶ[ˆ5]»v…ææ?~śé'³Ēųųų ;;»Ņ¶ģģģ2 yxx   @z––&­ņņņ*+“ɤõ;v`Ó¦Mųģ³ĻšĶ7ßą­·Ž²*[_5 ˆ52™ /¾ų"¾žśk¬_æZ­™™™Ų¶m"""pźŌ)ōė×7oŽDRRąČ‘#øyó&ĀĀĀj•gĻž=qīÜ9\¹r°aĆ)ŠįēēApöģYĄŗuėĢŽ-’——xzz¢øø«WÆiąTgggäęęV9ĻÖ×CĶ»Ģ5!#GŽ„Z­ĘŠ+šį‡ĀÉÉ wÜqęĶ›‡=zŽ’}|šĮ(..†Z­Ę|ooohµŚē×±cGĢž=O<ńüüüšČ#@&“A&“ĮĖĖ ?ž8ž}öYxyy!22*•Źd—•Q£FaĖ–-˜0aZµj…łóēćāŋ˜3g¾ūī;Lœ8‹-Ā?ü€÷ß_:ĻŪŪŪ¦×C͇¬–ēČ Īu2X”\ØØøp»½.¾V#ļ¢Óéę;ŗ2ˆˆˆˆˆØęŒĒx05惹q qīņ#źå(++…P!@* tĀßė‚Pq{Ÿ~]§ÓįĒU«õŹ®ķ†ÆØØC† Įļæ’^el"Éd1Š”Ü^Äõ¢Ūė“·_‹ėāq„Ź Š,Vc—""""""Ŗ5­V‹Ł³gćܹs€7"00ĮjšŲe†ˆˆˆˆˆˆjM­VcҤIxłå—QQQ¼ūī»Ž.QSŖ” LóIDATµ!"""""¢:™4i&MšäčbÕ»ĢQ³Ć€5; ˆQ³Ć€5; ˆQ³ĆYfˆˆˆˆˆˆš~żśA”P@&“T*BCC1ž|ųśśÖ:ݬ¬,Œ3»wļ†V«•Ö]]]}ÉDµĀ"DDDDDDM̧Ÿ~Šżū÷c’žżˆ‹‹ƒ ˆŽŽ¶YśŽŽŽŲŗu+ŌjuŅyēw˜˜čąŚ¢ęŠ"""""¢&ĢÓÓ³gĻĘ”C‡PVVf“4år9|||¤V(µuńāEGW5c ˆ5qb D.×?&$$ą‘GĮż÷ߏG}III€K—.!<<«V­Ā”)Spļ½÷āū￯’^VVBCCQTTøpįž~śiŒ?'NÄ’ž÷?‚Ų¶m¦NŠ‰'bśōé8|ų0`ńāÅ8yņ$-Z„×^{ pąĄ̘1S¦LĮōéÓ±{÷nĄ©S§0nÜ8,]ŗ³gĻvtuRĮ1DˆˆˆˆˆØY;ü×>³ūŗÜq§£‹Wg™™™X¾|9† …Bœœ¼ōŅKųļ’‹~żśįąĮƒxé„—šėÆæB.—£°°„„„X·nĪž=‹GyC† 1;VHII ž{ī9<÷Üs;v,ņóóńŌSO”mŪ¶5jŽ{ļ=|ōŃGčŁ³'Ö¬Yƒ·Žz qqq˜7o¶mŪ†… "$$·nŻĀüłó±lŁ2ōķŪĒŽÜ9s°aĆ(•JäååA£Ń`ٲeŽ®Rj"!""""¢fmЈńf÷„_Kqtńjå™gž\.‡ ())Į}÷݇_|pšąA“lŁżśõ „ÕŪŪ h×®t:&MščÖ­:v숣GbĄ€&óJJJ‚ ;v,ĄĆĆ?üšƒ“ĒŽŅzXX>ųą‚ µV:t­ZµBß¾}½{÷F›6m€.]ŗ øø<šÜŻŻ]½ŌD0 BDDDDD͚¶ ‚ @'„ āß ĮŃE«µO>łĮĮĮ(++ĆŌ©SŃ«W/)••…«WÆbāĉ•Ī),,”Ö½¼¼¤uOOOäåå™Ķ+##Ęä>Ašé§ŸbĻž=P*•(--čtŗ*ĒfeeĮŪŪ»Ņ6Fƒ[·nœ !›b@„ˆˆˆˆˆšµ¦ÜeĘŁŁĻ<ó /^ŒQ£FĮŻŻ>>> ŖŌŠC”’’ČĖĖ“‚"bWs|}}‘™™ NWeÕ;v`Ó¦MųᇠŃhpīÜ9̘1Ćd:>>>ČĪĪ®“-;;[š*ø®øć ŖDDDDDŌ¬ 1ŽģŅŒ5 ­ZµĀ_|čßæ?®_æ. nzķŚ5<šĄČĶĶ <üņĖ/ō³Ą$''#88Ųlś}śōR©Äš5k ÓéPPP€Y³fįĒD^^<<<ąéé‰āāb¬^½¤ĮX„|ūõ뇛7oJ¼9r7oŽDXX˜£«š(¶!""""¢f­)v™1$“É…žóŸ˜2e Ś·oÅ‹céŅ„ČĻχ““fĻž ///dggC”P@&“aŚ“i(,,ċ/¾ˆÖ­[#++Ėdś...ˆ‰‰ĮāŋńÕW_A”P`äȑ˜:u*ŠŠŠ°eĖL˜0­ZµĀüłóqńāEĢ™3ß}÷&NœˆE‹į‡~Ą—_~‰÷ß|šŠ‹‹”V«ńĮĄŪŪ[ź6CdKµis$3X}PE\”\ØØøp»½.¾V#ļ¢Óéę;ŗ2ˆˆˆˆˆØęŒĒƒ05>„©mŽ:włG‹õņ”••Bؐp`·ŁkėrĒ„ čt:üøj¢^y£¾ŖÕ!RRRšąƒ⯿žrtQØ “Éd1Š”Ü^Äõ¢Ūė“·_‹ėāq„Ź Š,Vc """""j֚ā,3ua.EŌŌ0 BDDDDDĶZSļ2CD¦qPU""""""įąĮƒŽ.Q½`@„ˆˆˆˆˆˆˆšDˆˆˆˆˆˆˆØŁa@„ˆˆˆˆˆˆˆšDˆˆˆˆˆˆˆØŁa@„ˆˆˆˆˆˆˆšN»KDDDDDŌ„ā³Ļ>Ć®]»PTT™L†:ąńĒGæ~ż]<¢ƒ-Dˆˆˆˆˆˆšwß}7oŽÄ7ß|ƒ?žų[¶lĮŌ©S‡ņņrĄ;#ÄÄD«Ņ«É±D [ˆ5! ˆŽŽ†F£( Œ=£G–޹xń¢ÕéÕäX¢Ę„-Dˆˆˆˆˆˆš:`ÕŖUHOO7¹ńāÅ8yņ$-Z„×^{ °mŪ6L:'NÄōéÓqųša“Ēž;w”ŅŖØØ@hh(®_æųüóĻ1eŹLž<ųüóĻ”Óé]%D&1 BDDDDDŌ„¼žśė(((Ąųńć1cĘ ,Y²G•öĻ›7^^^Xøp!Ž}÷]hµZ¼÷Ž{ˆŽŽĘʍ1eʼõÖ[&µäųńćXæ~=¾ūī;¬_æß|ó .\ø€Ė—/;ŗJˆLb@„ˆˆˆˆˆØ iŪ¶-¾śź+¬Y³øzõ*ž~śi,X°Ądk µZ;v gĻž€°°0\½z‚ Ō(_"..W®\§§'>ųą“oߎŃUBdĒ!"""""j‚:tč€:`Ś“iøtézč!$$$ ,,¬Ņq‚ ąÓO?Ş={ T*QZZ 5īź„åĖ—c͚5ųžūļ“'OĘģŁ³!—ó·xjx!"""""jā:vģoooäęęVŁ·cĒlŚ“ ?üš4 Ī;‡3f˜LG.—Wj9’——Wi÷īŻ±pįBĄ„K—0oŽ<“jÕ &LptUĮ0QqłņeŒ=Ū·oGqq1   _|ńJKK pvv–‚#yyyššš€§§'Š‹‹±zõj@QQQ•cżüü Īž= X·nŌścóęĶxżõ×QRR@ßuG£ŃpPUj°!"""""j"Ÿž&LĄ!C0mŚ4$''cŊŅT¼'NÄ¢E‹šųćcŌØQšņņĀ„ šĻžÓ¦MƝwމ9sęT9ÖĖĖ ?ž8ž}öY<šĄhÕŖT*AĄšįĆįźźŠ©S§ā¾ūīƃ>ˆąą`Œ?ŽŃÕBd’¬–ēČ Īu2X”\ØØøp»½.¾V#ļ¢Óéę;ŗ2ˆˆˆˆˆØęŒ[˜j`®•€#Ī]žŃbD½¼ee„*BA€Nų{]*nļÓÆėt:üøj¢^yĆĮµMŌųÉd²ÅJn/āzŃķõŚŪÆÅuńøRå č «±…5; ˆQ³Ć€5; ˆQ³Ć€5; ˆQ³Ć€5; ˆQ³Ć€5; ˆQ³Ć€5; ˆQ³Ć€5; ˆŃ’·wēŃQՇ’’_3Ł÷ B˜°H@–°C@Y­Ų£‚ŠŠ"żˆŸZ«(„j„J=ż|»xģĒśćSµżØˆKżX«X“ "*² Č–HXCȞL–IęŽßÉ “!Ė$ÉóqĪ=sļū~ß÷}“ć9óņż~_:Šįˆ€‡@t8" Ć ōw £ŖŖŖŅ[o½å>¶X, S×®]5|ųpÅĒĒū»‰ß;K–,QhhØęĢ™ćļ¦ą2Ēš3«ÕŖAƒ©’žŠŒŒTff¦V¬X”S§Nł»i—ĢéÓ§µdÉUTT\P™±cĒjōčŃž~|0Bü,00Pcƌqļßæ_›7oÖW_}„»īŗKžnāEwāĉv)3pą@? ¾'Dą23hŠ 8p@ÅÅÅŹĖĖ“ĶfSuuµvīÜ©'NØ¢¢BįįįJNNVZZšĀĀĀ$Iv»]ß|órrräp8Ō„K]wŻuŠ‹‹SEE…Ž~ūmÅÅÅięĢ™ī{½ńĘ2MS?ūŁĻÜ×Ųl6„¤¤hūöķ ŅĉUQQ”-[¶H’®»ī:õéÓG’äp8“{÷n?~\ååå S÷īŻ5jŌ(…„„Č4M½śź«ŠÕųńćµiÓ&•””(66V×_½µråJåääH’Ž~ūm„„„iĈŹĪĪ֎;TPP ‹Å¢ÄÄD3F±±±M–ńž2ÓRæłŅ>\™˜2—”„„IRii© ĆŠŹ•+µoß>Łl6?^=zōŠĮƒõÉ'ŸČ0 †”Õ«W+33SżśõÓ5×\£¼¼<­^½ZÕÕÕ>ŻÓ5„øøXYYYźŽ½»ŹĖ˵qćF>|X½{÷Vee„6nÜ(Ć0dš¦>žųcķŁ³G}ūöÕĶ7߬#F(33SkÖ¬‘T·.ŠÕjUee„¶nŻŖ^½zÉf³)??_ėׯ—$=ZQQQ’¤I“&©OŸ>Ŗ®®Öš5kTXX؉'jäČ‘ŹŹŹŅŗuėš,ćĶ—~ó„}ø21B.C¦iJŖ )NŸ>­ĀĀB%&&jüųń’¤>}śØ  @999ŹĶĶ•a***R·nŻ”––&©.L9xš ²²²Ōµk×ļi±X$Սś˜vµßjµ*<<\ÕÕÕŖ­­m4p0 C[·nÕ±cĒTQQįˆ\żć‹ņņņūĶf³µ©}ųž#€ĖĢžżūUZZŖččh%&&ŗ§¼7ø®ØØH’į>WVVęŽß½{·vīܩѣG«oß¾’ź‚Ć0dµZUTT¤ŚŚŚ6/Śźŗobb¢¦M›Ö®}žž®żū÷«wļŽ3fŒ“téRÕŌŌų\‡+ņ„ߊńˆ€ŸÕÖÖjóęĶ2MS………ŹÉÉQ`` &L˜ ©nJH||¼Īœ9£ÆæžZ]»vUvv¶ņņņÆääd™¦©˜˜>}ZŪ·oWdd¤öīŻ+«ÕŖ^½z)88XQQQ*++ÓgŸ}¦Ī;ėĉ iUČą)))I ŹĶĶÕʍÕ­[7÷"«†ačöŪoWhhØOu¹F¤ģŻ»W)))ī6Łķv?~\ĒŽs·533S}śō9ƌ÷ؾō:.š3Ć0“’~IRhhØzõź„#FøVµZ­š:uŖ¾żö[#čpD@‡C :Šįˆ€‡@® 7Üpƒf̘Ńčw³gĻÖ 7Üą—v(--MžģĄ@®0v»] Īūģ3™¦é>·vķZ?¾Įuk׮Ռ34uźT͚5K;wī”T7šdҤIZµj•fΜ©o¼QK–,‘$eddh̘1ī:œN§ŅŅŅ”ŻlĄå†@®0))) ×¾}ū$IG•ÅbQJJŠūšŹŹJ=óĢ3śżļƕ+Wjśōéść’(I ”ŻnW^^žŽ’}½šĀ zķµ×TZZŚģ}›«øÜˆĄ覛nҚ5k$ÕŚ˜2eJƒļĆĀĀ“~żz 4H’4jŌ(eeeÉ0 I’aš>}ŗ$)55UV«UgΜiöž-Õ \NżŻ@ū»é¦›tļ½÷ź±ĒÓgŸ}¦ēž{N555īļ ĆŠĖ/æ¬ÆæžZĮĮĮr8’Ō`šMTT”{ßjµ¶lųR'p¹ €+Prr²’’’“bÅ ………©GŹĢĢtæ~żz­ZµJļ¼óŽbcc•‘‘”ٳg·XÆw0ā9¦­užĄ”øBŻtÓMzķµ×Ī›.#ÕQQQŠŽŽVUU•Ž}÷]IREEE³uvīÜY†ačšįƒ¤żė_²Z­T'ą"p…ŗńĘUPP üą~£[o½U=ō~ō£iąĄzšĮ›­3&&F÷ŻwŸęĻŸÆ™3g*))I”””2 £Ķuž`ic‹GŁ@-XRˆ¤PIa’Ā%EŌļ»ŽC=®q]bšęćžī ­ē½>DcėE4µ†„?ʾņ×Ezä× USćį4dN†!Ó8·oĪśļźöMÓŌ?—-Ó#Oü—Ÿ{ųž³X,ĻKŖ’T]æ¹ö+ź÷Ė%UÖ»ö]×9$Õzl’dzl>c„čpD@‡C :Šįˆ€‡@t8" Ć!čpD@‡C :Šįˆ€‡@t8" Ć!čpD@‡čļ@GUUU„·ŽzĖ}l±X¦®]»jųšįŠw·dÉ…††jΜ9žnv»øŅžß?"ągV«U©©©r:*((Pff¦Ž?®)S¦Ø{÷ī’¤±cĒ* ĄßMm“Ó§OkÕŖUś’ų…‡‡ļŸWš³ĄĄ@3Ę}¼’~m޼Y_}õ•īŗė.hąĄžnf›8qā¼sßēēĮ•@.3ƒ ҁT\\¬¼¼<Łl¶ó¦˜dggkĒŽ*((ÅbQbb¢ĘŒ£ŲŲXIRaa”6nÜØ‚‚…††jŌØQڱc‡ŹŹŹōóŸ’\¦iźÕW_Ull¬ĘÆM›6©¤¤D±±±ŗžśė•˜˜(IŖ®®ÖĪ;uāÄ UTT(<<\ÉÉÉJKKSXX˜$éŌ©SśöŪoUTT$Ó4Æ““4uėÖM+W®TNNŽ$éķ·ßVZZšFŒqŽóŲķv}óĶ7ŹÉɑĆįP—.]tŻu×)..®Å{mĮ¢ŖpJHH$•––ž÷]uuµÖ¬Y£ĀĀBMœ8Q#GŽTVV–Ö­['Ir:śōÓO•››«~żśiäȑ:xš ģv»¬ÖŗŸ‹EV«U•••Śŗu«zõź%›Ķ¦üü|­_æ^’d†V®\©}ūöÉf³iüųńźŃ£‡<ØO>łD†aČįph͚5r:š8q¢&Nœ(Ó4õÕW_ÉįphōčъŠŠ’$Mš4I}śō9ļy ĆŠźÕ«•™™©~żśéšk®Q^^žVÆ^­źźźļ“#Dą2dš¦$5ŗĪFHHˆ~śÓŸŹ4MY,†”]»v©°°P†a(//OåååźŅ„‹{*Nrr²–.]Ś >‹Å¢źźjMœ8Q±±±2 C’ųĒ?TZZ*‡Ć”¼¼<*11QćĒ—$õéÓGŹÉÉQnn®bcceš¦*++UVV¦ÄÄDM:Uu?7»té¢ąą`w\kˆxŹĪĪVQQ‘ŗu릓“4IuAŠĮƒ•••„®]»6{ -ųė€ĖŒišŹĻĻ—$ÅÄĜ÷½aŚŗu«Ž;¦ŠŠ wxā*[QQ!IŠŽŽvŸˆˆP```ƒk„ŗõK\Ól¬V«ĀĆĆU]]­ŚŚZ•——K’ū{—˜˜åä䨓“T6›M“&MŅĪ;µuėVIu!Næ~ż4fĢ÷ˆ”ęøīé>wķµ×źŚkÆu_č=o"p™ŁææJKKķ^ĖĆSzzŗöļ߯޽{k̘1 ŠŅ„KUSS#Iīµ=<§ŪŲķvÕÖÖ¶źĶ.®€¢øøøĮł¢¢"Iu!‹T7j¤OŸ>ŖŖŖŅٳgµgĻ8p@6›M)))-ŽĒUOYY™ūÜīŻ»µsēN=Zƒ ŗą{ŽDĄĻjkkµyóf™¦©ĀĀBåää(00P&LhōzWša·Ūuüųq;vL!!!Ŗ©©Qff¦®ŗź*………)//O›7oVBB‚222Z=’"99Yńńń:s挾žśkuķŚUŁŁŁŹĖĖS||¼’““•““£uėÖ©k×®źŪ·Æ$¹§Čø¦Ēø¦¶ģŻ»W)))ē…<6›M111:}ś“¶oß®ČČHķŻ»WV«U½zõņé@kˆ€Ÿ†”żū÷K’BCCÕ«W/1½°Ŗ·*77W¹¹¹*++Ó°aĆ4dČmŲ°A;vģPÆ^½tÓM7iÓ¦M:xš "##5zōhČétśÜ.«ÕŖ©S§źŪoæÕɓ'•‘‘”ˆˆ īļĪŠzŽkRx7uĪ_e_łė"=ņė…Ŗ©qČp2 § ƐiœŪ7 gżwuū¦iźŸĖ–é‘'žĖϽŻv‡Co¾ł¦¢££5kÖ,7˜Åby^R•¤źśĶµ_Qæ_.©²žŲµļŗĪ!©Öc“$Ócó#Dą “jÕ*j芔ŠŽŽVFF†$±ŽP@®@×\s¶mŪ¦;wŹét***Jiii6l˜æ›\Dą Ō©S'Ż|óĶžnpŁāeĶ Ć!čpDą ńĄhńāō~÷ņĖ/ėhU}JKKSEE…$éOś“¦L™"Ć0ZUOZZš8pIśĄ³ĶŽķoėsćŹD WˆiÓ¦iõźÕ2M³ĮyÓ4õÉ'Ÿč¶ŪnkU}qqqZ³fĀĀĀd†>śč#-^¼XVė„’)łōÓOėŪoæ½$õ{>7®\"p…øį†T\\¬Ż»w78æk×.•””hņäÉ­ŖĻjµ*!!A‹EÕÕÕr:Š‰‰ń˳eff^²ś=ŸW.øB„††źĘoŌŖU«œ_µj•¦L™¢ŠŠPIŅŽ;t÷ŻwėĪ;ļԜ9sÜʁtóĶ7ė¹ēžÓ½÷ŽŪ`źČo~óIŅż÷߯Ÿ’üēzė­·Üć½÷ŽÓ}÷Ż×lūNž<©I“&iÕŖUš9s¦n¼ńF-Y²Äżż’%K4}śtŻqĒŗżöŪµdÉ™¦©E‹)==]ųĆōä“OJ’Ö®]«3fhźŌ©š5k–vīÜŁb’4UĘ»~ļ)3[¶lŃģŁ³5}śt͚5K6lšéypy#€+Č“iÓ“nŻ:9I’ĆįŠēŸ®iÓ¦I’Š‹‹õŲcižüłśąƒō‹_üB=ö˜*++¬ŅŅRÅĘĘź…^hPļŸžō'Iu”ŬY³“|łņk‰üūß’ÖĢ™3›m[`` ģv»ņņņōžūļė…^Škƽ¦ŅŅRķŪ·O+V¬ŠŪoæ­+Vč­·ŽŅ‘#GtņäI-X°@111śŻļ~§?żéOŖ¬¬Ō3Ļ<£ß’ž÷Z¹r„¦OŸ®?žńĶŽ»¹2Žõ{*,,Ōć?® č_’ś—ž|ņIżę7æQ~~~³ĻƒĖ\A†Ŗųųx}õÕW’¤/æüR;wÖąĮƒ%IŪ¶mS—.]4zōhIŅčŃ£§;vČb±ØŖŖJ3gĪTTTT“÷˜4i’œN§6mŚ$Iśī»ļ”——ēӔĆ04}śtIRjjŖ¬V«Īœ9£ØØ(Łķv}ųį‡:uꔢ££õģ³ĻŖgĻžēÕ¦õė×kŠ A’¤Q£F)++«ŁÅ^ŪRF’¶oß®¤¤$1B’4dČ%''kĒŽĶ>.žn }¹W½ńʵzõjM:Õż]AA²²²œ“$»Ż.I Rddd³õ[­V͘1Cļæ’¾Ę§•+Wź¶ŪnSPPOķó [¬V« ĆŠUW]„W^yEļ½÷ž–.]*IŗćŽ;tļ½÷ž·ˆ«azłå—õõ×_+88Ų=Ę{1Ł -ćźÆøøøēbccUXXŲģóąņG W˜[n¹EK–,ŃéÓ§µ}ūvżæ’÷’Üß%$$čŖ«®Ņ;ļ¼s^¹ĢĢLŸ>}ŗŽxć :uJkÖ¬Ńß’ž÷ n÷€ō»ßżN’tōčQ-X°@IIIŗõÖ[\·~żz­ZµJļ¼óŽbcc•‘‘”ٳg7[w[Źøś«ØØØĮ¹¢¢"uźŌ邟žÅ”øĀtīÜYiiiśļ’žo]sĶ5ŠwwĶ5×(;;Ū½ čéÓ§5sęL•””“ź111ŗńĘõŪßžVżū÷—Ķf» 6Æ^½ZæżķoU]]-IźÖ­›bccŻ#8‚‚‚Üm,--UTT”¢££UUU„wß}W’Ü‹ 6¦„2žõ{=z“ņņņÜ ĻīŚµKyyy5jŌÅłĒĆ%C W iÓ¦iėÖ­īÅT]bbb“hŃ"=÷ÜsŗżöŪõšĆė§?żi›^§;kÖ,„§§kƌܮɓ'+<<\3fĢŠ“iÓōć’XƆ Ó-·Ü"Iš:uŖžš‡?č¾ūīӍ7ŽØ˜˜Żzė­z蔇ō£żHԃ>Ųdż-•ń¬ßS\\œžüē?ėŁgŸÕōéÓµhŃ"=ūģ³ēM£Į÷O[^ŖlńŲ¤ŗi7®-XRˆ¤PIa’Ā%EŌļ»ŽC=®q]bšęćžī ­ē½Cck24µNƒ?ʾņ×Ezä× USćį4dN†!Ó8·oĪśļźöMÓŌ?—-Ó#Oü—Ÿ{ūņ’žž®… ź£>:o )‹åyIU’Ŗė7×~Eż~¹¤Źśc×¾ė:‡¤ZM’LĶgüÅZĶn·ėžēt÷Żw†ą{‰æZ@«¼ńĘš:uŖśõė§™3gś»9@›š–@«Ü{ļ½ŗ÷Ž{żŻ ą‚0Bt8" Ć!čpD@‡C :Šįˆ€‡@t8žn|_œ9sĘßMŠN!:Šįˆ€‡@t8" Ćį-3ą'‡C«WÆ>ļ|hhØ:uź¤ŌŌT…‡‡ū»™ü\‹E!!!źŌ©“śöķ«ččč‹z’’ūß²X,š:uŖæ»—1Fˆ€ŸY­VõīŻ[½{÷VJJŠBCC•••„-[¶Č4M7ļ6MSk×®UYY™ŹŹŹ.śˆŠÖŹĶĶmÓseffjß¾}ڵk—¦L™"«µå’Gļė½€Ö"€ĖŒišī‘!®Š ¦¦FŹÉÉQee„BBBŌ„K„¦¦*((H’TUU„ōōt={VµµµŠ×ąĮƒåS¦iź£>RTT”† ¦½{÷Ŗ¼¼\‘‘‘6l˜āāā“qćFåēēK’>żōS 0@żśõóé¹z÷ī­ćĒ«¬¬L………źŌ©“ņóóušąA•””Čb±(..ĪŻę¦īÕ\‹Å¢ÜÜ\„§§«¢¢BŃŃŃ2dˆāāā$©Å:ņņņtųša•––Ź4MÅÄÄØ’žJLLōłß£„:ą_L™?s:Ś·oŸöķŪ§½{÷ꫯ¾RUU•)Ó4µiÓ&9rD=zōИ1cŌæeeeiėÖ­’$Ć0“iÓ&eee©gĻž8p  µiÓ&ÕŌŌųT‡Åb‘ÕjUUU•öļ߯®]»ŖsēĪ*))ю;$©Įŗ&#GŽT·nŻZõ¬111’$»Ż®ššmŻŗU„„„1b„ś÷ļÆ3gĪhūöķMŽ«„2.†ačȑ#źÓ§®ŗź*é›o¾‘Óél±Žšš÷µ#FŒŠČ‘#e†vķŚås_¶Tü"ąg†a(33³Į¹Ž½{+55U’TPP āābÅÄÄ(>>^¦i*<<\III:uź” ät:UVV¦ÄÄD 0@R]čpüųq9sF!!!-֑ ©īĒüˆ#%Ć0ōÉ'ŸøŒųųx÷ˆĪ;+44“ÕĻ*Ս| Ņ­·Ž*Ó4e±Xdš¦222TZZ*Ć0š¼Wse\#j Ʃȑ#&I*,,TQQ‘ Õ¹sēfėp:2MSÕÕÕŖØØP\\œĘ§€€Iu£KZźĖˆˆˆf뀒ˆ€Ÿé–[n‘$edd襁Ŗ¬¬t’x®¬¬”$•––jĖ–- ŹČn·»ƒĻ·Ņ 4Hƒ ’$:uŖÅ:\H@@€{źˆÕjUhhØjjjät:ŻE[˜¦©’’IRdd¤ ĆPzzŗ²³³UUUÕ`٦“õµL`` ; ‘¤ˆˆ©ŖŖŖÅ:BCC5bÄeddh’žżī~čŁ³§† āÓæGBBB³uX,–vūūAŪˆĄe¤wļŽ:zōز³³uöģYuīÜŁrÄĒĒkÜøq–s½¹Ån·»Ļ}÷Żw:tčRSSŪbŪŃ£Ge·Ū”øø8eff*33SŻŗuÓąĮƒeµZµfĶÕÖÖ6YDZcĒ|*S[[«ŖŖ*÷ؒņņrIRXX˜OutļŽ]Ż»wWuuµŠ‹‹uäČ;vL:uņéߣ„:’““żņo€sDą2 h×®]Ś·oŸ&Mš¤ųųxÅÄÄØ  @{öģQbb¢{QOÓ45aĀuźŌI‘‘‘:{ö¬<ذ°0}÷Żw²X,JNNVHHH‹uūÜFI:r䈒““Ż •zs­āRPP €€1B’ÜDee„rrr”­   ÕÖÖźōéÓźŽ½ūy÷ņ„ŒT7ćŪoæU=T\\¬āāb…‡‡+>>^ĶÖ¦;vØS§Nīśė~>‡††śōļQZZŖķŪ·7Yü@.3=zōPff¦JKKuģŲ1„¤¤hģرœ8qBJHHŠ€ÜAʘ1c”žž®'Nئ¦Fqqq4hūø/uų"%%Eååå:yņ¤BCC› D<×F –ĶfSæ~żÜ «öźÕK*((ŻnWß¾}Õ§OķŚµK‡’Ķf;ļ^¾”1 C”””ŗźŖ«tąĄUUU)!!AC‡•Õjm±ŽÉ“'ėź«ÆÖ‰'Ü ­FFFjĈīiE-õe§NZ¬žÕ–IKMŖ U\[°¤I”’Ā$…KŠØßw‡z\ćŗ>Ä4ĶĒżŻZĻ{­‡ĘÖ~hj=”}寋ōČÆŖ¦Ę!ĆiČ0œ2 C¦qnß0œõßÕ훦©.[¦Ł?}ĄĻ½ |’uéŅåyIU’Ŗė7×~Eż~¹¤Źśc×¾ė:‡¤ZM’LĶg¼vt8" Ća šŃ‡~čļ&h'"ࣦšżĆ”Šįˆ€‡@Š@hhØfΜ©Ą@VYĄ•‹@Š@uuµV®\©ŚŚZ7øhD ˜¦©ŖŖ*7øØ’Wˆøø8;V§NRBB‚ÖÆ_ÆÄÄD 2DŖ­­ÕīŻ»•ŸŸ/IЉ‰Ń°aĆ)I:qā„ŅÓÓ¢©S§jŊ ×äɓ•žž®Ž½{+00PŹČȐ¤fėOMMUĻž=Żķ;qā„8ąļn$ˆĄĆ0 «ŗŗZ_żµBBB4fĢm޼YgΜQbb¢ĘŽ«U«VÉ4M7N{÷īÕɓ'¤‰'Ŗ¼¼\¹¹¹ī:MÓTPPō駟*66V?ųĮ”­ššš&ė‰‰QJJŠ>żōSÕÖÖ*88X#GŽTTT”ŹŹŹüŻU\I”™™©ššuļŽ]•••:sęŒ$éĢ™3Ŗ®®VēĪe†,‹Nž<)IŖ©©ŃgŸ}&©nQUoĒŽ“$«““T:u’Óél²žņņr)%%EŁŁŁ*//ז-[üŻ=€\A ĆPMM¤ŗ`#""B·ÜrKƒk‚‚‚dµZU]]ķs½ž×:Ė4Ķ&ė/++ӗ_~©>}śčꫯ–TŖžųc=zTĮĮĮr:š2eŠz÷ī­„K—Ŗ¼¼\‹E!!!š3gŽŽ9¢Ļ>ūL111ŹÉÉQJJŠLÓTQQ‘JJJōČ#(00°Åū®X±BGÕ| ;īø£Ń{4(SZZŖ‚‚;V[¶lQQQ‘āāāäp8ōꫯ* @aaa*((T µŌÖŹŹJ½ōŅKZøp”>¬uėÖ)**JŖØØŠüłó› (,‹zō蔂‚Łķv½łę› Ruuµ:wī¬Y³fiÓ¦MŚ»wƬV«āāāÜĻ}ōčQżä'?‘ĶfÓŁ³gõśėÆkįĀ… õ÷Ÿ×c„ࢸśź«uģŲ1IŅɓ'5jŌ(eggK’Ž9¢¾}ūjūöķ ŠÜ¹s5wī\IŅ®]»ŌsąĄeggė—æü„ęĪ«yóęéź«ÆÖ¶mŪdµZõąƒjīܹ Ó¶mŪd±XTVV¦»ļ¾[=ö˜¾üņKżą?Šż÷߯ŲŲX?~ܧū^żõźŽ½»ī¼óĪ&ļåmƆ š0a‚$iņäÉśź«Æ$IŪ¶mS—.]4wī\ŻsĻ=²Ūķ’äS[=Y,źī»ļÖܹs©ĢĢĢf’ņóóµoß>õķŪWš7ožīæ’~͟?_™™™*,,”Åb‘ÅbŃ<Šą¹'Mš¤ 6H’6oެńćĒK’BBBüżēuĮ!ø(‚‚‚Ō¹sg:tHQQQ²Z­ŠÕįƇ• ąą`åää(##£Ł)§OŸV=Ī;Ÿ——§īŻ»»m6›Īœ9£„„%%%IŖ›Ž„øø8IRXX˜‡O÷õå^žœN§¶oß®˜˜mŚ“I’TTT¤©S§Ŗ  @]ŗtiPŽ„„¶z³Łl²X,’¤ØØØFÆÉĪĪÖ_žņY,EEEiÖ¬YJJJRQQ‘–-[¦ˆˆY,•””øĖ{¶ĻeųšįZ¹r„Ŗ««µoß>=ńÄ’tEŒ!\4ŌŚµkŻė…ōķŪ·Į±Ķf“Żn×ģŁ³”+--uļ'''ė‹/¾8Æī¤¤¤£#²²²”’’āS»šŗÆ7Ć0|¾×Ī;5dČŻyēīs+V¬ŠŽ;§¼¼Ņȑ#µ|łņ&Ÿ[’&L˜ Ķ›7»§ÕŌŌhĮ‚—¼ķķĶŅĘ2²[°¤I”’Ā$…KŠØßw‡z\ćŗ>Ä4ĶĒżŻZĻūG]c?ņšśįē²Æüu‘łõBÕŌ8d8 †S†aČ4Ī톳ž»ŗ}Ó4õĻeĖ4ėžŸū¹·K/''GĖ—/×üłóŪ„¾®]»>/©JRużęŚÆØß/—TYģŚw]ēTė±I’鱳Œ)3 Qk׮՞={tĻ=÷ų»)ķŽ@4jŹ”)š2eŠæ›qQ°†čpD@‡Ć”@»:{ö¬žzź)uėÖ­ĮłiÓ¦©’žžn^³ŹĖĖõĪ;ļčžūļo—śŽzė-5J øØ÷®ÉÉVįk‹Ų„‹ū\h’T…„Véæ?T쬟“Ŗ>DZLUlߦŲŻÕą¼QaoS}—#@»³ŁlzüńļßĖD###Ū- ¹Ō÷Jī¦ų{Ļ/ļsxQS£ā÷ßUģģ»%IĖł/¦µ†G\aˆD ø„žyęŻ{ļ½JLLTnn®žļ’žO?žøŽ}÷]•””H’bbbt×]wiÓ¦MŚ»wƬV«JKKõ“ŸüD6›MgĻžÕ믿®Ē\K—.Uyy¹,‹BBB4gĪ9rDėÖ­STT”***TQQ”łóē+00°Ńūx*--ÕK/½¤… *==]+W®”ÅbŃm·ŻÖ`t‹Żnכo¾©   UWW«sēΚ5k–‡^}õU(,,L’¤Ć‡ė³Ļ>SLLŒrrr”’’"Ó4UTT¤’’=ņČ#Ŗ¬¬tßūšįƍ>CPPP«śŪ(/SŃŪo*aī|UlŁ(£¢B‘7LQ٧«Æšk®;÷ģŸ}¢šS'Töé*…ōė/gy©J?ü@FY™ GµāēÜ+£ŗŹ]_õw‡U¾ž3IEŻx“‚SśųūĻ«UDķ.;;[‹-jpīŃGÕŲ±cµuėVM›6M[¶lŃøqć“}ūvhīܹ’¤eĖ–i×®]²X,²X,zą“cĒmŲ°A³fĶŅęĶ›5~üxmŪ¶MV«U>ų $éŻwßÕ¶mŪ” ĀĀB=ōŠC²X,Z²d‰233UZZŚč}†Žč3¤§§ėŗė®Ó°aĆÜ!ŠKDD„ęĶ›ē>~śé§UXXØØK—.š1c†$é©§ž’T7Ś¢¬¬LæųÅ/ät:õšĆė©§žR\\œ^}õU?~\]<¦»X,–FŸ”¹)G5§³T°äE÷qųØkrußsĒ×]Æāwž”Š­›å,.RŌoiP>|ä5rę(ꇷČq,SF¹]Ń’łsÉbQń{Ėä8uB‰ēŚčų.CaĆÓ: UβR’ɵ ŻŁl6-X°ą¼ó£GÖŸ’ügŻzė­Ś³gž|ņI}ņÉ'ŹČČŠāŋϻŽ >\+W®TuuµöķŪ§'žxB«WÆV÷īŻÜóĢ™3JHHĶfsOłˆŠŠ’ĆįPNNN“÷iĢ”)S“|łrmٲE?śŃ|WTT¤eĖ–)""B‹E%%%r8*((hlŲl6÷~RR’$) @QQQŠ‹‹“$………Éįp4ڇŽĻМƦĢåe Ž#&Ż ‚’}N~¹@- ģ’$Õßß&ÓQÓąūšėĒ«ģÓUŖÜ¹]Ń·ÜęSŸ^ND—LHHˆŗwļ®5kÖØoß¾ –Ķf“Żn×ģŁ³\»yófY­u/G PZZšŽ{ļ=]}õÕ RRR’233Ż×gee)%%„É{7uŸ¦œ"""4zōh9r¤Ń65uŸčččFÆÆŖŖŅßžö7Y­VŻpĆ ¾xOa#F¶XŸY]„Ā’{C«Uc®o·g¼T,m,cń(č±K ‘*)LRø¤ˆś}×qØĒ5®ėCLÓüž-? ą¼{żųkź”?ʾņ×Ezä× USćį4dN†!Ó8·oĪśļźöMÓŌ?—-Ó¬{~īēŽīŲrrr“|łr͟?ßßMĮ茵ėó’Ŗ$U×o®żŠśżrI•õĒ®}×uIµ›$™›Ļ!øģ­]»V{öģŃ=÷Üćļ¦ą A øģM™2ES¦Lńw3p±ś» Ćkæ…V|D :œ‹ˆ\ņ„ %ŒøÜµū Ž2ķlĻž=žnpÉ :“=Ŗ¹dKo\H bJ²\Ŗ†Ą÷E;ż0p]Š)3fūņį<č˜|É Śœ'°†ø”.‹A+1}8¾,:\r¦×&ł6ƤŻ\Ģ"M…"ŽH0@ĒÖ\rQrƒö Dš 6|}B:³ß]“¼ ½_»ŪT(ŅŲØSŒą'ły9žnŠ‘ł2eĘl¦Ģk@Ä×õAš F$B—Šó’ß3žnĀEwźŌ)-Z“HÉÉÉīsC† ŃųC7­EĒŽÓ¢E‹4oŽ<„¦¦¶kŻśśėÆõ³Ÿż¬MåO:„åĖ—ĖįpČįphȐ!š:uŖ¬Öö™€ŃTūNœ8”ēž{NŻŗu“$…„„čŽ;īP·nŻtöģY=õŌSźŃ£‡$©ŗŗZćʍÓųńćĻ«æ  @’ūߕ˜˜Ø9sę4Ū–’żß’UXXX£}µzõj :ō¢·ÆWÆ^zųį‡%Õ3/æü²~ó›ßH’l6›,X IŖŖŖŅĀ…  D¾ųā ;Vß}÷]³mŲøqc“ķ8zōØ233õŲcI’žö·æéŲ±cźÕ«—ƏhŖłPDŗ3K.f ŅŌ^Ÿ®}ødœµ52 C†Ó)ĆØ•įtŹéuģśŽ4ƜŸ,{÷īUzzŗīŗė.IŅ믿®qćĘi÷īŻ:zōØ>ųąŻqĒZŗt©ŹĖĖe±X¢9sęčȑ#Z·n¢¢¢TQQ”ŠŠ ͟?_AAAīś ĆhsYI*--UAAĘŽ«-[¶ØØØHqqq:pą€>’üsEFFŖ¢¢B†ačžūļWmm­Ž|óM©ŗŗZ;wÖ¬Y³$Iü±Ž=Ŗąą`9NM™2E’TRR¢üć*--UUU•~łĖ_*00Pļ¾ū®JJJ$I111ī>rŁ·oŸØīŻ»K’¬V«ī»ļ¾fŸ;==½ŃžīŪ·o«Śē­{÷ī:tØöģŁ£¾}ū6č’“'O*))©Ń’3f(==½Łæ‘‚‚mŻŗU3fĢŠēŸ~Ž÷‡ŅšįĆŻĒƆ Ó”C‡ZˆxēŽĮ%4ўˆyŪ•ó_øLœ8qBĻ>ū¬ūxüųń oōŚėÆæ^yyyŗóĪ;µuėVY­V=ųąƒ’¤wß}WŪ¶mSBB‚ õŠCÉb±hɒ%ŹĢĢT’žżŻõlŪ¶­Ķe%iƆ š0a‚$iņäÉśź«Ætūķ·Ėb±Ø°°PóęĶ“ÕjÕ{ļ½§mŪ¶iÜøqš7ož»üÓO?­ĀĀBåęę*;;ū¼0!##Cåååzųį‡eµZõśėÆ+33S„„„ pY¶l™vķŚÕą‡QQ‘ķæ¦ž;""¢Ńė8ŠŖö………W‡«O%);;[łĖ_$Iååå;vl›’nŽ~ūmĶž=[N§³Ńļķv»ŗtéā>WnnnknŃXāėÖn.4i©1¾†!L™€vÖŲ”™½{÷¶X.//Ļ= BŖ›ŽqęĢ%$$Čf³¹§RDEEÉįp“[Y§Ó©ķŪ·+&&F›6m’TBL:U’Ō£G÷Z]»vUaa”ŠŠŠ“lŁ2EDDČb±Ø¤¤D‡C§OŸvÆ©įĶf³¹ė —ĆįPNNŽ222“xńā&ū%::ZGŽiUŸ55j¢µķk,9{ö¬ūž6›­Įæõkƽ¦Ż»wkŲ°a-ž{{śüóĻ5pą@Łl6:uŖŃk\£t\ģv»¢¢¢Zs›¦F…ų~4÷zŽViK bJ²4rĪūĮ›ūćśĪéqlŌ.²ąą`ŁķvI’iš:}ś“ū;ĆØ¼Ÿ””¤ĢĢL÷ł¬¬,„¤¤ųT’…”ݹs§† ¢;ļ¼Ó}nŊڱc‡¢££“577W]»vÕ¦M›ŌÆ_?ŻpĆ ²ŪķJOO—išJNNÖ_|įsæŲl6ŁķvĶž=»Ék†Ŗ?ü°ĮzĖ—/WĻž=›|ī¦ś»µķ󖕕„½{÷jźŌ© Ā O555­®·¼¼\YYY:|ų°*++uöģY}ńÅš4i’ūšŌŌT}ųį‡7nœ$i×®]š>}zknćTĆģĄ3#hjĆė¼·V‡#󵻎öN€œĄ”~Ńäwy§ū»yķ.%%Eü±/^¬ˆˆ%&&Ź4MÅĒĒ+??_o¾ł¦ęĢ™£ļ¾ūĪ=Z"""B£Gnrt„§Q£Fµ¹ģśõėu÷Żw78wŻu×éĶ7ßŌm·Ż¦ššp½õÖ[ŖØØÓéŌm·Ż¦œœ-]ŗTĒŽSxxøFŽ©åĖ—kžüł:zō؞žy÷:%'Nwmmm£żššŚŖöIēŽ¾c†¬V«ęĪ«ˆˆUTT(;;[‹-’$ÕÖÖŖgĻžīv¹8N=÷Üs²Ūķ*//×¢E‹tēwŖgĻžzōŃGõĀ /č¶Ūns_źŌ)­]»V“&M’aīkzöģ©~żśiŃ¢E²X,2dHƒŃ1>p Œpm­%ŅŲl’v]Ҷ„u%Ļ÷ Ø.X \æ…H •&)¼ž3Ōc öŽLÓüS{>€KĆ4Ķf›:篲Æüu‘yāæ,ŖŚX(r6ēdƒEU’¹l™fŻóóKݽØwšąAmß¾½ÅWÅāņ×µk×ßKŖ–䨒tķWJŖŖ’tmöśs®kŖ QjÕp¶I«Z“Ļ‹’ĻinĻé1NÆżŚ‹ŚŪЌŠņ’ĒgN·±&>p…ž³FjÕ0;hj‘vÓÖ)3Žėˆ˜Ÿ!ĪFöŖ djÕžĮ “JyI”"cāU”Ÿ'Ćą’Ł^n  ų»hĪF6Ļå5¼ƒ‘Ö,“ź³öZC¤„T]ˆ+üØ’“č\(~UR”/ĆÉ;€‹¬Ęc«õŚ<3ļPÄ„]Ö!mĻEU=é==¦Öć3 ž”]#L,jūZ&ąūÅ”sˆCēĀĻ€Ä{JMco›¹ ˆ4õś]ļ@¤¶ž>B@ĒT«s”ˆ÷§÷hļµD¼µy]‘ö!ŅŌā©®”Ē‚øėł`pI >BĻ’ł)żų®»|.óĻeĖ4tų7øRøŽ,ć B¼CW0āŹ¼×iˆx/lŅŲ諎 ‘W—Ģš#%Յ¾:|„†©*V?ڃē«v½G‰xi, i—·Ī“uڊg9ĻER­Ŗ Y$I ®?’ā±äń½ė3Ųė{W=uŌo5 ZxK —†©¦ß2ė=sÄs Œkō‡÷čZÆóŽ£E:“ˆk}Ļ6µJ{¾eĘP]8įśt5V: x6ܳüßLćŗ&Pēæ™Ę3±zŌońŗh?f#ŸŽæå{ъS ŽęĀĘŽ>ćŖĻóž¬=ל žˆÅėļÅP‚u~šäŻyV5!ā ?\aˆU„ \*M]ń%bŖa āv45EĘįq­÷kx[Z\µÕŚ#ń\ ÄŠxŽņP#ē=Āūa\ęzEÆkʌEēæ„¦¹·Õ’Š>ĢfĪ{‡"ž™€÷ W\£C¼ƒĻÄ{dHc£P.8iĻ·ĢHēO›ńœĻ ĘĆļQ$Žē¹0«Ō|BĄÅg6²ß\(ā¹Vˆē™jūķļŗĪ³œw}ķ¦½§ĢH §Ģx_ć=ߨ©Ž4tndˆkķéü ¤¹"ąāńžļżFYļQ"žSf÷čår÷¹Ļ]“»äĻēżˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆ\Bęī “ńś‘}‚»+`; vy7·LZ2(įŠ}1ˆBDDDDDDŌz55ĄŃb’ę04¤üĘŌ…"""""""÷iLĆŁmš58Ņ\…śŹ•5Ó¶DDDDDDDä>õ1„Fl×,‘ę.Ȱ\ÖĄĒ-Q"""""""r^CƒBžwv? 꼀BCƒ2˜-ĻŻĒLDDDDDDä)š#ˆ`ć9G˜)«É\p¶µ‡£æ 4DZ‘m i"8ųkļ9Góõķßi® "4¤ˆuÄr‚ĒŽźĖ@QĖ«Æk‹½ ˆõ4,@āhßNSŗą4¶%ˆå$·³Ü^ŽöODDDDDDD-ĆQ Ā:ČaBķ@ˆÉjGūY­'sb;‡\±Ō ˆe Dn5o/08nBDDDDDDD-ƙ|!ÖĮ“ż uƒ$–ŪÉģüu‰¦DŪ5Ę:¢°˜·ŽĄāƳłDœyžˆˆˆˆˆˆˆźēLĪ{ S­ƒ!F\ Šˆ1ĖēķķĆVP¤IW·Ł †Ų „XNÖĮ‘†ę!""""""¢–g««Œ8YAäQū{½ųœe`D°XĒ„CīM ˆ83|®å¤@ķ`ˆe@Diń×^PØæū 5Ÿś©Šó–­CÄI „TĆü}ŽhU†‘£vPDäŅV"ĶŃBÄQ²TĖ`ˆeDiõŲŁV"Žź@DDDDDDD®įLŠĮ^W1"~Ēģo79xŽ„­D\±n¹a̰ĪbŁ2DœTØ?(4,0BDDDDDDDĶĒÖ(3¶Z‡Ō\œ¬æē[Ī‹A£UY–IXmķ³Q±×mÅVšĀ:";,"*\ ˆ(­Ö±Œ ŁJ®jė15{ĆķŚ ˆˆėļų–ńq{“U™b®9jBÓän3ĶŻBD<`1‡ˆådQ”nPÄ:ÉŖåÉb+"""""""÷³eĘdń×: Rmµe€0· ±üž/n'F½ėŖ€ˆÜjŽz8]ĖÖÖŻdlMÖĖ!x­“µZb€„ˆˆˆˆˆˆØł5d˜]1°!N"ė^ 2˜ƒ"ÖåŠ#ЈåZ&]m4W·±•7Ä2'ˆ­¼!ö&Ė Š¶““Ś ŠXևˆˆˆˆˆˆˆšĪŃč2֓uė1 aŁ]ĘRǬžo-Dl ‰k ±±†ųąRĖ[ĖĄP7šbY"""""""r-ĮĪ2ė@ˆŲ½Å²…ˆŲĘVĪQqY źö±Ž‡e@¤É V]=ģ®eĀ^®qŽĒāÆŹā±õh3ÖŻo,.Ģ)BDDDDDDŌr,–łB¬[†X·«„9ą”€9ˆõwzĖļūÖ]f¬'—iL@Dfg™øÜ²U‡ukԟ;Ä2 b/(bÆ 5{£ÉXD,ó‡X·kŻŠAKĮėQglµ<±×m¦Į]i\CÄ^ «æu‚ ß»°.DDDDDD.sņäI@QQ‘»«BŌęÉd²©ø”7Ä:·ˆ8o ±ĢCā²V"®ˆXFp,#=õå ±žˆˆˆˆˆˆˆČół¢n‹Ė^–­MŒ6ÖćF'÷g“«"ā_±ļ½n3>“u"""""""ņ|¾Ø;z¬˜LÕ:«W° Ž4yČ] ł‡ŻµĢbÆe"DDDDDDDŽCģ%b=PŠež1bgóˆ4¹ėŒ«ÖĮė"–ėQg!""""""ņ>ó–¹B,!b,Įŗ[M“»Źˆ\ˆŪxl9YDl ĮĖ€‘w°Œˆ%́Ė4–“%—t›‘7µŌīVn±ÜVPÄÖ<"DDDDDDDŽA‰K±Ė^%¶‚!–ƒøX’9µ'\±Užubėī4āŠĪ€‘w°ģE"·š·5śŒ½ H“4µ0™ƒå–Yb­Ȳ•ˆ®ĢQėd™DŒ X÷2lÉk©I­D\=ʌ­æ–Aėæ–ļJ„S¦LĮøqć £Ńˆœœ¬^½«V­‚Éä’Ńyå‹/¾ĄŃ£Gńꫯŗ­DDDDDDDnfŻHØŻ°Ā²…uė&w•5% "³³Ģ2zc=/˜uōĒ%„R‰E‹aĄ€X±b-Z™L†+®øsēĪÅšįĆ1wī\·E/^ŒŅŅR·ģ›ˆˆˆˆˆˆØ•°n b#Į~lĮ^¢QCšŗrŲ]ėy™Éŗ…ˆ­Œ±rļ½÷bšąĮxųᇱ{÷niłöķŪ±gĻ,\øS§NÅņåĖ]tŲ ³mŪ6·ģ—ˆˆˆˆˆˆØ»ĖŲźMbklĒš¤¹rwXGnœ Œ4Ł”)S°~żśZĮѦM›‘‘)S¦–/_Ž7ß|³Ö:o¾ł&¾śź+ó‰‘Ėńąƒ⧟~¶mŪšÓO?įžūļ‡Lvé°vģ؁[n¹Ÿž9Ž’żzĖüā‹/šņĖ/_:łõģć?žĄż÷ß/­?nÜ8ģŚµ &L–ŻsĻ=ųż÷ߛéßHDDDDDDTף³g±{÷n¤§§ćųń㨮®nČęrŲN  Ō v8Ź!4!8Ņ”@„¬žĒ–·7źŒuß FėŅ„ """°uėV»ėlŚ“ ]ŗtAĒŽ±eĖ 8P >Čår <›6m<ōŠCøļ¾ū°xńbŒ?ļ¾ū.’’’šŠCIåÕŌŌąŽ;īĄ–-[šé§ŸÖ[¦µśö±{÷nōė×OZ?>>ēĪC\\œ“,..M=}DDDDDDDõŖ®®ĘįƇqųša”••”ŗŗŁŁŁ8~üxCбÕ*Ä^ kö' ÖŲ@„ĢĮ¼­JŪ: 9dƒDDDņņņģ®sīÜ9iŻ­[·"44Ż»wōźÕ ĮĮĮŲ“iüżżq×]wįĖ/æÄļæ’ŽĀĀB¬[·+V¬ĄŌ©S”P˜SžF`ɒ%ČĢĢtX¦5gö±{÷nōķŪWŚfĄ€X½z5bcc„eqqqŲµkWSO‘C•••8räĪž= h×®:wī ĄÜbd’žżØ¬¬t¦([ %œliTL”9‡»µUa[9\©©©ųłłŁ]GlĀc2™°wļ^”••ašąĮ€!C† ØØ‡BTTüżż±sēĪZŪgdd 88ŃŃŃҲƒJóŽŹ“ęĢ>vļŽČČH“k×AAA茵+V®\‰īŻ»Ćßß:t@dd$"DDDDDDŌ¬Ŗ««±’~\øpƒž={¢gĻžRPäĀ… 8|ų°³Żgģ%MuŁ(2õqå°»õØ­wYS—üü|@ĒŽķ®Ó”Ci]“É„ķŪ·#!!ß|ó † ‚-[¶@©µÉĒl³œššpœ|•••Ųæ?.æürŪ*ÖŽ@,õ­g¹¼ÉZj”[wYėŃ·ß~‹bäȑuž»āŠ+0bÄ|żõ×Ҳ-[¶ $$7Žx#|||¤aq=ŠŖŖ*DGGC«Õ֙Äī9¶Ų+Ӛ³ūóˆ 0ū÷ļ`ˆÄĘĘ"66–ŻeˆˆˆˆˆˆØŁģŲ±„„„šóóC\\œĶ`ˆØsēΈ‹‹ƒŸŸJKKÉ'b/)œXÖdĶŃe¦1IN\rpß~ū-†Š×__żµŒøāŠ+pēwāĻ?’ÄŹ•+„õ qōčQÜ}÷ŻŲ³gŌjC§ÓįūļæĒC=„üü|ģŻ»”””xąąėė‹'Ÿ|Ņnģ•iĶŁ}ģŽ½Ó§O‡Z­–Z›8p?ü0ŲB„ˆˆˆˆˆˆš]\\œ½Öµ“oß*• •••ŽÖÆÆ7I}£Ųŗ„+" ÉųźņÖ!€9‡ĒܹsqĖ-·ąę›oĘ­·Ž A••…×_kÖ¬©ÓÅeĖ–-ø’žū±jÕŖZĖSRRPVV†Ł³g£]»v(++Ć®]»°`Į‚zėaÆLkĪģćčŃ£P©TŠétŅ(9'Nœ€ææ?JKKqśōiWžB"""""""ÉØQ£¼MXXXcvåLK—j̬£2J‹É€/5?ž“ųX|Ž×rJHHx¦¹–ˆˆˆˆˆØ1ÄAŠŠŠÜ]¢6O&“„Š0Xü5ŠØPańWœ×­Pc1€`19­9‡Ż%"""""""r¤ŁÓkŲÓ‘é.CDDDDDDDä,¶!""""""¢Ö¢ÅO0 BDDDDDDD^‡"""""""ņ: ˆ‘×a@„ˆˆˆˆˆˆˆ¼"DDDDDDDäu”ī®9Vsą„’’zד…„@Ū×-ūnUæ>€FćŅ2L«EõĮĆī­C+Š*žnĀ€Q+WńÜ˨ټ„Žõ”Ƈ!dķnŁ·SB4ü „u|×h vj‚1ēŒū¢f’T’ü«»kÖ¢‚^ Õ°«Ü] ·`@„ˆˆˆˆˆˆšĻ“©śOrė†XPĘö5·Ŗ Ø’P§N¹»ZŌZM@d×®]ī®5‚ Ū[ę®m %Ų³;{÷ģvś „ƒšėz4Y×®śšŻ6Ó Į’¹§PńČ€V!"""""j b0dö³/;½MŹÆ®¹~¼»«ß¦ųʁĄgŸlu­BQ‹Š P¢uwUؙ1 BDDDDD^E †h rŽęŽ;ļÄ7+V0 ā$y\‚>|×å ^[„FßiS`ųšcwׄš‡Ż%""""""—ń{īi„nś³mC.ņd†»«@-€-DˆˆˆˆˆˆŚ(Ÿj=T5UŅc…¾Üåūš×—ĆXYZļzŠ# XśäQ]Ü}ZšLÕį×\ż/æ»»*.Sįģī*“: ˆµQ “źŖŹK ŒU/Ģ•± *Ė}XÓh€yó€Ł³]€Ą˜1€VŪšm.¬[§äd`ž|§‹P»žˆÜ†‘ŗŲe†ˆˆˆˆˆč¢ķ;vŗ» mˤI@VVė †Ąœ9Ąōén<9ŌŚ1 BDDDDD„KĮEœ Ń+Wš§ęA¦©ĮQj*0xpÓĖ!Ä€y=ė ƒ"Ģžmn2iRó”ļŖ`ˆeyš’Y`@„ˆˆˆˆˆ¼š½ąƒ"Vbb€ ̹9š£Uąś`ˆ(;Ū\nzzóž#jS˜T•ˆˆˆˆˆ¼ŚC‡@ŃĮīóŚ‚\wWŃżęĶ3'$mNĶ iµ@ZZóµ) ˆ‘×ó˜ GY™ėĖl®ŒuėÖį±ĒkŃć!""""¢F°üŅŽÖ}’=0p 9ÉjK™4 øļ>ó_g$'›ó±Ģ™Ó²õ¤å-D2ģōńŖ®®†V«…V«EuuµÓۚL&|šĮ1bžūß’ā„—^Ā©S§pąĄ&×µŗŗo½õVƒ¶iß¾=ęĶ›‡’üē?2dŽ’}›ž¦ģƒˆˆˆˆˆØEÄÄK—6’~Ģ-RЋͭ>œ †ˆ’’€æžj݉j©I<¢…H~~>€K9CÄ` Šh4Šėõ0 „J„‚B”rŠˆŪZ:tč1tčP€ÆÆ/žõÆNŸ>~ų …šÆż kÖ¬Įɓ'a2™Š±cGÜqĒŠétųģ³Ļ`2™PUU…øø8Üxćųā‹/pöģY|żõט:uŖĶme2™Żc½ņŹ+ń÷ßcß¾}čÕ«W½ū˜0a‚Ķu@Æ×cɒ%(,,Dxx8|šAčõz›ėWVV"55z½&“ ø÷Ž{įēē׹c """""/×\łD4sŁ=暮9 Ąž=ęrZkBXj4ˆˆ¹CĜ!ĮĮĮŠėõP«Õšńńn¾łfiYii)vīÜ‰ŹŹŹ:yGąĀ… ˆŠŠ²¹/…B'Ną™gžATTŽ9‚ÜÜ\<ńÄ€O>łūöķƀšųć0fžžyŒ17Üprss1uźT‡Ū:Ņ„K\øp¬wl®˜ƒ;’ž÷戔”ģŻ»ƒ ²¹žĮƒįļļY³föķŪ­V‹œœœFy¹… ĢL×&M2“”äśzj4Ą† ęd«©©-y†Ø™yD@ĵZŻčmF#L&“ŻēƤ€Éɓ'‘““ƒ… JĻWUUĮ`0ąĖ/æ„^ƇR©Dee%ŹĖĖk•coŪśČår‚ąŌ>­ÓµkWŗwļŽsēĪ”_æ~6×ļŻ»7žųć,Y²½zõB||łēĪCee%ĀĀĀū÷ļGEEŒF#d2™°±·­#Ū·oGII śöķėŌ>ģ­˜»Ģčõz@vv6:wīlwż½{÷āĉˆŽŽĘŲ±cqõÕWćĉ:"""""²Māī*“¼ÄÄś‡¹ML4·ŠČŹ2’uG0D$ęqēšĮäŃB$!!Įę°»:Īę¼õ¶uNŠR‰'žx_}õ~ūķ7(•J$$$`Š AČĶĶ­µnļŽ½1xš`¼óĪ;Édøģ²ĖŠ©S'ųųųąĆ?Ä©S§ŠµkWŒ5 +V¬Ąć?Žźźj|ōŃGxųį‡mnkķĀ… ˜?>ŒF#ĀĀĀšųćC©TāŠ+®Øw·Żv›Ķun¼ńFDEEałņå(..Fpp0 €ØØ(›ė'%%įĖ/æ„ ÉdšńńĮ=÷܃   §Ža͚50 øķ¶Ū`2™0kÖ,|ųᇐĖåųńĒ”R©0aĀw攈ˆˆˆˆČ’“ōōŚłDbbĢ-A’’ZßH/11ęhęĢa^‘6¬1CČ,&ĄT'¾Ōüųø8/>V[¬#®ļ+Ā3ĪW”®M›6Õ ŠDDD`Ȑ!€;wÖI Ś§O)Į(5Ž Ū[ę®m—,Z€=9&“ &£ &“9‡ `ŗ4o2/>gž߬XŁĻ¾ģ’sfÆĖŒßsOĆ’¹§\²6G«5ē¤6t˜\wII1FZ¹ĀöM.ĆU]fd2Y =ĆÅIœ×]œ/Pyń±8/®W ĘbĮbršG“€#F ??æVŠCĢ)"Ī[Šˆˆ`0„ˆˆˆˆˆØµŠh€ābw×¢įfĻ6·™>ŻcņŠx Č!"ŗå–[ЧO鱘SÄ2g`nrĖ-·ø»ŗDDDDDDä &M2w”a^‘6ÅcZˆˆFŒ„„dddŌj1ČČH$$$Ąßß߯Õ$""""""O’`ŠLž\;J3;ķˆc~”­=ķp½€ŹR§Ė¬š n±ś»“ĒDĄßߟŻaˆˆˆˆˆČóĶ™dfŚ|ź¼ŹŸ|Ut“»ké=4`Ćó’%%„YwU¬ōÅa’0čåĪ}­WWU:µĄ€µv™™v[#čÕĮŲ’čÓ“ö[w×Ņū,\ `Œ4C^‘,u0²Ō^8D³‹yT""""""ŗD»eNų™»«į’’Ģ]h4—Y¬ōÅÖąŽ †ø"DDDDDD,ėõ…ØĪÉqw5¼SB•å’d«Yź`ģ lētŖ"DDDDDDmEFšŚ MjJK±’ѧŻ]sļ„Ń»v™[Œ4‚;Z…ČMĘŪ—;1 BDDDDDŌV”•Ó§›sS4»Ī“K—šs‹4Ą!’0¶ iF ˆµ5))ĄąĮ@v¶Ó›°ėL]ł?’Ž­żÆFŁžƒ-³ĆٳͣŠŌ“WDl’ėąīSäŃ!"""""j‹22aיKŖsr°ū¦)Ų÷CП>ƒ#oÄłåßµĢ΁={ģęa«–Ć€‘—`׹ō‡Ÿįļ‘ć”ݲ­ÖņƏ>…£Ļ'·L%bbĢ#Š$%™ēœ÷ńg«ʀ‘ńÖ®3b«c/ĢGMi©ĶuĪ|ō?zäIT—”4…4s^‘¬,TggKS”¹k*ŌQ]Ü}Ŗ¼Ūąµ•Ææ’ß×O<LšŌ,ū»Ī Zū­»·Åd½¾§?üĢn ÄRīŠļQ¾’®żŖ–ŁEŽŃŃč8ķvęąMĮ–(Žü7“›·AśŒ[ϟ§b@„ˆˆˆˆˆØ5IK3O11ęĄHRR½I8Jģ:5ėwm³*Ū‡y å5h»ņ‡šw’aøöÅõkńzŪ ”ķ?ķęm >²­ĶD¾žśkwWˆˆˆˆˆÜč–[nqwZFv¶yxŻłóĶ­EęĶsińYÆ/D‡qc ŠŽv÷‘6‹¬×"ė† sk©¦“{nŗ—żwž˜p)@‚‹’’h7oCÖė i‚6€ńćĒ»» DNūłēŸłšõr| Q[Ąkµ?’ü³»«Šņ“Z 5Õ<]LĄé žŚu¦xóß8öü|— jJKqųѧPSRŚŖZÓØBB9~,jJĢõ£Ęi“‘ŹŹJwWØAųš%¾ˆØ-ąµŠØ hĄ0»Īš¤®3Õ%%Čz}!Ī|ō?——}ģ…ł(Ū}?xĒŻ‡YKĒi·ćŲó󝬍Buq”""""""/ę £Īož;GÜŲ,ĮQīŠļ±cÄ -3Mt˜v›»«Šfyd@DFF˜L&i¹Éd’&"ņn‚ @ŌŌŌ ŗŗÕÕÕØ©©‘®‚ šzA^„„ī–ļ­–z™L&›Ēfy ØŖŖBUU•t”EźÖ\ĒĖė—ē°¼/‰ÆĖ¦¼,·sō:oLłŽī­mł=å Ä®3mQuI =ņ$öLø£EFb)?p{nŗeūŗūŠ%Żžīī*“Y¹é¦›šĪ;ļ@§ÓA§ÓIć›nŗ 5550 Ø©©įE™Č‹żóĻ?xī¹ēššĆcęĢ™˜={66mŚN‡ .`ņäÉŅµĆś ‘'j©{ēéÓ§qļ½÷¢ŗŗŗÅīĒóęĶĆ<€ņņrčõzéĖŁM7Ż„»īŗ III˜6mž~śiüõ×_ØØØ@ee%Ŗ««Ūä{’É'Ÿ”¾ŒņśÕ¶UUUaÜøqČĻχĮ`€Į`€ (--Åųńć”Óé`0ōZ½ēž{]ļvy9ŗ·ņó·ūhj ˆØÖ9µ®Ųu¦-É’łwüŻrW|ߢūƒ"ś’®óœ;ZŚØ¢£”ve‹ļדÉ"H©Ä”C‡™™‰īŻ»Ćßß~~~ ]Œ•J%d2 …±–ÉdĖĶń!™LV'/“ÉjķG&“I“„·,G|ŽˆZŸW_}sēĪE×®]QUU…#GŽąŻwßÅŪo捊ŠP|žłēØŖŖéŗ`łė–\.‡\.ē{Ÿ<†3÷N…B!­ @ŗ’Yļ›öīā—*10”P( V«„ū²£ūŖõ>ÄuÅēÄå–Ū™L&ģܹ©©©Ø¬¬„B”€æææt óęĶC`` Ŗ««qüųq|łå—8{ö,&NœµZ-ÕM¬»õ{]ÜÆųœårQcĪ“3ēĀś³ŠL&ƒ^ÆGQQ‘ō?S©Tšõõ•ʉõ“<ÆŌz čt:(•ŹZ’3ƒĮP©Tµ>×°ł’_/z½^*O­VØż¾2 u^G>>>P*•ļyõŻ[}}}„ml•#¾,Ÿ³~ĶSƅÖZcPˆb„/Īū@«ō…^nūk`[u¦ŗ¤‡y æüį¶:Ō”–bĻ„;ŠgńŪč8ķvœ_žĪ/’Ś-Ū0dćÆ->To·©“ŸæsŪłh«<. b4q×]wį‹/¾Ą“O> ¹\.}ˆ«ŖŖBuu5¶n݊Ÿž …F£÷Ž{/śöķ‹ŠŠ Ģ;·ß~;Ö­[‡¢¢"éC‘ųxģŲ±˜0a”J%Ž9‚/æüRŗłL:±±±P(šńńB”ąÅ›Ø•1(--…N§Cee%ŒF#zõź…÷ß*• ÅÅŘ3g–-[†æ’ž?żōd2NŸ>éÓ§ćšk®ĮŃ£G±bÅ éĆßūŌÖÕwļ<~ü8/^ŒÅ‹Ćh4B”P`Ś“iHII\.—īėׯwxļŌėõ€Ææž0 ;v,ʏļš¾zźŌ),^¼ŃŃŃČĶĶErr2”J%|||{öģĮēŸ.Ėäɓ1dȼ÷Ž{€×^{ =öüüüąėė+wMM jjjżśõĆ£>Š’ūß>|8BCC±wļ^|’ż÷uŹU©TŲµk¾žśk DGGcƌČĖĖƂ šŃGA(•ŹF'G碠 Æ½öʏ““4””” 11·Ür žóŸ’ øøļ½÷ī½÷^üņĖ/ČĢĢ„B”@UUāćć1mŚ4ØT*ØT*`P¤ Ø®®†^Æ‡ÆÆÆąĢļĶ3gĪ`ńāÅHLLÄ®]»PQQnø7Žx# Ö­[‡µk×ĀĻĻ `Nœ«Ó鐙™‰_żr¹&“Iś<,¾Ž-Z„ūī»'NœĄ?ž(ÕĒÖ=Ļd29¼· ‚€żū÷Ū½wžõ×_R=ˆ7bΜ9ˆ‰‰‘^Æā5‰ļRpÄģ¼?ņU~(PłKĖjJKqų…WŃ’«OŻ]]»Ī/’®U%=üčSuFy9æü;ż×…‘“4ó_­ČĢ4Ļ—”\šĻĪF؋“ķz  ˆ‚€>}ś <<›6mĀõ×_/ŻōM&t:–-[†’üē?ĒĪ;ńŃGį7Ž€Į`@ii)ŒF#^|ńEœ8qo½õn¾łf<óĢ3(**Ā‹/¾ˆQ£F”ŗŗo½õ^~łetģŲ'OžÄ‚ šĘo ((ąėėĖ‹7Q+£P(p÷Żwć­·ŽBll,śōéƒųųx“k×Nś… 0łcTUU”  &“ /¼šņóóńā‹/bĈ˜2e RRRp×]wįŸžĮĪ;ńŹ+Æ@.—£ŗŗ«WÆĘٳgŃ©S§Z×;jŻÄ>F£±Vk#1XVPP€   ¼ųā‹(((Ą’żß’”OŸ>P©TųüóĻńÖ[o!((7n„V«Euu5ŹĖĖńÅ_ąµ×^CDDvķŚ%}ž:u*Ž~ūmÜsĻ=(,,Ä|€ēŸ]ŗtqxĻstoÕétXøp!ęĶ›‡vķŚÕzėõz,[¶ ,@PPŅÓӑ——‡ŖŖ*”——ĆĻĻÆV–\§c•«t°n=RšĖČ’łwDŽėī*ÖR“ƒż> ķ–mī®J½r—^’Mv¼’­ GNĪ„Q„23ĶĻQ³ņø€`žµcŹ”)xóĶ7qå•WJHL&|}}ńŽ{ļĮĒĒF£={öD^^*++a0`2™0dČ tīÜUUUcDEEĮh4b芔Šėõ App0ŠŠŠj%„ö÷÷GII ÖÆ_¾}ū",, “&M‚R©¬•˜“Ś>¹\ŽAƒIÆ£=ząčѣݺuƒ ®øā ¤¦¦JĮŗ… Ā××&“©ĪēaĄüś8zō(¢¢¢¤÷—£{ž£{ė¾}ūc³N‡īŻ»C­VKõ\¶lŒF#ŖŖŖ —Ė„–1l}Ł|¬[ä'MŽ4wW pśĆϐõśĀVÓ*DS£—ę-Ļ›Fœ/ϦO¢£½{/6ähuŚd@¤¤žaŽt:0bÄ|÷Żwøūī»Ś‹/¾ß’ĒŽ“śB@YYōz= ōz=L&“ōK©TĀ`0Ąh4B.—CÆ×£  'NœĄK/½Tkßååå(++“²j‹ż:É»Õ÷š„–%1lŲ0 :•••xć7°uėVÄÄÄHIėAĄŁ³gqäČL›6 ƒÅÅÅ8yņ$^~łåZeÖ÷Žēk€Z;G÷ĪŹŹJ˜L&”——C.—£ŖŖ ‚  ¼¼\ji`0¤/G€ķ{§^Æ‡æææ“½Ų2£¬¬ F£±Ö{K|’”——K9Mt:A€Ō ’üłóšóóƒV«EMM |||€āābTTT€Ō²E.—C§ÓIŻd,[¼Čd2ųśś¢  jµǵZ­Fii©”ėD,×`0@”P@«ÕB”PHŻpÄrÅzŠI$zžźūŒįććSė\>»ˆ9"ĀĀĀ0kÖ,l޼æžś+ąŖ«®ĀŲ±c„/ČbNK¼Vµāė©¢¢F£Q ¬étꙕ••Šėõšóó«•OÄßß„„„Ņ½Ø¤¤DzśłłI†µk×āųńću>WTTĄd2AÆ×£øøYYY˜7o^­ŗŁŗē°{o-((Ą±cĒšÜsĻÕ)G«ÕJõ߇~~~Ø©©‘ŗßŽ;Ō2" Ī“&£F™’ŗAK¶ ±äP›j 6™_ƒĘ*ØHNMmŃsEÓ&"ΐÉd3f ^żud_lvT]]żū÷c’žżxę™g T*”Õjńā‹/ŚL8&~XóˆIßär9‚‚‚…|‚ @”PŌJ4gł µČĻĻG—.] R© —Ė”R©†’’éØŃh„L&Ú5k0zōhųūū£¦¦aaaˆ‰‰ĮĢ™3„_®ųŽ'OaļŽi™0·ø°üYÜÖņ‹¾­{'p鋻Ų2£²²AAA0R7q;±¬óēĻ×J°(>'—Ė"0óż»¼¼!!!Ņ—'Ė$„Žœ8qÅÅÅčŁ³'“Z-ŹĖĖ„ķ-ĖÕét(//—Zžˆ×1Hc™ µ1ēÉŃgŒ¢¢¢ZĒc™(Žņ$“ɍž={Āh4"77©©© ŕW^)} f"čÖK©T"((łłłˆŠŠ)PÆŃh¤÷Tee%€KÆSN‡   )yŖų:Ģ÷@¹\Ž}ūöa’žż˜;w.|||PRRRēó°L&Cpp0¢¢¢0cĘ é}kėžWQQ‚‚»÷ր€é5-žč(–³}ūöZĒ –g+I1µ°ģl %Å<@b"0q"0{v‹ģ>ėõ…Čzca£·73j.Īį'Ķ_ rX¶ī ļäљ“|||0mŚ4|ūķ·P(Ø©©AEE…ŌēŃ`0ąĻ?’”2j[7!µ¼[~`Éd读7Īž=‹ .@.—£¬¬ ,²Ų‹x!'j] šź«ÆJĶŽM&8€“'Oā²Ė.«=yņ$rrr¤>ż‚  oß¾8}ś4rss„œ|ļ“'±uļ Dyy¹xŲøq#ŌŹi`+č`}ļ·Ł³gA@QQNž<‰=z WÆ^8wīņņņlŽW-G£°lÕ‹Ó§O#//pīÜ9œ>}½{÷®U[Ä@ŃhÄ?’üƒE‹aņäɐĖå读7Ο?ĀĀĀ:åöźÕ §N’ZS|łå—ųī»ļŒ²²2”””Ąd25ś<Õ÷€ĶėŒR©DMM d2öķۇߒ€9čҾ}{h4Fi8UÉŪś5 kÖ¬‘ZQ?_~ł%„––ļ)±c=н{wäää ¬¬ j½ÅĻĆāg`ĖĻĆ2™LjŻŌ«W/œ={¶Ž{^}÷ÖĖ.»L*Ēś5}Łe—!;;[z?ŁzßP+‘–Ģ™Ó"]>vŒøĮf0DmŖ¦FMŖ*ŠM_‚nś ,Ļ“¦ŃŚÓ­=«KĻcPy>•磯®Żō„č¦/EĒ*].BT—ŅXķī*“Ģqŗ»ĶAü°$—ˇM›6Iąøø8ģŻ»WJ„6~üx\øpŸž9ī¹ēžZeˆ4¬?€‰æŽLŸ>ß’½4>ūčŃ£(ķ›9ˆZŸččh<üšĆųśėÆ„nt=ō"##„d …Bś€łī»ļ077=z4fΜ‰ÆæžZśŠĒ÷>yG÷Ī€€\żõX“hŠŠPTUUIŻE¬‡ą“uļĢyCņóó±hŃ"TVVāę›oFpp0AĄż÷ߏü±Ī}Uģ" ¾·,ĮĮĮxä‘GšłēŸK­3¦OŸµZźjó‡9±5‰uįķ·ß–r{h4L˜0„ÉdBhh(xąiT Ėr}||pēwā’ūŒF#ڵk‡‰'B©Tā†nĄĀ… ›tž}ʰ¼F‰CżŠē$""xļ½÷0cĘ üšCųśś"..ØŖŖĀ€°gϼłę›u>?ųąƒĄ¢E‹šųć#)) ß}÷ĆĻ»õŻ[Å÷÷?üP§œL˜0‹/†ÆÆ/ś÷ļąą`)—s‡“BiiĶŽ…&ŹPuyžō˜Į‹–§øŲŠĘÓ5ęź"³˜sPEœ|ųPšą ąā¼ųXm±Žø¾Æ Ļ8³óÆæž vŸ7Ņøéb’4ĄÜD·²²Rź³,—Ė„ ²8ܘxĮ£ŻāPbā°| …*•ŖV?Nńƒ”å[Æ]Üy·ŒŒ ‡ÆYjyā{X¼VXž%~q› ‹Å®4jµZj/Dź{ļó5@­]}÷Nuī‰āżOüB$ŽÅį1ķŻ;Å÷Œå}S,C¼’Zߗā¶*•ŖÖhNbN„ŖŖŖZŪY&Q‡Įõõõ…R©„Ńh”†C<ĖįDÅ$©ÖåŠÉI-‡īµ^.v½kĢy²÷CL`).S©TRĖĖīMā$īÓd2I-BÄ}‰ēPü²ÉkUė#¾– ŖŖŖjŻsär9 ńĪ;ļąÕW_…^ÆÆõŚ'ąR¢pąŅč4b—ń>gżyŲ2Ųfł>²wĻsto_sbėėד؅«ŗŗF£/½ōfΜ‰ČČHØÕjĮĒǧÖkõ–[n‘źo}ĪlGkK-Ąæžœk~oM0™Ģß Ó„y“Éxń9ó¼ ųfÅ Ģ~öeøBõ–æQ:~rå~† ųėĖ[š•Ö@³g ߕÅ)sę\źŖCn”S¢Ņ7 ĪņąŸWB5ģŖ&—/“ÉRč.Nā¼īā|9€Ź‹Åyq½*5“Ó<®…ˆŲgQü$Žčś¾ųkŠå‡먳å‡31śmٷײ\҇Ė<–ĻQėbŁŚ2™œåū@­/n–_$,ūüó½OžĄ™{§õėŽ2g‡eĖ G÷Nń½%~³|ļY®/~į·$XÖ×2č(Ö_&“Ł|OŠ_ā,·G®·jß’ÅĄƒų9ĮŽ{]ürg9’ø~cĻS}Ÿ1Ä’ƒų˵Ģ#b™Ā2Ą+īCüózÕŗYē› –;Ė ųŗēÅm-ƒ@ķ×£u+ ėį©-ēŻóź»·Z¾fm•#£H%|¶B›65’>Fb@„Z„ĒD,?$X^ĄÅæøŽČ2 bļF FÅ-·³¾qXFĢMŽFDīaė—cq¹å{×ņ9ėÜB¶~-ć{ŸŚ*gļā @ķū u> Ąö½Óŗ;™å—v[÷]ė÷–å~­÷iżž®o;Ė_Ņ­“Ŗ[柕kłœuĄ£±ēəĻÖėY't¶Lījł÷Ķ\Gm‡e+)ĖĽ2™ ]»vÅ»ļ¾ ƒĮ 9,[žX¾>Ō ˆX²õyXdėõhėžēģ½Õ2Hiėż@:&ĖÄÅ|½¶"ę<"Ķ9$ob¢»’¼„ĒDŌł $.³ÕÆßŁ.-¶Ź³÷µ~Ī.šśFŒp÷Q’h“-D2)¤6†ÆYāk€ˆŚ^«ˆ”6§MDˆˆˆˆˆˆČyZ„ėcJUmŖA ± ”5«ފ$-­y“ŸĘʧģl7œ­¦å •“,_å'Ķ‹’r/Dˆˆˆˆˆˆ¼ŒŲņ @å/-ÓŌčZc€ŚTS+’ęˆęņSSŻ}Ŗ$—Zm(¤VeĖsIm"DDDDDD­R]«å‚ŚTM”Rw‹V$-•G¤™"õåå`KĻʀÕ”—+‘룔ŗŁ—Z‘h6’fĻ:Ō„(Ö]VŹ>R£!y9ȳńU@DDDDDDN±lE2póß~UóķĢ*ˆ­.+µ[x°55 "DDDDDD­„ÜdtwœV¾’PóDŗq2rW|ļīC%%wwŚŗæ¢c±sŅ4»‰Čµ~śé7 Œæ}.æƒŽĘÆæ:zoÕŖ_įļ…ļæ_ćp½Ø.ź¬óōÜd Œæ%%„Ņ:¾>į§īæ(téÜ=8eeåī>-DD69{ $r7¾VŪ¦āĶ7ū>‚āś¹ū0Ƀ±…ˆ‹ ųų](5!.)ėŲæ üŸcųłwQ«Ÿ_ˆ;§ĪĄ–­æ >>[¶ģĄõׯ†3g÷!4TSgżĻ>ū ?Æż]ŗtjš¾Žxć=üųćZlŁś BB‚„å_-’·Ż6•u ·Ż:’÷ņėX˜ņš»OQ-M¹µ$¾VŪ.ķęm;Ķš+Ż}˜äĮŲBÄÅ"Ē^‹Š+»¤¬ĀM[Ż}8D­Jvö)ØT*ÄĒĒ®¾zŖŖŖ‘“sĘęś§OÅ7ß~ __ŸķgéŅHYų~’ć;tčŠĪīzŻŗuÅøqcpāD¶»O Q½µ4¾VŪ®šŅR”ķ?Ų¬ūŠėeppÓ "²Įk"•§ĪąÆčXyńģ¹ļaģœt—ył™³Ų’ČSŲ88ė{%`÷“Qqü$Ąp!EĒb’£OįŸ—’ }ÆĄę«ÆĒ…Ÿ~µ»ė.3„{`ē-wcCŸ!ŲtåµČZōpqlč{ŅbÆÄī»’ö?减¢0} žŠŽ…PcDå©3Ų;ć l4éńƱē¾YØ8vĀįńy’žżū!<<Ė—’€ŹJ=>’ü[DGwAß¾½l®Ÿ<’ØTŖķc͚ß1÷©yųł—čŁ³›ŻõŒF#öļ?Œļæ_ƒiwŻźīSCDTGc®DīĄ×jŪĘV"Ō–yM@D~ń"›÷Ū:ČU*t˜4&ƒ{ām;ŠļķcšwĖP]Rн<”Ę(m“’gTa”č·ąU˜ōz|źETåŌ»Ļjm öÜ3ՅEč’į;»r²Žū¹?ż‚š²rģ¹ļaĪåbŠKūīŠīŲ= ˆ’ßb@Č ŗę˜Ŗ«‘1õ~h·ļBÆyĻįņW_B鎿Ų=ķAŌ”—Ū<>"Oćėėƒ–¼‡gĪEīƒńųæžĒāŽ„k~Qڲy;¦Žńnæżf Ōßę:÷Žó‚cÜśĀW ĀĶ7ßąīSCDDDä-‘G¤¹·’÷ņš€ˆHˆŸ¾‡Ø¤»Pü÷čNf£Ó·"|Ō0ˆE÷ٳ Ė>…ĀōĶŅ6~]» ūœGŠnÜõč<ķ6˜ŖŖP“u{½ū*ų+ Õ%„č|÷„'Ž@æ”×1śŲnt˜8Š ’ū/ żł[„$Ä#|Ōpõ½eGŽBØ©A`ļˤś÷ļ‡Ā“MП=‡.÷܁Ē£ż„ŠyŚķ0äå£0m³Ķć#ņ4¹¹y˜zĒCųćĻļqīüüńē÷˜vēLœ;—ė’ņ—/’o¼9_|ń-~łå/›ė|žÅ(+ĻFyEеĒ„ėĘÜ “ÉäīÓCDDDŌāŹ÷jö}°…HĖkK£5…×%U ø¬‡4Ææų%*ūƒO‘żĮ§µÖÓeå d łbuēK ž|Ū™ó TÕ»/żł ŸššŗOšLČz’cäżü ył)ŖŖA€`¬ūāӟ9g®K§ŽŅ2u‡öĆÅżX‘§łłē?ѳg7\yeąŠ+į²Ėŗć—_žĀƒŽŻäņß]ōL:*•wß5 ;wż‰=bģ®Œ·ĢG`@423ŲmUBDDDä©ō§Ļ :'ŖččfŪ‡˜G¤¦“ŌŻ‡ė5ŌU•ØšóüÜ-^‘)Ҽ\čśą½ˆš^»E…*8BM ĄpįRĄAœ÷‰ÆoWšm ØŹĖÆóÜée+pź“ečöÆč>ūȔJlæįV”žĒfYź‹Y·õgĻIĖ*Ϝ5?ÕŁęńy…B£UĄ°¦¦ĘeżŽ•Jó%qęĢū°}[n™|žŽöüżżģn#A€L&s÷é!"""r‹‚-;б"€¹•HĮ/øūPÉĆx]—K”W _t.¬ł eūAś,Ž0Ūī:Zm žy:={vCæ~½Ż}zˆˆˆˆÜ¢%ņˆÅõs÷a’ņź€ˆÜ׃¾ų!ńq8ņā«ČœžjŹ*ūīšėr©ÕEŲš« ĖŹĮĮ'ž…"0q‹Ž„Oxh½åū„‡aą²” ĆžGžBĮŗtD=pŗL›‚.÷މˆkF"ļ÷u8üģ’Į'< ńŸ½ߎķqų¹dȔJt¹g*Ŗµ%ųgŽAĄ åŸB3x ޼ō޾ņBÆ‚A_} …ŸŚŻ§’ØEtėÖ+¾ž³ž‹ž=†ąūŸĄWĖ?BLL`ņ¤{ńōÜdĄŁ³ēį§ī?u:twM{~ź.xķµwœŚ—ŸŸ?ü˜Šß߀wŽłPZ.–ć§ī‚޽®Ä¹s¹ųł—.KģJDä M½µ¾V=Gš”¶ŹkŗĢųvl19ź,÷‹ŽB’ßuø­L!Gß·^Eß·^­óœu™Ö5Cačźu¶S…#>õƒ:ĖGl['Ķ÷~åō~å…KŪhB0ąÓ÷t|DžfĀ„±˜0a¬ĶēV®ś\šļܹ#*õgœ.÷ō™½u–uėÖ…EG®CDŌ5ōHä.|­z†–Č#Ā‘fØ9xL@¤¦“ §>ūĀīó]ŗŹĄĄĘ.ī><"""""¢V«Eņˆ »Ś-Ķß…¼‡ĒD”ĮAč>ēwWƒˆˆˆˆˆØŃŌU•ī®B£”ķ?ˆŽø½Y÷:ü*DČ„<& ŅTa”ģ†BDDDDDTĖ#ņ†»”<‰W'U%"""""¢¦+?pÕ%%Ķŗę!Wc@„ˆˆˆˆˆˆšlēˆ‘õśĀf Œh†q“rDˆˆˆˆˆˆØÉō§Ļ ė…Ų‡C<Ł,ūŒėėīĆ$Ā€¹TīŠļQ¼ło——Ėn3äJm2©Ŗ ‘ī®Qó5ėõų ¢¶€×*¢Ö 0¤½ĖŹŅÉÜūuÆ|’!—04ĆŁeĘ­RķŅ׏7` """"""r¹ęh!¢ A`,»Ķk“É"DDDDDDm™¢küž{ŗY÷ŃY&C;7£28øYŹķżÜT8čĘ#k½ü”YĖWtr÷!ŗ"DDDDDD-LÕžĻ=Õ¬ūšw÷A6“ńcńcŻ] ņģ2CDDDDDDD^‡"""""""ņ: ˆ‘×a@„ˆZõė×cąĄŠh4čßæ?Ö­['=—‘‘Aƒ!((ƒ ĀŽ½{–µjÕ*ųłłįūļæwø^—.]ź¬3wī\ÄĒĒ£¤¤DZĒĒĒjµ~~~čܹ3|šA”••¹ū”Łäģ5Č Ōjµ4i4wW‰¼@zz:d2Y)==ŻŻU£ĤŖDŌŖbāĉHMMÅ­·ŽŠ„K—bŹ”)8}ś4T*n¹å¼ųā‹xąšńĒćÖ[oÅ?’ü…BQ§¬Ļ>ū k×®E—.]\7Žx?žų#¶n݊iłņåĖqŪm·²²²pė­·āå—_FJJŠ»OQ-M¹µ”ŠŠ ˜L&äēē#((ČŻÕiõVÆ^ĢĢL¤„„”¬¬ µžOLL„F£A||ū,vļŽM›6Ł]Gpaė«åĖ—ćĶ7ßÄ3Ļ<ƒ‰'bÜøquÖłā‹/¤"%%%xé„—0fĢl޼™æn5PHH’’’””„!C†`ÕŖUøóĪ;1`ĄōźÕĖŻÕs‹’’\{ķµuņƒXó>X<ŅŅҐ™™)Q&NœčīĆ!+‰‰‰uZļdgg#;;Ūa›““4\{ķµųį‡œļC|ŸY—·fĶ›ÆµģģlĢž=K—.u÷)kVŽż-Żā‹TųČDt˜0¹kBĮ†æąÓ +~€žÜ9@ö‹żĮ¢Z›ė²NJ‘€ĖzÕ[–ŗSgw1Q›ńōÓOć·ß~Ćśõė ˆˆˆĄ®]»j­WTT„ČČH—ģsŃ¢E˜:u*T*īŗė.ģŚµ =zō°»~HH,X€€€dffŚmUBDDD¶õčŃ|šōxņäɈĒ† ¼2 R_0$11³g϶č˜7osׇ͛7»ūpȆųųx¬\¹Ņīó%%%R˜ģģģ:ĻgddąÖ[oÅŗuėœĪ+˜"։ZG…yóęaõźÕHJJŖÓ)55ÉÉɝlÕk~Ī”ūųŖŠŠ¤eŗœ¬KĻ«Tˆ{’cŒŚµŻŗģ,œūį[ų] bD?8Ć·ģŖ5už2UŚ^¦PÖ[9ē“O>Įš5k°~żz“k×NZ>`Ąģßæ_zl2™°oß>—% T^lÉ5sęLLš4 “'O†N§sø 2™ĢݧˆˆØĶ),,ÄįƇk-3 P«Õ[$''Ū †h4¤¦¦bƆ NµśHHHĄO<įīĆ”F Į}÷݇¬¬,$''Ū\'##Ćīs1qāD»å5$)l[ä5æ.QP `Ć_8µō~įiŌ”–0”9»āK¤õļ ķĪķPw6O§ DčUĆąƒÜ5«Q¶/*OŸĀįēēbĒĶ7 śāöÖģ•EDõÓjµxī¹ēšå—_ÖiłqÕUWĮĒĒļæ’>Ŗ««±`Į„‡‡c芔.ÆĒ|…BxĄa]Ÿ~śiōģŁ³N²W"""Ŗß޽{qÕUW!33‚ ą›o¾ĮńćĒ1fĢwW­Å„§§#%%Åęsżõ—WüAfóęĶCjjŖĶēRRR““ć²}Yw§Łj„āI¼¦ĖŒ\­Fß’¾£’™ Ž@—{§£ŻŲqę«ĻaŖ2 żM7£`Ć_8šŌćÉč8ł6t™v/ä¾¾Hųāż÷|~ńYu¼¼/bßż~]¢ ?®Ī¾ģ•EDõūõ×_QTT„įƇ×Z¾téRÜyēųį‡0}śt<ū쳈Å?ü åī˜4izöģ‰ ąģٳRw—ŖŖ*L›6 wß}7^zé%¼ōŅKõÖĆĻĻ?žų#šĪ;ļąÉ'Ÿ©ʈ#šĖ/æĄĒĒĒŻ§ŽˆHŅŌk QK=z4^{ķ5Lž<Z­=zōĄźÕ«Ń¹³÷u5·÷ }JJ šuß999ČĢĢDff¦“,>>ńńńm¦»DNNN111ˆ‰‰©ÓU¤”妄„IÄÄÄ&•×P÷ŻwV­ZUgH^ĄüšqUŽ†tæń$^€'£ĆÄɵ–õłĻ[Ņü€SmnēƒŪ~”©;vĀu9j-SŪ-‹ˆ»óĪ;qēwŚ}>..®N‘卢sēĪŠėõNļ÷Ģ™3u–uėÖ EŻģl­CDŌ5ōHäN=ö{ģ1wWĆ­Ä/ŻÖ›­ėKII RSS‘’’ā°@LL ’’’0{öģzæ4ŪźBœœœ,å6qõvā1|ńÅ“ŠęĪåī°–žžŽääd›’FƒŁ³g×[?WIMM­3Ņ"`žģėŖ€ˆ½Ö&ž>R‘ĒDjJKóŁĒvŸ~ča(ƒÜ]M"""""¢ZlżśŲļĘŠTéééHJJrŖ;Dvv6’““‘ššŠļæ’¾Ł[«8Ė^"P{,[æŌgٲeϽV«•‚%6lhöcGc²ī>£Õj‘žžī’+¶ŗk5µuM[ą1epzĢyŚŻÕ """""j{‘ęČRߗ}{²³³1xš`¬ZµŹķĆłĪ™3Ēn¾{œm鐚šj7o‡µ““4Ģ™3 .löcNLL“YÆ“““&-ęϟoó|6ō·E!"""""j‹ģu—q5±eˆ-111˜4i4 “Z-RSSm¶¾HJJĀ_żå¶–"ļ¾ū®Ć/źbŽ(++“ŗŅ4$ Ņ)))˜={v³ēZ‰µ¹Ü٤§Ö-d“Z-ŅŅҰjÕ*›e¤¦¦ŗ=šÕ!"""""r“’’›Ėććć]¾/{Į”””:¹J.\ˆéÓ§Ūģ¦1wīÜé*b-==³g϶łÜ¤I“šŅK/Ł Ō¬^½ŗĮē399IIIˆŽŽFII V­Z…ٳgŪ „¤¤4{+{(g"öĪ›µ˜˜¤¦¦z|W‘× »KDDDDDŌŚŲĖma+‰fS,[¶Ģę—g[ĮŃŅ„K1iҤ:ĖÓŅҐžžŽĀgŹžH<©©©X¹r„Ż ĮĉŌ‚#55óęĶ“¶ Į}÷Ż‡æžśĖęśöŗ<µ5Ž !"""""ņxļ½÷^e111õŽbcÆ{JC»–4UFF†Ķ®EIII.͵⨼„„›"g[i“vŁŁŁHLLÄąĮƒėµĒS0 BDDDDDäĮrrrl~Įu¦Ett“Ķ @K·ŠX»v­ĶåöZ4–­cuęywœmI”€ÄÄDir”&##ƒƲeĖÜrL-©MęłśėÆŻ]¢ٽ{·»«@nĘ×µ¼Vµ¼ĄĄ@›ĖNÖöZ08›W#>>¾ND«Õ¢¤¤!!!-p–ģ'žuu2Óś bĀVkåååĶzüöŗ(9ū?|ūķ·mv…Y½z5RRRģ¶¾‰m5C-7‡6=z“»«@DDDDDn°~żzwWĮ„ģ}Ł“—[¤1l}Łąt®{#“dff¶X¾ [Aę‰§µ²Ō² qÖĉ1qāD̟?ßfkw%Šm)ģ2CDDDDDäF¶‚"iiivG ńFž’§£±ģuQrUPh޼y6ĖJKKCNNŽ»æŁ0 BDDDDDäFqqq6—{Źč%Ō4ā°æÖbbb\ŚeČ^N{-Œ<"DDDDDDnd/Q§«†ŚėVįl"P{ŻwœĶ_Ń\ĒąŹnE­™½‘~’’’\ŗ{łS<¹u"DDDDDDn4qāD›_ų³³³1žü&—ksłœŚŽVą!&&Ę©„Ŗ®ś2mėüxC·¢ŒŒ »1gF jW&ņm+!"""""r3{æö'''7yųӄ„›æž§¦¦Ö»­½ī¶ņMŲĖ…āČźÕ«:[­h“Z­ŻÖž ##cƌ±ł\rr²ĖGųiī<%­Q›e†ˆˆˆˆZOĻs`Æ;‘+Ķ›7kÖ¬±Ł%)) ™™™Mś|XśĢŃ«W/\wŻuµĪe^^¾śź+ 8GŽAee%®ŗź*\yå•ҹśóĻ?„óqżõ×#&&ēĪĆŹ•+Ń”CᔇrŗĢżū÷cÓ¦MŅ’fÜøqŅ;v`Ū¶mšóóCß¾}±k×.L:ķŪ··[“É„yóęį©§ž²9b…µœœ$%%”GųōÓO„寽öÖÆ_™L†kƽ/¼šB³’ß[“É„øø8ģŻ»‰‰‰6ßsöŽ€ÉdB’žż‘™™ •J­V[ė3•#mżżėMBBB°téR<öŲcx’ż÷ķv±'!!Aź:bméŅ„HJJBrrr½­4“®3_CBB°nŻŗzƒ9 X²d žžŽ s“€ĢĢL©ū3ēÅQ‹ūÖD£Ń 11‰‰‰˜4i¢££[dæāž’’’¼""ņ˜€ˆL&CŸ>}š÷ߣC‡h׮ڷo_«‰`MM är9F…ŹŹJüłēŸčÖ­AĄĪ;1räH”¢¢iiiøöŚkŃ®];"00ˆˆˆ@aa!BBBPXXX§¹”L&Cee„ĶżŌŌŌąąĮƒ3f Ōj5Ž;Nפ/ŁJ„²V0„¬¬ &“ µÖ3 vqąĄ8sę †^«.Ī–­ÓépčŠ!\{ķµP«Õ8}ś“ō+…Ńhľ}ū˜˜äęęb÷īŻøīŗė‡mŪ¶aŠ A×Ģ­U|}}qĶ5× ²²żõ:tčµZmw»¢¢"œ;w×\sōa’ȑ#ŠétP©TŲ¹s'† †ąą`”––bĖ–-øīŗėPZZjw»€€wæŌ‰Ø 3™LĖåĖå(//G÷īŻŖŖ*»×$±µ`dd¤ĶūŽ£ė»#Ž®‘Ī\ėÄcqtżÖétvļ{ŽŽY©lŽ'•••Ųøq#ŗvķ „R‰ŠŠ |ūķ·x蔇‰¢¢"|ųį‡xüńĒŃ£Gœ:u ČĪĪFLL ²³³Ń”CdggK?€>>ŅņśŽ;wĘöķŪѵkWųśśĀ`08µæ¶śž„KF%\• 4!!”ن¬ŽŽ–‚Ž„„„4©KˆåyqVc÷ŁŠķ,×uY·—zZõXž?=yČ\WšØ€`ž²ččhF¤„„!77ĮĮĮP(µZ@ˆM C­›`ž h0Š„K9rP^^ŽŽ;āŠ”Ć€¾}ūÖłrÆT*ŚB”hpżÄ‰R}.æür©ŪHqq1vķŚ…øø8› āc}ź+»ŖŖŖV™LVėńįƇQPP }µĒŃz>>>µ1>>>Ø®®vø]`` † †“'OāŲ±cĢå^½zĮ`0 øø¬¢Ŗb {Ū±Ė ‘÷Ŗ®®npž$ńW!¹\Žąą`\}õÕŅu_„RI×GפˆˆģŻ»‚  øøC† AMM“ޣ뻣€HCÆuŽŽÅŽuŲŃ}ĻŃ171‡ˆ ųųćŃ±cGųūū0ßßÅy‘ææ?ŹĖĖ1`ĄlŲ°‚ ??—_~¹8ČÉÉĮõ×_€€$%%aŪ¶mRKˆĮƒcäȑuĪ„Z­†B”ūłłIæŗŸ9s‹/®µ¾Ńh”Ö³žA¢¾2AĄśõė„.­ā’FTTTŌ:f•J%å“(//wX—¦*,,DÆ^½¤Ēbė•–PœŽfPÄĮĄüæźŽ½;8P«uG}ļN:įĉRėś“Ę÷oc®©DD®ę1‘źźjčtŗZMŒ Ōj5ōz}–lEÖ |}}įėė …Büü|éƒe`` ņóó”T*„ÖĪP©TŅ—xĄÜ…§ŖŖŖAĒŁ£G)"C† ±ŪŸ×Ń1:āLŁÖĒe2™¤ć:{ö,rss1räH( čõś:æ9³^uuµŌGU|ģććSļv!!!R÷ŠŠ ģŚµ žžžP«Õ ÅÕW_mó˜ģmÕ ’y†#GŽ k×® žšn™ČŠ‘ś®Ijµ¹¹¹ ‚R©¬qt}ņ"Ajmېk½cqtvtß«ļ˜›‹L&Ć 7܀+V 66jµØØØØµ^EE‚‚‚•J…“'O"222™ įįį8yņ$|}}„īE;vÄäɓ˜[ņ|ūķ· ©ÓŖCÆ××ŗŸUVVĀßß …;w¶9Ōę… äķ•yšąA9r3fĢ€J„Byy9Žxć ę/ā–Ÿ_ ƒŌr)00Šn]\Į:i¼Ų%¬„XEÜ õģŁ6l@aa”“¬¾÷GVV–ŌŠÉ™¤¬­ńż[]]'N4øÕ‘+ɛ^Dė Óé°yóęZ7“ÜÜ\՛@'22%%%(++`Ī•QZZ*ݜ###qģŲ1©œššp;v¬Į7o±›‡ųĮ5''ĒīÆ=Ī2Ųµkģ0¹Y}ĒŲ”²ĆĆĆQTT„ŹŹJéøDÕÕÕRPI?~\*[ģ»Zßz€łCüٳg˜?ų!""ĀįvēϟĒ?’ü#Õ% jµ‚ 22Z­„„„ĢÓŅŅPUUåp;"ņ>§OŸĘ‘#GšĒHCł‰Ó\²G×$ńyń ¹­mķ]ßÕj5ŖŖŖ¤/¾–}Ć]u­stvtß«ļ˜›Stt4ŗvķ*żŗŻ£Gäęę"??€¹Rnn®”×”GŲ“i“”Œ4::7n”~ 8tčP­>ā”””¶y.F#öļß/żÆĪœ9ƒnŻŗ”G8žS5DK½8PēśłĒąČ‘#8}ś“»’DäÅ<¦…HHHpąĄ ‚???\qÅ rx÷õõŐ!C¤ŃVsSW±õD»vķpüųq©ouxx88€Ė.»¬Au BĻž=±qćFųłłIżEmu›Yæ~=ŖŖŖ`0°cĒČd²ZC ‹rss”Óé°}ūöZĖ P+7ˆ£c“wu¶ģ€€ōéÓ›7o†R©DĒŽAйsgœ9sėׯ‡J„Bß¾}QVV†mŪ¶įź«Æ†6n܈«®ŗŹīz š.oÜøUUUčׯŸtķmwå•WāüłóXæ~½t£ŒŒDTT”t>÷ģŁA`2™pŁe—ĮĒĒ‘‘‘v·#"ļN‡ØØØ:Ż*\ÅĒĒĒī5 0ł8~ü8śōéSgŪśīa½zõĀʍįėė‹N:ĮĻĻOŗ®¹āZēč:<|ųp»÷½śŽ¹¹]żõųąƒ0dČDDD`Ź”)ųńĒ„ē§L™"µžčŃ£6oŽ,Öß~ū #GŽ”ž?r䎒}©kJ÷īŻkå0!??ü1ōz=ʎ+µn:u*VÆ^ “ɓɄaƆĮßß_ vŁcÆĢŲŲXģŻ»ļæ’>üüüpŻu×I£ŅÜ’ż>|8>žųc£’žšó󃏏üżżķÖ„!£ĢTUUįśėÆGQQņó󑘘ˆ7ß|C‡ÅčŃ£1zōhČd2ÜtÓMRK„–Ō‚!¢ČČHI’kGļ}ūö”[·nP(ˆŽŽĘ?’üƒJŸ©Äׄ3Zźż‹ŲŲŲZĖt:NŸ>ĶĻW䣮¹ˆęĶęĢV­V®.&4•dgóē›Ÿ×j˜ó6i©'–µ? }|Øųšpq^|¬¶XG\ßW„gœŁł×_Ń£G»ū¼5ŠÉd’äÉd2”––bėÖ­;v,sSµrāš¬ä¼ę¼ļżōÓOҰĆmE~~>RSSńōÓO»½Ģššäää [·nĖåČĶĶÅēŸާŸ~ŗQ’›U«VaƌĶ~J[ MDh rvęĻ’“Ķ“‹ųÖ>Y =ĆÅIœ×]œ/Pyń±8/®W ĘbĮbr?ٵ ¹\޼¼<8p@j–:dČCˆˆŚCŽ÷½ÖK”PąŲ±cųõ×_„dšwÜq’7$iī÷/Æ©ä523ĶA†¬,sŠĮŚōéęæ–ĮŠyóĢAŠ”ą‰'logϼyuƒ(˜%ļæ,]Zū¹ÄÄKłóĶŪfd˜'$4K0¤5ᕨ…Y7$""ņd¼ļ]éŅÖ!M)SL.ė R’÷‰»«ŠfńżKäZ­9a+ؑ}©%ˆuĖ'ž0?·lYƂ¶ŗ¶Ģž}©åˆu@0—æf9s÷ŻĄÜ¹ęr–,q÷Łkv ˆQ›ćI]Øłü÷·Zl_|M‘]“&Ł^ž–fž«Õš[gX”§„5®•ĘŖUĄŽ½—ö!īĒž%K€Įƒ1cĢė-\h;ēˆ‡a@„ˆˆˆˆ<Ņo½ķī*Ł'ŽĪ™šźŗ232€Ūn3Tkē0q$!ĮœĆ$5ÕܚeölwŸĮ€5ŁÉ“'Ż]"¢¶iƆŗ#¼4†Vknį»vÕnį‘œģxیŒKÉWőj<<Ą€5Ń${ĶĮ‰ˆČ¾Q£ĢWÆvM@$5Õ¢6ÄĢ™—F¢¹ķ6s7ŻäńŻfä×IL4!Ä@FS•”˜’Z—•’āx»łóĶ-DÄä®ā(53gŗū 5;DˆˆˆˆˆˆˆÜaįBs£[7są"-Ķ<„¦šG†iˆūī3’MM5Oiię`Ēüł¶GŸl±;i’yŹČ؛ģÕĆ0 BDDDDDDäIIĄŹ•ę€Åœ9Ą5ט§éӁM›VVLĢ„au§O7—“šj.?>޼ܲõˆVkīŌbwéRs’“́Å"DDDDDDD®&Ī­gŁ"£¬Ģ¼ĢQNGå&%™§“4 (čR[åi4@V–ķr4 øŲm§®„“ɀȶõėŻ]"""""""×qeSW$iõm. 2uźTwWˆˆˆˆˆ,VæX 6~ĮģüŖŻ”m‰ˆš‚9DˆˆˆˆˆˆˆČė0 BDDDDDDD^‡"""""""ņ: ˆ‘×a@„ˆˆˆˆˆˆˆ¼"DDDDDDDäu!"""""""ÆĆ€yDˆˆˆˆˆˆˆČė0 BDDDDDDD^‡"""""""ņ: ˆ‘×a@„ˆˆˆˆˆˆˆ¼"DDDDDDDäu!"""""""ÆĆ€y„»+@DDDDDŌVäåå¹» Dä"l!BDDDDDDD^‡"""""""ņ: ˆ‘×a@„ˆˆˆˆˆˆˆ¼"DDDDDDDäu8Ź ‘›üłēŸØØØ°ł\@@®»ī:—ķkÕŖUšńńĮøqćÜ}ŲD­"DDDDDDnҵkWTUU²²²`2™…BwWČ£1 BDDDDDä&½{÷–ęO:“É„¾}ū2BŌ!"""""jÅŖ««qäČäęęBÆ×C­V#22}śōÆÆÆÓėX»pįžłē”––B„„„ąņĖ/G»vķÜ}ČD-‚IU‰ˆˆˆˆˆZ)A°iÓ&œ8q‘‘‘8p Ś·oģģllŻŗ&“É©u¬UWWcūöķ04h`2™°gĻTWW»ū°‰Z[ˆµRyyy(--EXXāćć]ŗtAii) PTT£ŃXļ:µŹ5ƒ:”””1b …»™ØÅ0 BDDDDDŌJUVVk-@AA*** B½ėXDŌj5 „£GāĄ¹\Žččhōļß2™Ģ݇NŌģ!"""""j„üüüåå嵖—••06Dάc)** QQQ0 Šjµ8~ü8²²²Ī;»ūЉš"DDDDDD­T»vķŒ¢¢"dff"""Bź,%@ufKŲ¹s'"""P*Ķ_ķPˆ< "DDDDDD­”L&ƈ#¤dNŸ> µZ=z wļŽR×gÖ±Ė.» 999Ų¹s's—›Aƒ!<<ÜŻ‡MŌ"!"""""jʏos¹J„B\\āāāģnėĢ:“&MŖõøgĻžčŁ³§»›Čm8ģ.yDˆˆˆˆˆˆˆČė°Ė ‘“V­Zåī*‘‹0 BDDDDD䤊ŠPwWˆ\„]fˆˆˆˆˆˆˆČė0 BDDDDDDD^‡]fˆˆˆˆˆˆ|yyyͶOµZ &`åŹ•Ø©©q÷) Ŗ"DDDDDD¤k×®HHHĄīŻ»qöģY‚€.]ŗ`Ų°aŲ¹s'Μ9Ó,ū5 X³f ƒ!Ōf0 BDDDDDä!är9āććqąĄäääHĖsrrąė닁JAWz½ŽŻ§€ČiĢ!BDDDDDä!ĀĀĀąė달¬¬:Ļä%˜C„ˆˆˆˆˆČCTTTĄ××*• ÕÕÕµžS*•šõõEyy9*++1xš`( „„„ //111Ąųńćkm§R©˜ƒ-b™łłłu¶W(Ņ6jµŚnY.\@ll,d2‚‚‚pśōiÄĘĘ0·ÉĢĢt÷i$/Į€‘‡(..Fee%zōč#GŽŌz®GØØØ@qq1@§Ó”k×®())Auu5ōz=ŹŹŹšēŸÖ)7$$¤Öc½^_g{Ė€ˆ£²Ąh4¢sēĪ(--… (//G§NPUU…ŹŹJwŸFņģ2CDDDDDä!AĄīݻѧOtėÖ J„ …ŃŃŃčÓ§vļŽ-­›ŸŸnŻŗIŻZ.\ø€€€©ūJ@@ʎ ›ū²ŽŽR}eåååį²Ė.C~~> °°½{÷fžjQl!BDDDDDäAĪ;‡-[¶ OŸ>0` ØØ›7oFAA“^^^zō聃ŖŖŖ°uėV 0*• ‚ ąšįĆØŖŖ‚ŸŸ_żXooÉQY€9`ҽ{wģŪ·PPP€¾}ūāŸžq÷é#/"kä62‹m•“_j~ü\œ«-Ö×÷įwŸ """""j8A>¶·Ģ]Ū.Y“’zr.L&LFL&#L&Ó„y“Éxń9ó¼ ųfÅ tī~¹›Ļ6QŪ7eŹ”z†‹“8Æ»8_ ņācq^\Æ @Å‚Åä4v™!"""""""ÆĆ€yDˆˆˆˆˆˆˆČė0 BDDDDDDD^‡£Ģ9iŌØQ[ˆ‘×a@„ˆˆˆˆˆˆˆ¼"DDDDDDDäu!"""""ņ0’ż7žxā Lš4 ·ß~;ž}öYģŲ±£Éå¾÷Ž{˜6m 1nÜ8TVVŗåųŠ‹‹Żŗņ LŖJDDDDDäAŅŅŅšžūļcöģŁøņŹ+Q]]ķŪ·cńāÅčŲ±#¢¢¢U® ųć?°xńb„……᫯¾‚Z­n±ćZ“hŃæh4šß?yDˆˆˆˆˆˆ<„ŃhÄ'Ÿ|‚{ī¹Ƈ(•J$&&"11±Ie FA&“!44“E-''GšwĒžÉó°Ė ‘‡8~ü8Š‹‹1ḟėeddą±ĒĆC=„GyŪ¶mœ;w·ß~;Ö­[‡™3gāĪ;ļÄW_}xżõ×Ļ>ūl.3«WÆĘ}÷݇G}üńn»ķ6äääąäɓ˜8q¢“_£ŃˆqćĘįĀ… 8vģī¹ē|ņÉ'xź©§ééé˜9s&’’’šČ#`’žż€%K–ąčŃ£Xøp!^żõ:]fsĮæžõ/¼žśė(**‚B”€N§C~~>–,Y‚W^yĖ—/GYYž}öYĄo¼¹üŅWÉÜÜ\|śé§˜?>/^ŒÓ§O£²²²Ö:¶ØT*”——#$$Ƽņ ōz=/^Œ'Ÿ|©©©7nRRR3gĪDPPęĢ™ƒēž{Ī%ĒCĀ‘‡P(0™L×ÉĢĢDdd$bcc}śōA‡°oß>ę\!ćʍ\vŁeP((,,“[ŽĮƒ˜˜Ą¤I“ B½u•Éd0 ?~< V«ńķ·ß¢wļŽ€ąüłóõ–åźć!ļĮ"DDDDDD¢}ūöØØØ€V«…F£±¹ŽV«EHHH­eĮĮĮŠjµŅcĖ&2™Ģa„““ĮĮĮŅć†äöP*•ҾAĄ²e˰cĒųųų ŖŖ `2™ P(ģ–įźć!ļĮ"DDDDDD¢{÷īĒŚµkķ®£ŃhPRRRkYIII£“” ¢¢Bzœ——'ĶĖåņZ-<ŹĖĖkm+“ɤłĶ›7cŻŗuxżõב’’‚¹sē:µWyDˆˆˆˆˆˆ<„L&Ì3šż÷ßć·ß~ƒ^ÆGQQ6n܈xĒŽĆĄQPP€ƒ8€‚‚ÄĒĒ7jŸ½{÷FVVĪ;ųć?¤@GXXŒF#Nœ8ųå—_jA,•——#000 X½z5@Æ×0籕ūĆÕĒCރ]fˆˆˆˆˆˆ<Ȉ# V«ńõ×_cɒ%P*•čŃ£fΜ‰Ė.» šĀ /ąĆ?„^ƇŸŸ^|ńE„„„HĮ‡†ˆŽŽĘw܁gžyaaaøõÖ[!“É “ÉŒiÓ¦įå—_FPP¦L™µZm³ĖŹČ‘#±aĆ$%%!22³fĶĀ©S§šüóĻcŃ¢E3f .\ˆU«Vį…^¶ qéń÷5r™Å¶J‹É€/5?ž.Ī‹Õėˆėū ‚šŒ»O5œuŅK[I0ķ%ĘtǶK-Ąæžœ “ɓѓɓÉĮtiŽd2^|Ī>ģŪ·;v„ ;v, G茵+:„„„›ū:xš L&x’ż÷„ēæżö[i~Ą€ųąƒ Bī6™™™ˆŒŒDll, OŸ>芔öķŪ‡nŻŗĮ`0`üųńp÷é%Į€yµŹr-L&“ &“&ńÆŃäīŖ5Śæ’żoōė×555˜1cśōé#“Z-Ο?¤¤¤ZŪčt:i>((Hš DYY™Ż}"88Ųęs‚ `ٲeŲ±c|||PUU0™LP(µÖÕjµ ©µ,88Z­ T* !—b@„ˆˆˆˆˆ¼š'w™Q*•HJJĀG}„#F ”””čŅ„K­V¢Ó§OŹŹŹ¤ ‡ŲUް°0Łlõ±yóf¬[·‹/Fpp0Nž<‰Ē{Ģf9%%%µ–•”” 44šœĄ•ČG™!"""""Æ6ģŚńv'O0bÄ“k×Ė—/`ī"sįĀģßæ››‹™3g¢““€9ššēŸ0sśōiōėg?0 •J…5kÖ@TTTąÉŠ]GōEuIDAT'ŸÄO?ż„ņņr"00ƒ«WÆčõz€J„’ZŸ 88xš ąĄ(((ŗö¹[ˆ‘WóÄ.3–d2|šA¼šĀ øńĘŃ„K¼üņĖųä“OPQQ„R‰;īøĮĮĮ())B”€L&ƬY³ Ó隊C”}ūö(..¶Y¾ęϟ%K–ą›o¾\.Lj#0~üxčõzlŲ°IIIˆŒŒÄ¬Y³pźŌ)<’üóX“hƌƒ… bÕŖUxė­·šĀ /ąĆ?”FæyńÅ"u›!r„Ę“9’YL€9Ø"N>|Øųšpq^|¬¶XG\ßW„gÜ}2ˆˆˆˆˆØįApųŲŽ2wm»dŃüėÉ¹ęĄ‡Ń„]o“{l—]Ž&“‚ ą›+0mśĢ–:­nqśōi<ņČ#X³f»«B¬}ūö)ō 'q^wq¾@åÅĒā¼ø^€‹ ‹Éil!BDDDDD^ĶG™i {("Oƀy5Oļ2CD¶1©*¢¢¢°vķZwWƒØE0 BDDDDDDD^‡"""""""ņ: ˆ‘×a@„ˆˆˆˆˆˆˆ¼"DDDDDDDäu8ģ.‘Ńétųā‹/°mŪ6TVVB&“!** wŽy'čīźµ ˆy÷ßÕÕÕx÷Żw £Ńˆ-[¶ą÷ßG\\”J%-Z„ÄÄDōļßæŽņ².Q[Ā€‘Ł»w/ž|ņI Fމ‘#GJėäää8]^CÖ%jK!"""""ņ QQQXµjbbb^ēł%K–ąčŃ£Xøp!z÷īēž{éééX¾|9 üżż1kÖ,ÄÅÅÕYwŹ”)˜3gVÆ^ 0˜0a–.]ŠöķŪ㫯¾Ā† ‚ `ōčј6md2™»O Q ˆy'žx ,Ą½÷Ž‹nŻŗaĄ€6lśöķ ˜9s&ŅÓÓ1gĪōļßz½‹/Ę«Æ¾ŠŽ½{cķŚµHIIĮgŸ}VgŻ“'OŚŻļ‘#GšŪoæįć?†ŸŸŹĖĖńī»ļāģŁ³čŅ„‹»O Qe†ˆˆˆˆˆČƒtģŲoæż6>śč#Œ;ēĪĆsĻ=‡’ž÷æ”Īśjµß~ū-z÷ī 0`Ο?os]G ÓéšŪoæįܹs ċ/¾Č`µZl!BDDDDD䁢¢¢… &ąŌ©SxōŃG±oß> 0 Öz‚ `ٲeŲ±c|||PUU0™LP( Śßo¼5kÖ`ÕŖU€nøS§Ne—j•!"""""ņp]»vEHHJKKė<·yóf¬[·‹/Fpp0Nž<‰Ē{Ģf9r¹¼VĖ‘ņņņZĻ÷ģŁsęĢ`NĘśŚkÆ!22cƌq÷) Ŗƒ]fˆˆˆˆˆˆ<Ĺsē0mŚ4l޼ƒPQQåĖ—£ŖŖJj¢R©PVVĄŌ D`` ƒ”0UÆ××Y7,, F£'NœüņĖ/Rėõė×ćĶ7ߔZ˜tģŲĮĮĮ īzCŌRŲB„ˆˆˆˆˆČCtźŌ O>ł$V®\‰÷ßÕÕÕš÷÷Gæ~żšöŪoKCńŽ3 .ÄŖU«œœŒ 6 )) ‘‘‘˜5kN:…ēŸ‹-Ŗµī[o½…iÓ¦įå—_FPP¦L™µZ “É„aĆ†įŠ”C˜1cd2 ®¾śj\{ķµī>-D65¦#—ĢbĢAqņą @ Ą€?€€‹óācµÅ:āś¾‚ <ćī“ADDDDD gŻĄV‹{­ܱķ’E šÆ'ēĀd2Įd4Įd2Ād2A0]š7™ŒŸ3Ļ ‚€oV¬Ą“é3Ż|¶‰Ś¾öķŪ§Š0\œÄyŻÅłr•‹óāzUj,&,&§±Ė yDˆˆˆˆˆˆˆČė0 BDDDDDDD^‡"""""""ņ: ˆ‘×a@„ˆˆˆˆˆˆˆ¼"DDDDDDDäu”ī®Q[Ń®];wWˆ\„-DˆˆˆˆˆˆˆČė0 BDDDDDDD^‡"""""""ņ: ˆ‘×a@„ˆˆˆˆˆˆˆ¼"DDDDDDDäu!"""""""ÆĆ€yDˆˆˆˆˆˆˆČė0 BDDDDDDD^Géī y+½^Ļ?’\z,“Éąēē‡Ž;bąĄ swۜ?žjµ÷Ž{Æ»«B­[ˆ¹™\.Gll,.æürāĉX¹r%NŸ>ķīŖµ˜³gĻāć?†N§kŅ6Ɔ ĆŠ”CŻ}8Ō°…‘›)•J\}õÕŅć`ėÖ­HOOĒwŽ …Bįī*6»œœ—lÓÆ_?w µ ˆµ2±±±8tč“Z-.\ø€N:Į`0`÷īŻČÉɁN§ƒææ?:wīŒĮƒĆĻĻPQQķŪ·ćüłóØŖŖBūöķqÕUW!44:_~ł%BCCqūķ·Kūśß’žAšĄHėtźŌ Ż»wĒĪ;”R©˜˜N‡æ’žpÕUW”gĻž€ŖŖ*dff";;åååšóóCTT† ___‚€O>ł#GŽÄ–-[PRRFƒįƇ£]»vX³f Ο?ųņĖ/1xš` 4ēĪĆ®]»PXX™L†vķŚįꫯ†F£±»u—™śĪ›3õ#ĻÄ.3DDDDDD­Pxx8 ““&“ kÖ¬ĮžżūŃ©S'Œ9]»vÅįƇń믿Ād2Įd2į—_~Į‰'Š»wo\qÅøpį~łå §ö)¶DŃjµ8sę ¢¢¢P^^ŽĶ›7ćŸžA=PYY‰Ķ›7Ćd2A¬]»{÷īEÆ^½0nÜ8 4'NœĄļæ’ĄœE.—£²²Ū¶mC·nŻŠ©S'`żśõ€”C‡"((pĶ5× gĻž0 ųż÷ßQTT„ÄÄD$$$ąĢ™3ų믿ģncĶ™óęLżČ3±…Q+$sāģŁ³(**B»vķ0räH@Ļž=QXXˆóēĻ#77&“ ÅÅÅčŅ„  ĄL9|ų0Μ9ƒŽ;Ö»O™LĄÜźcōčѐĖåČŹŹ‚V«ÅŲ±c‚3gĪ@«Õ¢¢¢eee(((@xx8ڵk“É„   tķŚĒŽCnn.:tč™LƒĮ€ÄÄDh4˜L&|ńÅ(--•Z²ųųų:wī ĄōéÓ!d2L&öģŁƒ¢¢"˜L&»ŪXrę¼uźŌ©Žś‰ū!ĻĀ€Q+# !!!(,,h4šZė…„„ąüłó(--•–ž{÷UyØü™É=!7RBnkČ)Ų…‚Ź„EWZZźŽß³gvķŚ„““4uļŽ]Ru0b†¬V«ŠŠŠTUUÕģI[]÷MNNÖ¤I“Zō¤§§ėĄŗīŗė4tčP…„„hٲeŗpį‚ßuøĀ!Ž‚XUU•¶nŻ*Ó4UXXØÜÜ\…††jŌØQ’Ŗ‡„“nŻZ§OŸÖ—_~©vķŚ)''GłłłjŻŗµŚ·o/Ó4ÆS§NiĒŽjÕŖ•öķŪ'«ÕŖ.]ŗ(<<\±±±*--Õ§Ÿ~Ŗ6mŚčūļæWDDD“BO)))JJJR^^ž¾śź+učŠĮ=ÉŖaŗóĪ;éW]®)ūöķS×®]Żm²Ūķ:~üøŽ;ęnkVV–ŗuėV§Œ÷Øž¼7/0Ć0tąĄIRdd¤ŗt颸'VµZ­š8q¢¾żö[8qB™™™Š‰‰ŃM7ݤČj­^/cĀ„ śę›o”‘‘!‡Ć”ääd 2ÄŻā–[nŃW_}„ģģl•––jųšįڼy³ß“®z³X,ŗķ¶ŪÜ«Ģddd(,,L)))JMMõ; ‘Ŗ—Ė-..Vff¦¢££Õ«W/ååå)//O„„„ź×Ɵśōé£Ķ›7kēĪźŅ„K2ށˆæļ ĮÉŅĢ2²”[ø¤I‘’¢$EKŠ©ŁwGz\ćŗ>Ā4Ķ'ż24÷|¾ęwØo·@”}㯠4ļ±łÕ+³8 †³zÅćā¾a8k¾«Ž7MS’\¾\<łūæmą‡Ļb±¼,鼤ʚ͵_^³_&©¢ęŲµļŗĪ!©Źc“$Ócóq:" čˆ€ C ‚:" čˆĄ5dģŲ±š:uŖĻļf̘”±cǤ]JMMUyyy _ąF ׻ݮĢĢĢZēNœ8”āāā@7 øjˆĄ5&--MŸ|ņI­sė×Æ×ĄŻ4ąŖA טQ£FéÓO?•išīsėׯ×ȑ#k]·~żzM:U'NŌōéÓµk×.IÕ½Iƌ£5kÖhŚ“i7nœ-Z$IŹĢĢŌŠ”CŻu8N„¦¦*''§Į:« \cŗvķŖččhķßæ_’tōčQY,uķŚÕ}MEE…^xįżįŠźÕ«5yņdżéO’$…††Źn·+??_ļæ’¾^yå½łę›*))iš¾ Õ \mDątė­·jŻŗu’Ŗ{mŒ?¾Ö÷QQQŚøq£z÷ī-I4h²³³e†$É0 Mž}ŗĮ{6V'p5 t-ļÖ[oÕ¬Y³ōųćėÓO?ÕK/½¤ .øæ7 CÆæžŗ¾üņK…‡‡ĖįpHR­a6±±±ī}«ÕŚh°įOĄÕ‚@®AķŪ·WJJŠV­Z„ØØ(uźŌIYYYīļ7nÜØ5kÖčŻwßUBB‚2335cƌFėõF<‡Ń4·N 2ר[o½Uo¾łfį2Ru«øø8?^+V¬$•——7Xg›6md†222$I’ś×ædµZ/©N Dą5nÜ8č'?ł‰Ļļāććuūķ·ė”‡ŅĻ~ö3õźÕK>ų`ƒuĘĒĒėžūļ×¼yó4mŚ4„¤¤(22R†a4»N ,Ķ,cń(ź±…KА))JR“¤˜š}×q¤Ē5®ė#LÓ|"Š/@ÓyĻįk¾ˆśęDŁ7žŗ@ó›/Ć0d8 †S†aČ4.ī†³ę»ź}Ó4õĻåĖõȓæšŪ~ų,ĖĖ’ĪKŖ¬Ł\ūå5ūe’*jŽ]ū®ė’Ŗ<6I2=6æŃCtD@Š!A‡@tD@Š!A‡@tD@Š!A‡@tD@Š!A‡@tBŻVēϟ×Ņ„KŻĒ‹EQQQj×®ś÷ļÆÖ­[»æ[“h‘"##5sęĢ@7»E\kσ0«ÕŖž={ŹétŖ  @YYY:~üøĘƎ;J’† ¦@7µYN:„5kÖč?žć?żƒ\D ĄBCC5tčP÷ń“uėVmŚ“Iwß}·BBBŌ«WÆ@7³Ł¾’žū:ē~Čσk\ez÷ŖøøXłłł²Łlu†˜ääähēĪ*((ÅbQrr²†Ŗ„„IRaa”¾śź+(22Rƒ ŅĪ;UZZŖ_żźW2MS‹/VBB‚FŽ©-[¶čܹsJHHŠšįƕœœ,IŖ¬¬Ō®]»ōż÷ß«¼¼\ŃŃŃjß¾½RSS%I:yņ¤¾żö[É4MµnŻZ©©©źŠ”ƒVÆ^­ÜÜ\IŅ;ļ¼£ŌŌT 0 ĪóŲķv}óĶ7ŹĶĶ•ĆįPŪ¶muóĶ7+11±Ń{ĶĮ¤ŖpJJJ’$•””Ōł®²²RėÖ­Saa”F­*;;[6l$9N}ņÉ'ŹĖĖS=4pą@:tHv»]VkõĻ@‹Å"«ÕŖŠŠ mŪ¶M]ŗt‘ĶfÓŁ³gµqćFI’aZ½zµöļß/›Ķ¦‘#GŖS§N:tč>žųc†!‡Ć”uėÖÉétjōčŃ=z“LÓŌ¦M›äp8”––¦ŲŲXIҘ1cŌ­[·:Ļc†Ö®]«¬¬,õčŃCƒV~~¾Ö®]«ŹŹŹFļ4=Dą*dš¦$łœg#""Bæüå/eš¦,‹ ĆŠīŻ»UXX(Ć0”ŸŸÆ²²2µmŪÖ=§}ūöZ¶lY­ś,‹*++5zōh%$$Č0 żć’PII‰‡ņóóUXXØääd9R’Ō­[7(77WyyyJHHišŖØØPii©’““5qāD…†V’ÜlŪ¶­ĀĆĆŻmpĶ!ā)''GEEEźŠ”ƒRSS%UA‡Rvv¶Śµk׹=€ęąæ®2¦iźģٳ’¤ųųų:߆”mŪ¶éŲ±c*//w‡'®²åå咤øø8÷ł˜˜…††ÖŗVŖžæÄ5ĢĘjµ*::Z•••ŖŖŖRYY™$¹æw‰Wnn®JJJd³Ł4fĢķŚµKŪ¶m“TāōčŃCC‡u÷Hiˆė>­ZµrŸ2dˆ† ā>¾Ō{ŽDą*sąĄ•””(..Ī=—‡§ōōt8p@×]w†Ŗ-[¶L.\$÷ÜžĆmģv»ŖŖŖš“²‹+ (..®u¾ØØHRuČ"U÷éÖ­›ĪŸ?Æ3gĪhļŽ½:xš l6›ŗvķŚč}\õ”––ŗĻķŁ³G»vķRZZšz÷ī}É÷¼ˆ@€UUUiėÖ­2MS………ŹĶĶUhhØFåózWša·Ūuüųq;vLŗpႲ²²ōć’XQQQŹĻĻ×Ö­[•””¤ĢĢĢ&÷¤hß¾½Z·n­Ó§OėĖ/æT»v픓“£üü|µnŻZķŪ·Wnn®6lŲ vķŚ©{÷ī’ä"ććڲoß>uķŚµNČc³ŁÆS§NiĒŽjÕŖ•öķŪ'«ÕŖ.]ŗųu ©D Ą ĆŠ$I‘‘‘źŅ„‹ ąžXÕ[Æ^½”——§¼¼<•––Ŗ_æ~źÓ§6oެ;wŖK—.ŗõÖ[µeĖ:tH­ZµRZZš ät:żn—ÕjÕĉõķ·ßźÄ‰ŹĢĢTLLŒnŗé& 0@V«UķŚµSß¾}uųša÷¤®ńńń=z“RRRÜķ-..Vff¦¢££ė"!!!š0a‚¾łęeddČįp(99YC† QLLŒbbb½ŠT–f–±x” õŲĀ%EHŠ”%)ZRL;ė8Ņć×õ¦i>č— é¼ē¤š>®ļ\ Ź¾ńך÷Ų|†!ĆiČ0œ2 C¦qqß0œ5ßU©._®Gžü}€ßvó9-Y²Dqqqš>}z ›ƒ f±X^–t^ReĶęŚ/ÆŁ/“TQsģŚw]ēTå±I’鱳"p Z³f Õ·o_ÅÅÅ)33S’˜oØA × ĮƒkūöķŚµk—œN§bcc•ššŖ~żśŗiĄU@®A?śŃ4aĀ„@7øj±X3:" čˆ€ C ׈x@ .ōłŻėÆæ®x Iõ(55Uåå咤ēŸ^ćĒ—aMŖ'55U¼"ļĄ³ĶŽķoīsćŚD ׈I“&iķŚµ2M³ÖyÓ4õńĒėŽ;īhR}‰‰‰Z·n¢¢¢d†žżļkįĀ…²ZÆüOÉēž{Nß~ūķ©ßó¹qķ"€kÄŲ±cU\\¬={öŌ:æ{÷n;wN·ÜrK“ź³Z­JJJ’ÅbQee„œN§āććņlYYYW¬~Ļēʵ‹@®‘‘‘7nœÖ¬YSėüš5k4~üxEFFJ’vīÜ©{ļ½WS¦LŃĢ™3ŻŹĮƒ5a½ōŅKš5kV­”#æżķo%I³gĻÖÆ~õ+-]ŗ“Ö=Ž{ļ=Ż’ż ¶ļĉ3fŒÖ¬Y£iÓ¦iÜøqZ“h‘ūūE‹iņäÉŗė®»tēwjŃ¢E2MS ,PzzŗžųĒ?źé§Ÿ–$­_æ^S§NÕĉ5}śtķŚµ«Ń÷S_ļś½‡Ģ|żõך1c†&Ož¬éÓ§kóęĶ~=®n"p ™4i’6lŲ ‡Ć!Ir8śģ³Ļ4iŅ$IRqq±üqĶ›7O|š~żė_ėńĒWEE…ĀĆĆURR¢„„½ņŹ+µź}žłē%U‡Ó§O׏•+kĶ%ņ’÷š6mZƒm •ŻnW~~¾Ž’}½ņŹ+zóĶ7URR¢żū÷kÕŖUzēw“jÕ*-]ŗTGŽщ'4ž|ÅĒĒė™gžŃóĻ?ƊŠ ½šĀ śĆž Õ«WkņäɶӟžŌą½*ć]æ§ĀĀB=ńÄš?¾žõÆé駟Öoū[={¶ĮēĮՏ@®!}ūöUėÖ­µiÓ&IŅ_|”6mŚč¦›n’$mß¾]mŪ¶UZZš$)--M‰‰‰Ś¹s§,‹ĪŸ?ÆiÓ¦)66¶Ž{Œ3FN§S[¶l‘$}÷ŻwŹĻĻ÷kHŽašjß¾½vīÜŁąóąźčZ–krÕqćĘiķŚµš8q¢ū»‚‚egg×:'Iv»]’¦V­Z5XæÕjÕŌ©SõžūļkĈZ½zµīøć………łÕ>ϰÅjµŹ0 żųĒ?Öo¼”÷Ž{OĖ–-“$Żu×]š5kVI\ ĆŠėÆæ®/æüRįįįīŽ0Ž“É^j×ūJLL¬u.!!A……… >®~"p¹ķ¶Ū“hŃ":uJ;vģŠ’ū’Ļż]RR’~üćėŻwß­S.++Ėļ‰D'Ož¬·ß~['OžŌŗuėō÷æ’ż’Ū}ć7ź™gž‘$=zTóēĻWJJŠnæżöZ×mÜøQk֬ѻᆱ„„effjƌ ÖŻœ2®÷UTTTė\QQ‘~ō£]ņó"°2ט6mŚ(55U’õ_’„Įƒ«uėÖīļ¬œœ÷„¢§NŅ“iÓtīܹ&Ż#>>^ćʍÓļ~÷;ŻpĆ ²Łl—Ōęµkןwæū*++%I:tPBB‚»GXX˜»%%%ŠU\\œĪŸ?Æ+VH’{T_+ćYæ§““4åēē»'žŻ½{·ņóó5hŠ ĖóĒĆC × I“&iŪ¶mīÉT]āććµ`Į½ōŅKŗóĪ;õšĆė—æüe³–ӝ>}ŗŅÓÓ5uźŌKnļ-·Ü¢ččhM:U“&MŅĻžsõė×O·Żv›$iāĉść’Øūļæ_ćʍS||¼næżv=ōŠCśŁĻ~¦^½zéĮ¬·žĘŹxÖļ)11QžóŸõā‹/jņäÉZ°`^|ńÅ:ĆhšĆӜE•-›T=ģʵ…KА))JR“¤˜š}×q¤Ē5®ė#LÓ|"Š/@ÓyĻĮąkN†śęiDŁ7žŗ@ó›/Ć0d8 †S†aČ4.ī†³ę»ź}Ó4õĻåĖõȓæšŪ¾ŗ¤§§ė©§žŅæ’żļ:ó|õ±X,/K:/©²fsķ—×ģ—IŖØ9vķ»®sHŖņŲ$ÉōŲüĘ, Éģv»žūæ’[÷Ž{/a~ųÆ4ÉŪo歉'ŖGš6mZ ›4 «ĢšdÖ¬Yš5kV ›\zˆ€ C ‚:" čˆ€ C ‚:" čˆ€ C ‚:" čˆ€ C ‚:”n«óēĻkéŅ„uĪGGGĖf³iŠ AŠ t3/ł¹,‹¢¢¢Ō®];õļß_­[·¾¬÷ė­·d±X4kÖ¬@æ \Åč!fµZÕ»woõīŻ[½zõRLLŒŽ9¢?žX†aŗyuœ:uJ‹-Ryy¹_ĻuĆ 7ØU«VŹŹŹŅŖU«tņäÉæŠTō€ ÕŠ”CŻĒ†ahŊ*..VqqńeļQŃTß’}³žėĄŚŗu«6mڤ»ļ¾[!!!-v/ ©Dą*äźbµVwģw8ڳgŽ?®²²2EEE©cĒŽ4h"""$Iv»]ß|órssåp8Ō¶m[Ż|óĶJLLō«Ó4µxńb%$$häȑڲe‹Ī;§„„ >\ÉÉÉZ½zµrss%Iļ¼óŽRSS5`Ąæž©wļŽ:xš Š‹‹•ŸŸ/›Ķ¦œœķܹS²X,JNNÖŠ”C•Pļ½*ćbµZuāÄ mŪ¶MeeeJLLŌ°aƔœœ,IÖqņäI}ūķ·***’išjŻŗµRSSÕ”C撍ՁĄbČ XUU•¶nŻŖ­[·jĖ–-śšĆU^^®:(!!A¦iź£>ŅŽ½{Õ½{wM˜0A PVV–Ö­['©:@Y»v­²²²Ō£G }Z§OŸV~~¾Ś·oß`UUU2MS*--Urr²&NœØŠŠźŸŠ999¾Ėøøøė@ąń—€ ×/~ń IŅīŻ»µcĒŁķv÷gׄ¢EEEśä“Oj• UII‰{ˆM«V­Üß 2DC† ‘$9r¤Ń:RRRÜĒ®”#V«UŃŃŃŖ¬¬TUU•; hÓ4uöģYIR||¼ ĆŠ¶mŪtģŲ1•——»Ć×µ¾ų[&,,̆HRll¬NŸ>­ŠŠŠFėˆŽŽÖ˜1c“k×.mŪ¶MRu€Ó£G :ŌÆæGJJJƒuø‚\Enŗé&uķŚÕ=Q©7×Ü(¦iŖ°°P¹¹¹ ÕØQ£$É@Ųķv?~\ĒŽSDD„.\ø ¬¬,uė֭νü)cš¦¬V«>’üsuļŽ]gĪœŃ™3g«””ååå5XGLLŒ6nÜØvķŚ©{÷ī’äī­¶mŪ6ś.‹ŠŠ“aƆzė@ąˆĄU¦{÷īŚææ •žž®Ž½{ė¶ŪnsÆj’‘‘”°°0„¤¤(55ÕdL˜0Aß|ó222äp8”œœ¬!C†ø{4ųS‡?zõź„āābeff*::ŗŽ@Äsn”ČČHuéŅE p÷VéÕ«—ņņņ”——§ŅŅRõė×O}śōŃęĶ›µsēNué҄νü)c†bbbtć7jūöķ*//WJJІ.«ÕŚhÓ¦MSß¾}uųša÷D«ńńń=z“{XQcļ²]»vÖĄ²4³ŒÅ£lØĒ.)BR¤¤(Iђbjö]Ǒ׸®0Mó‰@æ Mē=׃ƹź›"eßųėĶ{l¾ Ɛį4dN†!ÓøøoΚļŖ÷MÓŌ?—/×#Ož>Ąoųį³X,/K:/©²fsķ—×ģ—IŖØ9vķ»®sHŖņŲ$ÉōŲüĘ,. čˆ€ C ‚:" čˆ€ C ‚:" čˆ€ C ‚:" čˆ€ C ‚:" čˆ€ C ‚:" čˆ€ C ‚:" čˆ€ C ‚:" čˆ€ C ‚:”nüPģŻ»7ŠMŠBDĄOmŪ¶ t“†Ģ€ C ‚:" čˆ€ C ‚ą²ųӟž¤3gĪH’ģv»ęĢ™£ŅŅRIŅŁ³gõĢ3ĻŌ[¶¤¤D/¼šB ”YŽ;¦¹sēźąĮƒõ^³téR:tČÆśŹŹŹ“hŃ"æļęĢżę7æŃ‚ “`Į=÷ÜsZµjU‹=ŸÓéŌ£>zł^ąB ø,zöģ©Ć‡K’>¬öķŪ+##C’”‘‘”^½zŗ‰ ŗpį‚.\Ųär7nԌ3ōÅ_“H;Zµj„ٳg7©ŒĶfÓüłó5ž|=żōÓ:qā„ŅÓÓ[ä¹CBBÖ"ĻH”nąŚŌ³gOmٲE#FŒPFF†ĘÆC‡)55UJKK“išZ±b…Ī;'IŠ×Żwß]§®>śHGUxxøœN§ĘÆė®»NĖ–-SYY™,‹"""4sęL9rDŸ~ś©āć敛›«®]»Ź4Méܹszä‘GŚč}W­Z„£Gźƒ>Š]wŻåó^!!!µŹ”””Ø  @Ɔ Ó×_­¢¢"%&&ŹįphńāÅ QTT” $UCµµ¢¢Bƽöšžzź)eddhƆ ŠUyy¹ŹĖĖ5o޼ ‹Å¢N:©  @v»]K–,QXX˜*++Õ¦MMŸ>][¶lѾ}ūdµZ•˜˜č~ī£Gźž{ī‘Ķfә3gōÖ[oé©§žRddd ’½.=D—Åõ×_ÆcĒŽI’Nœ8”Aƒ)''G’täČuļŽ];vģPHHˆęĢ™£9sęH’vļŽ]«žƒ*''GæłĶo4gĪĶ;W×_½¶oß.«ÕŖ|PsęĢQTT”¶oß.‹Å¢ŅŅRŻ{ļ½züńĒõÅ_č'?ł‰fĻž­„„?~ÜÆū>\;vŌ”)Sź½—·Ķ›7kŌØQ’¤[n¹E›6m’$mß¾]m۶՜9stß}÷Én·K’_mõd±XTXXØ{ļ½WsęĢQ«V­”••ÕąßįģŁ³Śææŗwﮘ˜Ķ;W³gĻÖ¼y󔕕„ĀĀBY,Y,=šĄµž{̘1ڼy³$iėÖ­9r¤$)"""Š’^—Œ"€Ė",,LmŚ“ŃįƇ+«ÕŖ„„edd())IįįįŹĶĶUfffƒC4N:„N:Õ9ŸŸŸÆŽ;ŗm6›NŸ>­¤¤$„¤¤HŖŽ«ÄÄDIRTT”‡_÷õē^žœN§vģŲ”ųųxmٲE’TTT¤‰'Ŗ  @mŪ¶­UŽ„±¶z³Łl²X,’¤ŲŲXŸ×äääč/ł‹,‹bcc5}śt„¤¤ØØØHĖ—/WLLŒ,‹Ī;ē.ļŁ>—žżūkõźÕŖ¬¬Ōžżūõä“OJŅ5ŃC„@pŁōźÕKėׯwĻҽ{÷ZĒ6›Mv»]3fĢØU®¤¤Ä½ß¾}{}žłēuźNII©Õ;";;[]»võ«]õŻ×›a~ßk×®]źÓ§¦L™ā>·jÕ*ķܹS‰‰‰ŹĻĻ—$™¦©ģģģĖśŽm6›{ģ±:ē·lŁ¢=zhģŲ±²ŪķJOO—iš’$«õā ×s‡„„(55Uļ½÷ž®æžz÷МĒü²¶’J`Č ą²éٳ§ŅÓÓÕ½{wIR=tąĄõģŁS’”šš*‹Å¢×^{M‹/Öāŋk…!®::w_~YƾśŖ^}õU„§§kŠ A2 C .ŌĀ… åt:•––ęW»ü¹oėÖ­uöģY-Y²ÄÆ{mÜøQ7ß|s­s7ß|³>’üs >ŽD\I7Żt“¾łę½łę›ś÷æ’­jåŹ•õ>·$5J[·nuŗpį‚ęϟÅŪŽŅ,Ķ,cń(ź±…KА))JR“¤˜š}×q¤Ē5®ė#LÓ|"Š/@Óy’Øóõ#ƾ~(ūĘ_hŽcóe† §!ĆpŹ0 ™ĘÅ}ĆpÖ|W½oš¦ž¹|¹¦ß÷«æmąŹĖĶĶÕŹ•+5o޼©Æ]»v/K:/©²fsķ—×ģ—IŖØ9vķ»®sHŖņŲ$ÉōŲüʐąÓśõėµwļ^Żwß}nJ‹#>?^ćĒt3. ęA‡@†ĢZŌ™3gōģ³ĻŖC‡µĪOš4I7ÜpC ›× ²²2½ū={v‹Ō·téR 4H7Žxće½÷…ܾ¹P”mŪŗĻEŽŠSQ©i*łæ•0żž&Õē8–„ņŪ•š³»k7ŹķĶŖļjD hq6›MO<ńĆ[L“U«V-†\é{‡µļ Ö³ź–÷;¼øpAÅļÆPŒ{%IKŻ…i­Ń1×D"ˆ® ^xA³fĶRrr²ņņņōæ’ūæzā‰'“bÅ ;wN’Æ»ļ¾[[¶lѾ}ūdµZURR¢{ī¹G6›MgΜŃ[o½„'žxBĖ–-SYY™,‹"""4sęL9rD6lPll¬ŹĖĖU^^®yóę)44Ōē}<•””čµ×^ÓSO=„ōōt­^½Z‹EwÜqG­Ž-v»]K–,QXX˜*++Õ¦MMŸ>]‡C‹/VHHˆ¢¢¢TPP IŹČČŠ§Ÿ~ŖųųxåęęŖk×®2MSEEE:wīœyäUTTøļ‘‘įóĀĀšō¾²R½³DIsę©üėÆd”—«ÕŲń*żdB[+zšĶŸżÓuįä÷*żd"zÜ gY‰J>ü@Fi© G„ZϜ%£ņ¼»¾Źļ2T¶ńSIŎ»Uį]»śß«ID-.''G ,ØuīŃGÕ°aĆ“mŪ6Mš4I_żµFŒ”;v($$DsęĢ‘$-_¾\»wļ–Åb‘ÅbŃ< ;wjóę͚>}ŗ¶nŻŖ‘#Gjūöķ²Z­zšĮ%I+V¬ŠöķŪ•””¤ĀĀB=ōŠC²X,Z“h‘²²²TRRāó>żū÷÷ł éééŗłę›ÕÆ_?wˆā£¹sēŗŸ{ī9źąĮƒjŪ¶­¦N*IzöŁg%U÷¶(--ÕÆżk9N=üšĆzöŁg•˜˜ØÅ‹ėųńćjė1ÜÅb±ų|†††]8•­‚EÆŗ£ QÄõŻ/ß<\ÅļžCåŪ¶ŹY\¤ŲŸŽV«|ōĄĮrž-PģOo“ćX–Œ2»ā~ń+ÉbQń{Ėå8ł½B“/¶Ńń]¦¢ś§*ņʞr––ś_®ÉD-Īf³ižüłuΧ„„éĻž³næżvķŻ»WO?ż“>žųceffjįĀ…u®w…żū÷×źÕ«UYY©żū÷ėÉ'ŸŌڵkÕ±cĒZ÷<}ś“’’’d³ŁÜC>bccåp8”››[ļ}|?~¼V®\©ÆæžZ?ūŁĻj}WTT¤åĖ—+&&F‹EēĪ“ĆįPAAA­`Ćf³¹÷SRR$I!!!ŠUbb¢$)**J‡Ćē;ō~††ų2c”•Ö:Ž3V’ó’~ō›łjLhŪ©ęžÖØ(™Ž µ¾>R„Ÿ¬QÅ®Š»ķæŽéՄ@pÅDDDØcĒŽZ·nŗwļ®ššpŁl6Łķv͘1£Öµ[·n•ÕZ½8jHHˆRSSõŽ{ļéśėÆWXX˜RRR”••å¾>;;[]»v­÷Žõݧ>'NœŠ=÷Ü££GjƆ µę÷Ų²e‹zōč”±cĒŹn·+==]¦i*11Qłłł’$Ó4•čW~‘aØō“5J¼ē*Yūjż‹ū݁‡$É"Étś]]UNŽāļ˜,lj²ołņ7· ÅåääčÅ_¬unŠ A3fŒ†®—^zIO=õ”$)55UGŽŃkƽęž#ćē?’y:G„'Ÿ|RĻ<󌻾ļ¾ūĪŻć#&&Fiii:räˆĻ6ÕwŸøø8Ÿ×Ÿ?^ūŪßdµZ5vģŲZ߯tÓMZ¶l™Ž;¦ččh 8P+W®ŌģŁ³õĘočÕW_Udd¤āććešf‹½WĆ0ōč£ź•W^irٲ ėŁė&Eō섪¢B•mX§Vć~źž>$>AU…:÷Į{Š0°ŃśĢŹó*üß·e±Z3tx‹=ć•bif‹GŁP-\R„¤HIQ’¢%ÅŌģ»Ž#=®q]ašęośau~ģłśńWßĀ@”}㯠4ļ±ł2 C†Óa8e†Lćā¾a8k¾«Ž7MS’\¾\ÓļūU€ßvpĖĶĶÕŹ•+5o޼@7— ]»v/K:/©²fsķ—×ģ—IŖØ9vķ»®sHŖņŲ$ÉōŲüFĄUożśõŚ»wÆī»ļ¾@7ץUoüųń?~| ›kˆ5Š AÆå&Zń:—;¹ā @cč!‚øŚµųV™€¶wļŽ@7øāśöķŪÕ\±©7.%1%Y®TCą‡¢…~øŒ®Ä³ž}łq'²‚fē Ģ!®¤«¢SÄå DL?ŽÆŠ®8Ók“üaŅb.g‘śBļ$ ø5†\–Ü „‘ś‚ ‚P€ą`6į»Ė–“t‘śB_½BLŃC€`äϐ³2—ģR–ŻõlÆŖ‘óõ=4\VūĖ‚@7į²;yņ¤,X öķŪ»ĻõéÓG?żéOŻ“F;vL ,ŠÜ¹sÕ³gĻ­;33S_~ł„žó?’³YåOž<©•+WŹįpČįpØOŸ>š8q¢¬Ö–éoP_ū¾’ž{½ōŅKźŠ”ƒ$)""BwŻu—:tč 3gĪčŁgŸU§N$I•••1b„FŽY§ž‚‚żżļWrr²fΜŁ`[žēžGQQQ>ßÕŚµkučŠ!Y,ŻpĆ š0aBSÓTż%.uŠßZ"ń÷ė;o“ă€æyņ÷M.óņŸŸ t³›¬sēĪzģ±ĒüŗöĀ… zė­·4gΜ@7[7nԌ3ōÅ_“x "I‹„YåŹĖĖõśėÆėĮTĒŽe†Ž~ūmķßæ_}ūö½ģķėŅ„‹~ųaIÕĮĢ믿®ßžö·’$›Ķ¦łóēK’ĪŸ?ƧžzŹg ņłēŸkŲ°aśī»ļlĆW_}Uo;Ž=Ŗ¬¬,=žų撤æżķo:v옺téāļ#šj8‘®ĄČ’ĖˆŌ÷Ą†×§k®˜ā³y~_[Q^č궘}ūö)==]wß}·$é­·ŽŅˆ#“gĻ=zT|šīŗė.-[¶Leee²X,ŠˆˆŠĢ™3uäČmŲ°A±±±*//Wyy¹ęĶ›§°°0wż†a4»¬$•””Ø  @Ɔ Ó×_­¢¢"%&&źąĮƒśģ³ĻŌŖU+•——Ė0 Ķž=[UUUZ²d‰ĀĀĀTYY©6mŚhśō钤>śHGUxxøœN§Ę/I:wīœžńؤ¤Dēϟ×o~󅆆jŊ:wīœ$)>>ŽżŽ\öļ߯^½z©cĒŽ’$«ÕŖūļææĮēNOO÷ł¾»wļŽ¤öyėŲ±£śöķ«½{÷Ŗ{÷īµŽ’‰'”’’āóļ?uźT„§§7ų?RPP mŪ¶iźŌ©śģ³Ļź|ųšaõļßß}ÜÆ_?>|ø)ˆwą\‘N-ˆ˜—°ˆ@ ūžūļõā‹/ŗGŽ©ččhŸ×>\łłłš2eжmŪ&«ÕŖ|P’“bÅ mß¾]III*,,ŌC=$‹Å¢E‹)++K7Üpƒ»žķŪ·7»¬$m޼Y£F’$ŻrĖ-Ś“i“ī¼óNY,jīܹ²Z­zļ½÷“}ūv1BsēĪu—ī¹ēTXXؼ¼<åääŌ 233UVV¦‡~XV«Uo½õ–²²²TRR¢w™åĖ—k÷īŻµ~ų)))Éēū«ļ¹cbb|^šąĮ&µ/**ŖN®w*I999śĖ_ž"I*++Ó°aÚżóĪ;ļhƌr:>æ·ŪķjŪ¶­ū8::ZyyžŒņ€ų»µ˜K DkŒæaCf …ł2³oß¾FĖåēē»{AHÕĆ1NŸ>­¤¤$Łl6÷PŠŲŲX9Ž+ėt:µcĒÅĒĒkĖ–-’ŖCˆ‰'J’:uźäž«£]»v*,,TQQ‘–/_®˜˜Y,;wN‡C§NrĻ©įĶf³¹ė‰ŽŽ–ĆįPnn®233µpįĀzßK\\œŽ9ҤwV_Ɖ¦¶ĻW ręĢ÷=m6[­æõ›o¾©={öØ_æ~ž½=}öŁgźÕ«—l6›Nž<éóW/»Ż®ŲŲئܦ¾^!ž„ -ĻŪ$Ķ DLIē¼Ģ×Ų×wNc£ęp™…‡‡Ėn·K’LÓŌ©S§ÜßFuēż””eee¹Ļggg«k×®~Õ)ewķŚ„>}śhŹ”)īs«V­ŅĪ;W«­yyyj×®¶lŁ¢=zhģŲ±²ŪķJOO—išjß¾½>’üsæß‹Ķf“Żn׌3꽦oß¾śšĆkĶ—±råJuīܹŽē®ļ}7µ}޲³³µoß>Mœ8±V8įéĀ… M®·¬¬LŁŁŁŹČČPEE…Īœ9£Ļ?’\cƌq_Ó³gO}ųį‡1b„$i÷īŻšßwĻž=›Ō>éāź;†aČjµjΜ9Љ‰Qyy¹rrr“`AõźIUUUźÜ¹³»].N§S/½ō’ģv»ŹŹŹ“`ĮM™2E;wÖ£>ŖW^yEwÜq‡ūś“'Ojżśõ3fŒ Ćp_Ó¹sgõčŃC ,ÅbQŸ>}jõŽńƒ«c„kó5—ˆÆŃ$-:ŗ¤ySėJžė …Ø:X ‘^³EHŠ”%)ŗę3Ņc ÷ŽLÓ|¾% Ą•ašfƒĒõ TŁ7žŗ@<łūZ“Ŗś EnP=L£ųlž*ŹĖōĻåĖ5ż¾_]™—Š::¤;v4ŗT,®~ķŚµūƒ¤JIŽšO×~…¤ó5Ÿ®Ķ^sĪuCÕ!J•j6irG‹–Y(ł¢†ę ńćōŚÆŗ¬oąŻÄ3 Šā\a†ēؑ*ÕĪź›c¤Å47©ÆŪJ}AˆÓǾgĀ"ŹŠ†\n¼ńFz‡\;œ>6Ļé5¼ƒ‘¦L“ź·–šC¤± T]H•ŖC˜šOKĶ'=Dœ+! .« [•×ę™!x‡".-2iKNŖźŁHļį1UŸ!5횿ĢęĻe-Š0øģŗˆ8t1 ń H¼‡ŌųZmę’\J Rßņ»ŽHUĶ}ŗŲ+„€ąT„‹”ˆ÷§woļ¹D¼5{^‘–ģ!Rßä©®”Ē‚øėł`pEōķ?@/’łYżüī»ż.óĻåĖÕ·’€@7øVøV–q!Ž”ˆ+qe ŽsŠ“ˆK D¼'6ńÕ;ÄŖŚ=CäU†@ĄÓĄ@IÕ!‡æśö žź<³-Įs©]ļ^"Ž=E|…!-²źLs‡­x–óœ$ÕŖź%DR˜¤ššć0Iūaß»>ý¾wÕźQwHĶfQķ „„—¾™Ŗ•Yļ‘#žC`\½?¼{‡Ty÷ī-āPŻŽ"®łE<ŪŌ$-¹ŹŒ”źpĀõéj¬t1@ńløē ó^™ĘuMØź®Lć‚X=ź·xŻ “Óǧ÷oy_ ­8U;ąh(üšµśŒ«>Ļ{^²– D\óƒx"Æk¼'C WŻ4ÉūåYU»‡ˆ+üp…!V‚p„ųŗāŻKÄTķ@Ä3ģØoˆŒĆćZļex›\µÉZ"ńœ ÄŠxöņóžįż0®—ęZ¢×5dĘ¢ŗ«Ō4“Z ! -Ćlą¼w(ā™ x/øāźā„x Ž=C|õB¹äP¤%W™‘ź›ńĻ"ßį‡w/ļ—ē91«ŌpBĄågśŲo(ńœ+ÄsˆL„.žöw]ēYĪ»¾ÓŅCf¤ŚCf¼ÆńoTߋ4t±gˆkī©nŅPpłx’Ī÷^QÖ»—ˆēĻ"ž=H<'Lu ńC:dĘ»g‡ē9WC­Ŗ½,Ž÷µ.¾zˆ„Ō<“ēŖ2Rķ`DõŌ.Æś::xŸ©ņųō\mĘ„8½Ž½WŖń' iV@ŅRsˆx÷ńl°Uµgƒõn¬ÆŽ!!ŗŖxĪ"±š W _ĮˆÆIV}-æėyĪ3 qõ qŖī0œśīŪd-9‡ˆg0ā|x†!Vė½W”ń|QV]\aĘ×|!ž†!„&4_S‚_s‰ųš\Õ3q7ä»wˆÆ¹H[DKOŖźŻ8Ļ#®pĆuĪózļ•iBtq2ÕĘę !ōąŹšgČJ}½D<‘†‚_+Ó¶Xār)ˆw‹|÷qq=µę3ÄĒĖņ|I¾z‡4§—ø| D\C_|õqŖī$Ŗ¾Āļū“H‘Ė1dĘÕĻ}OžēŁ#Ä3ńC|M¦z© —Öū¢”¢”ex›Ņ+¤”Uk›ķR_«Ķxgś8ē¹ē ņœ@ÕW ¢zīGøĄ•ÕŠšĻłD½CļdL5†4åž~ké9D|… ¾øĀļez->6©įž!„!\yĶ'ālxi,©ļ³E“T˜ŠPHaią³¾š£¾0¤¾6Špå˜~œ÷hųÓğ¹B.9iÉ ”±ąĀāĒē„ō!ąņkŹ0–śBłńŁX—¤„CzoXŁolāT‚®N …M]1Ɵ%~›ķr„ MéĮįoƒ+Ł~ąŸĘŠęōöšg8Ī%»\Ā„„ üšųX4'ģhŃ Äår‡ M©æ9m! pšVų[ę²!.W2Pø\+Ś€Ąk‰ć²† ž.lÜ®Xāķj%®öö€ś,𮐒 Uš³Ł|ƅ%tEXtdate:create2013-09-04T19:29:48+04:00ĻWŠ%tEXtdate:modify2013-09-04T19:29:48+04:00¾ 56IEND®B`‚apache-couchdb-1.6.0/share/doc/build/html/_images/intro-tour-02.png0000644000175000001440000024266412332105522024721 0ustar00djcusers00000000000000‰PNG  IHDRD8cµ<£gAMA± üa cHRMz&€„ś€ču0ź`:˜pœŗQ<bKGDłC» pHYsÄÄ•+€IDATxŚģŻy|TÕŻ?šĻ,ÉLöÉĀ’@Ł”°…UŖĮ"‚ Å]A«Ż+Żōéb ?«µ¶D[ūTZ5*ZACUDI (a ū–HH Ėd›É63æ?†{½™Ģ½s'™Édł¼_Æye2sļ¹ēœ»ĶżŽsĪˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆ|Bč ōšü‘S›^ ĖLDDDDDDŌ[ųc ‡›ļ”>S“V§ł28 ¶µ‡ŅߎHüQ"""""""rĻ›!…ærß)½÷“|Õ|Dš¦ˆkDś‚Ģ’Jłe „ˆˆˆˆˆˆØėyźŚ"q}ŽH”–­šŽŠŃ– Ņ—Vęs¹4”–ODDDDDDD]C)Pįä°£m Äī2Ņ24.ÓiŢČ)o‚ Ņ@ˆÖå½\`PnBDDDDDDD]CĶx!®Į»ä½ķƒ$Ņł42}¢³‘Žvq „č$ļ]ƒ#üU;žˆšļ‰ˆˆˆˆˆˆČ35c†Č ˜ź ±į레#~/· wA‘NH|ŻBD  q‘¾\ƒ#ŽŽ'BDDDDDDD]Ļ]Wį% ‚hÆ’oCŪėzį;i`Ä!™Ę§Ü:Qóų\éK‡¶Įi@D/ł+m%ā"Jƒ„Jƒ!Ņ ˆŽåµ­D”ņ@DDDDDDD¾”&č ×UF„×ų€üu»]į{Ÿ¶ńe@ĵå†4˜į:>ˆ“eˆš ‚ē ą]`„ˆˆˆˆˆˆˆüĒŻSfܵi½žr½Ī—¾‚&6—“¤ƒ°ŗ[f‡t4 "×mÅ]šĀ5";¤‘ |Ń»L# ¹\ÕŻ’DDDDDDDä?rŪu®×ųŅų0æŻ%Ma¬-Ś>…¦ÓŻfüŻBD(°0†ˆō% €”}PÄuUie±•Qą¹>eĘ.łėiq™Oąœ-H¤×łĀ|B`šį£w}Ńŗ¼w}œ®“µ‡k7w/׀ˆō¼®ƒµJ1@BDDDDDD䎚"Ķł–Cę3×@ˆŠ½EŚBDč ćnĢQį³V“ļāŗ i@¤Ó¬śś±»Ņ …ÜX!Āū`Éß É’®O›qķ~# øpL""""""¢®# @HĒ qm"}ܮ΀‡ĪqD\Æé„×ū®]f\_>ӑ€ˆFę3įsi«×Ö Įš(E:žˆ q3ćˆtŗėŒÆ®Į×"ŅĄˆėSg!""""""ź;‚%ļ„c…H!B,Įµ[M§»Ź|ˆŠŗł_ś’DÜ=‚—""""""¢¾A!z8Ņa8¤/)Ÿt›Ńv6“Ü­Vņ¹» ˆ»÷ ˆõ z|+ö*q ‘>ÄEJ£jI |q—žėĄ(®Żi„ g@„ˆˆˆˆˆˆØoö"Ńŗ¼w÷ō¹ H§t61ĀēŅQb] $m%¢ƒļ3DDDDDDDŌ=IĒ⮽L÷ä•źT+_?eĘŻ_iÄõÆ“š>”Óé0cĘ Lœ8żśõƒŻnǵk×pąĄģŪ·G§¢ķ°’ųĒ(--ŦM›–oDDD ®®ĪļĖłß’ż_ÜvŪm²ßoŪ¶ æžõÆ»¬Üćʍƃ>ˆo¼±±±°X,(..Fvv6žūß’ŖNēwŽĮ™3gšģ³ĻvYމˆˆˆˆˆz×F@ۆҮ­C:ŻUFŠ™€ˆFę3iōĘõ½P0×čO":+V¬Ą!C°gĻ|ņÉ'Šh41bīŗė.Œ=ļ¼óģvŸ<²Ųk[·n…Õj Ȳ;"$$!!!øzõŖ_—ó׿žļ¼ó )) ’ļ’ż?dffāȑ#³Łģ³eżä'?Acc#Ö®]ėöū)S¦ąÕW_Å®]»°zõj”——#22·ß~;žyęDEE‰yõäÕW_Emm­źeõ®-A¤1 äc rqˆµ|šåcw]ßkd^®-D܍Ū!³fĶĀšįĆńü.\??{ö, ńČ#ąę›oF^^žŠķ³gĻd¹uõźU¤¦¦Šļżåāŋāū¦¦&@qq1 |¾¬o¼”ż~Ń¢E(//ĒSO=Õ&pvģŲ1X,DGG«^ÖŽ½{½Z6Q!t—qכį pwč fź¹Qé“3fąŲ±cm‚!‚“'OāĀ… ˜1cņņņš“ŸüUUUX·n8̓>ˆ˜˜¼ņŹ+Šh4øķ¶Ū0yņdDFF¢¶¶ū÷ļĒĪ;Ån7ųƐ)S¦Ąjµ",,L1M×.3ž–ńŪßž{öģĮĪ;“&M²eĖšŽ{ļ!??pė­·ā–[nĮsĻ=ē—YYY‰¤¤$ž ŠØ”Õjńč£āī»ļF’žżqõźUdggćĶ7ß×ɤI“šĆž7Üp4 Īž=‹æżķoČĻĻLJ~ˆųųxLž<&LĄ~šƒv˰ŪķØ««sۊčµ×^ßGDD`ēĪųõƍmŪ¶–.]Š_żźW˜”C‡B£qf[£Ń`Ų°a8yņ$`īܹ˜5k¶n݊^x[¶lĮ¬Y³0gĪ1=›Ķ†›o¾§OŸĘŽ;<¦éŹÓ2 Å` 2UUU™™™8uźī¹ē,[¶ GŽĮ+Ƽ‚ČČH,]ŗUUUxć7š“ŸüÄķ2¶mŪ†‘#Gāwæū]›zī,wĖöT"""""¢ī¦„„'OžÄɓ'QWW‡––įܹsŽ$ć®Uˆ\ WrÆu4”Qxļ.Óī ¤…r!½Ø©©‘¦ŗŗZœöĢ™3 /ņ „ŠŠPœ:u ĮĮĮøå–[°{÷n9ruuu(((Ąž={0sęLhµĪj³ŪķØ­­ÅgŸ}†¢¢"Å4]©Yʅ ˜˜(Ī“œœŒ“ ˆœ?¾³Õ'ĖjµŠ«2(Šxė֭ƧŸ~ŠŹŹJģŲ±ėׯǽ÷Ž N‡ÄÄD„††būöķ(++CYYžś×æāᇆÕjEss3 µµ­­­n—“——‡gžy'NÄūļæ>śĻ>ū,.\ˆŠŠŠēßuŁjŹCDDDDDŌX­Vœ:u %%%€žżū#!!€³ÅHAAŚq3Ż5”Pūr§C1>īÖ]†ŻJ“šA@Äf³pĮāŋ±lŁ2deeAÆ×ć©§žĀG}„o|ć]V"""""¢ī¢„„b/‚äädÜpĆ øį†Ä Hyy9Nž<©öśKnŠTŸ=Eʍ!ā® ī .ĀÓ<”½4™Lœ­Hģv;Ī;‡aƆį‹/¾ĄšįĆqśōi8±µÉO<į6ššpq#Fæ”Ņt„f.\€ÅbAbb"Z[[QVV†śśzTTT )) aaaØ­­EEE…OWVw²Oh‰Å… šŲcį‘GAzz:~šƒˆ­D¶nŻźõ2/\ø€ .`ćʍ Åļ’{<÷Üs˜?~—•‡ˆˆˆˆˆ(ŠjkkqźŌ)ńŗ{̘1bDų?$$ÅÅÅØŖŖĀ¾}ū0iŅ$„„„Č%©ńņ½_ųć)3®ŸĖ=Fnš©©©AEEnŗé&٧Ȍ9WÆ^WāéÓ§1ž|čt: :ļ½÷€ÆŸtņśėÆ£“““]:²łKӕše8q»Ż.>åāŋ&pvazžłēa³Ł0bÄĖˆŠŠĀŽ;°bÅ ·ß§¤¤ŖŖŖ`±X`·Ū&~ÆfŽ”‡ˆˆˆˆˆ(ŠöķŪ‡ŚŚZ„„„ %%Åm0D€””„„„ ¶¶VĶx"rcBÅgę.3äÄ'…ŗ©<šĄųā‹/Ä`Ĉ#0sęL`ß¾}āōuuuørå n¹å‰­6ššš°wļ^Ģ™3µµµ(..FXXn»ķ6čõz¼żöŪ²yKӕŚeböģŁ Āʍ8·ß~;ŒF£ß[ˆÄĘĘŠĖ äcw- 6n܈Ē×®]Ƒ#GĒ{ ƒ?ūŁĻ0|ųp¬Y³/½ōöģŁFƒyóę 8[^Œ9ƒn׏£¦¦}ō¾ūŻļ¢_æ~ČĶĶEUU"##1}śtÜ’żųšĆQVV&®›łóē楁3f ʎ«X×e{*Qw‘’’"׌£ ((V«UizO½I<=ÅÖ'|ńfÄWŸ·œƒ„¾óĪ;˜6m&OžŒiÓ¦ĮįpąźÕ«ČĪĪF~~~»ńŁ³g·ÜrĖ–-°Z­X°`"##ŃŲ؈óēĻćĆ?ō˜¹4]©YFii)t:šššPUUĄ9PĮ`€ÅbAee„/«°ŲŲŲ€C™™™Ø««ĆŹ•+ŃæŌÕÕįĄxé„—8[=’üóø÷Ž{ńä“OĀn·ćüłóųŁĻ~†āābĄæ’żoüčG?ĀŖU«šŲcµ[Ɵ’ügœ:u wŻuV­Z“É$®—’żß’Evv¶8ķ’žļ’ā7æł 6lŲ€={öąŸ’ü'~’ūßC§Ó¹mEäŗlOå!""""" “Y³fy=OLLLG„¦„ˆOud®Q½ä ĄĄ @Øä%ü/|o¾RSSŸņwaÉ;ĀÓdŗC0„ˆˆˆˆ(„–ŁĀMJ"ź8F“  @“äo +€É_į½0m3€VÉ ’—j]õ”ꁬV+źźź """"""ź½ü>¼† ŖŖTæt—!ßc0„ˆˆˆˆˆˆz«®ˆ©Ńe'!""""""¢>‡"""""""źs!""""""¢>‡"""""""źs!""""""¢>Gč ‘²Öc'਩ń8&* ś±7dŁŽŗi `2ł4MƙĶh9~2°yčŗÅŗDˆˆˆˆˆˆŗ¹†’y­y{Ž:ØŗŒć'NĀÄI©žŖĀ^M3x0"žļåÓ !ō~ކ<člPč6"""""¢® CV>żŒźy2’ų,`ö7:ū=ŠįūO üéŸu»V!JŒwĪCC” Ø1:+äg ˆQŸ"Cl­-°Ūķ°Ūl°Ū[a·Ł`sł_ųžžūīÿׯg@D%mJ "žļeŸšŚ%L&ī_†¦’[蜐Ÿń±»DDDDDDä3!’óKDļž¬gC® żĮĪu¶!"""""ꔂ[ŌŚ,žÆk¬÷ł2Bėa³ÖzœNwĖ-нł:“I‰®–NÓ&%"vö 4nł4ŠYń™†Č@g”Ūa@„ˆˆˆˆˆØ‡ŅŁm06[æžĄÖÜńÄdٚ$]†+“ Xµ X¹Ņ÷ĢĻęĪĢfļē]³¦}ž22€Õ«U'aō}‰†‘öŲe†ˆˆˆˆˆčŗØčø@g”gIO »_0~śS`ŊVuw ˆŠDĒ tVŗ?“ ųąēĖOél0D•LžÜłtØWb@„ˆˆˆˆˆś¼ŠšØ6’ĒöOt–ŗÆ•+­BŅÓż“¾Æ‚!Ņō&Ntž%’ą"DDDDDŌ§CĆÜ~Ž/~0ŹKŠ½ī#9xóM -ĶĖšu0DPTäLwĀ’åzDˆˆˆˆˆØOk“4Ąno…ŻfƒĶn‡Żf’·ŪķĪ^÷°j•s@RņW0D`699ž-õ( ˆõuu¾OÓ_ć„H -88Öu!Ž!BDDDDDŌ[äēū¾%‡æƒ!f3š­o1B]Ž-DˆˆˆˆˆØĻ¹rń\ ³ą?«W;ĒłšēX¾b6;[†pĄS DˆˆˆˆˆØĻł÷śõĪ‚-^ģ|Œæ[wtƒ!` ˆQŸ³ņ—’ćõ<™/¾čl«g6;ƒ";w:'ņłc0„Œ"""""ź“ZZša·Ła·;Ÿ&ć°żŽn·]’ĪłŽįp:»ŽĖÉ23•+“¶ ”n‚ƒŖõF©©ĪA{ †P7Ā"DDDDDD½Ej*šąƒ@z:œčÜ“Å`u3½2 b±XŸŸk×®”¢¢‡~żś!55”””Ī"ė„›0›Ķ8qāŹŹŹpķŚ5@æ~ż0pą@Üxć0uēAØČgøoQÖƒ R‹3BŻJÆ ˆģ޽'Ožl÷yEE***pņäIŒ3·ÜrK ³Źz °/¾ųķ>ævķ®]»†‚‚¤¤¤ąę›otVɏøoQO¤MIńže0,œ$%:;ź<ł¤s\“īhłr`Ń"ą÷ægЦéU‘÷ß_¼»«ääɓøvķ–,Yč,w ֋ū:Z„()((@YYYŸØ“¾Čuß AXX ””V«@ߌ7ˆˆˆØū’A“=%"•žīą533Š9qJM~ō#g¾„–įiiĄŠ@vv sG] × Ŗŗ{÷īvż::ĪķōŲ½{w ³Żåõ‚ččhÜvŪmøķ¶Ū>U/_|ń…Ŗ`ˆąŚµkųā‹/mņ1wnj°°0L™2S¦L#‚¾°oQ÷µīuDļž !ß¼gCkÖv°W“É”),p¶ ‘v“7™€>V­ h5Q×č-D,K›&ļ6l‚ƒƒQWW‡ąą`477Ćf³µ™ļäɓnĒ(..ʋ/¾ˆ~żśZZZ0{ölĢ™3Ēgy~é„—`µZńĢ3ψŸåååįŅ„KHJJĀ„K—pß}÷ł“^BBBÉ“'#<<0cĘ 8pŚÜ ÷U½eźlYžś×æbΜ93fL§Ņ1›ĶķŗÉL:C‡móYaa!öķŪ'ž_PP ;¦ČW_}…;v@§Ó”±±Ó§OǼyópęĢlŻŗ?łÉO:•g%’ųĒ?péŅ%X,Ųl6DDD )) ?žøOŅļŠ}!\÷ ĶfCdd¤ųޕܾeeex÷ŻwQQQ½^É“'ć®»ī‚VŲø³æ·"""ź"½il»‰ƒ¬v•ōtą‘GœÕČČpŽĒņӟvm>©KõŠ€H¾KƖ–ÄĒĒcüųńØØØ@QQ***ŠŅŅ"^ōKēu76Ą€Ä`ECC~÷»ßaĀ„ ˆķt~/]ŗ›Ķ†ššpœ>}£Fņ{½DFFbĄ€3f L&ŒF#Ąh4bśōé8yņ$ŹĖĖQ[[°zé tū™ÉdBtt4 ŗŗZvŗŪn»­Ķg xļ½÷°zõj„……”±±Ƽņ &NœŲ%å.j·mŪ†ŹŹŹžZZZ™™‰_žņ—ķ¾ėźu®”_ɗéŚŅŅóõ^KK‹ģ¼®ū†ŻnĒßžö7,\øS§NESSÖ®]‹cĒŽaÜøq-Wl#DDDD^INŽ|Ó9ČŖ? ƒĶŗ¶Qkłr %ųÖ·€¢¢.Æ&ņæ^ŗ?čt:Ō×× ƒxį‡Ė—/£øøõõõØÆÆļžŖé:†øø8TUU”¤¤_~ł%¾ūŻļ^yåÜqǰŪķųüóĻa0P^^ŽššpüčG?r{wųóĻ?nj3ŒœœæD¤eī ĖIJJ‚Åb"ŽÖKll,>üšC\øpv»ńńńøēž{ŚLŸsēĪA£Ń`šąĮųö·æ††¼žśė°ŪķhnnFJJ ęϟ»ŻŽ7ŽxUUUˆ‰‰Acc£OźÄģ&ŗŪŚŚŠżū÷cöģŁ€żū÷£µµUÕ¼BĖ#‡ĆĄ`zź©§Äém6Žxć ”••!""?üįaµZŻ–łŅ„KŲ“i“ŲĶėĒ?ž±Ū:Õh4ŖŹźnŽĘĘFdee”±±v»įįįxųᇱ~żz”””`Ɔ ø÷Ž{;µĪOœ8Ļ>ū ”””ج¬DLL {ģ1čõz·Ū€k¹ĆĀĀļ,Z“Čm~„ݼ:BŲ¾…1C„ćĆį€ÉdBcc£“ ‚N§Ēq·oœ8qįįį˜:u*ēńēĒ?ž1ąčŃ£nIIIŖÖ…»:;pą<ˆÖÖV\¾|‹-ĀŽ½{QSSƒ_žņ—ŖėĒŪ‘*žOÄdr¦ż£ł¦kNj*pč3xÓ]„„ė„CF£ųź×ÆNœ8ęęf±„ˆšĮF‹ŠŠpķŚ5 4ēϟw;V«Å¹sēšģ³Ļ",, ųĆPTT„aƆµ™®¾¾GŽĮ=÷Ü­V‹’üē?Ø®®['ų«^źźź°oß>DEE!%%ƒ\½zØ©©i¼ń¶^N:…²²2<łä“œĶō=*N{ņäIœ={æųÅ/žóŸqģŲ1Œ;VģRāp8š«_ż ·Ür Īž=‹††<õŌShllÄÆ~õ+ŸŌ‰\ §ŗŗ‡ß«W%##£FĀ7ވI“&‰¤—/_ĘO|øŪ2ėt:œ?O=õ’’’dėtüųńĖ)7occ#BCCńżļ€óbŻl6ćŽ;ī@YY™Ē ]5ė<88ÅÅÅxī¹ēŠ—_~‡FXX˜Ūm &&¦M¹KKKż|õÕWnóŪŁ€ˆ°} c†DFF¢±±F£ĮĮĮĘŻwß-~V[[‹żū÷ĆjµŗŻ7ŹĖĖŽī=zŌ㺐Ūo“Z-ŹĖĖńŪßžļæ’>8€'Ÿ|’ūßqöģYU­Rüµ©¶f pų°o ééΧÄ,_īū|šLĄĪĪĮV³²ŗ²†ČĻzE@ăAÕtåååxöŁgŃŌŌ„¦¦&ń¢VIRR’8MLL ŚM³k×.Œ?^ģ²2yņdģŚµ ‹-ņk¹…–€³UƒŠā¢¹¹555b˚ŽÖĖ… P\\Œ5kÖ“YŽ °°#GŽ[7ÜpĆ (..ʈ#°nŻ:466BÆ×Ćjµ¢¾¾%%%b0Éh4z}±Ł•īŗė.ÜvŪm8qāŽ9‚ģģl<żōӀÄÄÄ6Ū„ÅbASS“Ū2 ÓeõT§Jäę5j¶mŪ†×^{ #GŽÄ„ ŅŅRŸ­óąą` †ķŲ8ÉÉĪGł¦§;ßūŪ›o³f9#Ō+ōŠ€H\\œl‹†ĘĘF466¶é2#½ØŒ‹‹s;Ÿ0nBSS~÷»ß‰ƒiŗvW¼čśD”…Ąn·#77‘‘‘xžłēÅĻ«««±`Į‚.­5ózS/0qāD,]ŗ“Ķōyyy²ĖŠh4Ų³g4 ~ųĆ€ŲŻÄµī\’ļØ~żśÉ¶ōĘż0›Ķn[‰‹ŗjnnnót’uėÖ!??C‡u»Mȕh°sW§jÉĶūŪßž/^Ä©S§šē?’÷ß?¢¢¢dÓńv»Vźp8d»łŸĖ*M&“Ūüvvp]aßhhhĄžżūÅż866©×›Vęē磲²Ä.3¼®(N,WF°,¹²)­ izŅ]øÕWŪyÆeĻ—Ø]Š~ Ć÷Ÿ@ųž_ ³×u„§ŗ\ļ¾®jza€Ō““®ĻÆ0®Čܹ½f°UwŪ”œČ?@ŠĢĪ²ĻōŠĒī ŖŅąDSSĢf3._¾ŒąŲ±cØŖŖBMMM›éä.rƒóęĶĆʍ”””āÅrCC.]ŗ¤:ŸD’žżń›ßüæžõÆÅ× AƒÜāé«zńǼ®õ2|ųpˆQžć’hsGyŲ°a8}ś4Īž=‹”C‡Ājµ"&&€óI. °ŁlˆĒ… 8»]¼xŃ'uāī)1z½S¦LAPP‚‚‚0eŹńŽ»§y:„?żéOhjją¤¼¼\6 @¶Ģ®<Õ©¹y9‚óēĻcȐ!˜7on¾łfœ?Ęm:ŗĪ/]ŗ$¶B*,,DBB‚ģ6ąJš¹üv–°} ]`Ŗ««Q]]ݦu…Õj?ÆØØæs·oÜxćhhhĄ®]»Äķ ++ =fØYjė¬#ü±QēiūāMˆ“4Ļ¹MKs¶Š(,tž D0D Œ+ČĒ“OōŠ"©©©ā]鐐444ąŹ•+ج¬D]]“Z­ŪĒī ózrė­·būöķ8uźFމ<’üó8p †»Ż®źķēŸŽ;īø£ŻēsęĢĮ'Ÿ|‚™3gś­^Z­Vl58[ŠøĖ»·õ2zōhLž<žóŸ”Ńh0bÄ 4H jŒ=§NĀŸžō'Φ’cƌAæ~żš’÷øxń"ŒY³fażśõX¹r%8€^xqqq6l˜OZ‰Ü|óĶ8{öl›Ļ&MšŌ¦Ftt4&MšŌ汻¼®&Nœˆ+W®ą…^@PPl6&L˜€ŌŌTœ9sĘm¦M›ę¶Ģ÷ß›éFå¶NՐ›788ėÖ­[m攇‚Į`@KK žž÷æć{ßū^§ÖyMM šŸ’ü×®]Cdd$ʏ­Vėvp ņÄĘƊyłÖ·¾å6æånߜću÷Žu^Wz½O>ł$Ž}÷]lŻŗz½©©©˜4iø=f$$$ØZīźĢTm#DDDD’‘äę¶O$9ŁŁdłņ®éćäd`ūvēcy9®H„īqķēŃHęÕK^Į ŒB„»ž^ųß(™F˜Žąp8žRŸ…övļŽķöG§ÓÉŽÕ3fŒŪGĖö&®õ‰ųųxń‘©•••øråJ›1Fz{½|ńÅ(((šjž””·jļäɓرc~ō£:+ŠÜ3āāā0eŹΧ ¹v9ėķūQG©éī,ws+ó¾öŹKXłĖ’AKK3ģ6;ģvēx`ū×ļķvŪõļœļž½~=V>żŒOźL®ĖLČ’ü”’ósŸ,£Ē1›ć‰¤¦§:Gźdf:#Ż\eŌ€N§į«.3&@#€¦ė/į½åśūzÖė’ ļ…éš“J^ą¼Tė-Dą–[nĮµk׌]ĄČCāāāśÄ…k½ŌÖÖ¶ ~ōÅz¹łę›QVV¦źŃĀ€³‹ƒ!½»c†0¦ˆš^Ŗ/ģDDDDe22O|ģÖV®t¶Y±¢×Œ+ŅWōŠ1DK–,Q5Ųā˜1c°dɒ@g·Ė°^Ś[²d RRRfłrē{W‚CŁ*¤‹1 BDDDDDŌ‡ōÕ®3B«³æ^ÖŚZ·Ó\žū8ńƒŸ”„¦Ę’2™œćŠ¢„Øx3 ¦ī…1)1ŠUÕg° Q7a}įE„~śšä“@zŗ_–!t™ōŃ]Ü.SųĀ\śæ×e!Reė7¢¾ą&~ōoEuĶ“]‚† Aü!ˆæ’ۜĮ›Š=ūP÷%Ģy{Ńxér@믷b@„ˆˆˆˆˆØ;ÉÉq¾’“‘åĖ=Āé-”ėLŅ÷ tiżŖ®ą8NžąēØ?vĀ«łźĄ—ćfbāG’FDŹM]žo¹I]Įq˜óöz]r"""""źÓ~µGö»£»žbXTTä|¼īźÕĪÖ"«Vł4łĀÖ`ąs4dHąŹčG…/¬Aį½{Ģ­Tkm--¼#ž°J LŠ ĮõIM Ģy{QųĀG:"""""źÓfĪY ūŻÕ’¢@g0›¬,ēėśœ¾Š[»ĪTē}‰³æZķ“@Akm-Nžšēh­©ķV­i‚¢¢ŠoĮ<“Ö8óGĆAU%JJJ°vķZ¼óĪ;°Łl€K—.aķŚµ(--õūņķv;Ö®]‹·Žz oæżv›WYYY‡Ņ¬««CVVV§ó¶uėVlŲ°v»½ĶēŁŁŁ>]ސ^ Ópe±XšśėƋļßxćvļ„Ģf3Ž}÷]Ł“ÜĶ£Vee%6lŲ ŗ|±n”ŹÓ­]»uuuŗnŪīī„ņJ·u_§Ż]>}7nDVVŽyē|ųᇸxń¢_–åi{śĒ?žuėÖįŻwßÅ[o½…Ķ›7ćüłóā÷ĀyB˜ęŻwßÅĒŒš®ųĶ|½}uöxŚ]ųsæćł¹cłP{®ķ)üyŒļ-¬õf4ŌV”Ž\ŚŖr˜+® źźeT\ńĻł S¼xĢ®½é©3-558ó« ŗėŸ·š8ūėÕ8ńƒŸŗˆķÄß’mč##‹-DܰZ­8wīFåÕ|Ÿ|ņ "##1sęĢN-’[ßśĀĀŗĻ£–ģv;.^¼ˆG}Zķ×1“––X­VŸ-Ēéł:O‚ŠŠP<śč£>O×_üU½MWmŪŻ“¼¾ŽÖ»{]>|'Nœ@ZZFƒ’’ģŁ³‘‘‘0łøæ¶wß}7"##a·ŪqåŹģ޽555˜4i’8Ķāŋ‡ĆÆ¾ś {öģĮwŽčźōاK»JwßļzÓł¹»“üĮŸĒųޤŪv™é"½”ėLuŽ—8łƒŸūušŃ@ ¶ŖĘĄūæ…Ėļł77L& ÜDJKK±wļ^˜ĶfDFFbŚ“iHJJ† P{}Äāk×®!==eeeŲ»w/ŖŖŖ†3f`šąĮØ­­Å† 0nÜ8LŸ>Ż«¼?‡†F£̘1ńńń€¢¢"äēēĆf³!66³fĶhµZ?~ǵÅbĮ˜1cŚü°\¾|8Lš4 C† ĮĪ;[¶lĮĀ… Å ĒmŪ¶Įb± ''©©©ŠĖ)--ž}ūÄeM›6MĢ·@š^ZZšā<łłł(**‚V«…ĶfCRR¦NŚ. ¹é„ś€żė_X°`¢¢¢PYY‰M›6aéŅ„ˆE}}=6oŽŒÅ‹cżśõxģ1õĶä4øü––Œ;cĒŽU]ļJėT`·ŪńŃG!99ćʍs[—¾X7J婨Ø@nn.bbbPWW‡»ļ¾[¶LjźśP\orłu—OŗjŪ–[—z½^¶®jkk±eˤ¤¤ąģٳ°Z­5j&Mš¤ų§<¹Ė‡“¼S§Nm³­w$JūµŅö.Ųøq#¦OŸŽÄÄD”––"//Ė–-“·²²Ÿ~ś)īæ’~1¬¬,,]ŗMMM²ŪEss3<ˆłóē·Yg‰‰‰øēž{<ī£JĖˆˆčō1Y«Õ"!!sēĪÅ’ū_Œ3ƒ”Ż~™˜˜(Ū¢ÅūRcc#fΜ‰„„”––bĻž=ųö·æŻ”}Ńb±“پŌ£•¦sÕŁc;®å™9s¦ģzw8Śo„õāiß:qāŽ;ƒĮ€”C‡āäɓøżöŪćvæćłŠeQś]%p=×Ŗ=ī+•Qn[µZ­Ų“i&Mš„Ó§O£””'NDPPNœ8‹Å‚›nŗ ćĒļŠś“ćż±¬ž¬Ūw™ń³žÜu¦„¦gµeė7vÉņźĄ”…÷`ĢßžĮVŻś½ ˆt»Ģø1räHTUU”¤¤¤Ķē‹[·n…Į`Ą¢E‹ŽmŪ¶”¾¾^¼37räHÜqǰZ­ųä“OŠūī»C† ĮŽ;ŠÜÜÜį|µ¶¶bĻž=˜7o–,Y‚ŌŌTäęęŠyĖĖĖĆüłó±lŁ28œ8įl&ÖÜÜ ­V‹Å‹cŃ¢E8tčšššŚ¤mµZ±cǤ„„!==sęĢĮĪ;a±X––m.ē†ń{¹å466būöķøõÖ[‘žžŽ[o½Ū·oGKKK›@Æ×ćį‡Fxx8 >>µµµp8ø|ł2ś÷ļŠŠPĄÜ¹sŪ\$=ސ444“YfII bccÅęį‘‘‘ˆ‹‹ózģwĖ)))A\\œx÷*&&&“I1m„y‚ƒƒa±XpźŌ)ń‡ąŌ©SéŅwNķtŅ\„„„HIIió,11±ĆŪ’“> Šī‚F©Ž=­Ó'N ¶¶Vu-_¬¹ņ8Œ9Ņc™ŌŌµŅzó”_i>|­3õ'·.=ķw‡Cl©ęŗļŹ}§”'OŪ”«ĪäÆ#é \"III:FÉmĶĶĶb]t6Ļ®:{LvŽ& žżė_xļ½÷PUU…įƇ·›ĒWū’ØÖGbb¢OöE_Ė;{ģéČ6$7­·ū­Ś4®\¹‚ˆŻjoŗIżIžŸŪSś]%p=×Ŗ­3OūŸŅqÅn·cĈœæI[[[Å’#"" ×ėaµZ;“ž\uå²ŗ»ƒ_ķĮįż_āHžW(8tĒÄɂ#8}¢ ó‰PtkĘ5Tā6ó%L¬æŠĶ 0Ś[e§/|aM@.č½ÕRSƒ£|>ŽV—Ž]„µ¶‡īŗWžõąŹæŽĆĮ…˰{Ā-Ø+8Žåłzļā€ŌCOĒ.32RRRšŁgŸ!))IüLø#(?ŒFc›Ļ„„Ļ>łä“6Ÿ»ŽżpgéŅ„²cˆ8p„„„Šétā Ūįp ±±ĮĮĮnēŃėõķšKOö€óΚPŃhōŖŸ­Ür¬V+®^½ŠM›6µłNøÖ„yL&ī¼óN?~GŽąü”7aĀ„6Ó*M'ĶgBBņóó8MNNĘžżū8ļ†N›6­Ż€›j †6wķ ƒŪ–9rõīp8dשÅbĮ¾}ū0dȐvwżµn”Źc0Äō•ŹtĆ 7x¬k£Ń(»Ž<åWš_źlżÉķŸžö;½^ßnż ū®ÜwJyR:NøÓ™üu$=ĮĄa6›ŃŚŚŠŹŹJÄĒĒćäɓ²óFGG+–Cn»0ØÆÆļp(-·³ĒdW m‚7éééāyāŚµkųč£°dÉńĀP>z³/ 4yyyp8øvķāććqśōéNļ‹jŃjł=ö(ńęŲŅ‘żVmmŗMéõzUū4ĻĻņä~WīϵjėĢÓž§t,ŌétŠét .7((HœV«Õvxż¹źŹeuw}”ĖLtk¢[æž-z%8ׂBPōõł„µ¶'ż,ƽūĻ@gW֕½‡³æZ°@ˆ«“?üy»§¼\ł×{ˆųƒ»Óää8’šĶĄįĆĪ÷55_æ/*B“Ūķ+‘‘œœŒˆˆœ:uJüLų1*œ°¤T¹>›7o^›;¹X»pįŠ‹‹±hŃ"čõzX,¬[·€óDŚŲŲŲį“CBBŚĶßŲŲčńī©Ś“ū÷ļļՀžę‰‹‹ūć×ÖÖbĒŽ C\\œŖé¤wśBBB ×ėQRR"^ąDEE”¤¤Dlńć©y¼;ĶĶĶp8ā:onnn÷H©Ž… Xwōz=–,Y‚?žEEEHīąć×¼Y7Jå‘n×JeRS×JėM)æUUU~ †ų¢žäöOģwJy:sęŒWĒ _ēOmzZ­Ĺsē ½^Æ8Æėz·Ūķhmżśī—ÜvŃæ±•ßąĮƒ½Ī³Ņr;{L–ŗvķd»öōė×aaaøzõj›€ą›}É`0 ,, ÅÅÅ0™L ņپØę­4ōüź‹ciy.³””åååķ.h”ź]i#<<³fĶB^^žb]śbŻØ-§2©©k„õęM~;Ć×õ'·.;²ßu&Orł+Æ/ņ'MŪ›ōŒ£GŠŪ…Ҽaaa°Z­ā…Ń©S§<¶øœ;“'OĘ®]»péŅ%ńNsYY>ųą\»v­ĆĖķģ1YP^^ŽķŪ·cźŌ©ŠėŻßĆØØØ@mm-bccŪ|īĖ}iŠ A8~üøø>|±/Ŗ=F«®³Ēµ:ŗ½ł‚ŠUQø!sźŌ)·­y~–'͇Ņļ*Ąż¹Vm)•ŃWĒžŽ¬æŽźŖó/Ntkn“TįęŚ+øĶ| X¾¢[]Œ_śæ×ńå­ ŗM0ÄŌŚ(¾†6ֈƉõW1±ž*RJĻ+VĄāÅĄģŁĪWt4 Ń8_Āg‹«W;_YYĪ@INN·Ŗ’ތ-DŒ5 Œ Åw܁½{÷bóęĶ0™LøćŽ;ĈžčŃ£qöģYńń‡Ā“|šBBB0mŚ4ōė×ÆŻĄš®6nÜŲīŌ„ 0zōhœ;w7n„Į`Ą”)SP]]mŪ¶aįĀ…øå–[°uėVŲķv˜L&L:Uq >)£Ńˆ9sę GˆT˜3gŒF£ģI422F£›7oĘm·Ż¦˜öܹs±k×®ėŃv;ʏßīŽœ4½E‹ÉĪ3hŠ aćʍbׄ„Œ1‡CLcžüł²Ó¹JLLÄŃ£Gŧ 8{÷īm×ĢW-‡Ćˆˆ˜Ķfdgg£¹¹Ó¦MCxxx›»YJõĄķ:•v»8p †ŽŻ»wćöŪo÷ŪŗQ*šćHm™<ÕµŅśÕh4²łu½Kh·ŪńĻž÷Żw"""¼Z¾®æŠŠP·ė288X¶®::P§<¹Ė‡^ÆĖ+ŻŽ”Ö„Śü¹ī×JŪ†TRRvķŚ%v[ō“]Mœ8›7o†ŃhİaĆ®ź"uÜøq Åžżū±cĒčt:DGG#55żśõ—ćķråÖ¹šcņ’ū_h4Ųķv„……aŹ”)øį†ŚLóĮˆē ƒĮ€Y³f!Źåń¾Ś—ēÅŠŃ£G1yņdŪ™Ś;öJłS;“»Ug=°vķZÜ{ļ½ķƲ2 ²ėŻß­ŌL&ʏĶ›7#,, Ƈ‡Ńhl,ćłYž“,óēĻ—ż]5cĘ q×s­š:ó“’Ém«Ž:²ž¤ĒxoxZÖŚµkqĻ=÷(ī;Ō³ō«øLœ¤§³f9’@W¶ 1µ~½’ ]‹ŒöVķĪk”p[3‚¼ €geui]QĒtäĢ­‘¼gPEx00 ģś{į£dazƒĆįx*Š•ADDŻĆåĖ—±’~,^ĢĀØėģŻ»W ’uG6› W®\Į Aƒ ÕjQUU…-[¶ąčņ.ƒDR{÷īEJJJ›}Ē]PZ.PķśyWĢūŚ+/aå/’--Ͱ۾ī&ć®ĖŒšŽįpąßė×cåÓĻų¤ŽZö|‰ŚīĻs±5å>Y†O„„‹+WvÉā _XƒĀ?®éšüĪ`Ęõ®¬vBÄ÷_9¤cŖP[Õq°kuķ>üų͜сŪŅh4™4] ļ-×ß×°^’_x/L×  Uņ‡ä„[ˆQ·²wļ^\ŗt sēĪ tV؏1›ĶŻ68Ą¼|ł2öīŻ+v՝;w.ƒ!pŻ}ß!ŗr,_\J’æģ»åŌ;Ńīs¹ ‡IŲ`Ć7ō¶4» ˆō6 ˆQ·2}śtŁĒ’łÓwÜč,xÄ}ƒŗ£;īø£ĖĘŅ”n 'Ēļ]h’šź`¬æ*žĻ G×ÓŁ{ĻS¤”pPU"""""¢n"¤©!ŠYP–›ė÷EÄϜ*>&˜Įņ'DˆˆˆˆˆˆHŻ»żæŒė¬&ņ7DüäŻwß§ęGE^^, Žxć hóŽW²³³Ū}f6›ńī»ļś­lJéw“ŒīŹį-ÆSoÕÕÕ!ĖG£W[,¼žśėā’B}łr¾ąļmÆ;PŖsézņĒž.å‹}Ę]®Ūš]ļYVw×Ńõ¢öųU]]µk×bķŚµØ®®?/--ÅŚµkqźŌ)Ÿ—éÓO?ÅŪo捷ß~k×®Å[o½…·ß~Ÿ}ö™ĻŽAžŚž;Jī˜ŪŃł;Ŗ³ēµ@ģcryöåśéˆŹŹJlŲ°”Óétö|ÜÜÜÜf?^čŌśŚŗu+6lŲ >žœśøü|’?6--Š„¤>‚cˆōPz½¾Żcö|­„„„Ķ# {ŖŽR Å£> €õ՝Iד?łbK£«ŹŠÕĖź ]±o#88pńāEDGGū½\óęĶą|‚ŹėÆæŽ{ī¹G|”§ō1ćåĻķ¹£:{Ģķ.ŪvwÉGo:ołź||ß}÷‰ū²TG֗ŻnĒŋńč£B«å½TŗĪß战L@jŖ3ųBäG ˆø8ž<>,ŽŲ>cĘ ÄĒĒ£¶¶[¶lAJJ Īž= «ÕŠQ£FaҤI€'NąŲ±cFRR’Ū“7n܈éÓ§#11„„„ČĖĖòeĖpłņe8p€ó±`“&M!CPYY‰O?ż÷ßæ˜FVV–.]Š   ÕOy—[ž¶mŪ`±X““ƒ4—(­F£A~~>ŠŠŠŠŅŅ‚±cĒbģŲ±œw÷ķŪ'N;mŚ4ÄĒĒ«®kOéK©Y–k9äŹėJiŖIĆjµbÓ¦M˜4iNŸ>††Lœ8AAA8qā, nŗé&Œ?^q]GDD ØØłłł°ŁlˆÅ¬ė͵Z-Ž?Ž3gĪĄb±`̘1āzüė_’Ā‚ …ŹŹJlŚ“ K—.Ell,źėė±yóf,^¼ėׯĒc=Ö¦¾RSSU-ƗŪvSSrssƒŗŗ:Ü}÷ŻŖ¶½ŠŠŠvóÉ-_M<šĄār“Z-l6’’’0uźTh4ŁmĻ]>¼Ywß}·l[,q=ud_š“ßÉķ3JiĖՑÜńƵ Ju¬f½+•]ŗ,µĒpƒĮ€”C‡āäɓøżöŪ£Ŗž÷īŻ ›Ķ†™3gb÷īŻ0 ˜:uŖbݹۯkjjd÷]»v©^/jĪIī\¼xńńńŠh4(..ĘųńćŻNwāÄ =z  Ćųńć1f̱ŽöīŻ ³ŁŒČČHL›6 IIIØ­­Å† 0nÜ8ÆU:uäąĖķYižŖŖ*Łu©ÓéÜs=寳ū‘Ņvёz±Z­mņ!·éõzÅżÆ³ŪrGĪójĻri¹ėgΜ)¦m·ŪńŃG!99ćʍój™=+‘n7īĪUrėaēĪ€-[¶`įĀ…(--u['īŽƒS¦LQ?źaöūĄŖøåDČļę•hmmŞ={0oŽ<,Y²©©©Č½>hF£ACC“Z-ŅÓÓq×]wįŠ”ChjjB}}=öķŪ‡… "==°X,ķŅOJJĀ•+WåååHLL„ÕjŎ;––†ōōtĢ™3;wīt;æŌˆ#0yņdUåRŹ»Ņņg̘v?žēI5$$K—.ÅĀ… ±oß>ŌÖÖ¢±±Ū·oĒ­·ŽŠōōtÜzė­Ų¾};ZZZT×µRśRj—%-‡ŚśVZ§jÓŠh4hll„V«Åāŋ1oŽ<|õÕW°Z­āzŲæ?l6åœ- ņņņ0ž|,[¶ ‡'N8CÖÜÜ,¦æhŃ"q½J%$$ ¬¬ påŹÄĒĒ‹Ūaii)dėKķ2|¹mkµZŌŌŌ`Š Aķ‚!JŪ†ė|JĖWS'WÆ^Eaa!/^ŒÅ‹cɒ%Šh4Ø««SÜö”ņÆv]Ø©óŽģ žö;wŪ€RŚJu¤tü(ĶÆv½«-»Ņq°®®ūöķƂ °hŃ"8ŌÕÕµ»Ŗ“¬qćĘ”°°‹EEE7nœāōJūµµėEķ9ÉŻvT^^ޤ¤$$%%”¼¼ÜķvW]]¼¼<Œ=÷ÜsFŽ‰Æ¾ś µµµ°X,Ųŗu+ -Z„ššplŪ¶ õõõ—/GnčČ9Ą×Ū³7Ūpg×kg÷#„ķ¢£õ"„“)ķ¾Ų–;ržWsbĈvwe€öIII())All,Lן剸ø8”––ś“lryļĢņG-¦7`Ą”••”¤¤qqqā]՘˜˜L¦véyŖk¹ō„Ō.Ėu5åUZ§ŽŌ™ŻnLj#±±±hmm’ˆˆ€^Æ÷ŲöņåĖmņ2wīÜ6?²¤õ$¬W)é°ŅŅR¤¤¤“łA–˜˜čÕŗv· _oŪ‡#GŽT•é¶!Oiłjź$88‹§NŌO:‘‘‘·=¹ü{³.<Õ¹”/÷;oŅVŖ#5¼æ3Ēa½ø;^¹r @XXছnņŗ.BCC1|ųplŪ¶ #GŽ„ŃhTœŽÓ~ķ‰RŚjĻI®.^¼‡Ć!D.]ŗŌn:į⼓“WÆ^ÅčŃ£±|łrDFF¢ØØ­­­HIIAll,ʎ ›Ķ†‹/"22O<ńD‡ėnčč9Ą—Ūsg÷oņף„õtĆ 7x¬£Ńˆ;ļ¼ĒĒ‘#G8ˆN˜0Įć¶'—5뢄„EUKy³/Čķwrõ­”¶Éd’­#5”ęwĶ/Ž9rĒĮĘĘĘ6ū»^Æw»ĻyŖē”C‡¢  7ß|³Ēé•ök5”ŅV{NruńāEĪ )Aqq1nøį†6ÓõļßÓ§OĒįƇ±}ūvĄąĮƒ1gĪń.|HHˆū š*räö‡Žž|¹=wvš&Ƀ“Ž<×:[/žö#„ß!¾Ü–Õž£ÕĻž=«˜–ė±Žb±`ß¾}2dˆŪ±6ŗā|,p7†ˆė~čzĪT³ķyŖß”C‡āŲ±cāqŗႹ,Ųø4Ś[nkFtkĀm-Ž?Ž6'ĒæƒŸ&';_EEØ­ĪZęŌė¾žķ-(D|ĻF÷Ą€ˆÄ… P\\ŒE‹AÆ×Ćb±`Żŗuēs½X·Ūķhnnn7V«ÅĄqīÜ9DGGCÆ×#$$m¦kllDhhh»“žŻnGkk«Oˬ“|%ĶĶĶm.¢š››a4”ÕjŃæÜyēŖk¹ō]ó®fY)ÆŅ:ķh)QZ×F£±Żņ¼½^’’1…’’Įh4vźbšż¶­tPiېΧ“|5uqqqāx-µµµŲ±cĀĀĀ·½ŖŖ*Łü«Y®RÓx„uģ‹ż®#iĖÕQ\\œŖ¼ĖĶļz×µ#ǵ۵Į`hsĢniiq»ĻyŖ‹ćĒ‹·Żv›āōgΜq» µĒ}Oi«9'¹.ēŅ„KHNNļ@Ÿ:u —.]r{6nÜ8Œ7UUUøpį<ˆóēĻ‹ĒAįāHųŪ™ć£œŽž|½=«GĶ9¼#eRʃt?ņt^ėH½H[4ØŻ¼)sG¶eµēh5ĒcOi¹īÆz½K–,ĮĒŒ¢¢"$''{½ĢĪž½įzĪ”[Ņ ˆ§:9qā†ŠćĒ+v™¤ī”Q«G£VŠ Æ÷Sk#¢[›`“·"®ÅŠ „wžˆĪō»Ń… G£V‡F­óRŗNšÖ%õ ģ2#ŃŌŌ$ž¬ģv;Ž= Ą 8åååb³E„Ē<GD$&&¢²²R|„œŁlFee%«Õ*žO:å±5·”–/ žęŽŻnĒłóē (//G||<PQQŖŖ*ĪĆļæ’~»“§§ŗ–K_Jķ²¤åP*ÆŚuŖ6 o(­ėÄÄD\½zU샟——'f¦VBBŽ9"ÖįĄqäČ·Ķs•Ö»’®Ś¶Õlj֓§:)**Ā”C‡Äō"##Ŧąj·½Ī® oÖÆ/ö;wŪ€RŚJu¤f;Rš_ķzļĢŗŻo„‹÷S§NÉŽŻ•[–Łlʵk×0{öl”––Āl6+N/·_+ķj׋7ē$Aii)ZZZ0tčP <ƒʰaĆŠÜÜÜ®»baa!Ž~ūm\¼xƒAlbŒäädčõz;v •••(((€^ÆGrr2jkk±vķZģŻ»WõŗQŅ‘s€Æ·g„yŌēŌęOŽŚżHi»čh½H©Ż¼Yj·åŽœē…e+½=ß#<<³fĶB^^žŪõÖēćŽP»ķ)Չp®©©é’¼“o™õF£p24»£ńEd¼ŲͦŻX$½dOćrŻU¤]VN†ĘŠ]V*‚BÅõdČ\¹r»vķļ §¦¦bŲ°a€;īø{÷īÅęĶ›a2™pĒw 44“ŻĄŲÕŃs€/·gOĒ 5Ē9µł“£v?ņt^ėH½H»”(ķGJĒv„e+mĖJuØöķéx¬tQ:¾ 8ƇĒīŻ»qūķ·{µL¹rys>ī„õ Ź(ÕÉ_|1cʈĒĮC‡±•H/ŠØÕ£,X/v³¾nEbŹū~8{'¶!×.+uŗ`4jub¹„Ō·ud4ä8ƒ*Ā+€€@€Pa×ß ’%ÓÓĒS®Œ®płņeģßæ‹/tVˆ|ŠŪ6õT6› W®\Į Aƒ ÕjQUU…-[¶ąP5)q?¢ö㙸 „ÉĒ1ļkƼ„•æü““4Ćn³Ćn·Įn·Ća’ś½Żn»žó½ĆįĄæ×ÆĒŹ§ŸńIµģłµ Ś’n ij@hcǟĪ%ålńå““Ü™ųįæż~K0tØ8Žˆ».+Ņ–+}}\Sk#&Õ_óIZc8¬†ö-#?žA3;æĪ5M&€FM×_Ā{Ėõ÷õ¬×’Ž Ó5h•¼Ą!y©Ę°XŚ»w/.]ŗ„¹sē:+D>Åm›z2N‡Ė—/cļŽ½Šétb ^Ä©ĒżˆČw“ö®é*å õ'ü911ŹÖo tQ©—b@¤ MŸ>½C$źīømSOĒķ—Øóøõ=Õy_"éūłu)71 B~ĆAU‰ˆˆˆˆˆČkę<ß ”­Äō [É!""""""ƵÖÖ¢®ąø_—‘rō‘‘.*õR ˆøqšąA|õÕWŖ¦µX,xżõ×Å’³³³uuuČRńĢģęęf¬]»o½õŽ~ūmńuąĄvi«e6›ńī»ļvi½ūī»0›ĶγŚü[,¼ńʝŹćW_}…ƒzœŽn·cķŚµX·nŽ}÷]¬[·›6mĀåĖ—U-OŲäØŻFz“ά?Śŗu+6lŲąöÉP=/öÉŽLŲO„õäé$L'ŻžåĪ¾ŠŁóŒŚ:šĒ1)ē£@čL9;²­HYĀū††ūŗŚćAw=V{ā®.;z ģģyĮæļ|‘/"`+źÉ8†ˆ‹ŠŠ \øpK—.U5}hh(}ōQ@KKK›GŠyć¾ūīCppp»Ļ…“{ i}tWS¦LĮ¦M›””„~żśyœ~ńāÅ sް\RR‚Ļ>ū ÷ÜsBBBdēé̶@]Ėn·ćāŋxōŃG”Õö¾qOŲ'EŗŸŖ­'¹é|u.š“L_§ĶcU`u¤ž„Ē,ā{½^ļqīĶǹŗģH™}y^šåļ»Ž~¾¢ž«+ʉžĘ TlŁč¢R/ˆ‹ƒbüųńŠh4ų׿ž…  ** •••Ų“i–.]ŠŲŲXŌ××cóęĶX¼x1ÖÆ_Ē{ Ū¶mƒÅbANNRSS”Õjqüųqœ9s‹cƌĮ¤I“TēÅb±ˆiWTT 77111Ø««ĆŻwߍŅŅRģŪ·Oœ~Ś“iˆh4äē磨Ø---;v,ʎ‹ŹŹJ|śé§ø’žūÅł²²²°téRDDDąÄ‰8vģ †Š“'OāöŪoGLLL›¼ Ó#))ÉmžˆyŠjµ°ŁlHJJĀŌ©S”Ńhpžüy>|X~ƌóļJ©äņØÕj1~üx:tßüę7½Ś>‰ņņr$''Ė–Aŗ-¤„„”ØØłłł°ŁlˆÅ¬Y³Ä¼Čm#JeSŖW)¹üy»= Ōģ<š€Ŗ“ø­½^Ė—/楁œŹ›4i† «ÕŠM›6aҤI8}ś40qāDįĉ°X,øé¦›0~üxu(Ų¹s'`Ė–-Xøp!JKKŻ.Ū]u¦,µµµŲ²e RRRpöģYX­VŒ5 “&MĀžó̜9 (--Ş={šķo[¶ŅĻ„éVTT`śōéHLLDii)ņņņ°lŁ2Æö)_œg䟣›ōäÖµ§}C®.ŻĶ'—OµĒ„c£7łW{ŒUSN„óī®]»Śœ+Ō¬3é1KÖoٲsęĢĮ† ÄmÓŻ>×ÜÜÜfūU:Ė‘«›ŖŖ*Łr¶¶¶Źī£žö_¹zp]o:Īm]zó»Dą«ó‚œŽž¾S›Æ½{÷Āf³aę̙ؽ{7 ¦NŖ*oDQ_pĀļĖ` ‘®×“žvŌ©r:ŻIkk+._¾ŒĮƒp^ü–••®\¹‚ųųx\¹r€ó‡aBBB›łg̘ńDÜÜÜ ­V‹Å‹cŃ¢E8tčššš:”7­V‹šš 4wß}7±}ūvÜzė­HOOĒ­·ŽŠķŪ·£„„€ód‚„K—bįĀ…Ų·ojkk—QWW‡}ūöaĮ‚X“hźźźŚŻ…ØÆÆĒ¾}ū°pįB¤§§#""‹„]zWÆ^Eaa!/^ŒÅ‹cɒ%Šh4Ø««Ckk+öģŁƒyóęaɒ%HMMEnn®8ƚü+Ձ§<<—/_†Ķ꿎n³Ł ÓéĖ Ż, ņņņ0ž|,[¶ ‡'NœPÜF”ʦTÆ®Ū³\ž¼Żžjö µiÉՋÕjŎ;––†ōōtĢ™3;wī„ÅbF£Acc£XgóęĶĆW_}«ÕŠōōtÜu×]Ųæ?l6›ź|ūėĀ… ŃŌŌ$»l×:óEY Õjż ėŠ A(//”••y¬W„“Ōī3JiČ•Æ»¬kFƒśśz„……ańāÅXøp!öļßŚŚZÕū©«ŽCŅt“’’Ä}¤¼¼‰‰‰^ļSri+C¤”źYmzJėZißPŖK׳”ņ©¦ž”ŽŽä_ķ1ÖیÜ6ØTŅc–ō½ō‚^é¼#štv§£u£“*}§T®ėMiö6’¾8/ØåĶłXm¾Ę‡ĀĀBX,aÜøqŹ‘Z—.£„øŲÆĖą8"]ĻŲÜ7Z2 "QWWƒĮƒĮ ķÕŅŅR¤¤¤“łAęśĆÖŃ£GĀĆĆ‚††·Ó­_æ¾MÓ3gĪ“›Ęįp`äȑœ]7āāāĖ1110™L(--u»ģˆy—såŹ 0@¼ćtÓM7¹®““żū÷Ghh(`ĈnļšĆb±ąŌ©Sb`eźŌ©ˆŒŒ„^ÆĒĆ?ŒššpļP;ÕłWŖOy4V}8!gΜASS  Ŗ €óī–4/sēĪmóćÄŻ6¢T6„z•ņ”?o·'@Ż>”6-¹z)))All,L& 22qqqāüv»#FŒÄĘĘ¢µµUü?""z½V«Uu>\·)„eKėĢeq85jT»õ/\Ü__D{*\Zj÷„4”Ź×Ö5ą¼ą¾“3Ōī§īx{ uĒ5 "m­tĶyĘS=«IOͶćnßšT—®Ē!¹|Ŗ©'„c£7łW{Œõ×6ӑuęŹÓyš|Žp§3u#·*}×Ńc²/óߣ<ųć÷§|…††bųšįŲ¶mFŽ £ŃØŗŽˆ:ŖbϾĪ'ā[‰?°ĖŒDSSS›~ž ČĻĻą0-99ū÷ļą¼k;mŚ4ÅA­ōz}»@Ü w}L][] 1=«ÕŠ«WÆbÓ¦Mm¦Z< †6-; ƒĒÖ)b0HČæ»~ÆMMMm¦Óh4n§3™LøóĪ;qüųq9r€óĒā„  ŃhpąĄ”––B§Óµ¹HW›„:P“GƒĮ€ęęfxņĮ@£Ń@«Õ"::wŽy§˜–R¤õź®~„:v·(•ĶS½JyŖcµŪ“@Ķ>qīÜ9UiÉՋÕjm÷ćĶh4о::Äm$((HœV«Õz¬C9ž–-­3_”EÆ×·kåp80hŠ äååĮįpąŚµkˆĒéÓ§Ė#—–k~:’†RłŗĆŗœ:Ҽ‹Ē 5ū©«ŽCŻ8p Ģf3Z[[QYYŁ®;BWœg<Õ³šōԜsäŗ“(Õ„ėqH.Ÿ7ÜpƒĒz2²ĒFoņļĶ1Vm9½åĶ:sGé¼#åķ¾”T7ž(ķ£Jßuä˜Ü‘üĖ„ÓŃó‚Ą×æļŌęk芔(((ĄĶ7߬ŗ~ˆ:£:ļKÄß’mæ.#"å&Ž#B>Ē€ˆ„ėrHHōz=JJJ ˆŠŠBII ‚‚‚`4Żvńé 7$$żū÷ĒwŽŁn:³ŁŒęęf8qžęęfĘv'm»ŻŽÖÖV·åoiiAcc£Ūz’žČ³Ūķ²…øø8q¼ŒŚŚZģŲ±aaaŠėõ(..Ę¢E‹ ×ėa±X°nŻ:q>¹üK)ՁВC)®09ŅAU„.\ø XŃht[J”ʦTÆŅ»Tžņ§v{rĶ—§}B)-éž"W/!!!ķ>ollļtśŖåęQZ¶Ü^_—Å`0 ,, ÅÅÅ0™L R,§ęźjźD) „ņ©©cÆk@ž˜”v?U›ž·“Z-ˆsēĪ!::z}ŪÓnWœg|QĻJėŗŖŖJń‚P©.]CrłTSO€ü±ŃŪü«9ĘŖ-§Ņy×_ėLĶy§£ū†\ŻÄÅÅ)–Si;PŖ»Ž“;’¹uŪŃó‚7Ōž„AOł:~ü8†ŠcĒŽį¶Ūnėt‰<é²'Ķü1Š%„ކ]f$"""ŠŌŌŌęB:!!GŽļź 8GŽqیY «+$$$ ¢¢UUUœw Ž’}ńäh·Ūqžüy@CCŹĖĖ°°0X­Vńö©S§Ä»ABUįīĀ©S§ÜŽb>pą@”——‹Ķ²O:å6EEE8tčųdd¤XhjjąŚķv=zÄOrłW[žņŲŲ؈ęęfUĶ|å(•Aŗ-$&&āźÕ«ØÆÆäå剃 udż*Õ«Śüy»=¹N«“OØMK®^QYY ³Ł Ą૬¬l7–‚'Ž”Iš§Ž,Ūe4hŽ?īu½śŗN”Ź×]Ö5Šö˜a±XpõźUÄĒĒ«ŽO•Ņ“;ÉqMwšąĮ8zōØl÷Ÿg”źYmzŁžŌÖ„§ķĮS=)½ÉæŚc¬Śr*wåźæ³ū†šóŽ7ē5u£TNל‘ī£JßySj¶åެ[_§Ōšęø*—/³ŁŒk×®aöģŁ(--§!ņ§®G$ś3]Lź…ŲBDBÆ×cŠ Aøxń¢Ų—511GGē8p öīŻė¶yhdd$ŒF#6oŽģ÷h¼ŃhÄܹs±k×.ŲķvŲķvŒ?^l.³ŁŒģģl477cŚ“ib?į‰'bóęĶ06lĀĆĆįp8`2™0~üxl޼aaa>|8ŒFc»;š‘‘‘˜üšC!99ķšu4EEEŲøq£Ų7!!#FŒ@KK Ī;‡7Ā`0`Ź”)Ø®®Ę¶mŪ0sęLŁü»¶0«£ŃØ˜Ē‹/"11:v»’üē?qß}÷!""Bõ:>|ølī¼óNq[X“hn¹ålŻŗv»&“ S§NUlJ­T6„zU›?×&“JĖsåiŸPJKŗžBCCŻÖKpp0ęĢ™ƒœœqŚ9sęxŻŅʛ2Iē‘[¶Ņ]śŽ”ÅuąQW 8zō(&Ožģ±<žŅRS'Ji(•OMū{] ː3¦NŠššpÕūéķ·ß.¦åp8TƒäHĻ‹-BRRvķŚÕnüæĻ3JŪupp°ŖōŌī×®”źRøąS“O5õ¤tlŌh4Ŗóļé»vķZÜ{ļ½mźJåäĻ»®ŪŠšŗPĄ’Ūē¤Į„}Cn[šTĒråņän5›Ķ²ß åVsL–«KoÖ­·ū?Z +ķkŅuƔÆ/¾ų7Žx#ōz=Fƒ²•ˆ‚Šņ+ĪBÆQ±g⇠ńė2L3§Ć¼Ē’­QØļčH;?ä8ƒ*Ā+€€@€Pa×ß ’%ÓÓĒS® Ą9ynn.–.]Śēžńn³ŁpåŹ 4Z­UUUŲ²e xąŸ4 ķ.ģv;6mڄٳg·kāKD=ŁlĘĒŒx ŠYqėņåĖŲæ?/^謐ģŻ»ćʍėP×®¾Jiķīū/©ē:žŒ»ńhäĘØ ļƽņR‡Ėŗņég|Rg-{¾Dķ‚öē†ŲšrŸ¤…ĘH£|–ž’Äļ=Š‘Čšė2 _XƒĀ?®é’ņōD¦ÖFLŖæę³ō*£“ū,ņć4³ó­u4M&€FM×_Ā{Ėõ÷õ¬×’Ž Ó5h•¼Ą!y©Ę".ś÷ļįƇc’žż˜6mZ ³Ó„t:._¾Œ½{÷B§Ó‰wŌzS0öļߏįƇ3BD~·wļ^\ŗt sēĪ tVČG„ DŌóŻ1ĻūcóÖO·:ŪŻĒ”žˆ7&Mšč,Ģōé½’qV}-ŠEŌŪ™L¦n{wyśōé}āøŚ—ÜqǁĪB£“vēż—ˆ¼SģZjjåæ)G„|­oõ !""""""æŲĖ|¾°-55~[†i&o4ļ0 BDDDDDDÖxé2 ’ø»“Spā?óĖ2ĀSn t1©a@čƒ⫯¾‚ÅbĮo¼”jžģģģN/·#iؙĒl6ćŻwßuū7eģ ‹Ææžz§ŅųꫯpšąAŸē«;ÕQwV¶~#Ŗó¾ōyŗģ6C¾Ä1D\TTTąĀ… Xŗt)¬V«ŖyZZZTOėĖ4|±Üī&44>śh§Ņ˜2e 6mŚ„¤¤$ōė×/ŠE"""""RĶŻ“=:Ź¢ ģå^}Į Ÿ0Lß`—9f½Ń§ŪO_Ą€ˆ‹ƒbüųńnŸ¬ržüy>|XünƌˆĒ¶mŪ`±X““ƒ““4”––bß¾}ā|Ó¦MC||< ??EEEŠjµ°ŁlHJJĀŌ©SŪ„!„v¹ü€F£ÓiiiĮŲ±c1vģŲveTŹ»ą?’łfΜ‰„„”––bĻž=ųö·æ-;oEErssƒŗŗ:Ü}÷ݲe²Z­Xæ~={ģ1ĪĒU8p€ó‘i“&M!CP[[‹-[¶ %%gĻž…ÕjÅØQ£0iŅ$hµZŒ?‡Ā7æłĶveģHšR7nÄōéӑ˜˜ˆŅŅRäååaٲeŽt‰ˆˆˆˆŗ•ź¼/‘ōżĒ|šfPTĀĒŽˆśc']<ź‘hmmÅåĖ—1kÖ,·ßķŁ³K–,Axx8Š‹‹‘››‹{ļ½3fĢĄÖ­[‘––†ĘĘFlß¾ .DLL ŖŖŖšńĒćŽ{ļEuu5 ±dÉhµZŲķv8puuumҐŗzõŖŖy”ņ8»|„„„`éŅ„ØÆÆĒžó <zż×›€Rރ‚‚Äé „ņņr$$$ ¬¬ ŠójµZŌŌŌ`ģŲ±5j”b™¤ł±Z­Ų±c-Z“É„ŚŚZ¼’žūX¶l4  Õj‘žžŽśśzüūß’ĘM7ŻƒĮ€Įƒ#//6› :®ÓiJ%%%įŹ•+HLLDyy9½éQ£œ„’ł„_—‘ Ń Ė؏ŒōKŗ£žē§h>v<€%ė¾Bæ¦Æœč"ś"uuu0 0 ķ¾Óėõxųį‡Å’ćććQ[[ ‡ĖWRR‚øø8ÄÄÄbbb`2™PZZŠØØ(X,œ:u IIIˆˆˆĄŌ©SUUUnó¬j5ł=z4 << @YYY›‹y„¼2Dœ.!!§OŸ”——榛nRœ7""‡#GŽōX&‹ÅŅ&?±±±0™L€ČČHÄÅÅ”““ €ĆįĄØQ£Ä2…„„ ””ƒF£ĮĮĮØ­­Ettt§Ó4bIIIb ”üDDDDDŽŠ&%"ō~ī×e„ŗ~µ`°`^ ³A½"MMM–żžĄ(--…N§ ®«ÕŠ«WÆbÓ¦Mm>·Łl0™LøóĪ;qüųq9r€3H1aĀŁez3Rž “ŚÆĒŠ5 hjjRw©Aƒ!//‡×®]C||­8ÆĮ`»ņØ-“Õjmˆ£Ń(Ž›¢×ėŪ”Éu} 477ū4M8p Ģf3Z[[QYYŁ®Ku ˆHø»€\øpÅÅÅX“hōz=, Ö­[×nŗōļßwŽy§ŪtāāāÄ.9µµµŲ±cĀĀĀ'›/5óxŹ_ss3‡”hnnnš”wi=………”øø&“ AAAŠóVUUµ“E®LŅ+!!!hlll3_cc#BCÕÅŗŻø:›&hµZ 8ēĪCttt›n>DDDDDDŌ3š±»hjjj×rp^\‡„„@Æ×Ćn·ćčŃ£œc‹ƒĪī$bw«ÕŠ÷ߍ(**Ā”C‡Ä4###mҐR;RžĄn·ćüłó€††”——·kŁ ”wWƒ ĀńćĒņ7ó*•I*11•••0›Ķœ®¬¬DBB‚ĒuŁŲ؈ęęfDŗō[ģLšRƒĘŃ£G9~QÅ[Ūz½ƒ Āŋ1bĈ6ß >ēĪĆʍa00eŹTWWcŪ¶møóĪ;a4±yóf,Z“sēĪÅ®]»`·Ūa·Ū1~üxF 4EEEŲøq£Ų­%!!#FŒ€Ćįh“†@ķ<óēĻ—ĶßĢ™3³ŁŒģģl477cŚ“io3f‡Ńh”Ķ»«„„=z“'Oö8ÆtžŹ$}Œ°ŃhĜ9s““#~6gĪF“““(®Ė‹/"11±Ķ€ŖMS*)) »vķBR’sP!»ŻŽžóŸøļ¾ūŃ%Ū+uLnnn»Z@NNŽŪ‡lPļ¤éą<ɼzÉ+€€@œćų„]/üo”L#Lop8Oŗ2ēS]rss±téŅvcIPĻ`·Ū±iÓ&Ģž=[±+Rg\¾|ū÷ļĒāŋ]\"""¢€ssĶįęI™§_bŽ×^y wĢ›ėu9·~ŗ+Ÿ~Ę×Õ§ŚęĶ›qųšaäää ®®łłłm¾OKKƒÉdĀ„ °pįB¤¦¦,ÆŻ]WDņóóQ__ßęf¬ō½”°Ž„æÉCnn.Ģf3>¬ø\éņ&L˜ŠęAž¦Ńh24hŗžŽ[®æÆ`½žæš^˜®@«äÉK5¶qŃæ >ū÷ļĒ“iÓź€żū÷cųšį~ †ģŻ»—.]ĀܹޟD‰ˆˆˆˆ¼Q\\ŒĢĢLdee‰Ż¾å½ŁŁŁČČČ@ZZvīÜč"ōYæųÅ/d īdgg·ł?-- Ė—/Gzz:¢¢¢T„!čqĒ5o©©©ųńŒGy$€µÖµqcҤIĪu‚æYÓ§OĒōéÓ]L""""źåVÆ^ĢĢL9JO³¤ī/''9990™LČČČĄ“O>é×ååēēcłņåČŹŹBvv¶ź LOĘ>!DDDDDDŻHMM &OžŒŒŒŒCØn)@Ż›ŁlĘŹ•+1{ölŌŌŌų}y999˜0aB—,+ŠŲB„ˆˆˆˆˆØ›Ø©©Įœ9sŚ"%ŒūąšČÉÉĮįÇŠŠōa Ō=˜L&¤„„µk½STT„¢¢"Å.6999˜3g6mŚäõxĖ—/ĒņåĖŪ„÷ᇺŻÖŠŠŠ°råJ¼łę›®2æb@„ˆˆˆˆˆØš IKKĆŹ•+e«V­ąģś——čā&LĄ| ū}MM8LQQQ»ļóóó±téRģرë.-Ė—/o7Pė¬Y³°jÕ*l޼Ė—/o×)++ ]:ŲjWc—"""""¢n ##Ćm0Äd2!++ ;wīTÕź#55ÕļćMDEEį‘GAaa!222ÜN“ŸŸ/ū]G,Z“H6=o…ķ‰!""""" °ÜÜ\dffŗżnūöķ}źÉä“jÕ*dee¹ż.33ÅÅÅ>[–kw»V*½ »Ģ˜ÜśĢĢL¤¦¦śuŁÅÅÅ8|ų0>,~6aĀL˜0”Ēt—(..n7Grr2’““Ūuń6ݜœ10––Ö©ō¼õČ# ;;»Ż#yē6ć«1>śĀeÜa@„ˆˆˆˆˆ(€„‹nWiii~ėśRSSƒ¬¬,dff*¶HNNĘņå˱råJĶ¦ŻgāŲ&¾žO(Ć;ļ¼£8-¤§§+ŽŻį*77n׋ÉdĀŹ•+=ęĻW²²²`2™Ś}žķ³€ˆ\k“Žž¤"v™!""""" ww’łn •››‹ &`åŹ•»D!##&LštčJ›7oFrr2V®\©*_ŅÖ/ž¼õÖ[HKK“?Ćl6###³gĻī’²FEE¹ŻĢf3rss}² wݵ:Ūŗ¦'`@„ˆˆˆˆˆ(€ä"ž7DøŲ÷vlˆ¢¢"Lž<›7o@ µõӟžéééķžŠ¢DmK‡¬¬,Ձ؜œüō§?ķ’2Ėå߃ž®^½Śm@DnL›Ž„]fˆˆˆˆˆˆH®»ŒÆåęęŹ^ģ'''#==&“ f³YYYnĖ—/ĒöķŪż>®‰œ—_~YńB]7źźźÄÖ#ŽD¼‘™™‰•+Wś}¬•±cĒŗż\m`˵…ŒŁlFNN²³³Ż¦‘••„ź‰F="DDDDDDRSSćöó &ų|YrĮĢĢĢvc•¬Y³+V¬h 0›ĶųÅ/~;wvy]åęębåŹ•næKOOĒoū[·šĶ›7{]ŸX¾|9† ‚ššdggcåŹ•nƒD™™™X³f_Ė.€R‘«7WÉÉÉČŹŹźõ]e=. ²aƆ@gˆˆˆˆˆhɒ%Ī‚ĻȍmįnĶĪxė­·Ü^<» †Ž|óM˜Ķęv]zrrr››ŪåĶrOāÉŹŹRģ^ämK×ō¢¢¢šČ#`ģŲ±˜ąć?ę¶ÖGp]ūė•ˆˆüįć?tz¤æüå/ķ>KNNöų›ĢĢL·cœtõ…s~~¾Ū®EĖ—/÷éX+J鄦¦"==½]}x;KwUTT„““4¤¦¦āµ×^ X·Ø®Ō#"V«5ŠY >‚ŪZßĮuķ¬W""¢Ą+..vū$5Ż(† ā6ąĖG¾ŖńŃG¹ż\®ÕHG„§§{üŽ]€(??? µ-‰RSS!ž/_Å]Y&Ožģ±åMoĄ§ĢHxxøŪϽy‚Š'r-ŌŽ«įn:³Ł,;ž‰?Č <ėėĮL=„[]Õ××ūµür×U»’ō§?aēĪāėĄp8ČĪĪ–pvłņåŻźQĖžŠ+"‡6› 6› v»]üÜn·‹/¢@r8p8hmmEKK ZZZŠŚŚŚfU³­r›ī:v»]\_ĶĶĶhnnםp¬é.ėBš‡Ć!~f³ŁŚä_xµ¶¶¶)CW’īŅüH󮶬JĖp·ou‡uEDD$×Ŗ@nl‘ސ{4«Ś./ṛ̾'ī‚:žxOw%Ō’ ŠØµhŃ"ģܹS¶„Ķ/~ń‹@ŻÆzd—% .ÄģŁ³ńÄO‚ƒƒ”Õj±xńb¼’žū°ŁlŠét ‚F£ tv©:}ś4Žx㠘Ķf“¶¶Āh4béŅ„˜P]]åĖ—ć½÷ŽCuu5¾’żļćŻwßķ늈ˆHššŚīN|NNjjjčģu ½eœŽŽr×Mš]PhÕŖUČÉÉi<ĖÉÉAqq±ß+(½. ¢×ėqāÄ >|Ɔ Chh(BBBMMMhmm…^ƇF£N§ļBj4ń‡“F£?īPŗž`Öh4āKøū(MGųŽČÕ³Ļ>‹_üāhµZ477cĀ„ ø’žū$^ņĀϳÖÖV±ž„–BĖbי½{÷ŗ=¾”••į…^@ZZöķŪ‡††ÜqĒ˜?>t:6mŚ„Æ¾śŹķz:yņ¤ģ±fūöķųč£‚ńćĒpdj±X`4Å@™¤¾īVØÕjQWW‡Ÿ’üēČŹŹBEE~żė_ćŪßž6>’üóNÕÖkkk+ছnĀųC<÷ÜsųĘ7¾ččh?~’ž÷æÅĄŒ°Œēž{NÜ”ö•††|ļ{ßĆŗuėÄå455Įįp`Ó¦M8tčt:÷ "" Øōōtdeeµū<##Ć'¢rŻ*Ō*×5Fķų¾œœÜ®•HWvŁ ¤ĢĢL·Ÿ/_¾Ü§Ė‘?„7·Īéu‡Ć1cĘ 66»wļĘ7æłMń‡­Żn‡ÅbĮ[o½…ēŸ±±±Ųæ?žž÷æćü#šššP[[ ›Ķ†ßüę78ž<^|ńEÜ}÷Żxź©§PUU…ßüę7˜5kZZZšā‹/ā™gžA||<.\ø€—^z üćÅŃ{…‹S"N§Ćƒ>ˆ_|cĒŽÅ˜1c0aĀōļߍ?ü0^|ńE<ōŠCØ««Ć;#gŸ}żśõƁÄmõŽ{ļşžō'<ōŠC(**‚Ćį,Ā…hKK šÅ_ą÷æ’=š››±yóf”””`Š Am.’I™“E‡^Æ»ć Ēa¼õÖ[ųĆž€˜˜˜vĒ—k×®!""æłĶoPQQßżīw3f , öģŁƒēŸv»MMMāz Ē‹/¾ˆßżīw0` ÅcMcc#Ž~ūmüéOBXXvķŚ³Ł,ŽĒ,¶–Šét0 œĒ&”E…Ķfóo·ŪQWWē³c š1@„i‚‚‚бcĒ"::ēĪĆ 7܀ĢĢLüę7æABBB›² ūĄƒ>ØøÆO¹Ę&œÉ .`’žżųżļ/¶8į¾ADD²hŃ"·üEEEX½z5V­ZÕ©ōĒŽėöócĒŽu8 ’œœ¬Ŗ;Æ.¦ŻÕO_čV”ŸŸ/;¾‡š§yƗłö½ņ֗V«Å²eĖšłēŸ£¶¶---œ4ƒłĖ_ ›Ķ†nøWÆ^…ÕjESSģv;¦L™‚¦¦&$$$ ¹¹“'OFSS¢¢¢³ŁŒ#GŽ`šąĮˆ…Õjŀ0pą@;vLLKøŠ ’Zŗt)Ö¬YƒqćĘįܹsX½z5Ž|óMŲl¶6ŻŒF#Ö¬YƒŲŲXŲķövŪ*Šö‚Sø.śZZZ„źźj|öŁg(--…ĶfCzz:bccŪt ĻV­Z…§Ÿ~O=õ~ō£į駟[…„ćKLLŒŪć‹F£Ajj*š››…įƇćĢ™3ŠėõØ®®Ę§Ÿ~Š’’’6ė©  ÉÉɈ‹‹Cccc›cĶŃ£G1tčP£©© Ó¦MkÓ]Eŗ=I[Ėét:čõzń|=h¬Żny=Ŗ!Ķ[pp0 śõ뇖–œ}ŗxńČA€=“"*CDhu”ŃhpųšaÅć‹ Ž‹Šh4HLLƒ·WÆ^×Sxx8ŒĒ\|J–p¬łź«ÆÄ.!‚††Æ5U*k ށēϟGuu5nøįŌÖÖ")) =ö˜ –qåŹq9GŽńøÆøĖĖąĮƒńČ#Ąn·sß "¢nįµ×^ĆܹsŻ^gff"++ Ė—/ǃ>(ČĻĻDZcĒpųša¬Y³Fü<##Ćķozz:¶oßī6½·ŽzĖm Œ““4·Éiiin[ø[Fqq1–.]ŖŗK͐!C°|łr·e˜śYYY²õb2™šŚkÆł¬,555ČĢĢģ²n9ŻMƾõŒūļæ’łĻ ÓéŠŚŚŠ††±{SS>ūģ3ńŖk3ié`ébFƒQ£F”¤¤åååāĄ„/½ō¬V+t:t:]§/JØ÷©ØØĄ³Ļ>‹“'OŠŻŽ;† .`ĈŠh4b—a[u8ķ¶Ua:‡ĆČČH444 ¦¦‡»vķąlŁpōčQlŪ¶M¼ˆ0`L&l6›ŲB@$eBDtSĪ憹Ü_l6ņóóa·ŪQ]] .`ųšį8rä>ūģ31+]OƆ ĆåĖ—Å€ōX3bĉ'yéŗļl@Ö5Š‘c š`‚“Łl8}ś4^yå,^¼Z­#GŽDII ®]»N×fĮĮĮhiiiXr·ÆČu9zō(>żōS·uĪ}ƒˆˆ%55U± ˆŠEdņäÉŠh4˜={¶ų>›źÜd2į®»īĀĉÅ’Ÿxā lÜøQ ĖGDD^~łe|ē;ßA~~¾Ūzæ’žūÅe łŃét=z4Ž?ŽÕ«Wsß "¢nå‘GArr2ŅÓÓ=réi|×®*«V­BQQ‘ŪVYYYŖĘÉĢĢ”½ 2dV®\)| €dddČ^”»¦Ÿ-;¦…ŁlFvv¶ŪV*Żé‰4žÖ›;B—§Ž¶ Q³n„RSS±cĒŽnßŖ¦³:Ņ|A#yĪ Šš `` @Ųõ÷Ā’FÉ4Āō‡Ćń”š…oŲ°A1"f³ŁŠŌŌ„ÖÖÖ6~llllÓw_«ÕŠ?ā…Ē4 BėįѹĀc!…;ĆB’|įbĀn·‹wd5ųōa9Ō3©} ™·„ķGŲN„w®…nĀ6e³Ł ŃhŚ\ÜJ·Uaū’n‹B3aŪ–¦)¼„e‰OCźĖ­™<­ėÖÖVX­VńI>B} õ+t֋ŠāAz|)++Ć«Æ¾ŠgžyFü<((HlM!¤)Ģ'¬'i÷=į;a9B»ŻŽf€W!}ƒĮ£Ń(> G(Kcc#l6ōz½ųäa{”ņ×Ńc`AA&Ož,[Æ6›M|µgi·$į,-ŸtĀq\hĶ!·ÆH:Ņc²š™īDD=C~~>–,Y } @w-$Ż}öŚ+/įŽyī«T²õÓķXłō3]RNa| o/d„233ńä“O¶ū|Ŋ^§k2™••…E‹yĢ÷œ9sT·žČŹŹBrrr» GFF†ģÓuņóóń­o}Ė«'Ų$''£°°Pü?77×m`%''GqĢ oę›={v‡‚RĀŲ)jĒńĖŸ7”ŗłŠF£ÉŠ éśKxo¹ž¾€õś’Ā{aŗf­’8$/Õz] éE†p±" Ō'Üõ~K/„\/t„ éjédéiį;žˆ&9Ņ \鐮×Ņ‹bmīŲ ļ]»4óI/ …–JBzĀ> ŻWø­*‚ BĄB \øKĒø_BBBÄ y!Øb0 ×ėÅõ$ŒÅ!\ų»o„ ™ė±@›ł„<» Ź Į^ių:ų!-›°|ŻÕ«ōų«×ėŀˆk[X†ŻnGPPģ¾āZ×Ļ„e ū÷ ""ź.¢¢¢šę›oāG?śžś×æ";;Ū«Ē¢¦¦¦bĀ„ næ{óĶ7±|łrdddx¼`7™Lā“j.£¢¢°cĒĮœŌŌT¼öŚkHMMEnn®Wu“ššŠĆ‡#33™™™Ŗź%66Ö«eŠÉdBZZŅŅҐžžŽ!C†tÉr…å-_¾¼×· ‘źu-D“¹S+½€”D)^°(]lŗžĄv½8u]&āėłüÕBh»ĶHǬ‘n7ŅmSŗ} Óŗ¦ēśæ»ķZ:pČķTŻŗ‚I®ė €x1-¬?į{׀kkk+š››ŪD\ĒŚ“„eņrĒa>a!OJŪ‹» ėvŌŁcąĮƒUÆ]ƒŅ–"B}z*»Ś}Å]łäźœūQ÷ŌWZˆø“››‹Ć‡Ćl6· d­ŅŅŅ0aĀÕµłłłČĖĖĆįÇۓøŅIKKėšrqq1²²²ŚäUøŲ—¶xØ©©iׄ%<<\õońÜÜ\äää ØØH,Ƅ `2™0aĀL˜0”]`ĮŻ2…ł”Źėķ|Ņ`°ī¤„<ŖY¶hölēߝ;Ż~ŸŸśśzŁe ėp¶œéŖ ‹Twi!Ņ+"D¾ąĻ€u/]µ®…BKé ¬½÷!""ņ‡¾!æ{šSM»K@¤×u™!"ꮄīīZ”Qן‘oĻDŌQÜÖś®k’`½QwÕ#"÷Ž{o ³@}Ą™3g0räČ@gƒŗ×µ°^‰ˆČ6lŲč,Q/ĮgĀłŚģŁĄO ˜ĶĄŠ@t4ąī©>EE_ÆŃC‡}ܲÖäÉĪ“4`ńb@®ÕīŠĪ|ŗĖ×āÅĪļ¼xŗQOÓ#[ˆukBańbēū“4 "¢ķ4EEĄÄ‰Ī÷Ė—&“sŚ+€#G€5k¼[ęĖ/;ēOOīŗĖ™~V–ó³ķŪ×ļyÄō(*r.VƲ³ŒŒÆ?ė…!""""""ņ‡Ć‡…ĀB 9¹ż÷+V8’Jƒ«V9ƒ™™Ą“OŗŸOĪŖUķƒ(ćĒ;[ŖüõÆĄ›o¶ż.-ĶōČČpAÖ¬q¶&ÉČpęgÕŖ@× _±Ė ‘?˜ĶĪ ƒ» FQ‘³åĘņåķ[n<ł¤óļ[oy·=ŠE$"""""¢@Ū¹p8ÜævīTŸŽŁüu œó®Z„®…I~¾3b29ƒ)®-Vz©^ŪB¤¶¶%%%ØØØ@SS āā␐€ČČȀęķƒ>@LLL «ˆz˜]»vį†nĄ Aƒ"""""ź¬Y³œ7ožŗ%Ggde9ƒ!Ā€ØŽųīwĮķŪ-L22€… {}·™^ŁBääɓطoJJJŠŌŌhjjBII öķŪ‡“'O4éééøõÖ[]MŌĆTWW: DDDDDä+iiĪ „Č謚ē_ד23•ē[½ŚŁBdåJgDxJĶwæčņ»^9yņ$JJJ§)))ń*(ņä“O"** ÉÉÉx÷ŻwÅĻwļŽ[o½‘‘‘0™Lųę7æ)¦ėp8š“Ÿü111ˆŽŽĘĻ~ö38ķ»Ģģßæ3gĪDxx8’’’šģ³ĻĀįp(¦A=SMM ²²²pęĢüē?’ĮŪoæüü|ńūĖ—/cÓ¦Mų÷撍7¢ųzæĀ/¾ų×®]Cnn.vģŲŃ.Żk×®įŻwßÅŽ½{±yófTVVāõ×_æ·ŪķX»v-źźź<ꁈˆˆˆˆŗČš5ĪĘŠ”ĪĄENŽó••å|T®7yÄł7+ĖłŹÉq;VÆv’ōĄż#vÓӝÆüü^ßu¦WD„n2‚„„$$$ø¶¤¤µµµÓüüóĻƒ7ß|ĶĶĶxōŃGQZZŠšš̟?—.]ĀÖ­[±nŻ:ģŽ½÷ŻwąÓO?Å_žņüą?ĄĻ~ö3¼ńĘŲ½{w»ō«ŖŖ0oŽ<\½zļ½÷ŅŅŅšÜsĻażśõŖÓ žC«Õ¢„„ X¶lęϟƒ¢©© V«Ū¶mĆĶ7ߌ{ī¹·Ür vģŲ‹Å‚›o¾ƒ³fĶœ9sŚ„«ÓéŠŌŌ£Ńˆłóēw8DDDDDŌ…–/>ųĄ°ųéOŁ³Æ+oÆż’“7ßt¾_±Ā™NV–3ż œŸK[˜ĶĪī1@ūGģ¾ł¦3OĪĄH/Õ«"®-CŒF#ƌƒ)S¦ <<Üćōī 6 «V­Ā’%Kšļ|ĶĶĶųüóρ‹/"??7ß|3īøćL˜0GEKK Z[[‡ĀĢ™3QQQᶛ̇~ˆźźj|ļ{ßĆüłóńĪ;ļ ±±÷ßæź4Øgq83f  _æ~Šh4hhh@II ĀĆĆ0`"""PZZŖ*ŻÖÖVÜxćīpˆˆˆˆˆČG„Q=IO æUdõĄļÓ]¾Ø®v¦qą€3Ż““ÆÓ”¶1™œß;ķĒ 1™œéøū®éU‘ŠŠ ·ŸGEEaśōéķZ‹ČM/5xš`ńżĄÅłl6ž{ī9Lœ8ĮĮĮˆŒŒÄ¾}ūąp8`³ŁšĶo~÷Üs>łäĢ™3cƌĮŋŪ„łņe@’žżŪ}§6 źy¤A F‡Ć«ÕА6ӍFX­VUijµZUĮ„<Q€¤¦¶}Tng¤„õź@†ÆōŖ€ˆ§&’cƌĮųńćUO|°¾nQ2`Ą¼śź«ų󟒌‡z °X,HII§ ʆ påŹ<óĢ38wīŽ~ūķvé O ¹råJ»ļŌ¦A½CHHH»ą‡ÕjEhhØŖł5M›÷ŅGsss ‹GDDDDDŌ­ōŖ€ˆĮ`Pü¾©© —.]R5½p1yźŌ)<’üóČĪĪĘ?’łO„„„`īÜ¹ØÆÆć“O>Į£>*OvļŽüćˆ‰‰A^^žŲŹÄŻć~,X€ˆˆüżļĒ–-[šä“OĀ`0ąÕW_Uõ‰‰‰hhh@YY ¬¬ bĖ&aœ5BCCįp8ÄVP'Nœh0!"""""źėōĪ€/ÅÅÅɎ rłņe·¹'›VKK ē#rĻž=‹ēž{ńńńxķµ×ŠÆ_?üš‡?ė_~‰>ųŸ~ś)}ōQü÷æ’Å=÷܃'žx‡ʖ-[°|łrčt:<ųąƒxā‰'Ś-§’žŲ²e ~žóŸcٲe0`V®\‰ļ~÷»hhhP•õF£·ß~;öģŁƒÖÖVįöŪo‡ŃhŒ9¹¹¹(((ĄŻwßķ1­I“&į“O>Į`Ą„  ×ėįp8!"""""Š‘+#ä8ƒ*Ā+€€@€Pa×ß ’%ÓÓĒSj¾aĆÜ{ļ½næ«­­Å¾}ūÄ’‡ŽAƒįųń㨪Ŗj7żŌ©SŁā‚d9s#GŽ t6Ø p]ūė•ˆˆüaƆ X²d “ĶŻ˜hī>{ķ•—pǼ¹^/{ė§Ū±ņég]D=žF£ÉŠ éśKxo¹ž¾€õś’Ā{aŗf­’8$/ÕzU ‘ČČH$$$ˆ­DŹĖĖQZZźvPŹ„„CˆˆˆˆˆˆˆśØ^ >J“¤¤DēĆUBB‚8õ=½. 8ƒ"BK‘ŠŠ 455Į`0 ..Ž-CˆˆˆˆˆˆˆØwDg÷>ˆˆˆˆˆˆˆČ^õŲ]""""""""5!""""""¢>‡"""""""źs!""""""¢>‡"""""""źszäSføč,PĮm­ļąŗöÖ+uWl!BDDDDDDD}"DDDDDDDŌē0 BDDDDDDD}"DDDDDDDŌē0 BDDDDDDD}"DDDDDDDŌē0 Ņ ZM̘~‡ģ’ŽøkįŠjś£¢¢*ŠÅ"""""""źõōĪ€æŌÖ6 ¤ä**+jŠŌŌ ƒ!±qQHHčČȰ@gČk»wĀ 7$!~P\ ³BDDDDDŌćõŹ€Čɓ…(-¹Ö泦¦f”–\CiÉ5 Jč‡1c†:›D^©®® tˆˆˆˆˆˆz^q q%|ļ)(²{÷^üö7ĻćšįcŠjµ˜:u"2_~cƌģt>7oފ§~™’’+øēžtŲl¶6ß_øPŒ_üüwŲ³gģv;¦N„_ŹĄ7Žģß?]ł[9rŃŃ&<žÄCųķoXłäo°nŻF8¬Xq^śÓjh4š€­śZMM=²?ČĮĶ7ĆįĆgŠŲ،oŠŌŌ1€Ė—˱ļ«ćhmµA§Óbņ”1dH<¾üā(®]«Fnn>śõĮœ9Sڤ{ķZ5>Ūö† OĄÕņ*ĢüĘlĪĪĮ£-Ųķ¼žĻlÜ{ß<ŲķvÅ<Qף°ajkŻßųŠŒŒÄ½÷Žė³e­]»F£?üp ‹MŌ-ōŖ€HmmC›`HBĀ`@IÉÅvӖ–\Sģ>SSS‹;ēߋ~żbńÉÖ£ŖŖ˾żīæļ»8txg§ņyõjž?{wu¹?ž’92°£0h¢ 35ET*„\÷̵“¦ęQ³Ó¦ęéŌQ;ŸžNŸNė·MĖÓ15µÅ-5%÷])ĢŁw†a™łżĢŁFSŃįõø®¹z/÷žętš×Ü÷żž2łOøŗjX³öS~žłkÖ|k¹_Rb`Š£q办>\Ž~ö/ <ž„Ÿć©ØØ`Xų$<=ŻŁųĶ|½ī;–/{—N:ąįį·~Īkƽ„ƒŹwžż cĘF0`@’ę~<P*•”—WP¬70aā`rr Ų²y/ŻŗuĀd2óCģ!†E„āėėEVV>‘;ö3iņPś‡vēāÅTģ]ļ’;;;ŒĘ2ŌjĆ"B¹r„䆦 R94÷ !„B“(]ŗtĮ`0pžüyL&AAAŲŁŁįččŲÜͦŁT@$--»Ö¹Z­& ąųłµ#!įÅÅÅuŅk4õĻqqq&łņ <<Ü©ØØ gĻn:tœņņrZµjuĆķܹs/„„F.œŹŲ±@ßl܉gˆŠŚErr*ƽöO<ń8§OćŸ’|ŸččŻ „ņźk/1ˆˆˆA¬žźc¶oąÄ‰3Ģ_š żė ŲŪŪŌc¾ė™ĶfĖģ$oow z})ł:œšõ­ x“i恋‹éé9¶k“LPQQI×®884ż·ŁP$ "„Bq{=šĄ–ćÄÄDŹŹŹčÓ§jµŗ¹›&„ͳ©oŹy¹Eõ^wuu£_æ$$œ©5[¤”ō•••,_öß~»ŒŒ,ģķ«~7›ĶTVšųń²²Ŗf±ųśµµ\ó÷÷³D’“Sh×^k¹Æõ÷ 55ƒ”ļ:eʤIcŁøq ‘‘; `ē®ļhߎ’¶> ŃøšA …¢*@a0”ā訪•N­VQj0ZU¦R©“*ŅX„B!ĝĒh4rüųq’““)))ĮÉÉ ­VKpp°e‰5i®•’’±cĒ(((Ąl6ćįįApp0žžņŻA“ 6õŚ]£±¬ŃūAA÷Ó£Go«ŅōŃ*Žyē¦N@±žś’ĖÜ’ĶŁcĮǧj@Fz¦åZRR²åųž{Ŗf\NNµ\K¾TČ銔=~W)YuŹvppąėõ+HĻ8ĖāÅ ųõ×$VÆŽxk\ÜTŽŽj ×? #ŽNÖż:Ps›…BAĶųFYY™Ue!„Bˆ;‹ÉdbŪ¶mœ9s??? @ūöķIHH ** “ÉdUšk•••Cee%aaa„……a6›Ł»wÆü·£h1lj†ˆJåŠhĆh,%%åR­ō ).ÖU³5¢¢v±es©©é@Õf«C† ¼įv4V®üŠ^½{pęĢy.\ųĶr?"b:“ć³ĻžK÷÷QVVĪŹ•khϰaR\¬ĒÅřĻ>ż’nŻī%6ęG>żōæüū7pphÅ+ł+V¾c™a¢Ńø4÷£VŠś{w‚ĢĢ<ڶõ$33½Ž€V[5Hi§l2čWĶÉIŁl&/·O/7Ī_’u…B!īBiiiäēēćććƀ $//ŒŒ 233©¬¬l2ŸŸ_­r+**®ĪR6påŹ|||5j”,·-ŠMĶńōrmš^jj2GĘ“ŸŸgUśgŸÉšįƒŁ“)’?Ķz /¶l]ƒææsfĻ’]ķlŪև’|ł*•ŠiSē‘ž–ÉرÁŖH­““#?ģüŽģ˳ó1’„æ1p`bų''G||¼Ųł5ŽŽ^Lš8‹ķŪcyńÅŁĢ™3‰Ē0p`fLŽ—¾Ī“OŽgölŁEśn V«<$„ų§ŲøįāćO3xH_ŌźŖe4]:ßĆŽ½ĒŲ¶uŸe9š@Æ.DEÅóĶʝ8;;boo'Ėb„B!ī2Õū ŗ¹¹ÕŗīźZõ]F§ÓY•ęZNNN<ņČ#888pšąA¶nŻŹ’ū_öļß_ļŒ!l‘M…’“ZŸ:ÆÜ5K9wīd­@HĶō qwwcūŽuu®_N9i96™koāzķyc¦LĒ”)ćj]ūzż Ėq§NŲ¼euƒłzØ/E×¹īźŖįūM’½ŁC+n'ž4ū±Z×Ŗ_ ąļß’6õęķDļąś—m¹{hj•Š»wP­Wéž”s{ĖqcmB!„wggg k]/(( uė’½5Ӛ45Hii)999œ:uŠóēĻćēēGĒŽ›»ėBÜr6ŃhZć§õ¶E²²2HOO±¼ĘŖ&?­wƒÆÜż½ ‹x’½ Žiž\YĘ"„B!„h’V«ÅĆƃģģlāāāšõõ%==¬¬,<<<Šj«–É[“¦¦ŒŒ vīÜ‰ÆÆ/;wŖö#„ŖŁ#B“6,ÆMOĖ”øųJ½iü“Ž–t·‚››+K_¹¹‡B!„Bq—S*•Œ5ŠcĒŽqłņeiŻŗ5÷ß?½zõB©¬ŚĮš45łśśŅ£G~žłgvīÜ T-± £mŪ¶×ÕF!īV6Ŗ ˆVėCZZ6y¹EeØTxz¹¢ÕśÜ²™!B!„Bq£¦OŸ^ļu•JEhh(””” ęµ&ĶģŁ³kwļŽīŻ»7w·…h66Ŗå3Ķ­›"„B!„Bˆ»—M½eF!„B!„ĀB!„B!D‹#!„B!„B“8B!„B!D‹#!„B!„B“8wå[fx7wD‹P k-†<ė[CĘU!„h.ńńń¬ZµŠ_~ł;;;ī½÷^fΜIHHČ-«3//ššpöķŪ‡““SsM’"B!„BaC¢££yå•Wxģ±Ēˆ%::šQ£F±pįBvļŽ}Ėźuww'&&GGĒę!¬rWĪB!„BQWyy9ļ¼ósēĪeĈ–ė#FŒ °°·Žz‹°°0”Ź›’ŪøR©ÄÓÓ³¹‡@«É !„B!„°gĻž„  €Ē{¬Ī½Ē{Œ¼¼<Īž=Ėć?Ntt4±±±L˜0€£G2uźTüq¦M›Ęɓ'8ž<ƇēŻwßeęĢ™õęĻĖĖ#88˜’’’FĖ1bgΜąŌ©SsśōiĪ;GDDDs£h!$ "„B!„6"##OOĻz—­899įééIff&ĮĮĮœ?€3gĪŠ§O Y°`Ļ=÷ß}÷žóŸY°`ƒt:nnn¼’žūõ毩±²j@Ž?N·nŻ,Į’S§NÕ)Kˆ[E"B!„Ba#ģķķ1™L Ž7™L( z÷īMBBPŠ įšįĆ“iÓƲńjHHīīī=z…BAii)&LĄÅÅ„Žü55VVŸ>}8uź'Nœ`Ź”)œ8q€“'OŅ·oßęFŃBH@D!„B!l„V«%??Ÿāāā:÷JJJČĻĻG«ÕĢ/æü‚ŃhäĀ… ōīŻ›¼¼ūąm†…¾īŗ£cvņā_7÷q×S(ļ„€ńź§śøäźq1`øz^}\® ØØń0×ųXͦfˆčtŗZĮ­V‹V«­7mZZZ£ĖgŠŠŠˆˆˆ %%…ččhÖ¬YC\\S¦L`Ū¶mōļߟ#GŽŌ9×ėõęĻĻĻ'<<œģģl¾łęĀĀĀX¶l_żµ„ ńńńddd°dÉņņņ˜={¶å•WŃŃŃ1oŽ<.]ŗÄSO=ETT‹/¦ØØˆ¹sēR^^Nii)įįįģŁ³‡/æü’}ūöQPPĄčŃ£©ØØ°”·}ūözė»¶o»vķāĆ?d޼y̟?ŸU«V×܏’® T*)//GÆ×3qāD"""8~ü8F£ƒĮ@ll,”””Lš4‰‡~˜]»vQRRBhh(*•ЁÖ †ŲŁŁa4Q«ÕM¾·½±6!„B!DKaS›Ŗ^;3D­V€ŸŸ uvZNKKC£ŃŌ[–‹‹ —/_Ŗ6 ŖØØ gĻž:tˆņņrīæ’~4 ĮĮĮ–²«ĻM&S£ł·mŪFAAƽöDDDšÕW_U›Ŗø¹¹±råJ8Ą÷ßOrr2mŪ¶µŌõŃG°zõj’’’8|ų0^^^ģŁ³‡Ķ›7“ššŹĻ?’Lbb"Ƽņ įįį,]ŗ”1cĘMæ~ż€ŖimõÕwm_«7z=qā ,ąÆż+öö6õ§tK™ĶfĖ,!ooo z½žüü|œńõõ M›6øøøžžN```“åVTTеkWK€ėFŚ R©š{x„B!„ā¶°©"Ձ„k¹ŗŗŅÆ_æ:³EJPYYɲeĖxąppp@£ŃpųšaĢf3•••M¶„©ü©©©ųųų4XFĶ/ĮÕ;-—––Z®XŽ===quuÅĖĖĖrU{§¤¤¤šę›o¢P(P(Œ3€ .X]_µ”C‡2iŅ$¢¢¢4hAAA–ą°NĶ …B”Ąl6c0ptt¬•N­Vc0¬*S©TZ i¬ B!„BŃRŲT@¤©)’AAAōčŃĆŖō}ōļ¼óS§NEÆ×SRRb™)a¦ņūłł‘‘Ń`MķÉaķžķŪ·ą„—^"))©Ögƌ×]žƒƒėׯ'##ƒÅ‹ó믿²zõj«ĒFŌĻŃѱNšĆ`0ąäädUžšĻļŚGYYYswO!„B!ī(6ijŗĶŁM„Æ^“œœLTT3gĪ“Ģźˆ‹‹C„R”T*9{ö¬e IĶóĀĀĀFó1>żōS"##yį…P©T–%07SXX:ubƆ ;vŒ¤¤$ęĢ™Cß¾}-ķlj\köķ“O>ĮĆƃżū÷[‚- -=Öó÷÷GÆ×“™™ @ff&z½Ž2³©zŸk899a6›-³ ĪŸ?os›Ž !„B!ÄļaS‘źå"õIMMåčŃ£äēē[•žŁgŸeųšįlŚ“‰Y³fįććĆÖ­[ń÷÷göģŁ“jՊyóꑟŸĻóĻ?OYYY­óiÓ¦5šßĒLJČČH¼½½™8q"Ū·oēÅ_dΜ97}\Ōj5111ōķŪ—yóę1räHt:kÖ¬”C‡Męæ¶Æ 8éÓ§³pįBž|ņIfĻž}kn  V«2d`Ɔ ÄĒĒ3dČŌj5;wfļŽ½lŻŗÕŖ²zõźETT7nÄŁŁ{{{Y#„B!„WŁŌkwu:‡¶œwźŌ ???Ī;W+R-$$Df6ˆÉ+C[yÖ·†Œ«Bˆ[A^»+ÄŻļNyķ®M½D£Ń Õj-o›ÉŹŹ"==½ŽM)µZ­C„B!„Bˆʦ–Ģ@ÕĘ©Õ{.7 ©~åØB!„Bؚ={ö0mŚ4|šAĀĀ˜={6ū÷ļ’Żå._¾œ”C‡’““Cpp0%%%ĶŅæ¼¼¼f­_Ų› ˆ@UP$$$­VkŁ8U„R”Õj ‘`ˆB!„ĀfÅÄİtéRžzź)öģŁCdd$ćĘćŸ’ü'III7\®ÉdbĖ–-|śé§xzzƒ££ćmėײeĖ8vģīīī·½~a{ljÉLMF–Ä!„B!Z”ŹŹJŽyēžyę T½$aŲ°a 6ģw•m4©¬¬ÄÕÕ„R‰§§ēmķŪŋ-ĒĶQæ°=69CD!„B!Z¢„„ņņņ9rd£é~śé'žxā ʍĒäɓٷo—/_ę‘GaĒŽL˜0!C†°bÅ žś×æ0{öģ:KfÖÆ_Ļȑ#™2e [·neąĄüöŪo$&&j©·²²’ąą`ŅÓÓ9ž<ƇēŻwßeęĢ™ÄĘĘ2~üxFÅäɓ9~ü8oæż6ēĪćļ’;ƾśj%37Ņ!lv†ˆB!„B“4™™™h4œL“ŸŸĻ¢E‹x’ż÷éÕ«§OŸę™gžaĖ–-ŲŪŪ£×ėÉŹŹā›o¾įüłóLŸ>É“'³|łr P' ––Ę»ļ¾Ėڵk äż÷ßĒ`0 T6žū»ƒƒ:777Kž7ß|“>ų€nŻŗ±qćFŽxć 6oŽĢĀ… ‰eéŅ„ōīŻ›¼¼¼ßŻYQ d†ˆB!„BŲ;;;L&S£iŽ9BŪ¶méÕ«Ż»wG«ÕrōčQ jƐźWwķŚ„RIvvvƒå>>|óĶ7 ¦ńōō¤   Öµ‚‚‚ė dŌäāāBqq±å<##Ćr|mšA§ÓÕŹ«P(,Ē»wļfĒŽ|śé§¬^½š7ŽxĆŖśovDĖqWĪ1“ÓÜM-„ü­µņ¬o W!„āöR(̟?Ÿ%K–ąććưaĆŠėõ?~œ?ž˜åĖ—²eĖ8yņ$={öäĉdeeѧO Ćuף­[7–/_NJJ ķŚµcĖ–-–@‡··7&“‰_~ł….]ŗšż÷ß7ø·ˆN§ĆÅōFCii)ėׯ ¤¤ZµjEQQQ|7»?¢åø+"B!„B!ź7xš`łā‹/ų÷撍½½=÷Ž{/ .¤k×®üė_’ā­·Ž¢““GGGŽzė-ÜŻŻo(€Š±cGfΜɟžō'¼½½™:u* ……B««+³fĶā¹ēžĆÕՕéÓ§£V«ė]²2dČ¢££9r$mŪ¶eŃ¢E\¼x‘gžy†5kÖ0jŌ(žž÷æ³nŻ:žõÆYņ¹»»ßŌžˆ–Cqƒy5ņŚ×ų8*@ 8N@ė«ĒÕēźiŖÓ«Ģfó"k*_æ~=“&jīq-Ą…ÄžŠŁż÷$īxņ¬o W!„·Ā†õ»,d^»·D}{MŌwķ³ŽfXųąė®;:f'/žeqsĮƤ¤„šĆ?ŌŁŪC…BńP Æ~ŖK®†«ēÕĒÕ鬀ŠsÕd!„B!„7Ģ`00sęLŲ¶mķŪ·—`ˆøćɒ!„B!„7ĢŃё1cĘšņĖ/SYY‰§§'Ė—/oīf Ń$ ˆ!„B!„ų]ƌƘ1cš»B\Y2#„B!„BˆG"w ÜÜ|” Fücs7厦TųŠæß°¾/„B!„¢å²Ł%3:ž““lņr‹0ĖP©šōrE«õA£i}SźXōņėœ9“@Tō†zĻmÉŻŠ·kŪųż¦’āįįf3ć·ļķšõóŗåu !„B!„­³É" I9|Žō“ŒĘ2ŒĘ2ŅÓr8rų I7„žŲŲ=ž’^ ō¼łÖøŁ}»m;6‚śßÖ:o„‚Żm«K!„B!lĶD’HOĖi4MzZŽUA‘øøƒ 0WMGÜŻ :„„ŖWIy{uįōéóÄÄüˆRįSē¼¢¢¢ŃüGŽœą”Gąā܁öķzņü»Ö{ŅķķķXŗä_ø»ŅĪæ_ż=ŁŁ¹(>̘žƽŗ Kzw?žŽ^]šóķĘśõ›,e]ŗ”¤‰³šó톓c;† ~ÜŅ–ōōL” ž4ė„zė»¶oåå弚ü«xztĘĆż,˜æ¤Ž÷»×t½m>yņ,J…ĻĢ}ŁRĘØ‘D©š!77æNłõĶ%3Õ}œ<éO<÷ēWpÕt$ CÆZctķóš9s¦eŒ~ū-„‡yĻ¼ĢšˆÉ„öØ·Ī¦óß/·s!ń2ßlÜÉW«#9v,Įr?55‹ļæŪĶĘ ?šŻ·»HNĪą§ųÓää°wļ1vķ:R§ÜœœÖ­ęąĮ3lݲ—¼¼"V}±Årßd2³rÅ&®\)i² B!„BŃŲT@D§Ó× †hµķŃjŪכ6=-Nß`YEE:†GL&%%Øč |µęcāāņĔ9lݶ€žżƒ9|$¶Ī¹^_Ņhžüü†…O";;—ß|AXX(Ė—½k BÄĒ!##‹ÅK——ĻœŁ 0Jqph@tōnŠŠtĢ›7ƒK—R˜žŌŸ‰ŽŚÅß/ ØHĒ3s_¦¼¼œŅR#ĆĀ'²gĻžóå‡ģŻ·•‚‚"ƌžJEElß[o}×öm×®8>üšsęĶ›ĮKóē²jÕ:āā6śl®·Ķ×ėŚ6ŚŪŪ_SU·nĘĖĖ“/V½ĮPʌéĻ‘™™]ļó>zōØåyU·Ó¦H˜ņÄćMÖY„RIyyÅz&fXDN’£± ƒĮȱ‡čŚ‰“†šŠĆ°{×JJJ錕ʁ{3hPŸ:åŚŁŁa4–”V«zĆmB!„w搐ś÷ļOhh(”””<śč£,Z“ˆÜÜÜßUn^^ĮĮĮ”””Ō:āneS{ˆ¤„e×:W«Õü?æv$$œ¢øøøNz& Ž²\\œI¾|w***čŁ³‡§¼¼œūļ@£q!8ø'ÅÅśZē&“©ŃüŪ¶ÅRPPČ«Æ½HDÄ ""±ś«,3 ÜÜ\Y±ņāęūļwœœBŪ¶>–ŗžßG’`õź$%]ęŠįX¼¼<Ų»ē›7G‘ššĮĻ?_ 1ń"Ƽņ<įį°déBʎ™Ftōnśõ ĄÕUSo}×öuūöXNœ8ĆüĻš×æ¾`U0ązŚ|½®mcC:vģĄŅ׫fœ:y–eĖŽe÷ī8&O~¬Īó āŌ©Sµ4 ›·¬ØóĢ­e6› Ŗś»óövG”P ×—RÆĆŁŁ _ßŖ=BŚ“ńĄÅʼnōōŪ5Z¦ØØØ¤k×KšęFŚ R9\÷Ų !„Bˆ;Ļ'Ÿ|BĻž=Šét¼ńƼžśėüæ’÷’nJłīīīÄÄÄąččų»ŹY¶lƆ £wļŽĶ=d¢²©"y¹Eõ^wuu£_æuf‹4” ²²’åĖŽ£×ƒP9hqÕtäšį˜Ķf*+MM¶„©ü©©éųųx7XF`ą’‚5ŽŽU_’KK–k’ė§§;®®¼¼<®žWżÓh4’’’Ą›o~€RįƒRįĆŲ1Óøpį7«ė«6th“&%*jƒ=N× ¹|9ÕŖgdm›ėÓŌ²kÜsæåŲׯ-Pµœ§¾ēuśōé:Ļ»k×Īæ» @­ …BQÕ7ƒ”GGU­tjµŠRƒŃŖ2•J„UĮĘŚ „B!lF£aęĢ™9rä†fc×G©Tāééł»÷=¼xńbshĮl* ŅŌ”’  ūéŃ£·Ué?śhļ¼ó S§N X }ÉeĖ,k4•ßļź—ńŒŒ¬Ėhź_.ÖžĖ§}ūŖ ĄK/Ķå·¤cµ>3fL¹īņųzż Ņ3βxń~ż5‰Õ«7Z•׌:Ŗg*äęęY®żśėļß 7-ķ³OŅÆ·ić]ļóźÜ¹nšĆŚ™07ĀŃQįšą‡Į`ÄŃImUžšC«P(Øß(+“å0B!„-Yu D©¬ś xōčQ¦NŹć?Ī“iÓ8yņ$æżöaaa|żõ׌7ŽˆˆÖ®][§¼k—ĢüśėÆĢ;—#F0jŌ(>žųcL¦Ŗccc?~<£FbņäÉ?~€·ß~›sēĪń÷撝W_}€Ÿ~ś‰'žx‚qćĘ1yņdöķŪĄłóē>|8ļ¾ū.3gĪlīį6¦"MM÷7KII¹dUśźåÉÉ)DEķāé™/XfuÄÅD„r@©TröģĻW—(jźĶ?bÄ\\œłģÓ/‰ŒÜɋ/¼†ZåĻG­ŗéćö :u`ƆĶ;vФ¤dęĪY@æ¾į6żę’kūśÉ'_āéљżūŃ®½ØZ6r3učŠgēÖDFīäƒVņĢܗ)*Ŗjk}3®mcCĮ®„„ ¼łęlŚÉ矯ĮŃQĶąĮė}Ž™™™–ēeĶøüŽ=8“žŽčõ23«‚@™™yčõ“ŚŖYDJ;„Õu89©1›ĶäåVõūü„;ź­EB!„āöÉĶĶå³Ļ>cąĄŲŁŁQXXȂ xī¹ēųī»ļųóŸ’Ģ‚ 0 (•Jōz=eee|’ż÷¼÷Ž{¼’žū¤¤¤4X¾ŃhäłēŸgģŲ±ģŲ±ƒuėÖ±’~¶oߎĮ`ąĶ7ßäõ×_gŪ¶mŒ7Ž7Žx€… āźźŹŅ„KY¾|9łłł,Z“ˆ… ņż÷ßóź«Æņ׿ž•ÜÜ\Šétø¹¹ńžūļ7÷ aSO/×&sōh<łłyV„öŁ™ >˜M›"łÓ¬—šńńbĖÖ5ųūū1gö|Zµjży3ČĻ/ą…ē_„¬ĢXė|꓉ę÷ńńbGä×x{{1iā,¶oåÅg3gĪ“›>.jµŠč˜ōķŪ‹gē-bŌČ?¢Ó]į«5ŸŠ”C»&ó_Ū׈ˆG8°?3¦?ĒĖ _ēÉ'Ē3{öĶm·££šĻVüw–,~wwWʎŌæ¤ęŚ6źõõo˜;xš.$^dź“ĻąāāĢŚuŸįķķYļóžōÓO-Ļ˚qiØĪėyNƒ‡„ą7ü@|üié‹Z]µŒ¦Kē{Ų»÷Ū¶ī³¢,čÕ…ØØx¾ŁøggGģķķdYŒB!D ńģ³ĻņšĆóąƒ2lŲ0ڶmĖ’%K8|ų0mŚ“!$$ØŚ„ÕŻŻ£GU?@Ž3€.]ŗŠ±cGN:Õ`]'OžÄd21lXÕ]\\X·n£GĘŃёݻwÓ­[7śōéCjjŖeöHMGŽ”mŪ¶ōźÕ €īŻ»£Õj9zō( …‚ŅŅR&L˜€‹ĖĶż1V“\7ņ“±¢ĘŖ6f­ž8*@ 8N@ė«ĒÕēźiŖÓ«Ģfó"k*_æ~=“&Ŗ÷žN§ēČįs–óN:ćē׎sēNÖ „TėrMėŪ;ā¢Yäęęćć}/#Geė¶5V幐XĄ:»7wÓÅm ĻśÖqBq+lXæ‹qćĘug×÷ćO}×>ūąm†…¾īŗ£cvņā_7÷4)$$„+VгgOŹĖĖ?~<Ó§Oē±ĒąėÆæęĆ?ÄÓÓ³V¾gŸ}–{ļ½—ńćĒsäČĖ ćŁ³gFxx8įįįģŪ·ƒĮ`9޽{7kÖ¬ażśõuŚb2™ųä“Oˆ‹‹ĆĮĮ²²2~żõW:„C‡埒ü'½{÷fŻŗuģŁ³‡+VXņWׯ·o_ž|ņI~śé§ę^q(Š÷€RĄxõS}\rõø0\=Æ>®NWTŌų˜k|¬fSo™ŃhZć§õ¶¼z7++ƒōō C“~Zo †ÜD……E¼’ފļæ4īM_Vs#d†„B!„hIZµjųĻ>ĖŪoæĶ!CpvvĘÓӓ:°nŻŗ:é/]ŗT½™ĘÕÕÕrģęęÖ`^^^äęęb6›ė,ÓŽ½{·e››‰‰‰<ńÄõ–ćééIAAA­kxyU½šA–€‹›Ķ¦–ĢąwuĻ…āā+ CŖ_9*n77W–¾žrƒŸ;!"„B!DK4dČڶmĖŹ•+čŪ·/ééé–ĶMÓŅҘ0aEEUoįT(lŻŗØz LRR’å¾õyąppp`ćʍ˜ĶfŠ‹‹™1c6l@§Óįāā‚F£”““Ō2‹¤z3ÖV­ZYź !++˲Įė‰'ČŹŹ¢OŸ>Ķ=„ĀFŁŌ ‘jAAhµ>¤„e“—[„ŃX†J倧—+Z­Ģ i¼¼<0™³›»B!„BÜv …‚_|‘yóę1nÜ8ī¹ēŽ~ūmŽ}÷]®\¹‚½½=3gĪÄÕՕ‚‚ģģģP(Lœ8½^Ļüłóńóó#//ÆŽņU*ļ½÷oæż6«V­ĀĪĪŽĮƒ3~üxJJJˆŽŽfäȑ“mŪ–E‹qńāEžyęÖ¬YĆØQ£ųūß’ĪŗuėųüóĻł×æžÅ[o½Eii)ŽŽŽ¼õÖ[ø»»“ŸŸßÜĆ(lMķ!"ÄĶ$ū“ņ¬o W!„·‚ģ!rk]ŗt‰I“&q芔ęnаawŹ"6·dF!„B!č“}÷DK!!„B!„B“8B!„B@‡8|ųps7CˆŪB"B!„B!„hq$ "„B!„Bˆē®|ķ®ļęn‚h äo­Åg}kČø !„Bˆ;—ĢB!„B!D‹#!„B!„B“8wå’!„B!„õÓėõ|śé§ģŻ»—’’ ̚5‹ęnžw ™!"„B!„6dłņådee±zõjvīÜItt4ćĒgóęĶTTT°lŁ2Ž;fUyדVˆ»‰ĢB!„BrōčQ^żuÜÜܰ³³c芔 :Ō’ęāŋV—w=i…ø›Č !„B!„°!|żõ×dgg×{’ķ·ßęܹsüżļēÕW_ 66–ńćĒ3jŌ(&OžĢńćĒėM›˜˜HhhØ„¬ŹŹJ‚ƒƒIOO`ŊŒ7ŽĒ{Œ±cDzbÅ Ģfss‰õ’€Č(77…BĮȑ#›»)B!„Bˆ»Ģßžö7Š‹‹1bO<ńļ¼ó§N²Ü_øp!®®®,]ŗ”åĖ—c0xóĶ7yżõף¶mćʍć7ŽØ7mcΜ9ƦM›X³f ›6mbõźÕüśėÆ\¾|¹¹‡DˆzŁl@D§Ó‘@\\;wī$..Ž„„t:ŻM«ćå—_fŲ°a žŪ[īŪŻbß¾}–Č»B!„ ń÷÷gÕŖUlÜø‘±cĒ’ššŹÜ¹syå•Wź­įččČīŻ»éÖ­}śō!55“Ét]õŗøø ×ėŁ¼y3)))h4Žzė-ī¹ēžę!źe“{ˆ$$$––VėšŃh$--““4“Z-AAA滞ŲŲX|}}<’½ Åķ“ė쫸ż š» B!„ā.@@@'Nä·ß~cŹ”)=z”>}śŌJg2™ųä“Oˆ‹‹ĆĮĮ²²2€ė^źŅ”C>ūģ36nÜČŚµkxģ±Ē˜9s&J„Ķž/īb6÷WY_0äZiii$$$4YV\\ @£ŃąęęĘŠ”C-ł¼¼¼8}ś4111(Š:ēę8rä>ų ĪĪĪ“k׎ü浞„cooĻ’%KpssĆßßŸÆæž€ģģl Ó§OēÕW_ÅÅŅ€€āāāųųćńņņĀ×חõė×[Źŗté'NÄ××GGGliKzz: …‚Y³fÕ[_}}kHSe55®7»of³™ēŸÜŻŻ™?~³®a,**āĖ/æ$11‘7²zõźZ;v§¦¦ņŻwß±aþżö[’““ˆ'''‡½{÷²k×®:åęää°vķZ<Ȗ-[ČĖĖć‹/¾°Ü7™L¬X±‚+W®4Ł!„Ba{:v숻»;EEEuīķŽ½›;všé§Ÿ²zõjĖr™ś(•ŹZ3G®ÄŅ„Kٱc~ų!‘‘‘DFF6w÷…Ø—MDt:]­`ˆV«E«Õ֛6--­Ńå3EEEDDD’’Btt4kÖ¬!..Ž)S¦°mŪ6ś÷ļĻ‘#GźœėõśFóēēēNvv6ß|ó aaa,[¶¬Vą >>žŒŒ –,YB^^³gĻĘ`0ąąą@tt4EEEĢ›7K—.ńŌSOÅāŋ)**bīܹ”——SZZJxx8{öģįĖ/ædß¾}0zōh***,åmß¾½Žś®ķ›½}Ć‹š*«©q½Ł}‹‰‰įĆ?d޼y̟?ŸU«V×l£J„’ņņrōz='N$""‚ćĒc41 ÄĘĘʤI“xųį‡Łµk%%%„††¢R©8p ƒ ŖS®F£µZMDDÄ ·A!„BÜŻ._¾ĢŠ”Cٵk„„„³råJŹŹŹ U«V–ąˆN§ĆÅōFCii©åĒĒ’’’:i½½½1™LüņĖ/|’ż÷–Ł‘‘‘üķo³üw„ææ?nnn²©ŖøcŁŌ’™kg†ØÕjšóó#!!āāā:é5M½e¹øøX6’ńšš ¢¢‚ž={rčŠ!ŹĖ˹’žūŠh4[Ź®>7™Lęß¶m¼öŚkDDDĮW_}TmŖ ąęęĘŹ•+8pąß’=ÉÉÉ“mŪÖR×G}ĄźÕ«IJJāšįĆxyy±gĻ6oŽLjj*?’ü3‰‰‰¼ņŹ+„‡‡°téRƌCtt4żśõĄÕÕµŽś®ķ«5*«sēĪŽKµ›Õ·j'Nœ`Į‚üõÆm4 s;˜ĶfĖ’-ooo z½žüü|œ-K“Ś“iƒ‹‹ ééé6YnEE]»vµ•n¤ *•ŖYĒF!„Bü>ķŪ·ēõ×_g͚5ü󟒤¬¬ gggzöģÉ_|ayļØQ£ųūß’Īŗuėx÷Żw‰ŽŽfäȑ“mŪ–E‹qńāEžyęÖ¬YS+ķēŸάY³xī¹ēpuueśōéØÕjL&>ś('Oždüųń( ģģģxä‘G1bDs‹õ²©€Hu įZ®®®ōėׯĪrš†ŅCÕ룖-[Ę·ß~KFFöööFĢf3•••M¶„©ü©©©ųųų4XFĶ/ĮŽŽŽ–(/T­ ¬ęéé‰Į`ĄĖĖĖrU{§¤¤¤šę›oņę›oÖŖćĀ… –€HSõ]†Ź²v\oVߞ}öY&MšÄʍ‰ŒŒ$00]»vѾ}ūź×ĶR3h”P(0›Ķ k„S«Õ «ŹT*•VCkƒB!„øū…††Öz5n}ęĪĖܹs-ē+V¬Øu’æ’żoƒigĻžĶģŁ³-ē5ÕÆńān`SKfššņD=¬J’ŃGńĪ;ļ0uźTōz=%%%–™Öh*柟 –ŃŌ¦ŖÖnŗZżå’„—^"))©Ögƌ×]ž5*ĖŚq½Y}spp`żśõddd°xńb~żõWVÆ^}Óśy39::Ö ~ œœœ¬Ź_sĢ® pToŒ%„B!„¢ŠMDššī_sFAS髗Ą$''ÅĢ™3-³:āāāP©T(•JĪž=ĖöķŪj6šĈøøøšé§ŸÉ /¼€J„²,¹™ĀĀĀčŌ©6ląŲ±c$%%1gĪśöķkigSćZ³oægƉ¦Ęõf÷måŹ•xxx°’~Kš¤”eRĶĶßß½^Off&™™™čõzĖ>8Õū„XĆÉÉ ³Łl™užüł;ź­EB!„BŃÜl* R½¤¢>©©©=z”üü|«Ņ?ūģ³ >œM›61kÖ,|||Ųŗu+žžžĢž=›V­Z1oŽ<ņóóyžłē)++«u>mŚ“Fóūųų‰··7'Ndūöķ¼ųā‹Ģ™3ē¦‹Z­&&&†¾}ū2oŽPµIõĒPjĄpZ_=®>W×HS^e6›YSłśõ뙄B!„BQ›zˌB!„B!„5$ "„B!„BˆG"B!„B!„hq$ "„B!„BˆG"B!„B!„hqīŹ·Ģ˜Éiī&ˆBžÖZyÖ·†Œ«B!„øSÉ !„B!„B“8B!„B!D‹#!„B!„B“8B!„B!D‹sWnŖ*„B!„¶ ““”Õ«W[Ī ŽŽŽųśśņĄąįįŃÜM¼ė¬X±µZĶ“iӚ»)ā'3D„B!„¢™)•Jŗuėƽ÷Ž‹³³3/^dÓ¦M¤¤¤4wÓn›““4V¬XAIIÉļŹóąƒŅÜŻw ˆÜrsóQ*|5ņĶŻ”f'c!„B!Z{{{BCCyųį‡;v,”””TVV²wļ^*++›»y·ErrņMÉsß}÷qļ½÷6wwÄ]Ąf—ĢčtzŅҲÉĖ-Āh,C„rĄÓĖ­Ö¦õM©cŃĖÆsęLQŃź=·%·³o¶<ŽæGܾ¶Ć×Ļ«¹›"„B!n±nŻŗqžüy ÉŹŹĀĻĻ£ŃČńćĒINN¦¤¤'''“Z-ĮĮĮ8:: ×ė9t蔕•ѦMś÷ļ»»;%%%¬Y³www&L˜`©kÕŖU˜Ķfž~śiK???:vģȑ#GhÕŖaaa”””šÓO?Šæ(++ćäɓ\ŗt‰āābi×®}śōA„Ra6›Y¹r%nnn 0€PTT„››=ō>>>lŪ¶ŒŒ Ö¬YCpp0½zõ"==£G’——‡B”ĄĒĒ‡ŠŠPÜÜÜĢsķ’™¦Ę͚ö Ūd“3D’8rųéi9ee¤§åpäš9’nJ=±±{=’½ Åķ®źėķ®ėN‹ęRP kī&!„BˆŪČÓӝN‡ÉdbŪ¶mœ9s??? @ūöķIHH ** “É„Éd"22’‹/Ņ„KśöķKVV‘‘‘F«ź“³³ °°ŌŌTڵkGqq1ū÷ļē—_~”S§N öļߏÉdĀl6³}ūvN:EēĪ>|8½zõāāŋÄÄÄU’-ÆT*1 &.ī OL™ĄÖmkčß?˜ĆGbėœėõ%ęĻĻ/`Xų$²³sŁųĶ„……²|Ł»–/śńńGČČČbń’äåå3gö †RZ½›¢"óęĶąŅ„¦?õg¢£vń·Å (*ŅńĢܗ)//§“ŌȰš‰ģŁs€’|ł!{÷m„  ˆ1£§RQQał—Čöķ±õÖwmßģķ^iU]ÖÖ­ŃxyyņÅŖ÷1J™1ż923³Æ{\«ėjh,bb~äĆ?g޼¼4.«V­#.ī`s’)6H©TR^^A±ŽĄ„‰ƒџĒĮh,Ć`0ņCģ!ś‡vgā¤!<ōšģŽu„’’Rś‡vG„r`ąĄŽ Ō§N¹vvveØÕ*†E„Žp„B!ĝĮl6“›› €««+ÅÅÅø¹¹ÕJēźź TĶ"©Nćģģl¹ßÆ_?f̘A§N®«~'''ģķķQ*•–’ĘÆ®«zyNee„e3ӂ‚¢££-Ÿ¤¤$ģķķŃéž7ĖŁŽŽŽŅ~„R‰““@ƒ?øšL&āććY·n+W®äóĻ?§““Ō2>Ö°fÜn“}āīgS{ˆ¤„e×:W«Õü?æv$$œ²ü”fz& Ž²\\œI¾|w***čŁ³‡§¼¼œūļ@£q!8ø'ÅÅśZē&“©ŃüŪ¶ÅRPPČ«Æ½HDÄ ""±ś«ŖDÜÜ\Y±ņāęūļwœœBŪ¶>–ŗžßG’`õź$%]ęŠįX¼¼<Ų»ē›7G‘ššĮĻ?_ 1ń"Ƽņ<įį°déBʎ™Ftōnśõ ĄÕUSo}×öÕ;v`éė/pźäY–-{—Ż»ć˜<ł±ėצƢś_N'Nœaž‚gųė__h4`s'0›ĶUżŻy{»£P(ŠėK)Č×įģ섯oÕ!mŚxąāāDzzķ-STTTҵk€%`v#mP©š{x„B!pöģYt:Ė’—ĀĀĀZé hŻśū$^¹rÅr|ņäIŽ?NHH;w ¤¤“É„R©¤  €ŠŠ ĖR™ėU]Ə£G¾©cpīÜ9Īž=K§N ÅĪĪŽµk×R^^nuÕĮ!kĘM“ūļukÆ^Ż­gåŹÆxå/’`ÅŹwh×¾*ŗ«ŃøÜŌń»]“žŽÄŝ 33¶m=ÉĢĢCÆ7 ÕVĶ"RŚ)­ŽēĆÉIŁl&/·O/7Ī_’7õ!„B܁Ōj5³g϶*­J„"44”ŠŠ†÷ŒsqqašąĮ ŽoÓ¦ ?žx­k'N“;88ŌiĻŌ©Sk5ŖNśõėGæ~ż¬÷駟®s­ę«ė¼)fųšįuņ=ńÄę¹¶żÖŒ›5ķ¶Ē¦Āaž^® ŽKMMęčŃxņóó¬J’ģ³3>|0›6Eņ§Y/įććŖ­kš÷÷cĪģł“jՊyófŸ_Ą ĻæJY™±ÖłŌiĶļććÅŽČÆńööbŅÄYlßĖ‹/ĪfΜi7}\ŌjŃ1éŪ·ĻĪ[ÄØ‘D§»ĀWk>”C‡vMęæ¶Æz½¾É<ƒąBāE¦>ł ..ά]÷ŽŽž×=®z}I£õLœ8†ū3cśs¼¼šuž|r<³gßü1¼Ōjƒ‡„ą7ü@|üié‹Z]µŒ¦Kē{Ų»÷Ū¶ī³¢,čÕ…ØØx¾ŁøggGģķķdYŒB!„B\u#?+j| j–IõĒPjĄpZ_=®>W×HS^e6›YSłśõė™4yP½÷t:=GŸ³œwźŌ?ævœ;w²V ¤ZŸūŠhd›)77ļ{9r([·­iīęü. ųCg÷ęn†ø äYß2®B!n… ėw1nÜ8 īhõżųSßµĻ>x›aį Ļ¢hHtĢN^üĖāę!īz …ā= 0^żT—\=. WĻ««Ó•5>ę«ŁŌ’¦5~ZoĖ«w³²2HOOĮ`0ŌIė§õ–`Č (,,āż÷V4xŚS“Ł S!„B!ÄĶ¦"€åU¢éi9_©7ŸÖŪ’N\77WĖėtėSżš\!„B!„āNfsØ Šhµ>¤„e“—[„ŃX†J倧—+Z­Ģ ¹…¼¼<0™³›»B!„B!D£l2 UĖg4™"„B!„Bˆŗlź-3B!„BŃŅ 4ˆńćĒ×{ļ‰'ž`Š A×YāĶ‘——Gpp0%%%ææ0!n ˆ!„B!„Ńėõ$&&Öŗvłņe ›»iBÜ1$ "„B!„6&$$„čččZ×bcc鯻ws7Mˆ;†D„B!„ĀĘ 8~ų³Łl¹Ė€j„‹eüųńŒ5ŠÉ“'süųq j6É#<ĀŽ;˜0aC† aŊ$&&j)£²²’ąą`ŅÓÓ-Sˆ;D„B!„ĀĘtģŲ'''Μ9Ąoæż†B” cĒŽ–4ƒ7ß|“×_mŪ¶1nÜ8Žxć ģķķŃėõdeeńĶ7ßšžūļółēŸ£Óé­·±2…øÓܕo™QąŻÜM-Bü­µņ¬o W!„¢9…‡‡C÷īŻ‰e芔µī;::²{÷nĖyŸ>}xė­·0™L˜L&ʍ@×®]Q*•dgg7ZgSe q'¹+"B!„B!ĪĢ™3Y°`?üšļ¾ū.ååå–ū&“‰O>ł„øø8(++صĢĘÅÅÅr¬T*› lXS¦w ˆ!„B!„ Ņjµ“mŪ–M›6įččHūöķ¹xń¢åžīݻٱcėÖ­ĆĶĶÄÄDžxā‰&˽60RsĶ–)Ds=D„B!„ĀF…‡‡ółēŸ×Y.U 4 „„„¬_怒’’FĖōööĘd2ńĖ/æšż÷ߣT*W™B4 ˆ!„B!„2dyyy <øŽ{®®®Œ9’yóę1qāDī»ļ>žyę™FĖtuueÖ¬Y<÷ÜsL˜0¶mŪ¢V«1™L7\¦ĶA–Ģ!„B!„ ٵk—åŲŪۛÇ[Ī;uźd¹ļāāby•nµ’ž÷æ–ć£GÖŗo9ž={6³g϶œ1Ār|=e ќd†ˆB!„B!Z ˆÜrssQ(Œ9²¹›"„B!„BŲ$› ˆčt:ˆ‹‹cēĪÄÅőPkäßėå—_fŲ°a žŪ[īŪŻbß¾}¤§§7w3„B!„Ā&Ųd@$!!Ć‡“––†ŃhĄh4’––ĘįƇIHHø)õÄĘĘ6zž{)ŠŪ3`7ŠWqū4w„B!„ĀfŲ\@$!!“““FÓ¤„„Y‰‹‹cĄ€h4ÜÜÜ:tØ%Ÿ——§OŸ&&&…BQē¼¢¢¢ŃüGŽįĮÄŁŁ™vķŚńü³Łl¹oooĻ’%KpssĆßßŸÆæž€ģģl Ó§OēÕW_ÅÅŅ€€āāāųųćńņņĀ×××ņŠ+€K—.1qāD|}}qttdšąĮ–¶¤§§£P(˜5kV½õÕ×·†üöŪo( žyę"""čßæ“cŁTż[¶l”sēĪ“nݚiÓ¦1mŚ4 ©©©MöĻl6óüóĻćįၻ»;óēĻÆ5Ī·SQQ_~ł%‰‰‰lÜø‘Õ«WsģŲ1ĖżŌŌT¾ūī;6lŲĄ·ß~Krr2PµUNN{÷ī­µIVµœœÖ®]ĖĮƒٲe yyy|ńÅ–ū&“‰+VpåŹ•&Ū „B!„-MDt:]­`ˆV«E«Õ֛6--­Ńå3EEEDDD’’Btt4kÖ¬!..Ž)S¦°mŪ6ś÷ļĻ‘#GźœėõśFóēēēNvv6ß|ó aaa,[¶¬V >>žŒŒ –,YB^^³gĻĘ`0ąąą@tt4EEEĢ›7K—.ńŌSOÅāŋ)**bīܹ”——SZZJxx8{öģįĖ/ædß¾}0zōh***,åmß¾½Žś®ķ›½}Ć/'Ŗ.kÓ¦M888šÄO49–M՟Ķäɓ)**b͚5Ü{ļ½lŲ°•JÕd’bbbųšĆ™7oóēĻgÕŖUÄÅÅ5ĖߨR©¤¼¼½^Ļĉ‰ˆˆąųńćF ±±±„††2iŅ$~ųavķŚEII ”””ØT*Č Aƒź”kgg‡ŃhD­VqĆmB!„Bˆ–¦^»{ķ̵ZM@@~~~$$$P\\\'½F£©·,._¾ €‡‡ōģŁ“C‡Q^^Īż÷߀F£!88ŲRvõ¹Édj4’¶mŪ(((ąµ×^#""‚ˆˆ¾śź+ jSU777V®\ ĄųžūļINN¦mŪ¶–ŗ>śč#VÆ^MRR‡ĘĖĖ‹={ö°yófRSSłłēŸILLä•W^!<<€„K—2fĢ¢££éׯPõ>ńśź»¶ÆÖŠh4lٲ É±ØÖPżĒ§““” šŲcńŲc±qćFN:…B”ąĒl“ÕNœ8Į‚ ųė_’ŚhPēV3›ĶUÆAS(čõzņóóqvvĘ××€6mŚąāāBzz:M–[QQA×®]-¦iƒJ„j¶qB!„BˆŪɦfˆT®åźźJæ~żźĢi(=@ee%Ė–-恥ĮĮFĆįƇ1›ĶTVV6Ł–¦ņW/õšńńi°Œš_‚½½½(--µ\ °{zzāźźŠ———åŖöNIIIąĶ7ßD”P P(3f .\°ŗ¾ėѵk×ėˆźĻĪĪØõüŚ·oo9nŖC‡eҤIDEE1hŠ ‚‚‚,šęR3h”P(0›Ķ k„S«Õ «ŹT*•VCkƒB!„B“6ijŹPP=zō°*żG}Ä;ļ¼ĆŌ©SŃėõ”””XfJX£©ü~~~ddd4XFS›ŖZ»éjušą„—^"))©Ögƌ×]ž5jĪĄ°v,Ŗæ:ČSsŠ„K—¬īŸƒƒėׯ'##ƒÅ‹ó믿²zõź›ÖכÅŃѱNšĆ`0ąäädUžšćwm€£¬¬¬¹»'„B!„w› ˆ45Żæęl‰¦ŅW/INN&**Š™3gZfuÄÅÅ”R©P*•œ={–ķŪ·Ō:/,,l4’ˆ#pqqįÓO?%22’^x•JeYs3………Ń©S'6lŲĄ±cĒHJJbΜ9ōķŪ×ŅΦƵfß®wƉ¦Ę²)>ś(­ZµbåŹ•|ūķ·¼ńĘüņĖ/V÷oåŹ•xxx°’~K𤔄RĶÉßß½^Off&™™™čõzĖ̘ź}B¬įä䄣l¶Ģ‚:žüõÖ"!„B!„hn6©žIPŸŌŌTŽ=J~~¾UéŸ}öY†ΦM›˜5k>>>lŻŗfĻžM«V­˜7ołłł<’ü󔕕Õ:Ÿ6mZ£ł}||ˆŒŒÄŪŪ›‰'²}ūv^|ńEęĢ™sÓĒE­VCß¾}™7o#GŽD§Ó±fĶ:tčŠdžkūŖ×믫ž¦Ę²)~~~üē?’A­V3cĘ RSS:t(P5¢©žMœ8‘2}śt.\ȓO>iU½·›Z­fȐ!8p€ 6ϐ!CP«Õtīܙ½{÷²uėV«ŹźÕ«QQQlÜøgggģķķeYŒB!„B\u#?+j| jcÖź Ō€#ą“¾z\}®®‘¦:½Źl6/²¦ņõė×3yņäzļét:>l9ļŌ©~~~œ;w®V ¤ZHHČ9S@ŌĻd2”TVÅš~ųaĖŪ|ģģģnI}‰‰‰tīܹ¹»-nyÖ·†Œ«Bˆ[ażśõŒ7 Ī=õżųSßµĻ>x›aჯ»ī蘝¼ų—ÅĶ=BÜõ Å{@)`¼ś©>.¹z\ ®žWW§+*j|Ģ5>V³©·Ģh4“Z­eƉ¬¬,ŅÓÓėŻ”R«ÕJ0äņŽ{ļ5xžüł7}\ ÷Ž{/åååüē?’!''‡Ÿ~ś‰‘#G޲`ˆB!„BŪfSĄņ*Ń“““:ÆŁ­¦Õj-éÄõqssćõ×_æ­u:::ņŁgŸńŚkÆńŲc”Ńhųć’ČŪoæŻÜĆ!„B!„ā.esØ ŠTĻÉĶĶÅh4¢R©šņņ’™!w©aƆ1lŲ°ęn†B!„Ba“ØZ>#!„B!„BŌǦŽ2#„B!„Ba ˆ!„B!„¢Å±Ł%3B!„Bq§+--eõźÕ–s…B££#¾¾¾<šĄxxxXī­X±µZĶ“iӚ»Ł7…­õGÜ}$ "„B!„ĶL©TҵkW*++ÉĖĖćāŋ\ŗt‰”C‡Ņ®];|šAģģ욻©7$--;všä“Oāäät×÷GŲ ˆ!„B!D3³··'44Ōr~öģYāć棻w/S¦LĮĪĪŽū¹›yƒ““ė\»›ū#lĆ]1“ÓÜM-„ü­µņ¬o W!„āĘtė֍óēĻSXXHVV~~~u–˜¤§§sōčQņņņP(ųųųŠ››łłłģßæŸ¼¼<Ōj5}śōįčŃ£\¹r…?żéO˜ĶfV®\‰›› ąĄįęęĘC=„F£‘ćĒ“œœLII NNNhµZ‚ƒƒqtt %%…cĒŽQPP€ŁlĘĆƃąą`üżżŁ¶m¬Y³†ąą`zõźU§?z½žC‡‘‘‘AYYmŚ“”’žø»»7Y‡7B6UB!„Bˆ;§§':®Ī=£ŃHLL łłł„……Ń»woRSSٹs'•••DGG“™™I—.]读7 čõz”ŹŖÆ …„R‰Į`ąąĮƒąēēGnn.»wļĄd2±mŪ6Μ9ƒŸŸ  }ūö$$$…Éd¢¬¬Œ˜˜*++ #,, ³ŁĢ޽{)++#$$yäėōĒd2ÉŋéŅ„ }ūö%++‹ČČHŒFc“uq#īŹ"B!„BaėĢf3@½ūlØT*f̘ŁlF”P`2™8qāłłł˜L&²²²(..¦M›6–„8Z­–µk×Ö*O”P`4 ĆĶĶ “ÉÄW_}…N§£¬¬Œ¬¬,ņóóńńńaĄ€’——GFF™™™ø¹¹a6›1 \¹rF…½}Õ×Ķ6mŚąąą`iCõ"5„§§SPP€ææ?ĮĮĮ@U (!!ŌŌT|}}­Cˆ!=B!„Bq‡1›ĶäęęąźźZē¾ÉdāąĮƒ$%%QRRb žTē-))@£ŃX®·nŻ{{ūZi”j’’źe6J„'''ŒF#XīWsuu%##N‡ŸŸ<ņĒēąĮƒ@U§K—.„††Zf¤4¦ŗggg˵~żśŃÆ_?Ėłļ­CˆkI@D!„B!ī0gĻžE§Ó”Ńh,{yŌtīÜ9Īž=K§N ÅĪĪŽµk×R^^`ŁŪ£ęr½^OEEÅu½Ł„:@QXXXėzAAPdŖY#”––’““Ć©S§8ž<~~~tģŲ±ÉzŖĖ¹råŠåŚÉ“'9~ü8!!!tėÖķw×!ĵ$ "„B!„ͬ¢¢‚ųųxĢf3łłłddd`ooĻĄėM_ųŠėõ\ŗt‰¤¤$T*ååå\¼x‘:ąččHVVńńńxzz’˜˜xŻ3)“Z-dgg‡ÆÆ/ééédeeįįįV«%##ƒ;wāėėKēĪ,KdŖ—ĒT/m9}ś4;v¬äńóóĆÕՕ““4Ž9‚³³3§OŸF©T`UB\/ ˆ!„B!D33™Lœ={µZM@@½zõ²l¬z­ūī»ĢĢL233¹rå ={ö¤{÷īģŪ·£G@xx8 !!gggBBBČĖĖ£²²Ņźv)•JFűcĒø|ł2‰‰‰“nݚū￟^½z”T*ńõõ„GüüóĻ–M]]]] £mŪ¶–ö’˜˜ˆ““S€ˆƇēŠ”CüņĖ/”••įććCæ~żhŻŗ5­[·n²!®—Dī@¹¹łųxßˈCŲ¶}ms7ē¦R*|čŪ·?Œnī¦!„BŃģŌj5³g϶*mĶt*•ŠįƇ×IóÄOXŽ}||xģ±Ē,ēeee”••ÕŚWä駟®Sʄ j«T*BCC-›³Ö§{÷ītļŽ½ĮūÕĖ]ꀋ‹ ƒ¾į:„ø^6Ńéō¤„e“—[„ŃX†J倧—+Z­Mė›RĒ¢—_ēĢ™¢¢7Ō{nKnVß¾ßō_<<ܚ»;w„ø}' l‡ÆŸWs7E!„BÜvģŲA~~>=zō@£Ń˜˜ ūmq•MD’HOĖ©uĶh,#=-‡ō“ü“Žüīzbc÷ąėŪ¦ĮóßK”PܾA»Ī¾ŽØ±c#š»+w­‚Żļ/D!„B“}ūöåšįĆ?~œŹŹJ\\\¦gĻžĶŻ4!ī6÷n¢ś‚!×JOĖ!!!©É²āā2pĄh\5qw $|čŖ¢ŖŽ^]8}ś<11?¢TųŌ9ÆØØh4?Ą‘#'xčĮø8w }»žüć’®õ ,{{;–.łīn“óļĮ×_@vv.J…3¦?ĒkÆ.Cć@Ē€ŽÄÅäć’ƒ·Wü|»±~ż&KY—.„0iā,ü|»įäŲŽ!ƒ·“%==„‡?Ķz©Žśźė[Cśõ†² 99yäääaoזŖ–Ģōļ7ĢŖvµoד‡iI;ūOóQ*|˜;g”åŚĄ£¹§ż˜Ķf^xžU<=:ćįžĢ_Rēubw‚¢¢bžūåv.$^ꛍ;łju$ĒŽ%Xfńżw»Łøį¾ūvÉÉüšœœöī=Ę®]Gź”›“SĄŗµŃ&.ī OL™ĄÖmU{{ōļĢį#±uĪõś’Fóēē0,|ŁŁ¹lüę ĀĀBY¾ģ]K >žY,^²€¼¼|ęĢ^€ĮPŠƒC+¢£wST¤c޼\ŗ”Āō§žLtŌ.ž¶xEE:ž™ū2åå唖>‘={šŸ/?dļ¾­1fōT***,»3oß[o}×ö­z‡čśŒŸ0³ŁLLĢDFīÄd21yŹø:i›jWDÄ >^_õ^õ;~ąž{ü‰Œ¬ŚDIÆ/įąĮcŒ1˜˜˜łšĆĻ™7o/͟˪Uėˆ‹;ŲÜ’u(•JŹĖ+(Ö˜0q0Ć"śsāų/e F~ˆ=D’ŠīLœ4„‡~€Ż»ŽPRRJ’ŠīØT Ų›AƒśŌ)×ĪĪ£± µZۈŠnƒB!„B“6µd&--»ÖyÕīĢĄĻÆ §(..®“^£©錋‹3ɗOąįįNEE={v抔攗—s’żAh4.÷¤øX_ėÜd25šŪ¶X yõµ‰ˆDDÄ Võ1Pµ©*€››++V¾@üĆ|’ż’“ShŪÖĒR×’ūč_¬^½‘¤¤Ė:‹——{÷`óę(RS3ųłē $&^ä•Wž'<ü–,]ČŲ1ӈŽŽMæ~Įøŗjź­ļھ6füųQ,złub¢wóä“ćپ-;;;&L]'ķ?īo“]óråWģß722²ųlÅæ™3{'Ož%33›ņņr†b™µrāÄę/x†æžõ…F7ĶÉl6[–ly{»£P(ŠėK)Č×įģ섯oÕ!mŚxąāāDzzķ-STTTҵk€%`v#mP©š{x„B!„ā¶°©"y¹Eõ^wuu£_æuf‹4” ²²’åĖŽ£×ƒP9hqÕtäšį˜Ķf*+MM¶„©ü©©éųųx7XF`ą’‚5ŽŽU_’KK–k’ė§§;®®¼¼<®žWżÓh4’’’Ą›o~€RįƒRįĆŲ1Óøpį7«ė³F‡ķčÓēbcÄh,ć‡ö2hŠĆx{×}]XSķA›6ŽģŲń»vīC­Vńč£3th“&%*jƒ=N× ¹|9õŗŚ~;Õ Z(U ƒ”GGU­tjµŠRƒuĻ@©TZ i¬ B!„BŃRŲT@¤©)’AA÷Ó£Go«ŅōŃ*Žyē¦N@±žś’Ė–™Öh*æŸ_Õ»²32²,£©MU­Żtµ}{^zi.æ%«õ™1cŹu—×”ńF“““LJ~ŽNw…I“«7]SķrvnĶCõe÷īżüšĆ†Œƒˆł‘Ż»ćx䑇prrÄĮĮÆ×Æ =ć,‹/ą×_“X½zćMéĻķāčØĘpMšĆ`0ā褶*ĶǧP(Øß(+“å0B!„-Įœ9sųōÓOė½÷É'Ÿ0gΜė*///ąą`JJJX¾|9C‡ÅdjśGāš‚ƒƒ9žümƒšm¾¶ż7Śoa›l* ŅŌt£±”””KV„Æ^“œœBTŌ.žžł‚eVG\ÜAT*”J%gĻžĢöķ±€¢ÖyQ”®Ńü#F ĮÅřĻ>ż’Čȝ¼ųĀkØUž|ōŃŖ›>.aaŅ©S6lŲ̱c§HJJfīœōėNaaÓo.¹¶ÆMžĘÆŚ@õ­}€JåĄøq#nø]ĆqüųiŽ?ƈ‘C>b‡ēäɳ 1€•+æĀÓ£3ū÷¢]{-PµÄēn¢õ÷FÆ7™Yµ!mffz½­¶j‘ŅNiõ>NNjĢf3y¹…$œætG½µH!„BÜ£G&22²Īģ_³ŁLTTcƌ¹®ņÜŻŻ‰‰‰ĮŃŃ“ÉĖ-[ųōÓO›ecÖeĖ–qģŲ±ŪR~Ķ~ ŪeSO/×&sōh<łłyV„öŁ™ >˜M›"łÓ¬—šńńbĖÖ5ųūū1gö|Zµjży3ČĻ/ą…ē_„¬ĢXė|꓉ę÷ńńbGä×x{{1iā,¶oåÅg3gĪ“›>.jµŠč˜ōķŪ‹gē-bŌČ?¢Ó]į«5ŸŠ”C»&ó_ŪW½^ßhś€€ö÷$77ŸaĆÅÕUsĆķ>|0•••( † ĄŠ”a˜ĶfĢf3Ƈ`āÄ1 ؟ӟćå…Æóä“ć™=ūęå­¤V«<$„ų§ŲøįāćO3xH_ŌźŖe4]:ßĆŽ½ĒŲ¶uŸe9š@Æ.DEÅóĶʝ8;;boo'Ėb„B!lÜ Aƒ(,,ääɓµ®Ÿ8q‚¢¢"}ōŃė*O©Tāéé‰B”Ąh4RYY‰««ėu•q³\¼xń¶•_³ßĀvŻČÓUŌų@ÕʬÕ@ØGĄ h}õøś\]#Muz•Łl^dMåėׯgŅäAõŽÓéō9|ĪrŽ©SgüüŚqīÜÉZj}BīC£i}{G\Ü5.$š‡ĪīĶŻ qȳ¾5d\…BÜ ÖļbÜøŖ7Ö7 āZõ]ū샷>ųŗėŽŽŁÉ‹YÜÜCФüć( žö·æÕŗ¦T*yķµ×8zō(ļæ’>%%%“nݚłóēÓ³gOΟ?ĻĀ… 2dgĪœį’žļ’gß¾}¼śź«ģßæŸ{ī¹~ųa¦Mūߏ7n$66–Ļ?’¼N›‚ƒƒY½z5ĪĪĪ<õŌS,\ø/æü’ĀĀB&L˜ĄģٳX±bŃŃŃ5~Οžō'žżļóĶ7ߊ¦MŗuėĘņåˉeŊFZ·nĶ¢E‹čÕ«yyy–6 ˱““SƒyŽ~ūķZå/X° V¾Ÿ~ś‰?üŅŅR˜7o ąņåĖöGŌO”P¼”Ę«Ÿźć’«Ēŀįźyõquŗ2 ¢ĘĄ\ćcµ;ó57H£iŸÖŪņźŻ¬¬ ŅÓS0 uŅśi½%r ‹x’½ ŽižÜ»n©ŠB!„¶dōčѼšĀ ,Z“ŹŹŹŲµk~ų!………,X°€’ūæ’#$$„Ƈ³`Į¶oߎƒƒ:777Ž’żZ{Ń-_¾œ°bÅ Nž<ÉūļæĻ“O>iY>³uėV¦NŚhŪģķķŃėõdeeńĶ7ßpžüy¦OŸĪäɓINNfÓ¦M|÷Żw899”Óéų’žæ’Ė—/³pįBbccYŗt)½{÷Ę`0šę›oņĮŠ­[76nÜČo¼ĮęĶ›¬»±<זŸ—÷æŌóóóY“hļæ’>½zõāōéÓ<óĢ3lٲ„Ńžh4ÄĶ¦"€åU¢éi9_©7ŸÖŪ’N\77W–¾žrs7C!„Bр=ząįįĮ޽{2d{öģĮŪŪ›ū￀ÇӦMBBB ĮŻŻ£GāēēGii)&LĄŁŁ¹V` ¦Gy„wŽy‡ššĆsį²²²¬Z’c2™,³|ŗvķŠR©$;;ōz=›7oęᇦ]»v¼õÖ[õ–įččČīŻ»-ē}śōį­·Žjt³×Ęņ4¶'Ź‘#GhŪ¶-½zõ {÷īhµZŽ=J÷īŻģDī|6Ŗ ˆVėCZZ6y¹EeØTxz¹¢ÕśČĢ!„B!„M«Ž\uȐ!DFF2jŌ(˽¼¼£ŃČ,!„B!DĖ3bÄV¬XAZZGŽaɒ%–{žžžt芁uėÖÕÉwńāE«77n«V­"%%…˜˜žóŸ’üīv±téR~ūķ7.\HŪ¶m9rd­t»wļfĒŽ¬[·777yā‰'-ūFņTWAAA­kxyyżīžŠęeSo™B!„BŽŽŽóĻž“¾}ūāįįa¹×·o_ŅÓÓ9~ü8iiiL˜0¢¢¢ėŖĆÕՕ!C†š·æż{ļ½??æßÕęČČHžö·æa4š÷÷ĒĶĶĶ2ƒ£U«V–6źt:\\\Šh4”––²~żzJJJ,æ©<5ĖÆ)$$„¬¬,Ė›{Nœ8AVV}śō¹5OÜ6B!„B4zōh<ČčŃ£k]wuuåķ·ßęŻwßeģŲ±¼šĀ ̘1ć†^§;yņdĪ;Ēųńćw{}ōQœœœ?~<£GfҤIōģŁ“#F0jŌ(žž÷æ3kÖ,† ‚««+#GŽd޼yLœ8‘ūī»gžy¦Įņ›ŹS³üšÜŻŻł×æžÅ[o½Åøqćxūķ·yė­·ź,£w›zķ®7“¼2“åg}kČø !„øäµ»w–sēĪńŹ+ưeĖ–F7&¢¦;åµ»ņ+„B!„āŗéõzžżļ3uźT †ˆ»’üÕ !„B!„ø.«V­bŌØQtéŅ… &4ws„ø!wå[fx7wD‹P k-†<ė[CĘU!„°U3gĪdęĢ™ĶŻ !~™!"„B!„BˆG"B!„B!„hq$ "„B!„BˆG"B!„B!„hq$ "„B!„BˆG"B!„B!„hq$ r›äęę¢P(9rds7/ĮÕDžIDATåŽn“B!„Bq;Ų7wnNGZZ¹¹¹FT*^^^hµZ4ĶmiĆĖ/æĢ™3gˆŽŽnīį6`ß¾}āēē×ÜMB!„Bˆ»žMDHKK«uĶh4’––FZZZ­–   [ŽŽŲŲX|}}k]S(Ķ=ˆ³³3ķŚµć’ųf³¹Év6•·©6]ŗt‰‰'āėė‹££#ƒ¶jģDżŠŠŠųņĖ/ILLdćʍ¬^½šcĒŽY¦ņŻwß±aþżö[’““ˆ'''‡½{÷²k×®:åęää°vķZ<Ȗ-[ČĖĖć‹/¾°Ü7™L¬X±‚+W®4Ł!„B!„h l* R½L¦šV«E«Õ֛6-- N×`YEEEDDD’’Btt4kÖ¬!..Ž)S¦XՖmŪ¶ŠæŽ9‚½}Õdœųųx222X²d yyyĢž=ƒĮŠhYłłł„‡‡“Ķ7ß|CXXĖ–-ć믿n²å­ÖP›JKK gĻž=|łå—ģŪ·‚‚Fm šˆė£T*)//GÆ×3qāD"""8~ü8F£ƒĮ@ll,”””Lš4‰‡~˜]»vQRRBhh(*•Ё2hŠ :åŚŁŁa4Q«ÕDDDÜp„B!„¢„°©%3×Ī Q«ÕąēēGBBÅÅÅuŅ7“Ÿˆ‹‹ —/_ĄĆƃŠŠ zöģÉ”C‡(//o²-÷ß?†ąą`rsspsscåŹ•8p€ļ撞äädī½÷ŽĖڶm¼öŚkDDDĮW_}TżņßX;ĖŪT›’’’HLLä•W^!<<€„K—2fĢ¢££e3Öd6›-K¶¼½½Q(čõzņóóqvv¶,³jÓ¦ ...¤§§Ųd¹tķŚ‡nƒJ„jīįB!„BˆŪ¦fˆTĮ斫«+żśõ«3[¤”ō•••,[¶Œx4 ‡Ęl6SYYYožšĖPR󋭷·7„„„ęIMMĄĒĒēŗŪŁXަڔ’’Ą›o¾‰B”@”P0fĢ.\øpćJŌ Z( Ģf3ƒGGĒZéŌju“3ˆŖ)•J«‚!µA!„B!Z › ˆ45å?((ˆ=zX•ž£>āwŽaźŌ©čõzJJJ,³>Ė/é5ƒ*æžśk“m¼‘ L«ß*’‘‘qŻķl,oSmjß¾=/½ōIIIµ>3fĢøī~ˆĘ9::Ö ~ œœœ¬Ź_ó9^ą(++kīī !„B!ÄŦ"MM÷7–YM„Æ^^“œœLTT3gΓ̶ˆ‹‹£C‡8;;É|ĄÜ¹s)**ŖfŠØT*”J%gĻžeūöķæė éˆ#pqqįÓO?%22’^x•JÅG}Ōd;ĖŪ”°°0:uźÄ† 8vģIIIĢ™3‡¾}ūRXXxžhĖāļļ^Æ'33€ĢĢLōz½efSõ>!ÖprrĀl6[vēϟ—· !„B!D 6µ‡ˆ——Wƒo˜IMM%99¹Ö/š^^^ –õģ³ĻņÓO?±iÓ&bbb˜9s&[·neҤIĢž=›¤¤$V¬XĮĖ/æĢāŋ™7ocĒŽå³Ļ>Ćh4ŅŖU+ęĶ›Ē_|ĮóĻ?OLLĢ ÷ĖĒLJČČH,XĄÄ‰iÓ¦ /¾ų"sęĢįŹ•+M¶³”¼M5Ōj5111¼üņĖĢ›7āābŗwļΚ5k芔C³>k[¤V«2d ¢¢‚V­Z1dČŌj5;wfļŽ½œ9s†Ń£G7YVÆ^½ˆŠŠB„RѳgOģķķ1›ĶB!„øƒ”––²zõź:םœœšóó£OŸ>øøø4w3wæ ŽŽŽųśśņĄąįįqKė’ā‹/P(̜9³¹‡BÜĮn䛑¢ĘŖ‚*Õ@ØGĄ h}õøś\]#Muz•Łl^dMåėׯgņäÉõŽÓét>|ŲrŽ©S'üüü8wīłłłu҇„„4ø©Ŗ‰‰‰tīܹ¹›!nyÖ·†Œ«Bˆ[ażśõŒ7Ø»‡_}{¢Õwķ³ŽfXųąė®;:f'/žeńMķOuą@©TҵkWK›³³³ÉÉÉĮĶĶńćĒ£TŽY“ūÓŅŅŲ±cO>łd½K¼ÆķWee%yyydggcggĒŠ”Ci×®ŻM©«>¹³)Š÷€RĄxõS}\rõø0\=Æ>®NWTŌų˜k|¬fS3D4 Z­Ö2K$++‹ōōōz7„ŌjµwL0¤°°÷Ž{ÆĮūóēĻæcŚ*„B!„øłģķķ µœ›L&ÖÆ_Oaa!………·|FÅõJNN¾”~={–ųųxöīŻĖ”)S°³³»iu q½l* X^%š––Vē5»Õ“Z­%ŻĄĶĶ×_½¹›!„B!„øƒ˜L&Ė쐲²2Nž<É„K—(..ĘŃёvķŚŃ§OĖžˆz½žC‡‘‘‘AYYmŚ“”’žø»»[U†ŁlfåŹ•ø¹¹1`Ą8@QQnnn<ōŠCųųų°mŪ6ĖKÖ¬YCpp0½zõ²ŖOŻŗućüłó’••…ŸŸééé=z”¼¼< >>>„††āęęÖ`]å©¦T*¹|ł2¤øøwww|šAĖ8›*#%%…cĒŽQPP€ŁlĘĆƃąą`üżż­~M•!š×5ļź& "$$­VkłCT©ThµZBBBīØ`ˆB!„BTTTO||<`óęĶ”””ąļļ››f³™ķŪ·sźŌ):wīĢšįĆéÕ«/^“ģWh2™ˆŒŒäāŋtéŅ…¾}ū’••Edd$F£ŃŖ2 J„ƒĮĄĮƒ ĄĻĻÜÜ\vļŽ Tm=P½ÆÉ#aaaōīŻ›ŌŌTvīÜŁ`]Må©VYYÉéÓ§éŃ£÷Ž{/999ÄĘĘRQQŃdeeeÄÄÄPYYIXXaaa˜ĶföīŻKYY™UcŁT¢łŁÜ ‘jF–™!„B!ī &“‰³gĻÖŗÖ­[7BBBČČČ 77OOO|||0™LøøøŠ¾}{.\ø@ff&ąļļOpp0PtHHH 55GGĒ&ĖhŪ¶- …£ŃHXXnnn˜L&¾śź+t:e։ƒƒP5ūŽŚ}=ŖUļėbgg‡J„bƌ–Ķ’M&'Nœ ??“ÉŌ`]å©žQSYYÉ#}„RI@@NNNM–”V«­n#ĄéÓ§éŲ±£e£ŅkUļb6›ÉĻĻ'##{{{` @čõz.]ŗDRR*•Šņņr.^¼H```ŗ¬Éc6›Q*•üųćtīܙœœrrrpqq”mŪ¶dff6ZFė֭ٽ{7¾¾¾tīÜĄ23ĘÉɉ6mŚ49–ģܹ³Į2D󓀈B!„BÜa:wīĢ™3gČĻĻēܹstė֍#FXŽjņĖ/æŠŖU+ڶmKpp°%1|ųp:Ä/æüBYY>>>ōė×Ļ2£Įš2¬qß}÷QXXHbb"NNN Djī¢V«  WÆ^–Ł*÷Żw™™™dffråŹzöģI÷īŻŁ·oG%  N]Öä1™L“nݚ   >LII m۶唇B©T6Yʄ čŃ£?’ü³e£UWWWĀĀĀ,ˊšK__ß&ĖĶKqƒy5ņŚ×ų8*@ 8N@ė«ĒÕēźiŖÓ«Ģfó"k*_æ~=“'Onīq-@bb¢%’+l›<ė[CĘU!Ä­°~żzʍŌŻc¢¾='ź»öŁo3,|šu׳“’²ø¹‡@ˆ»žB”x(ŒW?ÕĒ%W‹ĆÕóźćźte@E€¹ĘĒjwå 39ĶŻŃBČßZĖ!ĻśÖqB!„w*ŁÖV!„B!„-ŽD„B!„BŃāH@D!„B!„-ŽD„B!„BŃāH@D!„B!„-ŽD„B!„BŃāH@¤¹¹ł(>ŒłG›ŖK!„B!„`ßÜ øUt:=iiŁäåa4–”R9ąéåŠVėƒFÓś¶“aŃĖÆsęLQŃš{8„ ˆŪw‚ĄĄvųśy5wS„B!„ā®g“‘„„$ŅÓrj]3ĖHOĖ!=-?­7AA·¼±±{šõmcuz…BqŪĒJÜ= tĶŻ!„B!„°6·d¦¾`ȵŅÓrHHH²ŗĢ_x 7×NtčÅŚµßZ®ĒÅdą€Ńøj:āīHųŠ $$$ąķՅӧĻó#J…9r‚‡‹sŚ·ėÉ?žńoĢf³„<{{;–.łīn“óļĮ×_ßdŪĢf3/<’*žńp’ ę/±”ŁXūśõ†² 99yäääaoזąŅ„&Mœ…Ÿo7œŪ1dšć–¼āĘóß/·s!ń2ßlÜÉW«#9v,Įr?55‹ļæŪĶĘ ?šŻ·»HNĪą§ųÓää°wļ1vķ:R§ÜœœÖ­ęąĮ3lݲ—¼¼"V}±Årßd2³rÅ&®\)i² B!„BŃŲT@D§Ó× †hµķŃjŪכ6=-Nßd™»wĒįīįĘŖ’|@YY9OĻ|‘ōōLŠŠt ˜LJJQŃųjĶĒÄÅä‰)sŲŗm-żūsųH,:݆…O";;—ß|AXX(Ė—½[+č„ŒŒ,/Y@^^>sf/Ą`(m“}11?ņį‡Ÿ3oŽ ^š?—U«Öw°ÉöŸ0³ŁLLĢDFīÄd21yŹ8JK ŸČž=ųĻ—²wßV Š3z*Ķż˜ļjJ„’ņņ Šõ&L̰ˆžœ8ž Fcƒ‘bŃ?“;' ᔇ`÷®#”””Ņ?“;*•öfŠ >uʵ³³Ćh,C­V1,"ō†Ū „B!„-…MDŅҲk«Õj‚‚ī§OŸqvvn2}}:v¼‡„K_fÜø̚õ$eeeģŽ½g’/Ÿąč±„†öaŲ°GéŁ³§OŸ§¼¼œūļ@£q!8ø'Ū¶ÅRPPȜ¹O1ˆÕ_}Œ”4•'žxÜR—››++V¾ĆüłĻ0|ų`Š‹õ$'§4ھźÅ‰gxšĮrrfĄ€žM¶oüųŖ™ 1ѻؾ-;;;&LĶ?ī'1ń"O?żGĀĆ”OŸX²t!æžšDōÕōāʙĶfĖ’-oow z})éi98;;įė[µGH›6øø8‘žžÓd™  ¢¢’®]pphuĆmB!„Bˆ–¦"y¹Eõ^wuu£_æuf‹4”¾¦öķż-ĒmŚś››Gee%Ė—½GÆ”rŠāŖéČįĆ'0›ĶTVšź”“šš€wƒužo_oļŖ/Å„„ĘFŪ7th“&%*jƒ=N× ¹|9µÉöu詎>} 6öGŒĘ2~ųa/ƒ=Œ··'))i¼łę(>(>Œ3 € ~»MOÓ¶Õ Z(U ƒ”GGU­tjµŠRƒŃŖ2•J„UĮĘŚ „B!„-…MDššņt?=zō¶:=ü/žVµŸC›6Ž|ōŃ*Žyē¦N@±žś’Ė–Y!õńók @FFVƒindSU¾^æ‚ōŒ³,^¼€_MbõźVµoü„Ńäääńį‡Ÿ£Ó]aŅäĒ€’^zi.æ%«õ™1cŹĶyX¢GG5†k‚ƒG'µUłkžł( jĘ7ŹŹd9ŒB!„BŌdS•Ź”ŃūFc)))—¬J_żkłĻ?’Źņåļ±ysŸ¾GG5ƒ¤øøj’‘ä䢢vńōĢ,Į“øøƒØT(•JĪžż™ķŪc2d ..Ī|öé—DFīäÅ^C­ņē£Vż®>Æ\łžŁæ’ķŚkŖe:Mµ°,›yė_ R90nܤS§lŲ°™cĒN‘””ĢÜ9 č×7œĀByÓÉ­¢õ÷FÆ7™YµŃmffz½­¶jV‘ŅNiõ>NNjĢf3y¹…$œæ$o1B!„Bˆl* āéåŚą½ŌŌdŽ'??ĻŖōåååŒĮÆ~ćÉ?ĪÅÅřµė>ĆŪŪ“gŸÉšįƒŁ“)’?Ķz /¶l]ƒææsfϧU«VĢ›7ƒüü^xžUœœŁł5ŽŽ^Lš8‹ķŪcyńÅŁĢ™3ķwõyāÄ1 ؟ӟćå…Æóä“ć™={Z“ķhOppOrsó6ģQ\]5@Õ2č˜ōķŪ‹gē-bŌČ?¢Ó]į«5ŸŠ”C»ę~Ģ6K­V1xHńN±qĆÄǟf𐾨ÕUĖhŗt¾‡½’{wU}šü}'dߐE­ˆ,UŁTĮjšĒfEŒš ‚TčbķÆ=¶æ<ŠZ”(Å"ńqĮ² (X‚ŠĄ ū"Čf†l3Yę÷G2ĆĢd’LĀ$šysĻÜå{ļżŽ;č9óÉwŁök?ŪīƵ‚čsKwÖÆßɇ«7J‹ź#"""""R©>26\€.K „”@^¹īŲq)ć(l·ŪŸ÷åęÉÉÉL˜8Ģė1‹„€=»SœŪ7ܐ€ŁÜ‘””܂‡žzŽøo\®ĒŽęŅ-!¦©«!@ßuĆŠ{‘†°*y cĒŽŖŽęķ?Žö½óF#ļ^ē{oŲø™gē¾ŠŌÆ@äŖgĘ °V.ŽõĀŹõ| ØrŪ±ī(gJ]»Ėā³Mż"ü)**s|¬sźŻóē3HO?KQQQ•²ęųŲ«" łé§<^_°øŚć³f'ŁŌÕ¹Ŗ4«@pN%šž–I~žEÆeĢń±ĪrWŗ–-£yńOæiźjˆˆˆˆˆˆˆ4+Ķ.ŠP$>>Ž““ dgåaµŚ¢u›hāć㮊–!"""""""Ņpše Żg¢¢®ŽV """""""ŅøšÕ,3""""""""¾P """"""""×""""""""rĶQ """"""""×""""""""r͹*g™1ˆmź*Č5!W’Ö®ś®†Ž«ˆˆˆˆ\¹ŌBDDDDDDDD®9 DDDDDDDD䚣@DDDDDDDD®9 DDDDDDDDäšsUŖ*"""""ŅöķŪ×ŌU?Q """"""⣶mŪ6uDÄOŌe¦YYY†Į}÷ŻWļk†Į­·Ž Ą?žˆaLœ8ń²ėvß}÷aYYYMżšDDDDDDD®JͶ…ˆÅb!--¬¬,¬V+ĮĮĮ“iӆųųx¢¢¢šŗz"u¶}ūvŗvķŠŁlnꪈˆˆˆˆˆ\õše rčŠ!ŅŅŅÜöY­VŅŅŅHKK#>>ž=z4u5Eź$77·©« """""Ņl4».3ŽĀOiii:tČēkΜ9“ččh®»ī:V¬XĄ?ü€a$&&:ĖÕ„+Ė+Ƽ‚a,\ø°Ö²Ÿ~ś) „‡‡óŲcQVVęvüäɓŒ3†øø8Ś“iý÷ŽĖĮƒĒ÷ģŁĆĄ‰ˆˆ cĒŽĢŸ?»ŻŽŻnē™gž”U«VÄÄÄ0{ölģv{ć|Qר¼¼<–-[ĘŃ£GY½z5Ė—/ē»ļ¾sOMM壏>bÕŖU¬Y³†Ó§O°sēN233ٶm[¶l©rŻĢĢLV¬XĮ®]»ųōÓOÉĪĪféŅ„Īćååå,^¼˜‹/ÖZ‘kA³ DŻdāć扏÷Z6-- ‹ÅRė5·nŻJ«V­xļ½÷°Łl<öŲc¤§§_V=7oŽĢžšf͚œiÓj,{įĀ&NœˆÅbaŊ$$$øż .,,ä®»ībūöķ,X°€·Žz‹Ż»w3|ųp, 999ÜsĻ=\øp?ü;—^z‰•+W²qćFŽ|óM¦M›ĘģŁ³y÷ŻwłśėÆó+»ę˜L&JJJ(((`üųńŒ5Šļæ’«ÕJQQ›6māöŪogĀ„ <˜-[¶PXXČķ·ßNpp0C‡eŲ°aU®€Õj%$$„Q£FÕ»""""""׊fˆx¶ ”GōļߟˆˆˆZĖ{Ó„K^|ńEʎĖO<ĶfcėÖ­õ®cjj*“&MbȐ!$%%ÕZ~óęĶóä“OņĄ0oŽ<~ö³Ÿ9Æ_æžÓ§OóōÓO3yņd&L˜ĄŌ©SÉČČ`Ɔ ¬]»–ÜÜ\5jļæ’>ÅÅÅLž<™ŅŅRöīŻĖĄÉŹŹbȐ!ö}]«ģv»³ĖVll,†aPPP@ZZ“oߨĮ<22Ņ箓“”ž={Tļ:ˆˆˆˆˆˆ\+šU R]W•ččhn½õÖ*­E|éŚŅ©S'ēz»vķj<Ļ—ī&;vģĄb±pųšaŸ~€ž?Ąm Ķ:8×]*\ėé8žššJjj*qqqU®=bÄ&L˜Ąśõė6l=zōąĢ™3õ’Äg®”…aŲķvŠŠŠ u+BQQ‘O×4™L>…!5ÕADDDDğžüē?“™™ @AA‰‰‰\¼xØų]õā‹/V{®Åbį•W^iźGؗS§N1}śt·” <-_¾Üē”ņóóY¼x±Ļ÷ĻĢĢä™gž!))‰¤¤$^zé%>žųcæ=_YY³fĶjøŲHšU R[“’=zŠ»woŸĖĪ@.µ(iŪ¶-ĮĮĮ€{8rüųńZÆ7lŲ0V®\IFFóēĻÆµ¼#Čpm%pźŌ)ēzēĪKĮTLń pŻu×9ƒ”ŒŒŒ*× "99™ŒŒ ^xįŽ?ĪņåĖ/ļKz ­~ęÓł†aø­»6›­©ODDDD®A={öäšįĆ>|˜ųųxŽ9Ą‘#GčÕ«WSW±F%%%,Z“ØĪēmŻŗ•É“'óÕW_ł„L:µNē˜ĶfęĢ™Ćœ9sųŻļ~Ē™3gHIIńĖsč—gkJĶj–™ąąąC«ÕŹŁ³gŻŹWĒńcņšįüüņĖōģŁ“æ’żļ„††2|ųp"""ˆˆˆ`Żŗu¼ńĘʜ9sųõÆ]ēŌQü'$$„»ļ¾›;v°jÕ*vīÜÉŻwßķüMBBŪ¶mć³Ļ>óéZ·Ür ėׯgõźÕDDDŠ¢E u‹‘FÕ­[7g ÷3gĪŠægė÷ćĒ“Ąž={ 11Ń9‹ē޽{Ż®sšąAŅÓÓyę™gHLLdśōétėÖŻ»wc2™xśé§ILL$44”Ż»wc/^äį‡ę¹ēžć«Æ¾bųšįL:•–-[ņć?śtßAƒѱcGʍWķ½}X»v-V«•0wī\€fŃB¤Y"QQQn”ČłóēIOO÷:(e||üŃ=䧟~bĮ‚ÕŸ={öQO‘śčÕ«›6mrŽ’ą¶m6›)((`ņäÉnēY,ēz||<_~łe•k·k×Ī­uDjj*]ŗtń©^ÕŻ×Syy¹Ļ÷śžūļ¹é¦›7nœsßĒĢ·ß~KLLŒsŅ »Żī6^eC0›ĶĢž=»Źž;vн{w† FAA)))Ī?֛L—:‘8ž; €~żś±zõjŗuėęģšóÜsĻ5hżC³ DēT¢iiiäēē{-ļ,×ŌZ¶lɟžō§¦®†ˆˆˆˆˆHƒčٳ§s €īŻ»“œœĢčŃ£Š–ŠĒgįĀ…ĪŪ&LØr“'O²`Įg™;žżūsģŲ1g+ššp ąÓ„ÕŻ×õŅ­Zµ"++‹eĖ–1eŹÆ÷rµuėV~ųa·}·ŻvĖ–-cÖ¬Y¼óĪ;¼õÖ[„„„Ż$]ŚžóŸ³bÅ N:EXX}ūöe͚5n­Ė]ŸūŃGečŠ”Ģ;×9+PII æżķoIJJjōśūS}FY4\ØUK „”@^¹īŲq)ć(l·ŪŸ÷åęÉÉÉLœ8±Ör‹…““4²²²°Z­Ó¦M›+¦eˆ\łŽ=źÖĶDš/}× CļUDDBrr2cĒŽŖNfąķĒ„·}1ÄČ{†×łŽ6nfā#O6õ+it¬Y³†3fųåzķŪ·_ÖŹÅ±^X¹žUn;Öål@©Ė`wY|ÖģZˆ8DEE)ų¹ ›6mbß¾}<ņČ#M]æk¶ˆˆˆˆˆˆˆˆ\ž#F0bĈ¦®FƒhVÓˆˆˆˆˆˆųBˆˆˆˆˆˆˆˆ\sŌeFDDDDDDü*33“łóēÓ”C·żæśÕÆøńĘ›ŗz5ŹĻĻēƒ>`źŌ©~¹ŽņåĖéßææO3^νK2ŅÉłū"Z“mėÜrcOBū ĄņŁ'“œųP®g;u‚Ā=»i9~’ŪžņĀ‚z]ļJ¤@DDDDDDDüĪl6óüó>M&zE‰ˆˆš[ŅŲ÷Œļ@«ĒŖžļsxQRĀO&ÓrrÅŌĮ†QubZSXx³Cą* Dģd6uä”k×}× CļUDDD<½ņŹ+<öŲcÄÅÅqīÜ9žńšüóĻ“œœL^^ŃŃŃLš4‰;v°’~L&‹…‡z³ŁLff&K—.åłēŸgŊäēēcĮĮĮL™2…ćĒ³yóf"##),,¤°°3fŠ¢E Æ÷qe±XXøp!óęĶ#%%…µk×b£GvkŻRPPĄ²eĖ ÄjµĖĉ±Łl,Y²„€€BCCÉĪĪąČ‘#|ńÅDGG“‘‘A—.]°Ūķäę꒗—dzĻ>KQQ‘óŽGŽńś uzßåłÉżē2Z'Ī š›S^XHİ\Üš/bZö‹Ū.=ūė)9{š‹žEp÷)Ė·`łä#Ź/^¤Üf„ՔĒ(·;Æg=v„ü­_‘wßCP—®MżĻ«N®Ź@DDDDDDD®lééé$%%¹ķ›5kd×®]üźWæā›o¾ašąĮģŁ³‡€€X¹r%{÷īÅ0 Ćą©§žāŪoæeūöķLœ8‘;w2dČvļŽÉdā駟 99™Ż»wÓŗukrrr˜6m†a°xńbNœ8ÅbńzŸ>}śx}†””n»ķ6n¾łfgˆāĪōéӝŪ/½ō999…»vRöS.‘#év~Xß_P–•MäČ_b;u‚ņü¢} ƒŸVÆÄvö4-ā.ÕŃvģ(”}śŅ£'e-MżO®Īˆˆˆˆˆˆˆˆß™ĶfęĢ™Se’€ųĖ_žĀ}÷ŻĒ¾}ūųŻļ~Ēśõė9zō(‹-ŖRŽōéӇµk×bµZ9pąsēĪeŻŗutģŲŃķž.\ uė֘Ķfg—ČČHl6ÕŽĒ›#F°f;łęʏļv,77—•+WŽaäååa³ŁČĪĪv 6Ģf³s½]»vILL ”””Ųl6ÆļŠójā­ĖLyžE·ķš;‡‘ż·×hóĢjÓ¢m;ؼæ)4»­ÄķxŲ !\Üš/оßCŌ/GūōNÆ$ DDDDDDD¤ŃÓ±cG6nÜHBBAAA˜Ķf ˜S ¹āmŚ“‰}ūöńČ#4uU¤™05u®FYY9˜Œ8īæļźź%"""""rµ1bæłĶoˆ‹‹kźŖH3Ńl[ˆX,¤„] ;+«ÕFpp­ŪDGTTxSWO¤Ī¾Ž¾—®];ŅŽÜ¦©«""""""āožhÅGĶ29tčéi™nū¬Véi™¤§ebŽ„Gė/ū>†QŸ!XDź'7÷ź›×[DDDDDäJÕŠ]f=įń†xJOĖ䊔Sµ^kĻž½ ųK"#®£SĒ›™?’ÜejŃ"€’ųbZv„c‡Ž¬\łæĪc_½‹”C~EtTbZvåž’‡C‡ŽVÜ?ż&#Ž'Ÿ˜UķłŸ~ŗī ·Ž™G¦Lē‘)Ó1q¤¦¦šćg™0ž ĢķFXhGī>Īy}»ŻĪĢg~GėV “ŠéĘs³’č×Q„žņņņłĒ²Ļ9vō ®ŽĢūĖ×ńŻw‡œĒSSĻóæmeõŖ/ųhĶNŸĪą›ūÉĢĢeŪ¶ļŲ²eO•ėffęņĮŠ ģŚu€Ļ>ŻFvvļ.żŌy¼¼ÜĪ’Åsńba­u¹4«1D,–·0$>¾ńń¼–MOĖÄb)ØöZ99¹Œ¼g.d±śĆ„ÜqĒķ¼üŅkn”ÅĪ{ČČ8Ļ |ŽģģžšśEEÅäåYøwŌDĪžMcż†U¼’Ļ…|żõ.&Oz €   >’|“×ó/\ČbŅÄ'É˳šž?ߦūŻXµŖāĒmpp0ÅÅVFŽ3žÆ¾ŚĮ{ĖŽdŪöĻČĶĶcōƦ““”æäĶ7’Ī“i’Ŭى¼ūī|żõ®¦žz0™L”””’_PÄ’?œ‘£ncļ÷G°ZmYłbÓøķö›?įn īĆÖ-{(,,ę¶Ūo"88ˆ”Cū2lX’*× ĄjµĢČQ·×»""""""׊fÕe&-ķ‚ŪvHH×_ß ³¹#‡ķ#??æJłØ(ļ]gÖ®ŻDnīOüī÷Ļ2jŌ0FĘņ÷ƒŖ“lĶā%ưsĒnž÷’ÅéÓgIHøÓgöŠŖU „„„Ü|óĻųϾ§¤¤Äyčč(Æē’ż~Š‹­<÷Ü4ƌ¹—1cīåĆ՟²o_ †ašå—’ęčŃĢ›÷ ÷Üs'|qŒžĀ† [×ß»÷³Ÿ{šßžv&-Z4«ÆśŖf·Ū]¶bcc0 ƒ‚‚brs,DD„Ѿ}Å!mŪ¶"22ŒōōLŗvķXć5  ““Œž=Æ'((°Žujź×#"""""āß»=4«_ÉŁYy^÷GG·äÖ[‡rčŠŅŅĪŌZpvM‰‹‹­¶L×®—Ā”Ų؊±ÅÅVŹŹŹxł„¬Y³–ŒŒó“hQń×{»ŻNYYy­ē_ø€9¾½óx§NŲ·/€³gÓxå•7xå•7ÜźtģŲI¦OŒ `õźOY·n3]»^Ļę-Ń©S‡¦žŠ¤’khaEQQ1””ĮnåBB‚).²śtM“ÉäSRSDDDDÄ?öķŪ×ŌUit½{÷öĒeķ‡Éå"v*ž0}ÅØ­É?§M›Xöķū®Öņfs;22ĪW[¦ŗAUßzė]^}õm~’ūYüńÅ9Ņēę;Fmē·iÓ€ō“ ē¾¼ä8‚Y³™ńĢ“nē¶lEPP+“³ąõ—Xųֻ̟’?,_¾š?üav#| R_””!y„EEVBĆB|:ßõŸ“aøę6›ŗĆˆˆˆˆ4&?ż0‘ŌcˆŲ«YLJżuR[s«µ˜³gō©ü/y7‘‘¼³hėÖm꣙æ'$øo½õn­õČĻÆ›äō鳬_æ…Ē›élqāĖXwŻ5ˆĄĄ@–,yŸ5kÖņē?'qäČ ēń;īČ 7\ĒŖUŸšŻwū8uź4‰O=Ē­æø‡Ÿ~²°dÉū“n•Ąæ’ż:vŠ **ŅÆXP|‡X Š8w.€sē²)((">¾¢•’)Ąäó8aa!Ųķv²³~ąŠĮ5+’ˆˆˆˆˆ\m|É ź'4«AU[·‰®öXjźi¾żv'99Ł>•‹kĆæÖ­$6¶ Ę?ĮēŸoāŁg§ņŌSSj­Ēōéqļ½Ćłųću<łÄ,āāŚšég’¤C3OM­½•†ŁÜŽwß{ūÆgHKĶ`Ĉ;€Šæü‡„³aćj~ń‹[˜>ķyīæļ!,–‹¼’Ļ·¹īŗŽŒ?š”CoćæĮoęü‰_’śA¦N­½ŽŅ“BB‚~÷vīŲĒźU_°sē~†ßż BB*ŗŃtOč̶mß±ö³ķ>\+ˆ>·tgżś|øz3”“h n1"""""r%ø"~˜ŌēOʆĖyŻnK\¹„”@xå§c;“²\ˆKŁ »Ż>ח›'''3aā0ÆĒ,–öģ¾Ō-å†0›;’’ņƒ[āŠ@/¢¢Ā÷×Ayy9&SEf5dšżģٳ—ü‚Ó4uÕ® ĒŽęŅ-!¦©«!@ßuĆŠ{‘†°*y cĒŽŖŽęķ?Žö½óF#ļ^ē{oŲø™‰öŠ CŠŠŠéqćķ”””šī{o™™Ķ7ß|Ė}÷Ż­0DDDDDDDš£š†Ūh%ž DŖ 6|}æ=œc*Ńō“Lņó/z-cŽu–»…††°č$žšū—;梢"yč”qü椒ŪŌU¹\ö:k°ī5žn!R](ā­Uˆ?·qčŃćzāććHK»@vVV«ąą Z·‰&>>īŠmājäČ»9ņ®¦®†ˆˆˆˆˆˆHCš– Ō֣į9‚?‘ź*H-ū«{h戊 '*źŹm""""""MgĆĘĶM]…wöģY’’’ˆwī»é¦›9rdSW­V§N"))‰éÓ§Ó³gOæ^ūčŃ£|żõ×<žųćõ:’ģŁ³¬Y³›Ķ†Ķf榛nāžūļwŽ’ŲPõ;}ś4ƽö:t 88˜1cĘŠ”C233™?>:uĄjµ2xš`† RåśŁŁŁ¼÷Ž{ÄÅÅ1eJĶ“oüķo#44Ōė»Z·n‡Ā0 n¼ńFī½÷Žŗ<¦źK\nŸ5ō"ŽŅĻżåžx_=;÷…:Ÿ³ą/ó›ŗŚuÖ¹sgfĻ®}¦K€’’–.]JbbbSW›­[·2yņd¾śź+æ"P1{g}ņöŪoóōÓOÓ±cGŹĖĖy÷Żw9pą½{÷nšś]żõ̜9ØfŽ~ūm~ūŪß`6›™3gÅÅÅĢ›7Ļk ņå—_2pą@Ž;VcžżļW[“'OrāÄ ž{ī9Ž|óMN:Åõ×ūÜ(ĮNĶ”4pĻhŲ@¤ŗ.÷ųt¬‹ˆˆˆˆˆ4š²ŅŹĖĖ)/+£¼¼”ņ²2Ź<¶Ēķöęó“e’žż¤¤¤0iŅ$–.]ŹąĮƒłį‡8yņ$}ōcƌaŊäēēcĮĮĮL™2…ćĒ³yóf"##),,¤°°3fč¼~yyy½Ļ°X,dgg3pą@¾łęrss‰‰‰įąĮƒlٲ…ˆˆ )//gźŌ©”––²lŁ2±Z­ÄĘĘ2qāD>’üsNž|˜>}ś8·o¾łf>\—@Ä3šĢ„ф?ūe,Ķē’.""""""WˆÓ§Oó׿žÕ¹=dȼ–4hēϟgÜøqģŚµ “ÉÄÓO? @rr2»wļ¦uėÖäää0mŚ4 Ć`ńāŜ8q‚o¼ŃyŻ»w×ū\€ķŪ·3tčPīŗė.¶mŪĘ<€aäää0}śtL&«WÆf÷īŻ <˜éÓ§;Ļé„—ČÉÉįܹs¤§§W Ž=J~~>3gĪÄd2±téRNœ8Åb! ĄŁBfåŹ•ģŻ»×ķ‡nn.­[·öśžŖ{īšpļcX?üŠŁŗ„WÆ^ōķŪĄės—––z}ß={ö¬SżąŅģ;ååå˜L& §°°ōōt’’’(--„sēĪĪz9”••ńŚkÆQPP@~~>IIIŒ7ŽĪ;3kÖ,^żuFķ,öģY6mŚÄwŽIyy¹³LēĪéŽ½;III†ĮM7ŻäÖ:ĘކŽÅŪX"Žz“ųµwIż†Ö׳„ØV€ Ź%B°ŹĻ—%Čs±Ūķ/ūrćäädē9" éčŃ£nƒIó„ļŗa轊ˆHCHNNvž%Śnw’mä¹]ݾwŽHāŁ¹/ø Ŗź-ÉĢ8ć6ØźŖ•+™ųȓMż ®Y‡bĻž=µN+W¾öķŪ’ °¶ŹOĒzP\łéX *÷9ŹŲØQJqļmRē±Iż3Qņ%5āŚ=¦Ģc½“Aß¶ˆˆˆˆˆH óóܶ³/¤ÕóJ"āG˜įŚk¤÷ģ ŗ1Fü¦¾]f<DZ»|z Bʼ¬—QȔā’`FDDDDD¤NņórˆˆnEnÖyŹĖõ7Ū+M=čŃ£GSWCü£ĢĖā:¼†g0R—V}ęÆ1Dj@Õ€8Ā€ŹOƒK”ˆˆˆˆˆˆH“ŹĖĶ¢¼Ls>ˆ4°—„ŌcqĶ6.µ Q"""""""rm*åR(āłéŁZÄs,OõWğcwT7xŖ#å)Į}Łb—u[ƒ¼ā&ōÉ'ŸGdd$V«µŹ¶ˆˆˆˆˆ4Ž}naĮ_ęs!ż4YēĪ’“™ĪOٰü”M%—¢ Ö¢BJlVŹJKœ3ĢōīsKSW]¤¹°ā>»Œ÷PÄŒ82Ļ1Eüār»Ģxlā­uˆ ÷–!xœć·ę.®, iiideeaµZ ¦M›6ÄĒĒ»Ķ#ŻP^~łerssٰaAAAU¶EźjūöķtķŚ³ŁÜŌU¹Ŗõ¹„/«V®ōłœŽ}n”Ļ-})Öč‡"žą†x¶ńl)ā- ńˬ3õķ¶āzžė ©&*B– ŖÜ‚]Ö]Ž;>ƒ<Ž;®ÓĀåŚ•‹{Š¢YjDDDDDDD‡źg™õģ9āŚʵ÷ˆkRź±ß³µˆŖ­E㋸֩Nü9ĖL9į„ćÓQYø øVÜõ…yĪLć(ӂŖ3Óø† &—ė÷’±{łōü-ļm¢•2ÜŽšĀo³Ļ8®ēzĻĖęĻ@ÄĄ=)Ć=œš|Qv*Z…x¦Iž/Ļ„{ GųįCL(i,Žŗ®x¶±ćˆø†Õu‘±¹”õœ†·¶ĮUė́ˆėX ŽPĵ•^ö»>„ēĆ8^šcŠ^G—ƒŖ³ŌŌ4[B’°×°ß3qĶjšpÅ5q @<[†xk…rŁ”ˆæZˆ8xv›qķĻ€÷šĆ³‰ēĖs˜jC‚ˆˆˆˆˆˆˆ4<»—õšB×±B\»ČX¹ōŪßQĪõ<Ļėłæ»Ģ€{—Ļ2žżŖ{‘å\jā;Ŗ!5µ‘†ćł;ßsFYĻV"®]f\[ˆø¶ q0ÕуÄ3 iŅ.3ž-;\÷9*jĀ}ZϲŽZˆT>“ė¬2ąŒPĶ5DDDDDDD¤aU׊Į³ūL©Ė§ėl3Ž ¤ĢcŪs¦_z$žCijuˆk…MøėYYo­CøŖøŽšMFDDDDDDäJį-ń6ČŖ·éw]÷¹†!ŽV!eTķ†SŻ}ė̟cˆø#®Į‡kbr)ļ9 ė‹2qi†oć…ų†(4©æŗŽĘń6øŖk0āŲ_Ž÷Ö!ŽĘ"õ ŖźY9×#Žpñϵ¼ēĢ4\Lµ¶1Czˆˆˆˆˆˆˆ4_ŗ¬T×JÄ5©)ń63­ß‚‡Ė D<[„xo%āąx Såg€——åś’¼µ©O+i85"Ž®/ŽZ‹”QuUoaˆē}üŅb¤!ŗĢ8*ćŗīŹõį\[„ø!žaˆ·ĮT/7Q """""""ry­/j )jš†·.­Bjšµ¶Ž.7ń6یē1»—}®3Šø¾ ×T½"Ts?…"""""""«¦ī3®ć‰z†"ž3ČŲ©9 ©Ėż}ęļ1D¼… Ž8ĀĻiz / ŌÜ2DaˆˆˆˆˆˆˆHć«m<Ļ`óĒHm!HuŸ~įÆ0”¦ĀØį³ŗš£ŗ0¤ŗ:+iDDDDDDD®L5…u1ʗ)~ė­!Ā…ŗ“ąšµUIcÖ_DDDDDDD|S[@QŸÖ¾tǹl (\N”DDDDDDDäźćK`QŸ°ĆÆAˆCC‡ u¹~}ź¢pDDDDDDD¤éŌ'¬šõœ B3PhØmDDDDDDD¤éł#ĄhŠÄUS† 6DDDDDDD®m€xŗŅC‰+½~"""""""R½& ē÷GČ!M“6m“¦M߯ē9OONĪųœ“4ćĻˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆ,Bfėtńņ‘i¢­ `Š-†DDDDDDDŻ›Ķ“Ž %,q,†(DDDDDDDW{Ž H¬0“f’m) """""""ŪiK€aī6V G¬(““_™•¶%"""""""Ūi)ÄŪ°U‚k„ ²V,—µņvG”ŸˆˆˆˆˆˆˆĢ׌0ClÅżę§Õ,(“6ō5³ĢÜżŁśœ‰ˆˆˆˆˆˆģ…5śÜ×Ü2söÕn– Ģ­ķŃÜß¶$Ö8"""""""2®55BÄfžšŗÆ¹ł–Žo6K…­©b€čO0q»¹ņ2!""""""źx-5m1‚N@ė’ęŽm6 \€¶Öџä&–›ŚGsĒ'""""""¢ŽŃ\Parh„ė4w ™Įz23¶k–%}­ Aōƒ¹Į¼©`h¾6 u sś 1 ?½yš†$śŪÉLüµˆö"mmc„(ōę Ćčż5·?sī'""""""¢–™Ógˆ©S Ɛ\Etžż¦Ža,iW@bé":¦ĀcAˆždŽ“¶?"""""""źxƚŹč&żD~ķvÆ×ݧŒˆzėXtČ] }ˆ9ĆēźO 4Cō½æ¦B åę3DDDDDDDd=-u¤Ŗ›×Æ¢›tAH“ßē ö” BähŠčX“–ˆ5jˆ4×YŖ~¢‚8Ü6·–Hse """""""Ė0't0ÕTF„č¾ć¦æ· ĶÜoŃZ"– D kn臆żƒč× ŃMJ“Š­ FˆˆˆˆˆˆˆČzŒ2c¬vHżµÉš{¾ž¼.4i0Ų—~'¬ĘŽŁ&m DL5[1^†!ŗ°C?Qāz ā`°Ž~‚d¬sUc·‰ˆˆˆˆˆˆČzL ·k,цßńõóŻö‚Į>u}ČŃxšv7›±v Ż ėśџō%š†"†¬ź_,Ö!""""""²=ĆQf½æ†HĮvś ­A¢’=_·.,8ō®„¹Į¼įpŗśµ= ›É› ż!x ;kÕĒ€„ˆˆˆˆˆˆČśZ3Ģ®.ŲŠM:†­@dІ"†ūՍ@£ŪÆ~§«mfé"Ęś ŃļÄXæ!¦&żEć“ EōĖCDDDDDDDķ×Üč2†“aķ] ”ß\F_-š’Ž/Üß)jˆ×0 1„†!Žø^3ÄX ¢ŒMƒżņ‘e‰&–!ŗę-ś5DtMaŒõ9Ŗ[V¦­C ”ˆ“»ƒUK»«R˜ź+D7ļØ÷W©wŪp“Ćę7ś ū!""""""ź8ś„~!†5Cō‡Ūu€6šP@Ūˆįwzżļū†Mf '‹iK "3±L·\æV‡amG“Üwˆ~ b*1Ռ†ˆˆˆˆˆˆˆ¬ĒŌh2†ˆ~’!śĆķVtPązXb8ꌱš'¦šĶ“ŗ)„ū1UCÄŃąo“$""bĖBDDDDDd1™™™€¢¢"[…ØĖ“Éd p½ßþEtóśaˆ~?$«%b‰@D?ĮŃOzZź/Äp""""""""ū焦5Fō[}č×6i0²Ž.wh0óxFY*ŃżÕµż1ÕlĘQo2l"CDDDDDDDöĻ MGÕu¦jŲ«.WŠGŚ=ä.`żawõū1U3„Q÷”k%b8PŠ~’#ŗ0Ä0gŠõ#Ņī¦3– " ĆĆ"śĮˆįØ3 DˆˆˆˆˆˆˆŗG½yż¾Bōƒ]–`Ų¬¦ŻMet,DȍÜ֟ōcCš2!""""""źō3]āmŠ”ß ‡ž¤Ļ"ĶfäķŻšw+×[n,16Ļ@„ˆˆˆˆˆˆØ{pĄõ¬@æU‰±0D}2³ŽŌ K"ĘögŲ1ŠasŻ źNœQ÷ ßŠDn0olōS”H»“wg²f–ė÷kxBśµD°|0CDDDDDDD“~’ ŗ\Ą°• `|H^}ķŖ%bÉ BfāÆ~bųW’ä-B”P`āĉxöŁgńü±±±xśé§1nÜ8Čdķ®QÓ.Ļ>ū,īøć›–”5ÜŻŻ;ģXIIIķŗ6>>>HJJBTTT£łĪ̜r>žųćŲŗu«­‹JDDDŌ&µµµ(--m÷TVVQl÷€DŌyV’W¬ŠÆ`aX;Äb_ģŪÓTEfb™~zc8Æ;1ĆōĒ"ˆB”ĄĆ?Œąą`üłēŸųż÷ß!“É0pą@Ģ™3C† Įwß}A°ČÅ­¶yófTUUŁäŲm”R© R©põźU[…ˆˆˆˆŗ źźjœ?žžžķŚOmm-  ¹œ•ˉģ€aMżŒ@ÓŁ‚©¢M‰©%‡Ż5œ—™˜ kˆė1¶M¦L™‚žżūćĖ/æDff¦“üĢ™3ČŹŹĀC=„ńćĒcļŽ½:ķÖ9sęŒMŽŪVWÆ^EDD„4ODDDDŌZ=zōĄ¬Y³ŚµŚŚZ>|6l˜­O‰ˆŚO×\ĘXkc`‹Ė—/㧟~Ņ^”Žńę›oāĻ?’ÄĪ;£GĘŻwߍµk×"990yņdLš4 oæż¶UČĀĀB°~(āąą€wŽy“'OĘÕ«WńÖ[oįčŃ£¹\ŽGy·ß~;zō聫WÆ"!!ß|óM‹Õ'•J%ž|ņI̜9>>>(**ĀöķŪńÆż 555F·Łŗu+Ö¬YƒÆæžpė­·ā’ų–,Y‚_~łšĄą/ł n¹å³ŽqčŠ!¼÷Ž{ˆŽŽFii)/^Üč˜>>>ųæ’ū?Œ7UUUųķ·ßP]]mÕkNDDDŌ8::bĀ„ P©T8qāFŒĮ&4D6véŅ%äå唬¬ †R©4ws9Œw  4 ;šėCDw›^ŚDČZø­_pS£Ī¶ j3ø»»ćŌ©S&×IOO‡¼¼¼pźŌ)ōķŪWźWD&“”_æ~HOOLŸ>S¦LĮęĶ›ńŽ{ļį·ß~Ɣ)SpÓM7IūkhhĄųńćqźŌ)lß¾½Å}jéYYYRĮĮĮ(**BPP“,((Čhd)yyy€ĄĄ@ōčŃĆjĒ€;īø‰‰‰ˆ‰‰Aaa!^yåé¾Ē{ =ō>łäĢž=+W®DLL {ģ±÷ūꫯb޼yX¶lfĻž·ß~3gĪěo¾ir›#GŽ`ųšįŅķ°°0\¾|”””Ņ²ŠŠP)˜2ēõõõøēž{šēŸ⫯¾jrĢüć}śHŪ„„„ ))©I rīܹö^>“ŖŖŖPVVĄś”ȉ'°uėVœ={æ’ž;ś÷ļ¹\Ü’żXµj¶lŁ‚ĀĀBlß¾«WÆĘ‚  P˜ī‚ĘÓÓsęĢĮwß}‡;w¢°°žł'¾żö[ÜrĖ-šņņ2ŗŻ‘#GUĒ5j6n܈#FHĖBCC‘””dö1PPP€Ļ?’)))Žēēē‡qćĘ᫯¾ĀńćĒ‘——‡/æü¹¹¹V»ŽDDDD]\.Ghh(n¼ńF¤„„”¶¶ÖŖōND†ŖŖŖ‘‘K—.Š6‰  ­1’ššjnæ™Ę*J˜;Ó¦LĮ𑪱 Jä°@ ŅŠŠ@4““Ž(ŠČÉÉAUUś÷ļčßæ?ŹĖĖqńāEųśśĀŃѱIА™™ •J???iŁÅ‹„łęöiȜcdeeĮĆĆžžžP©TšõõÅ”C‡Š£G8::B­VĆĆĆĆŖ5D@£ŃHóÖ EōÅņņr) „‹‹ >Ühżäädxxx 88Ųä> …BcĒŽ5Zž––¹\ŽŻīȑ#šóóC=ąīīŽ   lŲ°żśõƒ‹‹ üżżįē燤¤¤VćäɓF×·o_hRĆÉŌśDDDDŻYæ~ż0mŚ4œę͛פĘQW¢}ŃRŅŅŅpņäILŸ> …BjĘNDÖjŖ¶G#={ö„R©DUUUsė·Ōš¤„Ql-Ā’Hkz|µxķ@Ūį»ļ¾Ćøqć‰qćĘAE\½z HNNnŅdįŌ©S˜:uj“;ūķ7TUUaöģŁššš@uu5Ī;‡_~ł„År˜Ś§!sŽqłņe( ŌŌŌHéw^^œœœPYY‰ĀĀBK^Ā&|||l†čÄÅÅ”¬¬ .D=PVV†¤¤$,[¶¬Åm—-[†²²2¼öŚkšńńA~~>Ö®]k²OÓ§OC©T¢²²RjÖtīÜ9øøø ““.\h÷1ō½łę›xóĶ7‡ŖŖ*lŚ“ «WÆĘ£>jÓkODDDdkõõõHNNĘéÓ§1nÜ8«&¢ė¦L™Ņźm¼½½Ūr(sjŠXT[`˜Ź8čMŽœ8Ppћt·u÷;éOÆXūd©ut£ÉŲ: !"""¢®©¬¬ .\h4Jc[TVV¢¼¼7ÜpC£žŁ:’®f6›čµŸL&‹P  Fļo €JU*ōžźęuė֨כ@Ō›ĢĘA»É¤ŖŖ*›½įQ×ēāā‚ĄĄ@ČårČd2(ŠVļC&“A­VĆĖĖ‹ŸM‰ģ“Õ»×0„#‘i.C–Ē7""""j…BŃØ“žöŠģGDd)Öe†ˆˆˆˆˆˆˆØµ:¬ņ"""""""źvˆQ·Ć@„ˆˆˆˆˆˆˆŗ"DDDDDDDŌķ0!""""""¢n§#†Ż%"""""¢vØ?‘±¤¤Åõdžžp1Ģ&Ēn åš”€ZmŃ}¶šFƒŗ“é¶-C'Š) a BDDDDDŌÉU¼öwŌļż³Åõ&N€ēÆ?ŁäŲfńTĆķßqć øZ å„Q" 9ēѐzõ©'P·éw[—¬CylŚå„m] ›` BDDDDDDVēxßøæŪ9Ā=#†ikÕĢž (9āłó¶.u€Nˆ$%%ŁŗDDDDDŌ¢(6{ŪŌ2[m[SQ‚£G’qģč³ĻqTųh„Ž°Ö%“k²  øŗ²ĖŌBpyķ%Tüķy[ƒ:@§ Dˆˆˆˆˆˆ:‚. YųźßĶŽ&né[€©7϶uń»§§‡Ū«/vŗZ!Ķq¾õTxŖ­‹BVĘ@„ˆˆˆˆˆŗ]¢)Č5{›{ī½’[½šˆ™ä””p’t„Å;xķj5œī»5Ÿ~a뒐•qŲ]""""""²Õk/Ćk϶®†\ćņ·Ēm]ź¬!BDDDDDŌE9ÖUCY_+ŻVT—[ü.ÕåhØ*mq=ŤIP|óČūŲś²“›<°|¦Žˆźß¶Ųŗ(S”ņ°u:"DDDDDD]”Bh€smÕõ µmߙ ʆZ(õaH­/.“ü &'Ó§Mė·]±¢i™bc%KĢŽ…³åĻČfˆ4Å&3DDDDDD×dddŲ¬ü1|}}qļ½÷Śś’!22§OŸFzz:ĀĆĆØ««CDD‚‚‚šź«ÆĀĻĻĻÖE„N®=5EZ£¢¢’ś×抳gO<öŲcÉdŲ²e ~žłg 6 ^^^6yå’Jפ‚Č»J¢/:Xø°ótō<óŒ¶\ŗį‰£¢€‡l]:źvˆģٳ§Q®®®3f ąšįĆR hæhļŁ³‡5lL’qS*•4hpōčQŌÕÕaäȑ€ŌŌTČd2>nŌ­ųłłĮĻĻgĻž•‘ćĒć“O>Į£>Š1cĘ`ėÖ­ų駟šĘoĄŃѱ±±ˆŽŽĘɓ'‘°°0̜9_|ńJKKqė­·āę›oFff&–.]Š[n¹'Nœ@QQ¦NŠ¹sē6*ƛo¾‰üü|@NN^{ķ5œ>}k×®E^^üüü0ž| >WÆ^Åß’žw̘1wŽy§ŃsŹÉÉĮĮƒ@Ŗ 6räHx{{Ūśr·Inn.vļŽY³f”ØØČ®Ī­³=z4Ö¬Yƒ'NHČ‰' —Ė1zōhœ?¾ŃÆŽgĻžÅŗuėpéŅ%ØÕjÜsĻ=1b^yå 6 111Ø««ĆĀ… !Š"āāāąč舒ž÷æ8yņ$^z鄟׆Ž|óM¼żöŪųæ’ū?üóŸ’$&&bźŌ©ČŹŹBvv¶4b¢j»F£——6lŲ€ččh[_vj‡ÜÜ\ŌŌŌ`ŌØQ>|8`Ų°aŅżĘ^g÷ģŁƒ-[¶@£ŃĄ××wß}w£mtL=æõ½õÖ[ØØØĄ{ļ½xżõ×įźźŠ»ļ¾Ū¢’+ļ½÷vķŚ…mŪ¶A£Ń@­Vćę›oęg6 ņ\õŸė_Ś»²+€={lW C­ÖÖyžyćĶ‹Ōj`Ć 6X²Äf—‰:†] »[YYi“™LCC<<<ąį၆††&÷§§§£²²²Éņœœ<ńčŚ9ōŃGČÉɱh¹srršĢ3Ļ`ɒ%xć7šńĒ#//Ļ֗³Ć>n €Z­†³³3ÜŻŻįļļ€€8::Jė™zÜąąĮƒxēw°téR,Y²[¶l±ź9°Č¾ ƽ.ōE7Üpnøįˆ¢(µon[@[%uķŚµxžłēńꫯāÕW_űcĒpõźU«]qćĘažüł½.Dķ5bÄDFFbŹ”)“æØ5 7Žx#}8ŒŒD’žż@ūaWŸ»»;ķ’§»»;RRRP[[‹éÓ§#00Ó¦MC]]Ž;†=ząóĻ?7ėWtgggØÕjŒ;¢(āĀ… EGŽĮʍ±qćF>|XśpüųqüüóĻHHHĄĮƒ!233±vķZŚ×¦ü—.]Ā„K—šć?"==?żōöīŻ‹sēĪażśõųć?P__QqōčQlŚ“ ›6mBrr²T޵k×"##ėׯĒöķŪQ__ß’]ś[[[Ūźs#ˊŒŒ„F£ĮŋqåŹ"22²ÉzĒGuu5&Ož www̘15558zō(† ‚¼¼Šŗŗ:ˆ¢ˆW_}½{÷†|šAŌŌŌą«Æ¾‚ƒƒ¶°F£L&CBB6lŲ¹\Ž·ß~®®®øżöŪńŁgŸĮŻŻćʍCyy9AĄĀ… „ėńŌSO”””k×®…R©ÄŅ„Kįęę†ńćĒ£¼¼C† AYYŒ¬¬,Ü~ū퀿æ?ī¹ē”••ŁśéŅ"/æ^&'Kpuu•®éž={šŁgŸaŃ¢Eųžūļ!B“ף=z`ٲeø÷Ž{įé鉁¢²²………öŪÜó[Ÿ®fIVVĪ; 5{_ęžÆč^O:…ĢĢLL˜0Ė—/g“2.$D6X[D„6ü(.ֆ!­­qüńGēŚÅ.šĢč>Üėś Ń ¢(B­V£ŗŗ pssƒR©„B”ś1•ZūśśĀĮĮēϟGPPP£ū~łådffBōźÕ ÷Üs:„sēĪį¾ūī)Éā‰'?žų#‚‚‚pĆ 7˜<nøū÷ļĒńćĒŽ„„œ={2™ AAAøė®»»wļĘžżū!—Ė”V«ńŠC!##ū÷ļ—Ž÷ŃGaęĢ™(--ő#GP__‹/bīܹ8pąJJJšņĖ/C„R=ŸS§NaĒŽprrB^^ÜÜÜšĢ3Ļą»ļ¾Ć„K—°fĶ,X°Ą"›¾²²2xzzJ!HuuµŃSʶ­­­ECCDQ żRņŹ+Æ4ūøÉd²V]O•J…Ÿ~śIśu=<<.\@UU•t].^¼ˆŁ³gc芔“æœüōÓOxõÕWŪu½ˆĢåéé Ņ’‘śŚ/ŗŪõõõP*•Öuss  ›£Ńh\JtŪ•””“©¬prrBee%²²²™™‰Y³fA&“į÷߇··7”J%N:…™3gĀÉÉ æ’ž;Īž=+}į3$“Éhß"##qšąAØÕjL™2Ū·oGnn.źėė‘™™‰Ūn» Ų²e rrr T*!Š"„õÆ\¹‚±cĒJMcōk¬™{ndYįįįųᇤ¦2ŗę2†tĻĖ>śØŃņ¢¢"©3ĖsēĪ!==7ÜpA@RRś÷ļŅėxk¬Y³Ó¦Mƀ0uźT¬Y³ĘhXcL||¼ą;v ü1ą›o¾ĮW_}…ōōt( <‘‘‘šššĄņåĖ‘ššŠ=z`Ȑ!ų÷æ’-żŅ=æšłēŸć@XXžųćÜpĆ Ųŗu+ŹŹŹšå—_";;nnn Å÷ßŌ××ĆĒĒŪ·oĒ 7܀ß’_ż5f͚…S§NaĻž=Ų¶mvģŲŠŠP|łå—ČĻĻ7YžĪ¢8’ŠŃš£8’ŠÅŽŃÆ_?¼šĀ Ø©©ĮٳgńŪoæa÷īŻ0`ĀĀĀ­[]]ļ¾ūNz¼u?źž`ÖÜó[߀ T*‘••…ŚŚZøøø oß¾8{ö¬Yū2÷ÅÓÓwÜq¶lŁ‚/æŌv@;bÄ<śč£prr²ā#H]–µśQ«µū~ęm Ņ^ĄŃ£Śr:k‡°ŌfvˆčŖiźś ńšš@uu5œįččGGGÜ~ūķҲŅŅR©OSUČĖĖCzz:Μ9ƒE‹–/_Ž'N@­Vc×®]xżõ×įąą€uėÖ!11žžĘ{K—ĖåČĖĖƛo¾‰õė×#)) Ļ?’<>ūģ3œ9sŽŽŽFĻG„RįģŁ³xė­·ąźźŠwß}ŁŁŁ˜9s&rssŪ†č?n: 8uźœœœ¤_ņó󑖖‡Fµ|Œ=n^^^˜6mbcc1xš` 6 £G†J„2łøłųų“źz* œ;wƼņ ±wļ^ht]Ž9‚;wJ¤÷ķŪ'żROd޵k×āŠ”Cxė­·ąģģ,5Ópuu•B€źźjm"tt£īÆ.ą0E®”––6ś«ŖµźźźP]] •J…’’øøøHa«T*”––B”PHĶčHżœč7kŌ”śzõź%½nųūūĆĒĒ2™ õõõŅkōöķŪ„õ+++„€ØOŸ>ptt„\.G]] µõÜȲ\]]1tčP¤§§C.—cšąĮFŸ»ŗēėÓO?Ż(ÜP(ĖåčŃ£Nž<‰‹/bȐ!ėׯĒɓ'ѳgOi{s ‚ ÕTŅsf× ĢŹŹB@@Ojj*‚‚‚Š·o_Śēgzz:œįļļ/5ķŃՈüꫯ¤mÕ:½õÖ[„׎™3gbÜøqP((--EZZjkkqć7JėēääH5 ęϟooo8::¢¤¤¤QŲqĖ-·ąŃGł ——‡©S§āŽ;ī°ęSĮb CK†!śœœœ0|ųp鳕axŪ¶mCRR^zé% 4?žųc£×*ęžßśt}“egg£ŖŖ Ɔ ƒ\.7{_ęžÆˆ¢ˆ3f`śōéørå ’’’šŪoæ!))©Õ£éP7²b’b™ !:Z;JLLŒåĖ©V;wj;[ļČ+DVfˆ1ƚY“Vpp0źźźpłņeiYff&rrr°bÅ i™.m÷õõÅŋQVV†~żśAœ={nnnšõõ…‹‹K‹Ē”ĖåEYYY4hōjĄ€ČÉÉAAA(})ŅUį=~üøÉ}@&“ĮŻŻ]ŚĪŻŻUUUøxń¢ŃóQ©T ”¾˜x{{£¢¢Ā"×ÕŻ«3gĪHķĄĻœ9ƒŹŹJ³ŪąĻ™3Ó¦MCZZŽ;†„„¼śź«&·³g϶śzz{{#00ŠäżaaaX·n įīīŽS§NI5‡ˆĢįēē‡ŅŅRÄĒĒcąĄHIIAPP\]]„aw÷ķŪ777;v €ń@Ą‡FXXvķŚMśLppp€L&Ć„K—põźU„‡‡cŻŗuŲ¾};Ōj5¶mŪ'''„……™Õ©ŖNuu5Ŗ««qņäIit©+W® 33•••E•••P«ÕĖ娮®–“mŪ¶!((žžžE………Ņė‡)ŗ×ROOOČårL:µQ`qéŅ%£ėėŌÕÕµųK§±s#Ė‹ŒŒÄ÷ß¹\.Õ 44bÄ899aēĪšõõő#G°mŪ6¼šĀ  Į!CpąĄøŗŗ" ąāā‚ƒJ5:[󼎳g.]ŗ„cĒŽ”wļŽøtéĀĀĀšēŸšuNAAAR³/ż¦””””ųā‹/pžüy444ąĀ… 9r¤ō£Ęɓ'ˆˆˆÜ{ļ½1b°’~¤„„59Ž\.—žć†_Œ‡„R‰ÄÄDōés}‹„k£-čÖ×mÆū[\\ŒģģlDFFJ}¢?ß~ū-žž÷æŪąŅzŗPÄŅaȾ}ū°vķZDFFb芔{öģL&Ć Aƒš¼ĪźBšK—.”““Tjv•››ŪčõŖ„ē·¾aƆaÓ¦MØ­­Å“iӚ”Ń’+GÅŖU«ƒ>}śHė1¦mŲōķ \«…Ś*!!ŚĪQ££;¦YĖ7ßS¦hƒ² vˆųśś¢  8|ų°ōkˆ"®U“JNN–Ś^źšĢč¶mάY³šŪoæ5śpnōššp¤¦¦¢““įįį©©©pqq1Z•ט¬¬,Ü|óĶM:6®č0öÅĒšĆ»ž/Bśv ?ų˜:ŸÓ§O7ł…”­_øLŃ=nśJKKįīī.żśmź‹Ž©Ē­¶¶VŖ)4f̬ZµJśPiģ<[}=[ś2$—Ė1iŅ$ģŁ³žžžˆˆˆ0YµŸČ˜)S¦   DZZśõė'…j¾¾¾øå–[°k×.lٲQQQX»v-źėėŪt¬įƇ#>>%%%ˆŽŽFÆ^«+ Lš4 ū÷ļĒźÕ«ńüóĻć™gžĮڵkńĮ gĻžxę™g¤šyęŚ²e är9¼¼¼0yņdØT*ōķŪŪ¶m ­b®ūP_\\,…6ŗ_ÄEQ„··71lŲ0Čd2‚ŠäµĖ˜ąą`IĒrww—Ž/Œńōō„J„ĀöķŪqóĶ77ūßŲ¹‘å………aÕŖUØ««3łėįၧŸ~?żōŽyē©Jæīy5dČģŽ½‘‘‘Ņėž Aƒ¤~ZkõźÕ •FHóõõň#°fͳś yųᇱ~żz„……į±Ē }_{ųį‡qōčQ©éĶ£>Š˜˜Čd2¤¤¤ą¦›n ­ķńŹ+Æ@Œ;Ó§OĒ›o¾ ŌÖ֚õ^ō—æüIII3f DQÄ AƒšłēŸ›\?44˜8q"ÖÆ_/æüƾś* † ‚|ŠZO«°F͐qćĘ”°°‡Ęžżū”P(гgO<śč£R“ż×Łæüå/8}ś4Ö­[‡ąą`üķoC||<~ųįÄčżņŻŅó[ß°aưvķZČd2i¤}–ų_9r$ʍ‡U«V”¢¢˜={¶45U÷ē~”Īž×d¹ÓSĆķŻŲŗxG7ŖĖŌ©ęÆ <ōvˆÜŽ„†Ó§·-Ä鄌=MńŲ“Ź 7š½~ggßŅüüüPPP€ŖŖŖF5 ōkdTUU”„Žž €ŸžYŖNŽæ¬^½·ß~;”J%¾üņKĢž=½{÷FXX¾ųā ŌŌŌą®»ī‚ Ų°a žö·æµxDII † GGGüüóĻŅ—õ3gĪ`öģŁpwwĒöķŪQSS'''lŚ“ õõõ1b„t~fwāgź|L‘ÉdėōU÷øҵ·OKK3ą˜z܎=ŠĶ›7ćÅ_„““źėė‘——‡”C‡ĀĶĶĶčy0Ą"×ÓšŗLœ8ļæ’><==}x!2‡L&ƝwŽiņ Ōüłó1ž|éöōéÓ„yż/.C‡mt{āĉ˜8q"H£fõģŁ³ÅL÷ß?īæ’~éöąĮƒńę›o6YO׳ds‚ƒƒlņ¼GmōĖmXXX“vö†ē®_Ķūī»ļ  0uóÕ$0v,Fėė?sęĢir|i}www“ēF–§R©šÉ'Ÿ4Ynų~šąĮxć7Œī#""¢ÉsVæ™,`ŽóZē³Ļ>k²,55Uš×½§‡„„ ć½¼¼¤¦˜šĪ;ļHóŸ|ņ‰ŃóżšĆńį‡6Y®Š³jX__ßFeŠU?žųc©’”C‡6Z_?Õ’Gæü¤„P(0gĪ£Æ!:†Æ³†ĻŁŲŲXiŽÜ緾޽{7y[śE”Pąī»ļ–^-żCZw"æÖ|³[‰Š/n~˜ŪØ(mmū‘_tżŠÜy§ķ†&‹°‹@$""Āč°»śŁ™źŌ.ŒŽvfΜ‰•+W€Ō‘ŁņåĖ!“É0pą@ōīŻ¤f=zō:yóōōDmm­ÉvłyyyX²d ąķķēž{2d222¤9 >ģϘ1~ų! <<<'''ØT*¼óĪ;š÷÷G’žż› ĻfŒ©ó1iBĒĒĒuuuųģ³Ļš¼Zźq“æˆ 0‰&Ś{ÜĀĆĆqåŹ¼÷Ž{P*•hhh@XX˜“®©ĒĶ×Óšŗø»»cĄ€(--mT›å—_~AMM ī¼óN‚€§žz Ÿ~ś)är9ÖÆ_„RŁģ&"""""» ģŚÕø?‘mÓłFz ю@óĀ ģW¤ “µq™Ž¶z“#'ĪT\ø^›×ŻvÖ[G·¾“(ŠÆ˜_„¦öģŁÓäĖµÆÆ/ƌ@ŪNް6ĀŠ”C1iҤ޹Ņd”±ĒĶĒĒ£FĀŃ£GQ]]ݤ’®šøÕ××cåŹ•ˆŽŽ–ŖĆuW_|ńüq[ƒ:‰ĢĢLōė×ĻÖÅh7>Æ».MA.~ž„MŪ¦§g`éŚĶóŲ’ k„«!¢æ,ŗ™įO›«]²~żśvWēó–įŁA ”‚ @®Ļ BƵū“ó¢(ā«Wcį«–éĒT“Õk/Ć嵗,rŒ.G£Ńö'¢ė µµĆäŚJ\œ6éä ={¶{–j2#“ÉāTع6éę+ÆĶ—Øŗv[7Æ[Æ@½Ž¢Žd6»Ø!hŪ^ęēē7 =t}Ščęõłśśvś/ÕŻ±Ē­²²ū÷ļ€&aHWxÜžųć8p'NdBDDŌɼ»Ō¼QČŗtõm5ȩՀ‘n:½… µ5F~Ųnśé.ģ&“ķźõkö)¢Ójt'Ę7cŗŹć6}śōFżQć!r‰ˆlié¶'DD†¢£Ą@ą‰'ŲÆHbW ­qäääF5|}}įēē‡ˆˆ³†æ„ŽÅĒČ~±YŁ+}DDŌHD„¶_‘yó÷…beœÜpFå…išę‚p­*5s@…Ź£ĆŹoKvˆŚŃeŗBMjŒu śˆØÓxį %Åč]W”.šżņßPr“Ž£V;wj—ø8«ŖŲĮ é.ŽØ–›÷µŽ¹¶Ź¬õ"DDDDDDŌŁ„¤˜¬PķģŌ§_Ęč_“u)»Ÿ+€Q£“ĮˆśÉrö@–s7¢ŁĀä¶.Y‡ęĻøšél]Œī)&FŪ„F­¶Ų.‹œ°Ļ£Ć a BDDDDDdDzŽ[ŗœ[£{Šˆ²²“Ū)ĖŁGŻz˜ŻD†Zf—WR£Ń -- ¹¹¹ČĻĻųłłĮßßƆ ƒŚ‚ Ł‡ŹŹJvčJDDDD_r2šŖ­}`¦śŅR6±%µHJŅĖßźĶ[ŪWˆ%ȅrEĒ]#±»@dß¾}HMMm²ƒīė›o®÷+b¦4oä:ŗŚŗävĖ®šĢ¬_æŽhb(55ėׯ·uq©Xæ~½Ń0ÄPzz:Ÿ3DDDDŌyÄÅ‘‘@v¶Ł›°éLSł›¶`ßČń(K=Ł1\øP; M ­t}…0 ±.» DöķŪ'51G~~>öķŪgėb“ ķŁ³P©Tšõõ…ÆÆ/T*•tæįņ‚‚ģŁ³ĒÖÅ&""""ŅJNnU ¢k:C@]NŽÜv7R’ņŖ/\Äįɳp凵sšØ(ąčQ“żŠ¤¹x³ÆbWX£Ń4©2vģXōķ۷Ѳ¬¬,:tHŗššj²O‘ÜÜ\|’ż÷(((€ƒƒ"##1gĪČå7C_}õ•tūŃG5Z^Sē¶oß>\øp÷Ž{Æ­OÅź*++„š!®®®3f *• &L@mm->ŒŖŖ*¤§§ķS$''|šüüüPSSƒ^½zįī»ļFĻž=M–aļŽ½½Žm)ƒ9ŅÓÓ±}ūv<óĢ3Öz8ˆˆˆˆØƒ°é pįÓ’ 뽨/-m“<żé—P–zƒŽµ~!BB“#мš‚vŲäģl\qtA–³'ƒŌyæŻ·Ā‘#GŒ.+..–n›\ϐ ų÷撍I“&įŻwßśo¾‰óēĻćĉ¶>UŌÕÕįƒ>0z_VV\]]ńųćĆĮĮ—/_īRē֑’““Żvtt„³³3f̘ooox{{cƌpvv†££c³ŪźōģŁ‹/Ę;#1cĘą_’śŚ\ĘękSZ[†¶ƒˆˆˆˆŗ¶īŚtFW+äĢKš„!:?ūi{u%%Ö/Z­ķW$+ uŁŁĄ7ńP߿΁}l}©ŗ »ˆž4M“eõõõ8|ų0¦N 8|ų0źėėĶŚ6-- nnn;v,ĄÉÉ Ļ>ū¬tBBĪž= ™L†   Üu×]HJJĀ‘#GP__‹/bīܹ8pąJJJšņĖ/#33Ū¶mƒ‹‹ įķķæžõÆØ©©Įžó‚€ŚŚZ„††bÖ¬Y€Ż»wc’žżĖåP«Õx蔇°jÕ*\ŗt kÖ¬Į‚ •[„R”ŗŗēĪĆÕ«WÖ hīÜöīŻ+­÷Ė/æ 33‚  WÆ^øēž{PYYi“¬Ų±cœœœ——777<óĢ38qāöļߏ'žxšŃGaęĢ™Ø««3z-:īéØß¼Ŗ¢¢{öģĮŒ3'Nl“īž={PUUet[SnøįģßæĒGxxøŃė©ĻŲżß}÷]£ĒŚŲ:2™Ģ¬2 4Ččc§Œ9sę˜|.VWWćóĻ?Gaa!|||šč£¢ŗŗŚčśUUUˆGuu5A€››|šAØTŖVŸQwSõŽpŁņ+šüó@t“UŽŃGÉzo.|ś“Aˆ¾ÜÕėPžš†š_’„§g‡”OŒ^ĮĮčuß]“įMĮŸ‡P¼w?4{ śĀE›^?{eˆ©/ØÅÅÅ8zōØ4oī¶yyy 4ŗ~zz:Μ9ƒE‹–/_Ž'N@.—#//o¾ł&ÖÆ_¤¤$<’üóųģ³ĻpęĢ(•Jäääąķ·ß†‹‹ V®\‰””DFFā¹ēžˆ¢ˆ×_“&M‚F£Į®]»šśėÆĆĮĮėÖ­Cbb"fΜ‰ÜÜÜ&a ­żqģŲ1(•J<ūģ³P*•­:7ŒŒ äęęāłēŸ|łå—8~ü8Fe“¬r¹gĻžÅ[o½WWW¼ūī»Čn¦-£\.7y-:Šnh]RŲ±wļ^Lœ8ž×^ōJJJ°wļ^TUU5 Dō·mNŸ>}——gņz¶t½õėęsŹnō±3|>[.\ø€·ß~nnnˆ‹‹Ć±cĒ0zōh£ėŸ^—/_Ęšįƍ®?xš`lŻŗŸž9 „°°0xyyįčŃ£m:"""¢n+;[ŪĒĒ%ŚŚ"‹[t÷Yļ­€’­Ó” ¶õ™ZEÖ{+µŌü”‰ ՗–āčm÷`໋„`ĀV¤€×’’hö@Ö{+Ž“ƒ]"~~~Fkzxyy!<<€¶iŒ±Z"~~~M–łūū#))ÉģćėĀżL[ź|UEČd2üłēŸÉdxśé§ƼņJ£u̵oß>LŸ>X¾|9Nž<‰āāāFaHkĪ-<<wÜqG£e;vģ0YV…Baōüō™źĖĀŲŗÖęėė+ÕōP©TP©TRS™½ö‚'NĶmŪ\ÆIāėėkÖ1²²²póĶ7ćāŋFƧ~%c÷†_ĘÖ1· Ķ=Ļtš[ĒŲóŁŌśjµZź›&##Ė—/Ē}÷Ż×ęs """źö4 >^;…„Xl·öŚt¦xļ~œy}‰E‚‚śŅR¤?żźKJ;Um„§'üf߂śmłØmģ¢SUc£Ä888`̘1P*•P*•3fŒŃ>*Œm;lŲ0TTT`÷īŻ“ż‘ÄĒĒ#)) żśõĆ©S§ Š"DQę3gšŒfcŹ… P]] @ūE5 UUUšöö õ¦¢¢ 0`ŅŅŅPSSŲ“i6nÜ™Lf4XŠõĒ!“Épļ½÷ā“O>iŅFKē¦Ó椦¦¢®®€¶iĆåĖ—M–Õ)„ŖØØĄ… š½I?suu•š†Ś B?¬˜4i’TūÅp[S<ˆ’’ 6Ģäõlézė?Ö-ķ£„2˜zģōŃÜć«’xegg7ūÜ=vģĪ;‡ąą`ÜrĖ-?~<Ī;צs """"­f×ŗ¦3ö ®¤§_ÅŃ9÷X¼Öę7– ķo/Śś›čuß]pšš°u1ŗ,»Ø!2~üxœ9s¦Ń²Ń£GĆĖĖKŗķåå…Ń£G7vW·m“‹āą€ēŸß’=6oŽ DDD`ōčѐĖåČČČĄ‡~@Ūdf芔FG«1€üłłłšššĄØQ£ˆO?żēϟGPP¦L™‚Õ«WcŃ¢E˜1c>üšC( xxx && …uuuųģ³Ļšä“OJūž6m¾žśk)¬™7ovģ؁ōōtÄÄĘunūöķ <‘‘‘X¾|9d2ˆŽ½{ĆŃŃŃhYoæżv£ēŪ·o_ØT*¼óĪ;š÷÷G’žż„ę:Ę® ķ\“¦¦wŽy'AĄSO=…O?żr¹ėׯ‡R©Äœ9sŚżœ‰ˆˆ†Ż®7ŻŠļ@uŪ¶m˜4iR“f&Ę ĻĖĖƒ%KŠŠŠooo<÷Üsppp0y=333›½Žµµµkcė˜[†qćĘ}ģž{ī9éwŽy§Ńuf͚…ĄĄ@üšĆ(..nń¹ƒU«VI5ńĄĄŻŻŻä9tŌćNDDDDMŁCәā½ū‘ž·—¬ŚłØ-:[5‡’}wāāg_Ūŗ]R[Ś)Čō&@Ŗč&GNœØøp½6Æ»ķ¬·Žn}'Q_1æMķŪ·©©©­Ś&44Ōh b éééŲ¾};žyę™9^gÖY®Åž={žž•J%Õ©ØØcˇŚØ6 5mźm¬é·©ęą¶Ųöó–įŁA AŪĻž(\Ÿ„†k÷iēEQÄ’VÆĘĀW’n‘kV÷ē~”Īžgō>Ÿ’<‹#ĖŁYĪę}qWOø”K6©+)Į™×— wõŗ;¦ŪˆaśļmŅŁŖŃk“ƒ=a“0Ms”ż;»¦ŲŻ‚\Ńd¹Ē¦ PNø±Żū—ÉdqŖŌ\›tó•×ęĖT]»­›×­W  ^oQo2›]4™“5=ĢiŹ ćēē×aauN“&M‚ÆÆ/ŖŖŖPPP€‚‚‚F£É.÷õõeBDDDD]†ŗ¾¾u•f­Ū›ĪäoŚ‚ż#'thhG 9zŪ=(Ž»æÉ}u99~”ĮĮPOø”Əkģ&€łóē#44“ÅõBCC1žü-ŪŠ”Cm^#¢³čL×bžüł:tØYeīčē Q{xÕ×`dE!¦i. ¼ü*ük+ą,Ō›\?ė½6łBßZu%%8~’£HżĖcØ/-µIźKKqtĪ=øņĆZĄ•ÖāČmwcOŲ$”„žģšņō]0Æż;é†ģ¢}ćĒĒčŃ£qäČäęęJ£ĻųłłĮßߣG†³³³­‹IČ¤I“äädäēēK£ĻųśśĀĻĻŅĮDDDDD]‘W} ¼źk¤ŪW]ÆT”@yżsn}i)Ņßx #æ’ŹÖÅ5éŹkqęõ%6 B „?żR“Q^®ü°īļZ°9Mb¢öÆF¤¤hēKJ®ĻggĆĖĀķvvˆ€³³3›ĆP«øøø°9 u½j+Ń«¶@!ŠœpÅŃ'ü¶ł›¶Ąoö-¶.b#u99H}śehž<`뢓(÷‡uōnló+ 9rr®"”’¢½¬Ź.""""""2aķ‘ü˜‡3i€Zmė¢.|śd½·¢ÓŌ Q×WKóś×M­›/æ <ü0 ;v=Ų`ČŃé0!""""""‰_Į <ˆŽ¦LŃžµŽ¬b,äpźį,4Üj”[1€I||‡^+j"DDDDDDŌXv6§ * ˜;Xø°CŸõŽ d-]ŃęķµaFżµłؤłė!‡~ķźžˆQóµSLŒÕ›Ņš4å'Қ,7rØõ‚ †–įŠP‡Z¹ĀÖŰžyŚŗDDDDDDŌE$&Z½ M`MœĖÆJ·rt<ŵZ4öNnė‘–Ŗ¦ĀÖEhŽ®]V?DÆ c„Ž^†51!""""""óģŁcżcL™b볤n‚™'9ŁśCĒFEŁś,©›` BDDDDDDęKL“īžÕj "ĀÖgIŻ""""""2_JŠõ1i’­Ļ’ŗŽ2CDDDDDd‡ŠœXa”–čXS¦qqÖ?N¢{<@sm¾Jī€j½įqG—ēŪŗ˜]J— DÖ¬Ycė"‘ ͟?ßÖEč4NČröØė«į,4Ą«¾¾uUPŠbŪwlķ&3Ö!ר3нĄC·¬Zī€j¹y_ŪÕõÕ¶>•.§Ė"0iŹT[ˆˆlhĻ®˜={¶­‹ADD6°iÓ&[”KŅ88r]ĪB=ÜjįU_·†ŗÖ×"IL“nē§!!Ś);ŪW«żtF¹B)-ĖWŖ¤yŻćA¶Õ%‘ —rm]""²±ŖŖ*[ˆˆØĖŅÕ<(PŗHĖŌõÕšŖÆ³Pßr-k"€v’ńń¶¾T’ėµ6R­2½ĄC’ZR׊%‘††z[ˆˆˆˆˆČ®hœÕ\pź”®Æ—ŌÜFÆIGõ#bå@¤„~9X“þuÉ@„ˆˆˆˆˆˆ¬«Zī€\G©™ p½‰zļ~xY»ķ؁bŲd„Lį(…­é—ƒģŸDDDDDDdżZ$į{÷ĆkāÖ;˜A?"ƚ¬4®įĮŚŌ:vˆˆ¢@ ƒL&»¶L ×-#""ū$€ėÆ÷2™ģŚ{¤ær¹¼Év¢(J÷›Z‡ˆˆČšäBƒ­‹`¶ņŌ4ė"ŅfĶCīźu¶>U²S]2©­­3ŗ\¼śŅsxżĶXxxx2ąHŅaģܾ O>ż\]Ż “Ė —+ŠŁ©ēŸ³fĶĀäɓ!“Éąąą€]»vį—_~Į{ļ½Q”Tj«ĻźÅÅÅųė_’ŠÕ«WC( (•J¾_™P¼w?Ÿś«Uį:œYM— DZŅŠŠ€śśZœ;{[7’†æ>ńQ__% !āŚÆ„¢Čd>šŹ «_¢ż ÆUāčØl²,9é "rl“ūL9DDd97Žx#>ŒqćĘœqčŠ!Œ7ÕÕÕ“Æ’ŽŽŽ¢(B&“IµJjjjP__ķ[¤īÆ~-żyż}ČårČ ŽSˆˆˆģ•fļ«C=ń[Ÿ&ٱ.ˆh›æ˜^.4Ōćā…óųiķÜ÷ĄCšpwGCC= Ī=­[~»öAV†›o™‰¾żąćøqėœŪ1pŠ`dž;‹„õ?įŗ_ČerČ®}ČÕgpT”—#qĒvųłś _æpus3«ÜDDd97Žx#Ö­[‡źźj)č8zō(ęĶ›‡šš]²C]2¹ZTbt¹ī×½ —Æą·Ÿ×榛gĮIåŠā’2ČärT×ŌąūU’Å]÷=_ä_ĶÅźV!汿”OpNž< Oo?¤§g 08łE@!“+““Į‡Ūž>ūUŽ»' T*‘~ź"#"Ģ*7µ^I‰ń×TOOOxzz"55}ūöENN<==”R©PXXˆU«Vį’žļ’ąķķ””|śé§X¼x1*++„„„ج¬„ (,,„\.‡R©„(Š(..Fii)>ųą¼ųā‹čÕ«Ο?øø8,^¼nnnprr‚R©„B”°õ%"""²:ĶŽV Dm-‘‚ß¶ŚśTÉŁeoq[~݈††TV”CˆÉ丐“žž½ąćć ””>>¾šņöĮ…œ,„„ōÅÅó9E—/]@pH_ˆ M:ŲÓ'Š‚4åå]ĮÉŌcšóõ——J sQµŃ:DDd}2™ ‘‘‘HKKƒL&ĆńćĒAąää„eĖ–ĮĒĒ‚  _æ~ČĻĻGMM jjj Š¢®@]]źźźP__@Ū$óĉ€··7Ŗ««įēē‡ž={"##555Ø­­m“"""{V¼wæÕaķŽ[©ūź’5DZ2eśĶpvT"į§ušńóƒ_@TT”ćŹå‹XõĶēŠĻ8źŃ;¤/ŠŠ Q_[‹ü«yčQ “)L¶ׯńńˆuššš€§§'œµĆ=8~CĆʶX^""²¬1cĘą³Ļ>Ü9spāÄ <šĄhhh€\.Ē/æü‚Ó§OKMf ¾¾^ =ōG£Ń$śż…””” ''K—.mtĢŗŗ:444 A/Lg³""²wå©iV?ūéx]i“£ö°Ė@¤‡_ØT*Ü0~~’õg,ųK œpuq…æoDßy¶ęˆL™ģz%™>}‚‘‘oo(ärˆ" 7Xǘ“ŌcØŖ®Aļ^žP¹ø6ŗļBv&CśŁś’u+ @uu5²³³QWW‡=z@?~©©©xķµ×’÷’רfˆ(АĖåj ‚€šš€»»;ńč£BE(ŠFÆnKDDdĻŖ/\D]N”ĮĮV;ūéxεUØPyŲŗVg—MfD2¹acą×ĆŪ6oDAĮøš—‹Ā‚|@eeV÷ Ŗ«« “ĖŅŽ&Bp_żC¦nĘ„ŹŹ œHI‚ŹŁ nj8*ÆgLŽJ”k PYYaėKBDŌ­Čd2DDDą×_EhhØTĖ£ŗŗÉdØ©©Į¶mŪ¤yżš!žžžØØØ@ii)DQÄīŻ»h›Ģ 0—.]B^^är9ŹŹŹ°lŁ2TUUA”P@”PH£Ķu²ś1XK„¬Į.™L¦­ż!Wą–[oGaAÜgggÜ:w>žŲņÖ|’_$¬ūįc R¹”_’A(*,@pHmØrm?Ķ%"Gi‡šņņėwWU“ū•ør!Ū֗„ˆØŪ;v,N:…Q£FI57ƌƒśśzüóŸ’Ä'Ÿ|‚‘#GbȐ!ųļ’Ū(ĄpuuÅĶ7ߌ•+Wbłņ娬¬„——jkkįāā‚˜˜¬[·+W®Ä—_~‰ØØ(ø¹¹A.—C.—³CU""źV:¢kwÜJŻ“]5™‘Ėåxé%„@Čą¤Rį‘'Ÿ…(D÷EŠC…(ˆŠÖ%Ńæ+“ĖQP’^½įćē Q “7ß\FS\„œs§Š»wox¹«L®W]^MqŌ^޶¾DDDŻĘšįĆńĶ7ß ŖŖJ:W„Rį7ŽhŌłé Aƒ¤$Ė–-“¹sēbīܹR’"3fĢ€ Ėå1bFA¤>Cd2†Q·£Ł{ĄźĒPO¼XŚžż鳫@ µß–k+vČäŠVō5źąN”‰€^§w»vnCö¹s˜=2Č µkŖŚóž?~kŅ‘Ŗ1ĪĪĪø’sj/v°JDŌ‘”J%HA†ī¶“““Ō©Ŗįk¼®6‰®/)ō 5‹‘ÉdR ¢Ūæž}DDDŻEGō#Ā‘fČģ.Ń6s‘" •Éõ¾Č Ƶ0äŚķ©ÓgAœ.^jW[»D&S\k2cܜ»žbėÓ%""tĮ†£££~ėŽär9"R`n°®~g«śŪė–é(£?u'B/+" žp4Zæ6 uvهˆ6̐5Yv}Ņ­#æ6]ļ+D&—C&W@ĪNńˆˆŗ<](¢ßŃ©nŅ…"ś”[WwæžŗśūŠæļDDŌ^εU¶.B›”„ž“ś1XK„,ĶN‘¶Ó"2yóµCˆˆˆˆˆˆH«Ćś!² "zdŗZ" BˆˆˆˆˆˆĢV~" u%%V=kˆ„1!"""""¢v;ŗÖ!""""""‹³F „§'ÜF ³õ©‘č’5Dˆˆˆˆˆˆŗ2EP TƽlÕcČdčaĆstšš°Ź~æöjOœ“į™u^*Q“źžA¶>E‹b BDDDDDŌĮä}ąņŚKV=†‹­OŅJ¢F6n܈””$&&¢¬¬ ÉÉÉīŠŠ‚Z­FXXn»ķ6DDDŲŗČŻZrr2ŹĖĖ‘˜˜(-ӟק{ÜtŪŹģڵ )))ĶW’xaaa¶õ%ėpvˆćäɓة©(ŠpppĄ!CąļļŹŹJģܹ³g϶ųq«««±uėVÜ~ūķŪgaa!Ž;†ŚŚZ8::",, ŽŽŽfm[UU…ŒŒ œ?'N„O«ąĄ”••ᦛn‚\~½«™ö”‹ˆØ»E7n„³³³“ĢÉÉ Ć‡GķŃļ;¶:—¶śłēŸĶ>’ŋĆÅÅEz?E=zōĄ¬Y³Š³gO›u µÆ«·‰’śĖVoӚēäʍ„ššpi™(ŠųłēŸ1wīÜ6ēīŻ»1yņäFĖ:ė’/µNNNāāāFÓģŗŗ/½ ˆETTvīÜiėSč¶-Zd21ʰłaTTbbb OOO³öaŖę‹1†e‹ˆˆĄ³Ļ>‹‡zȆW­cŁU ršąAŒ;Vś‚^PP€ąę›o¶źq1gĪ‹ķƾ¾‡˜1cąėė‹ĀĀB:t3fĢ€B”hqū³gĻĀ××EEEm:¾ ČĶĶŜ9s…!ķ-Qw3eŹØT*@~~>:„éÓ§ĆÉÉ©]ūµōūŽ-Ļ„£<öŲcŅēQ±oß>¬^½ .“uŃØ“§¦ˆ5Čår¢ØØČ"?,Õ××£ŗŗŚäż]ż’·;[²d āāāZ BL ³õ)P;$&&"11jµ±±±xžłē­z¼äädÄÄÄ >> f‡0]™Ż"¢(¢¶¶‚ HĖ|}}qė­·B.—£¾¾2™ ™™™øpįŖŖŖŠ·o_ <põźU¤§§KūŅÕ,ٲe &L˜777”””`ēĪ˜:u*<==QYY‰Ż»w#**Jś„®¢¢ūöķC’žżqįĀŌŌŌ 88X:NVV233”T*Ń»wodggcģŲ±šššŹŸŸųśś|||ąęę†üü|ųū·ü+Ghh(ąōéÓĶ®gźœ9Ų·o&L˜ …"ę–K£ŃąčŃ£ššš@ee%&MšŌ®ė;sęLdddąŹ•+Éd={öİaĆ “ÉlżŌ#"2‹ŸŸ\\\PTT•JÕäu²  iiiE2™ Ɔ ƒÆÆ/¶oߎ‘#GĀĻĻ8vģ&L˜ŠØ†ˆ©×Ų’’ŒÉ“'ĆŻŻHLLÄM7Ż„=z °°nnn(((jFxzz¢°°°IuC™L†ŖŖ*£Ē©ÆÆĒɓ'1}śt8;;ćĢ™3ج¬lņ&X^^77·FĖÜÜÜPVVfV bŽšš“ēŽ‹/bāĉŹfn¹är9ŹĖĖŃÆ_?7{,s®oQQ._¾Œ©S§JŚ322PYY WWWŪ>ńˆˆZAČåņ&Ɠµµµ8|ų0&L˜”––āĻ?’Č3¤~~~Fßwš{mN{_[uēŅŠŠ€ćĒ#** ...ČĶĶő#G0cĘ TVVš|ßkīœ¬ūń¤ŖŖ »wļFPPPQQü=öüüüPTT„O?żĻ=÷ś÷ļóēĻĆ××ŁŁŁ Avv6üżż‘-żrņäIüķo“®ÉŽ; Ńhąåå%W&“A£ŃĄĆĆO>ł$JJJšŃGaŠ ApvvĘ’ž÷?<üšĆčŁ³'rssńķ·ßbįĀ…P((,,č7ވ;ѹ4·O777üśėÆxź©§ V«‘‘‘ 6ą…^€F£ĮÖ­[ńÜsĻĮĆĆ{÷īEqq1är9*++M–ÅÉÉ o½õ–Ł×ść?FLL öģŁ#-;pą8 PsęĢĮĮƒ1nÜ8«>īM=““ƒ¬¬,ōėׯŃ}Ķż 0‰‰‰4h®\¹‚iÓ¦”¦¦h1 ŃéŹ’æŻ9aˆ®ßĆĄ#11)))R’¶6Į"ėQ«ÕˆŠŠjR{';;ŁŁŁĶ6±Ń½æ’ōÓO­īļ#&&111Mö÷Ė/æ}®eggcįĀ…ųę›ol}ɬʮ^±ˆ>}śąźÕ«RjŻ»woŒ5JZG÷ÄQ©TprrBuu5JKK”V«įīīpuu…Z­FAAüüüpõźU£  @śąÓÆ_?m)Š¢Ń攔”ĄĒĒG iśõė'ż¢§Æ”””I…B††‹]«üü|“ēÜ«W/£Ū“¶\AAA-˜ėėč舟źjdgg£gĻžpqqĮ°aĆ,v-ˆˆ¬M\¼xuuušńńAee%€ėƓWÆ^…§§§T[ŠĆĆīīīŅėäłóēhCŒ¾}ū6ŚwsƱŗeĘ“õµÕš\ n½õVé~TTT@Eš|ßkīœ-žėūņĖ/!—Ė!Š"ŹŹŹ0vģXÜ’ż€sēĪ”WÆ^šóóx{{£wļŽČŹŹB’žżqīÜ9Œ=ŁŁŁ?~<Ž;†nøYYY0`T*ŹŹŹ””„AƒA­VcƌFĖ!—Ė„Ļ%žžž Äłóē”P(Š«W/©Oųśś"++ ^^^EŃdÕwSū Ć믿.­‚¢¢"ˆ¢ˆģģlI×Üøqųć?]ce2dH«®ū²e˰yóęFĖvģ؁ččhéG—¹sēbĒŽˆxłõ2y_qž«ßPhh(vķŚ…€€8::JĖ[ś’ĄĮƒ'''ŌŌԘu¼®ś’Ū“†DEEaįĀ…&ƒŽÅ‹Š6}Ų»wÆ­O‡Œ Ɔ LŽ_RR"õ“ŻäžäädÜqĒŲ¾}{«joÄÄÄ4éØuŹ”)X¼x16n܈˜˜˜&M³āććkם­ŚU hˆąą`£””‰‰‰ČĶĶ…‡‡ E£ŗŖ555Ž„ķښōéÓ“5$zõź…““4ŚF‡ Q_T³Ž£P(Œ¦č …¢É[]]T*Ī;'•G÷”D’v’žżĶŗNĶ³)͕ːR©”®A{ÆÆ““&L˜€ĢĢLœ9s€6Ų4h›ĢQ‡©««ƒR©lÕ6»vķ żĀźįįńćĒKÆū†Æ“ÅÅÅM:¾¾¾¾8vģDQDqq1ƌƒśśzię^c› DÜÜÜZõŚŚÜ¹¤§§£  @ L•M’}ƹs¶]"¢(ā‹/¾@Æ^½ąāā@ūž£›×qqqAyy9F…;wBEäēēcȐ!Rp““ƒ›o¾®®®ˆ‰‰Į¤š‘‘‘˜EQĎ;™™ é±EĪY©TJżI”——7[–ö*,,Ä Aƒ¤ŪŗŚ+”8’ŠŃPÄa }¬śõė‡'N4ŖŻŃŅ’GļŽ½qīÜ9©™tK:ć’o[^S»ƒŲŲX£aˆZ­F\\œŁ]FDDp„™.ŹÓÓ=ōzč!,Y²±±±MÖINNFll,V¬Xa‘cĪ;±±±FūÕJLL“ėNVķ&©««Ceee£”L”PĄŁŁÕÕՍśč0d,YÆ©©““œœœ P(ŸŸ/}°Ōõ›įąą Õž0‡R©D]]t»¾¾µµµMÖswwG^^^£eeee@Ļž=›„ę† ęž³)Ķ•«­Ē2ēśŚ]OģHJJ‚‹‹ [}īDD­•‘‘   Vx×ļȰ9ĪĪĪšņņĀųńćMޟ›› www8884 Dš{Õņ:¢(6ڶ5Æ­¦ĪåŅ„KČĶĶÅäɓ”P(P]]-Õhī}Æ„s¶™L†™3gbõźÕ1bœįęꆊŠŠFėUTTĄŻŻ®®®P*•ČĢĢ„ŸŸd2|||™™ '''©yQÆ^½0oŽ<ښøęääżµĒĻĻåååøzõ*mµÄźźj‹~XhéœMmӖrµ÷ś^¹r§N’öēźź ggē&5sˆˆ¬įĀ… ČČČĄÖ­[„ĪĢtӉ',r ???h4”––Š~9MLL”¾|ųłłI_ȍmkź5ÖŁŁµµµŅ_ż5–zm­««“ĀmQqöģYŚŚͽļµtĪÖŒ   é×ķžżū#77łłł“͐rss„~ś÷ļ={öH‘c÷īŻŅiiiŅ/šąåå£×²””©©©ŅcuńāEōķŪżū÷Ē•+W›« „¼¼Ÿ~ś©R4ĒŌ>«««įęę„R A°wļ^Čd2ŌÕÕ!00999R”œœ,Õ2iOYĢ1cĘ üōÓOE¢(bżśõøå–[¬žøėӅ ¶Cm­‘#Gāųńćfż”••”øøČĻĻGyy¹ŌHkuŌ’ļ‰'š¼~nŻŗøpį‚­‚NĆXM@ūÅ׌aHNN6n܈%K–HÓʍ‘““cėĖŅŖsŲµkW£sųöŪo½>·uæß~ū­“Ļözč!DGG½ĻŌs¦-ģ½óTS즆ˆ§§'"""pāÄ ŌŌŌ@EØT*Œ7īīī;‰;99a̘1Ņč*€¶Ŗ«®vB=pöģY©mµNœ8¶ŖŒīīī0`vļŽ •J%µ5l6£P(0vģX¤¤¤ ¶¶NNN7nœÉŖ²†vģŲŚŚZŌŌŌąŠ”CÉd†#néœM½”¶µ\ķ½¾~~~ørå vģŲ!½aūłł±vuˆĄĄ@TVV"00°I³ KqttÄŲ±cqōčQˆ¢A0pą@©ŗŗŸŸĪž=‹”C‡6ٶ„×ŲAƒa÷īŻprrBļŽ½”R©¤×QK¼¶ąāŋرc”J%† †²²28p'N4ł¾×Ņ9[ŪĶ7ߌ’ūßŅPņwß}7ÖÆ_/Ż÷ŻwKµ?ś÷ļ½{÷J£õcóę͘.jµ .l±|–oō57!!Įbžš æģ}¤¢¶tĄ ӛmØ¢›8p ąĄõڼŽ:ŗõDQ|ŜƒÆY³Ó¦M³õukA¤ņd2JKK±oß>ÜrĖ-ģ ƒˆØ“Ó ĻJę³ęūŽĻ?’, ;ÜUäēē#>>/æü²Ķ÷Y__œœōķŪr¹¹¹¹ųļ’‹—_~¹MMBBüq«_ĆÖŅäBķėMAnėĪēē_žž„|ˆĢĢĢ&£ģÓŸ“ͱöēÖö¼¦īŲ±óēĻ€&5±ŒÕĢ2¶ģó–įŁiC悊A ×ē”įŚ}ŚyQńæÕ«±šÕæ[üzÆ\¹Ņhs…ųųx«ōß°k×.ÄÄÄ“Ŗ9DHHÖ­[×lm•Ž DLuŚ\ł³²²]c_ö‘mV³ĮØØØ&}éč›:uj“@„„mLyųį‡o“¼ś„6w^†Ŗź{į…š4Ł2¼f–$“ÉāTع6éę+ÆĶ—Øŗv[7Æ[Æ@½Ž¢Žd6~²ė@r¹WÆ^ʼn'¤j©cƌaBDŌ0 i=¾ļu^ …gΜĮļæ’.uĻ=÷š±!‰µ’łšŚXBB‚ŃåÖC¾żöŪ6õ”ČČH$$$Ų|8_c_Ž[bnM‡ųųx£Įƒ1‰‰‰xį…,Ö¹iKå7'i‹%K–½ž­½Ę]_‰:˜auA"""{Ę÷½ėüüü,Z;¤=ūŌu.ŪÄż„­‹Šeń’·ć˜j.ciŗš!ʄ„„ ::jµńńńFk_ÄÄÄŲ““ו+W6ūE=$$Dźó©¬¬LjJӚ@¤5,ݹ©)¦žĶ­å“’’Ņč¶F£Abb"Œī#>>ŽęĮWG` BDDD]Ž=5M ėywév,>'©­JJJŒ.7„ŹL…!qqqMś*Y±b…Ńf‹-jS³öڵk—ѦE€¶7ß|ÓhP³qćĘV_ĻŲŲXÄÄÄ 88%%%HHHĄĀ… †DqqqVÆ%b*€271uŻ …„„ >>¾ŻµNŗ "DDDDd—–~š”­‹@Ō"Ć_īuZźøøµ¾żö[£_ž…!:ß|ó 4M“&=‰‰‰ŲµkW‡i65ŖJK}­“¶¦ƒįž<==ńŠCaĈˆŒŒl²~BBB‡4›±¶ī† DˆˆˆˆČ233m]"jĘĒÜdYHHH‹£ŲÄÅÅķ㤣æ8'''mZcѾVšŪ_DD¢££›\ÖtNŪ™egg#** ųüóĻmÖ,Ŗ#1!"""¢v‰ŽŽ¶uˆØ999F‡„5§Epp°ŃĄ’C¾šć×_5ŗÜT­‘¶jéõĢŲµ“-skEDDĄŻŻ]ŗ­ß抱s‰ŒŒ“Ś(G‰ÜÖ """""ź®L ėlīp²ę0UƒĮÜ~5Œ­§ŃhLöb ¦:žµtg¦- ŗ[ •——[õüwķŚet¹¹į‡~ˆ;wJSRRDQDBB‚ÉgcbbL†&ö‚‘˜ŖU`Ŗo‘¶0&0»É‹©/Ģ–,cKŒ…:Ö‰§³2j™ hĢ5wī\ģܹÓdM›E‹ŁśŌ­Š‘  E;“Fgg/żt“•±f:€åB”ŋŻWbb"rrrl}śVĆ@„ˆˆˆˆˆČ†BCC.7õ%˜ŗݰæ†BBB,ŚdČTŸ2¦jك.Ł©źŽ;l]""""""‹ˆŽŽF|||“å±±±éŌŅT³ s;5Õ4ĘÜž+,!$$¤I-‘Žl²cKqqqF—ĒÄÄXō8¦śO±ēŚ9].Y°`­‹@DDDDDzDQlö¶©eķŻÖ^Ģ;×čžģģl,Y²‹/nמGŒatł‰'Śˆ„„„ĄÓÓ³Åm-õeŚŲõŃ5+2§]Urr²Éž=Ģ%Ø5,Ł‘oWĮ&3DDDDDD6fź×žŲŲX|ūķ·ķŚwDD„Ń_’ÕJ1dŖ¹†±ž&Lõ…Ņœ7šuʆĆÕh4&kO؃äädLŸ>Żč}±±±‚¬ŻOIgÄ@„ˆˆˆˆˆČĘ/^l²¶FLL ^xį…vu²j,PHLL49œ«Nll¬ŃšĘœĄĄĄ&˲³³M£¤¤ÄģZĘŹÆ+Ÿ= »råJLŸ>Żčµˆˆ°xķ]»v ČŌjµŁ£uE Dˆˆˆˆˆˆ:Ļ?’Üd?qqq Į /¼ŠlœœŒoæż/¼šB£å¦š]DGG›Üß·ß~k“FTT”Ń/ɦj;FNNnŗé&³›Ō›¬E‰%K–˜ ŒJJJŗÄˆ=ÉÉÉX²d śöķ‹…  CŌj5>’üs‹Õ)))Į’%KL>v–^:›.ׇ‘=Šˆˆ@\\œÉ/žŗ&"ŗB’KlYYY“ŠaŊŅ|pp0bcc›#‘‘‘ˆ‰‰‘Ž«;ޱę.jµĖ–-3Z¾ččh£_ uLjˆˆ€»»»Ń²š#66 Fƒ‚ŲŲXÄÅÅ!**Jźģ5;;©©©R?ķķ‹Å1uźŌFĖ̽!!!X·nYż¾Šoōxj4¤¤¤4Ū¤É5Q:"DDDDDDÄC=„DGG·ŲÉeKżsģŚµ«QMŽÅ‹#;;Ūhӈųųx³ś‰‹‹3ł…<88 .4ŁÆ‡©/żĘ‚SūOHH0Y›A£Ń !!Įh_iDš¶ c«‰Ø­5CĢylõEDD`ūöķvŻa-Ą&3DDDDDDŹ”)SŻīaU…ß|óM›ö«V«‘Šā0Ą±±±­ŖĮßŖN;§L™‚¤¤$“C ·ęZtŃŃŃHLLĆ :,œˆķaĄ@„ˆˆˆˆˆØÓńōōÄ7ß|ƒ¤¤$ÄÄĘģ[Ĕˆˆ©éˆ”o¾ł‰‰‰fjµ .Dvv6ęĪkV¹·oߎb聤¤¤SŪ¦¤¤ 66ÖģėāććÓźćŲ‚Z­Ftt4āāā 6tH§¦QQQˆ‹‹ƒF£Įāŋ»E²6n#ÓŪÖAorąĄ€ € ×kóŗŪĪzėčÖwEń[_ """""j=Q›½mj™­¶żü£exöÅEBƒAh€ …ėó‚Špķ>ķ¼(ŠųßźÕXųźßmvwķŚ…””h4š&Ķ.tᆮ sæŠ&''cļŽ½HIIiŌĮ©n?QQQmžrœ““Ó¤ļŠØØØ&²–””4©ĮįęęfvM“]»v!11ŁŁŁŅ9„……A­V#,, aaan“±cź¶kī|[»ž;ŗĒNŸ®Œę[¢ėƒdēN£w'''£¼¼Üä1u ķ—ÄšŚt™L @͵I7_ym¾@ÕµŪŗyŻzµźõ&õ&óĖі²ƒ]Ć@„ØÉ®}[õŻæSé,›ĢQ·Ć@„ˆˆˆˆˆˆˆŗ"DDDDDDDŌķ0!""""""²“©S^4ąį‡//Ą 3\@vöõūe2 o_ >¾mĒŌķ+2R»/™ ˜7HN6¾žĆkĖi¬\óęiļ3Ņ)«½p°uˆˆˆˆˆˆˆģŽ.d˜7O;ø»7^';×ĪĒÄjµv݇ŽV¬hŻ1W®Ōn Ģ™£Ż|¼vن#÷<ō6ōČĪŽÕ–,€ŲŲėĖģ"""""""kHIŃ YY@HHÓū~XūW?¬X¼XRÄÅĻ?o|;S/n¢Œ„­©ņÆß|Óų¾Ø(mč« AV¬ŠÖ&‰Õ–gńb[_A«b“"""""""kŠh“!ƒ±P#;[[s#&¦iĶēŸ×žżöŪÖĻXmŽ… µŒo³x±öųqqŚ0dŃ"ķ~>’ÜÖWĻźXC„ˆˆˆˆˆˆČZ¢£/×5©Ńh“µ3ōeg__§-µ4“Mnōūi®/Ļ?×ö;2}śõĒ0¤±C Dˆˆˆˆˆˆˆ:ZNŽöo[;P5&9øóNm „ć¦ź‹ˆŠÖT‰×ÖfŃÕ*±s DˆˆˆˆˆˆˆleēĪėĮE{h4ڐ”Ōø†GllóŪ&'kƵZ¦,Yb÷ż‡ģC„ˆˆˆˆˆˆØćM™¢ż»q£eöÆ E.l}s—'žŠ†!ü”­!kzØ^;Ā@„ˆˆˆˆˆˆØ£EEiC]Ń^%%Śæ†ūŠ‹k~»%K“į‡.HэRó;BVĒ@„ˆˆˆˆˆˆČV¬Š}ūjƒ‹ÄDķÆ*·5zHū7>^;%&jƎ%KŒ>b7:Z;%'7ķģÕĪ0!""""""²…˜`Ćm`ńĀ ĄŌ©Śéᇁ={Z·Æą›o“ó?¬ŻO|¼v’aaŚåśµG4m¬@Ó!væłF[&;o:ĆNU‰ˆˆˆˆˆˆ,MĶ[OæFFY™vYs¬6·ß˜ķ”˜ø»_ļKÄŲžŌj +Ėų~Ōj øŲf—®£0!""""""²µÖv„ŚKŒZÓ °É u; DˆˆˆˆˆˆˆØŪa BDDDDDDDŻ"""""""źvˆQ·Ć@„ˆˆˆˆˆˆˆŗ"DDDDDDDŌķ0!""""""¢n‡u; DˆˆˆˆˆˆˆØŪa BDDDDDDDŻ"""""""źvˆQ·Ć@„ˆˆˆˆˆˆˆŗ"DDDDDDDŌķ0!""""""¢n‡u; DˆˆˆˆˆˆˆØŪa BDDDDDDDŻ"""""""źvˆQ·Ć@„ˆˆˆˆˆˆˆŗ"DDDDDDDŌķ8ŲŗDDDDDDŻÕš5kPZZjō>,X°ĄbĒśā‹/ąģģŒ|ŠÖ§MŌ)0!"""""²‘Įƒ£ŖŖ ––A0tčP( ØT*[Č®1!"""""²‘ššpižōéÓØ­­Å˜1cąģģlė¢Ł="DDDDDDXMM Ž9‚œœTVVĀÅňŒŒ”j‘˜³Ž” . 99ÅÅÅEŽŽŽˆŒŒDŸ>}l}ŹD‚ŖuR‚ ą—_~Ajj*z÷īÉ“'#((éééųż÷ß!‚YėŖ­­Å–-[ŠŠŠ€ØØ(DEEAEģŚµ µµµ¶>m¢Į"DDDDDDŌ„K—PTT„=z`ņäɀ °°W®\Ann.Z\§wļŽö[__QQUU…²²2ōčŃsę́ƒæ"R÷Įg;Q'U^^P«Õ–{zzāŹ•+(--…(Š-®cˆøøø`źŌ©8rä8P( WWW„††bōčŃRÓsÖŃ׫W/Œ5 ųć?h›ŲDEEĮßßßÖ§MŌ!ˆu111F—;99aüųń?~¼ÉmĶYēńĒot{äȑ9r¤­O›ČfŲSu; DˆˆˆˆˆˆˆØŪa BDDDDDDDŻ"""""""źvˆQ·Ć@„ˆˆˆˆˆˆˆŗ"DDDDDDvfß¾}xōŃG1iŅ$DEEįÉ'ŸÄ”C‡¬zĢĀĀBDFF¢²²ŅÖ§Od"DDDDDDvdóęĶxķµ×0oŽų RRRiiiøõÖ[±bÅ <ņČ#F·7l2cj_³gĻFjj*ąŲ±cˆŒŒÄńćĒ'OžÄ¬Y³l}©›` BDDDDDd'®\¹£ĶV\\\ąććƒÜÜ\DFF"-- ššŠ1cĘ@£Ńą„—^³Ļ>‹Ÿ~ś Ļ<ó ^zé%TUUĮŃŃ„„„P«ÕX¹r„Ńķõ5·/żäȑ#1b„–;v¬É¾ˆ¬…‘ppp€ &ļ2™ HOO  4ʎ‹C‡”gĻž;v,`ģŲ±šņņBRRd2Ŗ««q×]wĮŻŻŻčöśšŪט1cpģŲ1ĄŃ£Gqļ½÷āčŃ£€””Œ7Ī֗‘ŗ "DDDDDDv" EEE(//or_ee%ŠŠŠ€ČČHœ:u 5558sę """PXXˆ‹/bΜ9ŅTSSƒŠŠ €R©„››Ż^_sū;v,RSS!²³³1}śtœ;w¢(āųńćMĀ"ka§ŖDDDDDDvb芔čŃ£Ö­[‡˜˜˜F÷żōÓO读7† ™L†ž={bóęĶčßæ?ÜŻŻįć惐üšĆMö{īÜ9Čd2é¶··w“ķ „ū›ŪØT*$&&¢’žP( ÄīŻ»įīī???[_Fź&XC„ˆˆˆˆˆČNČår¼öŚkųśėÆńóĻ?£ŖŖ ÕÕÕŲ“ižóŸ’ąµ×^“‚ČČH$$$H52ʍ‡Ė—/ćȑ#€K—.į®»īBII‰ŃcnÆÆ„}EFFāūļæGxx8`ŌØQXµjk‡P‡b """""";2yņd,_¾_}õ–/_6lV¬X!€6”X»v-ž|ņI€§§'–-[†+V ¬¬ xä‘Gąé鉂‚‚&Ē1Ü^_sū“}Ь_æĻ?’<m ņÅ_ą°õå£nDÖĘmdzŪ:čMŽœ8Ppązm^wŪYoŻśN¢(¾bė‹ADDDDD­'Šb³·M-³Õ¶Ÿ“ Ͼø‚ @h  ¢p}^®Ż§E’[½ _ż»Æ6Q×'“ÉāTع6éę+ÆĶ—Øŗv[7Æ[Æ@½Ž¢Žd66™!""""""¢n‡u; DˆˆˆˆˆˆˆØŪa BDDDDDDDŻ"""""""źvˆQ·Ć@„ˆˆˆˆˆˆˆŗ"DDDDDDDŌķ0!"""""²3‰‰‰xšĮ1aĀDEEįńĒĒŽ½{Ū½ßwŽy7ß|3ņó󉏏J›œ_aa”MOö‘ٲe /^Œ‡z‰‰‰ųķ·ß0ž|¼ūī»ČŹŹjó~AĄĘńŁgŸĮĒĒ[¶lJ„ź°ózūķ·‘œœ šņņźšć“żq°uˆˆˆˆˆˆČ2°|łr<õŌSøé¦›J„3gĪÄĢ™3۵444ĄÓÓr¹>>>znēĪ“ęmq|²?¬!BDDDDDd'ŅÓÓQXXˆŪn»­Łõöļߏūī»óēĻĒ‚ °{÷nĄłóē1uźTlŚ“ wŻuf̘/¾ųšśėÆüń&MfÖ¬YƒŪn» ÷Ž{/~žłgL™2™™™8}ś4ʏ/·””‘‘‘ø|ł2ŅŅŅpė­·bŊxä‘G[·nŝwމ9sę`Į‚8rä`ٲe8yņ$–,Y‚7Žx£I“™¶œkˆىÜÜ\xxxĄĶĶĶä:EEExå•W°råJŒ=ĒĒSO=…7ĀĮĮČĖĖĆŚµk~g/ÖQIDAT‘––†˜˜,X°ļ¼ó&OžÜ$PøtéV¬Xļæ’ ĄŹ•+QUU¹¼łßßQZZ µZ-móŽ{ļį£>ˆ#šć?ā’ų°hŃ"lŻŗ‹/FDD Ū}>¶~øČĘXC„ˆˆˆˆˆČN( ‚Šģ:‡†ææ?F 9r$””@ŪWČüłóƆ ƒ\.ĒÕ«WMī/%%żū÷Ē€÷Ž{o‹e™L†źźjÜu×]pww‡J„ĀŽ;0bÄĄ˜1cpńāÅ?ź>XC„ˆˆˆˆˆČNōīŻååå(**‚···Ńu įååÕh™Z­FQQ‘tŪŻŻ]š—Ėå͆jµZŗķėėkvy•J„T›E|śé§Ų³gQ[[ E±Ł}Xś|Øū` """""";1hŠ ōčŃk×®5¹ŽŠ‹‹-+..nU”ĻŻŻåååŅķ+W®Hó†įCiii£me2™4æcĒlŚ“ Ÿ}öžūß’ā’ų‡YĒ·ōłP÷Į@„ˆˆˆˆˆČNČd2¼ųā‹ųöŪo±aĆTUU”  [·nEtt4ŅŅŅ0vģXäåå!%%pōčQäååa̘1m:ęˆ#pśōi\øp°qćF)čšóóƒ 8uź`żśõ&ū)--…»»;<<Ō}°É ‘™>}:T*žóŸ’ąĆ?„ƒƒ† ‚E‹aŲ°a€„K—āż÷ßGuu5T*Ž’}xyy”ŖŖŖÕĒėׯyä<öŲcšóóĆ<™L™LOOO<śč£xöŁgįé鉘˜8;;m²2cĘ l޼·ŻvüżżńŹ+ÆąÜ¹sxź©§°jÕ*Ģ™3K–,Į?ü€„K—JŪyyyYō|Øūµq™Ž¶z“#'ĪT\ø^›×ŻvÖ[G·¾“(ŠÆŲśbQėöń`¬ĻSż@ŲbŪĻ?Z†g_\A 4„‚Qø>/ ×īÓĪ‹¢ˆ’­^…ÆžŻĘW»ó«¬¬Ääɓ±mŪ¶&}{€L&‹P  ęڤ›Æ¼6_ źŚmݼn½Zõzˆz“ŁŲd†ˆˆˆˆˆˆŚ¬ŖŖ <ņNŸ> ųå—_Ä0„:=6™!"""""¢6S©T˜;w.^~łe444ĄĒĒļ¼óŽ­‹EŌ""DDDDDDŌ.sēĪÅܹsm] ¢Va“"""""""źvˆQ·Ć@„ˆˆˆˆˆˆˆŗ"DDDDDDDŌķ0!""""""¢n‡£ĢŁ‘±cĒB”P@&“œ‰W^y¾¾¾mŽoaa!n¹åģŽ½UUUҼ‹‹‹­O™ØMXC„ˆˆˆˆˆČĪ|śé§Ų·oöķŪ‡„„‚€ŲŲX‹ķßĖĖ [¶lJ„j×~Ž~ūm$''ŪųjQwÅ@„ˆˆˆˆˆČŽyxxą‘GĮįƇQWWg‘}ŹårųųųHµPŚźÜ¹s¶¾<Ō1!"""""²sŗ D.×~LJJĀ<€;īø>ų RRR™™™ˆŠŠĀźÕ«1ž|̚5 ß’}“ż"22•••€³gĻāÉ'ŸÄģŁ³1gĪüūß’† €­[·āĪ;ļĜ9s°`Į9r°lŁ2œĢŸ? ,ĄīŻ»iiiøõÖ[±bÅ <ņČ#¶¾œd'Ų‡ukGžiņ¾C†ŪŗxķVPP€Ļ?’S¦LB”€F£ĮK/½„>ųcĒŽÅ”C‡šŅK/į×_…\.GEEjkk±~żzœ:u <š&Ožl²Æšš<÷Üsxī¹ē0sęL”••į‰'ž@Ÿ>}0cĘ ¼÷Ž{ųč£0bÄüųćųĒ?ž„„,Z“[·nÅāŋ¢¢"¼ņŹ+X¹r%FćĒć©§žĀʍįččˆŅŅRØÕj¬\¹Ņ֗”ģ"""""źÖ&Ü4Ūä}W/eŪŗxmņōÓOC.—CŌŌŌąöŪoĒ‹/¾8tčzö쉱cĒŠvĀźå兤¤$BEĢ;0xš`ōė×ĒŽƍ7ŽhōX)))3gĪø»»ć‡~īß±c‡4?f̼’žūAŖ­¢sųšaųūūcōčр‘#G" III8p Ŗ««q×]wĮĶĶĶ֗—ģ"""""źÖŖŹ5¢ @ čž6¶.Z›}ņÉ' C]]ī¼óN„††JABaa!.^¼ˆ9sę4ڦ¢¢Bš÷ōō”ę=<>> iT‹C';;PZZ*…"ŗ¦*¦ųśś¢  ¢(6éduĒŽŲ“i~ųįØÕjœ>}÷ŻwŸŃżųųų øøøŃ²āābiØąövąJdˆŖQ·6į¦Ł&'{0cĘ ųūūćĖ/æŒ7—/_–:7½téīŗė.”””Š?’ü3ķ(0YYY 3¹’ššp8::āĒ„(Š(//ĒĆ?Œ’żļ(--…»»;<<}:ī¼óNTVVbóęĶøķ¶ŪąļļW^yēĪĆSO=…U«VaΜ9X²d ~ųį|õÕWXŗt)Ž’}TWWC„Rįż÷߇———Ōl†Č’ŚRēH¦7ŚPE79pą @Ą€ėµyŻmg½utė;‰¢ųŠ­/µžaĘś‡0¶ĢVŪ~žŃ2<ūā"mšŃ i’n“ē6pČpBDQÄ’VÆĘĀW’ŽQ—Õ&²³³qĻ=÷ąąĮƒ¶. Ł1™L @͵I7_ym¾@ÕµŪŗyŻzµźõ&õ&³±†ukö8ŹL{˜  ˆģ """""źÖģ½É ĒNU‰ˆˆˆˆˆ‚C‡ŁŗD‚u; DˆˆˆˆˆˆˆØŪa BDDDDDDDŻ"""""""źvˆQ·Ćaw‰ˆˆˆˆˆģHEE>ūģ3ģŚµ •••ÉdčŪ·/}ōQŒ;ÖÖÅ#ź4XC„ˆˆˆˆˆČ޼óĪ;ČĖĖĆ’ū_üńĒŲ¼y3ī¼óN$$$ ¾¾šöŪo#99٬żµf]¢®„5Dˆˆˆˆˆž{we• ü©ŹžBذH@@ö% €l:ąTEz“§[Q‡n[9j{ŗŚķiĒö0­v.ćŲ"¶bc7‚‚ˆ ²Č0€@H­’ŹRI½ļļ¤ŠJe«„@aźū9ē=y·{ßū^ņOī½/ЉģŲ±CO>ł¤$I!!!š1c†f̘į¹'''ĒļśŚr/šcĀčDśöķ«åĖ—ėōéÓM^_²d‰233õ»ßżN?žø$iŻŗuš;w®f͚„łóēkēĪMŽ›­ &xźr¹\ŹČČP^^ž$iéŅ„š3gŽn¾łfŻtÓMZŗt©LÓ t—M"€Nä7æłŹĖĖ5sęL-X°@śÓŸ“gĻĻõŋ+>>^O<ń„ž~śiUVVź™gžŃ“O>©U«ViΜ9śżļßä½-Ł·oŸV®\©wŽyG+W®ŌŪoæ­Ć‡ėųńćī I"ЉōģŁSo¾ł¦Ž’}ŻtÓMŹĶĶÕĀ… õŲc59Z#**J6lŠŠ”C%IcĒŽUnn® ĆhÓscccåp8ōŃGéĉŠ‹‹Ó³Ļ>«>}śŗK€&±†tB}ūöUß¾}uė­·źČ‘#ŗżöŪµcĒ;¶Į}†ačå—_Öʍ.§Ó)ImžźrŁe—éÕW_Õū￯eĖ–I’n¾łfŻu×]²Złæx\zD “KOOWbb¢JKK]Ū°aƒVÆ^­wß}W ŹĪĪւ š¬Ējµ69b·Ū\æāŠ+ōÄOH’Ž9¢Å‹+55U7ÜpC »h„˜:‰ćĒkƌśüóĻUUU%I*//×kƽ&§Ó©ŒŒ IRXX˜'±ŪķŠU\\œŖŖŖōŽ{ļI’***ŻŪ­[7†”¬¬,IŅß’žwĻč5kÖč7æłŖ««%ÕMŻIHH`QU\²D “读·ž|ņI}ųᇺį†4yņdŻzė­:zōØŽxć ϧxg͚„ßżīwŗūī»5}śtÅĒĒė†nŠż÷߯[o½UC† Ń}÷Ż×čŽųųxŻ}÷ŻZ“h‘ęĶ›§ŌŌTEFFŹ0 ]sĶ5ŠŽŽÖܹs5{ölŻvŪm9r¤fΜčnšdig‹WŁPÆ-\R„¤HIQ’¢%ÅŌļ»#½īqßašę#ī mē; ©ĶDŁW’¼D‹Z,Ć0dø †K†aČ4Ī톫žZݾišśŪņåzšŃßø·?‹Åņ¼¤*IÕõ›{æ¢~æ\Reż±{ß}ŸSR­×&I¦×ę7Fˆ€ C ‚:" čˆ€ C ‚:" čˆ€ C ‚:" čˆ€ C ‚:" čˆ€ C ‚Nh ĮŖŖŖJoæż¶ēŲb±(**J=zōŠØQ£”””č&žč,]ŗT‘‘‘ŗóĪ;Ż\ā!fµZ5tčP 4H]ŗtQNNŽV®\©'NŗiĶɓ'µtéRUTTœW™‰'jÜøq~ü0B,44T&Lšļßæ_›7oÖW_}„Ūoæ]!!!nāwģŲ±)3dȐ@æ ~$Dą3tčP8p@%%%*((ĶfSuuµvīÜ©cĒŽ©¢¢BŃŃŃJKKSFF†¢¢¢$I‡Cß~ū­ņóóåt:Õ½{w?^‰‰‰ŖØØŠ;ļ¼£ÄÄDĶ›7Ļó¬7ß|S¦iź?žć?<÷Ųl6„§§kūöķ ÓŌ©SUQQ”-[¶H’ʏÆžżūK’œN§vļŽ­~ųAåå劊ŠRÆ^½4vģXEDDČ4M½öŚkJHHŠäɓµiÓ&•––*!!AW_}µRRR“jÕ*åēēK’ŽyēeddhōčŃŹĖĖӎ;TXX(‹Å¢””M˜0A Ķ–ń2ÓZæłÓ>tNL™€KPrr²$Én·Ė0 ­ZµJūöķ“ĶfÓäɓջwo÷sйˆĄ%Ę4M={V’ÆĀĀBIRBBBƒūāć敟Ÿ/»Żī9ׄKĻžUW]„«®ŗJ’Ś“Xitt“BCėž\ Wee„āćć%IQQQ*))‘ĖåņŌY\\¬O?ż“A”””²ŪķJMMõ»ŪoµZ­źźjÕÖÖ68†”­[·źčŃ£ŖØØšDīžńGyyy«żf³ŁŚÕ>üųˆĄ%f’žż²ŪķŠ‹‹SJJŠgŹKIIIƒūŠ‹‹%I111žseeežżŻ»wkēĪ7nœ  ©.1 CV«UÅÅÅŖ­­m÷¢­ī禤¤höģŁŚ™™™Śææśõė§ &($$DĖ–-SMMßuøĆ!ś Į‡@¬¶¶V›7o–iš***R~~¾BCC5eŹIuSB’’’tśōimÜøQ=zōP^^ž ”””¤““4™¦©ųųxūģ3uėÖMĒŽSDDD›Bo©©©JNNÖ©S§ōĶ7ߨgĻžžEV ĆŠM7ݤČČHæźrHŁ»wÆŅÓÓ=mr8śį‡tōčQO[srrŌæ’Fe|@õ§ß¼D Ą ĆŠžżū%I‘‘‘źŪ·ÆFķYXÕjµjÖ¬Yśī»ļtüųqegg+&&FƆ ÓčŃ£eµÖ}/ćśėÆ×·ß~«¬¬,9N„¤¤čŖ«®ņŒ„øęškōĶ7ß(77Weeeŗśź«õõ×_ū½čŖ/‹Å¢™3gz¾2“••„°°0„¦¦*##Ćļ0DŖū\nII‰²³³­!C†čŌ©S:uź”ŹŹŹ4räH >\_żµvģŲ”¾}ū6*ćˆųŪoN–v–±x• õŚĀ%EHŠ”%)ZRLż¾ū8Ņė÷ż¦i>čĪŠv¾ė94µ¾Csk>¢ģ«^¢E-®ū2‹Ėaøź¾˜bœŪ7 Wżµŗ}Ó4õ·åĖõࣿ po?~‹åyIU’Ŗė7÷~Eż~¹¤Źśc÷¾ū>§¤ZÆM’LÆĶoÄa čˆ€ C ‚:" čˆ€ C Čµ×^«¹sē6ymĮ‚ŗöŚkŅ®ĀĀBeddØ¢¢"Żxˆ@'ćp8”ŻąÜńćĒURR覗 čdʍ§O?ż“Į¹uėÖi̘1npÉ €NfŹ”)śģ³Ļdš¦ēÜŗuė4yņä÷­[·NsēĪÕ¬Y³4ž|ķܹSRŻh’iÓ¦iõźÕš7ož¦OŸ®„K—J’²³³5aĀO.—KŹĖĖk±NąRC Lzzŗ¢££µoß>IŅ‘#Gd±X”žžī¹§²²RĻ<óŒž|ņI­ZµJsęĢŃļ’{IRhh؇ ōĮč…^ŠėÆæ.»ŻŽās[ŖøŌˆ@'tŻu×iķŚµ’źFm̘1£ĮõØØ(mŲ°AC‡•$;V¹¹¹2 C’d†ęĢ™#IŻā3[«ø”„ŗ€ŽwŻu×é®»īŅĆ?¬Ļ>ūLĻ=÷œjjj<× ĆŠĖ/欍7*<<\N§S’L³‰õģ[­ÖVƒ ź."Š „„„)55U+W®TTT”z÷œĻõ 6hõźÕz÷Żw• ģģl-X° Õz}ƒļi4ķ­¦Ģ@'uŻu×éõ×_o4]FŖ 2bcc§ŖŖ*½÷Ž{’¤ŠŠŠėģÖ­› ĆPVV–$éļ’»¬VėyÕ tRÓ§OWaa”žå_ž„Ékńńńŗį†t’ż÷ėÖ[oՐ!Ctß}÷µXg||¼ī¾ūn-Z“HóęĶSjjŖ"##eF»ėĮŅĪ2Ʋ”^[ø¤I‘’¢$EKŠ©ßwGzŻć¾?Ā4ĶGŻŚĪw}ˆ¦Ö‹hn ‰@”}õĻK“č”Å2 C†Ėaød†LćܾaøźÆÕ훦©æ-_®żm€{ųń³X,ĻKŖ’T]æ¹÷+ź÷Ė%UÖ»÷Ż÷9%Õzm’dzm~c„:" čˆ€ C ‚:" čˆ€ C ‚:" čˆ€ C ‚:" čˆ€ C ‚:" 脺¬ŖŖŖōöŪo{Ž-‹¢¢¢Ō£G5JIIIžkK—.Udd¤ī¼óĪ@7»Ct¶÷Į˜ÕjÕąĮƒår¹TXX؜œżšĆš1c†zõź%Iš8q¢BBBŻŌv9yņ¤VÆ^­ū·Sttōž}Š9ˆ@€…††jĀ„ žćżū÷kóęĶśź«Ætūķ·+$$DC† t3ŪķŲ±cĪż˜ß\b†Ŗؤ¤D²Łl¦˜äååiĒŽ*,,”ÅbQJJŠ&L˜ „„IRQQ‘¾łę*22RcĒŽÕŽ;TVV¦Ÿ’üē2MSƽöš4yņdmŚ“I„„„JHHŠÕW_­””IRuuµvīÜ©cĒŽ©¢¢BŃŃŃJKKSFF†¢¢¢$I'NœŠwß}§āāb™¦©¤¤$eddØgĻžZµj•ņóó%Iļ¼óŽ2224zōčFļćp8ōķ·ß*??_N§SŻ»w×ųń敘˜Ųź3€ö`QUø%''K’ģv{£kÕÕÕZ»v­ŠŠŠ4uźT3F¹¹¹Zæ~½$ÉåréÓO?Õ©S§4pą@3F”ĆįÕZ÷g Åb‘ÕjUee„¶nŻŖ¾}ūŹf³éģŁ³Ś°aƒ$É0 ­ZµJūöķ“ĶfÓäɓջwo‹Å¢źźjM:U 2 Cżė_e·Ūåt:UPP ¢¢"„¤¤hņäɒ¤žżū«°°Płłł:uź”dš¦*++UVV¦””͚5K””unvļŽ]įįįž6ø×ń–——§āābõģŁS’ź‚ ƒ*77W=zōhń@{šŪ—Ó4uöģYIR|||£ė†ahėÖ­:zōØ***<ቻlEE…$)..Īs>&&F””” ī•źÖ/qO³±Z­ŠŽŽVuuµjkkU^^.IžėnńńńŹĻĻ—Żn—ĶfÓ“iÓ“sēNmŻŗUR]ˆ3pą@M˜0Į3"„%īētéŅÅsīŖ«®ŅUW]å9>ßg¾Dą³’~ŁķvÅÅÅyÖņš–™™©żū÷«_æ~š0a‚BBB“lŁ2ÕŌŌH’gmļé6‡Cµµµmś²‹; ())ip¾øøXR]Č"ՍéßææŖŖŖtęĢķŁ³GĶfSzzz«Ļq×SVVę9·{÷nķܹSćʍө”CĻū€/°ŚŚZm޼Y¦iŖØØHłłł Ք)Sš¼ß|8żšĆ:zōØ"""TSS£œœ]vŁeŠŠŠRAA6oެäädegg·y$EZZš’’’tśōimÜøQ=zōP^^ž ”””¤““4åēēkżśõźŃ£‡  Iž)2īé1ī©-{÷īUzzz£Ēf³)>>^'OžŌöķŪÕ„KķŻ»WV«U}ūöõė@[ˆ@€†”żū÷K’"##Õ·o_=ڳ°ŖÆ!C†čŌ©S:uź”ŹŹŹ4räH >\_żµvģŲ”¾}ūźŗė®Ó¦M›tšąAuéŅEćʍSaa”\.—ßķ²Z­š5k–¾ūī;?~\ŁŁŁŠ‰‰Ń°aĆ4zōhY­VõčŃC#FŒŠ÷ßļYŌ5>>^S§NUjjŖ§½%%%ŹĪĪVttt£@$$$D×_½¾żö[eeeÉét*%%EW]u•bbbÓź3€¶²“³ŒÅ«lØ×.)BR¤¤(Iђbź÷ŻĒ‘^÷øļ0Mó‘@w€¶ó]“Ā÷ø¹s*ūźŸ—hŃC‹e† —!ĆpÉ0 ™Ę¹}ĆpÕ_«Ū7MS[¾\>śŪ÷vū9N½õÖ[Š‹‹ÓüłóŻ1‹Åņ¼¤*IÕõ›{æ¢~æ\Reż±{ß}ŸSR­×&I¦×ę7Fˆ@'“zõjiĈŠ‹‹Svv¶$±ŽP@:”+ƼRŪ¶mÓĪ;år¹«ŒŒ 92ŠM. "Š uķŚU×_} ›\²ųX3:" čˆ€ C Ä½÷Ž«W^y„Ék/æü²ī½÷Ž6ÕWXX،Œ UTTH’ž~śi͘1C†a“©žŒŒ 8pą¢ōw›}Ūߎ÷FēD ÄģŁ³µfĶ™¦Łą¼išśä“Otć7¶©¾ÄÄD­]»VQQQ2 C’ųĒ?ōŹ+ÆČj½ųJžįŠwß}wQź÷~ot^"ŠI\{ķµ*))ŃīŻ»œßµk—JKKuĶ5ד©>«ÕŖäädY,UWWĖår)>>> ļ–““sŃź÷~ot^"ŠIDFFjśōéZ½zuƒó«WÆÖŒ3)Iڱc‡īøćŻrĖ-ŗóĪ;=ʁtżõ×ė¹ēžÓ]wŻÕ`źČÆżkIŅ=÷Ü£Ÿ’üēzūķ·<ćż÷ßׯw߯būŽ?®iÓ¦iõźÕš7ož¦OŸ®„K—z®/]ŗTsęĢŃĶ7߬›nŗIK—.•išZ²d‰233õ»ßżN?žø$iŻŗuš;w®f͚„łóēkēĪ­öOse|ė÷2³eĖ-X°@sęĢŃüłóõõ×_ūõ>ø“ˆ@'2{öl­_æ^N§S’ät:õłēŸköģŁ’¤’’=üšĆZ“h‘>üšCżēž§~ųaUVV*<<\v»] zį…ŌūōÓOKŖ -ęϟÆ+V4XK䟒ü§ęĶ›×bŪBCCåp8TPP >ų@/¼š‚^żuŁķvķŪ·O+W®Ō;ļ¼£•+Wźķ·ßÖįƇuüųq-^¼Xńńńzā‰'ōōÓO«²²RĻ<óŒž|ņI­ZµJsęĢŃļ’ūŸŻRßś½é‘GŃāŋõ÷æ’]?žø~żė_ėģŁ³-¾.}"ЉŒ1BIIIśź«Æ$I_~ł„ŗuė¦aƆI’¶mŪ¦īŻ»kÜøq’¤qćĘ)11Q;vģÅbQUU•ęĶ›§ŲŲŲfŸ1mŚ4¹\.mŚ“I’tčŠ!ų5%Ē0 Ķ™3G’4xš`Y­V>}Z±±±r8śč£tāÄ ÅÅÅéŁgŸUŸ>}Õ„ 6h芔’¤±cĒ*77·ÅÅ^ŪSF’¶oß®ŌŌT=Z’4|ųp„„„iĒŽ-¾.}”n c¹W>}ŗÖ¬Y£Y³fy®*77·Į9Ir8’¤°°0uéŅ„Åś­V«ęĪ«>ų@“&MŅŖU«tć7*,,ĢÆöy‡-V«U†ač²Ė.ӫƾŖ÷ß_Ė–-“$Ż|óĶŗė®»-āj†^~łemÜøQįįįžŃ0¾‹Éžow%&&68— ¢¢¢ß—>čdfΜ©„K—źäɓھ}»žß’ūžkÉÉÉŗģ²Ėōī»ļ6*—““ć÷B¢sęĢћo¾©'NhķŚµśß’żßón÷W\”'žxB’täČ-^¼X©©©ŗį†Ü·aĆ­^½Zļ¾ū®”­ “Xw{Źøū«øøøĮ¹āābuķŚõ¼ßÅ”čdŗu릌Œ ż×ż—®¼ņJ%%%y®]yå•ŹĖĖó,(zņäIĶ›7O„„„mzF||¼¦OŸ®ßüę74hl6Ūyµy͚5śĶo~£źźjIRĻž=•ąĮęi£ŻnWll¬āāāTUU„÷Ž{O’<‹ 6„µ2Žõ{7nœ < ĻīŚµK;vģ…łĒĆEC ŠģٳµuėVĻbŖnńńńZ²d‰ž{ī9ŻtÓMśå/©Ÿżģgķśœīüłó•™™©¹sēžw{ƹęEGGkīܹš={¶n»ķ69R3gĪ”$͚5KæūŻļt÷Żwkśō銏× 7Ü ūļæ_·Žz«† ¢ūī»ÆŁś[+ć]æ·ÄÄDżńŌ³Ļ>«9sęhɒ%zöŁgM£ĮO{>Ŗlńڤŗi7ī-\R„¤HIQ’¢%ÅŌļ»#½īqßašę#ī mē»CSk24·NC ʾśē%ZōŠb†!ĆeČ0\2 C¦qnß0\õןöMÓŌߖ/׃ž6Ą½}iÉĢĢŌc=¦üćÖłšc±Xž—T%©ŗ~sļWŌļ—KŖ¬?vļ»ļsJŖõŚ$ÉōŚüĘo, Ķ‡žūæ’[wÜqa~”ų­“ɛo¾©Y³fiąĄš7o^ ›“ _™“É]wŻ„»īŗ+ŠĶĪ #D@Š!A‡@tD@Š!A‡@tD@Š tąĒāōéӁn€ĀtD@Š!A‡@tųŹ ˆÓéԚ5kŒŒT×®]5xš`EGGŗ™ēż^‹EźŚµ«  øøø śüžóŸ²X,š5kV »—0Fˆ@€Y­Võė×OżśõSzzŗ"##•››«-[¶Č4Ķ@7Ƒ3gĪč£>RUU•_ļÕ§OEEE)77W_~ł„ :üY@[1B,$$DƆ 󛦩uėÖ©¬¬Leee|DE[:uŖ]ļ•““£}ūöi×®]š1c†¬ÖÖ’ŽßgmE —Ó4=#CÜ”AMM²³³•ŸŸÆŹŹJEDDØ{÷īżōS]qÅ8p _ļÕÆ_?żšĆ*++SQQ‘ŗvķŖ³gĻźąĮƒ*--•ÅbQbb¢§ĶĶ=«„2n‹E§NRff¦***§įƇ+11Q’Z­£  @YYY²Ūķ2MSńńń4hRRRüž÷h­Sf Ą\.—öķŪ§}ūöiļŽ½śź«ÆTUU„””uéŅE¦ijÓ¦M:|ų°z÷ī­ &hŠ AŹĶĶÕÖ­[%I†ahÓ¦MŹĶĶUŸ>}4dČiÓ¦MŖ©©ń«‹Å"«ÕŖŖŖ*ķßæ_=zōP·nŻTZZŖ;vHRƒuMƌ£ž={¶é]ććć%I‡C555Śŗu«ģv»F­AƒéōéÓŚ¾}{³Ļj­Œ›a:|ų°ś÷ļÆĖ.»LÅÅÅśöŪoår¹Z­£¦¦ĘsļčŃ£5f̆”]»vłŻ—­ÕĄc„˜aŹÉÉip®_æ~­ˆˆˆVėHNN–T÷ĒüčŃ£+Ć0ōÉ'ŸxŒ¤¤$ĻˆnŻŗ)22²Ķļ*Ս| Ó 7Ü Ó4e±Xd𦲳³e·ŪeF³Ļj©Œ{Da3fŒ¢¢¢$IEEE*..VQQ‘ŗuėÖb.—K¦iŖŗŗZJLLŌ¤I“"©ntIk}Ób<°°°0͜9S’”­ز²ŅóĒsee„$Én·kĖ–- ʆ„„Čįpx‚ļÆŅ :TC‡•$8q¢Õ:܁HHHˆgźˆÕjUdd¤jjjär¹<E{˜¦©ŅŅRIR—.]d†233•——§ŖŖŖ Č6·˜¬æeBCC=aˆ$ÅÄÄØøøXUUU­Ö©Ń£G+;;[ū÷ļ÷ōCŸ>}4|ųpæž=’““[¬Ćb±tŲļڇ@.!żśõӑ#G”——§3gĪØ[·nž#))I“&Mj²œūĖ-‡ĆsīŠ”Cśžūļ5xš`%$$“ZĒ…väČ9ÅÄÄ(11Q999ŹÉÉQĻž=5lŲ0Y­V­]»VµµµĶÖqōčQæŹŌÖÖŖŖŖŹ3Ŗ¤¼¼\’åW½zõRÆ^½T]]­’’>|XGU×®]żś÷h­Ž“““€üąø„„„„čŠ+®Š®]»“oß>M›6MIIIŠWaa”öģŁ£””Ļ¢ž¦ijŹ”)źŚµ«ŗté¢3gĪčąĮƒŠŠŠŅ”C‡d±X”––¦ˆˆˆVė÷»’tųša„„„y*õå^Å=2¤°°P!!!=z“$yˆŹŹJåēē+//OaaaŖ­­Õɓ'Õ«WÆFĻņ§ŒT7ć»ļ¾SļŽ½URR¢’’EGG+))I………-Ö„;vØk×®žśBCėž|ŽŒŒōėßĆn·kūöķĶցĄ#€KLļŽ½•““#»Ż®£G*==]'Nō|ÕäŲ±c Urr²®øā O1aĀeffźŲ±cŖ©©Qbb¢†źłܟ:ü‘žž®ņņr?~\‘‘‘Ķ"Žk£„‡‡Ėf³iąĄž…Uūöķ«ĀĀBŹįphĄ€źßæævķŚ„ļæ’^6›­Ń³ü)c†"##uŁe—饁ŖŖŖRrr²FŒ!«ÕŚj×\s.æür;v̳Šj—.]4zōhĻ“¢Öś²k×®­ÖĄjϤ%‹×&Յ*ī-\R„¤HIQ’¢%ÅŌļ»#½īqßašę#ī mē»ÖCSk?4·D ʾśē%ZōŠb†!ĆeČ0\2 C¦qnß0\õןöMÓŌߖ/ׂŸŻąŽ~üŗwļž¼¤*IÕõ›{æ¢~æ\Reż±{ß}ŸSR­×&I¦×ę7>» ‚:¬!~śč£Ż„@üŌÜā”~|˜2‚:"ŠIÄÄÄh޼y²X,m*©yóę)44“Į~ µÖ޹sē*666 mď:" 蹕čDLÓTŸ>}4hŠ EDD芔C:pą€$)%%EƇWhhØjkkµ{÷n={¶ÅśRSS5lŲ0…„„Č0 ķßæ_yyyī›9s¦¶nŻŖĀĀBuķŚUÓ¦Mӆ TXXؤ¤$M˜0Aüq³õ%&&jāĉ:qā„’““µyóęõ÷ļß_Tmm­Ž9čnF'Ąčd¢¢¢ō駟jćʍ-I:}ś“Ŗ««Õ­[·fėźŽ½»***tęĢIRaa”‡RRRŻ{śōiO Ņ­[7:tČSwrr² Z­/$$D999Ŗ©©iPw·nŻd·Ūe·Ū%IG t7£`Ź t2¾‚ÅbQdd¤bbb4sęĢ×ĀĀš­'""BÕÕÕ ĪUWW+""Bƒ ҰaĆ$IūöķÓ±cĒ4tčPY,ÅĘʼĉ:tؤŗ"»wļVĻž=›­O’ ĆhŌvI —Óéō{ļķE A ŖŖJeeeśģ³Ļ]kj ŒŌ0¬p‹ˆˆPUU•Nœ8”¬¬,Iuė–H’ĖåRZZšģv»LÓTyy¹l6›œN§*++[¬Æ%N§Sįįį Źē‹)3 ć™Ę£ė®»®AŠŠT™čččkDGG{¦Ż˜¦é C¤ŗi3—_~yƒ)1ōÜßZ}Ķ),,T\\œāćć%Iżśõkš\ =!AĄétjóęĶ1b„ĀĀĀdš¦<(§ÓŁā‘-[¶hŌØQž/Ól޼¹Ń“·‚‚„§§kļŽ½’¤³gĻjšąĮž‘$-Õ×\$©¬¬LūöķÓäɓår¹tčŠ!ÕŌŌ°°*ĪK{~{,^›TŖø·pI’"%EIŠ–Sæļ>ŽōŗĒ}„išŗ3“ļ’Ō7õ?÷Ķżo~ ʾśē%ZōŠb†!ĆeČ0\2 C¦qnß0\õןöMÓŌߖ/WZś ÷6šćwė­·>/©JRużęŽÆØß/—TYģŽwßē”TėµI’鵳)3 čˆ€ C ‚:|eü4eŹ”@7@a„:" č0eü”’’č&č ŒA‡@tD@Š!A‡@tBŻų±Ų³gO › ƒˆ€Ÿŗwļč&č L™A‡@tD@Š!A‡@Ąńūß’^gΜ‘$9-\øPeee’¤³gĻź‰'žh¶¬Żn×3Ļ<čWh—£GźЁš½ēķ·ßÖĮƒżŖÆ¼¼\K—.õūłgΜŃ/~ń -Y²DK–,Ńžš­\¹²ĆŽĻåréWæśÕ…ėĄ‹„@pA ūģ3ÅĒĒ+??_ééé2MSÅÅÅ*--Ճ>ØŠŠŠVŸ»råJ9rD~ų”n¾łę&ŸŅ ŒŻnWaa”&NœØ-[¶ØøøX‰‰‰r:zķµ×¢ØØ(JŖ †Zkkee„^zé%=öŲcŹŹŹŅśõė«ŠŠ UTThŃ¢E-‹E½{÷Vaa”‡Žzė-………©ŗŗZŻŗuÓüłóµiÓ&ķŻ»WV«U‰‰‰ž÷>räˆ~ņ“ŸČf³éĢ™3zć7ōŲc)222Šæ^ē"€ āņĖ/×Ń£G%IĒ×Ų±c•——'I:|ų°  ķŪ·+$$D .ŌĀ… %I»vķjPρ”——§_üāZøp”xą]~łåڶm›¬V«ī»ļ>-\øPQQQڶm›,‹ŹŹŹtĒwčį‡֗_~©ł—Ń=÷Ü£„„żšĆ~=÷ꫯVÆ^½tĖ-·4ū,__żµ¦L™"IŗęškōÕW_I’¶mŪ¦īŻ»kįĀ…śéO*‡Ć!I~µÕ›ÅbQQQ‘īøć-\øP]ŗtQNNN‹’gĻžÕ¾}ū4`ĄÅÄÄ聊=÷Ü£E‹)''GEEE²X,²X,ŗ÷Ž{¼÷“iÓōõ×_K’6oެɓ'K’"""żėuŽ!ø ĀĀĀŌ­[7}’ż÷Š•ÕjUBB‚²²²”œœ¬ššpåēē+;;»Å)'OžTļŽ½/((PÆ^½<Ē6›M§OŸVrr²RSS%ÕMļˆUbb¢$)**JN§ÓÆēśó,o.—KŪ·oW||¼6mŚ$I*..Ö¬Y³TXXØīŻ»7(ļÖZ[}Łl6Y,IRlll“÷äååéOś“,‹bcc5ž|„¦¦ŖøøXĖ—/WLLŒ,‹JKK=å½Ūē6jŌ(­ZµJÕÕÕŚ·oŸ}ōQIź#DD̐!C“nŻ:Ļz! hpl³Łäp8“`Į‚åģv»g?--M_|ńE£ŗSSSŒŽČĶĶUzzŗ_ķjī¹¾ ĆšūY;wīŌšįĆuĖ-·xĪ­\¹R;vģPbb¢ $I¦i*77÷‚ö»ĶfÓC=Ōčü¦M›4pą@]{ķµr8ŹĢĢ”iš’$«õÜ$÷{‡„„(##Cļæ’¾.æürĻԜ‡~ų‚¶’b`Ź ą‚}śčłēŸ×‹/¾Ø_|Q™™™;v¬ ĆŠ+Ƽ¢W^yE.—Kćʍó«]ž<7))IgĻžÕ[o½å׳6lŲ ńćĒ787~üx}ńÅŗņŹ+•——§_|Qo¾ł¦āćć=AÄÅ4lŲ0}ūķ·zżõ×õüCcƌъ+š}oIš2eŠ6oŽģ™ TSS£Å‹_ō¶w4K;ĖX¼Ź†zmį’"$EJŠ’-)¦~ß}éuūžÓ4 tgh;ß?źšś#ƹ?üQöÕ?/Ń¢‡Ė0 .C†į’a2sū†įŖæV·oš¦ž¶|¹ę’ōēīmąāĖĻĻ׊+“hŃ¢©ÆGĻKŖ’T]æ¹÷+ź÷Ė%UÖ»÷Ż÷9%Õzm’dzm~cŹ hŅŗuė“gĻżō§? tS:hҌ34cƌ@7ć‚` tD@ŠaŹ  C9sFO=õ”zöģŁąüģŁ³5hŠ @7ÆEåååz÷ŻwuĻ=÷tH}oæż¶ĘŽ«+®øā‚>»&?OEÆæ¢ŠīŻ=ē" VTĘ8Ł’ł‘ę’¤Mõ9ęØbū6%Üz{ƒóF…£]õ]ŠDĪf³é‘G~|ķŅ„K‡…!ūŁai=•tWćņ~‡55*łą=%,øC’d±4ž0­5:¦S„!ą"zę™gt×]w)%%E§NŅ’żß’é‘GŃ{ļ½§ŅŅRIR||¼næżvmŚ“I{÷ī•Õj•Żn×O~ņŁl69sFo¼ń†yä-[¶Lååå²X,ŠˆˆŠwީÇkżśõŠUEE…***“hŃ"…††6łov»]/½ō’{ģ1effjÕŖU²X,ŗńĘŒnq8zė­·¦źźjuėÖMóēĻ—ÓéŌkƽ¦EEE©°°P’”••„Ļ>ūLńńńŹĻĻWzzŗLÓTqq±JKKõąƒŖ²²Ņó쬬¬&ß!,,¬Mżm”—©ų·”¼p‘*¶|#£¢B]®”²OW+$1IŃWŽ?÷īŸ}¢šĒTöéjE $W¹]ö>”QV&ĆY­¤;ļ’Q]婯śP–Ź7|&É¢Ųé×)<½ ½Ś„@Šįņņņ“dɒē~õ«_iāĉںu«fĻž­-[¶hҤIھ}»BBB“pįBIŅņå˵k×.Y,Y,Ż{ļ½Ś±c‡¾žśk͟?_›7oÖäɓµmŪ6Y­VŻwß}’¤÷Ž{OŪ¶mSrr²ŠŠŠt’ż÷Ėb±héŅ„ŹÉɑŻnoņ9£Fjņ2335~üx9Ņ¢øÅÄÄ聚’įPQQ‘8 īŻ»kīܹ’¤§žzJRŻh‹²²2żēž§\.—~łĖ_ź©§žRbb¢^{ķ5żšĆźī5ŻÅb±4ł-M9Ŗ9™«Ā„/zŽ£Ē^„ˆĖœ;µJŽż«*¶n–«¤X±’:³Ałč1WŹu¶P±’:SĪ£92ŹŠū÷ŸK‹JŽ_.ē‰c M9×Fē”lEŹPäƒå*³śW®ĶDĪf³ińāÅĪ7NüćuĆ 7hĻž=züńĒõÉ'Ÿ(;;[ƼņJ£ūŻ!ĮØQ£“jÕ*UWWkß¾}zōŃGµfĶõźÕ«Į3OŸ>­äädŁl6Ļ”ŲŲX9Nåēē7ūœ¦Ģ˜1C+V¬Š–-[tė­·6øV\\¬åĖ—+&&F‹E„„„r:*,,llŲl6Ļ~jjŖ$)$$D±±±JLL”$EEEÉét6ه¾ļŠ’¦¦Ģåe Žc¦]«Ā’yN]±X­ ķž*Õ?ß%ÓYÓązōՓUöéjUīÜ®ø™7śÕ§—ĄE”^½ziķŚµ0`€ĀĆĆe³Łäp8“`Į‚÷n޼YVkŻĒQCBB”‘‘”÷ß_—_~¹ĀĀĀ”ššŖœœĻż¹¹¹JOOoöŁĶ=§9Ē×O~ņ9rDėׯo°¾Ē¦M›4pą@]{ķµr8ŹĢĢ”išJLLTAA$É4MåęęŗĖĻ1 •}ŗZ‰?łwŁ×üSI’~·'š$Y$™.æ««ĶĖSüsä<~\ŽMtk‹ˆ:\^^žž}öŁēʎ«iӦ韫ÆÖsĻ=§Ē{L’”‘‘”Ƈė„—^ņ¬‘qŪm·5ŖsŹ”)zōŃGõÄOxź;tčgÄGLLŒĘ§Ć‡7٦ęž×äżUUUśĖ_ž"«ÕŖkƽ¶ĮµaƆiٲe:zōØ¢££5fĢ­X±B÷Üs^}õU½ųā‹ŠŒŒT||¼LÓģ°~5 CæśÕÆōĀ /“¹lłśµŠ2Lƒ‡Ø¶øHåė×ŖĖōõ\‰OPma‘J?|_Q£Ē“ZŸY]„¢’{S«U1®ī°w¼X,ķ,cń*źµ…KА))JR“¤˜ś}÷q¤×=īū#LÓüń-?  Ń{Mżń×Ü„(ūźŸ—hŃC‹e† —!ĆpÉ0 ™Ę¹}ĆpÕ_«Ū7MS[¾\óśó÷vpĖĻĻ׊+“hŃ¢@7ē”GĻKŖ’T]æ¹÷+ź÷Ė%UÖ»÷Ż÷9%Õzm’dzm~c„ą’·nŻ:ķŁ³G?żéOŻt"€Kތ34cƌ@7ˆ5Š AÆćZń::¹č @k!‚øŌuų ¾2lĻž=npэ1¢#Ŗ¹hKoœO bJ²\¬†ĄEżaąŗSfĢföåĒyœüÉ Ś'°†ø˜.‰A*1ż8¾$:\t¦Ļ&ł7ƤĆ\Č"Ķ…"¾/H0@pk) ¹ ¹AG"Ķž¾”ĮĮlƵ –tō‘ęB‘¦F…˜b„Įȟ)3f eĪŪł|v×»AM5P­œoī„ą‚śĖŸ–ŗ ܉'“dÉ„„„yĪ >\’śÆ’覵źčŃ£Z²d‰xą <øCėĪĪĪÖʍõ’ńķ*āÄ ­X±BN§SN§SƇ׬Y³dµvĢxƒęŚwģŲ1=÷ÜsźŁ³§$)""B7ß|³zöģ©3gĪč©§žRļŽ½%IÕÕ՚4i’&OžÜØžĀĀBżļ’žÆRRRtēw¶Ų–’łŸ’QTTT“}µfĶ|XėׯWll¬***TQQ”E‹),,ĢSæaķ.+Iv»]………š8q¢¶lŁ¢āāb%&&źĄśüóĻÕ„KUTTČ0 ŻsĻ=Ŗ­­Õ[o½„°°0UWW«[·nš?¾$éć?֑#G.—Ė„3fH’JKKõ׿žUv»]UUUśÅ/~”ŠŠP½÷Ž{*--•$ÅĒĒ{śČmß¾}2dˆzõź%I²Z­ŗūī»[|ļĢĢĢ&ū{Ą€mjŸÆ^½ziĈڳg Š ’?®ŌŌŌ&’żēĪ«ĢĢĢG µuėVĶ;WŸžy£ėß’½Få99r¤¾’žū¶"¾y€oFpQMtd bžĒF ģŲ±czöŁg=Ē“'OVttt“÷^}õÕ*((Š-·Ü¢­[·Źjµź¾ūī“$½÷Ž{ڶm›’““UTT¤ūļæ_‹EK—.UNNŽ ä©gŪ¶mķ.+I_żµ¦L™"IŗęškōÕW_馛n’ÅbQQQ‘xąY­V½’žūڶm›&Mš¤xĄSžųƒŠŠŠtźŌ)ååå5 ²³³U^^®_žņ—²Z­zć7”““#»Ż®Ļ™åĖ—k×®] žš/..Vrrr“ż×Ü{ĒÄÄ4y’ŚŌ¾ØØØFuøūT’ņņņō§?żI’T^^®‰'¶ū÷ęwŽŃ‚ är¹š¼īp8Ō½{wĻqtt“Nņ?`TÓˆæ[‡9ß@¤µĘų†0e:XSSföīŻŪj¹‚‚Ļ(©n:ĘéÓ§•œœ,›Ķę™J+§ÓŁae].—¶oß®ųųxmŚ“IR]1kÖ,IRļŽ½=kuōčŃCEEE*..ÖņåĖ#‹Å¢ŅŅR9NĻŪ&ķ DLI–&Īł¾XSsÜ×\^ĒFż1ą —Ćį$™¦©“'Oz®FŻążŌŌTåääxĪēęę*==ŻÆśĻ§ģĪ;5|ųpŻrĖ-žs+W®ŌŽ;× ­§NR=“iÓ& 8P×^{­‡233eš¦ŅŅŅōÅ_ųŻ/6›M‡C ,höž#Fč£>j°^Ɗ+Ō§OŸfß»¹žnkū|åęęjļŽ½š5kVƒpĀ[MMM›ė-//Wnn®²²²TYY©3gĪč‹/¾Š“iÓ<÷ ¬—^zÉsĻm·Ż¦øø8Ļ=111ząōĮxF· 2Dcƌ‘¤&ß»¶¶¶Éž|xƒŃ1~pŒpoM­%ŅŌl’]Ҿ„u%ļļ …Ø.X ‘^æEHŠ”%)ŗžg¤×ī»™¦łtG¾€‹Ć4Ķ›;زƞy‰|ō· Um*¹īśŗi%gO©²¢\[¾\óśó‹Ó©häąĮƒŚ¾}{«ŸŠÅ„ÆGOJŖ–ä¬’éŽÆ”TU’Ó½9źĻ¹ļqŖ.D©UĆŁ&mhŃ1J>§„uB¼§Ēø|ök/ho@ |G‚x‡!:œ;Ģšž5R«†ŁAskŒt˜ö"Ķ [i.q5±ļ†°†€€r‡"„!—¦+®ø‚Ń!‡«‰Ķ{y ß`¤- ­ś­£ÖimUwR«ŗ&¤ž§„ž'#Dœ;! .ØÆ­ÖgóĪ|C·Y‡“#Uõn¤ļō˜ZƟ!õ/ķ^æÄ¢öÆeŠ0øąœ:ˆ8u. ńH|§Ō4õµ™ór>HsŸßõ DjėŸćŌ¹Q!„ §Z E|śŽń]KÄW»×éČ"Ķ-žźNyÜ!ˆ»±Ž/ňQ£õüŸŅm·ßīw™æ-_®£Fŗé@gįž²Œ;ń EÜĮˆ;Sš]S¤Cœo ā»°IS£C¬j82D>eD\4£F‘TrųkÄØŃ5zŒŖXżčޟŚõ%ā;R¤©0¤C¾:ÓŽi+Žå¼IµŖ.d ‘&)¼ž8LR„×~˜×u÷ĻpŸėīzB½ź©ß,j“tōēƒ@ÓL5’•Yߙ#ŽS`Ü£?|G‡Ōśœ÷-āTćŃ"īõE¼ŪŌ&ł•Cuį„ū§»±Ņ¹Å»įŽęūe÷=”jüeļÄźUæÅēY ć˜Müōż[¾©­øŌ0ąh)ühźė3īś¼ŸyŽ:2qÆāˆX|īń] %\Ó$ßγŖįwųįC¬"ąbijźŠļ(S ļ°£¹)2NÆ{}?ĆŪŚāŖmցˆ÷Z īPÄ{”‡š8ļż¾/ćī4÷'zŻSf,jü•š–¾VCH@Ē0[8ļŠxg¾\qń B¼ߑ!MB9ļP¤#æ2#5ž6ć=Ÿ'DM‡¾£H|;Ļ{aV©å0„€ Ļlbæ„PÄ{­ļ)2Õ:÷·æū>ļr¾õu˜Žž2#5œ2ć{ļ|£ę:ŅŠ¹‘!īµC¤ĘAHK#DĄ…ćūw¾ļe}G‰xO™ń!ā=‚Ä{ĮT÷ ß0$ Sf|GvxŸs7ŌŖ†ŸÅń½×­©"!õ/ķżU©a0¢fźVs|§ĻŌzżōžŚŒ;qłū~©ĘŸ0¤]IG­!ā;:Ä»ĮV5\ Ö·±M ѹPÅ{퉯Ép©h*ij‘Õ¦>æė}Ī; q q©ń4œęžŪf¹†ˆw0ā|x‡!VÆū}æBćŻQVūĀLSė…ų†šŠ~m šZK¤©ÅU½ƒ÷yCMij-ŅŃыŖś6Ī{Ĉ;ÜpŸó¾ß÷Ė4!:·˜jkk†zpqų3e„¹Q"ށHKAHS_¦ķ° Äķ|ß!5=JÄĶżBÖśŸ!Mt–w'55:¤=£DĄ…ÓR āžśŅŌh—/¢ŚTāūœ1r!¦Ģøć½ļĶūå¼G„x!¾aHS‹©žo B Ął¾h)¤hé3¼mŅŅWkŪķ|‘¦¾6ć{Ķlāœ÷h¼;Č{Õ¦5ó<Ā .®–¦ĻxÆ'źŠų~AĘTĖaH[žļ·Ž^C¤©¤)īšĆ÷3½–&6©å‘!„!\|­­'ālųĪi-iīg‡čØ0”„ĀŅĀĻęĀęęŚL(ĄÅcśq¾©@ĆŸŃ ž¬rŽįHG ­?~žĻˆB.¼¶Lci.‘?[«ó¼ttˆąĻč K+ū­-œJšĄ„©„š¢­_Œńēæķv!Ā…¶ŒąšwTÉÅl?šOkE{F{ų3ē¼]Ø@į|‚ B~|ü ,Śvthāv”ƅ¶Ōߞ¶Ž8ķ +ü-sA‚·‹(\Ø/Ś€Ąėˆć‚† Ž.lÜ.ZāėR%.õö€ę,š.’’ĄUÉĄ×ĮēA%tEXtdate:create2013-09-04T19:29:52+04:00§ŅZ%tEXtdate:modify2013-09-04T19:29:52+04:00ÖŠjęIEND®B`‚apache-couchdb-1.6.0/share/doc/build/html/_images/intro-tour-04.png0000644000175000001440000015622612332105522024721 0ustar00djcusers00000000000000‰PNG  IHDRD8cµ<£gAMA± üa cHRMz&€„ś€ču0ź`:˜pœŗQ<bKGDłC» pHYsÄÄ•+€IDATxŚģŻw\SW’šOĀ SĪVė@A­Z­«ŽŠV[ķP“­Ż£ÖڧģÓa[[±?»‡ŲŚŖÕ:j‡ÕŖø­Š¢ø *Š"›0“ßń^“$„ńyūŹ+7wœsī¹÷Fī7ēœ Y…ÄŽhąå#"""""""ćŌö.€1ö 80ŲADDDDDDŌ“Ł-`R—A käÅ QżUŪGHl`ØNś5) $DDDDDDDöS“†„ŪŲ48b«€‚¹t%6Ś–ˆˆˆˆˆˆˆģĒ\C]ƒķl±EpARł’j~®‹ņ‘åŖĢPWc¹„łT›µ Õ zHL̳4={ļ3Qca‹1@Ō–™šgIZµfĶą€„­=L½×$@b‹}!"""""""ĆŖÓ"DmāŻŲ2SÓęņ·˜µ‚Õi¢Ń~ĮČgSåe „ˆˆˆˆˆˆØī™ėŚb,¢’Ŗ 1•·Å­P5m ¢ż’™o, SłQŻ0ØŠrØ Qé­c*‰Žz ¶3ÉmÕ ‚hB¤zÓĘ#€éÖ(DDDDDDDT7,/D?ų”Қ– jD{;‰‘w«Øm@¤¦]cō!ZÓśĮh½[:žˆ%ˉˆˆˆˆˆˆČĮįƇŽ9sę ¤¤æżöMĄqūöķXŗt©N9óņņÄiKŹSŻz6ʒėĖ’ėĀ’2[Ā’¼,9W-I‡ˆģ§¤¤—.]‚——W­Ņ)++ĆĶ›7 ©”Ė‰ż– Ś1 ŒĒŒÅ!jŌņĮšŻÕŸ–yé·14bl 0mŚ“Į7ß|ƒ‹/ŠóĻ;‡ŌŌTL™2}śōĮīŻ»­“ŪÕsīÜ9»ä[SYYYˆˆˆ§©ń©«cģīīŽˆˆ,^¼žł'ąĢ™3hÕŖF%Ž““iÓß~ū-6lŲ€ÄÄÄåUVV†“'OźĢsssĆØQ£°dÉYT‰D‚aƆį‡~Ą”C‡Ąoæż†±cĒV ˆ“jÕ “'OĘ/æü‚‰',[mÖ±dæ,IG&“įńĒĒņå˱zõjĄ©S§ŠŗukL›6­J@ÄX:NNN6mŚ`ĈUnŌ-Ł÷ڰōxMž<7nÜĄ’ž÷?ØÕjœ={sēĪ…OµŅ™6m~łå±/\ø€ŠŠP<õŌS:‘'NT9nŚĢ•§ŗõlйėĖŅėŌ\™-aI^–œ«––™ˆģ+ <š@­Ņ(++ĆĮƒqśōitģŲŃŽ»DDµ't—1Ō›ÄŠ 0wØ[ fŖ¹±$0Rk½{÷ĘńćĒu‚!‚S§NįāÅ‹čŻ»7vļŽ’üē?øuė–/_.®óųćĆĒĒŸ~ś)$  „ČČHxzz"??ÄöķŪÅn7ļæ’>ÖÆ_=z@©TĀĶĶĶdšś]fĢåńĘo`Ļž=Ų¾}; {÷īxųᇱzõj$%%ś÷ļ~żśŁģ¾ģģl°}PÄĮĮ>ś(:t耼¼<üśėÆHMMµØ®Ģ„;tčP„‡‡ĆŻŻEEEHIIĮ¦M› 6ėPķŗ·$żóE»i= ¹y7nڶm‹²²29r¤Ę­$Ŗ£.Žqaa!† Ve¾›››N—į†Ę©TŠŁ³gcĈpuuERRŽyē\æ~ŻąśS§NEvv6~’żw‹Ė£V«”V««4Ķęė—ēĶ7ßĚ5kpžüy£e¶Ę:¦öĖ’t‚‚‚ “Éě}ĮŽ;šź«ÆĀÅÅElŚl*ņņr :“J™233«Ü›Ūƀ€Ģœ9‘‘‘pwwGVVÖÆ_eĖ–‰u-•J1mŚ4<ųąƒ×Yŗt©xL,9^QQQX³fĪ¼ćĒWYßT:!!!hŃ¢vīÜ©³ĪīŻ»ńč£"88uI3WžźÖ³©ėĀÜõeéuj®Ģ–/Kņ²ä\µ“ĢDŌšÉd2ōķŪr¹ĒG§NģŚžˆ€+W®ąśõė(((@PPBCCįäädéęR@Øģ05†ˆ°¼F_µ DHĢ|Ö.ø±§Īč÷ Ŗ1___xxxąĢ™3F×9uź|}}įķķ-ž‚$üŃ+‘HŠŗukœ:u €fģ†`Ó¦MX°`žüóO 0÷ßæ˜^ee%śōéƒ3gĪ`ėÖ­fÓŌg.ŌŌTńFBCCqėÖ-„„„ˆóBBB €¬EųC:886Ėzõź…'Ną³Ļ>CAA|šA‹ėŹ”ččhōģŁæżö,X€_żįįį7nœŃmŖ[÷–䔾č{ųį‡ˆoæżŸ~ś)”J%zöģiÓ:źö@»vķŠÆ_?̜9Ɔ Ć'Ÿ|Rķ4F ˜>}:fΜ‰¶mŪgÅ×ד&MĀgŸ}f°»œ©ņüņĖ/?~<ŗté™L†N:aōčŃUĘņ?~<üżżńÕW_-³µÖ±dæL„c¬ļuNN¤R©N—–ź”GгgO=z“Zū5oŽ<ćÅ_Dtt4~ųį¼ųā‹āq€§Ÿ~S¦LĮgŸ}†‘#Gbńāň‰‰ĮÓO?mńńrssC`` Š‹‹ńĮ`ēĪŲ¾};Žzė-øŗŗZœŽš=płņeż> Ė=<<бcGüšĆŲ½{76oތٳgC&“U«<–Ösu® sŒ]––Ł’će.Æźœ«¦Ņ!¢Ę%<<ŻŗuĆ©S§P^^Īī3DvP^^ŽS§NįŌ©S(((@yy9ŅŅŅ,śAO‹”V!ĘZˆč38©¶š¶‘˜˜6ThC;$…靬ŗ}³õåääˆėž={D@@®_æŽĄĄ@øŗŗāōéӐÉdčׯvķŚ%žĮ™’’‚-Z oß¾Ų¶mT*T*ņóó±eĖĶNJ$FÓŌgI/^ÄĄÅmĀĀĀpčŠ!tīÜYœ‚žł§¶Õg”R©DAA<<gggØ2fˆ5SW•••a’žżX²d Ž~ūm|ńÅÕ žhp€;õŖ‰īŻ»7ÜŻŻ±yóęj—§²²&LĄ’ū_ģŪ·pćĘ ,^¼~ų!Š©S'téŅ?ü°Ń“‡j•u,Ł/KÓY²d œœœ0kÖ,888`ļŽ½ųģ³Ļ0ž|Üŗu«Śåyį…šŲcį7Ž[@U§<:tĄÓO?:ĄĖĖ J„ā µŸŸ}¤¬ÆÆ/JJJĢ/į{B’ńÄĒŽƒT*EHH\]]ͦ#üćęę†ĀĀB1į»JXnČžżūńā‹/¢uėÖāI¦Ź£}®«g„ׅ„ ]–Ō”P¦Ž—~ ßŲw‚¹sՒ2×U`™ˆģC„RĮĮĮĮnO‘$j*ņóóqśōińļœ:ˆAį³\.Gzz:nŻŗ… {÷ī¦ž‘TsŚ&lń”żłĘž@clÉĖĖĆĶ›7qĻ=÷}ŠLūöķ‘••%Ä3gĪą€ƒƒZµj%Žb_ZZ ųī»ļŖüb˜¾I5–¦>KņP«ÕāX*• —.]\ŗt !!!pss³yė:cidddŌłg,©+cżķ…c„! ė+•J\æ~]ē÷ėׯW«ī-ÉĆ!¢ßĀÉÜ8ÖRĒŲÓÓ………:°Šõõõ­ÖM‹»»»Īg”īõc÷Ž{/Nœ8ašÕ\yœœœ ‘HÄcÆæN`` śōé///±[€¶C‡įūļæG@@€UÖłüóĻĶī—%åłüóĻQVV†>ų@ēI9'ND~~>²²²,Nžžy<üšĆx鄗ć«SžåĖ—ć³Ļ>Crr2ž}öYdff¢¬¬ ‹-…Bה_|Ń`ÄĀĀBtėÖĶģńJJJ‚R©¬8Z=”––"((Čl:Bk°®(ĀŲ!ś­Å“i_ć7nÜ0[©zXz]˜bīŗ8zōØŁ2 żłM/KņŹČČ0{®Zš5>©©©Ų³gz÷ī WWWƒAR"²„R)CœœœtZ„h ƒ““N:„R‰””Ü}÷Żšōō4”¬±±˜[O{~­ÕÕSf Üj­CūöķĆčѣєC‡*™¶k×wß}7ÖÆ_/Ī;sę zč!tėÖ ā/^™™™ØØØ€ææµ•k,M}–ꑚšŠ»ļ¾[ē×ҌŒ Ü}÷ŻpwwÆŅ$ŁŚ“ǹ°G0¤:ueČÕ«WQYY‰°°0ń×X@3Hjee%233”T* –,­{Kņ0ēʍ4]|“»Õ“jÕŹęõ[Ēø{÷īųśėÆńüóĻėŒpĻ=÷@•›Os„ķķŪ·€*DZGÆKŹ#“ģiÕŖ•Ī`ĶBs’«WÆā“O>Ń TĄĄ1cĘ DGG£ØØVYĒ’ż²¤<0bÄddd %%€¦%ÖØQ£˜˜µZmq:ƒ ĀO<gŸ}¶ŹŸ––ēž{§'–,Y"ŽŸćāā‚Ž;ŠŻäĪž=‹²²2„††b’žżĻ įŲŌńR«Õų÷ß1pą@q`"##QVV†ŒŒ ±%”©t®^½ŠK—.aĄ€:ĒaŠ AHMMÅÕ«Wįąą___dggėtķčŪ·/***ÄփęŹcI=럿cׅ1–\––ŁÜń²ō;Įܹjķļ"j>ŒĆ‡£oß¾šššØö8IDT=@yy9är9:tčPåIwŚ‚‚‚ąččˆóēĻ#??J„ŅX@D`l RX0ÆÖl1©ī2‹ ŻT{ģ1ģŻ»W F“k×}ūöEJJŠĪLČĢĢDæ~ż––&žWZZŠżū÷ćžūļG~~>ŅÓÓįęę†AƒĮŃŃ?üšƒŃ2KSŸ„y¤¦¦bąĄprrš5khnZ‡ ›·ńõõó“G0¤:ueˆR©ÄĮƒŃæ\æ~Fæ~żpąĄ“­7,­ūŚä!ČĶĶEZZŒœœäēē£gĻžÕylUÕÅ1NNNĘ©S§šÖ[oaɒ%øté:tč€gžyżõ—ų«Nhh(ÜÜÜhM @ĒŽēϟ[Ņ`Ś“iųż÷ßѼys<łä“Ųæ•īc¶“<»vķĀ /¼€ÜÜ\œ?aaaxžłē±sēN±µ’~+ įQŸŚui­uĢķW~~¾EéōķŪįįįx÷ŻwqóęM<üšĆhٲ%^}õU‹Ó‘Éd˜9s&¶oߎņņrń8 .\ø`Q:™™™P«Õ6lV­Z…ĄĄ@L›6 gĻžEPPP\\Œ5kֱ駟ʍ7pōčQx{{ćÉ'Ÿ„³³3fĻž«WÆZt¼¾’ž{|÷ŻwxóĶ7ń믿¢mŪ¶ˆ‰‰ĮŹ•+Q\\Œāāb‹Ņłź«Æ0ž|dddąČ‘#čŁ³'F×^{Mžųc±„ʦM›0dČÄĒĒ£  3gĪD@@ pčŠ!,\øPLĖ’ćuņäI̘1/½ō¾ūī;äēēc͚5:-Y,Iēļæ’†‹‹ ¦L™‚™3gāźÕ«xūķ·ÅGjgffā™gžĮÓO??ünnnøvķ¾śź+ ®¹ņXZĻ–\–\_–\–Ō”¹ćeé5hī\µ4"jų***””„³gĻ¢WÆ^6’˜ˆī0`@µ·1ՊÄKZŠXUM2ŠŹ8j½dœøpÕz Ÿ…åĪŚÆˆˆˆ¹¶ŽYŖįI#ö†ķš‘- ##ĆäS-Q\\ŒĀĀBÜ{ļ½bkĆŗ&“fė3¢Ś“H$ńJ”j½—( P¤õ.L ė–ØŠzšGī /‹ÕÕSfØR*•vū‡ź1Ł’««+‚ƒƒ!•J!‘HÄA˜«C"‘@”PĄŪŪ›·5N6^ƘŗˆŌIw²>ž‡Óųń‘-988č ą^µé.JDdˆŌŽ """""""ŗ­ĪO0 BDDDDDDDM"DDDDDDDŌä0 BDDDDDDDM"DDDDDDDŌä0 BDDDDDDDMN]ĄkP(ąüčĆ(żāk{—„lŒŻ%""""""«‘Ļ{Ž»¶4Ģ`Čm®ĻO·wذ…Q%+/SE™ųŁ”¤Šźyø–¢R™ov=‡~żą°ō;Hƒ[Ś»ZjMܾ{£äĻæķ]«)’{Ś»õ"DDDDDD ”ƒŖ.eŹ;3*Ėjž˜N•epŅĪCŸBÄĘ3gZ“’€ĮƒÜÜźo»hQÕ2ÅÅóē[œ„‹õ÷Čn©Š]fˆˆˆˆˆˆnū÷ĄA{”a‰ŽRSė_0fͦNµcåP}Ē€īC±€B¬[§yŁā 2µ †€ČČŚ§C"DDDDDŌäéA1aęLM«čhŪ¤o­`ˆvzŻŗiމ“0 BDDDDDMš±ąƒ"zĀĀ€ķŪ5csŲ¢U`ż`ˆ -M“īŽ¶­#jP8Ø*5i½zö€ĀƹŃå¹7ÆŁ»ˆö«Ō–l äꉉ¶ŻjP!""""¢&ÆŃ= ¬Ÿ¦­Ę Ń&“ąąXT‡Ųe†ˆˆˆˆˆØ±HJ²~K[Crsńć ”:Ē"DDDDDŌäd^:oļ"ŲĪüł@T”ęUßåęjZ†pĄS²DˆˆˆˆˆØÉYµb…½‹`[cĒjžcėÖµĮ`Ł"DDDDDŌä¼4{T*T•*ØT•P©TP«īL«T•·—i¦ÕjuĆ ¢äęj‚"Ū·Ū»$ĘĖĒ`ŁĒ!"""""jŒųx{—¢*C؞`@„ˆˆˆˆˆØ1Šˆ°w Ŗb0„źv™!"""""j,""€Ē¢£°0{—Fƒ!TĻ4Ź€Hqq1’’’pćĘ Ü¼yąēēDDDĄÕÕÕŽE$xüjuH–ąyBDDŌHŌē ˆ¶±c ”z„ŃDvķŚ…S§NU™óęMܼy§NB‡ŠÆ_?{• ąń«=Ö!Y‚ē QĆ&ķÜ.> ēQĮ-ķ]Ė̘”פ>ЉƌŽy‡A›&¤QDÖ®]+žŹiŹ©S§pćĘ Œ7ĪŽE&-śĒO.—ĆĶĶ PTT„R €ĒĻ^d ž'DDD “vDŚP‚ Ś¢£™3ėĻ@ÆĄ‹/jŹ%<ž8* ˜:X掎„£:ŠhUݵk—Ł?š³³³‘’’ܼy»vķ²w±é6CĒĻĶĶ =zō@=ÄĄˆ€ĒÆ*ż:”ĖåšööĘ Aƒ0hŠ x{{C.—‹ĖY‡M“pžČårųłłĮĻĻOē¼ŠŸĻ󄈈Ø~šZž¼wmü¹§f0D°h‘}{U(4A™ŌTąŠ!MĖ!",_·ˆµk5QŻh-DŠ‹‹ 6żÖ¦V« 8qāĶÆŸĘśÉ’ūļæŲŗu+PRR‚{ļ½Ɔ ³IłÓÓÓńŃGĮßß„„„hŃ¢~ųa4kÖĢĪ5[7ŒæŹŹJxzzŠÓśL?ĮĀ… ”T*ńę›o]gɒ%ø’žūŃ”C³ó322°`ĮųśśŠó"""мys\¹rÅč/é»wļFFF&MšdQ޵­C¹\DFFĀŻŻŠ»wo:ttZ۪ógĻbķŚµ˜7ož8ļĆ?Dtt4Ś·o_­}¬.subÉ1­©³gĻbÓ¦MųĻžcõ“ėķóD8Źd2€‡\.Gß¾}QVV†ƒB©T=OjņŻe­ó¤6e ""j“oŚŗ5k€nŻ4ƒ¬Ö•čh`ŹĶ»%āā4ć±ĢšU·å¤:Õ(Zˆ$™éćåää„=z k×® …———Ém‹ŠŠ°zõj̘1ƾś*^}õU=zYYY6Ū‡f͚!66ļ½÷zōč%K– Ōåååųč£¬’–±ćW^^ŽÜÜ\äę梼¼¼ZŪšąEee%ÜŻŻqęĢ«ķ{@@Ž~ūmń5fĢōźÕĖ®Ż “ėĮÓÓ-[¶Ä½÷Ž ???( ( ųłłįŽ{ļEĖ–-Å@“¹:¬oŒSķóњ禭ثŒśĒZ&“ĮÅÅC† |||0dČøøø@&“™ÜV`ķﮚŌMSžž$""jĀĀ€„KmŸOD„¦EJNަՇ„ĮAL šĻ?õ{ ZŖ•FŃBäʍ?ā•J%Š‹‹qĻ=÷ M›6āŗr¹\¼Į¶ÕVVV†ŹŹJØÕj€‹‹ ęĪ @,łī»ļ R©PVV†Ī;ćĄĀ… 1jŌ(Ü}÷Ż4æ¼’łēŸxłå—±qćF\¼x*• -Z“Ą#<‰Dbtī½÷^ģŪ·ĒŽC·nݰ~żzœ?‰!!!˜0a`ēĪŲ·o¤R) ¦L™‚Ó§Ocß¾}xę™gŸ~ś)†Žüü|>|ø|ł2ƌƒżū÷#//Ƽņ är¹Įrž9sŪ¶mƒ³³3®_æwww¼ųā‹ųńĒqåŹ¬\¹'N“ŹńĘ ndŌj5 JJJě`'''888ˆcŠ:~‚mŪ¶”wļŽÉdHLLÄ]wŻP©TųžūļqėÖ-ųųų ¤¤Ää|Kh’źmصɃ:]788ÅÅÅČĻĻÆ²­%Nœ8-[¶ĄÕÕŁŁŁšńńĮ“O>©³Ž”sÖŲµS:1vLµĻĒāābqzōčŃó _?€¦5Ņ÷ߏk×®ĮĆĆ/¼š>\oƟšž'EEEŲµk† øļ¾ūtÖŻµk—Ų’ČŅóD’»ĖŌµĄąrżŗį÷'Q#e«ńD MŚ/¾h®9Ą‘#š'äŌ×a©ĘE@D7A&“!((ĪĪĪHOOGqq1ī¾ūnń¦éĀ… HOO׳#ߊø#Āø qqqøė®»Š±cGtļŽ]¼ašÓ«Õj¼öŚkčׯī»ļ>ģŻ»W ˆģٳżū÷ĒéÓ§qķŚ5̘1šĶ7ßąŲ±c茵«É}jٲ%®_æŽS§Nįܹs˜3gą“O>ĮńćĒ”P(°cǼöŚkpttĚ5k˜˜ˆęĶ›LO*•āśõėxć7°vķZ:t3fĢĄ—_~‰sēĪA&“,§\.Ēłóēńæ’żnnnx’ż÷‘––†įƇ挵kVłc^8B~OOO”””ˆæRĖd2<ųąƒā¼üü|±)æ±qc qōčQ<ņČ#J„ųå—_““ooo=zEEE˜;w.JJJšŚkÆ€ŃłÕaģx ¬‘‡©:€‚‚8p^^^čܹ3BBBYYYHIIA^^¤R©Įm-!•J‘žžŽwß}®®®X¼x1’““ÅåĘĪŁN:¼vĪ;gQ˜:¦ŚēćÕ«WuĪMCyęęę¼~ĀĀĀpłņeLŸ>]<ßSSSėõõSÓóDųܽ{7ī»ļ>±å\^^vļŽ „Riö»Ņį»Ėܵ`l¹vŻšū“ˆˆØ‘[“HN¶N !:Z󔘘ė—S”¶o× ¶šP—5D6Ö("'''( “lŁnnnpwwGėÖ­įå兌Œ \¼x•••5„=z4 „“'OāčŃ£Xæ~=^}õUxxx`łņå())££#”J% uėÖ”¤¤*• ēϟGLL 6oތōōt,Z“HL»¬¬ĢlžR©jµ©©©hß¾½ų‹hŪ¶m‘žžŽ›7o¢]»vptŌĀńćǀΠ‡¾   H$xxxˆŪyxx@©TāņåĖĖ)—Ė,jźćモ¢"øøøŲōXÖ6ż;w¢k×®b:‘‘‘Ų¹s'ƌƒ+W® uėÖb>Bk cóõeeeį­·Ž?lٲĄ–$ƾ+õiw™ŗŒÕŁÕ«WĶÖkuŹ Æ±}QĆU¾gņGŽ­2ßł¹ép’m{ÆīOu8Šņõ…R£¢ź¾¼11@ēĪĄąĮf°UCē”1ž¬ƒSߎö.²Õ4ŠAUżżżh‚¹¹¹8wī$ š7o‰D‚“'O¢   Ź žö¶ŚŽ9‚?ž„„„€ŠŠ \æ~~~~P*•šńń¤¤¤ ØØHü£¹_æ~8xš öļߏ~żśŚ“iƒ””qĢ’o¾ł¦Źüśžż÷_äåå”cĒŽhŻŗ5Μ9µZ µZsēĪ”U«VhŪ¶-Nž<)–ń?žĄ† ąźźŠœœš،Œ ‹ź°ŗå”H$V“P8B˜œœäääč/„R)Īæyó¦øĢŠń;|ų0šśėÆćæ’żÆų ÄįÇѢE \¼x€¦Ę„K—Ąčüź0WÖČĆTZkŪ   ‹e=}ś4JKK@3ø©Šņ$55UœĄč9kģŚ±¤NĢSķóQ{ŚXžĘ®Ÿš²ēõSÓcķęę&~Oš@…v°¢_æ~:»¶äÓžī2W'ʖk× æ?‰ˆØ)’j=¢ÉˆŠ2’˜ŪØ(M ŌTĶ»=‚!a\{>>˜¬¢Q“‰ˆˆĄ©S§PYY‰¢¢"dffĀĆĆ>>>ø~ż:nŻŗe“›@„“ø[·nČĢĢĂ ąä䄬ŹJ„‡‡#""7oŽÄ_|K—.!$$ ĄŠ+0gĪ“lŁ„„„Édā#ļŗė.DFFā“O>D"A»vķX%ĻėׯcžüłØ¬¬„žóŸ’ĄŃŃwß}7NŸ>?ž€¦É·š8Ņ!C†ąć?†ƒƒ<==gggČår¼÷Ž{h޼9Ś“i•Je¶•óģŁ³×÷õõEyy9¾üņK<ūģ³V9~ś„® śÓęŽß¶mŪ0|ųš*óļæ’~üõ×_xłå—qčŠ!,X°~~~hŻŗ5Ōj5ĀĆĆ ĪÆcõ(Üš[#KėP*•¢¤¤D \”””üeŪP:::ā™gžĮĻ?’Œ²²2øøøą¹ēž· Ā/æü‚7nĄÓÓ]»vÅŽ½{Ąč9ėļļošŚ™9s¦Ł:1wLg͚%žÓ¦M§Ēoōz5tżXzléq·ōśŁøq#JKK1~üxØT*<÷Üsųā‹/ •J±vķZ899aōčŃV?O„ī'ŚØnٲżśõ«Ņ5%ĀČųƾ»Ģ] ʖ—••éŌMSųž¬«ćO$X¹r„½‹Šh ˆul{ö|ŗŁH\°c‡īx"aaš– 11õļI/aaš'ŠĢšÅqE0I ·‘hmėØõ’pą@Ą€Ūķi᳋Ö:ĀśĪjµz®åEØj×®]āśšöö†J„‚T*ENNŽĮ_ć:tč ó )Łöńųłł”G€ƒVéĀć§Kæ===Ń¢E ųśś²³³‘™™©3ĘHMźšŌ©SŲŗu+^|ńE{ļ2ՀpžƒDŸŚĄą|^kDĖŹ•+1hŠ {£ĮŪ¶m›É€H9¶™¤¤$1 bI×[Có¾śt!^š=*• ŖJTŖJØT*ØUw¦UŖŹŪĖ4Ójµ«V¬ĄĢWß“Ź~ė2#Ÿ÷ \ē½lļj¶Ü\Ķx"Ā©Õ}L®½ÄĒk#õ\¶W³Z§a­.3‰$@ €ŅŪ/aŗųöt!åķĻĀ“°^€ ­ص^k-DMóī7nąęĶ›Ø¬¬4;ž‚ŸŸ’ĄÆG“Ÿ@SD˜ÖĘćW•~ęēēė?ō±›&ķóÄP7Bż±–xžQQ(€ŪŻW”™35-F¦Nm4ćŠ4b ĮøqćÄꊦt芁Ķģź!żć'Œ)¢ćĘćg\]\:t`ėŽß•DDDDV­éBĆÖa J£i!"čׯ"""””¤ók¹ŸŸüżż!>.”źæŚc’%xžYYD„&(2v¬īX(6–įģŽsro Ź5=ž›2߁"¹g•ßž]@\]]ŁÄ»ćń«=Ö!Y‚ē Q#0kœlpQ¦“+ü¾łN””ö.eÓ”PŪ·kŽK|¼M³ŹqtĘ)W”H-»­w)SZ“Ą€ÕwÉÉF[#”øx"å…WŠż÷_ģ]ʦgŃ" kWM`Ä㊤ŗx"Õ„ >¢ŁŹÕ"DDDDDDtGīžżČųā;{£iЉŃt”Q(¬–dŽ£3öz¶`0ÄJ!"""""jÄR,Byzŗ½‹Ń4ED©©Vl5ÕÅGÜ,ī"Cę1 BDDDDVµcĒŒ1BēõŃGįŲ±c1bžžūo“Ū›Zļ×_ň#pīÜ9{ļ¦Ż]»v æüņ šŻwßįĒÄŋķ],²µ¤$ !”Z›Täē#å…Wģ]ņ¦K”Ņ“©{“ ‘Ŗ*ė,/{bh‰ˆˆˆˆlā@—.]͚5CHH>łä“hŃĀŽEkÖÆ_|€K—.aŻŗuxę™gąāābļā‘­S§GjĘ©°Šu&ų¹'ķ½M×Ņ„wʱŠIW\“¹Ł»ä"DDDDdķŪ·Ē€ÄĻĒŽüyó0cĘ 6 'NœĄ·ß~‹““4ųśśā™gžA=Ŗ¤³jÕ*¬]» …;vŌYöūļæcķŚµČĪĪ†ÆÆ/ʏ#FŲ{×mN„RA©T¢¢¢Bœ‚_|€““4ģŁ³ V«Ń»wo“iÓYYYXæ~=¦OŸ.nū’÷˜Ųµ Čζx“Ō‹Š|Ä`>uFĖ?žĘ¹×ę£óOߥ£ó=¶ĻpęL <\óh^ƒ­V÷ 2T3ģ2CDDDDu.77o½õ|||°téRōźÕ ,@QQ‘ĪzéééX¶lŗvķŠ—_~ÉZMOOĒēŸŽįƇćŪoæÅ!C°téR\½zÕŽ»gsR©÷ŻwÖ­[‡7"%%………b0¤øøæ’ž;xą<öŲc5jžüóĻ*õ«ĻĮĮ¹¹¹ʤI“PTT„žłćĒĒ“iÓ V«‘œœ „R‰ß’Ɔ Ćc=†”C‡bćʍ(++³wÕ4-II@ZšÅ«³ėĢåéé8<źa¤<ž4J2.ć`’łóźŗÉ<* 8rÄčø"']}8VHa@„ˆˆˆˆlbńāÅā"K—.ÕYvąĄ(•JŒ1 …ćʍƒR©[4„Čȑ#«“8)))=z§OŸĘ°aưzõj± Ic×£GL:aaaČČČĄ?ü€žł€¦ūL@@||| …͚5Ć„K—̦«V«Ń©S'šV&-Z“€››¦ÉžčѣѣG¤§§# ~~~ųśś"##ĆŽÕBfš©3@Ęßa_’‘Čݳ_gž©^ĘŁ×āź¦aaš'ŠÄÄh¦dŹ\±×³»ČŌ!†œˆˆˆˆČ&“Ē AAAøģÖ­[€7ß|Sg›¬¬,4oŽ\üœŸŸšššxyŻTš®»īĀ“O>‰Õ«Wćż÷ß  Ģ›7r¹ÜŽ»_'<==ѹsgtīÜåååāĄŖEEEUź@.—£øø¾¾¾&ÓtqqD" iiāģģ\eāābdffbٲe:ó++›Ę@Œ ]Sķ:SžžŽ”^©ŃvłĖļQ‘—vļĒĀÉĖʃ˜*šqEn— {@±{rwļGIĘe{WW“Ą€Ł„”1DĀMyll,ŗuė&ĪwppĄ‰'ÄĻžžž Srrrtņx蔇0nÜ8\ŗt ;wīĊ+°sēN 6ĢŽ»oS%%%ČĻĻG@@€8ĻÉÉ (,,„››”J„Ī6J„nnnJ„P«Õā|•J…ņņrƒłøŗŗVIG˜ß¼ysL˜0ĮŽUŃč(|׿fĢ¢£m’‡Šu¦ūļæŲ{wėLź‚EČųā;TܲšrmŦœD·ßWŁ>(r›Sh(Z„†¢Å£škŖ<=7÷@$6Å.3DDDDTē"##įāā‚7"33kÖ¬Į£>Š .č¬'tŻųż÷ßqęĢģܹS\¶gĻLœ8„››Ān7;wuuµ÷īŁ\~~>V­Z…+W®ˆó.^¼ˆ«WÆ¢eĖ– AVV–ŲēÖ­[ČŹŹBHHÜŻŻ”T*QXX@ØŅh Eff¦ŲRgĖ–-Ų³gBCC‘••…7nŠ“łńĒ OØ5ƒn¶j„<ÕÄą›5ÕTŗĪ¤œĄ~ƑśĮ"‹‚!‚Āć'±ÆK_¤œ°xkrŗéųł'čsl/ś%ļB‡Ļ>FĖg§Į½SĒŚg@ŲB„ˆˆˆˆģĄŪŪqqqųöŪo1cĘ ųųų`Ś“ihß¾½NK’6mŚą‘GĮʍqåŹōė׿žś+ŹĖĖŃ«W/?~Ÿ~ś)ņóóįķķĒ{ ÷ŻwŸ½wĻę0bÄ$&&Š„ŗ»»c̘1āø!£FĀ_ż%n3jŌ(1XŌ«W/¬X±r¹wŻu<== EÜŻŻ1dȬ]»*• >>>čßæ?œ1zōhl޼*• *• =zōh2]•źLZšę­óēkZ‹ÄĘZ5łĘŽu&uĮ"¤~`ł£‰õUäēćČØGŠīżX±å†½ˆ-Hp»I^rwļGź‚E(<~Ņ®ekČ$5ÜF¢µ­£ÖKĄ€ 9Wn·§…Ļ.Zėė;«Õź¹ö® """¢ĘnåŹ•4h½‹ŃąmŪ¶ 'N4ølåŹ•ˆ0ņōŖ½¤¤$Œ7Ŗq u ĶūźÓ…xiöM0§R•Ŗ*• j՝i•Ŗņö2Ķ“Z­ĘŖ+0óÕ7a å{ö!äXƒĖ|ó®ß0,Ģā'ˤŗx"ÕÅt—Eß{]יœŻūpīµłV “{/ĮĻ=iļ]«"óēÕ8õĀĖ€A¹ÖŌ8ĒĆ*©C•łž¬ƒSߎµN_"‘Ä(Pzū%Lߞ. ¼żY˜Ö+P”õµÖĖbģ2CDDDDDŌPTć1»–hL]gŹóņpöµ8żˆÕ[Mœūļ|œ|~¶½w±ŠN€ćķ±–Øś!"""""jĀR,Ņ<å¤Ėٽū=€Ė_~o³<®­Xƒż†£ŽŒ~™?Æ Üō𨇱+¼Ÿ]Z“š8¶ö‰4A ī±»+W®“wˆˆˆˆˆLž]š””dļāéš®(…wE©ų9SęŠNrÜtrēUäēćŌ’‡.?}kļā•łójœ{m¾Ż!śN½š²ų”ķ2z¼õ2ILŌ¼ēęÉɚ鼼;Óiiš¶ņ`»MEƒ ˆĄČ‘#ķ]"ŖcüńÆ}""Ŗ7ų’żüńĒö.B£Š¢¬-ʊd#ĒŃ™27ä::ćꟛqćæį?r˜½‹Ø£<=)/¼‚Ü=ūķ]³®ż¼ķߏ3½’” Gzś§%'k–‘M5ȀˆR©“wˆČxķYŸ~ė‘1Ss'…ĀŽEd|ńR,Ŗ7­B%ā“v½)„éĀ,`źT 48zōN`ƒAŽz§ADˆˆˆˆˆˆČ6üofŻŗŃŃĄ€šw;ØĖV!†‚.Ŗ øØ*ī•epR«-O0!”NėŠj¦ŃDŌj5Ōj5T*•8-‘H‰D|€T*5™†@=•J%Nk§GDö#\—Ś×»p ys×;Q“”–ÄĒk^Œ̜Y'٧.X„ŌÕx{M0£āöt%äāō ‡vėjšU@¤ØØ&L€»»»Īü”C‡bȐ!ųĻžƒ•+WB"‘ĄĮĮ@՛Ÿœœ<łä“X±bT*ąää$Žd=ńĘ?>Z“h©T GGG1-"²3fą@’žż!‘Hąččˆ;v`ćʍX°`Ōj5œœœč^óę®w""""ŗ-1Q󊉱yWšż†£šųÉ*ó9Z 9¬Ć±²eŅĘŸŪØ"‚E‹4‘ÄŠŠ 1`įč舄K—¢¼¼\üåX*•B„R‰­I$‰ų+sii)***ě(GGGq½’’ĆŃŃ®®® ˆŁYļŽ½qšąAōźÕ ąāā‚ WÆ^()Ń4T«ÕÉd&ÆwGGĶW¢š®ŻŹD{Z; ©TŹ–bDDDŌt$&ڼ Mpi\ ³ÄĻ rŌ=‡Ū­h»F©ØØo\ “ÉPPP€’üē?X¶ląÄ‰X¹r„øŽÄ‰Ń©S'”••A­V£¬¬ åååŲŗu+6oŽ WWWtķŚ€f`ĒāābøøøĄŁŁŽŽŽ¼"²£Ž½{c͚5())GŽĮŲ±cQZZŠ’ż›6m‚ƒƒT*&OžŒŽ;ź\ļ.\ĄgŸ}†Ļ>ū •••pppĄ£>ŠųųxųųųąäɓX¾|y•ļ į;ĘĮĮßDDDTkņŅ"{Į“;liŃ·'ppƽ÷”š€F~õšæĖd2±„Gee%ņņņ×_AAAøxń".\ˆ>ų••šHXEEnÜø•+WāĆ?„——vī܉ÜÜ\”——£¬¬ 2™Lgģ"²ąą`x{{ćܹshÓ¦ .\øoooųūū#???żōž÷æ’ĮĻĻIIIųņĖ/ńĮˆO­©¬¬Ōi&|w@yy9²²²°pįB¼žśė DjjŖųįįįpvvfk1"""jüvķ²}Ü»„Ȇe@dīܹā“D"Įć?Žššpš››cĒŽ!$$žžžP*•hÖ¬š7oŽćĒ£U«V47HgΜAėÖ­įźźŠŅŅRōźÕ āÆĄ †ÕR©½{÷FJJ ڶm‹Ć‡#22•••pqqĮēŸTVV¢mŪ¶ČŹŹ‚R©»ÓP(++ÓiķQ^^Ž“'O"88>>>U¾3ĀĆĆÅqK!""¢F/)IóčX[Ž#e、&¢ADņņņ Ī/..ÄÅʼnOšqvv†““ņņņ V«QXXˆ7nąĀ… xć7t¶/,,Daa”ø^NNd2ņóó!•Jįää¹\ŽŹŹJ”——£øø‰„„„l*OTŒ]ūŠ„K|łå—>|8Ž9‚'žxB¼v×®]‹³gϊ]f   ÅÅÅP«Õ(**BII T*ŠŠŠ ‘HÄī4ĀwĘŋ«“gaa! P^^.Ž9Äļ"""jōl=ŽˆBDDh‚/D6Ō "–~±utt„“““ųĖ­D"‡‡‚ƒƒ1}śtØT*ńi1ŸŸ/¦!—ĖÅ&AQQ‘8ˆ"ÕmŪ¶EII ŅŅŅP^^Ž€€ØT*;v )))˜7o 77Ææžŗ4 ²¬}­«T*”–jš¾3žzź)ØÕjq fāĄŖl1FDDDMFr²ĶĒAæ~ ˆĶIkŸDż#ū ĪĪĪčܹ3üüüĦō€&pBDõCĻž=±eĖ >\l¹Ń£G:tļ¼óär9Fމėׯć‡~Ą£>*nėęꆔC‡bńāÅpssCxx8¼½½QVVoooÄÄÄ`͚5ā¬Āw†T*…T*åų!DDDTļä::#ÕÅ  Ø(‹ŖŽ%š+WĀ©6?š&&ھš·Ē€l „ U®VšJ˜W"uD‰Ō²ŪvEE‰½w„Į©ÉĻ™­  Ŗ/g.ä\øŻž>»h­#¬ļ¬V«ēZ’łŹ•+atyEEJKKQQQGGGń±øÄ§ĆTTTˆæęVVVŠ->“FT©TP©TH$H$ØØØ^ŗŁ8;;ĆÅÅE|ŁNRR’ÉkŠ“ō(--…R©+—Ė!•JQZZв²2ńśZ”„ ł©ØØį+t«¾“æ3“ŸdÅ)‘ķ%%%aÜøqŖ>äĄP+nCó¾śt!^š=Gó7„ *Õķ'Ī©īL«T•·—i¦Õj5V­X™Æ¾i•ż(ß³ł#ĒV™//-‚kI”UņŠ“"š2øĢEU÷Ź2xW”½²Ž„ÕK|ūvŪ~ŚŖ–fŪ ÅŚ„ļc×»,$śßŚO„!"""j„–7\ÅyŠŠxW”ĀEUa¾Ib¢ķ"QQ@B‚½«Jt§Õ†ƒŲj£@+ą”]—Ō04ŗ€ˆš‹­šė­¹eP«Õā<į@g=ķĮp¼¢zHlČd2k€ŲŹC; ¢­ŗŽµ·ęśĪą÷5t¹Ž.:-\TPT”Ā[ģn£ÕФ®Ę±q@D{Œ”ˊRźˆ©ƒX'Ōx5Ź€ˆö»¹e¦nb“—q|¢†ĮTpB˜˜cźzgąƒˆˆˆšŠ©#®ÉqMv§ė„ŠŠD±{¼m]€Z“@Ńļ²Rą ƒÕ—ƒ7žDDDDDDdķV$Żvļƒ÷}µOĀØ°0Ķėö8"†ŗ¬č¶š`kŖžIāóØ‰š$^ūDDDŌŲIU•ö.‚Å SNŚ6 ąäcqmÅ{ļ*5R 2 ņČÄūķ]"ŖcēĪę ]{›7Ģ$""¢znÕŹ­ö.Ż–³{‚Ÿ{Ҧyxt¾‡²>"…ˆˆˆˆˆˆŖ-w÷~›ē”øļ^{ļ&5b ˆQµUäē£ å„Móšč|==ķ½«ŌH1 BDDDDDD5ĀV"Ԑ1 BDDDDDD5’³{ŸĶó°õĄ­Ōt1 BDDDDDD5R˜rŅęy°…HŻkHO;ŖÕ~Ś»DDDDDDŌ0•d\FyzŗMóą8"uĻ„Liļ"Ō DˆˆˆˆˆˆØĘnī9`ó<ŲJ„l"j” Jpīl–ųn =¾~ĄŽ»EM@S8Ļ']Ņy'"¢†­.Ęńč|½w“!G{ 1JŠ«WwģŪæÉąņŃ£ĆlA֍Ӛóó±wq‰š„Ģ«y Rąź•\)t–ż{ł0~8ŗÉ×NĄĶIŽĪĶ:ąÅžSŃŹ;Dēfōąōæ,ĪĻŠM¬—‹'ž™¼Źd~É×N`Ɂļq.;ŠŽ·5^ģ9 ]›wÓQ©Õxö÷¹8’y¼J™Ŗ»ĢT9Mm—‘wīł)Y§įź$Ē V}ńŸ^OBę 3¹ŻĪōżX–¼§ožƒ»Ģ=ƒĀńRÆipó³hŖĖ\}nKŻeÉ«qžVŹ*ĖÄćlj»²Źr|“ēsl¹ø0“ͼŅ÷y8I Ö§ö>ĖĻ’z1wžéו©óĢTYL1•¦©sĀŌv……„pww߉ˆØį«³'Ķ|`ļ=„ʆ+X»n||ö.i1uÓõSŹ:Lī:‹…J­Ā¶Ō=˜õw,ÖO\j2p`Šžåk’¼‡žķĢę÷Ś?ļaƽO!*¬ 1m/ężó.žzü'1­ļ¬€“ŌÉ`¾Õ]fŖœ¦¶‹Mü}‚#±`šėØT«šĆŃ_šuŅr¼ŲsšÉķV’ ÓŗMD· R«°źųoxeó’°lģb‹ö”ŗLÕē¶ŌŻX°k ęŽ÷zuƒ§³»EŪżœ²Wņ3ńĖ„Æom’«ŽoĄć]2X§SłYR/†˜:?Mg¦ŹbŠ©4M¦¶Ė¼š‡^ā;5|Ā8"N””6˃Oš![`—+ˆŽ~żūó%ŖOŗG„č¼kūō’”WĖī9ČPRQŠ’ŠČ],J÷³KŃļūhL[? WņÆ\ēÜ­T$_;‡ļyŠl~ž®¾J¤Üž'•HuZ ¤\?…5'ĒüsŖäSÓeĘŹij»óŁ©x¬Ė8øÉ\įéģŽ©į±ķā³Ū}6ņ=ō éW'9Üen˜Ųi .䤙ݮĒ× Ē׹ŽoGት/įčµ;#ŲßRę`ößq°tYż,R²N‹ĖLÕē²ä՘Õ{:·īW% `j»Mē·ć„^O"ĄĶn~x±ē4üyv«ŁsÅT~ęźÅ’óLŸ©óĢTYLÕ§©4M¦¶k×>.ā;5u2ŽH_Ž#BÖÅ"V ßefƆM˜ūJ®\ÉÄ#D£²²i<²ˆØ!Ńž…=Ų3_ŒZ`ŃvĪŽĪųū‰ų9eīż‹†ĻÆ²Ī—Ą”š pqt6›ßC^Ē3ææŠ×·j>·pĄW£?–įmāõž3ąēŖŪŻ®¦ĖL•ÓŌvķżZcÕń xųžQ©Vįēckq­0«ZłĄ—‡~ĄąÖżĢn'“„ØTUāXÖ)üwėūųć± ÷~‰”m`Įą×‘”y ļī\Œ•ćæ0[Ÿēo„įzŃ _ž(J*JŃ% ęŽ÷Zz¶0¹]fĮu„yfmŠÅ»÷ĻĆÕĀėbY‡ż8 …eÅpóÅĄV}ńT÷Gįź$7™Ÿ©z±ō<3ÄŲyfŖ,¦źÓTš¦Ī SŪ‘i õé)'Šlš‡÷}½‘»ĒöŻsØé`@ÄŹ²²nbŅħįåå‰å?}‰Ó§Ļałņ5ö.é98ż/TØ*YpßY…÷}…‡¼av»I¢įź$ǤNŃżóä*ĖOŽ8‹Ó7ĻćżĮ’µ(æ»—`d»ūńX—qPųéŲÆx×’įÓļ`Įī%čŅżBzUɧ¦ĖL•ÓŌv±fćĆ=Ÿcé‘U;¹ą‘{„T*µ8æŅŠ2¼³3i¹ųüö±©ķ^IĘ¢}_#-7åŖ H —ż{ł¶\Ų‰7” XH%w–™ŖOµZ…’ŠRü2įk8J°ņųĢOüß<øŠävŚ Ÿāņ;Ø › U®\ĒŅ#«»}!>ś¦ÉüLՋ%ē™1ĘĪ3Se1UŸ¦Ņ4uN˜ŚŽˆˆ'Ž#B "VöĻ?;PRRŠ9sž@tōĄź_6ąČ‘{ˆō8Jģ„Y½§cŌOOT{{‰Ž# iu1­ŪDȪމa(æ¤Ģcxšįź$Lī:Ć~œųū|"`õ‰b=¾~§’Uće¦Źij»`Æ ü߈wÅłžŪж>­Ģni¹·Ē*io\(¶H1µŻüŸ`NŸgŃ7¤'Ź+Ė1`é8q©D‚ÓÖģędŖ>›¹ūcr× ā²‰Ę įČ*³Ūµšh†“œ q¬•ŌœKtoVåŲ†Ü>¶®˜b6?SõbÉyfŠ”óĢTYLÕ§©4M¦¶#"¢Ę©šųI”ēåĮÉĖvćCq²6Ž!beׯߓl.ĪkŁ2ŠŽÅ""-Æl~dzΠ\Uģā|{ų't hoѶ«Nü†ār%Vų ]›é>žķ赓HĻ»‚1w³8æ¶>­šĆŃÕ((+BaY~<ŗm}Āh~a×~ ój³ĢT9ĶmeEŲzq7ā÷}£3ØØ±ķž8»/żłžģž(Ž0Kē¦ßŌv„„Pøx”¼²ßžY§ ÷¶ŒĄg–¢ ¬ØŹń1UŸQa}ÄeÅåJ¬<¾włµ1»Żš¶±äĄRÜ(ŹĘ¢l|v`)F“æ_'_5ŌøQ”o’–£[óNfó3U/ęγšœ×¦ŹbŖ>-¹V µ¹ĘˆˆØį:Ųļ¤.X„ņ¼<›åĮqDȚŲBÄŹ4ƒše^½3^jjŗ½‹EDZĘu÷~37/ĄĆٽZvĆ;ƒ^ ;ī0­ØPU`Ų“ŠĪ§žw{Į—‡~ĄSŻ'ĮQźhq~’4 ÷|Ö“*čҬŽ4צūo¬œ¦u!s”O(ęŽ÷¼Ī˜ĘÄ%jŗ‡¼öĻ{xMkžŽ©kÅÖ †Ģīż ^Żņ*T˜”Ū²ąå>Ļā£=Ÿ#zE ņK uŽ‘©ś|6r2’ū-že:ŠĖ•čڬ#b£^6»Ż£ĒāJ~&&¬žŅŗ?é4F§^¤ ü\}Ń7¤‡8@¬©üLÕ `ü<3u~š:ĻL•ÅT}Zr­:'LmGDDWIĘe¤~°©,BóIćŃńóO¬ž‡{ēŽG„¬¦zķpļl#ŃŚÖQė%ą Ą€€+·ŪÓĀg­u„õÕjµEw+W®Ä#ļ·dÕ:£=ØźµkY ķoo/|ńåB¤¤œÄ{ļ.Bii²nœ†ŸŸOķ3$j‚ĪĶA»öŽö.ŁŁŖ•[1nœ¦+„Z­ÖY¦’ŁŲ¼Æ>]ˆ—fρJ„‚ŖR•Ŗ*• j՝i•Ŗņö2Ķ“Z­ĘŖ+0óÕ7­²å{ö!äŲ*ó}ó®× 5ĆR]<‘źbæGœwŪøŹźŻ\nüń7RŚnūTŸ)*Jнš†ÕŅĖöjVežēėąŌ·öĒT"‘Ä(Pzū%Lߞ. ¼żY˜Ö+P”õµÖĖbl!beĶ›`i§xmŽ;˜üÄóxģ±ńˆŽU«Ö£¬¬ĢŽÅ#""""¢zĢŠMhMKģ{»W˜rŅźÅ}ģ2cL®£‹Uϟ¦€+P©³t>Oš4“&Ó™·bå×ö.&QÉٽĮĻ=iÕ4¼¼ąŽ©# Ÿ“÷īQ#Ą€ˆ¹¹yXo<˜1kö³šōō°w1‰ˆˆˆˆØq †|Ž+6Ķ#H"A€÷ŃŃÓÓ&éŽ5oŹŽŸ°ćžÕ_ruµzŒT›CH°½wŃŖ1C”šBlœmæØˆˆˆˆˆØi‘·„ė¼—mš‡«½wŅF¼FF«}BŌäń±»DDDDDDDŌä0 BDDDDDDDM"DDDDDDDŌä0 BDDDDDDMŹŽ; ‘HŖ¼vģŲaļ¢Qā ŖDDDDDD Ą† œœŒÄÄD ))IgyTT ĀĆĆ1jŌ(DDDŲ»ČMZRR ‘˜˜(ĪӞÖ&7į}Ą€5ĪwĒŽČĶĶErr²É|µó Ghhؽ«¬Ī1 BDDDDDTO„§§#>> ČĶĶ5¹®pÓ»~żzÄÅÅ!** Ū·o·÷.4YsęĢ11dżśõ:Ÿ£¢¢ƒččhxyyY”ĘŽ;eŃŗśe‹ˆˆĄK/½„)S¦Ų±Öź»ĢÕCóēĻGxx8āććĶC ·÷.P-$&&"&&aaaX¼x±ĶóKJJBLL ˆ¼¼<{ļ~h-D$š·wˆØĪåšŚ'""¢&!//÷ß•.1ÕeiKŖßrss1sęL¬_æėׯ·øµHM%&&"<<ÉÉÉ6ĻĖŽd@„ˆˆˆˆˆØ1²$"Œū šHLLDrr²Ųšd̘1öŽŅ£P(U„õNZZŅŅŅLv±ILLÄż÷ߏ_żµŚć}ÄÄÄ &&¦Jz7n4x®„„„aęĢ™Xŗt©½«Ģ¦!"""""ŖĢC¢¢¢0sęL£ŽŲŲXš®»wļ¶÷īįįįX·nŃåyyyā0iiiU–'%%ᔇĀÖ­[«Õz#&&¦Ź@­ @ll,6lŲ€˜˜˜*ݲר[å"DDDDDDõ@\\œĮ`ˆB”@BB¶oßnQ«ˆˆ̘1ĆŽ»C5ąåå…)S¦ 55qqq×IJJ2ŗ¬&ƌc4½ź Ū1 BDDDDDdg;vģ@||¼Įe’üóO“zņiÄĘĘ"!!Įą²ųųx¤§§[-/żī4C­Tv™!"""""²3cæŠĒĒĒ#""¦y§§§#99ÉÉÉā¼ššp„‡‡7˜īéééUĘą CXXX•®"ÕM711Q DEEÕ*½źš2eŠ8˜Ŗ¾øø8«ńŃŲO5†"""""";nŗõEEE٬ėK^^o²@XXbbb0sęL³7͉¤Ź¼øø8qlko'ģƏ?žhö‰<ŃŃŃ&ĒīŠ·cĒÄÅÅ<. …3gĪ4[>kIHH€B”Ø2żśõV ˆkmŅ؟TÄ.3DDDDDDvdčץx7†ŚŚ±cĀĆĆ1sęL³]"ŅŅ҇šššZ?ؚ6lŲ€°°0̜9Ó¢ri·~1gٲeˆŠŠ2:~Fnn.āāā0pąĄ:ŁW///ƒēBnn.vģŲa•< u×Ŗmėš†€"j” pöģYń½>ųżģļ“l"掓wQØūń2µöŚwc׊šo}śƒœˆČŒDl1nˆp³_ݱ!ŅŅ҉ 6Ų”†t͚5 ŃŃŃUžŠbŠ„-,D%&&bÖ¬Yu²ĻĘŹoAOēϟo0 blL›Ę„]fˆØQŗzõ*‚‚‚påŹé,Ó¾É:4żÅišŚĪŠ£ž:_ś_Žśķ}ŪėĢߖŗ É 8ė<Ź*ĖÄmM„łļå±ģč2$_K†›“:7ėŒ{¾ˆÖŽ­M.»”w īł)Y)psrĆĄV1£× Čd&—ķL߉„䜾yī2wō ꉒōśÜj\Ÿ•Z…g‡3‹Ū›*‹”zńrńĀÖÉ[Mü’Æ%ć’üĪeŸ“÷m—z¾„®Ķ»V{¦ŹbI~5)guĪ%”ĪjŹŌ12µe•eųhĻGŲ|q3`X›ax„ļ+p’:‰ŪŗV įīī.¾5&ĘŗĖXŪŽ;ŒŽģ‡……!:: …¹¹¹HHH0pˆ‰‰Į?’ücóqMŒY¼x±ÉuaÜ@ó™DÆN@¤:āćć1sęL›µŅ©S'ƒó- l鷐ÉĶĶEbb"ÖÆ_o0„„‹žhŌŠ1 BD’©›'įʬŗæ~›ŪĪ\0 «(Ė`0äż]ļćÕū^EĻ žštö“(͟R~Ā”®SšÉ°O R«°-ufż= &n0¹,.1½ƒ{ćƒĮ R]‰eG—į«¤ÆšRĻ—L.[y|%žģö$ŗµč•Z…UĒWaĪę9ųaģ5®OĮ÷G¾‡£T÷æ#SeŃÆ“y’ĢCG’ŽfėÅT~󾙇÷ĪĄĄ0MÓ×ķiŪńź?ÆbÓć›j“OęŹbI~Õ-§©sÉTÕ”©cdj~Nł—ó/cõ„Õ€7·æ‰•ĒWā‰.OˆėŗV®^½ŠĄĄ@ńˆØ±ČĖĖ38?<<Üźy †ÄĒĒW«dŃ¢E˜:uj•Ann.ęĢ™ƒķŪ·×y]ķŲ±3gĪ4ø,::o¼ń†Į@͆ Ŗ]Ÿqqqˆ‰‰Ahh(ņņņ°~żz̜9Ó`(>>‹-²é¾ @Y1VośĀŠč»ŹŲe†ˆ%į? {żz”-ņėHD~ •Z%N ’0«÷, n=øJ0ĔOų½Zö‚ĢA†’Š(+”;ŹĶ.;—}wyn27x:{bZų4l»øĶģ²ĻG~޾!}įźä w™;&všˆ 9Ģ–ó–ņf’=ż—öĒĆ«FJVŠĪņc׏aõÉÕx{ąŪ:óM•Eg½[ē|-ßó°Ł}7•Ÿæ«?$Üžē q@€[€ø|Ɂ%øļūū0użT\ÉæbŃž™*‹¹üjRNKĻ%ż:3µ¦–™;FĘöįÆóį„^/!Ą-nx©ēKųóģŸL_+ķŪ·‡‡‡‡ųNDŌXŪĀŠ šµ±lŁ2ƒ7φ‚!‚„K—"::ŗŹüÄÄD«]Qʞ琐€uėÖż»o̘1ÕjĮ‘€ŲŲXq///L™2’üóĮõuyjhšZ0` ‘Z»xń"Ś“iƒgŸ}iiiČĶĶž}ū––†¹sēb×®]ČĶĶEß¾}ń’÷芔zõź…ƒāśõėš÷÷Ē7мysōéÓ»vķ²÷.Q żq( Ė ą€A­į©īOĮÕÉU§…ž/õēoĒõ¢ė¶|J*JŠ%  ^½ļU“ōli2M!=A°g0¾õ„ųŁŲ²ö~ķ±ņųJ.Ž.f÷ŻT~ łĻžž,ž»õæ€ī-šÕčÆÄå.Ž.ŲüÄfüœņ3>Śūā‡Ē›Ż?Se1•_MĖiī\2UgĘöĻŌ2SĒČŌ>dd¢•w+ĄĢM3ńŽżļįjįU0y­Qķüß’ż_•yaaafŸboš†æ®oœ“’’ v-Љ‰±źX+¦Ņ‹ˆˆ@ttt•śØīx,õUZZ¢¢¢Æ¾śŖ^ü°hkl!RK2™¦Æōŗuė “Éšč£¢¤¤Ɔ Cbb"°sēNäääąĮDEE&L˜µZæ’žšēŸB„RaҤIöŽ"Ā_©«ÓäŠōCŲüÄf윺Ÿ>š)r”9ˆŻnžQljµ%%X=a5žzģ/tkŃ q‰q„yhś!ģj?Ö>²įĶĆńń¾Ķ.‹‹¤«I¾|8Ę’22¤R©Łe‚ŅŠR¼¹ķM$_KƜ>sĢīßžĖūńʶ7Šē»>xéĻ—š“*.{÷ūø/ä>ō éWe;KŹrņĘIœ¾yuxØŹ±0“ļ¦ņ[°{F¶‰Ä˜DlŁŽķGąż]ļ‹Ė'ušW'WLź4 GƵh’L•ÅT~5-§©sÉ\Ū?SĖL#Sū M;šBDD¶“žžnp@jKŗQ„††l%R×­"~’żwƒóµ©)CūjÉr{ ųmiK¢ˆˆDEE‰/SĮޤ¤$DFFbٲev٧ŗÄ"Vāéé)Žøü×_įģŁ³˜7o† ˆÅ˜1c°iÓ&Œ?Ƽņ 6mŚ„Ē7n„ƒƒ&L˜`ļŻ "Ōl`P£Ō!^!˜Õ{FÆmvżfīĶ0„ė±ÕĒÄN±ōČR‹ÓŌ^6ņ§‘f—…x…`Ɉ%ā:žūm}ښ]i¹iāŲß>ų­N c¤)vMŪ„ÓmEš÷yMPų—æˆó„–ęŹhZ:<ŁķIA>Žhė›N:5ź–"l!b%;Žœ.##°`ĮH$H$q„ŽsēĪ!,, =zōĄęĶ›QZZŠ-[¶ąžūļ‡æææ½wƒˆjI 5²Š²šuŅ×čÖ¼›Łõ† IJ£ĖPPV€āņb¬<¾włŻe6Ķ9›ēąxÖq”«Ź‘]œo‹ŽĶ.”`ėÅ­X“o‘Ī`–Ę–żqö¼ųē‹xŖūSxkĄ[CąŽ–÷bɁ%((+زģŠōC:/až%å<Šö,9°YEYČ*ŹĀ’K0¢ż‹Ī'"¢ĘČŲͦ±±EjĀŲ£Y-ķņbģ -Ö,£9†‚:¶xO}e,Øe,@c©1cĘ`ūöķF[ŚĢ™c¾EpCĘ"Vāčx§*CBBhžżŸ’üGg=!ā8aĀĢ;’÷’‡üü|Lœ8ŃŽ»@Ōdhw…¦-ibj;į³T"…Ÿ«ī ¹ÆŹ`’†<ł,’»~™€āņbtmÖqQqfÓ×aī]ˆ37ĻĄĆŁ÷¶¼ļz×ģ2!M™ƒ m}Śbī}sű@L-‹MŌtՙ÷Ļ<ņż—ö7Z/sśĢĮ‡{>Ęc_š_ķŗ6T@3†ÉSݟŖņSūnŹ;ƒŽĮG{>ĀčŸ5-pŗ4ė‚’ śŸø¼BU”?E;ŸvxgŠ;ā|SūgŖ,ęņ«I9MK¦źĢŌž™ZfīóhēGq9’2&¬Ö“ŠŚz(&v⒁DŌ“EDDTér‘˜˜X§-0ź»Ę2NGMė¢d­ Pll,«Ļ‘žžnóĒ Ū‹¤†ŪH“¶uŌzÉ8p ą Ąķö“šŁEka}gµZ=גĢW®\YƂ—/_Fpp0zč!¬Y³PRR‚N:A©TāÓO?…,X€äädüūļæ Cjj*Z·n ???ąśõėü²#2įģŁ³hß¾}ķ"""¢måŹ•7nĶųIŚō?›÷Õ§ ńŅģ9P©TPUŖ RUB„RA­ŗ3­RUŽ^¦™V«ÕXµbf¾ś¦Õ÷ÉŠćmĶĄ„Ö0tžüł[ŖCvģŲašĘ;11Q§•‰”n—qqqˆ5=®š%ŪÕ4ķŚīSm¶8p`•CTTTµYœ——g°+p_iż4Żg ‘b­óP›D"‰P ōöK˜.¾=]@yū³0-¬W Bėj­—ÅŲeĘ\\\š÷ߣWÆ^xžłē1jŌ(äēēcłņåb“¦V­Z!227oŽÄšįĆ !""""j¢Œ Ōi­Cu«°t Pc]c,æĀVūP—]vģ)>>Žąü˜˜«ęclü”ĘÜ:‡]fj©eĖ–#«mŚ“ĮڵkMn{šąA{Ÿˆˆˆˆˆģl̘1 «r晖–†łóē×ø„ S§Nē?~Ü¢3 ĀĀĀ,śQ×Z7ӆź§)t+JJJ2³ä)AÕá| DĢČĶĶ5‘€Ł³gĆÓÓÓŽÅ$""""¢,&&Ęąo\\ĀĀĀjÕe!"" …¢Ź Æ%]!ņņņ Ž_aØ[†±±PLžŌiNttt•“„{µŚŒź«¤¤$ lx|®øø8«‚l=NI}ˆ …ĀźĻ¶&"""""Ņ‹7ģĘƒäääZŻGGGW§$11;vģ09¶D\\œĮ–†ŗkW)ZZšŃ<ņņņ,nåmpŻøø8Œ5ŖŃ=vńāÅFė>""Āź­CvģŲap…Bańӈ"Ž!BDDDDDT|õÕWFĒqˆGXXf͚erģ¤¤$,[¶ ³fĶŅ™oģGŽččh£é-[¶Ģ`kłØØ(ƒ7ÉĘZŹ#==÷ßæÅ]jBCCŽ™‰łóē#//Ļąņ¼¼<£Ėꓤ¤$̟?­ZµĀĢ™3 C ¾śź+«µÉĖĖĆüłó;k^ź¶!"""""Ŗ"""oōĘ_č"")“ob Ŗ-Z$N‡††"..®J`$77‘‘‘ˆ‰‰óņ1ŌŻE”P`įĀ…Ėg¬‡GDD<<< –ÕqqqXæ~½Į@A\\āćć%öš––†””qŽśŠµ&11Ō™gi}„……a͚55j “ s„‡‡C”P <<įįį ÕŁŽPžĀ|SŖ³ŻöķŪ±cĒń³pģ“ eŅ°Ø®…1H¶oƲHhASXXh4Oį8šqIōė¦)‘Ōp‰Ö¶ŽZ/g.ä\øŻž>»h­#¬ļ¬V«ēZ’łŹ•+1qāD{×Õ±³gĻ¢}ūöö.ŁŁŹ•+1nÜ8€Z­ÖY¦’ŁŲ¼Æ>]ˆ—fρJ„‚ŖR•Ŗ*• j՝i•Ŗņö2Ķ“Z­ĘŖ+0óÕ7ķ]ŌŌInߊ8· ‰D @éķ—0]|{ŗ€ņögaZXÆ @…Ö ŌZ/‹5Č"jܰwˆČx푵p """""""jr!""""""¢&‡"""""""k8˜5 ČͦN¼½²"-ķĪr‰hÕ HHØYžBZ‘‘š“$`ģX )ÉšśS§jŹiØ\cĒj–”µ±hcˆÕkBaģXĶtTąį”»NZŠ­›f:&P(4ėN = ,ZT½</Öl Œ­I?!A3ļŸ€ˆŻõ§LŃ=ŅŅ€#G4łĄüłĄśõ@\ܝy"DDDDDDD¶œ¬ (¤¦aaU—OŖy×VÄĘj‚ńńĄŒ†·3&6¶j„kWMK•%K€„Ku—EEi‚qqš Č¢EšÖ$qqšņÄĘŚ»mŠ]fˆˆˆˆˆˆˆl!7Wd0ŌHKӓ܈‰©ŚrcĘ Ķū²eÕĖĻPkŽ™35ļė׎&6V“|¼&2gŽ&Æ¾²wķŁ[ˆŁJt“įłB—šÜ\Mė miiwÖ©I+õė5]n“Ē15ČW_iĘ<ųNG?HÓ5Ś€H~~®\ÉBöĶ<”––ĮŁY_?/ĄÓÓĶŽÅ#"+((ĮµĢ|4oį‰k™łh×>Ąfyõųśqśąōæ,Z_{½ĆI—Š="D|'"""¢& =]ó^ÓT IJʏ×T¢¢4/Ąš ©Ś""4-U4­Y„V%\£ģ2sźT*8«Wn ““ PZZ†«Wnąą8u*µZéŻ¼y RIFz¬Ęe’JŠūŽįF?‘ue^ĶC‹@/ńŻ–N’Ė¢@ˆ!……„pww߉ˆˆˆØ‰Ł¾P« æ¶o·<ÜÜ;-<ŅlkY “¤$M0D”ŠSō[¬4R. rźT*®^¹¹\¹\®³L˜wõŹjEˆØai(†ŗ ÜQ=2`€ę}Ć뤗  †ĢœYżī.Ļ<£ †ü󏦅H\œńGõ6"* ’Ÿ_$C:wŽ@ēĪpw×<ÖČŻŻCœ'Eņó‹Ŗ•¾D"±÷.‘…„®'Ś]PrKņ1ō‡‰(©(ÕY·¤¢Ć~œ„Ü’|\ĪĻÄS潌žßÅSæ½ŒĖł™:ėöųś|{ųgō’~,&ÆūEe¹’ Ó6ĢF’ļĒā³ŗ#{·kńˆˆˆˆšˆØ(MBdŌV^žę]?­ųxÓŪĶŸÆ ~į)5Ļ™™×-Śžˆ,×#(7‹oaEŹØŌj¬HY‡[Źō ·8 W'¹ĮłR‰jØķ½‹DDDDT£š ¤¦ŽUdõŠ”ź§äähŅ8tH“nTŌ4µ[Š(šåjuÕ1G M:†–5"* āģ,§ŻŻ=Šŗõ]b0D&“”uė»Ä1Eō×·DŪ¶­Äi?@II)22®,ųRI¤’D™ 8wī¢ŁtÓÓ3Į!Aā¼ –€Ė—ÆŚ»Z‰ $s÷0üxl †·ˆeGWcĢ]Ć fŒ ĪĶ:`åń (.Wbåń čܬƒÅi7sóĒńė§«ĢļŚ¼#VųML“ˆˆˆˆØŠˆŻGåÖFTT£dXK£ ˆųśiĘ‘Ėåā˜!šn2ÉZŻgŗŠOŸÖ·”±AUCBZfĶzS“t^S§N2›nhh0ąRśeq^zŚ%@XXˆŁķ‰ØzFß52©fõžgFŻ5D\öJŸg±7憿8 ū2’šJŸg-N÷łž1˜ńכčńõ:ó_īó,v„ļǰĶQŻp“w¬)((WÆÜ? c† ¤¤;v­²¾5DEõE›6aXµj=śōķ >Xš)’“c’æC”0xyąūŒÆ¾Z†.]ļAYY9¾łf9Zµ Įšįƒģ]­DŽæ«/vN[Ų1u­Ī²`Æ |7ęc£Ūœž—ŃeĆŪÄš¶«Ģö ÄŅčxńóSݵw5y* āé醡 \½r))š_„T tęłĆÓÓĶ*łŗø8cÓßæ`ī+qxįł¹(,,B—.ńćņ/lv{WW9¶üó+^žż^x~.$  荅æ WW¹% """"""¢źhTčŠA3·vK ņ׳„ŸŸTjŻGō~ńåGųāĖÄĻmŚ„į×µ FÓŠß^’s›6aXæį{WQ“Šč"€&(€+W²}3„„epv–Į×Ļ AAVkBDDDDDDD S£ ˆšī3žž–·!""""""¢¦£Q=e†ˆˆˆˆˆˆˆČ ˆQ“Ć€59 ˆQ“Ć€59 ˆQ“Ć€59Žö.@M¬Z¹ÕŽE ";8|ŲŽ% """"¢Ę¢AD dļ"‘lŪ¶ĶŽE ¢F‚]fˆˆˆˆˆˆˆØÉa@„ˆˆˆˆˆˆˆšDˆˆˆˆˆˆˆØÉa@„ˆˆˆˆˆˆˆšDˆˆˆˆˆˆˆØÉa@„ˆˆˆˆˆˆˆšDˆˆˆˆˆˆˆØÉa@„ˆˆˆˆˆˆˆšG{€ˆˆˆØ©R«ÕŲ°a\\\ÄyĪĪĪøēž{PėōKJJ°yóf<ųąƒ6ߗÄÄD“nŻ!!!⼌Œ \¼x °Juµ?æżö›ÅylŲ°!!!čÖ­›8O­Vć·ß~Ƙ1cj”’Ī;Ńæy©~I׏•+‘ŸŸop™§§'&Nœhµ¼¾žśkøøø`ņäÉöŽm¢z"""";0`är9ąĘ8pą ggēZ„ėāā‚Ń£G×É>āŚµk:7ģ×®]C‹-¬–G]ī„¤R)²³³qėÖ-ųųųŌ:½ŠŠ ”””T™ßTė·)øė®» T*'Ož„J„B‡ąąą ~/‘m0 BDDDTųūūĆÕÕ·nŻ‚\.Ē‘#Gąéé‰āābōė×7oŽÄɓ'”V«!‘HбcGųłłaėÖ­čŅ„ üżżqóęM=z}ūöÕłÅ?++ §N iÅp÷Żw£yóęČĖĖĆæ’ž‹”C‡Šåųć?0pą@øŗŗāōéÓČĢĢ„D"J„B³fĶŠ±cGH$qż-ZąÜ¹sb¹Ōj5²²²Š”C0ZīÜÜÜ*ūh,æŅŅR‹ö§ØØ{÷īE›6m‘‘ŅŅR„††ā®»ī²śńR©Tčܹ3Ž=ŠØØ(:Ū÷ćĒC„R”K—.HNN†““rssQRR‚Ƈ£{÷īM¾~›ķÖEgĻžEYYzōč”ÓrŒˆlƒ"""¢zF„RA*•B*•¢°°­[·Fhh(ŹŹŹpšąAōķŪžžžČĻĻĒž={0dČųłłįÖ­[š÷÷Gvvv•.7„„„8xš ś÷ļ!11÷߿ɲܺu WÆ^ÅĄÅčÓ§O£øønnnāzpqqAvv¶Xø»»›,·ž>šŹĻĮĮĮ¢ż‘H$P*•J„0`”J%¶lŁ‚V­ZA&“Yżx ==©©©hŻŗµĪ2Sū޶m[$&&¢}ūöČĢĢÄ AƒPZZŠżū÷ėCšzż’ęx>|ééé(..†««+‚‚‚)¶"±d}HJJBNNŌj5|||‰–-[Ś{—‰źU%"""Ŗ'T*.]ŗ„ņņrųśśŠó…nYYYšņņ‚§§'Ķųøyó&üżż‘““b`DŪ7 P(ąįįpssƒB”ĄĶ›7M–I&“”¤¤iii(..†T*EĒŽu‚!‚-Ząśõė4Ż9‚‚‚Ģ–[-ĶĻÜžØÕj„††är9œ vE±–Ī;ćģŁ³(--ՙojß]\\„’ż!!!f»H5åśmŹT*6n܈””¢’ž Į©S§š×_A„RY“޾²²2üż÷ߨ¬¬DTT¢¢¢ V«±cĒ”••Ł{·‰ź[ˆYQyy9œœœŖµĶŽ;hĘ£šōōDŸ>}ąčØł3ĶÉÉIģ†QZZŠœœlß¾]g{•J???=zjµ999čŃ£***ÄuJKK«üz/“ÉPZZ*ŽōāīīŽ¾}ūāāŋ8wī 44ķŪ·ÆŅ=¤E‹8|ų0ī¹ē\»v ‘‘‘fĖ­æ¦ņÓfjĄŃŃQ§|B7[‘ĖåhŻŗ5Ž?®ÓŗĆܾāĀ… čܹ³Ł<SżÖä:iŖ®\¹‚[·n! @l·mŪ¶ČĪĪFff&®]»†ŹŹJ³ėź¤[QQµZ „R‰‚‚`ōčŃāwQSĄ³ˆˆˆČJNŸ>jßčiŖjŠ‹‹ ¼½½Ń§O£ĖÆ]»8::źDœ«“^(--…³³s•›YµZ­³­———8ĪAQQ:WWWė¤ēķķŠŠ dggC„RĮĖĖĖl¹ =]ĆX~Ś­^Lķ½“mŪŪ·oGvv¶ÅĒ,55HMM5;(kcŖßņņr\øpwß}·-E£b.²K[ŒIDATRXXP(:ó½¼¼™™‰üü|ńś5µŽ~@ÄÕÕÄįƇ±’~€ƒƒīŗė.ōéÓR);PćĒ€‘dddąōéÓ8}śt•emŪ¶E§Nj‡ææ?Ž=Šüü|xzz¢““ūöķCŸ>} “Éąļļ‹/Vé.£½mAA<<ų Üoæż&>z–l£6×ɶmŪ0nÜ8ØŅ²ÅPĖ%Có¾śt!^š=G3 i„ *U%T*ŌŖ;Ó*UåķešiµZU+V`ę«oڬ^PVV†É“'ė}Zģ–ćåå…Ī;WS†ČŚ$I<€„·_ĀtńķéBŹŪŸ…ia½2Z/Pk½,Ę’­‰ˆˆˆ¬ˆĮ"óxcp¾³³3śōéct,Kי>}ŗĪē.]ŗ K—.öŽm"»įH9DDDDDDDŌä0 BDDDD¤…ŻeˆˆšDˆˆˆˆˆˆˆØÉa@„ˆˆˆˆˆˆˆšDˆˆˆˆˆˆˆØÉa@„ˆˆˆˆˆˆˆšDˆˆˆˆˆˆ™½{÷ā©§žBæ~ż…gŸ}°ižŁŁŁˆŒŒDqq±½wŸČ" ˆ5"›6m¼yó0vģXl޼›6mĀčŃ£1gĪlŪ¶Ķfłz{{ćļæ’†\.·wYÄŃŽ """"""ė(//Ē'Ÿ|‚gŸ}#GŽē9¹¹¹ųšĆ©ŌśæK„RųśśŚ» ˆ,Ö "¶Œj5TĒGNNʎ[eŁŲ±cćĒcžüłxśé§1|ųpl޼ß|ó VÆ^C‡ańāÅ(..†››fĻžššpœŒN:!99]ŗtĮŃ£G«¤Ed+C„ˆˆˆˆˆØ‘ptt„J„2ŗ\„RA"‘ ""§N¤¤¤ˆA‹f͚”gĻž€ž={ĀŪŪ‡‚D"AII &L˜ƒŪk3•V=pōčQĄ‘#G0iŅ$9rœœŒ^½zŁ»©‰`@„ˆˆˆˆˆØ‘ Ā­[·PXXXeYqq1nŻŗ…   DFFāĢ™3(--Źsēģģl\¾|£G_„„„(**899ĮŻŻ nÆĶTZ={öDJJ T*ŅŅŅ0xš`\øpjµĒŽ«\!²•×e†ˆˆˆˆˆˆ ėŠ”°fĶÄÄÄč,ūõ×_ˆ:@"‘ Y³fŲ“iŚ“iųśś",, ?’üs•t/\ø‰D"~öńń©²}vv¶øÜTZ —Ė‘˜˜ˆ6mŚĄĮĮĮĮĮŲ¹s'<<<ąļļoļj¤&‚-Dˆˆˆˆˆˆ ©TŠyóęįūļæĒoæż„R‰’’üńĒųī»ļ0oŽ<1°‰õė׋-2zõź…«WÆāšįƀ+W®`Ā„ ČĖĖ3˜—žöŚĢ„‰Ÿ~ś ŻŗutķŚĖ—/gėŖSl!BDDDDDԈōļߟ|ņ ¾żö[|ņÉ'€Ž;bŃ¢EbŠ%VÆ^gŸ}ąå充 bŃ¢E(((€££#¦M›///ܼy³J>śŪk3• SdķŚµ˜1cM@ä믿ĘO|x­Ņ.--Eee%¼¼¼ •Jįėė[§ūvįĀqŚłSćĆ"DDDDDDÄ©S§Q£F™\oß¾}xōŃG1nÜ8Lœ8;wī\ŗt Äü &`Ȑ!ųśėÆƽö`śōéUŗĢ¬\¹£FĀ¤I“šŪoæaĄ€øxń"Īž=‹>}śˆłVVV"22WÆ^Åɓ'1bÄ,Z“Ó¦Ml޼ćĒĒčŃ£1qāD>|°pįBœ8qóēĻĒ’ūß*]fj²?Dl!BDDDDDŌH\»v žžžpww7ŗĪ­[·0wī\,^¼Ż»wDZcĒšÜsĻaƆ pttDQQ®_æŽÕ«Wćäɓˆ‰‰ĮĉńŽ{ļ”’žU W®\Į¢E‹šÓO?”mŪ¶X¼x1”J%¤RÓææĖd2äēēC”PˆŪ,X°Ÿ~ś):uź„_~łoæż6ÖÆ_9sę`óę͈EDD²³³k½?žžžö>\dgl!BDDDDDŌH888@„R™\ēąĮƒh޼9ŗwļčŅ„ ‚‚‚pčŠ!š±BʍčŲ±#¤R)²²²Œ¦—œœŒ6mŚ mŪ¶€I“&™-H$”””`Ā„ ššš€\.ǶmŪŠ©S'@=płņå:ßj:ŲB„ˆˆˆˆˆØ‘ Daa!nŻŗƒėdggĆŪŪ[gžB”Ą­[·ÄĻā“T*5”ČĶĶ…B”?ūłłY\^'''±5‹J„Ā_|]»vA&“”¬¬  V«M¦aķż”¦ƒ-Dˆˆˆˆˆˆ‰öķŪ# «WÆ6ŗŽÆÆ/rrrtęåääT+”ĶĆĆ………āēĢĢLqZ?ųŸŸÆ³­D"§·mŪ†?žų_~ł%~ųį¼żöŪåoķż”¦ƒ"""""¢FB"‘`öģŁX¶lÖ­[„R‰›7obóę͈ŽŽĘɓ'ѳgO\æ~ÉÉɀ#GŽąśõėčŃ£GņģŌ©Īž=‹ŒŒ Ą† Ä@‡ææ?T*Μ9X»v­Ń±EņóóįįįOOO”””`åŹ• œźä䄼¼¼*ŪY{Øé`—"""""¢FdšąĮĖåųī»ļšńĒĆŃŃwß}7ęĢ™ƒŽ;>ųą|ųį‡())\.LJ~ooo(•Źjē×ŗukL›6 O?ż4üżżńÄO@"‘@"‘ĄĖĖ O=õ^zé%xyy!&&...»¬ 2›6mĀØQ£Š¼ysĢ;.\ĄsĻ=‡åĖ—cōčј?>~žłg|šĮāvŽŽŽVŻj:$5ÜF¢µ­£ÖKĄ€ 9Wn·§…Ļ.Zėė;«Õź¹ö® """""Ŗ>ż1 ł`l{lūÕ§ ńŅģ9P©TPUŖ RUB„RA­ŗ3­RUŽ^¦™V«ÕXµbf¾ś¦k»ž+..F’žż±eĖ–*c{€D"‰P ōöK˜.¾=]@yū³0-¬W Bėj­—ÅŲe†ˆˆˆˆˆˆjL©TbŚ“i8{ö,`ćʍ a0„ź=v™!"""""¢“Ėå3f ^yåTVVĀ××ļ½÷ž½‹Ed"DDDDDDT+cƌĮ˜1cģ] ¢ja—"""""""jr!""""""¢&‡"""""""jr!""""""¢&‡"""""""jrų”"""""¢F¤gĻžppp€D"øøø 22sēĪ…ŸŸ_ÓĶĪĪʰaưsēN(•JqŚÕÕÕŽ»LT#l!BDDDDDŌČ|ńÅŲ»w/öīŻ‹õė×C„ś’öī<:Ŗ*Ń÷ųÆ*óūģ³É?ł±÷>†žzź©6«?..N«WÆVXXŲÕóÜsĻéĒōqoĮ_ˆ@;­Ł³gkėÖ­Ŗ¬¬l“:­V«<£PZ+;;Ūׯ?F ķœ;±Z«’ܶm›ī¾ūnŻ~ūķš5k–vīÜ)I:|ų°ĘÆÅ‹kźŌ©ś’ćhŃ¢Eõź³ŁlJMMUii©$銔Cš3gŽ&Ož¬ōōt½žśė2 C’“fĶM›6Méééš1c†¶oß.IŹČČPff¦ž~śi=ńÄ’¤M›6ięĢ™š:uŖf̘”ļ¾ūN’“oß>ŻtÓMzé„—4{öl_w'Ś Öą×¶’°”ŃkWöąėę]°³gĻźĶ7ßŌøqć ¢¢"=ņČ#śæ’÷’*--M[¶lŃ#<¢Ļ?’\V«U‡CN§S’üē?uąĄŻ}÷Ż;vl£k…TTTčĮԃ>Ø_’ś×*..Ö}÷ݧ®]»jāĉzį…ōꫯjąĄZŗt©žyę}śé§š?¾Ö¬Y£'Ÿ|R#FŒPAA}ōQ½ņŹ+>|øvļŽ­ūļæ_Ÿ}ö™‚ƒƒe·Ū«W^yÅ×]Šv‚@€_sĆäFƝ>yŌ×Ķk•¹sēŹjµŹ0 UTThŹ”)zųį‡%I[¶lQ§N”––&©zÖøø8mŪ¶MŻŗu“išŗå–[$I}ūöUJJŠvķŚ„Q£F5ų¬;wŹ0 żś×æ–$EEEéĆ?ō\_·ngäȑzńÅe†g“ŠŪÖ­[•””¤įƇK’¬.]ŗhŪ¶mŗņŹ+U^^®éÓ§+22Ņׯ‹v‚@€_++)’a2 C†į’įžé2|Ż“V{ķµ×4tčPUVVjŚ“i4h'H°ŁlŹÉÉQzzz­{‡g?&&Ƴ-»ŻŽč³Īœ9£ŲŲŲÆ†”7ŽxCėׯWpp°œN§$É4Ķzem6›āāāj‹UAA$)((ˆ0mŠ@€_kĻSf‚‚‚4wī\eddhāĉŠŒŒTBB‚®øāŠZ£8܎=*I²ŪķžPÄ=U„1:tŠŁ³gešf½EV×­[§+VčĆ?Tll¬²²²4sęĢėIHHPaaa­s………žO_č®@],Ŗ ĄÆ¹ar£[{0qāD%%%é­·Ž’$]}õÕŹĶĶõ,nzņäIMŸ>]ēĪ“T<üė_’’Tż˜#GŽh芔Ö?lŲ0kéŅ„2MS%%%śŻļ~§>śHv»]QQQŠŽŽVyy¹–,Y"IžÅXƒ‚‚<ĻMKKS~~¾g×;v(??_#GŽōu¢b„æÖ§Ģx³X,z蔇ōĄhźŌ©źŃ£‡222ōŅK/©øøXš={¶bbbTXX؀€Y,ŻqĒr8zųᇕœœ,›ĶÖ`ż!!!złå—•‘‘”wß}WśÕÆ~„iÓ¦©““T«V­ŅĶ7߬¤¤$=śč£ŹĪĪÖż÷߯>ų@ééézśé§õį‡źķ·ßÖ_’śW½ųā‹*//WXX˜^|ńEÅÅÅy¦Ķm©5cŽ,^›TŖø·`I!’B%…I —Q³ļ>õ*ć.bšę£¾ī -Ww=ˆ†Ö‡h蜯ī}óÕ Ķ{x~ušį2“mÓw¾Ū•żČ0\2MS-^¬‡ūĖ„źVŸ8zōØī¼óNżšĆ¾n Ś1‹Åņ²¤rI5›{æ“fæDRYͱ{ß]Ī)©Źk“$Ókk6Fˆškķń+3¢± hoDųµö>e@ĆXT IŗāŠ+“eĖ_7ø$D€ß!~‡@ųąwD€ßį³»ŠŽ8-X°@ß~ū­JKKe±XŌ³gOŻsĻ=JKKóuó€Ė#D yžłē•ŸŸÆ÷ß_k×®ÕŖU«4mŚ4}śé§ŖŖŖ’$=÷ÜsśńĒ›U_KŹæ$Œ€vdŪ¶mzź©§+I ФI“4iŅ$O™ģģģf×ג²Ą/ #D éٳ§/^¬Ó§O7x=##C™™™zśé§õÄOH’Ö¬Y£iÓ¦)==]3fĢŠöķŪ,›••„Ń£G{źr¹\JMMUnn®$iįĀ…š:uŖn»ķ6Żzė­Zøp”LÓōu— "€väĻž³JJJ4yņd͜9SūŪß“k×.Ļõłóē+&&FO>ł¤žžy•••é…^ŠSO=„åĖ—kźŌ©zę™g,Ū”={öhٲeśąƒ“lŁ2½’žū:t萎?īė.D ķH×®]õī»ļjéŅ„ŗõÖ[•““£9sęčńĒop“FXX˜Ö­[§J’FŽ©œœ†Ń¢ēFEEÉįpčÓO?Չ'­_|Q=zōšu— b h‡zöģ©ž={źŽ;īŠįƇu×]wiŪ¶m9rd­r†ač7ŽŠśõė,§Ó)I-žźrÅWčĶ7ßŌŅ„KµhŃ"IŅm·Ż¦Ł³gĖjå’āqł!€v.%%Eqqq:wī\½kė֭ӊ+ōį‡*66VYYYš9sfƒõX­ÖZ#Gģv{­ėW]u•ž|ņIIŅįƇ5ž|%%%éę›oöuõÓ@;qüųqMš4I_}õ•ŹĖĖ%I%%%zė­·ät:•šš*I ņ„#v»]QQQŠŽŽVyy¹–,Y"I*--­W¶cĒŽ2 C$żóŸ’ōŒžX¹r„žüē?«¢¢BRõŌŲŲXUÅe‹@Ś‰īŻ»ė©§žŅ'Ÿ|¢›o¾YcĒŽÕwÜ”#GŽčwŽń|Š7==]O?ż“ī¹ēMœ8Q111ŗłę›õĄčŽ;īŠ€t’ż÷×+£{ī¹GóęĶÓōéӕ””¤ŠŠP†”믿^įįįš6mš¦L™¢;ļ¼SC‡Õäɓ}Ż-@ƒ,­¼Ēāuo ×,)DRؤ0Iį’"jöŻĒ”^eÜåCLÓ|Ōם åźŽhhD@c£|qfhŽĆóe† —!ĆpÉ0 ™ĘĻū†įŖ¹V½oš¦>Z¼X=ö÷6šĖg±X^–T.©¢fsļ—Öģ—H*«9vļ»Ė9%Uym’dzmĶĘąwD€ß!~‡@ųąwD€ß!~‡@ųąwD€ß!~‡@ųąwD€ß!~‡@ųąwD€ß ōuĄ_•——ėż÷ß÷[,………©sēĪ6l˜āćć}ŻÄ_œ… *44T³fĶņuSp™c„ų˜ÕjÕĄÕÆ_?EFF*;;[Ė–-Ӊ'|Ż“KęäɓZøp”JKK/čž1cĘ(--Ķׯƒ_Fˆ€jōčўć½{÷jćʍśöŪou×]w) Ą×M¼čŽ;Ö&÷ 0Ą×Ƃ_øĢ 8PūöķSQQ‘ņó󕜜¬ŠŠ mß¾]ĒŽSii©ĀĆĆÕ„K„¦¦*,,L’äp8ōĆ?(//ON§S:uŅØQ£§ŅŅR}šĮŠ‹‹ÓōéÓ=Ļz÷Żweš¦žķßžĶS&99Y)))Śŗu«‚‚‚4~üx•––jÓ¦M’¤Q£F©wļŽ’$§Ó©;wźčŃ£*))QXX˜ŗu릑#G*$$D¦iź­·ŽRll¬ĘŽ« 6čܹsŠÕµ×^«ÄÄD-_¾\yyy’¤>ų@©©©>|ørssµmŪ6Łl6Y,%&&jōčъmōžŗSfĪ×oĶiŚ'¦ĢĄe(!!A’d·Ūe†–/_®={ö(99YcĒŽU÷īŻµ’~}ńÅ2 C†ahåŹ•ŹĪĪVß¾}uõÕW+??_+W®TEEE³žé‰RTT¤œœuėÖM%%%śžūļuąĄõźÕKeeeśžūļe†LÓŌēŸ®]»v©OŸ>ŗé¦›4|ųpeggkõźÕ’Ŗ×E±Z­*++Óę͛ճgO%''ėģŁ³Z·n$)--MQQQ’¤ &ØwļŽŖØØŠźÕ«UPP ńćĒkĈŹÉÉŃŚµk½§®ęō[sڇö‰"p2MSRuHqņäI(11QcĒŽ•$õīŻ[6›Myyy:uź” ĆPaa”ŗvķŖŌŌTIÕaŹžżū•““£Ī;Ÿ÷™‹ERõØėÆæ^V«UGŽQQQ‘n¼ńFÅÄÄ(''GEEEr8*..ÖŁ³g• ÄÄD†”ØØ(uļŽ]Ō©S§”””$‹Å¢ŠŠ ?^±±±2 C’ūße·Ū=#Y‚ƒƒ%I]ŗtQxxø$éwæūLӔÅb‘aڱc‡ dF£÷xkNæ%''Ÿ·}īē }!€ĖŒiš:{ö¬$)&&F6›M’[«\LLŒņņņd·Ū=ē"##=ū×\s®¹ęIjŃb„įįį ¬žs188XeeeЉ‰‘$………©ØØH.—ĖSgaa”V­ZU«ŽĄĄ@Łķv%%%yŽŻķ·Z­ WEE…ŖŖŖ  ĆŠęĶ›uäČ•––z"w’4GIIÉyū-99¹UķĆ/\föīŻ+»Ż®ččh%&&z¦¼Õ*WXX(IŠˆˆšœ+..öģļܹSŪ·oWZZšśōé#©:1 CV«U………ŖŖŖjõ¢­īē&&&jŹ”)mŚ™™™Ś»wÆzõź„Ń£G+ @‹-Reee³ėp‡CĶé7ųš±ŖŖ*mÜøQ¦iŖ  @yyy Ōøqć$UO ‰×éÓ§µ~żzuīÜY¹¹¹ŹĻĻW||¼ŗté"Ó4£“'OjėÖ­ŠŒŒŌīŻ»eµZÕ³gO+**JÅÅÅśņĖ/Õ±cG;vL!!!- ¼%%%)!!A§NŅ÷߯®]»zY5 C·Žz«BCC›U—{DŹīŻ»•’’āi“ĆįŠŃ£GuäČO[³³³Õ»wļz÷Ō]µ9ż’E >f†öīŻ+I UĻž=5|ųpĻĀŖV«UéééśńĒuüųqeee)""Bƒ ŅšįĆeµV/榛nŅ?ü Čét*11Q×\sg$Äõ×_Æļæ’^999*..Öµ×^«ļ¾ū®Ł‹®Öe±X4yņdĻWf8    %%%)55µŁaˆTż¹Ü¢¢"eee)<<\ Š©S§tźŌ)k芔õ*ć.bšę£¾ī -Ww=‡†ÖwhlĶ_Üū꫚÷šüź/³ø †«ś‹)ĘĻū†įŖ¹V½oš¦>Z¼X=ö÷6šĖg±X^–T.©¢fsļ—Öģ—H*«9vļ»Ė9%Uym’dzmĶFüš;"ĄļˆæC üš;"ŠŽÜpĆ š6mZƒ×fΜ©nøĮ'ķ²ŁlJMMUii©/»š €vĘįp(++«Ö¹ćĒ«ØØČ×M."ŠĪ¤„„iÕŖUµĪ­Y³F#FŒšuӀˁ“3ćʍӗ_~)Ó4=ēÖ¬Y£±cĒÖ*·fĶM›6Méééš1c†¶oß.©z4Ʉ “bÅ MŸ>]'NŌĀ… %IYYY=z“§—Ė„ŌŌTåęę6Y'p¹!€v&%%EįįįŚ³g$éšįòX,JIIń”)++Ó /¼ §žzJĖ—/×Ō©SõĢ3ĻH’åp8”ŸŸÆüćzå•WōöŪoĖn·7łÜ¦ź.7"ŠŻxćZ½zµ¤źQ“&MŖu=,,LėÖ­ÓĄ%I#GŽTNNŽ Ɛ$†”©S§J’ś÷ļ/«ÕŖÓ§O7łĢóÕ \N}Ż@Ū»ńĘ5{öl=ņČ#śņĖ/õŅK/©²²ŅsŻ0 ½ńĘZæ~½‚ƒƒåt:%©Ö4›ØØ(ϾÕj=o°Ńœ:Ė“C]ŗtQRR’–-[¦°°0uļŽ]ŁŁŁžėė֭ӊ+ōį‡*66VYYYš9sęyė­ŒxO£im€/0eŚ©o¼Qoæżv½é2Ru„ččh•——kɒ%’¤ŅŅŅ&ėģŲ±£ ĆŠ$I’üē?eµZ/ØNĄD š8q¢l6›~õ«_5x-&&F7ß|³xąŻqĒ0`€īæ’ž&ėŒ‰‰Ń=÷Ü£yóęiśōéJJJRhhØ Ćhu€/XZyÅėŽ@Æ-XRˆ¤PIa’Ā%EŌģ»C½ŹøĖ‡˜¦łØÆ;@ĖÕ]¢”õ"[CĀ÷¾łj†ę=<_†aČp2 — Ɛiü¼o®škÕū¦iź£Å‹õŠcńqoæ|‹åeIå’*j6÷~iĶ~‰¤²šc÷¾»œSR•×&I¦×ÖlŒ~‡@ųąwD€ß!~‡@ųąwD€ß!~‡@ųąwD€ß!~‡@ųąwD€ß!~‡@ų@_7üUyy¹Ž’}ϱÅbQXX˜:wī¬aƆ)>>ŽsmįĀ… Õ¬Y³|Żģ6ŃŽŽæ<"ącV«Użū÷—Ėå’ĶfSvv¶Ž=ŖI“&©[·n’¤1cĘ( Ą×Mm•“'OjŊśŸ’ó*<<ü’>hDĄĒ5zōhĻń޽{µqćF}ūķ·ŗė®» ųŗ™­vģŲ±zē~Éļƒö@.3Ō¾}ūTTT¤üü|%''כb’››«mŪ¶Éf³Éb±(11Q£GVll¬$©  @ß’½l6›BCC5räHmŪ¶MÅÅÅśżļ/Ó4õÖ[o)66VcĒŽÕ† tīÜ9ÅĘĘźŚkÆUbb¢$©¢¢BŪ·o×±cĒTZZŖššpuéŅE©©© “$8qB?žų£ eš¦āć敚šŖ®]»jłņåŹĖĖ“$}šĮJMMÕšįĆė½ĆįŠ?ü ¼¼<9NuźŌI£FR\\ÜyŸ“‹ŖĄe(!!A’d·Ūė]«ØØŠźÕ«UPP ńćĒkĈŹÉÉŃŚµk%I.—K«V­Ņ©S§Ō·o_1Bū÷ļ—ĆįÕZżg Åb‘ÕjUYY™6oެž={*99YgĻžÕŗuė$I†ahłņåŚ³g’““5vģXuļŽ]ū÷ļ×_|!Ć0ät:µzõj¹\.?^ćĒ—išśöŪoåt:•––¦ØØ(IŅ„ Ō»wļzļc†V®\©ģģlõķŪWW_}µņóóµråJUTTœ÷@k0B.C¦iJRƒėl„„„čwæūLӔÅb‘aڱc‡ d†ņóóURR¢N:y¦ātéŅE‹-ŖUŸÅbQEE…ʏÆŲŲX†”æ’żļ²Ūķr:ŹĻĻWAA5vģXIRļŽ½e³Ł”——§S§N)66V¦iŖ¬¬LÅÅÅJLLTzzŗ«’ÜģŌ©“‚ƒƒ=mpÆ!ā-77W………źŚµ«RSS%UAū÷ļWNNŽ:wīÜä3€Öą·.3¦iźģٳ’¤˜˜˜z× ĆŠęĶ›uäČ•––zĀ÷½„„„’¤ččhĻłˆˆÖ*+UÆ_āžfcµZ®ŠŠ UUU©¤¤D’<ׯbbb”——'»Ż®äädM˜0AŪ·o×ęĶ›%U‡8}ūöÕčŃ£=#Ršā~Ndd¤ēÜ5×\£k®¹Ęs|”Ļź"€ĖĢŽ½{e·ŪķYĖĆ[ff¦öīŻ«^½ziōčŃ Š¢E‹TYY)Ižµ=¼§Ū8UUUµčĖ.ī€¢ØØØÖłĀĀBIÕ!‹T=j¤wļŽ*//י3g“k×.ķŪ·OÉÉÉJII9ļsÜõ{ĪķܹSŪ·oWZZšxĮĻź"«ŖŖŅʍe𦠔——§ĄĄ@7®ĮņīąĆįpččŃ£:räˆBBBTYY©ģģl]qÅ S~~¾6nÜØ„„eeeµx$E—.]ÆÓ§OkżśõźÜ¹³rss•ŸŸÆųųxuéŅEyyyZ»v­:wī¬>}śH’gŠŒ{zŒ{jĖīŻ»•’’R/äINNVLLŒNž<©­[·*22R»wļ–ÕjUĻž=›õ  „DĄĒ ĆŠŽ½{%I”””źŁ³§†īYXµ®čŌ©S:uź”Š‹‹5tčP õ*ć.bšę£¾ī -WwMŠŗĒóÕ½o¾š”yĻ—a2\† Ć%Ć0d?ęZõ¾išśhńb=ōŲ_|ÜŪ­ēt:õŽ{ļ)::Z3fĢšusąĒ,ĖĖ’Ź%UŌlīżŅšżIe5Ēī}w9§¤*ÆM’LÆ­Ł!ķŠŠ+TPP !C†(::ZYYY’Äz@ h‡®¾śjmٲEŪ·o—ĖåRTT”RSS5tčP_7 ø,ˆ@;Ō”CŻtÓM¾npŁācĶĄļˆæC ü“÷ŻwŸ,XŠąµ7ŽxC÷Żw_‹ź³ŁlJMMUii©$éłēŸ×¤I“dF‹źIMMÕ¾}ū.Ix·¹nū[ūŽhŸD ˜2eŠV®\)Ó4k7MS_|ń…n¹å–Õ§Õ«W+,,L†ač³Ļ>ӂ dµ^ś?%Ÿ{ī9żų揗¤~ļ÷FūE ķÄ 7Ü ¢¢"ķܹ³Öł;včܹsŗžśė[TŸÕjUBB‚,‹***är¹ć“wĖĪξdõ{æ7Ś/h'BCC5qāD­X±¢Öł+VhҤI •$mŪ¶Mwß}·næżv͚5Ė ģŪ·O7Żt“^zé%Ķž=»ÖŌ‘?żéO’¤{ļ½Wæ’żļõžūļ×zĘŅ„KuĻ=÷4پćĒkĀ„ Z±b…¦OŸ®‰'jįĀ…žė .ŌŌ©SuŪm·éÖ[oÕĀ… eš¦222”™™©§Ÿ~ZO<ń„$i͚5š6mšŅÓÓ5cĘ mß¾ż¼żÓŲ=uėÆ;efÓ¦Mš9s¦¦NŖ3fč»ļ¾kÖūąņF ķȔ)S“vķZ9NI’ÓéŌW_}„)S¦H’ŠŠŠōČ#h޼yśä“Oōļ’žļzä‘GTVV¦ąą`ŁķvÅĘĘź•W^©UļóĻ?/©:“˜1c†>žųćZk‰üė_’Ņōéӛl[`` ‡ņóóõüCƼņŠŽ~ūmŁķvķŁ³GĖ–-Ó| eĖ–éż÷ß×”C‡tüųq͟?_111zņÉ'õüóĻ«¬¬L/¼š‚žzź)-_¾\S§NÕ3Ļ<Ó䳛ŗ§nżŽ ōč£jžüłśē?’©'žxBśÓŸtöģŁ&ß—?hG† ¢ųųx}ūķ·’¤o¾łF;vŌ Aƒ$I[¶lQ§N”––&IJKKS\\œ¶mŪ&‹Å¢ņņrMŸ>]QQQ>cĀ„ r¹\ڰaƒ$éąĮƒŹĻĻo֔Ć04uźTIR’žżeµZuśōiEEEÉįpčÓO?Չ'­_|Q=zōØWGXX˜Ö­[§J’FŽ©œœœ&{mĶ=’“uėV%%%iųšį’¤Įƒ«K—.ڶm[“ļƒĖ_ Æh[īÅU'NœØ•+W*==ŻsĶf³)''§Ö9Ir8’¤   EFF6YæÕjÕ“iÓōüC×]w–/_®[n¹EAAAĶjŸwŲbµZe†®øā ½łę›Zŗt©-Z$Iŗķ¶Ū4{öģz‹ø†”7ŽxCėׯWpp°g4LŻÅd/ōwÅÅÅÕ:«‚‚‚&ß—?hg&Ož¬… źäɓںu«ž÷’žßžk ŗāŠ+ōį‡Ö»/;;»Ł ‰N:Uļ¾ū®Nœ8”Õ«Wėæžėæ.øŻW]u•ž|ņIIŅįƇ5ž|%%%éę›o®UnŻŗuZ±b…>üšCÅĘĘ*++K3gĪl²īÖÜćīÆĀĀĀZē Õ”C‡ ~_ųSf éŲ±£RSSõžĻ’ŃÕW_­ųųxϵ«Æ¾Z¹¹¹žEOž<©éÓ§ėܹs-zFLLŒ&NœØ?’łĻź×Ɵ’““/ØĶ+W®ŌŸ’ügUTTH’ŗvķŖŲŲXĻŽ   Oķv»¢¢¢­ņņr-Y²D’<‹ 6ä|÷x×ļ---Młłłž…gwģŲ”üü|9ņāüćį’!€vhŹ”)ڼy³g1U·˜˜eddč„—^Ņ­·ŽŖ?üįśŻļ~×ŖĻéΘ1C™™™š6mŚ·÷śėÆWxxø¦M›¦)S¦čĪ;ļŌŠ”C5yņdIRzzŗž~śiŻsĻ=š8q¢bbbtóĶ7ėŠwÜ”čžūļo“žóŻć]æ·øø8żõÆՋ/¾Ø©S§*##C/¾ųb½i4ųåiĶG•-^›T=ķƽK ‘*)LRø¤ˆš}÷qØWwłÓ4õugh¹ŗk04“&Ccė4ųāŽ7_ĶŠ¼‡ēĖ0 .C†į’a2Ÿ÷ ĆUs­zß4M}“x±zģ/>īķĖKff¦üq}öŁgõÖłc±X^–T.©¢fsļ—Öģ—H*«9vļ»Ė9%Uym’dzmĶĘo, Å‡žß’ūŗūī» Cš‹Äo- EŽ}÷]„§§«oß¾š>}ŗÆ›“ _™“ČģŁ³5{öl_7ø Œ~‡@ųąwD€ß!~‡@ųąwD€ß!~'Š× €_ŠÓ§Oūŗ Ś#D€ß!~‡@ųąwD€ßį+3ą#N§S+W®¬w>44T:tP’žżīėf^š{Y,…„„ØC‡źÓ§¢££/źó’õÆÉb±(==Ż×]Ė#DĄĒ¬V«zõź„^½z)%%E”””ŹÉÉѦM›d𦯛WĻ™3gō駟Ŗ¼¼¼YļÕ£G………)''Gß|óņóóŪüY@K1B|, @ƒ ņ›¦©5kÖØøøXÅÅÅ}DEK:uŖUļ•­={öhĒŽš4i’¬Öó’}sŸ“\fLÓōŒ q‡•••ŹŹŹR^^žŹŹŹ¢N:©’ž ’$•——+33SgΜQUU•āćć5hŠ EEE5«Ó4õŁgŸ)**JC‡ÕīŻ»URR¢ČČH :TqqqśžūļuöģYIŅŖU«tÕUW©oß¾ĶzÆ^½zéčŃ£*..VAA:tč ³gĻj’žż:wīœ,‹āāā|øFŒ!Ć0“cĒŽf÷åłź€ļ1B|Ģ0 egg×:׫W/õļß_’d³ŁTTT¤˜˜ÅĒĒĖ4M…‡‡+))I'NœĶf“ĖåRqq±uÕUWIŖŽ=ŖÓ§O+$$ä¼u$$$HŖžc~ųšįŠŠŠ’aśā‹/<F||¼gDĒŽŚāw•ŖG¾éę›o–iš²X,2MSYYY²Ūķ2 £Ńg5u{Da1b„ĀĀĀ$I*,,TAA:vģŲd.—K¦iŖ¢¢B„„„Š‹‹Óu×]§€€IÕ£KĪחMÖß# Ņäɓ%IYYYŚ·oŸŹŹŹ<<—••I’ģv»6mŚTėŽ€€9OŠążUšjąĄ’¤'Nœ·w ą™:bµZŖŹŹJ¹\.O@ѦiźÜ¹s’¤ČČH†”ĢĢLåęęŖ¼¼¼Ö²-&ŪÜ{=aˆ$EDDذ°Påååē­#44TƇWVV–öīŻėé‡=zhšąĮĶś÷HHHh²‹ÅŅfæ?høŒōźÕK‡Vnn®Īœ9£Ž;zBŽųųx]wŻu Žēžr‹Ćįšœ;xš ~śé'õļß_±±±ē­ćb;|ų°‡"""§ģģlegg«k×®4h¬V«VÆ^­ŖŖŖFė8räH³ī©ŖŖRyy¹gTIII‰$),,¬YutėÖMŻŗuSEE…ŠŠŠtčŠ!9rD:thÖæĒłźčŅ„‹Ož š3øŒčŖ«®ŅŽ;“gĻM˜0AńńńЉ‰‘ĶfÓ®]»”˜˜čYŌÓ4M7N:tPdd¤Īœ9£żū÷+,,L”ÅbQ—.]rŽ:‚ƒƒ›ŻFI:t萺téāYØ“.÷Ś(ī‘!6›M>|ø$yˆ²²2ååå)77WAAAŖŖŖŅɓ'Õ­[·zĻjĪ=RõhŒüQŻ»wWQQ‘ŠŠŠ®ųųxŁl¶&ė Ó¶mŪŌ”CO}Õ>‡††6ėßĆn·kėÖ­Öß#€ĖL÷īŻ•-»Ż®#GŽ(%%Ecƌń|ÕäŲ±c TBB‚®ŗź*O1zōheffźŲ±cŖ¬¬T\\œčł¼9u4GJJŠJJJtüųq…††6ˆxƍ¬äädõķŪ׳°jĻž=e³Łd³Łäp8Ō§OõīŻ[;vģŠO?ż¤äääzĻjĪ=†a(44TW\q…öķŪ§ņņr%$$hȐ!²Z­ē­ćśėÆ×•W^©cĒŽyZŒŒŌšįĆ=ӊĪח:t8oš­ÖLZ²xmRuØāŽ‚%…H •&)\RD;ū8Ō«Œ»|ˆišśŗ3“\ݵZū”±õ |qfhŽĆóe† —!ĆpÉ0 ™ĘĻū†įŖ¹V½oš¦>Z¼X3wŸ{ųåėŌ©ÓĖ’Ź%UŌlīżŅšżIe5Ēī}w9§¤*ÆM’LÆ­Łųģ.š;"Ąļ°†4Ó§Ÿ~źė&h#"ŠL- ą—‡)3ĄļˆæC ķDDD„¦OŸ.‹ÅŅ¢ūBCC5}śtÖŚ÷„óµcŚ“iŠŠŠņińĖF üš;|eŚÓ4Õ£Gõė×O!!!:xš öķŪ'IJLLŌąĮƒØŖŖ*ķܹSgĻžm²¾¤¤$ 4H2 C{÷īUnnn½r“'OÖęĶ›e³ŁŌ”CM˜0AėÖ­“ĶfS||¼F­Ļ?’¼Ńśāāā4fĢ8qB Śøqc­ś{÷ī­¾}ūŖŖŖJ‡öu7£`„“3aaaZµj•ÖÆ_Æžżū+88X!!!=z“vļŽ­U«Vi÷īŻ3fL“k…„„„hŌØQڹs§V­Z„üQ×\sBCCė•=sęŒ$I:tPAA:tčą9>}śt“õ†”ąą`UTThżśõµźŽˆˆŠŠ”Cµ~żz­^½Z-^'؋@ڋŢģģlIRAALÓTXX˜UVV¦Ó§OK’NŸ>­ŠŠ uģرѺ:uź¤ŅŅR9sF’d³Łäp8”˜˜XÆģéÓ§=HĒŽušąAOŻ ŹĻĻ?o}ŹĪĪVeee­ŗ;vģ(»Ż.»Ż.I:r䈯»ķSf ©(X,…††*""B“'O®u-((ØŃzBBBTQQQė\EE…BBBŌÆ_? 4H’“gĻ;vL”ÅbQTT”Nœ8”JŖ!²sēNuķŚµŃś$É0Œzm—¤ąą`9Nϱ÷>ŠZ"ąŹĖĖU\\¬/æü²Žµ†¦ĄHµĆ ·•——ėĉ:pą€¤źuK$Éår©K—.²Ūķ2MS%%%JNN–ÓéTYYY“õ5Åét*88øÖ=Ą…bŹ ųüü|EDDx¦±DDDčĘo¬44tOxxx­µ@ĀĆĆ=ÓnLÓō„!Rõ“™+Ƽ²Ö”˜¾}ūzŹŸÆ¾ĘŲl6EGG+&&F’Ō«WÆZĻZƒ"ąœN§6nÜØ!C†(((H¦ij’žżr:MŽŁ“i“† ęł2ĶʍėM{qĖĻĻWJJŠvļŽ-I:{ö¬ś÷ļļIŅT}µA’Š‹‹µgĻ;V.—KTee% «ā‚“ę·ĒāµIÕ”Š{ –")TR˜¤pI5ūīćPÆ2īņ!¦i>źėĪŠru’§¾”’¹oģó}qfhŽĆóe† —!ĆpÉ0 ™ĘĻū†įŖ¹V½oš¦>Z¼X]Rśłø·_¾;īøćeIå’*j6÷~iĶ~‰¤²šc÷¾»œSR•×&I¦×ÖlL™~‡@ųąwD€ßį+3ŠLćʍóu“FˆæC üSf ™}Żm„"ĄļˆæC üš;"ĄļˆæC üN Ææ»vķņu“h¦N:łŗ ŚSf€ß!~‡@ųąwD€ß!~‡@pQ<óĢ3:sęŒ$ÉįphΜ9*..–$={VO>łd£÷Śķv½šĀ ¾~…V9räˆęĪ«}ūö5Zęż÷ßמżū›U_II‰.\ŲģēŸ9sF>ų 222”‘‘”ēž{NĖ–-k³÷s¹\ść’xń:š!\żū÷×O?ż$Iśé§ŸŌ„K8p@’tąĄ 0Ą×MlRee„,XŠāūÖ­[§™3gź›o¾i“vDFFźŽ{ļmŃ=ÉÉɚ?¾ęϟÆ'žxBĒWfff›¼w@@€‚‚‚ŚäŻ|)Š× “Ożū÷׆ tŻu×饁š4i’öļ߯ŌŌT8p@iii2MSK–,ѹsē$I111ŗė®»źÕõłēŸėšįĆ –ĖåҤI“Ō«W/-Z“H%%%²X, ѬY³tčŠ!}łå—Љ‰Q^^žRRRdš¦ uīÜ9=ōŠC <ļs—-[¦Ć‡ė“O>Ńm·ŻÖą³jŻc·Ūe³Ł4fĢmŚ“I………Š‹‹“ÓéŌ[o½„€€………Éf³IŖ†Ī×Ö²²2½žśėzüńĒuąĄ­]»VQQQ*--Uii©ęĶ›×d@a±XŌ½{wŁl69½÷Ž{ REE…:vģØ3fhƆ ڽ{·¬V«āāā<ļ}ųšażę7æQrr²Īœ9£wŽyG?žøBCC}żėuĮ!ø(®¼ņJ9rD’tüųq9R¹¹¹’¤C‡©OŸ>Śŗu«4gĪĶ™3G’“cĒŽZõģŪ·O¹¹¹zšĮ5gĪĶ;WW^y„¶lŁ"«ÕŖūļæ_sęĢQXX˜¶lŁ"‹Å¢āābŻ}÷Żzä‘GōĶ7ßčWæś•ī½÷^ÅĘĘźčŃ£Ķzīµ×^«nŻŗéöŪooōYu}÷Żw7nœ$éśėÆ×·ß~+Iڲe‹:uź¤9sęč·æż­‡$5«­Ž,‹ t÷ŻwkΜ9ŠŒŒTvvv“’gĻžÕž={Ō§OEDDhīܹŗ÷Ž{5oŽ}śH’śöķ«½{÷Ŗ’ž’¤ŌŌTY,½žśėzė­·ōÖ[oÕ CÜuōčŃC/æü²^{ķ5½öŚkŹĢĢŌȑ#e†,X  Čår)--­YķjĪsćććuöģY½÷Ž{ĶzÖŗuė4jŌØZēF„ÆæžZW_}µrssõŚkÆéŻwßULLŒ'ˆø” ¤~ųAoæż¶>ūģ31Büq£ļ-IćʍÓʍ=S*++5žüKŽö¶fiå=Æ{½¶`I!’B%…I —Q³ļ>õ*ć.bšę£¾ī -W÷ŗ†žČkģ?_Üū꫚÷š|†!ĆeČ0\2 C¦ńó¾aøj®U©/֌߾ŽĒ½ \zyyyśųć5o޼6©ÆsēĪ/K*—TQ³¹÷KköK$•Õ»÷Żåœ’Ŗ¼6I2½¶fcŹ hК5k“k×.żö·æõuSځhФI“4iŅ$_7ć¢` ąwD€ßaŹ  M9sFĻ>ū¬ŗvķZėü”)SŌÆ_?_7ÆI%%%śšĆuļ½÷¶I}ļæ’¾FŽ©«®ŗź¢>»2/Wo/P`§Nžs”żś+,5Mö}ŖŲæiQ}Ī#Ł*ŻŗE±wÜUė¼QźhU}—#@›KNNÖ£žņ>&ŁfaČ„~vP—®ŠŸ]’žf‡••*śĒÅμ[’d±Ō’0­5<¢]„!ązį…4{öl%&&źŌ©Sśļ’žo=śč£Z²d‰Ī;'IЉ‰Ń]wŻ„ 6h÷īŻ²Z­²ŪķśĶo~£ääd9sFļ¼óŽ}ōQ-Z“H%%%²X, ѬY³tčŠ!­]»VQQQ*--Uii©ęĶ›§ĄĄĄŸćĶn·ėõ×_×ć?®ĢĢL-_¾\‹E·ÜrK­Ń-‡Cļ½÷ž‚‚‚TQQ”Ž;jƌr:zė­· °°0Łl6Iҁōå—_*&&FyyyJII‘iš*,,Ō¹sēōŠC©¬¬Ģóģ4ųAAA-źo£¤X…¼§„9óTŗé{„„мa’ŠW­P@\¼ĀÆõ󻳅*OSńŖ éŪO®»ģŸ~"£øX†³Bń³fĖØ(÷ŌWqš€JÖ})ɢ؉7*8„·Æ½Z„@Šęrss•‘‘QėÜ’ųG3F›7o֔)S“iÓ&]wŻuŚŗu«4gĪIŅāŋµcĒY,Y,Żwß}ڶm›¾ūī;͘1C7nŌŲ±cµeĖY­VŻ’ż’¤%K–hĖ–-JHHPAAxąY,-\øPŁŁŁ²Ūķ >gŲ°a ¾Cff¦F„”C‡zB·ˆˆĶ;×süÜsĻ©  @ūöķS§N4mŚ4IҳĻ>+©z“Eqq±žżß’].—KųĆōģ³Ļ*..No½õ–Ž=ŖN^Ó],KƒļŠŌ”£Ź“9²-|Ķs>ņ…\ŁēēćQ×ŖčĆæ«tóF¹Š õėɵīqµ\gmŠśõd9dĖ(q(śż^²XT“t±œ'Ž)0ńē6:f)lXŖBÆź/W±Ż×ær-F hsÉÉɚ?~½óiiiśė_’Ŗ›o¾Y»vķŅO<”/¾ųBYYYZ°`A½ņī`Ų°aZ¾|¹***“gĻ=öŲcZ¹r„ŗuėVė™§OŸVBB‚’““=S>¢¢¢ät:•——×čs2iŅ$}üńĒŚ“i“īøćŽZ× µxńbEDDČb±čܹsr:²Łlµ‚äädĻ~RR’$) @QQQŠ‹‹“$………Éét6Ų‡uß”) M™1JŠkGLøA¶’|IœÆó ģ”$Õ<ß&ÓYYėzųµcU¼j…ʶoUōä[šÕ§—Ą%¢nŻŗiõźÕźÓ§‚ƒƒ•œœ,‡Ć”™3gÖ*»qćFY­ÕG PjjŖ–.]Ŗ+ƼRAAAJJJRvv¶§|NNŽRRR}vcĻiĢńćĒõ›ßüF‡Öڵkk­ļ±aĆõķŪW7Üpƒ‡233eš¦āāā”ŸŸ/I2MS999¾īņŸ†ŠW­PÜož—ģ+’„ų’u'š$Y$™®fWW•›«˜[¦ŹyüøÖ’āÖ!“¹ÜÜ\½ųā‹µĪ9R&Lе×^«—^zI?žø$)55U‡Ņ믿īY#ćĪ;ļ¬WēøqćōŲcéÉ'ŸōŌwšąAψˆˆ„„„銔C ¶©±ēDGG7X¾¼¼\’ń’!«ÕŖnø”ÖµAƒiŃ¢E:räˆĀĆĆ5bÄ}üńĒŗ÷Ž{õę›oźµ×^ShhØbbbdšf›õ«aść’ØW^y„Å÷–¬]­ŠƒŅ€Ŗ T²vµ"'žŚs= &VU¶ūd©Ā†8o}fE¹ žū]Y¬VEŒ¾¶ĶŽńR±“ņ‹×½^[°¤I”’Ā$…KŠØŁw‡z•q—1Mó—·ü0€zģ5ōĒ_cśāŽ7_ĶŠ¼‡ēĖ0 .C†į’a2Ÿ÷ ĆUs­zß4M}“x±füö÷>īm’–——§?žXóęĶóuSp:wīü²¤rI5›{æ“fæDRYͱ{ß]Ī)©Źk“$Ókk6Fˆ.{k֬Ѯ]»ōŪßžÖ×MA;A øģMš4I“&Mņu3ŠŽX}Żą÷Śn”•f"~ēb"—<į8FˆæC .wm>…ÆĢ@Ūµk—Æ›\rC† i‹j.ŁŅˆ˜’,—Ŗ”šKŃFøˆ.Ŕ³‘}5ć<šOĶÉ Z'°†ø”.‹A+1›q|YtøäĢ:›Ō¼&mębŽi,©ū‚#ų·¦Ā‹’“U ŅX°Ńܗ Ą?˜-øvŃņ‚¶!ŅX(ŅŠØSŒĄ5gʌŁÄ=ģB>»ėŻ †Øóœoģ„ą¢śæeųŗ ݉'”‘‘”.]ŗxĪ «īŻ»K’***tŻu×iģŲ±õź·ŁlśÆ’ś/%&&jÖ¬YM¶å?’ó?Ö`_­\¹Rū÷ļ—ÅbQæ~żtÓM7µä5M5>XāBg 4[["Ķ}ĮĘĪmń"Š\=ö—ßóņ_Ÿõu³[¬GzųᇛU¶²²Rļ¼óŽęĢ™ćėfkŻŗuš9s¦¾łę›6D$Éb±“ź¾ŅŅR½ńĘŗ’žūÕ­[7†”wß}W{öģѐ!C.zūzöģ©?üį’Ŗƒ™7ŽxCśÓŸ$IÉÉɚ?¾$©¼¼\?žxƒČ×_­1cĘčąĮƒM¶įūļæo“‡Vvv¶yäIŅüĒčȑ#źŁ³gs_ŃTÓ”ˆt f–\Ģ@¤±6źütļĄ%StöT³Ė–•–ųŗ¹mf÷īŻŹĢĢŌ]wŻ%IzēwtŻu×iēĪ:|ų°>łäŻvŪmZ“h‘JJJd±X¢Y³f銔CZ»v­¢¢¢TZZŖŅŅRĶ›7OAAAžś Ćhõ½’d·Ūe³Ł4fĢmŚ“I………Š‹‹Ó¾}ūōÕW_)22R„„„2 C÷Ž{ÆŖŖŖōŽ{ļ)((HźŲ±£f̘!IśüóĻuųšaĖåriҤI’¤sēĪéļ’»ģv»ŹĖĖõąƒ*00PK–,ѹsē$I111ž>rŪ³g  nŻŗI’¬V«ī¹ēž&ß;33³ĮžīÓ§O‹ŚWW·nŻ4dČķŚµK}śō©Õ’ĒWRRRƒ’žÓ¦MSfff“æ#6›M›7oÖ“iÓōÕW_Õ»žÓO?iŲ°ažć”C‡ź§Ÿ~jI R7؛\’Amˆ˜°ˆ@;vģ˜^|ńEĻńŲ±cŽ`ŁkƽVłłłŗżöŪµyófY­VŻ’ż’¤%K–hĖ–-JHHPAAxąY,-\øPŁŁŁź×ÆŸ§ž-[¶“ś^Iśī»ļ4nÜ8IŅõ×_ÆoæżV·Žz«,‹ 4wī\Y­V-]ŗT[¶lŃu×]§¹sēzīī¹ēTPP S§N)77·^˜••„’’żįÕjÕ;ļ¼£ģģlŁķvxFČ,^¼X;vģØõ‡aa”ģæĘŽ;""¢ĮņūöķkQūĀĀĀźÕįīSIŹĶĶÕßžö7IRII‰ĘŒӼߛ>ų@3gĪ”ĖåjšŗĆįP§N<Ēįįį:uŖł£@𻵙 DĪטę†!L™€6ÖŠ”™Ż»wŸ÷¾üü|Ļ(©z:ĘéÓ§• äädĻTŠØØ(9Ī6»×åriė֭Љ‰Ń† $U‡ééé’¤īŻ»{Öźčܹ³ TXXØÅ‹+""B‹EēĪ“ÓéŌɓ'=kjŌ•œœģ©'<<\N§SyyyŹŹŹŅ‚ ķ—ččh:tØE}ÖŲØ‰–¶Æ”@äĢ™3žg&''ל·~ūķ·µsēN :ō¼’ŽŽ¾śź+ 0@ÉÉÉ:qāDƒeÜ£t܇¢¢¢Zņ˜ĘF…4'ühźó¼-Қ@Ĕdią\ŻkhīūšĖėŲØ9\dĮĮĮr8’$Ó4uņäIĻ5ĆØ¼Ÿ””¤ģģlĻłœœ„¤¤4«ž ¹wūöķ’üs-X°@JLL”išŠ×ٳgõŽ{ļiÖ¬Y:xš g“DDD„ŅŅŅįmäȑ­¾wŻŗuŗūī»k5j”Ž{ļ=ŻrĖ- ×ū￯ŅŅR¹\.ŻrĖ-ŹĖĖÓ¢E‹täČ…‡‡kĈśųć5oŽ<>|X/æü²g’ńćĒ×[³Ä-55U‡Ņ믿ī)sēw*::ŚS&""BsēĪÕ?žńĻč–hĈ’Ōą{WUU5Ųßżū÷oQū¤Ÿæ¾c†¬V«ęĢ™£ˆˆ•––*77WÕ_OŖŖŖR=<ķrs¹\zé„—äp8TRR¢ŒŒ Ż~ūķźŃ£‡žųĒ?ź•W^Ń-·Üā)āÄ ­Y³F&Laž2=zōPß¾}•‘‘!‹Å¢Įƒ×Ó īī­”µDšMҦ³KZ·“®äż=”U+’‚k¶I”’Ā$…×ü õŚ‚ėn¦i>ߖ/ąŅ0M³ÉćĘĪłźŽ7_ĶŠCż„Ö¢Ŗ …"7ŽT=M£čģ)••–č£Å‹5ć·ææ4Šzöļ߯­[·ž÷S±øüuīÜł)I’œ5?Żūe’Źk~ŗ7GĶ9w§ŖC”*՞mŅāmó”äŸ5µNˆ÷ōWżŖ‹ŚŪŠ„ŗ#A¼ĆmĪfxĻ©Rķģ ±5FŚLk‘ʆ­4„øŲ÷CXC€O¹CĖÓUW]ÅčöĆÕĄę½¼FŻ`¤% ­6[[­!r¾TŻH•ŖC˜€šŸ–šŸŒąsīP„0øØ*½¶Ŗ:›w†P7qk“uHŪrQUļF֝Såõ3 ę„Żė—XŌśµL M†S?"Nż†x$u§Ō4ōµ™ r!HcŸß­ˆTÕ<Ē©ŸG…‚ąŸŖōs(R÷gŻŃ"uש«Õ늓å‘ĘOu§<īÄŻXļ€KbȰįzłÆĻźĪ»ījö=-^¬!Ɔūŗé@{įž²Œ;©Šøƒw¦PwM‘6q”HŻ…MbUķ‘!Ŗs€KfŲš’ŖCŽę2lø† ”rV?Ś‚÷§vėŽ©;R¤”0¤M¾:ÓŚi+Ž÷y/’jUuČ )HRpĶq¤Æż ÆėīŸĮu®»ė ōŖ; f³ØvŠŅ֟ 3ÕųWfėĪńžćżQwtHUóuG‹8U“ˆ{}ļ6µH[~eĘPu8įžén¬ōs€āŻpļ«ūew™@Õ’2wbõŖßRēY ķ˜ ü¬ū·|CZq©vĄŃTųŃŠ×gÜõy?ó‚µe ā^Ä;±Ō)Sw1”`ÕO“źvžUµGˆøĆwb!—JCSWźŽ1U;ń;›"ćō*[÷3¼ē[\µÅŚ"ń^ ÄŠxņPē½_¢īĖø;Ķż‰^÷”‹ź„¦©ÆÕ’Š6Ģ&Ī× E¼3ŗ\q©„x uG†44 å‚C‘¶üʌTڌ÷|ž5~ŌER·ó¼f•šCAøųĢö› E¼× ńž"S”Ÿ’öw—ó¾Æn}m¦­§ĢHµ§ĢŌ-Sw¾Qcičē‘!īµC¤śAHS#DĄÅS÷ļüŗ_”­;JÄ{ʌ÷ļ$Ž ¦ŗgŌ C|:e¦īČļsī†ZUū³8uĖŗ54B$ ę„½æ*#ÕFŌHąājl CŻé3U^?½æ6ćB\uŽė~©¦9aH«’¶ZC¤īčļ[U{5ŲŗmhtH€~U¼×‘ųš —‹†‚‘†Ymčó»Žē¼Ć÷Ø—źOĆiģ¹-֖kˆx#ŽĮ‡wbõ*_÷+4ŽeÕĻ_˜ih½ę†!„&“^K‚‡†ÖihqUļ`Ä}ŽPĆ£CZ‹“M“õ¢Ŗuē=bÄnøĻy—Æūešż¼˜źłÖ !ōąŅhĪ”•ĘF‰x"M! }™¶Ķ‚· DźŽ±ØįQ"nī²Öü h ³¼;©”Ń!­%.ž¦÷Ō—†F‹øTՆŗĻi“#cʌ»1Žū޼_Ī{DˆwR7 ih1Õ DTø°ŃM…M}†·%£Bšśjm«]h ŅŠ×fź^38ēżļņ^@µ”@D<p€K«©é3Žė‰Ö Eź~AĘTÓaHKžßlm½†HC!HCÜįGŻĻōZŲ¤¦G††péo=‘ŗĮFŻ#ē AūŁ&Ś*Lh*¤°4ń³±š£±0¤±6Špé˜Ķ8ßP ŃœŃ ĶY+ä‚Ć‘¶ Ī\XšńóBF„ŠpńµdKc”ˆšńó|u^¶š3zĆržżó-œJšĄå©©š¢„_ŒiĪ'~[ķb„ -ĮŃÜQ%—²ż yĪP“f“Gs¦ć\°‹(\HAĄ/Os‹Ö„m„ø]ģp”%õ·¦-„#ųNkŠęŽsQ‚·K(\¬/Śßk‹ć¢† Ž|.ląß.YR×åJ\īķóYą\"’£”.ΧfR%tEXtdate:create2013-09-04T19:29:54+04:00Ä]ē`%tEXtdate:modify2013-09-04T19:29:54+04:00µ_ÜIEND®B`‚apache-couchdb-1.6.0/share/doc/build/html/_images/intro-tour-05.png0000644000175000001440000015102212332105522024707 0ustar00djcusers00000000000000‰PNG  IHDRB6T”-”gAMA± üa cHRMz&€„ś€ču0ź`:˜pœŗQ<bKGDłC»€IDATxŚģŻw|õĒńWŅ= eʦ,-» †2UT”āŽ‚ā”Ÿ{R÷–¢‚Ø CEQFY‚@eŠBĖ^ZŗWņū#MHŪ$MgJū~>g/w÷÷½Kå>ż~æ""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""RĖ<]3¼~"""""""RœŁÓpʓ9DDDDDDDj'JŖ2Qe)x"""""""Rż”7°Qe‘Ź,”&’²ŌE‘ŖW–Ą…»i*5(RY„’ņ5TRZ©z%/ĢeHW)‘Ź*J±ŻPŹĻUQ)YiƒęRģw·œR«č@BiƒŪÜĶĻÓē,""""""r¦«Œ9>Ģö¹ŚęN^åV‘Aw{wøśY–ĄHeœ‹ˆˆˆˆˆˆˆVš f?ķsµ^Rłn«ØąAiz} |Ų/8łģŖ¾ €ˆˆˆˆˆˆˆT’†°8 ~] tWe»Ķ» ¬=?죓ķĪņpU¾ˆˆˆˆˆˆˆT.WŠ¢Į … ¦"Ēø*ĆPä8ƒé\Ŗˆ@ˆ½Ņ?ģ Ę"ėĪ"ąŗ÷‰ˆˆˆˆˆˆˆT.wę)ō0Ł­(±Ogpņ³B”7RÖ!0E ^vėEƒ"Ųżtw¾wö‹ˆˆˆˆˆˆˆsīĢ āl"Ō¢A|NC¬±ūżĪŹp )W`¤¢{„X9 ‚8 €Ų/Eƒ"„/DDDDDDDDŖŽ£!1ÖÅ>ųa,ųœOįēyė>ū€ˆŁī˜ }u.”/āĪkpķ/ Aģ!Žv?C äa2"""""""RńJš ÕŗnßÄŗX ¹Xžćó‹äa €) ±ŖŠ^!•Ń#ÄÕ$ØöAūą‡w‘Ļīö qU)w‚ ΆÄX Ög{pž¼nr±æB{…Td ¤hO ū FŃł?ģ{‚XJ†@é""""""""Rń½5ĘQo¼‚„čó½żŗ5X’_$/ūÉU•Y&e „8žā(hQ4b rŲB|8ń.rŒ}äČѤ©Ž>‹ˆˆˆˆˆˆHÅsöŚ\Gk€£č³½}ÜĄšŽT$Oė\"F æU¦ÜĆc*»Gˆõ„­s„Ų/öŠCŠNžjßXź"""""""ā9Eßc²ūY4’[$}`,=FģŸļ­é¬ØĄWčVT ÄXd½čkqķ{wćh)±•nŃIXķ)0"""""""RyJóŗ\k@ĆŗXķaĄ )šÆõ2Ö|ķ'S-³Šīāh^ū9?Ķ āl±žq<łŖ£`ˆ}}DDDDDDD¤ģ\½-¦čR“7ˆ5a?,Ę^®ŸķĶEöW‹!Ž^m[4ā(R4āĖéž Ž!ö(p±ÆˆˆˆˆˆˆˆT ³“mE Öa,ö=B¬C^Ķ%jŻ–GńQ E˰„”{āԊ~}®}pĀŁ\ Öu_»Ÿ>vŸ‹¾=¦č0ū@‹ę ©|öūł@Šö±m®7–@‡–yBŠ>ĖŪ?ēSt©0e „œl³n·ļÅQ“÷‡/%Ļ bq q6\FDDDDDDD*ž³·Ć „ŲĻb’ŚÜ¢¼8$)śG=Mœ )õ™Šž#ÄYß"?‹?"""fW`]DDDDDD*ÄīŻ»8qā„§«"rF3 c8=/HѹC¬ėöAūyF*¬WHEBģ#7öž’ę)ŗˆˆˆˆˆˆˆHĶåGń"ö£;ģ{—ä;8ĘoČw³<‡**bżiććlxŒÆŻRt(ŒˆˆˆˆˆˆˆŌ\~ ¬u’Ō¢“¬Zć öA‘ræ:*’õ¹öó|8ė ¢@ˆˆˆˆˆˆˆHĶg RōÅ'öó‹Xƒ Eć ÖyBŹ=D¦¢Eƒ E{„ŲDоEF‘šĻ×nŻ~.ūˆ5†PtųL¹‡ÄXUTĀčą³żbqō*]BDDDDDDDj6ūgkÄK€Ć~š ūÅ^… 1–7Šæ¶Öh·ŻQ0ÄŃŗ!"""""""5›7§cö£GAģ_ŹbĻąVI.TD ÄQ~E'>):lĘz‚ÖW DDDDDDD¤f³-b,²īčm2Ī‚!åRŽĢ .¶ŪĻžZō„ģ{…xQń©^ģē’°ĘŠŽ&ĒÆÖµW®^!żÖG?ķƒEڟ¼”A:uHMMõt5Ä]©ĶrrrČŹŹ*w>ƒąą` †r÷†Ļ+Ś) w¤°ļPQ“7H…ż(O Äąd›}Ō¦čŗõĊF})£€€8zōا«"E茈ˆˆHm–••Å޽{ )W>999$%%ŃŗukŒFu$9Ćķła0ą<¦ą,žP¦WéVäės‹®œ,E{„8š ¶DuZwcč€óČO9E®Ł‹ąŗ^lZü›dTŠ)¹ēŽ'īę½—>ØŅ2ķ=z”ˆˆŪzE1x1ųź1ō¹øŸLyš]™yn„3ś4dŠŠa¶t y”…>»›Oe*ZĒ¢uņņk͐WÓ3¼9?žx™Ė©¬kcÕēŽhīŗ(„­»Qæu žœ>…æ)Ųk |šx¢Ÿøƒ9£šåŃ ŒŽ”<ščóŒy w÷ļÉśŌ‡ł.]»Óé61šsIƑ%–Śé*ž÷šeœHĻMŸ’Ć9·~É[7·cü“hⵕž=²•ß÷ÕŁ¶uWå9k“’ī3g÷Ø;÷™«ś8ć*?W÷ƒ«t""Ru|}}éÕ«lٲ….]ŗ`6—鏡"RAöļßĻŃ£G9uźĶ›7',, w’q<1*røš#ÄŗæŹ{„Jųl_qgo‘):Č-ē]wé[fŚ‚ ¹i‰ĢŁ’Ķ ×ŸKāŅŗÜuóåųŲÄױ߳;ǟQcļ¦[»~œž9ėö3:źZźä¤æ}9“§ņ2ņ6zœēĆŌy{¹&²ķ»¶ēŲĮżŽół"–śē_GŸ ŪŚzxł5-–rGŌ`|wo`ęĢģÉĪgüS3óÅ7É1ų3ōŚ»ø¤S?~˚]e›Oāȑ#4hŠ āøĶ–æŠ6¾p(}:œE“ĘĮÄĻ’œß¶px¾;RrléŠęc»)¼ė1ųšQ„ę$ B½Ž3ū»E¤ä¾‡ė“ėåvŪ­Żćķ8O“”Ųu­—·•—Ž™SØ,/榌¼éZZꑒ™ĆĮ-VHVڵn¹²ÆmŻ”›Š)/ɲž—Ģ“·ŻĄõϽ¦łŌ»č&bF\Hhhc|S61yŅ‹ü[Š3Ę\h:ąÖæ÷x‰eœąĶŅTĖw27õ_ŒŽ”öWńoÜĀóOgęŠ¢gR¶}®źé*Żu̓xj_—, Õ77Į;O”˜ĪžÜ3ģĆĖē<·Źż>ƒ°?ø#Y«žĒ’fnĄ;šlž‰¦aęQźŌƒ&=ĮŖ£™%¶å„O!įĖ;Č5ł© r‡[×`ōˆÖ¬ŠŚĄž…æÓīó‘0ķZöŖóŠGG»UžÓ6)į>sy–pŸ9««öt•Ÿ«ūĮU:©zįįįųųųš÷ßÓ®];üüü0™LåĻXDܖ››Ė’żĒšöö&//={ö——G§NÜÉĀQ/g=BŠr0)µ²²3øXwTiG'dÄõI:Õ»I '7(¶żÄ¦“6ķCŹĪ8fü~”›–³+3s~?ż“½?}͚]©t¹1Š&{šé“Xf®öįŚ[z€ŁÄO߆·_K.Æ»‘O?üŽ”-?;Ļēæ~śž³Bå;Ź7u×j¾YsŒW°';Ÿąn„åÖep³@̦L~]“…ƒæ}[ę @ff¦mRĪ–-[Ņøqć2ēåČ9éæūŁG¼7k7ż®įņ|ŻŃyĢ“?¹˜ßĶaĪw3Xšr·>»Ųq„i;§y:ø®Ž>¾ÅŹź:6аŌ¼žö{|ņÉ'ģiܧBŚ®²ÆĮčK“¶pļżxåŽ'ŻN7źœķLøļ.¢ĘŽdŚįó‰yķR‡Ē]9¾ ļü“ģV™ĻĪŁĮŻÆM cƒ ¾k<±Ļ>`Ū×ģ²)“ĶžģāÓ•uŸ«zŗJ·## ›ąZßŗ—ŗ¼f—÷ąąŅWŻJ7ą¢.<õōs<÷Ģ· ¾ē¹ÓŪ_™J‡-Æqσxņk?¦¼sŗ§«¶¼®Y{ÖsX/WézÕń'!ĖģŹĖJĄ/¤Ÿm_k8=WWå¹jp’>sÄŁ}ę¬>®ŚÓU~®īWéDD¤źFŗvķJ=Ų¶m999x{WVw)*##ƒķŪ·są€åߎguĶ›7ąĄüż÷ßdd”8U…£Žī.Ž”)(R™³ 9Ŗ°£‰‘RV¾¾‘¼ŌāsMä„ęaōmĄ‘+8«ļ¶}m®lĻ÷-ĶėĢ?k¶{; {[*ų+ęžMIäenē¹7æv™õx+gł[ż'#Ū[źŽ­'?~³Žƒ-Ÿėu=‡ ,wc'''ŪÖ+ś{żvKŠ)óš6¼üŪ•x¾%Ų”.[ײ}>øvõ:_īšXwŪĪež®kQż[ó÷Ƨ‡Gü»l]…µ_e^›'ŒG&ŻC³S’ń_)ęĒłķŪÓ=^~’ō7œk±c¼ĻaDś4N™?ĆY™ėߚĎę}¹gźLnl°9+,÷†—[žJęńŸöū¦—uŸ«z–”ī™§?#ā…·yūW™8ŗ-Ö¹šŻ-Ļ'ų<^“É„ēV»•īŽĮ}Ł—c"?g?^~­mŪo oĄźŁ;8æ’:­n(±-šūzŃbģŻ<ņx4_ĢłŠ›/näVŗz>R z]™óOaō®ŗ SĻå‘G棒½Ģ§ļæHĻ&n•ē¬MJsŸ9ćģ>sVWķé*?g÷CIéDDÄsڶmĖ€Ųŗu+¹¹¹åĻPDJ”››ĖęĶ›m=Ü[·nMūöķiß¾½-rōčQvģŲįĪ÷ŅŁdØUöjØŖ ”ŗź!āhæKI¹&¼ėxĆį"'SĒSŽ%H‘›¶‘>Shš»sCøĢgoåZ”śé0|   ¶ķŲ[(ŸĆ9§®ņ)ŹY¾Ł§Vr*ōqŒė8ļ‚ü¶źgz6›DńoŚuĖć÷Ī&¬²l#Vņ0N?$”ŌŽĪ4ņ5šœŅ”{£ļY<żōÓ¶ķĻ?’¼Ūmē*O+ūėZT#Iv×5?·äæ€W/¾héapĪČ©|üåĆō»ś%·Ņķ·k‹üģxłµ(vĢY=`ūĻŪī¬ĢŃ1±ųr/wĢŁĖš§f2żtß5“+£_ệĘįč[SÖ}®źYRŗ#«>ćĘU–Ž\gŻĀCv¹]žĮÄCļ?Χ·ßĪžģüÓ5ģ>Š'néőv“fjTčµ­ü¼øäńēiSpß­X½Ł¶ĻY[Ļ3ńēō÷ygo*/~y/Mę‹÷•˜īD®™:^–ņ ^u óøūĪÓćSšö}Žo>˜¾ƒŸ+±`fąY­hæ’w~3ēńÓĪ|5ÆO‹ĢU¬¦ü¬sPģŪ·ÆJ^ŁZR;:s$ĒD}ŸÓ‘ŒŽõ0åXźūüóĻ—©ķ\åiåź‘ĒóL4,”¾>„*®MĀā¹<ž<ąŽCZ+?oÖb "ył·$?»xėŅ;ŪńĪMĪBE˼·{CŽž|Ģy,|{*O.~˜Iהo@7ĄčŪ €'Ÿ|’Ć+?£q÷}¾ņˆÓzvu3@żó/ęŌßŗ™ĪĄč)s(ę~~ݟīVy_˜Ä†ŪńęĪd|ėöą–qCN·_V«^zš„S”³¶Xž’M£‚{5}Ļæxu+ŻŖSY“õ÷²ńöoKvŹ ‡×õų¦Eų7|x®ÄņœµIiī³’½ĻœÕĒU{ŗŹĻŁżPšt""RµX½z5=zō 00'N”?SqČ:&55oooŚ·o_(b†··7;vģ 33“Ķ›7Ó©S'źÖ­[ōPg/V)é8ūķåVYCcÜĆSę‰N6³ˆ .£h|zVZŸą6Œ>׏ŸfŽplķb÷ķĀå½O°ģx–mū¢m' æŅśź-繩`Õ*r–½#¼KŹŲūŪnŗ\>’mq–‡ążæžI§įW“²|?åU§NŪz…>h9?«‚?*»hĒ"éŠ|žu[2ēöhfĖÆÉÅē’²s±ÓjøÓv.ótt]‹Ō)nO]ś··ķėŁ c9æf•vm€÷æ{Ńö®ž ŅöĢ*|€Į2ŠO”_3–3¾ź¦ m›zŻ1ć}^(©—_7zĶ&!+ßķ2’HĶ”KĖ üO։„¼üŅK¼ų⋼ų⋼öÖ¼öŅ‹|¾ņH™÷¹ŖgIé^}ų"[ūÜt_¾üßj·Ņuæķmڬ~’/6Œ\ūń‚Ó{Iϰ ćkzÉeĄé_ŗļĒāŹū¬ót¹|Āė%¶%Ąœ’Ņe\‚ĀĪ!抷Ņ}?w½‡X‚r-‡öäæoęŚö}<ē[½B: }’l·ŹsÖ&īŽgļŃī3gõq՞®ņsv?””NDDh¼‚ßUŠN݆pɹm9»ót©sÆ¾YC–“.ī“Ż‰[ēi6»®‡³C Õńų®]ģųkĶ{ åŹ^œŪõ\ņ¶Ķ§Ķy=häĖæ’ķ²¼”¢š\Ū5j3”§®ėOē {se·Lžč]Ž MøųĘńŒ¾ź6ĪļԜVmźć_?›æ¶§óĄćÆŃ„­™»¾;ÅKߏčėo”»÷ß<ńČ·tVÉ\šĻ ~ų'Åķ2ׯ?ĪČĒīę¢. ¹Ŗ%Ÿ>ö»’OūŖ>’ūī¹…ĪmB8ÆQ ›×­·½)جūœÕÓUŗ†C§pė„įōŗr4) ¢łōn„›÷ŃĪī3’[o½•[o»ƒŽgåšÉg_¹L·<­ ÷>6žž_kߦĆ7ŠÉk+Kć÷q`Õ2¼G¢FråU#šŽō>«·-±-“·,”į•O0²÷\yY>xč Žć*݉æ–Óī¦gŲ½[%2éõŸÉ.xõ ¹õPæ6’®õ柎F^8•ƒ™ł%–ēØM>›ž£[÷™£{ōĻĶJ¼ĻœÕĒU{ŗŹĻÕżą*ˆˆ”,''‡¼¼<:tčP!łmŪ¶æžś‹žżūćļļ_%= ­Nž“ĢK÷ŲcUY™"ÕAbb"&“‰ .ø€zõź•x|pp0AAA„††Z앺S¦LłČņ ~Z×­Kn‘Åž8S‘„ĢŹ])±lų~€?Ś-‹ĮāgæDDDxėŒéuųųƤßó §«!•¬ŚBDDDDDDŖŹųŪpūŲM’ąĻų?<]å3ŽßŻwüŲCÕ®ˆ+žƒÆ =$R’=]©D „ˆˆˆˆˆH­“ėßmž®BdģŚ•:¼Uį·V‰ŠPünø–ģ>ötM¤éõ¹""""""R!„z+;3ƒ ļ¹ĆÓUJ¦!"""""Rėåää°yó6""Ā=]·łęfį“—cūģ••Vįef„‘ŸyŖÄć¼śōĮkŚg[¶št³”›±e ōļAÖĀEž®J…IØėé*T+ „ˆˆˆˆˆH­–““Ć‚įųńdēęŃó’īž®’[¼LłųēŲ½Ķ&?§ģ™9į“ŸƒOŽ‹7ꄆĀäÉ0aBş`|< ÉÉ„O;ujń:EGƔ)ngį_ńgä1 „¦”1"""""R«ż¾fĒŸ`óę-$ģ9ąé*†‡„„ź˜8ʏ÷`ćHu¦@ˆˆˆˆˆˆŌZqĖWńĻĪ’ mūõ×ßŲ·’§«V}…†Āܹ–„2ŽSŽ ˆUl,tļ^ž|¤ĘŃŠ©µ"ūõęŚkÆ„NŻŠbūŽ9Hź©dOW±z™0Į2¦²^‰[QAūüŗuƒŁ³«ØäL @ˆˆˆˆˆˆŌjGä葃ž®FõÓ¦Addå•QŃA«ÄDK¾įį•Ww9£hhŒˆˆˆˆˆˆ87y²e.31b•œ qq•W9£ØGˆˆˆˆˆˆHMšZńyVÖ< ö¬=64—‡TBDDDDD¤ÖŁ“ńOW”āÅĒ[^]qyVv$9FVDŖ”!"""""Rėü_!S¦X†°Tę0–Š’œlé ļéšH-£@ˆˆˆˆˆˆŌ*}#rųšįR„iҤ‰§«ķ¾#,szTvoŽņPD~ü8Ē'++‹¤¤$V¬XįéjK98ŗęĮĮĮ\xį…\xį…¶€ˆ•®yÅ(Śīžžž„††2`Ą @hh(žžž¶żjw)ėżęļļocŻ®ūMDDj2c×®¾ōõ6o ŽŹßøūvŒgJ,=V&Lšt-N‹ˆ€iÓąäIĖĻįĆańbĖO©ńĪų@HzzŗĆ.ÓöĢf3DDDŸŸXžz˜žžīéźK8»ęyyyŌ­[—ŗuė’——Wlæ®yłmwźÖ­KĻž=m£={ö¤nŻŗ…VÕīRö÷[pp0Ż»w§gĻžąļļææ?ōģŁ“īŻ»Ū‚ŸŗßDD¤& łź³33ųQŌŌ©žÄ54ŌŒIH€ ,=ABC ļŸ;&Oöh3Iå;ć!ń%t]ņńń”{÷īœžł“nݚP»½¤“R=9»n¹¹¹$''“œœLnnn©ŅJÉģŪ®nŻŗ“hт‹/¾˜† Jhh( 6äā‹/¦E‹Ō­[×aZw½g|}} ąņĖ/§Aƒ4hŠ€Ė/最€|}}]¦9ćŁ?¬ŸéfĻ®śó>Üą8yŅŒ)i.•čhK/‘šŌīRȱvÓ÷ņņ²ż•Šś×čōōtš7oNūöķń÷÷ēŲ±cK+gėu³v‹·>„{{{ŠŸŸ&“‰   ŪùõžŠ5/;ū¶«S§­Zµrzl«V­ØS§ŽĆ“"ī°ægŅŅŅX¹r„ķsļŽ½éŻ»·ķóŹ•+IKKs˜VDDDŖ™°0K”²EDX‚'OZ‚ „ņe*S' •2;ć'Kµžƒ×ĒLJ-ZąėėĖž={HOO§S§NtģŲ€’žū={öŲ&Š“OėĢ©—óÕÆ»iŠ8˜SūvāÕa(·\u~…ŸƒŁœĶ³?ē§Å›ø°’@ź’GŅ”Ć4æšj†õnēé&®v¬×Ķ:'HŻŗuÉĢĢ“żeŲ×ח«Æ¾Ś¶ķŌ©S¬_æŽ6?Œ»¶~ņ4_¦ēå Żc6g³ą›Yøl }ō‘[ūŠ^ļPo¦ģ“¬^óo½ū /?ö æņ˜Ó2œó?ž¶Žż€†>F·źSQķššŹüAhh(]»vµEŽ=ŹęĶ›INNĘĖĖĖaŚā'”dz?ćĒÅiŪē ¢®Ā ¦ńÓā?é6pćG_…ŸĮPź¶( wŪĻ{£"ü4ēüZ1ēv¦±æg¬æ·W­ZEļŽ½  %%…U«V‘™™éöļö²ž¾­č{­¼õ9£Yē ‰‰©Ų|CC-yßw_Å Į‰ˆ€?’“¼ń¦ŗNō*eRcžeķėėKHH:tąÜsĻ„]»v“iӆöīŻĖīŻ»ÉĻĻ·ĶāŽwßż–n7ŻČu×\Ćų{nąļ5Ė*„īƒW_sż‡ąŚ1×s׿ć94’-¾ÜtÜÓM[f«¦>FR®©JʲļéȘ4澐ōgq"Ļł9 ~\5źśRķ+z½G͵7ŽNTŲéø¤³ ˆ-ßŃ·•ŗ>éŌ©S¤§§“œœLNNYYYdee‘““Crr2éééœ:uŹ½Ģ Ž\uĶŒ}5głłqõ5wpē5W; ‚”ŌeįNū•to½ļĖó=2ŖāĪ­,Ŗņ;\UŹśū¶4÷ZiŚMæ’ED¤Öš:"#+&ÆįĆ O|Z‘󐄆²e–"Rcœń=B6lHRR999;vŒ-Zf.‘’’Ā޽{‹żÅŠšÖ•“™}‡3čQ×o’6ļ8Į¶oiģTž26„Aś.²[Œāö«:2ū³É,ū۟1÷ŻĖEv2ķÕ/9ޱOŻ<’“=Ėyö6ź’½ų6ĘōjZ¤“Ā{FļPF_ß†ē¾ž›Āǐul#Ÿ}±ŽĘ­p|’1zDŻŹłõüHßæŠ¾ŻIÓĒ9bø˜ 7÷eńœųī׍¶æ^Īūz*?Ēķą£>ā÷łŸńÕo‰zµ*Ö®¾'޾·„m?W÷FŃū¾}ŚŚbßēu(ž¶žŪ‹¾eށćŽ{„ƒļāŗ^ĶĪčļ°»÷Œż0ø€€Ūp˜””Ūq½{÷ę×_µ\ū‚ßńīŽoVŽ~ßŗó½stŒ£vÓļ’Ŗ½wDDä 2w.“iÉÉ„Ofy%ļšįU3|eŚ4č×ĘÆŚ6’JqĘ÷±žƒ×:Qęæ’ž‹Į` I“& ¶mŪFjjj± ˆ}Zgīŗ”/«ßšĢ{_ĶgĒĮĀo!Ųøć0÷Žt7ŒÅĘ_>`äøØćߔ>źāŚīšóŠŲ,üą{zß~+·Ż5š•ß|ęÖ¹·nKvź:Ūē_b¾ éõ7qĶ5×pÓuM˜³ųō¾÷æć웯gĢŲ»HŲjI3pŌ…ņ»zō¶õžĆn!?÷([: ę¶;ļį±'®cõœW8rįn»ó^{ä2V|÷‰ķxGõ8źL¹Il9ūJn½ó{ōJV¤éŌ{0£nWį’¶^7ėPė©™™™¶c233mŪ“’’Jń€d±ęŪ®ėJ×kF°köņbū¾÷--nžČżwŻÉÕēīr{_QĖęĶeöģŁĢž=Ū¶­čusēŽ)M™åm÷ŖNk0ųqõµwc6e°©żåÜ~×}<8®5ß¾·Šįń®¾'޾·„m?W÷FŃūŽŃ÷ĄY}‡­vĀmwŽĖ#“.cł7–ļŲ™üv‡ż=LŸ>}lŸW­ZÅŖU«lŸūōéS蕣e¹ßŠž¾uė{ēąGķ¦ß’""RTīź5mRlI{āYOW­jYßŅRšć£¢,=4,ĆkŖrØ(ĖŪfjŠ$Ŗ§†Œpx/:ZrWÆńtu+̱öČĻĻ'==C‡‘˜˜HRR’žū/ĒwŚE?¢„.SMzŒį•’=H{æc|ņĀ£|¾xmߤ—_Į×`ĄčÓS^Ŗ„1½0ŗéV¦dc6e²4`FĖ_śÖ¤dó×ģ|õķ\ŃŅķó³’;įņYD4°Lśéß ‚ĢcKlūV'gsA]? ^uxė•IRCįĖmŁ×«e>AēpŃY–!&¾uĪ%?ū ķhĒõ·äѳyAĮ „©,Ī®›ż+3½>³¤k—±åCiąmÄ'Ø-2–±1­š[h~OΦWó@‚[õr{_QÖ”1£G¶ŪZųŗ¹sļ”¦ĢŠlw///[o«¬¬,233 Ķ RšvwĶŅ&6µœcP³KČNžŻį‘®¾'޾·„i?wī’8«ƒćļ°Eļf޾cgīwŲEļ™œœ233łõ×_9~ü8Ēē×_%33“œœ—iŻe’Ķsē{ēīļużžw ęĮŖU"#K~]md¤„GFB‚ågE ©) ė¼!ž| °”Ū?4&((ˆŽ;²cĒņóó9uź»vķbēĪxyy9ģ бcG‚‚‚JĢßæA[®ø¦-=»ĻēŃ×?ą–/š÷‚ωK®Cū…ś:]w1/Ÿ@·i7l˜m»Į½®ĖyA>nŸ[źī’š­s‘ķ³±Š\ ęBǚĶ`2›KȱųxķÓ7€%og‘1WõÆź›ČžšŖ‡··-čåķ]¼Vī^óæ}Oƒęķ™=ŪņśĘķ‚łįē}\pMŪāb×vnļ+%·ļ ,Ógķ~üųq‡ėVī¶»W‘ūŪ`(~7š‹­ēź{āģ{ėnū¹}oøą¬®¾Ć®"ÖgāwŲö÷[ZZ6l(6Ģń÷ß-1ėš7wļ·¢Šž¾uē{ēīwSæ’EDDJ Ė—ž4, ʍ³ōĀØnon ³¼QfāDˆõtm¤ Īų!}ūöµu…ĪĻĻ'))‰“'O’””äprŌ† Ņ·oßó}ćńŁ‘a™Ā·~¼üšŪö}žó:®¾n$—EZfõ·ž4ØÉ0źļXĄæ?$qu“Ó’lĄņ–qķ‡VĒ:(­š?RMy'łīŪD.s™mŪ„ˆ?nyČ:¾’żN·A}–ļµ<$mœaŪ~–Æ’eZžb~`•]]’£Łģä³ćś»ĪĆ×h ĖTŅ?ĪĖĘžš[Yē Yæ~}”Wi‚ū×s³Wfrļ ףzj\ĖŽ­ś–<»SéāĒź–^' cpµÆh+å™ļ³Ž®ŚŽšÜ½2+¾ŻO:ÅĪ;Y³f kÖ¬aēĪ…z`¹Żī@—@o¶œĢ 7}3ށ]Šóū~Ė9¦ļ__hO‡mįź{āģ{ėVū¹yo½ļ‹~vVĒßaĒßVO}‡_Ÿō§ēŗ\ÆHÖūĶ: Ī~˜Pl»ū÷[ÉæoŻłŽ9ū½^“Żōūæźļ9Ķ{zčĖܹ–ŽŃŃÕ/bjé2uŖ§k"eąU†4»,Įėā…åDŽ€OĮāk·īc·ßŪžųčččrõēļŌ©ééé%NęŲ±cG®¼ņJ·ņōMŁĖ÷æläč”ŻÄÆŻĆ„ć¢hā @š±­Ģ]µ™ƒżhŸœĄ_†Nœ×6 š„.囜«ŃȖW«. ųż«ÆŲ°e ‰¾½øąœĘ¶}fs6?ĪžŒ»““Ć®­±bÉ*šFŽÄ˜KNw£nu~SVĶXHĀžŻ¬[s„Aw\CÓ@ĖßćZŸ[%±³ˆßŗ™9Żč~®e2¾v~Ē™ńÕ/üóßæį"Žļ\ĖžÜŽģXŹŽ’r4.>÷~üńGŽårQ綘Mü“p)ĒØO·sZ9¬’Āļ?įŸ]‡8’mÉÚ&© M𔿙»q¹¦f“-vP‘Š^ó¼¼<222ČČȰM ZŚk>’›©lŲėOpp[ڶ®Ąīß7ń×ę?ؚ–OĻ.–‰-ĆĪ ę×ĻæaÓ?’pČԃäײßäCų9ķ]ī³^’Œ»q05Ÿ€–mią}zßÜiģÜu#Yf:v<‡³Ļ+ÜöŻĪ9}L6œsĪŁtģäŗĢŹlwgJÓīē“dÉ׿²ēŠÖÅżMŸ±Q„Õ÷³ķ’ńĒé”ĮĻq+X²źCļKĖ:ębmqv·fNæ'ξ·%]³ŅÜEļūbŸŌĮŃwxį÷ŸņĻ®ƒĪ2sI—Žv߈Ž¾ØŹæĆ«-¢]’Ėhāėåt½ŗßon’¾ķRņ÷®čwÓś{½h»é÷ægīWRO%ūĆYI‚ƒƒ©ß Q©Ņ8cŚ·Ÿģ™ßŪīÓ»>½{–!ĒĄßÜ2łiĒŽž®ū.¹ĀĆaŃ"p2”:Čō.w~7ŽĮ«•ūĆ|™2eŹZ Č/X¬ė¹ė9?sķÖķ3Ł-eV–>ōE!ö _Ąš€@ Ø`ŻśŁßīėń~f³łŃrµhōōtŪC¬’pnŲ°”ķ"eé2-՛®¹gTu»ßyē¼ųŽ4š®٤”ō=©¾Ģf³ĖĻζy2ķĮż >|øTēŁ¤IŚuč\!m–»z §†Œ(¶=ąńG|üį )CŖX|<Üy§åg5t<ä¬rēQ÷§¹ųōźQ®< C d,ÖõŒ‚õ4 ³ą³uŻzœ50b]ĄŅ!Õŗø­Ę ļ r»+¾Ō ŗęžQ„ķn¶|ó*g¤•œō=‘j-"Ā2oȈ…ē:©dūü‚ł7 ’÷¹<.(ó”›9Bz@Ż*«æ§Ōø@ˆˆŌĀ?~ėéZÖ>S§Āłē["ÉÉž}‚]ükį«–+Ū‹ˆˆˆˆˆŌ@ɫײļƒĻ<]Ś)*Ź2T&4“²<éķĒļu›*R©”^žJīž=ž®Fķay pDD¹³JšÆĖŸĮŻ #®©EDDDÄfÖ¬Yž®Āi̘1Ŷ©-+Ļȑ#=]ψ‡Ķ›-½ ܔwꔆČxRh(lŲćĒCll©“—v.Š`4åc2ÖģWŪ+"""""…DTĄ_/k“xÆĖ0`€§«Wć,]ŗŌÓUšœŌTĖõ_Yę”p“uˆLĖ»oõōŌ^Ó¦ž7ÄMŪėsŲ7ČÓ5Ƒ44FDDDDDäLŻ»Cb¢ŪI4D¦øc?-ā÷óz’ŗykÕ8a‚å­2%Ģb DAŹ£@ˆˆˆˆˆˆČ™&>¾TėÜ={Ų8ōZ6½¬}ūYßw‡f~W5…GFŸ:7d[`}ĶR©ōŲ÷Įg¬é;„äÕk mß~ļĆģ|"ŗj*fy£LT”e8äØ^ UH‘Z¢¶‘±öł÷É)ä:嚘ż~ζ{"7%„ņ+j™7$!ÜÄD˜KčcšoŁĀÓMU+ØæˆˆˆˆˆH5łņk.ś|†Ɣ2jć[d^žŹ¾>s±wųėŁ¤mŽF·æĮ'$¤JźēÓŗ5M[·¦é ז MŅźuœ\µ†äUkÉŚ·ß£ķW)""""""R]ÄÅY–°0K@$*ŖÄÉ5K«¶¼E&uóV¶ßó0i[¶•*]Ś–m¬9ÆŻ~ü†:]Ļ­ņz; Œ¤nŽJņŖµ„>)NCcDDDDDDŖ›ÄDĖ«VŪ“±¼2·£ŗ£¦‘Ixy*ėū*sŠ ļŌ)žz]ÕM¢ź‚OAPäģ—¢¹hå/ōIÜLׯ>!øKgOW팄!""""RéĢę\~_žk6üGĒnŻ ösn*›·ą w0ćƙÜx× NÓÆY¾ˆß7ģąö ām,“oõҬż3I“&yśT«Lھ•¼3BppgmÜĘcć{yŗZRђ“!6Ö²L¬Yjꙓ«ÖšļS*¤×DŽ©Slæ÷aņRNU«Ž3>!!4ry)–śIé©GˆˆˆˆˆT:ƒĮ‡^‘ĆčÖ§‘‘‘ōæģ*5ń²ć,bMß3rˆó}żzś«\Ģ£o’Ōķ~&?ó,Æ<{ ėW¬öt•¤²UpƐšō™Ü”v>͟W]WįCGž}r ŪīyČÓ§XLÓ®Į»n]OW㌤!""""RE Ŷts;ń˰lżN[oĢƛ˜»<‘ C Į†ri×ÅŅgŪĢ÷?Äć× >ĮõŪŚ·÷_Ų”LCĆ)öf4aĢ  <}ņīļō\ k~ćŲµmiŌž6¾v:ؔyd /<÷!§ėr*#”»£Ÿä↬ųp2//XOŻVOóī-ūxüÅÆ8˜“ĻĀ… łõ½gˆł)ž·¼Ļ½SywénźµėĆō·%'åoŽxńCx5&oļ®xźeFt: €œäM¼2å=ŽūÕ'éX7>żƒŚ{ŗyÄM /O„Éąų“nķéŖ”ŁÉUkŲ~Ļƕ:©Ø'&QuG“F³’ĆĻ=]3Žz„ˆˆˆˆH•śsåJāāāˆ‹‹³m‹čwU”cÖĪ_ĮyC‡0ōźHž^ś“Ć|ÖĢ]F£+ÆaŌ°«éŻę`”} Vm„ė%=čŁo0‡<}Ź•āžž­HMų[Ææwf-#Ūd¶ķ›żt [’:šö«ļŠęŲfŽxj}ļ|ÖvLƋ®#ź¬@ŪēĖļ‰ąą/ÓhtŻdžwķ9Ō­g vĢāEÖüēKĢ Ń<:Ø_½ņŽé¶~źe6ķBĢĖÆ0Ņ|ˆŸzŪÓM#„`"s&ŹMIaŪ=ńēU×UɛUҶlćϔבŗy«§OݦĶ]ć=]…3’z„ˆˆˆˆH•źÖ§Ķ}½Šl-ÜŪckZ.-–’Ę>ƒNē4v˜ĻÖŌ\F7ō ମĄ_¶}};5bAģ×\н;—Gōō)WŠ>ß%čÜo˜ńõl~žņM6lĻdś’,„ޤć×ų|.ØćĒśCó€ėĮPøŻ»v/Ųg0ō¢[óśpóė¼S°ėūżių7샷Ā®{…ļn °%ū~_¹Ž’ ­:s>¹žnBó²i˜›A’O`‰Ēž‰o‘9öÓ"¶ßó°[ÆÄ­HÖ`HןPÆwBūr÷ģ©ņž5>­[Śėųi_•–{¦S DDDDDŖtp9ķüKųēŖĮąpóyƒo¦å¾¬^Ēē;ŽpĻŲ~ž>£ whĒfĪ»ģzŗ άĒncĘĘXĄ1ęBGŸžd40›Mä™ĶÅņ5z֒PĘčPlŸOp7¢£o÷t“ˆzyŁŌĖĖŽsŅŪC¾A${ū‘etü:S†Č䦤°żž‡IZų«Ēźwź^uŽ{ƒ¦7\Ć”™ßqhęw$Æ^Ė…+~®ņWī¶3~ņüŪmĪ$#""""UÄņŠov¾ĻTš©[ˆ›ö¤p|óυޱ&?7Ų‡ĶĒ2ČJŚ^(·9_­£^ĖŽ 5”¬£Õ§{EÉ9µŠŪ~’_“21o_槃=W7 ";ĶŅC毓lµķ»¦I¹©—ŸĮoÉY@A»›ó-ķk6+oxÓ@2O,äH®eß¶EßŲöjDö‰_Ų–– ¦\–~·ĖÓĶ#EŌĖ˦sĘ zž:Āä}tŹ8NĆ܌BĒä:Åö'ŸótU]:4ó;֜×Ė£A{Ūļ}˜„õZ±żŽ‡I^½ÖVĒ gYę̓čhĖ2q"ōļoYŚ“”ŽM7”«ˆŚH=BDDDD¤Ņ™Ķ¹¬Ya h¬ˆ[M÷=čX×ēō¾•æ°dÅļ\ŁÆŻGäū¹s˜½%’&0Äž˜•kø¢oOzŒˆdö³™Ó°>õ›v£Ž×F~ž}ƒz^D«ŠŻü¼4ÆŒĆœŪw˜§OæĀłwēŗ~]™õšćüŁ©I)a<õʶż#^xˆSŽgĀcr²~g|öŪ¾«&\ĮOĶ#ź¾$FhJüü½<’įÆtĪZ@Ę‘Ļłhŗ™;Ēõ±„õŅcģzž#ī»łVÕó£Ėš‡é\°oų‹O±ėł÷xfüxš4įüQO1ĄÓ $.5ĶÉ iNE{‹$-ü•c?-¢Ń+<]ÅBr÷ģaó½Ų‚ ÕŁį™³9ū„h×YēGJN†M›,ė{öœ~+ЦM–}Ri eLc°Kėm·ų~€?AėÖĻžvĒX÷3›Ķzŗ1DDDDj»Y³fįéjœQāćć3fL±ķ³fĶbĄ…*ŚŅ„K9r$ę"Ćz̆ł8Śpp‡.U¹Mš4”]‡Ī„JćLīź5œ2Āį¾)G*£ŁÜv¬aSż» BC=Z«}|FĀĖS«|.gBó²lė–”GÖķ§×ė½Z·†æž:Š8ƒ‚'ė4Ädō*¶½īOsńéÕ£ 9žf0b€, »`±®g¬§™Ÿ­ėÖćr€<»,­‹ŪŌ#DDDDDDDh”tŗuƒįĆ”_?ĖOØŹ^ Ž‚ž¦<üM–įbĮł9ų˜Kńœ[„m%„§@ˆˆˆˆˆˆˆœ–˜11– 2† ƒ Ŗ¤ų„—§’šŹŌ2§·1ņ Öó °­ŸnŲ÷ꐌGqĪ:agTT„™Y×ēJҶl+¶ŻYp£Š7*„w~.9†ĘŌ$ „ˆˆˆˆˆˆHÉāā*}ØLĖģTüӎŚ>+øQõ¼ zĶŌdz}®ˆˆˆˆˆH5īé*ø¶|y„Ń“×EŌĖ˶-"•įŒź2kÖ,OWADDD¤Ę‹÷tĪ8ŽžŖ7ĘH³reå—ŃÆßé¹ID*É2dˆ§« """""RūÄĒ[^[™ó„DFzś,„8ć!™™™ž®‚ˆˆˆˆˆHķTŁó„„†BD„%č"RIjÜ!f³¹Ų"""""""`Ó¦Ź/£OOŸ„Ōpg\gœ@ F£ƒĮ€Į`št5EDDDDD*ŻIo? ŽŗR¦jžā¬× ¹`=ÓčM–Żkn/H;ęéjž1jL äÄęŸxēūm4:«'¶āŻq4÷_w!^^^xyya41Kߦh’ŅS|‘Ŗ–ģķG‚”yYų›ņ©——EĆÜL|ŹÓk>.®ņ+^%mTXÉvė¶,£7YF÷ŁCó²<}*g”1›ĶL™ņ1ƒŽū‚^F²ŅžįžĒæ%wd8&“©Šq֟%(ģµOć(żvõF‘ź$ŁŪ€Ć¾Aų›ņĪĻ”^^6Įł¹„ļ5W¹“š†…Y–ÄD“VłYi^>¶mĒ|lėÖė!žS#!Ł&3»÷œāĀv˜Œ-y’õGČĻĻĒh4’vp5o°š&mr,ńżī¹Ÿ šćWo0}žZŽ›ł głzńõg’cĪĻ3{öl|ń:_/M癫›ńżŚµģ£;ļ¾pūāxsś6Z6>ĘACž¹ūrŒF#©»ńrģ_„ŽPÆĻŒlŽ——ŽŽŽx{{+""""""Ղµ§A’O m[h^õņ²ń7å•Ük¤²!`É?6ÖÓMesŗ—†—­—FŖ] Ć¾-„ś«“„šĶf»óJ–¼0©ŸĒÖż©˜L&[ļŒļ’÷ĶĘßĪŲĒrėŲ³xļ¹äääpÅu÷“Mvv6#ĘDY>ēäpŁ5w“—¾•_›\ĮŻ^Gvf*ŁŁŁĢyõ ξu,7DŻĻæ›V’““Cnn.ß½üż¼—»Ćāio‘••ENNyyy¶ŗˆˆˆˆˆˆTGÉŽž$ų‡°=°+CZš{ݦl ¬Ļ!ߥBóSU7OH%;éķg[üė’ą_—mõŁ܈ĮXŚŅ¶üܘ?ƒ³=° ž!$ų‡äh[äĢR#z„ Z^zŸŻƒŸ~ś‰ž7‰.£ēĪ+Ūb4ł-)‹'źł››‹wč…dy¼¼«léóróČ5˜0ä[‚¹¹¹äēēc6›čÓ&ƒ_wbž»“ÉÄņ“Ł<ģC¾É—Ž|“É„Į``łÉĪ™ž1cę¢ Z““ƒĮ`ĄŪŪ[A9£d½9ģėmN§{„®ZC½Ź®@9zœš’źåk›T“4ónHĶuĘŻ)))Ŷ™ĶfL&łA͹tÄxŗu©Ė“SßįĘŽĻĢŃa&õT §|äg§fRSSméÓÓRń÷1Bž)RSSms‹xge’‘o“Mŗj6CZZ龖Ī4>>>–ķøhĵtō±Ō%##ƒ¼¼<ņņņČĪĪĘĖĖKĆcDDDDD䌕ģķo›ß¢ŪŖ5ŌėŻ£ņ +2Oˆ£”)…ߤ¢y7Ä}5bh ĄóÜĪöĢ<ŒF#ž įåŪĢ64¦£6·L”}āOź÷±%ūz±+3€“«Č3™0›ó0szŅSooośÕ÷cՁL Ē7Ͳ•ßæ?+’IĮ`0pų™¶ R5QŖˆˆˆˆˆøĆhŹ÷tܖ¶y[„—±mŠ—CS¬A¤“Īø!Ī ģŁ•o~Hē¶õ9u$‰Œ²½2wą„(¦ÅĪąūęõ9¾’(cļæÅÜøuŲÅ|üę[ljŁ„³Śö"Ō{ _ž°ŒV$0ēĒE |]źśāååՉc‰yļ=ŽoŠoćKøėBKłWNKĢŪļńĮļõ hŁ[ z(""""""5ĶÉUkhy÷­•ZF®ērųėŁž>U©jL ä’1Š=/üü|ņóómswFüEp’#˜ĶfņóOGYF#ķ®ø…—/· g1™LŒųž­'É„ĆNēåå…Ńh¤N‹Ž<õBOŪ$ØÖ×ć5ķĮ/\\¬lė~‘š"yÕŚJ/#“÷%ž>M©”jD Ä:üÄĖĖĖöŁl6 F˜L¦‚y>,“—ZƒÖĄ‡ż›f[Ö¼­Įk:ė<"ÖmÖ„hž#"""""5IŽ©S¤nŽJ®ēVZuŗž‹wŻŗä:åéӕ¦FBąō<ÖĄ†żvkĀ>HQtŸ5āģ /Eó·/ĒQ>E·‹ˆˆˆˆˆŌ$É«ÖVj ,½B’žźéS•¦ĘL–jßūĆŚ{þ‡«}Ö“^^^x{{ŪėqÖuk`£h^öyŻ®”1"""""R\µ¦ŅĖØŌ7ÓH­Ucz„X¹ :8ŪWŚķeM#"""""RSTśc4OHÕ;“Ž^TVg\ $>>ŽÓU©õ²öķ'wĻ|Z·®“24OHÕóĻÉ$= ®§«Q©Īø@Čuc.õtDDDDDÄC¾™µÄÓU;I«×Ń“! yB¤ā՘9BDDDDDD¤jUÅ „ˆˆˆˆˆˆH™$ÆZ[éehž©h „ˆˆˆˆˆˆH™Xē ©LzsŒT4BDDDDDD¤Ģ’VÆ«ō2B{©WˆTBDDDDDDŖ’œLOW”LR7o­ō2Ō+D*’!""""""Rfš'DĪ4 „ˆˆˆˆˆˆH™„mŁFnJJ„–”!R‘‘rYßg /O­Ō€ˆę ‘ŠR#!‡6’ĶüŁK™ūż2OWEDDDDD¤ĘĖŚ·Ÿ„W¦²2¬+ŪīyØRŹīŚŁÓ§)5D „ü²v}†E2bdOWEDDDDD¤V9üõlN®ZSįłjxŒToOW 2ä™!Ä»FĘxDDDDD¤†:rV…å•ašģ£^ŚęmøŠ„©Ī%{ūWčżSÓÕØhŁ”ω ½ėāeštmDDDDDDj§ŹčāBp ‘ņ«Q=BęĢ^Ģ©T3Ż®čē骈ˆˆˆˆˆ8äÕŖ%?R©e47hģĮsō®[·Rņ=ēń‰älŁźĮ3«¾ĢęJĶß«UKOŸb…©QŃ×^Avņ>¾šūŒōtuDDDDDDŠ1¶lAąćWjž>ÉJ2ä r…§«!gø54Ą/“%¦Ü“ä{ŗ""""""""RķŌø@ˆMåö ‘3P „Ōõ6r(S}BDDDDDDD¤°|igžś%Žļē,õtUDDDDDD¤Y¾|9ƒ”Ų²|łrOWMŖHš,ÕŖNė iŻĮÓÕ©óēĻgÓ¦MÄÅőššJ|||”ż‘‘‘„††ĪŠ”C‰ˆˆšt•kµųųxŅŅ҈‹‹³m³_·g½n֟żś•ż-ØĖ—/'99™M›6¹,×¾¼ššpZ·nķé&«R52""""""r¦Ū³g111ÄĘʒœœģņXėĆī¼y󈎎&22’eĖ–yśj­I“&9 |82o޼BŸ###‰ŠŠbųšį„„„ø•ĒņåˉŒŒtėŲ¢u‹ˆˆąžūļgÜøqlµŖS#‡ĘˆˆˆˆˆˆœÉ¦L™Bxx8111%A ÷ō)H9ÄÅÅEXXo½õV„—OTTżū÷'%%ÅÓ§_é©&RRRčŽ½;ŃŃŃe €X¹Ū3@Ŗ·ääd&L˜PeŠøø8ĀĆĆk|0DCcDDDDDDŖ””.½ōŅbóŲ³ĪėP4ŠǦM›lĮ“aƆyśt¤ˆŠŠP"##‹õÖILL$11ŃåPšøø8.½ōRęĢ™Sźł<¢¢¢ˆŠŠ*–ß?üąš^KLLdĀ„ L›6ĶÓMViń°’‚ ‘‘‘L˜0Įi€cņäɀeˆĆŖU«<}:ā@xx8sēĪuŗ?%%Å6ĒKbbb±żńńńŒ5Š%K–ø=oX!E'`ķׯ“'OfžüłDEEė}KtttDUCcDDDDDD<,::Śa$44”ŲŲX–-[ęV/ˆˆ|šAOŸŽ”AHHćʍ#!!ččh‡ĒÄĒĒ;ŻWƆ sš_i&{=Ó(RÉV,XȦä\—Ē|ūõ<ļNótUEDDDDÄ–/_NLLŒĆ}‹/®5oņÓ&OžLll¬Ć}111ģŁ³§ĀŹ*:lĘŹQƔšBCcJšå§óč:f(įĮŽ…ÖŻaĪOå×?”kpįĪrzÜ[S?¦ó³2°mp¹Źsfą§CøqĢlĘZX¾é}>ٹžl£¦øŲžcŪ6°rėQšœŪC”ēJko/Z<”ŁÆ“ =Ÿ×FŽISo/²37ŃwĘÓÜ{ö ¾žåyņ:ߏ߶Mru^/ū‡ß¬Ģ„ŒZbr«¼ū—|ĮS×Ļį‚_²3’&ņė§øł–Oģr63cÅVź•]ś}®źé*Ż{?M„Ū„ŸsŪY”lß6…ū—­cže=JLēköįž+¦Ņ9ŠŌä_ørŽ‹Œ‰zŻĶs(=Wķ™r|6Q«všÖ°7éäļvŗ?āžGņŁŃ|ݱ5;·=ĮÄU›™Ąī¼<޼ęŚ •TžėvqŽ®īOW÷™«ŗøā*OW÷„«t®¾›"""R;X¶‹ŠŒŒ¬“!.)))ÄĘĘćņÆžaaaDEE1aĀ„– †ā’n‹ŽŽ¶Ķ]RŃé¬ēšå—_ŗœ\`ųšį.ēę(jłņåDGG;¼.”””L˜0”ÄśU”ŲŲXBCC‹mŸ7o^…Bœõ.©ÉoŅŠ˜„Ś#BK˜ČIŽCüŚõL}óc¾ŻqŖŠ¾ĆĖ?dčøgłš«yDß6Ž\s鬛?#®Tēf÷€Väa«eX/šz{‘››Ā†„eœÕģ*Ū¾æĪø°Öd˜MÅņ4ü˜¹b2㾿›aß=N\Z¦Ć²×­ś’Ń}{øU^+o#GsóH;•€Æ_ūByųļuŒ£H1™‹•SÖ}Īźé*Żé9ÜrV(ēt¼—£ū¾p+]XŪ”tō ØN7ņóø•.éŠ×Ü:ūnn˜s/×}sÆmŻeŪ—›ó/“|ęÜĖõ³eī±Óƹr՞‹ā¾cč•8 øJ7c’qniŪĢr>ķÆćšžŁ¶} łFœ<Č»*ĻU»øŗĻ\ݟ®ī3Wuq՞®ņtuOøJēź»)"""µƒ£æöƒóį åµ|łrĀĆƙ0aB‰C‰ŽŽ&<<¼Ä`CUš?>aaaL˜0Į­zŁ÷v)ÉōéӉŒŒt:?Frr2ŃŃŃōļßæJĪ5$$ÄὐœœĢņåĖ+¤ GòŹŪ›¦ŗSō{µĆõ’4ø`,o\vTlßG/,"äģ[X4c4éūŠÄĖpZž¹t=ž;×įŗÕsī%+;‰ÜĄn¼2hT±ż&yšL©œź8‘éC9¼ļmn\8‡ČkĒ:&?o/Æ;ź¹UŽ’®~ˆŪææ“ųVĶؘݚF?dŪ——·›—÷FšNū:|j.((ė>Wõt•ī_/~IĶ`p@’Ž,"?’@©ŹŲ±u*mĪ™ąVŗśšŚˆėØļeĔ~ӟä‘sc˜’ódĪīżSŌ!+c-gOeÄĶŃ%¶ēģ” ķx‹Ū“Žs2ĆĢØ~Ń\ß“^‰é¶äęs¶å׆w{ņr¶Łöyyrūü ¤eŸ’¶Üł0}ė”Xž«vqē>stŗŗĻ\ÕÅU{ŗŹÓÕ=į*]IßM©łœB*c^éÓ§—)Ą’˜˜H÷īŻ™7ožĒ_Ė;qāD§ó©8ćnφŲŲX§órĒĉ™:uj„Ÿsdd¤ĆzÅÅŕ;X1eʇķYŚ6>Ó(āK’sh3¶; øÅ Œ†K•~Ų؊ĢY‡ˆģNų€[撐e×ß_bFĘ7  qóI;u7Pų5aė›tøä ·ĖKŲG“ˆ'xāÜfĢ\õ « s˜en•…qsäó /”uŸ«zŗJ÷Ģe73į§ł.0”F ŗćåÕ¬TåÜūOķļĄŒAø•īŌ‰­¼¾žW2¼š3z‘“wŌ¶ļ³c)„Ę=Ī‚ϭƒNwņr՞ņóÉo{Ÿōl@ZŹÆ\9/†ėĒM)1«Ü“±_ŚÖ÷$~ČM ŽeÅŲGJ,ĻU»øsŸ9ćģ>sUWķé*OW÷„«t""""ΆÅT“åĖ—; ‚„……1|ųpBCCINN&66¶ŲėTĮŅKeńāŕ>o‰3o½õ–Ėtė¼ ©©©¶Ž"„ „”FLL &LØō¹Tŗtéāp»»“™ķ“œœL\\óęĶs˜Gll¬Ē^•Mõ6},S~:&=ŖRXėÉX<p÷!͌åŃŲLŃQVfs6ÆüÉ«76r»¼§žÜĄĢńĻb4ø”÷“ōŽÄ·|Ą7)©0ß2F2Ļlł ū#WÅīėSę}®źé*]Ćf£ųjŒåÆś§N~ŹØCƒŻJphļ×<±Ó‹ÆŻB ŻxHWé&żĆŠį3ZČåāO’R2Ļ {‹öŽÅæŹ®Ś³„—W7¶ō‚H^Īūn„;Ļ׋róˆšõ!7ļ?¼}Īqxm[¶ŗģ̨ӟ]”ēŖ]JŗĻÜQō>sUWķé*OW÷„«t"""R»„¤¤8Ü^įe9 ‚ÄÄÄ›‹dźŌ©Œ?¾X` 99™I“&±lٲ*o«åĖ—3a‡ū†ĪÓO?ķ0@3žüR·gtt4QQQ“nݚ””ę͛DŽ ‡bbb*½Wˆ³Ą“»gķVTXX±±±5zHŒ•ę©$i'޳Æ`Ņ™¬#9p(‰Œ‚¹¢:…°oĮü²r# >y¹Ōy—vŽWžNIµ­Ųūu¹•ĪŒ‰ĻŽZ~q=0ƒąį…ö;ų6)mī£ž±š-ęŖ¼śFk2²,ķ—¼ƒńō„L3F½g[¼ –ĻÖąBY÷¹ŖgIér²÷ņĘÆæ2Ö.Āģ*Ż‘}³˜zØ1Ó^_čĶ*%¦Ė7Ѷ`>‹ż{>Ād×gäÖF!LŻńŸķsRŹé94\µēķĶźóź?–¹FŽž‰_Šen„»©Uc¦ķ>@āߊøåéa;2²mėū÷}IpČ0·ŹsÕ.%ŻgĪøŗĻ\ÕÅU{ŗó]qtO”õ;`ĪOē‹é«Ü>^DDDĪ,Īę®p49fyLŸ>ŻįC³£ ˆÕ“iÓ>|x±ķqqq67Ei8{³Nll,sēĪu,6lX©zlÄĘĘ2yņd[šʍĒāŋļlhә¦6A@=B*Ķs׎ŹŅd˃ᶷžfų[pÅģoy>¬C§>;Β&EÓ¼Ū„ ®’K“y)ēqezÜ$³ĄßĖža¼rõD·Ņłū÷"ōŸ7·śÉł”<;čŽBūg¬Xσ#'”Ŗ¼×ŽĢ£ ļgŗŃ› s0Æ|ŗĀĪÓgõte켇š7B®9ˆA—LeLĆŗn„»~Ń·4­×”›öŗ|»7×8óŹÅ—ńĜ8+(˜ŗ ś3Šß϶oÄąēŲł[ ×ģČĒ-šMä՞ē”Ųž‘’Ēļ‹^eŌ–\̆<=äō>Wé"śL槟Ÿēś-L¾ķx}p7Ū¾Ą<Ž^ķyķźŪŻ*ĻU»”tŸ9ćź>sUWķé*OW÷DYæciūž&čœĪn/"""āČ;ļ¼Sl[XXX‰o„‰‰‰qų _ÕĢńńń‡EEEUč\*®ņ‹ˆˆ`ųšįÅŚĆŻ^Õ]bb"‘‘‘DDDšŃGylųSU)˵ĮnK0Åŗų~€?AėÖĻžvĒX÷3›Ķ–Tš¬Y³ønĢ„žn3fĪt>±aćK.c`ŪąRä&"RܚÆŅzŌ•4óUē=«of-aäȑ˜‹ /7;nnv2żąž>\Ŗr›4iB»ūŠåĖ—;œæĀ×ĒŗkĻž=¶y3ģ¹ź boĈÅžCCC9yņd”m•łśÜ)S¦8ģ’˜˜X¦ł9œµ{I“Į:›lvƆ Åżū÷/¼‰ŒŒ,ó°"GķTōµĄĪĪ+""‚:uźŲ>ŪϟāLlll„LŲk0b€, »`±®g¬§™Ÿ­ėÖćr€<»,ćē­‹ŪŌ#¤Œ–Ē­qŗÆCXBD¤Üz\?øü™ˆˆˆHµģų™ĮŃ\eå¬Ē‚»óf„‡‡ „$''“’’BHHˆ[y”—³ e+z’Ņ’†$9 (¤„„Uźł;Šäī5|ć7öą™?>111N{ŪtéŅ„Ęö Q ¤Œ>śųUOWADDDDDĪ`Ī2ĶRŽr·‡¶8{揦M›ŖlxŒ£`Ne¼Y§ŗrĢr˜q×°aĆ6l˜Ó7žš·*Øæµˆˆˆˆˆˆ‡8 †ÄÅÅ9}£LmTSęį(+g²VT0hņäÉ󊋋cOĮ @jBDDDDDD<¤k×®·×”·‘HłX_ß[TXXX… röŠ]g=ŠĪt „ˆˆˆˆˆˆxˆ£WŌ‚ó×Ŗ–³į%M–iål˜Ž»óSTÖ9Täš”ź,&&ĘįvG“¶–‡³łQjjoBDDDDDD>ž:Ü]įoģ©ģyHŖBDDDDDD¹šu·/(õy¹Ŗ‹«ņŹZOW÷’«6su~®ö¹ŗF®Ī!//č…/³+ǀٿÆ^9”X:GßWßi©¾>śč#§æ111ÄĘĘÅŲ±cMāććŁ²e ›6mbźŌ©¶ķŃŃŃt‡Īāŋę7}śt‡=."##>GFF:ģU਌={ö0jŌ(·‡Ī“nŻšØØ(‡ēн{w¢££™0a‚Ć^ÖRE÷ ØhńńńüųćÄĘĘ:m—ŠŠP>śč£ ;—””bbbŖlųMu¢@H B¼ „xŠ­»cę̹\põ„_¹†#łDōķAėŗ>dü‡%kwblDļQßŪę\¾õĶÆLÆz¾üśŻ ŻśsYū:åŖ‹3­½½h]špeæšõ/Ļ“×ł~ü¶m*Už®ŅķĪĖćĶkŽ”m‘:sÆ’»ƒE·- Ų.°‘r|6Q«všÖ°7éäļvžmCĻ絑wŅŌŪ‹ģĢMōń4÷ž=£Ä}ļż4•n—~Īmg…²}Ūī_¶Žł—õ(qŸÆŁ‡ūƘJē@?R“įŹy/2&źõrµgAĆ0cÅVź _sWu±0ee.eŌ“[ķāŖ¼ū—|ĮS×Ļį‚_²3’&ņė§øł–O ö–ķ~tU×啭ž®ī%Wmęśüœļsu\Ćq’#łģh¾īؚŪž`āŖĶ̉ ·Kęų»āź;-"""ÕWDD111N‡ÉX‡‚XƒöCRSS‹õŒ°„“nݚčččb¼ÉÉÉtļŽØØ([¹Ör k åõ×_wXæįƇ;|p¶–A:uÖÕŃŃŃĢ›7Ļa (::š˜˜"##m“ø&&&²yófŪ<“'O®ø‹UFqqqōļßæŠ6wŪ#,,ŒŁ³g; ‚¹[čz&''³iÓ&—C—*£ēIu¢@H B프 >L}ócĪ’åv&0ż([ŚɳuC8¹m£o™FPóępņo¼Īģ9Ń4ņńįų¬|ūo{z=Ū…œ“æyśÕytįen×ežŒ8†ŻévĆģ”ĀŠ<4Ż8ŲņKī³ÉķüJJ—o$ĢɃŁSæMįDf*¹f~˜Ą§WæĄ¢øļzå'Å\KʳeX/rsSؐ°Œ³š]åÖ¾ŅsX~V(ēt¼—£kŸz”ø/¬ķP[Auŗ‘Ÿ:øąŖ]rsžåł_ßåßģ<Ģę ®ķ÷#ŽōųļuŒw‘²÷»Bé\ÕÅŽŗU_2ŗļ»n»«ņZy9𛾤JĄ×ƽmŸĮąĒĢ“Y”t”äü&šLdAOWēēŖ.®Ź+k=]ŻK®ŚĢÕł¹ŚWŅ5rv3öē¶¾Ķ,÷Uūė8¼~6øž®øśN‹ˆˆHõ6nÜ8ĀĀĀ>|x‰“W–4’ĘņåĖ õܘžm¹7ņaśÖµœß —Y¢“}rµķ”ĪjvJƒv¼ÅķIĒ9™afTæh®oZÆÄ<Į2Ü!+;‰ÜĄn¼2hT”|ķ»Ą×‹_R3\'¤#‹ČĻ?ąÖ>{;¶N„Ķ9Üj—ł?OęģŽ1„A²2Ö2pöTFÜ @^Žn^ŽĮ;ķėš©Ł\(;uÉĻŪĖkĒĪㇺAn»«ņžwõCÜžżÄ·jĘĘģÖ|0ś”ÓēeJåTljLoŹį}osćĀ9D^;¶ÄósUW啵ž®ī%Wmęźü\ķsu\Ć–Ü|Īö±üŠöńnO^Ī6Ū>Wßw¾Ó"""R}õė׏ÄÄD&L˜PźX{›6m*6„eŚ“i@éŒCCC‰eŲ°a.‹ŽŽfåŹ•n÷ųˆuśz_gm³aĆF]Ŗ7ŅT§@HiX{ŁTå<®†Õ$ „T²Ww·ĢHk $ø`Ū‚cY˜lē§’ąģ³Ū’–ĄY½ļĀ;żfĖ$ķ³DŚ\÷r©Ź6¶zOf3mģ—¶õ=‰rӂwY1ö‘ÓČĻ'æķ=|ҳi)ærå¼®7Å­<­Ćv'|Ą­ßȲėļ/qß3—ŻĢ„Ÿ以P5莗W3[Wū¬īżŠ§öw`Ę  Üj—ĻŽ„÷8 >·:=ńĀø¹?ņyĢEҹS—„­oŅį’'Šmwvī®ŹKŲG“ˆ'xāÜfĢ\õ « sŲY02¾Q(›ßHŚ©»±%žŸ«ŗø*Ƭõtu/¹j3WēējŸ«k䟏?šMDDDĪT!!!L›6ūī»wß}×ég"""lCDŠš6mQQQDGG—Ų;!44Ōv¬;Ę!!!,Y²¤Ä NDD}ō%NŲź(ķ¦M›lƄÜi— ”Ŗ O %22’ČČH†NėÖ­«¤\kyQQQ5>b„@H%3x1O}oŽ}&2ć‰NÅöył5ēĮŽułöĖ؟Π׵t§˜*wŗ×ś¼č¦ÆKGĖV7厱^^\ŻŲņWūąäå¼_ź<ĆZßHĘāqĄż%īkŲl_±ōL8uņSFl;ÖÕ>€C{æę‰^|5č ī=Κ€ē†½E{ļā_ÉoRRažƒä™-½'¹*†p_Ÿėb6góŹß™¼zc#§e=wWå=õēfŽ£ŃĄ ½Ÿ¤wģ$īøå#ū±<Ā›±)•«ósUW啵ž%ŻK®ŪĢńł¹Śēź¹:‡ó|½ų'7_róžĆŪē·ī%©9"""˜6mÓ¦McłņålŚ“‰äääb ėpė%=Ģöė׏eĖ–ĻŖU«Ų“iS”Ö|"##Kż`l āX'hµÆ«õ!ß¾‡Cxxx±ó .±ŒÉ“'3yņd–/_N\\‰‰‰¶s'44”ššpĀĆƋ•iŻīJiŅ-[¶¬PĒzķģYėhĶĆ­¶¶Ī1²lY±]Ö3iiiNĖ“^°Ģ;RUĮ–źFøÆO#žüńu¾½š.šÓŲ¼v5&>ĪŁ–ĖŃļįī¼tėó6¾š¾“«ŗ«“s„”UY;2²é襞}_2Ģ­t·7«Ļ«’ģāõN8~x&~A—¹•ēß)©œR€{æ °Ī ·öYådļå_e섟ŗµļȾYL=Ԙi/-Õ»©omĀŌ’ń^—Ž$„dŅ0Ä2¼Ē~Ļ^Ÿ .ö–Wõ™ņĘŚuéĘpÆÓ]õ»ÜASße4¹ćŖŅg^Ź9BŖŚĒæNą@žoƒ ƀö¼võķīµŁĄ’ńū¢Wµ%³”OyŚ­<§ĒM"1 ü½ ąĘ+WOtkßŲyįo„\sƒ.™Ź˜†uŻŚwż¢oiZÆ)7ķ’Ž¶ĶQࢨƒŸcēo1\³#L“h6‘W{–ÜĄU]f¬Xσ#'KēźÜ]ymąĶ<ŗš~¦½É03ńŹÓ×Įßæ”’¼ÉøÕĒHĪåŁAwøu~®źāŖ¼²ÖÓÕ½äŖĶ\Ÿ«}%]#g"śL槟Ÿēś-L¾ķx}p7·Ņ•$mßߝӹBņ9•å©Ł`·€%˜b]|?Ą ‚uėg»c¬Ēū™ĶęGK*xÖ¬Y\7ęRO·`y5®3/¹ŒmƒK‘›ˆHÕXóõBZŗ’f¾„é³$""R}|3k #GŽÄ\d¢ń¢Ÿm8ø?Ć‡—ŖÜ&MšŠ®ƒž˜ fzļ䎮ī C d,ÖõŒ‚õ4 ³ą³uŻz\g·€e\ŗuq›z„”Ńņø5N÷uė£@ˆˆTK=®\žLDDDDDĪ` „”ŃGæźé*ˆˆˆˆˆˆHuŌæ?„‡ĆäÉ0q"Ģ›sēBĮD„6‰‰0eŠer2„…YŅDE•¾Lk^›7ƒõĘƇĆÓOƒ£¹`ʏ·¤™<¹x½FŒ°Ōgī\ õtkV8BDDDDDDD*’uRÓ#,ė‘‘P§Nįc”[ĮH1y²%8>č83“'žœ¾„GŹ»ļĀ“i…÷EFZ‚ŃіąĒŌ©–ž$ŃіśTŠŪ‰Ŗ#Ķ–'""""""Rђ“-ĮGĮŒÄDKOØØā=5|ŠņsśōŅ•ēØ÷ʄ –Ÿóę9N3y²„ü˜KdŅ$K>}äéÖ«Tź"""""""R†w¼Ż:t&9ŁŅĆ^bāécŹŅ+cŽ<ĖŠkÖrœłč#čŽ<¼q4§H ¢@ˆˆˆˆˆˆˆHUڳĒņ36¶āņŒ‡Ń£-”ČČÓ ŚD‰ˆ°ōL‰µō^±ö"©Įń„eĖŠæ±„,’“-=:6l(Ü£#:ŚuŚųxK$4ōō›gjšü  9BŹeę̹,Ł›^źt©»W2sę\‡é]ķ‘ _?ĖĻłó+&æŲXK0dĀ„Ņk¹óNKdńbKččÓÆß­”)Į—ŸĪcSZ^±u€©o~Ģ·;N•:Ϝä=ÄÆ]ļ0½«}e­gY ütÓŅ2‹­W–¤CÓypįć\ōÉÕ%Ūė“Į«§ˆˆˆˆˆH¹DFZ‚ÖFy„¤X~Ķ+&Ęuŗ)S,AkÅśÖ™;ļōt U*BJām ÄŪPlŻŹœw’ø…æšŻÜ„ģ8–]h_ĘĮųįūXšĖZNä™lŪ\0–7Ž~Ńay®ö¤ķŻĘü9?ņóŠ­ä›ŻÆgY“öö¢µ·W±õŹŅ°é8ŽürµÆ§ˆˆˆˆˆH¹Mj \“ic XÄÅY–ŲXĖ+oKcÜ8ĖĻŲXĖg rL™āųm2ąųU¹Ć‡[–ųųā“øÖ š#¤”vA…P†­Æ?ĪsĮM8u˜¤×¦óĮoŸŅ-ȇ“Ūę0ś–i5o'ńĘūįĢžM#Ÿ²ĒžŽoœĮˆ»fāפ)¹GńqļńĢ}c“[õ˜?#Ža7Fŗ]^˜]PĮ~ż–Ošł/a2%qé“Ūų"j-½¼˜0ćbn|›œ¬-<»čöęycöiÅ3W>Dg_[¾½æųoÄ{ »É6·bĘČĒJ¬KFŚZ&żü!'½BhҰ?žC‰õ©¶¢¢,AЉ‹>J;¼%, ¦M³ä3~üémsēZqq– ‹5(’œl™XŠæ*wŚ4ĖńŃŃ0th|ƒŒ!%č;öj‡ėVĮ­oęēi£ÉO’‡žż&šé¦“¼×«1ӝ -/ë0L9GxėŻł¼²ł$Æ_Š Ģułų©9ųŸÅ/_]Cņ–i\õ±‡‡Õ$ Äz`.]/‘gĘĪuø>Ų/ €“ǦŽ£MįŦõIńé Ąģ…/Üż-f¶jĢ”½1Œ’ł~v•-}Nv<Ėź}ÄēįM0™rŻŖĖ× ß¤ywyæec’Ę &‡u³_ń³Ł½ćģ{`¤¦Z¶¹š<ÕU¾QQ–%.źŌ9Ąp”_h($$8Ī'4NžōXÓU )§V#z`|‚ĪĮ×h ē¤åĮ~Į±,rÓ·óӏ‹łł×͜}v[BŅņĖUÖ/dzizł…ŠŽĆųc›ūóˆ ŪÆBιc33f௠ۙŲīn¶Ęo »~'bOœāĪ 8«ÅXN›Y8s“j€ŃčćV™³N„s{sKž Ī‹ņż©"" æņ¶<"#kd/ŽŠ¤!ådōwKŖļmĄ»ĻDf<Ń©ĀŹjäk$ė°eSĪQB«ž6mטærҘ‘7ŠĻüZq}īœČn@0K ĀøŒ¼š-eĆÄéØĮ`TDDDDDDDŹD=B*É}}±÷Ē׳vńzV/]ʇ/>ĻĪLĖ›\ŅNgߞ=d9ȁCId˜Ģ%o#öżų> Wlą›7§bō®ĖmCÜ®ÓüqrnĮ!}™–ų1m.饀‹›ńRĀt9«.·6 įćżIŁ’%”õÆ-w™×Õ ā“ƒ'8™ō&Üģj&""""""bG=B*IäsÆ1ī¹7ųdŹsdhׄý,q§ē®½•„ɖžŪŽzšįoĮ³æåł°:.÷õ‰~…kž|—›‚_£0ī~õm:–ā–rŽgüü{±cķw¼|“%Ó°É=üóĖ Ür“#O&ś—g¹a½‘|ļf¼[×­Ēåyv Xfe°.nÓŠ©5‘ZC©5‘ZC©5‘ZC©5‘ZC©5¼=]Š4÷ūe˜MFšžs.=ŗ6ōtuDDDDDDD¤š©Q=BFŒģĻšaŻŲ²öwOWEDDDDDDDŖ”0zƒ9ßÓÕ‘jØĘB0©ļmdہSä™Ģž®ˆˆˆˆˆˆˆT#5/\yłŁlśe³g/ńtUDDDDDDD¤©Q“„ZżöŪN.5ˆö”¾ž®ŠˆˆˆˆˆˆˆT#5°Gˆ‰c¹&ADDDDDDD¤˜šŃ“ """""""āD „äe&aōņt5DDDDDDD¤ŖQs„Ģż~f|č~ioOWEDDDDD¤D_|ś9[µdobFļz“jČŽ½Ē¹ķ¶›ĖœēĘå ŁšĻ~üė]ĪĶׄyśEŖÕ#dÄČžŒŁ›ó[zŗ*""""""% <—+/æ ļ€ö\~ł:”o¼’żyś¬DŖµÕ#DDDDDDäLró ŪÖóĘq¶õÜŌD~ūõw²|üÉŹõ§×—Ń:Ų§„}†byfŚČĀ?ŽźŸA@»HzuØēéSń˜Õ#DDDDDD¤&łkįr§7däÕ#i~˜ø…›ŻŚWŌO?oÄ’¼ ¼b(GNyś“Dó ¾Ł’A›ĘuH?±:]ÆēkŗWIŁQƒo!vįēžn‘)""""""Rģ_ō$ĻžŲ‚E3ĘĖ`⣱Wšæ†Óy¶³J/_A9ShhŒˆˆˆˆˆH šåŌUœ7隂 €‘Qweńk_óōhzō½™¹ž óŲÆ÷ÉŪgsė“xä®xuA3Ž~ŒžīįļéÆņĄĶ—3äęę1ćķĒčŽ½;sLNó‹yz4=ÜĆŪ’xāŖń䘰åsó‹ļyŗ „–P DDDDDD¤ųķd›ŚŠ“#Y'~ągß”~p[Ft«O@£Ė¹¼E>|ź>>Ÿō6Ć_~ž^{¹Æ? Ą¼DnźęvĒ«1ÉŹHušĒ¼TØ\GłŻ’ģT‚ĻįŖĪ”dŸü…­a‡xgW .gXXKŽ}ģO7”Ō „ˆˆˆˆxŠ9Ÿķ›’`޼ylŲ¼™Ķ’ÉŖkŲs"»B‹Y¾hE„ŸŹ¶æW1oŽ<Önف HŪóĖœĻļ›·ŸQēaõó²#īlw7ŸĢ.ōyŻ–ķ˜*øn5­­„\ļ6ś6åĮ°u|Ÿ”‰Ł”Ę×uĘl“$ś1)‹å1/ńā?så„ēXS`6›^’śƒX2ū%y~“t”Ÿ—oKnōū‘™yģ÷ />9‘%ožĄ÷é×P׫„© š#DDDDÄS ^tźz’ģšOŪŽ]Øļc 3iæ­YOė!½+¬˜~Wō­ōSéܵ'‡öüHƒvķ1Į­ŪS’ßÜ۵Óuebwnü.=×öłĀ.Jz6ujĻŖE4źy9ĘĀ9Ōź¶—®ØēĻöéŠ$ȶ-ćąüė±}¾dŅ`¢ŽŽĀ€±K8’.»6é)śŌõ-–ooÆBŸęaĻI~nkĒ“h»²Œæ‚ž†q0ɋ“Ńžn>©E©'v­gĶ.‘/"ČčźQøš>ļĄ@ĢyIü·u=Ūö䊻}ž9t€Tšryæpr’ųcĖQ|É  å…œ×:˜-–°ė°į=zŠ"(‰ Ė’$³q[Zų¦³åß\~õ0rÓ°įχ™’A« "hąĶ[×:nŪ߫ٹūƇąŲĪ?IČö§®!ƒcŁ”ō‰hWä4ŒtnąĻŽ„4:tŜw’Ć!gÓµ`·£:;;?Ge­Ÿ«óŲ¶+™ž›x2S'RipĪŜV·’Æøå:†7>ĀĪŌœ]Ē·ŲÕuŌ[’\Åæ{’hŽéĀ›ē±rY—„Ķ8÷‚žųŌ„u?¼ü›Ó"(„^įinį×fžūū&źž×®]ŗŅ­k0ńæļ²•eÆS—šBŸ×ķŲKŲ9ēŠ±KžÉGÖæ~ēF¤ļŻ@ę±ķœÕ±žmŸ£:;;?Ge•ę=h RĢ|ļ)^yēcžHĶqš‡Ł”ÉĒo[ęyåķ8škr˜€OP8Åų–·Ų4»ģažż¶‘!¾ˆTõ©`+ćw“o2³ü§÷[{YŲŪ½c Ž~„“¾ˆ~C ¶3mųćåŻ‚Į—¶`_V>[ž"É-›YŽ587ų‰Ył„ł™Ųåہęk§%fęŃ3ŠŅĶŻ+°9yéæēP|rĀŸĻmĀĖVŠ®}Āū÷px^¾u;cČYDr~W’wfӹƏmŸ£:;;?Ēe•īÖö""īŠŠ‘ ܼ+½Īńē÷eČ0•v0Ūż×½}m¼I8š @źž¶ķ>u:“ćŪÓéģć0vŽ̰ŒāĻĻ<ˆwĄéž u¼Œ$åX ¹§öJ·6ī_ź4lAD É=µ×éŁ4éTŸć[’¢NĒnŌŁńł9.ĖŻópœ§;ĮŸņ9]®Į§>ēśżWģg×-y÷z8»}ŗł²r}¢m»—Į@®ŁyĶĻä¶6›ŅYæģwĻéE×ęAn¤©8Õ&²ėßmž®‚ˆˆˆH…©ßīB†\~Q±7~bĪgū–õlݲ™y…vļŚf™oįļ-;8š{ŗ‡Fūē“»c-æÆ]ƎŒęv)Œtn™ĻvÆ –üwl௭;Č4›iß«;i›’dó–ĶüłW Żzv°„Ž8·%;V¬dķŗ üw¼ FńŪ,óA4 :Lüę-üµi­:_āō”üu&/õ$ēÖ÷+“ŻQ_±²Jq’l=§½;ĻŪQ!ģ®ćŗĶŪÉ5CćóŗRōM ŽŚ`ĒÖxVn>JnrĒO˜É8ō+’Ü @—f!Äoų‹’ögŌø¶6ƒøųŠ”š(UD<¢,} v X†×X_Ąš€@ Ø`ŻśŁßīėń~’ķÜśh»]]²˜]DņÓO2+ś–ŪŠģŌ_dœż/ŻqĢūŒē×eĄóSh7ąn‚’žZ(ß²œ€”Œi vi½ķ_Ąš€@ Ø`ŻśŁßīėń~’ķÜśhIļåž5k št›‰ˆˆˆˆˆ‡,]ŗ”‘#Gb6› m/śŁŁ6€ƒū8|ųp©ŹmҤ %=ÆxŚ„—\ĵs—qgÓ ‡ūßIž› x ]]Nķz›į²tömiˆžQIDAT€‰īŻ/āęéæņĄ¹õÉ8:—£f±vå7tļŽŻ|°kż|MļKxäē„ó}æĘŚ•ß;ʔ³‹zŽ`Ɔ €‰ /¼„”ożĄc72äŽ,™żw ÄŪ?.ƾžŽ—?Ķŗ5æ–XvYĻG<Ē`0ÄY@vĮb]Ļ(XO2 >[×­Ēåyv €Łnq›&K©ĢøžK÷œĆ\Ö4€Ą¦—‘¶’ė‚=–Ē«ۇąz1y™»œäRų2ß ¾F£ęül‡Ē€W”ōf³‰‘įõńÆ?ˆ%³_ąć…?ćo4ąķ×Sī ·Ź®˜ó‘ŚHCcDDDDDDj€Aõżł{W*8éb4ؒټųŠ} „0šā½}xō‰ē¹(`/WOxÕį1fs^±m ¼½ }^łį3|w“ē7s’µ2ĪGj‡3.²téROWADDDDD¤Ś¹ń‘\’ź'¤õ|š`£%°āŻGč{ßk\ß2˜Å‡2čÜ®.‡—ŌttAJP<”`Œūņ m=żyjģīńW4 (”¶µæ7¦fÓ¬A)’Ķ+–_Ѳž™¶ˆ÷—żNūÜßłąĆ/l½[üFŅņ-)‹–]¶ó9Ć!cƌńtDDDDDÄNyęź(OZ)®Y’gy#é-&M|’³Ćš—væsĒÓ·`’ ļMį™čēy³CļÜĒ3ļ¾Ągo? Ą+ļ|ĢŪßeĖ/ś£Ł“ČŽ`Ł÷öG\5ę:ö|’ŗķóSw !¬U{<’?Lœ:“‡ĘżŸäå».ę…{‡ščųŪYŅ1Œ°óGŃŲ÷+žyo&ē²ŁV֍wÜĀÅu|˜pe¢'=Źłmŗ1¦q /ĻŲŹ7žĖÄKĻįŁg_ač€ėÉų÷S[ŁĻ>xgéĻēćłüļŽaž¾LR œQ“„ŠˆˆˆˆHõā©@ˆ&Kõ¼'‡ō„ĻōE jhé ’“ŗžŽ—=Įŗµ‹=]5©¦4YŖˆˆˆˆˆˆœ±¶žĢ&Č÷ō\Ł'wā[§›§«%R¢3jhŒˆˆˆˆˆˆToOĒ ?ĆśM1äēpģH&/~ķéj‰”H)µÖWÜĆĒWxŗ"„§”1"""""""Rk(""""""""µ†!"""""""Rk(""""""""µ†!"""""""Rk(""""""R|ųę$ŗwļĪSÆ½É›ÆæÄż·?Č÷Ÿ(s~fS&ÅM‘rS DDDDDD¤øė”WøīžūyhŅL¾;˜×|²ĢłŒÜ9įÅBŪb~^ęüęŻ=ŲPń$oOW@DDDDDD*Bįæs4mI^V|”mÉŪgóšŌµŌ7¤Ńąxdh>ŠyšĻæŁČ§ēėM ģI8Åu/Ę0¬C]Ą`K;ćķǘśÅü¾Žf¾FNż;G߈§mÓCģ1ā½gF0+ś–ŪŠģŌ_dœż/ŻqĢūŒē×eĄóSh7ąnīŒlBśž%<żÜ"ZvlĀį0tņsō=+o?Ę{óRłp\Ÿ.YĢ."łé‹²tDŠR‘&/ć?ō+żn}¹ŠöĻ'½Ķš—Ÿē…×dīėOc0p×CÆaŹOeYųM¼ōj ļNīț?+–ē¼Tč󓇦rĮ³1é©Wٲf‘mūŅu L}zM~€%Ӟąāį·0įéÉÜŁ€Ų{Ÿ£Ķ£OóŠÄ‡xśįÖDß;ÓVNnźęvĒ«1ÉŹHõtsJ £!""""""5Č7ļæƒ×–ŸłļĀיyŪł…öż˜”Å1/o4på„ēlµü}üаŗŌm;”Ģc÷‹ä\ųļčóeņiżŒŽĮ,_ų±mūĒ Ąä×S®ó9JęĪą½¦6½Œ“ż÷·FĢf#Ćėć8ˆ%³yŗI„†Q DDDDDD¤¹īžūédĄš!ϲł–Łt ō9½ÓĆ&=EŸŗ¾ÅŅ™ ­J,Ēl†<³¹Ųö•>ĆwGėq~3׏›FCŃ2 kąķå馔JCcDDDDDDjĖD¤fĄ'8œ·ļiÅ£g`?=éµMƒ˜½ī»DJ½ąßRvĪ' ŃU…ņ“’o~ĮžQg2{G2–œžTõ™i‹økŅÜtMø­>žF#ił§ks}Ė`Ź ćš‚šŽ.v"•”,!6ƒŻ–`ŠuńĀŅĖÄš)X|ķÖ}ģö{Ū’Ąż÷öŖß ‘§ŪCDDDDDjøŌSɤ„„•*Mpp0Õżyåć·'žļö§™9’Ā hŻłBÖĻxžŁŪN0,ņb:ölŹ/¼ĄÆ«W±Õ—voiIūńĒ MeŚ·ßóõüÜžśSœSĻÄ'ļD’×.ö¤ešē Ų±y7{ŅMtæ0‚ī½ĻāėÉÆ±ä÷UlĢĄe=Śŗ ļĢ[ɮ݄ŪĢ .¢Ļy ٽ‚÷–üC¶©=絯C§Č¶Ģ{éS¶ģÜĢĀöpėĖѦ®3ß{’5›v³7ĆLż®ēŃĀO=CjŠ)S¦¬ņ°ÄÓņķÖs Ös ~ꌭŪg²[ʬäžNŽÓŲBģ¾€ą@PĮŗõ³æŻ1ÖćżžŪ¹õŃv:WéE‘ņ1av0TĀŃ6O¦=ø?Ć‡—ź<›4iBM~^鎽»ķm0"•Å`0ÄY@vĮb]Ļ(XO2 >[×­ĒY#Ö,‡¬‹Ūt—‹ˆˆˆˆˆŌffĖ`—<³£Hķ @ˆˆˆˆˆˆH-öIĢć¼󑧫"R%ōÖ‘Zģö‰ÆqūÄņē#r¦P©5‘ZC©5‘ZC©5ōÖ‘ąųĘŁ¼šÕß4kŹńńév;’»³Ÿ§«%RķØGˆˆˆˆˆˆH 0aĀ xśI&=ō’{óqVüųmß¼»s0ĒTbī'r&S‘ ŪdfgB*Ō÷Ē'° q?¼Ąó>ćłõGšüŚ ø›;#›0+ś–ŪŠģŌ_dœż/ŻqQ±ć‚’žŹŌ/–°ą÷u4ó5ņž«÷šł·ėŲ°aė>’³“ŃŽėėwę“’ńtˆøE=BDDDDDDj€WżūFńŠ ļ³nwŠmūÅĆo`Āӓ¹3² K×%0õéI<6ł–L{Śįq7>šR”üļššD”Ļ}ō##n»•;üõwüīéÓq›!""""""5@ŲŠGųeĪ{œx€'oÄ33¶9=öć…?ćo4ąķ×Sī 'G}\ō*ōéžĖ;šč˜ŪxwęÆ<õõ[ž>}·ihŒˆˆˆˆˆH Ų¬+ć&våŖĖŽgŠ“xīʅ[łį3|w“ē7s’‘ŠlĪ+ōyäs3ˆˆ_ÄĒļMeŌĻŪłķĖ=}ś"nQ‘ąŽ!żX—š@@“fxū··ķó7IĖ?= ź3ÓqפøéšpĢNŽkķļ͟©Ł¤ü7ėŽož‚ÖWżĪ‹¤üū£§O_Äm^eHc°[ĄL±.^Xz™x>‹ÆŻŗŻ~oūćø’Ž^õ4ņt{ˆˆˆˆˆH —z*™“““R„ ¦ŗ?ÆųßĮ»±KŲ·{ ‹nē†čÉthą@Čī¼·ä²Mķ9Æ}B÷Æįy+ٵ;€šc›YĮEō9Æq±ćĪ8ÄĖĻOcżŸŁĖ•ŚųŪ³‚øō¢®$­—9īfŻ¢…œ=ōśžw–§›@Ŗ¹)S¦¬ņ€ü‚Åŗž[°žSš3×nŻž8“ŻRf†2¦±„Ų6|?Ą ‚uėg»c¬Ēūż·sė£ķ:t®Ņ‹ """""åc6›]~v¶Ķ“iīOąšįĆ„:Ļ&Mš ē‘ņ1 1@]°X×3 ÖӀ̂ĻÖuėqÖĄˆuKg&ėā6 ‘ZC©5‘ZC©5‘ZC©5‘ZC©5‘ZCł{÷U•øü™É¤BOčŗ€”P¤ˆ AD]QWA”•Õ]Ėŗ_÷§nc×µ­®®Š««čŖÄ‚ŅDŠz ½·PŅéeęžž˜Ād2 i$˜ł¼_ÆKĪÜ{ιēŽäŸy8÷\š!Ąg„ŸA|Aš!Ąg„ŸAøā|’łGś|ńžŗź!K]|Mń«–j’Į“2[©mėpåggŖČŅP]® «ŚDÖõ«wu…§”˜Ŗ˜vaÕ«oŌõ• >bFŌ:³®½īfI’%¤³FŒ„['LVļf9Zū}œ6%ēÖõ«ĮŠ”Õ?jķęŒjÕæyŹ}š2ęŖŗ¾ŌCĢ€:a*õ¹}’‘²ģüT{Vm׀{K’вŽiŁė”ļ¤ü¢ 5BmĆü%IÅł)ZµlĪ›Ćd;wN]FŒUÆęį:ŗī{-ß}BA GźŽē“`y‚.Ū4}śt^’ƒVī:¦°6–¹]§óżÕēĘJް^§² u=Qƒ£Cģżē%kåŅ5ʱ„('»XżFŽ¢nupĶ­Ś{Ram©aīN%Ÿ+V÷[&kptˆ¬[©ŸŽ\Ł²Y ģ’_@“n«ÜäĶZ°jŸ"š6Wfś9E÷øN×õŽņZæy`š¦(ØįHMŌ®ÜūPŽXo˜W“9TMżżTœwеoĒāŸ”–ÓD·»]sŅ“jń.×±Ż —ėX†EĘܬŗ*aÅIR‡Į#]uBŪōр°×ēŽ×Œ$å§gč– #d-ĢÖöhōÄ{ŌĮæXū—ÆuÕŻ³h…’³£5aģ­ź„óZæhµ$©óPūl–¼SI1įnu “¹Śu|£$) ¼æn½õVŻ2*V’Ҳæī¼gŖF„ž…:“eY™õū]7¦Ō½)ė>”7Ąf„Ą¤Č0d2] .ödŹ/¬„$©U€ŸN\Ų-©Æ$igf,ad–ŌØĻ­ŗæŸæ£UÉ’ó6—˜|b’` j/K`“£ÜI“Y­-:œ™čŖ¹3³@Vsŗ¾’ž{)2J-d-чpW»ēUž¬cŪõćę½ņkŲBę¼"6k9µM„ö”}*?ų6‚øBŲ Ó”QdSP£®}&y®j”,6{=³‰Z&·cVo‹ŽšĢr&óÅ6gņ l„›oä}Ą&?I{Ō`ÉŹ-Ź ģ®n¬£óNčdµ­J^OY÷”²coćoź„Ēy£X»śQ&s€śßŌÕµ»GD€¬…É’¤äB«üĆ.. Ś3"@Źū”åH:Ņöosė ā‚²Ł u ÆČķŒ6Ēłlnē¶•ŠćgÆČ@ēīSZU2¬:“ݹ ©­Üv ,fيŅå~“ؐL¦ {?łÅ—Ø_ŗ’²ļCłc<łU”Ém“ģaŠsó“}–‰E’æc p+ū»·ø×ŸõŲĢ!7­ėū žĖŗ©ģģģJµ SĶ~_±iMü2Ī8/Ú«Œōڽ=AēüškŠ £Õ¹q «f“¶ uśÄķ>zXL 4ōę!jh’*ד}MMÖ¦-»tųŠ~6æZmšŲ mŲ(_{÷ļמÄSźÜĪOIéł:[ŖœÄMJŹČ’­8C¦Ęķ•rx—lÅgeiŁAžĒö*1æXg‹+¦U¤š“oŖó§Ņ”°y‡Ž9,KėĪjŻ8P;ć—č#8yŸŽøµ‹i!ķŻ·]ŪvķWbā1uėŚEĶżĪėšÉ}:qś¼Ś·¶éDZžĪY[*¦eX©śy釕’‘%[QŗŠƒŪØeÓ 2ļƄʂ+Ē‹/¾øAR±$«cs–‹åBĒĻ"·²{=›ŪVe¦*¶qB܃I’‚$K ‘ź(;?¹ÕqÖ<|pĻÓ1ŗ×ź/@õ†Qīē²öÕeŪ”¤D„„„Uź:£¢¢Ä÷ zL&Óė’ņ%86g9×QĪ–”ēųģ,;ė9ƒē&Ł'ž8· ćŃą3B€Ļ >ƒ ų ‚ą3B€Ļ €ząWŸTll¬nšüI‰żŪ’nGķ>įQ=ņĒčOOžBϾ·I’ōéĻhąąńŚ:÷U=÷Ģo4eģxżżė#®cī³;Ž~éQÅĘĘ–ŪŸT;” PY!P“™0I;ߌ—$%’š…ķדT•›õŚsOź™ēgiŇĻI’ī™5[ÖĀd­é{æžü÷WõĮ÷ė›×~ļ:ęnĘćĻ^²?ąJEõHP£qźœ>G©…6Å’0Hƒ-„ź¼·x‰‚Ģ&Y[ÉVtֱמõp\Ēö~"Ŗ8ļH‰cłU ?ąŹd©~€+ÉCĆĀõʆM:wżõŗG9„ŽÆ~ēŠKoØ«[”žJ`ŗō#-†Q\įž€+ 3B ^°¹žķō˵ī…ßėŽŃ-%nGķžšįRĶxr–īŌ[ņØaxķUjdѶ¬IŅłĆóK+Æ?Žƒ+_ژÜ6ɦ87?Łg™X$ł;¶·²æŪq‹{żYĶŅØqӊŖ ėB¦²³³+Õ&,,LWś÷•÷žł;%ģLTŖ)F£®»MK?ß”ßO»UŸżėmŲ•¢#9††ģ'“I‘IėõęüÕ:r4X½OļR¼čąŖ×“eĒQČ54zp¬ k–ęüē3%«¹®ļ×UW§źožP›·mÕ Ż¬Ō­‹“/?T7čYŗ?ćjķ[õ/%ģ8¢¹†śõļ«P?Oõu/¾ųāIŒ¬ŽĶY.r” ?‹ÜŹīõln[•Uå/Ń3q6$J ’,)DRØ£ģüäVĒY?ššĮ=OĒtź^«æÕcF¹ŸĖŚW—mS’•––V©ėŒŠŠßW€ź1™LÆKŹ—TąŲœå\G9[Ržć³³ģ¬ē Fœ›dŸ|äÜ*ŒGc€Ļ >ƒ ų ‚ą3B€Ļ >ƒ ų ‚ą3B€Ļ >ƒ ų ‚ą3B€Ļ >ƒ ų ‚ą3Bą öżēéóÅ{źzõfœ€„®¾Ē¦ųUKµ’ąI™-Ō¶uøņ³3UdiØ.WŠUm"KV7źz¼£/<„ĔPÅ“ »¢Ē xCµĪ¬kÆ»YūĪ‘%¤³FŒč%ɩэóµüū8匹GZ†H’nžr_]փ”C«ŌƳƒJ!WŽ8ļB N˜J}nߤ,;?՞UŪ5ąžĮJXµP SŌp¤¦Nj'IŹMެ«ö)¢ise¦ŸStėt]ļ(DZ-Z¼é“Āżņ„€f:ęŒz·õ×Ŗ½'ÖfęīTņ¹buæe²Gۃ–¢¬cZöĆ:åū)æ(HCFPŪ0{©[µxćiEå*8ę: éŌPÖ­ŌOG.Čl٬ vÉ/ ZĶÓJ³8?E«–­Óys˜lēΩˈ±źÕ<¼Ģ~ŚĀ!p…0™CÕŌßOÅy%Iż®SŖNHĖžŗóž©=r”śźŠ–e®c›Ü©ī£Fčʛŗčdjŗn¹å&uz³$)ļT’FLø[mŚæ|­«ĶŽÅ?)-§‰nw»ē¤iÕā]®c‹–lUPÆktÓØ±Ź=uA’Ōeš’¤€šžŗõÖ[uĖØXÆćܽp¹ŽeX4aĢĶŗ”[ V¬)·_ ¶0#® E†!“)ĄńÉTźxÖ±ķśqó^ł5l!s^‘ ›Õuģt”MĶM’ä'“É_a C\Ēüƒ»Čb2«u EĪ%ŗöļÉ*”_XKIR«?ø°[R_IRė&Įڵņ;mŠķÆįCŗ”3źŅćܙY KX™%5źs«īļēļ:Vń~šĒŒøBŲ Ó”QdS@ƒeÖY²r‹Ī¶Ó˜›®S—`’Ēʎ‹ÕʅßkłŅźqćõ%šü$•žX:Āøøāé€QwhHĻ–:°%^’ūby„®Å$Ćf?‡ŁæÄyŖÓ/P]!P'<^±bk÷O?ŹdP’›ŗ:vŚĒl®jņd2I†U‡ņ‹Kō“aåõ5R7ß6Y[‡–ه{›²&K’’ ­ņ»Ź~ܚ­’}±RŻ^Æ £ZŖ8'ŻÕ¶Å,[Qŗ.öXś=#Tœ»OYVū™Ņöo»dæ@mš«B“Ū&ŁĆēę'ūć6IžŽ-Ą­ģļvÜā^Öc3‡4jÜ“®ļ€z.ėB¦²³³+Õ&,,L5ū}Ŧ5ńĖt:ć¼ k®2ŅOh÷öók®A7ŒVēʁ’¤­ń‹”’‘%[QŗŠƒŪØeÓ 5÷;ÆĆ'÷éÄéójߌ¦iy:gm©˜–aJ;ŗG 6+!!AŪwķS^X;eī^”¤Œ,ي3djÜ^ĮÉūt$æXg‹+¦U¤š“mØÓ'h÷ŃĆŗ`j ”7QĆ@?™Ģj`¤(~Ēa%ČW§A#Ż0H’ÓBŚ»o»¶ķŚÆÄÄcŹK?\jœMŪ7ŃŁŌdmڲK‡ķWaó«Õ¦IH¹ż¢~{ńÅ7H*–dulĪr‘£\čųYäVvÆgsŪŖĢTÅ6īAˆ{° )PR¤`I!’Beēē ·:Īś‡īy:¦S÷Zż%ØĆ0Źż\Ö¾ŗl›’”Ø“““J]gTT”®ōļ+é;W)>-D};6‘$?±Y GMz藓ėzh€$Éd2½.)_Rcs–sålIyŽĻⳞ3qn’}b“s«0K€z`ó¶# u—:DŁHĶ,Ž£m'˜ix"€ząŗūiéź„ś”a„ĢF±r‹Bućų”u=,ąŠCõ@h«Žŗ}RļŗpÅć­1Ąg„ŸA|AŌoæ4]±±±śĶėļ©ŠN|3WSƽF3_}§Ņ}ŻĖ/]åe/=Ŗ§’ł²nžųÄ%Ū¶<½óźSŠÕ/’ś¦NX/Ūõ¶<½ūś³ŠUr~Ž«œRh«ņµĀ7„@=šč“’RŪ ‹zßõ ˜¤6īUĻ&Wė'fTŗÆ’.žĄU~įĖĶzģ‘'ōēß_:1™ƒ5ć7—$Ķśõ µ ō«ņõĢä–rC “9X?ž×RåŹöė~­š ¼5źs€»ŗ±Žūźø¦>ŚME¹{“®ózŹd?œ¹ļKżöµ jdNQÓ[ž¢§Ēµ×§o<£·ęgéūŚéżĖuD×éīŲózķćśnŻ&Ķ{ū Ų }üÆ7ŻįÅĒŻ®øµaśŸż[7†oÕī}Nū:ŻŖļ^~Ņ} n’JŸ¾ńŒŽų|æžżČp}½;I‡÷QŸ_¾Ŗgn‘$mśąś2³©:ś„jó™īšóĒ)Ś8’?śóętŻšēsĆ#zųŗ(}žĀ£śÉÜ^-.ģPnēYš=}€$“ŪyM%n‡·śžż†ķ|Ķu­-ĢŹIZ”ēž“T­»F)ķP²Ę>’']Ū<ä’×€Ÿf„@=Ńkę@%-ųN’tzćæ5tz7×±ž|C·żķĻśĖ?~­o^~N’tϬŁ*ŹŚ¢o:ݧ—^Bł¹YŗgÖlW›Ē\’ōĄÆ~­_ŽÖF’ńµo§Ń-C1L·“lؗ’ōx¹cŗgÖlY “µ¦ļżśóß_ÕÜÆo^ū½ėų3ļ.Ō„‡Ōō_’QöƓ$ ¼ķAūłŸ{^_%IZ¹)QÆ=÷¤žy~–V|ųÜ%ļ…·śžżŗ_«$żwęŸŌžéēō›'~£ē~ŪV/Ģü_…®?/!PODvž•,ē¾Ń¼bmųš¬iī:¶0#_?½>[}e‰n¾±‹cÆY†aÓķ½)ØŃh­ųr¶Źūšhöo¦’»aæŽ>|^2 õQęź|© ģżėŲ@’9PÅyG\GŁIOOyH’śßśæĻžYf/ļ-^¢ ³I–ĄV²½ä½ØXż’לUZ®FD‡H’B¢G(;é³ ]~^x4ź ³„‘fv×»;O(%č~Żnv{\Ä$ņ’4," T»Ę–ŠÆåŃ}ĘsznĘBM„°‡ĘUø]€Éäu’ķśTż–ź½·^ÓKöiŁÜ_{­·ś?(.½”®nQ±Æ±•­/If“dø>„Ž—u ųyaFŌ#ƒg\„ķ’ü‡Ś=ܧĞÉŃ”śrÓiIŅŃļ^pģµ/Zņ+æ}ŸµTŁĪ?“—k4Oß¼»Rnīe6·Ė:ĒÅćæžś±Śö„Žü«ĪZč:d6+Ūz±—?|øT3žœ„{'õvėĻVĘæeÕ÷ģ·äõŻÕ:LĖSs%I¹i+=±B׀Ÿ—Ŗ,įkrŪ${˜āÜüdŸeb‘äļŲÜŹžnĒ-īõg=6sH£ĘMėś~Øē².d*;;»RmĀĀĀōsł¾Ü,Fļ½6GÆžīQ…ū]œĮŠup“üå/śaķķ Æc[ėoż^ė·Չ\CzöRK’BĶyó%ģ8¢cY9ھa¾öļNŌń›,ķ®RLøæ$©El؞łØ~}wɰŰåé½×ŸÓÖ]‰:vĮŖ>śéĖ·’O[vŲĻ1zp¬ k–ęüē3%«¹®ļ×U›’„ƶÕ¦„‹Õyģtm/{øŅąh¼ŽZq@¶ŽźÕ1\‘IėõęüÕ:r4X½OļŅO¶žŚ÷Ó[JŲqDdzsµmćwŚæĖ~ž~żūŖeʆõć5@Ćz5sõ›_ÜR–¼boŸcSl’~н!FógæÆŻwiń‚ćzšoæQūżēg˽TĢ‹/¾øAR±ģٓխ\ä(:~¹•ŻėŁÜ¶*«Ź¼Ļ Ä=ؐ()HR°¤I”޲ós[gżĄĆ÷<Ó©{­žTaå~.k_]¶MIJTZZZ„®3**J|_¹Ø s¹fĘwÖūćŚŌõPš3b2™^—”/©Ą±9˹Žr¶¤<ĒggŁYĻŒ87É>IǹUĘ*ĮŠ¢æ½”ÉÚWæ+ °X* BĪīüLÆżw™ ;<¦æ7 ¬ėįUBؐF½īҟ^½«®‡T ĘŸA|Aš!Ąg„ŸA|Aš!Ąg„Ÿa©ėĄĻAzzz]@ `Fš!Ąg„ŸA|‹„@­³iŪÖ :~"]&K¤ZF…*?ėœ - Ō©gµŽ ؓQEg•’¬–ŃĮ^Ę»QĒOœ’É/BŃĶCT˜—­bæpµéŲ]¢Ā«Łiū·®Ńž Ø[nŒ®“ūś‰!PėĢźÓ÷I’%°•bcūkČšį*:wJŪÖnŖ£1:±#A;öf–1ŽAöńµŃ€ƒ4tųźŌ0O;7¬ŌŽÓłÕģæ“®}‡ŌŃ}@}njئ’ŸĢ ·HÅ9®}ւӦ²a‡ņż‚”—W¬®‡Ø]„æżXa†¶nŚ©lS°lYYj;`Ø:6 )·Ż‰ėµ5ń”‚›÷PDĮa¾`U»Į7ŖW“ ß¹EŪ’rdöŪ«5kŽČli¬Įƒŗ•9^ɤŻŹļšRŻzHŻGõ”$城«5[)4²‘²Īe©I‡¾źŪ¹q™ż—Ußy>Cē“yķ„·©sģ0ui\īy$)?ć€Öķ9§š€¶ź«^­Ć/y?Ėjƒś‡!Pē åœ9®ÓER«ƒ\{®Ż¬Óy5|čPuTŽv­Żī:vdĶ&„dśéŗ!×(¶]€öoŽqÉvm®¶÷]p.]†Rė›ŽoŽ)IjŪ«æ$ÉŅ]C‡õA¼3™‚ÕŠb–µą„k_PÓīŗiŌ-ŗfą u÷/ŅÉ}›Źķæ¬śN¶‚ŹQMŒ|Üŗ’’瑤µė( cOõ4Dłg/KåŻĻ²Ś žaFŌ”ā‚$mZT)§rÕfąHõq;œU$›łœ6lŲ …7VĆzńXv‘,Į-e’ŃeØĘtµT }–…% ­üL&5ó÷Óń¬”źß0drūj™›zP {eŽh*s~± ĆVnūKÕ÷ Œ–I&EZ”ž›"©Ļ%Ū5 Ō‘-«µ·[7õéÕ¶B÷³¬6ØB Y[©’Ą6Z»ä{%mݬŽ7S„Ÿ}ņ¾a’ĢĶ4hPRķ Ir|ł7™J~µ+Ɲ½½’ź>"`Qf±”€ˆ×¾u[ö+? Ęöļ„äåi:UTXn•­_‘vW ¼^”‡vi’¾ķJ<ž®1#ś_ņ¾”ÕõĻóhLL§īu=ØE†«d2(v`يĪiķšżrĪmčę/kž1)²I†M'fŗŚt ±ČšL¹6{?g޼x¬ĢvŽž=f]8Gęg–a='ļs8 VŁ– “Ł_Żū_œAa5$“ķē-“^²’²ėŪkY ’eȦäĀb™Z\²aĖÓŅå[ŌžŖ~ŗnPSYóĪ^ņ¾”×õ_ژÜ6ɦ87?Łg™X$ł;¶·²æŪq‹{ż^x%\vY2•]©6aaa ©T›ņŁ“cŪ&ežĻ–¬Ł*“†ØeŪ5 (VzźQĖČS‡ÖQŠlŃPŁgĻh’ŽCJJ:)æęmŌ¼żÕŗ [DźBĘiķŻwXI'©øQ'EEIR™ķo[§ōó¹2¬ēejŠB§)¹ŠŖ Å ŌŖYøZ6•Ž&ŅĮ#Ē•š’ŖvķŚ”Æ-_™ēNé蔿ŗ`n¤±ƒÕ¦ĮÅ׿66gėä©D:—­Ķ :S ,[Sµlāµ’²źg'mSĘł\E÷먓Ū6ėL”EūõS“P’rĻÓŖY„ĀŒ m;”¤ōS…jŻc€šD–{_L&’2Ū ę¼üņĖ$K²:6g¹ČQ.tü,r+»×³¹mUfŖb÷ Ä=ؐ()HR°¤I”޲ós[gż@Ć0ž®Õ߀j3 £ÜĻeķ«Ė¶)I‰JKK«ŌuFEE)¼A“š¾}€Oi޼łė’ņ%86g9×QĪ–”ēųģ,;ė9ƒē&9&©Ōt„ņ]1Ę\n!ĄgšÖ؀łóē×õŌ‚؀† ÖõŌ>ƒ ų ‚Øŗ÷¤I“&)ŌĻT±&‹®ŗŚŁĘß­\Įö—C‰1™JėŃg˜&MšTwćC½@õĄŽ*ץ(֞Ī6īå:d”3£X{vn­ė¢`±TØGšt魞 BŽ0L§÷­ÓöÄ ’¤Ą†1|us”Ź;±QŪūĖāÖJcŪ(ė\ŽB#ĆtlóF„ä—ØsõĄ›•«­ńuģ\¹A›Ɣ)صÜ«ą“ĆZ‘°«Ģ¾:÷ŗF=Śūė§YźŽŖµ"”¬EĖJœ# A{ ½¦“ /d)’BJ]ß^ŌĢ€z$"uÆ6¬_£<Ø˜Žƒ\ū» ī„Ä µaŻNuč=š’żt½6V¶mю;“e{–ś_Ū¹T[ÖØø8SĒĪČ/°]UψēTā…l­Žŗ«Ü¾īÜ æ€fźy@ėVo—Åā_ź݆^­ó[āµfŻzķNk\×·õAŌ#‰ %IÖĀS2[øö· öS‹^żŌÆwHʼd?B,:™cŸRœsRž”JÕ1¬Ł:hm§H‹Yaķ;jCµźŻÜŽŽ’° KõeH2éhF¾¬'ōķ÷„‹ilQb¦żš 3ÕõķE=Ą£1PåHܞ ŌBkÅś)ŃŃŅKG%IZŗt©$)iļyõn¤ -R“s’ %‡Ž¢Š CžGN_²/§|£ĢQWōź€ cFŌ &·=÷J‡s‹Ó,H’Ѿæ—6%ŪŹ.RėPū’[BZŖ8÷ˆ${ā A$)7u]Õ^%Ūϳ7WżcŗéPjž«NY}y E<Ēq,ĻŖö $Ižmźś&£ €z [/ūŗ}{^Ub’«ŚI’®Ž*’ĆtķŠaźrR2YŌŻŃ¦OÆ^źēXO¤OĻī 6›t(~“Āz÷Sļ«{«_ŸŚæßėymE:ŌYū“r%I9IŪٱ@Én3OŹź«SO瘻«¹æ¹ä˜ćŲ»v‡"ū_«”ƒÆQ·¦ÉʳźU×ŗ¾Żų«Ź ¢Mn›d¼Ę¹H ”$)XRˆ¤PGŁł9ȭ޳~ aO×õĶP9†Ē# †—GŒ2{Ø«¶)I‰JKK«ŌuFEEiėö=5}ūŸ2yņä×%åK*plĪr®£œ-)ĻńŁYvÖ+”Tģ¶Iög„œ[…1#ų ‚ą3B€Ļ >ĆR×€ŸƒįƇ×õŌf„ŸA|Ę@4kÖ¬®‡ 0#ų ‚ą3B€Ļ >ƒ ų ‚ą3B€Ļ >ƒ ų ‚ą3B€Ļ >ƒ ų ‚ą3B€Ļ >ƒ ų ‚ą3B€Ļ >ƒ ų ‚ą3B€Ļ°Ōõąē`ūöķu=5€ * **Ŗ®‡ šh š!Ąg„ŸA|Aš!Ąg„¼š’ŁĖš6mšŽœ÷Š ū¾³»ŽŅ³oķqÕI_Ŗæ<öˆžłÅw^ū0Œ}÷ž¦M›¦Œ"[]_RŁóŽļõĢk›Ė­cš’Ł?5mŚ“*cöS³+\×0 ōķ¼·4mŚ4Ķłlž>’ßGzåo’Tü‘¬Ėzž’Õ mŹ.ŗ¬ēØi!Æn›ņø¢üŌiÄHYLö};ēŸŌłżóåČE}ķ(µˆŃcwŽóڇÉØq“Ŗ\N«_yŖŹĮŒaĖÖWi”}š3-.»“)Pć&ŽSå1>ūg+\×d ŌųɏJ’n˜p‡¦Ü}Ÿ¼-XŸæńīe½?Ķ,~jī’óŠ,u=ĄŹdѤ®‘šæö“nŪZ¶āsZjŒŌµĮßhefnŒ ”5’°v·ķś_öģć«ōVÜ…ėŒ𦻆FK2•č6'iµžżłµh|V§ĢõÄ}Ć%Ił§4ē£Mjަ±Ī$Ö5<¤Ž µvžūš»,QOŒė©ųÄ3J=‘¢¶ĆT÷œµŚ–ž©”ÄTu3Sw]Ū²œ1\“wõ"}¼?Sż>žÆZō»Mćz7*óÜŽdīūŸO˜Ø1[ōÉγšÕ·‰Ēõ­Ńļ-WhT”"£ÆvķÆĢu,ūņĶ[š Łoæ«mß¾§/W×oĒ÷Q|āi%%&©ó˜_énĒõŗżĀJ| jŅLÖƒ®Ļ+>|UŪĶŃj’}X­'jśønZöå;śfM®~{s”&lQŠśč¾k•ø?ł›^Տ»‚u’óæUßąƒśĻŸēčx«!š=sŠš˜Õģg„ü¼F ØU&\­ōÕ[$IŽĘ©Åų«5ģĘ(­ż1M’tfŪ|õ¼µ«ž¢·æŅ°éÓ4żŃ‰Š’|Ž×>—ükžŗÜīšśˆŽīŽtq’«©Å]S5yņdM½3J’}m™$iČmŹZ˜®]Ęhڌ™zö’¦hĶ—³•6ąvMŸń˜~÷ĢHż4oN…ĒŠ}ŲIŅÄ©÷k\ļFåžŪ›u_$źĪn‘ź5łvŽ[Uźų¢7æP«©OhÖ£34¾ĒמŹ\Lj‰»Ś˜ų°lEŚÕy“š1SĻžn“āēĶQyŠrĻjõ×ÕīŚū\ū¶īKÕcS§čž&*aÉÅóēīW|ėŃzd֝*(Č+u&=ų¤š†Di`“ ł‡öŅ ¦įzō”I’¤ęA 6›ōsB(SH‹ É^”3Å6ķū*Q“ŗ7T³!#•¾v•$)aÉŻāŖæ>³@Ūā>ŃÜ/6j@æ6^ū\“Y ~2ł…ėĶ<åŚ’ÓŁ|Å6 ’$5‰U^śrĒūķ”­C%Iž”=$I›K’Ā{ČZ\©1x*ūÜ%ēīŃŖą±jb1Ė?“Zå¬ŌV52Öfhh«0IRX›”nG*s¦R톓r“ ė^āz=­üę+-Z¾A‘CÕ³wõtķź„(Ąd’Łæ©lÅY®¾ ĆŠš˜„Ōėœ^Ŗ?“_¤¦ö9”łÉ9’Q¬%ŁĆÕ:ŠO’Ō$²E…īļ•„Gce2™ƒ4±}°¾K>£Ä‚ėōG³äß_]‹’«ųŒ›¬°°Ši.I:ŗv›¶ļÜ =ŁV īi[ū®aZśžgھ’€RĮ:wp½’lžJŻ»ŖBבnD(yĻ2Ē=3”¼ļ'>’ŖSłŅ ]]õ2ŌH}ŗŲż1Œ-ˆ{_¦*5ĒŖ ÖŌ2øäųĆNļÖ׫w)%%PĻÕS7„ļŒÓžCößMD‡ŽjźXųŌóžHR“.Azēū(M¼©“«ĻÕßƘF**ąŅńĀ+Ƽ²AR±$«cs–‹åBĒĻ"·²{=›ŪVeUYŃÄ3q6$J ’,)DRØ£ģüäVĒY?Š0Œ§«s!jŸįńxƒįåqoūź²mJR¢ŅŅŅ*uQQQ oT©6@}S”½EÆķh­§‡4ÆRūččč×%åK*plĪr®£œ-)ĻńŁYvÖs#ĪM²OgqnĘ£1ą ­’ō+]õĻ?d±TP¦¬£+ōÅāĶ*nq»f„U|Ś+A(Sx‡õŠÆn¬ėaŌ>ƒ |˜ačŪyokŚ“išóŁ<ÅÅÅéó¹ļ鱙OÕõŠŖmöS³k“?Ć(ŠüĻž©iÓ¦ÕžxŒBe/žÆŅ~’¤2|§¬Å uįŪ¹:õüŸ\UĪüķĶ*wŸ½ä„żžIY‹½æ„:}_iBĄ‡™L?y†$é† whҤIšrļt=Šī習³’x¶Fū3™5nā=u3S€Ān¹O’:rŒĀo«ˆń÷ŖA«‹æ§Ęæ{¬R]ę¾’'Wš6ŗüėŖlßW²Ÿ’_6 šJ’y_Ēģ…ø÷’ŸVīŌ]³ÓĄ¦ōŸæ}¬3Ż®Óī»CŁĒWé­ø= ×54Mw Ö²/ßŃ7krõŪ›£“0a‹RŌGżšŠ»‚u’óæUßąƒśĻŸēčx«!š=sŠņO'hĪG›Ō¼McI:­kxH½jŁ—ļčĖ•ĒõŪń}ŸxZI‰Iź<ęWŗūŚ–’äõÜī–}łŽę-MŠģ·ßU³ö-žÆ~ŹŽT óķæŠNO’²ōš+>|UŪĶŃj’}X­'jśøn’¤œ¤5zć½å ŠRdōÕ®śk翯¹ĖõÄøžŠO<£Ō)j;üAuĻY«mé™JILU—13u×µ-KŒgŪ·ļ•{me3•Ś4Ķ®ä,™«¬Õ;Ōō/)÷»w•³åˆ‚nś„ōŹ×™}!æŲėÕpģĶ®v›WčĀŃó üzžü{ܬ°ī‘’¤¢ųvVÅ) øī>EÄ6/Ń·ŸÅ¬ĀUó”“!Ó9f·V£ICėśøR˜$­üę+ÅÅÅ)..εļŽū­ˆ ŗ¶S„#ū«ÓVzņŽŪ%I‹ŽžJƦOÓōG'*žó9’¤Vqī~Å·­GfŻ©‚‚3a}f2ā>ѳIśµq“0É0 ‰P@Š@½žĒ’¤©}Nh~rŽnkØ%ŁĆõl żÆt±łoö ŗM÷Ķ×”ļ24>*Ōµ’śĘĮZµļ¼$)u͇eö%I~A1ŗ#b„āæŻŖÉ=¹ößŌ,X[2ņ%IłgŌųŗrūqīõ~īŅ5ļ@yć/KÕy€~łųtå$­óŚ÷ū‹7iü”;4ņś˜ēØÕÉ9’¤ÜäåŽ7o{Rć)æŻKæy\;sŠŹ¬aåµ¶+Z?Wŗ~’Ż¢³ŸmōÖ@&³Y6›įµ½·±;{{•,ķ{«Į÷ȖŗE?7~UhcrŪ${˜āÜüdµ,’ü[€[ŁßķøÅ½ž /¼0¤āC€ŖÉŗ©ģģģJµ S@`p]ż²0Œ-üź}8’ŖĀ‚ŻæW»w¬×ĀŻē4zĢMöJ&“Zd­ŌēćtclSWŪ¶=kŻÜ¹Ś¼k§†Ŗ_×fZžĶķ9”¢SłRD‡Žjźń’ߛt Ņ;ßGiāM.öŃ»…ā?Y¤Ä“G“qmšĘĢøSŃ!-śź=ķ?lļgP®2l¹Zøh…2ŌH}ŗ“ńzī×ōõ:p8E§ņ uķÖEł¾Vü”ķŻ“^­Æ¹OWĒ4*u/ĀNļÖ׫w)%%PĻÕS7õŠiØö]Ć“ōżĻ“}’„ƒuīąz%Łü•ŗw•öJVz”4šŖ®’¤ čtqˆvqł“”ä=Ė\ćIŽ÷“I-óŚV’½bn©Ø·ÆģF”²æ’L…'N©(Ū*sĖv²8c2 •½ō3?%k!æĆ›uöĒ h+#õ ņ6­RĮł"…tė\āzĶé{•½+Y†„Āķ_¹Śwī(Łņ”óćjٌ\å:##q‰ņŽRĮĪł÷¬ 6‘ś[{å•W6H*–dulĪr‘£\čųYäVvÆgsŪŖĢTÅ6īAˆ{° )PR¤`I!’Beēē ·:Īś†a<] Pū ’š6¼üWµaWTŪ”¤D„„„Uź:£¢¢ŽØRmPZQö½¶£µžҼ®‡‚:żŗ¤|IŽĶYĪu”³%å9>;ĖĪzĪ`ĹIö©*Ī­Āx4P ­’ō+]5ź‹„.«¬£+ōÅāĶ*nq»f„UlqSąr!\VįnŌCæŗ±®‡HāŃąCB€Ļ >ƒ ų ‚ą3xk Ō ķŪ·×õ€Z×»wļŖ65j{¬!PƒŖń…@-øÜĘŌz²PÖ>ƒ \©jüI‚P×jmiź!¬’~VjcFˆQFYŲ|KE2‚*ē<jĆ1 ĀRKēķóqąJaś.ī}-\¶]n”H‹IւsZ»žŽ|ėu=¼jŪóŽļõqĪżż‰ž—ķ æ|Oß.ݬŁoæ«&žUūæ’ćėiįž 5k¬s'öĖŚj„¹óšZ«ēßA„Š•‘šŖ–żĒė¶aKoągՙɊŗęNMŅŚū5m^¬ų­¦½ś¶b‚üŹSnź =ńüz÷½÷ʬS¹Mo}°]įŹŌ iæRĻp’Ź\¶į±I{’¤Ę\Ī!e…!žH ’L¦@ŸüØ$é† whҤIšņ‹éśe»ŠżöźWžRF‘­®/Ć+Ɩ­ÆŅ(ūąg:[|łĘ8vā“jµ?·ē3½¶8KÓ¼O“&MÖC³Ձķ›ju¬žwŽu·łõƒJżöu}¼żL©ć“'ß„ū¦¶Õ÷ŸüÓkóߚ­Ÿr®Ņ™KżmÅZ“(š’_Ņ·¾ū©Śßs§īłEŒęĪŁ^ŻŪP^rYņ‚ššRV Qы P+āW-Æt›ƒūwkō­“ki„¦R{ś<5[’“ģĖw4oi‚kĮ7’{U‹ܧ9sęhļźEśx¦ś}ü_µčw›Ęõn¤üÓ šóŃ&5oÓXg’NėšRZöå;śråqżv|Å'žVRb’:ł•ī¾¶e©s×D’”¹ļj*Ɩ«mFiś#éńūŪé‹7¹źlŻ—ŖĒ¦NŃ=LTĀ’‹ēXņÆyźr’=ŗkź#:ŗ»ä¬”ž·jśŒĒōĢÓ#“źó‹y,zū+ ›>MӝØųĻKwķłBµo\ęu”w?ŹśŻTu¬žĀŚÅØ kc©æ“yó>ӂm ō‹_\ÆŖ²œŌ§‡ÆŃ€—ž/‘T`UC³L–²Æģ©*ņhŒQN›j«‰!]’£¬@D" PĖŽŚ[×C(× īš²–ƒēl‘ņ’oū§³łz¢I$)ØI¬ņŅ_“4ÖÕĻnj ’°ī²̽l}ēīŃŖą±c1K–>j•3G[³Ē«o˜sm {_¢C$I”-ÆQAęk’ģ³pžzɾ>ŠĶæ©lÅY®~×dčéˆ@™ü‚õę?ž*qĪa-B¼Žk}f2ā>ѳIśµń2Śņæž^ź~”õ»©ŹX½ń<‹óļäÜŽ·ōüß¾Ö³§Ø*¶|ō±&Lż¤ģKW6•łįR •=9¢ŗOšTŲåZ,ÕŪ–µßV¾§ü5L&÷/©„ævUä aMō‘üĆWjŅŖ“āāR$IĶ;†é»Å'Õwr‡õ\½†Üæ`ļüö}ż˜”ŽKC†!Y ļ_'ˌˆLҰ)÷ŖWØ÷>†źhJ®Ō8ØJ÷㢒æ›*ÕCÖŃĆ ÷>C)8Ŗ­ņĻ.‘Tµ $©QXšµŒIR\\œ¢®æUڔ¾­üt®Č¦ S¦üŪTę4†ŹC¤Zx‚¤6_Ÿė|Ų<ößżŠĖųŅą§C¹E’ģėN\l!˜Mʳ]lwS³`mÉȗ$åŸIPPćėJœĆū™KŖv†UqńyśÕ=S4iŅ$Mš4Iw?x·ŅW!«Gåµ'ķ³²“Ö(0r°k’ū‹7iü”;4ņś˜ēŽ(H«NŲŪd$Ģ-1‚²¦\ß8X«ö—$„®ł°ŌųGÜŻOGž· Ä}ÜžõŪøå’n*?֒_“mÖsš÷y¢śŽå\¤äńüŒdł‡ōTŁl„ĪõŅo×Īūxļ˜8Q“&MŅÄŪo‘$Ż>q’+qÆ'I×·UBV‘ņ3·(¼Ż ŖĻĄ3ؕI~UhcŅÅhĪ${˜bv”żÜ6‹ców+[܎¹×5æšĀ Ćkć‚ų¶Ż;·ŖOæ:wö“¾üś;­^³^ [·—Ų²³³Õ®żŗ •–š¬N]®ŗģc3Œ-üź}8’Ŗä,«‚ŪÄØepÉ9ƒĪčӏėĄįCJÓ@9°^Ē‹‚ÕÆ[…„īŠ× 'Udk©˜V!jŪ»…ā?Y¤Ä“G“qmšĘĢøSŃ!-śź=ķ?œ¢SłŅ ]eŲrµpŃ eؑśt)ł?üÕķcžēÆjó‰`……uPLŪpIŅѵۓ}ēķɶjpĻ®’¤ hXX®’Æå«3tėĢ{Õ6"@’vz·¾^½K))źxīØv˜ŗ©WLCµķŃP+>ųL »wé`a?Å^­E_ĶŃžĆ)JĖ7JŒė“šŖo—ÖjŪ³±ÖĶ«Ķ»v*1`ØśumVāzC¢{+ĘrXŸ,X«“ǵsĖo9ZŻŪF–{?.õ»©ÜX#•“c‰MUaAŽģŁ®Ÿ–Å+ś†ūt÷ Ö2Œ-ˆ{’āń};µvĆyzč~µ‰ (õw•±~„–o\ŖƒGR•žoČfŽRŪfAZżż÷йa¤¢ģŃ@qŽ}÷Õ<:–”y†z_ÕE“©T½¦W5Ó÷’]¬£{Nė–‡nU³ĄŠE ƼņŹIE’¬’нl…ŽćEneē1›ŪV­Ą¤RóøµqoēpH tlĮ’‚$…:ŹĪ-бßY7@R€aĻWēBŌ>ĆcւįeƒQĘ̆ŗjūł'sōĄ“Y:rhÆ õż+•ššę:«É“'+ėB¦ŅO„(++KŪ6Öā[c|Ó“iÓ4ūßļŖ‰„6\@mŠŽŽž-©ĄcĖwŪr$å96gŁYÆP%§JĻ$©Ź_Ų„/qŸÖā90ē1«Ūg›ć3ŌŖ€€ŻxżpŁhŃ¢…n½õVW‚ZbŲŪ°ÖŹƒØCV•Ģ ܳ²Ö ±yģ÷TéæšĖłś\ĻA{>’cu» ¬ N„†küø[Ō”C=üšĆ2›MŹ8}Ŗ®‡åSƽ#Iš÷m]——s"„só¶Vˆ·G_j4"«É×ēVäĶ0ī?ŻgƒTe­Ø‘ "4ö–‘’ „$ĶʤõŚ4vņ£Ė“G¾Ąęe3¼|.k–ˆT”HMæ>·¬×ąxVrqUN5„  _)IĒźz@}V¬ŅO‡x[ÕóM2WȐ’/u.™Ģx @¬^ŹVŁĶ)Vķ¾ĘŌ>«—Ķ}ł o3CŹ BŖŌԌK-Œź >œ”‡Ÿ.¾r׆@­Ų¾uc]šEEn›ē«sݳĻ0Ä©FÖ­ÉGc<Ÿåń|ōÅłÓĻqŃĪ%žÆć€Ėj[AP u1)ŌÅÄ=ń|tĘŪŪcŖ„:Aˆēć1Ī}žAH±ć<…ŗ8 ¤Tųq䊎æĆąéŚėnŖR»œ¬³u=tąē®XĆϟž³C<× ńTåuCjrFHY‹¢:Ógųį¬ū…€ś­Ą±9Ļ0Ĉ8³Ļ5CjDuƒĻ…K¼Ķ1«äLy“! žs!Žf…xĪ ń‚ŌČ[dŖŗ6‡{;÷ÅOͲ‡+~’ü%8>ūK t+ū»wž š8īģĒāÖ·Ÿc3©dĄĀ[gø¼ •ż¶XĻ'DÜuqĪöšœ Rģ±ßsvH”JĻq®ā>¦J©É·ĘŲd%œ?ƒ•.'īwæažošqÖ±Øō›fÜó[’&s€ź3¼üōüļķÅ)V• 6Ź =¼½MĘŁŸū9«­&ƒēśīAˆÉ£Žēb'*"yŽ<³JĪq†ĪÄ,Ā.7oØxĪ 1T2q9Źz¦Š­®ēėt/µhj„ÕDā¾Ö‡3 qŸÕ!/ūŻ/Āóbœ7ĶłŖ]ē£1&•~ėLyÆŽ% zŒrö{†!īY€ē Tœ³A<÷ąĆs&ˆ·Y'ÕCjņ­1RéĒcܟŪń“÷ŠĆsֈēĶs_pU*?!üąņ1¼”Ė CÜ×q¦@æó;ė¹·óģÆĘŌō£1RÉGc<ėx>WT֍“éāLēŚ R餼! ęy~æ÷|3¬ē¬÷GcÜg„øĻq_Õł¤ˆgR§ĘxĪäpßēØY%_sćY×Éی?ĒE»æ%F*ˆØŒ>ĄåQÖÄĻĒdŠŻ~ŗæ=Ę€X=>{¾y¦"!H•‚‘šZ#Äs6ˆū€Ķ*¹Ź«ē`½ĶńÓÅ0Å}m‰·ĆP×¼"ŽOõö]÷}ī!ˆsˆU„·)뼕V“k„ø"{bv«ļłV÷eÖÅ7Ęx[¤¢!a •W™ĄĮŪZ!ŽMuDœūmņ>ÄŪ£5¢¦Kõœū gØįÜē^ßóM3~ŗøHź„Ö!ģąņŖČ£)eĶ qBŹ @¼½a¶Ę§ź!ž3@Lņ>+ÄÉyAfĒO?/7Ėż&y› R•Y! ę•„8qń6;ÄŖŅ‹£z A<ĻS#3D.Ē£1ĪĮø—ݹ_œū ÷Ä3ń¶Hjuƒ‚€/«Īl‹ņ‰ņ^§[™Y å½}¶ŹŖ„x{{Œē1ĆĖ>÷7Źøß ÷…Q½!*ć|„ŌŽņ“q_'Ō3 ń|#Œ”ņCŹœæĀjzoį‡7ĪŠĆóu»&/›TžLBjĻ„Ö ń 4<Ÿ ¹TųQÖĻQS!Byį„©œŸe…e… e™0€ĖĻØĄ~oAFEfTd-j‡"5 \*°0Uąguf€†płTęq•²ĀUąē„ś¬–š*2[Ćt‰ņ„D%šąŹR^hQŁ7ĄTäU½Uv9B…ŹĢŲØč,’Ś?(ß„‚‰ŖĢīØČc7Õv¹‚„ź„ü|T$ØØJČQ£ˆÓå*ÓUĘB(@ķ«JHQŃ6—%qŖĶ įr½”Ōš..kųį®.C |S­ž®ō0āJ(­Ī‚ĄĆ’™(xacÅ)%tEXtdate:create2013-09-04T19:31:58+04:00Ѥ %tEXtdate:modify2013-09-04T19:31:58+04:00 łŖœIEND®B`‚apache-couchdb-1.6.0/share/doc/build/html/_images/intro-tour-06.png0000644000175000001440000016756012332105522024726 0ustar00djcusers00000000000000‰PNG  IHDRD8cµ<£gAMA± üa cHRMz&€„ś€ču0ź`:˜pœŗQ<bKGDłC» pHYsÄÄ•+€IDATxŚģŻy| ÷’š×n’Ķ}Š8BÄ]JE÷ź>*UW• ½|[GØŖ^?ŃVK)”z+QZQŠ–:ŖHZBÜT$ˆ#÷ģžžX3v7{%ŁĶęx==ę±³s|ę3Ÿ™]™÷~€ˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆČ$$–Ī@5Ļ馰tt±dĄĮ""""""¢ŚĶb“Ź J˜āX ¢U] pTZ€Ä܆²¤_ž¼0@BDDDDDDd9å `»Yƒ#ę (JWb¦}‰ˆˆˆˆˆˆČr 1åŲĻ,s$eX.)ćūŹČ?ƬĮ EÖ{œ23u@”¬A‰žeʦgés&""""""Ŗ)ĢŃˆBĖ:}ˌI«ĀL0¶¶‡¾×ņHĢq.DDDDDDD¤]Yj„(ō¼źZ§oŽŠńfŖ BYjh@T'čxÆ/æ „U>CM[tA4' l}Ē6šµ  ¼5AT'©ŽåŗŅŠw|"""""""ŖśšA9Ō!rmōC¢±Äˆżō2E@DUY‚ Ŗ©Ę¼®Ą æ6 Ucś Ń ~ČUę%($QŻO¢ćÕ$*)oÓĶ@ˆ•ʼfp*ÆĘö'bĢz"""""""2̘>Ctu˜Ŗ )Į栈#P]ÆėŚ‚" ˜ŗ†ˆ@W0D[ DuŅ Ž”µ?"""""""Ŗ|ښŹ“jDśč} ԟė…uŖ…Ź6&rØX@ĘįsU'+ØCT"Ö*Æŗ‚"€įę3DDDDDDDd>†:RęUk‡“)‚ņy¾D# !"…zPD`ŅZ"ęØ!¢Æ³TÕ`ˆjÄZć½±µDō偈ˆˆˆˆˆˆLƘ ƒ®¦2B DxĘt?·Ėõ¬7i-SD4knØ34ūQ­"L60Ź!"""""""óŃ6ʌ¶Ś!ŏ&Ķē|Õy!hR¢‘–j'¬ŚŽY.å ˆčj¶¢-x” ‚Ŗ<ˆXkl£AŅÖ¹Ŗ¶÷DDDDDDDd>ŗ†ŪÕšĻųŖńa¹FšB_#R؏BSįf3ę®!"œ°Š‡ˆź¤±A須f'«Ŗ…ÅZ"DDDDDDD–§9ʌ\åU3 R¤±Ÿj€PÖ Q}Īö#€ ‡Ž5U@DŖ1Æ9œ®jmĶf2Ś&Ķ€ˆź¼šµŖb€„ˆˆˆˆˆˆČüŹ2Ģ®Ų&f+ ”AĶt…h„tU;]-7S×ŃÖoˆjŸ Śś Ń5©Q¤ŠŽI«¶ ˆj~ˆˆˆˆˆˆˆØāō.£9iÖŖĶeTB’3¾Bc}•Ø!¢mH\Ķ`ˆ¶@ˆf0D†Ē5C“DT#@顋j~ˆˆˆˆˆˆˆČ“:–iB„ę-Ŗ5D„¦0Śś–£tėĶcØD*ÜĮŖ©‡ŻU Rčź+D˜—©¼ŚØ¼×mF³łjĄ…}ŠUՄj!š5CT‡Ūµ†2ąae?"šĻōŖĻūšMf4'“)O@D¢c™°\µV‡fm ÷¢ŃŃՌ†ˆˆˆˆˆˆˆĢG×h2šÕžCT‡ŪÕ¬č`…ĒĮĶQg“Õ<ŃÕl¦ĢMiL݇ˆ®"2×RA’­&Ģ ‘É\æ~ššįCKg…ØŚ“H$ćńøß;E„yÕ`ˆj?$&«%bŠ€ˆjG5ŅcØæ͉ˆˆˆˆˆˆˆj>[”®1¢ŚźCµ¶I‰–m„øC‰‘ĒÓŹTįUhū£«ŁŒLeŅl"CDDDDDDD5Ÿ-J+t¦ŖŁ«WP ŽTxČ]ĄüĆīŖö¢«f"DDDDDDDµ‡ŠJDs ÕžG„`ˆfœAčG¤ĀMgLˆŠ †hÖQ ŒhŽ:ƀQķ!S™Wķ+D5"Ä4›ÕTø©ŒĄT©–÷Ŗ“j@DŪ¼ ˆÕŖ1!b e CµÕI•IšĶH+šJw+UY®-(¢mž""""""¢ŚĮcŖ­J“CTqQ%1źHz˜" ¢-=ĶŽQ4›Ó'(œ8"DDDDDDDµƒj+©Ę¼¶ŃgtE*¤¢‰Iō,Wķ%Vó„Tk‰XĮō"""""""ŖšTūāš­LķCņŖŖP-S2£ķU5¢łŖzņ&aee…nŻŗ”cĒŽØ[·.är9īŻ»‡˜˜œ8q E…;¢-·3f %%æżö›ÅņPĪĪĪČŹŹŖ”c-^¼Ū·oĒæ’ž[ī¼¾’žūŲ°anÜø!Ο?¾2‹¬ÜyÖ•Ļžżū£k×®ųä“OĢ–‡ŹŗĘ0vģXŒ? 4Ą;w°iÓ&üśėÆeŽĘkkk¼ōŅK>|8źÕ«‡ŌŌTģŁ³ėÖ­CQQš7oŽĶ›7ėÜĀ„ ørå ĄĮĮo¼ńʎ‹Ææžįįįāvʦ#“ÉŒ”C‡¢nŻŗb~ĀĆĆQXXht:;vÄ'Ÿ|WWWōīŻÖÖÖzÓ”߉Ƽņ FŒ:uźąÖ­[X³f öķŪgņkgˆfž„R©ŽėTś®“)ĻĮе4v›Ź,wS}īŒŁĘŠuмäņĒMmllšóĻ?£Q£FčŽ½{™Ī‘ˆŖ®ĀĀBäēēW8‰D'''H$®!ODUƒf% @½b…j ĶŚ!&ū"ØH@D¢c™jōFs^81ĶčI"VVV˜2e š4i‚ččhģŁ³‰-[¶Äˆ#šÄO`Ɔ j€U¦½{÷"//Ļ"Ē.{{{ŲŪŪ#55ÕŅY!3©ĢküÜsĻaöģŁX¾|9N:???Ģ;łłłųć?ŒŽĘsęĢĮšįƆ .ąÉ'ŸÄ[o½™L†Õ«WćęĶ›xé„—Jķ÷Ģ3Ļ`ĈHNN“nŻĖ–-CBB‚ÖYcә;w.zõź…?ü’ż÷Z¶l‰E‹ĮŻŻK–,1:±cĒ"77’ūß’ —Ė ¦ Ææž:&Nœˆ+VąÜ¹s4h>łädeeįŲ±c&»vĘŠ–}×ÉX†®“)ĻĮ˜27f›Ź*wS}īŒŁĘ˜ė yؚ2e 6lhtłQõŸŸ7nĄÕÕµBéāžżūhҤ ¤RV.'Ŗ4k‚ØĘ$Š[Ї(WĶS»«9/Ń1iÖŃÖcl¹ōéÓĶ›7Ē?ü€ėׯ‹ĖÆ^½Š„„Lž<Ż»wĒŃ£GMtŚesõźU‹·¼RSSįļļ/ĪSĶS™×xźŌ©ųõ×_±eĖĄ’ż‡&Mšą•W^،ŁĘōļßė֭ƶmŪ—.]BóęĶ1tčP¬^½………øpį‚Ś~ŽŽŽ>|8VÆ^œœŹ kÖ¬Įļæ’ŽČČČRĒ2&‰D‚Aƒ᧟~BLL ąÄ‰ųć?šÜsĻaɒ%FēĒÕÕ øqć†QéŹd2Lœ87nĖōāŋhÖ¬¦Njt@Ä×E3’Ę\'cŗN¦:cŹÜ˜mŒeŠ<›źsgĢ6Ę\Õ{@UÓ¦MńŅK/į×_Åųńć.#"Ŗ¼¼¼0dȐ „QXXˆ“'OāŅ„KhŪ¶­„O‰ˆ*Nh.£­5‰¶ ŠwØsufŖ¹1&0RaŻŗuùsēŌ‚!‚‹/āśõėčÖ­Ž=Š™3gāįÇظq£øĶĉįįįU«VA"‘ _æ~€‹‹ 233qņäI:tHlvóŁgŸaĒŽčŌ©ņņņąččØ7MĶ&3†ŽńĮ ::‡<żōÓ;v,¶lŁ‚ŲŲX@ļŽ½Ń«W/,Z“Č,ņĮƒhÜø1ó?0[YYaĀ„ hÓ¦ 222šŪoæ!!!Įز2”īĄįēē'''äää >>{÷īÕY-æ¬eoĢ14ļĶŖęĪĪĪ5jZ“hĀĀBœ>}ŗĢÕėĖ£2®±4h€Ć‡«-?zō(&L˜€ĘC"‘ÜęęĶ›šņņBHHąää„ŌŌTģŲ±ėׯ‡B”@QQX*·o߆‡‡‡ĪwĘ~6 ]m÷@II ¤R)>üšClŻŗ×®]‘62™ =zō€½½=Ī;‡vķŚY“)<ÉÉÉø{÷.²²²ąķķ&MšĄĘĘĘŲŻ„ŠŽ*P:Ų”Æa}„בxƚq]£Īh¶ *·:uźĄŁŁ—/_Ö¹Ķŋ1lŲ0ø»»ćņåĖčܹ3$‰ųĒk³fĶpüųqʾzõź…ß~ū ׯ_‡ÆÆ/F ©TŠæ’žPRR‚īŻ»ćܹsøzõ*Z·n­7MM†Ž‘ >Ø@“&MššįCųųųˆå>>>Z@¦r÷ī]Ō©S§R‚"]ŗtĮĮƒqšąAŒ9Ļ>ū,V®\iōõŠ%((ķŚµĆÖ­[qćĘ 4lŲcĒŽ…ƒƒƒĪ~ŹZöĘCó~Ń4vģXxyya͚5HOOG@@ŗuėf¶ņTĘ5öńńÜŗuKm¹šŽĒĒG|€Ō·ĶĶ›71ž|Ō­[Ó§OGzz:zöģ‰÷Ž{>Ōū«yēĪqęĢ­ėźŌ©ƒ^xóęĶ«P“:]éüśėÆ=z4Nœ8K—.”U«V1b„ĪūO[:S§Nŗ_~‰¬¬,¼’žū())1˜®®vÖiiiJ„hŲ°!®_æŽyóę”gĻžųč£””„Ī;ćķ·ßƽ{÷J]]×åÕW_ÅĉńÉ'Ÿ &&~~~X°`¬­­ńż÷ßkĶæ1×ÉPŗĘ0ęž3ęŒ½–Ęlcč>66ϽvĘ|īŒżl¢ė=z4źÖ­‹ļ¾ū}ūö5źšQķåēēœ={Ķ›7‡­­­ÅšĆÕVEEEøvķ’““accƒ¢¢"$&&¢ØØHüńĆŚj…čŖ!¢IWą¤ĢŹ‘č™×–im'$…ž“,ggg@FF†ĪmŅŅŅÄmÆ\¹‚¾}ūĀĖĖ wļŽEƆ įąą€K—.A&“”WÆ^8räˆų‡y||<4h€=ząąĮƒĖåĖåČĢĢÄžżū•')‘čLS“1Ēø~żŗŚ‡¾¾¾ˆ‰‰AūöķÅe>>>‘——‡¬¬,8;;›=(róęM±,āāā0räHH„RX[[,+]ąļļżū÷‹—^¾|‘‘‘:t(vķŚ%6GPU–²7öš÷‹pĻ€‹‹ Z¶l‰mŪ¶!)) pąĄ“iÓnnnf»¾•u…sÕ,ėÜÜ\q½šŠ„o@Ł?ˆŖmŪ¶aōčŃ茵«Ī€Ččѣѹsg¼śź«Z׿ųā‹HJJBttt…ĪSW:ß|ó źÕ«‡µk׊Ėvī܉5k֝NQQär9 …XsČPŗÉÉÉ(,,DĒŽqāÄ qį>vpp€‹‹ ž}öY,Z“H<Ž­[·Äf,Bg}×ÅĮĮ/¾ų"6nÜ(vÖząĄ“jÕ ćĒĒ?žØ5’†®“1éź ¬Ø2ęž3öXĘ\Kc¶1t“gS\;c>wĘ~6 ŃvŌ«WÓ§OĒ»ļ¾[­śŲ""Ė‘J„hß¾=‰'Ÿ|vvv(..¶tֈj…¼¼<\»v wļŽ ¬õ (’īLNNFqq1Z“h{{{CIi«(aģ¤M¹j‰˜³G"mÖ(‘Āįb™Lfp…B¤¤$äåå”yóę”mŸ³³³qėÖ-xzzB&“įæ’žSŪ’śõė°··GŻŗuÅeŖæ˜éKS“1ĒHHH€‹‹ \]]aooOOOœ8q^^^Édpssƒ‹‹‹Ykˆ@zzŗ8ßøqcń¦7µ;wīˆółłłJ„Édeŗš4h©TŠÄÄDµå·nŻ‚D"AżśõµīW–²/Ė1“Ż Ąć/’””µåĘüźj •uĶåĪ;:GcĒŽÅŪoæO>łgĻž-µ^&“!((H|ˆ,/}é¼żöŪxśé§1cĘ 2Ó§OĒÓO?łóēW(?†Ņ-((ĄÖ­[1iŅ$<ūģ³šńńĮųńć1hŠ ŹļÄÖ­[ĆŹŹJoķ:C7n œÖĘ×ĪŅęϟcĒŽU8IDµO³fĶŠÆ_?œ?¾Ģ#“Qł!>>^ †ųśś¢E‹hŃ¢¼½½(kŸ_¼xŃŲĻ„®NS+m8)sõ!¢ķDµøÉŖŗdffÜŻŻun#ü”™‘‘¹\Žk×®”Y³f8vģš7oŽĖ—/C”Pˆæv½öŚkZÓqrroÕ_“ō„©É˜c\æ~¹¹¹hŌØŠ‹‹qēĪdggćžżūhÜø1‘™™‰ū÷ļ›ōbYжD"1Ŗ¬„_*5ŁŁŁ@©_…÷vvvhß¾=^|ńEqŻĻ?’ŒsēĪ]öõźÕ3x Ķešlmm Ō/禦®*>ŸŽŽŽČĪĪ— ×633SüZß6ЦM¼śź«hÓ¦ \]]aee©TZźAŽ|óM¼ųā‹ųąƒĚ9šŗuė'''üõ×_:G]é4lŲcƌĮ{ļ½'6Ÿ»wļV®\‰Ļ?’įįįj0cóclŗ«WƆ fĻž +++;v _}õ.\ˆ‡Š÷Æ®{͘kēéé :›°Ō©SGoąV×uŖhŗ¦>‡üü|ƒeĄØėbč>6&ĻŽŽŽ¾vĘ|īŒżl–ÕĄńŌSOaģŲ±åŚŸˆPžżmeeÅf3Df–™™‰K—.©żM.A„÷öööHJJĀƇqāÄ <żōÓśjŠHŹ8oęeFs¹®htmS.ø’>ž|ņI£Č“jÕ ©©©āE¼|ł2† +++4mŚTģ=æ  šć?–śÅŠ’Ŗ+MMĘC”Pˆ}YČår±Wž7nĄĒĒŽŽŽfÆ@­/›7oVśˆ3ʔ•ƒƒƒÖ}…k„łA¶ĻĖĖĆŻ»wÕ‚ī޽[¦²7ꆁĶNŗĪĖŌĢ}…Ś3>>>b0Qx/¬ŗōmćā₯¾ś qqq˜6mnß¾ĀĀB¬X±B * Žx㠌;3fĢū}Ѧk×®8ž|¹ź „ćķķ ‰DRjT a(݆ ŖŻ×ĘęĒŲt ±dɵŃMʏĢĢL¤¦¦Š×^×pˆĘ\;”FŃōéÓµ6T}ˆÖ¤ļ: M4Ź“®9Ī”cĒŽĖ\"‘Ü&;;Ūą}lLž…!j+rķŒłÜ³MytļŽ®®®b%U111X»v-¾žśėr„MD5_BB¢££Ń­[7888ąįƇ–ĪQ•——'ClllŌj„Øņõõ… .^¼ˆ¼¼<ÄĒĒć‰'ž€‹‹‹¶du Äbh;Õåf®&3†Śöh{­°ćĒ£iÓ¦Z;riٲ%žxā µj¹—/_†ƒƒ:vģ+++\¹r€r”ƒāābŌ­[999„&}mÖu„©ÉŲc$$$ Q£Fšõõ’Ą¾yó&7n ŸRĶHLMµmø%‚!e)+mRRRPRR___µåMš4AII nß¾œœ\æ~]œ„‡0cĖŽ˜c"t€Ų AµåM›65{łVĘ5NNNʍ7ЧOµåżśõCBBRRRŒŚFųB]½z5’’’PXX;;»RĆļõėד&MĀĢ™3õC S§NZ€ĖJW:ƒ°ęµš`hłŒĶ±é:T­ļ‰D‚įƇ#22 …W®\AII :vģXīkwåŹ¢I“&HOO/5éj×mč:•7]sƒ1enĢ6ĘÜĒĘę¹¢×ĪTŪ”ĒņåĖ1tčPµiéŅ„(,,ÄŠ”C±~żśr„KD5ß©S§pąĄųūūĆÕՕĮ"3;qā233aooöķŪk †¼½½Ń¾}{ŲŪŪ#33Ә‡uõA #–U˜9šĢ „”uŃ„f*/¾ų"Ž;&#Z¶l‰=z >>^­cĮ¬¬,ܾ}½zõBbb¢X”  ’üóžyędff")) ŽŽŽčׯ¬­­ńÓO?é̃®45{Œ„„ōķŪ666Ųŗu+åCė€`gggö"uźŌi‰`HYŹJ›¼¼<œų/æü2ęϟ///¤¦¦"22?üšƒŚv†Ņ)Oŗ‹-¼yóšŃGĮĮĮēĪĆ“iÓĚ °dÉäää`žüłprrĀķŪ·ńÕW_‰MŒ¹vaaaČŹŹBHH¼¼¼••…˜˜,[¶LkŽ}}}ŗNʤkĢu2Õ9Sꆶ1ę>0`€Qy6ŵ3Õ6Ę~^ˆˆŹ£øø±±±ørå ŗtébö恉č1ĶZ¢Ęššš(Ļ”Œ©)bRå9€fTĘZe’°`Ą€ƒŹ$¼ÖŪŖNžžžóĢ}²T6B›zKCČ|x‰ˆˆČœ²²²póęM½£#77ŁŁŁčڵ«X›¬² µƒŁD‡Øā$I€|*ÆräČQyę…m «L€rČ]a2Ze2CÕP^^žÅžĆ”ŹĮkLDDDęäąą€ĘC*•B"‘ĄŹŹŖĢiH$ø¹¹ĮŻŻ·ÕLfļ^C—ŹˆTJs2=ž‡Sóń‘9YYY©uą^Ę6)%"2–¹F™!"""""""*«J«<Į€Õ: ˆQ­Ć€Õ: ˆQ­Ć€Õ:•1ģ.U@ń¹ PddÜNāź ėvm-rģ²°y² ąęfŅ4Ė,=Eē/Z6U@•øĀ€Q—3’C6øuĻpŻõ›EŽmW78}V5ĄŻÜ`Ó£ŠĻ]@IŅ ”ÄŸGqü9ż¹ĒŅ9«T.n‡Mn–ΆE0 BDDDDDDf'›0Ο†V`ˆ ėvm•µj† <|Ŗ37nX:[T ŖL@$&&ĘŅY """"¢rP(zßėZf©} r2pśT,Μ>eō9včų4:>ķo®"¬Ń$>>pžfeµ©…ą0’-ä¼1ĖŅŁ JPe"DDDDDD•A†„¼ó”Ńū„-łŠwą0KgæZ±żßkpzgN•«¢ŻŠAČqu2Ņ-23DˆˆˆˆˆØV‚!é÷ļ½Ļø^ĄęM›1’“}{8³Ņä¼V 77ŲN‹‚o¾·tNČĢ8ģ.™Œżü·į~dõ †<āšĘk–ĪUÖ!"""""Ŗ¦dEł°).ß[åg›üłŁ(ÉĖ4øUÆ^°Z÷#¤YŗX*LŚøźōķ†üŻū,“ɱw±tŖDˆˆˆˆˆˆŖ)+y ģ ó/(),b:Ų”ĀFõšÜ܀ €ӟ`l,Šæ?ž^ö}W¬(§ŠP`įB£“°3żY "„±É Ń#’ž8ié,T/AA@BBÕ †ĄģŁĄ”),Ŗź!"""""Āć`ƒ"Fps¶oWNęA¦¢ĮAx8PńtØFb@„ˆˆˆˆˆj=Ķ ƒ"z„„(k…™'}SCTÓėŲQłJ¤‚"""""ŖÕt?Ńąė :¤ģ›ĆµBÓC‰‰Źt£¢Ģ[FT­°SU"""""ŖÕŗtī7Ļś:×§ßæcé,ZŽ‚ŹIĶÉ\ĮAz:iŽs j…"""""ŖõjLŠ#+Ėōiš«ŸUB öõA•ˆMfˆˆˆˆˆˆjŠŲXÓ×ä0w0$==šĮŖt¬!BDDDDDµĪķ×,óYø TNU]zŗ²f;<% `@„ˆˆˆˆˆjĶ›6Y: ęõÜsŹ‘`Ģ]»£" ! c@„ˆˆˆˆˆjsęB.—C^"‡\^¹\…üń¼\^ņhr^”PTÆ Jzŗ2(r萄s¢; †…±"""""¢š(2 ³t.Jc0„ŖDˆˆˆˆˆˆj"Kē 4CØ a“"""""¢šĀߘ8 |}-u †PS#"¹¹¹ˆÅ½{÷p’ž}€§§'źÖ­ 888X:‹¤Æ_ű ɼOˆˆˆjˆŖQõÜs †P•Rć"GŽĮŋK-æ’>īßæ‹/¢M›6čÕ«—„³JZšśUːŒĮū„ˆˆØz“¶o» ca;|Šø‘„³cœY³”żšTEĮĮĄČ‘Ą'Ÿ0hS‹ŌØ€Č¶mŪÄ_9õ¹xń"īŻ»‡Q£FY:ˤBóśŁŪŪĆŃѐ““ƒ¼¼<¼~śš3@Ęą}BDDT=©A¤Õ%¢*( ©:½śūÓ§+ó% OL™ģŲaéÜQ%Ø1Ŗ9rÄąų<ĄƒŸŸū÷ļćȑ#–Ī6=¢ķś9::¢S§NčŌ©“šś•¦Y†öööpwwGæ~żŠÆ_?ø»»ĆŽŽ^\Ļ2¬„ūÄŽŽžžžšōōT»/4—ó>!""Ŗ\7ž÷#ūa’æW«g0D°b…e;{usSe€˜eĶ!"¬ß¾X°Ą¢ÅD•£FŌÉĶĶÕZõ[•B”@@@ąüłó”æ~źj'’ļæ’āĄ°²²B~~>ŗvķŠAƒ™%’IIIXŗt)źÖ­‹‚‚4hŠcĒŽE½zõ,\²•C×õ+))‹‹‹8ÆIßõ,[¶ yyyųšĆun³zõj<óĢ3hÓ¦Įå7oŽÄāŋQ§Nq™ææ?ź×Əäädæ¤=z7oŽÄ /¼`Ō±+Z†öööpvvF@@œœœŻŗuCLL ØÕ¶ŃV†W®\Į¶mŪ0ž|qŁēŸŽ   “jÕŖLēXV†ŹÄ˜kZ^W®\Į޽{1sęL“§]ØŽ'BĄQ&“©<ģķķŃ£GāäɓČĖĖÓyŸ”ē»ĖT÷IEņ@DDT-©>“Ww[·;*;Y­,AAĄäÉŹWc„†*ūc™=»róI•ŖFŌ‰5ŠĘĖĘʝ:uB‡ФIøŗŗźŻ7''[¶lĮ¬Y³šĪ;ļąwŽĮ™3gššj¶sØWÆ,X€O?ż:uĀźÕ«µŖŠ¢¢",]ŗŌ$iéŗ~EEEHOOGzz:ŠŠŠŹ“/  ^”””ĄÉÉ —/_6ٹ{yyį£>§‘#G¢K—.mV Z...hŌØŗvķ OOOø¹¹ĮĶĶ žžžčڵ+5j$š •aU£ėšŖŽ¦¼7ĶÅRyŌ¼Ö2™ vvv0`<<<ąįįĄĪĪ2™Lļ¾Sw•§ljó÷'Qµäė ¬[gžćųū+k¤¤„)k} ’]µ;Ŗ„ ©5DīŻ»°²²Rū#>//¹¹¹xņÉ'Ѽysq[{{{ń[ŲWUaa!JJJ P(vvv˜7oe°äĒ„\.Gaa!Ś·o!C†`ٲe>|8žxā Ź_ŽwļŽ·Žz ;wīÄõė×!—ĖŃ AŒ7‰DēłtķŚĒĒٳgѱcGģŲ±×®]ƒD"ƌ8|ų0Ž?©T 777Lž<—.]ĀńćĒńśėÆV­Z…Įƒ#33§NBqq1nŻŗ…‘#GāŸžAFFŽ~ūmŲŪŪkĶēåĖ—qšąAŲŚŚāīŻ»prrĀōéÓ±aĆ$''#""ćĒ7Éõś d ÜÜܐŸŸ/>ŪŲŲĄŹŹJģSDŪõ|äēēė]n Õ_½µ•£ "Ē0¦ ĄŁŁ7Ö¹mćʍ‘››‹ĢĢĢRūćüłóŲæ?šąĮxxxąå—_VŪFŪ=«ė³S–2ŃuMUļĒÜÜ\q~ĈZ h’üŹŚHk׮ŝ;wąģģŒ7ß|§NŖ²ŸŸņŽ'9998rä čŁ³§Ś¶GŽk{Ÿh~wéū,Šŗ^³lųżIDDTC™«?77eŚÓ§›¦iŽæ?pś“r„œŖŚ!,•[ˆż&Čd2x{{ĆÖÖIIIČĶĶÅO4ż÷ßHJJRū#_[æ#Bæ ”””hŻŗ5ڶm‹§Ÿ~Z|`ŖÓ+ ¼ūī»čÕ«zöģ‰cĒŽ‰‘ččhōīŻ—.]Ā;w0kÖ,Ą?ü€³gĻ¢C‡zĻ©Q£Fø{÷..^¼ˆ«WÆbīܹ€åĖ—ćܹspssCTTŽ}÷]X[[cėÖ­ˆŒŒDżśõµ¦'•Jq÷ī]|šĮŲ¶mbbb0kÖ,|ūķ·øzõ*d2™Ö|ŚŪŪ挵kųųćįččˆĻ>ū ‰‰‰+.ĖĢĢ«ņėź7&;;gΜĮøqć •Jń믿"-- īīī8sę rrr0oŽ<äēēćŻwߝĖĖB×õ˜āśŹ²²²pāÄ øŗŗ¢}ūöšńń¤¦¦">>J„Z÷5†T*ERR-Z¬\¹qqqāz]÷l»vķ“~v®^½jT™č»¦Ŗ÷cJJŠŚ½©ķ˜éééZ??¾¾¾øuė^{ķ5ń~OHHØŅŸŸņŽ'Ā÷ąŃ£GѳgO±ę\FFŽ=м¼<ƒß•Śß]†> ŗÖ«– æ?‰ˆˆjø+€ø8Ó‚‚”£Ä›>ŸnnĄ”CŹĪVĆĆ+³„ČĢjD@D`cc7774jŌŽŽŽprrB³fĶąźźŠ›7oāśõė())1Ŗ*õˆ#ŠÆ_?\øpgΜĮŽ;šĪ;ļĄŁŁ7nD~~>¬­­‘——‡ģģlųūūcūöķČĻχ\.ǵk×Œæžś IIIX±b…˜vaa”ĮćK„R( $$$ U«Vā/¢-Z“@RRīßæ–-[ĀŚZy G jš¼½½!‘Hąģģ,īēģ쌼¼<ÜŗuKk>ķķķŃøqc±SSäääĄĪĪάײ¢é>|:tÓ ĄįƇ1räH$''£Y³fāq„Śŗ–kJMMÅ’żß’‰ļū÷ļ/®_æ®÷z{ŒŠj~Ēj\"##ŁŁŁ>†ŲŸD³fĶpēĪø=j×Ŗėžmٲ„ÖĻŽ±e¢ļšźRPP õ˜×®]Óśł¹råŠųż(ļ÷ÜÜ\ÕėócIĀw—”Ļ‚”õĘn£/µõū“ˆˆØZپhŚ“|żtųś*‡ņ Ŗœf-ėÖ}ś(#T#Ԉ€ˆ§§'īßæ¢¢"¤¦¦¢Q£FšõõūNČČČk†Øžā)ģ«Maa”Ś('7nDll,lll ‘Hšę›o€Ų”ĘĘĘ~~~ˆEqq1Ä?š;vģˆēŸ¾L甐€āÖ­[„Ö Ü Mz“­ØTkØĪ “åóŹ•+°²²R[¦ķø¦ø~9998yņ¤˜ē:uźĄ’Q5·ŲŲXzōØŽrÖ{Œņ–ay÷Õdkk[ź³’““{{ūR…B”·  ¼/£££µ~vŒ)C×T]ĒŌWöŗī÷Ŗśł) ÕūÄŽŽöööbS™ŒŒ q»ž={b’žż×$Ńõ]©Iõ»KßgAW™„¤¤,ײäASMūž$"¢ź«(ś82‡=Wj¹ķ’^ƒÓgY:{•GÕ„o_ć·:H ¬üüķŪżūטĪVµŻ‡ŗøü¹6=ŗY:Ė&S#:U­[·.e#==WÆ^…D"Ażśõ!‘HpįĀdee•zĄSŻWÕéÓ§ńÅ_   P\\Œ»wļĀÓÓyyyšššÄĒĒ#''Gü£¹WÆ^8yņ$žłēōźÕ мysÄĒĒ‹}–üšĆ„žą×ōļæ’"##mŪ¶E³fĶpłņe( ( \½zM›6E‹-pįĀ1žł'~’żw888 -- €ņöęĶ›F•aYó)‘HLÖi”p „&0iiiHKKS»^yyyāņū÷ļ‹ė“]æS§NĮĖĖ ļæ’>Ž{ļ=qjŲ°!N:… ąśõė”Ķ0nÜø:——…”r4Å1ō•”©öõööFnn®˜×K—.”  ŽŽŽ”› 5OÄåt޳ŗ>;ʔ‰”kŖz?ŖĪė:¦®ĻOyYņóSŽkķčč(~OŹ@…j°¢WÆ^jĆ]s©~w*]ėUĖ†ßŸDDTIU€Ø5 sج”‘ |µD0D ō+bÉįƒÉ$jD \¼x%%%ČÉÉĮķŪ·įģģ ܽ{>ŌŁLĄ_ĖMܱcGܾ}‹/† JJJąēēÜæß|ó nÜøōéÓ›6mĀܹsŃØQ#@&“‰C>¶nŻX¾|9$ Z¶l‰† –:꯻w±pįB”””ĄĆĆ3gĪ„µµ5žxā \ŗt _|ńe•oa8Ņą‹/¾€••\\\ [[[ŲŪŪćÓO?EżśõѼysČårƒeØ+ŸW®\Ńŗ}:uPTT„oæżÓ¦M3ÉõÓ$4UМ7tż<ˆĮƒ—ZžĢ3Ļ`Ļž=xė­·ƒÅ‹ĆÓÓ͚5ƒB”€ŸŸŸÖåe”«…~SĆŲ2”J„ČĻĻłłłZŁÖV†ÖÖÖxżõ×ńĖ/æ °°vvvųß’ž'īļķķ_ż÷īŻƒ‹‹ :tč€cĒŽ€Ī{¶nŻŗZ?;!!!ĖÄŠ5={¶x?N:Uœ=z“ĪĻ«¶Ļ±ĄĘ^wc??;wīDAAF ¹\Ž’żļųę›o •J±mŪ6ŲŲŲ`Ĉ&æO„ę'ŖØīßæ½zõ*Õ4Å_Ēųŗ¾» }t­/,,T+›ŚšżYYןHaé,Ōŗśb›Ÿ%G÷#3 ¢¢ŌūńõUÖ ®z#½ųś*G ™=›żŠTc’rī#QŁ×Ze’°`Ą€ĒGóĀ{;•m„ķm Å<ć³PŚ‘#GÄ?ō­¬¬ąīī¹\©TŠ““4­æĘµiÓFķR²Õė'šōōD§N'Ož,Õ$„×Ofŗøø AƒØS§ąĮƒø}ū¶Z#å)Ƌ/āĄ˜>}ŗ„O™ŹAøO„N¢ˆ£6ŠŗœŸ5¢š%""żśõ³t6Ŗ½ƒź ˆųó—c³‰"Ę4½Õ¶ģ»UĖ0cĪ\ČårČKäĖK —Ė”?ž—ĖK­SĪ+ lŽ“ !ļ|h’óŠÕdĘ~žŪp˜’–„‹Ł2Ņӕż‰¤–u˜\K SFŖø®õ*œ†©šĢH$’0ł MĀ|ī£łlyŽ óĀv…ŠU&PØLF«5Deõī{÷īįžżū())1؟‚§§'’ĄÆBTƟ@čSD˜WÅėWšffffŖ?4± k'ÕūD[3B;–xŸQ„qs5_­VBB”5F¦L©1żŠŌ5¢ĮØQ£ÄźŠś“iӆÕģŖ Ķė'ō)¢łąĘė§[e|Ś“iĆŚ!Õæ+‰ˆˆˆL,(HŁ„†µĆŖ•SCDŠ«W/ųūū#66Vķ×rOOOŌ­[žžžāp”TõšśUːŒĮū„ˆˆˆČÄüż•A‘ēžSļ ÅĢnŚ:įŖ½;ś„ėļĻ1/Óȁ{—JĖæ%Õø€888°Šw5ĘėWq,C2ļ""¢`öl .NėŖŪ6šüįkŲ4ibé\ÖnnĄ”CŹėfÖC„YŪ⢃ņ„Ę=ÖŪ굥€Uuqq:k#äŪ¹ žĶ·ńō®_-ĖŚgÅ  Ce`Ä żŠ$Ų¹ Į®Ńlb5Ŗ""""""z,=śÜüęGKg£v V6”qs3Y’iÖ¶8ęŅ€Įa@„ˆˆˆˆˆØKX¼EII–ĪFķäļ$$˜¤³Õ;œvņ2ŗ‰ ʀ™TTT†Ŗ6-]ŗgĻžÅŠ”C±oß>½ūėŪī·ß~ĆŠ”CqõźUKŸ¦Åݹsæžś+ĀĆĆńć?bƆ ø~żŗ„³Eę „‡—i—āĢLÄæł¶„s^{¹¹11Ź#å`‰Z!RyI„Ė’Z"""""³2džzź)@½zõąććƒåĖ—£Aƒ–ĪZ°cĒ<ūģ³hŲ°!ąĘŲ¾};^żuŲŁŁY:{d.YYĄ”)Ą™3Ź~*Œ$4iüæ—-}µ×ŗuū1Ņܑ9Z:ē5"DDDDd­ZµBŸ>}Ä÷gĻžÅüłó1kÖ, 4ēϟǚ5k˜˜ˆ:uźąõ×_G§NJ„³yóflŪ¶ nnnhŪ¶­Śŗ]»vaŪ¶mxšąźŌ©ƒŃ£Gc芔–>u³“ĖåČĖĖCqq±øĢĒĒÓ§O‡•• 11ŃŃхBnŻŗ”yóęHMMŎ;šŚkƉū~łå—xé„—ŸŸ½{÷¢nŻŗČČČĄ /¼€«WÆāŲ±c())—— ÜøqGŽÓ读77nl颩=ĀĀ€#G€ŒŽ%ań Ōڟ£ĪØø÷ē>\}w!Ś’üœŪ?iž†„~~Ź”yõt¶ZÖdØ|Ųd†ˆˆˆˆ*]zz:žļ’žX·nŗté‚Å‹#''Gm»¤¤$¬_æ:tĄ[o½…8•įE“’’šõ×_cšąĮX³f  €uėÖ!%%ÅҧgvR©={öÄöķŪ±sēNÄĒĒ#;;[ †äęęb×®]2d^|ńE >»wļ.U¾š¬¬¬žžŽĘć…^@NNžžūoŒ=S§N…B”@\\ņņņ°k×. 4/¾ų"ˆ;w¢°°ŠŅES»Äʉ‰FoΦ3%%įŌš±ˆŸų*ņoŽĀÉŽCpū—-•sšĄ@ąōiżŠ\pš`_!•„""""2‹•+WŠ}ˆ¬[·Nm݉'——‡”C‡ĀĶĶ £FB^^žX£A @† VŖĘI~~>ąĢ™3øté „-[¶ˆMHjŗN:aŹ”)šõõÅĶ›7ńÓO?įļæ’ l>ćå倛›źÕ«‡7nLW”P ]»v”µL4hGGe•ż#F S§NHJJ‚——<==uėÖE:upóęMK ĄQg€›ßüˆć½‡!=śµåß| WŽ ­œLųś*G  VĪø-sĄ1—l"S‰r"""""³PķCÄĒĒYYYāŗ‡>üšCµ}RSSQæ~}ń}ff&ĄŁŁąźśøSĮÖ­[ćå—_ʖ-[šŁgŸP ęϟ{{{KŸ~„pqqAūöķѾ}{‰«ęää”*{{{äęę¢N:zÓ“³³ƒD" ¬ibkk[j›ÜÜ\ܾ}ėׯW[^RR;:b¬ījkә¢¤$Äæłv©@ˆŖ[ß®EqF&Z~¶6®fīÄŌĶMŁÆČ£¼!ś܎GśŃó–„‹«V`@„ˆˆˆˆĢB["į”|Į‚čŲ±£øÜŹŹ ēϟß»øø€LIKKS;ĘóĻ?Q£Fįʍ8|ų06mڄÇcŠ A–>}³ŹĻĻGff&¼¼¼Äe666pvvFvv6‘——§¶O^^!•J”P(Äår¹EEEZćąąP*ayżśõ1fĢKE“·x)öķfĶ‚‚Ģr ”éĢÓ»~µōéVš„Å+pó›Qü(ČŖĻM[‘wm6Pä›&MŠ I4˜ üL%%į~ō ¤1@bVl2CDDDD•. vvvŲ¹s'nß¾­[·bĀ„ ųļæ’Ō¶šnģŚµ —/_ĘįƇÅuŃŃŃ?~Ŗvīąą`éÓ3»ĢĢLl޼ÉÉÉā²ėׯ#%%5‚RSSŚ8>Djj*|||ąä䄼¼¦dó(8Ņöėåč~özÅA›Æ¾@£iSįŌ®mÅ@XC„ˆˆˆˆ,ĄŻŻ”””X³f f͚L:­ZµR«IҼysŒ7;wīDrr2zõź…ß~ū EEEčŅ„ Ī;‡U«V!33īīīxńÅѳgOKŸžŁyyya芔ˆŒŒ;JurrĀȑ#Å~C†Ž={öˆū >\ uéŅ›6m‚½½=Z·n ­A''' 0Ū¶mƒ\.‡‡‡z÷ī [[[Œ1żõär9är9:uźTkš*UšÄDå­ *k‹,X`Ņäkzә„Å+°Äų”‰5gfāōšqhłŁ±ę†„ˆ5HšØIFŅžƒ„Å+}ī‚EóVIʹDe_k•IĄ€{Ķ ļķT¶¶·U(ó,]DDDD5]DDśõėgélT{Äųńćµ®‹ˆˆ€æŽŃ#Øābcc1jŌ((ÄŃŌѶģ»UĖ0cĪ\e0§D¹¼r¹ łćy¹¼äŃ:å¼B”ĄęM›ņ·0…¢čćČöœÖuu2īźŽŃ××č‘eģ\`§æÉ‡[®5®éLŚŃćøśīB“ Z~ŗ’÷²„O­”ŪælĮÅ7ßōK7]§ĘiĪžK­J-włs;lzt«pś‰$ @>€‚G“0Ÿūh>@Ž£÷¼°]!€b• *“ŃŲd†ˆˆˆˆˆØŗ(Ć0»ĘØIMgŠ22påŻPœ1Īäµ&®¾·ޘcéS,„Į„1°~Ōו"DDDDDDµXĀāŹQNŖ±“£Ēq²×Üśv­ŁŽqgÓVœč5E–>]5õ'Œ¶tŖ-Dˆˆˆˆˆˆj1aŌ™źØ(#ޘƒÓ#ĘUŹH,Łē.ąōšqėlU›¦Ó¦X: Õ"DDDDDD5[q<‹rŚ¶:6¹÷ē>ŖīlŚZ©Ē‚"iG—Zg‰š66MšĄ­G×J?nMĄ€Q ä^\€§r _śMtĢNEżĀŲɋun_]šĪedąģ‹Æ ~ā«eJהŠ33qzÄ8Üže e禧†Åæ^©=ŅtüsO¤ŖvĆīFDDX: DDDDDz’.µtöˆŌøĄ½ø@|[ę€{6öøoć .+ĪĢÄÅ÷>ĘS?ƱtvuŗżĖ\}w”Å!š.¾ł–8Ź‹j?{Ņt‰ŒT¾¦§qqŹłŒŒĒó‰‰p7qg»µEµ ˆĄ°aĆ,"Ŗdžł'?ūDDTeš’$ĖłóĻ?-…”Aa.ęx€4k[ܖ9"ŻŚ÷w’…{īCŻaƒ,E5EIIˆóm¤G’cé¬tē—­hõYØž“9’’"§\GfU-"yyy–ĪY?ūDDDD¦§Y{ä^šąźĄĶĶŅYÜüęG$,^Qej…øē‹óŖåę&Ģg§S¦MšgĪ<l0ČQåTĖ€™GŻū·Ž   Oå«Tf­mA;y1ģä%§’BŲ(Ę'^©eEåSć" … …r¹\œ—H$‰D"N •Jõ¦!ŠÜN.—‹óŖé‘åŸKÕĻ»š9^µ}ę }މˆˆˆj„ÄD ,L9@` 0r$R)‡OX¼ KV”{e0£ųŃ| ģÅłĒAÕŚT;ÕØ€HNNƌ'''µåĀ0sęLDDD@"‘ĄŹŹ @釟““4¼üņĖŲ“iär9¬¬¬`cc#>dMš4 .Dƒ •Jamm-¦ED–1kÖ, 2½{÷†D"µµ5¢¢¢°sēN,^¼ …666Ō?ó†>ļDDDDōHd¤r 6{Sš½#ū܅RĖu9ÜT r˜†uI „5’9·FD+V(#‰ÅÅÅbĄĀŚŚėÖ­CQQ‘ų˱T*…\.k“H$ńWꂂ‹QÖÖÖāvłłłČĶĶ…µµ5!²°nŻŗįäɓčŅ„ ĄĪĪ'Nœ@—.]ŸÆ¬žØP( “Éō~Ž­­•_‰Ā«j-ÕyÕ4¤R)kŠQķiö&4 ²`—*¾g£ņY=ŖESÓÕȀHqq±ųąbee™L†¬¬,̜9ėׯœ?āvćĒG»vķPXX…BĀĀBįĄųėÆæąąą€:Pvģ˜›› ;;;ŲŚŚĀŚŚšCDŌ­[7lŻŗłłłb ćōéÓxī¹ēPPP€’ż{÷ī…••är9^zé%“mŪVķóžß’᫯¾ĀW_}…’’XYYaĀ„  ƒ‡‡.\ø€7–śĪ¾c¬¬¬ų=@DDDf_cé,čeö€Hƒ“Ē,}¦T ŌȀˆš«ÆPż]&“‰5=JJJ‘‘°°0¼’žūšööĘõė×±lŁ2,Y²%%ŹHXqq1īŻ»‡ˆˆ|žłēpuuÅįƇ‘žžŽ¢¢"B&“©õ=@D–Ńøqcø»»ćźÕ«h޼9žūļ?ø»»£nŻŗČĢĢÄĻ?’Œ?žžžžˆÅ·ß~‹%K–ˆ£Ö”””ØÕ¾; ØØ©©©X¶lŽ’}4lŲ āw†³³3ĄÖ֖µÅˆˆˆØę;rÄüĒčÓēqß%DfT#"óęĶē% &Nœ???ʇ›³gĻĀĒĒuėÖE^^źÕ«‡śõėćܹshŚ“)åŅå˗ѬY3888   ]ŗtAxxøų+0ƒ!DUƒT*E·nŻ-ZąŌ©S@II ģģģšõ×_ĆŹŹ %%%hŃ¢RSS‘——'6§”PXXØVŪ£ØØ.\@ćʍįįįQź;ĆĻĻOģ·„"""Ŗńbc•Cǚ³‘Ą@KŸ%ÕÕ2 ’‘‘”uynn. 44TiĘÖÖ666ČČȀB”@vv6īŻ»‡’žū|šŚžŁŁŁČĪĪ·KKKƒL&Cff&¤R)lll`oo’’!77‰¬*OT t}öą©§žĀ·ß~‹ĮƒćōéӘ4i’ųŁŻ¶m®\¹"6™€¬¬,äęęB”P ''łłłĖåČÉɁD"›Óßׯ_Ē‚ ŌŽ™¬¬,‰}ń»€ˆˆˆjQTT///Čårœ={ńńń˜?> ==ļæ’¾4 v²¬śY—Ėå((Pvą%|g¼ņŹ+P(bGĶĎUYcŒˆˆˆjø8³÷#‚^½!³“V<‰ŖGVW&“ĮŽŽööö°µµUž°TŠV­Z!99wī܁T*EVV–-[†¼¼<ń!G*•¢Y³fHLLk—>|€²z=~ˆŖ‰DģŚµ ķŪ·WėÄÅÅE¬Ķµ’~q^ų+ øŗŗ"''™™™„>ļ-Z“@rr2īŽ½[ź;ĆŹŹ VVV ”Q•“fm‹4k[Ó'ežĢ÷écžcT3ĀõL³¶E‚ ģ\pĮĮ§œźŠ•M¬!"D„Ś!666jæęŗøøąå—_ĘÖ­[Q\\ ¹\Ž~żśĮÉÉIlcee/// :_}õlmmѾ}{xzzŠUéeą„ˆŖ†Ī;c’žżšŽŪ©l#lo«P(ęsšˆˆųūūė\_\\Œ‚‚ĆŚŚZ€8:Lqq±ųknII‰XćCµcD¹\¹\‰D‰D‚āāb±ćE”™­­-ģģģÄŃ(ˆČ|bccõ~öeM‚‚äåå‰CēŚŪŪC*•¢  ………āēWØA"N„š€ņ{¤øøXĀWhV'|7Ø~g؎dÅ)‘łÅĘĘbŌØQJr ­·¶eß­Z†sę*’ę/‘C.4āœüń¼\^ņhr^”P`ó¦MyēC“œGQōqd{®Ōrū‚8äg›äŹZ®ZףɋįTR÷ā8•Į½ø l‰:džĪO›6Ķ{ 3ŁVŸļŁŲ‹óéÖv&?¦[q>žĪ¾g’“r휐gėXj¹ĖŸŪaÓ£[…Ó—H$aņ<š„łÜGóŁņ½ę…ķ «L P™ŒVćjˆŸ UŲUP„”4…$¤R©z„ż€Ē…Bkkkµ¦2ĀqųDTµJįó+¼†ÅŖ„ļ]Ÿw!X"H4æ3TG„!"""Ŗ„š÷mÄenÅłp/.€¼Ųp-’ČHóDšpK•čq­ +±ÖF–JĄCµ,©zØqį[į×[C묬¬ P(ÄeĀ@m;Õΰæ¢*HlČd2µĻ4±–‡j@Dó³®ķó®ŗæ°LŪw戈ˆØŗK·¶S«¹`'/†[qÜÅę6*µH*«3DTūXš¬äI­‘/µĖ„j®Q}5“NßCŒź:ö@T=č NCō}Žų ""¢Ś"_j;2kܑ=n:!Ō"q;zīęĪ@j h6Yɲ’‰A޲ōĖA5ļ""""""2Šj-’ŽGĆ½gÅū“ŠÉ×W9=źGD[“õ¬ĶAeS-"±šØVāgŸˆˆˆj:©¼ÄŅY0ZvüóD\ņīlŚjéS„ŖZDʍĘŅY ¢JvõJZ¶2{ÅL"""Ŗā6G°tč‘“£ĒŃų/›õĪķŸd@„̆C¤Q™„żĒģĒpėŁÕҧI5"DDDDDDTfř™ČŠ?oÖc8·Ö..–>UŖ”!"""""¢ra-ŖĪ!"""""¢rI;zÜģĒ0wĒ­T{1 BDDDDDDå’ĮģĒ` ‘ŹWF;ŖŠyZ:DDDDDDT=åß¼…¢¤$³ƒżˆT>»ĀõlģŃÆiĢģņ2dV2½åRŽņŌ—O}e­¾².o>õ•™¾uę(³ņŽ×śÖé+3}×H W(0m×<œ¾}NÜ?;»NN¶ā+U•6ŅĢKŸ)Õ4 ˆ˜Ą¶ķėįįįfél‘ }]æÄoGręmü:ę;Ą’ZŠĶē~Ēħž×»NŸĶēžĄŌŽćѱA;Črl>÷Žžėc¬ne©Éw’žmź¶šų!S[Cß~ļžż)fu}¾Ż‘‰Ē0’ļEŲ3ńg½ū Rsī•z€Õ—ę‚Č/нq÷% 9~:ó+¾Żˆé§ź-—ņ–§¾|ź+k}ō•uyó©ÆĢō­3G™•÷¾Ö·N_™é»F‚µ§7ĮFj£¶ģvJ4t_‰ˆØśś±iŅÄlĒąH3dl2cAACŠ»7? DUÉÓž>jÆŖö^;„]^†—£'¼=1½óTģ¾rĄąŗNßA§ļ‡ ėšį˜“mĪÜyÜ«śWĆ>EŸNp°±‡“ĢćŪÄi‰„Ž}õaāīœĒŲ'Ÿ-ÓłhīW×”¤)$žI%R­5$4÷ĪA®Pˆó}i^{€ŸG™\l0Åo<^äåaÉŃÕŗqb©4õ•ēü4ĢŁŠ>ėFaܖiˆO½$ī§/ŸśŹZ_šś”7ŸśŹLß:}÷’¾¼”·¬Ė»N}×āļ^ÄÖ »°°ļ\µå-[yĮŁŁN|%"¢š”RśéĮ~DČ“XCÄ4›Ģüžū^Ģ{;ÉÉ·1n\JJjǐEDÕÅķ¬»šuo ˜½w=3)Łw ®~-/‘—ąlźE¼wą3üłā­Ēų6ę'ōoÖ«ōņ“?a²ßŲY—­©€ę~K¼×w½ƒ÷,4pņĀw#>7øŸź/žš5Iō„ŁŹ³6ŸūcŸ|% 9~9» w²•}³,?ž Š ±~ŌJŌuØctY/;ö-6ļƒÅżßGģķ³Xtx%"Fc0ŸśŹZ_šå½'ō„©ÆĢō­Ów/éĖKyĖŗ¼ėōŃw² sšĮĮĻń~ļYšt`SQ"¢²Ø®£{dşGŒ1ė1Ü{vCz“ł›ēPķĮ€ˆ‰„¦ŽĒ ć_…«« 6žü-.]ŗŠ·Z:[D¤ĆŠĮ ‘[”gŌŗ“ÉqXqü{$¦ßD‘¼HJķSP\ˆO‡!1ż&¾¾XmŻ…{Wpéž5|Ö’½2åQŪ~‹®Ę°–ĻąÅ§FAąē³æį³#_bÕŠOŹ}<}i.č3ŸGu§7ĆŽĘćž|R©²’įįİyģwp·ÓßüA³<’½uū’;Œ” H%”…¶²®hšeͧ¾2ӷΘ{I[^Ź[Ö¦XW‹®FŸNčåÓ„ĀiQõĄ~DØ:b@ÄÄžž; łł˜;w‚‚†‚-枎ӧć-5"z¤s=$¦ŻūÕHH»†Nõ ®[µs»OCŸĪ(*)BŸu£ŌŅMLæłØæŽVųįŁe„j|{ņ'Lķ82+CY4ø_ģķ³ų¬’{p°±¼Ōa mx”BĒӗfcWo|9t‘øķī«ŠĀ£©ų^”P”¹¬„ OŻ{ė²7›ŠUÖåM³¼łŌWfśÖ黗ō儼e]ŽuåµļZ$`Ėłā2cjūQõ•}īŠ22`ćj¾ž”Ų™ū1±»wļ4¬/.kŌØ”„³ED*·č‹Õ'Öį^ĪÜĖy€ÆN¬ĆŠVĻ\WP\7;W•aĶ©_ŌŅüóŹĢŲż^~zžÆĻģRĮ3w. )##ŸT¦¼źŚÆ…GSütf ² s]˜ƒ g¶¢…‡o…Žg(MČ*ĢĮėGvü±“Ļ޾]±āų÷øŸū°Leݵ‘?¾:±Y…9e*}e]Ž4Ė›O}e¦o¾{I_^Ź[Öå]W^'_Ū£6 ˈˆØf;ŁkÆ@QF†ŁŽĮ~DȔXCÄļ¼”ęŻN¹#.KHH²t¶ˆHńöĻ!9ó6Ęly 0 YoŒk7Ņąŗ9Ż^Ē;ū?A±¼ÆłORK34råØ#ļŖ,š² 6öų6ę'¼ņō °Ö:Uµ#Ja^õĮQ×~÷›‡eŃßąŁ_&žŖ×õ›gp?}ō„)äMf%Cs&˜×ó ±ßŽ9Ż^Ē—’žˆIŪfˆźĀ9č+Ļ·ŗOĆŅ诓)™Ł„Ī]}e­/M}e]Ž|ź+3}ėōŻK†īĮņ”uy×ŗ?‰ˆˆTåß¼…„%+°dźæ0mæ^nņc8µoĖ~DČdŹŽøZ¹De_k•IĄ€{Ķ ļķT¶¶·U(óŒ9xDDʍÆŲ/W¦¦Ś©ź;©šmņ4ÜŻ]ńĶ·ĖŸ.Z‚‚B¤Ž»OOv.GTWƤ”e+wKgƒˆˆˆ,lsÄŒ„ljØŁŒP[³Bm˾[µ 3ęĢ…\.‡¼D¹¼r¹ łćy¹¼äŃ:å¼B”ĄęM›ņ·&9¢čćČö\©åu2 wlm¬;$ŲYnˆóŽ;7›¼™Ė½?÷!~ā«;§ŖĢ­8Ogß3Yz\K7”ułs;lzTüšJ$’0ł MĀ|ī£łlyŽ óĀv…ŠU&PØLFc «_ß ėĀWįŻłŸą„IoąÅG#(h(6oށĀĀBKgˆˆˆˆˆŖ0m”å•+±ģć^vü“DÜz²ÉŒ.éÖv&½jDL@®HU{’Ā £šĀ ź-nŠųŽŅŁ$"""""Ŗ4iG£ń’^6iš6®®pjףē.XśōØ`@Āōō ¬ Ó̘=g\\œ-M"""""ŖF¬|Ć~žŪf=†·D/ ž£µ‹‹YŅm=6 Ļ·ą™U]öŠ2µ)3+ŸĘ–>E“b@Ä77W,5ļÕ.Ņʍą0’-³ĆĮŅ'i&®ĆĆŹ6r‘6v—ˆˆˆˆˆˆˆjDˆˆˆˆˆˆˆØÖa@„ˆˆˆˆˆˆˆjDˆˆˆˆˆˆØV‰ŠŠ‚D")5EEEY:kT‰Ų©*Q5šūļæ#..‘‘‘ČŹŹBll¬ŚśĄĄ@ø¹¹ĮĻĻƇ‡æææ„³\«ÅĘĘ";;‘‘‘ā2ÕyUĀu^ūōéSīćFEE!==qqqz«z=zŌҧCZųłłaūöķ:×gddˆ}Ą$&&–Z‹ēŸ(SķąąąRµöéÓ ,Ąļæ’ŽąąąRͲĀĆĆZ£;[e"DDDDDDU@hhØÖ`ˆ››ĀĆĆqčŠ!£j}ųūūcÖ¬Y–>*WWWLž<  ÕŗMll¬Īuå1räHé•„SŲźˆ"""""" ‹ŠŠBXX˜Öu’żw­łƒ”,X€ššp­ė””d²ci6§h«„R“°É ‘…éś…>,, žžžf=vRRāāā'.óó󃟟_µi.‘””TŖ___ųśś–j*RÖt###ÅĄ@```…Ņ+«É“'‹©j 5Y5½óT]!"""""² į”[S`` Łš¾ddd <<aaazkųśś"88!!!š%I©e”””bß&¦ŽO8‡ 6‘'((Hoß𢢢Ŗõŗø¹¹!$$Ä`žL%<<nnn„–ļŲ±Ćd]µMjśHEl2CDDDDDdAŚ~żt7cØØØØ(ųłł!$$Ä`“ˆÄÄD„††ĀĻĻÆĀƛŅļæ’___„„„•/ÕŚ/†¬_恁:ūĻHOOGhh(śöķ[)ēźźźŖõ^HOOGTT”IŽ”­¹VEk×T ˆQ”••…+W®ˆÆT½|`p›]Wv”ßś~Z·-ļŗņ2Gš51åR–2žą­J™‚®€ˆ9ś öĖŚ7Dbb"šūļæ[ „ŌĶž=AAA„FEŃĒؚįįįF¢"##1{öģJ9g]ł7E§§ .ŌŃÕ§MMĀ&3DT#„¤¤ĄŪŪÉÉÉšööV[§śóZŒŃiN:Œšøp\ŗ N2'töīŒ™]fĀĖŃ p0į ĀćĀqķį5–ŠéėŪ/īN¾<ń%®>ø hU§ftžõ;čĶ‹¶‡HW;Wxé€Öue9OmŹ›Ļoż‹õgÖ#īNmѾ^{Lļ<ĶܛU(?šmĢ·ųvų·hU§•É֕÷Üu„©ėž(o™–biōRüuż/Ą ęƒšv·a#µŃ›ęŒų<śsħĘĆŃĘ}›öŬ.³ ³’é]'+䘶kNŻ>%ęߘżŹZÖśŹ,;;NNNā+QM¢«¹Œ©EEEé|Ų÷õõEPPÜÜܐžžŽššp­‡ąą`üż÷ßfļ×D—•+Wź}Pś ”? Aō²DŹ",, !!!fļk„]»vZ—ŲҬ!“žžŽČČHģŲ±CkįįįFhTŻ1 BD5’¾‡'ၮ¬æęGœ‹ĄĖ_FĒ!WȱłÜfĢżk.~zī'L8ˆĻŽ|†wz¾ƒĪŽįbėbŌ~󒞏Y]g”ÆÆ²Źå”ÄCxēļw°wā^½yŃ|؞’÷|“­ŪVēśŠ*o>Ž’“;LĘņAĖ!WČq0į fļ›ßĒWüׄԜTŚå]WŽsז¦¾{¢¼eöKü/ø•y [Ęl|xčCDœ‹Ą¤§&éM342ŻwƒžKP¢(Įś3ėń]ģw˜Ńy†Žu‚µ§×ĀZjmtšå-k}e–’’‚† ŠÆDD5EFF†Öå~~~&?–®`HXXX©¾JV¬X)S¦” ¤§§cīܹ8tčP„—UTTBBB“® Ā| 5Póūļæ—¹ÄÕW1®Ż8µrŃWf­Z)+ĪĪĪļs"¢źDWߌ:Ѭˆõė×k}xÖ ¬[·éé鄚ōDFF"**ŖŅšuÄ®·yQYk:h¦ēźźŠÉ“'£]»v(żƒŚŽ;Ģ© µ-0 Raׯ_GóęĶ1mŚ4$&&"==ĒGbb"ęĶ›‡#GŽ ===zōĄ—_~‰6mŚ K—.8yņ$īŽ½‹ŗuėāŽ½{Ø_æ>ŗwļŽ#GŽXś”ˆČHßÄ|#>ø]{x wsībŠĘAČ/ĪĒS^Oįžļ ‘K#½ū-°ÓvMĆ{Ž4pj€ļF|ąńd‰¼gSĻāŻļb÷‹»K§wņLö› ;k;qŁĄ ‘]˜ /G/ōkŚÆ<ż lō¦łÅń/PP\€ŸFż„ŗuՎ”/Ÿśöԃ]ćŪįßu~vÖvųkŅ_ų%ž,=¶aƒĆŌö ų> TM˜ņ®+ļ¹ėKSß=±ģŲ2 l>‹ū/FģķX|rųl½Ł`™ŻĪŗ¦īM!{Cšé3Ÿ"%;Åą9“ņl…ˆs÷ä8”(Jšóٟq'ūŽĮuŁ…Łųąąų ÷štš4:M}å²ōŲRtoÜ«‡®ĘƳ.3""Ŗ˜/æü²Ō2___ƒ£Ų„……iķ㤲œcccµ6- 6i_+śŅó÷÷GPPP©ņ(k,UUbb"įļļļ¾ūĪbĶ¢*;U­ ™LŁVzūöķÉd˜0aņóó1hŠ DFF"<<‡FZZž}öYc̘1P(Ų·o`÷īŻĖåxį…,}:DåCœ0iSP\€~ˆø;q˜Ū}.@”P æ8[ĘlĮž÷ cƒŽ 5øß⣋1¬å0DGāPš! m5Ÿł p"ł^Ųśz®ķ‰W’x÷rī•ŹĖ…{péž%<ßęyqYĢk1ųkŅ_8<å0V Y…“¼4,8“Ą`š‡ć­īoi jč˧¾ż„üüóŹ?Ų6nüźūį‹ć_u~/“{6x”Ż 8sēŒYÆyyĻ]}÷Ä?·žĮ?@÷»cĘīHHK0ŖĢT "cĪaAŸˆM‰Åąƒ1ś×ѐYÉ •J ®ūģčgčéÓ½|z•)M}āīĉ×vBū F—•_RR’Ö©iFѤI•Z®«#Xsٵk—Öåŗj”—¶s5f½„:ü6¶&‘ææ?ÅI_°#66Xæ~½EĪ©2±†ˆ‰øøøˆ=.ļŁ³W®\Įüłó1hŠ Ą‚ 0räHģŻ»£GĘŪo捽{÷bāĉعs'¬¬¬0fĢKŸA’‰é‰bkž]#ÖŹØēT“;L†ƒe³˜u§×Ü/öv,÷_,ī7¹Ćd Ü0°0j!ęvŸ‹ž>=QTR„Žėz—ŹĻ7'æĮĖ_VėČR`-µ†«fw››F•¦B”ŠzŽśņ©o?myöó0£ĻO ‘HĢtµ+~īŗč»'¤)ŽL="671¶Ģ87@BZ‚Ų_LBZ:=īOC×9ųøś`õŠÕāūŻWw£…G ƒėö]Sī=’«ø^Øõ”oæņ2ō9""Ŗ‰tu]–T ŃUƒĮŲ~5üüüJ@ŅÓӑ‘‘WW×J(%ŻϚŗ3SC”ĆVMŁŁŁf=]Ćė{ æųā ­5z~’żw„……é¬}Ó®]»]S„5DL¤mŪĒ޼y°xńbH$H$±ŻŚÕ«Wįėė‹N:᯿žBAAöļߏgžyuėÖ-×±‰ØrüyåOLß=Æ<ż žÆĻ’©5QéėŪėϬGVar‹rq.­=[ÜÆ…G qæģĀlütę'ń”² øīvī(*)šSkJåēĢ3HŹHĀČ'“·‹U@ŌœT|ū=:Öļh0ĶŽ¾½±üųrÜϽ_*-}łŌ·ßÜæęā\ź9ɋš ÷֜Zƒ¶^m:æĶē7#·(›ĻoF‡zśG³©Øņž»>śī‰®ŗbõ‰ÕČ*Ģ*S™ i1«O¬FjN*RsR±śÄj m5Ōą9² ³pąś¬8¾¢TG¬ŚÖż£6 ˌMS›õ;ˆ×vÓ¹MF—QM„ėaSWß"å”khVc›¼č”Ŕy4D[PĒ#ńTUŗ‚Zŗ4Ę9r$:¤³¦Ķܹs-}źfÅ"&bmżø(}||(ĒĒž9s¦ŚvBÄq̘1˜7o¾üņKdffbüųń–>¢ZC_‡ś,ˆT6;™’÷|µå‡§Ę“€iXłļJŒłu r‹rŃ”^±“S}ū}Ņļ,^Šæ(kp4ł9iŽ0RLuŖ’H$aņ<š„łÜGóŁņ½ę…ķ «L P™ŒĘ&3f`gg‡}ūö”K—.xć70|ųpdffbćʍb•¦¦M›" ÷ļßĒąĮƒ !""""Ŗ„tuŌiŖCu5«0¶#P]McŒķæĀ\ēP™Mv,),,Lėņąą`“GW’)5¹v›ĢTP£F“FV›7oŽmŪ¶éŻ÷äɓ–Ī>YŲȑ#įėė[źĮ311 .,w-A»vķ“.?wīœQfj <ųśśõ£®©¦µ•OmhV«30fĢ(AeaŹŽ|« D HOOב€9sęĄÅÅÅŅŁ$""""¢j,88Xėƒohh(|}}+ŌdĮßßnnn„xi ‘‘‘”µ’ mĶ2tõ…¢0R§!AAA„ŅžÕ*0ŖŖbccŃææöž¹BCCM2w?%U"ø¹¹™|lk""""""U ,ĄĪ;µ6c F\\\…‚ƒ‚‚JõS‰ØØ(½}K„††j­9 ­¹FćʍKå?11Qē1222Œ®å¤uŪŠŠP >¼Ę »råJeļļļoņŚ!QQQZū±qss3z4¢źˆ}ˆUß}÷Ī~ĀĀĀąėė‹Ł³gėķū#66ėׯĒģŁ³Õ–ėś‘7((Hgzėׯ×Z[>00PėC²®šŚŽ‘””„gžyĘč&5Mš4ŃŁgF@@.\ˆŒŒ ­ė322t®«Jbcc±pįB4mŚ!!!Zƒ!nnnųī»ļLV;$## .ŌyķLx©jXC„ˆˆˆˆˆØ š÷÷GXX˜Ī”‰ˆ¤P}ˆĶŹŹ*tX±b…8ߤI„††– Œ¤§§# ĮĮĮāq…ćhkīāęę†eĖ–i͟®ZĀ1üżżįģģ¬5ÆĘ Ŏ;“ BCC†ĄĄ@±³×ÄÄDÄĒĒ‹żpT…¦5‘‘‘čŪ·ÆŚ2cĖĆ××[·n-Wm˜ššpµė™žžŽøø8½MšĢQ„Ŗa@„ˆˆˆˆˆØŠ˜u=ōk ŌčJĒŽ:k3¤§§cĒŽZūĀØJ#ŅŗnŚMžŹ[3Ęk«ŹßߨŃÖl2CDDDDDT„ōéÓ‰‰‰VU[`ŻŗuåJ×ĶĶ ;vģ0Ų khhh™j0„‡‡—©ÓĪ>}ś &&FēPĀe)‹ź@čLvūöķ•œ ­Į€"""""¢*ĒÕÕėÖ­CLL ‚ƒƒuö-¢‹æææŲtDÓŗuėiT ĀĶĶ !!!HLLÄȑ#Ź÷ ]üżżS®ŃsüżżÅNf-—:uź”ł8–ąęꆠ  „……!11Ū·oƔNM†ōōt,X° VC6™!"""""Ŗ²üżż±nŻ:¬[·QQQˆ‹‹Czzz©fBpCčCĆŠmŸ>}pčŠ!ÄĘĘāčŃ£ˆ‹‹SėąTH'00°ĢĒB0'44“T߁„:eõóó+u>NNN±`Į,X°QQQˆŒŒDbb¢x~~~pssƒŸŸüüüФIµżµSX®OYö;t袢¢Ä÷µS%äQHĆØ²ś 9tØŌ*”Mvv¶Īc ×PöK¢Y6µ‰¤œūHTöµV™dlŲ°ąĄńѼšŽNea{[…B1ϘƒGDD`üųń–.7"ŖdW®\A«V­, """²°ˆˆŒ5  P(ŌÖi¾×µģ»UĖ0cĪ\ČårČKäĖK —Ė”?ž—ĖK­SĪ+ lŽ“ !ļ|hé" ŚNņčQ\˽]]H$’0ł MĀ|ī£łlyŽ óĀv…ŠU&PØLF«–5Døgé,‘š³ODDDDD¦Ā>DˆˆˆˆˆˆˆØÖa@„ˆˆˆˆˆˆˆjDˆˆˆˆˆˆˆL­o_`öl =˜2pw“tȊÄÄĒė% iS <¼|ĒŅ P¦%‘Ļ=ÄĘjß~Źe>µåė¹ē”ė“tŹZSTĖ>DˆˆˆˆˆˆˆŖ4!ČšÜsŹłĄ@ĄŁY}›ÄD cGå|p0ąę¦ÜvŹąĢ`Ŋ²såJåžAAĄˆŹōĆĆ•Ėžžš÷Wß~ņdeŠ#18}Zy|XøŲ± }¼¬b@„ˆˆˆˆˆˆČāā”…„Ą×·ōś)S”ÆŖĮŠ ”Aа0`Ö,ķūé²`Aé J‡ʚ*«WėÖ©Æ T=BC•A+”µIBC•łY°ĄŅ%hVl2CDDDDDDdééŹ ƒ¶ Fb¢²ęFppéš³f)_ׯ/Ūń“Õę Q¾īŲ”}Ÿ ”Ē SCęĪU¦óŻw–.=³c """""""s Ҿ\hR“ž®¬”*1ńń6å©„±c‡²Éjß śśłī;eæ#żū?āhij ÉĢĢArr*ÜĻ@AA!lmeØćé oo/øø8Z:{DdfYYłøs;õøąĪķL“låe¶cuś~ˆ8ņµ=eŽ’Tģ <ķļ#¾Q-”¤|-oŖŚÄĘ£G+*Ź ŠŽiŖ*eM•špem”VI W#"/& %łžŚ²‚‚B¤$ßCJņ=4ō®‹6mš–)M©Ä ]ŗ<ć’ģµōé‘n§d ”·R’ÓŃŠŪͬĒ‚ ŖcegĄÉÉV|%"""¢ZęŠ”Ē‹ŠHOWÖš€˜õ””ś÷UCÜܔĮ”… k|’!@ ģCD†ŲŪŪĆŽŽ^m°,%ł.^L(SŗŪ¶ÆĒ’ĻßóŽŐĮć,}ŗD¤Cu 4ÜNÉ@ƒ†®ā+Õ}ś(_’Ż4酇+ƒ"!!eoīņśėŹ`Čß+kˆ„†źŖ·©Q‘ĢĢ1Ҿ½?Ś·÷‡““rX#''gq™ÉĢĢ1:ķ  !读›ųžÆæ"-}ŗD¤‡ŠōD[”NßA§ļ‡ ėšį˜“mĪܹ ¶ī«įč½ö9Lż}ngŻ5j>óŅ0g_(ś¬…q[¦!>õ’ø®e+/8;Ū‰ÆDDDDTK*ƒB £¢22”Æši……éßoįBešC¤£Ō¼žŗ„KČģjT@$99Uķ½‹‹+ڶķOĻŗhŪ¶\\\õnƏTā…n]źz¶Ęٳ°oß!H%^(..FbāMŒū 6hūĘŠ’y\¼xšzR‰¦ĻĄūļ-‚‹sS4kź#GžĮ×_ÆC]ĻÖhŲ ""¶[ŗ‰j…“ÆķĮÉ×ö zźļ˜Óżu¼wą3µõ¶Ö2ģō ŗ7ĄŅcß½N—eĒ¾ÅĄę}°’„Ķéö*^ié" """¢Ŗ`Å e£iSeą"2R9…‡+‡Ź-‹É“•ÆįįŹ)2RģXøPūč3€ö!vƒ‚”SlléĪ^k˜yp_ĖĖĖƅ g™™ń((āWdffąĀ…3ČĖĖSŪ¾¬žŲł3 [·œ8łŠ‹K0xŠXDFFc]ų—ˆ:üŅŅ20ņŁI(..†LfŲ»÷ 222ńĘS˜xĮ“§cļžųąĆ·‘‘‰’M{EEE–.F¢ļdr&l}½Öįµ?ŽĘ½œjė_h{¼Š.gīœ7z.’Ž:~Ž?>‹™»?@BZ’„‹€ˆˆˆˆŖ‚ą``ūveĄböl o_å4e päHŁŅņõÖ­SĪO™¢L'<\™¾ŸŸr¹jķ‘ōte¬@é!v×­Sꩆ7©QŖŠóŁŁYø~ż2ڶõƒL&Caa!®_æŒģģ,­Ū—Eūöm..ĪšĆž=påŹ˜?& ź ųæs4ņ%ģŻ{={v·_żÕĄO?żŠ„„ų÷Ä_šōō@Td4vģ؃[·n£iSŽ2AdN £–cn÷ičįÓE%Eč³n”Īm …Ńė¤ P@I©å‡§n‡½5›ÄÕzžŽT£Z##ėŃóŖ¾NVõ„¬œ"#gēĒ}‰hKĻĶ HŠŃ·¦›–f±¢«,5Ŗ†ˆ­­LœwrrF³f­Å`ˆL&C³f­Å>E4·Æˆ›7“‹ƂTā©Ä A#_\½z]ÜN5ŠQ§Ž;\]]ąééńč½ņµ  ĄŅÅHTćĄĶĪE%EXsź—Rė7Ÿ’¹EyŲ|žtØ’¤Ńėź9ÖŹ»—J„×µ‘?¾:±Y…Ę÷[DDDDDµŒææśP¹XöŽUk”UC¤Ž§«Ų©ŖŠgHff®_æŒfĶZ‹}ŠÄĒĒ"//um"""""RQ£šĢøø8¢”w]äåå!>>ńń±bŸ!ŁŁYā²¼¼<4ō® ĒrĒĘĘo¼1¦aÖĢ÷PRRŒ½ū~E—.OćĶ7ęaÄš‘™™… æÆocK iØQ5D M›¦ VSD Œ.ÓŠ»®ø±ä õ!zW}łV}łxØNwü¶-\ė¾nn®„ö?§ŽcškVą‡5+,]|Dµž¾¦,lęBDDDDTsŌø€  Šx{{!99īg   ¶¶2Ōńt…··W¹k†QĶP#"€²łŒ‹KŁjQķP£ś!"""""""2"DDDDDDDTė0 BDDDDDDDµ"DDDDDDDTė0 BDDDDDDDµ"DDDDDDDTė0 BDDDDDDDµŽµ„3PŌµtˆØŅ„ń³ODDDDD&Ć"DDDDDDDTė0 BDDDDDDDµ"DDDDDDDTė0 BDDDDDDDµ"DDDDDDDTė0 BDDDDDDDµ"DDDDDDDTėX[:꒙™‰äädÜæ°µµ…§§'¼½½įāābé쑤¤¤ąŁgŸÕŗnźŌ©xć7Lv¬ōōtōļß={öDXX˜ĮķSSS1tčPĄK/½„™3gŠė¾žśk¬]»°{÷nxyyY°‰ˆˆˆˆj†¹xń"’““Õ– 99ÉÉÉšööF›6mĢž‰D‚.]ŗąŸž±t‘‘ oooŒ=ZmŁSO=eélP~o=zT- rōčQH$(Š „½råJ\»v _~ł„Žķ¾ēcb^3:}Õż4÷æq#ŸųųT8:Ś oߦ˜5« d2«J)W"""""M5. "Cģķķyyyā:a™,1wPdūöķššš°t‘‘†zõźaҤI•r,‰DR¦ķ}}}qżśu¤¤¤ aƆHMMŕ+Wąććƒ7nT(/’üó<== n'1“8ŒŻWShh$ŗukŒ%Kś£¤DõėĻą»ļb1cFē QuĢĢL­ė\\\0~üx“ėūᅦ^zé%KŸ6Q•P£"B3{{{“oßpįĀdggĆÉÉ mŪ¶ÄĒĒ‹5EĢŁ|&((ČŅEBDeœœŒ‘#GāłēŸĒķŪ·‘••…uėÖ!%%«V­ĀéÓ§‘••???¼żöŪhŚ“) –-[†={ö@”P`Ĉ˜={¶˜¦••¾żö[DDDĄĮĮ³fĶĀ Aƒtę”}ūöHLLđ#G0nÜ8DGGC"‘ }ūöj‘Ó§Oć믿ĘåĖ—!•Jńä“ObīܹhŚ“©Öóøqć222põźUąß’…•UåÕĪøzõ¾śjģķ•’ķLź‡‰·1 BDDµ^ėÖ­Åq/\ø¹\Ž6mŚĄŹŹJüA—ˆĢ£FuŖŖŁLĘÅÅmŪ¶…§§'ڶm[*ų”¹½.)))H$7n¦OŸųśś"""pżśuH$üļ’Ɛ!CŠ­[7Ź_†»vķ*¦sņäIōčŃNNNhÜø1>žųc± |bb"ʎ‹ ĄŽŽżū÷Ēŋ …3gĪ„‡‡ÜŻŻ1gΜ W'ŖĶN:…€€µiēĪ°±±:tÖÖÖ)Ī;99ałņå€cĒŽįʍƒÆ½öęĢ™ƒcĒŽ‰ū\¾|'NĔ)S`ee…ōōt1­>ųpę̆ ‚!C†`Ɔ €={öąŹ•+˜?¾X•~Į‚9r$öīŻ+¦qśōi¼õÖ[x÷ŻwÅč1•®>DRSSM›6—ݹsŽššpµķo޼‰1cĘ`ąĄŲæ?¢££Ńøqc|óĶ7°³³4nÜXÜŽĶĶ PXXØ7={öď?žˆ7"77={öÄß’-®—ĖåųńĒqąĄÜæVVV(**‚B”€\.·S=Źdm-…+fĻī†#6||\±zõPq›Ż»Æ¢E ö±DDDdˆ\.ĒĪ;ńšįC<ńÄbcēĪĆ½{÷Äfś†¶Ńü!¢°°ūö탻»;”P(pęĢDEEa̘1ā¾D5YśyĪÖÖVœwrrB³fĶÄ`ˆL&C³fĶąää¤u{c4iŅDœoŲ°!€ĒPōžźzėÖ-Š:\ęĶ›7‹/†D"D"Įȑ#WÆ^ÅĄ1nÜ8ģŁ³Ļ<ó Ś“iSįΉH7Õę$õė×L˜0üń‡Ś4bÄŲŲŲąÓO?ž}ūšŹ+ÆąęĶ›bķ  ģŖŹŚ*īīˆ€‡‡‡Zķųõ×_ńóĻ?c芔8zō(¢££Ń¢E ½ēajś:\U(€ŌŌ|’},:v¬Æ¶.+«\NJĒ1iRÕهˆˆØ*KNNĘƇįåå…Ž½{£E‹č޽;4h€ū÷ļćĪ;Fm£©øø …yyyČŹŹ‚ƒƒFŒ_|‘ĮŖ5jT@D=ĮŽŽ^l.#4“ÉĢĢ›ĻUƌmA•jŸ#Ā|½zõÄeśjm”Ū·o—Zēćć˜={6Ō¦)S¦@&“!""·oßʇ~ˆk׮᧟~²tqÕ BµŃżū÷ćŅ„KHIIĮ§Ÿ~Šąą`deeaūöķčׯāāāÄą‰££c…Ž)•Jѽ{wäęę¢{÷ī„‚*B³æ;wīąŲ±cųč£p÷ī]PėæD•L&ƒT*Å’ż‡#GŽč­„š½šP7\VŹm»tłĮĮ;PXX‚>ź«¶nŠ  Xæž ęĶė‰žż›™ūņU{B w”¦©ĄÕÕ€r` c¶Ńäąą€¾}ūB&“įŸžĮüõė×ćčŃ£j5N‰j²ÕīĀŪŪ[-h!C²³³‘ŸŸ_Ŗ‡··w™Ņæxń"/^ŒÖ­[c͚5bē§Ę4½6lœńķ·ß¢]»vŲ·o¾żö[,_¾/æü2š7oŽĶ›7£GšššĄāŋ‡’ż[¶lĮ;#~ųA ž˜st"zL&“aõźÕX¹‰AŃnfIDATr%/^ŒÜÜ\“lŁü16lˆ ::”””J„:t(F%öŁQ^={öğž‰ž={–Z7fĢœ={‡ĀńćĒńģ³ĻbŊ˜?>-Z„5k֔ŚĒŚŚ£GĘļæ’Ž„K—bćʍ:żŃ5t®”mōķgLšDDDTšPĆ]čŸL––@ż‡c¶QÕ¢E “hŃłłłøwļΜ9ƒ . aƆh֌?\PĶW£"...bP$>>Ąć_R³³³Õ–•gČŻžżū欕+ųųćŃ A|÷ŻwØ[·®ŲF///ģŽ½o½õʎ‹zõź!$$Ææž:¬­­±oß>¼żöŪxć7§žz 7n„ÆÆ/ʎ‹Ż»w#88VVV˜8q"^{DeÕ°aCÄÄÄč\ļåå„u}£F°téR­ū899aٲe„–Ėd²Ri½÷Ž{xļ½÷Œ:ö€0`Ąń}HHBBBÄ÷+W®,•ĘīŻ»Åymē1oŽ<Ģ›7ĻģåLDDD¦ćķķ ¤¦¦āȑ#hŠ RRRp÷ī]xxxˆ?ņ³ŖŪ·oćļæ’Fƒ ŠŖU+“ppp°ōiUŠ€6mŚŠ>¤®ńöö·+ +++¬]»k×®U[ŽØQ#­Ćąj.ėŁ³'žż÷_­i7oŽŪ¶mÓŗĪÕÕŪ·o·@i‘%I„RŒ1±±±øqć®\¹GGG“oßO?ż“ŲYŖ1ŪØjŠ :tč€K—.‰·»ŗŗ"00PlLTÓÕø€  Š5Eīßæ‚‚ŲŚŚĀÓÓ³\5CŚ‚DDDDDD¦¬u¹­­-ŗwļŽīŻ»ėÜטm4k™?õŌSxź)vrNµW ˆŹę3ģgƒˆˆˆˆˆˆˆ“©±Sņōōdķ""""""¢¤F »KDDDDDDDd DˆØÖxšąŌ¦>}ś`źŌ©8qā„Ž}t¶ė­ˆŌŌT1/«V­R[÷õ×_‹ėRSS-]|DDDDD5 ›ĢQ­Sæ~}Œ7pļŽ=ģŲ±!!!Ųøq#š5k¦uŸeĖ–™µ_"‰D‚£Gbę̙ⲣGB"‘TJ“½€€ļK-‹‰1<¼÷ųüóhÄǧĀŃŃ}ū6ŬY] “Yé]GDDDDdi ˆQ­ćéé‰I“&‰ļėŌ©ƒ/æüĒŽÓ 4kž|}}qżśu¤¤¤ aƆHMMŕ+Wąććƒ7nTJ¹Ń‰nŻcɒž()Q`żś3ųī»X̘ŃYļ:"""""Kc“"ŖõJJJ(‡ÖNNNF@@>ūģ3̜9S¦LPŗÉĢ… 0uźTōźÕ C‡Ś5kĚ)))˜?> „īŻ»ć7Ž@BB‚Ž<“o߉GŽDGGC"‘ }ūöjŪ>}ƾś*z÷īĄĄ@¼łę›bŚ»wļF@@–-[&n’駟¢S§N8pą€YŹīźÕ˜8ń)8:Źąāb‹©SżpšąuƒėˆˆˆČ¼Ž;†W^y½zõB`` ¦M›f°‰pE Ķ“sss-}śDFa@„ˆją—_~Į/æü‚•+W"<<öööčßæ?lll‡‚µµ5\j’ĢĢLLŸ>iiiX²d °vķZģŪ·………˜>}:bccŠ5kÖ 33sęĢ/Śøøø uėÖ8zō(e@¤uėÖpww·ÉĪĪĘĢ™3q÷ī]¬^½ü1NŸ>÷ß0tčPLš4 Ų³g~’żwlŪ¶ S§NÅ3όĢĢLL:Ż»wG÷īŻńŃGPžsćĘ £[·n€×^{ sęĢĮ±cĒŠ«W/łźŃ£6lŲ€ĢĢLœ8q&L@~~¾øŽĮĮžł'e„¤¤­[·Ę¹sēP\\ kkk̘1’ż÷-Z¹\ŽŽ½{cŚ“iĖDh.S\,GJJÖ­; aéҁz÷[° >’<ė֝†½½ ʍ{R©Ōą:"""2¢¢",_¾Ó¦MưaĆÄåƆ Czz:>’üsšå’d©TŠ:uźXŗˆŒĘæL‰ØÖi×®bbbƒččh¬]»~~~jŪ4mŚTēžBŠÄĆĆ£Ōŗ;wīĀĆĆÅbęĢ™øyó¦Ž|õģŁ………Ųøq#rssѳgOµõr¹?žų#&L˜€®]»¢wļŽ8ž< är9å"Ææž:ņóóQXXˆ—_~‰Äč²±¶–ĀĒdzgwƉ)·÷ńqÅźÕCqųšģŪ7õė;”E ƒėˆˆˆČ<Ī;‡““4<÷Üs„Ö=÷ÜsxšąĪ;‡ēŸ{÷īüõ×_3f &&“&MĀóĻ?—^z qqq”Ķ…‡Š+V`źŌ©Z÷×l2£+­aƆ!>>pęĢąģٳ€óēĻcȐ!–.FŖ%!"ŅĀŹJ÷H(žžž€ū÷ļ—ZWæ~}Ą„ šĒØM#FŒŠ{Ģ'Ÿ|īīˆ€‡‡ž|ņIµõæžś+~žłg :GEtt4Z“h”¶Mnn.BCCQæ~}xzzā’žļ’““cōy+@jj¾’>;ÖW[§m$AVV!øŽ+ŽcҤ§Œ^GDDD¦uūömŌ©SGk³Ō©SwīÜA@@.\øˆG§NžžŽ·Žz 3fĢĄoæż†éÓ§ć­·ŽB^^d2233įęꆕ+WjŻ_•¾“T §NB»vķÄ`ə3gJ„Ed. ˆ•QĻž=įąą€­[·"::Ė–-C·nŻšėÆæ" 5ĀžżūqéŅ%¤¤¤ąÓO?Epp0²²²ō¦+•Jѽ{wäęę¢{÷ī„jväååPÖB9vģ>śč#ܽ{€²³U…B>ųÉÉÉXŗt)/^Œ[·nį’žļ’ Żš=¾G—.? 8x KšŃG} –…°ß A°~żĢ›×żū73øŽˆˆˆĢĆŚŚZ¬9Ŗ\.‡D"ææ?.^¼@Ščܹ3Nœ8zõź”sgåˆp;w†»»;bbb ‘HŸŸ1cĘĄŁŁYėžŖō„Õ©S'œ9s€ņo˜^x§OŸÄÅÅ”K—.–.FŖ%Ų‡Qyxx`ÕŖUX±bęϟ¼šĀ xžłēaee…Õ«WcåŹ•X¼x1rssѲeK|üńĒhŲ°”Į“{öģ‰?’ü³Ts3f Īž=‹C‡įųńćxöŁgÅ<,Z“Ɔ ĆįƇń’÷hÓ¦ `Ö¬YX¾|9Ö¬YƒW_}UēqrWŪ6śö+Ļ0¾DDDT1ŽŽŽxųš!²³³įä䤶.77>„··7ź×ƏO>łøzõ*üżż±k×.Üŗu«T­V”¶©˜f@@@©ż Å}>>5²÷õ_~‰Ē­[™Ų²e ąĆ!"ā&MzJļ~11Æ©½Ÿ?’o“m[‰nŻcɒž()Q`żś3ųī»X̘Įįüˆˆˆˆˆ}ˆQ-™L†ąą`Čd2DEE‰ėīŻ»‡€€¼ūī»ųüóĻŃ»woŒ1żõ—QėµIIIĮüłó1hŠ tļŽo¼ń …K—.Eæ~żŠ·o_,_¾ …¢Ģē“{÷n`ٲeā²O?ż:u ę;99ųģ³Ļ0sęLL™2„Üy/Ļ9ķŁs 3ft——#¼¼1cFgģŽ}„LepõźCÄÅŻĮŲ±O>z’'>GG\\l1uŖ¼nž›ŠˆˆˆˆŖDˆØV),,ÄńćĒń’ķŻy|TÕį’’×Lö=!$„„E†=„( ¬­Š(‚EZµ„VAKµŹ­ėÖÆVłŠŗ“Ä„TEØZÅTT”E@ö°BB Ł3ÉÜūū#™q²/’÷óńøÜõÜsĪ;ēœOpp0C† aóęĶŲl6¼¼¼€ŹŠ$44”Ēœ²²2žxā ²³³=^׿~’ūßóĆ?šÄOšŚkƑŸŸĻ<€ŻngÓ¦Mü÷æ’eźŌ©üņ—æäć?fĒŽõÖŻŗuĪ×č%$$0fĢ®½öZn»ķ6–/_ĪgŸ}ĘG}Ä|ĄĢ™3?~|“ŪõÕW_įééÉ5×\Óāŗ7·Mō西÷Æ&66ŒōōĀf}¶ nåŽ;ćė[Łł±wļŽ,_¾—āār l¼õÖn23›W¦ˆˆˆˆ“] DD¤]łžūļ)))įŠ+®`ųšį”””°eĖ–jēuéŅ…»īŗ‹ńćĒsć7b³ŁŲŗuk“;lŪ¶cĒŽ1yņd†N\\wŻuĒgćʍŲķv<Č AƒųņĖ/‰Æ·ž½zõā¾ūīs.÷Üsó؜9s1bO?ż4Ļ=÷£FbÖ¬YĶjW`` ’ūßłÅ/~Ńāŗ7·M5½šĀ5Ķž\÷ķ;٧¹łę˜ū|4?üĪ5×¼ĶŌ©ļāķķÕŖ’ģ‰ˆˆˆH%Ķ!""ķŠcxĢ /¼Ą /¼ąÜæ~żz®¼ņJēvTT”s="¢rNŠœœœ&wČĢĢ`ɒ%µŽ:süųq¦M›ĘĉłüóĻŁ°a]»veįĀ…ÕŹwÕŠ"V«•»ļ¾›;īø€ßžö·X,–jē4Vļ=zœuŻÆøāŠfµ  sē RSsó¤¦ęŲäĻuįĀ­üö·CŖM˜Ś­[’üēµĪķU«Ń«W‡&—)""r1ūśėÆyć7HIIĮĖˋ޽{sūķ·Wū’–xę™gųśėÆYŗt)?’łĻYæ~=žžžē½}ŁŁŁ\}õÕn»æ“ śS™ˆ“†a°~żzĀĆƳӟžä\ĀĆĆYæ~}µy.N:Uk=<<¼ÉĒ!ĄŒ3ųųć«-“&MĀĖĖ‹gžy†5kÖpēwrüųqV®\Ł¢öóÄOEĒŽyģ±Ē(**ŖvNcõöšų)PhiŻ[ҦŸ’¼’üēNž,āäÉ"žłĻ-\{mļjēŌõF€]»29zō “'÷­óxA/æ<ĀóĻojt’V‘¶`͚5<žųćÜqĒ|żõ׬ZµŠ)S¦š×æžÕ9XK†ĮG}Ä¢E‹g͚5ųłł·v=żōÓüšĆ„……÷ūKŪ£""ŅnģŻ»—œœ&OžĢĶ7ßģܟ””ÄĒ̾}ūˆ‰‰ 55•%K–н{wV¬X‰‰?½¤±ć téŅ…Ļ?’œĮƒĢ’%KHNNfɒ%|ńÅüć’ąŃGuõ¶įŲ±c¼õÖ[ÕöõļߟĮƒóč£rāÄ ^żuŹŹŹøūī»yģ±ĒŖM“Z_½ĖĖĖ[­ī~ųa³Ś0cĘŅŅņ™6ķ=&NŒeśōžMś\.ÜʝwĘćéY=ćw(ŽŽōźÕyó®äg?»ų_Q,""Ņ»ŻĪß’žwfĻžĶųń恏9Ņ®¹ę®¹¦łĆR]•••a·Ū ĮjµÖłĒ s)%%ŹīŽūKŪ£@DDŚ Ēp™#FTŪ?räH>žųc¾łęf̘@bb"ĒŽćµ×^£cĒŽ<ņČ#„……‘——׹ńš¼½½łē?’ɋ/¾Č³Ļ>Kqq1—^z)łĖ_ˆŽŽfĀ„ lŲ°'žx«Õʵ×^Ė”)SźmĆįƇyńÅ«ķ»ćŽ;Ų²e ėׯē±Ēć²Ė*ēŃøļ¾ūųūß’ĪkÆ½Ę“iÓ¬÷ɓ'[­ī6›­YmŖ¼—>:ŠGUļ95_±ė°hŃõĶ:_DD¤-Ūæ?ŁŁŁ\żõ ž·iÓ&žńPZZŠ··7÷Üs£FāŲ±cÜqĒĢ;—%K–——Ē“iÓøė®»ųӟžĄ]wŻÅ¢E‹Ŗ ™Y¾|9oæż6AAAÜzė­üķoćß’ž7üś×æfćʍ@e`słå—óńĒ“——Ēܹs™0a{öģį7Ž`ķŚµ,^¼˜²²2˜7ońńń,X°€¤¤$ž|ņIś÷ļσ>XmČLKŚ#¢@DDŚ9sę0gΜZūĒ϶mۜ‡‡‡=ö=öXe5tÜQ–C—.]ųæ’ūæ:Ė ¬Öƒ£>qqqµŹ­éī»ļ®¶=cĘ gĄÓX»"##ė,æ%u÷öönR›DDD¤õeffL``żsqåää0oŽ<^|ńEāććŁ½{7³gĻę£>ĀÓӓ¢¢"²²²xļ½÷Ų·oæžõƙ>}:Ļ<ó £FbńāźĆXOœ8ĮóĻ?ĻŅ„KéÕ«/¾ų"%%%NfīķķM~~>”””Īkž}öY^zé%ś÷ļĻ»ļ¾ĖSO=Ŋ+˜;w.k×®åńĒgčŠ”ÕŽī×Ņö»ūć7Ó"""upO¤%Ē/Tk½EDD¤i<<<0 £Įs¶nŻJTT”ó-p$&&ĘłĒĆ0œ½;ćāā°Z­uö&uŲ¹s'={ö¤WÆ^Üzė­ÖĄb±PZZŹ“iÓ ĀĻĻuėÖŃæå°ŁaƆ‘––vŽŪ#ķ‡zˆˆˆˆˆˆˆ“ŃŃŃ’““C‡uæ]-;;»ÖPßŠŠŠjož r®[­ÖC‰¼¼ŻŻĻMDγäädz÷īķījˆˆˆˆ›-_¾Ü9Af͹%źšk¢®}Ƽ“€9ĢÅ0 »aŲ1 ÓųiŻ0ģUĒ*×MÓäæĖ–q’Cv÷#øą3jŌ(>’üóZs{ˆX,–€R ¬jq¬W­%UŪŽuĒy6 Āe0]–&Ӑi±’’fΜIrr2Ÿ|ņ ŻŗuS"¼‹rȌc,™ˆ“/Ū·owwDDDD¤???&OžĢ’÷’żŲķvĀĆĆyę™gÜ]-‘F]”ČøqćÜ]qƒuėÖ¹» R‡É“'3yņdwWC¤Y4dFDDDDDDDŚ""""""""Ņī(‘vGˆˆˆˆˆˆˆˆ“; DDDDDDDD¤Ż¹(ß2#""""""uKLLÄĆĆ‹Å€ÆÆ/ Ģ›7Ž;¶øÜģģl®¾śjÖÆ_OII‰sŻßß߯Miõic.\ČʍŁøq#+V¬Ą0 žxā‰V+?,,Œ5kÖąēēwVå<żōÓüšĆn~ZŅ^)iƂƒƒ™9s&[·n„¼¼¼UŹ“Z­„‡‡;{”“TJJŠ»“c DDDDDÜÄ4MV¬XĮźÕ«ĖW_}Åɓ'[„üŅŅR>žųćóŅ–ÆæžšcĒŽUŪwüųq¾łę›V»ĒłjOsīńŃG±cĒŽjūLÓ䣏>jńż×Æ__k_[z¾āŽ Äj­ü ømŪ6n»ķ6n¾łfnæżvvīÜ Ą‘#G3f Ė–-cŹ”)üüē?géŅ„µŹĖĪĪ&!!āāb>̬Y³øīŗė˜4i/æü2†a°vķZ¦NŹ¤I“˜>}:Ū·o`Į‚$%%ńä“OņČ#°iÓ&f̘Į”)S˜>}ŗóßþ}ūøöŚkyžłē™9s¦»§“šCDDDDÄĶFķģv~źŌ)¶lŁĀĻ~ö3|||ĪŖ\___&Mšt^ŚMff&ŻŗusīĖĢ̤sēĪ­vóŁž¦²Z­dgg“““C‡Īŗ¼ŠŠ JKKkķoÆĻ÷|Łžż†z]Ś·Ÿ»«wÖNŸ>Ķ+ƼĀčŃ£ńšš //|’ūæ’#11‘-[¶šąƒņ駟bµZ)**Āf³ńĮpšąAn»ķ6FUļ\!eeeüįąų×\s Ü}÷ŻtéŅ… &šģ³ĻņŅK/ŃæŽ}÷]žzź)V¬XĮܹsY»v-?ž8C‡%''‡yóęńā‹/ĻīŻ»™={6}ōŽŽŽäēēŹ‹/¾čīG*m„‘ HDDžžžäääąēēĒŽ;¦øø˜«®ŗŠÓ§O³oß>LÓÄb±GĒŽłņĖ/8p œ>}š]»v1räHÖ®]Ė 7ܡɓ'Łæ?PŁ‹”oß¾DEEqę̾’ž{&Nœč¬ĒŹ•+;v,žžž8p€ŒŒ , †aŠ©S'āāāŖu•ļܹ3‡rÖĖ4MNž<Ée—]Po½óņņjµ±¾ū•••5©=EEElÜø‘ž={rüųqŹŹŹč޽;}śōiõĻĖ0  Ą®]»3fLĆźkū޽{1 ƒ²sēN¼¼¼ČĖĖ£““”ķŪ·ßīŸļł2rüuõ;yāGwWÆEī½÷^¬V+†aPVVĘ 7ÜĄ<Ą–-[čŌ©‰‰‰@å$¬aaalŪ¶®]»bš&“'O OŸ>ÄĘƲk×.†^ē½vī܉a\sĶ5ńĪ;ļ8Æ[·Ī¹>lŲ0ęϟaĪŽ*[·n%**Źł»?pą@bbbŲ¶m—^z)„„„L›6ĄĄ@w?^i#ˆˆˆˆˆ\`_¬V+………ÄĘĘҽ{wl6[·neäȑ“ŸŸĻ† ˜0a;v$''‡ˆˆ²³³‰ŒŒ¬VfYY[·neŌØQQTTÄ×_Ķųńć¬KNNéééŒ;ÖłśĄą`Ą¾łębbbŖŻ£”¶GEEĆ÷ßO·nŻšńń”¬¬¬Ž{“ēē{®µå!3^^^Ü{ļ½,X°€ &Hxx8—\rIµ^?žų#łłłĪPÄ1T„>;väōéÓĪJ®Ö­[ĒŹ•+yēw %99™3fŌYNxx8¹¹¹Õöåęę:_|¶øŠŌ¤@DDDD¤•——ćååÕ¬kcZ­V‚ƒƒ1bžž•’›ęåååüPVVFnn._}õUµė Ć cĒŽģŚµ Ó4ÉĶĶeŲ°aTTT8Ļ)++«õeÕŪŪ›²²²‘ĄĄ@FŽɑ#G8t读w§wļŽµ¾œtīܙķŪ·ÓÆ_?233IHHh“Ž5ŪŲŠż\5ŌOOĻjõs 39WüüüˆeļŽ½Õzw4ÖöččhRRR0`@£÷hKĻ·%’NĪ„¶8dĘՄ xūķ·yõÕWłć’Čå—_Ī3Ļ<ćšuāÄ īæ’~^{ķ5 ņóüųć¹ķ¶ŪHII!55•Įƒ×[ž!CšööęŻwßå–[n”ØØˆ9sępĶ5׹ååEPPĮĮĮ”––²|łrŠ‹‹ ĀĖĖ‹3gĪ•Cwž~śivīÜÉąĮƒŁ±cYYY 6ĢŁKD¤5)i% [·nĶž¢ē:©jC|}} cĈõĻĢĢ$((OOĻjH]½ŹŹŹšńń©õeÖ4Ķj׆„„0dČ ²Kż¶mŪš÷÷§k×®ÕŹ £¢¢‚ģģl Ćpžu¹”z×Õ æ¾ūEDD4©=īŅ«W/¾śź+²³³›ü™„¦¦Mjjj£“²¶„ē[^^NJJ }ūö=E³µÅ!3®, ÷ß?÷ÜsS¦L”{÷ī,X°€ēŸž‚‚<==™9s&!!!äęęāįįÅbq†<šŃŃŃÕ~·]łųųšĀ /°`ĮŽxć <<<ųŁĻ~ĘŌ©S)..fõźÕ\żõDEE1oŽ’üs ±Z­ Ö’b|¾{÷īåšįĆu ج¹C[2³eĖ–ZūāććŁ¼y³s;!!·Žz«ĪėMÓäWæśæśÕÆŖķgŪ¶mųūū;×z÷īĶāŋk•Tk’žóēś¬Y³˜5k–s{ųšįuNŽŚ³gO6nÜčīG+mŒ‘VеkWŠ‹‹éڵk½Æ¦<[ŽŽŽ$&&²cĒLÓÄ0 .½ōRēŠ†ˆˆ>ģ|óˆ+† ĘöķŪūœńļŻ»7ėׯĒĒLJččhüüü0M“ˆˆ222X·nĪ}õ}‰ŽŽę»ļ¾«V‡†ź]ó³ ŻĻµĒBCķq̽āĪ”±¶ļ޽›=ząįįA÷īŻ9xš sčĮśõė5jT›x¾żū÷Æsüųń " ¶?d¦¹Īåš2‘ IKf„±ø,PŖ8oĄšü  jݱķėrŽć|Ó4ē5åęĖ—/gÜøqī~n""""uŖØØpĪ’!§?žŲłźY97ĪęßÉŗuė˜2e Pū‹{]_äėŚ÷ŹK ˜óĄÜŹ”1öŸ†ÉŌ5dʱnš&’]¶Œūś³»ß9õć?rĖ-·ŌŁĖD¤µX,–€R ¬jq¬W­%UŪŽuĒy6 Āe0]–&³6ēdi˜Ā‘ĘéßɅė’K.Q"ķ†iwˆˆˆˆˆˆøŠp‘öAˆˆˆˆˆˆˆˆ“; DDDDDDDD¤ŻQ """"""""ķŽ¦wiCŠŠŠX“hß|ó ÅÅÅX,zōčĮwŽIbb¢»«'rĮP‘6ä™gž!++‹7ß|“/¾ų‚Õ«W3uźTV¬XAEEO?ż4?üšC“Źkι"õiC¶mŪĘOAAASZZŹņåĖ(..®unDD†apšąA>ųągļU«Vńč£RVVTŻ Õ'¹`)i#ŗuėĘO<Į’ž÷?®æžzFÅ-·ÜBjj*ÆæžŗóU¼“&MāÉ'ŸäĪ;ļdĀ„ „„„pżõ×sĻ=÷pĖ-·ŠÆ_?fĻž]ėܐī¼óNę̙ÓiӈŠŠĀ××Ć07nžžžL:•nø_üā <˜ė®»ĪŻE¤N–^cq¹ÖÓeń|_ĄšŖÖŪ¾.ē8Ī÷1Msž»†ˆˆˆˆˆ4Ÿ»&Um鵯¼“€9ĢÅ0 »aŲ1 ÓųiŻ0ģUĒ*×MÓäæĖ–q’CvóÓ¹ųY,–€R ¬jq¬W­%UŪŽuĒy6 Āe0]–&SiwˆˆˆˆˆˆˆˆH»£@DDDDDDDDŚ""""""""Ņī(‘vGˆˆˆˆˆˆˆˆ“; DDDDDDDD¤ŻQ """"""""ķŽiwˆˆˆˆˆˆˆˆH»£@DDDDDDDDŚ""""""""Ņī(‘vGˆˆˆˆˆˆˆˆ“; DDDDDDDD¤ŻQ """"""""ķŽiwˆˆˆˆˆˆˆˆH»ćéī ˆˆˆˆˆˆ“W„„„¼łę›Īm‹Å‚ŸŸ;wfȐ!tčŠĮŻU¼č,^¼___næżvwWE.pź!""""""āfV«•žżūÓ·o_IIIįĆ?äųńćī®ŚysāÄ /^LqqńY]3räHŻŻ¹؇ˆˆˆˆˆˆˆ›yzz2bÄēö޽{Łøq#ß|ó ·Žz+ī®ā9wōčŃV¹¦_æ~īnŠ\$ˆˆˆˆˆˆˆ\`ś÷ļϾ}ūČĖĖ#++‹ččhŹŹŹŲ¾};G„øøbbbHHHĄĻĻ€¢¢"¾’ž{222°ŁltźŌ‰įƇFqq1oæż6aaaL›6ĶyÆ7ŽxÓ4łķoė<'::šŲŲX¶n݊——cƌ”øø˜M›60|ųpzõź€ĶfcēĪüųćāēēG×®]6l>>>˜¦É«Æ¾Jhh(£FbƆ œ9s†ŠŠP®¼ņJ"##łä“OČČČąķ·ß&!!ųųxŅÓÓŁ¶mŁŁŁX,"##1b”””õ^SsČLcĻ­)õ“¶ICfDDDDDD.@įįįäēēcŸ|ņ {öģ!::šQ£FŃ­[7öļßĻgŸ}†a†ĮŖU«HII”OŸ>\~łådee±jÕ*ŹŹŹštOGO”¼¼<ŅŅŅ茵+………|÷Żwʍ‡Õj%55•¼¼<®¾śjBBBHKK#//¢¢" 8}ś4įįįDFFbAAAtė֍C‡‘™™ITT‹…²²2ƌChh(†ašÖ[o‘ŸŸļģÉāķķ @LL žžžüę7æĮ4M, †a°cĒrrr0 £Žk\5å¹EGG7Z?Ē}¤mQ """"""r1M“Ó§OBvv6”””ÕĪ !##ƒüü|ē¾ĄĄ@ēśW\ĮW\ЬÉJżżżńō¬üŗčķķMII !!!ųłł‘——‡Żnw–™››ĖźÕ««•įééI~~>QQQĪmGż­V+žžž”••QQQQgą`›7o&55•āābg@äx>MQXXŲčs‹ŽŽnQżäā§@DDDDDDä³wļ^ņóó &22Ņ9ä%//ÆŚy¹¹¹8÷8×wīÜÉöķŪILL¤wļŽ@e0bV«•ÜÜ\***ZYZxÅåZO—Åš|?ĄØZwlūŗœć8ßĒ4Ķyī~"""""Ņ|5ēsØk~‡śę|pĒµÆ¼“€9Ģ­|3‹ŻĄ0ģ•oL1~Z7 {Õ±ŹuÓ4łļ²eܒПŻü“E.~‹å («ZėÅUė…@IÕ¶cŻqž ØpYL—„ɇ‰ˆˆˆˆˆˆH»£@DDDDDDDDŚ""""""""Ņī(‘vGˆˆˆˆˆˆˆˆ“; DDDDDDDD¤ŻQ """"""҆Œ?ž©S§ÖylƌŒ?Ž-õŹĪĪ&!!āābw>'"""""""mLQQÉÉÉÕö;vŒ¼¼ū,O<ńŸ|ņ S¦Lį©§žĄÓӓ¢¢"²²²xļ½÷xńÅyķµ×ČĻĻoš¾ •)r”Q """"""Ņ]}õÕ¬Y³Øģµ1qāÄjĒżüüX·nżū÷`Ų°a¤„„a†a0eŹāāā°Z­œ’üsžžyŹĖĖĒ Ć`įĀ…|ūķ·x{{c³ŁŖ ³ r®[­ÖFƒ¦”)r”P """"""ŅÅÄÄŇ~ˆŸŸŻŗu#%%Åy|Żŗu¬\¹’wŽy‡ŠŠP’““™1cF£åÖ F\‡Ń““LwА‘6źź«Æęµ×^«5\*ƒŒ   ‚ƒƒ)--ełņå7XfDD†apšąA>ųą¬VėY•)ā DDDDDDDŚØ &ĶĻ~ö³:…„„pżõ×sĻ=÷pĖ-·ŠÆ_?fĻžŻ`™!!!ÜyēĢ™3‡iÓ¦…ÆÆ/†a“øLw°“š‹Ėµž.‹7ąų~€?PµīŲöu9Ēq¾išóÜż0DDDDD¤łjĪQ×|õĶ!įŽk_yis˜‹avưc¦ńÓŗaŲ«ŽU®›¦É—-澇žģę§-rń³X,/„@YÕāX/®Z/JŖ¶ėŽól@…Ė`ŗ,M¦""""""""Ņī(‘vGˆˆˆˆˆˆˆˆ“; DDDDDDDD¤ŻQ """"""""ķŽiwˆˆˆˆˆˆˆˆH»£@DDDDDDDDŚ""""""""Ņī(‘vGˆˆˆˆˆˆˆˆ“; DDDDDDDD¤ŻQ """"""""ķŽiwˆˆˆˆˆˆˆˆH»£@DDDDDDDDŚ""""""""Ņī(‘vĒÓŻiÆJKKyóĶ7Ū‹???:wī̐!C芔ƒóŲāŋńõõåöŪowwµ[E[k\|ˆˆˆˆˆˆˆø™Õj%..»ŻNvv6)))üųćLœ8‘®]»0räH<<<Ü]Õ9qā+W®äWæśžžž}{¤mP """"""āfžžžŒ1¹½wļ^6nÜČ7ß|Ć­·ŽŠ‡‡żśõsw5[ģčŃ£µö]Ģķ‘¶AˆˆˆˆˆˆČ¦’žģŪ·¼¼<²²²ˆŽŽ®5Ä$==mŪ¶‘Åb!22’#F @NNß}÷ŁŁŁųśś2lŲ0¶mŪFAAæūŻļ0M“W_}•ŠŠPFņ 8sę ”””\yå•DFFPVVĘöķŪ9zō(ÅÅÅųūūCBB~~~?~œ~ųÜÜ\LÓ¤C‡$$$Š„K>łä222xūķ·IHH >>¾V{ŠŠŠųžūļÉČČĄf³Ń©S'†NXXX£÷i MŖ*"""""r  ??æÖ±²²2Ö¬YCNNcƌa芔¤„„ńÅ_`·ŪY½z5™™™ōéӇ”C‡²’~ŠŠŠ°Z+æZ,¬V+%%%l޼™=zĶéÓ§Y·n†ašÉ'Ÿ°gĻ¢££5jŻŗuc’žż|öŁg†Ķfc͚5ŲķvƌƘ1c0M“o¾ł›ĶFbb"AAAŒ;–^½zÕja¬ZµŠ””śōéĆå—_NVV«V­¢¬¬¬Ń{ˆ“„zˆˆˆˆˆˆˆ\€LÓØsž ~ó›ß`š&‹Ć0Ų±c999†AVV………tźŌÉ9'&&†„K—V+Ļb±PVVʘ1c Å0 Žzė-ņóó±Łldee‘““Cdd$£F WÆ^dgg“‘‘Aff&”””˜¦III DFF2iŅ$<=+ænvźŌ ooogsˆøJOO'77—.]ŗTAū÷ļ'--Ī;7x‘–ŠoˆˆˆˆˆČĘ4MNŸ> @HHH­ć†a°yófRSS)..v†'Žk‹‹‹vīĄÓӳڹP9‰c˜ÕjÅßߟ²²2***(,,pw !##ƒüü|¢££;v,Ū·ogóęĶ@eˆÓ§OFŒįģ‘ŅĒ}ū®øā ®øā ēöŁŽC¤&"""""""˜½{÷’ŸŸOpp°s.WIIIģŻ»—ž={2bÄ<<¦iĪs÷Ć‘ę«9'EĶķśö¹ėŚW^ZĄœęb†ŻĄ0솁iü“nöŖc•ė¦iņßeĖø’”?»łi·œĶfcɒ%3}śtwWGŚ1‹ÅņP ”U-ŽõāŖõB ¤jŪ±ī8ĻTø,¦ĖŅdź!""""""Ņ­\¹’œœ Dpp0ÉÉɚoC¤Š‘6čņĖ/gĖ–-lß¾»ŻNPP <ŲŻU¹ (iƒ:vģȵ×^ėījˆ\°ō²fiwˆˆˆˆˆˆˆˆH»£@DDDDDDDDŚ"""""""mÄŻwßĶ¢E‹ź<¶pįBī¾ūīf•—MBBÅÅÅ<óĢ3Lœ8Ć0šUNBBūöķ;/ĻĄµĪ5ėßŅvKŪ¤@DDDDDD¤øį†Xµj¦iVŪoš&Ÿ}ö“'OnVyaaa¬Y³??? Ćą£>bŃ¢EX­ē’«äÓO?Ķ?üp^Źwm·“] DDDDDDDڈńćĒ“——ĒĪ;«ķß±cgΜaÜøqĶ*ĻjµŽÅb”¬¬ »ŻNHHˆ[Ś–’’rŽŹwm·“] DDDDDDDŚ___&L˜ĄŹ•+«ķ_¹r%'NÄ××€mŪ¶qŪm·qóĶ7sūķ·;”}ūöqķµ×ņüóĻ3sęĢjCGžō§?p×]wń»ßżŽ7ß|³Ś=Ž}÷]ī¼óĪėwģŲ1ʎĖŹ•+™6m&L`ńāÅĪć‹/fŹ”)ÜtÓMÜxć,^¼Ó4Y°`III<łä“<ņČ#¬]»–©S§2iŅ$¦OŸĪöķŪ}>õ]S³üšCf6mŚÄŒ3˜2e Ó§OgżśõMj\Ųˆˆˆˆˆˆˆ“!7Üp_|ń6› ›Ķʗ_~É 7Ü@^^>ų sęĢį’ūæ’żļyšĮ)))ĮŪŪ›üü|BCCyńÅ«•ūĢ3Ļ•”ÅōéÓy’ż÷«Ķ%ņńĒ3mŚ“ėęééIQQYYY¼÷Ž{¼ų⋼öŚkäēē³gĻ>üšCŽ~ūm>üšCŽ|óM>̱cǘ;w.!!!<žųć<óĢ3”””šģ³ĻņÄOšÉ'Ÿ0eŹžzź©ļŻŠ55Ėw•““üyó˜;w.|š<ņśÓŸ8}śtƒķ‘ Ÿ‘6dŠ At芁o¾ł€Ææžšˆˆ Ą–-[čŌ©‰‰‰$&&ʶmŪ°X,”––2mŚ4‚‚‚ź½ĒŲ±c±ŪķlŲ°€C‡‘••Õ¤!9†a0eŹāāā°Z­œOwW@DDDDDDZ—crÕ &°jÕ*&Mšä<–MZZZµ}EEExyyŲ`łV«•©S§ņŽ{ļqÕUWńÉ'Ÿ0yņd¼¼¼šT?×°Åjµb—\r Ƽņ ļ¾ū.K—.ছnbęĢ™µ&q5 ƒ… ņķ·ßāķķķģ Ss2ٳ½Ęń¼ĀĀĀŖķ %''§ĮöȅOˆˆˆˆˆˆHsŻu×±xńbNœ8ĮÖ­[yģ±ĒœĒĀĆùä’Kxēwj]—’’Ņä‰D§L™Āo¼ĮńćĒY³f ’ž÷æĻŗŽ—]v?ž8GŽaīܹDEEqżõ×W;oŻŗu¬\¹’wŽy‡ŠŠP’““™1cFƒe·äĒóŹĶĶ­¶/77—Ž;žu{Ž4dFDDDDD¤‰ˆˆ !!æžõÆ\~łåtčŠĮyģņĖ/'==Ż9”č‰'˜6mgΜiÖ=BBB˜0a>ś(}ūö%::ś¬ź¼jÕ*}ōQŹŹŹčŅ„ ”””Ī^^^Ī:ęēēDpp0„„„,_¾Ą9 j]»Ęµ|W‰‰‰dee9'žŻ±cYYY 6ģÜ|xrŽ(iƒnøį6oŽģœLÕ!$$„ šüóĻsć7rß}÷ń›ßü¦EÆÓ>}:IIIL:õ¬ė;nÜ8üżż™:u*7ÜpæųÅ/-y©²ÅeŹa7ŽÅš|?ĄØZwlūŗœć8ßĒ4Ķyī~"""""Ņ|5ē`ØkN†śęipĒµÆ¼“€9ĢÅ0 »aŲ1 ÓųiŻ0ģUĒ*×MÓäæĖ–q’CvóÓ¾°$%%ńšĆóŃG՚ēC¤>‹å («ZėÅUė…@IÕ¶cŻqž ØpYL—„Éō+""""""ĶVTTÄßžö7n»ķ6…!rQŅo­ˆˆˆˆˆˆ4Ėo¼Į¤I“čÓ§Ó¦MswuDZDo™‘f™9s&3gĪtw5DΊzˆˆˆˆˆˆˆˆH»£@DDDDDDDDŚ""""""""Ņī(‘vGˆˆˆˆˆˆˆˆ“; DDDDDDDD¤ŻQ """"""""ķŽiwˆˆˆˆˆˆˆˆH»ćéī ˆˆˆˆˆˆ\,Nž<éī*ˆH+QiwˆˆˆˆˆˆˆˆH»£@DDDDDDDDŚ""""""""Ņī(‘vGo™q›ĶĘŖU«jķ÷õõ„cĒŽÄÅÅįļļļījžu», >>>tģؑ޽{|Nļ’ńĒc±X˜4i’»…\ĄŌCDDDDDDÄͬV+={ö¤gĻžÄĘĘāėėKZZ›6mĀ4MwWƖS§N±bÅ JKK›Ō®īŻ»ćēēGZZ_ż5YYY­~/‘ęR7óšš`Ą€ĪmÓ4Y»v-œóĶ•™™Ł¢v„¤¤°gĻvģŲĮĉ±Z’}Sļ%Ņ\ DDDDDDD.0¦i:{†8Bƒņņr’““ÉČČ ¤¤:uźD\\^^^”––’””Ä©S§ØØØ C‡ 0€   &•aš&}ōAAA <˜Ż»wSXXH`` ƒ&,,Œļ¾ūŽÓ§O°zõj.»ģ2śōéÓ¤võģŁ“ü‘‚‚rrrčŲ±#§OŸf’žżœ9s‹ÅBXX˜³ĪõŻ«”k, ™™™$%%Q\\Lpp0$,,  Ń2²²²8xš łłł˜¦IHH}ūö%22²ÉŸGceˆ{iȌˆˆˆˆˆˆ›ŁķvöģŁĆž={Ų½{7ß|ó „„„DFFˆišlŲ°Ć‡Ó­[7FŒAß¾}IKKcóę͆Į† HKK£{÷īōė׏œœ6lŲ@yyy“ʰX,X­VJKKŁ»w/;w&""‚3gΰmŪ6€jóš :”.]ŗ4«­!!!Q^^ĪęĶ›ÉĻĻ'>>ž¾}ūrņäI¶nŻZļ½»ĘĮ0 >LÆ^½øä’KČĶĶåūļæĒn·7ZFyy¹óÜųųx†ŠaģŲ±£Éϲ±2ÄżŌCDDDDDDÄĶ Ć %%„ھž={@vv6yyy„„„Š”CLÓÄßßŸØØ(Ž?Nvv6v»‚‚"##¹ģ²Ė€ŹŠįĒääɓųųų4ZFxx8Płe>>>ž   Ćą³Ļ>s:tpö€ˆˆˆĄ××·Łm…Źž/^^^\żõ˜¦‰ÅbĮ4M’““ÉĻĻĒ0ŒzļÕŠ5Ž5†a0tčPüüüČÉÉ!77—œœ""",Ćn·cš&eeeĘUW]…‡‡PŁ»¤±gŠ`ā~ DDDDDDDÜĢĖˋ뮻€äädöķŪGII‰óĖsII łłłlŚ“©Śµ9ƒ×·ŅōļߟžżūpüųńFĖp"Ī”#V«___ŹĖ˱ŪķĪ€¢%LÓäĢ™3bIII¤§§SZZZmŁś&“mź5žžžĪ0 €ÜÜ\JKK-Ć×חųųx’““Ł»wÆó9tļŽ6éóo° ‹ÅŅjæ?Ņ2 DDDDDDD. ={öäȑ#¤§§sźŌ)"""œ!G‡øźŖ«ź¼Īńę–¢¢"ē¾C‡qąĄāāā m“Œsķȑ#@XX)))¤¤¤Š„K €Õje͚5TTTŌ[Fjjj“®©ØØ ““ŌŁ«¤°°??æ&•ѵkWŗvķJYYyyy>|˜ŌŌT:vģؤϣ±2bbbÜņČOˆˆˆˆˆˆˆ\@<<<øģ²ĖŲ±c{öģaģŲ±t芁²³³Łµk‘‘‘ĪI=MÓdōčŃtģŲ‘ĄĄ@N:Åžżūńóó抔CX,bbbšńńi“ ooļ&׹šįĆÄÄÄ8'*­É17Š£gHvv6ÄĒĒ8ˆ’’222HOOĒĖĖ‹ŠŠ Nœ8A×®]kŻ«)×@eoŒ~ųnŻŗ‘——G^^žžžt芁ģģģĖšóócŪ¶mtģŲŃYž§gå×g__ß&}łłłlŻŗµŽ2Äżˆˆˆˆˆˆˆ\`ŗuėFJJ łłł¤¦¦Ėȑ#o59zō(žžž„‡‡sŁe—9ƒŒ#F””ÄŃ£G)//',,Œžżū;æ€7„Œ¦ˆ„°°cĒŽįėė[o ā:7Š··7ŃŃŃōéÓĒ9±j=ČĪĪ&;;›¢¢"z÷īMÆ^½Ų±c ::ŗÖ½šraųśśrÉ%—°oß>JKK gŠ AX­ÖFĖ7n—^z)GuN“H||¼sXQcϲcĒŽ–!īՒAK—*CĒā ų¾€ąT­;¶}]Īqœļcšę}ØØØąČ‘#ī~ĢŅ؇ˆˆˆˆˆˆHćēēĒźÕ«łöŪo‰‹‹ĆŪŪFŒĮīŻ»Y½z5»wļfäȑ ĪāććĆšįĆŁ¹s'«WÆę‡~ąŠ+®Ą××·Ö¹§N"<<€Ž;’““CĒŽŪ'Ožl°<Ć0šöö¦¬¬Œoæż¶ZŁ <˜oæż–5kÖąįįŃģyRDjR """"""҆X,RRRČÉÉĮ4MüüüˆŒŒ¤¤¤„“'OpņäIŹŹŹˆˆˆØ·¬N:Q\\Ģ©S§ČĪĪ¦ØØˆČČČZēžĪó+Æ>ŁŁŁ@Ļž=«ŻW¤%ŌCDDDDDD¤°ŁllÜø‘Aƒįåå…išģßæ›ĶÖ`‘M›61dČē›i6nÜXkŲ‹CVV±±±ģ޽€Ó§OēģIŅPyõÕ   €={ö0jŌ(ģv;‡¢¼¼\«ŹYiÉoÅeŹPűx>€/ąųUėŽm_—sēū˜¦9ĻŻCDDDDDšÆę_źėśĖ}}ĶwĒµÆ¼“€9ĢÅ0 »aŲ1 ÓųiŻ0ģUĒ*×MÓäæĖ–Ū×ĶO[äāwĖ-·¼”eU‹c½øj½(©Śv¬;γ. €é²4™†ĢˆˆˆˆˆˆˆH»£@DDDDDDDDŚ""""""""Ņī(‘vGo™i¢Ń£G»» "ŅJŌCDDDDDDDDŚ""""""""ŅīhȌˆˆˆˆˆHEFFŗ» "ŅJŌCDDDDDDDDŚ""""""""Ņī(‘vGˆˆˆˆˆˆˆˆ“; DDDDDDDD¤ŻQ """"""""ķŽiw<Ż]‘‹Å®]»Ü]i% DDDDDDDšØS§Nˆ“ ™‘vGˆˆˆˆˆˆˆˆ“; DDDDDDDD¤ŻQ """"""""ķŽiwˆˆˆˆˆˆˆˆH»£@DDDDDDDΉ§žzŠS§NPTTĬY³(((ąōéÓ<žųćõ^›ŸŸĻ³Ļ>ėī&“Hjj*÷Ž{/ūöķ«÷œ7ß|“żū÷7©¼ĀĀB/^ÜäūŸ:uŠ?üį,X°€ šōÓOóᇶZūģv;üćĻŻČ×_ĶĻ~ö3īŗė.BCCłńĒ›tß+Ƽ’®]»róĶ7×{ÆšÖÆ_ĻčŃ£7nß|ó [¶l”S§N̚5‹;¢¢"€&ÕՕÅb!''‡Ūn»Y³fHJJJƒŸĆéӧٳg½{÷& €{ļ½—»īŗ‹9sꐒ’BNN‹‹ÅĀŻwß]­ŻcĒŽeżśõlÜø‘Q£Fąćććī_Ƴ¦"""""""rNxyyĮ ĀjµŹĮƒ ĒŪŪ›ŒŒ ’““¢qāÄ ŗuėVkVV]»vunGGGsņäIĀĆƉŠŠ*‡w€ŸŸ6›­I÷mʽ\Łķv¶nŻJHH6l 77—I“&‘M§NŖ]ļŠX]kŠŽŽĘb±Tē9éééüżļĒb±ÄōéӉŠŠ"77—eĖ–€ÅbįĢ™3Īė]ėē0dČ>łäŹŹŹŲ³g=ō@›č!¢@DDDDDDDĪ™~żś±vķZē|!½{÷®¶MQQ3fĢØv]~~¾s=&&†Æ¾śŖVŁQQQÕzG¤„„Ū¤zÕwߚ Ćhņ½¶oßĪĄ¹łę›ū>üšC¶mŪFXXYYY˜¦IZZŚ9}īŃŃŃ<šĄµöoŲ°>}ś0~üxŠŠŠHJJĀ4M¬ÖŸ‘8ŚķįįABBļ¾ū.—^z©sh΃>xNė>hȌˆˆˆˆˆˆœ3qqq$%%Ń»wośōéĆŽ½{‰‹‹ !!‹ÅĀĖ/æĢ«Æ¾Ź«Æ¾Z- q”ѽ{w^xįžõÆńÆż‹¤¤$† †a,Z“ˆE‹a·ŪILLlR½šrß:pśōi–,YҤ{­[·ŽįƇWŪ7|ųp¾śź+.æürŅÓÓł×æžÅo¼AHHˆ3ˆ8Ÿ Ą÷ßĻkƽĘG}ÄŠ”Cy’ż÷ėm7Ąčѣٸq£s(Pyy9sēĪ=ļuom–^cq¹ÖÓeń|_ĄšŖÖŪ¾.ē8Ī÷1Msž»†ˆˆˆˆˆ4_Ķ/uu}É«ļ‹Ÿ;®}å„Ģy`.†a`Ų ĆŽa˜ĘOė†aÆ:V¹nš&’]¶ŒéwüĪĶO[äüĖČČąż÷ßgΜ9­R^ēĪ_J²ŖÅ±^\µ^”Tm;ÖēŁ€ —ĄtYšLCfDDDDDDD¤Nk×®e×®]ÜqĒī®J«S """"""""uš8q"'Ntw5Ī Ķ!""""""""ķŽiw4dFDDDDDDZÕ©S§ųĖ_žB—.]Ŗķæį†čŪ·Æ»«× ĀĀBŽyēīŗė®V)ļĶ7ßdŲ°a\vŁeēōŽåéä¼¶ĻNœū|ūĘᗐHžĒ+žĖf•gKM”xėBo¹µŚ~£øØEå]ˆˆˆˆˆˆˆˆH«‹ŽŽf޼‹ļe¢­†œļ{{Åt”ĆĢŚ×79¼(/'ļ½å„Īø ‹„ö‹i­žm" """""""r=ūģ³Ģœ9“ČČH233łĻžĆ¼yóX¾|9gΜ $$„[o½• 6°{÷n¬V+łłłüņ—æ$::šS§NńśėÆ3oŽ<–.]Jaa!‹næżv>Ģ_|APPÅÅÅ3gĪ<==ė¼«üü|^~łe~ųa’’’ųä“O°X,Lž<¹Zļ–¢¢"–,Y‚——eeeDDD0}śtl6ƾś*ųłł‘ ĄĮƒłüóĻ !##ƒŲŲXLÓ$77—3gĪp’ż÷SRRā¼÷Įƒėlƒ——W³ž·QX@īŪKŸ5‡āMßa8~"«WāÖ’ˇ’ŌöĻ?£üųQ VÆÄ§O_ģ…łäÆųFA†­Œ·ĻÄ(+u–Wvč …ė>,MøļŲ^īžõj"""""""ŅźŅÓÓY°`Aµ}üć9r$›7oę†n`Ó¦M\uÕUlŻŗf͚Ą²eĖŲ±c‹‹ÅĀŻwßͶmŪXæ~=Ó§OgćʍŒ5Š-[¶`µZ™={6Ė—/gĖ–-„‡‡“““Ć=÷܃ÅbańāŤ¤¤ŸŸ_ē}† Rg’’’>|8ƒv†(Ü{ļ½Īķ§Ÿ~šœœöķŪG§N˜:u*łĖ_€ŹŽüž÷æĒn·sß}÷ń—æü…°°0^}õU~üńG:¹ w±X,u¶””!Gå'ŅČ^ü/ē¶’°+š¹“÷OŪĆÆ$ļ·(޼{^.A×\Wķz’”—c?MŠ5×aKMĮ(,"ų׿‹…¼w—a;~Ļȟźh;”Œß|/‹Ć^ļī_¹fS """""""­.::š¹sēÖŚŸ˜˜ČsĻ=Ēõ×_Ļ®]»xä‘Gųģ³ĻHNNfŃ¢EµĪw„C† į“O>”¬¬Œ={öšŠC±jÕ*ŗvķZķž'Ož$<<œččhē   l6õާ.'Näż÷ßgÓ¦MÜrĖ-Վåęę²lŁ2°X,œ9s›ĶFvvvµ`#::ڹ€‡‡AAA„……ąēē‡Ķf«óÖlCCź2cTŪ;žģ>OĒ?Ģ„1ž¢ źžV??L[yµćžWŽ¢`õJJ¶o%ųŗÉMz¦"""""""rŽųųųеkWÖ¬YCļŽ½ńöö&::š¢¢"f̘Qķ܍7bµV¾ÕĆƃ„„Ž}÷].½ōR¼¼¼ˆŠŠ"%%Åy~ZZ±±±õŽ»¾ūŌēŲ±cüņ—æäȑ#|ńÅÕę÷Ų°a}śōaüųń‘””„iš„……‘••€i𤄄¹ū‘’Ä0(X½’°_žšüUÓį×w:,€iorqéé„Lž‚ķŲ1Š6|{ŃĶ-¢@DDDDDDDZ]zz:óēĻÆ¶oŲ°aŒ;–+Ƽ’ēŸž‡~€„„>ĢĖ/æģœ#ćæųE­2GĶC=Äć?ī,ļŠ”CĪ$&&rųšį:ėTß}‚ƒƒė<æ““”üćX­Vʏ_ķŲ€Xŗt)©©©ųūū3tčPŽ’}īŗė.^yåžõÆįėėKHH¦i¶Śs5 ƒ?žń¼ųā‹Ķ¾¶š‹5ųö€O\?*rs(üb ®q÷ „";‡3’{æų”–g–•’óŸ7°X­Œø²ÕŚx¾XZxÅåZO—Åš|?ĄØZwlūŗœć8ßĒ4Ķ‹ośa©õeÆ®/õ}!tĒµÆ¼“€9ĢÅ0 »aŲ1 ÓųiŻ0ģUĒ*×MÓäæĖ–1żŽß¹łi·o¼’žūĢ™3ĒŻU‘³Š¹sē€R ¬jq¬W­%UŪŽuĒy6 Āe0]–&S¹ą­]»–]»vqĒwø»*ŅF(‘ ŽÄ‰™8q¢»«!mˆÕŻ‘vÆõ&Zi"""""""""Ņīœė@ä¼'<""""""""QiwˆˆˆˆˆˆˆˆČ…®ÕG č-3""""""­l×®]Čy7hŠ Ö(ę¼M½q6ˆ XĪWEEDDDDD.­ōÅPDĪ”ó1dʬg&ģ‘ö©)YA‹óĶ!""""""""ēÓŃ)ā\"f¶/ˆ """""""ēYc¦0i5粇H}”HĶ*iß CĪInŠZH}ĮFS”PDDDDDDD¤}0›qģœå­ŻC¤¾P¤®^!&ź!"""""""Ņ5eČŒŁĄ5gķl^»ėZ”ŗ*H#ūėk“ˆˆˆˆˆČ9õæ/pwιćĒ³`ĮbbbœūČ5×\ćīŖ5*55• pļ½÷×Ŗe'''óķ·ßņŪßž¶E×?~œ÷ߛ͆ĶfcąĄLš4 «µuśŌWæ£GņüóĻÓ„K|||øé¦›čŅ„ §Nā/ł Żŗu ¬¬Œ«®ŗŠQ£FÕ*?;;›’ūßDFFrūķ·7X—žóŸųłłÕł¬V­ZÅžżū±X,ōķŪ—kƽ¶9Ķ4©æ³ÄŁŽ@i²ÖDšŚĄśö­Ń‘¦ŗ’”?7ūšžū‹»«ŻlŻ»wēhҹåå弞śė̚5ĖŻÕfŻŗu̘1ƒÆæžŗÕ‹ÅŅ¢ėŠ‹‹Yøp!³gϦk×®†Įo¼Įž={4hŠ9Æ_=øļ¾ū€Ź`fįĀ…üéO ::š¹sēPZZŹĆ?\g ņÕW_1räH:Ō`¾ūī»zėqäČRRRxšĮųĒ?žAjj*=zōhjMEą<Œ,9—H} 6jüt¬‹ˆˆˆˆˆœ7y§3›|nIq”»«ŪjvļŽMRR·Žz+Ææž:W]u;wīäȑ#üļ’榛nbéŅ„b±XšńńįöŪoēšįĆ|ńÅQ\\Lqq1sęĢĮĖĖĖY¾a-¾ ??ŸģģlFŽɦM›ČĶĶ%,,Œ}ūöńå—_Hqq1†ap×]wQQQĮ’%Kšņņ¢¬¬Œˆˆ¦OŸĄ§Ÿ~Ź‘#GšööĘn·3qāDΜ9Ć[o½E~~>„„„üįĄÓӓåĖ—sęĢBBBœĻČaĻž=ōė׏®]»`µZ¹óĪ;lwRRRĻ»wļŽĶŖ_M]»veŠ AģŚµ‹Ž½{W{žĒŽ#**ŖĪĻźŌ©$%%5ų;’ĶęĶ›™:u*_~łe­ć`Ȑ!ĪķĮƒsąĄę"5ó€šĮyé4њˆy‹‘VvōčQęϟļÜ5jžžžuž{å•W’••ÅĶ7ßĢęĶ›±Z­Ģž=€åĖ—³eĖĀĆĆÉÉÉįž{īĮb±°xńbRRRčŪ·Æ³œ-[¶“ųZ€õė×3zōhʍĒ7ß|ƍ7ވÅb!''‡{ļ½«ÕŹ»ļ¾Ė–-[øźŖ«ø÷Ž{×?żōÓää䐙™Izzz­0!99™ĀĀBī»ļ>¬V+Ææž:)))äēēćįįįģ!³lŁ2vģŲQķ‹nn.įįįu>æśŚPēłūöķkVżüüüj•įx¦éééüżļ °°‘#G¶ų÷ęķ·ßfƌŲķö:Ń©S'ē¶ææ?™™M©;iźŅjĪ6i¬2M C4dFDDDDD¤•Õ5df÷īŻ^—••åģ•Ć1NžĶ’%KøżöŪ9t萳·D@@‰‰‰õöŽp5lŲ°_»nŻ:n»ķ¶jū†Ī’%K˜sęĢįȑ#¼šĀ ĪyJƌSk·„„>ĢĖ/æģ<ēæųĮĮĮĪsø÷Ž{yļ½÷œ½[śõėĒŠ”CźlwEEEĻ;..®YõƒŸŽ¾cV«•Y³f@qq1ééé,XPłö¤ŠŠ ŗwļƒŻnēłēŸ§ØØˆĀĀB,XĄĶ7ßL÷īŻłć’ȋ/¾Čäɓē?~œµk×2vģX ĆpžÓ½{wśōéƂ °X, 8°Zļ˜&ptŒp,uĶ%R×h’V]Ҳ©uĮõ}BT+€wÕāų~€ÕO_—Å»ębšę3­Ł09?LÓlp»¾}īŗö•—p’C®6©j]”ČÕ×VÓČ;IIq!’]¶Œéwüīü°šo¦qœćIķ7Óø† V—ņ-5ī%"""""""­Ē¬ćgĶļņu½hÅNõ€£”𣮷Ļ8Źs½ēYkĶ@Ä1?ˆk b©qNĶÉP¼©&Õ|xVŖ÷q„Ž0ĊB‘ó„®”+5{‰˜TD\Ǝś†ČŲ\Ī­łŽĘ&Wm¶ÖD\ēq„"®½<Øcæk#j6ĘńŠÆču ™±Pū-5 ½­F!‰ˆˆˆˆˆˆHė0Ų_3qĶj¾pÅŃ;¤fā€ŌģRW/”³EZó-3P{،ėxź?jö"©łš\'f…†Ć… """""""ēžYĒzC”ˆė\!®CdŹų黿ć<×ėj–×jZ{Č T2Sóœšćź{?õ q̵ƒ†zˆˆˆˆˆˆˆˆČ¹Só{~Ķ7ŹÖģ%ā:dʵ‡ˆk× S#Hj†!n2S³g‡ė>GE­T-NĶsźź!āQÕh×·Ź@õ`„zŹ‘s«¾Ž5‡ĻTøüt}ی#±×Ų®ł¦š¦„!- HZk‘š½C\+l„śl°5+[Wļ~ U\ē½MFDDDDDDäBQW0R×$«u½~×uŸkāčb§ö0œśīŪl­9‡ˆk0ā|ø†!V—ók¾…ĘõAYłé 3uĶŅŌ0D”‰ˆˆˆˆˆˆHĖ5'xØk.‘ŗ&Wu Fū źīR×\¤­¢µ'U­Y9×#ŽpƱĻõüšo¦ńą§ÉT›3D”‡ˆˆˆˆˆˆČłŃ”!+õõq D Bźz3m«!gˆŌģb”ī^"ŽY«~zŌń°\R]½CZŅKDDDDDDDDĪ†ĒŠ—ŗz‹Ų©=‰j]aHĶū“J‘s1dĘQ×uW®sķā„Ō CźšLõl*"""""""g×ū¢”¢”ך6§WHCo­m±³ DźzŪLĶcfū\ß@涀\'P­+”žū)Ü9æ>ć:ŸhĶP¤ędLCšs’&kķ9Dź Aźā?j¾¦×RĒ ÷ Q"""""""rž56ŸHĶ`£ęˆ‘ĘBś~¶ŠÖ  ), ü¬/üØ/ ©ÆĪ EDDDDDDDγ ūė 4šŅ¤)s…œu8ҚABcĮ…„ ?ϦGˆB‘sÆ9ĆXź EhĀĻĘŹ<+­"4„÷†„‘õĘ&NUš!""""""raj(¼hīcšņŠß;įBszp4µWÉł¬æˆˆˆˆˆˆˆ4McEKz{4e8ĪY;WĀŁ ADDDDDDD.>M ,Zv“jāp®Ć…ę”ß’ŗ(qŸ–„M½ęœ!ē3P8Wo“÷kćœ† ®Ü.(ŲißĪ[RӅJ\čõ‘ś¹-š9Ožéžt"‰Ā4%tEXtdate:create2013-09-04T19:29:56+04:00SĀöI%tEXtdate:modify2013-09-04T19:29:56+04:00"ŸNõIEND®B`‚apache-couchdb-1.6.0/share/doc/build/html/_images/intro-tour-07.png0000644000175000001440000020306112332105522024712 0ustar00djcusers00000000000000‰PNG  IHDRD8cµ<£gAMA± üa cHRMz&€„ś€ču0ź`:˜pœŗQ<bKGDłC» pHYsÄÄ•+€IDATxŚģŻw\SW’šOĀ 3,Eā{ ą^ø­ÖеĆNqŌÖ§ZµµµómÕ•¶öiµCŚŚŚV«X«­«‚{€¢Ø8”Ø (aļ›ß1ׄĻūõŹ‹äŽsν Iī7ē|@DDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDdS7 ‘·ˆˆˆˆˆˆˆōSšŗś˜2ąĄ`QÓf²€I}%ŒQƒ(DDDDDDD Wmõ ©ėCuŹÆI[ !""""""2š0 ݧNƒ#uPØŖ\IķKDDDDDDD¦SUCYƒżź$0RĮI5–KŖłø>ŚODDDDDDD†«n0CYõ†ÖSmĘ(T7č!©d™”å™ś˜‰ˆˆˆˆˆˆĢE]äQźXWŁ2CŹŖ5c ķķQŁßšHźāXˆˆˆˆˆˆˆH·źōQVņWßŗŹīWUæĮŒDØN/ņĶō<®¬½ „ÕæŖ†¶č ‚”æÕ TV·Į,pjŚDó&Õ³\_•ÕODDDDDDDõ£²@Eł ‡ķ@ˆPn›Źź”ŪNbĄ~•2F@DSu‚ ši¹ūś#@å½QˆˆˆˆˆˆˆØ~’/¤|šCŠø/AÅ ‰ę~=¢¶‘š)±Šø_>8æ†ę1d=U͐œ!ś¦–†”įAPD#Š\ÆÆ]A‘ZHŒŻCDM_0DW DóV>8RŻ|"DDDDDDDT’t •Qß4ƒ ŅūĖ }]Æ^§QjlcŌ)wŚD ™>Wófķ`ˆf@ÄR㯾 Põš"""""""Ŗ;U%RUß×좾©!%P]Ļ—•+C‘B;(¢fŌ^"uŃC¤²d©šĮĶ ˆe¹Ē†ö©¬ DDDDDDDd†ō •QBŌ×ų€žėv”’õFķ%bĢ€HłžšĮŒņłA4{†ØoVØ:(T/0BDDDDDDDuG×,3ŗz‡”Žæ•æĪ׼ƚ”•+K3 «®:k¤¦}ĆVt/ŹCŌĮĶ€ˆD,Ėm£AŅ•\U×c"""""""Ŗ;ś¦ŪÕQ:Ź_ćkĘŌū åŹTē‘B{šZ›©ė"źVēѼi@¬P1(R>ÉŖęÉb/"""""""Ó+?ˌ ń·|@¤¤Ü~š@ՃDó:_½Ÿ:0qź]cD¤åī—ŸNW³·Gła2ŗnå"šSš–OÖŖ‰""""""¢ŗWivՁ õM­ü( TA‘ņåŖg Q—«™tµĘŒŻCDWŽ͜ ŗņ†č»iQ¤Š¤UWPD³=DDDDDDDT{•Ķ.SžV¾wˆ: ”9\FS1*æĘW–[ß zˆčš·|0DW ¤|0Äz†č ˆhF€ŠĶö‘q)õ,+QoŃģ!¢ £+ēØzY)*Ž)_‡f@¤Ö V=ķ®fB_®õ}kæVĖĻ6S~ųfĄ…9EˆˆˆˆˆˆˆźfB3_Hłž!šÓķZBš°€*HłkzĶėżņCfŹßŒ¦&‰žeźåš½:Ź÷±FÕ¹C4"ś‚"ś†ŃQŻŃ7›Lł€ˆfžĶévĖwt°Ąƒ`IłYgtõ<Ń7l¦ŚCiŒCD_ėr+A6±-DDDDDDF“˜˜øwļž©›BŌčI$’©x7¤|nõ}Ķ`ˆf£õ1F@D3‚£é©*_Hł™?Tģ1¢9źC³·I™ŽmŌq‡2ėÓÉXõ_õŲ}Ćf¬5nå‡Č‘ł³AÅŁcÕÉTĖ'cUĒ4ƒ#µžrØūiw5ó€čėĀ€QÓ”%R~¢Ķü#ź`Hł8ƒ:H­‡Ī+Q>R¾‡ˆf`¤ü¬3 ˆ5Ö÷5s…hBŌ±„ņĆjj=TFĶX©ŽĒš7Ķ€ˆ®)x!""""""j4cź@ˆ%TĶ4š7MF6#­mØ8Ż­Tc¹® ˆ®ū ˆ5 –x+ŠU¢+¢9‰‹&‰A5UĀ]å•OŒR~8śÕĪ€QÓ 9ŠDZī¾®ŁgōEj„¶…I*Y®™%¶üiö±€ń3DDDDDDDŌ0ięQĒŹ2tOÉ«©V½DŒˆčł«)’WóąĀĀĀƒƼyóš’÷ ÅĖ/æŒ~żśA"©ušZ™7o¦L™bŅ6T‡££c½Õ]«sćęę†ččhiŻoČ iēģŁ³±{÷nS7•ˆˆˆˆˆČ˜Źw’“;Vhv°(ß;ÄhöµŖ"ѳL3zSž¾śĄŹGŒ±°°ĄōéÓŃŗuk>|’ż7$ üüü0qāDtźŌ ?żōĮ(SWŪ?’üƒ‚‚“Ō]2™ 2™ ·oß6uSˆˆˆˆˆˆČ|”ļ ¢#@lA_¢FSšsŚŻņ÷%znå{ˆčŹ[#Ɔ C»vķšĶ7ß 11Q\~åŹ$%%aŚ“i8p :d¤Ć®ž+W®˜¤Žšŗ}ū6ÄūDDDDDDDF .£k4‰® ;īP+u•Ģ“|äʐĄH­ 0ēĪÓ †ØÅĒĒ#11 Ą”C‡šŹ+ÆąŽ½{Ų°aƒøĶ³Ļ> WWW|žłēH$1bįää„ģģlœ-_¾čÓ§ `oo_i™óęĶĆĶ›7ńĒØNJu¼ūī»8|ų0öļß读7žxā lŚ“ 111€”C‡bȐ!ųšĆė䉼{÷.¼½½Ō}PÄŅŅĖ–-ĆŠ”Cqūöm¼’žū8}ś4@*•bƌxä‘GЬY3ܾ}Xæ~½ų|čcee…—^z ćʍƒ››īŻ»‡}ūöa͚5(**ҹĻīŻ»ń믿āūļæŒ?’÷’‡„K—būöķ€ēž{Ļ>ū,ʎkP'NœĄŠ+Œģģl,Y²D«N777¼óĪ;čׯ °sēNÖé9'"""""Ŗ‰7n ==999šņņBėÖ­aeeečīRčN  T vT–CD½¾F=DjˆTńX³įśf)?6ØĘÜÜÜąččˆK—.éŻ&>>nnnpqqĮ„K—ЦM1ƈD"AŪ¶m5j† †žł+V¬ĄĪ;1lŲ0Œ9R,Ƭ¬ Ä„K—°oß¾*Ė,ÆŖ:’’’Ä`“nŻ÷īŻƒøĢĒĒGgČXŅÓÓŽŽŽhÖ¬YÕS¦LAdd$BBBp÷ī]¼ńĘāŗ^xÓ¦MƗ_~‰ &ą³Ļ>CHH^xį…*Ė]¼x1&OžŒO?ż&LĄ‡~ˆqćĘįŻwßջϩS§ŠµkWń±ææ?n޼‰īŻ»‹Ėŗwļ.¦ ©£““O>ł$>Œoæż¶B’÷’‡Ž;bΜ9xę™g““ƒąąą:=ēDDDDDDÕQRR‚ųųxÄĒĒ#''%%%HNNFBBBuŠŃÕ+D_‘ņōNŖ­¦I%÷u5Z×IQłAV‹:hVV–Žm233Åm/_¾ {{{ń"æeĖ–°³³Ćŋamm!C†ąąĮƒ8sę rrr‡Ć‡cŠ AJU§MdggcĻž=HNN®“Ģņ ©#11­Zµ÷ńõõEttt…€ČÕ«Wk{śō*((@NN€ŗŠœ;w»wļFBBžžūo“k×R©vvvxę™g°aĆģŚµ wļŽÅ¾}ū°qćFL:śSŠ8;;cāĉų駟°’~ܽ{‡Ę?ü€±cĒĀÅÅEē~§NB—.]ÄĒ={öĶmŪŠ­[7qY÷īŻmpeeeČČČĄŚµk«UŸ‡‡śõė‡oæżgĻžEzz:¾łę¤„„ÕŁł&"""""ŖŽ‚‚\¼x7nÜ4kÖ ^^^T=Fāāā Ķ›©«£„”7]jSØĖénu5XW D #DŹŹŹØ Um£T*‘’’‚‚‚“k׊®];äęę"55īīī°¶¶®hHLL„L&ƒ‡‡‡ø,55U¼_Y™åRGRRœœœąģģ ™Lwwwœ8q͚5ƒµµ5är9œœœź“‡( ń~]E4#й¹¹b0ÄŪŪvvv8yņ¤Öö111prrBėÖ­õ–Ł”CXXXąĢ™3ZĖ/\ø©TŠöķŪėÜļŌ©Sššš@³fĶąččlŻŗmŪ¶…<==įįįčččjÕqžüyõµiÓ*ōpŅ·=Q}*))A\\œ8ŠĄ××ķŪ·GūöķÅ Hzz:āććQRRbH‘ś’¦ÖŪō°u•CDׁź:p£uuÉĪνæų€\. źE"жm[9rķŚµĆ„K— T*ÅŽ&³gĻÖYŽƒƒƒų"Ќ~UVfy†Ō‘˜˜ˆüü|“jÕ „„„HKKCnn.222ąķķ {{{dgg###ĆØO–©čŹē!‘HąīīX·nĪżÜÜÜōö ²··šąõ”¦~loo‘#Gā£>×-^¼’žū/²²²ŠµkWįźÕ«øwļRRRŠ„KøøøąĪ;øvķڶm[ej¹¹¹•¶³|Ī}Ū՗ģģl\¼xQ¼Ęéܹ³Q?–ÉdHIIĮ½{÷pāÄ ōīŻ2™L_‘’jŽÆu1ĖLłåśf Ń·Mdee!##]»vÕ;‹L‡pūömńI¼tézč!XXX M›6Ų“i€ęß}÷n޼Y”œŹ]ź+³‹„„œ?ŻŗuĆsĻ=‡­[·Vę¢éŌ©S˜>}:lmm±téRŖ€ČK/½{{{±‡HmźPKKKCll,fĻž[·nįĪ;˜|x…„;wīDAA&L˜'''āźÕ«Ų¾}{•ķŠWfy†ŌqóęMXXX ØØ÷īŻ JTcccƒüü|ܽ{ט§°777“CԐ““ƒ  Y³fČÉÉAtt4>żōÓ*÷żōÓO‘““ƒ7ß|nnnøsē6mڤ7'‰ŚåĖ—aee…üü|qXÓÕ«Wagg‡ģģl\æ~½Öuhz÷Żwńī»ļ",, Ų±c6n܈Y³f™ōÜQÓ5lŲ°jļćźźZ“Ŗ é)bT5© |TĘRćf Ą€-;›ś±z½ę- ąŗ>XŖõl2¦†™šŗg¶śGJ"Ŗ9‰D @‘Ęß"ł äiüUßWo[  TćJ›Įźk–j„ “‚Y§×Ч®’ŖVvu2\†ŒĮ""""""2Wõ!"""""""2D½už`@„ˆˆˆˆˆˆˆšDˆˆˆˆˆˆˆØÉa@„ˆˆˆˆˆˆˆšDˆˆˆˆˆˆˆØÉa@„ˆˆˆˆˆˆˆšKS7€ˆˆˆˆˆˆ*Wzī”YYUn'qv†e·.&©»:¬ŗvär£–Ym JĪĒ›¶ @ƒx.L„"""""¢.ļĶ÷Pzčp•ŪYēæž0IŻq–Ćįa ć\.‡Õ (=we)×Pw„qēP²ćoS·¬^9ķŲ «ALŻ “`@„ˆˆˆˆˆˆźœõÓSįø,“aC4Xvė¢źU3aą^¾P^»fźfQ=h0‘ččhS7ˆˆˆˆˆj@©TVśXß2Sķ[”—…Ó§bpęō)ƒ±gÆŽčÕ; ®N”Y“ųųĄń«ĻM/»7_CŽ曺TL@„ˆˆˆˆˆØ>؃! ægš>a½>f‚©›ßØŲĢ™ ‡ÅÆ6ø^!•±?yĪr Kaź¦Pc@„ˆˆˆˆˆšu0D‘‘fš>O>õ~Ūø‘I»w‡ćWŸ=Įk½Ėaóō(śj©[BuŒÓī‘ŃČŽ|.÷4Ī`Č}v’™mź&P=`"""""¢FŹŗ¤V„Åāc‹Ā\£×aW˜‹²‚ģ*·³2뿃Ի•©OK­I½[ĮmųīÜeź¦MžĢÉŌMhp!"""""j¤,„2Ų‚ `Ė–-¦nzĆ<ū, ųśšŗ5Ś ”Ę,"łłłˆ‰‰Į;w‘‘pww‡‡‡`gggź&’|ވĢ/I’djŠŒ“ļ»ü£OšŃ'+M}fćĻ?’¬Öö?ü°©›Üp5ä ˆ¦É“ ”Åģ"D|||…åČČČ@||<:wīŒ!C†˜ŗ©¤Aż¼Éd2XYYĮÅÅP\\Œääd>oŌ$:t?żō“ųųż÷ßG³fĶLŻ,"“Z¹r%®^½ŠU«VĮÖÖ€ź³āÕW_E›6m0qāD¬\¹Ļ=÷lźęR%w÷¬ö>įßSćś._¾ŒmŪ¶įʍ(--…‡‡F…AƒU»c½¾Y™†“{wŲ>żl~šneźęfž|U^“†($˜4 ųąmš³ ˆlٲEģY2™ ööö€¼¼<āććqēĪ<śč£¦n2įĮó&“É •JįććwwwŖ@Ö„K— “Éų¼Q“Ó±cG̘1GŽĮŋM֎/¾ųīīīxź©§L}JˆˆĖ—/#>>½zõ\¼x%%%€/^ S7•øŚō©Ž¼¼<¬Y³Ķ›7Ē /¼‰D‚]»vįĻ?’D—.]ąāāb’÷YžÆ4NšAic ‚h ,h8‰^€¹sUķROOLŸDD˜ŗuTĢ& ršąA­`ŲŪŪ£OŸ>€“'OŠ@u”}šąAö801ĶēĶŹŹ :t€——NŸ>’’ōčщDĀēšxxx !!A ˆœ={_~ł%f͚…>}ś`÷īŻųć?šöŪoĆŚŚ”””Ęłóē‘œœ Œ7ėÖ­Cvv6ʏ1cĘ 11}ōʎ‹sēĪįŽ½{>|8&Mš¤Õ†wß}wīܤ¤¤ąĶ7ßÄåĖ—±iÓ&¤§§ĆĆƏ>ś(ŗvķŠŪ·oć½÷ŽĆčŃ£ńŲcé<¦””?~ÄŽ`=zō€«««©Ow¤„„įĄx蔇pļŽ=³:¶†ŖwļŽųõ×_qīÜ91 rīÜ9H„RōīŻ×®]ÓśÕ;!!›7oʍ7 —Ėńä“O¢[·nxć7Š„K„„„ ¤¤ ,€R©DXX¬­­ńć?āüłóxķµ×Ŗ|]«yzz"==]|ܼys¤„ÕĻE·©DFFbųšįHJJ‚oCī¦oBiii(**BĻž=ѵkW@—.]ÄõŗŽg<ˆ]»vA”PĄŻŻO<ń„Ö>jś^ߚŽ’}äååaŊ€·Žz öööxā‰'Œśæ²bÅ DEEaĻž=P(Ėå3f 泑ó†ļ\“7f«Wš®†\®ź 2¾īįEr9°u+ ,]j²ÓDõĆ,¦ŻĶĻĻ×9L¦¬¬ NNNprrBYYY…õńńńČĻĻÆ°<%%/¾ų¢Ö8ēĻ?’)))FmwJJ ęĪ‹„K—āķ·ßĘ_|”õEŹÜ•ŽŹŹŹąåå¹\[[[8::ĀÓÓ^^^°¶¶·Ó÷¼ĄńćDZlŁ2|ōŃGXŗt)vķŚU§Ēpüųq&÷¢ĆĀĀ…   “oß'OžÄO?ż„)S¦ĄĶĶ ČĖĖ·ŽŽĘ3Ļ<???ģܹ©©©Ze.X°0pą@¼üņĖČŹŹĀ_|{{{¼žśėpuuÅW_}…ĢĢĢjµuģŲ±>|8¬­­©°nˆJJJ°e˙ݱ56ŽŽŽčŲ±#Ī;'.;wīüüüąä䤵mNN¾ųā 8;;cٲečŃ£Ö­[‡üü|tźŌIüœæ|ł2¬­­!“ÉpåŹŖ ĶN:U«m§OŸĘ©S§Ø¾7œ>}ŚŌ§«Ī 6 %%% †TĀÓÓ666ųēŸšĖ/æąōéÓZßcŹæĻŽ¾}Ū¶mC×®]ńĮĄĮĮß|ó AŠ*·²×·¦.]ŗ 33YYYČĢĢĽ{÷*MŒńæróęMlÜøƒĘūļæ`ėÖ­b°‡ŒĄ‚!j›7×’ń«™™Ŗ LUļ[””ĄśõęuŽ©³ˆÄč‰.–””@”P@”P ¤¤¤Zū¶lŁ;wī¬ó¶7oŽK–,Į²eĖŠ§O¬Y³Fgš¦”())Į'Ÿ|b”²ŹŸ{uŠC©T¢’žčßæ?”J„8F¼²}U—ŌM›6ažüłX¼x1/^Œ3gĪąöķŪuv>śõė‡G}ŌØē…Ø¶ŗuė†ĄĄ@ 6 €źõž={bĄ€(++ÓśrˆvķŚ!((€źĖ®&GGGŖ’OGGGÄĘĘ¢øø£F‚··7FŒ’’œ9s͚5ĆŚµk«ülmm!—ĖŃ·o_(•J\æ~J„§NĀ¶mŪ°mŪ6œo‰¤ZēS&“į?ž]Wį,((ĻKjj*&L˜ ~ĮKHHĄüÅ‹ן|ŹŁŁÄ’#łż_6ŌKKKaee„µ­ƒƒU`±2 …Ąƒ@‰z欬¬µÕŅŅ666ČĻĻGRRńŠCA"‘ąļæ’†««+¬¬¬péŅ%Œ7666ųūļæ‘KKŻa‰€ź3!00Ē‡\.ǰaưoß>¤„„”““‰‰‰xųį‡aii‰]»v!%%VVVP*•°¶¶·æuėśöķ+Ńģ±f豑qõźÕ æüņ‹8TF=\¦<õėņóĻ?×Z~ļŽ=1™åÕ«WžżūCDGG£]»v`” õŸ~ś ß|ó ’““įąą€īŻ»ćēŸ†««+”J%¼¼¼°vķZ<÷Üsš÷÷ĒŽ½{ŃæģŽ½–––P*•čÓ§fĻž:`żśõpttÄ·ß~‹ųųxXXX cĒŽ {iŲŲŲ`Ó¦MšššĄO?ż„-ZąÄ‰8p ¦OŸ.ž’«·Ūæ?Žzė-‚€’żóēĻ×:†÷ß½zõĀŽ½{1jŌ(lß¾ĒĒłóēqóęĶ*õÉ'ŸÄ–-[0oŽ<üšĆ˜4i~žłgĢ™3›6mĀ“O>iŅ×Sę[:ƒ™wn­Ž¶mŪbįĀ…(**BBBvī܉ }ūöš÷÷׌¶°°?żō“ųüŖŌ+’ƒYeÆoMķŪ·‡••’’’P\\ ;;;“iÓ •e蒊³³3¦L™‚]»vį›oT h»uė†Y³fĮĘʦŸAj“ź*Ÿˆ\®*{ī\U@¤¶€Ó§U3ä4Ō„°TcfQē Pē qrrBaa!lmmamm kkk<ņČ#ā²ģģl1§Hł¼#jJ„ćʍĆĪ;ńŅK/‰Ė/^¼ˆ““4ńĖĀ7ß|ƒ³gĻ¢{÷īų믿Ø>°²²² ŹŹŹ`aasēĪ4UX«V­žžŽųųx\¹r‹-¬Zµ ēĪƒ\.GTTŽzė-XZZbóę͈ŒŒ„§§īléR©éééx÷Żw±eĖDGGcžüłųśėÆqåŹX[[ė<™L†„„¼’žū°··ĒņåĖ‘œœŒqćĘ!--­ÖĮĶēM­¬¬ —.]‚ųkĀ;wpįĀXZZjõņŃõ¼¹øø`Ĉ EĒŽŃ„KōīŻ2™LļóęęęV­óiaa«WÆā7Ž€··7:ZēåŌ©SŲææųEśČ‘#ā/õD†Ų“iNœ8÷ß¶¶¶ā0 {{{1PXX ę5uĄQżWąŠG\ÉĪĪÖś«žŖŗJJJPXX™L†¬¬,ŲŁŁ‰É°e2²³³aaa!£ ę9ŃÖØ„jjŃ¢…ų¾įéé 777H$”––ŠļŃūöķ·ĻĻĻD­Zµ‚µµ5¤R)JJJÄ Čš—½½=:wīŒųųxH„RtģŲQēkWżz}łå—µ‚J„hÖ¬Ο?ŌŌTtźŌ ‚ `Ė–-8ž<š7o.ī_ēϟGqq1  .KIIsˌ?^ü?7nśõė dgg‹õ>NNNhٲ%RRR T*įććƒ6mŚP½^ćććŀȬY³ąķķćĒćÅ_„µµµųV’ĻjnēīīŽyóęaÓ¦Møvķžxā ­cčŁ³'{ģ1¼óĪ;1bŽ~ūm̘1:tŠ ˆč;Ö©S§bŊ8tčΟ?­[·ĀĻĻĒŽƁÄŽ"¦T>(bĢ`ˆ&tķŚUünU>x{öģAtt4^{ķ5tčŠæ’ž»Ö{•ZeÆoMźmÉÉÉ(((@—.] •J .ĖŠ’„R‰Ń£GcŌØQøu뢣£±sēNDGGW{6jBVÆbchVĶbüvŹåĄžżŖd«įįõy†ØŽ™E@D]Ć,Ŗ«uėÖ())Ńś°OLLDJJ VÆ^-.SGŪŻŻŻ‘ššŠœœ“mŪ‚ !!pww‡]•uJ„R(•J$%%”C‡ā/ķŪ·GJJ 222ąēē'^©»šž={Vo™^^^H$ptt÷sttDAARSSuL&ƒ···xaāźźŠ¼¼<£œW}Ō_Ņ®\¹"Žærå ņóó ƒ?qāDŒ1.\Ą™3gÅ‹ė}ŽŖ}>]]]įķķ­w½ææ?6oތ»wļĀŃŃ—.]{ĀĆĆŁŁŁ‡ŸŸbccįćć{{{qŚŻ#GŽĄĮĮgΜ ; `ˆ“'OĀßßQQQP!g‚„„%$ nÜøŪ·o£WÆ^Ų¼y3öķŪ¹\Ž={öĄĘĘžžž%UU+,,Daa!Ο?/Ī.uėÖ-$&&"??J„łłłĖåJ„(,,&{öģœ”T*q÷ī]­‹<]Ōļ„jĪĪΐJ„>|øVĄāʍ:·W+))©ņ—N]ĒFĘˆŸžR©TģAY^·nŻ`ccƒżū÷ĆŻŻ§NĀž={°pįBųśś¢S§N8vģģķķįåå°³³ĆńćĒŝÕy]ėҵkWXYY!22­Z=˜Bż#ŠT*_oå/RÕ:„=ząĘhŪ¶-ģģģ°nŻ:\»v eeeø~żŗ˜„€üųņĖ/QTT„ččh¬[·GŽAiii…ķär9&Nœˆ>ųC† AĖ–-+“aéŅ„čÖ­fΜ‰«WÆźĢŃ„ļXÕ{ĖK/½„Gy^^^?~źēMSvv6Å_æõ]čč{ފ‹‹ÅžB}śōĮ† Ä|#ŗŽ322²Śē³Ŗ‹!©TŠ!C†ąąĮƒšōōD@@€Ž®żDŗ 6 8~ü8.\ø€¶mۊA5wwwŒ;QQQŲµk‚‚‚°iÓ&­‹œźčڵ+ĀĆƑ••…ąą`1’š……† ‚£Gbćʍ˜?>ęĪ‹M›6į“O>AóęĶ1wī\±gž”vķŚ©T  :2™ mŚ“B”Ąž={Øŗ˜«æŌgffŠAOOOtźŌ J„®®®ˆŒŒD—.] ‘H B…÷.]Z·n{÷ī‰u9::ŠŸŗ8;;C&“aß¾}3fL„_šuŸææ?6lŲ€’’½Ÿ±NNNxłå—ńĒ`ٲeb—~õėŖS§N8pąÅ÷ż:ˆyŒįŁgŸEtt4śōé„R‰:`ķŚµÕ*c×®]xžłē1xš`„„„ĄŽŽ§OŸó¦Ģš5 !!!āėYmźŌ©Ų»w/<<<šŹ+Æ`ҤI˜={6Ö­[W”Žēž{“&MŅŪ[£sēĪxę™gŽÅ‹ė šč;ÖĪ;cźŌ©xļ½÷°|łrĄ3Ļ<ƒG}T| Øž·_zé%„††ŠĆŁ"""°hŃ"qq]«‹ž!żśõĆŻ»wqņäI=zh޼9f͚%9Ń|Ÿ}öŁgqłņel޼­[·Ęžó„‡‡ć—_~AˆĘ/ßU½¾5uéŅ›6m‚D"gŗŃdŒ’•=z _æ~Ų°aņņņąää„ &ˆ³AQE%‡"{Āä Ėmę̆Ćņ’3uóźzV—įĆ ß>8˜6M5En} ŗwFŖY§Ņõ:ŌĒiĒVX `šö ¤†ūH4öµŌøY°` @Ą€żżūźĒ¶ŪØ··Q*•oŽmŌ9ˌ—— @õėŠś—?M;w®0XJJ ¶oߎ¹sēP WÉÉÉAHH ±qćF¼óĪ;°²²Ā7ß|ƒ & eĖ–ČĪĪĘŗuėPTT$ŽÅżä“O`aa’üē?ŗó¦¤¤ąĒÄ{ļ½@5cÉ_ż…%K– !!žł'^żuĄŹ•+1aĀ8::bķŚµx÷Żwaccƒ;v ““ŻŗuƦM›šę›o"//ļ½÷^zé%äęęāģŁ³ ĮīŻ»QTT„‰'āēŸFūöķ!—ĖuOnn.žłē¼ņŹ+€µk×bĄ€šššĄ·ß~+¶¹6ō=oź‹ˆ .ąŽ½{’ˆé{ŽNŸ>žłƾś*lllPZZŠĻ>ū AAApppŠyœ‚ Tė|:88 <<oæż¶ųŗŗ~ż:‚‚‚“ĪKNN>žųc8;;#$$¤ŹĄQ}KIIĮ²eĖšÄO`äȑuZ×ŗuė0{ölS25‰‰‰hŪ¶­©›QkõńŗŽˆˆĄäɓ‘™™i”į;ś‚€ļ¾ū .DJJ ÜÜÜźōøLM‘‘¹»'՛9āĻķˆæˆ>Yi6Æcc*’“®œ4—Mž<žłgµźxųį‡+ĢīWŻzÕÖ~ž)ę½ŗ‚ @( eJįĮ}A(»æNu_©Tā·±`qķæś"²7_‡Ż›Æ„ŽF„Ŗinƒ‚TAąą†1óKr2šŲc¦›>øī:7ÆuĘ ˆH$’0…ŠīßŌ÷óļßĻPp’±ś¾z»b„7PjÜ f?[č¼°ÖLd§/©]€‰vʍ‡Ļ>ū ÄÄe«V­‚D"ŸŸŸų+‰z˜G³fĶÄ$oĪĪĪ(..Ö;.?==K—.EYY\]]ńŹ+ÆĄŅŅ:uĀŋ±råJŖ!3ź1£GĘŹ•+aaa'''„„„ĄĘĘ2™ Ė–-ƒ§§'ڵkWaz6]ōOł™&ŌÜÜÜPRR‚ÆæžZ+·Š1Ÿ7@ÕÓ£}ūöˆŌ3žP×óÖ«W/Üŗu +V¬€••ŹŹŹąļļ/n«ļy3Ęł,^Ѿ}{dggkC¶oߎ¢¢"<öŲcsęĢĮW_}©TŠ-[¶ĄŹŹ 'N¬Õy%""ŖŽŠŠP¬^½aaaf !¢,4ˆŠŅĪ'āė« ‚„„4¼™^|}U3Š,\ȼ"˜Yōt÷6pwwGŸ>}ØĘɗž”«—Õ/]Ļ›››zöģ‰Ó§O£°°°BžĘš¼©{§‹Ża‰š*ö!MęņĖ:_׍—"# nÆŃ¾ģ!¢_u{jW2żieĆ“ŁCÄĢ)Ŗ|"ź©Õ&×TĀĀT‘Ž=D*2‹"€jģå;w“‚źœ"źūšÜŻŻüEuS ėyĖĻĻĒŃ£G B0¤1śØVƒ‚‚³“4†M‰®ēM—Ęņ¼5 £F2u3ˆĶ)r‰ˆLé£OVšŗ DdŽ‚ƒooąÅU^‘¦Ī¬"€ŖĒA@@bbb“zø»»ĆĆĆMKõ‹Ļ‘łā°2W ō‘–€U^‘É“µs”Ō±ė6ø"sĮÅõJ·³/Č6°D OęToķ7%³ ˆŖyŃCOŅĘēˆˆ śˆØĮXøˆÕ¹ź–•Üæł¬Z·6u+›¹Ųæ_õ¼„…ÕiU™–6ˆ·sE”Ō°ĖzŪāƒ¶!"""""¢†.6Voo„B['Ľü:z’õ»©[Łō¬^ ōģ© ŒŌA^‘$['$Ł:›ś(=©©@DDDDDDuCqų®õ©›Ń4…„؆ŠČåF+2ÓŅGœZ0b$ ˆ™±¤«Q’’bźf4M@R’źo-%Ł:į“C3ƒ‡ČPÕĢņL* \øpiiiøsēĄĆĆžžžčŅ„ äFŒŠ‘yČĻĻgBW""""jųbb€ø8Uļ•fgsčŒ)Éå@t“jZŽššjļ^Ż\!Ę Ź H-źļ™ˆŁDŽ9‚øøø Ėļܹƒ;wī ..Ż»wĒĄMŻTj 4§üՔ‘‘ŒŒ ÄĒĒ7š)‰ˆˆˆČĢåäØ.¬ĻœQå©0zčŒ÷œ™¦>‚¦kżśyE tĮĪiÖö¦n¹Ł2«!3[¶lŃ )/..[¶l1us©Ų²e‹Ī`Hyńńń|ĶQĆÉÉļĀ”3ŻŁ± Gz DNÜłś©pĮÕ,4UŒZPē a0¤n™M@äȑ#āšCܹsGŽ1u³É„<ˆŒŒ Čd2ø»»ĆŻŻ2™L\_~yFF°¶¶Ö xČd2 4ÅÅÅ8yņ$ Æ3§HJJ >łäxxx ØØ-Z“ĄO<ęĶ›ėmĆ”C‡Œz¾kŅCÄĒĒcß¾}˜;wn]=DDDDTO8tøžÕwHZ±„ŁŁZĖć_~ 9qēŃayhŻ7Ā×W5ĶĀ…Ŗi“““qĖŚI¶Ī „Ō£†{u_ §NŅ¹,33S|œ™™©w»ņAĄ’ž÷? 2Ė—/ǻヒk×®įܹs¦>T”””ą“O>ѹ.)) ööö˜={6,--qóęĶFulõ)&&Fė±µµ5lmm1zōhøŗŗĀÕÕ£G†­­-¬­­+ŻW­yóęX²d –-[†>}ś`͚5(++«q+{®õ©njR5nMu茺Wȕ·—V†Ø„~ż=.üēU”deÕ}ƒärU^‘¤$”$'ėĆ!f*l½[™śT5fzR(–•––āäɓ>|8ąäɓ(--5hß .ĄĮĮ}ūöŲŲŲ`޼yāśˆˆ$$$@"‘ĄĒĒ?ž8¢££qźŌ)”––"55“&M±cǐ••…×_‰‰‰Ų³gģģģp÷ī]øŗŗbęĢ™(**Āwß}AP\\Œīݻ㔇8pG…T*…\.Ē“iÓ°aĆÜøqæžś+¦NŖÕn™L†ĀĀB\½z·oßÖŁ3 ²c;t萸ŻöķŪ‘˜˜AŠ¢E <łä“ČĻĻף֋/āß’… ŅÓÓįąą€¹sēāܹs8zō(^|ńEĄēŸŽqćĘ”¤¤Dē¹°“¬æ—£ęšŖ¼¼<ū ±±± Ä+ƼP*•xė­·0dČ( DEEį­·Ž‚„„%6oތČČHŒ7iii‚!€Ŗ÷Ē™3g`ee…yóęĮŹŹŖZǦvńāE¤„„ažüł€o¾łgĻžEĻž=u¶U*•"!!ļæ’>ģķķ±|łr$W2–Q*•ź=õE=µ.1ŲqčŠ! <Ī÷ßō²²²pčŠ!hD4÷­L«V­žž®÷|Vu¾5ŸėŹžCŚŠ«W/Ļ]ł×“®mąśõėųšĆįąą€°°0œ9s½{÷Ö¹żłóēagg‡9sęĪž= …B”””Q“©ŗłśŖ#!!U&ᬮ¦2t&'ī<ā’órĻ]ØÖ~¹ē.ąhAčõ×opģŽµŽŪ­/@’wŠCĒŖ}<¤›YDŒ­¬¬ ‚ č\—””„:ˆæj·oß)))hŃ¢¼¼¼ ‘Hąčč(övpttDAA¬¬¬ąćć#ęžhŪ¶-ŅŅŅPTT„ 6 °°–––(((@nn.ąēē'–óŲc€Īa0€ź‚õēŸʄ ““{{{|’ż÷˜2eŠx_Õ±©%&&"%%«5¦ń*..ÖŪVšöö†½½*²««+ņņņ*­C×¹07R©J„RļłT«j½”ŪTÖ†Źž;µŹ¶ńńńƒƒÕóuóęMtķŚUēö;vÄīŻ»±vķZt芞žžpqqĮéÓ§kt DDDDMVr²*ĒÄŅ„ŖŽ"K–µų¤«į9~¬Z·6õ‘Ö‰¤«‘ō‘įS—WšÓ? æåKÄĄ„©ˆÜdeAqč’V¬fp¤Ģ" āįᔳ§‡‹‹ zõź@54FW/ Ė<==mpżźąˆfÓŖ’Æ*•JH$>|‰/æü2ą7ŽŠŚĘPGŽĮØQ£€U«VįüłóČĢĢŌ †TēŲzõź…)S¦h-ū÷ßõ¶ÕĀĀBēńiŅ—ĖB×¶uĶŻŻ]ģé!“É “ÉÄ”2YćŒ={öxŠ“ÄŻŻŻ :’’’0f̤¦¦ź<ŸšC”t­/üҵ”mØģu¦VŁ6ŗ^Ļś¶—Ėåbnš‹/bÕŖUxśé§k| DDDDMžB„‡«n¾¾F+Ö\‡Īd:Š+o-5J  4;ń/æ†Ņ¬ģÕ›ĘŹŁĘ¢4KÕ>Ŗ³HŖŖk–KKKōéÓVVV°²²BŸ>}tęØŠµo—.]——‡På# Gtt4ڶm‹K—.A©TB©TāŹ•+f³Ńēśõė(,, ŗPõņņBAA\]]Øf½ÉĖĖCYYŚ·o . ØØ°cĒlŪ¶ ‰Dg`AC"‘ą©§žĀ—_~Y!FUǦ֮];ÄÅÅ”¤¤€jhĆĶ›7õ¶U;;;1•——‡ėׯWz.ź“f ĢŽŽ^ØšĮŠ!C†ˆ½_Źļ«ĻńćĒ‘••….]ŗč=ŸUoĶēŗŖ2Ŗjƒ¾ēN³ŽŹž_Ķē+99¹Ņ×ī™3gpõźU“nŻcĒŽÅĄqõźÕ•Siv ”:cJ²²pł­Pœžų¤Ń{M\y{).üēUSb-ž~–NN¦nF£e=Dˆ+W®h-ėŻ»7\\\ÄĒ...读·Ö“»ź}+œKK̟??’ü3žłēXZZ" ½{÷†T*Åŋ±råJŖ!3;wÖ9[My^^^ųż÷ßqēĪ899”gĻžšööĘW_}…k×®ĮĒĒƆ Ćʍ±hŃ"Œ=+W®„……œœœ ”””ąėÆæĘK/½$–=bÄ|’ż÷b°fņäÉų÷ߏƒŽķȑ#€Ž;"00«V­‚D"ŸŸZ¶l kkkm}ä‘Gto›6m “ɰlŁ2xzz¢]»vāp]ēP%-**Āc=A0gĪ|õÕWJ„Ų²e ¬¬¬0qāÄZæfÄiwC74ØīٳC† ©0¬#@Ļ|įéééXŗt)ŹŹŹąźźŠW^y–––zĻgbbb„绸øXė¹Öµ”mčׯŸĪēī•W^ėxģ±ĒtnóŠCĮŪŪæüņ 233«|톄„`Ɔ bĻkkk<÷ÜspttŌ{ õõ¼QEę0t&óŠQÄ’ēµ:M>jŠd«†š|ś1¤~ż½©›Ń(Õdœ‚Dć؂*ź›5¶dģŲßæÆ~l«±z{„Rł†įMØčȑ#ˆ‹‹«Ö>Ż»wש ńńńŲ·oęĪ[/õ5d å\ŠīŻ»W¹]÷īŻńč£ÖkŪ:wīlņ EC:>ś(:wīlP›ėū5CDDDDT.„Eč‘w#×Ń+÷6<‹ó`+”źŻ>iÅj“\ŠWWIVĪ>3 qϾ€Ņģl““”4;§'>‰[ælÜśeN=üśANÜłzoO›©“k_Hd9D4 8½{÷Ę©S§––&Ī>ćįįOOOōīŻ¶¶¶¦n&5 C† A@@bbbpēĪqöwwwxxx @œ"˜ˆˆˆˆØ1r)-‚Ki‘ųų–µīXɐaõą{niv6āß~=~žÖŌĶÕėÖ/›på­„& „”’ņkfy¹õĖ&8.7āpšČHÕ_…ˆUŻĻŹzp?9.FN¶ŪT˜]@lmm9†ŖÅĪĪŽĆaˆˆˆˆØÉhQœÅłī"ÓŅ·¬ķ”°“AĘĪŻø³c<&Œ5uµ”¤¤ īå×”8|ĢŌM©RŚ/›Ńayhåé r¤¤<˜E(6VµŽź”YDˆˆˆˆˆˆČ0å{Ü ™\¹Čå¦nąśWß!iÅźÓ+D^Z(Ž×”ęĐqČ=w”Ār}A¹F`ƒAć°,+A±ŌĀŌĶØūć4uˆˆˆˆˆˆØ‘ˆŒ¬ó!4ŽE9°Ķ½->f£žYÜļEcn©ČŠņLŻ„ŹEEÕy-õ½2Bu‰""""""2ĢĮƒu_ǰa¦>Jj"!""""""ĆÄÄŌżŌ±AA¦>Jj"!""""""ĆEFÖmłr9`꣤&€""""""2\llŻ×1dˆ©’šĪ2CDDDDDd†2-mŌĮ,-õXƆaau_O#¢~>@q’~Ō…Óćöνcźf6*. ²nŻ:S7ˆˆˆˆˆL($$ÄŌMh–6H²uČK a+”Į„“ī%°R*k^p]™’z9G :Š”ŠxؗJ-Q(5ģ²]^ZhźCit]@Feź&5 K[@šµ=ĄV(…CY1\J‹ąPVRż^$‘‘u›üŌ×WuKN6ĮŁŖ=u@#×ĀJ\vĒJ&ŽW?dZ2 ¦nÕ£ÜÜ\S7ĮlØ{dXىĖä„…p)-‚­PZu/’ŗˆŖņĆĆM}ŖDzmXˆ½6r4šē’‡F!""""""ćQXŚjõ\°J!/-‚‹8ÜF£I}å©ć€HUy9ؓü1 BDDDDDDJ-‘fm)³ō"‘: —ŗn@-z ”²’ca-9Ŗ“—ƒĢ_DDDDDDdĶ^$½…ĖąuWY¹<"ŗ†¬h÷š`oŖD4¬_æ}śōA·nŻ“–Ÿ;w'OžDļŽ½‘žžŽ1cʵŽ;wī`ūöķøwļ,,,Š£G >R©Ō ż7lŲ€ ]»v¦>…DDDDDT R”ĢŌM0Xn܅ŗ ˆøšŠd¤mÜlźC%3ev‘»wļāōéÓHJJŅ»M›6mŠ«W/ø¹¹i-ļßæ?Ž=Z! rüųq 8;w6z{AĄ/æü‚įƇ£G(..Ęoæż†Ė—/£S§N¦>DDDDDD:e: ļ93ė“Ēī]”:cv‘ņAŽźlשS'ģܹ·oßF³fĶ·oßFVV:uź„˜˜Üŗu ?ü0žż÷_\æ~‚ ĄĆĆ&LĄŁ³gqķŚ5Lœ8šŪoæA©TbźŌ©€æ’ž-Z“€æĘœŚ °³³C=ÖÖÖxī¹ēÄõ{öģĮµk×^^^7nAĄęĶ›‘••¹\ŽĀĀóMėj—D"1õÓBDDDDDfFqčX×!ÜßŌ‡If̰1ĢčŃ£!—Ėu®“Ėå=z“Īu‰żśõƉ'ÄeĒGß¾}µ‚ ‰‰‰ČČČĄ“iÓ0}śtäååįāŋčŲ±#eeeČÉÉANNŹŹTŻŽtõśČČȀ§§§Īö\½z)))˜1cf̘›7oāņåĖøxń" šĀ /ą‘GĮķŪ·+m‘±•fg#'ī|ÖįŲ½+,œL}Ød¦Ģ2 ¢T*įēē§sŸŸ”•̧€óēĻ£øøEEEøpį“¶¹vķnÜøõė×cżśõČĻĻGII lmmįźźŠ““4$''ĆĒĒŽŽŽøvķŅÓÓįāā[[ķD?‚ čmĻõė×ѦMH$H$“nŻ7oŽDzz:¼½½666b@E_»ˆˆˆˆˆˆź{‰PcfvCfŌFŒ+W®@”PˆĖär9FŒ{÷īéŻO&“”S§N8sę ”J%:uź™LVa».]ŗ`ģŲ±:—_ŗt yyyčŅ„ AĄ„K—`kk‹®]»VŲŽĆĆqqqÕ:¶ņĶĒśŚEDDDDDdlõ‘GÄešdģÜmźC%3d–=DąŽ½{1b„Ö²Ŗ‚!jżū÷Ē©S§pśōiōļ_1Łŗuk\ŗt „„„€ß’ééé€Ī;#!!)))šńńAėÖ­‘’’‚+W®čLŹŚ®];ąäɓ€ŅŅRlٲqqqšńńAbb"”J%”J%’’’ąķķ \æ~ŸŸ[·nUŁ.""""""cĖ»Pēu°‡HżkL³ՆŁöTĆcär9 är9üüü ˆ4oŽVVVāżņŚ“iƒīŻ»ćūᅦD"ÆÆÆøƒƒ”J%\]]ÅisQ\\ ;;» eYZZbŚ“iųóĻ?qąĄXZZ¢[·n茵+¤R)ńż÷ß|}}Ń®];”––āܹsX»v-\\\ąķķ „RYi»ˆˆˆˆˆˆŒ­šz*JRR`ÕŗuÕ”Ī#RšmźĆm2l‹ '3’Ü-fQ÷ٲe‹Į½CŌf̘Qa™f.‘įƇcųšį:÷5k–Ö㧟~ŗŅŗÜÜÜ0}śtėFUa™„„%žzź)ŪWÖ.""""""cĖ8|-ź0 Øz‰pŲ ›Ł™QóóóC›6mō&Y%"""""¢šĖ6n܈™3gÖĻ %"jľłęČd2ń}Z©TĀÅÅ €««kµĖūłēŸ1aĀČåņ:k³¹}¾œ:u %%%čׯ_ƒm£Z~~>~żõW̘1Ē‡••z÷ī]'u™³Āė©Hśh5’>Z ϧC—’­2zŻ»0ŁDĄĪĪ©©©Z_SSS!“ÉŒ^×SO=kkė:=ž’’ˆĒ6cƌ:­ˆČœ<ņČ#prrŸ={{öģĮ“O>iź¦UŹ>_222˜˜ˆ)S¦4Ų6źÓ§OüńĒšöö†‡‡G½ŌIDdŽŅ6nF‹§7ś0—Įśõ÷¦><2f‘J„J„(((€L&Cqq1”J%¤Ņ#ƒ®^½ŠŲŲXń×· E‹ČĢĢÄ®]»Š”C¤¤¤ ØØŻŗuC·nŻ ®’īŻ»Ųµkž~śiqYxx8¦L™„R‰;w¢{÷īørå Š±cGńØäädÄÄÄ ¬¬ nnn6lvļŽüü|DFF¢oß¾Z掄¦¦"::€ź—Ļ޽{£uėÖČĪĪÖ[ ųöŪońŌSOĮŃŃŃŌOQ½jß¾=Ž;†²²2XXXąęĶ›8qāĮżśõC‹-.\Ą¹sē`mm­•̵²÷yGGGļ喖–•Öeˆ†žłRŽ©S§Š³gOń³V_™•}öÖEõ}Š$•JѳgOœ>}cƌįg'Õ»»ĪĶVV¾Ä“—{¹qŒ‘ę}–¶F}ż4f•CD©TĀŪŪׯ_ śĀŌŖU+‚(--ÅįƇ1vģX<śč£@TT@"‘ 77ööö˜}EEEČĻĻĒ”C‡šŠCį‰'ž€R©Ä… 0`ĄČd2i•UPP€}ūö!((ĮĮĮ9r$öļߏüüüJė‘J„˜={6æŠQ“STT„ŲŲX4oŽ(,,ÄŽ½{1tčPcčŠ”Ų»w/JJJ››‹'Nąį‡Fpp0‘ŸŸ_eśŽĖ+«ĖĀ狦ŅŅR¤¦¦ĀĒĒĒ 2õ}ö»•}(ĻĒĒ©©©(++ćg'Q-d:jō2­œįŠ­‹©Ģ„Yõ€Ö­[ćŌ©S芔®_æŽīŻ»ćܹsŖƒµ“ÄóĻ?/nŪ¢E dggC©TP}©ōóó888 yóęHKKÓźr­¶qćF­1Žżū÷‡››[„mS*•čŲ±£X¾L&C^^222ЬY3ŲŁŁFøwļžĪrnÜø777q,»““ÜŻŻqóęM4oŽ\o=666¦~zˆˆźĶŸž ‰D„R‰üü|téŅcĒŽ zuwwó‰øŗŗB.—ćęĶ›(**ŅzOöóóƁŖ¬/55Uē{łÕ«WõÖÕŗuė å4öĻ—œœŲŲ؈Ė*+ÓŻŻ]ļgÆ»»»QŪčźźZéwM¶¶¶°¶¶Fvv6\\\jó2$"ŅĖĀDz7_ÆÓ:¼$43į1ZźøŽ2†Žo.Dń¹ó&<²†K¦ćs͘,|¼k_HbvWWW( ‚€ĢĢĢ Éó¢££qóęMXXXˆ_‚Ō­­­µ†×X[[WųåKM×ļ»wļVŚ6KKK­ņÕuVk¼xAAlmmµ–ŁŚŚŠc­õÕCDŌ”hę‰ˆˆ€›››ųŽYPP€Ū·oć?žŠŚ§¬¬ EEEZų‰Ä ÷h}ļå•Õ„Kc’|)**ŅŖ³Ŗ2«óŁ[Ū6Vö <|ŖKźŻ vo¾V§uŲ™ś ėˆó„±Ą„±¦n™³ ˆŖ_}āćć+üŗ”˜˜ˆ””Lš4 –––ČĻĻdž Äõźœ#ź_ꊋ‹+|验ę/z JKK«ÜĻÖÖ………×#“É*l_XX(žHDDŚś÷ļŻ»w£]»v°¶¶†L&C³fĶ0~üų Ū^¾|Yė‚\ńĀø²÷y}ļå•ÕeØĘōłR>PU™Õżģ­i«śP^łĄ™³Ź!¢Öŗukœ={Væ¬VTT™LKKK‚€³gĻ€ų„R\½z€j,ųķŪ·«•ōĪŽŽāXó‹/Ō3£U«Vø}ū6rss‡Btt4¤R©Ī_[µj…»wļB”P īŽ½ ///SŸz"¢ÉÓÓžžžˆ‰‰xyy!##C:RPP€-[¶ °°žžžHOOG^^Õ{¹ZeļóśŽĖ+«ĖPéóÅŃŃEEEbP©Ŗ2õ}ö»U}ŠTXXˆāābCf‰ˆˆČ|˜m‘ŅŅŅ _ŽŚµk‡„„l޼666čÓ§233±{÷n <vvvP(ˆˆˆ@qq1śöķ ƒėµ±±AÆ^½°mŪ6ŲŚŚ¢mŪ¶pppŠśåK;;; 2’üóA€\.Gß¾}aii [[[lŪ¶ £G··µµÅȑ#).9r$lmm+MŅĒLłDŌ”õķŪ[¶lAēĪ!—Ė1jŌ(8p‚ @ōģŁ¶¶¶°µµE`` ¶oß+++ųśśĀŃŃ‚ Tś>Æļ½ÜŚŚZo]†jčŸ/š,--ѲeK\»v ~~~•–©īŁ”ė³W£¶±²ļ#FŒŠŚöڵkhÕŖ,,,ųŁIDDdĘ$5ÜG¢±Æ„ĘĶ€ [2؆­ŁßæÆ~l«±z{„Rł†!•Æ[·³gĻ6ś‰P(Ų±cžy棗MDDµ£5ż-\æ~¦népūömDEEaŹ”)ņyhjˆŸ½‚ ą?žĄšįĆõ&v%"ÓJLLD«V­T̤«÷œ®ek?’ó^]¤ T— „2‚„šą¾ ”Ż_§ŗÆT*ńŪʍX°ų=SŸ2‚ØØØ 3™@dd$† fźę™=‰D @Ńż›ś~žżū¹ ī?VßWoW  TćJ›Į̲‡™N³fĶŠ®];œV¬X‡zH«L}÷Ė·„ürHMMÅĢ™31dČ̜9©©©µĪž=«³‡Č70cĘ 2kÖ¬1ø>}ǧ֦MÄÅÅUėy111M¶‹Qmé ˆŌEŽõÅ~usC$''#00Ū¶m3ĮҶpįBW˜„2†öt78‰… ÖĖ1ėkæ1’ž.]ŗTg@D_NsŅh‡Ģ؇§Ō$Fvv6vģ؁C‡į³Ļ>_\+W®DQQ~üńGxxx\—ęśņ>žųc 0_|ń6lŲ€?žŸžy•m€ōōt†O>łĚ5k°aĆƒėÓw|jr¹iiiÕ:—}ūö,^¼ø6O'Q“„oøŒ±EEEé½Ų÷õõEpp0är9 ĀĆĆuBBB°wļŽ:Ļk¢ĻgŸ}Vé…ŗ:oää䈽GŖ©Ž°°0,X° Īs­tėÖMērC[å{Č( DFF"""BgįįįĶhŌŲ5Ś"µńĢ3Ļ@&“aäȑøqㆸüĄxķµ×t jźģٳxź©§`gg‡§Ÿ~gĻž5Ø-•‰Õ*ÓŠśźāųŽ=Š7Žx?žų£ŃŹ$""""j*²²²t.Ƌ”óś‚!aaaHJJĀźÕ«±dɬ^½™™™z‡i,Z“Č$ē*** ,й.88ŃŃŃHJJĀžżū±’~DGGC©T"""¢Ś¦ŠŠP$''C©TŠ"]y<Ō篮é @Y°`‚‚‚Ä[pp°Īü1¾¾¾ˆŒŒl2³™e@D*•B@AAA…õ2™¬ĀvjJ„²^ŪZY[<==«Õ Ģ•_ff&<==«Už••&NœXķž%DDDDD¤?·…¾‹ļšśį‡t^<‡……éMÜŗ~żzWXi“ÜÕ”o&žššplŻŗUoŠ`ҤIÕźĮŽ%K–ˆū8;;cŚ“iŲ»wÆĪķõ yjl|}}nöyC4™e@¤eĖ–Ų·o ±qćFƒ÷:t(V­Z…ŒŒ ė˜˜X­¶ōčŃæžś+ņóó±qćFōčŃ£Zū&%%UX޳gOüöŪob™†ÖWÕń%''£{÷īÕ>ß2™¬ŽIDDDDDdø/¾ų¢Ā2__ß*g±Ń×ū”ŗCKj+&&FēŠ¢£öfج¼€€¢źęciؒ““„ĄĄĄ•@·.™e@ä•W^Į§Ÿ~ŠńćĒĆŃŃŃąż^{ķ5888ąŁgŸÕ™tō¹ēžCHHˆŽ¤ŖåļĄ¢E‹pųšaŒ3G­V÷²Ń£GćōéÓ–/Z“Ą˜1c*LQUY}UßéÓ§1f̘sœ={¶B/"""""2­””øś†ŸhjŻŗµĪ @}÷Šų믿t.××k¤¦t«!ėM@0“'Q@@€Ö™ŹrĄÄÄÄ 00?üšƒIŽ©>5ڤŖjŗ’œŽ1#FŒ?žųćz·×|lgg‡7ß|o¾ł¦ĪŗfΜ‰™3gŌ5|’ż÷µ½üć`ūöķöóöö֊ČΚ5Ė śŖ:¾ÄÄD¼šĀ Õ:’šēfŃ¢EČĢĢÄɓ'kTQSćąą s¹1‡ĪėėĮ`hž’ …B¬¬¬z›mR_āYc'3­*Ą NŲZ^nnnæ¾!J†>‡+W®Ō9fŪ¶m ÓŪū¦[·n&K [̲‡ˆ¹J„X±bE½Õ÷ŃGA*­ŁKbźŌ©Ų½{7ƒ!DDDDDÕ ļbS_n‘šŠ75«”¹"ō%$5f«¢+ØS3ń4Tś‚Zś4†š4iöļ߯·§©čÖDˆˆˆˆˆˆLHWP$22Rļ 4M‘¹äéØ)}C”ŒZ²d‰Ī²"##‘’’bźĆÆ3 ˆ™¾‰ ĢeöŖ¬¬,Æ___£Ņ—SF_#sĄ€H5•ODjAōęķØIżŗ¢VµĪŌē@—7ß|“³ÓQ“§/Q§±†źVah"P}Cc Ķ_QWĒPŸCvLIßL?!!!F­G_žsīĆ€H5éK ZYąČ‘#hŪ¶­Ńź×׆ŹÖ5DmŪ¶Å‘#GLŻ """""“š4i’Ī žääd,]ŗ“ÖåwėÖMēņsēĪ“æ®ĄƒÆÆÆA Uu1­ėü4…aE111zc†ĢTĘLäŪX0 RöģŁSÆŃÓĘĀßß»wļ6u3ˆˆˆˆˆLN߯ż”””µžž4 @篒š3Wź£oø†®|śr”TfŪ¶mƒ®^4 …Boļ sƒQ£Fé\jō~ź:OICŌä"÷īŻĆ«Æ¾Š”C‡ā‰'ž@\\œø.003gĪÄūļæ'žxĖ–-ÓZ§k8Šę2}ĆUĪž=«³‡H`` ~’żwŒ1ćʍÓz³ŠU©Üøq3fĢĄ!C°fĶ­u©©©˜9s&† ‚™3g"55U\—ŸŸ+Vą”‡ŅynŚ“i£užu""""¢¦`ɒ%zgœ ĮĀ… kÕBW@!22Rļt®j”””:{č ąx{{WX–œœ¬·Ž¬¬,ƒ{9T6¬ČŠ”?ÉgŸ}†Q£Fé<÷Fļ„3@&—Ė žØ1jr‘O?żcƌĮ޽{±pįB|šĮZė.\ˆmŪ¶į½÷ŽĆ޽{Ååś†£h.×·MzzŗŽč]vv6vģ؁×^{ Ÿ}ö™©ONŸ|ņ ˆ]»vĮŚŚZkŻĒŒ`×®]čׯ>žųcqŻŹ•+‘››‹üQ繑ĖåHKK3õį5k׮՛Ē!,, ¾¾¾Xøpa„€˜˜üšĆXøp”Ör}Ć.‚ƒƒõ–÷Ć?č쁤ó"Y_O]u¤¤¤`äȑ©iŻŗµŽ^4Xŗt©Ž€QVVV£Zƒ„K—¢M›6X°`Ī`ˆ\.ĒŚµkÖ;$++ K—.ÕūÜ;šŅŠXšŗõķŲ±cZĆ4¤Rķ˜PēĪ]ŗtANNN·ē™gžL&Ćȑ#ńĪ;ļ˜śōč‹?üvvvxśé§±nŻ:qŻŁ³g±|łrqŻĆ?,®;pą~’żwøøøŌØŽĘ”…ˆˆˆˆØ¶¦÷Ā_=DD¤Š¼ˆĶÉÉ©tX½zµxæuėÖ ­Q( DHHˆXÆŗ]Ć]är9>żōSķ Öy­®# ŽŽŽ:ŪjˆŠŠPDDDč „††",, AAAbŗ‚äädÄÅʼny8–,Yb¼'«†"##1|ųp­e†ž___l޼YoO¢Ź„‡‡k=Ÿ …±±±•iŖ‹ž( M“ ˆH„R]­v¾ņŹ+ųōÓO1~üx8::VX’ņĖ/cžüł:ė«lŻ™3gгgĻjŸ³`̘1z,Z“‡ʘ1cpōčQ,Z“H\÷ŚkÆĮĮĮĻ>ū¬ĪsvśōiŒ3Fg5i'‘¹pvvĘśõė½¹Eō Š;ÓåśõėiP B.—cĮ‚HNNʤI“ j÷¾}ūŖ ŗ ::ŗŹ‹¾}cccjšyqss«v=¦ —ĖŒ°°0$''cėÖ­õ’Ō4((aaaP(X²dI“†@MĘTH4n€jŲśf Ą€-;ö÷ļ«Ūjl£ŽŽF©T¾aHåėÖ­ĆģŁ³M}ŽŖE¼żöŪX±b…©›‚—^z ³fĶj½//^ŒåĖ—WČćŅŠŚID¦S!sżõė×k4†–ˆˆ·ÄÄD“jÕ @ÅįŁŗ†kėZ¶öóO1ļÕEB™A(ƒ P ī BŁżuŖūJ„æm܈‹ß3ٱGEE!66 …¢Ā° upCCĆŠ ژ˜:t±±±Z NÕåÕųā8%%„B   IY³²²*ōąppp0ųs>** ‘‘‘HNNĮßßr¹žžžš÷÷GėÖ­µöŃU§zæŹŽ·ŗūiΰ£~ī4©ŪhHŻ"u’żūu®Ž‰‰Ann®Ž:ÕĻ ŹKRžÜŌ‰D @Ńż›ś~žżū¹ ī?VßWoW  TćJ›įķØIŪĮ€Õ#DˆˆH­)Dˆź^ūFŹyišCh‘&7d†ˆˆˆˆˆˆˆˆ"""""""jrm@¤OŸ>5j¾’ž{S7…ˆˆˆˆˆˆˆ™F9~ü8ž÷æ’į‡~0uSˆˆˆˆˆˆˆ“ ,\(Ąō逋 P.. 9łĮz‰hÓÆYź²UeI$ĄäÉ@LŒīķ§OWµSW»&OV­Ó‘”Õ\Xšŗ5%•JŃ”Cäå噺)DDDDDDDŚŌA†É“U÷ƒ‚GGķm’“^½T÷CB¹\µķō顙3ĄźÕÕ«ó³ĻTū'ŖŹW-Ū»(Ÿ~Ś4UŠ#98}ZU?,] DD””–™”FŪCDĶŁŁ111ĮŌM!""""""z 6VlHJRM“[> 1}ŗźļ޽ŖąĒ’%Ŗķ‚‚€°0Õ¾Õ±d‰Ŗ.uYė׫ī+Ąš5· R=’“UA@՛$4TÕÖ%KL}ėT£ˆĢ™3/½ōśöķkź¦= Pؾ¾×%'«zn„„T ”ĢŸÆś[Żŗzs,X ś”{Ÿ%KTõ‡…©‚!‹©ŹY»ÖŌgÆĪ5Ś!3j?üš^żuLž<ŁŌM!""""""Ҭ{¹zHBń w†šŗgHddĶziDD؆Ühę©,ČŚµŖ¼#£F=ā”Ҙ”FIKKĆĉaeeeź¦&%Eõ·¦ Tu‰‰{LP RŻŻIS5ØzŖ„‡«z³Ø{•˜¹FQ*•P*•Éd¦n Qõ©s†Ō–B”źįŃŃŚ=°³³Ć‰'ź­111ČĻĻÆ—ŗfΜ‰AƒaõźÕX³f ¦L™‚3fŌŪ± ‚€ėׯc’žż(**Ŗ·z!&&eee4h† …B””S7«IŪ·oG\\Z¶l‰”C‡ĀĒĒńńńųūļæ!‚AŪ”W\\Œ]»v”¬¬ AAA ‚R©DTTŠ‹‹M}ŲDõĀl{ˆ€TZ1ŽÓ®];lŲ°‚ `޼yŲ¼y3¢££aooyóęaļŽ½HOO‡ ˜;w.žüóO¬\¹æžś+RSS±|łrŒ5ŹdLJƒB"‘@©TbüųńšõõŽ{÷šĆ?`ąĄˆEnn.8qāŽ;™L†.]ŗ ::S§N… ųå—_šŚkƉu|ųį‡xłå—!—ĖõÖWY™Ķ›7GRRöģŁ„R ‰D‚1cĘĄ×ׂ `ɒ%xķµ× —Ė+=Öņ½0~żõW|ōŃG°°°€  ĆŠ”Cѹsg|ńÅ5jöļߏ¹sēāüłóz·T½p"""`ii‰ĀĀBŒ?Ė—/‡T*ÅÖ­[±téRĀßßß’=.^¼ˆ3f GHLLÄę͛Ŷ?“&MBHH¶mŪ†ĢĢL̟?óęĶĆ£>Š[·naśōéXæ~½É^7D]fff„ė]\\LŻD¢FA"‘TXęčč(^čįōéӀ²²2ųūū#77Wü®Ō·o_ŲŲŲąČ‘#ČĶĶE`` œœœ*ģcgg‡S§NįĪ;čÖ­.]ŗkkk“lŁׯ_GQQÜÜÜŠ±cĒ:=Ž„„­ž/'NÄO?ż$>~ēwœœŒĀĀB<öŲcxź©§°wļ^Ģ™3¾¾¾ųžūļįīīŽ©S§"!!k×®EēĪ±`Į(•JāÓO?æ•wņäI >7nÜ@TTƌ#®Ūŗu+öķŪkkkX[[cŊõó"0н{÷ —Ė”T*akk‹~żśĮĶĶM\Ÿ™™‰Ó§OC©T¢““Żŗuƒ——:„ŒŒ ŲŚŚ¢GbĻ$''' :‚ ąĀ… ø}ū6ĄŁŁ=zō€µµµ©¹ĮŗqćīŻ»‡f͚‰ßeŪ·o»wļāÖ­[HKKCYYY•Ū“lŁR«ÜŅŅR(•J ''͚5Ćĉaii֗ˆDZ̶‡Hy%%%øté~łåü÷æ’…T*{€««+>ųąƒ'F*Å_|’’deeaėÖ­xēwj²c(..Ę_ż…§Ÿ~sęĢĮˆ#°uėV±½ŁŁŁ°°°Ą‹/¾ˆY³f!** P(Ų½{7BBBšĀ /@©T"33SgĄČŠś*+3??æżö&Mš„_|<ņ~ūķ7A*•āż÷߯2R^^^ęĪ‹ˆˆDGGcéŅ„˜9s&`Ĉ8vģąšįĆ=zt„Ū;v üńNž<‰“'OāŌ©S°°°@rr2nŻŗ…’üē?ųēŸAšæ’żVVVørå ‚‚‚pčŠ!­¶YXX %%^^^8yņ$žż÷_¼żöŪøzõ*VÆ^ OOO“C\ÖÖÖ8vģžüóOüšĆ8tčĪ%DęØI„’Ö¬Yƒ““4œ={‘‘‘šó󠺐Õ:墔źõ#FŒ śšNJJ2ŁqX[[ć­·Ž«{†(•JŖ/6ź®°ĪĪΰ··Gvv6nŻŗ899śõ뇽{÷ÖŖ¾ääd½e^½z-Z“@óęĶ؆—ø»»#)) :uŖŃ±ŪŪŪ###C||/æür„Ū»øøąÖ­[ųę›ošŠCĮ××Wüōć?¢_æ~šōTĶŅņūļæĪ;A0mŚ4ķ³°°Ą³Ļ> šńńĮ€pųšańł0„Ģ;·t?2ļÜ2uӈ ¦ž’҇]{‰ŖēŹ•+(,,„B”Ąˆ#ąččø}ū6Ø~,ŗté U«VˆæCŻŗu ;w®tuoWWW888ˆ½Vėӊ+Š®];¬X±K—.Å /¼€yóęĮŹŹ Ä9rrrÄ Œ×_sēĪģܹSüN“’~¬Y³ˆ•+õOWóęMxyyaüųńxź©§PVV&~ætqqĮźÕ«±lŁ2üńĒõ~nŖˆS§NįöķŪ8~ü8œŃ§O888P}/T÷Œ±““DVVÕóīåå…ääd”••”ØØvvvā9æq欬¬Äž}vvvHOO7õį6hźs®P(“–«{Ojö‚2dMķŪ·GūöķQXXˆ;wīąĢ™3øpįZ¶l‰¶mۚśŠ‰ź\“ˆĢ;-[¶Ä€°aĆ,]ŗ“ZūŪŲŲP]ō–––šģ8”J%žż÷_$&&ĀŅŅR „Ø’Z[[kõśH$yyy°³³—[YY‰ĒTÓś*+377©©©ųņĖ/µŹ+++«Õ±’÷æ’Åžżūakk+–%†Ž’üē?ŃŃŃāųG}ŪwģŲ»wļƚ5kšńĒf͚…·Žz ·oß֛,ĢÕÕµBMM.—‹ōĄƒ_UŠņACرaĄƒČøüüü`gg‡={ö %%Żŗu 2sńāEń3M=DĀÉÉ %%%ČĻχ••A‡8čŪG͐ļuE*•āÅ_ÄĢ™3±cĒü÷æ’EBBž÷æ’įĉųņĖ/ѦM› ßļŗté‚ģģl¤¦¦ĀĮĮ„„„ā|FF†˜›ś÷ﯳīŲŲX( ¼žśėb[Ž?ށ¾żö[¼üņĖčŪ·/>ūģ3Œ?ŽdēI[[[ 8 …/^DZZšų= P m¾pᬬ¬*ä„ńööĘÕ«W‘žžŽāābń‡&@•¬U©TāąĮƒb=T9///øŗŗāöķŪ8xš Z“h›7o"==®®®šņņƒ¶ŃtėÖ-ģŻ»-Z“@‡@üæÖüžOdΚD@Z“h¹sē",, Ó¦M#žźüÄłæŖóēĻćāŋ˜={6¬¬¬››‹>śØŹżd2™Öl(EEEā—T*€*` ¾šØ¬¾ŹŹtpp€——BBBŒvģ›7oĘöķŪqōčQČd2¤„„”E Õ¾śM~Ū¶mčŌ©°iÓ&½ŪŖéĶŌŁŽšōÓOĆŪŪZ=K4éw­¦P( ‚ŹĢĢ„»»»ŃŽßŌACØ1śź«Æ*]?gĪS7‘ØŃ±µµ…ŸŸ._¾ ___888ĄĘĘ;vŌ9Ó]«V­póęMŖŽj•ķcj£FĀęĶ›!—Ė1iŅ$X[[c޼y€_|+V¬ĄŲ±c‘˜˜ˆo¾łFkßɓ'cūöķH$xā‰'ÄåxõÕW1dȐJėžėÆæ°jÕ*ń\ŁŲŲ`ēĪb@¤[·nų÷ßńŃGį7ŽhP‘²²2ÄĘĘ¢S§NĖåčßæ?>¬•ĻI?dųšįŲææ8c ś”ČĮĮ7oŽ„ bĄM}ŠŠŠŖ<ō€T*Åĉƒk×®įņå˰··G÷īŻŃ»wońū§!ŪhjŃ¢zö쉋/Š=½¤Ä"2gfCDčPGż_~łexxxąŻwß·ńööʅ Øŗ@z2Ø÷+ß³ĮTcź įąą ž2sčŠ!H$­ ]¼½½‘’’"Ί#ötprrB^^rrrŃŃŃÕWY™ķڵ“7Ŗ#_}õU­2ŹgffĀÓÓ2™ „„„ųä“O ‘HÄ2GŒ/æü£G®rū­[·āĆ?Ėn×®¼¼¼ FćĒćŚµkTY’żļ«l_II ~żõWŖī±ĒǰaĆ`eeÕ ¦ f0„«3fTz#"Ɣļ]źēēÄÅÅZ¶l©5“H||¼xßĖĖ éééČČČŠź¢oŸņu©YZZVłŻÅXīŻ»‡ˆˆńqzzŗ8¼§°°P*tųšį m ĘŽ½{qčŠ!­^ &LĄ/æü„R „R‰åĖ—ė<Ļ'NœŠ õźÕK+IHH,,,šČ#hÕŪ·o_­!ŚU=® łłłø~ż:RSSÅć)++ÓŗH‰eeeā÷1ĶćšööĘķŪ·QRR¢ÕŪĄŪŪeeeāk&//WÆ^­ÓćiLBBB0{öģ =glll0pą@L:3gĪÄŌ©S1`Ą­X†l3{öl<’üóāć=zą‰'ž?O§L™"ö!j Ģ6 ¢P(0ž|ĄG}„ .@&“į’ū0{ölĄ{+łY €IDATg÷Ž{“'O†››±pįBää䱕W^,Y²Dk<ŽāÅ‹ė¼żėÖ­ĆņåĖÅŪīŻ»Ń­[7”––b͚5Xæ~=ŗté‚öķŪćēŸ®“, <ėÖ­Ćwß}+++Čd2X[[C&“aŲ°aųę›ošõ×_£øøĪĪĪb4__}••igg‡©S§bŪ¶mųꫯšĆ?`Ą€°³³ƒ xļ½÷*Œo¬ŹO<ĀĀBtļŽ#GŽÄ£>ŠqćĘaҤI€‘#Gāß’gŖlū‘#G"!!=zō@ß¾}???<÷Üshٲ%Ö®]‹‡~;wĘ­[·“fąŃ§eĖ–øxń" €‘#Gā£>‚Ś“iwww 4ØĪ_3DęĢĘʦŅU­øø§N  Zؓ±"77'OžDēĪ!•J‰ƒj]Č:88 ¤¤¤BO]ū(•J±®sēĪįŽ½{āömŪ¶Elll½\łå—ųõ×_1gμöŚk8s挘’ćwŽĮ¢E‹šüóĻ£uėÖ°··×Jøß¶m[äęębŲ°aZe¾łę›°¶¶ĘøqćšČ# uėÖź]°`Nœ8÷߀*gĖŗu됚š*~?uuuŜ9s°lŁ2­fԁC×GGGtķŚ)))8pą> ¹\q›Ž;¢““111b/\u` Põ(*..®0 ˜:!ļŋń÷ßćäɓÕN¶ODd,’ī#ŃŲ×Rćf Ą€-;ö÷ļ«Ūjl£ŽŽF©T¾aHåėÖ­ĆØQ£ÄäBTµŅŅR¤¤¤ M›6J„HKKƏ?žˆ×_½Ņa õYfDD„¤R»téś÷ļ_åt›¦vńāEŒ5JüÅŌi»{B‘‘V­ż"žÜŽųų‹ų蓕HLLä’58źŁTZµj b$]Į"]ĖÖ~ž)ę½ŗ‚ @( eJįĮ}A(»æNu_©Tā·±`±ž™…ˆČ0‰$ @!€¢ū7õżüū÷sܬ¾ÆŽ®@©Ę ”7ƒ5™"M™……®\¹‚æ’ž–––H$xņÉ'k ©«2Ė9r$¦OŸnźÓGDDDDDDfˆ‘&@"‘`Üøq ¾ĢņJ‹ŖtźŌ©Įµ5üūoj_‘c@„ČĢ,’čS7ˆˆˆˆˆØĮc@„ČĢ|ōÉJS7ˆˆˆˆˆØĮc@„ŒÄÄDS7ˆˆˆˆČ,9rß’=.]ŗ tźŌ 3fĢ@ß¾}ė¬Ī»wļbģŲ±8pą€Ö,UD "Ō ›ŗ DDDDDfįŸžĮ²e˰xńbŒ1‰ūöķĆ¢E‹Š#FŌI½...Ųµkd2™©O‘A!"""""2%%%Xµj^zé%L˜0A\>aĀ( |üńĒ ‚T*5zŻR©nnn¦>D3ž™Ä¹s琙™‰É“'WX7yņdܽ{ēĪĆ”)SšĻ?’vļŽĒēž{S¦LĮóĻ?ŲŲXĄ… 0~üx¬^½3fĢŠ¹’Ż»wˆüüüJ˚0aāāāgΜA`` Īž= 8ž<zč!SŸFj"!"""""2·nŻ‚›››Īa+vvvpssCZZqįĀ@\\śōé…B×^{ óęĶĆü¹sēāµ×^CAA¬­­‘ ¹\ŽĻ>ūLēžš*+K3rźŌ)tėÖM –œ9s¦BYDu„Ń™ÉĶĶ5uˆˆˆˆˆˆKKK‚ w½ H$Ą¦M›Ø!!!8qāš7o.&^ķŪ·/\\\–-[¢°°?ž8t²²śōéƒą™gžĮéÓ§ńŌSOįŸž{‘ 6ĢŌ§‘šˆF™={¶©›@DDDDD”Je„õ-«ķ¾T‘——īŻ»‡ÜÜ\888h­ĖĻĻǽ{÷ąååOOO|šĮ(**Ā•+W€æžś ©©©˜8q¢Ö~yyy+++±ĢĄĄĄ ū‹ūܽ{WoY}ūöŗ_~ AœœŒQ£FįĖ/æ„R©Äٳgńśėƛś4RŃč"DDDDDD¤[ēĪŃ¬Y3l޼¹Bƍ?žų-[¶DēĪ!‘HмysüóĻ?h×®įęę___üņĖ/ʽzõ*$‰ųŲÕÕµĀžwļŽ×WVČd2DFF¢]»v°°°€··78GGGxxx˜ś4RĮ"DDDDDDfB*•āĶ7ßÄ÷ߏ?’ü(,,Ď;šŻwßįĶ7߁ˆˆˆ‡µōė×7oŽÄ©S§7nÜĄć?ެ¬,u•ß_SUeāēŸFÆ^½={öĆ t–ETWŲC„ˆˆˆˆˆČŒ :«V­Ā·ß~‹U«Vŗté‚Õ«W‹@”Ų“i^zé%€³³3>żōS¬^½999°““Č3ąģ쌌ŒŒ õ”ß_SeeŖœ"[¶lĮüłóØ"ėÖ­ĆsĻ=gźÓGMˆ¤†ūH4öµŌøY°` @Ą€żżūźĒ¶ŪØ··Q*•o˜śdQõ™*‡HM÷]ūł§˜÷ź"‚”L€ ”A(…÷”ģž:Õ}„R‰ß6nĂÅļ™ųl5~‰$ @!€¢ū7õżüū÷sܬ¾ÆŽ®@©Ę ”7ƒqČ 59 ˆQ“Ć€59 ˆQ“Ć€59 ˆQ“Ć€59 ˆQ“Ć€‘™‰ŒŒÄóĻ?Aƒ!((³gĻĘ”C‡j]ī²eĖ0fĢܹsČĻĻ7Éńݽ{פõ“y`@DƒŸŸZ·n->¾wļ¤R)$ n޼).÷õõ…ŸŸŸQėŽŒŒ„D"Į·ß~kōć*--…D"A‹-ŠŖU+“hŃžžžŲ½{7 -- utVėĒ€j¼Orr2är¹Qė­I{ĢAZZlmmMŻ “2ęs_ž|RöŋŃŖU+½åÕäżį‡F»vķP\\\gĢųēÉŌZµj…‹/ÖxõóÜŠŽ«²¶Öę}“±Ņü2Öēh]~7ō’cM†žÕö=±!Š÷>ß’§ČøvķŚ…%K–`Ś“iˆŒŒÄĪ;ńč£błņåHJJŖq¹‚ `Ū¶mųśėÆįęę†]»vA&“ÕŪq}ųį‡ˆ‰‰øøøŌ{żd~,MŻ€†dųšįųę›općĘ xyyįȑ#H$H$8tčžxā Üŗu )))˜={¶QėīŻ»7Ž=ŠvķŚÕŁńL™2—.]ŖÓsZrrr––VēūZ†1Źn¬<==‘——gźf˜Œ±Ÿ{ĶóiŖ×UII vģ؁¼¼č޽;/^ AŖ,SķźÕ«šóóƗ_~‰~żś”M›6ųąƒÄõ»vķBæ~żŠÆ_?ōéÓžł'ąŃGÅ­[·0}śtƒė*揄„%Ö¬Yƒ¾}ū¢U«VZõź;ęņeč+[_{ŅÓÓŃ¢E |õÕWčŪ·/¼¼¼°fĶ„‡‡cĄ€šńńĮĒ 8ž<Ś·o>ų}śōAūöķńÅ_TynN:<’üó÷‘;3÷ž{ιēŽI>9ē\8pą€+pē­M¹óµLg»-ŗóT– 6pĮ”Ū622’żū÷—«ĻŠi{»ķv;=ö=zō ]»v¼ųā‹Tŗŗøé¦›=z4ÅÅÅ5jkNŽŹXŻyö%īõTݹsņvMUUOåxķµ×čܹ3żū÷ē±ĒĆf³łTīłóēÓ£G:vģȤI“ČĻĻ/wž+^Ožņąk™}½nŖ;'N5¹z:ÕŻg¼å³¶×wM÷óVOUń„L¾ŽŪ<s_ļ”Nuq{« omŠ—śšt y;f]ŻĻäļ5¾œ'o÷yoהSM~—šÖ¦j{=ɹiūöķdff2fĢÆŪ­X±‚É“'3~üx&Mšäj’dųšį,\ø‰'2jŌ(f͚Ąƒ>Ą­·ŽZiČĢܹs3f ×]wŸ}öC‡eļŽ½ģŚµ‹ŗŽėp8čÓ§©©©lŪ¶Ė.»ŒēŸž)S¦°xńb&L˜ĄŲ±c™4iėÖ­`ęĢ™lŻŗ•Ēœ‡zØŅ™Ś”G¤6l”RüN-A@Ä́v@7 0ø˜ÜÜ Līžšš¬9¤§§ĄÜu×]Ęc† bnøį3iŅ$Ó£GcŒ1÷Ž{ƱŁl&==Żģ޽ŪÄÅř©S§šĆ‡›‹/¾ŲDFFš’’sčŠ!˜&Mš˜{ļ½×Ģ;׬Y³Ę¦mŪ¶ęæ’żÆéßææ±Łlfß¾}ę›o¾1€™={¶×ķ6nÜhsÕUW™U«V™Ö­[Ą¬Y³Ęc¹JJJ `:TīżĪ;›/¾ų¤„„™°°0cŒ1ĒŽ3±±±fóęĶĘc6nÜhš6mjrrrLnn®‰‰‰1ū÷ļ7ĘóŁgŸ™vķŚcŒY±b…éÖ­›)))1ĘS\\l|šA“œœģ5Mwūöķ3AAAęõ×_7ĘsąĄd233Mzzŗ‰ŠŠ2Ū·o7Ƴ{÷niRSSĶęĶ›M«V­ŖĶæ;÷}öķŪg]Ē=xš ėøŽŹģž†§“½åēŲ±cĘßßß̚5Ėc̚5kLHHˆ™1c†1ʘ½{÷šĄĄ@SXXh¶oßnüżżĶ[o½åŖ›F™={öx­›M›6™ŠŠPóę›ocŒ×ņTÜöŽ{ļ5=ō1ʘ§žzŹÜyēåŹ9uźTóä“OcŒyņÉ'ĶwŽiŅŅŅLPPPµeŸ2eŠė8/¼š‚:tØyńō1Ęüūß’6æżķo½¶)w5)ÓŁl‹ī¼•eżśõ•ö‰ˆˆ0ūöķ+WŸīi{+³³­¼ņŹ+®öf’““}¾ÖŻĄ”””ŌØ­¹óVĘŗøwø×“·sēĪŪ5U±,ŽŹ½’~aRSS]ķ×ĻĻĻlß¾Żk¹SSSM||¼IKK3–e™‰'šæ’żļåγ{¹¼åĮ×2ūzŻųzķłzõv«»Ļœ‰ė»&ūy;¾ūõä¾^]™¼ÕÆ{:ŽĪ¹/÷Šŗ¾Ž½Õ…·6X]}x»†|ż®ķ=ńL’^ćĖyņtŸ÷vM¹«Éļ59÷¾–ѝeYå‡ĆQi)--­r))))·WZŠŠŠŖ\ Ė-•–üüüJĖóĻųĄŒ7εļØQ£Ģڵk1¦Üńk[©?ĄóĄß€Ē€?Sß“€1ĄH`Ą©ŲB; Å©˜CÄ©D[\Ā~*VQ#ź!ā&..Ž.]ŗšć?RRRš5k8p żū÷gÓ¦Määä°råJŗtéB\\ķŚµ#==—_~™ųųx†ŹńćĒ9pą€+Ķžżū3cĘ ®½öZ×{ćĒēŖ«®āę›oĘĆīŻ»«ĢOUŪ}óĶ7L:•¾}ū–K×WEEEüūß’&++«\“`ɒ%ōźÕ‹®]»н{w:vģČ·ß~KXX®yV.¾ųböģŁƒeYDEE‘––ĘģŁ³Łæ?<żōÓ“iÓĘkš9WtøeĖ–ÄÅÅqųša¾žśkzöģéśĻR»vķčÕ«—«>|Éæ7Ę~÷»ßŠ¢E ×q½•ŁÕåĒįppć7Š£G øžśėhŻŗ5!!!=z???nøįWŻ 0€åĖ—{­›Ķ†eYüę7æšZžŠŪžś×ævż7hŊ\zé„åŹ6bÄW£åĖ—sÉ%—ų\öK.¹Ä5©×²eĖøė®»\QüeĖ–1zōhÆmŹ]MŹt6Ū¢;_Ėā+_Śå-·ÜājĻ põróµmV„&mĶWuuļšåÜUä險Xoå^¶lżśõ£Y³fÜpĆ ųłłU[śŠ~żśĶfc޼yLŸ>½Vu_“2ū҆jŪ^=ŻG½Ēźī3gāś®É~µłØ®L¾ÖÆ·sīĖ=“6mÉŪu\]]xjƒÕՇ·kČלÆķ=ńL’^s:ēÉŪ5U‘ÆæKŌäÜ×öž+ē??æjW]³f ńńńōźÕ (;lj‰‰¬]»(›+düųńtīÜ»Żīś“*6l mŪ¶“k׀뮻Χߗm6………Lœ8‘ššpBBBXŗt©«ķ%%%‘’’rÖĖ# ‡ę©`ųšį¼žśė¬\¹’‚‚ Dqq1–eńć?ņÓO?¹¾œrrrøõÖ[Y²d ecuƒ‚‚Ŗģš@ćʍ²E@@€OŪeffФI ,ˆć«¤¤$üüü K—.,Z“ˆĘ—›™9==U«VŃ£GrūaŒį‘Gį›o¾!88‡Ć”Ż`:tčĄāŋyé„—\]3o¹å|šAÆiV†æ’ĻĶŅn·ćp8HOOw•Ł)&&¦Ņ¬&ĒrZīēq½•ŁÕå'00Š5™š³ÜĪóķ|ĻyĢČČČrķ$**ŠĢĢLl6›×ŗ‰ŽŽv•­ŗņøo;xš`vģŲA~~>6l`Ų°aåŽ1|ųp¦NŠeY¬]»–aƆ‘››ėSŁGŽÉc=†1†;v0nÜ8žņ—æšż÷ßóĢ3Ļė±MŁķ?ĒrkR¦³ŁŻy»>jƗ2»·•ččh²²²Ź„Q›k„ŗ²»×µÆźźŽį˹«ČÓ5U±,ŽŹmŒ!**ŖÜ±"""Ŗ-÷Ń£G}ŚĪ×ŗ÷µĢNµ½Ÿ»_{yŗz;æśÕƼŽgĪŌõķė~µłØīŽéėżĄŪ9Ÿųą¾żö[†ʟ’üg^xį…réÕōƒź8oj@Ł–ÆÜ'Uõ$>>ž¤¤$×\(ī>üšC,XĄŠ+ įȑ#®’čōģŁ“7ß|€={ö0yņdZ“hį5M_5mŚ”cĒŽ•{/##ƒųųxŸó_}ō‘×2WĒ[~œēŠWĒDz,×$ŁŁŁ4iŅÆuć>»ŗņøoĄ!Cx’ż÷éŌ©S„¼£££ILLäÓO?„cĒŽ4jŌØ\@¤ŗsŹ×_M§N°Łl“k×ŽÆæžšššpbccĻmŹ9¾¦e:›m±"OeéŁ³g¹/äŅŅŅj'Ҭ®Ģ'NœØ²­ø«M]TWv÷ŗvWń?UĖx&ļŽxŗ¦*–Å[¹ ÉĪĪv½_RRāzķ­Ü±±±5ŗŌ¶ŻyR]ņåŚóUuēŃŪ}ęL]ß¾īWŻ÷^UŖ»wz«_÷ŽĪy\\œO÷ŠŖŌö:®ķ÷auõåńņõ˜µ½'Öö:šµ­łržĪę$Ŗ59÷gśž+gVūö퉋‹ćĆ?äųC•ŪÄÄĔ»ö źß|^ī÷Ą““4×zÅąCNNN¹}ŻŪŽŅ„KYøp!ļæ’>‘‘‘ģڵ‹É“'W{üŗ.42SĮ°aưŪķ|ųᇠ0»ŻŽææ?żśõćć?Ęn·»ž»įüÅvóęĶĢ›7>ų({Ä[uQĢŚŗųā‹xłå—Y±b…ė˜uå’K.ażśõlŚ“ ( øōīŻ›ĢĢL²³³‰'$$„ŅŅRžž÷æc³ŁČĻĻgžüł<õŌS®tڶmKbb"–eyM³&łŚ°aƒė1|;vģ`ćʍŒ9’€€ «Ķæ;÷}¼ńVfOiŌ&?¾())aīܹ¤¦¦²jÕ*†źµnjRžŖ\vŁe<÷Üsg$1b/æü2£FŖQ[r~>cĘ † ”µķgŸ}֕–·6UŪ2Ķ¶čĪ[Y9vģ˜ėŃŽ³gĻ®ņžįžvuevo+‡fåŹ• :ō“ė¢&mĶ·2žé{‡7ž®©š”{šąĮ¬X±‚””€rN÷VīQ£F±jÕ*<Ąķ·ßĪ#<ā± Õ¶ī=©ķżÜÆ÷ŃźĪ£·ūĢŁø¾kū½ē·2łZæÕóźī”ŽŹ[›¶TŪŗØ®>¼]C¾~×öžx6~Æ©ÉyņõšŖ­šœū3}’•3Ėf³q÷Żwóļ’›łóēSPP@FF‹/ęŹ+ÆdŪ¶mōķŪ—ōōt6lŲĄśõėIOO'))©VĒģŚµ+»vķāŠ”C|śé§®@Gll,–e¹žnłß’ž×cĆœœĀĆĆiÜø1………®k×y=pāĉJūÕuy¤įP‘ ¢¢¢čŃ£ėÖ­cŠ A®÷ ÄŅ„K鯻·«;Ų“iÓX¶lÓ§O§wļŽ|ņÉ'Ü|óĶL:µŚYčk«wļŽ<ųąƒ¼üņĖģŁ³‡Ń£G3kÖ,5jDii)ģŪ·ÆŅ“ |üyóøõÖ[)))”““”éÓ§Ć5×\ĆūļæO·n݈ŽŽę駟fūöķŒ7ŽO?ż”Ļ>ūŒīŻ»»ŗŽ9’o¼???iś*66–9sęøĘ¶Śl6ęĢ™Cll,4iŅ„Aƒ±|łrŸŽÕŗuk×>ļ½÷žĒćz+ó¢E‹Ź·Ŗ“½å§¦=DŲ±c ąųńć<ū쳓lŁĄcŻTģAä­<īO­qśõÆĶļ’ūJc¾FŽÉsĻ=ĒO˜3‡»īøžkūܗŸŸĻ!Cųꫯ*Ķķ!`³Ł^ ¢S‹s=’Ōz.Ppźµsݹ]1Pź¶·Ågź!ņ “——ĒwÜĮ’%K(,,¤k×®|üńĒ †H›>}:_~łeĖ‘³kĒŽ4mŚ“¾³Q„óń>s>–étØ>D†‚‚īøćxąŚ·oĻ‚ hٲ„‚!rĪS9-ź!"Ÿ~ś)o½õ‡ƒ˜˜|šĮ*Ÿø)ź!"""""""ē‰qćĘ1nÜøśĪ†Hč)3"""""""Ņą( RĮ€Ųææėi2õm̘1“mŪ–āāā3zœęĶ›»Åv.8×ņSSζTūŪß*=ļņĖ/ēÉ'Ÿ¬ļbż¢œĪ9ų%;räĮĮĮg$ķ_JžÉ:š¤¶uS1Æuń=t&Ė&擜eƏóeó­4oŽü“ņ^—<µ OjŅf~)×ņ¹Ź×ś;SmłtŚźŁś½RDä—@7'Ož,÷XŹsAII .dóęĶÖwvÄG§Ū–ī¾ūnöļßĻ_|ĄŹ•+Łøq#÷ÜsO}ķć\¼žĻ–ųųųjÅZæ¤:=SuąÉéŌ{^ėŖŽĻTłĻäw’{ŁĻöł«Ė¼×„3Ń6Īd~ŠšŌ߹֖õ{„ˆHy ˆø?~ūģ3>ųązōčA= döģŁóU“śØM~ęϟO=čŲ±#“&M"??Ÿ 6pĮ”K?22’żū÷“žžN³fĶxõÕWéŪ·/‰‰‰¼ōŅK¼żöŪ 0€–-[2cĘ ×~µ)[ŶōųćÓ³gO’’’čÖ­÷ß•Ļ^w ā¹ēžsm÷šĆóä“Oźµ>¼•»¢Ŗź­.ŚvuyšVžźŗ6×NÅsą)횓‡­[·Ņ®];žś×撔”D»vķų׿žUm;]·n=zōছnbšąĮ^ĖPqŪnŻŗ±hŃ"W*NNÖ©S'–,Yāś¼K—.9r„°°°jŪpMļėŌŪuéĪÓńļ¹ēžųĒ?š‡?üx Ś:ö”VÅzsƃśøę|©c÷¼Öä{Ø>Ś€ūwҚ5k<^ėÕŻ/Ŗŗ’ø—½bž=µµźŽSÓ{/€Żnē±Ē£G“k׎_|ŃU?žŹėéü{ĖĆé¶ O÷p_ŚLmÆe_ī½uu ×ōŗ­ķwW]^ļgóZōÖV½§āļ•5łŽņõ;ZDä|g£,āwj ¢ģI2@,Šhtś#€Ė ĄMĄ­Ą4ą^ą’OϚsĄęĶ›M«V­Œ1ĘģŪ·Ļš×_ŻcĢĮƒMPPÉĢĢ4¹¹¹&&&ĘģßæßcĢgŸ}fڵkēŚ/((ȵ߁\ū¹ó–†»‚‚˜’’sģŲ1k6oŽlŒ1fćʍ¦iÓ¦&''ĒL™2żłę›Ęc^xį3tčPóā‹/cŒł÷æ’m~ūŪߖKw’žż&""¤¦¦ŗ¶ńóó3Ū·o7ééé&**Źlß¾ŻcĢīŻ»Mdd¤k[cŒY»v­ 3GŽńš/_룶łIMM5ńńń&--ĶX–e&Nœhžž÷æ›õė׻΄SDD„Ł·oŸ9vģ˜ń÷÷7³fĶ2ƳfĶbf̘aŒ1fļŽ½&00ŠÖŗlīmiŊ¦[·n¦¤¤ÄcLqq±yšĮMrrrµmrōčŃę–[n1]t‘q8Ęćµ>¼•Ū§z«‹¶ķ-ŽźĀ[]×ęŚq?ŽŅ®I{Ų¾}»ń÷÷7o½õ–«5jdöģŁćõ¼lړɄ††ŗ®QoeØøķ½÷Žkzč!cŒ1O=õ”¹óĪ;Ė•sźŌ©ęÉ'Ÿ4Ęóä“Oš;ļ¼Ó¤„„™   jĖ^Óū†{śrŸØīųiii&>>ޤ¦¦š¦M›š£Gz­coiU¬·Šup6Æyw¾Ō±{^}żŖÆ6ąžäķZ÷VWžī?īewĻæ·¶ęķ8µ¹÷:Ūß+ƼāŖó°°0“œœģµ¼žĪæ·<œNŪšT‡¾¶™Ś\˾Ž{ėź®Éu[Ū﮺¾ŽĻęµč­­z;Žū5\“ļ-_¾£-Ė*·8ŽJKiii•KIII¹„øøøŅRTTTåRXXXn)((Ø“äēēWZžę SZœoŠ sMa^ŽÉ?™mrOdš“ŁĒ̉Ģ#&ūXŖÉL?dŽ„0é)ūLŚĮ=&õĄnóü3O9}ĄóĄß€Ē€?Sß“€1ĄH`Ą©ŲB; Å©˜CÄ©D[\ĀN-ž¢«"^cųŻļ~@‹-ˆ‹‹ćšįƄ……‘‘‘A«V­øųā‹Ł³gėæN‡ƒ)S¦eē~īŖK£*K–,”WÆ^tķŚ€īݻӱcG¾żö[.¹ä~ųį–-[Ę]wŻåśļȲeĖ=zt¹“–-[Fæ~żhÖ¬7Üp~~~|żõ×ōģŁÓõŸčvķŚŃ«W/¾łęמ<ņS§N„iÓ¦^óåk}Ō6?_}õżśõ#>>›ĶƼyó˜>}zµēÖįppć7Š£G øžśėhŻŗ5!!!=z“NŹEZZ³gĻf’žżšōÓOÓ¦M›jółĀ /šĘoš·æż »Żī󳩎§z«‹¶ķ·ŗØ®®źśŚ©I{šóóć†npÕĮ€X¾|¹×ób³Ł°,‹ßüę7Ֆ”ā¶æžõÆ]’…[±b—^zi¹²1‚•+W°|łr.¹äŸĖ^Óū†;_Ū”·ćĒĒĒ3iŅ$®¼ņJnŗé&bcc½Ö±·“*Ö[Egóšww:u žæ‡Ī…6POuUÓūvumĶÓqNēŽ{Ė-·øź|Ą€|’ż÷µŖoy8ŗ÷V‡¾“™šŌÆSMī½uu ūzŻÖö»«®Æ÷śø«j«¾~ŸÖä{Ė×4åÜŃ·o_ ĄĄ8p #FŒą¾ūī###ć“ŅĶĢ̤OŸ>äēē—[ł„Ņcw½ użQe]޲g?ņČ#|óĶ7ćp8\_¼aaaųūūWŚĻ·4œųV”žžĪŖU«čŃ£G¹÷‹ŠŠ9r$=öĘvģŲĮøqćųĖ_žĄ÷ßĻ3Ļ&&ĘõįŖU«ųžūļł÷æ’]m¾|­Śę§““Ōµ]Mŗ&9sę­qćĘ®Ļżżżq8µ.›ū{:t`ńāżōŅK®ī½·Ür >ų ĒsķŌ©S'üüüčŌ©S¹vą©>:wīģSł=Ze½ÕEŪöĘ[]TW×¾ä±6×NMŚ”u‘p}Eff&6›ĶėuķŗŸTWĻīŪ<˜;vø†‚ 6¬Ü1†ĪŌ©S±,‹µk×2lŲ0rss}*{MļėŌ[y}­ūńćĒóĀ /šĻžÓõ™§:¶Ūķ^ÓrÆ·ŠĪę5ļĪ—:öv yś:Ś@u<Օ§ū'Õµ5OĒ©ķ½7::ŗ\ū‹ŽŽ&++«Vuą-§Ó6¼Õ”/m¦&õėT“{o]]þ^·µżīŖėėżl_‹žŚjuõģė¹w?¾~G˹åÕW_u³œœžxā {ģ1^zé„:I?**ŠE‹rZé<õŌSüźWæ¢wļŽõ]eŅ) R }ō ,`Ŋ„„„päČWφ3™F||>€‡~˜?żéO®/QołŖjŌ6?EEEUFŗżüüŹż×Ŗ“““V“šÕEŁzöģɛo¾ Ąž={˜ŻÉ-ė« Ōö>ėéžć‰Æm­*µ¹÷ž8q¢ŹöWŪņzĖCmŪFMė°.ź·&÷޳} ×ö»«®Æ÷³}-zj«Žź¹°°Šµ^ݹw?¾~G˹«qćĘL™2…›o¾™’’’rĮ“ڲŪķÄÄĜv:ÉÉÉõ]=Ņ€iȌ›€€€r_ždggOHH„„„üżļĒf³ÕØ»XmŅøä’KXæ~=›6mŹ¢õ½{÷&33ÓõłŒ32dPÖeōŁgŸeŌØQ•ŅkŪ¶-‰‰‰ÕNģē-OžźĆ×r{Ŗ·ŗhŪŽņą­.|­k_óč~ź¢:•””0wī\RSSYµjC‡õz^*Ŗi=_vŁe<÷ÜsüźWæŖņó#FšņĖ/Wy­×å}£bśR^oĒß±ckÖ¬į?’łß|ó ;wŽėźQīóV­Z™õėכģģl3tčPÓµkW3dČóĆ?˜_’ś×fŲ°a^÷sē- wī“_cĢŅ„KMæ~żLÆ^½L÷īŻĶ;ļ¼ćŚvŃ¢E0?żō“1ʘU«VĄ|żõ×U–÷¹ēž3mŪ¶5=zō0>śØiß¾½k²¬/æüŅōķŪ×ōķŪ×ōė×Ļ,Z“ČS6aXćʍĶE]d.ŗč"óź«ÆzĶ—ÆõQŪücĢG}dŗuėf:vģhʍgŽ?nŒ1ę‰'ž0­[·6IIIfƌ¦uėÖ®Iݜœ9ęäɓ®×111®‰HkS6÷¶tāÄ óŪßžÖtėÖĶ$%%™^½z™{ļ½×5‰PiŅSw~~~•>÷VžŹ]QUõVmŪ[¼ÕEuķ»¦×Žū9š–vMŚĆöķŪMóęĶĶĆ?lś÷ļo:vģčŗ¼—Ķ›7›ÄÄDŸŹPq[cŒIII1€Ł²eK•mäóĻ?76›Ķ,_¾ÜS~BŹźźµ&÷Šuź­ŗótüɓ'›™3gcŒyųį‡Ķõ×__m{J«b½UœČšl^óUWĒīyõõ{ؾŚ@Åļ$O×zuyÆźžć^öŠł÷ŌÖ¼§ŗū `vļŽ]nß-[¶˜vķŚ™GyÄōļßßt芔\ūóT^Oēæŗ<Ō¶mxŖC_ŪLm®e_ļ½uu ×äŗ=ļ®ŗ¾ŽĻÖµX][õtœŠ×°Æß[ÕåŻ˜_ž¤Ŗ?,łŸĒå—8©jRRR¹k’Ų±cęöŪo7÷Ž{Æ1¦ģš2dˆYµj•«½1Āäēē›}ūö™>}ś˜·ß~ŪcĢŽ;LRR’9xš ÉČČ0½{÷6yyyåÖ ĶÆżkóÅ_cŒÉÉÉ1×]włōÓOM~~¾>|øė÷ś>ųĄŒ7Ī•·Q£F™µk×cŒÉĢĢ4ƒv]7n44ĒŽ3»wļ6ƒ 2o½õV„I÷嗇sdRÕŚōM“¹-P6ģƹžŹT0„žŹhˆŪė`·mœŪcī««ˆˆČ™°cĒ.¹äWO¦³eŃ¢E<üšĆ¬^½ŗ¾«ąŒ«Æ:–†ēž{īįŽ{ļõičųN×pĆe*ō3Uō3z‘ÕĒ¾Ææ8“iwODz,,‡EPhøĒ²=¼Ė*›Æęƒ9søėž‡ĻVµÖZß¾} Ąn·cYEEE\qÅÜ}÷Ż4jŌˆÅ‹óĘo0oŽ<×>&LąĪ;ļ¤E‹L˜0%K– Ą¤I“øį†0`—^z)ß}÷®õĶ›7óč£ņå—_V›·}ūö1qāDVÆ^ŻngōčŃüķo£wļŽ,Z“ˆ7Žxƒ?üеż5×\Ɣ)SøšĀ ¹öŚkłöŪoiŌØQ}W±œ&›ĶöPZœėł§Ös‚SƝėĪ튁R·Ąø->Ó"""ē°éÓ§óå—_ņĮŌwVDĪ+;vģ iÓ¦õ 9Gä–Ķ}c, Ėr”J,–£vCœĻ/æü2=zō ¤¤„ &Š­[7W !33“””ʎ[n÷¹‘Ü'onÜø1999uģŲ1Wš¤"˲xõÕWłžūļ ¤øøØ:PUńA P6Q³sr뀀C¤N) ""ā£Ž;žõ’zΜ9“™3gÖwŃϚśØci˜.\XßY8/é–_Ŗu«–{üģĀŽ]ź;{§% €;™3g2jŌ(5jDLL \pļæ’~„ķ“ ēääø‚"999Mš4!##cL„ ’—.]ŹĀ… y’ż÷‰ŒŒd×®]Lž<¹ŹtbbbŹ=h~ž0ؓ ŌEÜiRUiŠ¼Üćr>5jńńńĢž=€~żś‘ššźšÜōšįĆLœ8‘'Ne‡Ļ>ū ({ ̾}ū*=vŁ]Ļž= d޼ycČĶĶåę›oęƒ> ''‡ššp7nLaa”k2`ēd¬®ćöķŪ—ōōtׯėׯ'==¤¤¤ś®B9O©‡ˆˆˆˆˆˆ4hēćw6›»īŗ‹©S§2~üxZµjÅĢ™3yžłē9yņ$žžžL™2…ˆˆ²³³ńóóĆf³qĶ5א——ĒŻwßMBB‚Ē' ńĀ /0sęLŽzė-üüüøä’K˜0ałłł|łå—Œ3†ųųxī»ļ>’““¹żöŪy÷Żw;v,?ž8ļæ’>o¼ńĻ>ū,3fĢ °°f̘ATT”k،H]ҤŖuąČ‘#\pĮµzT¢' `ŊģßæŸ=zpüųń_lYźĖ‘#Gh×®¹¹¹uR.ē99ŸźHDDD¤.üŅ'U]»ā;e»°c—_ܤŖ§c’žż\{ķµ¬ZµŖ¾³"ē1MŖz‰/7Ńé:yņ$GŽ9/Źr®8Żr¹Ÿ“óµŽDDDD*oCcŽŽ_ߣ;ė< DĪ7šCÄ͆ øą‚ ʽéšXčńǧgĻž$%%Ń­[7īæ’~,Ėāȑ#„……ecģ.¼šB^~łeśõėGėÖ­łė_’źJļÕW_„sēĪ 4ˆüćt芁-[¶”;ęųńćIKKćę›oĄßߟ—^z‰¾}ūҼyóré}óĶ7 0€žżū3`Ą–-[@zz:͚5ćÕW_„oß¾$&&ņŅK/ńöŪo3`ĄZ¶lɌ3*ÕAMŹānīܹōģŁ“>}śŠ«W/¾ūī»:KcėÖ­“k׎æžõÆ$%%Ń®];žõÆUū™§r̟?Ÿ=zбcG&MšäĆč)īē¤bZ‹-¢_æ~ōė׏¤¤¤rć-}-»ˆˆˆˆŌŸ‚Üćäåd‘{<ƒœ¬tŽg¤‘u4…Œ“ƒõ59ƒŌCÄG+W®äć?fŻŗuųūūSRRĀ£>Źžżū umēēēĒ”C‡`ÕŖUĢwß}ĒĄILLąü£OŻŃŒ1üīwæ E‹®ō–,YBÆ^½čڵ+Ż»w§cĒŽ|ūķ·®|Üxćōčу‚‚®æžzZ·nMHHGõzlOeqFFF­Zµąā‹/fĻž=X–UgiųłłqĆ 7øŅ0`Ė—/Æö³Ŗ|õÕWōė׏ųųxl6óęĶcśōéÕę”*_ż5={ö¤cĒŽ“k׎^½zńĶ7ßų\v9ūŌCÄG:t`ńāżōŅK®”&·Ür >ų`„mĆĀĀŹõś°Ūķ8222ˆ‰‰q½āz¶·7”””ųłłUJ/==U«VUzVQQøņÓøqc×vžžž8ÆĒöTwĘyä¾łę‚ƒƒ]Ÿ; u‘Fdd$®ķ£¢¢\³\{ū¬*G­²Ž«ĖCUŅÓÓ]ĻEwЉ‰qš|)»ˆˆˆˆˆˆœ} ˆøńóó+÷Ēoiii¹É3{öģɛo¾ Ąž={˜„Yīi1'Ož$##£Öł'))‰Å‹WśģtŅ­©>śˆ °bÅ BBB8rä͚5«Ó4Ž/{šŻ^Ö©);;ŪˆšöYUbcc«¬ŸŚ”£iÓ¦;v¬RŻĒĒǟµś‘šÓ7‰‰‰;vŒŌŌTfĻžķŅ2ž|žzź)×¶mŪ¶%11Ńk Ą?üąź=šę›oXi»€€ŸézÉ%—°~żz6mŚ”õV读·×ŽgBvv6ńńń„„„PZZŹß’žwl6›k¢ŅŗH£¤¤„¹sēššŹŖU«:thµŸUeŌØQ®9=næżvyäÆyštN.¹ä6lŲĄŽ;Ų±c7ndäȑgõˆˆˆˆˆˆHĶ( ā&::š‡zˆĮƒÓ·o_rssiٲ%‡ƒ‘#G²gĻŗwļNß¾}éÓ§^x”kŽ_tźŌ‰{ļ½—2lŲ0‚ƒƒ‰ŽŽ®4łgėÖ­iҤ ƒ ņš^LL óęĶćÖ[o„wļŽŒ=š»īŗ«Ü°œ³įšk®”°°nŻŗ1räHʏĻÆ~õ+ʍWgi$$$°cĒ ĄČ‘#yöŁgiٲeµŸU%!!×_1cĘŠ©S'ŅŅŅøēž{¼ęĮÓ9‰eΜ9üę7æ”_æ~üö·æeΜ9ÄĘĘz-oii)6›Ķõ#9»lµÜĒę¶ÆæŪĮ@ „Zw¾vŪƹ}1ę¾ś®Œ3­ØØˆļ¾ūŽįƇćļļϦM›ųõÆĶ”C‡\Ć=¤²;vpÉ%—’’R£ĻDDDDäģØų €Ŗąéaõ±ļė/ĪdŚŻÓ±, ĖaaY,ĖĀX?Æ[–ćŌgeėĘ>˜3‡»īøžk»zyyy¼öŚk,[¶Œüü|l6­[·ę–[n”oß¾õ=l6Ū @!Ptjq®ēŸZĻ N½v®;·+JŻć¶ųLsˆœE|łå—Ü}÷Ż„„„`·Ū™;w®‚!"""""Rgž~śiJJJxēwˆŒŒÄįpšõ×_óÉ'ŸŠ«W/üżżyź©§ųÕÆ~EļŽ½«MÆ&ۊü’( rŁl6žńŌw6~q:vģč±ˆ·ĻDDDDD¢µk×ņŲc ”=ś(O?ż4<óĢ3<öŲc,X°€ńćĒóÄOT¹­7›7ofžüł¼ūī»ĢŸ?ŸwŽy‡={öøžī(r®Q@DDDDDDä<ҼysŽzė-ę͛ǕW^IJJ ·Żv<š@•½5BBBXŗt)]»v ))‰””,ĖŖŃqĆĆĆÉĖĖć“O>įŠ”C4nܘ3fŠŖU«ś®‘*i‘óPėÖ­iŻŗ5×\s {÷īåŗė®cķŚµ$%%•Ūβ,^}õU¾’ž{)..ØńP— .ø€×_yóęńŽ{ļpÕUW1eŹ=HBĪI ˆˆˆˆˆˆˆœēŚ“iCTT'NœØōŁŅ„KYøp!ļæ’>‘‘‘ģڵ‹É“'W™ŽŻn/×s$''§Üē:uāŃG`ļŽ½LŸ>ųųxƌSßU R‰Āt""""""ē‰ƒ2zōh¾žśk ČĶĶeöģŁÓ§O\Į‘œœĀĆĆiÜø1………Ģ;€üüüJŪĘĘĘbY;wīąæ’żÆ«÷ĒēŸĪ_žņŠŠŠ€²”;‘‘‘šTUĪY ˆˆˆˆˆˆˆœ'Z¶lÉc=ĘĒ̘1c2d×\s ūöķćĶ7ßt=ŠwģŲ±<žųćÜrĖ-Œ5ŠˆˆƌĆŌ©S¹ęškčŅ„ ·ß~{„m#""øå–[˜6m'N$>>žąą`,ĖbĈ„††2aĀ®øā ®½öZzōčĮå—_^ßÕ"R%[-÷±¹ķėļ¶A@0„a§ÖÆƒŻ¶qndŒ¹Æ¾+CDDDDDj®b€Ŗzxź%Pū¾žāL¦Ż=˲°–åĄ²,Œõóŗe9N}V¶nŒįƒ9søėž‡ė¹¶E~łl6Ū @!Ptjq®ēŸZĻ N½v®;·+JŻć¶ųL=DDDDDDDD¤ĮQ@DDDDDDDDDDDDDDDD¤ĮQ@DDDDDDDDDDDDDDDD¤ĮQ@DDDDDDDDDDDDDDDD¤ĮQ@DDDDDDDDDDDDDDDD¤ĮQ@DDDDDDDDDDDDDDDD¤ĮQ@DDDDDDDDDDDDDDDD¤ĮQ@DDDDDDDDDDDDDDDD¤ĮQ@DDDDDDDDDDDDDDDD¤ĮQ@DDDDDDDD’śĪ€ˆˆˆˆˆHCUXXČ;ļ¼ćzm³Ł ”Y³fōģŁ“čččśĪā/άY³ꦛnŖļ¬Č9N=DDDDDDDź™Żn§k×®tģŲ‘F‘œœĢüłó9tčP}gķ¬9|ų0³fĶ"??’“ö4h}ūö­ļāČ/€zˆˆˆˆˆˆˆŌ3čz½eĖ~üńG–-[Ęu×]‡ŸŸ_}gńŒ;pą@ģÓ„K—ś.ŠüB( """"""rŽéڵ+Ū¶mćųń椧§“@QQė֭楁äēēJbb"}śō!$$€¼¼ļ¾ū.QQQLœ8Ńu¬·Žz c æūŻļ\Ū$$$ЦMÖ¬YC@@Ɔ #??Ÿ+V0`ĄŚµk@qq16l`’žżäęęB‹-HJJ"((c ³gĻ&22’!C†°|łrNœ8Add$ƒ&..Ž ––Ą»ļ¾KŸ>}čÕ«©©©¬]»–ĢĢLl6qqq 8ČČHūT2S]½ł’?9?iȌˆˆˆˆˆČ9(&&€œœ,ĖbĮ‚l޼™„„† BĖ–-پ};_|ń–eaYŸž9ÉÉÉt芁~żś‘žžĪēŸNQQ‘OĒtöD9~ü8)))“hтÜÜ\~ųįvīÜIŪ¶m)((ą‡~Ą²,Œ1üļ’cćʍ“oߞĖ.»Œ^½z‘œœĢ¢E‹€²yQģv;¬\¹’Ö­[“@FFK—. oß¾„‡‡0|ųpڵkGQQ‹-"++‹aƆѻwoRRRX²d‰Ē}*ņ„Ž|ɟœŸŌCDDDDDDädŒŹ‚‡&++‹øø8† @»vķČĢĢ$--#GŽ`YŁŁŁ4oޜ>}śeĮ”ķŪ·“’’B³fĶŖ=¦ĶfŹz}Œ1»ŻĪ¾}ū8~ü8—^z)¤¤¤püųqņņņ8yņ$ÄÄćeY„‡‡Ó²eKvļŽĶ‘#GˆĒf³QTTİaƈŒŒÄ²,žóŸ’““ćźÉ@bb"”””Ü|óĶc°ŁlX–ÅśõėÉŹŹĀ²,ūøó„ŽŖĶŸó8r~Q@DDDDDDäcŒ!##€ˆˆ233ˆŒŒ,·]DDiiiäääøŽkŌØ‘k½’žōļß F“•†††āļ_öēb`` DDDĀńćĒq8®4³³³łņĖ/Ė„įļļONNńńń®×ĪüŪķvBCC)**¢“““Ź€ƒeY¬\¹’}ūö‘ŸŸļ 9ėǹ¹¹ÕÖ[BBB­ņ'æ| ˆˆˆˆˆˆˆœc¶lŁBNN7&..Ī5äåųńćå¶ĖĪĪ ,,ĢõŽÉ“']ė6l`ŻŗuōķŪ—öķŪe˲°ŪķdggSZZZėI[Ē‹‹ćŠ+®ØÓ:Ųŗu+[¶l”mŪ¶ 8???Ž{ļ=JJJ|NĆņ„ޤįQ@DDDDDD¤ž•––ņć?bŒ!++‹““4üżż:t(P6$$::š£Gņż÷ßÓ¬Y3RSSIOO'::šÄÄDŒ1DDDpųšaÖ¬YC£FŲ“iv»Ö­[Hxx8'Ožä«Æ¾"66–T£ ƒ»ųųxbbb8rä?üšĶ›7wM²jYW^y%ĮĮĮ>„å쑲iÓ&Ś“ićŹS^^ū÷ļgß¾}®¼&''Ó®]»JūTœÕ—z“†K‘zfY[¶l 88˜Ö­[Ó«W/×ÄŖv»±cĒņÓO?qšąAvķŚEXXŻŗu£WÆ^ŲķeĻĖøģ²ĖXµj;wø˜øø8ś÷ļļź 1bÄ~ųįRRR8yņ$ƒę»ļ¾óyŅՊl6—_~¹ė)3;wī$ €ųųxśōéćs0Ź—{üųqvķŚEhh(]ŗtįȑ#9r„“'OŅ£GŗwļĪwß}ĒŚµkiŻŗu„}*D|­7i˜lµÜĒę¶ÆæŪĮ@ „Zw¾vŪƹ}1ę¾ś® ©¹Šó9T5惧9źcß×_œÉ“»§—=™ÅaaY޲'¦X?Æ[–ćŌgeėĘ>˜3‡»īøžk[ä—Ļf³½E§ēzž©õ\ ąŌkēŗs»b Ōm0n‹Ļ‘Gip‘Gip‘Gip9Œ9’ &TłŁäɓ9rd½ä+33“>}śŸŸ_ŸÕ#⢀ˆˆˆˆˆˆČy&//]»v•{ļąĮƒ?~¼¾³&rĪP@DDDDDDä<Ó·o_¾üņĖrļ-^¼˜Ž½{×wÖDĪ ˆˆˆˆˆˆˆœg†ŹW_}…1ĘõŽāŋ2dH¹ķ/^Ģ„ ;v,“&MbŻŗu@Yo’įƇ³pįB&NœČØQ£˜5k»vķbąĄ®4}śō!55Õkš"ēDDDDDDDĪ3mŚ“!44”Ķ›7°wļ^l6mŚ“qmSPPĄ3Ļ<Ćc=ʂ ?~_ŗt) .äż÷ß'22’]»v1yņäjÓ­qFSŪ4Eźƒ†Ģˆˆˆˆˆˆœ§.½ōRŽxćJĆe ,Nćʍ),,dīܹäēē{M366˲عs'’żļ±Ūķ§•¦H}P@DDDDDDä<5jŌ(233¹ä’KŖü,""‚1cĘ0uźT®¹ęŗtéĀķ·ßī5͈ˆn¹å¦M›Ęĉ‰'88˲j¦H}°Õr›Ū¾žnK !@(vjŻł:ŲmēöAʘūź»2DDDDD¤ę*ĪQÕ|žęØ}_q&ÓīžŽeYX Ėr`YĘśyݲ§>+[7ĘšĮœ9Üu’Ćõ\Ū"æ|6›ķ (:µ8×óO­ē§^;םŪ„n €q[|¦""""""""Ņą( """""""" Ž""""""""Ņą( """""""" Ž""""""""Ņą( """""""" Ž""""""""Ņą( """""""" Ž""""""""Ņą( """""""" Ž""""""""Ņą( """""""" Ž""""""""Ņą( """""""" Ž""""""""Ņą( """""""" Ž""""""""Ņą( """""""" Ž}g@DDDDD¤”*,,äwŽq½¶Łl„„„ЬY3zöģItt“ė³Y³fĢM7ŻTߣ®ē[yä—G‘zf·Ūéܹ3‡ƒĢĢL’““Łæ?£G¦E‹ 4??æśĪj­>|˜… rĆ 7ś‹/œ©gžžž 8ŠõzĖ–-üųć,[¶Œė®»???ŗtéRߣ¬µTzļ—\9?( """"""rŽéڵ+Ū¶mćųń椧§“PiˆIjj*k×®%33›ĶF\\$22€¬¬,~ųį233 &))‰µk×rņäI~’ūßcŒaöģŁDFF2dČ–/_Ή'ˆŒŒdšąĮÄÅÅPTTÄŗuė8pąłłł„††’˜˜HŸ>} ąŠ”CüōÓOdggcŒ!::š>}śŠ¼ys,X@ZZļ¾ū.}śō”WÆ^•Ź“——ĒŖU«HKK£øø˜¦M›2`Ą¢¢¢Ŗ=†HmhRU‘sPLL 999•>+**bŃ¢Edee1lŲ0z÷īMJJ K–,Ąįpšå—_räČ:tč@ļŽ½Ł¾};yyyŲķeŚl6ģv;¬\¹’Ö­[“@FFK—.Ą²,,XĄęĶ›IHH`Ȑ!“lŁ’ķŪ·óÅ_`YÅÅÅ,Z“‡ĆĮ°aĆ6lĘ–-[Fqq1}ūö%<<€įƇӮ]»Jå±,‹Ļ?’œääd:tč@æ~żHOOēóĻ?§ØØØŚcˆŌ†zˆˆˆˆˆˆˆœƒŒ1UγÄĶ7ߌ1›Ķ†eY¬_枬¬,,Ė"==ÜÜ\š6mźŠ“˜˜Č{ļ½W.=›ĶFQQƆ #22˲ųĻžCNNÅÅŤ§§“••E\\C†  ]»vdff’––Ę‘#GˆŒŒÄCAA'Ož$..ޱcĒāļ_öēfÓ¦M tåĮ9‡ˆ»ŌŌT²³³i޼9}śōŹAŪ·o'%%…f͚y=†HmØõˆˆˆˆˆˆœcŒ1dddQés˲X¹r%ūöķ#??ßwŠˆˆ --œœ>|8ėÖ­cåŹ•@Y§C‡ 8ŠÕ#Åēq5jäzÆ’žōļßßõśt!R‘"""""""ē˜-[¶““Cćʍ]syøŪŗu+[¶l”mŪ¶ 8???Ž{ļ=JJJ\s{ø·ÉĖĖ£“““FOvq(Ž?^īżģģl ,Če½FڵkGaa!ĒŽcćʍlŪ¶„„Ś“iSķqœéœ}śŠ£GśĪšČ9A‘óP“&Møģ²Ėź;"ē,=¬YDDDDDDDDDDDDDDD¤ĮQ@DDDDDDDDDDDDDDDĪųĆxķµ×ŖüģÕW_åųCŅĖĢ̤OŸ>äēēšōÓO3zōh,ĖŖQ:}śōaŪ¶mg„Üó\1’µ-·œŸ9O\qÅ|žłēcʽoŒį‹/¾`Üøq5J/**ŠE‹‚eY|śé§¼öŚkŲķg’OɧžzŠŸ~śé¬¤ļ^n9) """"""rž9r$ĒgƆ åŽ_æ~='Nœ`Ĉ5JĻn·ƒĶf£ØØ‡ĆADDD½”-99ł¬„ļ^n9) """"""ržfŌØQ,\ø°Üū .dōčѰvķZn¼ńF®¾śjnŗé&WeŪ¶m\vŁe<’üóL™2„ÜŠ‘|€[o½•ß’ž÷¼óĪ;åŽ1oŽcāĉ^óęļļO^^ééé|ųį‡üóŸ’ä7Ž ''‡Ķ›73ž|Ž}÷]ęϟĻ;ļ¼Ćž={8xš Ó§O'""‚G}”§Ÿ~š‚‚žyę{ģ1,XĄųńćyā‰'¼ŪŪ>Ów—••Å}÷ŻĒōéÓłļ’ĖC=ă>HFF†×ņȹO‘óČE]Dtt4Ė–-ąŪoæ%66–nŻŗ°zõjš6mJß¾}čŪ·/QQQ¬]»›ĶFaa!'N$<<Üć1†ŽĆį`łņåģŽ½›ōōtŸ†äX–Åųńćčܹ3v»£GN^^Ÿ|ņ ‡¢qćĘ̘1ƒV­ZUJ#$$„„K—ҵkW’’’HIIń:ŁkmöX³f ńńńōźÕ €īŻ»“˜˜Čڵk½–GĪ}žõ©[ĪÉUGÅēŸĪŲ±c]Ÿeff’’’Rī=€¼¼<hŌØ‘×ōķv;&LąĆ?äā‹/fĮ‚Œ7Ž€€Ÿņēl±ŪķX–Å\ĄėÆæĪ¼yóxļ½÷øźŖ«˜2eJ„I\-ĖāÕW_åūļæ'00ŠÕ¦ād²§»³¾¢¢¢Ź½IVV–×ņȹO‘óĢå—_άY³8|ų0kÖ¬į‘Gq}Ć\Ąūļæ_iæäädŸ'?~ĪśŹĪĪ.÷^vv6Mš49ķņJżŅ‘óLll,}śōįoūżśõ#::ŚõYæ~żHMMuM(zųša&NœČ‰'jtŒˆˆFÅ_žņ:vģHBBĀiåłóĻ?ē/ł EEE4oޜČČHWŽ€€Wsrr§qćĘ2wī\×$ØU©n÷ōŻõķŪ—ōōt×ijėׯ'==¤¤¤3sņä¬Q@DDDDDDäī黋ŠŠāŁgŸeƌŒ?ž™3g2cƌJĆh䗧6U¶¹-P6ģƹA@0„a§ÖÆƒŻ¶qndŒ¹Æ¾+CDDDDDj®ā UĶÉąiž†śŲ÷õg2ķīéX–…å°°,–ea¬Ÿ×-Ėqź³²uc Ģ™Ć]÷?\ϵ}nŁŗu+<šŸ~śi„y>D<±Łl/…@ѩŹžj=(8õڹīÜ®(u[ŒŪā3µX©±¼¼<žńpć7*"æHjµ""""""R#o½õcĒŽ„C‡Lœ8±¾³#R+zʌˆˆˆˆˆˆŌȔ)S˜2eJ}gC䓨‡ˆˆˆˆˆˆˆˆ48 ˆˆˆˆˆˆˆˆHƒ£€ˆˆˆˆˆˆˆˆ48 ˆˆˆˆˆˆˆˆHƒ£€ˆˆˆˆˆˆˆˆ48 ˆˆˆˆˆˆˆˆHƒ£€ˆˆˆˆˆˆˆˆ48 ˆˆˆˆˆˆˆˆHƒ£€ˆˆˆˆˆˆˆˆ48žõ‘_Š£GÖwD¤ŽØ‡ˆˆˆˆˆˆˆˆ48 ˆˆˆˆˆˆˆˆHƒ£€ˆˆˆˆˆˆˆˆ48 ˆˆˆˆˆˆˆˆHƒ£€ˆˆˆˆˆˆˆˆ48zʌˆˆˆˆˆH=)..ęóĻ?Æō~pp0Mš4”sēĪ„††Öw6O»\6›   š4iBūöķiÜøń=žgŸ}†ĶfcģŲ±õ]rS‘zf·ŪiŪ¶-mŪ¶„M›6“’’ĀŠ+0ĘŌwö*9vģŸ|ņ ………>•«U«V„„„’’Ā·ß~KzzzK¤¦ŌCDDDDDD¤žłłłŃ­[7×kc ‹/ęäɓœbbb¼¦a³Łź¬żHķ( """"""riŪ¶-{÷ī%55•cĒŽė rDGGsńÅW¹ŸóÉ-yyy®÷vļŽĶŽ;čܹ3‘‘‘Õ¦q¦ķŻ»—¼¼<ĀĀˆŠŠ"99™äädš7oN·nݰŪķ,Z“ˆŅŅRiģ۷ϧ}JKK),,tõ*ÉĶĶ $$ħ4Z“hA‹-(**āųńćģŁ³‡}ūöѤIŸĪGui$&&ÖĖ9Ÿ) """"""rńóó£S§N¬_æžĶ›73|ųp¢££‰ˆˆ 33“7ēšŌÓĆŠ”CiҤ 5āŲ±clß¾vļŽĶf#11‘   jÓ ō9{öģ!11Ń5QiEιQœ=C233ńóó£WÆ^®DAAiii¤¦¦@ii)‡¦E‹•ŽåĖ>PÖ㧟~¢eĖ–?~œćĒJtt4™™™^Ó aķŚµ4iŅĕžæٟĻĮĮĮ>œœÖ¬Yć1 © ˆˆˆˆˆˆˆœcZ¶lIrr2999ģŪ·6mŚ0hŠ ×SM8€ææ?111tźŌÉČ8p [·nåĄ”””E×®]]€ū’†/Ś“iCnn.$88Ųc@Ä}n”ĄĄ@芔ƒkbÕÖ­[“™™Iff&yyy“oߞvķŚ±~żzvģŲABBB„cł²eYsĮ°mŪ6 ‰‰‰į¢‹.Ān·W›Ęˆ#øšĀ 9pą€k¢ÕFŃ«W/×°¢źź²I“&Õ¦!õ«6ƒ–ln ”UœK !@(vjŻł:ŲmēöAʘūź»2DDDDD¤ę*ĪõPÕÜžęƒØ}_q&ÓīžŽeYX Ėr`YĘśyݲ§>+[7ĘšĮœ9L¾łõ\Ū"æ|M›6}(ŠN-ĪõüSė¹@Į©×ĪuēvÅ@©Ū`ÜŸé±»"""""""Ņą( """""""" ŽęńŃ'Ÿ|RßY‘:¢€ˆˆˆˆˆˆˆ>žnŻŗįēē‡eYlٲ…ŌŌŌJŪ]~łå¬\¹’ĢĢLš4iĀšįĆYŗt)™™™DGG3pą@ž÷æ’yL/**ŠAƒqčŠ!bbbųńĒ˄߮];:tč@ii){÷ī­ļj–ó€zˆˆˆˆˆˆˆœgBBBųņĖ/łžūļéܹ31pą@6mŚÄ—_~ɦM›4h×¹B‚‚‚0`6ląĖ/æä§Ÿ~¢’žWŚöŲ±cÄÄÄŠ¤I²²²hҤ‰ėõŃ£G½¦gYńż÷ߗK;,,Œ=zšż÷ß³hŃ"üüüjö}żÅ™L»{:–ea9,,ˁeYėēuĖrœś¬lŻĆsęŲ¦c=×¶Č/ß5×\óPZœėł§Ös‚SƝėĪ튁R·Ąø->Ӑip‘Gip‘GO™ńŃŠ”Cė; "RGŌCDDDDDDDDDDDDDDDD¤ĮѐÅÅÅÕwD¤ŽØ‡ˆˆˆˆˆˆˆˆ48 ˆˆˆˆˆˆˆˆHƒ£€ˆˆˆˆˆˆˆˆ48 ˆˆˆˆˆˆˆˆHƒ£€ˆˆˆˆˆˆˆˆ48 ˆˆˆˆˆˆˆˆHƒ£€ˆˆˆˆˆˆˆˆ48žõ‘_Š7ÖwD¤Ž( """"""⣦M›ÖwD¤ŽhȌˆˆˆˆˆˆˆ48 ˆˆˆˆˆˆˆˆHƒ£€ˆˆˆˆˆˆˆˆ48 ˆˆˆˆˆˆˆˆHƒ£€ˆˆˆˆˆˆˆˆ48 ˆˆˆˆˆˆˆˆHƒ£€ˆˆˆˆˆˆˆœO<ńĒŽ //Ūn»“'O‘‘Į£>źqߜœžyꙶ.B­ģŪ·;mŪ¶yÜęwŽaūöķ>„—››Ė¬Y³|>ž±cĒųӟžÄĢ™3™9s&O=õóēĻÆ³ņ9žüē?Ÿ¹ LŸ>éÓ§óŠCqšąA¶nŻZ'åöóó#  NŹVŸüė;""""""r~źÜ¹3Ė—/ēā‹/fēĪŒ=šķŪ·Ó§OvīÜIß¾}1Ę0wī\Nœ8@DD×]w]„“ž÷æ’±wļ^q8Œ=š¶mŪņŽ{ļ‘››‹Ķf#((ˆ›nŗ‰={öšÕW_AZZmŚ“ĮCvv6'Nœą®»īĀßßæŚćΟ?Ÿ½{÷ņńĒsÕUWUy,??ærūää䐙™É AƒX±bŁŁŁDEEQ\\ĢģŁ³ńóó#$$„ĢĢL ,0T]^ xå•WxąŲ¹s'K–,!<<œüü|ņóó™6mš×…Ķf£eĖ–dff’——ĒŪoæM@@EEEÄĘĘ2iŅ$–/_ΦM›°ŪķDEE¹Ź½wļ^®æžz8vģo¾ł&<šĮĮĮõݼN›zˆˆˆˆˆˆˆČqį…²oß>œļ¾ū€ü‘!C†TßĶė“©‡ˆˆˆˆˆˆˆœÄĘƲcĒĀĆƱŪķDFF²sēNbbb $--]»vy¢qųšaZ¶lYéżōōtZ“hįzĄŃ£G‰‰‰!>>(ŽNTT!!!ūt\_ŽåĪįp°fĶ"""X¾|9ŁŁŁŒ;–ĢĢLš6mZn§źņZQBB6› €ššš*·IMMå¹ēžĆf³ΤI“ˆ';;›9sę†Ķfćĉ®żŻóēŌ³gO,X@QQ›7oęžūļ8/zˆ( """""""gL—.]X¼x±k¾öķŪ—{@^^“'O.·_NNŽk=11‘o¾ł¦RŚńńńåzG¤¤¤Š¦MŸņåéøY–åó±Ö­[G÷īŻ¹śź«]ļ͟?Ÿµk×Ezz:ĘRRRĪh½'$$p÷ŻwWzłņåt芁‘#G’——ĒÖ­[1Ę`·’<ˆÄYn???śōéüyóøšĀ ]Csī¹ēž3š’³ACfDDDDDDäŒéܹ3[·n„}ūöt芁-[¶Š¹sgśōéƒĶfć•W^aöģŁĢž=»\0ęF«V­xį…xłå—yłå—Łŗu+IIIX–ÅkƽĘkƽ†Ćį oß¾>åĖ—ćFGG“‘‘ĮŪoæķÓ±–.]Ź€ʽ7`Ą¾łęśõėGjj*/æü2o½õ®@ÄŁŌ­[7V­ZÅo¼Į§Ÿ~JļŽ½łč£<–`芔üųć®”@%%%LŸ>ż¬ē½®Łj¹Ķm_·%‚ ;µī|ģ¶sū cĢ}õ]"""""Rs’Ø«źÓ©Ņāŋٸq#æłĶoź;+uN©ŅčŃ£=zt}g挩""""""""Ņą( """""""" Ž†ĢˆˆˆˆˆˆH:vģO>ł$Ķ›7/÷žW\AĒŽė;{^åęęņžūļsė­·ÖIzļ¼óIIItźŌ錻$-•¬7^ĆæiS×{Į;ҧ/9Ÿ}Bä¤ėk”^ń¾dņ׬&ņšėʽoåēÕ*½s‘"""""""Rēøļ¾_ŽĆD5jTgĮ³}ģ€ÄęDO©¼æĻĮ‹’Ž8—ČÉ7`³U~0­=4켆€"""""""r=óĢ3L™2…øø8Ž9Āæ’żoī»ļ>ęĪĖ‰'ˆˆˆąŗė®cłņålŚ“ »ŻNNN×_= ;vŒ7ß|“ūī»÷Ž{ÜÜ\l6AAAÜtÓMģŁ³‡%K–N~~>łłłL›6 ’*ć.''‡W^y…x€­[·²`Įl6ćʍ+×»%//·ß~›€€ŠŠŠˆeҤI3{ölüüü !33€;wņÕW_AZZmŚ“ĮCvv6'Nœą®»ī¢  Ąuģ;wVY†€€€Õ·•{’ģwß&ę¶iäÆų+?ŸF#GsņĖ…ųEEŚoĄĻe’ź Jąä— źŠGn9Ÿ|Œuņ$VqŃ7MĮ**t„W“{'¹Kæl„ŗ”Ą6ķź»yՈ"""""""RēRSS™9sf¹÷žüē?3hŠ V®\ÉW\ĮŠ+øųā‹Y³f ~~~ÜvŪmĢ™3‡õė×c³Ł°Łlüį`ķŚµ|÷ŻwLš4‰ü‘!C†°zõjģv;·ß~;sēĪeõźÕÄÄЕ•ÅŌ©S±Łl̚5‹äädrrrŖITT³gĻf’žż4uīb³ŁŖ,ƒ·!G%‡SȜõ²ėuhR‚.l’óėƒ9žžČ_ł#ŽćŁ„’źņrū‡öī‡##“š_]Nń¾d¬Ü<’ö÷`³q|ŽŠĄ?īē<ļŽEHĻ>wźŒćdN}7¹S@DDDDDDDź\BBÓ§OÆō~ß¾}yöŁg3f 7n䔇ā‹/¾`×®]¼öŚk•¶w zöģɂ (**bóęĶÜ’ż|žłē“hŃ¢Ü1=JLL ®!įįį“––ęń8U=z4}ō+V¬ąšk®)÷Yvv6sęĢ!,, ›Ķʉ'(..&33³\`#!!Įµ€ŸŸįįįDEEBqqq•uX± ŽT5dĘŹ=YīuŲš‘d¾ō}ś0oŽ<.¼šBˆ'99ٵ}JJ mŚ“ńxlOĒńäąĮƒ\żõģŻ»—%K–”›ßcłņåt芁‘#G’——ĒÖ­[1ĘEzz:ĘRRRź»ŹfYœür!Q×’–œĻ?#ś··øŲćš9¹ŅŌT"ʍ§ųąAņ–’‹›[D©s©©©Ģ˜1£Ü{III >œĮƒóüóĻóĄЧOöģŁĆ+Ƽāš#ćŚkÆ­”ꊔC¹’žūyōŃG]éķŽ½ŪÕć#,,Œ¾}ū²gĻž*óäé87®rūĀĀBžõÆa·Ū9rd¹ĻŗuėĘ{ļ½Ē¾}ū „wļŽ|ōŃGÜzė­¼žśė¼üņˁ1¦ĪźÕ²,žüē?óĻž³Ęūę.YDp—nuīBiv¹KŃhŌÆ\ŸūEDRš™Å‰ēŅ«wµé™¢B²žż6»°ƒė¬Œg‹­–ūŲÜöõw[ B°SėĪ×ĮnŪ8·2Ęüņ¦‘JģUõǟ§?ėcß×_œÉ“»§cY–òX–…±~^·,Ē©ĻŹÖ1|0g“~óūz®ķ†--->śˆiÓ¦ÕwVä44kÖģ (:µ8×óO­ē§^;םŪ„n €q[|¦"""""""rĪ[¼x17nä7æłM}gEĪ ˆˆˆˆˆˆˆČ9oōčь=ŗ¾³!ē{}g@DDDDDDD¼ŗ›hÅG ˆˆˆˆˆˆˆˆHƒs¦"g=Ā#"""""""Rõ‘G9×Õł=eFDDDDD¤ŽmÜø±¾³ rÖ]tŃEu‘ĢY›zćt"°­ŒŠˆˆˆˆˆüRŌц"r!3ĘĆ:>¼/""""""" “/±‚ZĒ4‡ˆˆˆˆˆˆˆˆœMēD§ˆ31>¼>'*@DDDDDDDĪ:SaßF˜Ō™3ŁCÄSP¤biŲ¼CĪHÜ ®"ž¾BA‘†ĮŌą³3/Øė"ž‚"Uõ 1؇ˆˆˆˆˆˆˆHCäːćeŸÓv:ŻuĻPU¤š÷=ZDDDDD䌶×s3ė; gÜ”C‡˜9s&‰‰‰®÷ŗwļĪÆ~õ«śĪZµöķŪĒĢ™3¹ćŽ;čܹs¦½k×.¾’ž{~÷»ßÕj’C‡ńŃGQ\\Lqq1Ż»wgģŲ±ŲķuÓߥSž8ĄóĻ?OóęĶ āŖ«®¢yóę;vŒ'Ÿ|’–-[PTTÄÅ_̐!C*„Ÿ™™É’żß’ĒM7Żä5//½ō!!!UÖÕēŸĪöķŪ±ŁltģŲ‘Ė.»¬&Å4xī,qŗ#P|V_ čé}«. """"""ā«»īøĘū¼šģ“õķkÕŖwß}·OŪ–””šę›orŪm·Õw¶Yŗt)“'OęŪoæ­ó€€Ķf«Õ~łłł¼śź«Ü~ūķ“hŃ˲xė­·Ų¼y3]tŃĻ_ėÖ­¹óĪ;²ĄĢ«Æ¾Źƒ>@BBÓ§O °°x Ź€Č7ß|Ć AƒŲ½{·×<üšĆó±wļ^’““¹ēž{ų׿žÅ¾}ūhŻŗµÆE4xŠĄYYr&"ž lUųé\9kŽgńyŪ‚üÜśĪnŁ“i[·nåŗė®ąĶ7ßäā‹/fƆ ģŻ»—?ž˜«®ŗŠ÷Ž{ÜÜ\l6AAAÜtÓMģŁ³‡%K–N~~>łłłL›6€€Wś–eÕz_€œœ2334h+V¬ ;;›ØØ(¶mŪĘ×_M£FČĻĻDz,n½õVJKKyūķ·  ØØˆŲŲX&MšĄ’ž÷?öīŻK`` ‡ƒŃ£GpāÄ žóŸ’““Caa!śÓŸš÷÷gīܹœ8q€ˆˆW9m޼™.]ŗŠ¢E ģv;·Ür‹×roŻŗµŹśnß¾}ņWQ‹-øč¢‹Ųøq#ķŪ·/W’$>>¾Źó?a¶nŻźµdff²råJ&L˜Ą×_]éó;vгgO×ė=z°cĒŽšD*Ę*ĘĪJ§‰ŗ ˆ˜ÓX©c`ƌ®×C† !44“ŹmLzz:W_}5+W®Än·sūķ·0wī\VÆ^MLL YYYL:›ĶʬY³HNN¦cĒŽ®tVÆ^]ė}¾ūī;† Ąˆ#X¶lW^y%6›¬¬,īøćģv;óęĶcõźÕ\|ńÅÜqĒ®żŸzź)²²²8rä©©©•‚ »vķ"77—;ļ¼»ŻĪ›o¾Irr2999ųłł¹zČĢ™3‡õėחūĆ?;;›˜˜˜*ėĻS¹ĆĀĀŖÜ~Ū¶m5Ź_HHH„4œu ššŹsĻ=@nn.ƒ Ŗu»y÷Żw™śˆV­Zy,·§ś®iž*JIIaÓ¦MŒ;¶\pĀ]IIIÓĶĶĶ%%%…;wRPPĄ±cĒųę›o>|øk›Ī;óÉ'ŸpńŰ~żzʏ_“Ć8(;pxšGÄŖš~E5ŽŌõ"ž‚ P9äp« ™‘z±jõŸõė›Tߣ«smŚ“į’ūƽöaaaÄÅÅaŒ!::šŒŒ Ž~ūmnŗé&vļŽķź-Fß¾}=öŽp—””Tė}—.]Ź7ŽXī½šöŪo3nÜ8BCCyēwČĻĻĒįp0nÜ8ŅŅŅxļ½÷Ų·o”””ōīŻ›>śˆiÓ¦±wļ^^xį×<%Ɔ «4g‰SŸ>}Ų³gƼņŠk›kƽ–ʍ»¶ ćŽ;īąĆ?tõnéŅ„ ½{÷ز܄„„UÖwēĪk”?ųłé;–ea·Ū¹ķ¶Ū #??ŸŌŌTfĪ,{zRii)­ZµråĖÉįpšüóĻ“——Gnn.3gĪäź«Æ¦U«VüłĻ柒ü'ćʍsmčŠ!/^ĢšįƱ,˵M«V­čŠ”3gĪÄf³Ń½{÷r½c|ąģį\ŖšK¤ŖŃ$u:ŗ¤vSė‚ūó„ü( ¬ų§– BOż v[+.ʘ§ė²`"""""rvc¼¾öō^}ķūś‹3¹ėž‡ĖMŖZUPäŅĖŹ†iĻ8BA~.̙äßüžģTŖT²}ūvÖ¬YSķ£båÜ׬Y³Ē€" ųŌOēzPxź§sÉ;õžs›bŹ‚(„”mRćŽuó äŸy›'Ä}xŒ£Āzé­m/*öq†ˆHs3ÜG”R>vąiŽ‘:SŪ€ˆ§n+ž!Ž*ÖŻƒ!šCDDDDDDź•3(¢`ȹ©S§NźržpT±øOÆQ10R“‰V}VWsˆT7Ŗ3RJYĘļŌOŪ©Ÿź!""""""õĪQ0DäŒ*q[J+,ī1„ŠA§:™‡“.'UuĻdÅį1„n?żNŚ9‰ŚĻe""""""R§ 9抳9 RĢĻĮ÷IÅ!5U=m擜N@ÄÓćw+DJO§˜Ÿ{…("""""""Ņ0•ņsP¤āϊ½E*Ī%RQ­ē©Ė"ž&OuFyœAgfŻ &"""""rV\Ō³/<ū$×^wĻū|0gõģUßY9_8Ÿ,ć „T Š8#ΘBÅ9EźÄéD*NlRUļ;å{†PaDDDDDDä¬éŁ«7PäšÕE={ѳWo 5ū”H]pŌnÅ^"{ŠT ©“§ĪŌv؊ū~Ś) ²ų@ą4£ŌqIDAT©×@Ūz€Ūēρ>w¦ćļ–¶ß©ÅFł@K]?>XDDDDDDDŖfšü”ŁŠ#G܇Ą8{TģRZįżŠ½EŠ©Ü[Ä9æˆ{žj¤.Ÿ2cQœpžtf~ øgܽĀ*>™Ę¹?•ŸLć±»„o«p,©;¦ŠŸ’–ÆźA+Ź8¼?ŖzśŒ3=÷cž¶ŗ ˆ8ēqˆŲ*lSq2”@*G“*Vžņ=DœĮg0ς """""""gKUCW*ö1”ˆø;< ‘)vŪ¶ācx«›\µĘź" ā>ˆ3(āŽĖƒ*Žw/DÅĀ8+Ķłˆ^琕ŸRćķi5 ’ˆˆˆˆˆˆˆŌ ćåżŠA÷˜@Å®8{‡T „ø@*ö ©ŖŹiEźņ)3Py،ūx?Ŗ~TģER±ņÜ'fļĮADDDDDDDĪdƽ‡ˆ{÷ S#H*CźuČLŞīļ93j§ücq*nėTUæS…vŖ ”Œą! 9³QšÖŠV«]ėķ}J·÷ö²·Żmā¶Ūc{HŪķ¶ŚŻJ[[ŻÕ*­ÕV­ŠõVš/Q¹!ÜW2łż3†0€ šyæ^ób2yfę™g"2ß<Ļ÷ˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆ¬Bfļ tńś‘y:{WĄ{ģ """"""źŽģ0éČ „5ĪÅ Qēu½Ž Ų:ĄŠ–ć·§. ŁO{–īcÓąˆ­ ­Wf£}‰ˆˆˆˆˆˆČ~Z b茱ŸM#¶.ČŚ°]ÖĘ×Q"""""""²\[ƒŗ6¼oéyŚĢŚ…¶=d-l³ōxö¾f"""""""Ga‹ :‰÷ZŚfɱ®›5ƒ–ööhég{$¶ø"""""""’Ö–!ŗ~š{Æ„õÖĪo1kŚŅ Ä4b¼ĄĢė–źĖ@QĒkmh‹¹ ˆé“-@Ņҹ-ęd…hoOćEnf»¹c“t~"""""""ź-*LƒšB“2-CfRNfĮ~-²F@ÄX[‚ ʁ¹Éŗ¹ĄŠro"""""""ź–ä 1 ~Fė24’ļ'3óÓ*®7 ŅŽ”1¦…ŃŗipF?-Ķ'bÉūDDDDDDDŌ:Kr†˜K˜j ŃāZPÄ#0~ßÜ9¤‚"× ±vsĮ©@ˆńbik>"""""""źxRCe ‹qD~õµMŸė ļFtFe¬:å.p}K¦Ļ5^h 1ˆ8ż4Z>CDDDDDDD¶ÓZ"UĆŗqļĆb„4B’<Æ59†!"GÓ ˆU{‰Ų¢‡HKÉRƒ!ĘA'“×–öi©DDDDDDDd–Ģ •1B Ļų€łēv”…÷­ŚKĚӞĘĮ Óü Ę=C ‹3ZŠm Œ‘ķHĶ2#Õ;Dsu1}Ī7^7M“&Ē2NĀ*uĪvio@Äܰ©ą…i0Äģ0ˆ8ćZ@ÄɤŒqI*¹ŖŌk"""""""²sÓķJD Óg|ćųaĮ䘆\#r4…ęŗ‡ĶŲŗ‡ˆį‚ 9DŒćˆ3šEL“¬7{‰ٟé,3‚ŃOӀH£É~Ę@߃Äų9ß°Ÿ!0Xqź]kDä&ė¦Óé÷ö0&#µ˜DŒ§ą5MÖjŒ"""""""ŪkĖ4»†Ą†a10"ƒ>(bz\Ć 4†ć']m7k÷‘ŹbœD*oˆ¹Å8ˆ"‡t’V© ˆq}ˆˆˆˆˆˆˆčśµ4»ŒébŚ;ÄŠ0.c¬-?ćėLŽļ=D¤¦Ä5 †HBLƒ!.øÖ3D* bš^ŒėCDDDDDDDÖ„3³Ķ4bŽbÜCÄ0F*ēØa›ĶG‡˜žĆ8 rŻ V­=ķ®qĀ\®Ćŗ‹ŃOg£×¦³Ķ˜æ1ø0§QĒ1@ē 1ķb<Ż®ōōyDLŸéŸ÷M‡Ģ˜.VӞ€ˆĢĢ6Ćvć^¦½A\Šzī怈¹ ˆ¹a4DDDDDDDd;ęf“1 ˆē1žnד£ƒׂ%¦³ĪHõ<17l¦ĶCi¬CÄ\“ŸĶ‚ ‘‘‘ė­X""""""«ÉĢĢ”––Ś»*D]žL&»×ņ†˜ę1¬CŒóX­—ˆ5"ĘćHOkłBL"""""""r|®hŽcÄxŌ‡qo­DCÜAkįł$Y+ bųiūcn،‹Ńb:D†ˆˆˆˆˆˆˆŸ+šĻkH¦jšŒÕW0Ž\÷”»€ķ§Ż5Īb®g"DDDDDDD݇a”ˆéD)ĘłG ĮÓ8ƒ!Ču±V Ā4bŚCÄ80b:ė "DDDDDDD݇‹Ńŗq®ć@ˆ!–`:¬ęŗ‡ŹX+!—xm¼D¤¦ąe@„ˆˆˆˆˆˆØ{0Ž!NŠ:ŒÓp/ʬ2lF~½@óénåFŪ„‚"Rė ˆuNø+0U" 1žÄŘ̢3µĄ©ć™&F1Ncø@ƅ3 BDDDDDDŌ="‘›¬KĶ>c.(r]®÷`²¶g‰5½ ć^" X?0CDDDDDDD“q~C\Ąt” =%Ʊėź%bĶ@„ĢĢO㠈éOć‹· …B©S§ā™gžĮßžö7ÄÅÅį©§žĀ„  “]wšėņĢ3Ļą¶Ūn³kŚĀĖĖ«ĆĪ•œœ|]mćļļäädDGG7YļĢ,©ēc=†mŪ¶Ł»ŖDDDDķŅŠŠ€ŠŠŠė^*++”Ó]÷„DŌy˜v’šv¬0ī`aŚ;Äjö×3TEff›qōĘtŻpa¦Ń«D zč!„††bß¾}ųå—_ “É0pą@̟?C† Į·ß~ A°Ź”Åmö믿¢¶¶Ö.ēn„R „R‰ĀĀB{W…ˆˆˆˆŗ ŗŗ:\¼x>>>×uœ††#44r9;—9Ӟ Ę1ĢĒĢÅ!Ś1µę“»¦ė23‹i©Œ±ķ2}śt„‡‡ćĖ/æDff¦øżÜ¹sČŹŹĀ¢E‹0yņdģŻ»×J—Ż6ēĪ³ĖyŪ«°°‘‘‘ā:Q[įę›o¾®c444ąČ‘#ČČČĄ°aĆģ}IDtż Će¤F“H-€tÜįŗŲ*™©iäʒĄČu›4iŅŅҚC ŅÓӑ™™‰I“&aļŽ½xöŁgQZZŠÕ«W‹eīæ’~ųłłį“O>L&ĆĢ™3oooTTTąČ‘#Ųµk—Ų]ļwŽAbb"ʍ‡ŚŚZxxx“xĢgžyW®\Į?ü o”VĪńśėÆcß¾}Ųµk`ģŲ±øóĪ;±nŻ:¤¤¤nøįL›6 ’ūßmr#KJJ ĄöA'''¼żöŪøį†PXXˆ7ß|ĒŽČårüéOĀ’ųG”°°‰‰‰XµjU«Ż'ńÄO`īܹš÷÷Gii)vģ؁žóŸØÆÆ—ÜgŪ¶mX»v-¾śź+Ąžšüķoòe˰iÓ&Ą<€ūļæsę̱č‡ƻヒ˜˜TTT`éŅ„MĪéļļæžõƘ0ajkk±eĖŌÕÕŁ“͉ˆˆˆŗL™2J„iii1b‡ŠŁŁåĖ—QPP€ŹŹJōéÓ”””pvv¶tw9¤Ø̓-å1¼ß®_׈µņŚøāęf1ŌnžžžšņņĀ™3gĢ–IOO‡ææ?|}}qęĢōė×OĢ+"“Ɋ椧§f͚…éÓ§ć×_Żヒ-[¶`śōéøńĘÅćiµZLž<gΜĮŽ;Z=¦©ÖĪ‘••%# 44„„„ ·…„„H€¬„  Œ   ›n»ķ6$%%!66%%%xå•WÄ÷}ōQ,Z“Ÿ}öęĶ›‡?ž±±±xōŃG[=¾Š ąƒ>Ą¼yóš÷æ’sēĪÅ믿nvŸ£Gbųšįā눈\¹r#GŽ·9R LYrFƒ»īŗ ūöķĆæ’żļfēüŪßž†ĮƒćÉ'ŸÄ}÷Ż‡ŹŹJÄÄÄ͉ؓˆˆˆŗ’ˆˆŒ3éééhlläš";hllDzz:ŅÓÓQYY‰ĘĘFdggćüłóm9ŒTÆs=DL™ œ“Y{ƒČZX—Ŗ“ŌÉŃņE¶‰!hyy¹Ł2eeebٳgĻĀĆĆC|ČļŻ»7ÜŻŻ‘‘‘L›6 {öģĮ‰'PYY‰ŌŌTģŪ·S¦Lń ‚€ŠŠ lß¾ŁŁŁ-Ӕ%ēČĢĢDß¾}Å}œœÜ, rįĀ…ėm>³jkkQYY ĄöA‘““4lŪ¶ ēϟĒ/æü‚ššpČårø»»ć¾ūīĆźÕ«±uėV”””`ĒŽX³f ī¾ūn(ęSŠųųų`žüłųöŪo±k×.”””`ß¾}ųśėÆ1gĪųśśJīwōčŃ&Ż1Gü#FŒ·9ÉÉÉŸC«Õ¢øø+V¬ĄńćĒ›œ/00&LĄæ’żoœŒ   øøø@„RĮŪŪŪ¦=D@­V‹ė¶ ŠG«ŖŖÄ`Hpp0ÜŻŻqäȑ&åSRRąķķŠŠP³Ē4h Nœ8ŃdūéÓ§!—Ė1`ĄÉżŽ=ŠĄĄ@ĮĖĖ !!!Ųøq#ś÷ļwwwōģŁHNNnÓ9N:%y¾~żś@³NęŹugżū÷ĒĢ™3qźŌ)466Ś»:DŻBcc#RSSÅQaaa0`  E Ä\0—4µĆ¦‡ķØpjK=F¤Žo³ŠŠ 0ū?ØT*ś^$‚ ąüłóčßæ?öļߏššpœ9s:NģmņŲcIĒÓÓSüGæZ:¦)KĪ‘™™‰ššōķŪłłłØŖŖBqq1‚ƒƒįį၊Š [õfŁ‹T>™L†€€ĄŹ•+%÷ó÷÷7Ū3ČĆĆĄµĻ‡įµ‡‡n¼ńF¼÷Ž{ā{ƾś*vī܉ņņr >õõõøpįJKK‘““ƒaƆĮ××EEEøxń"ś÷ļßź9 ŖŖŖZ¬§iĪs剈ˆˆH’÷·B”°Ū,’DŻEEE222Ägœ”C‡ŠAĆk„R‰œœ”––āšįĆ;v,”J„¹CŹŚøn¶˜eĘt»¹hĢ•i—ņņrcųšįfg‘4h śxęĢÜ|óĶP(čׯÖ­[ąŚƒłžó\¹r„ŁqZJti,9‡N§óˆ‚€‹/.^¼ˆxxxŲ¼w€&yLrss;|ʙźźjĄÓO?-9üØŖŖŹģTn†€‚··w“ķ†ņ•••ČĢĢÄć?.¾—™™ N‡cĒŽaųšį'Ož Ö3jŌ(ØT*1ˆ%ē00—üĖXsss“<]“••…}ūöaҤIpwwGii©½«Dä° Ćd***ąģģܤGˆ±°°08;;#==µµµHMMŐ!Cš=']en"–ÖŹoæn¶2cÉŲ«õ18pąśõ뇔C‡6{oąĄ2döķŪ'n;sę ÜŻŻ1fĢ( œ={——FƒĄĄ@TWW7[ Co¤˜;¦)KĻ‘••…¾}ū",,L ˆäęę"88ŲęłC€k=Y ēµĒō»gĻžECCBCC”V«›-¦Å}5 """šl5j4 Ī;‡²²2¤¤¤ˆ‹!׌!ČčŃ£‘šš bVó#F 99Łās“&;;€žsjl̘1ŽŽDDDDŁŃ£G±cĒDFFĀĒLJĮ";|ų0*** T*1räHÉ`ˆAŸ>}0räH(•JTTTX’OÄ\RX°ķŗŁbČL{’œXåā ĆTī»ļ>ģßæ_ F 8S¦LAjj*>,–Ƭ¬D^^¦M›†ģģl±×F}}=<ˆo¼ČÉɁ‡‡fΜ '''|óĶ7fė`,=GVVf̘ggg¬_æ€>01{ölø¹¹Ł¼‡ˆæææxN{C ¦¦ėׯǣ>Š¢¢"œ8q¾¾¾xųį‡įźźŠ^xĮģ¾HLLÄż÷ߏóēĻćŌ©S1bxąlÜø±Ł0cGÅC=777,[¶ €> ņÄOĄĆĆCģ!r=ē0ČĻĻĒńćĒńŲc!//EEEX°`A³#DDDD]‰aöEk9}ś4N:…Y³fA”PˆĆŲ‰ČöFŽi®·G=zō€³³3jkk[*ߌh’Öf±µ kDŚ’ńÕź½Cżp„oæż&L@TT&L˜N‡ĀĀB$&&"%%„ِ…3gĪ`ƌĶvnٲµµµ˜7o¼½½QWW‡ .`Ó¦M­ÖĆÜ1MYrŽ+W®@”P ¾¾^Œ~ĄÕÕ555())±f6ćļļo×`ˆA||<*++±xńb”²²ÉÉÉųąƒZŻ÷ƒ>@ee%–,YaŻŗufs’œ={ĪĪĪØ©©‡5]øpīīØ@nnīuŸĆŲ믿Ž×_ńńńØ­­ÅęĶ›±fĶ<ņČ#vm{""""{Óh4HIIĮٳg1aĀ›’ LD×LŸ>½ĶūųłłµēT–ō±ŖöœĄ4*ćd“øpą@ ĄŻh1¼6¼ļj¼DFF¾bė‹„¶1Ģ&cļ`uM•••ČĶĶm2Kc{ŌŌŌ ŖŖ 'Nl’Ÿ­#zfsˆŃõ“ÉdńźŌż¬P @µŃOĆŗ”lŃ:£Åbœ“›ĢŖ­­µŪ8DDDDŌõ¹»»#88r¹2™ …¢ĶǐÉdP©TšõõåߦDŽÉęé5Ģ鈀H‡ —!ėć8DDDDt= E“$ż×Ć0³‘µŲj–"""""""¢¶ź°Ī ˆQ·Ć€u; ˆQ·Ć€u; ˆQ·ÓÓīŃuФ†®¼¼Õr28f—s·…󚔀JeÕc¶™ZĘSéö­C'Š)ī…0 BDDDDDŌÉU/yš½ūZ-ē4u |~žĮ.綈 ž’Šļą*œ§L‚&ķ4“9”M=Mj7’bļšu(ļĶį(²k—½kb¾~ †1 BDDDDDŻRcc­AŠĻ&£®­ ‚öź{śuNgļź¶]R,^lļš4Å`u ˆµŃŹ•+ķ]²³Ē{ĢŽU j]d¤½kŠƒ!Ō‰0 BDD6ÅG2å(’ŽrŌv™™™ö®B—·`Į‚6ļ#6lŲ`ļŖw~‘‘Ąż÷11@X˜½kÓƒ!ŌÉ8d@¤¦¦)))(**Bqq1 ˆŒŒ„»»»½«Hx߈ɀ’doźāüvļūĪ{ļć½÷?“÷%8ŒŸ~ś©Måo¹å{W¹óźĢAc 0BŠĆDöģŁƒōōōfŪ‹‹‹Q\\Œōōt :Ó¦M³wUɈį¾)•J8;;Ć××ŠŠŠ€ģģlŽ7ź–öīŻ‹oæżV|żę›o"((ČŽÕ"²«?ü.\ĄG}777ś’+^xįōė×óēĻLJ~ˆxS§Nµwu©“Rōló> _}Łīó={?žų#._¾ FƒĄĄ@̚5 S¦Lióq¬õł¶ę±Č>ä#GĀķŽ;įzĖĶ@p_{WĒ2Ļ=§ĻkŅÅĘ·Ž ¼õƒ6݈CD6lŲ ö,„R @uu5jkkééé(**ĀĀ… ķ]eµū¦T*!—Ė‚€€ś@֙3g T*yߨŪżōSąž{ī±w“!** gĻžEzz:ƌČČČ@cc#"##‚W_}ö®*ur×ÓS¤-Ŗ««ńĻž=zōĄ£> ™L†­[·ā§Ÿ~°aĆąėėk—ß³ü·Ņ5Aä]%b,&FŸą5>ŽŽ5ыŒž~Z_/ĆōÄŃŃĄC‰‰ö®u‡ ˆģٳ§I0<<<0nÜ8Ą‘#GĀ ŠŽ³g{Ų™ń}svvĘ AƒŠ§O;v 5j 552™Œ÷ŗ•ĄĄ@āüłób@ääɓųģ³ĻšČ#`ÜøqŲ¶m~ųįüå/‹‹ āāāƒS§N!;;˜;w.V®\‰ŠŠ üįĄM7Ż„ĢĢL¼÷Ž{˜3gŅŅŅPZZŠ3fąÖ[omR‡×_EEE€œœ,Y²gĻžÅŗuėPPP€ĄĄ@,\øƇGaa!Žxć Ģž=·ß~»ä5åä乊”C ö5jüüüģŻÜķ’ŸŸß’7ß|3JKKźŚ:«±cĒbķŚµHKK"iiiĖå;v,.^¼Ųä[ļóēĻcżśõø|ł2T*īŗė.Œ1Ƽņ † †ŲŲX466bńāÅŠétˆ‡‹‹ ¾łęœ:u /¾ųb«ŸkƒÄÄD,X°eeePž°¶‘¤¤$̘1YYYėĢŻć łłłØÆÆĒčŃ£1|ųpĄ°aĆÄ÷„~ĻīŁ³[·n…Z­F@@ī¼óĪ&ū˜ū|{óĶ7Q]]wßÕOūŚkÆĮĆĆwŽy§U’­¼ūī»Ų½{7¶oßµZ •J…›nŗ‰³Y‘Ļź’\{hļŹ–/öģ±_/ •Jßä¹ē¤‡©TĄĘ@\°l™Żš‰:†Üް†ššÉa2Z­ŽŽŽšöö†V«mö~zz:jjjšmĻÉÉĮć?Ždœó'Ÿ|‚œœ«Ö;''O?ż4–-[†æüå/ųōÓOQPP`ļęģ0¦÷M«Õ¢OŸ>P©Tpssƒ——zöģ‰>}śĄÅÅE,gī¾Ą”C‡šöŪoć½÷ŽĆ²e˰uėV›^Ć”C‡˜Ü‹: …BŲ½{7¢££1`Ą9rß~ū-n»ķ6ųūū#11ÕÕÕbŁäädÜwß}8p ¶lŁ‚K—.59ęā«ÓōMž<O=õŹĖĖń駟ĀĆĆ/æü2üüüšłēŸ£¬¬¬Mu3gf̘$%%5 XwFŲ°aźėėīŚŗ/// <iiiā¶““4 8ŽŽŽMŹVVVāÓO?…Ž~ūmŒ5 +W®DMM † "ž?öģYøøø@©TāܹsōšC† ±÷åš5}śt4662ŅōģŁ®®®ųõ×_ńż÷ßćŲ±cMžŽ1ż=[XXˆüƇĒ[o½OOO|łå—”Éq[ś|6lŹŹŹP^^޲²2”––6 šXćߏ•+W°fĶL:o¾ł&&Mš„7ŠĮ²G†¬_ßń×£t”•éƒ2­żžŒ‹V­r¬v§f" ’b&ŗŲŲŲµZ µZĘĘĘ6ķŪ»wolٲÅęuļŃ£–.]Š·ß~ćʍĆ?’łOÉąMgŃŲ؈÷ßß*Ē2m{CŠC§Óaāĉ˜8q"t:8F¼„}}—ŌuėÖį¹ēžĆ«Æ¾ŠW_}'Nœ@aa”ĶŚcĀ„ Xøp”UŪ…čz1QQQ˜>}:ż7ź£GĘ¤I“ Õj›üq…ššpDGGŠ’±kĢĖĖ €žß§——Ž?ކ†̚5 ĮĮĮ˜9s&qāÄ aŊ­~‹nnnP©T?~Ą=÷Ü 8555())irܖ>ßĘ =K²²²pįĀĄČ‘#->–„’V æϜ9ƒĢĢLL™2}ō‡ä“°0}°ĮÖ"#õĮ²2}0$&¦mūĒĘæżÖ¹ÕŅuqˆ!3†?ī 9C ’Łėt:ØT*ŌÕÕA«ÕĀÓÓĪĪĪP(bNsQ뀀899įāŋ iņަM›™™ AŠ«W/Üu×]8|ų0.\ø€{ļ½ÄHžć?ųß’ž‡’š8q"8€“'Ob̘1HLLÄłóē!“É‚;īøšūļæćĄĖåP©TX“h222pąĄń|Ÿ|ņ ęĪ‹ŠŠ =z—.]Ā­·ŽŠƒ¢¼¼/æü2”J„äõœ9s;wī„««+ ąé鉧Ÿ~ß~ū-._¾Œµk×āī»ļ¶Ź}3VYY 1RWW‡ŹŹJ‹ömhh€V«…N§ (yå•WZ¼o2™¬Mķ©T*ńĆ?ˆß®3¹¹¹Ø­­ŪåŅ„K˜7o† @’ĶÉ?ü€W_}õŗŚ‹ČR>>> ž;2tŻ7¼Öh4pvvnRÖÓÓ€>°ŲµZ ąZ Ä°_yyy»źźääWWWŌŌŌ ++ ™™™øłę›!“ÉšĖ/æĄĻĻĪĪĪ8sę ęĪ WWWüņĖ/8ž<œœ¤’ “Édō’'DEEįŠ”CP©T˜>}:vģ؁üü|h4dffā–[n““¶n݊œœ8;;C§ÓĮÅÅE,Ÿ——‡ńćĒ‹CcŒ{¬Yzmd]cƌĮ÷ß/•1 —1eų\~ņÉ'M¶—––ŠÉ,/\ø€ōōtLœ8‚ 99įįį žo«3fą„—^Bxx8V­Z…xƽöAĄĪ;ńÜsĻ™Ż×ÉÉ :ćʍĆc=†AƒaÕŖUb]\]]±nŻŗ&½¹Ö¬Yƒ>ś©©© !CšÆż ~~~ųņĖ/‘ OOOŒ9ß}÷|šA{ßĀN„¬(O2ųQV”gµsōļßĻ?’<źėėqžüylٲæ’ž; €ˆˆˆ&eėźźšķ·ß"== …BüRĻ4˜ÕŅēŪŲ€ąģ쌬¬,444ĄŻŻżśõĆłóē-:–„’V|||pŪm·aėÖ­ųņK}Ś#Fą‘G««« ļ uY¶Ź'¢R鏿ōÓś€ČõŠŒŽÓϐÓYĀR»9D@ĐƒĀ3ÄŪŪuuupssƒ‹‹ \\\šĒ?žQÜVQQ!ę1Ķ;b Óé0wī\lٲO<ń„ø=##łłłā3_~ł%Nž<‰‘#GāēŸ ’«¼¼‚ @«ÕB”P --Ķ¢©Āśöķ‹‚‚¤§§ćܹsxé„—}ōŅŅŅ R©°{÷n¼öŚkprrĀśõė‘””„ž=„³„Ėårąõ×_dž œœŒēž{_|ńĪ;ÉėQ*•8ž<Ž|óMxxxąwŽAvv6ęĪ‹üüüė†ß7­V‹3gĪĄÕÕUü6”ØØ§OŸ†““S“^>R÷Ķ××3gĪD\\ŒaƆaģŲ±P*•fæ›ŚS”PąĀ… xå•WŒ½{÷@“v9zō(vķŚ%žńŗ’~ń›z"K¬[·‡ʛo¾ 777q˜†‡‡‡Ø««Šž@„!ąhųip˜c®TTT4łi˜Ŗ­QWW„R‰ņņrø»»‹É°•J%*** P(ÄatÄ<'ĘĆ Pc½zõoōģŁžžžÉdŠh4āļč;vˆåkjjÄQß¾}įāā¹\ŽĘĘF1€ŌŽk#ėņššĄŠ”C‘žž¹\ŽĮƒK~v Ÿ×§žzŖIpC”P@.—#((§NĀ„K—0dČ‚€ 6ąŌ©SčŃ£G»ó€DGGĆŪŪ½{÷Fnn.–.]ŠgžyėÖ­Ćŋqēw¶zŒ3fˆĒČÉÉė’Č# 88øI@äĉčŁ³§8ÄĒŠ3ņ•W^ACC&Mš$–µöš_Ga±f0Ę««+†.žme¼€ķŪ·#99/¾ų" „’żļM~W“ōł6fČіŚŚZ 6 r¹ÜācYśoE§ÓaöģŁ˜5kņņņœœŒ-[¶ 99¹Ķ³éP7²|9püøu 11śYbbc­_O• ŲµKŸl5!”#[ˆlĢ!"R¤†Y“Uhh(qåŹq[ff&rrr°|łrq›!Ś€K—.”²²żū÷‡ 8ž<<==ww÷VĻ)—Ė”Ó鐕•…Aƒ‰ßt0999(..ĘĄŇ"CŽ“'Oš=fŸ>} “Éąåå%īēåå…ŚŚZ\ŗtIņz”J%‚ƒƒÅ???TWW[„]Ķ1'N 11ƾśŖŁūvžüł6·§ŸŸ‚ƒƒĶ¾õė×£¤¤^^^8sęŒŲsˆČØØØ@BBˆćĒ#$$ā“»ū÷§'Nœ8@: `‰#GŽ ""»wļ€f9œœœ “Épłņeb̘1Xæ~=vģŲ•J…ķŪ·ĆÕÕ%U5Ø««C]]N:%Ī.•——‡ĢĢLŌŌŌ@§Ó”¦¦*• r¹uuubĄdūöķ t:JJJÄßę~—ųųų@.—cƌM—/_–,oŠŲŲŲź7R×FÖ…ļ¾ūr¹\ģAijĈpuuÅ®]»€£Gbūöķxžłē†!C†ąąĮƒššš@Ÿ>}īīī8tčŲ£³-Ÿkƒżū÷cĈø|ł2śõė•J…łóēć­·ŽĀ“iÓŠ»wļV±wļ^Œ5 —/_F’žżÅķRĮ¹#F ??§NBpp0"##qĻ=÷`ųšįpvvFRRśö킳Qt0CPÄŚĮżū÷cŻŗuˆŠŠĀŠ”C!öģŁ™L†Aƒ5ū=k‚_¾|HNN OĪjüūŖµĻ·±aƆaóęĶhhhĄĢ™3›ÕŃ’VŽ;†Õ«W#66}ūöĖ1(L­Śøč×øŚ µMĀĀōÉQcb:fXĖŖUĄō霥9‡ˆ øøÕÕÕ8räˆŲ„Šßß‘W»I„¤¤ˆc/ Cf ū¶äę›oʖ-[šüqˆ©S§"66ū÷ļ7[ö¾ūīĆńćĒqć7Š÷Z|å•W T*‘œœŒqćĘA§ÓaŠ AX±bE»‡u¶č2aĀ”””ąČ‘#8pą zōčGyDrbü{öžūļĒŁ³g±~żz„††āĻž3šż÷ߋŸ' õĻ·±aƆaŻŗuÉdāL7ʬńoeŌØQ˜0aVÆ^źźjx{{c޼yālPŌ\ć¾ؘ· Łv×'ƒē;³wõ:ŽaV—3,/,Z¤Ÿ"·£ÅĘ#G³fµ/ˆÓ I}Ķń޼ĪS&Y\¾³sˆ§“ĄĄ@£¶¶¶IOćµµµ’³ “–čiĄ€ų駟ÄīäįįįX³f žųĒ?ĀŁŁ_~ł%ęĶ›‡Ž½{#""+W®D}}=īøć‚€7B”PąĻžs«×qčŠ!”——cŲ°apqqĮO?ż$>¬Ÿ;wóę̓——vģ؁śśzøŗŗbóęĶŠh41b„x}ÕÕÕ'ń3w=ęČd2«%d3Ü7S†ńö§OŸ– ą˜»oĒŽĆÆæžŠ^x®®®Šh4(((ĄŠ”Cįéé)y °J{š¶ĖŌ©Sńü>>>Mžx!²„L&Ćķ·ßnöŪč… bįĀ…āėY³f‰ė+V¬ׇŚäõŌ©S1uźT×ŗĶ÷čŃ£ÕL÷Żwī»ļ>ńõąĮƒńśėÆ7+gH>Ł’ŠŠP„††š½ī±cĒJ>ÜFDD4gozķĘy†! ®®®M†'÷$:—··w“ņĘ÷`žüłĶĪß³gO±¼———Łk#ėS*•ųģ³Ļšm7<ō <łĖ_$Łģ3kżōS+·>µ…B”Ąüłó%‡˜žž5żĢĘÅʼnė–~¾õīŻ»ŁēŲŚ’V ī¼óNńw¢µæHėNäW‡ov+ŃŃĄŅ„-Os­‚ÄÄŲęC^‘Ūo·ßōĮd‰ŒŒ”œv×8‘¹¤v‘$Ś™;w®ųGÉąĮƒ…>ś2™ »¾†y‰IŽ|||ŠŠŠ`v\~AA–-[­V ???<ūģ³prr!C‘‘!žq3`ĄńżŁ³gćĆ?„B”€··7bccįźź „R‰·ß~={öDxxx³é٤˜»ә& üżżŃŲ؈/¾ų¢Ł„Öŗo€¾§Ē€df<”Ō}3f ņņņšī»ļĀŁŁZ­bYs÷ĶķiŚ.^^^0`***šōfŁ“iźėėqūķ·C<łä“ųüóĻ!—˱aĆ8;;·ųu=qqqX¾|9āććįļļŖŖ*|šĮ’e;óTæDD6ģŽŻ4ŸHX˜>Ūłfz ÓĻ@óüóĢ+Ņ…ÉŚ¹Ģh_'£Å€+7Jī<®®^»•1”wÕétÆX^…ęöģŁÓģį: ćʍ 'oŚa芔˜6mZĒ“4I’ŗožžž=z4Ž;†ŗŗŗfłCŗĀ}Óh4ųųć#v‡%ź®V®\‰Ē{ĢŽÕ N"33³INŒ®ŠŸė®K]œÄŸ6µkßōō ¼÷ž‡ó9¶&Ó!R=DŒ·Å“0żiK½K6lŲp]ē5XńÉXüņ466@Š -A€Nø¶.Ś«ļé×u:ž»f æś†UŚĢܐ咗į¾äE«œ£ĖQ«õłD RŪ:M®½ÄĒė#\‰Oė>†µ†ĢČd²xuźÆ.†õš«ėUjƾ6¬Ź5Š- 3Z,ę=DżŲĖ¢¢¢&ACNĆŗ±€€€N’PŻHŻ·šš8pšCŗĀ}ūķ·ßpšąAL:•Į""¢Nę÷Ž·w@bb¢øŽŽ 9 • HsŠé-^¬ļ1ņŠC“W¤»p˜€ WoÜćĄ4§ˆAWčaŠHŻ7)]å¾Ķš5«I^"j:E.‘=½÷ž‡×""S11@p0šųćĢ+Ņ…8T@Š÷8ˆŒŒDJJJ“ž Ddd¤EÓßRĒā}#r\V@ŽŠ>""j"2RŸWdĮ‚¦¹Pl,×Õ甾˜©ny"Ś T+½;¬žöäp@?»LWčI@Mń¾QWĮ@uĻ??.łVž³;¾üœ9 ZĒQ©€]»ō÷%>ަ§*srEŗ»źä–=Ö»5ŌZT`@„ˆˆˆˆˆˆ:»ćĒĶöFØsóFźS/cģĻ’³w-»ŸåˁѣõäÉróF–[7œ¢ŁŹäö®نzßAä~ž{W£{ŠÕ”Q©¬vČ2'Wģ÷īÅ`ˆ•0 BDDDDDäĄ²Ž]ŽĘœ{W£{ŠŒ²²ō?ÆS–›7ŽyY,¾NMM5›S$??ß}÷Š‹‹įä䄨Ø(̟?ryē! ‚€’ūßāėGyD²¾ę®m’žżČĶĶÅ=÷ÜcļK±¹šš±gˆ‡‡ʍ—&„R‰)S¦ ””GŽAmm-ŅÓÓ%sŠäääąż÷ßG`` źėėŃ«W/ÜyēčŃ£‡Ł:ģŻ»×ŖķŻž:X"==;vģĄÓO?m«ŪADDDD„Cg€ÜĻ’ƒ¬w—CSQŃd{śS/¢2õ½gūJ„…ég yžyż“ÉŁŁČsqG–›!Øó>Ż·ĮŃ£G%·•••‰ÆĖŹŹĢ–3%žõÆaŚ“ixēwšśėÆćāŋHKK³÷„¢±±ļæ’¾ä{YYYšššĄc='''\¹r„K][GJIIiņŚÅÅnnn˜={6üüüąēē‡Ł³gĆĶĶ ...-īkŠ£G,]ŗoæż6ʍ‡žóŸŠjµķ®cK÷ڜ¶Ö”=ē """¢®­»1ō 9÷—eĶ‚!—¾ų §’üĖĖm_!•JŸW$+ ŁŁĄŖØī»nĮ}ķŻT݆C„žŌju³mGŽĮŒ3GށF£±hßÓ§OĆÓÓćĒøŗŗā™gžßOLLÄłóē!“É‚;īøÉÉÉ8zō(4 .]ŗ„[o½Dyy9^~łedffbūöķpwwGII üüüššĆ£¾¾’łĻ 0räHÜ|ó̀ߒ€\.‡J„Ā¢E‹°zõj\¾|k×®ÅŻw߯¤ŽJ„uuuøpį %{“tm{÷īĖmŚ“ ™™™½zõĀ]wŻ…ššÉŗfdd`ēĪpuuEAA<==ńōÓO#-- Ąć?ųä“O0wī\466J¶…“SĒ}‡WUWWcĻž=˜={6`źŌ©MŹīٳµµµ’ūš3qāD8p'OžÄ˜1c$ŪӘŌūß~ūm“{-UF&“YT‡AƒIŽ;ćs̟?ßģg±®®+V¬@II üżżńČ# ®®N²|mm-PWWAąéé‰|J„²Ķ×@DDDŌŻŌ¾ū>Ü·ž <÷c“stĒYg²Ž]ŽÜĻ’c6b,ĶzT„žĘ˜Ÿ’ gŸ©Ÿsh(z…†¢×½wŠoŠ÷FŁŽPļ=ˆŗÜKvm?GåsØeee8v옸né¾–,ŸžžŽsēĪį„—^|ōŃGHKKƒ\.GAA^żulŲ°ÉÉÉxī¹ēšÅ_ąÜ¹spvvFNNžž÷æĆŻŻü1Ž?ŽØØ(<ūģ³N‡×^{ Ó¦MƒZ­ĘīŻ»ńŚkÆĮÉÉ ėׯGRRęĪ‹üüüfĮ@ßūćĉpvvĘ3Ļ<ggē6]›AFFņóóńÜsϾüņKœźėė±zõjŌÕÕĮÉÉ µµµØŖŖĀłóē1pą@ń8·ß~;Hƒō¬ß}÷ęĶ›‡ŹŹJxxx૯¾Ām·Ż&>ą·vm™™™ČÉÉĮr£i¼ĢÖ‚ƒƒįį”Ļ€ģēē‡źźźĻ!ÕŽF.—C§Ó™mOƒÖŽ·“LKuh鎓T&$$žžžō÷ėŹ•+>|ødłĮƒcŪ¶mX±b „ˆˆųśśāŲ±cķŗ"""¢n+;[ŸcbŁ2}o‘„K­zų¬w—£ēfĮ94ŌŽWjYļ.GÖ{–OMlJSQc·Ü…ļ,ö"Hp5@R^õރČzw9ƒ#×Į!"’==|}}1fĢś”1R½D›mėŁ³'’““->æ!8bœĄ“µä«:2™ ūöķƒL&ĆSO=xå•Wš”±Ōžżū1kÖ,DFFā£>Ā©S§PVVÖ$Ņ–k3f n»ķ¶&ŪvīÜi¶® …BņśŒ™Ėe!UÖÖĞJ„J„R*Sn4^pźŌ©Ų¾};€k=I,:GVVnŗé&\ŗtI²=‡(I½oü’*ciZśœ“TFźól®¼J„sÓdddą£>½÷ŽŪīk """źöŌj !A愅Yķ°Ž:t¦lļœ{m™UšŠ ¤?õ"4åŖ7³ḗ¦\_?j‡HŖ*5KŒ““ʍggg8;;cÜøq’9*¤ö6lŖ««ńūļæŠē#IHH@rr2ś÷ļ3gĪ@§ÓA§ÓįܹsĶf³1'77uuuōŖ}śōAmm-üüüčg½©®®†V«Å€pśōiŌ××6oތü2™L2°`ČĒ!“ÉpĻ=÷ą³Ļ>k– £µk3Gjj*č‡6\¹rÅl]ĶqwwƒPÕÕÕČĶĶm±-:’q ĢĆĆCčĘĮŠiÓ¦‰½_L÷5ēŠ”C(//ǰaĆ̶gkķm|Æ[;Fku0wļŒĻŃŅż5¾_ŁŁŁ-~vOœ8 . 44sęĢĮäɓqįĀ…v]™hĆ4»–0 qåå8ūZŽĶæĖź½&ĪżeN’ł{_b3½ī½NŽŽö®F—å=D&OžŒsēĪ5Ł6vģXųśśŠÆ}}}1vģŲ&ÓīömÖ(NNxī¹ēšŻwßį×_…““"##1vģXČårdddąĆ? 23tčPÉŁjLõéÓ’ūß’PTToooŒ=ĮĮĮųüóĻqńāE„„„`śōéX³f ^zé%Ģž=~ų! ¼½½ …BĘĘF|ńÅxā‰'ÄcϜ9_}õ•¬Y°`vī܉ōōtÄĘĘZtmū÷ļ <QQQųč£ “É0pą@ōīŻ...’użć’(y½żśõƒR©ÄŪo捞={"<<\®#Õ€>¹h}}=næżv‚€'Ÿ|Ÿž9är96lŲggg̟?’ŗ?3‘‘‘ā“»Ąµ”Ę T·oߎiÓ¦5Öif¾š‚‚,[¶ Z­~~~xöŁgįääd¶=333[l†&÷ZŖŒ„u˜0a‚ä½{öŁgÅsÜ~ūķ’en¾łfćūļæGYYY«ŸŻŲŲX¬^½Zģłćāā‚x^^^fÆ”£ī;5ēCgŹö@śŸ_“iņQ{$[µDĻ{oĒ„/¾²w5ŗ¤öŒS-€>ØbX\øp ąĄćźŗįµ›QCyWN÷ŠåUhn’žżHMMmÓ>#GŽ” ˆŲBzz:vģ؁§Ÿ~ŗCĪיu–¶Ų³gŅÓÓ”T*Å ÕÕÕb@DjūŠ”C›ō&!"""¢ęC½„†~›n}W|ņ漍 “AŸgO'\[ķÕ÷ōė:’]³‹_}Ć*mÖøļ*ę-|Ļæ¼Ą*ēČróF–›eīŖ)»äŠ™Ęņrœ{mņ׬ļ°szކ”’śŠ.ÉV%Ū '{"¦a¦:÷śvU™W¹¢ŁvļĶįżī^pżé†"‡ˆ±É“'cģŲ±8zō(ņóóÅŁgѳgOŒ;nnnö®&u"Ó¦MCdd$RRRPTT$Ī>€ĄĄ@DFFŠSuE¾šzųjźÅ×y.ī(rV¢ŲłŚß¹šŠ ¤’åMŒśīßö®®Yy߯ùזŁ-b*ż©›Ķņ’÷ż:x½cÅį4IIśŸj5püø~½¼üŚzv6|­œl·»pø€ø¹¹q8 µ‰»»;‡ĆQ·Ń«”½j” ĢÉy.P;¹¢xĖ6mފĄysģ]Å&srśŌĖPļ;hļŖ“*’ūõōN\Ė…¤‚99×f:~\’Ł”CDˆˆˆˆˆˆČ2¦½GŠbĪT*{W ūłõīņNÓ+D„©׍ŪMeXÆ*z NœøŲ`£Óa@„ˆˆˆˆˆˆDÅyĄ˜1@L 0}ŗž§tdÆ© ‡› › xją¬kĆ& ŚVŌ> ˆQSŁŁ@|¼~€čhąÖ[Å‹;äōYļ.GÖ{ĖŪ½æ>˜”¹ŗ®…R\æä0īŻAŻ"DDDDDDŌ²¤$żkó”4‡§ĶEUŚéfŪĶ9TF 9¬ĆIۈ¹ĀŽÕ°żuŚ»DDDDDDŌE$%Ł|Mp}%ÜŖ Å× rt<ÅÕ^4ŽNnļ ‘ž²¾ŚŽUhŁīŻ6?EÆ)ćÅDÆ †-1 BDDDDDD–ٳĒöē˜>ŻŽWIŻ"DDDDDDd™”ŪOm﫤n‚""""""²\R’mÆR‘‘ö¾Jź!""""""Ė?nūsL›f﫤n€³Ģ9 2'W6˜„„«bśt >ŽöēéB ÷ŌW×kåNØ3šwlU‘½«Ł„t¹€ČŹ•+ķ]"""""²£ŲŲX{W”KP;¹"ĖĶ ŅŌĮMŠĀWS‡€ĘZ8ėtķ?°­‡Ģ@DD‡“Qg`t؍†mur'ŌÉ-{lWiźģ})]N— ˆĄ¬Y³ģ]"""""¢.CķäČwńø xją«©‡§¶±ķ½H’’l›ü4,LædgŪ”µ®Ÿ! Q„p·9+ÅuĆż ūź’šōō“wˆˆˆˆˆØUUUŁ» ĆŠó ŲŁ]ܦŅŌĮWS7AÓz/[DżńģŻT¢k½6bƍJ£€‡q[R׊e"DDDDDDd=j'·&=Ü TšzųŠĆmŒz‘tTDZĖĖĮžŽ""""""j¦Nī„|'q˜ p­‰jļųŚŗ×ŃÅtČJ„ĀE r“%/96~ ˆˆˆˆˆˆČ"ƽHĘģ=ß©“lw2“<"RCVšöš`oj‡ ˆ”””ĄßßæĶū­Zµ ćʍƈ#šlOKKƑ#G0vģXছn²j}‹ŠŠ°iÓ&”––B”P`ŌØQ˜1cär¹EūÆ^½“&MBxxøķ•ˆˆˆˆˆlN.hķ]‹U„ž¶m@Ąé› Ķz{_*9(Ėžø»˜cĒŽį·ß~ƒL&kÓ~'NÄįƇ›m?tč&NœˆŃ£G[="¾’ž{DEEį„—^ĀSO=…+W®ąģٳvmC""""²Æƒ¢ØØØĶūåęęāŌ©Sķ:§N§Ć®]»:ä\Ōõ•ķ=`ósxnļĖ$ę=D²²²’ūß’0pą@̜9„„„­ī7dČlٲ……… ¢¼¼C† AJJ ņņņpĖ-·`ēĪČĶĶ…  ļyópņäI\¼xóēĻü÷æ’…N§ĆŻwß ųå—_Š«W/DĶ©}žüyø»»cŌØQ<šĄāūŪ·oĒŋ}śōĮܹs!ÖÆ_ņņrØT*ŌÕ]›oZŖ^m Q×Üī}KKKįėkyfˆė9u}ź½m~ÕŌ‰ö¾Lr`1P«Õ8räĪ;‡™3gbąĄ-Fd2&L˜€Ć‡ć–[n ļ2~üų&A…ĢĢLcŃ¢EōŒŒ <;wīhµZTVVB§ÓA«ÕB”Pąģٳ˜1cF“s£gĻž’õ¹pįrrrššĆŠé9{ö,4 jkkńč£¢¾¾~ųa‹õ:tؽoµB§Ó!%%µµµP*•hllßĖČČ@ii)t:¼¼¼0jŌ(466āčŃ£Šh4ŠétpqqĮ˜1cpåŹ”——cĈ8zōh“ć…‡‡C&“!33 …UUUpuuÅĉ!“ÉÄ/ qīÜ9øøø ¦¦J„QQQج¬DZZš8“»wļŽ(//ĒØQ£‹/B&“ĮĶĶ cĒŽ…B”hSŻŪŪ|dšŠ T¦ž²i/ƑĆįäķ ME…½/—CD Ōj56lŲ•JÕj`$22Ÿ|ņ nŗé&čt:œ>}Ļ>ūl“2/^ÄåĖ—±jÕ*q[cc#ÜÜÜąēē‡üü|TWW#$$‚ ąāŋpww‡ÆÆ/Üܚ&ś:3ó{ēęę¢_æ~b0&44W®\N§£ń®®®b@Å\½ˆˆˆˆØóĖĖĖCCC¦M›Fƒ­[·Šē›«¬¬ÄäɓGŽA^^4 œ1aĀ@~~~“žĆłłłāńźźźšŪoæaĄ€Éd())Į¬Y³ąāā‚Ż»w£¬¬ ~~~(**Bxx8ŹĖĖ”V«qÓM7ĮŁŁū÷ļG^^¼¼¼PZZŠnø>>>ČÉÉTTT 33ŃŃѐĖåHKKCff&T*U›źĪ€H×£Ž{ŠęĆZTS'¢xĖ6{_*9 n10Fśõė‡Y³fI–Q*•2dNœ8N‡!C†@©T6+7lŲ0Ģ™3Grū™3gP]]aƆAœ9snnn>¼ł/ŠĄĄ@¤¦¦¶é:L(ĘÆĶՋˆˆˆˆ:·ŠŠ ųłłœœœąćć@?ŒE­Vcß¾}bY­V‹ĄĄ@œ;w‡F@@zõź„R)~ńg|<777ńxąććśæŠŲŲ(ö֕J%(üüüPYY ///ø»»79 ļõ ö1LRpęĢ™6՝ŗž²½üäĆ6=‡ļŌI ˆM8dRUsT*.\ˆ;ļ¼³År'NÄŃ£GqģŲ1LœŲ|ĢZhh(Μ9F@Ÿ«¤  0tčPœ?999 Ahh(rrrpīÜ9É”+įįᨭ­Å‘#G6l@jj*BBB™™ NN‡¬¬,#00¹¹¹€ššäååµZ/""""źŗzõź…)S¦ˆKß¾}įęꆙ3gbŠ AŠjµŲ»wo³$¬ęrÉIm/**B`` dyć/ą E«e¬QwźŖROŪüĢ#ŅńŗŅlG×£[ō1*ÓZ‚Õ=zˆŃš=z4{æ_æ~9r$¾śź+Čd2„……‰å<==”Óéąēē'FȽ¼¼ŠŠŠww÷fĒrrrĀ¢E‹šÓO?į÷߇““FŒįƇC.—#33_}õ ,, įįįŠh4HKKÊ+ąėė‹ąą`čtŗėEDDDD›———8„””jµąļļ'N`芔P(8räŒźźjøøøĄßß*• :%%%bO OOO\¾|P[[‹ņņņĻ_XXˆ>}śˆÆĖĖĖ”Ńhąä䄲²2ōė×Ļģ¾ČĢĢ˟9sFLņߖŗ› ČPēU—{ 99p µŁ9˜G¤ć¹5Ō¢Zémļj؜CDT*U“Yf,™iĘąOśS³m‘‘‘āśŒ3š%H5xä‘Gš¼¾÷Ž{[<—ææ?zč!É÷¤†ö899įž{ī‘,ßR½ˆˆˆˆØóźÕ«._¾ŒŻ»wĆĆĆ~~~Šét DŸ>}°oß>Čd2ųūūĆŪŪ …Bę č’FŒˆˆ@~~¾x¼K—.aĻž=šōō„ŸŸ_‹³–””ˆ3€··7RSSQ]]-ę­«¬¬”Ü×ŪŪ ĄŽ½{!—ĖįźźŠ±cĒĀŁŁ¹Mu§®©xßaō²a@`² ‡ ˆ¢×³gφN§kS „ˆˆˆˆČär9ʏ/łŽ!C0dȐ&Ū<<<Äd„ĘBÆ>˜666bąĄš÷÷‡N§ĆŽ;ąįį„R‰€€±¼įœ¦3:99a̘1M¶y{{#::ŗŁ¹}oę°°°ėŖ;uMe{ ×½wŲō^#‡3 BV琑1cʈæų‰ˆˆˆˆ:‹ŚŚZœ8qBņ½±cNJ M­A.—ćüłó8uź}Ą‚‰KÉŌ{ŚüŖ©÷ģ}„äh2 āļļoļ*5£T*%“öŪ‚B”§µm«ĄĄ@ęó ‹uDß©“ģ}™ä€ŗÕ,3DDDDDDd}ÅūŪüŖ)œm†¬«Ėö©ŖŖ²wˆˆˆˆˆˆ¬Ź­”ÖŽUh—ŹŌSčŪęń: ź}¶žCŻG— ˆ<öŲcö®1ĶŻ'•ĖĻ\~æėŁ—:ę”®ˆCfˆˆˆˆˆˆčŗT„Fcy¹MĻĮ<"dm ˆŃu;2ķfd½»Ü¦ę!kb@„ˆˆˆˆˆˆ®[]ī%d½·{ĀFāōŸ_°É9īU„ž¶zC5•CfĢQ;¹YõóÓ°‡Y-zˆ8ūųĄs‡Ķu°‡QS„C¹äe›ž£L† ;^£“··MŽ;xÉóhH;eĒ+ė¼”6ž¢ZlļK“*Dˆˆˆˆˆˆ:˜<ø/ܗ¼hÓsøŪū"mÄgŽ`Ž{Wƒ‡ĢQ·Ć€u; ˆQ·Óårˆ¬]»ÖŽU """"";Zøp”½«@]ÜīŻ»Żl{RR¦OŸnļźQér˜6}†½«@DDv“g÷.Ģ›7ĻŽÕ "";Ų¼y³½«`7?žų#Ž?ޤ¤$TVV"%%„ÉūŃŃŃP©TˆˆˆĄ-·Ü‚ČČH{W¹[KIIAUU’’’ÄmĘėĘ ÷Ķšóz‚2»wļ†Z­ĘńćĒ[<Æńł"""jļ&ėp]2 ’{9ߎU "";«­­µwˆˆˆl.''ńńńHHH€Z­n±¬į”711qqqˆŽŽĘ®]»ģ} ŻÖK/½d6"%11±ÉėččhÄĘĘ"&&>>>Ć\Ļ)¦u‹ŒŒÄ3Ļ<ƒE‹ٱÕ:V— ˆhµ{WˆˆˆˆˆČ¦–-[†ųųųV!ęDDDŲūč:$%%!)) *• qqqxī¹ēlz¾””ÄĘĘ"!!‰‰‰aŗ2&U%"""""źDŹĖĖ…øøøvCXÜS€:7µZÅ‹cƌ(//·łł’’’Ń!ē²·.ŁC„ˆˆˆˆˆČ•——ćĘol–Ę!ļƒiĄ#)) Ēƒ(·Žz«½/‡LØT*DGG7뽓ģģģ‡Ų$%%įĘoÄ?üŠę|±±±ˆmv¼M›6I~Ö²³³±xńb¬ZµŹŽMfSŃéttdÉdW· ōė†mDDä˜Apķ÷½L&»śğryóN’:N|ß\"""[i-Å‹› t,]ŗ€~čĆŽ½{ķ}9$!""7n4ū~yy¹˜&;;»Łū)))øķ¶Ū°cĒŽ6 i‰m–ØuśōéXŗt)~üńGÄĘĘ6ė”€øø8‡N¶Ś%" ’ŪAĄ«/>‹×^ƒ·· Ž&Į®ŪńÄSĻĀĆĆ2¹ r¹‚A""õÜsĻįę›oĘ 7ܙL'''ģŽ½›6mĀ»ļ¾ NgggMeeexųᇱfĶ‚…BgggžADD&..N2¢R©oq²ĖČČHĪ0ÓEłųų`Ń¢EX“h–-[†øøøfeRRR‡åĖ—[圷Žz+āāā°xńāfļ%%%9t’U‡üźK«ÕB£iĄ™ōÓŲöė<ų§Gąāā¦:A\żPZ-AæŌ鮽ćm\\œ›-©'!õä1É÷ˆˆČö&Mš„#GŽ ¾¾uuuŠh48|ų0&L˜€ŗŗ:Ō××£””įź’466B£Ńˆ½JźėėQ[[‹ŗŗ:466ź’Æøś’„Ōŗé1ĢżŸADDŌ’Ż»w#>>^ņ½ß~ūĶ”JIŚŅ„K‘ ł^||ū Ÿ}ö“Z- ī½÷^ÄĒĒĆĻϧOŸĘźÕ«ÅąĒŻwߍ#F@”PĄÅÅ {"QŪHõō¾¶īķ‘““ƒćĒćųńćⶈˆDDDt™į999Ķrp„……!,,¬ŁP‘¶7))I DGG_×ńŚjŃ¢EHLLl6%/ ’ĢX+ĒGw˜QFJ— ˆ–Jg»5|»—{%[~Ś€oŗ®J”•WB&—£®¾ß­žwÜū üżPT˜5߯Fģ£Fߊ0œ:u >~HOĻ@phŠJՀN™\”_LžøķįļŪäõŽ=Iggg¤Ÿ9ƒ(“_\ęźMDDmg.󹏏|||ššŠ~żś!''>>>P*•())ĮźÕ«ń׿ž~~~8~ü8>’üs,]ŗ555€ŠŠ ŌŌŌ@”””@.—ĆŁŁ:eeeØØØĄūļæ^x½zõĀŋ„K—ĀÓÓ®®®pvv†B”°wQaxč6m³©VĖĖĖ‘€ųųų{„……!66‹/nõ”YźĖ€øø81·‰µ÷3\Ć·ß~ŪbZˆ‰‰i1w‡©Ż»w#..Nņ¾ØT*,^¼øÕśYKBBT*U³ķ‰‰‰V ˆ˜ėmāč39䐙­?’­V‹šź*č-d29rs²Ń£g/ųū@Šjąļ_?äęd!,¬.]́N'ąŹå\„†õƒN«mqȌN'ˆKAAN„ž@`€?|}}QQ’ā¢Ā&eˆˆČöd2¢¢¢pśōiČd2œ>>’ŸµZŻ»w[åRƵ®·wMWŠ%{ˆ“fś¬›ąęāŒÄÖĆ?0A=P]]…¼+—°zÕ Ē8“Z z‡õCii 4 (*,@Ÿ¾ĮŠéČdśž!RQKć›6®‡··7|||ąęęH;y C#ĘŪ»9ˆˆŗqćĘį‹/¾Ąüłó‘––†xZ­r¹›6mĀŁ³gÅ!3 ŃhÄ ‡ńl4†‰a› (//GNNŽ{ļ½&ēlll„V«…Ö(˜Īa3DDd s[ä łśėÆŪhÉĪĪFTTķ>ļóĻ?o6ߊ9–ötHHH0›·ĆTRRžžy«%7m­žRõJJJŗī Å²eĖ$Ū³­mÜ9d@$(0J„'OĮ/?’„»ļ…›Ā īčŁ³7bnæKßsD&ƒLv­“Lß¾!ČČH‡ŸŸ?r9t:@nRFŹéŌØ­«Gļ^=”t÷hņ^nv&‚ĆśŪ»Iˆˆŗ• ®®ŁŁŁhllDPPAĄÉ“'‘ššŠ%K–гņ׿žµIĻN¹\ޤw  ØÆÆxyy!88<ņt: œœō’Źd²fūµĘÜpkŪ½{·Ł`HXXbbb R© V«‘ŠlV@ßkå·ß~³Ū,6üq‹ꆼ!PYY)öiK@¤-āćć±xńb›ēZ1b„ävK“žšöQ«ÕHJJBbb¢ä1ģųź9dF@&—#"rƒzbūƛĮ!”(,ČGIq ¦¦k¾]…ŗŗZČä2„…Ą±äĆķgĄ-|ĮWSS“ćÉPŗ¹ĀÓ[ēk1&g'T©‹QSSmļ&!"źVd2"##ńóĻ?cäȑb/ŗŗ:x{{C&“”¾¾Ū·o׍{†ųųų ŗŗŠétųż÷ßč‡Ģ 0—/_FAAär9*++ńĮ ¶¶ … …r‰DÜDDDRĢåĊˆˆ°ś¹ĢCāć摕•…åĖ—céŅ„X¾|9ŹŹŹĢÓxé„—ģŅV»wļ–œŠēINNFVVvķŚ…]»v!99:‰‰‰m0ÅÅÅ!;;:N Iåń0“Ÿ­™ @YY¼x1¢££Å%&&F2LXX˜ĆOµkĢ!{ˆČd2±÷ǜ?ü«¾Ä‘C0nĀ$üįօųmėqŗÄČq Tŗ”ų üöėf„†…C}ļČdh)"rōšA€o`/xy(›½ļā센Ül„nļf!"źVʏķŪ·cīܹbĻqćĘ!99o½õ”J%ęĶ›‡‚‚|óĶ7ø÷Ž{Å}=<11±C†ĶŲZXX>oˆ1‡ ˆČår¼ų—e- ČąŖTāOO< Š!$“B=  ƒ¾/‰~ś]™\Žāā"ōģÕžŠ dņ–‡ĖØĖJ‘sį z÷ī _/„ŁruUåP—•Båėgļ&""ź6†ŽU«V”¶¶Vœ:W©Tā/łK“䧃 {|šĮb@ćÖ[oÅ­·Ž*ę™={6A€\.Lj#0zōh‚ ę ‘Édprrb0„ˆˆ:„O?ż“ٶ°°°Vg±‰—ĢqŅŃĪ)))’C‹bcc­Ś›”„ćEFF"&&¦Y{XŚK£³ĖĪĪFtt4"##±bÅ » ‹źHŽ7dęź·€2¹d  “C&W@®Pˆ?åF?e2żĻßwż†Ż;¶į¦y„ 2ż{ró U`Ļo[š%R•āę憼œóön"¢nĒŁŁJ„īīīP*•ātø®®®P*•P*•pssƒ»»;<<<Ärnnnpuu…‹‹ ÜÜÜ T*Å} e\]]ÅÅÅÅ„Ét».CDDINNŽäL,ꆟ ELLL³ķęĮŚŹĻ?’,¹Ż\Ƒö’ŗVKŽ·× <–ö$ŠŒŒl2d¦„`GJJ ¢¢¢šõ×_Ūåš:’Cõ Ćeä€Īd>k™Ühą‹ 2\ąźė³n†n–īźT»śŽ%2™āźióļøßŽ—KDDf†Éøøøˆ=8 ’/Čår899Aq›į§iYćd«Ęū¶Ļ(c¼YĀÓÓSr»TBÓö2׃ĮŅ<%Ķ jµåååšńńé€V2ŸxÖŚÉL[ 0¶šŖŖŖ²éõ››^×Ņ{ųį‡JöčłńĒo¶÷͈#ŗ§ˆćõ fȚm»¶ŹČÆ.×r…Čär£ž$LŠGDŌ•‚"ʉN ‹!(bœUŖ¬į}ć²ĘĒ0~’oQ[™{Ų4—[¤=¤vX<äÅ\BRkÖ±5RA[ĢÄÓY™ j™ ŠXźÖ[oÅ®]»Ģö“±WŻŽā ‘ö3Ddņ–{‡YƒTP$))Éģ 4Ż‘£äéh/sC”¬Zŗt©ä±’’’““cļĖ·DŒČ ½D!""""¢2räHÉķ§ƒ:§ņņrÉĻBXX˜U‡ ™Ė)c®‡‘#`@„ˆˆˆˆˆČŽĢ%ź“VĀPsĆ*,MjnhŒ„ł+lu 9dĒžāćć%·ĒĘĘZõ<ęņ§8r™TµŽ]Ljˆŗ;{es'""²¶[o½aaaĶ<³³³±lŁ2,]ŗōŗŽ?bÄÉķiii%Ģ” <„……Y”PÕZÓRķcVŌQ‰]ķ!%%Ål`Ģ’Y‚ŚĀš‰|»Š.¹ėīķ]""²£sgĖ0pÆ½«ADDvšßµ;ģ]›ˆ•|š‹‹CXX-ZŌīcGFFB„R5{ąMHHhõøę†kH囈ŒŒlö…EkĆ-~üńG‹®!&&¦Ł±Ōj5āććÆ;`ŌY„¤¤`Ö¬Y’ļÅÅÅY=dė<%‡ĢŁŁŅ„KĶöֈÅóĻ?]IV„†å$%%™ĪÕ ..N²ē€ŌpąąąfŪ²³³Ķž£¼¼Üā^- +rÄ^£ü1f͚%Łö‘‘‘Vļ²{÷n$$$4Ū®R©,žØ+b@„ˆˆˆˆˆØX±b…Ł<ńńń ĆóĻ?ßb %%_ż5žžł&ŪĶ »ˆ‰‰1{¼ÆæžZ2Ett“äC²¹žRēČÉÉĮ7ŽhńšŠŠP³93¢¢¢°lŁ2³£ņņņ.1cOJJ –-[†~żśańāŒĮ•J…+VX­wHyy9–-[föŽY;šŅŁtÉ!3DDDDDDŽ&22ńńńfü CD A ć‡ŲŹŹŹfA‡åĖ—‹ė”””ˆ‹‹kQ«ÕˆŠŠBll¬x^Ćy¤†»ØT*|šĮ’õ‹‰‰‘|€6œ#22^^^’uµD\\%qqqˆGtt“˜ģ5;;©©©bŽĪ0“&)) 3fĢh²ĶŅö Ćśõė-Źūb*!!”ÉżT«Õ8~üx‹CšlŃ„³a@„ˆˆˆˆˆØ“X“hĀĀĀÓj’ĖÖņsģŽ½»IOŽ„K—";;[rhDBB‚ävSńńńfČCCC±xńb³³¢˜{č— Ō˜;~bb¢ŁŽ jµ‰‰‰’¹0:ӌ4ķ™Ę6&& ķībɽ5‰;v8tĀZ€CfˆˆČ}¹r#¾\¹±ĆĪ7nåĶāāHõŗ¬­£?oDäų¦OŸŽģģģėžVU*°jÕŖvW„R!11±Õ$¬qqqmźĮŠ¦¤Ó§OGrr²Ł©„ŪŅ]!™ģʍ;,8×-‚!€ƒD„†¤/‰CŅš‰H>éÆ-ƒŠŲŲź~慎h¶ģŽ˜ ØÉŹĮ±CŅš‰Ų3a&Ī,}B}½½/•ˆˆZńčc šm3<Ų[ū’ČcæąČcæ“y?kÕĒÜq.”fcÜŹ›q”4»CÆ«­u7]:+sķ,õY#"ŗ^>>>Xµj’““k6·ˆ9‘‘‘āŠS«V­BRR’E•J…Å‹#;;·Žz«EõޱcG«A—ČČH$''·köœČČH?~qqq·‹ææ›Ļc*• 111ˆGvv66nÜŲ!IM£££µZ„K—v‹`ą`Cf.žūŌęäbŅoś©›Ņ/AīŖļśXl‹ūĶŹIkņ:õĻ/Ā{ŌpĄ©ž’詳łGŠiä|žd.’,yDDDŁK)Ėd8p)į~aö®ŽY¶ŗue‘‘‘XµjV­Z…Ż»wćųńćP«Õ͆]‚†­=ŠNŸ>»vķBJJ öīŻ‹ćĒ7Ipj8Nttt›Ž Įœøøøf¹+¢££›%eˆˆhv=žžž­žcéŅ„Xŗt)vļŽ¤¤$dgg‹×•J…ˆˆDDD 44“ÉžRē4loI[öŪµkW“v ÷Θ”Ž†cXŌֆ$»v5{ĖŠƒ¦ŖŖŹģ9 ÷Šē%1m›īÄ”"ł‰›1ģƒ·ąŚ«`Ą’ē‘žZ\«cUég”>rĆ>ü»žuĘYŒżīßPø+aO?ŠĆóīd@„ˆČA¾ķWČč×/M~£{Ćø•7ćŃ·cŻ©Mö郄Ó_Ąą€p³ŪĶÉ-挷÷|ŠS…gŠĖ«^Ÿ¾#ƒ†tȵķĻMĘüĮ7an2īu›x½¶¼®NoĘw'7 æŖ‚@ūļķż µšZÄEæ„„»>€‡‹;^™ņēė9nåĶx<ź|s|Ā|ƒńĶ‚OŚ\Ok՟ˆČ¦OŸ.¬• 422²]I:-*-Zāććs]½ ŒŪÅRķ=g[÷3.kµž­ä 1¾ŸŽł0J7€×°!Č]µŚźjh**‘³"u—óģ}©DDŌ†[ć\ư}ś/L~ŁńŽų^ˆOüöą’p÷ˆ[ń÷=·ŗ]ʲŻįÖ!sšŪ¢’ań¤Gń÷ß?n±>Öŗ®ZMNžĮQāTįŌjź:äŗ>;¼ r¾»ķ3ģd“E×&5dę„ÉO ø¦ ļļū%µexqŅćÕSéä†_ųƵ«ž-ÕßZ÷‹ˆˆˆ:‡ź!b,bÕæ ­®iÓ>'ŅP‘v#’õ”ømŲoįĢ’żYŸé{‰ĒŽ(*ŽDDŌ­%füŠÆ’łUEŠČ ß»yĄLø:¹`Nx4Žß÷ÆV·K9[œ‰7vžoą¹L†Ž|åjkqóźūÄ×ÓB&Ųüŗž6ólL’?ŁŽ’šRÜ;rz ÅcIrž‹7>‹o|…\aQ=ļńG8ɝ°dźÓķŖg{źODDD]“CD”}{£ś|¦˜’£śÜø÷¶x’ ~Š~O?¹‹‹øĶ½_(Ę|»R|·a<‡ ²÷„‘•||šßxūĘ%ŪkŽ\9Žē½Ö­÷×ó»0wĄ l½„0Up«ŪÜżQ|CˆŪ† Ą}£bRp$\.–UŹ 䦹éńĀ¢ˆ;šõńu8›"Dly]SCĘcjČx:ŽęÄKŪžÖ®€B½¦ož©!ćńęļńHˆY.žĒ\=ĄIŽōO›¶ÖÓZõ'""¢ĪĻ”"=cęįü{ń~5’Ēł÷āŃkį›”ł-tD³$Ŗ N>†šĢlō¹{”ä±5•(Ż{ēŽśæłŗ½/•ˆˆ¬äŃ·ćÆ;ŽĎ¹«É{Łź\ÜųĶńīƒ7¢Ÿouū“ćįɟ— Ŗ”ZģõšŃ/ąż}’ĀҤPŻ ļ¹Ųڐ‹/Wn¼ī™Kä&濛ž0%d^Žö·¹.Ɛ'¹zyõĄ FC]Ģ1µåČcæą½}Ÿ!Ü7oĪ|oģüŽŪūޘž|‹õ”ŅÖz¶§žDDD’fĢ""€„KēŸÓŁ}²³eĖōļ«Õ@X˜~ŸöL»l8Vj*’¢ß¼ž: •+ꔇōū,]ڼ^ čė³q#ŠĘYŽŗŠöōŪ•-€>ØbX\øp ąĄćźŗįµ›QCyWN÷Š%'_»v-īŗūFÉ÷„†œyćļ(ųy+ Ēü¹üę_!wv˘ ˆ¤Üż'ōZ8½ļlśčo”#rWWx€ŠĒB[ęŚō¦QĖĪ-ĆĄA¾fß’råF×7źø•7K.Ģm·&kD:ćuٲžödĻYīækw`įBż—˜:®É{¦ÆĶm[ńÉXüņ466@Š -A€Nø¶.Ś«ļé×u:ž»f æś†½›€ŗ ™ģZ!)IæžĮMŁŁĄ˜1śõŲX}ą!)Iæ,^ ,_.}\ųl‹—˜ż±²³„żśoæ5Š$%é7aaĄ±c×Ė–qqśÅJ |›^‚,@€ś«‹a½ęźz€Ś«Æ ė†r 4F čŒ‹9T¹‹ †¾· Cß[f¶ŒT0"×~Õ¦ņDDŌyńĮ”:?oDDdÖńćś CV–>č`ꔇō?ƒK—źƒńńĄsĻIļgĪ҄̓(£Gė%’ü'°jUÓ÷¢£Æ>–-Óļ›’¢i“`HgĀģ DDDĢõB舎 ¶|Ą¶ēuٲžDDD’Z­2H5²³õ=4bc›÷Üxī9żĻÆænŪł¤†¶,^¬’™˜(½ĻŅ„śóĒĒėƒ!/½¤?Ίön=›sØ"DDDDDDDJLŒōö¤$żOµZß;ĆXvöµ2ķé„‘˜œ8qķ†ó˜³b̚u-ˆ#•sÄĮ0 BDDDDDDŌŃrrō?¬wĢ”ąöŪõ•čč¦9LZ©ļ©’ ļĶbčUāą!""""""²—]»šĻšŅjµ¾‡$'7ķį×ņ¾))גÆfŖqšü!sˆu¼éÓõ?üŃ:ĒKHŠE/nūp—Ēæ6MX˜>€b˜¶×9T‘Æ~Ę¢Ų[PTT†_¶ģƒŸŸĄŁŁ ćĘ_›sģč\¹RčÓ'c·øŻœƒSQ\¤Ø|½0eŹhde^ĘéÓYb™ŖŖŒ5Ƈ÷GUU ’’Rąķķn ȼpI²üŠ”ż°ß ŌÖÕÜŻŻ0yņ؏’ė/ū³ošˆūO6ŪW&“įš”4©!ĀĆūbŲšžķj+s u˜3wJkÖ>2™ł „ڧ­ud»étÜŽR}Śzķmż\™Ūn®ŒŪÖPļ­æ€‹‹3f̌uBŃŃś DB‚¾7†TBŌ¶(/×’4Ķßņ~Ė–5Yfłr`Į}$9ŁŽ­dS1臛’0PR¬Ęöm‡pkL4ÜÜ\$Ė–¢°°ón™ @’@YXX@'¹=(ČWņ8łł%ŠjÜ2`Ū¶ƒør„żĆū¢x_@c£Ū·Ä A!€Si™4(łłÅāqĢ•æt©³gOģÜq—/™-ÆŃhQQY;ļœ‹ó%÷••5˜wĖThµ~śq7śō ‚g›ŚŹ\›×Į\ūōéhö^JµO[ė`®ŻAÜŽ·oU®½­Ÿ«–>oRķ`ܶg2rZ čQ'±|¹~źŻ~żōA‘ˆżöģl}RTÓ)t[²h‘>ؑ Ÿj7, Ų½[Q©¤“ŖJM±£_~čŒĆDŒłØŚ 99y80ß~³‹boiRęŹå"„†õ_‡†õŅKÆÓIn÷ńń@RR œ 4j“šööĄäɣг§?zöōĖ7Ō7ĀŻŻµÉ¹Ž>…Ńƒąģ¬ož G 7·ĄlżĖūx{¢²²µµõÉ€źźZx{{˜-š@*jkź±kg2ƌ,¹oVÖōģP(äčŪ7ły%šńńÄŃ£(,(…ĀIA0jŌ@ä—H¶I`  ū÷ŸDmM@éī†)SF#łČi±Ń3"%ŪG§ÓIīk®}ĢŻ/su0×n:A'¹½¾¾Aņžš;oPo›ŚŹÜēŹÜö  _Év0mŪŖŖZœ;w&Ž@Zź[ž³"""""¢ė«V<’¼~1ÖÖa/aaĄŖUść<ōеm7źIIś ˆ”'ŠZ­OĄ 4ŸbwÕ*}łø8ą–[vʙn//wTWÕB.—5 †@]}C“..ĪP«+@r»«« ęĢ™$nOܘ„ŖŖxzŗŠŃ8t0}ƒ{Ą××[,WQQŹŹōé#ŻĮ”iy/owx{{`×Ī#oOxz*Ķ–ŒŠK— 1cfAÜ××× Ī_Āšįż”ÓéPXXW7\ŗTˆ²Ņ ̽yr“:åääI¶É… — Ė1ėjo‹}ūN ;ūJ“:˜¶Ļłó¹’ū†…õ–ls÷Ė\BBzšm7©ķr¹\ņžš;o[ŪŹÜēŖ„ķRLŪvߎć˜2e4Ī¢Ļو„“zd¤¤•W’öo)ÉjKĒÕ/II€—×µ@†ŌńT* +Kś8*PVf·¦ė(Ż& RQQ ó9DÜÜ\Q_ß(¾®Æo€››ėÕõęŪ««j±’ øŗŗW{h4Z@]]’v%cŠ q‹Į©“ <8Ōāz›–ĻČȁ§§;¦Gė?Ų)Éé8“‘ƒ”Ćśµzü–öĶĶ-Ą–Ķ{”pRĄŁÅ īīn(+­€€Źā¶*WW!/Ææm?t­°ÄæU©ö±tßöÖĮܵėÉķ!!=%ﯹ󶵭Ģ}®ZŚŽš“ŌóčÓ7¾~Ž())·h"""""ź$¬Ł óÖtŻb–™ŅŅr\ĢÉC˜ŃPS}ś"+ė²ų:;ė ‚ū™Ż~ęlzõ Ą ÓĒbüųÉdŠé­V‹ķŪbÜųįĶ‚!€¾Ē@ßąׯ“¼Nš|ūÆÓé ‚EĒ7·omm=BBzāó¦böģ Š4jŠ·oųśy£° Ōā¶R©¼ä‹Y³'ˆKXæ¦=<̵%ū^OĢ]»¹ķę󶵭ںŻuu ČĖ+ʶmqąĄIäåćō©L‹?kDDDDDD݉Ćö)**ÅĻ›ö@§ÓA&“aÖģ puu č$sˆś¢wļ@üüóČ CHHOń©ķ‚N‡}{O °Ø ®..č׿JCHHOTTT楞“ⱇ ė‡žį}”Õ Šj89)Ä÷AĄ–ĶūP_߀ŗŗü¼i&LĄ _Éņƒ‡„aĻžcś2r¹8 ‰Tycęö•É€3Ł8yāär†‡›› śö Baa)¶l٧?¦:¬‚ƒ{H¶‰Ÿæņ J°}ŪA(ś:Lš<ŖI}Īž¹h¦}śHīėźźl¶}ŚR‡–ŚMj{YY…保3w’ŁĻI[ŚŹÜēŹģēĶĢēDåė%¶cŌøaāzII9Nž8ןlADDDDDDŻU{¦¢-€>ØbX\øp ąĄćźŗįµ›QCyWN÷Š%'_»v-īŗūF{·ŁŃ¹³e8Č÷śDDD]Ī×īĄĀ… č{÷ÓIäVŚ¶ā“°ųå%hll€  Śk½‡Æ® ‚öź{śuN‡’®YƒÅƾaļ& źņd2Y<€:õWĆzĶÕõ*µW_Ö åhŒ@ŸpĮ°X¬[ ™!"""""""2ʀu; ˆQ·Ć€u; ˆQ·Ć€u;Nö®@{Čhļ*‘]•ń’""""ŗ.ģ!BDDDDDDDŻ"DDDDDDDŌķ0 BDDDDDDDŻ"DDDDDDDŌķ0 BDDgåŹ•X¹r„Ee£VFŁ»ŗ]BWn§¶|ˆˆˆØūp؀ˆŠŠ€ÓK^Ä®į°kų¤æö„ĘĘV÷Ūڣْ1P“•‰£܅]Ćą÷ ČXśWõõö¾T""jÅc=Öl›į”¾³?Ü[«žRljZ…Ø•Q˜ōļIø{żŻ8téEĒJ~,ŁfלŻÉļ«O®¾®k6×nRŸ""""‡ ˆ\ü÷ØĶÉʤß~Ǥß~Guę䮜²Õżfē4YzĢū#ĀžxöĀ3PEĒ“CĒ0i[J%.,ߎ—JDDŌnɏ%cϟöą‰Ø'°l÷2{W‰‰ŠA‡ÄŒD{W…ˆˆˆŗ‡ ˆä%ž€Æ½·^½įÖ«7.yW6¬kÓ1ŖŅOC}ä‚=¬q”> 'O/8ūØŠļéēPųĖĻö¾T""²¢/~‰©_MŽ?܋3Åg\ėI1įßp’†ūq"’„ø}mŚZĢüz&nśö&l9·ÅŖå;’  ÓéÄ×Q+£šåŃ/1ķ«ixpćƒM¶›öŗøPz%>„I’žŌ佋åńÄĻO`ŚWÓpēŗ;‘Z˜Śj=|Ü|°źŲ*ųŗł6;§iū¼·÷=,MZ ųæ]’‡ģūG‡·9'{WĄšź.]‚Ē€A€cŻQ’\ŗÜÜ6ćü‡ļ"ģÉg P*^ĆFąāŖ/ū0 Õ"ēĖ/Pwł’½/•ˆˆŚĮ0ģĆtųG€{v<ø[/lÅ[ææ…o~+–Ń Zœ,<‰×v¼†-÷éƒ ¹æÜ÷ RņRšęī7ń‡°jysõ“ÖõF­Œ‚³ÜĮ>Įųæč’kņž»“;¶>°śøÉqL"Ėv/Ć-ƒnĮŠł+ą¢pi²żŽawą“›?AJ^ Žśż-ü÷ö’¶XĻ;†Ż7v½·f¾…cłĒšŌŁ“}^šüžżõYücß?PR[‚„ӗ¶z½DDDDR* blĢŖÕŠVW·iŸŠĒQ™–ŠQ’ś·ømų#ć’^CögŸ@īīŽŲG…ĀŽ—GDDVō‡€«“+ę„Ļ{$f$"įxņ«ņ”4A&–_8d!r&OFQM‘ÕĖŪZKƒ»FÜ'¹^›śZ‹ĒøPvüĒ&Į8[|Æļ|]|-—µŽuĪ€9˜3`ą/;žŅbū(ä <5ī)<øńA|³ą(äü?™ˆˆˆŚĒ”†Ģøõķ‹źógÅ×UēĪĀ-8ŲāżĻų.ś=½r—kܹ÷ė±ßž3N_ĄōäTøõī Æ!Cķ}©DDdE枒õšzl½°ż}ūāĘć•)Æ`wģnÄĻ‡׆–H=„[³¼=9É-ū®$Ü7?ł BÓäåC†ąĆ›>Äž‡÷#ł±d~ōp»źa®}ź5õxė÷·05d*Žśż-4hģŻdDDDŌE9T@¤WĢm8÷ŽßQŸŸ‡śü<œļ-ō^xG“2ŪC{Hī«N>ŒšĢ čs÷½’ļk*ŹQ°eξµ”żŁŽ—JDDV”Sžƒ™ßĢÄŚ“µų듿ż žŗćƘ»z.2Ė2[=†­Ė°ĖŌ±ĘłCŒ×ߘž6ŸŪŒi_Mk2œfiōRüžf;[2÷ˆ„̵Ļ{ūŽCøo8āēĘ£æo¼»÷Żo"""r ķéŸ+3Zż°ĆāĄ€%wW× ÆŻŒŹŹ»źtŗW,9łŚµkq÷ŻwK¾'44 ć%(ųł'@ł·bțļBīģ,–ŁŚ³s šķ›r÷BōZxzßyO“ķ†ŠÜÕžƒ‡"ģń?£Ē-·Śō¦QĖĪž=‹Aƒ™}ß8p“éVW®\ép×Ōõó@Ō]­]» .€&‰”„^›Ū¶ā“°ųå%hll€  Z‚pm]“WßÓÆėt:üwĶ,~õ {7Q—'“ÉāŌØæŗÖk®®WؽśŚ°n(×@c“€Īh±˜Cå‘»ø`Ų{aŲ{™-# €ČµŚTžˆˆ:/>ų’1~ˆØ3[»v-***$ßóöö6ūep{¬\¹nnnxšĮÆ’`DĄ”"DDDŽŒöDDŽgšąĮØ­­œ>}‚ `芔P(P^ł’ˆlƒ"""""";3fŒø~öģY444`Üøqpss³wՈ"DDDDDDX}}=Ž=ŠœœŌŌŌĄŻŻ}śōATT”Ų‹Ä’2¦rss‘’’‚²²2čt:ųłł!** }ūöµ÷%u‡še†ˆˆˆˆˆČ‘‚€M›6!55½{÷Ę 7܀¤§§ć—_~¹šōµõ2¦°uėVhµZDGG#:::»wļFC§4§ī=Dˆˆˆˆˆˆ:©Ė—/£““AAAøį† @II ņņņŸŸ­VŪj™Ž½{79®F£N§Cmm-*++„łóēĆɉˆŌ}8Ō§=!!±±±(**Ā–-[ąēēpvvĘųńćÅ×ę=zW®\ōéÓGĻgn»9DQQ9Ė€IDATĄ××S¦LAff&NŸ>-–©ŖŖĀØQ£0|ųpTUU!)) ŽŽŽā/° .H–:t(öķŪ‡ŗŗ:€»»;&OžÜāńłåĄM7Ż„żū÷7ŪW&“įŠ”C(**‚ ĒšįĆŪÕVęź0wī\ń\Ęķ#“™ŸZŖ}ŚZA$ŪM§ÓIno©>m½ö¶~®Z;žÆæž ̜9Óģu]¹r.\hŅ^DDDDŌõTUUT*U“ķ>>>ČĖĖCEE…8µpKeL"īīī˜1cŽ=Šƒ ŒÉ“'C.ē`r|1ˆ?üį€āāblŪ¶ 111f“¢°°·Ür żCgaa”ųžéö   Éć"“óēĻlŪ¶ W®\Axx8ĀĆƍŲ¶m HKKĆ AƒŸŸ/Ē\łK—.A£Ń`öģŁ€;vąņåĖfĖk4TVVāĪ;ļÄŋ%÷•••øå–[ Õjńć?¢oß¾šńńiS[™kć:˜kŸ>}ś˜½—RķÓÖ:˜k7A$·›7ŁÖó¶õsÕŚē-##£I°ĘÜuµŠ!"""¢®ĆÓÓ V«›l/++xxxˆŪ,)clĄ€0`źźźPTT„'NąōéÓ读7ś÷ļoļK'²9‡ ˆ @hh(rrr0pą@|óĶ7ˆmRęņåĖ _‡……įŹ•+Šét’Ū}||””…BFoooLž<={öDĻž=Åņõõõpwwor®Ć‡#""ĪĪĪ€‰'"77×lżĖ{{{£²²µµµÉdØ®®†···Łņ@MM vī܉±cĒJ•…^½zŠG…ūö틼¼<ųųųąčŃ£(((€““AĄØQ£ŸŸ/Ł&Ųæ?jjjč£ĪS¦LĮ‘#GÄ:̘1C²}t:ä¾ęŚĒÜż2Wsķf™nÆÆÆ—¼æęĪŌ¦¶2÷¹2·=((•••8wī&NœˆŌŌT0{]•••(//ĒĪ;”Ńh n¼ńFń3GDDDD]CŸ>}ąēē‡ĀĀBģŁ³½zõĀ•+WPPP???ń‹EKŹĖĖĖĆoæż†^½z‰_Ōŗøø@³ē"GÕ-"ąåå…ŖŖ*ČåņfĮ@’`nÜ#ĀÅÅEŒ°JmwuuŜ9sÄķ7nDUU•ĮDpp0|}}Årج¬l±G„1ÓņŽŽŽšööĘĪ;ÅŗĪ)U>** —.]‡WHķėėė‹óēĻcųšįŠét(,,„››.]ŗ„ŅŅRÜ|óĶMꔓ“#Ł&.\€\.{+ģŪ·ŁŁŁMź``Ś>ēϟ—Ü×88`Éż2W‡³ķ&µ].—KŽ_sēmk[™ū\µ“}ļŽ½˜2eŠŲ%²„ĻCee%źėėqĖ-·@&“įąĮƒ8ž<†jŃēŽˆˆˆˆ:¹\Žłóē#%%/^ÄŁ³gįįၑ#GbģŲ±āŠKŹėÕ«FŒŒ üöŪoōKFGG7ł“Č‘u›€HEEüżżĶ¾ļęꆶśzńu}}½8¼Fj{UUöļßWWWń›yFØ««Ć®]»0hŠ q‹AZZlq½MĖgddĄÓÓŃŃрäädddd`Ų°a­æ„}sss±yóf899ĮÅÅīīī(--E@@€Åm„V«‘——‡ķŪ·‹ļ?¼Hµ„ū¶·ę®€äöÉūkī¼mm+sŸ+sŪSSSŃ·o_ųłł”¤¤¤Õ{źććq茏8ž”ˆˆˆˆ:'©/nĄÕÕ“'OĘäɓĶīkI™Ē{¬ÉėQ£FaŌØQö¾l"»é™rJKK‘““c¶· ļŠ–••%¾ĪŹŹBß¾}Ķn?{ö,zõź…éÓ§cüųńÉdŠétŠjµŲ¶mʏß,č{ [\wÓņ‚ 4 čtŗ&Óhµt|sūÖÖÖ"$$óęĶĆģŁ³ŃŲŲ(>|XÜV*• AAA˜={¶øōėׯɾęŚĒ’}ƧꮯÜvs÷×ÜyŪŚVmŻ^WW‡¼¼śO<ńęĶ›'nŸ7oŌj5žń ::r¹õæ—Ėåš÷÷·wY¬KDt(²wˆˆČĪųQsiii(++Ƃ š½·`ĮÄĒĒ#-- Ė–-Ć£>йsēbŪ¶mųņĖ/±nŻ:$''ćć?FMM <<<šĀ / ""§OŸĘK/½„ٳg#55åååĶö’ā‹/0gĪüžūļpww7{¬yóęįŻwßÅȑ#qāÄ <üšĆųꫯ0jŌ(œ:u /½ō~łå{7%u2CDDDDDä ņņņąļļ/9lÅŻŻžžžČĻĻGTTNŸ> HMMÅøqć V«ńā‹/ā™gžĮ?ü€§Ÿ~/¾ų"jkkįāā‚ŠŠ ØT*|üńĒ’ūkéXQQQ8yņ$ąčŃ£1bŽ?8qāD³cŁ "DDDDDDĀÉÉ ‚ ˜}_Čd2DFF"==€> 1~üx>|=zōĄųńććĒ‡ÆÆ/’““!“ÉPWW‡;īø^^^’ūkéXćʍƉ'ĒŽĆ=÷܃cĒŽŽ?Ž &Ų»©›`@„ˆˆˆˆˆČAōéÓ„„„ØŖŖjö^MM JKKѧODEEįĢ™3ØÆÆĒ¹s牒’\ŗt óēĻ—śśzTWWœįéé ’ūkéXćĒGjj*A@vv6f͚… .@§Óįäɓ͂+D¶Ņ%sˆQsC‡EPPÖÆ_ŲŲŲ&ļżšĆ读7† ™L†=zą×_Exx8¼¼¼ąļļ°°0|’ż÷ĶŽ{įĀČd2ńµŸŸ_³żKJJÄ÷[:(•J$%%!<< …ĮĮĮųż÷ßįåå…ĄĄ@{7#uģ!BDDēĖ•ńåŹö®F—4nåĶö®B—«'?oDŌ™Čår,Y²_}õ~śé'ŌÖÖ¢®®›7oĘžó,Y²D lDEE!11Qģ‘1aĀ\¹rG\¾|wÜqŹĖĖ%Ļeŗæ±ÖŽ…ļ¾ūcƌŒ=«WÆfļźPł-t„ø“…ŠŠ€ō%qH>IĆ'"żµe5Y98öĄcH>{&Ģę„ļ@ØÆ·÷„ż?{w_Eu>~üsļMroB’›@6 !@¶d5ģøP@“Õ¢U¬öŪ–ŗPė®UŖ”V±æV~«EQŌoD¶ ˆ,!Hd_B @ d% Ł·;óū#Ük–;Y $Ļūõš—3gĪ9óĢ3£rgfD+XŲüķśÖŃ×ӏi{®Uœöś©Sźx+e·|¼€ń’ų¬Q›½ 7höóSŗ’8lZ×ÅŽ½&„iģŲ±üżļgżśõL›6©S§²nŻ:^{ķ5āāālõbbb½Õl6³lŁ2^{ķ5n»ķ6~’ūßsļ½÷b6›ķ§iū†Zė+66–ƒ2dČ ~@d’žżņžń“źTĢܜq Ż"ēŽ]AeĘyF}½€#‹žąü{+ Yø€£<‰÷ų1 |ó洞Œ7’—ÓÆż‹°'žŠŃ§+„B“Ūū>åxžIŽžµ”nŽ.¼¹÷?Ņ §¢sŲ·g—ę¾¾ż#;:¼+CLLL‹u&MšDJJJ³v|šA³ŗ”””$%%µŲŽŪۻѶV_7ß|s£ŗ#FŒh‹?¶N5 r„rVÆ#bŁK{t ģ‰?püOϲpe©iDÆ|ƒKżg«zżĻ|7cž ˆ!D'q,?%;ŽąlńyzyńäMæ#Ā7؟ š`ĢŻ¬8š½<ƒXqū¶Ł½¾^½y,ī!ūG0{łiZgļĀ ü÷Ų:Vśœœ²ķĻ|Ÿ}ˆ—·/g՜75ć¼Vē›[~‘nŻ5ė7}ÄZ¦KÓühłēwļqϐ¹Œ E ¹'Žś–’ŅŽ8µāyńŪט>‰·f-ÅÉąŲjĪZŠóZ]!Äõ§²¬EQPE± X’iQ®¾s!ÄuKDšņŽæ°”WŲ¶#–½Ä‰g_ęĢ?ėg‰-ų9:Õ«W„¢KĖø”ÉŌ° œ˜6eIo6ŚGŌ-8čxbĢ’°:u#’9š)9ełŌ)učųįū·÷Ÿ†Ao`TP łõoŚO/:ĖĢšxŒNL ›ČĖŪ—vń4Ļl]Ź3,@ßąĶż?¦īŻ|Č.Ķ%Ä#ššō×4? Y‹mżÅ‰‹łāų¾<±™‚ŠBīx;ĘÜ}ĶćlOzŃYné7„ÅĮ«‰SŃ9tĘGf„­“Ą9°'å§Nć>Øž?vå'Ó1õĄ„wC?H°ÕĶž|-®żĆ;:d!„×Hˆ9§¾ajŲ6žś†^Aö;4™É°<ł]–Lz‚čƒŲ›u€?l|ζϠ74ėægėOnazßI$¦o³•÷÷ ćēƒf3*hN§Ÿģ|§õČßwæĶ7żW§n¼µw~ØÅ6F'²KsķĪŲhš/’3÷Ż#Š/Ol¶• ŽeLp,ŠŖ²/ū%¾Ųā@ƕÄi/žPĻ^|yb·˜Žh¶ĒµŠSŃ9Č#3BtM]n@äė(ŪĖW­üo›Į©W_'ņo/pźÕ×é1ū–FuźJJ)ܹ›“/-„ߟŸīčÓBq<5ö÷¼¼}9Mś!ę@žūūėß=xOmy€Cļh½’›~Ļ ßžæķ~‹;"oµ š<;žžŗė_<·må5õ3[{杄/®ś‹& †ŽABʇ,üņqJkŹøwČ| ń—Sš¾£ćΨۘ’QQ[ŁjŒæqĻn]ŠEUx0ęĶśtŠ;ŠĆ­;ŒzššĒiĻÓćńņöå¼¶ūź¼CäZÅ)„čä‘!ŗ¦+™Ÿ«k°@ż ŠuqŒ€ p\€n—×­Ū¦u¬õŖŖ.nĖĮW­ZÅó'ŁŻgļė2M?ģ ˆ(55œxęeræŚ@÷YSé÷ē§Š;:ŚśŌøö #äĮ{é>sźvA„B“īdZ}Ć=5÷據p}}UQU¶g$“šż‡|ō³^Q×b@D\{×ćż&DgöÉŖ-Ģž=UUķkŗ­UööĖXōųŌÖÖ XRvo×<^ßž‘(ŠUUłäćYōĒg::BÜšt:Żė@P}y±®W\^/*/o[×­õj€ŗ €Ś`i³N5C¤é@G[ė蝜šź xõ…+źS!Äõåzūa:™3g³fĶbžüłģŪ·€eĖ–qōčQ^xįž|ņÉfĢ\ɳѩfˆüēżÆų備äē±aż.¼¼Ģ8::0<6¶­e’¾deåąĖ”żZ,גœ|˜‹łÅxxŗ1zō`Μ¾Ą±c?LO++«`ą ¾DFö”¬¬‚mŪ¾ĒŻ½cĒFp:=Ónżz““ė •UÕøø˜ˆ‹Ōb’7$?y$»“5k«ÓéųnĻņóė_&HDdŸ+Ź•k S¦ŽbĻž#Ķņ£ÓiŚ^~Śƒ¢Øvó¦ŖŲ-o)žöž{{ļ+{åÖųKJŹP7F©Ļ[ĆÜŲŸÖ®Ų„B!Dē’““ƒ»»;®®®šu Y¼x1Ė—/'::šC‡ńŠC±fĶ(//'77—Ļ>ūŒcĒŽ±`ĮęĻŸĻ’%K;vl³… .šŚkƱråJĀĀĀX¾|9•••čõ-’ż»““%%%xxxŲŚ¼ņŹ+¼ńĘDEEń駟ņā‹/²zõj{ģ1yī¹ē6lW}>īīī}¹DėT" łśz1mzżHdĮÅb6'īįÖŪĘc29Ł­Ÿ—WH^^!3fŽ`ÓĘŻäåŖŻr??O»żää`±(̜u‰‰Éde]¤Oh }BØ­­csb2įįĮ=ršššrr.ŚśŃŖŸ™™K]…ųųlݲ— ņ5ė×ÕY()-g޼xĪĖ±ŪVQJK+˜1s ‹Ā—k¾% Š³ŁžDµr„•“†1hå' ĄWóZŚĖO{cŠŹ›¢(vĖż®É¹·÷¾Ņ*Æ©©ĮÅÅʛ†Ō—oŚMvöEüü¼l¹molB!„¢ó1 (JĖ_ĒŁ»w/žžžDG×’eć Aƒ %%…Aƒ”( ³gĻ ""½^O^^={ö“Ū߁ %,, €;3>ų ÕXu:UUUĢ;×6€³uėVŪžįƇ³téREiqpåJĻGDD§iČŪǃądddÓ·o0¬XĒ/4žB–u!Ÿ^=lŪ!½zŌ’M»ŖŚ-7›»±mŪ÷8 ŌÖYpwļF\Ü üż½ń÷’įY¶šźZ\\ŒŽµ÷»£ Ž£c}śGŒŒāüł\ĶųÖ7»»RZZNee5:”—WāīŽM³~ņīĆTVTóĶÖ†F÷³ŪöĢ™,ü{ų`0č ō#'»³Ł•}ūRÉĖ-ÄąP’ÖAƒś’›S`7'¾¾$%¢²¢ g£G&eļ1[ ć' ³›UUķ¶ÕŹÖõҊA+oŖ¢Ś-Æ®®±{}µŽėēēŁ®\iŻWZåC†„Ų€ŅŅ *+«qsėÖ(·žnš± !„Bˆ®”gĻž”••QXXˆ———Ż:xz6ž3¢‡‡………¶m777Ūŗ^Æoq„øøŪ¶O›ćutt“ †(ŠĀ›o¾ÉŽ;prr¢¦¦UU[ģćZŸč:ŗÄ€€›› åe•čõŗfƒ!UÕ5fD899R\\ `·ÜhtbŹ”Q¶ņÕ_l£¬¬WW ž=ɇ źŽ§ē#%%唖V`BSM뻹»ąīŽo¶īĄŻģŠ««³fża1ČĢĢcĀÄE±ŪÖÓӍōS™DFöAUUņņŠ0šœČĢĢ£Ø°„©ÓāŔ‘‘m7'éé™ōzn¾<Ūb×®ƒœ=›Õ(«¦ł9uź¼Ż¶½zŁ…Öŗ^Z1ūkęĶ^¹^Æ·{}µŽŪŽ\iŻW-•|»ķ{rs ÄÕÕ¹Qn““ćŃB[!„BŃł…‡‡ćēēĒgŸ}ʃ>h·Ž··7EEEŹŠŠŠŚ5Ń››eee¶ķģģlŪzÓĮ‡’’’Fm>Ŗ¾uėVÖ­[ĒG}„‡‡iiiÜu×]­’ZŸč:ŗĢ€HII9ŽŽŚļ1™ŒTW׌¶««k0™Œ—×›———U’”t£Ń .Ļ,Ø«³PUUƶoR¶=ĘbuōH:żś…“9ī¦õSS3puuaÜųa|Ÿrœ© ˆčŻj’-µ=>—õėvbp0ąč䀋‹‰¢Ā¼}<ڜ«KÅedg_äėĶ{~Ølg0×^~ŚŚöJcŠ:wģ–ūŪ½¾ZĒmo®“ī«–Ź[œ»väĉ BÜ_-K!„Bt :ŽGy„gŸ}???¦NJyy9ūöķć_’śK–,!66–—_~™0dČöļßOnn.Ƈ§²²²ŻĒŒŠŠbɒ%œ?ž   Ö¬YcčšõõEQNœ8Aæ~żųüóĻ5)))ĮĶĶ wwwŖŖŖXµjø¹¹įččČ„K—šµ»Öē#ŗŽ.1 RXx‰sŁ Ö_³N@€/){Ń@/ĪžÉ"66EUķ–ŸHĖ G¢†QUUCęł}øļ¾ūxąšõõåī»ļF§Ó”Óé0›ĶÜ’żüö·æÅl6³`ĮL&“ŻGVāććŁøq#3gĪÄßߟŋ“žžĪC=ć~ȬY³xį…ųč£xõÕWmķ<==Æéłˆ®Cw…mt Ś:4Xœ#`œ Ūåuė¶©Ak}£ŖŖ‹ŪršU«VqĒüIv÷ŁūʌŖŖčt:FŽˆŠ¢Ś}‡ĄĮiœĻĢE‡Žą` Ó,ĻĻ/b×΃ø›»atrBoŠSr©Œą`öķKmōŲCDDoś„b±(¬śx?’Å4Ū>EQXænÕÕ5TUÕ?Ž1bD¾~žvė×ÕYŲ±cżaƒ^ĻMc‡āą`°[æ¶¶Ž5«æeĪÜIšmu:ųfk ÕÕµčõ:""ūR’.Š}ūRÉÉ)ĄĮĮ* ˆčMPPw»9±¾¤¢¼ƒĮĄØøA88l1?vĘn~z÷ °ŪÖhtŌĢO{bptt°{ī€Żņ¢¢»×wŹŌQš÷I{rÕŽū­®ĪĀöķūØ(’įŻ(ćĘE£ŖŖ-·-õ)Dgs2­ˆ¾įņ~!„čŠ>YµÅö‚̦÷® {eo汌E?Amm ŠEAQ,(ŠR’ˆ—×Åry_żŗŖŖ|ņńĒ,ść3‚ė^EEcĒŽeóęĶĶŽķ!€N§{ØŖ//ÖõŠĖėe@ååmėŗµ^ P×`śē ¬KŪćø’Ų¹ND„Bt 2 "„]— ˆ\*++łĶo~ĆO}šńćĒóńĒ3{öl¦M›ĘŹ•+›õWPP@LL œ:uŠ_’ś×̘1ƒY³fńÆż EQHLLdΜ9̚5‹łóē³oß>–-[ĘŃ£Gyį…xņÉ'Ų½{7wŻu³gĻfžüłlß¾€cĒŽ1}śt^{ķ5ī»ļ¾ŽN§č$ä"B!:„„.\ų“/&!ʶž²0„£O’';ēå\źūA!®7/^äķ·ßfÜøq Š‹‹yōŃGłė_’Jll,ß}÷>ś(_}õz½žņņrjjjųüóĻ9qāwß}7cĒŽÕ|WHuu5æūŻļųŻļ~ĒŌ©S)--åĮ$00ųųx^yåŽxć ¢¢¢ųōÓOyńÅY½z5=ö‰‰‰<÷Üs 6ŒĀĀB/^ĢņåˉŽŽęŠ”C<ōŠC¬Y³'''JJJššš`łņåRŃItŖ"›CŗŪ–+mד}řÓģ»ū¾‰ cūˆ!¤>÷JuuGŸŖBˆVŲūńkøh8€q-¤,L¹¢Įk½~bbš-)&!†•‡ź’†ńĆC^Uż4˵œ»tŽ%;–p4ļ(=ÜzšĢøgč7°ĆĻłĮ˜Yq`½={³āöšqž÷ŲłšŠ‡ä”åP«Ō?nhYud ß'ą w`ŃČELļ;½ÅćšMfŽŪ’ž&OĪr¶ÅükÅŁtČõ6č#„×GGG~ó›ß°lŁ2āććquuÅŪŪ›^½zńŃG5«öģYJJJlƒ"ÖGU“ųųųpńāETUmö’Õ­[·²nŻ:>śč#<<¼£S(:)™!ĀĖØuµTž;Ē™½Į‘?üƒŽ#rŁrRŸżg’łz‚ÜCG‡,„āYŗš÷¼ONYuJ:~ųŪ§éaÓ1:™:…„»–¶ZnOŚÅ4žŽśĆ¬B½ī§ū»ˆ–½ó§ćüóÄ?ółńĻY{b-+.ņó?ēĮ˜˜Ż6½ø 8ņ+ņ[gJŲ¦„MąÉ-O¶š{q !„h?NĒ¢E‹xųᇙ={6!!!,[¶Œ×^{ŅŅRøļ¾ū0›Ķa0ŠétĢ›7ņņryäzöģIAAŻžF#Ææž:Ė–-ćß’ž7ƒ›o¾™9sęPQQĮʍ™9s&žžž,^¼˜ōōtzč!>üšCf͚Š/¼ĄG}Ä»ļ¾Ė«Æ¾ŹŅ„K©ŖŖĀŁŁ™„K—āééi{lFˆkIDŠ98āŅ'”šg^`g\żß¤¹ōīCōŸŲźdžnżttØB!®‘ד_gɤ% ė1Œ½Y{Y“q‘mßĘS™6•Mé›čåŃ«ÕrR/¦Ņß§æ­¬æO~1čŒ …“Į©£O×ĘAßųZqŽ Ƙą1(ŖĀ¾ģ}<šųØm@Ä æśæ h)’öā0:É*Ķ¢§[ĻŽN£B\—¾ūī»feŃŃŃ$''Ū¶cbbųąƒģ¶WU•_üāüāæhTīķķm{ńŖ‹‹‹m <<ÜöUƆÜÜܚ•’ē?’±­’ś×æę׿žµm{ŌØQŒ5ŖY?”””$%%utjE'ÓåD6‡t×|*ŖJungßś'±#ķŖ+¹DĮĪķ¤½ōż’üJGŸ†BˆkäžĮ÷šŌ–§øwč½ö->ĖÄ vęŁń϶Zžšš‡łõW榬¦Ģ6;ć¹ńϱt×RžŻö,å5õc¶öHGBBĀOže­8­Ś8ččé֓GG=ś“å_ĖQw2’’ęSQ[!Ē!漏 O…čŒ®ä­4ŗ ŌŖX'Ą˜gĄčvyŻŗmjPĒZߨŖźā¶|ÕŖU̟?ßī>{_—i:ųao@ÄŚN§×cģīĻ„I„żńi=óÖķ‚!„h]ZZįįįšū­u5ƒ 1 1vlk•_K1 Ņ™]‹ūAqżXµj³gĻš’p·÷CŽ^ŁŪo,cŃćOP[[ƒbQP Š¢ *?¬+Šåņ¾śuUUłäćYōĒg::?Ŗ³gĻ2oŽ<»³L„øVt:Żė@P}y±®W\^/*/o[×­õj€ŗ €Ś`i³N5CDsęG+uZjז>…B\_䇯hHī!„h»^½zÉ`ˆč2ä+3B!„Z³@~ŠG4ä¼B!ďOD„B!„BŃåȀˆB!„B!ŗB!„B!D—#"B!„B!„čr:ÕWfŽ’},X@~~>ėׯĒĖĖ GGGbccmŪZöķŪGVV :“År-ÉÉÉäēēąééÉčŃ£9}ś4ĒŽ³Õ)++cŠ ADFFRVVʶmŪpwwgģŲ±¤§§Ū­?`ĄvķŚEUU...ÄÅŵؒ† ˜Š¢JddäåJ‹5†©S§ŚŽÕ0?:ö ķå§½1(Šb7oŖŖŚ-o)žöž{{ļ+­r­<4Ģ­5ī7āääÄĉB!„]Kyy9o½õß~ū-čt:z÷īĶż÷ßOlllG‡'Äu£S ˆ4äėėĖōéÓøxń"‰‰‰ÜvŪm˜L&»õóņņČĖĖcęĢ™@żʼ¼<Ū¾¦å~~~vūÉÉÉĮb±0kÖ,ÉŹŹ"44”ŠŠPjkkILL$<<€#GŽNNNŽ­­ś™™™ŌÕÕĄ–-[øpį‚fżŗŗ:JKK™7oēĪ³ŪVQJKK™9s&‹…5kÖˆŁlnW®“rŅ0­üh^K{łio ZySÅny``ą59÷öŽW-ŻoöņŠ0·V©©©-č!„BˆĪmɒ%ŌÖÖ²bÅ <<<°X,lٲ…Õ«Wƒƒ/æü2S§NeŲ°a­öמŗBÜH:ķ€HC>>>„„„‘‘Aß¾}Y±b ,hTēĀ… ōźÕ˶ݫW/²²²PUÕn¹ŁlfŪ¶m źźźpww'..üżżmõ«««qqqit¬ļ¾ūŽ!C†ąččĄČ‘#9ž¼fü ė»»»SZZJee%:ŽņņrÜŻŻ5ėļŽ½›ŠŠ ¶nŻJtt“ݶgΜ”G ÉĪĪĘl6³oß>rssqpp@Q DNNŽŻœųśś’””DEEP?ŪbōčŃģŻ»×Ƅ ģęGUU»mµņ£u½“bŠŹ›u0ØiyuuµŻė«u\??ævåJė¾Ņ*÷ó󳛇¦¹-++ćäɓŒ9’Ƈ’’6 !„Bˆė]JJ Ļ?’<@żŸń'OžĢäɓmuŅÓÓŪÜ_{ź q#é"nnn”••”×ė› †@żó†3"œœœ(..°[n4™2eŠ­ü‹/¾ ¬¬ WWW žääd‚‚‚šōō“Õ+))”“““Å 5­ļīīŽ»»;[·nµÅf=¦½ś111dff2qāDE±ŪÖÓӓS§N‰ŖŖäååa2™ČĢ̤°°iÓ¦5Š)##ĆnNŅÓÓŃėõ¶Ł»vķāģŁ³b°jšŸS§NŁmŪpp -×K+†ąą`ͼŁ+×ėõvÆÆÖqŪ›+­ūŖ„r{šęvēĪŒ=UUŪt !„BˆĪ§wļŽ|üńĒ„††ŚÉ¼lŁ2Ž=Ź /¼@TTK–,!11‘„„Ŗ««éÖ­‹/&::ŗYŻ °`Į’’’°X,Œ1‚/æü’ž={’ĄĘQUUU™>}:<š€Ģ`ׄ.3 RRR‚···ę~“ÉDuuµm»ŗŗŚöx½ņ²²2’’’0¶™uuuTUUńĶ7ßn{ŒÅźČ‘#ōėׯĶq7­ŸššŠ««+ćĒźGSSS‰ˆˆhµ’–Śž?žuėÖįąą€““...āććÓę\“ĶęĶ›mūģż0·—Ÿ¶¶½Ņ“ΰ[l÷śj·½¹ŅŗÆZ*oĶįƇ ÄĖĖ‹‚‚‚6µB!„ĻÓO?ͳĻ>ˌ3čŪ·/111Lš4‰ĮƒšŲc‘˜˜ČsĻ=ǰaĆØ¬¬ä•W^į7Ž **ŠO?ż”_|‘Õ«W7«›––¦yÜƇóÅ_šß’žJJJxé„—8wī!!!!šé_™),,$##Cs¶Ōæ¼ņĢ™3¶ķ3gĪØYž––F=7n±±±čt:TUÅb±˜˜Hlll³Į؟1ŌęŲ›ÖW„Ń@ŖŖ(ŠŅ¦žµŚVVV̌3ˆ§¶¶ÖöĆ:77·Ķ¹ņššĄĻĻųųxŪŅ»wļFmµņӖ¶WƒÖ¹k•k]_­ć¶7Wķ-o‹ŖŖ*²³³ILLd÷īŻdggsōčŃ6ßkB!„¢s äß’ž7Ÿ~ś)·Żv™™™üś×æę‰'ž°ū—ŽĪĪĪlŻŗ•ØØ(†Nfff£ßmįęęFyy9«WÆęüłóø»»³téR ×­N;C$??Ÿµk×¢Ŗ*:ŽųųxŒF#Š¢Ų}‡ˆÆÆ/={ö䫯¾ 88Ųö7žöŹUUeēĪäēēćääDŸ>}Ų³gĮĮĮ”””Ų¦DDDŠÅbĮb±ąąšCŚEaŻŗuTWWSUUÅŚµk1b~~~vė÷ļߟ;v°yóft:z½Žö{õŅj«ÓéHMMåąĮƒčõz¢¢¢0™L’——Ēśõėqpp@UU""" ²›ooorssILLÄ`0×(ž'NhęĒ^[£ŃؙŸöÄŠRŽģ•ٽ¾S§NÕ¼OŚ“+­ūJ«\ė>ių8ÖšįĆmėłųcżń™ŽNĮ›:u*=ö7ß|3“'Oę/ł Ɔ ć믿ęļ’;}ō¤„„q×]w±gĻŪ Y­uO:Å/~ń ’““(**">>Žö‘†NŸ>Ķc=Ę}÷ŻgūŠ¢:īu  ؾ¼X×+.Ɨ•—·­ėÖz5@]ƒ@m°“™ Ó !„B!D'qīÜ9&OžĢ–-[ØŖŖ ¬¬ŒwŽy‡ššbbbpttäŅ„K@żūŻÜÜpww§ŖŖŠU«VŲ¾ÜŲ°®ÆÆ/Š¢pāÄ >’üsŪģõė×óōÓOŪŽ‰g}¤]^ų/®W2 "„B!„Dpp0Ļ?’<’żļ™9s&cĒŽe޼yœ9s†’żß’µ}ŠwÖ¬Y¼šĀ Ü’żÄĒĒc6›™9s&?ü0óęĶ#22’‡zØY]³ŁĢż÷ßĻoū[ęĪ‹ææ?&“ EQ˜8q"...Ģ™3‡[n¹…;!C†0cƌŽN‹vÉ#3B!n8ņȌBt]ņȌ7>ydF!„B!„¢ƒČ€ˆB!„B!ŗB!„B!D—ćŠŃ\ •üŽA!D“’!„Bˆ«!3D„B!„BŃåȀˆB!„B!ŗB!„B!D—#"B!„B!„črd@D!D§óN¼“šEG‡Ń% O˜ÖŃ!“™Ü'B!D×Ö©D¾‰²-ķQq&ƒżw/d[äHvŒ˜Č‰ēž‚R]Żź>!„ׯŽŽ¬Ģścżz’Ń~­ā“×Ļš„iĶ–Ž>ו‡>ąĆC’½Ŗx“ŚjåÓŽ="„Bˆ®£S ˆÜœq„›3Ž“»ŻŃGžÄ3”1{¾fdāj Ī&NæöÆV÷ !„7¢½ 74Z:ŚšŌØØ¬IŻŌŃ”!„¢ qčč®e©iDÆ|ƒ‹3½žē¾›1°'žŠā>!„7¾cłi,Łńg‹ĻÓĖ#ˆ'oś¾į@żŒ‚cīfŁĻčåĊŪß°Ķ20č ōõźĶcq1Ų?‚į Óx4ī×¼óżJō|€i}'r²ą4Ļoūē.]`~Ō­¼ąSö.ÜĄłKX²ćĶ;A·ī<=nżśwh.ģÆVœ’=¶Ž•‡>'§,Z„Ą6ø²źČšfyh‰ŁäĪ{ū?ĮÓdę,ēm±ŲĖsk×ÅśĻėa G!„×·N5CäJ¹Eōēü{b)/§®¤”Œ·ß§źBv«ū„BÜX¬?’žX~yūręFĢbĖ=Ÿ1'b&Kv¼Ń؍³ƒ‰wd$±ĪŖŲu߉{'·üÅV×Ao`żĻ?äłńņ=’ą„ķĖ™=`:›ļł„÷¶ŗ/|ūwnķ?…Æł)‹F=ĄĖŪ—·ēµ:_ ÅGfšžÆVœ’üī=né?™•?ū'I÷Æmt {yhɜˆ™¼²‚9‘3Å®•g­ėҰ][ņ „Bˆ®MfˆĖ^āij/sęŸõ3A‚ü śV÷ !„øńe\ŹdjŲŒNL ›Ą²¤7ķæ#źō<1ęXŗ‘’ų”œ²|ź”:tčluoļ? ƒŽĄØ ņ+ H/:ĖĢšxŒNL ›hPH»xšg¶.å– ×éŚī5ŃŅĄ@ÓóՊóʼn‹łāų¾<±™‚ŠBīx;ĘÜ­™‡–L Ļ”°ń<µå•Vól/N!„Bˆö’Ą„wC?H°mg¾מį­īBqć 1²ńŌ7L ›ĄĘSߊĖ#ØŃ~}ć’U.O~—%“ž ŗĒ öfąŸ³ķ3č ĶśļćĀś“[˜Žw‰éŪlåż}Āųł ŁŒ †“Į©£Ó y¾ZqŽ ŽeLp,ŠŖ²/ū%¾h±—‡öj)Ļöā0:8‘]šK·īF!„BÜŗÜ€Č×!Qš/^­+)„pēnN¾“”~~ŗĶū„BÜøžū{^޾œæ&ż‹s Oż}‹õļ<Ē6‹aĮŠ;Zļ’¦ßóĀ·ēo»ßāŽČ[mƒĻŽ„æīśĻm[FyMŠś#ļ$|ń“E+Nė£6zzøuē‘Q^Óć¶7ĻwFŻĘü’{ˆŠŚJy·ŪtšĆŽ€ˆµŽhĵ_!ŽK÷™S[Ż'„¢cœL+¢oø§ęžw¾®ÆĻŖ*ŖŹöŒd¾’~öĻ+ź£#D:³ėń>B“ī“U[˜={6ŖŖ6Ś×t[«ģķ7–±čń'Ø­­A±((ŠEQP•ÖÅry_żŗŖŖ|ņńĒ,ść3!nx:īu  ؾ¼X×+.Ɨ•—·­ėÖz5@]ƒ@m°“Y§š!Ņ–OīŚ«ÓR»+łŒÆBˆŽu½żĄž0 ½NGˆ9§Ē-źčpÄe×Ū}"„BˆŸV§B!®Gןń ł/„OUU+V¬°mėt:œéŃ£C‡ÅĖĖ«£C¼į$$$`2™øēž{::q“Ļ„!„B!DÓėõDEEŃæ\]]IOOē‹/¾ąüłóŚOęĀ… $$$PQQqUmFMlllGŸŽøČ !„B!„č`ÄÅÅŁ¶9BRRß~ū-wŽy'ĆÕĮėz—‘‘qMŚDFFvō©ˆ„ ˆ!„B!Äu&**ŠcĒŽQ\\Lnn.={ö¤ŗŗš}ūö‘‘‘AEE...ƒ³³3åååģŁ³‡ģģljjjčŽ½;£FĀÓӓŠŠ >üšC<==™;w®ķX’ž÷æQU•_żźW¶:={ö¤OŸ>ģŻ»GGGʏOEE»wļ`ŌØQ„……PSSƁ8{ö,eee8;;ÄšįĆ1ØŖŹ;#‡‡cĒŽe×®]\ŗt ƌƒŸŸk×®%;;€?ü˜˜¢££ÉŹŹ"%%…‚‚t:~~~ÄÅÅįįį”Ł¦é#3­å­-ń‰ĪI™B!„Bˆė··7%%%(ŠĀڵk9|ų0={ödģŲ±süųq6lŲpłk8 ėׯ'==~żś1bÄrssYæ~=ÕÕÕm:¦u&Jqq1™™™QVVĘĪ;9qā”””TVV²sēĪś/óØ*_}õ$<<œéÓ§Mzz:›6mźß‹¢×멬¬$99™Ž½{Ó³gO.^¼ČÖ­[ˆÅĶĶ € &Fuu5›6m¢°°ńćĒ3lŲ0233łśėÆ5Ū4Ֆ¼µ%>Ń9uŖ"’y’+~¹`&łłElXæ //3ŽŽ °mkŁæļYYłų2dhæ˵$'ęb~1žnŒ=˜3§/pģŲ[²² źKddŹŹ*Ų¶ķ{ÜŻ»1vl4§Ó3ķÖ0 7I»RYU’4qqƒZģć†$ā'dwŅ”fmu:ßķ9B~~1Š¢HDdŸ+Ź•k S¦ŽbĻž#Ķņ£ÓiŚ^~Śƒ¢Øvó¦ŖŲ-o)žöž{{ļ+{åÖųKJŹP7F©Ļ[ĆÜŲŸÖ®Ų„B!ÄõĖśÉ`ƒĮĄ… (,,ÄĻĻ±cĒFAAŁŁŁäää ( EEEŌ¦?~œĢĢLzōčŃź1­®©©aāĉčõzΜ9Cqq1S¦LĮl6“™™Iqq1åå唖–rńāE¼½½ńóóCQÜÜÜęäɓäääąļļN§£ŗŗšńćĒćįၢ(|šĮ”””Ųf²899€‹‹ ÷Ž{/ŖŖ¢ÓéP…żū÷SXXˆ¢(šmjKŽzöģŁj|ÖćˆĪ„S ˆ4äėėÅ“éõĻą\,fsān½m<&“ż9/Ɛ¼¼BfĢĄ¦»ÉĖ+T»å~~žvūÉÉ)ĄbQ˜9ė&“ÉŹŗHŸŠ@ś„P[[ĒęÄdĀƃ8zä4įį!ää\“õ£U?33—ŗ: ńń#Ųŗe/.äkÖÆ«³PRZμyńœ;—c·­¢(”–V0cę,…/×|K@ f³k»r„•“†1hå' ĄWóZŚĖO{cŠŹ›¢(vĖķO‹kļqŪ{_i•×ŌŌąābbĢMCźĖ7ķ&;ū"~~^¶Ü¶76!„BqżRU•‹ė’ük6›)((ĄĆĆ£Q=³ŁLvv6%%%¶2Wמ?räHFŽ Š®—•ŗøøąąP’sŃÉÉ‰ŹŹJĢęśæ`vvv¦øø‹Åbė³ØØˆ76źĆĮĮ’’üżżmŪÖųõz=...TWWSWWgwĄAQ’““9sę ¶"k~Ś¢¬¬¬Õ¼õģŁóŠā7¾N; Ґ·Į!=ČČȦoß`>X±Ž_.˜ŁØNօ|Bzż0bŅ«Gżß“«ŖŻr³¹Ū¶}ƒĮ@mw÷nÄÅ Āßßo[żšźZ\\ŒŽµ÷»£ Ž£c}śGŒŒāüł\ĶųÖ7»»RZZNee5:”—WāīŽM³~ņīĆTVTóĶÖ†F÷³ŪöĢ™,ü{ų`0č ō#'»³Ł•}ūRÉĖ-Äą`@Q źKnNŻœųśz”tˆŹŠ*œ]LŒ=˜”½Ēl1ŒŸ0Ģn~TUµŪV+?Z×K+­¼©Šj·¼ŗŗĘīõÕ:®ŸŸg»r„u_i•N``wJK+ج¬ĘĶ­[£ÜzxŗiĘ&„B!n,GŽ”¤¤wwwüüül¼7ŖWTT@·n?ü&(--µ­8p€}ūöKxx8P?0¢( z½ž¢¢"źźź®ų„­ÖćśłłqĖ-·\Ó=z”#GŽJ\\ƒ•+WR[[Ūę>¬ƒCmɛčzŗÄ€€›› åe•čõŗfƒ!UÕ5fD899R\\’{åF£S¦Œ²•ÆžbeeøŗÖOÓR•=ɇ źŽ§§»­^II9„„“ķÅ}śŲb*//ēģŁ³œ9sĘkzz:aaaĶŚ4}j[ņ&ŗ®.3 RRRŽ··ö;DL&#ÕÕ?üG ŗŗ“Éxy½yyyY%II1ąņĢ‚ŗ: UU5lū&…šš`Ūc,VG¤ÓÆ_H›ćnZ?55WWʍĄ÷)Ē9‘šĮ€ˆŽ­ößRŪóēsYæn'ŽNøø˜(*,ĮŪǣ͹ŗT\FvöE¾Ž¼ē‡Źvf²ŁĖO[Ū^i Z箂Żņą`»×WėøķĶ•Ö}ÕR9`‹s×®ƒœ8‘Ahƒū«„c !„Bˆė›¢(9r“ÉDļŽ½‰ŽŽ¶½XUÆ×3kÖ,¾’ž{Ī;GZZŻŗucąĄDGG£××/cśōéģŁ³‡'NPSSƒŸŸ#Gޓ̈́˜8q";wī$33“ŅŅRƌĆöķŪŪüŅÕ¦t:3f̰}eęĉ8::āļļOLLL›C žs¹ÅÅŤ„„įāāBdd$999äääPZZʐ!C4hŪ·o'%%…޽{7kÓt@¤­y]S—),¼Ä¹Œl† ėÆY' Ą—”½Ēč? gĻd‰¢ŖvĖO¤eŠ£‡QĆØŖŖ!ó|Ŗ ‹…͉Éčlw&##›į±m’.vÓśŖ¢ 4yvNQ”6õÆÕ¶²²šą`‚FFQ6nH"0°;/sģčé6ēŖøøŒŖŖjFŅØ~mmm]+?nvŪ¶÷ziÅpōHŗfŽģ•k]_­ćVVÕ“+WZ÷•VłńćgØØØbŲ°ōz,—ąZ;–B!„ø~™L&.\Ų¦ŗF£‘øø8āāā4ėø¹¹qóĶ7kīļŽ½;?ūŁĻ•Ķ›7϶īääŌ,ž»ļ¾»Ńö¬Y³šCĆw•Ųó«_żŖYYĆO’BżĖN›~)fśōéĶŚŻu×]-¶i[ņ֖ųDēÓiDņó łjķŪ‰oށŃč„¢Øvß!āėėIĻž¾|õÕtčö·żæ½rEUٵó yłEœčŻ'€ļö!8؟’’rv'²õћ>”X, ‹‚ƒĆĻē)ŠĀśu»Ø®®”ŖŖ†ÆÖī`Ĉ(|ż<ķÖļ׿;v쯟”ÓaŠėm_±Wæ!­¶:œH=Ė”ƒ'ŃėuDF…b29čG^^!ė×ļŖļS…½ źn7'^Žfrr ؜˜l{qTÜ Fń¤8§‘Ÿ»mFGĶü“'†–ņfÆ¼ØØÄīõ2u”ę}Ņž\iŻWZåf7¶oßĒWkwõļF‰ŃčeR-ŻĆB!„B!Ó]a]ƒ¶ 'Ą˜gĄčvyŻŗmjPĒZߨŖźā¶|ÕŖUÜ1RGēM!D:™VDßpya°BtEŸ¬ŚĀģŁ³ę_±÷å{eo汌E?Amm ŠEAQ,(ŠR?£śņŗ¢X.ļ«_WU•O>ž˜E|¦£S Ä O§Ó½T՗ėzÅåõ2 ņņ¶uŻZÆØk°@ż ¬K›ÉSB!„B!„črd@D!„B!„]Ž ˆ!„B!„¢Ė‘!„B!„Bt92 "„B!„Č¤I“˜3gŽŻ}wŻu“&uĢG* ˆ‰‰”¢¢¢#Ó#„ ˆ!„B!D'S^^NZZZ£²sēĪQ\\ÜŃ” qŻpč讄ߎA!D‡*’’!„-ˆećʍ„‡‡ŪŹ6lIIIž×™!"„B!„ĢøqćŲ¼y3ŖŖŚŹ;vl£z‰‰‰Ģ™3‡Y³f1ž|öķŪŌĻ&™0aėÖ­cīܹÄĒĒ“@ZZqqq¶>, 111deeµŲ§×B!„BˆN¦OŸ>øøøpųšaNŸ>N§£OŸ>¶:•••¼ņŹ+<’üó¬]»–ٳgóā‹/ąąą@yy9¹¹¹|öŁg,_¾œwß}—’’’ŪRŸB\od@D!„B!:”)S¦°iÓ& ~ÖĘäɓķwvvfėÖ­DEE0|ųp233QEQ˜={6čõzņņņZ½‹F.bzßé׬~GŠIˆįĮ˜Yq`½={³āöœ»tŽ%;–p4ļ(=ÜzšĢøgč7’ū/śœ²j•śēŃ­ƒ+«Ž¬jv¾-1›Ģ¼·’=ū{žüķŸ™Žwś5­Æēµ:ߦŽ4ÜļāąĀ¦»7±|Ļr^ųöęFĢåioš}ö÷¼“ż%>™ó ’ļ»’Ē=Cīa\Č8‚ĢA8źm}Ų;ß–Ģ˜Ė3ß<ĆK_bĪžF1ŁĖ½8S¦h¾æäZåS!„‹ ˆ‘Ė–“śģŸ8ūĻ7Š»ø¼ą~0ZŻ'„¢s˜6£ƒ‘)”SXŗk)P’ĒūŽ'§,‡:„:[żŁżgcŠˆ Š#æ"’š×’±µ40pGŌ8čųӘ?v1§·ž0+RÆ«ŚöĻ’ĢēĒ?g퉵\¬øČĻžœcŌ<ߖL ›Ā”°)<¹åÉ6å§iœB!„ķ%"€Kļ>Dš‰m;ūóĻpė? Õ}B!:‡§625l*›Ņ7ŃdzÆ'æĪ’IKÖc{³ö²hć"[}ƒ¾łĄųµ¬ß‘ō’hŠß§?æō FĀÉąd+<†1ĮcPT…}Łūx4ńQŪ€ˆ½ómÆÖņÓ4N£ƒ‘¬Ņ,zŗõģč4 !„āŠåD6‡t×|ńj]É% vn'ķ„ēč’ēWڼO!č-ćRWL$ÄĀsćžąžĮ÷šŌ–§øwč½­öńcׇśg²ź/£<7ž9–īZŹ³Ūž„¼¦ųįńؘčé֓GG=zM{%ł¹3źNę’ß|*j+äń!„B“źJęēź,P?Øb]œ#`œ Ūåuė¶©Ak}£ŖŖ‹ŪršU«V1ž|»ūģ}n·éą‡½k;½ŃˆkæōzšaŗĻ¼µÕ}B!:FZZįįįšū­/sėlŸUķˆ‘ά³Ž'Btv«V­böģŁØŖŚh_Óm­²·ßXƢǟ ¶¶Å¢ (EAU~XWĖå}õėŖŖņÉdzčĻtt „øįétŗ×* śņb]Æø¼^T^޶®[ėÕu µĮŅfj†H[>¹kÆNKķ®ä3¾B!:–üĄm!÷‰Bѵé;:!„B“ü€B!„øvd@D!„B!„]Ž ˆ!„B!„¢Ė‘!„B!„Bt92 "„B!„Bˆ.§S}eęż÷ßgĮ‚äēē³~żz¼¼¼ptt$66Ö¶­eß¾}deeĄŠ”C[,גœœL~~>žžžŒ=šÓ§OsģŲ1[²²2 Ddd$eeelŪ¶ wwwʎ @zzŗŻś `×®]TUUąāāB\\\‹żoŲ°€É“'“””Ō¬­N§cĻž=äēē£( ”””DFF^Q®“Xc˜:uŖķX ó£ÓiŚ^~Śƒ¢(vó¦ŖŖŻņ–āiļ¹·÷¾j­’7āääÄĉ5Ļ+++‹ōōōFłB!„BńƒN5 ŅÆÆ/Ó§Oąāŋ$&&rŪm·a2™ģÖĻĖĖ#//™3gõ?:óņņlūš–ūłłŁķ'''‹Å¬Y³HLL$++‹ŠŠPBCCØ­­%11‘ššpŽ9Bxx8999¶~“źgffRWWG||<[¶lįĀ… šõėźź(--e޼yœ;wĪn[EQ(--eęĢ™X,Ö¬YC`` f³¹]¹ŅŹIĆ“ņ y-ķå§½1håMQ»å×äÜŪ{_µv愦¦6¬Ń:Ɩt„B!„Bt⑆||| !##ƒ¾}ū²bÅ ,XŠØĪ… čÕ«—m»WÆ^dee”ŖŖŻr³ŁĢ¶mŪ0 ŌÕÕįīīN\\žžžųūūŪźWWWćāāŅčXß}÷C† ĮŃŃ€‘#GržüyĶųÖwww§““”ŹŹJt:åååø»»kÖß½{7lŻŗ•ččh»mϜ9C=0 ’Łlfß¾}äęęāąą€¢( 4ˆœœ»9ńõõ%))‰ŠŠ  ~¶ĀčѣٻwÆ-† &ŲĶŖŖvŪjåGėziÅ •7ė`PÓņźźj»×Wėø~~~ķŹ•Ö}„UīēēGii)'Oždäȑ>|@ó¼JKK¹té[·n„®®EQ˜4i’ķžB!„Bˆ®®K ˆø¹¹QVV†^Æo6õ?ĢΈprr¢øøĄn¹ŃhdŹ”)¶ņ/¾ų‚²²2\]]śG4’““ ĀÓÓÓVƤ¤„ŅŅŅgD4Ō“¾»»;īīīlŻŗÕ›õ˜öźĒÄЙ™i{¼Ā^[OOON:Edd$ŖŖ’——‡Éd"33“ĀĀB¦M›Ö(¦ŒŒ »9IOOGÆ×Ūf+ģŚµ‹³gĻ6ŠĮŖi~N:e·mĆĮ¶\/­‚ƒƒ5ófÆ\Æ×Ū½¾ZĒmo®“ī«–ŹwīÜÉčŃ£QUÕ¶_ė~(--„ŗŗš™3g¢ÓéHNNęŌ©S 0 M÷B!„Btv]f@¤¤¤oooĶż&“‰źźjŪvuuµķń{åeee$%%a4m3_WW@UUß|ó įįį¶ĒX¬Ž9Bæ~żŚwÓś©©©øŗŗ2~üxRRRHMM%""¢Õž[j{žüyÖ­[‡ƒƒNNNøøøPXXˆO›sU\\Lvv6›7o¶ķkų每^~ŚŚöJcŠ:wĄnypp°Żė«uÜöęJė¾Ņ*?|ų0xyyQPPŠź55›Ķx{{Ū1›Ķ”••µł¾B!„BˆĪ®K|e¦°°ŒŒ ĶŁP’ņŹ3gĪضϜ9C`` fyZZ=zō`ÜøqÄĘĘ¢ÓéPU‹ÅBbb"±±±ĶC ~Ę@PPP›coZ_Q”FŖŖ¢(J›ś×j[YYIpp03fĢ >>žŚŚZŪļÜÜÜ6ēŹĆĆ???āććmKļŽ½µÕŹO[Ś^M Zē®U®u}µŽŪŽ\µ·¼ŖŖŠģģlٽ{7ŁŁŁ=z“Åū”ØØČV^\\Œ››[›ļ;!„B!„čģ:ķ ‘üü|Ö®]‹ŖŖčt:āćć1(Šb÷"¾¾¾ōģŁ“Æ¾ś €ąą`ŪßųŪ+WU•;w’ŸŸ““}śōaĻž=SRRBRR’­ļˆˆBCC±X,X,~H»¢(¬[·ŽźźjŖŖŖX»v-#FŒĄĻĻĻnżžżū³cĒ6oތN§CÆ×Ū¾BbÆ~CZmu:©©©Ń9ȀˆB!„Bt0āāālŪGŽ!))‰oæż–;ļ¼ƒĮ@dddG‡yÅ222š•ŻČē#:B!„BˆėLTTĒŽ£øø˜ÜÜ\zöģŁģ“¬¬,RRR(((@§ÓįēēG\\@żĒ%vīÜIAA&“‰įƇ“’’Bii)<šŖŖņĪ;ļąįįĮŲ±cٵk—.]ĀĆƃ1cĘąēēŌłpß¾}dddPQQ‹‹ ÄÄÄąģģ Ąłóēłžūļ)**BUU¼¼¼ˆ‰‰!00µkג Ą‡~HLL ŃŃŃĶΧ¼¼œ={öMMM Ż»wgŌØQxzz¶z !®D—ųʌB!„BÜh¼½½())i¶ÆŗŗšM›6QXXČųńć6l™™™|żõ×@ż6nÜHNNżśõcŲ°a?~œņņrōśśŸÖ—ņWVV’œœLļŽ½éŁ³'/^dėÖ­@żG Ö®]ĖįĆ‡éŁ³'cĒŽ%88˜ćĒ³aĆE”¦¦†M›6a±X?~<ćĒGUU¾żö[jjjˆµ}ńpĀ„ „……5;EQXæ~=éééōė׏#F››Ėśõė©®®nõB\ ™!"„B!„×!ė aķ½gĆh4rļ½÷ھŖ©( ū÷ļ§°°EQČĶĶ„¬¬ŒīŻ»ŪÅ `åŹ•śÓétTWW3~üx<<ų€’’jjjČĶĶ„°°???ʎ @XXdgg“““ƒ‡‡ŖŖRYYIii)~~~̚5ĖöµÉīŻ»ćääd‹Įś‘†²²²(**"00˜˜ ~ čųńćdffŅ£G!ĕ»G!„B!®3ŖŖrńāEĢfs³żŠ¢œœĢ™3gØØØhō5UU©ØØĄŻŻŻVŽ­[7š}yĒĮĮĮö˜^ÆĒÅŅźźjźźź(++°ķ·2›ĶdggSRRBĻž=™0aūöķ#99ØÄéׯqqq¶)-±ĒÕÕÕV6räHFŽiŪ¾ŚcŃŌ 9 ¢’ßŃ!!„č`ņ’!„Ł‘#G())ĮŻŻŻö.†Ž=Ź‘#G %..ƒĮĄŹ•+©­­°½Ū£įć6åååŌÕÕµėĖ.ÖŠāāāFåEEE@ż ŌĻ £ŖŖŠüü|<ȱcĒčŁ³'}śōiõ8Ö~JKKme`ß¾}ÄĘĘuÕĒ¢©r@D!„B!:“ŗŗ:’’’PU•ĀĀB²³³qpp`Üøqvė[>ŹĖĖ9{ö,gΜĮh4R[[Kzz:½zõĀŁŁ™ÜÜ\’’’šöö&--­Ż3)šņņ"//;vŠ£G²²²ČĶĶÅĖĖ‹€€²³³łśėÆéŃ£įįį¶Gd¬ĒXm9tč}śōi6ČÓ³gOĢf3.\`ļŽ½øŗŗrčŠ!ōz=½{÷nÓ1„h/B!„Bˆ¦( GŽĄd2Ń»wo¢££m/Vm*22’œœrrr(--eȐ! 4ˆķŪ·“’’BļŽ½™2e »vķāųńćøŗŗKAA‹„Ķqéõzf͚Å÷ßϹsēHKK£[·n 8ččhōz==zō`šąĮ¤¦¦Ś^źj6›?~<žžž¶x‹‹‹IKKĆÅńـˆĮ``śōéģŁ³‡'NPSSƒŸŸ#Gޤ[·ntėÖ­ÕcŃ^ŗ+l£kŠÖ”Įāą øŻ.Æ[·M źXėUU]ܖƒÆZµŠ;ęOźč¼ !„č@'ӊčīŁŃa!„čŸ¬ŚĀģŁ³š½ £é¶VŁŪo,cŃćOP[[ƒbQP Š¢ *?¬+Šåņ¾śuUUłäćYōĒg::W¬¦¦†÷ßwwwęϟßŃįˆ.L§Ó½T՗ėzÅåõ2 ņņ¶uŻZÆØk°Ø –6“"B!„BŃ ­[·ŽĀĀBŒ»»;iiiņ¾ !.“Wń !„čtŽIų‚w¾čč0:•į Ó::„+&÷ƒ¢«1bŽŽŽģŪ·-[¶P\\LLLŒķ³¶Btuj@¤pĒnöżü¶†c{ōM¼’·”ŸLoµŻ×!Q¶„©Š3ģæ{!Ū"G²cÄDN<÷”źźŽ>U!„­x`įķĶŹ¬?źÆ÷÷×*N{ż O˜Ęš„iĽ;‹;’ļ!ödīkS_{nųŃĪuå”ĻųšŠÆźœµņfļ^Bˆ®ĄĒLJéÓ§³`Į~õ«_1oŽ<Ū{?„l@$毒Šė×÷1īą.Fļ؈ßŌ›9pßoZmwsĘnĪ8bwßŃGžÄ3”1{¾fdāj Ī&NæöƎ>U!„āŠķ]øķ÷}Įƒ1÷šĀ·ļčpX“ŗ•5©›::!„Bt!ź"C’óŖ¢P[TŒ„¢ƒ‹óUõY–šFōŹwmżōśŸųnĘ<ĀžųCGŸ®BˆkąX~Kv¼ĮŁāóōņāɛ~G„ożēü†'LćĮ˜»Yqą3zy±āö7l³ z}½zóXÜC ö`xĀ4ū5ļ|潁E#`Z߉œ,8ĶóŪžĘ¹K˜u+ļų”½ 7pžŅ–ģųGóNŠĆ­;O[Ä@æž?鹫ŖŅčÕcöĪ×Zg‰¤žååķĖI½xŠZ„ζļJĪĖlrē½żŸąi2s–󍮣4ĻÆīü'•u•ą™ńų›žÆV/~ūSūN`Ū½Ÿ7ŚßŅyi™1“·SV0'rf£cŚĖócqæębEŻõ&•E<:źĮkž7!„Bt n@äęŒ#LJ?@ܶux &ķ…W®Ŗæˆe/Q”¼—ķĆ'’4qz£ .mBŃee\ŹdjŲŒNL ›ĄŁāóößu .ŽĪ<1ęXŗ‘ŪWŻĒ˜ßĘĀ/'æ¼ĄV÷öžÓ0:81*(†üŠśņō¢³Ģ Ēä`dZŲD[Ż“‹§yfėRF’ļ-ünżÓœ)ŹųÉĪyļĀ $Żæ–Oę¾ÅØĄa-žÆ–ō¢³ÜŅo NĒFåWr^SĀƳēõLg+ÓŹ³Aoą7ĆšéŃ/łĶšō†Ÿ,oBq#xšĮyė­·ģī{óĶ7yšĮŪÕ_AA111TTT°dÉ&OžŒ¢(ķź'&&†cĒŽż$9hsÓųÆō¼EēŌ)ŁėpéBßgS°}×UõåŅ;„”$0įŲʦlĆŌÓמįWÕ§BˆėGˆ9§¾”ŗ®†§¾”—GP£żśĘO—.O~—Å£fŪ‚’ņŚŌPŪ0¶†ėO[Äś“[ūļŪÅ~%ē՞<æŗėŸ„z†šŚŌõ į՝’üÉs"„׳I“&Q\\́•ļßæŸK—.1qāÄvõ§×ėńööF§ÓQ]]ÅbĮl6wȹ„§·žŃkÕĆóW§z©ją]sI{įJĒĮģŽ÷M£ˆśĒŅVŪ5$±®[æ:cŻÖøö £ß‹OŃ}ʔŽ>U!„­x'į‹6}n5Ā7œ•?³’£ŚŽ»(ī:Ÿū†Ī·mß3x®ŻŗÖķ~>”|ō³¢Ø*Ū3’é“@ {–OūóOž—–ŽÆaoŸVż¾^½y’¶×›•·÷¼“ņ¦•ēgĒżšĪ“?O\ܦctÄ@’Bt“ÉD||<ėÖ­c芔¶ņuėÖ1yņdL&))),_¾œŠŠ ŗuėĘ#<!C8vģ=öńńń>|˜æžõÆL™2…ķŪ·óä“O°pįB¼¼¼øé¦›øēž{lĒųōÓOILLäŻwßՌļܹsüņ—æä±Ēćż÷ß§øø˜¹sē²pįBŲøq#ŖŖ¢Ŗ*Ó§OēąoūGå…^ **Š%K–˜˜HBBÕÕÕtė֍ŋŻb~“Ś,[¶¬Q’>śØķ¼]\\Ų½{7’ųĒ?ØŖŖĀÉɉ‡~˜±cǶz>āśÖ©D¼ĒĮ{ü˜ėŲū¼®Ö'w[Ū'„āśŌ–ŸŅš„iču:B́<=nQG‡Óå\o÷ƒBüŲn¹å~’ūß³xńbœœœØ©©aĖ–-üć’ øø˜G}”æžõÆÄĘĘņŻwßńč£ņÕW_įääDII ,_¾œššM\²d cĒŽ%!!°|łr~ń‹_ŲŸłņĖ/¹ūī»[ŒĶĮĮņņrrssłģ³Ļ8vģ ,`žüłdddšÅ_šß’žJJJxé„—8wī=ö‰‰‰<÷Üs 6ŒŹŹJ^yåŽxć ¢¢¢ųōÓOyńÅY½zµę±[jÓ“’‚‚ŽVXXČāŋY¾|9ŃŃŃ:tˆ‡zˆ5kÖ“x>īīī}+ˆVtŖGf„Bˆė‘õ]ŸĪK`P÷ˆ+īG~Ų !„h‹ĮƒćååÅ·ß~ Ą¶mŪšõõeąĄ|÷ŻwtļŽŲŲXbccńōō$%%NGUUsēĪÅĶĶMó&LĄb±°kWż;Ož4h¤¤¤“x>āś×©fˆ!„B!„ųįåŖńńń¬_æžY³fŁö™™ŁØ  ¼¼GGG\]][ģ_Æ×3gĪ>ūģ3nŗé&Ö®]Ė­·ŽŠ££#mŃp°EÆ×£( ½zõāķ·ßęÓO?eåŹ•Ü~ūķÜwß}Ķ^āŖ( o¾ł&;vģ°Ķ‚š½LöjŪXóåééŁØĢĆƃĀĀĀĻG\’d@D!„B!:™3fĄ… Ų»w/Ļ>ū¬mŸ··7½zõā£>jÖ.==½Ķ/={6’ž÷æ9ž<›6mā½÷Ž»źø ĄsĻ=ĄéÓ§yģ±Ēš÷÷gęĢ™źmŻŗ•uėÖńŃGįįįAZZwŻuW‹}_Ik¾ŠŠŠ•įććsÕē+:–<2#„B!„ŒÆÆ/111üå/aĈxyyŁö1‚¬¬,öķŪĄ… ˜;w.—.]j×1Ģf3ńńń<żōÓōļߟž={^UĢėׯē駟¦ŗŗ€ĄĄ@<<X±Ž_.hüRž¬ ł„ōźaŪéÕ£žoŚUÕn¹ŁÜmŪ¾ĒĮ` ¶Ī‚»{7āāįļļææ·­~Mu-..ĘFĒŚūŻQ Ēѱ>ż#FFqž|®fü ė›Ż])--§²²ŹĖ+qwļ¦Y?y÷a*+Ŗłfk C£ūŁm{ęLž=ź_d0č ō#'»³Ł•}ūRÉĖ-Äą`@Q źKnNŻœųśz”tˆŹŠ*œ]LŒ=˜”½Ēl1ŒŸ0Ģn~TUµŪV+?Z×K+­¼©Šj·¼ŗŗĘīõÕ:®ŸŸg»r„u_i•N``wJK+ج¬ĘĶ­[£ÜzxŗiĘ&„B!ĵōļ’›?ü)S¦0wī܎Gˆ+Ņ%DÜÜ\(/«DÆ×5 ØŖ®i4#ĀÉɑāāR»åF£S¦Œ²•ÆžbeeøŗŗõhģI>L`Pw<=ŻmõJJŹ)-­ Ąž „¦šÖwswĮݽßlŻ €»ŁWWgĶśĆb™™Ē„‰1(Šb·­§§é§2‰ŒģƒŖŖäåa49‘™™GQa S§Å5Š)##ŪnNŅÓ31čõÜ|y¶Å®]9{6«Q VMósźŌy»m{õ²’b&­ė„Cp°æfŽģ•ėõz»×WėøķĶ•Ö}ÕR9Ą·Ū¾'7·ŠŠ@\]å69ł0-“B!„āZ¹ļ¾ūøļ¾ū:: !®J—)))ĒŪ[ū"&“‘źźZŪvuu &“ńņzóņņ²J’’b4:Įå™uuŖŖjŲöM įįĮ¶ĒX¬ŽI§_æ6ĒŻ“~jj®®.Œ? €ļSŽs"5ƒ½[ķæ„¶ēĻē²~ŻN pq1QTX‚·G›su©øŒģģ‹|½yĻ•ķ<Įe/?mm{„1h» v˃ƒżķ^_­ć¶7WZ÷UKå€-Ī]»rāD” Ž%„B!„¢±.ń Waį%ĪedÓ«ĮćMųręĢŪöŁ3Yśi–ŸHĖ Gʎ‹&66 N‡Ŗ‚Åbasb2Ćc#› †@żŒĄ īm޽i}UQP¼JUUEiS’Zm++« ögśŒ1ÄĒ ®¶ŽĄĄīxz¹“—[Ųę\yxøįēēÉĶń#lKÆŽgxhå§-mÆ&­s×*×ŗ¾ZĒmo®Ś[~üų¾’žø­Ü ×c¹<׌±„B!„B4×igˆäēņÕŚØŖŠN§ćęųN(Šj÷"¾¾žōģéĖW_ķ@‡Žą`ŪßųŪ+WT•];’—_„ŃɉŽ}ųnĻ‚ƒż)))gwŅ![ß½éˆÅ¢`±(88lūEażŗ]TW×PUUĆWkw0bD¾~žvė÷ėߋ;ö×Ļ€Šé0čõ¶/‰Ų«ßV[N¤žåŠĮ“čõ:"£B1™œ ō#/ƐõėwÕ÷©Ā€ˆŽu·›/o39¹lNLĘ`؏aTÜ Fń¤8§‘Ÿ»mFGĶü“'†–ņfÆ¼ØØÄīõ2u”ę}Ņž\iŻWZåf7¶oßĒWkwõļF‰Ńč­é-ŻĆB!„B!ėTŸŻBŃ5Čgw…¢ė’Ļī qć»^>»Ū%™B!„B!„hHD„B!„BŃåȀˆB!„B!ŗB!„B!D—#"B!„B!„čr:ķgw…B!„āZĖĖĖėč„×Č 9 ¢Ć·£CBŃ”Šä’B!„āŖČ#3B!„B!„črd@D!„B!„]Ž ˆ!„B!„¢Ė‘!„B!„Bt97äKU…Bˆ–$$$°pįĀVėĘ$Đ²0„£CP{īC!D×USSĆśõ뛕›L&|||ˆˆˆĄÅÅ„£Ć¼źóŅétF|||ĒŻŻżG=ž—_~‰N§cÖ¬Y qė”3DTE!eŽml鎦śł›7±wöL¶ō āŪaQžŻCTegµŗO!ÄõĖŽŠ˜„˜F’¼^]«8ķõ“CLB #ßɼĻę±óÜĪŽ>]ĶŲWZ Ą‡‡>¼Ŗ\üŲ×[ėzÉ@ˆ¢=ōz=”””„††Ņ§OL&™™™ģ޽UU;:¼fņóóY½z5UUUm:ƐœÉĢĢdŪ¶mäęę^óc Ń^r@äĢ’{£c›ėŸ{’]z’vć¤2z[Żś†sšĮ{[Ż'„B܈R¦ō«$žó/~ūbG‡£iuźjTTV§®īčP„āGg08p dŠ AŒ7gggJKK)--ķ蹚ÉÉÉi×y 2„qćĘ1pą@Ea’žż(ŠrM%D{uŗGf.ķKįüŠ÷¹žk¶Ō¦6ĆV~Öh;ųŽū9ó’^ouŸBˆĪį}ļšŸ’!ŲĢsćž£ŸO?ŪßöōśzõåńøĒģ?˜˜„‹{Œ„ļpŠ;°hä"¦÷~Ķź’TTU„Ŗ® gGg€ėņ|Ķ&3ļķO“'g9 Ą±üc¼¼ćeĪŸ„—G/žŗé)"|#Z=®õŸÖĒ£n“ė%„čzTUµĶ Ńėė’»¶¶–““4²³³©¬¬Äh4ҽ{w"""p¼üĀUUU=z”üü|źźźšņņbąĄø¹¹µ©UUY³f nnn 2„C‡QVV†««+C† ĮÓӓ;wrńāE6nÜȀčׯ_›Ī+44”³gĻRZZJaa!>>>\¼x‘ćĒséŅ%t:žžž¶˜µŽÕR+NGNNG„¢¢www „§§'@«}äęęrāÄ JJJPU³ŁL’žżńóókóõh­ѱ:ՀH]i ‡÷Æž£_Ū—±'}Ł«tŸqK»÷ !„ø¾Y 7}gˆ‹[īŁĀ¦ōM¼“ż%>˜ż­ŽE±p(ļŚņ'Ö’¼žYhƒŽĄ†Ÿoąūģļłó·fzßéד¾Vœ×ź|­?īFž’×Fu:ā|µĢ˜Ė3ß<ĆK_bĪ~^ŚžwDŽĮŌ°©¬?µž—w¼ĢŹŁ+[<®½÷Ä\×KѵY,> Ō†PUU…ŸŸ®®®ØŖŹ®]»øté ĄŪŪ›ņņr>LII 7ŻtŠ¢°k×.ŹŹŹĒd2qōčQvķŚÅ¤I“ppphµN‡^ƧŖŖŠ#GŽŠ£GŠ‹‹ÉÉÉ!%%…ųųx"""HII”¢¢‚aƆįååÕ®s5›Ķ”––R^^ŽŁl&99NGtt4•••>|˜½{÷2qāD»ĒŖ­­m±•¢(œ:uа°0JJJHOOgĻž=ÄĒĒ£(J‹}ŌÖÖ²gĻÜÜ܈ŽŽ --żū÷3qāÄ6å²µ>ŪńTƒųqtŖ‘ćO-ĘgĀĶųNŠæ¢öJUĒžųå§N2ģć’kó>!„7¶éaÓ1:™:…„»–õk¼ą}rŹrØSźŠ”³ÕŸŻ6½ø 8ņ+ņÆyż[ŹĀ,Š…=öš·Ż#.(īŗ<ß)aS˜6€'·< @Ę„ ¦†MÅč`dZŲ4–%-kńøZn¤ė%„čE!==½QYhh(P\\ŒŁlĘĖĖ UUqqqĮßߟóēĻSPP€Åb”““??? @yy9gĻž%//£ŃŲjŽŽŽ@żģ‡ččhÜÜÜP… 6P^^Nmm-^^^¶ó¾¾¾˜L¦vŸ+ŌĻ|qttdęĢ™ØŖŠN§CUUŅŅŅ())AQĶcµŌĘ:£FQ† †³sżlČĀĀBŠŠŠ(,,Ä××·Å>, ŖŖR]]MEEžžžÜtÓM  ~vIk¹ģÖ­[‹}ˆŽ×©DrÖ|Ął’¶•méN|Fė/ģ)O?É”‡Ą}ŠbžļK —’„imŸBˆßĘS™6•Mé›č检ד_gɤ% ė1Œ½Y{Y“q‘­¾Aßü2ײžOA§Óar0QTYtCoˆ9Äv½6œŚ@/^-źgĀd•fŃÓ­g‡Ē/„Z™1cP?‹ąŲ±cTVVŚ~{z­DÄO£³Ž‡Bt“U«V1{öl ł {3 약żĘ2=žµµ5(E± ( ŖņĆŗ¢X.ļ«_WU•O>ž˜»ī}ššžOMM ėׯo4C ##ƒżū÷ćīīĪ„ Ų¶m—.]¢wļŽųłłŁ^ꩪ*ćʍĆ`0šĶ7ßPVVFæ~żpvvęŲ±c(ŠĀĶ7ߌŃhlµ'''¾üņKt:³fͲųeĖJKK™:u*&“‰ķŪ·SXXHXX¶•6=/½^OļŽ½m3C 0 ÄÅÅįķķ͉'8~ü8ŽŽŽ‘••Eii)•••DGGĎ;+//ÆÕ6k×®ĄŪŪ›ąą`Š‹‹IOOĒÅŅ›o¾™“'O¶Ų‡³³3)))ųųųd»&ŁŁŁÜtÓMxyyµšĖ’’öīŻ«Ł‡u6NWŌ½{÷ׁ* śņb]Æø¼^T^޶®[ėÕu µĮŅfj†HSö•ikY[ö !„ø>ÉPq=ūPq5‚ƒƒIOO§¤¤„3gĪŠ§OFmūŖIFFx{{3`Ąœœœˆ‹‹ćčŃ£dddP[[‹§§'QQQ¶Ymé£-śōéCYYēĪĆd25±jųn'''zöģIæ~ż0›ĶōīŻ›‚‚ (//'<<œ°°0öļßOjj*={ölv¬¶“Q“ÉDÆ^½8vģUUUx{{3xš`Ū MK}Lœ8‘¾}ū’‘‘Į޽{śG|¢££m­åŅĒǧÕ>DĒźŌ3D„BtN­ĶBŃyu¶"BtE×Ė }G'B!„B!„ā§&"B!„B!„čr:õ;D„B!„āZZ½zuG‡ „øFd@D!„B!ŚHėå”BˆO§y’ż÷Y°`łłł¬_æ///‰µmkŁ·oYYY0tčŠ˵$''“ŸŸŌ’sōčќ>}šcĒŽŁź”••1hŠ "##)++cŪ¶mø»»3vģXŅÓÓķÖ0`»vķ¢ŖŖ āāāZģƆ Lž<™¤¤¤fmu:{öģ!??EQ %22ņŠr„ÅĆŌ©SmĒj˜Nūż¾öņÓŽE±›7UUķ–·O{Ͻ½÷UkżoÜø'''&NœØy^YYY¤§§7Ź—B!„BˆtŖ‘†|}}™>}:/^$11‘Ūn»Ķö¹©¦ņņņČĖĖcęĢ™@żĪ¼¼<Ū¾¦å~~~vūÉÉÉĮb±Ų¾Ł˜˜HVV”””„††P[[Kbb¢ķ GŽ!<<œœœ[?Zõ333©««#>>Ø’ų… 4ė×ÕÕQZZʼyó8wīœŻ¶Š¢PōskKEIDATZZŹĢ™3±X,¬Y³†ĄĄ@Ū§°Śš+­œ4ŒA+?š×Ņ^~ŚƒVŽE±[xMν½÷Uk÷[jjj£Į­óji@G!„B!D'iČĒLJ222čŪ·/+V¬`Į‚ź\øp^½zٶ{õźEVVŖŖŚ-7›ĶlŪ¶ ƒĮ@]]īīīÄÅÅįļļæææ­~uu5...ŽõŻwß1dČ9r$ēϟ׌æa}wwwJKK©¬¬D§ÓQ^^Ž»»»fżŻ»wSQQĮÖ­[‰ŽŽ¶ŪöĢ™3ōčŃƒĮ@`` ŁŁŁ˜ĶföķŪGnn.(ŠĀ AƒČÉɱ›___’’’ØØØźg+Œ=š½{÷Śb˜0a‚ŻüØŖj·­V~“®—V Zy³5-Æ®®¶{}µŽėēē×®\iŻWZå~~~”––rņäIFŽÉįƇ4Ļ«““”K—.±uėVźźźP…I“&Łī9!„BŃ9uė֍éÓ§ó’÷v?9¬Åd21kÖ,¾ųā lėuuumīćZk“½8ę̙æM›(--ķ°ō­K ˆø¹¹QVV†^Æo6õ?ĢΈprr¢øøĄn¹ŃhdŹ”)¶ņ/¾ų‚²²2\]]śG4’““ jōœaII „„„-ΈhØi}wwwÜŻŻŁŗu«-6ė1ķՏ‰‰!33Óöx…½¶žžžœ:uŠČČHTU%//“ÉDff&………L›6­QLvs’žžŽ^Æ·ĶVŲµkgĻžmƒUÓüœ:uŹnŪ†ƒm¹^Z1kęĶ^¹^Æ·{}µŽŪŽ\iŻW-•ļܹ“Ń£G7ś›ÖżPZZJuu53gĪD§Ó‘œœĢ©S§0`@›ī;!„B!„čģŗĢ€HII ŽŽŽšūM&ÕÕÕ¶ķźźjŪć5öŹĖŹŹHJJĀh4ŚžfŽ:jYUUÅ7ß|Cxxøķ1«#GŽŠÆ_æ6ĒŻ“~jj*®®®Œ?€””RSS‰ˆˆhµ’–Śž?žuėÖįąą€““...āććÓę\“ĶęĶ›mūģJŪĖO[Ū^i ZēŲ-¶{}µŽŪŽ\iŻWZå‡&00/// Z½¦f³oooŪ£3f³™²²²6ßwB!„BŃŁu‰‘ĀĀB2226l˜f€€öīŻkūō3gĪ‹ŖŖvĖÓŅŅčŃ£¤ŖŖŠóēĻ£Ŗ*‹…ÄÄDFmw&##ƒŲŲŲ6ĒŽ“¾¢( TUEQ”6õÆÕ¶²²’ąą`F¢(lŲ°ĄĄ@.^¼ČŃ£Gۜ«āābŖŖŖ3fL£śµµµ¶u­üxxxŲmŪŽė„Ƒ#G4ófÆ\ėśj·ŖŖŖ]¹ŅŗÆ“ŹĻœ9CQQŁŁŁŌŌŌpéŅ%Ž=ŠŖŖšēUTTd+/..–7¢ !„BtŖŖB’žż1œ>>L˜0­[·RPP€——qqq|õÕWšżY?øpžüy¼½½IJJjŌXXżśõ£®®ŽÓ§OwtšE'ŠiDņóóY»v-ŖŖ¢Ó鈏Ēh4¢(ŠŻwˆųśśŅ³gO¾śź+‚ƒƒmćoÆ\UUvīÜI~~>NNNōéӇ={öLIII£y#"" Åb±`±Xppų!튢°nŻ:Ŗ««©ŖŖbķŚµŒ1???»õū÷ļĻŽ;Ų¼y3:½^oū ‰½ś iµÕét¤¦¦ršąAōz=QQQ˜L&ÉĖĖcżśõ888 Ŗ*ŁĶ‰··7¹¹¹$&&b0ˆ‹‹kω'4ócÆ­ŃhŌĢO{bh)oöŹ‹ŠŠģ^ß©S§jŽ'ķɕÖ}„UŽpöIAA$22’ŗŗ:»ńēääąģģĢöķŪ©®®FQ†ŽŃ’Z !„BˆŸˆ³³37nÄĖĖ‹‰'rźŌ)t:qqq$%%Ł^Ü?zōhÖ­[§ŁŃhdŌØQ¶?{{{3nÜ8ÖÆ_oūŅ”•uæu@Ä:‹Śŗ——×bŠ¢ąääDuu5;vģ°żyźß2dČ)))”’žņ!qÕ®äŅ5X ~PÅŗ8FĄ8.@·ĖėÖmSƒ:ÖśFUU·åą«V­bžüł7!„(--Ķö„.!„]ĖŖU«˜={6Šük{\Ū+{ūe,zü ²33ŚuģO>ž˜€>ż;:-²¾Tu͚5ŌŌŌš³ŸżŒÆæžwww"""Ų“i“­žŌ©S9xš EEEv_ŖŚ³gO ŠØĶ”)S8~ü8ēĪktģ^½zŃ£GvļŽĶM7ŻDFFĮĮĮģܹ“Q£FŁ>" Õß„K—˜P’ž»~żśŁź·ÖŸ–‚‚ÜŻŻ1›Ķ„††¶ųUJ!ŚBfˆ!„B!DPSSCRRƒĘŃŃUU9~ü8555-Īٽ{7C‡µ}™&))©Łc/V¹¹¹ōéӇC‡pńāE"""l3IZźO+€ŅŅR>ĢŲ±c±X,œ—kmxĀ4|€ŸšĶ‡‡žĖņäwÆųXZy{`įķ2 "„ųŃłłłutBˆk¤Ó͹9ćH£„-Ž>ņ$ꘔŒŁó5#Wcp6qśµµŗO!„øžķ]øķ÷}Įƒ1÷šĀ·ļčpX“ŗ•5©›::!„BˆĪ5CäJ•„¦½ņ] .ĪōśŸųnĘ<ĀžųC‹ū„BÜų¬3) z}½zóXÜC ö`xĀ4ī<‡ĻŽ®%ČĄsć”ŸOØf¹–ó—.°dĒ?8šw‚nŻyzÜ"śõ’IĻQUPŸóƒ1w³āĄgōņ bÅķo4ŹEĆYé…gyyūrR/ž¢V©³ķ»’ó2›Üyo’'xšĢœå|‹łuē?©¬«äłńńÜ7ĖčęäĀāŃ’¤yB!DēÖéfˆlĖÖšaģ;“Kž†„¼¢Õ6nż9’އXŹĖ©+)%ćķ÷©ŗŻź>!„7ėł†?ų÷.ÜĄŽ…Ųu߉{'·üŶ/ŲĄ×÷|ŹüØ[yyĒņVĖķyįŪæsk’)|żĖOY4ź^޾¼Åx®ÕyAż`ĆŲßĪ[)šĢųĘłĪ&6Žż¾įĶśičÅo_cjß l»÷óFū[:/-s"fņvŹ ęDĪl5’Åżš‹EüuכTń訯yŽ„BѵuŖ"ÖGdŌŗ:*Ļerö_ļrōbPBĖH‹Xö'ž}™3’¬Ÿ “ąē`Š·ŗO!čouźFžsąSrŹņ©SźŠ”³ķ›6£ƒSBĒó×]’jµÜž“‹§yfėRža)zŽŸJKwDŻ‚ƒŽ'ĘüO‹}¤å–~Sp28^õyM Ļ”°ń<µå•óoŠųĶšÜóÅļXqūō†Ÿ,oB!„č:Հˆ•ĪĮ—>½čūĢbvÅMnµ¾Kļ†~`ŪĪž|-®żĆ[Ż'„āĘ·<ł]–Lz‚čƒŲ›u€?l|ζoć©o˜6MéŪčåŌj¹‹©OŃß'ĢVÖß'ŒŸšĶØ a8œ:śtmōmū#@Øg/¾<±‰ŪLDZA›ku^ZłÆ®«įĻŪ_gLp,Žž:ļßöŚu•?!„BÜų:ēTU„:'ÓÆżŲĘoŌ·÷%«ŗ’RņÖ'rņ„„„,\Šę}B!n\wžĆS[^aڇwqŗ(£Ń¾³Å癓b.«Æęɱækµü”įæä”ƞhōµ™gĒ?ĀēĒ×3łƒ;ŪüiŽŽųRJĆŲ®?=nėOneģæoæźójOž_ŻõOB=Cxmź „z†šźĪžä9B!Dēv%óvu ؟eb]œ#`œ Ūåuė¶©Ak}£ŖŖ‹ŪršU«VqĒüIv÷Y;tz=NŻ}ń™0–°?.ĀŃĆÜØNÓÆĻXŪéF\ū…ņą½tŸ9µÕ}B!:ĘÉ“"ś†{jī·(Ųūōn[i} ÷Z²W+ž«‰½«ŗ×]qżūdÕfĻž €ŖŖö5ŻÖ*{ūeLrs»½qÓ×,ść3!nx:īu  ؾ¼X×+.Ɨ•—·­ėÖz5@]ƒå’·wēqM_łŽĄ?æ„„Ed  [¬u‹ūB;m­mķÓZū“õνu“^»Lי×ėyõ¹×;÷¹m½ÓN;µN­½Nē::½vjwė‹":ZT”U}I $æēČĻ$üąņyæ^y‘œü–sN6ņĶ÷œōLo»xģ†2ćÉ2»rŪøŪĻÓ„{‰ˆčŚĮ/Ä7'>īD4ņóóGŗ Dä#7T@„ˆˆČW\e ĒŹ&übODtķŠŽŽé*‘Ü˜sˆ¹Į€Żt!""""""¢›"DDDDDDDtÓ¹”&UżÓöÆńŌźūP_ߌļ¾ĶĮØQ=ĖķŖT~˜13UŗķŹ©“EØ®®ÄÅEāö©ܖ»’›{ õ-€°p-ŅÓ§ ¬ō2Ī+“¶Ńėø-m<&ON‚^oÄ”CGHHęĶ»PZR%»ż¤Ićp$'&€F€;ļLs{ü½ß,ĶųŽ9Żg_Awģ,źė[`µZ‘œ<©““ŌW®Ųźpׯ³qģŲŁ>ż#®W€–ėoė`µŠ²ż&А-wWoŪīķóŹU¹«~°ļ[[½æß{žž*,\4DDDDDDŌ× ±9 ?æēN@cC öļ;†å,@@€æģöuuMØ«k½÷ĶŠó…²®®€([.{œŚŚFX,VÜ·l.`ß¾\TW7 )y ’’Ēŗŗŗ±_.RRgK‘’’ˆŚŚé8®¶ÆŖŗ‚īn –.ČĮŒ30iҤ~§×ėń—æükÖ¬ńčüõõõŲøq#z~„7™LHMMŃ>č“öY,¼ōŅKxūķ·‡©G‡ĘM­Vƒ¾ …Š'&³CF„ææ --ķ [®Vūć®»fKå{>?½Žˆą` €ž!ĒrĻ`L|4ĀĆC¤ķŚŚ ho7".N>Į™óöŚ BB‚•yŒąą@—ŪO›> UUuXøh:¬V«ģ¾įįZ”Waņä$ˆ¢ˆŗŗfØüQUU‡ę¦6Üżó;źTQQ#Ū'%%UP*XŅ›m‘““ņņj‡:Ų8÷Oqq„ģ¾cĒźdūÅÕćåŖ 1.ūM®\”PČ>¾®Īėm_¹z^¹+—ćÜ·9?ž„ōō)°Š¢GĻ/""""¢””ššŠĀĀBDFF¢°°qqq(**ĀōéÓQTT„É“'tŻźźźĀ¶mŪ°vķZÆöĖĢĢÄŖU«pčŠ!—o{ ±Ńétxé„—¢(āŻwßEAAG}Ž_»•J%T*Õ Ū5Ņnš€H[›®ē PĆdź’n›LfØ{Æ÷-7č;päH>Ōj 7³ »Ūčģ4ćPÖ ¤¤$HĆXl Ī–`Ā„Dėķ¼}aa‚ƒ5˜æ`ąļ'Ī£Ø°“RĒõ{|wūVV^Į·ßü„Ÿ*?h4hnjCÄč0ūŖµEššŲģźĘ2ßĖåśĒÓ}ZWmŁņ„„ŁĒ×Õy½ķ+WĻ+wåż9{¦qc¢>*­ķCDDDD4”RSS‘““ƒ¹s碨Ø8ž¼™9s&DQÄ®]»ŠŚŚó?lhh({ģ±>ĒśśėÆQZZ X,ddd 99;vģ€^Ƈ P«ÕxņÉ'Q\\Œżū÷#44555HJźłń·¹¹­­­xžłēįēē×ļy?’üs”––ā³Ļ>ƃ>({.„Ré°O[[‘žžŽ£G¢¹¹įįį0›ĶŲŗu+”J%ŃŲŲ(**ź·®R¶LQQ8­V £Ń£Ńˆ 6ø P‚€„„466Ā`0`ūöķP©T0™LˆŒŒÄŹ•+‘““ƒÓ§OC”P <<\jwii)üqčt:Ō××cŪ¶mxķµ×0ŅOÆA»)V™ijjÅ„ŠŒµŠą,..ee—„ŪåeՈå²¼čBbcGcŽü;0sę­¢Ų“:“_.f̜Ü'ōd Œ‰öøīĪŪ‹V«ĆÆ’¢(Ājµzt|Wūvt˜ƒ{īƒ„Kg”»«cĘD#|Tź®4yÜWaaZDE…cÉŅYŅeģ8Ē Wżćɾƒ©ƒ«¶»*wõųŗ:Æ·}åm¹':;ĶØ©iĄ¾}¹8zō4jjp® Ōćē‘ƍ?ee=‹?\ŗt 3fĢ@uu5 øø)))8~ü8”J%Ö®]+e$œ:uŹį8ēĪCuu5ž}öY¬]»ėׯĒųń摗—…BuėÖaķŚµ D^^A@{{;žxā ¼ųā‹8tč–,Y‚5kÖ ,, åååwΜ9ˆĒŠ+\žĖYvv6ęϟX“h~ųį@^^¢££±vķZ<õŌS0 ąQ]ķ ‚€¦¦&<ńÄX»v-‚ƒƒQRā~ø|CCΜ9ƒ””ażśõX³f 6lŲ€’’455A‚€_žņ—ķ^øp!²³³GŽĮ¼yójµg?Ü^ĖnŲ ‘śś&|żÕaˆ¢A°dé,ØÕž°ZEŁ9D"#Ć”ÓEāėÆC€€„„é¹r«("ēĒ|ŌÕ7CķļqIqČ;v 1hk3ąč‘ÓұSSĒ!)y ,+,+üü®F­V+¾ż&&“f|żÕa̚u+"£Āe·Ÿ0q,>Փ!P*Ņ*$rŪŪsµÆ E…å8 …€É·&# ĄcĘD”®® ß~›ÓsL˜”:ńńѲ}2*"µW±_®%}gšC}.]rŃ?q²ūŖÕ*—żćMÜõ›\yss›ģć{ׯ³]>O¼é+WĻ+—Ļ7Ļ“°p­ŌÓg\MÅkllÅéü‹ż®DDDDD4”T*•4\F«ÕB”P ,, EEEˆˆˆ€ææ?jjjpįĀlٲÅåq._¾,͇aļŹ•+ˆ—nėt:ŌÕÕ!""111z†whµZ„‡÷,„³ŁģŃy=9—=‹Å‚ćĒ#44999€ęęf,[¶ ˆŽŽvŲߦæŗ:ÓétŅB Z­Vv›źźjüīwæƒ ŠjµX¹r%bbbŠÜ܌;w"((‚  µµUŚß¾~6S§NÅW_}“É„3gĪąÕW_€"Cä† ˆŲ‚‘‘įxņ©ūd·q5‡L¹=SnOńØ<22<ø@ö8¶į+Ī”J’ß?wŖBZqœķżü”XøpŗĒŪ«T~xų-īw_ۜĪīøc¢Ē}%‚4Ŗ3[&„ŽsŁ?®öuÕ?ŽÖĮUŪåŹŻ=¾®ž'Žō•·åīž'¶¾µŹ%w‰ˆˆˆčš0yņdģŪ·Oš»"%%Åį¶N§ƒĮ`ĄŖU«ökkk“®ĒÅÅ!++«Ļ±cbb²#ŖŖŖ”䣏‚®ĪėĢ–‘ļɹNž<‰““4¬X±B*ūüóĻqāÄ „‡‡ćŹ•žEDQDUUՐö»N§ĆÆ~õ«>å999˜0a/^ ƒĮ€‚‚ˆ½Yó ÅÕA$¶v+•JLŸ>Ÿ~ś)ʏ/ ĶyńŇ“žĆį¦2CDDDDDD##55HIéłŃoĀ„ 8{ö¬4ŁčōéÓ!6oތ­[·bėÖ­ĮŪ1ńĪ;ļąż÷ßĒūļæ‚‚̘1V«[¶lĮ–-[`±X0sęLźåÉyG…††l߾ݣseffböģŁe³gĻFVVf͚…źźj¼’žūųųć*"†Óm·Ż†cĒŽį£>Ā_|iÓ¦a÷īŻ.Ū óēĻĒ‘#G¤”@]]]Ņ„­×3a€ūvūśŁ]üØ Ō{Żv;ĄnŪöjQ_ńää»vķĀ£+{²)Ż .^hĘų”š‘®€æī:ˆ‡zś|™”ūr)WöĒw7įī»–x}ī½ßĄŹ§žé. v555Ų½{76lŲą“ćÅĘƾ €©÷b»nģ½®ŠŃ{Ūvݶ@·ŻčY’ĆvńŲ 5d†ˆˆˆˆˆˆˆ|gß¾}ČĻĻĒSO=5ŅUń9DˆˆˆˆˆˆˆHVFF222FŗC‚sˆŃM‡"""""""ŗé\—CfžŗėąHWˆˆFŲɓ#]"""r„¾¾7nĘ1cŹļæ’~Lœ8q¤«ē–^ÆĒ_žņ¬Y³Ę'Ēūä“O0cĘ Lš4iHĻŻUS¦¶Ą/:Z* ˜˜ŠĄé3Ńöå„­|Ü«ć™ĖJ`<ž‡°Gs(· :Žµčŗ ˆ,Z“h¤«@DDDDD# 33s¤«@Ņétx叽¦ū,2ÜēVōĮØ_ōŻßćąEWZžgĀV=„¾ Ó*4A7D0øN"DDDDDDt}ś’ųüāæ@TTjkkń§?ż Ƽņ vķŚ…ÖÖV@hh({ģ1äääąōéÓP(hkkĆć?N‡śśzlŪ¶ Ƽņ vģŲ½^A V«ńä“O¢øø€V«…Ńh„ŃhĆ ąēē'{{mmmŲ¼y3^{ķ5૯¾‚ X¾|¹Cv‹Į`ĄöķŪ”R©`2™‰•+WĀl6cėÖ­P*• Dcc# ØØū÷ļGhh(jjj””QŃÜ܌ÖÖV<’üóčččĪ]TT$Ū•JåU[õķhžļķˆX»Ę£?Āj4"xqŚ÷~eų(hf;Śöżß”«²ķ{æzĀDXōmhŪó¬ķķ°šMõä/`5uJĒ3],‚>s?Ś„wĮ?閑~zy…""""""ņ¹źźjlړɔģ…^@zz:rssq’ż÷ćčŃ£˜;w.Ž?„R‰µk×vī܉S§NA‚€_žņ—8qā²³³±råJ9róęĶC^^ Ö­[Ųµkņņņ¦¦&<óĢ3~ų!JJJŠÖÖ&{ž©S§Ź¶”  ³gĻĘķ·ß.Ql‚‚‚°~żzéöoū[455įܹsˆŽŽĘĆ? Ųøq#€žl‹öövüó?’3, ž{ī9lÜøįįįŲŗu+ŹĖĖm7ÜEŁ6ørŌu¹ ¾/ŻÖĢųŌćS®Žž=-ł3Œ¹G`ii†öī{ö×L›KC#“wß sY ¬zBV? Z>Ż seü¢®ÖŃ|ń§NGĄ¤TXŚŪFś)ē5DˆˆˆˆˆˆČēt:^zé„>å3gĪÄo¼ūī»łłłųĶo~ƒļ¾ū.\Ą–-[ślo L:_}õL&Μ9ƒW_}ß~ū-āććĪYWW‡ˆˆčt:iȇV«…ŁlFMMĖóČÉČČĄīŻ»qōčQ<ņČ#÷577cēĪ ‚ hmm…ŁlFcc£C`C§ÓI×cbbJ„Z­įįį€ĄĄ@˜ĶfŁ>tnƒ;rCf¬śv‡ŪA £ńocō³/”?~Ń1@ļłĶ]÷kęĢCūŽoŠqņ8Bī]īQŸ^K!"""""¢a£V«ļæ’)))š÷÷‡N§ƒĮ`ĄŖU«¶=r䊞ÅQ•J%¦OŸŽO?żćĒ‡J„BLL JJJ¤ķ«ŖŖ””äņÜ®Ī揄K—šųć£““p˜ß#''&LĄāŋa0PPPQŽ+W®DQDUUÕHwłUV+Ś÷~ƒšĒW£ķŪ/1jõ?I€@“x|øīźj„.ęK—`Č9|ŻĶ-Ā€ł\uu5Ž|óM‡²3f`įĀ…˜3gŽ~ūm¼öŚk€éÓ§£øø›7o–ęČxōŃGūsžüłxõÕWńśėÆKĒ»xń¢”ń„™3g¢øøX¶N®Ī"»}gg'Ž{ļ=( ,^¼Ųį¾Ūn» ;vģ@YY4 ¦M›†Ż»wc͚5ųć’ˆ÷ß …(Š>ėW«ÕŠ^xæ’żļ½ŽWą{L¾ źŌÉčnn‚žĄ÷^z·tæ24 ŻMhżģSŽ1­ß扦N4żéc ‚īœć³6a€ūvūśŁ]üØ Ō{Żv;ĄnŪöjQ=š~x×®]\e†ˆˆˆč²gĻž‘®ĀząFŗ d'33=ōōł’)÷„S®ģļnĀŻw-ńśÜ{æ?€•O==Ņ]pS«©©ĮīŻ»±aƆ‘® Bllģ;:˜z/¶ėĘŽėz½·m×mŪ™tŪ]@“»xŒ"DDDD4h#µDåP+--é*QÆ}ūö!??O=õŌHW…n ˆŃ ©„”vĄūžæ7ŽĀożēH7ˆģddd ##c¤«A7* ŅÜ܌‚‚˜L&ˆ¢???Lœ81110ČŹŹĀ½÷Ž;ų9éģģľ}ūp’ż÷ūģ˜(,,Ä„K—0gĪDDDøÜ¶®®0›ĶP«ÕøćŽ;\ށs%77ķķķX¼x±4i‘ÆŽMDt³E_|ń¤2µZÉ“'#**jŠĒŠĻ‘jĖ@}łå—·’õ×_‡F£‘>ßDQDTT~žóŸ;¬@7¦°Ń1^ļ³żć­^ļćĶsņ‹/¾@BB‚Ć2Ÿ¢(āĖ/æÄņå[„!;;óęĶs(»V_æDD.ųn¢ŻP‘cĒŽaęĢ™5j ””¹¹¹CE Ą²eĖ|zĢāābŒ=MMMn·ėģģÄńćĒ‘žžŽ°°0TVVāŲ±cX²d‰“õõõČĖĖƒ%K V«uÜ”ųÜ©¶ —§Ÿ~Zś’@E9r;wīÄóĻ??ŅU£a0˜L‘” P(ŠŲ؈¦¦&éy9ŻŻŻčģģty’õžś%"*C¶(Š0›Ķ°Z­RŁčŃ£qĻ=÷@”P »»‚  ““•••čččĄøqć0aĀ=™ēϟ—ŽeĖ,łžūļ‘žžŽąą`“¶¶"++ .Dhh(ŒF#²³³±`Įé—:ƒĮ€#GŽ 99•••0™LHLL”ĪSVV†ŅŅRØT*čt:”——cęĢ™}².n»ķ6Ą… ܶ»©© aaa ÄĒĒćüłóhii‘Ö“¶qÕʓ'OčYŅ*==] Šxzģ––œ:u !!!0˜;wī śóī»ļFaa!jjj ¬V+¢££‘ššŹ@ ]·"##”ŃhŠŌŌ„ĄĄĄ>ļ› 8wīDQ„ HMMÅčŃ£qšąA¤„„!22 ČĻĻGzzŗC†ˆ«÷ÜÖÖV;vĢᇁo¾ł .„F£š{­}[bccQUU…‹/Bˆ¢ˆ““4)³ŃŻēž«65A––†½{÷¢»»~~~(..ĘĮƒ„>\°`&NœˆM›6aõźÕ=z4jjj°yóf¬_æ111hiiĮÖ­[ńņĖ/#++ ēϟ—žēHIIĮŅ„Kś²®®;vģĄŌ©SQXXˆŽŽĢž=?ūŁĻ¤¾ŚææŌ;v,Ŗ««ńłēŸ#&&MMMxśé§=>ę™3gpųšaé±¹ēž{0vģX@^^rssˆŌŌTœ8q+W®Dtt“ĖŗX­V¼žśėxńÅ„’Ü©ØØĄźÕ«‘œœŒ>śH*’·ū7dffB,^¼æłĶo†üqæ–X­VÜvŪmČĻĻĒ‚ d_s®^gĻž…ÕjEZZ~śé'ØT*“““ ³³'OžÄwÜįöÜ×ūė—ˆČ—n˜ A0iŅ$=z111ˆŠŠBtt“CŠ`ww7 ęϟŽŽģßæćʍƒ(Š8~ü8ęĶ›­V ƒĮ€C‡ańāňŠŠBcc#‚ƒƒŃŠŠ€Ń£G£±±”””hllģ“n(:::dĻÓŻŻ‚‚,Y²øxń"ŒFć ¾äĖ͚­V«”×ė‚&“Ée§NŠŖŖ*Ģ™3Ē”.ž[”P@Æ×#)) ‰‰‰nĻåI655”ŗŗ .”žI/,,„ŃhDPPŠH?ՈˆĢjµB”Pōyß4›ĶRF^HHŚŚŚ““ƒ„K—JŁ‚‘‘‘²Ÿ;īŽsŻģ{­­-‹§OŸĘ‚  ŃhP[[‹“'ObéŅ„0.?÷ܵŁĻoh’=éčč@vv6ąēēƒĮ€O?żO?ż4"##ŃŌŌ„>ųĻ>ū,’““qéŅ%Œ=ååå;v,ŹĖĖƒņņr鐂‚<óĢ3RŸdfföłA“““ $$k×®Ekk+Ž}÷]¤¤¤ żė_ń’šˆŽŽFmm-žō§?įłēŸ‡R©Dcc#fĻž+V8“ÅŻ1ƒƒƒńõ×_cŻŗu Caa!>’üs¼šĀ hiiĮ¾}ūšģ³Ļ"$$?žų#š››”P(`4]ÖE­Vcćʍ÷õ{gիWćšįĆRYnn.rss„Ō²eĖpģŲ1̚5kH÷kMTT***PVV†¤¤$‡ūܽ>n¹å:t)))Ø©©Į¢E‹`2™››Ūo0Äęz~żł’bš‡øvŒ?K–,ATT••…üü|‡mP«ÕčģģD}}=ĀĀĀ Õjō¬]†††éP 'RŸœœŒ††é¶ÜųKQeĻÓŲ؈ˆˆ)Hćüį7hiiA[[€ž4ČÖÖV‡L[¹«6öŲ6 żžĖ“žō÷÷Ggg'ŹĖĖa4”P(ššŹ`]·¬V+.]ŗ„®®.‡9”lļ›uuu •²CBB Õj„÷Ķęęf#öņž`ĄļµĪmQ*•øēž{ Ńhō|v ˆ¢čösĻ]›‡ĀÖ­[ńÖ[oįĶ7ßÄæ’ūæĆjµāńĒ””” 66VźŪQ£FA§Ó”¬¬ ÉÉÉØØØ”——ćĪ;ļDyy9€ž_Ļo¹å¢½½'Nœ@KK ”J%–.]Ś'SčłaŹ”)€ŠŠPÄĒĒćŅ„KRlsšÄÄÄ`ōčŃ(++ŠóæÅķ·ß.Ū6WĒō÷÷ĒÆżk)“cģŲ±hjj‚(Š(//GBB‚Ō’öĮˆžźāM›6õ™§%33<šA€ X¾|9233‡äqwėņ2n»ķ6\øp&“ɔܯė# qqq8vģ¼ör½¾~‰ˆzł|Ź Ā Dbb"a±XpčŠ!ŌÖÖ"$$J„Ņ!Ā–h2™ąļļļp˜L&Œ3………½^ŲŲXœ;wŠŲ؈ŌŌŌ>™~~~G©TzE/))‘ź3qāD$''cźŌ©ČĖĖ„‡‡#<<*•Źa?wmt% Ą£c€J„’Ś<ŲžT«ÕHOOGii).^¼ '•’’Ā!3D4bŗŗŗdß’Üłį‡ō|a ĮwŽ)½ļ;æo677#++Ėa«ÕŠŃ£G#??¢(¢¹¹3fĢ@ww·“»÷\[DNpp°WļµīŚržüy444@”P8|&ŗūÜs×ę”`›CDE|ųį‡ˆ•¾źõzéŗF£^ÆĒ”)S••QQ__‰'āĄz†ƒddd ((«WÆFnn®” 1}śtĢ›7ÆO_@©TJ·„_Ż«ŖŖšžūļ;lo±X¤ķģēłņ䘢("33„„„šóó“Qa0ڬR©¤/Öz½Žm]«±±)))Ņm[öŹph®Æ‘ ~4×× Ėł")) gĻžuČīčļõ”ÓéPRR" ±īϵųśČ{źõĘł‡Y¢›-@?HĆ6õĘ`""€kęŪiWWŒF#BCC„2„R‰€€tvvŗ]E­V÷ ˜L&ØÕjØÕj(•JŌ××K’X£¾¾~~~Rö‡'T*ŗŗŗ¤ŪŻŻŻ0›Ķ^µ399ÉÉÉe::@Ļ?9ß’½C?ō×Fw<9¶Æū賅Ė6óŗĮ`Ą‰' ŃhļUłBaa!¼žēŻ~"CwŽ;ļ¼ÓåżµµµŠjµšóósˆø{ϵämDQtŲכ÷ZWm¹|ł2jkk1oŽ<(•JtvvbļŽ½Üīõ×ę”"ī¾ūnģܹ·Žz+ ƒĮą°Į`€V«EPPT*JKK AŅŅRØÕj)£&66>ų €žLžO?ż”””}²::;;„9€žį;J„qqqX½zuŸ:_¹rÅķ®ŽYPP€ĀĀB¬Y³*• z½o¼ń€ž/āö’æ˜L&F=ŸĖ®źā Ī“ĘĖe> %ē ČHCln¹ådeeI“@’Ə²²2)‹É“IYÆÅ×oWWJJJ0qāđéųaą£/†D4„†cȌčā:<(÷˜Ńhď?žčšaR[[‹¦¦&·KÖ=“Kµ¶¶¢½½ŠŽŽŽ¶¶6éĆ922/^”ށ‹/zżį=jŌ(466J’øVTTøüµĒS]]]ČĪĪ–ž©)))ApppŸ”ēžŚ8˜cūŗ?kjjPTT$/((²sš µŹŹJbß¾}Ų³gĆåģŁ³>9Gdd¤ĆE“É„C‡I_>"##„/ärūŗzĻ €Łl–ŽĒmC=ß½×vuuIĮnQQ\\  '›ĄŻē^mJ‰‰‰HHH~ŻNNNFmm-źėėō CŖ­­•†$''ćšįĆŅd¤‰‰‰ČĪĪ–~ 8wīœō <Š“Q"Ū—‹gΜ‘«ŖŖ*Œ7ÉÉÉØ©©AmmĻj(z½|š¤pĒÕ1;;; •J«ÕŠü‚  «« ńńńØØØA’ūß„,“ĮŌÅK—.ÅgŸ}Q!Š"žö·æį®»īņĒŻž-2ŅĮ 'k#-- §OŸöčõŃŽŽŽęęfL›6 õõõŠėõŅ| Ž®×ļŁ³gū¼īŪ·………ج¬釀ˆ®mžüc2ą/Š7̐™ŠŠPL›6 gĻž…Éd‚(Š ĬY³ ÕjŻ~ˆ«Õj̘1CZmčIuµe+DEE”øø©©©z¾ĄŸ={ćĒ÷ŖŽZ­·Ür ²³³ˆøø8ųūūĖ›ÉĢĢ„Łl†ÉdB^^ApXRŲF„R!>>‡†ÕjEHH¦OŸīU]}€zzl_÷gdd$jjj™™)}@GFF2;„ˆFD||<ŒF#āććū «š̜9§N‚(аZ­?~¼”®‰āābLš4©Ļ¾ż½ē¦¤¤ ;;jµ:ŅūŖ/ŽkćāāPUU…ĢĢLØT*¤¦¦¢½½¹¹¹˜3gŽĖϽžŚ<Ō222°yóf̘1£GĘ#<‚æżķoŅż<ņˆō@rr2~üńGiµžÄÄDģŻ»óęĶ“ī/,,ÄžšihJRR’ģÆĆZ­õõõųšĆŃŁŁ‰»īŗKʼ\¹r%¾ųā X­VX­V¤§§C£ŃHĮ.W\óÖ[oE~~>žš‡? 00K—.•V„łÅ/~9sęąĆ?DHHŅŅŅh4—uńf•³ŁŒŒŒ 455”¾¾ ,Ą›o¾‰™3gbŃ¢EX“hAĄ}÷Ż'e* §k!b ­V+=Öī^§OŸĘøqć T*‘˜˜ˆ¢¢"L:žžžČĪĪ–ž—ž®×ﭷފ[o½Õ”Ģh4¢²²’’ßݼ®‰_»2äE°ŪO@OPÅvń ī½hźżk»Ų»]€Ż¶ž¢(¾źÉÉwķŚ…E‹tæ ˆÕj•&Čmmm8räīŗė.ĪADt³-ĻJžŹĻ½/æüRZvųzQ__ķŪ·ćå—_ńcvww£¢¢ćʍƒB”@mm->łä¼üņĖzlöģŁƒ5kÖ yz«„”a£cŠŅPė]{¾ü ēĻā·ž„„„īwŸėń9éĪP’ß:˜÷ŌĢĢL<ōŠCś®Š(—™%WöĒw7įī»–x}ī½ßĄŹ§žöz?"rū6€N¦Ž‹ķŗ±÷ŗ”÷ŗ±÷z‡Ż6fŻvŪ‹\„—–”üĻNtqŪyĶ5 …uuu8{ö¬”–:cĘ Cˆˆ® †xŸ{×.„R‰‹/ā»ļ¾“&ƒōŃGłŲdØ_æ|O%"ī¦Ū’øÆŽ‰\6ˆ1cĘ ¾¾7nDBB€žÕŸęĪ+;Ńrcc#žėæž QQQxņÉ'ŻÖÅ61·\_}ūķ·8ž<AĄÄ‰qĻ=÷xÓL®“%;ÅcC=‡ˆ\ōĘ¹Üź‹†ŃČ)--é*yåłW’×ū¼óĘʑ®¶×ń«_żŹ£m»ŗŗ°mŪ6¬]»v¤«ĢĢL¬Zµ ‡ņy@Ą€ēĆ1ųąƒ°nŻ:ÄĒĒĆjµāć?ʙ3gdWóużĘ‡ēž{@O`ęƒ>ĄÆżk€N§ĆK/½čģģÄkƽ&ÉŹŹBzz:.^¼č¶¶åŚå”––¢¤¤/¾ų"ą½÷ŽCYYʍēiEøŠĆ0²d8g3r€XŹˆˆˆˆč:ōĄŒtˆÄŅŻÕ³¼“Å«µV‹§Ū¶ūEńĘłŹrśōią±ĒlŪ¶ sēĪÅO?ż„ŅŅR|öŁgxšĮ±cĒčõz‚µZ'Ÿ|ÅÅÅ8pą“Z-ŒF#ŒF#6lŲ•J%ßjµx_hkkCcc#ŅÓÓqōčQ477#<<ēĪĆĮƒ £Ń«ÕŠ5kÖ »»Ū·o‡J„‚ÉdBdd$V®\ ųśėÆQZZ X,i õÖÖVüłĻF[[:;;ńģ³ĻĀĻĻ»vķBkk+ 44Tź#›3gĪ`ņäÉŅ’Ń …’ōO’ä¶Ż²ż’’āUżœÅĒĒcŹ”)ČĻĻGJJŠC’_ŗt 111²’Ć?Œ‚‚·Ļ‘ĘĘFäęęāį‡ĘĮƒūÜ_XXč°dśķ·ßŽĀĀBo"ĪńēĮ°$Mų2 "ārć¼»]#***šę›oJ·ēĶ›F#»ķœ9spåŹ¬X±¹¹¹P(X·n`×®]ČĖĖCDDššššĢ3Ļ@|ųį‡())Įĉ„ćäåå x_ČĪĪĘüłó‹-Ā?ü€x‚  ©© ėׯ‡B”Ą§Ÿ~м¼<Ģ;ėׯ—ö’ķo‹¦¦&ŌÖÖ¢ŗŗŗO0įĀ… Šėõxī¹ē P(°mŪ6””” ­­ J„Rʐٹs'N:åšÅæ¹¹²żēŖŻAAA²ŪŸ;wĪ«śö9†­O ŗŗæūŻļz½ééé~Žü÷’7V­Z‹Å"{æĮ`@tt“t[£Ń ¶Ö«%Īå ž^|f°‘ž*ći0„Cfˆˆˆˆˆˆ|LnČĢéÓ§ūŻļŹ•+RŠ3£®®ŠétŅP ­V ³Łģ³}- Ž?ŽŠŠPäääč B,[¶  ĶÕ‹¦¦&477cēĪ ‚ hmm…ŁlĘåĖ—„95œét:é8f³555øpį¶lŁā²_BBBP\\ģUŸ¹Źšš¶~r‘śśzéœ:Īį±žč£šÓO?įöŪoļ÷ń¶wšąALž<:•••²ŪŲ²tl “Z­7§q•āIšĆŻņ¼^H@D Ȕ97Lnģķ>‹Żmkļm""""""bžžž0 Qqłņeé>«µ'y?&&%%%RyUU’’’<:ž`ö=yņ$ŅŅҰbÅ ©ģóĻ?lj'āP׌ŚZÄĘĘ"''&LĄāŋa0PPPQ‡¬¬,ūE§ÓĮ`0`ÕŖU.·™2e öģŁć0_ĘīŻ»‘˜˜č²Ż®śŪŪś9«ŖŖĀéÓ§±lŁ2‡ą„½®®.Ə«×ėQUU…¢¢"ttt ¾¾YYYXøp”“Mjj*öģŁƒ¹sēN:…‡zțÓXą;°øšGÄźTīĢėąČP.»ė\iēÅ®8d†ˆˆˆˆˆFD€&Čå}W.—tõ|.)) _ż5¶lŁ‚   DEEAEŒ5 Ų¾};ž|ņI\¼xQŹ– ĀĢ™3]fGŲ›1cʀ÷ĶĢĢÄO<įP6{öll߾˗/‡F£Į'Ÿ|£Ń‹Å‚åĖ—£¦¦;vģ@YY4 ¦M›†Ż»wcƆ (--Å;ļ¼#ĶS²`Į‚>s–ŲLŸ>ÅÅÅŲ¼y³“Ķ£>Аi›   ¬_æ’ó?’#e·Lž<Ó¦MŁvwwwĖöwjjŖWõ®®¾cµZ”P(°vķZĮh4¢ŗŗ›6mtww#11QŖ—ÅbĮŪoæ ƒĮ½^M›6aŊHLLÄ /¼€ß’ž÷X¾|¹“}ee%öķŪ‡… ĀjµJŪ$&&bĀ„ Ų“iA@ZZšCvŒl‰¶‹Ü\"r£I|:ŗd`Sėöė )ŃXQšļ½Ø éż`wńw¾ˆ¢ųļžœx×®]¾l?]glæD‹¢ćw#ēŪ®Źžųī&<’ź’q˜TU.(R_sÉaRÕæī܉•O==ŅĶæi?Ēļw©XŗöÅĘĘž_&ęŽæ¶ė:{’Ś.†Ž2Ū6fōQŗį8ŚÄėD‹”Čq5Oˆżš‹ÓõnOO`›-˜ˆˆˆˆˆ®  L v__2ź[” •n7Ö]†ÕĀ‘żDCÄ̰5Ņ Ē؁«9F|f ēyDD»ær‹Ģu z2Mŗį˜qBDDDDD4ģō­M…ę†+°Z=žĶ–†É¤I“0iҤ‘®ł†Eęb?½†s`ě‰V=ę« ‘ž&Pµ@lĮeļ_Wƒ"DDDDDD#Ŗµ¹™!DCÆĖīŅķt±!8El|2©/‡ĢŲWŅyxL·Ż_eo£m&>— ]_Ģø1ćj0Ä>@ā<¤Fnµ™AL@ÄÕņ»Ī‘īŽó˜q5+„A""""""¢›S7®Eœ’:g‹8Ļ%ālĄóŠų2CÄÕä©¶(-b«¬}ƈˆˆˆˆˆ†Å”©wą76āŃĒóxŸæī܉)SļéŖŻ(l+ĖŲ!ĪA[`ÄSpžSÄ'qžŲD.;DĒĢ8ķƀ ›©wLŠäšŌ”©w`źÓŠÉى|Į~©]ē,ēL¹`ˆOVč°ūżģ'IU 'Č¢ ąß{[@mw]ewæķÆæÓż¶ćųŁ[Ł{ąhį*5DDDDDDDĆC„ėUfGŽŲ±e8g‡t;•;g‹˜Ń7[Ä6æˆ}¼āĖUf¬č NŲžŚ* \  ŲWܾÜW¦±mㇾ+ÓŲAvĒœĪEDDDDDDD¾#Źüuž./·ŠŠŽwĮ¹Õgldz?ē ł2 b›Ä> "8mć<Š?śF“œ;OĒ [šĆ Q€A""""""¢į"7tÅ9KD„c@Ä>ŲįjˆŒŁn[ēexū›\Õk¾ˆŲĻb ŠŲgy@¦Ü¾Ī±ušm‰^ې}W©q·Z ƒ$DDDDDDD¾!ŗ)wŠŲĒœ\±e‡8Bģ Ī™!rY(ƒŠųr• ļ°ūńćė!3€ćēmœĒ¹źH+®f†ŲęśBÜeˆŃŠqžžļ¼¢¬s–ˆżū ū ū Sm#Hœƒ!#:dĘ9³Ć¾ĢVQ—ÅqŽÖF.CDŁŪhūUeĒĄ\ƒˆˆˆˆˆˆˆ†–«Dēį3ŻvķW›±B,N·WŖń$2 ‰ÆęqĪ±Æ°޳Į:WV.;D‰«Aū¹C®&CDDDDDDt­ ŒČM²*·ü®}™}0ĖbAßa8®Īė5_Ī!b±|ŲCvŪ;ÆBcßQ \]aFn¾Oƒ! š œ7¹¹Dä&WµŒŲŹ­Ļ‘›‹Ō'|=©Ŗsåģ3FlĮ [™żöĪ+Ó(qu2Õžę aЃˆˆˆˆˆˆhxx2dÅU–ˆ}@Ä] DneZŸBlqĪ Ÿ%bck¢÷ÆR¦³ģ;I.;d Y"DDDDDDD4tÜDlC_ä²E,č;‰Ŗ\0Äł<>ÉŠ!3¶ŹŲ_·gß8ūŒū@ˆs0Dn2ÕĮDP!""""""\ö…» …»ex½É q·jķ€ 6 "·ŚŒó}¢L™ż 4öd?Ŗ\@.ĪĒąŃšr7|Ę~>Q砈ó 2"ÜC¼9æĒ|=‡ˆ\DŽ-ųį¼LÆ sÜg†0BDDDDDD4üś›OÄ9°įį«`‚» …ąęÆ«ą‡«`ˆ«:3(BDDDDDD4|DŹåždƒx2WČ ƒ#¾ $ōø<ų;˜ŒEˆˆˆˆˆˆˆ†ž7ĆX\EąĮßžŽ9(¾"x’½!ōs½æ‰Sų """"""ŗ6¹ ^x»bŒ'KüŲP¼Éąš4«d8ėODDDDDDDžé/@1lO†ć ŚPČ`„ˆˆˆˆˆˆčśćIĄb ĮŸBl†:øąĶńRGˆˆˆˆˆˆˆFĪ@‚žī3$›į ( Պ6DDDDDDD4ņ|ĄŅ ˆ½‘ .0°ADDDDDDts¶ˆ³k=(q­×ˆˆˆˆˆˆˆ\±€Ń0ł’MŖćĮމ%tEXtdate:create2013-09-04T19:30:00+04:00Ei9%tEXtdate:modify2013-09-04T19:30:00+04:0044”IEND®B`‚apache-couchdb-1.6.0/share/doc/build/html/_images/intro-tour-09.png0000644000175000001440000024533512332105522024726 0ustar00djcusers00000000000000‰PNG  IHDRD8cµ<£gAMA± üa cHRMz&€„ś€ču0ź`:˜pœŗQ<bKGDłC» pHYsÄÄ•+€IDATxŚģŻw\S÷ž?šWV˜a¹”8q”ąÖŠÖy­»ē•īövØ­]÷öūoo×퐶··ėŽJoķøW«“V[7Ō­ą QŁöŹųżs į$ĀėłxäAręē|‘óĪūóžDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDD!±uzxūˆˆˆˆˆˆˆČ4­­`Š- võn6 ˜tePĀēb…ˆˆˆˆˆˆØūźl€£Ė$Ö0“ēųi $DDDDDDD¶Ó‘†¹ūX58b­€B[Ē•Xi_"""""""²¶‚Śģg•Ąˆ5‚ ’v,—“óuW“ŸˆˆˆˆˆˆˆĢ׎`†¶ėĶ=O»Y: ŠŽ ‡¤•eęĻÖ×LDDDDDDd/¬QD+²®µeę«Ó,07Ū£µŸ XćZˆˆˆˆˆˆˆH\{2B“­ü4µ®µēmßl– "“' Ä8bų€‰×­µ—""""""¢®×ÖŠSAćоIkē6›ƒ: £™ †©‰å¦ŽŃŚł‰ˆˆˆˆˆˆØk“Ø0rhŠ<¢1ڦµsHŒ¶“˜±_«,1Ōž ˆa DjōÜT`h=…ˆˆˆˆˆˆˆŗ†9õBŒƒƒē“ ’ī'1ńÓ":éčŠć@ˆĢą¹qp?Ķ­'bĪz"""""""j›95CLL5†Øq#(¢®7u± H§$–ĪŃ3  „>Œƒ#ķ­'BDDDDDDD]Ol،ža‘^­Fóūzż:ĆĄˆÖ`‹N¹ t. bĪō¹†šC "?ME€¶‡Ļ‘õ“UHU’Ü0;D’ŠBš »ŸWC‘¢yPDĻ¢Y"ÖČi­XŖa0Ä0ā`ōŚÜ,‘ÖŚ@DDDDDDD–aNŠĮŌP} D˜¾oד²Ž¢Y"– ˆgn3Œėƒf†čŽh;(“/0BDDDDDDDÖ#6ˌXvˆźśĆų>ßš¹>h¢6:–aV±svHG"¦†­ˆ/Œƒ!ś`‡a@Ä7"FŪFÄЫн&"""""""ė15Ż®X@Dč0¾Ē7Œč÷×S_kDŠę³Štz،µ3Dō¬Æ!bų0 €8¢ePÄøČŖag1K„ˆˆˆˆˆˆČöŒg™Ńü4ˆ4ķgąt$†÷łśżōĄ‚SļZ* "5zn<®a¶‡ń0±‡q@Äp ^ćb­† !""""""²¾öL³«lčzĘ£@$ŠEŒ«ŸF\Ć¢«fé ±ŗ!†5AÄź†˜zQ¤/Ņ*1lu^k³Ė?Œ³Cō Ćį2†Ńś=¾Öh}·Č›×8"1†8įFfˆX@Ä00“ ¼¶‡ˆˆˆˆˆˆˆ,Kkb™q D?¼Å0CD?F¬ęØ~™ -G‡ŸĆ0 Ņé«–žv×0HaŖVˆž¹“ĮOGƒ×ƳĶæ1 ø°¦Q×1 @Ö 1Ī 1œn×ŗ€‡ ŗ:"Ę÷ō†÷ūĘCfŒӑ€ˆÄÄ2żrƬćl'“];Ä0 b*(bj Y©ŁdŒ"†õC §Ū5NtįF°ÄxÖ±ĢSĆfŚ=”ĘŅ5DLeˆ8żl‰ˆˆŲdĮ¶YLVV ¬¬ĢÖM!źń$É=øQ7Äø¶ˆž¹a0݉ŲD,1ŒąFzŚŖbü """""""ūēŒ–#†£> ³MŌ"Ūčćj3Ļ'ŹRżOżŲSĆfœ ĘCdˆˆˆˆˆˆˆČž9£åģ±śbŖĘÅXõqĆąH§§Ü¬?ķ®aS™! ˆõśQ"Ę„ÖŃCŒć ś:":c©@„q0Ä8CÄ00b<ė "DDDDDDD½‡“ĮsĆZ!†},ĮxXM§‡ŹčY*!ymų0 ˆˆMĮĖ€Qļ`ŠB  t–į0|²Č°ig€–ÓŻJ –‹EĞ3 BDDDDDDŌ;8ąF¬ĄpT‰X0ÄpC³ĪŌ KDĎg\Åx8žõĪ€Qļ`8ŠDjō\löSA‘NéģĮ$­,7¬k|A†Y"2X>0CDDDDDDDŻ“a}}\Ąx” >%Æ”Ne‰X2!1ńÓ0büÓšā-B&“aƌxöŁgń׿ž±±±xśé§1yņdH$ĪØé”gŸ}·ß~»MŪŠ]v®äääNõÆÆ/’““ÕģywfN;üqģܹÓÖM%"""źĘĘFTVVvśQUU­¶ÓJQ÷aœ$4O¬0L°0Ī±Ų}g†ŖHL,3ŒŽ?×_˜qōĒ"™L†‡zĮĮĮ8xš ~żõWH$ :K–,Įˆ#šĶ7ß@£±Č”ÅķöŪoæ”®®Ī&ēī¹\¹\Ž¢¢"[7…ˆˆˆˆz śśz\¾|^^^:Ncc#JJJ ©”ÉåDvĄ8Ä0F éŲ‚©8D‡"¦–œv×ų¹ÄÄĆ8CD¬bl‡Ģš5 ”””ųņĖ/‘••%,æpį²³³±|łrL›6 °Še·Ļ… lrŽŽ***BDD„šœˆˆˆˆØ½śōéƒE‹uź8~ü8222fėK"¢ĪÓ—M"öÄćb­b¦Ę‘s#6uźT¤„„5 †č„§§#++ S§NŁšÜsĻ”¬¬ 6l¶yąąć惏>ś‰sęĢAdd$<==QYY‰ćĒcß¾}BŗŽ[o½…„„Lœ8uuupsskõ˜Ļ>ū,®]»†üQ×)mœćµ×^ĆĮƒ±oß>Ą„ p×]waćʍHIIÜtÓM˜9s&Žxć «¼‘„„„ `ż ˆƒƒŽ|óMÜtÓM(**Ā믿Ž“'O¤R)~ųaÜzė­čÓ§ŠŠŠ€õė×·™>éččˆ'Ÿ| .„ÆÆ/ŹŹŹ°gĻüć’@CCƒč>;wīÄ?ü€Æ¾ś š‡?üżė_±vķZlŻŗšąƒāĄ‚ Ģ:DZcĒšöŪo#::•••X³fM³sśśśā/ł &OžŒŗŗ:lß¾õõõVķs"""¢žĄÉÉ Ó§O‡\.GZZFĶ!4D6võźU¢ŖŖ †£££¹»K!^@hģh­†ˆ~}‡~!t&!ićµaĆMĶ:c<6ØĆ|}}įįįĢĢL“Ū¤§§Ć××ŽŽŽČĢĢÄ Aƒ„ŗ"‰ƒFzz:`īܹ˜5k~ūķ7¼żöŪŲ¾};f͚…›o¾Y8žZ­Ę“iӐ™™‰={ö“yLcm#;;[F@pp0ŹŹŹ$,  YJaa! 00}śō±ŚyąöŪoGbb"bbbPZZŠ—^zIX÷Ųcałņåųä“O°xńb|ųį‡ˆ‰‰Įc=Öęq_~łe,[¶ ļ½÷/^Œ7Žx .ÄkƽfrŸ'N`ŌØQĀėššp\»v cƌ–3FL™s•J…»ļ¾ÄæžõÆēüė_’ŠįƇ橧žĀż÷ߏŖŖ*DGG[µĻ‰ˆˆˆz’ššpŒ?éééhjjāš"hjjBzz:ŅÓÓQUU…¦¦&äääąāŋķ9ŒXVˆ© c¦'ķÖŃß ’Vž‹5Z삤hż"ŪE_“¢¢Āä6ååå¶ēϟ‡›››p“?`Ąøŗŗ"##NNN˜9s&öļߏӧO£ŖŖ ©©©8xš ¦OŸ.üāÕh4ج¬Ä®]»““Óź1™sެ¬, 8PŲ'$$ÉÉÉ-"—.]źl÷™TWW‡ŖŖ*ÖФ„„aēĪøxń"~żõW„††B*•ĀÕÕ÷ß?6lŲ€;v ““{öģĮ÷ߏ{ī¹2™é4^^^X²d ¾łęģŪ·„„„8xš ¾žśk,X°ŽŽŽ¢ū8q¢Y:ęøqćšÓO?aōčѲ1cĘ 99ŁģsØÕj”””ąóĻ?Ē©S§šĻßß“'OĘæžõ/œ9s………ųņĖ/QPP`µž&"""źi¤R)ƌƒ©S§āܹshll„ƒƒµ’މČX]]222põźUŗ!qt#©©©ęÖĶK”0÷!¦C1k†TÅ,(‘µZ @hhk­V‹ÜÜ\ŌÕÕ!44Šźźj\¹r~~~prrjhČŹŹ‚\.‡æææ°ģŹ•+Āó֎i̜sdggĆÓÓ^^^ĖåšóóƱcĒŠ§O899A”PĄÓÓÓŖ" T*…ēÖ ŠF«««…`H`` \]]qüųńfŪ§¤¤ĄÓÓĮĮĮ&9lŲ0Čd2œ>}ŗŁņsēĪA*•bȐ!¢ū8qžžžčÓ§<<<„-[¶`šąĮpuuEæ~żąļļääävćģŁ³¢ē4h“Čp2µ=Qo6xš`Ģ™3gĻžESS“­›CŌ+455!55UE‚!C†`Ȑ!BP¤°°PČą2ƒ©¢©]6=lW…S[Ė[ßn•••`ņP(tY$/^ÄąĮƒqčŠ!„††"33Z­VČ6yüńĒEćīī.| £_­Ә9ēČŹŹBmm-•J…‚‚TWW£¤¤pssCee%JJJ,śfيX=‰D???Ą_|!ŗŸÆÆÆÉĢ 7777>zś×nnnøłę›ńĪ;ļė^~łeģŻ»5jpéŅ%”••!77aaašööFqq1._¾ŒĮƒ·y½źźźVŪi\3ÄŌöDDDD¤ūū[&“ŁlI¢Ž¢²²Ā=Īȑ#… ˆžµ\.Gnn.ŹŹŹpģŲ1L˜0r¹ÜŌ!%ķ|n֘eĘx¹©hLmÓ!())ĮØQ£LĪ"3lŲ0 obff&-Z™L†Aƒaćʍnܘ’ūߒʵk×Z§µB—¦Ži̜shµZ”ŽˆF£ĮåĖ——/_FPPÜÜܬž Y“¼¼¼.Ÿq¦¦¦šĢ3ψ?Ŗ®®69•›> ąééŁl¹~ūŖŖ*deeį‰'žÖeeeA«Õāäɓ5j4 Μ9@7¬gģŲ±P(BżsĪ”gŖų—>°ęāā"z """"ŗ!;;ÄŌ©SįźźŠ²²2[7‰Čné‡ÉTVVĀŃѱYFˆ”8::"==uuuHMMň#ZÜ']gj"–¶¶3\ŽiÖ2cĪŲ‹e‡č>|ƒ Āȑ#[¬:t(FŒƒ Ė233įźźŠńćĒC&“įüłó€üü|ØT*ųūū£¦¦¦ÅC?ōFŒ©c3÷ŁŁŁ8p BBB„€H^^­^?ø‘É¢?Æ-¦ß=ž< „RŁā”R©ZŻW„R!<<¼Łņ±cĒB„RįĀ… (//GJJŠšŠ×šŃ×7nRSS@Øj>zōh$''›}޶äääŠ}N ?¾Ėū›ˆˆˆØ;;qāöģŁƒˆˆxyy1BdeĒŽCee%är9ƌ# Ń Ą˜1c —ĖQYYiN=S5HaƲN³Ę™Ž9±ČÅ釩Ü’ż8tčŒ:t(¦OŸŽŌŌT;vLŲ¾ŖŖ łłł˜9s&rrr„¬††9r7ß|3*++‘›› 777Ģ™3ųĻžc² ¦ŽiĢÜsdggcöģŁpttĦM›čóę̓‹‹‹Õ3D|}}…sŚ"µµµŲ“i{ģ1ćōéÓšööĘ#<ggg<’üó&÷­¬¬DBBxą\¼xgĻžÅčŃ£ńąƒbĖ–--†¹:qāzč!øøø`ķŚµt‘'Ÿ|nnnB†HgĪ”WPP€S§NįńĒG~~>Š‹‹±lٲ#DDDD=‰~öEK9wīĪž=‹¹sēB&“ ĆŲ‰ČśĘŒc*Ū£™¾}ūĀŃŃuuu­mßÖh’¶f±µKDŚSńÕāŁ!€n8Ā7ß|ƒÉ“'#22“'O†V«EQQ’’ŅbČBff&fĻžŻ¢`ēöķŪQWW‡Å‹ĆÓÓõõõøté¶nŻŚf;LӘ9ēøvķd2„čwaa!œQ[[‹ŅŅRKva ¾¾¾6 †čÅÅÅ”ŖŖ +W®DŸ>}PUU…ääd¼÷Ž{mīūŽ{Ŗ Ƽņ |}}Q\\Œ7š¬I¢wžüy8::¢¶¶VÖtéŅ%øŗŗ¢²²yyy>‡”×^{ ƽöāāāPWW‡mŪ¶įūļæĒ£>jÓ¾'"""²5•J…””œ?“'O¶śßĄDtƬY³Ś½OGNeN¦ˆEuäĘQƒ‡g.ä\ ś×śõΆˆˆˆ—¬}±Ō>śŁdl !"""¢ž©ŖŖ yyyĶfiģˆŚŚZTWWcŹ”)Ķź³u%}f6‡čužD"‰P Įąg€Zuj ~źŸė·m 2x€Öąa6NŚM&ÕÕÕŁģ?""""źł\]]©T ‰D™LÖīcH$( x{{óoS"ūdõņ¦tE@¤K†Ėåń?""""ź ™LÖ¬Hgčgö#"²kĶ2CDDDDDDDŌ^]–<Į€õ: ˆQÆĆ€õ: ˆQÆĆ€õ:]1ķ.u‚*ķ“mn'ńņ‚Ćč0›œ»=G ‹³Ż”J4M·mŗnń^Ų"DDDDDDŻ\Ķ+’Ձƒmnē0c:¼~łŃ&ē6‹—ė7ą §O…*ķŌ¹—”N= Ujš¶żjė–u)Ļm[ą8}Ŗ­›a ˆ‘Õ9Żw<ތķĮ£ĆtY5‹ŹĘN‚öņe[7‹ŗ@· ˆ$''Ūŗ DDDDDŌZ­¶Õצ–Łj߆š œ<‘‚Ó'O˜}ćĘOĄų ÖźB»& ‚ǧö˜,×W^@͟VŲŗŌŗM@„ˆˆˆˆˆØ+čƒ!+_ž?³÷‰{ēuĄģł‹mŻüÅł©ĒįžņóŻ.+¤5.X€/P”“uSČŹ!""""¢^E Q«š Ńh Q«”ŃØ Q«”6z­_÷½÷āæßĻ€ˆ™¤cĘĄćÓ-^ąµK(p¾ļ.4|ś…­[BVĘiw‰ˆˆˆˆˆČb䯼ļż»zf0ä:×?=nė&P`†QåŌTGU£šZV_mńsøÖWC]WŁęv²™3![’oHŚŗ[:M8¾³§¢~ū[7Åbj䞶nB·Ć€Q%ÓØįŅXwcŗ±ć3ĮQŻGĆsS(€5k€•+-))ĄÜ¹€RŁž}×­k٦ŲX`ķZ³įbł+²DZā"""""¢ė¼¼żlŻ„ž%:ČĪī~ĮXµ xč!vuw ˆp÷ņxūõµuSŗ?…Ų²E÷°Ę 2 †čÅĒ‘‘?Ł%DˆˆˆˆˆØ×su÷jöŚ·O€­›Ō}­\©Ė ‰Ž¶Īń- 1<ŽųńŗŸDXC„ˆˆˆˆˆz5W7ŃåžżƒPx5ĒÖĶė>BB€õ끨(ėĆŅĮ½œŻqĆĆ­×vźq!""""¢^­¾¶ µjµZx­ŃhlݼīaĶ]ARk²V0DO©­{ Ō£0 BDDDDDd/ŖŖ,LkÕ 1¤Ļą`­źB¬!BDDDDDd/RR,ŸÉaķ`ˆR Üqƒ!Ōå˜!BDDDDD½Nžå‹¶n‚õ¬]««óaĶZ–¢Tź2CXš”l€"""""źužūż÷¶n‚u-[¦› ĘŚŁĮ`Ł"DDDDDŌė¬|ń•vļ÷īŪ¶n¶ł”J]Pdß>[·Ätū !c@„ˆˆˆˆˆz„¦¦FhŌh4ŗŁd“šĻ5õõuŗēZ­ÖÖĶmæÄD .X¹ŅÖ-iŽĮź&!"""j§/¾ųĀÖM {üńĒmŻ¢¶EDŲŗ-1BŻ"DDdU¼q$cör#i/×Aķ—••eė&ōxĖ–-k÷>›7o¶uÓ»æˆą€čh $ÄÖ­iŽĮźfģ2 R[[‹””£¤¤ąēēDDDĄÕÕÕÖM$|߈ģoI7’dkŹ’‚ļūÖ;ļāwß·õ%ŲŸž¹]ŪßrĖ-¶nr÷՝ƒ †–-c0„ŗ» ˆģßæééé-–—”” ¤¤ééé9r$fΜi릒żū&—Ėįččooo@cc#rrrų¾QÆtąĄ|óĶ7Āė×_}śō±u³ˆlźż÷ßĒ„K—šĮĄÅÅ€ī’ŠēŸƒ Ā’%KšžūļćĮČ3lŻ\ź¦~żŚ½OüW_vų|ēϟĒO?ż„«WÆB„RĮßßsēĪÅōéÓŪ}K}¾-y,² é˜1p¹ļ.8ß²hėę˜gÅ ]]“ī(&XŗųŪß“éEģ* ²yóf!³är9ÜÜÜ555Ø««¤§§£øø·Żv›­›Løń¾ÉårH„RĮĻĻ€.•™™ ¹\Ī÷zįƇćį‡Ę”C‡‘‘a³v|üńĒšóóý÷Žkė.!Bdd$Ο?ōōtŒ?‘‘¦¦&DDD ((/æü2üżżmŻTźę:“)Ņ555ųĒ?ž¾}ūā±ĒƒD"ĮŽ;šóĻ?#,, ŽŽŽ6ł=Ė+=“aDŚS‚ †¢£u^ćālŻˆą™gtķŅOO<ō`ėÖQ°›€Čžżū›CĄĶĶ 'N?~\ˆŗķżū÷3ćĄĘ ß7GGG 6 8yņ$ššš0vģX@jj*$ ß7źUüżżįļļ‹/ ‘3gĪą“O>Į£>Љ'bēĪųńĒńē?’NNNˆEtt4Īž=‹œœ„‡‡cįĀ…ųā‹/PYY‰?üį˜?>²²²šĪ;ļ`Į‚HKKCYYfĻž„K—6kĆkƽ†āāb@nn.^yåœ?7nDaa!üżżqŪm·aŌØQ(**Ā’żß’a޼yøćŽ;DÆ)77G!lģŲ±šńń±uwwHAA~’żw,Z“eeevumŻÕ„ šĆ? --Mˆ¤„„A*•bĀ„ ø|łr³o½/^¼ˆM›6įźÕ«P(øūī»1zōh¼ōŅK CLL ššš°råJhµZÄÅÅĮÉÉ ’łĻpöģY¼šĀ m~®õ°lŁ2”——C”’Ćŗ1{öldgg#¤;§½“Ł ŠŠŠ€qćĘaŌØQ€°°0a½ŲļŁżū÷cĒŽP*•šóóĆ]wŻÕl=SŸoCÆæž:jjjšöŪŗéb_}õUø¹¹į®»ī²č敷ß~IIIŲµk”J% ęϟϿŁ,ČkĆæoÜ“÷dėÖū÷Ū. C”Šeƒ¬X!>¼H”¶lbcµkmÖMŌ5¤¶n€%ŌÖ֊“Q«Õšōō„§§'Ōju‹õéé騭­m±<77O<ńD³qĪ}ōrss-ŚīÜÜ\<óĢ3X»v-žüē?ćć?Faa”­»³ĖæojµP(pqq‡‡śõ뇀€899 Ū™zßąčŃ£xóĶ7ńĪ;ļ`ķŚµŲ±c‡UÆįčŃ£,īE݆L&$%%!** C† ĮńćĒńĶ7ßąöŪo‡ÆÆ/PSS#l›œœŒūļæC‡ÅöķŪqåŹ•fĒ\y}š¾iÓ¦į駟FEE>žųcø¹¹įÅ_„>żōS”——·«­ ,Ąģٳįää„ÄÄÄfė© ›7oFCCƒŻ][OćįįįƇ#--MX–––†”C‡ĀÓӳٶUUUųųćįåå…7ß|cĒŽÅ_|ŚŚZŒ1Bųžüłóprr‚\.Ē… čn4GŒŃå×7kÖ,455!$$•••šōōlń…õ,żśõƒ³³3~ūķ7|÷Żw8yņd³æcŒĻ᧟~ĀØQ£š·æż īīīųņĖ/”Ńhš·µĻ·”°°0”——£¢¢ååå(++k4±Äæ•k×®įūļæĒŒ3šśėÆcźŌ©Ų²e‹ģ! °‡`ˆŽ¦M]=ŃŃŗ@Gy¹.(ÓVŠ96X掾śZ°‹€HЉčbSS”J%”J%šššŚµļ€°}ūv«·½oß¾X³f Ž|óMLœ8’ųĒ?Dƒ7ŻESSŽ}÷]‹ĖøļõA­V‹)S¦`Ź”)ŠjµĀńÖöt)©7nĊ+šņĖ/ćå—_ĘéÓ§QTTdµž˜%%%X¹r„ŠĪ§žz jµ[¶lT*Åo¼777Üzė­ųģ³ĻąįįÉ“'£ŗŗŚÖoW·ēķßßäĆÜÜ܄÷n’žżųģ³Ļ°zõj|ūķ·Šh4-~ĻöéÓļ½÷ī½÷^xyyačŠ”Ø­­Eiii³ć¶öł6¤Ļ,ÉĪĪĘ„K—cƌ1ūXęž[Ń’nĢĢĢDVV¦OŸŽ>ų€CrH\Hˆ.Ų`mŗąGy¹.ݾżcb€Ż»»w”Zź»2£’ć^_3DPŠjµP(ØÆÆ‡Z­†»»;!“É„š"¦¢Ö~~~pppĄåĖ—ŌlŻÖ­[‘••Fƒžżūćī»ļʱcĒpéŅ%Üwß} DņŸxā Ą’ž÷?µśGŠ”)Spųšaœ9sćĒGBB.^¼‰D‚   Üyē€ß’‡†T*…B”ĄņåĖ‘‘‘Ć‡ ēūč£°pįBTVVāĉP©Tørå –.]Š#GŽ ¢¢/¾ų"är¹čõdffbļŽ½pvvFaa!ÜŻŻńĢ3Ļą›o¾ĮÕ«WńĆ?ąž{ī±ČūfØŖŖ ^^^B¤¾¾UUUfķŪŲŲµZ ­V @wSņŅK/µś¾I$’võ§\.Ē?ž(|»>~üxäåå”®®Nč—+W®`ńāÅ9r$Ż7'?žų#^~łåNõ‘¹¼¼¼@ųw¤OŻ×æV©Tpttl¶­»»;]`±5J„Ą@‰~把еÕĮĮĪĪĪØ­­Evv6²²²°hŃ"H$üśėÆšńń££#233±pįB8;;ć×_Åŋįą ž_˜D" ū?!22G…B”Ą¬Y³°gĻ@„R!++ ·Ür °cĒäęęĀŃŃZ­NNNĀöłłł˜4i’04Ę0cĶÜk#Ė?~<¾ūī;a،~øŒ1żēņ£>j¶¼¬¬L(fyéŅ%¤§§cŹ”)Šh4HNNFhh(æĒŪköģŁX½z5BCC±~żz<ųąƒxõÕW”Ńh°wļ^¬X±Ā¬ć|õÕWX“h233±mŪ6|łå—ČÉɁ»»;ƌƒoæż>>>ŠjµĄēŸŽ|įįįŲ½{7¦L™‚;w²öVŹ‹óEƒåÅł;ĒąĮƒ±jÕ*444ąāŋؾ};~’żw 2įįįͶ­ÆÆĒ7ß|ƒōōtČd2įK=ć/ĢZū|2d‘ĘĘFøŗŗbŠ Aøxń¢YĒ2÷ߊ——næżvģŲ±_~©+@;zōh<śč£pvv¶ā;H=–µź‰(ŗc?óŒ. ŅYĄÉ“ŗrŗkAXź0»ˆčSIõ5C<==Q__899ĮÉÉ ·Žz«°¬²²RØ)b* U«ÕbįĀ…Ų¾};ž|ņIayFF „?f¾üņKœ9scƌĮ/æü@÷VEE4 Ōj5d2ŅŅŅ̚*ląĄ(,,Dzz:.\ø€Õ«W>ųऄ„A”P )) ƾś*°iÓ&$&&¢_?ńjéR©………xķµ×°yóf$''cŊųģ³ĻpįĀ899‰^\.ĒŋńśėÆĆĶĶ o½õrrr°pįBt:bų¾é©ÕjdffĀŁŁYų6”øøēĪƒƒƒC³,±÷ĶŪŪsęĢAll,†ް°0L˜0r¹ÜäūęėėŪ®ž”Édøté^zé%āĄЬ_Nœ8}ūö H:tHų¦žČ7nıcĒšśėÆĆÅÅE¦įęę&źėėt<”§8źź¦čƒ+•••Ķ~źg†jƦ¦&Ō××C.—£¢¢®®®B1l¹\ŽŹŹJČd2a”Ήį°F} ŌP’žż…ßżśõƒÆÆ/$ T*•š;zĻž=ĀöµµµB€hąĄprr‚T*ESS“@źčµ‘e¹¹¹aäȑHOO‡T*ÅšįĆE?»śĻėÓO?Ż,ø!“É •JѧOœ={W®\Įˆ# Ńh°yófœ={}ūöķpØØ(xzzbĄ€ČĖĖÚ5kšģ³Ļbćʍø|ł2īŗė®vóģŁ³hllÄŌ©S…e¹¹¹Bš?üįĀļƒ… bņäɐÉdĀæQjqPĒĮCĪĪĪ5j”š·•qšvķŚ…ääd¼šĀ 6lž÷æ’5ū]„׌ēې¾F[NNźźź©Tjö±Ģż·¢Õj1oŽ<Ģ;łłłHNNĘöķŪ‘œœÜīŁtØY·8uŹ2†čhŻ,111–o§BģŪ§+¶ߕ=DVf1bĆ,Ś+88MMMøv횰,++ ¹¹¹X·n°Lm÷óóƕ+WPUU…ĮƒC£Ńąāŋpww‡ŸŸ\]]Ū<§T*…V«Evv6† &|Ó9dČäę梤¤C‡nŠō)¼gΜ1yĢ€€H$xxxūyxx ®®W®\½¹\ŽĄĄ@įĘÄĒĒ555éWSō“]øpA~įĀŌÖ֚=ɒ%˜3gĪ;‡Ó§O#!!/æü²É÷ķāŋķīOš\ŽM›6”““ČĢĢ2‡ˆĢįļļŹŹJÄĒĒc芔8uź‚‚‚ąęę&L»{čŠ!ø»»ćōéÓÄę8~ü8ĀĆƑ””-j&888@"‘ąźÕ«(**Āųńć±iÓ&ģŁ³ …»v킳³3ĀĆĆĶ*ŖŖW__śśzœ={V˜]*??YYYØ­­…V«Emm- ¤R)źė녀ɮ]»///hµZ”––¶yÓ§’]Ŗēåå©TŠŁ³g7 X\½zUt{½¦¦¦6æé»6²¼ČČH|ūķ·J„B„±Ń£GĆŁŁūö탟ŸNœ8]»vaÕŖU Įˆ#päČø¹¹! ąźźŠ£G ķł\ė:t£GĘÕ«W1hŠ ( ,Y²ūŪß0sęL 0Ą¬ćč?‡ååå5j‘˜˜ˆoĢ,”’2F*• Ūßģ’yōAKC:„7"22#GŽ„F£Įžżū!‘H0lŲ°ægõAš«WÆ¢²²ÉÉÉtÅY _µõł6†mŪ¶”±±sęĢiŃFKü[9yņ$6lŲ€˜˜ 8PŲŽAajӖ-Ą AĄõ,Ōv ŃGŽīša-ė׳fé#dģ" āē燒’ŌŌŌąųńćBJ”ÆÆ/"®§I„¤¤c/õCfōū¶fŃ¢EŲ¾}{³?ŽĒŪoæ½Å¶ćĒGjj**++1~üxh4¤¦¦ĀÕÕU4•WLvv6ęϟߢ°!pć#±ć?Ž Ó* ’0ū#IģzΟ?ßā†ŽŽp™¢ß UVVĀĆĆCųöŪŌŽ©÷­±±QČš8q"6lŲ Ō»ĪÄÄÄv÷g[7CR©3gĪÄžżūŃÆ_?DDD˜Lķ'3kÖ,”””ąčŃ£8wī,Õüüü°`Į$%%aĒŽˆŠŠĀʍ”R©:t®Q£F!>>ˆŽŽF’žĶÓĘe2fΜ‰Ć‡ćūļæĒŠ+šĢ3Ļ`ćʍx÷ŻwŃ·o_<óĢ3Bfž¹vģŲ©T oooÜtÓMĖå4h”J%vķŚ@—b®’£¾¼¼\Śōė×#FŒ€V«…‰DFÓāw—˜ąą`”•• ēņššžæćåå¹\Ž={ö`žüł­ž/vmdyįįįŲ°ašššLžėé鉧Ÿ~?žų#Ž|óM!„_’¹1b~’żwDFF æ÷‡ &ŌMh/żæĆ½{÷āĄōéÓsż›Ź|K—.ŧŸ~jöńƌƒ€€Ģ˜1ÉÉÉxä‘G0qāDhµZ 6 Ÿž¹­ß»cĢÉ“'£““ĒĒįƇ!“ÉŠ·o_<śč£ĀĆß³<šĪŸ?M›6!88śÓŸļ¾ūNų<m¾ ………aćʍH$ĀL7†,ńoeģŲ±˜:X¾\7EnW‹‰ƌęĪķX§ūšā¹m §O5{ūīĪ.īŅüżżQRR‚ŗŗŗf™†uuu¢³ “UčiȐ!ųłēŸ…tņŠŠP|’ż÷øõÖ[įččˆ/æü‹/ʀŽ/¾ų øóĪ;”Ńh°eĖČd2üéOjó:Ž=ŠŠŠ „……ĮÉÉ ?’ü³p³~įĀ,^¼Ų³gąģģŒmŪ¶A„RaōčŃĀõÕŌԘ]ÄĻŌõ˜"‘H,VōU’¾ӏ·?wīœÉo¹ÄŽ·“'Oā·ß~ĆóĻ?gggØT*bäȑpww½Ī!C†X¤?ūeƌųūß’//Æf¼™C"‘ąŽ;ī0łmōm·ŻÖ¬&ĄÜ¹s…ē†7H#GŽlözƌ˜1c³fõķŪ·Ķ ¦ūļæ÷ßæšzųšįxķµ×Zl§/>ٚąą`›¼ī &ˆŽÜ†‡‡·go|ķ†iŽś! ĪĪĪ͆'fˆĖÓÓ³Łö†ļĮ’%KZœæ_æ~Āö&ƍ,O.—ć“O>i±Ü8P0|ųpüłĻ=FDDD‹Ļ¬į0YĄ¼ĻµŽwÜ!üæż÷æ’]X®ŃhPXX777“Ł,zQQQĶõ†_|üńĒųų換m?räHa{??æfūv4PJ–%“ɰdÉŃß!zĘæg?³±±±Āss?߆ Šāslé+2™ wŻu—š;ŃŅ_¤õ&ŅėĆ7{•Ø(`͚֧¹ŠŅA¢£m?󋾮ČwŲnś`²»ˆDDDˆN»kXČĪTQ»3 ķ,\ø~ų!Ż‘‘‘ųąƒ ‘H0tčP!õU?Ģ£OŸ>B‘7///466š—_XXˆµk×B­VĆĒĒĻ=÷0bÄdddąż÷ß  Ģč’؟7oŽ’}Čd2xzz"&&ĪĪΐĖåxóĶ7ŃÆ_?„††¶˜žMŒ©ė1žiBĻ××MMMųģ³ĻZüGh©÷ Šez 2‰&ĘнoćĒG~~>Ž~ūm8::B­V#<<\ŲÖŌūf‰ž4ī 2•••ͲY¶n݊††ÜqĒŠh4xź©§šé§ŸB*•bóęĶpttlõ&""źybcc±nŻ:ÄÅÅĮ××ÕÕÕxļ½÷D·]½zu›µ|ˆˆģRl,”Ō¼žHHˆ.Óżfz ŃĶ@³jėŠō`’ī#1Ų×ĮąįĄ€ 9Wnןė_»l£ßŽY«Õ¾d~ZŚæ‹›k???Lœ8€nœ¼q6Āȑ#1sęĢ®éi%ö¾łśśbÜøq8yņ$źėė[Ōé ļ›J„‡~ˆččh!–Ø·śā‹/šųćŪŗŌMdeeašąĮ¶nF§ńsŻs)K šóÖķ›žžwŽ}ßn>Ē–dœ"–!bø,ŗ•éO[Ė.ټys§Ī«÷łGļa勯 ©©µZĶēśś:Żs­V‹’~’=V¾üé3SCf䯼×W^°Č9z„RWOD_ µ½ÓäŚJ\œ.0ŅĶ•zõķō1,5dF"‘ÄØŠpż”^{ży5€ŗėÆõĻõŪ5P<@kš0›]dˆŗ±—ÅÅÅĶ‚śš"śē†üüüŗżMuo ö¾ÕÖÖāšįĆŠ"ŅŽ·Ż»wćȑ#˜1cƒ!DDDŻĢ[ļ¼kė&€„„įyGƒd‡ @¤ĢA··r„.c䔇즮Hoa7@7®Ž0ćĄø¦ˆ^OČ0čMÄŽ71=å}›;wn³ŗDŌ|Š\""[zēŻ÷mŻ"²GŃŃ@` šÄ¬+҃ŲU@ŠeDDD %%„Y恟ŸüżżaÖō·Ōµų¾Ł/+ {Å@5”«+²lYóZ(V–ēģŽ roĢQ¶>„[]„™Gjäž]Ö~[²»€ ›]¦'dPs|߈ˆØ§` ˆŗU«€S§DWå;ŗĀļĖĀ‘³ u…Ų·O÷¾ÄÅYõTåĪHwõA½Ō¼Ūz—Ę:³¶!"""""¢īīŌ)“Łõ.žH}śELųå¶neļ³n0nœ.0b…ŗ"Ł.žČvé…S4[˜ŌÖ """"""ėP<‚¼O’mėfōN11ŗ!4 …ÅYīąŒCžż ±DˆˆˆˆˆˆģXöŪėŠ”›kėfōN@v¶īg'e»xā¤{³‡ČPŪģ²'•J%Ī;‡‚‚üżżŃÆ_?„……AaĮŁ‡ŚŚZt%"""¢ī/%HMÕe˜IUYÉ”3¶¤PÉÉŗiyććŪ½{{k…X‚T£†F*ėŗ>²» ˆ:t©©©-–£øø©©©3f ¦M›fė¦R7a8寔’’””” ==½ĒLłKDDDDv®ŖJwc}ś“®N…™ōCgŸzÄÖWŠ{­_£®ˆ™Ī¹ś ĄÉĶÖ-·[v5dfóęĶ¢Įc©©©Ų¼y³­›KŻĄęĶ›Eƒ!ĘŅÓÓł™!"""¢ī#.ˆŒrrĢŽ…CgZ*޶‡ĘNCUźŁ®9įŹ•ŗYhڵ ÆĀ`ˆuŁM@䊔CĀšs抔C¶n6ŁŠžżūQRR¹\???ųłłA.— ė——””`’žż¶n6‘NJJ»"ś”34åęāÄ-w!õĒPŸwĒoZ„üļ6vĶÉ£¢€“'MÖ9ēźĆZ!]Ä.zX©T¶Č ™4i ŌlYvv6Ž;&¼NMM5YS¤  ß~ū-JJJąąą€ČČH,Y²Ri÷!i4üė_’^?śč£¢ķ5um‡B^^ī½÷^[_ŠÕÕÖÖ ™!nnn˜8q"œœœš<är9¦OŸŽĘĘF?~uuuHOO­)’››‹wß}žžžhhh@’žżq×]w”oß¾&ŪpąĄ‹öwGŚ`ŽōōtģŁ³Ļ<󌵎""""ź":ä}śodæ½ŖŹŹfĖӟ~U©g1ģ­Xė7"$D7ĶŖUŗi“srļäŠl/BŗP÷½»o‡'Nˆ.+//^———›ÜΘF£Į?’łO̜9o½õ^{ķ5\¾|iii¶¾T455įŻwß]— 777<žųćpppĄµk×zŌµu„”””fƝœœąāā‚yóęĮĒĒ>>>˜7o\\\ąääŌź¾z}ūöŚ5kšę›obāĉųĒ?žµZŻį6¶ö^›ŅŽ6täDDDDŌ³õÖ”3ś¬ ^Ū"¢w峯pīOĻ£©¢Āś R(tuE²³Ń”“¬‡āž{ą8ŠÖ]ÕkŲEčI©T¶X¦R©püųqĢž=püųqØT*³ö=wīÜŻŻ1iŅ$€³³3ž}öYa}BB.^¼‰D‚   ÜyēHNNʉ' R©påŹ,]ŗGŽAEE^|ńEdeea×®]puuEii)|||šČ# ””’ž÷æ”ŃhŠŲ؈1cĘ`Ń¢E€ß’‡†T*…B”Ąņå˱aĆ\½z?üšī¹ēžfķ–Ė娯ÆĒ„K—PTT$šŠŚµ8p@ŲnėÖ­ČŹŹ‚F£A’žżq÷Żw£¶¶V“­Ų»w/œQXXwww<óĢ3HKKĆįƇńÄO>śč#,\øMMM¢}įąŠuGĆįU555Ųæ?ęĶ›˜1cF³m÷ļߏŗŗ:Ń}M™2e >Œ3gĪ`üųń¢żiHlż7ß|Óģ½ŪF"‘˜Õ†aƆ‰¾w†ēX²d‰ÉĻb}}=>’üs”––Ā×׏>ś(źėėE·Æ««C||<źėė”ŃhąīīŽ?žńĖåķ¾"""¢Ž¦īķwįŗć`Å :Ś*ēč³Īdæ½yŸžŪd ÄPĮ÷›Pzćł/½¼ŗ¤}ŽĮĮčŒž÷Ż @¼)9x åCyąźó®Ų“’ģ•]DLŻ –——ćäɓĀss÷-,,D`` čöéééøpįVÆ^ ųąƒ––©TŠĀĀB¼öŚkŲ¼y3’““±bÅ |öŁgøpį‘››‹7Žx®®®ųšĆqźŌ)DFFā¹ēžhµZ¼śź«˜9s&”J%’’’šź«ÆĀĮĮ›6mBbb".\ˆ‚‚‚Į@—żqśōi8::āŁgŸ…££c»®M/##X±bąĖ/æÄ™3g0nÜ8ѶJ„R\¼xÆæž:ÜÜÜšÖ[o!§•±ŒR©Ōd_tżŌŗ„`ǁ0cĘ x]’„WQQ ®®®Y@ÄpßÖ 8………&ū³­ž6|Æ[{OĢiĆųńćEß;ćĻ“Ų6——‡7Žxīīīˆ‹‹ĆéÓ§1aĀŃķĻž= WWW<õŌS€3gĪ@©T"77·C×@DDDŌė$&ź!!ŗĄHLL›E8Ū«· ©J=‹ō?½€ź“sķŚÆ:ķŽńæücFuy»MHŖRĻByąH»Æ‡ÄŁE@ÄŅŌj54čŗģģl 6LųV{Ȑ!ČĶĶE’žż‰D!ŪĮĆĆuuupttDPPP{bšąĮ(((@CC6lŲ€śśz888 ®®ÕÕÕøxń"†*ēŽ;īŃa0€ī†õŪoæÅāŋQUU777|õÕWøżöŪ…ü¶®M/++ ¹¹¹Xg0Wcc£É¶@`` ÜÜt}||PSSÓź9ÄśĀŽH„RhµZ“ż©×Özs·i­ ­½wz­mwwwŗ÷ėŚµk5j”čöƇĒĪ;ńłēŸcŲ°a‡··7Nž<Ł”k """źµrrt5&Ö®Õe‹¬YcŃĆgæ½żž0ŽĮĮ¶¾R«Č~{²ß1jbcŖŹJœ¼ån }k˜°!@‚ė’Š (AöŪė黈ųūū‹fzx{{cüųńtCcIJDüżż[,ėׯ’““Ķ>æ>8bXĄ“­ā«Z­‰„D"ĮÓO? xé„—šmc®C‡aīܹˆˆˆĄ|€³gĻ¢¼¼¼Y0¤=×6~üxÜ~ūķĶ–ķŻ»×d[e2™čõ2UĖBl[kóóó2=är9är¹0T¦Ā`¼ąŒ3°k×.72IüüüĢ:Gvv6ęϟ+W®ˆö§į%±õĘĮ/±mĢmCkŸ3½Ö¶ū<›Ś^”Pµi222šĮą¾ūīėš5õzJ%Æ{„„Xģ°ö:t¦üĄa\xu­EŖŹJ¤?żT•Ż*›ĘŃĖ ž‹@U”kuŒ]U›%ĘĮĮ'N„££#1qāDŃbū†……”¦¦æ’ž;]=’ųųx$''cšąĮČĢĢ„V«…V«Å… ZĢfcJ^^źėėčnTPWWŗYojjj V«1dČœ;w €m۶᧟~‚D" ,čėqH$Ü{ļ½ųä“OZŌĀhėŚōBCC‘ššŠ¦¦&ŗ” ×®]3ŁVS\]]… TMM ņņņZķ‹®dsss††ŗ@…a°bęĢ™Bö‹ń¾¦=z 3ٟmõ·į{ŻÖ1Śjƒ©÷Īš­½æ†ļWNNN«ŸŻÓ§OćŅ„Kʂ 0mŚ4\ŗt©C×@DDDDFŚ1Ķ®9ōCgģASEĪæ‹“Kī¶xÖą?ÆÅ¹?=oėKl”’}wĀĮÓÓÖĶč±ģ"CdŚ“iøpįB³e&L€···šŚŪŪ&Lh6ķ®~ßāą€+VąŪoæÅoæżDDD`Ā„ J„ČČČĄūļæ@7dfäȑ¢³Õ Ą’ž÷?ĆÓÓćʍC`` >żōS\¾|AAA˜5k¾’ž{¬^½óęĶĆūļæ™LOOOÄÄÄ@&“”©© Ÿ}öž|ņIįŲsęĢĮW_}%k–-[†½{÷"==111f]Ū”C‡Ć‡Gdd$>ųąH$ : €“““h[o½õVŃė4här9Ž|óMōė×”””Āp±¾tÅEpĒw@£Ńą©§žĀ§Ÿ~ ©TŠĶ›7ĆŃŃK–,éōg&""B˜vø1tư€ź®]»0sęĢĆ:"LĢ^XXˆµk×B­VĆĒĒĻ=÷LögVVV«żŻŲŲŲģ½ŪĘÜ6Lžk:x•‹—‰®ó­(“Č9²]<‘ķbŽ»bś”9t¦©¢^]‹‚ļ7uŁ9ŻG‡aä?ß·I±UŃ>ČĶÅžš™˜£ĢėüĮ®+÷šƒF*k±ÜsŪ8NŸŚéćK$’8õ®?ōĻkÆ?ÆPwżµž¹~»F*ƒh f³‹!3€.ÓÜ” zžžž] ”īięĢ™šóóC]]JJJPRRŅl6ćå~~~ †Q”P5ĄÆ©Ö¬m{āŠ™ām;pxģō. †ŗhNŽr7Źn±®)7·ĖūĮ18ŠéSŗü¼öĄn"pŪm·a̘1mn7fĢÜvŪm]ڶ‘#GŚ<#¢»čN}qŪm·aäȑfµ¹«?3DDDDDį­jĄŲšRĢQęa|uś5ÖĄE£2¹}öŪėlrCß^M8s’£H}ą1Ø*+mŅUe%N.¹łßmä·'n¹ ūĆg¢*õl—·gŠ=Ė:^Č.jˆš6m&L˜€'N   @˜}ĘßßżśõƄ ąāābėfR72sęLDDD %%ÅÅÅĀģ3~~~š÷÷GDD„0E0QOä­j€·ŖAxļäŠbG9Joü«Ŗ¬DśŸ_ĒŲo’eėꚔ’ŻF\xu­Ķ!Ęҟ~”Å,/łßm„Ē[N“˜Øū©T§NéžWTÜxž“o Ūķ-ģ. ...CķāźźŹį0DDDDŌkōo¬E’ĘZ„(wpF¾“”Ī(پÅŪvĄń[7±™¦Ü\¤>ż"”Ųŗ)m*ųn†½ŪśFbAŽÜܳ:„[GVe—""""""2qöHqĢCĄ…s€Baė¦ņ>ż7²ß^×m²BŖzį¹aæ)ōĻ«‹€‡‚ƒÓ§o6äčv!""""""I>0~< ̚„ūi]™"äpŃØą¢QÜՍpŌ¶c“ųų.ķ+źDˆˆˆˆˆˆØ¹œ .N÷€Ø(`éR`åŹ.9}öŪėżĪŗļÆ fØ®?WC.<æä0Ģī Ž‰""""""j]b¢īcõ”4Ēf.DuڹĖM9 9,ĆAŻ„F©ĢÖͰžuŚŗDDDDDDŌC$&Z}M`C\Ŗ‹„× rt=Łõ,{'µuˆˆˆˆˆˆHGŽPcė&“.)Éź§č?}’Pč•Į²&DˆˆˆˆˆˆČ<ū÷[’³fŁś*©—`@„ˆˆˆˆˆˆĢ“’bż©c£¢l}•ŌK0 BDDDDDDęKL“īń "ĀÖWI½"DDDDDDd¾S§¬Ž™3m}•Ō p–"""""";Tīą Ą ³“tAaU̚ÄÅY’<=ˆžżåõēuRŌL;”ŗŲÖĶģQz\@ä‹/¾°uˆˆˆˆˆČ†bbblŻ„A鱌l/€BUŽŖzų5ÕĮQ«ķų­=dĀĆ»¤ŗ} CišŠ/«—: ^jŽm»BUoėKéqz\@ęĪkė&õJ@“ĄE£‚»ŗŽŖø«›ŚŸE’˜hŻā§!!ŗGNŽ z«óōj™£°¬ŲQ.<׿d[=2 īīī¶nu”źźj[7Įnč3J]…e U=¼U pŃØŚĪ"±v@Š?>ŽÖ]%ø‘µ!²6Ŗ †}I=C ˆ‘å(\še.øhTPØą- ·1Č"éŖ:"Vˆ“U—ƒ™ö""""""j”^ź€'a˜ p#‹Dqą0¼­Ż€Nd Y©’9 AŽöŌå ūĘO™Å0‹düĆšž1Õz'3Ŗ#"6d„y†³9Ø}ģ2 RZZ __ßvļ·~żzLœ8£Gn¶<-- ĒĒ„ PXXˆłóē[“½ÅÅÅŲŗu+ŹŹŹ “É0vģXĢž=R©Ō¬ż7lŲ€©S§"44ŌzJDDDDDV'ÕØmݳU§ž³n@Ą¹EĖPšż&[_*Ł)óīø{˜“'Ob÷īŻH$ķŚoŹ”)8vģX‹åGŔ)S0nÜ8‹C4 ¾ūī;DFFbõźÕxśé§qķŚ5œ?ަ}HDDDD¶uäČ·{æ¼¼<œ={¶CēŌjµŲ·o_—œ‹z¾ņ‡­~1£l}™dĒģ2C$;;šæ’żC‡Ŝ9sPVVÖę~#FŒĄöķŪQTT„>}śŠŠŠPQQ#F %%łłłøå–[°wļ^äååA£ŃĄßß‹/ʙ3gpłņe,Y²šß’žZ­÷Üsą×_E’žżn0§öŋįźźŠ±cĒœœœšąƒ ėwķŚ…Ė—/°pįBh4lŚ“ P(ØÆæ1ß“X»Ś""""¢ž+00°Ćū–••ĮŪŪüŹ9õ|ŹG¬~Ō)¶¾L²cvŃS*•8~ü8.\ø€9sę`芔­F$ &OžŒcĒŽį–[n Ė™4iR³ BVVJJJ°|łrŗĄGFF†޽{÷Ōj5ŖŖŖ Õj”V«!“ÉpžüyĢž=»Ł9KJJŠÆ_?Ńö\ŗt ¹¹¹xä‘Gč†ōœ?*• uuuxģ±ĒŠŠŠ€÷ßæÕv9ŅÖoµA«Õ"%%uuuĖåhjjÖedd ¬¬ Z­;v,šššpāÄ ØT*hµZ899aüųńøvķ***0zōhœ8q¢ŁńBCC!‘H••™L†źźj8;;cŹ”)H$ĀƒEEEøpįœœœP[[ ¹\ŽČČHTUU!--MŚ=`ĄTTT`ģŲ±ČÉÉĮåĖ—!‘Hąāā‚ &@&“µ«ķŽŽŽķ>²Ue%ŖRĻZ5‹ĆcĢ(8xzBUYiėĖ%;d×=„R‰Ķ›7C”P“‰ˆˆĄG}„łóēC«Õāܹsxī¹ēšmsłņe\½zėׯ–555ĮÅÅ>>>(((@MM ‚‚‚ ŃhpłņeøŗŗĀŪŪ..Ķ żh4hMĢļ——‡Aƒ Į˜ąą`\»v Z­VˆĘ;;; Sķ""""¢ī/??˜9s&T*vģŲ@Wo®ŖŖ Ó¦M?~łłłP©TpttÄäɓĶ2‡ „ćÕ××c÷īŻ2d$ JKK1wī\899!)) åååšńńAqq1BCCQQQ„R‰łóēĆŃчB~~><<}Z­#FŒ€\.o±]XX,X ŗ<33555 ƒF£Aff&\\\0jTĖ_žžžHMMm×uP _›juo•••šńń888ĄĖĖ €n‹R©ÄĮƒ…mÕj5üżżqįĀ;v ~~~čßæ?är¹šÅŸįń\\\„怗—œœœčžžmllDSS“­ …BPųųų ŖŖ puumv,@—õģēē'dŽč')ČĢĢlWŪ©ē)?pO=bÕsxĻ˜Ź€Y…]U5E”Pą¶ŪnĆ]wŻÕźvS¦LĮ‰'pņäIL™ŅrĢZpp0233”R©čj•Fމ‹/"77AAAFnn..\ø :t%44uuu8~ü8@„RaóęĶHMMEPP²²² Õj”Õj‘ĄĄ@ųūū#//P[[‹üüü6ŪEDDDD=W’žż1}śtį1pą@øøø`Μ96lŌj58Š¢«©ZrbĖ‹‹‹įļļ/ŗ½įp2™¬Ķm,ŃvźŖSĻYż¬#ŅõzŅlGŃ+2DŒ‡Ź“U`µoß¾B4¼oß¾-Ö4cƌĮW_}‰D‚a;wwwhµZųųųr466ĀÕյű°|łrüüóĻųż÷ßįąą€Ń£GcŌØQJ„ČŹŹĀW_} Ahh(T*ŅŅŅšłēŸĆŪہŠjµ­¶‹ˆˆˆˆŗ7aJcc#”J%Ą××§OŸĘȑ#!“Épüųq >555prr‚ÆÆ/ “Z-JKK…L www\½zPWW‡ŠŠŠVĻ_TT„€€įuEET*P^^ŽAƒ™Ü×ĻĻYYYĀö™™™B‘’ö“ŻT@†ŗÆś¼+hŹĶ…cp°ÕĪĮ:"]Ļ„±5rO[7Ćźģ: ¢P(šĶ2cĪL3z?üp‹eĀóٳg·(Ŗ÷č£6{}ß}÷µz.___<ōŠC¢ėĆö888ąŽ{ļݾµvQ÷Õæ\½zIIIpssƒ“Z-üżż€ƒB"‘Ą×מžžÉdĀ0o@÷7bxx8 „ć]¹rū÷»;|||Z}°““T˜ł<==‘ššŠšš”n]UU•č¾žžž2d8©T gggL˜0ŽŽŽķj;õL%”æ"눐uŲe@D½ž7o“Zm»!DDDDD¶ •J1iŅ$Ńu#FŒĄˆ#š-sssŠ• ¾~cŚŌŌ„”C‡Ā××Z­{ö쁛›är9üüü„ķõē4žłŠĮĮćĒo¶ĢÓÓQQQ-Īč²™CBB:Õvź™ŹF’ūī“ź9<ƌb@„,Ī."ćĒ~ńuuuu8}ś“čŗ &M-A*•āāŋ8{ö,]Ą‚…KÉ”ŽXżŠS€wl}„doģ2 āėėkė&µ —ĖE‹ö[ƒL&¦µm/Öó ³uEļSm}™d‡zÕ,3DDDDDDdy%YżŠéœm†,«ĒfˆTWWŪŗ DDDDDDåŅXgė&tHUźYō‡uėˆxϘ åAėϔޣĒDüq[7ˆˆˆˆˆ ×ī«ågŖ¾_gö„īƒuDØ'ā""""""ź”ź“shŖØ°ź9XG„,""""""ź“ć3!ūķuV Œ°ŽY"DDDDDDŌiõyWżĪ:ģƒszŽ*ēpfėĖ$;Ā€YTĮ÷›P~ą°ÅĖa3dI=®Ø*‘½*õźk±cÕJl{»WzĪā Å ™1EéąbŃĻOoĄ """"""²8kdˆ8zyĮ}4‡Ķe0C„ˆˆˆˆˆØ‹É‚!åE«ž#@"A^£ƒ§§UŽ;ü•UhL;kĆ+ė¾äVž¢ZhėK“(Dˆˆˆˆˆˆŗ˜4p \_yĮŖēpµõEZ‰×āĄā¶nŁ™!""""""¢^‡"""""""źu!""""""¢^§ĒÕłį‡lŻ"""""²”Ūn»ĶÖM .)) QQQ-–'&&bÖ¬Y¶nu‘€™³fŪŗ DDdCū“öańāŶnŁĄ¶mŪlŻ›łé§ŸpźŌ)$&&¢ŖŖ )))ĶÖGEEA”P <<·Ür """lŻä^-%%ÕÕÕHLL–>7¤ßō?;”IJJ‚R©Ä©S§Z=ÆįłĀĆĆlė.ėr=2 ’wµĄÖM ""«««³uˆˆˆ¬.77qqqˆ‡R©lu[żMoBBbcc…}ūöŁśz­Õ«W› €ˆIHHhö:** 111ˆŽŽ†———YĒ0•ł"ĘømxöŁg±|łröZן‘µZeė&YÕŚµk×f Ĕššp[_uBbb"”P(‹+VXõ|)))ˆ‰‰A||<ĢĀōd,ŖJDDDDDŌTTT 22±±±†0;S€ŗ7„R‰•+WböģŁØØØ°śłŽ%ē²µ™!BDDDDDd***póĶ7·ØbH_÷Į8ą‘˜˜ˆS§N A”„K—ŚśrȈB”@TTT‹ģœœäää“:Ä&117ß|3~üńĒv×ūˆ‰‰ALLL‹ćmŻŗUō³–““ƒ•+Wbżśõ¶ī2«²Ė€ˆV«  D"¹¾L@÷\挈ˆģ“F£pć÷½D"¹ž„ŸRiĖ$I­V+¬7µ ‘µ“ ‰ŠŠĀŹ•+M:Ö¬Y@7ōįĄ¶¾Ž-[¶˜\_QQ!Ō€ÉÉÉi±>%%·ß~;öģŁÓ®!-111- µĪš5 kÖ¬ĮO?ż„˜˜˜ŁHńńńˆµėb«=2 ŅŲŲ$ŗ\£ŃąåžĆ«ÆÅĀÓÓ '’cߞ]xņéēąęę‰T©TĘ ‘Z±b-Z„›nŗ ‰HJJĀÖ­[ńöŪoC«ÕĀŃŃ@ó€Gyy9yä|’ż÷Šh4Édpttä’DDŌebccEƒ! …qqqf»Œˆˆą 3=”——–/_ŽåĖ—cķŚµˆm±MJJ bcc±nŻ:‹œséŅ„ˆÅŹ•+[¬KLL“ė"«vłÕ—Z­†JՈĢōsŲłŪvüńįGįä䕪 Zøž  F£F­†F£¾Ōjo¬‡į2NNŽ-©gN"õĢIŃuDDd}S§NÅńćĒŃŠŠ€śśzØT*;v “'OF}}=ŠŲŲxż’ ššš R©„¬’††ŌÕÕ”¾¾MMMŗ’+®’?!öÜų¦žĻ ""jMRRāāāD×ķŽ½Ū®oJIܚ5k/ŗ...¹¹¹;—ńp=±,{Ņ#3DtĆ_L/רUø’w?nü÷=øžP«UÉdøtńłä|ņÉ'P«ÕÉdøļ¾ūœ;w6l‚÷ÜsF ™L'''ČdĢD$"¢öĖt7¾ÖĪöČĶĶÅ©S§pźŌ)aYxx8ĀĆĆ{Ģp‰ÜÜÜ58BBBŅbØH{›˜˜(¢¢¢:u¼öZ¾|9ZLÉ č>3–ŖńŃf”Ó#"EeāÕnõßīå]ĖĒöŸ7ć곋ą,wCyE$R)źšķ†’ąĪūž__?ąūļ6 ę±?a`pĪž= /¤§g 08ÅeJ@«…D*Ó=ŒžøķėėŻģõż‰GGG¤gf"Ņč—©vQū™Ŗ|īåå///¤¦¦bŠ AČĶĶ…——är9JKK±aĆüå/N:…O?żkÖ¬Amm- ²²µµµŠh4(--…T*…££#“Z-ŹĖĖQYY‰wß}Ļ?’<ś÷ļĖ—/#..kÖ¬»»;œįčč™Lfė.""¢BÓm,**ŹjS­VTT >>qqq­f„„„ &&+W®ló¦YģĖ€ŲŲX”¶‰„÷Ó_Ć7ß|ÓjZˆŽŽnµv‡±¤¤$ÄĘƊ¾/ …+W®l³}–…BŃbyBB‚Å"¦²Mģ}¦"»2³ć—Ÿ V«Q[S ­F @ ‰DмÜōķ×¾¾~ŠØUšõõƒ·/ņr³2W.ēB«ÕąŚÕ<‡ ‚V­nuȌV«……ł8›zž~¾šööFeiJŠ‹šmCDDÖ'‘H‰sēĪA"‘ąĢ™3?~<4 œńŽ{ļĮ×׍ƒFqq1ŠŠŠ …Ńkjj†Ćŗ!™iii€źėėįļļ¾}ū"##CŽcx ""¢¶ˆ}ū˜ĘŠYIIIĒŹ•+Ū‘““ƒŲŲX„‡‡·tčJ?żōBBB°råJ³Śe˜żŅ–ÆæžQQQ&g|Q*•ˆÅģŁ³»äZ½¼¼D? J„III9‡Ųp­Īf×ō=2C¤-³ę·‹“#~Ü_ų÷éH€ššjä_»‚ ė?‡aŒC­Va@Č ”••BÕ؈ā¢B „V«D¢Ė ‹Zf|lݲ žžžšņņ‚‹‹ ķĢIŒ Ÿdėī "źu&NœˆĻ>ū K–,AZZ|šAØÕjH„RlŻŗēϟ†Ģ€J„‚†³Ńč$śeČĶĶÅ;ļ¼ÓģœMMMP«ÕPÓ9l†ˆˆĢa* bŗ!_żu‡-999ˆŒŒDBB‚ͧó]µj•Éz+¦˜›éo²n‡±ÄÄD¬ZµŹbÅMŪjæX»;“X»v­h¶·{"» ˆōńļ¹\Ž)Ó¦ć×_~Ę=ÄĄEę7W7ōė7ŃwÜ­Ė‘H ‘ÜH’80éšńń…L*…V H¶s.õ4źź0 ?Č]ݚ­ĖĖÉB`Č`[w QÆ2dČŌ××#''MMMčÓ§4 Μ9ƒŌŌT¼ņŹ+t߬üå/i–¢Õj!•J›ej4444<<<ˆG}Z­2™ ŗ’N%I‹}‰ˆˆŚbjøŒ„%%%™ †„„„ :: …J„ńńń-¦atY+»wļ¶Ł,6~ųa«7źśŗ!PUU%d“' ŅqqqX¹r„Õk­Œ=Zt¹¹EO3d”J%‘ zŒųųx›¾ŗ‚]™ŃH„˜’>ż°ė·m€V‹Ą ` “¤P[[ƒļæYśś:H¤„„ĮÉäcdĄ­|ĮW[[ƒ“Sɐ»8ĆŻS'Ē1&'GT+KP[[cė.!"źU$ """šĖ/æ`̘1B–G}}=<==!‘HŠŠŠ€]»v Ļ 3C¼¼¼PSSƒŹŹJhµZüžūļtCf† ‚«WÆ¢°°R©UUUxļ½÷PWW™L™L©H!n"""1¦jb…‡‡[ü\¦‚!qqqČĪĪĘŗuė°fͬ[·ååå&‡i¬^½Ś&}•””$:5, «’œœŒģģlģŪ·ūöķCrr2“Z-Ś`ŠENN“Z­ «ć”ļ?k3€27 ²råJDEE ččhŃś1!!!v?Õ®!»Ģ‘H$BöĒ‚?܊ ń_āųŃƘ8y*ž°ō6ģŽ±]˜.1bādČå®$: »Ū†ąPh”ˁD‚Ö""'Žxū÷‡‡›¼Åz'Gäēå tų([w QÆ2iŅ$ģŚµ .27&Nœˆäädüķoƒ\.ĒāŋQXXˆ’üē?øļ¾ū„}ŻÜÜ0ž||ųį‡pssCxx8¼½½ŃŲŲoooÄÄÄ`Ó¦MP_Ÿŗ}Μ9pww‡T*…T*eAU""2›©Ś¦n¾;źėÆæ½yŽ‹‹3YøużśõP*•-†ō$&&"))©ĖėK˜š‰'>>¾Õųöf:ĻĖĖ Ė—/ĒčŃ£Łbū„„„.6cm!!!ˆ·ūŗ!†ģ* "•JńŸ×B£QZ œår<ü䳊j4“ „ å@«ŃB—K¢›~W"•¢¤¤żś€Ææ“ $ŅևĖ(Ėː{) €·‡ÜävõÕP–—Aįķcė.""ź5F…õė×£®®N˜:W.—ćĻžs³ā§Ć† 2HŽ{ļ=! ±téR,]ŗTØ/2oŽ’üs› ‹źJö7dęś·€©$2 ‘B"•A*“ ?„?%ŻĻß÷ķFŅž˜æųVH Ń­“š.Ø ūwooQHUŒ‹‹ ņs/ŚŗgˆˆzGGGČårøŗŗB.— Óį:;;C.—C.—ĆÅÅ®®®pss¶sqq³³3œœœąāā¹\.ģ£ßĘŁŁYx8995›n—ĆeˆˆØ;ÉĶĶ‰ÅŌšCĮĮĮˆŽŽn±ÜT!Xkłå—_D—›Źé(±k5g½­fą17“(""¢Ł™Ö‚)))ˆŒŒÄ×_m“kźJv•!č‡ĖH­Ń|Ö©ĮĄ $ø>Ąõ׳ē.‚v®öśT»ŗģ‰Dv}Ȍø%w>`ėĖ%""ōĆdœœœ„ ż’ R©Šh4Ā2żOćm ‹­īÆ_f8£ŒįƒˆˆČīīī¢ĖÅ šv”© s딄‡‡·€(•JTTTĄĖĖ« zÉtįYK3m+Ą /Ųj¬ŗŗŚŖ×ojz]sßĆ÷ß_4£ē§Ÿ~B\\œÉģ›Ń£GŪu¦ˆżeˆŠ3$-–Żxč·‘^ÜØ"‘J 2IXˆØ'ÓE źś ˆa!T±mõė ·5<†į:žæADDķeźfÓTm‘Ž»Ł`öSI-ŁĘ¶ˆu¬1Owe*Øe*@c®„K—bß¾}&3mlU@·«Ųi@¤ćō‰“õģ""""""K Š$&&šœ¦7²—:ejˆ’„‚BkÖ¬=Vbb"rssm}łVƀˆ‰>K„"""""ź"cƌ]ŽÕu:Ø{ŖØØż,„„„XtȐ©š2¦2Œģ"DDDDDD6dŖP§„ †šVan!PSCcĢ­_a­kčŹ!;¶'ŗ<&&Ę¢ē1U?޳szfQÕz¦Žõv¶ŖęNDDdiK—.EHHH‹Ϝœ¬]»kÖ¬éŌńG-ŗ<--ͬ‚™b‡³ ŖZźfZ¬ōÊŗŖ°«-¤¤¤˜ Œ™3KP{X²oOŃ#"wßs³­›@DD6tį|9†ó¶u3ˆˆČžūĆ[7Į*bbbDo|ccc‚åĖ—wųŲP(-nxćććŪ<®©įbõ&"""Z|aŃÖp‹Ÿ~śÉ¬kˆŽŽnq,„R‰øøøNŒŗ«””Ģ;Wt]ll¬ÅAÖ®SŅqČ ‘­Y³Ęd¶FLL V­ZÕ©"«bĆrMNēŖ+š9 6\#00°Å²œœ“稨Ø0;Ė”µaEö˜5śį‡bīܹ¢}ań쐤¤$ÄĒĒ·X®P(ĢžØ'b@„ˆˆˆˆˆØųüóĻMÖqˆ‹‹CHHV­ZÕj %%_ż5V­ZÕl¹©aŃŃŃ&÷õ×_‹ÖƈŠŠ½I6•I vŽÜÜ\Ü|óĶf© 6Y3#22k×®50ŖØØč3ö¤¤¤`ķŚµ4hV®\) Q(ųüóĻ-–RQQµkך|ļ,xénzä""""""{øø8“7žś!"ś …įMlUUU‹ Ćŗuė„ēĮĮĮˆmQ*•ˆŒŒDLLŒp^żyĆ»( ¼÷Ž{¢ķ‹ŽŽ½ÖŸ#""¢m5Gll,D±±±ˆ‹‹CTT”Pģ5''©©©BŽī0“&11³gĻn¶ĢÜž Į¦M›ĢŖūb,>>¾Łū©T*qźŌ©V‡4Y#„»a@„ˆˆˆˆˆØ›X¾|9BBBŻf‘˶źs$%%5ĖäX³f rrrD‡FÄĒĒ‹.7gņ†<88+W®49+Š©›~±@©ć'$$˜ĢfP*•HHH­…ѝf¤éČ4¶ŃŃшļpfˆ9ļ­”ˆˆģٳǮ Öv8dfwšhģŻłY  ¶nGwč""{2ń‹EƒˆˆČZf͚…œœœNO«*Xæ~}‡Ž«P(ŠfÖŲŲŲve0ÄĒĒ·«hē¬Y³œœlr*įöōEO /&»eĖ–. NÄĘĘöŠ``‡˜››&ŗ\ƒnķõ¹¹i&Ū`K·SÓ؈ōWb‘8j GMAś«k”ij2«ʏ¤š€Śģ\œ|šq$Žš‚ż“ē sĶ[Š444ė""[Ń,Œ—Źr0ń‹EøT–Ó”ćüWüW«·ŻųŃ]™źg""źŗŗ$Ę}ӛ0 ‚™ÜG ĒšµÆB9^XņōcČ[æī#†aōLJ|`@›ėZÓXRŠō—× ģšqøōGŲß×Ākü8«]_AĀ6„½÷78÷ļ ņŹ*¤æŪf@ÄPuśy(Ÿ@Ųūoč^gœĒ„o’™«ņĢc8¶ų.DˆØ[;”—Œ%ĆēćP^2{;]vƃćīĄĘ³[č€5³žĒpæP“ĖMÉ«øŠ7÷Œ³E™čļŃÆĶZ‰1}FąĒsŪšķ™Ķ(Ø.B“F cw|‚:Ub£Vc;÷ąę䊗¦’©ÕvNübžˆ|’9µ!ށųϲŚŻNKµŸˆˆ:oÖ¬YB ĮRB#"":T¤ÓĮĮĮBŠ¢5^^^Ź‚0ģsuōœķŻĻp[‹ez“QƒÄšż“ē)s-Į.‡Ģ˜¢Ļx0Ī|Šq™“yĆ×¼ŒŌgV7[/sqĘMÉIš›=ē×¼eö:S2cßBß[aÖ©żöŚ‹H9Ö¬vvTŻ•kp2pź”?Į}ŲŌē]k×1.½’1‚Ÿz2¹ Ą#lņÖo€ŗ¦ŖŹ*ä~ś«łi/QgéoŲ oÜėTõ8[”‰'#’ˆ³E™ØSÕ ė‚¼°ū’Ć=£—āż¶¹\ĢŚ¤°tÄģ^ž?¬œśŽų]·ż'ĒÖćÖóńķķŸąŠ£[Ķ &ˆ ™Y=ķI”Ō–ć݃Ÿ¢“®/L}¬vŹ\šŪƒß!ĢX‡ŚŁZūÅś™ˆˆˆØ§`†€²ƒGpžõæ£öb¶®¶†DŅl}ąĆ@ęꊡ‡ĄĮióĶ^gņ|ū£pėo^H¤]— _’OØkjŪµOåé4T¦Ć˜¾/, {ļoČüo ū]–H`Ģż€¬WÅ׈؇I¾vµMuX“į~įõ̠ɀECꥣĮ B£šīĮ ū˜Z.ę|Ižoļßńų;@zż’’æĪy [ŅÅĻ™»PZ[†ūĘ,Ć‘¶z,±ƒL*ĆÓcšĒ-Ļį?Ė>‚L*3«w¾R¼2晵³#ķ'"""ź pnõkū*üęÜmc#ö…M6¹­V«5{D*“ŚH„˜~\nbmņPs1KØ’Qsį\˜½’„÷?Ę gž€ŌÉIXę:(ćæłBxæy+ÜG ė’ė!"źˆĆy)xfŅĆX~'¾>µ‡óR„€Čo÷aįŁŲq)!Š@aSĖż\}Qr#ü†ĖFų ĮżcoĆŌĄ8Énü¾œ4 3‚&A£ÕāDž¬Žł×Txż÷8Ģš„׏C|ō:į<¦Ś Ņę’Õ··–j?QwĆÆōØėąäć mc#²>ü¬Åś¼õßA]S‹¼õß µEĢYēÜæ*Nžiq<ߙÓpń8Ø*«:ŌŽöĪ>Ó/z1.¾‡†‚"4įā;qčŪ­fS™|µY9øē6ŃõŖŹ*m߉ ū{»j’uµĆyɘ40=h"ē% ėr”yøł?wā‡Ōüł¦ēŚ\žŌÄåxź—WšĶ®ņ’¢žĒęōķ˜’Ķ½Ķ†ŗčŸO’÷­xs’ĒxŽ`؋)bCfŽ9ų B½ƒ±nįZ„zćŸ“ŁN1ķmgGŚODDDŠ?]µ P*‡¼½ÅėääÜX/‘ƒńń;§žX‘‘ŗcI$Ą²e@JŠųö=¤k§X»–-Ó­)Źj/˜!`Ų’{gžX ­J…ĮĻ?Żb½V„Āļ7Į}ÄpŒžč³× yyN.ŖŹŖfõ@†Ē¾‚Œ5oāąŒhŖØ`~½eņɁ—¶=śGŌåęįšĶŗ Hß% ųŠżfķ{齏1č¹'!qhžQŃP¤ĪĪp>Ć’śō]¼Ąāļ ‘„l¹ē+įłŸfÆWLy+¦<ŚbSĖo>·o>Lr g|øčõŪ¶·¾†©ķ’߬E«_Ÿó’Yķ;V{ŪÉś DDD¤2,[¦{xx4ß&'żž.&P(tŪ>ōpś4°n]ūĪłį‡ŗż££%KtĒ×-Ū½0. »|¹.葓œ<©;?¬] $$±±7–Ł!» ˆģŻ®‚¤ż—Ż‚žĖn^Ę4 ^õ' ^õ'Ń}[[×oébō[ŗøÅrGoŒłųŻ]Ū„÷>FčźgŪµŌÉ #ßY‹‘ļ¬5¹©žŠųį«vmÆ×Ž,""""""»sź”.  „„“\’ŠCŗŸ†ĮŠ5ktAŠø8`Å ńżLY³¦eeÜ8]¦Ź?ž¬_ß|]T”.č« ‚¬[§Ė&‰ÕµĒB³uWv7dF?cŒ½Šųį+xOdėf“ÉŽß"²==3¢§““ˆˆØWR*uA± FNŽ.s#&¦eęƊŗŸ_ݾó‰es¬\©ū™ ¾Ļš5ŗóĒÅé‚!«WėŽółē¶ī=«³Ė Kjķ¦ž7üDDDDDDŌŖčhńåś!5J„.;ĆPNĪm:’„‘ rcX¤µZ Ÿ®«;2wī ŽqĘ1 BDDDDDDŌÕrsu?;Z@ULJ pĒŗ€JT”īˆM5”ĖT‰×e³č³Jģ"DDDDDDD¶²oߍĄEg(•ŗ HNnžįŪś¾))ŗ`ˆB” ¦¬]k÷õC;¬!BDDDDDDŌķ͚„ūłÓO–9^|¼.(²reū‡»<ń„.²{·.C$6ÖōT½vÄ®2D¾Ž’ĖcnAqq9~Ż~>>^GGLœ&¼6åä‰L\»V šGųųį­.7åȑT”+ oLŸ>ŁYWqī\¶°Muu-ƌŠQ££ŗŗ‰‰)šōtĆM7Md]ŗ"ŗżČ‘ƒpčąiŌÕ7\]]0mŚŲV’ŪÆ‡óęOĮįCgZģ+‘HpģhŠ‹•Šh4 ˆ°Qƒ;ŌW¦čŪ°`įT=šÖ¢$‰É}Åś§½mŠh“¢ż¦ÕBtykķiļµ·÷sej¹©~0ģ[}»wüvNNŽ˜='DDDDDŌ EEé‚ńńŗlŒĪNo[Q”ūi\+$.®õżÖ®m>³Ģŗuŗ©‚ŸxB—ibĒģ* bČßß‹ž0 PZ¢Ä®G±4: ..N¢Ū•”ØØ ‹o™@wCYTT@+ŗ¼OoŃć”B­Öą–%3;wĮµk%:ƒCššTŲµó† œM˰aĮ(((Žcjū+W ”R©1oŽdĄŽ=Ēqõj±ÉķU*5*«jp×]ópłrč¾UUµX|Ė ØÕüüSö——{»śŹTŸ¶ĮT’ų›|/Åś§½m0ÕoFtłĄ},rķķż\µöyėþÕĖĢČm5 CDDDDDŻÄŗuŗ©w ŅEĀĆuĖsrtEQ§ŠmĶņåŗ F|¼nŖŻ )IQ(ċŖŠM±­{$$ŲżŠ» ˆņõS (ø?rsó1th¾łĻ6,¹„Ł6×®#8¤æš:8¤æī[z­Vt¹——Są “”I„†§§¦M‹~ż|ŃÆŸÆ°}cC\]›ėų±³> ŽŽŗīŸŽ¢ż`Ü·ÕÕuøpį2&O“ŌKÖügEDDDDD£ V¬Z„{jļ°—`żzŻqzčƲ-[tÄD]PDŸ‰¢Tź °-§Ų]æ^·}l,pĖ-v;ćLƈ€‡‡+jŖė •JZC ¾”±YF„““#”Ź*]īģģ„ ¦ ˶$¢ŗŗīī®tC4ŽIÅĄĄ¾šöö¶«¬¬AUU-Ä3Œoļįé OO7ģŪ{ąéåww¹Éķ#"GāŹ•"Ģž F#ŗÆ··.]¼‚Q£C«Õ¢ØØĪ.Nør„åe•XøhZ³6åęę‹öÉ„KW “J1÷z¶ÅĮƒ§‘“s­YōŒūēāÅ<Ń}CBˆö‹©÷ĖT‚‚ś™ģ7±åR©Tōż5uŽöö•©ĻUkĖÅ÷ķĮ§0}ś8h“Z³>_DDDDDd%ęžM®ĻČHIŖ®’ķßZ‘Õ֎£{$&7bĒS(€ģlńć(@y¹Ķŗ®«ōš€Hee |}M×qqqFCC“šŗ””..Īן·\^S]‡C‡NĆŁŁ øžY R©õõHܗŒaƂ„a,zgÓ.aųš`³Ūm¼}FF.ÜŻ]1+J÷ĮNINGfF.F† jóų­ķ›—WˆķŪ@ę ƒ£“\]]P^V _?…Ł}U”¬F~~ vļ:zcc‘«bżcī¾mƒ©k×¢Ėƒ‚ś‰¾æ¦ĪŪŽ¾2õ¹jmy[ŅR/"``xūx¢““¬}ˆˆˆˆˆØ›°d†%f­ézÅ,3eeøœ›ƒ”Ęü‘}Ux“} ū˜\žy>żūūį¦Y0iŅhH$hµ€Z­Ę®G0qŅØĮ@—100°ÆŁm7Ž^«Ń4ūö_«ÕB£Ń˜u|SūÖÕ5 (Øž°xęĶ› U“ ö…·'Š ĖĢī+…Ā}śxcī¼ÉĀ#dPó Sżcξiƒ©k7µÜŌūkź¼ķķ«ö.7G}}#ņóK°sē>|łł%8w6ĖģĻQob·"ÅÅeųeė~hµZH$Ģ7ĪĪNŠh“¢5Düż½1`€?~łe?$ (؟šæŲrV‹ƒN£ØøĪNN48ĒŽ¦!(Ø*+kpųŠįŲaaƒ08t Ōj Ōj dĀ:FƒķŪ¢””õõųeė~Lž<ž}¼E·>"ū÷ŸŌe@H$I„Ā,$bŪ2µÆDdfäąĢé J%5:..N8°ŠŠŹ°}ūAŻ1µĄČ°A ģ+Ś'>¾^((,Å®G “éŚ0uŚŲfķ9ŸyŁD’ˆīėģģh²ŚÓ†ÖśMlyyy„čū»`įT“Ÿ“öō•©Ļ•ÉĻ›‰Ļ‰ĀŪCčĒȉaĀóŅŅ œ9}”ĶŁ‚ˆˆˆˆˆˆz«ŽLE!1xŗ ŠžįĄ€ 9Wnןė_»l£ßŽY«Õ¾dĪÉųįÜ}ĻͶī7""²” ēĖ1t˜wēDDD=Ī؃Ūn» €.»×V¤¶‚Ų²Ļ?z+_|MMŠØ5ŠhŌ7²‡Æ?×hŌ××éžkµZü÷ūļ±ņå’³uõx‰$@=€†ėżóŚėĻ«Ō]­®ß®€Źąč .čfėCfˆˆˆˆˆˆˆˆ 1 BDDDDDDD½"DDDDDDDŌė0 BDDDDDDD½"DDDDDDDŌė0 BDDDDDDD½Žƒ­ŠųŪŗ DDdSåü怈ˆˆˆ:…"DDDDDDDŌė0 BDDDDDDD½"DDDDDDDŌė0 BDDDDDDD½ŽŻDv÷Å®ą¾Ż¢ ¶nGwč"¢Ž"ņ‹H[7ˆˆˆˆŚĮī"0/·Pt¹žŻŚ7źór M¶Į–ngG4†ūļ_›…Ž}£†ą÷ÉįČXóhšõ‘­čƒ†AŠČ/"[8ё‹©ĄFŚóĻĀ/jĘ~ś/hÕjä|ś\Z÷.†¾ņš­/—ˆČ¤äĒ“mŻ„f2pßŲū‘`ė¦õ:v™!Ņ^śģ‡Ż”8ŗx”Éǚ­»ų÷7±wä [¶uWņĢZךʒbœzäAģ Åįy7”ādŠ­» ŻŖ3Ī!ų±§ąąīG/=³EæžbėfuHä‘ųņė˜łÕLüqĖ—+.ćÉ_žÄĢÆfā®w!µ(šć¹±ģ‡e˜śÆ©-2M~Hūs¾žƒłßĢĒö ŪŪ<Ɨ‹֟\oļfm‰ü"“’5l~§ N·ŚNĆ,f‚™ÆWDōŁĘYś!.7gębŲš×‘śĢĶÖK]\0+9 ~³oFęš?›½Ī”ĢŲæ ß­Ė0ėT:†½¶ē^~ެvŚBŅ„QŲ3,nšŒ ožźš€GŲh\^’%T5ÕPUV ÷ó¢žź[7—ˆĄLćŒÖ†Ģø:øbǃ;0Ņ$`mŅZDˆĘžå{°jź*üķ÷æžqģøuÄ­ųööoqųŃĆĶĪ!“Źšėżæ"6*żøĶvŽv'>Kž wŽŗ³YŪ“OĘ”‡į…i/ąÕ=ƶŚNĆk5¾^Sż@DDDD2(;ø™Æ’?Ō^¼MS ‘4[ōšc¹¹!čįĒp`Z¤ŁėL)ݟ„‚­?x ‘vĻø”> £U5”īņed’ó#¤­zć¾XQļ}ˆŒ’÷*r>łRWWÅ< Čd¶n2Q«Z Ü=śn8Hšź ]ā|Éy¼¶÷Ę0@©D÷»śõ9ÆcsśflĶ܊’ŚÜ?ę~<© ¤ß6ā6Ȥ2L œ†āŚā6Ū³`Č,²šē=ŗ zBFāOÅ£ ŗ* HZm'u "Ī®~Ćc߀ߜyŠ46`_XØÉmµZ­Łė$R) Õ¶°@*ŜōlČ\]m}éf‘88Āup(†żßZ!čć:h0&|ó_a›üĶį1b¤­›JDŌaŅę’%ŽšĘ>€©Sį$s–ĻšA3 Ńjp"’^Ųł‚‘I;Ž;‡7o~ż#püŚq¬üme«ķgg\«ŗ†lŻDDDD=F÷LMčbźśz8łųBÓŲ€ģ?h±>ożæ”®©AŽśC9ÉģuĪżˆÖń… ļ¼UeE‡ŚkYrZ=¦V‹†‚|d­{ŠISš­RUV pūVœ’Ū?ž'‹·‹ˆČVÖD­Įé?bŽ7óš ±Ń?Ÿöļixs’›xaź =ļĒżŁó,ܰYåYfķsļč{qϦ{XC„ˆˆˆØ˜!`ų’{§ŸxZ• ”ĻæŲb½FՄ¤ˆQp†1}jöŗ”/’'–ßUeE³z #bß@ƚWq`Ę$4U(˜_/D™|¬Eą„-†ĮżssΧßV"•¹o?ų;£×ż£Ł:©³3܇Äˆæ¾…¾‹oµü›CDd!­ —[7Šs >Zō‘ŁĒ1UæĆÜsź_?<ža<<žaałĒż±Ķc>3é<3é™.éG""""{a—‘]Į}ŪU“’²;ŠŁĀėĄ˜G›­]õ"BW½(ŗokėś-½ ż–ŽÖb¹£Ę|üy‡®ķŅ{o#tõ+ķŚĒœ¾Ū¦µżŚ:¦5²XˆˆˆˆˆģĶ?ü€ŹŹJŃužžžøēž{,v®/¾ų...ųć’ŲłƒŁ» ˆt‡™Y¬)ā‡Ķ¶n‚Yģż} """"²„įƇ£®®pīÜ9h4Œ92™ r¹ÜÖĶ#²kv±“ĪdIµfüųńĀóóēĻ£±±'N„‹‹‹­›Fd÷!"""""źĘpāÄ äę梶¶®®®@dd¤EbĪ6Ęņņņ’’‚ņņrhµZųųų 22“õ%u Ī2CDDDDDŌMi4lŻŗ©©©0`nŗé&!==æžś+4YŪkllĎ; V«…ØØ(hµZ$%%”±±Ń֗MŌ%˜!BDDDDDŌM]½zeeečÓ§nŗé&Ą!CPZZŠüü|@­V·¹Ķ€šW„RA«Õ¢®®UUUčÓ§–,YŽ"RļaWŸöųųxÄÄÄ øøŪ·o‡ĄŃŃ“&M^›rāÄ \»v  Œē3µÜ”#GŽ øøąķķéÓ§#++ ēĪ¶©®®ĘŲ±c1jŌ(TWW#11žžłšu€IDATžĀ/°K—.‰n?räH*++”ÕjŪÜĘ8 āźźŠŁ³gćĉ8rä@&“aųšį˜6m¤R& ūgWCžžžųĆž())ĮĪ;m²8QQQŠŠŠpĖ-·ŠŻP ėŒ—÷éÓGō8śķ’%K;wīĵk×ŠŠŠP@SSvī܉aƆŅŅŅ0lŲ0Ē1µż•+W R©0oŽ<Ąž={põźU“Ū«T*TUUį®»īĀåĖ—E÷Õh4ØŖŖĀ-·ÜµZŸ~ś „——W»śŹTŸ¶ĮT’˜|/Åś§½m0ÕoFt¹©q“ķ=o{?W­}ŽÄśĮ°oõ222Z čQĻįīīP*•Ķ–———ÜÜ܄eęlchȐ!2dźėėQ\\ŒÓ§Oćܹs0`lėK'²:» ˆņóóCpp0rss1tčPüē?’ALLL³m®^½ŠįuHH®]»­V+ŗÜĖĖ ‰‰‰ÉdP©TšōōÄ“iÓŠÆ_?ōė×OŲ¾””®®®ĶĪuģŲ1„‡‡ĆŃŃ0eŹäåå™læįöžžžØŖŖB]]$ jjjąééirūƇ£¶¶{÷īń D÷ĶĪĪF’žżč¢ĀD~~>¼¼¼pāÄ ĀĮĮcĒŽEAAhŸųūū抔CØ­­ ‹:OŸ>ĒŚ0{ölŃžŃjµ¢ūšźSļ—©6˜ź7}0ČxyCCƒčūkź¼}śōiW_™ś\™ZާOŃ~0īŪźźj\øpS¦LAjjŖž5QW €ŠŠŠ°’~ōļß×®]Caa!|||„/ĶŁĘP~~>vļŽžżū _Ō:99@‹ū"{Õ+"ąįįźźjH„ŅĮ@wcn˜įää$DXŖ;;;cĮ‚Āņ-[¶ ŗŗZˆąj49ršöö¶«¬¬DUUU«†Œ·÷ōō„§§'öīŻ+“MN±ķ###qåŹĢ™3Ft_ooo\¼x£F‚V«EQQ\\\påŹ”••aŃ¢EĶŚ”››+Ś'—.]‚T*²-<ˆœœœfmŠ3īŸ‹/Šīk0ēż2Ն   “ż&¶\*•оæ¦ĪŪŽ¾2õ¹jm¹ć¾=pą¦OŸ.¤MQĻ&•J±dɤ¤¤ąņåĖ8ž<ÜÜÜ0fĢL˜0AŚbĪ6†ś÷ļqćĘ!##»wļ ū;4**ŖŁ˜Dö¬×D*++įėėkr½‹‹ „× Āš±åÕÕÕ8tčœ…Ģ•JØÆÆĒ¾}ū0lŲ0a‹^ZZ†nv»·ĻČȀ»»;¢¢¢ÉÉÉČČČ@XXX›Ēomß¼¼vī܉Ƈ#??gĻž5ū³FDDDDDŌ›Ųm†Hqq1¶nŻ ­V ‰D‚yóęĮŁŁF“†ˆææ? €_~ł$|ć/¶\«ÕāĄ(..†““Œ£G"((•••8tčpģ°°0„††B­VC­V7›ŹJ£Ń`Ū¶mhhh@}}=¶nŻŠÉ“'£OŸ>¢Ū1ū÷ļĒ®]» ‘H •J…YHĶ7dj_‰D‚ŒŒ œ>}R©£G†‹‹ ˆ¢¢"lß¾Šjµ C`` hŸųśś¢°°;wī„L&L›6­Y{233MöŲ¾ĪĪĪ&ū§=mh­ßĖ———‹¾æ .4ł9iO_™ś\™Znźsb8kāĉĀóŅŅRœ>}ŗĶŁ‚ˆˆˆˆˆˆz«ŽLE!1xŗ ŠžįĄ€ 9Wnןė_»l£ßŽY«Õ¾dĪÉųįÜsĻ=¶ī7""²”óēĻ ąˆˆØwłį‡pŪm·h9ÄZlȵزĻ?z+_|MMŠØ5ŠhŌŗĢaĶēśś:Żs­V‹’~’=V¾ü¶ī¢O"‘ÄØŠpż”^{ży5€ŗėÆõĻõŪ5P<@kš0[Æ2CDDDDDDDdˆ"""""""źu!""""""¢^‡"""""";sčŠ!<śč£˜9s&¢¢¢šä“OāŲ±cV=gii)"##Q[[kėĖ'2 "DDDDDDvä·ß~Ć+Ƽ‚eĖ–aēĪųķ·ß°dɬ^½{÷īµŚy½½½±cĒČår[w‘YģvŚ]"""""¢Ž¦©© |šž|ņI,^¼XX¾xńb(•JüżļGTT¤RĖ7.•Jįėėkė. 2[ ˆhQlė&‘ń’""¢–ŅŅŅP^^ŽeĖ–µX·lŁ2ÄÅÅ!-- k×®Åc=†… bēĪųņĖ/±qćF$''ćĆ?Dmm-ÜÜÜšüóĻ#<<ēĪĆźÕ«1oŽ<¤¦¦¢¢¢¢ÅžŸ}ö,X€ß’®®®&µxńb¼żöŪ3f NŸ>Gy_}õʎ‹³gĻbõźÕųõ×_mŻ•Ō pČ ‘ČĻĻ‡ÆÆÆč°WWWųśś¢  ‘‘‘8wī 55'N„R©Ä /¼€gŸ}?žų#žyę¼šĀ Ø««ƒ““*++”P(šį‡ŠīoصcEFFāĢ™3€'N`ōčŃ8uźąōéÓ-ŽEd- ˆŁ h4“ė5 $ """žž@И4iŽ;†¾}ūbҤI€I“&ĮŪŪÉÉɐH$ØÆÆĒwŽ Ńż µv¬‰'āōéӀ“'OāŽ{ļÅɓ'§NĀäɓmŻŌK0 BDDDDDd'PVV†źźźėjkkQVV†€€DFF"33 øpį"""PZZŠ+W®`ɒ%Ā£””555GGGø»»€čž†Z;Ö¤I“šš FƒœœĢ;—.]‚V«Å™3gZWˆ¬„GÖ!"""""¢–Fމ>}ś`Ó¦Mˆ‰‰i¶īĒĀ0räHH$ōķŪæżöBCCįįį___„„„ą»ļ¾kqÜK—.A"‘Æ}||Zģ_ZZ*¬oķX —Ė‘˜˜ˆŠŠPČd2ā÷߇‡‡üżżmŻŌKŲ]†ČīąŃŲ<ŗ[“ĮÖķč}@DŌÓMüb‘­›@DDd6©TŠW^y_}õ~žłgŌÕÕ”¾¾Ū¶mĆæ’żo¼ņŹ+B`#22 BFĘäɓqķŚ5œ8qpõźUÜyēØØØ=—ńž†Ś:Vdd$¾żö[Œ?0nÜ8lŲ°Ł!Ō„ģ. ssÓD—ėoŠ­}£>77ĶdĢaévhŚØØĶĪÅÉGāØ)Ų?y2×¼MCC›ėō}@Dd+ś †a0cā‹0ń‹E˜öÆ%øwÓS8zå„YĒ:žøuŖÜOüb¾=³°įĢ ¼ˆ]/õ^7Żt>ųąlß¾‹-ĀĀ… ±mŪ6¬[·Ó¦M¶‹ŒŒlVÕĖĖ ļ½÷Ö­[‡ččh¬X±=ō¼¼¼DĻc¼æ”¶Ž5iŅ$œ>}įįįt‘“'O²~u)™é%: 8ūüŸį5c>żZµ¹ŸžYėž‰!ƬjuQwuü’³wēqUÕłćĒ_÷^ö}APQDĄQq·p׏I³¦sZ§šoSfĖ4™-N9Ī”Ķo¦²¦}±š)ĶÜ0Ķ1qGEAVYdæpļ9æ?š^Aī…‹K(¼ŸĒ}xĪē|>Ÿó>Ÿsļ‡Ļēs\‡A1°ćĢmżkūy›Ę³*u=wõ»U©Śŗi„¢CŪ·{§Õc½"¢Ś:¼ĖCLLL³ynŗé&’““›”ūģ³Ļšä #11±Łņ¾¾¾ö­ÕpóĶ77Ź;tčŠ&±q­I‡GbhģtøEō¦÷¢ēšŠh>ÖķŃČśčsÜ"‰žēœƒƒZ<֜ŚsE{f!Å»öąHä’ExģßÖĶŠDEjƒ¾ųKż+»ŗ=öæLMĻg’Ōģ1!„øŽ©ŖźÅż!Ė'óPĢ=|zą[ŗywåÓŪŽ6§CćQ"éŧymŪ2RĻ¤N1˜e?Ėāķ’äHĮqŻ;ó˜'čėŃlžN|“’k¼<9MV£sź“:złtg~Ü#ōˆä’¢ŚPĶKcē³šē„ø:ø°`ÄŚŗ)…¢]qÓT«Ē Īžnėš„×H»œ2ci”Ä„£%LS\ĘßGļ…Ļpų±łŽėœ¼•NćF‘¶šÆ6³ęųK„óŒÉŒ9°šžęŲ3/Łē•Ų6h4›Ć³sōdN,ž;ĘŹŖĖøGFõŃē++1”•“łŽĒԜĶmń˜B“5S'Å„Ó]†,ŸĢčoćŻäĻųĖŲĘøĪvN¬æēK"żĀ›ŌÓŠĖ[ßdRÆql¹ļ»FĒmż·DLä§ß}ĆĆąµmĖZŒóöČi¼—ü)·GMktĪ=®cē¼U<÷ĻoŖ’Ł2?īaĪU•š·ļPT]ĀSĆjńz…BŲ¦ŗ¢”ʲb*JĻQVœOé¹\Š ²9—{¦­CB\C2B(Ž™DŚ+KØ:™RW VOč:ļnt®.tw7;ć&Ų|Ģźł¶ļ"õzą4ŚkŪ/eźXQ ŖĻdsśßpäOĻŃoyó’Y\ś*Ē_|ŒՏé:÷· Ó¶xL!®WĶuÜ=;­ĻŽ|¬Ł:ŅKN3£÷DtöŅÓĪā/›—š– ½äg‰%{ŽebϱüyÓė¬L]Ļ'¾!Æ¢ƒb@C}=:­ŽG‡ĢåŽļ’ȧ·½N«kėęBˆv£=N™B“L:D€£ó_ ü„ēč4~4jm-?GZ_ČGUU›i“ZPÕ&,hµŒ;¶Ē<Żä×¢±³Ć„G7zżeM7.ŻCųŁró~īw«q‹oń˜B܈쓶żH óīĘĒ7p[Ÿ)Ų7(Ń©'æķ7“į]ć søģ8–%}Ąā›žeP`?öäąOė 7Ōņʶ·Ė+ŪŽāć[ß¼¢ó!„øH¦ĢŃ1ÉÆōcoŌŚZN-{·Éń¬¾ÄXYEÖG_š×±å˜c`ē÷jRŸļØ8N¾ń†²ņˊ÷²ß>£Ŗčó 8õęæšŠds†²r Ö&pāÕ%„>8×ęcBq#3½•ęŅķĘ<ĮŚ›żįmŽźņāŲ'łīŲZ&|vg£ü­uO’Ūłó¦×™üł]œ*É4§æ±ó_„y‡ņę¤E„y‡ņʎµu !D»!Sf„č˜d„žā3zč TƒO>Śäøj0°mšhÜ"zżö6ėłĢ’±’wc(+o“Hļ—ž%uįbvŽœHŻł2ĄöõBJ“÷7éxi‰yŃX­‡Ī~t7šØ7[^ļÄTNėčˆ[ļžō~łĻtž:±ÅcBq=jnŗŒ„cÖņ÷ņéĪĒ·¾Õ$=Ų#e“_¹ģxLūóĪaŽĄ9ęō{ūĻąÅ1×!„Bˆö£ŗ¢EQPE1¢˜ž4*mšā’5DZp%£$„B!„¢-lٲ…{ļ½—#F0vģX|šAvģŲqÅõ.^¼˜ &PXXHLL UUUmr}EEEmz~Ń>H‡ˆB!„B“#6l`įĀ…üīwæcĖ–-¬]»–™3gņ׿ž•ŒŒŒĖ®WQV­ZÅ»ļ¾‹ÆÆ/6lĄŁł×{sękÆ½ĘŽ½{šööžÕĻ/ڟv7eF!„B!:*£ŃČ?žńyänŗé&ģķķ™4i“&Mŗ¢ŗõz=F£OOO“Z-¾¾¾æźµ„§§›·Ūāü¢ż‘"B!„BŃN;vŒ¢¢"¦M›Öl¾]»vq×]w1sęLę̙ömŪ8sę ćʍc͚5̚5‹ųųx–/_ĄsĻ=Ąƒ>ŲdŹĢŠ+˜6mwŽy'?üšcƌįŌ©S¤„„g>ÆŃh$&&†œœŽ=Ź”)SxóĶ7™7o Ü~ūķLŸ>9sę°oß>–.]Ź‘#GX“hĻ?’|“)3—s=B“«"Ÿ|ü#æ›;ĀĀ֭݉'ööv ‰4ļ[³ßqrr  ņcĄĄŽĶ¦[“”t˜s…„xy»3bD2NåčыĆÓ**ŖčŪÆQQ=ØØØbĖ–½xxø2zō N„g[Ģß§Oww¤ŗF€‹‹qqżš­żŗDā' cWā”&e5 æģN”°°~1©°°`"£z\V[YcŠaā¤įģŽŅ¤}4Õ²–ڧµ1(Šj±ŻT‹éĶÅÓŚkoķse-ŻZ;4l[SÜÖļĀĮĮžqćcB!„G^^ø¹¹YĶS\\Ģ‚ X¶lƒ āŠ”C<ņČ#¬Zµ ;;;*++ÉĻĻēŪoæåčŃ£Ģ;—9sę°xńbFݤCįģŁ³¼łę›|ńÅōģŁ“eĖ–Q]]VŪüļß(++ĆĖĖĖ\ęõ×_ēķ·ß&::šo¾ł†—_~™•+W2ž|Xøp!ƒ¦ØØčŠÆĒĆĆ£­o—hcķŖC¤!??&O©ļ‰,:WŹĘ„ŻÜrėXœœ,ę/((¦  ˜©ÓFõ_( JÕbŗææ·ÅzņņŠ0¦M@BB99ēčL°`źź lLH"<<€#)§%/kł³³ó1ŒÄĒ`ó¦=œ=[h5æĮ`¤¬¼’ٳć9s&ĻbYEQ(/Æbź“‘ ?¬ŚJP°?žž–’µÖVÖŚ¤a ÖŚ'(ČĻź½“Ō>­ĮZ»)Šb1=8Ų’Ŗ\{kŸ«ęž7KķŠ°mMާf6Ū”#„B!Ś/N‡¢4’vœ={öĄ AõædėׯAAA$''ÓÆ_?EaęĢ™DFF¢Õj)(( K—.ė;pąaaaōģŁ€;3Ļ>ū¬ÅX5 555̚5Ė܁³yófóń!C†°dÉEi¶sårÆG:DD»ķiČ·“!”dfęŅ«WŸ}ŗ†ßĶm<„,ēl!”ŻĶū”ŻėKÆŖÓ==]ٲe/v:u#®ÄÅõ# Ą—€€‹sŁjõuøø86:מ_ŽŠ@8ööõĶ?tX4YYłVćo˜ßÓƍņņJŖ«õh4PYY‡‡«ÕüI»S]„ēēĶÉ ŌŪbٌŒ; Ói ö'/·OO7öķK„ æ]ż?¬żśõ"?ÆČb›ųły‘˜xˆźŖœ]œ1¢?É{Žšc;n°ÅöQUÕbYkķcķ~Y‹ĮZ»©Šj1]ÆÆµx­×ßß»Umeķ¹²–īļļm±.mۊŠjNœ8ĆŠaѤNG!„Bt,]ŗt”¢¢‚āāb|||,ę)**ĀŪ»ń/ō¼¼¼(..6ļ»»»›·µZm³,„„„xyy™÷;uźds¼öööęĪEQxēwŲ¾};ŌÖÖ Ŗj³u\ķėG‡čpww”²¢­VÓ¤3 F_ŪhD„ƒƒ=„„åÓ˜8qø9}å÷[ØØØĀĶĶ؟¢±;é0Į];ćķ}±ē±¬¬’ņņ*‚‚,@øŌ„łŻ=\ššpåēĶ{šštĆĶĶŁjžĮ1}ČĪ.`ÜųE±XÖŪŪō“ŁDEõ@UU Jptr ;»€’ā2&MŽkSff®Å6IOĻF§Õró…Ń;wäōéœF1˜\Ś>'OfY,Ū­›å^hk÷ĖZ !!VŪĶRŗV«µx­·µmeķ¹j.Ż’KŪvēŽŒŃ„…B!„¢} Ēßߟoæż–‡zČb___JJJ„•””“Ŗ#£!www***Ģū¹¹¹ęķK;ŹŹŹ•m8²yóęͬY³†/æü///ŅŅŅøė®»Z<’Õ¾Ńqt˜‘²²J|}­Æ!āääˆ^_gŽ×ėkqrr¼°Ż4½²¢šÄă8::Ą…‘ƒ€ššZ¶üœLxxˆy‹É‘”tz÷µ9īKó§¦fāęę˜±ƒŲ›|Œć©™ō‰ģŽbżĶ•ĶŹŹgķščģtŲ;ŲįāāDIq¾¼ln«ó„äęžć§»/f¶š½ÜRūŲZörc°vķ*XL °x­·µmeķ¹j.½%)‡Oģ·EEēm*#„B!ŚFƓO>ɋ/¾ˆææ?“&M¢²²’}ūöńŋĖkÆ½Ę0`ū÷ļ'??Ÿ!C†P]]ŻźsFGG³xńb²²²čڵ+«V­2wtųłł”( Ē§wļŽ|÷ŻwV§æ”••įīīŽ‡‡555¬X±€ŖŖ*ÜŻŻ±··ēüł¦’ϽŚ×#:ŽŃ!R\|ž3™¹ a5OPÉ{Žѧ§3rˆBQU‹éĒÓ2 ģDtߞŌŌŌ’U€ŖÖƚ¼1!‰øż-vĄdfę2$6ŹęŲ/ĶÆ*J£ßž«ŖŚØĒµ¹ś­•­®Ö@׿Q…õė ī̹s„=rŹę¶*-­ ¦Fψ‘寫3˜·­µ——»Å²­½_Öb8’’nµŻ,„[»æÖĪ[]SŪŖ¶²ö\YK·EMM-Å%eäęž£¶¶Ž²ó•=rŖÅr…B!DūróĶ7ćģģĢžóžž÷æcggGDDóēĻ'22€7Žxƒ%K–PSSƒ³³3K–,ĮŪŪū²:zōčĮ¼yóxąšóóćž{īA£Ń ŃhšōōäžūļēńĒĒÓӓ¹sēāäädqŹJ||<ėׯgŚ“i°`ĮŅÓÓyä‘GųüóĻ™>}:‹-āĖ/æä7Ž0—óöö¾Ŗ×#:ŽĖYyQÓąõ*¦ą8Ī€ ązaŪ“ļŌ )æ£ŖŖ l9łŠ+øcĪMYzˌŖŖh4† ļK§N^(Šjq €ƒŅČŹĪGƒ†śöėi5½°°„;āį銣ƒZ–²ó„„°o_j£i‘‘ŻéŒŃØ°ā« üöīÉęcŠ¢°vĶNōśZjjź§c Ÿæ·Åüƒ‘ķŪ÷c4A£A§Õ2jō@ģģtó×ÕXµr+·ĻŗÉjY~ޜŒ^_‡V«!2Ŗ””õėXģŪ—J^^vv:P”Odwŗvķl±MLė€TUV£Óé×;;9†cG3,¶O÷AĖ::Ś[mŸÖÄ`oogńŚ‹é%%eļļÄIĆ­>'­i«Ö>o֞/owsŪ6TTtžCOČ[fD»u"­„^įŽW^‘BˆĪ×+6™ȼtm KkMXJ{ļķ„<ńō³ŌÕÕ¢ň¢(õæ@¼°­(Ę Ēź·UUå믾ā‰gžŅÖMpŻ«ŖŖbōčŃlÜø±ÉŚBh4š·€@įcŚ®ŗ°]T_Ų7m›ņÕ†؟_`śŲĒåÄĪuŚ!"„¢c!„čø¤CäśS]]Ķ£>ʳĻ>Kxx8_ż5_ż5ß}÷][‡&®S×K‡H‡˜2#„B!„āŚpvvę–[nį駟Ęh4āėėĖāŋŪ:,!Z$"B!„B!®Č-·ÜĀ-·ÜŅÖaŃ*Ś+ÆB!„B!„āĘ""B!„B!„čp¤CD!„B!„Žtˆ!„B!„¢Ć¹!UÕą×Ö!!„hS%ņ³@!„B\‘²CD!„B!„e±±±čt:4 NNNÄÄİ`Į:uźtŁõ1qāD¶mŪFuuµyŪÅÅ„­/YˆĖ"Sf„B!„¢yēwHLL$11‘•+W¢( /½ōŅU«ßŪŪ› 6ąģģ|Eõ¼öŚkģŻ»·[KtTŅ!"„B!„ķ˜‡‡óęĶcĻž=ŌÕÕ]•:µZ-¾¾¾ęQ(—+==½­›Gt`Ņ!"„B!„휩#D«­’ ˜œœĢ=÷ÜĆo~óī½÷^8Ą©S§;v,_}õ3gĪdņäÉ|ńÅMź+**"&&†ŖŖ*Nž<ÉĆ?ĢŌ©S™>}:’ž÷æQ€„„næżv¦OŸĪœ9sŲ·oK—.åȑ#,Z“ˆēŸ€]»vq×]w1sęLę̙ömŪ8zō(S¦LįĶ7ßd޼ymݜ¢hw"C;³1“s«Ėˆ_ĻåÜ#!„h+1ĖcŚ:!„⊜;wŽ÷Ž{1cĘ Óé(--å©§žāńĒē’ū=öO=õÕÕÕhµZ*++©­­å»ļ¾ć­·ŽbٲedeeY­_Æ×óĒ?ž‘[o½•5kÖšå—_²cĒ~üńGŖ««yżõ×yé„—X½z53gĪäå—_`žüłxzz²pįB/^Lqq1 ,`žüł|÷Żw<’üó<÷Üsœ;wŹŹŹšņņbٲemݤ¢hw"ń™łÓM_Āoä/ćWū”ŚZŽ>ū?GõäēØž{n>Š ĆčL ?[DP•qŠ}÷ÜĮĻQ=Ł6t© ’Œ¢×›ĖZ»?Bqµ˜:1vfÄ,!fy Ć?Μ’Īawön›źJ~0łšÅųÅ”śßø}~čó+źx±t½B!:¶G}”Q£F1bÄ&MšD@@/¾ų"æüņ ;w&66Ø_„ÕŪŪ›ä䶟yŖŖrĖ-·Š»wozōčĮĮƒ­žėĄ(ŠĀ¤I“pwwēĖ/ædƌ8;;³yóf¢££2dŁŁŁęŃ# ķŁ³‡€€ @æ~ż "99FCMM ³fĶĀŻŻ½­›W“ņ–™īĢļRyšį?ÕEKyāQ²>zŸŠ’Šl¹K;5żį<śõÆÆćÉĒé4v<żŽłÕhäō;’ō7’FÆg_hėĖBtpÉ&cP ģ8³ƒE[±ö·kŪ4ž•©+¹«ß]¬L]ŁÖM#„¢ł×æžÅ€Ø««ćöŪo§oß¾ø¹¹õÓ]²³³™>}z£2•••ęmOOO󶇇eeeVĻUXXˆ———ÅcŠ¢šĪ;ļ°}ūvØ­­ź;].UTT„··w£4///Š‹‹°··7_ƒWC»!r9N¼ń›#ŗńĖ­SØ>“iN7~ų),ˆŻSć)Mž„ѱ¬OžĆ–ž½Ł6¤Ö]Ór×BīŹ’Ń빿ąŲ§Ą.ōzö/ä|÷m«źØ8v”Ņ=»éś»ß×ļ§%ōG°ssĒŽÓ‹īżė~¼¦×!„­”ØJ£’ˆÅ,įż}ļ3źĆQÜūż½Ņ/u‘^œĪ}+ļcųĆ;sž ’ų0£>Åģogsøąp‹qx:yņŃžšvņnrĪ” åīļīę`^żoäŽŲń ·,ąÅŸ_dÉĪ%m݌B!nööö<śč£¼óĪ;TTTąėėK·nŻX½zu£i„ŠØÄ4UŚN:qīÜ9‹›7of͚5¼ūī»|śé§ęé2–ųśśRRRŅ(­¤¤ÄüŖą+]ĄUˆKuØÓØKS6tĪΌŁ{„Nćo&uįŸ•‰ĻĢē¦ć™„/|…Ə=ŌØ\ŻłóŒŚµŸŽ _įÄāE×¼\s×p9j²³qķĄžūīĘ-¼75ĶĢ“ääß_§Ū#£»šŹ-÷ČhĪ|ō>†Ź eēÉ|ļßԜ;*ń !„-LÓ\.ī³<†QŽāŻäwyqģ‹Ž¹Ų¹°įž ōńėÓ¤ž†m]Ää^“ŁzßÖFĒm]Ä­·²éw›ųÓš?ńź¶W[ŒsVä,ŽM~—YQ³3łĮdē%ņTÜS<·é9ęĒĶē\Õ9–ģ\BQuO ŖÅėB!āćć ąż÷ß`芔äää˜7={ö,³fĶāüłó@}ĒĆ?üŌæ&##ƒX­ąĄ888šĶ7ß Ŗ*Üwß}|żõה••įīīŽ‡‡555¬X±Ą¼«½½½ł¼±±±äēē›xŻæ?łłł 2¤­›P“S2eꂐy su%dŽl>؜^¼s;Ē_y‘Ŗ“'ź×Öø¤W2ōž‡Ń¹øą?y‡’ųČ5/w- üčsŒ †ÉŁ¢ģąŹSÓļߘӢ–.#õÅē8żÆ·Ńŗø2÷~Šé~µėBkšė0ø#śģ“v<7ņ¹fėH/IgFļ8č„§Kć…ͧj5-’ĪabωLģ9€ē7ÕÆ®æ2u%ų˜¼Š< Š õ?tZy”{ææ—OoūVž]BaFĆO<ĮžšfΜIhh(K—.åĶ7ߤ¼¼;;;ęĶ›‡§§'%%%čt:4 ³gϦ²²’'Ÿ|’.]ŗPTTd±~GGGŽzė-–.]ʇ~ˆN§ćę›oęöŪo§ŖŖŠõė×3mŚ4X°`ééé<ņČ#|žłēLŸ>E‹ńå—_ņĮšĘo°dÉjjjpvvfɒ%x{{›§Ķq5I‡ˆ ‡b™’GzæōĘĒ£Ōźł92¬Q^‹K}Õh¼ęå®6§ą`*O¦įŃo'ŅpźŚÕęņ'’ž:Ż{­ĆÅ/.Ż{0賯Ķū¹ß}‹{D›ėBˆ¶`§µķGb˜w?’ŪśÜ†½ÖޜŃ)‚»ūŻĶš®Ć›t–“Ę[Io±ų¦Å Ģžœ=<±ž ō=Æn{•‘!#yuŪ«||ėĒWt!„ķ×/æ4v?hŠ ’’’Ģū111|öŁgĖ«ŖŹŻwßĶŻw߯(Ż××׼𪋋‹y <<œåĖ—7©ĖŻŻ½Iś'Ÿ|bŽ~ųį‡yųį‡ĶūƇgųšįMź #11±­›V“3jŹLs²>śĘŹJ²>ś^1‡dkjpšńE©Õ“±ģ6×÷k—3iķŪgoż 'Žx }^.ś¼\N¾ń*]fβ©ĪŅä_Ø:•NМ»,7”'ķjŅ^]Ųā"­Bq½iø~HĆķæŒł kN¬aŌ‡£­!²pģBžwģÄoqķ[ŻŪ’^ž¼éĻLś|§JN™ÓßŲłaŽa¼5é-zx÷ąõÆ·u !„h§,­"D{$#D.P ul…[D$}ß~ǜŽūÅW8ųŠPß©bś8Ž€ą ø®¶MūN ņ˜ņ;ŖŖŗĄ–“ÆX±‚9sęX=nś2~µ½‘ģ3“ī’÷>ĆG“u(ĶźČ÷Hqu¤„„ŽÖa!„h+V¬`ęĢ™@ӑ –F6XJ{ļķ„<ńō³ŌÕÕ¢ň¢(ØŹÅmE1^8Væ­Ŗ*_õO<ó—¶n!nxę- Š_ų˜¶«.lWÕöMŪ¦|µ€”Į@mš±Y»!Ņ‘æd^ń][‡`“Ž|„B!„B\d !„B!„Bt8Ņ!"„B!„BˆG:D„B!„BŃįH‡ˆB!„B!:œvµØźĒĢܹs),,dķŚµųųų`ooOll¬yߚ}ūö‘““@PPl6ݚ¤¤$ šööfĈœ:uŠ£GšóTTTŠÆ_?¢¢¢ØØØ`Ė–-xxx0zōhŅÓÓ-ęļÓ§;w¦āā⚭ŻŗuL˜0ÄÄÄ&e5 »w聆°EQ #**ź²ŚŹS “&M2Ÿ«aūh4Ö_xd©}Zƒ¢(ŪMUU‹éĶÅÓŚkoķsÕRżėׯĒĮĮńćĒ[½®œœŅÓÓµ—B!„č*++y÷ŻwŁŗu+UUUh4ŗwļĪż÷ßOlll[‡'Äu£]uˆ4äēēĒ”)S8wī Üzė­899YĢ_PP@AAÓ¦Mźæt˜]šīļļo±ž¼¼<ŒF#Ó§O !!œœĀĀĀ  ®®Ž„„ó+#SRR'//Ļ\µüŁŁŁ āććŲ“igĻžµšß`0P^^ĪģŁ³9sęŒÅ²Š¢P^^Ī“iÓ0¬ZµŠąą`<==[ÕVÖŚ¤a ÖŚ'((Čź½“Ō>­ĮZ»)Šb1=88ųŖ\{kŸ«–ž·ŌŌŌF5Ö®«¹!„BѾ-^¼˜ŗŗ:>żōS¼¼¼0lŚ“‰•+W2hŠ ģģģxķµ×˜4iƒn±¾ÖäāFŅn;DźŌ©”””dffŅ«W/>żōSęĪŪ(ĻŁ³géÖ­›yæ[·näää ŖŖÅtOOO¶lŁ‚N§Ć`0ąįįA\\˜óėõz\\\ė—_~aĄ€ŲŪŪ0lŲ0²²²¬Ęß0懇åååTWW£Ńhج¬ÄĆĆĆjž]»vQUUÅęĶ›4hÅ² Óé&77OOOöķŪG~~>vvv(ŠBæ~żČĖ˳Ų&~~~$&&RUUŌV1b{öģ1Ē0nÜ8‹ķ£ŖŖÅ²ÖŚĒŚż²ƒµv3u]š®×ė-Ž_kēõ÷÷oU[Y{®¬„ūūūS^^Ή'6l‡°z]åååœ?žĶ›7c0P…›nŗÉüĢ !„Bˆö+99™—^z /// ž’ų&L`Ā„ ę<ééé6×ך¼BÜH:D‡€»»;hµŚ&!P’żįˆJKK,¦;::2qāDsś÷ßOEEnnn@ż¤¤$ŗv튷··9_YYåååĶŽˆhčŅüxxx°yófsl¦sZŹCvv¶yz…„²ŽŽŽœ'Ož“X¶aē€-÷ĖZ !!!VŪĶRŗV«µx­·µmeķ¹j.}ĒŽŒ1UUĶĒ­=åååčõz¦M›†F£!))‰“'OҧO›ž;!„Bq柎½;_}õaaaG2/]ŗ”#GްhŃ"¢££Y¼x1 ,_¾½^««+ ,`Š AMņĪ;—¹sē’˜˜€Ńhd芔üšĆtéŅ…åĖ—³~żzTUEUU¦L™Ā< #˜Åu©Ćtˆ”••įėėkõø““z½Ž¼Æ×ėĶÓk,„WTT˜˜ˆ£££ł7󃀚š~žłgĀĆĆĶÓXLRRR读·Ķq_š?55777ʎ Ō÷ž¦¦¦ŁbżĶ•ĶŹŹb͚5ŲŁŁįąą€‹‹ ÅÅÅtźŌÉę¶*--%77—7š5üņnb©}l-{¹1X»vĄbzHHˆÅūkķ¼­m+kĻ•µōƇŒEEE-ŽSOOO|}}Ķ?x<==©ØØ°ł¹B!„7®^x_|‘©S§Ņ«W/bbbøé¦›čßæ?óēĻ'!!… 2xš`Ŗ««yżõ×yūķ·‰ŽŽę›o¾įå—_fåŹ•Mņ¦„„Y=ļįƇłžūļłß’ž‡‹‹ eee¼śź«œ9s†ŠŠŠ¶n!ščo™)..&33ÓźhØ_¼2##üŸ‘‘App°Õō““43f ±±±h4TUÅh4’@lll“ĪØ1еkW›cæ4æ¢(: TUEQ›ź·V¶ŗŗš¦NJ||kń—ŽĪĪĪl޼™ččh† Bvvv£ļ¶pww§²²’•+W’••…‡‡K–,‘ĪqŻj·#D Y½z5ŖŖ¢ŃhˆĒŃŃEQ,®!āēēG—.]ųńĒ 1’ĘßRŗŖŖģŲ±ƒĀĀBčŃ£»wļ&$$„²²2ó2€ČČHĀĀĀ0Fģģ.6»¢(¬Y³½^OMM «WÆf芔ųūū[ĢĮöķŪŁøq#­Vk~ ‰„ü Y+«ŃhHMMåąĮƒhµZ¢££qrr"88˜‚‚Ö®]‹ŖŖI×®]-¶‰ÆÆ/łłł$$$ Ó鈋‹kĻńćĒ­¶„²ŽŽŽVŪ§514×n–ŅKJJ,ŽßI“&Y}NZÓV֞+ké GŸqšąA¢¢¢0 ćĻĖĖĆŁŁ™mŪ¶”×ėQ…!C†“õ_K!„Bń+źŽ½;Ż»wgöģŁœ:uŠ;3äää&’/T…wŽy‡ķŪ·ćąą@mm-ŠüˆmKŗuėĘ{ļ½Ē7ß|Ć_|Ąm·ŻĘ¼yóŠj;ÄļāÅ ęr&ri| ¾SÅōq'Ąp\/l›öä1åwTUu-'_±bsęĢiėvBцŅŅŅĢoźBѱ¬X±‚™3gMæ°[śo)ķ½·—ņÄÓĻRWW‹bTPcżČ[åā¶¢/«ßVU•ÆæśŠ'žłK[7Įe›4ióēĻēę›ofĀ„ üõÆešąĮüōÓOüć’ąĖ/æÄĖĖ‹““4īŗė.vļŽm^Õ”÷äɓÜ}÷Ż$%%õ£’ćććĶkˆ4tźŌ)ęϟϼyóĢoQ@£Ń¼Ōś ÓvÕ…ķ  śĀ¾iŪ”Æ04ųØ >6“n:!„B!„h'Μ9Ƅ Ų“i555TTTšžūļS[[KLL öööœ?Ø_oŃŻŻjjjX±b€łĶ óśłł”( Ēą»ļ¾3žX»v-/¼š‚yM<Ӕö֎4ā×""B!„BŃN„„„šŅK/ńæ’żiÓ¦1zōhfĻžMFF’łĻĢÆā>}:‹-āžūļ'>>OOO¦M›ĘžšfĻžMTT<ņH“¼žžžÜ’ż<žųć̚5‹€€œœœP…ńćĒćāāĀķ·ßΌ3øćŽ;0`S§NmėfĀ"™2#„ā†#Sf„¢ć’)3BÜųdʌB!„B!D‘!„B!„Bt8Ņ!"„B!„BˆĒ®­ø*…m‚Bˆ6&? „B!ĕ"B!„B!„čp¤CD!„B!„Žtˆ!„B!„¢Ć‘!„B!„Bt8ķ®Cä§Šh~ nuń빜{$„×»!Ė'·uB!„¢Ś]‡ĄĶ™)ÓM_Āoä/ćWūL­­Æ*#“ż÷<ȖØal:žć ’Š¢×·x ¬ß!„øZL ;)†,ŸÜäÓÖ1~qč;>?ōæ+ŠĒZYKķ „B!źµĖa»›3S.«ƒāȓĻć3‘»bXĀJtĪNœzóß-Bˆ¶“ēĮu>mmUźzTTV„nhėP„B!:é¹ąäońsD {nż-Õg²Ķé¦Ń›Āś³{źlJ“÷7:–õɗlķ?‚ķCĘQøaÓ5-w=©HM#ō¹Ų¹¹aļéA·Ē `ŻĘ !ÄõhČņÉ|°ļKFx÷~’G²ĪŸå‘Ÿeō‡·qĒ·sø €’]ĆĢæ'īƒéMFš¬HYÅMŸĢfāgw²īÄęĻėéäĮGūæĘŪɳQ,C–OfŲÓøē»Ē9˜w“Ł8Ž‘‘ B!„¶³kė~M¦‘–FD蜝½wgžó)Ē.fĄG’n”W59æļ‡›Ļؤ‹†óeŒÜõē6oåÄāæć7ń¦kZ®¹kų5¹GFõŃēt{ŖQ!óżOØ9›Ūā1!„ų5˜F\: äŅƒ†ĒķœXĻ—¼½ū?,ŚśnœĘ²Éư7÷Æm[ƊŪßį_æ|Ľf1&t8Įž]°×^üQj§Õ±ö·Ÿ³/÷Æl}‹É½Ę7ēķ‘Óxńē%¼2žöē„4ŠÉØ9TpŒē7ż•5æżĢjœ{\ǐå“-Žx±ÖB!„¢ƒuˆ4§ė¼»Ń¹ŗŠuŽŻd7§ļL"ķ•%TĢ@©«¦Q¹ū‡ĪÅ’ÉHłć‚k^īz¹ōUŽæų’ś‹3]ēžtŚ !D[j®cąŽčŲiķxväc¤;Å_6/į/,@{įßć—Ē/ąūcėųįųFЪй«ļm<s·ELF§Õ1¼k …UE-Ę3±ēX&ö ĄŸ7½ĄŹŌõ|rąņ* 1(4hšS!„B\é±@Ó āčüé9:Z[ĖĻ‘CåÕ¹8חŃiQŹ5/w½péŹĄĻ–›÷sæ[[Dx‹Ē„āze§mü#1¢SO~Ūo&Ć»ĘAē`NĖȐXUe_ī!ę'¼līŃiuWDz¤X|Ó³ ģĒžœüiżĀfćp“s ·<Ÿ@÷Īm݌B!„7 é¹ ė£/ ™w7Y}‰gĢ@sŗ±Fƒ7jm-§–½ks}æv9“ŸB£Æśtšęź4”•S¼c'^]BļW^°ł˜B\ļ^ū$ŪłonYJempqz ŌwLŗwęÉį]ÕóŽÓ’vóh‘¹ļ°©ĢŃ·2ēæPUW-Óc„B!l$"ØŪĘ-¢7ŃoæaNń=ōŖĮ@'µ¹¾_»@iņ~¼tęŲ¢įėvMŪ¶tؘņjqėŻ“Ž/’™ĪS'¶xL!ŚJs–Ž{²lņ+6×sizKÖņĻ8‡yē˜Óļķ?«Å:½GcļūUŚQ!„¢½h—"­%aŹŪćOhr,š¶iŽ6ͼßuīo›”³“-ʵ$}é? ›’x«ŚŹ–v²”§¹r-ÕŁ°F!„B!„h ķ®C¤­ß¾Ņ–Æų°­C°IG¾GB!„B4TSSƧŸ~jŽ×h48;;ČĄńńńiėo8Ė—/ĒÉɉ{ļ½·­C×9yõ‡B!„B“1­VKtt4ø¹¹‘žžĪ÷ßOVVV[‡ö«9{ö,Ė—/§ŖŖźŠŹŒ1‚ŲŲŲ¶¾qhw#D„B!„āFcggG\\œy?%%…ÄÄD¶nŻŹwމNwåo2»Žeff^•2QQQm})ā!"B!„Bq‰ŽŽęčŃ£”––’ŸŸO—.]ŠėõģŪ·ĢĢLŖŖŖpqq!((ˆ˜˜œج¬d÷īŻäęęR[[KēĪ>|8ŽŽŽTUUńłēŸćķķͬYķžšĆQU•ß’ž÷ę<]ŗt”Gģٳ{{{ʎKUU»vķ`ųšįōģŁ€ŚŚZ8ĄéÓ§©ØØĄŁŁ™®]»2dČQU•÷ß///FĶĪ;9ž<^^^Œ9VÆ^Mnn.Ÿž9111 4ˆœœ’““)**B£ŃąļļO\\^^^VĖ\:e¦„v³%>Ń>ɔ!„B!„øłśśPVV†¢(¬^½šĆ‡Ó„KFMHHĒŽcŻŗu(Š‚¢(¬]»–ōōtz÷īĶŠ”CÉĻĻgķŚµčõz›Īi‰RZZJvv6]»v„¢¢‚;vpüųqĀĀĀØ®®fĒŽ(Š‚ŖŖüųć}ŗ“øó Õ5õ’ ¹ø8×ÆŁś×ÆK ~Ā0v%jRV£ŃšĖī KQ…°°`"£z\V[YcŠaā¤įģŽŅ¤}4Õ²–ڧµ1(Šj±ŻT‹éĶÅÓŚkoķsÕRżÖļĀĮĮžqćc¬^WNN!é飍ŚK!„BÜXTUź;)Īž=Kqq1žžžŒ=€ž={RTTDnn.yyy(ŠBII ĮĮĮÄÄÄõ)ĒŽ#;;›ĄĄĄĻiśpmm-ćĒG«Õ’‘‘Aii)'NÄÓӓģģlJKK©¬¬¤¼¼œsēĪįė닿æ?Š¢ąīīNHH'Nœ //€€4 z½ž±cĒāå兢(|öŁg”••™G²888„‹‹ ÷ŻwŖŖ¢ŃhP…żū÷S\\Œ¢(VĖ4dK»uéŅ„ÅųLēķK»źiČĻχÉSźēą+ecĀnn¹u,NN–䂂b Š™:m$P’„³  P-¦ūū{[¬'/Æ£QaŚōQ$$$‘“sŽaĮō  ®ĪĄĘ„$ĀĆC8’rŠššPņņΙ뱖?;;ƒĮH|üP6oŚĆٳ…Vó FŹŹ+™=;ž3gņ,–U…ņņ*¦N‰ŃØšĆŖ­ūćééÖŖ¶²Ö& c°Ö>AA~Vļ„„öim ÖŚMQ‹éĮĮ–‡Åµö¼­}®ZzŽŽ§f6ꬱv]Ķōē!„Bˆ€ŖŖœ;W’’_OOOŠŠŠšņņj”ĻÓӓÜÜ\ŹŹŹĢinn’?lŲ0† ŠŖÅJ]\\°³«’ŗčąą@uu5žžõæ`vvv¦““£Ńh®³¤¤„õė×7ŖĆĪĪŽ²²2Ģū¦ųµZ-...čõz ƒÅEQHJJ"##ƒŖŖ*s‘©}lQQQŃb»uéŅå²ā7¾vŪ!Ґo'/BBÉĢĢ„WÆ>ūt æ›;­Qžœ³…„v»ŲcŚ-°ž·ōŖj1ŻÓӕ-[öb§ÓQg0āįįJ\\?| š5ēÆÕ×įāāŲč\{~9B’įŲŪ×7’ŠaŃdeå[æa~O7ŹĖ+©®Ö£Ń@ee5®Vó'ķ:Lu•žŸ7'3pPo‹e32rģ€N§%8؟¼Ü"<=ŻŲ·/•‚übtv:E”_æ^äēYl??/Q]U€³‹#Fō'yĻQs cĒ ¶Ų>ŖŖZ,k­}¬Ż/k1Xk7UQ-¦ėõµﯵóśū{·Ŗ­¬=WÖŅżż½)/Æāĉ3 MŹįt«×U^^IŁłJ~ޜŒĮ`@QTĘß4ÄüĢ !„Bˆė[JJ eeexxxąļļožņRZZŚ(_II ®®æ”——›·8Ą¾}ūˆ%<<ØļQ­VKII ƒį²m5×ßߟ3f\Õ68rä)))„……‡N§ć‹/¾ ®®Īę:LC¶“›čx:Ģ·#ww*+ŖŃj5M:CjōµFD88ŲSZZ’‰„tGG&NnN_łż**Ŗps«¦„(*»“ܵ3ŽŽę|ee•”—WdŪĀ<—ęw÷pĮĆƕŸ7ļĄĆÓ 77g«łĒō!;»ąĀō ÅbYoowŅOfÕUU)((ĮŃɁģģJŠĖ˜49®QL™™¹Ū$==VĖĶF+ģÜyÓ§sÅ`riūœ<™e±l·n],¶‹µūe-†«ķf)]«ÕZ¼æÖĪŪŚ¶²ö\5—¾sĒFŒčŅ 7ÜŚóP^^‰^_ĒŌi#Ńh4ģNJ!żd6}ŗŁōÜ !„Bˆ_—Į` 11UU)..&77;;;ƌŌO ńńń”  €ķŪ·HNNłłłųųų„ŖŖxzzröģYöģŁƒ››‡B«Õҽ{wpww§¼¼œ7āēēGff&ŽŽŽ­źdh( ___ņņņŲ±cĮĮĮęEVEįÖ[oÅÉÉɦŗL#R:D=Ģ1UVVrśōi222̱¦§§Ó³gĻ&e.]ՖvW‡é)+«Ä×ל"NNŽčõ’Šėkqrr¼°Ż4½²¢šÄă8::Ą…ßĢ FjjjŁņs2įį!ęi,&GRŅéŻ;Ōęø/͟šš‰›› cĘ`oņ1ާfŅ'²{‹õ7W6++Ÿµkv ³Óaļ`‡‹‹%Åeųvņ²¹­Ī—V›{ŽŸ6ŁĀH6KķckŁĖĮڵ«`1=$$ĄāżµvŽÖ¶•µēŹZzŹį“ūćķćAQŃł漢§+>¾ęé5žžnTTŲ>DR!„BüŗE!%%'''ŗwļĪ AƒĢ «jµZ¦OŸĪ޽{9sę iiiøŗŗŅ·o_ „V[’¾Œ)S¦°{÷nŽ?Nmm-žžž 6Ģ<büųńģŲ±ƒģģlŹĖĖ9r$Ū¶m³yŃÕKi4¦Nj~ĖĢńćDZ··' €˜˜›;C žu¹„„„¤„„įāāBTTyyyäååQ^^Ī€čׯŪ¶m#99™īŻ»7)si‡ˆ­ķ&:¦Ń!R\|ž3™¹ a5OPÉ{Žšƒ~:#‡ŲŲ(Uµ˜~<-“ĄĄND÷ķIMM-ŁYØ*F6&$7¢æÅ˜ĢĢ\†ÄŚž^ģKó«ŠŅh„€ŖŖ(ŠbSżÖŹVWė  ėˆž(ŠĀśu‰węܹRŽ9es[•–VPS£gÄȍņ×ÕĢŪÖŚĒĖĖŻbŁÖŽ/k1II·Śn–Ņ­Ż_kē­®©mU[Y{®¬„gdäP\RFnī9jkė(;_ÉŃ#§źćµr]„%‡J–”–ćķķnós'„B!~NNN<ųąƒ6åutt$..Žøø8«yÜŻŻ¹łę›­ļܹ3æłĶo„Ķž=Ū¼ķąąŠ$ž{ī¹§Ńžōéӛ\CƵJ,łżļß$­į«”~±ÓKß3eŹ”&åīŗė®fĖ\æ-ķfK|¢żi·"……Åüøz»yEā›ć‡āč耢Ø×ńóó¦K?~üq;4„„˜ćo)]QUvī8HAa ŽtļÄ/»S  ¬¬’]‰‡ĢuGFv§GX0F£‚ŃØ`gwq~ž¢(¬]³½¾–ššZ~\½”C£ńó÷¶˜æwD7¶oß_?B£A§ÕšßBb)CÖŹj4p<õ4‡ž@«Õ†““ĮĮž³vķĪś:U裝®];[l_Oņņ‹Ų˜džƒ8<®_£xŅŽŸ±Ņ>AĖ::Ś[mŸÖÄŠ\»YJ/))³x'Nnõ9iM[Y{®¬„7}RTtžCOÕƒĮh1ž¼¼"œٶmz}Š¢0dHd[’µB!„BˆėĘ弋BÓąõ*¦ą8Ī€ ązaŪ“ļŌ )æ£ŖŖ l9łŠ+øcĪMmŻnB!ŚŠ‰“z…{_yEB!n8_ÆŲÄĢ™3¦o±ōęKiļ½½”'ž~–ŗŗZ£‚¢Q„~Dõ…mE1^8Væ­Ŗ*_õO<ó—¶n!nxę- Š_ų˜¶«.lWÕöMŪ¦|µ€”Įź\0}l&¦„B!„BŃįH‡ˆB!„B!:éB!„B!D‡#"B!„B!„čp¤CD!„B!Ś‘›nŗ‰ŪoæŻā±»īŗ‹›nj›—TCUUU[6fŅ!"„B!„ķLee%iiiŅΜ9Ciii[‡&ÄuĆ®­øüŚ:!„mŖD~!„͈eżśõ„‡‡›Ó9sę°oß> ~4ÉøqćX³f ³fĶ">>žåĖ—––F\\œ¹£ŃHLL 999ĶÖ)ÄõF:D„B!„¢éŃ£...>|€S§N”ŃhčŃ£‡9Ouu5Ææž:/½ō«WÆfęĢ™¼üņĖŲŁŁQYYI~~>ß~ū-Ė–-ćƒ> ¬¬¬Łó6W§×éB!„BˆvhāĉlŲ°Øµ1aĀ„FĒŁ¼y3ŃŃŃ 2„ģģlE@QfΜ @dd$Z­–‚‚‚fĻŁRB\OnČ5D„B!„B4oāĉ̛7§žzŠ7ņę›oRWWg>®( ļ¼óŪ·oĒĮĮŚŚZ€FÓlÜŻŻĶŪZ­¶ÅŽ [źāzŃī:D6†v >3æUeZ“_\™Ė¹GB!„BˆÖ " €ļæ’gggBBBHOO7ß¼y3kÖ¬įĖ/æÄĖĖ‹““4īŗė®뽓c¤į4šĖ­Sˆ¶Š.§ĢXū¢mś"nśóFt­®AU’gßjs½…7°gę46õźŹÖĮŃžć#Ōäę“x ¤#DqķÅ,iō§i;fy Ć>Ęģog³ćĢŽ¶Ójģ_ś€Ļ}Žč.·®e¬æĘy„B\¾‰'ņĮ4™.õīīīxxxPSSÊ+ØŖŖj¶N???Eįųńć|÷ŻwhµŚ+ŖSˆ¶Š.;DDėeüæ·ŠŲŪۜ’ĢĒŠżń'{ •[qķĪĮ‡īkń˜B“„ä“Iü}"ĻŽ|–—·^æ ¼­L]‰ŠŹŹŌ•mŠBˆ\||z·ˆHś¾żĪ!”ĄÅ‘;;Ü#"é½č5¼bbĶĒ"^^Lś?– up$āÕ7šŸ8łš•»VĪļK&ėӏ¶ö'¶ égS™Į_|Ūh?ä¾ūÉųoµxL!ښŖŖŌjp¶w.ŽnŠiuōņéÅÓqOÓ? ?1Ėc˜7Ÿå{—c§µć‰aO0„ה«–æ9žNž|“’#¼¼9ĶiŽåµķÆqŗō4ݼŗńēQ&Ņ/²ÅóšžL~0łŖ^ÆBˆėצM›ĢŪ~~~üņĖ/ęż°°0óqwwwó«tM>łäóvrrr£c‰‰‰ęķ||м?uźTóvkź¢-uØÓT KS6tĪΌŁ{„Ģ’¼GźĀ?3š£ĻåU J÷%sų±‡•“ß\®īüyFķŚĻ¹Ķ9±x‘¹cćZ•kī.‡”¼ŒĆ|„Č7ž£’åOĆI_ś§Īhõ1!„øL_žMš˜¾Ü;Ś9ņ·ųæ5ŹcTŒ*8Äs›žcķo×õė~»Ž½¹{yeė+Lé5åŖę·fVä,žņó_xuü«ģĻ«’šź¶W¹#ź&õœÄŚ“kymūk|1ó‹fϳ<¦I\Ķų­µ³B!č Cuˆ4'dŽč\] ™÷Ū‡6§ļÜĪńW^¤źä ”ŗ:Šh• ½’at..ųOžĘį?>rĶĖ]mĒž¼€NćnĘļ¦ųĖ*ÆŌŌpō™'©Č¢ŖB!„B!„čp¤CD!„B!„Žtˆ!„B!„¢Ć‘!„B!„Bt8ķjQՏ?ž˜¹sēRXXČŚµkńńńĄŽŽžŲŲXó¾5ūöķ#''€   Ųlŗ5IIIąķķ͈#8uźG5ē©ØØ _æ~DEEQQQĮ–-[ššš`ōčѤ§§[Ģß§OvīÜIMM ...ÄÅÅ5[’ŗuė˜0a‰‰‰MŹj4vļŽMaa!Š¢FTTŌeµ•5¦&Mšd>WĆöŃh¬æŚRū“6EQ,¶›ŖŖӛ‹§µ×ŽŚēŖ„ś×Æ_ƒƒćĒ·z]999¤§§7j/!„B!„µ«‘†üüü˜2e ēĪ#!![o½'''‹ł (((`Ś“i@ż—Ī‚‚ó±KÓżżż-֓——‡Ńhdśōé$$$““CXXaaaŌÕՑ@xx8)))„‡‡“——g®ĒZžģģl ńńńlŚ“‰³gĻZĶo0(//göģŁœ9sĘbYEQ(//gŚ“iFV­ZEpp0žžž­j+kmŅ0kķdõ^ZjŸÖĘ`­ŻE±˜|U®½µĻUKĻ[jjj£Īk×Õ\‡ŽB!„BˆvÜ!ŅP§N %33“^½zń駟2wīÜFyĪž=K·nŻĢūŻŗu#''UU-¦{zz²eĖt:ƒāāā Ąœ_Æ×ćāāŅč\æüņ  ĄŽŽ€aƆ‘••e5ž†ł=<<(//§ŗŗFCee%VóļŚµ‹ŖŖ*6oŽĢ Aƒ,–ĶČČ 00NGpp0¹¹¹xzz²oß>ņóó±³³CQśõėG^^žÅ6ńóó#11‘ŖŖ* ~“ˆ#Ų³g9†qćĘYlUU-–µÖ>Öī—µ¬µ›©3čŅt½^ońžZ;Æææ«ŚŹŚse-ŻßߟņņrNœ8Į°aĆ8|ų0€Õė*//ēüłól޼ƒĮ€¢(ÜtÓMęgN!„B!:ŗŃ!ąīīNEEZ­¶IgŌ1o8"ĀĮĮŅŅR‹éŽŽŽLœ8ќžż÷ßSQQ››P?E#))‰®]»āķķmĪWVVFyyy³#"ŗ4懇l޼Ł›éœ–ņĒÄНmž^a©¬··7'Ož$** UU)((ĄÉɉģģlŠ‹‹™}ŗQ &—¶Ļɓ'-–mŲ9`Ėż²CHHˆÕv³”®Õj-Ž_kēmm[Y{®šKß±c#FŒ@UUóqkĻCyy9z½žiÓ¦”ŃhHJJāäɓōéÓǦēN!„B!Ś»Ó!RVV†ÆÆÆÕćNNNčõzó¾^Æ7OƱ”^QQAbb"ŽŽŽęßĢ jjjųłēŸ 7Oc1III”wļŽ6Ē}ižŌŌTÜÜÜ;v,ÉÉɤ¦¦ŁbżĶ•ĶŹŹb͚5ŲŁŁįąą€‹‹ ÅÅÅtźŌÉę¶*--%77—7š5üņnb©}l-{¹1X»vĄbzHHˆÅūkķ¼­m+kĻ•µōƇŒEEE-ŽSOOO|}}ĶSg<==©ØØ°ł¹B!„Bˆö®C¼e¦øø˜ĢĢL«£  ~ńʌŒ ó~FFĮĮĮVÓÓŅŅ d̘1ÄĘĘ¢ŃhPU£ŃHBB±±±M:C ~Ä@×®]mŽżŅüŠ¢4ź(PUEQlŖßZŁźźjBBB˜:u*ńńńŌÕՙæ|ēēēŪÜV^^^ųūūožtļŽ½QYkķcKŁ+‰Įڵ[K·v­·µmÕŚōššrssIHH`×®]äęęräȑfŸ‡’’szii)īīī6?wB!„BŃŽµŪ"………¬^½UUŃh4ÄĒĒćč舢(×ńóó£K—.üų揄„„˜ćo)]UUvģŲAaa!ōčуݻwBYY‰‰‰ęŗ### Ćh4b4±³»Ų슢°fĶōz=555¬^½š”C‡āļļo1DDŪ·ogćʍh4“Z­ł-$–ņ7d­¬F£!55•ƒ¢Õj‰ŽŽĘÉɉąą` X»v-vvvØŖJdd$]»vµŲ&¾¾¾äē瓐€N§ ..®Q<Ē·Ś>–Ź:::ZmŸÖÄŠ\»YJ/))±x'Mšdõ9iM[Y{®¬„7}RTTÄĮƒ‰ŠŠĀ`0XŒ?//ggg¶mŪ†^ÆGQ† ŅÖ-…B!„āŗq9Æ¢Š4ų@}§Šéć8N€3ąø^Ų6ķ;5ČcŹļØŖź[N¾bÅ ęĢ™ÓÖķ&„¢ „„„™ßŌ%„¢cY±b3gĪšN±¶4åŚRŚ{o/剧Ÿ„®®ÅØ (Ęś‘·ŹÅmE1^8Væ­Ŗ*_õO<ó—«z=555|śé§ę}Fƒ³³3 8ó±åĖ—ćääĽ÷ŽŪ¦÷ąjio×#l§ŃhŽjż…i»źĀvP}aß“mŹW |Ō›µŪ"B!„Bq£ŠjµDFFb4)**"==Ó§O3aĀó”ų#F˜GAßhĪž=˚5køūī»ĶoἑÆG“Ņ!"„B!„mĢĪĪŽøø8ó~JJ ‰‰‰lŻŗ•;ļ¼NGTTT[‡yŁ233›¤ŻČ×#ŚéB!„BˆėLtt4G„““”üü|ŗtéŅdŠINNÉÉÉ”Ńhš÷÷'../// žå;vģ ØØ'''† Brr2ååå<šĄØŖŹūļæ——£GfēĪœ?///Fމææ?P’ęĆ}ūö‘™™IUU...ƒ³³3YYYģŻ»—’’TUÅĒLJ˜˜‚ƒƒY½z5¹¹¹|žłēÄÄÄ0hŠ &×SYYÉīŻ»ÉĶĶ„¶¶–Ī;3|ųp¼½½[<‡—£C¼eF!„B!n4¾¾¾”••59¦×ėŁ°aÅÅŌ;–Įƒ“ĶO?żŌæpażśõäååŃ»wo̱cĒØ¬¬D«­’hZ”æŗŗš¤¤$ŗwļN—.]8wī›7oź_±zõj>L—.]=z4!!!;vŒuėÖ”( µµµlŲ°£ŃČŲ±c;v,ŖŖ²uėVjkk‰5æńpÜøqōģŁ³Éõ(ŠĀڵkIOO§wļŽ :”üü|Ö®]‹^ÆońB\!"„B!„×!ӂ°–ÖŁpttä¾ūī3æUSQöļßOqq1Š¢ŸŸOEE;w6OÅ ā‹/¾hTŸF£AÆ×3vģX¼¼¼P…Ļ>ūŒ²²2jkkÉĻϧøøF @Ļž=)**"77—¼¼<¼¼¼PU•źźjŹĖĖń÷÷gśōéę·MvīÜs ¦5DŹÉÉ”¤¤„ąą`bbb€śŽ cĒŽ‘M```³ēārČÓ#„B!„×UU9wīžžžMŽ+ŠBRRTUU5z›ŽŖŖTUUąįįaNwuuÅĪήɛwģģģĢÓl“Z-...čõz ęć&žžžäęęRVVF—.]7nūöķ#)) ØļÄ鯻7qqqę)Ķ1ĒĶĶ͜6lŲ0† fŽæŅsq©²CD„°­CBŃĘägBˆö,%%…²²2<<<Ģky4täČRRR #..NĒ_|A]]€ym†Óm*++1 ­z³‹©ƒ¢“““QzII PßÉõ£FzöģIMM ………}šŒŒ ©««#==nŻŗįģģL~~>‰‰‰ųśś’––Öź‘AAAųųųPPPĄöķŪ $''‡üü|||| "77—Ÿ~ś‰ĄĄ@ĀĆĆĢSdLÓcLS[:D=štņtéŅOOOĪž=Ėž={pss抔ChµZŗwļnÓ9„h-éB!„Bˆ6¦( )))899ѽ{w d^XõRQQQäå呗—Gyy9  _æ~lŪ¶äädŗwļĪĉٹs'ĒŽĆĶĶŲŲXŠŠŠ06Ē„Õj™>}:{÷īåĢ™3¤„„įźźJß¾}4hZ­–ĄĄ@ś÷ļOjjŖyQWOOOʎK@@€9ŽŅŅRŅŅŅpqqiŅ!¢Óé˜2e »wļęųńćŌÖÖāļļϰaĆpuuÅÕÕµÅsŃZšĖ,£iPÖ®ĮĒpœgĄp½°mŚwjĒ”ßQUÕ¶œ|ŊÜ1禶n7!„mčDZ ½Ā½Ū: !„mąė›˜9s&@“µ0.Ż·–öŽŪKyāég©««E1*(ŠEQP•‹ŪŠb¼p¬~[UU¾žź+žxę/mŻ—­¶¶–?žęĢ™ÓÖįˆL£Ń¼Ōś ÓvÕ…ķ  śĀ¾iŪ”Æ04ųØ >6“"B!„BŃ­Y³†āābś÷ļ‡‡iii²Ž†“»„x ę§Šč¶C4Cī‘āz4dłä¶”]Å)„¢ķ :___öķŪǦM›(--%&&ĘüZ[!:ŗv×!psfŠÅtӗšłĖųÕ¾SēDkėSjk9öģKl‰ʖØa{nŹ……Ŗ22Łσl‰Ęö”ć9¾šÆ(z½¹¬µū#„W‹©Ó aēA1šnņ§Ģųj.c?ž Ÿų¶Q™=®³ZĻÆérā¼Ö,µ§Bˆė_§N˜2e sēĪå÷æ’=³gĻ6Æū!„h§"Āv7g¦\Vř>„:3‹į?­bųO«Ø:uš¬¾ąČ“Ļć3‘»bXĀJtĪNœzóßm}©Bˆīćßp¬šļM_Āw~B^EA[‡tCĒ)„Bq£“ :3‹äßÜĆĻ}†ü›{ØĪĢjtü§ŠhN-{‡Ÿū į—éw4J’)4šMażŁ=u6„ÉūĖśäK¶öĮö!ć(ܰéāł²Ī²ē¶ßņsD '—,k4:£ö\’?GeWü­œß°­›Ē¢¼•kčłÜ“8vĘ1°3=Ÿż¹ßż@Ej”ĢÅĪĶ {Oŗ=öė6¶uČBˆnmŚ&žžnžx8ŗńĢČGĶdž,ŸÜdōCĆQ–Ž}°ļKFx÷~’ĒFł/-’æ£k˜¹ā÷Ä}0Żb]W§µxŅ‹O3oåŸĢē½4®+S!„āF×”:DL#!.‘śāb|nj`tņ|F'õÅÅMŹ*Õ5ŒŚó3ż¢Õwsf ćļ£÷Āg8üŲüFe ē˹ė'Ā>ƉÅ7§§½ōW|GÅ1zļVtĪNŹéÆtž1™1¶žĀÓ{ę%›®į×VƒkĻśÅ˜Ü÷ÜĀ{R“•€{dY}ޱ²CY9™ļ}LĶŁÜ6Wѱ˜¦•4œ^’_yŽ@÷ĪĶę·V‡„ćĪvN¬æēK"żĀ›å_æ|Ȉ |ń›‘x’ź§¼“6Nkń¼¼õM&õĒ–ū¾³išMsqZjO!„Bˆ]‡ź±ęüŽżtw7:WWBīæ—ó{÷7ÉÓżń±ss#āµĶiÅ;“Hš4“Ÿ#bHžõ;ōy‡5‡Ü’;t.ĪųOž@uV¶9½ä—½„<š;t®®t½ļ·ŹoßEŹŸasÆAģæ÷!*O¤·uó“hĄG§ĆD.}•’¤=l2žÄńÓŃ::‚N5!DŪźģŚ‰Üņü«VßŃ3p±w꣑59fTŒęķ—Ē/ąp~*O%¼Ģ͟Ģę½äĻ®Iœ—Ę“^rš½'ā ³·ZęJāBq}z蔇x÷Żw-{ēwx蔇ZU_QQ111TUU°xńb&L˜€¢(­Ŗ'&&†£Gž*mŠ0ęKćæÜėķ“|Kµ‘ĪÕµIŚŃł/ŠćO2öŲ/Œ;ŗ.yǹĪōN‹j“ń ­–qĒö˜GŸÜ”qØ­/Ż"ēą.Tžq!_„¬¼źqZŠ'Ģ»?ß@bø&q !„ø>͘1ƒµk×¢^ņŻDUUÖ­[Ē-·ÜŅŖś¼½½Ł°aĪĪĪ(ŠĀŖU«x÷ŻwŪdaÖ×^{½{÷ž*õ7¼nŃ~I‡ą9xY}±²Š3~†ēą6•3ÖčqšńF­­åŌ²wm*ą;˜Ģåc¬¬"ė£/óĒÉ7ŽĀPV~Y×r-Ž c©Ī€[§rņ·Šē Ļ+ąäo8sF£<†²r Ö&pāÕ%„>8÷ŖĒ%„­1wą„ū†ńąO3żĖ{ńwķ4^—ćҵ3•9’}Ħõ4:7/aņēw£ØG^˜źńŸ,ŽžOžŽüoę.'NK^ókOlfō‡·5Ź{µāBq}ŗé¦›(--åĄŅ÷ļßĻłóē?~|«źÓjµųśś¢ŃhŠėõF<==ŪäŚŅÓÆķ賆õ7¼nŃ~Ł]y7¾Ž/=Ē‘§žĢ齏[dQͦrį/>Ć”‡ž@5čńä£6•é9Ržø€3ļLČż÷¢±Ó5ˆåYR.fēČ‰Ō/l_/¤4y?^1[uķ ;;LŪ¶œ/äž{©ĪĢb×Mõ §O2O’1Õ£utÄ­wOzæüg:OŲŗ›"„W™½ÖŽGcēņhģÜFéĶ­‹ńhģ}<{_“tKe¦ōŗ‰)½n2ļĻŽšŃbżW+NKĒzłtēć[ßŗfq !„ø>999Ϛ5k8šāwƒ5kÖ0aĀœœź×0LNNfٲeTUUįźźŹ“O>ɀ8zō(óēĻ'>>žĆ‡ó·æż‰'²mŪ6žžy|šA|||5j÷Ž{Æłß|ó |šĮVć;sę æūŻļ˜?>ü1„„„̚5‹|€åĖ—³~żzTUEUU¦L™Ā<Ąß’žwŽ9Ā¢E‹ˆŽŽfńāÅ$$$°|łrōz=®®®,X°€Aƒ5Ū>ÖŹ,]ŗ“QżO=õ”łŗ]\\Ųµk’üē?©©©ĮĮĮ?üįŒ=ŗÅė×·vŁ!ņSht«uéʐļ>·zÜZ]·M#š¶ięż®skµLĆ}ē®A łž TEįÜƟqėÕÓ|ĢŽĒ›¾’üŪe]wśŅ6’ńV•±„,åŃ:8ŠēEōycQ«ė¼£X„B!„õf̘Į’żß’±`ĮØ­­eÓ¦MüóŸ’ ““”§žzŠæżķoÄĘĘņĖ/æšŌSOńć?āąą@YY^^^,[¶ŒŚŚZs½‹/fōčŃ,_¾œ°lŁ2ī¾ūnóō™~ų{ī¹§ŁŲģģ쨬¬$??Ÿoæż–£G2wī\ęĢ™Cff&ß’=’ūß’pqq”¬¬ŒW_}•3gĪ0ž|Xøp!ƒ¦ŗŗš×_·ß~›ččh¾łę^~łeV®\iõÜĶ•¹“ž¢¢"s¹āāb,XĄ²eĖ4h‡ā‘GaÕŖUĶ^‡‡G[? ¢ķnʌiķėŻO”ŃlĄÉ%ˈxķ/W„ĪĮ+>Ä{xl[_Z‹n”{$„B!訒žųųų°uėV¶lŁ‚ŸŸ}ūöą—_~”sēĪÄĘÖwˆÅŪŪ›ääd4 555̚5 www«ē7nF£‘;wpāÄ ņóómš’£( 3gĪ 22­VKAAīīīTVV²råJ²²²ššš`ɒ%„††6©ĆŁŁ™Ķ›7]’ĖÖ!C†ŻģbƗS`Ļž=˜GŸōė׏   ’““›½qżk—#DnŅ! „B!„øVL‹«ĘĒdzvķZ¦OŸn>VTTDvvv£4€ŹŹJģķķqssk¶~­VĖķ·ßĪ·ß~ĖØQ£X½z5·Ür öööŲ¢ag‹V«EQŗuėĘ{ļ½Ē7ß|Ć_|Ąm·ŻĘ¼yóš,āŖ( ļ¼óŪ·o7‚š,&{„eLķåķķŻ(ĶĖĖ‹āāāfÆG\’¤CD!„B!Ś™©S§²|łrĪž=Ėž={xńÅĶĒ|}}éÖ­_~łe“rééé6/$:sęL>üšC²²²Ų°a}ōŃĒŻ§O.\Ą©S§˜?>L›6­Q¾Ķ›7³f;üņK¼¼¼HKKć®»īj¶īĖ)cjƒ’’Fi%%%tźŌ銯W“­v7eF!„B!::???bbbųė_’ŹŠ”Cńńń1:t(999ģŪ·€³gĻ2kÖ,Ο?ßŖsxzzĻ /¼@DD]ŗt¹¢˜×®]Ė /¼€^Æ 88///ó{{{sŒeeeø»»ćįįAMM +V¬ ŖŖŹjż-•iXC±±±äēē›ßܳ’~ņóó2dȵ¹yāW#"B!„BŃ͘1ƒ¤¤$f̘Ń(ŻÓӓ„K—ņę›orė­·ņ’÷Üwß}—õ:Ż9sępäČnæżö+Žwüųńøøøpūķ·3cĘ īøć ĄŌ©S˜>}:‹-āžūļ'>>OOO¦M›ĘžšfĻžMTT<ņˆÕś[*Ó°ž†¼½½yć7X²d 3gĪdéŅ„,Y²¤É4q㹜—*k| ~Śéć8N€3ąø^Ų6ķ;5ČcŹļØŖź[N¾bÅ ī˜s“ÅcŸ|ü#æ›;ĀĀ֭݉Oż_h{{;†ÄFš÷­Łæļ899…ł1``ļfÓ­IJ:̹ĀR¼¼Ż1¢?§Īrōh†9OEE}ūõ"*ŖUlٲWF®_ØēTz¶Åü}śt'qēAŖkź{M]\œˆ‹ė×lżė×%?a»5)«Ńhųew ……„(ŠBXX0‘Q=.«­¬1Å0qŅpvļNiŅ>Ķ Ė³Ō>­AQT‹ķ¦ŖXLo.žÖ^{kŸ+Ké¦ųĖŹ*P//wFŒ¬o·†m{`Z«bāFu"­„^įņŸ!„čˆ¾^±É¼€å„k?XZ ĀRŚ{o/剧Ÿ„®®ÅØ (FEAU.n+Šń±śmUUłś«Æx♫óB„öāȑ#<ū쳬ZµŖÉ:BX£ŃhŽjż…i»źĀvP}aß“mŹW |Ō›µŪ5Düü|˜<%€¢s„lLŲĶ-·ŽÅÉÉĮbž‚‚b Š™:m$Ö P-¦ūū[žx^^F£Ā“é£HHH"'ē=Ā‚é @] I„‡‡p$åįį”äå3×c-vv>ƒ‘ųų”lŽ“‡³g ­ę7Œ”•W2{v]Ćļę6^”'ēl!”ŻĶū”ŻėÓ®ŖÓ==]ٲe/v:u#®ÄÅõ# Ą—€_sžZ}..ŽĪµē—#ō޽}}óMVV¾Õųę÷ōp£¼¼’źj= TVVćįįj5Ņ®ĆTWéłys2õ¶X6##‡€Ąśt:-ĮĮžäåįééƾ}©ä£³Ó”( żśõ"?ÆČb›ųły‘˜xˆźŖœ]œ1¢?É{Žšc;n°ÅöQUÕbYkķcķ~Y‹ĮZ»©Šj1]ÆÆµx­×ßß»Umeķ¹²–>`@8ĮĮ(/Æ¢ŗZ»»k£¶õņv·›B!„WӇ~ČēŸĪĉ™5kV[‡#Äeé"īī.TVT£Õjšt†Ōčkˆpp°§““Ąbŗ££'7§Æü~ Uø¹¹õS4v'&økg¼½=ĢłŹŹ*)/Æ"(Čņ„K]šßŻĆW~޼O7Üܜ­ęӇģģʍAQ‹e½½ŻI?™MTTTU„  G'²³ ().cŅäøF1efęZl“ōōltZ-7_m±sēANŸĪiƒÉ„ķsņd–ŲݺY^˜ÉŚż²CHH€Õv³”®Õj-Ž_kēmm[Y{®šKŲŗe/łłÅ„…ćęęÜØm“’ćÕLY!„B!®–yóę1o޼¶Cˆ+Ņa:DŹŹ*ńõµ¾†ˆ““#z}y_ÆÆÅÉÉńĀvÓōʊjāččF FjjjŁņs2įį!ęi,&GRŅéŻ;Ōęø/͟šš‰›› cĘ`oņ1ާfŅ'²{‹õ7W6++Ÿµkv ³Óaļ`‡‹‹%Åeųvņ²¹­Ī—V›{ŽŸ6ŁĀ .KķckŁĖĮڵ«`1=$$ĄāżµvŽÖ¶•µēŖ¹tĄēĪ9~<“°ĻWsēB!„BŃX‡˜čU\|ž3™¹tk0ąRAA~ddœ5ļŸĪČ”k°æÕōći™vbō˜AÄĘF£ŃhPU0lLHbHlT“ĪØ1ܵ³Ķ±_š_U” C©ŖŠ¢(6Õo­luµž¦LI|üP u‚ƒ;ćķćAA~±ĶmåååŽææ77Ē5ŗuo<ĀĆZūŲRöJb°vķÖŅ­Ż_kēmm[µ6żŲ± öī=fN×iµ/tĄµt.!„B!„MµŪ"……Åüøz;ŖŖ¢Ńhø9~(ŽŽ(Šjq ??oŗtńćĒ·£ACHH€ł7ž–ŅUeēŽƒ–ąčą@÷Aü²;…ŹŹ*Ł•xČ\wddwz„c4* vv:ó1EQX»f'z}-55µüøz;C‡Fćēļm1ļˆnlß¾æ~„FƒN«5æIÄRž†¬•Õhąxźi<V«!*: ''‚ƒż)((fķŚõuŖŠ'²;]»v¶Ų&>¾žäå±1! ®>†įqżœvüŒ•ö ²XÖŃŃŽjū“&†ęŚĶRzII™Åū;qŅp«ĻIkŚŹŚse-ŻÓĖmŪöńćźķ@żŚ(1C"­šŽÜ3,„B!„¢±võŚ]!„ƒ¼vW!:.yķ®7¾ėåµ»bʌB!„B!DCŅ!"„B!„BˆG:D„B!„BŃįH‡ˆB!„B!:éB!„B!D‡Ón_»+„B!„W[AAA[‡ „øJnČ ~m‚Bˆ6U"? „B!Ä‘)3B!„B!„čp¤CD!„B!„Žtˆ!„B!„¢Ć‘!„B!„Bt87ä¢ŖĶŁŚ€ųĢü¶EX!÷HŃÅ,!łĮä¶C!Ä ¦¶¶–µk×6Iwrr¢S§NDFFāāāŅÖa^ńui4éŌ©įįįxxx\Óó’šĆh4¦OŸŽÖM!®cķr„ˆµ/ڦ/ā¦?oDWū6†v6Z£*ćūŸ£z²mčRžEÆońHGˆāŚ‹YÓčOÓö„Ÿ¶Žń‹C_šł”ĻÆ(ke-µƒBˆė“V«%,,Œ°°0zō聓“ŁŁŁģڵ UUŪ:¼& Y¹r%5556]Whh(ĪĪĪdgg³eĖņóm’N`비h­vŁ!"lŸ™Y)O>ŽWL,£vļgxĀtĪĪ¤æł· !D[J~0¹Ń§­­L]‰ŠŹŹŌ•mŠBˆ6¦ÓéčŪ·/}ūö„_æ~Œ3gggŹĖĖ)//oėššČĖĖkÕu 0€1cĘŠ·o_Ea’žż(ŠrUĻ%Dkµ»)3—£:ó4)O>NłŃÜ#£‰žĒ?qķf>¾1“3aO.ąō»’מį ]½Įœ ±³Ć="’Ž‹^Ć+&Ö|,āåŤ’c ZG"^}’‰“ėĻ—u†Ć|„ŠcG™÷ ’Zf=WČŃgž¤dW"NAAD.yρƒŪŗ‰šØH=Źą/¾Ewaų^÷ĒžŻSćéõģ ĶBˆėQĢņŠyˆO|Jwļī|zŪ§œ9†ÅŪs¤ąīüeĢ_čėߗ’żŸśœ¼Š<ź”:sēŹŠ”,ß»;­O {‚)½¦4{^O'O>Ś’ŽNޜę“9VG/Ÿ^<÷4żś[óŅQ ×CGBˆ+§ŖŖydˆV[’{ģŗŗ:ŅŅŅČĶĶ„ŗŗGGG:wīLdd$öööŌŌŌpäČ 1 ųųųŠ·o_ÜŻŻmŖCUUV­Z…»»; ąŠ”CTTTąęęʀšööfĒŽœ;w€õė×Ó§Oz÷īmÓu………qśōiŹĖĖ)..¦S§Nœ;wŽcĒŽqžüy4 ŽŽŽę˜­«¹2&†¼¼<Ž9BUUōė×ooo€ėČĻĻēųń攕•”Ŗ*žžžDDDąļļoóżh©Ѷ:ŌS§Ć„#"R_|ß1ć|Ÿ‘£I}ńł&eÕՌŽs~żÕŸ™ĻMĒ3 _ų ‡{ØQ™ŗóēµk?½¾Ā‰Å‹ĢéĒ_ś3¾£Ę0zo ZgēFeŽæōgfÜʘĒaGŸyҦkųµ¹GFsę£÷1TV`(;Oę{’¦ęlv‹Ē„ā×`źø“s ¹)3.v.løg}üś°hė"nø•MæŪğ†’‰W·½ Ą’ūå’1#b_üę vŻæ«Ń9tZė~»Ž—ƾÄ?w’³Å8gEĪāŻäw™5«QģÉ&“8/‘§āžā¹MĻ5gĆk½ōz­µƒBˆėŃhäšįĆ>|˜C‡±uėVjjjš÷÷ĒĶĶ UUٹs''Ož$$$„øø8"""ČĪĪ&)) EQŲ¹s'ŁŁŁ„††Eqq1;w®Ī¦:4 Z­–ššRRR ÄĻĻóēĻ“œ\’ó¤įŗ&ƒ&88øUןéé @ee%uuu$%%QVVĘ Aƒˆˆˆ   €={öX=WKeLEįäɓōģŁ“nŻŗQRRĀīŻ»1-ÖQWWgĪ;hŠ lŁbk[¶T‡h{2B(Ż»‡¾’z;W7BļˆķƛŽČčžųŲ¹ŗŃēµ%ę“āŪ9žŹ‹T<RWM£2”÷?ŒĪÅ’ÉÓ8üĒGĢé%æģ&ś­aēźFČ}÷“¾ōuó±¢ķ[É[½ ØĻÆŃ^Ÿ}VQK—‘śāsœž×Ūh]\™{?čt-Bˆ¶Ō\ĒĄŃw`§µć¹‘õiēŅxaóőmZMżæĒƌ…ļŽ}Ēźć«9WuŽßöż-ÅŌwˆĻŒ˜‰N«#®k…U…-Ę3±ēD&öœĄó›ź;ćW¦®äć“W‘‡A1 AÓlœB!ŚEQHOOo”Fdd$EEE”––āé鉏ŖŖāāāB@@YYYa4)//Ēßߟ>}ź;Ī+++9}ś48::¶X‡ÆÆ/P’e~Š Aø»»£( ėÖ­3w`ųųų˜G@ųłłįääŌźk…ś‘/öööL›6 UUŃh4ØŖJZZeee(Šbõ\Ķ•1ØQ…Įƒć|į—ŠÅÅŔ””P\\ŒŸŸ_³uFTUEÆ×SUU…··7£FBwį{͹sēZlKWW×fėmO:DldēźÖ$ķČü?Ņū„×č4>„VĻĻ‘aŽ›¦Œht:T£Ń¶iµŒ?–a.{½r鎃AŸ}mŽĻżī[Ü#ś“xL!®WvŚĘ?#:Epw滎u8:sśČ‘Œ ‰¢*ģĖŻĒS O™;DtŚ+’Ī[Io±ų¦Å Ģžœ=<±ž‰fćp“s$§<‡.ī]Śŗ…B\&{{{¦N @ZZG„ŗŗŚüå¹ŗŗ€²²2vķŚÕجN§£²²ŅÜŃŠš­4ŃŃŃDGG••Õb¦Ngž:¢Õjqrr¢®®£Ńhī øŖŖržüyÜÜÜP…#Gސ““CMMM£d­-&kk;;;sg€««+%%%ŌŌŌ“X‡““ƒ "--””s;„††ŅÆ_?›ī‡ÆÆo³uh.ł…ŗųõI‡ą98†3}@č¼9óįūx¶m5~cM >¾(µz2–żĆęóyĒ%sł;t{ų1²>śO£c¾£Ęrā×čłŌģ<<[}-C;_õé4ĶÕi(;Oюm¤½ŗˆW^·ł˜B\ļŽ]ȒKxqĖ‹TÖVõ#LLSmģ“vtqļĀSßŗŖē½·’½üyӟøoą}6•¹3śNęüwUuU2=F!ځ°°0N:ENN………ųłł™;9|||5j”År¦7·TVVšÓNœ8Ajj*‘‘‘xyyµXǵvźŌ)*++quuÅŪŪ›ōōtŅÓÓ ¦oß¾hµZ6lŲ€Į`°ZGFF†Me 555ęQ%8;;ŪTG×®]錵+z½žŅŅRNžĒŽ‘±Ō/l_/¤4łó¢®¶jųŗ]Ó¶-ē3åÕ::āÖ»/’•ĪSg“xL!ŚJs–Ž{óöä·m®ĒŚś¶žÓ“?oą<ę œgNæ·’½-ÖłXģc<ūŲÆŅŽB!®=NGŸ>}Ųæ?‡fÜøqųųųąééIQQÄßß߼اŖŖŒ3†N:įęęFaa!ĒŽĆŁŁ™'N Ńh ĀŃѱÅ:lŽąäɓ™*½”imÓȐ¢¢"t:ƒ 0w@TWW“››KNNööö Īž=K×®]›œĖ–2P?cļŽ½„„„PZZJii)...ųųųPTTŌlĪĪĪ$''Ó©S's}v¾·999Łt?ŹŹŹŲ³gÕ:DŪk—"­%įҽC¾ūŃźqkuŽv;·ŻnŽļ:÷~«eī;w !öū5؊BįĘ øõŗø"³½}’łŽe]wśŅ× ›’l«ŹŲŅN–ņ4W®„:vĀ!„B!š !==²²2222čŃ£#FŒ‘·OyIĒIDAT0æÕ$33;;;|}}éÓ§¹##..Ž#Gސ™™I]]ŽŽŽDGG›æ€ŪR‡-zōčAEEgΜĮÉÉÉj‡HƵQčŅ„ ½{÷6/¬Ś½{wŠŠŠ(**¢²²’ššpzöģÉžżūIMM„K—.MĪeKEQprr¢[·n=z”šš|}}éßæ?Z­¶Å:ʏOÆ^½ČĢĢ4/“źęęĘ AƒĢӊZjĖN:µX‡h[—3iIÓąõ*¦ą8Ī€ ązaŪ“ļŌ )æ£ŖŖ l9łŠ+˜3gN[·ŪŪŚV‹K0"—¼‰×ą!m’BÜ0ŅŅŅoė0„B“+V0sęL é–Öœ°”öŽŪKyāég©««E1*(ŠEQP•‹ŪŠb¼p¬~[UU¾žź+īŗļ!„W¦sēĪo5€žĀĒ“]ua»ؾ°oŚ6å« >jƒĶŚå‘A[æ6W!„B!„čČ®Ļwŗ !„B!„B\C2BD!„B!l“råŹ¶Aq•H‡ˆB!„BŲČŚā”BˆO»źłų揙;w.………¬]»ģķķ‰5ļ[³oß>rrr bąĄĶ¦[“””Daa!P’ęˆ#8uźG5ē©ØØ _æ~DEEQQQĮ–-[ššš`ōčѤ§§[Ģß§OvīÜIMM ...ÄÅÅ5[’ŗuė˜0a‰‰‰MŹj4vļŽMaa!Š¢FTTŌeµ•5¦&Mšd>WĆöŃh¬Æļk©}Zƒ¢(ŪMUU‹éĶÅÓŚkoķse)ŻYYŠ¢ąååÅȑ#Ńh4Śv’žż­ŠM!„B!:ŖvÕ!ҐŸŸS¦LąÜ¹s$$$pė­·Z}ßsAAL›6 €õė×SPP`>viŗæææÅzņņņ0LŸ>€„„rrr #,, €ŗŗ:ĢoHHII!<<œ¼¼WÖŅkkkqqqaŌØQlŲ°ÜÜ\üżżĶmŪŚŲ„B!„¢#k·" uźŌ‰ŠŠP233éÕ«Ÿ~ś)sēĪm”ēģŁ³tėÖͼ߭[7rrrPUÕbŗ§§'[¶lA§Óa0ššš ..Ž€€Ģłõz=...ĪõĖ/æ0`Ąģķķ6lYYYVćo˜ßĆƃņņrŖ««Ńh4TVVāįįa5’®]»ØŖŖbóęĶ 4ČbٌŒ Šét“››‹§§'ūöķ#??;;;E”_æ~äååYl???©ŖŖźG[Œ1‚={ö˜c7nœÅöQUÕbYkķcķ~Y‹ĮZ»™:ƒ.M×ėõﯵóśūū·Ŗ­¬=WÖŅ `ī¤1ÅėīīŽØm½½½­Ę&„B!:WWW¦L™Ā’ū_‹Æ¶ĘÉɉéÓ§óż÷ßcgggŽ6 6×qµ5ŒÉR·ß~;6l ¼¼¼Ķb7¶Ń!ąīīNEEZ­¶IgŌ1o8"ĀĮĮŅŅR‹éŽŽŽLœ8ќžż÷ßSQQ››P?E#))‰®]»6šgXVVFyyy³#"ŗ4懇l޼Ł›éœ–ņĒÄНĶųńćQÅbYoooNž¶–½Ü¬];`1=$$ÄāżµvŽÖ¶•µēŖ¹tĄēĪ;9~üx£ē«¹s !„B!„h¬Ctˆ“™™ÉąĮƒ­ę bĻž=ōéÓ€ŒŒ bccQUÕbzZZōķŪ—šš²²²PU£ŃHBB#FŒ°Ų“™™Ill¬Ķ±_š_Q”FŖŖ¢(ŠMõ[+[]]MHH#FŒ@QÖ­[Gpp0ēĪćȑ#6·Uii)555Œ9²Qžŗŗ:ó¶µöńņņ²X¶µ÷ĖZ )))VŪĶRŗµūkķ¼555­j+kĻ•µōcĒŽQUUe~†µZm“aƒÖĪ%„B!:UU %""GGGNœ8a~ƒææ?żśõĆĪĪƒĮĄ8wī\³õŠ·o_t:Š¢’’b^Čæ”©S§’””DQQ:ubÜøql޼™¢¢"|||ˆ‹‹ćĒ“ZŸé… YYYųśś’˜˜ŲØžž={Ņ»wo §Njėfķ@»ķ),,dõźÕØŖŠF£!>>GGGE±ø†ˆŸŸ]ŗtįĒ $$ÄüKéŖŖ²cĒ qpp Gģ޽›ŹŹŹżåŒŒ$,, £ŃˆŃhÄĪīb³+ŠĀš5kŠėõŌŌŌ°zõj†ŠæææÅülß¾7¢ŃhŠjµę7‰XŹßµ²†ŌŌT<ˆV«%::'''‚ƒƒ)((`ķŚµŲŁŁ”Ŗ*‘‘‘tķŚÕb›ųśś’ŸŸOBB:€øøøFń?~ÜjūX*ėččhµ}ZCsķf)½¤¤Äāż4i’Õē¤5meķ¹²–īååŶmŪX½z5Pæ6ʐ!Cuę4÷ !„BˆŽÅŁŁ™õė×ćććĆųńć9yņ$†øø8Ķ‹ļ1‚5kÖX­ĒŃёįƇ›’oģėė˘1cX»v­łM&¦ć¦Ó(jÓ~AAA³õ)Š‚ƒƒz½žķŪ·›’?õk£ 0€„„ŹŹŹˆˆˆhö͐BŲārž MƒŌwŖ˜>€#ą8.€ė…mÓ¾Sƒ<¦üŽŖŖ.°åä+V¬`Μ9mŻnB!ŚPZZšłM]B!:–+V0sęL ékKS®-„½÷öRžxśYr³3[uśŠ mŻĶ2-ŖŗjÕ*jkkųĶo~ĆO?ż„‡‡‘‘‘lŲ°ĮœҤI}ś4*3qāDŽ;ʙ3g»[·n²k×.FEff&!!!ģŲ±ƒįƇ›_"`­¾óēĻ3aĀV®\I]]]£EUƒƒƒ '!!Øļؙ1cėׯ—EUo@³gĻ~ Øō>¦ķŖ Ū@õ…}Ó¶)_-`hšP|lÖnGˆ!„B!„5ożķõ¶įšj8m@£Ńąä䄫«+S§NmtĢōöKK­SõkÕ9::Aß¾}8|ų0™™™DGG£Ńhpww'++‹ččh žĶŸ 88Ųj}P?‚žŅŲ”ž…¦ Ń¶—K:D„B!„Τ‰7·ŗĢś ?µuŲW¤¦¦†ņņņF/ 0±¶ĆĪ GGGó:{Ē.ŽÄ1QVV†ŖŖTTTŠ„Kjkk©®®n¶¾ęŌÖÖāąąŠØŒWJŪÖ!„B!„øöņóóquuÅĻĻ؟^3qāÄF –Źøøø˜×¦ėŌ©...õ! §%Š«W/ (**¢wļŽęü-ÕgMQQxzzÖģ[)…°…ŒB!„Bˆ ¶¶–ÄÄDś÷ļ½½=ŖŖrģŲ1jkk›!²k×.h~3Mbbb“i/&łłłōčуC‡pīÜ9"##Ķ#Iš«ĻZ ååå>|˜Ń£Gc49qāuuu²°Ŗø"²ØŖBˆŽ,Ŗ*„×ÕZTõr§Ģ\ q#ø^U•)3B!„B!„čpnČ)3*…m‚Bˆ6&? „B!ĕ"B!„B!„čp¤CD!„B!„Ī 9eF!„B!ŚĀ˜1cŚ:!ÄU"#D„B!„BŃį“»‘ŸB£ł)4ŗ­Ć͐{$„ø‘ Y>¹­CB!„×@»œ2ssfŠÅōŸB£¹93Åüēčj_Cńö]œ~÷CJ÷ģĆĪĶĻAčłĢøö k1“KćØŹČäų‹Æq~ß!tn.ųOЧ×óO¢ut4ē—!ĵ4dłdö<øĪü§) Ą^kGØW0O {€”ĮƒZ¬ĖTžZÄųİųmæ™|~č,Kśą²Ļeéz…B\žžžm‚ā*iw#DDėd~š ŻžĒ˜ƒ;±}=ž“nęĄ¼G[,wsfŠÕ™#O>gĢ@Fīž‰a +Ń9;qźĶ·õ„ !{\ǶyßóP̽,Śś¶‡U©ėQQY•ŗ”­CB!„čp¤CØĪĢ"ł7÷šsŸ!$’ęŖ3³’)4šSĖŽįē>CųeśŅ fSXvOMiņžFDz>ł’­żG°}Č8 7lŗx¾¬³ģ¹ķ·üĆÉ%Ė–Ø=WÄĮß?ĘĻ‘CŁ+ē÷¼¦×>š“wń5­£Ę=ĘŖjt.ĪWTgEj”ĢÅĪĶ {Oŗ=öė6^ÓėBˆÖPUŌ‹ūC–Oęƒ}_2śĆŪø÷ū?6JætŹLzńię­üqLot,ėüYłńYFxw|ū0‡ R[ŒĆÓɃö·“g“sū`÷|÷8óŽšĘŽńŅ–„,üy)KvJG³B!ĕčP"¦ —ŽlH}q1¾cF0:y >#‡“śāā&e•źFķł~Qź»93…ńĒ÷Ń{į3~l~£2†óeŒÜõį ŸįÄāæ›ÓÓ^ś+¾£ā½w+:g§FeŽæōW:Ϙ̘Ū įiž{wU}/ž’uf²ļ!$$$@$@Ą²Xdß­õ*āO¤ŽJ±\¬V«¶÷ŪŚ–Ś[•[·‚TŌR[ õb]k!Į` Y da I Yf’L2s~„9ĢLf’™dBXŽĻĒc3ē3ē|Īēó™ż=ŸåŲ3ær«ݱ-i$Ū„‘yÓTNæż.£’üF·ņ Mʙ?’ ³Į@k]=§ž“¦³e^+ÆBtĘ:lÄqųČų7æĖŌw²nß_łÅō'ģī ō `˃'5:„]>¶~óÕĖÜ:d;¾’O»ūżÕX0lŪzŸĒ'>Āó™ÆvZĪ{RoēOūŽåž·ŪsﲓõšĒüä–ņóķ’ĄS·,§ŅXĆKYoPÕXƓŲi}…B!„k×ä"žŖżę7®y }p0‰?XĀ×g·ŪgŠŹe胃öü/µ“ź¬lŽÆzcA1––P»cšś @b¾;—#=­„×ä|ƈW~>8˜„ļ?@įź×/å¹s7ē>Ż<€¢ėł˜ÕģSGP[[iœ™wĆtęŻ0€’Žž{>ŹŪĀ_¾}Ÿņ† Z-­(“å£×éY1~)K>|Œw¾†^§ļķęB!„øŖI@ÄMśąąviGŸś¤üźgō9Õd"#õfūc.=Qō:T³Å½étĢ8¶·ŪĆV<„ųų4(‰!æxšÆæ3«[y JbĢ_ßŌ¶Ėžł)!ĆRŗ‘£Bō<{‰É‘ł$’ æ _›c†õ½ŅībbĀXüō~].Ē«Łoń»YĻrS\{Kæå‰-ĻŠÜjbUę+LNœĄŖĢWŲpēĖŻ:B!ÄõNž¶ĀĒŽę̟ßĆl0rśæ>v“[Ē™›šńė‰j2Qōź:·Ļ9a,§ŽÜ€Ł`ä̟’nw_Ō”[(xįZėź»TOWo9øģĒŌ8„„„SE%ÅÆ¾AXŚČnåiÕZWĻłĻ·rā·/’“li—ņBˆŽb;ˆķķ’7ķq>?‘ĪŌwŚĶ!ņĖé?įŸĒ>gī_ļw:÷ˆ»u’½ż÷|÷o‹)Ŗ9„„搵†äČ$^¾õ×$G&ńĀ×kz»‰„B!®jŅCś«Ÿ‘ūäsrĶzBR‡1āŸwėø”_>Ć”>ŽŚŚŹąŸt¾2‹vÜÆ~Ę‘Ēžęōś $ž` ŠĻ„nĻCõ,yĻżŽ¬Éóh©­ܟ/ä¾DŒćQŻ,žŽ’ś÷Ō9†OxQS&2ņõ;=Ī6Hb½m-§u[ēļOČŠś›’¦ß÷ęyüø!„7u4\ĘŁ}®öŅgī|„]ś€°8^żīŖ.—Ēŗżš˜E<}Āšõõaü„TmŪ•ūó)-­ ’hFŚaŗ+ŁŁ‡©¬ø@Dd(“&¢øč,Gkū44¹1m#F ¦”ĮȎßĢŌ©7PTXāt’įƱ+ė MĶpĖ-ięæåß»˜3÷;ģŽuØŻ±Š¢³ē°X,$' uÄą.µ•+Ö2Ģ»u"{öi×>Š¢ø<ÖYūxZ‹EuŚnŖŠÓōŽŹćiŻ=}^9K·–æ®®‹E%""”I“ŪŚĶ¶mæ=pÜ£² !„B!Äõźš ˆŲŠŽīĆwo»€ŖŹ |¹u īœN@€ŸÓżĻŸÆęüłj¾w{Ū“_lŁĶłó5€ź4=&&Ņi>ååU˜ĶnŸ?€­[³)-­dpņ' „„•/·f“’’@ī‘"RR’(/ÆŌņqµIÉ9Z[ĶĢ™s3éŪ÷röl…Ėż[[ĶŌÕø÷Ž9œ>]īōX‹ÅB}½‘ļŻ>³ŁĀ'E’1„‡‡xŌV®ŚÄ¶ ®Ś§’h—„³öń“ ®ŚĶb±8M0 Ę+u÷ōyå*Żd2Ąä)£ŪŅæŲMYY%11}“¶õ“lB!„Bq=»f"¶¢śF˜Ē©Se ’Č_ßż-½ŻnŸŅ³$ ŒÓ¶“ʵżÓ®ŖNÓĆÃٱć|ōzZZĶ„…sĖ-iÄĘF„ķojn!(Čßī\{sr5:_ß¶ęæł;#9sęœĖņŪīB}½ĘĘf †FĀĀ‚]ū0Ęf2Ņ÷1ꦔN-..%6®/z½Žb(/«"<<„żūó8®½‹ÅBZŚĪ•W9m“ččvķ:D£± €Ą &Mž½Gµ2LŸ1ÖiūØŖźōXWķćźńrUWķ¦ZT§éĶĶ&§Æ«óĘÄDzŌV®žW®ŅGNaĄ€¶%Žźė466l×¶‘”.Ė&„B!DoųĶo~Ć£>Jtt4ƒ'Ÿ|’—^z‰ŠŠP*++yżõ׳õÆķōŲŗŗ:Ö®]˳Ļ>ŪŪÕšXqq1«WÆfŊ¤¦¦:ŻēŻwßeüųń >¼ÓüųūߒβeĖÜ:EE«V­"1±ķOųęęfRSSYøp”Wźg6›yź©§xłå—/S‹öŒė" „””Ni hj6ŁõˆšóóåĀ…z§éžž~Ģ›7QK’čĆ44 چhģÉ>Ģ€„~DF†iūÕÕØÆ7ŅææóŽ÷ ",,˜Œō½„…‡čr’±ć†SRrž3Ēa±XœJaA #F FUUΟÆĮ?Ą’’óŌT×qėwo±+Ó©SeNŪ¤°°½NĒ싽-²²rņd©]¬Ū§ ąŒÓcŒwŚ.®/WeHLŒuŁnĪŅu:ÓĒ×Õy=m+WĻ«ŽŅ¾Śń ēĪU“œ<€@»¶ĶĪ>LDĒ !„Bq¹„¦¦’——Gtt4yyyōļߟüü|ʍG~~>#FŒčķ"vØ„„…·ß~›åĖ—{t\zz:‹/fĒŽ."ž q;bĻSO=€ŖŖ¼öŚkäęęŗÕęÕ[Æ×ćėėŪķzõ¶ė& RWg *Źõ"ž47·hŪĶĶ&ü/ŽnŸnhhd×®ƒųūūĮŞ­­fššLģČŲGJJ¢6ŒÅ*÷H!C‡&¹]nĒżóņNÄ“écųfß1ņóN1>>ž÷Ć?¤ØØˆ>ų€… :=—^Æ·;¦®®ŽŖŖ*&MšÄīŻ»©©©!22“ÉÄśõėŃėõRUU@~~~§emllŌzĖäēē³mŪ6BCC1FV®\Ła€BQ©ŖŖĀ`0°aĆ|}}inn&::šE‹‘••Å”C‡ŠétDFFjõ.**⁠>>žŠŠ Ž~ūmž}öYzūéÕm×Å*3ÕÕµœ>UĘ@›įŽś÷¦øų¬¶}²ø”„1.ÓóŸ".®/S§ŻÄ„ #QUmė:ōåÖlĘOŃ.m=$ōs»ģŽū« õR¤@UU,‹[ł»:¶±±™ÄÄXnūŽdę̹™Ö–V čGdŸ0Ο«v»­""B‰‰‰döœ›µĖĄAö=<\µ;Ēv§ ®źī*ŻÕćėź¼ž¶•§éĒŽóĶ7Ē“t½N‡łb®³s !„BŃ[† BqqŪā§OŸfüųń”––PPP@JJ {÷īEÆ×³|łr­Gģņ9zō(„„„<öŲc,_¾œ+V0dČrrrŠét<śč£,_¾œĄĄ@rrrP…śśz|šAž|ņIvģŲĮģŁ³Y¶lœQį”Ÿ«āĖ­ŁZ”tā-ivå9žŚEūōwz¬ææÆĖöń¤ µ›³ōšš:§ļ¼['ŗ|žxŅV®žW®ŅĆ#BÉĢÜĻgŸīŚęF7>Õ&˜ÓŃsX!„BˆŽąėė« — E§ÓA~~>QQQųłłQVVĘńćĒY·nĖ|Īž=«Ķ‡aėܹs$$$hŪńńńœ?žØØ(bcc¶į”””DF¶Ķ­ˆÉdrė¼īœĖ–ŁlfļŽ½„‡‡“••@MM óēϧŖŖŠ~żśŁoÕYYÅĒĒk+c†††:ݧ““”?üį(ŠBhh(‹-"66–šš6nÜHpp0Š¢P[[«o[>«1cʹ駟ŅÜÜĢįƇyę™g®‰"×T@Ä䈎ŽdÉC·;ŻĒÕ"£F§0jtŠ[éŃёܹpŗÓ|¬ĆWéõ:ų’¾ėP¶āŠ;ūūųč™1cœŪūūśśpĻĢźōXėœŽnŗi˜Ūm„(Š6Ŗ#k†§rŁ>®ŽuÕ>ž–ĮUŻ„wōųŗzžxŅVž¦ūųč™9s|‡mŪQžB!„Bō–#F°uėVmīŠ””»ķųųx ‹/¶;®®®N»Żæ222Śåk×;¢¤¤„Įƒ»U.Wēudķ‘ļιöļßOZZwß}·–öᇲoß>"##9w®m±UU)))éŃvē'?łI»ō¬¬,†ʬY³0 äęęj“źt—‘Xė­×ė7nļæ’>C† цę<łä“=ZžĖįŗ2#„B!„¢w¤¦¦’››KJJŪwC‡åȑ#Śd£ćʍCQÖ®]ĖśõėYæ~½]0ĚGRRƼņ kÖ¬a͚5äęę2~üx, ėÖ­cŻŗu˜Ķf&L˜ąV¹Ü9oŸ>}ج¬dƆ n+==‰'Ś„Mœ8‘ŒŒ n¾łfJKKY³f ļ¼óįįįv=¾/—o¼‘={öšÖ[ońńĒ3vģX6oŽģ²ŽÓ¦Mc×®]ŚP ––mĀÖ«™ŅÅc›c}l.~€?A@šÅŪÖķ›}¬ūū«Ŗś“;'ß“i÷-šåĪ®B!®Q'Ž×0$E–”BˆėŃ?6mē®»īh÷cŅŁKgizm5·Ī›ķń¹·|±E=ŅŪM ÄeWVVĘęĶ›Y¹r„Wņ‹‹‹{hš/^¬·o7·­·­ū™€V› “-Éa½øķš2#„B!„BļŁŗu+䔇źķ¢xD„B!„BįŌܹs™;wno£GČ"B!„B!„øīH@D!„B!„ם«rČĢ?6mļķ"!„čeū÷÷v „BįJEE«V­bĄ€véwÜqƆ ėķāuØ””æ’żļ,[¶Ģ+ł½ū?žįƇ÷č¹[ŹJ©~k>żśiiĆR 7ŗO>"bŃåg*.Äø7‡ˆ{ļ·K· ]ŹļJtUDfΜŁŪEB!„Bō‚ōōōŽ.‚pS||KĘŅܤå×|"Ÿ†ō/…Š9óš|Co?½<"!„B!„^WZZŹźÕ«ķŅžxā &MšDvv6wÜq»wļfŹ”)ģŻ»½^ĻņåĖŲøq#@QEį‡?ü!ūöķ#33“E‹±k×.¦NJNN:ŽG}€M›6‘““CTTÕÕÕüčG?BQŽ|óM ©««szž1cĘ8­Cnn.'NdōčŃZÅ*88˜+VhŪĻ?’<ÕÕÕ=z”~żśqĻ=÷°jÕ* ­·E}}=’õ_’…ŁlęĒ?ž1«V­"22’õė×sņäIśŁ wQÅi:rŌr¶„Ŗ7×hŪA㿃’”KŪ'sįļŘ½ ó…BożžŻńAcoĘ\YEč­ßĆT\ˆ„Į@ŲŅG@QøšžFLgNįs©Œ¦Ē 3Ž€į©˜ėėzū)ē1 ˆ!„B!„šŗųųxžzź©vé&Lą…^ąöŪoēąĮƒüüē?ēß’ž7ĒgŻŗuķö· ƌƧŸ~Jss3‡ę™gžįóĻ?'!!Įīœēϟ'**ŠųųxmČGhh(&“‰²²2—ēqfīܹl޼™Ż»wsļ½÷ŚŻWSSĆʍ FQjkk1™LTUUŁ6āććµŪ±±±čõzBCC‰ŒŒ 00“Éä“ ėŠgCf, õvŪĮ3fQõĒ—éūŲStʧ_,\<æ.0ÕŌbwŠä©Ōołū÷ö½nµé•D"B!„B!.ųā‹/HIIĮĻĻųųx ‹/¶Ūw×®]čtm‹£źõzʍĒūļæĻ!Cšõõ%66–ĀĀBm’’’ģņÜ®ĪćŹéÓ§yą(**bŪ¶mvó{dee1tčPf͚…Į` 77UU‰ŒŒäܹsØŖJIIIo7ł% õ[žEäK©ūüś,żš@T³Ūٵ––¾ą.L§OcČŚyÕĶ-"!„B!„^WZZŹ‹/¾h—6~üxf̘Įäɓyłå—yöŁg7n¬]»V›#ć¾ūīk—ē“iÓxę™gxī¹ē“üNœ8”õųfĀ„ 8-“«ó„……9Żæ©©‰×_NǬY³ģī»ńĘyļ½÷(..&((ˆ±cDzyóf–-[Ɵžō'Ö¬YC@@įįᨪźµvµX,<ńļśź«Ū°ķ F܈źZkŖiŲö!snÕīׇGŠZUMķļxÓŲNóS››ØžĖ;(:Į·LöZ/„‹Ē(6ĒśŲ\ü ‚€ą‹·­Ū6ūX÷÷WUÕ­é‡7mŚ$«Ģ!„B\A>śč£Ž.BŗóĪ;{»ĀFzz:wŻu@»™Ī~t:KūÓk«¹uŽlĻ½å‹m,z葮n‚ėZYY›7ofåŹ•½]Ń qqqÆM@óŋõ¶ńāķ ńā¶õ¶u?ŠjsPm.n“"B!„¢Ūzk‰ŹžVTTŌŪEB\“uėV<ČC=ŌŪE× ˆ!„BˆkŅ…Źņ.ū?/¼Ä /żooWAacīÜ¹Ģ;··‹!®!×T@¤¦¦†ÜÜ\š››QU† Fll,F£‘ŒŒ ¾÷½ļu’DšššŲŗu+wÜq‡×ņlll$//Ó§O3yņd¢¢¢\ī{žüyrss1™LųūūsÓM7¹ēJvv6õõõ̚5K›“Č[y !ÄõFUU>žųc“4FŒALLL·óļ‰ĻŽŖKW}ņÉ'n×’¹ēž#((Hū|SU•˜˜¾ūŻļŚ­ ®M}c=>fĆ;ė=>ʓēäĒLbb¢Ż2ŸŖŖņÉ'Ÿ°`A×ViČĢĢdźŌ©viWźėW!\šŽD+nŗ¦"{öģaĀ„ ōéÓ€ŹŹJ²³³{<ŠĄüłó½šgAA}ūö„ŗŗŗĆżšššŲ»w/“&M"""‚3gΰgĻfĻž­-ĻŌ‹ÅByy9óēĻ· †x#o!„øžM›6ĄĄ@***ČÉÉaöģŁųūūw+ߞųÜé­ŗ\.<ņˆöż@UUvķŚÅʍyüńĒ{»hā2čNO‘ž Ó騪Ŗ¢ŗŗZ{^vGkk+MMM.ļæŚ_æBŃSz: rŁ"<ŖŖb2™°X,ZZß¾}¹ķ¶ŪŠét“¶¶¢( EEEœ9s†ĘĘF ÄŠ”C¶žĒŽÓņ²ö,łā‹/˜4i!!!ŌÖ֒‘‘ĮŒ3Ēh4’™™ÉōéÓµź »vķ"99™3gĪŠÜÜLRR’vžāābŠŠŠšõõ%>>ž“'O2aĀ„v½.n¼ńFŽ?Ža½«««‰ˆˆ ""€„„Ž;ʅ “5­­\Õq’žż@Ū’V“&MŅ‚"īę}įĀ8@XXF£‘)S¦t«=o½õVņņņ(++CQ, żśõ#55U1Bˆ«Vtt4AAATWWŲī}³²²’£G¢Ŗ*Š¢ššJß¾}پ};iiiDGGSYYÉĮƒ™4i’]Wļ¹µµµģٳĒīżė_̘1ƒ   .æ×ŚÖ%..Ž’’Nœ8¢(ØŖJZZšÖ³±£Ļ=WuīiŠ¢––Ę–-[hmmÅĒLJ‚‚¶oß®µįōéÓ6l«WÆféŅ„ōķŪ—²²2Ö®]ˊ+ˆåĀ… ¬_枟žō§dddpģŲ1ķ;GJJ sę̱kĖóēĻóŽ{ļ1fĢņņņhlldāĉ|ē;ßŃŚźĖ/æŌŚcīܹ 8ŅŅR>üšCbcc©®®ę‘Gq;ĻƇ³sēNķ±¹ķ¶Ū8p 999dggHjj*ūöķcŃ¢Eōė×ĻeY, Ļ=÷O>ł¤öż #§NbéŅ„$''óÖ[oiéæżķoIOOGQf͚ÅĻžóÜÆ$‹…o¼‘ƒ2}śt§Æ9WƏ#GŽ`±XHKKćŪoæÅ×ח .ŠŌŌÄžżū¹é¦›:<÷ÕžśBoŗfzˆ(ŠĀšįĆŁ½{7±±±ÄÄÄŠÆ_?».‚­­­čt:¦M›Fcc#_~ł%ƒ BUUöīŻĖŌ©S Å`0°cĒf͚ELL UUU„„„PYYIß¾}©ŖŖ"<<œŖŖŖvŻ E”±±ŃéyZ[[ÉĶĶeöģŁpāÄ ŒFc·~ä;›5Ūßߟ††» Ess³Ė:Ž3†’’&OžlWwóÖét4440xš`’’’:<—;ķY]]Mii)3fĢŠ¾¤ēååa4 īķ§šBt™ÅbA§Óµ{ß4™LZ¼°°0źźźČŹŹbΜ9ZoĮččh§Ÿ;½ēv¤»ļµÖŗ˜Ķf:ÄōéÓ ¢¼¼œżū÷3gĪŒF£ĖϽŽźģćÓ³_OÉĢĢ$11 ļæ’><ņŃŃŃTWWóĘošŲc‘œœĢéÓ§éŪ·/'OždąĄœżśõ£¼¼œæüå/<žųćčõzŖŖŖ˜8q"wß}·]]:Ź3$$„Ļ>ūŒG}”ˆˆņņņųšĆyā‰'øpį[·nå±Ē#,,ŒÆæžšššt:F£ŃeYüżżYµj•ŪmżśėƳtéRvīÜ©„egg“­ ęĻŸĻž={øłę›{ōqæŅÄÄÄpźŌ)Š‹‹nøįvģŲAJJ eee̜9“ęęf²³³; †X]ĶÆ_!„š&]÷³ør 2„ٳgCee%}śOqq1ÉÉɜ:u €“'OrĖ-·pņäI ķßónøĄĄ@źėėŁ·o.\@Æ×3gΜv=5”ķO„Q£FNBB§OŸÖŹ`Ó$66–¾}ūR\\ “}·=z“Óŗ¹ŹÓĻĻŸżģgZOށR]]ŖŖœ÷:ŖsO°Ī!¢Ŗ*o¾ł&qqqŚĄ††ķ¶UPP Œ5ŠŒŒ TU„¢¢‚aƆ±mŪ6 m8Čܹs féŅ„dggk=!ʍĒŌ©SŪµe@@z½^Ū Ōžu/))a͚5vū›Ķfm?Ūy¾ÜÉSUUŅÓÓ)**ĀĒĒG{lTUÅ`0ŲÕŁ××WūaŻŠŠŠaYŗ«ŖŖŠ””mŪŚ{årØ©(süØ©(»,ēwČąĮƒ9räˆ]ļŽĪ^ńńńjC¬;s%¾~»ņžzµqücVˆė5@ßM—mźīDTąŠłuŚŅŅ‚Ńh$<<\KÓėõŠŌŌŌįŹ(žžžķĶĶĶųūūćļļ^Ƨ¢¢BūbBEE>>>ZļwųśśŅŅŅ¢m·¶¶b2™<Ŗgrr2ÉÉÉvińńńÄĒĒm_r¾ųā »v謎q'oo·'“żĆeyŻ`0°oß>‚‚‚HHH𨽄ĀņņņHLLōųĖ»ķD†  22’[n¹Ååżåå儆†āććcéč=א·RUÕīXOŽk]ÕåģŁ³”——3uźTōz=MMMlٲčųsƳ:÷EQøõÖ[Łøq##GŽ$ € ƒŻ~ƒŠŠP‚ƒƒńõõ„ØØˆččhE!**Š¢¢"üżżµ5qqq,\øhėÉóžūļŽ®WGSS“6ē“ ß BÆ×Óæ–.]Ś®ĢēĪėšWyęę꒗—DzeĖšõõ„””^xhū!nūż„¹¹£Ń“}.»*‹78Nļ¬ēSOr ŠōV0Äź†n ##CėA æ>Š‹‹µ^LīLŹz%¾~[ZZ(,,dŲ°a½Ó𗁗~ !zŠå2£ŗøén3|żõ×v&åååTWWwød-“M.U[[K}}=õõõŌÕÕiĪŃŃќ8qBĖ'**Š'NxüįŻ§OŖŖŖ“/®§Nrło»ZZZČĢĢŌ¾ŌŅ®ĖsguģNŽŽnϲ²2ņóóµü‚ƒƒ p:§‰Bō“3gΐ——ĒÖ­[łč£ģ.GŽńŹ9¢££ķ†(677³cĒķĒGtt“öƒÜٱ®Žs0™LŚūøuØxļ½¶„„E v«ŖJAAŠÖ› £Ļ½ĪźÜ“’’’HLLŌžŻNNN¦¼¼œŠŠ  mRyy¹6D 99™;wj“‘&%%‘™™©żAqōčQķxhėQę“-Ķf3‡Ö«’’ Drr2eee”—·­†ŅŠŠĄo¼”):ā*Ϧ¦&BBBšõõÅb±šõ×_£( ---$$$pźŌ)-ōĶ7ßh½LŗSwĢ™3‡>ųUUQU•žóŸĢ›7ÆĒw[Ö HoC ­×FZZ‡rėõQ__OMM cĒŽ„¢¢‚††m>O]®×ļ‘#GڽnŻŗ•¼¼<Μ9ÓہāŹęĪ“.’P¼f†Ģ„‡‡3vģXŽ9Bss3ŖŖČĶ7ßLhhh‡āžžžŒ?^[mŚŗŗZ{+ÄÄÄPPP@jj*ŠöžČ‘# 2Ä£2†††rĆ 7™™I`` żū÷ĒĻĻĻ鰙ōōtL&ĶĶĶäää (ŠŻ’ĀV¾¾¾$$$°sēN, aaaŒ7Ī£:ŗśu7oo·gtt4eee¤§§kŠŃŃŃŅ;DŃ+0$$$“Vį-~~~L˜0 Ŗ*‹…!C†hŻÕ£££)((`ųšįķŽķģ=7%%…ĢĢLüżż‰'00P{_õĘ{m’žż)))!==___RSS©ÆÆ';;›É“'»üÜė¬Ī=mīܹ¬]»–ńćĒÓ·o_ī½÷^žłĻj÷ß{ļ½ŚÉÉÉ|żõ׌j=IIIlٲ…©S§j÷ēååńĒ?žQš2xš`§’‡††RQQĮ›o¾ISSóęĶÓz^.Z“ˆ?ž‹Å‚ÅbaҤIiĮ.W\å9räH<Č’ųG™3g޶*ĶĆ?ĢäɓyóĶ7 #--ĄĄ@üüü rYOV™1™LĢ;—źźj***˜>}:/¾ų"&L`ęĢ™Ģœ9EQøżöŪµžJ—Ó• ±ŠŽŽ&44T{¬;z}:tˆAƒ”×ėIJJ"??Ÿ1cĘąēēGff¦ö¼tĒåzżŽ9’‘#GŚ„FΜ9#ß~]’vweȋbsœB[PÅzńü/^‚€@ ųāµu;šā~6ūś©ŖśŒ;'ß“i3gĪģķvė‹Å¢M§( uuuģŚµ‹yóęÉÜBq…³.Ļ*ÜדŸ{Ÿ|ņ‰¶ģšÕ¢¢¢‚ 6šÓŸž“×ólmmåŌ©S 4NGyy9ļ¾ū.?żéO»ōŲ|ōŃG,[¶¬ĒŪŠS*ˉčĖ…ŹrĻźóɧ;–Ē /ż/EEE„„„tzĢÕųœģHOoķĪ{jzz:wŻuŠ~UDg=³œ„żéµÕÜ:o¶ĒēŽņÅ6=ōˆĒĒ !ģÅÅŽ 4Ķ/ÖŪʋ· o/Žn“ŁĒ“Ś\¬/r-=łĶNu±ķ8„ęŠˆ ]:ŽóēĻsäČ­[źųńć%"„W †xN>÷®\z½ž'Nšļ’[› ž¾ūī“ĒFhzśõ+ļ©B':šn£GāŽz'rŲp·×MPı» Bq-“ϽK¢££½Ś;¤;yZ'—½lxg}oįŖ%Æ_!DR=øÆĒāŽĶŗ Š8ė¢rõB!„w\KCDĻłŸ^ŗlē’ē¤BxĢY\ ³%^#x# āŖ€t’īŖŅB!„BtŪ /żooA\Į¶|±­·‹ŠćΜ9ĆźÕ«éßææ––––vUō+..fõźÕ¬X±B[ŒĮ[Ž?ĪĪ;łĻ’üĻ.ęĢ6oތÉdĀd2‘––Ęüłó»½‚hgå;uź/æü2 Ś&V_øp!  ¢¢‚U«V‘˜˜“­ž4eʧ-WUUńē?’™˜˜–,YŅaY¬s;k«Ļ?’œcĒŽ”( Ɔ ć¶Ūnó¤š*®;KtwŠŪzzgŃĒt‹7*"„B!zOQQQoA<žĢ/<>ę•Võv±=–””ÄO~ņ·ömiiįķ·ßfłņå½]lŅÓÓY¼x1;vģšz@čņ|8F£‘7ŽxƒG}”„„, ļ¼ó‡vŗŗ˜·Ė7hŠ ~üćm™7ŽxƒŸżģgÄĒĒóŌSOŠŌŌijĻ>ė4 ’‘‘Į¤I“8qāD‡e°.×īLQQ………<łä“¼žśė3hŠ w«ØŅqP.ĆȒĖ9›‘cÄā&„B!®BwŽygoAˆ.1·¶“-/m6c±“b1›1;l[ļWÕkē'Ė”C‡ČĶĶåžūļąķ·ßfŹ”)|ūķ·ńĮ°pįBŽ{ļ=P–,YBAAŪ¶m#44£ŃˆŃhdåŹ•ųśśjł[,–. PWWGUU“&Mb÷īŻŌŌŌÉŃ£Gپ};!!!F, Ė–-£µµ• 6ąėėKss3ŃŃŃ,Z“€Ļ>ūŒ¢¢"üüü0›ĶŚźµµµüõÆ„®®Ž¦¦&{ģ1|||Ų“iµµµ„‡‡kmduųšaFŒ”-­ÓéųĮ~Ša½sss¶wJJŠGås”ĄØQ£8xš )))vķśōibcc>ž÷Üs¹¹¹>GŖŖŖČĪĪęž{īaūöķķīĻĖ˳[2}ōčŃäååyqŒ8Ę.K§ oDŌn\®w!„B!„øBœ:uŠ_|QŪž:u*AAAN÷ Ą¦M›ČÉÉ!**Šźźj~ō£”( o¾ł&……… 6LĖ'''§ĖĒdff2mŚ4fΜÉW_}ŝwމ¢(TWW³bÅ t:ļæ’>999L™2…+VhĒ?’üóTWWS^^Niii»`ĀńćĒihhąĒ?ž1:Ž·ß~›ĀĀBźźźŠėõZ™7rąĄ»ž555DEE9m?Wõvŗ’Ń£G=*_```»<¬m PZZŹžš˜4iR—Ÿ7ūŪßX¼x1f³Łéżƒ~żśiŪAAA”—{“Ĺ³ˆ»Æén@¤³Āø ‘!3B!„BįeΆĢ:tØÓćĪ;§õ‚€¶įēϟ'**Šųųxm(Ehh(&“ÉkǚĶföīŻKxx8YYY@[bžüł$&&jsuÄÅÅQ]]MMM 7n$88EQØ­­Åd2qöģYmN GńńńZ>AAA˜L&ŹŹŹ8~ü8ėÖ­sŁ.aaaxŌf®zMxZ>g‘ŠŠ ķœńńńvõ[o½Å·ß~ĖčŃ£;}¼mmß¾#FĻ™3gœīcķ„ce0 õä4®z…øüčhy^t% ¢Š“4NJ9ūc½Ļl³m¹ø-„B!„¢‡łłła0PU•³gĻj÷Y,m÷ccc),,ŌŅKJJśč#¦L™Ąøė®»<9ū؁mŒĄÕ<"‡tGGzrŁ]ĒB;F€Ģ6 Cf„B!„½" (Ųå}ēĪžģķāyŻąĮƒłģ³ĻX·nĮĮĮÄÄÄ Ŗ*}śō”²²’ 6°dÉNœ8”õ–fĀ„ .{GŲ?~|—MOOēĮ“K›8q"6l`Į‚ńī»ļb41›Ķ,X°€²²2Ž{ļ=Š‹‹ bģŲ±l޼™•+WRTTÄ+Ƽ¢ĶS2}śōvs–X7Ž‚‚Ö®]«ķsß}÷¦ķ̊+ųæ’ū?­wˈ#;v,€Óz·¶¶:mļŌŌTŹ—Vß±X,čt:–/_Npp0F£‘ŅŅRVÆ^ @kk+IIIZ¹¬Ģf3/æü2ƒ††VÆ^ĶŻwßMRRO<ńƾś* ,Šö?sę [·neƌX,mŸ¤¤$†ŹźÕ«Q…““4»Ž1n°vŒ°^œĶ%āl4‰WG—tmj]°]OHO[`Eų]¼ų@ tń:ĄęāēxQUõwīœxÓ¦MެæB!„ā*cż'ZUķ9n»JūÓk«yü™_ŲMŖź,(RQvŚnRÕlÜČ¢‡éķź_·Ž;ĘŽ½{;]*V\łāāā~4¦‹×ÖŪ@ÓÅkėÅp1Ķŗ‰¶ J+ö£M<īhŃ=D\Ķb;<Ęģp»ÕŻXg B!„B\ŗ˜čī±ŽdlØ%($\Ū®:‹YFö ŃC¬Į ŪQ#­ŲĒ\Ķ1ā5] ˆ8Ī#¢Ś\; „˜Ü6ÓÖÓ¤ū'B!„BqŁ5ŌVއšŹsX,n’g+.“įƇ3|ųšŽ.†š³“‹ķōށO&Zu›·zˆt6Ŗ5b ~č/^+\ Š!„B!DÆŖ­©”ž!Bō¼›K«ĆÅ6†ą±ņŹ<¤Ž2c[HĒį1­6ל‹•¶ö0Qčś\&B!„B!„øŗ˜ø1q)b qRćlµ™néN@ÄÕņ»Ž‘Ö‹ē1q©WˆA„B!„BˆėS+—‚"Ž×޽EēqŌåyE¼ŁCÄÕä©Ö(5b-¬mńB!„ā²5ę&^ya÷ŻæŪĒücćFF¹©·‹.ĵº²Œ5ā±F¬1Ē9E¼¢»ljMœõŃaß3‡c$ "„B!„ølĘÜ4h røkԘ›sÓXšdöC!¼Įv©]Ē^"Ž=EœC¼²źLW‡­Ųg;IŖŽ¶ ‹šü.nūž6·}mī·^ū9ÜoĶĒĒ&ożÅ‹‚} EV©B!„B!.׫Ģ:ޱcķżįŲ;¤Õ!ݱ·ˆ‰ö½E¬ó‹Ų–É#Ž\eĘB[pĀzm-,\  ŲܶĮW¦±īćCū•ilƒ :›ü‡s !„B!„Ā{T'׎æå-“bĘ>ĄŃQšĆŁź3ÖülĻŁmŽ ˆXē± ˆ(ū8N†āGūh’cćé°ļ!b ~Xƒ!:$"„B!„B\.Ά®8öQ±ˆŲ;\ ‘1Łģėø og“«zĢŪ¹@¬AŪ^8I·­„ce¬f]¢×:dF”ż*5­V#A!„B!„Ā;ŌŅƒ"¶1ĒW¬½C!¶Ēž!Īz”t;(āĶUf ż°Ūń‘i‚ÄgCĮ-UŠJ7^£ R­ÆŌISÕ7—ŚoSĢņ£‰ŁŻrKµĮŖ>·4Ķ`–=ō\ŗĢkV[oYīŪ•uƒ[©:ėi«±e—fĢFµž*Čdń ‰š¬ܒėŒk¶4CTµÜ2ŌŅ pi®+ƒį[pež``\÷1BĶNä5ć>*ŗOŚÉ øtÓU½IQ•®f‡ó™fķ–[†śŁŅģCĖP?[Rƒf@LĆŌ pi–‡ˆˆˆˆˆˆˆˆŽ0ö–DŻA·Õ–*8„łH¢¦×:ósEĖ-ŻG ¶ µt[xÓbĖPpK3ČčŃ4ĖCDDDDDDDD† ÓtƒZŖG5[n©74ŌßŗjZōŸĄÓĶC3ø•åĪå­ŁrKU`ÕHõ­„wŠųkÆńY÷­‰ŗ8jĻŲ‘å4ƒIšżké¶ŲR¹Ņ!ĘiŅ ĘhR”ŸŃŒŻč>–Ø;XMf‚[2‰iŖéš­­t[i9Ąt_[šĮ-©—Ō£ŠDDDDDDDDdšŌ[uƒ[šżm„Įp\F³Q¾tߞhØE˜Ō£‰?®hķ>·¤Zn9čüÕ hłłłm·bYˆˆˆˆˆˆˆ$ݾ}šāÅ […(Ļ’Éd½ń¦Ÿ-ݾøT㚁-Ķ~»¬ÖzĖĮ-ĶhœfŌĪT’ZŗåŽŠoÉ„łdf+°tĖØbHéY)„µ‚[ŖæŖē+„MtŠtC$"""""""¢¼ĆŚOņiv$ÆŪ½*F¤čRZ˜ŸAÖ~,Q÷-†šżfIµŲbp‹ˆˆˆˆˆˆˆ(ļQ=‰§ūĀ?ĶžŗT-ݘ‘Ŗß­,?žh­ ’n`K·å–fK÷ķ‰ nå=ćš}kiµTq!ŻG³ü8¢Šµ‚JrŸ5Ķą–f`Kó3åšńUPĖbŠJ³Ū*ĶA“UM”g5hw¦™¦fOłš.Cć nå-vx÷Ń|rĻP`Kóe„šdfåd„5‚[†ŅÓķHL÷‘EÕŖ6œĮ-"""""""¢¼EóI=¹Īø”·(Jø²$«‰ÉŒL×ģ!_wƒ4[o)`ż e/Ķž“T1Ż'łķ—!Yj½eĶ ’LāÆf@K÷ÆęĘS&*TČÖE """"""¢‚I·ń ŻąI³į“n«­,?ŽØYˆĢ’ILӌÄ鎫6L7’ĒąV&9;;£xńā¶.<ŗ-“4ć=2Hlj¤bJ™b­¾®dĘeƒnĖ-C½å›TØ|]tlQ 鱯*(ąę®Ą…»pé~¢•6É<ŸL‰o­ČŃ<5=yņ~~~źqkQ8–Ć˜ISŃÆK\śż7ÜJNƒ“[Qx;ĒbƗKqģ^Bęӝų)śumˆ‘ĶßĆŁø@čļkŲ~Ķź‘ˆˆˆˆˆˆˆ,¦z$ŃŠ{†Ąp )K2“ˆnšJÕY˜€GNœ3æNƒcĘ ZŽĮĻĻo–¹p,RSĒścĆ’åˆŒOŲ»ł`Üä¾Ų’ÕRüūŚu“gųųų H‘"ø{÷®U\ŁįÜŁSXŽž}üųD Öō#V~ōM>˜”…t8wö“VpĖŚ~õžĻénÕ4‰ˆˆˆˆ(ŗ}ū6ąÅ‹¶. Q®pļŽ=øä .SC>}{–O“X¼ •./ĮØqA˜¾Łsæé‰ō×wņŁČäö˜ķ{c?Ą~]±īQm„,i©Ÿ®Že FkMjžłrTæü¦Īš‡¹SW£Q›®źy-Ōșó1Ö6“õ&u`«ųhč÷3§böā3€÷|w¬ĀŌą˜<? D‰(]ŗ4ąžżūøxń"v’dØ“¹ƒ!™ tYóm‰† ¤[`CA/9,,|a{9Ņāō[„Å„AīPšųÆæPāżzźyŚVÄÆ?4÷qƍSń·ÆĮ¹hq”ŒE÷.Ęśd74=˲ė±DsžŸĢtĒa—¶īƒkĶnØąö¦×~{· č^Ć{¶\UO{zꊿ_­›¼ĄįēÉźéū®¾D¶ÕÕŁ×īšqĘØPŃ «H„™BkyÉtÜŁ5[wÅÕp1čtļĻóØš!bÜĖre*TH=nÕĄVF}8d%××Ē…;Ģś²ą»š‡h;ŗYĘĀr“ZŖµz×ļØĒk…ē’¬ÕJ×^}ˆūŃ!ćóŖÓOšĮčęź£ńš/nvr$$Š-­J6ü #×7^¦)QŅžĶ”ļģņeŠ tag<ū÷?ÜŗtI?Ż»bė²Ō„hÕµÖ’~JiÉQšmßūwļCLšEoøŌSŖT)øøøX5°„p,‡±Ÿ.@ķjeP¾Ba¼ˆ8‡[ńq8vöZtŒŽÕ‹ćŪyŸ”x«Ń˜Ųm;uŻ…ļpüŠ˜’°aĆšæßŸaܘAčŃ;~v1mņÄČĖØÓ­TŅ />A×qsQ»ZT-UwĻžÅ‰?’B™¶£1y`W“jßÅ¢Ö#üü}\H*…O¦ Ä{ļ¾œś•ŚōA5ÅŠø ø_Ōc?~EФāōߑøģ0Š·īž~hčß-ŠÜħ³·!N)GŠō’”VµRØTŅ )wÆąĘó×Y©."""""Źc^¾ū>ž2eŠ­‹B”£¢¢¢ T*QÆ^=xyy™\ŽĶĶ ®®®šōō„§§'ģķß44š;wīiéŅ2žŖĘUCŖĪ ¹œRgČ“ĢDĢtƒ[šĮ*Žœ8pŃœ3§ŒĮQsšóóūŌJū©ĄńóóĖ–G³āܹsį’ĪÅēīžÄˆˆˆˆˆØ`ŗ}ū6ąÅ‹¶. Qž%“ÉB$g Æ5†DI4žŖĘ_g,Ÿķ@ƒŁ²óm‰·;‡óĖ÷Š/žė[ŖGžrśč""""""""[°i¼‡į‡<.)))W¶ävžšö5`ÜŌ TpŹĢ“ÆDDDDDDD”ĒČ29/ˬõ¶DK6.Óɓ>Õk;s eZ B>Ļl]"""""""*Ųr‹ˆˆˆˆˆˆˆˆ¬-Ē51øEDDDDDDDDyƒ[DDDDDDDD”g1øEDDDDDDDDyƒ[DDDDDDDD”g1øEDDDDDDDDy–­ @DDDDDDTФ]¾ !6Öär2ŲÕ¬n“¼-a_£ąéiÕ4-ƒŌ+×l[†\ Wģ‹ĘąQK˜: iĒŽ›\Ī®IcxģžÅ&y›ÅĆn߅äŽ`Ч'ģ7BŚå«H¾ƒōKWvé2R÷ģµuÉr”ūž°oÜČÖÅČQ nQS¬X1$%%ŁŗyšCŸŽ(“08w¶4ŲÕ¬.¶vėŠš¢VwīŲŗX”rMpėܹs¶.Įčg©i¶\wĖO«mXc‹¬\9Z±<Ļ“r™: £ĘŁŗ”rMp‹ˆˆˆˆˆˆ(+kö²ž>ó§m]ä<Ēqä0øM™ėZkćŌ¾ <<Ų[…² ƒ[DDDDDD”oüwėŖ­‹/É}}QhÅr«wnŸ#<=įŲ§'^ÆXeė’P6‘ŪŗDDDDDDD”{9O Æ£ūóf`+ƒĖØa¶.e#¶Ü""""""¢|)%%—.]…Ÿ_[Ål©É°OKQV$Ē[=—äx¤'½2¹œ¢iS(ÖżyŁ2¶®–,“—-ƒ"Ķ!ł÷}¶.ŠÕ$8»Ūŗ¹ƒ[DDDDDD”襤¤ą·Żąłóxš†÷Ö·u‘Ģ¢P¦Ć)Eć-Žé)™OL‚}z ģSŒ¼)ŅÓ˜3 ²žFD­Z11–Æ»l™~™‚ƒ¹sĶNĀÉś[d3 n½Įljˆˆˆˆˆ(ß9qņ ž?øté2"£ļŪŗHyC@™ū[0~<0p  +‡r+·ˆˆˆˆˆˆ(_ ?r 7nž«5ķĻ?÷ć¶.Zīåé ģŲ!Łń&Ĭ¶TBCśõ³žå+|,‘ˆˆˆˆˆˆņ’fMгgOr÷Ō›÷äńĽŠ±us—  ń1ÄģjÖ li¦W·.°}{Uåv nQ¾óäń·ˆˆˆˆˆˆˆlLīė —Eóįtópī”»[0nœ­K -0Ų±#w>ŹIVĒ–[DDDDDDD6 ÷õ…SŸžpģŲņ²el]ĖˆAøÜŅɽŸ0z“X.OOqšæ?0p fėŅQ6bp‹ˆˆˆˆˆˆ(‡yüōƛL^¶lpōØķOōō[igø„›§§Ų‚+8˜;×fÕDŁ‹%å“üŲRپ=ē·' @ Z½|)ŲL=Ā ¬[—æźŌÜŹ?|6Ÿ}ĢÖÅ """"""²>1p”ŻüüÄ@ÖĖ—b`+ Ą²õr_fd±‚łX¢ ÄÖĶkpśÜuŲ9”FĶźE÷ä.K”y@oŌ/ė’é¤÷młūĪ܄k‰˜?Å×ŖÅN{…K7=P××ĖjiīŪ²ūĪÜŹ–ņf‡„»cÓöc+Ÿć¾š6fOźoė"Q—×f"""¢<'»śßņōÓ=Ś:ĆūłēĻ‹oz ĻéZ¢lR0[nÉäčÕg(Ą¾P}ōļ?£Ę!łīUüüżś,%ݦ÷p½iƒg|†#šd±ŠžŽŗæž~ĻŖUѦ÷ˆŒ:‘Y5Żģņõ·›ņ>Ž„ńcśŚŗ8DTąeϵ™ˆˆˆ(OZ¶LģĄŻÄÖ`/_Š­łÖCOOąša±%å ³å@;˜#Sø”„½±iĻÕÓRćnį§µ?#ĘŽ±/ÓŠfą04*å‚“ŪæĒĻ'n¢l§Īpæz7*ńĮ€1hUÉ]/Ż}[¾Ć¾3’jµŒJ’›Bwą©]a(=Ā»#Ņ́0 öę^|·ł$Š–õĮ“»ńvÓ>čŻ¢N‡ż„­žCįøß~ūģœ+bų 6’eŌ%§X^w±bÉĻøż4 GLAĄ[īFĖsę—ÕŲrü¼jtF‰˜pÜzœ¢³ŽXłū]‘ĒĪåšōĮL3ĘhyćžūßヒnÆąZē#tóóÖŚ†•ß}‹§)éPÄü‰«\QŻŪ»Ž_G¹N“ŃčŃVüq…J×Į¬ńżšśÅ%„® C‚“ _BĄą@Ōōt@ÄεŲxä2¼Ŗw„×ヸ›ąŒ·Ć­ß~Ɲ%Ž:o¹cż¢™ø%«ŒSŁ2Œˆ¤I]›„®A¼¶Q¾·cP”cłŗ>>bĒš9óčąŗu@³fāŪ)O+˜-·ō(ń,ņ$ž}- ~§7õ±•pćEEŒ5žxŠßo4ź&¶śzt(GMA9!Śk0euĖ( GW¬Ē•ūö>}9揟~QĻóØÜÓęĢĆŠAƒŠĪ1 ēž¼š1ĄÉ³>łä ŌĘh-ÉRcļbšÄYšsVāTčÆ&ĖÓ Ū`@üķ?Co½½ ń žčų.nܾƒ#ś›,ļŠ5ūįź€ŽB\äs½m>ź­:hŽuąÉÉŻšj5CZ–ƒK!1Hxųū-ø[FODɗ’aĖ÷įæĪāžMøsC'"5łmüĆ&ĻF-ūTõ6 Ł~äQŽ&um–ŗńŚBDD”„?‰ēžŽzCü“ٶ.ZĪR½Š’åŖT‘‘ā£9Ł'V` pī\¾źhžU‡.ECCźń“¶.®Uą–[¢Ōųæŗś(.^{ƒf wĶ"źyįO’®ˆĘš5k€PI¦gČ{W_ČerųŗŲćöĖ zČA?~ž$ öžµa'JµĻŚ8Øē=æt÷ž‚}‰ŠPħB™–h“ü’e“ O°wr;TwQąĢć‹f”Gnt½;)iØ “A;Čäš,įa²¼UK¹įƍ_ć÷ÖŠ»ė;¦wžL,ƒ\V•‹¹ķĘbbʬc/“aēU PÅÅמ’ 5T-Õģ\}įč\Q܆Bõą W š‹ž~"nCą“Y9¬ˆØ€“ŗńŚBDDTšČ=ŌiÉQų~å^(3f5/ī„”W'•˜©ˆ8t_+…“„‹%.'¦ĮĮµvĘTeFŖ‰ŖĻéźõšuĘėW'švœū[*žžb?\Ė–Łŗ$d!E&֑i € S ˆ­ĮģŲg ćöóķ4—nlĶ ‹ˆˆ@­Zµ Ļ”Ųžó:ܽ÷Ź“§HJóBķļć-·×øńĻqœŒz‰&õj lķrxrū6öż~.œ‡}•śØšŃłł¾}ūąģ]Qæąæ8{4ļ׋:įĻm+ńļ½ēHO¹ƒT×jˆ:¹’ށō×ŃHq­ŽŹe]Q®V)<ŗ}»’8ŠæĻBr…ęØ^ZlŖZ^ńēÆžÄÕ;ĻP«ŖW#ćń(µźTöBJNœ<„GOįŸ‹—ń^ĆFĖØI*Ļ#ŪWćĘŻgHO¹ YéZp»yRń ©źV-!Yž—·įę½ēzė=z]uŖGŌ…ćŲ÷ŪģŪ·‡ĀOįUᚨ^ŅE²¼2¹Š ’bė”søq-~ń¶·«Ę>KŶM+pļa Ņ_G#6īž\:Œ›÷_ =å.R=P­Ņ›čĖÕ,;WOćÆóēńT^ ݇vE ;޾R«Ü’ž}ŹŌūpØTN—įbĘ6Ȟ^Ę A‹¦µADdŒ”k³Ō5čŸc‡xm!"¢ćٳgšööĪzBfŠ{ƒųųx‹ÖqssCį"Ŭ’æņī=¼Ž“Uoŗ}“ʰoņ^ŽÕC®āäL*>zXµŖ­Kc¾† :u€}ū€äd[—FR’“[–ÓpģŪŠre3½žÜ¹sOHž1ØĘS3ĘS2ž¦jŒk.§Ō2ĶŅ'źTėh·4ƒU8pąĄ5c\õŁIcÕņŽ‚ |š• ѵjÕ*ōķŪךIj™0aÜJ¼É5³-¼*:|¶Žö@ėśe!‡€'W÷`ß–|>ĶÖE#""""¢rżśuŌ®]‚—©/XѝnÉŗīEāŃ£G•ŃŪŪoWŖn•ķM=~Æ:tћī·2E‹S¦§f1”üiļžą5x:ź¼%¶F{š|®ŗf1U""""""¢äē'öĆÕ„‹vßaŁģ®£n9{”EĢ]£Ė¹&½2;Ķg÷+æ-0ø• l]H~±;öE—6™oĀ—}4 5Öž¼ėJBHElŖśķnėbå~ćĒ.œõŠŽEWūņåm]Ź‚ĆÓ8|XÜ/!!ٚÕK;G\s)Œd¹y”§”$³Ófp‹ō“ķ=m{Ūŗ¹—Gå–?„„­‹ADDDDD”÷\ø ŁJ(ŁÉ—>™Œz»·Łŗ”ϲe@ķŚb+&ĘźÉG:¹#ŅÉĆÖ[™gą·%å-1ĒOįīŠl]Œ‚)0P|LŃÓÓjI¾“sÄ ÷’ leƒ[DDDDDDDyHäēːmėbL~~@d¤ų7‹"ÜqŽ­øŁ!’4·ˆˆˆˆˆˆˆl%" µh•“WÆpé“ɶ.yĮåé œ;'¶äŹ[“֒+Ós,/[`p‹ˆˆˆˆˆˆČVā žœ,ĄĒsuėľø,pÕ„0[keÖ¦Ū6é_ zölėbh7n“u( śöķkė"ŁæOˆˆˆČl!!ĄŃ£ĄóēfÆłł2x·oÅ·'jxŗgnM› ߍ«QČ·FögŌ©téb“£yK߄H–a­źŲ¶é :VośŗÕ_ó†Äʆ fė"P&ܾ}ŪÖE ² ~Ÿä>üŹ ü"Ź’ˆ‹W=žČ·'©ŃŃøōÉdÄ?8ū~;TūöK”ģÓ#ū3÷÷Οŗw7øÆŗĘ#W[WQ¾Ęą–©8t,oHØĄJˆ³xoŻDķŗYļd‘(/ā÷IīÅ’(”ģÄ’Š!"[P=žXvdĮżmqwňü|Ņ^½Ņš~퓉ˆ»t•g!||Ä7)Ž„‡QQx豂H'¶ÖŹģs+ƒīˆL&S*‡Ž5ųˆ iū÷ÖMlŻĘ’=¢‚‰ß'DDD”Ó źŪS££ńwĒžø5}®^`KåŽ÷kquŌ¤ĘĘf<=Å~ø"#‘¬ …gߎp*[ĘÖU•ļ1|h€ę ˆź³ ¶.‘Ķ=zx׬åŲ"ńū„ˆˆˆ’>_—}»q怀€lÉ£ >žłł2Ü]ńƒdPKÓ£ĶŪé*źīŽ {œyC”}łņ(Y¾¼ś±ČŌčh<;~/ḎSH¾{Ϧõ—ß°å–Ź,˜Śnnnh5f6žMJ˶|>›ŽnnnˆJNך¾`źGpssĆĄIS1eŅxōīŲóCOY-ļĻgčē›ĢŸÜ 2™ ‘f–KP&`Ī$qŪ‰ÆŌć殟4ˤ[A™€™cŪėŻ QždėļCĖĶ›ŌnnnVÉ77}—äÕļCß ˼gµō­™i;ÆPAģ8ŽHĒć™UPŽžwé Ī4m‹ČÅĖĢ l©Ä_¾Š“µ#īŅ›”Ū>#ŠUż»ÆšŽÅhzį(Ŗ}ū%ʌ·šÕmR¦ü„Į-+É]1óóóĪDEēģi'“»bĘĀõł‹äŽ˜3‹—.ĆĘ_WćŚüνėŽÉtC;T6y£1õ³õ&Ó±…YK¶X“¼LK·čŪ’±rČ䮘ūÅ·¶."å[Ÿ\nĮWf„™×¾Kņź÷‡”¼OŻ;‘éōÖ“,£ ĖJZDDd†Ø(±O¦ €ÅĻV”ßOŒü|ξßń—Æfjż“WÆp¾c/<Üō³­7EģŖ¼( Žž¦Q—ąūÓjŗ2‰Į-t1ļé ‹ Cv}0uŚTōéŲ{ī%Øē½¼Šöķcˆšį'kŌÓW ļˆ£&į“š ’ĀšŒ©R-x“sV8”ĀĀ/ėcūÄÆ¦w(t1Fy€£Gā³]wMę{īė©ųøOw4ņk… W^š(+¾d$śN…3† õŠźéĻĻÆA«¶”OūF˜øį†zś>åšūĖd ö–X®£_ŒĒGŻ;”īŪU1ī‡7‘ųg+ŠÄæ ŗ¶Øƒ1kÆØCķś|õßvtjŽ &N@·Vųķn¼^Ž“śVƒsįzī —O#$+„[ŃÕĒ †O7šÖWŸö€sįpbńh“{§ʽ3\Æ/.ž€FÕ|Ń”kŒ˜Ģ‚ś ¢Ü$o~Ÿ//ÆG‹z Š­O?Œ[|Rk^žł.ÉłļĆ׿¼ef€ĀŽ '–MFÆnQ§ś{ųįā ½¼æś“‡V+®× E‹~=°)Zł^½Üׁ­ŠršX éā‡^Įū×,ĄŠC÷1yč Ģ »£—–±ļ1{ē·qdéōķѵʿOV]Y & }ä²Õ扳ĶĖc'Õ­µ²*ķÕ+\ūdb®kåfļįbŚčdEfžu’i €Ųo—jpąĄ €3®ćŖĻNĖØ–wįSknŲŖU«,~³±·[¦_ßīęꆃ_ąŻBzó‚}K!}ėĢÆī…—Wg”V?WÜż{*`Fõ’pżż¦–~Ņ5śįįĶ}€6U*aǵ›PÄAń ū"RĻåg±šqRĶ?īĪ|”®½ Æ^޵(=cĖ9‰E~ÅšäģDŌą€‡W]§“§;ÖG=E+OGō«ß?Ū˜RÕ¾ŻFĒS(Yy^<>@¼!™pž&Śy9imŪʍ%ßp%“É0åģ|^æāļ­FįŖ_#%ž`|9wŌ>ū9‡{Ł)x÷·zŪIiØą¤ŠŸž¶'ŅwŽĘāš…ńāņTźį†ē×fi嗖ü/JWY‰ĒŃKōtj|< ~q !µŠ`OŪzxow¼ģdFŅRB.·Ē€ß£šm½æP®Łoxvm«V9&–÷@¦ų¾±7‰RļoÓ~zToK|ōš.>†įƇė-³råJ“lŽšĆZ±uĘĀE‹qūöm”(QĀfe'²…¼ž}2­ZI$®»€å KąŃ‰ Tl½ńńń„•¾KrśūCźśo8/%d2&yŒ%ļĒćÓcP¹§b£æŌ)‡ 2™B]ŽÉ>p;|³Ź¼†W…ˆ½wЬliģ¾Å«Cp-ŃiÆėm*OÓŪ$.÷ééĒXÜ ø^ŻdüĪ#ŅvżśuŌ®]ŪąļX©ß¶ęüǐԺīEāŃ£G•ŃŪŪoW²NK™Ōć'ńŖCƒóŠÄ>¶J‘Nīˆt2ŻgT„…sņE$56‘Ÿ/ýļ×fKśŽuGõļĢk„ž“ž*_iÆ^”EŒy}›će”¢PŹzÓŻ÷ģ€}ćF™NW&“…Hš:cP'fŒĒHŹų¬W-— McAc0ičŁg0Ö­žŚą¼¬¾¶}ĶŻxt-/öYāV¾+^E~§ž·įaŗwÜ¾˜śFöŻø¹ vŽ>HOyš‰\Č4ā—ę¦gl¹^U=^Õū įĮ“ėĢļ拾 ZcĪ’¶ć›SæŖ§o|”ˆ=Ӄ0öӭ裄–zśžØ;z7#ęRÓ ą\“RŽüļńś‡ Ų9i$†mDŸīuL¦óż8ōō)(äÓ±’-×[ĘĪ©"&8ÆĒ? ©øµęl^ł%¶ßX7 ^v2iÉ!J o\.ÅūāŁµ­zy¬}Aµ ŠÖdq}d§–Ķ›`åŹ•ZÓ4[D”÷æO6āĶ>]“ó–/ʤQõöŪ+õ~ÓN˲ļ1Cį/""²6Ļ“×(ššhÖ²yńķ‰O÷ģĆÉZs,°„¢ p½cpŠ·‡v]źåƒƒƒĆ"""P«V­¬'dA™€…ÓāŲ™HJHĄ™šCŲæ÷g|¾’&LØŪ±BĒ}޳—Ī`Ė·šéŸ£Ŗ—Ų—J½V„ń攓°c’8–Ō][U¹}sB’Ąµk®hōą ~āļŻ³qōŌ5ü¼ß¬ )dzłŸŚæ?ü/U‡ƒ/?zSzéĮmß-Ækæ#xē?HNƎwkx\īŸŻÓqśŖĘŗ‚ł+×ā»õ‘˜¶åŌ)īl4ķGG걇ć×pxŪ&ŌźūŚæ+ź“.‡GĮ/īC„K¼’6`ż²ÆŠpųXTÖyCŲ„K—ąēē§W÷ ¦|„ĆĒÆązœ·k!-ó>[ŽŪ؀®žuPÆ]y¬6[÷žŽ³.ƒŠ­Y)Ģ›:įĒÆąĘ«xüõēZü}ź*nĘ hŽ¢šw­‰Õ#ęćō?'±qŻ ĢŲöŖ{9źå«p,‡čy0č QÉŁī•ėbRŸ ~Ó¤_ēÓ ™ŽūŽ]ĮĶx%¾‡·^«Ė¤*G‹–E±“ßX„>Œképļčø˜źˆ’RSRńńŚÆŚ}«B9ƒĖŸ?’ e«šņåKø¹¹Ł¤ÜTpÉķ=P§~9Xó=^ƋŹ%\l]$³ŲśūDÅÆia,< »’:‚ėé}ńąÄf\Ns@§÷å›ļ[|č^’ßv˧›W÷ę•sēĪŐ"1XųķJ,_s³ĆV¢n1„Įr܈S¢EK4o_!Ęāē½{šWRWōl#ö#Sōæ}˜¶f._qC“ū§šZ¢c£Ņ(re¦o?ÄŌ Ųæqœ˜®*-‰mZ0„·½_Ūęźŗ‹DYtńÆgėÓȦųG¤ķٳgšööαüā^ÅØūˆ4—›› )f•ü•wļįõ¦­ē¹¼N°05ܕé(‘š„ ÉÆą™ö&“#MføŻŹ«³ēQŖk(<=­’vIÅ•Į£µ8Ź×ÆmRåė×x“y;œŹ•A!ßxøégܚ67gĢGŃ­įX¢xŽ–ĒI™ēæX-½dGŽǾ½”(W6ÓéĪ;÷Äž²Ņ3ÕxjĘøŖ_­TqĶå”C¦±CyŹŒu(OŁO³Cys°CyŹ &L0k9¹–~1ĒÖÅ„\ Æ}—ˆo.Lƒcfž/’lßyDŚŲ”üÖźPޘ‡.xjļŒgöŚ’©W“}kŌŚø&“©f?U)ķÕ«¬'–Mʌ„Ź‹‚­—`xøų7&øpA}3%V”ß;”gŸ[DD”'}õ•ųf›Ū‡B±ś„¦¢˜ż›’J»…oż€Ź¶uQ‰,'ˆæļR”¶{S.å-%SQ2%Ąs¼“sÄCWÄŲ9āŁļāéž}(Ö”­‹Ø%5:—>™Œ˜ć§l]“mŚn:øe(`ż&Huį‚8²ƒ[Dd–ƒ÷ćŌ©Ó¶.‘–§·auxFN®ŲJK¾‹UKÖ¢Lē±čč[ÄÖÅ$²Ų¼Iā a†OšƒĆß~fėāQć•ö^ioļ{8øuČ%'Ž]ń"?_–kZky¦½é«S³ŽT~"ž 0p P¾<šĻ?o‚T Xå n‘I lQnōüŅn|½óMr}+)SŸbĆŅļąź?=ß-eėbeŹģ/Åģ/m] ""Ź/Š={Ō­ ͚‰m '[k X9)Óą¤_ā–ž{Į‚Ņ””9ZWd·ˆČ¤;wҝ»ŚŗDZž÷c8RŅ”ų~ĪTĆ ģž&ģGU0RĮÖŖU+ܾ}ŪÖÅ ""²Ø( $DĄßčÜ Ź‘ģ#?_†ČÅĖ2½¾˜JĖO‡³züMĄJ³Õ, nQžĄ"Ņ5śc,Ł|ƒ§A„Bö¶.åģ蛈ˆHCxø8fūćŠgš¶Eüå«zÓ„VžA*¬¬Ć.=)ņüū’·(Oą é*āŪc¶ā›%«0jśp”uāW‘ÅĀóż1ŲÆćą’Dż™«œ§ČhŻ–_ɳž‘m”jŲ Cü]šŻŅ xšŖ“uqˆˆˆˆō8æN°uŒ;r$Ū³(Łøŗ“{¶(;0øEDDyŚŪ-bŃĢAZoK$""""3=šży4kfė­¤|ŽwDDDDDDDUD“½yųūŪz+)Ÿc%DDDŁdŪ¦ō¦õģ3ŲÖÅ""""Ņ–Żżnyz~~b (0øeoFˆˆ(«¶mś‡ŽÕ›¾nõ×üNÉC6nÜhė"X}ūöµuˆ Ž ²½Sy4mŹąe·tšf$ąĶ‘ķšfDś»Ėļ”/O!Īw6L÷7˜”å4oFf]ˆÄæ7b0rĆĻč_ĆK2m@¼Yż¼j(¢žÄ®)Yw€x32žüM“÷2v‘zs32żb$®Ÿæ…÷§’‚åƒkØo>ŗ „Żę£É³ o>wᯩųģGpō‹!X~ģn\{1[vcp­Āě‘OÆßC§Ābžā ȧzćDTpōģ3ėVm“GsūoLMx‚­ŸmG‡OԚžÅG3ų×mōp<…’•įĖžĒńń¬5¹Ų6žėĘCņ‹}(Z®%ʜŗƒŠš…w ŹÖėϾüpŖn½‚łÕ½šņź,ŌśšÜż{*ZNFĻĒg’['…d~ŗ¾č1¾ė.`yĆxt"”KŽĢ æ×vAwÅ+ ¦GĢĒŠr*-?ŏŸƓ³Q»Ēču‘Ńuś~¶ė£ž¢•§#®Öļ`¤Ém1ń°†ŚÕö³°yv1Äß[ĀU{cłąKų`ČL`č,,Y½œt>włóCŲŃd2¶Ž/ŽĒ§Ē r§Ļ08śKƒłßüßĢZ¼XoœˆˆČŚ4ƒ>u„W“FŁ—™Næ[o:YWØ;Y×~ƒ ƒQdsĒé®#ÓX×NcpąĄ €3®ćŖĻNĖØ–wĮŖQ€U«VYü:zSŹ›ŗqssĆĮ‡/POƒõZćP…Ų4õĶ…aJUoųŖPĻĀ‹ĒĒ(įęꎠC‘XŠ@u3Ņ ÓOŻĮtõĶČ*¼|,ތū–BŗęĶH?WÜż{Ŗ:’ĖĻbÕ7 †óÓ6­ZI$j܌Tl½ńńń€6U*aǵ›ź†Ų‘ó1¶Ü˜#‘Xä—q32Ą3nF¤Ö)ķ鮾éWæ ~:·Ćč¶|ąSĪßD;ąÖʍµŽ–(“É0åģ|^_u3ņ5Rā/©ēŻNJĖøŃż¬„L¦Ą¤3±äŒ›‘žˆĶøiZ¼(¦\懎Į­ÓckĆcqŖ:Ūi·oßF‰%l]Œ\Aź;ŜĄ–››zŒ Ź-øŚl NĢmØ5挧;švļ w… 2™ßæB½ŽßOcPŁŁ€7·Bøų,o9Ł!=9E}Õ×ų2žīŲu’9źŗŚ#5į<Š–éŒŲ—wŌéh^ē„ņÓTŚÓ;ļ=C}7¤&DĄ«D3u^*éÉQš(ZS=]7cĖ{üu\ķ‘š"„?Ä«˜ūF×Y;ø1¦µĆˆ±c4¢¼ģdfo‹&Cß'·’RQ1£Nķœß‚ńv*ćß'ā爸Ōs³GjüY8yµFzźKƒłNņ›„„Kõʉ ~Ÿäׯ_GķŚµÕ×IM‚Ä›żt§[²īƒ{‘xōč‘EeōööĘŪ•Ŗ[e{SŸÄ«]ō¦»&½‚SJ’Uņ³ó°JZ†TZ8eGfļ Ō®Žš€G›·gkł…gZ2źÅ[§»£D'7$9ŗźMwß³ö3Š”Éd!’¼ĪTć‰ćń’2>«ĘUĖ„HÓ@ŠĢĘ»n Ęž·ŻÜ’e’~īģ77#SµoF6>JDÓéA8Ŗ”g—ZSÅ_ż}ÅMN…[zWt8k‰Ō„ ukīĘcWy±_,·ņ]ń*²3€©Ėb8?m&`gM1ļ"µ?°F=oߍ[€tG¤§HŸPʖėUÕąU½|`‘ŃuęwóEß­1bģ|sźW“Ū²?źŽŁūwHĘv:m…Ō„af®%īŸŖ‰ė®ŃńZƒ[GŸ<ÓZśēć`iF0Ksœˆ ÕwŠ”éę1gź Q«ŹPœ™nźy2ŠÉ×z}pPw+ž•Cū³ŠB&ÓųÅ 4Zcłi/§ŹC»5󎃱źA14,got}cĖ©Ė*ZŪ"µĪ Ž£éџ±pī4ŌŻzQG?³h[ŒQdź’o‡¦“¤ėŲ’^½q""¢ģöņŲÉlnņ­ĮąYļ¼ušfä ŽŒ˜ŽM¼!"]ę~whÆķ÷FųuĪŪčÜćÜŲ;Q}•^¶ք?D».p}ĆpTķæRk=M‚ŌåF½åŽŃńØWŻ ńwvĀ­ģ›>]rÄ„+(Œä§­Ÿ· 6\y æÅsu›Ö¼ĮKĘ®ūĻQćõŸ˜æ@,“Ģ@>†—·kĆ„ØŪ°^\ś®%?6™v·fĖšĖ‘ńX¹£4Š•ėą3£ŪŅ:ć1wćß3JõėŌE!Ē+ķŃż k’yæĘŽxžĻZø•؞ž~Ęcī ;įłÅłh5ę 5NDD”ŻbŽŹö<<›4Ģz"D:Ų”¼=ū ÖLÓæéŪć­ĄŖŌp}Ćp½õ4 Ss3ĄČ͈±ü“©nF¼™¹d>Ę kØU&Ż| /÷ęf€Į›Ciwk¶ •šöĄŹėńņņF“ŪŅŚ§öšģXśfDµ=Æ4¶G÷3 ތ0x3²;£`ń¤²Ž8‘¹eĪč˜3kžMJC•Aߢę³ļńĮˆ™źåĘīĮ«łŻŠ¹[W|~§`I°ų]5)x‘Vš“|§õyXĘ ?F’¶ ’~:S¦MĮčIךŻĪńźev®!C'ą›mQ’łéš²u!. ūŻś|Œ„Ē:”“£†&¾ØdaĻw0¢w?L^ų/F–rĆųoĪĢĒŠr‹g „£{C¼’ū<ōéŻ ŽüŸ’ü¦'©“߯°C'OǤO‚ńńÜ­F딂„‰Ęļ ¦ōŒš¬5}@°X§_v«‹?ž_mŠ4ųjļœ‰nŠzŠy|¹k†zzŗFž—–\Åō·<ōʉˆˆ²[Ś«Wˆ»t%[ó(ä[vīī¶ŽTŹgŲē–Ź,š5 —‡”ńÉųvŃ TPÖ ©‚Ÿo>ĀןcŌO;0 ćŃ@©“—¶Ęåbõįüų”õēćcߕ¬;hU¾,Ɵæ……„ūÜZ0„7f}±­ĒĪľåóÕ}¤ō›Šƒąū^õń]j=vŸ† }*č}–ÉdX9y0öŻ|ˆ[WŸaģö½’Ń”|ćbE0åś}|XÄ ŗ×EŻ-(b'×'*HŲG å7ŗ}ne…L&Cdr|F—ėõN¶ž Ņ'*Hų}’?°Ļ-Q^źs ș~·.ö‚gæ’™­yäģsĖ‚rd¦ģ`p‹r9ތŁoF(æ±Ś÷‰™Ü7S3:ü'"cų}’?0ø%ŹkĮ­¢ķ[£ÖĘ5YOȈ»+~Ą­és³5ü€Į-ó±Y ‘1‚x~„˜zVŠ f1°EDDšęMź >iŽ­‹BDDdTü„«ŁžūŻŹyreŗ­‹½Ūgėåf¼!""k˜żåƇæżĢÖE!""2*łī=¤FGgkģw+ēY«õ`nÅvńDFĢžņWĢžŅÖ„ ""[iÕŖnß¾mėbåØgĒĻ dłņٚ‡g“†ģw‹¬†Į-Ź—x3BDDÖĄ>ˆˆØ zyģ$Jö鑭yņ­ĮąY ƒ[”/ńf„ˆˆˆˆˆ(sbŽŹö<<›4ŪzK)æ`Ÿ[DDDDDDD¤–żny5Éüśˆt1øEDDDDDDDZž?“ķyx6ę[É:Ü"""""""Ź&yõ-uq—®d{l½EÖĀąiɱ~·ˆ¬€Į-"""""""Ņł*Rcc³5¶Ü"kįŪ‰ˆˆˆˆņ¹m›~0{Łž}Ūŗø¹Ņ­—q>ā“­‹‘ėŌõ{•ŖŌ“u1(›œmŚ%ūō@™‘ƒ`ļį‘-yx6nˆ˜ćŁßJŒņ7·ˆˆˆˆˆ €Cǚ\fŻźÆm]Ģ\ė|Äi³ź° ¹š÷iœ8ĶąV>–|÷"/CäāešžØ;Ŗ÷•Õópó­Īąeƒ[DDDDDDfzń쉭‹@d6oGÉ>=¬ž(”W“Fø÷żZ[oåq n™I€`ė"PóÜ£„ÕŅJ”Łö>žŅU«·Ų©¼“;'«?ł;”'"""""2“ 2*x^;iõ4ķ=<ąV³ŗ­7ņ8¶Ü""""""“žŽ¼KD£B Ü’'©5Ē`Óā>VĶ£yå–8|ó ­7Õ(SAA™ˆ/‚GćĖ• ėa(.KʍK÷Ńaę2ō§hęņT&bɼ Xŗā7œ»såh[§žø°ĖÖÕAåŹĀyźälĶ£“L†ā6ÜF;w÷lI·ŹŌńH¹|ņ[–{9gs YQ®¬­7Ń*Ü""""""£ī˜„æįVÄwp–éɑØP"ÅąVh‡Źš’å|œė[ T*M,į„ÉĮ«šåŹrųé4¼SȏOFƒ¾#Šļś¶L꼄I³æÅŅæA©TB©”į÷æwšQĆ6ö؏¦?F9G…Mė2摗-—©³5[od6ńčŠčŠĘÖÅ <Œ%‘QßŽŁˆ_Į9ćīAįTw.’Ŗž†ķś`ź“©čÓ±7öÜK|3³<‹śāŲņ©ŌÆŽ­ę‹ńkÆ….Ęč#0cōH|¶ė.¾™ŁnnnˆJN7ŗžęr0wBGø¹¹™Ucė…/‰¾SēcįŒ!h=t…te‚ƒLkY—Ņ呖ųÆÖ2/žŁ€»Ę ī­1}ó-é ųbö ”*[gWĪǰĮŠņżĪŲtõeĘ:oņ’~žpx—,ƒ;Éi€ ęź&tė>ӂŗ ×„ ź<֌ėīćgaĀĄv¶ō( 8²q9&{„y'bÉŽ{ĖbŽ6ņ±D"Ź=d™\G¦±®ĘąĄ€gˆe׌qÕg'eTĖ; ‚š©57lÕŖUčŪ·oW'Qī³mÓ8t¬ÉåÖ­ž=ū ֛^ĪĖĆ’¹‡å \/Ų·Ņ·^Įüź^xyujõsÅŻæ§PĀĶĶćĆ#1æ~1$Ü_‡2õVąåć3777\~›ŃrK\Vü,3²žęr ¤'߆GŃZˆ7«,Rė•ötĒśØ§håéˆ~õ»ą§s; Öį£wĶŖó’„Ėį·ė’”Ž<›ftĒŸ%XōŽzžģwŖ£Ęļčāxė/ĝ›{(Q²“Fī9ŁuŠąéłŁh<Ü7ĻĢR§yśv$Ź9ŹP²“OĘøóŽ­ןOc|©T}wnFü čR’l:sŠųx«Ö܋ś['…‘²˜öčŃœ8mš˜€ėׯ£vķŚå”z¼Swŗ%ė>ø‰G™Uvooo¼]‰ż=e–L&  ąuĘ OĢ”ńY5®Z.@šĘˆ”|Õ`6>–HDDDDDF ŒžÆųš»ńŲU^låV¾+^Ev0ŖE>®įp*Ņ© c$R‘ė^Ond=Óe‘Zo~7_ōmŠ#ʎĮ7§~…K:R_»xēwązćUŲ?®¾ÖŗŪž$¢Ń¼é8””k‡óÄZØčAąQ©+÷ƒ ĢŌŹ_äć6?JĎ¢N)ÜpćÜ6u>枃ˆée‘žśL+ĶNį —…ˆ(ļ`p‹ˆˆˆˆØX·śėLÆŪ«˜ N_$Zn)d2’b×ļŹA–™FĢ[OŅ-*‹Ōzƒ~8ަGƹÓPwėyDżĢązJĮü~®?żµ…6hÜ`<Ī>€znöźy2½ē~†VžŽzé¦ J(%„€Lkž (”ĢxģQ5®ŖTź•ķĄŅń}TÓĖC3ce!Ź+Ž9½éįįįhÖ¬™­‹GٌĮ-""""¢|Nź±1sł² NśÆ>ųÜb@dϜ>č0w`Ō[īŲzÕ½g'ÜŹĶXS ’č¶RBl7墐#.] @”^ViĘz•\ģq"6>N®xy%TkžtYŒÆ×­Ł2ürdy»bĘŖ X8“6fµ«Žqćf£g‡ڹ¬Ń²õEGG#$$”””ˆ‰‰1ŗ¬*€†ąą`ųūūćšįöބkҤI’Į,CĀĀĀ“>ūūū#00ššš0+ ©i†č–ĶĻĻcƌĮ€lXk9ƒŹ™ źPžNԿٚOł •püĘu”qPŲz“Mzńā9;”·ŠÜ¹sb2Ø%%((Ė–-˱ņę%9ńXbóęĶ- nIńōōDpp0ʍ—éķ²„ææ?ĀĀĀĢØY"·t(/·da"""""¢‚LÕ{¶ JńŽ.%=ó°ā@ꋍEżśõœéĄ€,9(wˆ‰‰APPš7oŽŲŲŲlĻ/<<uźŌɑ¼l…%™I°¬1E¾^80mįrlž7ŽÖ›JV‹–-[źõ§„IÕO’nš*<<.\PÄ:wīlėĶ!žžžš÷÷G:u“¦GEE!**ŹhKÆššp“lŁæüņ‹Åżc"00P/½]»v<Ö¢¢¢„uė֙™CŽĀą‘™²³ÅҘéß`ĢōģχrŽ©Ą–ææ?‚‚‚$ƒVsęĢ vd~ģŲ1[oP§NģŲ±Cr~ll¬ŗĻ“ØØ(½łčÖ­«|||ąćć“„·FGG#<<\äń÷÷·ŚŪĶ1`Ą„……!,,Lo^pp°ÕśÄŹŽ7#ęf nY‘*€¢ĖßßćĘĖ–v…ąą`Ō©SĒd)'ķܹ>>> 2«\š­ŅLYæ~=üżż%ß\ƒąą`4oŽ|8ĒėźČ‘#ßčˆ}j͜9Ó`ŠmēĪ×gpp0Q¾|yÄĘĘ",, AAA~!!!X¶lY¶n»T0ŃÜą–T½éņńńAhhh¾}Q…%Y‰T_P†:ϊõė× „ l©¬[·zÓĆĆĆ­Öד%¤Ž(Š;vH€:wīlQĖŖŠŠPĢ™3G½Ž‡‡ €\^ź±Ņ¼¦ ¶€|ÜrĖĻĻׯ_·u1ˆˆˆˆˆˆˆ¬ī›o¾Ń›ęććcņmŒ!!!ƒ79‰ˆˆ0ųųf`` Uū&3–žŸŸōźĆŅžĖr«ØØ(ųūūĆĻĻ+W®“Ł£§9!_·ˆˆˆˆˆˆČr‚ ż,5ĶŲt²žččhƒo4ēQµņåĖ 脅…aŻŗu9¶ »wļ68]Ŗ5Wfj©¦;ßP°/""Ā&qs[ųłłł”P”BźĻšż‘Ś–śõė#444[^jš±D"""""""+qss38Ż’7š"Õ²ČÜ~Ø -#Ł_Xvźtߌ¹› ©:«×Ÿ­Ū/õعūšĖ/æÄįƇÕùsē ĀĀĀ$;Ū ” €åu nY‰Tk©¾ø2ĆP`€ŁJ?¬YFS č²ć’¹•T€R*Ųf®Ī;ćšįƒ-ą&MšdėMĻ nY‘”Wxxx޶ŒŹķņKæV™%Õi½µ|sęĢ1˜Vxx8¢££m½łVĒą‘łśśœž_ŽĀGYkšXšńń±źc™R}°IµüĖĖÜ"""""""²"©NĢ­ÕYŗŌ£kęö§$õų”¹ż=e×6ääc‘¶bpz`` Uó‘źo,?¶šcp‹ˆˆˆˆˆˆČŠ:wīl0x…¹sēf9żš5kœ~łņe³Ö7Dņńń‡‡‡Éu­1T?įŃ͈ˆÉ §9o»“„5_bŪ1øEDDDDDDdeR­p‚ƒƒ±~żś,„ķēēg°UNhhØÉu„‰3Ō?“TßaĘģܹӬm0Ōŗ-&&F²US~V­ZœlVpŃŁŻÆWnĀą‘•Ķ™3Gņ͉?~|–Z) …‡‡ćȑ#F× 6Ų¢ĒP0®lٲzÓ¢¢¢$󈍍5»õ‘±G7Ķ}¼2/Y¾|9Zµje°īżüü¬Žjėȑ#ƒžžžfæU3/ap‹ˆˆˆˆˆˆ(¬\¹R²ß£ųųų`üųńFƒ9Xæ~=ʏÆ5]źŃ¶€€ÉōÖÆ_o°e”æææĮ€‡T CyDGG£eĖ–f?¶X¾|yÉÖmõė×Ēܹs%ƒ±±±yāńňˆĢ;*T@PPĮĄ–§§'V®\iµV[±±±˜;w®ä¾³v-·°³uˆˆˆˆˆˆˆņ#???„„„HqTį©Nš‰øø8½Ņ²eĖŌćåĖ—Gpp°^+&&õė×G`` :_U>†)ōōōÄŅ„K –/ Ą`0D•‡ŸŸ *d°¬ęFXX˜Į Opp0BBBąļļÆīč>** —.]R÷[5gĪėķ¬L Góę͵¦™[>>>Ų¾}»d ?cBCCµögLL .\ø`ō±Ńģh!–[0øEDDDDDD”M ˜ģąŪTVGŽŃja5gĪDEE|ü,44Ō¬>øBBB$ƒ+åĖ—GPPd?XRCA7©ōĆĀĀ$[ÅÄÄ ,,Ģ`ßQ¹é͊¦ö›! Ķt‹-sö­&???µue ‚ŃĻRÓl¹īƒ{‘xōč‘EŪéķķ·+U·võ™ķȑ#øpįbbbōmSŖT}N™œˆˆˆĄ±cĒpįĀ­ĪŻUéųūūg:Š­××“æææ^‡ō±±±z-«ÜÜÜĢnväČ„‡‡#**J½ uźŌ§§'źŌ©ƒ:uź |łņZėŹSµž±ķµt=Ķ7EŖö&UĶÉ[MÕg×įĆgGDD >>^2OÕ~Ä~¼tė&;Éd²É^g ŖńČńxIŸUćŖåR¤i h ę—#3eƒ[DDDDDDłƒ[D9H–^,Šēä ¹%ø•§:”ß²e‹­‹@DDDDDD9 K—.¶.åy*ø:t°uˆˆˆˆˆˆ(ķŁ³ĒÖE ¢<$Ļ·’’’l]""""""""Ź%ņÕŪA€ P*•Zƒj:Q¦4oŒÄÄ^^€Ī‹QQoęĖd@… @hhęņT„U澘–LtéDD^~ą@±œ†ŹÕ„‹8Ļ@‡ōy]žk¹%E7°„I.—C&“©’YD0źŅE÷÷ Ņ^&* Ø[W <=ÅežłX¶Ģ²<—/×:uÓ §8辁rĄ1€œ?/ęsēaa@pš›iłH¾n Źdüøz ¶ģ<‰&ķ:ĀS¤%æĄ‘æ®ażO+!—Ė”P( P(,pé¶ų’Édz-Įd2™z """"""¢|źĀ18 ųųčĻ8Pü«xš3G 8…„ćĘ^Oʜ9ś±ŚµÅd’ū°nö<1€,“–-[y‹å™3ĒÖ5˜-ņÅc‰2¹ś™ ų {OōģŁ½ū ĆŠ·ģššŠ““4õ_Ķ!==]kŠ/5ģ>÷_#%%©©©źG‰ˆˆˆˆˆˆ(‹‰F†TQQb‹ŖĄ@żUćʉׯ·,?C­¬‚‚Äæaa†×™3GĢ?$D lMš$¦³r„­k/Ū䋖["1N—ž–†Tˆ-«źM]„R‰MßMƾ' š:M¼Æą³Vā™o[,Łń·’Äāõ’ĄCžžMĘbPóŅŲ³q~ډٽü°’ÖcÜłļ.ŖLĘąŹįŅ”ųöās4ųf9ʼÓ=ƒ °··gė-""""""¢ü. ĄštÕc‹11b«)MQQo–ÉLė©°0ń±F;“Œõµr„ŲOW«Vorŗ·|$·Dnß w™ÜźŪ·/är9śŽ˜†Sć~F³J®„wŠ ų^ŌŲ©©©Ųöŏh¶`Ž•_ǰqĖѧŃ<|Šc$6ü6g+¶Ē° !éÅa|2u9ś½æUštVnAžQŌ^†ŌŌT( ŲŁå»Ŗ$"""""""sEG‹3Ūy¼!@÷ībpĢß_ĆĘkņó[…†Š­ĢT­½ņ©|‘iݽŹ)ÄåÕ}m9x£_éĖ8óM]Sš‡s¼£LGš Ä_/SPåĒÕø A½2HIIB”¼WŅI ^9WEśėP¤„„©óIKOCzF’]|$‘ˆˆˆˆˆˆˆ‡æ BeELŒŲņ ĪÓnyl|݈1°åé)ĘęĪĶ·żmy0økpŗź ‰I‰ HTˆĮ&U_[ …{5Ă/£J‹sšiÓńńńĖåd@ƒ€žØź ¦‘˜˜Øn„&&"Q =˜˜Ød%'&"Ń^;;;(•J¤¤¤°õQAÕ¬™ųwēNė·BCŗŖ3xK .¶[~;ęŪGóE‡ņ éźqUßW_ĢTæŁŠµdW¾±’ķ~†Ž%\ŌĖ5/ā„£7b!“ÉšųĢfČd2Čåź„“śŃ2ž:ČäHR*µę±Æ-""""""¢Ģß_ (©‚RY„jÜ£›VHˆńõęĪ[n‰Į,ÕŪ‡·u e›|Ü”Æńėę’Āw†aĒŽųuŪütO@zzŗŲŖK&G÷†)ŲåŠvrČåāŠv\?¼Ž³߯Z‰ż1õ”P(šG˜ų*Ķm;× `ż“÷är9ŗŌ-ƒŸ~ŚŽĆ/޾2‚hDDDDDDDT@-[&£*TƒPįįā ŒoYZˆCCÅ!<\ \Ķkų-Š€ŌRµōR=† śŻē™in$ÓńŃFÕąĄ€g.\3ĘUŸ4–Q-ļ(§¦2޲e ü$šŠ)•J¤¦¦"%%éééAĄR(gō„vźéJ„iiiPf“ʒg4ŻR*•Įą4ÕtUgņvvvP(lĮEDDDDD”EčŅ„‹ĮR ܋ģG,ŹĒŪŪoWŖnėĶ„¼BuæoŖaKX˜ČR½!QÅĻOģ;Ė’tUA1Uė-`Ż:1H¼|ł&ŠŌ­+ę«ŪG—*ą£?/KU"  ąuĘ OĢ”ńY5®Z.@šĘ‚Ę`¶|ÕI”B”€½½½:@˜R·4;€WMSĶW½t[ci=šØs°©\ jåcę>­„ŁR*.Nœf¬.céŠCx8PØŠ› ””ō<=ČHĆéxzЁ°|*ß·TA*U *Ży†TšĮ.¹\nō±BcĮ-Żō‰ˆˆˆˆˆˆØ€³fēķÖč >ĖWĮ-z-CĖh·T³Ś_[DDDDDDDD9/ß·óL†–cpŠˆˆˆˆˆˆˆ(ļÉoK$"""""""¢‚)ϵ܊ˆˆ°uˆˆˆˆˆˆˆˆ(—ČsĮ­^½[ŚŗDDDDDD”¶n9hė"QĀljˆˆˆˆˆˆˆ(Ļbp‹ˆˆˆˆˆˆˆˆņ,·ˆˆˆˆˆˆˆˆ(Ļbp‹ˆˆˆˆˆˆˆˆņ,·²Ń‡+£Rėņ\ŚD”’ńBT0š\'""¢‚ ß·ŸX‚¾ōj¹•FŁfū ÜĖ L“9[!cČĮ“/-œƒŹ.„ —³źĄŲ2ĻĪż‚õ;āĆz5P®zG4­Ń]z @Պ­°)*PŌĮrYqõ`ļč ø¼u1Ŗ•{;÷@©ņĶrų!ąJH[ƒĖĻŲ rYqÆń»ĮMÖ*‹oO|Ōø!j7jŠjļĀ•Ä4£yJM‹ÜƒÖµźą¦mńn»‰ø™$¦“Ń`śęŅŻµ¾…Ź T£7õ+U–n‡Ō>ŹWjy©śx±ļ¼]ķ:uG™·Ū`ż•£õ”š`·ĮcÅŅņ˜cb„JZõlŒT>RŪ‘ÕóGJŹ«³ŲvĻ¢c*+é\ĪŹ×§¬ŌÕō~ķ!—‡] ›z £Ģ§Q²TSĤ‰…Ü0aÜģ¼QķĆQx•nŗą†ĪACLė¦ŽÆ˜kæ”ó{mйKŌ(]MŻmµ:µō¼ Ÿ_R× ]–\£4Yz½2D·žĶÉWåń©_Ńæ]{4lŃ ZwBŁrļ”ĻÄPB†~¹¬8]!VćøIOy ¾“œ€4(ęX»—wkŠnŻįäX@ö] ĢeīńĢs]Ļu]7/œėDDDĘ仹V‹BVbV†L@ļbĪ(Óµ`hYWonŽ °µüößMÜŚ?8GÓö>ŸWpW6§Œ-Ó“ŁXœIŠ'£Qā5Ü-·;~^mƒåÖpøøPяpźģŸ8söO„ū~ ųéŪĄ{!Ų¹ógLwxˆOŪu¼<‹Ą_Į‰“{qāäntóz ˜½n[F®2ƒŪ¬Y–Ļ|žĆŽK…pīųaø_ų ƒĶSjśüVćp6žcœ=śźżó+: üńń@ƒé›K{?(q4½[­Ā•ų­å¤źĀŅķ0¼¤ó•ŚgRõѹмō[†½»¶cš<#d“ž>i2ĪĄ±byyLyqi NyXp“ČGj;²zž¦ÄĘa£0vĘE‹Ž©Ģ§cx9k_Ÿ²RW Ś…Śn°s©‚UŸ·Ü޲IOoaҹg€ž_-ĒŪ…JąčÆ’ƒ»Bf²<ŗ×B)ĘĪusŽÆĮĶĘąŽK°sĒkƒ½ŪöX­N-;ļ¤Ļ/Éė†šå×(sŅ7Æt=›“/¼øø›ŒĀ}’8uh+öü¹ {&¹#lüL—cUčF8z4„{ZĘ{¬^ļĮ”hģīŲśģd¼c÷Æė.Åŗį—°ķ‘qgϵĄ|ęĻ<׍į¹äåsˆˆČ”|Üŗ–˜ ™LüĮŚųĀØŃZüAå×­4¼[S/÷čČ—ØŻšcōīŌc~ŗ”žžōų(ŗ6lˆ-:£tÅ6Xuń„Éu MŸ7°«^+¤øØ½h[§źæßźöĀow”Ÿˆ’³ģÓiŚ×«G§J’×cH1”öĆCĖP±H9ų¶Š»7’Ó)U½ŖTA±jC.Ó¶EÜHLÅ«;KŃŖķ0\zžŒ„ū‘&/Ÿ&Cįčˆ¼¹ ź×AżśupwÅųj黀ϒ:…k[#żõ3ŠIA‹Q O/Ę¢EćśhŲŠ 6Ą–G73J«(q=[5kįś˜÷ēCƒe łė1œ‹“ƒ½ÜŠ8įž¾oę)5}՝xxTŖ诓īķż šÕaĆéĄƒ‹PµL5tč·KæƒA‹O›ŲĘv¶ź?"U–n‡į} ÆŌ>“ŖÕkēbĢØj[ČänFėéź³×ŽĖĖIO”W³fØūA?ų–ŖÆNÜUĻ[1*sJŗź„'µŽT>RŪaģbź _֍ı­Ńˆ^„ęžhŪł £ĒÕŗQ½ —Ē»K®am`8Ł•‚Oż‘’éč2“œī5d愾ā5Øć’ЬbeøxÖü½Ūį_£œÜŖj]¤®‘Y¹Ö ĢØW)qćl|*`óź©[æO8H~ń'•Ÿ€¢vr£×i©k”cēŗŌń„éHĢkÜ ŪŒ;Ié(^.žß^a²®Vģ¹¬8ŽYś=:7o×" °šž5ß²óNśü’ŗn¼ał5JsæZz½Ņ\WŖž„æ'“}Ūc ’ą‚­©§ł~²/ŸBa;99ģĖ`y“āųż“ŸÕĖü¾¬ Š8xóCčiō½ōCīŽ0qģ¾al©cĮŌ÷æ%Ē3Ļućx®ył\'""Ź2ˆæƒ#WŠ( "_ļh €īś` €Éf˜`±`†Ķ›7 Jį‰ä½E ¼Żs»Ńå”Ā”†«½Š|Ū!=ķ¶Šm䏼é‹kܼū Jተä-Į„x'“ėžžP ­Ŗ^nV%OĮ¹h{A)<:q W¢µ¬“Ws!>ķž0ŠŪEp)ŽŃHłõÓZŅUpņj&¤* ‹8 Œn÷Ź^Bį*š¬'Ķ|"Ć&EķB‰Z¾BŁf#„kń÷µ–Mz±Mši²D/vžUƚķ…?"#„šDXÕ¬ŠŠ®óBŻJE„Źļ“¶\½„•ŸKŃNBŖņ”ж°£ąźż‘Į²ø(ä‚W%1Æ•<¹ĀÅhžRÓ§×),®,(…'ĀĪnå™ÜѬōUĆOU½…C1³÷Į»į&õgcuaÉv˜ŚŗłJ-/UŖįu|øPĀŃA˜śĒ£õdźX1·¢»¼T}”ɘßé#“ūj¶)e“žL+ę–ĻI—bĀAԚ¶/¢6V Ų…õ}+LGj©|LO™%uĶ0Dņø’ŁņNų r “šæ»gd±dŗ×ń«Ą¹h{øz5øļ…=ŚvŅŗ»FbD£q€ˆ·q{óBŒY%ߟEz ‚?ĀÅÆ®czė’&Ė`é9(µļ_šz¬;„?ÖLAż¢Ļ±röųvZkŗ®döbķ…Ģ.ćZ·Ėpœw¦H]7Œ‘ŗFŚÆę^Æ4וŖgS×Fõöė4Ų9?{ Ū‹}iµõ¦„V‘š3įē&ƤˆŽ1ó{•3»¬Aś˜5žżoéń¬ēŗ Ļućrū¹NDDdJ¾ nÉä.Ų*‰žĘ°®‡L.’ŁoįX>ī}¬ žŸŖCŌÓÓĄÉĖ»voÄ®ŻńŪ® &בš®K®ó£D·½LęPdāĘZ ž•/³Ī}¹ž¦žŸ¢xŸ)ųzē|÷~l™؞—’FšĒ“Jk¤«ĒZz:!é™Ų¹¬2%I,§Ā ½‹9#ééŗ[c°~4½SČŹT±ާ©J8øæc4O©é…ź`Ōæ8hzB×=M¤tģū.Ę“Ēžm_#°„K–öƒt]X¶Ņū@š”å„źB ¾ģūžō\‡µ£źāĮįCFėÉŲ±bIyÄ-AÜn¹ƒ«śV-ÜÓ ƒ>üÓ3śii×¶ī¾N7ŗŽT>ĘöwV˜{mŒW ·3oæf…LfÕׂ,ć¦L÷ÖŲŲ52+Ü [Qg<Üæ[¾/…Ąΰs©† eÜplŚal½× Ķ=L–ĮŅsPjß;¾4żwźüMÄŃ[—0·IqÜūó3 źJ–ńÆDA-<ļ¤I_7L1}½6–¾é|„źŁ¼|”e\‘ņź,§*uē-ŧeÅGŗvŪC£Ŗ°ģć ø2›Ö·Ę»…Ģ®k0u,H}’g×w;Ļužėŗrū¹NDDdJ¾ n€Ü¾( -.ŽčréÆļƧŹŒüā;œŁŁ ÷Ī«ēM¬źŽ„‡püE  |Ÿ_2ŗŽdZ‚ųFAx󿌣ß*„ä˜æ‡c’į^~ Ī²Ś?¦ōZA2ķ®EōbŅ…tģx&žPH3ŅķĮœ|ÜķdH~,öVÖĆ §ņźEOĻƒfߏÓZ½Ui_\OJƒ LďOQžĆł€÷¼żš_r:„ōlx’÷·śkå—ųō7¤ iųåYœ‹v4X– ĶK éŁ^¤ éŲõ<eŚ2š§ŌōŻÖØ÷㬠/šaH?£é@Bŗ¹' |OÄŗVšµ2F”ź¤$ėĀŅķŚRłJ-/UĖ?n‰=ޟ`H}9N?ˆ€.#Ö“±cŒņĄŲŠˆŠČdńŒ8¾fą÷½[°÷­˜_Ć šėļ[QÖQat©|ŒķoC:æ] UŪ~ctcיŹĪöH‰ū[ė•<®$®R颷œī5Ä@R×#©k¤³®5F·)‰„G›š[ÓįźiżĘWĀ‹«‹ńO‹Õӌ•Aź”ŚgRūŽŲń„’ōl*æ×kļĘC¦pE«z^p-ŻÅ¬rŠė’„†]Ļ5®u,=ļ2öŽ<"c× mę_£4÷«„×+Ķu„źYņ{BĒŲ#”0ūwõ1ź鰗‰Ū¤:–ėĪƒä˜c87¦­Öfj_Š O•bεĄč±`āūßŅļvžė<×óė¹NDDdŠ­ `meķÆL6ŗŒĀ±4VN,‰f†Ū“ĢZæM=o܁p¾ė“ĖŹAĖIėŠĻČ:RÓē[¼ÄŽĘ“•5±hųۘšē×8õįt4hŽK6Ąź°Ń€„Ć{‹ĖFĶĆg{üP=£,='ż_–¶Õ+攓ü8Gz.GÕ¦ćӕ-±£Ū“ Ę”õĮ’õ »!V&cX’ź|FŒ9_¶LE·qćŃć#_üs«¾[ HOŽĘĄ^øųeI­$Īi‡ö¾­PĢõkwĮŃĶāv†ż±cŪwAäÓ{H­Õælž"n×q»Ś­j…NMā8ŠcꆩĖņ͆uh=õ›¶Āė:ā·ÕMŒę)5}ą;GPėżż(•ś §ÆĘŖ€2€6饖yč‚f’į£!°kń5ōšz ?ŽPr?lå9«O^\ż£GĄŌÆ>“¬ K·Cj<=ż½Į|K*ļ\^Ŗ>Ęo¼`,„ØĪ!o£õ$u¬XZ˜tš{\č:õʽ‹rŽĪh:žhœ1oÓŌ)˜yZ||Ļæwl^†B ™ä:RõdlRĢUŽ=C vh˜±ėĢ‘ćQćƒeš*ń *æU§Ā$«Ļ–ˆĒ~Ō<ĶņهFÓ1Dw¹€šrõł4meM‰˜¢Īć³=ācŻÆ¢įĖӍP*# ÕõHźiŒ`"ų¦Rcrc¤oü}?­¢žöVßįH?Nؤžf¬ Rēą[ūĢŲ¾—:¾Tœ ·ÄŒć³Ę]p°QiÜ{V?ŸoV9Ąµ|tóoŒćB1L ŖW–žwRē—ŌuC“ŌŗR×(ĶżjéõJ÷˜0TĻĘņÕT¼ŃDÜÜļ‰óCP¹ę×([¢}0pb@HĆØaƒ‘üā>™sßĪ퉔e`jė’ø÷ūr,½'žGX—!“ńĖź%°’1j˜ŲĀ2įįLœå‹/ē`ō˜5ēZ`ģX0õżoéw;Ļužėłõ\'ŹnOž<±uˆ(‹2ÓČ]¦1b€L58@ģĢ €3ˆƒ9k|vŅXFµ¼£ ŸšŹxĖ–-čÕ»„Ńežž[†ź-Ö ė ĮX2ĮÖõKDłPjüE”l° Ļ®fµļ+Ź)¹mŸÉeÅQĢw_l›õÄČfrŪqE¹oŸš\'ʼ­[¢K—. DΉhśƒ{‘xōč‘Ełx{{£GQ[o.QžU¢D‰É^g ŖńČńxIŸUćŖåR¤i €ŲÄX5˜-ßµÜ*V<ž¾oėbXĶG½‡éMŪ¼eU&R""kHMøŠ “¶`÷±`[EƆåŗ}–ńˆ˜25ÉÖ%”,°åqÅsŻ0žėDDDW¾k¹EDD”›ĶŲóCOBįPŸĢų!³ėŲŗHD” x®e [nå l¹EDDTĶ]·sףŗD”Żx®åœ|õ¶D""Ź=>¬X•Z’`³õ)ūqŁĻ!Ū°u½Ū:2Ļļ;wįŌé3 Ćo»āōéćŲ¹ó÷,„yćü „……į÷ƒm½yD¹N¾ n=>õ+ś·k†-z”CėN([ī=ō™ AHưĄ —‡£K#Ħæiį–žņE¼!—GūĄ H€bŽåбė@qy·¦čŠNŽā[}j¹•FŁfū ÜĖ L“zå0g])ÆĪbKŲ½,ׁ9éĢŌrYqƑµ ¬µŹl sź65ž">jܵ5Eµ÷GįJbZ¦ŅɬK ē ²K)ČeÅ%—ÉļūąJH[ČeÅՃ½£o¦ŅÉ ĢŁŸÖ\/+rÕ¾±ø1±•׷мAݬrNj§™õó\÷8ā>6ķŁ¹_Š”~G|XÆŹ×–õ°åž±Å5†u™ĖčœC†~Xėw÷‡3źŻR]·4ņ·ÖļIKeå÷ų‚  (é^ óN<ĶŃ2ē8§·ŠšŻ…cY¼ūnc¼å”µ/½*uŁz«ˆr­|Üzqq5*6…ūž3pźŠVģłsöLrGŲ† x™.ĒŖŠpōh÷“(Œ=öX½ŽƒC3ŠŲݰ;ō+ŲÉxĘī_Ŷä.Åŗį—°ķ‘ńżŚ»˜3Źt-ZÖśėńš³Œ6%6…±3.f±ĢKgöŚ­VØqk•Ł2ęŌķĎK…pīųaø_ų ƒf*Ģņ>ŸWp7ŗL~ß/ĻĒ"š×_pāä^œ8¹ݼ^g*ÜĄœżiĶõ²"7ķ›ßž»‰[ūgz[²ŗ¾„fÆżY‘Yļ«Ńē¹īqÄ}lZÓfcq&q(vœ8Œ3Gæµzśšl¹lqÉN¬KĖiŸC†~Xļw÷ǦėŻr–\·4ó·ĪļIĖeå÷ų̐Æ0«D:>ū ‹MŹžSŚ·©”7Ķ·MõxZāCœ8¼įGĆ±ļš X7Ŗä²āxwÉ5¬ l'»Rš©?R2}ś»^*/KĖlˆ”õ éńQtmŲ ZtFéŠm°źāKõ¼‡‡BP©H9ToŃ«~깬8÷™%Y·½ŖTA±jC_~ ē"ķ`/·C§"NøæO’G‚±}$U®ŠOÄÖ>V }½ZptŖ„ń=Ö(ó2T,R¾m†"ĀĪŌ’Ģäļ}šōb,Z4®† żŠ°alytÓģ} u|›*oŅÓcčÕ¬ź~о„źć«wÕóā¢ö¢mzØ’~KTØŪ æŻM0™—±żi¼Ž,9ņÖ¾Ł8”æxtüšU¬ Ļz˜·w;ükŌ€“[Uõł0o`W½’I–ŚNCÓu×7uī=8°µ|„ĪMZ£s‡©Ø^¦“d}K'ā9)ąZÕŖ©—GęŽ½7ēyņĖhęYŽ…bģ··2}qßĒm[tĮÄT¼ŗ³­ŚC¤L<’·ķ£.ý=Ė“ZŠdözŸŻūĒXŽ€ōµĪųq*½ļteöślģū­ ÖåŚa!—GÉ÷‡įŸ„T¤%Ž„w±&HP ø½yŹ9•BnŸJÖ¹ī9dč7Ōļ„ĢüĪÉ«ūĆõnź|Šečŗ%uĪč_{µO»®eöü5tLgõ÷ø³\†ŌDżć£ ¹uā<ž'yĀæ©?<’ž#āÄfĶÓuüä 8TōÅ; #łE‚9YQÄ«Ø"cp„ųFDŔP€/€w“Š@wż 0Ąd„3›"oŹIDAT3̰X0ĆęĶ›„šDr(ī œ¼ü.ćZ¼»šōāA&³ĘÜ^ĒZ­>!üPŁK ·<ĮĆgŗŃ4-jøŚ Ķ·ŅÓn ŻFžØ•WŃź”’ėżTÕKP8?+ˆe«ŲJŲw撹ēĢBŻćĢJǜü“ņŹB™M­æøVaĮĶ»Ÿ žKŽņ\ŠwRĻčķ"8y5R•….EB²R:ī•½„ĀU>”ĀĮE!¼*-”ĀaE%OA®p±hI—ė”@pņj.ħŻz».Å;Ŗ×ZŅU]ęĪEœ Se¬jVEh׳”n„"BåwZ [®Ž29¾•w‘oaĮ”P=!YłDų;ø–PØ|Kõ¼Y•<ē¢ķ„šDčTÄI(\uŠÉ¼ŒķOcå°ō8ČSūFx$\Šuā^ü"œ‹“āÓī }Š;kœõŽM©ķ4<]w}ćēŽ@oᢄø_…źŃW.Jnƒ±ćÄX™=öÄķX/Ä?Ü&ųz×=ŗ“-Ē÷±ōµÕŌłÆZv[5ĶßÖ½Ž[o’Ļ[r[M§RūĪZ×gcßo¶.…‡B#w”ĮŅæ„šDˆŽ=@hPČAŗ|CP O„Ń>o OR©sżsŠŠoCÓ2ū;'/ī[Õ»¹ēƒ±4 Ÿ3&ņ7v]Ėäłkž1mžļń?{ś„ߣ’“LkóęĶBrr²””¤7$&&ž½yE8ö×A‹†o^?~œmĆŹ•+…µ?՛¾võ*aŻO'…Ē 'Z'¬Z½Ī¬y+W®Ömŗ ž|pūaÕŖõĀį£g„{²o;8p,°@0€iĘ @o“Š(#NT@ٌų‘GF<ÉQ#Ę$‡”fŠ&䫖[ŗo„=?{ Ū‹}iµõ¦„V‘š3įē&ƤˆŽ1ó{•ĖŃr¶­[õėˆ_ģšoZ]62l9šÖ¬‡zŽÅOO‘ž’ńlŗL|Ń„BŽ T.Vów#b÷Œ,•K2/ ĖlÉ6u=Æć"Š©c_„Wk€ RÕó~y– ēĀm )Š„ØŲ²ĪĮČ!¾ķĘ <»¾F¬é‚ŽӤ˄øz÷†‹Āķ ;"ńÉnõz[Ÿ&Į¹H[(d tĶ(sAŻCĀbOŲFœ»vUoĆąÓĢ/¬‘ćŪXyæŗ —bĀAԚ¶/¢6«ē}õ Nžļ>šrBģ«Lęel+‡„ĒAžŚ7_ĪEŪĆÕ«1Ą„x7ø(ģѶ°“Ęł 0{; O×]ßų¹w6.ŽrdrGČ®([Ż[r Œ'ĘņČģ±éi·0 ž@8Œśž%œ²å8ā>–fźüW—@¦yY÷zo½żc™ƒMõŪcv?\ĶĮr~ö[8*,šłĮ°bķ¼¼%ż¶“Ž}æĄ=ƁˆŻ¶ŪŖļĆ/“ū.ŪyX­\Ęņ²¤Ģ–lsš8yłc×ī¹kfīĖīBö8Ÿś š4U ÷w,ZßT¹d2G€Bē«G Ž²Ź,Ž5ēÆ} LI‚ÜĮ2…zsĘī[Xœ†”ćŪXyÓ!Bŗø®ƒ«vZ!ŻČVŹĖŲž4VKƒ¼øod2{؂ āøéŸūRŪiɱ-uīśk*Ŗ“ģ‹…ž`̦mFĖaģ81–Gf=”&ō.‡÷|„?FD m1'“ifåzRŠ÷±.cēæB&ƒ±ļ^øĮŹŽė}V÷±¼m«±ćŌŅļKÆĻĘ¾ß r]Ö n‡„ź+°öö@üÖ«&VzÕývĮø{“Ž’|©É:Ļ¬ĢžĪ1%7īCr¢ŽM‡gźĄS×5KĻßĢž5ö{ü.A8ł0 ¢·ĆUž‰Ķy† ó÷·]ķqóõSoįij:ģœ+š1/#A™ń' ūœGŪöļĮ»čkģ?żĀÖLd3łŖåÖŲ#”0ūwõ—ŸCĘ7£½ õ…¾īœ1HŽ9†scŚ”Ė+µR4|ŖŒĄČ/¾Ć™Mpļ¼z^eg{¤Äż4k_Bŗ¹' |O’Ž”F;Tm&Cé(‰ŽśRyYZfK¶ybUw$<܀ć/Råkü“ų’z^·¢NHzžŅ…tģx–d²ž5ŸńŸŠ¼’žķEšŽ]Ļ“Q¦ż(³÷‘ŃrIŌ»źS×¢NHz±O«ĢŅu“æ÷Į{Ž~ų/9Bz6h‘ønI3ŗłś=)u]ĖĢłké1­yā>ņ®\M¾ƒFĶŽG•Ņ…l½ÕD6“™6 2mT ;są Ąbē`ĪŸ4–Q-ļ(§¦2޲e zõniė:“”%쳫YėūŠōķō­Š.—_@)<ÉR:ÜG™Ē}{ō}sśĖŃzŌ3ūՆnīYˆ¹ŪäxpĀÖEĖuøs·¼ŗr#ÖeīĀżAšMĄ’ÖīĮøĆ'0ĶÆˆär[·D—.] śM9 M€÷"ńčŃ#XĀŪŪ…<ŠŚŗZˆņ¬%J„Hš:cP'fŒĒHŹų¬W-— McÄēoUƒŁņUŸ[¶”šp&mĮīcĮ¶.Šžzӛ¶yĖŖL¤d»¼’3įIGę»Oµå>ā>åęó$'pßdYŸķD¹gѳ©ų?¢7āĄĀ=…sō¼Ė øs·Üøņjż².s—‚ņū+/—)§Ķ ł 3C¾²u1ˆ(ŸaĖ-ŹõvϜ†QK×ćŽė44ļ÷16­]‚łłłü\ˆū ÷ā¾īļ’A»Q¶ŗ”IxP“¾YŒ+±i~~Į}LDTš°åQސ[Zn1øEDDDDDD¹ ƒ[DyCn n¬’Ž'"""""""¢|…Į-""""""""ʳؔ<Q.v.l%v]OBŁ¢nHŒy·ŖŌ±VŽä=¾’D,Ūš„­«€ČØ<ÜŚŗå ­‹@DDDDDD”#łK”ÄĘo†C!%~Ū!…Cō^‰lϟ-Ź ņ\p«E‹¶.e£C‡Łŗ¹Ę/«Ļ¢Ś”U-£ż°ŖśE‚ŽŽ5_ Ēo§0jī\ų—¼ˆ„—ćIŽų:h ^ŻŚƒykž†§ģ1Š“˜‚‘­ĖbĒŚ…ŻĻ»—ÅęćGFhZź²Į4š»?Äźķǰnēn”°—LoĶƱ+¢FϟŠ*»ćóĄ ˜øö+¤æü K'.ĒSæ±|Ģ[W#åsģs‹ˆˆˆˆˆˆ(—:ū½µ¦9•؈×1āSMƒĘχ—ky“­é §"ļ濒°hl `Ė‚µh3ķSL™9{W~č2h*Ņā/ā =0#x(’“$Óč2hŖV¾†Ņ8~\ŽĘ•Ż‘ŽeŸ`mtœŠ¼ÖeKaĮØž¶®B*Ü"""""""Ź„™ńłrūā\ęö¾H† LĄN·žp•‹+|ń§Öü߬:ŒęMŽV­AP¢] O8z6Ē֕S¤”20”žĀ¾ŗ8Ąķä4Ü’ć7L3ĒWģMģˆB @dyī±D""""""¢‚ĀßĆ·%Å\ŌӒż GĻ–źĻõF“Ąųµ7Šøė1T’ųĶ#€‚ h3b,øŁė„ėe§ø’JC“Tz’ߎ}ĒGUå}’ĪdŅC=”C轄nĮ‚Hl+Vl¬u]]]÷Q·Øk/««āڰ XPŠ ‚H“%J„$HO&sŸ?¦0“̤HŸ÷ėuɹēžsī9gĘ?ęē¹ēŽŲFl;”ÖėėŽė/ÕŠō;tųøY¹czÖōōįĮŹ-j©k§ PĀ{ Tl8slśiF‚.¾o¢«LX«[ŌdėgŚ>3]S[†¹ņĒ5 тĶĒ$IÉ?æęŖ/IF‰ūxoĆ^¶øĢö¤¦ƒnŃī™?kē•Cģånl¢×ĪŅ5šŌōōįAp €Z*ņ’æč±łśūKojʇź­Wž©Ā‘Oéį!MO2łé¶Ė 43š:ł»żŹæö¹éŹżü=żĢ’éĖƗH’ę~jß+ėŻ¾Šęģ"Ÿm¶|}ńŃĖŽ²Ÿ+ĆjóŚž$YBŗėāßiŹÅ‘’¤f—Ü£¤yõ5¤žæ€s”*æšÜÉžh£ó()HR°¤I”Ž“ó<Č­Œ³| a—wćY³fń¶D8Ļ-[¶L'N”a„®yĖ“¤“”$„§§Wź>‘‘‘ŖWæqMسš5kö†¤|IŽĆ™Īu¤³%å9Īig¹BIV·C²/*tĘŹ-ŌY·Pg՚ąVāž5ŻŌ1–šī@µ0еsūFķJ<¤–ŃŃ ”MY™yjŽ½ÆŚ6 ¬z›ń›“koŖ®?A!f“~[¼B—޼¤jķ•Pm ÕŻßŌ­«•j×ńĆŁŗśŠ!Ź:°Mq‡­ 3eÉŌ°—śDGH’žøP~~’¤ā"?{„$éą¶µŚŸ¤pæ\Gk@×f’¤”„?+Žj4×ZP¬1ćGk×ö Śéö9–×—ā¼CZ»é•Æ–1ƒéøæÆ{śŹ/8¶Wė÷f)Ō–Æę}*2Č1ķ—Ė(֎ķėµ;ń°®¹ęWö‰ŌŻZ› £Ę©”æÉē^mÄhĄ īJڶѵā˰)­QG 8XCūGhūļ»JµŁ”{Œg[æoWć~½Õ³Ļ@8’źŹ?t4KCśōTļ~Ż•¶k£$©i›Ī’¤}ūŖkTp©¶ö¬‰SxÆ¾źŁ£§śö SģšD×=m¶nŌI1ė’K:饶^Ǽ>!Ym;wV—ż”yÄ÷˜Ė)ļ-æŗūŪ£GIRēīŻÕÉl‹éÓ^ +WjĶŹ]rYé•VYūRÕ¹‘ē#¦Ū¶mUE6på™Ć2µcū­[¹J‰Ē <ʟhŚIy~ĘŽśrŹjSÉ,³)H6kf¹÷ō•ę',¶É0Še³e»ņ}µļķ»ćü®Õļ3Tƒ P×fĒUeĶCeĘPÖü—„dy_sį”spŸu9½*Ķו÷=©h¼ż÷k³fjĖńÖjTśŃU_’½ūjæ¬ļ zwĮ­} ŪµyõRķź«Ay\;˜_¬CŪ·(n[ŠZ5Æļȵ’mf_©å_Ƶ¬¼“ģłƒ÷@U-żd2jĢȋ\ł¼Z~&Éä*Ć(wžmķϳŖEˆ}O搲ę$z”kķXEęŲD¶āS^[ģŽ¼¾ÖżŗB;SÕē²!åŒŁwyļłÕßߒ ²²ŌjČ0ujah÷ž„®§i¬ĻÆkÆŽż4$¦©¶¬ŽģŹÓCŻzōV’˜Vڱ6Ī£|łŸqI†J†9¼ŻÓW~æ®­“uĶ:mٶ_&S`¹ķūśī(°ŖM}{ż€śm*4ŸeĶCeĘPÖü—„dł²ęĀ(:®ĶéM44:ÜKKžsTŽ÷¤¢żńößoZÜuė嵾ƒŽĖŸŸŅß!@õ:K“kß„‡ع–ü¼I':]©–Ó?- Im{õQ3’²~¤RŽzŪ—ēšĪŚ—؆!•‹e\ó3•ߟ¶1ĆÕ(#E»vlӒƒ'4zx2Ē쫼ÆüźīoI÷ÕąN o£ß\.u½śō½ŠŽėh£–^ėł·’­(¾T¾%عlE[˘mß}¬o1+ß°É¢™,¾gÉüśŃżtE“d+<¬ŌƦrŪ/ė»cŖÄ÷²"óPŃ1”7’^g×Ky_s!Ł”°1Iż‡ōõÆ9*ė{R™žŲļģédP#eīŠWšQ,Éžųl½vÕ&Ōßkł2Ē[Īw،ŻĖféėŲtE5Õ±Ä-²¶›ØæŽ}ŵ¹āæOie@ķ\HŸæ’¬™ś'½žŁ«52¾š¼7ĪēŃŹ-ĆõÆÉæ‘w Õŗµ{<‚0ķƒ-J:’'IŹ:°É£ö“…’¤Ā“d l]ŖMĻ„vA%eŚėä¤Ę¹ŚŁø'U]{vWĒvž«ĘüL&†—v„č‹Ņrķ?؋óŅd n絜ēH=­]¾Gõ·T’!Tt*¹Ü1ū*ļ=æŗū[ŗœæÉ¤ģbC²ęŹd ń(w4AQŃay«M$Y Rätz5ÓŖ_ķ¦Ė/°„ĒżŹ’ŒŸmx€Ņ ŠUœŸ¢ĄˆöåŽÓWžĘÄ,IRž±}ŖݦÜö}}wZłiV‘$©(«ÄfP>Ęą}*?_ó_Öēķ­¼Æ¹8¾g‹ōķ£0?³Ņ7,-wŽŹśžT¦?ŽžūķŽ£‡zōč”īŻ;¹Ī-_’½ūlßG’€ŹŹˆ}O›uROüéaŻu×4żłļOkėļæq»Æ-آۧބǒ8M’Īipiń“Suøčō’>&°…3U•÷ӛÜÉ s~²Æ³Hņwni·ė÷ņ>0}XĆFMʼńöķŪÕ®]»ŅŒb%ÄĒ*ćx–r­†6i¤°†M”±7NI™jÕT’Ń,DÉ[¶(õČašk£Mģ?HŌ6°H»“(ń@Žŗ )aĒ&e?„lk±2Ž$ėä‰,e[„ĘM«I³`ķ‹Ż¦“Ćé:fk®MėI’sŽ(~ŗNe[Ō8’øŅÕD‘ ƒ•®©™*6Bu$e»£]G[Ķėk’–8u\d©óĄžŖ`Ö®ųŹ8ž„œ"©U³&’Q¤]»•«`5oį1łGw(éx–ޤTżÖżÕ0øĢ1ū*_*æA€Ūķ;ø×>ļVC2×SDØÅėżļSzź™WuóĶ7ėūž×_^üI}“[oĻx]Ÿ,JÓÄ«é‡×žŅ§ėöhū’Ļ“<%JõŠŌęųōüæ+ćČa%›:*qɛķVe<Ø9ƼņŹZIVŁßVģ–.r¤ ‹ÜŅīålnG•Ue;˜’Į-÷`U€¤@IA’‚%…H u¤ēAneœå÷īŽ<ŗc·2o‘‘‘ŖWæqM·L׏«qĪÖšzĀ}zĒd?ó±īh¦ģéŽēƒ5ūż%Ł4zōXMzćKŻŃ)By‹tżŻ?čĒļž+I=z“>ža¾c {Yēł=Ē뾙ߪ»včŗ©’Տ߽WŖŒ­(Mc'Ü„… J²i̘ńŗņ¹Ot‡mšśÄ:}żž_ōÄŌ[ō÷O>“9w‹&Žō’ę’ųe¹÷®źxP3š5kö†¤|IŽĆ™Īu¤³%å9Īig9g°ĖyHö‡qœG…±œĄ“•š7Īŗņvß]x4O7 ’$5½X¹‡ę:®ŲīhėxŹØ~_Yó}½XĖ34`3$³I&³EFq”×2ž‚™e6ź”ĄˆĖōõū‘$żū³™ 4›äUĘ[Ä=Ū­žńąBsŽm(_Y»¶o$ÅmOŠE½»akTŸĖ#µsŽäcå–ÉTö—€*¼šė‰Ūź_/¾©>A©q×_½–1 k©¼’o_?óeĶ?V_ݚU<ōp6ʃóßær«sAŗęšklj‰÷^¬„’~”ŪéĻŗOžéJ_¢UGņ%IłGW)¤éĒūSJ%E6·‹Kä:ĻgĢŽÕmM×CO½¦ĒE»Jµ “h{¶}%W֞ńŚ+yƗg’¦[ī¹C׍ķīq=ŠlVN±Ķ뽫6\čĪ åē 6”wėc«Įźb‰×;_ž¬}{wiżŹŸu¬Ķ$õėhĖz‡!m“č?_j×¾-[’¢žŗ[­Ćü5룵eG²Ró ]Ó[†-G_ĪśAéF%müVŪv$+%Ļ&æ­µzĪŪŚ¶ć€RņlźŃ„±R6ķŠ–Mµņ·eš÷õLm:ŃZ÷ŽR׹ĆzēĶŁŚæMi®#Ū–jOaˆ2¶ü ŲųJĶ3Ń„›¢/ØŖ(V-ZÆÉAź~,AkÕW»6Rxņ:}²*QÅQŚōėū®{÷źÓS½†µ­ÜxŌDC{EŸÉć °”|-ŚPP{°”|ĶyńÖė4čõ/tYCū¾WEŁ[4ń¦4’ĒY5Ż5ŌBl(j•Ż™… 8żWĮÉ}ņķQÓŻŹtĮo(ģžžč$½żüˊk×T&[‘ŽĶ×_^}“¦»”‰ą$µ¼ōVżūҚīP9<–€:‹•[€ Öܹskŗ ĪP n-[¶¬¦»8O4hŠ ¦»ą Õ©ąÖ 7ÜPÓ]€óžaežūŹ«īŗPģ¹€:«N­ÜąBҽ÷PuėŌBÉ{w+ßšSxƒ„nŻ }Ē ŖÖ É¢ī½bŌ­S+-üīåŗbģåZ:Ÿ-€Pw±r €Z*~Ėļ’¤½Ū·iKÜ&mŲ^¤>®zƒ†Uń[ÖzdI`«Ż„cźgŖéiĀŽ•[ŌZžūēdĖģ×Ō#/°A“†ön¦#TyÉė“y®ŗ÷¤®šč×­ūŌ±qøźÕ ŠŽµ«”t²Š£n§^CŌ»sK×*®€śķ4¤OSŹ Q=#Y+6&J’:øTĶSŹ h$ĖÉ­ZDĶŚuULÓ`„ō S©ŪŸš+’°–ÓZY'r¦żÖ)-×ŖN½†ØG;ż¶+KŻZ¶RøRµą—Ųšž\œ'X¹@`¶©u÷VJŪł»G~×”½”“vÖ®ŁŖö}ŁWgÅ­‘É䯻“vĶ*­ÜpB½/źZŖĶŻ[=Wqu¹Ø·ŽnܤøŲ5jŁŹ•ߢY=­ŠŻ¬M¶ŖeūʱĆI;%I[c7(>5×^’’Ś¼Q[¶lŃĘø, ø¤“ė>~MÕ>s—Ö¬Œ“Åā_ÓӉó+·Øå:ōč)£aÕ?²FKvdx\k짐^żÕÄ0”œ’éȵÆų:xŖH’Txź€,Į—HŚR¢eĻ•aķ‚,ś5ß*Ćfhīüå®üåóēK’L¶™Ģ>ūŁ>Ä¢9VI’5ē üC/‘“Ćq“öeä«Ųš¬%×ō”āŻėiOžUż:5“ē§djąĄ¾źŌ:T’“gÅz…õéÆ>½ūØßśŚø"A’Ō±ē Ē}ŗ©™?”TÆŖ„NMn‡d“ŃyH ”$)XRˆ¤PGŚyäVĘY>pļīųĒ£;v«éł€ žQāŃ1ĆĖ£d†ĒĖjŖnZJ’ŅÓÓ+5ĪČČHmŠ‹Æīé«5&Ož¬…ß~£āģ˜2eŹ’ņ%8g:בΖ”ē8w¦å %YŻÉž<¬óØ0Ā„œwģėQĢ< ˆ Į-Ī3Żz‘$õļŻ½¦»œu¼-€óĢŽ-k“cKM÷87X¹€:‹•[€ Ö„—^ZÓ]p†X¹€:‹ąź,‚[سŲs €ZźÄ¶zė»ŠŒ ׉}Ūeéq“ūĆąšīP«°r €ZźŁgß×°‡Š=wß­Ēž™®uæüčŗ¶ųÉ©:\d+·Š–ź*VnPKŲ¤}³„ˆ@Y‚;kĪ'ĻK’6/ž„7·dhŲ›Æ«Ķ°©śĆ&śįµ§“ÖÜZͲv(æżśĖĶ}J• Ż9C3¾Y„˜Æfžf}śß§ōõ¼8-\øP’÷õZp²”ŚśіõŅcjz €r±r €ZźÆÓGkń_ļÖso}Ŗøä,W~ߑ7H’īzčżaHIҚøƒzöĮ{4ż‘;“źė—¼–›xĒ_<Śæå®?zœ?’ł/ŗśĘuó)bolMØ‚[ŌR­®¼WŸĻų—ŗ§ėÅ?žA/æŪgŁ6Sf“ü£d³fś(U2 ąēqvū%ķōÆéé“¹+ōą;ĻÕōš į±Dj±ąf]4yZøäSŻņų?õē‰Ÿy-·~ę˚¬¾ŗ5«ųO}ưzœśóŪź¹ķ7}ńÉ Mūu¾zóΚ>P.VnPK=qė$ÅeI’‚šDŹ/°­ėZ Ł¬œāÓÅæ<ū7ŻrĻŗnlwI’į£\Ė@‹¶gJ’²ö/–$9Æ>óŠ7jŁóRżéO(+闚>P!~UØcr;${€ĢyųɾĢ"Éßqø„żŻ®[ÜĖ?ųĄōa 5©éłŌAY§2•]©:aaa ©é®—)šÄ^}<{•Ņ’“rŁ^]óč£j× P’ž¼NŸ¬JT”­­ŗ¶ SżC±śhŃzHR÷c Z«¾ŲµQ©r]ƒė7gkKü6„iøŽl[Ŗ=…!ŗØOßņ‰ĘŠęߖ©żkpW~§Ć·W^ye­$«¤bĒįL9Ņ…ŽæEni÷r6·£ŹLU¬ćÜrVH ”$)XRˆ¤PGŚyäVĘY>pļīųĒ£;v;§ 4Ć0Ź<÷•W“uÓR’”žž^©qFFFŖ^żĘÕ=}Ą£Y³foHŹ—Tą8œé\G:[Ržćܙv–s»œ‡d_pč<*ŒĒPgÜ@Ep uĮ-ŌY·PgÜ@Ep u–„¦;@MiŚ“iMwĄbåź,‚[سn Ī"ø€:‹ąź,‚[سn Ī"ø€:‹ą8'ĶśT³Ę×t7pž±Ōt8?Ų“błb%ģ>(³„”Ś“Ŗ§üģLYØsļźŽ:¢¦;xf£+<¬¤“PE· ;³ņFMēVnP-ĢŗdųՒ$KH'1Rć&NQŸ¦9Z½hŽÖ§ęÖtĻ€”=+Õź gTžźnÕ cŗ×ō`pžaåÕĘTź¼Ż€«dŁś…ā—ĒiąĶC%IEYūµäē5Ź÷R~Q†”6až’$k~š–/Y£“ę0ŁNœPēcÕ«Y=ķ[³HælOVPƒ«tŻ š÷K¬NYmŗū÷÷ŸµlŪ~…µ¤°Ģ8Ķ÷Wß+*uķļ:œeØŪØIbo?/UĖÆRŽ%D9ŁVõæj“ŗ6 ŌīU?iłŽƒ k=X r·*õ„UŻFOŃŠØķZ³Læ%ž’ٲAóęm“_@”FŒQnźĶ[¾SįMš)óČ Eõ®į}"½–o˜®ŲŻi jp•¦Nn[ę<”Õ $Vnp™Ģ”jāļ'kŽnWŽ–…æ)=§±®­å¤kłĀm®kŪē’¢żMsµ.ļØŲ„«$Iķ‡^å*ŚŗÆ†øĪ; !IŹ?’”ŃGØø0[qæ&jŌ¤›ÕŽßŖ„_V»ŹĘ/XŖŌģ(M;N½tRæ/X)Iźt‘}ÕYŽį˜x“:Ś\õ:½B’Po€Ę§Ń#c$I!-趛§jŌU#5  P{6.ńY¾’š1„ęĘ×<”Õ $Vnp–†L¦ÓĮØų¬Bł…µ$µ šSņ©ķ’śI’¶fČÖ^fI ūŽÓmżżµ<×§˜=‰ŁO,Aķd Œr¤;Źb2«U E{3“\%·fØŲ|D‹-’""Õ\ÅmųwvÕŪu"IeÉŚ§_7ģ_ƒę2ēɰ—QŚT*Ē÷į²$Ėf+Ō®¼"·;Ś÷³¹ŻŪęŁĒß^²ęīTzA±dkOœsÓw[™õź[̲‘ūU«!™LAövņ­å”/ݾļy(»/€;æ*Ō1¹’=@ę<üd_ f‘äļ8ÜŅžn×-īå|`ś°†šŌō|ź ¬S™ŹĪĪ®T°°0UļļP›V­X¢£'eē*ćH²¶ĒÅź„_3 ¾|”:5 t•lܦŽ&ļŅö}{uŹT_]=L ķ?ћ“k¬ć‡Rµ~ć6ķŻ“ Āf½Õŗ±}#õ óµ#!AńI‡Õ©­ŸRŽäėxAØr’Ö+%#K6k†LŚ)mļ6٬ĒeiŃ^žūw()ßŖćEŻ2BŪ5ŃÉĆ銯°E‰‰{eiÕI­jėŠ…m§īT¢[½čęŅŽqڼ-AIIūÕµKg5ó;©½w*łčIµkeSrzžN·Pt‹°RåóŽģUZF–lEGd n­M‚|ĪCy}AķšÜsĻ­•d•Tģ8œé"GŗŠń·Č-ķ^ĪęvT™©Šu܃[īĮŖI’‚$K ‘źH;ĻƒÜŹ8ĖīŻ’xtĒnēōC”fF™ē¾ņj²nZJ’ŅÓÓ+5ĪČČHń;Ø:“Éō†¤|IŽĆ™Īu¤³%å9Īig9g°ĖyHöÅyĪ£Āx,uĮ-ŌY·PgÜ@Ep uĮ-ŌY·Ø„Ž{ķ1ÅÄÄčŹ)Ÿ{äĒżs²bbbōųėļ)Ļfœ“¾¶<½’ʓЉ‰QZ”­¦§p!ø@-uļ£/I’Fd¦ä‚bWžœ=ż%I/>rÆ‚Ķ¦sŅ“9X÷<ü|MO P Į-j-ūĻö‰×5Ó±G%I™K”yS_·«v³ž½_÷żżeżć±?čÉÖK’¾xė :A›f¾¦§ŸxT7Œ —čŗę¾ ėŻ—īWLLL™ķIē&TĮ-j¹Ö'kėŪ+$I©?­ūū7)UfŁś$½žōcz♵ōć§%I7?ų‚Š SµŖßmśēæ_ÓGݦļ_ŹuĶŻ½?Yn{@mDp €Z.Øįxu:2C‡ mZńó`u ¶”*óĮŸd6ÉŲR¶¢ćŽ\ūĻžńźŪŪ‰$k^¢ĒµÓü*ŠPūXμ p¶Żuq=½ŗv½N\v™nVN©ė+ßū›ęi ŽĶK’Ō0•’8”aX+ÜP›°r €ZĖęś·ćWhͳOéŗQ-$nWķžöńbŻū؃ŗer©D Ćk«R› ‹6gH’Nīėq­¬öxW"jæ*Ō1¹’=@ę<üd_ f‘äļ8ÜŅžn×-īå|`ś°†šT¼8dŹTvvv„ź„……©¶’żąĶæ(vk’™¢5rų5ZpļīųĒ£;v;§ 4Ć0Ź<÷•W“uÓR’”žž^©qFFFŠß”@ՙL¦7$åK*pĪt®#-)ĻqīL;Ė9ƒ]ĪC²/tĘc‰Ø³n Ī"ø€:‹ąź,‚[سn Ī"ø€:‹ąź,‚[سn Ī"ø€:‹ąź,‚[سn Ī"ø€:‹ąź,‚[œc‹f}ŖY ćkŗēM?qa³Ōt8?Ų“błb%ģ>(³„”Ś“Ŗ§üģLYØsļźŽ:³øQÓż-ŃūĀĆJJ UtŪ°ZŻO $‚[T ³.~µvϐ%¤“FŒč%ÉŠ¾usõĖ¢9Źs³¶‘$]}Ć­5ŻŁ ķYł«ÖģÜŖ}żJ#ø@µ1•:o7ą*Y¶~”ųåqxóPÅ.ŸÆŲŻi jp•¦Nn+IŹMŻ yĖw*¼I3e9”ØĆ5¼O¤ćŚF-\Tõüņ„€¦:yģ˜ś“ń×ņÖz°änUź «ŗž¢”QöąYQÖ~-łyņżƒ”_¤a#GØM˜æ½½C›“pŻQEå*8zø†ul ]k–é·ÄS2[6h޼mņ ˆR³ĄōRż“ę§ił’5:i“ķÄ u1V½šÕóŁ.p.°ēg‘ÉŖ&ž~²ęķ–$õ>¦T™tżĶS5źŖ‘PØ=—ø®mųu«ŗ”+®ģ¬ƒ‡Žhōč+Õ颫%Iy‡S4bāMźhSĀ/«]u¶,üMé9uķųkÕ(']Ėns][šÓ&õ¢+GŽUīįS’¤ĪCƐ$Ō qćĘiōČÆżÜ>’ķϰh☫uy×@Å.]Uf»Ą¹ĄŹ-β"ƐÉą83•ŗžµ?NænŲ!æĶeĪ+’a+v];ZhS3“$łÉdņWXƒ×5’ąĪ²˜ĢjhŃ®I®üų¬Bł…µ$µ šSņ©ķ’śI’Z5Ö¶e?j}Ģ]:¬s½.ŻĻ­™²„µ—YRþćt[׵з T/VnpŁ Ó•QdS@ż>Ėü“l£Ž¶Õ˜+‡«s°æĒµ±ćc“nž"ż²x‹z\q™gE“Ÿ¤Ņ?īK‡„Nļ ?päuÖ³…vm\”/æž„Rc1$ɰŁļaö÷øĻ™“ œ ‚[T›Æ4¬ŚžŪÆ2™4ąŹ.ŽL›ćšĶUĢjH&SdkO¾Õ£„µĖ¶ØļČ«tõ5S4ØUØĻ6ÜėōPqaŖ$)µ°XžaŻķ׋³õå×ĖŌmŠeš8²…¬9G\uė[̲ŃéKߣgx€¬¹;•UlæSzĀęrŪĪ6æ*Ō1¹’=@ę<üdŌŃ"Éßqø„żŻ®[ÜĖ?ųĄōa 5©éłŌAY§2•]©:aaaŖŽß”6­Z±DG3NŹ(ĪUʑdm‹Õ æf|ł(uj(IŚ“bŅ2²d+:"kpkµh¤f~'µ÷ąN%=©v­lJNĻӉāŠn¦ō}ńŠ]»A±±±ŠŪ¶Syam•¹}©R2²d³fČŌØ‚Sw*1ßŖćEŻ2BŪ4ŠŃä]ھoÆN™źė¢«‡©A ŸLęÕ7Ņ“bĖ^„$ē«ćąŠj$IŠn.ķŲ§ĶŪ””“_yGö–źg“vuüPŖÖoܦ½{TŲ¬·Z7)³]œæž{ī¹µ’¬’Ї3]äH:ž¹„ŻĖŁÜŽ*3U±Ž{pĖ=X )PR¤`I!’Biēy[głĄ½»ćīŲķœ~€Ņ Ć(óÜW^MÖMKIRzzz„Ę©Śž;ōČÖåZ‘¢~K’N&oPģ>“īŗcJMw ÉdzCR¾¤ĒįLē:ŅŁ’ņēĪ“³œ3Ųå<$ūāCēQal(@-µas¢ĀFŽØö‘öMä3­ńڜ̊(ĄĮ-j©įWō×ā•‹õsƒp™ «r‹Buń‹jŗ[@­Bp €Z*“e];¹OMwØÕx["ź,‚[سn Ī"ø@-õīKw+&&F¾ń )łū™šzÉMķ½J·uŪč;\é%/ŻÆĒß|EWOz¤Üz†-Oļ½ögÅÄÄčŽēßVrAńYÆaĖÓūo<©˜˜„ęēøŅi…¶*ē?‚[ŌR÷?öµ ²ØĻP€Ij=ńõlÜ[o=ro„ŪśdįG®ō³ßlŠ÷=¢>U~pĖdÖ½ž[’ōąC÷Ŗu _•Ē3÷¾ŃeŖLę`Żóšó„Ņ•m×}¬8’ń¶Dj+s€čŻH|{@SļļŖ¢Üx­ét»žl²_ĪÜłžōśZ54§©ÉčéńńķōÅ[Oč¹YzļÖ¶śpé/JŌpŻsRƶT?®YÆŁļ¾„›”Ļžó–¢Ś_§s®ÕœÕaśæÆž«+źmŅßnyZ;;ŽÓÆ<ꎷ„/ŽzBoĶJŠļ»TßmOŃŽųDõ½ć5=qm“$iżG×7™MŌĮļ6릿AėęžO’ÜpD—’ó9E_~Ÿī©YĻŽÆßĢķŌüŌåvzP/Ü=P’Éķ¾&éšV¾d»a[_wµy€Y9)Kõō?«U—H„ļIÕŲgž”Kš…”;Ԭܠė5}Ręż(I:ŗīæŗčī®®k=ö–®yńŸś×ĖéūWž–$Żüą *ŹŚØļ;ŽŖ—ŽxDł¹YŗłĮ\u~ųaIŅķ|Hw\ÓZ’ż=µŖ×V£Z„* übnŃ@Æüćį2ūtóƒ/Øø0U«śŻ¦žū5}ōŃmśžõ§\ןx¾&Žu§ī~čļj˜°F’4čš;ķ÷śŻ3xēu]÷ÓN-™ł×r+ßū›ęi ŽĶ+žØlyI2›$Ćuf”ŗīk Ø;X¹@-7ōŽīŠ{óeµ½§ÆGž”ØP}³žØ$iߏĻ:rķ«{†qģyÅ„Ņvž”½ō@ĆŁśžżezxh3/=°¹żėė§Æ?4õ3µé?RϾż¼Nī™ļŗd6+»ųt+ūx±ī}ģAŻ2¹[{6’ś*_²]ĻńŻŲ*LæŹ•$å¦/UhŌ¤ uGU^q`r;${€ĢyųɾĢ"Éßqø„żŻ®[ÜĖ?ųĄōa 5©éłŌAY§2•]©:aaaŖ+æCƒ›Fėƒ×g赿ܯz~§Wu„y’ś—~^½JńAtEL+}łĪSś=nŸ’s 5ģŁK-ü 5ćķg»%Qū³r·v®¶'é@ŽM–¶Ż]Ļ_’Ō<&TO|ŚZŻä@3lyśą§µi[’öŸ*V߁żõĶ»ÕĘ-ö{Œ#£8K3ž÷•RÕL—õ ’Ń·›÷iżā…ź4öoŗ¤—=`Vß ½³t— lŌ«C=E¤ü®·ē®Tā¾`õ9ŗMæŁzjēoļ(vK¢dējóŗ•°Ķ~Ÿžś©EŚZņ+4P÷jźj7ߌBkzÕ^?Ǧ˜żsy“ę¾š”¶ļަ…óčĪU»pżļ­'ĖŹ÷ÜsĻ­•d•=–Xģ–.r¤ ‹ÜŅīålnG•Ueķ]Éą–{°*@R ¤ IĮ’B$…:ŅĪó ·2Īņ{wĒ?ݱŪ9ż„†Q湯¼š¬›–’¤ōōōJ322Rü=­ óM_ŃIŽo]Ó]Aa2™Ž”/©Ąq8Ó¹Žt¶¤<ǹ3ķ,ē v9ɾĪyT%pĮ3“ąÅ·4åāfgŽpޱ”<°ć[æŅėŸ,Qaūōļ5Ż ŅnpkŲėFżćµkŗ@•ńX"ź,‚[سn Ī"ø€:‹ąź,‚[سn Ī"ø€:‹ąź,‚[سn Ī"ø€:‹ąź,‚[س,5ŻĪ6­X¾H »Sdöo¬v­Ć•›yTžŌ{č%źŲ8ØfzUxXIi”Šn愿‹•°ū Ģ–†jÓŖžņ³3Udi Ī½Ŗ{ėˆ3læ“Ųåó»;MA ®ŅŌÉmkd>pžaåÕ¬K†’$Y‚;čŠ+®Ō؉רšh²VĢ’„†śdhĻŹ_µzC†ž^mļoH'1Rć&NQŸ¦9Z½hŽÖ§ęžaū„õ>¦†ęē3VnPmLžgę`EXLʵžråYóRµlń*åXB”“mU’«F«kĆ@ūµü4-_²F'Ķa²8”Ī#ĘŖW³zeÖŪ½ź'-ßqPa­«AīV„ž°ŖŪč)¢]k–é·ÄS2[6h޼mņ ˆŅč‘1>ū+™ŌnĄU²lżBńĖć4šę”’¤ÜŌ š·|§Ā›4Sꑊź1\ĆūDślßWyēż Ń/ Ö+9£X}®Æ~-C˼$åڤ…ėŽ*"(WĮŃĆ5¬cƒrēÓWœ_X¹ĄYačTz‚Ņ „ƒGŗrć,Ujv”&ާ^:©ß¬t]Ū>’ķϰh☫uy×@Å.]Un½NŁW_åNш‰7©c M 欖$uz…$) Ž7®D`Ė;“9TMüżdĶŪķŹ i1@×ߢE‹I‘j®bk–°ö2KjŲwœnėļ_zöÕPžĮe1™Õ*Š¢]'’ĪØ’E†!“)Ąužµ?NænŲ!æĶeĪ+’a+.³~yå-Ame’Imƒ,JÉJ’ti¹õZ5Ö¶e?j}Ģ]:¬s…ęÓWœ_nPĶ,ĮtåČNZšŁJ\¾T½ž0^ -ö‡§ I~-uõՃKÕ3$ɰI’Lf’R×|Õ³Wš“tęhŁ Ó•QdSPĆ®¼Ÿ–mTN`7Ż~åPķ›¬ƒe·*[¾"õ޼Nįqæ+vć ķH8ØŪnø²ÜyńUē—ZóXbtĒn5ŻΐįJ™ĢAŗ|dwтłesä÷Š”5w§Ņ Š%£X{āNoĘŽ3<@ÖܝŹ*¶·“ž°ŁuĶw=GˆĶkOź[̲‘ēÕŅżµŸZµż·_e2hĄ•]\ŁVC2™‚ģ÷Ķ·–Ū¾ļņöRÖü}2dÓ¾|«ü‚Ś•[Ļ(Ī֗_/S·A—iāȲę)w^ŹŖƒó‹_ź˜ÜÉ s~²Æ³Hņwni·ė÷ņĻ>ū찚ž @Ż”u*SŁŁŁ•Ŗ¦†šTc/lZµb‰Žfœ”a=©‚āzjß¹‡¢‚Š”²?^;e«{‡6jÜ®‰NNWģ†-JLÜ+K«NjÕȾz“vuüPŖÖoܦ½{TŲ¬·Z7‘$Ÿõ¶®XؔŒ,٬25j§ąŌJĢ·źxQ#E·ŒPtsiĒĪ8mŽ– ¤¤żźŚ„séžē*ćH²¶ĒÅź„_3 ¾|”:9ś$IĶüNjļĮJ>zRķZŁ”œž§Å-Ż"Ģkū¾ŹŸÜū›ŅŽe©Ķe=µ{ÅR„ēū«Ļå—)*< ģū“jØśFšVlŁ«”ä|uŠ0ŒĒĻé'šŹ0Œ2Ļ}åÕdŻ“”$„§§Wjœ‘‘‘•ģ‡aĖÓ»/?ؘ˜˜ėź>‚[ŌRw=ō|„Ź›ĢĮŗēįēK„kRYż0™ƒuļC©é.¢Ž³Ōt€/&IŅęO_Õö¤i’®dõ»će=6”½$)sē7śÓėkÕŠœ¦&£’„ĒĒ·sÕqÆļ”“²TO’c±Zu‰TśžT}ęŗ¤YˆG™7žž¤ŁkšźÉ’<ÆqŻ"ōäøŪõÜ«ųŲĻśæ;ž©ĆC®×gOM÷ŁÖo=”węfé½[ŪźĆ„æ(Qõ೧<īqjĻzčÉ/Ž®­š“»“¦'u+·Øåö »KĻæōŗ>œń}óŹ“®ü{K×¼ųOżėå‡ōż+O—ŪĪ'Ó’”v?­GyTO’©žže©2üßė é¬qŻ"Tpb‘āŪŅŪ‰'Üä*MhŪJ’yāž2ŪŗłĮT”µQßw¼U/½ńˆņs³JŻć¼¦Ž{Wo¾üoŻ;dKMO/ź8‚[Ōr×t—$E ’5/ѕ??#_æ½ń‚žõ']}EērŪł6=W#¢ģ+µB¢F(;å«ReüZéęĄłŚgUņÜÆõüShékė$IßåLVøŸ©œ¶Ģ2 ›®ķÓPA Gié7/”ŗĒGó4”£}L'Ōōō¢Žć±Dj9æŗ˜¤ żU‡TسI2\g§SS¦L‘$Ķž=[’tł]ŃzuS†ŚÆ¼TŽ>R—„NPZ†Ÿ²'õ/·-§Fæ2ūbrÉ$ąL°r €ZĖęöoÉ\iJTؾYT’“ļĒg½Ōń¬c«0żr(W’”›¾T”Q“$كZĪĄ–$E^rÆvü÷Gm;\’tż]‘zöŪ’é¦aĶ\e|µå¼›gøĖ³ćinā)IŅ©}‹jz’QĒłU”ŽÉķģ2ēį'ūj0‹$Ēą–öw»nq/’ģ³Ļ«éÉŌMY§2•]©:aaajŲØIMw½L’{ėÆŚø%Qūsl=t€Œā,ĶųßWJUs]Öæ“ŗ Ņ¼żK?Æ^„ų  ŗ¼_cĶxūYÅnIԁģ\m^÷£¶ķSr®”žś)ęņhĶ}įCmß½M ēŠ/>Ŗvįž„īė©C3Ńų'¦«u ŸB[wÖŻ¢gļļ*Óux{Æm}łĪSś=Ī~φ={©…”«OĪ~ ”™Oæ¬å7jæm¬o^Ø=Ö éSÓSŽJxī¹ēÖJ²J*vĪt‘#]čų[ä–v/gs;Ŗ¬*k’J·ÜƒU’%I –")Ō‘vž¹•q–4 ćńsś ¼2 £Ģs_y5Y7-%Iééé•gdd¤¢;v«īé.&“é Ił’ ‡3ėHgKŹsœ;ÓĪrĪ`—óģ žœG…ńX"ź,‚[سn Ī"ø€:‹ąź,‚[سn Ī"ø€:‹ąź,‚[سn Ī"ø€:‹ąź,‚[سn Ī"ø€:‹ąź,‚[سn Ī"ø€:ĖRÓ ¦ÄÅÅÕtœ!‚[€ VdddMwĄā±DŌY·PgÜ@Ep uĮ-ŌY·PgÜą2÷«W4mŚ4½=ūGY {ŽńmļčÉwā]e­X¬=pŸŽüśGÆmF~œó¦M›¦Œ"[M©ŚÄš”žx}C™e £@sæzSÓ¦M«Ņ=^ųó .kśaö;š6mšf|5[³¾üTƾų¦V$fÕyxę÷j}vŃY½Gu"øĄäšVT€Ÿ:ŽøJ“=oė܃:™0WŽX—¢.©vįŃząśń^Ū0™5~rՂ;gÓŹW’\å`›aĖַ镽ū+·śnĆd ŌųI7W¹O¾üd…ĖšLš0å~IŅåÆÓ 7ŻŖ;Æ Ö¬·Ž?«óÓŌā§fžu'dd©é€sČdŃä.š»śØ®ŪJ6ė -6®Ņ%ĮßkYf®ˆTqž^mo5ʵ"&ūĄr½3'^õtL OӍEI2y4›“²R’µKĶ×aó =rė„’¤ü£±šńéz5kŻHĒRŽjČķw©Oƒ@­žū”f.IŅ#ć{jEŅ1JNS›KļT·œÕŚ|$SiI‡ŌyĢtŻxI‹2śpŚŽ• ōYB¦śö‰š÷æFćū4ōyoo2w~©F'iĢĘX}¾õøģ×øÄųVé­~Qhd¤"¢z»ņ+3Ž%ß¼§Ł‹cõĀ»ļkóč›eō§ }µ"éØR’RŌiĢu“c¼n˜ĒYPć¦*.Üķ:_śńkŠ3G©qö^“š¤»ĒwՒoŽÓ÷«rõ§«#5?v£ŅŌW·^ŅŠc~ņ׿¦_·ė¶gž¤~Į»õæĪЁ–ĆōĀōŌ,Ą¬¦u(øUwz ŖEū‰½udåFIŅ©}sŌ|Bo]|E¤V’š.I:¶y®zŽkė*æąŻouńŻÓt÷ż““bÖ ÆmžōŸŁź|ŪĶŗqź}Ś·}żéü×>Uó§jŹ”)šz}¤>y}‰$iŲ5wŖøšˆ¶u£i÷Nד½A«¾yAéÆÕŻ÷> æI±?¾57A+ZŅ}^Ƃ‚¼Ró3łĪĒŌ$$RƒÉ?“—7©§ūļš,Ij®`³IuĮ-.0!Ķ'*${©ŽYmŚłm’&wk ¦Ć®Ņ‘ÕĖ%I±?Ņ5Q!®ņæghóœĻ5óėuŲæµ×6WeØx L~õōöĖvå’v<_1ƒ$IAc”wäĒ{šä¢V”’$’Š’¤AĶ‚%IõzØø µR}(É÷½=Ysćµū§Ļ•žŌc*¶zᙓ]›ÜąEōo&S“¦RH}ł ¹Ķ#°%IģĮ½šk§ø[’TŌy„"nŗC¦]ŖÜł3Kµ-I'~ŁØĖF(lŌ2§&Tßš`åē±Ė'^§č ?<³„‘&EķԊ“ŗøžMKCFk€Ł¾‚č÷ĢeĢł\»Ģ& ģߌQĆ$Ć0titø‚éæ’$M훬¹©9ŗ¦y ~ʾTOŚļóŪń|=Ņ8H’Ō8FyG^—4VĪUJĆZ†J’üĆŗ©ø`¦«_ŽļķĪs•ÓuZźæĻü[—_u•nyöAÆć’óK/K’lžMd³f¹ņWgčį–a’¤°ÖIśĶćµrō1“‡$iP³`IR@½*.ųĀKŹ[yBÆ#’@æ¹žć œ8]yƼ¢“͇(āęn;ÄŃw…v” ēxm»^Æ(e¾ł…\t©Ā¼³Ām×·øu»q°ž’6IżFÄŖĆ5ל¾`’.¾įõ õ/U'ÜĻ3 Ņśš•5yO®BĘ;݄ɽœQŖŸĮˆ2īķĶ%wżŸ:ķ^ÆyßĶÖßÖŠkOO*Ufėź×ĢpuhäWźŚén–~4štķ×*śčŪŁ “˜Ģ! lŪV9‰ūd³ŁäēW}ä…LyDIqŹ^¬­9E>KFYµķŠ~Ÿ)]6Y Æ ŃńÆÖy« “Ł,›ĶšZß[ߝN¼»\–v}T’ö›e;“Qu‰_ź˜ÜÉ s~²)-’üG€[ŚßķŗÅ½ü³Ļ>;¬ā]ą“¬S™ŹĪĪ®T°°0×t×Ļ Ć(Šüo?Ō®ÄC*,(о„ھåwĶß~B£Ę\i/d2©yÖ2Ķ*Æ+bšøź¶éŁHkfĪŌ†m[•p‘świŖ_¾Ÿ”ų=i:œ/…·ļ &ž§×Ź4ī¤÷EjŅ•O·Ń§¹V|¾@IµnuŗĘÜ{½¢B,ZšķJŲkogp.2l¹šæ`©2ŌP};·özo1}÷‘vķMÓį|C]ŗvVž®ļ“bOšv¬’]­†ÜŖŽŃ KĶEŲŃķśnå6„„ŖĆ‰}ŚbźŖ^Ń Ō®K˜ų•āvé1T'v’®›æķX®„=©:R( źŽE’4oŽ<µ†hP·hWŸįJ_āźOźĪß“7ńĻ±­\“Hї_„Č·PŒQØģE_©0ł°Š²‹enŃVē#¤F”²„‡U\`ȼwƒŽ’ŗK-cdŚ­¼õĖUp²H!];yŒ×|d‡²·„Ź0"U÷­«~p§’-O9殔Ķ—u÷r×µĄčhI?)o’al•æ) jQī÷ģÕW_]+É*©Ųq8ÓEŽt”ćo‘[ڽœĶķØ2Sėø·ÜƒU’%I –")Ō‘vž¹•q–4 ćń3 z%–^–”†Q«ź¦„$)==½R㌌ŒTh½†•ŖƒŅв7źõ-­ōų°f5ŻœcQQQoHŹ—Tą8œé\G:[Ržćܙv–s»œ‡d_Nę<*ŒĒ@śż‹ouYo‚„Ø9l(*-kßR}½pƒ¬ĶÆÕ½aŪ8n€J«×ž ŻõĒ+jŗ% ī"ø€:‹ąź,‚[سn Īām‰”#..®¦»œs}śō©J5ć\÷“ąåØā|ēĄŁ~,ńœGėpį`Ļ-ŌY·p®TūS~·PŻĪŁVUgÜb?-ŌØs±rĖš‘VņP·U$īSåŲ% *jÅb%Ė9œ·óZ1œM†Q ē|ØłKā4šņа˜T\pB«ߣ·ßy¹¦»wĘā?xJŸåLŌæpÖī1’›ōĆā zįŻ÷ÕŲæjėtü¾@óć3Ō“~°N$'ØøåŻwżsÖג߃pY•qčZ ˜ k.īPźz}æbKNUäė5qX+ļcڰP’żųM{ķ]EłłģSz䙯õžų,S¹Yļ|§zŹŌąiTĻzž²Qā*ö_µ9›+·|øJ ą¼e2jĀ”ū%I—O¼N“'OÖ ø[w“­Ųz“•ÆžYE¶š†W†-[ߦTöīÆtÜzöś8vŅ“3Ŗ"ž+½¾0Kwßy«&Ož¢»¼_»ā֟Ӿ–ü\ćMŗļ”;uč‡7ōYܱR×§L¹Q·Nm£EŸæéµ½¹ļ¼ ßrŗėXyß ĆŖ Ė ¾lz’ µ»łzŻü‡h͜w&SPV`ė¬Ä€Ŗkå–Æ UEA€ Pe+–’Ré:»¶kŌø)稇¦R9}’ü‚$iÉ7ļiöāX×JŸļæ|M Ż©3fhĒŹś,!Sż?ūDĶū_£ń}*’h¬f|ŗ^ĶZ7ұ”£rū]źÓ PK¾yOß,; ?Mč«IG•’”¢NcžØ›.iQźŽÕц$eīüR&NҘ±ś|ėq=ŲÆ±$Ē*„ŁjĮ²ŻzbŅÅZŗ÷Ņeėņ»ŌE-C%IK?~Mqę(5ĪŽ«‚V“t÷ų®’¤œ”•śļ¬]jŽčø›é‘[/uĶߞÅ_ė»” „8¢NcīÓ 5—$eX®węÄ«žŽ©Įąiŗń¢(~žņٵ»õļņw| f’Ęz慇*4¾>›ŖõÕó{`ö‹ŠäŪé¹/~ÖŌ>7z\·Yó•ø)IĶzŒš:÷×LR’“ņ‹²æy‡V¼ÆÖ׎ c]Ł”—å)9šØ ÓeķŸ)©B+ńŒJ\;k±Ÿź^¹å+Ąåmµ–!VnŖÉķÓ¬šŃ·’ éć²ļæÕœ9s4gĪWވI÷x”™0ł®t·‹ĒH’&M½Mćū4”$żōڧj~ćTM™2ESƏŌ'Æ/qµc+ŹŠ¶N£t×½Óõä_FiÅģ^ūQmHŅšÆ“t}×õšr­öĪYīŹ7™5įśūeŲrµ¹ćHŻ}ßzų¶¶śśķ®2›vŅSoŠĶ·ORģO§ļńÓf«óm7ėĘ©÷ißvĻÕUi=Ēéī{ŠŠņY§±[šī·ŗųīiŗūžIZ1«tWŸ,T»fĮ>ĒQÖ|ųślŖŚ×’ĀŚF« k]©ļÉģŁ_iŽęśśĆ.SUŌ{‡h`żņ×6„«æY&K}ØĢm*ņX¢QF3V+·*ŗŸ–Æ —D€ P ÷ģØé.”éņ‰×y٩䪮²×”üv<_4’$5ŽQŽ‘×%uµ3̱2Ź?¬›Š fžµ6¬¹ńZūģ„ēbĄ€óĻö­›Ō·’ 8~Tß|÷£V®ś]±›ā<Žģģlµmk_‘RXXØōC©źŲ¹ūYļ›ahž·jWā!„f+øu“Z{®źtL_|¶P»öīQŗéŲ®ßu (Xż»¶WŲ”-ś.ö Šl-Ż2Dmś4׊Ļ(é`¢Ö­Nט{ÆWTˆE ¾ż@ {Ót8_Ü£‹ [®ę/XŖ 5TßĪž+qĪ“¹³^ӆä`……µWt›z’¤}«7+nėZÅgkhĻ.’¤yóęéā°\-üu…~Y™”qÓoQ›šIRŲŃķśnå6„„ŖĆ‰}ŚbźŖ^Ń Ō¦G-żč+Ånߦ݅żÓ=J ¾”„½iJĻ7<śuTMŌÆs+µéŁHkfĪŌ†m[•p‘świź1ސØ>жģÕēóVėą$mŻøJ'[ŒR·6eĪGyŸMåś””-?i÷¾C*,(Pb|œ~[²BQ—ßŖ›·’ahޜO_ß¹U«×žŌČ»nSėˆ€Rß«Œß—é—u‹µ;ńŽä²™#Õ¦iV.Z¤čĖÆRd€=äcĶŪ„杭=ū3”œgØO÷β˜L„Ź5éŽT‹>YØ}ńG5ś®qjX~ČčÕW_]%©HR±$«—£Šq½Č-ķ¼fs;Ī(Vį‡(KŌqÆē“ č8‚%I u¤G #ßY6@R€aϜÉ@ÕĆ(±ŗČš²ŚČ𱩦źĪś|†nŸö ÷ģPaa”ż¼L‡„»®ĒÄÄhŹ”)Ź:•©#‡Ó”••„ͱėĪįŪ/LÓ¦MÓ ’}_-ēņĮ1œ+QQQ/H*(qä»9’ņ‡3ķ,W(Ļ ˜S„W|UåŪUŽf`īĖĻJvĢy­ŲķÜę8ąŒčŠĖ.UPżń«ęĶ›kÜøq®ĄĪĆžČ\ń9y0 5¤Xžq ÷xÆ}·l%ņKŖō7¦ŗC§¾ZRég/‹Ż&=·Õ&44XʏVūöķuĻ=÷Čl6)ćčįšīÖežœ÷$I3ēüPÓ]ĮŁć\°ä<¼ķ½åķ±Ćj yVĒŪiooDt’ė¾j«*{ąSDżp}•$Ci)ɲŁxhč\;å~å©ĻóĶĖax9÷µšKŖ†@Wu·ÜłzżcÉ`Vq‰“µ*7 ,łJKŁ_ÓŻĪWV•~2ĻŪfń%ß X+VnņÜTŽ=Śę-ØUģ%],ūc‘VU’ć‘8»Š½īŪQy[ĮUVp«JAÆźZ¹UŽęńĪ`–3åēųkŅéU·i]MwøŠ¹Ö‡{<Ød€Ė©Zö`ÆĪĒK>GYņ±Cē_?Ē +æLņ\@„mŽ%øœc…:Ü*Ō顖{°«äc‹ŽŽšxFĪ$øUņŃDg^Éą–ÕqŸB^­U* •øgGµĻ0ąĀpÉš+«T/'ėxMwØĖ¬:ą*ł·ä*®’{o•Tå}øŖså–Æć;g@ĖŁY÷ n)pĪ Vɗ3Č匕܃«Zœip«äF`ŽVm™å¹bK%źÜØ{œĮ-o«·J®ąņŲŖ–·'VuÆ+÷zīěe˜łIņ—ą8÷—č–öw»īüPāŗ³‹[Ū~ŽĆ$Ļ o[ØĆĖaór80¹ļ©U¤Ņ«¶¬%ņK®ā*TéU\ĪżøÜūT)Õł¶D›ģ&ē_gg„ÓĮ0÷Ž»OXÉ7,:ĖXTś ‹ī-³[ū¦÷@i†—æ%ć2Ž^X,Ļ`UY,ooQt¶ē~Ļ3VĮ-ē~ZīĮ-S‰2%7 PéČ`ÉÉ3Ėså–3å l™E@  ²¼=Xrõ–!Ļą–{ąŹ×cˆ…neŻ7•/<«5Į-÷½³œ.÷ÕWņ’ļ>ˆ’ƒqNšUž%šTśm‹„޺膀€'£Œü’.÷ųNÉ:Wm• j¹³J®Ųņ¶:ģŒ\Õł¶D©ō£‰īĻLśÉ{ «äź®’“ē¾)½Tv`‹€@Å^ŅeøÜ÷Ör ±@§ć8ĪrīõJ¶WmŖū±DÉó±Ä’eJ>Óék"m:½b˹זT:ØUÖŹ-”ÆdĢĘżÜŪ¾[ī%ŗÆÜr_Łå¾Y¼ó)½’­},±äŠ+÷^čmW±Jo ļ-°Uņ>Õ²’ėl<–čģŒ{ŚūąÜWj¹µJ¶¼m$¦Į-‚cą|r&«¢Ź 8•Ü/Ė=øU™ÕZ†ūœ‘3 ny{kbÉk†—<÷7)ŗOūęńŽ‚[ņq?UUSÖ#Šī{©— p•|¢”²[•¹…U÷ž[ŽZŽ8YīoVōŌŖČćˆ¶Ŗ®¼ż·J©J>•W^@Ė×ßjQ]”²N¦2žś dł lłź3.€Ź3*ļ-8U‘UZŁ[ėŒ]Õ*/eŖĄß3Y©E€  ā*óØ Æ—*š·¼6ĻHu„*²ŖŹTNŗ¼Mć bœ]e¢*ūęĆņ{<#g#PT™•U]ķu.ūp”)/ŲT•UXyäńŒ­ąŠ™„hԜŠŸŖøŖÖ –ÓŁU¦żŖō…@Ą™«Ją©¢uĪJPĖé\‡Ī֛P}Ŗ#uVZīj2PD ąüpĪ‚Y%ÕöSmļĄ… Ę‚WHś€”ēw˜5»%tEXtdate:create2013-09-04T19:35:04+04:00WÖJ%tEXtdate:modify2013-09-04T19:35:04+04:00&RnöIEND®B`‚apache-couchdb-1.6.0/share/doc/build/html/_images/views-intro-01.png0000644000175000001440000372531712332105522025070 0ustar00djcusers00000000000000‰PNG  IHDR)LG­ pHYs-ņ-ņ J f cHRMz%€ƒł’€éu0ź`:˜o’_ÅFŖUIDATxŚĢ½wœlYU6ü¬µĻ©Ŗī¾}ó½˜a†ŒŠˆ#’£ ¢"įUP ^# ("ؘ3`@_D" #QŠ—œ&ßÜ”ŖĪŁ{­ļ½Ļ>ū¤źź¾3|o’ś7Ó·»źŌ9;¬½Ā³ž‡D„ˆØŖŖ "’›Ž/U]š×%ßå?(żŠU'įŸž7Ŗž[–DÄĢõŸüėD€-4>KzĶīmÄD„™Ó×½×9gŒńļ Ō½2ˆ  Ąģ?EćŠ¢X™ŒUüSšoØ.„ž³„™że™ÉZ ĖLõU„d²üĀY!"6ńžŠęxoĀ‹ØNĪ)1£œŪ8Ī"Ąö×W1Ā­*¬u³Łluu•™ü„Āć3Ä)3T•Ā’’ńų[ė²Ģų×£ŗOõ3ž‹‚H=Ųõ= 1MKœšdÖĆcW#ŽųSk…ųQŻĆ:ļ®®/Ņ]l½ĖohMV«± Śy“īm’½±ucK^|ɧ^ö®“g„-s']ŸģĄj Ä8ēü¾ŠźĖŪIRJ—b½ė *“qø*ĮYįŒj‹§É$ŖÕms½oI ÉsˆÓzƒ÷~Q2Ķ…ÖĆķ¤ßéŹé5Ńa;( X4S=ėAѳļŅ øąÆÉ"·Ķ]:t鳇—2õĪņąŖŠö"ŖŖĢLܞ¦`ā ł1Tąœ39·N“ÖÖčž8Ė,ņÅGóž7uw6Ø9ąõ³§Õ| Æ÷–YDŁPĆD·¦)v*Ūl­Ė3ćw €°qoo®–ŌŌ7N ›²iaR?‡ˆü¾ź.OU؂¹¾¬øpŗ…-Ģg\µzŲį'õ«„ž:®O$J¶ŖZk³‘ńÆėUæœsÕłH½«Č/°åę{`£qĻ9G©µŪ§«ī¼Ķ»6ÄOJ¼ķeĪ͆żģ³=—Ņž[j܏¦ļÄy£éIŃõ»_bk§±yužŽŽNi^¼²ŲCŪap ±čSZ§CÆ‡æąŸĖ,QU 9§vtŃų'ķC@Qyžūۈ÷Ó LÅA®:Ü ŲŅ’œ–ń4Ś?ū›÷[{čųŲń–œČCƒŠ”µ¼ß]Ų“ŻųrĖÄ\·Ō×®ĪGŽ/õ3ļŁcn}-^[”|5N}fJ' zc–ē&ˈ¹¶ÄaŪ«°uųµ¼ŠÖ+»KŠ/*§oi/‹äOže•ł w͌æCĢdŒ‰ŸH¤DŠŌr‰xļŹÆBēÜ|>wĪł…BEZ÷éo¤˜—ĢŻeØāĢ™3žAümb“öæŖŸ}Ø"ež>‰`ręŒĮPd ‚ł¼pV@Čr“eYwTżż£ć½…WؐsBDEQz—+Ä#ŌĻ8ņõqė¤>-“įĒ,4īŌ=ē„Ģ䘧–Grž[;ÜõnŽM4äÖ8'ĪIz¶-H?ķł¹§Éöf.†®æĢ£·Ö.ZN-‰`÷÷Õø™tv¢aŒv²JĻ… Š—Ā–ō¹dĘ}²KŻĮōū‹ĄLÄmŪX;.Šō7*-'Æ×Ē­ĀąĪ©P².Z™ŃóN_9“ė憦aĶųķź}·īkŗVDpN|”ÓaJ\Ł&0…ŃP‚źŸišœŅ$$ €ĄLʰˆÄKł™ņ&+ZZŖ~ćķź‚lģž7ĖŽyź[ź«iÄUņ±5Iģ'RaāĻ/‰Ó†wØ=K==øż?óÜÄa4;+ķ|Ÿ]“õŻM”Œ–’w²£/HÕZé óŅ§ĒĆTł ž˜§EQ¶7QĒ-©Ž¢éb®’Ė`C£qŽŚų­eCDʘ®‡š®äŁĮ`lÜg=“»‰$|ŪĀBŸąg[!Vį\ˆfŖ”ŸĻf­Éj=`wk,sn¶~qNœSi½}‡iŸw7t?Ńė[š Ƈ]ā±$+ÕĶ«»7Z_ӛÜĘõ+7/®ĄöQŅ]$Ŗ={ s:7‚Ü€t~„śō„wžöšŁ±h·Œ9ńpk4b0\J扠ŖńŌč½ēŽļ}’_c̐ó¹8Ż:|ÓuHĶÆt/t—Dz?eY¦“åœkÆ“%E]ø¾'Ś’”ŽwMĘ®ĶĒyßb:a-š~÷¹˜¢ö‹r>Ÿū.…īGÄE—HĢߧفĮōŒ*ˆ$1¾­5—nžŌ/7†˜Ł—šµ®3“ŠŲ²T­‚d‚1&ĖĶh4ʲĢ;gY–y',É ĆöN˜ˆŽĘł|^ŖŌž71öļß_µO¾,cŖj°uŲI ĪģļßłßW”µŽ'#@Ä9ØN&#ų²ØöZ¾@*Ø Ä© Œ1õ¶Ÿił|Ŗ<°øQÓlBt?źe„Ŗ~軋9 9ĢÅ®ć·[#•.Å]8Äõ2fkń†æ•6ņŽC¤}Gģ]ņTklÉdYÕß ®Ōē(ōŒ˜_·½7\ŠÕ‡‡P™CiČY Õ3 嵦/‚ōLme…“‘t«7u½ģ)ńœ’¤RmĻ«›÷Q±`q®'Ö]j}īœ韻Į„;ø¤‰›ćj‰ ‚s.üw ¾·xS竲ĘÉ8'ļęFŃ8üQ4±Ø‰SĖčÉĘ ˜ŖĪēóŁlęu•¦õ½šžµ“нµ|‹˜Ź‰Nv+[įĶ~ż3Ē%j­­½y©‡.5ŚCUJŌ8#®w„BĮ¤·abu*¹uMXkÓ” '’ĢL?×nH~$‡I«eŸ†6Ęh3oRÆdõ…»°ĄœsŽÉwāS9 ʶ K(½y«ŽĢ׹Žč€ŒŅw nsā¤Séėš™uąź’ų3g :žLāłŽ 5©N×SL]1Øg_袒&ĆĘģū%6}x@ĀÜōVPTŸZŻõ ›>d’ehĘpm‹h ŸÆˆĮpśŃ=YNmųcc„»ØFĄU©ÅV V%¼õAž÷~£,uøū€³w|vćGuŃ֒h¾zćՆ1Ōō|؆mŠ(3²—ݟeqŽ’“HūYlķ4fŁńC—Aaų`Źß[@KõåV–AćՆfdu”ó|Kļ_)kĖ»m s4Ł6Ō²-'coåļ6°-ńM”smą_bÅ©ŖFŪŠŃŅ‹FėY+Ɉ “x³#¢¾ (ž·SÓ+Šb2™xä•)9§~l °VŒįś­ÉQM¢ ÆnoOWVVüj3CUаM"!ŲŽ0?ļnŚ2¬õ,ˈj—}BYĆ7› 2P…µ.ĻM˜ 4užt‹>Y!"ņ†„pŠf Ą©kķöž Õ&'\żĪYf&ĆO©Żµ3Yź•Éx”jGŌ%ģa;“ĪŌōŸ)ȧ(ŠńhÜx¤pƒ@ž»Į±,“yķoF°{øŚ2ļM‘Z"b­Ķó|łKłzŗ_Ļ“ųƒ“gĶPjڟp(&goB;‹VœćĢųĄ hhvPՎ©œ¦ŚP…:ē²,ėµ.Ą©×YI_ +.¦ØżŸ"¾×ļ/!f!Ć=¶1ŁH#ʘϊńx2؟"}kϤI½•zašŻÅ“l¾0#iā`ɚP? “SgfE1ż§L·g+«“ŁtNdŒ1™_¢ŖJYåŻJ°“D(Šb4={vmm-˲ŗ G냬qŌĪģ…ø‹ż.”GFU=Čß»j2¤aŻĘ©Œ,"aŽQu3ÅF"E9ē*h”ŠėdGpGØ-sóø”ž&ęæbżh°‰F“Ł9É2c.õ WsQĻ„Øi3Õ+"fØ1ä¦|[ß×yf£ī“lĪ©aŃŽ #ƒėŃ ŗE(äō©¶`iŚ®ķhfµauڐNī<:?įlµ’ٚ‹AäoxĆ·~ė·–ātõÕWß竿:6ä—|x·4QōhŚ ķĖ”PcÕĶ\M ƒ^ė0“½1:y+»Ū|#›O µ×”†‘@†(õ^ ļƒ Puiėœ ÷,xļ(ö?‡`>·yžł•ΆõŚ4Æ?Ōš•FńPˆf'uHzĄĢšŒ9ÓRĒså:'ιŃ(÷Vb6›M&k­÷mZųŽV|Ė 0Ŗuc2ķƒ˜ö)ƒ3Õj"P &¹2}WˆżĖū]Ŗķć~qA~WAļ—ģ«3¶Rå—Šf». iņ€L;6Fu=ēīt„¦•,«N°įamēšQu«QU[?ßzŌ̦’"j­ó l6u˜ŚĀ ōöBt§-E¤ÄT4T=ŗ 54š“zf’öÖ(fęü•a2Īók«xŽ›—*PŒAZÜŠŗ¦­Ņˆgvīzč/P4¾¬•:(’]Ÿ6©£“YÄņg&cb64B+© Ļs“•±ß÷āoāD“,¬8v2žŹū÷ļϲLDŅ;ī_dąŪU“Ā „HČ[dyƘ–&¤ä„EŃ­Pq3× NėTX2'ž\«&Āöövg sØ}G|§2A]܄6Į„ź@ öy|t°fL~M:§ÖŠ/ļhŅ8Ķ&0h8k}¬†„Ŗ“ųiP„ź“ ~•aņķJ AžåĘŌ¤!Ō(ÉĘŻ“ģæaŸ‡Ņ1©›8b}¼ŃŹŃAģĶĄ›Ļa¢«8Ć]ŸŚ›Ö–óփ<¢G31ź gbՕB ±NN‡G€Gw½•õŠˆ×…¾©Ęźeę«õ5‚@z‹į»°q„UÖ”|Ü.ÆįŅ~#UvƒąCVēĀ2÷–Ö$X€."Ąo.Ę3żø<ĻżbN Fm Ī2'ų®Œńxä_Ūģųl\”÷¶g.éDķxo’ÄĆżžxłƒ¾ē¹āŌwźłC-‡žŸ­Uсūxø®ļNÖ5BšžICł [K;ĪŹP£ūY‹/„Ŗ®ą„ Bqil–,”µź-žŸĢ¬NsO§ģ“2{u ·e–fn©:dė08ÅnłlSājt:vņ8äJ{hE¼š&zÓ£®‘Ž—ź­Ģ…sj Y+!#Ž@3ӘŖŗ× &€ ļ*ī ž ©ż”Ü(̓­·­ĀŽ >ƒŠŌG“†lEŪLŻz]MÕ¶0£ÖŹ.ūßū÷6“ś2d"²½½½¶¶Óc·lā0Ž@ĢŪ…Ū /µQŽ3į_bF{jP­*qcSv?deBÓ{ Öņå’—ł¬Č²,rr̃Hc¦™fWśLłČ#2Z«ĀZ›ĀŅg[ēółx<ŽW( ›e©³¦źs®q”¶ŪŚ £ė”ĪŅ&`'5,čP1™Ś“kÄ]’øM4ČŻŅ]`EaG£Ģē(Tźz~×LØĻĄ¢Ļ$j ß2†S€€ Čׇs¶„ĖrSĢː„vīæs@“Ö!PF„a/Ļ$·ĢQX£õŪ0;ֆjjč§FÆc#³ŠÄØ`>Ÿ{(‡ĒX5ņŌ¦>¦QōC}Z§Zˆ&ÕS ÖHāN¤†×ærkkŗŗŗŅŠ“ ˜Mē“•±8Ē]+]­ź”Q2 zżļk”׬{±Š«s£6{õ“¦ŌzäSižŅr’BóvĖéøøJœāžZ•ÉiCOTĘPŻłĪW~āŸōł¬øp +©jœń˜dĶjpDĀf׳Oѱ0;†/čp‚õRµÅ:ÆÖxŲ’"ā‰`:”]Ś.w{+T„ļz %tž…š>-«—ńĻY÷̊rķS“nō\ˆīCUĶxzzˆV‹™)ž "BZE/†1õXzBЁāMh€PĆį9ŗ©n䲫½Ó)~õÆ ĶoÄŲöĀT[„ų’wŖ¾{pÉv{Bķ@׌<v īŗK%āąz+;Ēė½½½ ö˜§*Ę.“’ŠfÕ EÕ÷Ž[‹m"Š®$ˆ|,Ē Š»!ą~=%-öĀę#{o2ęZ4Ń|«'#ŁÓ=‚¤”JÜj̳śjĆ@f„‘ū÷ÕŻX’ķ-ēvx†ĘÄ',‰h:BaKG ļvx>°Ŗ›„yrśĻ4 &_÷ĒĆ jbŖ”6”nŽåiō¼uYzķi‹¢•Ѭo£źi0ÜÄQė0žĆō ˆµÅ·¾DZ{c3ēyī\ߓ£M ®Å»rI…F-¢—*éVųjĶĪž«dI²¹‡e‡܅¶9¢V/Iš“–"t@Ø’Ł˜ŒU`­“¤ÅŃg!ßz˜œYn|LE}¹†4a?Äļ­ßx<ŽYK27ˆ<)3;ē¼ƒŽ‰"N)Ż)žÕ&uRµrk“ÅpF5Ģ$­@īøpRė­ķ£! »˜Q§rQ$ =¬Q)ķMJ†Ōz±ˆĆN•3r,`C)¶Üߕ-]£×†X¬cb/ưtŽÜÆĀŽ ¢»ĮqÄC* ²öē²Ģ³ØH“_*ÜPśƒĀ·×ƖĪ#ŖšŪ­ź045!ōć…SeĄėłĖ—ŃYu'Ėįµn'ńµL¬¬¬DšŒČC Ādu ¼,Ō3G„ä&³C¢$†Ē9ߥ¬ÖJ¬Š{FIf[ŗč¢tszNy2ūøH%ŹĢŹŹJōyz©Åēę 虊”S‹ÓAJEšīP{ēłŹhń=åŽ łŖé"Ó]ŗ"”ųu°¤Ķؘvœ¶ąhCū;‡©YŠ„f‰b ­@Ōz}Čä«OóY14 ڌn»ū>maõGŸö3ōŻõ]qѓō;łmģ@³NŪ K/kŗ(‹yCā‘”‚¬āŪ‹…śVóüņņ½—Ņk µUbvŠæ –¼“% Ń»Š$ϟ)fyZÓŻśZ½é³””Ū!ßŃgÆvÄxv;ĢÓ#©Ń°ģ0unæĖ]ÖõS÷ą­ö‡¬žˆĪŃØßąK²÷`/[Ć]® ąz““+ź0£’‡ģʈ]DœšżhR%Öŗ”‚Kµˆjk(T`­dżJ=ŒßU8qźi+ ¢÷¦¤ ujĆĮO·é ĆĀ•®j`ŹŻæŸs’ev1e“v®zF&%ˆJrrPžZ;}«Ü“ž)“BŌ“Ž+µŠ›ĒĻBό+Ø"‡H½L?×éś$ÉhEŒ“Ó(±yœ¤ķ.½Ģ·Ż¤R/%Ę_'žģK‚Xīäb%ŁŃ¶‚į!“Ž-ČģÕ+¶+»ß„ōė<¶}ōŗŚ*pVŖP¶iń˜ČpĶ{óAMsaŒqVŅN’ū­­©1Ęonŗ$t‚5‰ėü*ʲ,ö-ૈ3’H»qŲÄÖĻ(¢PāVń¹kź©Ś·œī\j1BvIśŅˆ <¹&”Öė„FÓAńrDĶĶ{‹ ŅŽj„–°"ꎰ“Hō Ę<ް‚™ĄąĢų1a6Ea­UB_›÷Ā» ³ógŸn„į#ȋ®D•¾Øø‘½J€Ó=[P×HV!„…Wķq¾µÖў˜=ė"j­½łę›g³Łx2"TDk § š–UYTuP.TużjŖš9dS”Ś”‰kaÅwĻQŌŖ÷¤©^ē¹įtVWźķųüNņ%Rx®Y@’“ŻU¹¤Š0Ɵ_¦[é5QdŌ71ķJ’ØŃb3 ļ©C@ń!go¶·ĄxI§ė–éu]ī¶£”ˆōÄ·,åė‚–Ųż$»‰‡XĪn ŗKźųG ”c`ĒPŸ¬¼Ļ.|AH³£¦YX.’ŅLÖUÕ4čüŲ@‰»±›pmå1ėc€įTF“\ŠĒ÷Šē§p¬h2bŖ>­æµ` ”g˜“m)z$\Ŗ–ŁØ]łōSŚm‰JJ sMI”S«‘–ʵŖo4sÖ:ēJ’×pÉęŠUUu¢NŠ™ßī"éq/ā³§^@CT”a5½o­ŻF§ń£S:ttZ»ļ m*Pļī@•å-ezRfc,ĢĻ-ƌō§rv*š¦ļ:{ ƒ֘w2ˆ͊}UzMż`ŠÓzžšOØuŠĀŌt%>éGn2™x‹!ĻūĄtåżéVąŃźņXl«£9ŠABNJBt6›S%ĀĘĄSR3ūĄxĮ²lxW9jup¤­¹Øƒ–žbČ.OjįŽŅī¶—øQ]ģ ˜½–{+ źĆ*[”®”j]”(Šˆ™ņ½Ž‘…×S’fl˜y:śēĖ•aZv“9Z ÅZfļ4Ģ~ƒ Fo®ür¢@ĒŲ]äĪ :Tį¢Uźģäd2քˆ(Ķ2¤ę±ķ¼R'8IC2ķKm¤˜PĆ-yj_„÷ĮCUæ5!aźœaiXéfć@ ¶Tꁇ@ •²¤ń!ęč¹M0S–›.œaG^oš=Å)ŌŪ坄ą/‰.®ĢÄӖšNˆ7PŖ=Ɉśg"ē܁ƒa’9N” ×\s €ĢäjÕgĢ« U-Ī|j$×@é©Wg'żĢ~AŖ«y޶j|!āņä/I¹;ƒŲ«&OUĻUwéė’[“S®nÕØµĪÜu“zķo<·3›zAńpLFśū~£4€ńģY®Į**:¾z,« ÷­ņ†µWSļ®BøDż¶}śķøl!OwŠńö ŗ•DRĪ3!›¤łČ§?vøŲN¬ć-˜āą_›ĒåŠ "L;ęp2²ź,ć/Ć÷ӛ=ŲįV“Tzw™xxē ®$LĀĮ©m·/ĄŁ“‘ņŒ¢(¼tPZrŒ ¶,ĖTƒģ°÷EÄ 4-ZqŲpc0ć 8笵 śJ’õē¤ZfŖÖ‚ؘĶęÓķ7žŻė~ę?yÆ/æĒŸ¼ü2¦{Üķ.¾Ü@Ģ>wŠ [šH k­×c‹A‘ēÉó˜ ‹¤æ£“±+/§Wź3>r—NÆ]ö§Č_UóŅEšŗŸ2²QVyäŹA§W[Œ£q^EtčG£Q„–].¤„žżqeeŖZŪ1>\6æ³d2ŗÕ#µD3*綘•`ˆT½p‘ół ŸŠąĖ›ŠtšF„(ŠŲ“Ā ¬Ē —eÉ̳é<čs5&Z§°}ņz4…r“6z|TźŁ Ö1!! ‡†ŸŹźļßł2ld—A ;-~ń¹?’mßōŲ Ż<·į×¼'™ó\ Įļ®[tŌDD™aßGėDTQ–e1/}*Ų§žŠ,ÖV”"a›¤š“½Q±7ų5„£L4ŌtCĻ} žŌ«6Ö'ćÉUU); IˆŠÉ3Øe¹2ūžd4~Ē;Ž~ņ†żõĖŅZkIIģš²m kåyž’œK¢¼„Š‹>¹6Śc2™lµ6©Ū2¹}Aўpšń8±7ß|ć|6q0;•›|4µŪ„pk/KKMnĒń„®¼„„÷”“õā£$bīŗeį~%×6WÄp²&µĻLŽ’ y|Y +GnŒ_l/Ž._„ū”)n„¤):˲Ž^¹er"ŖÖ1e’ŁUčø€Öao…Ł%¹œ†|¹[[m4.sī‹ŃnĮqXP oåDŅHvpŚ`ķiĒļt¢{ĖCåŽŗ& § Ś©ÆßĢĪ6å=ÄHa‹ ˆ¹±PŖ¤~öh‡ŗü1hj®“„;ÉŁ{ĒżµĖŅå¹i½¾6¾ÕsYkóq†AyY–žŽoH“Å%2w»2āŅIa“-¦ 9é9!ÕŚŲŲZß·ęZ¹ŃŗNāE" Kxe‡$¶īß3‰]M&Åė"„¼7`Ø1~•étŗ¶¶ÖžzId6x`͵4hēøķŅ, Å÷Ņ{ä'•™ŌYįa-“^ցnn˜p÷ķ·,FÅSŽÕŸu+Ók ­ŲÅŌhµK¬clŅłm­ĪұUž)Åt:[Y°„Čr‚ĆÖęöŹžUę°eōÜ6 Dlš4Nd0$§“äč‰ulLtvčū撏^žGice<ŽžĻæź+ļ}õ»ßėyŌ£ŌA“Iģjˆ ؖäĀśéśtŸ¤‰3JĖu§ŲŲŲ\ßæÆkxĖ 7kc¢Õ!%Nó ģōéÓGŽWå/R‚†äāž 2²LyN‡z® ¶tĢą>ī½ŚķŽy‰ōÕĄ ©RiiR¾Õg+j^FÆL†¼źžxQī9b4Ā"ŚU²Øg[ē”eÉ0Yf"£’’¬”®UµÅBTAĖsĢNĮōsĻyīžīoŻ8瀯’ŗÆū—{*¢ųč{lmmķ۷ϟ€*‚Ą Ī9†O8R ©2ĮZ—eĘłÄåĄŖS‚s.ĻMģń* ŻējķE1ŹFµ9 āX’bą‡ÆZĀ„vö ›V“±©”9פĶSöLÓ"÷śŠ{|ųĆö r~ééĻz–ZQęT[®ē#€²°ŖŚīŅ6«hćæč£d£Ć:Łóół|<™“dä*ų­ļĤJŽō:ɹsē@²oß¾|4ņ,śA µR ÷‹xöqĪµŲŻB¹–ž ›½,KŸēÆ{ć~V残čY'bWZzÕÆŻ•@c|ļ|>÷}᳈Ńd“ #÷Ćøk¢ŅRśk­›ćŸ¦ÓižēžŸ~7-Ų"/ęt:][[Ł‘[kWśDp[#¹gŃŻJ4Ż"<^ Æļj³µÓ{ėøc ­POĀąįčžČnŃͦƒL ź“-Æ:Ģ“ö;#ZUS=„>Ōo ĒxóŌ+’ę 6ŗżĻ½ę %ähXŸxSB‡Ųaœī]ōŻihqŹÅsqh‡÷±vä'«źdīs š,)”žŽŚ/J-ĖiZšŻ˜Ģ˜`ā]URŠ5¬¢AēÕ’Znt •%‘ü%425A ŌÓģP‹4US¬#nD§ńģ÷ÄŃŖŹlЬā[gV š‹z¦É?ČP6“bā*2¶b!ēœē{ģ……ōœOĆY”x~xŒ}NӞø½Į¾žčĘš©%(·”0ć²;üߖ.™å”{óI¾"W¹_Ęü¤ «EQV ›ęõf‡ņ‰EQņhœĆ%ło“ĻhÄ[.E˜z[ŃŽVlĻ; XvUh¦ Ą„PӁčw~ó7ģĒĀ—Ø%(É+Ę Ć&_åĶĶāĖļzĻwą‰³–iD O¦LdZ.`›©ø[’]hÆ:łź:Įea³‘YpŗĻ,Š ’'½7ĘD¦żPą­ĀģŽl`?ɧ6ŒĘt{6Ó\ŗxä¦iŽ$0Ģ» õ8ź €ģ™Ų±ŌŽ ēf—W¼u>FŽYņ½Ö"Ęūś"¾xāIŒŖ8G™ń±43EMļ~>!œĒ|AXÄÕ w“ķė eM^G B”¬§ <čkæöźwæg”å„-xšōkæökW~ŗ‡érÕņ#!sQī>É×9 Ó’Ū®sį UĢēÅx2jØT Ė5׉ĀżĮģTiX *Å»[bÕdœyĆ-[Ōz––čt¶ØœqŹ>R4,"oū—~ŲĆ”lÖ TįGOD^ķ9¤¶«SYEb”µ?ŻY“"IZ'ŲFiD©A]=— ņÜ?£Ó¶üo7ݽøŠoĄ­­Ńh䋽E›•OĻeåĘYńy%©Šķ[jŗgķ5ÖĢ&“¼iQ=¬¶Ń;2܍1ö­©Æ Ō:Ģž[ŸAn©ĒWœ ‹Š­|Vų–HŸķ½-TƒäŠē¬=dŒ›ØÕDAĖŗ1_ŹÆ×y÷\ŪCȶü˜ŸĪȐ`ų¢*q÷³»‰“ó“ŪŪ]†G{WŚ<]‰ēź‚TJ’]UywqźuĆ£ r7ŸŃ½ˆzS”ów_Wžd‰ no”ž3Øe%©GŪ Wh¤›ˆõ&€ˆŖ$źLdZ¤öżJݶ½®gŁ#®Šō0~Ēś7‚Ž!Ł/{( gŚßŹt{{<^Iīō` jeõ uÄčÄ ‹×ɐā_+éU&č‰XšXŗ‚hɁH§“¤Ū½ 9b"i(ŲQdūÅÕīsV8£˜„Ž1:4­ØņSŸśŌå—_nŲ8kON%*¢b•Ö÷#ļC…Ö ŲĀy•™0”™I…mbMøN¢nĒ)†Å$żĻŽ­ōö1pėåørҾ$ŲŪ#׫gݚ¬”ō|ŒGl®c ¼œœøEĄŲčŻŖĒAĆ?†É Dµ+H©ÆL•ž0µ³ęį°`DĘl­ŚÉBSźN3ļŽxŚ-ßb¤,,žSŒ1ιČA%PĒaüś&œ 8K˱tF"+UO¦ŗ`­.*ķŠ®2Aģ„zūŠ“·¤Å£pyOPB³X“l'“–Ę˜TÖeČ ŲĆĘ×ŲEŠdŅÖK؁ųŗū‚+®ø‚™”źćaAč{ įx«!6ęą;wćū=+¢EQ”„¾E·É%mšņGŠ˜,c&k­8uV|$ęĖ­š²m}u+čÆCżZĪͩיSifŁ4ü)„#Žčń” `™ÆkQÕ» ³·Ōj]Ņk,5Ų “o?t~æū|1{ę^bs>ūĒö’D‡F‰ĪŸfé.Ÿź8'”rģŌ™UQĢKŠ,ŒŅc }TV…püÓ+^ń «BD™Éü=8yņĻ^ö €A€ ǜ·qb¦f#39ē (ę„J[¶°²N-?*”ŠE}æķ@±źČš]*ĖčŁō’’Ās•vŚ q 0BQ» ž¾•MŌyccĆ/6_b’Łg> Zw5sĀśŁčälņ½-H~4īŖb@4U˜]Ś4˜,ŽDµźX€ėūāÆ<Ļ—ó“Q­²’ŽŌˆÓsēĪĶēeą½µźŸ›·ßӋ+pčc‹Ć95æĪ¹²,»Üx]ļØ×G­ļ–ŗįõĮį׏’g¤¤éˆj)v©C6“SŅ»]žÖ!^ĮY UOUŠp¾“GO©sBXMUcbÄOõ­ńE;ńÅ,`/:OĪČ[\_jqü¢ŸØ ~ %ƍ6£•Ē‘śY#Yž‘ˆ:+"ŹĢ£ŃČÓ{Ą • ¼VM‰9į*5Ÿ9Øād °©ß£B~’2I¬‚ xĒŪļzłķ<+pžX1 ®,Օ <ķ©ßńųĒ£’X(pščŗ(*²(u.rÖT(ߋ… äM˜˜v·O£®n-lh<åy”]uAµÓÅ<#1üc›ĶęŖoÖZci…Öčć¢G¢Ó[e$ėčŌē좼P$ ²¶v ƒø@TĢŖ”Œ“³‹Öa²oBi“E ½”QÅŠīŁ¾uß|±OĢ6ˆm;>¬ļ™ŠŹ…ĮvA”<‘ b„¶«zŠ{‚×ģ!†*5[÷1… …Vr‰Ś=[ žČĢYā»ßó^ž,rź¬FY61Ł/¾ą…A8°é‡4œ' ŖÕdYB$ņhåŪœĄ{Zģŗ R@­§^lš[e&ų¤§įö=0-‚3ōµ°Ŗ6jÅźźi…“WżÅ’a@fD¼öµÆEŹ~§źŁ«ōS•9M(!›^ŠxEć¼Ö&µXŸvRĻ@%cUMb蜯yŹZMR;ĒöՎC‚‰cCGó–HgŗŪģߔjŃ„:ŗŖ $ķ\7«ąŚ$ā’jŒÉóܳ琬ŚūU¬¤)«éhž»(ŹnĀb™Č°‹žėŖ`FŅ–Ōćņ.ÄT&˰XŽ”µ~¼Hē«°ųŌĆņEŽ](qü’NļčŽzD_݃8ó¬7*[š C«$–LÕī- ±$ža™×DgŻwŲļœĮjp”QqG'ō pC>jˆŽ’P–„w‚Ó¶ŅVŅ7„ĀZ\"Ųy[Ö³¦H[•JÖi÷Š]\”øM\ķ=^'ŒÕ KRå@„¢Ų¤”8÷ßoĄĪA ½śóØt |²“š÷ĆLuĒģtM$¢œ‘ērˆŖ]20HnnoMG£Ńöööźźj–›eXņZōŒ; ’Éßõs¤w?kG׏æ¤7ÖzqoUYD ÷3żP_W“ˆ(…*±_Ąžųmˆ‚~GTL· ĄüU?y‹TfŃŁÓz®#’ūh±A³Õ¼9¹;LQÓÉīö{‡*ĪÖą¢Ø4ąīĪ9Ąxļ0™©·³?IŻk&g­+Ébˆ‰YC€ØcŘPą1zŌ?żė[r“]øŗ²µ=„²8°oec{Zk«ł‰“'1Ź|žćž÷ŪnÜšxł‡>ü!>mHČĄČĄé® 4Żp<Œe¦~4Ź;+mŃaēч w¼Ób”ɧ!ī«:Ķś¤ék¾Ŗ„b"ZžpzźĄ¤m]DmS'­†u)©Šł}Y£ś¹0$‚+į"ņÅŗFøė”ćŒÉd’å&ĻĆ)ŽO#4lzaĖ-ŽĄ{µ”£$¬™–öRć5]ÄŲ€øB¤sō—Šģ_;Ŗ-™QūHv‘J‹ÕŌŃĖźqš*\¢¢ØŪ&ż|h_ 7/p(T+XŠS»mńĄē£ĢWœ<ł_ŌQ­įǾu"ğęfA Ŗze/g+:TšU÷¹×[’õ-«;[Ŗ€mNgG.8rķuŸūÄg>‹,ŃūßóžyQžŌO?SNńā?’ūžžĆ~«Øƒ:D)ščnśœ s’Š ō.õDа՟Špųąæ®rÄ,^Ó3š_å¼JQ Ø )­ČNBf{ÅVJ%=Ė™ŁG2±D,”7xĢĢ>\ÓĆŌĮ0&Ąv±Ģ©i“) !Ņūģ‚KŚ–”ˆFM˜›¾µ&„°*öņHAĘNi¢6kā TÜZēojZćAé!ιŠŚ®€é®ŠLį$BW—U£ķąą“č_žķ­ļyß{żĮWˆcn:uā=įŪ«ż q  RķĶäX“„ Xz­‹rDč Ż«C‡™ŠĮßhRÕ¬G#"*yž[8&)’˜īÖeØG< [j¾M; Vל[„ά5yŲ#y‡;ÜakkŠ Ļ"F/ξ1&ŲkķĘʆź"ŐVeU5 #«c]÷V!kīZHzÆŗ3"Ć7Ė– Yź–oIÕ!"Ģ•cV‰o„Õģö¾ÖĮrHź¢¾9]|4÷=ŖˆT‚mƵJ§ź„¶‡œĄ˜oļŚŲŲŖĒĮ7ŽrŪujj:ī{ŇZ¢¤»µ±ĪŚ ~>“%©‡‚WŖÆE`&¦¦v}|cWĖjɋ[*ŽU‡łŽĒ[P¼³…t¹ßtźäu«1·Č.}œF}Cp‚^G<ž¦ tģ©ĘFŽ«NwįŖKR±Y$Ŗ³;f*u5ˆ&Fā®H㨠caLŻŪ¹§ń¬”ųč½Ų9„¢«ŗŠ¼Ä”Vßńē¢(k‡89臦Y‡œ³n zˆĒ"–Ī:+¾Žł=¤3očØ:Ų <›Ķ677›¢ąŒ@ÆL*–QOœŅčdK”^¼‡Žč§ZŠ0³£ŗą‚Æ¢(|(č“ō¾LŹI†¼¾ļbŖįŪ³£¹Ų³„@wš|ˆ (ŗ÷ė,PPļI«iŖōŲS#øįō‘}ˆ[Ē·Am(ĖMģpó*Ē̆²ĢpFŁČ!ńDP¦"©†Cœ‘g¦iTŌ*ē*4ü£YĪY W’ĒÕÓčC‡&f ].ēs¦i)…£w¾ó‡?|ü°뮸ÕWÜž.|ŌcĻ»ycóÄ3~śgĢwūJ21¤'jrcrÓR“®æÓ€G§poÜå}DU§  ØĻ°čl6󩟐Zč½ !u»ŁŠ‡JEVƒ±’ļt`šĪgpĄSžņfxƒfČ<į Ošb°Uś a”tŖłhtšąAź=žĆ’JŅńĶč.ś9ā“(ŠVŖ®T'”ućÆTēęŅāß {óy•€4&j£¦oӒVšŽ½dž½«+[“]9ŲÅuŖ›™_föiܝŖ…GĘRG3D`­TŁ X+ēĪmlmm•e­ˆcę®QŻs}8>Zō"mdpz½ĒžxųDM–“5źh£“³cõŃÓź‰K;ŒŌIš6›¶“Ūu|>Įä-XX^ōŃĶ8‚“\ j”įė‘^žévj‹ £©ĢN„ä‘ü/¹Óė²8Ä=ĻÉh]ŹZŪKCՍ7bŖra‡gP7ŲL$v-o•|2Ę»–āœ§īLļ$ō zŅ‹ļ;uōzüΊ6i!ĖĀN§ÓAĆ]Õ]ēóy°”ÆL[ī`4ʽÖN¬wl+šh¾fšŒ©+`ˆ©wźIWkØ Ō赓–UĮqØ/ŻT„§²¬sՓÉ$U0ާ`}‡~Q§ ¹ŠŹkA{dś§ō• PӋI”ŗŹ]ąż‚„2¤C)@<@џs zQ(­.U§{‹Cn±g¶G·¾ŖĪa žŒVN—f/į[āę”!īJ„†Ÿ׃wÆć憧fW*gĢłvÄp hoSR2PhéŹøATH " k&ÉH.ز–”YdT:*Ż·>ī›HqńõŒ2Ķ©Č )Hō§žł“S7»Ķå·gŹÉ˜żšÉ¾Ū^złŚŚŚŚŚ4ƒś%/lŚüĘ©j7óØšśšmz­ÅSVĢKĦ__…³Ćļ­Øe%ĶÄÕ)Ń £lˆ‰26­{ŹöŌź£ Y!Sé'‰T40%†+;uV| qkōZK±ķ.T… 6ÄIwĄāÜ’¶s;Ķ„šrä!ķŸō¶×Ģ£®£æH¤·˜N§ŽZv:Eśū>Ņ©LrgqgIŹąŒS„ ˆT¶Ė.hU­‹°4鼓]‰'³GLŒU PUąŚkÆõW“€0RtcŖ¹ķkžiB!FP= Ÿ\’UŚg®ēQC¤—oę”ĶRA4ÓTćnŻSŹÄR-:†čµPe¬*‡G£¢µ4€Č ßó½ßė dDNŻ›’ń;¹CÄśœŁūik‘“|ŃWB ÷µoęgCyž×x–fYuØd—ĀŌ[@ØŻŗØń]"5ĘČ'•ŗž”FB&j®Š$Q•ē˦'"µ„4PuõN_Žæ‘‘oÓ·äÆ绣UńĻĀ"”‡Lg^ųŻ©sše¼’ś…‘Ō4y¦±“Õ¶µrųŹ&ņžF“Ō'«&“18¤ÄcŚ$ųa>q…Ö7ę¤jØ7‘³–*œ•ŠĢf³ÉdŅ8 (Įw&zÅu'ƒAY:fNāD†—±öü&Õ:®•†Zż‹µO”¾)¤”ÖČD•ćZĘĆZ—ēfą#vɹ/µĪA*ńēķœhÜ­µyn|b—R?ājH”6#^ 2…—¹T#QīcJWl/†bh7uG)„yló|©‘ļ(·i§ÖĄĖ¢!–š5Ńe³š,KE[Į2yMŠĄDPšIĒGMQŖFöĒZ—e¦,­1&„“ę'½šsź«b‚vĆE•x®7#øįkƽžĖļr·ņÜ©¬ ²Ī±ŖāŪ¾ł1’ēÕÆF>³ˆsš"Tó–6Éhpb9ćs5ÄźCŒēś)ŗ2E©Čó&mœ&ęÉdŅ“5éceL3ÜŽoÄ«ŌÓÜHwĀl6 Čį0x0gD?§i©|®kéõkd÷0›Š čŻq­FōŽD,:” Ż£w)9 jēŽZ8œ.øŗµSz q ļJ!VÆM„u;Āźź9Ńć~hŁx_į\ õlŗ6jZvóėĶ«GŠuźŌĆ„+#UԌʹ-f„X kXaU-ō’5T¹,k]ČOŌÉ·<ī›Īž;€2²„luĀ‚Qn~ä'~Y¦Nø²<*ßb­Ž†Fš&å’i5ō"¶ØQƒb ±>›\I/bĶ%Öj’ģ‘C›÷Ų+¾Ŗ¢(ŠålźÖŌ$Ąž¢’$ŅŌ™@ŲŽžŖœ6н„(2ēį*lh4Qß^–ĪßCšI\ Ų®b jöFcŁÓ~V±šĒÓĶ,€ł|ī¬m&ĘB7!†hą“Pœöź5ń)|ójˆ”eĮō<õeyßGZć˜ČėEµš,7ĢD†œtfö@ÓEąŁY‰ż¶oŪ·²jVa3›e0 C„uĪ (JW…-][WjÖ÷”_ƧźļŸ †ĮląJń}ćńŲ Gµķėų«œĻ艡ż.Q4QūbōЌSoGeu¾Ÿ†&POUkLµjģphiīz!Pžå³łģ9Ļy*)lQ¼żķo‡s;:‰;Ģcuo]’ŌtUw1\]¶įDēī iOŽĒcŸ[aC‰¾;ų€EcŅ„ ~Će‹Z*KGDźd”åÖ:"jf;ų>öž¦°tÓ-ˆ~k ¤W[>ąŁ±:ŗx¢t€’«5*ö ńBĖL3ĆŲź\¢%Ś•_·[Õ¢[óÜ»ZRŽmŖ»īį~<æń‚?}ł'Z“œ:˜ÕåX½e'`6‰¬ś46ĪĆņ”ć¼7ŽH ŁLXÅõŗ·›ƒß9µz+zŖ:ē‘0Š#K<…¬s6[Ąź\©ŖL˜nm«“ŁööŲ°)KS:³={Ö’žßOųĘo|ŲUWŻėNwś_yɾćmĻīsr¦³7žšBóBŚ­R ›ėĀjžŪ”›hōiEų¬Į³W§„Z¾ø2Ą˜L&©jKėšF«©FzčIzóšA¦Ó&|f­õBė:F·#wl§÷z4må¢vQ té t=¼?%Öo””÷§—ĶDcĘč?µģro¾)~¹RŹy‰Ŗu‡MĀ8Ü"‘Ģ,ATÜĀ_Ėwą×ĢaĶwW”ĪŠÖ­„!D ›’Ęb »Q[üŖÅ=¾×dœeYžēž v!ĶįÉ`§ā5R†ž¢€Ŗ^·Ü}÷w~ǽē}Gö­:`nur`õĢtś ĻĪęęö}¾ö*!"kēP&Źü¶dn’Š^N½ F·ÜłMÓgķIjӑ%”¹ 8dóØź··uVąČ`²:†b{kZŻvh¶ÖÖs—*Ē“B]CcKTōq>Pń}Å€źŹŹŲŖp¦TwkÄĪ—ų•EXJŰÕnAB-‚Ņ›\ī7zĄ’ÉÜå²/€WK N”* “ÉČd™ ¶¶¦›[4ʇ\čŲ €…ąˆR¢bjMÖĒcėėėD“ŗŗŠ¤'ߗ‚”³ł&GĻÓŽ€˜vĶxĵ©‡HWu×ā"v:®OĘGXc:¼²ļ_Žš&8Cž“±Īr³ŗŗše&­Å]ė†/b:Ąd,Ī…~B‚œ“DŚč.“{J3Ģ&² µ’ 4qKØéā¶Zro1œZ™č¤WK3¢ģ{ƒWĘ«žēŻŖ˜Q.Ą‹_üb³äŹķD;aK9µŃyKėT]&ó^MąŻ½»<[”½ŖĻś&¬ }UY¼čg¶éBǚg6ŃÖÉÕøÕܘĢp–"ʈÕ:µ%Ü@ÉAwżtCpĖŌ¾EogłśŽŽjl‹XżßL`"ĆA‡¬¦ ˆ¼ ÖČąH &&%C)1qhmĘ4 C³ē•Ó­ßJµ”»v"ū–«O,`ŖŚĆ¾[–°:™kĻAKjCµŠž>Ąó`ęAB"6øŪŃļeGÅ·<Z¤S±x’rł“ _-š”­īūžg>Ąj6¾śź«ļtĻ{03i'ėŲål26Ņ`(•TØ?©×V­JUŁzB’`؂ū˜µK7¶ėp*9%SSų!uR³Œ60ŽZæ«+Ź2”0 æõ`1t$Bņ2½į!7;BVv.fj-Č]±ü!nOļķ5Ńqż{Ż ˆŽā‡ų{—Ųąq§4@k)8*™īßøGœ ė„™!į1˲ŒiÄ y·5V»µŽ ¬ÕmĤµŌ#šāĀßłļ’öą>襈ÖÖÖn:½YdிęÓĒ.¾­ć̉ŽČWü2(ż˜|o¬"“»(¬1¦(ŠÉdŌļpø&ŸQŗmDY>^؈”ƒh‘ōØļ£x,‡ā÷_'@¦‰lY“ūŻdK—Luj8Cģi ˆYB”8°‚GĆHĶXĆļ„ę‚jU[{޼=čˆģy+µ÷#•ņŠæW[: Ęčń’Ģ9jØŌ–Ÿ[‰õpęʂd+zIQˆ]xa·Į*؈7[®†ņz~I{9=ļ½å-“Aģ.»üškæČU&ö~čéæńŪæßȽ¦}½g“6ŽH¢~vŁōŽ\iM–yų«7“<KҤc%H:Q Čo…Đä’‹€µæ”§Hyš‰¹›wnųikI_ŹFœR-4„ūL`N"‚}&;7ŸWIė=Ś’HŁ+°<ߛxZpLļ9¢č_‰’€ŗūĆg[t€:…4U£ĀÖėĶ5!{v^fć\Jēó+¾Ž‡šīżMJkŁmėŖÄ„?T’„¼`G •(Ļ]ß³RæKI‹ŖYŽ41sQ^D£Gœ22öļąģ*ŗµÜ¢½C³!…Ś^"›óŃaZŠ-xkœƒud¾+XBü¼.CZZ=޶d’Ł3RU뮚rJu±:ŻnJµ·.±Ģ8ō#Uv?ėĪ9qn>ŸfŃäaįłÖ½¢£T=ÄĢÅtö«/~Éń‹.ųŲē?ū‘›o8Eø©“×N§ĻxĘ3¾żŪæ}m²öw½×1cĆĪæā«īżé~”lŸģFŖ£3 ĮP’ČIxŠ+?^qHx^ŅŠŻwźŖŠufńXu¼į”LOwŠ›ÕńHQŅźŠéž ×ēßJˆŹU)nĆH«ŸĖ0¢uWN*ŃŁ«į¹lr±Ö­­ćžeäŃ{‰ūŪe §gå…CT’ć„zŻTdqŹóV‡÷Bc 6B‡§Ś#R‡8ņcƒ™ü>ņ ¾m&pūUęHD=+²[G,Ė2ŗPA›;;ԃŹŅ_ķQx$RŖZgüĀóž{ęŌ G/¾OĆfDB, Oź3EQĘ:g³RØĶ„‡XÓx<*”Tå/tą”TI}®]I"ü}„×ė―“Ā$„ß1¹ŸlŹHéē?ŚS*–eYÆ+Ŗ•įŖģm:³źĶQečT.Ė|c³Č2ŽCaŒ‰ń0“އEÄ9iž/ņ×ä fņąh ĆU/KŌ?I0ģ¬ :ą"Ynn:łc7JÅDh@(˲öõ„&ōĮp·6īOš“+Æ·ÆU ģõ7†<’*ļćaUĶL¦žäē?7Ī ć<Ė€ķķ¢z U­ūDNœØųÅ,*Nœ’VEkRSŖ łź^óŽ83N\Ķ ©ƒĶå)\Å–¦°ķn6ټZ¬ļq‹ķD7 æu?„„S=²×UbTŹÕA½ Ŗś’šNEĘPįģķ.ŗJ8E;W‡$$z¼Ž:Ż7ä1öW8#!(ļ~‹ū2fŸtSązЁ ś—R!•<6‡śźĆŗ”ƾc›"#üo"Šņ“p»-Ī÷NÜąu“Æ=poŽjF#ÜEĒ5’-œloĮoyEÕ/ć3ģŖ ¹ˆ  øē’éCŽōnG/…',³Zx·ū<Īwt轇w Ŗ*£©AŠŽžS·ā;ē"eLƒ-¢x {d—.K=īrӇö:•C½ÄńfŒ1lĢxÆÜӎ7_3ßĘÜt5}čCDqlfB_kŹŽķƒ·¶ž|Ś4ŪtBļ“,nµ>›#ŖH×Q{ ¢£a<ė·Q].&¢cŌ®æŒzäB÷€UOgå9Ō]’¹ĻĪēs°99Į”Cū~ś§Ÿµļąa°‘ ēK3ęŠ+¾l4ŹÓ$W׆łøZcvš8iŹ9¦[˜+cĒ®}Z›šZS‰z“K>Ō®{ĪHŅ[?E%,¬Ķ¬“w×"}n7°hPˆCɰBJŌi+‰ż&ĶÄŠĀV'“śŽbÕ °qžR"»x±ÖJ?ŻbcüłtŽod/ĖҶtŃźśś°/×'²Ć­¤`*S`ˆLšĀާ|ģ`juĘ"pÆ9Ź½PؓT„ŪĆÕ:…ć]•€˜°‰Ęćńˆ™J7żė?¼„6y~Aʂ¶É.b® š)µ ĄéJK ƱOÅ4ö«'ø6M41Ūµr©“ Ż’ÜY“ēń‡ŖM:ŠN·ą5ʆUĻhX”•ēāˆBmšžyš•w¼£§ <°ŗļę›o:sćõ½“­„ēČ"’øŅyn)Ö ‰ņ] Łpž-š½yįśiÖc{ˆ0e§œš8ŠąŚj»#‚ē !šró^āž*I_Abˆķ|Įvӆ)XŹŠķ!īĘ ‹ę;$S¢ ЇTJµ[ļ]äŚa!UŪcŽ+.»©äóÅŠä{oMhoĪŽĪÆ^Óøs#·Ō®®œVF§ĻĀŠķ —'ēRؒ’Æ~ģĪ•ßĶ1?4ŖZ„µāœ–„2eĢżéĄxÄÄÕbQµ‹H¬ÕźńX0=-F…Ŗ'DŌ•V¬ód¹ļłĻ’Ģ™¾łqß|ƍ7śĘ$ĻF 3³ßłĶß2vų½?žÓ§żč÷Ļo9É@¾xņdÕ0vÓȽ‰eUmä½4œˆĶF\J¢ßŠŁÅ!Ė쓉®”±#.‡łŽõŽžh½0WŖv¾3ŹWr¶ˆnJaźŸAZ\¹nÖŪRĀ)ųĒXļ܋ii&¶kä-%· śņžt÷Ŗż©‚ZiåÜ{B¬¶Ęę¢ĘCµÓ­%g@SśÖ²ūDŻ©Ä98<«Ną„;=9óN—·‘”īØm_Ó „Ė£­Čä–*…J ½j=RuĪ©8¹ę³Ÿ»ĒŻļ~p2΁‚0½ąš›oø‰²ÜY².Š(AĪJØÜvF»µf< ¾gŠōĖbūEBœ0Ø ;R¢Žnł4ōm_­Ļt”!©„ѶןĊPĒc„n‚d”}¾ŸˆR~ MNPÆ JD[[SēbĮÜ$Ł·TŃ·–,B¢*­$|‰„F’bH¹åĶŻJŒō§6[{_u ˆ‚&źČ§nYĘÄį©’WbˆØZ!"8…'2$‚Bl0€ž@”ešāF¤ĢPh ƒ™BO'‰U„ĆÕ0į^²ĄĘ a搹%€Ļlm«aĖ:‡~ž¦ėA,•ś±?ČXŪ «);]·ąTė{%½ į4„˜ŒĖķ­7¼öoHœ—]ŪĮ…Ø~üƒāQ%(č¬x¬VŠX  Įpž·'’ Īi‹,ÓēüÓ8¹ŃY O„FL–ł;˜ĶfPżņ/’r’śĶķM¾’ūæwo9Ī4ƒœ"뿢„„TĖ­E¦‡^ćs>>żā:gźWTÉōś7~*ÓĪÆŚs’ŹŽÖ=t»qډHąUĘ|ö‡D̲Čb —"üęrāļ-¦¢< ^ˆØNmxźž,{+!.Fŗķ|©fćhü9UÄ­LŽĪTśĆŒ€ž`pp{X6$tėęł0–/3&{ޭЇ^\S½5Bń^ņ×]q/ˆX“ózēėšĀJįēė"·[ŚaķŻžŒ:Ėb:ŪW})!ŗŠ^QĒLB»­*„äi%§S”ÕV”øĪžrĄ¢r|G1Tō‡š~_{?ņĢx‘%ĢJū'Æzå«^’ŚßųŻß¾ų’‹žõ_Žņń’ūß_üü˾#؄Zą×~ł%,lʹ‘ŗŸ½äTL łŒžWõ±dy$aæ…MBė–cF;PÅĻķhS‘ņ~iÅžÅrš"o£m£©}Ą/¾ MƳźk-×.éeė„H%Į†$¦{„87ļ/ėśd†Ī’ÖĒõ·$r0D2“¤i6ćÄn!éh(hRÕßUźī–±ÓĮ#ō0E_f¬13µEQĪ W:ŅFu%zóNāń 'SHœ˜ȱ:­ÉT#ϱ—XŖp…ˆ ĄxŌƱ¹½5Ķ3ę90<įŪ¾†ĮÄ̹ÉT`m ö} Õ\†ŚZx>0&Ņ!Ö·T3ކˆ.Īā§°äT‚µf7įžNÅŽ"…Z¤°ŪĘń‘|tģĻōĻ'Śg*Fŗ¢••cŲZ—f֐ky‡»Ā½Sƒ1˜Ą4!c(aE¢Øi”VŒĻßgZ\^T/µC^vss U{‹æ½H:휫F†}—µ·9>Ż°:œŖ kØh£—Ü=ß[ ÷Õ5z4ČY 3č—#RŪ³©rć1WH\-N‘3ų^xģȼ“#6«yĮ'?ö1ļū3ŚquƒØ^_?v–ŁĀ¹RÄŖ§—‡TH’yłķłę/»ģv’¶o{Ź’ś(Ō•-Ó^ĢŽÄi4¼ŽŪń#Üī暣 _ž§ ēi—Óæµ6-n'©®Ę‰ˆ»bŽź„Žü lm“ÉĻyīĻČsʉŽ:ō÷½’Ó’÷Ć{+÷"MŚ•æt~®³ź+ņĖtŻń‘ĄncŽ|M‰_ül6넯25f"‘.Ėq(«öÕ¾|š¶‚"pµ [ż“;KĆV²Z6ó”Ø&…ķŌva%9ę>¬µ *Ļ‹Ri͜ˆŁ@†Čē‰Šyéč¶r,.3“؈–ĒQߌ±Õ2' u¾¾Ä7×Ļā±Jł [ćåOUN(—qdSŸ¦Ÿ²²Cƒ±«¤‚—$‰=œńē4…C rn²¤!1…g#-å‚0¾Å•½8ā·Yū©ź‘«śˆ”46Ī„­Ų»žn*ˆTR$‚O~ōSy6ł­ß’CG¬Ķ­3Ą·<öŃ/ž…Ÿ±Ū'žŠ‡Ü’ž•ē9«²*oż×·ÜöņKĮńšµŽH‹R/įn%°©4²h÷½µĶ£łH£ū˜’Č2V4³q~‘8ŗ¾f…&UD€#śō<{Ė[³I7ź!«V*KqņŌ‰‹.¹Ō/æZ@¬GóĆ×”ļöęČ3ģūĒ©°>Ÿe­€`Ä§&†ać™YRćŌ‡„¹^¦ś÷ “¹Ą¾­øœs³ķi˜ōjļ )¬čœė¢ļŚ w·6·UBĮeemT¹L 匲<§D>“Ó)Ų-čP“ƀoDģ5 ĖźˆĀŹō7#*( Ų’¼™ŠĖĄ©«Š4!Eā›#’2ƒB•˜3c s1›Į«²W)¶˜ÖōģĶŻa,åB¬HĶSE”«’¹5®dX#yf¢šhÓŲ}ąÅ ¢‘s_Įņģķ’ „\)1r!]ž–"ft²ŗĄćgÕ9āšJ'äa8²H_s(Œnq;^0śĢ;ścC ,ķāG3ß 8ļ²ŹEĪēSXę]Ō‚„Ü;v{Č’,š‡ y āó‘Y–Uģ—”f­Ō„[y».ÉēPņ©÷ŗ/X2‰’~ˆxļSHÕ0¬0Ŗo{Ū[Ƽė…5g&q ʓžō­öēÆüÉg>‹'+‡Ž…óHźX叒š÷żtšĄ¾w¾óķ_| ›lA4° †Q—ėŽļ乘¼0DbU]\mÄŻŠRfé¦D‘u_ÕT:)6ÕZWC’Š$F¢ŚŽ…üŸÖ¢#*m¾GźįīZ„øµsfC+¹£¤ŅŸå É fŲī01ī_Ų#ŚĆ)­ Eäi%”RPåŽ)Ų!‹ˌ¹jzg½ÖŁ®øv¤ …ęa"¬®®ĘFƐ#OdÉc1Ł{“Ÿ)\7äq|ŹÆN2’÷od”1Hp’«2Ā*“eV`’’ų•÷½Æ”ečŅō7ē½öF“¼‹#ĪZŃMyõig…™<,³ŗgņ©xj¾)HāH³żwHÆ»y@Ōćķ¬ó’Õ┆ŅnśŅ;C½hŪ¤ū4øu¾n6›Ļ`XH• ‰¢ žˆeĄT”„OA9ź¾ūń¹ [:¢@L•"> 1Å^,_ČKŗž*©9ņC—ēy”«²P{Ļ)ĆUņ×:&@”†ā#4BÅż ¤&œ|Ą—ż4Ļ"ņ²—=å۟XkPWųē,ĖŲ·Ī8餼5V±B㨯[k}[/ƒ\i0č³żų/<ėŁ’ŗū?ļ'Ÿń_ļśOˆ)ÄB4ØžLŻG+éI4·!sĻūŖŖ¾Õˆ™|°8uN*\—ē&hÓH3ēŅ=tŖĒšmł“ÉDēäܹsVńŹW¾Ņ%>əęqŗHŠZļHUD³ÜxfŚ-P‘£#” Ö|ÅŠ\¾õß“oB6Ū±‘ɬ¾šŁĻęZÖZqE™RdÕčč.R[1±× ¶+Ł«P  ŠŁššq¶a §6¢Š (Ŗmnųo‰čĘÖ“Tä“üĢĘÖh4Z=xŠgŃäs*¤€2`Bš&5 ɋJFś“GN½›‘1‰ĄvĒ®3Ł)ŁŖŃzżJó{Ü,Į%ßńŌ"ќ3r ‡o~č#Æøčā|ŹSÅZ°×Ó¢–&hĆaÖöŌ¬®®‚mg£Ū=#ńō‚"5™ŸµV J@TU œ"ż‚2„ovčtAÖam•m©aŖ]ęoq4™“ĮK›OYøuŠ1µu"µ/õŸ¤™ˆ=c" Š6F=J¤ŽPźś„ųt:ė~bXiqˆPÓ/M6®a¤ż½QÉ`”'¶«ŠōāXfˆeķ–ź™ż’ń‹„F]§vswŹĄžžõņß¼I*Ķ=ń)PłŽwæū~_s’ƒV~ó·ėIO~ Ųp* e‹=‹F;MLō=Tt`¦Ó™G%õ菠Dk©¤ÄUŁ£ÜįWlœ qN“åsš%ßZ@‰¤ zĢ vw·”ØØ!B°[pćbYö"½pŒ†hJL³ńĄE“9ąŚNˆµ_Ÿ’āR;p%MV5õ …·ļ&‰ G·¼gtóS ų÷{56ĪGfč:M¦ˆué‡F±¢–ī  ˜Ļ‹ńxXŸÆ¬NŅķ“ā/⾨չ!–x‰õŠōȔ°ŹäHPīUŸˆ{-¦ĆūˆћŸŽ‚­f„ŹšĮ<­±ųbĖ\ī$L®T--NÅÓ#‹ˆ!@­³’¤;ы?UżÕE“žhWJ%10œSæĘ˜(ҦNb„ČA˜|–¢jha€CĮŒaj›@BśÅCŪm%)Ł8sęŠį#rąēŸżÜļū‘:|ōh@zæb†õ’?•'WiōPŲ¹ÄpÖ:ēF“±ÆTū@¬( [”k«k“ÜØd†­“ūüÕk’ęžz@Ī9“gĮ>xé '”s„[3s|ö–°œVÕp6õŲzø»“–¾]µöZƒŖÖi–…!śĒ7½é1ßų 듬(ģŹŹųĄžĆŸųā5$"@šä.¦×ŚØ‹%2 '‘ßĪ>żåÆ ņ ūÜ÷Żxļ¾ńjQlc pݵ'Ö××WVGž½©ØU­}E§‘Ģ2=ŃÄ©xbšŠ‰QyuP–Œ@„OÖn»ē’k­ĶL†Š˜=lóf£UƤc|VU/XĶJ ·üżėó]ŸŒDd¼ŗśš×¼ęŖ>D>ÅäD32¤,Éä5*»²łół|4š0CD¤(³,`3VØuĪey.*F"žHBž'<®‡Tč+8Š&CŅ(Ń8„Ŗą0õKž’¼Ÿ{žó_„Oøńś_pÜw‰ųvŚz…¤” ܘ¬-jk‡&ĶZ“Ų¬+NŁņÉ ŗČų™ŒH:ŖkūœQKó¬.öHv޼ų3õ86K¶(.~Y’¦<Æ%…ĒSJČčb4g?ĮEūs?ų]L-@_ćĪ5QpLTÓD“”-éĶE®ų’.tÖźrKēć/„§ē—@5jG'łüā± CĶc‹GįĢ yIƒZŠ‚B:Ēd<z 8!iŻé•j•×vÆ[ŠŅĖ ¾ Z?1öž'U™PdŚ:yśņ‹/łÆ’ž`ü“1Ń3ü'ß’”’ń¼(ģTĮc2 I9½łŚ/>åÉOŗķmŽ\ķ5Ozā“ ¢Īƒö2P¶+¾rļ¹ŃҌüŽwW $¢T«ŖŚä<«9k ­ŗ¶"Ē{Y:"ņ˜½Ÿüń_a2*&¹S8ąåśgŖ f©ūD8© Wm’N5¹9Q2P`¼2ęŒF“±Vwī’d]Eį—Wjj±Õ"EŃķ8ĆZ¬b ².ńƑcÉZń‚’¾’GaK2±GE{ØfųÆiØķ³S‰ų¶Xe µVc¬„,‰s¶źp¾}Õ§kżZ¶…£VŲ‘-cøVØVƒdcŒ_=•™b­‰šXTN]wĆļżŚÆ?ż)ßł˜‡?ģäĶ7ŠZēg A‰ Z:e•¶ÕĆööļ›ģŸŒż„æ|Åķo½CM¢^‰ J¬}ožĪĖ”ĒŅū—ŠŽĶhĶĒ.;¹heßAąX>Ž—ēĪĪoŗö8ԃ±%Šś0”›¼/̜µeQxldz.ˆHߚĻoŗö‹WæżßՕPg"åu•mé©[a¶6hhM§ÓČ0óu×_ó ×V~­ˆ7€„)½µrŻ_r:Rq’“€¤TüŪŽļˆ¶ēŪŠÜ`“™a ˜kftóµŸY™Œj¼’õ ĪI¼`=ų}¬“Üd&©`‘rL;čŖĘQīZ“ėØ* Cd(¶.§†ØB¢!ׄ„gĄĆõh"ښyžŸ=sī”}8l łĆĘ/œē”łYÖˆKłšūŽ?ÉG•Īe“12FĘ’żoļĢKbpN9 Œ%Ėź2h&/VcI [q r*Ŗše™Æ×RX}9śģöŽ÷¼'&ĢĘłų Ox‚Ē…µŚi”ÕD ;ŲĻ ’ž×5‘ĶõźJ³¦PuDrŁĆīiSųʖHTN5 &Ą'$!£Ŗś ’ņ)ĮWé}ÓPƒAīEĆ Ō-ŒXOÆV“üéäI§a_k)Äŗ>HÉŐīlĖó%Wb(¹m°?&7é qń,H “ėÉßSZʽܱwńŸĪ'¾„JĒ·`<܍l·ś`lōVŃ’ŽłŅŁ '”‘FÖD%<]‘Ó5EtqퟻŒnj+ūµüBi(^0‹@D ŃŽżīƹß×(T JAfpŁmnó‰~ŒĒc§ ŅQ>ˆ)³Īf&#ؾå͒𮫒|ä#Łź*` L†+^AaŠīVU·Ÿ¶ĆĆÜz„Jp5ņ]IM]ķdŌ³o9Ś·ƒ„>4ōÕxƒÄĄiz»ÉÓė’;›Īó<_Y™4 ԚPRČÖl“݌ićGZ~ßzļw#AŲ2Ż ę g@;Õzź-ŅǤI·K"-ØN&«>K`6+VW'"Iā›Ēj™n‹’ö–ͦ›:ĮwųĄĄT )uOų {<Ģä1“ā¼UR7† õų5IJ”>ւ4Ņ>…ķ[Åx'Ć®“±Ø0ń7?ö›>š¾÷_päȍ'OŽ÷+æņ“×|Žw½Uvø?­ü;e‘}ć WWOŽtźĀ /ųü 7>ķ»žņŠ?{%Ų¢4ʐį4ž¬V&§:œ°%ę<Ļżüł†eQÉ9{ō·|Ó5'oZŃŁł&āfźtm’żĄ÷}ļƒüĆ]…éó§q  JaTu˜,3¾’JĆ9“±Av㯹˕wœĪ¦Üł.w}߇ž ©ø”µzŠÅd†UĘ]īrf3»:ɦÓémo{ń± /Œ™@ĘćqÓl¦œŅ%[Hųy[!ģ9ŗ! =ząĄ“›© €‚Ń(æi^žą÷~÷]ļyoŲ<ņ+6$Ī1³1A ;\ ā0”%øMšžC€Mž¼Ie–cńŹ/ž`iv›v£%£w"‘B™³YQ^rüh9ŁævśÜÖĘéÓėĒ.T‘­­ł¾õµXGnm_wŻuüņ?:{āŌæżÓ[®ūā |åķÆ÷¹Ļ27æĶу×~ńśŸxśżŚļż.Uf0ŗÅu<ܾ0Čś#?śĆŸśč’=sāTlͦ \;°uöÜŚžżYž;k=^Ęļ__Ējä7ż’«€?:Öbķl6[Ū·ś–׿žĆļłĄČ ]ɰ¶2>t芵'o¹¢pwŗć•7mlĄ9 ØžRÖÉJŊŖJl Å+M‚1ßł¤'ĪfÓ1p䊔ėoø8%ādĮ%ĄØ.ļœ^rńEVĘĤČų _øīS’ųķļt·€dF£}®„$ļ»ė=v7ŗŚĘ0(qĶ'>ū”§żtŻu×]|ńÅń`uVLģö¦zÜśŹ˜ŠvĻŽĄū†“§ĻL˜Fƌ æõėæńģ¾ˆsžL²Pąpvŗµu·»ßł ×\?1P‡UĀ…ž=sīśĻ}öF™‹ĄX‡Ļüó šĀ’©w¾žMĻÉK_tdVŠź@®ģ{ œ“Ķó¬UĪó<”× Vјƒ«ĮNˆT" "x4čē4Ø[*ŗ„nkŪņ g-Aé40ģĶ>{Ŗ³ÉdržÅŃŻÖMo‘“źc£ó]Ć£®lFū%f÷–š 8 ¢Hąø]jõ!÷ŗ—„½7Ÿ±£¬ėŽ„.:"…††Ÿ­żļ÷¼{ß±C§¶ĻeĄ„3~äĒģÕūZ§²¶² …#uz„4qh¶2ŗŻķƼčāK_ųā_eŖ,’0›D0 $Ņ&®¢Ćœß84tž‘U•€ŽīQ‡bQJMܛ•Æś cę8P†t‚ķ †Ü°Ėķ”^OÉ3¹fbC> ^YY©\Ļē”'ŖŖkĒc?őŽ`GR]Ž{ WD"^ŻUļĶę ę jŪ¬ž«`6Jµž×hJVŒ—„„NmĶ„Tó%IźĄŪ“ ­(ŖÅB öȎ)ĻÅæ_^²µ9<”źiפY±|ąO2$r­—ŗ9³,ƒĀ–NSé”X"NŻVjkłaŒ,łcŠY;›ĶĪž>żŅßųu”ĢĻzÖ³Ö¬‚p uPŒ²\"œ/)åćĢØVC„²,[ź¦~æ8+A¼pNœ’D£Ń(H¹@ļ¬xæ<ąĒź§š}&Ž-3ʘŒ[ēīŽS7ZoKƒų Ćd˜Č:r’©q7}įsF)ČI,DS¦`PC]6œŒ•_łÅ__ßøłä…\ø’ĄČš—_žĻ’š&ˆSµ`²Ī‚ąŌ2‚Jō2ĢȰāa÷Ą˜éądõ£üo®ZöĒ_Œ² Ōņ<3€-ģlūą„Žųźæ|Ś·;ŹyŒį0„\œļiMAƒ„§>õ©gNm¬Ž2'Μ3 ßżżßū²Ė/ór“e©sXm‡ÕLM/ć¬õųO“ekūöšMßüŲėNžĢW²ƒĒN7nĶÆ?}‰d"ūײ­ķŁ«žųO|ŚĆ0µū%…ÖäÜRmĢr^Ą•P9}óĶkƌÓ§Ļœ>shuķトDŗ”x8F tķĄK/¾°,Õ9—ē¹Žüę7£¢#ź]„)*Ŗ’tŠõ%ˆ(JŹ=ū§Žń÷ī#WpÄfuĀ+&—B2ą ’vS cÄ·»‹Rŗ=žC5b¶t„ϰ&ąuꉰChäé…+žü ńqF «ƒ:\|ŃÅŃ,Šr:¦źÄuQ®¼U&ƒ¤‡sz|d&Ļ “2ÉdŒ?zÅ˃ˆ1óŽsõ?æńõņüŽ·½hėÄõĒÖx%Ćž1²[ŪgVV3+ócĢĒ p8\¶¶r‡£‡oł¢Ę*āĄ]7é ‰hzb³ŖaĒy™÷åC>)ĖŅ7› xŸZ+KkŠōņæ”D®9ž3åów•eŁx<ī—£]ÓżvĆŗ[œø«uMŽńåõ{–ø•[Ŗ…øūäéø‡¤TÕ*ÕŪEÖĮ.;Į@k ŗŽ“{Ėu„wņ’ē>÷W]E@>žX`®ī‡æ’ūõW^ ‚Ō° T‰ ¤B®tD ą|bGÄÅd2ŖčśĆą„¶PÕ³M¼Ø·Ó£ž¬øZ1$‘TME˜Č  Č(µśdmoĄvŲI”Rgj“ĒÄö­$łKXl<m$§v¢‚ć•ō÷Ü}āųÅo‰K½c Źå%O¦Ś+ Ż› yC¢E€‘Ž«…· ŅFY ¢Ć,=”}hmÉŽq[€ŚŽŪNśź½FÆyĻšŹ›)ÕjX>ćc2!ˌļ,MŲžw1÷ƒO/3¦64Å‚ż¢(jq"ĆĢ™ŁŲŲp@f2ŸÖp÷»Ž µ6`}£Zlaq>[ØžŖ²†Æ>FyÜJēĪm@±µµ%A,7“ ›ŒįŲ+¢_U“1³gNVÆ’vļ÷¢E"‘µ·3ef拳])o4õ Ū/Ą^»§®»ž§žžƒśźū}ۃvŸ+ļ|Õ]īžž·¾­8p1 椓Y5Ŗ° ÄōÉżĻ|k3ƒŽ³ĶłtÓū¤ż¦ĒŽōÅk‰XD< µ‹¼„꼆R±±łīw]=B'÷ŗ÷W<ž›æž“I”@bÓéTÜtĖŪk+3¶7‹ĢięÜžöu_qē;Ū›€ć”rō˜øĪg*¤Ķ!¢‹e9(pšąĮq>ŗāv—CWKzxU°`·»¼¦J#LÕL« ŃrkJĄjžĮlc+g\||-':ø¾¶:Yļ_}ŁžQŻų¶•$! VOmė1HųD|ķÄvkėóŸūĢd”3c€õÉhZ”~ō£…|FlŽėŲÉP“ńĮ§’Œńxģé©ĒyĪĄM×߀Dd«%s¢‰F+3Ū²ÜŚŚ‚j什œ®łĢĒßö†×_0eł„Ę™3øėfņ™3ŪxäĆĪ;óOłNW’õg퇸å|cQ“$LœÓ“Mƒ¾$"jŪU_ ö}ˌ”ćz4Źó<÷<äuń‰Oœ;äy¾²2&R°B…™~ļ·~ė;’„£«“/»ų¢}&[!YŸ`<ĀŚš­Œ¬Ń90Zo9Æē“ż£’ķõ§NŒČĶ”µÉ>żéĻ{Ö³ ®˜OUl¦ÄNøāĆĻFć'|Ūćļ~—»~Łe·ūʇ>ģo_õź€^MƒœāJŸ^¼ų6·Y]am2ö§ÜderņĉńxÜŚé$PP!/tkkK«¹ó¹Œ UŪ=ßS†³U$† Ūé9Æ»į„Õæ°œ=¢ĒēU…3]Ū-1 ÆO^–ečž 1Ī q:,.5-8¬u ģ\ąz5z‰ŃćI6~‘paD‰ÆXs*żÄÕĶQņ…ŸŌ윓>ĪNņųĢĒ?ņ›æ÷;`94#ĶH3 K’y&̚÷Ā™¬Rž×~«ś?)˜[¬w²C‚j!V/XBJÕĪŒ•šūeźĘVéźH$ ­„õ"K~ •ėq¦„P{ˆ#`,u»C(ĪķČ\Tņq4N©’–„Ś„N)|Ņ#$ķ‹Hω!CŸ†©‘bjČ”é źņ<ņzl|BŽQn“U^©īXõó’ü5ܒוQŠjŸ5ƒ"SœbĪČOt"¦ŠCļ-CZCNld±C಑!N–īpuėĒÉ>¤q‘„Č Eś;™Ķf-›°L¶¢]—NJ]NJgA”“ļ„UUuõšōŽń( %ā ōM&ē˜Ś÷eŲX:ö“iK'"U;¬ŒĒØž­­¬¼ņO’8ŌYš®wæėŪžüd0«É|}¹(,ł“š_Ž^¶Z!NIÉĖūØOœóŅZēU—Äéžżė ģßæī„/E“˜—ØXŁ‹y©ŖEQx5Tß+!¢³ŁĢ‹Ēś5ė4ĮŖ1‰‰ŹŁ,Œo–)ÖmŸ:cg›O{꓿÷;Ÿü±ž÷ƾšÅós[ŸūÄgÜ“4AśPĄ¶ ,ąå5ƒ¬IÅųj­dŲ!eõ*Š…-J°VŅ_ūĶßų—’į'?ł±÷¼ēźsåüĆ’čUyąC®ŗźÄ5×»Ķ9łÅhĄØ—£åg[ēĪ~ł½īuźō¹­éęŹ$‡Jįx˹m`ųķßž]ā@ <Ė TĪ '.²L¤ e§s³žok‘åzńĮżW»ą5ozżė’ž 0ģ]]–O&øŒeõ¦“LłęĢĄ¶Ė6J“ž³Ÿ»ųĀcµ ä™"‰d΁ąX¤Č_óŹ×`.ÓŁęötzńžÕ °}öō±£‡?ņ?<ßšĆŒē¶ŠH„Ó ņ˜#x Æw°=ŻVV5śOś³+ĪBmé°¶¾Ź“,3“łĢÓŁ(ēÓgN€JE‚ł* –²˜ĻY]!¦ Uš!T0Żē«īUĢ-“3+F3lĢ ¦[óS×_*ˆ ‘jPĢ–Z)]XĄāąÓßś<Ęķ.¹˜Šł”1žņ• )™-“(QUĘŒ\ %P*;"3ŹWÖד²ØN­Ąi)WŽåī”Čę:[{ń‘ü‚ż£gžČ÷¾ā÷óoßüĘ|ßśń‹.1łt œž#lQśµķ^!\Hė³€”¼õP©“‘µĆõ8Ęø}Āy-¾µ—‘8BUš½åIlÆ:žŒB¢*ČŅÖ"5›Œkb-B¦05ø††“°7˜ż†Ǵ§ē[3wčŠ!8żĶ½äŲźśk^żWėūWhD_øę3„µėėūˆó ÖĄäÖ¬N2‹éžCd4Ū9r6²„ŪŽšåD/}éKÆ’ā £|•(Y2ÕŁ-zīÄ ’ōoZͰ’›·æķ­Ož_Ož_}©S( {‘}wOļ™Į&÷õtæš’B°9›ē&3Lk«+GŽ®śø›2WhČ>{ŽtO °oeÕ%+ąż˜µ6¤’*Eśźˆ ŹLõ„RåĪEpž÷h6µĮ2 H wؤć”āą 0€……Š1\­g„ÉźJ#R؜ ŸüķElÅäQ ÉZĮd­ż9z5²ŸĶWv«bńŹ*0,½ń]ņT®£:qNœ@¢GjŒÉ²ŒAž:Ō 1Œ1`JQŹiź’ȑ#Ż0Ó«Ü/F’„įO³)_ļ ž¢A ÕEŠÅn<ČD†ėtĒ"ä†[x®t:¦ÓiQ?$µ ©³›ņ¾ “=ś8Õnä]D‡Ŗ©·`5øW·zWØ÷”H£‘ :MńāiӐ}U&jQѧxUß÷!"ÖĮÉ'>śŃ—½āe8uīģÖ¼ 1ŻŹ§j߶ꊂØEV—Tƒ«„]żŽ·3×)mfĪ2Så_4ņrU ©WæśÕ 0Q©źŒ‹Ü~LōˆHŲ)UŽDÓŅس,³ÖZė|št:«kžŠłŹŹ{&c %ķX”I©ņŗ0P’" eƆsØ¢t,ņÖ7üŻ÷?łńԃīvéoćk_óÆŗļ½¾ü7_ņÜõŻæęŽWÜåų‘›>ói”+°nYeQ-aÄśH%õ™ Ī5!B1/+īɲLJ ĶŻĖ^ń;ŠyYnOŒéų‘}k+«ļz÷Տ|ČŻlK^Ļ©r=CBCE¹‘čļüśo^zį± ļ?ø¶bmi¬”eĄu7^µc“qōҜĖG#cL½8IaΒ韒Õ)¦„ŪŲŚ‚qļü÷ąƒģWØ!ŗüŠ/ūč'>! Ļ ¬PĘ.P;Ņ"Qļ“É ~öląIµŒ#ŠR "Ć1`nj­GĪ›²“uc­oša!ć …uć|“–ē af6ęęĶs¢¦?ѹ”ā“Ę¾Ē 3&N­µ£qīŌM­µ4ōQ©’Hµ‹=æYW4Ū °óQ–CEgó«īwækƽö†“'UX ¢rŪ£ūĪŪ4#ŽŲ”Ū­ÆŖ˜ĻnmÜżĪw’«æžŪ/»ņö>•ęL03žz*Ś™0?Z©£­/ŖQ£ˆē~ČC?ś¾Ų­łÜ™ŃŠsĪä<›Ķ¶-ų’x×W|ÕW"7ÖŚĢŒbǬŲržÆ’Oyāެ­ĄNęœsY–7o…<+3ąÄ‰ė‡Ž@†¼Ą/ÕŅӅˆä£T=“2³1„u!"Æä[ŪóNݰzšˆrą#ūŸ}Ó#xöƳ÷9rņäiØŁŚŽ$d£}«×<7~éE/yęĻü“Ŗ/„Ęg€åܹ;ßžŹOŽ|åķnsāäĶ››ÅśžÉ™³35LéœN=;ŁæÆ¢6$TŚČ ²®źOĻ…Q2ßž—xĖ·<ī[öĒć<ŪŲÜ¢³9uoū×ųꯒś»^vŪéĘęl6˲¬4ćėOžAb±żÅE„A—_xģŌ©Ss§?ņC?üĖæõŪ ćł5ł·’ēĻæ’ißup_¾>Y½īŗS“ &ćµÓg·&+£ķ¹½ysćįŠųČėˆ\R  äˆU€ÄŽ7¹šĄįłlĄÉ­é鳛X]Ŗ‘$o „ ćßųå_žóæł«|ą¾ŠķK£šų“§=MŒ!Ā;’ķm}Š÷M˜D2¾}+fuķcŸ»lTd()Kj„š„‰¶Sk{Zņ:ŹEŸDmj-©ķ¤[¾į^¤ZĒķė4‰$Z‚“I|"*¾*ėS“±Ż„ˆˆaCOū_OzŻ«žju%·ĘL&“³'ĪL8[_ӳܭ­åDD™;pąĄµ×»ąųÅzčCŽ]tÉ£ū˜“'O~ķ®zäCzÕUWżŲżŲ+^ń²gžōĻ;2žd¹Z7ŸĻ·gŠ=īżUo}ēÕā¾|ŁÕ8Ž?6 c©˜•ė9eYvŹŅͧOå+#0 UŌÜCž0‘B12fßx„˜O­Ā'n¾éąŃ#ž+9ņ¢:„Ҧ^tÕ5„ŻC— מ•³‰°pÕP•ŪBӊö‹8²5æā{+*Õ{Ė_KQj¢gNĮ7īMū“÷—Zšyž5ńÆUa ©":PTźų-•'?Qkm—V']Ÿ½™æ ”ō銵dŹ»éŅnėlÆŅø‹€ŸÉdŪA{sóJŖ$JhXś†.Ę'߂ł¶ŲKÓķ‚;ĻŌf@ģ@åŽWŽį!~š„ißx”¤ŗ½¹õ¬Ÿ|“G‚t‡špĻj”…‚Ō0ķŚ„(IśŹļ¤ś\ļõئ§"äy’¬üļOÖZkżaģ¬ż•—ü2N]iŻö¼\[ßŃŲįżĒ¬ž(p\©¦ż‡ńŒŸnĻ€šL·gTįZ5‘qŠĀygcHߖ•Ƶ@£Š9!ųē׿įī_v»ŸųN¼`bn³žĖä²õIn§‡35ŁQĀ™łö™bóv‡×ĻŻpĶ/=÷yßÕEk`ĘBla8H¶Ŗ m=gĻA•›)$©Ō& Źwüż?¾ļmļĶW× „Ęy;·®Ų.ēS‹ĆkćUĀ‹ž’\R™ ¾„•Ųä#ĻLžÖśĒ  e”bo{émVWWÖ8~ģr`ĀY–óį£G?ōŸļóNe–U÷„Ŗ"&Ė+8ĮüØG?ځ¶”¢rdżĄÅG’ďż8ąBMČēÄķŸŒĪ8{üŲŚśžÕŅĪĄnk¶9žgvĢrŪCū.]]yé³öißų˜Ÿś’A ,¤$G¬?łæšWŻwĢr`L[ēLĪ„b6›?vHX$xÅĖž*D! 4Msb|Ɔ8ßT u&}ā#1ĄŚŹD\ijŒ_ż€CłĘOEaŒ±Öŗ¢D ZąœZ6TŗĀ+ēœ9qņȁżąużŖ½ēŻ‘"Px@ńüē?’Šś~ˆŪŽŚ8°?å¦Ō¢VÖ&S‘ļž¾§•źx—¤N `ó³üŸ ł(Ļ2ąO’šå€a€’Śæ›­š±ęs™ļž®ļ²³Ź®“Pœ9y.U‘ī †cūn…Nź­Īö›Õ„vN’«Q‹īcÆl–ˆ²ŗźˆŁŒ2änw»{øR̼ČK{ōŠŚ¶ŲRĢ“€Cyäų”Nø“[ų™_ś…ßżĖ?{ѾāĒž÷¼;~Å=ī÷ą‚ó—żńŸ=ógŸ»vąšüŌ³^ū†×Ī„®½yӌņ­MYŸä—?ž?’õžG>ųĢžÕ0WܽļżÕ››ÖøņĄą¹’–Ånw±„å¬ŁłŒ³ŠélŹ O¶~Łe—%ŻļØ_ćĖ*pM0žÄ!­]v@ Ö¾×-h2‡.kԘ#ņ:I¶nĶæP[–F~Š]oUó¼b}*Χź5®j_·!™×ČqņÕEʵ<“;ŗuĶHQ¶D•8rĶź20I6F‡ć”Aliu<Ē–b4Õ§vš–v×w ĮZØĆ”vŃ[0ī-kļč=vŻŻÅjRKĘĆ]–™=T¹»ėsē'ßƗT”Hś›“īæĢn‘×ō¾kńĶ,xAė÷Ž×Lo&żk÷7¾7~‡æŠŖ“ļ~źw1hÄ&'6Ą%;qóõŖ„ŖSuiv÷OŗćkœseY¦“ÕzFQ§**6üוį7ń÷¶p¶põ/ćėćoĀ„źҧńæŗŁžß; #褞Y“ń³ų{p¶(ÓiŅ€Ŗv~<ÓQķÆ”ń‘ł|žž>^Ź`Y–éBZNq–]ÖłGs„m-¦ō-’|u?®ž\éŪ›KīÖ]mź8 Ż‘_üŌ;~D5ī;žųŻ·ŗFXV€ °Ź/~į TĀŠ-ų ž'’¾ļĪb‹æ»»}q›ģQkÅ9-KēJ±…k^$l·j®«'Ŗ®:æŃ ŃBĀbŠņąŚd ]¬cąĻ’ųŌĶ]iòI÷‹k/?AeYΧ…ŗę‡Ę[rj ēJq„ų=^ĪmuW>œģŁōeøU-D„T)KÕRÕV&ā£śŠEūWÜżšŹ÷ēG3&Ėp<ĒmĘødB·=“² īrģšqƒcŒƒĄŃ6¦ŖjŻŲŒ÷`§å©nśōG?~ͧ?­Ī©OŻłAP-Kē_&ŖÖéWßéw>“~§ĆŁöӝ׳®²+×påńį ĒĒøŻśų²µÕUąäÆU+Nm=žėžóœżĄ¬ßy}å^¼ėĮ•/;œ_v€qˆqQFG€ 0üÕ_£³zøj›ę+.h§Ÿūü5É ŗ˜łąį_suSŃRTU“ܶjēĒöOn|厗¾÷mÜ÷vGļ§Kæź²£÷8¾zł n;Ām÷¼ä‚+ķ;\˜c\p`Ż‹j_rģĄpš•ŗėĮń„c\¼ŠK÷e—®šĖöMn»6>gG&Ł×~å=Ü|[µL­PŗŠüŒ»ŅzZŹ¬WŖ:Ļæķa¾hÕ%Üv%»tb­gļü·VW¼čł?·ųŠK/øĖ‡÷’Š//ΜõĖĢÆˆ±ŖīU/Ņ+Ł•G\²bŽ?ō“ļRד®NŌé}ļ~×ĖöM®X£Æøp’Œ._Ć=.>tœpپŃAĀ·?ęTœØ³®}[F¾T‰u~߉ŖĆƒÆŗx}|łĮ•Ė®Üõ’ ^ś Ļ{Ćk’śkļsļ}L+@ģ_å@Œė“|pA6ŗ|!Ģŗ“Ó²UWŚ7’Ķ__~t’±n³/?>ę}Ą’ś5źŌY§®”bVVcėŹbÖ5;b]jęÓBE§[³ŌĀų-l —Z’äd¬Oź;–Ÿźõa@†M_md:vF»fŃ©–j‹rŗµ­ZŖ+.Śæļ’•üNkłÖņŪet1p‡}łķײ»=xųĶ>[ķYek ÕjG«ó’±ń˜|ĮĻżģ~ƒĆĄå+łķ&ŁE#ńĒ>üAėŖmēę…nŸ¹ųĄŹXŽŽ2.œLց7üşk9ÕŅŁEĒ\iՖ’ń/’ŗfpĮ¾Õ£YvČ /|ŽĻū!ėž¹žģ‹Ē_Ójœąž5='xē\H}-±õ·ŸbļnUVQŚēď\ņ–zśŅ•ÖqĻčxó NšīÓśܭ›Ńõ|vv]¬;{śĢ™S§»ĻµĄƒŖmµoė\imQöŒjgÉwż@ļxŸgd“‡øą|Āŗč'ģö½÷™®ć²Žkīįfv4‰ß"¢Ž.ŹÅ™ƒŽ²Ų­‡ƒJ-Ju¤tä@|Ośd€p -q0¢’·%h)ĪŖpĶu×:tH5 ČæÕĢŌ¦»čł_޾•¼—gæĪ¼%L µŗ]L:aĪŲ#5=ŌöP7ÄötX ŃĶśgwĪ…ÜŽNTxÄl²lĮj¬RŌ5õŌn{h‡ØŻbęi™Œ] ׌5“ésī³ŪØÓžŹ6 „ا­h‡¬Ū®›ł+‚~ßlé©ŃkNם;wAHݟæņ•żźæŹóéŌ)rrĘźŹˆ€_yÉ/Cø ģŲosz[}–yČTCˆ€vuĘųQ]–”ŠŗĪPjĀéź1—‰„hn^–Ōjå2srŗ±=ۚ(ŠāŠ+.šøĒ=Īó05źKėQ/!ĻsßÉÖŠ9#x‚YO"͆œbdYER!›ā+U³4‡¶vch– Ø#Ą\ rÕ½ī…Łl̦pĢłj–,ńY˧ĖģŚ7HvÓ¬thē…Ćh“:ĪF~Ņćæ®ÄĢ.›D  1ōu÷ūš;ßłŽWŻļ¾ozŻkµ(}aD"Ȳ ~|ęś/žÖ/<ūśk>éÜ֘ǣl}ƒĢgĻŚk·ł†-ƍ²,ćq¶=Ż>6Į}ītéę¹S•¹SĮÓ ¾üžąĄž5f"ēęó³³Ł×>š!Æ|õk¾śŖūĒ£Āi> €™Oßtķ?¾łĶu Æh & ¢0tD0«nŖ*„•µÕńx 1¤ź‘;ŁÄœ¾ž”=7ټœĆ"æłÜö/žÖļ½ēŸ9iuӘ"gįŗ›nĘx„•ńų¢ńhm^pøūm.Xµī ćŠ ģlĖÓ>Æ8xfÓĪDOlĪ0F£lm<śČG>Āyī÷¤Æ}ŒzG'Ė2óÖęꇒēC’ų/’j­cgģŌķ_YūŚÆūz€¾ī~_»>ƹ³gœ-WFęƒüŠ»Žõ® `B~w<ģį/Ju"“ńH€7æń¾Ē'¼Ą HŻöÖē>ż©r>SՍsf”Æ\ßŲŲXYɧÓbDōž«’NIÕT…P!u … #Ÿc2ģĄD7}į‹°ę±ßōĶŪ›s†ŠŹhü‚Ÿ{ŽæåńzĻūļ?pįĒ'ي-/8°rx2)²RF@že%0‡8(†ū"›YQÜxāÜV3žl[9züč7<ī±žcO ”Q)Īom+ “”«u—’łĪ9[ŗhI›A‡Ø§Ū*RWöČm6¢IĖ+%ØØ¤œ×ŖīķŲć" ±" Lžåc/’D„µ¢zʖSø©źźĮq³UŹÉrkõŲŹ<óŁ0ūĮ^U*‡2H§¾Ü§Dµś¶łŁŸ’ÅÆø÷W@>ŹĀL,ņŽw’'‘ȉƒZfĮŹś’|śó÷¾Ļ]ó26„bN+ĄĻüŌO’Įoż.Ōe¼Ą‰²0u·»ü¶źąŠ2óŌ“Dß÷}ß"/L‚¤" ¬BźĮW_SČkś2 ”oōQ^֎ Ոė…äć„@\Ś0ŃĄŁ—8SŽ÷®ZiDÄwõwœØż’^§Āƒüӕį˵µ¬‡c‡”̵[<^ģq„÷³¾¾~ąąAōy;;8?ɍ¶¤žŚPŽ*s°x”v[ŌMŁĀ¢ųĀŽō&wõq©g» ¾¼óÜŪ㽤·yž%ńnv‹ŗfŚóÕ[^žyĪŹPweWõéOL·6ę[v6 Żn9ož>sŁWp¾’ÆN6f[_ūé øńʛ’­’±łaĄ¬Š0C\ų.³•Ÿų…ķ78f1ĶVŹ#ė.æąąūßł/?ł£ß{f£( Ūy1^1پC×nŚ ‰‡ ”„ ~é?wÓM'ģl:+‹Rܬ,OĶō©ßū÷ų£’ņUµ9+ ĀLĖ}y>žó?ßučĀ‹īqĒ;SSf6īn -ßž/ołśūŽē'~ģ˜:ÉV'’ō¶w¬ę£S׎’ŠÅ‡ņµ|s¶qvėĢÖtsŗ5½źė¾Łč×~õ×/»čR*Örƒb>1ČLiĘNŁÜ7Śx`<Ī×ÖV;öäļų®Béōv¹ŗ¶ŖÄ§n>qͧ? ­“^bˆ@āŪ·×}ź“’žĘ7žśóž÷ī·üÓ}ļq÷ ÷­>ćGņ¢ ŖĢ·6·o¼ž‹9pĮµ“Œķ Åvfg[jYäœ+ÉÜ8ß>eä“Ńmƒ‚š˜oųFc2Qė“|ėæ¾ŻĆ–76¦ėėk×ßtä"@]žAÄ0l ZÉÕ“h¾I!Ė2"Z[[Ķr“ź-yZų¶&ˆ~ųVĪŗmŽRį\i6»öŚĆnŚ»’ŌŸ@ŅŹ°TźčduE)Ÿ0Ł-Y7ŁDņƒ“|…d…3™ŗ’zĻ»€R…#/˜UņĶŚOß·’ā—¼äįßšČɊ±äĮā§~ģö®8 rųĄžæś›7nZĢgnߌųÄĘ4_olœżéŸü‰ļzā+fLdó?śoÖ÷­f†&99ŃĻ|ę3ZqĀGŅĶ.°–ы @Ū"„¬A…;V H•œ•Ja!Čg(šth”ō¬õŪ‡ņŹ5Mt€üT«(3Ėš.ßė©|)b4åyn­={öÜ2”M»iq—Łłčü‡¹PE³#²··n/'ķńżŒŖ Ę”k½šž[ [¾ u딣—‚ös-]>^&ż±dį6Ŝ§ō®Cķd-ŪĆE‹µīLū¼ø ` Œŗęż†ā–”¾e Õ\©ąbkN~šé?`ˆWĒc焁žŅ‹A eč`ZA±‹hbĮ-#xķcĘ)ĮŠŠ(Ā5¹Ż?Üb b†1H,“všP@KģøÆöØ«ØüC{LkjŖyŃ (Ó˜›4ż]iŒ™Ļēi*w=ņ‚ęiOfo’%ŸŃm&ļ|9笵Gz8LA 7Ø Ne,Ö)"p“O;ž–Lµ._CŽ’|Õ_üŋ_ō"bö†Ōd”č•_ZņĖmlŽ·¾±µŹ”.#ŒGĪ•§ĻœaąųńćAt§&–]ØŪ…˜¦…õ—Nåp{N_Ų!б±Ŗį fāŒ<Üß“ÉŲ:u20‘S”ĄŸžéŸzQŒÕÉx:+.½ōŅl<†„¼›µ6ØU]ĀŽ“jŹ‚āģŁ³ĪŠÉó<ó²É*•Jī;B6Z¦»Ž#Df4:xčŠm.½ōŹ+Ɯ¬¬›lā wņŗį,Tžó3?ż‰O|b{kkcsūl‰9p®ąßył_žšĻ¾ą”y½/G–¼Ģ““w»ūš {Žä|l, †r3Z U¹Ķķn "Ö!ę ŌkNŹłö¾•üÕ’ēϾī믠F«k?6~ļw~bAā\ńw½GJɲ‘1yiõä\u¼ ĪśĶ{Ū?ųŖ7¼ūVoÜr7m”EFŪ„8ēģĢꄜ`‹rc{&.ę3ąŌ ćū’śĶoŌ<õßæq L [³éd”šœŸł™˜æ­5ؑhQ¦ūŗ,ÕĖ«Üö²ĖKĀźźxee ęé\p’Æ››>÷¹Ńįƒū!.ĻMįÜtVÜę²Ū: ”Ź“8 õŪ .½äŌŁiY–Y–1ć oxƒW`ö;„žžMÆ7¤ Ć&Ļ.øšĀG<śQ7n–3ĀLu®* o~Ģć‚@7*ų@Š\ óņ·_ųā‡\õ5ßżä'¼ņ~ļ[ż.g—]tų‚#«ć\ ŁÉĖŚ*Ämr„¹Y“y}.²:Ž$W*ȁ¾ņī÷Ģ”žęu«*ĢlĄÓķsėćqģ[™Ų¢Ü7CĒ2'rL ‚ɳ±×ųēØbxnŸMDq·å#Æqzhē4 ŽoŽhUŒĆ7õ„IDTKłŚ@Ü9éw«zø™„Ī3j؈dö°‡oL§„&|¦“EŽmWž™ćš”õ}c:{óĶp–Xą¹ŗY¤#Æ£tŖĀżŌO’ųĻ>÷ٟæęsn>wÄzäČśĘ¹-o-Cē9)‰„Kns链åq–pÓę| Ų²…˲ Ž}Ż_½ę„ĻłłÅ9rW_}µĪž:żćĒS„KÉäS±ÓŲ~‡ĒóBÄ fČD41weYa4ʘkąž¹Ė0e^d¾ņt©C¼‰ČrƉ¢U_hꔄ‹RģM‹wŃV,7™ŒŲß[åZœ—OŲehŠcßoÅģ“‚{8’zŪąć$v_¼#6vA”rG£BQs/ŁÖ»·˜N’źnī`™¢n/ÉĪņ÷9¤G}ž_½UOī¶>¾ ^ĄēŌÉ-žZŸFźĘ'©WļQ®ķĢVÕķķķV ćUæüyÕk5ōKT×Z“{ØŌ_)óT)Žxųs ŬT‚UžŪų’x‡eޘĻxŹSŸ²oż@`Q&Æ^NiQ½1äzŒXѤ 2ŒJŽ’ˆĘćqZو¼ >ćĘĢQ“3ŲˆÕ–‚«ś²³æ5”iŠycQōÖĄhœ«JHT[•Ā‚2Ŗ|j8„Ü֖Ŗ)A¢ˆāL¢ź«(!e˜A“Ń$”Œ¤&µOÄhėG'A6F¼ŽŽgß[!dżiMłhT ?Š6‘&z"Ö) yn83kūö˜mn}ī£{čU_÷]Oy*PWžA•T”DNįDĮ¤¾;ŚąT'^„¤š… §¦aŹ÷c¬S Ēz įÜ);Ų–Xkń“µL3æģå/3™łĪļzźKć×_ņāփ 1qØ‹6Ó=õŃ+­œ°÷Ź<ķ{žj XÄ@'LpN›³9gėpģŲį×’Żė Ĝõ¢`ŖUį_UZ Q}oBĀ"« b6lĢl6 œUUbHœŚy±½±EŌ xõ÷ā)š GɄ­mŌé8ĻęŪSu œaX Pe6§O9°ŬäxōƧ ¶,Gć\œ«åC½ŲKøO—*«Ē2õĮCB\eł°v®PŌõL-Cķ!Į^tže™”Œ3“÷­Xß÷įDoxƛ¦m;ĢWŽłgęӇ?öŃźyöŲ‚J;p‰ĢŽ<ļ^š ~äŃĆ£µ5sø0_-·ę@Nķ†s€åW^š#qÓÓg¶NŽüsæš‚sg¶<Ē1惒łž#«ė3-¶ŻtŖ®$Y_9šĒÆüKĻ%xć©Ó[vscV(e“Įö¹Ó÷śŠ»’ć?¼YŌT8½śog±\6e“ń»?ōßd2+ŗ~ģų÷ßdB4ež3 blfœį,ć “H܋‚aĘćG<ö[Ž^rŁ”Ēr@3'nžž;įęŧ>żq0œ0g£OŸ„aµ„?g.?rT |šą±ÕÕxŲ#®;söŠŃC DŁx„ĢŒÖxn wj«8[€&Ļm’Ęæ’źwOĢ*IĶķ/;’SID¶DĘų•_~éM×^ «ä…—4T“D]iż,‰"g%#d¶øāčQÉĶܖn^ģĻĶüóæ<ūūŸvĻ»Ü!S- +ęģŠ”ƒū¬B…µ±l%›źccZĖčš ƒ\–˱õÉē?ņßåö„VĪ śžw¼ĆH¹½yn»(oޘnŲü÷{ĄGß÷Ćr;?²–Ų—×w? TC.pPÆ#ųŒŸųß/|Įs7OĖ9?7={šč<“ĶsgƜĶg®m ŠRW²ÉL© Ü!?³įęN§ŠŪ^zį.æģ{¾ómŸ=)RŠ”ļżÆ÷•jAF½1?ū?¾’›ŃJ~fcSKkēóĒ}ć#Nžŗq:ŻTĀĢ9G!T7A7([e£¼’L£F“£0¹ń’Ń~Ē8 ”cEigóĀǐ’oļ&IU¶ßĻ9•:OžŻŁ¼Ė.KĪ¢€(ATÄ ‚ĢākĪéUQEÅ bĪb~# *Š(*9ģ²y'uwUsžļSU]gü}}͵×ģLOu…žp[=–®оAĖ[»³H—Iß'Pćŗ2/ž”BNŚX™”}ņ1Ł^Ÿ+&­ėÄYŪ^D5³Õ½ńåĖ›¹Ž/©V³;ęt½9YuėŠ)T=ņYĄ*•qJ7ȳHl›äJ1¼™ŗ§ą{Z5Šæå ÆNX$AĢĀ÷ Äßžökßš?ö‚ŠÅrsv¾\ą}ēżļ_ó5=Ÿ÷+²ƒ† —*%‚ĄSšAä»b͚½™ÓC­Ę ‰l„M恎 ’„$AIZk`FÅ֏‚‚ŸmӉČC@Ą¤]ådo4ŁCaÖŌNb ! ˆ‰‰  īOXÆiĄŲj‘-¬Yņ½F‘Q#ņA{~+“žĮ°Ų4Žąnh÷€ķ˜¤ ™˜VSn.3粌<ĄŲco`@֑Äjā.Ԋģh K‘śĻsņž~™¾ü‚Čų|9Õ.gRŠe—]&!µRŽ$N{ę©’Śļ ßp{±ķ÷¤²Ś ņ€Rŗżh0‰d¢aÉL`“ź(j ”[^‹­żÕóܬ÷ÅYÖĶl“¶g ­\6>“0LPlŒŃ ÖÖ€…šJ&Ŗ (AF‚%”•›<;\%\MP”T©APd"!”įČŅl¾ĆĄŒMZv°”n)ĄĻԌŅIĻĮ6b[oĆF•.=`RBĀ€zÓöčž-Æ>żyGtČŗżųõõ¼ģŠĖ_’Ęs5‘Nēc‡”w·cA¶0YŚf’¹ )ķŚœŒI@’°ær¶Ž,Ä lEfķ›O‡;ĄŽŁ{ņsĮóŅ—¾Ō˜¤éó¶·½Ķā&’e:…»'3Ā‚‘ģÅ$‹µŻÜXō 3Żö÷æ’āĒ?m(Õ;…@W*F‘|Õ«_ó«_’ö³_ųō½›8ąŠC!d’ū-ŗć­œ„&-Š“…°¶ 4±Ō¦\!Cz’#q ž®FÓš…äł’ūA6Ź‘‰×”ĆpŒŗéʍY!14\-•ü™™ł„Ė—‚IĒ 6~N³©dz_##CZóQG=RˆĮJæ÷moß¼eKµT*)åŽ]õĒ<ę8‹kTšAųĄy$‰”į!Ž­ V²½<“‘s7TĀõ¤ē‘”Ē<ö±‡~(Ā(Ŗ7Ąõ×^†$ć?’žw³Ēq2‰*C5;Ģ“±é“„ę?žå/ö^£!¶ģŠ6Oėiåno@ł„±n€īÜŗk8’³_üōå_]ŗvaõ‘‡>J ģDJiƒĄ“’ųĒĶ0=\F™ ™Yp‹ē‘B³1ą3N{V6Hp=4Dp\éśī’]õ#£Ććc•łF½T)F)½téRl³Ü4.ʆU”PRŗŽCžēĶĶÕŻBDŁ ­×ėĀq„뇑™oÄ+V­„V{|ŠĘöÓ0…rAkż¾÷½ļŽ»ļŹ&©Ģj]Ęüģ'?ƒŃÕbA˜Č‘˜›ŻĶ¬ķÆ]!]é ×ÜĄ- G²‹ł8޼+Ü:O‡ń”Gž„§<åš?üöÖ’ÜžēÜü…/]ZØT“Ž+ °HK²Ę(‘ņ}óuŽcJ1TĖ•ńń%„r™“ń I•‰4–Ķś`¶anr /ҌBˆ~• ‘Hōr‘Ė€'iTŪŽX¦$Āķō|bō d“¢jvöž^ŗĮłĪ€ćŽ;@½í[ÆB¢2TÓ %SĖGĒĘ@Yóµ GÖLJ’j#cåR)š‹Rŗq¬#…żąĒvēOö—$©ĘąĆłČžp €™™Yeō–mŽ Æ^ŗäõļz«S-luÄŠZB Öd ńĶKæģž5xčpęcę£÷–uY;±Idˆąŗ®}C†Ėh„@IŻ!)¶f–ņłµW³ŖUéyn»­ļęŲĖļƚåa؋éūõĖ/2OėŽ_ !³ź[šƒś°9²VMwińÉU‡Œyt[ļć¤ūVöŃL{F¾ķ śY±†|ŠŽBčt8E””“åzCķ•,²Ŗ@ l†$ G’$ˆŽVŸD'tOįŠ½=>ś'€ż`­’õ„Ø-Y{ųššĻ//PŌ׮ӆ»ćFēėŻØƒ,éM kD¾ļē?±'18)}1āXŁ$°Ś6§ģˆ5a»@"|żk_1ŠDКGŖå“N~Ā‚DLJęPµų™ßa1—½8Ē|³Ó2W JĀnNkWlK¢ZÖ%ż@€Nģ ‘:Åg}xj‰HYŪ!«!f†–RCv!fvī(éĆ; "NŃM:Ū ŅFJcT †£!#v4ƒ`éĄõ4 "Ļ€’ڹTK%[šKك"éz €Ń¬7Y, į$„śFŌ“¶Ÿ®ttAR6I_CzśĮ]W~ć×üźW®$oՒ`ĶŌEßśŹwżĒŲź+㢠.śżĻ®’ĶŲī©Ł— }ņÅü<#õŹ€”d,śJ0QÖĻl‡3Ų$C0JgUOk*“‡µPR¦Ž(;”JÖpĀ ½Ųyńž÷¼§Ć~Y¢”pصf°f“)åk™Éš$Į"_ÕJŚ 0ī½ėž£Ž:f¾Ł,zR8b¶ŃÜYo옯’åÆ7l›™łąxÄ/<ū-„1™i ļOa-æļ¤Ų)…tDÅa3JfAfGdGrRśIóżŌĖQHɱ!‚ė:DdLbfęł®Ōh4¤$ ·P8dŲø®ĆĢ*މ8Éu‰Ą«–‹šĶĢ|äˆtźąM¶Ŗmż‹ÓŽ‚”®Ņ^€V&÷JŖ$Šķ7–_ŠŚJ„{‚õbh’øč3Ÿśķµ×XhŠ¢©U#6oĖ[¤p¬y$3āČX!a¼ŽG•į#:2Ōōąöm«W,ż×-7 ģÖ³;v•…ė\Ąó\„”€łĶÕWŁ»™”6Čąß’¹yd¤L„mŪv7ĀČO?õِ$ǚš-V®XżąÖ]–ć@Z•ż‹.ų”!č—?’iEQ½^/•*ųā%Ɛōƒ"@Ā÷Ÿyź³fęė‘R(xĀ÷0Ģ҉ߒńϊ1:1:>Z®V¼ĶnżĪWæbēó=’¾£Z ĘĒĒźõŠ07ćȂŲIHŶŻģN.[~Ó­·oŻUŸÆļžĪå_ŲøfņĄ}§V,­|Ąź—¼čY;·nb=ķŌSĖÕ*ŲĘ>1Ć2Vhʱ*„R3Ņļz÷{AmĀ6œr]ZkBŚt HØŁlTkeh#ÓØ®T*ĢĶĶ@+2Ś0ĀØa 7mŁöä'?ŁVpøåß ˆo¹õŸC#Ćår™ˆęźóM Žć,”śł8==ĶĢ»wļJA#Ęó^š"8„Ų¶{z¦Łś¼f=7¾ķMoL‹°œ”µ‰¹™™Ńń±9„fU¤ņkeć; 5ŁŁYĖqL‘.Hwæ}÷}ÜqśÖw¾6EWżīŗ/ó»‡<ņį°-ŻŲč2qŸM:“k—­yĢį‡Ķ„(Dõ¾wåS^|Žūßü¢ēæę9§½ę9§žzĢ#ßpęs_ö¢Óæ’ķ+ŽšŖsf¶l®ļŽfEš=b %Dq=¤˜IA°°.€I!ρ±•`€ēvļśźÅ_’«_ßž÷@h€%)%ˆ2 ƒ‚a"‚ §0Į€ «Æ]złļ¾w噏?ełŅ©3O?żé'rž21ś;³w“,’Hie‹¶ ‘ģ ^-ūۤ䮙•pd ØOäzž=؝A<ĮyÅęŽl'r!+ްā½ļ}ož 5}įóŸGāÆ+ģXZ`K ”Į0ś¢‹>9ߜ/¼ )IĀ7Žō×}9ŽVyECŚ0 ŃĘ=4;»$76Čģyķ²ęł®1FkĆĢķl=ŃQc–RZr~’礶½łn IAŗŽu™¶wŲŖÄŪ9˜}ŹA23W#ąū>˜„ōņdĪ‹8·Q«Ś”!Ų¤ ¦€”BHźčct ­/¦ą¬É H’ÄtĖæoՀ”ŃĦV*@ā¼ó?öµ/_AH˜dzĀbŅ* j 8 ×-Ռ#µ”ūīŪ¬ālĶD­m.T?āš#&ĘĘ+%ßb£9»éfÓh&%%A1 ј›ÆĻJ„rµÅ ņNzā”S„ņ„ÆxE©č+„ĒDė}ķĖ—[OąŻō·›’~óÄŲØÕ‰iŖ8ŠÕ¤c¬Ē„<ńń'5š‘2hFl•i?ö”€ˆ5“JX6ķ”a‰|B>öč·nk6›Ģ\«?üįƒ(j6ų½źz<77W«UzįŁēd¬‡„ÅÜJ邹ˆ vŅYg’ę–{®¹åž«žśÆkoŗć3—|£4²ģ‚=ˆ‚&OC( 6včī(V€ē8sõyxpÓf(mń;==Ļ™ŁöĪÓÕܦZ)ķܾKE1„rYļŲ±ƒˆ¢(šž®;œĄUFG1Öķµ0DäXX‘„’ŒŁ’ż7mŚ:77GD?ØŅˆģrÅWĢĪĪJEįHĆT*ŹG=ś1¶Aó¼ž5T" *ü%£å‘”!»zgÄ«”żü³_<=7;\„gt%p†ĖP±ļJ)Œ$į;‰ŁńŠ£ćõĒ?į)?üÕuOyęs. ©9ĖĤ]šŪŖ•Ä$!,*ÕwæżĆDć#ĆlLął#WŽ}铟6p)2‘$"A»2½±¶š[y4ĘŲčj%•,Ń·“TÓ]ķø1‘4¦MP)S»EgS ”G-P‘oEY,XcåŹ•tŠż[vGŠwĻĢNĻĪĶ×›¶ĻŽūąī‰©eš9jG¢µAs/‹č4mß²uz×īø±Bų0‚Ņä8É]MØŌ‚«fśķļ’ b€<į¹kõ÷ŻzüńĒĘf>,E½Q× &!DChro>TO}źÓÄtŹtͬ‰óH6ŽÜ½±$Ū(lłē«Üß&Łq¤Uz__š”±z•-²Ž6“‘EčĶ\“¾ÕéŚö” $o›µR¬ŌĢ©GŖ’°[‰…”ÖĮ3¹Ó‡p]&MēŽŚ.Yz’čī ’6æ8,Č1n?H┊^š©YévQ©_ĻāĀ"¤‘¤9TĶJPׅMč ~8ÆŪ^ūß=µįŹ’m¾ØŠĻˆlA/Önøž‡ķ~§å6ēż6ō4k9ņév׵İL£|`æ5k%ąĪ>ė VŃC¶Vī¾ļģį–÷SMĶKu¬r¾yŗßŃņރ‰Ež5Ē‹™•½c†#úݹW3ĒÅ:ŒTęæŚr6։ĖbžĖŚ®ff˜J™f3:śčGÉ j›e$‘ƒ…$P.„“𨠯yÉŁ|ĒŪ7ŻžV!slX+Ū§lķMv±f­’uć߯ø·ŲÆčöæżż­Æ>wÕčų-7Üōį÷|ąĪ[nS³õp÷ōŽūøīŖ_>ē)O>óiĻ€ÓŸņŒc>ü9OyźŃ‡źA‚lFXZōK%įJĄIq”öׂą:øłļ’бź’s”—’pĪZ%¾ŠssõŌŗµÓ+ÆŻŽćXēŻ%óĆ Žćž3«ĆjøĆ“Šbł2Ų¶żßĻŃŃŲHN ’•æ¢ĢB9żĘžt“Võ€*P&‹Īx©šģ§žĀZeQ¦ĶĄ³§żņCXŽņ§e}A­[oŽæ7›‰soėžrŽd˜ćŌ}\ålČs³RĒjf÷tā›šó7VQ‡QĖsRóŅŃń0YšJĄ=Ę>é–axźcŁę+®[>„–;Ōa;Üįņ¹ö³CģXmz®!Öź’•žź%_ $JC®¬ ūŽē–Š.Æ8ūE¬#ęŲ(FiVŚžK£ųWW]ķĖŹ…2šŲ#a3s£Ś{³R¬o»õļ°¼ą®-«o’Ń žŁ$–¦lō®ū˜ōpĄŅ”ĆV¶zdå{ā£Ž0:́­).›ų‚÷½k’%µc„õĆĮŠ@ŽKŗäüsÜ|ģ!Ž ¬­ėG ««Ī’Ŗ{ßķ’duŒēęÜ“Œ•¼2°røTö[½œć0qšM­RµŽSx{›ŲŹj0óöš€1Sw“€pŻo~Ćq|ĄŅe楟ĄŁ»VųķOœŗēn¾m«äö¼[iŗ?E¬Ćv’ŲśI~DT…-UG@_»äKɳ起¶ę²ŅlŲŽųSO|ÜʱŃ}&FÖ ]9¾¢€õĆĮ~“Õ&ŖLT׌9–VŽ8ŚėČŗv›lŌegmųKŸżÄ°Ą!+Fö›,ļ3Q«ßøģ6ŚŗƟœØĖ XV@ĶÅW.łl²Tõł‹.\VÄśį`ĆHaß‰ŹŹŃė˜ķ‚otvWžś”“}ą°É‰£W-[SĄå}kŽ”“ÕC'«ū łN”÷+ŚÆ½†‹ēæēmM3§8Ö©õkŽrvĄŖ¢YÅ:zŃ3ž¹×ŲøµO+ųĄŽ?ę˜ū’s;«t5°_Ģ­ŠĆ“œlū}„ĖÉŹ£ŪMĪu›ēpˇ¶}čįW¬9jĘ­ÅD§[v²®ę É;Žß±źęFW[ĕ>ƒ/~śÓ«Ē‡—żQ°vtč-Æ~¹jL3džcū°:»āķŽĒ6'JŽcų‘öŚ0\^WöÖWƒ!ųė5æĻbė<œmš©”zóLN©'™>_|²ć¦0¹H]kfŲ!ßż«C:xffĘź5Ü}÷ŻŲSbC’gŌQA^ó¦—8‡ŖĶØü=ˆ"yG8ę¤ėHA+ĆD&‘t‚K)ģ–„Ž•f ®#¤ @ !„LLżׇ¹ŁłLįŹr3Ŗ³ŗĻĘæ^÷ūŚ'8†— WŠ@PV— «K…)ß©2Ę$- ¼Q£$ה kĖåAPLÜøų’/¾÷żX»~żŗĖN9žqwßz«4kH’Ā@0±1¤X³#ęū?ŗņ®;ī,’õü0Q­=āąƒ>󩋶ģŲ¶’‘‡¼ł½oßxĄĘ©eSKF—-_vņOśŃ•?śÖ¾W.¾óćļ]’·¾så’ö·æ–OŠ•UŅó Ą0±ø±€L®Œ`üėęŪöŪ’ćE[ü¢ŌŽU)š- ] °1©Ś „øu;ģ‰Ž#Ų’¢Óµ€™‰3z*žgėNšHMMĀößߏXXs ?śŃ³5źWģBO‘IŌĘ Śf÷¶­ÓÓ3(’źiTo¼łĶoQl“IķU’ e×’ĻÉ×®Å3É|vGJa”ę S‹F†*ŽÖ=…3 b*Ž-ĶN³‰cEq¢^“¶(+• RHd&I)ƒ##X¾|¹ ‘+pļ½÷Z~ ķ,åįßvя#•/j'R^-–ÅK¾oŒv {OłĆīE‡@ƒ$‚_šā³ƒjąźX»‚Ā0jDqÅ <`÷܌%& ļQi°<—ˆ0==mƒOŸœ°(ė šā8–RJH06콯źQ±JÅūwlżĻžÉʤ6'üģēœ*%1Sš°©ņkßų:Qb+„…š ½īoŅŽĮĀwßsŽūžw]ö‰ øēīrÉa£<Ļ«V«‚œåköBKpŪ®—ęO¹AA¹"] HI•+„„ Ą"ķӑdzµŚ°!X›‰įŃZA|äƒļqŲh HĻ…„ZitbŁ*m’Ī³Öœ `“e“‰“ÉŠ,4ˆ h‚b ĄyĖ[ß 6f¾Ń4Ęš _ü¢»ļø”i vļA0IߵިųóŸ’†q½^ĀŻ=;§A;v7 å’ō\é¹,¼é¹ę|S_żŪßAHdƟdwÅÖ됃s]1??ßh4WxłėŸĮ†Ą¹ž3Ó»ĘkWJWŹ}÷]ʋ^œj#Ės^ńŹ‚_œŽÕd„ƒ oݼ)A²¤£Üsģ£YB”I”Ń„cģRiØd8Ö:n6#64;S›±ŃŅ(ń„/^ī£$ŁiIĖYæqi_Wg2;ł%™ „pŸż²Ż»}[Y’ «®,7^{ķ3žü¤¹Ū č8†Hd&€•Ö‚€€%”°3Ņ–iļéå-“² +Ś(!l:e’R×ĖüRŠnŽŻ¢E¶ÄWkŸK:Ó56ō’—æā C›©‡ †W*kCē}ģB˜ p ˆ ˆYżlĄĢoß~×wÖgēšõØ\,ÕjUy0†ˆFA‘ “5MBµóŗ·¾å¾Ķ;ęĆH)³ÖŅą9§žzĄŗ ’žē­Y æśåU±V‘bw…€NI@Z©ž$OB›ksā“—×—ö|7pµ›[µÅo4šn§FzVi1XVŹYĘöć-.HīVóYLjŠūzM;Ģ‘‹W;wŸ^ƒ;ĪŖ;ģ_P £­Ó¾ˆq|ŲĄ$šįķ łīĢØ…1nŪ¼;ūųŻ—Üš¹ÜŁŌˆĘķüę*×-ޟ)OŻ£¦wÖp]d‡|OAćLŅżėžŽ2‹<›=õķ‡/ļ–·Šsļ~BŻHż,QĢ* y:{ök#–ækl0(ĆlĖ^ŠĻ‚ģÆ7żmėŽķ¶“6>¹4’²7LO‹=‹ś‰²@7Ö?o“ ”ŖĻĻK)ģ*IH!šIĮ+) ›$¶°09×užs^Ÿ£%”ĮŻ‘Łb˜ŲyҊ6 ĘSŸ|²$LŽWĮ‚  Z)A  ū°?³0„Ų°™Ÿkmф„#ˆŒ£#ć`aƒH×qŅ¤“„ ŠĮī×ŌŠ„ݳ3¾ė~ų#%»Ų³2¬~{ķjµJ¹\BÄq<<<:>µˆ³Ńf8Ģæ4ӌ+##QŌ Æą{ÅĄĒŪŽ6źd8p=+–~üńĒV0G¤™K>öŲæčłŪvģhĘ:ŠBßĒÖm‚Ms·Ē^Ģ™7K&ßkŽć>鉏/T-–ę§gJ~°ćĮĶ›Ūwļ £†f³u÷ģÖ]óūzhFæCš˜I™ąÉA įŽ"(€%bp×@2A` ĮB‘~ģ± $P,µrÉwäæ÷ż]nIX"y‡a0T#åŽū…’X½bÕģÜüÜ|óĮ3»fMÅgæü… ä‹÷oݱik}béŠOžāĀš( (‚³¶9 ƒmõéąGéy±µ`b¬Z±†§·m?į±Ēż`dhø\.K)Ėå2m*k–%jc#K—ŒHCÕŚö]3—éRkGlĖ=Ģ Šė_÷F­ŃŒ›o¹gē®ł];ęźóqŲ4ZS½ÉóQsh|ÄHš ēB]ŸžŁ¾mŪ “„1‰$g\ė”0% 1 ShHć¤O¾å֛ē4Ė0ICÕ²bžÓžUY:qņ±½éŚ?²Šsü^F†æeŲbGod,%+’tœ^Nśo‚C‚Ҧń¶ARa GQ¤µęD6旣¶\żr†­tĢ€ “¶DŹĪ9Ÿ6H铈69™† ūķL˜k4ī¾ē~³yÓ"²–Tķ` όĶEy`sĖ7­\ŗ l)\ÓÓ»iĖH ‹ģ&W5LŹo}Ū;žvć ó1‚ĄÕQFĄĶwݱļĮūū‚N<źčƒÖ­Ÿ~`óƻ֞KĒeĘ1ų¢æF2“t<Q©™./ÄqlŅģÜč–c¾0a­§;|.³Ø5ĆĆg––¹lŖ% ܟŲ8H §'ūįV5eg"$Qj•Öö[™Žēt,¤mpĆ]­8h¾Ų/£é)ļŌ’hm~:Ż<żä ÜšØÖ¶›īlj2ȀŅŌ"°Ü½J$”K½ū÷*ŗ’‹Ä;§JŁŁägņŻżĪ £’BöįeÅ¢_®ŪS|ЬȩŽ-ÉŻ- ….9uh&–—€Ėßå,|ĻÓoņWŃ]±Čßė=[ęģī–ōø'Ģ ^5`¾Q_±l9J³a”«•T!éaµˆķit»XuØÕõ˜<Ō’tt]W†aO‘·l‰5Ę<šĄ0Ų½c' @ZAć»—\öśŸsš¾ūé‹’äŪßyŻĖ^.ĀhŌõßöĘ·ģqĒzč!kÖüć„†ė9~ą¹žĆ™×„IżÓ±23ČkģÜ£·z|¤ČؐaßqżZiŽ`V`»ĀęHß3×ŲŖš`d6+ÜŪwv€8ÖV±ߓ®C###`&·uī6„µ‘ xž—HåeĄ2ĻμåZGˆ¢(ėx÷,•ęü µÖĀ€ŒŖĻÕ BičĄE1 œ÷ŽnøįĪĶ÷oŪ¹ćgæŒ ³>¹]‹å’`b„yłš{ŽW |#I•ZŚd›™R;Rk2?üæŸųH›‚tk’Ūßł&`˜•$üā[ß[=6¤U“kzg6GvŲ!`Ē”ZŁ|I6ØŽśļ{‚ čŗ~†;wĪ”‚“‘$ĻgęŁŁŁ»īŗĖŹć#ķŻńå/¹RŠ€ ŚĀ0~ņćēŗ”o˜0sęhe—CŪj„łł¹ļüčGÕrŁJU‹Åūļŗē…Ļ~®“1óa(*•½–ćNŽ5=i6fÄ %HK2Ź…"Vd I#Œ‘!f/ beÉŅQ+&Ēq}~>Rśq'0<>’ę") #}ŹŽć“:0€oßµ³\«ŗW)„J)ŒńĮ|äĻ7ŽxĪK_vāćNøįÆ×Žō[Ÿ}ʙ€H“i›a 1„“—ĖĘq]Ļó,mrt“ö§ė’š;Žö6I¤ā0lŌYihS.!Į^‹©T*õzŻqœ0 =­[·äX‰©ź*Ń_žrżMwüėŹ«®Œ=pĮ™mĪÅPĖWÆÆ@ж;]×u]ח…Ęi(Ĥ™!`åó‡kKS;_°{mÜūōµs®ĮŒj¹6ēFĖ„„AP0øśŚßvĢ#ßøļŃūģ÷÷oÕß’Īw[Rѽ  ³0UŸnūm–5›Ķ ±¢”ī@°Y¬~¾ol©›œPKD°c?²i›ĀJF¤K:µ³‹;·-‹iśŻu×éÄd€šZ½ļŻļZŗt9 µČĻ N}Ō:ٹrń¬SŸų®Kh†ÖļĄhVŽ>śh Ü H#EWŁ`™7tĄ’%£Jóšh­\-J…Póœ€a€ßżéŗŽyūēæų…»oæ=°\ IųŲşΤ"ÄD»łp÷KH+9 Ļs… «t(¶Q«ĢŃjvķ‰Y„Ö²‚ĻõöŪj ķwƒĶoš4}Ć(ģiĢ9„œ\$¤Ś×D$S9×2„vš]¾²?øÓÖĆY6?ž»,-¬­‘5PĻ[Fu'Ļ[jæŌ)ÓøĶ|°{ƒßؗ¤x†īÉK‚åRMbZj· bōĀ!¶›”öl@2÷ķŗv-U{jTdGuįŪÓhöį”i(ßŲcL¶éóeįꌄ3"ØQŗż`08ł¦‹—|ӋÄŲļ*2jk7r½ūķŽgÄeŠ’©cT}"ßśōŖ(a9NMŒ[;—pŚÓŸĀ&Ī-½"mŒźwćEēnń…śrĄ²›ŃzSF&³ā6Ź=xJŖłÕ’ż2”"3cvm–pI@ŗ«Č0āŠÉq`…¬(CĄaßń1“÷šu3;·±‰›įœ1&”Bä(L)ēĶ0'gņ¹]P#–…qĀ2ߛšÅŚÉį"aåxõ5/>ėeg=ūE§=õœē>óŸ¾ö˟żÄōę’|óŅOm½ē¶7æęģĻ|čW|ā¼CWŽÆ.Ė P#¬.Æ­•ÖW½õUoUI,ń1\t<`żų‡ÉÕZ^āæ|éĘ„恘¬śVb©Y…€CpńRaõäH °(ī °ŖR˜ œ%{UVś4¬ hŅ•c#Ą8įąµ«XÅĶŲI¢užńŅöŌr<ĻŌ5;ĖŲęZ©č%ŠŅJĶ“Š^NŹ`l‘5 „_ž²—8@˜ō}ŪCų㟮1F% •¹LŹĮk›Y}‡£Ž¶yӐ/ŠĄøG%ą”ćӓ‹ŲĮīųIŲūĢĢ_¹ģR(#Ė rM5X>\b±‰Y‹qœ£#¦3QkżØIļvė–š.^ŽP2ƒs„ÓW_ }V¶øaĶz˜Ķ»ŒĖgūĢJ굎(ŽCesØYqd8¶Døōńwčcn`y鈕NųüķœünVaž׿ó|„T¶Ŗw¼æ…8{‚q%V’ÓŹĄšŖævČ[Yk–Ō\€9¶Tć֗I5 ”Nh•ڰęęĪW’;9pĆŚįĀdĶ) üņŹo³ŠT²BhÅ:O~.»~ØrąŅ‰xü 'ŚóüĢGß³~“°qø“WÅß8Y’ųĪW/eg£Øm 7ŗ>½ó‹ŸøpŌĮšŖæ& õe÷ „Õe.Ö՜c…ż—ŽL:ųäy’ĖéÉĘ:Ź(ņZkęøR”E‰ÕĆåÉ@ڹĄį,›Ųp”ķķœ4•.ž: lō>{­);.i˜ ,‘XęŃ2K]”\—[¬NĶQv07¬k“ßŲ”~ŗæä++ŽŅ€F"œ÷Ž·°i&’*f£ņ•]°S–¦NU4Ūg搥kŖĮ²¢ž”w=öšk‡że>öņ÷ŸZ]uö)Ž뇋k+ÅGz`s÷Ī6ZbnU鵞d›XĀY­oßzĢAū¬ņ]=¶ŗŠuĆre•F=p įłD.°|d4>õ”rSq[>¼2:ŌJŁ)i«ÜŃA9n­Šu3]8lTÖ¾*ö£w¶ÖF»ļ¤‡ĶĖ£t†­¦E…C•pj{ļxÓM7JĄ*Ņ!`Ćśuś\ėŃfĆ!ė˜9UĆQ”Ä%׿ųĒK<Ƭ_å»Ą—¦J^xži§vö/“Ž4£ŲhÖjó}wæčyg<ņ€PJ@™0ā» ź€ųŅ©•€`ĀŁnœāē4č²"*Ņ­Ø²eš,ął·=…u2Źhǟtż¾ÉVņžqrǰŪVö­;‡J7sµ;šĪ_Ż€ØŽ2QĢSzpžµÉ³aFĒś‰etķ<õvé\t[Ź`·{dZ$ƒ/$y”)æŗWZ°›×“’—ĀŻŌč…äŠöX„å”ŅĪMżįæMōt^P¶ŸėW7袓œGóŪZcĒNŁ­‘ćé%uMjĒ÷4Éą–ÜŻ‘īöČJ9ŠBo<Ā }—NdāW“O>Y¤ĢÆ0 ķń­„d†>UŹÉÅT8z>µ¼·c^Æó­gšÕ·Ģݦ¬ˆŌöA¶ ꑑ‘[·ZėFćYO~\ ń˜”µ^u(v–¾9Ėz§+6Q“-j2!fĢļžY_,Ŗ{ļyü!Gī¼ķŸ Å „ņk&kH@v»pÄ#¬Ö|µ‘¢ęĀhþūܱiĖŻ>póķw}āā/}öĖ_¹ä›ß>’³Ÿßēš#Ī|ŁĖŖK֞öüWÆŲūC~įåozĻ™Æ|Ć_īøļ»W’žµļ|ē hG=~pz¾FnPŅuˆ|b`āĶwž'šÆĆ°•ģzŹgü馛¼ry×L(‚Ń€V$ I ©AŪē÷lŁY8šü±Ń9ąŽŁĘ–¦ŠŹÅ;¶Ļ|üńo:ļ]c{ķÅRT*††K“““ƒ¦mŠwmĮó «ūZ›¶/<3;悞wʙ­Q˜¢S4± i’ųū_o ‚%A¹Ģr¹WØœžÄ§RdČņ~%XĄ‚3^kžöד’Üg>ŪĶP¹ąŗīÄHåĮDⱓ]‘-NŅ ¾€hłžnyp€ØK±Ö°yčį‡-¬fĻ,,MA)5³s1 “Š0Ł”'¢Ų¢Ę “6pصv'¹ÉŌr¦ģ ŠÉĆŲvį,ā‹~ąµĄÉ$FŌjņ$¾ß p\I8 h£Ā˜t¦ė«×o\_›ÅĄųĀ( Ńe)ƒ%̓ł`=,”ØG‹ŖV—‰®Łw:®›Ųœ]{ķµžD =ųąō _xFrsäłבˆ dśé:VK—,¹żĪ»„ćzäĄ`ó–­ Ö ÄĀŖŲŽ‘©f}6lĢśżÕWŁ–Ż»ßõ”8B†žē5ĀČ/ėÖ­3H"•޵&7ö •Źé§ŸŽT‚IĒ žēy^k–J„ūļæ?»'Žp)Ż­ģ{ĘGĒØ„ļ-Śoćõ×^—Żs„L[«9Ż’“č­ķ[¶œ{ī¹h6cf.ųBJ ¾ēyĀQ'^q½÷ā^® ķP©|3Ēžó³žł¬±”JSÅ„ZÕn2~śÓŸ"N0¹B©Ųį@¢X+‹xWJpČa‡øA „£”!ČŪwŖ²NmčbkW™®Y3'k唺ńó_ų‚™™F6ŒVļ]’‡kæyń¾÷½ļ£¢8q³Ł$Ā|ež@Ɍƒ>¤Ž4Ę@k.Ź7’óŽ?]÷"é¹ ;¼6H˵׾émWżśše«Öi!¦ėa#VsMU›žŸ°!fggżJ%sʵMĪDņ Ė5>ūæd-Y³QJéĀPķæøźo’¹ć?›¶ļ ±y—ŽÉõ]§H"qå°ĒUŁ;V/Yņžw¾u2š_½ęǟōücOüß½ģĖųšÜw Ė8ŒĀFŠ‘aJ“$Ņ^±A‹Ć*ZϘŚGE6”;įr”®¢EÉI2ąœ#nē€Ė¼ēŽ+[HŸ>K= Õj©C ’üēŽūī¾Ēѳ»hMØ,ōʐ‚‰]G?żīwŸłōSŠ/ņ3Ū›qģ.I&GGĄeßųÖÆ]& “ ‰ijł%—\ś”'?Օ$Ē¶Ó “V @BĆÄ`¬B”]·\ōČuūi⠈Ÿ™†įÜÜ\¾7˜Ö$±®Yd+¬'Įp0 øGøŲ æŁs_°Ę<ł–a›z)¶q§3øenyĮ†óÄļ‚mFźļæœĻ’óa’"aŗ¢mĆź%ļb:¬ŖZ˲ÄĢ®ėĶBZSĪ×Ļֈ('\²ˆ¶g’ō¤S5  ŪĻčĪ×*™śŅ’GƇ£sŽŃńžļ¦źÜV’Ń&_sźtī( u­mo'7Īeõ¹FKŗæčtw—øw'WaĶ’0_Å·m^[ŲĖj-ż«&¹Ź·IzDF±QZEń¹Æy e“cV³UƒéRߊī/ohņš·Ż„¾|±0+(ę>P›öś}[õĪ(Ć’ÜrK“{šcżügžćEgßjiµCKw 4¬/•G‹nXÕåae`XībX`ķÄÄ?u!›ō#:ŌnµiļLĪ®›ØŒ{X3RŚ{ÉpŲqß=¬Ó į(N¤÷bŽšŗ‘P·Ts•Šl'–™o½ń/Æ{ń ]9ŗßhaļšģÕgžś–W¼š¾[nøņ—žę?Šęwq4Ē&dŽŲ„Z5Ų„ėVN•€5#µ„Ž;pļÖ®du”ns„ĀV5Ż>³JōPäK“^Yż“_éV×ŌŻg_ū—‰ˆwÖśmXæż]o& XqĪ"”"P¾šÉ “fU®Ü „’Šzķäčø'dž€UcClE}³«Ó1ÕŽRéģeˆ ­ć#:`åhmyAN:ŠĄ„Ÿł›˜9ī,w”;“‘¤Y™x¾Į†’sėm¬“‰tFŌ ķÄģī‚f“%»š>—›ĆÅtuNlÉ<[IfvĻvk³āzĘY?ŁNŠf=ŌMĆY‰723;¦ķߟ}ĘéþWj®Ü{Õrޛ̑VQ"JŁźš¶:Ņ™$ug€Xn{» ‡¾e/|M6&SY{]VV¼ Ćå•E¹²(^æŹ æ÷n«eÓ°2:֊ćųā_%øfيjaYŁgn0§C(ŰØČ.küž·æqŖā.÷°ÜĆŚZaDā®ž‹CµqÉŅ #ĆL “ddõpq’5+X5’U('+ž,;†­ŠĪc?tu„°Ņ{UÜ&Ė{UåʉāŚ!geÅ^ż¢ē±Ž•nf7!m›h6śŌSžc®÷äŗ±įa×¼ų…¬4³Vq˜?y„HK–Ópsff¢\\=R“Xā`żpq]µ0)°×æ²HcµrKO;×#¼wd¢Ö½ė÷Zß÷Æ[`$Ą’Ŗ;ģ‰1OĪÜæķujV†µbŽ9ń,Hŗ ég)„>ņįĄŠ¢7 ¬(łkĘŖĢ‘=·ĮźĮ-uåd6iÓlė‡ƒ½Ŗr}ĶYWó–XQ”ĖZ]–k«īTÉ œéŻ;Uځž*–‡£®X]L ķ5TĪ<ķ©v·mu2sh¬Tå6ęøÉ&:ńØG®]:2Y¤½'Ź«JbuŁ]ø£Ē±J§³év²ČmŹyæ +v­Uę…ōŸšÄ%0Vń‡=1į‹`uą¬-z+ ŽrßYć{«=wX[+’$Ē6‚*‡ü Z?9ł¼§=mßUėÓ³¬“£ü*”LłTqWEqæ5Ŗæśnßwv’·õ݁IQݽōüĒ=ź‘p¬­ B?pß}X·ü>ŒJzćéüŌ¬4Ēü?üéD„:Ƴ}ÜFƒ›ŠyäĮĻ—–ķ’öߚī×ÅŻS•ļüÅv[™ōÌ<œ'²€Ī’ÆEŹŖwv‰’ I|YÖIÆgÉĮr¬ķžķ‘v ū³b<ŗ@ņŻē¼`a£æĢ]gøō’4¬¤lQ’Ó‚y_¶HKĘZ`'_B:·>ō!)ÉʶnŻ&Ė“IØłčĆÖīå±Ö³FÕł·½ 'Ż,ī^7ĒVńsÜ Ū"i„œoŌc„>}Įßžī·ŠhŖ-p‡b.˜yščŚ©Sžwś‡>|ž·æńµ‰¢·“VŠÉmŗä45\ƒ*;ļ~óŪ” 4ĘCĀpNYĀ:۳Үō*sˆ\ƒ€[’łĻLD\G31Kc\ ¶Õ ’‚ĮRøÄ–Š€zĮæų—;ļ{ēł½oZoƇ¾e‡ ®$ąŗė®óéXr„ĖLn”’ūģ·ßūŽ’ž ÆųĘ]Óõ+wżG¾pŁyŸ¾xł¾‡<įŌ3=éYb·ņä €ŻĶ÷mUĄ|cĪ ¼Mn>蠃ŠŃ“ļ_ńŹĶÄ—ZMŚlö"U·zT‰ģ3 U Įŗµ«afK{k©JIsģQĒ@ՑŽA)#%šķÆÜjŲ¬.óÅ]@īĖÓ³3ŽėF 4a4[Ļ—ā “IŚĘœoła.„°+HŒ‡yi„@c£Ćūx€eˆeč^§Ņ:V<_w<Ÿ k7n`)`©ŌĢŅw!KŹŚ:V šSõ—İ'Ļ9łę¤ŚkU±²bZóīŻÓ`TŖed¦†&żb $!)e¢ ’Ś »®+<‚@Ü YiH8®°’ļśŪ_ēƈ!Äö­ŪSACŖ-qN²ćǘ–  wIĮt ņ·Z‰~TļWF,7&x#ÖėŽpŒĶf“ˆ<Ļ+•J J؆ܹČ)+4fĄ±‘$!ĆłŁœ÷‘j¹øeóÖ3Ļ^r ™ Z"Q×Āa#Bmh|×lL€ēŗ:V.Ó7ær9ÆZµR:5ĆŻ;w5›Ķ;īŗOĒLĢ)gÓ°±€CLĀč1}ģĢlRDŠēa3ŅVä¬^ °fŻZ°‘Ā5‰×“’8Ļ>żtŅńbevģÜ­ ®žÕÆA,¬O‹"™²ć,z'{,~”°|łņ-;§IĀń©Ł¬ĻĶ5Bƒb±č8ĪĢĢ\Ŗ†öuŌ{(\&–L ‚‰7c› TüĢē>—Ŗ7šx’ūo’×­øĖ@ŽŲUā5Æyš€}źÓŸM—,tžg{g;#afŲņÜ ģ$|×Y26:51&ņżĄ¾Q+ ČĘ)²}Æf3æåo°üzĶĘ‚’üē­ö|ķHOHĒɓb}ßķ’žĄŽ÷ħžģ†ó%Ž‹'+Õ <®œ‚&P'śų§/Źß“<‡ß~ćŗ®Żd-Hk MāĆ]tÖK_!ė:Bš¬ÖőJ±Ȃæ;B$є¼eėƒ=ƒ±Š” ł($%‹æõƦ6¤•ĆDNyاL”ņĢŲ~XĀnŖjÖ)°Ÿwė-p)įūž!ON‡»„8r*!Żz@ ZØtÆNŻZĒŁ¹PڼĪ£y ”Įž½=ŁæżĪgpÆ2“(ŹDX\]ē= ޶X±§šų"ҁ=’æ¤żofš’šĢ’oŗÄ‹ĖĪ;ŚÅYŃ¢ÅŻķrŸĖž$Žćw²Fj=Ø ķ@’|ć7ļ—¹š-LÜ]˜=’Ōć0bÖOyņ“2ŻĖ/ūRĻj³Ż£źLžŻ=>ŻŃ1īķ`œŽŠHÅI„ßš+Ļ~é>«Vūސ£Ą(pŲ^«8¬79 9R–ühBÖń×>{į3N8Ęöʇ€5•ņŅBįÜŸm[4YgFēŒ)ŅIķÖčĻ}ü°¼\žtiuµxž{Ž–Ų ē]LS6åiNøVqŹ­Ņ1g= ÚMtżÆ¾÷Dõˆ©įC'«{Uüż—ŽĄ¦{ļé¦ZµUųt”•• Mā ŚVŸõ”dscžuōŹ<φĘ<,-‰'lVWīŻ%nó‰h{ŠŪĀ0lć3k­Æ¹ęwž P"pń§.bÓÖwµ·*R”a½õī;G‰–«=¹ć,q䒢o{ūļ{׻ШöióųĒSuhĢ>š…‹.JšvLåēŽé7‹[¤å©‘”°W¹8L• ÆyɋY‡lT2‰³^ŗéÕ%VęģēæŠÖéNyōńO:ęøGrÄx”ņ˜G<źź’ģ;—\öĆ/u÷öm–$ÉZ푉¢1¦Yoč8ńÜĪ™ˆrė8ÖīF„<ƽ'õóLŚÅ5cūž(Š”Ry±» üę7æ’@‰DŌ¼Gŗ£<߉¼Čł ³nł'w,;ł†ĆŪö¾®’¶wZ›eˆ GŒ“ūM=÷)'³Ž•Š,'ļI«9iŖ§ķż˜žŹe—xĄ°¬ąrūęū£øžœ(lŲEJŽGõFXQvÖVżå.&ƒ—Æą;׏T—ÜöÆMäįūn4֘·½ebR’RŪ+¾ć–”€ cC£ĄŖ’3)1įbEŁYZ”pöY§³ŃŹÄ‹8a8«ČvœNĘÓ| ,ØĄŌŲkͱā¤ĶŻÓ'“™yffĘD1żĻæž¹¬ÆL0į&\śq•%Ē>ūéĻ$ŽÜ‹īę«8œŽ¶młp„¬(łK<1V œ`šą›ĀńvU1ĘDF+fŽ•õ‘Öl.ųŲ‡%0JXVš—¼—<÷4Ė^`ųčķ-·ä>ī˜#–ÅAĖ«/)ļ;ā­+aM k˓א{ŠŹ‰Ć6®åø™5F­Å“Ž ½sÓ}ū-Ÿ\])øtlļ‘Ź£ܗuÜźÉė¶6s§OVSĆlĀӟõäU£īšŠX] åʆ„¼ążēµ&”]Ź:`x“×.É4LęcÄ&žßw½ķ”ĒŸPtį`¹ļl­®öåŚ‚Xķc™ƒ½*īśj°ĻHyCŃßX.ģUrV8XUĄŖ M~Õq_÷²—³n]Wśd[šNĆŅ4ųÉāŸ8Ž{uq3užmĶįģbS@ŸżwnfVEqEōRʈŚwoą¾.įŁO&knFa J®/_vłÅŸłÜ^SĖŖE`ˆ0)Ż`Õ+Y]ņŖž,† ėČäĄ|…ö ę ±kĶ*T3Ó~ą½c·}šžļ}Ó*ĄŠRi& €'÷6ѵé¬bH ¢M»‰} ŻÓ˜o& xÆ56Ū{“¦ŪŪ¼y[ćÖsŃ},vŪŽāÆ6¬"‡*qTī8¬éœĖ‹qšīøĘ=Ś}z6Ņ{‚Ē:²ƒ=eŗvwYCīŻčɝVJÅq܍āl{:‹nīīöä šžoq}yzóąż~µ`rj6"MyÓżŽŸXIVÜǚ¼-©SmR[żęC7N8ģI„‡bÓZ8r¬w’v ó«Ūą)‘$ųš­vkż÷ænͱõæ`Ó^.Ņ9}ā{n’ė Zx9h[D’/Š"ūžĒx¼ųDął@ XU)ģ;RåŁ]‘a•āäŲ4Ł4u4Ļŗł†7¾ĒQ"0öÆ_‘“żčLÅc­4£cŽć˜ 䬊·¢ģī³j‚uCsh!|*æ×+ęø%b~”6&'`cŒbė™¼įÕ{WżżF «|¬ °¾R+ø;¶l2¬•ę,{fƑ µLvU­/ Ų³ ‡É…Ōxł‡ßžÖ֌U÷šØ¬+­fkĶIlŌ'%īT›Č™ŌwCõņŅP»wķ ĄµJTŽSN~ģq¬TWM„ķaÕxĢį‡K¬Ø•'‹N(yp€¢€\~ɗZīš{زpČ>`"p'·ÜõÆ%!TNG'»Qš$+eęēē9V#_ʀIA Ž’¬˜Ņ3Čüßżš€$XĆApdf9`ÅŹūžqó-ų«8 Ś@ģaö›‰ł¦Š“ÕĒźH‰iKzmjĒgw¤¢ÓK¶ČŪ wĻ›üyŪm’…–ĶFŗžŌd21¶Dŗ=7nÉ{“Ī“Öq«®1Ó]°ĒŲ1cįč[ī»Ļ–Ż1ĀŖ²·ÄÅ^yNsvw–w”3X± S¹¬X™łŗGp5ĆĆĖJ„ńį*›X«¦e®fć)#²Ń+'F׎—WV\+CõųCłņF€•>6Ōü‰‚|ĘN²ć,½įör“ÖqkŠM£>ē+kåe¾·ÄŔOĆ{W÷š~ņ Ēżš;ßĢ’y6¬¢ø%§¤4ż’ź\‚'¤Ķ*’xķuöA$Ā`}č<óód SzÕäŲĘĖ–Vƒ*°Ō—K}9,/It¬ņ+ÉÕN{¦ÄB¼ļŚUĆDkŖÅqpOŲE[Hą5缄U”üm²­™lķśĆuæ+ŗbX`Eµ““T»ŲtgP=f½āøŁĻžÕūßżö°’Tuļao㐳WUnrW–1ęįń}¤.­UҤėæjV%ĘVż}ʆkžvżuVJ­C¼0{y­ ęŲÄsē¾ōĢÕ5U ֝q`(‚~~啉˜YŽīŌ·„­9šWiŁ+cÉŽ”¢ä©é˜Yßpżµ7\ķ…’Hą‹,>  ,°~“¶²Hk b…‹U>ÖėŖ…)_ށŖ@|įĀ³ ķŖŲšU&%ōI‰óY±M\;ˆoŁ:s'Ćm»RūO²Ļ§ķWĻØCkĶ&©Ą ļr²:Ģ*ÕZĖīV¤Śg?TÖT‡Ę€)ĒńŠP ²Y#Ŗ‘5ŚĀÖ{īgŬUV^T!·ƒkŽ˜c6Ķ_žō*œan²n:@‰ÄHP(øBo{ė˜£=×y0„ĆF³“fŲŹ9jĘv‰īčū-¼ÉŲ‘‘ŖN({+ŃÕŻ¹=ąüO:²āö}¤OŽĶ<@[kp³ tÖbs–|Ń”Wskp‰OKƋL£ŗŪ€oK‰ußąą„óaęk­2÷[ūź’’”xĮ³²’*}uøż×Ó=łśDdĆM­uĀ\ %½%bŃ„•ˆøP_ČÄ@ ™äa±µwIÄD NžŲbKŃßo¹ŪŖŲBĄ9d0”õ6øŽK )$žūģēdD<ŠŹ|0y½C',C±‹ŌÉ e޽0ń=—µ'ęQģ:īĢöķ.ŃÆÆś•ŠĢšYŗ L7›óŽ *Ćļ<÷Õ2faĶ.“/\·Łhœ’‘ ŒŠ÷š˜,3Ę=ÆÄōõĻ]J ҆eOZŲ,R"įĄĮŖUĖ£HŪQŗcū®Ļź3Ā>=‘"؉5IĆ Į(†!H¤ķ50źį’¾åķūģµĻ‡>ś)×ęĆ(fÄäø³ų¾M0“HąŹŒT\Š,MiĮlX0 éx`A‚‰ „1HG€"ĮGqØ$D”RaTŸ¢ĢBĄĆŗFd HĢķöKŌ6s0Ź z@h°µ”Ŗ_p,Ī•NÉŠÅ"™Õ‰ 1Z‚!äĻ~üf§ēÜHyĀר yŽxP|é‹_tŌ”‡&ø#ƵüŒ› {ļå; ßs šÕÆ~5®y= kĢhÄvUҬµCü€‰†GG2D$C„b2÷Įƒŗ,MPÄBhPQsQs`ą5MKČ][ŖŻvß½kŲ’ųc=ꀒ}Ė­Ļʌ:Ųó¼nī‚EbE_ŗĀ"ŸQ«@+Jmä€b2l­ƒ¬l tōÅH’Öfw™ƒ4Yf"QCĘ“B-›šbcĒ8H`݆•ĀÄńģsožEKHGˆ'i¬]“É,I:ō–öhH1xŌŅ›™›eŲ5P(„†‡‡†‡‡żb‘¤Į=8"J“#ÓWÉG<ā0—Q+ų;f§·ĻĻ—kUˆ$IČ¢œ,ćZĒ€FęuÆ{żęmsšd ”Ź„[žž‹>ńÉĄAŁacL©TśīO~”Wˆ!kgdT`ĄšįPP(|įāĻ5āČH ch&ģžnlڲėõoxóSžń,Ć&ńܤćˆDĒXs”ż:H4‰Čh‚@æųÅ/Ņ•—EļR+»®„u'½āÕÆ¾ē¾"˜tØ“P¬ļ»BJֈš±”“' »žņZB|īėßXgµŖ8žkķ|³ŃĄ÷ŽAƚŠZ$‘°~¢(:ō ƒK;gę±'å®ĶBĒ9ŁGä`ÅɌPa6Ū·ns|W+C"K£“K50[›ČŅ+ŒFSi× š %`CFDlĶĒŒ1bÆ {łA0S§§§ĀÕæ¼ ¹½Ņņ4,‡Ć€µ‰ 3 $’ć}ęĮ鐤£ EgÉŲØ/鲋/±g„ HD¶śÄ=-s"ē™ģ‚¤cX0H†a|ČįGvä#Ļ}ķ’4šįĶ7üįņOņszßg?šīcßßu¹±W)VGŖ#Ćó»šõ™‡ŗVš­ŖŲ—ær„`°1&C§A89[žųĀH­?9(ļśŹŌ20—$RTrsŅ_µa§3»fc¹$ٟK!e·įe~Ż>ģ°Ć,׀@‚Äī™Ż»·n%XS.ØłśńGxīm·ŽāKÉĄÖŁŻ³Ą”Tõ! tPMfÆ"=ā€ĘĪŖ+—5e”ŻÅ‡Ū¬4Ö‰$ @l AFJƒÜŸųdį ń»ß_@°ń„}Žņ¦7Į˜Å ’“ÖU!HĒqzšÖXŁ6×s¬[?k7Šø/ĝzhĶž‚ŅĄƒĄÄL&ó²NT!É0ŲĄd?äŌk,ńĦvɼ|ĆG“YQwH^õŒį»“ŗ‡/­Ōsž0“O©ĘlYZ¢“„ÅŁ„]ä€sī[ŒP™YÜ8šAݟ2ų<B:Ł¶0ńŽós…ć8ŽćXfļmddFķŒn {šÜ. y|f˜i±"™ķ&Ąčióµ€V¦Ł¢ §byép“ö˜˜żÉɽā_GąéO:m4ƒwīŚU)°'ƒżčĮŻ e„R¹9bźą–tü·Ķ.5’D½qā±ĒĄ’‘”5Ė—[Ż ĢQ0«9Œ#øōӟžāGσlĀÕšZ‹ 4¤"Mäl ēBB†!ž|Ć ˆ•øtlŅfLĘź44 įœł¼†aÓÄ“”w½ć]`JSb®~šÕĖO;åÄWæųŒ;ļüQüļ?]ū÷ß]żėļć žšu•£ć/}ź‚Ēuų‹N9å÷žņg>ĶLŽųQ\‡ ĆJ…vĶT‡ƒƒ>ČŖ7C“¤zZś·R†&a@ŠĢ:ŁT(±Ō4KÉ1pP(†Ńq½?7=ßŲ==`bēy&’ AŹ„D—m3Bˆ8ŽIdü›ßüĘ>±FŲō}onf Ć 0­š(†ˆa@šGŠĘG±āŗžāJĮ…Įh»žü·ÆøāŠŒqšß‰{¦]Ł`zpӁē±Ö±'°tr܊ŌR’ÄĄ0[N}&’É B’”©<µW]uÕ=lVĢ®ļʆ#£Ÿ{ʙąä˜¼Ž@Æ×M7žĶ§5øIhŽtˆY˜¦ĆŪ禇 Kæą{’¼õÖē>ėŁŠ9'ĢLļ ·Ÿ¹%Ā™"VXQÆ×­•"I!„ČŌnŪ×“ä Ž#<ĻÉØzB@eĢ ŪsĒĪÉr¹tĄ¾{“ąZµh oŽüą=wžŪõü\ČŪ®ĮŠĪ’“ŽhÓ’LƒE‡øEe¹RJ¤¶VŹ„ Ēń¤fs’ÖŻ÷ÜsOFšJĻĶŲ"C“Š,¤ÜōĄĻ?óĢ›o¹µģūq#œWĘ\ņ…/Ā0 ”µfˆ$ź"$0Ö.Ų9÷õo3Ķ0Ā®ŻóB`ē®-^€bYH)—,™€MfLN%ŲÖ%Sz^z·Ģ)O~ŠÖ,Ča‚!”4Ā(6ĄEŸż\Ké–9k¬³ fL 6la˜ō¾÷½æ17fŃä䉩BKtŽ„ ×œū?؇”ŻWC cǬbØXĮuŻ4Jķ=HūÕ:ÜR^³xĮ9/‰ l€(R ø%…dżųĒ”øļĀ0'2Åš—Ö .“֞/.łĀ‘ßu»_?łŃ·lŚüØG>ņŠK/—R¤9'wüń1ą…Ų`¾Ķכ†ĄŚhF8ćŒ3l‘QJ²¼ÓÄŖZ€/šm‚)ųĪųCĖŅĢ„K죓P£³ ŅpH“ĆĶXƒf]ĶLļņ<’ūWžš¾;’“i\sf¤Ü^P¶÷æGßüŽ·l^‘ˆŪ[„nVD 19Ž#$Ę2É÷;ōg½ģ/}Ó[_ś¦7ųc®_»÷D©ķšēz×5įšŪÅJįģW¼ÄD,„Ćąž\ŠT”š“ŚIū)ēč¬Ō–2%=dBĖŪ¼[Ó>Õ,@ĪŠŲ–óč ŸwŽyĘJ€€­¤Č‘G™T¢™W¬Xqżõ×®^±‚m˜DĢØž2» mŒ24[#Āķ÷=š½_\}Ķ_oµ° °€!60ĘXkÕTȃYą“(™xłŚāށ`„#}[ų¶Ŗ"?’ÉO ę{¦Q/ 1R  b˜‡[fµŅ$­Ź‹Odė@v{®Ęło@ž“WB6Ę$Ļ…zē =ŅQΰ(¬č9©óīŁĘ‹É_HÜÆ“’y¦č³ĒĪ“9.ń²ėb²Æ“= 4v6½ō;ö@Ŗéæ$ĖÜ3iź©šŽ’S镾-&OyČyļžr•ū}Źb,]ZoŪ#¼ōąīsOhĒāŻ¢x°YqĪć.U†L;(¢'7¦[sÆÅaĪ©q¶ĮšŚ=93żŲŒc“‡KY~ŃĄkŌZEĢśŒÓŸ#X”ōżÖ®ß¹u[ßj†õ™Łėb¬s‡Xd/cŪéµXLŁA›P“©÷† °V©vžŚ7Ż}wŁóĄ#ą. ¬†öŌPuÄŲj0^tF|—MdA\–•—pó“±ŖČ%`Ģ“Ė+#Ēt87ėܬ''Ÿų(¶’-¢üęæ’ĆJ+†ŠĖ±~¤üĪ×’[—į·žūŚQ×Y5R˜Ŗ8ćՠ芢+,är¢VØ,ń±ŗä­täc£S )ŠrGlؖ7Ž8‡­ØmœŖ•ē¼š,fŻę<™Ć5iĶQ¤śįĻóąĆüč]6L•œQC„8õ”“ķG“XĶ™*h;•u±˜D1×>5=»cGµä„d„oėk łGEœƒš[ĶU樸l|ż˜X;Œ„CT–ų—4,į+&†žņĒė,ō1ŹJ0øĶ“©^g_ļyē[`„µ%¹Ä„SŽ{LŽ7į2Xd˜ŻC“–5³®łNɲI}ort„N4«śŁĻ’”Ł÷J@d݃LÖKeĀźĄŁw¤ź«–.ź³ŁYµĻ’6'U“½”Kl³E$fnI=‡šUĢq¤cÅ)ń"Š”īp ¶Ä1Ű%Ė‘Õqš”Åɗ\×^{ĪK9V–݁ˆ Ķ/maéĀ•·«”ī•ž6#§Ó‡Īø²ķøÓÖŚ«MŲh¶Æ™õ}W-6ŽV§|Ś09tĮūŽÅ:µ·µ§“!VɆįĻ~NX^ ¬SėćŽxÄ5?ž‰až›ĆŁYn÷ńV©%Æõ`ÖŪ7ßļ“oĶPaeÉYįa•õ¹²(']J|­9n;UÓ $4é5nX».C>[ :—°ł¾{SpfĖ2Ņj2[v&«p~ŪÖמsö†åĖģŹ™uģ³_$0f£YGo>÷ÕUŸB`%āA“~PrŻ’ėÖÄļ7w ‰QrÅé÷bÅ‹÷&[śt)”Ką®;īĢyzkĖźO¦³aÖź³’čˆO`Ü£Q{ÆXĘZŪg·Ō³żOĢqӚœI`bdxūÖmÉ £ć»’yKX9TYācXźaŅĆĘeć>šī·½9Æž‡ŽŪ§ö–×æÖŽ®±‚oµž|ŻļXk…}ņ?ҦŁd›™™©raL` Xę{ć¾ē£„BFvČ&SKĢĀdfš=tŚŪų5łŲ0k1ĒĢʘ™Ū®żõ~ņķĖ«„Õµ`Ÿ±Śa„ĄR` łĆU ųšo|µŹf¢1¦ĒŽŽ‡¶ŹZ±Š;9Ø āŚ.YQśŲŗ± ²”ę£u¬ā0źšB·¼^o¶@żĘ7¾žUČV3ū²‹æČ*~Óė^o‡œ/ Ś·£Ń#Œ %`ßU+^öüÓ÷‹³jŻ4j'®õeUć 3ĒĢ‘±—~źÓO€!P +ų“µ²įŲ,,ŻN‹ĆŲt³äZݶ­¶ķ=ŚXzē"Å}Uƒū™?4LlļĖÉk÷%sźÜ6—]m›`/āŗ5 ŽSŠr? ō„ǁ“ƒøŪCĶgį#šā«’]d¦¶˜ß¶©AéėC¦¬Ō“¹iæo4I|Øtc¾¾ŹĻÕöœ®ćÅŁ:-&ŃēŌģw0 ;|ČŖņł6T·xrVHK܃ Ä*Öl¢8‚ ŽęsžÉÕ ‘/‡g÷¢[o­ÕŁN?—É·–ŪŖNŁ9÷÷7K?E邳+_żźńĒG„9Ö±C·ŽyūÄÄųOæömŠ!}/(—²ś3 "Ƃ)÷*YٳŽćŲāø2§K•!ķµā“@˜ĮE:J>ÄF&#¢£ńųŽ£(*c„ĀH¹ä P \ ąŠÓĻ<£®°m¦9SWa?pēŻˆX8$ĮģÉ`ōēOēę+/ŒōĪĘÜu7ŻšŁ‹.‚ć€Aöz))h# ˆ±ß~ū1` vļ® įLOĻ]}õÕ¶ö)æųŁĻ‹A! +§–®(ŅŖ²2#Tzf¾^rhėęĶ8ųPŲö—6™īÉśĪ¦9ĆqD{ߘ`@B­1¶e¦c ™ėW 5 –R¦ÉSėž˜ŌįÓ¢]ĻŖ1 ŒfąŅK/żŪŸždĆJ&hŪ2†Į^ą[õuĮDڐ°ś„6A¶Ė—@sŅ3“fŲ{$ˆĮÖ3WŚĘ‘&hB3·mēéO?õ¦?Żą¹¾]4 1ĄĪ^Ö+`ŗ1Æ„¬7ĆÆ~õ YŸĮH(­£z7c0¤ óĻūąw¾ł ‡(RĘŹÆZ·öčǟęBąx…l +@'oĪĄ©˜˜Z:9یvģn4•b)ē#45 Į-ĆććŹ?6ĪsÄT‡†b£A‚A±ŅR3V¬X9==kᆠ™lϐFKē柳ģ¾t)Ū¾Ć~ćz®ŠcZČI×ļ~ß{›!WŹE"@ (®ļĘ*žž÷æ+H“ƒ9ģCļEDtĢŃdž6 NˆÕJ@¹T\µj˜[ūuŚa“dūö¤Įó!».\׍6=šĄƒ÷Ž,q°Ē€dÖšŁ’`ĄHɼż­ļƒ°™‘\µ~ÆćO8af~ĪńаĶcAŪvn{䑇æēżlµÖ3½}H+õä§?-“ Q*ßżŹ—.ƒ‘`FĢŠ=ļU&ļĻ„w¼ē];瑁"hz•g~¾qēæž-¬HX^ÖX"½Y™l¶ ŽČ„Zč\°6RHA"#6 WĒ÷Żņ7½ņ&G–žrĀ“ßł†·,ƹBHߝcxCAPs›C˜yI  6Tk4ęžśŌ§f›‡4²‘„”²ė(Ø$,ˆ“ŌŹ‹!5Č’¤ „+17n5ٹč®Ķ%„@RŲ¾7Z3J–\Fął¶pœqF‰n¢óŽĄuŖ„"1N8éqā‚ /`‚b£į‹2ҌŁzc’ƒøåöŪ?ū„Ė}āI’H1§«śž‚< XH©N€BL±€ŗöw$ R \¹Fų‚ēæ˜ ŲØÅ`Y-ę1Š¢F£!„mJ÷ˆ6³–µV&?(Ć0¬×ėZkŁH¢ŸS€ŻČä’Ī=±Ē{ŗVō"āu’SFė^ŌGp:œ8£ūuźœŪa< %é'RaĪcƒ{*$w6Ū»^‹I‘ŗó·©ēŽoĄĶ1¦ĶNüį“»÷p¾X]ī”÷G ŻžĻD”K=ŗåy^b6$D7­]): Ē{ŌbĪŃüĮE?$Ąā? §“÷‚łs–‹.v’ōy®ėĪĪĪfŽM™­£ÅßA°¹¢ÕCļxf=‰ !-ųHj60XhK& i ~ńó_~ęӟ€Pģ€érę³Č§Ē<āQé¦0‘1 MC"ŒķęœÓÓhŲR”30›„+§OŌ fč1łÉQ&Q+2:śĀEBj€ˆšĶx¾Ždą3~¤ģAš‘ .8’cĪļÜžŒ“æaķŹeK¦8ų øŅ†Ńö$)M x7nōŖ«Č1<:Ņbw§ Xˆ-e@#St=!lDe*ÕŹÜģlc÷“ ĄšsNö\}vė–›7mŠ„ׄ¼Ū¶XŠĪ™9æT1,Ų“,wļšŻ¹½x%ĮEI„ĪmŽN,[qńeŸŪ>³»T«ęŹ/l 5Īj—X÷N ŪŸ¾żį~ō“Łłˆˆ\WĘqü±_؛a'ė-@«-8`ŸŠö^! ä. ]~éeš|>jš(śåĻ~–03Sž¤ $ „\¾jŶŻ;µAėnøįŁĻ~öڽÖ6#EDQ-©U}ēK_žJĮuī½óßĀ@0C Ņ‚Bm„p$C2Œ°l0@ńĪķŪ„IĒ "måU8ėŠ¶Ę” āÄøFkĪXķVŅ@½1ÄųŲhęÖ¢µ^@õØĆų軎^ W¢(éčƒY;6ś’gĘɬeÉØ@–„)nFŹ—b͊ɒüū?¾$7Hˆ”ęŻĶ%Nž—–”Ėl’4ė”Qö>34¬µ Ć­˜† eK|–« ™cż‰Ö¶m“VZ…qA†Ķ ? €Ņ†āČ£śłÆ i–,“ % D:VQ3dm‡.F8;k•8N-ų“Į*Œ`™<Ė‘Ć8!Ž‚`øYoÄFb HĆõ]»—V&FæńĆļvŌ# ėL›’Õ&—N… ‚Āß’u˜ ؐ+£Į‘6^!hīžY·dņƒļyļp„DR†qlżXÖmŲ[kÕh̆…d!n‹±xoĄ“²A&@Č;ļß4µr¹ź1ę#&WĪ55KwētćŲĒ>ֆĪ$DbūŌżd™’ŁŽōF%Fq$”±„lŪ±=ćg’L–dAž_IYŖ YO9„JŪ­Ęhm”~Ķ«^„Āp@YŁÓh P”Rłæ_žl÷l]Ś`®Ń؇MĆķ($u(æ‹-ĘDĶ(M įŠo÷ė؟²ņ*Šh4Š…`÷īŻ$Įv‹a AšÉ0JxåkĻ]²dČõ=Į..į9§>‹u³ŁlĆd Ų€ŒŃ+W.æł_·• ®f#œŅš0Ų@Å h¤ó­ļ~O1fĶņP9f„šē8ģG€S“TV@0“f°ŅqŽ:źč£;„ źĶf£†Qü³«Æ‚4p‰¤ßŲĪŹß9’~ “łĄł=ō‡E@D˜#_Ās…ļˆ}÷Łūæū-É•°8īÅżkƒ©“°9øR’6͹9×ń7ģŠEŸżÄhÅńŗĖę¹0Ž5WŸŁ¾Ć¢f¬Bh†€˜Ŗ•~łćļÜs’NP Gf°ēŒčĮm­kÖQūÉ!$)°ƒ›ĮŚ“j·Ō"4ęŁ½‡“uād·V„ŃL }ˆć†O8ńq?p… ŠÕü|ż”'¼|Å 6¦X,r¦³(mlQéŒ3Ļj¾ž†!= r“k 2- ŹŽśf‰ cąI6Ś  [o¹eėŽŽ+UjƒJ©815‘zõŒČ;č¾RJĒq,Į¬a{õHt(aó‚!(֑I—ek\Aź˜“@8Ÿ„į\G”;¢ŖŸÜOß ·£8»Ÿ=2Ą«_üŸmQß}¼üÓ’Sņó¢hß!!l‹ŽB{Va²%=kv;œ !2n|Ć.U÷Ź¢‹Į\-÷Šńo3›I`Ą9•łž²ŅżÅÓģ›3­óļlĮ™L ž”`„t;€!óuŠ KĢY[Ėģ‡ßųņ—l'9iū™|LķžĖĄ'Ä.k6›}u¶3TžŁ3PN}r“ę¹¹“°å¾ ,qä(0FóéäĒŪl̜xĀqžć оóM61›ˆuųŖ—¾Ä"–9ÓŁĪŻ™Ø²2‡oX_Iėåē¾ō%¬ĀnčZńµŠA/.£®X≄¾uÅyļ|‡u­łŅEŸ*kĒ Ė‹Ų«ä<9“÷PpČŌČŚ!ē€eµ½'ż•U¬¦C÷ZćÕĄØÖŠ ¼į^Åŗ™ƒ{Ų éœŌ/›=AžŪ×;ßųŗØ–ż2Pžvżuć¤4h‘Ņ|Z·ōf5=?sŌ”Y/„‰R”L°†Ué#Ž[Š_£˜õcŽ:ŅÖ ‹ ž 8€Użŗ«īEBĶÚZiM­4"±¼\~å ŸŸ8)éÓ†ŽŹĮQ®üįw`yÉY^rJ€lßń`'œ/Æuœ@y~~ŽāīŒbi«ö,PŹ‚FŖ•ąōB‹Ģü-ūӃ÷ŻuŪ?nܶł~Va£>Ķmß¶iÓ÷Żu×]vG^>24 L ,耄#åžž·¼‘M"·8XW6›;™ §…&?‰”iFéW3š›Sõ&Ē:ƒ#&^):‡3l­l‰jx–-ĆfŻF09<9⬓V•·Ż²ņ­q=āČ(„šĶf^ń»ķźRÕS›6 –P³nĆK‡óõē~„B6’’k Ś 9Vwßz[9€'Pv1^tjÓ÷Ż›‚cݜW–1 łG_ūī‘{ļ]ŖĄdąV¤(>°jb8½ö˜9ĪX,Vø¹Ū ĀcŒšŪ½kæ½7x@PŹĄKĖ^xźÉ'²‰4«L›·ó•_µ“Š2HgöļSŸrJöĮ-ē*ę8¢§ƒD1ė<ÄžłYĻ}N‡éW÷|O—#ĶqĢ&Śøn•„«Œž8sœŲæu)®ŪóĻl½ ŲC1ė?’yyļ% <ńq'r Q¶ą«]ŸsZ ķ† +k-/z`YŁ/÷ŻżŸTœ<°~õˇĘj%ØF]A@†@n=e£{Ģ£< ä  ą¾ĄÆæ† gs3[PUk)7lōģÖmeGxHČ>`­:Šņlz›-(“„W_õspØć’ģśšŹæsVL‹Ńv~L¬Ų°iF?ūį^÷Ŗ× JĄy+ „Ié.u±Ŗ$–1é`4pŹ„°qՔLN oŸŪq#Ż””Żŗ?„ g«Ū`¢Ä*Ņ*Ņł&'¦ĢQ/.6viÉ»1%lݹF‘Ź@¬üµI—¤Ę|Ż>ėożkąĆ•rĮuX'§µvĶŖ„™%ÉfŁ–/ŸśĻ枝§Ū¤,«6ZĒā­+Ū,Ų¤ų6Fis¬śƒ+]ĀŅńņhœÄš%£lšV½¼'Fz€¢rc>jÖćLī»Ć^1[Ž{OŪ”!˜ˆxwŲ‰ķ z¶§ĖQ?cžĮZ¾½‚’Æ0fqØzĖ)s»”éżÆ1=‘ĆŻņ&;LZxOŁ%żīÉ` ļ"­€DMk̓Qń’]’¤=p։ĖćĢīY›Fu§“%qū²žedMż{€ŸN÷hw™›=L±ģ~ø{Ä%Ī&mėC;Rb3(%īiĄŪ/ģ™Ęgļļ0lh¦o?‡¶:}^–oŪvķŚ1\*9i)Örf$ą€V-łä?rĖ7ķܾĆnŅ–ˆbZ4æŽu!ošĆ{:`Z䡔ŖĮĢĆ„RX]-ŽKŒ«*…}ćˉ3p —Ÿ·”Ńļxū[æō…ϳińżZü£š33U‰uKĘ EČ'<öѬ£$“Ź?&K¶ŪĒ÷ÜžÆ_®žš1ębÄExßŪŽĀ:f~ścź%¬®¬(j@عN4³;Ŗ7ņ~ž)Ž3Éo|ż«Œ{TŖ„_żŹ„ŁLVÅŌX(Ļ"n4y³{?HĄ:»J q`ŅqŽŅ¼NĶķŚž}1kÅ&fēĶ(ŽöŚsG€õ#„ueo]QµfjEQV€Óž|r–“ H‰[©‹I|Ī[Ī%‘įȰ2¦qØĢ|SÕėŗŃą0¶)±n*&Ę”Źbi£8ŪŖsbĘÖņ2•~cT½>7µt2 Ł}`¬XRĶFņLLĖū7sENŲĖĢJÅnÖ$YWŁŌ› ėdĶ1ß’Æ;XóŽĶ[>ü÷Ėz |"X³lėä©)£#eė/zjŁ ¬Ÿ¬®Øyv•;ń1Gßš‡ßoŻ“¹97’ąż÷|żŠĖ WĖ ī˜@Y:pų{³Ŗ§©NĢĒiŌŪēŃgBĢ& <(ĆRLŗīTąŌ€c8˜UČlµ–:Sb›d&I©Š¬GĪӟö”RŃĖk÷žāē?µ„+ŃElK’f¦w­ßkm‚`ĆŚ5=Mb:öYĖ×5:ęøłž÷¼ó‘G\.8µ¢’ČĆVq…¶°ņæ‘gö9?ūéW,ŸŹ(ÄW\ś„8j2ėØfoKJSé›õ†b³ŗöśß:Ą˜+FŖą•ē¼ą÷æśå®-[ī¼ķ¶ėÆž„™+y>°²änÆ —ØHŗņ_ėU[×7üłĒ<ņˆ·½éõ×_óŪdžv© dŚéß*fżČ#š€Č:–•ŹŽ’€Öŗ•; Ŗ×k6šUüw¼Ó†g*šF C@™ąžĆ5‰žB(+·wtsJc•e8Ķ™9äƒ %™ĢāÉ RVŌ&J~ Ų{õ”ĄźÉ”Ÿ}’;w:Uö¶„4Üåń“3tŃ]yˆį8TQ3NcŻŽh÷[īH‰[Ę˹ؔév÷ÉĪJEq¦®2;³»ūĢ6ßwo­TĢź2‡|ŠĢō®l‚'Q"÷©o,Ā—»Gø›ĢfźÄfÓw{@ÅòBaxķK_Äŗ‘Õ^x¼3söEQ3V‘N’Ū®@¢‡^&k«n>ä€sX°§Õ/åxĪ:łįё²v8õ,ä}óqžCv<P°Č’·ŪT5»!‹© ,h¼Č²Ā"Ÿ×ą“ü!?Į=*,ląŖ{僽Fl÷9˜–ŠHĖŹ–Tž ¦M ¦Ä‹æļƒż»ŗ[µ‹Ōėź>r”øŻXÆÕWÉź ŁÆś—dzšō÷jū[Żņak›±=ÖŌA·ØŻéK³V¬õ ~““Öć2<P& ”€Ć÷ߗUß4{šź™MŠü%"7‰" 3G&œ€XU)Œ'õ(֝)D'Oē'?łQIČõcÅÕ5wˆĄqŚwāųq>ŗLޘOc>­ŖŒ{rĶčŠĪ9'_#o[梘 ļܹĄd9˜š½—Œ–‹?żq6±VQKÄ(÷·¼4;åŽ4›G=ņCžėK±éŽ{tb鹚"27Ó©¤‰¤ėŖ™dÆžõ’aY VśXéaCÕYźaļ%£ŸśČX·ūƞ隣fÜJ‰3ēĘXEõ†n„s;wėFƒć˜µa„mķ<³Fo34ićŃ“yKęƒ'›3ėÆķ+6%¶R«U×Ū|Ē·žåÆÉB”ź–lL¦§²rJĖ›tūƒ[ŚśGZ}ó²Ė’ōĖ_­Ø?įŲĒdÅ;G%ĀeÉėg?łiÖJža3be^pÖs$P+z`ŹÅr_Œ8N óÜQ×IDĄRß]Rp&9ā¢H`|xhŪ¦ūŲÄV@+{jŹ$ĖÆnĻgsƒA£X…WÆ,`BŠŖRń€©‰}&Fžõ¤ĒŪ‡Ō!ŠÖėĮjfŻlĢ~é’Ļ’ųGß÷=AĄP­tåæßŠąsŻuU›Q³QqŌ±2B~ü‚ >ś!6QĻe{å¹Dz)ž™Ž1?7ĆFåÅź£/F҆b½uĖę<’¬O}ņĀwæė·ŻzK’’ēė÷ĢqNŲ‰™Sæåx|øZ4ī;֟ÜJ$J$†¾S•TsÄ0°f(šš–s_ńw¼¹WJ©łVõAĒWŌ§Õ£“ŽO<į8;Ą!lᆀ™ŻÓ}šÄ]ź…qÄFs ^ #BL–‹EĄÖ­\Ö&®fXµŗ7Éł÷¾ķY’©ō Ī\;e⨩ā0l֟žäSą…g™C{ tz" Mßģ7ߌēl«kcÖįšÉńrœ„Õ`¼č<īčcX©<Žjd–t›?pVnČ.”}āwķ8>ƹc‘YŁžf•{ō'ķwøKJ÷é·!F“÷ŚŗmK)¶Ż?¹u=Ōė™kpNg·£-·@e`“¶ą=Ģb¹Å‹„™¶š”Y°—¹G%”’NJœ7µ6&µ»ļ±¹öĢĪģ›Ķf^ ø[lOē]»˜°ōc ƒoY£Ńxłš‚•’¶[™K‰mRڬ7Z*¬}‹īÅ÷!¬Šéźd­oÓżąXķ‘l¾% ›ųÅŃ·æ|Å·.»|ŻŅ©"ČG€ņ€GtšQ‡zžūž—µŌé¬#Ō¦čkīwT.[i«1lX՛%8#^0,+ūU`Ķdµ9½™9bÖ]Õ åpkv_‰£¬Ļ–ōv ’ū–恇 š“'<Žu”¶Ū;;”V1ebÖśÉĒ?Ö¦ÄKŠ“ŗęÆ,ū¬\Ī*Łö’xĶo_’гWŗėǃ5g]Qī[ ö*²dxE ÷[¹„Ud”6Ģ‘±-‚8ęVH:??ß¶4·?F ±1FućŽŒŽ,Pó€°¤čŗ"vmٲxXWĻ!Ōk/ĻĘ@ų‰ Ļ€1ĒYźĖ•å  p³ ®ÆT>ŲQ.pĄ²į}—TG |Ė[bV*”ÖĻ|ŹÉ>0ŒK,õåøD•0ę¹g>ż©ó[¶ei‰ĪY«·æż­RRÖŌJK}łÉóŽĖ*“³IŅ”{ÖéˆUVŖ5Kü“֍F#NW…p oó›čfģ'šķ†[ä ¹Žż·½„¬.N l؊µCޚ‘Ņq<ŒMĢmäŻQŠ-Łd­śtqH(VŅY‡óuÓlré°i¢Ur: ēŗs'+LšcÕ”™ÆµŠ¦wlņŸą¦”söuÜ!‡_ž‰‹XéŁ;“€U𵙯7m'$š›õ0ė±Ņ܌¹n½ūVšĆč¶›o:ēEϟ©y@ؤK‘”„ć~Ā0ƳžńtŪóŒć؜04«xzŪŽ³žń¬!WNųbÜĆRė«Į80įF„7å£@ XŠX‘J@(.ĮŽüś\#ķśr+|“…Q/„c)»ŸŠśė_¾x¬ä¬*Nł4åÓ¾KG]3uĪYĻag =8%6*Kk³2I³ŠēČbMIGEq²7éd@$MlۃźækäIL¦5˜Ś (ylĖāwŪ…²āŽEē ]GȍU{§"›Ž†Ķ±ZŁ– M‚*0YšJ@ØC‚ģ7`¼ģ—_øšcvgÉ+Ų8ó<@,{RvŠEŹfMš¶ •ÅßJIÖžyab‘I[š9ęøłāēŸYõœ2D Ts ZńÖķXʧƒSwołŌ2Jd½EZ—ääPšłO~ä-ox%sŌ搯uĢŖ7 Š\$)!MØnÜ`äjWRŖs|% * 0Aīą$‡a˜‚Ywé“1¼MāTČÖ]Į*)åæ’żļf£‘Ø­0ƒy×ĪœZņRj’,H‚B^¬,»}ōŁņ÷”%b’Y½'ā‚z9ļåE;:¤ƒ[w•I@ĄZƑ§žuś3Ī|īķ›īūöO®ŒށĖL‚ EģÜ{Ļ_nüė;ŽõĪe£#ĻyĘÓ_öā—\ū›ß~ņćd.Ɖ¢/a€wl˾m B[²›ĮÕ?ł‘]ń% ÷~šĆ~uĢŹŗĮ ž5XĆŹ,9é Ž“z›@0ó¹OŚ;iEÌ»ļ¾ŪŠ‹XɊTŪa—ŖĢp⊜ShæżŠ€•Š ‚@)µsēüŠeĖĮ6 «SXm’``×ō$CĻó…3×ĶĒ $W&g&šŹgĀ›V:%Õ[2Ęŗµg«vuh謟ü¤X(,ŸšbĄó¤ yŽ_’ö——ŸūŖē>åÉg<ó™æųɕ€biŒ@!šÉ 7p¼‚gµq§wīŠēĪm7Žō¶7¼é§zą†õūļŠ„_ŗ|ēĪicOƑP į~S+ DĢżčGn¾łļ—_~9hĪ×+Ċ%Œ@LJI®Œł»ßœ'³52~QøĶĒMM˜Ž³:šQ”¢\“Z0 aÅ}^ūś×OĻĶ‚ × Ś*+3“°5V†Ō*ÕY}6ėUݦĘ)’ų'ĪĶ+„¢¹ „ĀĢüģ?ļŚ“{fˆ ŲŚOS?™f€ŁŖp9Ę`¾ŽĢę‘“>¦”¬HDЉ“I4@beHé:Ā‘H68 CLbŪŽ ©ģcēŽ#JaÅĄŪ¼)å|½i’¤”©™n·h«įÜ/Əbēb6³R=mXUķné L…@‚„#DÅu/½ģ2;vīžm4 ˆ£Čµ{e¢; Ļ“ÅRajŁŹ×¾ńugæś•€ «ŽŽĒ²”}GNĢ© X'r,Ģp¤cˆ™“x`ĖV€`ą;.i†2„!Ó É[g$¶»Ž0ó‘ Į Ŋ@CCÜšē?„ŗš™ENA‡ŪDć³ Ą$væ Āż›°ņ’Š ;Š‚’9Cfł©*£ڬI`Wyģŗa6™mœIڕ¾įźß” “¾æ~“V¶?pW fę&ėĘŪßōډJ0Y.&¦\±¼čՀa`Ī™Ļ9­CāčQ‡f™oe!W¹ņŌSžČi¶zżJ¤-æß¤S}Éē?ć“ÕĀXÉs 'ĀģÖœb’,.8%ÉéTž'±ēĶsĆŅćdžc6q6x5+AX^ūŒ÷ VłŲg²2ęāu/IŅ’1‹ć„t”ĀZpč6óŚ“ÜŪ-r“cņē»Ž}ÉķŸn”.Ć l—\Ÿ¤ÓZ’‚“qč¾׌_rĮO{ģc×.Yš‰'QīĖž°Pó| \/‚,6Ū­?wŃ'XGyf‚ųmČGéjœŠC^zÖój®,Ćkj•I—ŖĄ„ļ – ĆR8@„ąŻvóMlbŪa¶rkmŽ©9¢]~¹°}‰8T¹.GÄ*|’{ßQō…]?­“Õöm›™ćnühßf^ŗĀ7›Ķ ø š¼˜rõĆ)Ņ÷KF?ö<ķüNdÆī!вśįēāØ>»sŪžkVŌ€)W,÷©r” TŖ2Į2¬œšd7³F‡ų‡ÜśĪ߇ķŪ·"'F@¹Thķ8Z%‚[rM&6¬µ ŁÄĢ›P7ēöŪ°Öś3ŪķŃĪ8ż9FǽÄJZŗż:“ö×u“PR‰¼öV Ļ6lĪ%T‡ĪÆīī®ÉF~*dÕroķ¹ŖP_ŽrČŽøf›lR؈¬nƒįdK_ĒĆĢėriŻ#ś/+™N/å ØÜO‰€sŹPJó 9Ö–׬N䊱Z\Ÿ±ŠżÅĘ“¦£oÖŪ¹}˜>ØõhĒ/ ư{Œ%ĆNu>Ü6pe£›ś\#/o‘md¶ĻŸEæBhūd3čl`Įō…Gµ"UŻcƒćTĪ6ć`ē Ģłs³u w:ū~ķŁf³Ł5&ŪĘm?ÄDÖ¹ķ Öh9ī>¼Å0uä¶§BÓ"1ŲįƒzFŃņ‹ž'¶˜ “;łŹŸ?ß#²ņ÷•‡HeĻ)›Z6ŻĶ8lIʧڱÄ)ß84SJŁå£ēÜLœ6ĘĢĪĪfėĀĆĖsDĆ0 źó³›øo~z7«ųs}āä“N9 ‡ąĒ „°*2)\`j|ųčö}Ū«^ž•/|1š›K¹¦–#šą'3rĘ#²·(l4µb6üš³Ļ)Ę%–x¢¼žÕÆNC‡\Ÿˆ`õxukķæē_’ō0T $pÕĻÖJ­µÉ߇lt„sØUTŸ’Åæ·¤ā:“XК‘Ņįū¬Oįv̚#61Ē÷ŽųĒēŸr’,_R^Zv¦\gŸŚŠśRyÄ”2°ĻŅ©³Ny†i¶)F>œ]¹sK'sV©Łoļ P!²ˆŠ×žs6ėVX“š$r{TWzùÆ*S%oÜ£’€/ÄgéŌ:NįśŠįhĮŸ*—VW‹Uąƒļ~+›˜U ?;]õS.q1!1YšŖĄ«Ŗž„ē}Śi<½“ć&kÅFÆØÕF§āŠØĄOėH±nź0/ū4xmQ*b£ærŁ%6Įö‚CįÆ|+ĖķWй©t µT™BxŪÓQĢ`/‰u.XŌaEŃŁw“tȲ”U¬+—_|’»¼ œCg¼ÕXt„8mŗ#9-֎”ø'G½'„>Žćü”łēm·$ęI@ „“ _„-ĢĢAŌś1YšˆČ%ᓬÆ þē%O8@±ąRjU œļėkžą{gwoc³ S\q×TŅFĒ*“2‹Œ¶hü_x¾ø¦F+¾€G@ŃżÓź3»Ųh… c<YŌ\īVtR•Ų"Ó _ĒqŌd>ż)O)I RöųƒļŁ#glĄÅĻ÷ž`¶Å³xĻå*Lzū d ČĄŚ–·Ø’iӀ0>åI'P&”€aĻ©łŽHą”'žxõU?gŽ£°‘”ŹzžpöĆf³©”bÖ®#ģh·ŖÅ®#F“i'dåĀßš› ͳ‰W MA…Ø€‰ «WsNś(œ6~J’ēųŒg<#›˜ų÷?oaė°™'Ö.&rhÉI®äÆ«½h›!c“%Č“įZ3™ƒł@~‰Ė§Ķŗ„,m%WĀF”ƒMƒ3M;[ČJėY¦ ’PJE‘Xž;öH²TŖGR¤4'R# Įē;ßųŗT% ¹²DŲr×¶H:8GźALÓÜģö#čžÉa®¾ œ˜V ŅVõ0=Ō Å»wNgC"Ćr·v4ŻÉd^ŌžŲKÖØ÷z’>©Ö³3ÜɊ7ƒ©vƒŠyŒżbRāŽ¤ »Zj”6śæ: ž‹‘CŪ£ŗē«®”ļöėSvkŖ÷’ŃYlŖÜ5>M¾™Ÿ;łZó€”øå{@?²åVżß©Ćż?N‰{¦y©ŖžTųīæŹ¾épB²a%ļ”ć”ķWŪć?Ģd¦ļÜČŚÅYN×¹¾ė7WżČžsņć—xĪ(Ń ‡Ņā;b¤PöŅ X ,ö½ćŽ|Äß’ų§MwܹmĖVū¤ęēē3M,Õ 9'Ōd?ż”N €qFŌ\Éa8€0x„Äa"Ź252äeß $\Ā}wŻ™pŠśńrE űāųĄżö €`yŃ[Rń Ą›^łrŽu;{É&6”å&Dw‡­÷¾÷š0ģ9“Ą —†„XR,L•‚jļŽ9Īc:(j–…qe‚üīWæ“R<)[ąČØ­­Ķø=Āk©eĖ(Ą– •׎r3¶WjÕ"äęšåÜ%żÕµō³^q闬„°Ŗģ­,9ėGJkGĖpēæžiŌ ½ńsĘōé÷š¶ž ēÜJņ67Ó¹?i­£(źp°čXŁķM ĆP™0ÖĶĒtœ<‚µCs—P-¬š}`‰Ł ååZNNŅ Ą°ļ.`…^TŪ藍õÜSNŗćob±ŽLԈs‚õ6ĘNGĄčnæćÆ|¹ yŽõ*o|õ+9K?Œb£2øJė) Ņ8M†MĒ™AŃ±Vs\ŸŸ6ŗłžwæ-Ļę]ŒœD÷7}¦=P¦y˜T®žø¤Įü®,ėxhÖ ų)ćøvÉn¢5›ųļ×’įˆ}7®¶”g?ć©ĒóØ]ł=6QK¼O’s1)ń€%Ō(ݘO¼Ź,£xtdČJ4uŌĶó¹JFƒ™ķ¾äłgŗ@ąmKąq'ŸƒMu÷ŽzW+oŒ™™™aĆÉé‘X½|Y©Čéƒ ö›ė›k6Š£fl³Š$ŠĶ—r]å8›üØHŪÄŲ–™:Źy:½ņc8ŠTkn÷ćÉ»u Ā<Ģ”ø/’V÷Ÿ€v×Ί$†?łŃ@ (eAó»whÕģ4]v,_¶:09Å{ݧejs¬¼~qŻŁ§ķ¼W9 Ȏ/»šZał\?Łäõe{ļtŻė‰ī„‰eŚžW[’Ó^żĢ‹<ö¶åHm)qĀj׃zƒ=×ÕīŪ5 =^šēż¬ŖrĘŪQå\ “v^Ū·oĻŖķł¢óāÕ¼öØ;/ī§ś)­Gœévŗ{ōÆš>äl+M‰{ և˜kóš·ŲĆøŸtWޟXw†ań†ś~ ś³u|t€äa^uwĪßń_+}čęÖ{īe„9¶­}įG/pI$ų+I€.xՒÕ¶š™«'—¼ā…/Śžą–¶%Ģ$ī©)t™łW?żqØK ¢šžœ:“¾łõo8ĄP)°.‘Gv(›¬_gø‡bJ¢ˆk‹WšÕ®ü®”€1Ė ī¤ė>īčGYŻ&fn°™c1ėęüö]ŽżŲCö];Z^^)NųΤK“ū ­œ"PscVF5ĆVQjė<ŻĆ²CGkżĢg<ͧtZ’䟞ąy“ŖÕń¤ą’X³iK‰ßłę7Ū‡>źażXeUÕ?ći§prN*,é~ļŪßé%šZi*pJĄwü§„ZͬT°ftØLł4é`¹ƒ)Ā~#Õå¾³¦\Ųk¤:L8*>š›«~i‘Ŗ³Ósm§Ž‘źV"am>uĮĒ%P$Q$ŒūĪø'^½&žŽĶ±6¹*FG…SkŻ%–ʆ¹Žķź÷Šē½`Ģq–œDCn¤ū­[Ć:ģGŻī“G m{yŖDĶ-8tĪZI%AO~éĻBs%ČaūÕĢõźZђčŽŪn=ē9ĻyõóŸo l-Ć.ą@ @ X^(Yį܄Ś.€L¾šéO¼ū-Æ{ąĪŪžž—?Dį¼ÉYøØ(f3Ø4Ö¾A¦ķ²¤1„Āł9ÖŃyļ{÷Žļg~’[_;ė9§†õiÖķčžÅL„^t†ŽeÄ*ŁfČõnį“…ĪæķV÷ ˜zf§Żõģ’`źŪßžö¦M›7K÷h­Ž#ÉÖb€6ēI„»F‡Ģńm7ßōŌ'=įž»ļLė)Ś®ź”UŅ ™Ś%ź–ų¹Ņ?łń•˦– UßöÖ7’ćļK|•M’¾VŖAŲ‘U]|Égóøå–䓳ŽbnæX"KČć0ŠĆčŠĖæ|Ō#EĄ§?ń1ÖQ¦«l”īt¾¬cŒiu}Ū*›' óżT‹Mgī‘­`-“m.£³Ö£ŻtīNšĶż:ÖÉSż‡é.Ӛ€*ßōVŻęy½Isن¢Ķ‹O?cŲõ‹@ẋg²|UŪ²ōn…äA]ā.ؑQb±ƒDę»7 ¾z즣}Ś!EÖ30N’óÜCģį镔“¶X“Ž<_·u¼{¤ŠŗsKmåĘ)±é—ٶj7Ż)ń‚™[OQ«^¶R’ķ@…tK» ŽŽé©Ćœwg|˜ĆŽ“³™»׫ž?ĻXE 'ŻDTēeŒ:”©{Jö›v%‹>*#éČyYŹ“ŖŚ‹S€~:^"ÕēÉŸ’\ūs­µ”ŅžŪż˜å٧ó"(é:@~lŽÄ>ļL4(OöBdźD©ƒ@ą’¹7 ³m«ŹƒĒs­½wUsī¹÷^鹓ŅÄ^ąSA±E±Ć.‰Fcl¾˜OјhbŌc FĄ±A”^.—^Eśn{Ī©SU{Æ5Ēų~Œ9ēšs®¹Ö^{WL=ē¹OŻŖ]{Æ5×lĘļ;Ž×€@‹ˆüžw¾ėĶo¼įæó»ÆyĶkŒ17Ÿ[²]+°³S7G ,źŁļ|ē—½üågΜٹüršļI `™ą™Ļųś—üٟ“ūpn ·Ÿ;·8sF›ūĆÆyŠŃÜųęozśsŸū<Ø+\µbßłĻ{ŻKÅ0āqHF’ݰ4¶Ŗq‡ź½šj$<\5‡æõŪæż•ßšµĀĘPō±¼BX}Žē}Ž 7¼ ę3‚3óŁÅƒ•­ź‹m{Ļ{Žūąąą9æż>ēó>…¹e[UUr_Ł)IhÄ3Į-­čqæēŻ’xæėļS«¾ˆ|ęƒü†7搄hp×zuaUjD`ūĶßšµ/ś“?häģīŒ™ø½ł`¦Ö”D‹ĄĀFˆ¾č >÷5Æžė«węʘ[÷€w¼óŻ÷¼žŽ–€*i-U‡nß©ē×ßķēĪƒ9œ;æ<…PU؈Ģē3X­šŖ¹9\Z8sźŌMūūæžģgĆ7Ójɳ٠€@DP@üŽk¼9€ĆĆ£ŻŻEøŚŸüÉ’©ŸųÉ‚ųŒė®łšĒ?ł+æņ?¾žŪž 59$/ÓÅī1£Ž©¾±SŌ‚å²™×ęĀM7ß’wÆŖźöżó–AESīt§k_’Ę7_uķ5Ģ$žfģ§#„+"īŹ„éęIų!mŻŌ”XÜĮ+i‰ØW÷·Ö‡;ó™“cvJ'ä¤u[s„MƇ«ÕŖ® "¾ó]w’ūŽ’ļ’Ą«’ņ„ŸüąGDä—ł—ļ~÷»/ Üų¶·-,C põågļzŻļr—»œ:uźŁĻ{Š P€°mŪ Ī]~örD*]”mۚŗ*n­ńtu;ąŖYĶź°“„¤Z:Ģ֐¶m«Ŗb‹Fēg“ˆĀcķļ̈خf6u.s¾ovH"3öżŠĘ®AZ•żČN„Xi)»ņ­Jf~Ė[ŽņYŸõYś·:t#/ĪN“āf’meć§sņĪę}˜ŚŻįt¤€˜Ń« Ŗœ!…muśąÄ&‘aÆP šÕrédZ˜Ń8”žŪo»mV/vwwE£…ļöaĀ8 6@!n_ņ'ņ’š/|į Ÿū;æsŻļģ–499·µŪµ{ø‹<:<\ģģčÆŽü¦7żųOüŪ_üÅ_ {Žė^ŗw-WM]×éäXž­ū8v[fÓu[h1±x–uBFa#KtÜžŸ†ĶŖ5Ɣ۾ü_0C°ŃļĄĖÄ%GÖjµšļĢśĒåFrM$ÉØ·b­E"ŅĮ QļĄūsŪ¶UE pŁlnˆØiŚ%ĄQ»d$"Šīrl©Š y‘”8ŲéX$}i¼ĮÖÉ™ŚżńŃŃŃb±(ß²kmU¶B„ćń|²pJ;gPĪėV„uÆŌOqĀiŁĮ ,"ˆ“P"¢ŗ®€ ^•äß+•• ŗOA/éŖ; ĘĆVĘv¹lŖŠśēŌ”-.¼g’‡‡ėf@Pcf“}C7’ńy'›Źćŧ<ÅÄgŹ›„« ļŠ4M]×ŝ­Ÿ"eūv<˜¹2Ä[A$ن”ģ3ī J·WĢu{›”} ė%‡ĒQ8Ł7­OŒTˆŪUs|"ūÄ*u蠋“žģ›¬4‚ĀmGlč!č|śĢ恝ĮRÄYU:…”īMš¦9w<ģį~ĖÆ’‰ū#g÷WžŁU§–ZńĆÅLmŽ~ĆD½Ž“{Óńīv§kwīzvē ;ŸóČGnPÅwµźVÄJŪ<ዿȑ0½‚Č߼ꕱĆäš1i;%/i—wæīšÓg ÆŁY\Q™€Žķ­Ś=yµ%aq½Žvu“īw~÷·a§†ėĪī\Np ąTE  9šš;¾õŪr‡ŃN¹ .Öüznüžæ’‡Ź·wÖ}Ą¤m‹N¤&oTY©¤äüžæ}ēą2„+ Ü÷ŗ;Üå²SŅ6Ż}EkbåßżŪ«ī8«ļvjļ gˆ~÷¹ĻYI»ņF_Gbµ;t’¶›®»ź¬n.»wXĢOœF¼¦‚«®˜›ÓWÖÕe5Į?¾ėīł5ZŚ §7w’0GŁų»æ}[płĪģŒĮkg³ėęókęs9ŲYu$ĆŲCŲõŗ»ĪF K¢bük^ņāÓ×ŗĖĪāŹšęWī-ę’õēVåm¤äR› !}¶›ķQ ¹£F§R7lRšZLŖĪ}3•°W¬V+…."įēĖK–¦•#–••„•åŃņĀ[Žų:nŽ.ŽŽ{ĒŪoüŲ‡ßwńü-7Żü±@¼÷ūŽ«ĀVģŽ«QĪ[gį±”A1–VŲJ‚ĻŲ¶YŠ] 7Gn—v)Ķ‘]“G„]©@E’Xd¼4čE‘ķłMÓ0w»ńP>ƟSy2żšä#xizˆ¦4\laP<ÕĒø‡8væH©¹±¢G`…ć9g£dH3µ Ą7¾į-yų£~üß’ōmūo¾ķÖ’¬’ļ;¾įkĻTxÅŽĀĀųџ’@S1- ­˜įO’ĘŚĄįįr>Æ`6›e ÷ČćÖZģņąš£üŠb>’«—¾Ģų^ž²—ž³Ē>V, VżbOV-&"1`ŃŻ5˜ź}ū˜ģĶŽXģrÅ­­ßż÷}ćSŸjZ lĄ"[d#P ÕõžźÆ»|Ńļæąģ™Ėvww¹e¶-ȳó7 žĄ÷’ßæė]؆F’P'Ō£Ą—®ĒĢ[« ZėBĄ{Žē>§OŸj˜µņõя~„mõ]p¤¤7Š9Ū µ•ń(ę=ļæ{Żżn+6ÕM·Ÿ»éÜžcńŁJš]…į“7}BŽVMkWBĖü÷üH=gŖÕĪ„a.“Øø­Ä..»ā£7Ż&ēnżÖÆzŹ įÖåŅģķV©/ Ų•%ŪŚö¼ĄOżŌOÜėśė”µĄ 06–ż–Ōl`gg€ĢŅ>ą÷æž>÷¼pøbƒÕŖmŪ¦]^wåżĄū_żņ—Æ'q•{Ó®¬:{#:G`–võßīg¾śÉ_¾g 2b— ļ-fū‡G—]~ś{æļū*k3cȍ DŠŹ1'xˆˆz¢õ|€;ՇŽLP"ŒVߍ1Š˜5¶FQEŒ$!{øš×»Ÿł ‡"ÖóÓÕüŌżųŠėīt÷ŻSW\uå5Āl€„]Żūnw­@H 2W`+c ±pÅ%ŲĢ’§E&"܃D,[ASĶ€ ³ĢO¶B†fsSļĶbk1O{>ŹėņļI™ĮZ›rČUÖ²zõ?ØŪĶŗ'…ˆÉĀ2żJ|wŅe{²gbŻ$—=¼oh@p|Ų­p®1ƒīĢÉü%°L … ,‚TF˜QĆ,ķžf‚ī( w4eÜśq‹ˆdŲ‹BčzŹc“] ,[ķŽŠGd±-Š%¤½EŠ"Ya ń śxż£Ō^'Ō.gĀÅāō½īyßG<üQ “#z&CĮ ‹]9ń/‰R(oȚ%5}‰L¤:[øpüAoūęVÉkÜZ±ŽöNÉAź—„ģÕ¬ qŌ¦‹„²-‘ōõßā¶2“Č÷øÓó9°-Ÿüä'‡‹4H°īj·%{;}# OS‘BܲZ5įāW«ČąiBŠŖć%sF0B²‡CÓ“‡‡GĖež<¢’ŲUČ`]×Hž¤hĮZU\ēI~ņ­b/ذœڶUCƶ±mk½!kęrŁ;©¶Īx¤ŗÖo©ø_z»µÜ¾n|CŽ?(ՉG¶IĘxiųm &­„،ä)1ći„śŚ÷—Ķ>ŗš)Į…K‚k¢>Źx«A0†ˆÄ…RŽdē½NׂÕ#&Lį«xkģžśd0PæĒ‚å[™źŠ¬Võ|Ӏyś51C ž,½ģ>É-»Œ@µ DåpdĘ䷉L-¢(d¾kĝģ“p¢+ēŽz=d?·0„č[VQ³C“ŠX0rĆĖ_ńÄĒ}Y]ÓjńtQų’ģϾąKæT@<­ącļ{Ļ=ļyļ`wa.Łzgē– āaŽ„łņ3—ķ_ś“§=ķMozÓįQK׎įŖ[n¹¹±Š<ųĮ÷Ė[ß ¢vaĄĀĪ?™Yū|ŗŽI/ĪXŲĄīb×6ķ. "V5¬¬ŲŻŁżĄ‡?“węJpV¢Ņ¶m]ÕĶjUÕ3D]*Žp( ¼lžßü‰µg3Ó“¶iąHą²Ė/»źWæę†×ķ>ƒ8LÖ`y”ŅƒČ‰xŌŌ#N;Ś{šJźØćĄœŠ«ņ}U pŖ—ĢPDó€(Ü"©„o8ź:阔±ķlV‰®‘č^¬ŲŌNS²c"¾¶–ŒŃšyƒˆ*O…rk„#&¦ĻÕ\«ˆśß"¹źC”9e€i' “-Łü™™4l &–˜7>„ńt‘D°ĪL“‡pJöϵŒh’ļŠŠYjC–Œī˜\|éOڶÕü?;(7 •¦ģ?QEĮU?iLn0*nę!—vŌ‰•‚”’™š'EÄĻJżøč~žĪŠ@’ Ó|ēQ²`dw.}Ž/B~Vā™Œž­µB@hšF#“ Øģā>Ƨ%ŁOįąąhwg“]“–”8ķvĄ˜ ÓE„‘AČ`ŸÉV¬µu]i[Vø¶åŖ"M|ܕNė>Ū”źž·r…“‚Yęf‡Il-ßõšėn»łć¢-ł½?zįćŸüåaČĘūļ’kčŚ &÷vuˆ¹čģćÖ¶\ŹŁģĆóvpµFŸ" b Š€Æ’RßõtļRī[˜IĄq=å8s÷Ķ7É»Ā¼+ē MÓÖuuńā‘ˆĢf³ŗ6MÓĢuo+pu„č„ŸŚMه‹Å¢t˟#€Œ`o!ĖŁé³=ĆŽōŽĆ9īZK™.¹‹Opā‰ŠĆR¬Q"õā„°#Åū–_Ė£•νz^ V#w“ö°č'ø Ķ€¼ŗnĄØé’õŸ“īŽĢJ7—Äó}ĖypŸ×K²V˜“ŹQxäĢppp4Ęöį»ųa‡.,-!‡?h»«qJōXƒ'@ĄŚŌÉk¦U1ĆŃÕOÓŚOśŒ ѐˆÉ,ŚóH Čą u® +Ż£•Ź'ЈųźWæ ”®nxé+Ÿņä§ ģ <ł+æŹøĢS€Ł6w¼ū=öØGÜvdOķīkīß’$4 °Åä®YIJB1Ąņ†×¾īŽwøfÖµ“Ģ×]w‡W½ęƱ2aC×|ü „Rb³lA,–J’–Eü¾õßR#œß_ R °9ńāæłžļ®4qCœ‰ ‰Ų `%HƾįovNļ*[/8^WšGxÓ-7‡O AŒ{ ”?½Łå:D~ą‡~Ų"²q…¦÷æļ}ß÷ßķ›etŖFkŗ Źč¢_`ŒA2Hšŗ\d€Y]üďü…¦fēĶĆņų/yÜ?ęwœkįcēö-Ž~$ŸżĻ>DŖp³Øćźś@+}—«®»Ó+^óŚŪ.īŸ;8÷Ł»ž^w»Ć®»āĶ7ü5Żž–·¾…Ć ‘›/!Įؘą„`Ō—P T’ē_ų8i‘VvgVĻ©Žß?øņņ«žžUOłoæšó€ (T! T³ ^żŠW¼ķuÆ;’‘¾ńe/’ŽÆłŚŽć×\qöļßżĀ«ÓgOY©°€½½SĻūƒ?E§ēėĖ@@,T¦"Źvєো]āSæiW6ĘZƒRR”tå‹B=«DxļŌāŌék˜Ķź>5Ąį ®ĖWęĻ«~āOƒ!¤7†…= ø{Žžk$ŠōˆōI­…”ćĀM¼L“в” +ÖÆårŽDæĻVV`=Į”ō¾ųÜ㳩˜#bŲp’x‰|MĶ­Xė6ak`6«øžUŁĪPģX^ ‡ĆĀóŗa¹lV«VWŹĮĮˆ7¶ī«ēOe±Ē=''Ö0ś‚xTß\™u«‘wč7拎¢–Z±m'—ŌK­ķ3ü”^ā)$xkmĮ±:‘Ŗ·Ā®ÕĶ5 qäį&VĮض"ßš•O9p’kÆżüĻüĢ+3mė­½[)<žń_¢‡±Ūę†×æVSGDøė]Æ9»c~ąŸ?“eå’ŁL=˜[ūOžrĢó0~ŌƄW™m„>½ø”mŪ` ? ‚nUæōū’ÅwĻ ŌņĄåu½8¼p^lėŸgz¼śēļ{ļ?žļ_’ՙÆxjA$^Wæ÷{æ××5Ż¢ÓĆułē`p˜Üłņ«?ńŽŹĮ2ŒłÄʏqÅæ¶u:äæ÷¼ējóö¢25ĄéłüTEßż-Ļp>É<“bķ ž’Ūg÷æö?žŪ W‡ĀĶľ˜HhņPųČķ ÆŅ^»mŗ%ū~wĶźčmo}3!ĢĪ]p9āD;Ģ*€{ßłź/’ÜĻžŻ’õßæō1ĀgÖMļ{Ē]ĪĪ?ćl}ąN ¼ūnuļ=äŹÓw@øŚągœ®ÆŻ£+w±Ø„icmŌQ‚M”Į°-– lŪöččh¤—‰yl_  ¾WĶ}Ź:·žžÜ^?Õ¬SĀÅhwŠįÅ£¾eTܕ”Jq&Š©«£F֙:8ū+Ī›«c;½É͇b­­2—l•„éļö¹)§©£.ŽCŸ^Šnķg½ŸwÖ;žæ›ŗVŒX¶,ĶچU—abP1¤ä‹©Ž_g®>=śę±sxŅQŁÓ5˜.…ūā¦]‘Ŗ-ļ\ā}Ó©Ä­¹Ö5Į&­æ™ūQ©æ“·Ęæ-Å™8„g®rż9ĢA`±NÅ#7ę±¹OrbŽc˃f‡Żąƒ?–µySb·B9Õz˜ģ턟øZ9įƒē?’¹ˆp×½ÓWyhTŽ–Ņv[ņ‡ą ’¼EćØć™ŹrÜ¢ÜżkœėR®+ī}čĀĶEž{ZŁ›5xGS„Ōhāj5—ŚŅ$P…eyøJéŪXśaSq‡M_æ‘ćQn¢1-ÉŚX•`xÓ^J2źŲ·ŻÉØGƒ¤&,cļ™ ś¬Ž–b#”ų“Pœ.юŃ4u°^:…^•§žÕcŻ¦”)Ibóȋ•‡Ó£(t$ @fŠ_©~š~DĄŠcyZÅĻ9_<äT$¶De””tŸėšŻA¢‹ćkł;a"²,ī‚+čų@HH­]Õ¦śųūß’‡<„źźę[no € ¶Ąž¢½†™— Ļ{īoõ×|ˆpEčž•čŲĄū„_üĮõoę;uu¾ią3®øā–[oż²§=õ oxĆæż’½čE/złĖ_>›Ķn½ķ¶@ĢŁY,–Ė„ŁŁY¼żķoæŪŻīĘ:šeL6Ė相įmV­–™9*Å)œPģruĶ5wŲ? µųE]­šö§~ę?žėś!@·dJ+łGDˆÜ=īÜŻļ~÷óēĻk™ßS5P@“¬ė¦n7Ÿń›ŻÄśüĒ>öUÆ}+“3ĢŽłŸ’ķ—žńŒg,®ø,¦ŽÆå4źŖ.Jž23"ћo¼į‘zt 䢙ÕtŪ…żŁl&h:łSU,÷üĄ@æ”É)N9Ö{ŸHį£f?oAąÅōĒOyźS ·² @gĻž>888{ø„ĄUWķ}ģę‹{‹jo¾°G+V'©j&"»U»\ņłĘuü=čxóŪßrėĶ7_q‡kĀddČM7±>‹Ļ5Ę÷T"Ū¶Ļ磽⽦&Ī7%Ū2"RåvļĆĆĆŻŻŻ°ĻÄÄ­˜dėHJvthŻõ°·W[Ļz ż]¦ †p¼ŅĄ""“+KDh ģüńF4¼P•sŲ#bźD&U`:güV«Õj1[Ä䮎„ %¾c–L:4S­˜²īN®B#Mį|É)åøńDĶFlD’żD ,ł·¾å-zЃLUq:ĀÆ-ĢŽ˜ś˜=ÜģŌīÓ׋Üu÷ŪѹEńńćpGv<ĢāQ®Ļ‚­ķ&ū†×¾~€€ Čcū9/Õ+ŻÖ¶į0ō¹Cx"[µš·¶÷|ĆNÄūżP–ŽY꧈£ūļ0…KŠˆ‹…é!c—f*nł„ˆŠą[ƒ®MŒn¼mŽ?21K¢“żˆµo;Öś“mx34įc¢kvOĻ$ވm¶Ó½:’Ł$®ÉŃQą6’)O>)źŌ¬§cv÷#¹b|£;ĢbLNJ‰ĆŸ/—Ėł|žÅ©…Ķ‹{‹6Tä\5=–1 «¶mÖ‚g’ėČĶŖ!o'ˆm§Ä&H•а XūÖWžõ’?vē;ßł%/ł "z’¹ŪjS“•Zma]!ĄUgv’ųĒßńnŸńŸ~öæXĀJOōgæ0ƒČ×<õ©ų'/€= ¹bhŽĢŲĀ*6n kA#"X,foxĆųĄś6ĘL¶!föĒĆEŚ_ˆĪbĒĪĀõˆ‡½õMoÆNŚ»xń"">ąĮ}ż7ŗ”+Q«ŌÄÅGĮ/łó?ż‡ų‡ų×?H­ø.”?ų3o|ƛŒ1‚0Åéd,%FDņ=ł~Ō£nøń Žī€wøźŸ¼łS~Ō£’śuƍŁ;Ł|= k±X0’®„sńüķgĻ^UeŚÖ*ķž‘ų¬×¼žeŪĘŒė hl[™j<ĘīoaŖąWĶēY^€ĆłmæŸ3<ś‘ Ēõü#żŚ’ųļßó/ž…ĢźźŠ¶ °³SŪ£f·ŖW«¦Fœ ^6g"¼åPhfV{ÜaēcŸ:<@X Ø?ŁG>śńkƽVi† ŚźcBĻĻvZ’Å0hč­āl¤’·āÓ¤¤‹©—#Ł–‰H0Æńes¦/æŃŸrżx.I‰;›„(%vkŁķ!¾;ītŹ %)įM7`Ŗp¼AČķ i2^Ƌ¢RÖó‰XžŪÖZƒf¬?¼’ S$ļHs½‚ŅK¹óv8WzģM!‰āĶmSāpćf0`pUąüÕumĀ6…Æ£”ĶPĮ(› ÄÅŚÉ»YŗQ’ˆr~Œ ŽDy¾ķļ7Vq2„…>@L|Ž:C—ŅHŅh—Ģ“$ՉTT|ē¼0#RȄõ¹¶įBļwoĻńS‘Y{j=CÖoŁžĪ§ŻFa Å£Śß‚F3ÉŽTІ«œ 0pŸZ™7²ŗĪ¦ļūžļžÕ_łŸįiüĪsŸ÷_’5ŗWMń×g°moYjGņĪ̐:NĶ J)± ?&§Äƒ³EÖmŃėW«„¶ ėR Õ%ēhčŹrpp°»»»ææśōéqćU˜¦>5}üasϤ‘ļ¤2¦)!Ēqšöūj&Yc°«āIT„ g٦ŸÉŸüä'O:µ{joµZĶēósēĪ9sfœŗæÉŠ%Ķē8Ō#“Į[K·K žĢcŖCōo;Öų+ˆ[ŽĆkV«•.¶ńÉ!²¦£ …£fwŗöŗĆ†6\ģÆć9K8”ŠDˆ&`-0«hå·¼łĶ7Żt<į‰OTµŪĮŌsŽĒFƍ®æÓµyĢc~ķłĻ%¬W­­«Ś"īJ *žóŠĻzŪŪŽvŒµ…ŁĪ¹ÕĪĢØiZķcbŸ?ą÷ż—ßūƾõ™Ļō3®źī„pm=5ÉC8 GāķT9wŪ­w½ė]/^\éĻĪžŻ{ńK^śš‡?€£Ź³uĪihł*ČRP“ņ|JĢ & ŠÖēü’FئLHĮčeV˜‚ŚGłÕŃd@CC/‰ēNøńŌ‡¶“ēd*a1}ДȢ„”¦Oż”–ϲB! ó柹%/łĖg ×]{Ż?ńńĻ~ō£žśuÆUą‚äēf)ėĪČYÖ <˜O‰õ^BéaśAÖs’" nZtĢFIŅŅL’™cĀ,óöčhYUUU›¶±UEŻĘ‚9øRŒ'!Rź)¦ÄőŸhķ;±üqI榰¢ŠzT[äöSSbȹ6Óé%łR£ˆčŽŅSRsŁåŠĒ8UAŠ”ī"-vśļžīļ~łŸ¼»·§®²Ó§€'cU.ĕXĶ3™­qŖąä)›–_óņW>ęó>ÆØ`—ł„ é¢'g°Ū¤ų'~üĒņ'’=TtÄą%łW_ōÅ_ģf&w…Ս~¹e‰“XćGµ«ļB,ėS8=}õ²µP5:Ś Š2ˆ@m„¹±«¼ąßżßupįPēĘĪά9XĶ*¢ś²S7ß~¾•™€"Iså.<ö±żß/xįŽŽåi±–*W-®‡ Žż@'Nü†JEŽqĒēɈŽ,dŠįNeÉ€^ÅÅ}huńŪ µ¶RĶ|TUA³jJÜCW|”oEDLE€Ł%t‹z¤ĘżwZø1åRS “ĀŚ,E-MäC‡Īsaˆé”1‘ZęĘ”Fw„IōćōSŗć(ē—jė~‚Ū łś˜~l-Ÿų¹¦čt§“œ®ÕBߢŠt-ā‘Āz,®–A£gAŗK¤ńÖģjµZģģdѽ¾FIŃUetĀX˦¢pŒ…¢]J#®ŅƒÆcŠ• +$Åy†&nxYö÷÷OŸ=“Ļ:ˆ¦¤ćžzÄz)q!e™źŸT‡¼Ģ§ÄRŠNRb.Ēfaōł_®Ģ„ųŌ§>ł…/|¢³ķxŌĆńŖ_Į;†§–xFGżŖčˆ¬ŃŚž¤ Aœ'~¼Ō^>p%™Ģ„Äq”—S?“kößĒūO·Ó¶­mŪv±˜3ū; k!-ĪĘ’[dSÆ-XĒżSŅ­“Ę=P!¼ÄŁrV)FP[\Ć@ķx=qz¢­ŌŚ!å6:w°<ē“‹ĄĮĮįīīNž€kb)©ŪśB§čŚT‘‹8YJÜab)~X~„2ģ—rqM{*{Ažīmoyąƒä£- ˆ·Żrė;ßłĪoś–ośą?Œ pzww’ąĄ ²bf „”µ2xšƒļ’ć’įg¾š _ d’\M•%Ż)BG dz»Bƒ,pp€;;ļzŪ›o¼ńĘēžśoīķķ1Ā»žńŻ÷ŗ’ƒīt§;żČžčb±øćļ¬ŻĀŃV—t“ĘŹq®TT…²į}²‰ĘĢTH q¼$±Öš”CÓ6Aš5ktœØ•?2įŁ÷¦²°”‹ēĻ_vÅå"1+_śēń…{К2ŠP©/Ūż53<㛾é¹Ļ}®ÓĄ ‚æ}Ū߯’pēa|ŚĻĢĢ(„“¦ ^ˆžڦ©źZóaaf@-čžšššp>Ÿėš¶m{xxø··—52¤½ż¢„˶&å{“PU`WPU’ī‡~čēī.?{ę–ŪĻ[f%JĄæłžoŁĖ^ö€Ż’-÷ö×½õżąd¾Į²Uv»—–v°‚7ć„"`æ»&Ėx³{,SR¹÷YŖJčéā k#£ŽōæŻ›‡G¢éņL £›¦™Ķf}õf2^܆ĆP ŗ!»«ę6V¬Ū'ÉäŖgKF»¦©›IyŁ"b!Éy¹—{]‘‰ ÉŅa{ĶI*qŖčFŪ¶55ļrron»żź8,-7å¤čĀ Iń„?’%faвz .屮«b­«b’õ1F¢ģ(I÷‹ ¾6§©G';$“j)ĄYńŗßZ…ˆjļē[§üĢmŪÖóYÜO®/vV” dŲKv$y‚}Ōdäß±il=«ŗ“ ƒ`‡9+pfģpćÖ?÷~Ūg1ƒŌR‰ŁÜY+±ĢWĒVÅx㼄UŠ…žQŗ¶>A)X^±··pЁ†G|ÖĆ_ö¦¬Ų kÓĒā=o/'£¹(}Ÿ83e½t)ØäŽZa+W˜}ćLéHʓ{ĶÓ³ĮxŪ” d4É£ŽūRĘČ“–ŗŖ\¶]eųĒĬ,~@ŗÄ•ÓéĪģ,† lō±yėd§ųś@тįv”­»Ą6źCź+®č¾:äŗB^M‰°_ŹÉż¦}×"°Z5³YŻÕXā·ž.¬uéPā‰ćŽĒaŌøt‚BŃ+L[ŒŌ8jģĘ„ē yT¬ŚöæŌi0|ÄjµZ.—§NŸ™\:žö·žż›æżÜßśĖ?’‹·¼łĶ/’Ėæzćo¼é¦›Žō·o?×gÄ`ž{ė1PĒćĢ·xAh4šØdŪ‚€ķ²bW_ļ: ¦S²õ¦–Nø¶i¬0\~öņūßļ~ÆxõK_ö²—=å+¾|g¶i/^¼øwę `Ķl“¶ėPVžxü Ē’įMv¼ā«Ś˜jؐmMĮ#½;ó³H…BHĒj& Į;D=²k"X¢›ŅŖ­gUÖøXŌd+Ģ\Õ&Nüā^āÄ0³¢Ä’gƒw¾dzŅčGeĆ:Ø-” ͘ä#1 €Č„%%Eą%©h‹]ČB$*į śį’į QĘVĮ˜œnm[f°±w`G(ŚŖq)¾Y½`-Fä}”}­©ņSź¬īŠNafŖ lŅ •ņ&”fļĢl;Āķŗū ųšń4P—¹u±DŠ#a-Ą°cx7…„–2š+iYĮ(xkŃPÖ’„ C9į0d°qz³ ×KÜÉkYæ‡ūČR°ŸÅoĄ#le”„ҁ1-Ū$×IÉõ½ +!Šw»š¬§ūy”8JĘ{YvG”?ōöƒ{ķNĢ'§ˆ\}‡+o¹å6}ƒĄ¾äqō—F@Ö§oæżvD |•iļ_0ZT·Ó§OļļˆŲ¤Ļvųķļh½Ę6­|“ čE4łüā/ś¢ļüĪļ|ŚWķ1ńš HrĶRp€JįÜķē/;{&:£T ĒŖŒć U„ ęŃĘB:ń%0“fŅĶį•#ÜNMxȘ…ĒūĪŸ°?‡Ŗg9²ĒŪTp© µ1ŗlĄ$ĒPŌźR”„C‰]ōÆž–ˆépį;qaÖīÓŅćŠ½Ž²³Sƒų®Ł²T ÉÓ6˜ k* ių^L 0ģ%_6DWf•^°hI»Óh]SOŽ–<§s¾T…‹eė5Q @MåŌÅ'.—tą'Ž9)l¶ķ±®¤¤)=ø@|ÖŅSۊcnJQ©œ”ŽGÆ¢9摄ŽL+šÖž>½𨓹kŠ ›‰›Ūžk¬Łäś„ ®fbWmc«Ś€…Õr9Ūƒ§¶©D‰­xŗ5dår¹3Ÿė#pˆ· -‹®Ļ¹7ĀÉ÷’¶vś ҧzĶš|’įØĮ,å腕Ū Ä±¶<ų–‘čŪ¾õ[ó’¦VŠõšŽ‰Č˜ŁT\˜ł¶Ūn»ņŹ+C‚Ņ,cę gFɵCz˜ŅDJx ¬Šk®ÉŌ $(Ć+ź˜?"Ń=¤©I–*¤†¼ä’¬V«ŗ®‘ŗŚ38*5 n×y‹Pļ¾¶ĖŽ¶ šFŃ] WĪ–W&—ˆT•¹$a)'\¢ģƒŌÜ>PĢ2åΉc²µņ³64ū8xõ13Ž”§YM¼’ųÜĶ.b(TŻīZćT6~‡ ŹR×u†é•‹Q1£Å„FĶ’Uf6›…›żųĒ?~Ķ5×hĒcPųöÖŠ3Ę(ė=”ØCšģ¹śNÖ J—B° D?üo~š?’üéˆJžŸ‡P[DE¤O!‹rBé_LŸ1«rJ‹Åģ’¦ĮCC4r”Ž?ÄlļŠ½pūłćÖn’X±,śß8iČ’VŻeRā@¶-g~æK”Źń}ņ?)œ×D˜‚6jčVP,ńLX$=a$…\6%™²Z’ł"tĀB²d#µē䉅„Q ·Ģf5 č;čūxܳ··hśnt„k'dc™™Øž’­P@/ɤWētłŒ”Mwś÷dŒ0Ą¾ō`­­Šh”Į]²ū[]›Øųüb1ū¹1Ž7ĮV4+Z»Ńœ?Ą‰ŅźCŸ­ŒtƒE³–8cŒ£¬¤°" "ž Ž {¼kG†Gw%8l{©«Õ¶ķ=īqĄüČ’ö’yŽ·|Ė·øDdä¼Ö€šģٳń}£Vży\tÓJ@ɈojØz›[Ɍ*Ūż4Ūt‹]†/Łf‚a>{ݟīĀóöf–n”“QB¤Ź(‹;¼y,n=“øÅ;lŚGŪ5ĶŽœÅ›&®.0 ó×ρ12Åöåų˜øąRń¤Ć4Bč µIū÷0ŸķøįU]z’Zħ?żœ8 =Æ­eXė%Å߆,¤ś]üŲz±i¬£ŗˆDł‡xń¾ŗīšaŚm ‹  ˆŻŪŁY®hӘQ-ŒŗińO’Ę»Żż3žõ¬g…YܬVu½Šy½Z.])GõųM—zżæ)›½“÷ó†Ä±'W(s…‰Äp ›–c–6ŠŚæaωWD¶Ļdn=ŁXõsĖā°l!жźLńdW°y«~ż1 ZUUįmƒø‘?šŗ&ߌ9ÆöŃ?NK’XØÄ'rSB²Žœ ,¹Ļդˊō9­Ź < &IBŸāX,Ē`9ŗJP*ióä’+}ŗuŃq4Ōé³ÜX˜Ū¶­c ųc°Ōg•±Ui{‰©A7ć¾ŗ›å€l@&冷˜Ćp÷#dy«ōŅĪ^«jņ˜0‚¬‡ojjÖ< /¤Żõ…DĮ [ĖĢ"ų¾÷½ļśūŽ'IG{Š“p®oÜu¾3xsŠŚŁ’øųšąØžĻ‚wqqu0u±: % mU^Īæ›éÖ¬±%7ļŃN)•»Ó™øŚŪģt(!ߊ ‘’6@R’āÆi267Æb—ˆQ°278ÜMS01b6`ZęY«Õź—~é—~ų‡I oøį }čCM]M9,2J×BƔ¬t;y"įoįN£zPf…•“§›!3«¤e’tŖ»„°R®ŽQu3ŠxŹāpå ‚{j#«#=žX¶Õ=]wȎDæSž{? ŲĪ$y‹˜ŁwqĆP¼×W99f˜ŌĻW/Ō:żµD‰ĒĮŠ¢g¦ö`¤ŃXR­9ŽŌXpߎćéM•ĄāL8¼‰ęĆ ¤‘kæA?„³}Ū“²l=V¬äĘ®Ņ3»²s]D–«&œh‘9ˆČēĮüōO’ō}Ææ÷e—]¶ææę²ĖBd§WUĻ"¢¶9¦®ŠndzIŚ•e’÷¤’W]̧į+Ül,%e­„ˆwh UB7…rł9ä]]éŅU7ś<ˆL_dM÷·«DjŗĄĀ­„Łz­ØüL"›ÕbOjLŠPp‘QV)¾[,ü¦gŠeņiĘĢ)ö„`"-)'»`7tłŽA¬8ŠĪ=ÜÉr °:%ɧųØGūHŻ'²›å8\g72œ,eZ,ł3šõ†©(”ŁŃ;gvĢāt$ŹåµGb£@š™ 38.ĄøœA¹ž…ŅL_Å )€Īa- $ąjQĪd-µ'9øcö, ?¬„’a¼E•õą_Ŭ©Z&0Ňo˜Ų*:•^«ŠŒ¬Vķõ×ß')āؔȒR—ž¹ źö.‚A¼ŖŠ¤½.č×OÜŁ]Hš { ‡æy=¼5…DGŖKęż1˜ tu!rÉsg¹ēŠiĻkućß-dכŖHf6H®õŌȝ\™$5›ZŁä S=AA ʈzÉv YĢȐ.1KŖ„T€ŅŒ1Æ}ŻkTރ„Q@ńØGv*¬kXuūĢDZҕ³4M3_Ģ Ö¾čn{żĢÅī}@łŚ@c(HIYIZŁ»a%Ø'k¹k ”ŽÆ‹A€P‰Bā‹ å ®DŠė哽ſ¬3õ«ķ›™k_–ķxÉ®(‚B9m†u)ā ·sāžY¶©żņZFšFo8e>=P\!×J÷coIżÉžžžŽŽž&Z'˜ÕXkß÷¾÷ŻūŽ÷ī_Lq +Öõ§8=dŹ#ĘßCoœ$«6čŽ&“ćś;ĀįŖY­¾üIO¼öŚk’ź/_ś©OŻrķ®{ņ“ŸüĖ’żæĒo½¹Ä ĻŠėÕ36+alTȹ¤S³ßJtüĻŗthóD?ōńÆXė2ČZą:ćb‡ĻČTŒōÕ]ÉÖ„Į‰cŅÆˆ_af3–L/Ō•¢‡Ž-ėƒš!LM‰·@ęG–ɈģÓČćƒB]×"ŃᄽTŠÅĶsŒ{f$)üŲ4Ņö\ƒqš"ˆ»(»`„ļ®Ų…uŹ…!0B„ÕŖō!¾v—kÖE&¢šÄ%ā'wŃ?v¤>·éEČvGWėŪŲ@!ĖJF5Cœ01{£2žÓO‰»‚B®3›f(½»MM9’‘~ų —Ń/–Khi}2_beč(iŪyG(8©nƒ!& T1bxŸšĻhJ3”Ų-Œø QK0ž¾N‰¢4@`1ÄĻ×#Ći3'ö8ū×ßO`l‡ÄźäŗpįāéÓ{ĮĀ8§õ¬¦ifó:ĒĢ=&9¦ż·:JmkQK®ūf{›ec(^S”ķ9Y€éZĖŌøRµ^‡˜$Ps#2v§ēÓ>X Āpm̶ūøDĪ—6˜÷/žČCņž÷įZছnŗźŖ« źbž‚”­ĒĶ$ē:ž±ä>VsĻųss.ī~Y9ÉļŻJ÷Ó¾cQųŠ‘+ńžŅ„ÄZ™ź­²ƒŒ“öc_OĻK’’ŠĘ6AśgФÖFh$ŒŲS•žÄ•}! 8#\R|x;XuÓ”øķŁ[3Ž/©šP9%.jxdŠÓįįįĪĪNÖs&“»Ż­ÅėCķGOń¦i :ėÖ@ō†01P.>æ”*8Ń9TH¹ØĮĢaÄŗ,–OkĮiW+3›×ÜŠq—eݐŖķ ! Ē$N_źe<āG½õ^R8ōų)qé‚×ĻÉü³XE°xg5Öx;ÕdmJV¶!č%õÕļŠKÉ»7­ļ••®…5dÅįdµ8ŒŲufšĖ8z’8EHŅ µU?Ā’3™mŖe€¦iČ}”ļėvэ^æ³Øń$É©+…GAž§m[Åčā”X‹§qĄ§B#>źZ 2“Ü¢@}·X‰7‹üĀ’&qčŃtżżf)1čÓcÜé|ˆRzˆŒ ÷=‰dÓķ¤Œ#Ķź„)0Į²p ‹‚6&sj…ȇ9S‚J‰‡ā„Įæ ĄbY‰‡ oß蔐xwDTŠ–{Ü=ܬČ2ōŠ‹[AĪ€h0!%vĘņŲ¹jw‹(ø&`TątzWhŸ9Øm‡Žß/fAš-4‰˜¼¦Ł–Å“VDDYŁZµ )M×]~ę¦NŚE5rČצ”<Ī™±ė”É 3M{Il²ŗqŠäœŖ¤ESŪ}Ņ›Č}ūĒŌµ|<–mŪj³t=«Ä’šą‡|֍7ŽØē¦ēP0å°^įų4^Õ§2·łXó9”$ņÓ»Ų6?y(G Ś-īšy¶ųo`ó„’ÉŠ6ćĢ] ź‡(å‘\—`JD,¼•»q’«ŗ®;”5ź(żĘø„ƛ  "aUUa‰hd‰ƒś‘röĀŹZpƀś9Ÿ@‹…X°¤¶Õ”"ŁkF©†½46]‡cbūģ÷śJzĒŹ‹įŃN b/„ $n®Ŗ¶F«L,Ū¦åÖKv ‡-Æm[Å9ĆJq÷ėōDĆź¹ÖZėŗm„(×ļ“*”…yīgøµ6ŅOTy°©˜‰@y ]Źč¦čĀÖš”Ģė/ønX U-aåQvŠīa?÷)ū˜4 Ń“Żćę›oV„+ŚFś×¯˜ŌuÕ¹…ƒÓ'3ˆķŹÄŹPČō¬•¦i:DŠńĮ5JéfØ$śU6LŻaø{.ĪÜJŪŚ0¼ģB×_ 6¼Y÷M÷‰„GŃ=kMŗÓĶĆ 'KØ]I{,ƕt  ˆ©«–-UƲR}ćßų¦7½©“Œ–Q˜6•*ęĆł¢@@""ƒY~kĖéDŹ»÷0Žä{Š@<ŗŸ„ yQ' 'ĒN”“źwĒ/Tm‰¢"ĖnĀH×gnŒ#.uw½&ąJ6Ÿx¼##Am»ģqLJµī­$ÉōꆶÖ)£1T/ωoX¼’ĮŠqōĶljÖŪē#āJ0į« Æ•}LĘf‰µ|“I8Ģ$s˜ŽÅ7To×ÓZ+7¢'wŒ93'åŻ¢HO_åØmŪX7|¬§ĖzĒ¢¶m«ŗ(šHS Ü×q,[C†…+%|¦;P%Āђd„6ŲŲ}bS¦µø ž­bÓH€V7łÜ Rūßé·°v>L˜²2i‡³G.‰ĄņŠŽ¾µˆmß•;[śŸ"¶M£śÉHWUūeĖXēz²UeĒn*Č;å0+ÖF&”i&Ņŗ WĪĶŖ­Ŗ ŚĘ äxŠx¹\.vēūū§Nķfö' ŽIpTĻĪ%ö§b\ūmāĒĢķ¦iėŗĀ"rėÆJŁŚõ¬Šė ²šƒ¶=/\Ā‚`LOyeĢ Ź(qöœ;‚::XŃ`LųĢ‚ ģXʇ ĮĻ. ńx¾£”gHņ“]¦śtˆ,¬G›,ڶ­L•”RCŒ€‰Xq>ķ¹GkOŸrŪX DŖŠ² Œ1q×ŗ¢ ą%¦}©øMŠ:$Ŗ"ģMck¹ŖhÄ Jõ¦@xŽiĻ^ƒšā¼ŠmՕa|>–‘Uü‰Ź’UZrh4n%H(]Wm"<ÉäQ—ė†An¬­k׉C˜ŠŽ—Nž:Z€ÖrŪ¶ó™µšŗ§ćy×y5³Ļ}(4’ō]ø°ģ(JXmŪÖu„vqĢ@C¢ó˜Ä"ņ”}hµ<¼÷}īć/`Pq¦šŽ÷ŗ5āåĒ–G«®ø×IŪó?‡d™ō³.\ŽaĀ‹*}‡ßÜ®ó-;ĒĻŁ¶eƒäōеCć«‚4€D„Ž”żG€':ݜ`€:ĀŹQā=3ķīķ© Y6ÜƆ\|ŽŠ˜ććvÜq‚Ąé°|ÖÆ:%Ž.ŹZ‹ŗwÄi½ ¦‰{½†³øČ»r»ž¢“„³‹j„p;\wGŽ/¹o–ƒń¼0.x’ūßß¶ķ}īsŸ“ĶO䏒ēE}ū†%™B’[hÉĄ°ņšv™aįŻø—„“FõµŽió[Œ'\J9~4拾抇ŗ0` ‘x»‰×/“ĮĮ)_ļ #šŪ4'«9i»“B'œō‘GCī”bW$”(8¦NĻv>ÆÉ˜ģ.g‹yĢ% Q²Fše2Ś4ČÖb°ßģ'¢l-*’–¶$p`^fąÖ*Nāśč"Ņx/ŪϟfäC1Hć\Oe,õŠėó³r]©š½²ŗ7Ā”+œ6žĄœkššĆŹ)č2s謾ņVdxb®Ģ|Ė-·\qÅh0Oä%/<±ķö„Ž“‰”oüĒüä'?9.:-Å7h#‹€6†ĀÄī`;@‹•±PÖXbŖr‰C;^Üh6ŠīŃ}Ÿµ`dtģAW1„å>Žų¾$§ŽgO6o[ć¾b°+t׏„ģ¹²:J”%>d‰2Š'€—‚„›ŻQ ‡Ę3ś:ūÉk×÷˜K¤ ™ŗņP9µŲ88X,]ėųŠ8p'—\Ņ”‘Žx\|é>Ś/)}÷ööŠī։+ŖDąAÖŲR,|汓ķ7ŠŽŌøC×§®Æ*F›ÅÖsČįF¹Åüs#jJuÓ4ÕMÓ8¼x]l”Ģƕžī"ÕpmÄ 9Ać.J‰7M9N¶+5¤ōA¬ģp„mųIk‡ņu&ĆŠ«j"ĪyI!ød"Ć[$Y(i­ÕÖÆ`½©]ĶPL·” «8}SˆŠO4ŻGī±'ø¬ĘŠ’˾śY°z/ŁĆef”@Ū’ „Ä'UŖik/<;oę2APč| ’«.ˆØ²(]!aO9]„Ā‚†5/Ģsݲ˜]Č+Ņ9 jĆ”X:DYöܵ;”Ho2ų(‰g^6ĘcˆŁn œ!§(—¤dXl¾ē+XĖ”Ø:¾mYŖŒu™–cĔ‹KøéäŁØ“4„t’¶]Y©ė*Gq Õ€ÜFdÕŖ™Ķė8üĶ2ÉJ7’¹‹P£¦ā0žÖZ4:{ s.öŲ;ZA „DńčąØ®ėŖŠ„˜$Ø DĪmŪĪf³€ajl³'ŗ £Ęæ -üblk„āTæŻŁĮžˆQ3pü‡”&Qß,– rĮ1O™z)ńŃŃJ]ßmćõ·<²ķ®Ł’éłsNŸ>=„~G\I^ žĘW%ĻÆ2š§¤'Ģ]ęnÜZ;‹ĶŅ.ÅYĢĆ—”žĖeÓdyāś kHÕr¤B¼\®ęóY’"CśjÕh¢’X¦fÆūčÕŹą}-€~;ŗŸ„ż’Jr‚D„ åŒ÷ó.*ĖPV\×Ģ0¼?O ŻćvĖųJb©‘KÕÆ)6BĻi7J F^i­5dlĖA€©£†m{ł*ö42ņ]Ŗ–Ł×v.”žķōƓæõŻ2ž”D%.‘NĻä ŪGZš 2¤Ž9`ŸĪ2Į§ .Žāš‹sŒˆ‹Ex™£÷q&Fńū)ūBԘźˆ)—3}-Č%$§k ö ÉĖ\Näo‡eAŚ”¶!gøģŁF֎^N·ų'0äŪr&’»Jo‚)P*7™U$}±°ˆHV§m[ KVŃ-!r”Ć|>Æ*³ś)D„>*ؑ5pśW€Śį¦ź$U†F;ęՇ£ÕÄh.Mʗ<°œŌØ"lņtST*~4#k6ĪX¦ģĪśbäÅ^ÉF†ß|ŗc‡ÖūD$ų>Lß‹Żõ™§āC[ļć£Py }Ō P-<4„.`Ť"¤“ŖB£„ē،Źį-^MŚõxY鞏ŖIˆ0ŸĻCTąGČwa„.Ö@¾š=“Āl š iøŠ¾^£kĒ$ńR'£åČ(]M=}ÄY[}üæ A]—v6«Då˜)ĮŁŗh§“üµ'Ó©ė5LXÖQ±Ŗµm 0K&vWæķ™ĖN»¦ģų"8ŌŻĻɞcØNAīÖ#Cūgæ_ŲĶó¬Øͧœ˜ć]ckvxŒņŪ!M2)Üz¹f(Čž÷ćœāE:m(WĒXH”–Œ©¾{øĘø#s繄~;_Ģ”ūćšē^žŸ H®ęŠÕŚBŁ+2™ «µæŸw?)QĀ^Kō{VģŲ|āög€‘C¤lEl~żjś$æŌéŪPVœ­©ˆ˜ŗ&­•P»ra™hQåVé6…É”)ŠLŅuü’Ó&rk壊ŖŚ[³žh- ˆ4RœĖ–Ź”Ü{»ŸėĆSÖO0„j%J!Āz § –ŠJ×ŌŠM?)-æŸĘ¬ą!¬cy8ŚōX;ļ°—§æš(DŅ©1÷žKv#œøž~•j+šĢƒj j†U•«Ō'Ēg"ó¾8«S¢Ė‡‹i¬(G`fźńĄc(–.z³'»NŽĒ-kˆ?,ĘÆam6'Ś}ü`oāÉ2=[É^€ˆ:g’XZ+ļ“ń•§!}°·ģ5Ę÷Ē”§2•Ē:gīr×Ķ?UbÜ/Ų”3gĄPFekęY[#1 •¼ķņÉM„”NÜ4¬Ø•½5ŌY4xģ÷³­V«@[ʬ”‡ŽpJŖß§?”ąŃ7…8ų”öĄ­6©“Śģņ“”Æ#4‹į·öF̊§Ļäx_×N ŚŻüöŃĢńN %ęŜ‘‚9MŚ~éūŽЕطD”Čøķ33jJųu’˜Įt>4€ptø¬ėŚéaŚyėQGJBˆŅ¶-TU…DlcĶ/F"· 8}ś“5 ­²«ß"|]`˜²”F}­’äż›āVŸ9™’Ž”%õ(9Ó¦lé!\Šł9õ9ńģß Č ®AtąõŒb}‡¶±ź³:{#X“°;©UA‡Æ‡ó‡G@HŠ>q$©•‹ś¤»]÷ž EL;†%b#1“um&ŅGČŅxÄZ;›U‘3[Ā 1_™r²[ÓŠ2#±Ī5ڤĻÖd\ I• Ӄ™ Ø3RŽ Cžz9i®hŠt FĮ‰ō³ib§Äł™%rvS…ĘŌ”\+y\” L”‚kĮD“˜>²=¢’'és,)×2;I§Ģ7ųų,Ö”›Z+AŅóėhAēĻ_8sŁéĀżŽPŅSL-Źŗ—E=„qY”?œŅ1·i)?lé¾½ˆą$<‡žĖDŁŖ‰1łvB¶[ē k[ö ņU6”ÄwM:øå (‘¹·ķ³K¢ą¬„ Õы@"üSÅ œ(óU ·€XGÅL |-npĢ»FĀų‡*®™MĖ-ź*eUŌ3fX@ƒŃßČŖĖSĘmzMƒ xKŗćzNÜļŹGrœćżaŻēn±üūS„xwŁ÷‡bŠį–ƒX1Ü^¢Ŗæ²ā>[ŁrpÆĻųrāšŻø;O)LėččĀPņ 3z—ućp-žĻĀG2Č –ÕūŠó1¹¦Jaēžb­%5׈u\­A$Ŗg35œSą·Ŗ 3»1WCuLgSĻA*Ž“E“ 8Dd²i9ōQ ڇnP±°ēō3Ų”%V$ZĒŪTŒ ¬]…"t>(~ĒŠčj¼ģ žćŖ_#Óod±ō_éL˜¼TüAc[x•g&ZŚ×\(«ųųītˆ¹ŹŻ" !Ąd>dÉ03ÆV«Œéķņaƒzžčõ3KœÜJ.šę äĪj1i[«Ę5Ÿ3ƒ[ėć,hµ‘× Ji)§Ŗq>Ƙ9ōc\Ł ē}ļqJżJėYqj𼬒ēYņ ’¹øq8͇ó:Żt©ĆŹp̬8ž1Ō¹›X‰]¦%،I7: HJ³T/‹0UUģvæa— Ē”‘4uŽP’{čĮ†~CaO\Æ[88Ć ÉŻ±"jg•ŒŪĮ$Ca^ń‚Ä]ŲKūń^~×ŗ6O:µŚŒz±©™ŠÄt.{ö[‡ųY:cSÖš†}Y·“ˆG)k‹/i#ᮉu“8„^iŪČWiӌw»½x£ņM‰ ś ‹1ī”Z\ѕtāsæŚģī'“ćųé¬ĒõģūpH‡¢O<ķ}V“öS„Ö\$ ¢R¤‡“("ž}$ŻR¢i[«N¢mŪ.—Ė‹ūį%7lĖM®‹ćĮZ¶-/—K"“mi‚ĘĮmŪ¶]ÓS#ÅĀØpi~Ė ¶å!č …pį£ÄĒ^²`‰”/*„")®„–@Ū¶żžšlœŲ‹Õ§KL b²…Cž«ųVkEæ.#" bmė“‘ĮŖ6½ĢÆĆō ŖgŲ¶mxX ėūt]‚=.}įņ\1G"œŠÉĘĪf³°¦4 O&ƒu]…4‰™u6ŠƒĆōčŗ‚EWŗÕѶ–­°…¶e¤®7Ų1؉I™»Ķ3÷-GśĒüųŠRÄ0’׆!+lÅZ¦ĢT*«Ö¶Ś4ētČ0:J%įz JÄ9*ņ¼6M(-V¤+ā\<,&ŁtĀĮMÕ ŃyH<³Ū-n8R»‰r6‘īßńŠ‘É§Åš%©Śä5޼ŚuØ-s`pd!āxŠ2e›źļ‡qŪĀŠYœšĢ;ój2Hē‹ŁŲhI!NźVž€eP«R-Ūø^֟ä“.xó:xH‰‹‡ x»õPA˜ž\¶ć6Oō>©Øņ“»Bpå0ō» @@śc$$MOPį^@`ą”żć–¹µb}vć’«Tń9HP×õb±P`:t‡ŠģĮĮAVzq^į&f?hŸ–ļ#r).Ąė =lq£Ī vmf£¼n©8ę,RŃ1Ž;cÖu(M”‡É~«“‡¢Æ@U€”Æ8> ²”2Kõ”Ē—ž˜v&½U±je½n”[o"PæŃŅŲ°B\ŖČ–Žį­7¾ńjśaķҸԐļĒOf̐møq÷šCBūŗ€‰a‰8čŒ0„o€`ٲ0øA48GCass'qĖlmˆ°Šƒč§Ķēõ|>W·0¶"MJ=Œęʈ:OŖŠB’ģī1n…De_‚Äšč‘7ģŖædœW DÄl ‡²pÓ&¢L@ĆÄŖ4žźÅ£AéßC_Ŗ_%"”p:‰8÷ö ĮUHßMhŖU«Ū8ßMųE’æĪ¢.-ä(ņŁ{×ģĮžŽĻFÕ­†ÓH(xWc¶ŠŗŅ¤ė)ŠžWœeĀzmµjV/Ņ]¤ĖźŁ«‹T%æŻ½(»ö³Ž•Õ2Ƽ]s^céØĀøLćwLp'$@¢¼r6įD‰x‡ų‰ƒU¼ĢPš¶w§#“ŒĢ~ĒŹ×Ē9:ū›I†@ĘpqłƒüJdŪ²›ķ„v†Ģ& Oi¬0;”Ó¦ilĖ9³o± ÉKQ?h iā3ķ£8żŠ¤žņAŽįč67·)‡ō††@ćéo0œ¶}F†žŖpˈ” ¦¢ÄĮ>l=Y’ōT¼”ŅX«^¶…÷žTØ:Ō²Uģ|(šŒt3śvG ‰ĒŌ źļõpŅ2æÅwĪŗ‚‡ģ¤ķ$¬a¾2źĶ3ė.5~Ÿ‘6ŃQW†ą—ģ~OŹčųžŗz§AŽ3„w*t4›ĶT»µoņžĻé”Ųśōū”’@ÆT1‹oɞ׶cĢN›tŠU]'`"Ā¢tv|IńPl‚źėŗ ‹ž$؃Mģ2²Ö™ń^ōžI“uO±Ņ‰KZ厚D]S?ŵĀ6Mc­],f(œOœ¦YÖuDā·Gg‰A”µHŪ~(s;‰G£S©Lz#!iŠu.lō@'LEF:„N¾÷1ŖīOjõŒƒš®[2łÜ÷YÖZSWż[kŻI>d:U2IƅŽp‹zü:€1¹NĄ²«M¶f­ęq„C Ö.üĮb\W¤`Ƥ…Å?)NŖ°ŸōƵ°'Ø Gē7 Xj4M:9™„išł|&’öīĘÓŖµŗoėĘ«ŹsŻnüƒ=xhģoŪ¶Vy*ĀŗC½Ģ^h„³‘Ån’V ł„$„ēÕ-‚B#½ŽĻr¹œĶęś9YųŌČ-óø*Œ[PļØ(&Ā£‹‡³Eš‹fķøĪ<ę§Ģ¢Bwk H\B²31sdJ!ĶńÜ©Sä^ėCžņļ|¶ZÓÅc‹yr˜°č„„—ąmkm53C›ƒ–—ŌÆ … P<–GGÕŽ.H$Ž’dk}ŻĖl'5ļ¬ęGńįAƒ®7Ē‚·?Ńu1—FZ QPŲBūO£~ü<“cw;³ėh…¦±umBB—^iÜžAå·ZG8ß4GŻČÕ&8n—č­ÆŽŸufW°šMÕ'&”OćU™Äī·`įg’” ‹ß\iŠˆS]m¦ßl‘­·)Źŗöūo>NœżŠķ€aC·y&»'Ē£mWĄO- ŹĆė„§¤²ÓöF¾t‡w ĆKDڜé|Ų‹P^E‹CüńĶžś·«¼Y“FÜÆ˜1Ÿćdr„ć0е‘é`é½O,—^[DÖ QŪ!”XLSĢśŠ«r((¾g@±˜ĮZīŪś‡įéĶē~ ?©ÓP„š]ŒA €ŚT»‹!‹m[¶V’ŖƒIe«©ĢˆŽž‹©*c\-R?ÅZ¶V 3Ōk]Øńli!ä3Dõe2Š2Ƨ–„Qću€HŪ4å ,^š6æ×AdzjȾ\łÕZ½µ¶m3w±x=vøbkMœAeŠ7zĆĻܲ%Į{K5xĄ¼Č┓ZŃķŖ™ŠG56ŒEFOŸ—†ĀOāśZü&ÅPxż*ö &Ę? b9ač±PeL]IhČ_œŠde&Æī­ÜDƒ@„Ŗ čŻŖ" jH„ćœ'ģ‰H¢qp Š›ó±Uj‡ęfBŅ­¬F~€¶µžTˆ°X,Bj­G@]WÖŹjՌ—œ²zŹP¼W~¾‘ÄYįøTłūÉÖᕼsÆÄ–õ—ę9Žŗxģ uˆżæōüGL€Æ!ĄÓYė9ÄL ’›Ėåßżn š-†VŒ@Z›Yi@Ų2x‘w·[#čšs5ģQSlüDčō,’§‰ėŗh śĮSćʍØų.īrż Q\”•†iXp˜} ŪXJ‡q’a jöiü'’čÅļTžxöŒ~UköžÉœū=÷Kō5$­4TۃRßWÕf l(h¼EOņv…ƒń›¹Œģ@ĵ÷Å{=ź‡ģzN¢N9Š ŠČææīX¼Č!/MŸĪćæ)<>^R‰Ėó™µuØģ5‹ņ;o²HGŲlJō„õ²G“{ɤ uż‹0BŲ@\½kUģż0Œ^&ü˜•§”QÖ^ĆFģ€ōÓ”Ŗh$_Źģ¬Ž4Ņ…‘ŠfA {F‘€måLƒž  !ƒ¶mCķŒ™TQu}]ÓZiōp'„ŠuŌDšĖ!c³(zŽˆ`Yża¢h1ą¢^öŚŁķˆKŒE¼ļ„4(Ń©u ?üWU•ĆQżL¼”ŖļøĮQ5xWUŖŌ51a0³J @C‹7Ÿ„ł{(mŲ±ÕPvm“‡‰]žCŽŹAżQø‡Ž#ōÄäĘVJēEi¦/+ŒO·Ģe›¦Į ”CålSš xĀ3¢›ØĘTN ŹļŸĮDŻ_sÜqķF>–PF?«Ńo Īė10żū$Ósš<ĘoŃG陑UųƳĘ šīücųd‡cGæU<¼æµbj^s^°JĢ¢ƒÓr­ŗē.Nā@Ä*ģĢ„˜„­u'…10“čéé¤a@’ “EE‰Ļ­ä°^^nˆšaź±ŗ˜%sD˰z?s VBu Ų/6‡÷¾ė]o¾åę+ƾśƒ’8 !t“g“1 ¦,L÷æŅ)\VdįßxŻ•„ø;ō8ķfgOڊ„ČT‚Ė殯ÄXk²ÕgZ”Y#->>c³6Ō…\Ä埻¤²šżźĀ8œłT_‚“«HŸ^ėļ5ųHĒĘiT§‚U…ģÜk`J©ó䘒„K‡Ź\¬ķkŃ>‹żāz1\^Ū6¼ue嘸åŚ|¬/Ū;6ŻqĢ[+S™[Œ#"Fŗ‡™¾' 7…ÉnŌA=’öō•Z·h’+V°Ž£]āŻĒ—‡¼#jēøN$3©Y¦šK?GķkYiŠ$ÖPƒD‚°Ŗ ĆOzEŅńhcb»uųfÓ)”x‰H‹5«Õ*Œaę‹PōaŽĪ¦bĶŽ„ˆk'U>Óļ8#*Bżˆ˜‡ƒKŠØ†¶±«e£üŲ™ZDZk›F¬µM£HÆ’/¦ČN>'j’́Uāf"—üÆVMPDZ"·6öPQ§M§XD©x;aˆTJ:"@ ;ďøšŌ2vfHPʂnTÜL¢é=^_§~)É$‰L>uŲū2rqpŖ‘©›ż pƒŠC©(oGģÅ©±:{&×| =„ M¼Ę1†LP@Q±Œ _ ößjH©{=®UÄ÷ū¦>¢mĄ^…NƒFt„¶•¢  Ź„vBz8z«qGļūŒ ­…ż.Ķ’čōČ&ę§V?mKGśœ@€i_zė’JœYzĒ΃Hµk“€RN‰³“‡™#ŃłD·€Č T¼_æ^47 ¦ iŗ“B©…‡yĀćĆt [Th)ļ!ÖYXėūĄ€…”m~š_}ß'n¹i>›Æöžų¹Ļ× ‰€fģŚ»ŠGŅŠ 0K°– U¤Į…&„Ty˜H^_@™Ą żŠ‡@,׆ś)ś”=9£G#ü¾ŒH_ƒ®Øk“M G3¤ńNq‡2£ēdI»kėŒ1óqėīā‰Šńxt"¾•øHŒÆłMõ/²ōŚQ²+wµĻeČžkčŁo¤ƒuĢWNOĀĒÉ«ÅŅʦšéą=Ü3"||œ®l“œ&*ŒTĘõ™Šq<„*Žgэ}#±ū~Ts±śįŌ$iåtBĖugŻ‘Pn³gēDŅ„(i™ßÉ“Ź ń©=ŒOאŪä%’P*ō“„Z×õD-ōérk!NéĢtĮAŪrjõiuCfż˜¾0’1¶÷Ēż%ˆ×e¬TįĀ|""2~ŠŲŚŖ6Ue”Ōi-4MŪyb9DE/ĪŌ¶|t“b–ł¼ö¦Źõ"ŌuÕWš@™ĆnēéD¹)N€õ3>aø²c \bгm[(“KĻNFU²‡fK±¾#Ś›GŖ”ÉNEP¬ū^©¹Nu;!€øĻ|ż ×$‡$·Eź¾)%eiw÷Ąv¢ÉvÜc9NG»UØt憂($2w\§æl(‡A©apĶ®‹2»šzN£÷­¶@į5ż¢LV«µÖ¶m+9ƒZ Na½‹k€/—€AøµQ±2xz€×j¦d±$X»GܕÕ€(}…ēˆ>ĄÖĻ©®Ć<ńʼn×#"¶M£gb•ˆīw,ö²[½žē,~a# Šf&†R=‹;@0i›kÓ“® @ė[äāŹĖH`<øĆ»JŠh®Å>G”°  ŖŠqi)q|Ō×gųžü÷ ¦ ŻęÖZhپōe/żŸæžk/Ɩ‡OĘÓ_š»Ļ±ŠshUK§āq‰Äyq³ėœéŽ ’" ½éDš|Ģļzē;Æ¾āŠ»ŻķnįĆśP`Ö-tJĻsįW˜‹¢Æ·£ĖJŃś­×7Łj\ö-®¤šŗ6–āŽ¾<źÄ n(VńԜ‚‡ĮVŽž[ė  Ä±¶aŹüĪæ€ŲIUXø ±Å#aJÕ§ļeź$!wÜć"ŁP[ņńē\ĮćŲ9v\;°ÅƤŻ@,'ó!Ę-³^%Ģwń”ꍊ>ś‹Œ_ *?›ØęųTy£Üuś Ó(3±\9fÅYńQC–~»ųPŸsÖϟ”BœųLA­D3ŅŖŖ‘ H‚FDVmŪ¶­ ó‰TįS ¶Źf5öĘŖ¢ÅbF„Ģ€āį^WČ÷QÆ/š#%ҵc‡¾ģ ±Žg "Ų¶ngrAˆ Ń¢¬ƒ™­Źq—öجŸÓķd”˜Ö®{ŪžX‰9 ļœķmļH-ž8CRpNś¢ Ł‡Ī(‰EHE:X†ŗČL¤|wŽœI‡GŠé;L?Č”sj ’‡½Óšŗ”M&“]™K89@jH qĒ&7HĆXģj艀sFņ×ī`Øø£TłóJ± "²–Į;9‡ T9V×­ "!‘NY—ŲMūfæÓB}Ks³j™cų+2æd kŻŗ%$Õńnš¶{ōH ¼f¶WiībJPÄÜ|_ż­¬Äreov=7 'ܝ$R©“"“P‰g¾j¶@]ՏüģG€XĢf Jšā?y€°“VŚŠk­ŻÆ¬„ˆXŌŻ’‹@_„$ŖWä ±“dšé_’uēoæ @*ÄwüķŪ_ņā?Wz|L šTņNэl&“ėėĆÅ?·V2²tŒ«€Øą źŃ¦=€ƒœ€²ō5Q‰śųž²'KO¦ńģS—½>aohb]R¬xJu*īĢ\+³49·+ēmåę.łŚvĒ#u?Ÿ Æ„K7zÓįåģ"“ōO}(t`'Óż×،üó'zØļ¦°€ūa»jŠ œlīż=ѼgH®Č8‘mb•- ¢Ó×|j#Q&TOpĘ*¢+±“Pö‚pŽdääŌw¤s9Ų3¢ģeÉāįČc½Xņ`ę‹/Ž›| =Ž)ŪżÄłœQ4]³ūˆ”mŪ~kżD÷ņń9b­ŽœFxĘZnš†vvöŖŗFDöÖų!c¬mŲŚ¬.\žǘW«•‰avTg‰Į%‡*ūlĶóŗ„—YƳ#b73:ŲČmÜZuZįÖ byÄćŻF|óˆ‘ ]Ä2&ŗœtIRā'4īƒQCD0ØĢDGœĢR?rÅŚ3^œ†£¤,‡ėöÉĄ2M6źŠ³&AŲŁŁŁŁY ””šq˜UH;éÆnŠ–Ė„ęN]Ģ]Ād†ŠÅ1†³V.5*OŒ‹w bær©‚Ä%’~×b|©}Ē5‡0‡Q²ąšP\«æ/' vvńŗzP0XŚh‰¹s ĢzŒĆxCD@W²H\÷kwå”,yf5$c74ņÜ2ØrzĪnJÜØi`M&ˆr©ņV=«DœC»*šTfźgVŹc÷{Q‡Ģ Xāģāu·­]»3ēDŁQ¼«@’AčRģ‘]%‡‹ū˜Įų&Ź‹į ¶“ėŻpå·~ė·`Ftxxø²¼;Æ_ų‡ō¼g’†eUX×ŹŽÆīAS 1‰ĄÅ F £œ»ęÕ¶m]~(‰jŽŹ–„µ”T!éŠć¶eD0•›bl Yqø5kZ‘–)q\v‰ēø`įI܅Ik=—DĀg©]3y"oķŻ›CīGDMÓ¬V+a888ЁŖŖŹT‚Ø %›V‰«µćt7É%ÅŗK}¼š×‹ŁŅcŻ>€T“ūīĒ¢I&<·p .Ī葦Vtd„äØĶ*ÅŗZkÅłĻćß¼ņÕ %YZ»‹ČĖf~fó;ķįRAZ«„¦a –rj\%1Ė9Óä­OkBØ[ 0óĪĪŽ.œ?żó?’‚Ē|Ģg3͜Ÿõ¬gu€ķhń«|ĪJł¼^ ®E ²iƒʇÖĘP]×1oRJYŖĢĘGēō|ųųŪŠ[m'ø5ņ‡Ēi$Ёż†>%YŅ3`xAfÕŠc&ʱĻÄm?šBę©ĒĶżŗrLv@ÆI£’-źøy#”²w4Ķ“ūN3µŹ cz€‹o¹Yמ-QW*ÕŪĒŠāP,,ü|ń#żą»ßóCļ} @Ó4 —-†ˆ‚ –Ćōt„гÄs}usā/n @Č‚±Ŗ?tĆĄĄ­“+»<\ł†Ć9RŲj(*,0d®ėZÆn¶ØŃhʼnO_vFø•Ėwźy%§wعķ¶+÷źŪoś$ˆŗ£5ĪÜ“ą›4ėęžs\:D1„ä$>ēÜś6˜}H%ßŲJŪZb €Ų Ņ|±h.6K‹`^õŠWƒ 0 €Õē»>‰›•³!ēŽ`īq'QœęØqŁ4ič™ļĢE*ßšÆS×²ĶŚ˜ū©ÆŪ0)’! ŸÉŁ)œ\³ń["[b?ād$`Lq–Č!],4ņ2—ÖJ†’;‚Ļ ā“}ÅŚć4=»N³ õʲBøŽ*s·Ģā„FœkĒ·?āO)Bč'[ŖŃĢ^˜K萌Eś‘CßjuĮ+fņ›ė¼mł·“ōė0ņÆ×Øk”G'œ‹”7ŸĄkūfūµńUŪ”ƒ0¾T‹*5[čfł’łYLłš3īąL™ÅX¼ĮAÉ”ōųm'"]¢Kėj 6X€@ŪŲģdĶ„Ą¹˜ōH7]ŽŠ±"Ä[8`Ģug¤ƒv‹Å*`ā²eīƒ?2H½J#BŪ2 Zest=Ō4M÷Y u]uP€Ś Q¹”Č?§!·5F|o­ Um”AŖ˜jV¤WŲZ˜‡gĀyY§ā>¤V0>µŽS³ƒh`ZļOņ‰QIØXäŹ6-żÜķ|㋾¾%­ŻäŁ©wؓ„åN§žūd4r‰pmÆM ›oĶG%5„4Õ]$ĖhŒ6Ö`ģČϚ„|G‹8¶ižYd'¦ęĆz­½÷uXžz™ĖåRÉ`-iŒ¬jźĖ£•{4 ‹Å|>Ÿ% ™§N€šĒŅ“–źJ©A‰ ĆäĆ1*„µ,‹9Ģé”™DČįööŪnyš}®æžž÷xŚW<€pÅ;fLē|ŅZ/PUʍdģ§«ŌõŁXč=c 4©CaˆaāF aP³ˆ8į.‚jV`ˆŅlxÕĖ^zÆ{Üż5o¼įżš#öpż[eŠ$`ƐŒ1īœéžŃ“ŅŽ é™&ŒÄ3ˆR×f±3×͉²­,Iœl×*ܧāźÅ‚ xśōéš 4,ĄĪéӋSsó†otĆ×umļøÖēlāi؊µ¬§[lšż “U]C•µo™ČZ1¦’ųŸ~šÖŖ–ųėnx ] €{¬|=8Œƒ ”)#ÖGM¦³Ņ6 ČӢޱZyƒŹ ˜qø}}¦śh“¶YiÅćéz%JO’ÖüėYF':š1Ļ™ż×qņsšŁŒÄ’%xø•¹ė¦³|h³Ų"svw†ō_R7Š, o‹ ņ~D– eæĶPe޾ÖĢ_®īz°7äcLy ¬Eļᆁ~éd¤ä±²ŠėøŹŠėĢŁ4x=Ī~“]†„H)=fćŁmĒ%Ž@‡_„’€šļkķģ*µ>—«ļCSUUŪ¶låąā!TµIšņNB¶XDX(_ÅS)Ņ)Ń9‡$æ$“4ƒ]®4ÅF@w"*—'нŗj3z+\$rżĄā*»Ś]U"Źļķ@ęŖŖŗH@ ø! g`3XHزö‰¤0Ž9ŅV“NdK„a6›é™ė3 ’,˜ÕiõnhĪO’2ĘTUåY°·³ƒķŹn}žŽsBˆ!¾:I‹‡Ń$f`ZRsr͈vōwc¤ż/$ŗāu³[€ƒUC¤ˆ2¶ K»:\źŌV *ś–MÓsUל)ū.Dtį2µ&—ZlŃ$Ji·¦¢E——JgAų¢]ŽbĀÖ¶Öé:·‘ŅĀN™ŹēX”®»RĮ-+T‘ĀĀh€Õ—š<°N ?’žĆßš}Ÿ:wėKžāĻ?ėŽ÷nš#‘ µŠ%ă¬čkW×ĆBJ–°Ü¹ó-sgŌ)źyåƒs»XōĢēp»]]ˆģ*F°fB %Žžž댹åü¹¹1ńē/ĪDdDū?vŸ\š³ķ$Z®/¾kHŚŽ²rH Ō…0Ļ9GōĄP»‘˜žÕ8”óØ|" ¾žµ7“lē‹łį²E7Żr®>ńč’äE~iZõ”Ø"j=ĶźZĢŻF}%f^­V”źAD«ÕJėM T„Žįü™&0se*DŚßæąd&„ŃŠ1aĻ+ dP‘±Ŗ§L?Q1ēdæ6ŗ`#cŲ›$æ“Vś ʘµZ-į«ŖĢŠ‡ÓŚŸ^ņé'Ļ[?*оĘb‡’É8ŽŪ3Bõń!ńāIŸmåż`¦ŒŲ”Õ»Ę,jÕx·@žĮ!Æņc]3{^°Ęb'蚌š“óeČu7ØŻ(O†§`§'²õō—Ul “Y.’$;ąP×q¦³ŗ¶ä9$S‘­šxRœ»™“ģZ•ŃdzޗeŠāhųōŁlF„ółÜk¢¾<Ÿč’/0{ūGhŹÄ Ī£ācI”KĘ<¶KÅ)h)ÉéīśH;KIcH“åŖ6Y.¤Īz2…ĻŠļ1‚ĶERm[W#‹³_LÓR‰qē—SņBjŗ=•ŗĆ¹Ä5ˆél…TÆ£Æ}č#Ó§ĻćI½‹Ū­$õüdéMōc’‡łIäŖ«ń`ĒÕ±āĮ°–øß¹­‹%zOp®¶L§vīÆ €mįhłßõŻt“+­XŖI§6łč§®kM64h>uę“k»‰z…°bŒĮŗ6®¹@ Yµš&-—Kż«ÅbŃé2¶ę„źāŪ¹‹a²½äjg0 +Ū÷ ¦i;X€Ō‰<ŃZx߇>XģÕÕ©ĖĻüżŽ÷Ÿžõ“ČUŪ6P`!$-Ō*»įāÅ]b‡Gī^¤›ŲhÅNLŃa‘2 GLcb3DDT„5­ü†ŖŖBęSA'@b½ŃvMo~ō£€–«#»}Ęg ×6£åŃxi›­“mŖ377슘N4ūEÉ%{P<"ų)p¢K‘PicīOˆ:³ S½6š¦9::ŅßÜtĖĶX‘Ł]Ōķ €įš°į`ö†ØŖ`»8GÓÅ`5_ Ćś 6"Īf³lSE@ ".\ō# ° ‚Ų Ÿ:sFh™ŽK­ńo“$^:)Œp¼Ėņ¤b¼ķŖ¶`ĀŽ· ß0”f„e®Ė[F7;ęŲ¼%Īų{k‹Ē'8¦™‚ČqžDŸä\œµAµCõž­eÄ7£šLøęa8ŗlģ„4ŠS$…Č~Ų)ā(ī®ŌŠ€O#äŠ2ĒŃŃŹ¦ÖśzC쨙Å"žĆˆ[¢”Å‘™hz|²»įZšōųn:?Ćgk[EåēM«Bż„]l!Žāū‘ųF¼†.°‹”6™»5‰žC«Ž”ģlŸ»”Ų€©Iūˆ”ŖŽ0įN×‹O½Ō“Y¼\(:Ż9į¬2P mŪ¶Ė™ƒią Ø®†pœŒ±Ö×ŪŠeĖĒŖānf2„uņæQŲĮxdPĮē¶±ŖXk‚Ü—z‚Åizfčz²ė`O ?īxwMÆó°8µ¬µHŌ¬Včq¾ņźD[ĮNŪ@N QČŚR¦¦ßcÆF²Š9Źj’ŖX'ź(eāe_ȳė~ĘB¢Ž€ŽÜk mŚ£CžČūß÷/žłĢāīŽ¼žÓ}ļpŻ™E}śōā·’ĻsīxĒkæä±Ÿóü_{öė_õ*+ŒD²j:Ṏzķ”VžD7ÆėĄšā .†ł¢Č³²$Dd±3WMFŒęj˜†qū±ā`ŠvX8ŽE’j§ĄCŠ'ū9®łLœZ ŲFX*č_żąą\Ó^øķ< ü×_ł00wȤ^1{{»¦"ŲŁ](G4q0‚<°ƒzŗRĶŁbrP¤Ā­åÖŖŃcģĖ­¦»"¹>“Ŗ‹¹,“† 4–k4Ā Dį ó‡>õqM‰Ą©Ó»šŪæõ‘‹EfDšAŪh”©‡@č%Z’š”ĀńĮ: ĒbTęŹ!‰£ŅÄĢSįÓ¬ęŲÆeWUU×õb±°ĀBšįP@.5§wĢ®8µCpĶ•»ÆyÕ+•kĮ`-Z”INŸƒ„Ā¢ ³RÜErhŗVį Uø˜×s§ąŌģ]cævQ0žŽ;ˆg/æÜ¹=”3u{ŁĖ^&–mÓBŌÕ8Ż 2Ęŗbp+ÜX’§Ž:P\Ė•(ĘZÅ-} ׌3C·yUUA ³Ų¹ęRƒ/7rēC®…=F`@!uźvŅ“¼>'̟ųWÓ·ŠŌ£qČ*ĀŁĒ©+¬V«Łl¶u’Ło\×OŸNč!™Ž[ĒHz£¦Ķ"x5(Æ„!ŗŃdv8ÖŚef üfĻ(5±ļ’¾¶—õ8Ó ˜zdåpū'>eJg…˜ø+Ęģ''rUÓ}†śóæ’͉€ZćxųŠoGä¾²¶m[×õDp̽NG8ӝ›&ZkFCi‡«ÕjVĶŽŽ–‹9(}«#Df1!ōw:›ŹK0w³F ²²Ģ‡bDĀ€&ŗ*Ļ1r>¶eŻWMJ!“ˆź\ŌŅ×W³īhŅL[Ō7„ė4vR4 Ā€mŪĪŖJ_#ģ’‹]IÖį*’ŖaiĒHVµé§B³j]÷rļÄs‚ żBÜč V§ŲŌ’3<昙ŲZņ­ąMÓÖójā ź,^?¼“*‹Zøk-Š‹Īʱõщ[‘n:E}ą~&³’|e­ń90IįÜ­7}ł¾ōŚkÆł“?{±‚kwϜß?ov«ÕŠ,^“¶€'~į—üįŸž)ģĢŲįa`×yčŖ:Łå1ƒ1ŻOΟ?æ··gŒė¹l… Ś–CąTÕFļ]ŚÖ*mĻZŃ·R¢Pašd V1$cÓOķ8‹¤ ˆ€®*j[^­V»» fX.—;;óU#Dˆ ŠX3'ķ %ÄÜ’®÷ś»üG1ńLē.4bŒ7“°ŠCįzwūįŗ…˜¬æ|mÅ¢čÖvļB8˜x{ZÆ®Į岙/f®Ž!’rzńāA Ūńę›?uķÕ×\9ß]­V甁ÆxĀ’ó‡ś§@"Vœ5š€ū+``Ŗ0Ž+§ćKŹ@ž(ŽYĢ$9ødĢg‰IŗEu5£ŻŪ½R5løāō©ƒż‹3/št»_sńąąāÅ#kf½łV0 (Be6•’TÆ<ŪVŻv!Ʉč`˜ϯ’uļć^ÉPӕ‰Ø=Z€į…%E]ÜŲ#k Ɨ˜Ū÷»KFĪ…¢Čt9ŲMÕa6½ųų‡qUq(>ļĒ9ɹ ‘§#LRķ£ÄįĶq©”·Čx°į'›b§Ūå0D4›ĶÖ²+§ U”@Ó†h×*L¬Äl'žu––ß_z.ēżOŒŗ4Źų†×MBćĘ­‘²ĀHĒ]ŁóĶūnŠ=nŹGȊ#ž<5V :ńÆ"£~hām-īuāk³æ@¶[‘/›{‡£œź“ŅÖźŽsĀĮ Ē¶v·.ó(½ ”?˜x&Œj×b-œo±810"ąA‰A<0|ół\—apžŅĒ"6 ©qq°Q«m["jŪÉįW1ĒTžœcÖīd «­°¬m~¢…čj’ a\Fóį4cUīØĻ‡ƒ‹³m[ŠĆµĢEDZ|øų=<6ÖR]\FeZĖśp³|xIˆŖcÉ#[»FR+&žøŽ§ū¢w\G„ É<Š*)źcü9䌏įĻžš®¹śŚw¼ķmög/¾Óå§ÆÜ”«öf·ž_œžįįŃ)äja,q+–īrśŌźÅŸ¾üÆźŻyųö7æIan¶ ¢  XÖwī (śg"Ó]D÷6ņ„PLq›Ö<ŒŲŚŲ5†N:V¦HZōK`k ÓYļk¤‘¦gµl5Ē€Ø¶’j}Ō­"Łd :źżėļū—_ł“ÆŚ507tõ™łž¹ ²d>ZķĪįŌĪģˆ€wŖ«/»ģģībpåīĪ'.ģ/ Ō*śüY{ųw~Ū·’ĘÆž/c*§øJĘĪKØ Č€,āPbDGóqP«ÅLohqkÄõ÷Bųsń? —0CUE˜B©J0޵™żŸ Ah‘p3Ÿ0Ō)¼„˘‰U‹ü ;pŸƒĄæMI1!•(äµY÷HĮx*IŅKƔD¤ü„NĢēŻĖŅæžĒ–?E©YĪ'éd&töqaŲO\!<č#ķ/QŖŠma{O‹6Öd )‚™Ähø*åõ Cų>§½ļ}=>€ń$Ļ>7~«ŁĀŠZßó¹^įKģ8©ćpįĀ…S»§]ŅØ} “(ʘ¼ņÄ{Z¦P¶« Œ÷V'›Ŗ/ĪźY²j"¬'GgĄiösa/—«ł|“ŠŻS³B¤¶„„Œ‘g»Ä v b4…%tކ+jią>+&3CG›Ō’† K”œpV…^ ½ ¢æ ‡‡‡»{;ą=H-°7†ƒŒė®40x£{ģßo ×CįQö1źĻStńß"bŪ¶UUéĢw¤b€ńÕŗvŁŗŗė†&€Ä4(”,F@DŒ`ź ĢɘüĘĢŚ$Ģģ„Žb†¼¾R[a!Ń”EhŪ)„¶ÄL‚€Ą­C}ˆ ˆšĄūŽė½ļ~ļĪīˆ@]Ķ€+ŗéü”“lœ]A0 {³JšvooēÜžį¬Ŗ[6hޤQ±„‹ĢŽŽmŁ”ø o<š‰eD]=½Į¶l*Z-ć L"’`éž6Ū6æėž’ŃIėŖN¶…£££½½…§–pBpč ¶zsg„VyŻV*ƒķŃņŌĪfT5ÜZ€;Ę]ŽūĮEOŚIdĒ·°Z6³Y ‰é“tśś+Uš™ + -¾JqīM6bŌGWŪ4”ż”iÄćS ÄZ½ ¤E  ,¬ź½ē=wæßõˆpZŖ•“‹Ó;·œ;l—Gķ|wÄ(›[«Ų5“¶ 2ć 1{Lå„Õœ^j_į¾ČŽ&U·v"vfaęŖ2®>cÄąņV p٬Q$¼Ė]ļņĪ÷¼ė¾w¹ó-·Üvq æ’»Ļ’²§}5 ‰U׏}ü żĶMn%BDæO¦k°kš&³M-„d,€ųŅæś«Ē=žqąõäįYĻś‰ū±Ęb¾&f–8)Äd)aį8™ÖĖO[`S:tŹcÜKW%Örž7OVc®<. "“–]‡vmP]ӓČ8a$ƍ/’ś×±.š$U ĆJ=ĘtLßć©Ķ±C:ŠŪ7Ās$"¢LæĪ1Ļč½QūūˆĆ†ŚĒĮT³{3UCčČTQOr(’…Md„¦>’ AŠUH$‡'OK³0ĶäsƒĪ ĒIĶ;Y±A˜līåėÕg/RŖ²Ÿģ¦,"§Nźž;Vīˆšx&r²ōę,lĶ™Ū>Ž)½C܊Øä™m1–“&*isZ&Ä‘# Ōu–${њšJö„DDķ°f‡lˆ`ų/DŽGэSgų¦ĖÖ`W«ڶÕ^ŁŠób]ćD`­“ l*2†|ÜćĆq$˜Ļē«esxx¤š‚#l‡ģZ<üˆÆRzŖ'jž4\`†ē‹kęOMēvœEŪŚ£££ ­”ŲŠzūīLD=ŽH³=؂1ķxKĢösõC &ĮU¢ …vŅJ×I?÷ ­Å±B¾*{g#Ń[č`“nęKÄ9ōƒœōFb*Ź«1†nņ—»BxŽsž÷{ßżŽÓ3øxńĄT•©Ģ…Ćå­Ė?|ĄCšö§æł›¾ž“ļ߯žā/¼ó­ož­ßxöõ÷»Ļ…U»/š‰żC&°Ą5p ķ™ŹœĻVßõ}’RiŒ äž`0Z¶+AØjÓ¬Ś!_÷ÓØŖŹ"ƒI»@ŪŲfÕŚVŃfX¾Ś¢<„lˇ‡‡śæDčH0‹E$ēŽå|āRQ¤Z‡¾ZÄp5Æļ~×»Ą†Ū ¼å-o‰'›BzĖåJß_÷Ż TāˆØĖ‡Ć¤ŠĶ/ĆŗpŽ£Äa©ź82KUUNZ ģmāś—€ävĄžN“ČYłĮ@ĖŽśÖ·²€eh€/æü c*šĶwwŒó— Ź !a^-—UU%;y/ŚĢ±µ Å$L|@r(ĢrNYó$ŌJMlē>õ§«®ŗ²®+°,÷ŗ÷=ĶĶ7ßf ^v¦~Ķk^ ܹh~m[“šį1÷½H“"Ž;ć?I+ęAWFW‰Ļq—ž!°šg~ęg†ŠQŸŻƒō šŚŪĮ˜łѳچ6gŚk ɗ1ŽĪM9¦…UŻĶĄS癇Ź)¬ėI„Cvww4ĄšņߌF扣]­Ķéł·¤·Õ¬ŠKcNĻ//“nŁG»AaQ‡ŽR\"€Ų¬Võ|¶öīśpßDÓ©õYP*–›Ėn­}eęx,L8ݾóĒ—ąHŹbꉸų7­,*”¦PM°ZąŠ[Õ-‹ ˆŪV׊C}‰j“(œ×ĘFVÜ1ォÕj>Ÿƒ€mŁź;QÖJY`†G]źŚö5S÷ī©Ļ+*+cŠ©ę±,tŲ;”Ų„8ŌŚ“n«ĪÅ1ńémŒ&y•Æ`źž¬“¦†¶µĘ]Ö ĖQ5“ŠęF…Ś:D7Ā7$Bk±‚VTž'vķp³¶m1T!45ĘPŠ%päš»°ÆčÅŲn<(Yģ#…¢®¦—ŽŅc|H„ų»” ń”‚¶iTĖ·µ¬ū•6|Nܙƒ–ĻįįŃĪĪ¢ū%K§|y{ĘŚ?z47eęł¼¶Vāš2Įŗm7MÕƳxž2ū#W…Æ‚.Žpw2ŖŹTĄb*ÅĢ“éQÜ ‰Õj~pp°˜×O’šÆ{įüĮ‚ą.×]}tttó­źZŖ¾é›¾é^÷¹ēSžņ”ėīq/cżĆ#hŠŚ?ŃŻõĪwŗżöŪæźi_sįüŃJ@NģĪlsŠZFų¾ļūޟł’I]^ĀQd  XĖ ż–†ŗŒŅć‹ÅYĒŖˆlŠ ā§„īØÉ %ÕŹĪfĮēL ęwĄ 4—c­N®LšĆ£S»{;ĘŃŖi€—æņł¼ĻUŲ#>÷mĖ"¢h¤µ¶š™a<­›WĢlĄ«1ƒė–d ü†qp#‰48ņܘżįdĄzsšŃ‹„y‰,_ę±–æāIOzŃ_¼X„Duuįš0zŠ*ÄårkŃK8ˆ k׊ˆ`7ķGĢd%|ŸÅ,ßäē%ęˆs ˆŹ'®Ą‚L…@-žO?ūSß÷?šč?šć’8ŗåęƒsfg޲%"3~ŖÄš—*”a¤āP$.ōcĮLĒP ®ŪH,›ŹŌ„– įļ’į<éIO0#¬œAŽŖ®0>ƅĮimŠ©ĀKŸūFMĖŹō‰ŹJŪ$#ńWLįŒ3…b\ %³C=¬åŖ"f°ÖÖµي…:ÅB…¶(?`Ŗę m© wi+"#ž1.\Њf(«ēĆ«š!Nō[™Ųn.ž‘O1·œ2Ū m  RUo(RŠåĀX[ .ڶĶ$Š×łu TąŅ?ײ>«9”©ōWół<‚N¤Ą6Ž¢@Ó4p œÜ¦č$·@8Älģ?ßŒŻ ĒėłWš'®‚8åæś4ÕNžģ9ÖāÅNóĆČķ»Ŗ$›kĢąź)z"1”ųUtĘŖ]vĶ MÓB–7ŠkiÖ¬)Ūź#kŁØl]꫱BŪ2"€“—¤{ččb;ćb‡ƒ!ˆ€‰„P‰0ʐ šUŠķ“-»ęŅ 8Š^a/I=’Óf>X»7įf§iu–Č9D4ŸĻcŃļŒJשỦ¹{Š”E݉Hä<^ )ī˜ŅĒ”ļP×µµā\}—£’Æ84„©&¹µb­8Ė%ÖfĪ0®£“ć(ąļšdr  "ƒ³Yķš 3¶d/%cLÓXŽŁ™æé†×żįüA07xįÜły=ŪŁ«¹šŻżś{’ü’üÕļłž¾īn÷”¦iĮ"X¦śŅÆxŚžĻóÅ_śĒöæžœß8svO,Ā™ŁüŖŁ ~ńéuÆ|%ˆ!£øńm­aQ"C±ŗž^±ÖF½µāøÄVü”i•<¬+åččH“OwÅ;OŌ`›ą¢ƒ…xĢ6Šanš¦^,®»ś*4“j$€—¼ų/tĘ"ؔ½‡Vkm™N<E«’ŽĪ,‹č;ś~Ėņki,OŻ`ȇ%•bJĪÄø×ūJ ÆAĒr$C’ž —Ó“Š)HŪʵ²ķéÓg‹Š„€Š fb+4Īųhś“+öšpHéyIßuv§ćzWEó!fF@fсg–‡=ä”ćöxĒɬÜrč×ū'üšž7AŅńWN†ĆÉ2ə/*U@G“6c^K=æˆ,c­µZnUžć›Ż8ŌJy‹I-EO8­p‡»Č2–“MŠõ€µƒrźŌ©PĄχūNĪ Ņ#I¢›ŁTJ¤®9ļẜ{D>z>·'¹E¬µmۊļ9)ÖĻĀż«Ÿ„fG±¶-ōųŽėYÄXk«UeŌÓ¬_żŹ¬³āö†‰iēv„»š •@¶‰“ˆ>ž[…A*ŸČ*Ī•÷p4­%Ź”JęųGĀō%æŃÓßt‹Ė ·XŠ{¤'õ½LB$‘É· …Iń“’·ÕkišĘZī\ŁKy9Y…³ KS!VŠÕ4€›¦i«;Ą|QéI¶:lB’ É€Ė£œ@Ž8‹ŃĢW&ŽzŻ"D®Č*„;«*rŗŁ{ōQ‘ū”NĮŹ"S¹ŗė» %Ģa³ķx1%ę5" Ŗ-Šø ¾-Ą^E©ÆähÉQ²Źįæśņ٬R]"Œ\15óŒĻ£ąŲ¤£¤»tŪ¶Ę Ś}ŖAxf \GB"@й§Ę86oi` di—¼±ć;N>òi–MćĆÓfŪ Ę||ēRhfPpA¾ģqO8³ ĻøĆå³Ź\øø¼żü¹[÷›ßxĪoŻųÖ· @SWs^¶d‘Ä ¬IžŁłŚ§?ć]ļx×ūßūn¬ąę££żƒ`9Åp¶®æå[¾å/_ņbF@6h™‰L,*\Ÿ$ē-Ģ@„15Z§¢ŹPļķ퉀Āź®£øXģ5𠇼7Ч٠"Ģē®ķ³ŗāŗ¼+ZD”FsÕu×­šV aa€—¼ü„ĪZ5µ£7<žv¶–•¦F"łIģÖÜģĪšH̽žs\4®,(Ą¹ńĘN±ėŽćčåˆ‹Ų®ó‘|¤Ų«\õnŁ4Οt&ŽŽ"ĪÜŪ¦Ńv}ˆ=Ÿ‡Č¦2 Z)üOę󬼍v×/~^yŖÅHŒ:œŃē>öó mm5›3Ą}ļwÜŻŻ[­ŚO|üSMcėS¹dÉh4®'B¶É°auģüČÕ\~}±.ٱĄŌ•¶>?'œŌūĄź·±(?Ö|Yåҳq76^ŗ°x#ńm€šz‰" dÅn’Y+"nQ[»ö=YkÉé8ųD0›U:!¼6”`&‹yRćö½¾uTśĀp€ÅĄ—t*ŒōõŻ|ÓMŗ"ŲZ}~k SDĻKU¢į³ōe"ĀÖZk‡„駏OžĶ,²6jÅ |#¢7¬ŁČҘ>V¹DĢSāś`eÄO!4#õĖ“q‹ĀŚ,eśĆ8nŖ®aRq’OO…o‹ĶQC”u3vs“Üų XåhŸ­Zt^ŠŃŪ._ˆŽĒĆ»‘~F÷›„!õ°Éb#Ģź¦]Š›bČ,ŠXėģ[ś0އ‹É [_‰R.‘ļ+–čh—x«Ńƒß§ÅąÄ½=ĘÕ¶-03£żiQ§ń*¾ż8-—KĖäz}ÕÉ_TŃGs²YU»ŽŸiøųI|V¢B+„(šĘL+Fż&ŅŅę«!WæŲš%+WÅ„²¢įøRU!Ż’ZߦėģjżE‰‡ģ‚}O2‹18›U~ҊÓD„6i-ŻF£ĒĢ!r4®—<›]Z•‰qšBĪēuUUq³ "ŌuUłtø¬m‰`¹l ™[?yė…‹‡3 ›o¾ĶZKÜvŠ~ķ×}õæņiFDøeaA łL ‚0(["į+®¹ć]īqļó£?Šū„=cfŲ4üäǟšeO|īož&Z@@!Ā@ĮҶ(“ŃČ>• tdB§1ś¾āå²Y.Ū‚ˆĘŽ\×µµ®2å'„Ų¶ÕC6ŖGü önR(Ÿe?w ķˆVTšKš¶ŻŁ™‡bчޒo»›Ń+aę÷¾÷½ÖGSCg  ²Óį„®ąŅ ecĒõˆ$H ±cʙ’AŅ“„ėPč-1†žn°*˜šŽÕ2ŻZ@xĶ«’š åyEgOŸ2†NŸ9£ŸįŪ&Į‡ć&||ēˆ›œ8˜mģĢb­µ–C]oĢļ¾“ėŠh-½r³–„Č žwł¤ŒiĮ”ŖĻļ~×»Tc@‡_łŹWŠc?’ ąčˆ+óź×ʵŲcĒ¢uāa˜?čø_Od"1§ću‚ļPfĄ ą…/|!lHļĀNšü6Œš›x£šb^{œ8ē8ŠĪˆ€N†feI²nN±C{ö‡1­)l†›z„c“£PeźĒĄÄFnĖ01Š2śn€$œ·āFžxŪĄ”KÕ_uõÕĀ\ØZ©|‹ ź7į‡ĄłŒĆ>å=.ÆJ!ź€˜Ø> Y*Š$Åpå?±éš©ˆŒ0KƎKm ˆÓ‰w7Ģ÷‚įO‡"ł(žłūWæ‰ū†Ōą¤m*ži§ĒL×ĮgęζD- Ó]­¤‡·ń tuŠPUه²‹•Ā̇ūŖZAÄčųe‘v¶p”ʏd1ėH§Yŗp”įBķD!ٹūź Ā'FGŠ)ŁÖuM&¬X%Ķ"UØŁ)ģ œ4ęEØŌ9Ō‹liv­äŅP1ŃLL'įl6#ĀŖŖt_¬*C„mŪ6Mƒu]łPE_€ŁÜé»jČ-įĘѓķbÄ®pą³ś(¦ń"flZ4Z‡ÄŅyH’$•Ż‘žBÖø9q¢ eõō’'g…p¬m›¬•1+ÓxY¾(ł³Ųķ¦5yŹ#T†¶mmĖ€Ą6˜•e™ÅµĻˆū“dÄøćĆg”UZ M¾°¦&˜Ļka~äCfts˜ļ,V,Ą?’ j6ĖB@•÷n„Ö“ˆ®g„T#ķ³žõSē.^xņSŸ“o墓hĢA šūĻ}¾Ā¦•A0$ ˆ¢ÖŲ3 C4c: -÷ÄŪ£1d-·­Õ?ÜŻ]œ={:]I$‚¦iT‰­Y­ŲZ@4UR#U"”¢£$’B”Žéx…½ɲÄ{Žēś ‡Ė Z€j>C4Dųš-¼łĆžšz6³M[,yĒQöŲq·dåqŖćĶ”žē}±Ø0µtÕ`©†Xīmq4= ”¦Ź¼ćļų›×æžt=CdŽßß·V]., ĒG¼ ÄUó”ŲĆK©t\–cČq+MžL @=«²rj‘>䛿oÄn³w½ė]]Hžö“§ĄĮĮQEpŁe{ä{Ä W<õ:Ū…!f$éµHJ™3}£ó<člƒKģ+D!DxŹŸ4TĀž$ŗ™)é`Ēčæ²HŪ锯4h?)ü ŸØÆåč)«HYcÖŚhė–~Š”ŗ&^óȧ÷ķś`€Ÿ5‚PL÷h:‘ ż|Œ"X ŹŻmŪn$?3„7oT“¶ćE~Ė<Ų$^ 43>®TMI)ĒĒ-`^–sjÉ$Dš#qv,4Õß ·īE$ŽŠõ”ø•Ō¶^6sĆĶIUŗö˜^²;”ÄBÓ[Ų3ćŅ“NZ*y"ŻwüfÉŪezō̲ŠĢ–’Ę-.2ńrĄNjµ #—J<Ś^84n}ÖżÄē›­”~ėHæŪjbé­/&YģeZt>RŒö$±„’GVjė³×G[ĖĀ>§Į^ö €­4M»Z­T¤Ēś‹ Ō‹ļ -ŚACQ££ö¶i8"c•#b+HĄ,Ue|²ź,‹•P§¬…°qzBSuŃY"°Z­ŖŹ§bR:—Ō®Į!Œ-Al„žśR—ę’č}x²Ż÷Ék"©˜ Ģž*‚1؝Ūį=ƒNP¬8ŲŁ®qē›UUUœsėŽ”j±B(ńʒż-+ųėfڹŠXŖā3ėØųy[嬪*€ÉJæļŗĮ"»Ø"ŽŅ/‰Ę‡Ā’ŪūČ'>²@X®XU‚W_’MßšY{)O‘YZGRcƒRƒTNŖ…‘%šÕ•«8ŸĻłæž’øųV“§ŲœóŅ—æģ;æć™:Į–¶åtLĘ4ABLx“¾øŖAU-)†ģ=ÉÕó‹ŗ®+mü&cž©ūµ÷ĖĮ(ƒźNéŌ=ĖżŠŗ,K~8:ZŖ­Ążīw?mŖ°"DšŒg<#4"%9`!$±mkŖŖ|ŚśiŠĻ‡AķoPbźY(Ųé«ÜĪą‹ņ”_C)čńŒ‚>čź°ŁsI±;°ŗŁÜ~ūķ„€,;¦nZ†;ßł:ė\¦5'Wl㺃0ĶŹą}dA‰½°įcY"ńÅģ=hŻ’¼Ų0=ļÉų›/ –Ļœ:gƼD®¹ś‚°j šö·¾M‹(#ޤq,æ©®ĖmŪź %)\œ)eˆČš(%żÕ|>w.LD»óÅå—_>2­dYŗ°Gyéźńg/nmŖ</­µ2éfįT"‚ŗ6źqÕæSm ŠßzH­€‘:ąjŽ‘J7«YĆĘŠ`įŒ_š)s—…-[•ö‡ŗžW”€üØ`§¤Ā­{Ż&ßg÷āg0^·j~("„ė^ŃZfö°Y½@Ear  0°śShA“ ņ$6r|S˜8Ō”ŪżÕ €ü§`Į£ØĒ|£ ­ŪYkūü‡!8t­F—ūh‚šOPX8vŠūxŻöG”+L€„* ÷•ŗ‘ēsįŸ"?:U€[ œ§Xż#^ś¤Ęõ‹ōב|fˆ#Zžbā43sk!6¼‘õU±"@›~NµYęOŽK•Q‰>ČŁOV‡ųĄńĒä ‡{‚šĄś¾#fŽ1&>#D„ĢOhxo ^»¶a7—üßĘī„#ŽJCO{½C}JĀąĪ†–  [tY‚x7„°³L<ެoeŁ6mĆ`‰ąąąĄšžżDkóźšĖ Ķxół¼i"čū]£pL»šÜŽ+€†I•cŽ|6ć|°4Q…¤ČßUEŗ_-.@‡äU3³³·KššÄŖ + F;¼ļLS+BtsĢ)‡°°µ-ļģ.ĄK[c8’Cwb·· õ™bĖVzšHõÓļi²\ZŪjˆļ&C³l]«Cåw3föō6Ļdzʳų¬sˆ[ёŽ}G±ę®˜˜{:ŅÖ`]IY$,݊0hų. h€*dŖ’x—:½¶īźćr™Ü0·ü“…Š.Ą-;$G›'‚Ńį"„wæū=ÄX["ŗxqłõ_ū“_ö’BlÕTU€Ō•ʱ±3?-ƒ„ÕŁ 1×ÜéĪžš‡īpę쬅sbˆ~ķ¹æń=ßńķ ķĢn—Y½Ŗ÷±0³ņ7ćĪøōxuDœØ Č'>õqwzŲöüņhļŖĖA0 ‡Jēń±ĪĢ£1ńLA²—qė“<Ćt Öµ6e].—)‡SU“Æx÷ܦd:ųY’Œž"Qu8‘äŒsé^m°Ź‘½ Įwü,ØČ¬…4ĘĒ_DhhŒٌ“–[ąč÷cŻ]OK„v7»g=ßńT@Ä8a·=žN”‚‰ņŠ×šļŗn:ČĄļų(@"ČS\L3vōŚ)[U•ˆh>_äńՉāL,t,' ćĖŽ cŁ]Ń‡ŅŚ›ž.u]w2÷}Øm]©>it<H;³ķ†ÅP‡įTrȚ¼nųCOšk"ŠĆ]ą1€æ2~”3|śÓ9ÓĮ¶Ü¶­Š9qģ00į¹ ©wnD:XūŪ!ćb=khh“”Ēb±Čņ* ńPĒ‚&*Ŗf1 A»²Üv8sZōÆ]Ń N«A›²B9Hć-’_n¹]YD8:ZĶē3k9“'jŠHP×UĖÓÓ×Ķ&C·ī"„”kŻģ­Ä )=ę³Ó$'”Ę‚P°ŅČŃRŽŽ_¦|„Ś7M³v ŒÜŌ ·gµ]” U‚ÖnęŠKŹrp¢’(QąśĘ9C§L‰šę·¾É Y¶4ßŪ=`¦Ź€1€h¶ī×[®–ˆxķīō¼ßy¾Ž»Ł#¬ž×³Ÿ Ā(€zaŁG¢”!ą"6dŽķĒ%¬ė%~Ö䌕NŚĮŌu–FJČ܉¤AŒ3‡łŸ€nŲ6 cøµµ©śą‡„HŽśå_ž]{ˆQN½Æū£¦ŠNZÖõ…”(Š#ź"žHl1زŠu]©>Yh §YG‡ńZ”c(“W@—( b%Ģ—_v™b9°Ō„N{¶V (żą¼×\ōņF”u)ĀšC8—W蔼Ü]p”Ÿ3bęš2‡µ ™£\„Øū«æś«  ŖŖš€ąššPA¹½n­_$ŠŻy&r{#ÅŽn”ÖĒĆŹ"X5+üŲG>Ŗ‰QhéūŲG? Įį¼tŚÉ õ{Va­„U ōc÷Īćę½ć‰I]×YPŻ_ ś5›ĶśŸU\qkm«7Š-³z®ŖK1Ņ£ŸĄ pHųŗĻ• 'Lč(īg%٧wņZż±š%ŗNt£åvלŽø&ąīƒ*ĒävN9æuP‚ŁlČæÕ^McL_ų SĘŻÄjĶ”š Ē“ü‘Ü阞Oqf1#Uņ^ńW£ģ—®Ō ‘ķŪDĶ÷‰tż²¾NļoxhÓ1Ž)łšśN˜Ķ8D44?×&®ń ĘęgNĘ<‚ō‡l†6åķnŠŌTĻ+Sˆ«&ėåßŃI ŒN°”}©_)JLÉgŠOx³Śy$ĖäšEŻ_i…+=<ś§”ó|>7Śi;”×ųUŽO0LŽBĻŠYģīķ‹ĶØõWJ†œĻgŠ©6Óˆö_ĄuCjÅkvņŒdW»L”’ÆŲ†Ju›®¦„ÅćŖ’Ņ˜ƒū ( ÉZIøŌŖŖ`,^ŽFSkģ‡Bč8SSÖž_£'¢V~1vÕRjšVŃ~'ģ"÷¼ž>Ki€-šžįÜļžŌšI4ŪŁ|‡@ Ål„č‹’ø#±śÜǶs4»D‚š9Ÿū˜¾ē=¼ædÕ±ķø'rEh%˜ŖE³ŽU6±]‰P³ā½S»ŗø,3Vža,Å†Æ OnǁŗŖ¤e‹†óyEĘx¬µü¾÷ącś()˜xŹQ …!öw!`‘eŪhߓˆ“Õ ōČ)ļ«I`ŁĖBQ{É«ī%—D”aSÕ„¦in?wŽ.^¼Hä”.°B!Äż »ŸĀu¹œrv• ]®™½ :ó08ņ`Ģ!²¾®įPq+ÜJß9–ÄÓŚ(€Ó;,NJčYЈ€š[ĻyŽĆ­Ó§÷B¤N׋/‚ŁŽ4–ˆ¢©TJmh0Cź’Äüńöٶmēõ D~ögVvwfgĻģĄb6»ćī¤ÕUĘéūS³VŸÄ5Ķž`?TĆ~µ·ŒÆ Dc·Ń)QØsÄL段Čßų©·]l9īu4ō“„»¾$BO©ė …Ū]m˜UyJO\iwĆė\«õ·fuLŽ@ųĆģ䛔{ŌÅ2ĘQ÷é8Ąj^āZ‹»~CįV¼jS“ƒę²öy7xń„rŚ.TšcSŠ]<ÅMøųČĀŃ0R Æ+¬„ =wÜhždņrŁVīD\Æfdš1AFnh?ĻÜp•Yh¾ķdØŅü*”t”-3B`µµ<«Ķū?ōAGŲsėqĖ­…[Ū*½üÆ|%¬Ś–™wŽōŚ7\ßūŅnķŖ.†ś>scQņ6rū®uĻA€…;¶”jb †„PŗÖ•ńŌ)·7ā‰żX0Įņ-²ˆÕ¬VAšæłėæÖm+SWžÕ÷~XÖŽ{ł"Ŗ¹'K‡PÅö ČĢ‹ÅÜT“Z­Ś¶ ĶüŁrŽ„‰³„$=ĀQčĒŽ•™re$ ź}‡–b¤."ūūūŹ}i« ·«Š%ąņ@"°ś‚2‡ņ/ēBI*š\œøßWŠ.Ąm¦‘‹(Žģ'‹ūOž‹|×w}¬š#e|«Ļ|>ck…ز¢ķf:ØßN ĪÄu՜HRb—ˆLZbĮROäß}žļĄr¹ŚßæˆzЃōHµžlĒ/‰a•#gŠKV¢Ģeؚ0‘£Ŗ<ś>ŁNŽ3ō‡:¦#‹C5ÓcŖä łÅN&öB{·‰—9žę4GQ¾,¦ŸĶfgĻžDz ī‚—±”œsu"O"ŽTŠ„“R}h\~Ķ1¢o»ķ6W› īJ#0é×+ģ”S”lõ£Ū¶ žx2RµŚ4Sź3ńCo›fµZٶ…ur_}XˇX÷±q`”ž48ūŻšŪ:h†uųR’¹Œ;Xlä6­,°’źųr±ķųŸ©ģ0B_wQļ½'røõOüź“Ę>WÖ J±W*ČXÉ·µXėgP!Ėɀ±÷[Ɠ†p柈ˆbŒN"^ m,Xķ„LeBµwW;ßŖŖ²-“Agµ„eķ‚,–oŸĖ%Ä”KtµYķs›¦ Šō|>'r–o‰S€VZ›÷Œ ·30³ Śé5œ«bؼµ yiĪwŹI‘õ‘D&®Ÿ€ÅÅ2åāŻŽ3’×Ė˜°^;ŻuŃJJŠRŖgUģĀ­ ³ó˜RyŖ—¼ä/Ū£„0mėMÉāly*ć¬\Žń¶·cm»»»XÕK¶Õ̰µ8 ė C/"jŪV¤?+I äĮŲL’©s¬B\ĄÆŅY”ń•Ó[k5ƒ²ö1Ÿū¹_’µ_McCSāņšP+Z)æpc›Ć•  “¬ ØV%ŖŚ(¬ZU•ĀV«¦•^i¦›„‘“ŠVŲsv60.8ż϶ŠR38‰ P¶ŒˆB!ā'>ń 0Ęąb>ß­é¾÷½Æž.’€=b{¼ĄńŖ‰ĮvŹyż¦ŹXi,ąŪUeĄŖ’Sš½€uĒ(i“Ō4kØ«1 ōå¶Ūn€3gĪĢ*ŖØRŁ0cĢĪĪN=Ÿ]8l>’ó?^ŗéö KŅ’ƒk+Ó²ĘĆÕÉ1°’Dü)&ü¢?ī$*¤øQdQŚcœģ¢Éy$°6Ɣ³i ÅéT"‘\Qģ*Ķ*ć1\7Bœ²¹Dz`ć”Ęķ0­-āĆŌ±'ՑéČ"®‚‡ŗ|ĆXąŒłta²Km¬ō;惼Ó}6W.čҚĶfz̐U,"9Ń N7“» Åʤžķ7Ć:¶-LhĖ ?]Ļ”Āö€`źŖžĻL]9 _x„`?öAŅė&Äøuć¬xėœdmĖna~†j=fNzc2iĒÉėN,‡_÷†ŹĻ,2&ąį¾ŪCūŸĪN *.B ŹŒ‹œ•os³*õ&{«‹¢ŗ](č¤ėBT_PeÜ ū˜†Ų斒0¬Øą;PYfå3«5QU™pj¶Āu½"°s1SQhØ3†ŚĘCA6< a*%˜ØĀiDäUĄŪWUÜ8TEHfsį²”o°{ –ż·É®uĻbˆb=rx?²ń.€"É%nøŠ}˜ˆ6˜'qi;^хņ‡qSµXĢö·ī•ɏj#سŪĘ©ŒłŽ%vrŠ("7ßōIżYc¹åO}ģSÕb×Ipńš ˜x ”µ"Ėrļ>ąWž×ÆŽ~xŠr»C"@c- čBĻŃŹ%Ūā‹Lknć”$/®)Ų‰V"C³j™;W[ŒMȝ ƒDxV?7N-mÜĘ P“1U%ˆ€šóæų *=e-#ĄĶ7j¾·ƒl „m‚“l›V£÷Ά¼ČyēY­>pT{éÓ¦i”ŌM–žbŻ™xāÅ]!ƒ›ž×š‰ŁeF€’ŁœD`o±³\./æüņĻū¼ĻƒLo ½ńPŅBŖÄ>ŽŽtŖ§#i(äFÜŃÆŌ/T *K) č=ĆŃ£„¬®·ZŁŻŻŻŪ­oæż¼µÜpc­4MŪ4MÓ4ś _ūŚ××[¦ÄЉé†vwD­•< ž9Qx”ń–ā_cŒQ¼ķķoy«zAÖĄ o¼ńāž>DĶw™ų %t5‘ ö“Īš,bļÓęŪRāgŃ!į!n ˆoĄŌ»‘ęĶ8•;‘ōx:`3rČ’2†øZż…x-`ü‡—ڵųd[ˆ“Š$Š5*ƒØ×Ö4A°ĘMŖ§¤‚[”@±Łø.w./ģ;ø&¶šÆė¶›“SŽ3[Ėw«F4JaźY™©®ŠåĘ.ڰ,ĻÕĢhŒŌŖˆØiZ!ƒŚ™¬i°räŖŖźH›Ń×įį!‚õTśpZqŻ1^ŒÄÉ„hIČĄ“!RŃ# >œz³d =C8Ļk³ŸRJIń+k@)(OŒ²e|ķÆŻ”&ĶĻuZn¹²%G‡ā½ %Ļr3 Y/-Į0ójÕøüŌ½?#Ź÷~ļ÷‚ ĄĢf³¦i.¾ēžAåd3ĮČĮ_¦āb"‰­2 ų OŗhW3dłŻē=ß)ö¬F×6cQ 5Čq%iäģš•éō8”XEĪ“ błŸ"’\‘Ø#s*ųŠš®[F" ¹ņź«®>{fnpnŠ|ģćd -µ }˜„TWTØP.€!cL”¬vi^];Ŗ­zJM,ŗČJׯp[» 4Sä" ī“ķŽŽģ.f‡‡‡Ā'>uĖż„_śūw¾*"ߙ9)œ”±!~XĖ”=Ē5aSmĄ8T—€ŲÉL iEIć'¤ŹķłŖ‹ˆčć7ņķßžķGGRHŸ×ß¼žu‡«FEŒ÷øĒ3›Ü,JęķRRrŽĄž£õš޳&;_:€Ś`]ך;¾ķŪėŗnW«‘¦Ö¾€kwŽHq˚`›ĢŪȂ]?¢ÖGœ’XAš‰%Ō)pBQ@+ęöé!SˆN:¤ÖB ĮĄv©ßkø? 4tŽęü–īüpUf1u=i9?Č Ø@’‰¤ÄˆN'tŗŽ øY$‘€™=/²~į|ŪI»£»“Ŗ;„<įg\°§(&gŚćOwˆ3$ņ1=, üBŖ"…e„|ŠźÓżšt¼–£‡!³3&USTćūŸµEŅ8ŽōŽć.LÄØödqŻq}üM’vØh¬M1įźm<†å±ö=ÖĄĪĒ+1„ćUdŒÖ^<½FĄĄ‘ĀēŠAøµnv äÄ 9“@ĖZļ’ćbEt›ęį"@!cHdVmk­µÖö \ĖkSŁU jKNDŖ$ÖZŪrpÖb+;;;JT@ŲT$ҹ÷ ²C _qmv—Öѵ‰=ŒŒbŻ9ŚÓŹ·fsŒÄ+$ŠŁf‰ Õ×§x°9/Y8Rt .ė”®訚P0ą«NÅ- q17Żwh*Š<Ž:Ėś/żŅ/ŻŻŻ€ŗ6GG~äG~DK!¼!ˆ6Ė*‰ÖZc ƒA¼óīx(rĄķĶąĒ~ō’ķĆō#ųUÆf.šC*ÖZ÷W«‘D(c]vöLU™Š”“C¶;‹‡^bösIlĘ#,^ā6–³§ĪģŌs¶2#°¶>ŲéXchČ»V¹jŪLM¦¦V<:°µv’"³š÷ę ä}SÆ|ŽĮŚÖFbc=iÉHLŹŖBŠk;ŽJ!—_vV•™v;Öņ©¹yāŸxß>PłoCåąņ–Ä'¹+Cś‚Ğɒ?u’/ÉQćĻ©źī™¹łn^å,„H"BDa„1&xÉĮʘhŪƒÆc¾“ Ęc¢M4AD‰,„åø»ŚxÓĢtWóžQŻÕÕaęĪ]-ž½æł\Ľ³ŗ+œ:į9ĻSa”?Ō×v†­„ę“JķŪvł.hqRŅė›D÷øĒ= #Ž#„Ć ć»ßżī1ĒåņŖsssŠŚ™Ņ žņ™ĄłĻ'ˆ{¤RH/in'<ś+Å!¢+ƼRce8ZČ«^õŖ¤×‹’¤lIŲHÅØĻOPpdr“āœ7ź|:ŽļšĀœčĄØŠH„„µVöÖ'»ÖŲę§‘r? mĆŹŲŗ~õ°m?ø.E¤ėÜī%MÉĘŲ—[!*­‚Bƒ(¼5ĄpÕg·¤ŁI;:½ĆjGłPd»ŸZ¶cüp»Ęn­øŖ6¬GbVAŽ5ģY˜+ SD”njĶ™Øg*ŅīŲØ”.=;«'ķ{ĆĀŁR~ĖÖ|Fk}xŻ.ā1“ޣܻ°¢¹čŲ’£,ŹIUg’‚„[69[ –mu*”4E±öGosÓÖ.£Õ… ©&gŲC Ē$[.ä¼ k5›UЕڛāJģDūš:‡Ēh·BŠ*q» T-}ćjR® u-棪5:Įé’;(DČm4Õwå(‹9É2š-[”@Nķ@Ŗ@*Pfōj ^yŻ |·øƒ7Ā‹廯zc%žķC“p” Ķ.æéD}‘¦©SlVŠ :X›…g¼\ˆJ44tC”߈T\Wņši"HĘn(Ų)—²Nż1ē7ÖĪ—Ō,ľ<˜;šœß]ų#啷•'ģ*I€œé/9cƒ£“|Jh¦šö³ÕWĆFég¼ rkmłē‘ņĀJlÉeo]Ķ›„r®“‚5r4É'A Jé8N ž‡­Č’›2?Ģ֊“†Ff¬ƒ‹µˆ#Ŗ¢iB ¬Ų¼ jNå\ˆ"ET9 ²~ßū?  3k©^×kéŠ%!}ŗ)hY?2ŠH)ēˆ$@˜ĄJk†(„$3ˆÕ—¾ö„Ķ ŪāH'u“«vŻ"Ššh­u‚7ĪZ DE SMŁXk”¦¤;ź ļ† ÆSł- 1‹Cd(„¢(ńUz34䳁“„ˆx‘PcЬĄ (b­2Ŗ2ƒäś]7Æ ”'»o;š†æ}šž Sü9Å Oóŗ~oĪ·['‰É  »śšģģ4³)jÅe¶%Lå{O&?5rŹE«c„"*{UB×±ø6/–‘V"2kߒæĖ²p¹ś“ŗö–ė-a Ņ‹Hw:ū‡öųćO1Ŗ:O\pœŌ"Ļ€`-W0G¾ļ¦˜YĻŅļxĀņc%RXA%؈T¤œĢ» ! °ēąšĀ¹2©Ķߢˆ“ŖˆAŽÉÆüėWG€fÅĘ#3xė¦E›§āŽØ3冁`'FH ŸĀg ¶ zŗ¤€{V#ća*)Ūa1) ’®¾–€ø„Œ;œvŹöćŽĪń#ŽŌ³eŌšV!,l¬‹tlŁś.0ßå×ā(aa†‚ÓDō©Ę°Žą÷‚H{²ejjŖę[ŗ¦¶Öjv-K^±f$5®¼ĢB…SQ+šTœÕāĻ`„–·Yk/S Z—©9 Ś_ŹÄ«—°dśBYÉqéM½‰ęÅ«Z9~™g­č×,\ä#N°Ā†sšiÕŌænņĮŒ*ßßĪŃaWįĘ#āšćF?Š«/L2•‡/;6ņÕÕ3F«9RHՇZ|9ŸH‘ņō‚­Ź¤nŽŽ(¹¦Øä‚ŒiFr›Ł3×évljεߦ/f†¶oCżÉ£¾±…6YJįośŃģżnöŪOr»ńń6Åå/k&",oå²”­ŗ^ѬĢĒējᇠQ=§=1¦S£ÉŗĆrAY"˜pw;üK.[*OĖļ9rj"ŅQ ÓéøĀ¾;¢¢HG)B “÷å:wß#Œn·[#RBUŪ'!CŽą²9g\ >µ†)r(w—'bEŹgš<»A”#|u!Lš‡(\zœīC÷«ō'ģBcn1×”3‰iõæcZ“ś£;äw³G;FGÕ-Ēø³*ҜwȃTžNJ:1Q#Ń 8‚ā‚ų‡ż£Mš¾VČbæh[×jįIYGN.p’~ŌļŗN% Ÿżģg]ÄāK8ĶZµ‘­¹Ö*—¾!%$€Ä–.žĘE:‰–‡f0ą8—„f _kDZKā{ża„F"ŲŹĶ¤JM–׊}-Kk2&s‘³¬QS|(īFPp­ƒ^ļ3æNĒ5gŒ”iMóL b÷ĻÖ%®žõģg3 ¤śĆĄõ×ߨĖ[­gJ„¶)Œ4MKŌ )±ģ€»š”;”©®‹Vŗ"cQ,Wtqć9ŖšW2Ō†žˆ÷"į•'Źq"JĆ„Ż6זŪ}Ó.-čDńö-[ūkC*fĒÉÅy0¼÷ ŠĢÅHcŪ¢ā^ØI£‰Ź©…ŽRŖX;y$GjčfWOŽš1 ŃI¢2Īo¹æ¶&Ģ8tčĖ/8pĄ­“I|]_žĢł%^ņՂĘN™Dö²Rf°V ‹½ŗķ¶Ū0Ę(‰'žX-įr³ŒQ©øx·‹“ĒŖ(Żš˜^Ub4ŚŽ•¦«Ü^S Œd·qįpč›Ń6,=pŻäµń‰<1Rm(›f”‹B>¶PµbbżšÉ£¤ō&“xRöˆ6WÆ+W~YŌ\šIŚMo?ń÷a{½ĮŹĢĘQ³NL#^ §«ĢśĖ¬ŁŽp;ć‡ęܵī: E†B±/®ćsiīĻJžÆpJB=½fIæui…ē}¹æČŪ@RƒÄ75QZ÷į$ĮF ¤Zk5ßUņś‘Õ‘XéėŖõŌ’MG*:­e<¾#¼ÓP<`]S3łq8ĘP”‰Œ*č§7[—B£žLI+‚ÆlAØ3²q®–ęhfmڧŲ;aÕZŗö«Ŗ+rƒP µ«YEQT`ÊXĆĢā‚×ģ›³Ģ‚ÖŠ('»n5‚"¢u«‹ M³Qę¢Wsa-:RIū<»/mćÕ·Ś9ĒĀpÜ/QÕN0µwš]-$^½“)7wÄøbąx“e˜…·“ų ˆ_ēŠ€"wć£\~Ģęų^ÕdĘ.S“5ÜVč3^ŒVÄFˆhyy"ˆ¢SN9%Ž“"h­ øž×Wkqe#:jĢ5¹Ź/Š^‚.`ūƒk®¾z ¶ÓQ…XK V—[[õœŪSŹS{ə)½ƒ+ēA—Ć?ēĄŠ(ÖyZŁÕ²b‘ÄQ¤”5œ µ ¶•Ó:r En]åžā‹H)f¶Y– ‡.ź Jfv}P&ćŪvļ}Ѓ"@Źl8Ņ’ś¾÷÷WÖŹŽń|;”ģ‚VÖZ9r*Ńäpó.žŠ?ĻģøU‘(›±śŗȉiĀ4 9 ¹ąÉꓟ ˜ˆ ÄꌏČ\ńŽ”Ø‘Zc¾IoŚ}sg¶+Ą•Wż–7UW&;PÉ{¢ ”Ń1viŪA„aȆMF§›čH9„K:ĢŲęé÷ä†DĖ śē?½,cd™MŁčõŗDX[]V$JćŌOŲ¼e ō[­hįĶr “jeŲGČ#ōej7’¦© ZčĖĆØ£ēŅV.Ėk²ŒXD„ļ}÷0’³“!®÷=FA CsįŚˆBKU&Ā0’ŅæqAĆņfSŽ«µßÕ`§Óń¼­„a£¦fŌ-׍¤O4·žT’I²łF¬Wń’‹ŒæO o“Åi]ߎ†ÄŻF˜õ\·Rj¾Õ"®xيūśbŸ|ą$'ŠŌa–hCŖå!Ō­Č·QLvļf/Įś>Y˜l•7*&ĖZ¢>† -Ŗ ēŅM+å°då[¬1K‡¹<Ė2Ÿ˜Æ¼±hŅR¾ k‹żŗPŠV:±ŠöÉįm¬ŅXlõpgF–w|°=įk„ Sµ!õŽéŸŠŒ &·žć#¢Q|{eĻ֓‹ÜP <žŸÖ×ā¦uæhÜ+„!PėņcÖvK»#‚tUī@—…Žāģ,łQŻźšUœį3R®søģ«”{(oTvÆ7ĘäA”ž—zŸ\x*ååÄQ3čżrĒ馫««œ ™“#öO_d*ėp ūśŗńy;ėuی\šĮ,”©%UāGØķ.€ZĀĖĮµ&2Ź)DDQ¤\c­ˆø ˆĻ{t‚µ–­>e©Ó°`#kŁ2õ˜ĪV”&6¶›t˜ĢGŸpÜŠäŃ·žõōg䎈Čį5e”NK^†t·ūwośū,k9eˆ¢Ł^§Ū›jZNÆyćöBN’£š”pœ=¢#Eš<ū_œóW¶HŽX~f©Ī@DŖäjёb+ā¢(€D˜łŠ”C Włį""̊ÄŚĮ²’Ngė¶m[¶lqŻȌ“źNMÕalT-ė»LkmŒ85¬āÄw€Æcā] ‚0“VŻn§”PŲJiĻŃą3{ÄY(½ŽsĄhŠu›(Ņ`¤†0"™év¦ā¼  X˜›7ĆA^wv&a’Vké īÖż>0ĀF§ÓqĶ„¹%n|„’Ī,c{eG=N8įI'žšīX[ZpĖ7Įr647ļŗ5o;Æ6ŸO䓨ąŽU.ķ‡%„ {…‚Ć8Żz7&ek5©^'‰ėc0\CD€aį|¢<ĻKńĖØī˜2X„ėÆ9„5€Ųx=Ō¶0Lš¦»5ÅYSĄ¹żŠ›G°ˆ8Ŗ>±nćīčŚXąŸ4@Į£yćÄ ½V8ńccņ µĘ˜œ3”A–ÓtĀ<&„j.…’MČ4ĘŅ)6‘z³éK坍`Ę’wƞ“($‰85ƽ,"Yšöūżü𮱉J ›‘ŖĮø8?‘śy×:š›Ÿw&ßa¢˜+„9„4Ś(Įƒd»vIįÜyœšį%)F)Q…“"æ‰äĻxõ?D5 ų ’“0IįŻÄ&ļ‚gūÜióč‘«NN«xX‰’‘ƒ3J‡l}G*ųqĄ]køßļ‡~į$Q1…ڵ£Ėu?,wÆ©lgŸ £pŪÖņhlÅń¾0s§“Ō>°dC \a©ŽT®ŖģqĀłĢj­³Ōx8O~:8Ź„B?ŁĻĒär˜ŽŖmŪÖĶĖ«שћ‘įą†ėÆÕ Y–1åi)—©™šĮV,H©:„n~“Öė‘aÓŗž¹’/[ė˜'ŒÉœł:“²öČG>²2_,!0XŖصų6ägmµ*Ķ¢nāŽņ²Ā"D.«õŠ Ny‡§Ø“4ÆĖqÓäƒ3ŌGP%lęŚøģ‘\ŲH®é#R@m9¶ĒGb!RÅ'oBz‰1>hEļ«-ž’!Vķ6=]ŖżBłĮ»ątsx•‚Rčv“ŁŁŁß4¶Q*3—Õ†)(žrš’£Ōs<Ūł)XŖ<Ÿ­kp¹ühoŸńgUx±Q¬}j<¤é ]I‘ö‘u{’Ę ‹OT7±Gl¦źčōƘ],DŃ.–E©ōó”µÜƶv®¶īÆ8Ž{½ŽF«Š#GµzwbaR› —g«³õN^³»;ÖĶŽŸ‰–•\Pq ĻÖ_lüŻ:«’…φźÓī« Ä2•ź€t@¤l›r=ŅI’HÓ,/zѲRŹ ³8”YæßY |;Có¬÷µzcŒg#9×Id†ƒzū[WV—¶ļÜ“eó¼ŲA'ĘŹŹ>„²…Ån·ÅŻ8žé.­­ZąĪw¾³ŸP×t°n%PšŹ<Š‘§T®ÜWĶł©¦JRCÄĘIÄÖrU”#O)Ŗš¦ÓČ<,ĢĪĪĪĶLi·¬}ęSŸŽ»gÆ„®¼ņŹÜjŹ8śĻšWœ±ƒä-s}ƒz4C‘m•Ć-;hFĶ2“R1 žö¤§®eYf­k­8śŲc­Č©„6Z•.$| »‹ƒĪGŪ†Żk¬µišŽr‡j÷ā-vÓIÉ5É+œC„>_­”½īü6)øn?tnCMÆµĆ“Y‰FēźöDĆGļŁæ§;Üń§æüåT'é(AjkŻÅĀbēŗ«”“)Œ° ”˜GČs1µ6W[4yŖ*k9M3׏­˜a6ģܔyÉ?—Č‘| ɦ™_źYf‹žš²Ą_]¬{o6ĆD G-8夓]PcRąśk®§~Ė”g«ßJa śĆ°Ļ¹æ6pfĮ‡CQ%IĘŗ~ uˆ+,»–Š\®¢`’«§Ć„{;Ͳ̇"MĶŃTwhåę={²,Ū½{O§«YÆ™“Ÿ¦k³Ģ¦«ż5« @f?ĖלQf‘ÜżpYūR*摶ś°gįßŖģE†µv-”yʰXŚ(śļD+€!pÕ5×­­­13 n½ńĘ/|į ³³3Ž;~ēŽćĖ%ńŌøK­ Cˆj³ńŌŽ?fŖŪéĔĸģĒ?t.6AīWvŖŹ±$B0K0”o„€5Ė)Y`˜·mėl§÷®ū÷UH¬‘e©k ;øop—»ÜóÖ}+GŸpzĶs'*Ó2,Ī#*v8³1¶ ³rxN/3«£¤c]$&Ć EI7v4fYjśkƒØĒŻ“ĖB\,cCb]«‚ĶÅxEø;Ó+¦AāHSN¬%ŲéČg”4 „õŗQ¤8‘†ĀöŠmŪ6i@EĄõ×\ ½!ȉ{ór›ŹånÆćj]Ībō¦ŗžg^ņ€”}ŽFQ J©Į`›SaĻĶ͆y h­\×±ßū9&…©N§ėr%I’ŌDĀżŃsī9÷IĻ(ź*,--«Že*’$ĢŹZZ[¶ŗÓéą³_ü"”3ZšJe·Ā'b{ŚéŖ’„¾d‡ū׊[ c+Y†0;¶Q(UÉU©OX ‹e0;ļ¼L,4š#ÕzaēŠ’ßųĢg®¼üg·X9dĶ̦Mi°fiŗk€Ÿ,ĖŻæ€1'ŠņžA_Ņȳ<ŖūN;ó„±6BČ •;ˆõżCN>‹Uג¬‚'=ė©ĻĒŽdU§d’ ›ż3ThŗęPŅŹ‚™D)•{춘}pfÓ/ā/zĘ3¦”ź]p’]ü„ ‰&ĖæÅEģ0xhóN &æŲäę¶Ł³–£n!/'B£O cņB¤mm…ń(z¶ēi»ŁqaŻŗ1ć)„ Ar…8ėĢUé‡nÉ$4f„N- &éńkżs”ŚšH” ų͈԰™SūÉCk’ń(ĶÉ«O¤œQ'õhaNjö£ÖśŠ $ó½!™Ti*ĀŽ$oÜ'IĢ„Š; øGµ°·RžNN„ėa$µyĆ” źu¹Jøź:LjV–WŸTét¦Ņń-\=jś‘5ĘWŖ2& Į+!…‡[VekØĀ#ˆŚ —D ŒjŠŽ| Q{鯆c™¬Ń“kć§„PU¢ŒÆž¶X½Émßŗ¹Ŗf†»ö-M0źś³X/ėOä’_ƒ~ß9=^ •h$„vó{kęČ'Ć}yŲēV(Gōø]Éh7ØDKo£”Ź»óF‰b{”ÓMŠü”OEØź®¦")“§ŠœK HøˆA¤]i%?_”¢¹“r±-„ꇱŸn¶ā*ŪuĖ‚Pjq©¬$ńßWkrJFĘÉ>¾ Ė6 UaTµiAø›ĻøÖŗØx‹C| CIŃI^tqD:óä%¹?1Öpžé«f:*Ķ5©‚œĒɝ}öŁkƒ”ˆÄq¼²²r`Ļnį)@”Ų¼£W¬Åj°vķ™``VŽś¼g=žÆ_öGgßé”[oŪ?33³į˜łĪQ[ē7ošßßēƒC{ģ);æyńWA%9…’”q1ē€f^>§i¤4±h­Ą°®¾Vōy2³ˆÕšņ`€)%–mĘī–ć$źv'#Lq'ōWÓįŠÕ4ˆ­q8õ<4«94e¾nj’ČĆ=L>åVņĮƒ€dzŗ·’~Öf¾Ūē˜¹B.D·P4‘:™ÜœĮA¬čHYĆÖ°•ˆćø?äéĖŖYö›×eh=T”ŃfQQMoÜÉ =z~>V”2¦ ŚŲlE¤¶nß%dˆ‰d:A‡-Ó@ē?ō”~ørŸ­@gøŽėBóœ)ŠLŽ÷ĄH)z <@EʲĢ/HŃÖAAa¼†šøń§Ņƒ!ēbfŸĆ"“ü6§{Ż,M“$Ž€sīuÆtu5‰°iaӓžō$æ¢Zeļ[›ŌŖų_ƒ…H)aŻ¢K)g#|žœWB+hJÓŌ„M5„`‹j¹#k“Θmß¶yfŗgŒ¼žõÆš˜:šI|?žĢ¬”ˆ‘‚ A„”(%6„]?æņgŽż±OxĀ>ųĮ9ŠŃŻ™k®śåC/8’W—]ęa#! @)+¹øCĪ%=ŚŃUßh “é’mØmøŻm®zĀ®eÉŁ«uOØVzźVŠ„ĘVp֑*e·g“Ēr5g·†­”_C¹Œxa1żļ„;"p)ĢPµl|=gŒęMÓYi"Ŗæ”'Čø8y ĖäųÉIց'mS’ [ē7šmŸŌ†ØU±`£„F£j_Møõ˜µ>Ņ5lVHJī™ššrP“LئėQji¬ ‡¶“o› Īd uĒ3O†™ΦŖųŗ‰B¬rÜ< iU³į^½Ŗ 5/L‚É?ŒŹóF­Ųį'hF'€ZgæłŲč„E`077×ķå*(ˆØŅN?Fį iÓŌ”UēŖU,z—Jʗ¼C¬čŚ­Vē«į{×°”5ĪßK¹(ˆRdŒułcÉR#€ćIÅ+žHP?įć–kĖ8č/Ķ U˜lŹ}D>*3WzįŖXå‹K-‹Ŗvø„ń°?"×ĶKbD”x#Üo£’-_Ŗµ*Ļ­Šėõzyš¹#')Zͽ ÜKEZ«€¬+o éŁZ`äA`ģ~{ś3ž”R#żĮŠBžń-’«ž¤ÄVē˜,c‰E 4Xdd«’šĘ7|ēā‹ßžĻļŚæļąQ3Żxøšģ?8¼e×”={iĀŹppÅÆoąhN gČ«”D q‡4KŽ©±Ęyõŗ“@‰N“ƒD° ę2> œ($Š“¦’q‘ŪUW’ā|ž³Ÿ#įŅķv ņ˜*Ņ‘ °]ų£”ŖÄ7^ƳiPu„kKš"ā}Īsžć.2˲AjöŻ|³Ÿ)Ļ6T9 rYdĻŗ'.Öu’]®LķcŒį ՑŹcĖ~śÓŸ‡CĒ.&EžĖż7KM‘’ ÉĢFz;M¶<·Æŗńśƒ‡–#įc¶,,Bo‰>ø¶ść_Ž“{Y)ŒÖńÜĀĪ“NŠ©#Ąē>÷Y€Į`ĖD„×Ē1[Ē"(Ņ­ÅŪś&i°»© †WĄ\…¢K%čŸd‡·žą!}f.ø¦Jā+„ŌÉ'žB€Ķ²x÷»Žµ{×®$¢DG:ļĮ°€D®:%<‘‘“i©Ā7ƒ«U޲$"å]`1ńK4ēMģ%@Ī §±Ęų:Ū?žÓß°¶²<ōxä£~ŪĖūż!€8I&ɏW¼q‚JXE™Ķ“'+ƒė~ņ³ żČŸ\yEtˆR’ƒéŹņŚæ÷øG ĀŽŚÄ%Ā„€ˆ¤Øsŗ!–ŁŲÉżķŪ£ŗ“ŃY[÷5ąw™æ}~×ŗ‘óŗ-¢·’ŪĒ•ūĘ ‘G±ałN*ŚÕ¶č˜cS¶=pb€‰D9ąFehÓÕš ­š…AC{yŻ)©ōZPyü×½£4?֛V5kcžœÄ­ÆæŻ‚„rÜ;O䄵Ȣn$HsZ‹ŲwŻĄ×ƒ¬‚Ž#(•—GŌłŠ ‰ qγ¢5%Ļ’H /åŗŁ×„ĖĻ‚gčr‹aĮ@¤–q  &ó‘+GJéæ&qцźē‡—e˜¼DÜdŽ ßx; š× ŻuM«9€Ņ„挂ĘŌ®<ÜĖä^ļ=­{v—šä܋uįe…/§ö_·ėU€6W9:.³VEė¤Ū‚Š(ī8„Ļ$‡?dTø7łā¼šīżRŖŚ!8¾³V¤ir­‘č·µŖG­]NøWōJ5ū‡żó!0ĆżnŒql:Ź›”«<üüš{Š¢·!üœś¼©õ„nżüęÜŌi…œYēMj]o«nę ĒtkŒ»ŖRD¤a­õwj­u+ ¦ģ:&4Ŗ]ƒŸ»0'=”›Žęsmė|ƒ¹Š©Ā˜‚pĖĒr{±Āk¢Ö+TkŲ„–ó’Ɗ¹OhIņT·h\M¦u%¬;ŌįĮ§«)’É÷g y5.säZ-óē³,sź ėbÜķ;ŚŌŗ,aā+·a-Xž—É>›}Āł q§°Ś6¹¤SMFk’}½īEŽ9C6 ńn'2s»~»N©² ̬ÜWīlłP?Tj¶·y›nw¤©I’(˲(ŠœApLĀīC!–Rd-»:!3;åRO¬ ~x«ÅÄĢģÉ˜Ł“ŚIŃf­8ći »²–uRÜŹ[qĶ„Īß.p Et°Cīü5Ō¶:Ģ’N ąąCóóó¾UŽ­Tf µT;FS0Ė2µtĪ·nQė”ķyęĀ „,”Ź8Pƒ»0†å7¼śoßųĘ7¦vȡћ¦‰3¤Ž¾iÕv:±Hö‰O|āųO=łō;‘0Y–EG°J ŽØį ķtkŲ›ī4ĶWš_Q«««S3ÓįŲ2³ēUt§Ŗµ6ŠćįŚZ'īB«Kų½sī{ߘķö–‡}$€>ņɏ=źwĒn•*ė–,㹉ŲzI°<„‡*N½°ræ‡ŲZ«Hzq‡ ³Óʤ+żl’ҁŽĢkŒŽ=… Œ±q¬½ĻVž¤UŅ»ƒu»Ż(ЬµI’ä(¹‚C><µ)vuW—§ó6 „µÕ~·ŪĶ9®kłt©n¤źhœ{ę®»ž*„„ˆśk–Ż^ņӟžtįÄS<čwŹ–Vwßŗ+Žćh:ٳ’ŠāQĒ’āŹk@€µP‘ˆV"BE“­UZ›Ģŗf{›qXųńwTz#A’Ń’é6”siź› •3x§¦¦[ŻĪÜźēų.³S¶n=°oo¤qÜQŪīŁ³yóęƒizżŽ„Ļž3~ų# “Oølōä cw˜ś‘¬[rŌNBqÆ·Ā*8brX’_·Џrvß»ßķ×W\ŃķFĘŚ³ĪŗēæłmčxĀ ¦Ć·ŗ’^Ķ „`Yóžw¾ół/|€ĶILD)IiĀTB1Q·Ū=”Ś{Ż÷~ŸłŹ’€“@ D!WłčóÖ­ņ õĄ×˜©Į€=1vz4½āØEU+ēV7#ŖR£ D~BI8\Ć©<äŽģ;ģ̘ūeC÷ŗļ}œ#i•ÄŃūŽż®ku5Q$F‘A,P®ČÄņžśæOŗą‘Ū§f^’†×Š ēcŚŽSŁ`uå`GM3Źą~’¹o~ė;|ĮcN¾Ć„#§ ŠA±Ņ œ™@:GF¬ śё7ŻöG—|O˜M–Kˆgf§åtqbŁÅŽBŒH[+¤TĒ`N’żÓ?¾åœūŽW10?;£½ˆ¦»ÉāT÷’yÜ®¾ņWJƍ©Ų‚Ŗėˆ“»nš°å8Žć(R.āėĢ®šˆĪ>ū^  qw"ÜvŪ>€™3«fį1Æē3¹ ED†ƒŌZvXh¦§§»½ŽÖŗÓMŹö)w\©!(lŲęTŠ#W>¶y®Z‚¤m•Cq嵿īgv``)žžź š[Y8įĀĀw?÷”—\uSß²īMķ]éčć‚ß~D>}Z圅!¾ˆ;/“Ö±®ŠĒÄŁ^æ”@yP Wć/ØxwczvĀ?˜ņs³hzW Qā‘īÉć?n~n*бwļž^ÆsąĄ¾„•å掯ńą‡’V©u<ʂLÅrŅZĪ"ł v½æ™“Z_%ųš@ĀĶkTÖaŠĒ`Ńåņ PMī¼5}›l¹YµžŠ8Ź™ŒF —Õś·Õ“Ē»ÅT3ŽbĮVHƒŅīN(QŻT‚qb D˜‹ėč'Ō$¦BčrÓ¹Qņ‹_*\Uk­¦ØŖĪ§¼ķ•ĮG õHŸøé‡‰Tę.“ūŒoMciÜ] ŠZ+”œ5„6fšÖ£Q„²0Cå Š¦éåōl{–åīĒŸz’M@y'æQŒ¹©„R©É<Ņf|•Ų¦īC¬å2Ą®yĄ#>gCĒF3°oÅĆ“”4]ķ׍£ŒŲ5ĶīwŁX0 žäN§ƒB@"¼ž‚ėņH›BŒ+4øółĻžō'?ļĶĢ”ē1ĮZQŠ“&„b¢›­®\|ńÅ'ÜłĢc>¶(搔ø\7P9|ZGQ(—ØH…¬Ż”÷ūęķŠ1łMœ‚qŽńAžįÆøUj9O1¾# 7®‡lƒĘv?¤ŪK†kB„……d„‹[6Æ8tÜń;·ļŲį›ÅrTˆ®)hā=Ż3kkk½^ĻuŸ»µ„†h–Ö1`žōĒ?žŁ’žļ_’ś×w¹Ė]ßžž÷@A čv7’l¬ƒY¹ń¶ĘčXķ_Z;n¶'"«Ėƒ;ßłti­ŻŖ³6Óz'ņ˜ ķ³’ł±+téĪn«8QI|ėĮü¦dρž‡?ō¾'>įÉ_ūģgūŲĒ/.Ītćh-³żµAwfš‹&„Št”@yL!ó&kōʇw¦°™$øœź„¶³=2Źu+攂£āxĢėƒ-xž®†g‹Eė©|'å2ń&Ž£0¼t‰’V—īˆ÷Ž f0Z«i£pöI#”Öē‹žaŸķ”b‡ėĖ(lJ”:”æKoÓR֎|ś6Ԉ O¾¦×ŲÖŲS:µÕģ””[†;kE2›åŻG.0®xŠĢkkųķÖaé ·`X3Éńyæw6Šd|j¤Ó£VQ­ŗå{ļ7“>s_“`Œ™”}{¶dėŁęƒĘł \ -'Mö¾šĮ2©o½V€Ih6Ćŗµ¢µ³ņ%–"5rM¶YÖƳf?‚O©ˆˆK»ä“*ŁĖ¢u³$2*s6i—¹ŖjGhŁ.°µ¤5s^ÅŅT½W ŹHÅēųõģŗ”kł¬¬¬ĪĢN—ÅFļ‰śÕąśżF$YØZV*hrGé«zöĒ‹C”=„²~L˜1q×y©b7œėéņÖ²ŽÕaģŠŪu–±7ĪõÜD£Ų)š_“¢½=×ŗŃhā"¢Į<< [­4ē£ D†#cl7Öéž½ü¢}ł _\Y:«Ų ėL'ki&"Ć›7Ķ:ø²øø°¼¼¼sēĪ[÷īY^M$tĪ}Ļ}Ė[ŽrÜqĒMoڊ¼ ݰEoŸ–|)#R`µ““:ŪŗļYwŻużµżĮŹāĢĢ`5ėv»Kv°:»ŠQJ ²TDV„–Wķ¶^O)e°j-:½ł==ł)Oyę<ū>ē=$ \̀čŲ£vģŚµū“řĮ`°‘¦Ę)°n™‹»Żī-{–.ļļL-²E9ę'"(ķ&ĀIåc+õäNŲ›b­čˆŅ4UŻ@Ä4XgŻįK{v­,ƈஸĻW.ü&ä'/Ą0J)€3“}šŸßÕI¦?ń©Ļ¼ō„/½÷ĆĪ£ŲĖó’B˜¾ńą’².ʀʹ3IJ«U”½ėkŁ…ĶJš±õNx©° Å;:jŪÖC{÷mŸmšMOOĒQ7SÉ/nøÉM®±¬”*z/œBO4&f s‡ÖVūSÓ½0Y&’Źāv-5.ĖSa=ئ®J6‡UFé:P`ø,9P¦(”Æ~īs—^zéż×=ō”}ķ›ŽTīÆŹeˆ9żŲcśöOkš™™IŦlöķŽų÷ĻzމU”ļv1Ż®PŠB\€ēD¹žóŖUD ³āosqvŖæŅ`vj:J²Ó§?õÉÖŠßæł’nڱ ˆQœLÄ·ÜpÕξļāŌōžżūWֆĻ}Į‹’ś’©0iŠÖęä7RÅ6¦LäTØ!Ŗš©Ŗ@Ą{Üńō½7ß8„ķp%ķv£,3C]š˜ĒżéŸæņ“3Ī€Č>ż)_üō§ˆ(ÓɁåžjEė.\c|nŠÄ%]ß¾÷rŹvų”¶t“TDMŗ‡u}¤QsĘŲcā…u«¤=\Ā~ņš{'¼ž 7tU­b›$ˆ­6jĪZł1 ż=%É„Ēł$épÖĆŌ~k ֞Ƙęö7Ž`4 ‰=›>‡(;Ō¢µ6N¢\M8œRł¤™‡Ūtch'%¤iGE‰ĆĶāTņĆ©8CZĮ¬NŌ_éŻk¢²z€&†Æ•ŒĒas„œŅ©?ŠBÆ®Ę_I­„ĢŅNŻ1ŖŠŚŗ’Ū§/„eŖM5éPYŃ2Q”¾²A8בc+P²¼¼¼øøxØé1ä:c"įJvĢNŸxcŠČ‘7‘Õ’ŽĶ)R{’µ–¹,jĪG©č—q`I8!ڶA -(iÕU.…^ƒ÷²UŅ ÖrĮ(F­ŗ‡“ųbģ`0t ^ĪÓõʍ­5Ę$‘VŠƒjyĪ”ƒDd3Ö.4Æ@éņM.ų0> D€Ęź‡×ė&ĢžŖŃ|ųĶŅGż4‘¤!„H~]»@…cŗoŚŚp$ŗėˊ‚8õy‰„Ø9s9ŠŻŸ}įŖrtč†u\™²S¦ˆt.łKt¶Ś;ˆˆ’ķ½xęļ?{ĻĶ7¤ĆՌTwf ƒ„t-=fĒŽ½{÷Nõ¢˜õTwjϾƒ üāś›Üe>äü~źSŸšīN¹&ĆŚv(3ŅīÖ]a˜›&ąŚkƝ›ŸŚß_ÉÖÖR樟ĪQrŅÖ£ꥌ`ȑš›Ÿßėž˜ŠxeµŌ\¼–e žČ‡/ŗč¢ļ|ļ»s[w°č¼‘Äšī$1pp­ßķv{ifłØ‡æõ’¾ķŹ_]ż‹/īM-ŗč‚­dY։—‹qIŅŲĮ¦dŌŗ-q*&°DĢ®oR±@+˜Ą¤üźŚkTƽ"˜fa‘Q,"üźū—¾ģł/ŗįš«³,»zmˆ’ėkŸ;ūNw’ž/?ī,%7aīᐲÖ:N)„ÅŁ+RŖéw»ó÷~šP'Ņ)›§FVMBBY+Ēī ` Õ~:ßŖ˜2ѤZš¹œ1«QźJ%‰”ķĮĪÖ夶 Ķ@Čų-Æ{Żk^÷·„RįĖ~śćo}óėŸūÜēf¶n%'ęKP>R‚>åÄS®8xÉžå”U_Yƒååį3žńL‚VŽZUȑEMZsĖ3†ČĮĒD”D0釒żßo½õÖē?’łS›7ƒ`…E„” %ØæŅß4=57ƒĮŹŖéc[—>ł”šķ/}ęnw»Ū½Ļ9ļ˜æ×}ī}ņ™g@brż{¬ńć+÷ģ>4µ3†V*‰bā'ŠlÄ–@Āā€šÖZhŅZ‹ĄZ‹ŌFQD9…ˆ•æ’ĖWßņ«+§’H¦gT&lćtņī’Øūš/}ń śČ'Nܾ°{÷At3n»mĻömGхõ£ČQō‰ƒ “|>ŸŪe]+±•3c Ŗc¼š¦c3Ž jŅ ‡Ēn [X^ĢEōėĄö)±QrŪµajku€7^Bq¦4 ˆ’n9ū×e9›pz<`ø©Øt“žĀP3Vx«%¢Ę!µF½ėHIx‡Ģ[­waŒ‘8‰Ö©Ååt‘%X· xk÷ĘČń¹”y„‘-”„ĘšÖFFFŅʒKÜĀńyo µx±#`l?Ćan]io#ōĄoB-ż/c’>ĶÓ=챑………Š)ߊŖyįć£āŚb[—Fn4°g4ńzŌŖż†MĄXQ­A#LęÕ1šš[ąóM„–t›T׀§“Qze‚É%”¬µŽę-Š”ˆ’¶­T¾Kk¶%Ą”Ūė“4Ä”ÖIl RīžŽYåZĮĪ?ŽbķbćÜE®®®pH»ŻĪ80Īŗ©+ ņ€D€ä,.aį aĮ[[å[Ą ‚1ŠUkõ$‚N­×š®‘KaŌŅŹ­QĮ‘ņ¤@ö šśšmšŹū źŒhAž”ą)†¤°<°ĖBĒ*š8‰Ų8äł:*+$²lÓģæ>ö±Ļžóżä'÷Ü|ó×¾ż$RĖĀĆžņŒ‘8¦•t°<4³æ?ŠĄsžż¬[öģ9żōÓń»æsŸsĻĮń¼h(¬•Ž%ØŚ:qńüÅ_üĄsļC–ö¬hĀĄrJ‰ˆ(R’`?¤©t:œXźÄÄ,V‡–±†Œ#¬\Ż4Żcā«ÆæžŽwŗćM·ķł€G0X^éöŗßśŚ…×^ćüģŌŅjiøzō–…cvlā³žž§Æz%½ćøStžĆ%e"†RJ”²€v™^ķ ¤uź2iŁ®łŲD½ÄqB+aXˆVä²8+/üFG%.üŹWŽśwwā©§<ńIO>ē~÷øčāKҜ†"bfŹ+‡”ŗō²K}š-‘圠™Ćusu€ÆJX[ˆ‡c³,ėõŗšł5QįFØĆXÜ¢mćp‘+®øāw:sph7Å,63)·ĪžāēWœpĢŽOę '~źüę­Ģ¤”žFB³‚ż!øĄ8OIsč”RY3,Õ\’Ņ4Žā—Į6‹‹öŹŚėźž FDˆžśŒ'~ō??3†éķÅ?üѦķ;Vלq’hQPU(i’,ļ[J3± » §;dŒœqŚ©Ŗ;eÄALŌhZć«»3 ÷ķżłŗŗ¶|Į#y×»ßåŠ+~%Ą«^ūź’šGgÜõ® Š9‹ā,!¤ŁŚŹ”×ė,-;333ū,’ņŖ_ćāļ-§Ću‘@μĆžņĻž<&™éFƒįŖåTižŲGßw—³Ī|ŲæÓ™[hu°:55%‰ R¹†Øv„8®»ęśrĀÉ'#(i|ź՛^ß’(26‹§§83Öš‡?üp££éŠż ˆlYLn<øķ¶Ūv}|įę"DČ‰Š;V&ī¾™¤fŪōó'ńÓ&qźĘ—@\œV>šųē yŻG6õiĻÆĘ£C–ćfĖ(:Œü¶£.ī: ł÷$?f©%ą™4‡į”nGʇh’źHcœÆĄ*®fB­°y£5ķ–(īs(еcA̲B^¢µŪŗp+wx<¾.ü9ń%V#8¬”v©½\– ÉŌx/ЁĶŪ :P…!UQ£^g܉BÆ·ĘCE+Öå­i^ }9IćÖŚō*ˆŚ².ZUŌŪÕaö7óhė~Āķģ· ²WtDzŚ,ĄØµŒ2åĶ…³.OŪØÆ`ķą»|A#č̉0†d”VĢtŌ¦5ŠrÉ“\O ·ź±W.Ų9ÆyKE i”eŖŌx+;É·Bh×E¦dżŌ€„ˆ¶@G¤ 1Y»æ}Čcīˆn{__ᬮ³%ƒK-„y hx˜–RuTČų,[HwSćL© @­ÕmHŸÖķa 5M­«Ō·PŗR'‘ LJAĘQ}ž“ŸxÕ«^ułUײp ¼öµÆ 3’[ēē–——-сŪžvŚ)7ßzĖŚņŚæ¼ļ_ŸöŒgä”6®Kީʊbk»:Ś»gߖ­›€ŗtŽL˜!üĶ æ:$Ćt!hIXV׆'Ÿ°óō“O=å”S^õŖW]sŻ­W]uÕQĒožę7æł’š©˜L L?Öz”—LĒńė’ü/žņ Æ))źēÉܓ鯾ļ_ß3KHŒķ³(„nŻ{šIO{śŸüÉK2–#­,CĒ –a rÉJž"¤§7;€@Tœˆ)§U.ZSbF¤Ģūw8ŠŅ4éMæöÕÆ™éém½čņļ_²­§9™Śwhy(V"±¶H%®ŃVE$"Z"°Ó5Ń^ximmmzz@ˆ²|ņŠ¢HSI¼”÷ß*­[½#’ŹVń!"śö·æ}Ķõ7o™ĀqGķ\:x@ģ@ƒ7Ķwc…sĻ=ļYĻ~Ś?æ÷}qDn:!Ć1»†Ŗņx–­&ŻāīS„2Ü2£Č ³åøøö—¤Hkęš½(‡ćŽżčŪßxōƱÖļŸ8?·““Ł“;÷ ĶĪĶŻ“g’æ½ū_žó¢?†ffVEˆ@ĖżAŹĀ@Q<¦gžuW@¬°v’ŌŠĘ»ø!2.ōį?šO’üįųŠ_]qpy¹¼ü%/]ŗźŗÓ3kÖŅįĒ?ś‘Wßõ®¢¬Kø¼æÖtĘOŗõškŗŻŽEŚ_3‘R:¦‡Vvī˜Ū·gW'S„"s³³°©é÷\uõĖ’š¬I»]Ģn[ܜÖĢŹź‹Ÿł¬™éŁĶGu×»ŸuĖ¾Ūžžō§’č[oŻŗõū?¾dēĪšœēn޼ł oxC’ō¶ķŲńéĻ|žėß¹ŠXņī0Ž÷oŪw£±ŽJ)ķ:0xĪżį=Ī;‡uŖ"2żĮ×¾łÕ¹M=(­5ĶĻEū–֝QĻ¹å …œĶ‡ʐB©Ą*J‹æŌ*|pĆȐv£ļB &<ŖZsŲnēyļ:ž­„-”mķµžAzp𹬄 <OĀĆ\§īhBUkrŠž_ic”ą$ć;IĄ<^j·qĶāš˜×ČčøRĻC4½•ĘæVTŽ©*uź.ŚWf¤lĪ;Ź4“ŚEmˆ—öŃKNīę\šwŠ jéEŗÅ³ŹŚ–Z·3Õ °¾†€ß($Ęē Žr£›®Mȍ]NÜŅ­]”Ż®„B‚ ±ÄsŲć]Ń杚oć7Śį­'ß¹ķ€puŃĀ.•óim–¦iÆ×›äHp®¼y֚dŚą.ø"IÄ,®e4\½a?§÷}[©z+hĮś.Ä\›ĮŁŠ.EŹI+)rdĀȲ,éĘ~*ōŖ"BšŹ=|©É,€(ÖyH,ÕZ+ĒsSēŻų„%«Ū·¶˜Žs†­Ė±¼’@BеŒ¼O·^$õį t ZW~ČX¹ī•ÆSq|×CÜö“”iPnĀ·ĀyFP­©į0ķv÷9+ĖĖ3³S"ņŪ{ų„—^ŗļĄ):5h~jvŲ_6"«ŽV¹£Š‰ćž0{ÉK’ųõoy³‹Ø9÷ kRžtĪĖn\Ø÷ˆöE„ מāWw:óŽ=kąz5„ †‰żō§?}ĮĆŪ*),bIĄX[Żżžwæ÷³ŸžŌw¾séŃGoŻæ’ŹĄZĮ{ß÷ž§>ķŁČY¦ņmłoļ|ǽąEs]Åk‡Ą7^·å装óNN)BGĒē$Ö2EJy¼O‰QŐß#Ķ‹„43QłāėźC?üžwžų{_ZķµyŽ4ķ[Š ŅĘf įP_˜ Z/Ū~¢\tŃ7ļuæó*ELNj8lAĻ{‰źčÕmR‘œ-ņ†Ģy#vdŌ{˜anČ1ć üō{ß{Ā£!©™›™²Öö3^Y.lžķ§CÅ[wó½Ÿżœ(b© Z“T¢¹%­µłŗ wH3° O%®sŹ„'{<ßµ—X!E5OLó/’÷Ÿ’üO^²}~ney‰Öbėօ={ZA§ƒ{œ}ĪÕ7\÷‹kÆ•5!bįßyŲCæżÕÆk IōĢģģ-ū^ņćžy·»ē_Ćā-'0¢2R,+ģŲ·g×yē÷««~͌˜ŅJ ÷zĖ™1 …ÅÅ­ūøģ²+¶Ÿ|"(J ŠĮ¼ćžńå/{ŦyĮŚŖf°@’. V•Ö±ć˜éÅįŹ€Y-,,(„ Åq¼ŗŗ2'02;;»’ąAc9TKCDq¼–e”GJ !ĶĀæõš‡}ń‹_ō5×žÕk>ų–7mŚé’K~”LĻŠŅ…’”(·ółQ‡T+hwC䣓‡c²µ“ę}6ā¦Ķ­dŒI’dCŹOMā¤QłÆ#õPė~ż˜üDkPV+˜Ō›Ē» žh‚6Ģ’tķD^4RQžC-u¤fž£Õ”1Ę8”u+±£hm ¬iåłkn €C”0­Wg®~“ˆŌ :£u'ń,5ˆ£r’ưŌ,°Ö:aOnt'Ń6ęˆ%¬eĻ\ė¬7„ūØČWļ%ö…,fēß·3 ŃČR˜÷ķÜŌķ&®K–­žž†ą¹šœ/_xįĮg;q d¢¬Šŗ©DYŃĘAŹˆŻĄD‘ą¤ÓO…h" !åpń ņ}ĻZ1‰Õ0ÉĻ™Ÿ¹źB0~ė”ēO[ē =Ø$’!Ģ=īqöų r¹™H”£ØljfĖ ^öūÜēļwžy7ķŗ-Mķb7ī’šś’³“÷6@¬b«Č*‚šīŪö$ĄtŅM“ķFčõ’Īō, ‡Œ…€Å°R*G$čH`H5;²Ż‰Ģ­ PÄ)ņ)é0‹u”{Ū삇=d˦M¹ą‘=’óŻt°6\]3¤9ź 7ÕYˆDŖ3…åĖb…äóYOŅĪ[>ü‰ßćœsÉéįV·Œµ¶ˆ{sScŒaęÜĮ c,pš„?;#ź“j©ÜÖłÖ°Ör æä·€¦:é}ń‹_Š¢$Ž;"d­t’nÆ3s7NŅA’ē—’ź{}Ū­|·ĖæŃ(lHX vģÕ Wᚮw“*h„ø8‘ĒünR€‚ó]sxŖXó©żēĖžä% ģ[^YV€”ĘĶ·d…éŁDzŻÆ|ū;{‚(d–Dƒ“ć/ŃPŻn× S{huĶgŽõ® ˆuwdŒk> b]A[>łŃ’øļ}ξśŹ_ļul/jtIf§†kĆD2hAEknÜ»ŪMA$ ±€zŚ3Ÿq络¾’:3sˆ%īFÓ3¹Ł©NMõ:¤YiCZ„&ėNwֆkŌUVĢņźĮCĖū gżįšŽõšMY‘hÅÄS3ÉÖ-½™Dmėa{ĻŲ6½Ų–`S¬\ >‹ųĖ’ó„뮹։9†Ć×¼žõ7²›×–÷ VķtÄ]ō3<ļžV`Ō¾kn~Ź#ÓšS¶m2KĖS±Ž¼Š›Ÿ¾ō§?If§”QŽ~Č© “v¬Ża[ĄÉ¦āna‹źj“„ģ7Ģ.QūXf?õ~Ē…•įp3ŗē•ŹÕ°šĶ¹c$j=×~sÅjCžččē[Šacf®†=fVŽųż;:Ŗ k UÉxĻ»ņśF/Ś‚=įzƽ Ö"Ć"cj­ Ō÷1‚>° >ƇƒK$¢Ü5,Ł}’N\©I!.ŽŻ1ģŽ:4x°Źļ§vW[iņ>t3Œ±ž•%ŁĘˆh¹˜$ķs‘‡ī Qa’d[Ą‘-Įš†­u’$Zk­£(J6D 7n…Ėø@ˆhģ åõźU;[Ū"6 Æ[ū=Œī÷fCéxéö!ėhĆ„käsF%æ“Lšbh{AӀ03³ŒŒ•:R¾ą#!Ŗ™Ś:)­=]’£=•?œŹ+į¶7†Č’€ ­4üDPJ CirźNP¹äõp8ĢO_ v kż:lÅ7A g7HZĄŠóö +…žsm1ŠżŖ BŗõWćD'^yµ„^¤Qł¤¤j£ņÖu¦ęHqa”)]Éy€ÜĮ@œĶšŒ('ó½<€?Š"cLš¦ zßū’͆Ję’d 肧@™Ę®yäćóī~Ūū’ńmgLHÉĢ,tžö/_ ›—“"K0&­@`aH\y3Ļ……G’ˆDĆŌĄš›o½yz¦Ėb“B¤4QjÄæ’œg éX(&Ä0ˆ„5[ŠĀÜā–/~é½äOś½Ł¹¹ł™k®æęļ|;ˆ²žpø¶¦D ÕŸżå+ē¶Ģ­˜¾ŠTw*é÷ÓøhŌwƒ«Iy‰*+VH"‰e?5bĆ)+ę‘ó@ %ī”'›]żóŸ?āü‡LÅÉ„?ųīlB[¦;ŹNM¢";“GD±²ÓSńž{؏®Įɛ7’łs’š÷:ē}ļ’ȍ7Żö{ū]Mģbµ°q1oŠT9gÓ¦īt’zV~ód ĮYįŠå¤Š²©Ąā3†J)GļēæŚEŻ’NēOyŹŽōfDq’ ­öZZīgƒĮ€ˆ:ĪtWżźŠ+Œ£Ė¶ÖśDÕ$^{ÉŻ,,ėö2Q| "2A£tX+֊7*–Į¹ā+åĢ­¼öUłŌ'=U³ŗĢSŒ{vŖ¶˜_ˆßžī·fȦćhÓtü¢ēż!`8Q\–#€•}K ³óBw:›6m^]9Q€‚ŠÄQ“ ¢(Ŗ„Z(üa ‘=pėMÆ|éŸ<ėÉO>pĖ®XK˜ē"ސfĆNO/§&’©Žžżū;q|Ļ{ßĒ5„Ć¢lµ?»8żĶo|ķü‡ž·k÷Ņń'lš²ÓLńŚ%fy87éYźō¦—ÖųĄņ“źõzčĘčD²u®—÷",LM+„VWW&õŠejŖŪķĪ$­ÕJŠ”•,b”X1HC»#źĻžō%įÄm[’ ‹ŻNbaśĆ—æō¹[Ž>Łš²~’Ģ;Ž”aŪāģņż’™$¦A:¼÷½ļ÷z\s÷kyø»•Šzå˜ZĀ$QėØ"óØw­KǾׇ²­įOķwļVÕ*©ĶŻhX{h#'<] ŗ‚&Æ@½~]ź%ŌŌZņ£ČøČcrĄŲ„ÄććöV*Ē©82¶”ŃOJÄ(£qŌāÜŠ“ÓIŒ±Q¤[µąŻ3¹ž»*ʶEbŽóH C(‡DęŅŌĄg޹ųBØÉńĶę×SqŖćјnXŖcS"„xąąØe<ėßR|Z„y» ¬ÕRŪ©^1ŗƒ.ü%ä͉ ©ÉnÄRKœ\"ÖĢĶHpŽ”ĀÅ™ĘÓZõŻŠ¶ ß5Jużšv}5 ­Ō“Ž@ūCS„| ŹHBį‚Ž Lž'3‹æOܕeF” „j½ø%MŻØŹ)¶Ö&Ż8Ū`/ßP:}‘ū½ßV>U×”µL±Cšu`fĄQ$°0³źčŚÕ²O`VQ„IœcZ Õ ˜%˲N/YYY›šź–ĒW1–Ķ‹n <&Į’m ‡Ļ5#ÖŽ·¢“ö¼øõ׊ČÖ2wVc" »ŽZ`“Nņķ>GFŚ»NüZu«ŌĖćÕŗā³Ō8D• ‚ky2•9…‡Ÿž…~maŖ7ö3‹ˆ“^µö“SOŗä‡ßév»čĢxŹćńż‹¾³²²ŗ²Ęj*^Zøö"’\åDzõĶV•8]<ėW΁l”Xš÷Æ{ķk_żšMŻétö.­ (°"†€n¼aĒŃGĆ ¼nežqF Z˜­"fuy~f±,,ĢZęÅ­Ūöė«ĀD–m¬˜„Ī8餯»q~Fw:CKk÷½Ļ¹ŸūŚ7”•+R$Ž"A“x…̲M¾1t –÷ļ›]X„1xļæžē>pé„—²Ł¶Ķó‚,˲(³D““fgg§ÖV"ŅÓ2=ŻpČlپe×m{’üĻ_qÜQG?į OXŲŗÖBGČę@ģ†Óham!Ø3– įŁĢÖZ«ćز»įĄ8ā»ž™ŠZM”ci­]Ś`ĒŽšłŲ-ó+‡–†/ĢõVūƒ,“n—¢(źōŗ·Ü¶|ļsĻžź·.Bģ¬É›DH£j“«‡‚Wš˜ rŲVAćÕ=čŪÖJįI `™4ƒåóŚ×æöu½NŌét²ŌŃņ o;¶Ļ}ń‹_ü“—¾ä‰O|āü ē?ļÅņŅ—=ür ž D°l#ŅĒĶ/.-/ ĄēnŻ· ±¤¤-Ą"q.)ßČšĆĖ÷žöĆ/ųłO²sė¶īt÷ŗ«oHSS1E:I’Įpø¶6Kj­ķżīæ/^ų &J@̬ņvé\üü’蓟üYŽ…$k-!īیzS7ķ[QJ±0)ȅ™¤«©+„`­5Šū÷õS)ĖSӝՕĮ¦YN<4rŪ!Shv(‡LXfK`¤ę>÷øūĮ}{ҵŪf»=˜,I+8żŌ»ģ<ń“}ģcżį`Ūü&𠀕µtjnĘv¦nܵē'?½äŒ;ßDHŖv„ą¢#ĀöŠO҇š.iåGM=¦µé łĆbt(4Öqڰ(oEņš7?śG4†&g”r„sŒó–DRp\ķ&µ*ŅĘŲ$‰jä?¼)NÕJ+=Z›“ej[ƶås¤!~3ж¤ $ü”æ7°žė¤=ŖŌE&p§ŖńO®āh‚n“źGűvxÅŅ ĖÉ "&3y Ōr–fQi­UDN_Bø Ż}Ņ¾i„BēXåĘĖłÖT0rAd0t{=ˆņō…TNĮ’\°bÆlR©v±{Ņ…‰ S0TwL„ ¾r…p¶Ö©„‡™ >¶²ØJˆTł É:õ§R>ŠÖįE¦f'üŲ?]/œÓøwŻwU¦K»{œŲ Ö}ćF—¾`¼Eg"Ćź„jń?‚z!­k^Zķ8@5FĄQ3®5å.QįŹ»uÅĘ*„A(*æPŽ&Čę»ÉHé1tPe“-j‰Ŗ’Ć‘€NAkåzŃż—VI;ąv/ī9–ūZ/zč’å3*I%Ų²S±ؒčtØIP¤Hg™cķ-ׯt”;ėU‹}£ H»z²³~JSBsŽŻV\y˜Eµ“G$“į•V†BW‹&WŠ …ŠiÄ*UÕs¤† .rēZł'„øN_NkŻGīņ¢(r:mĢy–ĒQ9$Zūŗ ; ²¢„}#_g>éPræ\k>wSK8–j‚cØjõd±RŽA”æš?_½š„[wļŽėp{)kżčG~źÓŸvŸe6Žā§?ķyŸłō—ŗńl,Ęąųm;®ß½K„I9F v¦Dā ĆP9gó‡‘"E @ƒ‰-Ūl¶-.L„iJ€%¬‰ńńõŽcŽ\ĄZ3ŲNٌI©HŒ¦ę^óŖæzĆėž65CQņ뫯łųG?ō{’ĻSņ•'Ą9ē=šC7|ØuV—ÖŗIrį·/ść?ļŽņ6%Šéœæ¶@SDÖ )PDUßĮ@J³!ŠČįj#åÜõҾpóüĀŪßõĪH"čH=?m²É2‰:‘µv~§ž°ķę›®O’di•—ÖĢżļ}׏}źæwå Äźź*CĒ`A‘’ņ9½ĀµpZa‚(ŃłNug«ć½Hė8Ņ`ōW½^W$?ż‰üQĻQ/WRõIŠ“Q ŠÄO{Ҧ•M"¬­ģ&ŗ!Ń<µiśąr?#0gĢ8śŲ …Ÿąl ć”v¤É!†‚M@ļLäƒį1 •üZ Ć" ĒuzVÅHZc¢R«9`ץ’DPļ}ū;žśµÆŪ”Äs½ŽņņņŌLw’Ræ;ķŁˆ’¬’ēkßwaŲ’\ųĶā«)(€ dÄ,ŸpĢ–«oŽc–ŒM‡ŗÓ! }Ś@ƒåV:H DóN»ĆĮƒ‡ę§ō¾½{’CJf7͋ȁ„%^t2 -Ȭlڶp`uß~ėį HH¢ ”)†<™ØßüÖ÷v¦Žńoé”`ŗ›ōzŻ7üĶ[’ų“Ė~×»œeóµ¹ü’żŽ£ÖS€1«żt~Ӗsvß(‰9星’ä'—_~łŽ;¢(²]Ŋ6mŽöł/}Ū»Š\ó˜Ēø5¶g×®Ė.æ|*Ń¤ŌÕž¶®šž™>°gļÕW_sÉO/ ^<.é(YdkkĖżĢó’šigÜåī5“²*Ü,{õ”"ŃDŐT¼$偝4&jś{ćc„Ū×C6Įešh6ĄI\GĮźŹZÆ×+˜oroŖ…s‡ŽLØO!×¶w8­&ĶR­÷ęĒ­ĒzļĶV‘j’N˜œØé—ŽĻˆ×SmwgYr žŃ‹Ę¦»ęElm®žW…Z· ÜwQ†43ī. h~¾7R~@Ź‘į‚Ń!(žXku¬ŹGI(e ēeē\M!(«D\•/•†ś­Uż°µ*ŖVŠ—Õg‘]]H)å]« WV+©-)ŪŚT†ĀM}—1eŅ–bŃąäƼx”F”09_?ŽœŹł‘Ź2nTSMnjB Ž^öØŌŪįdRYšŗŪĀ,BeŃL…E›*9p+0atneĒq…“¼| µ×ĮÓA9÷ٚļTA»4Œ’0ˆZ‡J /ļwrs^ÄPJ\Č_=ĄüÕzn­į0Mŗ‰#hĻŌ"• ˜5FĒQ–e9Ć*U „)¦,+ȍźģøÖø(в,K’¤ućSŽīóoMn¶!rgrk©TīČKY­jYŸĮUŽd Ć8‚ikŒöŠŠUHLIÆĀvFŁÉPµøŖ)ąO: ¾į?žż__ō¢­ æ’ģē>ś±9öŲcĻ8ćōĄOŠ"ņńųŁOš$Żé,†kÖŗōŖ HŠøŖ_Ęy„Å9%ć^w¹Ó מz®u:kw/1šŹW’å®]»¶uō=ļyχ_p„¢qą\ÉÕŲ³÷N§ßķv‰äÖ=K÷~ą¹_ūŚ·YøHž ˜ć8™Ń˜žNÖ Æ­™éngßņ ĒšąŁ³r¼IŃŸ§ !41ƒQ X@äÓ’ń”ē’Į37mŚtŪŽ½Ö"ŠE*īt²,cŠŅj֍1Ģp޹÷<ķ¤“æņ„/„iŚÖÖųQ}äæ}ģSP!®q9ŚØ9į\V;órØøjbŻ9¬ą“$÷:¬µ¹Tyčw嫑lXk€7»ę°"6'sģźĮ=Ó:1ĆŌńś(„ö‡CʰšDī|§3’ėæ>süI't©9d7dqžLÓm%÷ÖŁŃ^FDƒĮŠ’jŚŃ‰f©|ż[@™—½čły÷{6o^¼aׁ¤×YM‡?ūŁĻN½Ć™^¹p)©%YjA“ZøÆK{w=ąÜsnŪ}ėlwj0\MÓtÓ¦MŲ·ĘĪiU ÓJ”Ž£NæßļLõv\½ģ——rŚs-¬ "“e:Ž©ˆ½+‡~ūįē_uÅeYh•¦¼}ēQ?¾ę:ŃD$€e(@ģßN,ʤĢ|ßž’ž’ü$ˆ”TŚ_żĮ~pīVņņˆČŠd7ÜpĆ{ßóĪķŪ·?é)ON’dqa‹KP>÷ĻśōĒ>šeYkŁ:ÕUVE‘ĢĢ̤é`’žeŃŗŸŁƒøśź+;ńD-ͲĢ77±óDÕtƒG­·š9¼ną„ØĆ÷$}ęé~[Ą¤t8Žę:}RŽyu*Ų¬G*żp`ŃTpŖvzÕŪéš7‡ļp 裕ŗ7,-4×̬“†H˜œšj=?ź"KI«‡zI‰Ōü.Oī_@h‘Yņ’źšŹćŹ;B”Īp‹_Ti$*•H«€;Ɍ1N=ĻwCTvČ7[CuZkć$ņĶ9 €fµ€ļż3ŌW3˜[4£fjĢr-Åi‚Šī7—a¼C1ØŪ9><+ł ‰'¹“ęČ|f’&Ož2 JĮ—āI5æ_5²bĪ—jÅÓb$³tų±9vO•šŖj!¬‘²‘ Œ!Ź *õpīó)Eīó[D L)G:ÆgU06•ĶĘ9|ZWœcc¬ö²Ķ ŅpĮpš¦.ˆmžDäžuTāĆļ_n•ā«iøąy}JL ęQ«ß\B*ōŠŹ1·ģ…X¤!__HĮUCb“ÉpS—É)Ł“™·ēer„‹+”z‹ 0¦q·“Ø!±O©{'×#,ĄÕ„Œ…,Ŗģ³+"Jk!·hL6כīFvfffyµæŅĻŽų÷o|ńK_įŲ¼óŌp5$F•¹jÕV@øō»ß?ēÜūĶvh”EQ“ū@Ó¶—\öÓłÅEØR^PĶŅHń [g²¼sēöŻ»wŸ~—»ó;ßsœ“fččĆśŠ3ŸöŒ®Fb”Hūö~Ēsž÷G Ź\_X» Ŗ<‹•£€ ūAeĒ“¼ßYw¾Ó®[wm™Š1Ó3S¬&=5roŗ³oiȄÓO;õÜsĻżēw¾ŠöŽxӉ'ž”(ĢōŗVŸüōĒĻ’ß¢D ėž†ĶŲėJ“±ģ(śņ2’jRRŗŃĘp)gØŻ²ōžLL„uĄf’/-—bxٟ¾äm’ųÖł¢ Ö Ū„8Ö̼°mĖ“ŸžĢcŽ=Vw¦žųŌ§€YKż®G•ØÅ×ŖŹĘœ)„ļē&‰+}a%VŽFfJńH憗.Ÿzņń÷˜ķFvhŽŚ:{ąĄrgaž’Ÿ\¶iēųjŠ,Œk„“O}äƒ/~Įsz €=–¦ęvļ=xÓ­7m޾¤ÄĆw||c ”r~d(WćsĘÉ'ÜrćĶ‹³ YΆF)DIœmwĖ–Ė/æ¼3Õ{š}Ϲö꫺Q<ƒA45uÉO~¾õųcD”»TavFÅNωāY€_žĀē}ü#J’åååƒ}~ņSŸüĪž!.|u ±Ēmž››švÄo}ĻūĻ’ķdžū=µi„%ĒPˆ(˜5kj6ݾ8oÓAW‚…™©ˆmš¦Ż©žR*%dYf™ūż¬?@ŹHm;·]ōŻļwüń":̌“QŪ|¹f¹ėĮ”CžŲšN„Ź{X吠\4ŽŃķ…LOŅ„)B”ĮĶā©5ŹgXŹ?›² ŽżEÕĆ÷ŖÄOŽŻŚŠ=ź6gt؂šk%Łņšgæ²4E­ļ|2ĶėŅ pT–\6HƒbŖńŒ'’©¹Ān")’™®»Ļż’×vŠ"Ą·S€ ŠUż²UÉd*0jIŹŠÄd†Ę ly³D„¦Eé?y”Q~;U±Ź…‹ˆČd„(ТڀŌq«ĪĶ­Q>4а9]JšŒ'WĆLohØŽBƒŌ¹čČĒĆ‰Ü ‡ƃ¤˜ģŽŌķlĻ£\×įšø<§…3ʘ,Ė šdOrŽü„¤¶Sł8œ„H*¬ōäĖī’O*Öćs¬µö  rń•zīk3x-N2~£4éāņ2H£ƒĮ¹ƒAÄģPƒZ©Ųbäć¤ćĶŪ7/ xmu ģŻ½ŪŁ|—>'*īb Ԙ,ĆXø£aR1Ę ƒn/¹éÖ]33seēŸ#~ üę™āœ >öčSŻäЁżŻ$6iV hą)O}ź¶…¹©ø“LX„ž—׿(b’$ÖøŽz›™ĀÆØ5¹“£¹Ņī¶£˜ 2»8漓oŪ¦ŁNŌISÉR£†CX¬ ‡xŠłøųūßūē÷¼ ‘ ’©8@G;¶m^[[ƒ×H'2ģ &y~¦°Y”ÕĀåqE*Š4VVV…ė$| ō’½"sŖ4iM‰&”P‘wyĪ<ĄŒŽē¦ŗ± ­®™ƒC|ņĖß|ÅkŽų¤g暉O}6ŠЁHk­ĮŗŠF'Ž“ž £Ø†ź“IĪ+]Ž"ĢvDh X(0Jq>Y‚Q@ 1lFĀd,±ł½G]ph’n¤C3ܰwķ@†3īt·M;v°ųdM Ø!"åxŚ$·³ļyē?³uKŚ ל³S‰ā¬ŪQ›·oÆVc”OTˆVB0KˆŹÖ~ż3Ÿ[Ū³gĒt§ N”@!#,„Ou?ųįvfv]Ó„?śYŗ²–†żÕXoŪŗcė1ĒBˆHa „l°•ņ–åŗsŌ›ßś¶åž`m0HŗŻMóS_üĀ~ņƒŽBęµį0éu——W÷ī]śŃ÷/…€Äč(„ *ę#¢5˜ Ą…—Ȱfļ­»V–Sqœö‘«Ėk¬Ō¶£ŽŹD¾±©Ą(u؏x.~ś³Ÿņģ?xśu×^{ÜńĒĮVØjōĖhH‡/»=tŹć;¼ž—Cb9¬RP3Ht湤[Ü)pū×I "lmWxĒģŚœѼ7ėHŻÓŚNĢNįbjn™dDšŃu3nRØys–;ŹĢq’8¹FÆ’õ®§žL{hwpŪ”NŖn_ł¼“$±Ž“³°N„ĄĻ]ó¦F)²8„: T•,Ŗ³űŽ#kLEČ“ō§•—n “²0ʰÖ:٧PŠ¢*.EgWŽ9Ó6GįĄZkŻF›¤Š'½^1~®'Tś’H*īČÖf¬q£X6a`<žõFėE,6zy\<DQņżĘq<^yoŻ`øö4³Ō³ÜHU;el½:ŲžŅņgżÅå~Ļ7ėégIØdé bclÉ/aĢćģ^E9ʘrbźVTv„L^IX\ž+ϚIÉ& µvķ6Žų ēYµ%ٵ*]śĮ­?ƒ¶*å ł…:`x³””X/3U/¬’Æ„ØĀS,?£‰‚š|ģĶ«_ĀŖR«>?›kĪ; -€ā8Ī«|Å<"䊫q£u®TJĖPž'ƒ ³a°£³Ź=rR0V@䜘ܿ Ģ^x”+ż4M3|łĖ_Ąģ5öh\v©6’·­żū|8µčv]īLśĆT,`+ŅN{¼?*āū-±’~km6LW—Ó[n¹JÖwļzŁ«^¹–¦1Šajüb× œ÷eÅ@HGV€N"DC4rdŠĘXGųщu©!…ŠĻ†³‹3*!Üė>÷r’ _śŹōü‹‹ŽÕ¶c…Š2Ę”„•żżÉK^r İV“*’ŠJ‘§ąĒēŁ5‘ĪÅ5Żü¦ƒ”€Ł™é2MVz>^jŪ—‹ ‚Ī|ƃĪZŃ•挭ōū}{W²=K#H¦¦E·ŽzóɧœÉF2 `•‰š$o[;\ĆѦրߕ.¤°?£ÖÄBJ‘(‰b!­?žŸŸøč¢‹¬RŲ¼Ų=é¤ķoyóß|įK_Ņ¹zš²ØdŁL’é‹^xł„—ÜvŪmF8µF)•öW·lŁ‚bg5w±KLJē@$¼ķŸŽrĮ£Ou†œ2IŅėlŚ4æŗ śŚWæ~Ÿóp`iéŪ?ųa ØH¶I7īMMķŽ}œb#†Š˜4 ¼@ƒĖ¢ŗ„/‰5¤Ÿ÷‚ī_ö¦gEhłĄĮæ{ķkam „YČŹž]{6MĻģæmļģģģ™gž¾6čCsN ˜%sló’[3–¢HUÄb}ō£ݶ8×!µ8׳ŗKé›÷÷/łÕĶ6ī±ŅN­ßž~ś1Æł«Wżó{ßõÖ·¾Uuc#ŃŃų2†CßŌÜĪńžRųgk\}.Üķ<§ÖI2’8¹JH»„0J‚į7(ĀdŲfÖäõC•S%ų’’V„80Įg£E*ęo$=éz“ŻĶ{}ΰ7£vź4ŸĢ4«%Õ“wYoŗ)%‘Ś—¶„ZŹ„Ž%µ×Ūƒi%a&e֙”ŅQäņßÖūf¼6k&!ž\Žz½J”rØäŽ5†ŽTŽTFŠI”/.%…„"®P*ä·ćµ‹•rĆYų¦ÖŸūs¬ˆŽW+u5 )¼ųVEœuÉö8~‡Æ·›K ĄF…‚&tŌžrcG¶źŪ|l4¢>ģ!o \~$ģäńĘd8®¬¬Œ‘.Ų@”سڊ°YoAnx‘„øŒĀ>QG¾„­všÓŃS­“…Ż±2#A™šYXRqæäx¢@kMk’Ę{GŁ‘2śŌ3{.¬µÖr-·•gÄ-{• Ötݐ3†9 Ė’¦&ķzōéåČraƒĒ ˜twWóžåłœ#D <’ŒÆŽŽhnW°æĀgFA–e¾¤¤µ*uÖ+P»ĘąéĪ !%µųIJtŅISµ87G“yqn0\wÉĘpŽ+Š"š É"÷ˆœ@‚zÅK_‘D*īt©XA闾äe[¶ģT…‹ā–Pżž¤^c,ČąŌźŹZEŻ^2æŠŁ½goŚ_qį½Ė h„<’ł/Œŗ½U…ƒd"ęi¢Æ|ē[/~é cH^[YĮĄZbĪ›†ź‚µEœ­>źųdŖ'‰p ŻÕ«éZwŗóÆü“/~ł+ ½²ŗźōŒˆ4$k­bAš™½{÷yAc](2ęķĆA›żØL Q>ƒ~vŗ “YUĄs…+‚””«©v×¼&_zuCķÄ_•¦={ö©n1”“Øt8\šå43ŠFŖ"Š#¢k0ĮF’Ę”‰¬³a—› Łsb³UcÕē¹…{Ńa!Päé>ÅG²ĪńfQyƒ;I˜Ģi’^’źčę¦ēR‹={ō“’脯BC”@¹²šeė2¹etA¾ˆŌ\vɏfg§——‡™5P” SÜróžŅžä)Õ`”¶īD¬„?ł”;?•˜¬§cĪdłąšīNŸtŚńüä§N?ė,ĶĻ/Ü»/4©$Š”ż–ķŪņ_ …ĢP®€ćČłŻ [†Ņ1”ž«æyķc÷»{÷ī'"­é[_’Lp6ģCɻ߿žåå•N§³ļąž+ƾņ“3īaI“A&ЉŒ "¦ņČÓģāÅåä°¼¼,"™¦Y_G“÷ŠźY÷;ēƒūȁżõĶK·īĖžöo½ś¦=_üŚEōŅ?ƒØøŪĄ¢ĘHÜēÖ%ŠĀśP!ū5bņĒ$h»°ü›‹'Ē_Ik—\Ø]łødj*ē”,L:½ŽÕå»ŻéNVpPäd>Š?üīŻ2?wŁ%?ĶVūĆåՈ“†‚˜¢«8æ‰0ļäPėč6X?ę÷Ż »ö0I7Š;½ƒK<=?’ģg’ŠMOĶ“§˜5 wĀń’Ż^/eqjĘ®ōZwɘGĪny=e¦ĆWSÜh™|©õ/ų?]™¤Š%__Kē?ģ!,|؏5Ńż”źŁ~ōcķŃXv؆h Ä4^!¢X"ΘKĘ`v% ×0^6Ē5‹"#9©<­Ö¤A ˜ČE·L9£æNžś”'’ųņ_ĻĪv‰Šķ)¼žõÆyó›_§ÉV ÖJ·ÄWĀ~ńó ½Ž¾÷Ć(īlŁ:ŸLMw¦gMuŗ] ;°ĶŲūaŠÄ‚ķź¾}›¦ā_žźŠ-;¶¦Ą€yzańō;ŻåŚėołÉO/ŲĆ))”ڶ°xģÖM0¦Ēq¤Wūż¹…Ł\±@#ŠufXéˆs;S(źå•$ēbŖN·÷° ±<Čśż¾ÖzmmxāĪ€DĄ.łŽŌģtj†C9żōÓŻ ³‚&Øš@LH„#‚Ėé0ČØH„ŒCP į«ßųęž„e–8³ČŅžŻĻ:ķ+~õяāĶ{ …׬<õ÷_ЛߺyēńŒÄ@AEKh/ŖÕ–t 8ķōŽģ{ę­QÕćߓƶ!yäVČŃ8S׍źĆįj†ńz°å Óę lČ 8ZÕJ›UB漙eš()> TY؉ź0P÷ÆqĮĢį…-پ`:|ŽGĀ„nÖōōt„ŽAĶG@OC^S Ŗ“…ŠZkm›łŅMk×¾ķăŽėi¾õ—HÉuĮČĆü)XęĢB@¤•„ųū„€¶‡k9MSW`+rŅ4uUe¶"œw‡ŗRRžęRjÕ=D$T–G‰¦š˜“½mĶ¶ØąAŌ&5³6“ī4„pÄ#Lgd’’„n|xQńzpå Nuü‹żäśUĮu9™#Ÿ@u(‡ŲĻaĘjt0‚ėØQō…TP©cc"瀆Hę1Ēv¹U‹kw [qø¶Ö%ĖŹTA*įx’|{ve%S)Ł]Ø@•cP6 *ˆ`8ęr³½°¾¢@öÖ"Ū֘3¤§*Šæ*œ…JhźŹ‹2 1&ŠżĶlĻ¢$žg@ !j3uš¹“ਕf²ŒŻæ†ł_f“erVr:%’gT²RWƒĀuxVŖel‚kY/ R Œ‡KKåTŽ V333iš¼¼Ņļõbų©ĄėA"W”j›Bä¼óŠ™źōū€įŠīŲ±ŻÕcĖC‚Ńą@)>ĒMCÜI–——÷ķ_uÉSSS”ŠŁ8™Ÿ\—ˆD‰Åw.łįĪćŽRĄtL–3²¦gäŃ9’¢/]§|ł.Af—n½ķPy@Äŗ‹Šc ‚pö¼ē?’„/{ŁŃGµ¶ĘāXßtĆm‹ []Üįó°Ā:”=åō“-  Üņ{˜µ¶×ėµdXÜ~žĄx:¢ģŠu €#'3ÜČä-o‡GšŌłotęņzJė³īrg³³=Qba-šżżČŃŗe&ĖIķ ¬Ź&“qŪ6¼ĮÕ„•ė®»®æ¶ęVš/¬w‘£ę†ˆ Ć”4¹¬_ŻZÖÖ'ł¢g×üāņ’žŌķXģ²M»(žšÄ'D,Ø1EŲZMĀżžŠ—žéꣳ¹éN–e+++»ö® ȱiTzOšČ āWžŁĖē¦:[ēf÷ķ¹-RńģōÜŽ½nݳ’źėÆE§cYT¢™,“żĄGžżąŹA!±bVÅXZZąŌ·Hk„ĮŠ &ÉńŖk¤¬s@£ųü‡’փü@fžŸŸW„N'žĄ»ŽK¢`8²ŠŒ®Ž7Ķ/œvņ gß÷~D‘ˆėYpH „TT0D@Ĉ,ąØė6mŻ”2˜2”;3}õõ7"Š­µ!6(iy UG EŖ`©%ō’›ŖŌh« —ĀY„1l[G¼÷m¼‡9¹—{$‘F|Bø”½ŒnAŻųC…@²f&£EŚ›:FdÆT»×Āņrø9ĆÉ®Aœ³»ŗŗź oņœœeŠtTT.,`e°€€@`3Īæ:L…‚"w­,HȀ¬«?p€VyU±#÷Ÿ‰­(‚%J $ФŌ0åźĪ(ļ9Rf!üōß?vŪÓĻfg’ø;}ŪŖ<ąüóŻķłĀ;Į:³.­’‹¾ņ?}ń Å"ī$k–÷®­ķZŽ÷„g>yjĖÜCö’ųŠæ/nß ŹŖÜ(6/DiOQ<»}ū_æéMæŗń꿃ōkßłžĮ”Y˜éMŪ€Dø\Y$Š$‚D’ó?_qļec2ąĖ^xšÖ] ‹ŗ7 0:é(rÓ!Õ£ØQĆÉg•Y²Ōd}4 , ”CģR+Z²ČY1Ąµķ¼a±H‘ŠÄBAy>æ÷}ąß,°gyeYÉÉÜT7<ü¬{?ž¼‡~ūĀ Aœ£Ÿ]ӁIB/“„‡°ƒu‹8¾Õ~ KמāŹóļ’Ą7žŸ7Śæ/ƃWŽR!./ik ±R «p’”^š‚59ł–Ö…‡üĪC„žŹ`¦7}؏kvļæ’CtüɧD‚ŒйėM¢+·TĀ‚tȊշ?’•[®ŗfeéPGˁĮZ2?»š. VV,Wm§ÓŁsėM$&ķ@‘±*w‡ H”h W]ń‹’łü²Õ>†żłn¢8ė÷——śü¹Æ~}óĪŒ‰Ü>U–7īĮźpŪ–­¬‘ÓĮ°«ōļ>ęŃ9žG ‹œÓ¾HŽĄDК4 $BŪŽ>ö³_ž*ėh˜š…Ł™[vķūĀ?1PŁī[np$;«+ƒŒcnŗ ß)u.¼ ɓ5;°J ÄjccĀōԌ5XZJÆøāhb‚U`RQр\WĖhY'®s'B“·¢–eŹ-ŗŒģ°mE •kĘĒ5\ęŃ IŚP­xLż²ž§‚ŠhÄyJ‡ĶbS#ņĢėZQNRPRל¼6x«fqiµ¦ó‡Ņ³ E_ė;¬48Mu{ŠuäĮ*ßśĘ7žķ½ļyŹ’‡ĻxĘ’ē^śļ‘Ę:Õ0‘“qwģ}©ŃΙʬµŽUŚķ¹<Ē C“@¢$ĪoPƒ¹Šn·*’„,™ÕCƒL¤ĻŚ‚†H˜` –H HY(Ē•DĀ-՛QģKĮ%Ļs…mÜyĪMŹÅ0ņŽ-ē„zR’1`7wŗ£‘Ą‹H)e bA$¤ C„@ȌqƒZŠĪA–1ĆCżŻ7Ü #B‘d`åt©¤Ś}pœ#&͈aŻnWŠ–!”RQi­P0¬äŒ”šz½Ž‡Zå‚ű‡QUՆ™ć8FCmÅ7¼eYöą?X)577wā‰'Žzė­!l2·ģ‚K²bó„=?7g+ĖfuÅ÷Å6JBuŠĆH†…ū+ü@zĖu’óīąĄå•åķ;¶Ļ/Ģæä%/Y[]U±.%¦‹‰¶6÷&K±Š`@‚žW9ēŠ©™<¶°¼¼ü >šw?ėļx‡@,[·1:xóĶ7Wżī $7d[«pµ÷69GÅBM¦½ńM@°!(ø„¦ŃŲq(»ģ&ürgĀ„ź šap·Ūuö*šńKÖG®żAkķqÓ¤ĮTįæ ZFš4µäåč<PąÆ]½Ńd6ˌ°O°†” F4ÅL<žßyL‚ļjeCO¾,kÕ ożŠµ®"ˆŸŹ(ŠZ„ˆiä"Ģz‰AE؃P§ŁkxłńČaÆ"‡E"„†–×Ö֒„ŅŒßūī÷äǤģč-‚?÷’œecR™+++Ū7oźv»Yf²,»ęškś«« £””eēkĖ”ōš"Y¦Ü#'%Ėē?䔳S½éé)cĢ”åeū{æē Š¹/}+ˆsŹÉoųĒ·č^ēŠJš1HaŖĻh}ź1ǘžźóŸóūOzģc V ŻvHŚ=ķš[įĆTc˜ˆÄę]ĒZė»ŻķnīėL–”P€£~b²¬×ė0ÕéÜė^÷rŸüå/نLW”żu<!\3ƒĮ ‡§8‰T¬¬‹IU^ķ°™UA°–į*Ž®ņīļĀs ×{“WDqĢÖBŌ]ī|·m›ę#€ k ceĖŌŌ÷.»ä ßžśM×] Å@”f"EVC2ĄX¤BĘ("ĖHŒ"q&Ź22ūׯś‹æž‹W¼é³kĻÆ’?wæūŸĄS8å…y"&Ļhč†Å™krĖ@ƒY"Y6dĆ$ h^.ļ90£1­#^v€üūæ}å«_õ£SQÆÉ‡R9 ’°]^Ś’ÄG?ś±æóŪĒ{”N€(>ø”rźéPŌŗÓŻ„å•żń‹!Ņév™įĄšź— ę÷æ_ŗ¶Ŗ#eŒ‡:Žś6;ē÷=īäSDŲZn¾ęŖ»ßżn—żģ'lRjuµ?3æ`’ó寂tYŽ"e%`ovČ1„™Aˆ§zū˜lÓāÜ/q% —wßöÓĖ®L3cY™ŁšŠī›n̆ƒüĆ,C •P X5”ėtµÉ·.¾Ø#KÓHėŒm§×…Ä*€!>䦍”'ƦŁ8źzD ŚŌ‰š} £¶į ½łę[ Š9ÉXY’ō=”‡ēƌ:s[I=ĮQYœÉ;žė“õą›¤[xŅļ®=ÜéhŒńǧ‡°¶>¬µĪźÕ^¾eĢŪk_Ķ"V86",ī6"`ĖTo!‰;@Ų63żČ{Ż’čhęŸ^÷wfy­ś)ī]""V ‹e6"–Ī’ŃfFX2‘T8ÉDŒĖ’‰ō­+2”«æ÷‹¾ł_ßžŅ7<ł’óG=ūé÷|ųßöĮ«æłć[/»JŅ–+~—š^ŻżäߚwńS}{møŲX6¶|Ɲt Ėy6Žшd"Cq7,F$e±ĀCk3fćߥb9÷#v9»žūæųŚæ~ź‚SĪ~ß_¼9Ū½*Yqż,ĀÅ<ŁŹ“6c±’æ’Å©ŻŌŽÅ&K~§ÅZ*ĒĊIm64łWpuÄX܄ ‹X7Æęuū7$ŅŖžŗY>“”eY}“YĊ³Ś_±Öę·oå÷¹×ń[6uŚ)·üśWłšiłń›bŌŹon Oƒ~ę½ļu6±ŽˆP¦Ć–-I±¢˜e8ĢoŹŽGm47ŖÕeɾ”ņF±ü†×½^bryglß¼ia~–€Ž;~ļžŪ{Öµ'µē=Ÿēį}cė»j£ž««Ėķ~Ō¦2˜®,W’'[/|†Å­“ŚŅnTwAsĆē ĆT^_³Hu;nŽšlavĀO ?ŸG[¤ārób6Ē=Ł_äÄß[µ™ėn“’…ĒķüĘQoÆ­/ók¦¶»¾¹õjŪį06QmżŲŒėK“u]ŁŹ*ņ‹ÄS³Eė>ƒ47h,Āņæ’¬ŲŽĆ,pŌLoQėźIa%KŻkaå•otψXa‘LlڶDŃ…I4« ¶oÅX)V³ea1Rž„7īNŽluuS·7ÕM¶Ē“-Ā–ž~š9÷ŠŲüµĢ~¦Üē_‘¦«‡¾ō¹O=źüĪG÷:Ēt’m„Ķ„óīvēŁ` Ŗ Üżg¼öĻ’ā'?ųX+™Y=“ÄĘ^sÕÕłéĄbŲ,XłČŪr ‰x+› SaŃ 0t]§6šōĒ?A2Ć̃Į 2Ė–%ga6’ Xö§y.į–fīÅé`˜ Me©X+é Ėż|IøDųDŽch܌1į,¼żmoé6iģ˜ķ-&jg'>nfЀٙ©w½ó«–e-ć<bXŲä~cfӃöŻvóĶK»vļŗśzég SsR žŠó ADÄ jqa¦¾ōY„Ť–X›/EkĒٹÉ[[ˆ•æ’›×ĻF˜މŌ]¶m™®æź—&ė» żg–ÜĒsÓŹĘJf^\˜vFtś¦łS6ĶM/yįŠķļ½ńŖ“¶ĪoN°)Ę|„Y"į¬ōŸóš Fžśå/›īuāQ§Ītī0ß=sÓō™;ēŸśŲ DR›e¶š=Ó'żöĆ·ĪÜ<ņtē“łĪ{[¦(>šŽw —K޹ełż˜o[›ĒŸųųD@č=`>N¾ž™O̧o›?n6™ŽóßZµ‡ånu÷āöę`0Č=Ąšpäģ ł£f;'ĶuNŪ4=£pŪĶ7K–21l+—W5n‡cPz;R ąFüüĄx:oĮf¼²“źīŚķh›™ŗw±ńCjŻó¢öņé~ŒųüQSįÄņoĪĄ˜ūtB”tžāųļ3Ęōū}’9Ž;ßø ¹=-++Ö^{łeÓĄ"ѱ½©c{S[@Ēt§6č­øē™wśÅ„?c­I­#6Ć"&ĶJ§!’„ ØÄno|,C‘5‘Żƒļ½ēÓŒŽ;;³xęS9ū·O?Æwģom:ånXųŁUśœ Sgś™ÅnsŻ‹ÕĄ#CāŠ5Æ»éłeē>ǰŸŽ_-AŽ_ł™H*ŁJĘ}#&Ķ/#÷;ėŽTpåC‘}ƒ·>óåēŖ£؎~>ęGŸųЬ°I½sl]r!’F#žl«xlAź½(›a? [»ż"č•JŠ޲­DÅ63»nŗń˜ŪµdQŽĆ‰”ž­óꮊßZnāņ8øH¾H–ŻķŌć’š‰½ļOżé7晛’ÉLĄ„ŽdsĻ×&Ń]Ģ}źÓēÜ÷Ž8ļ\ŲGJO÷¦JŸF¤ßļ‡öĀm½¦ū[[Ž¼é([›f>t€žö5ƶ>‡Q›ŒĆ‹NĒŲÄö@}Dp;yhQūüŠmOH˜Ś—¶šļ‘‘±bs±{˜æ²‰k‘ĘCāqö64J#ĢTłi±jTm’ÖcZcŪFČ|µs‘ĒdÜ6ꉌŸ”ĆZ±­ó.]’KkNgĢ•ŒY’Ö:ŗ1ƒE`3žš›Ÿ¼„;*$®¦HFžt…ĶgÓj­ēZ¾ĢĀIN[±·¾õ5°5Į&ķŻųŒG‰d63µp×p‘#0Ö®\ßī,ČģpmĖTwS¤·wćE…ķ½Dģ€%Ė=óĀzdaH–†-‹¼öƘ¶ÄźØéī¶žŽc”ƒƹR$såÆ'ßūiq[¶’²dV†,é’óÄĒŽżĪgtcf§NŁ4wö‰Ē>?}£·Ÿ°85 œ“8µœ¹cĖć|Žłw»ó9§žt·cŽ^žī•!ŁŠ%ü g†³šÜōk¦žĶ7vłŠ 0MŖS€¶žĻ«_#Ę6WQqµ.\ČĆ<ęöõ`3ÓtĶŻŸ[9[†Ä­‰žQ;7ˆÆ‚›ŹŅÆ}ī³ˆ¶iģˆi°3Q3 zŠgœp²dœ;ƒ®N`³wžĖŪ~Ł„b‡’­»0uƓO¼īŅ³~Æ{÷€Äė;‘ėÜę°zŌn żŁš[æ<cĘdŠ­1y*§æ:Hi K8f¾wŌlgvV‹¤n-µłģ¤",ēŽóī[#œ±ežä¹Ž¶ošÓtł%?0Ćįįpe’‹ŸóĢi`ētw!¦g<īq.$öķa»ŗwߝN<ś¤łīf“S§ōés½“ē»Ē-v÷ķ¾®¼+Āö_÷Śczńq:m¾sŹl|ŹttźLöģ“=i¾{ģ”žUųĄ»ž%_“ž²«1E‘3õļb#līy§3fvÄ8n:źO|Ģc„­ ‰Y‚Üßa…Ä£LėäGRk6摌¶żÕĮå—]ńŠ—¾ģ÷ŸńĢ—¼čÅbl%¶Į‹ŽčåU]£ ‡ÜåŪŖ%hxļØåēv?0ęh_÷8scė†Šć=“š˜1v œæmqk'ŚŃ‹N˜ķķLŌŠ"°…ōń½é-ĄQó³Iw#zĒŪžń_žņ®nųĀg>[ Õ\Ńr˜šµžŠ;žīŻP‹9dw—ŽŽzĮ±÷~śĀ_wīc?ųŒ?żü_¾éėoü—7?žŁ÷ ™oæļ#²4Ģ„‡Ö¤ī”Jvpmäo4$®U“XŲH:ČZF»š/ŁäµÖŠę"½jeYöüģŗ}ī[ß’ļÆļśõM’‰Zw ”FÆZK”Läąš£ńę‡ĢœųąŽ1ēÅ;¾õ”OÉ0([™JW,›4skפYeւšąŹÅ1Ŗv ®6»Æš/^=“4Óķøx8&š„ß{|ųÉa¦ĘG·×8ļZuß7|ć+_v×vžsę)+7_ć }m#ܞ*å˜mÕHä£óå/}±Še§ž|Jž›/>gT$<&l9³±é`čCāß¹ąįĀVlPӗ#0“˜Ōu­ēķĆĆšxL¼Ż¬į*cÜĘļk›™t0l/ń³s¹6ź\†¦cj&žæ>·ÕRŚõ#Ūf^¶–Dp7ؚܭ„Ą*æŌ.Ćä ²Z-Ś9ŹõŲžfCāĆ8ūĒ伬µœ2‰—cŒIÓt“»PÉøĻ©Ł2Ķeo­u6$ōƒ×ęYJĆجзĄMC¦rjo‡ėܧĪ#`!¦mč˜©īѽŽŲ°±?ūés·ŲqX„§Ŗ‡”Õ\N…³ūžu—Y…Y`sķ˜źM·\õk±".\šž½ś«ƒ2ڱ"V~rń÷·Ęń°µmŠhĖt2­š£‹æ.6eI« .ó ™ū­ Ń g.<~ųé³ Ū46=ó“{mĄŠéŪ·Ļ3‘ŅĄęł™Hē€ōWæźÆņ›5 £Ifl…ea9’AtńŽāō“;užņŲĒ‹iŪE½½¾Zl3ŸÅ5DLąäé’ iĀ•Ÿ vq;ā‰ågœ¢#$Ą<°=Ö[€£“ųŲn§Ģv:ø’x Źyć}«<rAęü‡('¤p: a¶«ī»%ZnAßžŪ°ojéÅZݶ£­ˆuĆö÷÷ĘX˜īv€ÅSĄŽ}7‹d"™×Ń“ŚkżaJŸ÷]wėyHÜeūāé S‹Ą4pĪYw¶"K*’ī»ł†9ķ3Żc7Ķ“m›˜T2SĄXĚ«ö“ÓvĢž¹eę®[¦ĻŚ6{ĒͳGĻt>šĪ·Š¤†‡ƒtČƊį׿ņĻwNŧnī¾Š=u.¹ŪĪÅÓē:wŚ<³}!éų¬§‰µ>Źu„)kķ(£^Ž[1Ćo~鋹ų-›NZ˜Ł œłų~qł‡W%> _«õTrhˆ¹‹„”°¾Š]¦Õj‰3»1 bėCµņ˜…¼ķ£ŲšZ»Ÿ%йqnśF{IĖ®6„D“±Zā’žJuqŖ;MŖ§µM9b ×ķ“kk ‡[āč„(¹ēŽ£·!ś«æäIøąÜ»žõ¬Ē>īuÆx%ŒHfXĆj@C„“X÷ŗI.S”!€ÓLŹC,]q­ŗįĄ=īp—µ­ÓųɅł„>ü’¼ų·^÷āū¾üiśŸļųÖ-æ<ć¼³‘؈%ŽÉ‰1Šī&"Xg؝®µŲwå’­õHē4 AÓlŲX›wŚå+ZZŲ ĘĮĮcīłĄæxĀüŃļ>nĻĻ~>“——„ÓÕeäćIŌ40ūäG½ä^{Ÿ'<āó—}÷ž{4;ź¼ŹZ 0@¤ ¶p­#XĄA?di¶`S¬“A2FĄaP‹˜–5g¬kĄųĮwæ{ÜqĒ­†P MgÜéĢt˜žēĒ>rŃų& ·\™™­($×Dp7B”štq~l§7me°į¬If6aŅ’’Ś5Åö…€?t]×CśŠŸüäŅ>šī_®¾śźsĪ9Ē÷‡xwÄżkš¦Ķ~fė…·Eƒ“õģŁQi„ŻZžĪw¾cLꗤµRćtڐlRk3ĢųnįuūB[/kmĆįŸöv¶vĪÜŽŽāāC“֕6²Ę"Q9‡yĄĪ ~WŪļ7'2š={Ķ^ ¦üxēöĘé1”ÉU‘§„,Œ³{R% v]fyćō’źiÕh&'ģƵrÕ(C'\É”ŲL­‹²ųüPˆ«<ćG“µHsÓ4­±˜J•P`iź:ģt¤£qډŽųmčbTēĻ[ĖĮ…BI•%Ž$ēm ŲXš(ĶdmhČ©ÅfŲüõkžź®w=ė½ļy›­µc]#©Šč]t·{Ü=cX ‰u4“$ÜļA÷!®Ė>c;4Ėu»ˆäš:Ąē?ł‰ ĪØÉ2(ŠūV­¦ĻzĪļßć>÷ńøFž"" …,Y\ˬŅ)Ń$źūų+^õgŖ§YĢmžŗę¦¦ē“Łł(I$]=øi:Ž975 $żµm‘ŚL8yėĀĒ>šīļ_t!`  ƒ½kGDÖ+)9%𼵕Ą5×_ēĪöĢę]²w’™{ļxIŖj{|ķsŖŖćĶwrd"0äœQ”¤€ ˆ"AP(ŠŠ€ó󙳘1 JT@Dr–f˜n¾·»«Ī9ū÷Ē©Ŗ®®7 ųūöē~ąNßNŲ{Æµ×Śk/Dūfż,l“æ$D}Ā{G‘L=!Ķ2†I€B’1¦:śbiKBƛ”“ńę•zRį™'ž9üĆ40I ļ:Y"®TŠDE0ē%yډ:Iä w’Č³ĪĄx0CŅ@h‡]LŚdstÅÆ.ĻēóqÆdĶęĀŠ:l`·źż ¤VwUn=ŽR[OØžAó?o¼¹ČŃņœŽBŃĶäzŗ§Ų$l ĒŚ Sś\ÖĖfÜkÆüՁ{ļuūm·õ“ēFʾŽ–8üˆĆļ~š+f£¦Æ~õæ}J%(—ż ›7æųģ³°v ŃĮ(Ū, :󯧏 —ĖeCØØ`øT Xż¶“)ÉÉøiõɏ}ōŪßųz!—-ł¬Ż|vØ4ŚÖŪ5X*ĖĄH`įÜ9 Ćģ‹XPŪŖĘÖFOńOuKb†‡qD{[”æoĄÆ”ņˆČó<­u[ŽcW:€±J¢„ä*iRc£ffTc ‘‰Ž3   Ę|täsļ<ł(JCŚOœt+n+9•ŌŽ™Ķzmć}BĶGÅ’{7ß|3ģåÓąU«Wæńo¬6&+@Õbg¬žk¼x0ϤPż1րLü““’lfĪ·=½Äq)HkW©“eæI%÷)la\–c”Ø–)£’öŽqɾKęīŲŪ¶øčģŌŸŸs: XšĶ/Éäę{Ž,¢ł9oigŪ.½ŻĖ;ŚvžÖ½ó“ī^Oę ķ/öv ųՕ¹źźm«_yłłēY)ĖE3¬†śķiX?śęĪåomŪń3özčõyt”ƒŠŖ ±3•aV36ĀÖtkj„MHóŗ–…˜¤#štŸ^źOė²ńŖØ=Ųąu]÷±›ĶĻn;}śļtVž½źŸ<Ź\fS2\R¬ź>ßbō•ć ļZ 9ŠU¬Ué`“bʊƒjĻp Ū#Ńå°MĒTtśĄ’üI{֕č¤lŪs¹–#Q?f¢n(£tØU°ÓNĖCP ٦Ր̟č"nÄ>rŽĖŗė²§ļž‡ęŠf•ÕI¬Ć¶ 4-J„@rĖē ”T„T ēIœk8ń7Ažóœ³ĻŠOó«_žJs‚„NNŗX UŽ[ųj ü†Y›ųzJ[6m~UH)µš”Xģω”¹$Ņ•¢$GĀøŻ)S>Ę0©F©t'|ź©©#·ģ¬Kż·Z0Wé5§eŪ¹iA%hʉN'F“ōČŌ*—ĀÓėa -&[©SXńv3Ö¦@UhXŻSoj>¤“g6fœÖ¬Ö›²ÖŚŗ94kßhŃ#Ššī×0 u¬øJx֍‘½Zv•/0ŽegfT8telžōŽ<Šķ8³<1;#ĻĻiGvH“Ž £’üĻŚ½5A|‰0[ĖPŽyÓ Ós;€.šēk®a­ģVaß>00°jÕŖÅŅŖoó†K.ųPŽP:éž—2{ļµG |ǚ&:¦'ˆ‚ń†®:’±ĻĮØŲxł7¾¼coۜ Äü‚3]Śve9'ćuŻĄŠ™½ó ™N‰w¾ķ8ÖŖ!ąŸh5O0óņoŗńĻń`ƒĪ[’|«Øj<Ø)frU~“"QKmźÖ7Įźēf<–ź)-©“ ,zżś÷½ć±»5 …l‡hµƒ@ėPŒŠ!ečrZ.g…lģ¶+É!ĪW>’åĖöĆ`l€U‰U,™P³ū+?sЬjŚÓZ÷Ņū¾oŲßoٲ™.ĶˉÅŁłm޹ļz‡ŃAF®š¶MÄlųå§žėŗ€ŁYÆW`Ng{w>Ӟóž|ō”šAÆ*[^Yfµ§ryą¼÷œ™ÄÜbQ”ļ’Ļ×Ū€gw™^XŚįĢĻ¢ƒšÖ7¾9äš²’ł‹/ɳ3““»8»ątK“ķŗtF^LĖbAћķ¹Ēv0ė€9Šl|£7g…4š•śÕ’žÜf·eęä,;“9ó 4]¢]āŽŪo«é;LÅ61}:¤(TG] •a^8wVčuœ);š—?^ĶA9¾bÕõ§łŃŽCl”^Md ]©¾ÆźūĻcŽĻ@_4PE(‘[‡‚lĻʔ Ø&ČoŲ#=YŗV²ł¼¦/u2›`kā³H•·“UmNxüŲāāøš'lc¹™fukqN„ÖĀzu0A^š‘”ž"ļe*£c0:ē‰l&#ˆ‚ʶJ‰„€#ŒiŒŒ Ž,š1}AGq§īé{L›¶C&³¼­mZ[ūgœ~ŃūĻ{ĒQǾn÷=~śĶo~šō3N<źØ^x®£­HZcÄĒĘžL%Č2uxYwžlø.rY),X²ėA ĪdąI؊²2ūց­^e:²½įś 3Ē *4C± 4Ćwƒz«˜š2Œfh¶8mØźf™™Ź@Åo¶8@dóž B6ēBśZH(‡¬—FXp²Ā®†ZĮ±0&²q3 ŽlüHHįIkŒiED«źø ŲŹ°GH&`“Tc³V„fTJ)˜Š¶gł Eę@v™®B[v|}ਢ„Ūn»-Y·Ž k—©Ŗõ*"m1U­µĮjfĪęóÓzz!-ÜĮ*i„õ×ŅɆڼ«k1@”øƒZk!„ėŗ” H¤;ų¾ķڊ#–vDĪ%2V’’ōg>żÄOp#ÆŻ”oŖE8ņŠ“.k|‰Ŗ`”1 Śaį’Lļōi ęWĻžnū œ¹‰]^źcė=żB¤Ø‘Da=°\ÓdŅŅiÜӱРˆ3€†xuĀ‚;ńJŌŌ¹'P?n-amēi3#.®µQId-nY Zc˜™Rl®?'Żū=Dˆ‚:®ŚŅHŲ2'‘¶sLNłķ)Ńę† ®QŹēR#Ŗ^A½–g0‰³ˆł#ńLĻårõßU<õāķ G¾µ_ŖYö©)C*-Ø[ó#6 ›Zs)fęŠ4†aĄFié8F)į8»ķ²«|„t`$‰kžš‡;īøKŅ^6Q£ØApUŹUü °R—~žó ”ü@0l$pöYg¬}į“!?`£nłū_.˜GÄĻ?žų»ķ~Ī;Oūį÷~0³»SĀ‘eßWĄG/ŗšŽ»īää¾`dPä’E0 b°&! R²&œHÄ:ta|ų¾ūēϟ’µÆ}µTu]wlŌ8n6Š(Ŗ¬ō`Å7„ °i[ßąh%Ÿ+:Ž Ŗ‚óö|-ƒ/aG/˜°n[‡vXv1Ń­·Žšf”4@‡BäkͬĖ4›š×KiĘ[ū„HAŗÕŗšĆF? †4–Ŗß§ŅŠĘav!¼Y½?¾ź×ß’Ī·Šå¢a˜Š” ĒčDfē9Ó»\ø@›ē)­]/3ŖõÖRÅ'© ,^­”īøć–?~’§.½ų¬³Ļq²9&’DŅŲ ).¤®#k×e­4«~Rā;¹OÕ\O†Vp\—‘ʰĢJvyÄ/÷—żöŚÓGE{`¶ž `(°!ŚiįĀ+–k »«Ć1† 6 õU¾ż¬Ų}oĆ*$2C8O?õģ“īĪ‘‘‘Ńђ\ׁ=Z†IŠėž}ę2Ø(įx¹B[{g‡Ž}Ėq0҆:/­|į—ż¤č€GFFĘeä ½žĪūļ/i3RFĮ+: Žq÷¦õėB¶ X/ÕfšJslhCT ”ś†+Ć%=@zYm(WČT4.żĀ—āõDDbó±Qx#zKčf"…4gó^ ”µ"¢Ž¶¶¢ė^w͵u~՝'ó“Ųjkį¦ā8ĀqĒ‘–C–<{„?žń£©h"ƒŲšÅĆĆĆI pk “į3©Ą²>ā&¢ŠB ŖjĮĆŖßg8¤¹™ŗ ±xū«ŸÖ oŌĖ'$«6° Sm“č~ X—k“žĀ¢EBgA«„ž›ķa°ŲH–™ĖF‡E5­ģW¬+ė_|zF––v÷›?w&Š Ģ4+/gdišĄ‰łž˜ļ‰E9wžƒŻķK‹Ł„…ü޳f.)ęwīī\ŽQXŽQXŃŪ¾¼3椫ma[nA[n—ŁÓ;%Mėčč!*„õ[9`8øõ‹??:³ųœū ^so¶ŠÄŹöŠeVšż nõŚ:Ą%ĶAÄU OU‰<ÖĢ#UØVʰaiėÄ*S:0¬MydT[u8UÅ["V³Ń:PF±8Ø0—Ų ™`h”óØā!„V>'µµ9`Öåū^z[vŁ;Żåēϳę-k·šHĄ%cü€™V*ŖTŪ¶äM›·‚Bk"ķļē„īb„T޼˜uT’p@8MĄ~9čŪ44øvēžš–żĢ9rļ]øoCȰelū°—½ÆüÜżOl}qĶę•/ƒ•žĶ‘°J`XĒąIJxĘX$To^µaÓĖ«õČØ2ĮŚõƄxį8Ų”Ö:øéĘ?Ē,’öbŪä:C"4² P׏óÄß~Łe—QČĀǵ×üaœÖ׬kܛŚR1h²]Ķ Ūų[ćŲ-Pµ‰€ŗɛŅņāÄżĘ~9H¶č'”˜Ō$M¾LłŗŽ«k4o’Jj&1Ņčh?ˆ XKw0$€é½3Ēkoļt„“nǽ½Žē ²`„T.Ÿu‡¾/+•r&“ÉåņŪ¶mu]W xnĘnœFėŒšŹ~Ō”ęåŪ͘¤TJgœĢIo=žĘūī ĘüŸ^¹xĪĀlV¬zīÅ]ŚG*Ū€r=؀X‡ŚęC%7“QQĀ5DLdW®jkk+ä •ŃŃLw7ŠB*AŹWś‰ˆgĻY.*cžčĆO»Šo¼ł–eĖvŽåķG£]8I8†ķß4 c ±¦‘€6<öĻŻö·[zz;ŚŚŚŽōÖcŚķ :ŠhóŲ!?š]Ē#b°™|g–3nF–į°DŁĄ%į$yPVć@@)ĄĖ[ŸģÉīŽĪŃĮ!Ļń*•Ź`i“möōEī‰Ž¤µ·€£¤@qĪњAS IŪ†h°4“zŻæ÷ż¾¾¾E‹ö÷÷Ÿ~ń‡ēī»»ņąøP B@‚0¬]ț~rEržzź¹CßyĀ’+@ZŒÜö«_’ć’p²ĪāÅ‹ßłŃó2;.t@š„5ęLŠøīŖ«Ć@”ó¼|±¢¦R0³—É$ūĒ«–ś ‡ŌšŲüuaų‰'žr]·o`čŒ3ĪXæq•걁Į`ķŚÕ³»ŗ ĘÖJ „ᑁĮ?]󇫒šŪÅĖ–<žųć;ķ¼bŸ½8öųf-Z( `EŽĆl±1Pl$‰”-CŸ¹ų’›’|}Oog>Ÿ*—²™āŁgæ÷š×1gם“%öø“oŲį}Ģ1sęĢ^»v=3†G†«Å±nå;WŪ«·čßK¶‚Ntü[;ļÜsķG_qÅ'œpÖŌ“uodĆJźdńŽTcēD>!Y¹LµÅ¶ĘŠb(¾~­›²±m듪æJÉoĒ‚)p;ź7v§Jøˆ›³"H–b’ÄŗĆ‚Ąq€“6’E&į$@0dŒańŠLɎVhm¤öČķźčK…1C@,ĘCźZ‹ # °1BJ­”tœŖ“s“G:öÉ:[ļf¶ÕĶž±ūåø74é"nż˜%ŖŁQµ~~Ź `StfęF½ßIT¤% lƘRŚqd£ īCm–Zk! !µ(å'h! p®XpIśZC 0ą:RiVlVæ²Ę¦;Ę a#2l\-åQ¢o~ó›gŸuŽ ˦PpĒ*9ļü }hø¶nŗ‡iĀQFI"#iµ1œƒ`ąā‹/`cį;±ž…]® [”R3„1ĢFHĒ#ŚŚwęY§’żĘ思ŗŚ‡ Ī`Ł×Z`Œ„ЄЁpYŗc'E4Rnļlļyē†BtR6`vH“ŻŖX ÖfÖ­e†+…Ņęę›nd£ˆÖƾ’B0ŖŖ ‰ßcžŽi‹heɆU¾Uå ˆØ†"$EF²Ž`„”—qĆ%ÅŌldͰµ$Ć(ķø.YxŁ»ļ¹ļŸ’üĒ^{ķõÅ/~ń ƒ:üšĆ?žńßü÷æ½ė]ļ:’üÆ\¹ņŗ«’xä‘G¾ķÄć„ē=õųĆ+vŻõŚžpōqo)tō0ƒ-\,ņØĄhĶtĀ '2sŌ* /b˜2k­„ōұ3„rW „Œč‚#ኔ’?Röó‡ßļqąŃ@Ł įņnƒCf#…Ģęó»ķ¶ŪƏ>†)Ø¢t¶­[×5g6¢HKĄ5aś"Ąīt‚%ƒ1‚6aÆ+…S…ŒÖB†:@$„ˆā1p束@­·»)-_¾ōę›o“Ē™‚‘O8į„š­Š&÷Ł(“pqŠ·8NVjŸW•cjŃZģ~\T¤ń_5[ŗ ¢l-°¾’NJmZ<”\ö+• ²Į Xū¬õš¦Ķ?pßÉG}Į{ĪŚoĒåo?ś­ßūź×æłł/°Ėn_øč¢\{Żw.½ō¹»ļyčo7¾néā½ķ½Ąl‰åŁ%m™…99//g8ŲiZūŽłŻ¦µļ1£sļ=Ģ¹[wū¾³¦ķŲ‘ßµ·c×ī¾³{–œ¹]»Śwļé\ź9{tuģŌYŲgĪōEžŲĮuŗ3ntÜGšĖ£’ąś3zöłĀ^'Žū‰ĖxU?jöyL±ā-k6£öMØÕ<ŹoŚi’{—ĪEö©›ī걊Ė.“/«š#ŗó°Žå{`ęwŽ÷YŽØĶs‰y˜÷™»Ė\wŚ4~rŃ·y•?üļ§īłę#œł'õģzü’ xņŽoZsćć¦/P>ūģTW•P{˜·ü{õ‘K÷[®ĆŃ{\~‡·µ-9µwŎ(œ¼ē뛿Óß’ļ÷akq‰KŪŹ<ļ9ąÖ^°ćQos–łOżę^;bį\‹?[dø2¦m°ŽVśŚŁ=ŖkŁžč9&·ĆiÓö½ĒÜ9Ė{¦Żļ}U¬¶“<ŁKsļ=wERJöéńøńIC¬„xņ]~¹R)•ŁšĢŽiVóĆśąQā†ĖE³¶“†­˜-”Eė5Ÿė;[’æX“į֕¤›śÄÕõ·Sm»!ś]}2)¢ŲĒ‹jŠõœ1Ę/õŸev¤ĶTjūśWJ~¹ģGĘ*†k! jŽ–bžK½Bė’n齔ŠĶKużłܻɰ‰GE³q8n1;e(ŲB+~"†ŗ­ ĶčS³{˜ųÄlÜ’Ł%nf2Ü@C”ŠļÅ}ʘ”xDڦX×u•wޱ*/³^’ņĖmR“;2d€<‰¢t2Dš¹O}2$žÅ,Ģć÷|et”F.ųą¹¶ÅŌ°ät’3#“)¢¬mEB”z\·Ēu=  ił¢ł›Ö¾lS)[©źżę»Q¬4—ʾŽƒŠśī׿}ž»OŸ/ĢooŸ[,īšwvĪŠ²¬· ŸĖƒ²Ąü®Bč’( »; @o ŗó»/{Ó~WīßĢ*`£«S²„XzŒĒ¢®¶¢Õī,~šoæōüs”rtÄę0J'µjZūRĆ6PŒ—¦ņX„¦»8A$±o±/®†fZ$ŗiƒ}Źł¹zÖ5‚.:Ę ū́¶“1‡1bBmcS1ģ·`¦Ų™ “°Œ2†ĒĘŹICÄ·Ęb¢ló²—:Ąlrn‘pČ>{±¶VI¼yóV=’=g:V$k­|6ž“>ŌęøEˆBŃ ):øų’\§ņ?“.\kµaķūC=ķłŽ|6ģ8{v1ć,ž?'J|Z…¹;3锏 —żŠżN?ŠIęTċ“ԊfÜróM—\üń„K}žs—NM##žļ/łĖ8{ŒSHū‹%}M!Ī™ąī󼚏4‚ĮæĘŠÅ*³äUÖS}¶ī `l¬œĻg•R¶AŃž¢5K™c€ŌŖ§Ÿ½ų¢š–·ŽżÆ;žyņ©m[”t_’Ģ™½«6öcö\1gę,¬±qćĘ]w]!„ĢåźÕ«7oŽāy® /‚²Q̜ĻēŪóĻs‚R¹R©är9×u-ŃB:¤”ҁ* ƒżĆ®ėVTĶfGĖ#™L¦T)‘ėäGŹū.ŁėŚ+®¾÷÷łķÆ®œÖݵ|łņćĪ==ׯ½mĆŗīīn#pū½wļńęC{—/†F)±qōżG¾µoż¦Ašwwü£wߝUFK!Ł@`7|ė‡?üŸołcē_|Ń©~ķ®Ö#śšyĖ—™b[[Ū¾ū£\.÷ž3O.©ņł|›“ |²sZĻ÷žt„X>=(ABÖѕ±ŹŖ?Ü~ႇ+żfaO&“é.tÆ]»vćęõžćł<÷ā ¢«]ČģówÜwūµŁyńŽ‹§Ļ~į‘'yŁĻ²ž;P8é”Sē/Śa¤4²u o¹®ö?łÄ;Ž{–»d‡L! (ó…³?šŲż½¼ś„,‹żę.ßŗuk`t”Pųįm7ä—ĪCF€ĄB‘0EP$ ?2vó·~ž×ėnüR&“é÷TWWWgWūwߛņó¹öY ~ūź«xn;¹Ą/•¼>’œ7—鯨’śĘ7¾qūķ·ßõĢĆG·Žŗž—æüåo]śÕu/¾ÜŻŃ½hŃ¢K’ų掼8`ŪÅ\ކV[¶līģé±=ŹqÉ-n”dŠŲŁ&Łmė6œwę»Ö¬Yµß{ÜsĻ=ļ’ĄłÅbń;?üžžūļæįÅēņłüŚ[>’„Ærōń )Ų°ö‹—~śńļœ3oö[Žvü kÖģ¹ēžæüĮ‚±rGG÷óϽté×¾ńŽ÷¾WŪJ”¶mCĄ?n¼ń†k’ųģć­]ūņĪ{ī’oo;öøć…šÖ­Żųƒü`Ķ+[öŽkē;ļyPŗ¹‹ 6†dˆMå2Y‘Ҷ›/[ŗģ™gž!!,2N?‡ŸVąŃ+•VRJ4 ņ+•¶¶¶@.—É$b6.:ŚŖLNV“æ„*B4Ä蒀žRŹuŻÖßR.—³Łl-§WC“p’Ų`ś¢Å-OD¶³±Š„Õw'cXH ›99Ö2å™ _L E¤Ę˜Łā3?3š tÜsn•~“pP¼Ä8pZäD)š=“ŖU3Œa!(ÖŖ•©:?!š•ė9öÉR©œĶgvĆĘ椞÷4Į±×°ĢÜp~µFtS¢ “jhš”–ūŠāõ'Ņ%ą:`MFQĆ׌šÕø"Żģ“­D4ÕĢ­µ !`x°ææ§wՎ5A`ĘĶ7ßtÄ›ß ’Fk«ąÆ®Ulš(9Ś+SmūæēĪzŲ …`2hpQöApĄ²Ŗ¹d¦uuløņŹ+Ž;ńm^&c…›,Vf›‡Eā:³¶Ż}Ļ‹-kÖ^tŃE<šĄŖ5«ŗĮBŠ€įĪŽ\0XŹz4b˜½Ģ€_1 gt­ßŠoŪ$/’Õ’vŲaóęϵ߀įŲ¦l)Ć3‘-Y)†3?žČƒ_żźW÷ŚkŸc=v—Żwcf‚!r’«PU?IE2ˆBņHb]RJcĒIq …šCĘ`tbEāš~ĖhŽ4µs6ÅļH-ų6Ž—R†!į$ŗĶĆ·cģļJ)ĒqģW6ė„“;TģŽR§2ŗlŲ .D"V©.Ó³@B1gάm›¶ę 0&„2ę“ē{Ūm·m«”V­^;kŚō-[6 #“q*•ŠOš ƼyÓW­Y LÄ, i tĢ_ƒųšĻūŁO.ąŁŪŪ;wīÜ»~@®ĀžēŪ:āž;nŹtwwŒ–ŹĘ<<¬| ćQ{†Œ1Ff¶ UdĘ(U Ū«goéŪøyʬYv^ ²p×WZq֙§}ė[ßźģźJ2ūŅ”mHóģžžŅšh.ć•FĒ2Räół’0śAœŪMĖŅ(»8‡|ą½÷>Ą@Ńs\¦rüņæ8łŻ§ ×XyĆ(rŻX!Ū€CC #4öæĘbČŃ“¤ŖŽś×‹/¾xŻś›7o‰v”“ʔŠM{˜Y‡Øŗ#;ŽPŹ,Y²čłēŸÆ Å Ś™ Õø;”M‰m(ņŚÅiTßE=ĮЁ«rüU"\ź…–ta÷æRłĖ ןžłB`Ū¦­3¦õlٲĶ ƒiŻķŅ``xhŽĢŁk×­ļ(d²YgddtęĢcc¾#ŻR©4}Ę4ĻóŹž°ēy/æ²FŠŒē8#Ć%å ×uŁčсRww›R*㸱Ӄ²T*æpįĀĶ›7—J%Ēq‡‡‡œĒĢ®+…#„1×uż±€”[DīØŻ_‡Wśµd9mŚ“_xVs#P!įę²{¾žąĻ’ō‡p`|-Ööą-'ū}C³fĶśŲeßčŚw'䬲=“6rŲ|īg æ“nŪ¶mǟ~źIŸ½EbM“eģ‚Ļō^Ž"„·ÓŠŻo¾ć6å¶é?½ā‡n”pĻ5žķ/S “Öoūō’Ų¹\ ĆSfP€ė~tłē.¼øŽņ…óß’ž³÷{«Ņ Źewø²ī‰g¾’Ķo\xį…ÓŲÓTĢ߯ūó…ļ’€d3ÓķtæŪķD¾ļWHÑق»~`Óōi³Öm٘o+tĢ™ńŪūļŹd3``¬Jß ĘĄč#WüłWæś•fĻżŽĶWĖ„s‘w Į0°€¬J …;~}õ§?ōīlwgoūÆ®¾Zļ1[ŗ.4ŌŚMżßu×]wݳ/­×mÅßīøćnŗł&nøį˜cŠqæejŅz­—šdBRŸ-4üĘq×☈;µŒb{N­žÉź3\“H$ė$1ŗI aW Q›—R˜ė†#ATÖĮĢLL >¶yŽSĆͶ9m ŗa&LSā0ĄPʦāĮÆ^&Œ<_¹®cæČĄŌg¼- 4ɘøžā5ī]K…ŌćŅ’›©UMd¼µ.R·PƚTāžDĶ’ā)„Ä\]r9Le“Kµ/ :Ń_U „”‰#4‰ƒH®u\=ÓzśśśĆ/‰Ź@Ė–-¹õÖ[ēĪk4ŖŠ†ŃēT?Į>)(uƍģ»}ä‘ĆöŽwFOaݶQKĢv …“õ•ŸA D‚”ęīĪĀ<0wŃ2HEĀ‘4A‚£Į#E"E†‡GnśżµÆ{Żė–ÆŲ©b”‚&Ł.¤¤1Ķ‚Üœ¦J XøSÉ:ņčcŽtē}wõÖcO~ū»}ć›įä¬L—6Z ©“r¤G (3‹lu"6a9ÖYĒŪPōzŁxą(7®+2TiŅ¢¦œgŖ¬Żšl¹ž„o‘')Eƒļī55·Ńźxn²"‰%H¹š„*Ja=/9>Ǩ°xÄ5^ KĄõ»•­*Ę [ Ž6Ń'b , Ą‰'žxĆu×w 8ʤ”2ŠķmÆ h¤€t³ƒ•r\=䐃®ūӟ‹]šˆĮŠDUĖāՅ™qŚ©§\{õHŠ=óüs /¶„ūś¹=½¬żŃĮįœD{VhmŹB2³ÖĘu„Æ3 iŗ»»ļ¼’žž™sXd˜!²>ؘ}ģcßūޤ$­YFM6±4’FƒĄĘ0Ų×%‹’Ģü“Ė~pžłĄĄ%ä€L&3P®lڲ±³·'N‰5U‹A-37›žC@™ß’ž·g¼ūĢ‚ē”}å:€ÆL[!?­³÷ņĖ/ßļõÆór39Ö`A —ĘP±½ˆHā·ŻvčĮ‡”J„Ÿ]öó=öŲć©ĒŸųÖ·¾µ~ĖF{å㢀¶<‘ĶdGGGIŠIĘ:d¹ ąÅ_\¶l™1"Ōśś×æöįŲĖdj»~^ó”89ž·§½ˆ]Æ)t!Ö³*†Å#2)¶IłŚ²A¬IĖ€aØP”WˆĶ›×š¶·œ|ź©[¶l ü Ņa==Å|Ž|5¶uxśFśņņ īØ_†+F‡Ł1•i3»ś¶lŽŗ”\.uŪŗ::Ļ+v“‹ ¢ČŽĪ¢"›ĶZķ¾’ļ¢’_Éņn6»qĖ Öą” 8¦Œ—-ė`pl A9(9¢Ÿ‚!R·?žĄõ]v‹ŁlGa›Y-ÖŗCCz‹3öģ¶—eOŠ*`_čŠ?:øś…gµ? ²zxA’€{ļ½7ł~g.7¤K€oģŒ}O­čš¤|ōÉœ¢>āÄ7žļ=7Čw0»M?č£gŽ;©;³^o}ž”‡QR¤ 3Ć÷ĶĖ7Ż}ļļ’|ą’Ū3ī¹_¹ä€ ĪÓŗąH0ÜLӊsްļW~÷ĖéÆŪóĪ.­X~šĪ‹Śu—£÷]“Ė’ĪīLŃ3ĘŚę·ĻŚoŃČ¢Āā#÷ßķäC=’Ō-{ė¹ļČ3p t»Ēmnfį4±`vœ³ļ G®Ś–i+dó¹rĮEĘ1ĢV}Ś1äd58aóš×.üԼޙ3{{Žuɇ°÷"ćIć2Ž3{ŚŽ'5\)-nŸ6}@ßöŻĖ1 ŹT|ÕÓŪÕ·qż“Ž6?Óę|ōĒ_Ž÷½ĒēfusÖEoūAo~ĆŅe˲¹ÜšU/CRŹæ÷¾SŽ;žd ~ö“Ė‚ p#żēČ(9˜‘ʧŻÅōæøß•<ęū#åņ„_žźĪ{ LntpĪÆpącĪģł•²Ö‘gr04|’Ż·üQłöĀ׿’ż™‹ĮĶ1įd—»ä‹_8ų ³ĒÓf“?öšƒ*ī !ƒkó»ĒyxŸ½÷+vL’Ž/ÆdQŠϰ ø€3}ęo?ł ĒːŽļłŚh7ć%÷ofE»ģ²sø»±yģ±ĒbĆŪqĢßAŌö8…mQ51ļ=÷Żw÷½÷Śfß}÷=ęŲc­TxŲ„6öĖ)4¢4{W‹vŠÖm“éē©õ4¦jšdź² •Ŗė±8"ˆ¤ }5TMtįÖž5„ĻįHUuĒČ>“*k»@™ĒK§©Nµ}FJ'HŽ+ćOš<ĒŹķ‚įzŽm5Œ{M[Œœ”ˆŠ× c¬\q^z~%XÄKŒh–łÕŁ7„–ģ† SN9Õ¾*cŚm¦å ŽÆWÆ[sų›ß8#SÜyś¼/}ģ¢{oøé×’ó=ÆoäŸśĖ…ēžc>ųž÷į’Oüģ›ß¾ąĢ³O:āČēķ0­»ē’O}āMĒuĮg.Z³m£P4A1\Ū(vŚił—¾ņeJŠQO8•öā0sOOĻu×]÷Ž÷ž}ō1ĒøžūąC|ü¢‹¼LĘČĻĻמ‘¢H“°5nD%'WÜ÷>µ-uBoš©īēImĘvęAąJDŠŚjHōoŻzĮy’uķ5×ŗÅb?<d$ö‚kŒÉår¹ĀŒLĘeįį gV×+ėū;Ū]×uó…lÖ”¶|a°oø‘mÅö Ül®­­mķśul¤^©Tjo+8Ž£µ2ĘxŅ1ƌ–K®ė2(m”ėŗ®ėöõ ä³Y­µšÜįį±bÖķééŁ6:°„Ɯ÷ąlQ£•}ķžŻ<ĮgžyęŅwćΟ”Hׅ661Ž%kX±×ģ¶ŽCƹ嶶żvG‘Y“aÆO}ć܏Üu͟%ä‰ē½ēݟ»=fŠ+ƒG,ŻuW§»££ĆwŃ6ęEW_ęĢč IČcōĻ\žŪoül޼ycĪ’žW˜īBĆh Ąåįę?ü±·+wé„—NŪėd!Ē,É®.Ģģ²6Ś BhW(­é»O• Ö šo•#•­ż[æ’—ß÷ø'Ś%£|!%¤“Ń m „ÖJA$ōPéįžž[_žļi=½ŻŻŻ_üżĻ°d\he¤!?ЁrYėē>ų·ŪV_łŹWfŸ}T[[XŠ® ‚ [ĮĘ;üļ÷|„ąl˘+’ń7L/BlśŽū/č[¹zƆ #œ~Éy‡öż™L†µģ”bn½ģ׿ŁoĒĘĘŗļ…?ś W‚•ėøv5ьĮĮ޶öjŃš@ąŗČ’üŅ»ß~ņŗõk㔟ūŚW!†gµ•ą}å“łĖ_ņ…ā·æ’£ł+ö4ĘH¢ ĪyĻĆwݱxńāƒ>ņżŗĄGHŁ²$Œę±õ«žłśWæ¶öåÕĻ<½ņÓ_ųŸÓĻyŸ-%?pŪ­ųÆsŚŚŠ###·ŽsWēŒŁ€œØ|®‰(źO7Ž:ļ°$ānÆfׯ€ d_LŃjÉĘh)Ąo~łó;o½łńĒßcŸżGGGģøćŽē~ųāžY3l‰1$T«Ä¦5KėY„Cźe’°żŲcOģ¹Ēn–Y-¢“eUɃgĶź~„` lFŹcž—‹®Lą¦Ž ŽTŖŒÅafr "ĘóŲX)_ȍ–2™Œ1Ęńœr¹’Ķz©4Æa%…GEh!„! šk—Ŗ/øPR®ņ)ĶÄ9Ś Įæź‹¹¶¦SĒ åś’C:^d)!½x،[³ŠQŹš/ł9öBÅĖ[«Ņ³¤öH‚±Ļž»>ņȓ®Ao{{yh(“ÉlŅŹ“—dĆ@!›Y²h鿏=)˜ ĄrŒ°BĻ`cŒ€ A¶ś)ų²Ÿüä£8ß‘ĪˆVRҌ®žu›6….F–TLL+„”F€cT&ćn p€Ūn»e’ƏĀDŰ®)ĒcĄRČĆ9š®»ļ3v ‡!bĮÜŪÓ¹aĆr°Ć5ƒĮ–!4ˆĀ’]±Y½žCīŗē~ ŅõXpŹēi¦DŖ¶Ś’H3ółreLkØ0ÓĆ”‡zŹ)§¼’żļ'įT*ŪP jŹŲć¬ē)N\}@\ j(9e0£Łv–Ś:9K“ łMĶČPI°ōj?į-µžŅÕ¢§Ļ©Q:dŪRźć¬riü5æųéO/üšGtPī,f ##£Å¢›ĖJm„#ŃW ƒ6Ļ…"d“)W4õfs^~p”ixŪX”\ćy3Ż éöž|g± IĀ÷}įŠŃŃ1‡u>Ÿµą+åŗ.C Ił|ŽuŻĮį!m9r¤4Ö.ŠŽ#"ßG扵cĮ°³eēwŗä]ļZ²xłĄĄ\Wdõ`edžPil>Mļ€ēJI0ŽŽ“)Ņ”śóž{ļ双­zEe˜Ą€ˆI@HC g’½zńo “qĮ°Rpo&ƋīćÆź{åŹė~ˆ¹ķ,8,<:ąĶośŽgæ™č†R¬A®+zą· ĢXŠ9kæ! DBąĄš%¤ĪR)›nŒ‚K#åaœļ,\MFGZr‚`„€$ĢŠģ Ń>ö0t·+ļyņ”Ą•.C3„+x,`f%„ćHQÓ?VY½)+Æ£čwdŪ E1i’žŌä"‡Ī]–v,šŻ·yK¦`Ū(zŪY3iżŌęõ2Ü̃Æ;łø£?v²ŪX@CzĖ—ļōŪ­}ĆĆĆōōsaC–6b֌ÆlŚ‘l/¶Ē%d»Ł3\3°1‚ųļ½ł„žkkkb˜"¬f u±#£ś‡wY±ūc?=:ā)žžłŽž™›6nŁ`kń†lų!@œ5{‡J Ś Å;-ķķīƒhó¶­¹ŽīŃĄ_¶×>m3ę)H ‚÷lÄĘ@øa#J“«'xe„Ŗ¢`©ōõõÅ1ēyI š¾†ĄŠ+Ö®[[MźĄt×]wŠÅäāšZW&˜½4¬Ķ'÷ƒtłæ —5łözÄķ)Ž6<ų†RJ69ŽģŒ1"”Ć@L֕5Ą1(ö†M¦õ|E›²…ÆÆ?Ԩ̬‰Ŗ ]j“ ’b Œ1’DsÄŚ°q8[=¤D“JõŁNĶ3,"Sé#RŲŽV›bq£`½YM¤^2þ+iŹ]ŻĒT½xšĒ»rU“cŖ\åqū™["šŗ‡4~G#$æ•Ūpć?T©ū–­”K. JKāó«mš©‘Üčćx+ ūĀ•°ŠŁD”i6ŚƒĄ!‡j}}I ”#°’ĖŌ81¶‰¢­ …ė°aĄpŽyĪ{O;ēœjŖÉ>ˆ4\ X0¹€QB€”“q@ŹpśÄ"öævĄļ±ĒpĄ†APĄ€*K€3˜µbēsŽrܑGćeĄŲ„W“ @²€•#––…Jz[UkM–¤ÄN˜ ‰ÄŠāź`F¾ÓŹär9†‘Ėebķ€X*;ØŽĒčEŌ¤·"^1ŖMQ›ÖÖ€ŹŹŃ§Ž…hcS•ÓÆæ[)Īv••ē8¬Ö‰˜WO KČbf[ą"’!£Ų’ ¬rģgSŻ_„@såŖ1rme-W`A*ŹńāŹxZ##1ąįģųŽĻ~vŲa‡©aµmhČt„b`QbÓ§·]żõ»ķµ7°QDĀe!šdÓZ ŲāK²ōo£’Į’uŽyśĄłJ+’І»zŗćÖz!-ÉßÜ/|õGžČ‡„`m“@%pŽ?ž˜_żśw¹|P hä€ HJ0k!„“=“’üē{Ī:ėŠß\eo HVīøćrl†\-!1¬‰Ā)#„-× Ę͹±sĘ „ōØJ„ śż1Ź{›j ¢5½„Z”håĮķ(¶żóĪqĘ7Ż|³h °Ę0‘wŻŽŽŽW6lh#hĶ€!ų€„4Z½ UŹ®t­`[ø„10fMė½į†ėWÆ^½`Ńā}öŻ7”ŗ$ Ö°µ8jܱļź2J€ćXo$TcqńˆEĪW)“k(įŃ̜¹Ź’ÜjcŖHkT&õ%wƆ±_źØÄvbŲ!Ø[ƒĪF@š“ßŲ éƒLp*¹ä¢Oä„sžyēĪčÉgR~eĢä\Wˆ|©¬+~Pņƒy3{–/˜éčŅio?ź'ßłŅūĖą¶5F—žZ¹ŗo4č®”Fžzāéu/=żo’ųĄ™·Ć¢ĮŃ1ķIņH8T¾6cp+%¢Ń±±Bg1_Č PitLU|(/›kė蔎c˜ƒ Bų&­hv žšū’ūō§>ĆĶ·¼ļC?üŲćŽvڶUfŊ[śūzgĻ-°$±;‚Į0†4H vxīC’ž·¬¼Ćžn¤SÄĀ0m]·¦cöō;̇g@AøÓRå°×ŲVČ»R|ō Ÿ)īø$œ»€P†tLÅ%sšžū”\aéZ?•įõś¶®ßiłK,[„pĮŅņNˆ!młZ‚  ¤`†&Y1 Tæ²mlX*! ‚R#ˆ$kC°S6“z{؈Yå“Éf¼<Äš†Ķ+f-ņū‡”!Ä œKYOJb6x““nķšö¶ĀĢéÓwŻoß8.A‚ģū`#3ņM‡½)ŸmŪ64zÓßo0ʐ+`Œīļ[øh!sĪ…FރĄģ0<0ōmnĖ:3{:Ž;ž-€ÖÄpX/˜7'āžj"ATÉ$5ÕßłĘ7gMļéél;žķod°§}8°!¾ė®{śūsłƔfĆĄŖēž+•ąņØ?ņžsĪÅü°°BAN&äQoyéåµ/½¼¶`Aüķ–›roéŽ;\rńG$ ­%½„0 įXŠ™m:H78UŁ "ü!908Ŝ|Č!‡A@!~h’œŚZ’a-%&ž ‚ą“N>1ZBU~ĖŃĒ ÷@„œ«Ø֚5„ō͘ĄĶ˜œ©T$‚V“­yÅT·ųĆÓēČa×Õmź‹R R ŅlÌŗęÉ$rk— C"¦š{MÄ$…lŗyD/f hÜIb"&ģV  1T   ¾Ū˦ š” l1š”¦S-$+„ØęĆTETB¶µ įH²}ģQuĘjƒD«Wün6ĆYG{׏v}/ߌROCqą+NŁüŌ"M–|dOǰd8nmÉ&ÉgNėX[°÷%ģØąωøŚ’ā…&£[«ķ‘¬øŪ(?V„žT­$¹C7L†'’×Ņ‰0®1•J%9OĆļ%XjkmŁ„nØGw˜’ć_Ę^ŲptE×ĆuŻŚ [ƒųĘ©Nü-é|8A%µ·>o… ‘Ą;N}—f‹E޼hŁ’°#‚  Įį\•SbYˆŗ'ä2ːX.Ŗ1؍֬Ś1BA ‡|U±WŲj>ŒāDńtˆÉČ&Fģ}hŪŖ­¢ķĢÄĄĄ Ö\*•ć÷ŠČęŲz­ž“dŽb(Xk¢*XīIxįk’é|_Å"¢Uœp?„pQkc“¦ź“umŅ"žI)d !õ'3į伋mjjpąpK@Ąńd|%S‰t’Ņ/!$ȀĢĮ{ģÆĖ7Žpķ^ūģŁŽÕį<ʇšÅO]¤tyż¦ż|}6Óf—ņpœRŌ{L ĢŽ½ķDa ’Ę,]ŗ€ŌČ9Ī“Ļ< 0Œ­@8¤@ź¼÷ī;o™ŽSÜs×åxĻé×_uå@ßę?üžź\>EDŽ€cļäJ²ģh2pÜĖż£Ėė×¼ä°Ś{×%ēšleF—ÆŲ 䐚ģr$…ó><i©j”¤¹®Ž/}ž Ä ‚Ī}ß{·¬Ū`g"± ŃÕ ÆC|U mtjѶ7ŖP(Bx™\±ų‡k®łćļ»xį ĢīéŹ 8€Fƒ`ż–­Óڐ0y"Ļh (åW‚rgG›Æ•Ūžś÷Ćß{÷#÷ŻŒŽ±Ö¬ĶśM[ö9ąą“Žń®}öŻ?¾S øOŗB8ÕåĪ›Té.Œy}Å’g# p@†K« TĢŠŌ¤»$;NhqøŸ¦źŃöæJ)"r]7lųŠö ’djs”čävĘ5=˜&›lj†&/Kż%rŖ2W„VŋD$$6¬ÉOP0LĢē¼ć䮿”Żqr‚Ģаąå{{ŠkÖmR•A»³ÜyēĢf’ƒŽ“JĆā¦a&†pD֙½Ć2ĮtĀ‚e'œņž­›ÖŸsęé÷Żswi4Čf°xĮÜRy$ßķ9+„\'ą¹nY].ē ķ•Ńįö®Ā芥hFųł|¾<6V6”ßšśƒßzņ» 5 q`Čššā‹«±fõŚ\¶`‹4Ŗ+”Šū+l“ ̌|ū– ė:Ś;“+ģŗ¤XJŠAœéČ÷mX—ĖåTyŗv™ 1_õ×?ĶĪM[±bÅ _—a‚EF³`ņ}æ·§[iķŚµ‚}-\‰rš×ėop†ƒĮņĘÅG‰ö|)+(cƽŒŅ˜°70Öõ×fzŠ.dĪėķ›ęyeæ\× įIr¢[°dŠŌ$ČJ21”ąxĒmĻgΘåtĄL&œRĐѦTŽ2`•ó2ŁL^Ęs=0³+-iJę=ÉNö”{xå„Õ+–.¹õ7×¼į=ļŹzķ(fö{żėīžŪķ>ō+/®īÜugv0DĀb{{‘ˆ}æüä“OI$„EPho@.ē©`ZO·”V 3 k^znćĘõŻEo·Żv‹R)ćxnrž‹ÅĶ›7ˌ7kö IBkqY3¦Æ~łyß÷G‡‡Ū;2 C‘'YŹń¼yó¤¤eĖ–(æ‚ €ē0Ćhµnķ+ÅBž”ūŲ}ßף–$)‘ł’õŖ:+Õśh’Y)•Cf‰Ē{ģčcމō>j|_“ŖZk×mZ];ćŒ3Ī>ūģŸżģgo;į„_žņ—ŸżģēÜyׯK–,Y¹re{WWØöĮÜb”­ėZ/Ź-ž7ĘT*•l6‹&.¾ jØqęŸHė™9ćźøĪĘŠRķļU:hKāS,©*„”Rö=Ļ‹Ÿ$GøģŚ=ĀÉzmž‡XF³ցŒµŅˆŽØR ŁDĪÆij"7īj«Č1Śp•EBX±TĖs޵Žb\švU,Ä]½ųMʌ‰ÓĪdū(EA¢Œņó†ūYG ‘Ø}Å9µ5L6&d«ÕjtSć4²~04Ū ć|RѐŠÕšøQkO½6µ¢¾MęŌģµÕȕIø˜Z2ē)Vt£pō¦GdŌI`|/j,µy|¶H‹S>ķō³Ī<뜱±2m@ĄqĒDXY{’(Ģ×?"Õā0›•Ręóy!ÓŃŽ684,=W_}õė_’śCĖ8ÉØ)NµäɧžšŹÓ’ć3 [k›÷š}xrĄ»®[uJ·•Wb€:::d³ŁęC·Ŗ³”'ˆ‹¶U9ėX)Sdš3䉌–ImLJ)„”u%H6ęLdŽ5üźŌ¾“Ō3ÆŅ^p ਷wŌ[Ž{eՋ™L†ˆ¦Ķš…ŚB^ īL=MĘźBÆY½f޼y’ŗū®x ··w÷Żw/kģNƒ öŪ’€|ģ¢ /¹¤fŏņį–Ż6‚™‰ĮĢ$嬹óī½ļĪ}öŪożŚµ w‚d±šO3ęāO}ņļ>ķ7æłĶ…^čz€qmqGRH~“[č|ōńo_¾óīG}ōK/­bT‰śeÄU=Ļs8PBXĖų† °mpx޼ŁÅbńŅK/ŻiׯŖuGK°žÄśš2ņØé&5 “ݵ v­ĖqŠoC į†j>arį+Ķ-Ģ äŹ3.2 ,ÕļęõowāEĒ÷Ē“õqgś( pą@2³¶G¦­Ó4?żģ§æóŌUÆģHé1b_JĄ)d×nÜ“÷žūģ¶×Ž?žń“…æĄWJ&aÆ„B‰CZč½3ēžéÆ·€ƒ×øß7æžßŸųųGūś:`҆ Hyž—ÉfGFŹC£Ć֟uż–MVŽēfry-å`©“µodĮ‚9§æå-ßłÖwČu™Ȑ’uØI'ə»`”1Čf³ ,ÕÓA±b5ū Čq; mŅÉår¹5ėÖīząN,eD "äØ0½³X,h­‹Å|ˆäķŁĪ޶®uÆl8kßżµĒį¼¼+„P*Ų°q=ÜŠq|½Ž1„ņĄ ‘a7Œ9œˆ^Į "aŸt8eĪň撮{ÆbÕņå;ĮĖ„ °  &+-Dl¬†3möd‹Ł2óĄÖ­%WĀõ`‚HOHUö!½ĄqßxěŸ}źŁ¾M[ņł¼#$ą‰__÷ūłŁŽ¹sę­[½fW?Š–ÆĪ (½mĖց|>Ÿu¤Et¤ć¼yóf"ŒłRČm[·öōö‚«„+©eķ4“5F×<ö¬åĖ—=ūųC«V½“óN;B‚“Ö$HJuōŃæūŻļøR~į™ēf찌`ŗŗ:FG‡ …B.—3•¹JDT¶2Ųm—]!^zį…?ŻpŻēžkIwófĶījkß¼a朙sĆ4?Ść©ŗĶs‹(<©ŗ,…„įßżīw!ƏĶ'>łÉq;¾ˆZII1³e_’׿}źÓŸŽ“iÓ~š#ŪśśoæżöćO<‘j—Ėq·œ$<;YõdŌ•ĶfėRm]öš„$"YÓNÜB,-Š„©öqC)DĀĄ÷}Ēq¬ØxŅSĶIŁ©ž“ńB¼į@õsĪ9•J„˜oó<ļ[ßž¶ms;akm’•@˜²„ŹŌŖöėDZC1ŽŲŽ<ņČ )ū‡† ¤›7÷‡o±³¾¶÷‘ØńHHµó”¹–A}¾”j ˜`÷M]ˆ÷¤Ć~ęęDżŗB•ķIōF„DYJ-M 6̶“"bZ‰jó·ÖŽ·tå8Ž”2\3›rAäółÖm)„Ź®ŠNÄÖNf +nąTn`”l«‚>oŃāø‘Ä+[WPēQ—ģ,7ožRŖwŚ“cŽ=6Jō „G8ņĀK>m“BŚZ­ÖŚBń­ēPČŁ'Ķ;‰öŁļ@͘5 †Ėņ8NöąēĻæų’OŚ>…j—¦2Ck_a@`čEK?·ņ@čRé±Ē{šž}ōŃ5«W­X±āæ’Ż¶¾‘Ł]Å­[†5N9å¤/}łĖžē­Ūøiß}÷%J(ƒA6 lūHlUt{œčŃ«_¤”Ā(AL*K'Gc\~­c÷ŠøēžD/ź«xéʄFS ¾¹EłÉ‰ū:ĒQ*HÕėń…±™“9Ź#}ū®Ų{agĻ3ēlŚ22\a@#lܰ­³·pŪ­·č03QJ)ĻĶ !,ŸJŲŌJƑ‘7ʒŽĀęuŽhr9 ¾ł¶;sÅÜI§žóŁO~²§£H20TÉfņ>ér X°†®Š*p<‡”(—F†Ė•Aē~ō¹ąĀ‡xšä“Oē„p¤ˆD Ela …B>Ÿ‚ą8źŲƒ¤> gŪżŽp°fóśiN!—Ļ;  ¶© TVŃčšŲÖžžÅ‹æ¼~=rY®é²ē¾kŸYµm`Ū揾{ī”ū‚KDd€HėŚ/¶¼¶,ŒO2ä<Ēqöč™?44”5ذ(d¾6¶ņ²0šÉ!­!%Į u¶wM^»ycĻōiŪNŲŖ=#sšz®±ŗĀ‚$±Óæu«ÆLG”ą8N–X²! Q°”Y/ēx…öģœ™³0ZV嬓ĶXyĆ,34Äh°fĆ:YĢõ l~ó)DZŠ`†ÆŽ>ģ kž½²³ŠVĢäįĮĄØ@9ÓfLļźé®T* ‚xÕ=Ö@Śč‡~ųĶG½I+%ÆZ" !„°/żŪ-·Ī˜6£k憇‡×æ²®{öD&“Ļ6š…šžxā‰žžž]÷Ų½X,°rxhh󶭝ÅB’֑”ю.&‡ Ą¶–A`Å$±qż„”ēy't’ĶÉ­ß}.—)•J\ՇHÄa'wD2M­±i„ !E(;d”[…‹šzÅ©°Ų9;4Ł2„1†(|Æ_©|żė_æģ²ĖL øüWW҉¶o"xkē˜ÉFü)I­‰nlŌōRš{C„żŒøZĀó8¼5B-cS#käeÜøųś4H²ō:Œ¶·…‘č†as¤h{ﵦ˜‘%жč+kŒÓŲK:l„ØG ĢŠ\‡āü_€€h–ÄB/a tM»?Å96[OÕŗ=ØÖ‡#ęLڃqbšEō< AA ĒZ„ā¦éJv³ęófC:ņł“²Vjż±“ÕŁŚž¬øq\µ˜-Z6§SČkŻ»˜9É5„?›Ī£Iž``ž÷ņ««Oh+V…fÓĻ$źGĶBØW÷‘ @SĄ£a}ć7¾å-ĒŻu×]!E‹a»['rāš1Ī·c&dÜ^˜źØÆ5T»i”Ø\ó!¶(_ż^‹ÅU™Oć29SKe˜B“Y'Ÿ9éĮÓL† ¾/årŁā±Z‡jį®ėNP駦ČK¢*īĻönÄ’e2†“ā 6æäŗ“Ņŗ²hD9J)Ē”‰ äÉM­ŹŽėYRp\6u’Ó!öv¶ŹķD$›T1„Ø.­ I©ŲaDj­„ćM!kµ‚h…($&mn×ģ”myŲ”ą6¢PÜó ƒw?š@A‚”|ćĒ?Z󬚳óę_{Ķ5ŽozӛrÅ" gĶ›\‡аÖ­µR ‰&Ź& µ…L&ģõ˜šŌ-8 ɒMkź\Ņ»į7T œx-ø!9¼aÕ©įb«cE’&YqņŪEÜŗCDžē…:UĶCXϰĒ–&ź.^Y¹ņÓ^øhÉ"%ńņĄ¶—6­“æ -ōŚžæĖQ*nXæ5S(ę 0 r²™|m,fˆB…x›ŽŲZ E5P"‹\±ż³ŸüL0Į8Ęx„GĘJ„”‘ĮJPf ?“%ļeĻg{{{Ī’ąū¾óķļ.\°čķo?Å:$ʋ“±ŅpŃI⇸?—Ė”Ėå Ō,E! ,äσ/0ŗŲŽöŅŚU wŲ!Ōµ`H†ē8č+ßóĒæfœā萿ć.{€%2Tšą#W‚Źū0‡EN(Eo-­ „Z`Ō/wLėA{’˜€,N<ż[ÖošyąQŒłķeĮ'ų‚43ĮLPćPŠ’4!Š£„ēV>æu`Š7\V$ A Ęa 6`H°`cp„t3’å—_2Fi­‹Åb„RCDäDB HĖšA‡80:Üß?p×uöĘś ‚‰  ą”Õ£?²aŻś±ŹŲ;Jf@AłžČˆ0<Ō×_h+B h ®ąž»īnļ萎ÓÕÕeėNŠD?ņČģ™ÓlāØ£RAEF[J©Ri dl;j8ą vŻe?żéĘGybåó«ŗ:§E;SČD’ūć>÷ģ³»¬Xńų£’^łā €€ęéóęņE?ŠŻ/<’"IDU† BY{Īū ł¶E;,éźī…¶Š¼¼Ē>{/[¶¬§§ē[ßśAQł\‰¬ĖˆCµ•Ō\E­w¢]C’uĒė7¬·(ń/~ń Õ÷īŚÄ/”¦Ą­ŪKˆ$ XĆór›6n m›.×®]Æé”@L®SSP؎)Ū„YŸ®Œ»€¶ī0I6n„¢ŗTŠ0®įmWM¼¤%ķk{\SĶbĮ°XÉqS\hguTQµ„6y‚öGJéy!a”u%…wD¢É«¾ńŖ¶¢'li8ŃXļ|ö"'Ę Ńh£Xr¬fVÉŽ'®m/‹aĆĶCGŽO¦Vį¢*T“ŗ•Rڤ7…GŁņ“ė:)"h=cR,µ†įKŅž°5œ[ß5ĮlēՂš~cŖ[ø>‘äFz#,(n­†Y’ź_ƕń+AMvp{j|56Ū Z£wß9hۇɤ!4„fҶ+ŅFK®ėZŲ6¦Įæ¦ČLŅ·^įč£fÖĖ–-!¢V—øQY$ž’õõŽfl‹fŒ›†=I¦x Mö>ŲžäXŠ!ŒP]gāŃÅØ1õMi7jT‚I Å'§„ØĮ¤&T‹DĀ»{J)m‰6Ōā°>Vä!„Ź 0€!Ų:3S,ń‘”6“½q÷>'v6µÓ©Ŗ^­›Ūėi—˜®Ņģ¼’O&=~’„—aļnTū‹ ėH¬åVC8®?JIa7{Øāaź|ćŗ†E&uR³3ŠŃ.Ņ$j¶\iė‘1­ÅǶ.’!£”’Ă I8ÄBĄp‘óē-ä 'œtÜŪNĢäņ€³ µėŖ‰ekbŒquĒ=‹ žl3ĘPRą 6ŠĮŁļ>å×?śžé@Ā֒ ”‚W^|”4Ņ·hŽ,£J#å@“(kMž'ł~%ćÉ\Ö+ (ĶZŹbg×·¾÷C·*„XbŖńz4—.[642ÜŃŻ‘oĖ25«Aڶ*ĮĖŻL’Ömxå•W¬ŅCŲlŠ7ö÷ļž“oõę 9„Į‘ĶÆl$|ø øŁĪ®'ć½°ź%Į ňPĄƒŠÓŪKB¬]»ʘPķĪģ®Åķä3/>ærĶm÷ź”2*†`ą2»ĢŅU˜m ;Œ Ć3 r%r9’ófĪ^õĀ‹0¬–¶9ER64 °Cp]wŚ9ėølݲ…mŃZ` ­”™®b~VW±½°qĶź'ī[F``Źlµö‚1%3šĀjphvW÷ü¹³ŪfM¹ŒmåīPą”±ŃĮŃ€m9ʐ5wīÜĮ‘aräc=V ’ AŽ«GlŗõÖ[ŲhþĢ®ė"BćńÄm÷2ēœó£“ ĆVĶ šLćQįY°1_žņ—mg–”tōŃGWćĆ-莓Ō[Čkżµšš.ŚTźæń«]²ćDn‚H`=¼Üąh©ĆaƒŒ¢Š^6²é‹8uh%Z•Ŗj`_ Nę`µ=a“i—6¶T½H$£A€P·Š‡XäÄŻ€ń˜n"¢t§©äĀņ" $æ„*ÕÓts%B̶ŠŌ_’ŪgB*<!Ģ‡ćƒŅšć`Ā6Ōį•1ć‡#a&ŸTؚd^Z…L¤ŅŌšOŪćLjøĶšgČqOJķ“5c©įPį:–D\³p„—q›¦Ü“Ģķ•2RŗBŗ±•.X’!Ų–”H$A‚°“Œ“4ęW‘—X_˰_”$„ǰjtŻDoļōT:īŖ_ŹRM&Ž-Š}õÜŚ4>UC“ŅS־ѲZŖņl ÉŻÜčÕõ$1Ų(£qż5šųÕ·ś*ŪÕ×ŃŅ9€RZ+Ӕ‹@5볕4c2Śž©qüĆd £4ė°Pž ¬rŌŁA‚u•×=ī–jq3„”Å ’ƒŠ>c¢źņLcTXM5†ŒŒn3'„ģZģ³¶²`m™p¤C˜t™«ŚU'4.öM2h1¤Y2šÉHq(-k:ŗnkKnbc| ݧŲb‰R…žĆbg[ƵżŁo}·~Ų§ČS-˜SIŹxńL UVO¹MŠp”~S‹·ŚT°×PūcÜė֏ˆ°^5eˆ¬v“aŌŸÆ¹jė+k³YoS’(8ȉõƒ„]Ż’{Ł÷F†·üņ7W*Ć,A FŗL€M¾ĄDŽdJ2$¤GŅ5, ICR³'ó^¶aóąĄČ˜—/Ś9¬”ļūeméP1_€a?ŠA “šąę~ó‡k,Œ^f²fsų„!ō ōwtwAHe88%b[ė 3 MŒž¾Å»ģŌÕŻķ’72<Œ`č€1Œ;~}ķ_oųĖČPŸė:ŻŻ]ž#BŃGÅ‚wÜ1›Ķö÷÷÷÷YkĆQ=‰ØKĖéU÷?x”­`ŁeaHä3k¶W$ĢUķ²|ū{NļœÖįzįÉg°n+0Ś€¤‹u}·]sĆiß„EūīŽ™=p¤b/«5Š wX²óĪ»€I³€ TŌĀ…‹Ē[±b×7ž‚ŠZ3pĄ°dž+ž÷’ˆ¤ /NØ,^­HĆØŻöÜmdl¤ģ—ŸęiHŹó’A„tŽ9g-_“°˜Ļ(æ4224kÖ @@8ķ¹’žÓgMŸ1{Ę3Ļ=}÷?o‡ČVB‚R£ƒŸ¼äāŃį” Ö}č£Žļuƒ„ujŚeÆ½Æŗś ,xąžūĖ_Żŗ-Š+ C3“„@Y—¶VJådA=™;„jšDßżīwūśū4˜Amm…*Ńt¼˜8N)¹vē䄾QœqÄ f†Ö¼pįĀ“ćäx‘ėDżq‘Ųd¦‘fMc5‘ķįŽ6 S>Ć飄tÄ{9„I€œx%¾Ž«æpTs±¾¼õČOcFU%j„ćDZk›š‹Ø%–"śC*įµŗ9µ‚“ ŪĶÅaŖµ/‚Øuń©žTE“0[ķnm·Ć lXēū#ƟØ)"T*f(eš beCńšJŠA¹A"Qå%t8·AFóšB@‰©öO Ŗ œ‘ś7"õģŖøŻb1Ļ–3“)NĀ)P* ӅHPÕ啵6l€x$jä²ģŒ`Sēxœ|’Ó s `¼!nģHk¼Ē|‡r„ŒjŁŪX|€‚)G““ZdĘĶ'Y‡ˆ„å¦g)ÕՐś2Jė59žŚA4ƒ“M˜Ś|>™o:ŪāZ¼”5ųTjœ®0×,†éšK£Õ)čJ\0n… «č×kk.*bœÕ\Ųš ŌI0¤ “—•ø‹1ŗČÖ¤¤ŚÖŒŲ!LY…³ćŗƈYÜĢöH§ŠŒqU=™įĵ&UVHĒ’ł€5:‰l6(˜)¦¤5Šk’fVćžBżiĘnÆ }&}­X²"°#ąւH2‡õ5M¤ ”HZž ‘C‰É2•’eŚ×tµ™,W%Nõ—“a}­ž8~¶Y cŌæ7^yLķ#¦¢¤šŒdĢAkD½…Dd"4aŠ4ńŃØ•"i|V‘ <"ékŒžūž’Ś06øvxlcÅ64X2šĘ£?ķ½p‹½Ģ®„Ch"ć:”ĘĄZUJeŽšQūéZTWK:Q€"AĘ⯠Ę_žtżŒé=žččŲą a%Ŗjpx”ˆt™G‡Fde…-ƒ•GžxfÉĪ»A8q]Š«>,Ā’CšŒ  ›7‘6oŚŚß'„ „”a,„¤Ń‚0»·ßT¶ Ī_ŗČõ¾2†X ’łšÆžūūė_Y»ļū·uę_xł¹Ry\‚M„tė½wWŹn!_hoƒÖJshO€!!²^–˜¦÷Nƒć”¬¬Ź˜›ĻžpįūŁśņŻO?üÜK/üüĀ/ąoO›MĆØ@)ÖŠ0ĆZ<µ^¬"c Km¤b2F(äXĢl_Æ·Śāž^üķŸŌę²4@€`LSŸ’µ’(ŒB”9Äģō T*•b± Ž`Ō3i˜’³d6p ĒŪeϟŽĒ•—¶œ{ś{ž»źÆb[FnįÆyšłū 7>õŅŹ;7ńģ“Ž#V½øņżļ=§żśņࠁ¶“/šÕ‹O>żē?^[*•’œR{Ą¹E6f͚5q šń<žś6Čß ¦eż,NW>żéOĒuĢwŽ™£(ĒŌ- õ P}%ojK ęsĻ<{ӆ m™l6›2łŒ'TI—į^N@ĄõœŃ±Źī{ģńĮ~4[($[ØjAѿüÅql͌¦;6­[ŸĻg}æLP‘8¼!é8ŗ"v$}ē»ß{÷įĒ<ūĀŹĻ]xɏŪ:;LæüņĖæūī‘įMo;įø#ßxė>õYL„¬”=ū!"_X°`Įęµk¶m†Že^ČØ õŠH’Üy³6mڰ›£(pęLæēé'>uŲÉ[·n}ö„§ßwŃym³¦M_¼ąģóŽ/„ųõOyēw¾øź„Ūn»­kī2A"©aē_ņÉ5÷?żÄ½2›^ųį#¾ū„Óß¹zú믿žĪ»ļڼmóŖõk ‚“€ä8ķ0o®2•ĄóÕš…g½g‡Żvž÷ŹgJ’O’Šłļ8ūtiĘ'!øųĪ÷¾’±OŪŗq©ņg/ü菝rĀńo’ēß’õšw—6mĪ»™ŽÓæłķŸ.8p†Qæd׃[^XóĀĀw C²–Ķ$2ĀyfõĖK–,Ł0² ’ĄĄ• ABœųŽS’(Ż“Oy;3+A$©o[_Wg—½ŃBÓŲŲX¦P kŠČ‚Ū§u­Ųļ[ž|Ó¶ Ī;óŻÆ{びgĻžżÕRJuvvqōń<ōe»īŗeŪą†Ķ›öP€# )9õ]ē=żŌ—’rs’ęÜń×Į­}{ķ¶÷ŠŠŠ¦­fΜ946\&õ¹Æ~ Br­g=$ m½ŁæüõöÆõæż÷CO>ūč®»-™ŃÓ{ąnŻŅæaƆM›¶µµ·?żü‹ĻūbWW[“•¦˜‡ ¢żöŁēŃĒ#wv¶ösŸ‚ƒH€Ä8L£T‰®Q-½šŅ‹$pö٧­X±# ĮF9ĀIROcvlcŠņ”Wö”0CHR=IŒ#EŪP„°¾gMźR^M-®g½’}W&ēi­Oj£„”v«żj@ń¢°ń2õ‚R-d~¹ći’ öõĊźm¢«PÆ×kjR“ĮMéŲńBŌP £į&8nՆš¬H±«3Å[VŚĘ¹$+_Ōp‹ -“)•x7^ [t‚›- wźŌ7Ž[‹åĻ£‘!œT¢Uo(9w#éĖŌÕHmL©0ęU©ŹY³«šRs$yM5CSD–«ÉŠ1åyYx)’ŖVj|D܌‡Ś!Óōķé+I-DňØP(ŌsRoŃZ7k˜bN󱜆<ģÖ!µ1Ś^;ĶfīüłĻ?žxE…īī{īż¾~0RNŗ [;Œ’q‹`š¶-›u寖͛·eĖ–¾Į”Œē@)]ń…2ƒ 33—*Ų4ŅO.Żz’ż ‰ŚŽ®‹’ ށÖL‚”Pbz¦åK¬ø;)Ŗg6$µµpk¬–EĒ”;Ķ=įĄŪÆūóņ̜_ųĮ1Sr³™õƒ›w?`÷w}õ‚+®øb}”2ą½n‡N“±É³RŹėvžõüƒŻ^& 3„š`ØŖ” 2÷?żšFŒæüt÷¼h—ĆB°Ćd·­ü²Łüś»ēžyösW ͽ[7>|ļ½wüłĘ Ū‚‚·qhć~ vÕ:Šr  ©ĄrZ~ļws÷ŹĒJc[ŗg÷ÜwēķWżör×Éø¹LW>+gO§ī<< Md;EĢ3«ž½ēņ{ŗkVÅl\·łž5O‘pFt©‡„ ².ĮA •#H,źyŪW>üƒÆ~=_įl9øā?|āž{ŁČžžžG×=irŽŻ7cłÜaزé6W?öwb„Q…ą: ‚b]©8ŅÉģ0}c6xąŃæ½gĻsŃęBFīåĢ|ÜÉoŪåż½ļhćŸųÄO/ūi8ŽŹņ&}ģŠ.Ż|ģ’‘”Ńūn’W”'׿÷“µµķ¶ļ^+W®¼žĻī™5ė‹ßųōsĻ=×ÖѹjõKd¢XĶżÜē’gĒW|īSŸĀkśG7ōõ:ó«×æW©Ø12u`Ušs’·ÆÅ7˜¶7įNݚŖyx­Ö}3,.9į0Å­“½[\i¹*$`ML’Ģ‚¤;y‹Rf3»—&™M 9†ŅE£A‹q’J,c5Į$Y)ĮĒŻõµ©`k¹]L W³õŠ‘ŅÄN5ų“(Ž{ͧ¶ž¼Š½ķj¶¤Īś›UڽvK_Ćxæ®±‹äk2Ր”øf{NōÄ5ūźÖ^¾Ūse&k_2q?šx.4”×j1ÕK~ļFÖGžŗ»žu×¢9½ėÖm­DŲŠ·¹­£'Œé)6WšÄęU Ŗyš™łÖ›n:į-oĶ;²ÉŽŽŽZTÄóØ£³­æØ··‹ˆFFKŸųĢēŽ~Ź©]³ę@¦-†c £x­×`„FĒžłææżö·æķfŻÓN;ķäĻ} 2|½SmÓbvl¹ÆŃ?śÓÆ|żžæßžÄsO,œµhß}÷}ēłgĻŪ}Ws7üāOÜqļČHié>»Ÿż™Ļ"C0%õąõyś®ū^zé„·ą}»łFø€+˜@ŅĄ_·åŹļü`ÕŖU{ķ»Ļ‰|®ē€@Cē0¼š÷žżęæŽ ¼ņŹ+Ū:;;»{{.žō'oüŪßßńž3üŁžēi6‚Yę•`­µ„ÄĄČ•?ųŃŹGžŲšü‹žēy¹lļĢ‹÷ŲéŌ ?Ĺ<¹ŽI”ź †Ē*zåŚļ~ć[¹Œ·bŊիW.ŻiĒ—^Y}āY§ĻŚeķĀŖ/` d‚²Šøį²_bóП~ó‡9sę¬\½zī’E½č£³÷ßÅ g2F8 v4ĆÆ@ūמāņy]=3fĢhļźķ\ŗÅ KaŃ$R¬^ŁxĶ•æ=餓śF‡§ļ¾.2ĘfqZK!×>÷üĮ¼¦ÆĻŽœŸ’ü§ē¼÷½Q™˜ ƶ•9ĆJZqpÖ’øń†Ļž³§¾ūŌĮĮĮe;īrŅ)ļ“{ūż÷ÜśąƒtД˖īTģœĮʰe.ĄAĄp5tpļ½’øöźßu÷tär9×ɜvŚ½³@ČMb„1kėF X.Ÿ~čž»žń,[ŗųŹ+Æ<ō°ĆŽō¦7Ķž=»sśl ŸHPE Š—¾ųÅK?i¼‚Żö[?üp@¼ź«sląaE ¦MėŽøik_Zs=ų–JķŖ† SźœwWh-(ŻśC&n¹9n„=éS3r¶D×qMxJMĮēšß¹š42%Ä  ØĆ›R͊Ńx]JÕ§Ŗ)q]¾ra­9L[8œ³Ø«ļµ8ėä<µÖ1 āP°ŽzOźĘL,"ÕZ½<•¦¶*“£Ø1'+q„vpÖHrœŌV’*N5H­A<Ō5ˆĘDӔbyjī’g–›Édš]ł)Ok£ėŽvęĆćfUÆEb?©ųg²[ĆdÆä” (“ś¢ķ<* jKJ‰Dxˇ?õČCŗÆæ$\|ķß~ß2Š„#­ļPC\™ŠØJ`¹õ>…k×¼¼hĮ »£c`p€bF–+:—sĖå ŠŻ¶m`ųų·Ÿų›«ž @hĆD䌁‰ø} -Ķ]×°SńŹå1'ė2’‘ƒ•­ĮˆĀO2ŠFž†5kƒįŃvŽ™s›Ļh.)/›5 !„2FŚĶDk°éŪ¶­Ų5Ć󼘊¤µ–’`~Ē1Z ĻU$HŠÅ~…a¢€§Œ*—‡FGŗ§O%Ol HY‰ÕČo"”p`|UĶ‹ ų:¹ lŸ8HŚR½6 bɆ$s@Z@Į ”“ĖK+vV¦øÆcPńRĀq*’ūśśfMŸ cŲń”BŲ'Į>3Cä8`vT(4k,ŹĶ"+Qf)mȫƄŠhÖ.ÉG’żčŽ{īc9„R’ć8ēŸž×æžõ(ģc„€1FoŻø±»·KHiąĘž{$ŌęĶ›gLŸ8ZĖ8 wŹPēCCD¬™„rķvh HŲ#—qėzø§Ÿˆ`‚ˆąÅÖ鬎ATÉŒóĪ=÷_’ś×³Ļ>+¤å2ąŖ«®zūŪßNTU°Ų~S–Ō.k=ĆmuüĖ_žņ§?żiū²•+_\¶lIĶ“l„.&Ķc’_+ٶZ+MH+ e!{ƒ/åFła„©ƒg“zņČ«‘J˜ŌAkC²Ž® €Y)cCŖÉI-š—ĢcĆoŗR#T6iE[{I²£ń.›U· jžcS]°Ž:ʦž–’“nŪįÉšģPLzV*K9›ņĆ @¦Ņ›Ų^eū#Œ)ēĢĶ¢Ø0©æAńE% !„ćŹf)q ˜3BŒ“8%³Ž‰y¢L5@ŒćŌ75Ā#Co'“É1ß Ö7ĀŽß©™<ÅMæq·^²‚9āPʉ§f؏G¤OEbÕu V­Ŗf}HŻwjPVąD.§ćÄÆ©”81[uCŖ‡ÕvlŖ® ōqƒ[A ¬sŒ©otØ]pøŽ5”ĖeĻóźļxhוZ³“Ī%&«7„Φ”õčųā’Ü€š×#ģœj=S¶óx&ž2kÜżŖG8Æ.’h{Rī”QåDnĮkķė>9 ˜Š/mb*mćx˜YJļ¼ćNŚŒ:Ū!č„—^;BĄX5£ukMæ .Ķ`XæŹyóēŸuƹlvĖą 4`|Ż–‚ĶĢY=•Ņ诮øü7æū-X hbßģ’! C& ajõ3 ČX(Į,Ž!°Ėl®(įJ°€±ÆĮ6ü: , G“T„l`@ŅĖĻY°Ć{īf$“µõeĒ„ŒĢåXJ’ƒr‰…ŃŅaĒķœ1ƓN˜ō2`!%C!๐Bø.@ Y`AAP‚”š „2ģÉ8Ż3¦ĆM”•š„•ų')˜`„½ŻB³1Ä,õœĪxžŅsóR»Ņ.“ĆaS™qČHh&Ē.ś.aфƒøč‘tąŖ+)‡ziB ĒH‹lAg³Śó2^~ęŒ9šćdˆ–“wŲ%‘a/ĒĀÓŅŃNč™L†Kc ¹Žm„”0† ĮBh˜Š’,<ø¤iÆŻö~ą¾ūĮliżA%ų㺮”ī‡?ō!k¶6vˆČ|dόYäf \!cCpĄīŒésµ–Ę8RP¤Ē!4Ć×F3$v! Œ<9&‡£)wŅÅŪ¦•bf†r!³åЁš <° ć@dYŲ ų¬3Ī”$„ Ÿžģ§Ļ<ū ˆ•f®¹ęš“O>y²Fvd§ÄaÖ’ųǘ-ö™Ļ|Ęī”Žćģø|éÕWż¾™žmŖ 3Ö×K2LY ŗ5ŌLuB_WĖjaS÷WGxiœƒÆ{­“/›‰šŠ4$H ˆFo·3-źŃ[Ö¬Z—&ėSōXķ%7)NrCH$$_'6ĮELƒÖ&E×D­”qż±µ$‰»n”Åm%X!‰³÷[\aėõ]ļ#Ɯk‰_#„` Ö±ÅhØBbĒבŽ8¬„LJļ§õ­l­m^Ż’IoJuµŚZ՘˜kU¾¹VƹŽX«6Ė­v\s#ĒąÄģ‹qąäŒt‰Mż j}¦©{aķŹkĘ”$ćøž“å®}YčģnwķČG'\!źmŸŖ “Ü&nžÜ ņMf¹ iSÉG¼ 7” J*é¦ęų«Ūą:‘MMį8.‘Hn7©ö~[?ŻžÅv²[ķøny“RlįłŚ’ĘKć.D-\9Ј€Ÿ’$+žų‹Eź*Lą^ "iŒ‚¤ J„Š”ēH)é€÷‹je&ōéŖÓ~˜ņY ²żÜāē—’_¾X` Ļ20&E_Ą›Źzåśmg¾’Ć'žü. c½tyZG^oBF29ÖŖŠĄ˜š +ŒŹ(œiD6M—8Ŗ¶H†Ćp8ŌūbIp ‡„!ąy†\ņrRdČ8`ģId žbĒĄ  ’Ö*Bh„`AV-9ĢĶAÉBśZk!Q¤¤£Ł¶“*—‡90Žō|Hv³¾I@H‹Šj;2VØVøRIŽ€“$Ē%JĒcĒŃRhĻ­‘ȏ¢f’$cˆąr™Į!8#ĄV{…aa¬ä:I0±&(bĒĶHįZH’ ƒOĀ("6Ä:ō#ŃD,$ ÉpŲĄ(ėÕLĀ1 &i¬ś¤tRŲVĘ¢ņ;ÆŲ±Æoė‘G©ć=Ś@?žŃß÷޳#iJ aÆKBXz³­ųŲ…ÖźgJ)…0 Öą0Ū ”D†c¾3F@¤`˜5AD¢W„µMB³ąZvqčtcŒ"! XĆ»łFKCÕt‰š¾÷sĀ 'ś¾ £xR¾ó_8„Ēüʍć€G #¶õmi–(ʛtC’W}ş8•t¢o¤¤O83™Š.’Šųg2߆¤-SP«”Č(&°£GA} ŗ6„,•J*¶+°s*;—qŌ$( ©q½Yhv7)¶†{jؘ ā6¢”ĒYā…(Ŗ"Iʘ„yrIz+©}>&eÄYńcšø4ÖŁōÆ>JKīČÉŲ[8ÆN<lü55åFĀ|»63q †ćŹhj}T Ā—F$f6&Vę³ŪŗŖMĆd¾NWylź›ĀćIN™dfß÷Ä,ŠŚ(„‚@Õߏb­¹))K’T¾]e9Õ="Æ hmģV¢”¶šó¦^ü61Ē'å$ «²‚F~Č5So<“°¦[› ČjkR5Č6Ē^o—bz 4L•­H®Sk›„“£Œkʼn˜“+^M‘/<<×u“Œśų0"ĻuFK×ń n^õs掮*aŅ \•œ°ćF-JäSŠ,v=Y>Nüކ6Ķ|Ō^ŻH)µ­Ō+$@}&˜źTo±5TÉ_ķ4~²kfņą'USMj“Ü|ˆŲ„́ŗ:;µ3*ĆcęŚėn0L”ł”™ķŪ8“I i؈Č'źŗėočhk+w÷võvvhĶŻķÅ3Ļz÷’|óą Å"Œ¶„dĄVd“+™pķ²i†IJQG’ lUŃ(äÖ*#,Ģ @Sȵ&b4h"­5RŠŲ€Œš…1Bʅ‘l¤ ÖIƎ4ŒŽĮz· &ķ!Œ†0%rv5lĆ.¹®AĀ#—™AŸE’!˜A)X„~‚Õii3ŁH'=L…åŖ…::HĄ%c „c_A‘õœĀ +ĄÖyŁīІ£Cųł XĻC»”żŠ–B‡WŠŒFkC ”Sz(Įß)HhĆnĘŃĢŅĀ…b±³«ėʛn2¬/üųE®—aˆń?_żo“„LG;8sl>Įš`ˆ¬c®3‡¬‡šįÖPi"˜Šš­$#14Q¬MFF…å!YĻH57|MÅ/1t’mb}Ėå2€l6󶷝pÅWÖĘčŸüä'ĘĻóĄ,’nÆ:”šž3fĢxeõš«Æś½ē9===ÆżėęĢ™±dɒó>šÖ³5åØŽ0¾Łžö¤†ĖĖDܘĘmjč\?©U»91µ®ĶH… ‘TåP××ŗI7>µŲĖNR ®1:ŗĒ” ś„2dn•žDim2fŠ,aÉ$BUS[ę7±{r¤ĖD,š‚öÜčŸ56Q5ęIWXEl)œčšœHµ»^9i{f_}ƒ_ĆDØõĮLÄüU.BqŗÆ“(·-ė©śEÓX$ŖMŌ–]ØZ2Éa!BµIŌŚGūOõB/;,£Į¹ĢjܼŅU]īōMō?[w“ų®%yĪõń⤔tĢŹVĆpņ.D§\ćŠfŲ( †t„mäqܰ‹KČqŁÆ@ƒĢ6–GåĘė§1†bŸRn…D5K¹­)I·§¦CÓu»ķ4üä†Öµ­aX»&$K é½FĄŚ P*Š\·`4 Ē“Ųžø Ō$ˆ’°pjibfė®\æ;'SšT5^g Y–kc”†a˜ł"Ŗt$\Üi‹դĀRē>Įˆ„uĢŠB3y^S”u%Ѱ ” Z¢Å‡ų<5Ū_Ż”ø>WŸlJ<©ć©Žļz…·†­ „uJŠ’ū£Ÿ|į“Ÿ Ŗ0óÖó·[žvšŽL ,1Ė)ļĮ5ńO¤š¦X†åeĖV®zÉ6“ƒ[o»åšĆó°g&R÷²bQ:Jšā<˜…I¬ķ"ń½&Ń"Éq!4 ·ōq ’\B¬c®Hp,ō!k”!¬9JØ’mRa X-#€†$fCB0‚„d@k+ęœa ;„£ƒÖaćpµ³Č€ J^JĆ JöN˰sŪ62¼)eĄ6ƽ”ĢVęŁ^ģ@ĮqĀ‹«Eņ*Śölˆ”‹bH²¹wø‰&Ž3lÜNv %śq™`ŲD\@ŪĖH*š966–Ļē£įŃį‘Ē{ģāģīūī3FĒi$CTė,\-ł‡¶®'*و„MŲź›č×vI1‡žõ¶Ó ‚Œ ƒŠ]‚kzV÷A±&ж›^xį…iÓ¦-Z¶¬FE+‘9$e„¶³c$Ö©ia ¢žm]]µżRĀäø^›2½hÖOņZČ66<÷†PĄDPe„TŒ·4Ŗčkö§”Boć ³Ęf¶Ś÷‹#£¶ń²Nbŗ&W±wA:¢ĘmFŌ ī7 vрŗløĘ 7©šyįŠ)¬ī[Ē“pU”ĘÆįjRcU­8/ŖięZ¬’ŻŃ¢Õ8OĘa‚DœÜ|Į„{}'ų1&¬”JāKo|µ¦U3^źōŗc¹¦T§·½_###mķÅdopź¦AøŽ›ŽlāÓjæHŚöÉW)÷ɍuŽJöb0sģxÄ<2ŲĄ,ś¢Pe š+ē¹ń83%pµ§4_M°5±įĖbī+’¬“Xd+Ł]ßĖ8%L˜RS, ·µ½ÄH‹ŲUŁÄēĶB µŚÄā^HIkŠ„*DÕ_ EjVā+a8 ¹šDEü Mš–“U§ÖÅ©”jņ TwåG®†»IWóŖEPMģŃz`L*µKWėFżx·mźÉžĢq7ÜÉ€!ŖÆX²ŃŲh)›Ķ†;`3E 1¹u¬Yūz‹¶öWe]m&QV?“Ö¾ļēr¹)¬Ļ-ĘɔOŹö(XL(ÖU»ėėKävCl)ņ<õżq²ć*%ƒ‰$ܶ^n fŚ@)“ńTeó–M‹ē/œŁŽ566Ö_._tŃÅ_ųŚƒ„Ļ,É©jcŌ©*Ü"['¼ōsŸń}’ŠĆŽxōŃG·vŪłH˱4Įk7£¢Õ‹C6‹æćį;nŁ"®.µšQœČlIŁXó»NŁH"Ž ĀCŠO*fe¤E€^›GĆóJõø2’1Åæ$e„~†×Mūšų˜’éčkplÆÅÊ„šÉķÉkՂ­ZI“ēŪZž!©ŁSļü9nä1>ŹŃ(® »E5µKłøÖ/µZ¬µŽÄ å²R-7L®Š™Š§)*ų~ąŗ®= +ńÅIŪŽ$J…¦¦v1 ?½‹5‡Ēéo¬O¤kRT‹†|ßw'•ŠN*¶ŪĪ|µ^Ö®õžĀ‘©^J])…Ō5 ¦§¼āÕ¹0ևˆõ‡- ;ЦuŒyņųuN¶ćˆŸGßĖĢUä39µ‰aƒRz>Ö}Wą+×uĄ–±Įa~ž,R]œ j\é§&3:V¢Š VŸ,.}Ö~>j֚ŰŗŹqĶ6Ég…éŌ=hؾZßŖČ›™ĀXQT—£jłõŗśÜ°`Ų EˆšO ¦kNüÖ¤0Ö»®¾Ä$2üś#¬4PČo?LA2ŗuELkM,Ŗ]śĶ®|ŗTÓą˜'‚3ŪÜF)ķŗ’££cłl®:…óÅ4ńŖk“Ē%Ø)WŲ†[ŲDšš†`ńwmū#Å8KqUęĄŲbMƒX÷’§G\óņ}?%Ó8‘Fkx uŃķµ“AmNŖš4©L{;Ļ…Z(:ŌhÜĒ…®*Ž p‘Ł<0­§gݶm…bŪęĮ!€Y-“M$ lµ… v9«“L<¬"­IųŸņA7„iMä愤~>L$-oń½Æ=~® Pā [s8ÄćtµĘq۟·0¬æž ­š®§’‘AŅ¢>—ś½Žp/DęŖ'%^­ŪĪ]¼Å"›ŖĮævā“-”N|²LA×ŗQÉæüJ ]j"Ģ*›T“Ā5;McLˆp&¼NĖ5ˆ– k Œˆė1ÕėŸųfS—„G„čЫΦÄT÷öŲ§Ēņ8µQŲ“™Éz©¾š R5čÆ5O±DĶźŚ°82)}Ś©6õ!ĖDd“.ūFEU§É ÜS;ΆūµV&ocą4‰FŽŸ·(Ė× Y×ÓZ<ƒčØšD‰ŖIr®ķXDŠ'WsļDĀYs×@ÉńY­QÓm=©{L¹Õ&¢Ę@$ŅžŠB¬>ÖZĖXµQk’- ”­9#ĶV¬]|­””2Ī–Iˆ$ÆøZų«’44†é٘Ų°ZāČtµÅ5ŖyM*æP.W²¹L0ēų€!Ø5KÆéÉC,®W<‘–Ł)§ÄöŻA ˆČuĀqųŹõœx%ēĮŠ ģČ Ć×CJ˜ŖģBÓō›””6ŠŽćŒóɜž/­M­^ė8Ŗa„\æ+µŽk¶?å™ ®5>QߐJ:0y˜zRē›tžņ­åg’}ł©»Ø}B\õŪ+ pPŗrpdxŪ¦ 0a3ה8åMdlHĘŖj˜ŌN‘{*j- žŁN½Œ3W*•ä Zō:6¼‘Ht¶c‚ Hj%ĒAė|øu{LóыCƒ®a'†­±¬T܀g³wŠóšE~SCN=šgi9„¤ŗĘóķW}49 …F÷‘ˆ$3m§¾āøćpŹ‹iŖØaäkq»ĀL H ±¦©)߀©Żė‰ū*ߒ`4Ķ*ŠQņĘJ™pū”la l/%…£1“¤™Åŗ/B  «Q)X›jĆ”įt’ażOmģšV­“Ģ [IÉ63W_Y ē ¹5ʰt„ėŗ©½f+@ć;P+ż•,9Ē›EĀš«65źƒé“ÜQb O2kāķ¬ŁĘ.5RJ÷ń)OŗIõäŪl„MM ·Ń¬µ®ŹO9h”˜q ÅM4ń†JQ6ŅŪ,(Ī0›¦ÜØeģsŻą!Ų=ĪŹZ„Ą”1Zk­ ›ęׇ«łprImśuXP8˜•2ių(£"ā!GCæįV"„¬ŹŃK™ŌåŽ%čZg».ń/ÆŒ ‰d˜!דą†)gĶ×Ō*&ŁłY46b†Ö¬#•‰$ń²Ö,y«E˜1 xžšG†E’ńƕz=¼W1ęŒwøŽŁōŽ$Eįʓ›nø%EKʕެönĮõœ±eJńY'ÕŻ?Ń8»p'”ŽE3’§‰Æ„Õ㯖bŲ}·ś“&ńłø+ē««+Ö8+«Ė‡›Ż;$䲦šÕ©”> 2µxq*ŽJ­$I§ō”\łøiHżżm(Õ1‘ĄoŹ1Ł8/Tr!aŒÓ1ǧ\{Q)-€§$(²~ŅQšFµŹźXIˆZĶ'cK”õ™ü«8jėÆxĢ€• ‰£L&3Į䔞"§†Ž"ī%k4BQ¾©®j5+ūÖÆĖõ30Ą5œ9ÆÅšmøā7ĄH,Ä­OüµKŒ'²4,!Å)żܞrJœ<ČX½u""ÆāōlX j¦‹8ĮÆNiŌZmX&jŠŒ‰Än.$ IN(¹g#’d vąŪ$D+crl`g9oÉY“Ak‡J©dПTM夈jƬi])†ÖūC5ęÖf#ńaŪ\ZH²™UŹä©6ž®Ķg]Ūd¬œTÅÜžBŖ:Į˜#µŁ§„|Ę]”l²]O‘LoźåNøjŠ:ÅI=µv;k4Ą6V%NTi’ÆēFżóĶTÜ[dŌõŽA\?åkö²ń'nüšZĀm|vI‘°ų¦Ōõ'p}ÓėC26ĘX/\cXJQ5ÅMÆuѬµ9(sl¢P½w†ĆÜ/™d2‡…°śMԌš Dœø¬ÉeߏZ±+ #ŽŌļ8 öY#A’RFZÄ$DėRņ®Õ¬U© §Rx BF­^Ił·&Éd½Ź÷”'Ńæ0skš æ*5qkß,6aÓ~²šD4ŽLlXˆØ-”ü'ŪPK'?"H)ĘÕ Œæµ>JÄx" ­#Ģ)¤¦ńšØ7¾j]ˆi8,'> [¼Bė"Q­3ŸH>o[’|ßoN° ’rńl–I[ę÷āL"%ŽOĻ.en6oÉäŲoßžA 䊹ŗdsZ3ń#kō²‰qœq%Ćk{õm}čµPīi&gŃé,6«ŲÉ“. I/TŃ+y‚±²b“åS³µ©ŁDjķ›Œ$’ī&Õ÷†šŌׄģ5±æ·“’łg³$³ÅŹ»JżS8Č8śiX_H¹&¼ŗU±$JöiH¦²ÓŌxxµō±Ē­>“¦v7|$c»¦eĮÉ8?„?¼‘…oeā(!Ō&½q¬Ÿ> 4€JŁWJYp,ўfV¶AHGÄę™RŹ$ –ąÜÖ'sC“ØÖčØAZ[“įp(’oå¦cå¢PX›jS ; K„ēöģzN£ ½ū®„0Xź÷äź:…5*6ÕxU˜·–bh‘#ŹBįIcŒÖCŠŌÆ~i¶·ŚQg4—ĖåĄW¤µÆ*œ>‘Yޚ•vø©½”‰JW$Ų­é½A(C]oqŽĢ¤õ`:]½Ė5:ēaŻJJį82Ś,¹ś“ŗ!÷!ARN0Ś‚ ØstG|Ų:;0A ”"‘M E’FTWDlB“–ģł+Dx¬Ń”JS˜›fĀ‚L&#!ŁÉĪ5žĮUFJÖśėPŻŲ̦԰NÕØ™T)£,„HbėkS^H'øø I¹\ÖõœäčāZå³0GM ą&Ó¤±ÕI+Õńp#‚n]Ī•ŗJ"ś+Õ]5n’ŗ§F~³ ]5¾o”Ģ×Füń “«"`Mƒm³kY듨’õ k<ącšØ:Fq†­LÅX=5ģųŠ©/ŠtńB„Š®gC4¾sŃ„ Ė’a€—‰*[ƒśH²Ø”¹ÉO`Č5ė!7ø7SŽJRūQkBSm9 <)!Ø=§ž†Õ>ӺͲn°0IŪ¢–ļäW£cĀōęhJĘ»|<Ā“äšIłu§’±™4’¤€$¶Z°[¤ÄŌV¬·lœxł£>V‰§’øĮd‹ńŁ n×[ø§µdĖO}Ż?·•R ‹Ŗ)ŠdĒŠÄįė‰)¦č23µ&ͧŗĻ‰(T¼Ō Q‚ŅhgggE)fxĄ™ļ>ķ§—_Ē5Å_Ø”\±-Öw iź€ńņB„ŗ…Ih{2ĄŻ`:øė”X=~Q«ŒĘĖ-”†>ū³Ńöl>³ČX,}€w74RÓXUųīPµN§“ÉdĄIy±.óČŪRl}.v„ś+Tiūr“3 f^)Uš†Ļs3²±…£ŪM=Œģuž 8H-YeųÆÉįŪ&@KHĻwp2kQąņć6švwŸ’2ņś§ek6uŲó žžZ‰t„Į…ŲŌXš•ā‰z„ 3“Š'C‡éK#'¦;ŽĄo°•qw4ĘāM˜ v멼[£`N€½~lšCH­)qąĆ CAGfā“ź„ģ —O‰Cl| ÷VĖÓB@\Ł,ŠBK±µ*pø›Ęf[:ʇ$Eb“Æwµß†ēŽ(ė8DZ‹)Ņrė÷² œc…1ĒÆŠBīÉńā¼1Ö?„Łt>* _jHÄs­Õī¾5^:0üq±#:gżs¬•„°ē‰ˆ×aņ)qŻzJ/[«c‘ō·U—L‰lˆ‰#Ļ$}wÅŖxbyyU•¾:õ$~ ūbkĪQbŖ‡Ū7°^Ŗ+‰“Ō“‹,a3ōĀéŠkĀ“+ӊ%‹nŻ‘¤ †ƒ¢Ü)ń€\§ X¹'ļŽ (.U˜Żu}˜˜§c„ƒ¾{Ė›¼§ W{" ļĮ­¦Ļ°0ÄÕ»J‰;<}gNÜóŪ­©MūGaē ¤Ō†į2E%=Õ”„®'t}ļ;4Q…šĖäeķėG×¢!-č¤é–Mu÷TĖ£4„&/œ<ćĻøöÆg$/£ „ µāĆ~Ļ„ī]…#ķ'±¼yļéŠļ—ōg[ę•÷`Gż¾½åŽĆ@"‹?źP»af  .€‹F#Lß8ĆÆE-RosŌ‚ģZSH±ÓŃ±ź®ą.& z^tv”ĒsĖ‚X‹GR»‡cGī;°™ždž‡Ųó@„vt 4wCāŗVč©(ņļłCOXŚīooYzsK‰Włƒõ8§ž”Æ¢Uę ,źÆKD #–Öö=ēÄ…¤ö•ÉĀ»Tłv½Ģ40tÕvŲLD‘ušclkY¹'"qõĪvdqZż2Vć# ѾŃ$׳÷Vƒ½»\;Ž“£ŠjøĒd †|‰;˾€ Gģœ(×Ō!=©ÅišŌqTŃ[ö‰Å.Æ"Ņ4Īń2XŅg¾ŠŽiėń Xk³,ŃŽ¦ˆ7īņFøT>Ø9īÄć 8d½J‘Ź“LśZqRÆ+”Ļ 4Šķš<ƒnÕ·ęŻµ»¬Aś§mæ,^O»„ø6 ®¬uŽ Ųg^®ōˆ E͐t Ÿ”®qˆzŌ@ŃŹn¤²åŒˆŻ”Ū}ģgWI 7™£ęš„ņĪ•o¢æÓ(õA ݳįŖ]ŒŽ•Ćź2`ĶG÷ ‰VD»Ā‚P…I“Fl}V]g{把!N®Uść8Å" ŲI¾Q”ī,Ęł;ķƒÓ‹ģģģĄŹŹJupvÄuUz©öéšļ,‰zė3 ÕҾTWiĀnS’’‡Õ’Ęr[ؚŠŸboņ˜ ‹1WJ~÷ŌPčAR¬Ä;\żĀ°‡f£pn‹Y>‚K/æd^øõUųŌĒ?ŒÄˆN›Č·~ačYE0ŗ;„jćP#ĄŅ—¬SÉ­Ї„Ü­2p§ö]ßą/Dw>ęa čŁ-XÄĀõR ±¢#–›©ćŅż„ŅĀąE" Ć  ŻŖ ¢Ø”‹ž‘2@Ėż½CŹ»2.ż˜ó?Žu ėĀĄBežXźĮ"ÜxóM” ׎ŪU€¢°5ÓĮšyXõ’EŽō e‹=[dŻM™ö2ß<Å|5®ļ*ųp@so#ÓP7Š~p#ƀ0%7¶]Į;JęŹŲŃļ¤iŖ‘i_ŽQ™Xė KĘ 2QĄ UVLZēr HHāŲsfźZ)P7æµŗx=ū„Ұ4fsÅÆ¦JŚåT—Jt·äB0¹’²„Ų}£¾eI¼Y ļńƒhXG¶ŸrL„ó[„4‡łNĶ]„”!mšO”Q†؊!WYATŸø—|ø“oÖ ·õŗv{ݦØi\N’aMęNĘZ’²cŒsŗfĖü2²›s&œ6Z1‰°‚h ŠHžēUĘ5ÕÕó¬#2Ž/cČÓŌQo»FER^X‘õQ‰…¬”®¢Ŗ½‘Ģ–jÉM2cŒsNżŪ@ (ŠŠn“O‡cߖEj‹ĶZæĒęĖ耄ańZūeĮIQŲ<·ŗ+t·9ø…!uɎvĪWgl7”ROĖtÕ®Ł6kq·ĒGßĢ' ` ö> Rɏ„iJ» hjrąéå^¤œÅZWiČ6;x-±¾ųzäś G6Ł?w©ė†Ke:ŸeY–e€ƒFÉ=ß_FŌsįݐ ķ³Ūh !ŃčįŻøtz 8Jž×ģ!»”uf. [^I”ƒæ7cæ%ā@/<}vŒ¬JŌ*˜F&MQčißų”µ•ńt:M¾š•ė_ņ²ßgńelWRį[» ”ʱz.¤iš¦i£¦rs\Ż_˜ˆB—śŁ°Ą©ģĶGŖ3™9}%Qcʘ²å%1ė’c`ćēz³b=›­µ+#6³āņ„¼Yp§xZ(±ąDĶM±t¤läE÷»ßżBg²OwQ]g4b0Ę8Ē"ĆjĆZ[‹ęłņóp‡ao!ųš‰u÷iS7<ŗNļŪ…5Ø=Ļs/{;<ųMü3“-Ņ4å 뜫+IĻ×>{4Ę€cWŖŌV‚“A·–ŒńėŽĮ9Ń·PŠŚŽq—8²!Õū4Ž©öQ"ŽĄ‰YzItXįK;æšükĄÅ•Ē6‘)öpźnļ`ŌÉŽ a»sEt¢ręók­1&Ļsq®Ōh Z]fZĻvĪYė‚ˆtėjdÅķŚ“0Ē)–!Ģ’$5 2KžŪ„Ī£%4’tz*€"ėcuq'$ōś7*A.åŒĄØšLį¼^&ūķ ż—”ŃŚÓ”UÅ^ļŖ4:Ų„‡ÖZk­sNõʒŌxgiŖvT®ĖÅÕ Pø{CÅ·#¢ˆŌ[CI!IÓ$M«C¤3Żķ–7bĖ#ŸĘž³ø²P—Śź ćū¼`vÕNæ—鮝®Œ1|CLk ˜ åƒ$IŒ1- ¹¤ķśH]ęv¦ĪģwH‹A@ĖO‚˜|Ćæ3ŸĶ,3ĆéWźgļüü—qnÅ õö!uŌź!`_zIå’%ĪXv|ŲŹ¼Æ0ó’‡ķt„Żv÷ź V°ĒټrŚĄZĻVaœX…{<B‰P='’$ń– ķSRŌTĘsö%†/©÷0«ūX׿ECžÜ*’[‹qi°’«u_‘$Id“„œćö#&ź)ŽWē=ąŽ–Ą’¦ÜĖTjļŽ>”ØÉ{g–Ķ鷇i[­ōŌ>™y>Ÿ3³RC«ĆKØżŌ”Ņ•Zk±¦ĻŒ ż[g™(†į“JC5Õ«ÆJS­W Ÿś‚‘'©‰{Õķm¤OŽÆt©Š”•śh¹(źY±myŚäÖZęfµŚāIļŌŻn”3I[2@afˆņœī]¢µ/©¦Ń’ĮqÜ%ė\nY–ÕX¦K×Iw[“ݳž§S-Ŗ˜œJ4Ö}µ€RuA„yHµHƒ„‰w„0ŅIšeÉźźJ#× ēH3eķ ĪŖō¬m“ŪźEŗÓŽś8ÖĒv– M„y&B°JH’QŃ"€ˆIjüŃ\—ęn€<—+F@šš˜ž$f”~Xćlb–Z†K`–ČėŻiŒķ„Z©;j;µ!Äm­uŽšÖ:õjŖĖŻxčœJVÜ źü5öé@^4ܖUH³$M“$1Üp«nœ85¦īSF¼".†ō4žE+Ż•RU®/³XfK\Ņ·óEÕŅŲ$ ź¶µńA¶d*ż1ź2›%Ļ]ĶŽ…fZqĪŁ N„Č‘Aćj¾¢ˆ"*JžĀż6>B¾@mŚńŌ¶ŗhA$'$8””æńńß8»żūÖĮĄLxÜ3¾ēY0¢0;™™ ÖV¤µ„Õ ī]qź{S£/ŌčEwNśø¤ģÓ^‰9õ‚b£4uŗ4®† cJåŒ`šjE6bķHkł=ĮūIj>@„ą~hDų¦”84Š#TŒRՀ÷–ŚÕ.˜«ĻųEjżx¹ßfpĀŅĄ z(Fke%¬΁ķz„÷VÅ.š§8W ܗ?zOeū]/9©ž ²āĪEš!t{\B]gלѽb4Qnļ,Š\·VĒ–f?¹]ųØN XJ_a _ėägP4°Ÿ% "VDƒpn1d£4„DŗŽœe$@@q€Bā@»+⣅†Õ;r›  ˆDdˆL DtNli%EDd0ĖRŲŁ™śü¼,ĄYk;¦ÖBøDyŽ“ēg0䐞ęCs{.1 ķs$¾a°Ö©Mą®TÆ'†«įӆė,å„2J,8Ņé½ŃßŃ­^!žŪŽ'ƍž@—L¹Ė– Ū²ōzõŠ/č‰H–Ę«N²g™Y‚’YcŃc›™U-Ų¦‹rü‡Öf5œ„÷č&B"ŸoWĆSb:8ā`©šł™‹ŌLBPVoģ…˜Żn[ ±N'–‘«»k6g}ŻY'œS‘˜æµŲøR7W€ &ŠeO±ņ`G‘ē\š"ÖE |Ė—nū2¢%хĖ ż„«Ÿ 8ÅqrīäÆJ‰Œ·¶pĪÅ\'$MŅžšĖ§ļbĒSÖFźl¢¶G©9™āĀOgŠŪULĒ]šžzĘ€6Õiƞ“żŪīV¼ō0g3 BćAwvUūąåmy`Ä®[f8ķ·Č凈PgŃ"N„Ś@foęAŅTˆ 3@šC?üĆģ`ŒtĘdķ3ųšMŸü\åĄ]…IlVń÷œś.ĪļL;­®bte#DŲsŗ»Ģž {ā‹·ć†Ų2{ø Ü·Ÿ.\c X+ĮĘB/qŌ¾üŠ™}ØöOX ³¹mścøZ`Aīj-uŸg=="˜Ķf™ Ž}Ŗ^ö~ĆŃe°’Š(aŠžv˜„QÖhĪsŖY,ÜŃ:å: Ü÷µwö—NcN{³āĪH„Ŗmū‡'ŽćJØm„ ­J0=ƒc­Õp!ģU§„ź”6«ļ „ó06D‰¹|q£I€“ø³Āźņ5ĶłZ¦”ܰ†Č­s5[°Ö*tŁGŪ†:Zµšė?ņ€Iˆn­ŻU“˜m D”$Téņ°ŽŽĒc ¬C˜J„{’"ŠDĖ»w,āø–"LjÆ/Üź–DżC$ŸŅ“ĮłĆŪ`»Ūž6Ļsż¢(Š K|ŗśQķ%®æ³‡ŠpŠ®-„zŗÆøŌ‡ZlTļŗÄwW£Q÷Õē–Ōł¬;2=…ņ&rę8«„‚©H¶ŗ£ŖŸ, !C’č±į“Ūqάłv\L.’YG †BgpēóÅ,®a‘ź…Œ%ūķ#ՏŒē»XŽ©zĶ3 Ž}b¬ƒPݚTNżļ·)‹^Ņģ¢ėĒęęF6Jć%©Ąoæ 6ŸŚņĀ=4÷ü4ü`ćēRc„U  &°ót/ŖriÄ$MM’TLŻš‡õüY[ńKm ŅѤŁE*ˆ]TõŲ]­”7ßsœÜ‰£loG}žš ³•xĻa@ŲÉU dĻ{u˜DsńN1FŚCŽAD uŽ÷™Ęł_d_jt½*°‹bKø‘ó""õŁ.÷U¾…ȧø•fąÜŹŹŠ˜ Ÿä| rÅżīóÖż7/³dĢņŗ55ūÓ ÷„‘˜įGD¤š¤SÜģī¾XŲ5(ßU”HßwžĶ„QvInIR3ŁŠo¬‡%Ÿ'Ņ ‚صåOͲ4Ž^Ķ2"yåż$©Ø¢[X ŅūDĄT³.Ē£ģ枊ĪńcoŗöŚ;o¾łõŚw܇םōR&÷A0Iæ£é„1ŲtśŽQĻīPŪV‚UénZJµ|£6ģ[÷„“`½»„ ž,”B(,¼='¬µyžĒ¢Ķmœ”ŖŠöi4›ģ¬@YAŅĢÓv¤FN[¤%Ü.ØB„Äó_Ō]. -BĮK£[Oq„гźÉ<1‚lTŪ{Õ) Ż,]ćĢPVŲ—āÉ ³ÄŁNœŸ/q$vOżF8’Š«a+j.ˆįŪÅūÖŗŅL”›·Ū}x ø3µŪI’„ØĖĪņ•©=}jŗ" āD«&HhY4«©I<Ž'ēSųŠõš½éŹĢŖ,Õ(Üt¾z4Ō—%dMYõ«Ŗ»#Zīzŗ­–;1Q-ßk†a-„ŒŠN,”N¾Ā…„moœ$pD3hdČ śŲĄÄk»y%‰™L&ƒ7?üéVĀŚĘÆ˜ŪHŠP×kŠ˜ķżYlįjæE ßČA&-KŸ¾ć*n¶ŒlŅéśł…Ņ0ć ݶÕ@b 2‡ŅX³"Ā\Eg±ė“ µ#F€õÕµū=šA’ńö·—X¢e-Śņ»#°ÖXo”CŽ÷tngoĀė{ø—v³ھ0(˜¾“ļ‘Š¢H’$ģluHäKOĢ ‘æ%µĢWā!0wÄ.Q{*ņhˆģ+ę Šļ84!;Ö0Ånm?ą÷[Ÿ¬|ņ3Ÿ§é¼(¾ök¾ęŚ7’ćśś:źz“Źö)ŠN‚j®0[k)ń¬­<·ó‰@QŲ4m»…Q_>,"Tkā-2ž2Łź|ŗZ ev»± ŪŪ½›–’€{䎮§įŒ§;¾)‹ƒjØćCŠĒš—ičXuø åyže™¾¾*ė”^ā¬A™+¶©&ŹĪ¹,K‚Ś3 ń®s¢ė7ŲŪˆiµŅ­÷n¬ÖZQĘījn?˜Ē4Öxh2«”‹µ.!£‰ptéżz¤„‰=µØaæ Š±h >Ē”Yķ¼¹G^Ź‘6%—üj>±„ō. /ivż~ŁZQø45ŽR®¦žŹQ¢8#ÆĒÖyU‚Ģ‚(Ŗ5ŻØžPؘĻäŖ2Śė-Y†&0|ż•/TÄŁŃRFihĶR•„tēd˜ĻóŃ8ƒØ¶›ŽI»=Łž] ’įÖo öŸĘćŸY° CµšBóĮ)Ń:;$¾Ēź>Ų:kmš¦Š±E‘P*̘RcUŠĻ7œ1&ģ6-ŚJäÓŖhŲåŅ,-?›ĶĒ“&5ŪsĪ„iźœ 3ŽĀ.Ż4a÷ łŻRōć} ,†Ō ĢūĪŠ^Ł'$Š'Oµ±äyŖ/«±A, ^ÆńŪ13[1Ę ]ī>nloe-ē®ѱ‡W覝ÅQ{؝sół|<·M¼ĀŁŌČėŚAņ@ĢÓēG503w†żÆ™Ą›m„=ŗčś\ {2¦®­1D¶ukĆeÓ¾¤¬:¤B”",ńūa 3!8ŁŽŽ^]]ƒ@ģ‹oāE€AŲ* ē|æ{ŻėK_śåå>ż©Oż›žœƒÄčÕ³—ƼhčJĆ%æfXĀŁloskµ]„ūŅpmĄżż²Ć7‹¢š‡Ö2‹G‚•Ø”eéZ±»Įq>€P¼Yš&qāZµuń3µ™S“*WIö=7ésij┣sÉUę®õj}o”ąfåŖL”Ī,šĘ×¾öŁßż]ćńؘĶ3€³Ī<ė®C‡wÄY€+®¼Ē;ß{Żžżū5Mµą „Ø„_„ę$!±–ŃŌ„¬Yr’PČ^ś‚Åұ¶Ź:Ž=¾o’f,P¹0/]vė¬ZāœųNć) z7ū@vŗL‰§½}'Ć0h]Xķ“‚ą„Ńk’z#ŠPŠiµńcŽö¶@H”‚#"¾Š>޶½?-x[c0¤Z e˜+ęJ…нu«’:ĖXu™čŅ+ kŒ©$¬Ė0]«ß"ą(bŻš ƒµĪ97eµšżpł»c/ĖÄĢ&Iōe½ß8L§yšD4†¬-“„”ł Ż»vŻ0„;eö¾(_…ŽL& ˆÆœģ+ü fŽp¹;–ØÆt­£$³q;įČ×=æ¶6œ“¤Ō Ķzųf悝źųJQ£qę,kŁ¢–šF³QŃ :½]cФźžuā(•æ·_*j„ļl}iŪŠOų½4"źˆSYk”…‡ćvFäĢ\e;K6м/%­„ņ„"·šŌ™„œ-×,€-\e+ćJÕi[_×St ŠŁ6¬Ž’;N'ćIČdā‚T-ŻķY›C+ŗÆģ„#i°Q¹čŲŹŻÉ¹čaį2SG¼ŽŠ>TEšQ4ŠēDuŠK|©¢G‰Ī–”4~čģjE)§@>/²,?Ķ¢¦Eeé‡Cķx¶ā0\õż!’Ń:”ƒrמ֗ØPuHį⬑‚^„Ł=*īŲ½Rś\…ū‚öĄ±č Ęłyc .l‰uöŻwB_>åŽ]rŽs^¼xH¦öÜAipvH¼_^ k€*›ĀÉ(Ņ}™@ȋµū€@”`Lš‰Ļ}R“ƒØŒ ¼éĶozé‹_ ʰuĄbŒé±f%h įBØĄmY @“ßsšZR€õ̬ŒšŗcÆ Õ®īŗ6АčD‡¶4TQŜńMēÜZ/`H%9°N‘Ŗ6g9ŽźjiŖxō¦s\éÆFcļBTŗøFm °a(2pšČZćmń¶xÓ÷÷wMx>„°±1žo;s’äüqBš„/|ń–Ļ‘#HŠ Ēr[q,v®¼§7ĢēE!¹č7‡5Ī9A™s €µuieĀ{ØU+.Ō¾īóCn3ķ‹}ĄĄ`I—6V§ńj}ėtz„ īźW“€s\Yd׫rmŻČŖ·VšŁ’A„į…Wp¶Ķ«”2ŖC“ ˆåŚBó˜RĒĀā ½ĆÖtDz˜……SA‘¼įjTxŖÖWi‰¤?uį„)ĻNvv¦7ß|3$©IÓ4P‹ĆŖW ߐEeĻJQTzĪ•·iLƒ’4LōØ19{łœ»t%­äO„ę3ø Ą 4ŲĆéTNźNHW}EQi\u1¾ž#‰Ń3Š”źęR‚–KuŠHZńšK†/A®Ł9VŸæŚķØ4¶ń– jV™ēEĶX8Ź ŪtøųŸežoĄF@„<Ļ«ļ—8ᐐ*£ho§••t ÷­EyG–™ž1ś‰µĮœÜc:ā$Y”ņ-˜™ ō ¬Å]ÉaMĀJ«łPõ(„ī‰q»ā‘–5@ŸŖ|ū;J"e+čgxK™ü4}”āmd W…ā†źūgøeiÜZš¦éZWq‰~ J{ƒ (t lb§™óš4h’Zܐ\˜!¢>nµļnćĢ»¤@äǰöŚŠtĻÕųN<œ;}ĆŅŠ@Ł-ś:@ĖĖÜķ¼Ā…iźņÉ×Āżg8=EčxCęƒā"q½hÄќ“,KüĘ^sc“”¼dCŽ²IÆ~šƒĄģĘ&!€_ł„_aå-“ĆŪGcXŪJk˄㽢 wĆG_Ģ©W9`„NŁi0 CøŒŸG稚(£ZH¬mOVżĄ *CŹ‡įøjvQ (ų"B)lė ‡“øJkŚ¤ÄąbÓ£°ĪēVbøģćkäō‚„Ź'&€/ų‘ż¦g—¼ÉdBjå Ö±åĀ$°ŗ:IR xFW yLBōښ•T!µ42¾źŒDtūķ·—ØŹīRĀzĶ”^śÄJĀī’±IU%@tÄõvM§óo—ŌĘi–óvQ³nØ+·Źs½D¬łŽÅÕäų@%ÅńxŠkķC$žoķ¶%$S׿$a–$I(ĮöźŌ̳]HöŽŌN%H ¢)ļ“Ń%pą•„š· ‡Ģź)$©ÉFiäYPÅ÷\ra‰SÉ^芋›‘¶\Åŗ‡˜ИiUJ¦b×Ī9--i!LMųtKS3ŸĻóÜśsƒż”TQ ’MJ@‚XĄųU>–źčČ'qr”įiŚ+‡\K-qÕĄ–•²4!©v¶ģ=¼:P„]dꔵ;`5~ʾ€‚•¼‚Ō•’0*”ébUjÆIą·Ņoiž,¬ūp$©4MœsJeGƒČ.¢Ź¢s"Ž~¶§iJŌ×4j ¤“l·£”Æ­ųµŒ.ty‚žR("ÕĘ„Ŗž _Ź$”$&X¶éōķ£Y¹ļł_KłJ:ŗ2Ņ[C‘ #ĄcCw°ę¤µė†›§Sˆńō…‘uīŲąxƻǦP{ŽRg”+® ”!żqH!Ÿ˜ķĢÄ֙”īšōĖæüĖ* d˜īqåå€lķŠsźN=ēŒĒb™ł·0B°8]©r#ų¾pŲÅqČ–/ œv•T×+ĘX)pʦD‚į³ü&źį~ĮwŅZ[­śaÄ~ŖƒˆKą3E.!ƏŽŸŽķ~i÷»e6aRœ33!žŪŪžSL’īĢsk­CXßæ~ōdQŒÖ9O€µ©š+?’sńņ?‰j šÖXv•^ĘŹŻžā³,Õh©¢­DE¬ĘQŲ,÷ ‚VH3˜Ļē‘T3YjÆtÆ”%5į(o>Ō€ćąh+(„é©tĻHÓ4†” ¬—°jQ¦Jį}G£‘75E†4MÕ\*Ž””‡é,£k)-.TÅśöµÕµöɖ¦ā€hČų Ž<—G’ŗškwŗ°./¤`pBe‘ Ėźļį<ć–׊!Ķ"BQŠNSÆoē% ėĖčn.ģį N œĘ -™ÄqĪ€%ŽņyÓ©„—ŻļŽ{a­ī!%n^|ģ0¦š·Ę˜]‹›ņ*pRŠø(湈d£JĢĮ1?åq’·¾}œ%ó܀ьäȉĢBʄ<¼ĶM_HŽ[ž>ūˆ²·čŽŸśŌSOaÜŪ™‰‚ŁR“łSJŗłQ»ŗß$C 'ģ-ŅPĆD†15hÖĖėUfń™mXƄŻ6üSÉĘD¤ŒÆ !T’d9¬É |·¼œ įŪø»ŁU1eĄŚĒ~ż×æūŗ÷ĄžŒDäø•³Ļ^ĻóŁēœ;?¹mŒ¹õĪć'wę#€„š˜ |ććūĘ7üƒŁXqĪ‘&óĶ—Žł®L PZÜõ(BÕ9¦ĖīĶ*‰j£"āÕpٵ³Ōz„VÜÖxńˆō’L\[?æScŪNą†uO9S$Æ÷hŒ!cļ(Č|æ¢ģ )±Ü9A¬S„Œ”.\|kBŗČĶ„GDh<ŁŽCX_ƒŅZ°ŠÆ-T&1ķ“Fē€Łt>žŒBЉŪŪ;««+1ńøNh,ļH@™lapt«T²nŚņTź×ŅR“ÜZ௻Õb€—øQšBE3iɉ‚„ó·6ˆżk‡#‘!Ør6$śtJŃ6ΦŖ‹Õ'øÜ 2‘ŠRŲĒī¤ŅĮ€ŠXMa½Ū&Ś7„±cozW1ÆÆ†M‹ā~ĮžŁĀĶ Æ¶diš†§€żÕ3ķbäz~um^uį ›ĮėU ĀuĻd¢ŽĆ’×ÕŹĮmŚ'»Š…Ų«""µ‹”ŗĪvŲ+‚ĀHó@Æū‹Š”’i^šÄåyžŽS*„ŒŪŅw °?twÖ?ā†œA-,ĮFWYŖč+¤Źa¦s„J“i”®ō“PŪ"ޱõAĘ$šŽ K5šū„uŚ"įńā²Ö•Rķ DÕļ‡;ĀČĆ9Ģ[?qńYŁM¢īoq×~Ä0Ģ%nFŌJōžą ēø‡ č“üÉšfø0hsų÷pq)vļhµŪ­­+¶¬žŃŻöŃ&Ÿc£…¢4•N)9Ļē/ŠāwɁՀsÅöŃc÷ŗņŹĆGŽ!Įh”mMó<ŸŠIH•Cś¤–imĄ€ˆtś!õ ż²Ļ’£ö‘”=Ļ’…Lzk- Ua.-Žļö6J ^ƒ/RUmō@ķ8tŪՄ–&g8ģėŻhfįŠ25(Čl:öŅ‘qOˆŗįaŅ×Ńn—OPEąŽŪo¹š¼ EdYvhšĄÆžźĻžü/žäŅō!’ķŸżģēV²l{žOĘYš¦['·WVV>śéOŸwÉEśöĆ!£ŽFŠeą¬Õm zd“’‹d wL‰«ƒ OO9©;PĆįXõcēl?|@grÉõ+­ųŌ”ZĘ.uƔp±ół<ĖFaMa™(jZ’@Ķ«ĖXÖ ś9ģgf]°§UĆö)eé'‰®”8Äp@Tj:Ņ~żĘņ<mĮ-Ż%ōMc¹©ķ­ÕµØß`yōTķß O]­}ˆs{h(Žö­£Ī'§ÄŒŽ@;SÄź™†Ah¦Äķ¬©QŠŃĒO8T““Śī*„—‚³DEqŠ€L#ą®Rā²7bö-“†%I=Ų•PąėNć”_ŗ,‚.7ŠŃ>t²_)q[Ę)*ę6ę¼žh~¶S3—ØĶģ=Ćaf~-—Žtą#MlikŖÕB’z ]Éņ2qż«•ՏéX/4Q”Ńƶ•OŒ±\D&†!@Ćżd©ē]eµEUūČÆ‡ćm°^R ĶŽ#ķÄøC?5@“ ©šTS5ŸĻ‹,Iāᵉ±Ū”X¢»>K5[ē$fÅ=ᚪ¹Ś^dI§$U»ŠšŻY&ö(­JŗSāGöʤćß6¼m˳éŚ_ Ø+ßIĮ2)1Dr‰ńL;õTåī{‘Z)a€, ’>|i ^ŽĘ$IBīŌüUc«­4$ņ°ģ4.[Żæļ¹ĻŽIĮXįo~ęÓo½ķ¶K¶UNę^rjkj*RØ3¦‰ē ,¢é :öŽńļOęCŻA·ž$I›¦Ž§cŠ ˆĒÄõ…Z®õAT+rĒ‘M Ķ(ˆ·ę`ŌIŻĀ3Ķā®–ØIqw‚Ę­\©ÖRBDų¢yŠK)p£§åv†?€r‡š“§3ŖJhīąų4’ök¾ÕJńsæš«Ā#7Z³4śą'>õMĻųę#ó¼ 0óœfs!8¾³s’«®KĄĄÖ©v‰s®Ē ¼6žŗ ÖįŽC’$ĮžĮE&§kūئVøˆ>!ŹÓŗwõMļpXłŅ©˜,µ?Dˆā ÖRiZ‚S &alףųȲ¬T@D(¬sĀŚkm„‰pzŽć·ņŌp!=dqēä–Xē}»Es'ņī°ŅmµQ‰ Š¢œÉą‹›¦ĘĻ vv¦šė_±“ÕÕ(rė%Ž ŠH’2Č"Qxž0°°ĪZ@0 9×”a£ńTo˶Åŗń›Ó£Cq°¹Še„ٵ#ĒL`\ņlŠ^7Ž!T™‰õ^Ā„ńĕHŠ„QM«=¦n޲,jK<7Yø…¶ģPh:±-)o1gø¤²V`*Õ%zr•H3–jŠ˜j‘€Ŗ‚Ŗ/LZ'­ÕĶĄ}Ō!µā/”ŗtĀ-l*V’u¶pÓéT{qĢ‚Ŗ,TzŻõ|X°Ģõāu8¼^}čžU,GfąŠ6×{×·n3ěó³Ģ§JļƒQ†*łbtÜČÖz”4„ä’’ ń ä” § ż’‡ĶĀ49ŅŽ£[Z6o­y&jõRm|u'Āvøį%)ŗ IUŠuˆ¢GĶN Ńø^¬Æ ұl£ŖZ›%›¾Ę‡•ć{éĘWŪ–¤,ZÉRͽNXVgŸ¦³¾·8¤‹vyVKwŲ¹•¦ŚrA ä“Få<7’”%ӊųRµÕ›<]ŁĮŻń"•,%Dīå]k’’Շ?ŒāIČ‘ŚŠOs[ķYCPä6ÜR‘ē”š+HĘ”g/üśļüαĒ·¶NÜtÓM×¾žõē]p£R{]+¾Š†¼ÖĀLļTšń•ą –`@ߨó›-+j¬2‹Dä6œĢ/©žƒZŠÓõż“QU->ģ~’¶zGĀ­:xŹr»×°­öėęi’œ|^€Ą”C‡œå GT œ`õŹ>SźQ¬ F½Š{kpüØ>`dSąŒÉčŒõÉĘÄ|Ė·>MŲ!”€cžź Æ’įļ{ža˜Ų*ģf’^øoÓł’śÆ€Œń—1 µm=ŗ™ĶfśUžēPWVŒÕ>T~)Ŗ¹ŠAHLÜ«¬Ó˜oÓÆćņ"BR_>¼ŪŻxJ/óW°{ųĻ[:œ² Ēʃ<I“1äuŌ£ē\Q*$«š½ĀČĄõx˜½V’˜$!cˆ ŖFī|>-ˆYĖ”äŹ,ĢĀœõ}]Dś(’,]]]ÕÉ –‘H·Ūb6ēĀV9aD_$"“Pih\ńĆu)©Ģ•.¢Æ;՞<ŸKö#ŲĀU¾„iˆ0ĖR Ė4»Ź^w.“Æ^Æ&4ō“ćg]éå4š»œs.(§ˆ»D[^«~1Gjɽ)nh”įpGBŖ)5éąņpémĄĘЬzĖKķxa擦k|õ*˜vóu²²;UĶś4 }䗐Ē薉«³œĻ‹ŽDŗżQšÕʆ`ˆTzĀ~5ÕOźźi:ÆY­„Ū²īHŖ%į ņĪ\N×h‰UeeHR£¶gaŻ„Y¢œgk]‚•P9­4½„Uši% :Ć©ÄcįŃ'ÕŽX¤q@ņJõ%X©¬ž˜CĆGA(„˜N{)¤0I:µ9;‚ ¬<,„[Źg­_«B‚ WSJqéx iU®ŖhŌSńĪ«UÕ®¶nyäžŲUk:…bżš)YēäCĆ_%A#ÜC_ a Rv^2¦.D§¹!uńĪKjĆŅŹ}!k¦Õ†T3ģxŻAoC6²‡æKōń3²njvp}uķć’ų—]„ˆ Ż|Ŗ(BĘ9· Y`8ZćĘÕ}ĀŁl6•hŗģz,pļ°¢½5rm@=\2¬ŽØ$IX£UźŪĘ Ģ¦óŃhäń½Ō0s­qҐ€0±!£|“¢(ķg,EįŅÄųžsnĶ( ūF…ö@‚ł,³ł,×qĪećŹ{Ö{€ ˆcē\’¦Āœēłhuļ1Śéµ…K£ÆœĻ‹l”Ŗ÷øµ•­·&³¶ŠP'd’$(­‚sŽĄt˜XFLZ$ŖńŸµÉC„Õx»²ń%,3WL§ÓÉd’e[IR”ŅĶ—™==Z%zX²dóy‘$IšC†6µjØ×ĘdØŁö”æ\q¶„Ɠs!ļ«Ž‹×iHh{‘’Ró nCŪÄpޱ­ø”ŽYe²]}K‘™U’Dłœ]@ńr[Ē]D'åyŃ0†īc·T6'nŁ/ūu€ż “mpWī†<ÕĆӚ2“ŠæŌіTYi}…<ĻG£Qõ|˜½Ė4FŠīŽ 9KĆ?Ê X\ˆ "æWĄ2ū>®ģ^WRz{­ķŹ3£”ŗ;ÄńnvxpŽ]ü¼Ümb >–‘o[ķ‹F{³Ć%Æ”V߄ƍ”$Iāx]¤™lģ-ačģ®C¤īø+ó’īŖ‚‚”š'×tP«ķUu䩋™kĄƒ†P@œŚ3”zĀ ā†|źŚrĮ¾ŠÆ°.½œžyq`µĀvńb˜( ŒOxĢc>œ%S‘óĻ8ųŽw¾Gƒ‹āM¼Y€Ī>ļüw}šoxÓߝpS( ™nŸ<°¹hČ!u¬D¼Fb°t»ĒļæŚųźģŗ`]Ų³|‚"‘†ęŪ±ˆwg9°!(»d½ętåĘķ[ktu¤))zŸØ/*č‡Ū¶š¬ ¶ąšTk9Öš¬Œ @`:&@ČBH(%)ē…VĆ&© -ßB1$q!9ņ„Ņ5Ė2åU“Ž[Cö(YŅš%ī!ū9cYmKŠ¢p–³, Ɩ˜¦­·1aßš‹‚™ćF ” Ćą°ź½©\^ĮĪG(Į”\‚.ń-¦Ź‘Ķ€ē:žŪW½śįWŻ÷Ņg~Ū“ŸBĘs8K“1$\=ģ²ŽllŖŻåŚ’»”ŸdŌ` ™ÅYīģņVyk³‘—ՙŠBqŠŁyÖZn”Dgæ­eę²ū‡%!ć¶p%ŠŚž~ŗ‡K‚s^€ ”ŻHŅžź…5ceˆ[éž`õlłH,8Ēe҈³ńjš8)} >°šź5µmÆ_ødé¼ir[öƒźoŲiżŠéšŠ‰ó„žV؄6ö*+qĀ ® ±.# $åünŌ—ŗ1ušŽ%SU,Øj¢X»†€PŖ7‹ÄrÖĀqŸ X2‘’ų‚uäĆRq£źž‹8œVSz7q¬ī·³ŁL/ÆaiŠ€ą«BŲŻxXHQŪŲ0¬/ІŶŗcōzOšÖßö©1‡\=05h (%tÕY#°œĀŁ! ³Łœ¹Xl’ŅiūDD“ɱĮĪnA4%¬æżtāw)—CŠCŪŖ ‘y¶ŸõBė†ÉPm 4„ļś]–ņśī†‹=‚N¼źB>ivuø:°č•éŌóaP_āö&žŪ8›O {Ļ Ÿ¾ZZ€"R葖»ŖjÜ­ž6ŌŖ£Q…\ÖvZ 0IŌ%£¹$"–Öē(»M9–Ģōś6—„tē8¹„pŲi=ß®DųŚO€ĮP]ėæŽģę­I«™ߎeJ<'jro,;8i=Ӟa¾=ßłāgĒūVVę³Ž}Ż{õ ,K™ükæ éiOż¦TݼR 0!ü_’UdÉŠ{ģ!¼k$«ķmEŌ‹N qH½ĀßvB{©¶ø,āå4‚aā !†ØÕ®“Ź* !ņˆ>ĶņĢ5ĘdY†äłŠ¾Xc9ü¦.vapN(Ś80\Ś)9µ„TbKįŪš{?~Ć· ų··’Ē£æī‘H€āBAD‚7LēάFY ƶ@éģ~”R+hźp5Rk?ź‘5źūźĄįÕ@€×ōi[HćöŗV5~Ÿ×-Ķ)P͐R]ßQzæĒ ß~µŌJ6ØŃ³2x–kC`-«•³»KŠDżŒ°“Ē­ µgkÆĒZ[bø2Ū¤ 4Ŗ¦vĒńŌBĕ••@:ˆęĘŵN˜†’ٰJEŸ9P#h‚85_¢µd~Ņ>s”ĖP-&Tw¬;ĆDF¾ę;€ X“Ÿč™čœSėĆēk…Œ¾—Ŗ*†„»ŠĄ»ńņ™š."y©Å²Ćłkœā-CŒ‹}/ܦµ†ZÉ27µäÅōĖjT¦›Ą§ÄōīH‰Ūgp)×įꈻ}æåm¾m_°>R\ķ$4dĒ!bW„ŸōŠ i7j’wR-ČŲŽ/¾¶¶tŽŽ²ß¾jā©~ō¼- ģ,nĻ–8™‰KĪ:2ģDUFŹXVÓŻ24½ B)¢«|Eļ wŚHūp• Ån‡„°ļzē;ßZ8/’ŌƒĒŽēł ˜Č å‚ĮYt3™ƒQ9ĶüņĖ.€Ń(›‰ĖA¶EīõĄū°R4ÉøĘt=µ†“JŠ3Ą±.$5č[KNę^ĀGqo‡A»»Ū£±ķ‚ź$lŖśļæ@ꄱ†•l=ś×ȵ:gŧŁ(å<æų’‹s›ÜšÆxÅźę&°@a½õhóøfė‹F‚“p|žV|¶®¦‹“¦^RĖ €”ōŚVV&•ŸJ —¼;"q\¦…"ˆsÖ² :ą¼ä&I¢ŌPŒÖ¦§#†KeŸ3 8p„Ė“ć/~śÓ†e%„ Ą~4Ÿ~ļuļēŪ0IÄ1B |hŪüśH{ƒMI°ĪŖeĆŅKź]©zY­C9 ;¾öĮ7ąŲ™'wŹ@„ä”cż†X”Œ:äįź]¬²¢AX)cwm8tŒƒK3EøĒµ«dgV†ż‡Nķr0īØ÷ā@äŸQ,ņ­ĖÖ\]ģbS"dī8µ¤VĮ—TaėŃ­>z8§4½v‘ŖāœeY’P©Łéb¶pQÕ ;:Š[“0~Č­‚JÓAbؘ[CX2KkF»=åEG–µ¶¾ŽÆŌvę¶kq£PBTŁģāōOׂśnoo‡aōÅ#©—d±ŒSMn EH.żĻĖ{ģ6‡&YwZ*z]r!Ć.øžSœüėPŲ® %Z†Jsźe’mEł•“|ńĄ‡L©3¶ ”]"‚HT/œ³Kö3÷fõр÷5F>š>Ā­K^ÄOī=ŪD7.^·P†pN˜ełżp”æōĄL±hU𠮢õĘ/v‘sZRā¾¾#=]]ā¾Ē°¼Vptoå}µJŽe©WhÖqėw|BLW‘V…CėÖīŪ[¹ĮŃ;KV{~ÆV¢ļ ą‚"čń0D€(†)Ā»ŚCØg2E…*r|o!y˜īĢLB¶p^l£1ć ī*Qøm–Ė.¹ŒĘ«b€„@2˜Ž)Ųzė[žł^öŅ{^z遵ĢĪó 8øĒEg?ēŁĻ&t‰”¾“3t“by†*©O.bńVØŻębžõąīn5„ö.Ōn©Oé¶ĶLœŖ…ƒÖ9. «ÄBßK‘ 5é?=FAY<¼™%’béZDN=rX€²Ō‚0ą]GœŲ:łÅĻβƒÄt ©*¹ Ž dQD@°ŽĄ¤¤uӖĢ)zÅkƒˆÓŅÆyhŒŃ–/–Śe‹;1†œµ^i)ŗ`-źKI©UU?cČg9Ļ gŁ»­†x Ś€€Ją«‹b ¾ż]o'r¼¹¾¶-Ī%šŖW¾˜Aė„%ąźÉ•²‰,f…¾ _SüuhW<vĪZ›GY®zŁjĶ+ŻUłĪõØ„½xĮ¶)Kj„ÖĘémČY-<æ .KŽHøV0ŠģX;„ū¢©+",Ó½]Ši”uC‰Ž÷vسū^Y«®qÅI“Ļ<·{ éĀ…UE¢š8ųGct¤²,%ĄNņ¼h„a~[™$&ę×põM?¤RYŗåiēm¤kß®^o”({ŅēbŠÜz9=®µŁcwčŖź M©ŖŚ5”€óŗ¬]ŻQ¢Ź3„cņ“e«śĖG^ {ėv·²²²MBē‹|V„mD°Žæ’š™y».֐ ėK†ūɍ„ĘyXItc;U0y ƒ¶ć–Ųņ:ā½W –T¹r“44ēƒnāĀEG‰™zÄaRƒJٳĶīŗßé“|ZŅ„ī-}‰~Ż23=ø5-Ņ“%>}–k,滕ß]Neøv5ņŌł—q© =ć—GVœĘ+īä6C¤\·¬³€¶€eÆ\+T‹ ¹˜DJŒ•¬åĀ‘ģ„:/‡1č'Ē­ŚÓ™#–}lźųAŠ%®Z×[\aUN8©Š.4: ,åįń9ž­ż÷'“± PWj7ą-8vˆģe§C@ ŗåŽ;-@’e&MąŖ«®Ų††•U(魙q²’¼3Ÿ’£?ü†}K®@°HpāÄ 1ąRßC£e;³Ö%f³<ķ¤»āē‡H«Ī÷»{YÅ»åätļµ%‰Ų$”¦‰ ;ū±lÅR>D“ÖAŹx,!Ņ ų2D(¤ėŁÜóŽWŻq×]`’‰Ž!±"āŒAEĢ–[Ų‚Ń$I.žĮēŸ*`K€¾ah5+ Š5ō6ƒE“²‹=EĮ$ "‰ˆ"J-"½ «<ˆ“‘µ3£œgÅ`žēZĄJżžA0Tڵˆ$NŽń/’¾o4Jģöö™“ŃDąo^÷ŚŁń£€B˜°«ZjŁBVkҶgQmäĆMcęŻqĀ€ĶĘā?Æ’“ķk@"żƒ£®µO7§A¶źF-†*-ĒrDŅ‘ …]ٵʗõ½@–¦µˆ”Wö2õ«īt™•Å҉ķ”ĪXē\ŒļuN¬µˆŠgXݹĒÖ›‘y/µ'?’ŌIō Żx…-A_ŸŠvŒR8fÖA©«Œū!MSƒ¤†UU–šŸä+hĘE“]åÕU©k‹m)ŖGq ²‹ŒĒ£e.uyœ]m’Ų_+»=ŠN{ŅĄ¢Ī©÷ńŚ Õ© :ó½SQ1†eńŲq­Ė1Ćc»½9iß`ÅęWyŗ »[Ś„Ō$+z²²S—īv0O={iüšk*—/ę{TœįFÕVŖéß·­‡ ŠØm˜Āŗ²·Öį=»Ń‘÷uŪķ·;„üõµ/ł½—‚C "Ä!;0čyĦ“ŒU:ėv»Z­Mš÷2 ¼ŠN†¬›NļvŁž„MØ.=– uĘÖł–m[–ŹRźŠ{Bcž§©?>ꊸ5„­2Ų•§9ŸĪžōÄ'čļ¦dąoƽ¶v.cÅ” dž§©©QeQ©¦$¦:v –ö2Ėv>Ÿ‡„§ĪQaƒ ]ź;r$•/²–ēóBłĄŽ‚4Z‰ź,pC„Ctäū‘Ų~åz  Fö>ˆ'`ōŗM šž÷¾ēo~óń|>%˜¹c6ēI:§ozĆ„¹Hj…M{æNL×P XņσF’'„#Žz Œ1Ę5»%ŽČĪü\/8ø‹÷ę øŪsŁckābZ(ÆØZx„Ǿ< ©^­Ÿur 4mŒ—25č͐ĖåéQĒeŃŁ#ü]ōBŪ4…S†ŒĮ4M*Ė߯|xŖņ  ķ«<Ļ‹¢°Ö…ĀA)J‡­‰C)Q&ķ¢€JLń0æ’;ŃÉ EFAG”‘ń£(ŚūčT’¬:o•¼„/H…ĻƒRkBłS“Š\pąĄõõ5ĶUm®RŅjŗ—wĢŽ–rUļāmŌGtŖ¤ČŠ<¢Ø’ü’6š#vaØŌŃZ]] Ņ_Ī2"nmm5»ÓuՀv z ‡>Č«Tįz[«R•+²r§» õƶ¶¶B䦳,k·¬bŁźF”Ų6|i 5¢/5QœŅæ 4™ŹcˆŹ×ixX–Š÷”×é“6¬7®Os+ø«D tB¹7JYXc]ņ—A£O±ÓĖsm&5Ķ‚.½ŒŻ õ®ūŅ·nvW9NŅY3nW§„'Ü)²…­=‹$ė1 ņ‚¼ą„/}iŖ”FeœŅ½ŽŗĮõŌ+šUķ–ÆwzPʟD‰_C§~ŗLugĄx™ąnµ×;/ø«õ城µ6ŸĪF£‘7a²®’Ŭo8q§8ęŻÅ•ŚfWJGfHS£>!v ō·Č/gŁ×XǤf”¹{ēŃć¹+R2„€š6b”AD¬A! `„”Ė_’͵^xįmĒOüĄ÷’°Ö¤œ0”°c†®!·ōjc-„!į«…Ū®4CŽ>>›V^;āįis?“zč®$‘2ūž-WĘ$R¦vj,Ō(xBĶK¬Ē².j ‰Ø_7’7„P,^[[ūēžēŒŒĘXpģŲ±¾‘Žåį~Yݳ€X„ŠćŚuq—[ķK“TU„`…Į`‘CÕ?5š7h„Š¢`SŁĒį&†¦€®_ß}.7¾@iNR£ķā¢qafōÜ/bąąę¾ĖĻ9÷šw°-„$·ŁŹä®#w€™„Į/lNr`¼—O—ÉĀŻ`c‹ą¤Ō˜{Ņ!87ą-ÓŚo­eā —p8¾–:XĆ\ ˆõóÜ97ó<Ÿ$ćĄ¾óVyaZ†H·ÜR™ŁPK¢9ž ®Øģ™T\?¼©¬TpgYD(1ÖŚ$”Q@hųÕ+¤jłCĆ{WēnP“€Ń8ŸĒŠ”•Ÿr›*³Aé°K­g>Ŗƒ­:tśŌ S@Ō0F7Ż T3 o¤'oļxÖ3š’CA±C•’y¬śĮu#+'`0KR_däpxawĆ{śx tp­u5EīŌt>Ä> zØyiµŸ{šĶŅ6Z°±Öf£TÆLBPŖC‰ ĻdCd¤C7>ųŲ-fė¢õAz5ĶÅž‹Xr­£˜ZŽb~įO666†w˜ø×fõ·Öc÷¹ø$ęs:H,(Ā‹„ ėßŃ"5¤iŅUč½Yé®3²p8p›sxŠs R Č»jłć±†Vķčö„caVÜī¦TšåøøKŌiņ׳ūśāj±¶Šžp™bATž†NŁš]7č Նm]t‰\MVL:·QpŽKßöøÅ×1Ń”ßOø1“bó·ī8e­vžŌ–ĆÄĄ™äĒO¾ķmoūą‡?ōš×¼ęó7\œ€…Ė(ĄEļH ĆśXš[åc£¦1T€FiĶ[ōڇ})MģNŁŗ>§Źęt‰žB큔ŽĪZ£{=8ŒÓD‚UF$Aåč(®f'ÜYūÖ[œŃTĒm°‚,Ķ0KV= -Š$Müv#uA›Šļ¤q!U`cLpķJŌ¼w+¶]=ś"rę꾓'O‘cž£?xłóų‡ÅŌ ś>Մ!'Ą½•„bRSõūš9ˆ¬N ʔµ¾īy’ē¹1¦ÓhŃZöŖĀmļč]AEvÕÆŽU½&ŌĄ9v‰,o°šh#Hł‡%żU ŽŲ“YТȲLŪ¼?>’k1 ƒü­ ³JFūś…!D± rpßęööTą×~ćWžē‹^$’ "7v³Śng³Łh4Ŗt°Źx·Čmš%ą|ÓŪY6ĘŪĘ8ēŠZ›f;ńzŪV·/QŻ9±,„'OžÜÜ·į”‘Ä«Ī@ēœŃ¶”TŽģÖŗ$5 °³3]Y4x•‚5ē3f Ļ%vD‘§³ˆ%€XD4Év°/Įńh4µ9³dgž±qć”_¹ł¦s.8$qĮR’Ė’ē¹ŹhןšQćĖæ 6頌į,Ė€°w_­öFŲ­†.H«…R¹”ó#ƒķAJÓoC°s­×צ,H’õbŠ¢Pļ®ņ™?ÕćŃ¢2ėĘųčŲ ́f ±ĖN„ÄĘś}j©dóÄēfė—ćÄŪ{ļ9ŻāDPD(ApNŚEĘźÅ$v0®Ņ!¬ff鮫B¾ŠcĄÖ‘1€±y/ō ‚+Ą˜R Õ`+ģś9 6œjbGčŅ<¹š¢Q žĻE$€“[."©1EaÓ4©’O 5Äjpüżv¶ā)ļĖŁĀĢ5īBTŲgŃ ZėTķ2¼ŽŖ'B¼?{ÓWč•ĪŖILWÅ\¬–Õj%óY>eźÓŪ}ppT?‡FY½ˆƒūfģ* ĢAݳó˜Žsåw(Nlø^ė£Ü‹é4tłN×·Æę/Ó)ģ±Iƈ„Ę$uæ8 €SĄ6ĘŽĖ°ČAjļ»Ģ€Äˆ€å/ ŠĒf’}ÆÓ—gUȬEyņ0S½=,±F×”SsPµ¶PRŒ7“†³ww  fƒ¾Ė “ŻJōš`†ĄØ 9rRöGIt„lJÓWŲ$ÉśF­ÓT­ÆG=Š~l¶Ī@•`DDŠDīį #B@F>†‡=ü!_ųĀŃ ßyó-g> ¦­b“Ļ HŽ9!˜č}FŠŌi’ £~£zuքbŌŗs®P×®„ ļ§5)[ēČa@ō‡‚–”l© ! ˆV üžU.Ä 8TVA«YĪ–EĤ4LŅ#"ēÄj‚mҳæ(Š”ŖB~HŅŌƉi” Bs€ŪYӌitVŪÕ#’>ŅŲč{¾ŸżĢ§ņéöɓYBÖ2ŒG£hl—ŚąŖt ‹ÄåĘ6†”DŗsŹŽĶŽięŠÕ¶½”svŒøßYØ[އ¼}n  Ķēó,Ė‚Qmi "ke‡Źų½ż™T`{ækOƒ &¢ߢi”ł¼‰Kfo­ć°õɞ^Õt:LF‡n»}ggźĘ&!¢/łĖ€(¬•™Xū­¶Š}” eŌL5’@ Maē(5 pņäÉ}ū75-7ʀxO ˜nļLVW(ÅłĪŒ(I³Dœ³I’ų’\]]õgg(ŁłeB"@d„›„ʧ/³ŁlÕ¬B‰ėŽGÕ£ūYĶlBc=žM;:ƒ2ńDTą5ķäó¹™$5|×”)Į%^4ļ`’q•Ivų“$)ėAž¹yī{2m‘ņč!c²Ø5:ģ[cĀiŌ—E|?hœu£LMJr&wEBe÷Ɲćw}½@&ęĶc€=w@³”ž8;ŖH«×W Ļz!©Ę’õa ‹ˆIjØ)}ŌMwń!J’4¢ 2(No§'1ŽKł‘¤sČƉ†ķt&ųˆB­ƒ‰€£É73“IĻ”‚ž9VĒ#–ęڵхŅi­>hK ¦\Õ=Ć~µ¾@’Žš¾Ų¬„ÖZĪó|e2ī[±ł„”†}­¤zÜZŽ CZåĆā CŚÕ¬ū¬źŃŗˆ’ÄH½÷Ƀ%6*‘Pāĉ“›ė£Q–ēE6J{—@Ų”éķØ¼Bå"-<€ŚY“0·{gŠĶ 0ŸFīZ§dw¤( R/ģDµŌæŃĆÕÜu ®ƒ•' ķ"R:•=›;Ė…æ6 ŽÜĆubD„Ų­Ēj;YFmkoeø]'±ˆ½²ŹBzūݬ$3 ‘ŌŗNušČ.9Ō­¶æØR•kŅŌdYbLåŲ™˜`•NHÄ rœÕ+˜$faßgM²¶ĄfųsķI,#µŒü@`¬aFĀŠK4` ›ƒČćõµ_üĀē£<5øų’ æń1žŸÜ'‡"hȄūķ”.hēbü=vį…bĻŽįŌqWūĀRkOķ56@ V 8؊PžkĒNåź–l¤bøčJ9ZÆŌUˤ’J09D@Ł8Ó,Ī,”$½Äƒ”@Ąę!Eš“¬*øE1ļš ¬mi˜7,śøźŖ«n½ń&X4ҊÆŠVfŚå)ø«-²2iˆ8Ø:ƒ½¦nÉutģyó}s£×cŠyΘ+D¦ ˆÆhµ6:v[ńÄŲB\²š<FA°­ bJÅ`cʢ’łØ®„OKŲ‘£$jaAŻG!`B‘ š8Ėync7¦4ŠĮsĻĶŅ ggEžéO|“o·Ö‡ŠOIšŹ®Še„©sŽ2vļŪ·ékĒĄŖģBZ<œ¬®Ų¼'£ń8M0[k½„™“|>·Ö {ŻŚźq”w7Eq‚G*žfL„ŚQ×GPäÖ3‡Łs›$ĒbœØźŒNZ«S”‚E@d@Ē€D °¾2f€‚ąø³†ˆ&IfŽóÖw-@ÄŚ¼VŅ}£”tĀ€@‰ń įh™(I˜A*n0”uv‰=ˆ¼ø?w°¦JÕ¦ŅÅżĪųŪ² (^#ל¹·ā5QPā(f~'‰$pD*Ū*l8ĆI-ÅhtsūŖōŽ*iī„’U²K*Pq%Ķ%AÉo;šä—O‰W$@¶Rg£p)_W^–ŹŒˆ^«™ó<4 µTVZ#s54HI@©T©µM\*żV]š/YW²^oQų$‡BŲ€XÆ 4š0‘˜īEĪIp-Ža„x(H™3Óx]č>9Ų…Aoū÷m5GPHŽ'ĻwŌ‹¤wujYutK"Ų8eądßC†3zœsyng³īꏅŖC§KīdÅßįze_Č“øG²ō8ģź^N)éhĘo‘A0ŌPÕ[DIS3„i]9æĻ–hłÖ}ėŻ#·D„04~£PYJ{ ß^w„šgé?‚ČĪ!‘ ‚ueD©Ūe©j®6$ņ<–;ßU6ؼšy0¤Ķg¹ī– bLņŗæxåĒŽ’ž`=I'ʬmd£w¼ėßż]Ļņį<i£4ü! ŗ•vt³»²uÆCĆ÷†&œ ųtV":lœ†zuÜYģvˆR“$d„œ JUĆ_ŹGCŹ‚ˆŒ1m§–xõ†BLŪ©jEE€dfA™¹8įPóN¼s —Y !¦£¬=JĖh„4Äą¬ć’ļO’ųŒUpVÓł+Ƽĝ®zxž÷™æŌ,śįsžEĖ­ć’ŌóVzø"§5>jb<ĖmIA‰!ŹŪ§f£«Š÷Į3ól6 >UākØD‰iŠ!a‰W+‡GŃbę-–¢A ķ¦¼ŠwPŠ łž$ 1 ²@īµ¢įĉ“@¦ ÷YB8[‡™3fŽu5LBŗ'“ 8k«cF‘5TÕö¬8N²T! üóƒ,FÓZō‹Z .• JåīČą,ĒmČŅŒ”Ń(K0A؟€aC«×_|=ŃŠ!@0IéŻB‰ń³ćłĢ0ƒ8ėģsW×VĻ<ū Š5hRķĘ·E¶<ØPU肤Ÿ°”ĖĢLēNQ}õŠ& †¼—fͰ·ńb°j4‚¦ā›x×ÜząƐ‡Ņęźæua±N„[ä‘g/@ŗńĀxĒŠOēĮW·1nøėuŠ©J3x¶:dzé\½š[0W2Zu.aæ l„©³&Q>_z’ĻČŠ”ż7- 2!€––JiwDt. ”*Ѳóē©J|ĒlEEKEĻ\4‰źky)½ķj™h¤ŻQØHX;Mj”Nź:pµ2},Xk{zKD2Xµp‚ĻyCZ܋ŒbG/$RH…$1ś‚¾FÖā£)“®7łkf¢UĀC‡īøįĘėĶ©ŒėŖUѳa Ō°ōĆݳ°ī)¶7ß;ēl©ķÆe’$z"QLTĄ†,{1ŅmҾ«žĮn»µ;eI–%’)q;Nī“h9ÅTłīȽ±į·ōėģöjÕĒ^†”„“o¼|o¹nXMu‘3©5É“–Mˆ•»«WÄ;ÕIŽÅÕvŃŚ–ڤ‘B„ZIB=<5Č$‘‘‚oüŅõĄŽ‘µ{€ØžR¶‚?6QS<³/@_ŅŚ;DĆT 8pÉzŹĘYłŲŲžŲ ~ō¢ /X!"'ažēsxǻޮĄÆY@ łö¼ŽėPTn‰"Vā®;'Rõ‘jņtŃ_5L¤Ś/Ųž71œŗĪu4-įyZĀp¾ą¬…o£JsßÕ5Qˆ„X3źN+©ņæ•Ō…ˆGßĮkR0(ņOJr[č׎ktO¢MĆā÷…Ļ~īų‰mkm’|Ćc ˜6NNœ³ēŚ^ē.¤AڇĮāu‰‘+M¶š:j[¢”L–zŃt·µäeĘGUFˆh<‡œg Ō{žuÅ!IöjŅQĀ(½«”‘¦išUØEpėué„«&ģģģ³zĀQÕĖč‘tŅ’³:ē œ$5…·£ß*oĻŅ7ĖWøXĄ• YįĀ@2JMBEa£$DJĀ-h‘E7.ƙ…žĶč]šøØŽ½›!f¼FHš’5d*‹5„ x÷ŲŁ™€s iJš•o>~rū¦›o€ž÷b@GĘ€ćZį&>Å(¤Ąiģ4üLÓT…ćĖ¢6{I^u-.ķ©%c铆=ģf-ÓWh˜v6‹MMÕ„Zū.ź8.Uąo„#ƈ¾iYĖ%ZKøa±¾ĘŖ„ÜŲlūrņø{)Ŗ•5žŒkE™2ļõMԊ’ZļqyĆō Ö«„“’vIJF=EĢ)t¼(–c¼õ¦›O>,ó9X,Ę`ö,ĪZ5«—:¢=®śé’;˕ܱ€sģĻg¹vVU³]Wsl æZüąŠÜjù=ė=­[¹b–nÓźĒV eŃģ VĖ’#¶Q3"ś¢jFõLA¦Óté÷“ * 8Ÿēm0]_؆€[n¹ecc#Ą÷“ė ƞıøL³ ^Ś„b™S»ļŒ1€9.j“„=ŚŽ„m»ņŚļČ ĄD`a®ø·Nc# ®w“!Œ]Ülü2qZū×N…O¾«ÜuįO÷ŒooLžF/pW×¶P`2€P‚ķQąLNļ<‰×±svšī¢ļ?Ø<+¬Æ€e—9 Žyė­_žģgé¾$Ž A / 8 ` ĮB?ś±3å[>E”€yöWz@ĀÕIzāųįµÕIb0A"@€c'·Oœ<©æž‚ŗ:W \Ž"( Ŗ» ‡ Yāu–Ķ2×ķ_fĆćŁY©Np ü‹’ćÜō…/HaĮqbß9fqN½[*ŻŖFy„” ńƅyMy0Zs÷‰Ė±”Ā]9§kÅ]Q⼄¢+ı+l(؍ųĄz[†/ៈc €–˜x8Ķē‚ dę[€/~ł+±Īʐ'»­ŖījO '+ōKFåó|®NED©¤KˆrĄpē°Ś^X§lÜĖšŸ“y (%R,ČxvG–”ŌÕ”©kĘśø=żŲ9ўf¤"šųĒ?^Ōķwms 5ø¦ ‡0ß¶E„< ”i5=ÖÜU7ž•UB¬Z"ŖÓ£2Ԉv^Ėl6ĖēsLDÜŽŽV+Hē5!=Pk˜ …G”źżź€č{mmm•…Ėl]nĖ“Ąx?TĪLŅŲ– „X†Ā9± ²²2vģȌG\0 ¬fxžYūW×'ąŠ+®Š¢ZLÄa)?t­nö)óųÓöŚĪż~ÜE=«Šž›¾QĮᩦ\X}Yćt`ŖĆĎĢBÄUփl„ņŻ MfFS²Vüčō”×q°Ė„£öGQX)IģDL\;Š›X”…•H/I½dß®/d6w“¼ŠŠ»×ōˆyĘąöö6)ŲśÆžü•÷æźŖĖĻ?ļņóĻ{Óß^«h?ĀŖÜ_‚’²Ū i[ØTtõā±/7zŽņhœéÅū,zʁQ2|צš¦‰Iš76ÄŲTņZ;+XOūķ”]¦ĮNlnNk‰‚‰ą÷Ė%NŠ”|ģ6čÉūBS©s& ¦>©l퐫NE4kc5óĖļqżŅÖ!õń Š*µä]ŪʄyŻn©OKVʛE؍æ·kl­4æˆēĄ©čZ €Å4 VA“Sļ ¼i# mN'„kyöo/ĮķŌn¤³4la»d?z± ōŽ"²'sg%4„7{©  ؝0„ĪHņ“ōÉż[ņ‹"čœ8'žģC`ē€Ł…1 ¢³o¼öÆ'D+&YVˆ.ŗšü×¼ę5^|Į_½łäĪ q…ž^YbŠŁÜ¤暢ŸłæņGļ~ĒŪ„„RćnM††īĒ ?t8+l…m$!ķ*"|ėÓ¾éųŃm"”œ‚ I‘ÖÖW ąūžū½>`"ĒMĘ#ģž…Gh­­—7]ģ«EĮuä­QŠłżĘeÄ}Ō½mUUhżņ—¼lbĢĖ~’%¾ßżWĘ£—żļßų„/ūV ¢1("ZBvNŠĀ5‚6"`ØaüņąK³DŲc…‰čäɓUĮY&ƒŪ[;ŪŪŪ ¢ĄéŃh”$luŠŽ”µQv¢PjĻq½Ü„ˆČó āpVA}€Ą `Č(ˆ™ŖvkßŲeFVīśT-8–` pFndˆˆfóżė†`Œ°ŽhY¶v¶&iFļy×»ATK;D8LAćՏvY„īMä:Iz uI$ģÖöku'ŗXĮŌįŠŠI‡ß öøR™ė„āą~ÓՓÓ$aŠ«’cēėט o[t*MęÓÕJNƒ—LV‡ |oĻ­ZX\=]6:Ś›ŒVĒ›ŽĶĻØ ¼mTŠś€~ĆĆ»¼ŗˆ ŌMį+/ĒH$̈tĖ_9ēŒ3ü‡|ńóŸ'8Z]aę“Ó© ę"W^yÅĒ?ń©ŃhäÆP¦sĢF×|ó7’ż[ŽäD®¼ņłČGF«+Q"DĆŽQ黫Ļ|š£{ŲƬ{ČCßžėĄĖŽĻ„@ęółhbögٹū6`.īŽCŪū֓mk ŒV''¶§_łŅ ē\rQ©¹¢¹Hi‰ŁÖą…3N'“Iu…\;z+X‹T3ē³Dl˜ā¶§E…*­2ō§EQxg‘EøCł­,ę" °%¤µ4qNĪŻÜdf›¤‡Žg£c'N@– ŠˆÜ"& sU7ŪĖ—ßé)H$%8ZĘMDŽHÉGį>fę4Kœeͱ1Ēßæ(^ē³Y–eĪ9C)3SŖ>™0›ĶĒć¬įā]ĘbPšœ•rkģ!pI’x‚1Wę«\pA™\œn¤åĆ"ēĄ§°X° h…ęöģµ YįyĮ'8›‰E˜3üŪæžĖĆūx†„T-ßĻ®F#Xø5rŌĘ$ n^±ÉMĒ£ĒŽ3›™ÅQ Ģ«“Ž!“ŒzOÆańÕzsŖÓ¤d c±C]dnu­ZašvÖ5교A[8UĻŽ|€jēš×ēv>d'Ī9Ļčp]Ŗ9•5PąÖZAJKę'ĘĪ®rĘjV†źŽ£¦ś/xKžvu# ¼ńx”ĒŁl>šd(Ģ$šæöKæńkæ‰g­®c±•¦é±iŽiöšæž›'>ķé@ńCdÕčq€J Æü“lQś‰gorMGC]8Ž(sĪė]ckŠŌ¼D`s—¤&ųØÕ N*³ŗ^kĄŹ5„ÓĆi;üßc}–Čģ(ĘIŠ`Š?óꎿś”ńóźŽĆ+Ķų0…ŗŻ=»ŻZ¤iœÖ8Āā˜J+š~·Č¾ås}ÆF-Ō¬µ&MJ„]X¼8.Øą‚Š냃»ø‹hĄ= įnĘ/øŒ]=£į tņ”Ę—Ē÷·d¢ņ+į@|µČmć„X:¾ÆØ£ø×µ»GŅžFe)71¶ƒĄąčęāT”ų'āŹsŁų|®ŗĒ•«ė_ųāēecI±½Ķyž€HęK_øžœ³Ī‡Ŗ¾µ2śč'?ü†ü{9°²ņ…/|qmmżĆ×½Ōõȋ3)° pŠ9`€Ā‹a°TŚ®®ĢŻkądw}čƒ3qRśŅĒ?¼m„‰  ’Ń$ū•žōJB˜ ¦’OwĪ?sć÷’å€@BPlOS€Ÿž/Œ]…ŁįP¾×wdė‰3„$ŲŹd4ń½Ü˜—ö ĄtĪłŚD\\DĖNQm‘mIīM“¬ £›1 f”Įö¦³ŁŃc¬[8Æyå8ö­ öŃ£·|œÕØĮ!2Q ­W7ū„ŠõG@ˆČŒ°”l½6`ŬÓ×/+ņ@(X…Ā(Ÿ^ųJ.kĆP-|“*!rwŒ”–¹ś”r‚”¬Z2&Ü*Ņ]¢ yĘg½õʤ“yd‡u͆¦n˜Ŗ~ÄĀ…-¼åÆøŠÄ^įQKpi©E”[wBZO0[]qŸ’¼ļO€‹Ī9+xżė_ČĢ…±Ńoļ•ŅĒŪiC̤„Ä9Ö¾³8 ĘPš&ąĄ e&IM›››ś’óY®b‹ŗRōX²Öraՙu<q„ óŁ,¾¢ÄC£^½1‰sĀ…€…U”,¶ģm»Ł“,LBź~0Ī…Œ#`͇żQ•¦ÉŚęNn3’ĶF.8g湁 øķŠķ@, 9.•ĘuĖcRóį8ŠŁŽŽnČē6Īųp+/r `ą¼ČqaŒy)Dż¦Ėš1­…V߬źāJE®©>µóM³@Łė'#ÖMY„ꛢtĀŗæ1ph—é”F“Õ1d'Ng¾Gęƒåö„AH`ŃūN¼nk†Y, P‚é( gŲžīč ²ÓNPi}+2$ÉbqQ)w6ՎŽžBųŒZ…‚†¬³śO›;cFć ¢6ūfšw"Bģ43véd¤›ĻõŸü,0žŚo’ī  8:›NEfÖ\_Åyžœg_PŌ;ó@‘ł„ūUņ|’𨿇ÉĪ ŅĢ,T|>,U‡ŃzVphFh‚’ If“a jł0• Uu¼4Fb(żø2,,³čšÖ±Zaį¬jnA6N½Ü©J52¢ ĘN  ‚t¾łąš¢å uh½+śL½ˆt vØ ž*Ž.Ž/Äf,l]%ÕÓ*5ÕPś‘Öfū,«°iŖZߏŽl¦ 7 sśdUæQ„V $HÓD×A8+uņ©ä?EƒĪvc$Åæx„ŗ_GØ6Kt tAė`ŖcŠb^”T"–Y‹zŚŪmɃøR© ’Īōo@št§„¾ßokūC—Vł®śĘšū°Œ0Rö F-"ˆ‘,£¾KłÉ N|š¬Ė™\Į®ą†•]o2\ŪÆ‚śF‡.R|=>Ä I“Ē OŹĀ>¹šū‰äĖÄ]Õ¤ą{¾ć;Ų¹µŃ„ ¢˜¬L£q*Č(„püÄQHÄ9W\żõ:ÖŚõɈ^óƊŅ\”ˆ‹”–ĆwśĄ»Žż7Æż«ć‡‚eŠ3“Pźn‡åVžĒü ƒø¹¹NÅlāĖŹŽ•åõ}­µ<Ż™ļlĻŽīČ÷¾Ļ·ļó.ŗģņ-Ė£qŹ“}ų£ĒČ5īŌr‘[•ėP‰é‰e!²om|†2^ybn§ülH)‚`^$‚„Ä[۟ūĄ‡žõŌ§>ķяžŅ§Ž'[‡¾ńxā£üČ«Æŗā¼ĻüŗG<ē)OüĻߞ°… 8Vˆ]Č̵Ć@VXļāä”CĻžóG)ŲŁĪö$K»é|–$°½½żĀŸüqŚ€J(Õ>…0kī(KAˆą«_łŹ“żčxӛΛ¬]¶’ąĒŽū”?żĆ?!F€4SBÕńV=‡P )ė–/’Ć’31f͘ $·µsīŚźEgžuöĮ3’üž§ąD5‰uX ĄČPÓø7ŻöŽįӟū¬€¤iš"<źk‰„…•c$ „Ėu-°4ä¬õRŽ- ¼ˆ€Õćjž¾÷¾ż©O|ÜY“Ń#öš]żĄ{\|łŸ¾ųe×¾śU9€­‚Å]nåT†^\z…y‡j½Åx#ākū%XkkGŽfˆäKEšā†|#œ=Į©1žŠ¤«‰7ĀīP}׃Ö/n†X$ „@(@dū$袄5¤¼šćF:ĢŖļŪ'9¢sNźčвšŹ„‰łŻ’õ»ąŽ;īHœƒ|>×wŸĶfUū(¢Šŗ“1A•D“ēā=Ø÷R "bŁ Ī#›…@Į£ēņŚŽŁafvĀօSr4”NT ś=¹éÉVÄĖn±OłŠ¢Ā`śg=Ü3IēˆĢ§SĢcńāŚį1žs穙[q€'OžĢ 8x& ȉ'D*¦³¶ŠK¼S”ĊRQļp_%p¹õ‰gYÖyNĒsc.P;¬ŒĮ˜TsÖY¶ō^· ­$H¼¦ZĶ—³7’r Æ"ŻE}ß`Ä2W­,‚ QŅąØńŲŚŚŠ~ķ}”…Ō)”ŲŗŁĪ”Ä1D2æhH@Ź ^c«šŸaĒ¬o1™””Įé́cē«TĄ9Dč™J»”¶óÆ’śÆŗõV[Zƒ°Nęv朌VFćŃÉ­™:„I"”ĪÆėk1’@D"·d*ļYiAE*Ģyƕ+tZ×7Ķ ±Œr˜Žł‹-«­śG–eĢ5lŌʔrŚŌŸh„”c7`]ąė5•Ϲ;QMf€ŠĘ\“jW‰lKˆDć!ÖRŽŠ³m.±ī±±DHb…|N_“‚PMĆŚVŠ0 Ā®µMĮšī¤ kįk”ŗŪŒ“^;€ł¼ČsŪ@}łĻP·ļ,īجjLj5ž­ĆżīhX·ŪĀ u•Ćź= {.Ó–„”[oŚ-›ÅhE£”9 ŗŖ <»Xƒ S®Suy@ūBĒ–e>Øc@EPŻüœ}ÄÕų—|óĘźŹ|>5̲Ć“°«ūÖOĪf¹€I ū¾ē?ßo×bĖ.½6&ć„p6›#Ą%—\ŚĮØuēżA8ŸĻĻ9ļœĒ|Ć£~ą¹Ļżžk®CŖņ‚ĀĄżt]@ņ'āNœ|ļūßūČ[žå-ļ’ąuyČ×īŪ<ū}ŸžÜ;?ž™cw8øqęŽó”ætĆ5×|ē{ßöŽŁń“ą<]†$1Mń„Dz;v„4›Ąņę7’Cа¾–¦³­o¬lnNĮY»¶šŽy×Ń}ć1OgsÖCKĒ ‚©€LāļįĖ_ųĀ=Ƽü?ßżī ·EįģTģu×½gėš1ŠA½ū©j€µ\‘²Ų¹õÖĻ~öóūÖÖÖ3Id6;vēą^ü@CZtōĘÆNXW;™„»ŻóÖ÷ļW(; \óķĻņ6Qå^zøpœrĆŪiōö‘étZ[±óc'žżõo~ĘcŸpä®Ūņ"ß·š™sö­žŚ‹^ōœē>’Ī[%lĒ. XdŪŪŚjØŲŻT*o13€=€™l¢ō€ńpĒzb¼µµ­6¹źh8ƾ§ĮµĀP×&UmĒhØjO{:†śK‚+¬Ę÷ģ$Ųū@„…1Qßų”Ž“ʏbJŖ4Ž£ry33ˆ“Óō§TŅģ~ģ…/4e’0xļ;Ž– ©”~”(ź œqÜZś±;kƒ {87DŠļ”%̵«œ¤Ę…/%ʘL €¬N2DŖ+ADˆjUz•{1žjV‡ż ˦÷&%HR€ł|Ī…Õōœ €·&–ZµBG)„D䜌VVŃ9g ’- C āĀ<ĻG M wrĒĶÜuō ę¾žqÓ0oß¾ )WÖZĖ,³éÅvfAՎµ3nG‰”øĪ­Š{ AjŲ.ōś*– sģīže£X[8Ŗąp0œ×‚h-£ģŌiKŖōa$ r‰eד$ģ ˆtāÄÖŹź*;Įұ\/ Ąž!"]²1¦1Čjo¦')  ¶N!0†Jæ­8{,J̓‡4l×:‚sH_zÉŗ^ā32øB`²¾vč葭ټh;Ē8—ŠQļĆ7ą©J“÷õ,yo°: lõBr„(›”MŚĢùl³CYŚ(éį÷1ś°šR÷J Etš 8ˆ}«œ!öLiž¶[žcžm„?󉏯zĖMó|j‹yR‚ćS·3·¹ƒ«Æ¾f&)¼źÕÆ|ķ_¾F#¼õ–Ū™a:i6(ēž{.d™"¦|£ĀŽˆĢüæłkŖKšfęƒ|’Ļżō !A`§{Y[ \ūÄė«pąĄ<·œĻäšÖ›æR%,7~ńĖ"NĻr€ /½ÄLV×’źuץ¾żIJó|¶=ĶO?ź±1‰ń"1|ó“!TÅ:ĢaŖ„%ŁųG”TüØˆŌŖJCBdqĄŲ°ĖŻļ’ęo½ž¦ūŸ{žy«+ē­­ķĖäÜ}Ł ĻĻČ`upb4ā;næqkėŠ“žųøßżƒCź ;‡•eÓ²£•’!€Q–į^’7óŁ|œ˜Ć‡OžŲ¶'wN…Ė2“$d­]#;wĖ_™ŒGˆ`-ūĄ¢“c!KT2"žöÆžj0XŲÉē…ĖSÆóß=äkĄ }ęV)P¼ˆ 1³·ƒųŽo{ę*‚įĀœLF@)Z²+Ÿżņ—=ń  ˜”Ą,ˆ{,ĪC“zü9w³ĻĮO’ŌO€TÄ>å)OŃ˜Ķ $„7ßx#L· ōķ_ÅjŠęeĄ+ńruu5>Ā>üĪyŲÕW~Ēw~;īOÖ/Ų<ĆĶr2rņä±3Ϛ\ø¹ņu¼Cd‘ŗx+CCF}ž5©öxą`ŹF3*smQ7Mŗ&“‰1„qW¤ź&-:”ėY€7ŖÓO Ėw¦\&I@ąß’łŸ !h†›QÕ8Ø/īÖdr ŖŅĄ‰tĒįøÕŁožµ_cÓ ’ÅĻ}^ÓõÜ5ƒé;5ó<הTmŽU²Č«RśŚŚ'†Gģ,c‘ĪZp„.’ēV»=αˆ+ŠÜ:WXēµ" ™Cƒz‹J×bŲčüõWhH² oEe"¤¢J 𔤬¼(Ś-MR¶ExmsĆ18óLłnĶdV°xÅĖ’Ą£ž¤Ü`E %YŖ+D®Y ·­G‡×Q£,Ū@¾!vYN-±·TüĢ©ø'āL†ėY±Tę[ā%Ė4Ų©P9—f°Z_ }ąś”V$sdŹ@„³Yī¬NÆbĆČƒā†’¼lĮĢPX¶ĮZžĻ,a9ē!ÓN|9FOl Ké]Le\(ĢģE ņ²,gŅÄ’×փ³HĄ9±–żŌŃś ØhōÜ…8ŲX[sģ„ĄĢŠŁŚŚŹŹ$MpßūLw¶ …N/Ud“ž'Rk$Ī’ß"ށSē1Š÷53‹pæu“ZÓŲ1+ćīMœRF‡K<³łjåōšS«Yį,Ø”>”¾Ž”³n%Ɗ v”AĒ«ż*ėVYėbѲ¦ fO7­a^Šųŗö›®”µčQ¾ĻQ[³iśSŽŠĢtĪEĮĀ”„fµtéä•ß—”™¶(Ü ¢`ĖWĮ4™L–Ļ…ö¦Ō©Ąõv·w½“ȁģŗ/9_^qm Š+!x§š±Ēéå2B¤T~tN¶Ąh ؍Ę\ÜĆ4ū/„žW•Ńī°”?’ŁĻn?f¬uū÷­®Æ$˜Ą5ßó¬w99c÷¾½ĪEhś:?ž?‚ä@ąäIOz’¾ŅŚŚŖĀdm5Ōį|·D[jb‘ą–[nɲl²¶²ē9ē/~éKžą„æ¦äu•Ą@ąŖ«®zŲ#vrūÄśęŠA>ļąžó.øÄ[ŻzĆM?’3’楞}GœLG«ū66ī}Ļ«BO}Ź“9Žķļłæ÷Ū’ėö›oŃtį†/ß0β4ķßæŗ’ĄŹY‡8Ņ'>ņ ˜L&äļŽņwŽžUūŽ·¾õž—ßć xäw?ķ_÷ ŪŅK26ķ/Štķć·ųš{®ūŗG?łČįgo¬p‘Ćhǚ“ÕDrN N٦,¹õ®ĆOyĢ£œö:` )ĖŚe—¾˜[°$I¹ŸNrēq‡Ż0Ķ%ü)HŚs“®¤śp-n#h߀¬uŒö <–̶ąÜ5OśęŚśź(®žą÷>g•šŽ—_zč¶[}µPå»Cż;”fN¶¾@wV ­źóĘĖ^ß’W[9ø¹ł^ö2æA¤DP{|цāÕ”'++D¤=ĻčŚŖˆY’v{kǃ*ŠJqėød“ųé”zWĘ`’¢V“$ɲ,!“ōՈ xź°7:¾{ąa3"b½,|QˆĪŸė R8žVv†‡R›„ŲÆ°Ÿ=äĮ»;ļŗĖ ¬m¬m¬gīæĒå—żČ’”2ė(Ź£ŖX–`4iŠ©]čø'¼Pį|:ˆĪ¦GUn#¢Ä(Ķ©”"Ž[’ ²“ƒxiĮŖC|ÜĪ‹ŹWP±ńZXĘ ©8ōMg™(ī„Õj+Ī9„¶EįÓ,0™dĘų¦Ėńų„@¹(ģĪN>$HRrLą-ŽŠœ§Ółw܁@ąŹŲĄį`tÆIĮę üYš)ÜĄ‡z”"x’ˆFĄT#T…*O¹īƒ”hgė¤Rcžćßß²±2ŚŁ:™ĻŠ• ¾ō¹Ļ’į’y 8[ˆB5œ7“ˆ™ Ķp͘4Ņ©÷HUž*ü­‡»×@!õśHW%„” ]%«Ė ¤Ü­²^kM`w%PŹl0!Š[ÓŲæND°‚÷NTIjęó¼¦ōŽöuØH­]÷=¾ˆ:Ś'•¦h™K/ź†utwŪ™CNŌmŽż‰ŠPäT؎ėkI’ ‹ŚGUkQ»ø|Ł FXā›!Ÿå04h”’œŲ|=ć ĻŁ{•@lTt¶t€ó܆ӿü©Z ķŽęÖgzŌ™} ¼NÜg¾›°ÓĶ˜ų›»bóĮ äłn•Ø—¤Ś6Š C³}‰³VäˆE‰÷ŻŚō^Xų jØ4¼FÓ'>žq±²:Θ!MĶÉ»ļĄ¾—żĮ A~×»Žń”§<9Ͻµś%—\,ĀŗĒżÓ?ż YB„,°’Ą&8)œ§Õ@vĪ !3ĻņÜę;O§šĀžT>/:nXJ”<@ü©Ÿś©BŲZ›ŗż–Æ~’³æŠ³ßöÖ’øåę··Ēpčšį#'NÜuäp)’‹wŽygš&©Il.›ė«_½ń¦>*Eū;TYłIä?#`8|z‚$1R¶€ōhÓš—­U#” `T†%ļxóæÜ÷¼sWÄl¦ÉČY3wŁ> M™f6ŪŪ›ø~`eóŒ}ēŲwęĘ*Ūzģ ā|‚­›žsÆżė_õÆü…Ÿ’ł‡>šźĻ~ņ~,ßžÕ[qg{Vänk{~Ķ÷|ĻüŲĶD;^äN˜€½ļ}ĄŽm1jTWˆ™9“Ćžęļ¼śO^±>N͈Š¢°ć1fŒĪXĻöeˆ…Ė=]ŠO&#%V¹ćĪqIJkŚį1››“sĻ=8ĪF1ųū·—’ļƒcp¬Ž-‰IT½exIļŜ­õńõ_’õ%FӒ÷½ļŗ»nŗłiOzāĶ×_Ÿ¾ķ_’ķ3ūšĖ’÷ļxu a/‹%u‚khŹĄ˜æūY׬§éĮ}›œąYgÆ;–g«Łh’d&p"wĒ8k}ó]ļū@1›‰›ŚĪņ['Ē×Mģ4ń(S PÅÜŗ‚5±T-@ÜŲ@5KŌµÆźµł¼ ĢpÄ(ń>Ļó­­m¤jÕč* BcØ# ‡Æˆ³9€œøė®G?ģ”oż§>0­%É«« Ą•ÉJJ'ßõŌĒ?œ)āˆrŒ„†-ֆ—š hGēE*duŠ£¢ė`čWŻĖ'¶NŽqē¾•ʬ0eąŠ›-¢tŁ*Ū ųX'Pņ2“Mź‘® Łx¢Ü[—f™æ~…ļ¢Ļj’ŌĦV=¼]™f‡Ō·āī ° åyL›,C`ĄĄ LG Xń‘=Qą™Ėŗ*cšLTB@XŪÜpåYė K€·:śł/_’™O|¢|"U—ÉY[Ź÷”Ķ‹ˆė›¼ŠÖ³®ÖŽž3qøćiĮøģž3ŠŅŃŌqŁVö„­ˆ•w=¢F4 ö) Ķe«­VŌPāņµŗ”éGl𭿐$&MS¬œ~j¹‰”,I@œ-‚€pb@@.¾ų‚­cG‘ Ńd2ŗč¢‹B•^¤öGx“4M™uߗ·¼éļ?zŻu}ä#~č9ρ‚MP4d¦ŅAŠ€Cv$B"ČĘ`¢ęĘe–ØŌ Ā }ĘĘ7l‹G=ę1?ó¢ŸĶ²dss²¹±źņ ‡XÆ4ɅH©¼fŖü¢<ņ0xŪØņ°7·>'öÖ¾qC•ū€)!nf•-AņjÖä9ń߆ē8mǁŽ ­śF~NŌJ”ƒŗŒFY£kŻB=ˆöŠ!Ō×cy¹J Ņ’¦1ĘOģ.\4”Éź@E¬aŲčŚk_7g(pŁÅ|ä£C2h®¾śjĢ8±µ3Ļ™VVV11 xŚ’ŹČĢ\p^°±2YKaeœ¤ ą)O~båWķĢ•¶!ĄlZģäL˜Š8KĆęėœ|ź“Ÿøõö;Sƒ Aš¦ąkæį딤)nmoƮƭ®ÆMV³#Ē·Ÿš„'ēd€š€Y{«Š±£-2FĒgȍ‹ĀÖņj=}Ć@T# žüčĒ~ę¦fąNlo”1[Łžq~’Ó¹™Ųt#M¬ƒy©Ÿö‰’ŚOž$ˆµ”[r˜šäĪ[oÉĻŽ\Ė·Ožćßæl.’¦Ē}ƒ›Ķ&YZ°KĒ£‡>źk’O’ō·^öāūÜ’>£‘Y]Ķv¦#7]’åžŠŚŁü®;ļ,AȀXś@¤ōŁO|ģęŪoFäĢYšĻ@`ßjŗ¹²²šećÉäĄĮƒNä۟żŻlRƽ‰=pƒĄĪζµV©b ĄŲž¹Y‘ßzĒak­>ø¹:xõ«žļœółTŠ|’źų’ęo®“—üļߕķ).®#$au8#²ģT¢ń1|ä­_½ MqrūŽžĶO:+ŁG­Šč®cÓż&ēæ6^…©lį4æćę[Gāhįo.¾¼Ē.ĶĢWær=ßtżW^ūźWß|Ć ¦ĘŠ|k»<ĮėźAńTÆÉo–%Ąl” ³ˆS6”®ÓŃ$[ŪXm`=ōeāć Ņ—.Įol A>»č¼ó>ń‘$ģŒ+ÖSSloŸµ6ž861xp}õ+_üĀcłHPŠTõéįlg·…琭(+–ˆµNEiPēüįńģē|LĘYįųųÖÉé‰Z6K’Š`©!źą+D@,Š¢®ņ]…\ŹG€ OJ¤É­źŠsP'œe 2†+cPŸņb6 ÖZÆ&ÕLp–CGŗjō² ;±€ R¢ĢŸ{Ń/@š0„E>OŚ\[æ÷żīĢą=‡ dæ,¬"'Į‚øįaÖIn€¢K§"ŒĖ‚aYœ^ư·ƒ].ĀĮ6ņ–:±&Biźe‡U#ĢkmHŽø6sŗ:Ų„U’P4ĀA…Iج‰”q69t"äxœ%©qļ}ėüŽļüĘĘ$¼č¼³ 11ųüļ}»ā§üĒĮ:ŽšŅ})[¹>Ürć ćģ;¾ķŪ¾ękyŻūß÷ÆyõddģōpīŁū,ššĆ`’fc‹]?“uĒNxög‘@Ąē}’ ąÉ­élž Ą±ĆG\əĦŸk뱆|)–]¬·Ńü,-;f³Ł¼rKņY1Uψjō`?tQ>DO*!+¶NՆ›’Ń}†ļ—¹+³x·ō&ʁ \vž"±_yĮżøŌy šĻ*+3¼oKTpd'qć¤õūeĀ?b'ĀĀQkŌW_±ŽŃØ1õ(i›7Śe1ŹŗŻC«„ō<ßŪ•ŁŠ‚‹Ä,¹BM#Ԝ·¤gOčŖkō×ŃP¤Üiwy\ÖÆÜļįĪU]}Z’™¦^ˆ0B‡ŠÉ®³FŁ¢ó_ąŠÜ™÷%œ”Œ *^I[šŹC‰rZ¢NzZļK A•YŖśŽ&ŻžIb~é~jĖXv/ÓųŻg{8ŻŻNŁŁŁA€Ūn»Ķģßæ’7ē·Ń '`ĶźŚĘ±#‡÷w~ūļ’žŚæ}ż_ƒ``@ū[æõ[Ā ė«£3ĻŲ`óĪ;O™^ąp\DtĶ·}{B$… 䝌 ~üC¹ė¶Ū;m©CŹōųĒ?^ęó¹ˆ#‚·½ķ?Å1Į·æż­«cšĻ­ž4—\rįņ AV śžńÜvē±­­ķ¢°™Ag½t”‚IŹÕµø˜T}jS9NŖŠKš&ujaf` B0ą„ŃIpü艷æó÷<ēü·ßåņbßĘĘĀ͋յU7Īnɋ›¦ö/ßų×’öīwæ’‹_zöOüųWNĪķŚZ>—}“µæ~Ż€„ Įhjń…Ļ}@„ÕńčČ]· Ųāćżč¾ĶuĪs{×]Ē·wfĒÜh_ńǐ‹³n>Ī05@(ögöÕoZL”ˆÉ]Gn{ßūß½o’Śx”$Ģ*Į$ĖQī<™*v>~Ćm—Žć€DU!;µØ @åVVV¶vf³ÜYH”'†`¼2™YUĶ•Ł¶8ļü³CĄ‡¹ź Ʋ„{Ą™ųr¢C8~üųlfWĘpī9gÅågŸsš®»Ž ‰Y_›¬­fė“ńÆüü/ÜėŹĖŸųčĒ€cDtą$8‹Ø +xSVŽ™]÷ž÷sąŒŒ&#ZßwpŸĆédÕ=öńł‹æśóæ}ćė®yöóo½uk’mŽq”¦tÅ=ļõšW¾Ń-<$*qy""zŪ?’Ó'?ųūŽėžēīßwÅå—=÷¹Ļ¹ā²Kæė[¾åŽ›nüĮļ{ž_žŁ+ßśļ’QėfwC$(“ĪŅ4EŠĶĘ|Ų=jj uźČņO’šū667ÖWĒY:2Ȗ3‚ÕWFÉŚ$3āßqhe”}īSŸüşū9 h@\NŸpyJyƐ£ś¢„É2a)iŽ Ģ*–Üņ4ĖĄÉY®”Ėć÷8żĆ<·Ų)ÕÆVÄYې}± Äŗš€d!`;ŸkōĘäyī &Lp0ŸĻ…5é•ét®ėŃZ&BvUk­õžeĻŹ9gLĢ»CÕĖ™Ļr ¤R-Bg!«f%spÕźčøŠ¢ń2Ā "Hn}s¬u+³éžõ,ĖŽoœļģ„>4¼ĖŽA0µķ ō08š£’$‰\ŪP1/cĄ"²ćÅ„‰—ījśuIģH tŻ«GQ'›.MS}ŽZEŹ­ķfž`Ķģ·±©xšw€Œ|k8³é¼”D’ėŽłŽ‡ŻēŖļxę3~õ‘s»™eēŸyF ńŖ?€?xÅ<’¹ßc„P‡$€ņyyH§“³~a~ģcć ·š&ĘćżcEœX+®øüģ³Ēg®ŒG—]xī'?ńa'ńˆ‹æsĆõ_QaēÄ>ė[æy ąÜÉä¬,ūłŸžqį)K."bE )ÄZqNXßRœü䏞蹬.Ż7>w%¬"$|ĄÕś;Ŗpėœóļ^ˆXvóó&tŸ³7®Ü—^±aĪćæöįbóųė×>ōņ ļĮYWģ_¹h5YOĄĶ¶œ”a‹ŲłĆžŪ}× lføB\óĢo'āXXX –"nœŹ‡sn>Ÿ‡¬¬ŗq"..tdę>s{ĢCŗpɾżg¢9‹ĢE«£KÖĢÅ«tÖjš|ćc%\Ģóm’‚,ozŻk\ŗ6ŗēõ WGRĢK®œˆ“śĪļøtßä^gn\“šģ#¢xłožĪ*ĄyćäüIŖ£}ķ_½ZŠ™H.<Žw>żœUŗp%;péĘųœŽšē’Wę3)ōGĻ]œøŁfgørsrÅśč¼īCXøņ‚ƒ~Ųż~ń§~äŲm7 ģĒUXæg’é +vž³?žc+ūĪŃ“ō²}Éåėtł:\<KVą›tłf¶ąš§>Yl.ā؊7Õ.§ļšGCÆæ|ofė³.#Åīæ-¦³+Ļ>°Ÿą¬õl š°ū]%Åģ±øź>ē®_¾ßœApļƒėWnN®Ų7ŗhUŒ÷é}죮¾ścļ½N¬cWˆ8a™mm—#Y|ß󟓜‘eē Ü’œW\»d=»’ł¾ęŹ …ē"¹Hž“§>éŽgŒ®Üg.ŃĄ“æį‘Ā»rŃ:)gTė‹ć·¼éžš˜Ēź9øÉd“b|T—(¾­»‰uśŃn…UÆÉ"Žēә¾¾„ģDX\Įńø©žSć;AJŸ³q¬£#2;ŗu`”øņĄäāU:7ƒ3.Ųæ>8’Žėą¾KVąź³Ö﹆ø×Y¤°śÖśYˆ-Ċ8akÅYŃ’łż‡9š3։ćrK³j¤:LĪ9½)Šœ±~ćńžļLm!'ŽļX½n¶GļøćĘ/}^×ōĪvīßĒFóÓ1[§’÷°’vŸu€ 6VWŽńO’ 6ŸåSæ¹Ķ]D×]}$«™ģ +N¦Ū3)dzbĒ߬æl]u×ÅÜŗ™oĶxf%g)Äͬž²+8Ÿł¬°¹³¹SćAWų'ĖÖå³łĪÖ4Ÿnfõ"‹Ės±Sēf,…H®æ)ĀR8Ė"Ī ³č«ł•36ܗ>}?—œˆ›»°?H‘‹³ĀsB8ƒą¼qrįZzńĘčüµŃ}.¹Hd*œūńrÜÜŖ-FÄ:Ī‹j’lĻeĪ:M¶m•{µH!2+NÜqHÆĒĻėšŪLc£`ėÆŁ²Ó»ŠĖŃēPūŗ°ĀÕŹŅłÆ/›~9q…?‹Xй¶Õw¤s,We1ÆV‡¾¦o˜é+8åĮe­±ŗ‚u>č/7ß+zwæFkKÄ »'>īė3€Ķ•lpŽzŗ pł9gF ĶQ3€ōĢÕ±:rg]õŹś$øœ5Ļ|ŅĻȲu€3)هpī*]±/½Ēžģ‚Ų°š©÷}@¬y˜.ś)ŌHZjńŒsN’‰OśF­ą¦½ś>Rlė\zι«Wœupąš§=µµ¾{rc ±Aµ=rĻgł°üJda+JuńÓLgHł£öµCo‰xĘ_mŲ@ŠpjĖ|šū÷mžI}n8 »‡ī<~’‰Ÿ«— «~>ĶĆü ;4^¼žOĘį³śQcγs{āŲÉŁĪ<Éźvó†qąį†ļ;ēf³Yų’“…—į  g„~gųz†_mWŃlūÖæÆ«†}ųCøŅ±ö‹/s»ˆśŗ¾³ģŻ ’&wļʵ½Ō¹=\sßõ̇=Ģä¾[^8ž©Õ÷ĖÆ£'lyś \L{ꆁĪ+øŖ›āD „K.»ŌĢēsøāŅĖī{ßū«Ö\|ńʼnI ė,®ŒĘʘétŗ²²rķ_½N«RjąĘ§IÅ±æūķoŻæš®MF'ĶˆŻjJŖńłO~LėƔ…KŽ 7bžŗŌ¤©ē(°2žģ_]?|ó­G¾|żw_ó·~õ–éö³“ģ[Y%ʼr@YTų¦§=Õ:`+ ųüg>YUĮ(ō7‚ę’źyßTń›†:?Ŗžp FEQ32īSŸŽ\[Āmq;ģ¦Ół‰-7Æ8‡š¤oü&NÓLk)ÅlöøĒ=nmmåÄÖ|ß¾}ūöķÄąĆxȃ“ ø¹±‘"Ģī¼s{ėøHŒ™Ļ fžé¾ąŪŸõ¤Č,{ü@QYŖ’ š‚¼ĄĶē€ąēy~ė­·†rĻ+’æ’»:2Źó³Ædū¬^vłyŸśōēßśī÷üŚ’zÉęŁēR!…*Ba­žM:cŽń’ł/’ōĻ©š52ƒY66”%ėė«"`Lŗ±¹ß$pŽyē)s2Č“ ø!2q½E#ķīĖE=2Åæ˜ŒFĻ~ž÷:Ć“šŅM7Ü Hó"–1%矹:·ó‚‹qš­ŒĘ—oN.ß\ĻŪžó#żč#¾ęW]ré‹ć·anļ¼ķ¶Ńʊv?>ņ®÷¼į•Æ>“(³Ö $Ib­MÓ4eŸżĀĶÆæöoĀ’w÷w'vęӂ'ė«gŲ÷‘~\UźXSĄEįŪqZ.Uń ’_’å_śę§?ķ=oūć #— ƒ+R1$ˆ  ž—©üĪ`ŻŠs–Š3BĢF#‰ü…”(,»÷²Mę ]ė²× œģ©,ļæī½ Hb`{{šeپ}›&Įķ£'Ÿ}Ķ·ŃźŹ‡M-œŲŚ™ŒV6ÖF[ĒO<źAWæé Ŗ7›& ŒȀ¢©Å:§b\‚" b×ŪA€Ü:ÕÕ3Iōr=Ųq‚Tį Ł»Q 1°¾>1h’ķļ’öĻ}Öcv’Ē<ōžĻ{ęS>óĮ÷Lʀ,ČāÅQµyKˆ†lQ `P€u)ĄŪßżN „8`†Ā5¦EøžZ³.Ą®D`< #Ģē¹c'ü­Jā°!c’$AÆEĢ^ŪJ€Ó,)ĖŲ°³³“Ļ @@¢4ĶĘć±>>± IbĪYfōpha0htßGƒDbYMO\aĆī(‚6wĄČ¢]“K³{µoßZĮą¬ŻŁ*Nž˜Æm¬źK_ 5‹²ƒü*$L’éLq”8J!A…eÆlų^ß±cG Ȓ£;[”YŚ;Į½Å{ą·×¦"fd1ä˜ЁŃFMžøc”Ę»µ•“|ōęĄjęģœc'”Ķ)uEŸĪŗx@`”&'¾ē@śŹU®±̄Œ!O-» ž%cėuĻr÷ß0Ą²säŲGŽ’”`?¹ƒŒŅ±}Ąbā„Ą‚L$ß?Āķķ)2£©Aµvž+jŻŹrüšįO}ņ©1ūW& vc%2#*$?ppżœ³WĻ9cķq}ä'>|]’0ĆŹ!I»Ū @RRRÅéŖWcł×žÕ«ŒńńĀžč‘µ…ˆ°XøćĪĆ ĄW®’²Źū5āØŅ—X:¹Wa;õoWJ¾-DBÖJ“©6ɟŹkˆč¬ŲRØZŖåS4α⠚VIm[)šóV?;G;T»ŠO?V1ń[Źl6÷üjÆżµ„„”Ć8ōjĘ”µž$fuu5MSo¢Īµfõéź5µČe·YŚłį·š:[‘ÉPŸ¹ąB6Š2¬ŚÓÕr,ÕŻ‡8ŗ „¹~Ų|Ah 8/ģ īÖTibݦU/+ŽŻa½6„UÜ-]+žWw܋^ö€õŁn/tmčƾEųēN W¼g”f.Ģŗ….Ļw‹ėJŻĄéīMąĻžü•Ą±L&ŁG>ņ‘’\ķĶɈjPœ˜Džš‡ēĪ1ĄńćĒßyxēŽ#śĖõt"æO³ į7žķė¾ųéĻfŒĪņęĘde¾]lmmŒ9~詋žĒOÆ"0ól6„C'f\x1 ©Ų†Wź#zŃĻżĻͱ9ėĄęūÖ3Än¼^½@Xф"ćøaa€ö\o’³Ę|@f];DŒČēž;ŻŁ6"·9¢"±9ƒ€$3)żÄ’±ūÉ’źŸŽĒ+ū÷­Ų0V××;zńŁg—W @šŠ‡>tsssœ&v>;ø±śŲG=ņÕö§gļ[`c`^øµM@ €„ xÖ÷<ļY×<{m}}VˆewŃ%žqę³2aW\÷žwŁÜsÖ¹äcøä¼ f[soh nšĻ’ōĻžļ'æt}ŗŗf(4N˜0•>Ré:ūĘ7¾ńó_śŅŁgŲXR“É·ēi:2”Īg=>æķŽ;FćÉæt=)Y[ī ąå÷˜žš‘;LĢ ĢūĻ>7˜ī̌ ³Üćņ{̶gūW×·nļŪ·a ņx’Ķx6“ķKĪ?ó²3÷Ÿ·ż«_½é~ł—ÖWWļ}ń„÷æōņ{œĮÅgžõŌ§ӎf@Ä+ٱ£Ē‹¢ČóœĄß^ūz@!2Ł÷’Č fsŁŽš…;v|ėCļ?°-4õ5ƌF#@ā€ˆ3ÆxŁKó7~#E@vrrvęWRXĶ()õt %BŻóž÷Tsr’A\1";7ŸĶ(ØL"A’$*¬Õ¹‘6œ,°b˜(įRtīe/}iJ˜„8™¤£QŹb×ÖV~ž—_ō'Æ~ĶMw::=yÉWŠh“cķ\„ó™O}śÜ3€8$`pj -bH¼¼1¢=q§;ŸłšßžOoł©ū‘éÖ1Œh¼ó‡ā“„Ppa Ģö>3Ą“žųd¢ō›æõ»^uķß}ę†Ūo92{óæ½ó’Ś<ąĮž@ˆPX‡č„’œsI’»Ÿł™Ÿ)¶wf«“ѻ߳.pśęL’”:6żT·!'Žpk]„Ȩ̬¬NF£ĢšējLv$”zKj$2I"„ 2ŸēEnCÅĢj§”ęŸ>0!"!CŒ &$$Œ¬„Cß±\Ģ-€SrĮRķFÄin¬5Į$ÉQŲÓ1Ō=[³Ą)„Eą~ąWWdžŅŃ7ÖG[;37›łė@J`Xpœ@VVʕą?1ųĒ/ł3žšä{ŸwįåĻŗēŁēœ=_|`’?ś‘üūævńŠ[k»hFe¤ĀĄ…ó<[…ū’ĢóéōČtNŠęvŖælSSōĘ%놫 ڧ:*š>gdP’ 2ˆS뵄*ŻZ2ضL\½ s>ŸĒĘŗ5W[Œ€$¾œ$}’ÕÅų’†<į±™ļ윹¹éhģ!xČCÆžžēISƒĄ(²¶’¬­˜,…[n¹9*ÅĘc×±ū…h,Žó˜y:2s¤”šmo,7ƒ•æ$»‚jhšB„G³ķ ÄÆ^RŽ{€1v7ž!•s›ę* LīĄŁ H \„ĘøÅšźė!Ćb+²šīT™ØwŒ€,nrģŁŹŠģ‚Ż:ŠģŖIsŗp§‹.·Wą /BŽŃ¶ŖŚąœSK‹ķķķ u¼|€×†LcŖŪipē°“{]»„p/Ź^h¹Œ¹ŌŽęCÜfę¾@n +nūNqƒ[*wžĮZ×ųŠåćœŪŚŚ ŃxĢZ‚„„³jCÕłńŸüļ`&“•{ÜćJ»=…JˆK\­1$aÖ |õ«_d%K͇?ś1,ٹR#W00’Ų÷?ļĄĘh}cSslkŗµ³dÉŹJ‚NV&£ē?ļ{5iRˆmLJÉdüéėæų…n8>Ė”øėšŃ•õģķļ~Ūʁ5'`R‰Éü5­r Ø+² ¼üå/ߙ9Īēv6MPęÓ9‹†R÷g³Ł®œl$ąć:":Ė@ €ń½yąpĘĮƒ;³)!Xv’Ģn?|ģæ’ō’ü¹Ÿū9@`ē“$᧬ȁVWG‡:±;~<„‰š…/}ńĘ[=qXĮĆwÜvņčatÅ$MG£žē/ž²±€cHF#Ąä÷~’ÅGw¶ąŠ‰ł—ærsžēąÜ‘C‡æöė¾~e2ń}zĒ;ߕ$¦)ŒF %ųGü§,&$ ƒ ų:}÷3ā×<üįüo÷ļL§Ū39vb*PģLOX±` ]réE@tdkzčČį0ū“”Į€HÉ^Ŗn]ŌāF )ŚI =ęяeB2”nÜśŪWżłU÷¼×¾ĶŁl–$ ®8z¬8vbŪ‰d }ęĮ¼˜%łń“›lL.:°ļĢĶUćę°µ5q.Ėķ 3d««³YĪ yī¶¶Š¢(ö­×××Ć䳙ż<lĶģɓ'„ołęgr1ORƒDŃŽØŹFžŒ·ļ{×»ĻŲŸ±9Łæ’¬ "šq&h”®ēYĂČŸō„Ē<ę1\2'{÷ĶR†z4;k«ĀžŌHČmć»v­—ˆŌЄ⨋štūożĻ¼(F£Ō$HNœÜ¾õčö5Ļū^H H2­½š'ęävžĢEFė“sš ¢01”CpĄ p9°}Ś /ųś?ō»žžŒW¾ü®ŗģæü¢ŸÕšĪ€S‹iƒ“¶nŸĻX.,»łĘļ½ę[ß÷ļ’rŠĄ…›É9©½×Ł«ēÆĀ9+pž“Ÿųš;ß ®.Bķƒu†ŒÉīsļ{Æ„Ip|6’Š> …oæĀŹš4œX`A„ĶĶ cčč]wĘ1Ÿļ!uJ5‹S)ŚJ“Y¢»Ģ¾Ā‘¦IiŪK;;Scˆ jČYŽŽI?d ILš%” ŅłF£W[‚Śn‘l4Ņ :䠀 ĢEnQĄŪn¢ J@)ł­ßž_9ĖV^L qźw4^EL˰†\aKÓP?Õ žķæüć›ņ'~ģ=’ńo;‡ĶŽÜuɁƒ“ĀātśĻ|ęÆüģĻ|Ļ5ĻzŻ_ü0€Ņ¾]Ż'Ų€8/ĄėŠżŅOüäż.¾ō‚sĪŚeyĄƒÆ{Ėæņń“ą\ ¶ņ†€PhG¾KŒXeMŖh}./„?SH«Ā^z ½,"e£QC’"6Am„ƒ„™b4Ųźø^’½½0 |ó·<3w²µ}ÜŪėk4ŽHą¶­¬­nLę̹ˆ30°`æėŁ×` (õ–ą…ÆĻ9xp}2'`mž¬®NŲĮm‡į®-8td–Šj"£‹ĻŲ<~ŪmĄ]«KŒ *Ē]n\PX°ģl^€8pö3ŸśäK~’Å×]÷ž÷¾ļŽZID5ķt³JŖkAÕ¬Ūž%ĮŲ³!›e™’fĖ‘«Ūø¢ƒ¢²øƒ¬1Ō}Ō”%Ć»«¬X1Š@¬6Æ{ˆsl­SeiżlÓŚÅ{YK”Ö>;Rˆ°ÅY”°¦IĮ%X]ś!NJjŒ0ćł_‰ä7J ±Ń2ÉEŸÉB©jšN?Ł"š2¹t#;]2ȡ²§·ŸÜ™mĘļ¢éęƈ8™LbĄmrģӟžōöö6ōČ Ä@ŻŁE$I’óĪ=O6ÖÖ§…żög}§äT;@ČŁėĮ|ĖŸ°;p`ßɓĒ%ͶĪ»äĀŪŽM×öo[;óķéÖ'>ō6ĖĶW”ŃŻ÷÷}ĻuļĻsÓsųÄ1ēŠŁl'IAęó"Axī’€"™Ŗ8šqOzāżī{µGµ!Q†ųyDSPŲCu§MōGD“&j‡P3 ėŽ?v|ūÄĢ9E'Y‘ #<ņŃßš¢_śå}gž„>)^ŖĀĪē rŁe—„£lkg{e‚sĖ~¢°š·}dz.»ģĒ@BE>[_[9°oĆó‚ Ė T‚ˆōĄHҵĶē>÷¹^rŽĮƒė3˜f·ÜxӁƒ @7^#€Ų|žłĻ~ź·~ļłŽ2LŅD’āÕÆ"L∠Œ‰PO)–ˆ\žæļ}ļūŲ'’̽w˜$G‘>üFf™¶ćķz'­¼·€@a$¼šępƒ„Žūć8ģau‡ļ9#HBIČÆ“«5ćŚTef|dUuuUuOĻģņ»ožyö™é®®JoÄoü­Ńh¹.‘įj ͐P.,Žė^}Ć­ć3SßżŽ…—üéRHĮ° ³d “¢Ż^ų·äQKÕx§ ѕÆ;ōšcŹ®³d “‘Ą?ó™ęāRŠj…F{åŅāŽ¹Ē<ü~C“ ’ģßrć®»v.ģZŲ µńŠ#Ų“ę„nī½ūĒåŻssAT<©ćhQ« µZ ŌŖB”>óÉO%božČųŁO{ŹPÕ.ĶĪLŽ}×]×]s-“±¹Žų°‰ūā˜ČO½ģĻ^œoIcjQа«evĪ-ŽOL U«0ģ»>ćŠMvļśŃ¾/|‡<© šŗT \«›å¢0’Ö:nsÖÕÆØpŲMY±± ūxttø©ŚŽ@£#÷-, OM,鄣 ›˜`šŠG=bI)!d„FKW^w-„õ\Év#Ņaą0\@/-=ėģ§LVż+ƾĢŭuÓՊ·iŻTŻu\ĶBip÷·|ņĆłóÅæ„@…­fTéaķŒÖ”°¼Ņ ׹᪫ÖnÜōõÆó°ķĶNO ‹Kø{ē’f_ŖųńO~’ $˜‰RH×q?ęčćN>1¤¬ō)ǟ€HŪ™{Ć@‡`L³ńĪ7¼įģG?ś!÷æ’ ’õ¹Kūęģ1E ĘāR4€ć:_š:-{m–Ļ€YD&ˆHD¦0TQ"‘Q*•Œįv+Ž#)„5‰ķv`Q–p(Ā·1GŃq„ć)…ēK„ė„aˆDZPP³Õ“yąˆō(A€#„ź}wīų׳Ÿū)°Šd˜¢Ö 7tŚ+pÜf&žÖF'M\ž…1Ül6ӌŒŅ EŖ„ķ0ŠĢ†SāĆ$!]õd"hĆ$ŗ[SWŌ‚>̦HåĖ6Ų–"éņ†óĻ'råB »ēL™é |ą÷æņ„#7Æßk_qóŸžpČŗYŸa“Äx„¾oĒNWK—†0 0Œ†Õ„³YńÖÜÜŻ»wĻĶĶI)Ć-¹‹ĶV£¼ćmoj.ģ±][?’ÕoĄ‚I‚mä9Ź{+b%„$ŁĒDk©’•j\ұ'­_é‰ÅF KM395cK=R—`LĶ#ŅŻéc XÉ.†$ 1ņ#ŸÓ»*Ź‹öÉ)zįł~ڽ<×NŠĢ.'ĶAŲ\n¬-×Y3ö5L)l’$J«_w~.ā(veP­Q2‹$•š)žnJ³>…į;4ļD;īlD"- ¶Lū½•ęf‹Bź‚÷€ .ć±vŹY6E¶¢ŒĪ*Pqw=m.>RD/Ģ1cœHU‘“>š 6[)ė;ƒÖze}{Ķr‚ez@W_ȧUūd” ʤ«ĻV÷Õ«¬£O¤,|ŅBŽō~Ņ Ņļ{žuQ¦ĒIü𨬔IīŹV÷ZƒSīE?¾Ńōō€JŁoźéO}ŅĮ6ÓÕŁŽīu.“ŸæmŪÖ;wŻE K JóÜÜ>h£m°Wž >’Üs/ūķ%9{öģk¼c÷ü1Ēł§k®Ø-“ZŠĄs ­'<īqĀf”Š $£F§Œ›¶{Ä”žW¬#dРꕪiƒ“ՏüćcŽ>0̬ģŒĮįGsÜ)§ģŽ×PŠųÆ{ł+ĮĀ(¦ø—Ėå ~[[#6īˆ×Ū3€‚¤¼ņš«ēZ! ųĀ÷ $„!Ę~ō#«6&źdbw…”B\sĶ5Zė‘‘W:\zÉļDģ+ Æü“gqŲŲVCQ­HęJŁÖč’’ņ/’"%ßÅ„ųÓ’šūF+h«P±QŒū?ą!W\ćؚõbtl/ćazŲųĢl,-ć ć ÖŖVń ĒFkʧ½nmęV Bf„Śģ™ŸšĆĻ€ļŲŚSėxvđͦņ}O‡m;vģHJaS ”XėŌ(ēö”™yløŌZ2  Æ}Ėł7ļŲqć-·\uķ•{‹»vß}åÕWÕFF  C"Ķ‹LGŚ¢”ˆŚ/™„„%ū[V…Ųqœ¼ŽĖ$Ł%Ŗ5'erlŌ„æ’­Rzø\.łŽļJf’¾’ŠWŸ įŚxš½Ų~ś£Š āøuæ¤[Į¶ĶŸō¬ēhaĮK@ų®³óŽŪæ’õÆ­Ÿšüė_óœ’+U« %TĄķ`~nļwæ’H‚R~ЃŽüšW?éQ|čé÷-Ik¢ˆ¹*¤ŌŹj@$ķ©×½ģ%CĄš”Ņ-7ü}a~÷Ųä˜_uɅÜReø><äŽxżÕPX:½9jĘ üüā_—€Š_*•JW]sķg?öq-%õDu€ē;×^qłCžåō÷¼ė?żžwwÜņ/}ī3mŽpĻķ·Ū™ØT«II8ŅB֑ĆŖˆ"ŐBHDŌl“l”©}„ļ{V¹ZÄšLh֖i„”²QČh~čć„ ’‚£TY£šęeA1$®śż>žĮ²ić„’zjØŗēĪŪr’Ӟöä³’ē _Ć 0}ȃ[ó å•ÄŌųDœč‰:œ-{šVŖe›©žųæōÕ/}ŁŅ¾„ńŠ_qčČm• SŖHæźūnT7>QÆÕJžįŪ¾ō7æŒRaŽfåQÖ¤õļü“W<ē9³Õźµ—]Q˜p¼a®ŃŽ,±ō{ö큣éˆ ±¬;•(‹€VcXH*—ĖqŲäRoŁcØ+·ÖqŃ¢t±1Ün·‹…¬ūםpW„ ś5¦#1ģyT­ś ³~Ģ&Ēć/ė›§=ī©?śĖ5Æxē6sÜ’våŽŻw=ł)ĀņQõńŠ’,IŲT®Eńö䞊ßļ¾ė¶#=7Š&dņ‡Gž’ņW Z›Ż¼¾Õ^[ ķ‘2žż=ē@춁&‡Éa#°†ls„’JÕ -6[ ”CC­]c‚¶ 98łä“Ń'G!ŗóŸ6i©£BŁ„ oÓ­½śĒśt.ĖÄ]łü^‰ŹĮaXz69ÕÜNJ²‘2£‚?wå`sģīåÓhœå9Ū™plYGйœļ§‰ Å"’ÜÉŠÄ#īÖu§Ü6.īRœūšƒÓI“>ķ¹’™Ū^mÕa^Ż 2ŗYƒŒU`'Ķ*Ŗ 3z1„ §©×ēŻĀ•Ž4 ÄŁę|ƒ¬«üėW— īåLo°^{!…–AõÜ/V’FX„ŽÄL:Qœą^@±Į¾$n²"ąŻ£–˜L”()’¤'j ŃlW˾2ŚśV‰¹ézņD&ކź‰N?żō¶2ĆcĆŅsl$ī_ż ĄJ̆”ńŽ7½ł½ųÕ†mµŪØŌJæŗų7ņŚn¬MĄ/U°øoī¾ĒŪ˜ŪŻZZ69jŃ@Ś@Š·¼ū=s­V©>Ŗ4tŪH)wļ^PŹ„Å@ķĀo įDµĮQ¤!ŖGyń9/ƍV…'š”2łČGĻ?ļÕI4"ib™xyń„d[؁Éh8Qa ƒaø\®0h­5ŒrØeō”Ū6'¬H»¬IĄ®]»––KKKžēIąČ#4±>/ü·sŖå¤£™vļSšA’ł¦i·ŪqnĶFh„p$Ųü˃:£1?ŠĘĶļ<’|ŻlBGęŃB6`Ķ–żkAT¬p›Šh„ćȈāhŒCĀRJŖŻn'=l!Čó<2ģ)„š}ĻīnŪaŽ(ź[k­SźtĒqœ¤{”eĒ‘F! @śmoxŻ©÷>åćy“j/īmĪļ«—[K-ß”/|ö3`# lŒƕĒj®'hߞ½YyČĀŽæIOŒssaį/{Õ¾Ż{ĒĖnIˆ²poæåV·ä‡Fƒ„ē—*„JÉĆģXĶŗ±“htššWæ `GŠō‡Ä-c£!łˆćśŲēž+€)Ié gO;hX ”2ŗ\«|ņ“Ÿ“)A ą‰ā\X²RR"öߤՓŃ,„HЇM\f¼lį™”Ņš:«¼Ž“6ķv 5KIårÉŅ\#žJõŠ‘dż±Ō“2VsĶ„!@ėfÖųR†Mv+CZxŸüĀCś“j-Õė#£c“_üŅJėžģ5’ ­f™„”`Ö0¬‚„łĻ~ę“kgFŗVw\ןkė3Ÿōäėo½ĆÆT@D‚ƒ@I×q}ǐ¼čū?IŠ:+b#$Y•²o~ķkßśźW µi·„ ĖMZ˜_‚!é8Ģd”"6¬!H<žń—asss( ‘[‰'6]õ“Ė›% Ģh×øRJõ×ķ•ˆŅ˜~r§¹°}4K kƒDä”—Üåe{ĢCP§Sz©ä'į!:u¹Č‘÷3żK»ž+ĻĻO ŻtqYČõĢŹAkł-£ Ė‚vĘ&Ēöģ[R ­FĶóÆ¹źZė’[ˆ•–ÅKšŌõŸŃ^ś,ĆDB† "jģŻ7æoN’ YK[łųĒ<6‰šÄö?ęZ[‘1Dh6›°Z6ŅźÜ°Eet|ll|÷¾Ā,6ùŶ1ؖÄ}īs0Šv0B„<ś±q\„€£“°{ĻŽŽ§eO+CFhč@oZæ &–Ę•qwFŠ:döŪD3Ókšžē-,, !‚ Žoč’ēO~ž‚—¾ś<ĖģX™¢ō^M„ĮWg ś“”lŽ~VŲjĮV³9bĆšŁ’#„'[ak©Õ\j5Ć!ŃVųźEߎIzōĘ7½Ł«Tßņž÷]vӍ•õ“{€Ż!LĪŠŠŻK‹×ŻqėĪÖ¾ ¬c%—įµ dŪŲŹ 44ą•<Ė! “®³°Šv„p ݈¦fļ?Bļä’ĻžóN<­Jcļāā|‰” ˜I±RFB‹(%C‘R¾›k"PŠIŲīāR¦óɁ‘WóīMuG¬,£+eæā¢VõYiĮpļļū Œ¢Düę']č,6Ź`×FxųÅÅæ–‰&ž1 0?ūŽN=āšõćh·])ZaK½giŸ–ÜŌmQõ“ąSīu*ĄŸśō'\`flر4_ņå·æū-€#]iŠ4«Œb+cfMĻm·Ü:\öŪĶEāŠ/—F'‡-)¼õżłĢ_CyhßRąUšĪwæĒ"§lƒѾ€zČ#Ļh+5ZŖLMNĆ!k’˜œŃ6æśå’ÖKbØģ“VŗŻņķĪb€łļxū—¾ųEˆ™Žč &Ńń/# SŃmžŸ„‘ćŗ\!Ēń<7ÉēŲ¾ÓFk› “q7»Ab/Ēxž#ސ¬ %mm l¶ ®ćłBēƒļ}÷g?ż©©Ńŗ [#5×\ņqøvjh“^™ß·ė9g?É>įĶ7ü}øZ ›”'„tš„3Ļ“›¢U“œ D£Ń8ųąƒT+åz­¶iĖę{šó!ß9ß JņŽÕ^Ų£ƒ=Āv‹µņ=!Ų\uÅå É(ĘPäanńš­Õ%<ĀH©$”Ŗ "†[.IA,Č÷¼;öģŻ±sGJė,ś—¹gCć4a, ¤F)Nnw®#ĀQ¶q@Ņ$3ŁŌŽ#€”B‡Č„)śfŒ#–l."į8 PšĆŒq%Ķķk •j©¼8×™˜ S)•™HȄ•"„#„ė°‘F§Š/lÄӀĶėĪ;on÷=a³é9.1ęxå«_’Ģ®1ībC–«#eB*K÷ĪŻ4Š˜6žāDAśŁųō³Ļ~ÖӞ23:¼mĖF@F+ž]»Ī Ņ0“D¬µåÜĪķ«ų66‚ķŪ·ē2 &‘ļJSŠ»N'†ĶɳARŽķ²"ęā)ČpRYPĖdŽÅž»Ė’s«Ļ¹Į].Hئ)…®,sגģ•ńĪVŻqW×Ü$3l0šS×gäŗæfOšn1¹„zM¶„;^w$²0ˆ¼Ö*H:Ū–&NÆZ©“v@ąŗjFė jc‘’Ät8ĻžkćtNYRuŸĘi+ŹEåæ½˜Ņ‰D«µ™ŌXm w~Ć t¤.uØĮŸ«°pwՉāeŃģąÓaV.£§•ūø ŅŻ¼mÄÜŖk&f$ÖCI‹bttŌ^Ū¶ ńl+ąŒ3ńŽ·¾ūsŸųÆ»īøcžž½RƒHjMR0ļŪV«bxÄw}éłW6¶NOœń€ūĒBŽ›Ÿ­—”b4›Z1)@Æ½öZ‹øBŒ3)1ĆŃɇ~ŚÓ¢6–x$L$i ˜ģ\ZXv`¾ąŃzyTŠ*pŲ‡‘^Pˆ0Dhóń‹‹-ÆzåĖ÷ķ[rØJFµ—Ī|äC¼ņ9ž![T©Aįšõ³å’UĖa*;²āŹé‰I‡iƆ yF“”ģæż-ļ Bć\RŖģÉP 8 ÷Ć?õÄćē—“$#Äb«uÉ_ƈjwāa! {l€ˆ)āÕ%ŅGŠKŒ'?żéhÅ.I6†Żū.’ÅÆµ+”`°1»®T@c(&.ŠD"Õž«€P€i)‹,¬D6RÕJœŠ­æOw0K¶“Sņ!#7tś CnݵŲ2^i6;¾ćx„ٵSK -b„š€,Żé©u·ŻxĒ„—\üÖ7¾ī)OyņōōŌĆyF©Z:üšĆgĘkŽĄāüÜpŽÓdęįŃŅsžńT†ä±ÅŲŠ€¹m箄V8\/±Į·¾rŒĀŌĶ3³„6|Ņ)÷ś×g?·VF­"(łĪżr’ķĒEĢ‚­I äøÄ‚YŲ1œÉ<ĻK‡’x¼ŅŹ€!Ȏ”„Åv¼NŃŁ/J©žöT°Ņ:‘©EéWßD Kķ…–q¼jÉČϾē}ÆzĪÓ^śĢg\ōŠ֍Ny„—<÷9^ŻcO†‚›įPŻæł·j2L0¤•Y\¼ž²?¼ąłĻæņŚ«ī\˜›g^\l6›#$±€wĶ髯»}ļ|ū oz+--ģšžØ¶ šŹŌüjYńŸü Båe…įŪ®VDĻ}Žó›AȼäHMDw®Łnw×āŅŸłģ™[ž~ėķW\uż•Wß(Ku/’ōćˆq ĒŹą²„ā½ųœ¶<̇kƾņŌ#KD¢÷‚Į†²ņ†Ģ/xĪ žń[‚ĄT=‡ ›­fČF@x$}W”‰Ž’Ž÷€PķVĖ®ve–9Ţޭ•Ń–®Ąp\ÉŻžGQļ«vyē’„”0€† iOz l_ŠŲCaA”6lˆcL"b‚’²†/Ń9oóŪ÷īŽķBIbW::T%Ļw„#HūćC?ųī7ośĖå’ÓeW_ł7£ō°O>kõO~śC0ˆ\5š!¤Hŗ1CkÖ*’ļ²4u&¼į•ÆŁµs§ę‚ÖĪ]{o½mG›š/}ĄÅ’bēž…’võų˟~ūūSO<—‰ ŪBk &øćļ×}óߔäĢ+Ż6mŚyBQIømļf+— I}»ŹNŽŚR©AG0 •MČ"+¤×ɗ¦2ĢYpwl%!ģtŽh'+挤›H Asź”ä(h©F³V†(•ļMżÕ£€8mæ ā ėō!ŗ^–qB(Õ4 !ć.bɾčüLéßt¾M£;f"6Z3k ’It”ö^ZļĶĢv‹šŲ%[#„Łž¬j)e"  ¶‰b炆»¾}x¼¾e)ß¶,Ź’)/‚Ó`h­“Y60Üy|’ұ]Iģ[_Āžėū~6ź—ŹBå3LÆ,'3O”.ŌQl‘Ź’%Ģö–:5“ŁŒL±Q¬L1q—@@^­ ; `ؐIhVk ©–#3ČŲĻßFZùW.=_ZlSMéŲMęŹI,#-°j PÅā>ŻžvņŽÄÉ“OēyžõyŗĖūŁžeßKĄu„-m̲EŚł4»J‰ČrŖ!dŅėj6łn„SļsoĆ]©ų |ń‹_,ŒL&ŒŹ$hķzŽķ«ĆõźŠ°Æ=ZöīŽ3·wßøļ ĢŽÕĖ®a“¹Żvx^…9ļ}ēŪO»’éJ+b’Gsģ­wļ\·å ÅtŁ•W¾ķ}ļ|ž‹^ųĶo}«>\# f–’Sk×½ź¼7īÜ×n(³" ˆR¹šCĻxÄčĢlz"EL3Rnܲå^'Ÿ¢;·­ Ųq×]KĒacöģŁc“¦xfDÉķžJW|õ*×IwgMŹÖٶClæ_ū›kƼŠ­Ąc°°°ÄxŻkßĮZ"†ąø AÄõJé·?ųÉ’üē§Ö׫CĆ4=3ūÉOFŁ>+€4 ’ ڶżćy!qS‡J`1ŠwīŚ]}Ķu±ó%Z Ū‘b|r‚ŚĶĒqģ Ž~Ė-Ń\uŚ)'—ķÅv`Ā}Kķ²ē&g²ŗ‘ŽL¶1H³mCA( »$\Š$^ąŠĮŪ2-3^2L®ē7ŚĮĻ~ ivX@c8fļ5ÓE;h[ežF«„ J°&hJ°"†łN–³Įf8`–”XŲ "‘ŌšO»×iŠA¹V©{„÷-ĢŻ³g·tĆ HANŒa ąŗĒžtŹ+_’¦·ąCæłżß÷Į^ž·kłū?|ļG?žœpĒw\©Pņ¼}{['rŖ3™8c“¾ķ’h,¤•KŲ436>1H&åĢ‚H2ŒĮŸųŌĒēšŲ»oĮńˆ…ŗōŅK“X˜’M3"ūk.K(źÅĖźO¼Iu'fŻzó­ŠŖRöŖų--ģs¤ųĀē?÷ӟüšā_žč¼—=w¢d^;2;T){Rµ=­޲Ī“eó¬ -ģ±#œ /üÖ³žśĢµ#µŁ‘Ń™‘įįŖÆ|8Ć„–#nŗ§1±ł  ō½+nŗžžÅ¹£=öĮ§œJ mOQ¶[­†1J3.¼šĀØH]Änn"ŗžŹ+ÖM Kׁ ’ņŽ]ūvķm}ösŸ‡L„|äÄŌģšuė :³CQ)r X)Ą0ė£;®^v‰ą Œ]uõÕæžŁ”ćܲ҂¢>ķ¤Ķ„æüÕdµā”†+m„M p‰Ģ"t+ ĒĘĘ‹‹0 cüRIk—®%9²® R’‘O`@­Mŗ²Ńb$éęīØĒ}_ ``;åŚVĘõ Õlje\G„N؜ö Z sķUżō'?Na»"±Ōj’”n¹413­ˆÖ$Eca±\ņJž÷Æ~åĘėÆk4QĀóįø^ ķ¶‚Q’@„rŁ8xq^N2öיmWį?_öW|Idø ܱwļYĢ…?üįń÷¹Ļb«9¶aĆśCŻtųŸ’Ę7^’¶wķ\ ēįŽł…JŁłŽ÷¾4lĪŹq›į„!\ ŅųÉ÷~0YÆSØ«Ś&8 $Z¾h „`ŒµżšŃ‘Žāv½k,³%£1N9X™Fµ&ĄMüƄ `É“`Ľė݉U1³¶é|Ļ“ķv<Ļ%¢D-Æ ńp'Į—D;ā:©3‚Žśö·¹„Åņ1¦Z¢jµµy‡Ėsw„ °`Óé6ęīŻ;*Ļq`Œņ<ŁXl¼ż­ļ€qĮŅq:TA«Łn ŁŁi„Cg<ā”ʄ¹Yžˆ°1TfÆRn/.ŗBѾ}ū†Ė®ļ`÷Ī&'§#ód }oii ?^¦4«\7£@žMg%šĘV(;ź}„™J)"6^Éu'“Žļk|;øŃ’5,jwĄd§wQĀ6Ö”ģŹŗ$]c²bɝgrYÉ pÜ «PÅ#­,Ż]ŸŌżŒé„sZŗ 2™śäߓ䫙sĪ1wźŪ;Žp*NЧglē÷©īŹŠ&”Œt‚‘sÕ/Ż7Šs¦(ßͲܗĪ$ŗŃĻgV{„“4·…Ø`ģÓOŸžkrūł+ē³ōĖÖEēQ¹XtÜb¾0ĒžYķI·3^ģb5¤ŹņMtó…ĒÉk’ĘĖ {…­^ķ]ó™šüĶ`¹Rj¤ZÄ„ ˜™×ōi>ń»O;±„[X8ĻBgMn÷e Uėód®,b ĄŻēh§Øéēæų…4Šn‡ üŪæ½ą­o~Sh¤j“jš,ŖÕśƒó˜‹mj«QO,µ[  &EM’ć8ös\·ŗ“֛ؓ?䄯}Žt˜%ĮäĆøCõQa…Ryäų-Æ{ƒ+]›ĪŽr„:ćÜs_53Y½÷)'ÖJ49ZŁ»g”ZußūŽ÷"©45q Ū“1‹ssOxĀŖ×ģ–œ[Zō„süqĒżēžē'’ó?…”I”¦åf/Üńē^˜^ņ:nz)ˆvxĢqĒZĒÕa0ąŗ.šH*å²p’¶‚ŽńĪ·>š‘ Y ßYlµCFurzhrŚ1ĘŃ Ó‰]?żYĻd­]#T€VCkƒ0Ō–zŠCm`,ģč4ūrœ“N:Iƒ%A3ŚķĄVˆł¾ÆµB@ Ć ‰źP„Ł ¼ŖØWŖö Š0`8q«ųČc&abIÅł»o»*Ī€~śóŸ»ē$‰zµV©×īŲ»ū-Æ{ ĢŽg—„4ņ] ¬Q)—$Œ¦ üé÷¾’śW½Ŗģˆ?^ņ»˜r„ öie`@†–e"å-… gѓŸöŌ“O9a±©ē—‚PKĒŪ³»!H4zĆśM–’`EIb÷Ep¤±,!Ėšė£SėĒf6‚ÜC?~ēœš<„”ė:ķv»äŠ];wƒ¤‰Iõ`!×oŽ<>RŪm­f£±“”ŌkĀźĒD}j ȓ¦C“Ųęf‹…ĀqĮ¶*+ҰĶh öōWėOūģEĶ#’Hų1ŒM× āÅF@ G²#ŃjĻļ›Ū Ó Ū #c“nµŽR4×Rs­PVźĘ+ßxūŽÅ¶žā—’ŪŠå€Šüń7—ķ%gXĪė9ĒwšKķRmč¶»·|č§?żŃo\ų­yšCÖ¬ßFNåęėnśó’\*5š‹A»ķ{²Õ^Ŗ»æ’ż%W’åĻQ(‰˜1“¾ēŽŪFj•–6~µ<13ņŽ÷½żŒĒ>pAD¤££d‹$¬ĒŖ”‰äżĄä8 tvļÜyĀ '8Ž Bذ]÷éĆļ{ŒB`Ą0Ž`{*}’{Ÿzć?n‡ĄÜŽ}¾ėłuézŽL­Va07·w÷īŻ'uŌ];vĄIŠaKPõ -FʈMØ``B%aūæŲ²s#¬„­‚C\…5Ų{Ą+“v+°ÅCÕŖ$†ްš”"ʽ CbżłĻ|zØ"§FĖkfĘ+•’Sv÷5÷5‡¦ĘK#õ©uknŁq÷Ž;ę‚٩ɳŸņŒZ„ AŠ“"ķ:røę=ė©O…­g¶ĮĘ8›™"¬’ )«®½FBĶĆ~Ķöv’Āēæ ElØZ®KĒ”Ń7lyŃĖ_Ż`SŖł5ÆV« WäU—_įåÄ›x·CŖ›ÆūŪHŻŪ×j³SڽØ÷5 ĒyÜcń/k&G9ü üü[æ¼ä†Ųećä†ćŹPft”y™ŲĄp‘ź‡ˆ§Ąr:lh5‰/õsømL*QCŒpNR¤iKFcW ĀP©PŪmkó]±$,ˆ`t0,n<łä“F[³Rš·Üō€`”Ż6nY¤¢ "%(ģHx”Zįī=óóPP©ÕŠFQŁuŸś¤'¾ķuÆŗłźæ}’ė__;1ń‹Ÿüøā{†łĪ· )ßż®7;咐҆Ÿ"syč’ N:ńų’ē“‚°eøZ+yÆzłKķø¾Å”D` æZCŠv„€C„”ēŅI'„Č2tƒ`‘&ˆ‰ÕŁįd¾¬lLŗ·YAL„ŠPqœ:¶cßł%CH’‰hX̶ö' †“Ż/DqÉn¼£u& mĖ¬ĀŠj†E„ŻņĻv–2:ŌQ Śt4łBbźĘŪÅk–ŠččJ „ˆ‹‚8õ_[rluŻ-G,śM‘S:;—ÆGķäĒbŻÅ¬±Mē įk÷ź¦Ö›ŒVś¬Ö—zÕRīOļbūé¦sØĮŠÕś”¦<>”ķ%†¼ <‹*ą‰©_L?Sš¬ÄmķZŹ|ŪlM‚öŗāńŒ”]}óMwó>Ųą4ųäR’-£ƒ•½Zŗb…ļ7f?=ÉTēƒ¶vŸV>ÄS(n'$ARA@Åj¼ŁxĪųų(€@&”zėŪŽž²—½$aYe¢,Ę«ŽĖL$œ}ģ£Ū·®ß­±Äņ ŪJ…¼sļž¦R„ŗĆŽŲG8čä/žßßA—A4YµI!Ś$–ŒŃKĒ”0Bˆ½‹s’äGAŠbÆ!Ł­•Ē×~ļ—æß±Ä{Bg‘qé×TF'Į1CHP¤?DÄŚ@ˆŚšš _žŅõ6Ģ7š† Š—żõ//:ēÅ|ąæŲX²m6“VŪJå"ØWȤWø¢Ó~ZČ$ži33³kŖÕ*!`ˆZJ-ć;øģ/ GŲģ/*»ź~õ“NVœš€£uC`Ē|čČŒ°Y@` -H :õ~§ķk„Źčj½$”Kb®mē½ä%Śq“ Ūt'a°XMu7Ą ­>o{ŪŪ¤FixŪG?¤Jb®Ż°xdß¾¹‹¾ņ5‡į™„žsT,ĶIilHæėMo9dÓÖķŪ‚d“bĀŲŚuO~äYõr] ±sļŽvci¼R¾šĖÜš×ĖfiŸY…öjR`v‰vØ.’ķž{öÓf'&żČG|ąĆ$Ā)÷¾Wā^ Ą fc§{mõ8< žflƒcGéÅ/z©šmnį¾… \óYČz½4771ƦėŌc&[Æ ’¶C‡Ötó77aKMÓ…j…f)4333`&bMŪŲĻ„æŗ˜ifņ¼¹Fėʛn‚ŒÖ²£üŒXzW|ļ»?³+%9 ĒŻµkosi)!XGĮ‹Uu¶+"Ėų¬ö¦+¾žHŹ‚„1e_Ā ģŹrŁ˜×ZµšKlBµøĖ4vū"˜)U}éKnR©tź©§žxź©qoO†ßžę…wļøŚ+¹šœ®-5ö=åigżāw|ņsĪ™^æ p¤$‚śń¾;6Z­UŖ®”•’,yĪŲP“Fš½ļMe]:Ą=wŽvē;ŪA³Z©9RīŽ;wėŽ}Ļzö󩌎éćĀHĒ‹¹™ČØHŸ©ć)‰ń©™żģēÕį”ź×hµ…#Æ¹ęŖ·ž{®q…dDO'¾ćŗFYƒ³ezÄ©”v..|š!OzŅŁ;‡ĘG„DhŒėŠæ]sķ§’óg¹÷“ću‚ 0†… !¬qLĄfeĀ )Œ1äi £ėŗ‰¬.L ­=ѦĂŻä:īŸ÷ū >÷9bÓj6Ė%§Rņ¼’»s.¬ŽOüäāKžrŻ {ڳĒ×­į<ńIg-6š›ÖĻ–Ė„f³Q¾{Ÿr¹lžų‡ßYéƂĒL3&…®„Vó‹sŒį ‚#|ėėß "‡Č‘p<éKį‚…b0hӖ-{&1ߊ—žé`ø¾1ŠÕX©G?ź‘K·ķŲ]q%±*ż¬ē?碟’üĖżąõo}×ćŸōōūœžrKDž"6b™­Qč¦)jifiŽÕŽ8՚;łĆŌ‹„”҆É-‹ J Ś‹Ø¤^Ś2K¹[Ų6ėrY`(bÅ·ƒ0’“dxå²ė¢RńŃjó®]»ü£‹hņe»ŠBDƊnļ§æųõ޹†1Ž€Ø–|*Aģpų‰~ą9żéOzҐėųĢ.DÅ÷=鍏O¼ō5ēqšĢR)hMIU gӖMó­{a;`łŻ{’qÕ5V%.ŁüŽēžīā_³}Ļk*„5kĶ•ź˜‰d’GB’;E×ōŁFeIšPHIW$.l6tHX&)šn,$Š^O¹Żņ¢Č ē"ØI9p!:ģ‘„Ā`ńc&į›Žøˆ dؗ<Ղ–GJiā^ä˜ic”fmŅ,hBAūĢ<øćŠŽ ŅcĢÓ- ÄÅiÓš*u²}wóSiC1  t>?œžAJ©”JnĆ&½2K.żX6-œ”†F}CzĆg/ƒšć]™tōĮŖd·©č+’Źtt&Ć)fVž™Ń›ŽnA¢^%ī}²£}†1³“ŠīžĀcņśkkÖ~'Uå鳯OéĢZķUŹŽ³#fm’×ō—1F©@©ąć’ńļ¶>K$ k×°Ńö½ö ŽO’U϶ƒ~š ŌėR¬+»k„ą#āM½łĶo2F±j³ ŁhÖĢĢahÆĻ¬ųå/x‘x@TwÜ:Q8łč#Ł„†Yi6̬ ›UƒÕŅ5—żīō“zŁóŸŽŲ»#ŗ,³‰æ•é<©ÖŃS¼īµē&ĻŲįó2A›f¶ßœ4ưĮ0“N²÷žŹæ85JŠYŪ;3Ę“ŪmÖźmēæÉ<:QČŲš•aŻ6bĶ̦­æų™’*“¹füąŖ³^`s­<ęHÕj² YkVŠ5³a­C­CęąšĶǁ#×L­Æx›‡*kĒŖŖ¹ 9ŠlŅ7fGÉ0³įūŻ÷>ą% ($ИŸcmŲpØUؕCØf\¬+Ė5ÕҘ¼oéŽėobĆFi‹®sČF±fÖ·żķšµµa{YÄ:…żśó^)`“/7U½Ķ#å!‚”€0Q«{čöמsĪ›6MÕŖŗ÷½$ą÷>īDсcq Güā?SĢö;0Ś0ėP±fuW?½ę2Ś/vł°Ń'ux]`]U®ń°±źü;ØĘ۽ǰN¾µÖZuÖ$sxś©Ēŗvlėø³®†-žx’äūvéF[Sé{n½eŻPu¦ģ £ŖĄęS†Ģ”»˜ćÅf4+½mrh6{‚vÜv«}M“s“öŽ«żJĒšŒŅÖ„H|‹BŪ’^i†ŁčY+e˜łęž>U-oń¶Ōpä”wš0vņ”ėŲ6.ļ{Țŗę°:vmżŲµõ£ÖÖ¶Œ¹3|šķÆcn°iĒ\A}ī‹Ī9|zźÄõ³GOWļµeźÄ-kkĄūßōzŚĢÖatĆAų¶s_[ŽX;qĢšŚ±Ó•{mœzą”›­9G–ž›rÄÓóUŌ)>+żč=`}Ķ=|zč˜u£›ėbż°÷ōĒ>’MŖa6¬•Šˆē\éöRC-)b“egÖ0k¶+äæ>żqØŪ¦‡7ŽU*ĄėĪyĢv$•~ń“Ÿ¼Iŗ‡ŌŹGL³~j}ͽą6Ü0ÜxŹάf+ž0ģˆażä+ĶZEÖ+ZńjOŒaÖ&hµ9ŒvHē_Ŧ­Ł° V¶ęŠ5ÅÉ냄¶}½ikŒ}}ōJ„9Tö³th¶źl Yńtµ:L.m­āIļŠŁņ›^õolšŪ†õ-·ŻĢ¬/ūĆo9hŻėˆC‡I‰­c•© ¶L•ÖUpčŌČ!ėgYÉRī¬FNm {FØš–o°’“£D£D0V/?õ‰åų ÓlŅg3?č^§¬Ł49Zž÷¬§±Öl4«0Śk¬5«Åņ g˜0å8S‚Ö•üIŽżĘsY/n·¹°QvĘķz0šdOõü«īĢ…QŃBRī2hšM[«@G ĄtIœ KŹuż)uä%©Nūo(_³Ė†ÄgY²»™C6įSwÖTµ<ė»cĄQ›6²Ņ¬µQkFw¢Mŗk‹ŻGńbd­ł Ÿ’LŲ8V>fŻčAĆāˆQļ°aēøé‘#§FŽ[;yäŌŠń3£ĒNVŽŸ®1ź<"‡€‡Ž’ŽlĀä~ģĆ)ĶJsj„™M8YÆś@ŲXs×W䤃³pŗµH*“½óšSN˜r°e¤¶ihHUß ęYåĪÓĘ̹o'"挽¶¢ßÉĘt ‘1l”xō›ĪęĪ'󢢝Ū=æŁ©l6Ūa؍aÖńĪßŽ¹¬īŗrę7ѧčģ·½č®{H_”÷S+eŅæImö©uö©;P“śm.ė±Ų”Mē‡~Ē__o!6°]߆Ćv˜'m-d·AŽNŅŻå¼—ō+ķWęPN~æģqŸöÓÆOTrŅžęzÉäŚ5¬”Ify·¹Ļ Žį{»oĻ žąƒųŠé‹k­Ūķvį8÷yŠ®•ŠżšüÓõš‹ü}ā»ĢčõēžŃyAzū<Ŗ M&?>™ūļµ$l_˜Õ¹Æé+G<‡Dc-ß0 ķŒ†ah”¾ßi÷µĮ\ŪO˜ęŲptļūC†Ńē銜»÷½ļ}ź¾ļ Րp|üżŚ+’ōūßÖå“'ŗRÖY —‘™™„čP\Ą^łŖ—2‡R—Ņƒ™²„v²uQ9Pa"tĘĢĶęRW¬1FT§zŹüžŻĢ: Zɞļ’é’Ø›‡°mTnqÖŌäkĪyėvģʅlōSĻzä˜Ä°®ā­­ÖJĄu¹ŒMČ&ˆ‘Ug÷hk˜B>ķ˜C֏”† ĆD`$!ždŸņ~£āžXŖBcĒ ĻĢ|äA[G›źŽĘ2?įą§œõMSµ7¾ōyć.֎śkG*e`¼ģOÖ]ą!¼›¶į0Švžę_“ŲRuO]?{ōųš)ėf¶WŸó„GrsuŲ1ZšæņńŽ™;d|¤4īŁ&+„Ś­†l«9;vÜŚńu.ÖÕ½_~ļŪ¬ƒ8drŽ>s æ’oūZÖ“uģ­u=™™yqiŸf†½éŠ˜­Č:0\ž«ßp ?óžzōQ>pÄÄŲ¶Ze㐿vČ;įŲC˜ęMpåe—ś@ !T€Łjµüä¢ļ°Ń¬ŗ\ščŽoϰUs©a­©iėčߐ90Ŗ&¾¦²Įm¦ČY5CŻRŖŖfȁŃ-„[J‡Üj„¬MāüéPéP”6Ń 0+ż°{ßkópuJ`K¶ É CųČ;^żēK~Ę&“@ØeżB£ß}ž›·ĻάŚ<1ō—_’ģYg?j¢FkīŚø“wĒ9Üķ?ĆJs;8ė!õʉ*€lš™²ūB³JĀgZk£CÖśég>zĢ‘k†«ąƒļyG‰¶#+ƀ€q3egŻPµL”]n·9lsŒč6óŖ7ZŒų£yé‚CŁ^ō2cŗPVē$2l”¶Ą/¹~ڽ°ž€õZŗŽ?.8¾ŅŠ::‚b£_ų¬§—€ißj‡m»§’ėS;fnµuĻ3æ’Żļ(S>6–°½&®Šcg‡šŖ³nüČŁ‘Ćg*Ū‡åѓŽq3å#¦½mcĪŗ±Ņī;o2ܶū0Pm­‰b¾ŃĆæęjØė«ž“KCĄāķ·³įęR«³®B3[¢µ9!0å8‚pēķw°ęƾłĪ끮u“ “ųkn7 ·ƒœĮ ś]'aݵčÓą0†ˆ]`Ų~7-{Ač FÖnp]ƒSh¹ó,i‚©,×= ;gĮś1—Ä:w5{źŽ8¤ō‚ÄY(žą[VŪJ‡¦'HNæ%¾‚Ure£tįõūCād3Z0Pw×­ēKrĶf³W(<3ć9Ģl2`uĄGšęÓöm@ū·ĖąB|˜1’żg÷ų¦–Ü`³6\Ogaø”OŲhš R²ƒ:›±÷ eÖF²€ į·R*‚ TļJ² śĢ—Ż2½–żY$™ńLåX0"śß_żŠĮ‚ƒBĆ|ĄĮ‚c„²•ŌŁZī„1†Ų!vā—æśÅžÖ|‹ƒü軟ūĢg¾óÕo„ Ž“żˆ£O>EĄÖц’B‚cŲl br‡ Ց‡jɵRł®Ūn’{? µ\V·ÉhI†X‘ ɄÄJ@Ć1Ģjå6šW:‰63—J ęRqGTóQgYIr÷ébé¤U¤ZÄ@ȳ&Ņns­l#Öl ų+’sAµźTKąU׿ä?²ezöą =Ļ„ReŻųńL½¦ķP+Æä·Œ"į<śžß± 2ʇō"ŃX°bĮ’ ā¶;ļ“R¬ė»ļŚĮ’8R>LŖæ’ŪžÓ„—VźUŽSśLMMU„ |’(x ”¤;36yć 7¼éMÆŻsēķŠ!Œ™»ūn©Ķ~ž _:k7lh7š˜ Ś!A^óźWāF» 2tņ}īó©’łr[a¾Ń«-…ķ=KĶ6Ģ¢Ö~­Ņj4ąI0PņŻłł…’A]ˆhĶ€˜ŁM×ĒkBŽė˜c_ņ܈øå2“a2L0¢˜ 3H ‡Ż0v”˜ł;?ü^µZ–2jTńį9B—=׊Œ°a‚ˆ5 ‰dW’&yć7zŠĻ-9ŅÓ”ńXŽyĖ`A¬ FvŻqóož÷ēScƓc5£ĆP·m19“¶ņZ†$“¶uč–Õ¦!Œ·o¾eµ˜ p„÷ņs^b¹#AHĪż)»GRD2F"’))śL„J¬/ĖŚ^ćęo­WĀvčxžŽĪ—/üī?īŽóÖģēŸšųcŽ<äw—üģī»næć¶[žč'?³…>ÄZBųŽw¾Sń½Éń‰fcŽwy|“:6<ņ™Ļ~~É©˜”.ŗšæĻyɋ+~eĆō×ø{ē—&gfŸń¼ējĒ­NԜ²·wļžńį”ŁńįMėÖÜtĶąHµüņĖž"°Å&ŠĘ@")&§§lū"+ųg+ ­i×HńµÆ|õ5Æ~łuW\˜TÉkō†ŗZ©*µ422¢ZFž­ŽOŌN»ß}Ž;būK^õņ+/æb¦ZŪ}Ļž„ÅF£4ZĮ׿ü ¤įhr8öøV£Y+;R¢^q\שWĖ/{éKķDgŚ™ęWŗ"š.)˜”Į ‡„ėĆF3HGA \k­•ŃŖļ°U‘BHįJVĘw€ׅķ'ÅĮMm‚Ö½Ž=ęææÄT.‹śHŻ+{õ‰ń—œ÷ęćN¹Æ É$ĆĘ<õ±y’»Ž­ hMNÆ=ę^§½ņ¼7ķ]d6ʑR0n½ł–ˆ‹›+ØK·ĘŃAšóŸžĢ†\‚øīūƞ÷®w¼ZŪb!†Ö˜!H8`„ĮŖ=1\śķÅæ™Ø£¼ W€ŲĒØńZeQ”„“ ŚĆ¾Ü¾u L¶IUX6äj’ b֞QbŠ>ŠżŲ³IAWĀ×M=W#Q~ư҆mx®{ÆĘ6¶!dŗ®¬gWOf¤˜Ē\a~×{ß;35©Œ‚J•ņKĪy±åĒ !b™kDZė•`\':ęÉ0¾ōŁ/ ę×Ė„š_®¶SŖ”KCµtH:`ŗŽBhØ\Säžpź}æšå’™˜&8Ę6ʕŽˆjūķ§wóĮ‡nŽ“N6(ā¹āÜsĻ»éŖ+K%?źŗgĢ{Ī};dCm„ ą—KʵŗÕG-¶Iż "°AŪJ±“6žļš»?™©tķč u›Éīt/]ŲA:%¾±}‹ėŗIqY^nmŁ¢é|«”e%ĮōßśkAEŸ’h}÷(~\–pž¦µ¾2ŅTŽPwĒ«QӔ;nŅ&NбI'Ģ“HeĀüM2ńq:6śUœ.AzųCžś—?ŪT©1Ę&Äī¼éļ3uĆhimE¬Xļŗ›FFŖĄ};ģ5’śÆ9’üq¢£&¦§*0V«Ł,®½ąčČP«¹diՖ^Ģ:T‹óÆ8ē…0ėb’0ķaĖäšų°ēcĄAĆ£cŽō-eĄĮl¹<™®ėžĘ7¾‘›q›‘“y\-aXĘćiƒó‡‹kjņŠ©įõ¶Öœ5wŹ÷=öpÖķ€[ѽ¶["d¦ŁT_üģ§JĄL…¦¬/‹u¾3¼ū¼×rоįŠĖõƒļóō³§Ć'j‡LT7”]ĀĪz$ėKŠŹ„&ŽAv<ķZ’~ 49ä•ĆĻ'b­–„„-‚-`.)ī™ŠQįh5šĄf¶į“¶oŁPõ7Ö¼)‰­c„g<ꁆƒNōŃ ó{¢·bĆ<抌/}ŠsŸü„ƦGļµnģÄéś”S„ū½é É«FL=aÖü­/]°Ę—J8~żČQ3Ճ†<šŸż ›Ö_ū’ƒ¦+Ē®ŁRĮ–²³u¤²®^9dķ䇮ń66!k֋Ķ2hC©²½^ŪRv6łb¶āó{™Ćv³•mFyÖKsūxßÓmrrfhų®»o·É|ū\a[…”]$m6­§œõŠMuÖÅĮõŅIėg¶U½ž˜¦­ń܉mƕ į—æų1³V1+@1³ _ųäĒIŒ{X[ƕ€2šćo_Äq¢¦kšSŃh›$LMa[%ɖdBmŠ8=›a[™äć5s`L›9HJ˜ƒ8×d3¢”bĆĘ(­CÖėš5ÓėkīŪGƒĒÅę!|šżof°Ql8Nj³0wÜÖu‡ĢŽ­­¹5`ķč0kŻl6‰h] ‡OMxr²ZYŲ»/u X‚rz‡ĢįÆs1Ł‘ń8„Łjå~ĒcW`§Œ%ĪŲŸöÖVäÖQˈwüa›Ł„ÖPY‚¹afŖł}3žŲT“k}ĢzĘĆSteͬnGć„—‰»÷‰…w&04YZlŚžē£ų©Ņ”äHČĻŃ„ri®|%TÆ+ghĆĢŃŁY¼°õ€SO)%ĄŖ’ęvßĆFw>…·Ūq4ĶÆž×§_7yšXõŲ™ńcgF«:5|ŲŚ© ”.ivtČNu浯·ŻbŁéI©BŹčpRŖcģŁ{Ō0!0!°¶\®žå/,!æµøōŃ·¾uĀEŻšč’œ-—£čƒ-ˆ³ÄK•ain7{b,Ī/uøÄ]E &o!ó¹µ®l¤)Hįvåx3$g޲ÆJ™Č-J³©MWŚ9sĶhsØī\q&)mz&3¹īŽtŁÜ‘JgčŁ=›^ߙ|oŠŹ”ĢZWAAL¢Ń”ź¼2NįFåWŻ÷`LߤeŸŠ&KŸ6+ćīö9¦ ßŅ+‹›y„Žæ’ü^ŸTdĪīšt„LFRiʃÖY›Ó+əgk÷' /›[ĪĢN‡ę–ĖōĪÜjŸŃī5ģĖ8Z=>½O¢¾Wŗ;įŲ-ń§O¢µ’š-`õ®.ߓ֣‰Y›†Kk‡¼ŻēD6sĄ½Šūʆ& &—ē?ī˜×æī¼4a>uä·ŽóÖ7lœó€*œ*h’ä¬ė¬+»“#„!`Ś„I‰2P!įĒŅ7Wń…¬ƒŻwŽ|ŽĖ_“v|Ō6MłĄōėe`ĶhĶŗ>ą6—>āćŠM³o|ùYžVźśéÉRŹ4­^+­÷Š„ŲLC\Ó~Į³Ī^[óg<1 ŒLTŹЃś’ŖēŒ:еśÖ׿²uķģl‰¦ėJtųōČęńJÉv÷\‚ŒkK•ŁŠœņ1>ģ“Zūz™ćōįōēK’D€Õč¶Är4šIšČøŠā.eš•–r£K„é4ģ<āŽ÷>ęØxÄ4³V*M&žÕEAē‡Ÿ~ß­£õfź§®;~ĶŌqė×=ņ§qŲ“·ē®GmŻ^_3¾µŽÓ[wā–ńC'+Æ|į3˜†Ć@5tұ[†«ė+ޔĬ‡ Udžœ>ü¾w›Å…®ørŅ+O[o#Ń!•ŹŚ‰ŚO~xaā „źT{iqxd $-MĄNĮg?ż_'5ŚMŚč0ĘKĶƒ×Kl®‹‰qą°É±I`Ę„5Uo²$|ąČƒ¶tjYSVń Æ~i õœ 0äČ20äøK»ī±åŹaęL¶²±ćŻvW&äIčv3Za2Å'Ø,]y˜P¬cvĄFk*Ä+Sæō¹Ļ©›‡üC'+[‡-#Īż?øµ÷®*}t#˜.Õ7ֆ6Ö«ĻŽĻÖ¼æ\ņKV«ą%Ļū× 6UŻ4쯩<ä>§°myLĀ`Maϐ9üŽ7¾ŗufŖFØ*@]Š-ėÖŬx~—źŌļčCÖĢn®:3zÄŚ‰G?ü6–‘?‘) 1āa„0éażPõ~ĒĆ­u賨¬ØeŁhy_Ŗó›^Ž~w!bē;_7ރŚ“BÖQU@dc˜[ķŠ^É<¶Śaf ‰”%?ׁ5µņ°Geą’_żœ•Jļżn»² ÉvW|Ų¶mCĄ–įņ治ބ ௿śŁŻ·ÜdX’č'?|÷ŪĪ?ļ•/µ”elM› 5ż‰:`Ś`ā|ųS%wķ7ķaO[‡‡Ę€õåź¦‰‰ PÖWœu.6ų4ćcĢ”M³ćlBĆA/w°CP×ĢŹ¼ē]ļžŅ¾Ø›MV*ņÆć§CÕŖSÜõŒ1WJåŁ¼ŃnÕY‚tIµĮ.-4Š«s‹˜ÉŪ®-ą“'BƼÖ§ßōł›Tö„Ę*е›A·s“'Č?Ó/ć’ ½āŹIӏ’œß§Åź$ŃCÅ&ŌäŸe@bs2VĀž<óyy ƒA܀Žw›Ōh°é ģ"\vÉƜU£ōfŲ.[äœAO&qaœ±Šyė•„‹vīb÷™‹ÄVŽYÅR°0>’ŽĮo Ļ+{Bāv;ŅŖi·Ūl” ŪvR›y6ƒv3ö!Ōź>x5鹁‹%e®V­;næł›_»ą-oz-ėŪōsBČóąŸ’ÄŠ/·|•1ŠM09R÷€éZiÜ̏ Ug ֕ü5%gB`¶āŚ ūW¾ō96mėBF~6‚ģUø$fÖÉč$čµn7[Å%ūūĒ>ę‘¶Ģ»&PjĄŚ²?l*yĄ±³ÓÓ aĻ÷b(KĄ¦k­K‘Ų’(1£C[yמ߳Ä3ź 8€ŒŪ@WgŻĢšDÕ¹åŚæ¼į•’ö„³ĪXŚ·{׎»8TĢZ« ÷ŁĘ+/Å«D™0ÓINé’ßžJ”5qÓåA, m8Źź’臠Z;ä­«:“ė+r󨳶Šuew]ŁŻTsǁ šąūÜė _ü ó2ęŽīł¹½v^ŹR–„p œvź½zÕu¬Čœew–ęĀć¼OŽ#栏ÕĖĒj[‡½5FĖ~óė”ēUŽ¦Żžī«)fż¬'?fĖDõšQqPŪk“AāÉø÷M—žöē¾āåĻ~ŚkĒ˜=nzčŠ!÷ŲŁįCGŖ[Ē*‡­ŸfÕ ÖEžėŸ/qk‡¼ ‰)£Ą8a QūyØk„ÜT*­ńpäģČQÓĆ[«ž—’ć£/~ę3Ū{÷±Ņ·_ń×ē=ī18įŲõCUńKv »Sc£Ń²Iå"ŅV¾Ł˜’č{޾¶ī<^Ū¼yزnøü–s_ĶpØ@’ģ'?ßX—G­›ń±q¬VŲęŸs ZGLŸĻücėåõ& Zėć„C·²jGA^cß² ŪZ)fĶJ« >;¹u¬:œõˆŻNÜ;Öq`C‡o>’3e1B˜­Čq‡Ę$¾ųŃOrĀZė”ä §XÖ.™š=½j{Õü§6¾…^Ķ„†õéUŠ©ģåXÅ ±oĒŠ®Ćš2+;‹1ė×OŗĄŚ²? Üļ˜#9 ssŠó­$«ĒØ9õ|šĶĪ;·lŖ¬óƒFŖćĄ­×\É*ˆģƒ>nw‰¦Ŗ|§Sk3żė_žÄj.JĄ„'G€mµŹ`½K›KĪćĆŪdž·ŽÖė@ųÉ÷/⌒SĢ s;dĶ9ó,ÖLLüõ¼óę›9Öį‹Ł¦0¦™ćĢSijœ“ŃJ é„3ZŃ[§õ½ŚĶ l«‚¢Ü®Ü²ÉF^t?—“pÅÓLŗCf½Ī‘ōWĢ3ƒ,ŲīĶ׋v_J.gŒkÆÜF2Łąlq|*É ēŸ7S Ž ‰Wś ēĢHęƒ…ųææTŸ)ėēw“W ±2ė!».L  čSĢ+3ŪOÄŲļ•iį:­a($œ_’łMšķ•bŻ•R„ų¢ŚčŠRˆSi7Ż Śń’óÆKĢ9'EŪĆ1½Ķ ™3-7UhōÜ*żäŚ NRĶF?öĢ3¬S;]+Հɒńõݚ€żįææšYV*ķdw‘ÄVh:ūķĀl”«ó×H’SėC6¬›ōhżPyTŹ*0Œ 9 Ģśn؈H¦k¢V9õŲ£ÆæźŠĘÜ«wĘź)¬™UČFkÓ6ć\ht»µ“9øķÖcšRjDšƒT¤FH÷]ŁŅMGĶ;pxŻå—m#lŸž­y>05Vޤ–ļ脔ö {4åcƈ»iș l¬¹ėŖrØkėõŗ€ųD[·lZZZ( ³w?µƒk•h†O×+š„ˆ>ЦėćöŪÜU框óš‡V uoBbˆšČÜßnĄČ»³„s˟‰5ĢC»āśˆw½ńõSey¦Ém#īA“„Ł2f]lŖ¹³>6Öå–QŚ<‚#'KŪjāˆé±* &ŗˆVŃā YµŻ4»¦,\ ^r™ŸqäD ˜fY÷PŲä`“ƒUg¦źŚz±—Ÿó$2.™« Æ Į©ŻŅ:ĢDŗ”” ³Ö/zöÓźĄöÉŃq˜DØ[&‡ėŽ?tū®;oee@4 6įĢČPØ$ąо{v'tzg„Ż,;NeSFåŚ4TśÆy9ÖÉóč Ņ6bĆJ™Żwļō€qŪ'G7 —ŽŻ4;[‘»o»>¾hØ[Ko>ļ5%`\:ĆĄ¦±1˜åH:dÖ¬õ3Ī|ŲŗŗwšģčØÄa›×~ļSĀę"›ČhēÕMžćCņéagͶNyk‡š¢§?U,!ĘŚŲ‹k«.ʬõē>õńõo}Å;h¢>éąo~]²©cø„¢ Ո‡Iėkī0īŠńrI/-¤5™4¼aŲ‚,q²eoāGq¦Ė+5[Q#䝷ßõŽ·æūYO:ūĻx¦¼ó o¬€ŻøÉ$pģŃǼü•ư±Ž•&d>ōį÷ ‰i)ŸžšņŪƽְÖ]•<±lQ³Ņ­²•ŠŠ€Ž|žėĖĄ”ƒõU’Šéń:𳋾É:LŲ~BŠųš'xĒćk55›€Mó=ļ<ß&ėÕQß«cĄęZu£ėmpÜa`Śń,®ĻzŅŁĢ‘@Z‡Ö«sšOV[Xóāž}6žŪŃŖf§g.žÕÆ3!†Bv@—`g’Ō3M=ķŹėfu«ŃΈrŠļuA7£‹k™Ć:֓/Ģ‚¦!qŚ\tLDĢcz|„U» bv©ņc²Ų&62ŲO)Õjµa“ēÜ wržynv~{öČw‘ĄS”‡•Bž©Ė$.Їķœ‘÷yļ² É‚LĢ`ź J`Iļ²GtW÷q…Łąå/UŌ gVtcū™I.ާ½Óū+Š@ļ5 …7Ó'^ErŲ0wvEóšę’'0xšiīóĘ8"«Ņ°jpĀĄ Ū¦¤Ū“±…ÆįH­ģŠˆģ%šŪ |᳟a£9T¬tG‘3Ė•<¬>J”2¦q…Õ§ÕšĆęĖ’ķ™SĆnEF÷ģĒźŠ03Rw_ą’_üŒUĄaȬC­ņē…ß[ē×0+ģ¼ó ‡ŲØł¹½ĢZřk®»6Ŗ4Ó]L³ ˽P²„«m»Umµį€¹¶ę&ĒźnÜüiūÖMlĀĀ€Bę4J[“ē<ū™vˆŹĄˆÄ†ŗ·”Rž4å`¦źś€Ž8ü࠽ȺĶ~Ž„#ķš¾÷:Ł*®*{–†żžw¼=JŽty zu¬ūŽū¾Bv‚‡£¶7†ßüśó|`¦ģ c•€`i>"O²I÷Iē²:nE~éS’¾a““i[Ēå–Éśšŗ»®źĢHlØŠ“Ä!å-Crėp驉Ń`ŻČŲŽŪnē„ŻfÖ?žńEV„v˜0]öF€`cmhŌC r±n¼¶­īNć.f+r¦ģŒ›…heųŠŃŃ! $Q’ØKį5!}ąØC¶5«t“jVa˜ƒHj_±j?ų“SźĄTY;ó©F(÷?õ¤Å{ī¶™R.ØĀõ³—€JJ2cėÖ­įŠpźLÖ"»#T—Ói‡m“°”tĖd”l»tcg7“‰Jü¼ø‘3ó¾ó]˜ōh„°¦źŒ;xĻ^Ćķf4ZßzķÕM »afūxmSĶpQ#¼ź„/6JĒ©5c˜/łŃ÷kĄhI–éįš¼åÆcÕN3DŅ:ÉĻxŚÓ+kŖĪ†š8d¢|ČDłū_ū²żĢ¤$Ū:l”żIµ7 WŽY?½}bhmEր‹¾ń•ä\ˆŪ˜iĆ:Ԋ ß’^'Ō€5%orįOyģYŚt§ŠĀōåūõs›2Hx9Haƒ.JmŹīEöA³ŃGvčsŸś“«/łŻüc·n­UP…„ceR¬|“#"ł<ąœ>Ļ>ӊ ń?ū)«‹¾qth¤,k%7®pµ7i‹#¬XH¾C+üā§?šQÓ%¹mrdTąšõėwī²eēSĻ0·õĶ×ß“ē®{öÜuORź’“×ŠRāQ(`nķ[ŚC‘Ō mń„\Ź PF}Ͼѷ Š:QčŖėęPzāIV¾Å°HĄŅ*³œūņWvB=Ąp:]܅ĮŠOŃxę*o;śä©=[@iÖĖŲšēe®ó«7]œB}ł&LƒÄiŠJ¦¤Yō§æōߞ’±’ˆĶ“h¦] 0ŌaoīŪ÷ru«0$żš”3qȦ ÷Ü~kn;,ŲųtT˜ű8[¶c;ø„Z…ŖÉ&Ź ß}×퉣œo"’ŽŻ –ėWøŅĪå}££]³ žō«Ÿžūāē~āŃ­Ż; ·”i÷!Æēń03³YųŠ[_;QAŲÖv²±›„½ŌčÜlČŪfÖÜyż >pĖß’nĖžņ»²ĄöIm[ĒŖ³%Ś0D†hė°³”‚i­Cõ!|ą>'Ÿ [K¶š ūlh¬Ō„ƒĘ³žŸßwüał–vīŠ1‡¦Jn°mÕו֏Tʀ)Aė]w£Wž…%Z_Æ×!Ź€ė•:Ū6la£MŠNü0­9­ēŃ©' šĢ­æžįā>ū©>05\®:X;1ōkÆ`’N陞šZė0h° Ų²µ&dŗ™\×Ä&eoJē#ėyHlū sXФti”‘Ķė¼*O’×ķ|ŻūÄ+ĄšŖ3l›ŖŸųĄ{X‡lxļīł¹wրq`ūxm}•6»³5ēź?’Ž–B+ĒGŲ° ź’6ĻNyq—8 üō‡?øõ–äĖ ”2ŸłŲGG֕ŻYƒ‡żĆ'j_żōGY/Ł&^g!²š9øĻŃ‡ĪśrūÄŠ¦ŗ?ęāu/q¬×Ž3*.Ūå?’9#žSØŹĄD©TŽųŚó"CŌ-i8ęM”č+„Äł¼e$ łīZµšS£C6iéÅ:%D >c)¬„”īwāIŖ3u8Q«”¾• \ułeŁÖŌb5݈“Ć€Mx‡•Łji„P6ŽŽĢTŹėĒFxŹ½ŽžÖ·±į æöõO|裇mŽę%ˆaÆ|Å_/Od#Óķv" ­ćXˆį?’ś‡€S·4ķŹ 0ģ`RŹ !FUĄw G?ź6=Šć;óØp©Łøįśæ D;1’a&!@Vdµāł¬MžŃIß%}1ƒV»£ÉT`“ćŅųøOu—”—)h’”QÉJS<b™e qĀsŽłŠūCÕŻ’[ķ]ķ”{›RŒæĪ·Õ8\‘“YŠN)Ć3ĻģPݓǑŗl¦W–É'·WķK҉“xAQ(Óūk?³‘i·­WŻAä®(88Z°…ļ²™ó<ØÉ„ ‰äė2 ó”7ź¶Vń¼ū4l+ż’ēć²Yüց@]7×Odæsń«ƒÄ˾¦?§Ch……Ė6¼^Ž%ȰÆ{PŻ¢…žr"āŗV‘ClT ŚI^‹Sś“Q‡ÉØļ ödbQÉPX­Z±īTŌ%õ¶ėÆŚsĒĶ÷>ž˜ó_sīÅ’ömo{Ē÷æ÷-6AcnM„‚Nx%uŪ*®=TÜՎ¢čsØ-Ό°4ėŠģŪ·;yõ®IéåµōizŽ’+`ZčGČ£`DL»E­u’}Ū½Y:ńi›Ŗ:’mo…„:5Ā֙1«%ĀÅæ¹$iššdY9ÕäŻ2Łb¼ŻISļŁ¹ć…Ļ}öKžķłæęoĶĘbšXžŃ–ß“—®,̘v+Ąkę ųī7æ9Z­Zy¹*0īąA'{ż_/g­ šŪK»wŻxłåĒoŪ~ŌĘ->pä!@wŻy·ūQߝrF¶ŽŒ9»īŁ-'CŲ­ ŠĒ3{ė×<ūiO“‰ØopĪ žūÓo_ų¹}hBbĖØ?åcŲąb­ĄĘÆNcĆ °yėĢ›ßųŖ¹=ws$›ōd6©5Ŗ¶ęžėÓk-ķ«•ūŽū¤Oāß?ō¾w³jŪ…—̾6™Dq4F<æ„t+ŗģ÷ź”Z|FG“Š?Īt(MœģDD7óo² †‘ ŪéäÉӞōų2°i¬¼¦&ž¾÷õ’fr|ōŻļŗß1GN¶ —\31]>pģ‡4–8„›špŻōD½äŗ€':;(ź‡lŗbOó;wŒłn]`HbMŻÆųY¶ŁÖuFOŻjæąiO™Ų<\=xrhMY”€`i.1\Ętg‰Ć _ņŪ_ł”&hbQCĮpnž[ķt('“ź„­bēÅWgĻ m:©…:[EšIFé°$rUzčC]`ūśu>°uv¦&lSėŅq›6L Ś\Æ­Ŗ–W$­5$A8›'Ör{>¾į†ėk.F\Ŗ3’U/}q’­«§*)2”T­Z_żņ|`vØ6ģ`˜viœ°iØ2+&X‚R…D…„į¾tō’¦Ū ±š3³ ?ōĪ·Œø8ꠍ2ž>—0;5jWך;næ5±ZŻGL‡›Mm “m˜GRtµ²yŻģ·žū8“”½mllœČśĶ5†+‡ 3311T pÄ”[˜[1±_3k§:[ķ0gʰ£[ńļ“NG‰3Ś½N·„ ˜ƒ{ę3ĘĖ„¤’'Ū×mé\€¹Õ 2Żt³„l&Ī5EÆ:WØ;E}Hœ¬«V£¶U„„5Ÿ÷²—L”ŻuCīśaoóx„Üō·+ŽŲ²µ ųĄ”ē·aㆪ?ćŅØƒńŠlĻßĆ&4ŗĶ±r¬…1lĀ=;wT}/A/‰ߣłØ‚•¬ŚC’6×·Œ ­-ū3žS>žŃ’²Ņ·ßpż‡Žõ›bßPõ'¦]ššÉxļ{ާW£+‡”•5޲vK‹ū>ü”÷9@˜ń¼ !FņЃKĄˆ/†€#å#fĒ7VÅŗ†„°OQ*®(;ä r€Ē<ź‘Q?ÕÖ u÷ΊÖnĄ&|ņĻt0Tö”ģ—lØåĒ?ž”Ééūuš|­r|:?ėĻL:ÓŚš@DāĄ†5kķA™¾ļٳ'-&”°<ęęć31—ŖUŁzZK‘hµ‚N„C7³ŚīĶBĘGWę3^f·ź0‚Xk(¬Ln:Wœ\gY ßNSĻDMgńF$Ž  •†Óe>=(KłÓ*‚b§Q§ÅŻ9‰-“é†aŅ„+™ÄuĘ_]uÖnY”•®<ō]ö£{~J÷3öѢϼr„PmĄ›\…K“w#WZm§5[}Ž\µCPĻÖx÷UtļM·Ż :léŗ8ęV̚‰ź%+ —,^h×n·ŪķvŽPr®@:ž ×ĮвęoE±äH0­H)ÉLŖŲENūJ_)Õn·„CŒŹlL$lwkŃŻ~žbÕ¶@.‰§tøŻŌ‰w+ˆv`^ O¹t©źø.Ķźlī+ {ŗĶUšNŻ­h9VétĄī’čE‹ŪÕ2wŖ[mŪįpnaOŖĮ†fÓfŅÕq‰“Į©r¬gģ”(³Żƒ‚’„•Cāl4·‡ātoCl©ĆŁOš­ !ꆀµ>6ÕäšJe”hœ0åK]öČ'Z}øć3©€õĀĮ']”„ØŗeI'tĀŅŅB¤-Ģ:WqJJs§ø=4ĪĶ-pČń뻈²šĶwÜöĮwæūŃ>ƃ°šH@pŹqĒ=ųAŚĶł½;™ƒwƒµbnķ0ĪDu­0S9ÉFµZ ­Ć h%”„haÕ[c˜ƒÅ„½Æ=ēĜm"zĄ ÷ę€wŽr§n)[ž_\‰g8l«NŽ·;9œ~eżFw®³äL£Xmקݳņ™–zć«_YźĄ¦aÓX¹ ŌłĄ„'Ē  MµśØ øĄ[ßr~Ā$…ŚV<ģ”N’Ć®ō‚ ^’Ś7¤Ż‚Ų~6žżųGlž,Æ£.֏”¬ąė^üāŸ~ó›,¾ōéOxĄ±ŪŸžõÄŗ²»yØbŪČŁL)s˜ØvėĶEkŽ› qĄž|č!`Ģ‘£RŒӂŖ„ šœĒ>ī~ė׿ųyd³MŌś( ‰MLV/6…‰āe q7Åõ‚}ŽŒ{—€a×+ELiD}ņ,÷>ź &aÕp’–=³Fš/łÉO†$<"ŒO ±Ó #K²;TJ÷=ķT)¹ėF«ĆĄš6T°”‚Łr9¢¬×ŹķŪŪ’}4EĒ`{]•ķwU2æżķÆlžØ ¾š‰=÷©Oü֗æøū–Ū:Ā]™ĢdÆ c“Uxē;’ųTņm‡×•·°hEk}ūķ·/--%Ić$æ}ם; xĪ:-FĀ ĪäŹL®…i€ķ?¬ū»¦>¾¾ ts©Õ1)z`½‰ō•UWmcøŻ‹!qȬ–iĀ”©]źƒŅ«]žŗ6‘‚ZjK¶Ķ^[µ ž•J ÅnaŸ¦ĶfٌĪJ3fV],m"śd˜ÄQé\å õSQhÆ„ōŹ.śŽ¶ø RzEx8 …ņŗÜš-<Ū9ײ۬®sMį#pN5µBŠ_,AWˆwziń¬ˆƒ=`X§—NŪ~F7‡#cLBćaę„§ūĖ:©éÆ^Æ,|ć€/^ŗ½ēäĪ3’ĶéŠHĒ’Ą`“B0?Ē̦ĢgõØäĖE‚Å’’ŠZ !2wžŒÕž—½TęCQō,É­¦ļ$Žō^ŁnoĒqśOwÆß 2/żÆ™ÜÕ²—źu’ö…ļķæ8“-öĻŪ,«™&ĪķPז`fźü'~čŒ§µ-D”üŠóSr{ķóŸūō¾÷żo]x‘ ø¾ ­XJ4“df 6€"4Ą‘GyŁe—‘6†ģ²gžōßõӟžōŖė®?ü°£ųą=ļE/a!ˆ<ĆŃö4™-’L“Ż>Aø®Ūóę ƒdJ®ćxŽ—’åƒüąyēwČį‡ƒÓC&ÖĀ‘ż-F4ŖĢ1œķgE‹~o@›Ūn½ućÖmĢģ€L ’åŠ+:蠒_³MXŁEGœ}›&pGˆxz8räVŁ/ÅC &&ĒĶBŚ;†2FJAĄāĀR­^ „€öŹ—.ˆ11<, 7Ū-„õj¹ŃhŒ©™±f»}ŲQG|įK̬Yé€Eׁ‰l,3ˆN8žųĖžņ×ä˜""„TĘś)„§õ¶7¾ńļüšHĶS@Jė Ƽcļ¹Ō X8%Hš¤§JjßRh€ƒ¶mŗśļ; .Ūžū ÖBH!<‡±)C‘:T܎÷ѽļuļßżö’Ė.½lt|dfƱ4??·w~͆u”b×%A ĮŲóŠĮĘ)eÖ>Ū<uĪЌd®±'B¼^ ƒų{ßüśc’¤Ń‘ŒĆp© ½kÖNŸzź©Guųgœ”ĮKKK7Žx㳟õĀõ×¾ął/zÕ¹ē‚9šĪäįĆŠqœŒ•ė¶xŹŽÕN?ż×æž-€g<ć音ÜēX$O‘Üe“aĪyŽó?ł™’ڰf²R)ķ¾{g»ŻnPåjIkŻl…  Tņ~łææ>餓’3Ę«Fƒ4ž/™-ÉŚˆŒÖ“““{÷ķµ Öīļd¹žėæ>ūSŸž4˜A29»›™¾¦1&žQŚĒļD€`ĆBÄ/c‘ŃŃSŲeĆ$:{Ÿ‘ķaFŹFäFƘč®Ņ¢®Źļ”¬É2ÜõöügÅGj|O©'Š­Vō ­tD牔ÖRJ"hmHH Ąta¼_¬q‰M¢×§§ĢŽQ×¹_č¼eF ļl¤GCk0’72ĒĻi:?wØ÷„Ųƒä8Ļż†–qZ¢%7˜_š]üńI:øcķ—üóŲ‹Š+t92Ž]Ęļ-ö'#qAä_–}"ŽßPä9÷rW02½]ńBÆŲ¦}ßļćˆFóŽģž]ölj©Q°ŽyĢ®ó `ŪC‘rE æš—ś?å±ī?²žÓ÷’)\%$–Ņī8­•”2YĽÜōŒ‹ßjö2…}~¹ŠšĮ ų¹’ÕŅw’<ׁ‚āƒlž^Ö3 ‰cĖÕZ–·Mz¹¦”ģź ņ~Ę ś/›6$Nœ§ō! 'ĒrģĢČāŠŠ„5 f¦Ęöķ™' ,ąūŽ”r©Š`eąø²j.øą‹zĢY¾ļ3„Ź#H_wå•”ę#Ž9l«CĀ)·DvеÖÖb,e£į0÷ģŚ511"6 a+z—„Īń ŽÜŹŃĢ,H¼äE/śŲ~ĀŪ/×q›AĄĘ!,“³‡ qö\QŚH)ˆ ”q¤HCā P®tHt|Ē ģŃkŒ‘RXßŃN‡q=a43‘8’†])x ’ļ“Ū”/jT\Ł uµī+„&¦¦®śĒ –Ģ 8éaWZk×u£³ėyJE¦lķŚµ·Żv[:ų-HmvŻvóįGT’nc”ķ¹<Ļk¶ŚAæZ i6Ē!f. Wöķk Ō®¾śŗ±©I°“vz2f™Cbū ×½ęÜļ|ēŪ7^wƒ²²U€ ł•f»91=s÷ī{öš>ć˜#<묳Ī<ó̰|ö³Ÿ-ÕŖļx’ūßšźW?žń?ś”“£ŁHĒ1`²ƒ8e ©$Žž½‰}Kƽśź#<†GĄuń”’ē9ēœóĢg=ż?>łI‹? E i5[•ŹŠm·Ż²vŻ:cw(—Ż,ąŠī‹žš‡„Rég?ūŁ[Žņ×ó,hĶs'V÷ĄÓļ{ę™g¾ņÆNņ®*^§š!tČö«®¾ZkĪܘ10Ę8Žųgø")ąNī‡?ųĮ8#—ZĄ¶m[ń‹_¬]»DÉ~ķ„:V×¾™zœADė«Ä’£<5`“eāe.{žyī˜ cl„“;(% Y“ŸÓæ¤lÄ?ķ/%  uœ»0Oā؈d² @rā™ÅK…£j­G2w ±IŻ,qź K<(!ŗB0¦ƒx£ėpōkN²[AkkŹ@Ō3¤-%=-{š¬•É:!ŃÅŗ¬¢ÉDR–]ißl?‘[ÆO,töz†˜ÓÓŻ±]Ė#±A?ł(e’@6ų˜‰Ög*{}Ćö>‡ÄÄÆīDŹāæ®8Eă dQų#ū”Ü+&³‚1É'źö?”Pģ’§³Äūcóæ?—dM§S¬IPM)@JiĶPz(‰ćų"`ŒBōZ…)čĢžéKyˆ>$Šō$äŅż9¼cmoÕŽŽ€ė”Ōjuū?°46M'Y§.slŲĢj/ ž‰,”ų’miÅYbŹ:¬ĢlóHÅó ŒĀA©TZ6?Ü+WlŒ [žqćOæ’m·ßéH„cõņÄčŲm·Żį•½ÅF‚f<éģ'|įĖ_Ng«¬ūŸ„=Ķ8Ÿ¶‚ńé›Āåaq': ļ'zYWī{ģz?ˆ±ž÷ÜÜ܆5ė—K&ŗCbšE~ė‘gž5@Z)’NĒÆN]d=?n4¾ėY[ŚńŲ @QN8I:YbG[JIq6X)EĀ ŚĘ󼄒qŃEßxÜY-™všʾ·Ōō”7nĢdZ¢›DĖó°>ģ/—žÉ° Rš<'• )C‹”" eĄ IųŲĒ>ņܾ ]q²­Ēn 4¤„Š bŽ’“ūžń’?V\' 0>6²gĻ>%W¶BŻźz(ƒˆK+4۟ÅÄųÄĪ{īŽóu¹1@*‡æHLdoŪ€ ō£=čĮ”® xé] ōDi*† (KŒ^\røäg­kÄL XŠ {-:)`Hāy’śÆĶfóżļūąu×]·iĖf"Zæic Jås•”Ē3«6Ń}Œv2&I¼`~~ŽóĻóŠĘ'NJ)ĒqņŽfW 27bŪąīMQ8Ɋ².ŻyWęhļ[ØKĢ=óÉŸrø`ßõŠ5sź¶3@(’¹]/ž_z)éTJ¼ĄķP bļ"ZA]3.:8I'Ć‘ŁõÉ£d}{eØśćҾ܊T›r1Sź:D(žZ©Vø Vźŗd+†ÄŒ‚äp ‰AŘå—vķ2pĖī>"ŠY`X‰nH|`s3+õĄ—5k]ļ5©½ hE—ź•z,ø«.‹Ä…A½ĮsTży łā“Gwž81é51ą%ö ,k Vŗ3+lŒiµZ®ėę!qvĖ1÷™’ĀĢóą3‘aeŲ=¶,ŖĒ"N¾å2®L/śtĘīgvȁÖdp…R]±ü|ų|?Ćo}Ž“ŖĮödBzĢß|Æ(Ņą„„ęBéÄą#ē8ķ.s֓eŠ–“…Äūa(Lņļ¶Ķ›n¹åpēōzń‹_¼nćĘN8į°£ŽŠA„󱌤»”%b£g£ųż+ :0µ×IÜćMģ‹$铎 ±7A½­]Ųʘf,{`Pµ!!4Œ Al6oŲpŪwRČ/ń‹O|ņ“k!„0‘ɘĄx® ŲcS.0q«tĒq, Ž(ˆ10NhÉR'ѝvVJJ""6ʳ°°ōŠs^śå .(IQ©ś‹‹Ķį!? Ćf›CÅ~ŁŻ²eĖÅæżM­V3€®ÜnWŁzÆĀh唨§õNaŠ×^łgœqĖM; VAIRMÖöģY°³¹K¼ś¼s7MM’Ū9ē ø ·øyÄŽ›šŲ³żļü€Ć ‚`Ōj•ĘbĆ#°Ąd`ģĮŠ`†åhHČ‚pĒŻwMNNFyTźKNĖc¼|bÓįqXī®ŠĖF‘ '“J턼ŗ÷‘1FvØ„.f:ޚż¤9¢«²Ū›Ń”’ŽŠJ,"y‘ %p4ŁŃÖÆŗ"lu§Ģ޽{GFFR¹(‹›øaB8i,ļ[«ŪŌ7”I]+$ĮxVD&ż°ÉneӁđ£_Mó8]ł“L†³§“ĆÅēeĮ•‹ 12 ¦®ØIӐ85˜ݳ‚Ұ3!c'åBĖBāL²!_ć°,”Ɛ–}##SVSĀFa,h5©ČĮ=óĮó҃{ŒnĻA q>ĶŪėN:Nf÷ŁĻŪÜoHœ~„A€ĘžŠƒ{†!č@š»åC«śÄ•fćV“ފ‰Ó+­™d·ēS"iĖøl¤”Ą#S±ŽOē³ÄĒŚ‰Z éüóąš/ŁTöõžŽź¢>0Æh)LIJ'VHʰ°ØšžūĒŅÜ|„ZeK„Ö qɓĄG'›$S.`ŠLص‘RtRL©B¾¬3j1˜°v^Z®õ<jnĻīj­ōŁĻ|ź=ļyĻ·ļ®Vœ„†pŌ1G^zŁe`Ūm鹄t£Œ`wx(zźd¬˜ X‘>ęS—ŃCi€ńļ|ĖG>šĮ];ē])e™ õš?æŲ©óĀÆüń~}8Ćl ¤ģŌqtŖ¾EzGm4 ×īÉ ā`±qŸ{|õ•W—Ėn£jĄ“¢„ žć„J¹6L¬'u¤ć8W\{u£Ńްnķ7¾ń#O> €Q,¤ĢTµuˆÓ4$¶uųŻu(`NW-FԊų;SŸKŒ›“ĒĘÖ-ąJūB½‚Åč³-‹Ņń ›ŖÓ^@i‹”~ż²Fé@y„™b`‹s¼hNĘ3›C^GŪ¢čäÕŃģčŖN~NŹóģø®SÄгĩ}k9;b¦X—§ļæw'œ»‹‡3LŚ,ĪO¬VÖÉĪfåROT˜”ęnn6%!?‘YbŁ X”ug×ŲhŻÜϳ qZv©÷…ÄI–;¹·>ąÓAõõÓ$N¦5y Ó ÷»Ƒ}+Ŗa^]`Ąėģ/Y’³ūwu³?P&u9ų]˜w\vÕK+²K½ ńąėou“1ČG #QJI) JÓ!Ļ­Œž½¢§KN܌h·Ū¾ļX˜ŗ?ń¼ž_A!ģę9Ų}Rօ5żƒU+e¤‡Åž+äd˜»ĢzÉßīĀ’9<.š8õ[J‰ ūŹd‘+„\ׯĻŅt°Y*_n+„…Œ!™ĘŅR„ZE\ŃgåeDJ”}¬tģļ{“š¢f¼¼Õ°ŃĄtÆ“dśgŗļæŸóŌ+ųmŽR’ ™ųdÕjya”ĮĘ@PR¢„»-c"ą]Ų€T˜ŖÓ‹É–ʰpRüķo{vķ¦J„’€,Ė‚3 ¢Øœ˜Š3BHÕv‚Būö,J)O<ńf¾é†»¶l^æsēĪmŪ¶żšĒ?•® r‘ĘN]NŃ+» qH °€L m“”r÷ž»^żņW¼ż­oyĶk^ó•Æ}›%"/›„ˆ ˆš‘|ąłĻ¾[ņIĮaǵƒĒäå …±ŁE*Īå‚QčŹ!„¢rqkfµ1®Ū•õe !©K~) Z¢!Ü·6!_ż•D‡—qš£Ź’ˆ g$Å>éj§;żÉH^łO­LÉ(¦‘pęM°1ŗ M­ø“uŅūŗc£8¦ ¤Ö^É֊mu«OI‘©æķij:§lĪę½Ä4NNAek[śD.r«·č€ė7óŹ:܍¹€%ž5ī $N!üNłåńs‡8m-‰‚%7Ynź80ö÷ķvP*y}¼¬^”½Õ$»R§Ć*ü®ÕįēÕŻšŹv ’„Ėóa’yZqŖ£hĆg2£­Y5$^5ę\‘ß[ ”ėc¤ė¬NĒ)ĘKŽWÄ“Ļ̈}ĢĢĘŖų’ƒ/›Nb/-•õŠŹŁiö4J–Æ„`„½ŸĢ@wßjĒ䮬Öq%7Ÿ§\ڟ[­–ēy…Kg’MҊ@]Æüü©-_h°ücE÷³lŃõ²¹č^²„½˜-ĖŚååB}zæD^ßu])’oPqA)™Ød’Łę™·w+phéŁtS.¾kSœ‘²hĘŪ(ó!yČ9ēœcY³‘Ŗ§ 0“ŌńT¢ ;8NīævÓÓē(Ķg'2— Ć0IĻžó†eEÆ_i&N‰Cņ Āć¼Üb|B°„½hEż }HœŽlåO&ūÆėŗłŁģ_k]øJ—õĄїˆb*¬Šę—EŻæÕVœTµš)"W NļwĄ¤²ŗ&§Ņ°¶z*Ķdv_6–ŸŒ­ŅlĮž=éŒ1‰ĄD¾¾Wģ ™čō’³žP¾ŪSÆ5 Ć”²ećż}Ά8h˶³œ!Mq¾Õ¾4Ŗ µīršygRā“2śCē†MäY¦?“S”Hh·Ū„’ohė˜ZĶ-¢Ø¶¼+ÜW녁r<'IÜĘeŻ{HtČ„'ėß³I7éĻŗČAa•?“1ʐ†d ¢D“6#~–Īw=…6$sI õS.“†#A`8¬ “ŃI(×cfb f#ĮĢ’(ŅĪ„B§$åø÷ i%ī»QŗŁlV*"*›Däė+„<ĻA\V“Ųö¢Ŗ–T)o*ųkߘę"ęnH£s‘~ķl.”ūö)ģńSˆ‡™Ł>õĮ+’×B‘čfZ„9²$#iCcŁ.PpĶ:I 0£Ż|ßK§RÓmŠŅ™Õh”Ó ]Š1 =äŚÖu™ Ü"«ž]³{iŗJšžü·«:š#Ł­?= q|q+žßYv¹MŸIēSéaŻ”‘ÓGŖ¬+l׃öø?)“øN2G·¦HœęS ˆ½¬V®Ō×¹XeŹ'ķžå“O…=¢²d ×ĖŌ÷ƒķ‰Œ5ōoÕŁk VWFŪįć ēż÷ ĒŪŽ‰¤ˆ]·Ņķ«œŗxAƒ[īŚ­z\ųęŽ8“é/Q±,^čׄ)=śiH¹źó#Ÿ[[x…ŁŚŽĶ²Ķ' 5ÖK¼–nQØo1PŌ$C¼”Ÿ¬ż,Ī€=³ø0©Ż™łh“Ķ/Eyüę4]K¶IC爈ć¦ö0°U7…Ü‹’>žÓ% Ca8!Ł¹‹ĖŻ«»]!ōķÅ/Č»ć…ĶZ)B.ĢH’…īµx:}a0¾ŠéŪ·3s3żiʅ±ĆĀĒÉ÷ ŚŸp[†‰ŅŽ*‚ė\ź,9z‚d“M Fƌ”iö„čāµZ8ŹŃŞ¢ŪµöŃ®I™)†Žćtö2³Mqk­„ćŲ„ż7éGŹLķv»Töķ-Ł]‚V©ŌSģ•&.&w(…Ėhó©x«G°lßõ•I©K”jĄ?µĒŪ²VØ×¾(Œlž)£/ŚŁć=$—™9 CĻó’-h‡žļę{2G9ó8cÜćMź®dÖ6ęŗpÆĀć_ŃȧÖ6Æ\“Ė“r7<‹—:ÉšŅµĶJ)WzBö8ńÓ[ž²„a› N~¶ĢOĖŌåŗ6Ņ‘ŠŻ³łŒeĶcw5qĮYĶ”ÉQŽŃżźHU1±ė„m—4[Żp]¤C„>Q8%…e=­ŒtDēci9’Š \ķč#ŗ-vōße4}“åõG‘N¦ƒÆ™•śŽ6oT)U;ŃŁģł*÷Uģ²B*ųI–ę÷TÆ[]V#v?-öžp]aĻ„ė¤ įz÷–,X6ƒēü »ö¦ —uSūēoēƦ߄5ēĶs޵^¶ĄmÄUtŸƒ@bōlØp€쀶`EŽxŌbŹŻAM"6& C×÷2V©p} XxÜ«ÓJcBĖ„ŃŅ!Ń#ČF„ <“$’т}h¢#ĶF=µfIH@iźą‰Ā6qMalii©Z­¦µUŅe`iŻsb+O$­k^ܤd?Ģń ķŃ3Ųø—3ŌGqdY/|ټ}Ÿ{‹€UņŃi’Ģ~@ā^”čBi„ŒĄX/±ŗAŌ#V1‰żi<ĖJ"„Ųw@ q&ƒh’fR½iHl3šd°Q±Ho…8¶š̽"Ö]60emp0šA!" €H+%ĢĘ Cæä%whLGÓĮq{‡ńXu”…ד–™ėeį%ßŅk‡ī„ĻąGž‡Lŗ•0qołŠOZЈ8’8•T¤Āø~6 ¼ln$ ‰HbhµŁ¤B³ÜK*¹ėÅE8Q«Ń°ŠZėŠx¾„J$%/›ŃĶ„Ćlł€#’$°µWwZ„ĪĒō2ėÅöźE²ČCå.UDźŅøīiź@ā|:ÉO$C ¤ Ü‚,‘5*›§ƒęōļ£H¾Ą³²dŽŌõMÄ”ą¤v©‰ŃÕtźĀæ™»Ł+„”#$BkŌ„½’H/#›œ© E’¶ƒŅećM…~õ~Bā’—Ŗ.+õ÷ˆÆŪåf¢Ņ½’£ĖŅéūtTź-āK“\Š^)eŒqoł=>Ąųō»@ś ½"©}uŽ'īõ›/Ņė‡>§]ņ­•Ö)i]Ⱦ+/ĆüVÓ×I×->{ęÜM0LĻA t¾˜Ų@kVA„*Ō¬™°Ęœf3óĖtłJ÷ā#A+“ēY»°Ēƒݽź¹##„ÕŌ)x »le:¶šŠķˆ(JPō‰$mM!H Tņ£Č3•H^NDŒį‘ło*ŲŁs;e`Ņ A2}čļ3e–SƏė³üģZ5»®’õĆ©ļōŠb¬óDن‡ƒģͤ#bžę¢µĪØĶųų…0{Æž’éé Ļī+|“UiĶJic:›%½š¢=G”ŁlwRhĀ>I[p›®é¦Ä’@kĆĘ @ĶZōoä>ŚiŽō£!ˆ¤uLĒM5cF3@$É+yJ[\7?æ@DÖēIŠ’ÓŌīō}¦œN¶0FiŽ¢ÜõötXgp9ÓUeµ‘ćć’z9é‰(4DÉN‰Œ!‹hX ``÷YŸ‰ė¹Lžsx„ĒÉÕµSA;LõW2·ŪķäRłÉ*ŌM^ö^ˆX˜ÉHŁå$š2¶ą3e7ƒ[éüēJ)=ϵˆĪVļƒ‘$µÕ`KˉźĄ„t³!ó¼Ų@H25 `jģb3Ęh­‹3į©oŠ—¢ 4LōŠ’ŹzŁ'Ķ/øč›¤ ),Ÿ#ß&>” †m©aō,܉Ē%¤t*IŲŲ“Š ‹Hņ€fPtcZ­@³Ł&&~AĪ( r²sī+żĖ^7™ŲĆ“’¹`š-œ?.£Ų[¹I–«åē§ćk…EVwXg0ū•É„Æč+ć]²¹ņpŽ+]‘æ±¢ƒ`ü½>w•Ɉ øó‡Qę+}6b™>ŸŪØ{­"¢åßb Q…Xīy",ūę¤Ļąˆ·Ļ.ÖA–x!„ĻGs7āŌj²ßļ_ć¹ż76õž¢^÷PŒĶÄDńńÕU)Uä- bģu]×qœ|HuHŹäĆӗŠoƒ2QaĒqöķ³g@ŲV¬‘ ”r„ūĒŅΐm2‘VłCŖłSž:Ņs5§wBRśHČo×ģj²ß…Ų8œsQH„OP)½ŅŽc/s°’Ę7StŚĆāPÆ<Ņ–O„½Ģ‡J)Ó‰Œ ž'D\A T€CŃ ÖŠ”Ń”a  ½&qu“R‚’’AК‹ó€RÉg†RF)•ęLvÄiøƒŠo˜„H\˼č^źH†ŲDŃÜnöæZėČՋYˆZ™ģn³¼‰j½FĘ0/ŚÄ Ā°½Oc˜­ŠžN)•ēœŚoyH–-Ź;éļB-ļ=ę*n“BO¢Ė\hčŠX·•c£Tč ē!qŽ;qtö ØuM:õšD‹Œź²&±ėyW€ėļŪ­z¾2~HÆŠ^×Ļd±EE§”qĒ#ĢGń įJv“c,GI7iŽwIG²:ĀQé€$źb%}Õæ œī$Ć㚽tB”×¢nNI:®ŌM°ka°>‰ŖGn®’¤”Ž+mĘŪ„¤„æ|9y‰]c8 u÷/ŽGö©LwŅ;N;K)K%ĻDZYA$böЊpcÆó. <śFåļæ’P ķģņ ģ~ļ擬h?&))Š^QLE8¢0",؟[Ež¶©Ł˜Ż+Ē–r_©nĖ`]ōī/ŻkLŒ1J©bīqžIÖd’œsīqzFĆŃfJŪŽžh[¬h^÷ÓÉ­c„T’ØFž(ĶĢea8yģ|–;=(é?ķ§_¾‚·Ēu…™ĮĄŚgš3{;=€YNK6„¦$Ēq„Œ8Hi¼ŲĖ!KŪŁ$œö’yB$<źĀ}’ސa­ķ‰Õl“’ć°Š zQ“ŻōÉmƒ$¹Š©ü1Y8G½^%ZX˜Ž˜¾æ2vpŁxPzXE%ķ€xxŁųKę–2Å?…Ų£Ļ8вńĆĢŚ”V†ŅŅ‘X”9Ą±‰‚ńI¼LĆ"JJP×ÉJ Ū*ÅŌŹtįu‡ķØ„H"$ˆ‰µ Ɖ8āC¬cFŲÖżvö#ĒŽsŅK)öĖķ¦·euF3•×¢ ž=Šm2Ų®yPd/¢¬šĀn^‘’!`O{($IÅ^+mEÉJC+•µß÷.ū_Ēq¤# ¬Ā«+ōĀ{ÅpÓbÅķ°¹8×s2¤' B¼’˜—…Ÿ:E†aÖĘ(mæ3¶½æs`ó3­śX׈ņĄ‰øh»‰-jVLm7.žHrełųB×g@ˆfŸ–K“ĀŚU{µTņDZŠĪĖųētD>%„ įG@t‚õœå9§ė:łų”ÆåæŒ1\¤ŻÅ6Cźü—ˆŁ£Š›TĮv†*Ō6FĄQćtƒTGbŹĄŁüU:ł!)ÉĻ“@G‚Q~øŻl„ųįżNĆ|ˆ6 I¦~fmX›ˆ/cŲ(­‚0hµóAJiĻōUUŃĪ„®'-<øĻżō·Ęł2kW—õ€lšĀH?ėŗ’<óMT`µ|ęĀĆŖÉki’S§¾Ņ¤OÆ$”¹ņŖĻµ•bŅAņķĖseåū¼II)-uÖno „ś|P:ŹÕ"hيč“iĪGC{5ŚŻĻZ¼ ©ć³‚ĄTLK¶c°—‹Uä9½R²ż€ż×kł¤Ę½—ŚžJݲLŌ­W×Ü^Ė“P Śč¼-2rK„h€5Æl¢BÄŽDåbKaGŠÅÅEä½>‘1¦Żn«P§Kō”²[ēčČVœŌBÅGWś ģ“@č_`_‰Ø„„½®SĢd”f,ȁ„%§C*i?£ČTq~I§yWūBĪlłdš“ø5ž™ŒÜn¶‚uפ‰khµ6yśN[Ńå¼JGŌėõ®ŻīMŖŃ0G&Š©$ „E˜Ścß÷Sgh4>aØ óQ¶µRr>ÅŻą³fb&„4#6©Œī¤»»)Eé/""ˆ Čƒ'€õu0d°œv°¶¤wź¤"Ķ@ēĪ€¶4³×V]č¾¢ÆōņC^ņ€:F±-MŒŖ+2%½(̓oČ^„k…: Õ8Śn·3—ŗ Ä$dlŖĶĘeĆPuņ]żŗiƘ.ĮŖĀ¬Ywææ$Rrt !J„’ćŹ0Pi<<˜ģŠŒ0gāöé€nśšvøŅšÉ(’cÉļü^åĶ…>æš’Ōt/¦q/–K/åŽŌO(›źÉ—¦$ŽÆ4+ˆż @Æō+ļÆdśRüS·bßĪ@Ji3“åężÅägę®zc«—Ó‘3sJ„’^¬‰œ we©S­×õŃĒq“6VĪĒõ+ZĖ)™(%eXPWĮNnŗ.Ō*ü‘“Żh" ¢NG“ŲŽ,5ąHĄTØ£;䜰-dTūUV‘©č›ū˜šåņ1šBé‡A\FN£ś0’:`(ž ,Ą ģ˜g¤:ģ/m”V¦Żn‡a)BåŽjkĶ’£÷ą;ty™^DÜļ`Mė‡Y\Ó?s˜KPޜ”"†I¹O¤āLl¾ķe'oLiȲŖpōņʅrn…žéG+Š‚QŸ¬r’DqžiŸ!5!G Ń3÷;8ł—ņ飂¦ ½Ūõ’oÆDĶžąźN?ĄL ³oŲ̾’ øŠjōoĄ]г®ūTØmB&ćūöqÓē•(¹‡ØÆBwCTöŶ*ĻN°C£,q1ŻęOʎ/ˆƒ . ū÷ “&QQŠšĆ# ŅI­tQ,ŪT–a4 'Ŗ©l4Z•r qŌhĮ¦•Œ‰AѾdµ¤›uåŁå×m:Všżę?ŃZ‡tEta~f _ammŸ.+āP„9y–>}\ó½Żā±²V»gs¶EƒÉ‚sžēõ_o«ūÓ ķ†m”f³Yņü_EHm@" ōģv`n‰‘–ēÕZ»ž—i‰Ēņ£=RļĖ5`ŒŚ„č0ź lūø$O‘ذFdŠ ȉÖŪKÉ &ęø—u§ ˜$Ł3˜höI ”ė9I2¦‘H…”ćŗQ/Ī6G‰[ƞģ!ÉĖ®’¹09‘kŹf¢]Øģ—!fVi$Uv]SģłŃ.ż~ÕCŁŖä(„¬‰zÉÆQāL±XÜŁ]‘9šR.‹¶ ¬–M]ƒĖ°–SQ҃3œš•uŪøš#sčć5Õ~™ĢcŖŹGE/,‹–A[‹ø)£¾:7[ė77EƵC6h"ŪȗēyZk{ˆWź¦l¼­|d zkUõ3†-ć ±,ł*åķ‰ė³}huTp§l[WŽ#ŅR%? „8A R˾ź&§%ŌŽ ¬œC•|øZģy^<§²Ā3•€*ĘÄs£ēJJ¬R6‚FåØx§„åD0FT¢Öšż–ŹÅ¶v³f„R£”@¼Ņļy^åÆ|p¤0¢e›Ņ"lē¼UQŅ`öAk=śĘą‚8ņeę‰"b£“-ĘS(cYĶŖ%b\¹ųć=ÕÓū‰æŠĀŚĘ˜HøØņĖņŸć=S*”•0^bS*|j­{k?™r˜qS}åµņŗŁLZi²ˆÅ²‚SŸCÉ¬ŠłOyJÕ' ‰H.—³ƒ,Q±Ńćū~)Če޶å€HX‹“_>Ÿ̧Pšó‰Ū2Ķˆe±©%dZ±čfA“š 1&ʇ#µ-cŲƒ(¾_DB0Fˆ)ły„©xČž(Ռ$JÕŲ$ąŹŲ©luŖÅ%59:¦(h@µA^±X67 @­1¤”0#Lf\+!j‘³¦[ćÆJˆˆ¶»[‘ĄH²Ūā?Pf¤4cåÕųŌJ:åJõM¬Įm*ڦ[ˆŒ/óØK ­šJ2L I”‰ō:ƒ’”FÄĄ§GH­”ØpõĄ`AO\ve„ECH‘Č’ąŖ*¦V½¤Ą¦..šN>\é ±¶¬ŸŁ–ÖYŖäĆÕ< Źņ͐ /cÕØ Ņ».䋑½“µ,²±xRZŚsbÄąš%啄Ą"’R³±h¤<$ĆŅŪŚ×½²±¦ÜńX¢ŸDƒĆv[®ŠÖ,µŠ@9œx”ÖŗĪŽK«§y,GOÄžüXāäĘ!ø©ŻĖ§³SżU9_ĒŲVu‰ž7ʇ“*3 =f ė3­qؤTõ)œīĄÖ"Ą×ēœ×9(sœW8- Ėc¹µ˜†A.7Él fŸ’}ŖĘb”1t«U}HĒnY^+w«U)© WķmžśŚŖ©G؜0°FĄ²_‹LGā¦Q#{—‹pąX\lŖ‰UXŽŖ@ą²dc€"ɳ”rą^CaD4ēJŗH¤£dŲ–«™%Ģ”§J»›Wu8(cށtķģū[ų:°Å’ ?±`}ŪJ„ųŹ;ŖĻ¶Šćŗ µ‰ZćSkķ%¼»ĀŌ¢Un:¶’R5 Ÿr‹w*ڊu­Wi­&^į5P]¾šŁxeļ“Ķ ół¼ēyń^ńFź—3Ž=é,¶KY’0…)(cØ „žļÅsų*޾ ģKŃ LLLDæÉdJ…ŅpG°OG±U­€ĆxrJĢu³bģŖ±ŒśŠ°-;’††øV* X'§ ȶA˜²é§01QҊŒ©"ŽtŠbĮā{ƚ“ū>kMƒ(Äõ“ŖvŃG–˜¶ė8aźSŚ13٬ń} Je NŹe 4lģ­ (“J{„ŠlŌQÄań‹p)ŒŠ’3h³Ø’ Jž­qŲŠ\ GŅ “““eā“V‡y*3•śó­ÖŠ_Ó‚$ ¦¬ļŌ«āG2¹RęR‹Š"³Ćøł9ŚyśfC]u¢²:P5³Ą«¢Sęc°˜”Zģ®+"„{)ÅS–7RZˆåĘ ‚ĀS9%ø²jqy¬Št±č•Dž T€fšį0ˆ ž@P¤Fä˜]“ģ(Ÿ®z¢!&‹nö>‚—s’.¶ˆS\¢¼Tņę`$톐›ĢG~°#=ĆČP&ÜM-s7fJŒ„Že2R±”ńSi7’éŽĶ÷Lt~± *…ĆĆ£±{ĮD5ćX4ńU ‹aLŽ, ~#ÄĒŹ‚+"oŠ9ąqŹx)ź‡AlŪKé{«‹|lVgĒ*ƒé“Ć45Õ¢4’•¾¦ŪіKKūĘō'I­ķčxŻ~<šŽvģ)- ėŒOÕļ§¼÷øÕ‹øššš ;e‘UeŒn¬Ęķž’Ŗ§U€ŸĘ@Gm*XŠŲė€ońÅ_‡×ŻŲĒĒ6bŖö† ļO„ø˜M" ›ØĮ7ÅŠD€Täg`SeN*É  Ć'Ū\^…kÄɹü.…”d <@€łL„Z«(¶åp ¾Łļć˜C™¢5")eZ§ 7¼‘*[\BHپ:—Ėł)1Ś_ėčlĆTļ–ŸnĘRg¹•ę †ć`›YjwjĢ ~®D¤¦­ńV[¶ņ6됤f¦ut“ĢŹļSĒPö4żŅ+-ląÆĆ$Æ7Ā`Æļ*nkjHóMo ŌIYćFĕ GÓŖĢąÜLTījBāUażœ»ŖVŲ_»'°ģ ć ’Ęz½źüoC½ÄUśĪG}zńÄ\4JĶ8e-ٱ60{0TNµ(Šńė‘_…PL¶öŁ®ØJm “ĘZĘŁõŸWW DD€ń9Ģš±čĒonn®ÕŪ’õķhւ lŅˆ`ē©‚ @.sęÖ­ŚkŸ· öZT-($¾/kä;¶9Ÿč¬HöüŌxˆµN„Ų”÷[YZn\K£Ģ=ĖŚ˜ėT(źæ±X“łŒMĻf޳O”ĶŹeĢK| c»g惖xŠe­ _ŒļūQ•4x!'’`Ē0å—öȈ€ā¼S½£¦¬9NĀƼņ>=Ū«f?Īų¬4ŁŽßh•S‚SŒ1®«­ŃŖˆX4ŲŅB,¼ „N*呷1¢"$źÕQe›™Cuz ŖčuD4Ą„卩„Ń( n*•l,ķĀ8xōčŖU«Ž !aģķķ½ūĪ;;;;››²*•ņ¼¢ćŗ¶kŗń4Ø+»G‰ ”ĶX.Å+®’õõŲn“ Bڼyóņ+ l°“?ŸĘōęņ³Ąų¬Y&&ś™ćÜŌ‡ŻtŚĻ‚ż¼h”R‘ˆQŲ;ŹØØvµ•1ž9WČ8W9±ęևń„ĘƄך@S hÜÅø¾@YĪüDŹ>¢¢ā~cńÅ AĆP| ŒĶ b«R£r©1Ńų>Å}zźRlˆ4‚ń¦**G¶ō†qd“ßXV„Ķ–CÖZņsäߛ8µ#ęyœ‚žĖR©„BVÅ¢ļŗŚóŒRjJ}Õ ö+ŹĀ„Īźą.°¬‹ŲBėŅŹķO"Ęri®œBU~§¶¾CÕ#ø:¦P,z®ė$āĘŅ.+µo™Ū„š}æ~|Zó“~§Žąč±ė M;_˜NÜß3E„⽄0uĻKeÆļ_ćf«†(•GR{Oäq‰ƒŌŹyFQGt×? ”¶¤N-W¶¤Ķ€?­d3¦ė\”mo®õ&Ō`ŻkŹŹYemģo<õK—lj ėך¦Ń[ åÖń¢&…phÉ=2BźŹˆÓ‰"\Dˆõ<„ŲXM Ī\Ž G*GL@$T³°@  "#„¢©ļsUyēĖ*åDMP ļƒˆض%4k×ŅŅbļČv«ĘżĒļ£4‚²|)Įń¹ ˜‰YȌʊ Ģ'>ąĒøC%@”p(¦¬cÅK¼•~ѵšJ`¹źĻ§|ÜÓ½ųK)aāéOk'‰¾\׍ĄäŖ}Č ~jĄ‰‘É+ųA“§/ ą=E P(2įBDŪżk7ńZ[ķ”Eq»Ęćblełp€Rų V5¬Ž3”ÜŹŪn Xi©sĮ š%Ā(Ŗ³=Õö1])T ­R5 ĄķĄ[‰D)å‹3³/Ą Āvč Ją‡vn1„@ŠōiĖćĪ Ö'&°®KömÉ`ŪŻ€x ‚A8¹&‡{ģąĄįĮ#VSM@>øbŊ„K—~üć­µńżˆŸrC;’Ø€Z[Z®’õõ1Ń+‰²¤ž¹}c_a™>ĘvJŁ!ÅD×Vbļ‚BÕ@ØWõēJ”MÓ„ܰĮr 2sLqxźŖ±Ö'žŌń".ūư_”†:W5 »Üa(HµTб_B‰#P7`b³m4 d„(‰(%hKŽŖ]į?•ķ[ŽņQę 6‘¶…ä‹8[mzżzvŠ}S¢F„ ø;cø“aPŸ„PŸ9”Õźŗntö×Ä«ӝœag:&JĮz3B„J8°„»G‚g‰X®A,¤:q*„ā2Qq o<ņ€²]:j8GÜø¬`ƒ½—Ó2Um~ųTĀ7°Æį”ńls³ÖpōčäsĻ=÷ģ¶-mmm‹/€®®Y]]­€ Üc†H\züå!FD­­Ÿüä'ß÷Į‰Dla²NiŠńžŠÄ¦M›Ö®]ė4gAŪęhX*¾XōX˜AŃ“ēŒÕ:N½5.­Jß0łFFFFŗŗŚķ*žœ,F=šZ+Vå'&&2™L-l-óõŌĀā"i‡ī†RÆ~„¤•«"'¾rĖ©€ˆ„ *3ĮÖdń«ĄÜG!āĮRŠ–ėūĘŹM—"i‰żNdXfv•KŽ‚ Œļ ”U„ö}c½Oāhv\Š(Ą<1Ę¢ń5ĆAŽN01™{Żė^×ßßłå— ½ā—ŠĄŃ£ƒļzĻ?.[¶ģĄ”ƒ_ūŚ×šR)$Ź7ŽųõÆ}ėÖ­Ļ=·'>˜œĮžš¤ ė8Ž=NÉ©"<>_ĖŲVĢ<22ŅŁŁ¢rpĻ=w8ŽÓÓÓsć7žqʙk×­Kx LÆŽē[ܞāP˜jy@cڤo •'WÕ7/-O‰Ķ`(ÓÆ$!`•¼?*BWHŠ¢ä5µ©«J*""pŒŲEÕ³ö%¾Ž¢« –aذU„%>*ībnO@°ÜMĆ.‰K/ĮŕŗÖõāŸŹj ֛ "es0ÆaŅ ­Rž—Ač D`L@3aĻóBY©¤²wÄHąóSĘc jU¢\½<”Ž×ŖBæīŹĶŹ>ńźOēhwįxQ©Ņ*L¹¢,e«ŁY«­]t#p”×Z^+3[ŗf)[a ćS #yß7Øhū ­Ų!šm<öż”””Œ›Éf³lŒēy¾U’ŌŠˆÜtJ)Œ“Õmą;22Z,»ŗŗˆ"£—š#”ķH“ō-™ō ×\sĶż=ųšĆ÷Ļū«ė~!;vļśē÷æļĄéOø±­„UˆŒj>śŃNLL|ćææŠ~č_>ųłĻ'ĘĒÓM™Šņ§üż»ļ¾ū¬³Ī“¤»wļ˜7w^ōJĻųZėŠ€f°Ł—b±˜Ī¤l_Lų‡č֜Š0ŗZe‹Wbg˜zŠ*Āō/Ž$ŚŹ\ÅNNĀ)Ż`śbĶ9AĆ n‡KœU ŻÄóž›r,A=Ęb’(ٲ¬’ķbœ\F.“’ł™}„”5A,s ‚Цėx•jŠf% P HŒ0i4G…*Ó±^­0śb#…B!Ӕž¹ ĘŠóģķ`”ā‹^*cc--ŁŲ^*!ŖY/%.0ĪaŽ×A‚Tī-\¶ķy ŸQix£źd<# Ø"÷,.ņ(%f†øšzC§¶”uyDW>¤lv‰ČtSā8J„*K“=ņę xµÄPgp…Uē’”šf„bH<,)™f4ŽTœ“ż’£¬pŒ%Fzß%”Źj„āńĘ?"ńX‘ŖÄ™ I =Ö©Žšü”*YńįHčėÄߤČnPĮ b=ŁĢ„,P•9Šˆ”>¤@¬õĪ*©$(ÓU­Ļ“zkXž‡PP Ēąø”˜­Ż¶YĄ՘ćK4 ‚D:1ŒŠń«_ślņ¦šļy§”øhdh÷ŠÄ ŒĘÆØžų›[—.[ōóė~~dl”ĖŅÖ׿–¤ ĄõyU1|¾OÉ>Ȇ²$Ʋ³X+¼ņŖW*…śš‡ $vŪ‘ųŠ? ģƒ€«h¶x^(AHv˜Ąş<ŗÆX”€-µ[#A%HĘŠĮēŲgŽeʐ ‚J§Ą0bL ⠜=œ¬Ų®•Õ ø”,•üŽ8č°}[äIČÉ/ˆpųx>ų€ ąx” hx FEŒ¾Eņ‹ßž.ļģ&ōŚWæśńĒ’ń®iiī-O 9.ŸM|Ū W4+ĒQńx1FŖäŅĀB‘‘ˆ%ܚā’UžˆŖH=…ędįēūQ}Źī]®äĆ"&­KŠÓŲ- ¢(MĮQH€|ƒ"„beČ@|ĒĮ:ī?„¾)¢ 'ŸåžiŻÕÕå¦4 “&DÉMN ³«tĘM” ū@e¬µŌõ7üį²W]uźĘēßżĄĆ €l;€m¶ŚÕ†Į€&tŅéöy}£8qŽ/9é”õ, –Ģ]øvżŗÓĪ8}Ż©'»--0ŗo7 FbĮĻ}žó_ūś×ņć ʵ_üŅö³ŸH¶¹Ł¼ 퓸Ģxb«™’·oÕ¤7=ń¤] ™t¦ĪüAĒѧ¾Šū‘Šåē{‚¢‹9IÜ(ŽHfŒ‰4üKĘ<ęh_—ö&–Č“ĢnĮĮp{ MĖDÉ?īÕ„S– ÆH’”Ä!‹Įߨ1³4(}tt#1”Æā7#¹µh)„āė¤K2Z‰ķ¦„¢ļCxY g„µķOÅP×#.l„#5)įRä`C…ą£1°Ž öB@@EQG–ō® }–ø 2 m.8Ų±ē J.GÉX•ä!6ēŶoˆˆ1ÖBB—Ÿ‰P©²‹ …™L:JA‰1PG)…¶ß!pŹH9Ū£F „9ÓĒ»ÕŲŻ±>ŅŹhÃ"żjū#ŠGe„JIČ, oų˜ˆ‚ūBdąIčS`u˜D#F ėćŠßa("՛†bÓ[@Pī!deźŠÄ"3ŕķoU9GßQ&“±“<‘«$āł°J*±YT™…–Ė1±ŗˆ([µu±ģ»ŸÕ˜«åńž$ģųW%ČQY«Deś@kƒJ¹FИɄg]5t™qī7-¢uՑlŸņ+Ąś2·•“źŖpŁ­E§†E`ŗ¼r{d[EÉŖ]fń¶²D§d©ySU͇ƒ—OÆłžų¦õš¦a˜T}ŌUK,•”””¶¶¶ŗ³ė”!p_ˆÅ‰U#Å¢7Įā󳖮YaCæÕ§år«@l°«n»ķžK/æŠŻ,HĮ+,]½ģŖW]9§wÖĪķ[ļŗė®§Ÿ~Ę+Īd1ŲźK‰ęĶ<Äė®ū„RʝuÖY×\sM&“iii±”7*²/ Ģa70"2*ńMn|ńā9ƒƒƒ“Ć Ȅ±¬ˆ[b² ‡¬DCęU+CDf_D”rJ/”ß@`¤·™ ƒR%†F5°Ų³ “ Ģ(ŠŅžgŲ‘=#ū7ķę‰'ž˜Ū1’Źó/oD0@&‰™±ļS@DBĄ€ Uų A„ms)ōĮź»°BL¹)ÆXtR.3 1 ‹ˆ¢”oD)%6å+av¶P$ė :Ą5<DŠ $^±č¤,ti‘[$&DĻ„Y8ķĶ”!ŸæĶ—†ž{ɹ½ß˜Ż1§ćŹ7]ŁÜ‘™ąI—ŅЌ™¾Ö„żŻyĒkiM»ęE5”Ż]‘Xo3ÅhĢÖ4„ˆT¬[銔r³"eœøŹĘT©lĄķūn Jģc‚ŠÖR˜‘ĆZ+f0ā9ŽĆ̤BK')!(o @²ƒ¾oR!ŖˆŚxĢXų˜YkJ„šü¢h1ŸĻ[Q)ūģŻlS§ėćųžČ¶ž? DĄč”;»NSs¶kv' Bd8ØĆ =‘"0>ķĶ…B~ūögŸņFBš`óÖ-³:»5 $“#²¬*f&RÆyķkńµÆ}½ŗ×¾īµ6lX²d‰Ć8­Éņ\R©T$Č?GāÕŽ:‡ĀĀ… ķ]är9»‹N—U’؍æ#©:EäźńKō“r)ó$œĆ&Å ’Ä„†BC¾cQJ0:"#ŲfVT¶%…‘*Æ\ĀOD(ĆÜ*Ž~‰ÄŻ+.¦j°ø…Ip"b9eĆ%A»VéȀ˜?“ŪŖŲ{EDƒ%ƛ°łQ\Ć>ˆ„2SÜō+9“ČXÕ V¢`x’`Ī" ŌŠšŖm$¾ļ[ĆsĒŃ$g#¤±Įh0¤©—>+č½`K7(›ŗŃńMF§ƒŸ ˆh$­ü”Äzä#åZĖ@ÄJŗDÄ“·ņŠvĆZ‹ļ³ć8JT›Šµ.¦j\?YŖ¦6½O™T^X±XŒLĖ8)åü”:6ĖÓÕœ;µŹ§O%ć7]£ūJvżĢx扑9.XUĪo#K£ęƒ ·āØQK¤“=ĒDėĢšé^ĢTQeˆ·žĘTų«aż³U§•K'Č¢õĒÅŅÓ#~cż|xŖ "Ō„”ؐF!bŒčū¾Ņ:›uzč‘w¼ćJįM7ż¹Œa#ö÷Cš0LDō‘O~¦ČzNļ¼ż»w_{ż5ē¾šŒ¶–²(«,’F¶æø÷)ĻWJŒ ÷÷÷GL'8tčPgW—ှÅHn(R%Ž¢ńż°—’:488hŒ)#HHĄ2×|ŸµV–pŁdŲzƒ…®6žm$HīD¾A"AKRe»ōD ¢JØ G!c\šµ²>”š„ˆŽ£Ę`üwæ’õ7~ņ­9sęĢė˜wÕł—k[JöoY@4¦”ĘŒARˆ`ķ†mö‚ĮĶ(«EėūŽėZK&«YÄF“Ƭ,S“ŒTIJž`ūž}+Tňń©ÉNLJ¹>€ (*Ūē%– c£ūC#žļū/9D乁}29>²é‰G[œ“CNü|” Zµjé²Å !Øćˆ1Ø«„Č ½AŠ«09>ŃԜmhhż<•į ÅĶ5·d\×±-µ 1ģõBß÷s¹\Ks‹¶±“ vŒš—Éó<›gC@p²+Ūq”ˆ!BfŸHc*@†Ø¶%†Q)1Ʋćhc<" £µ"Eģ‹m Ń ¼bXRµāXFƒÖZ»NŚ0*U,\ׅмĶbŌ¾ēéTJ€E`²0ŗxŁüĒaŸ”cg>‚ˆ±bāåĖŹ)]’(¹ą‚ ģxD‰teŖ¬³:ŒøøRȔįŻŌk0ŲōŹ3įJZȖéw„¾kS%ÕRåT“Š%”’z ŪāQ”PH§ŻŖäڲ\mŖX9ÜöĖčUc©hFˆ$`_ …B R–©[Ź9ƒk j@–˜ķū†ˆHab<_-%o&*Ę¢ĆRÕ¢Xō‰H)"R'P—{EI©1AŠeõĄ!ŠŪT‰–ērƒAˆ5Š¢Ēųƕµ’Ŗ111‚ˆĮI98„,:¦ŃU9Ū«®»Ŗ¢µ¤0Nēfä ŖĘFP«øJvb²7žoĵˆKSK­ó"ńEgOSÖ&\bUaüY[‘°Œ –˜6b(ŒKAOą cåø‰…ĄŃ‚ąA×ķ1X¾k-Ž0ī<°†*…€ č‹6 \4.SZš4ųJ< >V"d@ `9·NŠō=@︬ĿżW̊“”0 `Ϝ¾‹.ŗhdxų¬3ĻtUš@čsĪ;ļŁŻ»vģŻMD%é>fʀ…+DHģ`0žĆ`X²ē[agahjʆÄöh ł*!h"… I—d\Cæq£Tūi„››²Į>Š] …hq‘Ÿ@ŚĢ|Ļƒ°o=ĆAˆ},ä|1d<° Ūųh¼b Š4­!*­µB€ŒiMVĮq‘EÄ`q$“,A°LxWg“Ņö#@@  Ę7¶ GäMA"åyF€t*敚²-OmŽŚŚÖqtp•.z‰„Ö%)ZcŒ1FĬ_½vžœ¾ŃĮ£ A€¦tŹ+÷īŽstą0•ø8„ĄŽ­ŅŌ»’ń#ĖVłĻ’üĻDæL¢üa?=:€­cs剐ÜBķīä-2::zŒ6ØŅ!’Ō>ļÓ-ęVĖoʳŁP¶m`ąhƒ)E„ORLϬ&°ūcķ%$(F5¤3©2µüMk6žU ^“ć0…ė8ŁÉIMM„‰YŒĻ•©~ÉŠ­īZ©ÅΊ`ĖNØOĒe¹]WkMqŃ.ÄZ!l8Āöa wNši-“nE³ÅgÆX¬UԈū„Ē.5'@Ą+/×Ę©sO}ÜDoT:¦c‡5ÖŹ=0a§}Ā™\ŖØ•ÕwT©BĮ©ļU§VčA%ĘTUR—x™ ķ†kĶ‹³Ŗ²”ėäuVzU(ƒ8Ps;Ą$× ęø-BՓ«Ź|øÖ¾7­Ū¬šŃM˧wźż3äQ Źō¶ÓæU(U5„ŸĀ—Čģźåü±œõ‰bŻŅ7aXÅP­¾œ,ż-Zę¤|)5>Źuęā ¦BU6#ŠećķĒńÆøAsŠKTןņ÷ėWŽķŃP1jA¶¼DŠš¼™ h¶>€/PŒm=„Ø@ĄÕDBöxx;h]d=ņ‘½ƒ€A ‚CįDō̱L¦ol.»ōŅĮĮa›÷žrŹÉO>łdgW— ©1ˆbŒ_j6@hX”c ~%€aåŗµ‡e[³¾) +ūG0SŲ•Ķ @ Šę(öČEmĻZėt:cßßNq0\ņęµO“Yb H P\*7JvŃhöŽlWoėŠŲįƒ‡žóa!ąP@$؁öY„@…‚!1Ȁ>C Ą’0Č¢‰­$ÅóĮO<²dy”"{Į&7B`²®«Ńń€|0ōm2£Š,lАė3yĀ(¶|.AĪF‰Ņv?:Ī ƒé’æ3įųå±1A(Éģ(åŗī¹ēž«„EeujĆÉ'å'ĘēōōźX\.ČØõ` GEŹø^ވāB- Źd€ ›‚]Č6++y2W‚ĆC¹B (‹ģ‹_4J óĘ/Šń‰ü"Œ MģŁshhp ]Ūo622v詑ĆG†Ų °ćC”ą#££“…‘‰ŃĮ‰”ć*"›¬zE8pąČĪ]ū”&`ĆĀ€Aū78 Ś+āŲčä“O=}čȑ'6m™%H FGÄ÷-Ń “f×ö½£#c›žŲź8¤Ų‡}{Ž?łä¦‡|Œ NNšV6€0lYĘ&Ē6ž¹qpd°«§K@”£mü4Ź–”RķČsĻīXpąĄé'ź‚«„ČAš L¤Cy/ƀ“‡|ģŽŁ­Łl¶;=æÆ­XRDJ@ŽW`K±Ķ•*ÄžK¾VŪĻ ›J·€/W"`¼āĶ7ż”««£9­AŲ!ņ„814øåŃGŚŚŚV,[Č\ŅV©Uė ³ )dWīŽušį‡¾å–[“֋/\°`r³kÖ¬éźjknq@4"ŅQ|všŠąĻžóöĪY?üį.^°hŃ¢Õ«–æųģsZš[Sn Dl}ī³_˜?žł\8gNē‘Į±ļ|ē;;Ÿ{.ZĀŚłóū}££“śÓĶ̜Ėå.¹ä’ęęÖ&æŗž†={ö\zŁĖ/īĻå½O~ģ“m-ķwŽyēŪŽö¶K.¹$Ū¬†‡ ?łé†‡‡9rńÅŸ}ĪY  z¾o;ÜĄŠPž–;o/ wÜu{ssóųųųĄC«WÆ~ÕåW¬^¹¼¹¹ €r“Wä‡ķ’=>:vĮ,Y²$ÓäÜuĻ=ßśÖ·śęĻ€įįį¾š…ėOķŚėnĪdZĪ]Laņ-č#Ē ™±%ģųųøėŗžēe2™W\zY­|żė’%Ģ“““MMMįäA&ŒŚĀR¬ų„ھ噷üż½\Į7Eff£WÆ^-¾éhm›»x)1 Ziš…sžŲųŃ’śÆ’ܽgēķ·ß>«³½P(\xŃ%ļ’ą‡»zŗRAŽOĮX±”äóŪ¶<žöw¼%—›ō<ļČą‘®®®Y=½­-žČ'VÆZ—ķģ‚H‘0"/A¢Ž`aźč‹ <§ž~śčųx>Ÿ×Miņ‘ń’½1 ÄkÆæī[W«³³óŹ—]vÕĖÆL“Š@”Ž"øsĖ#_žś Ī›7ļ‹žL[[[Į+~ęóŸūÓ]·¬_æžKŸųlgsŪČųąķwü凿žŃ¬Ł½C#Ćū>sčc’ųÉ Ļyq P*q…Y)1V-sėĪ-łŌæ¶v·ŁLäĒžyꙖ¦¶7]ł†Åóžūü»č4!…¢ečō€9(¬żõ¶ņé›fT޵ޱ>ōtĢśš‡?ų™’ųŌ‚…ó|VØę÷÷]zĮł[·nĶfŅXÄŁŽrRĄCŸ’üē÷:ąūžŹ•ĖŸ}öŁĮÉCĻģŽrššxSSSwWĒæżŪæeRŹŽ£ńĮÜqǽ?»ö§ż ū/¾āĀż÷ķŲæķÉĶ›žzjˬīīW¼ģå³{ŗ¬:=<łŌćķ;qĆI9ņśßŻšĄćö/˜wŻ æøåö›¾š…/ģß»’Ūßžöžż{­ŲĮ‘į×æžõn¶ėąŃ·ßs[’Ā9³fwķ›_Ķv÷÷n8ė“Ć£Gvģßé8śG?ś‘£µć8#Ć’·}÷Ū’o͚Uą(mŪ~÷§[o¾łęƒGhŪ:Z—Æ]œĖåŠKēīŽµļ+’õÕ·żż[W®\ŁÖÖT(ųšČˆæ÷ą¼ļåĘTJ–ļżą<łhsWs{o{OOϽ÷Ü’æ?¼śģ³Ī9ł„/|Ʌ {õķĻ>÷ÜsĻeš³Ūvléh™5tdōW?’Ķ9/8ėč”Ć ęĶĻf³GŽ) }s»ēĶ›hw!5©Ō_ū†ŃŃŃ®öؘa^ßģ½’}³ŗz“Ż "žHÉ,:”ŁŠ€€’śÆ’zŻu×YĢķ†n`f"urŚŹiÜ!oZńSPE¹ļ¾ūŠāš"™L¦–;wż°»NŻŲŻüø&Ć>ƍƒѦpq'”xV ¦µrMX-Ą D˜”¢ÅT ’b*9|˜˜Qpµ®9Ä€iūĖFJO•ŽGq!Ü ĪĆT*äšH`+­„ŗü+^I –Ŗēe³ĀöĮbõk·Cq&ĒQJ5 "€Ö*@ņ1IJ •z%†˜b„–CŠ‚?l{–°ÄŃĄŌ +ĄŲØ“*e-ŠbÕ4֒‰©¾4ŖńšEBķ@;_­żGœ}@!ĖnL¼XÉvVM„¢~HėŗŸcĘWU4™j'+%“¼x³xUĪZ„fr$ó®D+E™Ž«ģ “X”uD)‰6˜JaŒ‡µŁęvč*Ŗ¦T=Oź¹3N[¢ķnŹD·“5&ŲøLŌt³āøŁ*'ĢŅ’*Gū©źIĶ„A±1ąyžš°0LGaÖĻĒõĖJōŁKÕu ĀŖĶ·ĒØŲV?„mšżėńÖŖI%äCkŻoÜ1µ³"i¤3B1 ¶*Į¶r©pr²šŖW¾³©Ö\Žcpr˜‹}}żŸśōGD,Ń.DźĄZ2p|Üˤš|„’ūĮµ-ŁYĘ3ćyć*VHįm*P8…F‹Ļf³{ü7æłMŠc$Š×ׇDJ)$²¢8%g© [)T#öżóŸē›ßhϤūęϹēŽ;ĒQ”ŽśÄ+—/. »v> ā (#HbõœĢųČį÷æ’={vnŸœZ<§}ēī=}³ēŻtć üćĻæąĀūĢgÓ-­Ö©²¤ź€{÷Ž~Ė­ßżŚ§ŗ[[Y-žēõtf6mŚ6vōpo’ü Ī}įG?ńoųŠG*ķ€g|G;µ"ś‘„’õŲcŽŖ\^› YŗaEö¶ōžm{¶xzĖŲÖ.jĻfŪĄcnĘę6Ģdƒ¼8æöłĖĶ͐k.~é·’}Öåē¶C¦š”²wvą0ŒŻ9ŗéĪĮĢėks&Zł0\pxKįńC=‡wdwŽrų/'5Æłńõßzō± Ż…q8Ų·¦¼øū›7nėš½W^šŹžĢ¼VÉ’õyÅüsčė×­÷äō”#;•ćē½ĆżĖļ¤ļ?pū÷^k2ćēœņB„¶Y}$@»!ÄqćÄņüW@lŖóæJJŁ‚Kxį Ī=eĶŗ®¦¶”­G ¤8żŃwæßó<g7­ÉźĆYmXRą1=:ų?ßžļ‰āÄŠų`k[Óņ–œ~öś¾žŁ"ņ‡?üq×νnk‡“2ųŹāī’rÓ->śhKGӆ³Ī=2|ąåW^óʞ}öŁ»žųŲ¶ķ[·<»Ä{ūŪŽ®“Ķ×ĢņU‹|ß?pų¹Ķ;FŻfł§¼ėą‘Ć?æöWŖå±§»’ž{Ē £ÆĖk‡‡‡{äŃgw=}xš@Ook$7ŌŌī>üäż³ēt¾ńä¶īīżčGŽā½¤ęö÷{Xœ=»ē„N0ľ_|fū³'¬]eCĄbž7mŚt×=·:Šæ°ē„Ö¬;iĶ’ÅK<šš}üwwżå֛—._©Œ6ą śCćĆ;÷īZ³j¹Ž~ņżĒ¼£»ćyĻ?ćōēŸ199™ēüž£ŕ'ŸŽržųHĘńF'Foøż×æūŻļĪ~Ń ļ¼ēīÅĖ—y©Ü`ńšŲį”ķ?ß²bÉŅßÜ|ŻįƇyķŚµ'Æń·ā(1›Cr Śé…­Ix*•ņ|£µ Ż¬aÖ|L3u`¶«%;ŻxˆYg\IeėŌĀ«jß5J©Æ¹–¼V"¶ØEKōĆ@H!¶³!qz!”<¢ŖŸ-HXDB“›noėtœōģŁ‹÷ķ4Ų=oŽžķvt϶ *ę Ķ@\X³źÄ}{öĶ™čąpfÖÜŃįį­ł#MnOG»īččŲspƗĖBW{ē”ż»•ėN…c@ATX,ś\,üģæ…ĀŒéTś²+^)€éLVD@”&Ÿcåk;ƒūö}ęćūĆ~µ`AæjéxįKĻż‡÷¾÷šįĆgŸuÖ¾ū½»ļ¹“XŒų“C©Ö.)ŗėŽ·æåĶJył|žĀ /X·n]’Ņ«V­śÆĻ~~ttōžŪo=iٲkū»6œV21dŻOożś—¾ō›ėŃŚ‚D”ĮęÆ|å+ŪwīXæ~żžĆ‡Ž÷¾öĻļ½ų¢ó@y €¢\ŲI‰%q—bā$>±¾GęĆ_ųču7žnĪ’yŌ̾ėåõĊåKwļŪł–÷¼­Yu'żÜčųĘS7>ņČC{·ķŽt˃sūę¤ū»fæō‚_sĶ5,źĒ7\÷sßIiĄ¾2 Ä ŒAó¾öś3ן:–;pÖ9Ļ#I;Š4 #bx邾ŒęC‡÷¾žKŸmoiĪf[_~Ńy«×,ß¼õ‰üĄŠĮƓßųž{R}oŗšuAœ„Ąמé7ūśæ¦{$—~Ū«_{ʚUższń7ß»{ߥv×?ę߯’ƲSēv» l5Ym` R†ģ‘ińA," Ӄ€ČēyöŲĆk?lé ’™ˆcсXÅkń­Ō3Ąä¤×’q0OQŠGDšÅø’š’ĀķB„r¾5. ŅcČčĢĀŁ‹ģå ¢ˆ’ę–N!$€¦‘p ŒŒ|ęsŸcš»ēĢzė?¼aŻŖÕžēi­¹°bډ‰‰üȤ š!Ņ,7Ž7’±X,Īķļ}ŁK/īźhef”Ł‹»—æčä n¾é¶›nłĖ­wŻŃÖÜvÕUWQ¾Pńü\.wĆ_nīččxēŪßŃŁŽydtšŽ[ļš>śĢ¦gžŻö¦7¾qć)§ Ą#>~ųč {ŒK–._¾bՃ?’Édž÷¼Ó6ž¶qŌ˟~ę·ŽzėM·Ż²jɲ§žöŅ—\ؕž{öé­G‡"§įń‘’Ā,Z¹dVOל·į““ žW˜ŻŁyžyg’ļÜ·kß®ķ»ī¹ļž‹.ŗPT*„O]æ~åŅ„Ććc=öčĪ]ŪÖÆ_’ŠW\:ž|jr3—_öŖg¶n?pąŠųŠHŽ+::­ŃÉ:Ķ­™¶K^ņ²‰üÄ„_śÄę'ʇG:¶g2™ęL¦%Ū¼|éŅłsēvtuķŁ³§«£‡}£²žó ‚u t”Ņ1[T±F÷(•-ßxĖaJA…ŗ½­½„)3>™·YILxÆŹ,ŠBĢųĮTĀ*™ ćĖĆjtĖ÷ß784 ióę͵L˜‚ŌÅśĒJ° «!!‘•T; #§ÓXÖŁHcT˜„ʼn‚Ö£0“ųµęx„D¤ŅN k$Ų±VĘD„¤$¾ÅaŖ¼éœćjkžŠ%5WQJIW„r#Q%L†z%ij”¬Š”Īõųń@BĀ%ę(’ŒRAÄRīē{F‡3Ó6½ŚÄ>ŲĄŃķ@³„ ƒ`&QT’CHød°¹1†”6Ęé‘X¢~ō¢q[Ģϊī9Ib¤Ń—ļūŚ˜„čhŲ#é@N8 €Y ŠxĀSM ¹L*Į^¶Vɖžēøŗ Ə}i]J•+EŻ$rL [Ē-ńXŁÖBˆ¹K"b`yĪ1 € •*1Ą)Aš-Ž«N(ŒćT®ė&iėmް|*RøfņösŠEĻu‹‘īÖa×q(`źœ•Ē„I’€ø½vUu›©øŌš˜ųLį#;€u£,Ó*ÆīsV9Ÿ£ŁR™Ēž¾WōG[“¹DŗQŗ®åPŃ#ŠVœ=D,ĢWÉyžkwTEź_öRTœž‡ķ“€ĄZ²ń*¢ćVĀ­uØé E4»®§“ń‹0Å)¹¬é¦bC®„×U_²ŗ>]¢{åŃĘ”õFŠ&YŽÜ:3ˆøĪŅӂs“„Ŗ5Öudż³óųCǰ$+ĖqqRGbT„ޕ㠂ˆ­­Ķé“KŹÉ*\½vŻŽ½{LŒ\~ŕ8ŹJPĎčO§œrĀæż×’ūć·Š˜;öĶēóĶ™ōĀe+W]ōŅĒ{låź===£»ę÷v‚ń-K{Ź™šØß·$ęGxŠJP¹1J+ĆĘ_i ‘ĀŖŻöĆFųŹæ0A’¢„żG†OڰP±¤•ˆA”ńńń7Žs’} 5DWCĮ?p`ßņƒž¹³Æ|ż«/¹ā2A…ā0ś¾óö·¾ī ###ßžÖŸzچ5§n$d"€¼·ż‰‡ļ¾ėö¶ŽģÖg6}ėgælėė'„,X@eäµox+"ŠÖĒTź6,•-B¾:€W“Åidƒ–¼ēŸ/zżFiŃHt×#÷\÷‡ėsļÜœöw/½‚4°ļŒŒŖLŗ}v¦ĒØ"ųoøōMĻŚ;V]»jé’|ė‹ŸyĻgҤs¹B:“*0LłżŻīčmÉår§=ļÄy³ę0BŠŌD~¼¹+mø0::“xĪŖ·¼ź‹²ó@*¹ölŪ©'­{śé§ŸŁ³łhįH‹ŪʨА{ą™‡ßv[{óüžžæ»ü*bR®ćxąõ«Åķ­m—\pĮƒ>x烷¾īeÆq(͌Škh¢3DU…‡@ 09^Ōj||¼½9ū¼ē=ļę?ßł–·¼eŽ‚EÓ×¶/_ƒeŃÆFN• ‚vķ=p÷ŻwoÜøqĪģž7¼ś †½:¶X„ šå`ßĮCOmz‚=ævß ^pŽc­‘l”ĄūģÆ_枙7?¹ł±'?ė/(³’ž;v\ņ²—½ö5ÆBˆķmmŒ°hŃ¢æčEČzĘuwwŸ|ņÉkÖ¬ą}ö2˜žžYļ~÷;GŠ9ڽ빖lÓ æżĶ‡Ž’¦TŚvį%Ė–jĒAžŽ¾żā‹/yvēęsĪŽˆģ;č"+0“J+ŃMnsS[wēčččXnLe[Šc---}sū,^Š;wv:^·nŻŅ¹‹ Ą°ABO`ޜy7’éęV­8² 60Š…l¦És<Ņd@²MMOoŻŚ?wn’œyĢ¢I)„Öę68ŖTŖ²ó¶V/īĢĀ«7½éMļūĄmˆõÕWæłĶ7ƒˆ.ąQ#ĄC=ōO’üOc|ź_tŃKūŪßGĖZ³*ˆQ=-QŠŖĒ%1FkY§·]i—æ«^€ŠxF1­Ž(Q‰žSŃ“2[šl¦*ØÕæė2ż„ņŸÅ…ÄĀx!•JŁ5(ĒG$%³ėŹžÉŠaMų'%Ģ @ A’Įˆ„ønœŗ\?õ}ßq5"°a›čF0cbT,‹'x[EQ¶Œ©»Äź‡*tō–šįbÕFtŒ)‡E’oSŪ.w„ Hļ!×½Ä=‘ź%°S£¶]PĘóJĘ/E—^я¢üųcšś@«n»ˆ½%bź@ė0PŒÆC°Š ĉԷ–žv“vŹōcŗĢŲ:Yn3×ŖšrƒŅ\uņóȹ³Ž2y-ŠŠ”ūvÕķ}ŗŚFõŹPń¼ÆÜ ¦dW¾Ŗ¾`ķt˦ ’žŽż4¬ž×Ļ?’Ŗ”é*¤%z'fģs} J¤ ¬z™ō{:»6?ń䆓O#BĢc#ƒļżĄ{/¹ōĀ;v,[³J@!¦@,Œ ˆ®ZŗjÅӛ6·4eśƒ~nĆYĘŲ’vī¹ėŽB®ŠŚ•}Ł•W,Z¼4—7ĶŁŒ= 3”6iEéY(> (:¬Ż”Ē 9¦«©ķŒō‹ Ę`ŅYę<”}tlllbūä\XčBĘG)E]TSŠdSKŅ-ēo|ńļīžKK[ūņ•'ŽƒQ@J{¾Ą˜ķĻķjq³PąKĻ}U :[Ø„hŠi˜čoé~zų™l:ŻŹ™7¾äŖ•ĶKZ” Įę4IQ†Œēr491¶õĄ3 öy"GüæÜ’—TsÓĄščÅ/ź¤ĶÜE  ā3¢dJaŗ%/zó¦G÷›#ijĻR: ¬R§ŠńēBT#åŠĄ,'“u_~Ł„[·nEDßų¶n‚ą1 ČqöŅŒóæß½ī±'ųźW’'q9ōŸ_żŅĒ?ö1€¶L*óƒü@Ņ'®9qӖĒX<ŃE`VĪ’L&3>ü$‚č\!’¹’üWŌÓ“RG¬ńb±čg2*RX ö 8Ŗ£#ū÷ļkkkŻ×£ŒÅsQĆG¼Ynlll÷īŻG¹ģ²ĖlŽAȾBŌäöõõ=ś—9sꄖ'“zõźÖÖÖŽžP€Fżą}.^¾Ä=W„@!jĒuŅ©į±ŃgwīŲŠŁu芔b±ŲÓÓÓŅŅ‚ØH|oßs»Ņ®ŪÜŌ4ī<ŪŽČĀ̼}ūö¹żóˆeųŽ~ūķŁl¶£«kĮÜEČ`|ą¢oŒqR)we›Óé¬{d0wųčį¶ls¶¹EĘ&F÷ūß®[·nŻŗugžy¦Żń*Ė÷+ ł±‰åK–¦›2čj p„EČњj°»`žŅ¦¦&GeˆS µC‚!ć|c$ā‚Z=^ ä+„Z§Æ•`Ł\a†tłå—Oėt+ė,ā,»vķ"¤PU3“¾ųÅ/ęĻåN„>ӆvįŲJ*‹Ö:F«¤m5/%Å&¼Xjžļå~HQš+0"yRm›–ŅO0ió[ā9WīuD}¦ØžĒŖ ”\Ł£Ébč? É&Ō…FH2zŖ0Ņ„T¬,«`)µÓĒDŃ ‚CoüĘ*lÉ q*7*·~QŖŅYĆĢS£É|®N§„Y Yä?V‰¬j¬§ĒVva¾ļkŅńŪÆVµ«žHąµ£`~\ā>žKWV©Ŗ§FĢ̬“ʘ…2»•­Uäƒā僊³ ± S—¹PĢŹ×KōŅ`Ź'@˜^j™‰Ōųq±kÅšUEźČõĆt\i¦õ_Q=“jźˆ‘s£ ؀R^˰Œ¦ŲœćÉ|­Dāf§hbŰßAX¦¼Ó„¦cćŠk1¶¤~wņ¬ś„óclĻÖU_ß`Y¢25opŹĪų€Æ×K-UZ•ŽoōŠŠ£UL*CÕāb‘F‹u$Śr˜1óēĻ™ÄĄä“T„ %š3ŁV𣫒MNŠęšż}M>(01⫦˜”Hćū…0;)×?ļyĻ‹Össs`D,La 5b@ųŠk]H~ņŽŪn»ļī;O?żō ^ņRL„µÄĖÄłās;wzņ)OmŪ‚ ‘Aß>22²s```ÕŖUäd0 e!*Ćž%]üĒߎ°pįBE”„³¼į†DdĀć·æē}Āi· P˜ ]Ėl ZžQÄ/t*"@‚ lz Aµ[ Ō&6ޱFyhw7I#ßgOcOϬ‚*rZ0-x)Čøā h0¬”"–!N!’ī†5§Æ^“ŌE½yĖcyš¦ĖOy ˆPžųw?}’/oųåš·“µ6JƒńĮ˜élėĪöīŚµėõƾjŁ‚UP"i?­Õņ… 6=ņšģŽY>ĘüüŽ3‘*ų¾æīäF7„S©T¶X,Š¢I“Ÿ„bnühs†fwµÜvÓļO|É{‰­3ƒŠ‡dåZ‹±=ĮßqXµfõS›ŸŠbg՚Տ=öøOnz„ų¦8<:é1oŲp.į·:ZzęĪ»ķŁM‚y‘ńM›RŲ-ā‹)“vvNNųłüHS÷¬žĮÜ'>ś)9®r„!?첊{fŲP š÷ųDT,ūēĢ36mF,G‡‚¶gŪÆ&„Fü‘±įEK—¼ä¢—2³&eŪ ˆˆF°pŽü#µµµŻxć'ŸzZs6³ż™mszg+@AĶlĖi'Ÿ* /<ļ%`ćQ@>zōč‚ 2™¬®[wāķ·ß¾zÕŖø™†kqU•¬c‡FƳĮZ‡<å”VG\-®B5­śK›Ņ0Sѳ{=Ļ옯4ž.9¹‡Čųų™¬† ibŽö”ļ aō5QKkÉöé§-ž@0¾²°Ā@"B…ÅQ‡@4Š{ŽłO?½ž¶Į#G<££w#4@ģ£" Ä͉Cg{ė8Uuce@$Rˆ¤HŁŃžżū! MC­Ü©FėŸÄ蒈äsć<|’¢E‹īøćŽĻž÷×Ä'TÅ)z¾p±üŁ=½=ņh‘pšĄ‘Ž9 H«­Ū·n8ķ¤ūøcåŹ•©¦, !0YńJ£Iuvµ®[·źĄ¾}×]{ū‡>ū…Ö– Ų½ć$N_ėœ@P%ń“1‡„~”ˆ £A‚Ø;Ml5ņ*ėĢ„j1’C­ |~čšpžŠ”C ;–H#d\0Dšˆ™™”*@H«t»Źl>>éyfõ '2ˆÕb± •ć(OąīīĖ ¾1ĻlŪ¶hŽ|še£ļ'&&ĘĒG7n<=NONŽSG›Õ)€Pw#(Į °1쳕u•ņ¾ÉŅa ÓӒ@D`žņ—æĢ!¢»téŅrÓW©4,ؾĻZļ'aīéė{ū;ß)ā#Ń×6=łäI'Ä,{÷ķżĖĶ7æųÅ/†éĒa ŠĒK>\ó}’jÕĢg§†O„j u„k+=m‘¾G©‚ōĘļ*  Ū™MRlć9ĻŌ@pżß ÷UŖ}Ą[X7Ģv¬“=_Q֏ ®Q"ų~#ųAˆśQ„D*FJ^XLŃpŠ» Łæ%‚Fp ƒ¹ ’øKĄ³1rxg2™šĆT1ʜ†ģB. ö*ßó“ćYĖĘ*¾ĒaˆÉ®a"3 eŗ ¢L …t:1Ņ‘Ą÷ŒvTXߔZ•€Ng1y„Xj±„‘”Ź~%|ųȱY*Ŗ/R‘ŹĀŹķqŒ=21®°VoćU›ģ1s.—kjj²W•Čpź$ǫ۱Įßæ›¦&™2 E’SX:Åā'f£ˆ­³:.#“8 l-C)…uK±e…›ŗæ9ŽwĶ:¶āoü#ŖVO¦›ķ'Sā³ źōūŻÖIėk¶4,QKīøģkü«2Ą–¢ņŠ…b>ēņH2pä ˆ(­-^éʼnQ5-r ˆ¾Ą-wŻ14>®²Ł„ĖW܀±£Œ0’FŽ™eĒėLõõ ¢vĻór]·˜Ļ1sK& HA§™=ŒÉžULÕŃ$błŽ[nJ„R®ėlÜųü®¾~aˆģ×ÕĢLh„Ģųųøˆ,˜æ¤sNŸ€C#W’ß÷Nݰ~ī‚ł=Żs𣢩i!tŸyę™yóūSM)ńŠģMŖ[’ņĒöõ÷÷/ģŸ†ęóE×u‰Č3¾Vņ¹D3ϰVŗž‚1ā”d ˆ!8¹Éb!Wlmn[¾d•€ū‡ų‡ĘŠY‘?v_ņā ’|ĖķEąöĪīĆCū;š;Rł”{øĶČdw[Ē•—枊Y™p(?“ļąNùG½Æå-Ž x’Ty8)Śø-CyĶ•E~|Ė#÷ŽwūÜ%żiķJŁUEßSūö yœÉa‡Ł½wļܹsµĻTv!čŖņAŁ1 0Źutčb8µ²Ń¼źUÆKŠøųe/v“@]|žÅ.{ÅEˆ,`Šg£HŁČ-›™=ēģŁ!2ą€°F„޾ĪeĖ}Ö H©“֝ˆ¦P(œsĪ9¶{yFõ/ŖuŌŚl>Œˆ¹üdKGūŲĮCŹŃ­­­J!0¢&E,"H”ĆžĻžgÖ­;ńȑCCGzŗ{0 /,ČlÕC[Z[=ßommmoogęB”°}ū6fĪO@Ń+j­E¤ææß+äž|ā‰SÖ­C ‚Šž®Y›brr¼ŲŽŚÖŅśūß’¾v"(˟ӓ`Į‚M[·œzź©^p.źƒGęC‡ļŁ»÷Œ §„R©¦¦¦ŽŁŻ‡čźXžŽæēĀ…ós¹\:ć8Ž#\“įc±XT€’šÖž5k–C)&Ą„‹–vµw„““MgŠóŠHŠˆG1ƒ‡<::Z,‹Åb[[‡Ķ9ģH3³ėøččT*522222bÕM£ŠGJYiV» ©˜Zo“k5˜ ÖŖ«"Ą“O>½|ūöķK–,axSśUT¢Ø(R_·æ·`įĀY³f:t.¼šĀįįįL&ƒS92$ T8Ęχ*Ńł±Ÿ\ńŲ"r%-m‰°Ŗ¤Pq ™Ė)„ EÜņ4@Pź°•Az‘xZ·S—²OJĄ§U]—*³b‘2¹…ŲŠ€ŲD.|gĒŃ6Ńr]7ž¦F½µ‘zS‚ ]5Q© ކF„\š”X,¦RnUÕ°8/W@jµVZāFąx”Tö 8ŹČĢ!»¢ø|Ģm>ČqÅĀū’²«²njµÉ ń*ÉÖ%F4Hō–g2Dš¼ k“©ÅO¹źÜ#¢86XÕz•mŸ‰r“<$n&L€b«Ryå#”—:ƒ¢JsŌ®_us‹¹|Iā—mk4e2™ZqcżXŗńĘŻ˜uAŠøsMcP) \?lšY\z€ ĄĀŽćtwwēóy…ÄĀ®ė3)2¾Æ@Y­|ŠŽb²»¹ć#ū¾—I§Ņé“€FŅ"HE Y›ŸfŻŪß70<øw’AÉ{:怹];W-[NB9 J„A(F ; Åö–$×7²ž¤SF‡Ē²™fréÕW]õƒo}ŻU=: µcGiK¦ ķRRnŹFriądp”Y!‹omĖ¢:[K0Pōęuw555™ńŠø ‚¤@l'*"dT ¶-kZzīēżļ5?ģiߎŁóx÷ļxTwwõ/oķé‚ö¬Ū¢Ą1€(Ŗ-ŻéåqŃ‚Õ…I:­!¢|2ć³²jvgĖģÖV&€ ¬X¼“`¼¦“ūņ—¾“Ómź×­0É}³Öär9ŌŽŽ}»xćÅ0·oѬ–ž6i@(ņQŠ¢  B$o#ńT3ą3"‘«S09į½łĶožńO¾ļ8 €uÕÖØ!jrS,ø.jaåĄ§?õO|⽊J(=(•J71ų¬X$k„3;t+ 9‰C"“P###¹ÉB>?ņŲć¼šłgʃ²ŹcĮ0 €Ö4xxpĖ“[:»Ś÷ģŪßŪÕ#„¾°€É|ެXµr÷īŻķķķét:“Éœ’ās …¼¹sP”«\0`śęöķŪ½§9B6>)åhšĢÆ]·z||ÜUīī=»‡ĘGFI@PlŪp*•ņ¦Ń ģ‡GØR'’)WR²żRDl¹3*Ü\Ŗ²\ćm•„ÓŹFŽK>Ó6j=~ N垓(4Dæõ«2"Ū×:7_•@†Ń÷UÆŖńńą}³O µ&1¶@S™ōčäŲ²E Ųæs'xF»ižļčīĖåļ¼÷^4˜"±šƒ&ūAĪj„Y‰En"”!’ łŪV*”ąylcPyS(ČŲ¶ēžŹe×w”Õ: lBŃN>±^ Z^qń'qbrßżńwŚžXųś?žŽQ>pnķŗX4T`|ą¹}ū‡†Ē‡G&FĘĒ=š  …£}Ž”±};wnnžåyŅī“(T(Ų?«r|Āi*¦²pń ē\“ś¼õKNŽIēĶž7gŃņ%kÆ|įóĻ:żäē­_sR÷¼Y-]ž086RJ£r€@Č0PĀ‹ž oz投k•NwwĻkiénkė]³jõÓ[¶¾čœKŚZę8i5e[{›Öœø!ŪÖ}Ņ)ėų¾{ŸŻ»Ø½­ƒHQ*«3-óę-×ŗå?æųš2Ł–®ŽŁ \å6*EZ£óōę­@ĘéŒwC‰}A܆4@[f³ ‘Ī8©7¾īõ³ŗŪ7ž±a`ą0Dąˆ QIK`ē̹óĻ?{ƆfĻž=>>ĪĘŅŃRˆŠE‰4»ī“O>Ł×חĶf=l8P|n÷ö{ī¹g÷īCVOģĆb~õźÕE6„ʱķļŽø÷Ģ–ķ»÷ķg€SNްfłź“›²¶)€‘ŻŒŪŅ’}ŽóNkiʊ1 †7=łd{[› Į#¦čuwvuĶž}ttŌ£ ˆä¢ŹėbEkL|90 žDnņ/·Ž2‘›\·vmJ§l„Ćöū9ŽĆģļŲń,tvvzžg+ Ą°!„uėÖĢīķó ÷/Zč a`#€,āGt>Db8x(ŃASB(8ģCĄį;ācC“²Mū¢K^Īį?/}ŁĖ[›[Ų7u‚ĖŖŲH"vu !`Ģēó"6‡äą‹Ž_Qš1ĘGµ¬lŠ!®ŒbŖĮ"‚BVJx3G‡T”(ś¾lņ‰x(±€•ž Ž d) ·µņ?$‚bwø²×¢Dērą ‹%ӚŖ$ē҇ĘP«ų›WöŚE{YšTq/į•Cā²ƒa7ÕUš l¢g}Ą÷MŽąū›ššJWMČF˜Y+²­öƒ£)ņ‚ķ2@`°—fæf5!ˆaöKwS‚|9Č-!Įµ”ķ/DŁ—1†}!$‘20Õ֎ķ?Ņé4 襬6ø*` rĒNc„“g‹m:Ž`=œ!Ȕ±Źå„H£r4 X»c(x¾ē)ÆQ %.ˆ1a*bDŒ„.0‹Eū_c£ćʱŅ_ŃćSšP‘ż\N0Ćc3«X,F’¶¬ŌZ}Ģģyž„ÖƒDe3 ؘ.Õ²‹…JkĒ[œ ŗ”?ø•Ž'šŅQ QŬT59 Ÿ,?Į:ŗr5y ń÷·©N"ČOģ0‰Ö‰Ę Չó:ÆŲ¦½ŖMUµh½µ6¢Ä]$žoenR ›ÅśĶ!ņ ĘHåGŌzŪEJū °Ä°ÄėaD  KĒVä2ˆŹKbf`H(×sŌ¤£­,ø¼šČĘH– öĒZ½–S,ž3cÖzīAhou#ŲŻ!ŸĻūž©}ŚUK­+W‹ć8„ΓڗžWśŖZ¢ˆW#¹eÕEU& ŅpČ®•>ēģ “y(tōõ9 ä #ūlæ€ J@   wo®oŽ|'“]»z-YŠžA†ČO†k¤šõ…(f* Óō‹#æżķo£CōÅē¾°X,2³ćjcLtpz¾g?P)؜£GŸŪ¹{^’|­ŅĄś ”ų Ę|ū+_u ÓZeŻ `N·Ž39Ī Œ: Ą$†Ą0>Ąc=üč¦' •jīźš³l1(­gĶīšĢēFF‡<0FCĮ Šƒ*8˜ €†ōA±ń}Ū€÷Üuw1_ˆ[6tˆĢśR)ĒG(ä}_ؘjK͚?{µ‚C)#Pš hćk $H Gģ+£š!=75÷äkī9 ZüļūåŻ{oŚ1¶)/“sēvÆ]°® :³Ņ¢Ņ€³)^¹|*>xxŸFŻYābµtpčąĮĮŻMķ©W­JA: ŗ™œv•YŲ=ρŽ}»F& ķ.j¦eMÜ×Į½Ü똾,-ķĘ5}ī‰=jI–g9’C!0Ü™É8 @|aĻĆŪŃÄšÖĶ[žyśi8’ĻåĘFGwļŻżų¦Ēxš‘É\Ń÷ XŪHjó“OŽ>öÄÖ¢”ĖÆøŖ»gĪŲÄøˆWąBīĄŽ=`üB1`r¹ÜįƇ•rtŖ}VŸŚ/gµŌ‰Kź”ĆvvÉwˆ# /›xāɧ¶ļŚišŽ÷¹*U,x™tĖ™gžŁ5«C‚Štuu?žų“ƒ]]Ż"bŒģ~nÆ1²fĶ:°yóÖɉ|&“±‡ P{{ūšščČȘE\}Ÿ`rrrÖ¬YG±UÄYkWÆyā±Ēļ?ņģÖķ 4 –`™*!ÅZ3±.O„•ńŪÕÕµf͚ńńńŻ»wSDĪ +}J©•+WzžwÓM7Ł8IÅō65)QH»ŸŪQČMīyn‰8 ˜¬Ö Š1āy&Bģā J”P(<Ę#ĘHŌ7Xڊ£h†™ƒFe@‹ÅŃŃŃčY_~łå0 j«ZTļpżĄžÅę ķgžy¦0#0”%ZĆTŗ ‘lr‰H‰Ó£V½¼źŽµMDjÅ‰–Ā:ŗÆP×۳沭$¤VźD·õ£įjoąū\(ā8q¹-Łł””™¢`øDfŽęa˜Č”Ńb£ąŽ~Å«ŅÉD؜ˆNDGZĀŌ®ģR„”śFĆĄl£p ^… µRŠ’Ą|¹›q’ȍ1³¢F £°€ģcį!"¦×ZĀR€0ŠŒĮQZ!‰ß7fžŃ(“RVŠ›zž‡ˆ¾g˜T ”„„Y;Š…ĮVė¢!RJUŒƒ””µ‘o“rė—FŽbq0³źņi¤žkŻ”ķ³ŽŒ»ėą{Õ‚D3SĄuŻ ŒŅHŠU#nī·r+«“·µÓ{ŗŹĆ eƒ“¤TąžrfFKÆ*ģY‹]ߓiZ¹FŒ×ŒµŠĻZ6KP‡ŗ\ć4‰ŸMU)Zu¹Å­s¼U’¾ž°×Žź§›ėUŽŽMˆŒ1zĆxĪ ”Źd2яŲhØjWpÕ(įÆĒˆ˜nuCW2]Ž<~é?līY6~ōHWĒ<ĀYγb+£ €$ą-!‚˜?ž‘Į!JļßwP "ŠĮĪ.ČcTTæ“a‹‰ž“šyē®]Š”ŻvvīܙĪd€XAa@Å©”*‘ė”ÓŻŪ„ /ŚśĢӇw虿„0ņėŌŻńēŸ]󿵫—÷öö¦T48šņ“NZuŹśgŸx¼„={×­7]ņš×yčFš¢s'ņ“ĖV¬zā‰Ē^żźWāU@ä¦ßń’šõ/U”|’k_|ó?<ŁOtś!‹BbfVTņ”U˜œuĪ]wßeuh€M@ŸbᨩĘ—+ąŖŽŽŁĆć¹l6‹éģ˜4`,C¶ (éHh”Įr^qék!’ŠÖGžŚ¾uĢL“v7)®œærĮ¼„>¤“Ųƒ§ņn{g÷‰įysśSŁ“Ųq(|ŲüĮµ?yn’§)µfÕi­ _ü,fßpåæōż/Ļjk’ŽĻ¾÷Ń·|Āj³`dN“‹FŒ"%ā3 …>ŲĮé/*-"ŠĀ.RDH–_%ę ųįĻ~ć?>’„O:łŁm»Ī8óʘē6m޶m[6›]æ~}GOó–-[\Żö®w½kūöķX±j®QpżwüéOjkkٶmŪ’õ§Ķ;÷±Gր»wļžß×/Š’üūēĶļ’äG?ō½ļżļ§ņƒ’»ŗ·« ¹„~”o2e@ Ō^ļ‘8Š@s¦õ‚ó^ņ»ßżAŒśō§>ūį~D»-0&ų\­40¢1¦¹©ł’÷æłļ įļ’xćĖ_z1°²iž‚»ļ}ą‰ĒU+–ƘÓŪC@ŁTvąšŃ{īŗ÷äõ§ųƟČy³zę“““ģßææ»}–ćŲµ‰kO6qĒwœž©i$ńA!µµ“NNN¶“¶ęŠ~ÖÕa) ‘4’VxĘĘē§\=9™kIe¢ųž™‘Ø·§'åŗ£Ć#æ¼ī'|üćʀDĘĒĒŚŚZāF2‘éh:Ž ƒ‡5аµČˆ×ЁÄ7!‡Ž8æ¼īwßs7Q*•zŻė^7„xR e,˜ö’–– $fžĀ¾ “F ³Y¬ƒ*d*•ŖeĪ”œĆ!„ÓųF»*q~a‡ė¤ė‰bб0/ CZ©õŲw ūs6Ā„¬¼rc$ Œķ\К”J'ņįxjש'¶B„"@Ŗ\:ģć­QR‰£‚PÖ› ×FKƏ–NÄFŠE/•v£W"@ԃĖF¬“bTlŠī=Ń!\"Å`…3вÜk ¢w‘Éų>źØż^ÄĶ„‚[VEW MXyEĆ>@“MŌAį@@iŠņ|«že+“¶Tȃc™KTµ[B:Ęɜ`§O™€Åę[µÖ÷é|ŗˆ°„I$2øalŠŠ°žUY£źŒŅŖæ Ä>9j`s«EŠ=–&ŹĘŒņs$®„'õGõųX]ČŽmFµcģųˆ•Śõõ)Łók\-—¦+ļÜĘi˜D4Ҋkw$=Ży`łW‘hšą$9(3øŠcļģ=ŽÉpÕńŖŸŗĻģ戠Ą~’œłūöķĖsŹ7ą+"ĖdcH)()1(F8å“Src#-ķķ ā# )e€•¶ō#¬ēa)ģG?’„™ć„Sš<óē?żé¼óĪŸ4DŹĪĢ€DˆŒ™»x¹NĪ+Žuß½{öķīY°$Ŗ<“ė;’ó_'¬Z9:|ŌAhėšĖc“Ŗ9CL@üž~ų}o{ÓŠšŃ§ō¢ó/vfuƒ8čū¾"@1ßüĘ÷õõĶ/ļ’HŲĻ °īēFG†:Ś[®½ę'馎Wæķ@ÖDP!‚Åš|”4R¤Įm ƒ Ÿüä'ļ¹÷.›Ūū½ķö[Ī9ūE”{Xf“…€—AčķččÕw>pĖ ž¶ė.ĢX"žķįF@p BCˆĄ>ˆ8ŠšŁ§gĶ¢&ķtFuueĘĒżĆ;v®ź]4[².ŗaqĮ72ĘÅ!/7œ/Œ ™ńܤß⁷ß¾}Ū=m‹[::ĻnzxÅŪ>ŻĶŚ P*Ķ'-^ÕŪŁ±k×®]©Ķ·l»õEĖĪk2¤•B!Ć į`ql’ĮóēĻ×¢Rč xچx\Öč£5 QHVJ ¬5³šēoøāüŸ³‘ĮĮĮYŻŻö%#ĆĆŁl§ÖĄP$$›œyJ +–āi'ōžvĀ„‹HdEƒÆ8{a”Ž0ĆææļµC#Ćķmķ_łü ÅĀ%ŸAŠY|ÄĄŻ§{\5øN™…H ŠīļéZ4·g蚎½{÷žäĒ’ūśWæ6ÓŌ"hX+eß}’ž}sę̱¹±¦ޜ¦¬ĖRüćŸ~»råņžŁżķ٬ n¶l{öĪ{ļliÉc^rĮy™!•IÆ;ń„tF[*˜VŌÖŃŽŽŁ169į¤SJ!3ahjĪ>»c; śØ‰:::¢ÜGGG3ĶŁGģŌSOćk„=ßŪ²eK{{ūÖ­[ĻŲpŗÕD2b>ö±}éė’9æwžµæų‘ń^¹lɊöÖ,8<"ą]{ķµ>ĒĒĒ_xĪ™Ze”£…¹)›nʦĒ™;w.’°XU`Ū'‚ńńŃĪĪöė®»öė_’o­ÉŅŃ*H(€–¦ģ…ē_pē=w·6·žĒ|žżļł€RJŽNģŁ³ēÉ-¾ńÆRbc…v©Ō( ō b2]‰ Õ 8Phоr5<³eĖ^’:TJłĘ±/6lźōtMyœUv¦XĢÜn&K—.Mt”Łx=•JU=Gā]ʉ–9Af0ŖŹÉCėQ׎”ļīøtm5bŠqķ®C„j7Ē£ź|®RQ0 Āp*iöĔŸąXņ%®L\CsØI59IŖ,ø¦ōk)ew2—‹lZ‡¼Ø’æRØDE83„Ö RŽĒįn„it„0 P¹‚‰Mõ­go¤Zl ¾a+„@˜”ÅE”ĆG)‘yoŁj’Ų䱯Ɣvt¤żĘ0"’BĖbĒÕq:PŁķW½S®œK¾ļ'įZSŗ–aJ#ʵ±G€ 韗_@„Š*”ؐ²- Ģ –ਿĢėŲĒ{Ø/…čŽĆ5]ĘŁT:6¶õ%5źČFL榟;PŁŻU: ‚Pgj³Š§7ČXŻū­ńs'0Bc‰ŁFö„Z)zĀĒ8ź˜‰¼V¤ģńHĄFDlĮuŁf„€Ū±Ÿ»ĒėØNHĢOūb¬mÆ"Ō*önף“W”BQg\A“\_ i``R·c_ў=» y|ųhzÅHķŲDKütĒZTv‹'æ ĢUąņ+®ųłĻaoćź«Æ>’‚ TŠL±ØČ1Ę­5*²š*Š€ćžrŚi›ŸxdĪģ¾›’xćŚkR­Žää 7žś[ßśų’šÖ·ÜsĒķ»wļ%ŠPtŠķ_²¼łŠ­>qß}÷½ó]oūĻ’¾ŗ¹«Ųh’‰£ƒ—_zqZ;»wģ|Ū;ß MY;ØלrźßæómæūÕ/|ö~yŻ5Ļ;cć¢ÖģŲ±}Ń℈hоBuū-·tŅI­éNĮ±Ö€$ģېH)4FDąļžīļ>łÉO¾éĶoü„CZ ¦=pĄ+xs.Ų¶mہĮķļūÜūö±»Ŗ¹‰“gĢšäŲ}÷Ż·|ɲ‹P HPĄ8@M¹ąŽśämŹqŸŻ¹ĖuŻ ėO_ær£aĒ…dµn{kļšĄx~Üt“4F„yīÉߎvĆÓ£;Ę&®\ŗī£_ž§>g€‘'£&i»šĢ‹>pĖ'TsĒ~}õ3óŸ9’yē-[°ÄxE1ŽŽ½{oü®?üṉüO~šÓ¾ģlÅ.jŖ„Œ  Š¬nŹwo…Ø kE]ݽ¾DTÄmķķ"`X”rGųpž°ķ^CŪ­-ĀA~]’"c¤£­ŻnYi7cUźŸ©—mæ Dź§ėׯokkūę7æ™N5ß}ļżžOŽ“Z¹bķ¼¾ž»īŗėįGojJõ«_DR€H)ĒŁ°į¹\īŽ{ļūŅē¾²téņu+W‹ą¾}ūŻzæēy³zŗ-Z4oö‹Āē½üšŲ°ļūų†YLĮ÷6mټnݚ„KGW£vļ~nįĀcć£ćķŽ£VÆY9{v!0ų"’óü‘ń±£Cƒgæšß÷3Žk×õ¼yó{ģ±ŽŽ^TÖ~ é¤OŗņŖ×Ž’żC¼ł–ļ}’§iJgvķŚÕÖŽ¼’žŽ¾Y]tQŽćT“F$Ź„•ŗżīŪĪ;÷E)ķ_@£`aƒJZ[²(ę5W½jļīĖęĻ5N;£"6¾"µ`ŽÜLź»wļ:ø’¹ÉÉÉ+_Łé§oܽ}·«§Ÿ~śÄõ«ßųĘׁ1F‘"cONN¶“6¦ÆŠ,:•ģėĻ%ōX’¾UģOAJI~ōcF`Dõ—‰Ż[,ŒTG”«NÕĘvåĘ8UVĢe|žH#€•®G9dU!°~śšXČÓUBŽ^ĻLÜ1\,£ ć #Z;|ƒF³3ó[®_°K0رaĒ»Äf>­ļø«v’Õ«Ūs¦Ė>8v8³Į©U9±§ǧxüž‰°¤Ų0,>­Bņ_4nP~mjśČ“”±/cFĘöƒCžČص߻öÖėoniiimĶ®]·ņÓ’žl3°ÖDĄ`<ąń'pæ+d2€Uć@l9%“łź b.YĢ(²ŒĖ»ŁŸ\sĶ5›7ŸšŌ¦Ķšóė~~Ķ5׀r]P ,Zkü@‡ IčcżÄ‡>šOcCƛ~ąß?śĮŸ’ūß’Ž÷‹ŽššŚ3Ö]öĘ׎r×mŪöķž?ĻGĄń€ŠCH’ņɏ¼ņ²W Ž™”¼ćÆėźźZ>wA&“łóĶ’Ba`|lѲ„Æyó[•AEÖąG!žó?ŗcĻsßuÆö^vž‹ĪxŃŁóēĻĻd[z{{ļ¾ćī|ššĄąÆ’»ŗOCDj€€@_žņ—’ē¾)ʈŖoūŪēŸ~0|%!csp×halčččEg]Łšš•`QDÉbt6ĆĪųčąöĻ\ūŁŸĢśŃl·ķąĮƒ£¹1fopxßšĄŃOõū œ%hÖąVØ;Uė+Næ(õIžĻ}uĘoųĶ£ĻŽ×=k®1¦Čc=|?)ž3Ž>THe Ą@6ˆlv¼ĪicA+¼#ˆÖ“@ؐR$ ĀW[rCˆ€ÄJ•3cƒ‘ļ«aO‘BdLH Źl3ƒpL)4Įē Z±āø(lMŒØ¾ækP.ń„>ĢĢĢ™”»zåŠOüŪGnæū®»Ÿ{dŪżZwh&&ĮõĪ~į©{öģņYD‘0šš’—¾šąĮƒO?żč 'œōą}÷?žč³ŗz}ōQ§Éżą?ŲÖÖ¶aĆ—\ņ…S©ŌāÅ o»ķ¶üÄ$0#)…¤@²éT1—?zųHOgW:•f8øoÓS».Žīܵ}óćO¶µ4BJćŃĆG¶<µłW,g~†Õ &¤-[¶Ü’żK—.&0; › Ī{agGó}÷Ü;0p`“°’‰§wõōōd[³­sŪÆ?iĆÉ–/_žiŠEĶĀ>pߖ͛֬\qķOrÖĻO9)²ŠH̤³7xd`r|¢˜/œ°v’R‚ Ą„čhǰšūzŗ^š‚Ó8°åŁ­Cćļŗ’¦ŻŪwžsĪ9ļyļ›VÆ<BŪ*ö iĒac¢vĮŹŠ§ōmʉˆÅBĮu]Ščh—éķé±\f¾ķ¶Ū “*µŃjƒ¤øŖö‰tī“ÓN³F²°g÷ī¹sē"°ņłt:#ÖõšĮu5GJEŲŠŒ­žDٜk:h^ÕąéXX‚µ¢½®ŖkeõĆwŖöćŖŠwÕ±²Œ5Sk®¦ōKÕJ XŹĶ,Ń—ČėIaµ÷)%»IeZ™ i©!nŒĢLrH£Ó?üĖB" f_‰Ć‰ÉF?‰ż=uhų&ҳ„āėA½CˆTņ/¬ZTS2^~‚ˆjféZėx«sT`f„ÉųŒˆQu¤³•øåźa}9§ɖ§Ą~§kESy~a„šūōæ¢-.Īd>P4)KY-ŒÆ‡ćŪ—ą„Ufœ£ &(LÕžwʶķc"Q‹${1źÜZ(v@Döü˜5kVƒµtSõ‹wÓŽ*Ólš#1-!t²ńĮtłT1›ļ ’0°8/ÕG„ń©™ø’z‹gf©xåUÕ!:Q• §ø >÷wŸ588h8ף9ś,3 rDh¢w4h@ĢhD! ‡šéOī3Ÿś“ųž _rŃÆ}}«#”ęØ%NŹ2ŲĄÓŒ–œEf°%¼Gß/j­mĻ(R_łŹWŽżīw#‘xaŸ¬Ė¾ēŁż[ą÷Żż£|ﱇœ˜˜@P###ėO>éc’śÉ%«ŗŁģk.æ|ß¾} tē}¹Ą„l )Æ8>śŻļ|ūė_žjg{—ģh뜜œ,‹nSókßų†æ{Ū?€ėjÜH ”€ńī¼ł¦Æ}į GŽmiiinn. £££‹-Ļē^ó†7æö-orX…0: ³ēyēž{īŻwß#¾é¦sĻ=·rJ„Eƒˆ ¦Ąž8 ?včń’žå·}ß*h•›^±p~o[ēß½ņ]kē®ĖDG4Ą13ś½GžļŚ*hkk{ļ…’xę¼M~)“.Ķ,ĢRśČŽŻ{nłĖŻ.eg͚å«ĀŲŲŲ ĪzžĀŽ9œ~A;«ŁoÖ:&³Ŷ¹H`g!ˆ“%‰`©ųcmć Kõ—øp ǐ4KC€€[*Hn`\)A©ĀŲNcŹbĶBĮs§ŽHęĢ*…PŽ»UŚĒ¢EŹĘ#Do}bŪ¶m;wīœ?oqntR<ÕźÅ‹ę͟ŻŪēŗ.bfėĄld¢0±oß¾ŃŃńmŪ¶uµw,Y²$Ӝķīī֘R`ÕE'Šł#Ć©TŖ«­ĖEe»y' ¹ƒę‹ÅåĖ—k(•o ĖMööĶ) ¹‰Éöl 4553Īåó™Lʑ’ō®AōŒĒ Ē čżĢDdĄ÷Ł'ę¹½;ÓéōžżūŗŗŗśūēŚ&~G\qĄĮĄgȌétŹušP¬@¶R(¾Ļ$J)x`` ½½=­¬:°ĶŪls>2 #JĮ+ÉoiiqQc\L¤,QD¬u”^ēb¢Ŗ“ƒEΊ‘ŖČ#īš>^śTč–AĘpUÓ&‹Ē÷½p’H\X³ņżĖÜe­/ęmÖģ­,%®Jœ.ē3—³!‚†[‹ś]²Tī’UĶŲ6ČćBłäĻ~įsW\yåĻÆ¹:$ōÅŠ ¼ćŅ«œ‰b&§…]Įģ¢EKūŚ»z²³”ē¹ @ X ’ {ŜqMņĻ>·eddÄev]÷ąčH6›]¶lYÖmNc¦ [@€0*īźä€€caĘ@ Z Õ”;qłéiļ$%5üg6#‚u–Qńx/=÷ć5ņČÕ÷! ¦¢{UV‘kJå)h}ĄĘÄuXXˆ}š ~”I» ƽB”mU(š”›²=Ó„˜}›@ż¢Ķń¬ķĒE Ą!QŠBģƒ`Š 0hįA#"Ao —œ@™Ų²¬ RJąÄD.Ź(‚ U,łAóœBž¦o|"ŠRG–¢"š_,Óé,Ų…YŹ’|BP>ˆųHŹž¼ÖĄ 8˜œœtR®-©@Y‰9°6ß]Œ ą¢)jM5`ÄŌ*;\EŃų¾R*ž'ځ,Xmįß’÷oĄÆó›[n¹ BćMfxę™g–,Y³åœ”u­æAųĪŪn{ы^ÜŅŅ4:6‰óĪ_¹råŹ«’ėk’•›Ģ„ŅiČMę3MiØĄczrŽV‹bf²ŽŃ„ĕøM‰cF 5 fÓb{֊?ŗ¶Š”8qŁQŸp-'ŌÖ OžWtŽÕ°Yf#Ę'čÉł¾q%±ģ1!R¤”>ū¾ˆnŹ)åÕ‚IoUc QE«r925-—2ĄŠæĪp<„—ź)±MžÄ:'Gœa°×¬µŠD¤ģÅ© ‹į%ł¾„¤qRNpū‰sA …b*åBk>X³48`¼žÅĢĄBa{p”ō–§¬¶˜ Q1¢ģ£<¹ZJœ,ż„»‘­>Ų[+='„+](ļµ8x¾ÕR/.;@Ėg/—„ߩѢ(Ŗ`“@„O,‹QæØė«hąWµę®(GÖ®ų’·w×ˆĢžLrØč5‘¼Ö̚¢ėg¦›Wn•ń_3Ęcģƒ›:%.=;œņ\ˆ÷VÄŁõ3±ø“6N“8~9pĻµŪHŠ;hƒšVJ\?€ˆ,|Ž}ź7(õ<­€¦‘ĀĢtć¤h@#ßóć…_aĆ̱?Æwčīʞ`Ļéė;|š0 \qł+~üćėT†)‹Zk­µķ[Ć^" B‰½—P¬źA±Š”¢U0 §~ *FŪKłĆ½CK;AM)“Š42ē‚4FĄ(ųąūPČłcBĀĢI«4‚K¬¹.¤ø6”2Ę8ŚńĻŠöä\ųē-^¼`īœžæķN¤•·‹XHc¢ś<±>qõ'žŚ³ÉuŻw^ō¦‹N87kˆ­Pv” 9SQ d`0"h¬ļ„ˆ0`Ą Ś2­Q#h Ł÷}„ō’/e(iøps,MÓżÄ²C9vā˜XČį4²Ŗb׬f|Ķ•įéƒŃʁ|Q÷Z'Źp5sdŪSžBF°Ö\„^# £ß `D? &Z‚ kMõ·ōxPµE%.žgцDzęū¬TĄ5ƌwtt ”"$ūõ†×æį?ųA% :ĆJ|µ8&ŗžĪĪĪ””!["ÄR¬h˜ća„„ų˜ śk<ÆćyŽU¹~Q”Ū6q†kj&؋TS… SÉårÖ£± ]§Ņ «œ”Ģp‚dÆBBɾs˜]—%lŹh·QZ_¾Uļ7žO{6Yo„¬ŠĘX ĄĘP¤c)Q³«Æ“¶ˆMyĮĄ+śZk$0>«ø£Dģ¾Jé«ÄZͱ,Ć·ė(\ĪĮ]ū¾ļ¦œŌLó<Ä-#᮲ēFå;§sČŹKŖń’V|Üā[VżT!Aˆŗ½Äp0VŃņńƒ"īÄÄD¶­¹”Wk½dEUčBeó©Ŗv‘HŁę[öĘƶ˜Ś6–ęg8>AHId=‹”…^% ©’Ė™&µj¾µc`[§¢šQqåeףšr¹\:NäüMMM Ö²’–±G=ø”’ü1M±+؃šĘ)·µĪGūYʘb±˜N§§5hģžŲ±žėz×Y~6U!2T©7–’CķÕŖKž8*86Ų õ«ŹS7ĶV‹ Ŗš ŹŒģ¤ž–ŽÄ•1÷­źÆ²„:zžW(|Ÿćź®å/WIį«5P3ĄČ÷.ł&"ūöķ{Ļ?æ‡,HõĖ_žŖ³³óŻļz×īŻ»ÓéŒvœPŽ“DPjŠžj@mNn†Šf`h1ƽkj„ ]č`€QA!(BP¶a Źž”P™ŹŃ# s@‘=߁l4@(Ž–ę·7qw·^ŚC‹zŌ¢.µ°śŚ «;› Eƒk£a¤Ä€¢ā-ƒ›ŁuūŚęMœ“xŚōš&čBc•™ :jd(_˜P­M³×­Ųč@wZĶIė>-čIń,”&ØB׳’lJ”&H)L+Lkʤ(›¢lššS˜u°Ic†ĄAp¢¢C- ēøxĮM¹ėŌóŖšÅĒOœŚM]„"š†W ļ3/Ņ*¶ē±Ö¤X>ūF”yä $ĪĮŅ£*{‹]2qYc©lNž|-†ę£6D֚ŠÅb/Õ !ęŚ£k{7|e!šż¦Ödć9ˆL1ČBmfN—_~Ł÷š½„ĢoՊC9xÕØ¼JüaęĮ£6‡" ¶$°JuĆĆGŠ*=ˆ"(…DAڐčō«„>ZéĒk×HÕŁRē|)qČC9%˜ !mŠŁŪčÖ‘ŲŹģk€ŚŪ¦…lDŒįU*lŠ™aFøG ĢļW‚vP+F?Ąó Ŗˆ$éXaäĄ5P°ō ƒ°³o— äšš-įc*_Įe‰€0KŒV)Z C„¹YńBū'rÓ¶T»Ų(ĘÕ§Ć_#…6tQŖ“HI”ė:Qóm±čIČHF”ÄĘŲćĀŅ7«cšŻ¤°¬U;Zਕ  7‘OÄuŖ‚ņ °DéÉIi{Œ£Jr‡ó¤LŪ¬<įÄ*³“šŌ\嶐Ūā~‰J÷q6Dœä_.&‰„%‡ «Ÿ5ÓŃ:*ՒB£ßźźœąÖĘ9:ø˘·3Ō¶‡=¾én#Åõ“»¤š˜]Ģy õ!Ņŗ«łŌZ J©T*5]Ā9)«µ^Š‘‹Ŗ&Ó2m®ŗŖžBåįÕxü? +÷Lß÷ …Ā4Flf«ž%&lŹ9öÕČy,’;­L»rBKķ=®r‚F/ŃZ§R)­éx]sƒņŹ`ؑči&ŽÕj*ˆš•Æ~5ŸŸ“Æ0ć¹ü’|뛋–,FH¼={ˆ‚$@Z@‹X.‚jIiāda“ŌóiEg¢A4 TJ„„IÄfÅÉĻ­?h‘e¬„yX0č yŒ"Œ!ž#šÄ >EÄŲ?Ä>śVLü ƒ÷=õŌęēvē}É““Æ_’<D\B-¤…ŁCŠLŹd&H;K—­<20dD¤Rš @A„ Č&cF‰qPŒ  ‡ žŃŗT Ø×*ł·ļķÆ &¦“sœqY±žÖEŁ‰ĻšnIqZEĘZGT—˜(Nō¹Qū–ż¾²ĪIęė¤]tŃ 5‚Š]™ !ī€|cfȤSbŠł ²/~ŃųEcͬŀń8Ź%PȞܞS”²!8"Pö÷ ”"ØŚ7$$»ČģkÅuõĻ~ścxŽĘÓæų„/±˜¢ē]÷‹_`,?Ɠ¼5ĪÄ©aY̾WĆb …ĀK_zįé§mhnĪ¾į ÆūŪßźy^°`ćUÄźg’”QŌĢBr…-µ ĪēX½»”Q@ )ŹZ ÕėhŪĄ\Eę“dQ2fń< "j@ōR{łńL8ä$r š%KĆ“„“VÉšqJÕ+,Qp£ōÕj¤“RŹŃ¤*²|׀ Ø(£1†ķ«ó&r§`żb’—,CĆ7ŗ$PÖ²1øS $£1L”Ć Šŗ)H!³”Śe­v”£¬·ˆ…Omł&9Xž=J‹W6’ĻĀÓŖlX­–˜°‚Ŗ¤ģ-±ŗc“EŌZ}e '(© €F[ŽŅ)7Hz+¦[ĄJ¹‚DYdČ%ZĒKÓF#ģƒ‹;·C€Ą/É)„ā ×Įįč"¤NuŖńĮ÷M”P“c–`×E{B}ęÄÖaĆćÄD=óÉMCŽ1FźAš8Mˊć¾7>ѧpמ…ņś_*õƒ’ū>"¾ńo²•EęRĆ †¬°ņ&{la°ž‚T~6L1&aG«ˆ•“ȵLŹāéŒu$|‚1q#'$ʊ0 ‚†…Ŗˆ– Ø¢ö¤ ‚-·fŗ3äč;·Ü3\¹łžß¹®KEóÖW\¹ŖuQ;tü̽wœ$Wu=~ī{UŻ=3›£vv•sΐ‰ DÉD„±1c¢ÉŲdc²Ą Ų‘Aäd’Z圵ŅꝙīŖ÷īżżń^½zU]ŻÓ3³ņ÷7ŸżĄh¦§»źÕ ÷Žsī9,J—ć RˆREHóŪ§wō&x`zĖęöšõ0J)ÅĀ oM?óā"ōÅv„™%1’²›źa9÷OžŁv…Ø]» ō]6DD3•!YSŠ;ž_™ĢcZ­V"eUQŸ;ŁżŃŲX›(MNŽĘītŚ.ąv-ū§•—~­_*U3–‚Ńē•¢cV)²¶t*Ą…›ū›§=ķiOyźSc–ul,Ńų555511Nāą›2«mYD˜mĖĄ" ŅIņ?ßž–ŠĢ“¬1 D$¢Łm׍R™sϊ‹¦DéF^č Aéį÷變"Rˆ£JUŸ©ųCMD°9k„”&ļßī”Š# ĻMLG(²|.¶ö²‘UŃ© Xkü[A”fģo0š§Aå»ŚQ¬µŖØ7EÕÕĘćXTš|Ŗ.±ĘßZ퓤F£B£­žÜ凎J“SӝNG«`ą% Ud&ħÕ@Ś×ƒK»MņRXNņ T‰œµ[Č2Yiļtź-dµ¦‚(ŗ« æƒ' “£mQ‰{‡ © [äŗ$aq•= aB ŽVf“īŹķ—g:³ÜĘ›3ĒHtmµŌ"$/.ČlŒI[­’½0Ė0ø"ˆŅĆŌĆ×ÖY'ż:LńžHCC ܍Ż»< ˜E2"ĶbQDRę@mé÷O?€ŁŲ\Ķt# ŌTāFōµeäi¦ ĄP­Aģė‘j²3¦Äsž‚żOq£³ įó\3>žŽŲn7£x`ćT˜ƒžö ½Ö~Šß\÷”v”ż¹Ļ}€ē>÷¹“““ÆžūæŪŗuėĻ~ö ")Ų_żŠ¦%uJź“D[!ÕJ£>Ó¢ĀJāJWÖ%­F}+ŖK9G+ U „”憊B4 s¢iēäōÄÄĀņaó g;~śŻ|ē×?\“ū²^›Ņ Œ3ó«/ų»—®[h&4DBģ“@[ “DQkõ²ŻvdŪĄ}+—Æ($ €§ģ»Å;šDó)ß8Eē²Ģg˜Ć†ŽxS»š\¬É* K>ēō±3 ³ź·œńÅŚ©XŒ6īQ}p__źĄ•TūfĀB°ĒQ™EEJö"…†G;rÆ]ŽN—X]„ŌŖvC®¹ŃY©ŅXg”4I’8xRZG±£&‚V%øō]†<šoŪ¶mɒ%ĢÜx®iķKf–­£¤Ŗ¢”™•JtҊĀ)Ēy7°MF>Ō½?}BØ `бЬļāLžtrŚ8gWõ•ę† ”†`¬#Ōē9TtŪ–ylU‰<Ģė6ėrn׿œ£^éXœœ£žpų{C:*gøpmæ%H,cK±„“1V§ UÉրI 4AkØXkŗxŠ.™Ōzƀ+„jJQAü©Ōm."r'™©µ"…ńń1"ä¹eęV+u¼żŚ† ćMƒ¼¢xXcžoö¾}pE1D’ē¶­t—Ż^į®0N żR¦‚åÓdFäŸ\čd ‘Šœ•K9Ś”­ŗBKFՅkpxPŪ*I³Ē<œ÷[Ćž/āÅŻtļ!R4iß9ī5¹vĻõ|ŌZEN`aįFvč ¬I4‰l !Œōż„Ŗ•yūóĻØ+ęv”\ÄŪa'č1>ŚĮŃ_õ÷5¾ķ®ŅĒrUƒ8t#Š«Ļh75äÆ0‚Nūp°įē×,RāQ¢±ŁZTļĀčv¶_÷3bć!YEQĢ•Q:{w՗ӝKÓtFtkžxr'Ž"ØńńŸžĢg€Bē'Ņāö*Š¢ÜŁī¶p¢A™O\hœƒ‰Wń†ó’‚ļeõß_żŚ\š¤sĻ9ķ“ӞõÜēXcŠīŌĄ¤Q Ęƒ›F.gŅŲN[ģĀ®,ܹ#Ū¾léŅeK—=ģȓO=źQKÕņeX”TÖK$A4J4Ņ-ŻģŌCO¼źŚ+ÓÕvUkIŠÄY"”RJlb ~jQlםĘr² ś$O¢ž©¹Ļš¹±n0uĒłc­3ģ'4Ļj(J6įbZĻ„%Ī“„©Ht“¢aLīzų•ŖX°0{„Ü šSÅķ„ŲĮډż(E>XdYŽj„JQR4ÆB)jšrNQN@‹½ž[ÖSČ{¦„SÄ~*>J„‰Ł‰!IūW0{ÕīįEĆpK–,‰åŁ—?¼ n#ś„Ö ķ’§BVW¬µJ¹2„šUDÕäÅó›F›-k9Ļóv;})¹!h_<ōzāć&±w£ź‘L†KšŹwb—x/Su!™2(Šh… +€“‚7“n »ł“„%ŅØ‰Æ@_^‡Ā|ε µM5TyÜöPQ’ж‰~~»[ƒ­V«@MKŸ$DÄąź"%GįTŚÕŌ‘&®·ī©dƒŽ5­“[tĮź‰jå3OĶ¢ žĘķ²čÄ{ƒ±µ"¢“DiI„i[k‰÷}© ķ…ĆÜŖ¦{„ghCš”źāŒšØ.qŌķG5iN/ÕL*iReéÉ(“Aōzy’$qń„,ėS\攦¢'‘#“Ļ):£łrC“œ)‰ēšžż=£e†åõĢĮ `ʃuö‰×hbnwr¹—‹ šµĆÄG,˜Y§*ęZæęF ŲŁG$ž\ ž2?™śÓ™Ać<\‹{”Ō}Z> 1'oTGn¬é cDŽ®ļ2[_„AzŒ»¤¤!õ‚ī®,“c ż§ęE[£v„'1HšePoÕÜ|Ń7ŸNiØ=Į~^ģl­ :ŗĶhģ•§f1…F½…Ør_”©¦_“- ¾yƵ‡~˜Ce M֊(@pć ×ļ·ß~Ö:Ć=-D ”!’"ī‹ÉĢĘjŖ§ŗ]žŅJ/‘%+iyct×3 (kŚ9-k"ډķ;z[$‘¶n·Mk"YLH8ĆÕē;=Z!N‡©Ś…IĢ[ŪyVå3ō‘ˆ7āyJö‹ļ\qOsY\Ö&ńeĢvĢšøĢēŲ;5аC€ KŲ)×Ł]ž€š$:˜»”ŠMÜFõ„Ē也/įĒBC+ņ ®ż°xYт”bTŖ¼“ū«2¹MRm÷›qŖBÅ CB}Ómę£ö#FDƒBÉv»ŻX^µ–Võ]įPā]~Vޓل<7I¢ŹĒ„‘¬˜lŁHQ«šõ„}j½o^¾–K”88ńö›ÅbŒM\:™m>žOŌæėŒWD«¤Ö•Oģ÷Žb思}®/|Ę·&„Œ|M–ٹŸÕė›R–Ę\‡°×Än¼†čŚ‚€¶0¦§§“$q®H5¼½~ FöE1ÕČŹł9;VˆRŹA…īb„d½°…xµ¢ē{„U4ĒøXEöū ~r,Ž£h”š=ĖL«Õæ±ō1„ u¢Ä®Ō˜¬ÓŖĖ1ųĻš8¢Ķ0Ž6ƒ;ĄŒyi¾$2“0ņĄŲr@-£‚T‘JQcSŹdl­µÖ•9ās†mÓĀZ›“t\Žēƒ }TeG†ųGµāfćīŌ.ū§Cøł`Ÿƒ͌„Üž±pśx14zćņŒBŸ×Ü@‹‚!ß(V`±ņžücˆ!&LĆߜŁQWfAZžU}aгϲ,MÓFkĶ9¦”# ÄÕ$żFĮōČm Ōx M‰cĖģd*Yzģ«›%Œœ *Ē vģŲzä!‡Ży÷Ż Č„`¤0nŃŃ RužłēāsŸŪ±mĖĀ%K”Ņ&„żčōf‘ÅvM’B4‹V ģ¶!ę¬ˆ¢YT ‹@‚6XŲtīZ’šQšļIYL~KDEå˜ęĢ”ž-±æŃoĘPū!Ģ%bćūJąĪĆóŌ>Gx÷6„„Ŗsg”B uhŠ[Ā3<_DJnž#X †<Ļ](ģœK…AŚåpŖ 0VĄl•ÖŽ-†(¤² ©ZŠė—bJj-æiōŚ)‹Y >Ø.‡±Ö¦­ÄŪĆh*tØŪķ·CĪģ lÄo‡.įWSSSććć3BÄu÷—šĪqhK$Ģ)ś†‡—gYź¬A«`ęˆ)huĢę=ó9JitT”ĄØ–ĀÅōn6©‚‘Ąx†+€6¬•²œ+nC„CoČ_ź=˜}›b4€PĶf`żVXīņ܂uŃĖ ę‹ -Ž+mšˆrŸN˳”Żø_Ē䍗ś‰KdQ`-—9vœĮx©1V)\ýq1Œ®ŲA·Ū댷ė”عąęŠJ8Õģ‹hrrj||¼|ņT‰¾Üʅ!'L~CQՊ€æµ`*VÜ{C¢ž(ŽkŲõMÄ.Va÷«ķļu_¼ĻĢ(1"-½ČāNś˜Ņō«F“R½Å)&*gY®”rŖr”TēˆB5Bāˆ%EēDŻėõœiPc‚°kņüŖŒyéW°§ŗېż­ł¼ˆgNQŒ •ŁĮ…¹¾ü¶;md·· yø» ȉ‹ęŌ\L”aö§ėƒ¬理Œņemńl}”š»Sćœ~ĘäjųĖF™d»"<­fb˜ĮpžŁé<1ēAµƒ!óiH‰„’²®]ˆŖ’āö6dā^čAÓzžŸåčån Ė8Ļmšźa—ē§–Wi„©µvwf˜‘;‹QņĮīW¾ųļŸłģ§~āÉÆ{ķ«ßųĘ7>õéO9蠃næėĪ£Ž:źŅKrå•W¾ōo_ŗbŊéÉīŌŌ%złŅU€‚U”õX)( ,uÕāņ€ōzacQR…ŽEA»¢5ėžŹcĖĢ\؛”·ī’<‚‹ˆŅg2šBåŲ•fę;Ł¢1ŌVē0‡—oØŗ±Ö&©nĄ=€ąZÓ™sÓZ«U).åb>"ØĢøŻyq Ä·f½¼ÕNėR,BbŒiµŅŗ‰÷IęĀīÅA1* ĻõĆ>²lqē½ėņuųOč.Q>ƒkWUODĪ–a[“ 4șōżĮNVD”€”b8½&„F) …O·Ö½”•ĆŽZ›ē6I’$QĆE„ÖĶsøŸK3hFÖ߇„ ‘A咆ĀM=\”ŹõĢö|„-?ĘFB5!’”T-g„ŃķvĒĘ:õŚ( Ąˆ†u8!BVż ™¢™TÖn `t»½N§ķ–žˆhr:ŃČ3“¶’F@ø†ÆśY<«æ¾ēDą­c^ø•ÕķöŚc­ZN;Ćūfł”sŒ‰*/Rė°NŻėcå9P©~§U&ŲQX_JßUĖ 5Ä2‰Ä"05üŁTš’ū÷ĻžvÓJZč–daĘ€»Ż @§Ó*7ĘĄ‘hQ7j ».īž–ßö5:“É;vLŽ+UtzqI®¹ćżĖ–-KRŻņ6ŸG)Üj5ŹŁQ‘­ū;$¼vv„‰Ēƕh¼ł*T“+D¢Pš 4¢Źy1t•Ķx/» øžĶēC®9f8VØR•‡R¤h±ĮC®K3*>d0cŹŅWīĀo×ę_Ģ0¦B¾č’źõz±ōō0”xō¦©Ął<ą’vĪTʙdBfQ¢˜Ūó›Ļ”+ū’"›71{”hr”2X`3ćóŖkĄ,½^ÆÓiÅr»Ķ[Iįf4Öéōz¹“ԐčÄZ«€ÄąT„†óv’ę&×Jgl°„ČŲ²ģ<žĀę¼’īĖwģŲaōų¶mŪöX¶ą”SN‘¼ą‹×¬³ÖšéÉC9dlł¢AŗĄŅ !/+F‘aEŹ„Źm‰@Eeg‡aꊵo‡-ų°Łh!¶€Rwßu×ī{ģkQøģˆū\—8•F…Ķ›W’¾1—©ĀQٜęØ>5BM“–V•f«%¶Ęˆ¹ 泘ĻG•˜£&!3„n¢P/Qƒ2'®S¢Rqė&€ĄZö„ÉžwŠI|ĒĘX—(¶ZiÜ»MPP°T”“ 5Wp٧čż"²y™/bĻķĖ¹4ŠX„Üäň…’;wŽĒżŅaVūō‰vż:(¼išq=ų“Ł÷Ż5¤ÄM!Ōč'ņ,*YR /Ž(Ŗ?³‰’ā–Ō²„ ­ūŗA‘¬VōØśRč …§õ1¬EĘŖœ™įÆĀ@•%ņĶĘZk·ZŻ‹m”²ęÖSžē­“U_ĻWUÆņbM:|]4õ|aĪ ‚Ū+²^Ŗ’Ż 7w«Å@ŀ–fą®Z Q]L0qÉmXŒž-9z³€¶YAāSż<3i;qĢ…Z3aˆxkQłŲcÅqŚéօ{ĮŹå+¶nŽō…Oę¹/z‘£1Ģ€ĒkVĶö|lؼ”œ)ē¼ņó{ßūžļõkd! hha¤2łŖ…cŪwLw4’éX;˲ķSÜNŪ½,³)‹“C7ݽi¬…ķ™!؍īüĮŁĖŗ?¾ō×wMNH±ŽŚf m”¦p·zųIĒ_õ†ÓN;ķϹjįĀ…Ē}Ģ~ł?÷XµŪa‡õź×¼fŚd{ø÷>ūī;¹m{Æ×»ó¶Ū÷ÜsĻ ¹zćĘĒŸx‡>ō”sĻ=÷€øž¦?ūŁĻ>ļĻ’Ņ—¾ōŖ .øģ²Ė¾š…/“Ūķ+®ø|ńųāÓ;,(sČįæūŻļŅń Ø&mƒø}0ŪŁ€>ĖÓž.ß9Ÿ1aqå4Ó%(]ONXꙐ7”x¢ģ“hŗG°ņöq‰·1*ėјH”.F°ŽˆŗąH)Ē(vŠPŽĖ[­–"”86˜śó‘$Ž;¤ŠŪŚČ[{J…8@`å¤į (×$ —Ÿø¢'qĖR_uC"äĶ ”R,āŖƒŹ^.Ó²öķv;XhĘDh „ąŅ(ūLs5>™­jh=ęėK€ē“šjĻKj)JMͻДbźmÓ9[<& F…ź*͘ŖHNŸĆq¬2›čø¬O© ŒBk=ŸØLBY‘’s±l«JK°Ö&J#öv*_)ĮšŠżÖ™“å™ŃZ+MÖX ­•lŲ°ˆ˜Ģ¶DŸįś½]×¢—æ¦č=+E*ßÄU®«p@“.ŽH]ׁXĖΌ”)k>1Īą**"]lˆ‡œ ®Ųæļö±Ncę^Æ·`Įø»zc2•“ ŃéĀ™K*{{øg_”Rc<¤‚$‘r›Vj6™MSå<„)š [lŠa›BĻJ7KA·ßxėĪū_½Ü[NT‹PTRż¹kAWö½ lFÕP‘‡RœJÓńŠø!Čsga„ŅqŻ/o>ĻHxÄŅᬲÆQčg•uהĻ}«¶ķĢ/4ž§*Ź|’ÉāČ GIŒF©{Ž8ų£Č˜ų„”ŅJ÷[6T_¦FÉÉQŲ“$™ń5J<[ÓąŖÖ×.zō7q×3£POć(47Ü{ˆžķ(ŲZœˆO9F¹¼ąy]³\ĘŠ|»œ^>羈ƐtŠ›4 㨅Y‘ÉÉÉÅ Ēå]0 UjY,^`§wJ›°fÅŅŲ²ūŠ…½lŅZŽ9„­Xöd+%4ŽJŁųųxwŗ×jµŗŻlɒ%9Ū;w²UćććŪ'·ī¶ŪŹŽöé$I¶OOoļö–.YņĄÖ­-@CM„°– C:‚Dė­Ö:Dnń¢…Ū¶ļ˜Ū15­HŁ•p-£“*Å$™\A©`zżśõWßv³7ø4;üšĆ_ł¦7<ł¼ó«Œ½^/TŚbjęŹS*óĀā³fX Mŗ¬ Į}µŸ|Š„ļŸ?ńJ™OÆ"GĒ‘’ØnøšaŹ \{¢¬Ø`@É(®“V„Ż’w»]cćS®*q:d慖²ø>±Ņ¢CĒė±Jœ®¶8Ö’}Z>Ŗr%ĀBӍØHŚNc”¬± tÄnµW pPfcUPŗŹ-z‘b˜ł„,„–¹!*ĆJR-7Ļ#*ÅhdŸ!ļÓ@F=ém€gk@”=¢k ØBŹškÓ5Ė$I¤gĮä‚*ķńRĒfKS]w·ņQŠ+BE++°E\/gāÖ[0)·™­dYÖź“]zo­7kÓåłå¼Q‚É­ÖŚ“¦Išs®y€ĒdŃītÆŻn»ŠXØJÄhjĢÅuÖbĘXWMĖ2ÆŖå9&ÅßŖD¹Wö/‡[ctšDAQÅB!Ž[¼Ź@P)£r×Zµć4Ņ7°ˆ/[(E`1)Å‘ČVī¹ķö믿~ēĪ8ķׯxƱ;)nĪŖ±‚ģֈ”uĆkšXNżwQžŌüԌ0+ē'Į12xü³ųÜ0¬eĒB }'yH{gøĘ‹hšłå’s^Øó¹ßŹIѤõ3$%Ę0ńø¹“°į!Žör8†c„ÖTؐļŚ«œg¦4‡hLŃg…Żc§¹ZŸ&TŽØ>Ā$hī:zķ`ō@’”nEndMĻśœ˜õƒ.ņ#5ņ#„kÄ2ozӛ.żńī¹ēž·(ĻSV€ņ$äŠ@‹HD/Lŗ]“ēŠĮH4%¬dbŒķ6l¢ŗ]&Bn°@ƒ¬ŪķvŪģŲ.¤)4“Rj2Ż3­•RŻ+٤ŠW›žžLōyȕ‚4‹ƒo¶%FöĄÕÆ]ķ,Z™4ŒxæµX°²É4õH“\_MĒń )7ųŚŃ,~mŗ“–t?³›āXĒ®‚ŖÓ>ĻMš& LOu;NąQןb‹³Öź4±1x„,«¹ćĢõšŗ<ÓķʃHŌ(:–©UDzķƒH³!õņI»-7¶255åØ1æŌ=;Æ> +05#,‚^Ɨ¦i٧źUŽŻ"ņNęeÄ=‚"čÆņa7nÜŗyē’ųĒnøvٲe·ß~ļūļæiÓ¦7o^¶x¬×ė彄Å(p[„“’‹@€D£cµ…un¤FÄ- ÕzŚŚE 'ģT×ZkeVŒ`<…R4Փ±Žšģņāć½S€­Œ59@ā P"@G)oD)Ā^"K13»ø ”j["P¦¶zy–@‘†±œSŲ°ķ’Ȇ”ńż"„£/Ģ8%öY1ĶnėĒĶEsŪŹc˜wĪ;o¹ØAåQJ`öūr’ØžłŹ7ļÅz'ŲAÕ2“¼ÖÅ·āī¾rŪqŹ:±ƒb°*q0Nƛµ;­I3×µyŻ+3Ós- Ī–RĒ{ĖKP ±WČ\ø,"Nš6„°•”øØzf:欈‰Óq÷` uq^2õŽŖ™ušgQcg5pĪŲBżБ҇®2;hsö-¾ŌTĪĒ]Ÿœ‡fN‰k5&ņŚE‘JXćt:$ĄRs‡Š?]U*VSSÓccc!{ŖōGÅ#‡Üz”+å-y˜K·y„T°† ćX÷W±W“1>gŠh}’”ņśƒOU\ƒe™Ö:0H+=·R×kČ3“¦I­Ģē嚨D ]"ŽŽŠRģK\J”“7ÆŖQŸB„ŪRL0bõᾬa ”‚µ6ÕZ “”*<[AŒūļŗŸuėž÷WĻ{ßūŽ·płbŅ Ō·wG-ń<œćĮ4 q ž3a’쫬ń~”X5­#Šų …pw ³ÓČøTŸ¢ņlSāc€‡(7®ė«×­¦8·Ģe—µ‡¹']Īm8J¼kćł]XŖ(w”ŁsN‡·ūUĢfG4Š_?Ÿ±II(rī«‘øF|Ÿ!¤e fŗļ²G(M¹}tv 9ˆ+£ż_ÖŚB–SĻ'Ķ*ŝ•µ×C±HfE“« ‚DhĢ!ŖfhÖå.ȹ³»ĮØÓŪ‹?ꀚó\%é7¾öµ§>żéPŖ·cĒ7Žų¤'ž}ß}›Zibsć>£GHE,beQ+É23± œĢ.ėõz*M¶mĶŠJ3KJĄzZr‹}Ö®žÜ¶Ży!lÉm+…4ėÜŚ-C’‰!„  ¤nMÖJ’(c8.\.\0±sēd¢’œ W=Oµ0QÖZ"(FK)ĖŠhē–»#Ē:'p­\TW“#Ę,m1×žĻ°4BP>g……:Ł;DeŪ!'‘| 3jÖŚ•IW°ˆMīɍ †¢µh©|gėbjqɞRJkU/ēå¤fœäz Żwńw@‰Éõ;ōŸ»A¦«OęŌ›=ɹ»ņҶǒ'ÅØHŚ‘2 MšLøb„£bśĀeäŚRF)5?ŪžŗC2Ł ‡†6ŒęF)ć>Ō)qķżAfĆ©į)qRķtE~f6čœ5™ū'‡µ6QI9I\‚L#) ×&VcźŪhp:7-ŁŁŻ-E‡1źÆAYżŖŁ…Å&L3ĻF$¢ģŚ8†¾Żō{P‡}č~ŃĮøMsłĒG9µYgkā¹e)ZŇ£ƒ%™žī„ķHR|ĢćŻńŽ^øšżļ}ß½÷mėh$j*‡%h­Äp–;Аņ¢…ć›¶NO ¶mžv¬ZZkĖÓ ¼ŪSš&VĢm÷ÜĻ€)Œš²ÜG)¢d`@b|—3(ķ4±Å°K¾l‘ÖoŪ9)€aC¤ ½"ŹÅjˆ¶¬J°hb‚!;'§D•h)ĊśVx¾ĘxeŽ9&ĖgąĄāĮÕl$FŸ–C¶‚!.ǃdŽęć5ß’Y̬IIASÆķ݃vņ€[ŗ«“ܬEó%ąę­!Čpģ>a'¶„œVV­ŗ’„I…­øņA'Źų“ÜSŻJL&–E P³›9Ī ³Ž/‰ˆ«ŒøŒ9ĻóV»QE‘Q„{)˜Ģ~„¬¤źGģŌ}Åēƅd‘æl„* Ęį„"¢„tC¶W9–FC¦Ņµ˜%TB‡xL7žÅDŌÆ88…Ą• ‰@BDŚ)ōĪįā!2Ę8bpĆZhźk Z°NU؝€ĄØhõĶ"HżĶŅ`ē¹]Š7\ŻD5Vص3§ć° ścÄ+†Q|§Ź_¹gˆP¤0§ •giGOćģØoZ)cYkE ÖpB*I’Øq•¼ŠT°Z°v°pĄ“ŻĖˆą …”&Gqł³|Oعbٚ«j®µŖHL×Z!ÅIÆN”»1ńU!ųųŪ:i®B_ŗ±8!Ł4Õ XcŅ1Ū®ö@™ĮĢI¢˜ī£’m§Ó©ĮzĀčõzcć~6­5¤ĄŽ‰„Ų™=9kčµĖ–­[øēŽėW®ŻMZ`X×ö=°Źļ·Fn@Ø%HżĘx! £>Ofū #UBP5ŁŽK9ʘ–JAˆ»ć•*•ę˜ Ģš`Ø ė|ünޜ+ĄUŁiß_PßŚÆ6[ŽŠĢ‰ā,斾]¹¶õYkGŃjŽõ¹}“Ģ šüį/NP4lŒ˜ū²²4Dus8GC¾ī$¾’$»Ģ PilČļxQY°œym4Ŗ7ļā'=ĄÄĻ’9”ÕIkK#¢„µžššCDJiÜ;‚$FsVš^ø@9j-4ņ‚™-=HˆØyøŁ>4Žö(²øQ „AŽ„ZĆ„‡’ ZŸż‹8b›÷e;Ķü"ÄŁĆ1ęžJ«ˆ<ęĀME ˜XtŽyՊåįūO|īó+×¾ķ?’ó?ļßøÉaelX äCÖmß¼E“]°`ĮĆO9ńß’ż¢łŠ‡ļŗė®µ{īqļ½÷Žw÷Ż ĒĘļæļ®©©©ż>äg?ūŁŚ=vßøqćæžŪ§łČGžį²?®[·nŃĀÅW_}õw޹eĖcĢ^{ķõ’ń•ßüę7Ļ?’ü;ļ¼óųćß°aĆ-·Ü²dɒ;wcV®\yĖ-·lŻŗÕZ»téŅ{ļ½÷č£ŽsĻ=o¾õöo½ć¶»īaĄhö)·"õąä¤¬÷½ėķ·ŽxżŽūķKJićz ’Łn·} @„IjB—E߬ŖÕ’8§£ĄµZ-ō%»ŠJŌ×-C Ua ¶p‘£1[²k„"©šE“I(Շ\”©ö,bLęŖŒĀmįķ§"0†Ó–b ­c$‰ÕJ >Č֚„ŹaMŖi‘­1”Ģ=Ʌ`YTmWĪWׅŪNĮäģ^ą©\ä Q]…%MS€įxA¾¼’„iźS„µ‹‹ó8“ISŁ%wA„IQõä$cŠˆ*Šå1 IūZ’Ļ„]ŽÄJy5lĪ­jé@ %¢“• Š6Ęė]BlHķ‚åUł”.²&e­mµ“8 čõz.ģsjŖySŻŖÜ]Żw\µk†ÄĶ«˜Ź?'vś Ucjßuß{:>[MųÄėüiŻßŪ&Aķ9|–Ÿ~ä|nĖśŖŅC•ą’R—eŌŽƒŅ’¢“.B&÷§§»ctIZŚ+%Y‚*śT ÆX&—(FѳP!5ē‹Jaš=ü :H";u±*ŃqŲSpāWÉF ē»—Œv—§µ5," é$ŃĢāĪzO/śŠĆ¼šžźŽu¢Ā\‰¦ŗāu«Ö <+Xr‰»–ļC¤Mt‚jƾĶM’¦S;§Ē'ĘÄŖ’@H©rz+‚ŅŚD8ƒåŽG[”RbA‰ $ZƒKüß”aiš–G);–•&ńĮ-AąŠNÆĮ”Xiśķ/™MO=ü”“”ĮEšś³s·¤“ņNČ Aķo•F|õ$t}S܃-U4’bķńH5M@\ĘĢ•44Č(ŖŠrX>įnZ”™Ż•‡U†”FSį°cĒö‰‰ Mz€M:śOłJ: BMT•좭fćŲł˜4°pĀ©­Ŗ4’ž¼Ō†Ć§®f2ߚ1[«¹©RC©Gh…“¶µ DśŹą»³Š‘.}-EWФT°·‘,ĖākŽYļ0ø« k`ŽŲöĻ™Z§jħŲEBŲ#„OƒŸM0wń2Tņi‚ó°7‹%ńŚW<ø8 q.Ė2'š8[:\?ńFŖV”Ź7Õä™É²l|ĮFP¢˜øFģ]čīO›ėœn[‘£Xó¾šisõ“=ķ†ėÆ’ž÷ææįŖæ|āŸŲ¼sjõŖÕ&ļuwN’ā$I:ćć@"ˆ”9{Ē-·®Ūgév“ĪĀ"X™›/YIQåŪĆ i(—ō‡×Żn·ÓéŌ6 ­[Ųøq# ·ß|ĖĘūīY°`Į{ß’žOśs‡}!…V£V{Y£•Qq²i~9—šŲƒ¤}ęŒĒžØˆ¤YÅ$ ŲpŽ›[XćķÜ×Ӏ’IӉs†}†Oż}.4.­1b+ŁźxĪŸĪŻ˜‚šÖ?=Ū]‡Š”] wīQ„gńÅ =łuR»ų€U8F’RŖ¢ś>'zBɂ܅)ń¬²£šb­‹œ„øpƒKgmŠšFØ6÷¼q—f¼Ć+=ż*>Ć…hPӎ®™WĶ("Ż’¶ƒVÅŚ8GM‰%ŗĆ󘾟7•[gKœ§P=1Ž.ųī»īŚ}=,”eńQGq\‰HKŃåb aS :•ÖAV”°°"%ÅÆ|A°PŽ™q,ż7žø’H«D¼é…uÄŚ¤0g|ā‘1£!ī,,£“zhW_‡ūĀl“%F·ŖSb.*ń!ĒØōR_JĘāÅTm’čŖ®×¼j‹ŪWµ»s0‹CذąŽ-„æ&Ļ“4E§U䉙¹Żn1»Ŗp‘č—ļŌ~ī…ųU*Æyf7ŪZ č»Ę [ȇma^šõņV+iL‰ĖŒŃ°NŌĪ“½^ÆŽ© æ°$]#I߬ą9}"ˆå$,½j˜j“¹‰ĆRiu&Xk]bL–z½^{¼ €ˆ3<‘“bųæžŗ»9wéϐÓ5ņY¦Ä!ß 9*  pėĶ7mŪ¶ķØcŽ ŁÜ»¤s/ˆœłĒݐĘNØĘ˜¬’P Ēe“kɼÉ|Ć|Uw™†•²:ŠeĘp¢,¤›eY–ŽwhQDeD™ÉÓ4…†µ®' Š>Ovó6ÖHwGG<”bƒ¢ZŽZ“y8ĻMŚJ¬afv†Z†’mݐ u ÷Ó¦øü$®: ʘ4M­µJ%q§tĄo‹Y!.g/łÖÉ”"Ų1ČÜOŽ~Mn''''&&D$I’ž»hųßj¬t¹1nCóD‰rĪŲaA ̾įlŁī;¾ÜZūš7¼īļßńVQīõģg{W.™hŹšcõ§-Ņj·› «Õ ŠfJój'ßlä-ėõšźpȳ#ū ŠĒö0FDåųēŁ’+|k˜T˜øi‘ÉHū¤“B$O¶lk4ŅįĻ“&@Aõ‹7ρłÜ&°¦T „Ą8ššĻ|h|½zh& *¦ŌF3`!¬‰A¤AżĄó¹ČŁvtĢóżk²¤DĮƒÕŅ|#ĖŻEŸ+6~}mäk.vż9|ˆe“f@·¹÷æsv˜i¶ ¹o÷2/Ž®”1;ĮV%P€Z»ūž"¤Į-b%FĮ*'k &+b h€`Å \{ę¶RJ˜UŃu(Ö IX¬ $ģ„«Y)f6"–ČŁ!3ĄĢ&ü/ĄįWD>‰Q -HŚ"5”Z¤¢R K3ųĒ}JeÜŃčū ü†’/ #ĀjT$·D•"  g^݃ÖEm͹~¶b×&"ēV >˜Ö®ß%č(ĶŚ'…¶–/„|ßV`ę… qń?Å$R ”×£µ6ĘĄ‘/øJšM%ו—$IāČrĆ …W÷±C)_7ń‰=Eo9)$‰rģhn sąō*M¤ xD+kĆʇ­h­ŲŹųų8)tĘŚišč¤<ō‰”ÖZ'IóĀoŖj‹ FyewĮŅŹĻ›h† s;Gåż­“ßą.ņf¬æ"‹ļuķß-ūgW½`Šź“7 }ę1Óøq&[¶El€€Ģ~š]ļ=łųć?āæNś”Aūķ(ēiNńˆKoHėSøĮŚ_ÅF<ž®W–Ģ\‰*½ŻåŅcÆ­`-A¼ļžļųĒ·*UŌL4AA§ i0`DŲų«čõz(4”¦0”*WTÕ ķ£Õ­ÉI¢G\hõõŗ™»ē.[š$Ūp²k9Ė2īĮį|+•™#ģéÖ^°ŗ0ūՉ #™ńĄ²§×FĮ¹fEnĻwēš"慌×å<åhHŁwķ*z$©^“hQ’č4펇,ķĪd§ŻO¤¤ŗÓi£ ͹ŃŒńA3™…µŅGy¤ÖśOśS±ōš0²’«?föƒ\)ÉI•ūq•ÖišV&G­qe”ųGdnWmÓh\žŪŸČżŁ”žĮ‚™Ćž¹µgĻ?»iī÷®ƒŌ6ķ2!~æ>ւ„D !*”r–Ś“%¢~a’šąĖč·9äYH(ą’B[:ŖBH®Ō>üŠ™Ļ×.N‰k1„£ÜŒUWŚh…&ŖF}"žŸ2 GZŠż¤Æųq֌‚kk ĶUD¤Æø/%Īc¹ųšÕ¾ēŽN„ńŵ§æZ?J2?h˜J8H¤!} ÆqÓk“čjĘP)žrĮJ¼ėĶķØ~uæVJ„E a/h„,CM*(! (ŸŖDH ”eE:eń™¶ˆ”µҤvo„Ż÷ r?qļ „ŻOÄ Å¢\#ØĖS¬1 D°šD5„…)ŃĆC„atĄ+½l [ĖÖV|WŖ;ĻEW¹ZŽ3šā{T¾÷łšEÖķĶ8[ęP«qq³gś1Äŗ¦z’”l$ļ™ņĄŠåĆĶ€FJNbYŚżNB€—|R”Į¹$Ļ2*ģ[„‘¤šØŠŃŒV“B3» ¾H×ŃķfRé¤u²=õƒS†7Š6Œ\r?œžž.{eKÜ•ŹŽf\M¶Ē”ÖŠ3VqĮµĆĒśeVK„Ż1ƆåJˆI¾ÆÕkóäYf|j]m%”“Āą˚°ł¾{/ŗšĀ?žę·pé1ģõä1$žŲŲab† ‚“Ÿœ«uČJ±īļ„ a3ĖļܶõE/|žżwß³÷^ėn¼ź/°l†H§Žxv °CÕ„‡ jHĢZūŽsŖX`ET¢į,”GXÜ,³¹u ŒDiw^læćŚU«?ō/øļę;¬įR[JÅҾ,„µFš¦n†0KŒdՕc˜Åf'ŹUČ_•‚v±RTš&ķvKé(G•JŹa 繆NT»Ó oHA$)±ÆMTxõvĂAŁ“ĄÕĶ™į zH¦Ż<’9ü<Æų=]š‡PNuA¢ń‡Įä)ž „9i ÷Ģ䖮øe |‚Ń.\Ū%ehVtzˆČ.öP‹Šõžśåló·q»’5ĘōmŖ|™€ą‰¦óĢ t¢8l_A‰ļ³cń‚¢ģ<č8g(!XC1‘€ÄeĄPBJ(|£ˆ9©rŖXI’ˆ@A+hWšÓPpĮ4V.D/īj9óhDųēs“ōoĒ"Q²Ō$Ü ĻĪćóćļ•‚1¦@!į»m©^ÓWŗb“Ö8Nr֋Źų›B$Z9ŗŒĖ`g@C’±«ÜéĀ^ĖÕ&Ņ4ek‹w+‘« 8 Ŗ€Z»ØŽöļ*eåŠC`j [+n³”Ršb‰T*įbNM°’1‰c0ŗgʬ“ÄZėšx•&—„ÜX)å:ĻąpZ”ā+Y…Ö4ē6m·7Žw’Ė^ņŅć=śė’ń•Ä‚l(ŁxI-%°°9Z­””3Że4› />ZUچ_9žˆR”ēy·Ū+m~‰“VZ« ĶX*øt-ŒK*I¢[­łZ9ŲįYT/ϔЅpY…•ĄĢ•Ä8Dn ¤UÜ·ģzŒµVi+qE+)ø!®Č„tE?9ī)­EGŃkŹĒźUDŠ».’’bV “"5ŹŪ2óe—ża¬Õ~ųĆNÖn›mi¾!WJBĆÓwk1 n‡„8E„ˆ ō„Šżqģ ŽGŻB„­ķv»hŠÓśß0vø °€ÅsŹĀAcy®8÷ܓ‚į%Ås–:_ ŸE"ē«ŽāMśe2ˆČų|y]‰P²’¦ē^~żfŠŅæīFIqw-čCŒ»JŠu§Äż)YPžl¤‡ Ø ĻsW„®y&7¤^‚]ž¾>D_3śū#ƒ éR™6‚.`.Ņ”(ŃI” ēI…•“ū•Vš„\!Ü/'÷’tÅ Ė6…Z‹Į5£Rƒöˆ(BuD]Žqœ8·¬eSexKƒžģp5õ]sЌé©Õ÷ '7ā±ŲāE{,6W°&0A“1H@–`”„ŗ;»Ū·lw)‡Kz5 `‹é«S› ,i†b(¶œ»äøņ=±ĄBl/ńĆ ą¦koƒ¬`Rš)õ€ćś{¹żœ(f›> ”“Ö*ücįÜšŚšĶ_bąF\sÅ,.³8Ÿķ§x“Ć.ŃĻķ,g”ųÖ„p~sŠT£s÷­‚¶rY†W“ “.LT€•$©H„Ö’öėŲ©:H¦§»ĘXųęö¤ ¢|~^ bŚķfJ‘RŹć_œØ4MŻžą“Fņ,nkŲĮī]ÄĒįöC䟎r"s¤Dœ–•R*H¹“1l’…'Õ .ŽŲ¦<—2¦iYaˆ­ī–ERŗ`Kćö ­9鬤žŅcbbܒtó ævŃW/śźE÷>x’oń«ī¾÷šėÆėMNS•Ā]ÕÆ*Sv$xµņ½ Ö7Ū'Ä[·o€'/ćĆNу­XóšÓqž³ŸułåJ; /¼Éé{+Œ^a¤FĮäb„q$l”Zv] •&ŖS!Ž *ѓ[v¤­Īi8mū›¶Ę0ՃåŠā˜†Z©V'MZ‰3‹¹”ēyT§( vÅ$ ,bGtÉ[Do.«N•ŠĀ“ŗŃét’$ 5&—Ÿ[ĖÖZŸXŚhNI9Oj°ŖCn›[ĀÅõŌ¼øM Ź„­µŻn/čT‘‚RŚż#R"?!a&Gś(­Õö…fÉ3CQ@irų³5\ź÷Ŗ²Ķ8H»Įm‘AŁ<3‰8*µ@œ\O Bо%B bm„2d'œxÜÅ’7ě½ļd„¼”4 B®˜čź"nхĻ%åT$*ICąŻPĶ£ˆ +ŗ1Śäų‰CŽŽ4R°WDač”Å·Ф:‘ÖæG6+wG`–¢~øx>•Üł2mŽåYqķüб–9iƒ^?‘®ŚāљQ'½ńfŚķVš…źŪUs²+€©gæ ­½”Ƶ=|_±«‰÷Ažēl„¾„Ę'ÜpŅ™”ąO,“XČ-†Ź„ ڶê%1•H”Ė·óžń ³}Q{6ĄN©ːˆhŁs$Õöjmś‘ÓˆSÅ?5oJäąZ (Ä·S”² WtPZƒČI¤łaVīœŅ`įĪx{ńŅEe̤ĮĀžüö׬•$­"ĘW"¤uźŽßu¹Ÿ»Ž'”DT*H,`˜’oųżo9ä€Ć×ķyĮóŸ vŖ_*ƒŹ †l"± ūĀNC$F¢¾ńšų 3ķ]Eōˆ©†āi“Õu€.L8vi™,öp %U—[:x±„ų N>X&“Ą•¾ RtģE.xf„9É\GJŒ/&Ü©£™ˆH»ŻvRXĘX¾‹ Žm Ź4y9"*X‹(;∐eYŲŽź§lpgMōķæa¶,H®²LĖčy"äµčüZėąM*u”J±œVŖå™åv‚(o$zę‚/Mįpž“wˆ$Õ1×½Čµnµē›7m2`’Ų3W®Y;95•åyŁ%®ńs ;šČ}(QbS©Tp@#Rč@•ĶĀ¢%‰…Vļ’ąŠŅIKk­I)‹†Žß!¬¹¹,+j,łĘø~šŒ '”BĘÓsJSOėFƗ…É_8KcrūŽŪīø}½Ö=įqūĮ÷¾÷³Ÿ\ P<1ĄbóL¼ Žov³¢ÕN‹ć•V½"õDĒjõø¢­5ĄūNŠr@)å–m™7ś’G;Źō SŌ³ _’‚Ū¬Š>df‡ś×³Ÿģ!D. yTŃDš)½7PpYąØŻ V”$^ęQcs`W±W¶ [76æßĘ梈ōźÜp - ,Ė](āš3‘ģ½fĻ{ī¹KÜ&«DÄĢ€‰ ĪRÓöCÉ^qĆōā'ām·T•/Y4ŃItÜ HuhHrśZĀģHӔ‹]zP®$cC$0Č-Å]§3j5†™‹b Ķ@ļŚ%Épc’2Cń}č])° Fkg‘!—ā|lŒ „ź!wT†"}!zžW²ŖŗVLœž×˜÷„ ƒ”j"£ēĄĆŌ…f’ ¢F‘Ń”3įŚż…ź°õ×b³H“Æ”'¶QŽ Hz6.龛źv»µ­aŠ÷ üōk|Ēļo­‰aS¤ŲX)OzdéNM Éų‚1•«t *ģ‹¢źéźh‚¾žõ‚°2+‰”^“hBŖUPƒhž’ˆó8†?é*į{±ZvaB{¤a%[)›éh¾ÆŒ‰ K™*•čņõ’F¦² +/£śžy‰ÖWķ’ć±3;¼…&E}4žĖˆĻļƌo$„Ōż×ęiv¹·’Šæ’Żøó𕋐°Q’ZŒ7l@5o7„iU¹CU¢ĮՉē) ĖążZ½¬Ō „0 l‰‚Łv’$iņq-S_Ÿ·@*Š«Ļ/Ké 3ø>oĖ•rU„~×ųD3š –ź*мBUe"E[MŃČź6@„PxÅń(ģāĖH&ŸC •Ė9ŁėĮH”É,ŲÆO$(ēƒ 5KR„Ø&  3Öv!¬œ ē g=Ćć ĘĀšøŅµ©Ž£·¬—‡ū‚ųņ ›™Ģ]©×ńņ ­ņ#ąŌÅ ¤\æ³#aÕ}Ĭ}TĪģSKXÉ{9lmšØ$)½Š„z½<\t‰¾”äų$Įß-ūü'J…ŠVGt¬Ȓe ŃV‡¶g¬·G†Žb§Ńę[x"e;t’“ŲŖ†“„ÜŚā\H”«PŚńĄ¦“¼³ˆ¦ t‚ń “h% ŽE§c®X؜‹J ¬FIü}\d“`[@0+X%PBŖw’ŌÆ.łł£yZJō“Æ]¢óab1×Ī—Öi1ē¤ä½Ü-Ņv’*,$g˜^ąŗ®’ü?{Ó ^ų¼æ:`ß}nŽp, Ü a J[-r'Įćf`žw<ƾ”„ i7W{¶c<ś¾ØD9É(Ņ„Ü\•PŚN-‹#>€ R‰¶ĀžoEÄf‡!—Šwn.xšžŖÜ„“S]:Ó`ß·ńAąŹćÕJD¼ž\)§>MH[‰’øØ^ʁFQ(Aˆ±..ORķ pRŁÉ#†9ą<ĆÅCĮäDą}ė2ČMĖD'ą&N™@¬bQ¾g‰­ćܳϾ’ī»pÉw-¢H5Ėų…mÜc›ÅōĖóܝ3bĮ†ŁpˆŃb‚k8H—‰Źä䔈|Ģā«nօr[Āįė¤8Ī kLMN™É­°ōEąĆ„ZŠOČ­¬Äe³!X,ĒéŖQīh`®0ż.'®ą’“ŪWńéu‹BÕK]±|ą.”ˆVš’¢Īšø“:HĄŌŌTezDĀQRWg²EeŻ—Œ ¾ƒNU»ŻŽ!śĘqØDÕąæ_ÜĒE.>˜5i6¶3ōĪ0}¢¾p¾ĻŠ{. š©Y? \Ķį­«>ĶÄę‘ŃŚĘY58Å/"fš! ͟õżÖĘĪ™‡IŠ\×ņöįĻ#fPk­ū{¼bPȕcæ„Żn7'š²Į '£-qŃrnÕOšõ”5ōwdõŠĒQ„ŠØ:XJĀĢj~ĪŻ­©:ųŠięS­¬ Z㯚æ,PČĮ°xdlll’=ÆX2[¶ 1ĢĮe¶\”śnWūII$Ō(dŖ ōéÕÕŖžs©¶F<“:øĶžäJq}”ŖU8~źė)¶!¢Pīķu³˜āü¼3h) Š<7Ģčõrē¢M(B¶ĻGĢו­‰ŽóLƒeŽ»(•®čLOuó<ß¹c2ü°ģˆf!ŸÉsQŁ!G0Ž3UבēuŽGMD©Nļ×kz9±ˆĖÆś ČU®Š!ģą7n^Ė‘`«¦_¾‘[°ń˜;ąīŻ9QU+,õJæ£s;2hʬFhĻ>öš#×L,\@ś‘: :‹©NķUpk<·˜!Uc…’Såž—ŗA  aq@%7fżøEؔ¶V@XøbłG>ņ‰ÓSǟ|’a+@¢“A˜jŁf• Q„³¢Źź?ųšŽ!) >Ž4 ™kµųŃW’ūāĻyń”Y‰ōE/yŅYšƒœ6;[’ ŽDRä‡UŻG'Ÿ¬qČ”‡ž÷wžū±g>zbbģ׿žåM·Üģ”@ڱoĄ½Üם„;"®zåN¼FyÖ®bc݌.ģD‘’-/=[4ŹR!‹XgÓåQIāŲ"6¤…å`­_,ŹM­V«xˆåņwļ˜gĘõ-SiEżņę•s<2'H3ģūO'(ćó^w )ØT;»¦Š1W ƒ‘§|W”Ą¤ų: k“Ūxäćb »˜TŠō (,…~õŪ_„tŸöŪźPv•Ó~z£oŃņ=•ārhųÆēŧ8ż ¾P\a.>k9aƒWb…Occc† ĶY-*.DĀAn?Iņ(ø‚żAµ;²Ö³|/C5Ę<·|ŠśŹéA¾ć¦ÕjµZ-ÓĄe¾kŻjś·āį…ÅM,ž w0H~lˆV?\ß’‚łbŻx lgʇśD^ę µ4ŹĒ Oyjģ°!BejĪ›Yż!Wynkvv|ō*TUŚ„6¦vĆSӀŲx݈Į=ā ńó¾›e Ŗ¢Ą©|©ƤĆóŁ“Æ •aˆOŌįlāj}$Pˆč‚įPī ‡PЉį+Č"n·-U`~öŹØ‹į”Č]wUĖžŒ ޳½žFv÷k®ž .ĄQŵzŹĆO8ōČŻ-=`Ķŗ‹>{”³†ĀC×e_9Ģ$$!Qŗ("lŒakż±ģT‘TĆ®:<[Ä`1X-„šCŽ ·C·EiĀāF*ŠT«ņŒļźK֊։+xy4²“4MˆH'*m%˜ "¤­D)¤iźČ‡¾§ĪX1ܧuļ3UaXkM‘TyvĢäRȱ7…™HītZ̦Óiå=ć*ČJéāL Ź·*P+NF.e„¢ļ—įķ|)P””CŸ’T—™v¬¢,ˆ1įŹ©ķ_fƒŽ²«¶HŸœU(²Ä)ĻóJEæfÉ#&\ÄæĶ+ŻXņmM­„‹¶v§&Å~ī‹_‚%ŅU¢SģEŒ>ĮæŚŚQŠ’D—āĘ Z+GĶUĶb™„ٹ5ęģ =DX‘ ^õʉ… N8éD(ŀaĖĘ6.€r‚©zāWtƖī”œ*ƒ”xD”)qrūnŠ-BĘšößśÉ÷ī¾÷®ńӏ:ŽīŲłö×¾~ʀ©˜†ōhƒ¤4õ}­ŠQ÷&ł oÅ«`ę+®ųÓ÷¾÷õ{ļnW(/ˆ1Y–¹’S«ŗGć7óĖÓµn”Ubmņ܆ ÖZ«4å™q ×vėŃæā]ž¬ą¹]tæ%&å™/VČI<ˆEŒ…XhR )"("߂LŗQrpnŲŽˆ*½Ö”·ļ¹‹»‹Č²øØd¹?w­²š jĢrŪŽ›É"Ńõt×4©®ĮŲ_*čR¦ńpĄ%‰*Čźlm.°$€"Ųõūģ-„'=łÉŠ,0Vøń€Žåk,ӘµDQ9r –D±äk¶UqKt)łU%hԊ­%„ĀĀVĆŒFE­^D‘²lgOŗĘ–ų7EÅ52„Wšj×­ Wō·ŃŁįxI.٤P=[ÅćŃc0„žøEųƒŅ4”÷ÓW1 ³wV1źlPfĪ›šŽæ&>#žTū«Qģ]‡ÜÅĀņį¶;q^– y‹Ftnd7+©Ž°S*Wé91ųs#š™Ó‚j(‡'N8|8¼²Ūķv:‰įZkć+Ÿqp=Čė"µ%“k„µæ×õ}Āś*㯠f©½M°oqōHŖV(B4‹į•ˆ×1ś:nŚ“«äjō>ĒF‰ą¤zµŅ…¬0īøķöė7l ¢‰„K&wģt•å8yś”LŒLŖXˆ"Ī•RŽŪ3«jč ŗX0æq-p!c”¾ÖykEk" <:ŅķvLŒ”‰Ų3ŹfX™®ŽQi…“K9c&¼œB,EV"(،Ģā‚E„"Ŗ"O…Õ¤j ClŁšŠU5¢„°–I‘0²,ÓZ'šH)cL’$N€ĆOœ§”µ¬µ"—(EĖęnV+#ÜQƒmĮž™Y;7qq¼ųĖęhĤbŲäėišøÓŻ«fTĖbü5ˆqˆĀŻkŒ1΃JXŠ«ŠŚJŒ¾hŌĢs›jĶ™ÉŪ‰"h&Ū¬°cć&0¹}E¬SØŖt:„ÜŲ÷Gt*žāƒRH“šR4ė­C@i`ų‹ŠmټeÓ#Īx“r­4Äņ “éŖ5ĶĶ™ŽzŖBÄvīśHņŠBŽüÖ7_ōŻoh’¤=>>žĄüźg?õ©§ Č{}’T_}ś”\Āé7—Ü®X²”'»æüõƎ?ń„õūģ“™¼Å£½ ”P¢5+"BAg‘»ä`̊–[QģNÓÄä6M“©©éńń±˜õĄ\ŁpT±Ź¼•łB³§JBI‘®ųž ‰Óoפ•Ém’j¶¢‰+`1H ”3¬µA?•¶Ū2Æ+õJBõŠćŻ„fµā{U0V ¼l­č„Dbźƒ I…Vp'Kü„ŒµUguB¹ łōYŖ m4A4)?)X{ÅU¾’Įī½÷^ƒ$ÖlĪŽä éĘ '!Ļs¢V°Ŗ"]śŒ„ ūF¾k­MTҐęTŁIr ΉL[r9gęחŠ@„śS|®µ¢šĶ{«@Hm£“:„GŌ€] B2kĮįC-»’Ąį™X#)=D;s¾Hźķ±ŅYš'õg‚1-wV—TS`Ł%åŒŚ„éG,ęŅ09¼V1[Ŗjś5>•Śu3Ć6‰žØönŅt: 1#%6T{^”©õ÷E"’²¤#D·N…šma¬~ĮU«ÄQ"ū ŲNØō²„„˜ę ͉”Ņša’ d81ƒÉĒ ŠĆ.YB³“·:½’Ļ“ĶgŲ+#¬ mSf -?śÉÓV«36FÓķNOMłĆ^żæ¼Ō FŽØS±¦¦0¢ņŁńĆZż²ŗ üd¶6g#P€‘ļ½Ļ'!Š&Š|xų•ĢX®\Ķ¢ėZ«<7ι„^ÆēXs½nVb \ĘŠ5Ķsćf8Eh—Bh”™ė½dā;Ó4©DwĪU„0>q[°ž$ļõ’$±Ö*­]?”płÆ C@)„µRŗ”å`—^F¢p9š'M—lÊÉņÉÉÉéÉ)LŚį}A)šJešŠįĮ°Ö#oqSnņŪW”[¦µīõ2†9œ“Č…XĪÄ5¦‰Īø“¤ mü^÷Ч>ėĢ£Nųż5†ņś®£RJ»»H·įč" ¤z”ҹŌp×ļ“»dYŽĄŸÕ¹ ąx“Q§fūÜóŸyųüč¾± ĀlvķÜ#U,Ö#i0k©±õœtE¾ś%© 7ŽzsۃY»×nnßøłe®ģ··ē˜F<˜:—ׯ0śy‚’ÕĀżM[·ųÖwæÓY0qĀĆFŠÖŠė85Ę@ Uį§ķ±MMD&éE$c^r4¢§Ģ,išųčM¹z“Šét‚%ƗÅ.DŌ\čqk½ß5„¢ŲD :It’”{ Ąćo¶Ró)©yI¢ćAœÄX÷!ōĒÄ·H7A"Æų*‰>¦“†­Öiģ \@D…j=¢ ®|¹ ąÖiŁCĶæT@„dļ’ōK_ü“ó]÷܋¤%ŠńüdMTKTYÉü…ņK)¢…8Ҷ£2µĒZB %, å=GyčŪw§“WTiė¾O`ߋČų˜Öw–ƒš‘hėģÓżpåY¦HāTė›ķO†ŻķĖi+īœTķF÷-ÖTū5ēš3ŽłwŅõ³Ņ†łĶ¤ż©¢Æ~»Źžé4£fa’ķĒļÖ;Ɖ¢ éĄ,GĻq‚elĢ?ž.Ę4ēXŗV_ˆ»hkٜ%„nåeöŃFč,$TĪ7Ž–A)r „øöœ‚ž³S± x–•ž,Ė\¹±Ļ{&x’vény³źĶ¦Ł=…A#1DŠ2“!u£ ƒY4 —lƁ×O5øĮJdöfH”ģžÜU’“sJ Š,[! Q€¼ļ毞ķ|ō™}Å+^ńŹæõX«-Ģ좙YŃ×Ķū;”tŖ‰ęaĶ Ŗę‡<ā*čO†+Ī‘–†ÖZi’nļɏ;k’}ö~ūŽ@ŲŅ,'ą-©ā 0X2Ō.Ó³fĀčtŚnŚ–'^Ętnh­½š!ĪĆī_āä@Pv$ōݱūOēײ±żÆŅeS"w„žŹNdŽ7Uw°ĘLž‚öļ!ŠBŃ'“ĘŲ‚?c¬ń.vŚAüR 38m·Ī©Čė©BĢéN¹>va„Š8ҵˆ:ÖHéW*WAANqĻ—. ,TA¤]eŒńĶ"e›C³GĪŽĖ[3O.CgФ‹0ˆ“µņł /\±jÕ}÷Ž\™Ģ*Ќö3ƒ˜ś©įõÕŗ¢¬µ¢°(Üę¬a“Ū š„ōå“©•„*ŖŪķµźåĘ&0 FD°B.ŒŠBf¬ļ4=@Š®'<ż˜8]Ė„żV7ĆD«rGŗ]Ū?< ½kvŽr#C;q—S£Š7šš`ūūŠē?4€ĘŠ ĪUO“š]S-yœƒ¼Ł(ˆć¬‚ĢFYõ]lh4[|ø“CTĪĻL7Žs\ó`/ŁR–Ęg• †~wD60CZ—GāPnēØµĆŻņ¼=¦Ä4²Į+2ßE^{gW”žŖś½XfcŁXņŽ=€‚NƄ Xń§Ø;tN’2 uš$”±S@#„øsKƒ‡OŌ<Ļ1Aŗ|žUĘQ:“ūyĒXįL#sŪģœQ–eĻw%+ j§Iņ­ļ÷_?ż©žÕs¹›‘Rs¼×>¤¶°Hn½qĒĘ0Eń.k/‰’°^÷­*iR`™Ś9łūßü:3Ż÷’óū®ść“¦BD‡łR4=t!5©ČżŒœ “+].'NҹXM®ćĪėņR!Š«åK”Zģ‰œÅ•”*—U$Ē$h­’D‡ęĄb×-0+_ÆX’V EŽ<ÉśZXÜ$C®2Ļó:ģõ{å!ZųĄ/¢v»ŻjµLķ­‚<$żC_@¬Ģģč5„9ČĄ”ÄcB\Ü éqņŅV«¤*8ūĀÜ%Io…%ąž‘ĢNO÷rMVcżĮ1pķõ×~’ūßW E N¶Šw1CTˆ›ÄBqXXš> !šÓ6%ŠbńN9`hśųæ}ņ¶»ļ¼åĪŪ»Y/ڶ U(£vĄ śŒJiÄÕ¹ā„ŸT-Ü\‰¤I¢4Œ…åĒžż„Ć=lĶ¢…ū,YŃ_b®į0Cö «ēĪeŸłGS(TŅW®\™³ąū?üĮŅ=v[²r)t!k_ČŽ+]’BkC`vōw׏DāĄ4ĻO†/-PéÅöėEܛ{=¹¢Lęę³cHĄĘŠ 2Ī^Å#z)R$>3ŒQÜ<ĻCQ¦×ĶÅrcRF“¾šNŽ¢WEĮĮ/ DH%‚šr¼Ž“$IR¦~÷š®~Ó¤°ņU.ÖŖ÷7Q{,ū’%N°Ģ+”RÆzÕ«z½Žé§Ÿ‘D%½i3¼ĪŅHč¶£Ęt£y~†dø„³49Å©$Õ­VĖmw1ļ€Y\AdČłėd- Ū©›z‰"ō¬bŲ©®ßØ,,ÄmŅ~ņ-ı]_ŖL•@œ®ģjøåųC‚…Ō¼`jµģp)œ&Śšč‘ź •¬įņĪÓ@ó­ ²:;2Rüm”Žk¼6§?’ł)ęŁ(7|$kł¹jüé¬āū˜˜4śŻ6b÷"‚>Ī@ķx‹kŗD˜›#Vų«éééZvŃX–pÕĘśŖP”aę^Æ7hq†L¦Ÿ(Ž8ųµ!m”¹FlˆtŽP "Ką4®£Ć‡Ŗ{lö3€0“°p%#D?=Æ@Xض«EŹš"”yīž{ķ{ć†k§³ŽŅݖ޲ ūø²RŪ¼~88\ƒŸĘJ1"Q½×ƇĀi§Ÿ˜Üf„gˆmäģ&UĻįŖ.€7 .źDŽU„ps–Š®.&*•–Eü""ņ”/gŒ ߗmɚŚķv`L Ŗü ;=ķ܆·oߎąF.åčW”ŻnÅ~5ØPŠĆźK”9¼č¢G)ˆå¬ć½E}:Ԋó"ž3[)ۃŻn74ˆ5€ēµŖ_üM“ń*£l¢’"ŻsĻ=[·nżÖÅęĆQ„v;éõ‡ø}z"UšœkN¬%Ø&xQA}#ļw ’m–āš:vØ”TŠJÄŠŗ‹§pśń«÷¾ńGæłüŪŽ’öW¼V3‘`ĮؘēļŒzUɶū ÄéŚhØ ī8ŲķbA}øāōœ!„AÄś8]ŒDݤ™~2²ś/šT¦G‰.ŽĢŖRP³?b§4äƒĀv’¦!‚Ūƒ ę]€ˆS8`]åpŒŪo¬¤4io0 ’’Õ 'ĪŌtZ 2xP}I”Ÿ¬ 1Fw…aĆrļ<>>Ž(dēłńŪö·Ė»MŖÓé©Ng,žÄųµŅŠ ±‘²ßF(ÖpŖx¢¦åhŒš½¤oŃ+v¶]õĢģÉ~„ˆ®OL‰T4=Tsż „m¾KTUõgLĆ^Æ×h!gĀCPD —”PvՈÕ. ¾ö†'Qż—Yö÷‰Ģ–BX3jīŃ<Ž-,ƒÉcYād‘>öń2°fÆuĻ|ń‹yŲ)I2ĆLV7‰,°ˆ±īōž8P@š„v4ĶTØą)Żxæµ6ūQżõ]§Ė`ķWЂΪ.±­ć­§<õœ³ó˜=V®øęŖ?ķ _Ū‘źÆż°,–Å#œ¬“&RaR…샍YÄ2Y–Üųźs•X+Z®Ń+÷z³/0ˆYƒb‡)9M9¤XĒōfeMJ€©^—ÓÓ=ONƒƒ£%·Fć Ę|C«&ńy1 „€V““h·ŪĖ3xŚYn H’$ĖŗŽ’Z4ē1ķvj­$zēŽIL–9B-C QIŅ&¤0ā/ŌG$Ątošƒg 3–­KüĆ/ܘhµZ"•^5“ö™Øy³õøŗVŖŻnY¶±n¹±ŽėÕ5ŗ Ii% ķŗEfĮXwŠžŖÕjxÜńÅ6āiććzÓ šz”PBV ‹õØZaOąŪ…ĆnĢ$¬‘ƒ­K„j~_ń®Čž· ökXbC Ų‚éß?s!ƒĪ|ā¹Wżņ*×$"K°üŹMP, fGį˜ŚķuĖ-xtģ Æås$„51ĮĀ(+ķ.J 4 „Ž9ī8@’TžįÕÆ_ŗteglį)§?z” ÓI1~l1čõr·aŲžAĮĀf¹MMöņž@ˆaüčóŸvł·¦«®¾ŗ½pńbe-X !wa AšĖ[2e‹‚KU˜Y\*8££ÉJ@ šV¬§.;ƒ:XĆtsbqbPķvĖŲΧ­ģ€P#Ńš˜ Šrr&ęBĪ,ÄČDg V8”LA ò’ŁDi³R(V ©„¬£‰ Yx##ˆ‚)++7VDł©+Šr¶J‘ß© iŖ‘ 0¹…83jæW VĄc™œļzAśP,d,,#7¤µ`L Čöd.ĒÖ×_·1Ŗ¤(Õ±€ÅC}NĢĶp¢Ö°†@°ĻŗżW,]}ŹI§ŻrÓ­ž}bKm_ųPJ)†÷§ gVå$ ”ßx}ÉĆ3L¼"Y©ą„.Yœ¬cŁČ¦‚U`]Čģ Ą0JÜņd]É|grt ÅOB ˆ‘üšßøģ—oæē§?¹t’}÷ūžė±'< (X·9ų'Øā»>ķB™Õ591Õ“ŽøÆ”1ÅõkĖśĘū Q‘4¢ōRnGNŸŽ„&³%“s 75¤f SDæV؟ąįqG±bæBõšÜ²æTWŪ·cVĮW؃iÅ1óL a?67“:E_ƒVe£Y,Q<UķwBéĒu†ŒÉ(‰älyŌżDō:9wD@xA#ņåöж1 õVčö,eĄ%UU‹ D”> 8jm–Ģ©÷eæš{Q_±¼ņVs-vĢh“=Źe»Ņc«Õ jŽGĀJŠĖńp {“!‹!nw¾|š3Li€•žZŹĀÆhp?³$3ģJ3š׿“+™K:ī;ĖÆĀ „G§lĢnę™^rŽģčJ Ųš—?rŠĮŠ ibĮmY@š†„T§™š !ž‘(€vG{’åÕ G?je)̾Æ!®£—ȸٌJ<\«sūų€¼åo_½ūŚćO>iķšŻ¾pį…P4cĶ5ˆ@© ­ ‚ä1±pe§ÖŠ“B¢Ik•±öi x|#)&ž&Ұ,ݬǮļ;ŽĶ ×j|Ž]‰‚rÉؘR46Ža#&³!ŌDķ“„Bę)¾™°t@Æ&m-;xJď )$ItæåzUŠjuÅÖŗ½2Ėsk )„“Ä„² NA·R_õ`Ė6Ė\ęJīTfŲĢ :­¶±±n„Å%ü¶hĆ„>j!‚N”7hu"RJ¹F)ÅFYg¶ełß²hC¤—ƒ!'B”r8;ڜmīnŹįR®źtōŃG ˜M¶ń¾{ćŸ65™sø…YXU;J.¹ĪoĻ3ō ĆUŲ Dˆ9i.D_i9A A苈”±Z \›Z¢R›ź}N<źÆĻī™§œ²~ķn+$hm!Fˆ‹źRĮź?=Ó4čr^„}Łžīį§QBzÕŚ5_ŗäāÉĶ;W.ZŃJĒN>呣ĘC (æ” …‚FŲDC4ŅNKćBižg›·&¦M“øąy/m±Z»`å^KÖ°`bįBN$¤„ ›D¼‚QbDēHXČZĪ”Źž÷x»ŻL%…$ÕyĪ@£ YF Ēzœ­ A‰†V^¼ŖšU.X‹ T åk”>ó©Ƥd;‰¤ ńĪn+cēŠćt TRšŃČ3Įücb‹ßK¤ŃÜĄŪGiĖE ĻrEHķeü‹ŹĶÅRdA@že¬Ą$;7mR–„Ą„ ‰an‘m§d[*%JŃJ“ņ,q”»Aµo½Žōģ£8‹VMšE»ZaÅžėļŽśąEßųŚæ~ńßvÜs2L4Ā$Lb.ī‡õ@< ‘\ "ēg·–3“‡eŹRHf©Xš H@ÄQN­ź®ŠTš\eĄS’ŪėŽ~ĻÆÆøčY!ōŗżÓå·ŻtĘ©ŗįŹ«6]zPžV”µŽ›ž”RžÆ^£„+½^ĻūGf.®‘$ØļUŻ³ÅŚ hČeČŚœŗT°ą(„!QŗY- Ö3*ĖīŹ ż6Šćƕ!‘üHAł'BG̳jał|Ņ·ž 9<_æN@šŻå„łłö÷{<Ę*j»Š09ljTžą>B0֔ŅE]§‘ŻČmˆU”ÅÜś¾|%RHŒ5Ó½©nÆė€ŅeaŅõ„•)Ō3h@jÓ®±…}ČĄ*„˜ł¶Ūns¤ķ9*,ØĮģ;ŖpŖõģr/ph?Š=»ŁUEjöH„yƒ*R}׉ųWˆIRÓ’˜k£•}¾bWäYÆ"Ę\”ń܈5ŖóĻ’‹@žw*.~%źī˜\³hw³k®ž Ų@{=p­4 k€Ä’XEŠMX¶~ѱŃV£é?Rqõš@Źpē;2ēvŪ3fĪ"AØĘzEŠHaÓZéÅ«Wō³ŸłŅW/ŗī®;æž­oĆĪŗZį04_H*œĖl ĀōEŠźaĒ«ˆRÜ¾įzźY ˜D|¤h˜µŪmENH‘’ H+3 ­tDP…VRzžūj&CDlf”"Eä}jHDy@ƒEXŲ?g[ņB£-Ā ¬£OKČnH‹[a+yneŗ­D'P¤Ó„“4¬, Z‰E‘ łZƒ+ī8Ö+³$¼5Hū8K»÷¬–Z’$‰Ė¦~ūJ”H(7Ybl*Di 7°D¶…L;ÓX“H·]ļGŌ LJĄĘv§;ä@tóüóŸż¬£V9č~PX “vm~e&éTB®„U”śL$֚‰¬kf) ¼AF_ē¹–yŅ±'„³V’hŹA*Eré÷æwć†«Æŗž/P9‘õū­@¦z÷ŽrĒÖū,HæČ- EX ZiĖL ¦~©Ģ° c‹-Ås§YV^š¬ēŲŃŠoõŪ„’“Õ9ńa§ ßvJ @»Órµr+`@µ“k nwZ®ĀŠŪŗóŻ’š¶’śæéęņq“W/²)ĖD²hĮÄԁī’ÕÆ~„ĄŠ,ʬMs›Xؘ P]”I·›Ū‚łBܤmU4ŁJœ  ę7CQ¶±ŒG+åČ-DŒÜ#ü „XC“ć¶"1Hz©Ī ­N¤²Ķ[§6m~š¶{ņ­Ūѳłt&"ĪõZ ģó?å‡@1ū‹pt\—ļe™QŖ¼8“U"™õ9¹¢Ņ%ŽeĀ…n¼0X8i„łŚ×.Z²jE«•~ų}¼žź ®÷>Q$F”†rėßI9ÜÕ„+^ŗ_ ÅėFÉzņ ØŪ‚( *¶Unٰįu{æü/xņégŽqē-H¬S„p`]Ał-„¢%ąŗ°(`CŖXĮ•’Ė¢@.\‘XćF‘ņÅk «¾u¢ā8ž‘Ÿžą'Wžį2ÅŠ!“-Z0ŹŲØŚ¢,}ķŸż§O|ą'æøōžŪļzż³^ń„ųēm¾IėōłżŅ+o¹ ˆ”˜jųgMž¶ø ņßjü3ĪŅ“­”ŽC;­uš¶Ź‰]# )EĪĖ\kÕ,ģ_IWü{?9y.āLC€Ķ`Ūn·kZ†5öė(²»źŠż³”C1øHm|…=zŠ5꯬ZJ“ ‡0BÄ>zwwævR?“6čżg–’§Äu6æ'1ś+¦%Ļó†j?©W‹$ȱ‘ ¾©9µ(;·?q³j||¼Óé  į¦f͉­qČg“łvYĒśõėŠ’eˆüN„"ÖŅ 5Č`› c a~¦õFƒ%µćz«·"(Šā(B¤¶č)…3¹"4}ō&€ebi·Ū.7ŸÉ?·™0tĮ[ėBĖÖ­ž·¼łM‹:ć'{üźå+ ‡6†?¤I i ¦DŠøŅZ1 Tb}’WYhØRłü¹"č2¤4wa$‘MČ\;‡ĖēęĄĢŗ#QALr„µtHk-(eDØÓ±Ģ‹—Æ`5³¢o pnd…‚Ø@†°Ŗ,ÄB®¹įš?\uyŒ“zĪYO¼ļŹ«XC,˜•øą€„ȫԐ°¹+­PE’;a…Z9I%JD”&cŒĮZ‹~x)ĢŚ)KZkēŲä c¬1~rYƒ©©n·ŪĶsĆVŹ“pŻśĪEĪ•`˜+±æ?DĶŹ~ EŠ  C9ü\•h ¶@Ž»Č^[ė@“$¢(–ŃB­ĶI+)Š‘u Duą`v£ Ģ6Ļ-‹V˜ĢŠŹOp†1–]B›né½Öķ±téÄńG¶~Æ= ĢbūįŸtČaG¬ßēŚĖž”&©R佉(Ń¢Čr·ż(”M£A€V­VĀ w^XFoŗM±¶ˆ‹ )ōc@0,ģģE@dä”#ƒRĀļ~ó?>’¼güģāļ+Œ(· C¢Ąn3Z:Ń Umž ;[_r(~”Ȍ䀷-złŽ»ļŁŻ¶ćGß¾äĮ»īž.GwÉÄæ­O <ė›@Õ~aŠßADœ¦“«eų&ö`»F°Ā¤”æųt(nøjƋžö¬3N~Ųßś.˜Ŗ Yt ŗ1gfb ļ½žUÆÜsÅŹ6mzõ>ōś‹žõW·^sÓÖūūė_f[·]óū?½Gq łf¹ź¦kĶX]SH8‡ŸG¦\CŖŲnw,ōŗģ!?HÆtPų=z“Ė©J@;¢«p’ŸŒ¢&'5ż-ėĮčag,10"®9Ą‹E”†¤Ä³…LęŽ Ķ4ĀsO‰ūąQæŖć8~īØĪ,Ėæāæ©ežŚ;7źž7žaćWõA¹Ópc÷Vʘ4M‰ŠjyµFßæRnĘØ”„£Ņ«jõ_ü >ʐ :ŒG« ”Æø„ŲØWy­NĘōō“Ūm·ŚžŗÉ0™+ $ŗ|üĆŁcي·æńąŗĀ„5樃=Dba>Ä>0R~cņß0¶lŚŗnķ7_wĆ/ųS§SJ^ R§…閝ģ–"±(!aÖäbA]Ļ>kK“ÉN`”/7“Ć–:/z®ųC–ų€—b’ »°Vˆ43'i*P¤WQ^õģ'ęI °øōŲćdķb.„iŠ{ķīśß” „čĆüĄUŗœ,k!%ä q„?_q°67 Xk’vŪ}n·›I¬ćŠ)­IDŲX  †·ŽZcJ•ĖÉ]‰‹ā“śŗ^K SœīĪ÷ccķV«?²RNęZ%IāŲ$ģQdŁ1¹3”W” 4,ƒŒP¢¼Å6Ä1Ū­+Į“7ŃįŠ4^(š:Ś<—Āo±<„;æłąĢe#"8ėäÓ¾yįW®žĆŸ&Ü2µug¢źę;6nR;2m! Ųµ ›R'&Mu[°X»ĒŽ{ÆX¶üź«®¾nĆ5fĒ”R3˜|śN{Ņ>i5·ų0]“‚‘üųŪß9xż>g=ü“×ßś®×¼iķ¢%«-V‰\vj[‘oF8³Z+äl§{’ņž÷½ķ•oŲqóżd9Ī 9…$Ģ –,=ā#®ūåeæ’Ź·?ųƼąüē¼÷=ļ|Ė?¾ń¬3„R޶}”1Ä*x,_Ø­ĪDtVz‹TGj-䜈‰¼ŅÓ<¬³xlįŠEO<ūq€^^,4#ż€“Z©"Õiw)/ØNAŅnå¹%ĀsŸūܝvēÖm›ærŃüčg?zŃ_æčļ}ļ9ĻxśwóĖė6ß{×}÷æć-oē+_ū«’łī÷¾ü_Æ}įĖī¹ń¶Ū®½ńæł}¶eg~ć}·žāņnłé%?¼öŠ«nżĖ ŸłčæNmڶcӖ›¶”Ė[Ų Ė0QŒ‚—D8ąĀ*UQS“ WO5*Gi‰\&QŚu¼#±–¬xxQ@Ž… ŒDm½ł®_}ėū‡sŌS^ųœ»6ŽŻŻ¹ćȃ^Ųn?ćÜsA§}Ą„d$F%Np®8ÆÉQ3±µZ… ¤Cf•śŚ“SŚ')„Ķ<2ī‰Vīæń֗ūŒ{Æ¹é­Æ|ķaköŁgåZLw?õĮĄN+ĖģŒg`0i„“„*›ŗ‡”UŽŖ-@+!1’ŠŅ®ÆµŅņ„?’Óo¹ūŽ›6?pĒŻe ¦.1Č¢ ¤Abeڱ”H+_ød™Ü±ÓùV|sQĘ ĒwóWn~ÜqfēŽÕc‹¾ūĶ’nĘśb%g„Xģ«ßō÷=ĶK–,Z¼d¬»s'Ūü»?’Ń÷/ūŁ•wlųŽÆ~¼f÷U³Ŗ[:…$gf©_lÆO±‚»Hé6A\¬µ'3ùs5n õDN†Į*ĆшAæ­łŁ†Pæķ G䈑Ļpõõ¢ē` U6Æ„s·GÆōæf”@wV~N#~%#ĘčÕ \ąA’2Ž%UʊАµ’¦óĶ~gH ’–śß iņę?— żPš d5pœęĒ™Žˆ¼Üx%W„F«Õ^ęśx‡ą·~$‰1,BZ“ēõØfŅ©/®W)‘3ŽLä<ÆÆx•lŲ¢ˆn”ó‰qŌ_Å Ž?ńu{Fؔē©`Gl¾ćėŽšŚ ¤Ÿłųæ®ß}ĻēæņZŃ bēˆrDsļŁNPa&RÖ²J k­8äĖ®¼|åŅ•wÜr+ŒH „–<ĻÓVK{Ęɹ€@ˆČ²UJ)µÖŁØ’Ƌ՞Uty‘š8avŌAkv„m84ːHś^ÌB;Ż[bJQ>JBŹ”Ė~Ģxńž?µ"Ądy’ø0Ą’čħ—T×@X4¾P1 0EęÆ_ūw«WÆŽpÅæūÅ/^vĮ+”!єP`lhJiŲ°%I\Õ³¤R8 1CÄŗ½Q²\µS^øpP)ĘŌTwl¬£ķŃTD‹½4\Ql­ŅŚńqājE(E¹Ź•J¦hße0³NT,*[@D%ßą¢Į£Ōil‰°&VZ Ä$ßC-Z)O†ˆˆ&gėÅØÜ„³–™¼M±—)r\uń J¤Ģ1“ŪóüŖ«’üÜ>goZōž÷¼ē¢oü×ĆuźĖžīļ“ÖŻn—z½‰N›:miAČט„PDE¤$ HŗS½–R†łG?üįYO>GµRf«T2€Cõ@ ”øˆq­°†’nvī¹g·©}ß·~ģ /xĮ Ž\æļžrł³ž|ĪW/ž¦®MpŠ—’@%Č ³9öŲ£ÆŪpŻõ×_wōĀΟž÷·—żę×_łā揷;išžźÖė’B~qåļŻtß±‰lzśĢ3ϼā†k~’Ē?L,]`‰43%ŅYÅKVd½ź‹[mB9½\0I°Iņ+ß~ēmŗÓšŽ ¢C®ņ= cęaGoüćĻ7nŗĻ„y7ßu[ X¶x¼·sźkŸžäqūļó…æpåŹ•O=ćį‹/^»vm»Ż6IrĀ 'üę_~Ēw|ü_?yÉ%ßZ¶|å—æņł½öŽē¬³ĪśéĻ~ōõÆż-oǚ5kņži9i:¢2ēGE#^,wZcp ¼­ŗ-p5.rż Ź«:…—[ff­’©M›ßššW/_¾|§d ¼ķŽōņ¼č¢ĻńsŸū܃›6÷ė_ĀłO‡µ-̰ Jżī'Å'~į’oU) 4)± „ŚķŌłĆ9Ł?Łgö Å,ŽŠ’u·m;źĆZ·ž'?üѳ_łŅ7žó»”’Uc·=ø†‘*Æ…ø;ÆŽgźX9ĒŃjŖł…ÓÜz֎) +i+mߣš˜(N [2±Ļ¾ū/]ŗtŪä”ė;` IJm#a²żĢ{ī¹P÷]}õn'ÉĢJAi0‰O“ uŚ—ŠŹµ„*Uˆ£ ė&āI£×(µŅpäž’<¶’’)ķ¢„JdAå®į~`­hM`)Š,Ī,˜Uˆlfµ5…ČOČ48TŲ=!bDŗóėžžÕļūȇˆšĢ—½0Ÿźnß¾ćūß’~Žė¦ććH“ˆX.¼C"ģtū}-€u–0×Y@i_©Š ¶Ł&(Q w~'3NGÄojl½e”ÖKYB`fMQ A%T=®øFŖ!ŗP I§¬;>>Ī,.».ōBį}5…ä¬RŹ?AńÕ*ā}‰žÆ«œZw) a!ElD)&؊³±04)˜,Ū±ćŌc’õ/~ś–7æé}ļyןwÜ÷­?ż2UzéŅ„c«–pčĮėÖÆ_° ]Ć8Ä'B"¢ˆ~÷ū’}ź£ĻŚŗu뢱Jū‚ćĆSS”§ˆa¬i«-]ŗrӖÜ=¹iĖĪ­'žtĀĀE >šžwÕL‰¦¢³ˆ'QŠ €NBą½÷ßoŸŻÖl{pó»ßü—\rɍܹxbįŽīE –NLܽ™Ö°ß»ßūīSóhķøä$͈‘Él’–i! ŗ›3`\}'®–ę °fђ+’÷rŲ =qÜń'¢éĶ]+Tmt¢tŅ`r›$:Ųt6¼¢5aRŠĮ'ŸqŚ=›6£—½ć’d¦{7ŻxŻŖU«^ńŹ n¾żöæģŲB„cVÆųöw’§»cĖ'sÜé'®X±"›ŹĘĒĒĻ~ņ“ī¼÷žå{¬9ļ¼ó¬µk×­mwĘĒ'A+’°“N}ōé*I¬µEEĢéRP c jŪLpv ęĘæČZ£“$h{ ˆtdĄęösIYQÖ-NW„J4©ŪÆŽpĢ1ĒLŚĢøfĆÕ| €—æé ^ōeŽĀĻ|öłŪŸyž&¶¤“+9YĖʘV¢HkŲ°(rŻ ĢL$J)X\sŁeæųķ/_÷ŗ×„­ĪʍÓEĢāŚ( + D¤½µB/ÅĖ^>i§˜Ś~öłOŻżążrā-÷޳ŻLķ·Ē¾H•Ū»tœäz­] ”jÅīšKm³† ŃiXąĮū6īµ×^ė–¬\°`ĮŁē=éo|c{ń’V«uóĶ·¬\¾rŪ¶`„  `D$‡(r ²>9宅2h(čBj«v@²ķ*Ń>Ō!ĆĒqÄŹ%ĖīŗķöŸ’üēĖXo…I+ĮZfV­4䏬ķóäK‡¼ņåoyķ”RĖW-‡’JśZ;² ”Ø»®¹öŚūīZŌJærŃ|ö³ŸuøeÓfŚm|Ń5žrŁUWœqŽ3­H 9Wg*&ģČxO%2‰BĆȪ~.jkÅZėųŒ•"QZŌ“l=¾(ˆ€j}‘óøįiBhvś/óQ®e.3KnCä{4 ‘‘AÖG¬`:bŲ6üRƒ4Œä‡õWx(æD†)÷J,86ü«”ʵÅ?®æĆo3šG}qōÆįV؈äÅæĢ][kkž³ösk%Ļ]Wņ¬ļbų}5Žf’c āŁ`ķŗ½yń}1nVĊ°°›3?˜lüĻż’²˜Ģ: ž,ˆŒ'Ļ~ÄwĶĢl,ĖĘ_’æ*;óų3—×ls¶¶łA8’’H3ßĶs7 ",bDra±"™ø`å”KÖ¬K­F«{’f1<ć Ž88SÅ3Ū÷ōkÕˆĶżŹ0bEģoæ~ńYłŖ'?ėævIńnŃ[#¹żĖĻł¢³Ī~Ūó^ü²³Ī¾ņāļ~ņõo~’ß¾ę~ģ}7Ż"fęEŅøīsńnīõłĖ_xŽ»Iōϊ›Bå$·•߆Ū5VvNN[–©éž”ÓžX#Ö?q–ÉmŪGzdŃ5°H/Ļܼ¹ī²+?ń¾¾õźė$÷ūW¹•±ˆa1,,llLhā©’MK6-ŻIį‹ĶÅųÕiDz¶X¶Ö ēÖ°W޳’±™ŹÜŚĖ’Ū’½ōóü’חæęo0/·Qęrėę°ö3Sć¶-Ū…£ż!Zeas+Ng’9Śa¬ä=S~¼ Œ•\Ċd,¹dŻ\¬d™ak­ķebEzüÉ·½÷Ø%»B‹ßš¤ēœsĀ©—üū×ņ·I.’[a_­÷לūĒŹF˜ÅZæ\·lÜ~ī^é&{<7l×Ų®Éī½’G_žź#bYrcŲr“ł˜ĒB KŒu€óĪ8ķž®ŻüĄ†wŲš$¹mĖl¬{7“m¹—ńÖ{īŗūĘėO<ęČ®+Ņ’K#Łļč„Ė^uιݻī”,cÉĆéZĢXwČJwGĻ§ó°uV…+k3žI'X܊‹x’r6Āö䣎^€±ĆÓ%·^v„4mAaŪ)7Ęhŗš¬Üü€ū°Āaæ°Ģ¦×›Ī󞈓KÆ{śqĒė–.zńÓĪ‘lņƞr¶ŲIįÉ/~īćw\wM¶u³LķäŪżƒĪ3±Ę|q•’럯±ńį[īWŃbtŗ»ī’斋?d6¶7Ż #ÉĘßuŲu}“ę„ÜsSŒ$gSӒŁģŽö[ō”GžŃ¶mzPÄ“±dbz²}ēß=óŁK·æźU"¹ĶĖ=Vń’DDŒHęÆˆŻ”°,†?ö–w®ŸX²z1tX€ÄZÉ2ćPnŲŲč,¶’±tYzņæ?ųł!»Æ_ŁšŠ€(¹‘;Üæ½tµšLā™ǁį­Ür†9żóÓý[–s–_{ş&€'ī{čÓ?žĄd| Šīh–R²Éa­å’ü’×d7ŻcÜī‡×}z8Y2sće~ÉSžłś¼ģęß_įJ9+1sxĀ"9ĖT¶ōøćN9qĻ>ń’Ÿžo‹Į6į‡žWŁćN>y)°»j-G"¹qęm~ƒ>œČ4oæś¶³ü¤>ö¼u+ŠØ–ÅŠLgbDrėBj#Ņīŗéc¬XćÓNæFÜ8„„aYzVz6ļ“Y—rŲ.sÆŲвā_‹óßś<¶7±§­ĶĶäVŲ¶€Õh­Bźd–Šō"č__ņC™Ź¤g\tķÆ'įmlŚoŸż•Tu’mw»aqĒ׹o„E¦z’Ė ‡±€0Ł^|āāÕN čCo~‡ōÄåĀ™pfņžˆķ‰ōŠ9Äl8¬[+bģūŽųĘ=,øšĆ–,óÓÓų×Ę{lfņ®p/,įn.™‘ééé­¼įźkĊ™Ź¢ź‰oėÖÆ\Ž3“Vz’O g¹ä¹ˆäVņāģ I{– KHrwŚŲžHīŅ{#’±Żt’=’ē²éĮū.æā”u{ŗx‘H×rχć\?)²ÜśĻa1Óy6Łss&cW‘.Ļ®Õ€ŠŸdl³ŃŻao“""Y–¹gōOóź5Ŗ³Z§Ą%_łŠ˜¼!–Ø.C6ÖFS¤œĆÅ Üdóė×oŁÖmŽޓŲ\L&œm¼ūö–-]·÷ī2½Ķ˜­";dzswÓżĀ]įœmWĆb“ĪE2‰’’¢0į7„"‰ɍäFXL–sœłÖeėo¤ČŠżĄf¹™ĪŁÕČB'=‘<:zfó†ėN=ąąc×ķuųšŻģHĻęÖ¶½|ŠmOxš)'<쐉%;ä±Ģ=ɦ¹7e{wožš›ßõāóŸ#9ū}ƊdĢ"YnsĆ,ņ³‹æ»IJe…e„ź¬TgžuŽ» ±āˆæži#ÓFz¹X‘SĖ”÷l-8yŸƒ.ś·Ļˆ±’›[6\óų£O<`įņæ~ź³ÄˆÆż¹ggrŻ€ż?®Š–%¹JŃĮÕtÜ)ŪŪ1¹Tėē}ņ1zā“•{<~߃ؠ^k` ŲwńŅż/]Mzč+Ēv€ŻŚ‹o½üw/eŸњ΢Ž}›C9UŲĻóų'”ģõʗ¾r/“[¶oŗXvdnĖĶ„s‰Ŗ‡ńŁgB%1?l·Õk€ƒ.8lŲӏ9F8+ĻMöY‘\dJ.žäæķ•¤«ŠŽ=Y°{2.ÓÖķ½7\sm 8aĶžW|ū{űäV”ōž> ‹Ä┸Ćź%­‘sQ^6ākÕė§§§kłä<ńæ!ČŁ¬F>Äõ>žß¾K >7y/ėGŚfQˆ vī=łó_ԃ„¦Œ¦×ėEYī÷m[Edyą¬j¶˜~?’>œÜŲk> ķé±č ^ßY1bŽŃi¦Īo¤i:ŗfڐFš!ÜģŠĻmÜU8ų¾½^ƒ`ÄQŖqW‚yUm؏Ś×Ćį)"DH¦IøģXŖ59č~źNЁäĀ9¶6Ī$F“RŹZĪsć8‘PE”&=Ą8ÖBެ? Äā’’M½Œ„“’Qé,œ˜oGļžm›®üĶļ̽÷C%9ŠÓ”i؞yĪ£’ooś§ģ–{ģŽ©¤ÕŅŠŹĮ– ,‘‘Xä@ ”Nƒ D a$VČ]žčŪŽõ‹žė ½÷;mÆżžxų±’ńĮž×Ē>uļﮤ­;¶¤Mś'Ė€“GåŠ)ś.AL‰:ōŠC“V7\Ż•W^ž‹O’ū7?šį§<ā‘<źˆĻ}ņćS›7mæļŽEE“yX1ÖéöŻcīøÕSYĻöŒ3«˜S…ˆ`„˜Œ@DI {ēD ǹ'ž¶Æ^ōʳŸ²Šņ3÷$Ķø”¤ S”ƒęƒj’ “ōśĪž™Ļ"b1Öīh…±N ÖÖÅÕ½čŖÄ”ģ0u•Öʉ ¤½ 7HĄÆ/žĪŌ–M<éd\yŁåKL|õóŸć-Ūą‚ēו4Č «vėҟ’ģģó΁&" (M=’ü {ΰ@r£½ķ;9”ēĢl5,Ć2”JŸžŲĒMmŚśĄw_wż5[&7½éė½|„m'µœøķ’4£-Ō–B6Ź­GQJ”Ó°Ą8żp Ū³"­ØDkķÜq{ģ¬B‰`3 ]t2R(8ė%ˆ€ŒpNŒ`ØB‚‹2Q¤­&›Øæ9ļY{v+€”Z–“Äh™ÖÖĀžūä³’õƒ’ņ›ü8iˆ!óˆ ­l{¬Y{Ļ­·¾åõÆ’·}Œ oyĆ`±E4ƒX,ĄĪ¾;Mļ½ńŗƹJ iÕĖ&’ń-o\ %YžŖwü#Ņ04,“,TĖ¢Õµ*kˆóG@©«oø>!ż?_’&œ§±uŻŻ"ŠÄIg+B¢“$–½P³œąœöÄcOųāG’U§©L 1 Įhõ»Ÿ^zÅÆ~~Ę©'rŠ~;ļŪØ˜@-PŖįč˜ĒWŽnŚ?f„1ČJRR‰0%`2½^Z¶|%Ha|ü‚W’żÄĀŇy4Œ(J`­“ÖņŗōΘ-MTÆŪSŽ«˜&éX+ĖzPH ZŲV+;”>gJ(N^Ī@,@¤Ä«B”BćĀŽvŁćZ¢”б~äfīk5pßʍ±PH,žsg©pˆtĒĘbdÆŪQÆŪ“ó`oµZ" K"”®X»×ęĶ[W¦ ņ»wœ¾÷‘ć·møõżÆ}ēł}ņæ¼ęķמāPmń6ĮÖķf‰ 2ʰ“‚É·īÜ~ß?żéOK-}Ē­M4g™NŠv‹¼›»©éĢ©]?æ— dżĀ‡Lk===Ķ,žyX“ī»F+¬1Č­į–śģ—’=]“ µ`Į?½’żjÉB¤pk[C“%,^xćĘ»ļšÜśøg %Lœ2ļ¼ć®/}ōŸ’—\ž›ß»ÉéŅQI‰»&UJ³%–×¼ōå‹(Y$jxżK^vōŽūNrwš³ļžą;25éqe@Ŗ3“g›¶Ż}õu—|ć›|g¶ó¢KæūĢ—¾0›žŃńGżó+ž·³lqg| ŒDi*¬¹ƒx æhŽĻÄBh ĖKā2·“6løj[Ņ;įQ'ļwŠ>k×®zēßžĶN{dK°h¬µČ·mYؓ}wŪ³¬h/:j÷}Öµ–īąl’c;į€ĆnüćUh«dōbĮÖīŽ#O䣯óĻ’ė›[o¾ÓUÆ=|=ĀīæĘįQ=‘,€EY.ĘĻÕzŪ[;ĄAzāČńe{cbæÖ’ūoøUlÜQ)y޼¬‡CDDl×ø'k²‚2ūŃ­śŗšĢįÜCŁŃ#?ūö÷Y¾j!š±|ė’žµĻzų#¹~ŸÓ:t]g‘ģģ9.»°ō¦»ĮĖL.֊1Žqą>©aw2VrćÖKÜ÷‘us)(Ä&³ĀrķĻōŖu+@§ķsČ Öˆ‰³?I¦me„dV2ėĪi±] DVÉ«\cøŪĶ$3•I.y&S9ē"YīAZ“YGńšK&cŪ5¾%Žī"ČŃMym¶—ÉtvŅ¢µcbQ¢ŪĄ[_š’ϼ坒W/|óĖžf扄ß÷ą}.›n¹ī7ęyī'J–e½^Ļ§O<öd™¶|ó[Ēnŗńś°”ˆbĮw°ÖnųŻļŽuĮ+Žü”§Õ{é©§½ł•ē"ÖŃh­ĶYlÉŃ3}ŚņŽžeÉrqœĢÆ~ä“{¶œ~čџzĒ{Ż3t«Ęó=9_ŒHnŲńĘ„@½~żĆKŸyśćOĘ_pŅ#¶÷zĖ»„+Ž{bY„{ĀYwĖĘ›Æ¾ĀvwŠ»—Ą˜°Ā=G:cŲ_anÄņ†?_µõ¦»?łĪī±|·’ŹīøŽfļĒ$ūīWæŗÉĆöŽ_l.¹‰öü”Ų…ńHéĶ—’å?žł]7Ž"ĘśõėéßaJ–¹£'dlļĄĶ?÷$\!_ś«ŸAc酡.žo±½Ś/×BO»De«§IŌžckóĮS… 3ĖæxŃ~KWĻ<ķѲiū1Kw;mĻżŽ_¶ęØ»µ`·'žņØßżųg_łģē<ƒ&`€‡ģŚM›¶ˆ č6pŚŃ'<ū‰ēęn»ćŚ›·?øU¬ōz¹{¾¦\.1ŻĘdo››Žt—³Üö2Ʌ{6Õp¶Śœ%™bĒšŗõŽ÷æś:@øšć—zlŁA›ŗw³ōäYG=üčĪ’å„ »µW‡v -W ` č1Gœšķ/Yņ,fxł‚©ČMf%7ÆzńK&€õéų~Ą“ö;č‘«Vœ²lÕ#Æ9‹ŽÅ’“ĒÖżĖĒeŚń¤k+$O–ŌÓPh’Üš©īŌö”9ÖϜž•žõI~f$“—<į©«‘®T-Ł“m}ŗčˆEk¾ų¶Ü’ūæČT&–3¶yA“ö‡ną5:²’-ņUć;+»Ó&ļqw[×nĻdŖČps‘)Ž˜§ŃXēE{ĢP-xœÖśȳhZXŁy’¦•Pčń3vßWn¹ēŅ’ü/±YA]¶bņH€/ńKWüń2“åžYtsÉķ£<īń‡żŅ³žōŖēæ@zÓæ’õ/4°’ō ūģĒ[¶‹ a²Hn2įLx:7b䛟’ā/¾üµgrŌIc‹ŸwĢńĻ;ęųæ{žs…]C¶Ķ$w¤61ĒVŲųźĆ-ׯšÕ|Jīۚ‹ĶÄüüāKVB­O¼żÆ’&īŻqBbEz¹ßšgŅŹā—?ņ±õŗsŌāUė.ö]¹ņ’Æž§ä.•°F¤kņ‚„m ē¾[£ŲƊ>_Ž>uß_nųŸ~öuĮ±ķU\¼īäńµėÕ¢?åŁ~ν”y^TX¬¹ś÷xł“žvɧ.|ą¦Ū%3žść5ā®Ü„›öƊ•“;bµī,=ؽäÄÕūüćs^zßõ·ˆõü7aÉ{ĘĪsoļ®q t§‚wŁ4a™Å‚°’ōįkv’«§œ+6Ōu64D‹Ī£”ø7ÅĀ•ƒĆ²°<éģĒ%Ą2ą­Ļ{ń÷Ž’‘æ}ŌYēxäĆ÷Ų{·“½XģŪYxžÉ§»bķĶæūƒt»aōz½2G5rĢGjx«Ö‰†‘~Ķk^ē˜¬ģŠ/iöQ¹-¦³±S;'m×Tj !īY1b¦óāł•g?ėĢ;jå¾ļCĀĘä½@ŹĶ ‹Lę25õŗ½hż¢ŽpLOŽ}Ćuļyķk?’Ž÷_ōĻ~üQǾāüg…7s2¶ŪOæó}kTgœT ųĢG?&Ɗäl{`1°ų«'>Q²\вƒS){żÆ’ō®ē’Ķi{¤¶VKU*;§]łé™ēœė(NR4ÉV3[ö܄żŖNŹķ+»W•ĄĪż¬Én½öźsN8ł¤5{½’‚WM_wĖ×^æxś 'ærÕĪ;īxšŽ;oæł¦O}āć_łĢ¶Ž}æ'· [į}č_®ßpõĶ7Ż@4ØC pŲŽūßwóķ®ŗSœ,,–%³bD6ļ|Ł™ēœsČńX¹žœƒŽżŪgæ@zÅeĘ×ČŲ7h” Åž|ēõ7¬€Žś#/’Ū³8ō$k‘¬m/t·Uœü©”`“Ž_±īĮĖž|īŃ'œ“fļ’łČ§®¹ōW“wß'yW8/øŻ>xœyfq“Śo‹‰jsžgJÜ˜Ń OAēŠlbÉŹCœ±tĻGŒļ~V-D²ļāµKŃ:éĄĆó^&,²E6Żōą|śK-`X›“NXµęЉEv®Z”¶Z@‹ūµĒž{ŚéžåĻÄdNį)žj. 0į†g˼ØN^ö•™tė!”-wÜś‰§ŒćĄ*=vŽīGüķ‰Ān?|įžØ~ć[]&ąńŸ^©‹WæD»hÄŖ¼cĻ\żĒĖ7ŽunxI4ćÉosĪŗ¹+ż<žŌnjC –œ%ĻĶTwrė¹GųŽ—¼ņi'=āŅÆżĒŪ½” ³÷lYŖÉF-%¶"=Žq߃7^yõäŽĀ¾Wœ»†»HŪå‹>ś©Õhķ=¾ä¬G>BL~Śq',Sé+’”‡ļ¾ß•—ž*VJ‡E)Ķ2É!wŹDXņŪ)»å®/žŅ×^ņŒæŗóźÆüÅļļ½īę-·Ż}ņ‰'°[:ĮlŪxćm;ļßäRÖ|rzó}}%ĖĮ<ĘId•‰ŠG¹»öco{÷pЊUG„‹^yśV.÷)³“ŪLŲŲééŪ7\’Šē½hŪ=Ėd¦Ū]uź‡|öļ¹uĆ_Ädb²}ūāq…p’­·I–ūŌŚ^»=×mYŽöś7ķNć]½÷±É¢WŸł¤ó>aĒ÷ zE¾g[¦‘VøēY?¹ųŪ_žąGĻ:āč3:üšEĖ÷KĒ5vKĒ›ļøKz™+Ę'Ųbrɍ’”v#ĘJžm¹é–óN:個Ļ=į¹ēhk,Ö©äžWā>:NS{b»b$gɿӜ~pė¶[īśŻw~tķĻ’åłų_zę‹öŲ§vŅńKw?bńźcvŪū_ż¦Æ¤øŃē®>‘OŻ»ń˜å»Ÿ¾ļ”æ’īØRĘE!2¼R‚\™Ķ{™ˆ½åŗėƁݨ}Ņź½v­|Ą!?õŒ‘f16+ņv7J–'ŁDó0RF˜zšóN}ŌąČ5»’ćHž ā Ķ'ō„Ä„čZ„ŹĆE!̊µŅĖ\½Ūaų›3÷øõ<ū„G·xՆo’ąäµė`,”#Wī¶WŅ^„ōbą‡ńµĻ}īÖopMī=±=ėā(#lü’yīćŸōņ§?ē+ūŌĘŪļj-Ø/žŪēnŪpc¶eRŒ8€Ł„F÷X®©ŗk彬\8…XdĢ!¹źY±ŅźT,OĘöHŹt‘ögF²€įH·›]ł½ž{̉Ł’ W_+›7ńŽ-½m›Åf}ļ»ŪĄ8šö×½Éių‰•|*“Ü^ż›?¼šĢ'ķ†ä˜=÷‘ÜŠŲ,ėŗJļW/üüś%K×·ĘŌ±Ūī¾?ģc2idŅHOīŗö–Ÿ|싇ė„ćĄh!黯æQ²ü½oyė^+Wµ§Ÿw®°õąU_œĻ™8¢ØÄ!•ékю'Ō„­k®żÓeKóŽ{ųžÉB¹õž£—¬>h|üoŸśéN‰X·Ö¬Tk©,ÖdŻéI+yž·æ£ķ<^4ŚĄūŽņŽ‚_ĘAœģ¾[oŪwŃņSWļsāāµ:ąš…ĄĶ—]%~s2ļxÕėæż„Æ^ūū?I.Ób§’ļ’ałŚ.\£:#½ōcŸ>ēĄĆ÷…^›“O<ģØŠŹ†Ū“˜E¤Lć ÅŠgļwŲ!46FhzŪ;%³,y.y”0ņjš)ŻöŹbéeŻ|x¾7·Ż]õnƒx²QJܟ{϶EÖ}MMMĶ¢ÄĄ•»^dl ÷ŗŻī¬RāHŽŽŒ>)ē®D‰ē6™F), ™ĶsSóŖ“›ĒB#3e¶&Ą0×6ś9‹Ģš”ÕJö(ĶīĆv(®čO×į“^׏FŌ…üX jĪ‚ø>B->ćKµZ¬$<ćŒÓŸ~öY/ž³_üĢgüĶó_ų”'?I UŗŻÖŠ€ķeeJ‘śøę²ļ{÷Ū[ĄĀKŸ~ĀŸžųW>ķ¬µćxٳĻ{ŹcOŪ 8tŁŖŻUk7萑.üņ?,÷o—Ū¶ÜłÓ+.’ÆļżäÓ_üźūß’¬ÓNŻmå‚TańxkqŖ_÷Š—ßv՟~š¾ļśūW¼ōYē‰Ż)Ņ5¶ė„Rā‡Ū+ব:ĒJń˜Y°”=“Öå>½ŗqć7žåsśŽOø)=Š9|Įź½Ń^Ö>ŌŁśW—|Gl^Č[ Ž”ļ`3œ@Īņ²Pmģ¶{6žtšćĄ?śIchø8dµ¬-„”­X¹óŗ›ÖØńUhą o‘ž5^2ڊŲϾåŻ/:ż O9ę¾õż~zėĖZįī’ĒÜ{‡ÉQ\ŻĆ§ŖzĀęÕJ«, H$‚Č9c2˜œ1Œ &ŒŒĮ9ēĮ6ĘĘŲąĘ$“sN! „ÕīĪtwUŻļŖī®3;»ļļÓ³žÕjv¦»ŗĀ½÷œ{Ž4“dŠh#Śd!yß^{µgy< Ō©¦äp …R“ÆØN“|蔽ģ¼ |łšk( æpŻu°ĶÄ f{>ųhņ)^ *½OŚĄH&pP]kßä0!©P«ZH’¦µ÷ķ>aīN=3Ž|—ĒoōÅ3ĻßkĘüż§-X„Ī)^[70½Ōqģnū¼w£E‡l²Żo>Ž{ﱇ)ƖęRi"_}ļš¦ńņ4^>ūųہ”„K)līČĪéz ‡ė*S¬‘AųÄƶ[N›qźk2|Č@SøćFó¦²ŹM_ūł*VųP” )”qšŽż;Ą÷æĮ¼kcVŻcž¦֓³#*Ÿ”OŠE”Eöµ ævщ§\pĄįģ½ßī=żŪĪ›ÕfśimAŖ²ć¤—{ņ‡÷;ųĀ#;a«N\¼ó„‡wĄ¼ĶOŽsæ{’§Æ]sŻłžČ²·Ž$­H…ß¼źšSwŪėØÅŪ}ę¼s) ƾā2t€ŻwŪ]4”„R~L[„“ĖƒĆõįŚšU«Ÿŗū'īŗļÉ{ųßSĻśĖ—Ó;+Ļ?>ü±Ŗ±ruvąDõĒģ9JĮ¹Åż.źzČ.{QĶV)§I  ®Zk‰ŁZk*@Ÿēõ³ĒėzD©Ź¹™ÜÅč&·ŻĆŽtø4{©ĆPwüšg[Mš>˜7nü. ęÓšåōŗ[:Rcŗxōe@ž”µĆ¤ÓņT‘œžį!zĄÜöq³Ńöå³Īß}ŚģĶ»ū7`ełęrņÕėϽxÓO~~ŚIĒU8ŚKĢŗ‰¢4ükŸųŌ²'ž#_’VDvˆ…€µ ßz{É×¾ńõ6šÉ„Žcv}ļc·ŻIABČwrȒV’ūM^ņ†"_Żńū[®æčŅ_ßšÕSßsąöó7­DÅGxˆE)%Õźe'Ł;Uēž|ņ¦S¦ģ¹x ’ué*æNuŸüšń;’9Õ«L/·]pŅäŠÕ¦4¦BMĆņŁÜĎ{ōƒzŌ1±ģ™ÅNæüł*0˜õŲ£¦kz&ŹsYĒå'Øöź[öwµ¤ <|‹²ī=Ęo°uyÜĪó7©÷žõo¤”& •|šÖæ}żS×NBõī›žčF]¾Ą{ø€u¶`óK;ŗ(`2HÄ©­””­kz%Ąļķ  “į{_śJH:$]“u+’é7lĶkŻ2#fł6Y›q§†A‰ó™ė(²;¶ bD ;O9^÷døQßßŗ¼a‹)h>b›› Žų:c¬+©}¤O’–Æ—Ž€|ōiŲĪ.mu“\ˆ|&3Ŗ“|]ˆÓ¹ŹāHO„y¾§3j“mŪ ?±AŠ8bJ܀h]£ŁgóerćO(€…›aŚŗ‹Ö ~žß•œ&äüŌj‚ĢĒėŖļ«fĻWF-@±¼¶$#+½×N;lsc3ąM›ŹJżĄ¼ī¾qĄ?’|鐓ŅZŚ0ŗīßō㟘@¹ź•Ŗą_¾öz -ōjµ¬ NØ5…’dH”šV©n3eņ¦¼üž3ŽtĆ_~ęzūµ/]~ń£÷ž“Āšoæŗ±˜ŻÕÓL‡ŲuęüØģ»É¶WpÖķ_żÉß~|ćó÷Ü’čŻwŅšŚļæO.y˶PQHAżŚŸuéé§|žāóŽ}ĻŽŹä:?SZ:Kįk“®›Tø¢iՈK”|õ—>|÷}žņ”}l¾Ļ¼…žź5&_6/ ‚ą3—}j<¼…“÷ĶXõņ[¦ŗ`§6T’ģ'Æ”=õŸĒI¦Y¶. „”RjRtĢŽļ›,Ŗm`ļßļ@cbZ Ņ>©}7ß沓ĪXŠŽ{ÜĪ{R0L²žÖk/{€'ŒH’ØN™ōŪHI¦æ„ŌRź„Ā.éłēŸ7uŒŠąFō« ˜Vķ¬\lŃ3y"0 l²Øš¾;auaXbæDQ{E$&oIIJyģ 怍DĒ‘Ūļ>§Übm8drsm¦æŻ'„‰>|ņI“yiv¹}÷Łó~pĆiøfźSŗzŖĄžŪīH!%-91Öp4B¹ó‚…tvŽ6`¢öü‹›o“2ˆy"Ф Ģ/Č “X·–?üüēē··’ōŅKOßu×Oyď>uł„Ēžrųv;›Īü ŠĘŃę”l3yśžsōsÆč-W¼hd0mźäĮ׎ŲaźĢ­Ūś™»čKŸ¾’¤"„?č°6”;Pŗņ£ÓZmõœėR ǜXåo-YśāKƬX±Āv…! Ÿ{Ōń;O™¹ŪōŁüåÆ O['ŻĖ±œu”|ęÜK·™¹ącĒ|€źō—ŸŽxü{ŚyÓ-/żš9“¶.W PHŗuæ64œ Ü”Ü~į¦mĄųj™B’ÕūœįUĒĆŪo§])“Üķ!×D‘6VJé”:…Ś\¹=ē¤>qö9 {ūĻ<ąŠ~`2ųœžnɛ­t5c…8Y±©›ś”–2d¢Śo†«öƒoÓ3u晛mß=u#ŃŃ ¼ėŽT "e_Eµzød量}ߟžJ¾ō•“żÕE,*·čoRśXƒ#¾‹Gī¼ėŌż:’ˆćŽŻiyķ=Į¬"¦‘ .­[aHR’†ėć€MĘM8x·Ż(ؓźz@~H¼é'?­ćŸŅÖ~÷’BĆ” ‹ļ¾é–«?zއž§ž„tH~•®Ly!(}½ G½w_ņ£"ˆ)ÖŌæ¾¹Ļ«Fļf#“ķ4u6œķ¶x •Qī0eJ;?æ†,WQĘ@ė&1[H:¬ՉLÓōk „ö÷^°čō½ö»į“3k>¶Ø£“Ywyc&%6f‚jm7Ÿ,’/•^¾b§ł›ō”¼ ŠS*ć„é¢ķ[—_,Y:|°×&‹6BéŪ^6E”;U«™ķX‘¤µžƒłG°Ėf[QĘź¾]5+ü’-ßdü”é(ķ;mփ?ųł36<ūż‡½łŲć¦#³“׉|¢‹NüĄxF`쇗śžŸżŅ§°FŹŹ•;Ć„d@i&śśķ—,hŽküƋEPœ™»‰Éhī±Ń³ĒLł~·“ĄuI‰ ™˜-Ā¢£Ķ†¬^§ü÷šgŒ&L-¢‘뱨3Ś•ÖSÕ-¢Ä£“/L‰3Äąœ·P±ŽżZē”x„ńld³Ttµ”®§6Āå2ˆzö'N¼ėŅŅ/™LĆš:ĢćęóL!£•}°QÉ &3§HęŠHÉW^x¾Z š€q‚O› 6_“ĻAyףó»iéčXŖf"VĖ• ЇŅdÖńü#OX*²ŅŁ#\*Rr—­¶čN诤\>rńęW_qĘłēuÕEgR0hā”§ļ¹{—łóöŁrŃ$`Ä=S”cŪΉŪtMܾśż?’ć]?ł]øv‘ŠoĮ“v^ōĮSöŽdĮ![m=歇†,ĖJ[3^åė ¹§»ÕŌ°c›¢ż·ĶsIż0 Ļ:ńÄŁS¦VĄŪąu |ĮqĒӊ•K{ģ˜÷ģ]Ś9^{ö±·_xź½ 6É½-ĘOڐ—½ūīø«³QJܤ§x.¹˜¼c/¤µ&©h°öĘ’å¾6åÆ\{¹3”p ”5CæūžOētõ÷=ĄöóēæņŲ£zՀ‘ģŠóØ[l“ń·’ĆśmFU/ŚÕŠŚ+æhlÉ%GP“1 QŠžņ—Ū8ĒDˆ~pkČd0瀾qłguMüĮe×ī±éB Ņ5RĆśßsƑōĄ>uÉ„ŹéoČb¶ŽÕÖ–źj™˜µ:…ōÜ}’Ł5¾ØÓ ¶?Yp˜ŃQ)[¹vSŚsļ;n¹uĒ-·¾óöæŽ@H–µÕµĮxÕšš°ü >pś8`ć®ńūl¾Ż›?M’B‹.„żĘŒ$a,½čCvŁm¢(õqŽōĮ;óšć®æśZņĆń^[;0±½;j¹%rt ķOŽYyé™gl4y\XÜßć _’aA1¼c©»ĶIIkn’Ł?|Š~_¹šÜKĪ8™Ā!ć=uČ>ļķ›Ā،RiFµ²Ėüy]ĄäīN£ĻSĪ›g”6K`ż¼zŌ‚m·ą=‹&O|įWPĶīf{ķ±g Ģīłū=Ņ'Rōö³oüöūæząÆwGMö*$Z9°Ö_[3-åiTś„Ə(]^©ģŌAbkܐČW)µESōųŹ _i‡7«{-:rė=Æ?ķ¼]ūgĻG׉;ī³ĻĘ[žsĀ©T cK-“IūĖV<ü·æõ{n±Č$T˜˜ÖŃyģ~ūŁJ”¹…KMä«_~ö«n¾Ć©A.L %­š¾ļꋧ2o†WŁ~ĪģæżöĘ8Ņj"ÄāĪš¬U‰‹딽_Ŗń‡iRßLöŹżÜė6ččź6čé3ńv`FoppąŃūع·QG÷xąšsĻ·ŗ‚ŃQSˆBŖÉ-z&oŪ>åc{zÅégSŻśQ[{mU\2¶V‘E·–DŚüĮśŠå+ßxĶ`ƒ³Ś:—<ü$©Ųµ-E#ß’źeWl5eś.sę]{é'Lo8R( ĒzŲŲõBÜłū?’ÆČ§ķ¦Ļ=i§÷lŪ7}bµJ2$Ŗš_‹Õ7B"_ļ³x›3>xnW×ūwŪ#ņęJ_­µę Į1§Ü=§Üm œžģq[Žżį­© j’Yāō­gZ‘’ī8øQŁn›ouÉń§]sĀæ{žEgģ³Ēf=m›÷M|üö;IÉøÄiEćr}5ŃÖ…÷Ž~{7ēœĮč:€ :ŗśĄś¹× Ģa•ƒ6ݲ‹cBgI[‡‘T_»žĮ8RM›DR«o_på{\:¹ŲmĆYWŸvʧĻū˜ ÖųT7²ÉT—DҲ~¶œ6cŖW6× ‡V’ļ…§CUŅf[Œ¬ƒXŽīŻė’Ė‹ĢķMš–_ĪėEĶglĀFDj߯œt¤FčQįjĶĮm7K—–R’ŗ:[GTźqGÆ:Ū,SŠJł’$%nźŗ35ąfp¹ĘŲ ćVŹBE]C:ØūĘѾŃsŗ•ŚA‹ėіRMš­uՎLbW){d ·‘\‘3WXA;ĶÉ _TU|ĢĄ˜5Pˆ 'aÅ&Ņp>«ØHQcųń³ĻõĄŠĘŠĻ0 Ųå(¾ŻN×]|iBÆR–dRjšŌõŸū,&¢2™µ³Ļ~‘šk¶1‰BE*ÜnöÜĶJķŪ›Ų œxĄ¾kßxś{Ÿ»¼>ų6ɵDu’C+^łŚs?¾!ĆĀreĒJē{ś&̓·ćŒY%ˆ2¼°5o.!_Ń`ģGj•t(Ø?yĻ=ūoµĶū·ŽqŹo<žlŒŗ%$Wœ#ßI[ŠÓ››“ŽHŖķ£»š¤37¬öä°\qįłųzõźCwٵŸń¹ćĒ­}ķS)’Ž÷¾V¶čķŸ\|ā)؀,d'#:œMыŖD#„Ź‘@ŽĶŃõ‘ä44ÜßŃŁFajß³]˜R¤UøjĶ ļ6sć-'MķN9š ?üä'?üę×I‡Š¤Ō¦-AR(_{ģÉ Pݬ{āwÆū‚a hi„ŒĒ£|͹Ÿwźé¦!\5ż¾»’Ufto>wÅÕrķ°yĶļ~öóŚ{7«ō\rÄ 7~ķųƒkWÖkJZ…‹ęĢn:€³O9ŰR®¹©;ŠĘ5H{2+I~š‰|dÅ‹æxå퀔Ź@Ųs—·ÜlĮĻ~š’&vTamŲ¤C96^’öXĒŃ0 ­Hžē¾)»Īžщ§Q]Ć5„T rµ[uÄ~ÖŌ¼gĖÅżÅĻ?rä š3Ég0µ\=jļ}(°Å©˜ėn€ÖGļ}š”ƒöūŽgƹķg?éځžrĒ6Ģ’äĻžĄ”Ē\xę9_»īsµ•kV泜“²ŖąŠ“oVK@µ5ōö’3öŻgÆ9³®;ė#לu6适į{n’s?ć‹ū'wÄQö*©Dó6IŪ6Ÿ=w"+Ļļš0 ŲjÜŌ¹^ןō«˜A@}éŖėß³żn+_{›$QM¾õŲóżåŸ’{ęeÓzŖ“Ēž?öŁiõŚqĄFķ½ķĄ‡N>ŃōSŚs*ęlčLµG)¬Ķ`]»L™wžĮ§ģ½į–›U¦TŹ QšˆR0µwÜY8õæ¾±6°JՇØ>¼ĻŽ;>óÆ{_ųџ}ńk“¶¾hĘģnˆ9=Ī<ü˜TŠėČM½śŠ;l¼Yč•6œõå‹. bį½xśIµļöŪļ³h³m7˜~×néfwļŽ|ń%‹Źøß›2öå†w“ŲłFö ‘É…Ŗ×ƒTsP¬Ņč īĒļćū5ŅjļŻvĢ«“/źwįŃĒöŸ½ä"ó Ś½ęPŒtÕŖU`ūžé ŪĒyĄ”ä*fż*MšüZ`ÓŖ ¼ńó_ٱoŚ ·żę§®¦@„N„H𾙨”[b6Y®¬+Y§ ø’öŪĮĄŗįžžżźĆ~DĆÖ2nź‰jž×Æøfßy‹Ž3gÓw^¤O:ź>Õ5 …÷ß}ŸŃ[jk.ūųy؏wB°åFsĘ1ļĒ_łf¬m]¹2–ĖĖ^}mJOw˜ÜŁ«Fm³„?qŽE%ˆŲ“E'ģwՃˆÓ¤†‡ėQYÖm‡Q‘–y?q«]—‹ZóaŖ£œ4—[Z;) åć÷ÜsĆo7{Ö÷ÆųōmŸ’ņћ/Ž“»÷KW\ēŠZ[AAדS>éŚ Š¤Ć[sć‡N>±˜)Ŗ3€¬mŸ 6žņ9¾’ØÅŪ́·ķ”iēžzrRś”Šdøę7föŽė.>ėc$­ōŻg/¹l£r×`ŪM˜Ś]BŲbņäĒnæ=\½’T]‘Ÿ88e 3ėvŁfqŲ ··øź—Œŗ?tĀ×0Ö öū¢³Ž€»¦1>j\·<Ó$må:%²kˆęwžĢ‘)g7”=7·łÕZGFŖ>ā~ļūa\tvÅb īʘÜę čE1’jĀkĖ'–čå­ĄMž™aG7”^Ē·ń¼hPjšČņŻ(„Q§Š¹­@my‘ēĀ4ϭ茘6é 5b!oÜģŹ&ŲшČa‹)ńćhŚ0ZI‰Ē†ö7ś/S„“Rŗt’ŃüœpWņ–ˆ×5”ģ²eé ¢>ҹŗÅ©¬"ź‘5)ńčL|¦¬$Ģa‡€q`*0›ńٳQŽvÖl Sj„qĆ&‘zž¹g< Ųø§’“C 0uī„‘¶¤Æ¤¤&[OŪĢĆŹ7_üśē®"5H²¦ƒł5Ŗ =ßżū,\°±'ŚtĮęķsøŲnņŒ `¾öŻq‡æłķWz¢öö ŖK …RÉŗVžĖĻ=Ż ģ9oŃĘķośĘ©ž¾kwœ[N‰ŻŠ‚1—4¼le_¹½Ńw’}ß?Iįņåüå/;Ś&“UŽ~łER¾åČąōĆŽæćŌ võm5~ʇŽw0Ieäj‚Œ?’’ĆkF½QJ¢Š)‰’N•HIi.˜;ĒH”²ĒŽ®NrŖØd¶ˆZm§ł›ķ5kĮ1Ūļ¶ĒĀE÷žéOo>ó …IBTD{¶pYØÜj‡ķg̹ž’ĖČGkU ^?/K–k-“źåRl %°”öŲb[ŖŪ{ßwĪ¢£ļ2婕ŽW^xŽH4+æų5­Ā÷vą˜ģ•ś€§ī½×Čį$=ŚmŖ””š©āĒū¼„pūžŖ7ŽøķĘŪwŸ&õņē¬ZV\»jł2‹¢˜ä–”ÉĆečS®Æ;N`ŒzŸQ2ź¾Į]·™ŗŃ>³6ūÅe7üį³ß|óŃgLÉ&3Ó¼øX »č>pČ!<öij炁{ljoĻ‘ģ’ģć'„Ą€ČŽ’ÕĆ[ĪÜų3Ÿ÷Ä=w’?øzłŪå Š1U”ośyyē 6žüŁ)ķ먿> RØ©FT_õöėŸü臿šń ~ż¹/=÷ąƒäū†ćK„)¢4™{Üõ/#ī%Cß­šśŽŪžT<  ˜Z®v=ń’Ł‚H”ÉŅg~t›9›ģ¾ł6ńs7BJq_ŗ”’źr\©MeĪ:¹04l ‚ˆ¼juz“Au+ ¾śĢło6cf;ųo|?¼~^®ĀT@€ PŚĄz#vŪóĢ#Žź6ņŚößdĖ Qټ{ŅÜj×ōj{‰tHZŗ…'£a®ż[o¼©č6™0éČŻ÷|įŽū„++eŠƒ~Šģ³xóÓß0©  “ćEłć'~€üøA7R7Š)Õhß÷“=Mf#Cvx"–xlś†‚ C›né ¤P¾ńŹ‹%†MXeŹßüÄ„½Ą½¾-~ ‡»II˜>G“Ÿ¼’!f­i-K*i픨VßwÓ-ö˜9oÓöq?žņ×LƎ©i¢!æDČdaŁQ§M ķ÷„Ā” 70żŹŸėp’ąMJIKW=p󟦗Ū&B“[©”$©Iź”Uk=šÉ¬mįÄ N9š`ŖMe„‰`ķĄ¤®īŠdŚŽļHBOs†”į.`ć[ĶŽ˜‚H½Ļ0°¢2ÜÆ~śKk× t ļcĒ@ƒĆ¤ˆ|¢‘!žš‚t$šžćÆŗkdäŠ4)±ÅØ®r™š“śÉ·æSĘ}߁Gnµķ‚¶īż·ŚF®”0ƒzĢ0J~E¦#Ū(Ź1_ĖŽYzē_ļŲvᢠ°ĻŽ;>ūЃTÆoŌÕŻĻxšģC’6m5¶’õĪ¦Ī^Ü7ķąķw'Ÿ(Pk’·d³®ńsĖ=oœąĄŌž¶k/:—j5RõT— ¶ėŚ<;óć·ß¦ŒŽxį¼ŪžäK“śĘō„”¦,bc9Qœ-„ٶŅŖ±‡HŚN¬I¢…i#¤mĢY“{N¢ÆG²˜ GĀ£ÉF¤ĶŽˆ~µ¢ķ<¢ psбu'1pȉ֏X”Ī®M‰GŌ²jn{EM­‰ĒŠæžæł1g’ĶøéĪņnZŅXĻŌ‹w…SįŚ7^B-Ź držB“?õV®%F£–ķ¾,a_g8Ņ6Ždf-X×ZJ܄ȱ¢Šč ->t„bŒ÷‰ĖŽx›BuŃG>:••¦‹Źeū8)’ņćJLäę†>iyīYgU€žJ„_ˆąßłł©hX"¦Ķ‘”&õ¹O_Õ1½Ō±ķ†s)”J«‰åµTT§‰¬jlĄ¦tõށ&Śe&IK— ’’(M:bŸ÷ƒ ĢėžŠ\qž…*ņå ūøÕŒ93;śĢ;÷r>·§o*+õE*»3YŪd°~ąØ÷ķóģ3› ļ¢E¤)X6ųÉ~ō‹¹`QĒø#¶Łžė\|’o„P¹"†Eæęõ7?ł±~ščĆžvóÆ•®k-=  ōńŅ’ŗ/6¦’”ī Źā’²¦÷Tą`£ śCĆ:ć|Óä<ļŁjŪ`ń”égģwP?š³/•B’Z™›0 c.CmķąšŠZĮ1bĖ©3;§0ŒB7Ȑ"„>z‰Ą·š¾aP RdÓŚ”ÓĀt+J|ŗ5F]Rņx``‚wT ,łß˜¢Åó0”‡.Ži“Ī ó{śÕŠÕ:2* żĄÆÕMe|¦³ź9‡µeßäĄōM ¾³ŒB³!(ē6:vŠĀ ÄPb˜ŽŁCAaA`ėĖńi«Õq‡2¾Tź.:ćC'uōŠ’-•kė4źAIu"Er80§‰kvšAäLΜ„§å0ć ®5Ł-HZ e`°Ż¤é›÷LXŌ=žśK.±¦P:M0üŌÉ"-_@Y$ŽōŒØ”’uRĮü ftŹ„WĢääʐŒBµō„WŹ@/m±į\¦·xt*F²k0Ó[öūŠū>’ļ»)" ć“6•“F¶:RŹ’ÜugÖRy£q(%G®,ęLQjM„ĻJĖ1Q,š—­q\Å-BŖĄŸĀ-k6źPm˜˜ā+™ŲRµ±4mĘ7ޱ ł4WĪĻ Q£üĖģ MRÖõÅ—Œ{Ž„†źĢVZ)4*™”ŅM”GéPZ\±(¬=5XRƒk3DšŃNĘĢXĻO×I‰›H(·^¼iF;4o’ޤƾܱdSāF(q\ĢN¼ŚõX†4#øUH&•BQJ¬\žZHŠ(üÉwæž«o|å»W^ńÕK.ÜqśŌYĄ|Æ:l ÆöBP Ÿ}äń„ĮēŽ] >vŅLP—WŠż`SĘ šHŃ®æ” lŁ7un¹{šķ·I¤ŌšŠZūpŃp8¼|Õž|ū§?ō‘Ÿ]’Ł/}öņ20˜¶hņTZ;@j˜ä^+× ®zGūĆ4\£įZ}` ¶fĶó?zņž‡Ģ@eūI³v𱀆‹¦Ź“޵ŗa%-ÄQ~põšˆn^.q|Ą{µ2 ōŠÆ^włÅK_}NėaMa@]RMž}ģIOžÜ lÜÖ=ųĮõŸ£0Łr5c£šqtŗī™b‡NRb+zßī{•ŽJ{ų÷]’ŠMn2Š)yꁇl?cÖiļŻ’˜w'9DTé”ī§ØPj­}ß’üł—|ą}ßpᄸšź’O\ä {ūöö»¹„Ld‰¤¢zH!=t÷} lē›R=xłé'ĖĄtˆĆļŠĖy08\—”$’Ö³T’ Iś%†ÉåņDĻ›;i© ¤@:–­¤¢}ŽQNķóIōdA`c»bjüĘ1>›Ķ®>88ؔŽwƒHĮ>Œk uMéŠ.¾š"lŁ;mėń<õĻ’$9AnưģI%IÓøJµü3]LA˜Ōš“Š•`Ķp”wzłž‡N˜¼QWē§Ī;[R=.ŌYbß’Ćo~óŌc¬Złā‹GģµWŠL;ēØ,Õˆ÷*­µ6óšŠ÷ŽiĪ¢ż¶ŁuĶ«oėA d;0±Z5)Ic­ģäf¶j<üļūś€¢<©R©’½ė.2>Ģ*ńs¶(ŗRŖn°`¼(’ćÖ?‘”ęY›KR~@šīśó_Ź€ £Ÿ{ā ‚ōŽTDeĒVŖŚŠ•0eBļ¾›oÕԃ!©•Ūoüź3Ļ^ō±³Ū=E”¶ł:|æż’s×?’qŪ­T2Ė?qG®4ŲųŚį20½·oÓ©3ępl]ÅŌAŠlČ+»ōM[$:§ńrøęŠĖbįC„:MŲ`m3ŁŖ@(Mļ+i§JŲ¦üś¤õ³O=µ ˜RŖlÕ7ć+ē^ö¾[łćŸ|ćŽĒžōŻ_¼śļ'–?ój°|Ą©T]Ź€TH2Œ)ėėÅ“?yÖłSŽWVZ/¾E =44ŌŻŻÉęLčć¾ēW»\øÕ?ł)’a¤^Ż ]4óĒ–Hbƒ“øģØŌą²å`zwwēTÆ'•—P‘&=ToCÆkĖŽ)“bxæ-·™Č½*0±«zĻ/~qšüMßl“\xžŹWžWĮ2„iĶĢT¼ÅÄēš&Ŗ×’š‹_t@'ųĒ?x†)+›&m—b@ŠTH”’R§&_\y4Bš?ųā×&£ķŸü̚—Ž¢0±˜’…¤k‡ć•VGŁ«ŠU{āuDķ›óŽę]£ėņuPāęoŪ¤Ÿ4ƒ]5‚-GLdš$ŽēüߣH\Uö«\}Ō#¼iyś™†D”ҾqÄõ) I…*0¢5kžųū]s½Ž3ö9pÓīńųĮņij<Ž=ŅZᨘšżw?’… ĶćOžDoéĶŽ^—4¬ĆaŅŹÅ©¶Żb‹v`³ń“¦Ą›6X4u: ÕHo&é ü4’Äå.DZL¢õäćOT˜čb¢øö’OŒEnG«éŽ{Į¢Æ^|ŁĒ>ž_7žN‘Æ)0Ŗ%§Īj¦“$ƒpéĆO}īćžāĖ"ź²20ć’š{ģ¼įœ]fĪU~ݦC™>ē@Ŗšoś“7ž»Qč>xčażm]‚ur“?žŽ·M\«BI¾6AJ½PŽū·æ{°†9õ Cņ­¹C'&’$ka J™¬÷xķS$0aó0 †‡‡‡††‡ķø©i’ņk+ć‹üK)• }æ&u† ½Ž>ąĖW^kæ7 w4M(U§U;wßlÕkō%C‹Ž<$TZ’_“«Ž^uėĻ~÷é3Ī9ļč^~źQŅõ%“¶łĘ”[…$ż‡’}/­Xqö~‡nŒõįZŅž*• Č’{’ƒeš2xųž—æJ”śÕ¾_föŽæēÖ?Ūłyüź¤Ź’ ·7i§Él>ŁtTŚzGYR2µƒšóW_cŅŻ šß»’eʤč”$MG|H9jR°}Ż&wsaÅ…,›]…¤Ō‚ĪŽm&O?楃īžÕÆ ĖŅ Õ± “‘$­Ś„Ø»M›ūā_ī¶äOIY§®$’RŠB¹ĖVŪ¶—ĖeĆĖVŚM–”u/6Š€JÕW®ŗń›ßžé—¾²äÅgI×­qŽ”;n½µazļö»PõĄ[śŖ“™j§ĮAYœĪac&W>-}œ%D;4š”¾įüK6¬vĻØ“÷÷žį6ŠNĘøłĀžŽŅŹć=Ģø |šų(”q‹„ŅV[į¶?ÜbXčķĄ5—_NZ¦<¢‘Ō ć";÷ԃƒÖöéx Ż关g‘ IZ…ŠN((«’»_Żč&ZĒ`—xėķ`ń„©óP™‹Ņx`bg)«€®HĖŗ/ė>)’µPFŒZŅōžvjŚD‰"-q·ųśF!LŹŠƒ:IłŲæļ锇?|ąa{ĪŻäō}yķ_žōŗ/³ė{ŗõŽß~ėĒßøęóo®Z³dõŪ//Yµd`x„ źŸ~UÕ5“våą[Æ-Y½r[vż>ŅB‰v CēN†ń¦Å6›2–­:ķ=ūMś7Q ·¢Ąb£AKéWd]ć³-uHaųé /¬=ŸŃÓMaąę{u-C¢Ż§Ļß¾gʎ}3¶ØŽļāhŽ;ą}44tÓēæxü»¼gÖĢ£¶ŽŠĀ_…[v óf€CmDÜT]’ (¬wćE¹Ź¹ ®\i;1¤¢€äŖįśŠµÆ>õĀŻ»ė…§ž3¶s¤SF줭GŚk/¼Ōģ½ń÷žģęG~wū¦ķż»ķ/‰ycĪi+ h"fÅsāÆ*°zŒ)ńˆŲI”®Š#Że.hIckuSžŒ’N#kžq Ģ;ēSō =sTyM‚ź»Āž*)>6×ō^wbv+£Ķ1Ź?Œ1Ɩ`¾aŒÅßPJÅ?4łcŒ1fśI2?,|e“$Ģˆ˜a®×ė _żįœsĪĶ[l=ś VīĀ tüb[ŠĶ;Œ8LÉWz@2¦•ŃvbīŚż91b̧˜oĘX¹\®T*„r™ °½¶ōG4ŗkιēyB!Ęē!>AƒŅvgRŹüĶ‚=ĀSĖ<&Ę4qk‘B`h3/ HĖūīūO¹Ņ¶d`ķkkW X³rbßø_üą§ŒH›ßS0­Ÿāģ ĻW@µ½JĄU×^CZ›$qFœy/TKW+09L횸×^{Ap0Ņ!i„ ī‡>J^„·ė”gžBWĒƏų@— ÉĄ ĘĢ})©ėõ:…Rųź7æ¾1¬ūϾų'bD ąDlĶĄž{ķµWß~›”†Žf¦ł2’āŒB@1Ī9Æą=ń{7mļß’įkßžśv[m ’ œT™)@S„R‚ēķøĒm2'Ørļ'ß’!ƒēžū°ŅQĒ”Ē4”V÷”‰sNŅ`¦kŽĢ".8CµZ%"ĮӌƒqĘ=įµUŖÕr„>\cZ‘RZ+‚‡”4‡1ęyžy³:‚ÖZĪB%C7”·½}jG_}p­y³šˆĢ̲Ģ~)>ų ėƒkVb`•Ø+Ōe‰{`ŒIPjFš8°fąé»ļ~ąļwģś¾=8éč™óēƒqp•8y,ąeąLƒĄ!¼-ēo~å9½öŅĖm(›ś1”ŪŖŠA Ī4˜†§!€­¶ßśžGž@Kąļ·žĆlČß°£·ĖĒ/¾ņmh€ˆ1&„ 4c’QČ@Œ~Ķ'zūõµŠÄDmpЁ“ĒøyüĆ5,ŗqĪĪżÄÅfOźb„Æī‹ "­Qā€'ĄŠÅJ[l“1q’Bāī쒚Ÿp2²G„]oæŪÖ;<óŲą >ąqĮNŒq®98P.— øū;wēĄ!ĄA%  N`¤@Jɜuōv‡ŠA Ž6a1DE{0Į­ʵ+WW*m»ķ¶Ēä逘`ýü» ¶ķ‚Ķļ~ąŽzmPė 4—v››a4‹¶ʝS’ƒ{QČ”AŹ€qĪ8”†6oŖÄŹz–Ō|ßߣóżļ~J)ā<BĄģŸZ*sˆ¶{e"p ³T1pH Õkš““ę%'qŒ”™ųéĻ~~ɧ.cbŃˆ_s¦Ņ‡» ū”2[t²ó9³”š1˜‘ļ­V¼š|ķ„—Ÿøļ~0N”ÖFC(sčĮhOcöōi~‘† Pƒ1ā `]}ć¬kĖĖōĀÕĄ“Ļ? &#pEĀ+sęA‘({L*׊?sŗĻPS!8Ą9„Uth0{?š ^cšŃ¢ÅŪĪZøšĖ7}’’żĒēłµ®yʵ½~_ujēœ-ēpÄ~¢¢Ÿ{éIĶUļų®¶*/•ŁĢ“5ÓšŠŁŪ1yŚäžŽnĘ£§I0µ <€š˜Ņ"—­|ēŁēüļ¼üäSB©ĶęĶ›3g<Į:fZƒ(q0}É%{@[Y\żµ>ō@ØźēżZ²šŽ„bš5gœėhW±#oV%£fŃiqlĻŅ£[˜Œœ7Šü›’0iG1Ü×fāēŌ[1Œźƒ2ńpü¶&E* •́’ _0 [ł÷zņyad5r^Ć;ē¹q hˆ7ĪéFŒå2’Ą5šEė5z«1ŠFĮ/ļv`Š@CCC)ćųŃ'īļ^ƒnŖā«©Iu§ łs].ĻŗF5>­āZk`qr8*«ė[¬³BķłĪ=ŗ¾å{č3³Ī!&é¼Īd1Ķ^7“­j4P™.ScN{xŹ ¤µĆ7œsĮ…ĒŸ4 čĘ{č6Õķ'ĻųčGd©¹J*¦)™^8c Q(㢹dÆžčy÷ō÷”ŹmĄēƼŹÖ˜•¦PR=¤Z¾³†k?ūś·ŽŽ÷}„?’ś×;i•¶Yݽ?śŅ—I))ē‚¢»P¤åŒöĪi(m9aņ``Ér[Å7ČD¦G·Š‰·ń’ZĪ•R§{\'0³ÆÆÄŠQńÜzyBÄŅq{’&EßżĀ×'£ķšMļ»į¼żmÕ0Ęąć?;rOµóPKUØm8"b!fG' ,w7…Ż…ņ¼ÄĄ8u÷Q-“ZY9äöwßżį”r{P[¾"Fžķ HŻ#™¶ŽĒ’~Ļ7.¼ņž_žįĻæ»%e %iZ=°œ•ŁS§Q­N~ļę2ʜ¦ī:kāäIšę 4Õ>.zĮzĮä;+L÷l½>,e`Żt­Ŗ"¢;žz[‰aVwļ¼ńżćĄ?sńåIŌØŠ>” ®†}ąĮW$…ŅęŃd€"•Pļbʵ øe9I½ć^¢t؂zP{ēÕWgµu¹ŻĪ[÷O½ķG?!æŽ%ŽŌ|Ō?’ü§'LŲe“M›“ęÅ×h˜b\ėz°ä¹ē–<łō“żĒ‹·}ż„ēˆe„äµ"%m/_@’ BŅD~šĢƒØ©`SĮĘÓŪ«{m³ I‹ā¦”fI‘”·żž÷[ĶŽųō}~öUZ>š±÷»×¬sDūææ…¢nŽxsŠUÓWÆyG}@æĖ•ÄĒÕ¬\E‰o¹RäūßūĘ7:J„n`"÷ü·WškV¤ 9s÷-·ī<ąŖĖ?e;‡-9Ó”ć:$źˆii~ZėO~š#sŚz§Ā»ö#ēŲ+‘ĘÅ:9ŒŅģ.ŪmēmBPÄ&°üIÓ?oĘĘŅ*zżÅ—’tó-mąŻĄv³4ī¤BMАB’©{žsĮižóÆn’+V“ōIŽE‚žūæ™(JUąĄ½ö¾žŹO[š±Eš,|¤ź2‘Š‹Ü ‚z˜9”Kdˆ]]ØŁ×TW’ČWš5æJ?÷ʃO-Wiø®•ƉMus 2:’Bł›Ÿž¬ ōµW'ye®“T¤ķz’ÖuŸÖŃŁ Lno’Ń7¾I*ŁĒ2G¢e ±Ę“TyāØEc, ©s>pJ;0¹½­ ģß’‘•®$Õ.[.īv_“Ł”öJżw¬ä ŠŌėĘŗŲ¬j¹į”)å(Ų½š¬ĆöXµ¾VóķY£ÜõهŁnį"!IJeĖÜʓ”VŌõŖ”RVŗyˆŌ ©°ö…kČ_EįšŚźeŚ_KŅ×A¤/ĆQhžŽ…åņĮ[Ǧƒx#1Gj 2?ÅŪ§“uNmētōšęUśMŚ0~„Ti |ē-ā~ģøÅ:”³…’jž$^™.Ź3+ķ>öXRʑĖLTŪ¾ršf‹ē£m뮾ķzūß·ń&µ—^&Y'„¾uŁÕ;o4V[ĻŁGOn“Ģ®S„TːdH* I”ŗł§?7"yŠSņ¦öötgrųg|äĘo~{Å+ÆčÕ«)šóūmĢQT$I…gŸtņiūųčm·ŸpąĄ†Õ¾E“6ź„ Ąā¢”Ց+&QÆ{„ŸĮ0 ř ;1Ż>Š -t=Ś»Īvā“ū)īŒéķĀŌ…@k‹w×(Ī« ÅyĶzg27Gę[O]c)å6E¼×¤4Yͧęq²”Ē9ē•JÅó¼ńÉ&…Qaƒī•dPÜ&æcPbŽŗÆĻu2WĆÅct9ēĶ@ßļƟĢ$k±Hfa1 Ę8j¾¾’|ö'ę¹k-—5½B32ę'q9ŖøØżb£ŖcLI Ąó¼ųŹŻGf¾®­ŌäÜuhkķŠœĄ-˜Øī T+Ūķ°ćöć.Æ­¬<(N+–-ß`Śt­ ¦F¦”Ģ<Ųy@@+X-kƀLr’Œƒ‚&Mš}}}}}}¼ä7żģŠ“ < Chzõ…vÜa‡3?ž1@½¹ģm¬ńk;ķ¶Ėń§œhš7Įø·†Ķ¤ˆC‹÷üžó× LØv}ń _ĮŌ™¹łE@’¶5št„­ .ī ÆJ+ó śł/~® °św$‡ōø™{ L“f\ƒˆ8…Üńėßm±ÉĀŪž}č‘”·žšč}uŠĄÆ¾ż“Wžzf0gZpÕŲćifź©JŖę•^D}0p%‘Š ĮŚUŠųÜWæāĀZ;ˆZˆ8ē€"’jˆįŠ#ŽjžØœxāɶ4?“€b )%ByĻ?īz蔇¾’żļļuĄū lł\„ģīźfŒ /æõ&i !,šķlhš1x‚Ą5g'žuęR®^Gų ź+¹ZĶiǽ÷ćzqjH© !qE¦ū÷={¼gćé3–¬Iƅ^ƒš…¤$qn**•y©TŅ©- Šē ‚`œ‘Ö`Œa‚ .„Ž ĢE &øĮ.‚ ˆ'Šņ„B0‹°1nŖ%įŸ4éśÆ~iīV /¼źSO½šœYĢby:Süc®™Śuļ½?ż™+_žß«'œtüļńĖĖN’ˆžzņY0üįʛżkÕŚĮ'ž~ü©—žĮW~ōĶmEˆSą$ ’©xœ#T§wüÖŪ,Š^*U€ÉŻć8°p«E—|ņ“ pĄcÜ ‹įhdz߃|腧ļüį+Æ»öµ—_łņ7¾µ¶6¤9‚å«B€‰ØhĪ4<&@ =]ćŗ«mĆ@, |”µF’ ŹX=›ĶŠs0 äś”zu`XĖüōĒ ā%yŒs„—(`«t‡Œc Š©/Ś”y2ŁĄłąÉoŌVk&^zķõ’=ž ‡|AŠAig`Ģ#!ˆsOPŠģŖ„ÖB))r­q.@ØĮŒŁķ¶×ž!“ĆĮ—ž~Pš ” ė‚˜·tɒ™lj==šqp” ąPŠzĻĆ|}Ł[s'M}öæ’éʛž÷Ģ3`ČPœ8ĄĄŹ83³D›K©ŠųfŪõDąi$Ź`—*” „R›– &$Ź`ō³ßŻTײ·«›”†0Ī„\…q(ƒš< R;ųų£508\W m7_tē­„ŅLé?Żō›ĖÆśōŠ”ĮųĒŻ’<éŒÓĮČšD,Œﰚ”^pˆ3ƌP³ÓČ €sp˜oįųæūÓ¦­®uµ·_xڇļłķļłķ/>ż¬=wŚį?<Ō×ŪÖÕŪqęł«ōu)ā¤8 ^‚™ŁpößĒx(w+TĖ½¬Ü ^f^¼Ģ½ŖŅ÷Ŗ/ ŽĢŸé–ŽØ-‰€ˆPöĄHF› “$n8p ¹č‚UŖöņs/öŽC7ßtђ„oA‚ Œjƒ)Ÿ‰öYøÅ‡¹œ…ZBˆUžšŒ¹³Ą”Į$ˆQÄkć¬wźÄrĻųĶę<½zł[mś³›ox}õšYĪ\śÖņeµį?z¶WąÄ‰HŚƬ` hp"ēgOó’šėCŽ?ś77żźØ£Wk¤\2°f˜ć÷wŽ^+cį.Ūöm0…:+(ÅlA³÷ÅLS“Kč/}ļ›»°Ļj9üÆ’ÜėoŌ×<±ōµA–‡Āć0B„#‡-o)Lmüæ.žœē kĀłI²H¢r˹j9'j‚Ž“Œęš…ļļ„ČqFāø:O¤mĆā½īėŻL;ÅcŽgrƒ ÆY5%gĀPü’Æ"@832­<&7J}J,}ŃDŽ-ßoł’\`yEɚ»H”u»éó&Øę»­ŗ–ł|#{ó6GPŻŽ¬Œv“©Ė“ĪÉ!ŒRŠķ˜"mMó¬¦.®ü5·Ų²„%œ?””Ÿ8ˆ:=A­6D2|éž’|hßż[°ł"V޳ź–ķ=sXiħNś ­^C”Ž'Ā“i n{€mķß»īzņĆČĶ ©öķ†ĻusÆlŲn37~öö;“Į Õ[+ƒ7–ßņĖ_½óÖ[[ŽwĖķ&@tćŪ;ÜĪä<–kK–¤4©>su˜T*MļŪÓp¢‘ÅɝŖóHZ ÉSxī¹ēĢ>åMėžDY"RR‡~d:„µ&.yéŧī¾ēüSĪJ@鼓O§š¢Č·!,ŚĮŽagµdÉ0Ńo<Ÿ é ŪrŹūī¼oķ;k­“62¶J©prgēDīmŲÖ¹xĘL+œF¹µTžŚ!SwÆ0ńŹ“ĻRhģØńŅ€TRSHÆ=öä5ē\°ū¦[Šź!mՈj‰ńŒ:ėŌӌ‡ÖõW\is(Ż—e‡Y ā'?ž”é)5ņ9’¼ėĪ•r6NXF£7÷ßkĮvŁf1©B£CZŖŒü‰4¦šH‘_“*$‹:+‹lY³BM[£Ń¶qÕ_#ä‡dŚRŅY2Ā—ā>OEƵ[uć_~uÓ~š#ņĆč~‰"ÓKsŃ#62T!…žQ8śōY]ĒæwŸŻ7[øxƒŁ;ī¤.`Å‹=ą€3O>n囯C«(" Ģę»×«­B’ź§ßżöéG5—•v™2c:0“óY„Ź4  œĮ9Ö®v4i­z’”÷Żń·>šÓŽw½²ō€·yļF[ģēE’«¤ÉÆ›h©UøfŲ >ž1”#²÷¹ēžėŖĆ“ˆ|”š£ˆW‹ę“–ŠhŃ˼!pėÉQ¶“vQńwCŠŁÄž²Ė¹hå9¶ØŌՄQŪT’f,Ģā&ņĆ6ėvi*y“=sn™ć!÷īō®fŹėųŌ›XHÆcJœļžoä0ęĆ:86ŪÆø=žŽénætFJjKR޾_”ž…~fœs3D7ȍ[ß&¢£ŌümćB›wcg‰„¤Œ†Oj(ō×Ņźµ“|Ķ x{Ģ™_ŗŹ˜>Ÿ•7­v^vāi/<`5r]Q¢Š·v;]]]*@_„ō„Oš|_’ņu`ćr"Rś·?żY/ó&01‰ysĖ×y62‘ézg^ŗņµW_&-µ–ačOóŚūį•Į/żÄ%”étJ¬‰¤ɟżš{  č¦Wŗ©žŸXWaJœ§Š„©ĖńüyłÅ—8˜‘»ņ“Ÿ°‡®q¼tĶHBzųöŒ‡ ˜Pj_śü+¦aŒsĪ=[pTNš~&>ż±sV¼ń?’FļX”ŒšŠMu WżęĒæ¦:i_9ÓV)’Ūn¶i0§Ō±Ėsžžē?“”±}H’K„4kŅ4”¹ŲyŽ"ZS7Ś-aDŚ5"į/?ųŲsē]zʙ·Żx#©t8¦˜ĘvpŃĮŠĮpĮG?B2Hi»9œJ…–­åšŠŚį”µO?õDŌįmż0“ÖAHķØøEōŹįÕ«-ŚÆĒŸāņŻÜĒŪŲć“XĪ(¬ÕM[€IwėĆ~PĶ.į×ÅĘŌb-U}Ų}éjŚvfĀĻ ’|čž{wßzŪo|ęzŖ‡äš} b»Ź¬d©p«ysŽ{Ļ*ŠsąĮ}åźŗuĶ’·źkW‘ņ#Up?Q÷RšBi\ĮW>÷źĒßĀ4x3Yy*°Ø·· Ųu󳋧M9lĒķĖĄ Ļ>aS¬\ąQF‘¢Pś+VmŲÓwÖūłęWmÖ>yóÉ3Ÿøēß6ŃutŻYŚŁŃę½Ģ;žĄCČ÷µ ]gówØl"EZm4~|Ÿē Ęu"3¬Ié}wŪ½ čī¼ł÷™rUf#gAÖėõ˜Īż›_ü¢ č¾{ŻēČ7ŚcŚžÆ£|Ą¾ļ-mĄ®[mmU²c;MĆĆĆFu<#¼wńyēōU+[Ģ™Caė“$Z;|ó~zū7’ļ©ē “Utsƒ]RҬ©žžĻĆó§Ļ¬ųåMüķ-™SÉ5Či$'™Wy }S©ć³/žĻ7’öw&§½ńWæĪ“6héču‘?`æ åR'0µ³cJG{OI”<õ箚W†£˜‹,[“‡ačū‰öķžĖyēžcąMl:oĪ[Ææā®Ńžp±>‘ umØ®BŌCSvÅ;R)q.±·-…IlNÉĢ”¼d œŗMÜ$%µT9°ū‰:œsiźBx iÖhnY 9Mj°V…hļA©xä_÷š”8&·ŌÄgĒD©³O?£ Œc¼Zŗ”$8{:Ė€“ŚmĒķŗ€iĢ»ąø_xāQRį£ūĒ‚ĪqÓįm>}…¶ø–*Üš)mƒ@³ŽŒo¼¬Õ‡V“ö‰"ė@N”Ų(YX«d`†‡ÖÖkkµņ}߯×ėŌ”Z×ōm ć4ś$¢©rs&vó¢É(nD­¢ų»”·ŗV© īŗ9{ VOM ĢõbĶ[œ»®.Ÿ¾Š±ĘØēē„vt׋r>ó\/żĘ£MJ[Ä­_Y¾Ś4ŖéŽHō¼•»¼·šœV„kµ€šŹzŅ)n\IŅ›ĒLzģ¾>÷#”ZbW§twā»]s ‰|JVōéŹŒÉĮäI}Ą^ŁoöüÅ=ćē²ŅLīõ³ūūMWšķx’R$Ļ:ėƦ™§ Üpł•*ėžź¤Ä$U'x/ē“K•)š¦Ą{ō¾{—æöź+O=łś³Ļ,}ōÉ·z¬¶t)Éš»ßż6c@Éą„Jē;{ÓG£Žū‚H lz[ĒŌJג'ŸeEljŪ_T(“cw±nm,Æżķn z=UY¶ś‹~²ĻóJF³K  xō®äĖÄuǤ* pzoŸq+éblė)3ßzšńdfŽÅ/*M5ŗõ§7=rēæiMH¾éUV±)5­³g°Õō /=ėlRŹ`ȮʬłžüsĻó€x]םŁĄĖK–<’ †/>ųŲŪķ:ƒ·m;mÖ^ ·ųłW¾V\cĢK¤­Źq„śš‰1oĆ_½į³¤¬iŠQhWŃą„ܤ»X9g±DؚmŌÕäīŹŚ±Ą-JoĢüPŖi=[sdZćSåĘZZĻO“›p6ō­ÄtP÷µ¤µkc){óå×ß :!„4æõĪņ„f4z+UYƑéŚu>(ŻĒ^RkIž- ÄĄA=6#h 2ūĆĆwß7{Ņ“.į«T ĶīČ­·9mϽ>°Ļ^'ī³ē…<ń_·żīo7’ņ„'IIīgi1ŃuHIš®¾āŹ Ų‚Žžh›(ŚŗįÅ&.٬L“–źŠCņ€nÆTźƒkɼŚ)‹(+Ģ¬ĀŠ'v]Œ•Õļ¬0å Óßū©‹/6Ģ…ŖĄī»×°3HEE4!†2µ-&±’$UŠ_Ŗn1c#ć[“µ"US¾&Uf”;ūį©5k‡–.'_É5CõĮwV.{{é’7ßrßY«ĀšGßłN¦Ō…÷ķ°3­žŪĻoŚėO=ą°?’č?śü—ko/§ŗ¤0Ž?q‘vYfmī=X{żÕ7ā)źZĖ$¢PRClč’čQ7.õĘĒØėŽŪ°.¬RA}Åņ£Ü’#'Ü!ģ“ÕĀW_xŖ‰SCq)SV:Ąr*YMźČɇJ§p¦( 2‘avķk3Pank —(įņ̳Ž*ĀŅq~V¦ņµzåŖŌ™n¶,'®ČÉ*ļ€`­PgĢiæ“ 8ČłČįbI®ŅĒut¬ čäbĒ-·"©lŁ čœ.Ü»1³"RŸ¼čü*ŠW.W ¤čh Éø—?÷ģÓ`ēŒīüć) )š/>żō•¶Ł]=ßśģ\ū1vżĶ§ÄÖIøևżč'Ņ”śćfōFY_ch„”)p«|zS4Ŗn|XŠ÷»īŖIģ*£ĆBé1d ® Šŗ^’jØeó®ād#_•nœ«RāFOŖIzŅ.Ī”QbšLĮmę9b€T]-£zżœŠ”äźxßÅģĪꛛƃ<ĆØ}k5ł~X Ķ„‰4 Ć…Sśūŗ¹ĄćOŽe`Óxió<`ķĄj—ĪQ=„Ōį'žTŚĄŹĄ•ē^@ŠuCEżł–[< ·\jŗ=7˜’żO\õ >yųāgĀ{Ϭ{Ī^pꁇTœęˆ‹.ŗˆ"£”8pŌi”/ķĀŽZķ±żķĄ8!ŖĄ{ģŪ„č PēD­(įšEæ~īźOĻŪpz°ó¬…“̧:QŽü×cēzģŽsę½ż‡ķ°Ķ{·ZŲ“÷ž·’åV#“ŽŒ=¬B•&EW^u88C06ʒ*&āŽöü0“@’“öå%_»üŗż¶Żķ7ßś1łZÖĀ“›tp×w”J {l·=IeT²b¹µXvčµW^EDb.ƒŸpĄįŻĒģ½’ÜŽž¹½żsʍŸ5aĀ#÷ßC²FHøĒµ‰Kž}ꉩż}Ę$éŗ«® ęéčńœ4ɀkŒd㇨¬%Ň{†Q©” ‚ ’e±čL2ģz•׆ź&õ5ÄTēd!(ó_*Ō”ċ×z½*fVGƑ~-C•+«ž¶¶2ąo/yӔ źĆµčšrö"ķ¦‹$µ]S2±ŗdq>T*‡ CžÜŻcXė`›-œŹĮ~÷³Ÿ¹ėļ·._ńś›oæź!Ru’!9;RŖ”Æźa<¼)¼½¢|ķŠn£Aüi֋/<Ē#źfwąČ¾(ŽÄü°ī‡uMé° ōVĖ0ørud)ŖÕ¦vwW¾öź9§BŅZ+I2°śa䫜°Oš††jńӏKēDDZQ(÷Žfū9ż“ŪĄHiÖ£™’¾ˆՃē~“ ØŪϘsń §żėÖŪoøāźæžįOT•P˜³ŹÓD2|ģ÷¶·W€Y'Wv`ѬYķĄm7ެ aéł¢“7øyMAØl„)u„I¹ī|6 °™„&[39•ßŅ.UB¼jTƒ.Ų ću­…u ė¤ҁ‡u8-Oek”³—Ń<šˆćH—²+ƒP…ŅüŌ}S%O7bčĢū»Y½Žl~µŒLŻÜ†ĒÉ9}¾Ų¹4<<œĪʝ=¤ˆAD§/Ģ͇CGn01źͱ.ˤÄMJ’īŽaJiŅōŹ+/0;óž»ģHaŻ–s©{ꓵ;…”É†ŚsųĮ“œ«”M­ŹŚ=J%ƒ0n_gSYå=›mõ“o|ƒ‚€–­Ś¬«of¹m2÷nżõomėŠT ‰ŹŚuī“…‰Į”ŲŹ'.ŒŹÅ³€l’īJˆCß±dj£Ÿ¼‘3…F•Kk­”ņ}æEŻŁCńõ•"ż„Ä9”øEoŻSāę9ŃśØ˜Ų/䷛lķ0Ī=ŠPøTo‚~W üęéb‹’Ńc¾°õ{/a –RĘŚ*ܒšZsŹ~ŖīÕ8±tē® ×LøźOŌÉ¢rƒ†ųŹĢ?3”Ėū(6I‰³ÆÅĀvg²–­Æ(H‡ ęĪj&ƒoÓ;i· Ó6Ayqļ„©^„KšŲŪ–"ĆøÅīźO\V:ø(Ēp0‰ējReפ„š3{#ƒó“½¬Ü„¾%Ęóß8C8śąCV¬zG:ITAJGޱˆ°R`\„ZĘUŪ( ) ģ‘Š<%.VŽqÉ0X½jįģŗ=ŽÉY/o;yĪUüųģŽ‰½Ą–Ó§ōÓ+|›™ÓøćϤĆHZ‘”{ TҾ¬•źņJU lĒy›ŽōŻ{ėT±ō4n¼½ŚŠY½µśŸ7Žś›ožH/°=„¹ę·™•Ž ĖķSŹķuÓ¹ōņD [éKĪ<{^ߔ>ˆSö;dV„ó€-·ŻbŅŌ3:tš­7©>lŖ 0|i­É×*Zmxp\ow‰įų£ ’’Q}Ō©‚pxp(y:ŃŗˆņR§O;­ ńiRŠ‚@šmJJi˜õzą×kBŽ ßĮ,[C(MȔŃņõ-‚­ČÆę{FuՊ•ZŖ ī[įß@Ji©’õaæ>ģǜIs¶÷øī/^øšóŸłŒKēŽ6Ŗ ՓšHtć©ÄŽĪ&]Ų—*R0”“>ŒÖ R­NJ* ¤ö%…!:šw_ēbÄ+×`Æī’NiļiĘW:Ŗą/>ż“ƒĻäŃ0łŅ‹Ļ’ćŽæ:ģņĆ }D;© æšŁkwŚvń¾ó]RŚ4u%b Õķæ½¹t0t}č˜ć_yś9ņ%ł¬¢ŗX²āŽ?ݾü­e©śQĀ„Õš4ķµćNFgx8¬™5, +\+x’zņļ’:fĻ}ēM›Ńœ~ÜIļ¼ö¦]憫“>ą8g PéĄßu›m7lļ™Qķ:pĒ_}č‘ēžżņ} %ŚmaJõėš÷Mś¢×ݤ¹£˜ķVRņßÄ@±Ū¹ķö×)‡žÉÉavGźäz§g6Ė|RŒ½äŁ: Ōt3YqjH裩NŹ"6{šĖĄžmYŠāÉ8Yu/ĢšŌā]ŌŌ RÉp`ź œBłņ/Ėƒ. Pqœn“Ī„ćŽį‚+J,I…$żė_~ü£g ®^Aés¶8%Ö)żźäĢ•į՗|Ā0žĪ9ż EŅr2i‚7ļż­Æ|­ t‚±ē>ä«/źŠqĄŌjµ š‡†ķ&ćDģɍ¤:,‰7$Y Ćį Q:797ćŌ7vfN€t“Ų5’TgAś³2]ō-5ī6‰Ó(q“ws©JĶķ” Ķ„×;‘vżåZ#¤ÄZŽ:ŠĪ+i·’ś¾‰dk)qĘĆF)׳§yI#Ņ{XŸÄéõĪtóÆ4Ÿm-rčóÆẃքą“įŠl‘~$āt½^WJ¹L^+ĖĢ ³ĶÉų0ÉäĆ2Ē»V©~Ķ0T#lmQ’#y÷Rb­‰j…:…T(¢@×µ ‰ö;ą½°u©ēŠ >¼Ķ.;x[WŗuMxłŒĀqx=ķæē{*`Ę*Œ]|ÖĒ(L#c¾„ ŽæūõÆW€ÉŻ]ķĢ+LpīY:ÓĢĘ=ä ×_~‰¤5’1¤īX†'TŅv:‡}²D$U…1Sü.ĮšŹ'‡Ņqµ»)Ąķ-¹E“|’źÕžŻrŽĘ= ;l¼į§?tĘĒ:vr¹Ü l4}ņ„ž;4°"¦tŗBn¦«3Q02ˆŃšĄaˆÖ‹ś§MAY­\Ku9*Ąā½µźˆöŽė’÷Ų3ł×DVsęĪ,QśĀE—‘ÉŁĢ*3į‹‹ēi¢Į5kVƬ®!éÆY¹TCVāˆÓūeµÅ2h )%ƒw–/×X~g–RĘ{KPYpTö-2ĶęHšp*fō©¶g2R P”6ą” [\7bße~…TÄŪ”F…+¢@«ŗŌAh¢7J3¶©0CGŖEun!E²ŹŗorJMē¤Ļ9 ›"0<.$ƒąüS…)KŒ¼äĻ'/8{ƒIć<;’ń·¤zh;½ÓŁ‘¤4įŗĄ‚ÅĶCĢ[uŠ”åˆņ“ļ}OŪ RÖäĘ ż“ÖΆPTŠY$7e‘(#éGŠ“ŖnČÉSŚŚ·ž;’?üé?ńž]÷ząowŻņ«›†ÖŗÅ”8ĮKŌĖ‚°>8ōĒ›’äÓO(’ KVF‘±A¤µ üši!-‡WÆÖõ:„M&ąY™x ¤J²męA(uØ#ŅøNķ¬—„›mĮuĆ*é&ĶĢü\īä dÄÓÉtij]KŠ[\n]mh˜”¤d§ˆ#›ń„ÖN‰\‰†Œob‹Įkę„Oµ7eæ\ęiŚhĶa afĀßKŠq“¼[< ķŒK-i9FJK3%Ÿŗ^"u•©ćøžÖ©¹ēū(…nJœ×ÖŹš.c-XĪŲ ½½„ė5OEJܘl^§£"™†Ģxę‡.?Ś#¶ŽŽ\äynkĪ1g¦Ų {Ä_‰/b=ʚč󔿗ĢūPS'īQżœŅęļł?Ę(VZƬw»¦ģ½:½*°n’RP”ä`ŚńčŲDPŹŹšsnęƒń~`ęŸń+EVļEF>ód ’gVU£0#0­uYˆü”f M*LxRM(wō­kϾńŹ.ūī–y]ĖśššƒżŒicöĄ9iĶ žšć ģ°ū® ¢2°ä’A f-7’…IĘNūąæöÕ/ 3x€Ņ$včĮ7žāēõµkCŽtóĶS6š@%ĮŒżCįmiĶ«T*vĢßb«Åx%€S?š3Vœs;bĢz‚øn-ČZh°DpßøĘkŅĢ+ƒó ēĢ}ųég–½śŅŸ’š§ćN8¶g\÷æ÷Żeo.yńõ×®ŗīsķmć ā`0Ö#Z# „DY‰q€)ÉPćZW;;$©'žóļ­gośh “÷v_öŁ«V,yš4cš1ūä L2„Œ4@ZwutwwtWŚ;ĮDww/%€C3F%ŅœĆ³Ÿ€µ‘RR‚8焾ńżę’ˆģnfÜĢ÷BĻó̜ō<Ļ< ŅŗR-›g?.3”RœĢ̐±!0Ņń³6Ūcą¬T)7ÜšYō|5AHDĢZšhĪĄ÷}Ęćž`B˜³ˆ Į… ­9GHćŻFZ“Ż5`šż@”=Q*ÆŖ„ŒÕ“īø_Æ+„Œw…RŹŲ;÷HkĘA¤G„f+cŒø`”’fޚ ͽ½z­ö‹üųø÷¬^³ū.»s€3®5ƒä‚iF‰ŪœJé-šWM:&σćœK©uĖļī{ąßmūļæ’ 8…1®IąŒ30­ķ(ƒ13Œveib!„R*cGADœ{Ö¹‡ ͹A0‚gF ¼ī‡«W¬<ū£gķ“ĒnO¼šģõ_żüžyä„eÆ/Śj³ƒ9¤ŅÖ¦µ%Ļ®=€GQˆ•D¹½ķ€ƒŽtž&\ƒ1f×>ē0{;÷ŒłA@Zq@1VīéŅ‚8ƒąfLŒ‡Glą@†”™ŗęŻ )š£Œ4㌈ƒ Ęķp­d„Uā™Ä¬™‡–ŹĢSιyZÜcÜcКĮųŪŲæĮÉ,/»Yō78D‰ƒcdźnB0į"bŒ¼R Ę>Ĝ‰Œq!*•60¤N1ł‹«žZmXiā ‚Y×8"*•Jī©ŌÄŌ¤y<–ńt†!€0ö<3މĢ8F™SŪģ, m]ßćS2ó†Āć‘ Ct40÷˜ć½Č 1ń5ŌŚ8EAI­¤(޳­1Mž¦1Š@źå'ŸšŌŪ/ƒš×_g¾öŅK+–=æ|éÆnżƒŌ ńbL>šå]H­Õ%ģ–¢`ē6ˆ‚ n|Ø@Äc‚ƒ!eū— œā)j&ēqćŒ¦ÖZAĪ8Dį‹ccżÉ{)åķ‚Ģ;4²Ź^p ę ī7BŌ±2ņŅ#–÷¢Ģ\’˜ćU÷N×å}š„ø-ęG9w+Œh¬ĖĄĢąhI‰y¢†k¼ÄĄ88#ĪQģ Å­É\֊ilėĪʘGŽ7ÆūaĘöĀMī“Ēx-vüYė1‹£"—ćŒÆl|ƒė>“2ŸŽŹ½Ä“Ų\Ą:Žžˆ—ŌJļžbņ=ĮqXę8I+•J%mmm`Œ‹äŌ$MĘGP0궉%G›)ž•=/ɝ(PĮø‚™"āŁęCėĢńfößV^/ øG`&8A*V*)걩óf-c“†‚¹S§¢ÆóµįŠĒ„ĀōHFL ā`ŒńØĄtõō*&Ŗ¤ĘwtÕÖ¼öZĻģ ć„„A Œ1Ęš•ÄiłšQĒ»låŅz½.C ©&ļŸ“Į–-}»æsŚ;ļ,×5®äYócó1’̹0?±'½ć m~>w޼’<ō__JŽxķu÷AŲp³x;Ķ>RcC§ĶAm  I p ]š±Q™±6šņwPöåŒq‚9)@Œkāš8:Ź&y“ œAD{(×6Ūr«żūž·–/ķéé¹’Ŗć»ĢÖś Õ ©dŁ+°Ó®;żö÷æ}õWļ{šßĘ=DBŲc[Ų8ķóW]ē…ŗĻk’ćŸn=łC§›<’i€1͈ ŠĘ™qĄKŽYŲĖē €ąÜV<4¢ČLhĻÓ¤¹’!µ\LĀ™uźęœk­ĶdÖJq!ģ"%˜|JJåy—uT¢LX)U*{,ŠAIƒ ūYZkk{ÕĀø0>äĘ<”e.ĘT—pĮtvvš+"TŖU„µ`6+’R—J3Õ›VĮkEŁ«TŹDGWO§"-*%;Ÿ#ĖÖ²WŠÓ6!„Ft ĘóRpÜD(UJ`(U¬oy©T2÷Åā{aÄ8‡ +%qמ=cĘ ķ ĘZCpkLj†ęvC%=į1wh"XÓfĘ­;ŖR$ÓĮĄS¤·ŚnŪkV'É3å"¢’ąńĮÉ¢[SZpėŁOpęģLH ΉqĘAéŖ@u\÷u_ł‚&=“fuWw7q:ččC<“`œHC™\\ł(•Lš*Ü}’` Jƒ1ř3XDÄØ³³Ó܁`‚ˆąy( .æŽN{4C”‚'ƒOĪŹÜ[`q_«‹/8’“×^ Ɣ” ÜĖK/½0gĪĘm@[¹Ŗ4Vū5§L@Ä“÷ņų”#*„<įYt_)ĮK™š1įTgĮ “™ q˜hR©»’łĻŻ÷Ų]‚‰«Vvtw›×׿zµZ-xv“VĮHĆņĶėS¼ŃB., f®Źäī7Nl°•ƒ1@”©Ž¶ź¼©3ļæ’žŹÄ>”qõ£“ņ„§ĪqźįĒ}ē'?A™ƒ!š7™§t†¦&Õą¤ŃfwmS¼ “ņ1„”Œ!eŖ Nd­ČMq”Ēv‰Ąų”ēyęeJ«z½ŽŃŃį®&RźRŁ3Õ “ÖÖGĖ™'Ēy’]«ÕŚ*mø€6yŽ`ęŖL®µžÆ­54ć‚9ė1 †'a”) š†„±LÕ9z.¦Āņ;|üĪī„Ģļ–ę„m·™ó—§ó~Ń#0;@£#?“æøÓ)ß÷+•Š9’9»,#ī o2]MP©T*\b­Ōp31M>^Ģ "™7 ‚ R©dwf80`”ÅyN#‚ 8krz¦ĻJ›ŅH©=ū~X©”ß©³č)‰˜)J‰(eņķT0Żl/m¾Ķ¤TJ©r¹l>BkŠŠi©G)Ř) DÆ“VœsCJŠA”ź²ģ5 O3ÕYz¦Ų„ģMI©¼’(LĄģ·Īž 51ĮƒR×"@PR‹ϼ%PŖD˜ß ’uJ<wĮ)X¼» iĖ’QŖĢJfukEœcė-¶|ā‰ĒJŒo¾Éf÷>ņ Ķ89iƒƒNLķķķķŪī“ŻĻožķYg|šū?’Yowē’U+ĄŹŁH•L˜V6ęAc£•;ęŒ"ā•­"ig –SŁqYŽAŃ äŒX2+ņŃuKtņkn“Ö|&Ęyž‚ĒœęłĶÓĀVūLŻ“+“‹ŗÜØÖKó“+­@tE·éęqė˜ ē·znj9ńĆ3÷\«ÕKęĻ’OŻFL‰L”9Dœ?’ķ‹Yńēš(ŹŻņh~:…|»ƒG ‡¢Ńīd2įęO}“ĄµĖ7(ÄŅóL•üØÖā·µµå¼K¹Q5(aMÄH_/tƒ(1{5ü¢!Mx£†®É98écŽ=q‡¶<śŲćĖ]]ϽöbM+ĮłŖU«Mʹkeį@ĀĢ g”ĀŠÆĖś“>lĀ5»!¾$že1Ī"®-ńäūŌW–Š‘Fz’ēnNhCdŻu·Ż^~éåóĻæ``p­É‡ ’­Z­6¤©“öt2¬( Nßiƒwńēł^ ÷\)äYŁz; Ä[lµÓŪ=÷ĢS’{éehKÅddP< 7Ģž>£ ˜Ż;ńµ—^„Ķ@u|õ–[ H ,ĀÖs@ńę „vē|œīÜsĻó2KŅ>YĪG½ī›„Ł2#"ęgęŗlęIŁ|X+ŖÅ× µ®Õż”įc¢Ri‹¹dRJ"¦5³,“ÖĀćJi8MZ#JĶFĪŃÖÖ¦5Å ŠsŅdõŒƒq‘_ÆĒe»ęĢŽ ]¼yUB‘ -좹½Ī«ēŖ9{“§„“¬V$e8øvmœTī~véD ’³ˆÕj{“ü`H»ö € Rˆ[ }¢K€lńčq#˜&K5O˜ĢĒ16‹wó±Ó˜Į<Ղ¬2žb`‚g>=öʲM+d›‰^p†ĘŖ²0N&IŗȂG<ł!·­“Ē/¦ō›ÜķN~Ń+‰JµCL9Ą˜@É8›Ņ™”·Ę]N‚ FĢ4,0n÷0)UJ%u2hŃŻyž0å`ćüÆńø™Ā^’'@TX©JxÖĪ;sĪā– ĄiMšø;ŻÜŻCk2‰±mf²Ó¾šÜ±Ć^yl¾Ņr`]ŲęŻüÅīéFœń’W"„Ij0p±ĒžxL!éķvÜ Œsmc Q Šś&ʜU„žß#OćĶ•ūķځ/\}4ĻÓī2eÓøüWø5ޚ-ė?K3“?“:’Ģ®nSjµ.æHł-„‘ńĮä s“Ń÷„²ęq~ž G„£2/vĻÓQ½Ūz‰½[dAgŽĀu$¢ēÆĒE¼¹3ĘŚŚŚk‹-Ģ0ó+?³MnėH]n%or–ē‰ņĶv4Fµ[˜¦#óĶ“$R–ū.˜°üųØĮĻtÕęOĢüŃŠ|Śå÷¬Āvöę7žæĒ|jš)e›ū4G|󻦄O­m%Ķ—āśZ­Ļw2§ÆĻ¶ZäŻt4‘ą}Āń7|ńKēœ~©æūŻvėéé 5żė_’2±HÜga%E ęm½ł"xeO›l²‰{æ¬(ž7ų3Ģ\pʄ)ü[¼'z’Ńd3ą€PI¦_œ Īm­V#8ŃĢ6śĢõח«U“Ūž¢1-ŽĘæUĄ·’Q·ųq…„–ü֟¼!'-HCĆc8ę„ćū&LØĮ¦›-×Z3 ( €ėnųl čŖ“m28“ét4™3)mš!9ˆ7hpr©°AŻżœĮ\k=<<ģF*q¼’ϾŠG‰lØZ­VĢ+Õ²»c!lüXÉęĆDT­V-L€{¢­­R.—9‡ēq€G”T{Œ{Ü+ ĶW!ø •\+›ėFÜT(„ŁV"-ķ¤ó<¦µŪ^*Ūīh³F¼R©bfcBŲ+Ą Ü靄ŌŌ4ÆhxŲ9Ł`_ĶN”Ųø²°ē-’ž&Æ3Nxp(²Zk.˜W*µ··Ēx“f¹ĀŠO“„Ēm“ĢénęÅ_¶u–³L y’¤V–V›ņ’ž÷?¤ūcćļŻµŠ$sÉĄqŲźrS „ĖpNVEC'8枹“"„`Jj"V®CƒŒŠV­0B[„inEMq:ÕG”KÅ3ė”ēŲØæŌ4Õ·2oS%Py cŌĘKnq?^#JéT,‡°xvÜXҶO Ę »Tj‘2‹4}G1Ć”ŒV•YęĢÜgóĖķ’Ī]ø©ĖŲtjZɇS/`0MbW ©wžć\pʀžq½ęœrMÜO+ ”wxļīkåšŅwŽ~ųæ’^Ōu{ū1=OÖŗYīŃ÷I‡C€`Ź^łėg±lA ūäŗcc™@T)‚4hd˜“0é%§ŗÄ÷·ŸÄXHaRÓäŲmjø2ć“/Sfā’ŃfR…Ølō"óżØrĪVź§‚™V’óuŃØr1Ų^gØl—31ó•śg»ĢF<#×/Š×¤–œĒ?Ēö¶…•Ęįyž ć„W^¹©æŗ;æÖ¦ż&‘ž*xē܍„”Š UqKƒņ0³ĒN—ĀrąhĒd„†ūōOĢ*u)1­t£•ŁØx¹NRYóFtSiŚj(yĻįœo¾åā¶Ž.pńßG[±fuzßūއØ4b£µ!sąÓ3Ļ<]®¢§ÆsįĀy¼ā!,ŽŌź¦ćN”|ń…B0!ø£vfŠ8:^ÅÕjÕĪĪl1ˆ3„•9ČóŚfŲŁH•wf’tTFĀĶ—X|“˜T–›.2-wŁ}—‰½=ßžźW$“?°¶D\h2“ó {̱ćĒ}Ék†AÄ­dźJ RKŒ=Jó‰F±–q^.—Ė咉,•ŌŒY1-­mȘČQÜĄ³DJļ %–Žk„q XN#ƒÖ¶öGŒappČ …ą@–”ŅAØČ•¶ŠĪźØŲž$Rk0Ōjµ(f%ŖØ='™“Ź˜ļØ$āB0n£s­5 ;: %„ 2b-47¤Ž`•lĪŲȔž&<£›jĮ|w»ébÄ ‘ņEü½ż­dŅ’šøAŒ¹QJ,M³D“>.[…2J²‹|”6,6b1)müĘT’cģ­·Ž Ć0f+ø9pJ©qØWi$9P#€Ņ 0%Łc|©ZG…BŠŹr…³Ģæ±R©¢t³ „™™Eg\:;SÜ„™&ó³łIQD‘{GFą‡ę Ö¬];0čˆUKļĆV2Ó¹H³ø½ ÉxR’6sĪ³ÆĶĘ›œq"mšP‡*āĢOį„–„”aØāLø^ÆY*uŃģI%öĶłMh™ßjń,K²)ĶxÜņ,^zīy ­5i`Ÿ}ömwbFŚĶ\¬Š$41h0Z±võ°$Ā«Æ¾jX¢TŽe ’Xßv_[0?–PĪßZ+qŚ˜”©fįO=b+yČF‡…vµIiÜØ¼0ĄŲ„Ģ82‹{[‚óncÖۘw“ómĢh™ū‹F\°r¹¤5Ł ¢ŌށTQpÄŠ¶ }ė[X«yń£Ir8"±mÄk "æŌėu+Ł'u 9ęŪZņ5ĪI25'„6˜sŗŒšŽ~4Õo=lT 8sl¤ž{ƒŗŽ‹<7Aę›÷$ÄÆ40ęŗ/­ļ:Ļ!GŽ™EVśC¹RM¬T®°R`AĄĮ—-[#īØml’RQ° į½½āwŁłš£Ž|čńnjŽ˜=Ż[©M¤ Š`Œ’.˜čKkøs)Óח¹©¤%Fi j]°Ŗł˜ÆcQ¦õ¼ł~ķ>k³(Ā0„Ԑ‚ĻŚd޾ūī{Į@ēøŽ×žXgŅŠžž¶VZŗfĶP¤:Ą4JĀjČiĘ4gäqå6…xj•J%–io&“··ø•s®ÅŃ^üéŗ[AģmF„åRÉSR“†RZ+ƒ‰ˆbų…sŪĒe+ƒOšWĀ*TsĪQ©”9gF_ŚįĄšpͤøIU[QWW§ļūˆ“ø žiŖD”'W.˜i!fŒ sĪćö0"™'Ga±Qx5=ŪŠÄa5ÜRR–iĢ4 s1J²Y£}µźŅ(•kRN"”Ōj5ćVg~ģZ4Ņ¦š S%1?‹¦‡qŹžMłxŃõ·@ŗļ7öĄ‘vōW[$ņѶŪnkīÅŹ1ÖdWoĀöŠ_`eÕXZĖ(f`jH© „S©ZŌ³`9Óå+X*ŚŚĖ‚C€%4ģtf‰_#C×dNh!ŸtŹvłÕĢ©ęö799HG9OĢųą(WJ&0čźź*•JVq*­rj.ģļqĪĶü‘’ˆL7„½Ī˜žh³S*§EځBŪžäfIIę$ŅZ3굩ų"ĘĢKžĮć"ØūreŽ”7‹žf4ĀrU`agY&"j”9»S×tæ ŲżØ$<żš{ßē@›WĄvŪoO¾/ƒŠ6Ö&wgv|šžq½¦wē­„oką¾ūīk5“Ž*A†÷žG„…ŻūŠ·»õVĖVę{ Ä“µm0*Ĉ ®Ś¢tE½h ĪņĘp™•Je¬l÷M™[fbäqµVųEŚ©$–1ęy^…‘õ-·>Iʤ­cYaż"+œ@fŚihī1&`ŻŠæ¤I6—&qĄ:"Ć­’ļˆläw‚tŽ <^©–Mk%Bšīž.—”’ķb¼Ż ĶKąfŪ"ŅB0CŃN3™}Į=Qņ“ØŃęł-¶h¦h™imC4ÖnB„+†;”@“iå’AčZ,Œ\‹Ćj!0bF#  *>D× ĮĮ9ŒõVś[ĄÓŠß¶hįN»Ļø2½m-īÕć"÷ųā‚„>Ļ\¶ēq"hM`„4 K1N«›\NÆÅQvĢ ™$s„¬&·÷&?ĮX.ƒ`»Gµ­b„)ˆ¢_[æ¢Ųw ņN3šłÄ)Y_ hAN&L qŚą’ʄ"XŠRįœĪ(syļäxOČPÕėu¾ęœ™dĄģ'Õj•\ļ(–"ŠÖ@SiķHõV$]Z Gµ"mzC¢’yćµ×ŹP¼T†š„ ‚é»1ósŠų]s6š5eŅd µzh S§N%@é†9 Ā›JØ-U°ŒŹQ6i“ŚcĪ‚Ģž0ĀĄRѵ›$©B«)_FLJ¹š’.ŪŽ9wu I£õxŌ£ ĘčŻ¼ÓĶ_ZļÓi²" –Ē^޶č.e,Ē:ļNēżzįŒa˜“Ó²ĒuĀ'·V ,Ŗf1hh ć²č¬Y DrpE 2Ir£-8VĶ)ęrs˜R]Ģw³[ėęÖ'waāŃüq“ˆü'qēH źÖgcó„Q1 /unźX0Ł>Giė px%qå•WJq~ųŃGšĄ5HpĘ"Ł0O0ŅĘø„)©ŹmķÖ_3ĶžĶ¦=é¼× óMH„“i~Ė4²ęŸūžf—X/¹QÕFµƒžPē\1 g—”Ņ÷}Nš YM£«Ś^„Å;ī8gžü6 Ė 8ņČ#/’ųyOžŗäŁēO?ź˜’į·Keœƒį’OBēi·ŗ@2B,ߋĶH"Tp0Į2, Cvwƒø|F9šĒż§’Zx\kŅZWŖåxY#„ˆ»Č8†‡j`ččl7щš8€rÉ3^ÆZ*sś†”ņėRIH©KĀÓRÅ9³ÖŚDŻÜcRi›ł“#;dTs7q|†2T&Ø5WkHŻQ^]2is¹\*•ėę›o~}ł2­ŃōuōöOšųģĖĻ2ADt*®™ųÅ8WkF˜bZk%˜ąL“²)ēnPJwØ6ZYńŽ‘„lE5&+Ž#?£ƒĄ“”ņ<{Ąųõ R-ǰŖĮ]ė5æT*Ǧ8ę0[–”Ź÷żŽŽv³LĆPVڼ8®%"ć6owÉ҈ÓfÆ$ d†(m›ÖÉu‚Qš„`ŃĒ©RI¤š6£^hdd·x³óøŃF§SoU°R²ó'ż³ī¤”ńΐū8m*ę‡Ćuź„õ…vߍĶĆ\¾ŽÖĘrVø¤Öččl)Ȍ!\£)«›¢'ļÉSŅm4Mń‡X²ŪŌėõJ„ŅČ_°»‘ŲąŌ¼i ß-²)2¦,łfW3[ęč†Bvg\cµŖÄ« ˆĢb޵ūG•›3g¬ĪšŻ”~.yō˜„žKįēšéįų­•2÷" ŠČ‹¬lYz Å®HĪDŠŪSķf‚“ŻĖ—¹DwR¶ĮÕž»’åQ’č'JŁŻ,? j¼įfkm!„ āłČŪrė†g(°–aꐷc¢tXg¼ĆlĄż÷Ż·xū`ō„ Üś8ŽĀ ¾ņ™k/ŗäRŸ1pĄ¾øåOEFqĪ:Ņ)»Æx+ŠŠn„™‰īņ 0¶Żթ݊!h̜wū)b_XźØŌ›L­ˆ{ ōäMm—aTłG-oÖēZœe£Ó¬U÷Óu‡&’q-øIUnDa­QÄē­\hξM–ŠB7åØĢ[üPlÄś&Žøc{ŗ¦©ś»}r6;Žź‡ęx½mטĆō¤1u$ß÷«m•Ōyc&K‹‚‰±LātM½ąŠu4o#l øVmk#–rīĶšeg1×¼Ō=„āšB+ ‚ Ś^i”¶å/ŪlIc+Ь gĮqń„Œ$;g¼@Į…œØ"ŗėÜćK‚€x÷ ­P“UŪHo4¬ÕC)§b–_•īS0R“~˜13ö×S·ÉZnb^×ųœH¬8Ķ€›ĻrOwóß÷+åJ’ŹĀj}C1V}Õ'/»ćŽ;yģa"X¾0ĆYg}ų _žŖ5!Mē^üōZūzš$Ł0›Ė»—#É69«×üĢ*33'^§¤ķŠ&"ŪŽ•×ΔԖŅLØÕź„Rɲ(‘dFŚ ęS\7VJ įŁĻŠbå0†J=48h2aćį{GGlsx°āø:JžSIHü^Y |“³ ³ „ahŅŚFļ“1u7 ø…źdj’ŪäA»÷œŽ“3­YSŒ ·öź”ŖTA ņŸ™&ÆK6±vøŌ@SĻ­ #]¶1ć͟P9õ/ƒjC1ˆļȐֵք’ĒXqH†“$ĻÆfVŪ)„Ó±s*[.šD`„ Hģ»Så s§œēĒĶŽOä|NqW?œ*CcͰ켢äVķŠ²8‚)ēįjŽ0n3 ć ęœęŚČ.&¹ ˜»Q˜uZÆ×«Õjœķ+)…Vē€Į=ꚑu)õ䔔œsĘy&'Ļ ŻÅ'fgų|ż‚"—s IŁ™Ąó €“¤”‚P)U騬ZÕ7¾Ļ¤īR©8¹Õ:*»§}#ŬO9śŲēŸ~ķŚµ·ßń·)nhJ‘[÷¬ÕjķķmŁŅ)o)RnBDIFE,3®«ü”%BZĶ3g+@z³µēĮQŽ^`±_Ɂ@Łg×ŲŠŪ*k6f®OGl3¬ˆĘŒńLy.ŽĄėuĒ’<“¢*„+~1„ž/§|jLL•‰¬0J{³ĢžŠ:ßj]ŗäQ6I‰31qs@µuKčÖ/=N‰ćÆTŅó<3āłĖ[÷*‚=X +`w4†Uć’Ź>`a KeĻŻRQkˆNÆSJlKÖ »ŠQX©äĆ/¤ķ¬ŒĶ]<\™ “łßKnłJ)åy^~ ×Wy²IiŹ|cF)„±c©ŃNu09( I !Ś<¼aÕßµmr ł$Š<»oņV=ŠGĆ !_[é#ٵēmfG[ t0“āmÖüoœe¹«;CńZ ”J±7ßüß²eĖīŗūŸ{ģ±Ē¢E‹x©”ņ//fĒP³«Ń-»ųjĢ©"µZ½Ś^µ!hüžŹī<ŒC+eŒfā 6)āš¤’ĆĪV’©(ŁķŒ×©ÅœK‚“ķ'“霹Šč”dÓfĘX•j9 ‚R©d:fķG8™yHa’īmź\M„%HĀh+‰qJļE »č×­2Ū$7ŽŪmƒ”t¼ŸÅ2u­5`…,8ķēR{‚gAÅ&Pdŗn‚™§;oG¦7F SGsń&;u±qó_ń6’ÜHÕ0AĢ‚Ƨˆ»a9g™2”ARą–‰Ó˜?mÓ8Ė/d³~³2‚anČĖPXŖ¶Ü÷-ā裙„"®ØźčmĢÉ"ø”0‘Ņēˆ‹ćI8š-Zėz½ŽŽŽnģÄLHcĘ6qŠkĮfūujٲNŖ½Ł*Öv‡ŹeSh fʈf£Li“µĪ)Ÿ9ŲøĪ©:ÅQŸuŠą±ƒöß’¶?ßĘ “2{ M‹L#1g©+%@«d§3q)®Ė}ć2hbĻyŅYM››żŸ³āIJu`!6&pOg-µÓųćp֜ģĪ%²Ånū! X³å‘QˆH6ÆYE_™=Mkką×^­f¢M3zqJ<†ćÆ9<““FÆĆē"ǃk1XZ/XsåĢMŗäų’;F4%G”é›y7>Śb‰ØV«µµµµ""ŅvĪ'ĆĆĆęćĖŌTZW„Z'ŖC:%.Bęu†Œ±’”üQ²5ǹ\6h°%e ?…õ¶Ā›Ķä„ļö՜šė6SE~ŗ—%Ś®PĖ9‰óK½9ł"Čƒ z\ō¾Å-uĢC7šPžZ?]FÜs›L’'Fq&,VósSćˆ#03Č&ƃ!“G¬ģĻŻ7gФHJ飊‰WHy°×I Ŗß|—OŸ­ Iē˜Qꖮ ¹K)-JŁŅX¦Ē.¾DÄc eŃ„T^I~„t9Õś8dqį7sĄEŌŗl±āØĶĄM0ÜŖ6ƒ»vl Ķ]« ēõ0-š1&wyC¤"ę/HŪʖgxė˜=÷ā“Ź<åH=řĻE)q“Ucņ^„(‚¶¶JńAÕ TIm!®KŠɤ šzŠc§Īˆ†œ÷¤,© [H¤ĒMZ‡ēœš~ŽĖ–Ģ(Æ&M¹¶–čBi cĢ+—•ŅF»+ua)_!ń M@“ÖÜę• N@aXfObuh[2ÆXŪŽŽīō ,r§wNß„†,-CæćŪńŃÉBŹRŋgi!śź2V𲢁ˆJozŃZ.`ŃGM ccmč(ņI3;āÄXI)8/yžķ"gPZø CÆ\JÖϦdÉ>€‘2H©ˆąy‚4,S4‚A,ĆP8, Z‘Qµ%mƒ0ćŸdd„cĻU«ébLSĶõH  n<‡ˆĄ¬õ‹Ö¤”5%¶0d•x8ē6r*jF ±pF»ˆ‰ŸĘĮ²@7Už„ĆP6ŠÉWĶÆ Į"jR cI°œ‚ Ō$³Ķ“¢ó4ĀłjMjf£"!gś7 ¹ł`ę‚ņQ<š&±®Źbœ"źŠ4x šŹ›ĒßpĒ8 C³Ųķ`rW 5oĄĄ&啄„Ģ1ØĀ‚ŠM[gŒvKq 2C$‘s… mŁ¦Ó2óC”˜wˆõW³²®–Ćaæ1:’bÜōØ„it¶×`Ž' ĀR¹ĢœX-¦^—J%’ Ļ#­«ÕŖÖš1n³qhƹŖKx¢纘2Ę“&„T©ģ5ZG£:}óŒ•ę¬QU«q’ėX^ŽÄŃ!ci\²a—ŗk Į•JĀŁ?s"GyČ7SĪė*§åg\źńAĶd_ł} -’l‰żĢĒIC”œ“(ņ9‹{qSģś"Š›9%K#N±YqZg1~Mź=ė£ÄÖNk.æ‘„w9Ī ~ʦŠ앂zX®”<Īķ–B©&Ÿ²ŗ#ž6Ÿr™ą–ŅīeŠF؜ŒįY©Tņ<“\ƒaxxŲtž#Jģ͟R©ÄŒs"SĶ‘RC“Rd[ÌŽa ",š•„Ē8X©,\?vssĢ6‡sĪEɳģi®g©™9ņw^_ šŹÖ—XgĻwšqұDeÆÄ9ÆÕjš4cŠ„½öŚ+™ł†͊oƒ;m}œi]ŽtΘ€Sė@ŹŗÜŚ “Øf∠Pā^s2ŗ‚Qćz¦Mš%Č/§ä?­snÖę×W:lknę2¶|¬08Y_BEnĄ™Ļ0Ż&«Ö¢UXąĀtćÓŲĢĆ EY„y®"ژĒvēŗIü™”£®#ÄłkŅ2+Ҧx Ī2-ąi]6"č4– x–ĒøĶz,HÄNz1ŠŅbÕbYČ­–åK ļāMŒZ|S2›ˆ&hžW­Vy®I8’|xĆų/ĻoŻĀ;­2O¶#ˆŠ÷›?¦VQtēē1i$žŪąŒ±RÉĖŌM ä#‚Œóf -9Ė‚4%:*ó–tM £Śó`į§jŵ)7W¤Č'dūÖȱŚx.mJ”M2¹J<’1ŃŁme®Ēśmr.ēƒWŠÖ<2/õš­eœ veŽ!¶0Īąc1ŁĀL|å00&b+ˆŌ€0—Ä“–1(„R YĻ­¬ļzœĮŅ(„¢ķ1Šb8Ą048lhxa mļ±aY»żįĘŲŚ™œ3­H+eM}„0(Sr4S‘”«†”*=9¼” µ^— 733‹eD[ģQ€i»ZęJ7„ Éq^Ѽ¾™ŸB®e±)…“ŗ[4@¦f˜Ŗk“[ ;7 R ˆ¦–¤ąl›Wq-śO·Å½°Ė7{=EüpĘŅSŽāāKF-,É3ćŠqfžä‰Q±’³É6‡¼’ĄĄŚÄ*¹ÉČ,¢‘ j®į2šŸÉr©\j‰kčļ„D†żĮˆ,ŽÆSĘX„R”tw{b¬ĮĮ­W‚2E\°RÉ«TŹ^IĻJ£ǵüć朣"’ŁKń¾›øN¦öÕģ* té0‡ņfWė¶]䣝¤~ńņbŗY¹\VJ Ļė?žłēžß}÷ݾõ­oœuÖY€ń°J+MĘĆNœfI3fˆKZk3ąõ˜ƒaF$ß·Ąņˆ[ĘŲčĆķXō$“ Ę6)lNJš™/ŽõŁ_™÷ÕĖM¶żV¬†ņصūqčUˆ4øąJāæČ@c˜Ļ Ś®fŠ[Æ›Ųł6‚ Ē–šåcūQ ćś±±—-8wÖc2ņ$…ŠSK€ X^ĢćŻūÓzšŚØÅ¼š5ĶG²Įį1§Ä(źĪ,õDŠ‚Å:Ÿč\ˆ†ŠŽ9d2r¢ŅyBus.JńV¢BŹģ*•'z¼ĶJ3­·­ĘZhBˆ Lė@Ęåö|£o|Ųäźń©ڬ “{\$­ČŽ ”Uć‡õ5Ū-łŒŽīØ6øęל÷­ŃTœØ clb6Š•JZˆ›hT"Įrīö:"ÖÅįEw7āKsdŽQ±V°; ®§ÖÄ=©i{b!é%3¢ÓfOˆ”£mdøf*d[‹Ķkb„īŒ„2låŠUćʍc24ĀZ"é„Lē(¶RX8ѤEŹ'ÕĢŗ’O=*޽vä2–jHfPZ¹ĒŠŲ¶}×EZ Mp‰f-dh ź™UJŁP„Õę›ļr±•R©9ƒ“BrV· hf „”M]”œuž‡M${Žøš]fĖU-Œ…́t+{ōa(KeÆčn”Ų»BD® QF«†§zMµ£Eh­ˆ ł)Bė¦ ±™ŌW_}õyē×ŁÕ‘¹—ģÕęÜo({É\Ī6%„“\°”»OĶ·TuĘŖÆåx.dײьlYdonCˆ¤”ŻŠŽMƒfœ'ż±éŃrB %ÄYŚ•½9ĄÕ¬ ĆÖĻ©Śüą³Ž‹@½īWŪ* ³ŽH ĘBJ&fą…ūU¬ÕŖµęŒ›¹[ÓvŻ;ZnFb­`')(#ŃŽZų©u”hs^[Į†¦ÓūKśüM½'±Vjp£ł›H ĆQxy—$– µ„3±Ķ˜}‰ZIFFĢŻāīĀXchl Ķhõ›Fm¶†·V+Ä{ ó÷•yÆj“HvT„ ÷ĶćĻõ›øĆ†a‹uĮF}°ł+ŌZA0"jśnćĘ QS‡Ę{Š©“ ­5šŌ‡¬7³P-ƒƒĄ™q^41ĪøżIĖ ¢R*Ė™L7¼5Łwšƒ“īĀ-ųÅķ—DdšNn¼ 8OņŸ ‘&šķŁÉż&Ē’KĀe…¦]e 1ˆĀ 1Fķtōg“uµ[XćĖmhdāhŚŚ¾QÅ“ūŠ‡źuß}j…ÕÜ|q!x †‚"k­EœkqFœ(Īß8)˜ēeZqh"Jļ,ŠĖ"*AAU8’|ƒzh€n$²4ƒ"Õ˜Ī3ĄTŌ·ęąl®pTŒŽX†Å|„“i’³åE¦3Ķąå6 qPß¾ń懒Zį„hŗŚ “ż,­µŃ¦6Ž0Ŗņ`^ VĒĶ¢Öߊ<’rå1LĒ…1iݤ iįåuŻZc&BVˈzÅ”yQ›nģ{™˜ń°V—[šN)5ēš<2 €įįzüĪD­e Rˆ¼ö•Kdˆž™®…ō…]Ä1??Qlb©G“s2Ļ$T”ƒā!Ūi8Ś•‹‹qc)„‹·gŃZfäNX¼’Ē «ŗ$ mŅż÷ßßäĆöćX®U;ŅtLpNćAE QŹTƒ5˜y†ķĀćlŁØÄ÷+„BĪC(R#g,:¹œ27ø`FaĖH ”^ólxxXki¶«vĄ*i6O&,¼®¤dFPšsk87»“£G]d©åBU)4æ…&a¶2įF®db› ŃmŪi„1€¦ģC”¾“Ō.Į4Hx^|0ˆ{O5ÅÆ[uc·\Ą91ģ/Œ+Fµmšw( ‡šo­ Ž?Ļó‰Ö‡¾Lf‡wĻWęj“½ÄMī+&dĮ!ä6?wš—G;.:Ķā†l²R+5Up¶ŅT\x=£ņjZGrC”¾Q搪:8¬¤kģfr©c,Q4ƗÄ9‘Yä¦T–ÆmäÆdĢfQ#āäļ’{ƒäĮnj›*ÄŁF…6p Ś„Ü利dŻÉĄ$¢Õ[#Į“-™;.Ó,ķ% µ(‹—!  ©æ1 9Łi¾ļ¶{ńāzg!V“ĘÉҵN’å4ć”"V_lؽ‹u։‚PEŗyJ™č*‘…†Ą…­ĶU”›uėŅ9ŸÆhŗ¾ŹÖ…é".,‚fŅęu­žj9V!Da[³5ƒ°ŪÆy>yfĪ™‘”fCCµöj›]z±@“Ż1¬‘˜u‚!ē®ė{:µ¶ÅYŹ{ܼ§‘}6 ­µįō¾_®TĀ ¢r„bFÜ\X˚k0ÅAĻ+›E–(sćPķ™b‡±ī°~­iŽF¦,.°éūA„Z6©B¢×ĄęˆyīA =c ŪķÄ2]Ž›±9ébšæÉg¦Y²ƒ5ĮšŅøGlÖākÉš³e¬ĘõŽćc£u\Høˆ$]3¶”s>Žł Qé£i'šŪåĖŒŒćõJL»ņ#m4 H)Ų0qŅ,6–»µ†ļū„RINʚݸo›\E¶ĆŖlāó{5÷Dó °Ńöå~c°ĮŚp½­½źŽ@ü¼bĶŽhVƒ w¾qĖ+QʶG‰Äš2¦Žg18Č|ڲ ŽņssGÓ®"„šJ%‚Ć püœĶŒÓd:i£#dQśLÄeZe%ĀŖZSÜhā—16Å`²[FV8¹•÷LńćR|‡¢å—3ė²Œą¢ōYIždd­&06cÜż·ńµnF–Œķ©Xś¬©ŒpwO3æŌˆ×Öč"Ż=¤Ų.1wvZī<„¢V«õōt”įndT²ą|ÉłĻ·˜‚5Y•ńzŃwv Ø[6¤ĢūZ³‘ƒ½ĀæŃ²Jœ,Ī7PśrZ!NĒŽk£©_Ēvg÷™¹ģ‹LJlˆ|MĖF”y+õ‰1«•®—„yD"A7×u'`ŪRŒŅDä•J…¶¹j…õ*””J ‰ń؛‘ń«(%nB=x·‰Ä™ƒ³ą°$€ ”Ą½Ø,hĄ!ĢncU<&ßPJU*å čQģa¾ļWŖUŅ|tŻÅ¦™‚G¬µ~:®Æ‡ÕØØo™C.£x™)D~›ü]ŚĒR‡eD>LF³‘ē30i„T}ćĒ„SXҦy­e/—DĘ`)uŲąŽ”“óįF’Ö2!™e®Ę„󆦻8'K²S)9Cɏ³/óšXŠĢ÷żJ„EęJEŁ)=G½^yžˆ#—Ąl+ā‹12×1%»0%Ž­Ŗ’HēąˆżØ”²f3œ?F%žLÕl“c@•KLnd‰ęśä,āx7O‰3yuažīž¼‘į“}™N„OÅė‹œņ„HU3UTųĖlSÉSŠÅĀYļ¢x½0ŹVX`MĪ\£f3źõz„Re®1/ēńŠ2Ź-£œ-š}!„pU'åüŒDPžŒK„sO¾TtčśA±D+Ī“”8z׬‚±£xēÖ lnĢ‹RāBįq› 4õAÕ eކk<žq³CR®‚-„Eqm1wŗŲĢŻmģAyżēFQM“>8“f6Ž›139†žņØF© šŽU :‹ˆ5PŗMüN÷JaŽeMŒščoÅ8wdŻq ˆŹ¾± —&­µē‰ōdnµ<Œ™čóÖ,Vu¶ģŲ$p1؈}jŻcė"¦łŽĘüĢ4ę”ėŅK=ōTua°pfÕ“āł?āfDīˆ€ceÉDSłÓęŖ§­ÖEŚżŻ\BźzāĪÕF…ŠFW8"9Ņš46ĀØ^ФoĮQG 8J`yrK‹”ęį”a$ft¤2£sH̓Ӥ•V1s2όmōē„µģ’źD2!Ń!¦%iI)}!Ā»ń\Z'x4™Q)ɘ4£)¦QÅbœ3Ū:Ń HØā÷­T*&ŌķŅkÄĢAŌģß[µž6Ŗt®—}¶‘2a¼EøL­ éØšĀ0Ń?`]/žró ²@käq•^b: Ās,[ö6ˆ˜€†¶2 Lø|I2²=ÖłF[cĖKuĢcĄŁBµ†ļ‡®°G4!¹©<š4Õ l©äŲ֑^ Ż‘8)+äc¬'R|\Ę ׊L—„_ģŠä, ejöŒÜ7txtĮV™ ß[)Ū5—œPd3,#Vh¶4‘6f‡?,Ę8ēb+ŽŌ-ܞ"{Ď”ŒBW†ī4¢ƒŚˆš·ł÷Éæƒ{*¹źSĶć“B¦h¤‡\W· ÓMńōŃ$ĀÉßu²=²Ų“š˜qš„JJé0 c»>„`…@_su“ •o6mœœ&hh„$lĖO‘l>Ämį”iP褑»Ös{ń®’æ°}vZ ”› P3“ˆŁdŠ,õz½ueiײtÄWZwaŽQC3Qøõņ¶RÉ#BXc rcLĘHc¾ė‘Ņ3mųN™JIÜ1CnŽž‘˜y\^ĪĪņB’sjWšy"Ö¦õøhe((×KVP‘Éą·®DŹH„¦V‹ĀĄŲ$Såb&€fy€Ā„łĻ•"Qõf—Ć ā½ulFĖaåū>2hŸ ŗXКĶm7éž&‘Ģ€0܁ƒ€ŒŠm7ĮHꛘ żĮÖ×$°ˆséäx¶Ļ«JoŠģ’É„Xp,¦m–Ā?Žčˆ(•PJYHµµŻµE·b”D FŪ5ŹØÓb鉯J— £{Ļ)ŁåZ5© &˘!Yż$™°E…f««’Šļ€Ęɹ¼$ŹÉƆƒ•“–½é3°m8 Tf¦å` NʁU²ŅwcĢP3½Ś'āÉņ*XMܤؕG¬#X]Ó;fäY÷mÉ”»WŽ×—Ø2$ØC oķČ/”qOƒ ×8ĒŲ©ēŪ`źŽ(¶·œ\ ¹qå[ęQuŅĒõŅZū¾ļū~2MŹRDo«,”„>§²źĀ—|•ĮPƒn4c¦jGp»ø-$„Ԛµf£‘“šœ•ģ‚*u~ęZŻÅ²naĮOVP `¶ŽA Ć0„ģ¢²M’ģ*$æDcüMJū­–ÕĒøą ©· !įf£)Sjó ’‰öFrz#®ˆŽ z­˜=ĻćG‹ėøōÖ TspĮNcXåc#įQ.…GĘ®1ŁorR$qŌQ+2y¬¤Ēlå>}Dż1®•TŪ&W“©¦ż«ŠņžĢsA&КÉ'öI—!$?į°Ėj˜õ 5“PŹ`ćB—£øSmŽę8"±Ķ°ˆ9LV%&«@D: ×ĘģĮ0f5js¾˜Mæ©© B`Ht4 @#©…„¢Aų¾>Gł$3GXJ&c^ŹÕV”6%Ć )ZL“¶ŲŠŖ«õm*=B‚ Øŗ)T>īdb–D&,…Ņ=ńm‘#nŃJĖ÷v1776n«uÕҹqUŲmµč6žĄz%]‰s/c¹GwĻȜš®õ˜„É1qƒI³±XÄ!mŲ€ ‚ģ6:Z0£ÅŒöĄ×¾ļŪäć2Š`ČvÅ„øų¦EcoÕŹÕDl Ó!{ßV‹ ±3įqō'dPī"–M6HŠČĶä„ęĖq!Ńō«„ZóŠŠP²6Į)0RZžĶX§¤ļ”U­ ü¬ł„DZYM³öüd‹»¬¼ęŲ("6©Ÿ·Š+pFsƒŹw=a3üLĪ5ęe™yŲa†ƒŹ—9¢įdȁ&* ń ¬ćÕšŽ«!U¢•¤TRŖbѳ'6Z3C ćPäd†ćFüU+«UĶŽ”n….U9;z Jž¶Łļ€ģ³0…ŌJ Q¬p`#ŒÆB„:‘ åʍšĶtŃU1Š#L½…õŗGeA§‘˜*’­‚ŗę¦ ޟJŪŻ#øĘx<$vŲd;yž NŠš·"1ĪĶŌ榔ėĮłØSUJ)Ēqjėķ$I äDŁoņA#Ć¢jQ”Ņyøń ¬•‹Ž)żU§G]ٚØ$ŪBÓŖZSod1­cz©£nƒ[&ˆĖ`Ģ!x K„„č:Äģ²ź$™ėåĘgQƒœūŖ¦Łu e¦|˜œ1ć‘IH·e“f!āŅ~r§OzŠ–M:®³•Ō22hę …”Pī®Ü ś½Ŗ-Tč¢5ČŪׁZ[{ōtR ę¬vīÜiV³>Ō*WŚ/ū£–°J٤«42-ÆdE–šeÆ_k­Į‘J(‰RHGq@`®¢Ć`ūĘB"ˆtt…Äv „)"€q:1oˆ˜Ž«¢ī‚QŸ’RH%L@‡šŠ‚ ҈sXڃ0”c`@BG’ćØę|„`uĆZ“ā@ D“F š™¤#P‚f,Ū¬””ńAąŗNs]Œ-ā͌įChåH&2ÜČhK­gó>”_E}0B“44bÉSƾÕČÓ“Z€¤G_åム·”Ŗ¾Ķ•_E9„@Ōźę÷ļßßŃŃaäųaN[ŽGn$zRI”Ó¦HZ$7Ńș–€S’`P!ži€j)“¶ŌSn°®™p©…H’|§“Hå?96)Ißéydo\ņZDķiŸbĻź2ØhÜ)5BV&6ˆģL¬·Jy…Ō|޶/¬tė蛹(.3Q«°Ķ0ä@‰ R’ļ Ēń‹EĒq@HŠ ƒVGśEĻÉŗ 5Z—ß÷M,[eGXF×ÄrcŅ0Š3Ļ(į< exK¬ö°ŒŃ`d±›ĆÕVlˆZāUˆšÕ]8ķc Ռmź­8åidč^“4k5„Ģ’ē»®cŒ¬’'éū:‰ˆŒĘxž—É8õź8d—\UĪ”²æƒ\­^–­/STk1W!%jĶ6bē“U¼¶„Kb˜^ ±0cLś²VTjću#چB§¢“[ĀčHĮq[W‚“yo”‰Ź¼čéT*S3 %lŠ2::šĻēM¶ęx !B¦qŅóŹ lŁø‹g³©M0ĀZR&ŒĒ™AI&”H³P®h7#A¢mI”5I×aT H‚f&#²$@°¶K„e5£dDaEąė§5aŅ“ŖšķÉöW˜Lš’ Qf“–į 10hp„Ö²'Ż‰śeōŸĢɛ§`åŗ"˜|8™²&’Tæ—•Ruhx©„¾aa¢f²>Ą6ģF@Ó9|a+Ģ ŒŚŃU²8”Td5ÕŃŖ’Ńˆāo"óCalZCčTJ”ķČn[§&›Ķ†ų VJ[‘öÓBƕ&\¦!fŗˆ˜ĖålŒ›×ŚHE³•5Ö(eŚ–Ė”8P)e2G5|³‰Æo@PJ9MMfjK)“f˜ŃADČBėŲ‚1v»­Ą>`J>ŲØGøaSGDD‘ĄÄÉDš”č›§fÖ[›Ī…¹„© De“…µ2«”•8kÖC)µ•DeÖZń”ł’źXXČ7cYaœ‘rņŽŠŠjj*xˆ$$kR!*Jŗi @}Dé˜Ī,ć¢ļ֑°©ļQ^ƒ‹ Ó6fUƒöŖŖŌČ+E§1]¼HżŹ÷żd “xX<ĘƒØŻu8Ɵ*Ŗžć%T’‹Ó1Ļó’nÆušLG¶Sp +²Źž“€’æ~՗#ćŗ¤Ł#Ź+'[Ŗ‹•„ŠŌ’Č“·PłÓX+•J©‹*CÖ]nRgį±M«°’kW«š!ā% ŃLvɈĮ |šµ­…žš)Ī‚€„U‰D)PŠŖÜąś DƒśIŪŖŲūśŁiGVe8ŕ€1÷ZōŌ²_QōZŚ÷U÷ĖčX•všud䠂rŸr®R×]÷”­čÕ (Ŗ ÕŖÕ)ļ¤~B„R) ˜_Å*Å~!„Ø5E¶Ÿį\HĘčBÉŽ@™øS¾RYÆW"ŪõMbmŖ† i=`”²q­–ĢqVP+ÄI¦‚Ézˆ’BŽˆD–°B¢RҐ QH”J8Ž ‚e{³|Óź”J˜Ė7ØBHsé9•R– jšń \Ǽ49DŁrƒ€bŁ$fΐQ€“¢8 hčŁĢČ Ä¬5kŅZAP‡R•`/—Ļ1bĖu¾ فĆj”-ƒķŠ—Mł2żøĶŲö}æV Z†xLH ¦“HŒˆ °‘µ-ś48g„Ž„ōįcķŖ |™µn²jōŪ$ ;ŽŪĢJF.¤”R™ėµBё˜…° 5q I(”Ž4ļ1=1ĆY”:±āŽ”ŅXpĒ“‘€5[y-N`b¢Ń…’€@LI@}jĮąÄ‘ˆWė§›}.Źqøüƒ ŃƧ @"¶‚PŹÖ!Āā…óHĘv„’å»<³ń½Ŗ1%c®WXŚż«DfŅŚ¬·ĆĆƅB1Q:d“„D„@+MŸP“8RĀ¤Zc5Ś:͟˜ÜøP(˜#*%„e€Ź!:¦S„(@žMķO)—O/w–©”¾«ßn0g—ųš˜9pćéeRdĶx¾Ā¶ ²šą§3"šBvč›" Ą3Ė ƒ#rm’K¾C,»Ć˜VŖ£^(©­Ę»’Ń+EM=šZĢ ŅÜƼķIźõæ6%>bQļõ«>.æńī1]”œBMJ7Ō#īĆ'™ŠJ©\.— ŽR»dZžT«Æ“ŅW"7¢¾kU„ŹÅŲ„†ńrŸI9Ž#„ż/”{‹TnF+ØzOåŲKqMǬnÖņ1opاˆĒ5ańV¾NU>šJ„7Ø4!„jDeˆ5[4PĪØ‰¶sSsėŠō"ż­ĘK0U[Ķ %½åĆGփŖ|r—ć8UąP‘'Z‘1B•¬’j’ƒJŽ+ÓŁK„.å«yL …X©\'†Ė:‡j·š“3) ‘¹WŠNĄšb±Ņ((ó+ʤĶOŽ(„4į”1Ұ=.Ó żZ#ž¤hhĮĢĘw€8:4Ŗ==:Tˆ”ĶѓĶDd2Ÿ™Į÷Ҭ’J(%c$ ‘įÕ2&4Āc(b‘mCõ'"sęAq9¹L·6šu“ś&²¬‚DHž˜¢<‡m/ÅÜ`ѧ–3yĀI,ÅX¾: Q^>51:Z4:pcÖ×j”¤±j”?¶M­å.‘;éęä>•qć|Ą0 4„tRė}_Łg„$S…ٰbANųń–±Å1œ×Uü± …B“‰Gˆj²‹©Š|hN«9Ä³ÖŚŖC—”Ą,VÅbQ¤TH<`[óB‹†$aYV¾€2„„Ŗķ©źøpĘt©Ā¼±‚«Io1!„sss³ć8‰Ą°Æ]åDHd°FM”nĆ ŠājĶY³L%e,L2uÜd™2żųjTńRŖuFĶ.8¤\ŹźŌ ć'.Ņgev++ĒŠ€ō]}óĪ£—ęŖLŖKœŌGø4ü ך² ½ŹD+ß £#š JkmqVå»”Š|åbX7©£öœr*ogž’ģUi+PēÜŖŅæĒl½T}UŚyž Sā:Ł×tzĒ;†ĘĢŅ«i4Ņ^®UƀڦÆÉ”øAļģ:“ÖQRݰd~’Ŗ÷×oAWV•jzÓ+tøńs${Ce  ³@Üiō‘ˆöblcJ”)yŠØcYK&­źÜˆ’ŪFRÜFt źŒ sóףx5Pƒ7R½”TēĀ\ŹżoSKR4>ėCĀź¼Ę‹š³<\„¾[{R¼0 ®ž…! ĻQ2lņØ×ŠSCkMeĮq²’)ŹUv¢ÆTƒ.LaA6zbĘ  ˆœ”aŠP³„Āb–åĢq¢īīfęR2•JśaD–`˜€•ˆŚĖ‚“Q]Ųq2‹€•¶6Ś?fÕĢĮ0WÉē󙜛Ķf#™yˆ“,_’ kF 5åć2{³T@#Źz#BDld–J˜7$…‘m _¾»amšnJü³²ĀUUI„ź+V'ģ “ß7 ‡ “ ŠtvR‰uҒƤs)GĆź‹ĘE™¤JXUį„^†ń˜Ķ*„˜Ę®a5­¬Ŗ³&fiŗ]”Ę'S٠Ф9!Dā0é±-Ž£xĶĘYפ]©B)į81>Ł÷µUŠ¢X£.Ņ6K¦I—Äŗ_F³EĻóŒ${&“ å cšrdÆ9eōŪčm‘\–į ¤bŚ ;z˜1/%2“”‚Ąؐ<ÆÄl½¼HƵ†=”¤ˆ”ĘA™/[vŠŃ —…¤P jŹN¶ ›!ʍYkĶ^я˜‘¾`ÕꟘć®rOl°Ķhš꣕™)Bø`Åī“œ©É/²~ve办€ŲŌ.+bc§…˜nS'a FҌVƒēj`\šU•†/õ[SG¦äĵ_Õ»AX­dĻÕś ąy^2ŠxOUĆėä~€5Ņu/3!«Öś’H‡2‰«Ŗ3h+e†ė(±7rIY«Ó’ß~½Pn(’¢Yµ*¶Š‘€PjtYå¬jµ,yÄ(uLjq7^ ŖZČØU²*ūüÄšfIŹjĮ–„Ė}Ņ ~lĢWĒ’6ŖOC…Óɘ#üø µjr•ĀNQ€X$ĶF»0 VXĖä¦Ųü9c]a­=ÆžÕUŗ—52ĖŽŅŻ®źŠŖAs­Ø °9Ŗ= ”2ĘU•‚ž ²±…‰ƒķ>ŹeYDłŌØāXƒX]ø*Ą„°ql—°\²„ĄDÅ*¶&Ŗ !lŠāś~³ “@±ÄØ‹Ķ™Dh‘¶ 'C ±åL&WQī(A €¢_d :Ā7F’5§W6MB‰Z 'ÖöW¦{YsUqč 5ŲŽĆļ-Ŗ6Ė|2£IQ•MÕ=ĢÓu°œŁTė×[“§Į[ĀÖk• ®,ģØŽ„”Č@]1¤ˆqžfu舵’š:Ķńź‹dU·śŖó%¼„E*qR KsH$ĻՖ£4¹@‡Ü„(=. ±ƒ`ųW&}µy/&ė!²²‚š®ėFI«½×P Ā šD"„ĮD÷Õ¢ŁEŌÄŹ»dv"3%]×5µ7“‰łØBø™L¢¦ ĶšµOZSRžŻbCCy]Q9˜1Īc³±æĀ4€e2O#³yĘėp93^*”i䦣'ką*1X’ø²°\%zN–锚Ün2ˆbfSqˆŹĶÉD«Ŗi6¤P•Yqµ…K ½jZŒ1ŻŖĀ"’$& ¬ nå•Ż—:ż§FĄ:$²ń~TE•O½źyāaURć»'*c§-7ĘŃ!8²$%¾«‹ž_¢¦Ē|^õ+µręZ›l{hę²µ-‹ŽZAūz\/`bÜųLjÕų@¬œBut€£¶­©IWžLćbµ‹(1Ž; š5YČO„aõ‰ÖP×īÜ^£ńxˆXŖB7+ŽU^ŹŅISøś+`²å]WśLˆSZÉ+‰VØsÉG&’^TMGüµ10¦›"ÅU5KˆŹĢµĮĄblLzŅbM‘źņŌąœzĮ+ŽUsŚF ¢µęH„{y£½b(ĆŃmg©Öł‹0Œ€Ģ€ćŌ6‚#L»MŪŹ§±Ŗmluœ†Ī1 ˜ĪpLĖ” \‡€5“Æ5ųZkMIiŌŌ’€h­µm@1xžgšø–¤±•ŒÅJūOͬ‰Ķ%/°gÅlmŒÆžås€”P(˜;i4¢Lę8NŽ£˜ –OOvW0› Ę篵)T&0†‰F¾•G¤™tĢŁFbņµOFš ƒūĻ$K9ügž““|¬l7’KåĆń:Gx„ČŃ“­­Å¬Uń5USVĻõ6Py×.KP(”˜¬z²RŒAX£T{omp7¬äW.Öeč†p²˜\epp°ÆÆĻö‡Įŗū¾Æ2gn‹¶fŒiŪ©+涒5#Lų„0ä³¹ä%ŖjŒY¹åAÕR@åįyQ¹0VM±ĒQåƒßīV%ŖšyžgīF”)ZāqĀ÷(šŃŃY‹E4h J>ūA\n0é‚mirõe*IM–«LqM›“?}™ZŽ3iĶD: OŪ\~č°·sęĖ,Šėf|:|„€U;œP-s,O=vŁ ;~a_"¾4­$!ā5S)Į|ĢŌ(‹A@AŖ}UQUćŖrįž,U†æ±.•J‰žvŌÉDØ­ę˜P$J08ö4A@%k(=cĮŪ:٬†•#„²Ŗ­(] /IkĶAˆĆ=ØÓ£Š~‰ :ĽƒŃF.•JŻ=˜,@92“u݌#•°Ķķ¤>Wxc .7 W¶LŻ(Ÿ”²ėEa¬æ±ĢšČž’åųˆ2Š:G(żÄZmj©¦*€@ūĚ$ +4NQ™P‚)~™bY”"‘?ū¼RiŅʝ”‘f€%ÆČČ;†GŲ')DSS^e”¤bttTk­ƒ@0°Ÿ~,1E9źšrY >5Ž„$j”RXe2D#V*u`ø !tų^`Vo#‚'8Žz“٬'\õŚŹGk½?ī‘p|Ÿ Ćdé,“”¹Ŗŗ7Ušėćž-Ž‘ U‰”Ā"`ütؚ¤–¼ˇ“LRt°VU® ėń ė5­šäĆJuõ£:VYĒĀ}ßT„Łl6”Ö£ŚŠz%˜P‰©žx8 Zœ#{•ƒ_ā³JϵąŅŖyņóE­”<Ž»óŠŁ¤T©jįļ‰(ī׌PkB|ė·ęca™ŗ`*{­JLeŃųŌUęiQ6UõŗĘģlCTø–i^­D7‰IØ\ėSIf|DĮ€eŽ.¶`JD!AŃnz `½”(S>DLS‹MHej`Yé(>0 =; Š”“£ØŌeCkßĮĆĄP*xČv3DDĶöА4§ „† \䖙2 CĄ ²”R° lŚ@ˆŒ€@@lh|V,9ž£¢"ŗ®koøa†ÆR©iØø®kČQ•ņ]„ˆ‘QBJ~ŗ !'.»b„ĖqYµ¬ī™\CėŚĒŪŖUUKƒĄVnQ`>ōd@œz^ęzĶ=„ FMŁųO’øLN2ęÅpŒgā|.›č±™gdÆĖqƒ6Ou R„‚RÉÆÓ%Nm#„PÉ¹(‘rMŁ¢ē›U– 0#»00āc«ƒ’éÄ¢122R,«.,!„”Ö³6„-0‚JJ°¾6 AzåŹåŹA7£PąÄÉ=(P(TR S§LÉf2³¦OWæ÷ļ†6.ģš2t„Å50DzföFQõx·X(…½āŠå ųĀ<ŹŲ-Ü_ …‚”¾ēfFŁ™`ą`æÄ@Jņ@#hš)ŖÆ!€£$VŒ(“K 3äĮ ®ė ūq™U•ĶębĀEˆČšŽŃÖĄĄ(ķ®įf”0R>Ӛ@³EŁ%ŗµ&ƒ­b„U‚Ņ:{4ėCéo‡Å…'™ų/V!ÖV‡é¢¹&”(å@£rß7‚źV]Sr öWŃ1$«GHRĮ+ūĆŚńFr)KBäRb:éŅ#„ Z fž3 ź#iŅ2'Ń2ä# B-}S‡=‚VD i$ŅI"“ ˜kØ~±,,Æé¤w·d¹Ÿ˜5U6{k7Õ[:ā¶hŖŌ“BFķEæąvĻI‰æ£±®ó‡UņĘņ6BŅU²Ņ–v¼ĪŃ0–Ćšų»¾°>׍_Zģ X1¢…¤픤śH“^ y£Ž!ĒŅ‘¾ø®Ša`bµIa¢>‹UŒü`cŪC³Ż¤ ‰Ć>š|ļūß5®˜±;Dė[ŁóM]qŚ›—Hśå `ņa@Ć“2R,9 p³µ—Š@É.}U‹c#Siņ7Øį \u(¦-ꔏņg¬ŹzóŃMĻŖcøü–Žcȍi mŒ”:©†`ŃŲŽ5žL†Ą÷„£jd|6—V:2ņĄ$6([^c›6'aōżŒė¤*ś¤YH4¦£‘~x w_f Ą¤”eĮ6ė3ā«Ö™Sk2lRŲ¶ŹÓgĶDÄĀ$ēX³ Ž1‹ˆ ā$3õ°ˆˆެѣ~0€0:FBž@ūDDŽ«L×q•‰ĀQ‚ vĆ»ź{ćŖd—L4ŻČ(F)‚€”±ž.S' u¼B×V.ĖX“&Ó® ČIŠ„õ»:7é#`¶|D¬ü+Sģ3^,eŽ ŸŒhÄ֙”‘2_“A¤†qŌŹŽlźkĶŹŠN …ęę|ż‘\(²®”’ ĻóöķŪ—Ė夔DŌÕŻiŽn– ŹCT]š’×ĪDŒ£7ēkUź@ e/.3ėJL±žžŽĪ3<ŒimÜ $0i"»Ń8*µĖ ” ›–RFnŲĢÖ#ĶäuAøJXąt²›Q6ž#1f@$­…žē+×1g­5±YĄģyžöō3O<łųc­X±ā†_żRfš#`¶?“į©ć-±Žśoļ’Łeķ¢j׃g Č˜ś`xŽė>’üŗłóš5I²-~?öčc'Ÿ|* P Ń'ķf{Œ+DBŲę-‘’„Šū²ŹBJ—$š&¾Q&ćB… ›jQY‘œ_ĘtŚŚM3'”õDQ¤’ų@°ĀV<'AūÉu£B—Ö1O¹Šq}6I}iž#ĪbŽ {²ņ/8į(ÅÖSõHāæŽrZćēŠØCWö©Ę}­'z”€Ņ$ó¤Aµķq}ųøFR}¾qč)4I3Ā€€bv]—ÉarH‹„są“t„©ö9Jłƒ#²M/ĶŽ …ķö`XؓJ"sH†nbē¼&4ŪU_ßĮbqŌĄŗ~÷»ß%³ Ņzß¾}\pq± =TbĄ†@Ģ8®@üȇ>lė[X.Ā1 ĖšN13Jä€ExƍAQŖņ—l'č8ŽIŒ!į©[ ZĪ"įń”3j„įyēlć XćRüs54x 3*¬Aŗ&סּZ €¹vūä}_aŗ7ŽęŪhĖó¼Ąó-!¤ ÷:|ūļ’ųŠßžī•|ėO[{֔„M8<“kēī§ž|Ś÷!Q& 7’(ø2zQ‘üƒT™Čø§ÄīE`uVlzjĢ W,śŖūD.”š4#ƒB”PL'3j-Ö>ūģ’^’÷śµ+Vö›ļUŪŗG)Gŗ®«”-ś¦\RżŽ¤Ž£BćbeŠV&Č8ÜÆµö=Ļ\…ćŖPµ›„Œ’O ė‚™µęd> {E#Įh›a˜čÄ\n©,:4“!Ibd±A.kzčŽÅN:čV‰-Ę:h­Ńö±č„”‘>† «¹Ŗ;‹”˜ e“ŖŠź›o ŹÉ<‹LÖ}ä-;ėĢŽ)“>ö‘!ƒ@e¤ˆ˜’ĖÅņ௒sĪĤĀÖ±ŗ©ĀW4œ^2Q6?·vŁ!Oahppłņå‹-`†®ö–?N!ä3*ēŹ)'8Ž2w&Nœ̚“tTRŃ-Dą„ŖPhcĆl0_Fķ9bʘy ĘpVŚfīƒŁ1MjjEĖ¢ģĮuŻŃ¾—æģŚÆ|yÕņg¶oŚ še]RB’öoÉøv'VÅx7·§øo6#£®gR}ß÷u '£ˆüīīī³Ī:³££Ķj Ąé§ŸÖŚŚŌwč€p% Œ1JaSG0پÖZJaĪNX«$SH"­É$•!ot¼£į „Œ³ ®PŖ"FרŽ$³Å5D¾Źe“Ū®6kѲ’˜ūjĖB-"+31kĘŖ±HR Üm8œ«śŠźõu »‘äo£ķŹ”ĆdyųÉę¤Õ3"ېĒńG³©oR·ĘY²5½<™#ŲF$Ż€ķW¹ńpU…Tsė"eY"ˆ`;c¦3cFGcmU āõx¢²#ųUż-lL™čńŪń'§õŻvź„ÄG–ŚAʵuŖź“U£įuŹ“užq˜KTÕߟhĮPźk}B#Wō/Ņ‹órµ•;Ź@@°eóŽ‹/ŗā“W9š@°e'""ƒ¤ š|ß[2ˆĘFHÓń±ū€ …3ųL k¶aAŪŽ^ų“WæśÕBą¤É“nøń. ·üžVl3U÷ßw/0‘"äN @įĄ·æó- " @b”£éUJpihąŽ»ī¼łĘžzģŃĢÆ²¬S"•’Ś]©÷G kŹkŗźį¢_YØj(‰Üąø:ʑܸbYćĖt(„NåÖŁ* [ 5I%†††FF ‘l•ćX7Hl)ĘQ”RJ)%Āā Mä’Ē{ßõź+^yĮē?šĄ}Š@=®r_Ԛ˜ąź«Æ>ńÄO=õ”7č 0$Fy\fnBZ”TåHz䚣#Uyß;\¬"ŗ¾ēłVÕUx Ųž“:Å € n‚Ļž×'æłµ/õ>’—?ß ĄŅQ Š€ D=A„ “ŸĖ”R2Q@ 20šµ91ū6ęŽĪNå8Ę­Ē8£†<4m :äX’RJō¼@k- }™›+& ÷)k(1² Æ²üZkjD;8V-WZ¾”²ź©]ŻćF%0›ģY·[ŪŽ3§ö?E“‡„¤€RØ+óéŃE©]ņ Q^V[”ł}Sk“Ż1”£­³Ķ,JeUæäQ__µ2Ä}>+W*ƒ‡čWő‘=»v­[·®0:š¬F·WkŻŅŚŗlٲիŸ#ā;v<ńŌSĆƃƅĀČččĪ={®»ī:Ó3G„ÖÖV@ ōҐMĢ€1ŒCÅ7Mņ„-³Uu6)}.— Ÿ€ėŚf)bY >$':ēĄ"œAeė9s: 8ž±LĘe 0RķŃūē{ī‰0Ō 3kĢh %²Q)Óf'›B2ƒDĄb™öƒˆbč}!–ŁĘ–Ńū9iHU$ĶD„BŲé†ŃŌ·rqFŽ”«µSWe„“ź»X¹WeŒ3äT{‹©˜)‰ńųĀšøP[89BjihUķ²¬A\N24rD!¤öÉ\„–A뫟B ‹ŚŹeʾ™EųIMV—C«uĒ’ŗ0Bˆ¦¦¦$ō¦j‡3i*‘ś†ˆ|ß7›ąŗj¼}㺌ću4x›®U³āu[0é+–ļų@kÜ1ŽGņšJņŃ£öQRt7dGéƒ:F!•œW’µL&Ś}eˆ]«æ>pM˜T¼dÖĢZB$@’ Ī8ė”?ß{ĒW¾žł³ĪYV*D÷W„ÜLĘŲ>O{P³'›J)A€FJ «¬‹Ā́ģIS˜½ęź«…Ą;īø£luCqŁe—A½LDwÜqG  Åa¬ĄĄ€$Ąi§V¾™ü”ŒjšŽżöwžŪ›Žš”÷æ÷ąŽ]I±ä“MšrUM‰!T{ŽāפŖj$V‘ÄYŸń®59”ĢóŠų-/Ȝ®“;`“PŪ{fĢrŒ?abG9¦`‘än•IS28ŹiŹå £³=ŸĻE-‘’.©·¬µ¶+/ƒT*Lo4€ä””å+žZ°`ĪĢYSļ¾ēveŃ70+́,śKĄ¼ysēĢ™5mśŌę–¼t€N¦ŽÓžŃ³‰±¾ef;¶ Š~™ŠĶ(l !܌c8ŠV=%Į³_fž*4üWĖŁ Š€¾?’˜¹ĒĢ›½ōÄćĪ:ū " ¤”D½P˜ę¹BBE®ižG¹Ä(Å2Kƒƒƒ„’gćö .ė 0ŌP(‹Ą ”Ģd\Ɣ6”3EPvfÓUJ45å TņĶŌ !įņ†e`±’d¤­÷ihHęmī¹h°\˜4^Ŗłt Sa%ŒKņ4ˆ›$įŁå+Žśę·,Y²dŁŁg )Y“!FšZ¢•F«č §Ī0U€f†?įŽ·LŠŅŽ2Rimkė™8qxt(Š^Ł…#—3T’L—üŹuÅė{V>Ž~ųóęĢ9÷Üsoøį†$|Ę$`ąÜ®QZg›[@H7ߤ‰AHfxü©' @ @¹Lˆ”pČÓ@@¾F1›=ÉB ”qJ‚D4äLcMk³›-ΌXSķŲ¦b z“ZdĆA)ß)–Š£m­Ķä—Ö­YÕŻŻZ' =±§‘°³€Ėģ!]Ģj}-Ė¶{–D«e1„ER°B&:ę˜c>ų‘ óēĻ3ŸP*y_r10gó9ŽÄŲ!Ō:I*źA‘¹)T‘3£’Éø qčRłĆ…ŁˆHFS”ļq,f€Ģ×:į¶ćkųŗB«oĮ5ewĘ n 13˜ŌžU?ĻI##’ęÕbķ# ŚÓš£Éc‘3GWWE6ā’”S”)uiĄĒdÅŖrbćUN”š*ĶĘ<'»IåŃ(ÉO®K¦@V)O-8J)榮B5Q©¼ć  ^iå"’Bå—GŲ.­‹ŚH~sgZ5ƒKAEƒŸņ/zUžbJй–ŲĻQfžõƱĢ3¹g§¤ĻŒcĘT·®śžĘÆq¼š½GŠv®ł'å¤Ä "`~ķķ]ĄŖ½³gūνfÕ°ž&ˆµ›@0²P%€'ž\]ņĄŒN€°B¦ Ga¬iT˜hĆśõ_żŚW č%:ĶO|üĖ–-›6mZ$+mø×½öõ€€ĢpŚi/źļļ# †‡‡“öķŪćū¾ēūk׬}ųįGk(kŠGH™Šõ„˜6eā± ē,8fĘČš°_k˜„ŌĀ“ΐ%«Ķ’ŹįŃ+iō’2}©U¼€„Ņfes ń”UU\įˆ—ŽńŹņE-0f^žĢ3?łń?ž±ŽŽ–qĪ’Ü­r³ÖĶü0Š£… ˈ˜1š½Ö֖W¼śŪvn“R¾ē=ļׂN0ä+WN靼qóóš|@fАņ)­É^”|Ų¦yFßMAT: DŒDŻćäŌ.œ\öo92I ńØ@`Ė;JPqtpēĪķ ģ@5ŸoMBÅׄīnāŚŽ¬BŅ~„Į‘R“¶¶J)I3 R0s©X“MZĶf㸜A)›xå^¶B7aLL Ī÷µļ5wۈÓž-&„Uā|,|^ćŖįVgXY±(@†ŖQN”HWZ²U’!Ģ{÷īżć’øįłu{÷ķnmoŃŚ3’÷Q¶ÕÄ ‡Ķ|U³Į€ä Y¹ž‹Čܙ¶oß^(¤#¦N›¢”2k‘į„CĢEO:^,”cgY®ŖbvU{‚…‹(Wpļōiļ:JĄ¢X?J^}Mš¤tü€å9/=ˆ‰ EæT2•1ÖaҐģ*QVż@›9Ęæ‹Ą£ē‘€IĖ¢½ŗb?­ŠŽ94v6|­Ł/”2¶¶ä™u’ ‘µe‹N(ž ČH`Ō/Āū\UĶŽ6)5ū¢RŃ3 FĪŻŠ‰¬ #i@°p‰Ē{ģÉ'>ķ’K.fMÉAöń’^Vœu3Źh&%å”QYŖ^cnK‚h–Hó $MB³Ŗ=GoI óO“Å„—ÓČъQ~kFJo'՜2 Ę„ˆuÉS½ßZ52ØźrÜ`,—šs#ŽVŖa¤‘ga"Vd@†g RŠ|>Æ5UZ~¤ā’:ŹÉÕ ‘ų².WżOH­ŠQ5jµĒkąŅ„į°Õqämį1{õ1ķµŅ,™:²Ō:AńˆšV Ē­čŹ4Œaš6ī|6ŽąĘl½ ĶĘĘO1|É_%$ˆy¼©Żx»^±›nb¹‰†ęFņŃ|™ø8õOņ؛)˜Ŗ Üp &ƒRšuaä ­AIxėŪŽuģqKs¹ę'žxZ(f$ŪŅ2Œ&ą€“Éiƒ”#wīźæźMļ=õĢ Ū{ŽłģēæJ:²W•& ĮÖ°å8@ōž÷¼gńāÅ6oņŹ+®\¹r±žņWætß÷.[¶¬ åpēwFĮL6›mmkcę\>ĻĢŻ==†Æ8į‚Š‰‰!T·ĘP¹€\„€9ė(tܒEūģŌѳ«³ą¦~ÅpQö[*•RfZ*ÄĶFäįäߦ"]aY—ڲ±:˜öA%ŒRU^@¶Ć1>_Š(püڵ_ē»ßuŪ’°{ļÓ#ŽŌ&MFL…Ā(XéŻJ¼eź'€“@(ƒŠ ›! ”ć0óēžū ū÷¼’Į.Z¬jįĖR* vOJ ōoܼiӖĶCKŽ_"„0¢äa Į6l•ćäņy¹t'LŚCn„lj9±Vó#ŽŌ ٜļµt °ŠźØ³M€ŲøqC©Tą–¦‰Rɏ†…ŒDš}ß÷<ßóČxœ†+¹A7hm½7„”R£RōĆ &b©T&›5ēé•|`Ū=)±ķADąF—4ćÄZšD¬”LŅLÖ‹…"rŖļ ¤B„ĶŸøVkżŒFl!%»+¶Žg‹¼¶éånrLĘü[®k*˜Œųź”ŽÉó3žüE‹mټYJ Hš|ˆā Q½†åyž “*q’u, ĶÆ‚ 0gX*yĘ@Ė÷¼ūﻯ©©ÉH @Ū ³š¤čo„+DRī5ź“Ōšø{īĀłē_|įōٳ ¾g< ŖYūqąØ"¤t¤`K$&ŸŸ1c†Ex7lÜN6ƒR‚‘½O<eXW@Ęŗ&j͆’e`ŽĪŃqdØ/mp¹~øVĖQ6–_ex%@Ht$j¦öNzŗßõļoļėė­ “"©&¢BRV,K!Ā1ūĄY¦1‘¶"Ö&ˆnTt¶:Œt™Öŗ{ĀD`ŃŅÜvŅI/śųĒ>nĀ€{ž|ĻŁgŸ-¤4ŹĢū%ĻT¢ķ’… $ś¾?48œ„éYĶ%¬Zu¹–ČPK  §–ČńŹ0ÕÕ»Nˆéö›·I)ā÷›nn=YčDØ+[‘ š’čY\/-©4‹āōlJ/tÖŪ†¦ÉØ5DQ ‹tH˜ ö³ „’Bqąy"ŗnA©ģ(—Rłkˆµ¦H”ĖóŲeA“Ž.Ó÷H:6›ˆoc(! €ü@ %$”7\t³Yš%øė®»Š#‡»'vΟæQśˆ®uPuD,DƒŅÉ( XHZChŠ…(b»#“Ū“Ö(åHa“9߄ ŠE”(×Ń ‚µÖŽrN@>Ÿ € AHs,ōµ—Q›9£ „fv ¤jniŅ@Ä$ģ€¾TnXĒĀmmAšŠR”˜Ée„8ą{ä8ØT®»uóö™³ē€Š Ńš  Y! •@*gē–żżż{z:;;ūīčč§T*er³æy«„lÜĖ`š`ßįƇ§L™ņōÓĖO?ó @(<”Šu2ĻŚ¬$$Įׁƃ¼ŹĶœ5+×Ō Ā®æF)0±—!›\Õ÷8“ŽövÆÄū÷ļß·w † dT“Ź 8¤Tˆ”’D8T¼bɑR*u’}÷żéOŗāŠ+ę̙þß;iŅh±“k×.Ūn0œ€į””ÖÖV³8(%Œ„„–Ņ® œX€MŪ0­ĄśēÖ¶µµ=ųĄC›7o¾ą‚ -ZDČkÖ¬™1kęäŽIˆ(Š÷µr$1,œ7’w…"šČƏ¾ź²W)'ƒ€„¢v ls*k®$„Õ¦(ŒĮsĄĀå¬i½Ą„ (ŠV鬀=„BÖųZ@ĐDƒČE@Āöīā•9^H *Į®?ŻlĘóM'YŪYk”Īč°—ĶŗRŖ=;v½ēo›5»÷ž?’UHp@¼ęU/?vŃāę¶ÖgV®Īwtƒ@„@S …#X‚`č¶Ū~õė_’š\æ~}V9Ó§ĶžļĻįä3—™mZ((•|S5Ó¤Jfą²O.ć·>żÅ;ļüĆž”ù\®{bO.—;ķÄS†‡Š×|śSN¦Yē@*„­9""³t x£#¹|~ī¼y‡śś»:ŪĶB±H3ź“öõķ)|ēB¢S‘'-Y‘WGŻUHŗJE±kp¬²‰l €Mŗėū Ž›.ų›ž9¹ć°0xų@.— J*—Ė»xįSO>Ž=aB6“q¤b–A@Ž#Ŗ¬+C“3—J„ę–lå9 )£šĪ“[£«±š[g”aØ ‘Ņ*Ÿ™O`Ō ĢŽ@ķ®Yµ:Ÿ‘Ļ®ZåG;Wņp±Ų߯ŻEBJłL4²PLæżÅ B#¤RŖ½½żŒ³ĪÓš¤Č€DŠ…ŃbÖĶ'5)2·45mŪōü„öŽ_žüĘ]»vĶ™3gåŹ•Ÿ’Ņˆ(Ó>„IRmSghh‰Aø®°Eˆ@„ ‚“ Pk’ąĪ}wÜuūnżķīŪ–.]ŗšŲ%óē-zł+.™Œ#„)G‘f%E±PśćžŠŅŅŅ”k^¶l8®øēĪŪö³Ÿ­^½źÜsĻ=t°æ©©ķŚė¾ŻÖÖŗŚ8ŽbļƟžbĖ–M6l8|ØÆ««ėŲć–\uÕU³ēĪĖę2IŁ… ŠJ)sh‰°ņŁå·Żņ»Ÿžō§3gĢxģń§NZŗōŖ«®źzģ±Ē®øźuo{ŪŪ1!“T&Ҿ’ø}ŪÖY³fū"¹›§ĖĮꡔÉJxšĮæżšūß»õ÷·65åęĪŪØÆ««ė«_żś²eĖ$øD$„‘„²øƒŃŃŃ\Ö=ÜčŪßüĘO<±{÷ī›¶>üšß±ä®_’ü¤©“öīGŚ|P®ĮŌ@SSKŹ%”LķĪ’8„Ķ¢¬@:ą„±™¾’/}ä‘G¾ų•’éīī˜={ĪʍÆżö—¦M›¶~ĆĘ üä'?›<„¤qfĒAbO (•†‚`ø“hįßČ/g²"š|å8”‹Ei@¤3,I)&L˜ĄÖ_ŗŗŗĢ&• ]*“hŽØ9‰éI²+n ±&ݳ™!lĄ M$…4×YG ·ŻōĖßžīW~±ļńGÖøoΜYėׯæēÆ·+™Éęs[¶nŚ»}ū¤™³‰H`ÖģƒžšŠ»Žł–];Ÿ/•J­Ż]}‡,Z0§pוƻōüó/¼ęš’ž¹`PLU³öŃ}ū·_wķWoūĆo„”ä0 =4B{ö ļÜŗfćó;›;äĒ®ł“TÓć05ttPk’R暚(„擵µ¹®š<€ž~knh.uH„€ł¶Ūn‹ö^"(‹CƒƒMMM™l–Č"RŻE11 U¤,W•«@§øßœfÅ­‘P"٘EˆqęĢ„aG„ž1±j8µ…œ€ŁcłŹW§ ™@ÅTĒ_,ƒ‘t&‚(+Ž"ŪøŠ Ee k7Ü;®Īgd.SŁ3K¦pG©M²0¢T3‰‘®ģ'7½NşµŒ NĮP<’ŗŖõU£k‘GĻ“ĶĪź~xćt ©ĢžĘ3•IP„‚ŒRā²ś  ørģ=żō“ĖĪ9'ŒMQł\S×f:½ęį%MÕN÷øęĻ‘M­øs[Ćī"}95z¹UÓŚpżćŌādŹQ©U£Žv|Õéc1ūėz" Ē‘„I°P” dåļ³#hĶ|öŁ5™L¦³³“}=¹·Ż‘¾c„-Å@X-”GĦ°§Ńŗ]pž—¾~}WW׌īīŒrL¬°eóžo|㯺üĀs/ø9c:ułŠĮ|’G’ŌÕÅ"lZ·nęĢ™Āćl•ŗ4źI)•Įpż(@ų°aĆf\µjĶĖĪ^*$ C Q)hV‰EŌģ żĶo]+…ŌZKguÖu×]GZ£Ø2«Så·-[¶”Įœ¢ūXć‰p.Ÿ75I)!‡°žŁĖ—/Ÿ8¹§££cžÜŁż8Žćū~®)‚2l}&@Ą ŅąwæłĶI“&™DbŁ9ēdœé”S@Š€ m™D@‰šÜ³«öīŪłÅ/~±„µuŹ”)·l>ūģ³_vĮE§œrŠĮ›I!£ƒJ逐@Zß}÷Ż÷ß’w®’öÉ'ŸtąĄ¾¶¶¶„K—žpĀ —^zéģŁó£č)0Ķ0‘ĖeJ„āįĆ}Ķ-MŽ«€HSš1ÅĪ0䍢Ø$e±ę*Äh: &NŗśźOš4iĻŽżżżæżķļæųÅ’¾į†Ÿ?üĒ&Nź”4ŠJÄ«xA”P(œuęéŽć8°o÷fĪģļļļźéģķķ>|øÆmFG”ągŻ ĘŲӀB×q¢2mģ»cŅ (×ä'4 _É"IŸ‹ŗ †‘žÉd˜IČØƒ øsӖŪoūŻM7ż²­½iķŚµóēĻ'¢,ś¹œŪ;yĘ”ż}!0*kıI°8ømļ[ŽüĘæ’żoœwöŠŠŠ”żöļßßŌŅń™Ļü÷y]¶g÷lKnŹäiO­\č*£hĒŽ×\sĶŽ];Ī~ÉŁĖĪ]¶kūöW¾ņåCĆżsęĢéė?“eŪęu6mݲó?žóż'œp $ 4ųž7::zʙ§lٲeį¢ZküąC­ZūģŸī¾ćmļxē;Žń`ó*i\—q’®Żļ’Ļ÷<ųąƒ--Ķ„b‘fϚ:\čæõæéėėß°~sŃ/¾ķmo5ŚāØ·nŻŗ9sŽiiĶė€'tõd³ŁĮĮ”§ž\ŃŚŅ¹hįümŪväół\.ęó9‘ ƒžP󳓟üŲwŽéH1uņ„SN=uÕŖUūīķźéüʵ_xč‘ū®¹ę ¹\ʤˆ¾ÆGQ>Ÿ’ż­æ¹ńĘ7nZæoß¾ Ī;’¬³Ļ ¢{ī¹§½«õ¼ –9NfxxB–©Ł”„D­YJ”K„’ßŖČ­Ō‘%C0āŽ[_ūŖ×ō÷ĢēóóēĻ™;wīŠČąKĪ>cĀ„ [·ģč螰błźæÜ{ļ‹N?Ż|Ź_žt”’ŁžłēŸ\ł h8xšąŽö¶·yę™#C£K–,ٶuǤI“¶oßł®w½ÓĢSė+ŽŃ…:šÜsĻ!  5:thdp0“kRŽcvĪDė=½i¤ąµZD;rrى ÕŁ4ąĀŖ„5ŠLQ³ź§×_’Õ/}¶»§½„Õ}ó[^÷üćo~ÓĀ… śćŸ­[µ&‚މ]ĶM9šIøŹØµ?ł‡~śĆļv“ä7Žöϟ?’„Ÿń„/edxųĆžšé§žz襎·æõõ?žŃ ³§2ŽQ36ižHéļ}ßC÷ż¹­½iŅäž3—½ąŲćŪŚŚ”ė¬Y³fŪ¦Mz6 ‚Ģ2+ ™Ņ¢¤°Čøfwžą?ųµÆ}€šį‡~ÉK^āūė*s„RL„‚™7ēoż-ŗŸ .lim5·R Š~ •DĢa$ˆ˜$Uģņ”S¢„‘ŽŌ° ; Ē¢,ƒ1›žRh)1iH=v°Nu•…E3ø“uČUŚtÉP±˜1T,ĆcctnÉFQYÄU‰Æ &œēÉ7'A²&•jP[ŻĒDp4ÜĖ ŖŗćĶbĘ ļ“—Ķf£ćšdµĮŒt\Y)_Ļ”_$L“²¼×-­Zģ _™Š'U„ź¶L!,¦2-{é9!³™YŃM­8|䓟h׏šÆ‘5k¤rVé'Ę©vn-čƒ7§~Z[é«VgœUæĖތfiCf»³šģ7)ØkśB¾ļg³®Ö,: ˜…øėŽo»żĻO­x~ļŽƒ‡śśZŪŚĪ=’Åļ~Ē›–-;Īt‘$ 8<ČĒž²“„„åūßžśĖ^vڧ>ūĶ{X»ļ’³wļŽoüׇ®ŗź’’æśÕmŸžüwąłĶ‡fĢ?yĘģN”(™įµożĄž}Ćæśė§M›¶öéå*ąR°’Ŗ×^śõk?Æ\'ė:%M2\K…Āׄ@žpģāū^•ÉfwķŽM „ 0h)1§@Ė(fFDĻó“fAD·ß~»ŁM™«ŌMR¬··—™ ļŻ»—ŒĪsm„YĮR %é‘}»ßū¾ß“yķ“iÓ†÷ļß?eBĻ‚ Ą×ģCƒ£Ņö0( ģūĢē>»o×īRqxćʍł|¾„„åē?ž¼déÉ’ńŽ÷f[Ś€Œōy™„`šõß’zĻ?wuax`hh ­­­¹½ķƒļūõ¤žYĒ/=į»?ü‘Čd@(ąrŸÕ2Ģ}¢ –ā̌6 Š»ßóļ›6mZvÖŁ/9ė,&Ś“iÓėßōŚ\.W*wnŪöīw¼}žüł’ū“Ÿ6··GcLJd"Š4ŲųŠ+^­ܱcĒŌiSV®Z¾c×>„ä“O?õӟž“«³Ńj_ Ń£łŻļnžĄ>000pŹ)§s̬¾¾/=÷%¹\ī÷æ’żŹUO’ö·æłĒ?ž)„(CL0JčΚ>s Ææ©©©«sB C@Ą „ M>°A|WŌź1Õt­żR©p÷=w“““ ō;޳hŃ1?ü¦–üHa°GŌ®(j?JŻrĖ-’ūæßļėŪ/„p\yģ’Łł\»ćŠö®ö½ūvēņłµkŸ›1}v6›Įd‚B %$sBu,¼"BFĶ «šGlXŃ3fPŹ%!kk^ā]Ēłßļ}wĒÖõŚ)»zšö÷ļTJMķléčīöƒ‚Ö>HTĄˆØ)J.’ū?®’Öµ(\vį™;ķ$¢®ŽÖ®ŽV'æśłü۟?zõ§ęœp¼Ģ©źļļüĆm_łāēņM™ŽiK}äšÜqĒҦ“wxž·aķź 0¬\0 „(]f  ¤Tn0Żéa&D!$f2ŽÖ\*•„p„‚UĖWö³Ÿ}võ³2#Yo|Ė›§ööf³ŁŸŽųóM˜> \wØ8’Ķ€."J%zz&H…'.=!›S›7Æ’ōg?O;ćÅ^xį¹žwļ½÷Nž6IŗN¦Iƒb^åX)ÅĢ’ēß¾’żļ÷LžŲŽÕ1cŚŌ‹.ŗØPٰaĆņåĖ…æżŻMÆ~õ«;:;‘eņé,ģńwæūŻķå@Ϝ9żÕÆ~õō™ÓöīŻĖ W¬X±žłMÓf̘>}AßāķwüīĖ_žņččč®]»ęĢŃŽŽŽ5”żĄĀ’|éæ÷ķ=8:2ŅŪŪūĢ“OMž<Ł+ŃOśÓ3–il„ŃĀ·¾õõ|ļŗöööłóēæļ}’~åėŽ8::śŲ_żõ#£+V.ß²eĖ¢E „­Ł‘’ öīŁõµÆ}m÷īŻ‹ĻoooŪ;ß±dɒę\ž'?łÉ;Žż¶ 6d³łSN^"¤”f„D¤±l6¦L&“,ļV ńLĘ €?yõǚó™ ė÷L™2åK_żŅāŋ;{:šššV<ūģ½÷ŽūČ#’<į¤EĒ,˜möAßó¾ņ•/>æq].+{{{!ėĢ›?ctxōžūīģxü±‡$āi§žłąƒnݺ畯¾ģ]’žv³MD+†éAI)„fž?>Ī`kG{S[kąéDU®ja±ŗ×KLK+Óć²lš¤rŒõķ’ܧ>qžĖĪYńģ“žą'Ļ»š‚«Žü®–ÖNįŗē»sõņUŻ&äs¹ĀšHskčĢ„Ūļøu’އņ‰§ž|ķußrZ'3Pįw·üāSŸł˜R<<\}õ‡÷‡?ƒV$ŠčP(’ćĮµ+mk§½hį¹—\üŅ—]ŲŌ>Įœōł]ä>’üó%/”Ņ|Ķ…H‘=DBˆ¹³g™B üĻ’|ßņ•+IÄ!8Č@Ö’÷G?ŗé¦_ % @€7æłĶ¦Ģd@pR©ä&nšia #ÄieĪŖJ`2ūŔ'yµŲÆr³Ø0kͤ’]%ÄōcNÕÖCł}(g•%ŪIÖVćJKé<+ŚÅĆ”܃‰ū'Pcœ4‡źGœmY<Ÿ|õ 5ÉĄÓ«ÄCHP|_ !”ZóčhĮxū·o×ø„KōąLĮZk]Gc¬²(0&Č“ÖķüMƼĆ/`RÖČŻhhĢæp²ŹI €9\C]āTļ4•`¤:ɍ·@_ĄK:²Vė ±q ĮńԊ’÷Óą@RU:`’²3ŒAYÖ¤Aˆ8‰³Ņ!¤D!\+\‰Ū¶ī=gŁ…}}Et‰śš½®“Łõʍ«ūś4ŗÓfū‘O\’ßÜŲ=kŃīƒż‡‡ ×|ö.ŗō’Æ}ł;ßłĪwŠ…‘É3gŽū·ūŽ?néīė[s9ķC”PxüÉ?īkžtÖąįĮƒ·°d…ČØ.Ō@: ”õ‡š}&¢”ĮĀĶæ½„Xą…K^tššhĄrś”é+V¬^µjßČįūģīīéģīī^ńŌ“S§N=眳1š<ævÕ-·žĮ”ŽICKK‹Ižćõ½ö ™9sftēĻ9ē1&W„A Æō?ŸżĢ³O=¾oßīL“p\(–†&Mī8pš¹µ+…”---Ū¶ķ2ó‹X£üĄ_žś¹’śtgkSs6G¤_łŹW¬Xłģż}{VÆ}źé•¾ē/ĒŅ×¾õT,½RÉĶgl~ėŃ/nųŃußųčŃI“&µ¶u:Žsń„Æø÷Ž{GGGŸzś±‘‘ĮfŁ‚nŠH‚U.ŠéZ J“C‡€‡‡žyꙎŽŽį‘ĮŃŃ”7½ž ÷ÜsϼÅó–,9¶gB÷–ē7®xzłŗõkƼņ5wŻuf—`>ū™’śń~pź©§:Žliiŗź Æ?餓>ł™OOšÜóäSO-\øšĀ /üłæ6‡6“­õÆ~õ«_żś†ÅKś%æ»»ėUÆŗ|ž‚9Ļo\Æ»źŠŁ³Ž¹õ–? )-S”­õé/:„P(̚;ēī»’rĀIĒēr¹-›7-=įųÉ'8p`ļīŻ/~ń‹7mÜÜÜÜ~üŅ„?ųĮb_͊µÆźrG ¤ •(eGWūW¾ö•””!Ē‘S¦L¹ńĘŸ~śé¢ēgr®Æ)+AfaČO?õÄ5×||īܹķķķ’żß’}ęK^¼’žÉSg<óĢ3?žéÜƒŽėŗ{÷īŃ˜ę¹iRG ƒÉ’µ e4ƒ”+9#‹£ų£lDDį™čy¾ė:¦)ˆn.óŸoyÓ¦MėķµģĢY‹yĻ?`ķŚĒ’łÅĻ~.—o+īķ›:u*hF€…”Ł;~sĖĻ~šķlNMš6qɒ%ļśš‡„ćpßĮƒŸ’ųÕ+W®|vÕņO]}Ķ­¹×+ś®«Ą˜|ģŻ³ó=ļ|ŪšąžÉSz¦NŸś_’õ_ĶŻ]“>ś©OƒÖŽąįßüę7ϬX58Šß9i" Ń 7XȂ0I^'kŽ,Ā6#XÓr!…Č ƒƒ£W¾įŠžžžę®ę3ϽņŪßžf{[» —¾źµšż~÷īŻ™¦ X īŽ»;Y©|ū;Žzh ļ¢‹.śšG?Ņ=”{Ø0ōo_7uźŌ”Ńį€uĄ… źG~äŖ7¼”P(,X8÷;ßłĪi§Ÿ K€ųēæžåµÆ}-¢<żōÓ×®]'™5€ĮĮįo\÷ •QsŽ™łå—æļĆļ"d2üŃё{ūŪVÆZ×ÖŃ”™Lī±q㦠ŗW­Zuī¹ēmܲnӖĶĒØcåʍ›ÖÆŪ4mjļ†õ›ŪZ„ėt·¶›Õ5!ā­·žīī{ž“xńā;v\żõĒ,Xiniæģ导ģ寜2mŅŠpń£ūŲĶ7ßÜŚŅ,%q£żūö~čC*z„L.ūŖW_łīw½ŪČ sĄ Ōŗ^ņŠ'žŽŁ9įéåĻ@É÷'cö  0$üŖVå0Ń՟ųĞ]»GFG^|ę™ß’ž÷§Ī˜‰Bh.!āI'²aćʛ~ó›żūś÷÷3ÄŚqĉ/ZZ,ökōE'ŸšōskwīÜå•Jķ-'|¢ēy˟zśŲcuv¶?ņČćǬŃeĀ©EыĻ<Ćŗž xņÉ'ĄČ‰ aÓūtD¦ ,®Mr0™(qČ Õģ1›É&RB™†”¢8|ųĀóĻZ°pV>ŸłŚµß<÷ņĖ@³08M¦‰gĶµ`÷Īm‡“47³¹ÜņŪ›~ėÆ_rĘ©ˆxŻ~ˆnŽČADÄ`źŒéßžīõ’ūżģŪżĄŽ];ōĆļ¾ėżˆ@)ž’ȃ÷;™om?éŌ“.¼ōR'×lK†Gćäņó+]ȓR…j@ą{¾§DFŁĘÆ@„b±xłĖ/ū?!с8r™l2ēŠézķŚµo|ćŪŪ;o¾łę|¾åąmmm)ä¹Ģ @Kbu·*qŃ 7–Õ=kÅn‰ØĖŪ„i·XDZČv+ ½!4ʃrķōˆU'!LPcžKXƒXu ‹A×Õv$­)ÜĖļĘ%N–\„HTjņ’„ķ.Ø”M›P®RŌ`FRĄČ­@JlnnJ¶Ż¹Ų”Nj~!” ‘²OD'®ŖøTµuWŁ?«“¢7ŅīĘ„«æ9ÕķÆu‹Ņc>­ˆy$ łä&!8&pŗņNi­£e}¼-õśCźčgWƒŒö:E—2bNWĘģīŽ É³óÜźĄäĄZ“t„©Ä'A.{¶q;Ņų“ŸŽŗ’@vMžüš«Ī½ņŹ+Ż\ėi§ž]@±š“s‚lÓ7śĄ‡ŽõRą1hŁ~ģ)ŒŒ\ż…o?õŌcg½ģŒnųĮ±']2oĮRą_ž¾ćWæ’c{wσÜ÷я~ō޾b¶¹ŁUbP œ\ī¹zķŚµEj>ķEēžāæėļļßæwӞƄuGŌVœ €P)Ÿ]±õ”“ĻĢåŚG†½)så:zܦ¶¢Ęė·_zÉ[ż‘‘Ö|ӁCūd†Ćo}Ū•/}éY¬”ųĪw¾ Ik~Ķ«_K>"ŒiĪ6wī\D4c›7ondĄwžęĪ{ž ž·×½żC’ØtóWŚ»yóē’ėS£…”ĮĮĮy‹š•@<ūōć?üŃ73-“u’¦ |źÓŸ]rĀ) ƒųū_ī¾ēĪ?ŽīĒÖ5…‘=łĪn@t•dX½ē=oŽ“aĶģy…#>÷¹ĻõLžŅÖŚ‰‚_ż†+W<õL±čļ‡?(x£ĶN{e  kyĶH„ ąR©tÜIĒg³Ł9óęüüē7l޶٧ąsŸūüå—]Ą[6<ÅWŒŒŒģŁæėłMYøH„~e7’ö×÷’ķž =]O=óä'>qĶ{ŽóéŗĄ|ē]w?üšĆė7lZ·n݆ ęĶ›GDJ)"-īüÓ]Åāh©TŗšĀK>’¹Ļ01]xįĢŌ×××ŁŁłö·ż»Ģbh°oŅä®ĮĮĮēÖ­¼ų’—īܳŪó©¹-³}ūöĆż{żBŃóüµĻ-onnŁ»oŪģ‘i “Iš’Ķšś“Wš}?Dā „äk_ū:ß÷„ƒÄ÷~š}_Aär9! Ø^C¹’¾æ~ó›ßܹkߋN=łWä‚ .$Ņ'O/{Łų”æüå/]&tu·›$–XĪLöóĖĪ:š§‰ɞƒ@c?j”Õ˜Įš’ ;Xź[¹źńY³fķŲ½ėoǜ… ›ß÷ņŅy ļ|ž¹5ŚWƒ‡†ĄóĮÄzōŃ‡ļŁ¼kMGGĒł—’ŪŪ’ćżY:utMśś÷æył%—ذrżc7žąo}ēk‚ż¢Üæćł§Ÿųū±Kę!Ņ՟¼fśüE¤‡šZ:Žüī÷_9<œÉd‘53Ö VXķ]bĶ,•!™…Ą4ż ŗA( ą’x’»×mXNJ®øā5×\sRJƒ$ĶFÄ÷’ūū<ĻS, )‰Øµµµwś“ŃŃ”gV= o|Ć›æš…/ TœĶ5MŸ9kāÄīuÖg›2-¹£@­õ}÷ŻwÜ KVÆ^=÷˜ł§žöbĖ(•øš‚K’ė3Ÿ𔿭]³žī{ī¹ųāĖ„°ČüĒlŌ/ų“vu¼ō‚óIƒ€Fą@ūƒĆū÷ķķķõķ“}śnŗé&Č“86ŲĆfn{{nžü„«Ÿ\[j)­\ń VRĄp’ĄŗĖśŪ}ƒƒĆgwĪo|—“ėP(i‹ÅR6ŸCФĄ¤/;׉*Ęt”½„uFļä;÷Ų ^)Ćč6Ļ_ū$•b ˆhŚō™÷Ž{æ›É˜¤·««ĖtˆÉJfŒ½”Rkm ŌI{0,×Ģ€”KÄqƒdŁ"Q‘Š|"ł|±fÄX+ūŖ·Å”±“āŽ®Ż¦)Ź©ĆT–tŠź9–’M <6–łÕ'Ń’&ˆL† ”„_¼ńŒ |żWwS dUS»Ŗ3ŗvW+OŲ4ÖkY xøĪ;£Fc#X¶ŌoĒ|@•z×SÕD*ÅBo>ÜHĖŗ–GI-ĘuśOBIŗĀćČ䨢K6‰±ļūŖØz2ä2£$e\ ä]UPŖNqā…õ®SŁJi]DS(SE’Ģć¼Ėõ=ø’ø…H»»~ž\yt™ö<Ļ«ņØuE5ūŹǟpĘŹÕ«sł¶c/łē?’$x~ 5zxów®»åcūD¦µå[;ž?ć„ĪN8A9°kēžµ«×d³Ł¾=¬‡īŗł"ż™¼ć£łüœ'æįožŠ¶×¶5‚į“ŸųĻ»xØļąīūī^~åe/B'’>ż±-$ šĄ’̹-—]ü*ä²hĀ€v˜aņ”žÉ“{FFżcĶóYķŪ·g8RagwϾM›fL›2pØoĀ„ ūvīŠwģŲ> næż1`€Ł³gŪŖs ÆŌ­.‹¶ ,*LYŅ›aĶz…o}óėm-łl6{ćĻ1÷ų„fN¦wžĀó/øäĮīŚŗuóĮ¾Cv+b­Æūś7¶mŁzöŁgwĀńoü··3ŗ¾f%óĖĪæōœ—^ōŗ+ÆśÄŽ·{gß'?ö©ė~x9QˆožåOž|ģ‘3ŗ}oōMoś·…K—€ēk×QŻŁs/¹Ą¹äÕW( °¶Õ{<#840š”Ž)łęܶmŪvļŽ‘UNgGĒŗukēĢY €ĮōŁ³æło’ę7æ¹ēž{ŽūŸļ’ó_ī˜';¶o?<Šß;­÷[×gŁŁē !X3årł—ĮŽŻ{ÆæžśE _’ė>÷ß_čźź"`bxtō÷·Ž:įŒŃŃŃO~ņ“Ģb %ŻöŽn@'—›9Ä^{{ū_2aĀ„IS& üā¦_:޳k×®[o»mĒŽ ęӜoq]÷‘G- —æāĔ F…¢>u÷'¢Pœ)ņĄdį:Y >€˜>}ęüł oæóĪm;w׎Ug]ų˽=tøļ o|ķ¹ēž{ś‹Ļb(¤6”!³¹¦ćŽ_ŗpįĀɓ§:PR™õF`…Ž )%I³‘„IÖ5£¢~ōOsŚ LZ'n!TˆaP2łoyĖUövīŚž„kævÜ©' FM®BŠ#ūūw åĻ9¦·8: N” ­¾óīß’ę÷'ŸqRG÷„·æēż@ĀōGP&v²mśóŸŗęšĒžēcņļm™2|v”;zp’Ļ~ōĆ©“&d\÷¼ /˜}ĢB‰ĀD"jniš)ŪŽ$Yk”½Ń’›Ė„*th™¶SnŠˆ24`£[ 7ßtӆõkĪ8󤾾¾×]łŖŒćp˜-}m-Ÿ\×50Z+%ÄÖ­[GFF¦L™ģ…‰'~ņ“ŸDT˜·nٲkūīŪ·Ķ?fžŠ\,s™f"ŗį†n½õV顛ŽņĘÆ~łZC芤m±ań’%7’ę–Å‹ļŪ·O¤õÖĶ›æü•/l޵©³³óg7ž¤„¹ŻBżA0³µļĮ‰'®\ł¬51iŅL"źžŠŚ=aŠ”.¹ä²ž¾Y³fM왦 ŪŪd÷„ÉĘ; £X !„>žņW?_·ażöķŪßśÖ·^uÕ[˜QŖhīk<łä-_ž¬tœM›¶,\øŠ¤7ƒ?łÉOššš&Mō®wæ;“Ļ0pZ4¹īŒsöī;xę™ĖˆĄqdhsž¦zžÉŗĄP-f2“ b(7M± ,¤üĘ×¾ņģ³Ļžū²sæ÷ƒžzś©‘€hŅBČgžy¦„µ¹©9ßų ‚&°āFM-mˆ Ģ#…C‡){{{[šZ4ėŒ“#ŅĄQzH&Ģ:8-¹l°*¶ośŽ˜H±0Ķ»“,ĶEˆh2Z…Bc•ńŠ-r/“Ń`䬉V<łōęĶ›'Ožųé’śœŹ“'«Aˆ„€“§ō.\tģĄąĮ¶Ī.-”ŅB’CÓ§O&L™īkŃß?ŠŻ9‰@ ĄYvι·żś×ˆ°mė&š‹č6³OĶē£yoFł^0øpéül{ “`BĮ,$2A6—aMB(` ߎƒ ¬5* IŪŽe&—R]pįwv"ō:Z ēr9iČĘJ20 …@¾ēEŗBJŹu’‹¶Ģ€ć]ÄWAäU “£zGUĮZ«"‘Ź'ƘP3UfJušx•-ĮH]9܋ķYE~~©ņ§DY ŅX/iįŹRo5‰ÖDmī(67NŻ >‚NUõ·F`āĘPÆ3nF!tčQ*•r¹Ü˜§T§e=ā”ŅPćČdؑ­U¦9‘ŠI2 iŽ['C©„CDD¦-Q9Šp<؄ŖC½‘\©ŚiUŽT³żÜm+“¬ŲŠ˜åØśW^õģ#ØŌ+‡ŗé{>ž¤ UoSżÜ»fq%YŒ°:Ė\ė™5’Ų'«>•ē¹ĀŒćb / ĮōRĢāVā˵¦ĆäĪqaøEOv÷,ÉēóŸøśóF|0ė(`ą÷¼ļŠŪļ¹gĻžŅöķŪ|č¹N:6m{^¹Å©Ó&¶4å~ņ½ßgå’9S1|h`[K§øžŚo€ą“7Oš1g`` š}–@H!ČټŹ7 %§Mėւ$€a“jŃ ÷Lhy晿õõl|~GēԹ߼ī'w?šdŽĮ×^qŁ;ßüWw¶e³YEžæļ¾žž³p1ĮÖ-;:Żü}čC(Dœ6õ°:ƒj`` zŹ---cŹcųƒĆ_łāē¹PČ“¶¾žuWĶ=n ˆ ‚ķ“@ąß~ŪŚ=kڬĪ\°AĄüōc>łč?{'õčįĀÆ|#°‹ ””¤Ō'œrRׄÖęę)ż‡v–f¢bēöęž}ż×]wݱ§žĪܬŃq…Fó&BĖjŚH¤$°°yH*XVč‡p’@&“Łæ’œY³ūßzĖoēĢ0 Tī”ŽŽßŽrˤI“4;wīœ1c†©§^’ļ !/9īœ—ž‡ą˜~ŽĄ›ßņ–Æ~õ«£££<ņČłēŸł+^aĪ`dtč’Ė/ݳkkssėŗõĻ»NžŠ¾3Ļ<]É K!TŅ"ąūŽūQ Ōś÷w޾sēĪ»÷Ģ9fŽÉ§œī‚‹ ˆčŖ«ęŽ¶ō” `*² aꔑ’‘ĢĄ„¢W*zMŁę‰ŗ5i)dŠ”½V­Z…ˆ™LęuÆ{]6“31‡ ÉĒŁl¾³sĀŹ•«g̘e&*[e(/ß÷3– J‰Zä‘H}Fkm7īŲ±cdddxhŌ|GåL±É¤øŒŒR°-‘ų;wīÜ»wÆRźøćŽ`ļ“F@f(ŚŚZ¶mŪŅ7XX¹zÕ+.æĢōŽ[ZZ …‘uėÖ]łś×¶“65udFa0łÜÖŃŁ9”;ćfK„’a ‘¢T*e³„¤9L&#•·ĖŌX%¢ŃŃį֖VX½zõüłóūūēĪ‡ A˜j…Š:Ū'ę3{š²mÓzgHaŠ÷ցĮb±Ä-]ķŽŪ@ĢC“4ōQŁ3ģ7h£µhÖ­[M:)„ēyEƔÉd\7S%ˆ•ź°"„Ąź±GB;Ēj>EŠÓ́0n9Ą°yķs»wģž1uö„‰š»§‚t„DÉhū¶-»÷ķ.…ƇLƟp’ī½Cżr:¾öUÆ‘(ŪŚŚĄ÷P—µ‹‚Łś¢½č®»īŹ57oznŜ%§”D(–&vMģß7{ęģÓO@…‘ŠbB@ˆB°Éä"3h „DcޓԷDkŚŪŪM±^y„’11R1ę34 Bī‰Š£Ifą¢isÕī™~C܈}ŅęʈÕ3If`ƒg™&D Bj°8f8l`phėŽ™OV‰™¹ŚV“+U»1śėĢą{^&ėšßšņ+ÖČO«v)’%āD¢\L'.‰V†ńf"YbV ø[Õ ©‘µ‘ B2wM=Ł1OrĢ{^©=©uB]EėńR‹ėCÜėä±õ3ä*w>2*Ļ ÖlA']<*#¹(‚ j$•R" •łœ×hUał«VJŁ =½źälü‰¦øęvÉ4_ĘXǘœje·yĮüę@€šĻ•[8ŪŅŚ’_0īĖ/?Ļ$÷ķźé=<ą4KPEvH ŒŠÕžĶė•?:\¼’ŃG€b –‚’¹ŁR@OwǼ¹3/¹ų%K—L޾eŻ‚¹³ķŪ}ņ± fNĖ̘ŅÕŽŌäH7—ÉϚ9'Ÿm±»­ Ćżū8Dń¤ÉS eĘvż|B› ³3nŪ¶k›Ī›×c?ōČ?jėœčd[®xū;@ø“).ył+F•Éõ īŌĢČ ī¾ż·W^ńŠyŹō™ŠÜiĄ¢$mūĮ™¹ą²Ėö Œ–¼Ļ}üj ĀąśĆÆ'Nš0㘹óO8 3mˆ @‰@£…,†ƒ”6D÷Äü­¹13fŠv€lĶ7Ų·oŽÜ¹^±xͧ>9kĪ"† ”Ј@Ģ™3wį¢EnÖÕ¬7l\Æ9ä;īŗ}Śō)S¦Nœ1m:` ķ”łŗįæ~ā©Ē7mٲzķ*mB”™3¦½į ƛ9söĢ™³?łÉ« őƒ}@€v˜WŠ"@AĄ€ä‚vŒqˆī®žŪvv¶tß59UƦFÓ6W­”ņ<Ļ÷}ß÷ėØVŅ…ĢĮimkłē£xŗŌ7ŠB’]BEÄh2÷”C6nÜØ”:õŌÓ²™œ¹’B(Į °T*õ÷÷¹\ĘģOÖ¾ž(žœŠ ²č•PB&ē2sä“<į ū›8ÖG×ĶT@ĘYY30•cĘ  zäŽæŗčõΘ6¹wŠ“kbp4 H4‡Ķäg\ŁŅŁP \ōŸ[µ¾wŅōŁ³ēžś¢ÓAH@‰ ¬‰X !ē;Ś.¾ąÜīĪÖ%‹}įs_,Œō)åa&»ėąš3OÆ:°æŹäY€YTM¬!ōu]—&d3VŃ'„)y^ŃG@ÖĄQ Aō˜f‘Ńįn»ķ–uėÖu“w/;ū<Ņ€DAŽ=4ƃ%ĮEo3]xŽŽp„RīÜ9 – @F  ,•Č(¼ōüĖ/}õYg¾“„¹ÓQ@"Ö<·ŅĶŹ)S&}ó›×~ź£}ŁŁgŸzāń§tĀ[_’Ę×½ź5ÆyÅ+ß|ÕfĪč=tpßĄŠ  dR¹mžWœ2yÖMæž½#ó¦łAFcķ&=8<ÜŅÖvģ’ć„Ļ"0µ; F€\SH±sß®“N;™±²EĢˆģ@ˆķ;4ų׿žõ˜łó.^ō·’>cź”eg¼8‹xŹāÅ3zŗ;ņMÓ&N¼łWæ:ńųćOŠŃÕ¦5"8`# @ČäÜ'W<5ufļį”QŸƒ`«Ö§Ķr·nåj¤°÷ž…s*įH£vÖ>P ł0°õ“ꀰ1"10<·f­±”­mĶnÖimiĶ8.!óąąQøk EzH³1ūŃĢÄÉ`×vįĢTŗ¶¹Źl ‘Ķ"®€E`ö! ~ł«„ŽR@ Ȉiø ŃŃ=ap调A)ۜxūīļé™T*ł›·l38–J™Ęرžkjk+”Č šą”v$`ąõÜŗéy H~0uŚtf”Č % `zpįŗ? €ĀšłIk0Īē €. -] 4A±TR•@¤Ą%ß^5 ö³C1 a†y@Ś×Å7š: ‡ņéh£ˆ¤”2X£i@)r„‰m‚öSq‹ā=£2ÅĘ ­5Gė23'Æ+Zę ~”Rń¬3Ϝ1cʛŽō&iQ„I Ķ{“Ö3f̘·P³éƒ aB_&œEۚŪ:Z;€°³½ A ­¹Qš²h69ŽƒˆµDė®uD<ųąƒ;vģčķķ4i2ˆŠ=/E-ūńÜŌŌ4000wīÜŌ²õ†Ūwlßŗ£ļąa`–(0“»„„=ŒÖšŁØõZ§U“DXĻIŽ9i!;Ž‹££A#6uDÉąŠa)„RĪqĒO(¤’ˆˆA*`ߛ5kĪĮƒ‡}ō1!$H³„éÖjæŠ?xxī± ˜Šxǘė"­: ÜĀh‰4ģß³rO·£€żPüż”‡¦O™źŠsēĪ5ź½…D!…,<ķ[30V“BŪe@&hŹg]×1Hr³—ILQW¤l=>pą@>Ÿ?ćÅgIé0#jbPB–O=°¹4‚ļėBŃŪ»߄žīĮį” Æ;¤I„̳ؼeÓ KoooßŗuėŽµqŪņ’īė;“uļŽ’üē_Ÿ}ö±æżķžG¾?ērąų€@Ą_žź—/Y|šąž‰=“ĶŠ!b֚üå+žŽ¶mŪ³Ļ>»~żzfV(ŚpЌ“įĮ~ø½µĆUĻó£s³Ū©« ‚Ź9ž.nŚśüżūĖ„I­m¹Ž_Ų֚ķénĖēpś“ī‡śėP’¾Bq°ļš^B”%pwWĒÜYs\éĢsŒ)P‘yź6¦®ŽĪöÖ¶l6»_€ŠdEn "¼³īõ”Ž7Įt_™Ł÷żŽŽŽ7½éMRČd#Īü€ū•>śČ–-›l ,ōœ59󩧞ŅŌ”kooݳwWčGŌŌ0}n°ź÷‰=‚™QDAĆöķŪ‘‘P­¹¹¹96AµĄA …D 5!²q]’9YnK˜–cµĄ‘”ńv˜;wīŚukvķŁ9kĪL‰ HØP"1 €Ė£Å‘Ł3f÷÷fMŽŠ ¾B“æcĒ–żūw—¼˜Ś7: d{!ųŗ£„õąž­Ķ- õ õLšØµŽ½{·.¤É†Ķ,9`æä!XogDČå2B³A HH Ęy˜ʌņ=ļ+_ūš €––¼ēyŒ ™”ėGŁ :t0ņ=/šSW9ŽTeźYI:·I™D’dea[DÖ“m:ł(@)…”¼ōÜę9P\ȈF¬”Ņu]RmĖā.G)'‰l\¹ŃČȲu«ā{‚_›Ļ4?Į(ŲNųĄu]!CöŸ3&gēÖE9”-rdØą:ęæĘLóRń¶)§1”“~#·jŸJLā»W‘bU‚˜ČJ)põ|¤–Nć7Ŗq&sƒ·=‰ś&"C[įĘfŌ~e¼µ>'Zō*­^Øs4#P„&CC?6Ķ8”“„#æČ“\ķ!~4ęc涜1'L-}¹TÕ'z[TŁJs×еŹ6R)RēüŽšÖl[ē—dĪĶßüĖ›ośÕ7Fh*:B: J„R[ĒĢ”av'õ¶“vtµ²# Ų}šqqŹŌžW¾žµANČ  )mn’Ī­wżåē†ŌWpœL’ĄŌé3 %­$"1 !}ßs\ ‚Ö¶Ž Ļoņ5Ļ[øhŒqŠĘ¤¶nŻŚŚÜ<ļÄ—.]jö)C†Ń¤JŅŒŅŽmŪ¶E•)“ׄ8ŪõŲÜÜLDꯃƒƒęv×ѝ~ü‘‡W®\ŃŪŪ{å•W2 }Ųd2Zģ߳߾}‹-:÷„/;+V¬hnn>gѱĒ< +Ä0²7¹ aK{G__>—¹ļŽ»?/PėŸßųĖ={öp‰oxĖ[AHaų¢NÕJcpSŽb+>œ(Ĉ09 £õ»qšššpWW׏üć7æńM®t*f"0ĄF #ėׯ’Ģg?IĄB”`žpęģY2*Dų±a×Z)ÕŅŅāūžŌ©S¤pLŸ&ćä.\xūn»÷Ž{oøįē»vķŲøį¹G~äO·ßšooyė;ßłN°tGBĶĄ‚‚(( JČ”Į9sęXŸ^֔ėĄfD”ø×Ć#q Dƒˆ„RéUÆzÕ­·ŽŗfĶĒq18”6C$SĻoŚ8Į‚+V̚=;“>E4°ÆäŒŒ.]zāĮƒ²Ł¬@ck'ˆHIĮV) ‡¤éĮ¢2uūølŸZ”‚@›SV®ō<Ļu]Ć Ė65Ö P# ©0£@&ڳgW.Ū“wĻĮ‹_󺀄F°ĄP96lģģš(dĘÉf@ %•SmmĶJ)ŁŅth÷”Ž©Ķfü3[:. P™\ėž½&Mžą(!%¢ żW\tѝ£}^±444ˆÖģ€˜3Źaf́@#•t·ėMƒĪ”Ā`āĀPz~į…?óĢ3ڧ}{÷Lčī0 ü˜ØX,:Ž#‡ģpfBDå8=ńxÉJ„ŅhŃ œ²?‘pŗ0u¢»ļ¾{źŌÉæüÕ ܒ׉'N™2„08¬”Ūä6™–EĄäy”‹ģ00ŽŽžģæ¼ä’K=æŠ"°l°I ēĻæšĀ 8 )i€ÄFdH"ā„Īī”įžŽīæß’~Z2iõĘ£nlŅŚšZ:ŚŚ··“źSŸ9ūŒ—lßŗµÉĶę›Üžžéŗ@TōJJ©]ö)„L3Œ{óo©¹¹yķš5ēŸ{”Ö,eDģd†`øššC•Ń~‰™„  5+iĒp˜ę1$"ȱ×LĢrgM;wī4ņfĻ­Y›ĄWŪ€ƒBa¤©)?kÖĢ\.GL$P˜õĮ|˜Özß¾}Ēw܎;J^)ć6%‰µ8V–_£A*5::å9[¶lDÆäĶ'31Mيˆ …žĢq„”(@Ŗ°É;črRķßŗš„ė¤÷zKgE `>įø%³™³’ž[60°!•P[šš÷ļŻ—qŻĀ訫` ł|vĪÜYū÷ļß»{ 3Š•cŽ„Ą÷wģŲįy޼yóš›Ū(„ćtwwO™>mŪóĻO非ĢSO.;·[fsɌKHҵzc ÄęƊĺdö5“fX±ņYFDŠÕÓ=abO©ä;® ,Ų”lŲ8@ rƒ’ƤĆd–L+qʆ‚nĶwĖVłt”hµ5ljn²!""Ž8ŗ©<PiŃ¢:–ĖÕŖģ+² ¬`2§w Ųvüž°­Y¦VłU±ĪŃ]‘¢>’±2„’#Õ£ÄCB$)T7ņ±•‡Hõ‡“hŪJ½ėԐØNČJp¶Ė{®īP}dFc&·/`ꙔõN”‘«WuČŲ’Ö¼‹Ū”8zŠ•Üą£¬å¼ )ńæī®q *Bƒ2ž„Ńj%y=U™ļBś­ŸØcēå2 G„ĆÜ=}āĄč`&ļī[»Å×>4ē Ÿ) ļõ‹Åįā ›iŹ mYæ÷˜‹ĪɔGČ+żb©­#ƒˆ@jEĆ^¾·kłŠ¾³Ola`·ļŠ 3 ŲÜҌ(Ēq4€Ousn./2rłŠU—FļTĪp،ī®ķŪ÷ÜsŻŻŻŻŻŻĢ&t kšV|z{{‡fĻž}ųšaó ģŚµ+›ĶšŠ?Ł%Žļ?JĮCƒWk-$Jp–,8nžģW½śµ7ß|ó½žĖ#<2¹³c’īż|ß{yĆĻ>łéO]üņ—im[l+ÜŁlvķsėfĻ™ūōÓOŽ²™&[O©jJŖVŒ©°U+H („Č5åćB†].Lš­§NžāKėŸ{nņÄ•¦ˆ—Å‘BÉā…‹ž.<Ž,Y|ģ Ēž¦µ|?“Ķ‚q²&ZĢ Ņ@RĀĀyóŠŃŃŃįįį ŒŖÖ,MI hĖ–-[6o2uš’®f@ĢęœaņÄIDŌ×חsrŅ^°ˆ…q”dÖŗŠŻŁ14ŲW,Œt¶·µut׎”ŽD˜1-O¤učęuś‹O½ēž{öīŻkD§Œ”¹”ˆ€CCC‹/^æīy֖oĻ„öm‰z ”Č€™9äłGQ, 'uOš4é™gžyń‹_lžøI‰X(6mŁzÜqĒ=žÄcēæd‰B#ķf{¶¦1›Ėå–,YŅŽŽ^*•2nŒå[”µš¹ƒRpØņV„mśŃŅŅ”ąā¹/=Xø™ 0¶µČĘŅĮŗ„1)äóYØ" ĖĢb§Ź„“Ū°*źˆ <żųc;·naę¶¶VS&`@Ō@š…C-łü÷~~’ręĢ™žē8t°³³S:ŁÉS§ģݵkęĢ™öīŻ{ ?yŠé¢“‡e® ®Y»VJ™uT¾³Šā|[ēŽ»śśŚ·nŽ&/v˜ŒU'„YnjԳ֔X«Ž@¢ßd¶£eÓ¦MĘÜ>ö±1sĘąZ }ßĒPˆ`ߞ=---ł–Š„Ģ  1!ŃRčEŁ“,G$B/«dމ)T•յߛ5Smą²@%‰;»żSc?©_`õĢŁŌŹlTTK}¹ģō$†’°}X3®ŌŖŹbM!ŠĒŒŲdŖ|sJ6¼–ąnźēę‰$M%ʕ/ÕśäśW•Y“5ÆŖut; $©Š (ńč™q5ĘĒrÜu:s•āÕc¤ø¶HS*ė/ł¼Į¢ÉødY4•Šł’WÆqy‹żHjŒ“Ep—”EV“ę³šŖŚ$„ä"Uk²e}ŽŃs2ŗkfĒįĮĆ#·żį¦ūž}ā€šo=“kŪśC‡‘.ܵēšī½æ¼å¦÷ė/}éKąœ8ÖŠąĄŗgW,’ē @ „tż\4¹ ½E ;I;Č®dXzā’ŽŽŽ””” ä‰Xi Œ GP‚ööĪl6?<<Ś=a"–•Üb֐‘Üf%€.¾äĀĮ¾ƒ¹¬k ŠŅź‘}—ņłü¤I“"yšē×o(ź×wģ]%†‡~X„:jĶĶĶcއ… AŠŌŌ„&ŌŃ"ņčĒ?ś”W(H£>ˆ¤õĉ‰httŌó<“˜uÜŅ̘€ÕįCżƒż}ÓgLŪ·/J †'},‚®®®xP1 Sz^åŲ­(Žą{ÖŌŌŌ¤‹.ĢdÜ0-B"ņ}Ÿˆ"#¾I“&M™2„§§gēĪh(€ē“BĄÖm['NœŲŌŌ“téŅ%‹›)ŚŃŃį8NSSS”PФ5N€ĶĢ錌Œ,_žtGGŪ”C0äx Dp3nó¤‰S?ņ‘OüłŽ{×®]{ÕėÆxŃiĒ_|ɹķ͟łĢ5æøį`!„ąIčĄ|Bļ“©šåŖ”‘!S"(ć8˜Š=œA<ņˆ—8"Zžō3‡ģķķ]·n°O¼|§t]·»»{Ļž=‹/noo7˜ŲȲ¼’ļyŽņåĖ×®]kØģż;:R0ϕȓZ(Łl“¦ _“fó~d4 ¬Ł,G6“ C5³‰µ4Iö£ 1ZkĒq€@’–ĢØ X °ļųżļoiik›=wn[k„)÷†[śś‡ŌśgŸ3Še°žĄ`S&Ņ{öģšsŚ–-›"Ō%›čˆ‰˜@›ŻŽM|Ÿ‰P€2…›-›7÷>œ\v9öō±üœ—ž½}ĒžÖ¶ęūī»_)B*%ŁŲōņĖ`ŚņĶMMMNęŒSN]|Ģ|¬ĒPŠW’ٳg („~łĖ_ )ĒĶ Ō ,$£Š@¶Ź$AI@€¶¶Ü‹_|2č wrƅl2H¤h!č1r‰\×]·nŻ"ķ_4ŅMß’Ž÷¾óķo°ĮĮ~"#_·&¤”kÖ¬¹’žūwīÜ=erÆŃ#ˆ*&U3xębы”®Ģ ĮvęĢ™-ģ&gK {£Fn,hy’}÷t≮ć,Z“ņłœYóĢ”ˆå8Ń]L©u1n±ÄK/½“»£ó†ē™€ ‚Ļ÷üśÖßžā}ūö­Y³Fz>K Ķķg.[ę8®ā©üŠ>k@ieåŒ“åæ½¹³­=wĪ| ÉĢ (ł„o\›iiźīéłĆoo‚bŃRWPšÕĪąq°Ē>ObBB„ ķ;$OžžųG?ŚżĄæ½ł-;¶nc?0=VG)Ēql]ąE/zŃ䎩mmmmĶĶ£ĆĆ#ĆĆ£ĆĆÄ99V†Üq`–ź „Ø€ŹźÅ:¬*Z†'Z..Y)œD!%Ō\õ“ ŅĀ~q9b–Œ ;ŪIVp( cż“ćJ~pH¦Mńlļń—©Ō$GʞŒŃŃ , © „óORqµIaće/'µ“*‘„I'A%•OūžšĶž0>0f„}¢ŌyVB»ł“ĘĘÉ®µŽRØę“\õļ«ž<ŁldpŽ‘FW›äU%B½Į©õŁ|®¼„ōŅVļ|lĄ˜üg•R_ŅŽ)¹zFčČRٰJ{± $²ģ¼ųÄYCĆ;„3źfé¬Ó&œyāģ&W·dPŠŚŁœi†óN[ōęWžwұ³] !ĄĶtõLčéčž8sŽĢĄ‚iJGwKSg”€C€Z#ų»·ļęB”kBYń›pj P,z¾§=/Ų·ļ@U)¾m-ĶNF: 0 HSÄDbHv€ół|ōi_’ś×™Čź‹Ļ›r^Å6 … („4»oĒ$„4¾µdbB€‘ū-\0yņdĻót€ , {ńāŋ/ö}?ö“@ĮšĢŽ&Qўm;fĻė3-;ļ\ ĻłŚkÆE†Ąó“ R¢ c%«“­¹Ž#µö‹ÅQ©„!ąšŸū~`öĒqŒšk„!oii™4i’¹c(!B§ū¾€›nśMwĻ„C‡œpĀq­­­HL’ųĒółüi§¶jåj)#®ĆŒĢH !Ė-[ZZZ<Ļ»ą‚ ģčŒ šīʌfÓfĪ|ß?ųÕo}cžq K›vnžŅµ_d£'vē4tN˜ĶēŪ;»“10‚r±½¶$ś6(GY5ݽ{w[[ŪÓO>u̜¹2“DJ¬ģhGG‡—,Y2}śōµk׆ČIaŗC ąüĆåĻ.ŸŠ3aBO÷¬9³!dLgrYCö6f`=ņČÄīīIŻ•”æøńgŽ«$²Qlj¢‚ŒžŃšƒ pIdų™ŠµF„¤Z—•ń 6{ēīŻ›7nRHžį%k,# +ž“’.67eKőŻū÷C@&½š5÷˜¢t¶µ÷>@³@ ā\D€ųĻæ’mdd¤³«ėø“OP&—hėé% ō ƒW`˜Č\H%$#% C[fd֞R¾į o˜={öœcęvtuŽzĖ-!4: Ÿ}0aBē)§‹Č?üįöķŪ…Ļ(а¹ĮPŗŠ*0Ō µä›śٽsWč&ōqADü÷wż{s¾eh`šž{ļ$  T,LĘˆ˜Bß`†®Īī];÷ģŪæ÷§?ż1ŽvD |’g?ūى'žčyŽąąąņåĖMM9N}üqAąĻ;whhč’GŻwĒYRUłŸsoÕ{Æ»'ē Ģ0ˆ$‰dĢŗDEEW čŖ«®Y7ø&ĢkZ³ī1ŗ ąŖ`@T2CĪ Ćä<Żż^UŻs~œ[·nÅ÷^Ļ ūėOęÓÓį½Ŗ[7œs¾ßóżFŻŻ`,ˆ”ŖĶ³b4Ø ¶ ·ŸńŒS-^>2:ė÷Wüq|2’żB$ߐ‰‘E ȑd}ź“Ó^0޼Ø×ūŁ…Ʌ‘±a}Ōė]tŃóęĶ™7oN{¤P<99.w—ŒijbóI•źł¤½*˜ņ Q©9sēzč”÷w·nŻŗµ=F  'IņĖ_^üšĆk<šQūļæbåŹż6nܘ @(J :ņš£¦ĶP€×üå/ˆČFY­£T÷H³NKzŹÉxųwŽy§caüéĻWRŌė9€ŽŠ"½łĶo|ŚÓŸvż ×'&¹żŽŪ÷Y¼ŲRZ“fCXŻDj ­ķęµv˜(1€ ē,[>{öģ9sęlŻŗøĖĄö„Mą®›nü获|é>³gŽ­Z±bŻĘõ;wķŚՋĶa;ņĮ41÷“›ńŻ„ &2rf˜ŻŪoæõę±V'™ģ½äE/!)EØ;ęŲ™sēMNöŚØ¾ńŁĻNģ˜Žb¤C’Rƒ‰™€ ³H"ŌĄŒq”Hś—$ÉŚµk @ĀVkŸ}ö‰ć˜ā˜ÉŠÉōTźżļ{ßµ×^ x|rrß}÷ݹsēččźjś-ķÓ' É{©Ōš UPj'>ˆēQÄ%vƦhŪ£q‘ĀeäŲŃĒÜŖøž‚²QƒBŠ'Ŗjä¬ ajŗ[™ųŗ6 L_˜jź˜M= 4 våŹau S]&ģÄ,'ōs<ī[ĄĘ„7+Ż" 2ŖŠ“Š]Os[™“×Õ8 oØŃW‚¼īW!u³Äœb1cķ¼¹÷ųƟ6}€Ņ  5l޼yrr“^¶lŹŁ›žJĮʍ[׬{xbbbśōé ę/Nד 7æSu8øēŽ»Ā0}蔇”:Ø7»0gęöÉO}"Uę+Ƽ•JāŲå?{®UęSO=UźÜ ¼yóf·ż×gEAÄq¼aĆCŃŕ¦ä“Ÿųųm«ofC»vģ ‚ĄaI«WÆ^æ~="^ü³Ÿ)!J“ADŻ•¾ó­oģŚ¾k×īńgœņTZ·9óžŲĆ Åɝ7Ż &%j…P8? Š|Äd˜Zķöõ×_ƕ ‚@)T ?öŃO¶Ā@„ųÓ mWŲ½÷Ž{ß}÷­]÷0AN{»jX»ę”s÷ł‡WæĘ%ösēĪ]¾|łĻ~ö³+Ƽr²;E‰ÕKfV“Ųч?üį„K—*„zICd;Ø į X¶tÅ>ü”™sēyō‘#ÓFyń’'ą™“ Óų¦ėo U°hž‚}.b‹”TD$V¾JµĀbēՌ3>ųąĒ=īq®’\a¦z%ß u€_üĀzŻīÖ-[ī¹ūnHl½U™įŅĖ~ūƒs¾æmĒö}–ģ;ŃæāŹß3Œ¶ÖčšŲæüå/Ÿx҉[·nݲu½žõÆ’ćWÄq, GwbӧƤŽƒØ5†”&"į+Z£&cĮ)±¹ĖÄw¼ė ęĶß¹eŪEē’„"cēwśż³/śé¹KĻß²yżō™£K–.­4‚>óÆŸ1wö=÷Žõ“sæ÷‡K/FEĄ¬4A ”C÷ݶ:NzźŠ£Ž9ņ¤'kÄŠę°õ”æ{ś“Ł3÷ŪKæł•Æ”1  ¶GOB`€&cHüœ…ĀZéÓ_pŚ9ēžćä”^tś‹bļ.åõŖē?’Ō§?ż©ĢfķĆk¾ö__0‚ēĪhXmĖrŖ—ÄŪwnļŒv¦Ķ+KśS(­žńœ¹sßńöw?šĄŚńń޾s6ʼnI&²]ż†@ä`×¶ńķ[v€Å©ąøN¼å¶Ū…^š“īäøÓ@äspīo/ż5*^µjåœ9³ˆ–ōÓj#ķ·bł ęĶ›³e˦’żß‹¬šŸmŠ*ƒ5mtś¾‹÷ը׭]’ö·¾cr²' Š»10&“Éš{×|’»ß{hĶ)U˜$zĆŽøīį Ū·ķÜ“ióĘõ›‚ T˜éöŪo;ć/śĘ7’+m©¶>ž¤ćgĢžŃjJĢN‹iu*åg2°!±,NŸ3’U«Vżę7æ¹õöŪ.żŻļˆ`||\Ħ.łÕĻ’ć“ݱs˃kīŻ¶uóŗ‡š6mš żYŒ…IĀQ;blŚČČČČm·ŻvõUW”&鲑"b·;‘$±_Šuö¶ˆØ5īŚ¹S4Žäł.Y²„‰„8-¬MŒ‰€yėÖ­az¬ø~ĆśÅ‹Y3*DزŸBGąĆ”¦ĒR–Vz«łĖĻZ*GŹ ‚`dd¤@՛ri¤ĄXØ«ź¹×Lm2§?’©ŻŻ[vvÕ÷üæ<i„(Ä8ąž’I! 4+5o6,ž·ĻHg֌ Ģ× €ndQÓ§ķŚ¶Y3h& Ą‡~ČÄÄĬłó×­[‡BŪK£Ī˜`ꜣ=ųŠV§Ój\qåI’”Kœ^6kL°žįu““ć““ćĖ–-c‚0ŌĶ ķńŲ(ĻxĘ3öŪo©$Ą·Ż~›?Īeõņōļ}G”²ś¢G}ōäääŲŲŲ·æ÷]­BĖb&¹źW€ lÕć½ļ}o’€?żŒÅXU„G}ōžĄĢ“““€^¼Įp×]÷<ųąƒóēĻ?餓¶nŻ*¤/bZ¶tŁÜ¹s§M›vĶ5׬^½ZĀb÷‚@ R“ƒC?ōōÓ_¤­b\}ÅÕŪ6o “†¤G 4(„!0‘Y8oaobņ GÆ¢$ÖČĘ1Ķ€=öųóĻæ@©ąģ³ægbv„… :„M}XĒ×h¬.c·-_¾Ü³`Į‚-[¶øć“('ļĮĄQMLŒ÷z][ŗF[U}šĮ5’ńéOķžÜuųQ‡Oō&:č D4d„nŹ $Ų/āūß’~æØLL§žzjkd”2QŌõģ;ģlk°Ż}‚x ʱiµņH +6 ”z蔇Vģ·ģ‚ ~l’ˆ’LĄæ»äāŸ]ų?³fŽĪ3Ą¬ß°vĒĪ-īOē-ٵž1mlõM7nݲˆAq:'ńĮūī’§7¼ńž»īݰnćĮ‡&”ĆF!#}ܱJ©Ė—~ś?>ńÆ|ÅåL6ĀH˜c³móščł±ÆÖ”"c.æürg—*;'¢v%6f4ÓgL;ž„ćvīŚ±k׎?\łūÕ«o0€ČlüŲńæųeÆkm…j̶['ŗŻ;īŗ+ģ“™ [¹kvuĮc>śč£Ž:jõźÕŸųäüžWh`ZbŠ ·oŽņĒß_zņ Ē|ésŸŃ”&BsŠ”źŒq4±sĒŽė®»€Įō’oó›_ūŚ—nŗé†3¦u»Ōź“Y•Ņō€P)óŠWžńĒ?żqĶĆk®śóŸ6oŚ”ūš–ośŅē¾|Óõ7+¤1čżŪ?æużŚ{5ō¾öŸö‚ēnß¶…‘PC8¢AĮļ.æģ¬č;gkūŽ­ro:ö]²äˆ#Ž\½ś–5kÖ¾ō„/[æ~0\s퟿śµ/¬ß°ęŧ?’)O{r7ŠWƾi||w·Ūõ‘qˆ”’_•Rløõhs$€“N>ĮPüšĆżĒ'?žÓŸžttt4źN|öS’ńļ’ś/ųżµj’£:r×®­V0mŚ(§čœlę ­ZµjīܹÆ{čg?ūŁWæōÅk®žKÜķRÆ[»öĀóĻę3ŸyŪm·! ż[Ÿw»Äō3¤kZX?ü°w^°år§ß™1c†ģŅF+Ė`ćʍ7ßtSĒĀĘ,ŌĒ孜±;ų¤FĄdķL,…hõœÓN»ł¶[vvwnZ·ö«’łé ¾ż­üĖ».ūĶœŃČł3N?ćÅwŽwĒ“™#=ø5€b‚ĪŒéüµfŒ,Z²ųŽūī~Ā Ēé?>~ö—æų­’üā+N{1›äįõŲøī#_žüŒ… @idP„Č€‘9ę˜ćŸóœgżńĘætfŽžō‡ß~ā1‡Ÿł¢SĪ’į·ĪūöWßóö7?’9Ļzīß=ėįū0 u X©@·˜TjØĄpöŁg»-,_¹‚ˆ¢(źõz:Ä_- ō‚… ÷Żg_ßöŅzųa@„Ad "DQä 0ó«­•o/ģųS(¦ŹǘSī±#$[ÖBjXČ֊Asˆ c|%¶J€Z¬†słj^ˆ8ūNŌ,č®…ą»źs-e(…Ź‘eųV@āWgԐyÖ„č{—ĖY™4¼Q³p äqĒś”­Čog('ķ¹X±2™“Vp ‘ķ±n<ż'UĒ”._p3æ½æŽrJzM£ ĻØ)eu!ēÖ]"ķ§Öƒ¼õŌŲŹƒÜ~åTaEA_Ļeåµ1Ō„²v÷ŠjõÄ­ä»W²ö¹­›µY±‡ĄÓŌæ„¾ÆÆ²tŚˆÓeą×M/®'e£äÓł«±Ķ’‰ąbŌ'?ł˜7¾ķ_)šüĻĻ”K€Ü!R” ½üś×¼õĪ d8ö°GķÜø~|˦Y£mC@ĄrĀöĢŁ3ē.Ų9ŒlĄĄŅ%+’É]“;·ĪŸ?7±LN#uo„yt:vi÷īŻ;4Ŗ“OxŖ H±Q R$,²P6Ūžųä'1ŖŻ“ŻļŸū?÷=$ *Ūp_)) “€noß1.ŌeŸWf`97 †Å9ŃĻ/¼@0‚:łų€Įˆ/«%~›ĀCY¼dįŽķ›ĒŚĮµWžaݽw“!„ž??=ėoMĘ·°réöÉŻ;“¤3t­Tøų1sņ“GZ#›6¬’Ś'?»vCĄRŁxßżozĶk7m~øŻ ßńĪw/Z¶?2#Ą!“F’ńļŚ>1±aĆŗÆūÓĒŽ÷Æ<>.ģ5遂 »¢ ÷­ćČ29m%Ęō"$J›˜2˜ Ģõ½B#tµŽäµłĖ†uėŽ;ęøŃΘr)@ēüš{§>÷Q“3Š|ģqßå D2Ę(l'ņ–ĶŪ;#ķ·¼õ wŽu§”<šĄƒ'tBœL(¼éMo™20*øźOW?žŲcŽ’ļ’ö«_ž< (‹NP æžåÆÆūóu½ÉhśŲŒg>ū9†Į6ĻJšĄ+V¬˜;wī†õk?ņį†č LڱuĒż÷<ąÕ ³‘z`š#»ĒjM0É<ęÜöŅbM»üź——®¹ŻĶ7ÜA š®¹žĻ7LNŽ;̇Œa&\¶tæY3f]żĒ«?šž÷^ń»Ė€ółO}ź„§=˶5³ēŽjĶʘķ»vī³d92…āGJH¬ĄJ€mŪ·]zÉÆ&vģŌ@ĀJ®»wƒBC1ęZ‡@bµkz €ˆc¤ńg=ļyó–-ݰaĄčٟ’¼Š&zē}ż[gżėūÆÜļ°£˜æļĀĪ“ĪIO:y|Ūv`[ŅšģsĪ™>6¶nķŚĻ}⣒öĘ\}Ż ;·nŸÜ1~ĒĶ·¼įå/§hrī¢E+<š„Æ>3J kŪÄ  yĘ©/zķßķé+–-ūź—æüæ?=’sŸžäObd“†ū®gĮĪčŃicõÄi¶˜žąc.ŻU韸>‘”ŪļSżĖ%•†ŲSHöŽ Ėą¤żĶ ¬¹±å•¤7[éÆŪ@x®f;<œ¹ų8,|-G­Ōƒ Łwōį;ĒC’"óˆŸņ/ž*ŒŽ9Ž£Bŗ!Y†TóåĮt×\¤=e(«­9rJsŖŒˆŻn×C/Œü+ Z9e+€dĪR×õ‹ŅšbŖ@Y¾°5ŲFƑ¾1;SLŸæéĻšŹk+§żž+ū.Ē~OxŻOį]¬joN6,~OĄ÷Āk–-—D˜¹ĽĘDÆŌŁj”Ü d’’Ųdē½Üqķ9?ųįŪŽöŃńDĆ””ĄØą”õŃ[žł£Ļ{Ék>’å/0!“FƒY³;&ŚńŪK(Š€ŖnųÄŻ±0 @3€€“óēNėķÜ“eó&–^2iŽdD@Cęž{nķMnźö6~ÄŖŻć€Ę €2µ1  !¢VĄ žį5g̟?2oĪX··ėĆžÉÖ­;įæžŪĻ9÷ĀČ+A! ~õæžKāT„”åŌ!ŚÕŠ(GY_wZģv»¾įaÆ×Ä“ŁŁSóOå‚éń'?aķ–mwßsŸÕÅ]ĘhŒvozų¼Ÿž`ń²…ū¬\<:gdŽ‚Łwß{]Ÿ–ģ«?ū¹’Ü=¹32Ż+®ŗtżśū 1ķ C“[·ü£|hĶŻ#ķÖ¦ ėūø£ŪĄ@ Dę°c;żegl޲mtlśÅ’ā½’ö®Õž#Ä=Ž&’ÉŻ;6nøė¶[?ōĮ÷īŽ¾-ĢDĢJ©„–äŃr(mÖd+@ ƒܽcē왳ŚaėŪßžÖyēŸūą Ā÷ŻłĀžņ„/}~ɒ%³gĻ=ė¬ŸtāB"­u(cuĘgœü„’¤;>¾ćßžõ]_ūźW·l޼eó櫯¼ā ÆĶŖUĖīæļžu­=`ÅžŅé,ĢŹ‘Žš?oĘOzŽĖ_ž²³æżķßüź’»ī¾ n¾įŗūēłĮæ×iŻß=a Bm­S£k`C šä“N8챇“Ūķƒ:ØÓi_xĮOo]}Óś‡śĮw¾żŌ§<éMo|=x>ØnDZ*B$lJÉ$MJ¬åńŻYD•ŚK‘4cļ·bÉĪ][Ǧ…/zń©łÄ_śņ=ćOūš‡Ļ’ńT ¢Ø«Ģ™;ė…/ūęzķI'=žW]¾{|ŪāÅ ųĆļ/]¶äĮļßøīį­›7é“1Gō*1”šG>ü1ÆnCZ#lÜø~d¤ ČD‰”łQ”HÅ Ej†$ąaŃÆ–³Ji°"ķJK÷öō™óN9õy®»sĆÖ{ĪžĮ—_ś¢§½ųEO’ź×?}żĶW>šŠ]‡yŲĀÅ F§žģĀ’½’ž{Ł’ć¢3cŚ[ŽżĪ“N8qŚHēŽŪ®ūÜGß’Ś—žöŖ>÷ķÆ}e;L®æöŗV€Æzż™&l·‘C¦€¹E0 Ų~ęó^xŠa‡^wŻu~ 7±åcļē’õĶ/}ž“ßł¶Wžõ7ģŲvĒÜł³'ŗ“€L:µ8’ńŁoŊƒó(J‰“‘‘pᢹ"6¬µ2 ˜$VDtĢ1Ē,\ø0Žć‘ŃPiųß’½č£ūĄ‘Gśŗ7žł¾³ŽūĒ«®øēŽ;ŪķVSŚMJ3gMæżö[[­ą”‡˜1k¬\ŠōįšŌV;ģ°—½ģe;ęØC;čq;ņSŸśēvŚgžóÓ»vļ,_¾ü¤“Nzó›ß¢tĄ,ČDpĄž:ćŒ3¶oēäkƹž '?é”5’ōü ßņę·Ąķ·ßłŠC›~ū›KX}#¦$PČlŒ‰ ^uęˈ{ė6Žæ{rˬyķĖžšĖ›V_½hßŃ[īŗjĖĪ%sŠ:P"vü¹/~!&3męČŹ–?øęī»ī¹©5Ę­ińaŪž>ÓæņÕ/üĖæ¾u*L@™éÓG_š‚S!ą?\}+fÅqÜ{ń‹_ų©O’Ē‚ófΜ3}śōµk×nŪ¶M!2‘ą$F2 €‰)m‘‰;mØ“Ö¶"Ŗ”­4Ūö‚Š>šĮ÷®Ü)Ŗdį¢9: 0Š#±Ļ~ö³’ųĒąÜsĻżł/.¾öŗīøćnbŅ*”(Sį†`Ÿ}–~ōCŸ˜·`Ÿµk×Üūą}uļ¼÷öž™œ·hī+^łŅŃi£dU”­²‘·D“ €+–.³¦īqbĆtæL„į/łs‡xÜqĒIĄŚŠ˜ĻČ~;)Ų=Ē«§kŠķ9 ½üUƹķ®{ ;Ē{‹—īwĪOĪ;ó5ƅ„āüńņŲĒóŲóę`bėćœ@gę¬ēæšEg¾īuÓęĢ~hƆ±Y³6ī?ųČĒņó_üĮ¹?Ęv th%żD’I! xĢĮoy÷?/{ōÓö]šū’ņæWüīö5÷N*³xåŅ·žė;>õÅϲ6„Ę(ĶJ3 ;ƒ3?õ©O²‚ĢOŚS’įõƏŅÓ6ŽcH‰1N .øšĀ /ü©£æīuƛ˜˜ß‘…8Ž“ÄXµČT©ČѲeé«”ŗŖ(eģtß Õe³JĪŪł”™¼)*§×‹Ü,h& ¼ęfSéoŹ7`ßŪL"Wõ{‹jqZĪ”fy؁×ęŌ0©—Ū–Āc­‹Ų’’L©J ; Ƃ¢õŌŚ¤@Śŗ_vOĪ÷ż+ßcÕé””m8Ž•I2I’‘c25Įś{LÄĮq:¦Ō˜•½¢…ÜŽ7č)üØÜ[:”*sÓ =ŅŁfĮŖt€å&}²«ūĀī Įīz.ņ`»Õ ÷[.!‚W6Ndf kĪI†U0Ü%20)…pŽł?Å+^=:göę‡6ĢY¼džüłG~ä}÷Żwļ½÷NLLĢY“č¾;ī8ķļŸ{Īw’6ož<šŃĒk­Ļæšģ= ń7¾ż«7½žõ#³¦ßrĖĶ+Ųūżķe7?ė¹§ū£ļž|Ā”#8;ŹXx×;æšõÆ’$!Ś=ĪŲÖ-4»Ē·)„XAœÄķ@g²eØ ĄŪßó±Æ~å[@cÉ®]s÷{Ńó_pÅå—ŻrĖ-ā±k|}‚ DÆńń?āšknĆä)O{źÆ~õ«Źåm-‹ŅGuł„æyŹSŸĘ ˆąG=śęŪn#ŐZ¼0°Ó÷O_¦wļŻ·żóŪŽ¾éįõK, ¢ķ;wčv끇ļ{å«^öš3_~žłē’ģ¢_޲śīxÓ;’ł=ļŌĘ­‘“Ž·æńÅk’ü—›®æįī»ļ]“x’… Žwß}½Ż‡vĄųųųa‡śś×æ~’Ēˆ:)O@$ź)?śī7?’éĻ.]¼hÓ¦MĖ–ķwķµ×źŃĪśu›–,Ś!čF½?\}ÕĢyóY#Ŗl²‡B9›>cĘÄDWB…ē>ē” /¼PŖūVšÉV˜!~ŅOĆ0Š¢5kքŖ½~żśC;äšk®üćŲ²eĖ1Ē÷oĻ™Źzš– qüõo|õ;ßłĪźļģv{ūļ·ß=÷Üæ’ŹesęĢ™5gzĒ?ūåŝ¶xäš0ń·æśł—¾ō„uk×#¢ÖĮu×]GćöŲŪļ¼}b"zį Ÿsé„—~ōłĖ_ŽnOŠÖźŲŅ& "2˜o¼ńmoyĖ’%K®żĖ_ĘĒĒ„×<“~ß}NŸ6{μٗ’ž¶÷8%Õā}wŻæbå~ą»Y¤Š8.DHҹ,ę€xŪ¶moūŪn½õÖ^wbŊ—_~łģٳ''ĶŖU«®¼ņJČŃŗŻŻßüę7?õ©’XµjÕīŪÆæž¶#Žxō ^š‚|˧N’ō~śüó/¼īŚ›.¾ųWO:ł‰Ģ¶µŽĪ4OƒW¹Ų;n[=kÖ¬‘ĪX«ÕRAØÄS²®g"TIĀ­­§ŪBˆ ł2FiÅńäŁ_ūģż×© L’dóęĶGyäg>ó©eQ÷ōÓN»ēŽĒ{ńĒ>öéēŸž÷Lā¤"ßsėź·¾įqõĶ·rČ!]"Zŗß¾ĻyĪsžöģSf/Ž×€RŠœDjÅ+ 0ŃżwÜöĮ÷žū·ÜJ6lX“hĮŗuėsš½^zÓKĪxÅ“éӕnĖåŠD°]L·­^}Éo~=gΜg>ūYóē-2Vß+ C" [Š PpĀ`Õ¦MæūŻļ^xį…óēĻæśź«£(zżėްĻ>K/’ż^õŖW=ó™Ļ$"ė~ fūŽķo}Ū›¶nŻś‚<ļĢWž 0V(H»ó(Ž4o§±½AÄßžę’E‹}źSŸ9cöķ·ß~üńĒ?ūŁĻ^¹r’N§cłńØŲT ¢?żłOēžšÜ;īø#ŌĮė^÷ŗ“N:iÖģŁĀøį†z½Ž}÷?xśé§J, •'įBĄlLÄĢē’£ .ø€!aę|żxąW½źUČ<†YĒ51‘(GÜ|óu?žń5ҁøk×.­õ)§œ2kÖ,ݚ”•«Xbr‘ČÄųųŸžō§Ūnæ%‚Ē}ōGĮĢQ%fr×®]Q‡ĮČ>‹÷Š÷Žy×9ēœsć 7ģ·ß~«WÆŸ˜ŲoæżVßvūĮQ£4³įD+E“­V$ĆךIB` hŠ\ŖF¬žōĒ?wā ī0?öøĒ]uåUŻŻ»˜¹ÓAk{²œŒ”6Ę G…€‘‘VÅĢšĄ÷-]¶Œ‰Ł„Į…ę[,†_éoręŒĀ čņŽ!~Q"S]ąböH†•FJI"nsŁ}³łé»īś8„ąŠ\ĒjN7I‘0Ŗ7..“=bńūŁ`Ķoāž¦}R® ¦óź Ł}IpĪā<×I$ G9®öÜŠT ^„CÕą÷ŪײL‡FS«‚ķSį^|‡Ż‚5i]©Óē/ć“YOŽLĄÜ» »’ ŗė,’hØ·čoöW³\*Lµ‚ƵÖĀ„Äglļ¤ÄøG ŽW)+…O!„ĻĶ ē~ĒCF†CÄ]ö’K~ūé’üŅžpUglv§Óaßøö~Ł_‚‘9guÖ»ßõRķżÜ~łŸßõĪŃ3.½ōŅĆ?¤„€æśļżÓ?žÓčŒwŻu×āŁ1*Ąo}Ū[æšÅoĄ}>°|ßE(P6&ŽĆ“ļņǬ{č! ‰t8kddd÷¶Ąq/š C-FÄbcwe„9|ńé’Ūß^eŒéŽo‡$ ;££¼råŹn¼’™’¶ „Dzķ5|ßūŽwńÆ/•īĶ(ŠÄ›Ž7(.4ä0óŪžéM_žŹWE‘ęń‡uõ5אb“w”JM˜ Š7¾ń_ļ{׿t€g̘±eū–™3g¾ć}ļ~Ķė^ Ą§<ūY·ß|Ǽ¹ū>įĻśÄĒ?¶Å‘`Ū¶Mwß~ĖĪłįŁßüv Ū ,µŽ¶m[»,]ŗōėßśę²ög5EFÓŪēXżģ~ōéų®[ļl·ĆN§“h½}Ū®eK–lŪŗkÅ£Vžö…Ą‘Ņ:NāV`§āg>ó™õėÖ½’żļŸ>c–MљѶL*{®cņŒ§? Œ‰W­ZõÓ’ł)„"Ś’żßłĪw>’ł/HSSķ;(2@cØwēwžżõļżüē?ą’$Y¹’ņ(Šžū›ß8łä“µn‰—–Čc&ńöķŪĪżĮüćĻ™3gƆ »wļ>łä“õ«‹W­ZuĄūŸyꙇöX”Žc ¬z3«Km÷Žóž÷\w͵7ŻtÓĢi36oŽü¤'=åĶo~óŹV­X¹Ęwī¼öš?}į _8åYĻ^±bŅ^ō“§=퐃»vķŚ…ū.X½zõõ7^÷āæxŪŽ]›7ožŁĻžœē<ēųćNœ;w®"éJ$ų턿śĖ_žršĮY¹råłēŸņÉ'’åŚėž’¼._ŗL)„TD‰=‰I¾óķo\yå•Ó§½ņ•Æœ>}lÕŖUØßsĻ}·Żz׎ŪĪ8敀i5§^#&I$Äyԁ«ī¹ē^i×ķN슢H²ÜiÓg¢h‚»ĶRØŒį°•Ķ[‰–|…ōlKż²ˆ~~хķvūšĆ€y‹€1 5õz¬ypĮüÅ#ÓgØ  Hpb‘ÅBڽc›Rź¦o|šĮ£(š5k֑GµĻŅ„ĢĄ¤”nŪ¹ 旮°¹ėÖ[×<ųp3ēĢźõz>č€0 ư“F‰ BJY'Ć •J’^†”Äq”Äķv[a „óS!D…-兗 Ł$ ™ńńńī䮯»w'†8ąŃ̬°•%—Ģ E;wīėh­5Ż×źöĪÆĢę9Žć0 ‰•R€āø ććAj­øķƒSóąƒ>ņˆC—,ÅD¬•‹†€ćÉ(Šę,X89iõ½—-_~ß}÷łO¤ ¾ĄĢ_žüēŽžöwH ‚ Ä¬ 1IجŖ‡3²ŒZ c6=“öž{ī9īųc°Ż&Œ؄bŠb'Żn4éZM’$hi1’r±8qŠåŌ\®Ē~?°_¼Ų67’ql“օs#ż…ž!£UH$^8Šˆ³ņ·Ģ+6Ę@ tHĪč·c¹*…(%Ȍ1åł¦¹%ø$3}¾ŖĄāa@bKčc˜9?ł©Œ$ųĪņŌ¼-ĪøļųA¦Ė© . žÆŁĖńžŠ¶ĪąSm€’Ōø)éN¾öuÆ~Ń _0>¾óŗėÆY²dI»ÓéõzĖW®X¾|łÆ~yń–-[^÷ŗܰ~³B¼ń†[:ų+˜æpa†`­­Xv-­5ņs欓>/–Ø17>’*³m?qü±/§mŪ¶żŪ{ŽĒń„—üīYĻzÖ%—\r蔇®YóĄ“iÓ®æžśnÆ'ŒOŚÓqÉ%&I“€'Łsaū¼|šĮ+VȆ°|Łņūīæ°:6õZ=k±š“Œ¬ ŠĮŹłķ¢šųü=¤€†¹yŅéTa $ nų<V S&ŲµcŪžš„Õ«WĖD&&„€>ūŁO¾å-oa&„FDV:I’0h¢!ÖŻćŗ’žūßłĪw^xį…V_tŃĻ9å”ɉ‰v»Ķ„ Ć€™Ų×uēZf|J¹dµ UģR-ÄŚX+Rŗ”2…(ö±®'NaejQ™s걓B¢«śēĘLyˆx°”øīņ|frs䟻)pϱT#(? DĄšXכ¾e½ŸbŌ­…”RµT¹2÷*—.?n¹f·ļIé­ņ7}t·ü¦}/»‘אżI”DD$vžå:`³6ÓP{įĖ'×^ÜM†’‹)q],‡<¢fÅ{#%®¼Ł“ŅXC”—\įTk¾ĀęÉĶ”R&MfXf‹W@7=9iU`“Ÿ4ؒ /tµHŁXwÓŲX N(i« °yåWĢĪTĄ,(Lz½h“Żr[›·€­n Y$X²Žń^·ÓžfėßRū·”;”@~zć×qÄQr$3€ÖśCśŠ{Žóžņ.,“ķe§æųG?ž‰QūĢY°vżzŠÅ2„˲}KSِåĖ,„ Rm`×3%Ć3ML„­ĆZ”2ĄØmjRd@‘/1 ĘĄLI¤ĀŠ=— E)Įėcdøģ“³%źõzķöHžPŽ^ņŅÓnøį†3füåĻP@` ¶&x2†^€Ełj=3(ŸmNö÷]qP „Üļ8`Aä·<qBA Üū¤ł¹=;żõĒq’Ćk6Ū·l|ыOCÄÉŻ»ęĪ{Łeæ?ņˆĒoß¾żXuąŖc=öŠ+?cƌ¹ Žzė­ė6nzŅ“žōś×¾īéO{¦²ōl1¦a7”’^MÅh”’mµZ^„Źbhģ3ŠPųĖ_žtĢ1'øš8Q­3ØĀ‹ā8 u Då|dĆŁ@$é y€¦¬`DTցć8 Ū9†|Æ·[”‘R€ÄlÉ«ņ ¤ “Ž…€c(ƒ@v£‰BeÅ,X*)Dq¬Z#YΦ“šZŒ¶ 2²¢¬~Č9śĶW` 9EoŲ“tę\²?Éhņ6õåŌœ\ż[¦A»Ż–Ÿ& Ŗ²i(„sTŹĻfd)6Vn4ˆńw‘”·2)ģ ńS^öVÄąi–ŠČeIf~2+`cK]I£“æ#p,ęšI6I¢UšdŲĒfČöķėg͚-ņ €w t†VoIa¶Ó‚|ł £>%‰l™Ģ{ͶԜüųx7Eš“ŸüĻK^ņÖ²;²!ĶSO=å¼óĪS:toj9 q|×ī~šƒŸłģg\ulżŗõ ,»°§!ftčBѼ2(ˆnŗœ†ßżČõāV;lJ$ø r̶jƒł|É[dŒ r™CVō“C-[®!¢[o½õ±=\¶ WˆūĶo.~ņžxĒw¬\¹2Žćöč˜ÖDÉ3ŚŖ‰”Ā0d°’æ7ß|}«ÕŚoæżĀ° ¶C!“«ķś—~ŁēsÓŚŲ½.‚\čњ€Į0+…ōщ]y5ÕĀ2LÓx7tzŠŁE#=ĀI‰sMvXź®O‰]‘ŗ‚5= J\ʄ`ų†ĮBJģ˜Ļ$j/*–JæVF‰å‹(ŠŠėPʲ¶Y_øµ”F0`b\YPkčH­f>œ‘U§6¹N÷,Gó7äŗć½’ĒM’ݐ箐 ŠĮ#sYå\8Ļ ÷kŅŌ÷ˆ§ÄSĘ`«lvēŠ1@wēü~՗Ļ`^ĆTé 7GŁ ĀZĄYģN+qYU”yŁ‹ ö„RŲOY•#”†:ßĒ”źeKóD ƒ$ „Õ0ŒRʵ°”•D4YÕ6õCÜre§Miå”IjĘ7n<ģ°Ć6lŲXˆ:n¾łę|LhWģFÄčƒųĄYņ: fιłę›_ńƾä’KŽ;śń/zŃ‹ĪłŃĪ<óĢo¼ń-oyĖcóa½ŗq¦“5 Ą€5V(AG’dA\³*DF@LŅŅ.: f­¶ķĶĘr¢•‰‰I“P Œ©Ź“ +789э1ˆģPbÉ 3’Ćė_½zõźg<ćśą‡BƒĶByČĖQd¤J«¾K.O“sņjY‚Ž‹īöŗ#ķŽĮq;YĀ<~•#Ą—+h¹©ėUō£É]abØ7®[·`Ń>BÓBNģu»ķNGž”įˆ™CŻrij“ćÅķtuųaEq-Š0ŗBā䣈°yӆcŽ9ęžūtĄaõ,?JŚ Ŗ«ć"§J™$‘®ūĢOU £“wPĢ–DJ”Rf  “„“Vٚ5€*ŻÆ(GLQ#KF°Ü 1»FcÓ-²­ŚŒ&ĆÆ0°Ś§†āą‚„lŸČĆ'KE„<ŗ®ņ³Årz„V†ažķł#ĀfŽ„&b¶ŁžĆi¦įP2T®t \±Œ™e‡ł_@žÓe˜¾QŹ‘)Dze> J¢āźö@PeŒŃmģ¹\=ĶCH:Ÿe«q½ >»@T.3Ś‘{‘Ż˜)I„i‚AĖ=e¢X#õŁY³¦]uÕU>śŃ6ž0’é^ƧuŹ•fr9·…mUJ2}ņu YZ^Ėäj»0DQl-©Uµ5ī^K±ORQč@ŪĄFšt)%®˜„ĆōO¹w“’8ĶD’k‰Ž.énšQāB)ÓĆÅN:dĄü™{½ž3“Š Z ķÖeL”ÖśęŅ ŠZßkø®g®÷×ö…ĶĆ2hZ>ÕõÕwLŠw9œk>M¼/‹ įuźšą’O§ÄłI†ć8nwZÕæ_óŽN/A¶9å KՔW ‘@§x”W±Ndv‹ŗOĄBóM„} ”8š™ŁHÅ¢U,X@śf@*•R…­øN\ X2cŽ~ēä.\™€ŒÖ$B#i’X¾”–#ŒPكÜĘ%ūŲĒŽ÷¾Fę‚ .zīsŸćó{ßżĪ+_y&+†€’Ō“Į ĢąÓglß±˜… RŖįœI")0,’9Ąå!©,ČSIJšŠi;±²-Ø@„(K’s‰TZ Š6nrń6 »ks.šA×9ŸĪĻ(NZ­€ī¼óĪ’śļÆ\|ńÅ'?į‰_łņ§Ó“ŹÄŌā†b©ņĀ‘@d¶é‹1 ŹŹ2¾T>¾½eĖ–9sęø©kÓZgŒœ’ZgÆēŗŻn«Õ± YYö“L$Éń2ž³–:N–{Ų8ÅсU jyukS äåhҐq4éŚę×ī „ Ŗ°‡uä‘7Üpƒ˜g®]ūŠāŋÓiĘĄŠ™A)vž“čƒD 72©/Åq’$­N6ZiLQnw§6ˆ£(lDĶŃT3+,ČIż±Fšŗ@„˜‘Ų#Éw’4A m:$ĻķLUi$Å ÓAftE›šøĪŅ aDE‘Žuį«ĒˆJu'ćV+’KåyĻ֏SŒ…ѽš—†Q‰ųć÷KI‚ó”U.;ƒ¤4éœi¢ĢŁ-sō«2²źGĘDv-‡Śč– ¦«TfL鰕½—l5©¼_‡t_²u4)ĢyŻq1URg¾ƒ?‹Żæ¹¬… “bRn>w'ćN'äŌ-š™ļøóÖłóēģ#Ÿųš‡?¼f͚… ®_æ~łņåŻń‰Ķ›7/ŚwŸļ~÷»§Ÿ~ś¼yó¶Éö M'±ÖšÆüƕ“““O~ŹS\9Ingr²7Ņne$Ļ :n‰Šč’ Ó”‰ŲZdDīōÕ V‚›$Żé‰ģHé6 VI:ȮΘXkŪ}m šģmoĘp೨!‰zA»w'ĀNGĘ÷Žķ£££*hQ#"Ŗ JƒZŁeĖ,„wܲzõŽ;Ž?žų“ädO “$:hec@łŅEśuʗV9Š_Ś"*¢¬B.B.%.PHŒ!­Zåc€:¹Ó½®[óŖCbŹ+c•æ.Ē«8@4;ՔxĄ–É\Jœ–„_ÉjźULĒq«Ó.^­kP*”Ä{’˜T¢ÆĶI&Tu4ōuN. Ā{‚zŻ©"„“_ś7µÜ­tnę8h…Ęś†Äø,ÜĀ [~÷Äϧ ł·’ƒ—%Ź`ŽĖf}|ž€|„;„÷ŽNŌėõZ­–d§Ķd‰†ÉŠPpź?ŚlKÅq‡ķÖąM {(ņ±‡ćVwæĀ@d ģI¶ü»iÓ¦§<éÉ«oY-?zę³žõóŸ’Üažü§«Ž=öx›käT”45É×OyŹS. k|D†ej/UęVŌū½Bŗī’õėÖ=į 'oß¾żļĻ8ć??ūEŽK5¢’ć«{ ‰S.V­z‰“LśTüļļż÷›nŗéQzŌg>õy9ž£(€V«%x¬˜›ĮĒ ÄāpF™œƒ&˜˜˜›6jS߁åRüČ~?ź;üFŠjR…F]Ū¹°ė³†µŽ¢ØÕnĻi„†­fj}ó7«čōC|øÕź6„(ŠÄ[kĻĻųa7œ½µA PlÉŪcÄĄ—æüå7½éMĆ^$iŌu8^±„³œŪäŠĪbčEQ»Ż†< ÕoæōKµ(‡¹4Ó!ēXoūĻ—ˆAi €Š¢ˆ•µ’ ‚@[o@f„‚ņß7¤Ģ3ret©¢ Ÿ%åeŲ," $¶Qh!^ƙ»'GGGˆ8Š¢  ēØXć Ę ‚Š=µv5²Jż*PÅŚ\Åź(1ų¼ź›+)łŹŲŁ÷¹N *虙bvƒÖźŁŽ”VŁ\‡ —k[–ʤ5 &±r_ø¬UĀ`²ĆŽŌ^ß$ūĘēžPPoėóHTdö ]¹€{ūwŚ`‹Õœ+¹ž»AR_ι0niJœnSU«Lq}γöž ó“©}4D<ƒ§ÄCÜīÉ„ŌYūņš1ß!fšņÕß6żš Š\Øä³ōą]xĮ§>ļyÖÆŸ;^ĮĆ$Ń/łĖóĻ?’¬³Īš>}zE[¶lٶmŪᇆ”üņʍ-ZŌ|”>B#üu¢n •H§,³ Ą™āĶ›7?į O˜1cĘĢŁ³.žåÆAiü’%%Ž‹”ü#w –Ą·ŒÓėÄŪ² YćÄäD;M“ŽĢ.;I’ŠK™\·ķ–-[ę͟›„Ē5»¬ćR¦ś\ĖĮ/Nr®.Ū¤ķų)š^m=ŗÅü‰‘€ ‰{‹²GŰ£ ćGcĆ~I£AE›@ݹP¹ēļÅBŪ#w|4ųPY“'œUÜ\–c)WŖG†…żŽÓbQcĄ„AD TJ5gßģŗ:*÷v–P;wG"„›ūż4Ēčõz‘‘bJŒ…שH’źRbö o3·, /č“»­\ M]aę3ß*H’DėĄ„X97`CΌ4‡˜ Š¢ ²v†lė3¶ÓøV>q+ @†ŃćŅVō»Š”ʵ;(täęSāž;'—=x–B…—•bD6V¦Äy¤$ŪDåŠĻ›·y‹Ø\€uĒhÅ÷¹ręY•,Aš—ü ‡ų€g–Ó4Łė»bäÕ#QI¬,żuS{$ĒUź™õa×rJģ¤aŅö4*ūUź6œ/ž(­¶TŽ‹‡#6×ūT=KGBįśšĻ°’Æ£ķBŲ68›¢NvOĘŹI™+Čr“†Žć)kÆżu> ¤,ōW‰oOY`½H¶gp‡€”\6^ ɏ'īżhX‰łĮ—IQp²_•Ō'ׄæ&ū‹a¢ķŪ·cĀvkęŒ9bŃ”QķįF’×,ģyyhؔxOĢÕ O‹Źæ;{Ś *ż1ć( [‚+dŲć¾o—c„𠣆½RšžJY Ńs!®,ķ³§JUk±V>ū}ÉÕÅŖŌ¤† ŲFĘzŹ…üAJN?ü]ń‘®'īõWī[Åü2«~\v‘'Žæ©A+Ł/P‘}0 ŌSN{ü®×ꔸŁ'6“¦(!äP@‰³%ƒÕjĢy†pߔøź‘0ˆM”'Ģę›ĒT>ÄŗawĒYEAŠ""­å¦ČÖ&N1ZYĻ0‚IČĮ ŁŁUbŹČøaeÖźFAÕ0×Ų±µSAø<äU½TĀb}Rb7j^ÓO‰e?lX/dץy䤿ö¹+<ś’ą_4‡÷ōxåģ\sZ<č,éŁw“HČjĻæ0\<æ';ķ éƒĒ…“³œ@=ń¾«¼‡‡NĄS™øÄ5óÜ®"KUę$“rRōåVć}·ŹĆż­ĄÅSä)ż»‡"Ś5’Ø”ļ·šśEm•~aošŠ\Ŗųk¦(•†ŚžĪ|«,®6å÷MœŅģœóMę–ę•hĒĒĒGFFœškYæg÷¾Į+©ĆNĪ”† =XŠWį`bD5{Ī\9W™ĶęØōł«-ŅŹŖÜ€Ió™Tēn?ģśņ×øÓÓ*]'J?kĒaˆcŻّ!ĆVąāĀ$I±„B„1ēāĆ.ÕJ£ ¶–ŹI;¬fµ¬Ea&W¾”–§u®ņŔæ(„ œ²¶ŚXeQ¾Ś†»óOė©ÕśEjĄ8… lŲŖĶ#½læžę_sąæ’ųŹt8÷µ[§…Š?ąĶ^&Y@–F8ĀhŽ~kQ ɩڅīÖfso'6­P·«³Ūkŗ"åŹ÷ēŗ‡ąó)…?z’×aƒ ė3/é-WJ,Žī"—ņvNŒCŽ1Ł<ŹśŅ„ĒąŽµó«Ÿœ°m(¹ĶĀ*žĀńד(0½äTsƒ¦yčBJŁ®*ėAƒ“­å,śķ~ƒÆwNI?Ģ …™œ_uqTåņļoC½‹ņ#Ō>ą ©ąōÖ(:•3”ękĻ#Ļ)tė4¼o9#šglóśŖÜ„÷äpéć"՜żV}¹ŪV Ć.ųŪóy¶‡ĶSCŸ†-ø¾W^®jĖ.#§øõ;ńOŖŖGPWĄŪó$soe)~PųĀ°*Sųšs•¼˜'—jŗØuh w:£ˆZqT÷ܼr,¼ž 3°rFķčV(Ä@‹OĪ’O­ uc2ŸŗŹ„Ŗįqģ•5āÆÓ‚ōb±R™vh‰ć¦¼2T€ ČŲėŃZAą02;Y5@šĮŗ)»P4ļ{}Ē-Cy{.øĻĘæO^8żžņCyŃŽĪŻ#2ś­…bš[ĪČ¢„ŅŽ°ĖÓżaaÆ®zv#j–>ŅĒDĮah÷.7nŲ›Ysž»'IRx^ …•Ā÷µ—ū„Ķ—ĢŒ™Ń—䳬Éŗ®N’1'G\{£u#—%GQ1»fŪ[°ēņŁė€_™xq6U”XW¾*'†4 ;†4+­SŃøōÉÖ>¢nO„EE:^)ÆĄČ’!ŪĀ}wļŹqoĆÖד"u€€”0›“Āš>ߏ4÷Ü[,6˜Dt½ÕnH‡ŁOŖk‚ī9uŪW!łÉ]ēųŅ…hyÆ ŽlƆ^{+J¬ø9ö,…k’I?buŲxzć&I²8’Ą6†RGāāō–?•”VJķܹSR£¾GR”\퇅ä¶!ĪØ«j‚•{uÜģŁ śģ­¢.lm^/²QēzSŪ$ óĒ19ż*ƒ’S’"ÅŪvŲāZŲjIŖé‚Ÿ~,ƒĀąä*śœ¦®'"µ§ŒCŪ܏ƒ (hhłÉTd…•÷@l?ė«2„Ūķvøć“3"½e7?ż§ļ]ūü×}=}ļØaƄb„˜LĀ&k“Īć)…ž¶ƒ ßŻć“½H:.1 ąž/">gåYŠ•ŅUõg¶“t!TlČ~–µcöٰćłēEŖm1pęi”eTæ"<ō[M J†zĮĀ%•1¤JušądĄ*vß•ayØqv»JCA¤ļŲśGĄŠÓyé B_ōS÷*ž¢eŖwƒVųą¹÷ß*1ī{eÖł”[+-Īx ąß8@­„ī1żm?”„÷“oĮė}Ŗäc„|ˆ+š }*APŁ©ųH|ˆ'„9eo¬'dčČų*Ä.6ł?^ĆŚ[O¤ÜöČ©ę6ˆŽæ®xšķÄ&Օ^׏æßw(źĪkŲ¶ wŌ ń5T[u —’Åą‰ōąõ fRśŌś)i?›HŖBI¦<īĆLäė|:¤®¬zņ’ćG¾ŗRY»j&<äŽØź ®#f’ŸJ}Ŗū•ØH“ö-Ép ł•Pp怓'­ŒV9‰‰› IéŌ&š ÅKр©eõĮ؀Xt*ˆz1*’ˆĮ@?ųė’f’<…K-“Ełśøń lP}有>½ĻĆ. »Š1”S‘µ <ļå\†,ĮkóøUŽ!33ū,“‡ż0Ęōz½8ŽŻ"4(rS™Q©0 !Š"ģ…sg'(Z+į^1«+ć·ó”7Šŗ-ŗ’HYŽ» /āƕSó¾Åļ>[„#a6`<čī=åmæo Uy# ąōĢ„_§S-xżę^…¢h0+ł°’ż:ŽBõłŽrp@j„ ..æNm8‘9ź@JßČ?D()ōĖXČ!¢œŒ•“Äæ-Ž‚Æ’ķ—?Œ •);F)CĀó÷Vā‹U–TĄ˜ÄYŹ9Wc:©@£F”Ć-m»<:8JQ ½\,}ärZ»GqI›„œŗ6»šec¬[Q€ ”Īh«¶Õ…ėg  ’=A$ŗ”"ܧDÕ(ĖŽeN"פ…Ÿ J͌i"/_g™Ā}pE©ōHFėśŽD|”õ¾;R„Ś"Tµ§–šŗ6ąG4£q$2—W’Ø9›Š S¹üå2šŻœ½÷ÕeØ#BŅ~XĄźžDeG¦Āņt)‡‰}£mÉ1ŹĮĶą"7•QĀąYś°Æ?T<ģ[×u‚Ia»¼Ā«[„ «üŠ›7ĀŅ™ĆŁĘQ…ō•bóĘÄmĮÅ抒>3$ ĀāR[śßg†‚žAńR¾—£Ź‘ß Հ3pfp*ŪeEw~Ę#ŔnĶ„lĪžÆÆ.ŪgaØŌāQ¼e˹ (6{B pßńķŹĄ£¢šC «µ/ŗ^õMÅ®Z޶vnˆ +wL®éiߋCaėps¾Ģ°­l5ŠĻÖ÷aį”šJ$€c@)³7v×_]ѐ<-wīŹĀWhBūéBg­tØPKTfwe3@’ŲQ‰~„ÄE‚Éń JČ~“€\§·,/:ŻXņŒ#F%qŪ Éķ?ÄlˆÓ.8ņع}#½kŻiuĀ ¤„‘ѵżå¢gԚ@ٰŹH@Œ#£‡YEqBÄbņģ‡Xˆ@Ąć“l@ī‘ PĀöNżF>B׏;mfß…ć,²( ČB[Nč8‹D¤{¶ ó“Ż£†=žž-oīļé§Ż÷øā›˜ĶŪńHv†8vzįæ„ŻPD %£p(uŒāh{‰ŗjzš~Ź é"Rbā^$‹KŸ0Ō>½ņ¼ ›„7åV÷ūÅŅX:ž*Ą†ßG„Ąaūu¶~µ[ΜS (Ņ}sŸīŒmI•‡ā "Šā€¤h•“f`  Tõ ŚÓé÷&`d7IT€Øu1sÖ:ݦP+ŁÆT A”abH(ɧ}X9d±‘ŻÅA‰™lnO,ĶŁr9ŻżŲīKnĘ%†üūÅGݱĮÓnŽ8J(aØŗj÷ɔF•$$ŻFą p»ž339"LiŅi¾„œ0&½ÄNoąlU#B’ÄB t«.s™’ĒmĆ*`æņ… {ižk€86y'6†ŻĘ"č¾KEŻC1†ķžP/ó.)¹U·°”‹w~!0ÖźĆeĒŗ˜b¶M12(@ Œ\Ķ"b†Ķ}+NĖʇ=ź’®lżś#éļ]”ķ“rtv3ؒŸ(ļźĶŹä…]΁%u”`ÅĘčµ/U6g?*5C Ž…ŌÅfƒ¤TSk÷ ømŹį²QUž%i°©øšiT&²ū=6uµ„¾xWCkŹXP]”oŸzsf^Łć³éüļ;écT%ß¼»Ļ’ģ½źn˜[ŻĢ®ŌÜi D?wŗ#fßō‘Øŗ’_!0ap¦ŽņE«ÕŖĖ—2żT‰×ķ, Ī9YN„€ŗśĻ×l޼U!ĄźŪn?oŽ?’“łŽÉō*ŸHĆZØKü ½s.uv9ģE±ØG‚”±WöĶ=ł(sbc³éq#ƒb}*pŽGjłx7l”öEŁŲB&Ź“!< _&·é@™„|MkIE™ ‰M8+£+NƒL³+Ѱ‘Vźh\lb„,?tÉæT3x _q’$IBŽY*V¢ˆ†A¹QP]ؑ‘ÕEļW©4mßØü?Ģĉ$Ī+h ĀGæÖįŠŽĀZģõ"7¼Ņ±ĒĘRiż«:č`¦ę„¬ÓV¹UV°s˟ó9 ęķ€Į$49Ł-K湄““Ī(ƎĻ\³¾ Ń­Ū1…Ó֕†X\iRåó`õŽ;Ź‹½”DčŹ6a™rE¬Ķ”9g’Ä$IˆŖuŖż;P•¶ݾ•ńā}Ņ Ą¢T#Ą‚Ąi}Ķ&qĄvYaaĄkAŹé[ˆŒįr-K¤ī xŚ12Œ”Ā«ˆ¾`erā'i®‰ !ŪµģNå=a'@™sŽYī*Ģ[åćTŖ#@АpS,ņe҉#f±4ÖQ@0Ėź+ė)¶ŽŖżU •Ā|]ĀĪ̼Ö¢‚n·[§…>ˆšM9GhHD Be˜‡ō(6ƒ ƒT·+<ØŖJxĆŃ««¼Æ)kXÖķ…ŁŅHšzž98z<8ĮēožQW†°SHzSķDå÷bqžÕpÖ÷ŠŖk 3fnö =½|=ŽĀ’šæYč-X öĘŽé”°”W‡pÖŃśösėĪoÜjmV– cå¹8V4<œaš'™VjqĶ=÷­\µ’­ŠVŗKvīŲ>:}:ąŽ™o J”å2įP69†;ƒüĀ >~Š’Æ‹Ś+[¾÷Źė;tDdŒišcÜ;MĪ\jųōØ"ņ‰ĢgŪo6F“aXõ)•µbxB¬ąuø1‘¼ˆļ…Ī&ojŹ„¦GØųšXśxY)ōĪorÉy5æ„Łć»‚•”W~Źo k©ć“w=…·)G~{Ķ„åMśQėö.oēc’U¼/“„ •φɉn§Ó‘׌¢øÕŻeb­±œ{?(ä5Ļ+°”T”ŅGɎßŲo %q cø™]Ģr£Œ‘ÖŸY*nH/å^YŒ…žI×y^–‡Ōéŗ.pS‹ EŖņ@å|q g¹z„ȹ‰œ Ń+‡E7¶/Źč@čJNÄ9]%_ƒƒ™‘±‰‘§@fŒÉīŖ¦hׯķē¹2mÜĆ:-c9/bٵä }7&§­%«Ų“'”aøjl±4²ć•÷ Ʀć.@Rā$IZ­|ßéT’Ÿ Ū+ĒLęĄĪ=Ąģ§„‹¬X#¶_W•{ŠłQUz­ŗūB0Ęź2äõČ03k­ź“ŖB‚&sØrń„¬2]Ģ”Īōrź[éŠÖæ¶ "RØD‘Į=MhvŸĄV­²ēyŠ;ÜWܱŻ’Į±öŠĄĶ_óß R¶„œUØĮõ •µœ¾8Ųß•jØ]5—jj_Š!ī% TÜK€@IK^dYY†g“Xgķ0Å<æŪPLņėßSŽ‹éqįŠj­~¬īā]¤R—?sI1r ńRgv °tł2į?E† ‘™9mš8ū;ߢػw+U•åR×­Pē½6MzÆφźÖųė×öQ¦MCiŁ}S)•RŽ=&Õ^Ž­«“da.»™ž~rZŲ/b²Ƒaiƒ,D<Ą)p*s¬jѾ‡˜”£œź© ”2cņbčÉÖ2T€ >ćJ’[J§Ÿ1²‚9ILŌ‹“$‘ė!ĆdņĄŖ05dŻŽNå'ÆPķīŃ–xūJ Ć…'IÄ[·ns™0¬h²āČhĒ Ć3…]»Äąī åC¶/O¤–¢• {•”–K2¼«0Ūg\æw}UpB/½k<‚ż–VęÜģ+’’ŗ:H"3±{²€Ģų¶•;Œ›ZNÜ.ŽMY»«”_ŁŌĖży §J…cW1ex ”łuŌ$¹»8ޕƔ×@ŽH«¢«*#ÕŁ’]ļwv/yécéµ=”ńĢ Æī.į%{RģĮ³œmž¾}n„Ói6å0ōa}FĮÅżJ&p†³ż¦Ņ©öÆlJ`Xś”0°įÄrŸ!“9K•|8#G£ĒĀqa••u ŪlPt,ÆŪߙ¹ŲĢžœR3ė@yģīĖhsՓAVÜ hš#Tmé}䔫7g¶©$IšU$¦„ ×ʅ#CU™Qā½čćXwN åļ8µ7µ'ƛˆA$ ¹»īōq›óį=iŹŻó€xpœmŁ\Ć3CŲ ˆøÓi»m([édĻO¬B eŲc鹏*šŲ æŸ$IƒݰY1T²ép­ųqBw}¶}R¦ĮL]Ājx€nøĮ–Ź¤Ģ øs÷nųĢg>£Z­GØ@UŁ" U¬žJ Ÿ½²šģ\µ¦\EšĀaš·Uł*T"\xj;Ų€k­ŗ–„Ād—.ŚųĆ=D"cŒ=g®Å9˜×kBcOK¶Īü°ø-CžnF¾ŗYEŁ\ Ą qŪĪMōŌνHŌū‘CøÓĀĖEDQV Z)†¼Ž×V`UĮ ’¹]UZ¬ŚÆ‰Ė Aˆ,2K’{(…sęĪ&²Åe3Ó‰@kt ‘åš -ģV­Õ”gfŁŅ¦8ķoåÓĮ–D¬B²Ŗ÷¼Uy"Č]Ė IƋRÅ«­ŒĢ4 õz‘+ńōßgMh`HęÕ$„ztlŠu8§M†uī›iÆuS T°Ź=8'ÉįQ<Šu!ׯ”ņī‹ż÷bЁB„$1½^”$¦ģÕ·m­Żi­yš”‹ńK`6IܛœŲ­™ €ÄŅuÜ7vJ«-všbUĪ2įŹė)Ä/9BµĒU·#yÆA`Wtƒ)ŌŹh'Ū÷ Bø1³Y  /¦ŗ;Ņ^D”«lģ˜ż%”Rén ŪOŻUPh‡įĮĒīx~o+Żn׊ćd½‡ńF3¹”˜qM9ņĖ"…v’ʆˆĀiX÷^ĘX&£žM™Nģ—oźŗ]QøbŲ(®ŅŖpj”fŻĖī”ņnŻæąĄĒℲ(¾ĘDVģȵtĀbī¾~o9j¬\ŠłŠ ”¾Wžż°Æę’Iīo0³ Š 9hiWBTHĘ([fē$įvķ©™‚ä ūżŲąžSp¤Æ:Iš=3é³S²÷ oĶ‘Ø^˜Z듬‹Žµ37•b¢@kxļ{ž]ƒdÌJ‘Ų`żóæü0Nń(Ü`hT©V_Łé=岜/æ×ńŪ)ļ΃\Ļ^æęęÓ„:^>įPj38Å[ĄZ.1jP¹KŚĻøŗ:…€ˆI’$ k­%Vö9Ęā\bńµ]«īÆčj“Ļ žņ)ŠN/„Łc.“UJ(jčX® 0¦.¦\ʌŸ†ZkI`t PVʱ+mO…×&g¹ÜpĶEÖ·ļ©ŅO,hĄ¶bß”‚(JZ­Ą‘?•‚$!'ķNK2`Š­0 ßS­A šŒŹņnnjncdÆÆ;»2©‡”¹īŗ ©“×ŖdM7ÓVt™Z‰­ÜĄRÄ lĖ«›¦lŪ8%üūv;euč¼TµćN śKŌēś9µ]šNŃ·ü±­°Ł£ B-œ ±)ÅJ]öĖ‹/øą‚Õ7ß8wdō˜_4}:#NFŃӟöŌ÷æ’żG‚yéŸŲ•›syˆ0Øó“\<“5#żst|–LAņtĈ˜ˆŌ~OÆ1ʖ–äY謰ĪōĪT³/«ę*#1…@\‚/É6õUyņ6Y†…­ƒˆ •Jæ “Ö-*„˜ Š¢ É4³Ė5<·Š)÷ō+(<@©o™wǎŖÖ”4,)Ÿ[Qk,v\ū’ĄßÖ>_^ŹėRŠZÅqRø»ŖS,7Ær˜Ķ›Ģą]sņåS/×aȼ‘w æ»ģņ£Ž:jƌi~V,Šou;11DQ$aƒż¢aĒ#HCiōós»LŅėI„ŗ;jĀbBÄic#Ńd ÓŪ!ucƒJAL`N}Ž©?>’<ĶĄ!Ōhg:)¾×_V»®µL—’& ’żĒN?Ɛ$„1É÷˜”×ė„ÄtrW”Ż@+K3œ/*ŗy«xŌÕ-͐u” /īĶö-칯,vbƄ¼ȹ6“rJģO9±e®ŽĮ”ķ.j¾äĖžäō;käR•ĘķwcƒšƒŲ÷M:ꃾ Į†]q pTn£ąź™V]y¬ńļ«S×õn3ŸOM?诜Ę›rļI@® /°į~棻>_±ņ×ĮDŠ' Ķ@>&Į^A]ʐż€Ę~;Šƒ(EbĒopT¹—V«Uż ’ZņĖÓ¦Mó)yĆÜó˜«/;ŹT.Ŗü88w«Œź1Ō05 kŖ[(1ݐtå ¤¼‡pįš3šGźŽēĻOæøSÜĄeD“eӆ@i²€Ÿō”''†aoleĮĄJ«³Ź=½o7ްJŹ$ķ†7j¾†a—g_NK]¾:°ó“m†³æ4½&—l“ QņĘ*ŃÖęĆYīQ,Z9³n68ģ°Ćf̘ęw;Ååźz1ZhNzs> žį.¤Ķ„é»ä(×m[fc*­ eT«#÷ōL՚…z–R­ˆę·G–MŸ¾rž¼™J/ž6mŒį×?½šŪ_üR`(Ģč•»ŗ.É"÷vVk€&'»e©v‘CÄõ·;!hOøÄʉ•³Yߚ±Ÿ *d).€ēs L¹ ŽF…EWŠ,T.qMĻN ‘›{öŗ¼ś]E•Õ:ŲwSsŽEØrżņī²9/‰Ÿ•xņāŽ~O¾£tC’Öēčl0:öt® k+÷ĄJĀm7’ßEčœö¹T¬ņNkPźĘ+›O qH%į|ŲbØæź÷:{Źżn{‘8]±ź_šB}ÅÅK,)Ŗ÷¾€Inų×%ģiG—Ž5Ü €XC…¬āš}_GÕēvSŽŻX÷¬CldyV^žƒnÜWVtµƒ†ėĮ)q•”Ž$£“‡@b ‰ļ¼óĪćŽüųDoŗŲŸ*˜6mģŠƒū‹Ė®0-dąō€s©N°ŽYöć8«½:“§®ģZYž¬»0h¤e‚¦ŹuVÆż¢”¼Zw/~9lė)L¼2W¢/ź^W±Ī­÷ōµ¬0^_ŚHE# • Ö2&Ęż0dĢ!X$ō=ZŲƚ ԾγP‹}ü¶ dł„a¹Ón·Ūn·Ó€›ķŅF$cˆ(CĮlQōTYŌćµ–,Žb¼ Å©ćHöŽD¤MD$Icj€Ø·Ś!‰®µ/“CœlEҟ>ėJ fž/WWdģ&™ĮVD09996:Rõ@‰„ɐŲKj\¹‘ć‡H† Tiüŗä-ŪįŁßŪóū×LH¬ SfAÅ©G·Ü›ĄIlˆØÕ ½r‰±8?§Ēę鬜’ÆĢmķ °±zĖJ#ł"ŗ>>†œĪ쇨øvķŚ„Ė–§ŁzzŻÜ ±[pžX”KX„Ź<¢CAŹ`"f8T²8›JNķōjŻ*Č÷»r}Ē"z莻<š10’bÜcccŠ 79nfĶčÄqܙ5÷žu.Žē‡Į­M -3ĖHŁX®ÜķXŁ!BEq&ԜŠ#č0ō9·o€²x·Ū ‚ ń÷QeĪCŠŁlåŅ4V„eHV·ßbņ ĮpĒ ! Cæ˜ēWé²óĖŒä ńlŻU(K×ķóeŒ:]³"1ØuīŹ}9Ņņ&VÅ/¦M/ĢzŲ³¼ąvžŚ²f.čxq%²ÕėõŚķ¶? ›pŸóŚś:®9ńƊtƱ$“Ņ–qę÷uĆ>8°”t˜Ż/ęŗ‡”ħ_»;"RJĖ7&'{ķ°å8,9÷ŠŅ“Ā0īŚµkśōé…ų°Ĺ̄Ņ(O§l8œnóPŹ›I!ŠNn…öÓńF2–¬ēqm“½ōŃąN<`qČś—c‚ś·+Ćqõb•`]„˜»_=uĄu°J?˜1§cŻRK÷JÅŹ!­ėÓšsąA ńJ9ė¾eœ†‚YE>,/ŌŠj½āå/ß1Ńk“"€½ńīKĪ8Ö4¶‘”,©”^'¹ł EīĪY†">Ō9q<Æō„ˆ!Æ/ę®]Ö¾‹ éDĆ 5<ÆńÉņ;ĻJų:pµNÕĢ—‹Ģ`R•’D(ČÕT.j÷ē…Ī:_פ/BŽgƇ tAHDŁĮę ā³=·“TU …UGQ”¤MJ¢(Jœ9»)_cuČĶķ'‰ćlĮśŖĪ®lĮl„°Č^r”yś²Źöe§kĘšäd<Į|”++©XęōźĖņõĶóæ°Ä¤›C:ż­I)+(åņ»Æģ‹PÜM¬xc¬ęēÕ8ģéVöLrRj>lEĕÕtö•«*Ļė’ä“ółkJnŁ“K ‚P‡a˜©)Ū^=&X›–;ØÖM{„pr¢‹i6’ ˆrłvó‡Ņøté§Xį.Ļnt>%’«*ÜTźŹ@<¶gnj‡–ĶéSL`’„$švNV«żĢr¬æ3ۃ¦`ö‹ˆˆ]ęD#¶U)ź슣-½‰ķ]€I†nB“;v,[6cl×ŗßžŠ3u7B&E‰lA:”AIĮ #ˆW;ƒ"Ąž–m¤A$‰);U‰3kéÖjµ ¾²oø€ČOš²UYx(ÄČe³nF%ŁŅ®a§e"OyĻī©,\įt›€ū¶¤Łe®ź}>ß©Īʐš(­rĘ`…C¶üÆSfÉNJ™q€RČi1)/e—‡ŹżÜS ¹ĆŚæd’ŹīŗØ¢_<­q«²®‹Z+c·§%IāFŪŽł®aÓŃŚ ?BLńéAAĆ"dƒĄņPźĒ”_µę0 1VA³ŽM<³Ų†@QP¢:Ō·æųvÕtŠ)qß·lP©ŻĪóßD]vp”ßޚ%Ė¢«žh߉ŪH„æ»Ī|ønU—Vl¹āŸSb¬kfvįö”ĮØ ¦,; ·SżblŹ0€śņW¾¦NLF1#2`gt uŚ„Ł8’ŁĘOŅœTeIƒµ¾vxɚ!K…Qœ2s v1¹lU‰Ō­Dżdķ*/²Œl'IŅ,šÓwœRny”“ēĀ×ņys•¤9ķŠēÓ7ķļæ"°h29Š5`hŹDŖ°_éJeąp!L—„9™¬ ¬ÖŠ EŻX²?7ƃ ž9Š„ņIl€•²f¼’Yč6L鞲ü 6LŒ55Nž ×&žy‰I(KH°ś$O]Ł Æ'ŠU¬§2’k™«A“ŚmĄLž›]źĢÖ„ĄčńRJ{€Øź²Zn pčhĘ”µ2{_ ØAØDmŠŗÖQĖĻřиkNƒQ®"ŠŗŸRŠjłÕE–ŁhÓ?–=K4ŒŻ•K•:F.äēŒ$„*‹h”0PAkd&I””UP©¼KY=ŪrBī–ĘĻ œ/•«Ģ5&jåÜ|ČJT¶ŚįLNv]£cĆŚR”V*­Ša“`sN]Ü}cH×īON­õØĒ(ĆaÄĖę͟†3FAµIu@Lv“®Ķ½ žœ¤IšåļG“Θžō'œ 0‘ TŒÄ ā( ŃWĮ'ōS&YP²į0Ł%ę|ŌP)„{Ø9z*q’$½^O²Jd%1pw—1¹Ræ€=m|ę\få=vwŹ—2mJVš—²@1s1Nbo§ė‘‘@±ŲÉSŃu©0 „^Õxģi~PéU™Ļ(¬VYęŹéėĘj-¤×]Rą4‰D¶?~u‡ø’Q¦ē —)¤łanм¼Q*­īGuEać­ĢĶ*›Żi’$ĒV"×·5­‹ā8ŽÓ’ńrŸ‚_ĄąyĶž§T ÆćiÖ:!” ;U*Œż Ÿ ¬iYŖl mB8'eßäw0`J\—ŁB^¾¼ŠŗYnMœŚŠļ µ}ØävˆQ®|ÆbÜ÷½ņŠüu×ÜtTŪ÷%F²›¬£{ępé'ƒ˜ēÉ® ż–»Ņd‚Tм²=xX6$ļ%ļ(­P:šŗ²c»€Kū&.( Ą¦ 'dԊńž5÷?ī¤ć ńXŲŃ †.š†];—-ŪHõ­>Š”‚ŸaU ŖėičYĶ3˜…ĪīĮēžcÖæ¤ü"— ś÷Auhįœ“4»p4ļõjE(¬UŲIŽœJuf| õ˜Äa}†›w&N¬÷°†Ų‚°B™ø¶b%TZr„_ĒKįŠ µĀÉń.Ph£ēv§e5l2ūēY,ZeĮ^/€ĪH[:™e]t»Żńńq2¼TĶA•ŅåĖ妊|)Źu;$Öd™Ÿ“‡ŹxhģŲpļ-ø¾ šķs2­5•ŚJ|ęGĖŚń¹Ÿåį šwų)Ž*k…*@­Ļ¢ļ……X>4Ś*8äŁ¹ļÖ7Bx#"ű˜mްįį‡r­¹n-;š’ 4#ō#š}Z…éšÄFv‡~®uYį©x¶Vž³~Tęm$ W ¤CĮu#“a(t£gœ)3aeĮŃķi©sW»LĖ==¼īaPŠeŽ1±sw÷ŗQĄ“Ūį¤Ų&žv9˜¤å³fƝ±jöcĢﯼjL…Æ{ÅæśÉya7FCa+€ÄeÉŖa!śr½ÖØ C9Oɤ–(*”* Za»ÓÉLĀŲVĻ3¾8‹|“*jŻmV¦?™ē–ÄDqeül%棓BL«” ‚Ą3r³]¢Jƞ%{ˆķ¬–YééŽ)ėw K‰ÜżĖ(²¢„ S”B­Uč,FÅ¢æ½xÅ£Dkæ©Å½•ŁGæv\čXqé\Ź~D?š‹õ>°Ń÷bŲ®µ†dB¦Q‘ĀŌVŲ£#b꒒bÅb‹ ®+²3Ņꔉ …ölż0Ęøīž›c@®„Ÿ@2Y®Ŗ Äy~MŠV [UXLē²į5Ó(øH 6䎲õī*¤œØ„ŻIPוJū`®J!(TØäE0­½Rbz“]%"“$¶_ ęĮ«ŲÅX%Žļ¹óĪŋ/Y¾,Šzß}ö9ōŠCļ¼óNĮH¬v×0 u'thUh²e\“ >ØŖP>’TõžĶ«dfæcM¶mÉmŁ(•y3 AßŖ+WżØĄłĀbīę.xŸÅ‹¾ū­o†”Ä££Į²e Ǧ…ķ6 Š[!DOD¶o$¼o×ÄNNÖnŪŚ›ģ…Ą·xĪs^ü"5Śiį‡Ž÷ž‡^«ZŹ`(0¢4ć&ƒ«¤č®ņŚ2I †Œ‘ĒzN"€j7ģ)ŅŽŽš²ē®Tˆ†,‡Ł–9Čß<џ«’†a(-īLljldĪ>åĖPÅ:O’[īWźW-ąŪ ĄA ŗŻĢģĮī`i2Ø`rrŅŅļ1_rEÕęb =®Ź’kÅqƒĪ÷Kc¾qĄg’•e_g,÷ŻĒškš h÷_—«73„Ėi”d=~Æ¢%¬©\3jšŽV}ŖQte‹Ł ™§ö¾å‘)ä)īæN±Ł/—÷=źüŸh­żo ‹…›ę21ömS”·‰¢H|;ŽÕB愧®?µ†ņ©+`1T$Wˆ€Ć”Ov+Į!,dŅ­ÖŖ}˜T²‡¼ż¬&¬¦B*ßšŹ•[{†¢Pšs/ÕF‡{jDŌėõ:N„L~čl|ōeÆÉ~mŖ oŻøyŸ… °¶Ulhiuģ±ĒžņŠĖ@CD Uóór†OĆśi• ŠĶ+Ī$X|Ż Jżi ³Å7ŌŹŗˆ¢×IA Éśå³¾ZS{X°,H {żĘ’żfwÄ:ĖOģŲE¢ŒˆØ½‡zļV¬ų~yµ:ŚN UŒˆȊ֊@“Pž¤„SZŻ‚PK2ĆØŅ6ŚÜŠ)#7ń ÕYłU«a«‚Lž ­˜Mń¹x;‚gjP°ˆć’Ä‹Ģ &»8Źt”Æxpѵ‚}šOqE­N»°ęr”Ҷéę1F¼o *÷īĆZ²Meéqa&„_—üK%¬«:Qbā8VJ…eBęn·Ūét ą9[Ī›å*ĖŪK<ŁmŒh„Ņtɚń.˜æ`Żŗu.÷ffč:ĖśLHO®Jåö„”h,Łzxó kŽ–œNź[[¹®}`ŁS¤3ÄZ£;ģ¬$dś˜2=-.5-ēāB®ĄTIŖEt’-ė^¶xłŒQ4=sgvā8NČ‘°£wMƒŠĆ¶!3MSdHzy 5Dl`Fkäo}ŪO:ńäæū;ŠĄ@ ¶Š*CšMQræŁF$O‹%%o<Łs*ņL¶ķ`28F³ŖO¾ŽJ^!ųū†»6‘ŻX|}£üŚ)sĆA6ģ²õ“ü'ö]ŁŖŹ F€ó’‚wRU¶§S ?5 éPA|f„Za9dźk’ŗ'Ö3SE¢(ŃZūb“¦9”ZŽļįsļkŌTHļ„²YŪ%ö%N»țŲ?®‹£Ź9ę@cÅ6,a¶’ŅiU—žą€Ź=¾JgĆćs‡Aķ¦ €¼­ˆ‚bÖMY,T®Cū'ä<8u Ł…Gāč2–ĮDĖ)zŸéNž‚eż’«‘ĀĖ”9ĖG8CŌ¢yŽ6čćÕØ1‘O_7ŅdÓÆ‡S“„\VJ™^wZgD“µŽYŗuąQūƼžī;ˆI p <­ay×e•åķ²Ņ¶\«ŌšnHĘ OrśXC!ģä…ó達<Ā0”ŗ@³öõ°©i³g`_«Ć=9‘ļDń;÷ż|oČõ ×jK”Pex ŁĪciĻy5f—Pź“©4‚$Ž1Š:PbPlŒŃAąœ ‹’zJVąū xł°ØĖęJņ6ŅM§}Åś®nŸtQ*%–™$&3%f0lźT£ü)Kn ī\ ll93!Ü“Æ;SKĪ@?õĖ*Čö^}WŽaRā”ģk·/®ĪB¹Źq“i=²Ķ2­ZDcŒRx‚ēÅ N•ŸźP)1ڵk×Ģ9³e2~&ą)§œrĮ…ŗ“#1‰æõ• īČaĢéśÕXq™Ī­TmJ\¼Ķ:aōÓ]ˆ¢8);gcūÖ6s$„”[¹PS­.ć3Õ„öBFĒ Ęqš£×­¹śH) ‚`|²g ' ££Œ¢H£Ś5+…AL†#@ˆm³«-=“…†$ ‚ ¶ŠošøĮ>yJł[œgg]©< ŒÅzKE.åŸ;H¤Ńsó??· œ»¼i{1%fŗäZł¼šķ!ōĖåļb ’¦®ī#]ż©’6 DŽ™B'6ö<›ż)””xsęōÅEV>u®ņÖöĻęų!-.«A²ėGhdj¦e‘åÜ(ģbŃŖ/`ŠpGS×čR RŁ3øš‚Ŗo č7ė7cńņŌ}{įĢŚŽļY%f3Ŗüœź³©˜³łEÕŠ£X—l¤…jtšŒ ś(W5$Ć©?GjŲPŸ`ē„VUM‘·kāŪz īo½ 'ŻYźóĆ×/Ų’ēĄ4Ų#Īcü=śS!%T €ą{?üA`īČX T¾š²U+‘ICŹ—k|">³ÆźRyؾšņ0ŗ¹ĢšńO ©[U>‹¾•Ā]ū…²Ō²30Ø\D•<ÕŹŽ€²ČvĮ'|Æå^©ķWЇŁŲ¬ŗŸW_Ļéž°·£K³™S›®2$bņ:å何FéNLbŠZ+Hģ°‹‚”_Ų*öā¦$Žp±ųŹJŸ­ŅØó'"į*4ql¢ØąWT'm%z?3k­¢(Źd“31m”Äq\ž?ƒ°¦Ėķ?…°@ų᮫³Ų—ō*4Ę„Œ\`ėļy›Qó©WŲŽöĢUjøø_UJV¾1z¾Ö’6t»]Ne{³ĀóO‚œp`N{Š›Õ: CöņįŌ”šö³Ÿ=ūļžĪ=&Ėå©[Ä5œIæÄŗL§*»µĻ KИé9eśŲåŁ‚†”³ē‘ĮŽcćRqWĶQJ: lO¾ü;QŖļ=T7ŽuOĢ»“Žd·ØiÓ§C 6nŸ|Ć[ß¶ź ƒ ÄĄ €B˜6:‚Ą“1Ģ1ƒ„@#a@:0ĮädÆ·W(1&źÅ67­P+kĘ+q PökGąČĢ¢„>bŽ£Ē×pŽI1č@µZ-­µ’øżž^Ō*[ļ’Ø{Öź¹«¼°G]˜rǦėb n>7Ėé–ßõ$ŪbšŅņe(…V5S²öV+Ųą0tś¤†t)×÷+­wūF •1Ć Ēś`ĀKžGÆ% ՙ}HäG€C µ4ÄN҆ć“Npō«§ōQEŸ.n$ä•AŻĮ~xFˆ^‘ŌLż¢³vā©Ėk5¬„Z9u…ŹŚŽ°±ķFÄäģ—P«„LYŽ˜ˆ«›ūˆīVßڈAµ²Pł?—‰[UaõZœč¤ģ³ue<@,{ É­ŁĪ­N(‚Ÿ €±(%IB½^\|saq}.-1Ÿl¬” ø/¤½ŠœĄŠŖgA±JąŠĖPdƓj*„jl(ć£QÖLčŽ·Ž­¢S•źÓŻ-8§58U@Š—­X»&ĒXō,?ą@Ķ@¦vB¼ N¾Ā°‚rŸ¶PPžp0¬æ•įƂČ$3÷z½ņŁé¬)!Æn 8iAUē¼»‹ģ<ŌyV®Ōų_ˆtaĆ%—aŸŗČ°āN«Lć*%øŗū ®d˜ė?ĢP#(5n! "rZĮN1+->28„) Āv@¢ĄI¤“š™ŲÄ”EŸģµ!č–0CDe‰Ø ISĀ 4%¬@±J8Ž@"Rzr¢kq%ھ@˜€‚P;ƒ+h¢8!-­ZĘ@iBėõzr›Ib2 Ł‚Ä:2rD˜“;-F ZZDŅģé“ĪL}üå&Ü(Š”š¤³×—¹– 7ī%`dOH[IĮŚ/cŽ3™ˆ“ÄÄqbØ)gAhIH <>¾[°BłNīäՖŖ(¤ĮŻ­šUęÓ !?ČpŌ‹3ķzNo–ĮÄäōcÜ£±w‡˜c1āčč4{ÜaŖó‘-üōØĖBPŻśŒmŅęfŒ •ķ<÷žųSŸł ˆ¤J£3!ŗĖ––`p<[’ßm’²·äƒ"{,ŹJlh–+~#•ųF sś½Ēµ%3x‚R Ņ&NŲ€ļP%[ؤŠĄj՝č:6·p’ČT„ vbŌ‹Ż)oČBl’{ļ}PĻuܝ€5:Ņī“AaōпѿŸõńßžéŗ#?y4„„‹¦-YŠZ8³ÓcŲ:>IØ €Š–=­E:ܬyš^`€$vāCl@ڼm©Ŗ¹§  üó]¾Neŗ 5P@˜Ęy5~…ł–E²<įĢyH+Ų6h­ķT7<>>EI&3ĄØR×%L²4BTŠ-“šŚŽŗš‰Ųĉt³ūݧgÄl…ś½śõYeåZpķKåÜOrÉu%dĶ~Ge¢ō:T  l·ģ5Ųq碮^ŖŁƒČqU‚Ć ±P9ŃŠ R¹V¬‘ŖmŽQėšr 'ų®]»üżGΦv; UnJQµ`ʘ$I·Ūķ£NjuPimϱ$Ż“ÉH©ĪW+'– -e e}½ 1U,V{Ż>©”’µŹĢ-ˆŁ= 9ł1łŌZA€Jqžāɍ£(*źćx9fِ¬Õ‘š²tuń&ßQSöZ”‘²fn…B»'Ué<å’ —Ż÷hāR»Ļ¦2Qt°€ē‚aؽōoP4JNŽL"?åģ ūL Ŗ!įż2Ø”v«lŪ–ä=͊¾Aœ•63Ė{ģ³ZkŪ Œ€÷Žsh‡”ƒ€4ĮW¾ōULbĄŠ»kv®Sź«;*‚ųÜėõz½^>…®-¹¹Ü8c2’*'żUiz<”V]ž¼·ą¬ŗyņČ©ōUxĶpEś1Tń{/ ÕE’s`(6Ą†‰œNf¹[8ƒ1IŒH§¦ų’r+Č’%IEŁ6Ī’Ź2sNFEi;$< Ć@|,e™ŒŒtlµ/}„ Iˆˆ™@k­„4ŗ’,"‚r’‰1Śķ¶x±ؘ–ü}€ c ŗqd»×R2æŸ÷-Xóۈ£5Õ»U'†IČC‰b×+… LBI’{B5U€:ŌE±„ĀĄÖF%WØJ¦ŃŃQ®’ ”VpiiA‹Õó ”ˆB±¦næņQb:vx`N#J\su ÄĒĖ×cŃ֞)‡Å”‚ šÄ 2#_±,ĘŌń/Ķ£¹Z#“p’ŗż0Žc޹m«Ų“¦f­Ś™;tšĮ`m~$ÕŠ0°bßöēC”|)é„čłõĮ(°H ©$6§u‡4£sŸž{VŠ 2/’ąvÓ±ÕjłÅk¦ ŒÅ”8õ*÷­At'ĘG“Ž)ļ#‚ 91Ū6oIŗÉųx“dŁ C†šāß^Žž>ÖiµfvĢiĻna PhC3:ęXCbV°Š tF§ŁsŠzóZ¦µgИgy%»ćĀ.]iónē3WX‘§"©–²ė™Ķl®@kŻétZ­Œ”ĢĪY‹§­¶X™Ä¦ęķ\Ņ5؋Æ7@iX×åߑHµ@{)€“.šp1֘ä¹¾™OŚpS>AŗüżaOĢJīOå;ö hGFF|:ܔEyżWnōUŹĪ&Āy–ó omŒ1dĶ£1¢t8d=…<1-ӋW_yå•^xaRå RG˜k¾˜0 żXh(”«$jOdķÜņŚį¦ąF3l$=Ō‚6āŸĀb ÜøT>Ō)¼µt’×ÅyCIYTl/.›r}“ˆž§œó'Ł'{ēŽL®†"˶^6,$¦e‹—¶wĒńÖn×ōFuÜqūķ źI­ m' ³Ø_³J £Õju:w”Vīū…^9f“ÖRłž½{’[āU>eŽP_Āy_±ž=ŲP¼O²fč 0ņ¾fŚ«ZM“ZFĮ$ÄĢJ£ŠØ&'{¾aFÉ,Ó„ž°B¹( ы.UšÓߏ¢EŖŁÕbÉ§!FÖ0ٌŚ˜Ł ҇œÓk`h·Ū’ C),qY~q§Ó[k •¾ S=-«Zø} Ę;ėŖÅūQ„²A!“ØmÖZµZ”~ćÄø\ŚķP‡(PJ‰ī«_²ļSįO”V¶ҬųŚ8CŹ›L³¶‚oO*čœē„Ē~?'8aH¶ŗŹ1°0G„®ŠŹ&¾s†¢)’&2PĀl2„Ÿ²–ė©ƒTœI `~Ęӟ®0¾²ņž«V(”čHL³­æqŽ÷˜€PØeb©‚©_Q!‘j‹ßDPį*_hF(6”9䓋Чu%_*¹.Ø ŌXVkģ·W0čķN­Ż ŗĢäœs%Q’LŽtT ŲĈ1"i½³ Æ~õ+H„æś­ļnŲ¾{Ēöń$†ÅKęłóŸxšÖė^ł‚SOöÓ–Ļ™(ŲŁ *£ōK^šĀ$"jRŖęŠd@„”Ę Šb§G&Ū%LBʾ݋#¼øńO’$‰P„«3„zŲVXcŒ1$•¢ģ©]Åi|åVØ×ŠŅXėg6Rvl¬ƒ7Ä S‹ā 69.š½‘ÜÅųh›’ %ŅyŃb*“«*źÕ¢S6¦©ŪŹ“näwŹŽ /Žp§ [ Öeņ¶`@U^0}m…!…ˆ µ* Oīa^VW•Č&!āŹ•+O9å” «±MLŻ`X9ŖĆ°LQ€~ķģ}'VY(ø©›@c»ye¬į†“_&’é[®›BŹ1Ta,öłś\Ų|›ƒ¤fu™Ź*׎„ČČéįbÕHĀ\aRŁĢ9jcHDšPs ÄD¶ķŽĄ¾óē'I“s÷x ™ĒF¦ķ»ļ¾×Ży«ækMa½ "[nj(pPjóülPķógĪ€JŒ…Āv–ķü'<ģ% ėüÜ«Åy\Ķ%÷_µwŽvˆį ؼžśėwōQdX"K"VŹODŠ[Čš(`,K“ēĖ¢Pł5h±JĮCŒ!­•Sķ2©N"²‘iśFŠš¢Õ£"c”Ņ@`źõzķѶO^pž^/@ŹVY=< ¬Ą ‚¬8 C’5+§}ķSØQų{ X2­ŹÄi½2†1­V­všŸ}uń:ģÜŚ7ž¼|¤Ó-mæ¼čØģؘÓY“IrŽR;S'ļ‹ņŸ@„„v¦n{ŁØeAZĀK’$¾z^¤ĒĪÉ}.ܲe¾Ķ ›6m˜7o§l+D•[„ćaJiFr~&ŕ ÕĆdĄ Ŗ Ļžą|N<9ėøŻ-Y?²r>dā¬NDZ™Ó5 ¦ @@ŠŹk”RūG>Žō†śÖ×¾6K›ČĄģ#I’tŚŁėµ[Įd”t Ų2Ģsžłäė~óū Ę09āqĒ|ėĒē(PĘlŲ°é–[nY·qĆ 'œ°ßŠĘ­ĀÜö”2ämK=d“\FF~† H› Š»wŽŽęžtĘŚ @ņē(Š:¶1¤•«ļx#P#¤Ģ*·‹‚3¹0łéįā“vč³’²›Ķ+B­ R£{76lžö’zĖ—ü„ņĮ”OÄ˽f…±˜µ·‹Q©œ¼™Ā† ¤ŗ¬L bE/4Ė~ßß(‰Ņ›÷ĘĀDČpš8 JÜąAŸ>{Ežō©ä$6V5h²NYŠŪŹ]ŸI”}Nv+ęš6ctĪC½ŽlóZØ|ōXI“€śö†|¬ŖåŲ>·²Ę]],²W\ššQž Įėąšģu¹Š”'b*2Ä ø!M‚))!5ģ&SłÜ•p… 3S"t_ĢbbwعåĒ^4¹©_˜*Hžr≼śŖ@!»“źźo8蹃A+&BLł¹PŹV­¬u R™sĀ‚å}å“uš„eiǽ+ĪüČ©>ž Ž‹źóįrŽ“÷Rā) ʾ&¼ƒęrN\–ģf„QTjķĢ)<œŖY‚/1čŽUy[4eɏæ$‰³Q¼1³˜•Y][zbėöAI3‰õ‚"bYļåUi‹KŅK”».õ"fÖz ķŹr“?x.>eĖæ„Ö.ł)ƒŹ"C'ģū 9Å`iuī+ƒ™3šŖœ‡ƒėiUؗū·.ĆOórępžĪy’"ŅZ‹A‹oŲĶ ¬’°3qń#fŸå^q¼j·Z†ŒV:&ƒ€œ¦UFŗ=-8ˆHĘ VÕŚ¼U)1–”ŲĻśÕŽ+ئD¬f¦hą3̳{Éåʘ„ÓD93Ā¢«ö)­)ۃ@ī–Ė.eĮ|÷ĶW¾ųŌĖ~óŪńń Ša¤­“Ät¦³f͚=gŽ’\pŃüeū(b ā@GwŸ÷wϼüņ«V¬XņКõÆ}Ć?śéĻ‚²Ļ‹ŒQWÅ!ffŌŹ–LFkmŒ“ĘČÆR½¦Į¦ė«X„Š£$ŗ¢ –÷ ™ÓœÉdåeūÕŅ:­ļ=LF*Ę€`ķ¹6X2ܼ4ōeØÜUQ5“$T”GWՄ§2ś¾óXĪIʐzåÆĮĄt’A¾¹·>Šc:5$ŠuŻĖ®1£®˜Ń—¢Ütmi½\Člƒ+W׉ 7t¶”{rźA_ęvåßg5•ŒOn±¦8Ž)Ób+¾–4Šœl}NöL®Gź»ĀTtćiErͽ 3Ök9£)ģ×Õ×\ÉVåžGĪ Ó{pźF]kĢ÷vŹZši„åūā“××Wõ(ėū”R:ŠĆj jOČ 9ŚŌŌå?Ī’Ą¾)K÷,(Z”.RŹ—LK<l·ŁŽÖtCsr’ †•¾ÖTU2 ސSёüĆJ»Æ+‚ĖāIT¹7¦Ŗž€ …:ó·! axßōEe9$6%Jń–Z‘¶‘Ģ„ É“ź"iÓŃČk×fÆćŸ³ž_‚Ż»w÷ŗ‘Ō,ülĶŽ»Źr•ĀsŹ2õGÓu=~š$ĘŸØžŠ†®Ft‰£n ]q鯑L[ š“N{ެYJywi‚„p$ĪN“ü$Ģ(¦…ŗd&\ –C;«U†‚¬,·å»—•Ęi+oF™§įL…r…|Q%Ģ‚Œ[·ķźF4ƒRŗŪ3±n¬ī~`ói§ælž>ū‰ü2 BŠÓžōĢS»vMNģī%Ü70„sŹ@źB‚ `RČ܂ °ĖY[ébź‰VoŒL&öŁėFŠŲ %öKŒę÷“ƒŪÆp3ŻBĢō`+ŗö°B\Œ<\Ó2å‚lYęŅ­*ĒĄÖ £ćVåNīwDĖŌÓüĻ„åSĘ\¤$™ČłHÓ@“C«B žÖG*(Į.•ō$oév{2]€µŁ—{āyU!HŁĖ" d‚„9!§%+Į+g½šEŁÉB²…0CU ĒyI§ åTŹČ0ˆžz€\Wd'’)+č]3‹œ‹ßµĒ¢HäŽc† |y®×f'˜,ÕOÅŅ ½#T0}ś“v§åøĒåņm÷čż¹>7įšjßĒŗb·—[Æęr*{|²…š[ķšC|’ßæš”E³;³Ē‚łÓŚĖĪnÄŻŽĪķ;¾ų…/dÄ…‰IrWN”Ŗž!£ē°õ§OĮI¤ŠpµlŻī3ķ.|śŗņ~w±H•‹uVQ¶©"IyéZ£Ģg(UĖ€ÜIš¦vØTAó©£ó%[GgNß1ŃU:Ō0m“³«%ołē A„˜$  Qś­ļzŪĮŁO÷āĒ,_ō³Ÿ’āćżˆQŹ(ŠD#ŚbƒdBT-kó¤ļ”,ĀļH’DD%™9IwG€v»åŸh¹ķÓv`YĻ­8Ž1:PnŃ»ęm­u†A†a(žjžd“zŸļĮŲؘ…ż ›„$q€DõåōØ˶puZCÜ5 LƒuGv%bįa›²Ó|ѐ}N“)Ł™Ā#„o5Ą”u{£_A(ˆBū 5{U–«*'€RRO¬čļ.¾T)_+Dneز€ĻMķ¾Ź:ˆn Å偙ŌckȦ‚|ŌO5…ĄĶ;7¹éÉ9ވ/ņ^É.Ƨ•÷š€×½śLą|­ó•å>GaEG&2IĀDž•å/ęŹ8”@ŁĄ¢$IiJŒvEnĶöŸ9,6Œ–§fłĘDŒ©Ōbŗō¢E#F˜5t›‚ĻŸķžś|C°µ—`ŠŁ6‹ęĘ5k g Œ-†030\rÉ%“»t`Īź|ę£āÉŻš”‚ ‚ ‘””7äż#Ü:’ÄVśæ‚ h·Ū©Y‰²’~Tō–•ī]z*šŲļ6ČĢkæłķģźĪ©˜» ÕīŠōI bZ&<”°YAųśS#{ĶōP.t֍ Ż’uT¾a1Ū:ajī3.Xčō``u_Ł'š ĻöDšd˜¤oEŪŒėL.Cłš›ÉŗĶžšSšgÉ'DĆ3\¬ł„ß½2å ³Nóà ٽ°™rĆꞠ&fVįŁ©¾ZÄÅ4UaćVUĢ[¢ŌK6Só÷ēu™Ė7ōētķ×R_Öné*6‰•妚3óö¢]iÆĮÆ ×Dź•÷•Ö­+ńBDŽČ®+»RŅC¢I{`Św†ģ7Õü«u&ﮚXf&ØōĆQō +Gł§»2[¢2¼`tÅ{ĒJ² ƒt cž&•Ų5UÖ5ī¦ӈ®ŸłœēSø92» ¶LD½Éī̶:į„ ē:Y±iśÅš^ƗA4¢Š‹“B–Æ­ˆ½žlM”V™Äk^įJj2/ õĖTÖČŗJŅ]f¶2¹Ue‹Źb°1ÜPȓȶuĘ:mŖęv *šeē3Wn/ūĪÕ-=)EßŅYóIg—‹ÕŖŹOģ{bužYefoYJ @įRS¤GŲüE5;_ŅmGaIA>g$Š€2ŽĖZi œcŁwQ)å“ÜŻ¼ėv#‹§”}¶ā“Ü0 jm#WˆÉ¶‹@Shˤ’¦ÉRhįŽ2Ah0 JCjßOXČŅĪt•ÄŪJ·ĀÖHG…h»''¢$N“#4fģ ūµB•3 ęlĻa“”Į~Å]6X6 “īv# ģNōä}Ū”$6ŽĀjˆ@‡šĮ3ŃQ u@”mķ…bFV:³ą:č5ŒŒud— åęL¶szI¦ūB\ś²ā©Ćó­±hVé`βb”1§¹© H 5 äå½n”RóęĻõʉ)#\Ō±–„ķ5ŒNQ¾8sJÆŃJ£A0ĀŽWrĖ—_rÉöuėØ ė-;{ė·ģŽÕƒN§=oīč’eóƒ‘NʹE€Dkf$™'ʀĶp9«›˜˜ÄŽ–ƒ>&Ģ tDQ’Ź)Ɂ­Ņ^•‰zaF§÷é圢n‘„Õ ¤ÓXҹV+ŌZgŲ›²V&ņāŠZ…a \`ęųĀhå²“Čˆ‘8ūSL÷m1M¢ŲEœ¦ˆ@@§¼šE1 €ø;}z«„A|ź3Ÿ3:ŌčRS6ˆĢŲž³ōQó–ÆŗłžM1)fųɏ~h|’2¢ķdPJIĪUēPØ5v»](78 €‚8N’Ųø‰' 9&bc½Ā(–6fį—92¼Ø•‚8ŽŅg­0(ЈŠ©˜ö$ ĆÖM)K÷ؐźzVmī1)€N§#„fƒČB}“’‹š:PĘ…,eßXū9@¤„!Hņ„"ļmHRęb·Ū•ų!Põ³%€$ż7I2’O;† SzO9ĮB ĖŌ%Ž{ä`āŒĒ±/ÜEĮ+§ƒD >œ22b3”?S·/¼‹ŸŒźŌņ…ģüīąwé+`bē‰™“åä*‹śM%Ü„X?ńÆrrŅØęŌIj@Ž€P‰Äūuž35`VÜ /åhćœhžćŹf§”°ģf>pey¾Ł¶įYoŖWK’+±šėĪŁ5ŪŻ–A±ų—O”tW°V®dźūŪ\AĿL3LÆī£ČŸ4ÄdČS.˜s±!Ō›C„Ū¤jĖĒ£W­bhé`śč7ŖĆ—oŠ+­Ļś”0óŚ ©ōž -_…Qmø~·Uł£WGsžrÖR‚Ģp ’ƒP9 »sƒ‹½?ꎖŅ#6yĻĢ\§¦Į¦LæÆ­6ŽCA& ė9Õ/™VĪXšŠĀw…Ö +ĆP+…ā+Ķ^—\Ń÷U©‰äEĄ±›at“ćk(Ø“q7 u_꯯¤‰$œlb_JigźH¤ˆŠķö0°MƒZ+((Ō` Ž3°.((E—kŚ“±V;T©RN,] FS©›r]²"{;66¦ŽŽŽ‰Ä5Ó¢²Øøč ʐņ«Üs§čÓŹ h„7{±*¤µŅŚßаn6‡2äSbŁ)„Hlc05nń6–"t„é¦-FĶ®łŁ”v…[hX×9üŁż4ˆŃĖ%\wŻuˆŗŻ(Š­8Ń5Ł‹Öo™ųöw~P8½ÓO°Ls{v‘„W¢õĒ<-X;ʤ”ņ ]œNĪÓ*£—ęVĻv» `Ų„Ņęē¢ōnśöLˆJ©°ÕŖÄŹqdtTR¾ŲPd`Ū®ÉČĄųżOżēg5Xł+"?'}ģcgLÓq+śąYĄģ9Å¢P\hń/a_rʈī”Tč<÷A»ē§E4÷Ō0żTiʓCC[Öŗ;Ł“”ģ€č@šĢęŪS%€ō'­m:³­ēi«µéŸwtJčļtŃŬ°BŠL A+„B+Ķ)åF*! ˜…hX#‚į€80 Œž%œ–`…„ l:S‚@±‰„e˰a͐²zv#×wb$Ö DŗÜ–~Ńē™e„ź©Čˆ‘š’.Œ”Ž®ņL÷\¦Óź†|ā‰r9k¢śH£Ǯԣ‘}lā}įqäß·éŹeįųp™ņP(‹LšÆ C>S×K­#eŽ—žcƦ {‘ĘéĆ” Yßļ²·¹••‹°ł÷«3äś“°aIJGe4«Ä ś‚{•k»$ttDæZę5Õ“<  ¼×TõÖ£R &d€ŗżī»T Ff¶ŗq¼iē®+~’{©°6«8¹wń5Q¢ŲŹ4 ņ#S&K7@ßeŽĆ@¬‡Ę™Ķ4-„”ƒ°Żrż{øH ‘Nųb`•;‰/Ć3sL+ĄL ¤N³onߗwT.‹T^gé,ōĶZ8Kšźź‚h¢ųgJ°ØQ¹ģ½‡ČžWPIHršK€č®Ā’¢]Śęr;¶“„1I’n·ē3rQeµ™s t:młŽuoJ/W°RŌb”¬ŁȈ®—Õ·•FbČÅg VN5Śc$1.ū‹Jōn‘vļGA •FPĄh "ŅłlŒ­SŲėĻ÷Ö¹#” ޜ^6ęcōiqč•UW¦,~'O{.“žzõ“‡'—_yI{Y勅Į‘dŽK„ā‘#%õćśåžCB+ŠÉĄ^ü‹_"@j"JvOv`tlęŽ óŗ×¾jĪ¢}%ŌIŪj$÷HĒQk…> ȗJJ¹śLĄ"$ąZvbrž/fŖi¹<^Uva 9—fǁŒ m™ųä‰8’‘ŖŚoż: śłož¤ķĖ.ø²c6gēŪOzŚSF§,_±ō›ßśļēŸžRPęv VˆA 4óļ~’ ƒݶ3€ūxų£ų °.&vɔ:3Ż ō+W‰“†Ū‰˜ó–ĪŽżŗ]Ō^€åW#fżd •J˜XVŗø©ĖĪcbbĖG7 u[7×}@,­×J%Ѳe„ ałRżGfC`ˆÉJ4h%»līŒ`ČRšåYjŲc$˜œģ9M8p²FĪ9 Qąz­ńĘÆW ؐÖ ™)1Ą€²Ņ!a+ĄŸŽ‰pÜ|” (HoØžéܰqĀ!z¤¶āl,E¢nßkŽ?+£å½•½7„Ž®±¼°÷09*8Յ‚•(±+1׎OC^¹ ¶Æv «J˜÷„÷³nVčę|q¶A+äÕßA~ajĞū©fļī™1 § P):ߤ O^0'ƀ}n¤ģ6ę“®ņ… ˜6Ž}­ž |”-7@lWt˜FźģŪ2pøóD;źņhϊééĒwė­·nßµ{t4č n·Ūk¶īüŚ×’ūUÆyms`*öæ„”ę§?ęŅhQ~LĶ„¼* t놔Ø4ƒ©2©uSV“»yŗ:'RQFq5*÷·Ö<{åu¢(jµZ¾5_„wÅ +kšżg .Ä~,›Ū1œ‡D‡\³uPęŪűph…¤źėŖe„q­µÆ9-œś€„".†4č`O7!d)fh'Jė©ąŠyÓ ē (aēīܹs֜ŁĢ¬ ģ¬4öŗQ«ÕB-‹ŻsU„’»²—æ9×bT@©Č\Æ×댌äĘ֝T¹ĪŠ¢G‹suɏuyA»ź35@i\ŒćøŻi¹ÄµæŠ,¶¦T.-OˆD‡¹ŠbŠ>҈ÕS«ŅG“nghŚ /mķµŠV—Ź8onķ*!é’q!0Ø Ē>ŪõS?żR··äÓŁ®P!Ó%ē_ų÷/|Į¬3 '[w3@;ĄŃ±±M;vļ{gæšeư«„åL(ŽÅL܀)mS©z¶Ų€Éó%ĆĪvŪUy˜YŹ? ©+¢]•¹'ŽŽTÄžĻJĀļi·… f뇙dÓÕIĆ#ųEkkd@|ųĮöŁw_°6„ ±®G>&Žļ»żÖĆ9< ”3: !øéÖÕ³īcg†5QO”RĢ™SnŻN[kJ¹ŗ›?÷2‡g·vĢLž±X€óßy¼;~{nK'ūø1A Śł4ųljI%ŖŚš™“Čš-jˆ¢D^YrN¦€]…*aن‹! E± Cß–ļ–›n>äąCĘwn›6}ēÖĶæśÅ/ēĪ»}ó–üą­VėŲc½źŖ«vOtŠA·Žqū¢E‹^śņW<łYĻ4ߘ1ŠQ”Ø0Pŗßį5øo_Ėܾ¬1@CĄ(ŒÜ¢=' ū²„õUjŸĘŚ*łņ’Oœ?֞ä5åĒ_8eWź Br®}¾•Ž_Ć^så|Øž[ö" µ×rć,uÆSHšZ'_ØÓāĮ )b¾Ø`ū²ĮCҾóŽDZšsD„Š)„O­£ĻP·| L9%p”šĶżKņ½Ėś.’ń5“ķ÷ąõsBłv»ŻŃĪØ;ĢģTö·²Ķuƒ5„]Ź‚æčϽąĀŸĻD˜6ml<‰ŗŻŲ00Ą[ßžĪO|ęÓ ›l]娯pA~ °3ŗ}­rÜśšBø”\U¾ōś^ŌTeÕą'ŪS°©źk"ļ§Äžęõftž²NGŹwo®›0 ógč,·Ÿ/t"7ó=~1Ļ}é˜ü.ŠD¬mhčbGķķ'鋻€2Š"„T«śžŸdXš„0µjƒ²“šgJvyœ%ĆY„ `ҁņ Z­…kmwX’gc8ŽćN§%/+±£ĀŌSP»tJ¦m‡Kł{ BĮ;k˾»©`Ā£ü<ɽų®]ćÓ§åž#ŪüŹY+;#e®Q®AĻ• õ Ä¢‚Fƀ%K6”/µp”ęā×rY±ŖŖć`ęmg,5քĽ$j…-dŒ’łŃ~ążļļ̘1}ĖĪ]aNÄń“Ń`śĢ™‡väO~±ČłƒuŖvh€‚T·”Žå”–&5¤m݉^«ÕrŲ&Ćģń°VÕEóˆ^ß5¦h§ ė³ŹC©Ō[ £cU@>[D–'eü#æš Õ»Ÿ Eā8CķŃŗ0’½k±TˆpՒ%¦u»»'z/łū—|ż{?Y’–ķd§Š>#ŚæŁłåßÉÉIQŲŖN‰óÕ"kOŗĖ3#ń$IÄĻ܉)A`Ki˜³zff6¤“탐nüvi¼āņśŖ<8Ä~R GķN‰^„qHĘōz½Ż»wĻ_øšOW_¶ōC=tČAķ“.ŗč¢ć=öśėÆĆ?žć®ńÉ@«I!Æ ‡*&…lPZ:„ˬ€ĒsōÕWż9Nb„”VZŠwV®‘d;…#Æįœķ[Åcf4¶ŲŃėv[#]»v͘9=Ū«Ó¦™>ZŸ‹ēR© ›²ō©Ak}ƒŗ©•ą ¤Ģsßd¤˜^¤Ųš¦†~GņX®\JÜ7ķ<1Ę ƒ¤ÄLäs'O‰”ŃRyp¶ņāĖ‹0ŽćVŚN38Æ#{dŃHTŖ2e k-1ČNKļ{ )@Ŗ¾/;¬7z¬»Č¬¤ķüK“$PA޳(™4”śč2ȉJ1§¤:ÅqóųÄ©§žzé﯀€ÖŹhĒɊżVŽrēčaww%®I»īįV—É©Öų<ń³d: C…Ī ćŒe3­¤‡< Ź!WCįÉÆtV¦ÄžęSdņp’jń@ÕżSā:Čŗi/GėRāBš&ɔĮµ*×8 uŠ(ŠCm5l’MõH=¼”=» Qi6(±>cÅŗ„µV$‰h_±!Æļ]¹W҃\Źä]y’$aøh,I ¢īv»##‰k Ż@$•“$étZ¢ĆZ{{ƇN[²+g¢RĪaDöĀ &U)čdŒ ZŚaæ~T”L{ÓFöž×+h’± °«Md#ūÆcĆVß]¹˜ŽāARš  µ}ŽŹpį|rU0i¢ й’GžĖŻ•ļ±\Ć‚1‘ŽvĒķP’ė[Žöß_žņŠ„KvķŚADėwއJ)EÓ¦µ7lļ]yÕGs¢W>.¦ÄĹR ;8j]Ü ŲŽ—Ģp& ¢(ŠFF:9Žxįnšo.篖{eDtu%ņ gVµą|9&×ч.сrK9WÖĒĖZš¾’ÖŹ²»/3ÄęÉO<łź«žŌŃ066väя»šāß(Š.F²X}sŁŗ)ā3œ6¤Ä¢)ąž};1D¬5& iQEņDąEÆT¹’Ÿ]MJÅQ">”€™ƒ¬Čh÷įt+(/7"L*–™ˆøyķĆwÜq‡éÅqÆ÷»_żfæĖoŗī†Ū¶ÜrĆMÓgŒµŪķm½‰‰‰‰;vģļķ»lß»\›N(€X0'Z]4@…¦…@‡<śŃ«o杢t/ :  Ā(‰&­·Įü!)_ßu÷=+V®”Žīœ¶ū#;øż^¶¾@ˆŸÜ6¬}—³ ™²BÆ…aĒ±ÖŚ–Tʰ€©²M˜»½ŽęéR°BĆ|9 az°_7Śå”xp”¢ł›…€Ķ_ŻĶøŻ Åæ¶÷žC.%Æė«Ģ–ķk©¢"”V{XošźŠļO€ źØt°ŗ¤ž‡{’ū‡ń”oyšæmę9ųs£6_`45ļŒ ŽĖ}sc78D¤@UĀ;‚™—ƹ‘Ø Œ>”&'&LŸ1666ѝģÅ&Lå9æš…Ļ½öĶoB)ŌO·­w£“®kC˜błsĄYjY Ģ,DŁ&ņŀ(ńZs2ģÓ=Z­–Ø`Nc±Ā”±ņ2ś–Øņy‰źzlņō„ģš(—6|š¢[“ųjƬ •w͜å]6dA)©ś‹ęŖkOp‡Hūę7c`„ļ¢(%Z÷dŒ@:Jé,ę" !¶1ŽÅ[®©Ņ˜Ä†DģԐÖZ…Ųļķ 4„GJV#.1ŒŃq}EūŠ™Ć00&Ѿ äņ^’ |iA§³Yč'{D„:+Å©,Y‘ +imÅ­vXĒ—„–$‰Ų,#V®„ē[Ø#—gNöp ³¢9Äō0šÜŠć,mCʘ¹ŻnÉ“ÄĪ|ŸĻ.ÉRVö“ĒTŠ˜ "~÷+_{Ē›ži, ŝŃÖöŻQŚ!̜9¶srrÓ®{=€6%š€±PpłO¹²–mŒY €óÜęe£“ķe­ŁrEQŲvXn¶KQ×øVRˆ•Bß|!÷ˆ¹“Aūd†T(±¼5@™ Š r¹'%Z§]ņ–-šó6¼—żbŽ“éŻÉ‰–†®’žźWĻxŻė˜•ÜK÷Ā0”[¬Ūķ <5®Ś‘)ēńå©mD?ĶCqógh’$ƒŹžŽ):I’@q”±–Šó½óÓÅŗCˆī¼ī†/}éK×\{ż>ū쳫;qŁļ/ci WʐQĤ*fa3fh,\°pķĘ ­ ˆ“„Ęe †±‘pēd¬„@a¢µÖ£®IQā„sēmٲ¹…1ķF"Š@… 2&Ķ‹ˆHķūŪ’wŻ}·äų€HĘ(„Š“vĢ2•ŸUÅ ęPÓG/ėLUj÷ö8S ¢^ŗĶV•„*/£‰5“Udź=r(q!eŁDjąl ½0 v†»u*ŅQlüõė“§ņqm©qj(}°_¼ŽŸY™,!CsæW.}ω >Yt®‡=Y 51Ą÷ž¶%Iā «'Kd_—jł ²ŹWöY»®Å«y҆®õ€ >P°X LNNŽŹöG@¶+8¼ü„!6³ēĢžŲ=ą :ö–ÉīPŲU6»Ö."Ä$I’$ u=5pY ‡.ĶTģ¹x7ó“ōškˆ*ģ+æŁ’}$”j…V"ó #YH‰+1“ę%ą›.ĄØZ$¤ü_×sXĢā,\t ‘ ōz½ĪH[Ą­µ„zF°JcŒ1a«e—’Hglšh!ä›'9D0@q’?öž;Ź’«ŗĒ÷¹·Ŗ^č8A#’Fi$²"²@$EÉ&˜l°M06é§&ƒ 6Į˜d09c0A$‘$¢„Ź9MģéšBÕ½ē|’øn…÷śuĻČ’ÖśõŅšÕź~ż^Õ­Ī>gŸ½ŪŻ–µ°RФĘ`Té¦ŲSŠćĉäYkƒPēlj·ė’¤°Ē%’D„B†‘p“•Ćżb4‰s‡2Q«åųÕ"…²TųEł”걄I"5ĄćĒd:ķ>5ʆ”.*Xż~æŪķ”ĀDN5™ć8&¢v·•w®ę²z„*q-¼—Ŗę¬kŌķŁZ­w.’ą’Ć"UūEXņŗI‹šØTåvåø¬ ڼdĘWP„¶˜œšŠĆžą¾+»w-ķŽĶ’ōķp%6żXGQ43«¬µõŖW½äÆĀ‚‘Ab Y!­¬VR+bŒq;“rd/-¢›)€1®OÆąNWōĆėAi‹¾_Ø)ė’ĄoÅwmöŽ­Pɀ0³"U×GÅZRmO·Öź pwĪ.]><ČŪUāAŅjG~@—÷Ą§‰Ś|Rˆķb*ķ(’šŚWæło)õQ»śęŪf7m¶„RĖ>ēƒą7ˌلó¤€<ļSšõKтU¢Õ Ö»īł½ØģnuęĻQåT—”_cܛŪ9DńKĢ|Ņ!‡ģŲµkŪ¶m3ēł«_3b}®0ęJ…n±…DJ f[*‚}+q·%‰5ʶ@J)ŅA̶oŒÓ¤VJ-‚ļl"bŃ@±õ°[oæm(œś°9‘†ō ­ūtūöķĶęCP< nź.ĶŚ«Ę@āńįŠKv4Hć«qĆaŅj…łöæ¼Üėt:ZS½Ē¾1zY7^OQ_•’Ÿ|~ę®»\\Źę7óĢKŒžCƒĘ7…M‚2rĶÓU!q…ŌY€')ŌaL;ńH¼¦ēøNH—D zԘūRÅĘad0t§:•ČŽI åatˆ7nĮ*å4ņ$Ų?jŹŗė`.5ŹZŒvĪ—ß?=™Ź"CŅČ ĪBX)0gÅo‡(­Óo•źęźgdz•b“$iµŚ>%˜¹Šū˜$ Ć\ŽĘõéå>Ę°ÖŹļČG8°0q¢Ā 3`+oņHHk,œ¶ö…a2‡ĖĶ–’Ų„QąČØĪcÄu>ēI:ĻaĖ«*”S”}5»tYe]“d@y×…Ó*œnSY}>—«p”ZŠļ:Żv¹ZR|‚#mŗ÷{ƒN·]Ōói¹I ų˜včŅä!I’$•U«WZ¼ņ^eQXkĆ lŽ7„6P’¾ĻŖhš1WÕJ ”ŌwI–„@žƒ³/üŁOBš|7čõl+j™dŠé„C±‹}>īų£}ń%Ŗ±!å·ŗ°ä„p?ĢŽsLuµ‹Ž÷œ‹a­UAčrZēć“NBkÅł¾v:mW āVUʱ”ń÷›÷0i VTv€RIS`¬ŗe !1’Ōh Ų˜tmśÆqÕézėŹØ ;ßßD¹N«@Z›V ÜżŒSæuž…dĢ(L¬ūą|(k9O…T¼&ƒg)³=#“§i}GƬŚ_‰K}ļEC•µ‘O=B›ĆJŗß–Wė’}Õ+fff^’’›09cm8>6"‹¢i°&m%°˜™ŗei%±č „”ˆH‹ T`ŁD‘ź',‚ėƽā.Gż« ~ā‰'ö{ĖĖĖĖD“gĻž„ŕ3Ļ<3čtaķķ·Ż†ń¾š…›o¹…™ßöĻļŽ~ü1W^sĶ„—^ŗķųķŽ¢VŎb=åBvÆø“ÄŗJ`^3viĮ‘ł-©&]ó3+d¶š¼¼ø8=??ģ÷®ŗźŖIN9å‡<]ōÅI’÷s‘Ÿ›ńŸ5£Äu—vó“Ż%/†Ća«ÕŖ7@a©—Q?ō ä«Fe(›M¬84¢Šµ6]¼gCŲ’¢z„%­šC<…z’\^„JܐWšŚĶ‹4aŃ©%UHC˜p4W-­LR:_Sa°^“dć cšČĢėZ«Ö拁£āžµĪģ KÓΌjÜB#ŅR€4c3½Ē’ŠXüMM\M‡ Hœ66Õp+¦Jf—¢ÖŲų‘©¹ļ{KK³só!  “Ć NĢōĢĢCśŠ?ыO?ū~" „,—Ļņ†^M²ĀŹ×Wžb@F^MYa ‡C­uځ‰õ@āõmšBāńcūŻ×1«'”°ÖcZ­Öš®ŠŗŠG+wüēĄ_æ%M])gÖ+Yv/|v¹ó¼~;²nģ­\ף›—MņUS " Æ"ķ \I¢µv×ćS²‹Č˜J¹ĀTU^Ó¬'ŗ›Ń8³Ø>ļŠT©Ä—1Ö)ßø*±CČNó†t5e–ū»ęõ·tźźŚ÷;ØĮ0Ę^@ĘV†Ća§Órżfi'ĀŖ‰ĘĶƁÓŪ:sٰ„„„™™™b4Ź/LóféŸķ“uiĶ\–éJ7Š&oĆ[QCcN#$n®4֓•Ņ4V’*K׿ĄF,„¢§™ąP^ 5°äXÜŅÓ±øōÜg=ėŪßłÆį0i)%"=+­t &ź“÷.ü ū}ż»ßc°¢HfhU=~Jż“^żßg,ūy("W-Źųn0Ī#ÜSµ6µ“©>©j˜īMŒ|¶×ūj܄\©.W~¶–ƒ €ÆiK-é`‡±k¶¬@t’mK’4Q®æˆāRy-÷æl­}Å_¾ä}ļ} č¶Bé;öī‹•°UmŒqčŁ č³–Fji)ńźZb3ś 3 Šl˜ßØ½Õ¤’f„LN9S™ZU§ĄƒÄ'œtüUW]•ļi‡mŻĀl|’<ķéO~ó›ß¼õąĶƒĮąųĄ~ō£°Õŗģ²Ė6n9ä»ßżī+^õ¢–¦Æ|ģ?żéOśŲ'œż€‡m<ōšĻ}īsxÄ#fgg§£¶Öŗ;5u:KĖKAt:­"ńǶHŁJ>߅T°M†Ć°ŻšūĖ.Ū~ŅI—]rŁIwæ{vĶŖŗqÓdöšPj,EĻągØ#f3 AšgJģŽ;žö“§żąüwģqæ»ś* ˆ9–tŽqZµ¬”ŹźŽīYĆČØļuÄ!>Zń²«Ö?ė›į(¹ŠIČw:²c¬IVéµ9µĆēżēä=øėŅ(æ$Ŗ[Ī֟ŗĻiģw“T˜¤­tÕjjƒźU¾-®½JČ c dÕLŪČ'%D~Ѓ~üżĪNwĖ=Q š¤§üńG?ń ņŗŗµhƋĪõD=*ćóˆ¹)N…2N‰q5” ŒčƒĄQ»ŽW=ŠV½žÓ&]{dNž;pe"GrqH^Ų¬ģ`ÖŚ@„ŌaŽ{œYŽ7ppźmŠ#Ԍņ\{ŖĒeņ‹Žg-ÆéNźųҹv‡½šMł[¦S©ĄU”,]·2&ˆˆ.ļ'YcHĶū LĆA¶"¢Œ*ģ)]g‚@…;’œšņ¢1&Paž>+et$i)"ŗ±÷»©{æa½H¹4!Å6eŒu/l•Ž ¬Ö«™!Uh“(µ;ŽŒ9*2lRc÷”ą®ß6‚Ķ$5t^¶·ńABŽY½Ö°¦ĀÓsĻZ«Å@k&„Žśw’šw½S'½łłłŪnŻ£µ«5bõ‡¦=7÷^÷ś?}ń_€43>Ķb$®š”Š*1Ņ£¤‚/ķZÖóyAuż–؊js9ķf{ŗśåĶBķšUaŚWPO2MD*j•Ö°ūA üS ŻQ ŗW ÅīĶWVV¦¦¦ŖlIć¤Ų(¬9ēį’Ī~ ‚@įīwæū…æü-ÖTvÆ‰ŻšM«ŠÅ$®šņö£ę V*£ś°FĶöńK`T½pU ōŗĆ¶Q®4 ±ŌŅ,ŽĒ©ż•‘Ź%ÜF‘SÖW8\$®HĀƒv»·8†ač«Āģ$3-as5SxąL_pē0N1ĪŽžhh­o4²/IŌś‰6Ÿ’ŁaÆwŌį›wķŚµ"d­(ʉ'sń„× ³ļ÷ߞѫH+¬Ir^~R©9¹Zq„gµ¹˜˜NE›ēePRĮMČ}Ė.c²¤*Ŗ¹f²—w`f'jÕjÖ@k÷”żFīL?ҹ*¬JŁó“hk Q4atÓ œ¾€kŪuČĪijµ Všļü·§?ē9Ód!r.¶R>Oóõ2¹ =ĒĘ*éJ6Z9›:݊ƒŒ,Ö[[Kéߤ­1qYŚåŅĖ.meiØ|g.uĢ0žžŌ'ī3Ÿ#Õn·÷&żĻ}é+Ō9b•ų=;T šeķüĻDęéŗXƒ\éÕŲ4‚¢ėB<Åé<=ĮY%©”ż¤l›@ƒ6€śļ/~īŠK/;ęčmoyĖ[Ī:ė¬}čßļrüöĖÆü½÷ŗŪŻ.ŗäHr>”G$ĪJ7BbäNr©ļ^5ę9 qH£Üų†‘É!†’Īc”hÖēu4ŗѰ&Ē0‰mÖ,9>ņĮdĶēBcM;ßżęŠu”‚źƒ3®J<¬yLčļ‰ū³Öiou¦ĀFÆP“öņµw„<ąŲŲ%qG‘Ēž ń„€9ŠJ@\ ź:4RŸk-Œ$uHUā„Ņ™i­Õ~"·f&W<Öē¼ƒĄ`ŁzšĮ »v ¬ Tl˜ū?čß=ļ¼¼ÓF6¢4ĮĘō¢W q~_Š÷DŸ£‘VF̜5­¾;iŹÕ!qż·žv‰żč™’ß°źė鉺sX:c•5^TŁK½r\sśÆVšK’$l…³ļ'¬(ƇäKŒT‘ŽÉ{šņ5č»ūX2cO„i0ˆ[QÄ\ōÄÅj3$óv Ą™!jė§%øĢ¤‡%ļ©l/9¢pQ{’˜°TŠTA½”Dcę0 FljTÄRžƒ˜¤ń§‰s=pæY¹arz‘Ź(ÅDj`÷¦q³Ilj}„¦žŽ*d(^fÅ6wµČj1QZ®i8‹Å¢B˜ÆT'°ō Ņś¹x’Hßłę·ż˜G(ƒ-Ó”$¶ÕéjF ɞ„”“ŚĖĆīz»įa¹=™J©qŗ¶ ©†5"F€óR˜§Ķξڐ?Ƭ•|­ĮW‚ČĶqGQ„\)§FŹõ‰UglAÜO“Ö(¤Ž”Ģ‹CœĖmĢ\ė”FĶW,xŖysóEõó½n0“¶Ņ$Ģq·Śmˆń`0xä9’Į~ÜV„ K?N$Škįw˜{ć~FĘĮTg’™7­¤'fI Iå(Ļa'Œ’XźJ~ µę… ®¤ŌRĢģAb[ˆÖ§I/I{ŃŻCņŽÅY“Są/_śā{÷擁N»sū G@I)čĆz~ĮØ\yĘfb­ÉOżē«Ļ­ėꮊŚI—’ļ(ĄV©Ģg¼”| åk_śņ“ŸüÄÄXČŠJO±4ÅVęęŗżį 7d#0©ü˜:źč£Æ¹ęjxgD‰ „ą#Ļ{ Öfē»Ž d¼6Ź$~£†:I'5W'ĘćˆU‹XEć¶z<®)d: ęĘc*££Š½ė†Ä(åG¼…Ó\qć®ļßĖV’?īՃx]óĢ-ČĘś’;Y½u˜īc śėžåīćrư5±TNVG“QY«^qĮRX@ųAƒdź;ū‡lWœJq˜hdܒ[²ŠÅąĆÆ Šz†ŗńz$Oʖńaž•O˜†Ļ-K)ä1ŁäSŽ„&%̉“8¶† XZ:Œ€)­/’õE°.+ΐĄ€ AB•½]ż?‘äß+‚"”†‘©¬©FaĘ’øø¦/‚øK]q}}Ųū@g…ÖsæyžĀµ+žŽ#CŠEé8*ĒĒR›©YˆFäZœ2 ±®³č Ż`ÜM’‚  rÕ+dQ•¶,I5å‚ …Ģ’Rś.—e+)ÖĶųÅNØF R"]„IJSæßĻoĒ”ÖźZoł³æKēćT’]p©µ2§QÆ@*Č4x8§s”ĆXńdz„0zNCķ4jćźŅČ™Ö2?ÓYTXĖÄ/4ٶ—óń-Ļӊ³RTÉ-ųē²ļľź'!ׂ fā„ś½?}źS÷ČGlExŌl· ąį°æ{qyGا° †ĄQGõóŸž,ˆBcąę³Rj0ˆidó UėGłń&ĀÖ¦$†›ÕH«Æ*»ß4oĖV¬-&<3˜³§O¤E54„9Di·£œ²` 7$bØSy¹°°R D˜ŁXĆ9ō%0ƒóÖ¾ās‰Ņ&ˆtfJéįKMn}ŌŽåŲ~Z”Óé(0“VQ»•Ļ˜N§ó½ļ}߯ņ¦M›"ؗ’ł‹ˆ„HÖŗ?ć@…{¦/PM ēécåó‹ØÕķfå9ģ}ļ ķÖąne+εyņ]Ü_qĆEsˆŃĀZXŲX „ABšI‹ ”ĀÄ‚–ĆĆ"rŃo.œšm1‰ĮŠ}ŚĀž%NICĖ ˆ•¢Yy³r»Gf;?&ƲhR$€4Rœ’G °I!6V‘ŖtŅVć“|(‹tb³xŪ-ś“'Ī“=¤­6(9įąłĶ6j»q.l·ŃīŖ„įpĻ€WC‚%œuß3.øšü«Æ¾T‘!Å IćžF”f@¼s”qėŪĻ.°1}g•w^Õ tüł2vVĀÅŗŒØ1&?'æ}a¶Ģ6‹ŸĒ,ԘIls—ss1~ŃtüżŽŠF•g&…Ä•ßDÅFšłGŻćųy¾Öėp®i$s[0Ćir–‚¬ņ÷āX€u‘Āś¢+Ė,9t¤QlÓ¬?<»Ż¼8:kåUqœdO¤œ{6TJ“&?įE^­5 £90óPҹd3ÖIN‚Yˆ TŹß“/œōW·ŪĶK4„JīĄl¹šö&„aT…ĢĀÄ©H˜Õ ”;}$æV`}É;ƒEźŠŹ=x\i·č®RȉlšĄ eQģHåMo?6•Œ›WŲLį™”čg « “ū‘8—ģņ‰]m¶§ęUéG-y²{õńdQ¤ 6˜lÜ?č  ŸųŌ§7mœ #źõzƒABDĖGmžė„hOĶ*ĘqGł»k®”N‡ • rKĀV• f5 O£.*7ś¦JŲ]02Œ0D 4”Fń|3ŠUÉ^I%Ų(;h§+ŲŻM«{˜3D§\.L9ļFĒūš'93ēfŖä²½8*xÆäF0BõĒ5ÕunE+Ń ‰uT>&qibb¹ś¢‹HŠėõVĄļž÷\ņ‹_ĆȄ±AÕ;ƛź.īwÓ¹ąDk•"aÉ¢vÉŅŠŠ t:ĮI„XH²Üt)X/ Œ$PéßJ$OF€ * C)0+-„” Üæ”¶€I³^4;;æoqAd+ģV×yģ A §gG&d’‰°1ŁyūķO|üćæś„/¹Nuʦå×…AłÖ’^Įæš„nwzjjz8dRź¶;&QQ/¦}+²ÆĒ rā1‡æāEĻß»ó‰?>’§§Üė>šZ‰"A‹8ōrR‰V}ū‡jj`Ķypń&yŃeņwMńp^©KHŽŗ©J@U)K¤gT%x‘{ZÓŻM-­ńOņD¼Ćeū7›oŁ÷ ±ėGLGu’W×ķUó=Š¢u£ßĘć,ō3Ķŏ÷£P\ś“t@ LŽöG£ ßZ«LĪÄ¢×ļkĘ, ?¶^‡Ü$Q>Õ¾‘p„8ģccŻęBÜcDeõN²“Ęóė*ŃXN®NCC‘*PŸd•÷ ·Ā;üpˆÜõ®wm·ƒÄH¤@0 čłĻŽY§œkóœ3§‡ČZ ęł ł ”œ ¢ „bŻ(ī@īt#¦Ü„ٜ¾¦£bĢ‘6ź¦ź³}üĒMγšßĶē;{ś¼@‘ū!O5œŁ9e7Kį§eŗ:£åHĒĮÓĀP¤“ĤĶ™qQ2Ō³1&å|„įHÅÅHJ5ށ‘¤h:­–v”=‚Ö:„(“#œSšĆģÖ²ė·ćøßø«*Ź2'¦„óó ,“Ī n•÷,åÜ"„TČA>C)Ŗō-ē.š¤å»J¾åłż¾kLDęž„…®’Ŗn­ł^†AZķ*æÕ-_ .­ąP‘JSå½Lj©^™(e\Žē³G˜ĶՑŌńŖd2Tu1«){ bņ®¾āņw¼ńŸī{Ź}ģJ|Ät×ģ]\²¦Č„`Sw§ģ±śĘ‹Ozź.»ś÷0!‰N1µ—Œ€ h:O:Y½ P~(錰–³Ņ"“ÖłlL#ó2 ™yĪB` d…ŠXQäLĻIiŖSÓ5‹›ē†\ÖÉ7ÅĢQ½Ļ\£Ņ ÉŃu˜&āæL*µ÷å<Ģ}lģn”†Jö”~&:ę®'=ō!^īõ¢€xē{Ž -īĆBŠ( B·ˆ³īń Ņܘū3\©*Õ±¦?Æę-­.3Ū9'PٲĢ)Žß2 MŹu·(I‚åÄī*]b`&ū¶·¾ƒ¬ėÅ„ų’KėR&Jk±°Ė÷åņØ"•k.‰Gp’J¾lA¤G%Ė PAų“žčńōø’śŚ×’ųĒ=ü!ń™µłsÉņ/iä3K=šg?ļY++ū$ķ™°oųčć×]ZĘ żxžą ļy’»n^ŲwŃÕ×¾ł=œŻ“U‚Ņ,b˜c·K0‘P”ł\ĄM±čŖµV¼ņ Ōż;>Ź­å4Ē1%½“}ĒGņ/Ok®Ņ8–ß:„Ē•&ŠėŖÖ~¬¤Ō3vg™7äļÖ÷@Ė_J* l,+–Į%2@JVʧślÕP{U>w.ÓŚž ` ‹¤U^šĄj RY`Ųt…³•x˜xŪA^OX„ķÖa…¾ĻŹ_iRV{ŖÓ uąæR ,ė„g×.fH „ŲÅM ŖLcÉłtEtī“]»IÅ ØB 4›§|œö…ŪŒYĄ"łöœżĒĘV2&Ī™°·ÜO‰< ¤”Ciör½“ a!7’!{¹gfŠ“D Zé÷Ī9÷œVŌ1¹hq84€hXą§żšZŃsžł“®½ą‚e“ņšĀJ–4Ķ”?ҤĖ°‚ ŠJ»Ń( ‘_ĘÉ[ź1,q6ŌK:>,_æŖe‘›é 'T~ ,$tą•R„”S~Ęå¼/ 2SčhfʟŹu–IńCąś TŠģĻS ąÜÆ,ēdx÷‚"՝żIŚFąlž»¼¬ÖZņ¬y¶ķ„:(Õ7Ü^”ˆ“ņ‰ō*Фi%Ž+ŻÅÜVéó /!ĪUN“F*­(A@ŹM·Ż‘¬§ĪE¤ @J@LœH’°{ BĆAœVŲø(äŗĀr*ÖJi4œŚ¹°X(³ZaŌjµjEJ֑֊’”q5d·d2¶sŠłó‰D)8É rœUr;a+p”¹·-¤ifO-Ē]v>žŁOøR…š&såsÅÉāe­:TBĢĀ鎔[Ŗ„”›ūŠ HÉ D2Ńē<šć!„“pū]©•µ– ^ 3‡*§>¢{ĄœŽJC:ĻÆ¶ł'AHü2XøŃ?¼šU€Ó•źöC Œ4¬śÄ‡>üžw¼żō»Žķ’ž”‹.»<čt†«0;cjZĻĻ‡Ėƒdļīa+^ž—/ūč'? ”°é2rSZ‹„ē =ż9˜ Ż­ølx s’—Ķсb¤¹NŅ`›žõż~ß<Ķ0Ęj˜~ĢØ"-’ÓÄrģ“ŸüĢĄöbÆ»uĒó^š¢v««Ā 4J. čĄ)ųJÕpn~† •,”ć„—[7Øń‰õńt¬FE®Äfõģg„œPTY†½WO‚‡1BKuü—/5ŠĒäL¢\åŽŲ1ŁØŖš‚Wu8™ü¶ßļw»ŻJ—c®C“KŻpęüÜL'Wéso«5¹š[nnT• A­…H|›–FĒŃĀ”ƒ†<½a+Ę=āŗąJ3uBŠ{Ļ}ĢćŲDQe„°Ķ‰×k 5ŅAa:åŌwGŠļk"Éī#B…в®ē³š~ŽjȲÕŹW˜+ƒ‘ņi .ĖĪV+:‘Ō’č©}Ģ—æö5ī}“.»ų²éN8H’Ä`jŖ½°2pD‚xĀć’čßłd µØÉ ¢”ó_óFņ­—KĆć—•§`Ģžé”ĖP"pj÷b­E؉HÕōĻ’Ää4¢tä%Ó««:՘%E@Xw‚ÄVĶ–„Ł„5s7ņŅxP†GÉ®80°d™n!¤I¾,9-Eł7 ŒVUUkŅĢX’“]S³ī$KĄ×? ®&F©­T3“DŒō_Qd‘¦Ņ…˜„…•":£ĄuP*­4›”¬.b(M€"—.fc –`%`&‚aėĖòµJČńŁŅ’X(ÆčŠRÖE”N‹IZ90œļ‡nŅętÜ|†[¶ äĢ‘0 ƒ ped_EƲvĘR[e•GŸ3?•[#䊬ŅD*£IZ?tY%66­N[‡v˜1ÖfF*k9Šc¬ •‚5ģ‚fĘ08¶¶BŠn&øĶ0I„)Š""Ų”¹%‹d0#åT ”*ĀīŹÉ—ƒ;²\ÄéØŠžR’OŽņ)¾4Ę ¼žwhā¹y» U§ĘiC]‚³Nc*%Č|÷”¢Q¼ö”Ż_ŠēčLćĒ$ÉŹŹ’ßž|ż_ßzȖłNpżÕW ”et8ŲÜŗqót'½?žłĻŗ„†‚DÆõģöīBšUzø„Üī¾ †yU÷˜Œ°ˆ fĶrž ØØŽ‡Q:µ£y繃Ęf„ńwF/£ń\#2’Š«T*ŃR‰rmsN‘a†Ę°1™h3Ņ\k p<ZcŠ6gLł ø4\šsü gyŖ+ĆV>īÜ?ņYT"A’$Ž}ąułŅ8*„¦DGņņMEo¹‚źÄš!pxŲi+øŹyA‹“ŚÉ8ŁDK%Ó³ięĆćÉķ!Ź  U«Ū=åä{Z !N˽•o|é Žm¬ÅŗdYI©aÆwžłē»‘žė—ż%LO"”ž'§~Źt§}Ē®]B4j üĶk’@(R:c(°"sŠ€@*‚˜+~÷»N.ģŁ}Ēm·žŻßžż…_|ÆSĪ& ›Q@ó–ĢN»T5_· ‡ósQ[”5#Öǹm,$TŠé„~“hå=żĄwՏ»óĢDź×Ó“Tt‘1¢÷mTL»śųŠHµ>\/ĒĪRRŹQŚŖC|ēµ#®é¹®ŹØ÷76F¢ .:G«ÕŹ‹$¾~Ö(su &ńų>®ĘčmĀUŃø;Œū -;żUU‘{ Ž[ k™ś•ī‹l1s‰³Ų„?]¾ß¤%¤žų'®Ü~{Ų+ŲĖ”aeo˜ŻB›Ūѱ‡myÓ?æūē}’gŻē‚~_ƒŗ’$ÉÉ®”‚%/|/ ®P#žPĶŌś­H¤T’2ƒŗq]ŹläZCŹw‹«ś=)¾¤|z€,ŪTõøš£ üJ)ŹĢŗČ׉ tŖ-„=ž;@@bEJ³h-”Č ҰL 6āzTwÄ6gEė¤8]©?%® ¹Ž5€eᚠt”SB€JC‡Ü8ē»AĪŹÉĒæāī¾īCŽšš`Åėut‘k^÷H«.R’„E¢H·!‚E:Œ”"X“Z(łĻ2ŽcWqRZJ+q‹°<&Ib]kR¾=ŗ*‹TĶ‹” µ²qāÖGŖńKE€;re3Ċ¢4ódN£č,Įį8Ūi‡eķ 7zŌµµēC}LZüÜMŚŹ²Ć»sJ`Ł4HækµZ¾Į§{×ÉV„nÓģ”gżŽAv»Ż\]V¤äWė«'!猫2ĪĻčÄiŹxÓ Ē~Ąƒ³aĮ ‘Å$¾ńÖ[ŗĄlüųæ8ėA¾ß)§Sla-Q‰óǰ€ćmµj+‚Xžd#X_?jVõH&X¹īĀČń'Š¢(Ėq &é1,LÕP®BĢ®™uJ;ö/34)×ŗfN›»R!Ķϐ‚H‡Ä¢nø)C€Ŗų&ƒÆ¤! “ ŠŹ½g”yC°0lĀiŌĢ„LŁÄ6&•†ń¢ć[ČéÜęŃf~6Äq\”T8 :®5„¢śfčgņ÷kĢāŪøˆ<Õ^Ŗ)?9ԌĄ IbÜPqŚ)MDDķv;ĻsYka³ä½8'æ0÷/ujzd¶ń`H‚VÖ2:Šāø©N1Ū-öLYŚ“n–“—RŹ…‚¢Fkv†ϧ•õóaUCŲxėļ“NQdNČLzQRsg,Ɋx%”é¬(§¼\i ²R=é]”µÖEķ$EgŃģč 4Pšh•Ktļ$Ęåų’ÄZ+++½l^Ł%©Ė27ĒŖˆ »ē›ś»¤™¹Ā0ĢT²2ˆå1«‹Ę~¹c­ŅdŒqģHū²³R„”žHŚ’ģ’°L ɦVŗłw{DRRĻö|¶ˆT)Ć¢ 4)]¤Æ­u™ńY]Å>O7m*4(Ņ]ŌĀ×+eĘO/øščc M’$;vī<ó”SaŻk!6ķrOõF„j„±ŗØ•/'&yŚ1ż­»*§&čž[qzu)QE<ĀUż½'T]M’$'Eē}•-}UæĻĀĒ^ä…/|aö-uŪŻä£ØL™Ex=&īčł×÷žĖŹJoŗŪr»Ņżh p#Eˆŗ³3yņI°q~F‚P±y+Œ…œCs&~” ”Ž"hł›næy(ŚÄ2ö-¶[] ӵ͛5Dœ &‘Cģic¶4Ö=1š\¤Ęõ“ŗ0ĀqĘ`cŌ[1BĀŹ…ō…»u­f°V|“?2ŗ‡ĖŖ¦­“w Æ#„®—Ü*6ŗ•Ē’…žé īsƓæõõÆÄU9Ä& B$Ģ&é&ń¬rņĪŲęÖĻņ%P÷»#"­ÓĀUĪ”Nc]ABšœśŗ+‹(£`Éʰń¾]wp…’ĮõW^¾pĒmß’Ęw®śõ„{n¼łA'Ÿ¶}ėÖ»t§OڲõÄ-‡¬ĆƒHo ŚHŸ±ż®‡ĢĪŌ™ŁŌš u#uä[7oŚŲ™ŠŚ4{ģńŪM=čŠmGź™öG>óɹöč6ŃTŌŻ²aĖa[[šZ:ōŠCŚAŠVź°Łł{m;ö%Ļ}žĻøĻmy֓žüĆ|ļ֛oüė—½Ä&ƒK.üE²oqļ­·ķ¾ł³“r=Ė`iE”ū†µ)•؁LėźĘ“ ņÄkŲ+Ėײ?žE°cŠH±8UŠ6 qŖāL°†{“uI‡ tJČAJŅ@+·øµœņD˜Hśżž“ēIq,A(-ŚøEf­‡iƒŸ×Ā'5 įi2Xµ®1×P³ ¬āŠŃ‰¶1Ž£t¦åA…¼lå£P×ńxóĶ7CPƄ²µĘÄ~O¤ˆ4|‡¤ŒŗP’rš’9 ¦ŠGĘņZgffĀ0̵µŚķvšcŲŲ¦Čm’ä›ßžRįŽwĢZ9~Ėʁ²†a,÷VöZ6ķčąYzԃNyų9ŗčŹ+Ÿóēi„%*”N{(°„ŠZh¦T*$5DÕČ5-cęÄ?Ÿ<ʤ †¢Ü Ó/Ū²a¤•zvFÕ¢”Ŗ÷łö Q‘*Z[+~Z" …Ø–$õźĘ)ŲÉ9{äĻj]„•āhŪ" “Ų Š­VĖ撛9ōŖKĖŗµwaŲétZQŠiGb”¤•eė»ßō–·LMuzńP€óü“Æ»®āŽLŗvDZ×U¹€¶äże„4AŖžm ‡aŲź”Ī… ź.J^~„ŖKCŹ[.ņķt"%uJ—zč˜K—ŪĢm.}* T@ hŖÓQĄĶ7ßb÷ Øą'¬‹Čgœįž2 LMMrČ!•āpqĻ;żéĻxf«Żķ„ŗ„[Kż•ļ¶]¬1Łß*@6O‰Z²e®ß[ÖZõū½™©.Xl"‰``Ų¾ų…/,-./ģE&`> ćĒßÜ*•ŲI„cĘŌQ+&bŃ–ǤJׇkĘÄ“;B­©ųQeŽę¶źä½cĘgŌX-/†Č9­† ֍ Ńb9WvµĀNH¶RɈFv¼ęó˜«i›–U ównģd®÷”&ZżCO%ŅW ,FRJ— É(įUgB­é…‡ė·ÜØZ¼ŹSz<ŌléF(µ‡Rc!¢ŅÜčKyVc"…\ŠmU1Œ¹ātqźNÕ2PLÆČ@¤Åŗ«ę”FQō’į ’š·`ćĢT„—°„ŠˆČ ĘĘŁéååeˆ³źĄęłłs÷GēœsΉwæĒ‘Ēć$kŁ5O‰J„¶ąJ¦±SQ3ī­¬t§¦*Oj÷U’U” [֌5µņŌą˜łV<óLŸŁŻĪņŅŅōŌ„@,ƒ!!±ųąū®łż•‡l=ų#’öļ›6mŗé¦›V–—f§g{½^§Ó¹zeŃuŸj`®Óź÷‡s­p8L˜›^Zé÷¬ĄTØā˜ēęc+  YB Żn9Żl„Ōņņ SķP)µwÄĢm„=ōŠn»ÅXŃĄt·»§× ŅF”=4ö.¼“gAk½<č`ŗÓyčCŗéąCŽł®wŻpżõG{,¼]Q˜ūż~wzŹŻHeĒ+ŲÆ!hKT^†0³1œ;ZC3GaNn—4Žōõu=żē3(X¶Ī’4¼„ˆŽ˜ZA„u 2½h*“U•r­­I’DQ€“bv¾Ķ6 u±Öb  ĢW*Ŗ‚ts]C*NYʂ±b9õ½9y$ĶHr¢uēčVDDŠYņJ£RwšĖO¤¶åV„ĪĖO°8éØ9¢)½•Ōtt©üó»pפ~üe› ČÓ<ļyĻłĀg?µ±Ż%·Ś1fzzzeeew?iĻOķZXĮ¶»lłÉO~2»qC«; @˜\ęĄķ“©ź;§zøõ‡épÅ9b‹ƒh˜$aVŽś¶_Ž„°:Ʋ‘į,…į|äEĘ*­…aŒ £ p±®ūĖČųpźU’"š 3[›JĮēīė°{ߜˆ ßļw§:Öpʳ ’™²ÉéÕIĆdL?‡ŅTA÷˜Ē|õėß@š6nÜxĆ 7“ŪmĻ„”t%éū0F%nüĻĖE׿Ģ7±ō_Ļ6|ßĀāÜü¬[‰x¦’~{žĆņÄR­ūrę%żˆ¢Q…§¤-Ō ŽóLa‘öƒ(ÉÉ÷¼ēe滬(2¼q~žO_üÆś»æuyIfw Æ-$rQ‡YY™™žīvZq E;‡}pśˆT<ÓB}ZšŽ·½é’¼ņµ[ŚKƒžųŹæzÜIŪ:įøĀ›Ę%žѰ{ģa[ķJ_[n·Ū*ŸśŌ?I’dß¾}µēŸž gžłė_’śņ«®&Ąs33;wļ”UŪ¤}hųP‰X&·uüćźtųé1øfĢW-ŃM‚›&lć?h¼“ČšŠ(gč„ĻBDŲɗPm½×2¶£kV÷$*ķ(ė×44&Č Iēūw’1į$bå«¢Ö1iƒU©Å“Ė®ŠŲmu$ćś ՕūnŻO’$ÉÅl+×Yųl5Æ@ŖÄ=®T>ų)'o„*i0¦‘˜‹` ¾ķŠŹˆUTz¢‘ĻŃ?+ąmĢ£LĶ½1ßoųģ¤f°²øxŹ)÷¾īŗė ° gŠén·­°m+t:[{=¤D:Ņ Ą­VšŅæzŁk_ūZ՗G<āO|ö3^ųĀŖTī†zK+é)R…)‚’l]±J„G~žÅē’9!\@ĆZhæ ×½Ų%¼Żouń&éß:Ÿ_×Į©ČZŃBˆy±·˜$ɦC*žšbŪ’vī¾žš+ēēē·~ä[ßśÖOżēĒ1'|śWæžµL/ƒER’«H±øvEB)pؾa­“k)Õ –1ŪnqœˆH" ”µ,‚Šķv1I’X‚a @±’h'²‚@()‘©0Š“8k Tß°ÖQ Ģ0‰"Ǭ€¹v«?ŗī>”ˆŒаeĖģŽ‹F0¤€Nƒ %xąŁ÷’—|xŪ¶m`ģŪ·8½aV ڧQØģ_Ļč®’Ŗ›ołk¹.ܕŅb„ŗäÆ.`ŒĶŌØ³ø-ˁٺ7·Ö*ųń}žqNżX²…^ 1Ö Ö: ›X„dŒqCkmŌ 9¶DD”JbƒŌv˜‘éxƒÓKrž(&±ė¦Ó€H’$a2³Ņ:“="'†!‘Äqµ[~@)"iėø£O»ŒOżœĪ9õ­SfźGlŗ“ēU%Ū"WĖ5i*½˜{Õ¦A•Ēī®@įībųęūæ»°ģ‰«üĒdŗėĢ–{ĄÆČ€yb]¢šž÷¼ļ/y5pš|G³ūvķŁ¼yvē®ŻaǵGD¶ųiO{Ś›žõ#k:Æ' Š˜Ļ¶RŽ“ølƃRš ƒ=šO«Š„™Ó5Pš<ī†ų¦š%h”ź?Q%Q…vMP™mĪq-żŁ åTÓ„Ós8ŗ“`^eöL†²a+½^OkAżž Ói#Sš±eaŗėĶĆŹ~åOĖĒ<āĮßłļļµBmŒl»ėö‹÷»Ü(Ė$$ tfT·~7Ϲ –³W•ĢGTgƞM)Šć$„ĆP†,kYÅŅŚ„r̃|žd™O_É^a­ÕaąŁ@ņSŸöŌĻ’ēē$ćóo˜ž»}Ļ—C Ź{×ĒęņŖń[Āj  ‚h„®½łĘ¹ƒ·2©¼īąøń²ˆ½ā7æŗ’żļß7čÅ®"Mf\pĮOO>ķĢ H' ·™0ó}īyÆß_ö»¹vŌŽ“ 6oŽ|ćĶ;[‘¢@·§fÆŁ¹;ŠH,Ā€¬¼źåÆ|ƛßĢ`„,CDJ“b(÷ŖŒ0ųt6{~vLœ_-Ąģ7ms¤ö(ˆ[5ósIKiNś4ä†hdu°‚)RY“,%ŗ:ŲqŹŖĮnpćVē·§o%”I3ŠRQnšx'}Ubɧ  čŲ'‘ā—WM{Œ‚Ž«‚ŪUėŸbĀ)[åZĖæ•"vżē>§Ō!¹kŘõSÆÕ% ¦›ć±Y!RUj†ćŅNŁHõγ:.s;‹ÓBRœ…fł­jńæ>ŖĪÅnņ‡2¦f>I(ىˆ {ż‡<ä!?ūŁĻŻ=9?X]0 Ø?ˆ“ƒ3ćƒ4;æ{qaĖÜF£°sļž­ķ™Ć;ģ|Ų÷æ’ż/ķ«ļ|ē;?ęŲÓN;ķŲOXZZšŪŗu÷M7żöŠKü°‡AB0öīß“”T°µhÉjiÄ cUH.Ō0Ѥṳ”fVƒ…ĆŹ[ „·d‹Ų­²¼4ūćo|óŖ«®zģcū±}lģݵkו7ŽrĮ}ōї^zå€`ū±w¹ęšĄ)Ķ “u0Ż,õūA€=1l˜ŸZXX‚"° “t t:³Ėże;'‘"Ć¢ Z+ĆaO*…”E'Ņ+±ÕJŲ:ŌÖZ°SfffĆ0¼mĒn( Ó>>hB§­ āóS+ +č„0­V³ūeAŲ ‡ĆDkŅZ÷cC CDD³L€%†qH§5??’ūŪīø’Y÷;čąĆ†ĆįG?õqŻiCN JiŖ¢d5–a’‚ D)qRõHb TøUg$ŪüŌ(QMó»¼m”y€8ŗė€p«@ā m„V‡Ä“ŌEDźd›ę?\K‰t}Ćčę^–T»Š×ļ‘lb<E)²õā®&,ŽįL˜ēnÄŗć!ń„xT}uŲņĘᾖ̮ńu€5±ųŹĒ<+„\aÜ(‰÷†kóR/U<֗ņČæö;ކ±ŚkÅła+¼oļŽ—½ģeŸųÄ*B ˜›ZZZa†4Š Ć„ÄD¹ÖN(‚ŁŗeėļwŽā6¦\#ˆ‚TĘ½·r]pü1Ǽč%/~ķk_»syåõÆŻ3ŸžŒg>õéłČĒŽ8āˆpvŖ ±¹sOĄ£ŗ)i÷®]3nŌź€łŽ[n9xė!ż~æ33ĶÖ¶I’Üzóm_|ńöķĒc®»ģŠ#Ž8āĮ{h·Ū…¢Ż »dR5hM J¤lÜ0»oßāĢĢŌ¾X óZĮZĄØÕÖKÓ#ˆ`Š®ČMhµ‚žĄøo“ÖK+CvȆŪvīM,f¦Z‹+ĆŁ©ĪŅJŖÓZī»­™“ÄŅĮĄ6ĢĪ,,.u`­µXK&l)ŠJgŪŽ<āśn ĢĻĻĶ·Ēń¾•ž¾ šDi›¤Qp; ÅI7¤įP™Sż>ļŠ ˜HG=‡J)–(Šv›”:†aølś"BŒŲ~—»ÜqĒ÷<żŌo~’GÖ5kÄIÜ ¢”€\>˜ėŁ(f^YY™žžn$•Ē'•āéi€˜n’0Ž“°김 pˆ—k­ ‚ˆ‚Y‘+–z×&;IŅb©4ńJ.œ×@JūH¤ ŒŁD£¬žĢ* W+•¦¬4Œß‡ė˜Mśą†Ć”É÷Ę4é¬JÉæäį\œ8«.J!ăēpšFeońsåvr!ŒQ“āMĄŽ×`­Õ:,Ø=€1ģTµĶÄĻ{ę³>żńOŽeóī÷¶lŁrćM7u:ŃŠÅŹ0ްiö¶‹ÓÓzqŁrč”ׯr“Väõų_hņ”sP6@bÆĆV–——gggņµcEœĮ¬o›×Ų TäK+€¶ģHאbF‰†–m© ß"÷Ä:ż¹„“…J¦ø*³E‡¤”ß¼Jw.&y+gy8”›RT)ŸīFŽńDü,U>•žŸW¼ā-ļü¶TśĢ§>ńø'<Z±°Ø€…‰gAO•ŅVžĻj¦‰Js‚ üČ|ŹI19Ļ£Ōw  †ķN«ō ø©Ŗ\łdOPĘX­iõtU‰7÷’ƒ3žó ]geؔaZ«”ņ_é2ƒ˜¼„јĻ|ģcĻ|Žó¦»aæ—(`Ʀ7޾[äo}Ók^łš­ó3»–$€RŹĘ  ŒĢt;q!‚ÖŅ —ĉU­ģ-DtėµW|Ļ»%½xŗ8č M+żA旬 ć„3Sziņ!Yƒ%%`uįžvŚ)6eŲ<Ęجo ×37å”Ö&IÜ>ĢĢ*ŠćėRš”“óÓaüÖ ŃŹxNr„:Xyq偮ZŽž dUYŒ‡ÄՕEk@mėhKYca¬WåÄ)ŠĖ«ÄE­OŃśŽq’ĖŁõ֔uw)o˜œ|ÖV ńšg˜Čė6ß뀵u^ĒČ·‰±1ɕŹę…эÄĶ`Dx$/a\Põ^L鑵ĘKŹL_Ü6 ×ÅŃEeQ»ĘZÜZæ2b0IhčČÅķP“D( ¢6'  Ć(!²VZ@+PĖNX‚¹ %qL Ć€€VØćĶ¦Āˆ™oK €)Āl§;==}ĖŽīuÆ»p̶—¼ä%ļ|ē۟žō§æį oŲŗuė`Ͼ뮽ić–CĀ0¼į¦īŲµ³~šƒ’ė¼oƒŽ;ęš+Æ¹Ė¦ƒ˜łę„}KĘ$ęZ­¤7$‚DP¬”Š™ž›µĆXk={bŒÅĮSÓ +Ėv®»o_4”"˰V6w©×ĄtZ”¢pa0Tpģō_ŗö¾ž@“†Ų©v“4ˆ;ØßƒÖąØ#·^ućķN¤ÄuW(5ŸĄU†£H|šĮ×ß|ėōtgq±O„ 3ŻķŪ·æźo^·mŪ¶~’ū_łŹWžś”§<žńæāŠĖ‡ĆaĀö¬³Īŗķ¶ŪśżžLwfóę̓^ffFT ĄņāĀ 7^{ܱGõūż½»v¾ćļPŠÓÓÓW\uå÷Īū‘ŽĀ…}+l˜ŸŪ½oßÖ­³‹{‡C$G–žź¶–Cft€Pk(5H§£Ņ µÖzyæś•Æ:čč#ž÷‚æ€Ą‡ŖÓ@V\;¹e(=d}ć2ōÓU’õŸ—š²Õä䟐Ų!„ØA¹ČĄ­/x„œ~œ›‹ŗ¼"•€x8TJ©0pč~ė ”e<\īUŹfž1E±“jū0ĻĒ4¦86J9vż§ģīą”ĄónłJ­koä®īc‚J÷m©Ń×/QIµ“Yl)>Ė tJżæ.ćYńńÓ„ÖøŻ­zjŒNŚŌ‰Ūńč,CkX&³n¹7ož»xŪ;޶¼ÜŸŗ`”o¦¦\…–Śķöābļ°£»ž¦[{±üó;ßń˜?:wėaGA„ÉģGūŅźē>WK²E%VĮqņƒ Č‘Ķš½6xyŌ›ą—Śt™…4yXŗvURjwX­uƒ ²×WļJŽ)GCJ ÉÖ²8Uöt’”f‹1&Æ²ź“Ilžqé÷T†ŹTBŻĖ¬IV„ČUrņ·Šā8β`U nn=xóž]»7Ow–—ū[¶|łå—«¹)BĄĀŠbĄŠSYššXL–Ęą¤$Ž@ ø®¤ą0&ÉRä)ĢŽżg0§I"ŸY0žG*@’ŲP3“†RźoxÓk^÷Z D¤“֋IĢĢBP¤`YD¬ōA4.§¢8&R-†€0°õ°ĆƼńŃ£üąŸ’ą‡‡nš_\\Œ¦»Ę˜ÅÅA+B«c˜¹?󳳆y×ņ²RX‰‡¢t:¶€@1+­ĘGŽ’¾?’‹?ß2Żž™j÷Z­€!Ck7nŽøkaé¶Ec­øƒ¾Ū¦'?łÉ’žŃ0ІŃV²rt`Sų*HĖ”>[§Ā,æŃķOÕd’}©Ž`+‘v%é¹*AuÕ=@½Ķ•ĪŃŚ1²ŸųÜßK¾F5…w€ qż’H²-ƱŖ§8­Z¬iz„¤3kÓV1„\ą’oŁksÅŲH\‡ ÕgņŪY5„Ńø>'lUÆÆ„¼ŸpŒņ[}ieŗĪØØ>ļn__4Y\žOv¢fŅA&:^öÜ„Qw“ŸŻ#Ddm⦫[A_tŃ=ī~Ņ7æüå_üźĀw½ė]ūV,€Њ0Šӝ —–cw6‡@+–ŒQ¤TĘ»ŅŠ¤°å@Yˤ@óD³³³{—cWŠŹXf fZSJ©„žRp5YŻįźŹų €)ĘL·k˃žÓ»QA˜DmFlŪQ;Q¼24Eڈ±@D '–mˆˆf:­•Ž€#ŠcŃ@'Ņ˱u}óę ·ķÜ‚ZöJææœ½¦»a?1qā¢2*ķAš›źōC›p 8žØ­ø’ż>ó™Ļ>ņÜĒ^żõ³³Ż3Ī8ㄯzeŲ… y0PŻ6'‰ ƒ÷¾ē=|ČĆ·p‚‹­/ $”Šó*ēnDŅ¶Ztö¦‘,ą¬SJM”Ź“2c-(­ŻA!¹ś’‹.¹č—’ź7\pĮu×]wżķ‹&Åģ µ6‰± LwC$¶Ÿ0Ē}ĢG?ž±{Žóžzŗ[Ls„ Äi•¬ł4#OąR?ZkG¶†“$i{¶9'0żs‹ļ“ŅėGĆYhžW‰ó˜C©Ążm¾™Äqģ؃‡[kć8žšī:āeŚĄ¬`Ź—*Ė\•Į„I,>¹ˆŌ&™źfJ©$±Zė óūĀ0jҌ“čŖ›KšĘõ•U›jŲõ=ęOVåG'5ĶØ+;Œ>J|yˆü\ök•ĀČäżxd!iIˆKŒ7¼ž5’ōOoģčFѦ¹™;w[Btæ?$V+ZYŠO8įų·¼ė]÷ūƇ²0å'jŅzČ:ޤ‰,?›}t‰LžiźÆ=s)c¤Œs᤮n-ó ĒųėpÖĢĻ …¼©¾¤`2Um±’¦"yČÜȳ6 km^ėó‡Ż54¦×ż‚[¾¦ņ 5w ¶b5qHķ(ČP…—ŻtĆa‡n5–­“Xf&­¢ ' ŗŠŖWcʾT..¦,ĆĖIՂ¼B“l„5å >–.©„d'QV0¾‡Ėé²1"„”0ß~Ć ĒsL! øč÷—Ā å§įi»°š˜u[OyÜć¾ņ„Ƶ¹Ł¹›÷Åń C9nĆĘŁnkqßaQķv»Ó———kZÓŻŪv­“[­8Ž ĖLKA°é-æ¹āQ®öąš„B÷ŁŗųĀ ļwÖ}šėšaßy4Ķl˜ėÅƅåĮ}ļ{ęŅ®=yČĆ»ó(h½ų寄ØTĶõ{9ž0Ųckų÷ײkQ ¼†ĶŹŒŹ”ģ'tœP¢y}Œ×Ué¢kŽ÷V#ĻŽŃńņ)“«¶ōÆÉøń5łé?*°?GC$¶Üp“łöē왤™”Ā[Ø&¹ÄĄžÜźž—Ō×ń&BāŹÕś0oÕg\”[#Óӟņį’y‰÷¹±Sq­åń59šŃ©T«Äåz¬®`ŻUÉķc8Ų볇UĄg6nźžņ—æ<ćŒ3ņ3šßųö£õ(åZ"ÓXĻ©©¹ŲO DĄŚPR×Ē”¾%0ł9ފZĆxØŅ$)H9p' ‘$mNuZDt{iČ c0£HY‰aöć$¢NŠė›P!a„€V”°X Ó ĆDi‹nŠA„ƒ(‚‚21G@ `ÓSķ~<„č$16Z!zL¹”(‚ˆ‹:\1.™›jmßvŌŃG}Sī3;;ūĒO{j†·ļ]8üšĆÆŗęŹcŽ9&ŠŃwÜqČ!‡fq_†””2uī“ĮÄŖ"fd‡$]x§µNK– -p*wTT¹¬vÕH0D-·zÜó“~½± s$Ɯ0 Ū$9ļ{ß9žųć’öo’öĮ~šsž÷‚“ŅIē“lŃÖŌ²Ō‰:;ć•G<ōa}ąžüå/ē€(ŃNM—…5©ŗ*uåŹ7É2#Q9Dļ§&ėŌ/L‰‘y/nĪŲĢsŹIsoźĀ0IߐTR—Č>ĘŖP§6“Ŗžä…ė oŪāŠ±™Ž'i|/+EI|Œ–ž1hå‹ż4n•iLO²6l>R®ūjK5Ųß|Āśu­& ’ŹV6{½Ž† FķŲõŖäh““gB%żĒĮ<HÖB ą‚ŸżčN?ó°MŌŠ°A †ƒ( ÷­$L“iĖü­wģeąąCę’śUÆyń‹žfkŻKĄ JC­ļ3„“²P•“œ=—ŽĶ«ŗ”Ó`–,]^uW@.*6$®öĪ•4«ĒFbžœŖ‘„”ڧj矵øø877—Ź H €Pōļ”’ ĄųłęźĆjĻmR*øģ²ĖĪ8żŌįJ_Ū;rĻž=—]vŁŌA›~tŗÅ#Ą8§Y`ńsTUķΘEĻ?¼œT9ko›>0v—EeB{^‚.ɳQCįkŅ G÷Ķ^ųĆ=ąŠķØ?†ĄÜĢģ¹OzĀū?ųĮŌē(ĶęØ$ŽĆ(Ŗxv4|€ ŹŃ{ßłö|żßa3ónį+ƼbŪ±Gč±gŽwqqĻ57\m­Ä†ˆhŖÄqœś †DĢB‚˜Q°ķøc/øč„-Œå Pģé †+‡rPÓĀį Ž“iīĀ_žö§žņö]{Ÿü'Ļ2 ‚Ų|ųCzś3žµŪ_śų~ążŠę¦æśķóŅi  Y”Ŗtć;«§æ˜5Ó¶¹īģ(‡z3öŗė:ū7&d댲•™š×‰}Ѳu•H'“1¤čŖ¦Ąx~Ö~;°dł<ˆœ*¦RŖH±ŠšńĄž¦o¹)tÓ¬³šéÅ~Bā )[j aMŌk>ć'Sc#Ķ: ;jÄéü2ņdšZSPkŻĘĢu›˜“ŪŖIŅX™jl(Ó ßˆ(ü|6ŹB;#©‚~ń¢ya‹·(‚ā N§1ƒ:¹ńŠ«Dģ™§¾“lf¦ŌęĶ›oæ}ĒJŒ{œ|÷ß_sÕāā ŅHø:dØ”,ø÷=ļö«K.A—±¢°ÓŽ9č9CĖHa:¶VM“,"@+ŅK‘f1 īĀ0Lā8‚Plj%`zŗ»¼Ü tøh‚@˜ M{WL'†Ö&"0Żźō‡}%”QĀ ś¤ ņGēœńėŸ^pĘgƽžĶׯpōQǾņo’iiŠ;źØ#Ž>į8 4€…];6lŽ +PˆĮš‰(ג„ ŲJY œD Ä£uPl–éŒÕžd½ĀNšqPYÕ,ĘPŠÆŠī‰ Į2"UŖI62y [#aMć×ļ®É,1ĄĻ~ō½xżkwļŚł»KÆęŗž‚Ą9 )I¬Ģ“£•Aüƒ’šŒ?ųˆAN÷Ź ŅźJł]ēMõÅ>Ģ…öl^’©ģÕ"Vi_¹I¬säv”ųV«•’tTJ#J’„™[­–ß›Ėķ¤Tgd€˜†Ća«ŪFֈ˜×܊jX¦›Ēq;l§š ”N’¢ü U€ķBw:ćŤ£!ō‡­V«Š"Ø!\v‘Øļ¤])ū²cz‰}ŪŪāü*`ėøN™ōtQž­É5c‘Ō>×å F9¢5šłWėļē«ādßū`Ü!(e·gfRXŽ·ļMoś§w¼åm,Š@4?5\Zq1+1V1§z_’śāWæśåÆ’Ē7Zø’r[l¬@„uu WWź®öŪ£†—*Ü,GŽs!¢¢!w„Ó‚Ų’ŻcĮm¦ŚÕ–½7Gń *„ƒ\ü9I’( Ō. ń'TIU)Ż)+ŠŁ,¹+“†s1°ĘŚoe¾åył|zTš;źä;Ń€²„åŚĖ/»Ļ}ī³wÉøuųo|żų‡ "N%ęhU#™źx6Bā[ŽĖqRóņ©Ēlł­Y+®‹;Oó%± Ć ·–=>3«'YUA7Żg,‘(aa-ōŌ§<åӟū¼Ö¤­„JŁžįƒü’ž–Äń/.¾ųōÓOwĮ|ś,FDD’OiŃ"+.’ݽOŗ÷”ósūöķ[ĢLwöīŪ¢S8jļŽ õVøÕRƒ˜=tóžåÅ{žrڧ?ó…éééMēŁtŠž·‰ »aöŚŪv)"ŃČĢ· X˜įį[6k1Iß¶ŪŚū‰Ļ|ńģ‡>A dé§ß’įSžņŌÅ}½}ÖBi'¹'Κ ń$bc’3²„ŸZ„ūrĢ£Gū7ēM¬Ņ5~zaU֘¼PŪ“_7¶Ž¹å=+^:¤a [GmpĀ‚ž$æ“Ļ݊Y„W~¼ŅXel3µŸÉņQ_Npu<  Žł°Ž¦ėĘꄼ6ē„EyµQ®f’ł0 ōNvĶ͐ŲĻ&ˆ'aS‹ń œÄ±DmŚ©u`°¼ÆŻn³nc±¼+jµņЇ<łÉO¾ä÷WœuÖYoxĆÆæžśÅ^  Ó _šÜēżĖ{ß73ÕŁ=ģƒŃbruƒlĆb $˜›™Ś·¼āĘ0$EėJ[ÄV‚ff¦––VRœ¦ÉZ €Į ŚQŲ“n»³wŲ¦Ē›Õ G{ōĶ·\oWdū włć?žć§<å)ææņŖ“ļ}śęýīŗėŽŽ¶M !ƒ#X!<#<8kWMV÷&I (NžĒ ­öN°ŚŸ¬ņH'óŹ(©Īż2E®ÄS"$K‘FqUPˆfRā}tQēńf‡įD+BuĄ²ÕŖXĖik„J ånfÜxćMÆ{Żk>ń‰OhG'0MPJ­&Ā]6mžå/9sč– HEn-Żņ•h¬•+ķÖZM:I2æSŖ Ąä¾©D9?ÓįU×Ķ»²²Ņķvƒ@gžébļõz­V˱Ēó“ĀOĘĆ$j…į„ć8nOwœ€­›cIlĀVąõąII‹±ü„~ŖĪNĘK3å2ČN¶'-ˆYK”Āų’¢¬å¾RŹÕÆźė½×ėµŪķFĶžQY°:$6I¢µvĢeĒ`1ĘēFHÜ“GYėZ$ §½&²O©£8UšńŅ%īÖ‘p£žV]×£mÖJąŌ„aw^Ć«_łŹ|÷¼8,†ŻŻn—Ķ0 Cˆć$ģ“f6Ģ]tĶ. ģZø„Żnw£.DŚ („ķ±JŚi×,ŪYįĮł©ĻFH\i‡WśĖ§}īt5e6>=ye’jåMĪ„jR‘u³ģ%¤ ‡±“vs1O!¹“K-…”/¶ģRQÓ OL²©œ§Ö¦ĒbéŁ §Ž"¢xii銭[†+vƒ¦{ßūŽ×^ćE—^Ž=hó ßow;£(xć„Ö½žŅԌ­^€ĶA«Ē łŖI’DėP©Œ\R'­ŚwłjDY‚’Ż.Ą'W‚ؼ(m` ¤E~żė_ŸrźéœT‰“ĀUæ’żŁgŸ}ĖĪ=q’ųÄiŒ÷TeĄŗ35afzšśqĀ`‚^ņҽķļųÉ’÷Sžņ˦×歇nŗī–ŻÆż«O?ó¾güĮ™ÓÓÓč^ĒwĆ 7$,;ķēżŁ žéķo§¢{ĄY‚ńiw?i×ķ·&żAE½Žą!ēœóŸ’(ÜqĒO~ŲīŚµkמ…Į`H­Āž§ÜżžæųĶo¬Ź|1*ūƒ”«#eÅéI|:,mšNÕkÅĢć!ńų0˜™)ćä#éZŠņ…lmŚāt 8¹#BėŖĪQ¬‹§äÆ ź3+4xĀęŠmėØĖÆ SsNĪŽn:cJGąŖļ€ˆ0×=»”ķž[–!æ­õ«®_ē-†fVO üy ƒv»].źW‹žūˆó 5ȆóĖ*§c#¹tՌĆ~n=l÷”Q †ŲB©„½»n½õÖæ’ūæ?÷Üs’ū«_eę“O>ł½ļ}ļ1Ē÷ƒóvļ{Žż÷æ’ż`˜ c”:ƀsĻ}ō§æüµühV`ĆĢō=īq·ßżīwūVŽ’žw½ķmoūż•7rļķ|0Œéõz:÷±'x÷{Žū^A{jvć@g3ƒübZæßļv»ų_ü5¾qkņ j’{¼Į¦·5°<čõž’¬ēüžņĖ.æüŠa¦¼Į>ÅqĢÆ~łĖžéĶļČ'€I,iÅĢa؋ć![Į)ƽ6ł}šw’˜( ąõ@–ķcÓŽ3·tځFy5g;WB¹LVKc3ī¢(R”īõśŅ;?O•‹°1ƍ®<X0C…"p„7¬µa ‰2—Q÷'PXg.Ż’JqbE„­åŅ_Ö°v¬jĮn—”–ÆGµ\„0Ÿ ÕGŸ‘÷2ā€v #‘“ēęÖCĢco')¤…„;$&‰‚Š‘ć]։¤dć!9‰.{ś¹‚.,–wļŌ '>ž~žćŸ„”"– @–c­uÜ·ķv„°Öö£ĪžŻ+éöżīwæÆ|ćnŚXkĆØ]ŻödäųŒ[³q½’ŒHÆ93OŽ·oßÜü|NmrŠ8Č;›ŒńPåaā¢ÖØÖīUÓė«ĢJn'..ߔg»*ex^»iŸpÖģ 2aļzŅM©Ą÷—zäė$9Å Ńk“Ä×põOŹfŃ×¾öÅs’čńGtŪĖ˃v'œžžžīOvų1ĒŠ&ė*V Q•u”ÆM*4$Jģ cĀ·«E©Åh:«ˆØŠÅ]½€ow5Žų–ß½å9Bo{Ó_÷ŗ× Z‘eÉ:}ó›ß|čĆęÆźŁ’…8[ėø"²gĻž-mQ’® t;QæŸ|÷ķ-­ā8¾ßżĪŗīŗė>’_߄mŚEĄšŌžęožķ}Ų½{·“M ŽųÖ7æüåÆōÆ9F%"÷ŗĖff޵{ĮœrŸÓ¾łżæą9Ļžģg?{P·³¼¼Üź“ć!÷“Ų@!1¹š—æ8õ”SYXCå±Z\Mõiéw³×—[%¼Æ€®Ŗćz£xĄj±Æ3·&VĖ„ø½‰³SZœ‡ćaĪßzŁ1­5²  šŠÄ½=€×F¹{ 2ŁbŪ#‡Q»µ¦zļ$ >|•^Ó#i”b®'×DBļ'|gƒįIźŽFó«ŽŖ‡0•wVķĖ+_M)Œ&MiT{*Xąūb-īÓ£tČV­Ō5^ĘfU¬µöŻ\ÉDP,r10¬Øv;m˜Õjyaaznžö[nłÖ·¾555õŲsĻ Ūķå}ū¾÷½ļzč”§žvŚm;v‹Č¦Mˆhļž]6lŠ„Į`053 ą?ūŁigž @’„¢0žF¤ņšŖĮó0]Ā̤ü/ūZ=¬<o8aJŽ%V¤.¹ąüóēęęīvļS”Zc³ Ūķöķż„?ÉKŽō®wŠ“$AęÕĀ“X$ł›3å¾DbžW¹źr­½J”IO¢/HåŁUAßĶ‹š©ü€ņÓd°ÖjR¹ę­5©5Ėp0pDė4ˆa.¤‰@‡ZkĒū Q`¶ZD$ŠĮ°o]"@Gé4³†4‘Ņ…$±QØ$C×8—ī$l… ÖŚ ¤ĄƒRT-Ź{Bcf0—Żö•Ęō‡Æ\µ¾~e„;^Ąä6QO†śŽVžn'qäF•J‰1¢•RŹęT fe“ėwéćĻ}"3_uĖõJᨹł]{fg¦÷.//ķ¶ŽØ­1ˆ-DėŻ `ļĀĪé¹¹L®Wē Ž±qŃDg+”©s»Vhp­E8Ÿ"5tW‡Äʼn“u¶FLųÖØćiÕĆ«RUϱy^wWø%q»å‹×u}”Ü\‰’8&h­FUĀó-„ iQĆńēĒfÕČ%Ē(õ!×P°ń–÷-­ĢͶ;†śżžw;ńWæ½$ĶféTŃy)pE՘‰YJ„ņ‰cŠ7cņ(n¶Ó§P£9Õ¹t, ĄµW^qĻ{Žs0H$›‘Ziq s0c\]½į~¹Zw²ND‚@¹&dā‘€ē>ói’ņ”„H‚3ņ‹~żĖSN=MeżóuäŃW^{mJKF“"uD‹6nœ[\\Vw9śØO<ń‹_śj”"Ŗī\ģGBˆ`zĶk^ó’÷’¦Ż(<Ό¦¼īe¼ÅzC’K~”ƒŖ{Hż”z?ńÓćm\Wµļ#=½¦ä˜ų|TGÉŗĮŻ:®”¤łO#a#8@BQ„©B~3•£Ÿe¢’¹ŠU%ž0!ŗź_MBT³+­É‚hBtŗīæŖÅī:¢óż)QN’Gńs·Ę°ÖšØy“Ē1œWĖfłG`5|Ļó©eöQž¹Ÿ\ą~TTQ+ cE¹dT[Ųź‘^ »įQՔ³·ż¦¹^b“$)SRĆ?vwäR§tŅjµœōWCÅ/’CĪ4“²ƒ§’·*Ć?ö®ü$žcsLöJĪjq¢@ZšĘW¼ścūŲ»wh ¦»Ż½>Ī>å>ßżīwõL·BZ^īMMuKz¶ØŖµ»ēN¤•RiK!¹pÉ|g!6F‘w§ø1FėPŽü c¬1¦µ€”Õ™CLf(*‚ƒŌ’(åzBžx¹T1„MĪ™  Õ`0hM·ƒAj­µJ4!p³ÓPB(V¤`¬ T@›°ˆ‘®ī6€CaÕ„iŒõŗƒÄ©·Ö9ŒĢŁ1įK}ķ·¬gXrĄ6 ÕeŅ ł(µXĄK‚‹R*ķ„ēŒę] Ąp„× ¢?}Ę3~õ«_]yķ5t€ SŻ8ˆk$N°Ō7óóŃĀ‚J$°_žś—žČs®ŗźŖćŽ?^˜‰4ˆDčrÆ*ø€LÕji-3›«ū&e[ČšSxó{qs–ū(Š;¾¶“£2…āØä$<ŗś]ąs„Ņžmfq4H®į¢„į³TunĄV’VvźxÜ`ü“›ÉÆŽŗö“‘æų³ēšß>ā®üš™iEį{>ōG>ī‰ »Tšä‚["qńj£ģ˜²ĒŗĻė•ń*×u>M<“Ē«™Xó÷æ’/^ōRE0‚( ’Ų D‘bįg?ėŁ’žį£¦®R/;„¼!ļ’O»÷)æłķo(RVRmbüņg?¹×©§"P("]0PPn9#"(„ŁŲNŌ¹śź«7¶Õ;æ8žSŽ=̳cĒ®0 żdvv:‚[īXčQØś–+± ¢°'.éۊZ+ż¾žĢk铌s©čć4āˆ:®³NšBØ;\Æā~< ZSŒ±’eyćē¬SQČc0`ڟjāØQŠc#"ī”%"ÕūWJAPœ""*K®Œ k+L×®lŒ|ŌŲאė°BFgoÜg+ž“DĄā}łqOå'kÅKußĖ #ņzī¹>>c>t“’W¦xoxŌūųµßńąZW–†G:ZFmtR£’wŸdš'Ÿ„¾ŽQ)tēr ƒ™"ˆÕJRa$PŤ„4ˆ8ÕķˆtĄØÕbˆR{s‘,bPJėŠ¦*a‚”Ö‰aH)Ī“GŠįøSD)īlÄ;łARł«Ź³ždn(K:ŠÖ¢õź·¾ń÷;o h'·§ŗ‚üźēĮĘĖ ØŲyD05Õu­/y¼[ĀN®lAFQaķ+° «LŽ6I¬£ōŗvSļT1oé0€Źts¢¶°v dr6Upż1³x» \œ"c ƒ˜${é HĖ6eRP eŪ6œ) v; u¤Dqd¬Š“a “!4VZ@!$€ÖJƒÄœ%‰²ˆ‚Ąmo®CGƒAœ÷c×#$'–ė¾ƒCÅZ­Öų½gēĒÓØ£ŗ’Č«79O2µĘOij¬ō‰Äq åō$1 !ą”(RbaQ‚Q$Ä_ūŅ—=ąn÷:fĆęÓOŲž¹Ļ}v×ķ·Ŗcēgē[Ra§[Đˆ]nZHģl¼Bö”ÓOŪ¼é`>öøDˆTĄcw i’ĖƒČSšhDEŅ0«l¦CŠTcó0ÖøJ™* ˆĄZŪxõłqĢĢc‚Ė1žŅ [Mń{įz~%$~™4ļSs ßčY4ģV0…aFA „I)·azzcgM@cJåØ5:¹ś$X”v£ł/ųąoū+C0 ÉŠDaš‚ē>÷†+.…uĆMĘ:wŸ&R„ĄO"ŽZJ!ÄŚ£ŁZq8—HSN12W²ŪqńRe†¬²¢UšŒg Šė™Åå-­(jéóXÖŚĆ8!Ā/yįמėkŸśģ§DI÷[ИįacŲCÆ%ółĘ%YįK¦+4_zy4[y‡±ŚTõ9_į®Ž‰(š©%łōr5,ś<Æ_į<ÜøÓī? ¬ty:“œtėźRĄK¤uJŖÆ: ×󾯟ŻUēQ¢²oŽJäŚČł36.ƒzuŃŻ²«cŌ·Ŗ1Šŗ1ŒžPŪmŌ+żŁ“Ÿ¦“³ĮĒ|V}`QŠ_3œ}UR'kżŠQj ƒėÜ Zseņß®ŗ°+Łe·_ųƒPÉ”4§õd‘Ņs¦2Bi.#§1ĄĢ†ˆ3ƒ$‡O˜²ƒ-oŽsßkRQ km~6ˆćĒę[³ė¾T"‘"XŃa ²ws0ZŅķXņUC€r “’ĖašŖOdŌRmdÅ7>č1ūĒʱŃY˜…-Į—üģ—õg6wІ½Ęģ¬Xc³œuŸ3ĮB$—‘¼fĘźēRĘ|fcŒpŖ“ź4ŁX¶:ė“0ŌTšš9FtĘ,-¾Z­V–]†HźH Ņä¢ēĢ”'Uóh,§k’V ŌųtŠ*M`hE"×]s5ńņąņŸ’fåÖŻž’3„tĒŠ¤b«-ĀV[XŁVh[”jµ$«W÷}GpsL? TŚ]I“²Üc!;R0!ޱpŽŻķvT98*<ŗ<|i·Ū¾uSž$āŽ17C}š,­ŗĶ–ŅjŽd™śo“AQŌnI¶Į‘V¢€HC€ ,žó¤§éįšÆ’ģϦ£°ŻiæćŻļ¾ģź+¢™ö7\·eÓ\ŠoĶĪß²°t 䏎€XLܟž‚=DS÷8į.Ļ|Ņ£ö-X¶ņ“ .<õ>g ”i+(U*j˜V«Ø5§eĘ0ˆŲJ†K\¶Ēé¢;ÓŻ”¶öĆS„–Ū$‘%„ßęł(]9©Œs£f—ī)~­uX @G†ųõ(%ƒQ#/{D¶ĮE¹ĒL>]‰<`ļvB†®¬tš\sū‰ŪLDŖœ/‘TŅI,»cB,» bL͇™A`ˆ›œ QdImæē½>üī÷¹qó­ĆĮ•»wŚžšä“īvĻNųÉ÷¾cMœ¤Ē\…YšÓᵁĄćK«Ÿą’ø˜N¾”(Tfggl’Ź©į;hV …<˜4D̶;;sĘœÉš5½Ü$£‡<ä!Ģģ“īS7ųń¤ƒU ±"–ټćmo9žŲmi£vŠ» 4©@§iR nÓŁØqĪ£ł„Ē?Ą0†”ji"ąE/|^~żZkd]µO}Ö3ē6lœm)ģJŸPāī”=öēzPōg/xŽĀžÖš“O9å|ä£óQ$„$IŅüĖhv­)Rk4›‘•&Į#Õh<#›¤ŁŽĘõdUC÷QäźQ{V+ŖMk£ąÕśŠx½0&E^’F :jŪO4JDA %ŗhĻ _N^+Ɔ9ŗ”/ ±Ž:žšŚÄĒæ²fŚ Ź×ųVkŅ(Æ4ųmń•ę«É¹”“¬–5¹½>ΔڄŽüįI(yŽCX¹ČÜ1lĢÜØX.[<;ØüZ kӚä²yݘy>Žz²…;ŖŠĪžZŠZg9ŗ¹Ņ#¦²Ąī^łOĶļīNi®ĪĖ·¦īĪÖ*ę,kńń'ŠGų ƒ·£uk4NžĘž“ę} `AˆBśĢ(@ ų~ųŁĻy¾u1Ø·N9łž?’ÅÆ@ik-‘v5ŽZŃ£,`,ā‚l>]-ĖÉźdØĀp®{.\Č)֕c•HYĖllŌ YrĪ'H`=Ž5€\i¹8¶uZ†p2¶ŽŲģģŽÄ+½ØŪuöÆ/üŁYgŻoĆ\”$ÉJ_¬@§¢#¶¼““tō¶ćn¹å–ūŸ}öīŪwœzźÉD45·ł¹ö<Ūu EŖB”ģ­¬8(j+MƒaÜjE’$* d}¾"Š(Q–wź÷ūv§4²£S”³u÷ÅTz/'‘™u­ŌƤ(c†afŁÅĄŲ8C°ŹŪ;ŽžÖ×¼ü•Ū;ōŽ[n큵ÖBZŻĪž•ž–Mó K‹ĘšÜōԾŕ9€A@¢^ĀJ© ]õįų1OxĆż@ŽŅā: Syö‰ŻžĘĒ|łF§vžš`—…*ņļMbƒ°L­'T\  ^¤ 1Œƒ”Rҹ3­*|#JJ x¢Ćŗ”Jœło®Ö0€…J¹ąóåœÄ&*UÕfŹær§A­99eEcĢĢJŃ"6“+P YŲ¹sĆa[•BĒ¢„TŸynnžļ~×Sžžt°…ÖĀ ’:I“YK£ńé$±ā*A‚T§–7Õg!™įSCƒØ[hźķļ'M$?kĢG?śŃē?’łÜI½®½öŚ#: qzŒXO&o–õśZ†R›ēēWČiYė”ŒłĖŸ’ģ”ÓO·Ķ ˆ `†.Vß÷¾÷½?üƇ ŽV±åN;Ś»“$A$X«“Īx²ƒÓīuņ%—]>ŪmµÉ,,Ųī”2FbĮžńļ^õš×d&ąI>Œ"n”QxA“&cXD“¦u˜*}×~AøŽQ<Āg~ĀV—5ń}I݊uč¤ĒĮzæ*®õėˆ—FŽr–[×ZÕ%-•«™<©Ģz“™3¦Z7¤…QäŁ'Ä] ļńµųŠĀ֘;…FFyHTNĶUó"uĶd_žŽ™]+&Ö"j½&ķxcoÅå ÉB4²8ą1āš^Mw’6†ŗu’˜0ŌśouK˜ŹŃ[ßĪrńĻ¢7IF¦ŗ×”(¶Ž¦‹z<Śø5€}a² ŃOd]ĮŖžŪz|_oįpāIīõ¢–üYī©)~hRõEČī$+æu@ßU8IĻĢś¾&wzČ+ŗFX‘XXéßtżõ§Ÿ}ö{ö”N»iŖ½¼2ųą‡>š'ĻžÓ••å©éiŠ<ŸõM¬1DZDr—Qdf Tź±T‚µ©i:nĢģp @ĢiÉW‡*Æ5آ؜"R¦'@e9µMü¹O|ņĻzęsžńŒė®æś§ē’, Õōōō†›Æ¾ęŚ­[7õūż°=}Ėķ;ÜĄĄęM]{ūÄYJ„ƒŗSa¾ó]’üõÆż¶w|ō£]XX8ģ°Ćę6l.ōfI’D­–@”¬µÖź(ņĶŗJµ§«\Ś?qG­VIƒTÄUšż„©ÕÖŃ!Öhz¼Ī&®¦ü£ƒ~¤“Ž/ÕĘĖ»w3Ó§Ÿ~śå—\¦®B;Pʰ“+¢h_æ?“b.a”AShzzśŹŻ»hÜėīĒwÜq’ńŁÆ’R ÄUķ!Š„`7Lt†²¤¶ŃiāZVHäŒÄr×ėĢ6ss“‚^æŪķc•S2ĻdJņŖ<„9:ć@”о0¤Ą»ž†„š„±r[¦üSJ6y58§Ÿųµ”HI#ĻŹF“ą¬ÜćHµ÷Ū­E h”¢šś®Įœ¦hs;āQŻ•ŁÄ“V’į Żé°°RʹL€›5²rĒīmŪ¶-ōV6mœ[ZŲ'G@žŁrņi§Į)ŻPšØõ)© ^S#ī1Żž«¤¢l 1•ŅO^ž‚YH“/ń†røŲ¬;Kå¤sC7?aCJŻ|ÓMŪ·oļ÷N āa„aEź©$qZ¶Čp½U $ń>šæ~ł+ĆŲŻœ‹+„„ū+Ė»ö+Ž·waÓ¦MZkÅ¢ ,B„” ‡Z{zõD@ņ£o÷!8ē łé`eeeq)ٰł kwļüŌ§>õÄ'=IŅ–®ęœą$ńFrŠmgLł§ńƒD,uįś‘O±I^kUHģ{}×E:}NA*x¹ZßļŅńmDćū‰}`ļŽq‡e”R¹RƒļĘ0;ÖW"®=ś’ōg9ū(yoŒ*Uh=±é˜ĒÖŌåß0ŝŒRUŁĘJ©Ē qY×7OXcŒć8Š¢uσż¼’ČĻ3Šł©?ĪĄĘ鐭éHš'ŻŒa§³6H\ƅz¾iH½Z•xÕ¢zż\“MWćL`f'Ę³īŠŠų4ž”3ŽŌš'DUEÕęų²t z J+öV\P]°åįtUG_©¢rYł9PØ ’?*O‰­µÖŚ|-Oųt&4ńcę1,Y¤īŹ©śqś©ęŖ%ŠŅŅĀģōģ£ųŠļżšū† ’DOĶvwķŽIŠ0Ø>ėśœ)Q7EiJÕs]›”>5F…A~øĒńPDZ­–'B‹ÅÅ„ŁłʙŲ;Ó¾4zNėĄ9±–ć8ītŪšŽtgü÷³üč5Æ}õołė1ŗ-€al»ŪRŒdļ¾A·lŲ°a8ģAāŻ»g¦»ÖŚ0l¹¢b+źŽ¾s÷¦›oß³Ė9knŪvŌ5×^ļ“f¦:Ø}Ģ1Ē<ń‰Oü“?ł“}K+[:źŗ«®>ś„¾ü…Ļæē=ļ9ļG?lLę"vÖ°C¹*Hń¼1FnæżöC9$³bĪŌČP+ą’ø±cÜi­Gk$”bŌ4Š÷;¬iV°ß¹ćöƒ6o›„»?öńžä?zŌ£õö7æe×®IŠķø&jbf„4 IS‹5ŠJMĶĻŽ±{!L‡ŗåŖ[wtZųüæt̶ćß¾ŻŻ–Ą ‚D _ =«\13T­JźY‰0ʑnvQļ|qŅKD cŖH3Ali9]ež–3Į*Ö°1Ęķ'ĪÓž’±\1ā­@Ī\Žl'ń’—Ręr¶„B|éf7ʆ#RŅköÉyœŠäAM•°Ÿ<żyæĶĪ‡ÄŽSVį5CbNwCV…‚[śŌSģK‘sŸšŲÆ|åæB€ ˜Ÿž‚`óęĶßżž6mŻšÖ—PŻķ±°Ž7» ęā[ƒ¦œų "æļŠlai‹’›.ā8nµ¢Ŗ.W£]%3)Y\\œß°1{@D¼ēŻļłó?’s'¬UÉw²yZkW³uŸe¬ “"€ćĄ'>ń‰ē<÷y¬•ė”}ģ¹ē~é _ĢĻ,W$³i£“HIŚęzååWlæŪID Dݼį–;ī`„ŽU”‰ŸČ,īŪwä‘wŁ·Æ·±,pđ‡’×ó„īęĘÓf7ŖrEekW$†n¼ń¦#Ž8ĀᜊkĄų£¼ĮT/[©ćZ§Ē®c€Ē‹K7œR=W„ÉĽÖQČYG-ŗJJHŃZCIEg{Œ5Śŗ!ńų+IF šh“5-J*IЇĆN§3Éą6ZØēŻeūS„i¼±\;t|uČē b-:Ę’3!ū*¬žtŅSq®°"JH)õҁ©ICšUj8• Zj±Sž<“Ī2“dēŠHbÆĻ¹ÕlZQŸȌæĒcą5)xÆjq1ź}Ę'’’_ū™2ĆŌOĪ5ʾ_lÆ\/2Ō«vūĻšœ`ŠėMā8Œ¢#?ü–[nŠČB,šŸŸżōžųÄģ=‰ˆA£BdškžĆA”0VVV¦g¦2<{ü¹Ū4”‡s<©٬¬ōœø— ¦sóOkŒ cl DD®U:4÷cÕR¶?xÖ3ŸžõÆ=N¬Za{ ˜ļD½~¼qz6±Kq,­ŠYs»­Œc ¤¶ tŠŽōbŲŅh·ƒ^ψ Ó” zKI»˜@;3ÕZ\NMw{ƒ‹…(RJ$ŠY¢™(Ų~ģqŸūÜē>ō”~ų”’łń’č“ĆūÜē>ē<īq§żĮ}i•¢ ņšī]»ŗ­ngŗ[T‰¬ÕA`Q唼"źĆģt`Š`k…sÆ\°G™¦5&Oh`2~m ¹"mĮé͉…$°C££@œ7ƒˆI) “‘ą_łśŻO<žUÆüė/}õė&ŪģµŅ‡*¶V“Öc”ŻV1c0dŗŻ6…œ$IÆ'†`ćA›^öņW¼źu"ˆvAXŁēÅÓYÄ .yå³ĢršhÕKQĀĶ—iz~Qłģk8Ėü¢hM~ę1ä…¼Ī6+âе“? kY“bš{—°ØTģ‘$SŽJi„¾_Zįź1ö3_YI Ō™t᳊’?sž½3Q®zDā8nG­Š•|§„ZŖŗBĶėrœ<"ıq¤¤Ź}Õi5%ŸŲ,¾qš•Ļ}įuõŠo¾±GB„iĘ†Łł8ėŌÓžęožęē<<õG°VéU=yö65U•%wÆ  8­÷ś½ØŪ!ņI”ŠrCīdĪĢV8 ƒB„ßcs»éŌH°*Uū³<ŽgEŁh –ł kp·Oøå–[VVś,ŲvģQW^uUö2 @ 8%"•ædŲSov²g÷ī÷½ļ}æłĶožõ¬g=źŃĪ^?¾Į…ł•żWļ~÷{˜Ńnéü§·žåĖ^–'Š#/3’üķÆ~uŚi§?ąž÷}ūŪßv{ß*: !‡¤į0!¢(Ņt-ŠXE‰ŗŃ*IDĄDcU Љ7'*" )¼F‰ƒ#|G…øćøµV”±sŹXHļå‰Ó¦ō,É""~*³Ńs”BwŖČ‰Ņżö­O}¦UćĶVZZDÄ×WS’É&&—@Ģńp’$”ć•y™†ĘHn8~Żł Ÿ>]-¹gFŽTŒ‰IĀ£|8`h¾Žāį2¹ĖR¤ā²Į˜"iŠ“b>^™ c€kcžŅ•£Ó>"n”Ėó oé2¦5žŠ0ąŽÉ‘łŖ™’˜s?Ķ$ž‡Ńļž|čZ}†×źvš?¶äżé”;›üü{ņ“žōłĻ!(@E”µ–?ņļžćēU)D³™—NŠj/iÕ.›ēy?¼ ¬ą"“Ų ŠłY $I¤™Y;Ö¾*øVRŠėŖfŁ¢0i k@µR=‚$^ŗØŠ±” GŽ*ØU%AŗØ f ōdāióymL5šVP”źh„`„zÜŌ•ͽŪīŻ»7oŽäēüņ82Åc_ ¦ž7 t ̤Ž’öo’öĀ—ü5ˆZlgBµqC«ÕśĶ·o9hĆńŪŽyõ«^{öcĪQJ‘ˆD§™ˆ P`c)Ņy."†(P³"åŲ7©ŖQZ U>n±wå+ša(¶ĶŅėsŠ_­ĢąŠ…ēŚź"śšÜcźĄn¹įĘ믿ž ƒ6żźWæśĆ‡=ü -[ÜdĪāĄ`DŚ(õ‰Øŗ*+iʗ{–1€¤ßė÷ūßłĪwŽ<ņČSļsF˜ŗēɲ’śŹ—łČG’‹Ą)8pŃB:«ŁHĒķN €å¢;ĻIrLX­µe™LĄ¬Žæ‰IĢdģÕē+Óć×L·ųõ ĻyÖ3®»īŗ§<åéįŌ„”*`N%IĪmYešĘo’ŸQxz¤ P²O’HµÖå‚*hÄe‚JÅƶ“\‹d…į ¶Ö¶Z­åꀩkČwĮFŽ)ĄĢ)ŠĪJ/+‚Ó·5ʄaą^Ä&Œ‚–P%a×PT,©<øō‡€86aŗĄ;ÅɊ\8§”R”r@²ż°‚T üd2üßļŚķ¶ćś–heRö!©Q¦+Œ÷ę ‹³³³¹jA~_āéķ1³å÷ˌ^Æ75Õ­¦T\oyź9ųÓg=ėCŸų €)“’ĢLw— Ų*€pNxążĪ~Žs_8===5?Į̆Y„T "2’‘@“_ļ÷ūV[`ē®=[>§.X+‰†üAUd˜ŠŅ²ĄZ×NU‚ž¤ŒŁ<`ģ”±Ņ7¢‘R •ń©ŚÜ`¤y”QĄŲ–\«£»“$¤< ÆW»%„\’3eŚ=ćļ‰ņŹE_{ī7–“>Œ±"Eė+ĪwŒJ;šžœņ£ ¤«F)²&+īM«ś$ÕeQ4“§]<Ž?NĮŒįÅöāķ”Ō|#cŠDÅ|Õą¹±Ōq@ś¢WM|”!±MEœ ŽŸ+u]R£2ż’u‹į‚œ ė`£źEcüø+Īŗīs± ÆpĀÖłQŁ5­­$ž TŠ«CDX•–i“d-iUkøfiN»Õ3÷ENŗˆ98ž­§T֑õtքL*«t8ź’$®SĖ*Q~Žīę:żUąjū‡7+Ź®‹]RŸE£Ünü52¦Į~Ā“ F÷,“Öj]Šļv·»]zéå.]ēpć!›·\wŪmpĮ:ėJ¶ƒŹ*K^µ*KÜķ¾š2Aņ±\)7 f=ʰ7hMµŁŠv]š,¬™®¾ä²‹ó‹³Ī:ėšŽ'‚blŸoKŅļ÷Wb`ŗöūÉt7œŸŸ_,&IbL“ŅÄĄ†Y ыKńŠ#¹0k@+œrŹ=ūŪ‹¦§§–—W¬EØ8f×§Ś 1ÓétmæŻ—¬ 6I„ z–LOµ‡Ć”Ń }†Rhi•$ėVb“.X)³ˆVV¬eĢ*øHŁ0œ×ņĘ©n’$ŠÖ^$ŗA«ÕZX^‰tˆB(ˆ`™t,©åčAs›÷ķ% €20ĻĻ}ĢQvŸt×ķøļŁÆxÅ+¶oßž’æxŃå—_ž›ß\té„—žzĘ©KKK‡w¼Rꦛn8ę˜c¾ńå/}šƒüéO.¼’żļ’µ/åņĖ/’Ł?}Ģćžč½ż1LQųõÆ|åĢ3ī³iĖV6÷tżžWžėKŸūüÉ÷ŗW»Żf…óĪ;oē·’ģg?ß„`.Ą¬ i@Ļvö-öē§ÕŹ ęZūö g¢°' §Āå~2`8ūģūżšGēwŪįųCĖ|źigZ'Õęj,œ<€įŲC T UWƒÄ• œ9 šĘŲ ŌZɤIŁĒu%˜G H8’ßT¢2{OV]Æ×ėw§:łe¤BÆG4ņHGSTEå+Æ"fKlÓm™V–{SŽ{/% 1f&R¹ęV Ģ x^%ĪŻ¼žA!I¾|—Æ[YŒ›*ķ>ɜ¹TZwo•Āæ2īõķv;ēKē‡µbŒiµĀ$I%Zƒ B©¬Š‹J„_———gggˆ0 ¢(*ńŻ8ą€Ó§>ł‘W¼ā·Ž±×µÅ0ó–śCnĶ“––†SĄ|·}ko07£;ŠÓÓÓa+:ū~<ś°#žł'Ļ;īˆ®æłČ#$­‡Äš“sL;™5xĀćwņŻļłĻoyŪp8Š=ļū?8ó~÷5Ę“¢–°ė•Y@ŅŽ÷"ļPV/÷靹„¼>,f²Z„„1²)¶ xm4At—Åf~ƒFčeßųrGŖ‘ō”՝é}-‚Ķܤ9gÉŻ5µģuž×=Ī‚;-õłł¦5AāIĀĪJ ¶žŠ_+$vœÆŠ˜ėŖ‘pŖ02Ćā½aŠ› žöj{õ$°=³QUb¢Ÿś}"cäE×Zk†Ä61ŹweŹW“H\6>ūQĢĄU(„é:¾T•÷©V½jšĀå y˜ėÓ÷‡ÅĮYūr^)~F'×gó&+»SĘjBÓ Wßpį…žzŚÉGoŪ† ˜@kvÆ Ģ‡¾%aL±Š'r”¤PŅ-Cö؟ŠßžäYü^…µ¦ėž7‡×$ö?pm¾2ź© ļĻŽ±ī‰Qé,j”R›§=źühģR®īE–ED‘oē;xÄ#„”i„Śķöž^€Ė.¹|Ūöķ¢„™5„Tēøßŗbń„•ŗ‚‡i-ė@±cLŽxI Öp~ĶA ]½1ÆķųdČ6»@z°¼Ņīvßü÷’~’GēŸļī|Ų8;³gq©Ż ’$ī(­¢ÅåA" Ā„^rČĮs‹‹‹Ė}™jµ`‡! Ć#Ž8ś Oņ¹rgjjĖį‡_ķ5GmŪvƵWyų֋}Į†™Ł§żńS9äk®»žŽŪw­hēŽU°Œ"„TŌūƒA·CsssB¼cĒ¢%@ŠVį`$Žäܲż!"­Ė”[6ßvĒĪŁéöŅņ Ća’“ĀĄĄ$¬hhI)Õb3…ƒ8 K‚VlĄˆBe ©¶p·ÓJ®ōWQ Q'ˆō†V4ÅV `ȃtéV‰(`™šźīZé¹³€‘BD”XŠ"(„(Šża;½€ˆČ²0 H1@QāŃŠ ƒ©ʘ•!‘cČuµJīXŠ"t»ķ ” –Vīč Smyä‘]|ńā¾}³ĀLPš@ĀfaaaćĘyååI«5”¼hFZļÕ½3:oī¢f4Ę’MŹUø<ŻCr. _vd-//;;ØV«EŖ(ē¦ßŌńvY~¹äɤóó·ą$‘RčõŻn•>srz.*Ėӕ!}џœöA”ŅŠŽŽĒŒBĢ©\Ąd+* ń"CÕśyµb?Ė@„_Yéw:GõwÆĻs&)˜& BQŁ×łKļ@¬TRŲ©rz ½K.»äß8ļ?>ž©ļ_r €®`®ĆA˜ŲHHD«¾5–]Ń!qA¶“Ū:<ń¤®¹ęš’ĒæŸ÷üéļ  Ķóów,,X`×ŽŻŻnWQ µfˆR 6Š,)¬üēU@b*‹™r*»Æ>†ęgożĶjMƘ'yA~ š²ł9ŽTśJĻĘQUāJĢ_šŸ”g{õśų}—m­ ņ”\MŠ,µHŠŗ–t«FŻćWKZÕĶtŻnTŲ9”9_‰EøQ[n|Õ½īV3yA»" >ItרĪ[ŗžŃ<£˜Ś aAīé¬Ö\7ózk-3» ĶZqć:*“£'uŌŗ9ĮO®¾Ŗ:ć.»”/t‹s„_VC•8wĖ,Ą½= ßśÖ·.¾ųāM[~žóŸßźvP¦.ūj=[‘Nb#…óĮW‡Ļ“ŠRj}NlsĒźX吸ÖW|`!ń:zhżc¦ĮŁb-Ł–’I䉵»yż?AģwRoĀOÜHŒ²igEEß?µĒ1¦Ķ†„"XXYžEŠ č÷znė„/}éæ¼ē_@SŻNæß7‚³ļ{æoļ{Yœ¢!bh]zē¬B•µ.>vyp櫃äGNœ˜\*ĘoüKūāŲ‚Āü³Ÿ’ ū?萹¹å}ūt;Żåa°Šš:ӝŻūz‡Ģ+ٳOĄ€@ b=ģ 3Ī8ć}ļ{ߎ;ŪzØÖŗ;{ūČAÆEŖ×ėMĻNÆ,/w¦;Jé[n½eėÖ­æøšĀsĪ9ē’÷ō£=ųϾüņĖ/ųįOO:ńī’ńŸ!aʵė‚+"mČ”[¶Ü“c‡,PŒévȽ$ ”Rh·Ū +=h†D"±p¬€™NŪ †Ź5’“VbøØ¾Ū-é  [- cĄĢĢŌŠ$˱R:¶v¶ÓĽƒ=ųŹ›ī ,Ų0ŻūJµ[m+IĀ33ķ^oŠŸKbY^ZڲeĖ;vzč”׎|‹Ś”"¢ŽÉr’ÄA UA°°øHL` }Ų©v4ÄssS++żŲp@”ˆPW ¬sŻöro°avƧ?’ŸŪ·o?äšĆęēŻ³"Uu"VĮ`h¢(P-DUK¼rµ‘Ź  iµ-«d,„ęz×ø ׊ÆgļW‚ÖTCĪĪG+ēۜźT{ė§[°āXˆ–B 9+&#uųš—O–Ķ8_Č!±xøR £qž¾ųV)S@ Bbćw+¶|yZ­"ĆÉ(Ģ<}ŻlŹ6™ŌRŖµśT`Œš’Ŗa3¬°ł,i­ ³Ŗ2 køm¾ś÷æß~×»°@©–>xĆĪŻ #ZaVT§Ó†“wßrtĀpO’ŲÜÖÖŚŁŁé»—g6mڹ{·»ĖƒŚø{ē"„:3S{÷- Mb’$h·2H.”Ńü‹ūR•¢@6€œea•’2«U°Yå‘Uą„µ¢ŅV-„–ęUˆ•Cj<{nL!w¤ķ³ ­(j@Å«¼GcļTL”ź\ʦ™ß°Āķ7®±|µpbĢ2©œū·ąßéž×-ĘPÆ+LŗŹoوļ÷;źÅ~&QņB1|īcbõÜ,*_æ¹eƒ’°&ŒöTSń(jj=PL!q¶IÆŽś<ŹFx”iM½Hr ¢š$Ir¼=ž®0ž£W™Æ>ŗõvžŚßēT?óüøøoo·Ū Ā–“ńČR Ųå]{Žōę:äC±yź?ćŠ#ŖWzć8ĆŠ··­ŽRŽÉUušBmƟF ś•.M*kn4 „¬ŹÆĄX·ī5aą1V¬½äĪ€»ū‰xóńư!žåk­“œ:vēcUÉdBŖĶł£ņēN”Įe©ÉζxłQj­ÕŹÉ"Rjļ;=öŲ½ĖĖZ#²˜žžŚ½¼ņя|ųéĻxvƒg§PĪ`#LµN·ŪĒbQˆ"²Z,a„Ó ¢,C€#¶²cĒķ²­éް§•J8™iGƒAÜÖŚĶ™(ŠVæĆ€b#ķHQ24Š‘ā©)½Ü·Īōņņ23:‘Žcėų€–Ś4;ŸÄƒ =ēŸŪJĄ„”²l-¤Õj‡ĆB@jkmVĆ– ‚9`~¾}ĒĀąą­‡\wŪ.X)4=uā‰'>ķŁĻ~ę ž°D '‰Ņ6†Bē„é„j\»"`£”†SfF™łÆ}•é¹źŻäl‚5½q[ĢYėüŅż.袛¼ ŗ­õū{©.[œ+Ęwč\ł3ßmņ³mU]ĊŌ$*„7)uć;uažUUŁk­ĪĢ:wÜqĒ”‡ī<3Ś ÜżŽ'_ų«_9eŚßœ āt ŠnFw”™³@“KĶ8³Vžž“'}é³_œii-. 0,ŖT&šv+°CsüńG~ś³Ÿ;žÄ»©Øµøø8;Ū” @`BKYĒź”ĆœŖ£z”MK0l¶:†f`Œé“;„@ JĀ£†x©·4M­°Ż¾īŚėŽ¶M(aN^ōvІŗß/½ōŅėoøé{ßūŽ×_Ūė% ķ:¬…@ŒDŅāY±MĪt¤o¢Ą˜Ÿé®,õĢĻtā$ Ģ’Ēܛ‡Y’UÕākŸq§Ģ¬¬”ē¦iz GhA@†‡(‚ ļ1ś| OT~šDEDŸóĄCyŠČŒ2(“2 ŻtÓswuWט™wˆˆ³÷ļsāĉńFfUėĖ/æśŖ²nŽqā {ļµöZj ÓŌ̱¢”%BˆāŲ¬­ ÷Z ”Š(JLbŸ[ÄZkb“Éź@3sš‘@bˆÖ4…ć‚õ@öŲ¶7b}/©ž ˆh¾µŲ½¾zÓŃ)lĻ#F#õń†§żŲӅŹÓ|”Õ©¶žĶg£įąžĮu[ƒ%!"%±7n±ŠĆžCm>a2I=Žxv>öJ÷å-15 ģ C†˳šĻä×^ĝ&effHĒW^DhŸŠ¦Lė°ųe‡¤’-¾Ŗę˜H%ŹtµīŸ[ÅlŪ\Ūµ¶Lč±E‰…`ÜAĢR”ÉBĀ­—ʼnĖWĆĪ‹šõÕŪ/“Mąo3'K-ŁyVœ&Y4Ø;˜øNŌjŹ'.É1ā ‘É2j†dŠ€H`ĢüŽ;īųÖ·®üīÕß9°’ö·¾õ­_æę»b™€GD”HŖ•ž@'œĢ” Ąš "’(† œw޹Æ|å+Ÿņ“§ŁĮ 4½‹ņMĆdØQģł2kŁnŖT>(Ū†• Š G ³Õ™«'¤NŻÓš¢tnė€Ž«»÷ ŚĄä‚Ī6¶(ģ™jaŌPāī\@Œ—s/č N#-ļ¹(j>ēĻ5KS„”ŠtŸņg±įHĮßyÓ_żåOüä’0¤!2TĢ ż¼ē=ļ÷ē5ƕclÉÜžznUZNnÓO„~Kaė9o›&DD[‰UEEp é’źÆ.ŗš²‡~ßC̾]“l>[$2FD¤4ĻēFEVī8ŗ ąį÷»÷޽{_ž›Æ¼ģŠåf6Š™9“(޳Å"ŠcĻó³r€B"Óét<»ŗ~¹›(?‚9œŅ¶ŒŲ¶WŌü!U Ģg_>x襷ÜÉb0œ}éōÅ/ž_—^zém·ÜzóĶ7_’ŻkĪ;_}Ėߟsö©ļŚ’[øXD¬ˆWCĒ„8Ń_ˈ®Ą_U6Y:v£V£°äį$IĆøØÓ”YµŃżŗ'RĒ&`¶ēŖoėĀ .üģ§?õņ_łÕ|ü}žóŸļ?¼/ÉÄ£k«£­yHš“|øG=ņį/zыż˜Ē@»=ßƛpBYŗĶ§ĶŠ£I9Ŗ]ŠĻޘģaGj)vL’$ ”)Ž?žźDÖĘ£ķ†#<ńҶĀ;Ņ4‹ćˆ¹ŠHwĄš„ PÓxļĒRqĒĻłrÕ©0u“²½ÓŽ»ˆaä>PŹqź7…J(•öć‹näÉ/Ķüq©nfh;‡?OšŪɃ!†Ōßd—ŚL»óŽķbž!lŅ}‚¶I^Un»(µę~QĢl{”»E¶–žĒ=7š²ŌŪܪާ£;ų ,¶†ą={ō—\*{óCˆ¢@õ¤č™Ü^Y«e̽’;j*ĮwŠķšm÷ĶżQ؆˜š÷FĖU‰BÆō’ēæśW1Y–u›¢µÉ6īmW½J]/Ų)ü§=Ā:·÷Õž\[×ßr¼Xń˜Øh˜Śą$Uq,ĢY–ÅĆč|ąæž æŅ€ņļūŲ'?Yl‹ł±=›ĪƒŽUh ż~ĀĪiÜՃŁbAĆX‘"˜%R†M„‚Fõō'żŲ»ßów+ŠG„©H XY‰DäŠŌˆĀ‚ąž—_ōŗ×½īņ+®Ą‚Y“ŅCvĀŚ#œ¦J)ø±:V&ŸKŁØ®-%F‹`ólÉŸ*sĻ™Öä2ĮŬ³°&eŲQŁóßa¾źŖ«N?żōaVV~ó×_öĢg>óŖknX[[;óŒ3ŽśÖ·¾üWķ’K.Š“ŗęškf³äž÷æļžżū'“ÉM7Ż<Ÿ/ ƒ€xˆ={öģßX)dŒg<ćĒžå“Ÿøå–Ū£X„IQż“Ż×®mŌīŽtŚ4ÉŚ ŹNxÜ_v¢ÉÄńŁn×ćų45Q¤iŁN_‰Ź½ø°­Ō½Nč=±@ń]”*÷\&õ½µ{pĀ^ ×mŲŅĻֆf×rˆEįĪZ«4ĶāaŌŹTõNr±a&„iś‚ēžÄßųęD €”ĀīŻ»3=øõöŪ9]Å»øÖÉ4Łr5ć0ü‰„ßj¤©‰µ`Ä(„>ń‰?ś:i ˆh‘JEƒa4N#BĒZįŲVŗ¶ßļ~÷{ŅSģ?šø³Ī»`kkce× œe¦2FģÉÄ e½s `RÖZ#¦‚F˜V6¢Cs²Ćµ®śŠyɾTŁīRŠŠš³Šź¬H!cŒvö \hņ+ M’8ŽóŠˆ2Ö;@ēŚ¤–æę5æłæž×K”ĘS’˜C‡½ą…ĻÉK^2N.»ģ²Cwx’G?śkæō‹_žņ—gÉģž÷æ’igœ~Į=/¾ā{<^ŪƒÉŖõŸ g§E†„\k÷~?t"¶ĶµŽ=ƒ&Š­(XfĶXqhDTC>CčRø„•ō«ó×aY¹:ż¤āм׿žMēVNÉropžRź©ī!²ŻŻ™Ž¼Å1łR—-£8Ķ'ø.‹ÖīŌfE•sE"(¤Ifs„½ĆSėż™•C¼„‡ŠqųÄņņAńVT [;Īśž9įUy2?9éō«ŪåĪ…Bƒõā© s!ƒźR©h›Oõ\Ŗ&Ōvf©:ż3ĻĘ̼. µSĻ”V”øŲģ8šŪ®¤¶ åĶŹ„„ZnLM¹-śćź¶–;/–ųKŪ½w)Ņ?8·ĻĀŖł$š„Ųv Ż)c»ˆ)3Ļēóńx¼­ĘćI‰»giŻVŗ”÷ńæŚ®\s˜mī ē°:ŠboO'P«’ķńœÓm ĢpŖµ©‡÷琿ŠZ“>P1Wüāl£ ‡¹Ł’Y^ļµvD²– KسĮ6¼°ŽExWäcŻR^Ē“×ļ«¶(Цj2FÆQ³T(å“nų“ʲl>ŸÆ®®ž'ęĆ'VÓ»BžA§ ’¹ož©ŌAūȓ“^¶„E"$I:Å=7n„ź»VŠČ^/’ųĒ’óG>Į‚˜ ć­EzŁ„÷zļ{ŽsĘ9ēˆ.`Ē”+wpYLŲĻ„RKˆqīŽYʑRÖ"€|ā£}ģćcg®ƒĮC›ćńX²™Ö4ĖŽ=k·Ž0 Æyķ«_ųK战äŲ±cćį$Š"­ćŁlEƒÅb±:™8¢iYcÖ¶:e]q!)3Gql|ÜæL‰ .īžc¾œY,"$Ŗ¢”ä¤J” ”9¹ō?ĮņWś)dŠ”@Ņ4ā‘dH@f€ĶéÖŹdÅźŠŁØŽžyNDŠōŃcG‹Å)'ŸbļÉł JO—W*öTŪ̶œlü$›ō1„/É%”|„Ū)ÓńQ(ķ[Cb­ģ©¦ß¢vą°³~ŠU¢°H‘øZå'O¶t9!”¢+" ŗ@Y©ūز)Ø4čąåW’¦™m a“Š(ˌ5]#…łl1 =*Ž Č-U«›†ƒ[THUUÜ»’ų…RIĖ’“%ģ¶2+$7ė„<ü-'1uŪ”ī·FĖśnņQMn*O„Ų9Ę[d/?Ŗ–“ēūōöģSķ#Ёޮ?=‘į¶ĢĖŲ‹•‹ĻŻOņDT«²“%Pk@FD¾,Õ]Ø+M€pń敔øžŒ…)±µéŽÖč-MŒ yĪ&©³ćD‰:’įzėYŪ[Z'Ēń•ū®Æß•­½†QYĀjÜńīÄø-%«?Ā4M½·ēqŹšŲ#_˜m7ZŃĢSK·śJgõ£  Fīo[ē=· ŪŽXe"GמŖ‹³{½õin+Ök © ?Tä–ͱ-%Ž”½ć‡Ž–U¶ńlū•ūjŗńRcpg…L˜ŁūF-ч(§ÄW­»T˜ŗĻA{œ K?«‘6ŅX5“)qĮ$W¤x|{˜OłBŽrĒ#¶ŪBXqĪ_  …a(==|äö}×]wŻĘlADĢĀĄSŸö“æyŪ[Ā“Ź'ÕlpņąkįkI4† ¬a0³V ©QCćÅ/|žŸüńŸ pźśś‘cGE§ž²vėńpĄŠ¦³Å柹˜w½ļ}Ą6 Ö MQ^{b!­Lšé(‚F2¤Ū“1¹D]<½0DÅĄQubił¬–z5¼¤6$čł·’kÆ0 «”RģśFUČ^都aEŹ f³ÉD:rÕ R&Kl2SČ#±¤‹bŠ£˜Åqäā(ö“}f¶­ąåĻUØIū4Æ/9®²rļź¾“ķź•’_…gŃš×łŅó„kÉF=Ķk»#.ē›TTplĪéär¾ķē0 gļĀ€Ēuū\*·Ÿ€Ł3ÕŠ·³°9 "ÜĀA $)¦¾H b‹V‰`±HF£lŖ<›Ķ'£QXa)ī=ZR¬”¼„gš¦ƒĮĄ£ÄGŒž(eČU^kebEŚ|ķO’B/¼y©VųŒµšéÉ“²öŌŚG @…us=+Žīų·ŁƒˆŽ?šj[¶=ČžŚC•±“æ¹3zįŽ"%nHŒƒryƕ×wæz/q„£Ņ”K@T£'ÅVåqĒqT[źžJØāštT£“ķŽ±®0¤ŻŽq×nń4RPÖJm{Aå×+’ōĪr(·o÷¢Ż• ˆ4 H¤I²˜Ļ“ÅĀzŠ`;M}īŻ?ļŹż–ČB厊Ę˲,wŪ€Q×6³ŃŖ­‘÷™ī_ŗt桍”ųn¢KŪpł"™-ŠēxĀĀ,,JŁ»>bŤT*ļ±!t¶Œī Wßī}UWæÆZ¾Ś|6“=8æÓv?2 ¾*£ģx0·5Œ•|Ų÷V5ī9;ŲŚ h±@/Éj„¾‚ž/õŹBqļÅõ¼%\üWaé Ä;uŗZ¦š%™'"ŹH÷žōėÆ~å”é"f, 4żŻŪß~ō–ŠŌb6wdHƖ©Ø" Uåū9b”?ųŁjUA²4ÖJ)Ø”ž½W½źŌµµ?łć?=ĆaŗX(Įśjl6sąč"ٜ'?ūüēæķ­ļ+p Īt– kƒ™³ „ˆ”2IŖ]Š hØH«ČqÉJž²ĢxéWNī,/ÖĖUXƟ/żPÄk ° ōćo ))YŸZfŐŠJ Źž er$бā½~†{ł€…3%Lą¬Į±V‘"ˆQE{Ī DHŃ*DĄ@$Ž£±ˆV 1`„`„ŃŅ©Ø *ŸÉ§t±"Į·dY¶"Ę )A†¼!„rśį* ŠŌRn\ĒnšĪ¦" ‘Z>,.’Ü’D*óMBü3äų”ʾäw¤"Ćqåc _\¤F$‹[§ŽŖWr”*ZEį2¶}Ņ4…€ĀZ')Ģf3PŃÄ˖Ϭc„Ąœ13F£3˜Å2&ā8¶¦>n(rŽ8;’¶†če©Øx–eī×k•‹p™tÜmįJK&&l ÄŚÆ3‘(ˆp¦ņ*R°Ć[–ō3°»{¹oæL|gy õ³¬iĀ‹żŲp^Ūh°Č‡z.;P'õ½?[ ŹWyénŁŒÕĻܶĄ ’^„Ćh”ńŃ[‘2G;Ź'<©®]ĮŽ~õyyżšRpŅҟģ Wf"…Š×¬’¾×öeUKĀZyŸßjģe8Q_m–Č!ŹŅö[ž<µ³.¼£šżóa0tē§;˜uT·n¬ī“Y…¾XÕśīqōŹv»Č†ČdIxw›ź»ŲŽaōqN²4M½£R‡p·@«ax“īĀ^<ŠłōĻ¢R0#ŖB£Ē#3ąßĒ×{–“;Ąü’¾‚RQįĮ揕š`Ųq÷ģ‰-"nkķlK5ō®.”¶ ˵Q›‹…E3¶¶¶&“IcŻĮ¢4Įt/W”-0Āø­g¾Ī2šņ(*.’…Ö:ÖłĻ Cį_ųŅCņyš(`×®Õ­­­ĢȕߺźÜóĻ/qa Nz„Ђޔ ŽmĆ&HĆ©R꫟łģożÖo}ąŸ>$‚X0ŒćišŽ£(ŅQćŁģ’ ĪzÅ+^qĮŗwÆĖDE"`iĮl:M†H”1FGD$ŠœŌ­rkŸ\U•ÉśZķŠ,5Z낇FĶS„Ō“łU¢‰¦äm±Ā@§4iU ²Y[źµ÷VŪJ"ˆ9ŸÓĀR803Ćb\…J³EVE0‘vÕaĪQøV…Ļ漂īRbŪē Ŗ¬õŠŻ}C§P“¤’\VQr3Ų\ōŖ&“Y•Žß&ĘšnF叮+{Y|ø u© Ž‹ĄBÕŁ/dgź[Œ[ŗHāĮ ¤iO§³ÉŹ€ÉÜo/2KˆŲĻR*dr—“¹9L&l«%©ß…WdĢØĢ·ÅøK‹ŗ£»1Ńj»¢6a+„ēMRNŲv”(!ɅZ+*Ķ,vQӘ’Ł÷¼“Śt¢\ł8ĀŃ ųV9ąŚlV·E@mt`Łn,ŗŻŒ 2¶Å”ņZ¦&ĪBõē5ÆŠZqåżėō“ź'ŹįŻ(±×‚é(ö†rńł]ŌuD&MYŲā}7‰ró­:g`GļV}}5³o”TõĒg#Ó²ŽĘtp°—_k Õ¶ņėĘ8Q·³–·vąĶÓ³7££7`)a¬"”Ö1!ź=ßĮ85[6lźĖ©Qˤ®ßŠn…sŌjh” Xšœw‹œŪ"tčæöłølčĒÖŗ’J…ß‚[ax“ƒ[8ž.ƒm™”½+ 'ˆ&½tżÖ}ڬ ŚäŽYĖ+ī Cqå­īłž|:uĮh5aɈĄX^ö’żŅk÷÷l¤:f‹ä{ī{’O’ūæƒl¬G j\ķSP{冐ffą‘AHó{œsvš¦”qjLéyfF‘ff@)µ95§œ“ņś†'=õ) J³T‘D:" ['qɛgFi Ā|>ŽFi–ź(fįˆ‰ƒ©mĀ&—5²T 4³©Z£źI‚’̲l0ˆź[Sš¦ĆaÜźd[sžD‹+‰Ż…üŹ-³ %ĻlŊi•"ƒ²wZ™bķė*U'OėŃźĪ Ø ”Ą\.”f³Åx<Ä2ŝŠnj†ČRŃŃ™”H–ŠĶ*\•yĆvó;xĪ3Õ’äŽæ‡!/•Ćį÷Ž/ö– goŌ<Ÿņ‰hw kĢ[܊egT‰‚Œ•ƒÖ–rm#!öŲ ‘.e­žPŖČ’–‹_S®‰z6›WFՕ%„»š9|AfQĖŲęŅ^•š?) µ„¢—&õ¦_æHTßp+,)R³“Øūć:ö…@’9I-a&Ż-ÕŚõ&$ø’ÆØPš¢–!ܦü¤»G‰ˆU3ņ·ļ ķŚ!”E^¶%ČŗT^«Iöų¹œ|ž,ŅĮ0®ų5is)­t/MM: ÷į¶YiźPf>±N’趄ŗK-QėĪįswb™;?JøžŅūķz6§ÄvI[,Ī—(¼ĢĢb±šį¶©A]ŃåŪÖÓ­HŠ÷i®ŃÅŗOj¦P'BlcŪŅéžI3[ŽNĒ…÷ic%¬÷§”ŅfćV¶d™)­CŻE!tWƒz•<‚–'ūµX,FćaŃa„ѽĘjJż%6Å ßśĻšķÖÉz¾[›Ī–ˆpfœō²EäĄ&U[V`/“£$»ˆ§(Øßa¶ģŪ„.ˆ¶żū…%š°`ŃVJź~•ĒgŒ™Ļē+++N-MŽ©ū†mb~amīŸ’‚?žć?)ŹX 5ŻyēįĮ®5c@Zy”–²ūR–ÅLJRųĮĒ?į£üą*x}ue6ŪJ @”Aā8Ī ›I&ĄŸ’Ł’Ÿžiɲżū÷Ÿ~ęYīŻ˜i:@I 0ĪµÖĆaŒZKdī.X )ŠGĢ…ąœ Cżxį- ›<ÜÖ#Wś/0ĀŽ{Ļ*O‡õŌŅ*̰Fß~mŪ­²K/£rƒŻQf›ÖFåä-ŹÓÜ2»Ø¶ŒńŚS&zš ņźE>öÅŖ ŪŗnaTMwŠ=MyÓA'7oq’n¶Ņ²äŖ­Ī!č@ŁEzĻł†ÆĮF„/„¦n|¶1!k­¬‡pųP*ĘÅa42ŻŚš¬¬”E›ĮĢŖšd®:Ų‚į¶t¼'{ˆ6šÆV *oU±å+ŻD“÷•[Ų­Ń||օ`ĀEa€¢hˆjń®dåe7Pj §t” ¤bH«Ŗ©©lŌ„ŲÜš‰\ōĮÓļ~“ēūI”6]~¶6…öA§•¶²ūI™õ§ą„¤ĀtA`É€A `„V—KTą)Ķ ƒĆ Ŗ‚łš:$·‡öolŒŻĪ_lóƒ)MÓĮpXķĖ PߎŪ1Ö8-—Āz5`£q·i š3 3G½-[SĪQkĢēĆńØų?†J•$ÄśŪ7pŌP›ómiRn•’l^š%©Ņ£8”<ē€ €†żöxt¼zÅńŠæŪĪ‹nyŌžšGM!bCJÜØH_ČÜv_†UķVe½wlV/և̸>ĄīUŪė8ń+’ܖ¢u}ܚIc> `ś“a_~ų—ެ½ķz¾¾ķ(mœ£'¤9»ķšĆ¹bhTķ­&všx® Pé?8m#,ĢY–I^¶(Ś-K½®øŠ”h÷\“±āAÅZÓ­Yx¢£Iy„ć¶UéóĆćs;ō“;f]·pH}sĻmKw•7o܂/‹ė/å@JŚ-ļĖćVҼhÉ:NČj²¾q=ŌåŖĖtŁī²č‡•®±É žgŃńq®ņ‰!»,ģüoŪ$ż lż2¬ ˆˆÉŲ”G "²X,ź2x•ń·%6o}ėŪĮ`4āo]ż—¼ų—!Ć›¢ūąƒl«jpY`H Ź^ūŪæ½ē”“2ąŪ×~wĮMV,FJŒŲ;øłśi’.ŅÅp²¢ā“ŚsҾĶé*Ź/)Ź2öē©UŠŠµ¶OA«“I¤•#ʦ 1ąL•ō>E ”ÄbŸ$°‘,c-‡ū³›Åż7愾ƒõ•Õ¶BOų!ҽ·„ŖoĒ’Ńżß”QK²ĻįŹ#uģWļŠSĶk»wį¶M†}>œ¦i)(”†<ŖB;¼31YUéZ„HÜIg…ø4HŖŽ9­J@keU|ģõęó\¼Ņ••w 1Ąz# Q ›„Š+7ř»_1n1‚­ź”léNūI’”ž#ƒ”² "ŅóybßD)Ē„t®ÉOÕX¾×wąD;9©½œRGįø;ڬTKƒt«±pʦDz"v„)Š4EĄŽ`øųDMBÅ,‡ “ #1Š2±Čb>—¼ Z™x5£Ź‡ Š)Ę„š¢j#\ROTåP“!ą$ɘ‘3 •½ŒĮp賌­Ź2ūje”ڤ|wB;‡ĆЦW œGu™·„A›X}Óė9u›Fcł“AʤWłµ«øpbßĪiĀĢÓé¹v£Ó]fZ‰@s“>Ŗ-¹½›«UA“ŚõÖUc·— 5Źkՙā’Yń>•†¶’5¦ąi“„%K1ć$Ū|POŲ›\¶—4Cg9‘2IKA±9n’wns÷)I†„ŠTėŚ¢÷n äµjś6k{ż}¶ūŹ;CEśŁo K ×i„U-„äC`«zälčą¢Wā„•(›ÖØO(o·ģ[ĄsČ 5Uj†˜ĻƒĮ@)*䏈˜o»Žø@Ų6IUr3^qŒń ¬›‚Ķ­ QgfE*KÓh ßųoų©ē>w%ކĆįt:ĶXŽ>4ŲµĪI¢CoōŅD%?N4œ<凞ųž~čäõõĶcĒF1 5i­3…YjĶĢž“ö~ėŪߎ·oŸŪT”«]¼Ņ4³ųXu+T½*”¼‚Ųģž¤’$ ćB!)×öōųsŲH\É–ĆłŁ±C–Č`>ŪłŁsį’Gžm”Č’G¾l„Ō]ūī¹õ…WŚŖ®}Xܕ5(åU~oÉFØ rź.ĒՎe 5©µœmģäZ²ÕKƒõK–iæO‹q&ĆĘ€ć8†*œ5HŠ“'4O暮Ó4ƒ f·)Łæ»gH%C ?766ÖÖÖB\:ģß¶\qfŽ"]R!b'4: "jÕøułi[O+šm55¼ŽnØ;ž‘‚g]īj]ÅtSœ§¬—‡…5ÓżŽžö·_rÆKųżĒ@ŁF*E!›oÉ! Šq!‡6ü_į‚–O]B`‡ņy·-„IŲ•ė|`{1PshĻ¶Č™sö“ĆŽ‹…ĶĄmĆŖ}}’d·ģ6n,÷ūēŲaÉŪ†²Ō-»pB³;Ę“—‡©~“ Ä}NcĢl6[]]ķI%®;'7fsĢž‚—OU}A˜ Š6%–ė/+„Ä=ģŖ„{CŁVøp<¤}ˆ!›±ē‘¹ńŽ%“up[½ ­›ŚŽz‰KWhŲK•Ų“Éz`n‹׿øC„ų:ć:÷Śr[0ĆöøŁ_vÜŲ „¹cĆ2^YņŖ×¹»t¦ķL¹JmŃN_PÆĄ`iĘUł®ąłš,«x’P=Ÿ %A•§(Ī„J–g²'£Ń ŲÜŲGƒ}ė»ēi2ŠQb²'<žļ÷~ļī\ä¬] ‘«š¢°³.•&óÆÅ<ŽYj¢XŪr­=ˆmKKq°¢œEē‰1#Ā%(yP³’v£Zæ‹>)±­@å/3Ra꞊ś•-±-tlėČXš>‡opµŹŪ±™,U])õ¢»לw\m’$֛c»U·‡ļĆ/[±TéÓ&7N”АŖŸu>X„·ŃnéÄŖ$«Ż Éh»ßŻļ ÕŖĪī>QAo¼±ū`X&Ä2ˆæķ‰ˆwF÷Ģ—_§Vv“d±ŠµĖ‡q[ę“”w“/ü{ü­ō‹®J¼ø&‘4ī}np)ÓĻS¾ KĢņļnk&4; .›Q~}õY\­ōÅÜå’3SG$ģóõiĒJkK¤P¾`™Ćd8V6‹³f˜Ö0¹Ńx :>“­±N$7Ka°¼[é8‚"Ģ“…÷ ūżŠcJWHSįõ‡¼Äšēö£¢?/ā\l˜åŻ2}$įH\nÕ;©,„ˆ…½ēšżš€$QĀę±g=ć™ČŪEd~)āŒ:th·Ņ«€¶6fƒįx $šn8xģöYŗPųĄĒ>ĀJ@Y–Ķ|ķ¼Šwl•AŁĪA‹ DĄF¼K³-mcģqI…8?UK1 ņ`ĆDn·tŌł[Yó£‡sɛĒJŃKY0¬::tĀć:@­Y’#sŚļšm/¾ėn§.“³­ƒµĢSmmĢq>Ūķ>ēĶž‘\¤z—ßĀKųbAįF[oq¼h:ž'ė€.XÖhņY%x‡ēB!]Wžw½$¶«ĖŻøż^zČ2‹Ż¬†Ć”uB¶’ļzø‚ā‚1\PŲ¼¢;AGŖˆ¤™³45¶c«mŗ…Wż"PĻb}=ÜZJÅ÷iƒ°cLČ °Ó¢°ęŠ…vCDz5yš}%B(ŗl 4ĆęĆīw|ćó_|Ä÷<ą‘÷æBŅä“•µpSOūŠŽÅīwū­·„vN{uÆ=PܽPaQ^Ÿ}U;ƒ¤ų¶wMRĖ l¹[“OP%Ų‚ÉJ …›rēój$Nēū€"*bé8Ž=ö’Ž,Ó{»ŸõTéėóŚlwPVóŽę%ue¹µq[²'»sÖHĄŠo NwSż*öĢ >ż‰Żapšg¬…}RRŌę ų¶&>:Յ×ėU“(Óō/÷†åž.ryÕķĮŖlSŒ~é¤é’ :0õR,zģÜf²œU·m§ūø¬Ü…īo®5S"˲4MCeņm”ž«ZÕ«CSŹpÅlæ‚q×±v€#u tõš®ģ†n±X ĒĆ67‹£ī_’ėŠoƒ!ĢØzŖeŸņvŹVʈ֔e¬ź²^~&œÕĘHøg-y I¹!]×@µWҘ ÷±’®›¬°!ųŗ‹×U‹£a·da¾źŹo^qÅ›³Ą©»w9rl׏ųGōG’ģ’žōĄf‘dŠĻ²=ÅW~õk÷»üņ!d÷źdkk:¦I¢µR±Ś˜f?ścOžŪ·æÓ°jģœąÜ'ōجHāXu(É &c)‡4x>^^.°eĖ»Ī9#Óét2+Mi’ŃČO?÷‰÷SÕÕQįlš mc‘nCĆę.ƒyw ²ÕįˆVWfŽń—¦©«—»o)d]Ł0ŪŗZ‰`LEĮÉ µyć™aN“ hÕ!mEŖ•Ņ%‹ Äæp‹)¬\ą•ÓŌDŹ Pēė‡}c„mض·”äĮBąN\Ó©#h(EJY‡^æ“•sā.‰ yķĄĘ¹¤2šÜä7YüŻs¤Ė?lF‰Ż¢ Ą? Śa؋‡\ń­Øøō–€ē¢’¶²jZ,å¬=‘b”Ć éÓ]ŸzĄŁ ×|÷~—^:ϲ"™ ā˜ŅTģ¶ɞSO»žśėµå [B¢)ŻWg²”ĀØZß{mpĀ­Ŗ"Ā2OĖeF†jÅoŃĪćün{9l_œÆMQŪלjÜ{Ź|÷n¹ä½}q$RQIQ¼½o{.!ŗ­§MoxiŠäyŃuķL”ڶJz{Ū3Į©Ō­ź ßaĒN„<ÓŻ,×ō{MQcŲß”=N*uŲ„Ł|‡ŽIć%µ5µoK#äųæ|ųh’²’~Ō¤)–ęĆY–5”$œlÕ¶×'ē_•²Je‚*UTs”ųŹōˆćx4--»6UZæ‚׎ ;¾øPѱ̊Bäx@ŒžhIŖßų‹Z m¬6Dŗ=ųę*G ŌS‘ź+KÓ^ēīM”‹Śžśūķœk Ć!†ÖX+µõžBŲ£÷h[wY«ÕĘX ·Z+$SŁ^śgóuQŁpKłšl6 “Ivv$y1µ@“l™V©Āe­£ŖŖrŃV·R]rÉŪßžvWøg°±5ūģg? ø„ļēāųÓūČŻvƬĘČS6ēIĀHI™f ąeæõ*egCŒ›}ęS7Õp\<‘$IDœt!åž83ېqkkŹF؈Ž”š¦-wĮ~Šf³)ŗ"VV&”~ 3;$Ŗ#ģ”ź¤­L‰>Ėßc•’YÄi_pIÓt»PC›L‡,bćnÖż¹Q…]KŪbU6É ܽ)…ēQxҵIB“™,ĮĀõ‹:–•×Ėģīo²‹ŽĀ%ömYĘ„ż˜*I2uÜoJ…sĪĶžPDž¶w€Õ/Čü|µN›Ū2°nT{o”IhģCØĒå'¼¬B,ŸĶf£Ń(tķ »‹hσ\|ń…æś+/ūoOzn2Ē=ŪŗZ:£r£Ż±¶ĮT°żĶė)Żõ<ū™īTĖŗ, +‘†«}łmšŻUĆ»ŗYŗiVlō^,J`å(Ń›ķŖµõōJ ;#šjx ŽĢP9<Ņ!GŌÕ2·£c ćq/­+·łœ·anŀ£Z¢L ē •ĢϤ4jĘ4+U¶å·ü¬ ; YšF£øpĻņ« I†Ä~MVWfÓ©”@!Č;ßõŽ'>łÉ `Š”$ „"Ę"Ū½cŠ¢h±HFDȀõ“vļŻwņ{Ž’gŸ{ +Šrˆ¾¤åH„ü’[y+½v–‰#ŗ&Ņ,%¢H9_ėBŖ eY#UõF®¤¦°„³˜¢a%ˆĖų5’*LJ}ōÓétue«Ń°2m3zÓÜéŗ­#oé©ćH7&ilˆ­aGį3Ŗ¼L ”¾"ßbŠŖTUļ`›"ŽžŁ›QŻe7<ļŅ4ÕZk­ón[*p,)ś„=źļŖÄ‰pi‹@‘CŅüŗ$JźłųdY!pP<_ew€ĀÉIĒ%ē[ŌHvYf¬æ›\ øƒõ$¤Ų°Ö%²‡‡žĀ'®Ž,3N$9=ēó¹5óĀ]" –,Ė¢A\,ŠŖ×›CD7Šž·%Š5¼¤rkw©g[šŠ\īk-Ói)‹”£°£ŸĒƒ‘„³ ¾¹£0*Ŗ5[aźņ„2ae "Å7~ē;\|Ńd8Ņ&›g™`‘d’`ķV £Q|tž®Æļ9pč?#J]ĶÜp=vę8 C»7§ĘĪ=_ķefķH:!¹&¤’ŌŹŽm?éŠ|:Sz¶­IU™UŽ—eTu–°,÷u‘ĶĶĶÕÕÕ6)„"ž4[ÉJ×wķ^Čį™XUņJuõXjŅ»ėīČš+ŻŚŪåįzKk9±Auevv’ö5U«,øŻ­Æ¹(¤ļ{¢¹•2īKõ._kɲ¬±å £7£p>žŪ kQq‡baĄmGuksyŠĻ.¾õ­«žńĢgü/zg/ĄŠµ5/€2ļ„­]”јŖ&]Ś8ѳĢ&M}#ł¤?u„ņ6EE™Élosh¢Ó6>ŪŖļÄč؃:޳ĆfÉyidYåHßnusg¶Rõ%SAĻ|ŃæB_Q ĀH’ŌĖžw4Ųō):ö\km»-÷§±7oģXĶ£g]‚M猰Ö6%!ßVŠŁ8Ęq礢Ų*B蹯üęZŠ Rų }éĆóžw¾i c…SĘ“72/~ĮĻ!Q51!Sƒ”h ĀO<ėicõµ]Zė8֍L 5Ż~ąČӞž“³Ļ=O +¶„“ŅhDõżŠ½»!³ČX¼½G–—³I6āS»,3ĖY `ćĢŪ „”Ķ l"­ēT¹ĒŲ–t]æŗ&kĀd)ˆöÓ“V^e ©sŲżEŗ!”@ µ²m·ĢŽX”£jóCIо†ŗŲėĢ2‚›ņ,Ćx` üÜĒ3œÅåäR”]ŲĖ(Ų6³²¦DB“V¹DDÉTœT ‹°µÆ²„Ģ£¦ė‰ Ÿ³Äł’üÕĪ»HAGJ)RšF£Q< '× ąĖCā•8ģE—ē˜…ę˜Y /fs1ī$ƒ—Sʬc½ćŽ{]|ń8÷ngĖ2ŃX ё±±õĻ’ōO]zĮ¹ūNŻ»9OEpōČįoóė  ņ"‘T\ąkL·¢ÜÉ(X•… „ŁBT°ĆŗN$0OnŚĪ²īx±Š“Xć§|GņD·Ä|;a½·Ÿš•½”×Į`ĘHNr® ¤£ Ērø VLĒüJFuŗhc„—›j‹©Ū¹ĘŖīāÖG żqW|5ŅwšqŪČ7‹ÜƓ9 3³ķŖډ S—£tŅöŌ@ßVįįxĆžĀ0%°ŠøēŸžwŽyļ{ßū¢‹/xļ{ß{äČQæź“ŸzČCš’~±³,˲l<÷Įß|EPØy`ė•”FņI#ĘŽ%®^”“¢Öõš\Ķƾ–Öń’#­Āš-¬šäč:ږꉓBž+A”U–®Ģ:”Ńk[Y}½B9›Ķ†Ć”?°CųZ ‹ˆėėĮš%ÕtB¢S7¾OżØR”k,õ™BĢ<›ĶVVVš/Ņ0„©‰ćØ¢ē)\²žj 0äżĆÖIĀ^jšŲŌŖ¾œE$"jļjdŒ°Žgó4>ń‰]ńЇŠmŽ ˆžņ”}÷»ßsÖPķŽ½ūȱ “Ī$‚#Gv­¦IFyMZ•@æ%¶;‰ÖŽė%ŌpÖŚ7Jęs#{_„$uŃąk ē.īTiÕ uõė0 ølÖ;„KšŪń”śš6·3ć$µ•¦Ī_b«ÖFMŚYCŚń“Hõżā¦Š¶1ßāī³ƒIKņĖå†m!Ł1;¬{3ÉPé°Ki˜3m”åæxp VL "ÕTŹż*411¢ä)õ¦k̬)ņ£—Ū¤9˜+h“*Ä~KpS ;@DÖÕ"Ū÷Ģ‹Ę/cų„‡nÆ31*ŅLšé(‚ <šlx‘·Bø\µŌĄe6›Ē#*ū<Ūi~®S6ŠČŠ0r…Å šū )Ē0½Ņu‡ ļ=ß½J«ŒJH%w؉ 4P¤©zQÉV±™ JØķ©Īya`–ĄL^F‘†ČڐŒ‘ ŠpŅ®•ĶĶ­_zŁo¼ģe/`łģ'>łˆG>v²6žn-õčųĒ÷æ*‚H’™(ŠH žŌ{›‹–Fe‡ŚHĶDMŚF¬I””`°×Z_ĪOqh’6؝v<ķŃX$5nHń&yļ}}/]ŚZ§ų”… =ģĄg¤›Å`ū„ĆSņų‚„1U’8­osž2X»‹īøfŗ­ÆØ2ł,'ĢŁˆ1ĖńeŒ¾÷Śū”,‹žįŽ«•Žčćgówh —Ū’”ßa5E×]}ų.ēœsĪ7Žhw…?ść?ųއ<ˆ(²Ļ!ģŃm”Ih½Õ"OŁ”ólwLŠ_„tA•> Kžė_Aׄų1 “LŖ@R’sčo®p<xĒĄv<©F³DDʤ©ū”vlcL(üŲ!߈ŗģ,ÉoÜĆ'Rģū¹>L£¹QćųĻŗė¶0YzŽś)Ōüt8šłp!6*'«·™L&mƒfÄ&ŠčÓņĪ“GŻk”9ĖŠ*x+(Qõ{}Lģź0J pxNdEŅŻ£h:Ļ~š±?|`kĆ+WAiIēŸżųOŅ®Éx¾¹‘LÓ 8õĢ“ٜ £ĮŹ€ŽFÅĀZ©Šl©›~Bd‹öö³ …œ±š1$I2>!¬S–eĆŃ@ Œa«nmmŠ€¦m ķ4CsTj²TµĢYę—S[ !ؼ4N”Gśu ķxĻi;zvVZŚžĀ+%KPäH„¼zŹ1Ź\J)ĀeĖ‹²ķJ!äS?–‰Ļø‰i{ķ¼‚TŲ<’€\)`ĮŽ"hŖŖī (äH)£4s¢(rĒ\ Z5AÕf[ńN8¾›8ß=ņäDÄ`±XŒF£¢īF­÷īč¦äja ™§É€Ū¾ į\®ФÅiQł»š|{Ÿ€łžˆØÉ#‡Ø…,]ūgeXœöµB–­µĶ· Vź:ŸŠŲ§µ–(ī€QĮ0kčb.åÆA!:UZ!E/……ņš ))²bZZēu"/’_/µ’X£H2cpźé§ŻņĶoŅ©I˜M¬ōƒöˆ×¼ź•/ūõ— ó­·ÜR€Y? Hpˆ4FYZ«,3n%(j`H×7ĖźžY>ūÜĪŖF‹>|—@1Č‹H¤tGšZ§Tv†¶ä6 8C•„ęR»°Æń„\Ń„]¬•SµM¹)ä8ä˜Vßc¢[%ū„½ ‰Ū½€6Yā›!7„©9[lN õŪÓZ[̊ˆ¶¶¶––zźx,ń8Žć|ömćS"og°cR•DÄEū·+p—Ļ~ö³¤Ōb1eNkŸB;»ČĶĀžnż­³:tē1”TLälÓĘ(vҰ([ū­„%Ø„ęrŪsŸquū`W(÷.Ÿ ²ĘHž•VެŒjkh$r÷¼ģ:vjÆ!“§ņ±¦“M–õߛī Y»Ž2YŻ8”’{ˆµk£,ĖYWnŪļŗ.¦€Aźd­ ĪÄĀ鸊cf:¤Ž†eUÕZZŚŸŻ#ž°ļÕĄ©ėk+švEłę>ź‘$†MJ` }Š}/Ū-¼w2Ȳ¹1FĒÆÄ9“5Żė’:ŃJ)Īx—Ū76#Tˆż”‡Mžµ–QÉŽ¤Dl‘ŌåĆā”Ļ•¦Å<‘įh`™Z«(Ņž'DäT@Źå³āį ²Ģøä$HŒKFY‘v'HCHX8pR!°umvDhÆld'‰½ųš¹ū¹Ńó<Ś™½_UÆŃŌpē 1‹'B;‰ 6•¾-w‘†%cSł_G€ļē æ-VyŪŃęåī*¾ėõĻ*>Q;Sh&Į [$0Ćd]gČžéō"ŽöŻŃõmĮ‹ŁĄµ¤JØTW¤µ%×§Bd.’'šB6*ņRņ-ŠäׂҤ"ŽłFQ•±$*:Ĺ¾ EŠPŠƒ½)ßŐgAŚ}zH.ˆ¬īƒAT™YeA)¤™q׬Į‚E’‚`X0,l”ęü›t- čŁ[xk;Ņ$+mČåØĮ{Ō£‹Fg–:/̾‚­^ÓI”odiD¦¬¤(Na"ąŒIšųĒ?ž5æóŚb0ƃĖīwéÆüŌPCŤµÄJ !|õ5×DQ$Ą}ļ{_Ųž8 żņ͆œ‡¢k ‡Ü”² öļD\)8.ÆŚaĄ®A„M*RŗŽ©t¼U·ŌˆWcīNĪ6)śÄä(¶Ačg^cTÓņ>GƒÖx}Ÿ`ó¼FŃå>ńÕ vžŃGȶbÜÖéy¢LUĆ^v_zż1ū€É 3T&n‡‹Ww1 lōj|*Vy«§ÖmH`c¬ĢĢNżOY3Uū‚óĪ;`Ū“š”§<…±Ä¬pQ•Gƒ“ņĪ®æ{”OčVMÕ¬Ū!;vP߉8vxųŃžŗųŒ1–DZGG· 1jœēFµžś3ź“Śķø`ä…+„IĒŠƒ~²ē=ćwV‚é.-7F0ÕsÉĪ® ;½2Ōm—.ĒI³q†0ęó…Éf¶"«\Nib„Ź³)“o }‡öŠ€Jų_>žį{žsę 7&»wÆÆ­š„Ļ| ­cõé}ä–nܽ•RŹš)Žmf}Ģ£~ųÉ?źpŪŪŲ}±XT‚æĘR”Ė8>¶¤b5l•=ŒŅlĮ™EŠY K<¤ijj0Œ™Å{Så²bbćõz²QŁ4@„,„jT«lŅ —Pų¶~Y% ū»b˜„HŌŅ0kĒ“¼£²y!␬ī¶dDĄ-Ųē ŖRPЬ&SŌėŠģW“„ī0+¬ß…”œŹŸö“r&«į8XĀĀ<•””œ;ė|>wĶÕ\žx6įēĀ­:ˆź)œU_Wš4EbJ…•|灐+!Q™ŖÜĀ5ŽŽrßÄ9„;³ØR¹JPwT&BQUīzāaPNkŗ(”8kXU½¤jęb3®"OÓLQ¤„ŠÅpūJb-™i~gmĆђPŌĄŅŌ­¦*Hrų¶T˜Žū]Ė3›hk (9 o³)_d©@v›"ŅQäJ ®§Ąµsęčś[Gx €ŲēįK.9’ ’žEMg©]{z3­’ńƒ86]pŻ ×#_ƒB Żģ0רĢjgføey \)WĖ(M޵= N̬gbÖƒŻ8Ūār[}°ĆbÆM¹=JJjdK¼|+¶¾ ‰¤rĻ„¼±=µĮ×Ü8,Ńzßø>Q%æm³GAM²»®½"]õ rmU ćEŪ€•c}gUęę°‚Ÿ8ķTÆŪXCēŚ¢ÉīlVr9xĻõßōZG½źEšŽÖ­{BRˆ6=ō0ķńŠY^rŠ3~łW^ŹK¢¹āŠ+Œ1ÅīžG<„*š ēŽÆæ^ d¤ÓB½£ū¢"äŠēņ<3¼n-’eY˜÷™ożC+cŒ}’žę^m LŻ}m(n²š‚Ī•®•žéw—xŽØY¶Ō ööhćĖHźĝ•ŽÓZtRŁ+ÅÅŹŲĒ@Õ÷ó[.C·Oż+I€Čŗ ƒ"+Q x.€ÓĢ,@WŅZAłRrƵ‘-ū•‘@M¾vķM0=vtcsN¤źy’8%dOžŃgܾ¹Ų3Ś= Ē+‰õ<ÅńłœżŽ~dD\ķŁ›‘B4Š­ĄxŽYZ¤£ Zk!@• /!ņĀ#J9‹€0 mš*ģ¢Ų°„Zē'—ö1‚Ö:°­Ć›„4"b–0ŖĖSz ­Użn}”™eVEÜŪbķ¬¶ŲkÓAąččžM tųĻŅ÷ö? (æŖśč¹gm%‘Ó$cFf’žšJwkżm{mĻBdĒāź(¾Õ5 “$Y,”l(ąĮµ¢åF˜9Å+0š†“1s+‚hõźņ9ĄF‹X<¾ėĻS*GĶT”[މ=€‚m­z§žw©lV‰Ó(’:ϧOŲpµzÖw^J°„»óx»ŪŽüļš‡ūYĒĶ+O³QPā8"…$I­ų–}„KČ}ę żÆŠ%’xm9Xį)®ŠČAĶ9œž§ō–ę ŽŁ^ˆŃ+_Č»Ü掑—ūģÅ )„£(7†,/3;ī‰R:ŠXŲŽ ˆģŸG™±{Ų+~łW¾šŁĻģõhĄšŒą ?ōøÆ|ż`M“a,¤Rhc³÷łü²K/=ißś’ļĻ~ŪŪŽ†ÜęŖ!#̣Ǫ‚†jŠ/DŁ4±””ß\Ó«§žå­¦ŗj§Hr€Źņ?¾ēŻ—^pĻĒ<āū?ņ‘Ųi×ÕƆ‡UN+*Y“‡üU;Ūd‰…9rŗÜrĒm·Ž|Ó _żŹ—Ņٌ¼85Čk5†1mŖĄÓéŌO+f¶…Č 7ahg³ 8ł,ļE”ēŗ ’Ū¶„·Qö¶u&Öß¶^Ā8Ąøj—{›—ŗśė¶¬é„GQw‹fųwcĢl6k#ŽXŗ] °r a†SĻ+ģS’Œ•RöA?ö±ćXyCÕŅj)ÓK–=’Ū¶ŖAw­a;ĮŹņ@°-i”=Ée a<°j·–ÓXœ G²Ķ4øUÓŚ[hö”DīÅź7åG½˜Ż•ć¹ŖĘš„’y×ŗ‰RmūFe “É“¶ēŠķ @h`Qļ–ęņܖȬ¶²ōI9$o $[t2*ˆbĶĢóŁĀ— Æs ĄqPÅ7ēŗAN²sÄDDš‚Ņ‹pŸŪg‰QŁ8–¼ėĶOzČw~ēźgü—ĒE³#ē®M¶©`6¦ÓŃd<œč‡¦?ó³?ņZ–ŠŹr‰‹f*Õfųė“=Ćā· ”B^hn8=U‰‡ChB¾ÉE‘2†AH“ĢŪ(ŪįŹ—¶Ų0ŻK¶†SČžÓ¶³V,Ž+½åu]q'R¢Ā ļx›ģ…ECŸ[v®õēšWŲ nģŒĆRĒÄ ŗrŚTåwpłļMļÉ,Y–±‘$I”B)"ı®™ß4¤v~Ńł8¬ č8¶`PaĖr¢ČjVjaīJßł¢³’EšøŃ%ŲlJE¤āšT J½ÓJÓx<²]ōlĢl:K2_”l߬J›XDZŽ ¾ē9(IŚā2÷–3L} G–dĘEŠO]™ˆ4ķiv­Q2O3Ÿ pšIĘą@]©öA>•-Ģcņžį8ŽCėŃČ)•œ|hąAZŗc›ų.ą€R:)––`l –_ŖÓ³p=µCäx¤‰YĢ“J9®Pä§s<0Ė2əAČįŒ&„$ĖśĘ暏’š^fɆŁČ}.<ļŻļž{£†FGpČ?“VŒ–ŒFƒ·¾ė\tįK~łrśé °H’f¹œ[_7\wVēß×w 8„©äZšē•¦Bwŗ$8Gčo6ŃōŒģøµ€Ķ{źŻšŻė>ń‰O<ķ)Oå$1DÕ=“ŹŹg•-Ş­ĢœŸģR ĀbūĆ6:ž¦ ŗßå÷}Š®xĄšĄ>0Ģ·Kuƒ&„®v±ˆlmmåżłŚMČ~9ZclļC2ė_ŠXĻźžł@¬ć”ó<šžē‘4 ŠQ?<¬ĻŁZj­jxŁŅš}ŗįŒ 9ZŻĮhåēćńŲ_Å0X¼ō|’Ūšēœ‹~“žL&•ĒܧߺŽlYņIźŻ”…ŖŚ–štŠėßśę·³"éh÷ž=œ›¦=9NµFüŽc•k¤šø«7³u¤ ”šf-± Ž2F‚…®nä°éĀJ2Ҷ,ŃÅ}ŪžĆr¬¦ø#!ØHw×,lrŪF.(Æ+‡ƒÕi‡ķ"mYSć¬}\W`X" ŻŪmp¦"ķIą#o‘ĘŠ™Dc—lĻ=ń“Ų¶­ĒOõJMĒuf’Ó6ėpoėĚ– ķĶŌ`AŃį)ÄŁN:+Ē@Ļ:š}±1GUĆĶŚu¼äŖ¢äzĢ ˆ"=ó^ÆHŲ71’gmۃ<Ē4$F:ŽüĪl_,¦hX²?”†«ńlŗ©(:|šÉ õ0użm¾våUū”~χ?Jm-Ņ,ŠļÜÜE[óĮdååÆxéóž’s–īäG_*²aœ9ĀģEöé[)³ėnÕZ1gółĢe6tfšoĶMbĄ¶JüĶƊ„9D®åZ\&A "¬4¹™V éŅ4õEś|Ŗš ČY*P 9 ÕF«™x‚(HrßW1GŚæĢ7~Ūæ(R$“¾¾;ļ« Bw}:bÜcƒ†Jƒ3q× „G)ąāwŻßĖq'i1©I”ÄZQ[X¬ ’÷Ī·]ŻGÕr0)P5Ņnō£(R‚•É$_’>īÉ<ń?“?÷óE¢ŸƒTŽō!W^¶Øū, EŹ;‰šmĶķ'QČ™ĻŹŁåÉežK˜Œ“Z™ŒķjHY"¶żµč–ϐC!tJi"-BQ4°›ʼ_¹øŁs›ŁøĘŽÆ<Ķ‚-Ā"ģĄD‘hˆäūp’|Š*k÷-A=%7Ģ+X°Vwj>_ R1ń” ‡ƒ\g[ `ی3ahe˜ {³ ’āw;’Ź'QT@Ē","Y–ś@Ā>\»‡,³B|€1v•“÷:"Ī,Z‘õ°¬”,+ܐŽŠ³*(-ä§g!/­ņ ·hŪ–ĮPW¤9,Z¹£2p+Ÿę üÜuˆłńfM Š"hśēżÄ—æõĶˆÓE2W×ÖAZ#Õbœ9„óH AŃźśŽäcgžua U<ˆ£¼äHėSɔŲc4ŠV^…S“4ōvQČź/ędø#łm§ \‘l“ÕZPįv!&#Äv%Ą8żo(Q1Åö¹;ü–‚ Čæ’'˜²‰HķM›~ųĆļ¼u?’ lģZÉ !Ӭї ĄH‰ę@āģtĶh ePĘ(ImyŚ€„>śŁZ•Ž#WR°ūƒXf2@fOą¼F•ĶŒ™3Ąļ}÷»n;xĒķ‡0į+ßüę'?łÆ„å Č #. ā$M€`R.f/ƒņ»6ģōÓN9œ,sģŲ!QlĄF8šs\–2›/8—vMzZGp*]øBxh„ĘąĢöjĖ6¬Qn«.ÜYm×N„ ‡l=üSŻ ķŅnļ:ÆRj%–œQ6_ Õž žųōąŅ,“šl„%Ć_÷J•=›æ;Ŗ<fžĻē!1ƒ…3“ADi§į~$W;<ė8jĪnŚŁn–\Hź% ’ģ|³A’$; pŌŅ•¼§DÄ6[6«Y“Sę*øĶ”zińø'”탚iΆkžāė&Šył<Ÿ{¾˜Č:U9lh†VlXĮ™p&•¼× ŸŖB,Źrš `yŻq¬y1’Ż×¾F“į K³8yļśž[nƒH§‹,YĢÓD jsž]vŸĖīł/„(@5ņöČrl®rķņĪ™Ē(Öe b»I—ŒÖz0ĄE#Ā"P°„LaA&ģch[P³ÖĄJk;±ŲäŽ'$°pŲõ\ä?t˜˜ķŁĖĻcŖ;R؈0“Vīƞ†m2†8•`ę³Eµˆē$¶<õŌēįŹ™šŽFk³zįC+ų›µ¤«4ō©Žö)óūˆ!„ą 0F*ˆ  9®ņ¼•*…%ū®6–PŪ”_¹ųzJÓŌ»T Żp8dc¬ć“4$…õø ā QLYZ”-Dˆ>oū·Tł„Dk6²X$y”=•Ąćā`IqlźeēZż »g+˜¦»~]ˆT—öp„8÷æŌ[LSMI8ą ĘĆ¢ø‰āWĀGoo¼Ų.(p¢"FülMŁžÄ»NfYfÅÉ,nssƒ™-£Äޣ޼ <¢Y†¦}Ÿ/¦C³”łLޕԳ,³ä»KŲŖAQn•R]µBš_֓ÅOģ,M’ģĻžĢGļ»V&†łŲę±aˆj»£Ńx¤"@łāRˆØó/M9śäTŹĀJE¶ć¼Č8rŻ)åÅš˜¬t‡5(& FŲaŌ놣`"Č{ŽžöP&åłl¬£Ļ}ösßžę•P:?­ˆ ĕ±Y 2 Œ½` ‰ 1XÅ2yĆėžü¼³Ļxā“ŸųŸ’yäÅē¹¶ņ k§_nēDŻć÷@n̬Hżų’8Ź«O)$ ‰1)*Žõ<&"G6®’Ź7ģ¶›Æ’čßI€ģ¶ośś§?O)D“!~õĖ~żA_vÉÉw»ō”³žś’L!Kū§ęF”z€ŚŃģ¹-FmC(« UŃz|x—i}”Pßžc6ÜŖ/ńŅ.ŹŗŃ–×įģŇ®šE¾·Ōx©N]ėScnLąĆ__j}¶4P)ÓmRŻłI¤“w}žóŸ’æļwØ03TžlšiĖv*E=-ˆķaCgQr¾£h…rā7 ž &ŏK Ōüŗ²ōŃŅl¶m2×Ķ܌»Z:,×*?ōždż§Ł¶ffhąÜ ÕÖYXf-VæŖśå¹™Ō•—Ŗ³|aōČl£‰ MKuW“6ńArIg*Ē’Rˆoūū×ļj ޤŖh+‘?- ³–ZøLÉ" ”'jĶXØLżą™”˜.:÷¼äŲQޚ§‰Y__ŁH¶h†R*ĪR$+õ™Ļö¢Ėī Yz½‚_Ź–>ƀų›Ķi#žvĀ4Ļæ›Æ:cˆ“Ķ<#«¦p4B{gĪ{Ø|Ÿ”ŹßŁ’*™¤E}µÖJAŒK™EP¶2ae”2ĄFęółd2¶æhŒ‰‘ ī]¶\ˆĶŲCM+B<ķ0dG**žiͦō“–ēīۈ𒄆•k+86‹nŻĆ†Šō ĢHJ½aŹdrq J‰Øśw›‚vZWA?wļģ „ ·$å¢oXā{Iq¢Įe]‚ü-ĆÖ¬øÆjÖéTšµV¶c“aoBY\I8£‚’AįõJŪ>J'¤Õ¾bö`ŗ½Jįźj²™y”¦Vtv}zĮfåĶżōÉmų¶įUyę,Ėƒø2ĆŻ6RŽĆķ4=oTą¼ąf&٤ŃD±.m @–¦Q7ŗĪöŽēL4²@½mµ½F„Tš¦ZkŪWāDŹhżŌóļ8;'[Ćél¾²¶ƒbČ®]k‡Žm Fńͷݶ²{ŻĪ\A±÷I¦@IĆG–Z¦UiżŪn€B·š|&°“Œ9r芁F£ŃYgŸķsŸŲHøP„afÖVé3ļĒńąĖīÅ[óŪn½u¶H˜¬®]uķ5“}§ø1 L§óĮ Š¢čźÆ~ķe/{ŁOæšgžˆG¤PVŪvh3ŁģŲ±c?’ó??\YN§Ń ~Ė[ßB1² ä@kULEþML±0ÄZ!†)RYf³•]»ÖW'I’C¶Ö•±ŸRłP¤€Ā‘Ū=ųŠūݹ’–Ż{ÖŅ4ŻŹ’ĶŁ""5ЌŃht09"ųZž*4#”‚0X¼ø©jiśXlöGĀgŻ "h ŒŃqĮ^ s“m+™/mBŽU>_/ÅūtQ놺s ‚޼¶zm…ŠiõT=M² Ēo+T°ā• :Ŗ\•µ„ļ_”_véa­"l¦ba­4 üć·Vuu’€µ³j­|Ō.`gU^(„83é")ņ᜼*MķFŌ§¾_i.…Āšå¶žü\"ßÓj©œ^×.ä†·ŻŚ¶äø¶5¶ėĆ֑av7x÷Ūm&ÖzO iqe÷ŗe9ł>ī)Ž"„,cOEn$€äAĈ2L˜öĒ€џüٟŅĘUIŗ½T=>[&ŽvYß–l%?Ę»ˆĮ·t±{Ć_Ć%…¼”Ęŗb8wĢ%Ÿä·§Fa’žT%Ü‹}š¦] ÷ķŁo=±oĆZO”^Q]I(lٟĶfv(žõĢgŁ}’«_ūź/żā/‚h:¢Ü¼“ʲcUį°¢a?Ā*0+­­ŠWAtÉUXEŗNė.sˆr Ū2ėŠj½ Ł)÷¶EŠ…„4˜‘ö™±=Ÿx‡¢u‡*L÷c:ęĘŗÆOŽZ§DĒ<)ė †jØ>@19½‘“¦él6³*ƍ)zĒ-ō_z™9ķlu—„`«|ļ6{Ɔ…sŽ®q&.¾‡0o„k€ˆƒP»Č$%E[‹¾i–ÖŚDßė~W@!Q‚1©45Ó)llfLŲZĢĻ=ļœĻå«eŒq|I„|WR+jåæŠÖĮ¦£×#U"0[ĶR«fģGĄ&Vć7lųQŗ¹Į£O6&öććqŹ(GˆEõ”,5Ž:ÕRÅó ß³/>vtĆ~3;%w AkŖXŪh ŻPśžÕ¼!Ķ„jRŖƒ”ź>R"·5qŌė2ķ–n`-…zöū4¾¦8*³Tc“l¼"ōRE’9ÖrIضMųÕĪĘ¢iÜv_²v”õšżEҰĮƒQ,>£lŅ ² |Ÿņͦs7ŒŅd½v­_Ń"II“FÄgĢvĀ–Öš“Żw ²aK”Ņ篗ݼ2¹€ (°2vØ/Õ³āBEøÜ5*ŽĖjGfąĘC•1Ŗ°†¢„Ę_ŹÕÓ|ŗ0)HAͶꊁ8“Cw¶ūrņ~Rąź¶Ų!Āö9VE.j„¢å冼īOłLńu7Ū½"Fó•.ecŒHkƲ-ŅQI²®ø`fĪl}AŃ'?ś±cĒ6bR‹E–¦€7½åķ0€RRŖJŗžqŹÓŸJ×e˜)Š#!r<˜A+A ār¦€ĶWæų„˜č¤½ė×]Ż?óé ™¼µ½Rģ±ŪkģBN/%zśÓŸ>ßؚ;ŗ¾2 ōīńšƒųœŸ¼äĒMÉ6¦÷æ÷%¬åŽŗļ×¾ńU°ł…Ÿū™?ų“?¹įĘė9B‹ÅŻÖWv ö­#/”$„{ßūŅ"Ļ »*ˆ§ō;ÆyŻžO礕Vj0ˆ¶“ķėn¼A&Ė’$šĖķWÅ;, @rÕ7æńŠW½zĻŚä¼Į®sćĮéƒõÓʓ­Evds‹±Žęœ]}ż [³ĶEŗ’ą! ‰’e™‚c%üģ’üłFō §ŖY’”u©Fo+ŗ r%쟵mk¾õ„T˧a-I ŖĮKš3Cӂ @ŌfĶRśųš3[]Ūķ'M#Škm¶‹ļuą„ö=ķžŅ[y{éW(€a’ŌZĒc;tś§j0Eźžą’ėӞ¶’ž;ļ¼Ó2l—~āńųH7ŹÓéœäWT‹‹Ņ8Õ]mõ%oį;"¹¦3 e„HPk+ ˆ°ķĘY–„mk¦eI·Fi•t©X÷¶*Š•ć§gÆE#Hā)Źįēvu1T#?ņŽĪ”T’ØŒüēŠ<¬[#!ŽćÉd2żĶ†b`Ė78)ŚSŪJŻŌ†’€ÆBõ­Å µ’fx!Q‘ŽGŌ”6T EBm˜ÜµÅæ”dW+* "bŲÄQlćŚ4c ¾ä²{›¦¬¢­$D˜iØx0Ė½īu/(EZk±pšc€ LŖ…A9*ä¦Ü$)·ĪYOŠŹ³UšƒX ‘ ß'Y‘K9  ÷ŠŻ+E}Dō‰Ó›ˆ Õb­#e2>zäXXM+an‡ŁļoöéļZ_³Æ‘MéI¹ž[ėÓą\(Іh›Ķ̳ŌT'Ź:ŅŅĄ²éӂŃĒÕt¦µė¤i;*_!Õ¦± ke¬’ņ2ÄŲOų¶[®dśß²EŽz‚Ż&ė’K]>_[./Ļ.Üč ö·“vLģį0özęł³s8EHXO‡¶aRòT¹x\[ƙŲ0Ղ¹”Øęå›ė±g•Ÿ5² Wd÷ÖPNŲ¾^«[ūV¶¦EzmmĶęҹÆ;ēsɶY8pE–ž,ß®ŗIŁŃŲ, oīöLĮ¶Ń£ÖJiņė²4ē%ŲSœdZPܱ7ĀņÕ/}YeĀJ#Øyā€V|t߂{ ß0('č@r8¤Cų£Qœµ‹ÕļR.$üęæžæ£XÆÆ¬LOņ/ų™ŸqÄ`išŹ‘ˆ“"Ć$>ō¹ū·?üßæw÷3Ī\‘e’šŻk«GyŽ? †µ±ö[Y];yĻ®;÷ßvŚīõsOŚ{Ķ7æ⛯»V¬h.8¼0·llmĒĄ˜ ¦œBpÆ{]ųÅ/ž»IŁ;¼°98½ńš«žõä'żņK~łW_ü’Ż’>÷śŠ»ß ėėėń``ėąĆįŠ®·]“1o{Ē[ A<åÉOÜļŽaļ(˲ÕÕUfyĘӟa»ŽłĪwwŽ=O>łŌĮ`pūķ·‡}Œ'źbBŗÖSJ6³µpįčŌ~99śŪG“e™ÆļģŃÉķ­€k‹5‘dQŁ~Ė.2źv”6Ś.ÆEŖ­‘i©– 5·fUč¦ĪŹŲ‰Ź¢ģYń‘bęH‘K_E¢8ąļł‡¹Į‘­”jk–éH‰ČpEQ” īqsk’VŲ,÷؊ļ@qŌhī[”¢¬źNR€*’ˆœŃš£LŖžĀ9Į YĄÜ@“ŹMe“\²K[dŲ±£•Тȳ¬•&“q’$Ek+¹÷ōö6JS–±oɶDV©õŻ»fDNvõĄ¾·ƒ²Į} ¢ąuēmćE—xĆ&ćC½|p,MĄ5 –M‰JŻÅ=Ko"ł”A@ĆBئÅuX”>EŹ(9qŚ ™•fo5N'į¶ėM›B%’žÕF­ õ”©®MŲ!ŗéŽÜ{¤YɹüļV9ȈĆ=/@Æ„*;¤-Ź+6©Wv_!4Ū|“Ł:”/•R•©Ÿ³ņ“HK 毷jĻēóŠ4øĀ@²u ‡{›[[ӂ’8!F#O–OFĆįŠfĀqŁUftķźā\Ž”…“$©Sčķ‰P×ć܆ĢO­IĒē·lg›ūžg{‘E‹u Ń c†ÖÆżėE$†:夽‘ŅL@åó—AģŃTi1kŹg¶C”°6¶)sŪē ­jåDQQöb\rń½85‹ŁÖ@G“XāųõÆ’Ėo~å+E„†Āģ˜‰äĪn|óė’āi?ņ#Č2Ń?šĮ¾ö†ļŪHķY€dćŠĮY–L76Õ|¶8|čŪß¾&%3ŅƒNEwß»¶.8ļ““Ļ:łälšhą ’ēOæžµÆGq¬£@ĒVHßm‚׿łųCļß=¤‘Ęu×^ū¼Ÿx6ę›ÓŁ1䅆O|āS‘RŒ† <ō!ßKJ/²Ō¶pš~ķk_[$f‘̶Ž-Ö&ė,»nŗ}śĶ[ģŻ»zŃłgŸ³gtę Nٳ+¢Qnė81øģŒ³|Ļ w’+¾õ„/C‰!*ŌÜ %įFÖIųø+yÜĪņ)O<ńĀr•zJEņ~-Mé›)QMSXµ ź†KÅJź5®Å¤źh‡gK@j±}ż`0 8=„žf‡Ća˜lmmītX ŸJȳ¢DlĢOžäOVŽÆZŽÖ¹ćŖIŲ„ģc*5¾‚Å #ß±ĀHDܤļų|KlĀKXqi­=ś““{¼īҶi{eX"ŁxŪų”ݾj;+›łŲ®.>~jƒ’ ‡qd]¬²q$;RÖęy»ėܙRw’•[æZŸT”­ķŃ‹WǤ .¦ŽJ‰4qP½¹‰Ķ? ß "©ČŪ‘&mål¬ żĢ[÷ßf&«»¬µŠƒ±0žĆö°rĆ²>zhŻČ{Ž©*’ü4Ķl.jŒń)([ģ?Šh*A$Ė;“R£į0Š"Ÿny‡L»9Ø „”=>tz;øF2†•G*čėD&ćVÜ …ŻN©HA9¤Ķ:Rę Qńj‘‹™q6-F|sk.(•—#©łŲnčo/35¾¦²‘VC„ŠĄ“Ć.ļü®…\R” ź™vćõDQŌ¶%†„7äXUödĻ`ŖaŚ|¦ÉŌWyą×»B4BŹįąŁü6Ģ!™QQÆTŠģē, ×ĶĻ„ķ5ā»œī܁dim³jī©A%3Ŗ7%…æŗ²²āõ“ ń<*a}ŽŖŠģ õ"ŲA ”~¼;¾X’$¹¦—@„“‚rœ>¹UšŁlÖĘóZ.āŲŌ.bw RNŅŶųBCČtšĶŅ!G½xˆ„öiOmpļfó}ß¹öšń0ųąĮC›ÓōꫯFIOĪ5“šäŹ AóFÕ\'ƒwrğHmQŌ|Ł {œ}¶R#š”IżéŹxāĢYŁYƒ ŒĄŲŅĶå÷ŗō/ūµĻ’ėg>ü÷ļ3HD²ļ^wĶŃoJš’¬Ÿ¼Wpl1]ß»rxóčh÷®x2Ȇ`Ąk'ķ[ݽ¾ČRŸ’Äæ¦Ē6n¹é†ÕI4UsžąP¶1qŻž·8š×o|ćæ|ģcOöO4„˜÷p8Ųc—Ķ ļ~ē;ŠvÆ®ĘDēyśl:}łÆüŹŹźj^0¢ū\vŸŒ9ŹįāG=źQ‰#gB®“¢A4Ś»"ćŃ!-×=śœŸł©?žó?ٵo×£’čśæż‡æ’šĒ=ś¢{_"‚䓽«÷:ēŒKī~śY'ķżāW¾ųÕ›ÆżĢÕ_’Ē’äł÷½WŠ ` .ÜL„m‹`©ģūÓ'ƒč™6K@}Ŗlę'Æ×ųÕ‰•öĢvJ2õ‰žė»sE„¹±g£ńś²,k+T“Ѥ¤ZMė£\QĘn¼ »‘µ†Æ`°av±-©Ļ ŹjĆ~4¶¶¶VWWUį}Gæš æšŹW¾ņ·~ė·~ćÆ(ė.źīČU|sQGŻ1(ĘńL]Æ+ōj"¢BsƼµŃl6FNZ¦ezxžm÷ź3!Köišy˜ŗAƧ°Tµm%ź>ģ€Ź_*½KēUć«:vBqi__”Ę{ć]4ŖµļL¹}iŁ¢’ŪÖēŪŽŪģwžō¹<ŠŲ²—Ņŗ¤Ž›«¼2¤?¶žÄż©¦‚>Ą<{1æł²_Õ+_¹EΈH“!ٵw÷wo>x`ćŠd¼ĖŠ5īį>£plŅp·`ÆgĖ9ĄģRߜFm§š¼X$žPZ*œ„Į¶õR7D)剘1ƒAģ>XÄFĆīŚ˜LŹzė HÓŌ¾¾AČ55ĪŸĘ Ō¶ö±° ĄI‘SIŖ½.ßĢ ¤Śüvže™ pė;łŅ §¾»ŻĪĀ£Ķu…Ū„ĆbOĆšŽ‹Åh8*I¢d±ˆ­^]K'˜=æŹ9NĄ®‰§#2]m»¶M¶RԈķyZzŹ–† T3ģ A¢•óJ”¢n¤¢ŹˆqżAŖžž¾ \¼åĻ-†K5ģÕĘMŚ«°Ś( 2Ę W.V7ŗ|i“5f.IĒ»G-%§ŗB^Bķn&"æTŒ&dĢÆQš„Õsø×…ŗ9*TŒ·)k”3*n‰ic±żšŹ :IÉ_ƒą+Z+"\}å·.æōŽvĄˆÖźČ±ĶŃx¦Ón'%Ģb Ūöæ2cć„-ĮŽH»IVVxŠž,,Næų…/ßćēoĶgW]uÕĆö°ÕŻ»œ 8‘°ć„ūĒTŚzņS€”ż¢ä4ūʾųģ§=ukkė7_żŖgžŌó Ą&_;ĢĒīŲ’ąū_¾’–k“h>ĻDcšāœ ĪūĘ·® ™Ķ“‘˦ xī3žž”w½ˆāј)zĖ»ß÷ ‡= ħŸ²w,L&Ī¢(F‘^wŪķßśĪU§}TĢ. cdüų’ņ˜Oā㣫Ćį®Õõ/ėź|äĆ?öcOD41išžĮŽšō’ö¬"hζÖmB Ņō‰}ܧžå_ö¬ę‹9€ ń4ɾņ•ƝwÉÅŠ൯żŻ—¼ä%+Ą©ūvßxšČc~ą1ļ’§ƒYϟI²·æń 7ŻtÓyā“.½×å 88Ż00ك.ŗšŲĮ;ˆ(5I*üŻĆsRq¾,”õŒt„0v&f³łh2ģˆÖź½$`jąxķ0.Ą¦²ĪE™ųԈ¢ł+Y8˲Į`¦©—“(N:i8’ƒæ–§ÄŻjÅŲviNXWÕÆH[5¢jm:XĢÜŲ6ҟŚņ0¦©żŲ¾fĻŅׇŸŽ3?ļyĻ{ĆŽ`ēŌk^óŖæä%aØK.FģÅ:0Ę(čĀbD£{HżĪV0±Z.¾°ŚŹ¹ˆ.B“eZkÕė%ÖKŻ’z—RˆČ9³“N€„O¢Ų-[sć¶&½>µ§Äm¬>>R)q½ŗŃ³ŽŃ±½t—äŠ9ÆŚužvfȱŻĮ,M!gˆĖQłśQ–¦« u° Śų~op׆ _vх7\{݈#ڽw}sss“kec>½łą†VĆś/樅j«˜qV—+k¬e·hEF„•½ų³O\Ų„(EWpŁąGŲ'ø«Jē‰Äʘ8Ž˜EEVXœ]‹].M³8Ö(Ė w”łĀ#¹žŻõ/Ż.}R®¼h ‹å9PO‰›—§8OoņŌ1- ™’»żŪćŅ#»cÖccŒ³])bSńQW‘gRCJܽŪūŻÜ“؁¶Ę`6? Sāāö]¶ÖbRČ{%Üh‡%!BĒß s¦`6ÖvWIÆĻ ČVŠ& ĮXp†~KRśu4É[Š3$÷¹e1ŸI)Ų¼¤%S s-ļoDuƶ@U‹(°qŖ„m“ŠUöq£Ė±©ź(#us£@λʵÉŠ˜šaxU+Ē“/c±ÖD 7¼žu?÷Ó?3Œ£,ĖŽnmŒĒc;łJu1M‰ó:ZI·¼±¼ĆP Œ#ßžę·|éS’ģg?{ćžCóla}ßļwÉDtł}ļūņW¾bļYēCł2ØKćjJ,*OģŻD}šš•ĻįäÉd±XŒVW>ų‘ŗō~÷ė4Ļ~ņ“’ż3Ÿä­y©,˦©Į™ēŸóļ_æC ™Ö į\zIräą|>_[ß}ūžƒg_rÉæ~žóY2OÖĪÜ;V©Q fžDQ¤õąŠęōĢóĪūņ·®„+I²ß~Å+~ó×s÷ćń8cŗīĘ[±:9|čŠYw?s:5yŠ÷üÓ?żÓ`u „żĪLeCoe?ņųĒ~éß>¶gĻīÅb¶µµ˜§j–ņÆ’Ę+^ō+/…¦,Ė¢h0Pz"<™ÄG¦©ŠćĶŁĢˆQрZ1AF @‹Umcwļ °ÆØx L&Ćx 76¦æ’†æ|Ƴ~Āźh§»Ā¶'½rV¦©‰cŻXÓl nƒÓÄ;·Ķg‹Į`ąZ÷MQŃc–2m(Ųض§QQ²ōœÖB|Ķ¢ģfaĖY‡KéžXšH¤ĪĄŻd”„ż––ā}“æ+MŃR#‰mĒ_>ÖeŗZČQӛŽäÕ_ü’_.ŗū]R)-Õņm½ÖJ±.ŁŚš3­‡wńU==Õvs¹ ¤ śˆč(r‘Ež^u2|(¬āõĢ+5ĖÕļɝ@Ą×* 𲄨Ü=įO šxż„^Ŗm^ ø;Ģ™vÜ*fUÜ|¦mŪ“*’©_Ž O8»]Æ|3B·‘[xæ;Söī’ś° W×!³˜Fów DģŻ'¶”£č4„†Ųč­xøD7Üp£}ū$“cĒŽĘq”&ɑ#iEµØŁŲ¦cĘśõ’²I²4Ķü‡FZiE>)Uš¢(²fóŁ¢v'N’Ź­ßŹ)›‹9ēe/„5zå–HŠLŹbŲ½ŽĘpš¦]rłŅą}T¹åŗ‰Z“{N!Ÿ‡S éŌq¢-% 7Vø*WčÆßNŃ6µ¼åGžAįNRŠšŲAųhŽ4}„?߯ļv€EĒuŽIn%ĶūńśŖTŅąĻrŻG©(Ž-?Ü&c e5²:ä ˤµ*Nؖ„Źś÷T5ŲZ-µ,Ϲ ¼KŁĒ«R{ ³›iJTR¹÷Vd¤Š¦ó %½t嗄{‚łÆ…]$•žźŹŹ³„Õ³eŪJŽč^p3üĪĶݟRY”P Z+ēŒ¤¦be®)‚6.«} ä|\ģXs¹łĖšQUɚ€'Z ’…(¦[žŸ’ģēD± Ö&Ćńx`į+f&„¤¼Hf\‘Æ«¬_³H ųāæ}n}8\‰čŒ“NzŃ ~įM’¾oŻ|Ū4K„Ō©§ß¼źź/~óŖ7æõ÷øĒOyüŽqĆ­” 1 1$®„*Z܌>|ą Ą$bĢķĒŽŻ÷ŠŻšŻkĄVČłäæ|źč±­£‹Å³9q&¼ŗgżŹo^sēM·‚ Jģ)fWÕb:żę·®:rōšx2:tč嵕£‡‚Ķʔƻ'£ÅÖ,I Z_[E±fŒ£čśļ\ūo~Ǧģ"`Ÿ}·3÷¬ ¬¢ķŹŹŚĶ×ß#{öģŪ<6KŽżŌæüŪx“®EiVHSCZ „ Ųų)bl\Ķw?śĻŒ4Į¤É"Ҙ G±Ræöņ—]wÕÕ¢(śČ?}Ā£,g č·¼åZG”31Ś@sĪ“°ėĪnĻ)c1Ÿ§‚]{÷N3Kxšae²Ė>Nķkė€&UYĀöČcŻĮˆ¦– *„(M2+Įh<Ģ+ą-žŒJņ™„Všp ‹}”€±ĶŖ9-‡ū;°”øGyU–&Ÿõm·Ē·ÉUņķŠ•-ķ¶j¼ / c›ÓOdKES»©’tŪTf/Ų6^ÖAĀ„°a kšO\é•fäĒEÉ·ŗĶ•Zk­rŻBSJ]IŸŚüśrķÖ“¾FŹņEŪĢlKe/},ĖŃ·µzQk/ļ FWJ6•ėܱ‹ -s0³ļiDŁé4Š"šĶžĶŒ’gøjŚä(—Ź™TÕüw؍ŗ4aī#ā…‰¬>O­ÆVvŁŲ‘HņnŻ#¤ōL›l[ėš—ĻķŲ¼”[}JÅĆx²: ŽÉź`o™]|ž™mŽtŽŌ§®ĆÆ īĶĮ‰(R:ŽüÕ23acXœM‘Ą‹Ńh4E…¦Fó{…7Rä{%é-kæ© 8“’’|īM%Ž{ Äc­šTGŹ7:cgšˆeŽJ“üD˜=Ö“®įUĒĀz·ĻŲ}ł›Jbó'—'¶ƒdєéµnźpŠ* ēNQ^ŌJEš¼—5ĀTmkŖ2=J&Tź4&²<Žb„€­Łl  ‚G|’ƙn%2J©ź"óӘŊ?5ĘT"¢ƒ›®æž{æļ{i²:œ õ Ž"Ķf÷h¼{iašoģ]¬¢U…ń@MtōńšÉOx|6ß1“jZąŻUDĄ)ŒŁ½2Ų³¶»"„W½źUPM)Cƌ·ę™ģ†j0ˆā­Ķ(Ępuāv!8ØŠ$f8{ÖūöķxG§ŸvŹśŹ €?ųŻßłoO}ŹŹd8ă(>zx#KR6fe8Ś·¾{¶5µŒn§cB¤µ^‡¤×Ē+ĒžŪ·æÕč(„iu±F¤„4 #еļśŃVw’ DzQ¾ö­Æ`8E‘RĄŽŻ“A$£(Ś=_ré%ŸśųĒ`²ļ~ēźXAƒ(Z ¦[ów¾õ-[}ńB)“ˆ‚(bē×(1xÄ&Ī䬓N:|čP)h•żēB&&ͧ³RžZƕĶ+©V©‚|}EQd Ļē‹ŠE¼NCØėž'Õ9t˜—’pÖōNRāʈ³[_ęŃæF¢ćL­C¬čm¾ŅWźˆ•ļˆwyB¬TüVėĶZ¼ÖHå„īõ,s›{‹ÉŲę½JžÓ= żIŽ/-ī 2ĀNй/bžIRP¾­ŪqŁõīŪöō1anø`*ģ^}¼åłź}4KŖÓģø'AŸ'Ųę¢^É{O ćyŲ}j%O“vcĢŃ£G-­‹Z“1Ē:Tį)ŗźxĒCT]qY–ټÆM?ӏ 3ū }£ģ¶Ļšļ ®¾ĻŗdĢŲą’Ń0Ój7ßMcqfWE¾Š,Im;œ_xį…³Ł,ŽÉ¤2ŪŹŅEk\zÉ%>¢ƧžŸT’ “Ēé Zƒ-¦ÉŪ“Äq”_$%‹4””BYȇˆäŖ9!ÓļcįŗFŠŽ¦F)š'‰ŠŹ sØ×FMžĻ˽õĮ±Čj#„Ū;·yS%ūä4`X VĪŹeø¦’\eTĪǰī^ƝÅq\/Ź46Ø·ć”ż’Rˆć8Žćŗsa[ķ ”•źcAGa[De„H5«ģ.ĶWJiA1¢JŒ—¼Œek4JÓŚ®Õķn„Å?ÄŗwùćP£"Ū,?ÄüOļųµdƒ5„y.H;œ eZ¤J+õV‰žPVŅ®dy4ģy„ā%ĮĢ7ūoŃ8C”šųČóāŚ³v{BnĻFޱ\…ypįÄVŹŽµÖZi»£zO81 !ėsN–fs—Ür žå‚¢|’8F4óē>÷¹µÕ•µÕIbdmm|ńÅƘɏŠ«¦ I~‘¤(°0,[9ą{śP`c1Ż0É,KbĢ|a˜Y†C‰I²HY:PF _ųĘWßų¶wŲGTµā«•EģŃ0ʑĀę±££kėžzŅGŽūī[ÆūéČÜtću7ŻrŪi§ģŚ·ou}g³Ł˜d}8Ų³:ś­—’j¶¹©ČJ¹3Q¬aų{p’łtS“¬MĘÉlŗwmĀ7\ó|÷ßgI:Ž”ĘŹŹ ćl²:!­³$żßæūkm- Į<™LŒ1Ó­Ķ4™"żĪ·½Õ… „³Eb›­­©õ.āÕ`ž ˆˆAœ,fw;õ$Ī$™%Jass:ĻI²:Æiż÷½Ą…ēŸ1“¢3Ļ8c1KĪ:ćä'=é‰Ćį8Å‘vG¹"=ĉ"1Y†H«ńųE/zQ¤£ł,ŁZĢøķ¶Ūąz4Ąh<®­ŹŠ@q‰ĮJ„ˆc’‘¤™?ÄG£a„IŲēĢ 1¹ż@QDCń!kü^š’•ĖšV5ŪœėGU½õ”7¢ ī8' ż[Ź/­’śŅ }{PN{Ńh{„Xe:YČF¶#yōčĘb‘Vś;!|“mšcģ€cŠXŻČO”j2TŃä,Ÿv śuĮʶ•Ož_ŗ€ŠšļŽ>¦¾¼DJ¬ėiu/KM•ź_– ]©AT%RZĮ‰8Ö§Ÿ~*|Bkbf"É ņ”ÕŠrרĘdøžåŲ`¹ŽHūB³©`%XģŲžKx)¶_£,0Śr>©„!m¹ŠŌį;ķŗ±Ø¬Ć9•zä£@GQŹrĻ ī¹²6MVT¤n¹ńę Ø\ŖĀ„ćPŁfŠ”6†W…óp/YE}'”Ā`G±Ī‰įƒŚ<æ6ö}Ām&I’²ƒU8Ž5FƁ Ž“ÅA|Ö Om±I;½1ÅŚ%Ųåš7“Ā<4“üeˆA„ߤžD¬w@ŪņV=Unó­0„Ūū˜Ŗ“¤iėv؝…ā˜KÄé%Œ)fFķTv&[EŲZ©#»j,Ąv%4©õŖq¼„4Ɏ9ęӘåŪ‚8«°ęŖÉnŗ”ZT^ÜĀl— a„2ĢZ‹O±"#`Ņ0l XøąS8\m„+TĢŠÉ“³ÄbĀģL¼»øvįĆDČ2S5s ąÖ—Qė©×T*ø”qõmUŲČŁŠK˜IėІ0üŚ©ģÖzc8ͲEź‡4Št©šŃ>+l>Ī™_§Ā™·üTPŃŃ£GmnĶf³ˆ°H2„cč*Ń@„ŽéäZrØüTŽ›ˆ<ūŁĻ¾õÖ[3HéŒ`€TĮÄj33ˆ2……RSąH†,ŅFéc©¤i:Ōß~ī’øīźk‘Eą9«rĘ)÷¼ē=ƒŽ¤5iušČ$ęĀó.8tūķ tĒ­·LĘƒ6“Äh½¶oW 6ĘPĘ’Žw¾š/°÷—eĄŸ’Ä'/6§+ćŃb6e“.泃ū÷æņ…/ÜÓMf>é@ʆcµ²{ķšĘ±é|+]ĢŽ>d)DnÄ“śź7æ~lŗ5^¦&!…3O:‰Œ‰@ēžvśćśšĒ~ßư±©DÖV&b Įś;°Ą€˜M®`(ˆł×żŌīœĻ“,3£Ńhuuu8Ž/†‘žÄĒ>Š‘;) [ȝ·ß±w÷d2ŗó`4zHD iÅ*D±DEˆH_pŁås˜D"Ā}ļ{ß å6†ŗ39f«¤™U" QÓę Uēy¾ŅŅ rùf8ÜcO”ĀĖ‰ĀŠŌń_AGTż•qw4wH…Ķ„ŻGucÕyit»­¼}g œ©±-młø±1éĆžpŪ¢@×~ējŪ ÄˆŻ:—2*JĪ 7Ņ$(R źxfOŲ“śabŗŒJM&j[ćßq×%ćJŪOŕę«mō/m\Ē u&h~k±CĪĘ铯¶€°g9VŚĀ7ŌZF#CWāć w“ĶŽóx®ÓŅZˆvU’HŪ–ŅåæŗSjIß½1¬f1;—‘Āg"ääs‘%UēÜŪQ9Ŗä0Y–1„!NīÕz I:]¤Sƒo\żĆ³­é4ŽÆüöՕö¹:¾W[q`öWØ ”“@ć¤qg™Q¹‹ÖγĒa,M_Ö²v}iÆL-Ēż„”¶“GøŅāŗŒV}Hŗ»ŠŪŖ¢Ļe»3išŚNæoŪĪŲ°ł6$ē„U?éü±ā[.Õć=õ¦g©ŗmŹU>ŌÉ26&D\ėČy‘öųļF‰õ:®.l]ɍø…k×`Œa#ŪohŠ{9W®ŻŹF¢(ڵkW„tRĀhĀ·«éhG–µ£P3£F3ŲVÉé ¶ÕĶė~cJļtb,I’dĢMQ2"®õqBÓ ^NėĀh”‰“I÷¹‹°… ü7—Xcæ—ę "„“Ž}°”\xšPÄĆĘpQrOZ¬Ö3+PDŹÜ -Ļ¢xŃÅõWn­7-Ūv—­žĘĶīL0›§ 3(²°63§‹¤¶fP(󅟞ŪjB°’ÖŪŽō7c¼ČLf•łYöN†{Ęś¬}ė’ü¾æ{ÖSŸüūÆśõg=ėæn-Ģ˜]ėƒÓN[Ÿ “Óև_tžßüõ_6ß°ŚPąĢ€päčĘĮƛ¤ō"1BH v­ķ?šˆGAč™O{†™g‡ Õ¢’E–18Ņƕ•›ī8|å•W"ßĆaųĖ_üŅw¾ueš.2’Éd"b6F–~šŽwūžŪÖw­EJ‘ˆŠ"Ņ:SH•įˆõH}ģć’rš¶[TNėč—¾ü'|ŗßsęół¾]kCß~ēĮ}ę3ŸüĀ~ń„/5Š2‰4 ƒ ¢ČJłhECY)9ďzŲ#Ę£įśŚź"KŽnĢ7§Óõ]ū 4aߞÕėÆłĪgžéĆ?ü„'Ā&Œ£ÅĀ|ē»7žzźé[õŪ”ķ÷! Ė,»Ss¾čŒa=ź±]YYŃD“ń`muü›Æ|%T±Ø¦žÕf„ŁVŽ­-©Xq{#6'qĪ…ā:üķēÖÖ;Ҳ©ŹŌo;āj4{’뱕)ūČŹÕ™Ŗr•½K貋Β<ģ8 ż ėiŽO¬ąõ#Sš?“„źz ݇īQłčž^š$š(‡6|ē_ĆkzĄ×F}eyzćÜ`ÜaK”dé÷=ņū9· £#Ód6O.æļżŠ.ŠZ§’äØTÓ]’«AĮu1[ZĪŽR_Šļ±“Mó…aŻĀ“!¼°,Ė\ķ™Čś‘ŚĶ£Ų|¾4ŹM—2ä~”–6+ąmĄ qkoÓHéģŁZ*Uæ˜Ź“ņ O’$!v©ŠGŲ{ÖąŖŻō»J‘Wj\­~ļ·&ՕĢm‰ŖeÅ"©’†łIč3W€M;cm哞ŽQ¤:vm@ņ4Cåd”os„0Ѽh¹” 7öʗįPji-nŻPEVQš#pšFw€Ą8Ś“˜Å–,×#²}“AƒLéż=c³g÷ھÓN'°‚ˆ…A“ČŅ9g2Œāļ|ū*ĢÓ5­wǃ]JM€ū\x£…H@JŁō7_žl‹"D"`|īß¾Ģ³µ]+ėėkW<šŽ—\zĮ­ū€`Ņd>Ż›ŸżéēŻpŻõūvļŃĄęŃcJ©Xį5Æy ŠV>рH³hpĮ"Ņvbk`|āCś>HŅ”D†1ޘƒłÖ–sfņ–N „“åk•€”®Gčż ]¹'!‚×ėmÖņ‰æŒ®²ut”^Ar憻꫗…’ūÖ֖&X(0pņĪ")MŁwdómåjVU$;“…ŗKų…!hÓż.Śü¢*MŒ(łļq%O`f[Ø|ę3Ü÷Śeć^©ØW·U)ż G RĢØ\‚„&†G…•±R,ģö rŻĀųbū3R¤Üß“rx—?·‰°žÉ²ŲŁUśöŻČaܼ7»ƒÓ”PŠģG Y+]döX"‰‚"§™”U[7š1fkk«Ą^–Ļ•™ćēŖ’õĘĘųą×ŻsLÓŖœ†ÅčŒ+{¹foeE ƒ:4Ż^ū+ÆOŐ#@‚Fä†ņ„87Æī«mTŁ­ü½2žžŖ†Ć”iBcGįĢ¢ v»Ę0Χe{ogC&N{‹lh%¹L…oć0‹$Ww$gbµpÜ·”½@Ö\Ä1ŽždpōŅžž6+=M [‹ō’öyjm„Ż:  Åpp’$Q E,fs‚]ž Ö± ųŽŻ(I2&«1&ó•> ų”‚øPXDi­"-(R‘†‚¶­Č¾ŖĘˆ“²ĘŲn1RJ“•XĆu¢:mDU²&·M8dÉ÷66†„‹¢K+Ėõ©“f‹Ł<Ü»|Ó m²?/&ÆŹY•ڹ „Rö/E]ĄĘÖ`ø&FŁį`&EÖé·ćLÆ,„Ę„įka-щ;L7‡Š k8ŒėÕ«FĄĀŒÅ ŹyŠdX|sš[ ®{ nĶŚk†LŅJØxeX—¾ķ+(ÖR…|]žœēb`“rØ{ģȁdĻ_ßwć$ЁŅ6Æk•“ L”ÜĒå$²"’i@n=*R®CĮÅo»QŪįņTF›³é¼Ų~BбņæJ5õ·»Ú9‰ä^AJ)6¦ŲE¹˜ł"b3įŠ¹ĀÕVņ7d I3;tÖµ†MĪa·«Ūń™Ķf m/%żŪ į0_AZi·Y»)‰”Š”÷¦µænӃ¢J+KĄfa!©÷R¶JœŒ™DGDš!]÷¼ä¢#[›’ķWĆ?˜|V"Ś³[¶nHī ¬É»ĘG>źū $¬…WcAֆсĆĒXau×^Éå` «—žęļ¼ēŸ>łŌ’śģ}+£Č`ϘöŽšĻ’h¶w>{Ł~ ke"ę#öÆEŲŲ¼s<ĀI»OÕ2  ĆŃĄPrē‘Ūõ@e’F EĆh’ĢĢ@:ІƒįŖŗņš«’ź/’¢ą_|įĻ~śÓæžęk§ÓéV2Ļ@[Étczxczx‘Mc½0Łįc[sV+§žłŒg?÷čBŃśž“ļ<²ńÄĒ=^  +7§ę³˜xc+¬¬oĪg‹$2ļ†hmj<ēł/øłę[‰ d“[˜ˆmIB š4Ģ—¾śYĆę–[÷ol.R ^žŹ× ńŽuM4 ¢Éźśµ7Žś‡æó»Ó#GM¤¢§{bڳo7”†d2ĖĀv§æ²­ÅV›Ēт ¾ļяžƒ’óŗ;ęó˜'PĄÉ'ļ­ ķSP„łtę{|„i‰*E®¶Ę(äŌw„ņņ”¹# &‰ĄÄ”Ā@B…óšmw^cå®öPWæ[cdkŁph“jӔ9Ž”Ųg”!Ą²²²Byk(Ó`zf{3‚K ćéJ®Ų7UӕÆs/…©»SĒoĮ†¶*ĒöūˆF|»R˜±‰e%“²CwÖYgł„s<ļŗÆlŗ/¾›¬Žö\B·ŅćAHšs‰Śė€ŌJ“ަmŖw ¤iš¦YÕļ± ōŻe–B\JüŚā*a¹]#pdé+I’ųpĮƒJAkŅŗpQ=±³„nFĒ’ž L’d»i|„ŠŠ_mČ]·uÅՊh KÜīČ“yŽTœįFšR Ń*ŠP]ū Ča$_žņ—S6ŠĄl˜…€½»÷ųŻß~­ż av}yT’E­“½ų]Åžiń[oŌiń:"ģŁ³Ē–J‰\čfŒ(‰‡\¬±Šb‘ŗ…k;„ó›uqe…;KåšN§i’ĆPµnL©0Ö%ü/gWc$M2’‹žųĄ^חK­ēJ^ĻjÓ&)—T`åhEDĒQ<¤™±%c¤tŠ•U¦U0¦JrĆA}—sŲ:Q1yŖ¤–:œu÷˜lW>v®V0,'Ør²łµ°˜'X}2kĮ%‚(RQ¤C„3<4źƒ†ŠwŹŹēØ”3M1n^yŠ#Ė2'UŻ®ĻP™ó” _×BµĢUO¦‚6Y=q*23ž ©E{¬$ß]cT®ŸŹłhŃ>”P-¶ŽóŪņDÕ6l·Ģb@]47ŚŲÓęĢlÄVŽü‡†ä»Ž Ö-äĘsĄ£ ’C°eWdoOåŹ5‚ķ¶N“éŲ啁ČŃC‡ķ’iRė“Ń|¶ak! –Æ-1r×ßųń·Žz³U'°@’"5ųĄŽó¢{żžżéƒ¾ļūˆ¢¼ ƒŌ½ļū=šś×’ą<É mk}čČį§=łGmFī[TŠ8?Ļ%n½žśk®¹ę¤“öV 8xGj’ł”µÅZÓx<1ńxtęŁwG¬O;ėL5ŒBj²a<޽2ž_}™«Fe|įyēļ]ß½6 Eŗ¾wm0Z5)Mje0Ŗh×®ŻscĆ1T4Ī'c5›-f³-<īqcĪ«¢üą‡Ø ‹Y1ƒ±ZŁ„E/:Ū7Ō+§¬Ägq$ƒbWa°o[‘Ž"ÉŃĶ3OŽ=¬ˆQyō.Č#Ööģ>šˆŁ0QŠ{ģ;霽{žłżļ+EƜA„:šĶföšF0Xœw¶–§ä^—_6ˆÕ`ŪćŃpę'}!l)”O™Ł®žŲ‘ąŌ{v|Ż-åYĘiš„i¶ŻLµī iµcŚü}±ĢŠ„›ø%®ØC×m:t°:¢Õ„[ćWŲśbßÖ3ŸĻwęŪQ–čII­@ĒeŌg’ĻĆmé!Š"ŪÉĢ^§VŖ”Ō„¶ÆW²øzRŻÕÓŲćqWZ]Z§J¾żT.Ąk?¶Ž¶B Śwf!įx#‹ĄŌå²BŚ­Ÿ–‚kņųø‘P¶­VÜA»ėõ»X,"Ēz2“åŅkÜ=ĮNT¦Šć`ew'±^hŻNT„õ`;¦8WUßļ·®—§Ÿ®_A{[ÆĒB˜wŁĀ¬ļ9m»b]n­œĄ:5”BēŖŖƒŽČ™gœ¦s“2ŅD„él @»ø²šÅ•y°.Čd 6©+#*]ŖE„”¶eࢩÕZ¦Ūߖ{ć8vį “žŌD°Ą Ļńx¬”šĻē*l„zÖØ,¤Õ͹TG!Ŗąöõĵ>—üųX¢ckŪ„4•¶č&Mµī^"’"’ī:+:QǶö„Ęk£Ņ÷vņ÷u<¦meDiPŸ*Ųū•÷‹¢h±H”v„¾›Ō&¾ŗ•¦YU®«,n\„7S^?mŗ~×Z¢ a9»–}DTZJ¹=Źk"A•V¼§£Y–Ŗs^–9 kĪń*3diū•²äɁu{F„w·^lɍ‰HB֕Ēl•ų}Ø ȳV¤Yų] ÄøžX[t3l6§~mŚ1“"‹møKu6ęR…Ā—jŽ ŠhŻ—Ź1®>amsfāx€0,'šÅ/~±}ÅŹŹŹźŹˆI¶2‡ ū¦°üx²Ä2OńušrŽŒĆ žö·æ @+ęHaĻśŚå—]ś”}ō柾ģ³~ź2“äO*Æx#^Y[³LHcżŽ÷¼ēÆ’Ļ_ üžY·,gÜżīG޽żĄįŁ\§œt²ĮV éĘf¬õ(Ņć8ādqū·Rƒˆƒ©q„SŌń\’¦µ.ÄWó§`,ؐ3)?K õģņ%…ŗŹuĒ£|„H(éŪ¼ńµ?¢B½|¤‡­=ŸdC‡W­€X^2ĮöÅAa’Ż_“V®­1Xć)ņį–īĖÖuŚB›DBPRtŠÓĘX‚HnĒuÅŠÜ`Išō®s?,½¬x²—ß÷¾öF“$ŁÜ˜ųš‡žŁ…ė$(§āUt1§ąiėć˜B CkdŒ#G7Ę«« ŹXgʙŪ6 o(%ĄīsG#=™ “Ö{wÆ®Ž‡ŸüŌĒėag±Ē*„ƒh8Ō ¢ū<šžÆüŻßNcµŠJÆ­^wūž,6 oY9õōżļĻyĢüšµ·øćŠŃ…‘c›[ÉāČį;”$[œœnl.fńp”žgé4Y Ö&&"‰Ōźžõc[[ó,ͤĮōż¤&h3šÖæ{»Ż·ģž|śiÆ}ķk' 4Oœ¬ķŁ39eļķ ß¾eRb¼ķMo TdĪĮxad¢D‹o3`'f®ćˆˆ†Ć”V1X@ƒQ<¼įš‘I"#1sĒŃBf<Ā®Ż+ RŲ»wo1’YTQSĮwŻ9ļkL§óy*Ij6§ gP%ö(Ō](qKKéńhåt(u5[õ"`[鳃JSː+{~Ć.öną¤rruÉk…ŠV+¢ö@£-‚ó“ī#¶ķĖļev2ót:Ż.œUI“v …5 ŗu”l–å1+JDOzŅ“ĀŹżÓžö“!Ž=‰}¦¾'ڷͲ¬E ŗJʐ¾¤6*Ȳśˆ¢ŹńigZxa~~7>Įž(D7„Ł×/Āī8ßyŪŅ)ēL”M¹” cOi{ ¶–VWAčs³'\,}»oøTuƂļ¬:f“a"šL&õvč*N¢JŃXŪggčXnŖ¼żĒ­Śē™7…ÖÆØrZ(…šĪBßW«yŽ=ϟ'™żMȲŒüćž l‰Š†‹įNė”f²Ø kafEœ—xņ’¬'“„’Z…+ufż]żWé,³"⤃˰ ³d™ńÆ!åÅi £\īµęTDdé¦b¬x¬„ ££¬GĀ!ē9ÕF|Ų]ß›ē<‘ņśēD¤D³¹&µµ¹IA»)Zŗo–ģĻŌō'ոӲܗnŅwuZu–eI’ųę®°Ø×xkaS}Gµ¾øäŻbƒoĖnĶ[©½Į”¦ŁlÅŚ&«¶'–Y*Bk®&Rė©Žm™omDRšLĖ¢#Ż1/ u+U<“‚Eźįu›å’•q˜K…2`GŲrˆ8xÓœą† ¹˜•€b‡I¶Š§—ĖŅ•Š˜¾\:›Af·üśnʋyb²āč;GÖŖ £1Ę ś7÷z"N'Š…YX ¶iß~«ČŁ~čH¹āX^’Č#¢"GŌUöYSäõŹĘŸ®¤Ōpiš&Y&ĄĻæąe2¶|t+#RE›Ćž ļ>fÓ-QĻyĪsl.!Ņ„Ń0ŽŲ8a»ĒP”sœ3ī}łåq'ódEóéÖ|¶øūŻĪB.±!®^yŲl¾łÅ/¦‹l0Įl‘Żćģóžł?~ęmo}ēŹd×­·›ĪÓż6gs³95ßūЇčĆ¢—’Ę«ļqĘé5LęóŃd¬CŚ…šo;pĒĘĘĘĘĘĘ)§œ–e8ŗ5E‹ŽRA<é”zā“Ÿh×Ļc’ų… ecĖžĻŸæNņżŸāĮ{ö³Dz8ĆY:Še—]ūõĻ=ö”—ļčS÷×ö !3šüČįƒ×^sõ„ēŽóŪ_łźO>ėŁŸwĻæžĖæC„ €dČŅa¬‘žO·„%揦}ŅzA‡ƒńh‘™™ †$YJ‚ˆōżī{_äd±Ų-{l®ąC’1©Čī+¹ŻūĀ‚R`¾¢’nBGŁ}:t˜×öO­EZCÄīć ĒĄŻ^ix©dÅ”·¼G¶BĀNŸxUµ]\å­‹ĆĄ_KŽŪÖDŌ÷ļX)7¤O+„&“ÉŖaN… GniĄŅ©×,ƒAÅóʇe|ąŸóœē` ®ł2교6Œ·-ž®•įś\JØīE€ŲŽ]AP%xx$œčV§‡fžjćQæåz X’æģ‘oŒi£K,‹÷¹¢Æ’“%`;Ęr’Cæ‚āHČM݁h¾_ųZėįpøT“¼šUĢĄBo+ē.ׂäTl„Śi%‘ŒŅ+<Ȁ%,’wc^uÕU¾{/ÆfMćįDüd±B÷ “¹^¬°xģĪpm¹łpĪŻ č» R†45ĪńX¹_wĶT*ķČßß”]|E])o̳hÄsÅK‹ HŠ„ńåēRiQixj~W±}ÅZk°¬®¬ŚĮM“åķ„»t]ż)®sÉŅ—®“±b]Ö§u¢žĆ(ІÔ7?!kŖz…R•Ió)b͟ ×ßnÕ’Ē“ŃtkęrøØį֖Ō²bT壊sŌ÷jÖJ Kį‘Ö³±ŚāŃÄŻ ß§pēŹsHÆ]Y*åX\Q©|3‡Ή±2Äd¼ŗµ™ģ[CĢ#ž(“1Ć$)8ƒ“ē_łäQj}}­n䲂ä©ņżI7żq¾žX`Xå¬åUЬxŅ’Ś”¢°Ē¤\U,×éšr™žg“„²5få-Bu÷AŽH>!hjōé6yžnØŖB.ļ£Ż?Š ßĶ×DĆųŅ G}ӛŽ$"Gޱoņ™Ļ|ę’žß’ŪķvϘR#¢ß©—B^m oa£fEx¶,ŽÓ—³±tTŪT”*ÉdO‘€ŽÉ¹ōɶ9µu†U;VćSéń®s/żś–ż§ä½ĒßT\y;?Kw€f—œØóQZš{Ļjaų…Węv‰Im£SoźęA%™åj@żč“Ÿźf)ÉXNŽ·ļ“ŸśĢ×_ėtŪņ÷4F|_1åå k;YĪŁ’»8h°-^”ņ)(„r!.—męїé ‡ M®Ī­iR‘Ņq¬ż 1k‡ŠtqĖģ>×Ņž‹SŽš a~čó„ØųaY\°®YVū§ü$ę ąAżąüĄHŃ<ō”ūÆæ>Ž>īĄ`»Ž³,“rUƒ­{²…KW_L[Ėšøi+¼Ź62ŖÉ¤4 ‘M4ăȒlB5Y#ךö”;s-ķģ‘!×Ć%a˜Ģź²Iš 8wU~Ī×:Š©9K•²F«_Mµņo8’że4„a喖réåĮ„ƒš¼UOØ!Ū„Ńk†„¤5Pq®Īø(R”žš“=õڰ„;ŲŃŗ9h„4¤œĄ£Ėt³QžĆ—¬„oå öa‹ęĪ­ģK@Ńd} @²’ū^r!‰pH‡Pļŗ~Xą /8’ä=»c`Ēgœ“‡3>ó““ACel[R˜ŅYĘ6p¢H vķŚE‘ŠŌ®={‡Ć!Ģr…ąy,ĒŽ²g²oĻīcĒŽķš …bV/|į‹nŗi?³,2ޘ&ßžöµ@œ.ćĮ‚'żą@”°>ųĮ "ß÷żݽo×|‘BéÕ]ėFh:3³Å)gœ±9Ÿ_óm—Žėāc‡÷žt HĆČCņ}X]]µĻįUÆü-°Pžą¢xtŚÉ'“Ī9Ókkgž}`(™zĀžzÖ9PæąW~å†ż·‡£U­W ²L² .øĄŹh„Į”-²µq|čŠ!Å‘Īą•®ä½ųą?ō”{Žū{6GSČxrx:īZ;pō蜏xש'ė᪊4 Å«2$Y·Šöŗ=č DJŪc/,t‚SCˆ¤Ķ…§Ó„|Ig©3H÷Ćܵ±üŚõå:xĖ—ffĆl®Ķń«ĖђP\$¤åŁ”‰¶“łĻ–QwKjS[åūö°wō"v¤p"2ŸłĢgŠČ®]»Ā. €)5ńĻ{ęłasŽæ~/oŅ)wĀŚ]–t¹ŃnÓŗ1©««ä5:W7ŽŪRķ4'3«5ŹR;ÅZŖŽVÉƏœüĮŠ… ūvŚXK•Å»ŒśT=CTĒ ·›-w›½•R‚ąŪ«JTŖ°aß`~Nhč„'?õ) ÄĆ€ˆČsąąA|§†}4ʈGl€Ģe;V+­-]ČG•RFĪ}\…™˜3²4…H’ĢŁ@”&а^2Ś™‡c/½ĪĢ*Ņ ³ŅšX_ā<ń°^!)6yŚėļņĶĆŁ"µ.cJQ¤«Ą• °ĮĻ9' ڹśķo|ćc’˜żŪg>sιēÜ~Ė-±žpčl2j>eBĘ/˜¶{ąuęmĖ< kł•ÄøRŌk,›6JpÕ÷R“čĢ-] zH(ĶpO7(eŒŹÅ5,ĀĘÖ¦”yæa7šĶhŚr”+fćzKɤĄ*ż‘å<ēµU)ZÕ’ōb(²Ę 6ā x›qję‰Ųß2ʄłxse¶ÖÕy½Ø²ž–Ąø}»V‰«ČQ½P/åā{›Tųݦ&ŸVOæsŲŅU©š¢ķ"›%!Μ‘rÕÓ»*ŻŚˆŌV*ą/ƶ4ŅQcĄŠu¾°+†±q")n &ēœ†Č>õ){öģE*€qćõ×_õõÆŚ“ĒdIKlEįäU`åE›Ņ,›Ļc“„ĀÉ=Ļ=sĻś„!l²LGŹöM[Ÿ'mÕ^ÆżķW"µ¹¹™$ÉbĮG޹Ļ}īNabmÅ&øŁw¼åM·Žzóęęt:86]Ü’A‚Ž 4H £Č(2 †cE1 ›‹))’ †ļ\÷] é{ńżŽū^™¢YšĶ3shćčž#ļ÷ąõ»ßż·/~ńē~ńÆūĖ7 '+7לžäO Ųܜ2ƒ€7æłĶ’ōĮęÕCM¤“$ Fš”™MwFŲ8ü'ÆłĶĖ/>’Ćļ’‡ń|·]« [Ģ723hElR_ cc čc’śÉńŽ=4.D6§Éž}' †H44ņčGžķūžaKaƒpĖĘōÖ­ōŚ;7.æļş’ā„4֔Щ©Õ'Ų¦µ*öŚkČŲŲÓŅ› T$śśē) -XĖP„ß¾žŁŸo:X~= ]„<ķ•,p‚(ÉŌ'’ó ’WEĖä;AŸ;©Ü™#¶ŻĖ’$ń컄gvzEŠy[aŻÕČO£ēDGd°³bęÜW=ŹńZ}[§ ·€ äjĆJ9ŠgĢē‹ŃøA:ŲäłO ÜALČ|Č`ä@Ұ/=ØĘęŖĢŸ>„r æbĆ&ŪH¢„ĆŌÄ^s$©Žīi Ōż[VΧ”½ ŠģéŽ;k&Ō¶®+󪮨WĮŠčóØÄ–|uØłŪ–’ŽĒŖcsė¾ėp~6FNĶé}(½Ž–BŸēR_°"¢P4Ķ0³ŅZlQRÕ®YÖÆ/l EB^L6¦3¹žĘöķŪ7Mr=)=‚“Ģ2‰b‚ŖČœĆ“’Ģcu¤ÆŃé:˜™Ei²—ķ~1W!B’dƒAdŒ(U!5 ķŒ ėįäS ›uē3M Ā”žm-‘³V”ˆße©ß0BĻÓiŚŖ’/Ā-’ŗ÷¤£Gś™L6³o_w£®$2’„©ØQSF0=tšW^ōKož«7ŽćąĮ`ÆMnÜčŹo]u·{œ­G±@"Ń~b‚Ļ}ę3’īĶo޳¢Ņ”%ښ8zpue7)%̤U[“+%•x“%³›HĪĒ"rõÕß¾ō¢KNYÖ‡“˜hssó‚{ŻūCŸż¼čŲOį|ń=ł‡~ųŽ’žį@k­§³äĻžōžĒ’üY1‘}š…w;vš0ˆÓ4ÕŽĒćÓ£iš%©ķ9‰(2I¬āŪ$ĮIėėw:d}½ÅŹJöׯ’óüĢóGāX}öŁ_śÖu››GÕdˆĄ©½£ėƽvļŽ½Zėł|nŒ9å“Ó\O¤×öhźģ»Żķ–[o±żĀ¢d±X(ŪՐ¦©ķĬ‡LeeÆk{ƒčŹe$k»KJUbģŹ‘Ō¹µE•6Ļ•,ū¬£īHolj˜źVz}æ¶^ ¢R”gR„*éĆ>‹īöGT+ ÕO¹ėæzV5Ž’SŽæ×±PwŌZ:Ŗć!Ļwŗ—®ŽņŽĀ€0ę’āLĆóžxQŌ­/õīņUē®69®Ae•÷zĖä Ø%4_ Z,ół<ō‡øė&$…®¹ ĀŅŖ[cu¼MFØQķ¹ –ķłĆe{ż‡Ūåƒt3“ĆÉfuMØÓūŗy#ČPZģčķh§&ĢČł»q®„S™Öģ$˜)mX2aĢf3(ą•ÆųĶĮhģĖ»,lkw¶H»eY¦” c=Ļē ‡V,n«œCÆ«sCQ’&ĘH’¤p&¶ nķĖ®‘ ‹ŲäDMņš6®eњīäŻžŹžī쯔tŠXż’<‡”Ā£ŲZq”'‘ķ(«^ŗŚæˆƒÄ‰Ōēžżó6ÄX]+ࢋ.²Ļ‚eۊń•źCˆrwüJ%+ ŠC,y)]j)ė4o¶ĶņęµUć?ŗĮٔ¨«^hBÖKVm®Ŗ›‹$ĮŁ`›ĀűÖZÕȒ8QYXÄFf„6Ńąļ%„ė iæDå·P#lé–(Ļe¤—šć`ÉE韌ņ–œjG‰Ē–kØOjd 7nģ~qčwM¼Ķ*įŁ‰Eŗ­GŗįŚ½Xé<ļÆ‡Åż+žÅ*. ÷X¢xÕļĢ)—ĮŹVŚ….å–iņ*č Ec;Oy𤫨Li@Eqü®÷¼g4™¤F’$»ūi§8ł”“žśĆOųī7æŽdd:f±ķĻB!Õns‘·•²ÅH€žūÓ?³5Ēśīńį£Goŗå¶ż·¹ąÜó’ż_? Š¢Į8Ž ‚éµW~õWķ—_’Wo”XKĒ †tÓĮC*ŽĪ¹ēłƒįŠ B„DB_žņ—Œ†ŃĄŁÓŒGk6‰"]m6a棊±Ļ„Č£Jß’šGB‘#ߎēaæńšŌ 'J©ÅbA Ǝ'£)Ć($b¶€cœZQēw¼ć°ˆ³"ɏÖē<÷§cš¬N¢įąĄ”ƒė«=»Īj„-qåģsĻŪµwߏśīÕõݧœq¦³“Ī•¢ŃCQņĀŽ±ĶM«Äb•äoæżv?£ƒ÷ż©Oõīs”»³O…ō6FY06Pr®xŚ÷ ¼ėєżøŗ–3zń±„-ečpxéŽÖTĻ$°÷ŌIVu9ų6¶ü,ņŃēŃ£G—śhuļƒ;ŽŽ¹Ż–Ļ“ģˆå[Q3ļł·›Ć/į¬igU»D¬äLV‰0(GfÜv,BJłöB 5{TÆÆU#Žš:¾¶)4±“ē§9P&ŠtŖļ™Rj<F£šųÜÖ$o|’ÖgēŚ,ǽźųdų«$±<ϧÖońæ”>y;ĮÆītŗŻu„e¦ŠV¶ZD|‘®{SŖ—rv†]wOÅŗ+{%…p=ÕĘŌĶÉÜn[óÜĆyγŸ#lĘ£”…oˆ&ąŻļ~7Źžg¾¦FDį“ @VŸ?š”„-XčŃhhEI­·Ŗ„Ö±Ģ< “¦į0DZÖEQµO²ĒÜĶm9Ć)„Œ fly+­U™>cMk †-ĮdŒŅņÄø=‘ĖYŁö=%ÄvŖæē=ļ@G·fŠųō§?sću×%I²³Ņg=“ļŽ:Ā˜É–óŻę›ö–°:&Õ6u‡yHOy°6””¤ĆWg°SÉ-¶Į«Ć—fJėš’s÷Ÿį–Õõ8¼ö®ī>ēÜ4yFe”DĪ9'™œ£Įƒ1` 6Ę&Ė&c¢Į&Ūä Ąd0Q$ !PŽ“n:”»«öū”Ŗ««Ć wf„’÷>÷]ŻpNwu…½÷Z{­zĮ˦†Ģlul5®5%ÓY¢¾öqhm¼ĆPKŃĮWaź6=mVœŖ¬ˆøl¦hč,Xå"ÓµÖHŗm†“G|GōdŃéJ! ¤…“²,3…ü²ē!¶­ļ2kN97 ¤,øéjFD;5/ŃĘ5,x5iå^ŁTś)ķ6ÅĶø+œšĄŽøūÉAµĶ< KNfŽ ’„éõ×ķ6F¾pę'·¶)'\zŻ5ˆ‘ >õ„/ßųf·ˆŗsĒ}ÜŁ?8{’u»æņ…Ļ÷zųį¾ļ}GĆ!SģŖ{¢ABr‹ŪŻń·ŗéžżƒQ†łÅŝ;·ōW–rŸūÜć6·łåŁēœÖŁg~ņ“[ēzŠz§ŽäÖļyē{7÷TGtĢŁ¾Œ/Ż;Ų9ßéÆļqłmA-ō"Ęģ¹žZyfj}˜Żįö·’Ōf8PŃŻųĘ7¶3t —_s őżĶcŽ=ś¤“Ž]YÉD¤ßļGQ“ŗŗś¤G?šŁ•ķœQJŁųļļæ6’ę²²6pʁ" 2mš˜G=¾—P”å¤sŅ^ŅI‡£ÕJa”g¹ŃI'IÄšĖžņÆīyŸ{Cq-pų7ZėD¬Ö)ГЀl‰Ž82"”tz°;X긘šlߎ"EēĄ]ļzWL¬v•PcP՚A›Ró|©ÉžO—*65fö›iøObęF˜Ödµ&u¼Ń0o–æ,܌śxĘBX%µSŠJ†Öœ£–'”q±•DQ“eĖ–©ćÕ^’ū?ź“ܐ!ūŒ­SS V"m ©ŚžÕ,|öŹoJylT•<‹ł_1°qQfMį͉¾Äl'PŠóü>rZƳ«P„ņŖķ9kxÓĘ|n7„ś[˜±mcF§ŸšZžų w=N³õ#¬Ø…Ģė“~0šyĶæ=HI’«…aĶbœśZa‡0«"=5Aa™ō¤fœ'€¬T²ƒŻ³4KŸk®§wŲa‡)V.#ļū g£*9Ø"įš–Q!R†QŅ«‚Ź”×Ö*½a%œKĪŹÕ^³MD}+/saŪę V¬&H}Ó’..P©Įū•ÕŁrۚK*åcŒóų…c™m]¦¶¾;§\©X»–HŸcƒ‚“fŒ‡^ų’æBA!Oā®÷øĒ=B¹ƒ!‰`¼‚:11ƈE„­ ՔT¼ęB:āŅLqĀ$LÆYM'ŗńmÓæž%EK”^NU·į‚ōćhÕ³ī’ÓŽtŅ}F)–Å]ÓŠ®ŒJįžķi õl³)żqW䯗ļ–a”<īšJ„”F·7ću»Laõćō°¬ķOCõ$d±żŚæ¤œžĖf‹'4˜Ä k( 69Sžt×Mé‡×)ŗ›:ö«” UżBKÅVgŠ©H—_ ĮŖTqÜŻ±ć0ßõī÷ݵóFZH†9Å1a”GŒ+Ƽā®w¹Óa‡ķ|ąé§‹Æ¹ę ßųęĒ>ü1„!ēÅ:LŁļĝ$z½d’žÕ}ūö­¬¶¾ć‡ēžsó;ŻįęwŗĆ3žńx ·+}l/Žak§7׋fē†š¦w¾j޵eAclŸ‚-7œž‡īß»7F£t4Ź4p‹[ÜĀŽłŲœ„ )@ä1yŒ4D„™`uuÕõĒW¾ņ•“֝^×@HįkßųŖHjU'Ŗ Ā·æūmL0ĄI§žR89ƒææāŖ•‘ˆŠrŠŖčėG镫ƒfӎł¾†r`9Oßņ®ķ§£3ŽōF(¶+Ė—Ču"ßņ¶·Sīõū—_½ļĮlõ®Aži@d…$š-WDTE&‚˜²¼¼,Ö‹˜KKK–†%µ"é,šA­RĢ• ܚ°ŁļŒļŗ—f]~šģN3_mEfŁĘ„Z5ĀĖģ™O…Œj½»!cĊ‹Ž‹n)Œž‚0nv ŸŠ$6ü/iš–įµ¬rж8š0’jć %ģėX„Śm@¾Š"Īs­ ­Ėļņq©*ą—Bė•+™­L‹ņbE儚Aqw*TxC "1ʧk‡_HłĀĮD½ćÉž ³¼Ī8Ė®š8öėjŽē£¾L%äŒó›Z°x¾­Ż4 ³g­“n³éٰFw\…ŅÜĪĢӔĘ;VV³›Źda×^éCRč,'ĮÆ?ćf7¹i8Œˆs)ä, Q“¾ŚÆŲ¹…§c0€Nćє ³…e,JD;qČĀ$)ĀuY±½•8Vh“ŽŪVC§"¦Ę3©)×€ jS¢DšŒ" ӑ.ā\[S(Z”Ż%ŁvĒv3å„/œäkÄiŖJ»®¹¢ĆŖŪķB†––(F8dĀĶnv3K“<˜3bv¹ßļŪG9 f/½…Ł—ōZæßŗWŒ£?”Zt³ģ!ÓģĮĒļcĪE–yģį}zkĆŲīÆS—L-kEBš}ՖÉ+ĄKYS&n0hB¼¢‘KŪlÓu0H©ŹīƒQę«$ )X8”õ]”Ų ĻәXīw¬iŚt!Źr)¬ƒ« m£›d+ךaƒĢĢŲ%O *KcLSŽPXVhdÅör¹X5E;XżČ7U!+v–;0YČęöŠUđå*Øv8šIŲ~¦±R`uö¹ē=ō÷Ū¹iŃśŚD„į AQJHÅ*V†hóŅ¢Š#£u!›ļ T;˜oxÓ?/Ģ÷ö®§QDd°ŠQ{Æ»jK[»yfd¢U Óf©DŃīõµk†ęŹu³y!zõ?üõ£÷h°›0DnŻūFßśś×æś„3IK+uć¤GEüS1·ųR²‘hmmĶ–i4qxēa»\„OōČǐMQ·Üõ6·¹ł)'ėįš9Ļ~Ē‘¬÷2ŪaŒTd/x÷ī½{V9OžÓ§Į7Ś‡gŒmŸ©gÅR.Ģ7y"züŸąØbŒĮe—]V£ ŁiÓj6a· §k‰;mĄ@ˆ„Ų}ĀRĒaÄŹE£FMŻM@wCĶˆ*g–&ū7X!—Ś0³7ŚõCéSÜP§Ž—Õ=DŒ*3ö‡S)(’|LčŲŁP.tšą™ź:ĻŽ“T²Ņ’dJ)Dn}}^āµVٲ”XŹ3ø(Sū,'L:åłŅDēŒCčµćVģūa&ōāŽsf;ČŌq£PIēvģF®÷Š”e:Ą“ތƒ\/ĶZūŒė}ʂbķõ}ėŚ8C¬Æhē}Č«œĄ7™švµrla‹ŹÄŒĄ›Ŗ|Źa˜^,L«œō¬g= @*@܉S|ž gĀ"ó >/ jCØ<‰ ÷QOõ¾Ö;”ˆX©Ā‚Ī·ĻŽFį~ŗŽyģĖqƒTC-ż)Tń0 B |PlŒ¹č¢‹ģd·ü‹^ō"߈jmh=o·ÖŽŪTŪE›Å@hoYĆĄliŪ’¦=9Ō‰T£Ö¶»©GƒĻ[SĀY^g‚‰ģDژ 8=N¾Lg¹‹®HØ­G}ļ““UkWė*'/ļ1{wnSØć’ŠGŻÜ=oø7:€·£Ļ†<×¶ *(>Õ[K4HK-š£ālóŠÓÕBVåUéŖĖŅcDc×L» ±™! ÅQyŹĀ8€É3ĖćhŹ}ūõ’¤pS¹ĶJ^,悔ꄎ“ņ³:‡˜Ø(xSwCĄž„ŽŹÉ®z5%öšĘ'ė4nÅk ,R)B†ĀæćtnˆhlÅ'Ųcm„Ęj6Ä­–5āöjąv·¾åĻ~~®bhƒ-›Ÿóœē¼śõgŲ‹ t#­ Ŗ[·b ˜ĖĖ1.ń±w<²ŠVQģN„Õ••Å…%ˆµ×D–ęqŁ€Rk£"ցP­3ŅJ) QŠAAPx…bQvł}©FČ-ą#CžĒ<‘s%Ųæoyó–MīR]ų[‘˜vļīs—ą_¾Ł~jk¹,Qą;ßł?łŃY’˜óÜA:źSƒ¢.“š‚ōŒYtmž·OnæõZǦ˜TÜ2Š-]ZrÆŚ×ŲXĻpåLbĀDéŃ©ü‘©šØ”4IksZy‹DMåm1e’yūR„ńE‡ń?²šŅ} ßEP>7Ę) EŹ6g"˲¤WŽGŖi“6%–"%†QŒć!ė’Rį.†ĒŽ‘Uœn7ŹóZ/un՞mzaÄé0‡¦äæŖŻŽ­ęC³ µŖ”¹öthR“*§-ÓĆPž{‚£œø­ŗ•¦2vĀWJgķ³Ś²–B¶§»¤,żŻo~sśĆNæš·æ7ĄqĒŽčņĖÆČ5råžń{ßóŽg<õé Ņ0žÄ+y¢k“)„žó£zŹŸ¶e©Óƒź³¼6\)R,yqnŠ™_ܳ¾¦>źČ]ææür«\Ēv'wŃŁŹxD‚k/½ōÄćķFčõ:kėłHėÅ­ ×ģŁ tĘ£ö­ :=óĻų’xæ Y÷ŌD”Öē6%„¹¹Ī®ĆūŃŁēĢmZ¢Š„rńN}ŗ\$œeYǐėÅNÄ Ng~aéŖk®7Ą?žńŖżÕ‹Iu4˜ˆX4D@1m÷zz…żäĢO›ćD!śn×°oŸsĪ9·¹Ķm|b/‚7½ńĶ/|ы@팔Śnę¤ć«a^óOü<cžp3öŖņ&·7AÕ?¤ŠF’  Äo<5{®mŖµ°ź…ČŠ²æ'~°EŠ>äŁó„PB£é“žfMc¶ŃC‚ LÆf%,7¦PŻ,6ŒF£Ęß:MFҧ­Ā$mĆZ‹ÖRŁåÖ””{wŸmN¦Vc*<4™&:MaŅÅżjN0“āÄ!雯ōź80GĘÆšZ;CMé­vƒöt9TĆėwƒVØvĘBūd­Ś£ óa/>dŠfؽ”źI=ib¶­m&ćn!,čϬ ^(D“$ą ׊U6ĄO~vĪ0Ī/-Üś¶·¼~ļžWæīµž|>\ŁŹóŅņŌßՕ8_K¬­­i+*!2?? Ļ2ÉLécÜ$ŠIÜ ¹ŹŗŠ#IĆQh®Ü.„€ Ŗ•Z%ēœv4ƒŪ3Ÿ_…įuAhr®°‹‹‹é(‹“€Étż™6fkŽĶž'ŽC•‰}!æ£Hr³uÓkkk&M`½äö j޵²Kčg‡“dʬøVŒq,(W”m&e0@eßv‰W6ÅG zŸŖ ‰†cļ—’Ņ §7%£jBӓų8…©Ę—ŪŖ}C9€2ÉŁĮr²l=ÅgäL¹E Ā]ÜņšāXE‘3ę!B҉ŃHb‰&>¾rĶóu2ye ŹŻ>Ę܆~·•8Zψ‚Śź fG/T²Ė ŠPM“¬°w&Ūģ–*“6ååCŖ7ģĢāCl}R,6 „Ūy8.ć9ś“•ÕƅęĆ"¢a“÷Žłų›žzž…®ģßūńp¾;—k,.ō:Ƕėę'éD†ÄŹÅ€”r[U<ŹņĒ<įńżĻw:½«WśކW3ÖHöK¾ŲĖ>c®Y]6Fæń güžŠĖÉ)Ņ̚ QŁ©nĻwż„]GŊ‡“Ö¹Asāńv»¢Ęvm’׎£å%üšG< 5v@k)Jzs—_qéžų„yėŪĪłŁysKKvŹT!JYŸ’‚D!ŚÄQģžƒBoūęU½k£k®¹žéO~Ņś¾=/ž«—'•¢®4ŒP½Zö¾k`°£ĄT¼žßLżžį‹ÜśÖ·ŽHčõz5ĀK“ÓZ÷ūż žĶŖb(ĶāgZŪ&ĒrbEĢlŒ44-ÅcÜŪa*ÜAʓ3¶īOz…p)޳«śCŚMšq 鵄rZ³>{`²ą’ß_ŗøøų™Ļ|ęa;żÜsϽ÷}ī㠐®­É)ż!C$ŁšŽzB±rl©˜ø^éo@É0 [½ k3Ŗµķm4W vX€¢ÄH#œ"nń±D™ŲS¾XÅYaæœiĘ[6’h¦ĮžÖņ<·$½V¤"44ž½Ęf·ž¢ĪŠŁÓČZIXAœkšŗHoP6ÄĘŖƒėÓ ]¾j“˜(ŠfYmnL@u6)™Év9Ō‘ĀO•©}޲Ķ"øt2%D©Ģ6)°?z6Ś×Ōy> ęęę¬tĒ8$E°›e¹RŖ¶FŹYZ—dvc˜¦iÆ×!KóXEž”ˆ”²€ķLƒKމXŲ9Ļ4€(RY–GQdńēZŚ)//m"Õh÷æŹe’6@)µƒĖ¶ķš6Ņ-M_ ŲŖĢ|üœį1,bi6tŸżĢgžšGFV ¤łŹϼ÷€H’„1™aįĶ’œ9Ć®Y75÷m»­µf¢NīĒ$Ļ“ćUņź5³Ķ³4“Hē…cmu«-Ų<×J)’Šō—‡=HŲ44+¹Ęˆ»9¦öh'ČĮ*†Ą;Ih€Øtķ½šbѕ ^Ēŗg‡(<8 ŲĒŚØ°‚Ü›$—W¬¬¬--Ģ· ex¾Wįż,sķÖ*␣Q9Ȥ“ó% ·CÆžŌ6Ę© žķå‹:,Ī ļ2ķꉔ+·n} iqööhcX)÷×FˆĀÄ[++ENĮōku¢.Ńį²Ö<¶˜PÓĆŅķøXTk¦©O–ZsņŪĻ=ļÜk/żķ 'œšģg?ū»’ūÓĒ>īĆavæūŻļĻ~vaµ‡ņōqøhóhtĒĄŻīv·~’‡Ć¼ä%/zż?żÓLÓ ūµÆ}ķŹņž<ą÷»ßż@¶ŸŪ°ŠŪČń4 Ū“m.‚ڳgĻāābĒ>…žƒå5 ŲÜévćO¼ųāß{®Ē÷æ÷ż;ŽńŽn#Ųū‚¶¼ēT¶yĶ2тŗJ‰›)hĖ7T4åfkvŽ˜ę”UG9*¾ąć©¤¾ ėSJ©³ö¬¹=Į˜R_ØŠQŠĘ=žH{ÅZ» ×pņ±¾Sć·ŌĀŻ™ß–ˆhuuunnnj^=ŽQ|ÕæéYŌ–g¶†¤Eś®šÉ"Feéb¶±…ƒr4Stj;ᄚ`ĖXBÄyēwÅe—?čĮv¼čF‰Źżė؉®v"S„Żõ§P +±Ó)}"äy®µŽć˜™ɶ–‡ ščņjMĶ[*#ŖüOu%pŽ'öūVX)˜ŠšŠDč‘.R1¦¦ŲAD>„’|F£¬Ó‰Ė»kä:7kkk›6/y²„‡†F£4I’ŗ³Œ£Ł·wļ®ķ; PĢrc2­‘ē°¦ī7ĄŅh-cM-ŗ5+•¶öļ%jß« (nJŲZ3ټ„bMÖX‹©s—±Xęü„ćČWjäp™šÜf Ä3[RŸČј%/ÕGÜŖ¼]å…ų$ͧÄ-ļN”øLóʦõļāš],7ˆZ»yku†„% ŖU†Š`æ‡/K-Qo™‹„K Y2žšĖš—)(£Ypyµé\Oh]̤£,ŽćÓę )¤zӍǵ6‘ā¶ņ‘|Ė[޲yiĢćRāŚ* ö%+éÆÄ+Uj7™ņLĘftnåyn÷“āJž@˜ßŒ ]qUʂŅoūŪ’ņ/_č'’ƒų /žy¦ż‘P;`V(6ž ”M{ļØsÕ«²bo\nRToõr[¦FŲģyřaéÄŅž[aģŽl±k »›0fėš9HŲł†ˆ¤yž/nq‹[16ĻūŽ÷¾§=ķiB‰ū‘Łčż†… /‹:õE‚§ąØƒSßvBÅhęPÕŃmk§ifŃ®ófR÷ęX”x\ś®ĘcT'i–Ų8} ä/5ђqÕ$.Ö^Į3,§ō kIµFøēgĶW¦)å’’ß“Ė1D”eŚīÅ̜eYˆƒµG46ųk™ē2C\ÕL}›õ"Y–u»]øīB|åĖ_¹ļżī'\am•ū‚Ų—*5cæÕ³"ā»-ˆĪ“iŌƒĪzW”æ/-Pdūżœ7[Ä~“6īäs5p*‘½灓sa·[†E]¹äė€1`ƒ¦ų­µbe“°"›°•Wjkå}·6{s]툭ķµķ Š£†#‰"įvāXkż®w½ė©ĻxnśUHT ·¬ŁOį–e‹ S挜hTS5­ 3“jI]–żf™ĆóƦÓVMc÷k‘•LDbŃČK„†:ŹųĀėAĒ¢æ×ø•^)MO‰Ē=;ąvS2JQÕ/¢,gīüŖ®G™‚·œą¾%³%ū”XD[G·é)146 ģš5ŚõW»;U˜2÷ąuĖ !ÅćTWJ°j2°_»‹€NR2#0ŽER¦ÄSāŲJÜdjL†—ģWŖA¢UłZ +eūHkģ” ¦ ¦RCmßŪC×ī+ŚmķĘ9Į-ģ€Ļżp0 8’ĆdÅņ<¢…}‰1`b«k}ÅåWqä‘bĢøł|h/ÆÉ&>0]+crK’.Ēæōt«r¶›éšdjAcŒ"ÜŌ>½ÖŠÜ/4¹fc%»,&y^YO]ū9ķÕ&|œvӛܿž÷øńOÉpæ;¶”heyśÓŸī_v­]_zķÄXraµO)ås³ 3øź'Ģ,{øŃ~ęĘńV•˜¬·śPX!oén½ņ—Ē4įniö=‰˜I)Ž¢ Ó²ģ·Üˆxó”“^pĶYg‚±PEI’x|8lö«uóN~.eß×F b"Q–e!lސŗYVŪśļc‚x±/•ż–ÓµHćīś+ėqRč#ńā‚!K©9Ęä˜ķŪ;Ą÷æóM°!"qžƒPˆ?•o8™Ćz ę°@[oxö{‘žmp%)1ʔ'¶Ķ6*óį(V*ā,̓ōÅ“ą'āSQŠ™y4åŽĆI*V‘÷×) Ų… O–e”/Ž|ß½†"ėö™³ė%6Ø9÷xėõ$IźÉ°sʀŃb“mžmķ†eƒč>÷¹Li–åĘ|ö³Ÿ=˜S|ĘÅ5YĀ3Pu&l/“°ŗäÅō śrØ|p½/Ą¶Å—N³µYQ|ŸJ”)I³>¬’:“8»żÉĢ¢ņu±!‚×K_ƒg¼$ŸYž‘͇KFŲų¼|ÓAĖnvG”ļ¶YmŚcA”Ķ»lN˜c5’-+ö×nįhBUR޶¶śWcźåKtwv”cMŪEZß8·kU†g\->Tu0Øł;“,Pq=½3µ„ø³ ÷fŃM-÷1Ben…żY(Ԍa blmĘ]×dŻ"¬bq†`ŹŚM=…żßD1ĒvϤºµbŽvē¾/ųRķpü? B¦~DQbMEäżļ?#ʦŽ—^z)R³Dų³a3x¶įPÓ6i\ęŲrdŪąD“1ÅRĖÅXMˆ}{÷Śsƒ@0 ྆{SM†Ū³ŖZ”¶Z„ŖõéŽSO­ż¦Öŗn¶b,Ó琩Sy[©&³£³>ŁxŽóž÷īwæĒ¾Ō)§œrĮl“źpš“IšĶ”˜$(·ÓIJ^0}'ėśLywS©•Vø[ĘĪ Ā”„Ø©JŠ"NMÉų€”F¦§DµŖZ»…’Ųķ!źłź5Yø1JfŌśż¦øė8™ÓVå ×£=cżĻŪ®NŸ éÉE±ƒļų~„))7ėń*$‡#<:NåE¤…#mL€-4`TtŻA‰”ł“sīvū;tĄE W.ļ]Üŗé‹g~é6·½£ člלŸ„ʇ»Q{e×c>„ĪmĮé”·‚SŠl?p×é¼ 2 éé¢į“‚Ū“¬…bvų Ķtn“Ö”v®}#ŪK⠄Ԕĸ¶į’€­j’qś“Y–u:‰ķqbG8×Z,”βqÅŪŽ„]‚@:Ź’$n²p}ßr[ōl¾rę™yČCQ҉Ć,Rdن§g©D·īKZkqL;ļą„åk"üķć, £Å«łˆŸ`”“}E*DųI¦u"„É„ŠŁ^@„ÓQbi;ļĘ) šiRxDÖu\xŅiR$ŽÜ@y„rnŁF KwrĘ쐇Ł^ȝę–7*ö¤y–•6~<†} µė.OBšśśzæßßµkWØI& ½·Zēæe|¤©ķr ö~–enb­zj•ń":&Ņ Z£Žj½¬¢CŽč>€ 1 ˜˜Õ5µónāeŒė%®?g9.[¹ė–Ķd‘üęfÉg©ayåä 膌SL{„ H@”„é=īq’č'Dōµo|ż^÷ŗ×,QV-Ā?ČØģ8ŒXM£™9ÜbŪÜDJõG)˜ÖMœāŃŌÜaxÜįŚj2KŽ:£llØpXƒĖf $,“Vaŗ •”<ąf1{yo{ŪŪü ®®®†å–&¶9īņšŠ š|>%›ś $ ŁšM󣞈•õ_—5pkJ$Ęˆ©-$X¶¶(PCź³€ MŅ[‹[­÷2„šÅDZµŚöN­“ŪJ[ 5,®D±Śīŗ9­’”Čpėܛ0?-}Ō×G'ŒĻŒ“gž’‰|ŲÖ¶ƒĻŠéāø“lĀĢ©yq•’ź *Ę[M†7Eµže3 й„JIóŗ+pIhäq2©÷¾p/ÅYŌ©!Żd`ć •ķiĘm™Ę›1{Uvfī÷ūEnŪžįĶ~Y©ŠÕüi¶Õ”k”ØšœCgPbkaŖ"ķāsŖÅÅÅķŪ·‡¹ØĪMólüXĖ9•Rn‹`k0ī\āk¬ŗ~iLŽ+m³« ŗW­+[_°†';Óõ‰.å5顎×Vn¦æó<óĻ @0ÉA×GŖįMŁ#frā³\ ˆK.n¦^‡$œ jmĢžæĮ„K;±ńÅģ€÷8ī~ļšÅ/ł‘}ō^÷ŗWFj}Ź­ʃÉ[9G³+Eg0š ƒŁŪלŚßż~soŽā­½žhż¤Ē<0)įCÖK<5ˆ-Z{R=̦XLĖ–[ƒfO-¶ś8¾M˜™·g˜Mkųb‹q»Ģxēžšu8™ėH}““W`V9ŠUIō’łźØß/§°Ē*|EŪµEŹNe^åĘ%€RlóL›jś6<ƒąū}¼hŒ0³q»ŻŽ Fķ‰NDÖÖŽ²$¬€PŽ8Ū» g{_{jVH™Łz“–NKlż]%lU(n?Šd¢JąkwNbw…Q¬˜I ’NlA§<×įs)%s„ķ,*Ż”)Iū+ H¢ų­oł—ƒĮf'UµÖ£'HNŻĶfįJLŌ*ĒqA‚śī$‚Ÿ˜S_]͈ŪVTJ±«°øVójMyO"Ģ“]“B {lkg•(ŽĆ<9„ņl…+T'Gõ“'P…ņe æl)l¾÷¹{­ŗžš·hMĻrŅMĀéĀ9Vq[‡§&Z¢ 8Æę °LŒ(V¬ˆˆ|_ņÜi"x‹H„) EjņͧLŌ@_Zs`Ŗz°5‘9š#¬ÆŚh:LŒ dˆh›‡zāXż™12mS*.Ņ0ĆčlBøźÉD­héŅwØ}Ćø4”ž3ĆBR\:,2{o…Z°=9ą?ȋńdŸÉ·<‰yŖ”„m† €Q$l®Ü»'',ÆÆj@I¬^ņ‚æ|ģC } ×9YĖ ©§Äć8Q!oĶQbĶXÄõ@ 6Üśīµ+®=ņÖ„ŹŚ$ZÜŅ‚“– K09ÜŲ,A£ĮFČ6Uk)æxķk^åÆlŪ¶m”µćxów^t§ŪŻ>fNXżĶĖžŚś™Ūšķh0,D Ģ G ØNŻˆ‚;%؈“NĢÜ®»Š¬-5ÖkĄćŗ-kĄHYų7āÖ6Š{Ď䌣ƒ’ØC0DĀ0®“>„‚Ŗåńµr ‚ļPhƒīæE‘5ė›±ļ¢9†Ļōp\Ī\sÉbęB’šżłīk‹ŻŁQč,wCZ¼‘›šŁ)šM”ZėĮ`pHvłK Sė/ČŌ8¾¶3Œ[§Õm§%ņ”ž¶æ ‘Pø+ ”€ŁK¤€*”Š ”7MÓJ8źŚ÷4Ø eųf.†kšé|Hd0§YūŅAž( 9’ēē‚ ™2FĪd,8d¬؁S-v!¦,Ļ,ĮarœU؈µÖĢDFz®ÖBDQg™ÖF Z-y®ĖÄRķŹs$Q”ÄqāŚv$dr1¹Ą€„ķĪ ž){ =¦Zņ „ŖHrĄBŹ„£>Īó܉vxPŃw ŪQ5ĪÓŁźŲäFļūjF XTĢBģŸ”d:’Üä 20‚\K.l™ÓBöi¾ź•ļ6iVĖ£ō‚ßż~łśė-ąUNŚ`¬ĢvD‚l0L—×®ŗųdF²¼”–ō£.€†¤†@&×į4öAU]ĖĆÅóäłĶ“®H¤ƒZR®!p;½vÆ¢3c_-7å¶o^bvÓø`§Ū/Ó%*Ķ·źIoų¼ PLĪĖ×6=Ųć/f°e-y¾„¤ 2”xp KƒÜÕT¹|įčØąeK>TqUY*‰#Ē;Ø$pAvN@•ķ«8La„Į0`āl”;ž‚@-^ĘR„“. Æ`R¤Dò¹Šķ‰Ø,BVøĪõéŁu*ĘJczW‡āłš²0g? » x—ÄK'‘ „7„¾[–%S~Ÿ„”§ŚÉ }ĀžuRXį–΁µF¤Ų½ ä€ŒWj!W‹ V¤H‚R"Ęh]¢ˆŌØPąPRDÄŻk–g•vrM~é•i†bGµ£éĒwˆ n4Ų¶ŻČż“©Āš\kó§dŃchš‡)•*Ól%»&\å¤Ō˜)SŪø6““¢zć\rĘUĄgj]¬bŠįŸ“āC¾(\óMœPś ‡%<žj¬õq“Üqqéģ,Ś–ŒŻ­V¬­¬š\Ū5dœ5āŖRšŅ‘\ n{³›ĮŚ(Ļa¦W ś ’sхĆhˆń×6e®¶^³)é/“_k Ė]YgSŠŠRV¼a>&PC›ĻŲ0,MqŹÜ­V›“$ ›Å;ÅVWV®øāJ’»{ŲĆBӚ !ūŻļ~÷Ÿžō§А7¼įMYšś›ĮD鳓u§TŹŲÓp†¦“哇›W{ķ?Ģ'š&‡5ī½”A )ŲlĀ !Å2ĀZ;'įāV$VŖĶfĶ©ŁŠ‚0ŒA«Ć"“e–› 1Zų’cP³<B$J)«)4µgøµ’|\»²RŖÓé@Š;“Ÿ±P7®ž2# ”yxXčŅ2nPĒć:Om(Pːy‰ ņĒ”E„\oŖ1Z’;µē¶<åyn3±t0TĆ$DIeiĪĄ‡?ōb4C¹xŗj`葁8ŽżDʲŒ™<ĮÄF™qY>1–I‹ģŃ„ķļåŌ«Ź0t‘«Ć` TŁ™0•q-繁 Ė“- ٚZ…ņ=4A’žšRŹ”Ęu܆ LŅĆtĶP£µ9¾²§©ūײŖ?į¦xĶ5×~OFA”˜o~óŪ‹6¢My_ÅN舎.(DģųsĢ1GŸpÜ1'&‹ ÖW¢ŻEēYĘU…pWJk„AvRęYF…œ‡ŒĘµ¢JåYYęs.Š™1&båŅ]¦ GÖ$ÖVVa<]‚źm‹d4µėžKŌŗE4‚ Į‰0µ.[AK Ōd„,ź§Ś”m‘%¦²ŚeŃĪŹ„–jŚ.'ģt:Ī<7(†Rģ̐ŪpNŪż©³NˆEŖĘI±+±<|lŚożŒˆ©WĀy^wV¢ ±–껄{µpQVٲ,sźńAŚāA!Õ²BÖįä`ņė±”r BLf;ųš‡·5*²DÆīżŗĆ6±€Wiµx鄎Ӄolį¹”ōYeØtCgĶ-}FttB˜į»-“¢²µpö1—Ŗx—ÉńüĮ-z…ŗ1¤“W&e"®Å‰ēēē- É|+ē"Ė5\;’fōŻīrׄlu&G¤Č䌥œz“S—÷ģõ59cŠéÄh4M`ƒ·ģµZ³fKт-©Ńƒ1ւåą9­zČĶi½1>ņŪÆ€ 6LZ )N³Ō‚$ÄdƧ’üĻūŪ“AŅ„ĶåźkÆÕÅŹ‡vXžēŽK©ÖĻyc#R{eŅES²ėVֱǔR!z9ė#nJ%U†fĆģ? cśÆ&R#īiQ‚™Ę"Fh/Ń£čv’|ä#Č3Q@ VāŽ€±@n)‡WŃ6FŗŻŽUpÖŚ„ń6™Ń’§™g!zc‹HAŲ©źŁ›z6ę ć±p…%Z”R.‡'‹Ŗ*b¶¹qžf6C&Pm&ų¾¦f’lĒm4imPÓæ)S­óH9AD Ž€Äu¾ˆTl)įö·æżBÆ;ßķF¬zQÄĄ­ov‹ĮźŖmä Ä \ó˜qyaNEōĮ}_»ūś½{÷0p‡ŪŽś _ųœ7Œ­'B *Žģ©ķKŗ6^—Ó-¢E4`¢(6ŗŽdŽg}u¢$6š$ģ_Ž ®Yū²%3„Y±27%‘Æpć0ĘA‹¬4t¹+[V-d'nG4¶RąŽĀĻ !%3łYų,lĖC§Ó‰ć41*°ū'h՞m@$tI°ŪœÖ"Śķ›Mł½©‘Cxc„K/æĢÖakRšvÕ¬ÆÆŪ"fQq«~8“iO‹ÜŚ”sĻā&Łäś˜±Ī>#zTĆ?m?ĀdÖä QM©”łj”›Ń,–“Fć€/•ćĆ֍U “ś5xd%Šf©SÅŹī`diĀūžćß!&z ubˆ‚tćOyŹS‚ø7ØęO‘s™’U5SžŅsaʇZ­¦ÓäDėŠĒEäĶ»GPu³F"’$ €+ƼRk‡\^üŪßNžcqq‘@ŚXį"<źQŠāŲ¶’s¤¦ęx­kęĒJĘndH)¾K0ŌōņŻæ-s«Ł‰$ā}żŃΘ0® zöĀÖ§ Ŗwn¼b:AguĘże\ę6{Æ]0›e\Ū%…Óc2*Žū8OėҘeŹM°a«üµŻgö^”©O$l(µśa5ˆļ÷I––ѽgCt‡J‘ ķ~Ņ =©‰ĀÓ@ĄĪ6˜ó,[]Łæ4×ė%ÉB·+Z" ĖŅžpō…Ļ}‘ĮD1`£uŠ’i! –{…ŒĶl­n³Ėf]ŠOJ)$3%„6šG&åÕ9“C&ŖčY8ŚąZ Mži 1Ź ,Ķunˆ™YÅqB¤,ÜS+Q…zxhˆPXB„M·jiŸ-tFQäŃB,“ēvu>³ćŃR}5ʘ,»Õ­nµ6ö‡Ćn!ĻųĶÆŻ››G®Įe*Ż€ É‚³~šć§?ķ©é%±„…žóóŸ[‹2m®į©DF ÅłĪRqtMR EĀ$œē:MSƝ«³¼IĢkŽ>1}ęg?óØG<YjßHŠŪ¼ŠŃt¤ Ė4sT“‹Ā~­sć %Åzi?Ć“®Ó$ Ō5«c•Ķ'¤ųz’¦PpQߑ£6+3F“6“¶ó¢ē¶~]*Mx­‚zł.SŹśY_¤ˆ• .2|U®©C&Ņ"—GPĄQožŌ|VdĻTó)Ta›sKa‚Z®YЇX€ź€ķ•-)ši½Œ“Öné•ń¢B9}*<äƒu­µŃUÆūssshÜr)„œö„…“CÜCķ^’€[S“öY"ᦓŠ, Bķ›­BĶJ)Ū»f°ćb³©Śj/{ÄŲ:]×i×ć*-佖ė/ų“€!’|”öūƒbļŲ†ŖŹLó Ÿ_ÕĂį`„N>łäł…''ąļcE;5ćĘ iLņ9ø;°×lZ:·‚Ņ3‚u3^ÉĮ˜Ąƒ ĀY$,« ~:j(›*:s}’Ŗš ¢4^X§°"O’""fē™&X©“ “JāÅł¹(곞ZX˜Ļ ¬ØÄä:Ļvlß cl =¹x4µ±“Fph޹ˆLļ.Ø< ©ē”QWŠsWńš%ž_“™­œŅ,!{YÉ.ø.~hŽ?žx{sśŠ‡])±h›Š>žÖ·żėłæųÅ÷ųƒ§<õ©ßųę7QšgšGČTYąÖŽøIÓŚdÅИ/j®ŲVŌÓ:·+¦ˆ>…‚ž±“(ĮŌ¬³‘›m“U¹)^b³Ō7j"ßś‹õ'ŽŖšŽØDNU®±ĘdéR|iĶĆǵ©7ƒŃ )īŒ%šÖ§l£šp]’“flU%Š­mÖ”j&=̜ē&MswuRˆį%‰ČX¶ ®žBE7æłĶvķÜ>æŠU‰“‚•P '=ń‰Čä¹ÖbŃ\ėi$RRCķĪd%ń£(b¦įpȊ<óŠŚ™Øˆ­ČV–e† Ü4ÄöĮ¦Äė¤IדµĖ*†.FR¹ÜIELD”ĆS§“D‘ :ŻmŅŲjŹŚśŲž±<×ynŒQ]9Ó5sk@÷xÜ4kŹ ĢkŠŒŽ 4 łė_©˜5`t¶¼ļźźņhu٤C@[‡ĄØ%ŗĆč8IžóĢgĄ˜‹T¢h”›ōūżśj ĘÖ÷­ˆ1L®žŪIb›ßŚ Ū¬=:KVÄ Y½_§k*ŗ^ 7Ę I–æó_ŽJĄÖM‹üĖ›Žq²Ø6lpQ.ü®Œ+—µ>h-Z l‹¶M ”I)ōɲdó\³rĄ¢¦¾ VϲAµē‘1Ņ.’Ž0÷-éĮ&Čߊ÷š“l§€mOĄ“Ą@ēʏŖļņs÷rIĆźJZźxry©Ņ~‘¦»–Šę)V¶cT ŠŖ Ąõ÷”ŠŸ°ĒŲkąłōŖDjM®’‚Š–ĀŁ„ÖVˆ*z~męÉć>“ŃÖwŹ„% "b6ډb"°øÆ•qg6tD6»mC@l\ŁzźĪ6į-š‘Ձ!^“£¬V/Üqļqæéoe£”ęć8ų45“g?äTó0åŖo‚qpÅō÷-ĶĻŁ„^āX¹r”ŃŚq1ādūĪ]»—<·øpü ‡2 ŪėˆŃŠč&§žęŽ$«Ÿo4…,ŚĄM›M^«²÷ŃŲUZCkĪ”ŸÓ,Źį»ū }³óvņŠŲ/ā8-Ć!ūÉO~āßłÄO¼ģ²Ė ²¼’5W_M­¢ym§Ÿ~ś)§œr‡;Üįżļ’)§œ‚łyF*ōTå½ĘĮV?sšŚ |é ķ5…ĆZÄ)ć†Ā øŅ9#^Qc¼Gy9٦ß}õż[}'TąBĆĆZ7Ü5ģ±ŅZüņŪ\Ó&aL½-ÄĶmĘn­SĖ1Ēh N¶D®h“m?$ÖćŌ ø‹ŖOÕä­ĄŽž=ĢˆČ®ėŚ¶°ŃÓeņ÷ėßi³čØw”RQÄI)E5 øŠ.H¶ĘE1ŖĀJW@Ž’”ķ¹n÷\·)XDJg&&Ģu;ņ¼g=“˜M:*ꏱ",.ĄH7ĪŻn@§Óѹ!n"ZkV”$‰RŠ‹!8y’4M5pӛŽd„?°ˆT”é0“q6 £”IGÆžŪæżŃ·æmy ”Ž”ƒڲĶbŒĶ£ČāžŽl&NhZłšG\vŁe 0£ls·{Ęk_c,Ų^Ta(Š"‹č:ż¶ā‰KibdĻtä¹6ń‚p2=2qo…Ŗ°uHÓt²ļk‹•4Ŗ 3Ō4Ėņn.Ž(\3FUĢ­”JoS÷ Q¹Ž\\toFŲܵ¼ŠN„ėŌZ|}¹ŃĻå++h3’éwķ»ĘŃI”‚Ÿ·‚źµw)kö˜A$ŠY —ęŅ^œiLQ’ŚҊ-½“±ū²)YßT…¼Ķƒl2«e£pn-ņ #Ŗņŗ±‘„0ńŪ¬Öz8ś3·żoĒ(Ļłī«Wģ>1košģ½¾³PĒ­ā Ż÷<“ĖńžtÕgĒ“9ļT a5éiŸ_Œė×ŪX{—4Pėxz†‚ūz¦,ś@Šxj¶;nęd„“Ų>°ųÆžęļę{9ó›ŽņÖó.ŗ8„±2 ±ˆ¬¬Ææą9ĻŃ£­µbeă]PLiōš)c=˜ŸmMOĒkJ$ŖP¹l…s7N`A„©ˆ?ĖgQ¢óH ℿ€4M—––öīŻmgĢe—_vģqĒ*„¶lŻrđGE·ĢxÕ8©éĖ×bĒ©CŃŗQŽK$ǘPĻ”ēLĒ»UöĮ©NŃ~žDDŠŹV"*»]#"OźVjĄŖØ,' A‘ž2żü±Ņģ-œš¤Z«Eć®Ī¾HsĀ„æĮĢ^<6¬ćL]PĶeŲģĄlRg—Ūh;÷øõ^W¾ŁxķÓ¶?Ųõ{h;‡ĒāŅć+;¾IRÄįNyž‡ņ3~b˜t;”9>”)śöĖ®]"2£~?‰±ŗŗ,7ŗŃn|ā°gbžõłĢ/BL+{`j“‰XÜā2ŚlK+/rš·A©ØDĄ¢(źõŗE#bēFŖŽ¬š¢YØĄć-}Jˆ!ms)KŽh­u6 EŒ@H±“˜ŠIrÅŃpFyeŃpÉŪ­C,ūIl رŻ}Ģģ4_¤˜Ž•'hŻi+8ZŚß’Ć?d€ÖŽ Ōķ&€ 9J7Œõ"{ÖĒÉGß÷¾=»Æ_Lxėbo”Ū!P®%5xŹ“Ÿō³óĻÓbˆ9Ą„I<¹Ą:҈y䟜ž€ūÜū­’ņĻ÷¾÷½žżo/ņ†¢ąb»Ÿ‰@”tcŽh}}żź«®² ƒÓéå@:Ųe/""–·l2óÅ/~ «ˆ±ŗŗnēDžéJ”a_Ax=$ķc’ÉlÉJnņU|;|ćIY|)օQ틐åįS³)Tšn:A‹»H=•ŻšF"u“³e^wĮQ¤¼ģv{ †ˆ˜­(tžéP­ŻiS”ڲQĆ8ca؈{sŻ&ėRq®ß‚c|0ÆĻ{•rZ(Jyå<¦2HcōŗĖ–*sx±ßˆ*‡µ–ść 2’·÷å)¶ģBeŻ1“Ą@iń86?ģvQīEäĢ­J@¾G5åß0aT'9>ØĢˆ9OPLš7kæīt:Ŗ*h?|!’ē¹ ĄŲŁSƒ ±Ķ'h£XҊŸVE"ĻóĖ/æÜ?ÖB!\S˜‘ćŲąM;ßqB­4s,žļ†Ō¹CŌŽ7§\ū‹)œ‹i%LŪń¶³’®÷øĒ ÓĖė£cN8 æä…Ö7(¢®RēœsŽźt\€Wō„n„ƉDŽcT’ɱŗŪÕ¶« ²¢e÷iµ䃌±±…q®€&Ń0¹ŌZźÅÉņDD4Ž5Ęä€I’HD¶lŁņŗ×消0¬·”=č5Ŗ)4Ŗ?Å%•š±SWųT‰&÷›ļ¬8Ł~†}2撜qļeŒń6’ö‘•j%Å÷Yn„s‰ZŽĆ"ćÕĘNļĀ^Ų–h "&,}²Ķu8vXøŠņŪ”›¼[Y!ŪY ®žÆš¢ė*Mwķ$e­ć±GIˆ‰ūkƒŅµxÄØD‡2NŲ¹¼÷RéDPqZSĶq„źÖ—Ż3gjbŁĪ:ńEPcÕߣ²Ó&@ßį6—$‰ ;\ÕŌȁ“ŌF r0TˆÓ!FržKAČ“XRŠĆžżµu_ė0¦Pžó  å)ĢĘoœīWŠ’°V«««ĆH¢}냻ÜēĮ?¾ąwŪ6E tŗ0bT"€ 1Ø'FHŪj”]ž$DĀ&/HY‘„ü‘oųw#\“0$×DĢ£AfQ{‚(E֙S ¤l3 ŌĄ@2@mKkc›;4CS[“1’s¤Hq§×uņÓ0G±g;ū©R3ÉD ęķŗ‚a„ĄJigÓźĢēI eŁŽĖÆžĮ×¾yŃłæ„€HTĶa5JŌ0Śå©”2Ća:eY¦‹KynF£ŒHŁČJ`6Ķ9^`)J„O>é¤Ō ˆÆ¼n?(“‘ä¾Ņj£ü=W_µ«ē>óY»¶,LƛŒF#tŗŻĢČ{?š!Ūń'×m SŖU‰bzåK_v£mŪ¾ü?_=ėĒ?ÜŽėĶöĻW±Ā†8é”Ī4įš+®|нī»uiń„y÷[ŻŅ,ļĪ I£!˜srNŠD9€g¼īµ`.VŲ·ŗŽź­K[‘iˆ3ų_×g£9QˆHė|Šļ ±%øƒĀ‚Ū!I[Œ!*c†8Ż7ŚųŲ"wį­Bw®xāVUœQr5ž©‘Šš"®¼…"F™aŠÆź )čā}쟧Y^xś–»„‘ąõŻ¢# € ‚Ģt”5bbCģĢtķoކi•źHmQŠ0LMøU‚Fb2ĘčÜä™Ņ»8е.±č–£ŗŲ6&7n–jĄ f$00BĘ@›ĀŃ×>f»„&OīA äwHˆmĘV_§ÜżŖ&h¤ƒ†H¼Ó®”ĒMÕA¹ϐ•c SžČŸP Š€š½4'L`Jj>äÅgh5ēj7g2vŹćźwVl=ƒdŠö6D ŗ_ĘTŃKC$ā줃| s:%…µ¹5‹.6U¢bHE“ė0¤o7EEkF©`«=ļP…PļT—q$ķšd·Ó;šŅq±nNGQ ģ>Ģ1ĒXR¤‡•R”žwU° š¤ĪŻmŚifó@ō~¢kąŠnb-¬}i”XtžÅŽ)f\!Ŗ%xr’FLé^/Æk—*HTČ?“c§–ÆCnĶŃ•r·Q%ńę;?žųĻ|ęSĒ2æįßōķÆ!JѐdUėóÓ3^÷ZŪčSœtN¶D„ÜŁadBHMt³-,§2%©xH”‘ŠÄž–pεöB“\Y5Åw;øyÉŽˆ„0ŹŅ,Ė6„$ŲG1k™9‘õõu„Ōīt§—æüļ|Vöž÷üŪ7¾ńµ»ÜłnV©uœĶCxūM™ikƒ:¹ 2īzšLśYœE&|ĒKĢ…kŗ¬i’N.ņ5kfRÕ,ņXM³¤2UÅŅg§*Ķbš=K6h‘ē°Z]ī‚…Åy[Wj…Ā&+oä“»ōxĆŽz• lļZ)ŽćŲę¬Āp#+ēA–eƒĮČ"WĮśś@“¾ęŖ+ĮJX ĮpwŗÅ-v-ö¶vŅl®×¬ć„ š”ĄćĮŹ —™A±SŠ`Fé{ŽónäŁę^”HšĘĄÖ¹8¼źožinr!€  Ń‰b‚¼ī Æ’Ę·æµ3éŽåę·üõyēßāŌÓ(ĖĄ¹‰i(Ä‘Ąä™ó»ß_$Ą Ó ‹sĢ”šlėaŪȀŒUŗŅEģheĆÄE½¹¹R9<Y$°xµ•ŅŠ¼æ$¾&ŠOŠ2¬RėŽĀć9JU· ~“Ø4WŽ*Ž# ƒĻ WŠc‚’$v nĆōŲū©t: Ø©eķRŃŗ\gµŽ_嫉 Éu’Ć[ź?·į~ĶržfSrąm6EQšfž5‹ĶU+ü/Ś“Ä[© Ē‘M¤]/quO®akųÄŃ’©é’X}®-ūyķˆ)Čā8RįMDF­ó<ĖsWp•VU@$rĄKž„…ČXBŖ ,“-¬ƒķńOćy õłßž@0œB­2Ŕ6”Ķ“mŽ*$­Ż™Y–Y:€7 v¦kĢõv¶)r÷5Lc,Č?‰Ć"łv61³»«šhœŠźŌTPåŌĆ4r­óhĻŃ]EQļ/ź§bÕŻž÷¼ēŻī¶·½ģ²ĖÄėn4@–ė0›¶§[ĖÕ—r0i‹’ųĮ~pśŸü‰O(īqļ{3“Ö:2蚎·¼õś+ƆvÕ«ŅMœH‰"ĆuūY œg,XŃÅpf4;Ć&ĀŠSLZIGć8ö‡¼D厄h-ēdp=ķCcZÆ'äāä)‚¦RtI‡ŖõźTd“Øķh®Ł‡kT‹\g­>Xd  Ļóį0Y„#ģ¹öŗ}ķėh°ž“°PŸųÆOœē)MæZ»Õ7$²ˆo”Q¦±AŲ(Ė9Rt„F±j“J9YHėU"£ ˆ & ŒqW-DLä@k;dc ›‰[‘I›P)†b@ļŠ,ÄģŠÄň-°6ūr”m LbmxÅ\ō›_ķß»gŪāBĀtŻu×}šż’a—ƒÄŅ‹?‘#į’µn ¹V‡,Š8ä÷™’ŲH«ŪķxīsŸ  ŪķōzN„G?ģa0zø¼ŽA(A:}ś??2·8w՞}½Åī®ķL³~Ģ“eiqŪÖMßųŸ/œž°‡Ę­M®ĖŠZ“Ń*Š xō#¶¼Ņē<ŒI€Į°Ē4OŲ6ß}ß;ß­‡VNš$FĒuTLHMzÉ—PGżīš«=ā£arˆRLb¹&C¢ ųśWæ²°ŲK:4ʆ¹H Üź6·.¬ Ųmņy–Į6pś8«+‰Õ+šK-ŠlšŁßÕÕÖ֙ø¦č†ÅnX3Ś 3 Øż„j“ÄWXjߤF—lĖ%•ę©‘§rśŅĶ{Æ:‡×FžŖi”åfėÜ0³R\oļ—*i“¦ ł^;Ąóœ³4gEIo”oÕŹnnÖD˜Ļ*ēyž[²:Żn§Š‘ŹäÉ0Q‹ZJl d’c†zŠĻØ-ų ±;jˆµ0#ŠXÅGv©±ĪĄ€„.ŲŻr8=ķ O¹ĆĶnń˜żńņ5W]uŁå&Ė@¤ˆm@F‚‘¦kW]¤ as1šźƒŖOqŁuyĖ·4Žc[ ŃE‘ŃĀ!ßcÅӛž¬” õÓ²@EŖę]覆Łćād÷4 hmŒ®ŗEņ±ÄuvᆂŸVåj)Ń{ßRb·•»ßõ®ļ~×;~Ī9ĒwģoūŪ©(q³O­A¢nÆ3L½›I¹F8‚ł°“iS¹‚˜@xöŸ?ז Ó’½ūöžę‚_yÕ¤ŖēzŁaƒ6ŻĶDQąĪ¶©©ąųU³jkŃöJ6µÄø½¤×Ą¦¦h|@ČsÓﵫå0cošEēžtv‹Čs»ƒbÓ¦MĻ~ös•ŠEČźa‚)ĶRAłĖ^cĄš[Zź…ĒŽ'õˆ"W±°¬p`YŠ,ĄfM7+„ķW…ń>C­“–@o¹œ{ćTdżB.ؘÓi½eś4QųcC)å!ś0žJÓT š&XžØ`æ÷Ź M…É+7tÕęąėVh³† D¤,Ÿü SČWŌ·%šT£“€gh{VCaÕi!Lī„„sĻūŁŅ\§Ć¼m!~߻߿Ń÷æ?Q¼Š„! xÕßæāóŸųļnÆćĆ "F ’Ü€#Ē,‘F\ĖFęAæo«q%ŲŖCDE‘b£af/\ÄVżÕÕóĪ?/žė1Ag)@é0…ųõHb`“c¤Ć‘ÕöĻ2ķŚ ”&øŽbˆĪ 9gXN4#ĘF™¤Ų›;;ˆÖŠ ó4Ó£4ō×zŻD€Æ~łLtž:® U«±üBVpČ3Hį¼ ĄĘ pdƒcĆ\f¶ß¹ōŅK Fʘ˜é'g’DénZĢ CŻNōڿŮłä˜M‰¬÷ū{ö.õz’„łpˆ4}śŸpξķXÖ®MŹĀ1ĢÅq#rĪ9ē,ͳ‘¬§Ø×”(B’Ø“%éźįś×æśe ··½'wŗÓrJb3L·Ptōܜٷvʋ_F†Q0¹i°&Åń¾Ż×]{ķ>2BDƒ”±Äźw¾ē½ ¶UGŖg@%1É« Ķeˆ95óäX tą[ŠEi]“e+\³)L&Ö"͚©/{IQÆų“…BÓ²§1ˆ‰ŠˆX)”G’Ų=¬Õ8j&KĮčŁfK—ĒŠ[ū5dŪͧu?VśJģ Ø-fćĪmÖ1Ż2""Ewč5‘Š¢(މƒ2ūԫҶ=õŌ4CÉĒ]Mģ1°~lĶPöø·z]ž]ū.@ŹķQT&`؇>č~’õ±]vŃEßūĘ7Ž;ņØ»ŻįN”·-ŪĪū2ejµv¤cʕ{ĘU‚š‘Œ«’X²}šfÖ® 'Ł’féŅ2ZŪź§Š"E!‹ŲH«püdBEå“~ńm(:Ūźi‘•-ÓQßqyé˜Čƒl¾ÖŹ.Y__’Ž ¢Ųś%<śŃž\—™0Ž+<ńA2–TqąŠHŃg"…–Ŗ1éhōÖżWC@+å_ųū‹Į¾D]v–=¹f¦ųņį2ČCٲ™TńŖq]&ȜŒ³ŗõ)Üøė‹"īõ:*š—;Tiäē˜Pó`yyŁ’Īwæū½° ßžI’$VŠŅ&Ćv‹·æ¶ŗŗzńÅÆÆÆ[Ū’HŌ'õ²o$cِ±ū䷛µM›…!3ŖiV~4¾¶¾»Ÿ03„gćä’0»kŪ²¾ ®†Š@²nŅÕ¶į’7l{hĶå7Zįšjc(A•ŪĒ$VmcŒ€ lFŖ6+[§—ˆ•²ģ_#dTĢV鬔 RD¶¹6hėB ĆY“ė°ģėĮ`Ō›ėĉ2:[YŽ×‹‰M‰īō"¬­ģyĘӟrÅoÉ²Œ½ł9(ޤVOØA­¾&ZoŽ“ō‹Ÿ’ģ®w¼Ć¦N§ĆōŹæ{łU—^²gĻž2īōc²õõ• .8’Ö7æY—hUD“iÓ¦ŪŻīvÓy?=džØIÆ# Ś)Ć@$k+{‰MææEŹ–Gƒ5@ ™žp][a(ž$Ę š[;®ŻIF£‘͐ Ą™!ü¾’xD‘A>JO<źČ .ųuŗŚW*!bēyš±}ŠVFoR‰‡Ć”„uDū ĻRÄķŃ`ÆT)„:G–jˆ&@©Č†· @v_suĀEQĒkk#"E‘ź§kŻ8‰ żÅs’|åŗŻ60Ę„īDTŹ^\xįoÆŗöŗ8N6o^ŅZ#£żQžD˜ėĘQÄ/|į Vöļ "äz¤E pē»Žķo~ÅÉużžuƒĮŠÉwKžŹyó;ßōŅp†^åre½#õ–mŪ¶-ō¶lŁEQ ;wķœ_XHó ¤ ˆ9ŖŠrEœęEa]X%ņœ.},čy>ŖĒen²£µĪ+’„ŲH+õ`ĻöD½Æ˜ĖOß3LĪu¶ŠŹVąˆÜBŗ^EŪĪMņæpÓ4k5*ž~q•jXT€ĪĘF¦d€[ƒqavffZ›įpTŻŖØ:Œ•«aEq¬P:IłsRKhEZg„ÄĄX­xײȑ„žŚ¶{yžį=ޚU4효DqĖ¢Im$[›ös•ŖVRSž—ĢØō[1I²Īvņ¦M"āaß”-łżā¼ó™Ō’~ū7÷­ ’H]wŻU§?ōQpml[żä °ÕK§6£ģ˜|nV˜å*ŠØź?Zū°½øI»* [Źīρ2„ŒėņsWåVŠn>/&lŒh³Ń@ŗå÷¬I/ĆĮ“¢(‰%P+(ł#F<Ę6AŪhģT›Jn T…7;»Åe§äī½{ˆ9Ė3;GĪ=ļ\L–¹j š…b„g\VøÓSāėń.ž²Ŗ¶gQ”Ä]’ł‰’b…Ģˆ†¤bžģYĻö>O”īĄøŒ÷Ą"U&BE\XīBĘŌ„VõĆ:õŌż½ßoH…mv øŸ¶%NS=W‹ęĄ–!³[’]6%¶æ}ÓÓnbKw޾ĢG„q—ŚŚ&žö·æ½sēĪ“N:iqqńĶo~³²›¼Ŗ›—:U kölCæ95Õ7¹k2|5”×fŒŠ™XÜŗSA×8±öØ^!TʆČ•ŖķxšmfK³ƒĢėŹxbB½* ŽxœmŹä©… L­[šĮ§²3āɇ0ažĄĆ -Œ1Zk£6S8)ņĢŖqĀøŃŚųĄ+Š”õG¾õz!ņ&+\*ÉÕĖ·R¦Łö ]“TX2¼}²-Āf•ķŹ€L+ŽĶÄ÷æ’ż·oߚ¦ižēI7Ióti”»i±»øDJ–ę“DIæ?|žóžѶŌh_~”ęRC-ŁÆ“ąK&#—żź‚Ē?ņįēž}Vš„s±śĒ3Ī8ęøćżčG»”T Aėæ~žóO;īøŪßģęüņ—s ķ ‹›£N£ xŹŸ@xbh£™m””™¼ķoü»—į8ż÷zźCN’ó'śqH‘ %҈2ŅśåŁ?]^¬,ﬧ–Į}֏~āT”1Ž-¼¾Šż°¬­­”*ķY¬Tić/T©ž®ŖØZ¤ĶM7xd2¾²†ĻqyN9Čęö‚ vo©6Ū„›Ķ6…_b ²@±;ō ½e ¾‰Hžk1PŠ-oæå>«»–‡¶¹ˆė\=(»Ś …iØmć·n‹¬ŌśęZ$ +AsŲÆµ¶¢Ō5ÜśuŸ„łØ`¦:ź³Õ$ZēLk…£½yfzZRš; `ĄˆŃšˆl«ˆ=ÅDr°!f-ęæ?öń°})™ļÅXĪóA–mžė~÷›_æöŅK`21AŒ!Ō›][fu{œrģ„«²;ģ간)×i$“f²)óĀ桙„ ßžvw¹8/.Ģ»yå]+ hrŸ9·c'z.ģwķ¢BcZHcīavÆ£ŚÕŌńaW×4–ŒvŚŁśāb {ĘøÜĻ7j¶ *„ņ<'¢cŽ9Ę’ÉŃGĄĪ;Ō£«V‘{Żė^ĆįŠ~óe/{Ł£õ(T’Z¬–ećz 'aCōTĪ}Km¢ķņĀiW·Å &TŲ"Ū$ÄVŌA C¼ÉĻŚé‹ŌP7ž×ĶĪx™żQĢų޶æTēĘŅ&Üųø)1ՅŠBÅpĻäŚ+^zkg&¶'_Č„qLc#æqmEĪ󶔝F„\F]µąĢNŠ0"b&ėœē­)ķI’TĀŗ צčõ·Ź}Æz ŸųÄ­¬, ™øQDĀŇy˜–¬¢ę–Åäk_żśÓ÷Xˆ!Ū¶“D„6+Ń1 :üč[ßxążļsŁ%—$ŒKó&Ó]B‡ų»ßžÖEüЉw_}Ķ{ßņÖ½äļś·(Ģw:=&¬­"Ķ›ćxė|ļWæłuŌėī_Ž ˜ˆˆ²£ü‹’żÉ#wnī žüŒ×żć+^ńŅ=×]yŽĻĪśŚ—Ļ|ņ“ŸšĆo~õņĄo|ó›ļxē[otĢ - ¹ķž5:Ž@øĆ­nł‚?ū³{ÜéNG¶óŸ^õ*ˆ•)Ö¶õˆZk'o£sņÉ'ˆ§bujĻ|ę3ż9Õ•‡J®%3Zkbx)øp=žĄÄdFE[–ś™ōz½8ŽW‡ƒdq^sĪĮł?¾éM ڱ4 ēėś’ß\*Ā÷½ļ ±(¬¬­’ä&·*ōäF œh? ˜W]vé¶„Ž–¹ÅM ‹‹‹‹QmZX$ƒM›ę1ƒt”D<ßéZŌx!7a€—vlŪg²żĄ~ȰæöóóĻ=÷ģ+A¾ŽWL`¤¢MGĶӟņäŠ_Ę AGÜčHĄB@F1ŠI7‹|Ż ©ˆõÄö„UKٵµ_µYŖµ‘:۟|N…Ą¼4ö‘F{N½|ŁČt¤Rå{44ś½[[Łt̉QĶל‰w£<ćIFN­I‹”ā(RĪ{¹PvjK¾ĖĘŃöĖØRŹ=G¦Ņ<5ŃŌŻot,Nø›ķ- ²j®’eŗ¶÷#¤¢JwÄćČl<‘qŁ.Ķ„ń¼g >U* VżÄ–D :å„?ż‰O~čƒ|ōįG¬ī[†@Švy"łč‡?’€H›Į`0(āN‚ÅĶó®:žų®»ģrˆA®Ė^šš9JŁ oŒ]ʉWfž8œ¬-°®­ˆ čØRJ)5JG`‰gÕf·Ēš›įq%x¶4ŠĖĪö,/)!i6 rCŽ’aIȮ߸AT‹ÄŹŹtŖ™RłšÆsÜ1Dz͇£€’łņ™0łF“_;ņ®e®FćZƒ‚϶“ŖIįlµ; ó>’kišÖīśØ£Ž±}ė0ĶlćĶźŚzĎ=äœ(½pĄ€µ•6Ę e»¾lG1 J; Qa)#'#­‘÷äĢ”õāJ,Æd³T¤ŽPuˆA(X(0)Øł•§EQ%Ė]yå•"b¹¬yž{oĢ–)U0!"ŸśŌ§–——'-é¶^šÖ&Ƀwun¾ļ¤74¦T5.ŪÆ}a'“ż_ŪMײņ Qq+pb<€ķ­«S3ĄM>T$į EµvÓ<5Fī³6Ģ–N¶a¢x°·#“O‘C•0Ŗśd\“Q™<5{Ļj”āÕ/@­£į=½0‘f/bZG½D˜›¾*ÅBsŻVJ§1¢µ.ƒ+ApYģv»KKKyžGQ%±³:ę ]‡ußÜ’ś=ż}{–Ų²4’å3擾wŸŃŚik™’s4y8įõl ¼šĻ—<;źˆm±Āh°īö:1Dw¼Ķķ.»čĀ’łģēžęÅ/>lėÖ]Ksƒ„Fˆ” 0§¢…N¢rkś„ŪŽśĆŃ žńŒŪŻģ¦OÜćŲŗå&GqüĪ„½Žę(ŠG£Ć—ęŽ/žģńO¼üWæŁ¹Š¹ÉqǾióļń‹ė.æ2"“bJņ믺ņćżšśźr üó›Žų±¼FSAu5¹V¬lRE¬uvó[ݪ׉…‰9w;LøÓ]īĄ „eŁČyW «r%2,oh4YD‚AÕ ćś$M™Xo?ėEÉ#ńHęęę¢(Źū®¹NqtīüĢĒ>”,ĶõŒ«x_®÷dśĘ7»Å;>üĮæzé_Ļ/ĪseFoڲōӟŹ]%—҇ŚXŸ_¼åMoŹÖY:ŹFłŹņŚp‡Ć­‹½<ĖFƒįÜÜܦM›1¤0“ŠķĪüW½ņÕw»õm­ŠŪ(Ķēŗ]%rĒ;ŻQÖÖ;Ż®1¤&%FŅløć°-‹ Ē}Ų®];@cżAģ Ūåē• 6øŠÜĆÅ3H™!āPĀk•½+ČUø³)ņ¬lŸ)Ł„<˜Ū¼±mŠ6€)•q‘A–嵌)Šx h¤"Nƒ@)%¦t`FECŪń> _ߏõ;/āq¦”ČsĶÉY¼»MÉBėm3n”üFē9•¢*SRŪu„bķėm4¼Ż“ĆZ±šT5Wv6Ÿ/qV7|Kg‡ÉŖ}ĶÖó$ØÄųńæõ-nqé„—~ģ£ūÖ׿qķµW᳟ĄŠhc®½ź*§iaŒVXĻM?ÅźśZ§Ē„Ļ|śÓ0°¾gćX¬ˆ•Ō'ŌF¦Ø5ų?3­aC””S+KÉćē†ˆt:[QJyϬ(ā(āŅę™yмVI™Ą;Žü–ćŽ>ęÅĻ{>r]ó…Ā!Š= DćIŻ ÆŒY`BčN©Ź“źĀŅüķļp[ēŁųŸ/“a3ŚpĪŚŠ<“6…Żé«3|BėeK®ä"Š.ƒ-TI@żÅłē’õ+^ž aē–£ō}00««0eŗlé%v7ĢĢy¦;Ä„įˆģ§PĶW¶l%Ź’7IkK]lG¹v5ļ*‰Qū?7ƒÜĀ€^t¬SzŖśOƒ¤Zœ±š˜J5«¤ŪaĖę„ĀīNžåŸßb׫ķ%u{a+++RTa$ĘxÅĆ_’ś„źĄ=!ŒG*bĶHŚń½ŗ=6l¢ćßĪÖ`DĶp‘—éƝ兟}X,ÆHĢŒŖtY4–DÓ)š„ģXXXØ»:–kNāߥ ^&Q #Ö‘ ‡d)Õ’-³h¶±‡ńå†R!ǹd׌Zvŗ@ꏩļ0˜‘eis­¶w\p`ĆXÄDȦMj® 4k:=UČŗzŁķQT?ĘUIĘ뜰¹[ģpŃ·Ću%źŠ5=˜?ąˆ„œą­µ µó¾üżźƒ&"ÉÓ,tįFčĪ-Ž–“É[›qž8VŽ×öp¤­ĖZnķépA:Ł2Pšć$Š™œ³QQµE"‡Z (»ļ}ļ«”ZXXbŽVöļәét:W^yķ®£ł—~čÅż‚mŪ6S–oJeĆ{ßõ.œ$ŠŚÕJ·Ļ‚žm ĮŅ £a„šÉ~sö.žõE¬G”„óQœå«(‰©£ŠėŃ`“~ņ©7y֟’ÅŅüœIGsóÉāR/¦ōČĆē;]5PŅ‘8ŒÖ›­ ¶Ęøņ’+ŃĻž’ģgźæ?”‡ūß±`Ööc4Ģ5]użŽõÜä*&EiŗÖQŲ²8Eń¾ÕÕŻūVnzĖŪ<ėéO„ % ˆ®Ž³g®—lO¶ĢʼnŒžū§Ļ<åŲć! LNlĶ= +Qqōćļ}”­eš;s ¬ö‡™ąč£N„f6$Q7‰Ų6«!KSm“¶ĪŗˆH%qw®F¦MškŎ7Z˜\‹Q&ŽœĀ7īšėĪx½RX[ė›<=jūā'?ś!YŁ÷ō'=ö+_ųōį‡méĢ'ˆi„?ˆTtÓÓN{÷»ŽRæŗčBĆŌķĢ3Åó±:ćµgœõĆļ4 ^¶$ŽŌ}üæ;ŠēęH”ŪKāDĮ˜Tg©É×Ó~ Īóüļ_’CFA1 Ų ‚äĢ`ˆłÖ÷¾¶8‡ćŻ:?AŖ€Ń­nsK“0 Ųżąæ’«‹/ß³w…#%„ėv_wĀ ĒYŌ9Ļ,ė‹ a‡ÖŲG 3ė¦Ež²jeքĘZR Q{glMĖžŗŖ‘[Šč",ĀUöŻ©˜Ÿv!Až:¾‰ßl-ĢĪ “¦©„ ktĢ"dؖ¦¢Ņü)eŪW¬?–H­()•߇qö8N >8GBÆc Y–å™wx+植„ż“Vž–IZuW.LM„Ü?­Ļ—ßōæ§”ŚĮ™‚Ē«!TŅze2žŚsˆ§ŖĘÅ~ķ RĮ~(1+€Hęē{¶ŚV3[x‰Až9ŪėŅīø]\ źīb«·‹“H‘V]Ķ,ūIN<éĘĻ’‹æōwÆ@1š†W¾ Śä¤3Ź­}»Ÿ„Ž®Æ ŃMå{śĶyŲŗ£U®Æ5yŽEDĻĢ·ĘÕāŻf4< ³Šī,×P/­Ś•ŒC·Ā|Ž„åĄ½īu/’õ]ļzךCl{拋‹¶zŸ{ßGœ¼ŸŠååUļV4NĖį )©³Č5°‘&ø·…Ng:ŹMŽuū³˜įÄr~Zɬ-™•—d\_™T¬ˆfę&oąĆ¶9łAs•Ź©[L£~ę łSIģ”En8®ņĮL9PU-Ę¢ž6ŒV;ĮvφeōkŲ{xnŁ‚t­ Õ~Q„+„¦×0c©™£†«Ą”ƒ’Łh‚µŪµÆŠļ÷ĖćĶKB±”BG%՚Ķ’ķäG ¹jm¾õ­o­ÆÆ÷ūż(Š”RIbń1Ś“cHżåĖžęŅėö2£Ie)®½īź’śčG0%¼¼ŗźī/Ó0ΜCrSĄ›EŪ-˜ @ {W_üœē-t¢8ī¤iNŒˆĢŅ|„\' ㄘ¶t¢é¶m[ˆ0Źōźś Ū™ŪµėHSģIGשĮ¦M[ŗŻī\’,Ļ|ģcæń…Ļ%¤ūūwÌŅ4]YYŽśQ̹N—6-d‹›ęT"żŃJ– ³,[\źm]š_[^)üį+³EQŌét6oŽĒq/RĆįŠÖšX‘īĪ“ÓČī|—˜½$fĮ곘ĆQæ(B[õń¤hVŹvWķ»PL0īÕøÉĢw¼''åś3‰AX__id£|ž(JÓ½ūŻ·:łä嫯ę\“ŃW^q}§×ŻŻ I~üĖó9õT”äF7¾é{×VV—UÄDtÜ1;’żŻ’o€Y ‚«8>žč#IŒ6łņņŚ`0°økšē󋋝īœ1ņß’żÉ£Ž:†)r‚Ÿ`R hŁæoߗæö×œqĘu{V³˜da>ٵuimu„æooA 4Šł5W]”€QŖE¤×‹Vśę¢‹.ŗšæ«‡/Ś­„œ·“Ž*o°¢žH¤,'Č"ƒĘŪ2ę^-(nS3Ę£I”)ó•±=įįīlt”sO{ÓAų¾*pIéjCė ²²CeS†ҵ¦&2ŅݟWĶ W¬qŒ'oŖŚøB~”ŠĘ ›x{žc§&[ųŅ"ŪU™ßfš6īMG£Ō6©F‘ņ}’””.łīüīŅK Åą\ģ;Mi¤e KJ@:(Łä¬¦Sv[°·¬µ‰NĪŚ'Lµ&?v–|ŲE-é¢rT©%„Q¬?mōłœē<Ē#éĻ~ö³„š]3³§5śŒ™æśÕÆ#'Įq„Ņ4Ÿź“kŁMśÜųó.ÄN¹žDĘ Kih¤e™nĖUfš3N› ČgØ)BDz7”Ļ"~@”'9:ėL¹"•¦į…¢jāϵ.©Z_ÖģcņŹfä{ĻX3ŪŠs,d'¤õwģJ »ńQsS,˜|ć³lõrX„!Ń įv"FŃsHaI„Vф¶¶±ŹžcŁA…Lqš¦õŃÅFNĒhķŃ—kłyāå: åܩ޾³¾¾že™āxļžżŻī\’t{¹nҽė}īŽę¶ģ8ļ‚  ’,˶m]œ‹¢ē=ū™/|Žs%K7-.źĢˆ‰•±;CÌröżBZƶ™v食łä¹æśåBgAÓ8VI-ĪzØ"ōz…¹īÖÅły±¹³¶²/ͳ4×`eŅĮļ~yįqĒŽčv79ķ¼ļ’šÆŸóē»vķøāšŻ Ż"µ°yé;?ü>‘Š©4Ķä*¢\rŠh~óÜžõ}«ĆU£Ģ ķÆ V…s ń¦„„ż{—‘:ė;R€č£Ž<ņśŻūV×Vśƒõ(Rq¢ņ<·ķœ†˜ń£ļ~‡„²µµ-sŃR·›Äź‰O~²ø~\0»FµŠ —*$<q’$ --R”Aē ˆGw¬qƛGTó5×^wõuū,w&Ļó…9^éÆ~Ď}ėĖ hHžW/yįBĶĶĻ÷"ʇ£/|īóŽ꼩Üāśį˜g™Nū[¶lY^^6Vƒ$éŽ2=Ģņėö®}čC'ėė#ynˆBP9"½yūŽūŽ’ĮĻ|ž‹æóĆA”×ė)11°÷õ;¶o³“ĆčŒ]qŁeŗ Ņ<_YĻwlŸæŃŃGt“Ó ¬E±R³Rä}bY¬ų°XS-)C‘Õo¢ tfJ°Vk©0öšZv„q;Fs§ )»M:"ń2„²Ķ®qāT[m=­E"+4ž©ėöĀZ^“`́­|“­ÕųUÕz~‹Ż±L$s6-īZKõB'IĮĮŠŲ$9ōqU?ĻĶ)R£zļHAԜQi܏’$”ŖSd”sęāU­ÅĢ2ZZ‡ÅķqÅf*Ž”Dõ¼ś0õry©Xv›öÄ6ćr”(Š_łŹW&Ąh“ltnѾƏ<āĮ}(ÜŠ¼’?”˜, 9š•o~¤ JżåK^:fĖ{W#ąģüpøo‘Ń’"ķ¤Ø”r2ƒ’¼™$IM²ĪŅ7,Tņ"ż<u»Ä‹{śG\äčۙꄬŠŃF]3,ĖėĄ“iÓ&öķßą#ł°“gIœ8:aUˆ“Ég“”Zć©åēÖX7£BM(@ˆ†5TeŪ(ŪĀ…€ˆĄhƒååå ĘH“#«@v^)„|M ŠŅ’ČÓ\gFt©ÉĻÅ$€Ļh›’æ4ƒĻ ‚ /yŁK·mŻ XĻFŪ·n³6"+[-%:˜ĘĄJfēæ›gŚŖ2 ­nFaėfīī a”„Ę¢iµ®µ% ‹,m Żj€ņ“³ī&5ĀżżīwæsH©˜SO=•ŖŁ5‚®ć°CĘBDäŁ’čžČgDć:p¦9¬Nœ~ŗ±¶a¶ńŽ(E…"H ^†“9nØč5UnŠ Ėp8ņćœt:mÉÉ4—įƒųØņoČš¹˜į64­¹gL‰§>ż©²į8Dā[=j{ż„6馆SžĄ&P‘ ßɹĄLišŗ- ‚aß² Ņõņ6b‚Cœģ”•2”0EÕeÅo“™˜E$NWß!b„jN­:ĻÓļņ™°ÄÄ·¼å­ć8ɲ¬×ėŁ±]ėÆļŁ·÷–7»%ršń'zŅi§ķŁæ–ކŠiK§ó”w’Ū³žō$ˆQÄ, LŲ’¦µͦ$2ģꈔa—šc‘˜±87Ÿ‹ÉŒīĢÅ÷}Ą½T·{ŻŹh0q/.t )qf]ˆ²l±k„'?ļ/¾żósOŗó_żĪ·æė}æŗn÷eėÕ„¹łx5ŪKsZ›“7qĢ'œt‚&ģŽæ²wm I²yēŽŽ¦„ĪĀbÅq“>¬õ×V÷ļ»čā‹?ńŸ³b3Ę0]{żuJ!ŠćżĖż<Ļēöī[F:„č2ę6Å.fä¹Ļś3H›˜X²|.ItŖ/¹ōw¶‹Ąh”UÖrQAocJS1 )c_+ŹāLbh`dRƒ\”™›ļl]LäȳQŅ›²N>(‰Hbčä“›Üz’śjšfĆĮśźŹr6č#ĶÜĖī¬Ģ¼eó6kkk£ŃH%±JX›,NT·ŪUJUoi)¶ļŚHÆÓ… ¶ü!zŻhqZ°m릸;/P™†ŸrӛżōÜó’$éļӟśōMN;9¬+b‚ĪӜhØXqĢU ©2bĢäĻŹJē(«ŽHQ+0Xń)·¶ØŅģ'D!D‘h¬®­’īŅĖ 0Ģ Jq6Eq kGdłķ‡åæćķfZ¤šļG+ØC>A…­ŚĆÉÅ7ė‘ WųēmoöŌ§>µ×Mlś9—DüśW¶I`²Lt{ŠÉunC é+E–ķvP®óųlŠŌŒ;µr[&Q7N4BŲ¶mØ­0œķ!‘ĘĻÕ©Ļq–ēū‡Q„nŚG˜ÜģyĖ„oٽ18öLŹsT×nmF]čŹŲ5kē›RŖž‹łź; ReĖrDAn$†CK–H’®ĖŲµä¹q–TdM¤|ź^،֞x477·¶Öļt:–ŽŲétR£ł¤Ēßōę·“ QƒĮąĆ’čcŸōø‘d^“ŲozĀ¾ś…Ļ}ń£ÉŅUxĄÓZś^ņŪ‹ņ~Ÿ|mķžšŁ?ųĮņõ{8ÖŲsÅU›ęćXu:ń\79ń¤TŅ}ŌŸtŁŽÕO|ž3{FrÅõūֆ£Žā-.õ’¹(3śÄ#ß·żŁĻ"G˜æė°.£+ū«'>ų~Y²l‘Ō[·n?r×āö­ĒÜųøõ,hŁtųaųų'~vń„ڳżø§~ņsgĪĶo^ZÜEQńāŅü¶­óÄé¶SŒ9‚Šķļx‡M[·¬Fs=†č=»÷w#ģŻ½Ūū`ƒįh”Ó«~÷»ožł„«/¹ló|/Vœ›šĮļV2hi¢"ü$׉"–––HĮŖKŽć‰“ĘNYęD1¢(²õw1f4ZrJS^>Š•÷¤¬ųüJ1Ff§hØwæ÷½t”—ŽEr‘U.`Ņ(„ćHm8œ ©ī`ņµ[ŪĢVķf®¶Ś«śŽĮ0ļo¾H‹Ń$ŪĻ9• i©¶hŪ*Ü€ėœsΉ£ˆ™¶nŻŗmėÖĮpšüżß’½_3µĪŠB(ˁ~æ’żo·nŻäįŸš„' hŠnŠL|åu2įÖv×¼ńļkĻ\cEl#±MK‹L(Ä3<ņ’‡H»ģŚ2Z¬Ą¦cMÉŹ¹źöÄ*ė ·ņÉómĀGXļō¤&luŸ‰Ź1nQLÖmCѧĢU»ūh­Ó4ŹZo®”ņ6ƒī‘ÜΉĄ‹Ņu¬ :Äū6É<Ä S“ājLCB’śx±t+°Ä•×w½‚p ¢ż©˜bK du•bŃ& “)€­³J!2&O’$ŠŲfģ¶ō–)~ąŸü ȕöŗŻī±'Ÿų¶w½mÓĪ-¹ŃŻn7ĻóĆvnūėæü‹G>ō!PʰA„L €įč%/~ŃG>šž?ł£¶uŪSŸüŌ{Üå.·<퓯}õ+ 9õŌSG£ŃJmב‡g©Ž½{owiŪżžä±BŃrś//üęČDNƧFĆ<ĻāX=ņqF 1&•LĮD»Ž?ę;gżpóü"3GK‹×ÆÆ-÷Óó~uÅo~é½üĒ'Üģ&Ÿ=ó+w½Ļäõ7Ļyńß|ā“ŸĖr³ŗŗŹĢ¢”ˆvķŲž…Ļ}FDłóāq{ܵ×ļ‹c(„:xóęīömK÷øūŻm#q¬¢^rÕå—=ķ±ėĘŃęÅ{Ҭ5)VĄ)7>ÉI7kńżD¶\e)KnrZH֞śŠÅó*ĖL°J}b¶uŽˆ•Ö„-[¶ä€äąQ†żĖƒµaŽ]č¢3wé5ūī}æū)”†d l.¹āāóóŪK/»ÜŠYĢĻE_üō§/üåł¬œY£1V} ?łÉO ”?¬ö×ūż¾ˆĢĻĻøöŚkY~Õīµ3æü? f;ĮiˆŃ©a7÷+1ꔛŽ,õ5ÖRĊGƒ¾9éč#ņõuhżč‡Ÿ¾{÷~­õĀĀĀ)§ÜX€‡?źQāŠ!cL&¹†0©pß®ķ9U2‹  Ų;ī³ŽŲļFŪqCģ®D%x[ģŽa‡ˆXJ7 šÖåtćņUoīZØ7¹±­©©R²Õ<-I~M›£š¼‘=é ©­Š@t‘Iyu’&ØŠ°…ĆXŃlč8ؐoMćyTÖś¶˜µEzį1Yƒ£==¶ó!Ųł}õ?Øm„bģŃVKuZ;ūźcčųģŒĮĮö?o{Ė?’Ē{ß«@›ŗQ–#ĖĶHć½ļ{Ņ[!Ļ4X čļßĻ@–eÖXxū;ŻÉΟq•Ē²˜æóļœxā÷ļ_püqĒ·¶—Ģ>Kf®S•Šźšk3› bÓ.¬×ĪŲpČqcwz= Ū~Łŗ1+wś.µęš^(7NŸŠµzP+¦…‚2óTŸQeäP‘/Zo-$¹`šŠõŁgŸŻļ÷½ėņ†ņvļł»b­?iؐ›¦ś9*ÆÖ“ż|ƒT͘ÄóŪ‹#™\KĆ1Yš;šĶzbæcK遦—“}Ń•¦t;\‹™/ŗč¢µ N'MÓłłłŽ=į®w¾KĘf&¤iŌķŽõvwܱm{¦sɵ2Ų4æpžOĻśÖē??Ų³÷­güćė^žw]V ½Æ}õ+Ļyžó¾ņµÆ¦¤U‚Ž|×=ćĻž ¦³¾÷=ŽhoōÓ_ž2ÕymżˆĆÄÖ!šÄOüž»ęHŽMK L²sēΤ·póŪÜ č‚H¤ w@HHńĄīŚ“©ÓåN$ó‚$ͶĘń½ļt›‹®¼öļ_÷O_’ÖN8éfąCÅłźWæ m’ˆGƒ$ĖŅtmeķųcOš žśgĻܓ؋"[(ĄŅĀÜ\'¹ō÷Wžū£CŒĶXT cFÆż»—w£ø%ėūWR­ ¤Ū‹lņ–7¼ÉmļlA;·o—’K 6‡ˆƒ"„!,‹cøįG†ēŽū~÷·;Js¦”ƒ,ęŁ×ļyŅ“ŸņńO}Ĺ&!„)ֈ2šŽ;a§'Q§Ūéō6oZŅyś‘¾’yžē®ōcĢę]G.nZ3ĄQ”Tu“–TӖķŪ/»ģ·ĒŸ|r”THb\%ÅLūöī ō ™˜ßżoo_XģuäöÕõ¬Óė./ļWƜrĢ®~ū[ߚėÅöī]ūŻ%— pģ±Ē‚ØĄH™)Ŗ0čœ:qą­`Ä:jŗHR$”b¬ŹqQZJ’ˆŲGx ‚¢…Ą Ń:ēynl[rŗų2%b?õĪFŒ!F¹|UūČ^ l‡©’_ūĪ–;=c¹°ö^Ī€­*āUڟˆUš¬øˆ[>ūomg-)Ó²³ĻõõIčäwP>6¾®äó ׿FDAuŁKŒŠi-ņ™Ö%„².‚,Ėl•ÄĪ|K²Ø–@Ū1½Š9VZ5&@Qķt`8cŒ,ĖØ¢½F_wõzßæ+ “Dƒ4døn-’ē·žó}žčA %ą(V0Ąß÷žP L#7rŅ)'C ó!`ˆ9vJėą—’Ć«Ž?īČ-[6‡Ć»Żė^°YMŃ2ąoĪc /µd.— `a ż³Å†SKžė°™¼<隝wRĒؚ{ó‰x×p8Œ@1„Ćģ{ßłīļ/¼bģĄsę¬tۊ «VSCCTµPŌPdœ+Š4ŗuŃ¢Ž-LŽõPøXłÉqĘĢ啘@rmmm0„oõ›_\!^ņ²—ZŸhėp@H_­Ŗß”ZaODÅv·×d±jBĶVõŚæw^%jĖ.ŠP{cė¼ÖÕš~ō£™Ų²Śģįvó›ßōĆž M!¢ Yˆp†²FīyĻ{Ś—?éĘ'żö·æE„ĶøŽ_}0 ¤Œ‹ÅŪž÷Fy©įŖŃŗˆHPQ¢ž}/84hqQÆr‚½Ō.²"2SŽ;;Ķ©žYÕ~”‘/±Öz„7+d͊7Z*:€ßG‘*(.e’ˆ1FŠv™sĢ16žÜ Ō”|œü˜ź£W HĶ¢ć„śQÉǶęxžZ“V µ¦C)‹ÓŁžā¢øžēZq1³ķ“ZÓĢTTÖ*N€Y–[ ™#åÕŻŻhʀĄ<īøćz ²,‘M›·lŁ“mqĖÜĀfVöģ%ā7æöõ|ßū?ē‘żé÷~Üß³²Š™)^_Y]_^]čå/xń=o{ūמķß¾ćoŚLj ¼U%›ˆ—ˆ{»–,wöī÷ŗ;Čl?ź°L,t{óó1Ē,¼ŗ ˜ &ƒčūßū{÷¬_ægwu-QŃźŚ`ėŽķ;¶l6٤Į&cÉšˆ˜7oŪzķžŻ EIÜéēYwÖUü‘Ļ”€:IwÉBÆF’/~ę“^ų«-[a®'QmÖVÖō€Y*baR„śżįĀĀ‚ˆ(ŀō××ęŌ'>ń ˆč4…ˆóš×½źæ’M"£į(r#ėƒ|­æĪĄ·æłÅ1 ø®¢g„Ŗ‰T¹0Ń@k3ķķtØ6Ņ +•ZŁgwģņ=ļvwŒ]ŸIč/k½g¤×µ¼é_Žfaķˆ@%¹2Y £D§Y¶g55ʤi:X[ĻFż’üčĒžło°Ķ?Z€:?öų“H)„Ōśz?ĻĶŚZæß>õ©OłĮ¼óš#vDZq‚š–&M’mßŗ‰£B”™ä{ÄþõõÆģܵƒb¬­ cÆ®,µsŪĖžüŁ?žń³,ÓZęēć嵓—DqoNB©'ņž?”ü^¹ŸJ°Ÿ”‚'©røœKR†§TT•«ÄT}~ a*āŪ$Óż„Ūś……+āEéŽ8śØN“@34į˟ł¼ę`R€’züæ”@·"ŒZ³ōŒeÄčɃ˜ēyHo˜ Ó×$ö4{«0éž-^ŹnĶiQ‘1īĵŽź]…"ļµÕxŅ)'ēFū¹²ŗzī¹ē?ń‰Ož_\Čņ ģ Į[ ™ĆŲ»o_®õÆ/ü ˜|裰;<A…|Ū2zŽ=ĒZ½ł£T©Ņ}.צµørēŚBm„®zLž­³Ž~å—ķ'­Px;–1³±¼wz6n«ÉÖG$+”ŖóŲšĀŻn—Ē—c܎)¤Ha¼vČTˆqźˆm\›)µŽI½÷-<1&·Åd¬×šp¿ڱcG§ŠHkšu‡eѰ‚PQŒ·†ÕLc/‰ą=)°õö’†ĘŃŽ\T4˜ø˜NöķŲvę™öŪ eø\ÉįąŗBž€Ębēzoļ.I";—ŗŻоŠUŠ“Ń`w”mx«Õg£Č!`q§):qbr Ė/¹üĀĖ~ĪMå÷¼ć½owĖż§×^ö»‹/¾ų÷ĢQ&č‡ūÖWUƃŝÄäC®¹c‡+°f˜Œ•‰b€t¢L§ų‹æxDßāÖ·diGŃp}5—¼3×YYß%ą8Ó Ä›»Ń­o{J·£––6w»sė«żĖ.æā{?=‹;‰%.sž±ĪXˆē—v]·w”ĮģŪ·ÆĒ[zÉb²¹·øÄ9ŗØ>æśe/ņ枠Œ"H¤ø“ ó…¹°ģ Īūłł0B“@Ģ=ļy÷½{÷2³­DĢĻ-n޼õSŸü$„~õ³Ÿ/_}Ķ’~ęKzÓŪč,vÖ³Õ„mŻ]sŲ֓ł9¢…yużžk†kūlA›P/Ż–ŖŚ*o"™›ėBDHr“Ū‹öŽÖe«!īu‹Mɤéš~AŽS²'JCgdĻzī³¶Ģƒ Ųe–B‘p,`‚JTü“Ē=bļņŠŠ"•Ø£Ž=j°¶ļ1§’± 7ĢÖ/ {ŚiWģ^]œė±cūŅ\oėā껯÷~Æyė»āī–<4éĮPSžS&œ C0ŠQÉ2ƒł¹ÅO>õņ«ÆJ Ż„n®ŒYŽ·ļĖgž¹Ž¦9t†lhrĀ÷śó¤ÓC!‚m}# ŲXdŲS̓ XÅœ©D0eŽĮ˜Ä‰×•ž§°–•APP—‰!LšÄūĮ¦Yj`ĄĀĢq#Y–Į¹‘°›±~Æ镾ĄEĢ€õœœÜ9'Q•Ÿ"(ł%’eiŪ±h“εčf±U )ŽNLŃė­$1V|ŒØč•õ-‡Ö@ÄńŒbå&§‘Öv3"*0a(jČ_Ē ¼qÉ3”3?Ų` 5²Āæ„m1ŒQ¢*ŒƊÖ²{ UæO’¾„k±4šāhŸAŒ0”×I˜*üŽVĄ&Œø\· ˆąÄ<&ŚNpm!†‘3@JÅdYfŠź©ģk3ĢōŹĀB“°Ų›ø£(ŽT'‰ŗÉµ{ööGęž÷æßmn{{š_ZZ^K‡YĪ*žļĪėTÆī_…āČr70·“IX]·{Ļś`³Ś¾“ł¼Ÿž ĆČE2£¬µ‚sĪ9»ŪQZėn·«Å¬õ×ē6õĄ$L‘@ ¹v ×֗ęęYɾ}ūl%1Iŗ€lڲi.Ę`uͦ)Pę3Žüę”@N𛕵ž ßĻÖ·9õ4ō’žÆo{ĄŻīžŲG?bĖ–Å#vn®÷™±¾>Œ"•ePq¬āD©X ~ö³ŸĆõ± ŻĀˆŁ>m+Ā"–·BõÉŅV]nD„Ł®õń A˜$I¶nŻj™¼ZĖ(Ė31|äc{Ē;ŽQ£öT,7€{ļæ³ŠŠHe™Ž¾uūÖĶŪL?•\‚0ŚÜę–·šKųŚ=»÷®ī˜tĻśroÓ"Č ¦ØŪ͵‰ŗ]k™a‰g¢0ŹM®séŒMĪ„¹»°łœŸwĢqGrM­GBj˜ę ó=’„AĘŽ9ö(oiéyrŽ[˜B)ŻŗÓ¤Ó‰‹ķ±”£kJź4ł–åł4!ĒqĢĊ3eY éÄ®%U‘ŲĀöog’kjČUČ K”ņ»JéŹVŲšNaj–žµÖY–ŁŲڹī6•m€ÕnOAx ”æzXšŪ’¾² d®¤•ę¼;œøcj²‘³izk­=`hY”D55G1Z¬W¤bŌ< ×&4„ń…f’¾£ŃČćØ^½¦»[Ö}¤Łś‹*\ø¼nž_~ńÅ?’łĻū£L¢xĻŚ`uhö°GŲG_ČÉ#ϲ_żā<"†v3Ēžp¼Ć ×Wß"P|Ņ©§ģڵ ĄóŸ’|O€2Ö¶«¢ó\ŲA;ļ%!Ė2cÄ'60ó©žš6õ#³TōćHDŅ4-~gŒB –Āö‹¼čÅŹ±^077×ķvć8vM+'ŽĖ_žr{õ śē7æŁļ!Včø`j±6ĢF‘qŠśæłł/ßö†·¼śÕƚļv#õźWüŻē?ó™¢[›|"ŠbŽLrßnęŪ§Ć­`8ɞ(v¦Ś‚4R(ö˜ĆŽ8|jadżżĮŚŚź,™”D}[ėT“–g-ÕŽ“FDē^:«™šy”ˆ”µfŃś“›ŻŌ–śĆį(×R‘ģ;OĄœĘ„E~i‡Ī!˼xłNīž=²÷Čx m?ȏš^fōY æ¶°Žø0½µY:TNņ§É(–?ˆ2ÕF°³|~%Ń(5ś½‚æŒbi9§’µfœN³§¾]'¦ÓFsŌp1՜ÉZT©Ö|“·¤®1F“m0Ž"X]/¾ƒerV\«Jų†ˆZxWŪnfœl ¼ķ_Łk ¹:eĀÖ¼øż_i­E €>›±ū’=ą ½G§ ՈĒßøC4¤"öA¼Ö¦€˜˜˜)fŽŒ¤išā÷‰En*Ča¢Ć Éŗ¼­®®Śd8˲žŚś°?J‡éĖ’öoĪżŁOar†Ąč\Ņ=ūÆfCŠhuø¦Łh•›HsWRÉX8B™ép²e~qŠę£|muø¾–žńCśŽ÷Ē?öafÖĪxĶ?{ä•cŲ޲|­?XM`¶˜Óśś:“ŗÉi7æśŖ=Ģ‘¢Hķ_Yžņ§?‘E%k-0śą?ęŲå}ū !Ķó4Ļ—WW`4)£!ęU/{é§’ū?z‰‚ģܲEt¶“0—ēiž§ĆĮzžįS’õ1ŲĢA°¶ł“›ßź5Æ>ćŚ+ö%#“^”$¤¾’żļoŁ“š™/}v’`yūę%’¦Ciĝ„“ĪŅÖEmŅŃhDĄmouk+Øę‹DM- uƒĶæŗC Yį "f ÖÖ¶µŲˆČ!Œč~T! Ķne"rwįŽw»ē×ļj½wuõŖė®Ķ«_ĒĪŹņņh¤/æüźŃ(ƒāÅĶ›ŚPŃŚJżüģslOIsIMÖĻ”°2ÄFq–§C݉9R‘ónj[…dՁŠ—vv—»ß{„Ÿq-.-„y¶u˜ēiƧ¢ˆ£ˆwīŲ2æ°@„4M£r.µŲ ‘ß1¼¤0εń…Å?ķr W[„bŠPØv¹ ś†GéćČ ¦@ X& ŠČ²„G“I„_ōõŃ„2“ƒ„*öŠU'īXgWF¶ŚŅB"ä{zKzmlÉń­g“”=ĄŌ~8µ—nŪ ŠŌĀ8 śā’ķ{87ER‹w x(†RN‡Äo× §‹žZ³ŽjšŃRY +Į‰˜a_Œ’x.ŒśŃüüœˆŃi:×éDDs]µž®ŖžYÜŅ]ģĶy8æ©;" €÷|šß>š‰O>ńéO[ܶU QŅ·t·¬fYŖĶØ?HĆqōß½ąE÷K&Ģ/.@Ń#žš¤=)ö­ö³TwĄq–]|į…O}ņ“ż”“˜jžg{®»ž’ß’ą••µN§›$›Žō4DF¬ųKzĒŽųÉ’śH>ź³É‘g£tŠéÄ"ŗ+†é&ńi'sõ„—•9ĻҼ&čN²äx”åQēĆĮR³eÓ6„¢µ5 śkūY!éD»ßµmĒökw÷AQ”t8NÄūöķ³—©ØRµ3“HEQE5A¢L‹fH±£āČr9{½žRŖ,÷sōŃG V†”&NE~ž³sӁZŃ 4’vśŸlŻ“Édfe÷ʶÅMŸżļOž’½ļoßŗķ·ē/ėżåk®†ĘćżŲm[–Ōb¢Y‘”¹¤wĮÅžwž¹†‰ŗŃņž½Ł`ˆQ"a˜D%% Lš3•šĻ(RZ 8zėŪŽ© ®ß½¾¼ŗ²Ś,,Å"’¦:Ėr­õśśŖ˜Übą3mPÕŪā¢OŽc€“©¬«·z‰ŽŚ‰C!K– ¤Ž˜®ķÅę—6ō'±öķß䕹Hd¬{y½s®ŲL$k5Éģgcė«eČĶZ0“óÅAąÕL\ QŹķ½åzśŽö? vĻ؃¬uVŁŌĵ@ŽˆČŖ~x“ˆq$“F–J͐Ģ×UóÜ“ģŠRæŖöćf|sŸx„?ųm+aX4œ—_ūČŠ„£J旖;õZ6•ÜŅė(F«Ė+1ŠIb›,>āųÓē< P°BŚx¢ū„—^’Fėn§3×éžžŅK“ļŻ'乩”䈈"@Aų¶·¹żö;²,s}BÖ±Ø -—Ę]6{c’7ī$¤8JbPK;zküÜ r t*ilkµīŖx’Z„IFƁŖˆUŒŸõCˆö²ć"%„”‰ Ņ__ūĘWæ @86¤„8”i@ēéņņŻž}ąƒV×VŽŲµĖˆ€i˜łŽO|Vˆa Ä\DÉd‹ į–BĢŽ39œĒ„W%“6ŗ6oC½Oū½«Æ¹zeee}„#Šš©O|rF¼g*GĻ3ą|äc}CšåȾxäNMĀŻ4²)6‘ˆ<ń)Oé&¶×Y¦ßńŽwų-× ČA+«Yśž›js[ie„nģjˆģŠ:ÓlŌY;ÄŚp^¢’į aź 'bėąĢ¢0tĆCÉåR­Ÿą¢•×ńܚ¾‘ć»"®œŌPĢ®Ģi§bSćh÷ż)O­ B¼A«BYŽéØiū6ū<™0§Ė8l ÆÉNŚõõu’MĖĀŸŸŸz³­µ€ŚYėĘ ‚Y”·§īQa1‹¦ŗņV6ÆČChvJ‚§·øĘfr0q¤lķČbæV]ČÄA Ź)ü­"Q…(‡ÖF“ ŽĆŠCE“Q½eĖ–,Ė”RėėėĢ<—÷]æcŪ¦ž`mó–%&)I’hqq~Ēa»4d}8<ģČ#WVśżž ß0«ķŪwĢ'½l0Üŗi^éģŲ#Ē[ßųżļ|ķv·¹=“0™VPŠ"€_ż÷Æī°JTd;ŪužÆ/xóŪŽö7Æx©ļ”»Ćmo’žwüĖÖm;÷-Æ\æoļHēŃE^`µ ‹HĒ·¾ŻmwīŚ•CȆ#|ł _˜ēī󟳧g~ņæßūÖ·>čīw{óė_mś«›ēŗ$Ējß¾=™ŃQ'1&gF¬hļžė’ē›_łņ> Źˆ8ųyĻū‹Ē>ņOL¦ē{ó+ūö aØÓ•ĮŚZ¶60ĒŃP*§čŠkÆ»ų²«~wɅ»÷/_·gs½·¼łĶ%Y,·² ķ³F‰†Uf ė"ƒĪME¾w¦fŚg×83C)’LL*ZCī~Ļ{b¢hŸ2L;޾Ń5ĖĖė&‹»Éå{®æū}īł–|}Ņį³~ņƒM[·Ų.Ö£?ay:čaŽ”Öi_nwĖŪ–W²µįOvöÜB$Čók~ń1;¶«˜XŃ÷¾ó­H‘mŽ,œP-,‚0Åńņź¾»ßóĪ©łÅ.˜ņÜŲØ4ŽćĮ Ļ2]ģŁ‰‚…Cb›ī‹žÓ²“lC…ɵ(õ½*Ī™ü“/ė"•õJ>`’Bō" '³¶²,t¾mó¦„Ņ÷}äćd׎…A”?tĢŽŗÓķn£@ƒµõå}kI+b*4ķ#åZĖ}źbū±¾†˜ø“cА õ±¤ż–šo»†©Q…<tńthĒuÖ>Łf)|¶HĄV 4`:sŻÅ…žŻ[HĄ‚ē?÷Ļį4‰'ÅQūöļ)ęø±£õ¾Šva°ąŹ£bņ£Ž¹ŃܖĶ?;’œA6"ąšė®%¦Ō@āŽĻł›ß\x”Ÿ–mķč+ˤ²}YtÕóņܘƒ,ÓĪĄ śZŹ×Į$hˆŽ8ģš'=ī 1°Ų‰ē’ØcšÄĒ>f„¹”ĢĀ‹yv@EN§–×4SÅɘėäųмƒ@ńgĆ4õæūüē’ŗĪ<Ó^ŒSWž&ō=­~ǘ”OČl[7ō#ų©0ę¼Ī„ŌtB®2!—õÖ'æę’ŗ÷Ž“äŖĪ†Ÿsļ­źīÉ3;›µ«@$!$‚DŽ" 0"ƒI" “żb°ŒÉŒ19B– !Vqµy'vŖŗ÷œļ[U]]]ŻÓ³+x߯óŪķ™é鮺įÜžó<żę>caÉĆ ĢĖ?˜Į0įYń#2=“ŒŠČgµ\’ O(œKö»o(z =2]­C&{pU°ź•F9iīŠtÜŚ+]Ą]»)Ļ82ÜäŅ”ZĻ)ĮY„ÖیŻūęJ)Oń—-ąĮ’ąet &·Ž²Ć0Ówm’„™Ī~õjéźéʃßrŖ-Żźåł,)ē‰Ļ-@nÉRgĢū䣇ų3.¬a0³µ®CÜÕŁP]—WõŌJĻĻĻ{¼Ł† ” ĀjMvlæ# ĶÜܾ„VCU„įb«õē[nŪ5æxĒ\tóī}S[¶>öÜgoŚŗ·żł¶Ż\«ŽOÅŠ0•Żūö>łÜsO~ĄF&§Q+r1ćˆ-,ˆĻ~Ś9j¼ā“R¶¦\wŕpÖWÄĻ}ÉĖP­LŽŽ…JTĶ ¾6j,śģ»”ÄFčj叾a¾Ž&F‘eĘŗ©©© }óæ¾ųʽą 矒‡«. Mk©ĒķŃŃŚb«mß³°w’\XiŶŃhMŒŌ6LL’źĒ?…õ[PƒŸśģgŒ­[»}iiń\µ‰M­¢ŒVFG, ™`ūž„‰Łµ8ū13[łĢē>Ē@Üjsl×NLóÅ?¹Ø—k'Ķ+„z]Ż57$©.ļ+w6B–ĻÖF¦$wūķw$K‹ÄsõÕėõŒZeČćя~Ģ‹^šüØåläŒčA±¼ż­’ō ū=ąłĻyīŪŽüf0ƒĢÆńėńÉɖ…8Ö¤¦BU^öwĻĖßxüńĒ_z鄳ń÷¾’ņæ±]n*‡øąż©¼ /y–£ŌėJķ[ßł®u<·ÜZXŒb뻨ŁXpĒķw&ž å »iŹ æ³zdĖ`c‡Tü H_hwƒ`­KR^®ź*«ę%W:ĮpÖėœ4ć#½rKI(ćīˆ?eגJģ²C«÷˘÷åG¤Žˆ:)”aH³Õöw—5Óę˜]©ė«×qœœ7 |·§IdšÉ[üōż©jŻüü¼¤Ę®¤z3aIy”v¢ęœ^D÷ų[YJ½ģK«ģeéōŒ„ܟ$™»žh’s§‡ 4B"ĪŚv»-޽“O/[¶ķųł/x^ŌjNT+ٵwnŅ÷ü")'|`"'sŖō·Ž¶Ōˆ”ÕÄŌhh AIé mźéR‰ėęŽ&cL*#ʽ·ļńźŁDŚÄŌ{4—’÷¶^–x˜Ż¼č½ £Õ>”RD¢5±XŽŪF«Š¦é©1_.¾ķÖŪ”0Ɩ§fÄ÷¾÷=żM‹`|jĢ_łŹ—Aš}&T€v rŸśčĶ{¶ŌōT¦G0©1[ FĒ‚x1jÖ&ĘĪzȃÓ{Ŗµ©¾L..…(éŹ²h-5• оͣƒźĻ€d RRd¼“}ūöT5ÄĘ2Z1O~Āć ĐŚČźĄ½‹Az²lł0jmA”ų×++YĀ…łŠ-[TŚ;Į}O½V€"5$÷Ķ`Ü®ˆØšÅū1Ī÷ڲÕ ©ļ§īŚļWčć8/w“* ü€bZ)°³@”É®Z4‡ ÆŗŚy aaŸ,NńŪ\4A¹Œg—B#ØŪŻ/½Ž”«¹ĆY%=_9$ó`jåÕʐŁ¢[Zģ`0 "ƒz’@é ĀĢ]^–§Ģ3Ć­ø%—ö,`§K›ė÷V¹Ś»Žœ»>ż­ZSRD*i č\'i_RJkŅt\Y‚@DØSļfóhēĢyīøS@½Ł4”сΤ›˜™xB ®ĶC]¢‡vŲĢĢL«ķٳĻCD R&ˆœ kUęˇyųéyčoŚvūÜņĪ…ż7mßÕu7æóżÕUWßŗńµÆŻm·Ü"q“frāčĆ·‚£O~ōcp<;;Ū\lE KbąŒA1`cŪmXq¼w~P &ʂÅÅżŅXCQ’[Ś»oNU«‹Ķ„źxMƒ'«į5WżŠ=·¶”ˆF„¶łˆ#vĢ7Ś@½Ł^^\Z;91ća°~züų£Žvq4>5±q̱ćkÖģ]lčc>łžÜ·“Ņģ°ø°|ĒüŽw}ä#W_żūĆżčĒ>žQzLd±qó”N°ŌŒźĶ(vԊø6>)•źĶwĪß÷ž÷¹~Ū­’łÕoōą‡?¼‚Ā\_^lÕėÜc!VŅOˆR󄙮aII}=gu¾EYk„Čóž÷·Åå ™Ū³w‰š ¹¤>šŃ­Ż¼q¾ß¶o_Lˆ€6d¾¾Ō’éśą gĆpŻ‘‡-¶r¢VÕgæłµw~š}gœvŸæ}ö³*µźcĪyĀ7.śńžØ©\ł»« $ž4š&"P`FF_ų’W*cb† ”űl޼%Ō8üČ#õ¦āEÄTTČ}ĮÕ„sRho¤Ŗ»Ž-*]½ŅoāV¦Ń‚Dz¢¬“ż¼hPP—Aųœ“8īŹ” Błlc‰z\R&Jśō“¦j5L.IŹwZJ§NŪū£R>źTq—`Œź|bųkwĀŗŠ€\,žK^­*M=üĆ?üCŅ;IŁ”$Ž!ŠOķv;;•œ“.'^ąūs³,IĪE”nb·H‹Æ>ål~Ī»M Œ)9¶O}Ŗ”C44‡¢K𾤤õÓ+źyé5i_USJ˜ IķAŻrū-ĖͶ±+Cœx≠ā¤MÖ'^• * ‚Z°qćF––ė{÷ÕGGGĮāvQų–I?våćr¬±Ł(e“FYI0Oq”÷^²P'_ Ķ>·³Ņmž¦8Žć Éķ PŠ” ‚-›6ąŚQ… #¶lxøž†õ;ßūīÜĀüæżŪæ*…Ÿ’üē·ß~ó±ĒŸb&ė –‚Čææ’½•šŠŁ5¢8ĢčØŁ°qv~1:ńŲĆ?öwßxݵŸüģē 43H% YÕ°‚īrH!Ė–ŲUė¼vĖŗ©ńŁÉ±ć<|ē-7#ŽĄN\Āāę“)’.ĪLē"[×[ŻjĻ¹ŲŚ’ō⃬«å%‹{ķU)ōµŌ•-}Až}z™Ø“–"õė_üR†(PJłJ>‘§„ œPU*€ Toø›ß „£“ß<jG«č ”üé%«õ€ūś}>,æ‡WŒ[:h“Ü•÷Ę’+"ąóĒYŒŃŪG4Lµó€!»A—®¦Œīz×°h­óRŻ>›;$:€ŗ): 7Ž™…2Hž `ņnWƒdu³Pަ•‚ℱŚPpųRy¶Ų:c5³ąnśŌņ śg9š’ō^Y¶~H±čČŌ²­ēœė4ō&ś"όŹ>ˆYœcv©ČĄ,IyIRā_)éõČ3“y“`Æņē/Ź÷fGQģ_˜ÉW«Ué¶~ŽZc2Y‘’,†°e·kĻžż Åå„Ååśr£š jµ ™ń‘ń±±‰JXū?oų§~ⳓÓįōŲČ4D‰S„BĢėžéõ–DĪ“¬ģ_¬/Ģ·žĖ_@+£Ćźh5¬ÖEJ§”F ļyß{hŽćj µ°rhŌŪė×Ģģ¼mpĄÄŌäūX»f¶¢Ē|Ż?@ĄÖzą[ēB^ųŅ—F€öąó…¹µ–ęlŌ¾óŽŪGFF“Ö¦Rżć 7ܶcßK_łŅsžńō×¾į ¶4ŚQĢ2Ŗ*`¼:›>€ōłÆ}Ż‹_ń’ożš‹Œ™ ėėÖRĪµä¶ūZm÷éĻ~ź'?ū9“[[›˜0Ę˜ŅŠ*Aˆ•°ĪJK%Į¢(ņ9tkų•ęÉN:ˆM¢7½éM0»|öŚ×¾v°EŹlß«_ó­CT«Ż÷“Ÿü¤=A׏xįžē›“k'Fgʵšd„2Iv/ī»qū­¾23¤”°uėa  %‰_Ōk@Śū³_łŚ×–[ÖT“µl­sĄ¾ł}mĪį#’ĮÉAżŹøū:p–ĆŹ“ū€ŁYVŠ˜…ŌŹ;i8–N|k‚ĄĒfژ„¹}Ļwf÷3£>&ńŹ«JŠZÕj•R~Į^7 (oKȘ J2w]nby›’oåķjrNōœU–ŁĻ©Ź¤_.Ōäs}³E Ø$õŸųDŅlßæa§äszš‰˜¹R©ų¾$`ćbE]k„4Y묵^ß!_Ń*ŗR=MÉū:>•™ŗ1]+-ÅšĒqœH@kŹå[į/£Sõc›i"ē§I+æ?ŸżÜē0Ķ„04µ§vZ÷Į g<Ęīy÷{° ƒ©™Ś’|ó/z1D”Ö JĀ'aśźY¶~26ć ŗ’1įwø!»—hFVWĄŁfÕB)ŅRŸ9£ŻĢHݳTWƒQi}Żc@iķ„4£ĆCō`b‰š‘@pÜ1ĒųĻšé‹BóQöØU«ĶfćYĻyöļžpåG¹fķ,”JH9„­2N™FĖ]æmē¾Hķm£Ż¦F¤—X]uӎwæūæ¼ōмü5³·TjՌżø«_²[/߄ØH‰8hųŗß_„…·lܰ¢ƒ‘˜ķžż{GŖµńJķ©ē<žÕ/~aTŸŸ›ŪÓj·¼ ˆ,ˆ÷ģ<õä“båźĶV}±¾aķģļ.½üóś”ŒVk:µgŠf!,?ėÜēœzļ“MĶ8ÅK­¶ntŖ²ģäŸßö0ė(ŅζåŃ œš-·Ż¬35½öś?]ߎæO‘ +£½ÄŃKĻ{ł ’ž…{ć=KMŖTŚ@D¤GF"µm«7+#aL²ķŽ]O9÷i’ņ®÷ĆŒŽż”3$ØģY˜8Š¢ÅfĖ{öīüć?ųĪ·½]bėCĮ5k׿÷ßßča‡>ģ!X\^n:ܾwÉė6Ķ~å›_ż›ēūyĄŚõ=ī~3ڌFŒŃŃpz¤ö˜G>źeÆxłwæūŻGā‰ź·¾żā“ŽĮæ?éœ'Ü~ēķWüļ•A„*Ų&JŒ źļxg³ķšĶf»ŻÖ*€‡ŚŃ … k-:éŃ"—fĮ|y¤bŽV8ē¶ļܱaÓ&0šŲĒ>ę„ē×Ö)Ī„‰ķéééG>ņBp€”ó,²„[ļÜĪq“5$óōŠ…zėĪż‹&PBŹŹ»°S“ćVPo»ˆa×­=÷Üs“rY·YĖI‚į{ßžŽöīŸóĮTut4Ś·Ō~õk^‡NO—ʧŗ;čŒī¦†„„V’šøĆ±œn½’+åv(¤CV ģ]‘aW-ŚļM„(ć‰É€‚e0T0¾nM¤y!Ŗ»Kļzß{Q†“‚‚„ĖäDĉF‘@bq"(‰°ö¶pšĮ±…&ˆ(0ŒÖ’@ā•ƒ(h­HÅķéödf8“dĆ*KāR2Ŗœr{ęyÉ„re–ŽŚ”¦ ąŃąDžŠlä»ōÅ(‚ødIœs{ŲĆPŠDNBEWżļpÖCß³¾ōœĻ©¼|AC¼¾1²k–”÷E)LNNJāóĆcČūø'Pµ „e‚”UAY;ė‡ +H5c$ØĢļŽ{ę<žČcnłÓŸ“õ(€uŌaÖ˧‚6Ūn¾ÕA€j5\\l¼ēļ Ż9ÄRĀė$Čuœšt8&gIųĪ›nŁ}ė$€cŸ¶v¾{‹ČŁ$ą×¤ˆ 8IWŸUI¶‘oōJx’ ·“Ļś:ā+ OƟb”RЬˆ& ŁnV‚ös·*O5ĒeõŁē2‹d ?¬Sš÷é3v‡ÕĀži W~?z÷^h{”Ī6$jzµØļl(„3åȱn"Ž­H‚„ńYZFę#»<aw£ĶŹ gøż‹āK§/ ‡¾ü÷\Ų”ŽWģ%–ž4`żZ)|"&K ķ >3ʤx*ųĆK§ZPĄf»ķćĒÓ#śŒ1yDQĒ6©+‚vīĄ™r0ż{éµ:éž÷ÄqLDqäZ­F}ynĖ!ėEœyߎ9EąŃ1Zæqf¹¾xŽyē×&īqā½·l=āųOxĶk_±o÷Ēŗ¾Ŗ”ȵŚĖÖŚŲYĒųžŻ§&•M æųŸ_Y\vĖõ„Jˆ0Äą>÷¾X ȌϬyÄĆf”LLĶŲM®Y£Ā E¾œ†÷)RūĢgėqć„{?2]½īĪ]—]·mĻR4R Ļ=÷9Æz鋾ōē×oŽ*„”h#Z}ā3Ÿ[lq-¬…šŲŗF£i­ąņĖ/ū|ČWó|&[€“O=õćŸüŌ‹Ļ{Ł}åk³6ŻzĒŽĆ:–ČxÕ_RIŲ6ÖˆbqÕjUæžõÆĮ<[ĮĢA ³6ŹĆzW»5<£ęŪ·;g™ķ·æó ą:@w™“»łž÷ææłĶBˆ„- +a[ų¾÷=MUĀģ5©Ļ|ž —’īŖ½ōűұpdŪ1Äū—DĮoüĒ7pś}ļć‹f”ė¹M|«Ӻu4!Ž ¤‘왫·cžŲG?<65öz§Ŗ·ō@B`Ź÷äJ³.äY Ņ“i–ū#B7#^¶m{æQ"vÆJ×ĪĶÉ%ļE‘OœŁŲEķ„ĖYV:IH¹|®Šņ’?ŻEÄ,xÜlš(É^ßGā19"UZĪķÆPTņŌT«U‘‰-uj+}¬z3YK‘„ŗLiŖV«ŚØ|ęJē@ŅZ’ŽŁ­«„i<ɓP¾4KżNÕįŻŠ|“b(R¦V !źĶ°$ž=ūé#„ɤāż®?‡K–÷®¼ņ¦[īh·Ūķv»^ÆW .żõe„%„uÖAŹĢ¢ FYEN)(śāg?·sĒžJ€„ń‘Q0Åó-ŲĪä0šœe|Œˆ üv† RŪh„u`@DŽŚKMÅŠžł"f b#¼ iåł#"CmŪnøń÷æūŻūßżo›FĘgtP#š­)¢ŠŠ(Šf“6ņ˜G=śE’Āė®ż“"•É^*R6Šó·ĀC›D]9‘LB€“DZT_žž×æk!¬…_š¼æŻ“n¶V £FF*–å?æ¤Äf®/Ņ0‹G¹{,Œ&Ņ^ŽÓŸ%’ ĄĀŹOtįņrTkXŠššG=J‹Ņ—ē[5% [ ŌU0”®V!ąv»mŒ©­Ÿo-ÕO?ł”Q­ŸuĪS³I”)©Ę:X’ė<ģČ#uĪiĀĻ/¾øŪ[ö䌾5Z“xóźģ…ßłĪ‘6nŸ8üØĆ·±õ²Ė/% RŠ!ژŌj—²Ø‹"!N‹FŲ7ō&ü“Haź š±Ž!Žüż Œ&)’7u”¢{żUe48óA XŚ³w„” ˆ åŲą‘±ē(ō”ŒC7[ņ0ĄŌ¬‡Ž+VŻ%ÕČҘ¶:;Ą›/č$­D=cPåŸdö^€1:+‡”É /9\qĪ×ķ(t凌äKÉƇ"½¢GCĘ<¦ 70(-×čöņ„÷ėN9Čp«tĆz‡ä!Ń ™ź’ļ¢!ÖæŖVA>WöśŪĖweoøŖ$Ė]’‚é„ųjøČ{Ø(ĶÉdžgV4J …fBÉ·—øŹ)‚ pĪy͌^ēŅ»ęŚ(_yĪ®AzØŃ2“£8>ģšĆc‡Ååi56>¢«Õ] ·õ„{~ĢŻ’|ć]­Ę€SŖŁlNOTÖVĢżN<ęš5#ėkX7”g'«ć• ±¼P u-¬8+¢ud¹-xāŸ褝Į‹@0{üŌ)|ĄżüĄŪ÷5ö.ņb„zL1šˆĒ<ZœÄP,$?æģ·»ėhŲŖ®…»ęö-6ć÷¼ū:<÷¦NźeL¦ņåÆėO7Žü§ė®’ūßwÉ„æśķµ×¾ļ“Ÿ|Ēūß?³q3Čt†Įŗ›7ŲßhÕc‰Z. đ­h„€§=婞h#Ņ‚(g¤½€;9ń^÷žŻ°Šžųt–½+¶õČ#7Æ_@ˆŒ Ų¶ķ&ؕQźōę”÷Lé=×óOcĒqŠ)R ”T vÆĖ9HxV„ˆ®žĆ<8@½ÕąßłvģL h*8äØcŽóĮ^ł‡«×o˜=ōˆĆü*Š‘ąōÜļĶ’ōÖŪo½±¾4__œw‘õˆŹlGäŹeĮ/~ń ŒU”R•Z%˜ |Ī ^˜!˜„OPAŌĶ—ÕõÕF!ķp΁ˆKŌ‰{• ßŃqĮśĆ\M¢Gj‚ šÅaĮf±Ē‘MŹ›’¼²ó„:‘ž¤×$ŽKŸ(Uß÷bÖ¼$©’‹–nP[i•xy¹žÄNNÓ(ö kÓ`UyöbAģ¬ŹPß!Ķ)3ueś28võaå*ü²"ō¬×5- HϜŽOß+Lņ՗£såIQZ•GßżŠdis”˜/¹ųgœ“vģšm *•ß^}u­VCN}J)E ²0LšØcO:I005›ĘFgĘ&˜‰ŖØ$ØHNmQ`÷īŻlļYŠé:K©| 9aŹxMČ'²€\ ” bńœ~¬C– ćõ/zŁļ}Ÿ“O>łü×½n©Yo³µ@·“Ņ"B Ē®Õn]xį…’ÄĒOøū ’žŽ÷ęLĄ7Ą!Įė#‹VN’(+‘õ"¹ńš«ßóžĻq[·>’YĻÜ81ž¦óĻ÷YĘ=»÷; Q$”ĘM7Ż„äO’^bϹBėŅ]Ē> ‘ÖēIą)æ91@āN;ķt¬s¤Į@P­¤mX”—\Ž’māĢŗ =ōgƒˆF&jØ¹ŌZ GĆÉŃpĶXxäŗµ?žö×ļqųēœ}öo~zq‚» Ģ’@¦¦¦Œ"ĒQˆwnߞÅĒI(½¼øDĀ®ŃxŲ™8ēIO\Ž·ķÖq6m›¼ąmoG䬄 TŅ®’Üs¼wī śČĆĻø?9!‡0“`3:ź‚X8ó{öŻ|ż»wl[ A[ŪK•÷ś7¾DJ›¤9&•Ą2–(é’Č Y\š+btqBōž0•? /üŹ‚üÉš[~%,lbq\x’ümsa¹ēł“Té ósk9Ž];’Ū®?ō_.żb±–£Čy›«īkęĮ3xŸŪﳆ_Žaųifįõ»żįĒäĄn°šŪ v5xņ/ĖļP’š©ØŅ_Ą¤ųż"\2½ėĒærćp0~38ąśŁvļ_pĻ—¶ābf›Ū§®óž½«% —~“9¶¹+q]oŽyeŽtæļ ĖĪ;nÆ36Tp·5ÕćgkkDZõß_öÓ>ćģ-Ót܆Ś3Į¦‡w_3qŸ­³ĒL˜{­½ēŚ‘3¶¬æ×ģÄIk«wŸ NXS¹ŪڱYĀaÓc[f&^’Ź—³k wV3‹æäćŪÆxŃsļsā‘ąŃ>ķ™ē÷\s— ɞ;ńļŸ|åG)Ż/µä7¾s®ė}z|•āuŪ“®?É W÷čń‡¤äė¾ęŸ8'Īål¾+^s²B]ߟ$F.÷Ćt~K\ŠģŌKž°ūWĪ9kmыv,Ž]Ģåęāž¹­ėfG `Ra&ĄÖev2ĒĪźŚ½{÷ī;wģ¼ńĘ{m9ō”õ®Ž^«7»¦TA³#3Ļśó.ų·’ķÆó’üņöo–fknūby÷wF­¶¤±³Łftńē?žŃõ“!š•/~I, ‹ÄöOæ’żö›o¾ź²Ėī¼å‰ķĪ;¶ĒĀVĊDģüJ‹E"aaw·£ņQŠŃc“k ŹlŌĮefP‘ ŖDO„ˆ+5­FÓ ‹9]„œŁ.NOæX¤G"Nœ;lĆŗ)Š,pŅś5§~čĆO¼ū‘Ó“SĄŗęص3[kfaĖX0lœŽŅĶčD\~WśIłĆoÆ'wöf²“’u ֟nÖ±~Ķ(°n4Ī{žß 'ĒĶ0öĄöu,Āq{ĻĪ{mš½÷ęµGOW›=n¶¶)Äń³•×TOš?n¬vØ©mŌįęZ0¼õuÆuĶvr ˆ°ČĒ?ō”q`ėh°!Ą ᐉŃFs±{—ef܉sßūŚo™™š¶T+§l^æYaŠ0š*į‡ßū¶ćv!ØI-q§œ|’ʀ1ąÓŸśDģ"æ<8·I“ĆEœŲXZķ›®¾&B Bō¤Ē>Ö«RO5’Č<^’d’žżčä$)3eŽdČ÷OŠv«õGū…Ä™õ÷V`µŃŚĮ„Ķƒ’¼Ü¤śS'}AHΰ”#¢®'ŁŁ}4J;k9ļšX˽‡‡\Ԋ‡½UÅÉSołÕ/~‘đıd.|.Dgf‰[kĒ*Ó„cįl­"±ķ]“½.V_w7r™‰mm qÜōč‰k'ī1;~ź–©ք'­ OŁ4zō¤:qżäńcc§®_ß#·Ž’„£Ž?t‹Ų®ōī?¼ō¼q… Ö³gŻū$vķŽēĄ9ē$¶o~õ«& OŲ0sōxķ˜ńźQ£įFąšJxųäčń‡lłæĶĀk­°HIlŸöČGnØV›™4š„’ś|,¶7“¼Oœßb±4gŻóž‡OOW€õć£U`ĆäT×jxČfeKē[h£ēļ¤P“HęR³½I€+ژRĖłŸ{žwf†T½ß{f„C#ĘŪŪ½™påeTųŽZ›§§ī„ęź×K–@ ź.“ŪQ)ˆģF圸Ųc‹T\5ķ·‚Öŗ¤-¹ū[É··IN–†¤0x·ÜxƱGS¦ĒƒĪ9޵yē{žż™Ļ ˆ÷„/|öŃĄ žū¼'=į /zÉėLML./.hŠĢFFF¶ķ©vŌ!;wīœ[²dpŃO.>ķŒÓM$7ęµĒŁ©õhćXk­ČkŲ¤=µ²Nq\ģ¬ÕÄšJ0dD„H;'ZS^×'£2`9ÖJ“(æŠXvZi?©FØļ³µ¤ŌĢōōĀĀbEˆ!¢H)³™Ÿ[ō|ĀĀ™r‰7×V©“UÉ1”JÉP˜Dśöõܧ?M FƒĄZ C/xɋžõż’1`Ė' ŅÉ}”ߚÜŻ“ß½;ŗŌĘś^_?8©0²d§’RF2š!±0‹×‡ńLižõŠŁ8w@œ5Ś&[•̬<)°Ņ¢¾õĶožĶ9OŖjT­ŃRŗŽv;vŽ9³v­‡„&Ä®=F į –;ARN‘%Ł~ ¹TĄ¹ ¶*y +—lmæy[Ķv„R!*9¶<»KAZ‘ā8+0¢(ŖTCd2”iėƞŻ{×®uŽ•RĢ(:5” KN`/#õŌ=ČŪT%(“‚W!čaŲŹzYK `ĘBŽ!Y¤¢Ģ7B?ū\XŲˆ¾ōÜoó(żPޜ£ėĻ›֒'/•^Lnƒ ēœļ_+Ģ‘ŸšT'ie<ł ūŸƒŽ3‹µVŹóō ŽņÖŚßżöŠū~†ļ¼7!±£o½yݦ­L"":§t~Ś ÷øéŚkfĘkäøŽhW+¦e]ŻI›ąŁ†˜1ĘĢ„$>˜0FDźĪ šˆG=üӟś¼‹āu6 T`ŌĒŽū¾7¼īĘŖAµ:²°°0¹nŻö]»§F«e¢v}fff©¾¬”Z^nNOĶܲo’§?ū©§?ūyĶF«6RfR ąMėöģ™;d|Ģk 7[¶ććS»ęDÓrŚ–ŸŽ DP«Uæ’żļŸyÖYŽ!BŽĪŹ7“+CĪ9­}“”ζ%¶KʵĮk§åā8Ö:V¢}‹¬vĪqÅqÜfėHWÖLßpė @L6›‰es¶ŗļéææņŖC·²{ߎ~ėŪ’ī%/BeDTb>}Ž_žŽŪĻxŹ’ųŪ«öģŲ9:ZŪ;ßą‰ē<łó_łļdA(ŻŪW8hm§6 q¼óĘ_ž¢ēßtŻõ".Š¢±ń*€V»¾iÓ¦ż‹Ė;wģU•J„Ņ–XWC˜Ń?Üt3)RÄ|÷Ćm,ķõZŻŽĢsó"*§,ĶBĻ:ē‰ßżĪwĒ jµšcĖĢĶČƒ‘ŃŃV«åB³w¾ż“Ÿ’ä|ąE“ó«×A031jbž2!ÅĄŽåśõ7^æaėįšč÷ōTāVōØG?üā‹A-­5›Ķ Z]n“Ž8źČ?]=H­g)•ˆ0‘R°Ī”‘±œ8Xœš‰Óx’ł“W øŽ!Ū5ż”{>-"Q³ŁÄ)ßäūNKeiJ;K tǃ[óםv’š|ŠRŽ„Üs…>”ėŠé’, ĆŠ3ŒśH8 #ó2uZSY<œæpÆĶŠA•ždCŽmo7NA}øŽāüeōķöģ*1>FÖ“<×t¦†÷—x”ź–& ±Ü`™®ŽÖīĀ[õǼbY¦VŚ‹RųC_ĆÉĖ_ē?7×±j-åĮ]Ć #Æ®ć÷/÷piʇZi§bB©*y®”¾O_ę•}Ä*§qš¾Ģ:ŁžÜ%“µĄeģ"—ü*źt>[ĖŖÓjŵźččČŲܒ}ć?žKŌZ†jCEOιSżŠ¾rī‹_õOģž÷;åĘ]·n9į=;²mYʎ8¶%˜›_üŅķ)óäk®ūÓżĪ==-„T»d LN)2ē•iˆ¾«.ŚéAM”įz5Wu„I™RÅgx%'DœźņråEŠMÅ(ź 羄īqĖżį§ļQ⽐žk–ÆWŻ« EÖŅ.>ˆTÜ\»’•éĒ8HQʘ!Åu}ŻØŻnūo«UE2>>¾nÓVP'ģĻŲ|öķß=11¢“°ę‘éjS¬ŖPå0jĀŖ—U\S`r“Vъœ›¬Tpį…?:üˆ-æ¼ō—TGBøåęŽóļļ9ģõ•JŁ6ģŲ»›P+DQMimŻČhÅ43=µ›‡Æ›yĮs’ī'?ųQBēęO²(”ʕŠ£V³ŃVm »mߞykŚńģģäęĶėūøG ‡²I·ß~ė™g•_śIä^æEåøčæōłĻ*ĮšŃJ;j5āfµ”‚ÖJĄŽm·É¹j`ĘGj°®Z ɹ’×ĶhĒü±ÆHĮY jŻpżu Ø/.ĢNM¾į5ÆłÕ/.»4æB)ƒ2„”>åŌS·Ż¶S\l§F+Ó££_żś×^ś‚æŪægT½NžV¶oé‘XˆB‚y曞}īÓnžÓõbŻ|}ÉŌ*ųøļnŖµ¶c1BĶfÓe]dŒZXœūŠ{’ P‰zųŖß^vÓķwĢ/µbvB˜[lÜq뭔ޭ¤ÖēĪ›o¼ń†?±qķōÄ(\¤‚@@”ŻjŲŲJ)`ld9Ā3æē‡« 9ÓRBćĮyæä"¾Lı5ĘÄqlB½Z·øµ÷«TøČU»©•2øņ–’ ŅŖrŁ04œ«M)U,·ę†d{Z±ŌP>/CTū a§Lŗ²ń’Ę’B(æī›ó.q))Ū8‚ŽŅkæŒĄ°Éę>cāń+®’«^ęVśMu6„Ŗč½7žOdōŠ6å“…·*¬źü²?ą±=€rżjā,(Ēh[†æČ“ ō»^퇤POŹ»ÅmCŃ5ļ~w(*]½Zė^‰ęT½9)éHJ3®”Fe>æįXXC5–ę¦'gj!!–ZUŒŒŌFŖGqÄæśµ‰µ2ÖGvNłŠb¢@vŽŲ‘ÖPĮöķŪ7oŽ\jśś„J Ł¢¢Aö{<‘7”»j18ē<•'GŃZæéMoś×}‡”3¾ō„/>ķiOKW»zĪ<ŗ¤b+”¶Ö\Z¶6jµZMHģš‘čoŸ÷B©)¤sųzZ+ŹAĀyVµž/ē’zĖ|ˆ›®ĘQ=^Õd­µŒ8ę%¢VĖz¾C­(f±ĄÄų--pŠZkāČkéP…•ھ„śÖC7ŻtóķÖ*f¾čūß}ņ9Oš*õøi“bfPՁu6ØØ8vc£a»"ēÄ,Tmbņ¶Ż{”TęĆlÆĢŒŌ¢ę3"Fe“öó__~ķõ7w·ć·~8ƒED+ĶĀĶF›ˆŖÕj­3øjڽDż0¹™ŃJ2JPJµ˜Ć0  ˆh¹×jµQ£­kÅQdćjµŚŠ#×ījŠą\“¢@˜Ÿ›Ū0»vŠœÆ·×īyĻ“~õææK0YD,ģé „t‘|Õ+>õįmŲ°aiii~±nƹå("Ų81ńüē?’Ģ3Ļ¼ŪŻī¶éˆ£A`J;‰U”Ō’#Ļ” –öoßyÄ”›O?餝wÜBD1ǬɆįõ·Żꇟu֍מ”jB¶v¢6:æw~rrfG}žIOęŸųd‹ē'ClĒĀŹ” L@jDķŲ×øąCųū—¾$æ„QŽ·®_»Ä9Ė)ōœsĻżüWæ N9łä_’ö·ĢÉ•+ ÄÅjpÕkĄi]+JžDłĢLØIƄŗ·–»bų>€0¹·p7dÕnÅGV£Ė;…5ŻB=e,øŁ§„ÕĪ,+ܕ7•<|;7V¢ż.©‚®˜ī'®Ū' ŗ¤]?Æjˆ.}B)?S^v/õ÷ŃĀį}Ķƒt¾NŽ=äUyļ /ü†ŠÕ(LAļõJžō[Ļ6éģ•ł ›y*-õÆØF>ų ļҐ˜™m"Păm">'ŽīR?‰Ė|7ė*I†"u';{?Qč.(÷Æé,o?IŖńnž&åŲŒ?ņįmE Z-fężsó’üņČ2@ÅČ n$ā9G=%©!x”לõė ®^æī äżīźžČ²«¹µk­7ž"żó·½ķm/}éK>õ©O¼ūŻļ¾å–mēž{.y1Œa03½+ę^§œ¼wa”ŃhA011ą'?ś1tb„!U¶Ī”—tB™tł`©Uü’ä!Bp¢ µŪq„Rњźõč™Ļ|¦g[&Ņym$_3÷÷X­V³óQ¤{)'œš”ąZ9t°±fö¼NA+ø“š˜j\%qfŖ1Qj:¤;īóč8ĖssųIų‡½0pw›Ro7Xų˜¹»‰FR2ź|e“·²J”€r²ŲČ㫼ū†aWš WEN*?½–pČĒüÉ*Ó¦…`øüüõŠåTšØ &ĆĄĻc’C‘®jĮśyŸ­^ÆgU_ߕƒT7±w×+1ó%—\ ŁljET«ÕZ„Z BƊ’ŹĶR$®ĪXvŃGmktK¤Ń²>bŠ€@Mé„„å`?°ŚļøNfą0\Žøa÷9õ4°5†Ć@žó39īČC‚±Ŗƒj9D¢DnIAÖÕ&GKj£Sm ¬Y39?7÷żo~`„8aoÖhGĶ D  ŽžŽwrŌ‘Ģ£7mŁ RŠŒ"(E¦V«ÕjµĢÓ^ńŒė9ʽJLOO{{Ē®I²§ŽžĻļ}ūØﱯWFC]!QT«Ž²ł0±ĘP­µĢĖ{Ū·żįϚ’'9  Ā<5=1116:Z‘JÕLŽ™‰‰ $rbDV4+³œ"«Żæ\šļŚ“’“}g®Pd]3¹Vє@Ē­_š¾=ėY>ķ“óŸūœyå+/żžöŽpćŽė®[Ž~Gkļžż·ß1æo/ˆ=k7ƒ Lš×lZ;>V»ńĘėXģŌōDĶF¤Łģ»åNĄ0Šb!VPF4ÅÕjµÆ|å+ūwķŒ×ÖĀĶ·ßÖ·ÅĘ.2LSė¦×€ [RÅ:ÅōĆo}£žØ"Ŗ/ŽzĢØ ·uŌ\?®6Lh(D±¦²{®ž„Ļ|Dš”"(…(āŽÓzl“:æŌØU³m¶[BX?VÖ)™²ķP}’¼ah%1sun4ÜY_tq¬}R€Čæ’½t׳¦Ę&rĪSŸāĶ­ØŻńÓd¤«×)żhµZÆ%KŒevÄ/ń¼Žq§‘&ēóõ³YŌg;X²8_™¾r•É)'éŽ4՗/øu¹³¾Ć-XĖO‰R}‘¹ŠO®c5 ­­õ«=¤«šÉ‡³?<¼@_ŸxyŲŪɇj„z?½YŸaÕą”Ėęśą1ۃc! Äoėˆ@&hĆä++‘ ¾Ŗ~ך…ÜŽt̰ż0C$ V»Ųz_¦”ņ™£¢ī{}„DC0ßčN}A(ߗ‘·T,ģ9@Ų2Š@°Ī’V 7!—×’aębŠčeč‘Õć|“ŅłŁĻ~F„‘ZP«é=s eĀp¤2»a3`Rńz%Y’%„ąa"’•äa„ʧT@hĄ|ł¦’Ęķʘ g˜6/øą‚ē=ļyēŸžÖ­[‡ 5¹ƒīrĀ4@’ēĶožœ1;oÄnŗéF{ČqŅŲܵ ĖĖ+J a%ńš»Ģ>|˜‘kJEĶf£Ń "+h5Ś”©ŒŒTŽ¹ŪŻĮ%“®()ūP­ś²{‘!§@0F÷C±u•4óāĄ}6c‡—$Å»„r&»€^&ł,R¤µO½Qę³{htĒ‘o‚3“‚Ri ”²Ę؎,-Ņ¢¶1{)Æä'yQCIqyʃŅQõVēc)Õe‰:b]GĘÜoö3µ+`eĆŚ/cī1—YV1ļ§vŻū”ćeõ}’0µų._ī] uę. pź$§TO¾“±.K=ŽŽš}a™óSZ›”D+K™JՉāN -Ģ-¤/S¤LvQæüł„ĻżŪg,.óbĖE–cŽ<ö°uk*3“zzėʰaJ·uj¢ź{Ö½ī}ōڧ<ģŌē’ĶcĪĮ¹>ó>w?tCࢨ6Ąxu ¢! ¬k#7ßrĒāüĄøŖˆ 4kĀųØ O;픯ćæO8ö0¶Ķ{ĢĢHĄ‹óÓ£į‹_ō×nApļyēŪ[­(Š¢V“ÕŪmrÖ)cRóؼ"®R†(=śŁ=*ėń†ˆ\yŁåķz³^o abj|ztģĆśĄ½ļóĄļ\ō‹cŲÜØ/µŪķz½1æøtÓ¶ŪEė{ē[¢ē##bį¦ä9)4@rĪ“Ÿøo©519 H£aõĖ_¼ś¼— ą  QJY/½ ķ >žéĻģß35;Ć@m¬Ön5Ŗš­ŌČL×Ę\Ōn,-~ž‹Ÿ’ąĒ?ųąĒ>fć1Go9žnkŪ:¹n͆C·®_æ1¤ź ׎¤œŅPރ¹žź+ėõęŚu3"nii”Ūė6Fõöš©ŁĆ¦Ö]wåµ5 įŠ`·gi1nsc¹>Z©żģĒMĶ®‚#X`b|Ō³“c$hµ¢–Åķw܉ÄhG £œ’Š—ƒtÓŖ¦U؎/7ŖbšŖĶģÆs³ŽØ-ķHٰīK_śRrb²`‚œ£"ś±¼ØĘR`‰ź–©ĄiŠ UƒŃ ŒPµŲÕvkp"±H­ĢLŒ=鉏ē{ŽC>Ō#’Č Bā<|HŃcŸšų“ æ»śš|ÕdµńEļ T«ĶXHÄVā¤DćtÅx`€÷PZmĆĄ¶Ģ¾§ę*£}ßļźŸĒqœ„ł˜aPX’ŹĪ ’?Jś!zƒ‡ģé>:* l†Ć b!łĢĀ Ą~õOJ•ŁĖōŠŃG“ł`*ź™8š Ų©ū1°,ŒB06Øšž@m18X]Uą‘…+½ÕćBDt`Y†Õ†»ĆēM:ŲHIIøė$IäSGcŒŅšŸ£ĀE)†aÖ=įÅH²x,¢ū}—`?eĢA};NE[?LkŒŽŽZv hĒŃb£ķ-X:°IŲ–ļCĪf< ϧ2W ¾&Iwą‹¬¢·q€HgĪÖ*Ņ7¾> (/€ItģI'.7hF®Õhk`yqŁ{ÄH%w3Äū€Ķt×n«»:īž1D?üįb'ĢŠ@;²ĖõVnSYqŽ9)“Čę2Ė=•Ā©XaÄqœØģöæĪb/kĢō ;)?Éā™$­4¢uļ\£†Q®]%ÉQD¤#ŒN«ź€įM›Ø{ļ1kA^”šķ7‚§Ė.ń,ÓŗÅ ½PöCÉ÷@÷ GŲq¢¼ļtąk[’ÜAßĢJ~vÓb„Sœņ©<„ļÓķų”.:'ŁæyR‚üxæn­IDbk>ęHĪ—¬YöķŸŪ{ēD Ȯ󁕹cŸžģń'Ÿš¢ó_ł®žĒæ^šį_\~Ս·n'UuŒvŒZuBQ…¾łŻ]xÉå_łį/>ńåo½÷㟒ś~ÕM·Ļ;“@{õˆpŽk_ #¬b1ö¢K/šœch‘AĢ 2Ōr˜«»g¼ąÅ_łŸŻļ’žEķ]nÅ"Ba+­õ¾½ ßżĪ·u·Ż°mz|4 ŖĀŠ2ā“­M•(Lį®=ŻIj5čT!8vāb€NæļżĖZˆČņņ2iõŒē>¦"dŽ}Į›‘k‹ŌFFI059V5f$˜Y€~’;šé§Œ¾!µäžųĒĘGM½Õ"m”Q1ćkßü Č"JJöm“ƒv0¬*¦261õ»?\³vķŌĪżõłzŽĖķ¶Ó17±åÖTé¾ĒsäXxĘa›Ž®™ćĒĒļ¹qżń3kŽß¼aJÉW>÷qJŗQ ^xį!›'Ū¶9 ­šV£ŃҤ<ōšŖ*&IN¹6ĒMNV#ÉõkŽ;ł„q>óŁµ3Ų ™P×*Õ鑱…=ū|ÜoˆśÜž…ż»¢ø.Ž—Ū®Ńœ·Ü®ĻLWēē÷ŽMVc†^nµoß¹ū§?żÅŪŽņgJ²Źn²±ŸžüēÖmŚ`r@­¢Ŗ”!ĒT­Ž0#40 J+]«.8™‹”Gk•ņü‡ó‹Ėk׬;€‰L_t€–}€I žģ3eĪóX“V£).mč_²Œt Ķ«ž9ĘśÕė‚‡w»‡)ēöóY{Q+ś=łŲŅ›æ 982÷O‚ Čī+Ļzb­ķn­)Īa)ĪØ0Õ7(Õ64ķšŅ‘PöPŹUĻ ”ų A„ĮIRź©5xa €‡äyšó¬›­Ū»ŅÉ,>ŠÆ‚”½ŗč=¤¬u]: ĄĪĀkVÜ}½ Šsq`ęRč~Ē£ed³'Ŗq– kl°ŲUžåž1„ĶՃón+G;}Ź,«j4õ”™/ó^}ퟃJe÷ŽłŹč„h4cū®w¾¤(‚°œŠ/Iļt—ŚóĮV=ķÄŗĆDTāGü#Ą+"G÷ õTĢ2Čū>ūlŒŌÄ: ,//ū7õ&‚ˆŲ9˜2+¤ĘJaMųy®š 4`’Ā<¤“‚j„%xūŪß"±–ćX„-¾žUŻFqL E½XQŅ”VV*æÆWtezą6¹¶’€'SvR'Sę²{Q ¤Ŗģē‡(O’G ĢāŅiö‘.Ɖ:d"”™/­V+ßg”$ß ž ¬+j% 8ʃ (ઊé$ TŽ}ķdVtįT¢“Ĉ­D#7¤Kz¶ Ķv„! _WY©j­ę7r-‚ķV”ĶH2Åé;ų8^ń¾efßJ½¦z•j5T„Śh- ƱjU€ż{wƒ]T:uT؁~ūŪ?¼żķļ}ś³_šŒg’UĘĢČäķ;wš°„•=ūęėĶČ2ĪyņS'g¦”Ć14 Įæó]o;ż¾÷agO<ž$°Q6 g™ŚŚ˜‹Iõ”Ż{ė##£¤ Õń/ŗX —8½‚Ś­k"RZ’Ēū?āv5i­ŒyĶ«_ ųøźĢ?l”n›‘k4AHķś¢”xr\WŖ½ü¼ósū|7ÆRĘ®IA™ 6 ö.·[1[`ĒĪ]Ö1Di°bēeą ¢ŠÄŪĄŃ±[wŽyć\3;*֍ŒSk¶mSÓĀ*³{~QŖĮŽł}j“ZēxĻÜž„V£ŻnRŸūų'ŃheéŗK.¹dy©įœ°P³j÷®½­z]¬£F+Šóčؘ†vŒ*2ę¢_’Ž @ Ąøē G‡Ś“¢xn±ŽvqelJ°€ūāó^R«Õā8Ö֎†J@ØU}qa¢bYUw®ÉøčG?¾öźkĄpŚū™°(|śó_0Ņ^3iZĢ1”`˦µĖ‹Ė5551©ŒrŽ———[-{ęN}Įß=€en‹ё‡zÕUW­ˆ7Éļs~)­ā… <ĄU’{ d‘ «Tņ‰„ō¶ƒLĒ.!­$*¦Eų'Łū5Ń š zŃ&Töšf4’+qģĒ$,ĒZip—Ėčeō2i{¬˜¢“ŖY“Õ„½“žcPtŌ'²]­ļ˜”°¦v±bU$»;„:õœAÉŚXõᯒ‘ņĄ>Īz¹†sīĄŹYmzē”%žŅ-÷§3žZEķkš+=¢4Ā)ōÖ®²Ņ»:&źR—fXŠPD ¬µqœvÅ'eVRpĖßo?ƾ^Ü]6n^Tlµ)˜āÆRī«wĢüł/|1vķ[l9¬Y»ī¼—Ÿē·•oęģø$5&)õ3a<ź€Ū‹żšJĻÖoćdSćįÓõ²‚Y^ĶnĶ!7•‚RóóóŹP @DūvķHœ0„¢“vżē}šf>y÷’N“œC׏ĀüŚl-Šv,Ą%’q»ŻŒ¢VSœ[Æ ›aM=BAŌŻrP89į+O Ā>B„ƒ£.‡¬¾GŌמPÖ¤@9Ž’äŗˆĮä#a w¬ ƒXH£SDčŹl¦“Ć ”š¼”V…Tn~)C' »Mʘ–%­@ź~ÆÉ:½zŲāŅ @WJŁšDÅI@£ YŻÕ„P DŅ×}Ėz޲’½’jŸĮĢMye•jč»U3üQ>[‘o­*H9īzKMi`ffšKõf«Õj¶Z ųÖ7¾‘öµP~6”h%Ež"JĘ@³pL£ŻXĶüčĀ‹/’ÅÆĮP¢{ģ ·ŚĶWæęÕæ¾ō—±kC³“X Dc‘ŚKQSĮjø@é pķØŁ¶öAgŽ÷©ē<ĪLae4P•±‘QØ6£¹øÜŲ±g’śCń½’ż__6„………f3bēšÄ'>‰€”ģ?ó%ŗź!„½TÉæ¾ršĻ×dO‰.ūõ„©Ł(Bdc]AŅ„ļ}ļ‡xĐ2äǦČFÕ -§vŸ‘©5oœ™ʁÖoŚŗÜtN`ÅS:éDõŹØĄ!}–œž ! h(³éˆ#ÆøģŠµė6²ńVc©¦i“Ŗ7¬$·ėóš8²QC«*Žm#¬ĮŒ‡öææłÅģJžxö撃L«z3bFX1¤¤ŃŖ·¢6Ć5œ]l·–¢hŃŗ˜ōķ;÷˜ź3łždėĮå̇nŽŖ c‡:ó\»}ē-·!’PPhØĻ~ņsV¬LEÓhÅóu^“Xp&®Lģqė|,JʬĄ’ōē šC€DHRD0˜¼2֙gõ_?øųöE»Ļbē²Żį†ūźĄ Ž]oĶ5y¾¹ī’°‡ļg—Õ) £EѶ›o½šĒ?)vøĮ>zržfčØC5‚@i \ž›Ėā\vČx³Ō8Ø^$ķŠhÉĢģ*„‚ ưš§B¹ Sć%%£>EŒŽ-·¢d\Ā0.I9æoßĪ;ļdė’³ÜyF>B’NQÆQi­ć·Ł+¼„BĒT’°jöęÜŹ”õ‡„4§Ž/&ĻæŽēl˜qן'åOō| kČ[zY†Å™öččč: Ƈ‹żś¾śz Šņ«wIf$’Č7;å/xųņū€,ų]^ū*¾aŖ±™¢Ż<¤A%ԁŃZe0œŪ#½ x€×’'ÕĖčø{‡]kŻ[ŗ\3§Ž Łźņš¹>X"9'¤ĢŁO|’e{Ūw4ŚĶ[ļŲTŖ€b@ū“(į.Ļ•@¢ŻŖ]żųšÓ×/ŲveĄĢ™[¾\¼ŚŻQH:å®_¾ū?ߊhGbŁ»öī}čCĪ $Ü”¹s­¼3ypŻxČų’•ø”ĒƍĻ~ö³ˆ¬°¢Åv¼õČĆ>ņ‘·š m(*I‹~l5ČE±ø¶%¬Ä­v‡‰ŖOŠ”±^‘źDČ«M®åKĶ%¹-ÉŚ¢)ÓmŹ%Ž»‘e%6ÄGV HåŁe=ž¹:©'7H“d˜øT^ū‚FJ"<C“läz‰ó”_wę.bė„ )Ņ ]ÄŌ'–bO^WęĄĖ¹y¦Ņ<Ėą¬L֤ޛcH±åy |6‰„¹ƒ¾ø9 @P†.B‚ćLÖMŚxLæU ĄĆ}LÉbē"o56lŲpĢчētŠšÓŸž.‰ ™­ˆcåX;KĪR5@)Øą²ßžļ®¹ø ™pn±mĢŲęßņOo·õŲ7«3 °R*@˜qZ«Ą×½ÉYbĄm…ŗ`_Ó-9yČ£üÖw¾ūĖ_ū& AįĖ_üņ_]vÅmŪwĪ/F–U,›ó`ȸټāŠ+¼Gį[čYš¬§?#a§O{æĖYxzj3Y“C]4!Ę"—üüēÓćķzÓ0œĆ†£ŽŅļ¼ķÖsŸś”ŃŠ F&Ę#¦ćO>e|ĶZ§£T°Åo.¾$ٳl ‰Ėē?ńüWæV›Ąk1`ĮośĒ7$¤Š"¤‘ ö%ŁpķdĮ© >ų‘[n½c׎="2==M¢ę÷/”Ńh9'Z YXю°g’ĀB£]oµDI(KŌŚµk“8vŽ’kÅQĢN‡Ś¬ A°;3:>»iĆŚŁ™ŪöķUÕ1†"e4`Ę „.’żļ’|Ē®ŗ`<¬T€|ö³÷¹ļiÖYATŪ"­F3P.”xzLÅ¢v{蚠ͱUÄJE,10æ°šĘ7żćܞ}¹Yģl" R¼’żÄF×^ń«§<źAwŪ¼qżäÄ!ė֌(ŗvbėšŚė_žŅ˜ćļżčˆų»ßż ˆ3„č0€—»lO(…™:@ąŲ $nµ pÖšŠæŹhPy…ux© ֍Ę ŹhؒS<ĶiåSYeŠÕ{ĆyśÜa Åyi™ibyĄg¬_»nĖ–CvļŽŻ”é÷ÓÓĖž•ūŅ:9\=5.s–ęčź1FĀ©óµŽ“u…Öå”3Ć8‹AŚ€7ą½åc(c” GhŁ9Ųŗē“_¦ĒŚŌ†.æ @ļē 鬃µŖ]7übģ売?…Ņb®»Æ7®f‹żõ«XĢpNāŲ&„ӕ2P}TJéU ė6Æ [ŹØœGYēgdšjé·q¤Ė£¼U¦ŌŚ “ö*^·~cV}ģ„;Āȹ»NY.‘Éō"JV+’SśāÄS¼«i¢J‹ły±€aaē½ ÓDžkGA`t ”VŹ@ pퟯ£“ ÄłNaމ½óōŒT’ŗrwM'‰ EdĒŽ¾t³0įģ³ĻmµZĶfCW‚V£ĪVœs*Ё1ČEaXA7rW`0³³Ģ)®!Š"_+^ŃŚw‘*å•“*nÆ~o<ģl·oŠ­Ū”Ų@Éé%ś@=A dFJ©b“_Hµdf'[¢ŻZnIš²*dļȼ$t̟ŒżN‡©rWŒ-żPĹrü½ķÄłĶ^Ķ£[ų ­>ŃīŠ>ŽM?˜@v >O)Ewŗ¤ƒŖń?Ó:©Aå÷>;ĒĪ…a˜qōĖdåsśĀ¬įtlĻ<óĢ V ‚ķŪ·C)ļ7&‡Ž@ Č«A@‰›Żśūæ{ęŌ8¦ĘMØ£@µm<ß^Śżū+/½ģҟ)±V‘ J“ÄłžG§”%²‡l^»eӔ§V;ž›æyģįG¬µßżžw·v¤įŻ·nūęW?æqf|ӆéJgŁ æāüWłłŪ³gRŹ—āƒ@+E”ĘüüÜžŻū Ī·Ģ廬³G)öjÅó$wæūńĶ„%ėĄĢŹhŖG=ģlbzåóžöōćļ6 ¬ŸPģāfc’Rūó_żOLÜ2ßj~vå•g<üA¾īŗ$!EB$é bŻŗu‘ Ē4‰ü좟&¢Ä k-ˆD‰[“öĒ(3ė¾łß_„X”)Ū“õŚDÅŌ”Ŗh“ŠlĒäōˆĒF””ŲĮ333–§>ł)B¾×Šżč'ŽÖF“1f$+*&ŠZ ÉB£e™n¼cĒ{w’św’KP,P¬ÉćYĀĖ®]{£<:6*Pæ½źwJA)CqX›³Ųµ$q„ŗ«įŚ”ŁŃʍsĶ9¦‰-G8ļz’ŃŌź\zé„H"Œ6]ˆ36 ąŲ{ńå’łé¾žOŪļ¼śÖ›/æīWl»ķw·ļųē÷H` ˆātģÉŽŁX€½{öūjó ~Ž"\ ²ŠJh~nĪó’aūö퐕ŽŅ6Ž^K• Czx:‡„Ö ĶC’°®éīJšźēĖ®čƒę”Ī…bŽ77°= !Xāˆģ?œ’Ź+sé”ÖcĄ{ŽśĻÄÜŃFCRIö’2Ä K"øųEžÓŒQ”jóśģžĒ'f§g†,^?bžŹ‹VCrŒŅI:ōĶ)ˆ—§aPÓŖ‡üÖ³©ĒvϚ%¤\XŁ6źźR_! ”šśęsĄżĄö•Je@—é€eÜKcvĄŃļøų=‘miČĒŽ­)£ź—éHO’(„ōŒŌ•§€“[–|ÉWAūŊ@ #ddo‹Łæ[Bõœ20?˜pڧZ‚Šą ČvQWMX©b˜T:¶…« 0\Ŗ’µbv© JÜł!ĮK“VykŁĪŌAü¼%0ŌTO)ļK¦ŹPšT’rW龂”1Ł)¤(]ƒf§LZ …†ŗā_) «„Č‹?ejXŒVž„ß?é|Ū dø†äįŪģ)-6õčŃ(ƒŠäԘ€•²aȾ„ŠĄ$N‰t%bü»õć>‹qfĮV••ī&Īż ¢Ż{v(‹ “ ĖõėÆūsÜhķ½ć¶Öņ’DQ@VŪŚHÄiķ»Ü¼Øœ–'HfRZ«Ž† Z­e”8ŗ¹Š³˜5 •&Ÿņ ŗ ņQIŅöĘB åįŠĢyå'E¤ņę¤#,?†gu.Ē‹šļĖšŌÓä-³@|YFH”ÖŲ’ĄńE¤Xœ’Õx®¦Ų%=D °3¼ųKz¬*M"¬  šg.$N<ÅüĒl/Ćz²ō]vŃÉż¦DōpÜĆöœÄĄ…h9‹×óyņÖś({ķ,&N*®‚’ō:۟­$ĒYoõ8ĒłļįT¤T§8õ<Ł7bSüÉH4±¤NHrż> “ĢŸé|„?s“‚FŚ Š9Oó 5Å+ œ2gcAš”O|:D¾Tėāķ{v¢ˆmC”8ҦDꍱ”sdAę÷ųÓ½īuŚäŌŗźČ„‹`D5—1įCń˜?žįJ Œ$S¢HĮ‘rŽŹ±{ŲYgꌤÖ5Œŗā×7üłzĖz3aqߝ§ßóųG=ųžĘىń n×)TT ÖÆŪųŚ×¾pвžŠ#÷4Ś`#7×p‹-Œ˜’ōū‰u³Ī«6—bd ā—]Ēkŗ!<y[ͼcļ®X+2˜˜˜¶K¶*•śŪĒĆšCŸłüŽVDÕF܈œ%£ŸšäsFgÖŻó„{kŠ8 ¾ļ)'ƒ]"›ĒˆóśŠ(K4ƅD·Ž|$ĮśbiĒUkŠā|ćė'pĀžFsŲ»VĆF­hny©neĻ¢›Ķž&vīē;v4÷Ī5*c‡³uė±G<ōÜ½`•WŽøõVSķø„ˆÅq¬ÕĪ喓P‘ƒZ՘ĶÖ¼éü—-·Ż¦Ķ‡Œö=ąŗcĢ@:üž.T@•L+Žcv–ĄŅR]„ ¢sóūæōŸŸ¹ß'ļŽ×$Ā駟śņW¼šÖ[n\Xn]qÕµßūŽwXX 4‹“V<ī‰oÕFQ¢‚ä[D ug{UFĒt„Z©ŒuŌńŠ*µź¤·ģŚ$± t TF#h7—3ϤŌćĖPĢ0€2äaŗ$xŠY©Ź@čųcŽ8ÆĻ2ްģPī0N†’åž÷Ÿ ”Å_Ø Ŗ4ø¢Äŀb“"(ė ĶzƑXÅ¢,^nŽž“KOž9¤"*žóæ¾ä#XˆcÉ{ ‰‹ÜęZįCiĢ?(ģ÷ä‰Ō 2ø§1‰Hh€N!6Hó.2 Ü9IočcõpŠŽ%@Ź^*¹!=ćæ(±ĶŻŚ„łŖ!Zŗ@)ŃKg®¹vH=ł©ĮR1aLÕMŹźuvE‘—%Õ·&_pīž]šé• /-öö»÷ĀĻ3\I>p0ņüū{–¦R$v/ēY>k3$“/fo€2vŽbÓņš®ķ.ė½Vī »ŖJ>fę¤ö’%iŲĻŚžd’‘=)å  RFcµ P"CRŌį ÷×Ēī/]ę½ ļ½P<<Ąw\żū?Šb|ó09>ŗk÷ŽŃ±ŚÜÜ\«ÕކQŌ²6JVÆ”ū+ł†v’&Z“¹vŽć8¶Ö2K”Z[žCLmQ”:P€ĢĶģM”¢Œ‹ØēTŹ~„ŗ2ŚØŽę0÷t”vׁ¹ø\š××ĢßQ"rÄŻe_ĄT*±“9e9ēœs¶+Ęōaš“ŽŁ§ōJ“źōąōBŚŠUśsb­ĶjõŻ7Ų“8éżyasõⱋé–ī՘ĒmiļPu¬J2W‹īŖ¢÷ˆ'#Ģ9éĮŗS9Ö·>pĒŽ cēRx|—ˆWokRē½õń`½~Īż„-/7”  ĀŠxī46¤Ī:$„¢6żĢg?§6¹fßāņRįČhmLp|üC’fbń‚ŗI,ĶĪ“AépllĻŽÅ*jhb¬޼m’ń›ŽžĘĒ?ÅžēUĻ~ęћŽŗįźwļÜ;Z­ĶĻ-ON¬Ł>Ē;ēā#=ĮTĘ}¢ˆ…ßōęT•Z ĄĢōdŪcŽ9Fƒ”³J‘ʬ «{¢Ō¾}ūŪ–•QŪwīuŒłÅę[·Œ‚Ē Ó!FĀŹ¾…ÖrĢ;ö7ŽžÆ’ ל‡×¾zl|lvó–& D`±ŁŲv˶„V‘(ŠŲ‰Rd“˜H”bP$nĻü~æŃņˠˊŠ ^ūś×]æm[E”V‹õf½­–ŪDŗ26=Ł“¹żĮ’ųĄž’śņWo»cĻ’{ķeW\ó‹ß\õ‰Ļ’'”…NH»¢fū›ßśNh*`āXŚĶئMXƒ¤ķģbl_÷Ö·¼ł½’¾Ņ‘įüš‡2Ќ"'h6[ž†ź+’ż_D •žņ“gżä’_]vÅ„¾éĘļżäā÷üū›¶& Ō£}öa‡ęsļ”B9įŠCķ R€X=“ß¶4zżŗµ(MS3Ó 8Ÿ|;U‚ĶķŚ…ÅÅz£³eČå—_f¤ 5ßń!µŖ@“px„¶ƒA‘­˜// k%?I18­¹€œŁ}‹§ßē4±nfj*ę–æłõÆłŅ‡ŸE/·˜„Y;Ķݶ¾“ķ–ˆ|ųZČŁÆzāOŹģ+“õ•‰īEś÷ō]RōS‘0YrG]&æDe„ <Ŗßäö.æ~µāUqž’導„‰§ü½ ć­fÆ,ŗWHōēn)EäaÕ]SL •°‘y’2cō”­z—ĢŻŽŅv”ĮżįĆtšdŠcŒg8+]½BŁ„–¹v)Ģž@X»R䎹uī)¾DģLhfDQœ@=‚‘ČĘqR‡‘$dj·Ū+ܲb0œ*^z€ŅŲ©ŃhÄq RJ«Ńڈn¹iø3ģA ‡ˆ²W8X‡ÆėTĶi9±Ė½—UŒUR»³÷ŗēIĢ­“zfÖĪžžŖ+ćvkrb,ŽZssūöķՆĒp–Ų!k)'ņEKL8ēœsIhJ ‚6* ƒ |m'ŒäœB{N³Ź#WD²r®‚2äK¦)bEeĢ Ūg+"ŻA±ī4²f pzpDßé˱åõ)G”¤˜=ŪVgæX›ļ¹UZ› €Gõ>ÜJŽ{ß±Ÿ–©•"• œŅzW+Öą#X)hMĘ„sĪż·ōD×Ņ7#_¾7¤Ó[.Ż‘gg@ś¦Š–-wæ… ': ś…ś9'gPü¦E:­NS1Ż\Jڟü¹1HłŪ ¤”rփ|ą8::J„„łłōSą  )›’bĮ3’īł—\~łq÷¼W¤°°ŌŠŠÄU«ųč'?}» %G¾čŻD%0B`³ǾSN<©šńšrķh¼‚żõżOį‹ńäg|ü‹_«³X3nAū,6Š[gÜżčʞŻßūį%ė%õÖ·¼UW“h­4ķŸ7•š9Ļ{žˆ“é+·Yz¤®d”„Ž>ęE`ØJ5G+Z”Ā2atX -׎–Ł2S©ŖWæž<35ė‚ÉĆļvƝū×Ļ®©%Ģx€Ž=ź˜W¼ō<‰­ß%) ‹!ķ· A4(06FRż¹^LŸO·œuÖY,7›mĒŌ…ē#Ž>×xŁł’š‹K<ßX|ĮK^üw/zńćžņäљ鉵UmÜ×_@ˆ™” ¦ZŌī»źKue i(šD­¢Õd^hÅ/~ŁKĻ}žó-̊ĒŲMLŒzüM$PĄ3ŸžŌūŽ÷>eąŁĪ”4tpŅ)÷ٰåpP d„“KI®¶mŪV­V¼½©T* XĮӟžō^Ÿd@ō§Tbv’×0_żõĖĖĖŠ€VsūpŌqwƒ8fÖZ§@ÄōK܀C Ą­·ŽźŅų«Žl@«!³½e¹ū.į=ux­įSĪw‰73€’z€ї¦ŲełÓ…”9a“`qŪ_~óæ}įß>ōŖĻ|藋;nZÜÓXŚ?ŸHr9iæ&˜! x“ķõ=z©D†aPb"c0ĻŁŌŅZq¾0•2 %]Įqģ Ʌž«8²Ž +rŗ» 2\Š|ėŗ»a£(ŹņīéŁÖ‹K²›ą9ļĀe™Æūõ«R®čĖ®ø› “E)ž­£šĮ Āi«%µßf³i­¢ØsĶTzļÉø&éüL’d8qĄE°R»4L|8 3]Ŗy¾*nö!” ½łÆ‚EĪ’ė‘X ĶŽŠĆßĖĄ ā!«Ź€hMĶfĄŅRŻW‰P©œ÷Eā8ödž^ZÖ§ZT–ŚaR·ĆŻj׌ff"…(fę8’fĖ:VKKuwÜq‡ø„g±Ä»ŗu;<©{ļŻ El{§č*%Ńīƒ‚„@–­¦f¦`öœ&˜]3łĢg>ć”SļżĆ ’'¬(„Ōī=;ēēvīÜQ kʄŽĢŗv”ø‘(„“G5ė@™P{%i¤$Fś%I°Ŗ¼®HwiQŠ ¾"ætš¶KēT8Ah ŹĄ8„GU±Ū—@𔦠0iR2§Ō‹8(K·e‹B¬×õ>>…$Żhš ļ\P.`ī ˆJ‡±Ó_-+T]r½Ą™£›æ)Äŗ¹'%TĶCZō>ƕ›HÉßŗÅŅKģ?õČ»}t„3¤^±{¼ÓūL™c†N½ƒŌźóT^© y§,ŸŚķbŸ øtˆßżīw{,æ—}zń _”ĮÅ; „± ©¦‰€I©ŠŠĮ#÷„&co3nDε\E™‰Zpßn¼āŅß$$éģ:$z™"¼łˆ­æ¾ņ÷ūėĀįxā6&ĶŲ1k×:=²nTĻ(ø…%nG•Ś[·×޾ļžzP03 Ť“®i?ŠÕń5wģYŒbĮ¾…hŪ-w²°RĢlūQę!“ĆUBxś³ž š-ŪŽl#r¢ p@£”šŸ_t7޾’3_śę’yŪ{×LM)Ä@ mÆæćŽŗóœņžCŸžō§É˜L"Ī'Ī?üš<„W\ü/oys–æČgr:.7©Ÿżüē 466ī…Žbą˜ćłłÆ~ń’—æśŌÓĪFėuė»0œˆ›­:)%€"(/鸞cĖ• ŖL°ٶų¬+S ĘĒ+üćėŽ ŅJ»Š™aōz‘ŖšÓīźøĻŃĒńŁ/ž×=NöØ#¦¦góUHŹūȐ{Ÿ|ņ‹_ś’Ē>ī _ņĖ?^÷g@†“ʬDfy|G( ˆŁóexżŌ³Ļ>Ū±Ū¶ķĘSO=õŸųøc715N:‰#2ÉĆĮ͉Ķ(ŅŖ×wķŁ·Xo4ڱTCóŌ§=Ż7ż÷5„ óéćä“OfNl÷ģģ¬OéQ’8,ø öHąÕį×ó ēį{_KĖ8łBVIķ u°ˆ„ą„œ‡ŃišŃ»”Ź_ę>¹aO Źy¼S÷Iė; ÕÉR³HČ·<©ś©Æē®Eķ®VdeČøØōÓ»$ßKœ%ŖŲ8g“™%Ų>pø®, U(øĖńźżrC«ŖŽ–f÷ņ!čjyŌīĀŪA7‹r.ļĆ«ŁƒæŚA*ÄP)VɌXk½|Z^ ½x›:)»e`NuE^€;z:°DI×]sõļuč@›¬xi =ė¹Ļ͜ū»„7{ČrńšŸÕŪSŅ“›I?g@F&{įŲųøc,..#%-Bģ8؄÷ą¼ZX­(£„*!ŒńŲĀÅ„%;Æ`˜Ąć|Į”ˆŁpBŠØ(D§_R˜§bݲ2 œK²IŖŽ|P_FÉśl)—ĄhEŠF«ŃjŌ›Ā=•j”Ä¢č©gv~KCQrx¼źŃOfÆ“Qlł *¢äź¤o #gFŠ-?Ö5žéyšˆQu“Ōåö­“åŹƒęņt0u]%õ2äwpżÓFŽ{±–³Į/Tę{ŕ“«č<ėNQé?WįÖ†ŁŚÖŁ¢oŒ©(­—ZŒ›ņ‚÷ą‡ß’>œų„3@œ5xvPżI”šŅæūżÕ1h>v‹Œ60:6õ ‡<““]4)bc ō̧?ó²+.ģ³ž²øQÖS¦„ƒ¶B¤Ń"®G€ŖMƝŲzō”×ßvG0½FT, °böÄWĢ.:ģ˜#ö-ģŪ7æē»’óķĒ>ńI0A:ŠHÆh² ¾“ęą¢C«”:żōÓ½Žm[“D–ŲÕ±©|ņs_©ŒĻ@ *­ā®ųĶ/9śˆH`S•(.ĮŠAĄ1GķŸųfóØGjOMšhoAƒ”ZŖŪĒ?žI€&"qLŌq7Ń"J‘!JŽŲœ¢{vBŠj5¦FGĒ“1± YĖ®m|õ«_E >ó|o…"hē䝒śīóϵ?¾²3Ė_•­_TŠˆIģ€Tˆ°Övųįo|ć’ęož&[ĢJ©M½UāģźŖ#ć0I3¦kFvĖ–-‘NØśVū˜]¬7+&€šää$“fēī’"—Ž…Rf½"ā.Œ–W, „R;ī,CƒŖ1®łĶåŸüśyĆļoß·£»„vubtŻģšX36ŃŖ×?łį€1Ź/ż®#A 5VżØqV ±T’ ™ī:pē9³x—”s$ÕŻz儺J%JĪiC`™Ą:wņ—Ń")­¹åK Ž{ĪŚ5Kū„ļŖ8m@Aģ ‰F[ )ÕäHOĮ² –†Ž“ūņ$±'H)Fx¹b›Ą]•M°ūV ŖóiĪņjÕp×_Z—ö]”½*CB?üĆõW„ļż‰Æ6—[’²^ō~œēŻ£īōÜ Į'•3„ś“‚™äŃ2~ä°÷ž }gé]’IéĢBŹW˜$Īžö׿<ć>§Ž…z¬VāŲÓÆ[?{Ężī'©(Å ½b80t†wHżR“’Ÿ„TR0N”o3™--%¼ÓPŸśŌ§üŁ—]Åe—]EŃĢĢL„V­ŌŖPf¹Yß³gw«¾µšP„ŗZ ­°š: ’4ŗkµŚqd„Š’ég:ØäyR©ėŠwX¬ H6Ɖ0ėcŠé|’¤÷Ö³ōS‘ķ)‰æ’¬"”R©T*•¼¤Y!š|øąĄ^ 9T6³ō&iüÖFž,˲ŸÖŗģJ˜„’')°ōĄS#ßĻ‹‡—gĒDŹՃ†(ķ–N”w|zæ•~±’ułŖr@õ4Xģ†s2¾£OēQ¼%hsŖsäy¾­$čķ!äϽ· t˜9p‰÷āt Ü²ķęgū“ æómŲ„‹…ĮĀÖ!k÷ōA Ē>HV¤ĄB$·Üqė“Ļy‚÷Ų³wļŚ•T5…T”(rIŪ½bMØUßų†2ĄDPՑ#ÄTŖ#­XŽ>|żĪ7īŲ½ūšė®ē0 iģē’’;gŒŌųÄŌÄää#õØTR« kÕ×(ÓYč=É„Ž295SčĆL[¶lš_n“”¬ØüŪŪ®øō§OxācæńÆ‹‚H,q¬@]Ÿŗęś›F*0CxÜcķœĖd“ŅāĀp¶ŻØæōE/<ūQ|ćk_ĆQK+*-<&q£µ¾õ­o±wƒ–EiśĪw&@§Ń£7$ž6€t‚&ē± {ÜŃ÷øū‘ĀńāĀž€hė¦-M’#öE~Bu&PVńQJyę]ĻW’©(9Iz ŁŗüķÄqœ²¬[MJł×c īģĒ=6p§.ŠG®­JōD'wœR*rĪ„”Q„™õė@oŖ<„ł³/|éĖ*ż”ōch­‹é ĖRƒ“7ĆTTzæ=Zźy ļ:÷ Œ»ÜåԚ‘8œ8Äī9OxŹ4*#ֳݻż×,ī¹e÷[6lPäøżÖ[‘Œ‰ėķŪ-õ.śezÉrWDTö»Ł‚V3åRR]68mĢĖ'};ŻJ”jöōTɲt²?—sā¬]ŒŽI~T’µŽ™3vb¬d ęÉϵRŹóåW]æöĖRŽæ²ģē0Q\į5*}öEŅ!¢°bˆ5 ΃—2b­.„ń¼7“R©uU 60¹@ݲ_¬4īgLśę•ŹÄŗś4H/Šŗ_$ć™ÉņjgžzÓ7>¹Ól6³¼l¶ņ=ŗipRr0ŗ4C‘OhČūōj2å”J‹+¹üū;efJZ±’uå[-ņ5”<ćōAB„ņӔņWŗ~ķģżp¦\% …YQĄĪ]{Ļ>ū쬓³³/čh¦ź~0¶Ø¤<„ˆÓ4ƒäYzĖĮRʙ”{<ļyĻŪŗu«ĒŻłé~Ü枰ø¼061Z«UˆÄq»V«­Y;kĀ€ ‘”ČŚ°ZU ah„TĢžx¢iļ‰äٶ² ­§|—.6FšŚfÉcŖżęŅZ'ĮRP³ģ­’\ĻņÕ5ysķ›0AD$1wÄ{@1RX»e‹?­O¦xēō坚v†ąAŻB©Ŗ\Wh ¼óē“Ż\Š9NN|u7QGēlpmDQwՔzK '=lÕGVz±čŌU*/t†ģšąh¹hdŗN(éWĻz€“u„JĪÄ"®‡5ģB6„;Œōƒ§s0į$pģ±GÅ1Ø×ė­Fó)ē<ł·æłµ ±ē8J×¹ ¤Z©&3KĢblŚ“é _ūŹ×^õ•o͌„Šš—æ4bE:Æ ćv<9;uē¾]°vgƒŪŌ`Ģ/7žé­o½ę†zl½CÅĮhŃÄ.ÉZĀióK}WŖH’µ¢N›­mÆŖŚ‘“p#åĘĖĻxęD~xį…·Üzėļ®žĆ‹_ņ÷Ļ~śSnæłś—Ÿ’ŚĆ:Īsź©§ ³Vņ¢z bpl/æģŹ;·ßžž}š[ßū®—§ņ’zų4ŠŹT+|ų?¾żżļ½ż]ļ„ŃRÖ̚p|ȘŪļųĆ5WēŃŽ…4œ0& <~;}¼d…‘°i@ Ą5įrĆUG+ōö];—m…˜(Z.N’y„5‡‚F)×""ķ{•3źhēbeÄIw„ ¬QDFƒ¼h"„tBDģ\Čeł'žŠ3Ÿē$°øøh™`-”ĀųDĶ7pxō}~t³žsĻėß/é|ōᇣt-¬...‚28=,«łąōŠ łźA”’…(ĆUōw@¾^ lQä5u”&fW*d²HŠN腅Ėdł–-%Ü (%’Lö¦ė(ōƒ¢Š„XT²žpö0Ś“#“ENĄ™O~ü“ˆČ*6Ę3 %łqäĆ}„TQMī~·{* »|/ńŚį±ƒ‚aµZ™žZ³sēĪ/~žSżČūöģŗmļāī×’Ÿ7@[x©%! H%xd@YĖ’½-Š”dγøCAåĶ£÷dRYæ6ü:š›fżę­#“kŽ’ūÜ~łĆŽ‚±ńP°åŠ­‰3“WŒ'čĄā½Ön<ä%/9/µƒ*Æ5ąb"ķæDHD‚.äTĢ<æÅ׬_÷ņó_uÉÆ~e‘&,6rYÅ2c]Ī4ĪR%ń‚ŠųŌl%ĄÜĀräZÓkǦ42ʃ° ŲFÖśžŠÅxźĀięx’Fߣ¤u€t«³tzŒīeØ£$«”2€QŗB*”·‘J(ćJ.„…8×Ŗ™bg”‚Ą­‹¢ā uµ-:}łqH(›ŅģA\h9įŒCkėaG·M/G-A 1†a@Åźō8H­{h{‹Ģ’TĢä”ĢY,ø¹ŁsIUЈ„µę7LĶQsnēÖĶ[^ȵ—_ż¼§=—¬ŗäæZF|å•W~ūææöü7½>Š&õäP©ė#2ńŲaÄu²bQžÅŁ[•tīehBŚ”^#ö`6vJ©(ŠŖµJį~™3›0(œ¹H>įwŃŗĀ „ĄÜ™—Bca? MĘ蓇HJ‡Ī¹DČJśŁ3 XĢ„×_ąš+@Tśż ¼k˜»T’¢/"β6Jk QB`#R‚™¤¤ŅŃI¦$»S³RŠ(b‰ŠŽż€›Bڟ„ģĪ^VXٵk׆ĶÉØP`ϟnŗč§?śēyóŅҵāc&FFĖŹ"@ ¦Ŗ[-gķĢģš3ņąAß]K¢¾ŖsÓļb_õ܌ŠļŌ'3ė>"ež‚ŹÜÆŃ±‰’üā—6nŚ0:1į9½fÖ9ē/#0U„ ˆ8Ž™ÉĘķ Ø" tĀļ*Š“QŠ©äuÖz/Ÿ™µVAĀI°‡ŸÜ\Ł!IŁPēÖFU«UmTZ*s¢5ł»t†{ļW+8[c)ą%)mf‡‰ź“ QćQ{Z¬’£0`…įłiŅücəŪq!TB ĮĢĘhQ'…ÜĢõžzµ¤|[T¦¾K}W,õńŠŽtHĀ“QłZ(Q®ł²Y±ĪEÖSˆį3ƌŹd,óĪVF(Ök” ś ¹? •Ŗ–Ü`·Į•‚ė¶'®Ļ9¢V‰8qÉŃśē·æķcłčāņ²bvh¢o÷»;óaÆ~õ«O;ż¾¦Z1ć5ˆ¢X8y’œ"„źėė,łŻMšÓŸõlĄ¦åļ•śĮŹ)„ŖK½ØÕ¹©ėŗŚ×A "gœqʶmŪŽ8ā\pAĮ;¬S›aōЇüī/#¶ Üj,ĮJ(…{ž|2tųåWžĆŌ„x.ļ’b,›6mZ\\t1+Ą¶£0¬Ž?ē­ŗ=ķdĈڶ-IÉ:ŌT1Į§ƒ{(ōė]©m aN颃KŌ ”A·¢]™±Ž¾>Ķ…8MĮ†5<ū‘ūē÷×ėõ ŌŽ;vģÜæļ{?ųĮö[vüņGæp#•<95µ°­Ī —­Ü:¦”ŅJk2IÅ5SŪb[Ļ”c?ØłąÖµ¾ąvÕU$­HSX­$L™IrW„D­Ó) „{­Č(] B’¤¼\hĒėWõźrā¶Ķ¤& tštGŁ Ļ4¢{—}æČ«ĀäéŽzG~0ćqæŖui×/'‚Ķ¾įėfI<Ü’OV²ÕW «įø?ą<Ś0Ńiæ÷/T™z1ރęļ<8 āūx 9”.T RF÷L?¦§j“~aEĒÅCo*!5DŅ|”œJZF3Ęä[],eī.zQŹéš8L‡VL€· ‡¼Ŗ6)„•ŅJ©PmŚŗÉż˜G<āÄƎ™Öµõ'óō—wŪžż¦e šö±Ģ-Ą*²1ÕŖµ˜†į»v&XVH3’_h²čr%½ącĮE¢E9ė4¦ž½å}r¤^ŗPA(Ÿ˜“—Ź`h!£ĆéŚÄÖAH™Pė ¬ŽR6Žį ¶¹āv§5W µ6Aą÷‰,;h"£D“ņ$[.Lł²Æ@„…Y„³ŃŚĒŽŅ£'ł—“–c…čIÄA\ZFʚ€ŗ+äģK¶éVõ [I‘ĄŁ`‡aŠ»²Ņ®0¢vģ’Šoīx­ČŖ„ „Éŗ+ö“īHøĢ=ķ•xČ·ļöCƒY-2¦ĘDE‚’D¾F“Ņźķś7 M6éĄ&E»ŽõœX*”«½tƒ%ށĻ—ŲĘ¢ZW¹¹ź3Čk;õ ½žgĒīA¼÷E¤•2¾Rf‚`ßāü™g>Š" š½_žäaO>ūøSOśO,ÉI(#0ĆbX”ˆ>ˆCŌg† ŃZWš„ØōR'RO¬‚:„q覉ż+t± ć=ć d\¤>—·uėV’Ī/~ń‹{3¶ƒßĒ£_łś<ēiOuāŌT„"ģØĶųõÆ~÷:r žˆŚ<(µŌ‰ŃöķŪĆ0ą<³z ĄqF, (o{Óž<•aéF0fLOOūiCÓÓÓH`9>Ȁ?é%īő®jm$“Ö°S[čTɈ(rgQ> λֱ­¼’n%X¼uū™'žrŌįGNNLD€ Ōüž¹m7ßžō7½r›[¾y÷Žrӝ·żšā‹~ūŪĖ=TDś”W„‡ęŹ9×nEõze”yW¦Ša˜wåWäŃ)…Ųe€ŪĆŽ»»üÓ8v¦EQ—ØC^„)ˬūn.é!MX+Ń·į§4ĖŲ%¹¬Óš²D5õāv9#C÷ÆH(ō£*÷<Ę0•Ę՚§AYŽ>w—?•J„ÕlR™šŌ \¹}×ORhxŹ€~Øę6^½¼ƒ Ø;OЁ¾˜UV—¶ƒś.nįŽlZ¾+[Š?\¹µdčLpÉÆ2Ź=N"Wfę,F„¤ē  LõƒŸüčĘŪnPU[ŃBCÄ ¶3mĄBKl÷·›ÖOß|ĖõB Ņ Ūė’… dÉ8ßxR~IżÖ÷BŗEYe•_evŻZæyü˜(2ŠŒ8“‡n:'Ήs"ā`‚Š0·›-hŠć˜™3.hē otźœ•ŲFĻ#Õ9¼4°ļÓe§”JY.ÖQ‘ī^xŖ«³”Өҹ„KežŅ%'(@‘ ĻEŠŪė[hXĶ”œž-BµV‰#ė/ÕY–n„„|¢¢4Ą!*.€Nū.•P"÷¶éf~TŅ«¬rļ“»­Ugœ VOnA1«óƞ]\JöAä‘Ę]`“<5ZęxŸ'sJ“RAL¼K>«“ģõ wZQ&äót„īD>[ź)֓бµ zż›ŽČ€iDZu€uö¶Ūo{żė_’‰O}2A‡ęø]³Ņœgi_um0i_'ö)?B҆Ś=ƒ|šaՊMIŠ<õI;qwyflh<Ó~^ēv„*q’’Šś¢K~ֈZADQ įŠŃķv[ļ’ąHØųV4ż­4enrµ’B»ŻÖĄX5ØVC_\ŹéU9]Gå4<F+Y3=édÉüž½ ³Qś€Æ¹ÓQ{Ą1 x˜ zČŹLr'I@N®71›3I… "äEĮi&@1®¹}Ūū>ż±F«·šėueKm|QÅ»ÜĀfŒlQcŠdź°ŗłĘSĪŗæäÉč{×¢ł#©TƑ‘Pž¤$±Züzš$ å‚B: š&„4?čp½j©Ę˜T”Ō4ČŌ&ѵ…ēÕ¤.”‚§`”¹·ÓL%ÜŽŪ„qVB3ö†D†aŽrõ«ÉØćz»11„½ā½Õ›Uń½‰Uļ2z+\xMo½=ó•«Õj!o5T0<ō97Ć?|„`ÉĪŅłķ]„˜üaŠ$ƒ­ź0(ė<)ZV5*pł$\A\FKƒr²äĆWB"ZÓiNν ķĆÉ„Až‹Į’ėÕ;]©7MJ„ĶT9ɵÄ!ĪBŽŒ)Wd„ā !“r-XüQh½¢ZŪ “|fÖ»&Zė›6}ć›ßHZŃ@„„eŖIŲß²ĆŚ‘±–HˆĄuk5)ė¬2Ś9®j’ØuŪ;f7nņ]yZk߿گyū/—īg-3"ŸŅ’o?ĆŲÆ³āĪõ`“ +ŲŁYZéĄ@)(RZ› ŠŚŹ„Ē £@ @iCõ„ÅJ5ššēTŸ59āŲ9Ėqģ(%ābvJAÄ©¬ HDāŲ²Ėag³š&åq·WLå]WޜęśZs1—H½S.'ŪU°‡v3g +§²–s\t='Ķ)”ń· µj·ŪłüT– H’ (¢NŠ­?ƒk!)O»§7›“jwwS—:²”»¤L÷ŲććüBēłJE›“ó8»•#³P92‹Ōč@  sŖŸ„|:tI0$S‹Ä“ ś…|ɉ€JZ›}ŲĆŪsŸq®Cź;„ļŚŽŚ/üūæŻk^{ŻF½ Ÿ¢ŌÕ2¾–4ŲL\ėaŅŹ+’¶ōÖi|QĒ9ēŃ|åäć`ūœēYō&1»ų µ”9$®?ĂxzjKUDś·®mµ°>ŖÖˆē?’ā“ Sł«FÅ}6Y:ŚĆ|ŲóxQ &&gŅŌv š®ołI,ć?^}ĶōųŲĢԘ^ńŠW@D)x’¹˜č.ĻłĆóĒL‰lcp’ŌKDŁd@¹ÆuĪyh(šĶę½¶óšæŁų蘩„<īÕķ—½ę•Ēßūž·ałvŖ“@“nŻ:ße'‰ŹżĪŗ$ŽcÖ48ņé « žō€Aė½å¼ śćė QØ×mó"~HĮś„õŅ.—·[‹%ūŽ£¤5‘Mq9č åå"ĄPW4¬™·4 +¹"?š µčīœN>¹7ƒÓ¢«Żzü”—y»ō;żxz£1ó€,±uū7klīĆ„Œ+¢|¬ć:Ÿ’(ͬõŠęI†śåž:ėM@B+&Yś””{ß¶ĪpĪyöøD"+_,U)sx·óźß£ļ•ō–>zwAŽõ.e8cƒųXŻSÄw­4ęģƒAŹ?Ÿä­KJd¶&*į«J”%Żh8…ĪLÆd\ 殤Ržæ$`RZmؽĖõĄhŖÕ €–°%XėĢ?šQ؊Hd ¬Ÿžü]žw_QU!Ć@%—‘eLJaö¹Ń\‡”ibįą 2é/tSftŖn”d “Qž‡†Ł Ö¶Z-„T½^ć˜rtžI„fé ’[„uŅ`œŅ2I>±•IłĢ`F—£HÖZŚķˆ8›‡=“![œ~J&ŻĮː¬FcT"Dä:u`āČDŒ}+iF¢ĘolÜÉtŖŠ”ć‡NŹN²ŗqm¤ŚÕL„‡{wUŠ|ŃżhóKżØ,U—IHt]Fž°³×iwĒ[žź¹P:īŅs─ 7/}ū‰²ģ@˜LÅŹc”“EEŌU..ķ/Ė$āVĮŅ•aIļD:ÉB枔9!łsä]ļz×>š¾ćŽ=Ęgj8ßg<ķoŽõīwĀ1ē‡Ś’ļš†Ń°čž8ų¦tHŃÕąŅ‚OŹch€q©’Ł«SU õ”ž1€Įū®Š~ūy\CÖźņ„8yŒjV:ਊ€  śč£Ł·¼ÜvŲ±gæ *ٽų'QĪĆŠ ł×  öæĀeæ¹¼62Ź‚Ņf,¶¢°:("QC†¾U,Ā RŪn¼iai¹Yo*`an,²tših•ÆEäæ E†¤4!]0ŃĀŽøksä“bćGO>¶ŸtSv„$\“9‚łĘ/¼c÷ĪŲŹÜĀüųšé£N<į…o8’āß^Ę9a! „,īÜóŽ7’ "VB”ćU+Ų¹.—]%į\1µYvGłRöŌ|«Ķh–ŗģ…%“÷ ņßöjŪä+į>^͈%½Ļ83žO'’‰†˜ā,Z+ü$/oб­žąIˆåÓ#°Oei°—Kc@Ö{?½é‰^…äaŒé€2N铜öœłŌ@æłĶĪž|ŅŻApš-%{dŠŪö€¤UY|<_X…äQņ󁵂¢A+ź#ņ[8»˜|Ž$m”6Ź7ęå±  ]¾ÆŅD¤ˆŒhé%WE |]Ŗ<ēJTś<ƒzŖ”RZ+ĻWOZåć@jżrtń%ÜԐ7P"ī"C•š™;Žzüǐ—…ØVŖĘ(ŸŌKć!°rÖ@jšÖŽT«ŁÖŚÉŹß>åqĖ»vüęē]łŪ_?ū%Ļk)fVż<¢·±å/W"ī—÷ĢÆ.fŽ¢Č9ē]y”žŻŠż‘v>±AY„‹ŽŁl„3Ž„‚Ū—J„ ēHĮĖ“1Ցj2Ēq&ŻłDh­”&fa/”ˆ&$]J,āˆÄļfē Ļ#ėø³xČ9!… 4"i˜m”_į½v Ył:Ū¤I=3ćb “öĮ˜³,±5[݉`æšČŗo¼”Ö)e—tNņ‡C'fV+M‰YŖŚĶ,ł EŻ¢wTJĖ*Õ¬_©qĖ¢nęš tffæū)Ā”–¾Ón‹$Ōw’üy”ķBryĄZ'.QްÖušōėŌE7j°ø°{Šn”ŃYÆ&C]ų½f˜µĪK‚IA¬+wlywĮCNŗ°ęź?\£4ynž£8ˆĻd1|*o»łf “Z­ČŠeģŲ¹ÓąŠŃä0§ŹÜ—NM “(D®š;ü²n¢|֜™ć8ö“LŁ6ĻŗqJĒ«W¤Ū8 €¹¹¹"'Rü‰¼ˆ‚/_tĻ[3[Q¤TŹ> @Z;čH ‹“xļž]õøżƒ‹/ŗyĒĪߎvó‰~-ó÷¾ōÕ’ņēūöļ;ēĮgj‚5¦/,.ģŚõ“§>Õ1ˆS° A(yŽļf‡ ‡ņB;čĻ'ÜOʲßkJC¦a<³•ӁI=!ł×wŠ)x:>ˆ°/8·Z "0;qČK°f9B³7ĶŹ#l%—錒²č)¦…hjeČó`gK"’ś¼øėŠ„ZōQ fGuKS”$VW®č"˜šNvF%’7żˆL†ĢØŽ?!! ehbjŖHŒTŗZõYy-ĢÕ÷ńöāJw\†•Jʼnƒ’R!ĻČb­ea(/ŻÕŁĒF#Ÿśł’˜ūļ8IŽņ~?UÕ=3›.ē;Żé‚N9 ” 9D2Į&}l¢1Įä ƒm¢É"‰(@  $”€rĪᤋŗœ6ĻLwU=æ?Ŗŗ§»§gvö$üżķKŗ×ŽŽģLwu…'¼CūĄgQ(sĆź¬»ĘIa-P¦Q!„{\ÖN<€™(CÆI тķČhŪØ7S'a×^nåßÉ&r4`F³ ĒņŽæ™g—Ō¶¤^CŽaBĶy{P_¦ ”ŠŃ#•ß÷ƒ¤Cž ė3—ĆK')T" ×­‚÷U‡/$#mä&ƒüŁĻ}ī”ūī;hń" (@‹gĻxĮ3ĪzÖéOżĄŪßń›Ÿž”µ¾č暽x)Ė€””bH.†Y)e­öžŠ]VM–ęż8–v{78[ÕM,²7µFā–‘¤O³¼æ,%Ž­ ‚…—õžĀb=ćāėu˜eā<*Љt»Vń¼Č;‹&csēµOw=ȈIśĮä ˆ…?),%rnÉż¬E*ĪųąœœP–C'q¢§‹Œ/«KŖS£ŻDŻw/}ć0™uŖ:SŃj Ov‰¬1ŚU{ŻMGĶ& ßDنaŗ[¤ć¤R̈a—»Č±R© !ˆ„>Ų¤|N¶@ŗ…“Į·>‹½~€Ö‘Sē.¦…I–ø°eŌĄd«ÉÜšzņD^'?l±`?m²3Kdźb„8ÖB3aāĒįD8+;Œ0 z@µZQB²a«9 KńŒ æ åŗIÉO`Ŗ‘)z–Š€„ń ČÓ4,2J (Ž’M@ŃģŒ‰-§sŒ¤seē\ŲZhīÖqz=ɦīäó © $ ‰ŌāÅˤ kÕA°IfUtKmUČ,Ž#BD‰?Hźs^".YČNZ‚²§X{¹Ÿó5w€lb"™³Ł&×½pCé¶ćG,Ø^š”%ƒ<žŽq1~ė¾K'Ū8ĒŚF1,wj¹µų€łšrŗ[vϚš³_ō‚¦ĀPPß?0V*$ķÆ×—®<‚$`§‹—ī‚éŅźņāā75•Ņƒģcūõwż†5Ć~åk_FY\š „eÅä|ÓdIˆ»vj ś•T†I«}ŠėO…oˆHkĖLķĮ­šr (ĆähŃ]ڼ[3˾õ/މ†®v)EŪIö޲ī'CCCYēIōn”¢$EŖdFDd"$ŪŠ»+¢$`-<¢–p#3S¢åZ’%ݟR¾‘TŠ2¬†œ"#s³Ł4ī”ļPvä¶Ź·éue›QE[ JČ}¶,$eż“˜[īPžļ¤ō[f!ĪŹ•Q"PÖnx›v(Z½Ž z½žŖ—µ®æPÖw>pmœō'nō-ŪHG-µóĪ" ¹Ÿˆ¬‰”ƒ‰)«ĄŅ'ĶW„«# ‘¼¦Ōh *IüœH©³apČū·MéoŸ4ź\įņ÷ķē[»(:µĶ\OŅa¦#’é†O%³‚:fq"3—vķŚµaĆ·ƒMŁ žV»µšešœU&ź“NkØÆRa) PV-YöäSOaĮ,$“hŸZ„äŹ)7tu~)½ĒöJEī$y°“õI—‚ ”˜9sHx@·ƒIY†k¬,ųā+.fŻ ³±žżüē#6ŽJŠå+ŽćD!²U0m絉i‰ĻA÷Į*9*P^Ÿ(ž ƚōķFA$šT9hJ{põ6Ī @»)ꊕlßrūwŌDõ„Əī«ō=üšĆ1Y 8ĆG7o¼ŻC‹ū† w ń‹ė’ō࣠Z“ž›Žę2ż8¾tłõŚ9o%{¾ÄDžYšŻŻŅ“R4‘;ŅÜ)’i@SĒM³\*Œ¼–ņö‰Z'+R«ÕR*ĪpŌ,O›nó¹—UÓ+Mėń]R÷ó [žČņĆ󓁺üś“F› Ā<ÄtĶʦū4{W mÆqtĀeĻč,ƒß½5"½¹C'hSmN%ƒ8GęJä €–2s¶6ŸĘ£Zė”ÆŲź '’šMŒ]ÄĘ6ļn:U±4óZÄBĘĪ”œTR”””uׄ(cŽ‘O¤ŚP”K#DĪ8-ŪźM»ĻµĪrLŅ’Ė„Uī/§$Nš²dܽ“ń/üÖ6›:•¼ā ½˜ō# öo]NŽ4OE¹z]é¹Ō ZkkŁj.č9»œł^ibók§ƒ|z™Ņ&٭ڲįĪĒŌÜ2öŅ’ī‰ †"įŖśäą÷ćć“Q¤³Zt)™Ÿ²6ĀÉĢ'‘”f“z°\TC*ÅG¶’0ƈ ¢J„"•(Źdēv›uč’‰ņ}ū¼Łd+`k:H4„JŌO;x¶OÕ¼ŪHV»”0?ƒP±E­ÆŹ}ż5OiĘōNœ¢ewœčqdē{:ĪņIxw ¢Ь™„ßæ›XĆjvRdœŗp;ŪŃģǹ½ŃSĢ:ØŅvZ­Ö@§ĖŠõ—:Ö€¼tĪU;³ŸSŽ3̲ķŽQ返ŸŅØ„m.³w̜9sÅŹ•Ź£„¦č?žč.½“ɉ‰…‹—wŌŃ˜¬7F[@AŒģ† 9Vķtßæ '×åš{‘{Ģ“=ÉĖžųĒ?Ȱ¬¶[7oÉz ”hÕ§žóåĪ”’żā—ŻĻ£¤œÖlF,$„DēŚR™F@łhˆžŖ,Ü^’/ß5Jq§„ž=Ł GVŽČć¾O;ĆŁÖßt»Ci0ŚjWZØČ*÷~‘Ū ūvnå‰~©ī¼ėŽ»±’š8hĪ‚¹P³Ć>üäźkļŲ½‹4+ÕJ%Ų¶gwÓĘ`e+†bØ ½“+ū„|°źiö|ōBšĘ‹`ecā(м؉ekybbĀhk­MĻu7Y›ĶČƒ®@”,ēÄęė‘%Õ %‘ꔤµäéŪf·[ōŅi’ź^Äł?ųźTĆ+°Ķ§ĢŽ;‰i··@S3Ą’oeż»$·…‡ŪīyŲLŽ‹ x:ķZ: ŗlt©ąĀć·pOJZmĪb×+÷ ĆāŚA ŠIFŗ¶ 3rśŪ“¤Č›wPĻ•h1 32]ŽĖź›3T®U›”* ×əƄø• Q˜Ņ¹ģĄZQĒt!eŁAų$#ēMŻĢ\»Õ‹§«łø²ÓL )‘PI4?3`]O±płNĖCchpH8Ö#OēLĢÄĶa% "O„éLk†,ŲX«™ ĆvøČ4NÖO{ׅ­5ĘŲ¼HtŹČ&xīĻz}Ņ5Šn½įĘęŲb“¾xttŌZ ō…”ź¦cÅķ%2j£ m¢’|4é[fg#g­ęRuP‚PŅ‹{S›’×ĻŌ”²śyČ8Qqė;å†NžŠ™ŻĻ)GŌ°ŽM³1(4o“<™ kc—-Gv™’~]Ō Š·ŠęY•2īõĪĘ]„ą$Ä“KŽ] VÓęĶzŅx‹/ąj(Qå„Ö“¶Ž?"[LYZ8÷P4䖐8gō²¶Ņ9C©_]ā–;Żo9›&Č@Ķ_øąCAŽi2„.ūütĻzÅP– ¶o ĘYgÕ Ä Ś"”Ō€É4FĒI[ «2g—·{Ļ #ž¢ėĪ\ŖĪŲ£’V³ŃxęŁgÆY³jåĮżļ’~atdøÖßļE³ŗ¦,`mµ ÜĢĆGžćƒ @H ÆÆĮA%“RD°Ż]O‚ Hį].\L‘gMŪD™øeJZčā|Ū;)<µ—H3d« 1<۾àwJcŚõŠ-AKrn‡ØH]o©@»ųB!Ā÷ŠGR wy)’ŠZd#“(Ņ€W®ÖŚY1YwŗÓ/p‰Z2QĪE¼dk²ÜėnšD#Aø»+LĮl†ņ혩NÉiEĆč@¼÷% W:mƒm )m*ožß”ŸbŒq(ōJµ «÷ß’ąCnx曮Rķļƒ dDšKŹŠn™0³–­µ ž4QL‘Õ„Ńś„$„@ČBŪK—tжĒT”¬–I…Žo„ÜŚĢv`ŚJ²5ĘÄqģ‚˜Ōµ±ķͼZu{‡‡ˆlt¬AŠ:’ŠöŽģ jĮXcüˆc޼śĘkĒźū?ųž÷q҉R0Ÿ’ā_tĪ+Ļ;ļ[/yžó_xś™÷żķ†³Ļ~¾IErT::q›`żt³©=ÖKż–¦Lځ1Õjµ]ŚŚ 6šdļ®ŌŖ`²Šd ,8­.k²4ŖģÖVx¹ż—:±yaŪōØ8°Óāv±‚ńr”ćŻć@>Ł# %Ūŝņ³kŠ&_½ūrĖ·—l¶—bd÷ŠOσNÕåR”JiÄļžźlĆ µƒi=ÖöĮÉFŸå1B÷ģ3bdā|'HX¤1w«“ü¼­>Riu¶TįNTłvµÅģĄ¶Øgܝōš»)EŠ)µÖfe“…gWśÄ8”?†Ē+ØTą*īO„TÖ[”š.<—޲ā zō^€ĖÜ8• w럦ĻbJ;Ą|•ÓOz¼ŗĘo¶ Y\nĻ1FH‰|ǵ”.Žž·X‰Lnkfhm<5·C†–’TÉcų©=SJ‚żĖ“6F[ĒWg[ģśŗ¤×ļż”ķee›Ę Ų0H0–xļæ÷CĪ˜ńš—¾œ3lk!%åČØmé§ …¼p“Wŗn½H0S“¼ž2ŹLq¬Ż(Ȅ­[“Wč č6ZLļV ŽS:1ēr{—? †€ „“h¶lk7„즒łŅKↆ”ū,ļlāõ„„g”q†ĖŖK]šĢ… ø v€/µĒBī^²®.īæ–J‹³+J;ąSÆ©ūk«¬i­O’[æbćHG‘6ŚĘ±q–½·’œ-˜MAR± f_ؒ¤#‹Ftū¶ūĻ=8_¬IųóŻ“xŪŽ»öS)ŲžAÓCŲ“µ>MŅ»;&ŹxUSF †„qY˜,•%šÓ70³RƒÅīķ»|ń ’Ė‚,1C˜zdSĘué™Ēęń‡pŁ‚‘ĖįĄ–ĄĪK •ž>!°0ŽŹŌõ}øåA‚ÄĘõX*$¬ņ‘•{’žJĢ]gB igYęæg¢6nÆF÷Ų-ÉN¾,Ī6ż‰Ss§©H˜«¹7į'«( ä0³Ö: Dl43 \ł’ö/oŪ8¼ē²Ė~{ę3Ÿ9¾sēĄ¬9ß;ļ¼/~śæ› żĄÄ0”+?Hė7/+µ 2‘Œ ÉŪcB’21Ę8‘Ųiieł]ķ\/·Adµ¬Ėe~;t‰{*-ap¶µ•žš‰…ü8e š^%¬0ž˜¾*Cö}zW6žÖ…f{éžHĒ©õqļ ¢)µs§L»Lž^fæ†T¢3™ēIƒÓĖķwŗ÷ŅßuƝœœģļļĖ'ŖÜå„.|DZ¶ŠZW*÷C­µwēā¶¹ƒāBšævŅ™,œLŽčRPū{d[f‹|7…Śz,™01ėĻ‘S‚ķ0č ŒŸ öıvXīīw¤æØµQĢ’Ó>[–÷AT $Ÿž2“’KŒ5"#l@ķŃ?õŠAånm“'°iœć"öFłN$n“C*‡Sę<ĢBu“śĀXė6‘Éü\K³p‚—į&ŠÖŗ³éõ÷™cĀZNaÕ ¼-afv(÷†¾¬ÆĘcsķ*,Å©Eł(R¶–„°Ä²ģäj i ƒ ÄÜź€ÖśĮ‰ŃÖŌéÆęs“ĶõŅIˆÜNĒÜ·ź¦ŲFܵ¹ßrß'¢ŃhŌśŖ.F*åߊ–Üvė€Ī]0 [-¹¬ĢqiŖµÖ¶āHK)›ĶfµZuåkXØÜ5cRćėŅ3%=:Ó!qćibæ/9†—{čīˆĢa^Øm+Ģ|é56‹“)?¹ 7˜]å{HIZą 4>øŹ\L½^ÆÕj^½ōµń€>›Œ¹¤Ōžŗ`kßåĄĶP`Ųe¬é”h’ÄÕ{øŠ©õ¼Źū½TÜÆŗvfĢKgKęÄa­5uŁś²/ī"§ŚUŪł@z¶Īh×IiDK’ļzūŪĻūś74„AŠ©jõ~tʇ %ž4zd†1Ž*ub¢Žß_ėq|ü‡¢›ītį·ŗź%C½é¤ :99908ŻgZwj§Ž”Ņä@€Ó¹G+(ćõźtMZķ¼Rj~{±¤ōɕ:ń"#ŁEƒŻ§ŒŽ¤»v«.E%’1•XęQY& ޼{ĖĆ[6h63¤8󌧣a”¬^yŁxž‡fĻŁ39Ź“ćŠ5„3YR`(’‰ŽwJp\ā^š3]ÖR–· µÖZwo¦¹bLš{Ķc'ĘĘ9£$YØīcœŁ£÷ō3`ƒ“*™å@¶M@V^¢5¶­zg‹"’6²•'ļŸv”9Ī”HØ>Œ(ŠāH§²%iK' ł+ā~;~—QJŪ›Yœg¶øŲ=AMū~ÅgTęSZ@ę>®X‹MyĖÅl H(H)S“.mÉB…;›o˜<č® ¬¹`źŌĢLŌōY“µ-„|:U¬µććć~H'Ҳڶ äu˜:Œ§ZvĪ=.u±ąttdJĘŖ”öpZŒÓ|ūĖ}ć– ĻAżżµ|÷¦ė!m@L,„M¬ä $I*RUŗźn0J„>mA~Ė2ĪYÕ©&ģE›ō‹˜3“*c/IHzž‰lš“{ńζ"u—‰š±µ-jŸI…E¬įßĘĶ@Ų6Ņ/¼M®;µd5#f2äĶżĻŻĖŹĶ­ö$¶1ŁōƐ5KŹ:ˆĄõ*aµÕ‘Iƍø¤’Æń·„jRµRäQēYmŅōI•lĀŁZu¾eb›3/ķ°MĖ” ńøē(stīl»»…ĻĢ­ZA!Ō-lNv…¦ė4džh\Źl“B )S [$äŖĖėāzźoKę;£ ”ČśŹÆM{¶  Éܰӝrß“C„$©D–ÄQ@S§ŻE×UBŖåńKH-h[Ć& …% 0K`&’PjÅŖÕD•`ŸžüżŒXCĄ°qē¬ čČ“ŠP–‘;7A”üÅIaćKü&D:vŪÆVAĪhܲ÷ts³Ń "Ēną\n̉t­æj9­eąuĪ’Ł’µmxL0Ģ-‡ēÖ!Žš%¢Į恄JŖÕŖLŅ·ŗSn3ĖI·09’(‘™m©gøT^”Ś÷Ž$I%<ļšŚņįV6R€¶u ÕY2Æķœ©ŪP‹8Ąiƒ?]öŚ­ANĻī¢{uXĀ(éu(ŻajÕZŽަwė}Ž*9ńmöćO|1gV%’5‰Õ=J¢•ˆ%dc §¾J"E39ר<`ŠrFÖŻŚ†¾wī;ķ nē|•"Ī‚ č^ lgÉvQŅź„Źī'Äq\n†B€ › ­žŚW¾xՕ—ą?ŽS·m›‘6iP™exr©ķų”¹ā”%Ļ)2A5ĖÄś“S>܂Æ$½}wžĘ±Éŗ ·?ø.Ņ-SvŻ=.ĒoĶdATėļļļė/¤}qŌpmŪī0ØLrŽķØ}Ā€^S¶Ż:„¶s¾Ż+Ż ®V«iĪ\­VS-®– c=¢ā£`(€cBģŁ_ėĆVśęĻ[°kēn sō1{÷īwÕ-ĪŅ2Ī~m»V×4¬=’é²öR :zĆT§°’"؄œ„t…AH—„×q…cž¶%†uYˆ{vįeå:ØÜæLÖę$’Ȃ åUol«(垬×ėYg©Äė5ń Ég/ķœNÖM€‰Mß¼äŃtēļwø’Ó¬L%ցĘŲę RÜčÕÉP*ŻĻc6µ5ō²ŽYSLŗÅ8µ¶"‡_Ńßßßq¤° `± Ŗ‚(¶ˆ­dČ£4µļ›“Ę!{”%žŗŗĀ‡Ō&ńeV*FŠÄF•ĀĄuT¬įdĻģ)HR£°”&BV€C¶TģžįŠĪ-ŁZ¤ ŗä¢œ™»;©„PdŪōbs™L‚älŸä… cNh'‘É%įU‹Ņ‰”EK‘ ²ĆgYœkSµŹ®™ß²ė÷Ÿu¤Č}¶Å#½žjµ’ aÉ7Ö,ŪĢ-'”¶ dŚE1Ę?ø¬°_wĮšŅbe©[ Ķ„Æ¢¶(4Ū§¬Oė@E×¢jĒörlĀÄä„ß6 ¶E½`óZŽ3m!DY]FµĪ‹'A ܾRĘWĒĘŁøĆ‹Sõ`J¼©€ö"Ś…Ž3]/ģ¬绵>vąÉŌ2½^v`JQåīĻhbrĆśõfxd’ģźąąą k H)‰|-R2 QĪŽ­“ k©µ;—LŪ*m1³  b"Ö¦5 …°pyABk}Ŗ#\k]³‰M}M¢Ķ"w¦åDÜR ­+į¹×$½Y‘uö|ĻmµÖéöAN©{‹„*ÜÉ£¤ųóRe]‘kh{G·dmŗfÅ®žŅEĪ“[Ą[˜R$e…}»#ĻįȚĶ8½…NĒ —j2ēÓ{Ī_N*(›Żó yB'Ń"Œ?#U˜ģę\ķ›göēIt”Ņ³6retī\/e?ČŽćŃm§|C—°”¶¦tlĀ2BŌSĻ8ėSŸł@.Zz0HŠ9›{N üģQčqŗH­kń9ž¾ŅAKéžčG8³:?üŠ /¼0Ť£ŚÉ†č@śKæÄć¹Ö'Ä]¦½œļ®xbbµIÓWV*•“»5%= #n° hFŽ’ €”«› Ē»÷ķŻŗg×C¬»łī»ę.˜ļŠ”ē$tbŪ=‘ŃOl„}%M«*•J:_K/É„¾]œ‰>۔퓯_tƒ:0Fk†ŹõėŚĒł.¦ź©YŽ£M`xīCūśśņo>‘‚©RāGÕčǹWv*^t2ˆCwœŸ›źå:éł$ķqäI΃Žøū“éąl\2 ķ…ƒ”„Łi²užÅāŁ} !,ėŲDĆoZ(jŸūħ\x+ådEB‚˜fA¤Høź{Žüć0,T6±SpČŹĀ¶"dä›{B©|hūŗėČ&O ‹D Ä ~ēæ½#čÆ,^2æŠ?:6ņ}),ēµ»=^Jŗ ī½]|i--é![ē&šę·(S°kS€œb­5­“&;7JżŠŪ×x»ĘuIŠ !5e;H…tÅĖĻ —š§R1Éŗ(øĮ„”¼(ÄÓŚŠŪw©õw'XGv9FQTÆ7²jĖīt€§BöÓK=`Zµģ¬Yąq-ŹFæ%5šN¾E DFq³=•-kg“h„©rr!‡!źh„•Źe1#„$°EEŽgŅ: lĪD—3óV&–4µó8}n?aó®|ŁłyHķuĢVJIAI½Ä Ł  —U„W$Ŗ«\hü²/¢†* GT&‡Nœs*āŅ•E9‹ņ4źsmIĪ(uƳŖE¦@¦ BŁf@a#Jń›-ļ c;„"\ņP:ļĻŻ›ÓmŃj#ß=!ŹŽŅĆŕÉ\Ó(Å1± P`éģۃ½RNÆÖ:Ū‡pżĒŸb>ŻE”ŽA›ÖŠ{«Ē# äķų3[6?’łOµnÜ{ß=ÆxÅ+H”ȏe!Ÿ]>ŗ 2픸ō¼ģ®{\Ś,-}ŸlŅ××§”RJ¹ ”UhE÷¾NµR c8²7]wSŠ£J1I’3¤śj5‚0 ĮbŖēŚŃA®‹†Ū“ŠUD”OŚ”i‹‰‰ —&1“-”‹śĆĀGo##£ķ=Ņ)^šeq9čØõמžZČTleīخ–Zē®HÓ]g©’]żżżiAŗŻ ”t^uy‚½Z vhž·Ę§s§—ĀeΤV «šŃ|šÖ§—“6‡]PRZ6¶Ö·Bk ę©ķ² P‚ī›gf&,³|õڵ«Ļ:żŒļ~õĻ<ęÉĪ& Ęƀck’ø ¤(u²õ[uiJ'`[™Į%Õ XZHƒ€I1$ ›pS:lk%YŻß+†2šžóß?ų½Æ}cqepNDÆ:ż|ößńāsR¶¤K}Asš–N,ŒµY7ł jßÕI~"ŗ–Zó€-“Ö¾qöÆžjÖ¢©8äm*¦šĶ‡‘q0¦,Œ¤ķäMćfΐč²Õ7k8Žć\ĪĆ©•ŗ|<µ’Ą¤ŪlgĪ­J?ž@„ÖśŖ©Škö°ė½kŻc><õ“-ä;TņśÖ®HHƒų©ć"Μ£I #5A…·÷³ķ’EIß/åSpiY¤$§āp$<¼„“Ü&„(M›nūģE³rżźœŹzÖ?™ņ†–¼E:įó”ęæ`­ƒ&ģ_6VĆjkŗ¹hŃ"t·Ķ£08(ŚĀ“I•„²Źy$a¬ńP\0#­™!¬”ĢlCäX!6U,ó­õ¼ÅC®¦į hå0…$ŽbJK"Åģ‡Q!$¹'˜õ+ά÷ØŅܛ²J]Eńš¶4)s—Gņi>IYmź4ąÉšÆ;ę<…śo÷P;S=ńø"r`‡$ņ”© Ż$Ż=ŁMSŹ[;ʰ Ģ87z­P°µ½ēÅŚü½;ŁČ4ONń›łhŻ­›Kq|ݱ–Üs³”—®Õ’åd6ʢݢvé«:R8N„ICī_ŪɃøeĪĢRŹ?ī Ģ’ø¦P ģŽ÷ĪŽ[’f~Į _hŒs†Ł”£ō„ķ.©ƒ0ą’ä«»õvš·¤0]l…8»“ŌS/%žĮ‚@T«ķٵėčµG :¶€*U»dį"b®×ė f϶š}2œA uÆŗuńwķŽ½l§Æta̾\eČ}tŅu²#sg|_m``€m ØV˜CO¶’%a=™MKū6£SźŠY )( VŚÓ ­M»ß&µøÄi$'³[ @ćć“ZŪ¤ĪķÅö0-²t¢ŌvóIėб­ÖófŃB¢&ā1˜jM«ÓµE™i“”² ¬t;ĖŽōr©>4v(Ø»ś°ūn»}ļŲ¾[ī»ć󞄊d„ŠÄŠ)$É~8UņÖ»Yü” ¬dmĀ;lIæø„” †×o=’ _ŻńŠzŒE° ‚!15ö¤SŽąśŅä>KŠGyčS_üŸ8žØ#_ūŅsøõΉśųæ’ķ=7Żāݼ]”Š„ŌG„ ĀĒ©e xE&n“J¤@P+MH>Å3ĄU£ WLJ)ßtåܬ+j’ xĘ8°(‚Ėļۘ\ĘŅŚ±%YĖF[cŒVz„×wak<>f‘Į¾ Ü&ż>ūśģsÖM Y1ŻWuF%£mʲć–pyF’ŃdvahĒwĪō© ²4Žr Ö$j]ķ’WEÄd–¤l¢\©E,L9‚S° mM"FX“©Pėį¦÷ā¢J)!<µŹe­i—ĻÓ\EāՌ…Ī£<’Œ¢Č9Håė#EQ®/—Ń’šūdź5%č™Ļ{Ž 9”öžūī…±­iŁBsłƒu=DĮ2Ž4 )\ł ÷gĀ· )õ¢ ©Q/‘äDۃ\A_3Ų§¦n½“ ™,«PkdĖgRR¢÷.£H£MõĆG±¢$ĶōńžŸ7®ļÕÜ\õļÕŖÄøCGž›ķŻFJ’³„>jÜr'rzćīŖtl05š¹[“mŹĪ \9sf·‡cŪ[Ł%YyĮŚ#œN“šs@æ,Ą¾—¦“šŠ”įĮķhš,(:«På&˜”2„:¶÷Ć0ĢŃ¾.ZkGĖ··zlŃõŗ§-(Ū¦å‘ł¹ఙ¯ø=žw®éòÖZ†Äš{šKn­µĢ&©¢S)¬©żŽ:u‰, ī8=]Ōī„„‚¦W±jµZV-·ŖlŪŽöš2”}¼)q>¢…L#¦¤-ß4‹K+"Y’4·ŅŚćļ)!Å*NÜxrbƖĶw>tļģ…ó_ś²pńr„R®U+” ^ņ‚&Ē3McöL‘tŽ4§“ŽävˆNę³Eō”YWāD•Ą„Œ¶qc@h6›YHmÓŗÄF"n‚¤FŪεOæz½V¤Ķ%Ę ›ßƒx2³—c!`p _’pŖ6RPé¶ghiQóJŒ„eĖi€¦Œx³ƒ”V˜’Ö@/ĘĖķ ē¬ō_Ŗź™>ōŅI"„p"l®8GÄŠ ķPķ‚eN§/‚1[īy`åźÕÆū[ļŽŗ1/˜=÷¶Ūn³d(&ēĢ!2Ų[# 'Öꤛ'Z&X–`’Žōš¶æłé…ļ~ć[_xśYłżåäÄ„:‹mf‰ż…+8鱄•ųČ'>N  ąi/{±ćŠ“rM³ĆÉ\Ģ»\Ļ0W|Jź5R  ą¶IĖ©! Č/͊ÓVmbV—N­TŌ:Žć,Ž){‚ųmI c Śhm ’$5p÷Żwē„™}"Ō}Z¦ŌcøŌYĖ)œ„pi”$Bhš@ād¹;æe²żłzA‹Ć™¦»œč%šŻR{ø¤śÖķōqČ/ÆWĀ% ś,Ćw†³ČlĄG&š«;ū‰¹p²»XŽ/8z|ŠĆŲ·öįK£-³ƒµ§Ŗ„%E,īĢ,č1ij’\&ģHģB²4>_[ä˜äŅhzłp 2°»öng{¾Ś.«ŅŽ.©ŗ·v» »Ų7n”›-b·Ķ¢äē„N;µ¾ŅjZ6^ņ'Hšmd8„š8…/ē\Ū)Iī%k{Bާ-E{|7׎K«cķsFĮL^Ō‚¦ī‰NéP;ķ”xʰcź¾J‡ŒÅMwóÖŚ ²eB”Į­¹óW'%d ŲZq×C÷ļ·ĶŗĄƒŪ6]óMī Äq|ŠĮ+F“ ’łĻW¤źN}~ŹŁÖ½ßŲž-—¾ ŻOuŹīeY‘¾8ŪT§vńz†T¢Z«ø“©Z­uœµ„i¬“ECłV3µā ¶~ß/œīy0C[ɰė[į…ū­E½Žä¤ źŗ1Ö°ū ±9J}S{4…īžM—ĒŌ#-< k)¦JņQ€˜1%aJćģÉ×~NtBїž=œ‘7(U±.‹Ł!!O|Ęæŗņņļ~ļ{ĆK’xł¦}{.’ćeÆÉ?€¬e-H°±®œÖn)+ł«m<^Ż·tß~Wøuń}«’•ö©’É’ö}[ŌhžżŒg>ė™gŸūÉOĮ"I>S!ĶėŅJ0Óšd<§š-o}ė‡žė3ĆF¶ā`LF»·nvķqį„Ė=f;éneÅmņ•õ߉go6Hŗś¹by{£Ģw'Ų÷ˆ œ“×Uģqy Ę *¤Ę-Øjfō“ņе ’BČ|ši“ÉÕåTŽKü' źźÜŌ:®cé\"^Źž‰8U·µ"QKŖÖ*…ĀÓć)×gįæ„W®ęM²eÖićĖ’ó¹e‹¾åõ’ōč}¤]%œūN‡Żój:å”tovÓī÷”ʱX‰:†é¹SÉ&Õ$¤) µņdņŻ$clŹ..’½ DĶÜ4aXmĶIˆXWŠevŅŲ-7fdµż×ĢQJm{lkĆÄ†ķŒžĮƏ:RzÅ#w¢‰,—>;ėrĒØ{†­Ż8 ÕϤŽh`Ļ–mŪ7lüēW½ę×üüåĻ}ŃśN? f+™e&«Ļ*iQgčĖT™‚Hœ„ĀPƒjÕ/ŁrkŖĆĘRš§MÓg×Ńõ™$å0ϽČéµpg¢Åū’¤¾҃nS^Ā+u;³ßģĖIq„?äL„"’¾ļH2‡WĻjČwĻŃR’ķtu”ˆtNCHY“N"”ŁHĄµ3jj-eĀ–/쓿”» !ØSÅAJévŻv»ąN>ʝŸ˜ŗ$]ČŅ­4IIqęéI”ØĘJęV’Ļv³×™Ńå¢.ÄL!Dé;TK"[=N’öp®{`Łūułõ”™u‘HGĆD»«YiŠK'€ś{׊…ĆĪÉ”»P—Å„aŒIĄķč’¤1}å42F/>hYL˜„aŲĮ™3@@(BYłö¾W­„Q3:įÄć³méۘvJ¹‚iÕŠ›ƒn"¼&ŗTSˆaÉ^x±ā“š_D>“$G’¢>”KÅ«ÓQĮ¶-v!ūL !S·įģ–—źH§—­×„ØT*¾ ™0KKŌj•”-¦”Żq×@ŽÉ©¼ÜPturKėq’=ˆ(yN9K­m+‰Šā8Ŗ’ič•{€”Ę åÕt‡aŲάė2]ŪUyó5RlOÆkų{_ūŚŽŃa’øćž{7Æäųć' .’ėŪ6oY¼l™kRł~£›*”LąH7ė͸޼袋śśśV²źŲŽa‚µV¦Ń-`‘4Ś!šŠW½rĒŽ’ü¦7’”·løŚAų`„ĶźŅu*ʵ/ÜjVP»ZšśĒ6kąßüVe`†x’§>õĻÆ{ķ”ž{ö3’|ĖM؅~"ˆ`³zÅžM²āvöŌ[˜­%²ęōä(Ż|«Œ”)Ćz§« #Š¢0 …(Z·bV ²-›"J2Īļ Ķõ„s°ģ““Ó²0±–•ĄÕĪœŅ…2ĒĪ/šōį²uč2ć¦)§qéźkIĀ“Y–a¹]óńb‚GuD­†öćtÉtQ §g'Sq"b:0,~’»KčŖ+’ŗqż†+®¹:Iüän93ēF*|öVȊ :FćǬ¼³Lf/•8ōf[Ä®+ص ٲQåģCoQ×čĖūŽSW|—ÖĘÓ (£_½vW/v*Y¾™ģ7V~xxwr:3‚ P$˜ķÄÄĂ œSLǁ “6ФTIčģJvKØBfEĮżZĪBźń…?¹ R t£łčŗGŽ>ō›žvuMѽw޶ź°5$ÜkQ¦Ć‘½ĀŌį9ųM?Ś)ē}”¹Ż?„š§»!A¢Š”m¤¾›Ņž‚BĘ&ķ¹n{\×=@j½ĖŖ} Pyõ°‹ÆrA.>¹£ĢgłŅ$ĄlŒ‘J9Æ]FVē™KƒĻ“ŒėŁiÄü½å  ›ę}Ż-²2cÕj½ø€yžWésOǬsD”…žŗź%}}Bšģķ®åmŸ(”…kHž¹[ĶĘ_„.S¤bb-$„ÄāE‹$#”sg͆e(4u|ōņÕKfĪ}lē¶ƾ>³"8mwŸ®¶ŚXQŗ„ŚC^“5wT¤›r‹R"|XJR)/W+(»gz¤ĢL ¦(ŕy‰wX'ü^ė-s„QP‚szwÖŚ Pnw"•3J-7imÜ‘i-œ=hś)-x$·fĪėaų|¾x`PaökO?©ÜąpĖz“—$¹‹K{Īö†:®”.« <éŹīŌŖ}•\rī˜yäo‡ņŽ • ģ=śŠ6óö©±m×ćædl“Š&”*¦‰½ėń¦Æ·ąÖQ.?łĪ×NXøšųć×|ų 5‡ƒpÉ„|Ž žµwrņŸ_żšĖ’z-TĀ•rÓɂ@Š oxxŻ/~ń‹—¼ä%k׬Z¾|łāå%9HO;ó±qhCX’ųĀgF÷ļ½ķ{žė_¾ę0=:©f@%­²ģž«µVB¦Ąõ,[AФӛdÅÄęņ /ŚōążĻ;żĢcŽ9fld’ąœYĢüŖWæņ{_üRsl|ĒŽ­ūwoŸµd±TŅZ ” YéÜ$ HeIjŒeV0 Ä:‚ĄZ–JødŪmi4©uģjĻBR68cęjÕ;œ»œ<0kA¼Hƒ‹•Šböśų,Ń:ņłmj„#RsKĪ­BPQNˆ›$¶Iā‘}MkbĒq„R±D‚%āŲøø<ųNø»aD§:Wņ ˜™IˆøaHč@¹n Yµ®–z®·‡t\”fŠć8É(½0ĻŠMOŠüIäĖŹ "üõ†k«’fŽ·ļ„5”Ć›°1BŹt3) ˜kN꿘 ³—„¬eĮDٌĖ'-IBĖĢ>Aµ€+ŪKĀa@„ˬ8±ŌR²%šHŌBŗČr U@k«”€Fé ¦tĢc!ŚLĀD>’”D"ļO™f,“ ĆV — x4h B֒p’}nÄȒĆøē¾{ Ū™įąh4ŌśĄRĘ0ćŚH}Ēķ·/^ŗhÉAĖ ˜$Aŗ¹åTƈˆ  Ņø¹ t§™]»vĢüÜē>wÖYgwŽ·ŸńŒg,Y“`ł’e‡ŗvŊķŲf‡,fHĖVŗ“>6"Eu¹šX+­ŅMDŲłŲĪm۶͜9såŚ•1Ué\×ȒqSŽ@°äŖ^üõ*c]£,ƒÅ-³élų$ū¹ch­ƒ ČDŅRkI*X 6)¶…Ó8dɂ…ō Įķ_R‰V`@‰}W’hųd²’²‹®½!֞ž¹•īŽę ¢Ņ˜$U®^C„ųšĒ‘-sjæ’Ā&GXĮ–<+īŲš¤jdåZ)\R\óKÉ×L’Å’q¤¤• ‘pŻZf°«B–© ĪŌ塚`3»šTŗY)$»Ź˜ĒĘĘĀ0¬T«¢F3¬TĄTīu–ŒĆÕµö@@p²ēgZ?–Į‚dZ,h…@e1^ÆE„  ĢÄŁž ŚŪ?Ł“°mŠVü*…ņX˼ž]Ve Š®cXźQ¦{Jæl7ØŠš>;©$FĶ~\¶ņ’~ŸĶ‡ó‹’E'ļÕ4īTš™žBņ“€ ]~«@'Hą%$žr×éξÆS_’aI҃,¶zͤŽ'aĻ|޳PÕ¾ŹŅł÷ļÜ6TēĻjæßiŻx)›²[BŹŚ·yøN—ŸŠ3[ÅDé-ÉĮ=×īdŒv¹c§_’~ī^/ž½o:RJGīBĪ"„ƒˆ·Ś’D‰!*µ!½ĄlĆLŻŗīY ('ńāČŲ½ AM‰'™’S BĪĪź †ģūiéß bź¦<‘ż•ģ?‘œQƒ+ØŽw8Hk[Ąź;Ł”ģ^FD–-ɜ”H&Æ5ftמm=☣/łĆe‡žp¤…ą§?ė?ųįłøö†ė ŲāōTnbr÷čī[ļ¼é–Ż;·Ļ_4’igŸ¹`éü#?rń!ĖXŠŁaÓ¤³ Ćd]õÄ23°|õ ³éŽū1Q?õ̧nŻ»‚`½²¼ćé;¾%©Rk *’L¬żh0>ü<ā°Ć?ų’Xµvķą¬™éȽóߎ=¼’ö}»æ’½óŻy)„0Öø"zö<šŠŹbŚåHG9q%<›ŌŠÅ¶šöRŗŽWEiw4-Ą]ŁĆ#”AzIXo5œöy„Ū lŚĆ‰cųזlļ„P|‘ńĮŹśĻ·/ s7…KI±U$½f¶Ó•żhšāĻ›nŖfIDAųÄ#!”–\Rš[+@īqgĀĀscƇ²v֌™šŒoźBIc :ķ׎ok˜Ņœˆ`S®Htј³L®)Ÿ“z°¬5éCōčV‚6VõN¶€f² c9¶Q3¶†ud),!*’IųŖĮ8ō8YĖŚ߁ąÄĄIt“eiēģźi¢9CC@p Ä ¤”ŽŖIQ#nXA ”bÖ¬Y4¢ĘĀ™ 6¬{"Ž|’¶>rŃߒپ}īĒ>MŽ»ĶIJ°,@,Čl’_:øećųē1£aPn¹ņź-Ö’ī·æ5ązó›?śØ~ä}Æ}óėOzŹ“­X88Ęßn»~Īāł‡x¤W`Ä1CI€@ƒcmMd¬€ØÓͽ#›·]ó›KŽ÷Ö·|ęS<ā˜UēžĻĒhŠXkażs÷ū6ÉD8 a -@šŪ‰<Ł!Ćwu wdH%‚ H•š=9#•Ÿ4Bś²${„Ō%™Ó®oʲšLéLQŽaŒøŖe|’Łj­SIŌ‚"IwbjŁFįŅŪm“JVn{,ŲmP.aywĄŅ$§“Ilīõm1UĪ“™.:ZipQ -"xņ•²ۘ;œī-©{‚R2×NHN1G­éļļwł°ŸN&œĒÄĀU²­ˆT'ĖŌ#™ŖU!/Ä8EĘ;Ķֺ׮˜q½ åN'M$ī{|‡@AöBŒ’{ōŸ³1gš$ی¾Ćć Ń{æ~ń8m!ž(ÓŻNpār}ę<ńæ=sčrUVE@ ‚Ą]wŻõĀē<÷‚üšŻ’ö>"km_xĮO P”¼ļĮuą6•nS”āŽIČ"’å"'¼į•”’é÷IķĶ2—Nzż: ( µ›0ł„‡’cŽ$z*%“yéŃŚš¹PGšžNu bVLEņö…ĶŗGŚp/Y/śÓ]GSŠœ„Ŗ1F[ƒéČæé7Ī’7£@›éÕŪ¤ŖŸŸ¹ %…Ž LlJI•ng)Ś-ĘkUߝY„±RČ~ļ| …|ŅŃĒ@J4£]›7ļŲøń¬ćNųŽ—¾xš‚yū;$CY iv>šČ՗\ŗsÓ¦»oæm°VŻ?żäO˜=³6sˆ‰9LLR4#懖µ%ƒÄT«–TEšąĪõ?żÅO_{čņeł ”S~v–o¾·Ę-ƧD²€aÆé •r=RAqc÷Ž0ĘĒĒļ»ļ¾};w¦¦Y łĀ—#§=éÄK~ū@ŗ¤] ÉyŌ+Śl B ]®RŅÅ«JI)e¢3D-…ź4!r&+†™¢r:•f²}47FFW™SåÆ œSą/tR™ætW/Ż—Ś©%Żmŗ{\3Å,qšgĮm%rœēMŗrF*=”ZYļd%˜`Ą[‰s’żC ĖÆūėUwŻü½/}±Mō”¬”kĶÜVŅš›OludܐFk@ŽŻĒ×! ELĢm“Ó£ņõ§“.l™ÆF9ŻÄ¬Ł,qn:…R9s]7·µ6ĢÖ‘õz=… IÄQä§GŖ"¬‘‚Ųڰ@’ ŗ©mäA\U †‹£ŃÉķė6éÉńļøĘĀų.4TĆ*1Ą÷Üm(ĄcĆ;ƹāź;’tõęuæž„/ŻsĒķ?üąö[Ā} ōrq †Š!āÄÉ&¶J4Vjƒ(ھeó—æšł‡xšo×\{šAĖMĻ™3gʬY‡}7&·īŽłć 6sŃüӟõŒ™KxiAi0Ōl&€8JĖęöś–Ū½ż7ž’łoŽvĶ ÷Üvė_žü§O9ńœs^öŽł—~šƒ0F( įĖjĘxfx)@ˆ™'¢mlF Č.ä×ņč(• Ļc)¹%ģg[6š ˆõųlóŸĮLq¢÷ެł\įON²‹Lōļāœ.iēŌŪoAŠJņmŃ‘(S&LĮčīT4Ÿ:ŗČÄf’hGŗŌ3tžyw4KVu¼š‹± Ł¦_šüXė¬G²©²Wu*ō”a¢MLÜž·ė›ūļ¹Ż4ćӏ=įŽėołĆĻ.zĪK^²łĮæš…/¼ņ•/{hݽG?éų3fōĻž) •kūø5`a£RM„åšNAŠ“ BĖ0|ö)O½’†›‡‡‡gö Lģß?ké"+ŁZ«„“ĢBɬ\ŖīƜšä­•)Žü°F’āg?_÷čŗĆÖŖ”šµ`Z F5BLNN®>ü“? \™±wļŽEKē^rłe?¾šgŖVµŚeP Ņ.°‹e<ó“3Æść–˜ūī¼iļž³;įÉ WĢ[·aż}[ųÉO/i į0Ø$$ kuŚé" [oJAŪ6m±¬ĒĒLJ'Ē_ųņĻ›?`h–`,,s½ŁdSÆ7FF'^ņŅ—×gøGĄģGĶū2ZP©H£•€ŗQ–žņ‡ßŽvó-KĶ›5kč»}ó=ļß”O=ģŌ3Oœ1뜷¼L`‰”Ą$HŲ“õ™(LF~ļū_ūŹWŻüčg>ūł7¼ūķŻ[s-€"čŃõÖ2…õ–lxā™ä-|S¹śÜہ!˜•CbĖ@ £ī!Į¢¹§d·IY°S0\—īžUNi¾ Ź—é»ļriT“Ź(ō”¢[»EιŅ!āÉćõDÉkhZŃÆĶÄiŽt’9ʇ#i94Rš“§¢YN—2¢Ä&Ń]Eˆ|ķ­Ćõg;ŅO YQʜĻ1VŹF¬T({źcH īŃż†¦—wļ¾˜fSļ_)”½ą Ū.9ō÷ĪFÕ“én”łß§Ž©qź<­ėōµ7ćĢ­<–C[£¤ŠšĶ°Z0wтŗŽźl¶ķŁÓžJ­{/µ~—@X© ­ėšī‘eŸŽÖ2eø $ ׌-•_ź^qłv„ļ“’«KÄö&uÉļ–øĆ·Ź«\~æŽi&)å,eŽ£ÅkµŒ˜¦‚9MYŃĖ£Ÿī6—żÅųŻlp9årĪź¶…q³&ģ£ü»Qq©„ōuIŠ\Ÿœģėėƒ%Ē=ōŠĀ¹ó6mŚ“kļžg?’¹Rų×ėéÜ@(•Fø’®{«/?ē„o~Ūæ\{ķÕ'tŅɧ?uę¼yĒś¤K–¾÷õoRüį7æżœēæpį’…üÄGöģ[{ģQµ¾jµ „ŗų°•$YČBHր£c»¶ļ˜˜˜ŲŗkŪ³Ÿżģ=¢qßĪĶ5ą“’}īu>»f°Śd-‹8Ö"‚€B²?õ]—ÉŠ\OĢX`7^wż”«×>²žŃ×¼åĶØČ/c ½īuÆūŹW¾ņČÖĶ`@Ų86%‹¼\Gwē[µWłŠ–%Ī«”½ÆŒh5x" ÓYäŹē9ÉŠ6Qqø§ægdŚ5Ör…ŃŽačrȕž$ ō(}Y6c,uģ{N«®šÕSn°‚é.!Hz/i¼hµžœbÓs$Š"ĒmI!ń¹""@J“uÄęŠUkž$dŌÓĻ:+#0+;[„›9[ė,£Ó‡ī½żŒ!KR ’¹'Ļ _×ķJłih­Łh’’)+ąÅDŽūĄRyź¦1V*ĮĢÖ8><‚ `GFHɚ) ’š!¤×R’ØO6jaŅs)!ąB̰ŠQ£ŁlJ¦Ūnŗńŗ«ÆŃQ|öYOW„ ä·Ļ’ö”G””„Õ%X†axĻ>²fĘÜy×]ye?(ˆōܹs÷Ē?0óŸ®üÓźC×>ū…Ļ}ĪĖž””#¦ÅŚ“„‡lA4ÖŠqS7šFÉ-[¶Ģš3s÷ȾӞvfĒA%ŌZ KlŒ®7~ųįE«WŽ’ąƒ§œrJmŌC@@ĀX’1Ēćz½>9:f­žĮwæwüqĒžÓ?½vžĀY[·n:ė¹§©ZełŠÅƒ3gk+8Ҥj°`J”8Ų™ˆĮBņł_?ļߎž¶ó–ģܽ›@o~’;^ūī’';)¶¶ĆÅŚ${ÓĄĮå®F[ēj–"ąœ‚£ķÕ^/š†ÖZ©ĄZ°¶R “6*q¬„”ķ)^Į «+”Å÷¤3B ĄŪj6ŗdD‰¼P€_é¾ŹĢ³…9+˜"ŗ«&“…ĻRīKŗ9žm®ĘZÖ(.fąL­ØĢ=ā¤Č+„tX4_ŻJ¾)k”³yGVóæ[ž/Z’cd©±œ­0N©™Ņ{U:ėŗŅåŁMėH*uĻ)©EäżVųČėŌDio•=± jäÕ}O÷£»Č­•@ģ®žpÅ ¦Ž§ūD{qn}#` š,  {Ą'#””ĆnżāņĖvĘ{aĪ|ńóžØ§^ ¤ m“å”Fœp$DG˜_Ö.%ŗA-౯N„;uobg3±i‰Ŗ·ģs³WVŠŒģ`ź;}2Æqü.n9ļåŽŅYSdLYņ­rAžR›a §Ūߔ§ÅbŖVŗ›—†ņf{/yB»SW©K«7"”oėlm*l–}CkmāQöų"¢J„GQcrrrbbõŖUĶśä¶Ē¶,]“ŠaŠ–œČ%‡o?gpÖźƒV^vłŸ0{ö”Gm„˜;J-Xµ’yāÉ§Ø |lćŒŒ„A8į‚U‡18g*•XAXKdŁjæ”B:¤1aˆ‘Éū®æeēśĶW^ń§™ƒ§|²®×ßõÖwœ¶ęˆ„ż³Ķš„ŠLĄ¤“’IČl6ęĄD@„ĘŲ$,Ū°^šƲPĖĪē\__½zÕG¾fĶj„Ź&ŖVĢ2€{÷ī–’FĒǤžWpē‰* †÷ģ’Æs? ż/šH]Ū†ŽOļ.k”B²[üĪ=tT S8œ|ūźĖCl-ŲX«[†“ĘŠļDNÜNkŻź8e¶ĆPJ‘WÜń¬iÉMĖŚ¢i¹aœ„¶ĢVƚ g&0€ »īøsÓ¦M»vlßµcȾō„/~Ķė^yü Ē6mó®ūļśņ·æłæßž&”dG–ŲrÅõĘÄČX16<‚ńÉZ­@VĀ­{öģ™hĢ8čąįŗY±źp’}€ Ø ’ aČ0AC å¶¶ LĘzbāŹ?’%ŅZōUžō”“>ņšSĪ8$• aI@FQ“}×Īoæõw—_6wĮܧž~jHHĻ?ö.Ää߀X˜±Ø1291ŒŌ 6iF±l–ųČö>RKń>[ėŽńźJ}>ŅM¤€3,­)"U”M»g ¼*cö\@Ęč¢?łÄUˆ:½a»1L)˜"WpMnŠŪ€®ė⁦y}B'ņT©Tr$.EQ% zšĮ5kÖ0óP’@Eć“ĻŃ 915iI[;[’ H!õdd­ I>x’c#£Æü‡WĀP_ßP­Öo­E£cū&÷WDxÄŚµF„jÅÄĶ8¶jp–‚¤k äŌ#‰$§0¦‹±±1ĖѽwݽłŃ ĻžóßšŚT}U(cĪ’ÜW¶ķŚ90oÖŻ·uūģ„Az·RāzTĮ“}ć¦õė×_vŁeóęĻæśź«o¹ż–yx`ę ¤Ņ»#xj±a&+…|ųį‡o»ķ¶yĒŪ@> XÉrĮż‘G f¶V”!*`Œ¬'YądśĘnø<Ąąv 7ŁĘĒĒ£(rO¼»²{A…VƒG¬/$«”"r •³]nߗØĖäoź —DZ³nī:{x ¬‰ó5Ōѹ·÷h£w¾tĪ¢ŁÖ-ü63ˆRŌ1Rv±C•'Ę>Hc„Bm›Ų7ŖĒˆŁż@=Ö ėUjɧNQ·ö“³\f9>)ö' 4‹Ž)®p”h “Lų-müÄD„ aŪ÷‹œfRä›Ņ 6ĪÖČŗōć#£ƒCCˆ“mÄʘGÖ?R©Tę-^84wJ1dhN4*A„91Q髍ŽžéO:õŌS7>ņčį‡:ń‚ŠPĖWĢQ“’Ž‹.żŻŠ•š??Ī™”­…±Š$G4slFGFīøõާ?żéµ ĒĘĒ>ńÉs’ų§?ĘøēĮ»—Æ>čĶ’ņ&«%Y“ «ī¹)!M XĮ,tCĒql›&ŠvK)Ÿ’¢ē£Xv‰„ōīßJŚFCHE3Ķ™õż°ŃZ*"6†”āD%Ų4µ )™fŌh4¶mŚŅ78°}ĖcĻxęO=ķ¤¾”Į8Žū*µ0 GĘFę.XŠW k™‰d@  $Į¶Šˆ fŅĢū‡ŸuÜI5cĢ^żŲĢž™7ß}7šy¤t>3RW2ĪŁ0Q ¾pŪ”×7v2ŃnĪ'胼Y•o³sk#Ņo[­V…$"™(5{‹ „-ł’‚—XjfÆҰ­Sņ–붤DI¼ŃŖFrŖž•6ŗ‰[ ˆ¬ms.J¼'\ńhź0ƒ)+¬åģB|Æøēų¤{üÓQ"é‹dp-åšĆƼm’ŅZ»ń¶mŪęĶ›—¶žČD&!Ž y®W%įe§ByÖ§†ņ’ĆOx'/}ķXīŌåÉĻIŠc³k×®E‹d‘ķķP‚˜Ż×‘ź¶¶{ž˜N Śų“¹ ©“«j–œ4ŻMq)ĀY,(€ĮŠ–•R lß“…“1@dt—Ä£KÅ]ńŽ”ŽgŽ–×9f“¶¹ö[ę$SŹŲ]t į¦|šŻKt…b[1ĶM?ŚNaZk][®u:¶wŸ2Pp)»_”e„P8ɲĀōŸc K›s§±źd€Ü„FUCW}…ög *“ķ[cā8®ŌŖÅbSbuÖroI:źaęžm¢?ÉÖ6‰‰‰pÖ¬ƒ>8+ öķŁ5{öģÕkW3¹HJś¹šø.y—`0Æ»’ĮU«V!TnŲ066öó__ōŽĻ~¦ę ÓŠ»6=¦›#z¼>žü ĀYż?śŁ_üŅ÷Ļ’;Nē;!„ōøKõŠ`?üĄÆ8ˆ8B N>ó““N;UJI ĄĀ@‰ćĪzź–}p…”Ē|ČąŅ¬@ 8“‘‰ęÄųŲ½wŽ%ćĆ£Bˆē>żģOżē¹×Żyć?½ö 3gB¹’ŗe°‚L—™»ĮĆ?üšk® ‚ĶfLA + @[D„]{÷’żƒƒ‰g’Ey1ÉĢćēA¹ļ½/˜IL2ĀŖ9G±Ģ!^*f\؈\Ž[8Œć’Ņéx!ŽM؂ÖŌMĖ‘9Ot©kŹ­ ō·Dź(PŲ§äLö†71t½!«Jk=6<²fłjżvåŚysf€„%g’BĢL„ŖŒ™nN‚œO¦DKŁL­čVXKH8Šlįŗø®bB«%ļ-ߢ*ųw£j­ęrq‚„¬/ XcHH6`˜ČLŒŒö÷ŻwÓmK.łĆ%—V‚`ƌ{öķSJ]pįųóŸŌPŒ‘A€ŲVAćõIŒOīŪ·Æiõųųų왳.Xų¼ē<× eµ:¶g×/łĖ³Ÿ÷¬g>ļyƒƒA­f!¤5Ö*4›MŁ?4ćšcŽ`+żƒµ¾Æ|ż+ćq£?ŒėƓRĶ€5"TÖB(ÄMBr\\ÉFJ±łŃõD“`ÉRŖ ƒ0dka „ ķ,9j4'''†ęĢš=kŁŖ•6ŽBX@”2é6ģŲČhc|b||œŁ,^² ¬…‹Ļƒ3Õdsb÷¾į…ĖUŖU5k&“° ˆĄoD™Y°`Ķ>įŌlčJEĮRüō‚Ÿ~ō1ėyčźė®~Öó^šĆßü ބ̄¶‰æLgę Ž ĄRZėĻyS;„ĢT„ ČJ%Ć# x×%dHļ¾ul<Į#Hf=c{AvĎf–QĖ¼õJ˘Ŗ§bmŚ@īØēR .K a~¬Ū ĪeūLƟ¬%s]Ā!¦T¼*‹&ńXiīnó o™[́ӢēÜŻė˜$eį?ŁĶ°ż,˜r×uxGH¾é¦›^ō¢!ÆIqŠN@Hʆ£ÓJA{ń-MZūž*ėńŖJ›Ęʘ¼!ė權ӻҶ‹OŒa" 9žü¬ög6+<`Āovf–Ī"QZžé¢ė„Ÿ™ž<Š¢hÖg’5„ŌĮ® …Ō¾©^eK8>±õņ~­ Xf)b¶X+HĄ€ „qćK$,Ļž=°ó‚Ź¢°Æ½ÖŽ|HGĢ‚"mR‹łf3vźŠmb'AŠI7ÄĘ_¶³+p*>„Ģmz­Qł}ŸR¶ GSp'<Źø‚Ģ솉‰xj‡÷lHTLą EÅQ@ĒĘ<`TĀ€²Fkoœ(Z¹}9ø]! .ø“Kõßœ'[&ÄV{Sį9ZF[¶%H~›1+*ų±q¬”ˇ']ĖL°Ę€`€†q±1 ‚µ@Ģńdsl’ˆÕ̵ž¾9sęˆPÕśĒ'FvļÜĖ Ń4–„RՊ{ˆ K ĮD1`0²{„5OŒvÄa”d3¾åŚU#zģWż ‘Ēv\łūK·lڰųą„+Ž;¾”Ō÷Üó×kÆżĮw¾÷ŗ·¾uhĮ<9Šg…‚"bįĶWÉĀĘLŃĘī­»£F496¹öš#"ƒj’PßPæ¬(Q YlX¤ Ž;ń¤œżģ¦ļŁššĒŽöo¤a'ĶäŲľķ;FGö’;ߎ±cŪńO>ęéĻ~ŚĒvź3OÉ+_2::śÕļ’ŁZ‘…‚ Čj0$‘Ę'Žžž/~ös¦LŒ£R­ŠŠt8Ó@h¢f󆍫V¼`į<e2ŽZތ@V0¬N÷4¶FGluk—+ć1`YXI$DDˆņŌz²–“¢(ę Ė‚2Ķ>k1::ŽlĘõ‰†s£AĢŠ–˜œ±“Ó”v‰”·wJ"*k­ƒ”[ņ~VLīķÉ0˜ b"'dnżš«OŌa“›ż6œ)kC %UĪ”ĮŲZµf-Œa9Ā@Ym½J:'mJm#K,nXø÷LŁoé‚@ŠÄ† “ŃikĖ=ėœÖ»!±ŗM1Ć`ĄXbJåŪń\k‰‰ ‘%ÄnG³–Œ¶ÄŽx$q¤“ ² Ū‚43C±Ękʉ,§ą=0$T%¤˜ģDü䧝q˦Gjż‰zµZiĻŁ1Ī·Ģ÷Ö !&քˆ,¤ąÄmŒu,bKl`YXĶÄ,Ü46p’ $i $Œ$HÄѾń»®æU45EĒŅ÷§Løx®½h|ØgœT5C*§öŌŠˆōöM[ōh揗žžo»ęŚæŻš›K’°uė–%K=ē™g.š7ÓDć7ŽtżįĒ„`„1n°ųĖļÆޱ_›hdt’ü Ž<öŲÓĪx*©¾ “ݲ}ĖÖMėĒöīåK_¶dłŠsęrLvRGĶÉįńÉįńG~tēšŽŗ+J†R,^0æØhdQsłŠ•Ub5„ŹŚ•‡"Ž*Xķ4ßU@q¬›õśÖõ÷lŁ®G&HÉe«+"Ø© Ze+•’ŲĄqÜٹgwÓč3g )†`+ĀĄ(Fą›$AĮŲ®}#{öYk·lß6{ž¼„+–×,8n4£‰Q4'ūTøü å2¬0ÄŪ’é­U’7]}„…°±mzf„Ęd$@ˆķÅ?žÉĘ»ļżā'ĻåŃ: }ä=üī—¾łä#Žٽ÷¬Ÿś‹‚ĶóŲ%Ž<<„ٹKYF)ĀÅ-kŲÉöŗļ[–½œøé’„;©! i­ƒŁ›TK…$„Ftž•¾Čī`’JĮRŃv(‰‚Zėׂ@‚„ ‘šĘS²0ӟ䓦)ˆś·%‚ē‚Q{ŁĮ¾t Īī$Ÿn&źX>ÜO8tÉŃR§—-8„/ü鷅–į¦7@" §g錹\™Õ¦~Y„­ūøÄ5‰\±Ģ¢%¬•wīu6‡š —.żqń³ū³S>ģȁ\ ÄU«U÷Ń/yÉKRøœć®œ5:!RldImĀķbLÉøį»ÄŻ„UQŠÉŗRu<{AqwCtVŽqÜÅį)於a# Ҿ›Sc{¶Ü; ^JŁž3ŖöÖŸĪuĮłń€æ§œOäIx]{‘ł_P %”©7eĀłĮ5T …Ęā ŽŗiĘÄzŪ辋NŁ“É¢ŚœöƒÖÖyc:ŗ“®Q`¢uQ”JŌkČ+‚:6* ŸÖŚõ UiåfšŗŹ©nō“ŃT‚4.殜óŽ+éŹR¦Qt’—Hü8½@eE•jč^o‘łĘu'š§Ū©:-Q”¼>å'${—[k·,vįœ~,Q,ˆ…4ĘĖŽd䅂c)/°°%Ūé?µ–A¤ )܉䖫҆„@ FGGkƒC¢*„7bŁX a](Ļ`Š’!>¬'¢8ÖDöõĢœį†„F}™F¢÷[l,3[Ö$øæ ž˜ÜńŲ¦7¼āÕCJ>±Ż?śŲ¾ƒjmŽģy«ÖŚūüGžc||üŽ»nļ›Õ/ęé€ ŖÉߌ1’lĢ#ū÷Ϙ1£V«Ö*Õ8ŽeX°Ŗ„Ŗ"˜ĪQdʰÄBŅ=Ü?<¼æźĘæŻˆqżē?žitrā%ÆzqE’śžwT‚„][·^tÉÅ'œpĀĖ^}ŽQl¬ƒ÷¶Ę©…KkY¹Ŗ°©ß|÷kŽ:äęŪļ>xÕj‚…nHŌMPįӛfĪzä‘G>ū­oĢ–H$PÕdE )“¼K€`³@٦€e+H¤ $ŻYT“YkCjUć}¦øŁl†¢ETHäŠq¬‚Ą‹€ĮĮ" x1mAĘ@ ()a „pā7 VEÜ]§„š©¶…Ä•0ÖŌ„±ĢĀJ’ (Ą²eżSŽn!H”",ü-JĮĢĀ+oÉ ¾~x%žTŸāå„HZ–]^GBXk¤ō”§…īŹ$Œ£ø”ƒŖ‚aH‚P0Κ™˜Ł¤‹×ZXį[į1œičf­$ŅꈓČJ"GµéĪu”„]»vŻ}ļ]'<åäCO8 5”‹Ó`垎ąLK@(i­WŽp}f$Zč³6:ĖóŲÄp}t|ᲄKgMĀ<°só?łÉ+Žü&)- üs’Ή„$éHʬ­µV* !ܼ“Žł–.”öŃø¾’Ž«Vk­‚šQ{ĮĻöģŚżéOśĘ{n[°ź`į°µäÓ')„6V)”9Émڢ٬×j5˜F$IÄõ†ŽkÆžĖsŸūÜÕ+–/Z“(ˆpĢĮ+g̟…ø±kļöŻć;/øų‡_’ÖyG÷$ĖxdĆ#C}żq½ Ł\°x&‚pķŃĒ’k-6šJcē¶­÷Żwß=wŻõś×æ~ꦅZk›][·/˜?ŸŁŒMLL,Y“xÉŅ„ÕYCqƒ&&Q“ó±m]799¹rÕ I$B9ެ×m„Ŗ‚5ÅÖĘZ„jĻŽū÷ļ_±bE†*–Ģ`±#€„_ķ$@Ų»gO’ĢZP­ZIÖ² £$É@̐ÄĶApļ=÷¬8ųąkoŗįŒ3ĪčļėŅģYˆ±1[[ŸlΜ=» c”’,(+žõŸŽų­Ÿ³žö“{īøgͱG†Ŗ =ŁPAµ¹„c_’߯DęĪ’ĪsĪy U+ˆģĻæńwæėßłžylĖÕæų‚J¦"ŠŠÅŁ•ėš–ž]1·i(%]öhÉ“zĖV'…ć$c”2ĮĒQ«‰Bm²öy'`?I.¬rB‰©ü[9ĀŽ»°=2€llC]_Ö–På2P"øł ߍlq’6xF¹šįģćsv']ńžķŲŻ“«– ¬µĀ³­ČåÉķPŪ\;øs/““Ö·ońpł+³r”©üLųhš’dæéu›)ÆĆi ¹ń‘ÓĶ„Żń”fOé±uČšĒ’[–Ć£głĻŽßæGU`”)ĆO»{œ“¢ģL>īżMS0ŗŹŽ÷>Ź„f9RŅāSüōü;4­vī©n?©M ōõk­µ5µZÅÅ.kęĢBģŽ·ū”‡š·fu÷»v38…Ā»ŖžÓ`Ī((ęóįlbŪ®ŲBY•?ņPˆšqX ²/u ÉāöŸŻ‰Ø×Ēēæ7-žO¶ŠŪEvæH.d³\R šäē@¶»¹P‡³$c}k½Ņ/s ‰—©ņfęQ¾’ī8ķœ,n¹”*ÓAv›ńĕ5ŲZø5SmM"wż-ņ¤±.1`k)Pģe`kZ0*+@ 2¾µåžHÅä@Ķ.Ż€XK©L3–R6#]©…ĘBJć xŌž$Į•~°Ėü»„vk.ÄŚ÷фˆėõ 9Ö¤Ō„?žé—ż~ėÖ­Æž§7<ėłĻՆ™yƆG?ž‘NŽŽ{ģ±ó/zß§ĻåĄŹ³°¬%!Ü<1‘®×ė}}}Éš¢£ÖÆ_²dIX«Ą‚„!"Ų¤UaĄnHtŒH¾pY£ŃX¾rÕ_ļ¼ š™ĄŠc]ÆŌ* 1±g÷Å_üķóæ{Ķ5× 2[Ž· )¤e+!2 •ÖKg>’ϼꪫڽ"“F !¶ÜūŠŽĒ¶ļŁ½ż·æūÕO.łÕßųĘĻó!‹ĢL·? ;\ˆf­K•Éįŗ³°‹\ąęįf±œĄ¹™YR—@)@Ģ4KĀ×ķ’²KŠó{Q½Wūfw –©Ssma õf„R”“;$ż“Ž›MŃ_ŃĘVXĄZ„Ā“`é 3“P:ŠU€`˜w¶Ś¤;¶e+„°iĄ•x“DN³ ęR\_r;ʶhē"a¤FĶf˜p§]NĢNd—“ĶĶżi°uż†+®øBkż¦wż+¬<:ŅČkœl-Ia|&Ükˆkš ‚ ØÖ®żŻUWüīŅ„KēŒŒ,^ŗčß>ōŽ]£cčS†¹[£5^/×¹™„ļ—>’4óg«‰ČuX¤ |”k”Aaū*•SW¬­T*3–-¼ąŅßibBą®Ņ$Ø×ėµJÕ·ć„߁¦C%T~‡×€`J38‡œÕĢĘ)Ų#¶ĶzŻFzxxų‡ß;’Æzåwæūݳf®[·īKß9Ր•¤Ō_‡“>•+ä)՚ąĆ’vlŚ46:śóŸ’üēNzÖ³Ÿ½yÓ¦Y³f Μ fXeøćÖŲDozón»ķ Chݬėo¹łŒ³Īž˜«T*`a­ ‚ ”* øć޽;vpܓ|šĮcN=JīztÓĪ;:įøøŁ”Śøqć‚Å‹œz–C­ aŁ4¢»ī¹óč#Ž ‘åżūöuųóŖż'Ÿ|ņ¬ÕĖ?óÕÆÉ0DÓÄQEQ†‚”¬āFŒŖTJuˆY+¤¼ęüĢ'ϽćöŪļŪ“”R©@Č4ńK‘üԌ£{öcśūūYŠ0 ­—ß7¢ŃŃQ!ÄąĢ“PBMĘĒĪ=÷Ü/|õĖ8Z.fžvŚigæüÅē¼žuPrtļ^5ė¹÷C}}µZ*! 6Žv’ӟrŚŚU«\÷ąĖßņŗ’9ļkL` 3‡&wąd”‡J¤1¬?øS-n‡N§$ZMĪt›5Ėī-Ó8Ī…nŗ:~‡-OQ m;kƒå ÄČ9@Ł÷(ŠTå=Ó*IƒEoTķū]*ŁBŚ I„ŅĖ󦇙v·ćõŚĄŠ…ņŹØ¼Łøh$kq—:c N½č³ņ@>#¶†.{#ąR N§:§e_Łŗ`.kÕ“„ŠŻ=ŗ˜f•rīR I¦\ēćq¶§„åž_ŗ0?čļśAZ_ÓBŌ—§;>§+Å6%ɾĒw{\XE“¢\Z”ŚŹŲH e1ŲßOŒ@Čj­kؘ?g殝lē­XŽć½g¹ÆB Q iż$Ē“”Ü„‹?‹äIQĉéYK>Ē 4o9Š&;\śXsõ9Ń:NŗŲÖ Ÿ-YęG%Źū›•±ØX=m¢Ā)聇R’«€Śœū;9¬ƒ¹’¬fXpKÖ”Šƒ÷ņ”Ņęvū;łgæ””ŠJ’¬Ō=e‹Gļ¾’Æ}£©Ćx™0Č TIéF$I!ÉåĄĀÕ$¬ø:”І0¬ŌX!’ńČmwóšųž={MW*kc¢fToJ Żl4'ūĘöLŒCų|Ó¤ž"VĆÄ›šI)(„ؚǶo3Z“”źg?»pßĪ=[ÖoZŗ|Yߜ9Ķńį÷½ūķÆxłKkžģ¹’ņēß÷ߟAØČ)_9“YB–››xä‘G¬µ"n ķܹ£>1 ęƒWÆ k­[’:aY rŹ[ń®-Ūī¹ćÄzĶź•ÕJ@ÖŠ*FhsETönݹoėŽż#ĆĻį .žŻo”$Œ!Ė‚!X*!)é×Y((&eš|šā·ŻpŪ”+…&31v’}·nڰīŖ®Y°|ń„—žįŚknbąy’š@ŅÜ÷P’d>¤€.0LĢQÄĢąˆ]bćÓA&XbŌ‚Č @@ˆ‘@$©)8’dL›j³ńÖ»ośķ_ł“gŻó׿ia““~"¹U#Ø5É£d}1Ü”õŖ*ą&Ó¤1£cw]wĆgĻ=×ČTʅŲ%œhŻūŸĒ€AÓĬԨ@@Ą0©„•‰»¬4妲Š)·Ņ|éąų6$ƒR@z@„")˜ˆacĖ‘õzK>Qc)„qd!¬€DTĄ0SĢ#G ;=xĖw]sŻå]ō‡ßżöwæžÕœ¹³\žļŹ^ZÕåŗn­%—ź*N’ ŻP9¶ūvļß?²k×®K/½tb’žY f¼ćļ|Ė{Žõ_’ ė ½3yī€ĖšP”²Å¤‹ĮĘsˆjZ2ŚĘ‘‚H$y –Ī ¶¬Ęm‚Œ1G²åZ‘ÄR1(*~.umUł.“e›Óčfä²>ī+%q—šŗŚåĀ.™č³”U×Ūø&|KõŠS¼˜æ)%T O;ź¹ēĪ> į²/däó;ÅNTh¹tPł.ĢŗNńķ4‚^n•6œRZV9¹G(oĮL”ĒFk}Ō—š’ąkŗIóņč@uÅŚ•8N&rōŻIźÆö}v'K"KŹĄg_ĘĢ’“1J)× ³Ö™Y¤3šńÄī}U`ޜłŻä7“Oq-W6ĖZ> ŌJ“•čķdŪ¤$`!jIŃv“VĖČ[“'fS—Rø3@Øē§QެĪb¤Ū?”ڶ{*©Ī Aœ1£J»jÉØœē‡ū]c¬Ņ„—^žÖz „NžĢĪ‰ö½©“ Ų„±ÜĪ@vßĒ’„Žćū{ÄĢo~Ė›Ļ?’|fžęO¾’Æo~ė—æžuRIC/HŌc™@YŁ4Ń"Ķ#£J©#Ƌ/f %ČB QÆoŪ¼eތY+W®ÜMXk†ś)¤A k$†Õž¾ł‹Ŗ@FĶXRHD“ń޽{.\(śkżnI‘¬qŠ&Æ\©ć8Ž"DXŪUĖmݶyƌ™ū¶<¶gßȎ]{tį/N:ćt£ŒB›†ą@rŹäˆ”m¬ĀĄDqß`’ŚĆՍĄ×]Šņ勗.ɖŸ]÷šu«0äŗf£{ģ±³†ęĪž5c؊Ŗ<åōS·ģŲŹŠ·?x×¢c Žß¼õÖ[ßńžwžę÷—ĢY¼ hHė˜Ć ;Oe¤_fˆPÖG'jżÕ±}ƛø_X^ŗ`q(‚ßüš'g<ėK/|ķ[ß¼sŻ#½īŚķ#»’tÕÕ'žvŖ§KĀwhŁĀq^ÓĆ>®7ĀJE &ömŻŻ›øå–[žrś)ū÷ļ_sŌ”Ø-ų# č R2“°–Éé0Äø÷ŽŪ?yī'.łĆ%5ČĮ¾Į“Ćæŗö mųœs^vįĻ~!’Ēa<7i˜“™Ü?<¼o’§>õ©ƒW.łŃ~4wŽ‚÷䃐Čk–XKN;?$‹DbhÄQæ+• nÄA-€…”Ā‚įG7’ŪæżŪ3ŸłĢ‹/¾ųø£Žžń|Īk_óĢg?ė“3ĻÕŠė ³±Zė ć8VaŠZt†!H[vڬ~ Į–Į0l%$Č1C–Ņ3é Įx!'¾j ėz<1ļy•¾źŻæ»ņ[_’†£Ł³g’łžŪ„Ą]7ÜxāŖ57?pOŠ_5ĪČVĀ2nøę§žy&ŒAMVĆUl/=hÕĀ%ƒsh¬ŁlÄ`Ēqæ¢Z›X ,ß{Ē]ūöķ{Ėk__ųņłßŠ&&ź“ćžųG7ß’š…ĖGFFŖ”ŅĶŗŖōƒ”cĖ©#£„”Ćc£'=åį†+ÆZ³zõ¬Y³\Żg`hHJiŲzŗŅBģŁ¶õćx_sß¾j žwü ?½ąĀ÷æēß×=¼į–«®¹ė†?õxĒĖĢ 'l.I* ~ķŪ߈ '›ńÕ¹&œ=dĮ‚f#ŲĀm!e«ܹŠģÓ.įp¹īœ³5žÕĄÖ[aūč+é@’(é†P©? ·Ž¶Õßå0I’ÆłøČ²-Xzˆ|øĄLK8ÄL­&±“©$XäŁ¹žRŪ3öTšŠŅŹ3ˆ„$kLk‡…—\S)*³”J™3LÉDZ{WE„d*²˜'¼“=‘bĖžēāĄż\85pn4ĖYB¬rIJbK<(C£’ŽņTjj6®l“ö„ä1ŖæŸ„p'}µ'°=>ež8 äĪļ£:Ī杗’Ÿ7ōŪņä4+VB2Ų”‡„L¦°D!vīŪżšWżćOö3ˆiˆæs²Döūv ķBėø=«u{½+…†•@dėsŅ…]Uʲū©«2i‰­—ĒGÅ –ņܾؔ”UQNėŸŚŅ`Fǚm2V‰"<µuš?'ä>Eī°avČdŒ–B›6u©•Kéŗh_“…Óeŗ4i8i ļ™ ĪŁ?¶’ÖėoŒGʂŁC>&øūńi0[É逓ÅÖšęõ–,\“kŪŽžJuūž=żƒØGb @ššdet|hŅ~ó›_X64§±{ā5/;ē']Ø­Sūķšwż3\” kC'QqåEæłÉO~ņ‹ß’våŅ•w?ō" % „GśI) ŒµÖ»vģœ504 j×žķšż+Wl޲­?¬ö ¬œ7ūĀ+.­ÄF Hb©(Km`”11<:8c d˜f¼sēξ¾¾‹ņ›W¼āĀ5łŒĒN›ČkKźŃÉ@ʱ‘}7ß|óųųų™gž90k„Ø ­޶™„`«÷ķŻ½ˆŪ·cŪžźŒĮß’éņy‹ŖZÕ°5B’PÖhÉ®–`7«õE?łÕk’łµmĮ/>ć“ɱżÜØ?’y/zŃk^Å,E"Tæ?’_żźWGĒöüö’_ŸxŚS£ø)Uč͐«8Ņӑ˜B źūĒGvģ¾ēÖū̘=¼wĻI‡¹ļŃ-ļyß{ĻyÓk_’¶’G2·`)MаÖ%Ń0vlņĖ?÷›ē}s+ʇ­[,+ „ˆ›õ ZČ}ūśśšĶ˜ˆ”‚‘¶‘Ž»sĒC÷Ż_ +‹ęĢŃ:>į)'żē§?b° Fk’D$ „Ģ®ÜŠ"DĄ •€†‰įśäšŽw½ė]?łĆƙń‡Ė/Ńq|ķ_Æ`š·¾ņµoó¼·æū]’ļĻl, įĀ3'ą’ÅQd]7U%½µ¬„mhM6”›®D0†„ )}‚*\¹u¾2 „ĄkĒńwæżēžż¬Ė–­9d-ĢȎ­[ƹįĘÓĪ>먓N“Ö87±H4 ZõĶÄ`†²ń}cdróęĶ;vģ8ķ“ÓN?żō¾CąŲ °ß±cŻŗu×^wÓūŽ÷¾ē¼č„°T¤8[%„A2˜ ‚ą$!5‘€Ž‰āJ„śŪŸžrhhhÅŖ•¾1Č!čĮ6“€½š’ß Ź€T*”ü}HHAŠć„뮼ržüyQńŌĮ°R¤PKņż|Ļ”®*©£¦‚[÷ąCBˆÕ«WŸ|ņ‰" Ø111199sęĢž×qwVéėwÉśõė;ļ¼ó}żUC)Ͱ,µŻø~}£Ń˜·hŽąŒØC–,š)ļPAŲ²w@nĘ?’ŃOn¼ńʗ½ž%ĒwÜś uM¬{ō‘•‡"ŠCd šĶȋ/0ÖÆ[÷ŲĘĶ3śūŽ}Ņ“f-[t Ļ„HG’š²—!†f }äӟ:ņėxpŻc=¶gxĻc{v.­­”¬t³)j!å©§Ÿ1±{ļŽĶ›+•Ź÷xž;>ųA˜†‚õ÷ŻkĒ÷N*3¢U’¬AQ ĮR2A1TÕ¬Åóžū˟æķŽŪ·īŚśś7½ałŹƒēĻśå•—’č¼ļüē>¢"ˆŠrĄ†H`’žżżżżõz}ĘÜ6ŅK-1±%$]ń»K^üņϟ5÷G?śŃiĻ|†‡ĻRųz=dķžõ.¹šĀūn¹­©ģ ÷Žk”ԊĆ׎qß={vļkNN Vj&ŽTH)„ņž\ö·æż­"° Żfbéšrr_DFvĖóēx6N!Öy$_ȶ֏¤9‘ ™ę!9:q§"~ė8Ķc˜]^ķóa‘ķžLJul$ŠT=†lHÉy|\¦²ķS+f0±¶ˆÉÉz„RI©Æ¾_Rˆ»²#Ürė-‰`źŲ^.”–ś½ą ·Šųųx__Ÿ«MJÅįŻ9攜Kge©6[Ń©××%ļHgD䦤µˆćn)qGyē "ÕłŽ%i2wź@vo%@ŻOHĖ0» žN¹Ų“Tu:5œÜs™V÷»—ųü@n§]åü „’—Õ<Į†QĪUM;¤a«T°ŲI³€Hkė›ĆiUI›ZØ*2ˆ­™01ŗ’ﻬ½ģ¶RH‰{Ņ|gLŒOöōEqX Ź7\f§K†asƒņÖeG{Ū\[¶·ńG™/KņÆģä5xņ·ąĆŠŹŁ\w%7ä„ģŁ€„—ņŒ”F۹ٛ{" ]/ėī4`ųĄlĘz¤yt‘ÆĒZ)%į5eŲ€ ōó žźW½j€•†Ä֝;fĻ› "×ČU0ÜÆ ĀH  1>©H(„F‡÷ ŒOnß¹cĮ‚¶æĀĢaÓŲÉęÖGżĮ~šéó¾ƒĖtrמŚĢ™`« Q „”¢µąˆ­nF›ŻpŌqGT Ī8īÄ_żźWĻ{į Ž?ń)ŸžŚ’®{š”E-˜1cĒFF Q«ÕTĀņ®õŸvŹSy¼1cƌß\uŁ‚•ĖQ,@¤˜±tµ*+°}ļŽÉÉÉ5Ė—A34ؘ±ńńz½>Ö_½v‰#‡‰B3huæØõęG7Ģ9£Z­¢:|¹5†”$!¬d!Ä7æšÅ¼÷żG®9tppš½żąņÕ+ē,^64sfŌh„µšcŸrĀÆf[–®Oų¹O~üŠĖ.Ÿ?wÉ)O>qī¼Į/~īæ–,\Šßß?:V?ēU’ųź~£Özxlųž{īł—7æqŊ§ńŌüēź@*UC搔’] SÆ×õDŚŽśčĻ~鳇uĹßū“`‚GĻ OŲ…1FYŪ°īįßüę7ė6>ņó‹~¾“64QŸ˜;w޶=;NxŅ ‡yÄš‡rŽōšĆĮŠąāŋ=å7”kÖ,š3ų—;nńvJFĄZ+…^n ßł×k^ōœg2ó¼•Żöš:¶2NšÖĀZHÕ›å*ÅYmūĀ+37k8Š¢ uÖżµR©xx·ŖžŌövG-ˉD Bd {…F%µx° ©M+KL˜˜²š)DmcŹ’•ᇹ;qš!0é(–RNLLō p**©Hńšm^”«%mгMå½µN²IDŌh4*Aµ„łRĘŻµ†!ŲĖn„אÄfiŅ‘Ē¦L R…¶ńIĒ-^¼øØöĖ /<ū9Ļś×÷¼“• !\Ļ’Üõ![Ķұ6ĪĪŌó¶G7̟æpdļ¾]=VōĶÆ}mŻŗuĘ4W¬XĮCź_žŸO|죋‡vķŚQhZĮD÷ßwLŖÕkŒP2%euĀNˆ'źŃdcū–­›]ßV}čį•+W>ķ„“’öē+'Lˆ,ONžł÷æß|ē½ĖĀĮ ¼ėo>ķ™OūG> cyb||ūśMŠęųcŽŽ¢ˆ*RŠB²q<29ŗiŪęF4łŽ÷½aÆS&` ĶVJaŻ0@̈cŻl0óWüéŽ;īųč§ĪBĘ  kĄXsķU}ŪŪŽöŽ÷¾żØ“…$RUåŗÖ*õ&Ń&ņVs”h6®łĖ_[»6‚Ń};O~ņ1ū÷ķ;ģC/æō’Ÿżņ‡’óźĻ .Ō""l %Į€c-T H°ˆ?éųyAŸģ¢e‹Ī;ļ¼Ļ?ķķŲöXæ ‡·m™;wīÅæųń ^š‚¾µ+¾ņÆÆ8āą‹®¼ŠÖB8#R²NN"ę >²qćĘSN9e`` V«‘”P‚šüŲÖ­"P‹—-=śčcUV 0¬$аμ쭒ų†9ՁÉё>!Ömzq£©„b梹g<’ģ°Rakɇ·ĘXq¬+”‚E<1IĘ^pĮO9įÄĆ]sņ‰ĒÆ[ænʂ!58»R­:¶‰r³‘õšĘĶ;6?¦ĶM›6]}õ՟;ļ¼ Ņ7wĪ,:Ž×Ż’ĀŋTœńä“g5eõĄ¬·?|_eĘ ĄūĻO]üó żĖļžų9Ļ{QehĘ ćĆĆxĒ;o¹įĘzc<”!æšŁĻzõßšļžš²‹®™˜ ‰±ńæ]v>żi „µÖÉ=p DŃŗūīūĮ·¾•ĀŌjC}Ģ6ąĄīūöæ2D”$ńšW½ś_^ūOß»ų—$dm æ6S‚€Č3Ž“5Šå¶×’ö?]»vķ湬µHčåkÖ"KZ“…¬`€ożĻ篺źŖEĖzźIg½čÕÆ²V“¬čąCVmß¾ż„ćN$4CHC`!”GZ†*oą¼’߉㪬<ø~}z¦ė€(KŖ““ę/Adm|—Ęf-23‘p*}. ’ŖÕгĢÖĶ]9›ĄÖ8|*Č»j+„¤ČƲe÷#ÓR®eŖŃœ¢ķ £DNɧ÷ķę-]n WōļėėóJc¶¤Th¹ۘyœ³·Wrņ{čŽĶŅŹŲ ŹŪøn„‘ȊšŠZ‡aĪÕ!(Óø.“.{ńCé=³čÆ:³(LjöęÖ„č²{ū?Ņ#Ż­]Ł{¦šm !*•ʤKSŹquķöāüōwĶŗOVßnŻr yö6•ĀŚVŽu-œ‚N_}ǁeĀŁŌˇ܂ä32ū‚cö³Sē„gJIĒžO~CeD [„Č ©Š¤},”¹ۺā­CŖĒqĒ}}}JqmbfĄI╾”¤Ķi6t–™˜üĖ(_ķD9(E;$ƒ–bɇ·fŃŹl¶N’Łk’ Ö²Ķvxąß$§ķž‰ ,{ówG«ą\n܂ böęu"s¾Qž¦²8™ģK҃„ĮĘ7€Õ¾J”«_ØAzÜūĒ4>>90Š×”«œ@ü:˧—üÄA  ü°¼vĶ*Ä–Ļš Z‡‰&&A‰ žuw±tęģcÖžµ/~~ŸZkŌ i}Ūķwģßæ’iO;­Śß–!‚” X- … -.üéÆ~ņ•oĢC’ŒFÜ ՊZ¶lÉųų茅sżć·ĢžŁkĄŒ­[·‡3f¬9dłĶwģ]}ä!_ūęWZ°`tĒÖĒÖ=°źøcn»łö•‡¬9äCjµ„ĻĒk_{ģŃG=¶yÓ?<’d $YĄJŁšvö¼Ł4*’,FvļæńŗæŻyēO=żŒ“N: *ؚD‚Š`6t÷·U*•CW¬œ;!±µ €(€ BiHXt’ęõėölŪ¾g[E†ß’ž÷ß󱏄ŖŹ‘ch Ą:%m$r¾Q#žĢ§Ī=nõ”Ÿżōē˜›„Ćńų‡>õŃ7¼ņµ#ūʗ¬\½lמ£sŽ^»oÓĘŁóēöĻųÄĒ>µūļ^pŠ2g6£,»g eÉŃńf³9kĪ,%ƒ™ÕĮSŽ;Q€@ŒÉś«_’Ś»ļ»7 j’xĘ vķŽ²qŪģž9Ÿx÷‡.¾ņ2» * & @0xbt$rĖī]Æż—·T÷×u³Q%ÕGI7N=śˆ×’æ7õ»ßz’'? WLaĮi† !µEė(śżļætɒĆ;ģ„“ž4wĮ‚hlFĒ££ćµžĮsXk,³ņŽ‘ģÉī k!•TĒøĘ€‰›ū›¦=üČz2vØopbx“?¾zŽyG~H}bäę»n™9kĘ÷æżÓ„+:ēm’ņƒóĪūīĒ’g޼y×møw¢Łœ;9 «˜`IJĢö,æŌŌMc|ā¾ūīÓćõ~!ēĪ;Ńlyģ1'?ķŒ?\|ńÆ~wń¢yó?’żoAõhćżQlFvķ9tõźz½¾åįu?Ł“a銃Vŗöš£Ž ƍl=āP„µp°ęłöõ~żė_ŁkĪ9ž„'õ €udWeŁ*$ X )@– ŲŲh’D†»ĒFgΜłü¼ųł/}yÄ&•BŅPµ€&Ō£m{·c&öüō?:ń™O” “&Ł/ ±Ē}h×L•®ų@Œ“ć ä/~žĖ/:ė9#ćwÜ÷ąšCמ|ÖӃŖ\86ĻĘŃŸÆżĖ?ń”Ó_ų,°P¬ˆ ³”JRą.ĆR§ž}öužėę›×®Y{’×/Z¶ōĘ[o®×ėO?īI}}}žČ‡ĘĘĘśgĢųÕļ/–3×3$œ¦*!ŅĶęøÖŗŚ?kń҃–-]®ĀĀ^||tbōšĆūŖ1D.B1¹m÷_.ūżŗ;ļܱkGߥŲäŲ0Į””T¤”ćˆ)vŁuĀÖS`„¤ĢXs|xdżĆ,[øøbģwŻuĘŁgõ .;|­c’!ąč­€Ą×æō„wæē=}J±4Ę‘R•Ļ}ė[h6…ŪIŗv•©TE _ūśœ3F¼wņŖk’\™9Ćʱ+±->héńĒæ¹>†~F£ńĄö믿ž—×üY}茁/|į Ÿ;ļ7ßz×!«Ö 2rضs’ž8ŽĢ_4ø`>4CÉŌQLØ@×'ī¹å–—½ģeūFö @üYg?ēņ»o#Ó¬ ząĪŪ;īX ĀZį Ö ģ éÉķŌ@ōl¹Å’A`K2MéĮš²…Že’M%¾å®[ą6iX)­e‘ oX T¢įlŅōCė8CG<ey³mŠÓÉłBDÉ*&’E:Xb{AE§ M`†µ,„·ōIłÅ- M+³µ‚˜ÉõrČ[¶ę®9ßŅh![:ŪEŒ Ż9½hęŒcS’5S–%› WŖ}vżq§2čOd,91‚rffŪ'¶‘si[śgŚL*…ݵ§¾ŠœAAzN+’+C…ŗ 9ķtIŖ“Ū{Ų]ø‹öOq„łī óß/ī==ājJŽŪ‘¹¹eˆÆO§”2Ńī”i“¹ŗ$ā]ž‰Śˆ¦ü²LÜ¢ē"oHŻŽˆ÷ŚkÖ°NŽZ’scüR‘ņĪ;ļ$ Šā”””^3ńLŅÕž“‚ p¶ SV_Šź]ł*̰Ʊb™d¹tŽtŸ—ŪÓŻi5c§ś˜ī³ČŗCe`–éo¼\¤Æ­ĆÖzQh· 9żįT’:•" 6'd›šŁó³Ā՘Ł;ąo¹]4«ōÆéĖ ±Ģ%ÜŻˆu’ā*ŻsŻiÕĄ(upq00¶P J_€‡s$$;ĆY‹˜X4¢=[ė*+fĶł™Ļ;Ȅnp(źĀöUkO}Ź©²Æ‚@€i¢ŽŖ*8PB²Ž”šŒÓOØ!1Ā>õ¤cO>ę<ļYjī¬Ś¢ł°ČX–’HŽķµÄ8óģg ļŪ’½ļ|7Ś=śčMw]sĶ5k?“o֌­{v]qÅztģų'?ypöĢž¹³å@aAIQ —­]ż·Ūo:dé²’śčǰlóČ&ģī±ŃŻĆ³ē̆“V »į¾{ŃlĪčļ›§jxĖŪN}śéjØbaA°n ˜HŪI½gĖ®-[3„ĆŽ?öc\±}JKLŚŲ%Ad«Ö‹d5šuœtÜq5 € Bl-ĮHjZm4·ŸĶŠū'ėŪöķ]æå„ĻzޱĒ;ʍy³ę6ĘGVT~ś]»ėĘŪ^sÄ_÷§ż›wńޱŸ}āsßžņ×wmŪN’ź&²5eC2Ł„¶†……Œ źÜÜ3:¶uēĶW_m« J, *@…^|öŁ>š€Ę8xģ?>ō¶›n¹jĻī­ż’l#~ļ[߅m Ŗ+D ōŽÉ‘ķ{™IUŖg=żŒźŒž·½ķ-[÷lūÅÖśČO9ńÆ~å3_ņ¢ko½“eŐ`¤0’¬XHmĒ&ĘÜšČö=»žū¢rüq} ęĢ]²7Žs‡®Č¾™3Ÿó¢!”¤1lŒI-˜ HHź6ЌėūFĘ÷ģæłoŪšč#ƒ³jĒ>õųžłĖXyĖ-×ķŁõš×½rيÅč—~ąęÅk—>“ł!č‰C—/īļ—»vmŌA jłźĆ€,¤aj2d@¬MüōKßłÜ;ŽģŁæzFß¾­sŚŃ‹Ž=čoyٜ£_tįćśč’93&÷ķśś‡>„żåĒ|įŸ5ŲædõAŸqĀ•īßæoȊo}ž G}œ„Tį±GSļŚæćĪĒ·ļšĖ?žžUożēc9¶oh« « bš¤EĄĀŪ‰A0”ŒEŠTƛ÷ÄĆMc‰døhĪ‚ZuĄ­”Ĉ­Ń‚”¦†Õ»åśļ|ó;K.}łk^sźŁg܇: „`PlHŪĄBi±’± ¦@] ‰ń]#»·l=’¼ooŪŗē^śŖ…«yĪ9/?ūĻ=xåJDQ¼o|ŻĆŽ}ļļ|ßū’õżļgL’]7(ŒX ĢH3Š›†TŠW«Ģ™;óח^|éo/žU«žu҉/}ī³–-ÜŁūʏ¾?ū %+Ž=Rö9o• QhšM76jµ  R«ØŠ‚˜ūGU=R‘!¢Ć>ŚõŌĆ9GõI;iŠä=;ö<¶aĖ©§žzüqĒ÷ÕjC}ƒ!C*8§±@Øž*U–dĮ–-ĒÖ֛¤A±޳ū?8’š®½éžŪž÷Ź—½čõƙ¹xa84!DZAP’¬śń—Ī;å#?žž÷œ¶ąą•bP2 Μ9O¼āE/Ž#UQT©p(éŌć±É1cųõÆ~“ I-"sŽ×¾NĘŽtŻõƒŠ!PüÓŸ’·«’Ügķā”ž__ö»ćN9ᬧŸńŖW¼tžĮ‹90uݳgģŲ¾aė®ĒHc±&Ž Ņ£ćv¼^ß?ŽĶ¬Ō`ɼ¹«W­34[Į<«v’ŻwE££26Cauū¶Ē a)Qx 0ā}££¶żš›_żńOqčQrF?Õ* ź†Ė’²o×x’Æ#2hh©ybón5_żė?œvŲ±<::9ŗ{׮ǶnŻ0rBeł‡ß’„±ˆŁĘBX DœTȁ µvy–·ßš]O’åŌŚ‚8ć čō±|sX¤‘ūD޲\0€a™ęYš6[ĆÖ¤¶8°ĘxrŅŽ ĀŠƒ$qń†ūbßAMĢ:8—j¦« •ā‡WĆroĀxv) 0“¶b§ö—ł–ČĘ1„ŠqÜl6{é‚ę`ĢķPķ61ę4 sn ·™¦lė‚«BŁÅn#›ĀŻBÖ£ŁGśå#|f÷'ņŖ.¹Įé$€”ŅćWNžF|ŲUĖŗ5ÆĒżk»ĆóŻEö·JÕ|xdŒ1ZkcLśģ˜ŗ<å•'Ņ)š»>Q s½K’=Ƈ©)„‘¶r‘»×Ž)¶ AQU‚Š•IL«¤KžĆžš“SO»öŗkĻyŁĖĮӘ¦JSŗųL™Påo,…夾˜ŸĖOpƒęI"ÓÄ“-ŽŽW²$rEGvn2_˜·Ó{t-mƆ-+„œ Ū=āöA™ųåR;Øk£»8ŖS֓J5$ŗ;Č'ū­„cXuršėŻ>·U%*İlč’ĒÜ[ĒÉQ„ßĆϽ·ŖŚu|2’‘ø»!BH‚»³ĮXÜeqY|aaq„` ÄCÜuÜ„eŚŖźŹūGõōōh&żžŽü‘$“īŅ{Ÿóœóœ#0Ę@y,ٽmœėņ^|ńżšœ±cĘÆŁčas±iåšŃ&žŗ|Å3=B)õ=óŒÓšY½vH^_‚p b›(Ę3˜…ŽłąM·Ć<ķܳvWZ³łļWžV8lŒŃ „ĘdBŒL^‹ÉŠ) ›-–†’ņ7Ž{gŅč±.³Męč’;n]æ|¹ū«ļæłę› 'K7'qØˆF"„%}śō±„ŗ4Ž“uśä©vY:Pr ';;¬«fPŗ’”7ß~cģŲ±5UĶĶĶ<¦Åb±ē’yńæMMŃ¶É?¶X¶˜§Ī>dŒ €`e½Łl>T^&IRńŠA°sĶĒ{l’žÅ«Ö¬‘ÉdJc±˜ŁnŹ‘„>_UI‰Ž„eŒģ[ģt:KKK]öó w’3ĄIˆ€ŹąP³rĘ+ŁpōčŃY)άÅ Žy]Nż †ųüėž. ōŽ»Į!Ņ%閧ŅoŠń'œ˜ž“kóŲ­H ¢€1€Ęņźõ«×䤧3fŚģć0!ß|šĮŌ©S-^Åj!žóĢÓ&3˜“‡8!.¾ųŅōōtԐtXHŗĖ9oö‰ßÆX‡*jŖS²Ó,.‹U¶Y ūųõ×¾ūåė>é}"ŃŠČAC~ų±-Õ VEÕuY1cD8ŽOŖĒü!5t¹Ż²Źµ@¤ļˆBIQl•¢‰;v 0Ųåōā@ˆ`c„Ą\–85:q:ĘĄ@Øz]YuCCƦ-g̘1ķų™šŖ* h ›ĶBˆÆ¾ūī–[oūõ×ßJKĖ7ļŻ#ūī»ļrRӃ+ž~ä Ż$•”7s b×ßžw@: „U‡U†P0ńʶŠŠGzŚ'_,޽kہƒ{>_üy Z±n €„օ>ŅG)ŻüdžիWoٱ¹O~Ž×KæŸ1sFÅĮŅŪ/øü矾³ø,’Ū &™sŽ%:ƒØzĮEēÆümÅŲ1#Ļ=÷Ü.æ¬&PdĪ“¾żrńĀ\zĮE3gĪ›„nĘb1ÅfQœE7–†t®KBFF¾ÆPP\`Žlٹmū”Ó½i^dSAB$0H8īH0  @7feu@Ņw_ŻÜÜ8qāD_°iŌØQłł…`tĆ€ŖƒŖ×––>śč£’|čĮ~Ɔ6D#81GĀāėk˜ÅP}dķʍ(Óµ×_ß/b+LÉ4ez!;Ó‹5ÖÕmŚ“ÉårŻ÷ąv‹qAˆ—0†„c•jłżŠ8Ó±,s$8pĮ)‘”¦ś†@ ą?ä=n‘M Ą˜}@ ‚R„Š–õ›ö-zė•’;q‚CB„„„f«©±¹aņØŃĄ IĄcŒuF%"a„„Ę‘„E”W–X·nŻ„ c¦{̰ŃĆ%»U€ąB`ι„‚ $BŃn¾cįĀ… ‘¦ Ośžŗ Ö75{Μ9Ļō6 V,Į" Ā ė_/üP‘@WƏ<óäW]½yŪö¾}ūڈtżmwģY·ń§Ÿ~šœz[š›n¼ńFŻ×Ņ·oßżŠ×lߘ M«ÆØ9xš„iĒ]”WTĮEĻW–UUUE"aœHH0¬F¢uu é·b±äę=łų#·ß}gšŁ|ĒŻwĀ1_P‘­˜Ā“÷üÓn·:¬“ģ ŁlŚ·g/B20Xh<lv{<²Ó–ę±|õÕ§»wļVL–«’1_uµ’–ŒóX ƒąœūš}>_Q^ašĖ XĢ?ļ\D±ŲgĻ™qŒ†+fĶŪøqć”pÓÆݱtŃW‰V57ķŪ·/Õķ©/ÆtXŃčįƂž¼¹sOāKі‘Æ.ü°ovŗ /|łåŻ7~µōGp˜ĄÓįvČK’¤xxk^«@ H•Šu˜N”TŠ!$ž›€’Ń&ĀVŒāĪ‚uS]``”cŒ]£²,!Ōq@·jŗū °1€ß > ķ4oż“x\[ėuĄ(‹Y®ė”RS7‰Įķqi7Š„-v’ŖĮÉcŒ{W}fˆ¬ĖjŖsaփš8Ł6Q½³VśŖK *q ŗdD;;K6¤7"ķ^V›’÷üjo>§³‚½— åHÆŅŃ!!$‘ęó×²ÄŻ Ō£ÕyįpWē°ø®Ė’ķśe@‡YR:÷į:h»Š ć-JRK|#<¾^c $Y€X4jV,«WÆŽŗ{'Œ39R<Ńśź%CŲA’Ń%iÜCŠO¢ĮyX:“×OG«ą™ ĆŁ‹B$ܖ„.DņhL²“$2¦|ŗ_é’c«ā¾;Ęh'dŪ›ƒO2ÆĒ‰×Ī’ūžć¼»£…»—‘€ Ė’ŠĆ`ōĀz­ėqgŻøae<¦½ņāK2ˆ4gŹeē_?Sé&€×tl6`H’ā“mZµ> ¹{°éŽ'Ÿ “ ·Š4Ät¦F‰ŻkXz>ÄŃĻæüśŚkļŒź[°bĶ&9ݵ«¤š¤¦€Ą ł‚D4` œU‹ŁföŲ@ćĻ’ėq¢jkVž~é?® Š˜7¢żųżOÕ!ßöźC»-ŅŌhõzA‘Ā”P8..,bŒĘ,ƒĘūō«Ž·«%P1·YL±ØśÉgŖ:TV[ŖS.KąT,v»»Ößxņ9§ @7Ž~s0Ś¢1:,·hĆŽ½ ØŖiĀ,s“”_\h±X ģqӵמ0~RzZŚ}ņōĖ/Ī*Ģg„˜vʄ‹Yyåß’¹čā ”ŌTÆŪsŻm·žć×äe䬊Ą4J%*ēĖK³²²Öü¾ņ¤yó<ć=˜żčõ·ĘęX"±¼¬>»w@Į–Ó@āA=„¹(–$Ēø±cĒžx”GUŁåėžŗęƒ{÷?~Պ_O=ķ4Š“[Æø²d’žH$²½lOŖ3eŲĄĮƒ ’eåŪoæ5qbĀR Šl±XŹ|Uė«v0XĖ dRXšĒļ«w.Y–7nX’Ā".aĮ1&fĄ°üż>xę„4«SnĖĶZ²y=Hr“,õŠšŠ’b1™L&U×͜›SŻClC  , īÜŗĶn·8МįH8l±Ū8,Xč­ó€ ]Ó|>_JЧhŠ€āC, ČXH#X–d¢ ­².Ķźžå‡ef—õĖļ—nß¾µĪTµcӎ“|š×üqżĘ4Br]^5ĪŹÉśå‹ļNœs& Gż•µ‡›ČśU+f3µø_ī >䑐Ʃ1Ųā+5pķŗÕ*FŌ#ˆ,a–eŁī“mŲ±!Óf<|šś?V ząÅē`ßųõ•Už²rWa_Ź„DEK 4f؈“ŽŸQļo:{žÅŌk@d0‰ą"ZšųSē-žbīI³}ųq›Õ…‰)Ķķ¦ˆALS15٬Ą pĮÕ’Ķ5l½žŹ«)Õ-’2mā17n¼ó_ӊ*{”6lßZ0|Č<ž ­Īp³°ßæaĶZ hŁņļnŗåÖÜÜ\P甀 m®Æżõ×_«ėŖ§Ļ‘Ł?¤ųnN5]’eŹuCņ-L@×Ė+ĖvķŚ5Ø  æoī ×^’öėo9®ŗŖŽ!9 ŠŹ÷UüōÓOó/æ™Ķ  @@5Ŗė’$!‹d0™-Œr,+‚2j¹ō‚‹J–®Ś“)ś–’’ Å8ē c‚€ēĒ(Õõ–hŲår5eżš•śöYōéĒ”ę@³*“¦¦†ø‡9#HĘ\€Œ%Š0„$ *;t詗K_qÅv·5gP“’›8cɌĮHßW2~üxP¤5ųźe'žxĀu×]7{ī\\”õüÓĻ<’Ÿ—€ !Į‰iXųĮ»ÓÓ³2Ī<ķL`xTńP!D¤¾iĶŚUæÆųMWµ>¹Ł”f’§‹>ūné÷—Ÿ~žE1Ł% ĤGU]u’”C‹Š‹’HiIŁķ»זW6”śäå—ĻøģŅ}{õė?(;3[p¶kėfIč?üšĒaóz½‹µrß¾Ŗź¦±cĒ‚ŒGNżżėļęöĶm 6 ³œ–“ D&5‘$Éķv`éó·Ž,);4zģØŹźźnæA1ćhsms ģtzV7Ę(#=×ėÉTCŅņæž“tė– nÆ'-5ķŹæĶļW’źĖ Ū7Õ@°{n½uܱ“ƒŗ¦QKdPß¢ŹŹŹ¢ ćĄ$ Ŗ ÖżśÓŖ‹Æ¼üžGļæ÷¾‡Ķąe[¶Ÿ2nĀæ^~!§ØŲ™—\ĝž0B€(ħŸ€‹D<NŲKw±·ķ‘/œ˜“÷ĻHhƒ#qؕ#ĄŠ9ē2®ĀÅXˆ¤ådōČ[Ǿ:“,†q·wZ–e©µŲhÅÉØSÖFÅw¢€B žq.ŚU=I9Ļ’¢Ī“I–eF)‘{2jĖuJN NšjnŻŽ€ś(¦I;Ū¬t†» žžæØ+Ī£ŻįvV>w<ĀöČ%ń™É@ąH…®½Ź’7x8k:PĀ–įpćŁÉš”Ÿ£^²»=›“’µ-€?O ÷üiŅ’āŽČõ»>éa¼ķMk÷¶wA)'{¢-dÜ]Ćö³uśT“yĒ !I˜:ł˜ķ»wZ˲e?’·K{Ž&ī©&p—¹g LŲ%»žģ@Аėī–õ¼„ꦠvJ!I’’7 ŌIæmxw·¹Ļ·Ź:āWX“µ<ć«FN¹ż9ĘofŅ]3ŗ§mF ݔ٭”d+æž_ģ#ņ0tą‰’ī¹e{4+ˆq tĮ(Ótķą”C³Ž¹ö—}ū叵µµįpōŪ/—ōIĖŖ¬¬<ēÜs³ūę{ TnŪ{Śń³s2ӛöł­ ¬]¾" æ?r$s[d»YĒ`"ŒĢ[©f”“ŃGezE£?oݼšø]­qF4bŤ˜L ą$ŲpŗœĄyئö¹gŸ~}Į}$ĒŁgŸ}Ī—}±p”ŽLŸ8åõŽ%B&ÖToc4dĮ›Łb³XA!˜RFcśåsOĻ49¤µ²r0 1¬qułĮż «ė+üĮ!ƒ‡ļܱ»6R@VĄ±P‹ĄdoÅĮōWĻĒ@ø°° € ]×%G‚-Ģå^²ųĖw—|±~Ē6ĀphŖ®ń54•ļŁ{é™ē¦åōa$³łük®xł‰ēŠ‹‹×®ß”«¾ ÉéLźėŅÓSmŪIsOĮ€HALŻŗaĆš}RgĪ™·÷ŁWüZ$J5!„$BĘ0Z±ģē|»Ķ$"˲ܬF¹ą³•ĘT ¬ą®ģģŌTІBH ¶ Čé»wūNLłŠMk,Äafš’*dgŻ0bų ęŚśūī}ąŗoziįB›ÅņĖśõMA¬‚iCS£Mq›‰ł¶ėoŽD#‡ 9ēĀósõ¢ˆų‹ˆ°¦R®é»öī±)ę¾ž4]×½)™1¦b3A8šł~üqi0¼lžßd› $8 Fę+ŒCČ*?T B&LHIMĶŹĻL ©õŁf`’L€ Tq×½w5š6mŻ8ć„ćŹJ­ŽøöŅK/½kÄ]4>öøcsś¤5V5„„ä ģÓ§Ļ‹?'„œrž…E…\‡ŁlÖ%>óŲižōĢŪn»%U’ŻnwMc]˜…Eå”iÓ&•5!Ń@g‹æZLUŽw¶§„n9ø’•wŽĢ5Tˆ†BCĒŻUr(#;ūś+®ł`Ł÷’@B׎zķÕ¾…łćĒÆ6—SF@J¤Ohś«Ļ’{ēĮ=6“epvŸ«Ī½ÄeµG4-33YM2į`’1\PĄ`d–lŃ`ų”—ž]¾e]Å3xšąēß}- m?’|JijF†¢(Ū¶nĶĻĖÆ×Ćcƌyį?/»\.Łįʄ®ļ޽›`<ń˜É0uę±Ųl!øą ”QŁ$·ŌÕ½õÖ[“¦L˜3ļdÅeE!©Õ&ƒaIĀŃ%³ ŗ±ŲÖmŪtÄRSSÓ¼žYĒĪÄfI0†t˜ŠwĄĪ]{Ā!uÉŸ¤Z¼ÅƇœłe4ŻĘ7 ’JėŹĖ•–;ŁL`Vā›!"aĮ”¬“bżŖå_žųķšĀósżüżˆ1£5ΈDC³ĖåĀ2”‚IV³ĒnJĮB¾’|Q ÜüŌóOæüŸē_}õՊŚrÆ;uČČQ€0ŗ@1a†jŹŹŹJ+¶lŁ’–™6ļ“Sīųē=€1&’įŽˆ2ĢpĪ4ź«kü䃷½ŽPLeMŗ`ŹÄ‰O?ūĢČ  K‘{žłŠ=’|Čhå`š¦3ĪĶ‚ś6oŽč°X222"Į)%K³F`ufœXxŽS"Th#‡°{Ńp‹C±”W•2dÉO?HčŚĒ Mž4qņÄI"Ź*JrĪG-ÅæÆX‘™õķ’ÆĒN›6xōH ĀH<ŅĒ«Ė{Łż×µ±×ķ»nJu°æJØFlfÜN !cŲUPŠ$ɘJݼy3Õ¢ĶĶĶńƒ#i`t~ż(„”ŅĆF÷šŠVšŽåŁćq/`kć³}·ul&Ł ¢ó)sĪ…ąØ5% ¾ˆwŃŸ`xNkŽu$}W½.c„$ģŅDJčäg–•~Ų<€ī²µ:“uŽś6 / !CmyE¦Ė[zą@–Ć­¬O!– æ¬8gźō掟õÄæžøż¦[źŖŖn|ēśPmķĪ­Ū²=^Ń?~ī ssīl‹+j÷”Dš#z䊎Æ=ü„ĘYnAßśp`×®]/ž÷åļæ?h=zōŽū8Љ…A ·ų,²r÷E—ÕTTegg×ÕÕ5ū‘Hdž-7Œ9²®¦~Ń¢E³fŸ——·lń’]»vmܲ) [‚ć?nÉĖoŻ{ēsO:yėÖ­SO›ĘĀMĶæ’ņĖę3d—UÄÅš€d éŗ¢“a­_µF¤Ųõ÷ÜzŪC}µąƒńćǶų‹ü¼ĀSĪ8»“¤"3%+ zS=>Ÿ/Ķćżöó/žõč# 5µYv·Ė™Ā}b–t§‚1Š»›Pžé‹Æ–ģŁuĀĢ>’aI tYv‚ jœóż»÷N˜0” 7G±ŁøKsĘ0"fÅ“zåŖ&}씇.øą‚‚T· rzæ<ˆQŖĘ$‹ Įčģ—ÅKņR²¼’£lēw½ŽˆB¹.ƒ¬2UGĮ\²%ŌŠ4(;§¦¾&F5•ė4¦ &ĘXŠĆ]§5Ŗh¬Ö›Ņl.‰Sc§ÉTŗwo˜é{÷īu›ĪŌ"›«AĮšgŸ|:åŲcļ¼õÖS.¹ģęo-\꫘}ęīYt”&›“€7c%Š ĻJĖzū?Æż|p+@*+ݿ߁HÉČ ’4 7ĒģrE"B Y!źjjĀ•µ…Ī9įxGzŖ0I8 ėęf{n¦Åb…Ę–H8lMOŪæuėŸ-ž?>†&Žņ5BŠ,éŃØl·ŹD¢m†gN8öĖw?e»S°ŽĒŽßoąÕćF A‘,I ų˜‘ć’Øś1יŖc›|ćĶ?6¬æą‚ FMžąr¹¶lŻ1cƌgžzZa0 OīÆ~č÷łc8–ļĶ|ł_ĻŌČ[.Ō5Y$@\`ĄD†@ 0¾ż×5.@fGٶ݅V·?±ś&„%ÅÅ֎WZZ*EéOß|7{ķ1„•y™9O<óŌ‰gœ> U£H1c"GuŻFŒ(dŠÉ!ˆ5—’öū aĆGŒ› ( 65.86²yb­ō]įpŲd–[üĮa£Gø2ҁP]×1¦2¤i#'Ž’zįgx]sżÉ%„Ś0ĀÓ²śæšĀ ‹W,»ėѱ͒Ń/?£(_W5`Ŗ’1@ˆ!ĘCåµ·_|å§ß|ņ˜ė.’”²ńcĘ–ÆŻ÷4§ĶŒ*€~Z²¤0%sTVž¾źC—żķŠŃgœČ°“|é·}ҽŪön/6ȒåÄĮØ‘Ć‡ BŠFÉöÕ#§G‚*¦D&ĒĻ=©pų  GC&Y’˜Šu}ėĘķ‚ Æl™5s–ądÄLj_qķU[Ö­4hŠ–ŅŻÕÕÕÄ»ó¾×¾ütŚŌ©ĄgŒönŁź‘ĶŽWKČ?rō(78£=ŁŲj„BŒāJq`Œ°,A”ÕUÕO7łĆo?{ēżwĻøš‚ļæłę£U?@{ų®{rrręy˜Ģ}ś°°&, cl׎= ¾ŗÅß~:vģŲÜÜ¢Ü~ƒbT ƍ7ß<|šnøaρCį¦f,Ąk··„|V1䲿]žź[ob€€1†“TŠźS%!ē‘ 3ź4Œ@Œ±0Ŗ“Ö Ć ¶w(’‚x;Håā5 Įq-Ԋ{Äńpė`-Āķå‡ÉÖ0­Ņ6“Éd†!Gb¤Uw“ĄœķL¹ŗś•¬XL®:ŗ3$x’,‹VW!&ø7U\»€Ń.ʤ³×—Āš‘nūłn†;ē÷VžÖżŸwČČl_”µµŒ[ʘĄzvź\“÷Œ¬ŗÓötž/ÅŅ]bų?OPw—Ļ矌2:l˟gŽśŹųt`“ÓäP'„–ĢųARśtLBK°‚Gt5/ėI~÷†2,±Ź“™„ĒC »ø1‚˜ŖµĘŅS”R a»"k ĄŁ§žŗą³Ļ 5ŚQō6ŗcŒŪJčš~æ'Zƒā­;zč‰Nć"ųȚ.Ę,Mb ¶Ū8»Vńć‚s.µF¤æs.tUS„C1£œÜ.yX“;Ā.:‘ÉY‚Ю͑ ‰u]—eBøŪœ½Īļ­qõ:“]{X»ōEģĶ¢p$Ź‘h3Uk¬©‹ÅbłÅż®Ł;¼gŲkX1Ń9€0Ā2b‚ƒĄŒe—Ć5iҤ_[į‹‹Ą•ćhˆė†żēؔÜp8\m¾üš«’ūźLp;€š:½‡B~3!Ż<ŻćnŽÄ¢jlDf^8Ž9ĢåÕU ƕbĘR“ÆIšźN‰BˆF`Ą P”[XYUā‘wŸW_}õ±§žņGĆēĪæäŌSOõł|^Æ÷­·Žśł‡„Ÿž¹Ėįzūł’|ņž‡Ć‡ō_¾|ł“Ææ8}ö wŻßćO=©øzL—Ķf©©ŗÖćtaY‰ƒ Ķ ¹EE—;kƆ 1`M4ZR^ėĪJ7hI\€T:2Æ°Ų•žššśÕ†ß8ēn:tčéēœer;N:ūŌ”ōT0JPcYyŖŪ{õeW|łķ—€§žxŹ®‹‹ēĻÆhØĢÉÉłāÓOŠ„ėźźRs²'OŸ¾m՚§ztÓŚun³Ķ!¤"ąʙĶj‹FüHŽ—ĻēÓ¹*Ėrš7…Ā:u8ŌDŖŖŖ0`«Õ£,;;»©ÉF3žźźjÅ,[,»ÕÖŠŠPĖbŗ®#„ąŁįp8VmŪśļ§ž ‡Ć÷>žų¬1cėźźņūö6mŚmÜūÓ/+ öč£.üb2Ž”i·Ū‰YŠŚĀc?÷ō­wޱnżśY3fP$2xšąņʊģģģŖŹ ³Ł\V[Vc-T€tPž~ņéKļŗ1>ĢąT,-ju¹ü€pqßā@ع¶±X;ģ®`ČgĘęćŽ;nٲev»= \wķuß/]zŅI'•——×ÖÖüģĖ.»ģ¶»nūō‹OŻ`Ā:ōµ×^+i©_±bÅ駟>päČpeĶÆæõņ“O+˜d¤e¦¦dī¬-«l¬|żÅW'Ožģ²rs¬é^l6ßłµW­-9ø/#3„ߐ¢«Æ¾Ė8;;[±[?\°čĆ?ō5B”`K®ŁI)ÅTŠÆ(ØŖÕU¹}ó­Vkć®2„¢(µ µ&³5Ŗ«*×<ŽpĪ}zKvvNmS]TÕóŅÓ}>_DםVg†bWU5¤©1Ä‘¦é4 šĄ¢ĪĢ“«VX@öz¼ÖtļųńćW¬ų=??’÷ßWȲŃU "}žp0XŌ·xŌØQ·WÓ“qS§LŸ9óŁG_°`A~A悂‚µėWq”3"üį– Ó§øä‚R¬ £‚ČF’6–W._žė9—\Uc«5nćĻćŠĘÆ}[·’žĖo&l:’¼ [ZZ@F6›Ķp Ą4\C‘¦ę'xxĮGöɗžžūļŻĆ ™`3‘=нoß¾S§NĻĻϟrŅqłŠ‘E„ōpT6[X eŊ3OšĆ4 1uČpŚ-,,ģ?p°&Xƒyą‰ĒśōķŒę†w8¢ŒŹˆŠćׯ3dųö Ī>ł“¢Ģ¼²²ŹæßsŪ?xĂĮ†¦Ę„K—ž0cZ~Q‘ˆ¦iŠ¢ IŠæ¹›”ˆ„£V³eļö­ŠśmŚ“į„YĒ]|꩹¹¹sĪ8uŠ”©3’YO1IÄ#¬ėŖŖ-įuėÖM˜4±’ąAƒöńćĒĖfłĶ nøž†÷?ū˜œ>oĪņo~±ŁµiĻn„ąŚiS¦B6mŻS € @oi …BH4·ØčąŖ æž¼ĢēÆē\s9mƽöZFfž–];ö–•9SŅÖ’±qŌØQ~sZVö‚—_¾ó曳¼„[ī»÷Ü«Æ`œaŒk+ˆ÷+txoæżöŅŅCK—.ÕÆmhŽ_S &3W„Ō0°8oņĢC%ūpEQžżĘk“fĻe-ĮŚFŸJŁśõėēĪėšx˜ąId˚µΘćńx¼yé/æöjī €@H’%&(Bk:€IfHŹÖßW’ÅgV«uÖyg 52¦ś¢ŃØ'Å Xįńi;¤ĒŹvķ=õ„YĮ`°TS !œQ"¼żśēw±ZøŻL^[°EkµiĢ%L›8ļ4/÷ŗŹGŻĶłµWźX£&ž™uašĄ]ėęŚ÷myQZ‘§hļ“]‘ߢ‹z¬»B¢«“ ĄB[pqGxwa˜2œ“ž$)5ŗU!ˆEwšµ»dę¶Ż%:¹¢`\‘lŻva]£„ ¶@H ‘taџBw’÷ˆ·—¬iā.$@ĮaÄä½8ߣ‹h‚¤įöhŃ?“±ŌöÆR4wģ”p.:~2o}mD;J;,ŌźŽg’ŗ\Œ^‚’üł“ż¼č$MIFਠm}²€Öó0Ņē12@UuÉ$qα€ėÆŗź£Ļ?‡#×_õ÷§_|dłĻ\ßnb– K”•s꘠ŪµŒh‡T»œŠ‹²vB¦Öt~ ogL `­¤Pr|<“ī Œr„&Hp0LJ ¹±Ąq&éāpŚBŅyņŌQ7]I]†³÷œßY ž “é;lK‰¶\‡ēŖĖš£yi)K”}œ1J©"™īŚ5xŌPݐœ!Ą“­HÜÆxĻžv›«ÜŖ˜|‘€$‚Jø…SĪĮ1įÜIĢӂĄ‡ °sĒ>]`ApŒéĀč¾ Yø ƒ$a¦! „xæ¢üŖ†ŗĘ`ĢP’å`!¤œF  !Ī™6MBœó4a±™Ģ“c\ļ÷3Į<.OzzzK Ų'#³²²233³ŗ¦&«zX€(Ź/VU555užüł»öģÖuż¤“ē­X±bķŹU™©é!`ÕŗUk6ü±uēŽ’¼ōĀo¬"&{“õūƒŠŻ*šZ,Æ_żŪųcŽ™süĢ­7dJĒ³æ”¬(«X„h,“ķÖßvmB7nÜX[_3aĀ„ Ė~}ē7«Ź+dY®mlR™js~vŽÅj*//·§¹­NGiM…ÉdŅ!Q°€ńćĒÆŚō‡ŖŖ6Åm €ÕjmŃ`4ä9;5£¾±Öj¶N˜0nĖ–-šĶŹŹ’njj²ŗ^Æ·¬¼’’‘ź ‚§+ŲģĆ:Ȳ4:¶“““ŠĘŚs0óxœRTĒ[¬īXLĻļST²Æ$7'æ²²²…h’ ˜j![NśžCūūz2š}Ķ1¬3.,ČjĀ’Ę"yYyåžŚ–h$Ė“rį9ē-zoŻnÆilP$Ř¾3[,ćšP J£Ł1ŽĘ¢żŠūķ=°ÓAd„gł›8ēv§»!؜’šVÓXėF!d¶YBšF#±€8vāԊņŹŗźj£ƒšŃ';ל½NÆ/ŲŠÆ ßŽ’}6‹GU‹b’11™L@p$1YMwŻu×ķwܞ™‘mš™Īq§ƒ åį@Š7C Gņóów—ģq{ģéi%ūÄĀaÆĖ»=P#Ėņ0G†¢(LĘV—£©Åē÷ūNgccc,Ŗb„BY±bµZ%—üMAææOfqMmÕjGĀŁi錱z5č SīhKHĖĖģƒu:åĮ†`0hĘR†75ŌPc,(hōˆ”‚ĆDd•šŠŖĆįpĖ–¦źZ§Õ©(Šn‘Jk*dŁÕU›bęš^lĻHOĖjhń»\)ƒ6hČśÕkÖ®]‹-bņäÉ7oŠÅb*×|” NČ?|ą¢Ė篢]×e"W8ōć7ß-X°Ąā6æõž»ŠĆåÉĢ k–ž8iś“ļ¾ųböÉ'>ņČ#'LžöĶg‹Æže(Ė8ș‘jš—åĖ™8įĄę4—Ūķ®9T~Ė 7ŻqėіŠmwÜ!Łoˆ¢(_ļXM0qsd¶;[|Q` Rb"zŚÜÓL’żŠ«¾^¼xƌ >śØ¬¬lźŒ™'tRŗ×żā³Ļ—(9דּ·lŚ\_×<óü3O½ņ2nB†’Ž` ,’"µ‘”/^ēŽnÉs„rŽ/æķęó®ū{Ce…?ܒ“—19L „ąœbEŒ!Qeū¹lV·ĒóŚƝ~śÉĮh`ŲØQS»ćŽ;bwśéĀeåY¢”J8¾;ų𛫶ķńz½ŠÉņóĻ?ŸzĪY‡ćÄ!Cµp“’žO<ņčY§œŠŖ VŪ3ŅŖ|žFMæūĮxąˆ±9£Ęé±Y–9‹~śV§cL[BžĘ¦Œģ|`bŧ_®ųmŁĪ½Ūī¹ēŽĒMV\\`Ė <’Ō°q£ŸłĻīyš`0ąōz^¼äü³ĪrÉVJéĪŅC¶Ģ ĄB‹Å^züńgŸ|BēüĘ\ų>łä“āģ|«Åłąć 9–ae!ńÖ[ożśå’={ö „²²²^]šnH–”•ī9°ß‘ā½üŖė@ øŒńEļ½õĮSĻ×ÖÖęö/ZōŁb!³Ē‰·0Ę‘„@Fā÷gϾ²hѢᣇ˜=Ī»’õ4 «ŖšīōEaœÄ©® ŖĖfó=’¼÷‰ĒŸ‚@įˆ€˜5żø[o½uņI'qŒpÜ”Y)L€“f0ĘŚh«NóPķZ䢭ݟ o“KQN;ÄX¶Ž°aŅ*fŒƒ]=”¬m~4­N4É(“k ”$īRkÖ]‰2«ĖqXÓé.ŸcĘŠ’c±‰vK“ėnŻOĢ÷ź­K‚ÄŻ-…GŖ čNÓ¹½wŅ÷–`Čį“ ŽNk/PwQF½}!;÷Džd®Ż6œ“­BīlĘöst_Ōe7(*(|ōĪ{Ó§Ożā‹/nzšvNaBFNNNN^aŃsļ¼WSU–––¶uÓŹ'~Ō‚$“$—*Ł{ą·ĖM!żÜsĪ8žųć/8’ā»o¼łÕ·ßLw:Ķ*æīŗė®zōjwŽ{Ū]÷Ż›žž”3q‰1f2›ēW^|ńā>Ņ·šøćf 1ź¼+Æ-P]]Żh:f Ck×®ķ7aLJJŖq8¦’@æßļW#U¾µ¾¹¤¤äÓĻß.++ŪuØĀßńx3’ųć#Ղ{-76ĆI“ū±ÄĮ XBRPh&g2&g€HÜ œG³ŚbłŌN8A1[?žųćeæż\Ż\‹SU0©«+((ڧ ¬¢ģüæĶä¹gU-J)µZLÆ’÷•ēļŌķv—4× ;öž'0bXJZ&å¤"ŠDĆ”`P±Ś¾üņ›iÓg 6°ŸŻFƽłĘkļŗ,0Im£Uœ/’ü‹g|¬¾¶fŅŲńŠūÆY³ę”§Ÿ’ģ–¬Ü%Ķ+‰q&1ź„x›[ˆ6y­0Œ 0l×¾=1°<öĄcgnŸā";‚‘­S]–å#¬&ķÅÉķiĮŪÓ„Ø PĒ™č(Ęī0Kœōɚ¦)f¹ĖŁ·vÕ7ģ»pkEœ LPē³ĪBߞ†§cqéš]LÖs'>ēƒQOŚ7Z’7~ ]vDO¾7ÜUO0,1‰Œø č=ĒŲ3Ōüó8qÆŖŲæ žõƳ¦ĖæJ˜õžµįO‡=čµŪ֑ž×QŲ›żµ ¹]BP‡ŁTćÆ)„&“éčŗ ’#Ķ÷Q@āäå,q„mr—D£ 瀰@L4ī=8{ö콕„Ŗą‹}|ĘŁgĀGuDĀÄ«Õ$ 5łøxīņā0Ęb±˜ÕjķmW‰·)ŗģ)v¹`ul·öQ‡ĪßŃ!½žŸ‡®{~¼Ż’ŽĪÅńČæś/Y,ŚU“ ¢8k;»¶|ꎭ^}mēĆ£”Jn}H0P -.»q.;ūœŸ¾ż–Råā¾G¼åŽ{Yk‰4ź÷—>żōÓMżé§åEłæoßĶM \ oŗtžG}äMO«¬«»żŚėēĶ›7jŹ8l·j±(ĘX’-œR!aŒ1āpÉig®žžg«Õīś-9Ī‚¼©S§nڽcŃēŸaIį°IΧ L9P^Zå÷‹pä†ėo¹ģüó‡ &Ā“žFļœĘ{C >›Ķ†|żé§cF }ź±Gś÷ļ’ųSO«‚jŪ7myōž·oߎ'æļ°aĆ8ēkÖ¬ÉņxL&Ó”²æß‘Ø/ąKé“SRUĪ\EõAż‡­=ø7Ä4†€å7§l6Ė‚1Siqaqm ¹Ŗ©łä¹³·oߎÆ_æ}»vO?ĮD¤°/0o޼ÉS&]xį…›œ9mņµWß2sęLī”d‹E›ė~_µ²oNīC·Žõä“O.ݰźŸ>d0’īIł×æž…lD–åwß|sŅŲńµ5¾Ļ?’¼¾ÅÆ1šēņfdd|»zµäqęP¶aėž[KJ÷­_æžŚ\’Ž» ¦Ī>~äȑĮ`pŻŹÕƒŠŠüu Ļžė©Ń£G Y‰ÜūĻū2ū‚Ż‚d³Ęø,Š˜žäM·dee­ZµźŸ’|0gš _CCyyiaa”#/÷„_|óĒ„E_.]Ź3œa82B€€‰`}ż/歘;w.QdDˆĄBˆ3:Ćēž–;%Z™ŸäÕ]Š ¹u¢3†%ұēJŁŽ;śädźŗīIIB@š+Ļ:cķ?y<žp$¶fĶze@Ó@°Ļžū÷ūļæ?`ŌȔ>}īzņ¹p(ōĢ•_µź·P8‡'M›qĶ5’Ų¶yēš5kÜWUU%ĖÄįpXķ¶Ļ¾\µYœN§ŁbE,tU‘/ĖrJfźOæ,' ¤‡¢LÕĶ Ģ}ž+.ŗ“¹¶2 .YłsCCCuYŀ¢āĖ/¾8‹Y²2æ\ž+h$ĘĻß|Ėļæ’>yņäHD]¾jÕÆ[7‰cy’Ća6aY¢‚ļni önÜ:pčPf²†€ŽĶ/²©B ‡N'Wä„Ė~}č™1Ę<׏_Vø‰‹ÅvķŻ‰D¢b8Ę*ćvÄLX dēX8¤§§›¼ĪŸ–żšns@Y“E`ÜVk0IµŪŹ :•䦦644ŗ@r¹\ūM†t¢Č²ģgjX„“G W%0Ę“pYE cłM®>™ć¼\7ęB–從vxĮˆhѝ{÷Ōź:ćĄ&©¬ŖŖ©Ęng£?ˆQ™P#@2 ’@0 D¶œŅC HÓ§OßųĒ:—ÕNĆŗÉd«ņÕ9¼)Ķ•1ą`ą¢I'¬[³p:œµ-µ*€.A” „x<-ĶĮ,kŖ,ĖĶA?CP%…åVŽœHń˜Z4Ō?»ø¢ŗĀZ b9®¬`0€SSSėżĶ‡#ģ Xd%¦…½NÆ*q•Q4Øjj±5'E±©±H,Peffi$‰x]×5‡yÜŌÉlßāv»O>iNéī}«śÅļ÷3ŅęōĪ;åd·+u÷¾½<šĄ„^ t* ńą³Ļ®žż§>łyłżŠC~’Ug]P]]]Ńā?ŲX V‹Ą Ē€ß~÷ā÷źŃŲøqī¾ūīćęΠѐ$EQĪ:’ģéĒĶ=cJVnī±yƒC”PVqß Æ¾¼E‹.ŗč“×ßŗāź«8@fJʐ!Ćæśé'PŌÕÖg¤gÖļÜąĄ-[7żų揋¾żŹäš²šęsęœrhļžŌŌŌ¬~YļóՁ]{233\öóĶ7ßl’äęęf †Ē³`Yp€R)---Õ6I²™Šk®øfÓÖ-üńĒĄIć>’źKOŖ'”’ŠĖS5 w¬Ż·oߝæ~ł/Ė)p§ÅŽ±Ä…īn=2Źżv/ųį€ĒaµG×ĀI¾ÄŠ•Ū{'€Ä_µj}B­‚^tNu½Eā[+Y+E¹łĄ¹–1‘0öJ$¢$s?CiP×$0!Äb±tɎvŻImĶ6ąœø«a<©ćR†Zm-@’!#J¾€½iķ$iŪĻ ŽŖīoAū„$ßŌ¦ĄļzĄųph‰Š"y^ČB‰Ē†‘£ķ4ńÕ&]Eƒu½®%?Éŗ®K’0Ę–ˆŁėЇXńŹ[ozÓR)‡žō?¾ūEŗēäĀŗv’}o۶퐿^xš†›A!$`‚I?ūüs;7oŻæ{W”Ėóˊ_ų÷³ 5•‰‚e8Ēs9šū_~¹ųÓOÆŗź*0L€ĖwīŪ¹yŪ ēŸ%d™@— L$«Ē]u°Ō-[\°hÖ%ēŸsé%ц6„BžōT œ ŽRü“„»‘õå„CFÜW±ļžgī#„üøqͲŸœ|ѹ[wl@$>&ÄćĪyšSd˜a®C`Xf>‹i©}ܲGIµ›”kLøćŅĖ ó~]µlĮGÕÕ6Æß“唋’VUrąŽ›o¼’žū-.Äsą2`Į¹ĄFmĮ9듪WŽvX\H–HŖ‡e»=ć)3¦F"‘Ū^yrĄ”)$ÓU±wßā…*Påo>eBf’b@hŌqĒ»ģ Ņ-<2rԐXSźN‹ć»?Ÿ4mŹ–ŻW+++ęĪ›^Ōē²›ÆWdÓW+9ēņĖbZ̤XFL=FFDohzį„—[tmš óÆż‡· ÅX Žō`¤bßī¾}²7­Y£ŖŖÅaÆiØĶŠņ˜„’Ų½sšø1 ņsŽżpąö C‡EĆ-}33v4TŪ=i 8 i,šÆZłŪ‰óęzśYBĀ#.J8āŗ¾gĻ‚qnnī¦Ķė'Mšd¶ŲŒ8Pʘ$ˌR!„$Ė&[Ÿm!øĄ'Z ę"šżōż7§œ2„‰ĘŌ@!ųń—eNœżõ·ß]rֹ˿śį;|āķ×Į žśoæ[ņĪkoZ,–¾ÅżÆ»ē>Ģd7;2R.§"“Q#F¾üķ§5µu¹3-š’ ææņv?“3¢©éżƒ Hn«;9Ž5k}>·Ķ”76©Œ[uNu]F²lQ˜Ī4-ŗbłÆ·l+LOĖĶĪ’ņ³Æ‹‹‹3³ņ¾Yŗl÷Īé©é`Ń@˜ĮWÜÄb±ģQōłāļŽ›wŅgæ,Å.g·eĆFMUcQ}Óļ[FOšP0d—dB1ą2łžl¦j;ėj‡פÅpŸō‡ž~ Ģ& č΃žf—ÓuΉ'®Y¾ņŖó.“X, —|qžÅķÆ®dJm4x ±œ·‹Ģ¢£Le:€:‘‘Ŗ U÷ŪÖŖØŖ:nĄąŸåk õ±{JV’±ńē_fœ}:!ńč` ‚„ Œ#NX4 fŅæ’Å_SµuēŒc¦Ź:ńc‘SÜW E±É$—Yć8啬¼µŁlŻĻ µ ‡2ʉ„ćåļ-s‘lˆ…Vv¤SydģČń=:1›|<Éu²Ń#dÉŚÕBIÓ°‰’ęšČ§cNfū*JJg !ķ.\ū¹bŒŪĮŌ6k.Ņ[ŠrŲFlĢ„ @×uƒė2ä°¹²ļQ—ˆ«×”›mŽćŻ…ĖtøS½¼ļG]£öbś’źWūcĄ­ˆ%”“ų’yūįöŽßāÄæ•z6%ļpÜ 0ŁĪÓŖ{ģtŲCģīūÆz±;|‘d}˜”’ŁŅļ38ēDųšk÷°ŪķiE9KN(—<`Ōšē¼õĮĀ…M-«"o]¹:³’`®é.G  q¤¦ySR‚ MŒź«sŃ £įXYÕŽ“ģԱƺR½Ā*ķŲ±mÄØ‘<śp® T—A_|ń߂Ńūö¦ed¤ęēsĀp¦\Él’ė'Ÿ|rāq3Ž}ĀʍOõ4·×[ZZśąSĻ ČČ~wÉ¢·R?³ŹV‹Å’™™ŁTĢĖs1 0žćĒCž@Le)i9a°”!¼eéoŁE}‡ē÷VŲ’o—\k‰}³`4Üį!’p†&B82ūhšĪ#uĶ2ŀĶõ55ŁŁ9‚`&)—Ė‘āišÕ¬7ļŪ9tęÄćꝘUPX4fÄ/¾*Ė2Š©BšŪaøįüK•—!„Ź«*¦?ӛ•!Ógœ4ė»åˌō•gŸ{cŃ"“dĘØzMIÅ®ķ›CŃH‹Ļ/cÓųń÷MÅÖŻŁ£‡L| n»ĆåJyļ„WźvȰ;ʎ[]]‰ÄÖmŚtė½÷Nš6Ó4ÉeÅVSeY©ßļ?ćü ĒM˜”Ūo  ”b¬©éfYķN@Ō*™ƒĶMĻ=÷Ü߯½:??’½÷8.H¦Õ3i$ą8ĒD¼ΆXŌT×Ųi©®©.$5ģółVÆųåŲc}ń÷kkėōĘĄMænĪō±……}«üfu𨁠p4WŠŪ’‚œž?Аąī)«¼ē¦›_xįEĄŹ…[ČŁČlBų£ ?XšŪoæÕÖÖZ,–Ēś–oüöėÆLXVÉl6ßtćm7nĢĶĪŖÆÆ_śó÷ćĒļūĄ.Y[W‰²dHõz›š›K[‚¶Ø:TMcŖNMQ0aɏ€q  :kšE1Ī,Ą† „=4dbļ¦GŠś,K“N>8€@€9SU“ÉD!»‰h4XQk±Xś\wŻ5 .L 1Ÿ †Cn«Łø9i@¬g*)¾]¶VFš¦Yˆ9ØŪž ī NLrL,t’‹Våī"mŃ`Ą:}€æ™$J\ŃŹÜtą3H–ąV&"^Ńu3{,Śź> ܦÆnÆ9o~'³ń87CDoj­ŽTž]rŒ ź¾Ė„”^BƒĪ¹˜GW öœEŅū‚ó/śžÆ‘p‡»œØQ«iļįøžņ·äźQ¬7ŽČĒč;GŠõŠŃ9¬<ąˆ¬ķŗ„jVÕnĶ¢’BŲāt)X Ÿ~śź«Æ.[·JÕŌH,†dłHķµZ¹‡ ‰Y,fćq1f‰[Үݰt]—e¹ēĘ[{īÖ[ƒtņčåõ7ŌžūĆåńŽKŖ1”Iī…ķ¶œÖĘpGS·$»ˆvo>ŹUąĻh§KѶóń.<$…ĪigHÜ{ᓁØ;ł×ē‚ąøµ¦Š˜ˆ1`ƒFŒnټyĢ„ńœƒ@°ŲĶöżj!øķ†ėŸzī9f¤/‚a·Ę˜¦ļŚø9PךĘóĻ’śŪo:FūLĶ+äŃ(¶šfaÄŠP1€ISO˜xLeYySsS#pųā‹ON9ł cĪY”µ„|/>÷ü›Ææįkh$‚\ń·+r óś÷ļ­Z¹ś¢ó/(+­ł±päwŽIĶöž}žy¹ż ‚Į ‰DŅr SRSćb,“¬Ź1åD‘n{ŠH<%Œ!ī¼ėÖēžz~üŲ‘³gϾéĪ;vĒUWĶ’.={vŸ>}Īæų¢ü¢ž&s*ć YHĀĄmĻ瀅ˆśżŠ ›¾>žäō³ĻöÕTŪ3 ®˜Ķ€3&„ ²¼ß¾¼¼¼‚¾yV$į˜źt:Ļ>ūÜ`08dÄšs.<_µb›ĖuÉ9g}÷éw)€ķVwK$āõzϾņ¼‹ÆœŸž•©R$ b²˜$ćj'„użżń{Ų½{÷1Ó¦æńž{Ģn"€ĮęßVōsø<×^ržĖaĶĪpÆX±" |Įē_X\«ÕiÄ=3…ĄłÓ¦¬]»ÖętU55oټ¹pšˆHSÓźÕ«§ĻœĖv+ĘBzK¤¹¹™#œ‘‘AW,ʙ 0|Ś0j³«Å4³YA"īK@ĀĄ59€Fi8śågŸÆ\łŪå—_^0“øŽ×˜öŁg×^wUsssŸÜBb2µšś÷ļϢᖣN»³%&˜H\;żŌyļ-z·„„„¬¤"¬ńPĶgŸ.޲mkeUåĀļ?Ÿ8kĒ"€kU¦ŁŻ¹é7ß|ó×ü#(ć ĮHĄ°Ā~ åUŒk7žćĘū^xŠSйšXŠ„Ć÷]{Ķwß­ŲäĮƇ½żńBɬČ+"䂉Ǖ——SĮÓ³ś,ټ–s޼sß ÓŽ9lč®]»ężķ‚æ]yuNa਒šżWŸwAŠlāœgäü¾eh¬)Ų\ZZj·š†ōxJlnlšiŅTI–ķvw鶃->eeł}wßQ—‰D¶ų«œ©«W’‘–“mŒ€ @HHp`‚J’B]šī»W]żw]‡V›¦iŠEM:aŹ ?RƒT–eą“¦¤üŒŁ³"‘Č aC>łę{šøS‚IKm•'5uĮ{ļxā‰K~Xzå•צZ„ūļææ¤ŗ,555Ķå™:u*“$Y¶”( 4łdEڰaƘq£÷ļßļv»ļ¾ūīpDwš$®Ó§Ÿ~zĘŃĮ`pC‡ݵkה)Sj(„}²²·mŪVV]~į….Y¼ä¶[ī²ö:½«7®Ł½{÷’ļæ’6 v芔ѿUUUY­Ö½ūŹ‚bܘ¬–™`Ą° …Į˜!ƒvīÜ­€ °šdUÕ&“×ė­Ø©ńŗģ±@(Ż•¢HŠĻē›)ŠPLX”ˆQĘśz³l&³ßļB¤§¦ƒA‰Ŗ@}@x±"ÅŻBå:ADĆ ’M¢\$„ B˜Ķ¦H$„š‘*ŠiU”‰¤“Y Ąf’£ŖnLö ēwöœ9sˆ€‰£G’ōÓO MūöķÓ#tŪ¦ĶUU•FƒŒŒJĻ’½Žx÷ŻĖ/æÜiw¼šĀ \z”ÕjUĢdß¾}Ļ=÷Üe—]öü“O×ÖÖ “Š…¼Š#%%eWCuˆŖļ½żž9—\ÄĢĄØĮ ĆŃ.u”]H­E[4³X̉Œ.6\ŌåvĄxQ_”u"Š1aŸŁ±0€nBI» o/œ†Ž%ń›äӕ\f@ײÕ^2älŚj7Ż6H ]ėĻ –ø;+¦žlĄP­"š“ė¢ä+|t‚d8÷œ£ųÕŁbö’ōöœ¢ņ?…Äн»P/‘Ż’Ƙķ®É8¶Ėƒ>,ėŪw°e:¢ĒīHø”GĒÆĪ«ĘįqŒ@ā­ė eB!q5ē?-ūqöģ“ ¼éµMõ-į2+€ÉŸ 5J’t˜„N†É=l;HÜaHN±;rµš‘-.¢ć’rß6ŗ°»Ił^¢½Ų µ“õ'Ūß½±`étĒ)ž4eISIØ[+‹Ž,©”R„Ńūh;GŽ€ČFÕŹ!ĆĻ3¹Uüł«ÆæōŅKŪvm7ɊÄi”ńŃ£F.ųtQjQ>”Œ"$Kܐ3Ŗi{¶oݾi‹Āł 7Ü  .Ü|żM÷Ż’Ųm !ā›%g µĪ…rĮåW”Tq —_vŁ^’ Čd“-8SćĻ>õō}’|€b!@  !¹…&LX½vĶI'tžüK‡ŽyļM7ÜæēŅĖ.(..žą“Ó³sιč¢ō¬##~]ć¾+Ų(÷gĶY’aIÜWĒcAēČr Ź4™ܬ1Ŗi P„f#mį8€B0bšž ęŸ~ÖŗuėŅ33>’üs{šW1™ø¦ŖČj©««óŚlš¦9R½„ 3zÜ”C%E¹9[«+1Ę Ŗ³žÅ™©i٩鿒¶¦.u˜¬ :ÕK‚ŲlĄ9BY£S€1M—$TdšLƒś :pąPEK ˜šž»ö’±u÷īŻ'ž4o芔c ęĶ›mK1æüö„Įf$[Y,Fˆ  q@Ć?/¾ä£>ņf¦Ø®9÷̳žxü©P$ģJńŚÓ¼†™æ¦i„K÷ļß_\XŌ§OgŠ ˲ńLsoŠ$%‚s@Č([B 0Fzµį’į¾²źM«W8p`Ž)sS2Ókźe§­O’B„G1Ī9BĮ Į XżćæüŹĢ¬Œęęꆆš½{÷bJV­ŪtŅÉó0]š(cyłECmŽP8ōŁĻ?Œ˜2ęv·Ķ·ü»„‡5##cÅžFu" TŻßŲtĆ ’ųbńē é)é;kŹ!ˆÄ|µõ¾śę/æüņŁēž$„ųi쁇žyÓ]w"ŒŻźŹSĪŚ¼y³ĪxECÕ²õFsü1·®ŻŠ×“ZļkųšĒŸ¦Ģ8pŖ~ßöķŪ1c9fŽČqn·{Ǝ­o~°`čųIv»=hr¹ķČ®DæęĘĻ}ź÷5;ķxwzźso¾.3Ų²ķ–k’±qĶZ‡E™4qŒÉdŠ xń7ķ9ŁBÕ)„{Jö»ŻīōōT0™­œ–M 5¦\xüQŖ®FcĮf_mmu ©YQ¤¼¼¼¬¾9a5Š"I’ É2#˜sĪ9˜ˆ TB@P *=tč²3Ī.++ūę›ožūß’^xʅ 2„„glß²uˆ?’°tš~ó–ˆo÷īŻ}ö_üūJ„¤•šL“āƦ0lóč–e+.øą‚J_£N! [#<DŃ5Ī"œs‰›³mN—Åźp8B’`3%„kUø†e¢j’³Łģr;Ģv» Bęˆ€ ˜sŒ1#́@?ā°ŁlžļĉŸśčmƒŒD#³M!@TF@¢±ńE#Į–¢¢¢žy÷q§l,5 ®©q{Ü_æżī|_Š·_ńĄ ?ŠFt™K’$„fgŗŻīį£gee}ŗš£”C‡ EśöŪ„£ĒŒB„›¦L™ņÕ7_5jūöķŖŖ6·öVÖD“tZI€0Ž7'Æ¢²c¢ršćš¶““D„… V@ÉŅÄ#”ƒ‚p‘‡d«Õz0`Šb!jw:ŒQvvö¦mŒ1¢¹¶ŽćNó›L+׬Ė4YCjDĀ’Ź)°šdÉ\pĮ£’}Č2 qĮpk ĘóĀüqEsż¾}ū]’%+3gO}eXSG§ØŖ ²8qŽl&?üšC0lhjJĄŲxlŽņH B€9Ü{ĻŻ’|ģńxõÕj©Ā”'[Ķ.¶fæn”2I&]¤÷(.k{Ž©Æ½łn3‹Ż.(ÅbMõ ©i‹?ū|źŌ©®¼,«Õ €®ų'=‚¼Õ·ÆUŅŅF3 •‚"!µ{=üšĆ'Ÿ6{ÜøqŌmRÅ*)&“ $!©]ĶWLЦŚZwF!$nöÕTm_·aß¾}ēĻæzķš ĒwĘXv+gžz*ošÅb±o~[I\īų×s®ż±fŅēž7 /椤ä¢+®»óᇁs"qʶW3v‚ÆbĶĖīóÓņåŸ~öé„ īŲū駟.]¹\\q˜Ō× ²±“¼ōŲæŗļ¾O¦$I~żu^†Ób¶hZ,%%嗽ū,‹Šž¶ü—Ż4ń˜cĄe€Ū/ŗųǬiš9ÜĪ÷?üģ˜Y'btō8Pvńég’üĶw`ęäéóęœ|ī¹ē’¾Y ßyg\^Į¹ēžėŹNٵ{÷G8sī\°É‚±˜N[ZZĀ ¾}ūr‹b Ļ6ćL¢„ą‚aEiˆj¢v×¾X(¼té÷iiióĪ=U¶šĖźkÜn·ŪéI„A P&ŒN#k:’d ĄŪ¶ntŁŸ-XxĮ¹ēj[6mŚ6dȐÜqķßęż& śäė/ķvūī’‹=žŲ€0Ž×Ž‚@Ÿ „ PQ¾wļ.•EąÅ§Ÿżył*¬`“bUu­9Žæ† :=BW333»uÅĪm@äˁ!TšL& MŠĶd2#”(śy<®0‰ ¬!@—Ķ9ż×_ DcQB€rĪ6™cKB§X’€S!„$Ų½i˼iÓūõ-t:Ż >X(ä  ‹Eo¾3ļøi›6Æo‰6[Ž£F.łīŪ„æž~łÕ×7k¶Ā ]ÓUU¶;å‚`‚øįx,64;W®½śź«KŹĖ\.—Ķl9ēœsøf͚ęĘŗ]»vÕś[JĖjҜV0 ¤§§eõÉ]·n“@pęYg|ńé¤v)’$(˜ī:thT²Åb±c™:qāÄ1cGś|>sŠĖ“–vå©§=śŲƒ7Üqó ';ā†[ļŗć®åĖWn޼ĶPāø­&ĒsĆ 7ÜtŪm†›‡²A"#ŹB`Ą¾†:»Żnµz$ œRŻ©Ķ⬳$ĄŒQVfZMu½×eMKK«nlĢÉÉŁ¾cÆI–ĪNœ5wÄø1w?ü ǰ„ 5éT§%2x»Į(]1²z’C'Į<]£²,é:•e©Kå—”+ŽÆW:ócÉ­vąT0ĘdYźųo;O/ģB“-»Z’¤SżŅésŚĄ‡ƒÄI`0īBå—Ģœ·Å‚ #«v:V§ÉÅ$ī‰cKę0ŚR0;™Zõ’9끢;:?°äŸ7(äģåüö’$žā^|Ųj¶CÜO2$9ŗĀ’ŽdībĘ»—ž×=šĆ= Ó£»v ƒ»¤ ;ŲÆiš¦(JwļX›¤ÕfĄ`™„ ”ÓŹņŠĀābŠĮ(ėņ¾ž™Pģn­ü’"ÉG»8{c%ĀķV–‰j=ŸNoŅĄcŽF£†Evg“]iļ;ēż¶Ūąpa€ŻFƜń†"½Ć­ģ}Ā$ىµŪ“…č=Wœø€D§$@Ō³œ›¶ķ‰!Œ„D’ =jic}±@éŗ …“h$#+ėĘüć•W^ē”3@XFVžRB0oޜ„ßż`|ĖŲŃ£W¬X”Ų¬Ęn—VPjŪ]l-qąjx ąŒbŒ°d[?0lė„tŌ ….sĀŗģć“IŁyüŻ7ģCā*\ךjėĖ*))9{ž‚RĪ€sŽˆDAĘLOöŲcAN}4¼jåšŃĒĒŪ\Bœ1‡Åj¦śĄōüX0„1D‚NƧ"ŌT ©~æbńW_Mœ8± Ø‚c?üš’zZ--A¢(\V ~Q€øóņæ/~{URœNēēKæBüūŗöģŁ³}Ó„Ł„O?żō9g9yö¬@]]DW±bŹČčca8ÆbŠAaą Ž£į0„1ńÉĪ9qöē²léŪ¶l„‚ŽŸvĢ'ß2 kˆćV \FŠ“Z• šłmŁŅh0”™š2lŲ0l¶(g`Wé…ē\XT8 ŠŌji”d`c~įÕW^xńß@H €ŒFX2  ųųŻwŻngKČwģ ĒŗS½²ĶĢ4ķ‚ó/r¹\O<ņhJV.€$ ”ÉĖuŃŌŌ4iÖńļż@Rb%ŒļĪń$ß= 1¶Ž.ņ#xŅ<§Š!”Ӂ¦„„]uÕU—ĢŸoLa „€ąp8l³:ā˜Ą0’ĪGWwīw_|„³ŁLL²"āoŹMė“ēq˲üčō5LfŠˆ$`‘–?łÆ-kVĖ ‡Ć×ÜxƱ§œ1¾Ø©±±²²r芔D1A[?”tŲ£’2Dr”Q”Ó»ļ¼ė„’ fC™3ėÄ¢¢¢ęŗE1łż~“Éäv»­Y).—kąąĮ} Ā-A›ÓoŹ Ņ$H$āä¤åW‰vS]ź;BŪn‰öC¾Ø³‚Z„B!»Ć‘Œ°ēqé0ź&ėø½¹m)ļ> ؗE|·Mt-ģV¦Id5>ņ£ē:š°œD/#g»Äkū|юŅļŲųˆ{5ÅyŚĀ›;ę£c‰»Ą/ H‚h(bqX“Æpā{Żd]g&öų ¶„;T¹Ō‘G÷:VūIŸv¤ Éņń€ŽŪnóŽ™2‰€.?ē°]Œ7żĻ£et‘Pę’…¹Ņƾ?4ü“5ưhbvšsn<¼ń¹,Į ­«×͘1#¢kD°%dµŁ¦šÉ°GqHG‰;ÄĀK@”νɐmģqoXāĪg—˜‚īąsŠy?k…—]lW‚ŽBeŠĆÕKœĖQĘM%up{‰; ]z¾ö,8§œs‚1j9¹ŌŖ·āń¶%GUsĘqL£”`)ģkZ“hŃw?üųŁāÅķ†ācKœ…#v§c`q’ŹŹņźźjŁķj{uhXt¾>”–»Żgr8oŻ!DRń“Ŗ ü.;]iŗŚ+œ „PÜ(MēcB‹D5-¶g箾}ū¦ęäpÓu]–M˜Ę‘$Ą8į} qN½­^ĄPŒč-7^WX˜Ē5żøi3‹ €Å“kē¾)§YeYŻ-‘–O¾žf‰ĒĒaXė1µ 8`Į,JKKūõÆ8ø0¢\ G)ŸwźœĻ/NpBd‚ @å `ˆ¤ķŪ·ėŪńÅ‹¾\œÆŖ<ؚ–’’b±Ū!0Ą y[Éh&eÄĒÉØņaT®éźŹ_V,żįY–ļøó6»Ż.‚A&ccŒ %Ű4GK>ü8RßøsēNiæž:f’ śs!$I$ S˜Z8 „„0Ł^U£ ]Q,Øq}óég~żõ×̾“'Ož8zLff&`‰Düz“®®nņ„i€AY¹iÆÉdš5kÖ£Ļ>ęz”ƒ "¤«’$q*0!ńź„󚊊¼¾}€• ³ŁÜ‰"‹ß{æØØh͚5—^z©l¶€9°iĖę <ńäæn¹å•Ńgžyʛ–А/a1B¼šĄ#|šĮ¾²°sŁźl{Śōc¦äęę–Cp[ɾ—ż8uƌHc“ŖŖ«×­›9s¦ÅéŒśBąH @8(;tčā³ĻcåĮ³Ļ>{ƶĶO>ł¤_sÅU„H$ŅŠPŸ‘ž‘9øšĆļ¾$@–āR“ųļ 8ē0ˆ2½%"iŪśõė6¬IKK›:}JJvöŗļ~~ćõ·wģÜ}°¦l\Īp„Šo[ņūōé7 hń·ßĮ (R¼/‡ŸŸÕj•$‰Č²±ĪhŖ*Ė2¢ā$©·K9ƒJ©ÉnVUÕć°Ye{¦Ći‰4šųćæėßĻĒ€HłžżU»ö>pē=±HKMM µćV,ļ?j$Ł  ÷J!8ĀøUÓg!$™]Š4ĶŠÓ¢ pÉuŚŌŌtšąĮžżū{SSćü<ēc.8B˜ N·1œ€ƌ‰Ø3Įŗ(9p²A­yŃi•OŒČvŲ„»‚øšŖ*ÉQ£ÉšĘ.GŽ»D¤č0ešŸ­x»Ä ŻM;%fė`°”¼ė $ī\Ož%*Y8\ög·»9o×thķ­[“µØ½Ōčö>/·]é« @ŽÅT“É„paӁS(e²ŃpLzZ8‹ėŚ5Sސuļį8ŪIŠČ_ ‰{Į &ż÷‘ūõĄcżŗŻ €ˆ’æā‘6Žž’[hüŒĮwn$'>µŽ čPv. ,N1Ā?~ŗųöŪo/ÆØˆ £0ź.šü(äø‡ ė%<ėNmŅ$>"ŁCĖķ°ćĶ]l6›{˜3i>ÄQ,³X̬/ŗ³ŽčAaŽK–¾K$dŖrŽ wŚ;4ŗ(„ŃhŌa4¤»†õrÉ會~Ó «¢ŃØÅb1Ąjņ¢Ą¹AĖ!ƒiiæåc‚‰øš€…@æżšŻ©sēåęęŖ(’ü‹ĻO<ķ¤ķdQĻŌŗńvĒ«ŸH$bzZ ’RÅKw%—!¢Ž‹ĘwmŪb·Ū=Õj G"›7ožQ™H’Ä@„”~šųsŸ~śé”C„;wģQśf'²ĮćdWi$ŽÄ »Ł ²|`÷®%ß};jņøĒ_qØä“ēųĖŖ½V‡ LÓ4UCB6lųo›6óź  ŗqü†zß4’ŠŪ7fådy¼gŽpŻęB!@Y4Ö4­””!3;ĖīrLµÄgSŪžöeŸ|vŻåW QJϽōŅWŽymjī°c=vяßüŗq5ĖK5-‰Śl6d’Ū˜4ŃJ`hƒ[L˜$IČĒŽ-;¦?3=;«“¶Ŗ¼¾ÜVH“„ŸF$$5iQ s‚ ',DĮNAĄ·oŲČÕčŽ;¶nŻŖiŚ?nŗ©ØØ™­¾żöM7݉DsL]×K!&¬żž§ Ó§ƒ‚ސBPuCŠb±¼ūī[ƆŖ©Æ:åŌ¹²YB8e$ˆ˲1ĘF’ŚÓ÷ß’ęæ’-q‡ļxųļ»O €Q’Œ3¹õÖ5SėĻpcU×u]"$)j!®ˆ”ŒŹDjūLĄˆaŃā³ķ+łcĶŗ·Ž~333³_q’@ šņėÆ7GBžœtιH–­ŒR"™„Ą†Ņ ćTT;mj›r‡ėŗ.ć¶U @sƶĒŁT!„Ń0ų0IÄ=+ئaEfŒÉ2~ę”Gša·ĆˆF)ewß}×ģŁ³ÆžŪå‘@ ֙ŁlĪļŪ7+/ēš›o8j•°$IĢxÓćļ5IHĘā‡Ż¾¢ęÜøŻĄM F%bQJ9ēX"!ŽĘķ6’RŚ¢Ä÷ą$ȚLĻönę¶]?%łlušęeŒ‚ŪżUūÖv¼˜4čŃnšøHÜ ż)}_ÆÅ¢Ę k²T*ńĶd±Ś¬NGJ Ā eT"JŒ5`˜€ų„jŠ“łi$Iņ€R*%FN8Gėš&£^ĘÄtĄŲx6ā—ƒmMPU•cD‘1BS§Lްj]®ÓC£ŖÓnkö53`ć&MÜ_^ZV_ūüžsÕU×p"#‘Ör¹c™”„Én”‰÷]£ŗ"+ØĶÆX±FĒPh*’¤ų*”i˜!Ė\ń’„ń ÜqƒęTčŽŹ†*i_GmÖÓØ ƒ(·™z¶ ¬ė|Ņŗ—$ŗĘ=Śe!¤é”®HŌ6]jōŗtłJP ķ.)‡¶Iit4£‹ŠćŚ‘²ÄŻAān ŻĪ÷Jż§išÉdś“GŽ9ÅxŒ[­ęŗhŅu¼Ā¼ėG—3/—: \žt!ēZ6’/ ń’E’G ‰Syš'f€»<“ĪÆD÷ ÜķAī ‡óÄīÄ !a$ā„a«‚]qŃş}öYH׀r‘ u $‡“£ä‚'Oh°{O½öüt Š:ƀ%ŌĮ~ł/|š;_ä{j—’°Ż\. ­cŪqĻCŌńŠ%~ļ5×A•Żń:ōxŃ:홝ī±ūՕ :Q@bQÕdēü™6˜čd0"āŗHöCķ»EɲX#ˆÕQˆĮuM’n¶Ųl¶Łsē¼ņĮū ¦k²dEØ·ø”N)%D6¤Dż• ¼žwß®U¼ćV!皾s˶Ŗ²ņ±cdžĆįFæoĈĬR0cL"J²D¼‡ƒgĄ9pY“v†IAt$0Ā(p~ŪåW.[¶ģņ«®¼žŽ{˜"…r—²/ĪiRėŠĒ¢Q¢(0b¬Sœ$Ćq¹ ‰æ,»×Æ]šŚ[ļšĪ’å_>óĀó×]{Óäé3ÄdŃ)%„`,%æ mOE’€€'‘]Ż–8Ą„Tē Ž[¦Én® āŸßZbźLc ā~¾õʛ&Ož8gΜ“‚üŒ¾¹ĪT/1)0ćL ƒZ€_xyтöķŪ7wīÜg?|—k„Ą»ēę[ī¹ēb•M&Ss}ŻęĶ›ūõļŸ™Ū9-&³9l±Ųl†®Īą6?|÷½”C‡Z­Ö~ƒQ„$bŠ;S:Y4UVGĀĮß~ū­Ø_ß1cĘȲ£%üöūļĪ<óLŁī€D{ėmbŒ"3Ę"B“ś§Œ¢Cµ§vŚĘ’-QmØŁM)Ķ*Č2qģ}Ļ>aw»ćļ/±~É辶Ŗ²I‰£ØÖc|źÉ'ī½ė¾y}¶ļŚ….„ĄAH~Ÿœ€/0jŲš«.½ā¤3Ī^ćŒ`Ā9ĘøĄČ®sb”­üuYŸwaæ~`2ĪżŒz<™ĘW¤ pZĶ<żü%×\ՎaJˆĪ…,ĒŲ¢čš¦ś[BĶ¬]»~Ú ꟛ[Š×ęńG ‘ĢŒ „WuŒ1–$ąd%Ī¢c@ 9oĘ ĶĶ́æßļßŪÜKÜy>¾TRcŒ!„įČöGcė3t4”ķ_ē$#"Ŗ1Ią’>óLŸĢŌū’yĻžó|ŃŁóę01RdŃz øM ‡‡:‚1Ó)i•G”Ž„t\ē[{(Ž~ŠTURd£ ]×1ʈą„āu­TB ų+/¼pć­·a…˜Ū'żķ·ßž:s š“Ģ5 ›`Ģą"O2“orIóx𦦼÷:ųr»Ŗ/‰GI:#$Pہa ׼܋Śé~{cĖ*ŚN#ž¤“J(mÓu,$@ˆNźČńĀ¢{ūčdQüO qļՅ@ՙ1R~ų·Y÷–ūéŁ0¼{d²ų®ƒ'ŃńLmä„FVE—ÅO· yŃŪsI“TžĢA …čĮüŖĀūŸ~ž‘rxŁ,qē‚ņOŖ:@ā.?ķH…ÆGͦvāœBaCRÕ.\ł·Kß’}ݐYR†0īPrŠ?Ó2čådş±Āė ‰’Ā·KHÜK¢µc—„·e“3¦F?'ń{¢¦?ŗ[ŠD‡Ń¹)ž×@bč˜C(„0Šć)„ĘYōžn×}”4Œ ńĮ”®z„ÉUK»Ģ@­¹‹gF `ž…,[¶¬¤¬Ė2#H€€̳QĻĄį<ć“­ųkwRüŃĢģ2R»ó¶æ€²[·­\¹ņĀ /”eŁl³"B£D’€÷‘$’«$±uœdJ|(ā(<²„ bńĆF˜#Ę .CĪ ‘¤Į^·V‚%Hmƒw$ŒR*K„ N Ōź H“Aģܶ„©¾fÜųįc“Å Ų ‚²Ę\=Ó)!$nHÓZĮcß[DOŽ÷‚QJ‰$éŗnLKB ßžd{Ņ6×7!cŽ„×6œ~üI›vm½äĀKž{åæT’Å̘ĄĒ ~āĶĘ9_’ć² N>=#%RśGEéžmŪrņóTUݽmĒŲ±c«źji©’$õ4iWlb PĀŲĒ(tŒ?‰vcB–g€ ƒ²mŪÖÆ_ś9§oŲ°aš &“iß”’ōĢ>įX“Øcö¾UԊøąµŽćS„pM ‚ ;!®²u‹æ~ųį‡6”7śš&¶cĻŽōÅwģ0˜pF0ÄÓYć»L|yD8-¦5$ņF;dćŗõ¹y™6›mōøń/¼šB^FÖą”CAVpHØ ŒC2$ŹČšBĆąt-•I’¤©¬Ŗ””ØØŲĄ©vēŚµk‹ś€Ö§]`€‘€ųõ€Pč™'Ÿ“;ķsęĢinnĪĪĪv¦ŲĢn§`DĀX2Źbš¤X4j6:`“pŻī'ŽŸH)ķSßił£äˆöÉ‚G8¹mŌ¾æ±; •ŪŚ WcŌÕ. Ą` Œ !ÄĄĀĀ`sĆŚu«222lnĒ€±ĪAHFĀT»h(ČڊÖ~¤‘ uą’…NÉŹ&!D4µŁlµF~£¤¤Żø—6ć”cȀ3¦K’Ä|”§Ÿ~zÓ¶Mū¢K/9öŲc[ᓤėŗ$I†¦ŌnuicŃ~}ĆĖ³ä~wņ¢tć-Hš]ń”žÖ,F¹ĀHK2xŁĪĄµŪöæųš ()£øCėRFÕY¢NˆuTA· ­$‰Ä[ŲØėø¦Žƒ»’KįōQ~”HŹ,DŁ÷µŠ°;Nā/”gąpśĶ?ü“Ø6ŪYó €ŚDųøÓĮź²uŅńJ€|4vʉٰ„oū@tq<’ĒģėĒV §u–Ø|qtSīGÉõ×ōŅIØ÷M .‘sg¶Ŗ;5r'Ķ0‡ÖlRńŒM.ø®jf“ł‹>:’¢ uIĀĮ–³Łœp¹ģŠv:ź{ŠQ{Æ×Ķ­‹1Öõ`¶h{ż2Ż#j«t÷Ąupśķ&»ūŠnćä^kņōźöā$zGŗ…ō ļŁ¼·@RĒ:~¾Ä6=_–ž_“ÖZ q.0 Ä˜J¼§m_“O¶Šx¬˜‹c„©QÓjL„ f·R|čŌŲ椒žė!qņQõ zoū1ćqŅućɲÜA>ĒĆ(5ćŗ9ž8䦂s8izqĢAJ„JU“W—Hā’x«Ā·¦^n^F‰Ł$ƒæm˜!Ƨ@S8ÕuD‘e›`X xö'„T’”Sū°8cÖĆJē>‹to*µ ŽP+*0‹£SĮĖ:ß¹rķ?oŗ­¼¼üŪĄcV…†ž€£ÖœRĪ5#<,+ē¬Łó***ęuzyuÕģSNīÓ7Č2!dŁ/˧̘nw{ A[±xžj[__§ńŪj¼œ "=­AS€Ę=%6lų}ĶļsēĪ=fśäśŗŗźŚšH$2aʱD’ĒĆ»OŽhåł÷(Ž< ʗ~óuzzś-wÜŗfĆ3€0nŠČH$ņüGoœ0ƒĘ™Eq·)ą>-±’א3‚ †ZÕ4Ķl¶“½Ś€1®ČŒ„g’ń a.„0ž6]×dĄŗ¦†æ’$!‰éˆfŌäŁ@!0/ۘ ćĮĮĮ©ĖĻR6©ĆƒÓč^†›Žr§ „@ ĒQõŻ”÷wU_©@N;:>€ŠZ[‘¢ÖZD¤ścČ?ŪĘ­×J)hĄō@ždqDė—+_O¶‰.iäŃZėÅr9¬×¶÷2½Kܵņ€~/ ĒačjzjJE@Œq}ÓI Ķ×bqz:Jįhš‚/ĪÓ8-žĆŌāŌ¶ĮŽÕŌlœDĀÉ5”ΰå˜ĆŠż^!!ńĢÓ D†°+½VV/U@u¼ėä”PČp.Ś¢²ńÉÆTS$k64YX •·_?±źm!$ŽčUž3‘nŹŹ2½SEŌzµ²ė«ƒ“–· ÆS„‚}Ł$uź?ņĄy ™K­ų–ä`šxl•€H‰—ęvM µš¹Ä”bB@Mč]9d‘F ź wøo‹¾Ž DļöO½ß¤,fĮƒŒĄĢŻŚĀG "yīčŠGłōĄÜ-H¶ņf6Ä"C ĢØ"YÆ'®9 Ō „¤GĆ Ö„6,<cŒQˆ˜É'•`Ō ”yė7ĮżåŽž–Gć£ĀnźņŃ×ļļŸV€˜e¶ x"u…lc 0Ō>’ß}łčåéSoxļ»ūÓg§xA;uō‰2‘ŁY]_Įc@Bdé#ėyX Yg¢Ńh)–Z;檚€†iŃĮJA‡†‰2؁Ąh €€¶XuV~ ‰4Ī!–R~ŽF£†aÉlw>ŠÖ1uņ޳Oń%Į”DūH¤…ĢZk£øu·PŒ0Šś1ŗN ˜U×ulLæX„ō~fŌĆ0,öö“6]G¾ę`5®¬\„ŌØ!"ÕwĄŃ Į/åé–5‘b.øģžŖ1Ź%ŌYFŠņYĄ€ds>ėśĢ.\AĪbį>šAoY‡ £ĆEŃÉ÷n†±ĮG?Ē>LDĮŚK@²TūōæfzV’³cNŚz­Ó"”Ģ’°ö¶2Š“!qš„ĖĆ£żåo V†‘pø~ŲŹŲŁ_ØŻSčżl 0—Ś;)7‘‘9ŹŌ¼ń€žąD5„&ˆüįįa#jŻ6U³•/+-+łųQ×uķĄ/|¶$^•›ŃZ³;1Ę(C¤IŠ‘Œ0"ƒ2€†a5¼įĶo1čž @³¹żöŪ_÷ŗ×ö}/<–‰Ū]«é%ošęFZ†ŠA¾ķĻL®(ĪłF&¶ć);ÅYs½Oųæ™Y†ź‚Ņµģƒ²ņʹ_*aČd‰j}Hf+* †y¹œøFüUl›_0ž ^tZ‚ķ9į«ÖZŅł³ø|¼’°*TÉ%dž\ߎ6!¢"T–Ģ9ż ļÉØG÷Ł“±$_!«äڼæąr XJ%µģĘtī>Q Čß@čוó>:€ĆŪĪ·mĶD`Į–‰ę…%VæZ¼ÄńM³O<'i(¬7(Ł"%H«ÄĘö÷ö¼bVn”$‚ŌrD0daēī—–Å•2Ø +׌£Ń’µEvąyd`0#ƒ×#Łłł-ŁRŃøÓŁKŠzœ¬„Ļ'Ésšn\”ŃĘŁwīŠ,Œ8ź"ńC²”aåŠˆ‹ÅBkB¼óĪ»@k¶æ!Ր³lŽŌ”ź '5‚īūĄk’ģļ’ösōׯ-Pk—@A‘ˆz4^ż¾ęī[žņÖ¹[<ńC?|oyśó>ļ¹§ÆøŠ–ū€żbļŒÜ¶XÕļI6ÉS*`d# Ąj‚¼ó5ozŁÆ¼ä'_ōß5ųčėĪŻsŸ\õł€Ļż¼ĻæęÜ»ģ2D—į6(B#‚&42ņ ¦×’ŸW?ć£>öēéē©§Ÿü©ŸłŻ—’žē~éó_š5_wąŗū>č¶‹^}Ó;æķk¾ 2 4°A0(K@žŲr!Ūʊ(`d0LttėÕ ]£ö!E3XāPhķ¤\“™I1)€Ī°"c”ƒ0ĀЈ ‚s0lˆU ŒźĄ£Ó§O?ö1_.Ī‹ŻÖ·wŽcŠw}m€‰5 šAóµ÷½ļå{—ß|Ó-{ų#?ž“’eČqÖ±RLHĖCųż+y:Ff`- ‹»EŸH6hy±·“†1ō™˜’_°ŲŸŗü‚ Éz€N”1$¼¬pЇk YnP£œk¶wBƒßžń9Š-ŗ~\k02Ńą-°-»;¬Ć Ósm uD½‚®‡…źÜćRi£¹H?£^$Ɵ,A £"1‰¤Ōro:%b‰āĄ­FT”“Åy›ų<¶O[Žo—BgEŃżŽžlķgĢ36ÖĮĮ` cä ł;¢T‹Hś‰ĘAOŠĒ.ób5ÜŃ)§NÉąĶlœ­sg6 EI¾# ŠXū,€JLžūäŠ ĒVܒ°Ē;\ŪI‘0ńøHRč’ų©‘ģ›÷|Łt5¶Ń eŽŃƟŌ5°0č ’)ŽV;t)ŹźŌF¬čŒm¾¾<µatĖ/yļǰŃFO΃čv(0SFž\8`YZē/ž·]iž”T€ €XĪPéG+>`>qįżįŒįÜjšütĆÆl~ål3ÄOĪBŠā— 8Šž¹Z Zs±2§|R{Ņ){źƒK‡Ņnė—.‘!ūŠÆ-cCt…V²Ŗń€ƒŃ÷½öž Ų/z½^óÅóoøįO\éEwŪšFŖ¦Ń…a™4RµŽéB°B=Ńąż&ɣȷäåīš~¬KķYt®/'Ć ‘ņŁ€Ōäø©¬Z#JrĆįé²!µ\ßäµ=/ßåX²$ęä\e.ä(šu`øEdįd;÷¹Cļ8d!µ4p­…~#ŠdžĖ«}ų呸ķs"Øśbŗ…’’å6Ę„Č ”ńČ˜FÕ iøÓģ;ĄūE7ue+­ź,s øęåÕtćV7AŃ/}ŽĖź:Z­†å²OŸO0ŠĮ?¢Ńģ¼«Æŗ (Āq­ [ؚA$ĶķBńāSģkbEHĘ|ŌĒ~ģżÆøāQ׹;ßöv@Ą^ z•-ӉŖ†^żĻżŲ_żŻk{fųŲ§~<^} ė³gƲ}§„Ti‘¹0"Y¼Ģ8¼’½7=ꉏ~āćė­·>öqžÜē}ž™«®‚^#t`u® å 5Z+„ !i=’źĪßuėO¼šĒO/ă®¾ö¾{äu—]{5thžŪłĮ¾ėžīÖFśæ~Ļzī×}%X`>‹Ö6,č~9Āb±`œŒ¹`†Ż;Ń/ĢŚóW6ĘŃ»nVlłĪS-(„”AemÆė>Ŗ:īXBD# EŽWYzĖĒq|ÕK_~ńö»Æ¾ņŖ³—_žž÷ß H­ ®§ ä•JŠ3ņusR|N ”¦čŗŌĄJŲÅLīÅ%‘ĆpśĮDZ©l@ČØT7Męjµ^ī-€©R )©Œ_š`ŽQ™¦Œ1Z³ÖzooŃī•…įīžAcGßū³½dc“ÖŖļ½Žm×u!É„ża#Utč¾h© ŚŽŠŖ%ÅŪØrĢĮķ5Ņ’NYH0Pv‚Õ«ŃtEēĀÄųĘ^ož1Z;k”K£ģ™“£Oą^·ļ6œ­ˆĄœ8‡X”–tłŽ™£ŗņq&źpŪų¢z¾Gę$ļǿӃL“"a“¶¾Ś'­‹G»a Oм¤l^ŽV'^|ß÷Nœs~ܝ_†Žį ŠāÜĪåߙĮząŸä•óŲÉŖe*%ē`„Ÿ8$óāŌ©'>ń‰°ZÆ$ēwöģŁ>š“C%kŅ(smL†®ÉÉZ‹‡ąšā”ŁĀć“ĶŽkķ2ą’ž€¬ ”ō¾Ņ›¤ōЙ˙•XŁŲ4L€»œ*u–ļüĻŌp—©od.æØŠ£‘§÷Ŗ]Š*:õ}߈ߏÉBąAŽü…ß¾óĆn›Õ†RóBĶ¢%  ?M"x{"säŖżG”VÜĪĻ ęŠčtł ÅcTˆ‡å’–*+ŒĘP‡FŹŠS}åŸÓā'ūĒśŁģTÕ°1ƒĄĢŚŲ­Ä¾‘P²Ś–‹žāł±’×ćT—ć:_P„s÷œ7“ė•g¬É׌€ĢŽÖbo„ņ]ķ› GĆ ˆ?ż“?uėĶ·¼ćmo‡aŌ«€FCD.\š ž7’īK¾åŪ¾uĮpeæųٟū°:‚S{G‡ćčŚvƒ"‰¼üŽZg²hŠŲį‹õŗ_}Ł“žüao~ļ;~ćå/;sõ•°č :Qķ„ŒĀ!,Ét“-æż;æ~Łåūă?ó³>ķxX§ąąą+_šåz4 ī9w×|éÆ×k©Ÿ£`š„f[ø1ģ(„ {Bw«ķEˆĀCŽ ˜l”šżl¢4ŲdPD=agk¬\+“+ś8G¢SIļēļb±ųą'>”ļūՅ#įYĻzV@d°cčŲVD#üšUÖü$ņBzŽ”L|£¢±ņƒÓ¶·‰Wšø§Ų¤Ø–Ė%9I[łMß÷AäĘAl½ŪĻĻ0Ž£_Téż`Ą4’/"ź{UŌ;LŚ5żĶūKkө޵QHRBõhĻe)œ n^QnČbR{ŲźČ)zSѵfģp2Y6gX’fަ¬ˆkstņ Č qCŌö”ÉGßd³ū±•Öc·)ĮÕ3ŸU™Ä„’ŌC„ą1wÅ»ā‰PrnÜ®vīą‡Ģm ^­Ä n1M!eĻĢPȋ$7œĄ¤xž»‘µx;qGóhB_nšF3ؘ¾|¢ćZēŃGā߆wāķĶÉVm)ÜFFłe Œš?ĮxŲ°æÉ éŚ2™Ćęžį@‘b`ćø:|/n¢‹ŪŸc˜lļœl­öŚßß÷³œ¬lĄƒŽ½ŻgFójµ*¦—’ōĒńzb€<ā`ŽÅÜ-ŪRŪ¢ŪžR^=gźX›·’kęķ…é0Y³tš™u]g1Ļ›†G²a ÷ØŻąŻ˜š6Eäq¢zŸō™“ŗ.źZĮ$Ÿ P Š õ™D/L¬' Łüx͵0’jm~vĆąV‡ėdÓqba,ÕC k–Œ-ĄŅ2Ŗł;&Ģlāķ™eś<(£įÉ HćŅ4€Ģ¾VųĻüīȇĀ.üĖŅśLE7(­ķŚC×§?MŲ5Ęį’ Lā¦S"Æ×ģzńäB)‰pDŖč=vśŌįĪīŹVh¬v„™Ÿtč»ŪäĄŚŅOĪejEĄYĪķń †pé^ŪĆsĀųFµ¶†²¬]!ģ•D…øF)RsŠC—“Å!q~āįM‰ĄÉi‰¾+—xmÄ9Å÷0Ć”8\4_ĘŹ»ÜLx<1oē'́ Īaō,žVä^ÉEBK(£-ÖÆ\%ö“Ræ“Z…`+Hm1Kuāuµ9īŠ±Iånõ;][Õž’QŠŅå4ˆć” #ƒĶüEūAr®²|śvö3gN}‘hM~öDH—āE~9Ÿa§f€m«Ź—Bī1]Ć›ßņ–_’õ_‡P§h±čŹ×„8łšD#"é隀²FZ …vˆ˜©SK„NŃ2œ,ö-ÖLl]b"Ų†~SŻžZģkP8h` ŹŅ7ƃņ°Žś³żŽ_’韟»ó.!vS†Įӿ϶oNFÕXµ„ę¼\>‡«ÅfCĢdsdT§z‚Æ×yµ­‰½‘€ķż„·”µ¶šWOiųĒńgźŹSļ]ßówæļcŸńtč ™YĀ`Y¦¶JŒĘŃäy½¢ÓyĘþż54ѵŠÅ ŲxźšÅ^’7\œĀĀĀŅ5™©Óu’ēaHVN~čøņ)Ldć榜ņ«[yų "IŚHŌ•ƒžgxCć†ÖI*!k@ÅZp>}o_J+ ŗīÆøµŹ±­p™ē”$»¢M.°ļ.÷jʅn N1&µz˜"h¹ÓÄJn*äęģSƒ“¼ŠŲp«ģrrIÖĶ%ŃŁ±cJż$UaO4ИO¾U(ćøÓyž]Keķ¤UDšUZQĘČ”Ģ! -Ų$Ż Ģ¬õXsN7Ó©'ā8šéÓ'iīdÄę4ĀĢ Hŗ&<ĒÆµüÓ2éyf6ž…WŁmȶĶ'uē]Q,Ņ&U)­]G®å ÕwžŃ„Hą3{§Vl+ Ębe`I4…Žü9Łz[wU]·PŖsŹ+„”-«ań„ “Šķ8¤™ćƛˆ¦©CՓ°·åÕžF1äccā*tżCߢŻ>±[č;?ŻøÕ†Lh¶%sϵ™)É¢vÜō ĢqīČ2nX żk®†k{°‰¤z©æxeAL\¢YRÜNbūpG”MdŌ:ęŽ8‚”pkÕĒ“™…ÖÖ4+Bdķł<Å5qˆABPˆäŻkłCĆ0FzĀYmD:„­ „3ćfŌžÅ‘Pu8Č/”ĀŠGŁŖ®£££µĘRÆö”¼–Į•0,a±k`“ņšIcŒ5(5ńčŖ'}ōG\qæ«nxģ ?łc?žĒæökŻjœN=€¤`äū\qå!čńuś@Šl‘ Ą Zž=ÜPדæ$#üĘĘf…Øfę®`˜uČR– { J»%”ĶSöÕ@Jõ¬:P h’c…üĮŗEÆļXŻxīī7Żų. &¤N£ŗ°^· Dž’ ā€u Ļ£-6f0ėÉh{EGĘĆčŗ=ĪÅ$ˆ źI)Z‡žkõ0*RąŚļ™łž{īQæņÆžāĢ™3K¤‡ÜļžŸõģĻ€ÕF#³2  (Žhj6!D>‡éÅZCįrÜo|ŹĪ…ōr¹†‚$BĢ„§ĮwcIŽ*r™RuDP …ZŽžūšk¹ļrŖ•eĪ«‘ö© źŌØGTdŲ”a3qD³­ü 5qšiHT„šģź‚“70ĄŚ·tån”ńf±vdUå$'o“ém’éKęņpyW*€¦'Ąxd€&Ŗ1Y™m/¢}ä%am£Ź7µBø”™ͦ”zŪŒķ “”wĘĮ³ÅŗķkmÅ-¼U2{ūf6k÷æÉsh…Šž³÷[ÄˆSüÅė“ćŅ³||ųt£Ø )ÕąÉńĪE—ŗ³¦ŹŅ¦ ’Ž*äĪBsmæ‹ĀĆ2Y©b MŌ‰q0Ę<ģaÓFĄÅ£‹wÜq‡‚’¶%_ˆh,‚„¦Ē÷Ś$‚1¬µ‘šLā@ƒƒYJĢ£gé€Ņ3ʱ8ģr(žĒµrqä<1'”ĪC°ķ¤7Z;KH×Lźy'·mžµw”0!g8É\äYŒKŪ“•@ųĘSGPD$“ä—(ß|2ĖoāŌ!‰D‰¤sŽyE˜ ž (å~ÉqÕ7ńź‚ ­töv]‡‘hgT°“xņččČhi±üC”M»Öšū^±0óyQ¬%1ʰ·Xtd%Ó@bx­?#ĘqŌŚ€…‰"i­U@e?Ž#‚@_Äāuź ’Ż—¾÷¦›xæē;¾ėŗū?ŽO£:2¶‡äG~dÜŚ»üņĖĮ‰€AKƒF8¾>žĄ1«* b™5IXėö—‘Ō"{į%_AaU9$¾2£¶a² ĘIɤ˜{†Ž Ć=į ąõą’ų&Š£ØmĮžbÆm Ä®F>qT·G/Šź%•„9§Ąjµjhfµ`q:MDš]Ō±K'Šj5JŹfB(øE""Ų—_~öāĮłzōć‡s”Rļ½åęĖ®¼ – YhrōrY˜¶RĖĖ[™Žœ'²˜ēõž·Ų •ˆ0K@X1“Š"”RJõ}gÅEM_±„”v6q ę/ņ–féo7”ėŗšÄŲ ę¬X ų+UŃĆßDąó˜”Ō<ÄĢL!kq˜ ©„gŁmf@Ē×ėuÄü䕖hSķ4’ ‰Ė q×1tšŖ¹\wČn1žØŻ²`xcŗøŪøžCB“–¬ęN»iśœĪdõtóĢžé62”§8?.Ų¹j½ó]E•į cfoķLՏ¤œę!ń¹Ė’ęi‘pyläJŲ*Mp©G¾=æaŽĘ5}ß!‚gæ›3Ī[„Ä^–MŽĀnŃ[…Ć@2j h²Žm;ÜČv«æ†~!¢Pόګ±y €Å¢³ID1³Ś 6wŸCpķ}ļ÷€kÆ­‡IöE’»ać{)¹Čį¹C]Gˆ ą:Ļ 1<ĆtTD^ŌW™Xdiä³¢ˆČVęԟX°6M…T@湩’üb$sgż"ŌnąsIŃzof‡„j>łśRĘ„1_š–Æ ĶŁó “Ób±(ĖĻŪ‘ĶtŪ¹ēuSIŠTÉ$ēŲĮät/ØR»’‚%%ic£¹Ś±ˆ¬†cK'™ŌÖ¤33‚–rJn]Į,õĘd=Ž’ČօHįōÄ®M•æšm`ĒĮ5w3xŅT$̳4€ˆH§WĪdÕŃžžŠ Š/ūn”ŗE? £ q\ΰ6 z%ÖD>NŠūh Ńŋ®GĖ収V}ƔB£µÖø˜Įhķ×CÆJóxĻÅCäŒ+MŲĆxåƒī’«æ÷»~ŠÖļ¼x;^üŚO’,ŒķŅRĄčOžäO¾ņŌžppńÖ»o…h“ØYõŠ'ż9ņå„”gœ Ū^Üōt‰L+śe§ĖŻtDŌŗĶč@›ŒĪϐ ›]īõ*ßv’‚æä‹æ” ; š²?ü}PDdzԊӚŪƾ2ö«Å7¦zĘ鹇ų! R °vUR3¹sIĶ?Ūn6c‡h?%ń°Ī£ū.æÕŒŃėõŹßn×užtŚ«ŠWĄ/& ”nēŠó ˆpśō)+¤lŪš`oo)u]"źDpĀW]˜”µ†žŌ©e7ņ,×6°īŌ˜śżSĻś¼ē¬öŌ~ ąæįėō=ē,b‰@“yĆė^ūõßų §Ļ\vhøŪ;`$'ŪiT„Dƒł&šcRj爠?6fōóĖśLŸ3ļķµĘĄz=0Ą³?ó3\Q‘©Sā„üŸ=˜"l57Ńņķėõ»N°¹‰ĶLHG³‹RÜk«ŅĪ=õ\ČiĪyķĄ¾skCŃ—]¶x UšĀśŃ”BG³< qŁsƀRģXˆŗņx‘W°=·'µĻ‚ƒ.1H&ņ'm¢}ß ĀĀÕQĮĖb±rÖQI}ņjF#”W‘ÜŽWõCƒµł( ōµM—P„H.£|MūģŁ³IŖ“ķļęGCį˜šp%ßŪ6¹=ĘM˜oóoō)Ŗ¼ģ³ū+™;"":8^# öĖE$M¶O›M<ŖMścŒØ{Xˆ{ Ž_ä3óy+(6!zY”)ć8:@¾©į]ķ—"„©ŠÜjłe&³fÆ1EŻ@©d’ī-Ŗy{[ć%™ė•Üų2„Bģ¶Öė”ķœnŒēÓMĻ©'õ|OµpxxčæBxpk¼¼IÄ»{łĢöą“čÕ\Óbc¼…āf:s]€8k[óĪĆ„ĖĢéī ‹Nm†±ł±k£Č#Į˜ļwŻ„-›!Ź$ł?>½É÷KŒÖ¾]ūžĀĻ+ÕɁxžüł9B˜GŲyj¼3ž”Å=` ?¤@ÄFäĆŌą¶ŗ¾”NcĻŅ(1ģӐq M k ¬Ż ‚ꆒ£§99åį¶Ń ż€œÜõD$Ė‹ßŪęH(~JŠGGGĒD"åu®š¶Į%` ”ļ„ä|@~­HžĒ³ u*P„¬a}4L ā`  Å"±±BŸS¦śdf6"®ĄĘ°¶„č?·T ”ø™¾K)µX,ŒÖ>¬å˜q-S³ĘŃё4vŠį™Ų‰Öšü¶óĒaH@¾T¾L)åY10ŒHŠDo¶'čĮ)`¦OyĪs~öq‰żą}wŻyźšĖŸšˆGņķēšĪsӝ_że_a}ēķwŽsĖķ_ńµ_ ŌĮH -Ż0ō:~f¶ĘSɍ4æ üBõ¶T©Q€ÖĆ}Éæü÷_žüÆųŹ ™UWši²Lnd=)%Ø{Ķp“˜aä&Żóŗr“9b „\#7!ÖO³`¶62°"QżŸ¾÷ūG`@b€[n¹„†ó"ĄE×/˜~‹Ę>•ķE"ˆā‡Ø*0#Œ£6SĀfĀÖzL|u')œ±¾: ŖźČžń“} hĶĆ •źÄw`Ÿ~ćøCŪę2/ §Ėj™+¶5A-¼^œ$éņRl“|EB¦8Hóe]vI˜"R×ķ:å±īēĪ+0¼ŸPIJaTė¤ež®O)Ė&`ÉĘBŁ…ŠU9hĀö‡ōCŅ£.÷Ö©N!±6–įĻnÕ`wŗ‚0 ˜ŗWć)9Ååž0V;°&=O÷øŒOč& ,߉¹¶ČFćĢ®ˆASò­Če»’å3Qr2Ź?—Ė>afžéžmÕ9œT‰ƒŃā¢ōŒÆ|ŹŖPJķķķÕšÕµ”åœŚ@Ņ–œ;‡5šÖ»zęy4‘¼Į&˶Ąœ”vf#=ģ ˜}xLø”9ŲF¦µĮ׎¶QĒh¦¤*–ņ²µ’mYe'Öf½^/ $ŗžįē»Ž)掎°ė kĆ3 Åِˆj€i­Å`åłˆ`ˆ“f„0¤m®H¦~c>©VšhTŽG ށɼž0ĮŌn»™aj€ĢwūźD&$Ģļś9šfŠƒS-ģ/G“́Ơąe%t!l˜æF¾&|æ_3>-z£Ū>l›,gņ(n‡ˆ…l;ȵ…]%aŖ%#ŒkœĖXßW«•ožś„„[•AšėõzļĢ~˜NJND;¢Ęq“¬Q % †a¹\ˆ×. [ć YuÜ+†ėpZQPįq¶±1œŃx!āƒ‹‡§Nļ{N/ažSŠ'“HŖŗöNRʾ™auĒ J¢FBf0„ “­A1 ŽśīŸųÄ'¾’®{ąJŚū¼õ™Æ}õ_ßųžOķŸ:{öģߎś®/śā/~įOüd?Y‹Ņr}ц é|¢“ŌćlŽB• ķ{.§Ģ“ Ł‘pX#og%sź+„µēGĶ/@%ZŠēQ“Ž1,R«aįÓķī“0mB”Ą:OYją®!SIS5›+śÅ>`§ŗszż—żźG}č“›{jj^Ii2{z4Ŗ³k’”rø†”ģCž}½ś¾·ųyHoPpWš•<6°¶kۋא0£a ś”);&oĮĒq¹ģ„ÉQö¾Žō#Ųö;Ōrī²$ü-X»ŗR³“”hFĒĢBi.ŠūÜD]»õ¤]įÜŹ„ŒžžūrŽÉƒcLį(Įa"ŌŚ(EĘ0ŖĄKŌ.üRŸ¾±Œ †ač—½Lø5;­@d“B;­‹œ ›^ ŗęP'¢›e"ž’é1 ƒSž \ްG9P&wĀÅüv…ć;™{)ł‚¬)Ś“’Ź×EµbłŁūĘ3ĖTÉżĢv V7¼ÓĻB{Ä6Āf7Ā…ņ4D Hi>ļ‰;Ļ[]°}WµE²C;qAŠQHn×B¦6}q^ƒ:®‚Yī°ł’½$I¾†õśq¼xyš‡„ŅV=/1³ķʩɅM]Oõ÷7ɀę’ģ՚9“éČÉZ¶ĶÄ$ĶK—.:…ķŪŚ“\Z-·—LJ~ˆBƒ0xѶ#!ws“Š4]š‡3 X|¬k8l åg0'¢<)^™d‚õ 4[™¦­tżE¢‹PÕSŃ0 Įr¹D1z~/źKŠØW¢tj9l²ĆĻ›$apµ<"$BGė=…ÜĀUĖĘh×ē<åׅ6,­Jį:(2Ž…å+p­¼°¹Ń,ĄBłŪŗ ”BՑmŲCéÕ£™H¬Gc¤˜Ļ]Æ`Ń(`Ö42 ŗCfgVŠUǤīūЇ¼ēöŪæį뾦xăü‹æłĖžž7ßD«·¬ļśė[ßõٟņi/|įOä5š5špM8"/Ų,ŒŽ˜>/īåŠŹå uæ£ę½qpŒDÓł*ł‡ ģŒ ¤Ń„QūŖ›Ó„ŌŠ÷'\Gz_YlƒŌR†AKė¬ )ˆü|/%3ev}s1‘r,ĀÖÄ жrˆ¢ÆżŖ?ł“ĢŠ<®õ”ĀŒ¶+ÕĄŹ‰0Y)¦Łń°ż]ĒfĄDP>Æ ¤¼b©Ė”¤®‚öĪØIĮ7¬Śx˜ŽŽÖĄDēlŒ†ø^(ĮŒ¬×.ŗŽTdmĄ  J”Bę°ÕÕĻ*ō{’Ģ Ÿsµæ9E§°œˆˆŌ*šz»<ųĪ0RG Ż@)—ŖŽćFĻeż•œ ;=ŽXĘrū›  ˜H,¹0Ų1¹xŸ¼0ķ5{ä.½o9Nö®lNVŹg'Ć®Ū×lL€¤ ąN‚ Qu„ud«Ä`Ā„R~åń°— ĄD1éќ/(:–²ķŒźqĢ6?Ųh‰*)_ŲXČ2$;h(Ģńœw )+¢-æUł9Įq䌊¶×Ęa¾?ć7‚G³Žć(ą’­Ī÷orŖęĘ”8ŚmšėЬķØ&Óķ½…®±FK¼’¬”ŚĶõ¬U†Ć‰÷9õćÄż¶įź„ži [Cå—ćK^ņ’—¼ä%ZėźSWGG‹ÅÕ†Ń MwDļ†uŚuTĢC"+c“Ė,ķ“ģŒ‘Ųųh~^’āmÜ_½ĆŹ™“v =]’ŒĆ0„äÉ5˜­²V9 ½X—ę;é³ v‹ŽCŠNŸ=“&†!Pl[LHƒźKV‡O¹"Č„Nm¦ūüˆŪqž0–EŽ(®8EMRJ”™M®HøŽ\µvµZ„Œ‚%"€xįc’oMōŽ»Æ]‡©č¬ść×¹ućO:åƒ|TŅlĢ€Ų/ĄpįĀ…¾ļ÷ö—ņOp•$Ģ@uŒ;’§„NHõ(D üąūÆ»īŗ_łÅ_ŗėŻoF6g>ć“īw~ PØąŠY!vŅšL Y_ČϚ¤Õ-l”¬Ń4ŠA–š ߉łb³µś8o‹x`€PīŲBĄ’y+0ƒŃ ’åä”\}–Ėō½M¼bR’ņˆ7}v™Łr§„²Ūō®5!ĆÆ’ÖowŠ_yjļīƒóKՃF£ˆĀK`“Ōl\؟›€Š)Ø 'ř®ė¤„«T/P‘öÉ9®|ZØŌ… ;ī¦d‹F®ƒ8`T²Ąƒo~ÓŁ±Yī-–{ o4|ØŲvå į¤dY‚9ŲG– ŖhĮųÓ”xÕńµŚ]žnE„B‚AkŁ#©Ė»1G?“·ᙪādŁw†aĒqooOž«`TĪ+Å)3› Ҥ¦£<–5Īž-DĄl0؜üiÅŅčšT ģĻ>“ŽęõŖxé”ou›M(ŚÄ‰īt†€(zq¹%Åęö]"ąLßĢ.䔋אŠÕņ“ śā0ŅgR,^ĆgOjrPbW-&€ŚŪ$Oƒ&ƼŠ`jī•W‹æ‘XŖ²5`š60gę,ęGÅć8JĪ(­‡•®¢ŲŻL˜b~Įš;;øÓÖJĄĢ@Įųé"°écÕ¾HkŻuŻq¢ƒš©W«Uß÷¾¶°±²Ś† “‡. Åk“›Oåńi“v ‰kVŲśm™—6g­ĪDķćĘb ÷ nĶ'ŗŻhŽäP’ūĢgƒ£ß~ĢHT›Ol.¼aĆq ŌķĖ6Ģ Ö¬½Ė"ī8‡HviŹ]ć8ö§ö&r ŠĻ`äÅŽl0£µéŗŌ&${ŸÆdvœ¬čŠĢV†}u‹ 0±ŽMVH§„“H¬ŠÉ(ķl’¤-){ņ­ČqĄJ¾Böy[\ĆĘGų›Ļī ¹}āwRĆ;ŽŻi Œū±›ŒRōéŸņŒß’½—/Įō¤`qĖŻē”S“u `¢.U-©”`5Å0oO–ĮĮg‘AĘ}Ł+ a%†ŸžŁÕŃŹ,ń„Ųš‰ĒØK†aģēĄ ÷²ļhąXmŃ{„ŃH¾ŪvąŠq’`ęn”¼"šč*©J«×Ģc·Ōł¶ć@ä°rtšxČÉäē¶NEX~iÉ nē‘ģįäsó† Ną+BŌĀĶĄ\Wl “Ü|ł™M6ŻVå5%¦U"®q—Ė…o‰/ā‹9nf¾ćŽ;®¹ęHŗóLŚzWšģąᆕ“‚äĶä3T暃XķXŻG£…żAÅüÕg Ö WßVč„ 'O ųŒŽ;õ°‚dš…³\¹mglp܅V¢åZo»ōŃ|cŁvcXkŻ÷JVQ^žĢ –b`ņ+é‚-{“Ķ"£z$P—Ó‚„wZśžC,ÖqŚ«-ąÅXæńóEŗÓ•Yćjµ*’߬Ü“’ʅžD+l7Ž'fž…_Hzō`„÷™Ą`(ŃŖ&k¼J‰¦Ķ³nŠ’ÜóÓ3&Ö6Ģ“,łkźĒ—Ø9ó0NÕ2}—ü=ĒįlĻń!řm“ū2H2ąaĮ?i&ńē—8‘ÉŖ©Ō,ĘĢeæŁ54Œ\ąŖ2:h8:8 „|ZēYÄlFD“ÜŪóZѲ©*l³Ėõ’÷…/,’Čj$5įL1€č@wj’½79ÆĢĘĘēƒ ÷ƒRh»³BÕz÷}h*ĢŲī=ÖS' Čhƒ`ĄŒ°pĄtڶׂTŲ‘:ußG<ų|ŲW^~Ū­7 y÷0 k&Š0 Œ“y–“d|"NS<’)ąā«hÆČĒĄŽ;$ļVbm)ŸœN,dŪĢĘ či»®Ėkå¶Ż&a sܞ˜kՂW@H¹lĘó7€ŪļŗĄģužõÉĻm%L—ጁ®X&'.‡„…ƒ£C«SÅA/@ łīT•ņ`I4Zk+ŲS\8°zW”ņ$ķ¢Ę¤DŁė2#ŽėhZ<®u3“ü±Į·Yuäa˜÷žn²JC×® ’ ėZ„~·ÉŅk·l%‰@ C½ō¢×WcŽ,¾¼uŅĘś]ÉʔŸ=\‹…goɋܲ “¶Ō.ÄŅĆ0ä­‡‡‡D0Ž&QHŹŻ$/l™l“łłĻ=®µA„Čb…øźųÕĄSDtÅWų:aŌ-ā(ąDĒ8"Ó2f¢NlŗFžN’ę¬œÖ19ŸŒ’6‰H£Ó„ó}"3=‘¤+p޾cÜwć °˜‡‹ÖĀ µ$Ā "Fiµ$³BĪ”ū*U):ĻóĖ”ąōe.'§!œÕõłJRŲ÷OŹęj‰rUM=”Żn„µŚ˜ō")™„§#KF­ļ/9ó“‘; ·śŅć×ńBĻFh~$X5 D°_1Ęķ*}-A˜T8“äSŲāŸ_3„4Č)›Ņ_ė€M«eÕjE‘ƒ—2ø,‰r ļå× īŗŚų÷ĪV•ķKTžż|łE, Ē»É]P —†`±œ›GŌĘĆÉfX©éqvāIŅ ‹(ķø–»¹óĪ̲Ė+ĒŲŠTźo¾Ā“©ĀĻqs&„„‘ˆH\sóÕlūq.䌜l:)å7ņ,Ć0,–R+YˆĮ‰ˆˆVÓgö:iT_k=¹o°˜D}³ó©\6LNŸ>åŸkXJŁĀ]UįÅĆķ{(JŸłż5޺땯uēh¶Š%ļŻƒB‹Ģš1zE‡ ĘÉ?·?涛m„ux鬮ڽ“–’Č–č-·1¾N(hc ¢B Š(ąGŒkč'æõˆ¢SŠu]×+Z*G²ƒ/‡磣õŽŽāšpµX,$ų)ÓY±— 3BC"ę8y/aūŠ/t9iėćJ=½‰÷ūFH6n}jOƒY¹2wkHžŁ6ubŽŗ2ӃJļŸĖĆā+Ž©f8:ˆh±TÕ¢¶Ų  1&ķÖźŽmŖJ© ×®6†‰+ۘč9w­cu€ŠBĪA³*aN®Ę¶l²¦-ó¼įŻHƶęb¶õ8q­4—ōt%‡k+ˆ‹pŅ!œ&†¹ŪZŻ,I&I†U\gß—÷oĻ™ ”į‰Hf1>ę¶%cTäF‡čdņĒĢĮ%hL ;¬ņ²0ü“¾¶åßOĀyI+A;}‡,¦K«Ń²u/ Zā[pz†."‰mw½£5*;ķ¹ kƒ%“kėHŖYģ ¹`TćÄ^ł#ŸŪPŠĻÉQć¦!($ˆ}M„ś¾G 3°„HQõ’œnU»X1¾³ŲuY<ųЦžDUaF&J°<\.&I€Hµ ½x·±hĶvkŲā+±*‡×·3ŽZ³źPÆÖjŃ÷żŁļżĮ8W°õ‡<鉖šHhŽęT<Ā›’m‰vˆ:ŁJF„«K(°ˆ•=Ō5Ž ¹ąż„ąhó¦Ō-[Ž»,ųd䄔 ·ø ”Š Ž{xƒĀ£[‹‚ņW’ĖŽ¤wę-˜‘Ka9ƛڲµ™ŽTh÷&Nc×B2!*å”FiįĘqŠDdŽaŲk†(¶Õ-GZīZUŖT×€1ĢĘĖeGę)öƂh%UäfčūŽĻB]+ȚŽ&X©ė®‚“B¾®Rc–©Ń/'ö”y&]µŹDņšńˆŌskč›¶s8?ع(aK‘4ōB‰łÅ×CŽČ 蔢‡WLәęp2ĄSoKŌæņīœDi–‰n:f;ŪĆ^Ō6ßĮ÷nœŃ¾"•MwÉe`Gi¶s®Ļ V6(Ūó[ĢDNRMĶĻć»5°ĶVĖĒ_ »Rća=ZĻ£ć†aƒ§-ß>ŒaSOƒėXÓĶØ³81KVMŠĢėõĄ6FE4fš£šłG“É;įt(‚rĆß°£ĆU8é¬cµĀŚ®cČŚß»łŗi6`g” Æ].—¢šģœĆ«øsóėÉĻwkm‰w¼½j“’€™ś,öŃķįd»œā‹® фN=śŻŒFą?Κ†T į2ØEžE«xāńNŚz3ϟĢOĢł 8õ·‚ł•{sŁż\Ö«oūĆ]×IštϬ¹ź8)aÕKśŗŌõŸü»DŠ×Ü˳waūx% õKkˆŽ’ÓFńÕFcßc¶Ō'Ä]EPDM©8ōՌÖĀ»Åz0uŽ“¼\Ģ5™°Ėļd_ć8®×ėS§NżS­łœiŪ+œ ėŲL ų|åįM‰ v„ŹyɝZ%6\y­TĻĮcćżé‚øŻƒä0¹(Mi¢Žžį=›5øŹObžbŚš³É‰ć”M›W̘ź_~X¼Ēl Å Ļ™ō9|TÉ?/^¼xśōio‹¦x&ϊ/i­žnÅŠŻ­a‘w†CŽWēh.P¼š6Ī~Ąd‹ŖŪĄ ģ°É0ǚTŸ<ń¤/yĮüĮÜō®wžėżÆūÅv»åƒ²{6Ś# %²€ŚūgS Īq”‡jķRįŌZS§ĀLÆ?Į£ć’”™†t›O’+”Ę_¶•żØ ø&Ź»&IōÕÜÖōعböĘZhh~Ūöæńń°=šššp¹\ęm2°‘”“Ė1–Ąū瀖Cė"}Ā’¾ß˜!cā?•»[\cÅ,s­z"b+Õ¼vč*]GŲ…ÄĪfI3_Õ}‡ˆ’’ŃWrl‡¾TāÉo$… $+ļfȆĒ`1™ĢĶe.˜*ł”˜jūXQ'RĄRX4‘­XØ–ŲŽM± ž’Ņ*J¼“ŗyR,Ł÷ęÖ«Hw7$ŽJ“f~ȱł{µ‘ZY±1!ŗėXä ŌBØ9sģ#śn.‚kżNČØ“ĀwŌf†Ä`09¹Ć‚Ž0bĖ.†ÄRßĶMYH€œ– _hĆ+¹_ Ō?ŚįŁĘM‹Ó‚ʍĶҹL굤ŒVĆTµØ:µWō˜«1¶vĮ@ĘĖąh;źd%ĶØJ)Pö” Œ£›į 0""›ˆ­šˆĀ¾PĒu×u²b\OŖ-ļD‚®1ž h“Ž2)(xbˆ‚P)ś5Œ*\ĻŃnš\óœaµB‡15‘Bś†p׌£&@­õbѧ—Ķ­¾Ma½Ė~cˆ’¦×uģįŒdŸ Bbߌ…¬MŽæe¹OaÕ1qóØĮ³…ū™œK‡åŻ&Ģ€ØĒQõ]­¤¾ ”u?…Ų8€:‚]Į}£Ā>HÖ·ąI2y½€r^(ˆe7:i€åæˆR·nŠ™Łö?'&Ų ”J7z'UyjSē4ŽĀ䬁’bEQUgīM†ŁŹšäŽÄ@ź?äó›É³ˆ§]Ą6©'7¾÷9™sŸ"L豉=Æ" (R˜d¬‰uÉvøī?I³‘ÅśXɃ ’”&h)åųüPǦ°[~AŸźF¤ā&ń°š+BI~Ćs`Ø žPzĪŽ9Ō…ĮwD|z4;ęb’Ÿ}y}ļ¤0²ó„Š,ø’T/æHBż€n¬ĘØYƒć‡‰1ß¼ó!j…Æ*}y™NŽŠ˜7fČasšGĄ3{7לEX½Uū1AM? ł &79%æŃ”Å,X±Ōż‘’&ŌAĶJ4ÜĄ†mKMļļ'äęĶÆ³×€C™Ńó&S¶Ķ& Ś,ČW“ĆŅmkу\n’3ĘxhćX°†”ė•ÄĆz4GGGŽ#>’2<’0 Th[¤zJ’³~w„ąĘ†ó¬ö`†±ūė‚Všm¼įßāi` ¾fATø›øg–Ų³9ls£łE ź!2®z!·ŗXō!‹r°hŖVB€å.„fYĘ“-§Čvm‡0cĄ™yõ8ŽW†(OTĢ üņ¶Xгé'㨒%äŗfcŲ z µ Šą݁ ‚°‡k'4k!øŚuIDæĻRŽ€hÉ¢AT¾Øp“yg,ښ­ßVš³Ų Ę¢3»Ž7 …PęĶņ”čLāäÜēžēĒ£!$›|<‡ˆ„^jnyĆ.:s”Yf7“"dŒōyHāVÆōĶްĻ²883£°™ĻŅv$ę„B»}˜ūo]'K*5–\»!1„‹7#O99‚qŗEß(ļa½¼)?‡p…{?Ų€:CŚ1- ń¦TG ü¹±“°[Ūe¤Ū×sŠuµšƒ‡½…•.‰å”;T„ŠNŻ„[Ś…‚[Æ×¢³WN!’±JœP8ģ¦ū½Q¢}[ĄóIéK‚¦ļūcŅkUĖw›t&›C­x“µ*q„Gć(&,Ūcė'Ł*/'“Yެ”›U”­ßŒ»Ä•TkmL I[+K$~B %˜X‰¢Čöq 3ńóņ½Rz*Āó¦ Ŗ#›lVįźˆ÷­÷¦ Š“6Ŗ§©žFq޼V؊CbRŹóś¹gG_%N«y€]ÕT ,b’¦•‰©©['`„6Z“RŚXLņŌ^”ķė†žE>Œćh…»ŒÓQ­ŲżĘk’‚g›‡P ¹.q©ą™Õ-•J¦%ŪćQ„£:¤Äõzģū1xŅś2ky>CEÜmƒŠ™tć×H”·Øö«(­j†Eļp`1¼I4† pĀ‹QōķĘJƒõJaBøą;Ż Ń ³Öš„eĄ£łŻŽ_öAy"Ķy3…Ł‘Idm›×˜yµZ:½øł¤KīŠsw{éi Ә°č^%^•X)šĘ'1 Xh†’Ü<[7!˜ŠĻ5;WqCU9ßż;ß9É„sjˆ;4ˆEƒī?š{B%x„ā¢˜…9Źå‹nēńéN”)ś“ ÜĢtĘj\TetbŪLBā™ŪŽ;ļaĢś°óĄ­×ė¾ļwP'ßxǰ „r[īܙe«"ž3aū,Q ktQ꣓ÄÉ!°7_j5„s(å;ŠóżŸ`xBādÜ:ĖÜhXņ¶ķņGN®ŸĪš+:!„R.ß*:ˆ‰9fGėÉGMĒ3(łŒ‡PłmėĆĒd±:~8Ü•p|<œŲė™ß•Ą€Ēqā®9įk-ū°s¶jŒšÓo£ö?ŒS91vĖ*”ĖȖ75õØYšźł”c±ą%OĖKį4®ŒžŖéRp!±%  %a^!)ŗņ;d‹ę”z?)¤xĶG¦¦Y/Ļę%nlgĖkl ÷ŃŃŃķ‹ NqlFBÅŻĄAĮA Å“aōY×uŃŅÅ,±Ļ/QzO‘ ėy͆Šje#ŗ}gƼqhtĶIĘ$IÆWüiaī°¢Ą§(‚‘™ŸŌ–T‚1‘DجĶøĄĪ¼b¢ (6¦Ÿ%¾õ¦@˜®“˜Y^ƒEŲBøŠpb{½?FHPJ‚u*tG;»TˆŠŁ–Ö‘1ŠraR„Ī“ty(ž;?É1ʐ²å]łĄ’p+Ō°ō™ µżR¶,p$¤’JuXh`qd†aūII'Šŗ1i®F‹‡ÜŪŪ›Ņ+õ&ŲP\:œYRØXäĢU”šAŁųÅ=s!q¶ąr)p#¦0¢Ü+Ź‚ŁŒ7lcbÜeŻv?LōO+ÖQpĻ„n…õį$PĢVZ:ę'īģ5~ļæ]BāDtšŸy(Æ~Ķ—h™SČŁp‘j» ońq‚(LĀžĻĄ»;‡Ä>ļ[S»ŻŠ³šż;Ügč [ph$FŠ$Rb›łØf$Õv{ø·ŗF‹ķvĘ‚JV©hbŒAEķ$V¶RĶ„°Ūv6īvVͧ~!€YdN'Õ+»ķSīf†²ÅœżV÷_øĆJ•Ų3ÉAmŗM!õ]^•&=ūĮ’¾hü) R¦: ½µŅ—©uU[K(Z'•ZĒDOe£ °1Ę\¼xń²Ė/£µÖŗ_,FmI4tŌ£‘6©ČJ!b–§†Jõ ¦hšyĊ>mĪJ˜S-„ö­Śņ=3Ēō&äĆ0ō‹EŃśY™ é±1é§Q"Ūāų6Ż8Ė€zœXs<»[8¶EąR¢ķésóRꍼ®aI–ĖՒb‘a·^¾č¼† ”w_O%įŠąŖ6¬zŅGÖzQOÄÅĢ—ä˜˜“J+NœC½tžyŽŻ}ļQÉø›(“·ŁjŽ„„D=ŁG&ÉŌśDžq D>_$Š óv[õ6NMß+²±é+“=ą„|³Ķ0 Ž—""bäQ# czµ8SLKlDįyDv›Ń{3™TLŗDœ%aKMN¹ćŽæ^ÆeŲs泘"rŠax"¶ćÄĒp–Rnéõx… ß©1]źfąŚĪjßSn…Ł’+Ō:źavßļĘqżķüā>Œ Œb,į« ź)¾] ŸÆō2EzŧĘ],ˆŹś!J{]|ÓįŌŒŠŠudfc“–ZząEš­ Ż~ūķĄ,QM×uJZL|42&~߇ĄB×RČ\—_*Ŗ2Šw kić¾šÅʰ“[•™µß¢ŻĖmQĮ©`˜ķF –øĮn„—‰µmBļ¹Ś(åb6AšZ5iš„sŪķj9 ¤BbYkö-mš-(‘n%ÕV¤9e×=é×¢Œp¢Z…ĒQƒ‰¶³1Fķąą@6KĻ yīlZ{× »łpˆwI< q³n^·Üx$śQ ©z8@’Gó^Ń*ī¾¼œ)YĢ1ēP|VńĒ9Ų}ßþڼ‘)0®’ŹĘxnłfѕ=G4Ž£ “N7Dö5)eF š±£q5x'—9½`dčŲ?©pŚ­’Žˆ“§dŽŲŠęAd2š>v¤Ū€h‘)€a-zƒ5ž+H”Ģ“ńŽ~„Q«t‚ˆ@h¼@ŠlĖ!ūŲOōŠCø‹¬3ķšlćž³l`'įā¢==f,ķ}tļjĻxģœ@Ły1aϵ«…Üǿɭd„G ·’]n/Üæy``‘ÄB™‹ćĖaT]±N_”šĮ”$E®“kɶ#‰›'D$RŠŗ® ū_ģŽ2fVĘ]{ķ‘lIR6iĄł^+N»T®ˆ)pÖyjÕ+Ö Ÿ÷‰ČŚ#ąõš†aé‹‘ŲüdY1Šk€¾Rõéd”Hp—aƱ©ō’D؈ #Ū…Ę€a–GŚ”«vƒqMqˆ¤Hj#PŽģIŗ³‘Vą7ŽZB¼×ŠŹ uŠ'¬=>&‚+&4“”.ėčl ’ō}'ŁHQ‘¾+į½9uź”%Ą‘ķiyäÅo'ćģåyR6Ą@³"üp»‘4 ®F3ŗc120Čģ›źÄ…aRŖtŠ3ĻÆz–ßć±ŪŌ5Pbd8c¶ąŒEč:Y+}šÆ4› ėßf*±Q³š†Tk`Ž•DiDwkRę£aĶ„Ęš…Ćƒ<Ģ÷C^ųÉK|ķ-)¹›££#i”·Ź#Ńvµ[)zfō›‚E`Ą0ų’@֓\38aē†Į$"fÖ£1l·ƒ¢¢—^ŠÉqŚĖŽųĄźHŸt=Š“Y %ęš,&\a’ŽČv1 ̧öŪν»u|~Öćįģu0€=6ödHq«~cŌ°Ū«+šE¼Ŗ^•õ‰­F͌§¶ ‰^½c:ʑó”ō4n!„˜=O­ģPdŽŖ%W6z!ÅģΆėČķy¬‚!€¾c&”6ņ¤‰ŃŻ „¼QJ«™Äšč,6`…ÕÕzVgƒŽwxOćƒÅx8ńꥤC³¢^Ū4Ū¶’™`å‰Ä "“ōćŗ—ā1ēˆ łūdŃ\ņūšŸ5 f}I;Y>ōŸ˜øƒ ”Ædfé‰ ­ED¤œ@ņxÓNA`H>_ø[ö”¦”fER2ņEĶP«8о€lcT£µo 3†»^‰ķįįamNưZ<œĄi žVsĮųŠ}dĘ=M͈?³VēĢO„Ś1Ńī!¬ķ‚@Ō7„6b+³Ń²ŠėĢBGŅā+H+"źū *R‚Ļ/ rG²ŽSV#õ(TDcŠMF ŗø²Śl-qõ`³7ˆ9+BW¤‚®”+?h„ Μ=mci¼:Ž}ĻŻ¶‹Akt¹EZéųõ…µ×@ŽdÉ…ŠŁ@b3|¬#.7ü׌ę~ˆõŠ1ēČCIJõ– 2J›‰X{Ŗā<‹ą‹–’ŚŠNēģļāćѶ±øŒ9ƒ9Ӂń”rGGGH¤ĒæŁb±°Ł† .E>œČĪS75«Ļķ¶Ž‚ż)‰āÖÜHæb=„••ٌšƒ¦”ØĘp2ņ‚÷‘vyjRQÆų̌qw‡eIÅ®=w[1ū’ÆĆ ĶoŁ8MīUósĀxøhšŽéļyš¼AlNE7ļpŽŗ1³rcįbŲ–˜fsHĪ\2;T®B/'Æ.ī(ÕŲō„¶Ŗq”œqNd¼pū]õŹW ļ>‡ Ķ­ ź/ęąĢxŅ’ŲoŪA˜ŁŃzĢU˜/ī"ō“ķ-åęlc«LžƒR*W1ŻŖ¢ę÷o•šŁĪ Vźō¬ kĆŚ"]}fĒļnģVk`ęÕ“ÖaCļĢ„EćøŖ˜Å–ߐĆbĆ˜ŸÆįĖVśÖé {<„±±oŹāś`®dÕ|{fŖąü Īį#qNaXėõ –čŲĘE ĢŖ#$X.{˜A@’GĀž~Óā–ņāqV’fž„Žę J—ČmQŚŻ2[#Lا’īs!q„M}ŃsŅ…Ņ&*Ä-ˆhķ™­~¬€N½ŽOłńżœf.`±Įß« 9Š–’‚Vēbd^!hĻąŌŗėk×z3C1F<7i%– ĶĆmk¦ŗ^Ł–¶żĄ^ėčĢ™3@ØśNZ}²)ŗTÜ“l#Xž¹Ż“żŽŹśŸņƒ€żH¤Ä;%4ĄŅ-*·ŒöKĶt{ž—¬= ł4k)~S„xį¶m`1jE¤4ķ‚Eńęü Ä pSN!X‡ˆŁ¦3L’Ŗ#"pÄxr’{ūū²<¤—Ų•·ŃhĒõžž²ė&ŽčAƒēsI™4ɽ–ņĀŠĀ†„a8^«•’I4Śų ’M½D:än< é{löh¤-]”M½¢ŗēqā+887~*ä¼ø¤%–Üc™¶Y ovŒ0&·żŻ€]°~EÖéŁŲƘ»÷>M¾Ūę~H©®ė)dz4ĘšĢ{™O¶­õ©Ůķ1ł¤ūfŻ“g*ŹÖā¢āķÕVZćĘ|ʱĄć2HĢžÆdø<äa:kåĄq?L’Ģ.•s†7źā€Š/ŗÅ¢·Ņ;6„eT$E@č¬ff!§ØećŅMcļdK“ņ©ó­Ęq'Uµcˆ»ŽŒ¦ÉGƃ/ŠtƒĒ1¹C £äæ±ķĀSEs°QłŁį=,o­žf«¾€ć8+ ėÕP;8üSäĒ½ßąŃ­a3…v‰ŌkńAäŚ~QÄ«>žć°›Ć0xB pGū“Öāc@÷ŲˆJ]m÷o”ī1Ęt]}Kó)oÓŚčŃ@¼3++'aƒóüŅEN:fŠ.509?\.¢ŚŚ8Ni›h‹eīü‡gG-W2ó<*S^ĒųglņHūDL;„žČ}ØY‚go‡‹…,_&ĆĄ VÜžS¢c^ž†z«4}F'Ī~Äöä_āy“”bęčM“"+ˆ:"Ė+ ĖŲó‡c®,Œ£ŗĪD‰-c˜ŚcäS°fB…šx¾ńœ“ i³įś ;Ÿvō8žjD–dO¬hĖQ‹Ižqž‹Xl 1·#©qLēägp¼væĀW„2ī%ŒH“)6њė9’%ß2S”Ųæ­Ü{ĢŁī$ Ķ(hī};ߨˆ Ü÷~÷»ćĪ[壏P§‹Åƒüßż¾O}īēü§ūolŠ<‡%#(竬×ĆbOŹ,Ńi>² »ž¦gÉś% h@¦­4–‹’ĒŒåvh„k[–9= óhó6¤¼W¤Ø4;sY§2<_³®¬öYź© #Žī'¢qŻz?ūCŗ%(/ŪPTzłĘŃķnÕŚ"׈‚h“FDFŲĢÖư‘  ÖS•ĖĖ5÷ŠŖžž÷ʱ¼ŒƒFDՑ“ZĆwŽyēÕW_%śœč:¹Żsā:^ 5¼#clÕŌś7 Ę“m§ć†-Ą‰>$ĖżO‡‚ ĘKw-o6R ŪĢ–¢øļŪDŠŚīš®›>€©ėl涉W[µ£øŻ”ž'ĀēkC©«Ķ~Æv­˜É¢Ŗ-ܰ†…‘wFĮ(¢­why/8)ꩯŌF9I“Öõ‚veQĖZlIÉqcyOH…»oŚīŸV##ŚecŠ«1±Ź ‰Dš,O(+@5”ģšå3;Ž£ÖzŃ-§M”k !§ĻœHųŽ£ LmЌžxaœØõ¤,N¶ÓĪÉä)6į° "iOh\ÖžŹ’¶Óbā AQļ.XÆ×˽œ&Іø“6\„€łž ēOŸ>-¼ É9Žˆć8*„2=?“uē…Ŗ<ƒ…ć œ5¢BuPö$ & CaŲkz)nF²yćȊ6č!ń„ēŠj¾āI‘õwÓ>üć5‚ŲÄiøˆµē*r$5Ī—łžg#j=9!%l„Ą'¢<<3ŠÜ§lØ =cŅK–7ÄGUÅ·‰'|µN‰PA4I’Eؐņ;~0Ūsk»\˜`üĪo’ĘŪī¾Õ \š-_š…ĖӋs‡Žųηݲŗgz Č@¦GŻ0į€d”¢ Ø„² )P`Hc§±ƒLnŌ–Ķ%6ē©ś T£ķ”8>EųĮńõ„ –ØŁ¾ę¹Y"Øń,a˜ó¶=Ÿ'›©33+vœ<¶㓠jÓZTU½¤Š-pĆaĘŚ˜QC§ŗzõUŸ7Ŗ³ĘŃ/)…©ź"\gŪāyā½yéņ)Ÿj~ėÖ£ģ<ąŁ§ģ$ļœKRxå•WŗŗMę’:³\BśY£9<ŗĀ)ģ:åóżģ«X8a)õh†aš(}D"'j!Š5!² "ZĄ7N°RG¦Ŗ §T(Ąć3ŖDiüRf2ö¾¬(Rj äņ,“L4¶ģažG÷ź8ķ@7\yWĖ|qł­Sˆ›ź9•āsx †B‰ l[UTF/FŲęēu’Ųšā4‚/Ø˜ä4A<ŒuFb+ęQ­N7PDć7÷uҶc+ŽA’¤”Ų=ķĮŽ·±n–rł&;Ēų$BŃØ®L¦Ģń²&Ś0 ±ƒRŖļū0źło BkHx²Šuju^ŠnĢ!(Ŗ‡sRȎūŸMūķĀT‘/'Æ(ęź\‚„8ü*“2†‹Ō-BŸA‚år1­ĢB_K!Ń6(¼üņĖŗ€‹Ń#_ä6D!I‹ q¾i03V[µ>Å öÜȘBĀ9—Įdwē(¬±‚g)ūō4ŻI„…Ŗ}ę?H+z’9^¬Żē%8RūēČ ĪюI$6:‡¼éųpŖų8>ÉĘf(QNšFµķRyyć×uäéi"GVŠŽŁ—(*yrOZėš’SbSü Š)v—20īRžęN¢fCHJ3 >ęQ~ūŪß¾ŠpŻųäųˆ'<ž æõkæ¹ŗzyśĀpōŌü(Š@=šÄõ·Ņ¬±W=CäRįĆj¤½…aCāøK<8ÅA³QH“%”0OÅ|Ģh“H–oƒqtNź%Ͼl”ó¼«ŁJž1äÓóz*µDWķˆ“MLŖ;d›Šgö¶„鄺°Ųž…¢’Ū÷æmꬷūd –€¾ÅłŻz­ę>J#¤ŃZćŲ‘RJqeµĢūI‚?ż^œ*ˆd¤«§= ŗļĮł c‡"OµM@˜øå?ÕMAĘ <¦Ž‰" ,xBČČģ•i ”"[ųŪś˜…CaµO3ų˜ŲYŪaµVj/TK™fĆLõjÕ+‰ĆxM×Q1e!ŒµŠ[Ķ6_®Wgn’’Ó'õ‘Iȑ’ePތ#ĻF[]¾O“īś$%*#­M×Ѭāƒ"›Č†År)Ö ¼mDdąŃŒVX… !!¢6ZQŹGmłäµÓƊWĢX²KóZRi ¢ “`Z[AõrJ¾"ē4ō*ŁÅQvKŚoŃ(tĘ<½»¶Œ±mœ;cĢ8Žŗļ)œ.’ƒ1L`(žŒ‘n‘ć¬F¤c0EóžŌķåRf22H®`Ÿ’Ų°FŚ…œ blg ņe}«[¬Ż”Ø›JĮnR‡6,Ób©īÄ} ćfļČLQė8čaööö&¼€›½T×@Ø®K*±ČT@ś`bź†SˆHā5żČ¤&źUEķļµŃˆÅŅŅļ”R`<›É)) ø©<8涃VŠI’Rée«¼gń#Ez£ŻZɊź­s@ć;;‡s<Ćf™Ż’ĶLJ1ęP±"²³LR!$.V½Å˜®ø;Äį3ō}/oˆ0e¦6’šœž¹F1ļ¶½\įčą`’ģDT@śpõļž÷Eæõ«æüōyŹOæč{¹Ē‡>ō”ļ»ł¦[o½õ“ŸöIæń[æńę ·k€×¼õļŸŽŸįüÅ7¾śoßżöwüįüžķ·ßžŽ›nŗå–[N9sźŌ©G?ī1OžŲ§,Μś˜O|źÕš… `&db r²;A¶XKœŹń™< ć«9"U'u˜śÄ.ŠF‹ćõEDæŗļū0[ÖĄŸl‹¾ŽĮ¼nk.k»@¦{Ē0+äƒóD(4Æ[…Æó3‹ó/[,ˆ”’x˜AEó ż|ŅüÄ%n“aD$·»ęņrØ^ī‘ˆ¹ šŃV·v]‡1¬7Vµ±1°E†ŗ—S$ģ«T¾|jqÅH ˆĘA#ŖÄ›‡$3ŒŲ0L˜öHÜE„^VT Ą°[ŅFż‚ĮsU› g› ]]nśæa£¦(ČÖfŠĮłåŒāp²OČ-·•ŪBx“UÉQ03ž¶hµŖŃŠ“½„ņĘ)0>LÖ8Œ;«%XĮģ"¢ēą&Žż2oQ#Žö£—:V•BHČ|ūv i­Į ¢„IŗNM^F’,Ģ¶4ēpŻf'µķāāń‹%mķ`„Õµ ė~‹ E­ć¦VVM;U9Båų5¬ņóc4²3­rł÷Oą(T&kooqŖ¾j£‡Įˆ£›ĆalųJĮéī!ŠČ5=Ą°\Χ ė9!ž:‹ķÅ5ū܍"„5£Øcā\ļ·Š.‚+ŗ-—įnµ–b.Æ-ē &mϤhŪóK/²­³z²%ō²ƒ«|/”ŠņJĢI-˜ōCj“q4J–¬×ė½½EX-9žSIį7gKŹłėõz±X¤ūJ>D”9fŪÄvĻŻw_÷Ї ēĪ=ō²ū>}ś¹_ų×\sĶw}Ć7ĆQ³¾ļU×ÜvēmwĮØēq’řåry“^Ÿ__ōJ”6ųĢŽ™ G“3Ŗ„pf¹<8Z?÷ó¾ąæżŠ./ß ŪŪĢģI÷ÉøZ±1“É ‚ZiŽ“f±©x«I­U#/)ÜĖz¹I'†Ķ×Ę ¢ė®Œ`\ĄŚ°oŪ咼m†¾ļkząpŅ„»Åü³ģcŠŃ'HåžŽüÆG{‡aĢ$¾ĪGuž¬ĶmŚ7S„éĒäčhµ·æ k=éߨæzŃĖrĮp #aĀ’Äøa'$–Ü#it$CV—XŚ#©ą_ÅśØS?¶ü~t×+=Ļ®® cŲÓ~Deؚ/ްUŪ•me<:É®³™Żęąčś6zöéĒŹ:ʕŸ‹½]ŅņMrTŃåöęN2•āun£p(Ėe6z «ćĢN6 =ŽŖļŠždćįči­ Q”¹Ö“©•BBQķ*{zd¶CŌm Ū„;×6y IøĀ$Fz­‰) {Ō¢†E†—œŹ®MĖ"V‚(÷ż:Äj›ŗ­Y)ltfž€;2K'p‡f©ü³3>X05ÓŪäŚ>ųƒŸü‘žy÷.`6v Ÿ]Ž;@ę9mv9ÄWķt`c‹Ö>(†Ą·~‰Ļ4¦ó°IĒ«M“3“;a£åõ@‚ƒŒ0yētŚ|ļšXGŽ[³ŽUŻbä cvē–3ī„4B §ö*JČa¾)7ü©™Üč0ā-Ę®€6N7:‚˜Öpļ'"k©]cw ‘iƒ‡µćB— ˆ:©Ż¢„Ég•÷Ož}Ųoœ•ą<-l¹ž6ÆN{ĢDRf\Ā W¶R•Ūh«š>$nTBE†hOh@å¢Zńéżłe9 #ƒūīū~J÷8ü’8 ]ßūķŽ˜å¬Ī²K„*D£ĢĢżTf&$ٹ̬:ņ3Ā™„ŒD­ZŪø"¤Ŗ‚©ž¦I)”¬³)ZĘ”Į̚RʶWW6²~å–Āļā ēYB✩N2hR÷“f~ķH¶Bˆ¹MųČÅĖ€…‘#n&Źj‡Ä‰_‘ŗhń¬)ģŒm —Äį8³–›M“VĪV˜1śH˜ąccģóY{»wģ÷ś¼Gן8-­‰‘šö”UŪĻFĆ'$+j'Ż/<*ģ”õz½\.±N±>+±µ‰9Ɲ%Ļ‚'›ń/®Ņ" j-*Ž0šĮ¾šåĆŻ‚äF#d‹Ģl›`a·hy¶’©ź8 ”TNÅUZ›NєESŽ…ć;„ģ¬T ²s–o™ĆvLά‡årqõ™+ōj½Ök;č.ą(WŲļWwūßõ]ßõ­ßńĶGGGŒ<ž©’ž¢÷ŻųžĆ»Ī}į~įüɟ¼ū½ļłö’ų½°æÖŠ)cŲ^솿ųÅ_ł=ßzłÕ—[[C‚ĢZRŖ1Ē;Wŗ¹Øh©¦ō§Šõį6ؑrŪxĻ 6ć9£Q[r»œŽfm[%Ī#䊍žĀ³šš—ŹgR5Ō*uŹø 8]ų"öŠn—å dRx—|^18i3ńB®„ą]Ū!MŹÅ*¹Ņ ę“9di©ht€#-ųm…x+')Ž„§RX gʁ0·Q-Ś&žœ_ž| •ü€~ŃEq”ā÷õ虙N«2“!zbgSV©zqŽG-POÓvńõ=É÷Nw¢ś3Ieū “SX%6Ž\`½Z-–KķQf„5ĆŲ88"­4ö6L„¢^9B/3śRc] a–{‹ŖßļĀ!pLE!uP¢œV¬­®Æ53K›Œ­@2LćŒ1ī'/PŁOG³ÖZ©.ĢFY)Yö¾”2HLÓDDœ×Éŗ0!¦QęL13Æ×ė®ė’ ķÅmū<Ŋ=DĶęlT‚’0…ō¢LśŌŚÜ$f׃±Ķ_Į SĘ1'¾ܔ2kŪü¼änŽW‹ÅbBīT6{M9ٶ`uŸŹĻäsĆ[†ÄČŁ,5šž’¶ĄŒHŽÖgÅŪÜ6SoŒq)clūŽm‰‡Znī]ĢęqJ/'ó2\:€1NŽÄž{Ÿ Ń Ćøč:GˆB+Ÿgk’I#ćß³±„U©Ķ„'Y•¹³§Uoģ’„5<ę!xłĖ_~åÕ÷¹óÜ=šˆėĪŻsĻ—öæłÓ?żÓÅbqׅswŽk e†µ H”\F3ōĢĢ€’ę’žå/üŌĻžŪĻ’ās·Ü­Ęžįž’’ųĶO}ŚSE­ÉU­ku ”åļ>Ł@2×j›»•” ēˆåe‚kÖÜnßĪD€ēŁ»{ī¹ēŠ+®Ø­¢Ąé†•ÜļŌLv°Ū~ćIŠ*m{AKźY$Ž#ßUp̓ĄxŪ;Ljhó³¤iŽ€£›YÆV‹½å“ķŠ½¶ę b˜yµZķŸŚ“Ėķļ/S]%66µ…Ĺ~R^+.īĮø øš1(©HN& ĒĀŹ ƒ1¬(ØōŖHĒtŠJb;źķļļ%µ—ĀS„…A„­Nv ÖpAqŖ”]¹ķŽĢ€ NŒį4ž©){•VųV•Ņś¾Ć©Ā–ā÷§*nłœāŲmĶr=zU˜Ź ŅLyÕ±†ŹI| c kcŻ D'£Ā8“Tx™$Œ“Ķlq³č–…{ʱ+k‡įÆS-·{­#4ł H£n¢…ī ¦‰Š4ZŽ«£QŃہĄC±1ģSĢÉc¦²@”nšš†°‹7ģˆ9ē²/·nĢCAŲU“ęŹrˆõ#“Ü Sõ>~æo÷³6ÓīZ‘$˜¼_3rȲęģ­ŪOxŹćų”hl×Cāā#TΰÕĆr}¾F˜DĀ®EM$ąnUā)½>;$¶$|ó‡7VY“*ńĘŅBń’&꜆iŠāꦯ*Św ¢ŠćĆK~;œĢmę²—ž‰6¦Da{­©Ø—Ο;wö²Ė\ī?ėzj.ńv,äæØØ£“;©é’‚蠝üN¬Fgʘ÷Żōž·¼å-ĢüŌ§>5jäG†Éš„_ś?ó“’ć>Ō>}ś-ēnCč±¤Åź{B4 hƆ‡Ć£’ņŻß’;æü[Ÿś”§?ē9Ļłµ?zŁ×ßwP [āI÷` MķÄžI/^¼xęō™f³C¶©˜8É,N¼…Ž_üūšUņ§– †Mż{¹Ż˜“¹Čą=§’|ĢVKx už¼0ū½1?MżśFlßvh`+ł„m®PL1„¼Œ­3r ä G…ś¤[¤ÆÉ¶ØK "­÷\é‰ÖėaŁ÷)œ”N±+Œ&8Yˆ&Č7—ä§]=*Cå „éĒ›5UŠČłI)>3@!BÖ.ź5‡]™(rf Č,½éȟ ‡įj [É7‹H½¦¹­$…ó7äÉ ŠŌ v 鳻ڶ'bĆĆ$Ÿ‚qųö(RŖuNŻV¬j­7\.{0ńŗvźMÖŅü³É a²üĒŻŒw|zśŽ 7{r[ÅŌKĘ“qäé÷‘1Ń:‰‚tHß£»®“Žģ"½°Ā+Y06 Ł’·g“•žn.×HóŠ¢xŌ=äPĪÓaĮßHk(8m©”ąJŠ=‚%Gš-¾Xó6„ō½÷Ēj' UŸžž„q=‹EoC\*ch½ó³a©g’L~o?hJT\z¢Ø ķ¼śĄ“Ö^4;JyĮŲY°M”Tr±e‚Ļż±­’õE,źĢL%3£8↪rĖÕ© R£¾p Ģ7ĪmtķĘRŁn.Óqōt}ž+ŠxŪ"*iÓ*æ^ŠŚŖ”©‹ź$qE¦ö°ūϧ,OŽv)»yĘć Ń)ųƛӒ =äAz@¬ ’2z šI2ßpĆ °··ēåŌżq°±RhlG•AØ ß?õßó~éÅæüGÆü£Wżõ«ń„Ēy‹ćG‘+¢H;0B^éUJĶĒĘŪŠ‹üC'X 37N7„ų!†M"OX&[Ø&MT\lEq¦ĘI¤’÷Bl܆6žµmøy`›ĻyćĶß ćSūe˜ELiņp:Ųp3"b«łæžŠļ}””#„–Ė^D8&ˆžāa(qGg^½ ūQU®ó ŠQE“³±!¢Š`Ž×ä ‰·$Į[|<, ^Ģ©S kU;w·UŃ`žtēWXń¶9‰‡Ćƒæa×ėõéžŌ+‘›š™Õ£ę„žżĘņ©Š[  vŠ£BÄÕjÕ÷½-c†ØūLĪ^$źdõ˜ŹčnsĻ/gL³Μ: Ž› \!{9–ˆŁü= Æ×CVJ9ŗō¤øŹ†Įūµló;čµ|Å3v<Ć8m%·žZćč“aŠ•?CĆ"Ź”V‰Ź©±Ū<Į:˜üūg3žĘLJĮ–Ķ˜ŹĆ H-ŗYŽŖMōG˜‚0Åģ}å"Ņ3ś+9¶?ƒ% “Ÿ½J”æ£, ‡bŅ2¹ųŒÖ!эįa–‹…5uʌ‚­tāN]üq¾µĖ:…^-IŪ£N­ģyķ$¤ācʀ¦ŃĒý⤉ŽėõŲu§s£17*ööaŚķmIm`£Īü6 ƈ(źˆ;œ)ÓzpŽøGŠ$ńŖ1‘¦Å†Õ=’v‰z¤d7ß~fĮą˜aņAcŒč!¶ĢEq‹=ŅĒQ|ŲĶ]læ(‰NszēWd1i<ØŲīł·Jr^˜”4l6؈É6¾Oļ»õÖ[ąššš†n°ƒ¢0L·®Ž0 €F„™™”3 :`õü/ū²wÜü®x÷ļĪßtĖū@9Ż?•mQĻƒ7„Õć&ä9Y†ŚļC” ń<¶Š‡‹rŲµ>O’ęvźK÷P°ÖPėžo¤mėwļĘä:p'Īł>g?7¾:”m<©;Üx,5ā“9y±ø’G+>¦Ų yMļwņµoŸ~³³?{–ćų$ęOŹDŖ&gĆ\0kķKōśŠ)Ŗw=ˆcDīnļ¾ūƒ6 (H"„$ćhĘŃSÓŻ”$󚬱nżūßwÓūfovņ²†’lßw§OŸš³,óŸg"?KݘFk=š˜$ŃģQ¤)0l•„ŁžA@ä§į¤«ł$ąžŗ÷øP°āŅ ¼I…­ “l½0©4 CˆnØķ¬qeļļļ!£ķĻw±h¶GĀ< EEÉe+biܕёķž€īžµć"F¶ż¢Qœ,ołź°ŖŪ^$85Q'‘lŒ££#ćž·xAĄ°Ä·l·­ ׄe”ŒC„÷³±=3ƎÖv¹ų?@ĄČņ~0Į |Źž1l—–ū£1“C Ų śE"Kzė3Č6lbW’z é{ ;żdĄĄŚ>¬æy«8… Ä@ĢČžćÓščē •.÷€@bm“,Dk-Č8IQ…Éyæļ>K0q¬ż4bS9Ž” ŲŃż^ąBj!<Φ/"W ]ESś€“#U fæ˜bīū¾‘GޘŠošĘļ“W"ó¶³_d/€å»rič(ēۈ›ĀŪSJ%„ł©’ceĒŖEŠ­Žč9>ĢVńšVžm±Ę6kĘA4ģ±& 1¾8ŽĮ8Ģņ§‡cłĶ0‚ņ łŲ‰`é¶MK0“hqh lz®201@×uŸų‰Ÿ`µĖ׫Į]ĶĄŃzå2a(ƒ&ü™’ńÓ#šyõ”{Ų^ZĖEäüäŲdwŖ3Cī&ś$h;ąoŌŪ z‡x8÷łĀ{J3·¼ĖzÉĻ »0«nŃ0Å Ę&Ü”ˆČӏְ£œ¬wI)ø*†1įC…ń„ĻÕÓD'x.BqN¶JÜ0©µĄXŽyMv£ŽŠęFšz%BåŅd¤sD˜ čs•k¤ø–)"W>ō96VžQ_ŁDÄL­Öœ:ŸŅžį¶Ūn{ļ{ß;Ż›«ŲțåD@Œž+,–ēx*oÄĒ’󎳑F†k&Féø6%ō0- øłøĖ?[Ģė5ęQĘŁÖś( hYRč‚fmؘ1K0°‰ękė.®`ŖŽĀõ@ =`Ŗ<ČńžJž×sttTĖE† @rµ¾Œ€ˆĘŃHޱ™'|>'|Ā™M©„]&@/½.ʀ. š ,’‡ė¢S§f’M68SĀV*Ż”1²*‡”owŲ,Ź|,ČóyÉ~÷;µY ·$e:Õ)RįIšT‹$„#…ć ĮŗW«uxQÓå2¦,I=kg˜}“0ūŸ\½ó‹adƄDĀĮµÉÕZÆV«a¼oć?RLīCFpÅžĀī‚@hjćFGg|'P»’Ü?ŗĒ·u];z‘Ō|3µ'ų·xb)%u;kwņ§‘Æß6Z O$(/V' +Š•’9šlm,ƒŻku™P7ÅöI•Ā™Ÿ=Y’pg㬻՚żN`ŁEČQҬAk­zŚź‹Cģk.«Ę‚żĘ×Ob”‚TĻbšūB÷©ˆŠ)ūF/ł_žÜē|΃Ļ\yē¹»n5a‡F˜! I/‡A1@fåÉ  ļ®8µ÷źWæę”|$+émHĄBbxQ³uÖq¤\%ʟ­®ģ%Čó†ān<»TųĖ‘ ˜XęČ#‡Ė ¤ZÉ{ó½sÅU”vgµZ“{a†«ŃzÕĘädĀm”£—. æz ʛ­›Ś~ZKäfųK'oéÕ”Ī;¬źü{Ć¢V(Ÿ¾eŲFPź“)xIóÕn£ŚąŁ”r zҼǣ™%īŃŻLœG0¦ŲNįó’Ŗ€Kµ6ˆX œ‰o]¶ RįlyYU­6SSŒB”‘Ö8ēXÓśś)ųϚ>S%9ļzLćoĀę@aufĘÕjµoõĄ9åa¢&= `zyģI„€‘ŁŲP€$l‘Ż!+W“žpŁń²”BØ1Õ7š™£õØ. %L Ց–rÖķs‰ā2o$×w‰°åE‘!̶L²ųć¦}‘\ņ±‡ ³  gD¦÷  ’QŒåė˜QÆV«żż}Ļł"¢ÖBRøÅéiģ£]8ńĢŁÓžŪ d—eÓĢ̲b-Ų•ŖEa÷ŹXˆZŁē2Ņž Ć0,½ÖF śE ́GWŃ0Ļ‘ ;·aL–ä" •ŪōŸмĻŃM®8]Æ,’’Ō$óA$賬;ŹÅ&8(õ$'V½ŁŲÖU+2±ÕHFóuNŃp+F•9Hé]Ä’f]-} –Cd®XÉńļ3ÆÄ\ŠN½nźA±‰h@‡÷;Ī0ė‚°eżŗ¦Fć͇o Ž`œqŌRiōédnÖ¾VlŪZŠę~“fB$cŒ6Š÷½×P„Į>QG”aFĶØ”D¹ üł+^”G#±ög~ĪsśØėA[OŠlz‰Ą÷ņėP¶PĶrśÄ `ūéNcy‹Z.ŪˆĶ’eW^3)Ľāµ+‡ĖĄß’”ђW|ŅĖ%ö9f^ī/ęŒŪœmvāū°Ķ.ĢF½9’åÅ ünōW—Ā05¢Äōcķ;õ•°ŠG įµóŻ=k4³Ećžõ”Ežš.īß­°¤Š^Ø$óŌ<ęĒBYŌ€7GOæ¶{Hd3Ēq\,ūō‚8łŹˆčém]-Ā+sØø““¤š43åCš-jŸåI *$̼\.kĀxSīæyŗ'Ż Ś\õxĀ $ Œ¤"ČülT¶Ė¼e@D‰ķ§@-lŗmQIm »6Ny“˜>Ŗź„¹čŠņf93Ÿ,æöüĻ^åÕēY&×ßQW"BĶ“Nņk©ń„ †ę`§Ę£ĮÆ:YüئśA€ŽŠBøÉØąÜ¼§ēˆ*ĆH¢ōS"¢ĖĮĶõź©2¬ūłB@2IhZ^nB/¦ŗ¼I©®ėŗ®ėū‰@:öMŠĻNA%e£µ†aooyęĢép4|:ŪC¤&Š ”ˆā‘źx·FĮŸmļBPŹ:’¬É:%=,>Ī®vŖ·ŅŠmė–=“µ.Ų6ņ\¤µa@ŅļĶ~ć&1KuoĢéŸź°į°~k[Öi' ŗŁ§ ”$|¤T„,cłĘpīutļMŚ×öZ›õz}źŌŽFæčÄU.i1†Ā#¼H ŽĒ!žœ;vČ:ņ¦±qäõzżÜuŠhM„¤p1ĆyÅۦɇ )ąXńę7æÕ­ž(łŹA²B"„lÄ»o¹ńĘołŚÆż„’8€žłĢgüųOž °E@KIŁx*GŒŽ,ģvæO|A[Ü,YÆłģDˆā˜ąźRo¹šÆ¤ó»jsäĢĮ‡“µąŚķ‹~l^Š×zķp=&f#ƒĄLBé6Öm‚_=fuXŚĀķ QH˜­13<¬†-<ēܱß~ói›J;$…Zk$˜P€@ˆ=)[Uó…)¶™Ź)VqeFߒBiŠ »ą¬#ļžų/Ŗ*md Ź÷ó°!nŗ-’’1øuńüÜōøŻÕœÆ±9a £±Q±Ō+€Pʃ:Ū ĄY»ģʅUŒ‘¢»€3śØBĮgŸ“{tt4u53ūįäōĄi›Ŗļŗ`G»ą#ü§c ą½Ļ ćPč$½3¶›Ęų^ėé6¢>‘pŹ®BĮ‚I;pÆŗüŸ­R†¼½¹¾r¦°œcÅ ®„%>×£=¬GŪžc&|@œjw@0 Ć:l)"9X`鼕ž[T€ -CŠō‘ł²śÅb±\bĄŖį\Īx©Ž‹…Ģųźh=.^<š=P)Ū -]Ä؂Öbr >ß$̈L¾ÆŠ‘Ćnjæ_µ‘.tFP=IsŽžéSØČ~”š.nvØCŒŒ(rX䃙›n³Š:&ńp„õž2z˜īqK‹c—tP1oœtÓUę-Ē~·É>6Ņā@“¹p[¾‰“ņÖ<Ɛˆ®•ofRŽ05ϳ–’ŪŖ¦xļʍvEoĀ”ėhooo+G½Ń!<(.µœbłŁt«ļ:©‰_›T„jĖÅ[a„°ļ{ļŠEź ›ēÕ0kfŻudŪŽ³6?I± Q^øÄ³•Ģ0¬Ķ›ßųĘ[n|ļ#śG<ā!o{ė›ącŸņäŪn}’ožöļ‚.Q¹žéP"`ז“łé6®¶Œ,’Ü9RŚįĶ”WŲą-}›yGq^œiŠźŌ¶™_cŶ¢š#IXžwSýõjļüš˜p›åĪę9Ȇ¹3뻄ä*=³ųxˆ›r®vd€ Ƨ֦¶P·Š{”ŽH~SX%oŠZęXaÉ”…¬ŗI :j’éT‚§!D0†W«•H¹Š]§ló›æN,:™ų°?©”aę…Ļźō…ź…Jŗq ±ahø…RĢHz“Ņ،&č ®UZ’O‘8ŰŪsÉšŌH9:ۊ.“{׋ģwR{ÜßŪ÷Č—ką( ¼Ģ"éīDkĶ`4ÆVėóē/ÄÉō)LÕ£™V£Ć/{0sfo³9@ĄĘHĢI Ń2Ći£Ydƍę&*!ż‚`ü1NIäØ ’ƒĘP™čÄށT¬»Nõ‹Nȫ܆²”)(/«Ž ¹Ū ‰•²?J«RÉē"’„„‹öoĮ’ū"G}^<ńš/÷‚ģ;uźd·  #-ō>Ļ8µa'Ķō ĢčœéZ÷©sNĄ÷r$9}‘¤Ė)ĒK˘sD1j60䋅jĆQæ!¢źhBž#$np’÷)1Ū\,ų˜é„äŻCO%µ™?ĀĒp%Ó“)­,‡8<<ōƼæjŚÅŒB•÷¦Ÿ9ĒåKŠg4ń“mALŠ^'[Ā9Ö$™é½¦Åö fŃ ”^¢SP€fę±ŗsއqŹ=#` “2aץ(}įVŹŽąŽ·½óƒ®æ”WŻ‘>śéŸłŸĻü7’zMLDijšĒƋļ|ĖŪ^’Ś×]żõ÷qOAÄžńžĆ›Žų½?ųŸAY± ŽŻń"u^ł91ŲøH9h?˜¦fqÖ¤4žoQē#ÆW‡ļō=Tc]qNgv·<õ åÉQŖ…P‘Œ£Š€„„¬]‰s„œēPq󠵄Ž7Fmä›TćjRŠ KqoBkföŠŌ”ėŠš“¾;1ēńņm‡įā<Žą^kš@ōQÜ.ŽUXS™ÓąßP“_“ģ*Wé§­« sÜŌIĶÖżūźA˲‰q‚1'hĢp·ę٘t0Fī¾]ž«†lõK®#*SńŠ E|×OŗĶ‰ B幫ėYOå ć8†<؍„2…Ä•­“±Ö1N¢;¹ų*DÄS?6n6&łĻm±ńØŽ#©›ÉžĻqć¦qćŅҲ:Ø/‘ŸA;888uźŌōö §FŽ0ćŻīH7Ź‚Õ]&3“RrÓĪYŖėõ:±Ņ””\FmɾYęQ½"a»ö5"Üæ†¦ƒ@ŌqŻĄZµ­ōŌ“Ń螝žVOĀć…34>ÄS Ū88/īŒó ~c$mš‘G0Å#\WĀóĀņRd§‰d/TxA†‚Nzl嬾±™ņ)žįčhµ·æL”“žįĶÜl·˜ą”ź3ŚeĘNJČūf½^ļ{ĄŖ„­˜ö{ŲtP“Ÿvšˆ¬6J®Eģ/Ū&[I‰H8>7KįńĘ>hĀĖēxAĒQōz›™'&…+³Żn3æżjfčTöķ½1ŃLĪńÖŚŌ9­6ÕĖ»÷k0e­¬/ÜWsœņm]įmAŽŚOBāÄ]³n«] Z)å—éä¬'#aŸ’響ŹßūCföæšæö¤O~Śį… ūgΈ¶21}ø:::zéK_śēÆś³ē<ē9óńļ2nh³ÆĆuV™ 1¼ž¤N›“qĆĻYd3§„$JmœÅŲÉ#Ųø [×ÆŁÜ­Ļæ8,±_D­{H¹C‚>Õmū%6ę)¶Śt'nDN¶+c£%×hHfō|Ø0m!Ī7ź©é~ŒŹ©PXĻAx\‰ƒc&.Źūę7C¦­A“§—&ā› DšNV›Ś£˜ģ”Ź.…71į–œŲ¹Üem5&äōņÕõ¤‡ņĪP$3 É,t%nå-m ‰‹¶¢ŲXŲ¦“ę¹ÜP~®Ÿ ?f_d4Zž#ThĶĆ Žņ­ü™ˆŒÖQÓ5BāćTPBčĮÄdĄø”[žR8Ÿ'ĀUyDIėĀF¢×ł!ىxēµ–ūf׌:—¬³/rJNQéq„¾cą›ŽõĪG_’Č믿ž­o|ćƒčĢżļ’÷Üņž;ōÅ·½õ]×<ü!Gfčŗ®›D™Y’/¶ ±ź$Ÿ4QeG&ś§±!q²Eę.ˆž™zH®“ŲµwŚęÜX¢‡QńķŲLŒåµ jLćńįd™0Ū!q»t<ÉŔ? ÅɆÄBRWOæ·bŲńŽ !߉Ų’‹Y±·ńCc¬†a@ÄóēĻ_qÅ[±VT+’ć„.²«K00A“q½$2m®„¾Å‚©³IHlM*0š™1­åaųOĢ6W W·N#$·[¢ø“HˆŁF–p"‰š)2ĮD£ø–½Ź3zÉѶˆø¹˜‹ŸĶÓ4³JĒ&²™Ópqé÷0—»±Č æ Bāõz½\.r¼Ąhʰō”|cīX<2fQøĮpÉa-cČ9]įŹ”Ø`"ÄĘ(ÄMĪEČøk͊pśæ¾6H¶ '_¤ +%=¦–›ŚeˆāśgĀŃ~ †SÆ[## …ÆČ> ńiė0‚īī·› x ņõh”>įĄoSފ*‰ć©yR›Y€qŗ¾÷63äWŪ`“ ;Ģ‚ ?˜yö%.¶˜Į”l÷Pć8x ›š’ÆGķwq/¾SH›ļõćgŚ+†©"kō|ęEa£“ 9š+‚‡ÉČCŠĻo¤õ‹(³Ą°s‘Ŗ3¢’ĀȽYś›ĶųĪ!qŪkµV”Ziˆ™łÖ*ććĢGvŁ qŠŻb ’cČ]`6Ą°“²Ō„®ż&{Ź|Ę® §Ų'9‡.Ž¤ĀžÕ6ƒ ü0Ixf™³™»®³V„¬/‹ĆZ(mn{ė;¾żKæź‰xųįßū 8 @wŻuĻ-śāŁkīwŸG|쩾&m@bTŽŽåj ©W2”FĆIŸ@c&„ e}4°¶}.¶ó(Œ‡ĆAH@Jķ׳Kó˜é+ęŹĖ “ü©¤6bé6!éɛ@ 48ibm\]4Š”^a<œ4Må=Éa‹ČĢaFÜ¢¶ÄÉJ·oÜ8Īk[š„`U2Pā=·éŁŽł²˜4£…:ŚH@–Ķˆ5o×5’2Éo åÖ^FÄa Ś]\øpčĆ5śr {ÓʍP!³5k”…ΠȦŻŃČķ`0Ę 8 §YŚź°Ģ˜0!‡hźsȎ¢ń©5¼%ū}ĪN)Ņē4X'ŻĖ¼Hȅ1‡€PŖń½^{¶!v˜I„*D©%{č_µŽ8ßūxĆz“ī„$ØTÆą•±Ma”V³“tM'I¬x¶Įkm€A)“Ō`v£±,r³,Ü0łÄLl @¶§<h6O2#sg@q†)Éś·ÕlžŠm³j4Ė;f„HśuĆϊ\­”˜ü™īÓ1alŚzó³—£µ„åńÓē6śŸö— °£sGóČĒ’×|3®pĮŠ8we~0É Nė¹SØY~VB d„Ţ뺮ėTß+˼åŠĻ¤ŠNNŅY=ó”t5{YKåm ¢Ä ž¤» c³ÉŚcƒ†*tŖ³ bŸÅóxļĖÓ»hĶģéܹ’sÆ4 ģ?m‹ģn1ˆ8‹a<\c»DDæZĖßvu¶zó\÷ĢYĀéÉOGFÓóOõŚį¢)šgg">3ƒ¾słqfŅ"+nå3xšmTTØ{3˜æų“W|āӞ6²!€EæX k€ųяxäß½éMĀ@8ź±ė:ąt%)įō7øåȘ‰¼ÄfžpVVģ˜Uśv:Ź#5öPK œŁb(€ĒźÅŪ\Ķ/?eĘx½šĀ²xcf 0"RÜbŻī VÜ»ņ!±o8ߘ/<&Ąę¤2p;ė!okŚ…āPņqc§Ķ¬4mø²ŠūŚ7¦&]ÄčäW¦ż’/TĆ.ŠÄÉ Ōxó^;S®V«ÅbŠŅ‡ õEć¶É¤_w¢ÜJZŠ?C¤OŪ@p ‚ćCšø·0“‘ģƒM* Lõ‡PÕZw]—€P ^i-‹Ÿō76ć¶U…™³ZŃ8P‹ĪźBa“qV"?ļó„Ę, +ņEŃ©ŽŹņpiĶ@Ś}7§T’ø¶Ķóe_łĻyŽēā„kĄćĪ’z!łų sÕbw š|t“ŚŪ[ƒüÓw2§ y“ ę8č®SS˜lĄÜ3‰œ‹0(A€8ƒT)H© A•jdm‘"m“ÖśŖż3`Ģ~æüżß’żłø'O§MŚį†,’Ä­Å2Ŗ†Ó¤įÖLČÆŲ’PöփgŸŗ9$šmrŲž‰uø„#Ōūŗ=ɋėŗĀ&U”łœa÷¦?³3Ģ%rrvūŅZoŽßĆzģ—Żü‹ē{°6k>Ņ©nŪŲēŸ$Į13?A|CqĖ`ŃKÆ'‰’¬U•$įš03U#˜ l†óēæņ3?ļ3>įé# "œēaXƒ€G€īģ) Ö»Nh0ŒöoF@EańE~ĆŁ ³KżśäŁF²bFFŌ!*Š<ć r ž —(ļR¤ŅõßED‹kå ×1–¢3L{‡'PŒ“ ¹1ļSõU¹Ć˜c÷ ‰’Ö"u³†śK15(õĘb^°Q­õSV¤f-Ž|XüĻ…jŪż —bßmµ=óōš 5'[®1<—ŁA›*;>]ø²‚l}ų„ź€A£Ä¬"ēA€ lŲ0łüQ-–ČćTD6Ęšl^æ–åE\,“Ŧ~7j6q0ĪńMVB‚|Ł1‹“ē{K¾ąDĻć!$lƒ é+Ÿ‰ęzJF„¼@=„Śyžå磣#iHi“c퐭ߊ„śYŽ×€1ģń5E-ŸšņrƒDĀO6ݟ5“ŽR)oӒ²Ėa£q(:¦³FÓ`5ōŖ“Ć1b±Õ@RcŒÄĘ€R Zė"mŽä˜ŗµ'ÜYKÖoś»æŁōś¦o )¬#0‚F0²…Ę"ž„‰0VMø”ūe§ 3 ƵJqŽ©«ÕJĘßąąč]§ŲmŅõzˆęMŲŚĢRų…udj“ÖĀź uIöĘkT¤”R µXs%ķ=šņ+_ų}?€£A6|ÆÅ•ūIĮĻqŻÆXĖ5F,¼}³ķ†ć”ę ­-_٧)-bäʄ^M~ĪJZ.‹"bŠap.ONŚ<ŻąžSN"ät`µ™“”É$2_aa+1§™Rķ~f9WŒ9õVWŲvŁoTõƒXĀļėZxęHn$ 発ˆõ‹ģ6h;ø¬óÉ® JxŖŚ¤÷2"O†­<8M:ĀGf õĒ/}ŁÕW\ł#æżKļ§įjf>Ķp5.ŸūŸżĘWæę?’Ą÷=üĶkžĆppHČ@HŚh*‚ ĘŲ<Ł‚­(ŽrCg²¤¢¢nŹ3¶0śjGbµ@źpŽ©’G†”ęWaFŚķœr¢Ö½›Rž’›ÄŚ2+ņcG¹čÄ@mM4v]¤[(ˆ@{÷ YƒŁŒÜą Ó[)­‹9įAųO"Œœ§,ĘĻI(‘ż”ѳAä`Ž].ź“åŪ'<‰Će\Ól˜sŽl-ż7jÕu`FķĖ•(eÓtˆŖC1Ķ{ēüu*®j›t"`©o°s‹MԜįō}Æ6€ ž”„ų„’Ė ˜"s*?ZąŗtֆĀ <–)Ē]©ēēz 'žē8ˆ o(ĘĆé~±l18M®— š6“bQ鹈v¤ÄšPū`F“ė6.b”o6AŚūµ‘0l…;“¦„Y” ݚƒdĪžā–sœ’7³ąĢ£'üžĄ zÕv.8`,ónzfé„aŃž ±ł®V+ß­u(xB+=xŽč„ˆ£6JQŽG ŽEGŹ#;do²/ø”UB¢Ī¶B¬Wƒ•Ļq—GŻuŹ#`W{ūK7_£6śöW^÷7ūŽw¼ćo|ćļ’Õ_œ¾ß5$żY¾ł‰6Ź”CR:ʈ*ĻCp'Ń£€ÉCHEłØI›MłZ7 ưŲė”>“Ó$€+[b°t%ęk1 ·Ūp°ī÷š)ŸōIųGؑ@ ’Ŗµ~­KvåØõäS˜ÖGŻ{ęBv̽BBFN|ĖŹ‰•™½[v `Uˆ˜öK]5Ŗä kšĄ{gōĘqDĤӭj “õ¢$vtY)²`¾Śs”Ø-63 d&lä 6ł“·>ė·Y1*dw/ŗ4s\¾¼” }öØ4|m¼Õ]`įó¾ėD’É©½[°Ż ½œ§”DtšŹĆś 0hżbß9ó©jŠøma§FŸ‰vqfŗžĪ’ė÷}ß·}Ó7Ÿīūa™ąæå[¾ė»æŪ݃˜DĢ]į–‹R uāŽ9@0 uBŹķ‚‡ŁóL č[Š„Ŗė&ˆ¤A(6Ó6Ć:C Sfć¼É ĶwŲõwézb£ Lš z4Ŗ£ńf$P¬•t !ĮźhŻuŻZ`‹Øpƒ«:ĒEą©ĆŠżqB§-6‚€(×eք B7ŠĻz‹öz†E—ŃÕbĖąF=i•/šóņņÅ»fā¦3<©)ųž4½Õ¢ė4čSŲ- Ąŗ]v’g=óÓ?ż3žżŲĒ>öōż/§SŹĄHDҌf}3žÖĆwÅ-Ĕö*A6jˆPæ¼q&Š™pG„Ōävū®cY£ĮŽÄ] Żw£µ•Šqa•Ö@]Yżd"kPaK¾Z±«Õz%¹¹H«3p¬½4h-{»­!ՉꄁӶ=§ŹBż³ŃŠĒ ÓÄ”YÆ×¹ÜĄIł›^MO›'"3›°—–ķ“ųŲĢr¶g®”u1^bhł¾^|µ˜¹Ų˜hfW} ƒc’sOq²U4†õzčŗĪ—kVRųĆ‹E0Ā`Ž’oūæśg‡Žš†7<ńćžüéĻū|PfJė„Łāś¼Ly4ĄÕj½\.ü‡ĀEī£S €żĒm—8¤Čä7ZŪS;”ŗōnUh ,įv¬Uī>Ė,M†Ė Ņš²KSĆūoYĶąččh9®×ø×ĄåØp6÷Üs~ļŌ)čČ=‹F"šäqŚk”ŖŠdC„'ļW~7 ŗė:i+ßU+™})Éx zL»Ņnc“HĀ–-”»ˆ–ߦv‚9'q>IQØœ°@šJŠbŅfdxłĖ_®×Fƀ’śuÆy÷»ßżŒg<ō8Š7ypppźŌ)({ņŪ÷%1N`‰ŲD2õ5ɕ¶uHz&·]|¾c¤–+ öź†6ņ;Ū8i;©ŻW„Ü_VāįĶś~'õŠ®ŅJ‡-¤¢1¶°T `+ ŖėH)O7ā*ólG¾Ī·źSBˆų'/ b„tHĄēń§~ęę›ożŚoś&X*8m©ś•Kėņ†“#Y‡’™ÖQVČČv˜Čr²éΰĮ„ŌxÕsŪ.!MČĄ*yвƒ‘Ē£Õboł‘O|Ņ C: 3āų–‹ļż/æōcņĮ7 G÷<ąƒ®æī†ˆ;X“č Ė–6üN@†C™zDJI®č`Ž9ZŠ3µų¤‰BÄx0“fAŃ(JY€ƒ§w–æĖžA0 X†D}ö'£õr¹LżaõŌ\qf$GŻoµ6”,Œļč/… …WĄĻRakh#E(œ©'¼……Ū6ėŁ¤ēošłz8_44{«Õzo¹p½m¶|a1™8Ł(_}Ml2BD“›»ny5с# 3mTG¾DlŒ&Ł)Łö“8¬Ē·½ž /żÕßüWO’” w’ȏzņm‡ē7ĄyĶ€C#˽…uķõfÄ J6›‰Ѱ! ]ö–Vžcwwš„2ż@lŖU±Śæ3 „$¾Ż€Lb¼6#V8ąRĒmår Ģ]߯GŻwż\ū ›o¾yĶć“>ä ļ~Ē;łøĒłXW)%©4RhéĮ‚Ų,L͈h3zXr’~ōŸ ą-Ö££8śĀÓąčŠ!)ŪF‘pP‹īūފBū/ŽX…bB'£Ģb‹¦›DX£Zt6EĀL‚ ĄŖih[Œa˜y±ģĆJ@ŲY€>·¶7ē@ž½[»|Ō*Ļ䦅Š^@˜zƒ{vMŃ*̳%įqLH†ØŖ@9?njĆ"WĆiĻx»‹!ĻqHŌZĒM.ŲŽug~ĘiŲHĶ`£mø<øŠt©źxIķČĒH<†— Ÿp_(@4 Ä0š¾ļĻ.G«õĮø6 z«dz©ļ mc OŪ&¶A8©Š5ņJņu’›ź¦mhlBLĒŻØ¢oīn®$„åDœ•c;ęŌļV'œSz…Š&‡ÆżFT«e\ķ\鶍˜Ž­ŗ ŖW³Ēp_Ōēżƒ®ö—‹Ē>ö±’ų¦7Ź©gY½ąĖ_š~ō%źPJ ņB„Ėjڳہ¼6l10nŻå™ięõœĒ)M–ęéżóWń‚¼ą ÆyĶiµxž>÷ŁĻ~öŻwßłāæųOžäßžmßż ų€Ļ{īżõ{ß~æū]#ļ_V„J»NČMĒFä ƦJc nf,yiqŽ?Š)į³·±Ć3•*‡ŅžH09Ü`Ą›…“²į ©šLd(“‡©CP±?ž< ėķ0é8Ve®ś(g倜å>ų_8ϼĻ9Œ©s0ØPĢųåU)Īä… w©l" Ž©;@ćk_÷·|ąƽöAö/|é&åßš¤3e¢[Cg\•ƒ("ūåØdŠŽ‘ł$Zu0k­Uß7Œ‘ī÷ØO/W/.»į×_~łåßżżßū؏|ōÕRG«J,* @ ”0{ē%ō°®¾^Æ÷ūīęy½^ļķķ% ‡Fk"вoqrńćõ(e•zĀY±1¦ėÕä€(OrV Ūķ£UL’Ē6tH‰ “RęŻõJpj¼’Ę/e»” Ń 4S ‰Ą>½7ųSW¬ŽÖŻ¢W*ļ갍:ŹĢRēn»ŠX1ĆE N®f/ĀTJ©¢N{ ›ćsūķs»>¼s/ĻL……™Ņ'mŇ­ĪÖā—ufNōejLµH:dģL?ŒQ1źRÄĆ9ćNŽ?ŁÜ8£ 6Z,µ†`Ńõ’ž+_†loŒh×­ Õw–. ˜ˆąĘC:ßE†'6TŸ\ [˜üĶΧjĖ)vĆ.‹q¶ZjE„ͯݽÕԚ,¶š®Śü&ū]ÜĘäėœōŲL6’“[¹īń–™4Ÿ“F?tJ)i+ņÜﻟūń½żoP Źp‡HĢēaųŽūÆßżå_ƒBÖ¶ĒM6CӆVxŪļ ÓźM¶óĪŗÅ%‘Ė0ĪĶ‚3€±”ä³cˆ£‚QVĄÄp×ÅO|ŅGŸc~’øśĖwæõæś•æšæõ­’õ{¾ņ[¾śW~żēļe/»ßWüęOü –{lØ@ĮŌé&\@ÜX‘Õuś'Ł’u™ Š\§ A‡ GéŖ@"TJ“Ü–ōYt‰ķįGppp¤P)5Éf|x”>y» ^žV—ø€õzx~e’{Š:‘ģ Ÿ™_ŚI¬¬ Ö¦P+łI­<ˆaZi»“Ī5ļ`ZźiSh:7éČÄ7żćėÆŗā²ž°xčüwõjŠVUČ¢…‰²ņ 9qQķØšŁ²(4DM³MJ ēnČž_­“ļc9R؜[u‰ż„®æī†»×ēžźÆ~Ķ?¾īÅ?’s0źpŸoõ’ŻD  1’a"ĀQRJ-—Kg-Ø'ą:.{5lLņH˜šfU–“µč‘hõĢĮ”‹aJ“±£VĪåŅ$Xģļɖ¹éę÷/°3«”x×ŪßaSŠ †‰ A‰hL»Ž[ +4mģ/1ĀšŸ\HöQ¬h³a=9^3·Į0kłce?3ż‘‚±wUh"k謜”˜ØAUŲhN»‘m­X3o‡A¬“6Z\_Ō1QNĢ`Ō:@ѩӻGļū~¢?ŒóyŽ2įŠ.&1ODl?.ČćÄL«ęYäL`°²kĀxx¦uĶßļŪ›-ĪcŪóJM~¦ńœAģ&;rÉ_ĮŃļQńÅ[„v}¹5Ixb‡tāsxź ŗīąą`±XD굚µv„ö`V”N.o:(Aąf¾„čU nFkpüüŅ팾×pN¾³ŌR‘ĖDMÄF’©XńŲN߈Ė)ĄĀéŸ^­CDFėÆłšÆYŹ’ł¶ołVHjL¤×MGD-Īsōķę˜[8’ö{ū3ŖŽTGˆN¹1ˆ‰Pu$ģĢ6Ņ£ńa$"†½ŠQ©ÜŖ“ĮĆÆ{Ų†—ū‹×’Żė†»īōąˆv¢įŹK’€Ų÷½ź( ŪĀųs½^ßqĒuæÜNFż).f u²Ņüęō=Qī¼–Āņ”õēPm1]Fk­ßįĆĘ$ÅīĶ켃a”RwŽs÷ŠG`Ķļ|ē;Į؄€Ø¶ÄȄ',)Ććz0‰l Œ@ź=’żś©±2.2%D-–}¾V„MNąŌ¦ź ŁĪ€/ØS€€Š °Ü°ńĄkØ ›q0#B§ŠĀó‘A›^ß}ž¦·¾­ח ز_TsH+įīŠHå”j‘[•ĖAå™ė“ vĻvhĒ–5nķ¼ŲP‘ö›[6ẻBżÕü93Ø­7Ę;aĶņ’ŅpĻŁql‚ T{˜Ķź"†ŠņkIżv2F:\¬ė«‰Lå6 p“^_yå•’žß’ū?xŁKA|SSČĘŲTė&™µ™:lIĻ@īļĪÉ':r–ŠF©<·“Q^lĪmąpĖrv3:µo“įJ O’¬Ąc.­\p{ƒ#ˆP“ä ’£hj¹“ZÖ-ÜhmC]¤²ŒI˜lb›ŒyŪßōĪ·¾åÕż‡ÆxĶ’„k.ȇ}Šē}ƗæäĻžąś«ī’iö”£;īD£ŠXķŁŌėX¹Ń/ŸÄńĶz„/PchvŠyt؈+3ÉĀĪ]“r7ŃėłząśĪ#ć{’īøś~#ĄļżŁ3)„`±¤S°8õˆĒ?įöē>č1F0wßuĒūßųXėPŠ“1”®š‘ąlŠiĻu°óLÖ+!»Ųt©P™Ł$ŅNfęņĖ/WЬ^K°&ĆjjX¹å¦īk¼īįū¾ó;ĮŠ#°BŚ}×Å7l", Ƙlę²'Ü^IÖó(ehvŲ +ŹY|ŸUä"(ų|łļ¢ä‰#åa=H*Bj'¼ßŲŃ¢Ō•6½IĢbŲāsr3cI ‘g¦'‹yšj7ˆ¢((ļVėē’ūÆ>žŹ/ųāg}Ņ3*4šżßż}|ŻެnÖ?õc/`4‰cīÄ-°=&­šŲįr’§lŒźŗi·0« d1=W7tóTōœ.o7Ņ‹…†€z „ųłŸüéļśŃzė·|ōć’÷ž—ˆ @hzä…fe°ÖēĪK^öŅū]vęĄg~Īg)4h4Š§ØAīu§~-÷Ö,v"r”ģ uNuɎ"„@pĢZ³ū‘ߎXK(č¬/Bˆ p꣑ć÷˜ŁhķčHCRŠŚĻ ;§œAkctöe®R(6s"¾jq3Z÷ށü(¹øBć‰6óµē hŚE†m×ĘnžÓäŠe‚ÉI¼*pq[¤ u¢4DT‹Åg}ös~ē%æ¹8<ī—_ņkŠ+@E‚į,ų—˜ 2ēFr[tRŅX(„~0ʼnyJÅX~éæWuŌõj½“Žąµ¬“ą±_öo|ė›@)ڧž•śJg§ōżY÷ØSl"ņńÉ5D¦eį»±Āq4Z³ś¢"&*Q~vBÕwØ#2’‘ƒcś[Jč>ƒ†H$’ōO’iŁż ódoÕ4§¢ŖÜ€Ø—„é €Ö0®µD¤ ČC`‰jŗßł­ßm€¤)˜ÄnĪ4’C-(@ģś^®cĢØõąA&’ „›a½^ėŃksŪ’ČRNŽOxŽAĢ%ø•gŌUćƒTŽbļķļĖt)$ĢW?ļ >ėé’ņo’ņ’އż€=ėYŸ"£©vPyiÖŚ ¦ŠµŒ?Ō1·»½ćW)a^Š»*§BäQśĻcŽCŅ$؈·kØÉ9_g"ü“n›€Hč*O$y13ŠŁY{ ƒęÕv„„J9(ŸĆ•9°å»“ātm‡FIą×žlÄ ŽiļŠž±™Q€Oü—Ÿü¦wæc­`…`^’śæ’®ļž®g~ā'Žßüŗæ/ųcX 4ÖĪ0ą¼\u,>™Aמ:d¦Š8U|X9ŽÄD†Åį\stE›ś†Ē$ ķlų4ū¶‡ygīĻ~K¾Ļ¼K#اöRYyX'F})õŃcŸĻJnڽĢ8Ž“ķ²ų%Ūu%U£ĶŲÉD#‚®ÄZmUŅwŪŽŻĻåĒ'ōG‡ĆĆš’š"&`… į—į—ļøć޳§Ļ¼ō7~4²"ViߍļŹMv˜ĆĢ¢„ÖÜ/$2ĆšÆż>÷¹e'#0;łVĖ)l„-½qÅ Ųöé‘+Č^žņ—+€…‚Ļüœēģß÷>lĢhapHB©ŪŸźŸöŒ§‚³#>ū#Ÿ<VJu =cM¤uW\ŻZµlfķ:A7`ü½Ž«+fŹ%Tf€~±č×6ćÉ'4Æ×ėaõhlå0.‹J|źÕ5€ā>Ž „ō8z¾“Éb0Dµ×±+шÖ„tĀ MZß)„(Ó|ČńNM9Õb?tA;mņ»C0Knśdj&Ū^!².wśBG½ĀŽ,ō4‘ ČŽø=įń¬ö–ĖĮźĒ2 R,-Ē„›lģż÷»@@bV|œN%&Ų‘É˜ā,c¾·ŗš{&ŹY¶®T啕U¹1‘¶Ķ9-6I įV1¼%a00޲m^£–ĒōmĢįS“dzĘ8=“ڦX¹,V1/‘—ž$‰vˆŠ9HKmöœG$ NŽŽ˜YėøIŅ[oÜ,ó5’īsެX?ż– ˆ-żOŌĆLū‹}½2ļ{ēūŃOÖG ž×+žųńׯšŌxņgڧ{ļūąh„x4€ĘŠ ’"DÖķ7™Bæ‚1IA %0°aSCS€kå/ņ%ź}ßW} ‹c1ČlF0UEl— s•~ †v²=0žš’›ft܆ ‡q\ąa”Y¦¶‡‘‰5˜‘•8)öć–…żfĮyl-ŌĢ-P×sō7¦ u•€s±č"ŠZ2sß sIkż‡­#ć8jĶó£_ Dl°Ō½…”±’øa †auq}p; ’¾w’’¾č¹@‚ŗ&ŲļńÄ'|Ł~ńżO_~īę[.¼ż“Ó ét¦§fuPūõčW€ebÖNŻęĆ÷ßó%ĻžüWüĘ’ßw× $™®:LUēōt6T€±äIÄÜLĻdDt#iā9…¬FPėĒ}ąCļOź#ńČkņ@ £:0“2dż™/yī—ģxų£®{÷Ķļś„žh DÆeóüH„5š½gaÖ/#Ā0ZxFßSģ?k€Ķ8qk³„ž .²ķø² uąpŲ:É®Gū‹e§.—˾ļH^œ`iĪ7‡ašĘ$„2r¶Bź°‚Œ)Bź.?ö:9hżĀÕŃŚĘ]×)„E0@TD’†=FXŻ(UĪ Ē/ś€:é{m¦,"fµHYŪ-ZB§ˆ|Ö1"…š¹šcrčŲxŽĻteėˆliĄ¢÷L’“ö3¤ĖF`«£õ8źD%e=’4 @É~a£õzµmAPkFT  ®yųC`\xęźõaO–…ˆ@ŪĘŅ@båéx20®ĘņEĄšŠŸG‡š<»F0N„6߁DabĘĒl¾?ÜŲ`rBYūw¢Ļ'ą [=38B·&5>bsśĘ×½/j­ŒĮf#•=遁ØstP<YŲ„ ”œLé:ED¤Pu@ •DDrcz0dkØÖ@`ĢČl "K`:%FU@Śæ€:ŒŖ«6&¶õgĘÉj9¬Č’F»ZŽP*:ŗxNķ/ĶØĶ`€y±æ<:ZØsūŻm0¼åo'łƒ¬‘urt.ŻbÆO6øtšF5Lš:D¼Xt‡‡µ`ÖāÅ>0 pŻ–ż’Ø×Fnä6%»7 ƒ™¼'"$ūČĘaĶDŒ˜ 4VlŪ Ą'@óȎ“:B  ŽžĘ×ß’śæųO~÷’Üų÷7źƒ3÷»ś÷»’÷}Ūe$ÓkŪč•fæu„ööœŠ¶[+‘.3h-Œ{UjÉF  |Ÿī4œˆ?šµÖ"Lk9•ņ PśYj‚‘­#‘䔌1ŽĢZ78¦`ū£‡'[x§a±č^ %čłÅ[,WŖxc¼Śą|mĢB^Ė›>+*:ƒęxjB¤I&¢ę'K„hlKC….{"0n܇ԅR|ČlĆńŪ³ Å)Ę*ž²Z­’RäI„²$‡'»FRŒSPAŖ‡—™%S(7&!µŹIw¦Kł"X‚ ‘õļžīoļ\õ5WøĆŹb¼ŁņG<żi’ųž÷<šał‚/ż·ÖJohtŻÄ@HNłĮ0Jü ¹įqo¼ńĘ'=éIæōKæÄĢ,ĢU"$M†a¬$‹Q~Y¦¬VN²¼aĘm—Č €é’ųOWFß|ó͟ž©Ÿ.ÕbD‰Ų‰!|ōĒ=åžų~ū7ēĢ©³’š×Į`„±l¦!:špš©ćXŌbuzĀbqe÷ÕhYKv)† Ī%d'J¶ iŅ6fb Ą¬”>˜Ą#1AŅĶCp7lēˆp‘ĄKé, O‡#ņ˜“£qCµÉ¢(HžĖ„VDК#€‰§Ō†dó–žæ%)„ņ˜›fŗL€Å: ó,‚ś˜S”eF„årŃõŠMka³Č*RŅÉĘvšŁū˜§Üsxń¦ w½üožĻ€z@­øĖŒŠY…ńŸų÷}W<ń©¢ķ•r'"*ɏ4Œ³‡}*sˆų’&^W‰ Ōm?jÅ5 0ßčń¼8EżĄ?¾īļaѳrį7”øĪ!ģQE ņ›7*Ąŗģ¤K<łˆš!é#B„Čõ„ęNoPYzÜĪŠŖŹ÷łöfĒ„Ž(A[’vcķ)ϐj·€€{śż=YfŌįŃśPĀõ|äś®{ī6·Ży°qˆÉÓ“„pž”š‹"ÆŗīņĖ/EB5­ ĒtRˆŲ-zF˜Ī2/ģ,|Į¢R§ČR°Yµ9$ņ¢Į¤”P—‘˾0 Įą»d%øEļØ>¹cč^ō=?šSW¬ĪÆ |ņ3ŸõSæś‹ŸńeĻĆ  (,£Ø<%ļL’|¢š„˜Œšmń3\r¹j „nsĘö{’źn£UŠ“Pį2œļ…}L”µ‰‘l`Ņ¢ćŚź@o޵”ėVaZBZ žēŽbž‚-›_M… FŖzŁ:y’/5m?*Ļ4—;łp³<€8Č£Ńb%ūå±ēƃ?ą”_õ_wēśč5Æś›ó÷œ;»æwūķ·¾ć=ļü²ÆłŠÆżņ/Öӟ>°ĘNåUdž.eNˆi’.…¼=8ü®a$*–xx†\‰j.h!Ģ|Ē Ņ‘ō§Šž¼Ģ°1āk­Å1%Ā]ZĶ1Vm™…^v]īĄšĶLÓ€wīŠk’Ž‘ļ9iś®QĶūS˜a 73ĢiYa«ˌģ"ģHżčżšŁ½SjŌßśµ_ĻØ%'ĶĄ Æ{ō ‘O_~ŧ>ū3` tgo¤{­Ū?·lźäÆxÅżxķU÷æĻoüŽKUO²=4ŪdĄ¢¬ƒć1 fV®1+oĶŪĄ›ąĆS0?)WĆk_ūŗżnłĄ>ŲÕi ķŽ#ģž6€ļŗż’āžžIļzļ{ąS?öćAēS…Ŗ`ČFęÕxķ^Ū.ę¤čw¢co &¶p.d|z $Ą0k=®FpõXźTŲ`At:n#ÄĪsŸˆā`>S—-ž\Eʗ(Į»q6!óß6ŅqĢ%å‚&Ä=qօa[)e„ĘŪ Ę¦¤|sL +ą Lg€G£…ŪÖ ;OH[~_Æ×\ é™yŖÉ!d6ī»Ęq“^›ƒõj5¬ÆR‹ĖōēśĮ(W¶-ųLČš’§ī½ć$©Ŗ6ąēÜ[&īĢlžĶ9ć’ó’D$£dEĮˆ ØdDT_D¢"¢(9ēœY`s³»»źŽs¾?nUuuš™]xßļūę׿e˜é©®ŗįÜžó<š>O’A%ʹnQ‘ ‚Xg(\ŪnŽ#04Ń{b6¦’l™*ϳ$Ŗ“`†)°—^ų³:č‘M-›O˜qéĻ~RÄ®d)–-©ä?Źb źŽµØDšR:ŒxÅeµŲ¶˜$°×ü_ŒŗcAņ QšqŁ@ŽŗŁÜ€X+Ęp 0ĮÕķ#A,’p ’ •‘PģcˆŅŚq:Ø“®onP±š&›Ķ&BO>ĒĄĢ™3””[Hø¶ū]U©­+ 62>Īf·K3B „T$­®µńe*VnvĀ£Œ$V^ĄX·q\\˜IŠŁŃńžėo¢`’5gIĄ|āó%QŃŠ`ėÉ3Ž}ó-²Ü®ÓSZŚN:īŲkūŪ9»ļ„ŒŅĘ5ˆŁAmœAńVō_ŗ6:c ³•>å8H—oš4+żaK+JSż(æ »H#®;WŠ‹! ”ä^ńƒ(”Hy÷£QņY éżHntśĮK|†‡żŒ2%U?b+< 4Źŗ>>3Ųē3ā‘S¤•ēD¶˜”b‘čU«ó…>¼ņŹĖķwĄģIS—ÆZ¾Ėn;g<œS>P¢„’l©’įž·e傎‰]}ø¬ś:xõ [ˆI›%%ńp©ļrF’z”xŲ UXØžŲ­*ϳ8tĀŪÕ[Ź€—Ÿc’C‘ͲWDWd÷’ō3 AXµDćj]漦¬ĘHÕ|#Ō±–Cz”č·&°Eąhh“‹ģ™Ł9€nÕ‘ėĢtŖÖ ŹUŻ„*ä™°§8bJ­„}€2Ņa‰źŲݵֆrYSŸćS°%^¹Xm*k„óćN÷o-EŗĮœńU?"čdŅ-Ć7ذ“˜N§“\ū.Œ!KXŹŚókˆJķ¼ė.PŚ €ļ}ē»št ę/FwQ @?\śƒrąŹE”5ŽVŗ ՛dķˆš’‰‰ÖĖ“)śĻĒ!& „{aēu,_²~MūÄńP[;0ŀ¶•ŚWE½Ķʧ7†ć½©=ÕŻŻcŒu4Q^J»d‡ScށĘŲdõŪZ.ćOL™%TŠļȉ%7’¢0*ˆŠĄŽć‘ö8©?ģ’A ä»&Üć8äüšįĆYą‘" »»Ģ”Fø¶­økÆz§šP»J`v¢l“¦',”8”ܛ™#’T'šH/6xŚ@a‘aeUϲUcG ß}Ēæ}üIwŻų{Ēp”P”’(žõQ8L BŒŽ®ĪÅKū:»ÉpŸ ~}ė-מž·¢įųĒ`Ų“ßoŲSu®ūSE•2†ˆ$§YR ćŲ/c0§C™kŻ īąµy“Ų¢ŖīGŁÉR¦uü‹įFFŸÅg|j@!C#^ ĻŻg‡!W}p5ą ŕ‡™®>ļ[T©&Fš*1–¬@ X` b(ß^łćs&7 9ą‹_č?õŽė+‘čчO8ł«Ļ}üĪæŗŠ…”J:ŽjŗÜčŖ|(Åāö#Å'­‘­4Š•®Ģ 2čH4Np”qź”8q”²g‚Ļ”\…¬2Sņ” ģC+ĪEæ4SÕčę«”\śI¹‘Œæčr Éõ<ÄČąé«‚ĮdkY¤ØoĶTKœ”،ī(ī%yčæ+VÆTiÆeʐb@Dr==*•³V©u«V×§2#Ū†ł¾x“Éc©#«<µV!b„ųčcō”źĢ÷"§Ņ>[VTDś¹*qōJŅuTjŸTµ¢buŻ!5ÜæżĢi?·Æžö—;}䱏ę}Üח@Ba;a¢’jyCš.žÕµē_u™|ᐃŖ§åūõņk‘f•õ 9ZĮō,TEÄß{s?ŒIe¢ź«TFŌΚEėl#ų£Ž˜ļ÷ AHĘėbł¤£€Š AŚß‘)Å&GėÅĢJSØ1“č[Vz€¬|åȗŃķ{ž§Œ)ĒP”K$hĆŹ“Eڱ!'µŠZ&²7ØģP‚/;<“Ł:U‘S ŃĶ„2BņāŽ ÆęiĻ•?ń„t*­};ŗnˆW°0€eĘV¶Ÿ"‘ŪŪ° IM *"TŲNI„R”„'’Ö)“+åŚĒĀ„ØĀŹyŒA`+q3NÕķB¦.«ˆė÷ž³SD–ēæóĮ„gœ™"„«²>§ætĒÖŠ’!‚ē€ėV¼”ŠŠŠą°HD$'aUI²#ÉH@Q/Ųy“ńį5“kOe³™ØĢŽ˜?Ŋ#“&‰±'_€Ėä sā&—ŅN8S˜N„X±b…Ćg[¶!Aķ†Õ2{_š†/‰bd)åy^Ø`„N2GĘjR+Ś ”ĪQUĀ!ca%£ˆ¢ŽxšįæÜpS{s+ū¹_}ķŹó/8ś€/8…p\¦¢Čõ‹ƒmh”ėÆüEėšaKżŽE¶g“Y›ĶŻ÷‹*›“‰µš¼l­ĘØĮK–’¤L’•\6­H¹R¦Ümµ˜Ŗ&ųYķ0Ę«ŗĖśŃ$ŁżŖLx‘ŃēŅEż2n²?yĄ±JŖUmwćßĘĘ T„:L’kŽėæź•ÄN÷s¹AĀī7hŌ>{2)‡HčŠK.Łqū9·\}ķĒüöāy£‡jdłų£yĖ8×P_·É>»m{ÄĮFĆ8R.HŠTå˾/s×ÜB‰ų„/¾ōōs3gĪ Iv%¬Š–•s˜””VžfČŹŽµ X³¾A@^¶źb Høb„¤2¼”ī2Ž9$t[uÅQ—š Å ŃīӋš)h'ż%Ö]G3 @Ž›J8®iĮ“N{Z‡%UJNGE!Œś5Gq€™*J©EŒŠ±ĒęšWk™µ™<’QRā£SN $!°¶l%p•żlŽźŪ?i¦Æ{Ł¬“o±*rńpq3Ėazӝ/ÅyØź †pśX1j»…8ņŽ‚ üĄoo5sęĢʀ±¦ Ć[ КāšŅ&ų «ģč$Ž—ĆŠPQKŁ…ś»'GGONf¢FTÓņ—]ÉZŃ:*ņ3~ųį/¼ų\« {mLJoæ †µF§<)ƒ“ ŹŽ&Žņ²E×Ä*ցƭ‹ŠŻźŪ%8ެ(”ēuŹ„ĆCØQ'¬YĢę*0‚bfE*nÕŠ„ž•1Ę-xMŹZ«=Ļ÷żL:jŸ8wKkŲ+D‚O?żTc ė×®sŃø§“[Š6Ņ„¤Rś†ä– ‚@kw$‡"“œį>Õjµ}ŖÉuZņØO$é‚<ņz—ÆøźŹ+,Xėꨰēžóē/zoįBXŤB¤“Ž8\bLĄLüč£.]±4“Īššė/ -š=¢D锲ā‘<Āg-bE{³–."Ē£åWZ” Æļóˆ ŖA”¶ĘU™„|Õ5ą÷ƒ©ßnpŠ7PĘG[õmń”t©ZŽz„e®l8 żŻÆļ÷ł ę€üŻŁśģ!ńēņå¬0€õ+V o™†n¼NƒY6iqŌQGżą‚óźF€r{W µ%°p *iŁ­µq4#Ä6ØŽXIXĒĢ•geŽrœƒ¬„—ķ“VÕOy)ę\)FŅĘę§2§NƒĶE…’ĖTWš·*Õ0:Q='"÷—PŌ4q©øAh#3 …L&Sk<HŌJXŗ®¹äŖØ\$eN¶H"–±€8'Õ­·JK]>ÉIK„gĀE6³Q¤Ły÷wŽyg󭶼ﱇ”xn\—°H°Ē”Ł©TŖeĢč»’ū4„9vŌ’v`°¦T •JY¶8äąƒļ¾’ž~ģClrc«ŗ4ebG ˜[éß‹ Ć9·õ\ģō~+£¾jÓ–yKŽ ÷ÆĆŠ8‚-'bģ65ŪčśTžž ÷¼ Ž©BóUkļKYå5±å­$›„…ĮĢŹ«Ņ4Pj¬<‘(„4%-ŁģfÅa"*&WiĒĮ}9«•<}>߯ R©T¼šŹa•yO)…EūĄįiŅ€)åBVnB™Ń"ĶélŅy¶­ļżū;“ÆćIޑآB#OU}ćK9Ū0J‰č¶JÖĆ@īvü†ø“Vī@¼W •VjU%äMĮĆTéz„Ņ*•3…N¶Źv žPČ/XuŪb”Õ1ē!x*šM*ķ”B/'œ_Ue9q{ÄłŖĶ>ƒY„Bó—h“Ö֊V‘Ua€Šµ®«yh3¬…§Å˜0 ėŌÖAMgŠOj-”D,D{ź„_Üydžiéģ\æŻ[?ńņ˜kmJ„°°ˆD’ÕÕ­€’­ø5)‘“ÅĪR©t:ʤ$ęr?™+¦ƒŹ­A„5sžźś«Ę“Öą!©¦\Š=Ŗ®žOæūĆ]wŽ÷ųĖĻæ“xk«(ēldKCo€mß²UGĶżĀŹ•+ßYæģÅW_Ł|ėmā3×9Ć$cČyžŸS»~Iī:)ģ¬ĀĢĖ`Čū ‰7Č=ŪŠ˜YjB«VĀ*gæ8}E[V„;ōĄ“Zmæ–gēØ{%ĪĪT=Ś>K(>ČP®l¬’P‚d…#öĮ3•Ÿ€=˜jĢWĒ…Šø>žYŌØ?/é큻ãW`MÜbśŚŪoȇ]Av‰a9åŌ“ßź\yīM××µfOOūÄ HA…5>7™vŖÜWUį ńŖ„|T„—“l8÷"žó؎÷”mŻ’öŒä;%b0(ńģ6–\*<8b\kč(åYöbz°F˜Ł””Ų–’Žc‚p\N ˜D›÷³0”RŁlօš„cäŅ…£Ėx’ŹVuL1•­.ļw™-SÄ.žA„ͧ! UE^½j­ xƌ°Ž(9ōDu„a’öövß÷Ÿzź)†„õgĶ…U„ŠH&P¤ąé¶aC=`DkėQ‡R$įbÕJ—–/—3Ö«µ²†µŽČĆ+ ]ÖZ¶R$NēyQJ7=0Dy¤“Žå””ÖN€:Œ‡Fb» ļæłöo~ńĖWŸVHy6$×Zg³Y+,%££½‘Šźīī&ŠŗĪõŌ¬Y³ĄL O{ b(Rµ³H…!"ķ­(+RŠ5-ƒ¤R)H‰_fC*G(¤1ÆN”PF ĄPL°rÓM7p ¼•AĻų±#³ŁōĶ·ÜE;ī°Cßņ%Š Š)%ĢLݒ߯^ŗ¼9[ļQjóͶtr@JL˜„%­-ĮPu>ŽA†ĮØŹˆ.%~Ÿc鏓Dk:"ż6>‹{6h6 Ø9q`Ļä{”*ļ6Ģ?UOsS$=‡ žĆ®Zo|ka?wR6žUÆYõ=ƒ±ž§µlīŌ`ŗ%“zQŪ0éķ胒Xü2ƒ’Ģ>:S"€¶aĖ ±)­œ# š^{īqę™ß9ō ž~Ģ ¼®K¬üęʛÜū ĀH{«ę-xä®x}6m–Vą¢IMŠQő*jšŠõÜ/ÅZĒe^IZ÷dZkcĀd#³ūP”0ł$ŗ†UĖŁ«Ä*&M¬@ž„M¤ŽOj)YÕZÄN$Ć9ĘģT+¹üĻ#„ø˜sOBĮYŠ{Ōć:˜ļūešĄ¤KEi#¹X"§Ģą°Mö³1ĄŽé2L0WŻĘ•X÷~Vf-ļ³2Ē‘ŒcćoWvņĶ9ĪÉ6V@°Œ y¤Ik%ł9+ņ²”z'1(Iīd€,± nŗī†?łpĈsęģ x€²VDĮŗ·(K'yś >˜0±¶ą i)Śz§Rī“"‹7– tŽX‚ Ģbø„ˆĄrZ§ČDė{z °Ŗ£c‡Żö„„ ~Ģ`Ųd'”ÓĘ 9(0•rcV®fĮ#©[·T¹2„„ā· 6¶D—;<Ÿ“»Ģ-/ ØÉÓ§Õ54¬ėī@ʉl"¾+”īM§ OAĮęrN7|ń²„eas1~.5ō.YVf–Ć’u¼Ķ UĻä— R*:KĪ ˜Č(b;=aIˆr«ˆōa±s”™…T±3‡’4ąįŒPØŻ"pün ēwzÅQD>ļ³¶āžD)U__ī)åҰ‘s:‹ PøLV·Ō³'åxž¬č”Ņ)U“$”zõŸ»¬Č5’U*qœ%ÕMcĆķЃūčJt•PXõ}Ć%ŌET–c •{…4iĒķ ÄVÓŻ­0Šéūw¶źźźā ÆR*dĀu\…’³ńŅZœ ×-“F*T d–½tؚk™µš”0kņņ…J­ģź\ŽŁŁė÷-]±`ri#ˆ†čp7‰ećauĖĢ„ØėV®zļĶ·[h‡n(ŃĶNŖ”T ƒøS Eī›"l&ާä¤wµXl!V)*a¼łŹėiE“F:jļ¹čé  ›6D¢"¶=hm”˜ōč©rā7¶4¬·=N½;²` ®Ķ5P*Bī4~9.Ø+ŠŪuÜÖ`#ńŃZ[Ėn/”„oõ4)x)źgĒ‚I ¤qøžÄ²Ÿ/t|ŗ}&T“6–!“?D!°9ŌŹ‹“Ź‚õŌU^²nį2Mé3N:å»?žĮœŻw¾ś’K!LڤtĪų‚øæHļœD±ixÖś]=Ź#CҤ ĆŚ†8F 86a ¢œčĪ)g“[‡ ¢Ā*køĄäō"ҁ“ó[”¤ŅB÷“…"]ē0•¦©Ey!õ“[r®*[ .XćŅÖ$’/0u/Zvż•—®ĻĢØĖģ2nģkĶ»ā·7¼žź‹Ģ÷żwŽ~ė ÓŪ‹˜?\ÜĘ éN ĢwÜ|ˊž5H{cš† ”ĀĶĀ!Æ”0iOjź¢× 9jāT„„…‹¢åŃ>cFŲ²‚H Nč½Är⃠xśŹŖĘŗIHVƋVb‹’¬Ž\•9‘ ü ܧΆD.qxĀŖžĄIꓲ‚_e²Œ*”MØZt)?ų$URĆqå¹ÖŸ×Ņ|Ŗė&ķXĄW:ŪżƒĻ%ŹĘVĻ.m`f”ģÕą%”7ŗ>¼qÕłJŃJŽõā>‰R€@ 4D4ƒkŅ—_uÕ]’ø’†[o¦ę:K!iƒÓĒĖĪžņÉ’äģ›®»ž£e³g#ĒV PY勽’(ß;RÖJX?“Y¬åX϶L8IZXm#U©Æ8W²2ļ^µ(±A³†yž¶ÉƒÜ)<•ŚŽ0ŸŠČū‰Ę!Ęt:]sœć(£jܞĄ€Åąķ$§ōē»nūGnTŖ–»T[Fäœ?g®zśöæu~¼” ¢”&ŗ]Ū³•l½>° ²®cm#„’ńļĘä€Ā`T§bÖ7×·_E'/éµ;e# ńE<‰į¬*®“‚ ,€BŽwniē™yĻwY_7iŹøvڹ?śQlä ȤŅītó^¤ŅœĢe‹†x°Ģxåń§{šß·’Ļ-ļ,żŲ@Dį©ü}SÓM§Ņģä D“öM Ҋ……aņŹ¦Ó;n¹]ƒx éF†<žčćPš "Z1!Ī ³@)ų¬,!`ƔZ4t1Üéi€¼ćǧœ~Š®{ł~Į7HK#[Ą8˜Cœ÷µ¬E‘ßŁc ~²“"%äA‡ßš(#SR‘G†šOśŚ‰c›†5ėŗ–±£{ūUhżĻ’ÓkŗŗÖ¬ļ?ir:ۘt„ˆJeŗ5zŒÆ‘ZÓ±nlūŒ¢Ą‘ć8ų®lq Ŗō$Ž&Éī9X‘?)«ØĮót5¶»rÆUU”ƒ@• änD„w0ˆ3ŖŅ—˜4ɤtX,ŠĮƒį>­fūGżTU‡ŖÖ”(•}|Ģ”åC))é@bŚąāy-réJm’5× B—…åNÖĶūē Œü¼¢āŖLåUA"e˜\rJ"!H(’„ÓĢÓŅO,xēŻµ u-\té~ ¢¬EŚņį~qTSs{ó°ÖlĆå_ę0)²Ņ_F&‘7A÷ćō—š«'’Å"Ž­™]ÖĆå°ƖēiadźŅ–…Ģ ¢ę)£Ū_~õ•Ō¬ęQOŽ÷K®»š4Żvćoµ£xVq2Qń?śd£` /Ąšw? ņ…;n»żĆ×_Ļ­\›"ć™7^²¦/.f†®)#ņ/|ØŽ€XRu™[~ł›wž{łė_;9€QĶ@„ąĮ’UŚB‘…,‰Ć’R²lUččŅ¢C³˜YŠm¼²ł ž}ē=æ’Ćļ–,˜?bh‘§  HAā'Ņ€g…@Ä &ų¶ į+PZ5· iih:ė;ß7 z­°žémZȅJ¢`„‰įYōuw=ōäcKV, X¶ŪmW44ĀnŗõÖę¶¶ŽBįŖkÆkÖF)ŗœä‚0m“ĒšĘÖåČĶĻu<łĮ[/½ņ¢'H …z ̤”s•+5 Ėš ?ś·*É2UčśØ¢®{|źV«—j—PÕÄt-hókÉ»ōŸA®fŗĖæśq#+°H 0Qøņnhj:tąåqr8Ł_©‘’Ŗ„gKTNJˆ—5œVT¤ŠģČ]“K­ŅG ™æ)T)qÄ*VĢĒ„ćĻp’ÅĘXæōöö9WŪi#ąyZ{ŹóBFh ;G9~†RʹŒ$ŠŽ¬ĢĀÓÅĄé(Ŗ9īä¬BŌ’©œüĘÅŪI ģyžēy”|Ō ³Õė±P§{ ]ø"„5Ö°Sń­ÆoTŽŽ¬Ö••ģW÷ŅŹt¤T­v× ƒ$ ńɂC˜†P’Yx;•›IŁl€—Ķ‚hΜ9MéT®··![ēwvVįŒTE“³“s­0üĪÓĻsÄQĻ<÷ü&[nŚĮ}ā+W÷®Z·ę£OAŹeI¹“ŠÕJJ<•ß<ęÄ?^{Ć;ϾpžwĻ\öž‡0ģŖgŜFXUvż+ģņK$Ī¾Żwߏ… pĘwŽ{ńMÆ>ūĻ’>“’.»żą˜µ|ölTŌa. ¬³­CŪh]¾K5¦»śz\eŲó”‘0WÅ"ööö&če Ž*c‰bÓMüW¤t‰ņ‚R$ RΜB.gŪŪ± K×®‡L ¼Õ¹ŽE½«›[NšōõÓæyü±Gkł“0…ƒŠLHoåf&—_±hŃņÕ˟zć©B–صibݐ±^]sļæļwy—)%Į!°AH %æ¼źŖO^{ūĮ?ßuĆæž³Ūö÷’ż¾&ŹōŠ©ohķčģFo^3iQЊ…]n ±Užń©§õŲćo¹ž\R‰,"ž!ICŃ„ż|(Rł•ė:syCVXXKØ@+'ēKRX°āŠ­v‹ōXÕ8¦±õ׿¾6čģŃ‹dRœR ĆDEÅFtk”hõŠ•”¬īķÜv»9€ŗńWænIeVw¬™:sŚōMf4¶5+¶Šų¢;§2Že湞” Ęf žüĻ#†ÄRM DŲZ¤ żC9Ń=xj1%V÷ĘĒļĄ\”x@‚ārӝwL&.©Ękƒ¼åxó)M&°½½9‘'¼”ŗŖåt9ƒ \“ē3—ؾ’ļ|Õź%°ŽųYD˜PM“²Ö;ĻĮŃ_vd_1ˆ|~_!†9é¬$Uśīā+ł‡>‹1"Ģ2iD{0™I؛¦²ćA“);”2Ą0Šł§Ÿ‘·}F|–‚ø¬i FÄē ~Ąš^j½ŸE,Ū Šøü‘kża?7ž•.Čā¾7¾Ķ÷>9®{|–Œ/RvcøóŻē²a1¾ ›¼¤1¼võŗ¾žœ»Ÿ²G®zcÜaų¤\\–ć5 "¹\®l-}–õ<˜!J¾”ų=‹°„³ bŲr4ķÅk&VoŁg•}o%ń–Å²Ä É2+–“Ćc8`±bż:`jKkpėu7H®ä>ŁŲųŻŅŪóŪK/½ų{ß]ōŚ«bŠė³ä”X²\u|ʦ8B9'*łž_^rqØ=W× ĘŠǧxŁšGVÄĘA齉1ģ^ÉU—“åÆÄ⠟ˆ„ō¹¬ˆfPDDü`D:=gĀ„/n·ōŠ?ZéOÖ/]9{Ā(X1”a)7ZÅ/· ÜÓYk¹|ųKö`­E˜ü[oɉČõöÅuö­ÖąDŁ’Ž-Xq¬bƒ™gÜÜĖĻAĮ‹ ŲīO$(˜ `JģUŶ $“ąV$ˆG$Üń=D7Ą&1‰µķ¶1¦ģ‡Ę˜|>ŪÉ =§ā1qŸń8„«51D„ßŲxį%dµeŃĶÆ¶rś?PŹŽŁĻqc­-¹+6`w¬$g3œ£*–9\E¾o„E Xūéėo&{^;čįæŽ•¼š°.Z.ėF¦`É­X»Ć“MFŖĢÖć&gįu [5©½&ĶŽ“a˜˜Ė?x;o­ģ5ĪHŁvčŲńHļæĶø9Kģ>ĖnJ%gĀĮéģŻc“­w?żŪµfįR DÖt}e}‡y™ą'Ÿ‘¾BōA†ŁXŁ+Rš;—/Ķ)¤U %WQ?+ͱ9ų¾_²ŁmÅjOnŠ‚ų½A¼£¹āÄ,‘P`¹Ä¼ųĘvõ­œæ h&ėģW÷žŪżīū‡°OJ4ŒR쾇ŲpÜÜVŒļ†ŻŌ„» —uĮ×?f|¦uēÖ g|œ»ü(ØvņZ€«/¼PLąn(¾Ķ¾¾> Œ"“Ē^‡ĪŻļ¢“æ=™ąč}šŌ:¬ hI7ģ2m3ÉE 2q^ÄOgŒyćįg¾Ü)[›¾źŻO“ŽWhį…kĈä|+ Ć@ӆ“ķ:}SÉYwFß²#øĖ›č féĒó]©4V׍FŖ pįž(¹QĀ™²‘«fø`MĮš3O8it;„¶9†ūŗÅś£4¶=Ŗ4X·`¾°/ā3›k™˜A7ķ[ĻŚ4 x@źÆ7’I‚šēnrĆ;‰ü„ķ^‰¹Øa’'yMN%Éo¬ æ‰1Gć·Wy¦ĒÆZ'~ņ=¶_kŪĘŚ÷ūö¾o’ŽČ†]§"¤ĖźĄMÅcĪ|šT½n«\į“ŲĻž¹µN4cŒ3kƒĄ’ ąō`R8U± żD’q"ÜRųrĖ(€€•eFŽnjH[-ĒEz·]vŁyĒ]_|ōɅŸĪ’¤Æóü®Ė،xģZC4” EUŗØ"&«‚Õž¼ é1HėAp–F“Ļ ų“ė_„jY±(ę×*’kM••[ĻKtA3Är>Ÿwį²²mU@Ke_nłR,ĒW…n»*+õą[GŸzģg Ėč]nX“"XŪu«V¾ūś›ąź ŃŖiÅõ꾉DALĀ ¢I«=a32}ŅĶꦬRcG·Ć£» ‘VĆČX yųš‘ć&L‚”?H’*OT¼eEĖ"_ÅJ„PŻ{Ž_ōI'Ä([¶Pčķ³lCžM”HĀ8ųo­ŹćNj\…+³ §UŁW\ŖźÉE\”ŠeEõ^ßļķīyéå—W-_k#ÕĶD q8X†Ą}Aī[ß’ö—ś²‚„j”HbH-EĶ‚A‘…”ŁwE`ŅVY߼辍€‘Mׅ|H>‹Ʋ-_PģŠ.5/ĢR– ”ųĶR ‡SH„=‡Ļ 1Ņ®PœŅ^J—°ś%Č¢łć€‹Ž QTē+÷a„ČTL‰Yķ}Ŗ+ČOµÖqĒąķ| Ōq‘ Ø¼īŖØdBcµä$‰[‡ąŚ={UåRĖXōĆļ£*J%ˆ,Ÿ›µLć± €ÖŖ"D‰)µĻ=ݽDH„“@ CG €“jlnŚc÷ŻQ”Č-  ¹;Ķӊ“µ_<ä‹oĻ{o=ŽZüi^aY_ēwżq‚/Z—Ļٵš­å¤0V€Éd Ģø1£2©BWך†ęwß|+īGŽ[Q\³&<Ą4ĄBLææüźUŸ.Ųuēžłūūėėųhn8ā„cDZŤiiEšČ1­‡jՆ! АjÓźĶgžƒ˜DõÓ™Éd¢RæsD© ˆVéžu|xĀs8•Ū@WÓć0i)J©¾¾>'ĄVW<­Ņéē{|DćV^ąQó°¶ĘŃ#ļ}š_×^’ˆŗ†śŗĢSO=µÕf›¹Ū2P&‹“1}§Ē|Ͻ)yÆ©žÅ·^·ßüŲh©åĖ—C«ø%CÖ·uuu¬Ä_Ųe—yϽ¼ē¦[}ųń¼wßć/·Üś×;n?īøÆxDNé®ukѹ Š”M0l„t›Ÿ:ń¾žżƒÅļøū®œ$źs6\ @PčŹ÷õvu{Œ4(ßŁŻ›ļ ”ņihĒy¤ŹHéöÉ']°ŽęÖPpÓ½wā6„“ä|]0!ĪĀ5zEūK „ iEo¾šr[Óž{ąž¤³Ÿ¾śVKSsK[ėœ]vzāłg[Ƕ;œFuØ {ŗü—æ0 ųąī¼§oé ¶VĆiXØV[]ʾ†Ł?/yä–%ÕpReGveń³ü«’®W#i[J_č÷_x@baōööŗL„t(ŗ^į¼”5ĖZćŸä}pJާP*(«:ہٮ5 e=Ņ+m dµźāŖCZU٧ļ] ęŽ7Žbū3­kķ±2l˜±h  ’(F"VBųż_nE]fqo÷J›W€õƒóνū‘’l¾ėN#'MlŖkRP`ĒČE !nMØü™N‹°Ŗ«AŁ«¾}Ņ×”,b‹]ćŒv>ė²‰ųĻƒ" 2-ˆ5!‡›zcŒužq²WÓQÖ¹TZ$üVWWēyĀŠ‹ķYµv›M7‘ĪBnuošEųŌońžüOvÜsw¾÷ޚ•«Hą(²\"Ą9fBĀ) łm·Ž Iéē}póCÓ©”N§³@“J‹šł^ĄbDČįŅ!šRŚ@D©—^|žÉŸm1ņ„ēž?ęė_½ó‘‡>īH“Ō-’£F }~[±d ,˜Ł*XR$ ÄĢaxæåöŪ._æŚ/^³ÜĘzD^xv²õuM*;”±Ķ¦ĪœŃ>t ,ĻĘw¼ŁB^9¢eµpÖėY³¦Ńó¬\ž#ųQś¾{ī=ģĆÄ)ō ĮϤlĘ Ūć"0€Uі1tŽéß{ķ£w{ņ¹ö™ĒŸ¼óŚß|÷äo®ZßõŚ{ī6wßéŪnķ<[פĒGBždīŽsW¼pl¦±=Uūhš<ś{' ß²(QĢ) ĄŒćjw±ŃHč°ö—…©4žE,±*~ćņįU˜\…ÓZ‹ŠZQÕ ‡”ŹŻUķč'ÄŠ£‹#ĶRvĪŚŻs ń%śØe=ϵŽ›ņø¼ĒPŻf"9¢ļĮ4„~FsušüV”6"0dŠJDƒķO†ÄMѶq\Sż÷•d! Ć%ģ¢4 –`ˆ#„¼šo7ŪdöŖåĖ~ył%ćǵ@…÷(·’žūĻŻjĪ ū|ńÜN£ž€8$„ '“b’8Ąų¼&)1bį>aFÕīšZc›†Ŗ[±ŲČÅ®!*ėį(Ž T–£KV©)…„*•£šÕN¾Ō>ŗµņђ …Z™‘ƒ°Ė.J10s2•qĢ2ĖßÕą G„̚s§)•ņR`Ö©LĻ’å‡ļ±Ļ]’óē)£Ē¦-^}źiG.Ąu~TģˆP’™Š9T"A.ß±f­ė¹%ME±™Ø[É) (!X4wæĪÕ«›µš÷ᇠ¹ „…dnÖukeŲvvw#Vŗv9JKÅ Ūż©°F-ˆÅĄ8‘5i,“õŠ:jŲĖÆæ"9Y­DŻU ”œ†#¹©,v•‰ŁHivŚ!“Jø€Üm'QѦ1”ņĆwuuu®ė˜÷Į‡^JAjÄ)]“ēŪä–ÆFĄ®¶ź2,”PpTŅā•–PĮPśYĢ;'k"I&ŲZżŽ!\$J—¼x…ō`łJ©\óɔ¢§=­t6›Mvģ9œ|>?H(P‰ūUŒC)ž5± •ˆČ'źrMŗ@TŚ#­Y½vĶvs¶ÆKy7żį„ƒ+‰ā°iß’ŪķwŌ m1yśŻwޱķ¶Ū˜|̰ųā^ūuŌQ³¦ĢjooA 4JÓŽį_ŠżęÅ,Cōjno9~Tū„1}]5‹–.)^FĀNJ$źÅg„”±|ü_·fM!E§÷cŻÜE¢ńµ|wÓ]笳råJ¬3ėJ ‚¼…GŠSi«iDĖPk­Učcć8PH ks»P”Żp”oE®ĘÜ"aŚ"ĢcjĻKÅ'Hr•Ęóė.›$¼t4Ć"­ŽxåµBonō°‘ĢÜjs(!„Ø>ōÆ÷Żwź©§2°’^ūšā¬Ė4Žm2“ՇGr֙?„ &/N)Æy乀”ļm1Ż—œ²’!3ŪFē­?oĮ'{8<†ÖAWēĀO>7bÄŠtŖžĶåś×?Ē‹"Jk«Vt¬ VŹ«"q=Ū-¼t:}ÕYēzŗė >żą£iS¦ ·—R<ķŹi Å@4”²øć/ńC(•h s]ĒA‡Ļ©IZ&–4HŪ"e&Ø'™šĢ’{ƍ7H,M Sßņ“ŸüäÕwß&•-vŁs蔅²PŽ—³tė„É(¤¬@mćĘ|ēœÆ śŚ[Ū<ƟnūÓV3f<’Š£°.įĆnÕõ³Ž“Ö±ūéG**NŗCn¹ÅžT™ŲJåW*N„RŚóPš˜®zŅÅ’źŅ•…i”ŌK6(ÕŗČ@Ņ/üØÄ™ķˆb5ūµ Ŗf]kFX„p·" b”¶VмČ’LE ©Üb rÆAVĖ7ŗ°\õ|’z‰ŁYśł¶WżčŠŽA.C~›DóHŁ-Aįé9ģ-1ꕿg» “]²Ź„ä7Ÿ0U|cDl 6+"\µĻ­ōŽśoż­DŲž©Ėū07°¶£’¹ĢTÕ+—4iTėjK6@ösń“}•Ó=šMłju’#­ŗ# It¶ų¾‰;1¬Ś€£īŽxu•ĪrõGsW¶Āo½óvАš€#G –Ą”“µ› mt?lŒ »Š…­°ōŽ?šą4°åĢéi`×m·{ōž%Ht{²±F¬/‘@ ĮcwŻ“¦·żėn‘Ą†Ć­pf6b} ÄßśŹ±?’ī÷͊U,A²+­Ų_˜’ŽHcŻXEMøV¬5}}b­‘č¦9qß»µ6¶ŌCRśšö“  ֗bē• [p٦Õ%Ł{̦æ?HöŽ”uJ—–ū91DģßośŸ;®»ń±»ļ—¼įæVŲõ”;$‘|qu%zŃEŒüżęŽaū]† Ū>Ū¶Y]Ó s āŪ²^M7&Ÿ¼łīD¤ę“ŽŻwņ¦7üų|qo6vŁū9¾†o{LÜ ŽL R`Īū¦/oņ9±f·m·k¢ĢPØ’õ_16īö°±°”Œ£ •€ėÕ“¶hćm`b&ˆ$ÉHÉYĘb£SÉżdD6Ó 4§V-˜2µX6ā‹õO8ģ°MF޾łŠ«:WÆNöµ¶aė­Ļ»l¾łM!žŖö˜µÅG“õ“¶Ūr3±¾XSc8Ū(ā‹_˜iŲkĀ”­ZGüņūgūėŗÄˆĮgŸ½ykĆ>ćĒĢi®ß±„q֐–ė.øH8Ōó`±a_±-īMR@ČįŖcķ+bBŪ|Ȧ;ĢV ³uöĢ/rŲŪlÖ6RÄś¾ œ}pĢbڽ§ĻœQßxŠ–[Œžxč_‰­jÅp=˜µbĀUī±’ ¤sįźCgnæMżØP:ź×i‡ŽŖ­= śÓM7»ērgŗ3\”õ·FLąĪG“ ’Īƒ¼üō“é Š #]|õČ£ēæóAŃ^%ĖūuhCq=S<Š„8•¦Ą–[°J”„+Ś™Š?·A‰·9&—x —1}Ęų%Ž&ƒ÷ē7ˆ hš­ÅUę zŠĻHõ÷õ? µīdšt?eV4ł[õ åØ<£oÕ,{2k¢¦“ķ²ģd÷ĀD +±0 D©ĶŲū¹óNżźW;čŪÕkŪcÆGī¹–5sTߔø„R®z#Šē]H0”O'*xēbхA&xś[²€ą®lŒ©ģć̬ժ·Äā6"ĒÆ6nµ̱o”NS*’„q\¬J±µ‘Ģ9;Ģéé\ā~ōĮG x啗OśŚ‰¼õ:lĀīV-J3„ąY+HQė˜ö™cĒ+ßĻh!-Pa?’k"huÅM7y҉A:%ŒX×ÓÕüĀEåiABW,)­\ ßłź×§Œūņ£Oh§Q‰"4Ōc”vœ9yRƒRžį}÷Ų D Tio51¾A€‹H v«V¬9–9®!„Š8·Ż~{¶.Ą?éä“`"T¶U Ą2YŃ¢4+ĶŠˆum„”Ų”hŸŃŸ8a܁{ģŁji\]Ӓ—ŽŽ”}ņž|Wž‚āH ĘZ·ź4)b4=4ŲŚüš}«SibpޚżöŻgĮ¢ó-üpއ]=ės…¾®žŽ•ėV]~Ķ•ūéĄ\3ģ48(+ŗø{…õl+ĘŲXKPŚm„0]¬'+(…ø“7“W7µ¹jsÄčĖ,6“xÉ1ŗģķfŌØ_•³Z[„ÜĖ•Čč„*‰"Ķ°{ʈ"œĪŖ41ٰ &­@“5ģąŁ0āōė¢ æ÷oTė‡}kśHÕŚā1V}³cŁ©ß<턯V$šXĮ’Ń,HA`5ņŚtš_ūšś«Æ¶Ż½a_“V¢ĄĄ¶»ģ’[¶öńūžŽ4nō:Ųš?w߹㦛ō…/ö-[MŒp€’źeĶćq‹&”†7WĘ“?Tµģ*”ם#µš¤čŅ*Z.»AŻ‚żÜL%ąqšĪYĒV’®KrLŹÄ«^dˆåąąĶŚh¹Ańą )<ŹŽ<ČqŽII®Kv®é Ķ žßxP\d•ts&Qµ1†Ė2 Ā®Ŗ\}ŃyźwŃ~Ąōٛ޵ų÷ŘĄś.'k„>Ē|ÉåĄs…ZńÕŹź·\ć«ņj¾ļÆ_æ¾v¾Xqł³m’Ļ0ś¾Źeć5&9Ŗ!puF¾J.ō JeK9–…Eü`ž»ļy@ h%Æ P…[Æ»A|ėŖ±±59ĆjæöčӓSõožó?żłÖ{~’Ū;nøaBk‹ ¤żžžpĶ·@H3i‚¶c&Loj=õčcÄؐ“mowŽ3åŲ‚Äéßr†Éˆ—Ś–Pg'ɇ“ėīŹ›™0\„’|ćM!„£< Ģl¢%gƒß]qåp`zć=7ŁLü‚«>”ŌŹĀł”!* ĀŅŻŁ“Ų¾h,EX˜µ[\…Šö­]7±¾iš“N„ƒœ {L–ÖKX ­p¼d ‡uH±¶ŲiōÄūÆžõ_/¼b²›¤›'#56[Ÿ[½Ś•X‚‚WlB¤@) @¬1w’VؑŚ4Ņי[æJLĮĶ&‹ ¬/\ö„Š'łŽĄļ«U(a°+½ńŗ°1ĆsuPF\"6¾Ÿ%ˆųEćķ`KFƕ£ź±H^V~ŗdīN{øLČÄÖa—õS]WhTfH¼%Ī/ŽŽ`ÅmIõŁŚ *ßXÉÄ7Dˆ ŸÅg6–EņĀ‹VÆ:»ÄXé+ˆ_ø 6žŚ‚ćRę*u fvüĄża„¼¬‰*„å ąWÅ(1³«IŽuēŠ0Ōī„›€]6Żlß9;]łÓókā­ķjJÅWĢöMĄ%˜ˆb%<(ųÕy\¹ćLŸ+$²±Ę/–UKžÄÉWó}Ē=žƒÆ·ł°‘£įMjҽd¹Ć˜ÄOk%¬Ļ6\ĻŖ¶ėø™› }üŽq@FÄH°®7 5qČČ/īøWČ6ĢŃh‘@‚õł’ŽõĻ+Īŗš{'žzŠū|ē”ÓŠ>kÅgÉ[1Aϧ ·jńå­wŻ{ÜĢ3::Ŗę%ą-¶X镼æó“™ĆQP|ó )Xé3ˆäƒ hRsK+på9?•<‹/ā³µ!!ˆ¬„«Ž—€įéŗf`tŗ^ ֈū§ś—ćE×•CĻ•Į˜‹„ól¤Æ'—„oōFĒkĻųįYfc“gD&@ĶPõs§ĶŽ¢mĢޗ"“\‡õ„ąÆ^øčž?ßVXßép1¾°ļFūŃ{ļ;fׯg¦½¹S&żķ÷7 ¶1fŠ×8)Õj·ž‚ߥĢA./?’ōö£Ś÷˜<õŌ#cŁ/ŲB^8Č_ŽuūÆĻŻ£÷×·R?\cܐęGļ@#Ö0›rę`Ė“‡ŽڤqŲh(gQ‹ŪÓŸ¾@ŗŗ§×5²ēܹ£&ģ?rĢPŪ66>|śYéÉ%9Š—øsȞūŒ¶6bA7ńÕłŁXféķ͹%Ś»dĶó÷>ōĶżŸLc¼ś”šź pŲ.»K>X»tqėa[Į-" ×Ū'… 4•ėƒg|⦫nųÕEW­]øT eÕT+‚[¤×ßeʦ! EČhüāŠ+IacݾNbvµf6$4Øž' ƒäŃ?Ą`-4e-÷õ3ŗß:ÕżW;‰ķæ*³IĒs„bB±ńaCŖÆ’Ūą ¤j)#ÄO7ųŗśž^bØĻ1ŹßŠ|C­B„lˆČr wœ#؈źlŽūFǰ~”'{'?8’ģg^}įg]¦&Ö{nŗõŖå+=J‘°V`“L*ɑLŽeš“d"ļūyC\¤J²Ž•‘"l :õs¬±NÖ 3R©Ō!CJ:ŗ™k%{3ī–bNŌϘ‹J ]T]‰DjÅr±© ¬ā{¢:V¬ł ÉmČB ΉóOžē(,ŌĵtHŲK W8|ß/“یŸä ې_9嫚H8•‚Šō/9žŠø› ŪÕóś‹/;ī¹gŸzłå?ī˜/ż«ļ¼÷¾KĒ._ŗ8d%"X)a@D{ŽĢ™3­µĻ>÷×'ÆEÕgź]Ŗ[ĀVC„Å#§pR5Ą² k_D)ׄ,qŖŒ‰9|äžė€Ž„+)åY {–bfxKH|p¬Uūõoœ2“yȄ ć>ü迅|ˆP$2±ŒCŗ¶ś—Üsż3žē¹Āc­-dt(gŅ.ßŃ*z نśqc'ģµÓC[ۊ:“QāÖ5_¹ō ā:ŗ›Mf 6”Ž®š·¾|l«—™·nٱ?ü֟’qĻOvAĘKM?YņłM¦NWŽ>Pkk­#`óPX€rėVĀ/<żŌ”‰]]ūŌÓOC¦.ŪŠ$¤ˆ“µb!¤“#UC*…tZ§2~*1Å~Š•Žč<¶®øŲ«›±† l̹åīEJü˜Š€‰…"€%æ¦Ó¬ģx÷‰gŁe—ż6ßb$ąu¬æåņ_Ģ™=[Aŗ }š˜a J„Ų©”:ķĶrQEŽcBT“7ˆ"åå”|(c铤“UŹ­Lxw.Yņąµ×eė9ć‡4²Óī’øūnˆU å- ŅžĄŲس=–ķčżś/q”’Š$śÆ9 † šĶT ‚#9bū±“ÓĻŲ40qņÄĒ^yī'—ülÓÖQOÜ~OnžR@ƒ,”ĂÅÓn§”G–C‘ēiÅĄKź0 S1[.?ŒÄ‰•=£Udø‚Ą÷}kųųļž¾|횭'́l¦±†mØ °<•R–FÖ³¾ƒmpėķ·Z°“fh2^k¶=Ó8qÄšO>ż)†bUJ¹ē*¬ļž÷ż÷/Z8’ūß’ī7æyźÓO<ž‡›~›[×ėZĆsFŽ»÷žūµ„‹–­^±zęģME“c-“•‰Å§č£W^\¹pĮšś¦qĆGd³Y8«ÅĆ=×ß³­®>šó éś£GA¬¤k÷k­Óé4„ÓigßPŹģ Ś*²“¤N§AÕŹwU!`ė]¼g “Nƒ<`ōšvˁäü±­Ć_zņ™b‘“”¶Zµó„/é5Õ )!%Q ¦½ņĘė?ód¦©”eİ­wŪiσčŽ_µōÓsšé'{C[@+ŽZOņČ[żįĒ#ꚲnÓŁö˜‹Ąwē#,ļŗõę=ė{Ž~ūŻśIFMŸŖ,vŲl«k®¾J†#ח£eīĶi֌ĢČʖ©CĒyä9Śrrē7zōĄŻw*’ž¾ī‚ĒœpōzĶ«s½)Ø×Žzž²Š¬"r)‚~ļŗž|ü‘!ĶCš›æpŠAės• ”¾.ėJįéįĶŪ¼Ļon¹éŚė~yÅuWē`ź“N3wÜ)i5ŹóRPiĖž@Y[ @–²ś +>z’ź«Ļżõ —,^õžNūnÕ6¾EŅ֒°µĄŤ,H ‘UOæ’fwĒś]wÜ1 ŒŠ©±āMR ?žÉśĀĀęa„ĮRID½”>dģSZ UP~‰Ņt²—xƒ\誽ǃ$‚0f©åķ×¢IJrÕ*l–<ū¹ēų@‰Q1ŽgdĘŚŠ–ŻĻń«ZĮĮĆN3ƒÉ®2¼* ‰7ō!?Æźy-n§ōŲ™sQvtó°0) CDĪj=źÖ?ß>įĀ•łžeČ=óčS`G^ŅŌś”²xoCĿΒ8*Ųž9Aø'5t½ū·PŒÕ_±Ļćˆv00ō3¼5µāįĮĪ“š†Y±Jå¬ XE‚õ¤ŌŠ„KĆ_[‹CŽI„NuÉ$CtP÷ŗŽæŽv{wĒz©L:ćZk7ž…B!õāóŠ*” H¼R¤ŅJk 9¾TKsėˆao½’īˆŃ£®øāRfŽÓX„”š ā~VN2öČÖev×%Jä`ØqD)„5<¬0”4)Ļ÷ż;ļ¼ó…g_€(q€ź¤6ĘN–ĆčLćH³ÉŁX“Ø~ćō[ļžkss3üqĶCĻŗō¢ćĻłĮ.»hüŒ©Ćź[F¦.žŃŁd„˜“öÜ„2^Š'ZŁpM˚|߂… =Ļ«÷ōĻ~žs@Cg]jCkMB ŠÄ„OXHy© Me†“=Iķ³DŖ¢8–ŽQ @Ģ2Ś. S–.©zBF¾Ś7ņƒ3Ū†µī±ūn?9õō٣ƉMŪ+–0ą#`’7ß{ ́C 9šmqæ³`Ų2G, Ų̾%‹,KšÅKi7_Z¹„‡0Y¤Č7O9å{ß’^GGGšōŪÆ½tā‰Ē²Ļ¾KŽ}_B%ؐ{‰Łs+œB0E•-kmĢĆlc`q5ī褷ä’ßI:™²•é‹-ˆ©/ū•õ„®4Q:õĻ<0£®m³!Ćw­9äųÆtą›Œj?fŸ/œ~ų±·^wĆŗEK4…Ŗ`*AaļˆpYEjvwNĢø–`… év\#R{J13żˆ˜ĄĘź\2™L6›ÕžŗņüŸ¬²dŁrŅŽšłK`J[@ÖO LH0FVī¼į¦y‹>éźķń}Ł¢Åzm÷5ē^“äÓ°BV-~å!MļĶ{gó™³a` –"ٟ€ævŅI 9ł[g¤Z?]<ßĀją‡ß’ŲB )ea„@Ųyׯ:ó½-#†Ū~ō±Ē@H)Æöó^fcSJ×g²‹>¾Ā’w>zäž®¾ōņQmĆÖsßäĶ6łÖY?„‹|ʔǑ$„s›‡’õļHĮó~ ?č·ķ'Įå%¾Ė“}T$ö £hÆ( ×_ćIøkB*$ß÷q։1n=wkfķ5“4o¶õ–™TĪxĄ¤B”4­‰ČóŅJyZąÅ ?€hUo÷:Āāu]Ö7cśMłó‡|iö“™’¼ż®®½‘DA".U {m¬‡ėnæeAßś5A߇+ļµ×^MĄŗO>Żu»†}įĻ/A6³ćÜ}xńŁēŽ|łUĘe“IP_—µĘ8Ž÷«~~‰ ĢØ”#2©4»ųƒ÷!Ö„/‰Č9‡šō̉S’ā—3u“ĘŽ?ć¬Ʊ Km­æ½ńw Ā ŠaƁšļ>8“®90<Į¢śĘ&¶ 0õWqX) ē+6iåi±ė_xõ¹Gž¢sķZH{žvŚf{€,1{JB°h m_¹~é{/żą“‹Ī>眳Ļ^øxĮõæ»į¢Ė.Łv‡]¬¤JšYK 9m —RŖonzņégņ뺟ž×Ć *žūß’JČĮĮŖ!*],ż«¢ÖŖi ²"Rä¤"}WR·’ØiC=Ę22ŌĻ(2š¹DeˆÖŽŹP•Ųżdc?œó’j<¼”­©ĘšeĶZQ’Ŗ•æŁ Ūś\¦|0+¾Ź*DwĆcL¹ĆQIčæ°óĄalß²•æųéłÆ?üŌĮ»ļ7zȈ_znaŠóiogĪvĢŃ 8­Wb"QÉOÜxS–WųKčż[“Źö€XNÓµ:WqV>æ/‡ŗ‰a Å89rœvh¼97ōÓŻs¹ź«­­Ģ¹q_”Ą kßzżÕńćĒŽ5śą\½t9„˜ėN”8”ėŽŻŁ=wŪżk'ž°ÕĢY÷ßv;˜!ģ‚įX`°ģTˆ4„ńė‹/{łłgŅÄė:Võp S'Nœ÷ɶńcĮ „}\Zif§øŖ“ŃC±Ü}Ū¦ą‹R“fLO ¢š”=hļø£æ2}Ņ”ślbY HÜĮ²‹Ÿō';fŅæ/Ė5æB`0Į6I[ŖY°h Hˆą”<šÉūÄĀī_­ČkŒ„šēÄ3Śk™jčĶ÷Zࢋī „–`&tŸ ¤S Śr»ķ ,ó- ‚@)ˆåd0ģč„Õ®k™ˆd·œMš<Æ*k}Õ袭/Fˆ5$œ0±H>—[²hŃžūī;’“O‘ ]$pH]6©,±x°Ä’"0C‰Ą^{żµ7üįw#uc°¾ļŠ+®zo݊]ö›kŲ|łŒS·Ł}ē^ė{u;n³">|ŽÜŻ "Čūõ Ie²žģēŁ–§IGŚuĆĆ­ķøUŒH¹Hz°ē A)§‹ʃ1ǧQg©š”Ž]sĻÓQßx)į}"„V± ćæ¾įÕW^xéÕ.śåe·Ü¤eęıŪnZ7sā"?Či˜°_׎5Ā¢“œōNR ‘ķ ”xF:>Yüć“N½šäoķæåV{N™q`ū“6ßqĻ ÓŽ}ųń¾…ĖXrčhõŽ Æ™u}'s҃šø/yŽŁ?žĪ '~å€/\ūÓ ļ¹ī·  &7ÅĪ•“¾†.ßA*nĀŽOI qŃćDI›V’čµģ –t^gśšĪŗōb# +Ņ’üūżotÆø’ŻO9ł”–––g?xkĮśÕ’xüŃ?Žw÷ÆÆ¼śš¹ūū+ĒŻż‡[>xć °e1šˆHÅõƐ jš.«üĒ’sųǕɸ)„x†jLĀ 铓ĶŌ²:ƒlf­ÉĶ_ærōō)Oą±@D§<&!O»ŗ"@O>żtX”ŽcĒŻ†×·\yĶ//ŗäē{l·3Œ‚å›ļ¼cIgG^¶„ Śs)ģ€_yö¹½÷Ž{Ÿ÷EŠ Õ&›o¦śTź•^köXx) zƒÜ ōt"ȶ67EÕāԈS†Ä¢¬m1T§Sėz:‰Čtt^łżī¾łß9ž«u,{uͧ…”÷Ük/»é.Z'ÖbU‰M­¶Łm§<Ą"u:=kśtø¤@’[¦ÕW¬Š ¬įš¤äēaĘÕa¾lÜķ£Ą¢t€ƒƒ YkŒ™5u„Ķ=÷Īk ĆŪ^xń¹0āc¤”Ö‰,3R`ƒ-,”(/­S°˜’žĒ)ĘŲÖ֟|ėL@75µüéŽæ½üįūūs¤M¹ŻTL–Ę2³&µē¶;¶Ą«Ó© 7·¢{(Kļ½öę Ļ>WßÖ¶’qĒ€R_ūśi m䊜l=ŗņLŚø…g¬ē8˜<ü°­¶ŁziǚO—,Z޹śé'žt“é ÅÄ7¬æbiŗ©ałśŽÆžžĶU=½FA ¦M›¶õę[ƒ -(°1A5Ÿ¤#×]°¦›żÆžņõŠRĒ•bbP( ŠŻ‰Š“(ł•'Ÿ¾÷ö;žxäįc>Ŗ#×k€LAڳCfŒŸVDPä,ŗyÉk/zęŻß_~Ćķ7Żržųļżćü‹vĶ:ft£ŲŒfO±&Qó8ŸŠ¶ÆćŽvš7^vŁø"mĀW MMMN Š\^>‰Aˆ„()DTKč{°ŠĪŠ2tYU¦#*MgÓąŌ•Ŗ†¾eŽō`B¬žPżF+ƒē¾ŁŠ¦āx@’·+Ū'ž“Įóųł!‹såŹ§py8_?„Ų5{‰’—pä7 Ė\y·Få#°cÄZ1öĆW_ŻtāD dp«ķ¤»×ßĝuQĻaa]Ϛ…Ė;—­yģĮ‡ęæ÷aߌõKę}’ĄŚ€ūz„ƒ•K*‚VȐĪWŸ÷3ńCžp |ńķ¶­£¦©ŗ‹¾ńmńKŲ§ŻGøž[±bsäüCwŚc0zß­·‘  lK{w¹ČŒ5y`¬*éC­k75Ę·å\£VŒoƒ‚ ن+یĖu)/®kŌģ6›Žš”&qēõ7HO_גÅĻü÷!±y’wW\Ł Õ^#põy†»mņśEŖjŅÄ"…B. ŒT™ 4zjFsŪ0`8©V¢„€mgζ=½Ž:ø}ČŠz øčū?|ż”æ}īWūŒwļšé›n;}Ļ/tĄ”’7į ķšĄ±Ā=Fr¾aĒo¼,mHmQo'l‹#–ļßJIŒ-¬ĪßyÓ_°@|>ņ 5CÖé)M-…µkÅśīįūĒ?/’ĮY_Ūē vx»Nš89jPØ'4Ć3™i#G.y÷£īå«%’ŽYI®'»ŚŒåøi+A.ķhƓ;•YŒįpNKŸ%¶ē'vD³ņš“—–0O";™$&Ļ_¼žųSŪ“ŒœŒō.ÓgIOßEß?³Č(xĄœ™›Ō šą½ųÄӝ’’·Ļüū±ŸżąœÅļĢ ¹ĮŁ ęL›¶÷f[lÓ>nńKÆŗVL·|Ä÷§Yd}·™#›äu/ķ5Öų·^wŻģ¦Öm[†ķ5~ņvm#&@×§ShößaēBo—p ģĒŚq’æqk•cž^ĆbgMœŌ šÜŌÖ H”ŠłA‚ž ¢3A_Ö9œ˜ÆpŪ&HćKvØ čēƒšürŻž#»ß.; ó¼óO9ķåz§ĀŽųŗ–ń£Ś!€Ņ®.å˜Ģ-’ÅP`MŸŸ²PĘŽż§Ū2ĄøĘ¶įØī5³ĮGŻk€ÕąH'3+?śdŪö‰§ļūÅuƼ½¶smšνźēć7ŸžƒKĻ;ńū§7ŒžįŠE³·Ūbķ²_=šQ XvmłtįĆå?>į’śĒīį]÷r±¬#+sö€·²ó¢DŽ37yų˜‹¾ ųĘ©§ęĮ£Ū†™ŽÜšÅ+`5, Ųó /üäŖĖžšßæ/š{ņõj³Żē“Oį 2Y/›Ī¬Z¹rēm·ŽuöęĻŻż7ź)Ľ!ĆŠUėøIJ”ŲŽ-pøh)•|$BČg¬J»ć\ó`…GLgŲ“§›Ś ļøćN(2@ź×:ü6<m,X}ē›gōrߔM¦NŸ:”gͲł >śö©_›ŚŲ2Čw¬©ś”é…Ł~÷«“0,Ϙ6mīŽūŒ7>‚ ä“Oę­[µ2E˜»ēŽLÜ,  cõj 4„ŅÓ6 õē CčAČAÄZĶ{’ƒT*ÕŃŻ%ZżėÉGūR:ē©Lź7ææéßO?™ĪfA°DFA ‡n‰Ņ\Ņ$©@d1sŅ” ¼\o_ƒŹ>żÆ’"T馸(®*+ÄāŲŠå#+HhA©0•ŹŒJQŲÅŠž bÅB«C=tȐ![n·Ķ¦[mńą£‚8j14HƒTT:óR)wš” †,Hеhł„ęaõ:}Ź _õ„¼čĻ)0R #”f”p³(©Ņ“lżŚ‚’įćĒģwŌ”hiB_ž›§œj…ū svŁ :„D“ØĶvŽ~m¢×Žx5DJkG m…W­]3zģ˜ó/»øäĄĘSO<ż<»F*™\>߯3Tgżu=ßųĘ7°čŲJ£‡›8t$,”7gŗ{<łä“==]Ž’d^ą©Ī|_7¬s~˜UŲķ ׀GdŒßw’WŽ<źŁgŸ}ć½wŽ8ęĖ;ģ“‹ ·Żõ×<#ĒŅOŻóƧ’|ļ)ūzĪW¾ö› /žĶÆ.oi“õĮĀõX¼Ūa;üķ©æ]ń‡ėŠTfq#ē±x ,(k ÖӖMÖ14Ț®ćvš{Čf;>óŠcu¢˜2>kĮqĒóńüł±·ć„Æ)J„’/¾JŻ9k9Œ0be“ÕĮKĄ$å!>eeopŒ$­tžŌŽ©U鍿|”ŠŲØŻ#’ ł9żŌj”ķ'bŖœ÷Į4ZÖźń®Rg0¦/Ļy”rxV”štœŠ1ƒÜ’qY•æ”yZX^}ł•Č2ĄČ††lˆ Å(Ø-G¶’ō”Ód]˜l YmK”ZÅl`:§jrØR5ž”ļū ]ӍQū\¤Ę6:»SĀLĖR©Ž6ųk†•SŻ.[\c5ŲēJ>‘„X×Mrʉg–‚5yüńśė€­&Lxę’p•ŌŅ‚bImÖøāŲź5‡o7gLT£žŹJ!\u—pŁHĘÓtłāĖ˜ĢŠ)^ć¾36żĘ”?vĻ_O<ģ %óŽS¶%%3kÄI²ĶjŒÓV ĮŒĘ”“3Ķl¹½,[é"– Üy÷o~~É¢wŽæˆ1’\i!¶/ŪŚTj¼1ČL«omZÉŪbĀägmŗō­÷dm§ˆ}ļŻ·ļ’ė«ē/ķÕµ‚†£½ŗQ^z(h˜—‘BTsė™&Ōhõy黌öźęLš2hó¼#·œƒcY l3tŌ![mün{Gų\äZWÕrĒ>ĶÜ××7 šƒ«eīcŠJ’•4Y˜*–čmńēĘ„Å:"eŸÅ)äüP+8üėOżé1'o;tģ—¶ŁZü>_ņy[pź§n öŚuĒz`4pÖ±Ēo3eŠ[ˆ qʘHø8kAoĮōłRÄŹa{Ķš©v1~łļIĮˆų¹¾ĪOŸ}įšµõ”éõĄtd¦#³eĖŠ1Ą(­Ę7Ö_qö9āū"=Aamļŗe«ēĶ{膛Ž{ą?ē~åÄm[G.yļ]W5b#āĖ5g’lV¶õō»ų»?Ÿ‘r ‰CÄŁ‡Xń5®&AN żķš°HąMÜģÜzéÆw™øłöķ3„Ćö,_—…šLŁŻĘM=p—]„ƒ¢,²ß[æė\µč…’Ž’½Ž˜œĮ””ŽcņTĒx?näč pć/®qH™~)Ś%)Cļźyū„W/=ļĀŸxVŒų¾‰1M!Ś…‹µzŽ·°•ēŸ~& lŁŌŗmėšóO’¦A8ŃŻ2‡ņÄ]ė;S #wŽeZCćĻt¦ų9)äĻ=ķŌ}÷Ü5x@Za—-·–\!bKńå£×^ūŃ7æłÜsĻDĪį=’īŅĖG©ŌØa@ĒāÅbÄl|+==›¶··€š€S¾rlXæŒQBÉ>‹°Üü‡ß*Ā8dĘ!#}yĒ9ļĘ.Rś?""’·łŽ.XńĆ“QØhėŲ(H„@'z”ųR¢^ķ÷āÖOx\Ė•ŪrļāLUĘ»»“ySr¼&v½ńƒ|_®»³'(ǾŚOc>złµ·z\V®÷@O?žD%:ÆÄĢÄö!gL_ŽļčžĶÕWÕ#”wīi§»™Ī&ˆ$½Ć¢q¬ī®U0g’õYĶĆ76Ŗ xķ¹gÄß;īŲ]§M›˜®Ū}ź&Iēóžæßēƕ7źž[nq‹H.xꁇ.ūį9ŅŃ+Żoē]뀑™śaš>xś›8³/?ūÜv¤·jvāī{åŗÖ‰1ŲrŚčįP# o¾ģJ1vÕü„kę/ėY¾ĪķŠo}Ģ(ʌCzŅ’üÓās%lŃ}æüӅ7_}Ż·?źšv=pūķīųķ A×j zÄōHė}š—ź †f›¼LÖuu@#Ōö›Ģŗäœ³žyųŸRčĪKö„ NčNXNx’–—ĢūōÆ·Žš& 3E5“77g±u Ēī æ¾C8ØÅÖ»¬Öژ&=VÓ(«—–ÉWéMĘ0„ä ›„F/S®ÓžEJé逹”Ś%"Õ°NĪSM>QµZ÷ą‰”ūƆyūÆŖæAJĪ£z#ėZ. ‘tZ,>é_ŗR[§¦¼ė€(ņ«TU¶ąjbH ƒžæ8=¶*H2üfįüĪĶ*•4MŸ4žkĒ3ļõ×%Ÿ"f9v-?ˆ/6²ņ2™„ņż}å󳞞ž2_<‰7Ėå I÷]žæśUīC'}ßAGڵāŪdč€[nFl`ŖŚ‹ņ•ąDBCĢEqł8$޼m6™•4°Ē®;H ¬ˆ¼,ž!‹ģßožóT/3‰¼!„!„Vąƒg_tĪK>=Ö—!ĖÆÆŗvŅ›6œsŚ7–~ü¾˜>ń{b hYl©ÄœÅ0¢ elg÷¤tÓÖĶ£ö?köi7_|„äńżļŸrJ»—9’“3¤7ļ ŹÖŚ0tIģ1öKs÷ĶŠ±§k{‡ŌdŖžŹ6ĆRŁ`¼9c§x(r-×§(Ōy䠖F$/&”ŒrI<šŪ›ggš§!3Ź%z—®‚Ę%²=ˆ1a”Y– „‰,wß+˜Ŗ‹3Žé…BÖųÖų6K„c8™œwźéSšZŚ€Š$ĻnĆo~²EėøYĆĘ4‚R  éY&¶eėą°Ū¶Ūe€! sFœ@hPČē~ū{ā[g‹€Šˆ¶£[Ś€Æļ³ßК%‹āgļ?t©„Pžē7×Gn¾ĶĶ?žéķ×ü:”mKB4hPv¦|ŗ o Žōł\°ī%A‰Ģ’sь 5{B/ø`Åg.XńE |õĪ»šøol×:ęk|Õyē ūl¬X|÷^óŌ­wŒƒģ½Åęn?Gņ˜p)1Ź=É‘īī^1Vņę[G7ŁkÜač˜IšĪ?å ¬ߗ¼p 6?Xööū}ƽæ‰nÜŖ©u"t“BXųń‡b "łp± 澚gמą¬/ļ°ėŽ<ꆟ’\L„‘ d”®ß“”ķä½ø’ś›_ūϱLN“;Ā‘’ż%Wo=nźž\|ė:zj…ÄģTŽ‚p–­ §ģƒ­ƒ·cū¬ÓæpŒääė‡|e(0­~Č6ć&J.gÅ$yŐĢA+s½+>żų½×^™Ņ>Ī%Å'Ń “#½ķ艼ųZæø]1īØ4,VÖ,[ńšƒ’~÷õ7{;ŗm.ˆĒ<¬ „ÜäŗP9é9üž7AcV]ćŒLżw'ŗ8F½üĮ«o6Bµ{™a ^{M|_L &0łŽÆæv—ēÜuēķ&ŸsŻ+īÆņ]÷’žößjŽĖ>8ĒŲ­ē{¤˜ŚÖÖ¼žųRĪūbøļż72¬h%õĶćOc]% n›P|įk~qE”3M@!ČG¹w±‰÷šūĤޘōłµŻ6„›‚‹īr\H<žŠ#%ˆN[tHJ†¤ä•”BŁm„VńM”&ؔeŠĻŠB.ļēƒ>˜ōłDi,c/ūÉ9sgo5Įkš€}ö޳2ų1ÅüC<("F¬°o‚ß_}u«Öu@ °bliĖĮ}] ,¬ˆ Ä>öÄ£)`"Ņ›PƱ[īō›3~tȬͧeźR€éė“xĢ-ū}½)B 0„©å­ē^ˆÅ½ģŠŽŸ}ū‡æŗä )±Öęr @+y  ÖTFü@¬uń¶CĒNQ [“8aīžla#ֈ4£ujJӐS=\rž½øķ'§}wĮ›øūüÖi§¦ ŠDzö˜ńāŪd³UĒG ?~ų¹ 8łŽ‹®½įg—1w’qCš§mŸ’Į[…¾‘œHŽŲ^߅ø›Ķš­•(›zĄo½Õ×¹N¬/¦OlNlŸK~I¬.Ļf Zk}ßßqĢ“ŃH5‘NŚ©.æ¼ō2 ņ˜BčŠT‹†Ė¤ƒœ§gSµĄ3ųŅ–.Åņ&®™¢H¤'ÖŚä²V¾’-7؈ńm܆ŠÓÕė:JŸ®æöĘ miŒc±žß_¦Øś÷]®„’Տ?V F^¾8ń¼ƒ¼ōó©U?&Nrć{Ė60åį~œDņೈ®ÕP±üĒßünLŪŠŻ·Łīµ§ž’ ģ»p}˜œh¤ e)Eüø(ąžŹÄÕn)Vnt.Q2ś]±bŊ+Źŗd“öĀ÷Ķ`Ć6(+SUUxōāŪžņa½i1qHœ4m•˜¬%&Cāb^¦b§]ręg6µ]’ó—=’J1P꒐øX0"¾¼óč³;µOŲ©}L;”=… õ™&`łūˆ):°į(@6v×Ķ·EuS뇹ó>¦§K8LN$¶ńŗŠÜ[t­Üzf¶‘6id]MĒ²å­Ą®£§|wæĆę=šŲ×öžĀć¦nÖ>v(Ō›lł›o•‚_ģĀ D¬ų5VŒŲūĪ­o†)x@š0«ačDUßN™”ŠY("‚(¤€4AmCźpŲW¾¹’—š‘)=’<é‹ _ÖJ¤ĮėŚw;éŠY[ķ7~śY_:z«‘ķ#tęÕĒžvUÅ+$ī4‹e§ż»ļ6sš€ą×ß ¦˜&ˆ\C¬®fŖ.¹Źķ–LW' \.$v…ŻK—¶MĄÓ§‡n ė/?hļ}ė GézYŻå¢Ü‚Xé+¼šąæżŽ‡Ļ¼øųõמ½÷΃7½ē„qžĀ7N>īÉ”BŲę4$ŻēžqŅqĆ 'ī¾×NķćVĻūXüŠĄ:Äš†’…GžøąŒo÷ŠĆ'žõK`CĶL.Æ5…ꌌJ ƒžF²4”[,IÅpĮļ-„E°@L.pßø9ū̓ Ŗ‘J »LRwAŗņ›“¶Ÿyš—·okŗ:óŻėm.W¬™ģ+ż÷ŗžųŠĶ·>jŪķv7žČ]v߆·ķ\@a·[1Œ=8﷐7jvŖi‹ś¶7zL[ą| ¾ēóīßłā[·ŽšŁŅŅ “¦Uč\ŗT‚ÄŁd¬XūāLÖŁ£vŻCņįżūÆ÷žųÄS_æļß/ßõĄ7ö?ä‹Ūī”Ō”×a>ŸŸą5l?fņ”Ę6ń­1¾ŌÖ!wyŅēyjå§KÄēXf|Ģš‘  }é„Ć7ŪE–Ææó—æäe§¤ė·>Jņ>‹5‘Aö…ƒ8”M^žCƒuó5@!œrü±żœwįEJb Deފ 8üׅńy#Qwk¤lmĮ_³z%c™ ןž%ę׆˜+ßõ÷Qŗ¾=U?śł‡?ˆp1ŬŒ¾ÅZńĶk?sķŁ¼p’æ„`Ćõé‚[cÅ/ģ±żvīI§¶µÉŚN·°/æš¼z MéFąĖ,¦„»”$Å_0Ņē’éĘß !šžj޹}ʊw?”2Mf#⇱J ’gĆ,~oaåāå'ŒXü|ŽĖļ’gtF)×£³;’Ś¢N)½JH\'rXaŪpÜĆÄŖõ‰¤ax}1¾]¾tÅŅł‹9ļswNŒ½ę‚Ÿ5ĆUZ+Üū·{‰÷w[×Ķ%ćĘžqĆļ·6zœŹģ=s3 ¬ėBēX¢Ü xA¤ŪŠĻR°bM_WēĒϽ0½„m°ŪĢM&”nŠjā©,pō’ j¢µF|#sä¾ŌŠĘyõ²ŗS1ė{žśŪ?8éė+>/Ę8Aņöß7 ŒFz§I3N:äpńm~ńŠŃ^]Ś”–‚*{sĄbwŪ|ó`8”XńÖ»?>ńŌļxŖōš8™ėu@›N·’wÄīū¼’ÄsOŽõ÷#8Œ€FķÕ­@»—™šiüö!G.}’})äÅśRčń­ß+6r"ų,,›7’Ā’dīĪ»\{Łåbbæßć‹ųĘęŒĶE.Jd(¢śūŪ@Žu_«Ź“Pŗž#y<ī /]}ī}äCc8¬V¤^^ō@*ĮX *āRń}æv—f$0ī‡žB ,²6ÉźDZÉoGā“ģ>Å(ŗWV‰?‡†ēJü”-Ń`/SrīĒ?©,ź$1¹I[ŁEśŃ7®ü•1&ʂ}ĘēL“9˜6ą$^Æj”; śP6:PĢץ!qE@Ćė×uųłBŃüÅ*äÕ¢āĮāF¦4ja>J֊M”-ŠÉIwVŗ— *ÆąąY=ńœ%Ćæ¤MI¬ąĻ”=½VN%¹ÆśiÓ’,Le#?ąT&ļjP{¬¢ÖWó†ė-IE_'Lä³üķ·œ|Ča}’ūŅ×V‰Kē=^$lD "kūŽŚa}fl²Ūų §īæļx`ó–ęńPo;G 69š[XĚBoĻhčń:;.ݼņ½>͈¬I~VIpXеŠļ6›…M#0µ”uz¶åźļüxėÉÓ€ ˜4|d¾c}”›Ė"…Č+gaōötI!Ī·¾UŒR7DaĘčQ"¾5žu×ü²5ŪŠD©:P–­Ń6䑇\¶š“®µ+-ēEü±JOŹd§6·HgoTs 8žžŪ_>ń€Y›nß6ā÷?:÷Ś3ΜLŁŃšžń—æ!ā‰uR *s€äžń­QنŁCFl3j‚°µ6£P?D'ʞą< „ąē~ŽģĀĖ’EUć(ƒ1¶˜6|ÄϾó½|X:r²ŗgĻI›Ī1i»aęL-D”3%n‡°‘ŽYŗd³!M³ėÓSpcŲ0pY‡§ų×hŗł¼ rō1¼ųŠTiDÖÆ_ĻlÄbEņFŒµŻ_ŁjĒ'Ͼšōo‡ ėø&œ„[WĖGɍBāD³Œ”&œ(ūV€KčŻ$yʇ?wW(X)š›Ļ¾Ų æū~Glæ[øŚMb ‹ųöľpĀ>sOŚwæ#öŚ­„Õ²7Ž.iޫЮB"ĘD+³`æsüÉMĄ˜†ę”𚁿Üp“äĀņŗųF ēōų»ŽœŗMŖe§†”sGŒożżÖ[CtE%m"„ĻśŹ _Żkæ›ĻæŌ=ȇϾ¶ą™7^ŗķžoģńÅŪ§œńÅ#Ćń7bó%oŸ¾ē£ ¶ھļųūŒ&A¾z`—S¬\yöEWó3ŪSˆ÷ņnśæćÜńH÷õv› & 2µ¾é݇+†ъ ‡½ŒžĶJNlN ²võō֖éĶ­Ąˆ†LD— į!U(RJ"čn¦r]}!9S¼lLēHļLŠ››’į‡õĄęM³2Ł}łńŖŲ‘µĀF–/^Ņ=Fe[Ēžö±–Å’š«\ąāÜ{įŽ¾ūžų—}RLiŠ6Īl±IyH¦ėśķŚF?xć„#÷…Ł[M¦l›Ņiąąkİ67‰ėģģ³½ęŚ«•mhīųķMb¬ų&†Ēv¦P(Ä<‹ ē/Z8Q\; Āńa 8 “¦ź¦¹Ķ”é(*cY :-o!)‹‡k„Ä.*ŽóDŃMŒÄIZæų=K-ķX¹Zz R¶˜2́x5ŠŻŻ™ÄC•&5""1[Ņd÷ą?’īÁݧĪzż”Ē$/A`Ż_w÷öH 6āK؈Ķ>ų@Ēņ„ė–-–B߬1ķ£ė›āŖéÉ'›“—šŒ3V ¾±Āll0>Ó4™&LæļÖŪ²Ą„–”×^t±˜Ąßķ‚>pæ b‡Ā‡ōq»ĪÆM‡M.[Ϛ-Ęśģ6‹ Ä<ń÷æ½ß~mC=š5|d3pĪߓ\ą¾wÜóWG—P“„³)‚9[ '}D¾w½pĮr!N}b}1Ī+Čū…\9Ģž0›"žTŲ%ŃlD«Ytć ³H`æzäў#TIŚwßĪÕ«ÅZńż8\“ ń5ż:±&­DŻQ2˜šĢ­® ` 9ŸY‚Ąr"³ćŖ©įRŒlµƒŖWś~“Ÿōōō… v‰3kƒśųŃ™ą»5;Ž„vø µ ŠĪ )są+rÖģøB”°ABœ¶ųģ!ńē[d®5Ė}}}µęŗ,Ž$‡ÖʄÄ– «0FV›#ņ½’f沦āh£éŌŹ‚ S Ż)q +Ķ)²G™ž@¤Ū~śÖĒ=+;Å/ĘĖÖŚØćq#gŗj¶£ĢŽÄ’›4 9īf°A%÷ Ź%:x7¬Jģž6YQļo5GĀŖ˜“2ŠWŃkƼ„}ĪÉßüįń'PśĶ'ŸLj"(Æ«OF F_dŃŗC·Łyėį#GĻŽł×Ć·ŁvÓś†=ĘM™Ø3=ó—HXŽ“9cÅ(FCOLÕ¹Ū>⇷Tģ:¢z]2%…+ÉEb­-†ÄĘ4ÓZ†¹Ē\É[ūÉ'ó¼’AĀVÄŗŗPĢ2Ķq©„=o°ė[ģŌ>fŸ©ÓŽœ3gvCĖÆ/¾ŲlŲBč`X+&°y¶1~ŠŁįńßłŹ—§·¶ Õ:čźv›¦—ƒB̟wŽyi`°ćš‘æśĪ™=üdhJéÆ|˜£šŹŖ.„ÓS(D,ū…'’óļF`R[ ż«Ė.ńwīLNŗ§ƒbwn_ō5`¾VāŒBE2„Tfƒ‹~rV 0¹¹å®[n•>_–Æ—å{MŻ|¼żęģ$Q©ŽŁAĮł1AP¶bū®9÷¬m†–IMj®’õ—‰aw@ n^„ģ6vÜt/õŚĆŠ*ĆVĄA޻Ŕ·żź†ŃHķ1nŹŃŪīō?W_#>'ŗŖ¤jĀĮzćĢ}eH\Āø[Ś“`æ/ó8N.V„lś&Ē9AIĢśuW\ųó,06ÓųĆæ^Œ±MXEųŃOĪ$`˶aמłCńūN9ęØ=fĪÜjŌŲ £#É \LΆ^‹é“ĆvŲ³š'vķB÷›/¹Ž|jßi[nß8bļć¶N5n5vŒų·#IJ-ų–‹=š“Tfū”£÷?ķ”Ż”‚ ÖåÖ¼·hõ+óv1ż “·ž3bĀ…§~»äŽļpķś3ætŌ&ŗa2»œ0ųŻUW&<ĮjöÓŹ·:é¶_ÜųŃ«ļÄŪϾ8Åk<~ǹĻŽ>čķkw=v«Öa³›'5 ‘WKańF‚e,bDīøāW£€É©ĢHąGß9M$_ŚSå¼ąˆrƒ{ż·_z}ń§‹Š‰’8ń„éńäżĶGG˜ÕŌxČ.;K̦‘Ø|:¦b)ų£(3-Ū8A„ļ½ł±­Ø«1ŗ|ōܛÆ?ü܇o¼ž‹,Ła‰Łj«-ŅĄ4ŌOCżtÕø]ė˜4ŠVŸmöÜj[(ņ$—}RĄāŪĪõk”‰t3čggžČՄ]O'0kįvŃūŸ¼ņäó½k:“гK±…i1\G$L+W‡0ūDźŹ÷MĶžŗ~€ÓeöÄVšĄ—&Čܖq†ČuHŠ•…ó>yś”Gņ+×ĶjŸš•7$•–2™RO,ʎ¹čē ~¾ėėR„QŠ;Mš6gātɅ4õb„ŠŻ›ļ+ߊéö×.\zß­Yöń¼ÜŚ5bņ¾Ų|”·ēŲ9õØć:/cc¦ōbwˆ° Ģӏ?–ęn¾m Š8īĆ$°nöCLŪ\w—#uJõ  ŅĄIĒ+āą‘ ‘B¾gŁŅ4М”F ¬^ŗ<ķĄQ3˜üŅ•;ĻÜŌ)œ;¶ˆ,°YūŲνšßßžĢģŠŃŽ:ĖųĢ„éƒŅNĀĢ&xUŖ{ģ–æ0w®(@ųÖń'‰o]ą]¤eI()Ōn;ā’$‹_ŹW/ķoyĪĆĄ!ˆv£įņ¦wX“„ö˜Ģ‘•AF™?SČ®äŖŠĖĶć€|­§Ø¬c|ßļ§tT«¬5äšēN@ż9~…ŻF‰¶Ó²0§ŅŪhi›Z_j#4©ŲZĒ+čŽ£=ÆTt²\\> ¾k‰ ž»,žĆäæZ/@‰@„†RމšµR¢µD’¹ŽŠžŖĪŽ„+oæįw’øó‚U°+ŅPjC£„_:ø˜.&Ču„J…ņbźń&¹I+Y(?w}°’jC’:d‰E¼’k-ƒš#DwﯹfāĮ %L‹/&EP čī]šöū›Ÿ:±iX9±D “%Žd5ąīõŠH„Ņ_:ģˆŽ8ģžēžZŌ×Ū-Lœ53|B*ķ…Ō mdģØŃ~;źŲ#A6īŒ Š‘ś±$ī3ŚDR®o ‚BóCĪūÉŁ/>ūœŪ “&Mš0ejż@A”"aŸšRJš GĻūŌėÆżš¬7·µ¼ūé¼e½ėW,Y ćŚ9-H “Xh•„E“nn,0[Øg~Lś ŹŚ³Ļ<“…¤Žčt :,n½źśf¤ŗŅXģwūŻÓ¦ķø-A`Ÿyįłųń(d&‰’ėHG-Ņ*m€¼’ŻöŚgŚų‰®YžęĖÆĀ€NXZÅ’U9„_²Į$×tŅžTYH‘ųjłÆ¶ulöŽĻ:»Į«÷(õÖ[o „»ƒŽEK¬éķ*@zä10Į˜ˆ“ē„ J{:Ķ}>ĄÆæöа>lčš!C–ĶŸo£Œx2, 8ŗfįt½AĮjŅVˆbh(ˆ& Ű1zų°o}÷Œķ¶Łnįņe™¦Ę|ΉÖZB)u@—ź¬ž¶Œ(xFŠPU**JD.­ T©9’Rš\G«­APŌŠŌųĪ‡ļ ’7śƒ%f ׆ PXŪłŲŸļ™\ß¼ĻA}÷üs”ÕŻ÷ŽÓŻÕ;fĢø;n»Ģ”`ńu֞ä˜lĪ-[–ĖåzˆˆV|¼RŚccSJeXeS™ć>rĘų #Fļńū:ƒžĶ&O}ć‘'Ҥ-R©”cĪvē˹]ĄĢ=]o¾žzaŻś —ĻŌeóȗ¾øzՊµŻŪﲃcluÜå–`žžĪ>xÖO«ŗ×÷}ė»Ąe¦±Ō)¼’Ö;×żā—łž^G@Ļ֎™=m±éył7×åzt]FHʎēŖĮ&WąŽćĮ*x€–˜FZ‘»}(Ą@wć/?»žÆ·ŻÕØZÖf=pĮ…— ėŖ§n)Ņ9ŚvR@<ņÆĶ’šĆ¶ę&‹q°nƒH ih½¦cŻ»Ė)/ å-žtXƒ`¢•CĀŚr jͼC‡“466śģÆ^½"Štb »eDī]Ó!l^xžŁ i09f% Ėį bD‰~ķÕ×F ±¹O–rĻ»K›)Å}Ÿšč«/ˆ†%Ö,)؄„pČžo‰Ųę†!ļ¼ŪšśęfŹė{J)±°’š£!(“¬[·fÖ¬õ-ĶNC\a(E ¬,³gĻvÓĶĄ?R“+āhæi­+„+Ŗz‹T, )Ŗ08ś÷āž „_“bģ!»ÆŅZJ)k˜YĘ5¶Ķ?łµē^<óōo ą³é |Ä „°)ZbIŽšćRétŹKeuŻ.³6ķƒĶŁ «Æ,€£©—tC}¤ūņĻ’ū”yļ¼łČCžźWæ1jd¦©:%P¬<•MßöĄ½æ½ż-ķ£…Nʘƒ2¤”Že÷=Ņóׯź‚h`‹M6½ī÷7ŠaV MPŹ66Ż{÷= *P苔¦m6ū–?ß*iņā‹„†‘#tJL^cĆĻ.½dŲØ‘ ˆh g¤/Č“{ęż7qłåĒł˜ŸŸž±Gµdń’·.8ķēēxŹ P¤ iC:Iµ6œ¦X‰W‘@œF4  ±Ömcav1'|™K EGóeŒŹ4}ņź›×ßz3<ńD„X hÅ*Ti!'’īlb yū-Į(ēAH \,B(tģ4 śaś%ŠV‚0(š<³”ŠAQ¹¶3év}åŃ,"N÷$ņ CłjTÖćKQO¾tC˜į||‘ĮzŃ%N» ŲõWʓkēzž…*4˜ūäR‰ų˜žś’ę+֕yPxž' ŖdÄä T¬žSHrŠüÕ?yÕæWŅ;Np"ņx£W)x?0HJōŖo`÷*uYüBĮ¹ŌJHŒĄ#$Ǥ` Ÿ.žælõņÓæ{ĘAs÷K9w Šī0$¼$ž·Ÿ`޽!”Ó`ŠŹ1oū€sV9’•ŗRŖ~^ Ų(Uī²¼äż‘–ƒKn¹ņļ€Q±‚v¢Meo. W’K¹šdNEF@€Čø %ŻĖP’§·«ė¾żėŃ7^x~Į‡yü?a”\źL‘"°@)@«W^xqō°mCZ>śxžUڤÓ'~źū‹[P_¾ēw×ü‡+EĮ²Ą`ˉӖÆ^Uߊ“dÅr¬5(vD DØčЇĮøS,Ņ*œA&å,°äT]ö¬sź³}ėŁgĆYHiK.Ŗe«É¹^ &*Ž©Ūm3mĘ,éō'5»ģ7ö˜.ܧXcÜAFLŠ‹¼ Қզ{ķŗžMśÕ'žÖfåéÅłĪ|Z§„ž{ā©¶É„!›²ä-^µ|õŠž'%‹‡X%Ɯ`ER:ā’>ž([oµĶ»o½ ߥ 95, `žJr®ĪµT=A+ķR„萄PI÷­ų†…ė†4åLŸX;tčPˆŲžÜ…ēž·rķš¬ļøĖth…ŲX(!ˆØŗ $żĪ;ļ„R醆Fæ`.¹īz EŠ @D$ī0`€é?ŻŃZ×8$SæŁ.sŠ<ŒĄ’ ³LüļēŸ?tģ Æ¾$©ō?’÷ qˆ˜ō6\Ö9ŽiŌYep[ŖfV60d­@@Rž~—Ō#‚ĆŠ‚ 4 Ć›ŲVaČ^›! āiuėm·eRé¼ļšźćO)+¢ ļ>¾…Ņą—æŗ D’ΦfÉ*äņÆ>õĢĆĻ=>ļ“fŽ?nH[ēŚ5) §¬Šü|–‚X&0Į·…“ēÕ5d‡6/ė\łČ“=TsĄ¾ū!ʐĄŅ‚Żż÷ŃC‡fR©įƇv÷u¶džņ?·ŗ„”³.NU­(%äņ#چ._²4>#š·6{Ś„I¹Īīg’ó(|ż”SżĄ*åĮ˜Ÿ} fƒD+ĆBY(@‘UÄX¹hé³?ÄĢŻg×ļļ›¤o½įʆ¦V‚WrİKu'lęZ’˜żĻC×]óĖ铧Ōgė@J@N*ZƒHˆD ”‚ĶĶĶi莥_ݹ^×gqV‘X4œ¬•…ˆ=Æ>ZÕ¹¾ŲvŪķa J‰PœŌŽāEüćž»ółžŃ£‡O˜1$¢H1Z|<-ʀ1oŽ'uĶC:LĪÓZ€ ŗ!7^÷k2B†5)V§z—Ü Š”R)R œüķÓõvtxö—·Ü-VXaÖ¤Ā8SBó^~ćāœŻꇵŠv !ÄPŠJ§¼ zų_ŅB \üóŸ#é8 +”(Œ½ōrIHˆS–’ФFā JŲ4 Ąā$Öw®' å‘ņT`M”\uÕ/8ōĄ_~©äķi°uk5i ]•;ŒėÜŝ!% `‘ĘoæŚåįõe ęÆZöā Ļ~ļŌ3Ȃ÷?złŃ§tĀ)'rčć=ųµ“’Ā—yāÅē(›&/ &„X)ƒĄš+$¬”vG¤² †ń`,K˜yŸĢ_8įĀ?}ćõ7›‡ C*MŹc·nćĪÜ/~hĄvÕĒ‹.śĮŁo}š^Ÿ˜7ßzŪ†BNˆ¤ ńŅP^ŸōäņŻ=?:ū(baRJdӜŅl¢¾ū“ß|ūmē^pĮmwÜ1tĢh­X)Ń.¾õDi«„TXP”Jy±<$ą` $¤@JE( ˆ\Cp M¬2ण¾rŠ^{/ģZ3i«MUä,NjŃéĘkąÜ]“÷Ó!Š p8w3K q,lVéŖUO„”$F2G3 *’¬å &åāœoČĢ=ݽ&°Ö0—lćčL¬x‘$‘ÅCģ­%„äČ ‘GŠĻ RgTl8³Ę˜T*åāĄ¤0d.—°V6 Zėdא6ČÉ’Ü%©ȔiĖyž—Lß»¢ń€Ÿņ¹< ŚŠ§•P¹.\kīI)”Ž‘¢nR¤+}+óƒWÄ*’×Rų*_å*“Ī8Ń9v§‚qŖ‰ŒÆrųę3gŽ}ļ]·ŽwŪzɟsÉ@…‡4,÷S%ŽĆZ—ćI–ćIMž0Ł0P’”Uįź£Øō;ø”LÕõQ«:]µ¶&ŸQø¬DŲPyžēņ[żÄĆeˆ5i±H¢ Ŗ\^©XHVkJ„¢ŅŗTWP%8Ģ”óG“ö™DŌŠŠ[EĘSŽvĻX]/šz‚üĒ3nĘ4 \xõ•ėÅ4#uō¾CKrz‡¬œTؒ˜Ń:ķ D+jmTĄĀ ŗŗŗžęŽ;Ž’¢LßŖīsnš<Ć0Ć0Ć0CFÉ  €ŠĢ®īź0b\ćŠ9ķ²Š®ŠkVŒ(氊J–œ$Ē&ŽpNwÕūžžØźźźźpśÜöū»Ÿū.÷žÓ§»Ā[oxŽē„ U¦ž€€Bˆ†„źLŠĀä§Q€a<\¹Y ņtf_”“:  IĄHkWķ±dɢ˒'čėko¼é¢Ÿ’dK2¹lē]Šč¼1¹iIeŌMĀ4‹÷üŪ¶lžzčĮG-]Ž_æ¦Aj!@ Ø!b„„@\pžkÖīŁé^÷÷kMŁ<– Q(0“{ģ±Ēh4śŠĢäŠCÖē^@–z;Ndą<DT™€«6ģć9H<Ó>6ń—•pĻd‚5ERēX“Ń"¶Å‰¼ŒĄŚTŽ_÷šW3Ą¼‘‘×½źU  Y“į¾G6?ŌS½{~ŲևŁV‰ū¤®üć„{ģ¹fŃź]ż÷+vZøhNwtzzŚi_×”±:QüĄ}÷ßrėMž2¼å֛¼ļžm›·üłÆ'½ųŒ;f¶ĶŸ71ē®[oĶV Ū”е@Ęß ń}/~Ķ1{ķ’Č=wnŪöŠ…ßžņēæżÅē¾łĻžē—@Œ™ŽøõV3lC߯•ŅJYȉ‘Ń믹fŻŗu (eÅ:‹ Łh[„V„Ngō؃€®”wßy k–@f=j’Bš sd÷]gM’Nīŗū^ĄHhDķą3Y¤ų¹|ų†kÆītå)Ļ8bĮ %mNŽˆ96yŲ(!:s'¾ž“önŃ:X0ŽM7Žšāž'ˆG‚Œłe¶¬æĪK&2±,œņ¬Ó@¦zq<ń‰·æŪ¤Ml€D 6Žyß~š“ÆžKū¬\=Ń"ƒ\CŅZ 6õ9 &@€Nē©§œĀN܍bŠBŲĶbVŗĄ)sĆĄKy£-[…ö K•®Ré ]x“įóēĻg¶!y·¬Z/]ŠüŚækj‹ēĪI ÉDIöā6 mnNŪŖ$ˆā„@Ÿ÷”vH€g<õŌO_p¾‰÷;ō ĆO<öóß½šę‡ļ9ę““æżĆļĪ‰BJ„Uvœ#Ęq,cHµń¬¢”;֍ˆ€€@›ˆA1Dbłn+—ķ¾’HSxF@M€22§¤šęļ¾āÜó>øvķZžIdOE „ A#*NIˆŲLk(,öɄ¬‘$ds®™³G±6Ą4F@Ö)Åā”¹ø9†¤Ā‘”3ބ¦hpšĖrZ˜†Ū‰ :%=’ąW?„$„F6‹Ą5rD(É®:iÖ”0ßHŲ$bqL+Ę-SgōŌw¾äUÆ9ķ9ļ{ń?÷oøcjŪ6—Æqe†Š³ÕC.ōz=³ż ”$*’å„c›ĒĮĮQ±ĆĒ–£ ćxJ)FFF¢HŹHįC™j|Ż:OŅśŸ…0ŽĆ=…é`"ūhuN{š¦¤9—Bļ×DI÷*åČČȰŽzQėD‰ƒź#ļ Õb,} ^*ļĶ …ńOÜ |·ßT杳ēkM7?K%ŗ¶ś-•Pģ†6čDjÆ|žÄķčÉ®nā/õÕś¤éyóä(L“ĢÕ¾ōą½÷q)XrU4ēāļ\DŹvcśMĪYÓ5 ųŪń,Wq`P”ǵ,[UŁ4k†×į*ā\ŲŅą÷3ē½UŚć ž 5Hu‘wĒæķl‚f¦z>ŌüTĮ:Ö¬x\葨—KS£hĮæ’åÆAgt÷ŸXĀ^wMĻōŅE,Ņ©ž«ŸśœS÷;üGĶ}e‰pY§¬Ÿpšc<~Õ;L>ų°ėŠc­æ}ĮžrŲ”‹[»–•6Æ÷%:8k¤!ę„“ķŠÄ}ę™ģB†PŹŠŗ˜×üīwæė¬X²¢æķ=<£Ė{!ģŲ%+īĀZqš0§€pźA‡Æ„ųčU{>iļ$i… ·]ŠYóėXµĒĄ|!>ņöwpbi<³v? 0ÉmÆēT1÷“žšÜ²aBF€½vYĶӚŽtļ†æļ#Žł†2” ŪC›õķ¤S3ėÖ®A€9ˆ#Ó?ĢI’÷GĻ‚e°Äk ”ššš hĻ ½ńäµ 9{¢™ČŚĶ̟žÄö[²ĖJ1÷×_łŽ#·Ż;¢Ń~īüœ¶${oN†ÜKY%’õī&GÖŽĪż×3_ČżÄR˦¹YHR­‰o¹ōŠ]ÅųI{ļævtĪ_/ł«Äūū‚šę&ßü¦sFv’ń"{­ZĶi¾ŗr¾ßš)HV”śĶ‚?å{³ČāCŠū“=N(ąõIz©eÉŹX‹sӑ}N•YŸ‘»|óÖ-\ŗPvĘŚcķƒ7ߖnbMš•¢ō½Æ}ż3wō±ūģg˜ż¦o„Ł0­’ö»ßśŽłł7æuļu×4oÉvZvŲüyG,\š¤ƒb•š;Q‰Ö3)§é‘{®9hž¼ćv[õ‰×¼ZßzĖćv]uą’>öŽw1÷˜8UdśŠ5§ü•÷~čŸO>õˆEĖ?š¢ZŪ†-\«Žn2^ø ˆS<<''ę4}Üŗ½_vĀ“ŸuȑļyŻėyŪä. ^¼|'€GnæŻńź“c7ŗMJ’žū?ZŻ=£9oyŃ+9±“°å¶»[²ņyuąŲ‚łk¦ż58yÆżWAüÜćOąT;_o +¾źŚ ;g}ĀQ»ģ~ųŹÕ Ī<åiœ*ßrŚ–^ĶŌĻśi§éÖ«o²¦TyüĄZõ7oyč¦,–£cē"N4eŗ¾–DJē­‰ö4O’Wńü9 PLpo:c:`RZå|ᜦżQ€żę-X76ńś¾3IŖLZÉč¢÷[»ö„}öżęĒ?qżļ~Ėż¾öÕ2•™ŲåHÓ1>bnwŽs§†‡A©ééÆņ3ŸxŪ;~śß_½ćƗū²Łu2BxÖ¶;šŌś‡4™“÷ŻĻ“_HšQļ›UI1åōZ9aGžQå ĘŹöxäC”™Ļ3ž~ S’ѐ§…ŠŠŗö~»Ēӄ•Ņ33GqÄĻ|f!Ųgł.Æ~ĮY׿łĻÜs7÷&M%ś(#)äVT·ŸO¬­‹:Ģ%bž@¦Žw0š»7ƕ“Id%‰*vŚ7q¦Z”ģķ9ZØ9O*I ey­lÖņ9%¶L(–Q-ģ¹õeķÜł:Ęų¤L=e$ĒžzŌ±;CwUgbg{FsÖȉ÷¼ę#,oLVĘ™é)śŌV†3`—\ŹÜ@±’4M{½^YšŲģ3¦kˆ~Ś"3¾[HŚ6wü–$W©ģ{4³(—u[+?¢Üa»£z†kž.óY©µ'¦ičøéQū*/[‹nPĒjhjųIŪĻ‘]·ČrÉ>ļŪ ¾eī ȜŒė’|Łs|āAKŒē4²0’(²lŻł’ńŸz¦oŽeö©Õ Ż4īł{Ü39™Ŗ.’B ąnąJ4¬ēóå‰j¤}„Ż*ä Ģ“$SīZō<¾qūøb}śdH„Ń3ż «pō1 —o¼õ.£™ö ¬W7CÆyĪ‹^pÜS~äķļāŌ°“«„UĀźū}{`5޹óŖWń|Nū†—”©ĻiļȽ÷^°ūųÜ_\ųŒ{$ĄĪ…yĆŬXė«ō«—ŸüŒÆ~ę|N™ūŠūŹzŗ)-źŽÆīĪ?awį×ĢÉRŠC.‘·™qq ›Hśä'-ŲsŽĀŃ£Ö¬³2¶•„d” 8Qzėµ×tÖ,^¼äæžö̼žœ¹‹ š·Ž~‹!/!+ž’^õ·Kc€.ĄĖ–_ž‡?¾ā¬³·<ųZ<1!{؛OO‰?÷ŒēĀŖyó'¾ńÅ X'öĄ%žžī ½ń<”ø€·¬š˜Į£g£’gŁSŚ’©žÄ{Ž7`gˆVGs/łļoŽt¾ūŻļ–“ –H«éÉ)¦äę«®<`Īāu9»Ī]ąĪpėW"fbžų9ļŲslŃĮ;ļzן/ćŌ(֚=ę“»ScĒ’÷æ7Ŗ£1 ”Bõ%M֘8Š™§ś…‚%۟±ī©J49ŗ Ģ„öķ›ļs6xöq™rbŅėø颅]WÅbŚ0(!žI Qā.ųāÖ¬;zķšm·ŽLœSĶ”pŚūĖ/.yÓ?½āāļ|kė÷ævÆv[sČÄÄ^Ǭ[Ēż>;R\ĶLé —]ŗ÷ü‰“VķöÕsŽvż×æū¬uœ“l·ż.ā“ĒJ;×S=°qŪĶwŸøß-[±DDwßt£¢4eŻcŻc}šu«E<š×æ^š2÷ĶŠ+ŗūŅĖO=ąÖģ}ČāejćFNÓ²{Ą’e;ƒXlY’ˆS-¶;ĀŲÅéžéGó¤żY#_’Ōłœf柜Ž{lžAs8¶ąs’ö>ī÷Y«—½č…§šŲę.X56jxe=’³ćxŪ½=åĄĆžuä±k/Xun¹ōÆVōˆ˜‰ūڐŠjKĄ•*zą‘{ÆøößĻyė<€wœłŠ­×ܶåź[_õ¤gž²ęĄSÖxścX#g=žÄ=£9K 30¹q³/"e³<&Q’k˧Ó[6Ž,Œ¢qĢiZØu±™"Öz šU+—<ūä“ĢSdÜž& Š_ųŲGŲmÕźÅ .’Ķ/gf61%­N‡LCg逖“Ž!v˦ְͮŖ3±łĘŪ?õÖw}ēÓēæę9/X=oŃŗŻwĀćzó[ĻIuÆŁ½Ļy®Hżįæ{õ«’¹79• y”][Źõæ?|ІPŖD…±%š¬ 2kf}ķ߯üĮEß¹÷ž»ņLX9‰ļsłea†NUŅė«$µÉYŅÉōŌ¦õoŪ“‘g̳Āģ¾&H ÆXG$ęÓh—Š \W›©c'B #÷¤-%xa‰éšĀOÖxZ-EjāKcŖbw»Žs¤*˜œ‚ĄĻ×ĖpRffŽtÉa W>aŞ»B|̲5G-^õ½/]Č=eXåéRņ½DŸIīJvF7ē4Hō4‚Ź~`Ćkķ~®PhI[«+$<b×”čiˆe”8ژ½·ƒ8ŗ•Ŗ¹2ŠÓ,É}ŪXõŁIł–š£¬a#®2—ņŠ Ę„+ų„r6ÉWĢŅåˈtĶ&ԟģ‚ž7æłĶ1Š €“÷~ģAŻė s芯.ūåÆž|ń%¬“ɇ;_ ĀK÷<»hß¹Œ”R‚g€ŹQ_0&÷Ұ!±c~.„Äī8ItžyĶ%mŖ/صm“ē’H+¬;Qm9›Ųręi`öKŅaBݬŸżģg€Å-üÄ»ŽĻżfN}ŖłuĻ>ūq»¬Ż G—ƒģOMjZŻ RS›7°žģ­æoŸ‰‰cv߯$Ń_ōœē²Ņܛblŗ’ŽóFGb÷°=ö~Į“ŸöłO|ī²ßżłįŪļM™üüG>łƒÆ|}ż-w¾śĢ?ūø'}ēü/żķ§æzĖK^µvįāĒīŗjÄ@xå•WŖ¬ŒģüƒC<° °¤ŪU7–ķf‘»ø”EfĶJĶĒh `ńČŲ(Ą]·ŽŚ”žķ„<“pŅ£éÉĒ=öĄ¹;ģ1:ŒF0°jĮ‚ wßcōE“é™l®§ÉWæō…³Ÿó¬.Ąq;ō[_ū2SĀj†)×6sŒĒžÆ¦Ņc0pāaGr_Ya“¤–>ݳ>Wa½Č“ņŌĪ•fϳ{•²"Vzg9rŠu‡Ļ[ž¾³^¹'Ī:õ霪:ęsEz¦ßKY÷9]:::`Ķų‚‡Æ¹1sŁU}YÓiĒtā>]ćö},÷””6ķ‘J‹zĪv~uzęóŸgmŸµ{śq­’VĒU”> Ž’’sY„)Ø8łŖ—³ArQ"U§r²¹JĀÉōu’ū§½ó]’ųūuzrŹø_™JY'—üĻ×Ī<žųĒÆŁķÄż÷VéŒĮ›OØßO7m^æqÓĆÜq÷§YõX÷O9ü'ÆŪėyyĢ©{īł¾W¼’“TQJN’L„¼iÓYĒ󆧞vŚž{Ų{Õ±'²ĒŽ{Ę#/<łäĄ^«V?ėħ<’äSæņŃOŻü»??vįŅē/9vŻ>œ§ 5§éŚŃ9kŗć{ŽĻ=~’óįJT`”KA|é66ń Ÿ??8hlį~ŃÄ N|Ŗ‘°6ž • Tz’…Ėö_øl`éų&Ķ*“>JŅžō”ĒĪ]xšüÅÆzę³9MŒÜķžsęµ|×ƗÆ8ļĶoU”jVL)ė„õā3ĻźtLCāŠ‘±¾į& A:eR·6[\Šf­9†hĄóźÖpĖ/{ĆÓĻ>aõcŽņÆēŒ@Ōщ ÄĄ\u:/}į‹XigēĶüŖ$5¹ĢW¬õĄ’nwąŒSOĶö! 09¤Wžqö€–ķ¼¼ÓåžvQ1)ę$Żrß§}ō»_’ŗtĖ&V}ę¤|nśntīņzi²²J“gŅOg¶l3c5äž+w÷:sĮō|¾ķMod„¹ßc•®|p?Yn.“YÖ•f_"®ø7+ĪāŚøģoP f-Š©Ģ6))­Uāž`«øeīėjzžŠeRʚW OY lĆĖ7JĀ£āŹčh ÜlHĒ:ęÉ~šć:ø¤Q !ö¤+sžWQˆū@ ĻkŖNUÄŌĮ]V=/U$ŌŪ°yb¤+VAtģĀU'/ŻóĢ}üäū?hį`Zt:øW_X" źLŖ©Ū„Ów#µ.ä#ØahI )#T+ę׳ą:n†Ł²/XX.YÕ' *+ŅĆʖeéV®ĮŹ×RżHęŃVØćTŠ0[ęu!6xFČė=;K1»x½ķäł&Rł)frÕ]c#¦Ņž¶žĢļ’Ū €5Š=z§Ż÷ķĢ=}’C7\q-÷R{Š&ĻÄÜ3ŽŪDc>”mH¬CQļĄÅoēasEķ§,|œ*ūk‘T^n²øÖf7‹‡•pŃFiݹĪy ½ØŚŲę',‹gµv:ŗĢ1Š9ó@,錜«"m@PV/᯸a­˜8j§ŻŗˆOŹSŒ™Ynƒ(ӔōöoœņųĒwĢw’päŚÕĖē_ÅeÄ©ędĮü¹]€µ‹–°Ė*ÓĘ0Ž1æÓX,œšśÓŸæÆœ»˜ó„廹|•ek`¶ŌŁI£™ōYgŸZ¶bõčÄW¾šßAH_0 ¦ź’2'¬¦'Ö«øžŖ«Ķ™#"€ü‰ØbN³ƒ'%NÖÆægæ=Vī·|§•#BŲ¾=3ĆZõzÓ)ēŗ/ŁBJ™ŅėļgNX÷˜ś&ŗ×:ug˜ńØÆū“=«Ķ˜ŅŸż; 0G«.ᤠ§:Kąti-5Ā{ŠĆąkng•v&Ķ:9xĻ=³dł ģµjĶ€Q&ˆ· ČŠYžćŸ\ Ńīńw½ō•¶X”&LVóW?ųŃ«öµyĘA‡ó#[ŽkĶ¹Æż—µ»,Ūgån§=~²ķ?ŽXøė>ć –€ųšŪßĪ”z™DŚkāńCęķōœĒ”„ēĘéCvŻÓb™Šhšr’pÆüįGŽ#¬œ?gˆĪ:īÉ®TȬo’óåÆž‹&u»]€ļ]ųUSJµ S¾ńE/ŁotĪK–qĢqœ&Ä)qzāźµo~ęsw—ń’öA³7łńŽĢ”e)ęz8Õ6ĘŃÄ õׯ_bŒßyו±l峎zĀA+V±ēŗ1€ ’čAĖ®$ąµ’śj?X Į^k!ąĪŲŻm|žŚ;Å»„ÉÖÕ³`Õ\įął;=eŻž/^ž•~BOĪ䨇 [Žł²^)GV`ēŽ›nbJSN§åÜq„‚½ūBā:ēM×]v9÷śVÖ“€.“e¦ķĮ¬_Õ| ģæźForrŅ“ Öō n4ØœĒŗŠQ%Vy;1°7Ž#”ņ-Cƒ–dP2L’¤RÄØį~¼®<¹C4 :‹ĄuG…ij27_@öĆV†%“wšÉÆWĆ>qOóę©-wßwŅįG™“{%vv¹ ä‡Ļy³ĶV’ĖJgGcVŪĢtĄœFmń¼>ż“Ūq‹F®źo³PĢæI’4O‡KĘlO2ĀD2…C“X*·Õŵ9¼U¢“^šö•9ĄŹą"+éFU…bÆ©]«~Ū Pė<ɧµŽŽŽ÷ĄuūO,eMŖ×÷ńŸ÷ßwģ њѳ/ߍ§•ĶĻ›°”Xė”©ĻżiNūS?øĻźŻĘt"€įS;ρ3[7ŻÓM{-Xŗ"£8°°320 °’ā3o§3~ü1KwŪ»3gwˆæˆ]»cgžz*§JėŌ…šŹT’ff8MĪ?ļ¼E; øéļ7Üē½¶™^é ĻŖ?Łėoķ÷·ö§7M÷·ö)IәmŻŗuėä–鎻ÖĆ*'Ą)-'ŖĻŌO·lzŚį‡ÆģtÖ-YtڱO`°Å[’«…jÆ mö©‰Ü L±äzHā™)Ū&4*e`ą¬g<3 , B«ķCbƒ >½vĆfnk¾•¼¦Ź›45«ž­W]uÄ¢å{Gć뢱eē½žMœ¤ō^Ļ!æwėҟżb)DĖ!zʁ‡|ņ½ļŻōšf’·=ōš_~zÉ€±;šś—æÜõ+„XÓ#ė7Ų®>'MĢĘ’f­(éūPĢ‚sI<Äw£7VhtóėæÅߞ^E®¢*•łˆ¦Ilff†8MŌ «~{„ 8M}Nū½ųGßm×Ē­ZqūWÜyćM½m3£›ŗœ†Ž¶u³©DpŲaK1Śgl|ĻøsĀ~ūq?aÖżD„Ģ=¢>%Dźīė®Żo§wXU±üTāęžę>±f­õĘ-Æ<õY'ļwšMÜ}Ć ¬SNÉŹŅj½ĻŠ‹÷ß{t‚)aMū,[50ŃéD’zĘŁ<²bī+V|Ļ-·›„Ō)&öœ»ųģ“O=õ„1EŻĒĘŽūĘ7rj*2YøHéW>õéU=ķĄCžøv_ī›Š·Žkdü£Æ~ķŚ‘±Æ}ųć&qóøĆ8rĶŽū,Y¾fÉĪӛ7›ėd ¬Ł&ktsVf-iĶiśņӟµĻ.;ĻxłÉ'«üć3ļ~×m¹”īæ’æŽóž÷žóę?žägæ¼č‡ß¼ąKozł+>śŽw~ąķļ0n­S»L*˜)Če÷ęc4p` ©»p&ĶR?få,š7!FęG_ō}“|÷ŪĻ]Żū/Oīž{ö{’é_¹ŸŲR3 ą×°ŪAiŪØ©)š5Ӆ(fÅ&u•Ėšz)ȜQ‚5éŌEhł”ŸŻ[Pk rÓa¼2$¦Ę8;O Ś+Ō€õ¶aoŗ_Ā„Ā‰õĄ¶„QkŖœYš­yŽ^Æēæ¾ßļ+]ݰc,FP=Ī”$åŃU ĢŒÖ`›‡N”6{8¦ęk°S±[„jjõę˜VšS5³m2éõ³iÕå¹nŗŽ.&Č¢ŽĶ§Pzń¤żQķ›C5Uģ*¢Jæų“Ów¹×¼%«ē-ńXA#€©M›Ōō“نnaä%JĻ…³©œNUu‘6”W²(·¾e]Vb`bxø„źļ°įRóżlŚ“‰™“$öšģ35޳K j­‡ ‰wął’ņ«Ķ ĀP}+ ž0•ĢrG_ŠęZĄł€“b£ÜKidŃ] ńȆ‡Ļ}÷ŪAŚŅV 0šŌCŽś§§?§·i+;¬©‡^6Ē^-``X,{1·W>Қ/b;=źĄaCbæeæl_ĢĘØ„@š‚.¢Š”JŲ™©Jč&.“|•(@ō€1©Ķēł«¢š›üšę÷sĒFē5ÅыwūĪyŸć^GĻlÜrśq'ŽLD¢š“o~Ū¶ņöSćDs?Q9¹1÷gøćöó?ł±UKŸū¦70Yß.į$å”Imݰ”æy˽·ŽvłŸ’¼uƆ+žśē{īø­Ū÷’ž/žūŽ#ę-ŠÉ¤,ī»ėN×īhĻPŅ*I3/L«ŽĢK_r6tFFAüń'—üå’ßÜś—+ļ¾źZZæ‰7Oßö׫¶ŻūŠ…ŸżÆ½÷ßoŗāŚds§Lc¤ė~²A~˜>š@æ®{Ąō*=ܐīiÕcJŒ;Žgr†²+ö»:!ą½ "ægĢ‘Ų97ń£üąĄ¢ī蘣œ]oæ74&‡k¹vTš\IÆ÷ę³^“Ŗ3ŗkŌ]š‹Æ“ūż”UŹ*wėµG@¢ó>É’łĀ€q€9»ÄŻW’”'ķ±Ļc–,ŸĀ1"b[9±ø#Ķ[7l“«‚,}`±Ą¤Œ¹GU况׫ōքÄį.«l?«ī*Ūs^‹ŪY)•j•jÅ}Ķ3šūĢ=ęi┓ž&ÅÜ'žīц ÷\yŁ> ę“lɛ_ö2N“źĶd!]ĻLM›čżĒßśö<+GGö^¼čē¼ž“¾2ØrÆ{ŸuŚß²iē… c€E ±Ēź·½ģ„}į‚ļ’ŋΒŅŪ_öĻ£c(¤€ßżö—¦Õ«}Ņ_ūź óö˜;ēśüüł‡l ``ńČXGH³ŠSk°M]HJ§żD%©O÷R>pƒÕ|%̉ƒĆ(2#ĘĢŖ×÷Ē“‹÷£µīõz®ÆÕżPnČ üŸ{å‡ÄƒRŪa-Q—ś”\?H_ĶLõŠ,MŁŪu,Zē‡ō–^X›ö“ŽōLŠ6ÄUńHå!¢{H†7©ŖrėBacˆxX»*Åą—mŻąē%JĻl›$³ü2°ŒJRŪ¶ķĮó4bš\ÅĻ*yåk·&·NÕ¦Q!*&Ļ;ԃŗc”Ž„™{ЧV<¹~ć¶m[˜õ÷Ļ’Ā‘{¬µāœ±QrĮ°ń6ĶG˜(ˆ`-Z&! &É üźzŁ Ł>,ōŚż+»Æ‡“›£Rś­Ün¤k›ęĖk?JŖh°| —®č’Xß®ØKįÆf^¼åĮ‡FŻ{ļ¹'r„~hė­ū;oé¼×~ć-Œ¢…€«&ęņt)Mµ2žy/Ė—°āŠ®Qó³Ē›bk^Dd€I¬īõżå’yĮćŽŪ+?|ńņy’ņĀ2iÅz†uŸŁŠ·ęZõ’Œ»UŻxŁū­Ž£ 0pōŗzĶS=āq«×.ųā‡ĪŪkį’ļž‚\yÕż·ÜFSÓŌK8µ”Ž!å*0sŽA]Å}wYõ9ķ)ź'j&ÕI·6öZÕ¾ČQLQ D)å‚&žŚ²¹°ū’„#÷Ž{7^²TĶŅ@ū•ŽY¦r½ØŽ¤EH1ėcöŻļ1‹–ī.ŗūŒĻæå÷āÄz@v9§Š”öG2ė0ķė_~é«Ē¬^»`ÆÅ‹Œē!#č²rw~hC!T`öū;T¢]ėTžbØźźi"ka‡…Ō|ŗ!$vfŁż`šE „”ŗsČśō½m)ėOŚP=eŪ+e5„f6L&LN=øéW?ųÉĘ»ļęÉ­ŗų‡+Ēću‹ē¾õ/ćÉiŅżŽōŒ«Ń„\ Lwŗh¼üłĻc[ģrX?ŻēT«„µN6nńBĄŻĒęĻ‹ 0"-ōc p.Ą.ń’łā˜² īļč^rŠn+—HX֕'ļsĄJé)&„œZæĮņė[Fe ŲīOM~ąž€ĮŌBĶg÷ųĒ’ž—ædm+ŗY½uöX'ĒÆŁūœg±zb÷mįīEǟxÖ±ĒżÓiϘ pūßo`ͬR"Õ§$e„¼>U›ēō½1Ū‚¤½ó4e°NhzŪäŌ#żd+qæŸL’‰ÉF…)'Ó¬¦Y%.qSbæ×žm$„ ®ĮźČˆ»åŁäśĶrœWŖO8äšyĖÄČņmw:Ÿžšyz¦Ÿ£0J€ķŚj†ĪŠ™õfĄ€3ĖÕćŌō+g] ī!ó°<ć±<óŽ+ę:µˆ$•J!1µ ‰©¢Ū6ļAÕ^L„sņ¼“ÆČć˜ĢaÅžįŹś›Åć(ĘåFŠŹų°ÓB!Mi+ é¦v0ĄŅ¬ŠśFWŌ $ŲŁ°'½ģ“MRN%©+Wōf;˜Œ®ŅõØźa1¾SæŸŚ©qŖ}„ݹD%äŗv‹M3ė/~éæ$Ąń«÷>rēUé÷-€@ĄˆöŻyee_ć”UTąóĶcyŻ4…ķ蹇œ3’“aœöĻøańϳ ‰›ƒĻ0lŁ|ՅÄåܽ ¬¦¦¦fń,ua|[ÄøO†÷hŠw`hķ§ MpÕžŹ–nŲGrøł~ßtņræØ¬KøčČ{ܹDd˜?­>“1@¤˜ŌĻy½!4ÜYŽūņWOON•Sdęb’ģÓ':ģɀ=TwFęĒ<åiԁ¬Ė³hł®ļš°9cUQ.f]/?ą*wėKÕ$k(µz’ų¤AHģg—81sŖöX¾‹qĪ–Ķ›ßƒģbŒP t;āęė’ĪFA)ÉzķH[xŖVšC„ļCjU&¹äé÷dkR)ūŹ.æöč=öŁcĪü¹pĄž{?ņŠżŁŠ+ę2³#P)K„cŠzIĻ Ż’­<ōÕĻ’ēMW_qĀćė,ė¼öe/ŗöoŗłźĖ¦6oнIŅ}ę4Õ=‹+u¼”¦#ˆX§žS1$N³@.ĆZ*¼LTźˆ1 æwĶōŹRŽŲōy 2÷уJښsŖ’ėcŸ0Ā/.ž©‘i©$tW8s4¬­ōW©/"uī[Ž0°åĄ?žģgŖ×/G½²FAƒÓ™é­ ÷ś4óŒć=ńšCFĪ8ż”=—īōī׿Ītnū™ų‚kžŪ·Ü„0ĮˆŅõŁÉ(`Öå«ŪōWõˆREmGé¼n { ¹ńL’ ‹;˜€ĮĪrŸySŚ»ķįo~ōówüķŚ >ņ™ó»—żéŅm›6¦½mL3L“Ÿłš»÷_µÓI‡0uĻ]Ä}fmź~ž”QÖØ¬“‡Ö?ų÷k.Ÿ™Žb`©!>2tĆ(•„®Ö?²aéÜy]€Ąėv7šĘ¦cvåņeéĢ“ĮG¤IĻoŗ!fVé·ærA`ßÕ»Œ#t- /üź—½–kf÷QšSEœÜž›óӋ’pÉ/~ł³‹o¼öļ[7>Ā*Ķø 5ūķ<¦ó™“}ģćWīvĀ½č+_1ū|õkN9čąyγē|ė‹_į4z(«fēɂbņ"͐“Ń£mtb2ŲAŲIgÉ2“®2–Ä“š)¤l¼Ōäżwß#:#±+(ųĶP~ķŚÜŪæ¼üå€Åó&b)`|¬óȰR¬YĻō ½F2¬øzi²ę¬}é|ńx§ĢØz(ŒœØŒĀĀHui(hŻ×a}¦ĄģBāA9čÕe¹pŖC ļäÖ©2’–™GGŖŲ¢0sݐI<Ģ:h[uŠūźŲ" `”öUuV󎊄ä>ķ'¶ Ų)į9ō²®!ĮÖ@9m°Ź©*Č/U<{Õųą^óŚīøūĪ;ļ¼vż $ƒP b–ģŌ“J„”?ųńžžō§ūóRe0ÉY‰»ļü‡RźūßūŽ+_łŹ›6­Ü}w@{«¤µqårūš¹o¹ųā‹ļŗļžÉÉɗæāŸ>ōɏg+¶ķŗ|ĪæĻׯ|ö€·’¢’<ļćļ;÷ļ|ĒŪ>’łĻ?įÉ'~ś‚/‚Œ€„ŻĀZkD4f¤n!Ys"Г޸ö€ģöbΧ@äVĀl>wół’`õž*üƽø€›nŗį»ßżī[ßznÜé 7æę+¹æ2±ą-0¤‰ŠcÉ̾PJEq Ųdź…ĶšŻ•(Āˆk8 ˜Ū w1h­£X³f~›Tv š×•{(w?™gˆnśü˶t›ķgĖwe¦’$ķt"DŅ,$2Yœ£BHdȟŃü’ ö°i~Ć‰Ł!XšĶ˜Y2(„ā‘q``,ķ„“ÄHŪXŌ|`ÉVsøTŖ ·ķŽEģÖĖ?:»nńµÖīh«:…ŁŲ=DSg…ˆ: ]šŁ’|Į+^A„Čž ŲnGؐs \1³B€)Ź ¢p¦Ū.$»¹č®xū óøƒ=:c©Ä/ĄšŠ ŒÜ1326 Įn­ 7†räLŌ'„pę«ü)v{¶<3cy94G”ŠdµŚÄ¤%©Œ8\øa ”‹V÷ķ„¼ŁŹļu汑/öo·ź³BwÜĢŗēqŚšĻü^¤©•˜/½ņŠ÷æ’żßųģēo¾žĘõ¬’Ć׿sō™Ļ‰ !ˆl*MIó’ƒÄŅÕK-s1Š<›1;ˆČ…“©üqåх@ž‡Ę3üou°]ōąYa ½^o“;†UnwĮÜ·0vĮbšüõó™«Æ¾zÓÖ-K–,9ėģ­[·nÕ«m°ä½æ.šĖcx“›8xYdöž`üŽż÷7.ų²’Ų×zÅ¢ÅūŪߖ­ŽŻ VÅ0B³ok&Hf^&FQĒ–(d8āˆfSxīZMš©n«ŗW į8 óŚ&0?‹4ĚnfDńåÆ~õ“ÓN»žśė@03J˜Ķ—R"¢‰‡374{¢qaŃ8Ęhųß.DŒĒēürĒ]w|šĮ»ī¶ €mėBĮł¹SŽļ'Ģzdd$[6‘›—B0\ŗ½`ƒ»;ń­JõT²·ƒį7N6J;wX’^/Ą°^¦r°kˆˆLvģĶ·sH¤”ö>20  HčŃ„æśÅŸł¹cćėÖ­{šŽ{ö9p߃:lŻaĪ]ø@#h†XńÄŅåžĖ償õ¬ēÜxå5{|‘޲HÕīA@q¬“äéO:Łė ¦%\¹Ūj@|ć[Ļ€‰ł Me†ZČŚUų–÷½ļ-ļ{_fŗ;6(lģՐ"ÄįĪY _öźW÷ŽŒŽÜq÷€Ą—Æ]½’{oø•·Lļ2±XōtG±ČrŹł˜7~„4»šD«Ä™Łl!»‹…¤dn6Šķ&é^o“˜ę”!s g7\wēR²öćˆH÷gfĘĘʖ,^øiĆĘX pķµ×:ŸD ōn¦ŅŃsƒčĀnÆŁDp:·w²eZķB—ća·æÜ­aF•›Č*ó7±ÅāoLNģĄšĻU>]jĢEĀ6ļ „æå¹*[Ń\Ūń_ĆgŹfõ!X6}uć™ÓŹą§!V™EĪ»25å//ædķŅ–ķÆÉFɰ`•ē™]ö ŠŅ¤ß÷ź7^pĮŪŅŽ9ÆćŪ>ņ”HFH^Ā0ÕŁÜÖ„u?ēŚ,ČŠņf|“ÖžńY黌’WĶäŽč6LõƒŲRĪ€-güs?6SųÜP•ņtN‰l•ćÉ×1 a ÷ś–õįrb»°Lʃˆ@ˆÜ“33÷°gŠ\6Ź«ņ‘NŹ„csŅ4¤”Ņ4!@Čē l¬‹X–.@.Õ^±¶ŠįR•³ŠWó·˜[Õ³Ødė݃³żÉĆ­Ų5 |.ūį@~h1梲ā…ĀOdķYva·0ŗäććŒÕääōųų(QEQŗc«bŽUć÷ŃXŖ,•†Åø€R ?$½œRDķüEļ"§5I#}›łvZ“µĢĆź°G‘D ÜSHpĒ7æäĢgöz½…‹—uŌQĻzĮė;ˆAH”˜PÄv”5!ć ‡õĄ?n€'<ł¤óæś5vüÓTŝČ3­µń% •¤Ņ_K5¦ƒ,¼Hk!ā<œĀŚ"”ūźõ'ć86Ÿblm†Ī “Lx›»{×;Žśį·jbŽüłół—Kē-] ̇ģ½Ļcwßc||ü¾M¾óĖ_A$™É“C¤Õ9KizʶÉĘRčĶūÕK„¢ČļuĆ~гebNk-%2bäU{KÆĖ²&cÖvž{æVĢłQEš)“‘€4Q2•A Į4Ęqģ§Ģʶ±l4‚뤩–RV¬#†™éŽčŲiĪOXøU!ŃÕH]ŚĀĻr6ÖZ9øŸrq»lŅ‹É6$n\ĢĄ ŒTŽä =)„÷)Eß#IŅN76#“&*īFZk²ź*VŸ*¼g¶;ݰϺ„ ͶéFD0!GĪ$r–ūs~fł£ė~‰hSŠęē$I„”Öœ–ģyš¦qm–®”“&D—o:żƒuĀŽ˜—Ž“&¢(Žą¬3ž’Żo~+ŌĄO{Ź©_’Ž÷øYOÕ­ ”óāŽõĻ­%žb€įāj?5 M½ ™Mf®Žiqõē†*qĮŸgė](„,ō Zģn[(šõ—ÉÖY†e¼a«”³.äĪf2;ųIóW~ bó³5=ÄČ`¾E–č‡ķĖŌåKź2—īgæJV—Ŗ+j™ĘŪJ@(1~Ļæ½’ąĒÉĪņ5» Qęv‚ƒ‡é*qR[®lXjÅŌŽK9»²gæ/gÆ ¶Ž7D܃‡É=1ąØsūJJZU®7UF¾R”²‰õ&2Ą õTwŪĮPųō{‚œN~eibÅŠė'Μ£yŲ¬ĻĮ^Vk6[ĆQźŁ8¤jŃśYŅ 9%?ńļŽŲŸŽFé.‹wšzdS”h.hFÉß u&É_įYÕÓÖE^Ōx {$‡¦WĶBłqüūń½ŲY'³fHS•$ię+ ¢dFĮŒ EdŃaī䞈Ø.[lå˜»3ęś&kŸHD€PfwėŽ¹Ś»‰€FGGÕŸč|1˜(:ø+˜Ķ戀(’…é…øˆ „Ķ9÷+T ĖˈG;"\M‰“oļV“ö«q,µ&P€©žĢ>|ā1OœżŠs^ū›k.?÷cXwųA :"ƒ@”†żŌœJĄš©O|bÓęͧžrŚ’æyR!Š#S·6–*«ž‰2j:7žĄ  ”ź÷ūö•BJamEĄ­üźvĒ„ˆƒ”&³Vs6öū0‡6žx≠?5½uć¦ßżś7Ę7½óŽ{®ŗźŖmŪ¶vŗĄęóEٹy’6S‰ˆišöūż4MĖĒMMI(_Z³‹(ˆLę„•}łtJĪ l•RĢ.²•E”Uī ™ÖņžĪOj—œ4čēĘSV‘#£8?ŃāNäU‚÷1håälФWyH™‹Ų°ÜōźPžDöėąim’\ų§9ųeŽę•ÜI`ŲŻpł÷IDęĘüRß,|¼¦Enģ®q2‹£”×؀·Ģ½A,|Ēq &Ŗ”R²dŃ|Ÿ„Ҭ)ķ÷²śhE̾#J¦®ZcP ĻrŗÜo©Œl>ŻĢ¬A–ŲŁÄŠb ˆćøŅ‰Ŗė+{D Sa¬Ÿ1 =e6nx$ˆßpĆ % ²»x”  xśpõAVwmp›0 ²˜<‹@®É{ ęÓQ)‡Į°1ĄŖæ6Ģ©«»”Īsž?(Ņ6Äq³›‘Gćę…æNżĻ/ŲĶŁ~p`aė tyK}ÅMi Y:±üńŠćŲĄ ķ†Ļŗüf¦§5¢€sžåÆW:żĢ‡?Š['e’*Z ‡øŁš“Yå+T{ĄŒĄÅuąŚ5/Č,)śē g!Ee·vĖŻUWWŲ%.T“vģöΰž½Dl<° ü"šC>!e,eÜéŒ"ū) ‡B i§‚A tĻßņq“R`@ļ ŒōĘwœkvŻĶwÜŽ™7'D,¤0ōcmĄi„2Mń°f“i¬ŗćĄĻn4,éŗĶ’aØc¬ –±ŒLĪ»ņśl ĆUč’aĻĖ|ż1‘ÖŚ?Jķŗ0Nyæß7ÖÜč>×ÅĢ®Q tŹŲόDęU\6!ØłFą)$kŖF”ŗąhÉh®ČųżyøE¶(Īłę¢éū…‘,``Ó o4. "ģķęžLĻ>‘¹¾‚H‹é-›’ėsŸżüł’¬Ÿ’ģērŹ©[6mÄŃ’’…ŌL @€ ‚4ƒ x;{Æ\¹ź‹_ūﮈ@iWį$Ö l0ŅlŠÅJ‘& bd@€(Š:N¶š¬õą‚c7(EK€ Övp…䒛C™G  žš„cWĶY8ī¼ysęžżśėĢž’ł’ŚšČ†E‹MmŁ ,ś¬Sąąō©\?ž—k6€n·;22āūßµ=‚!’6e&ņŅm±ÓüoĒqĒNĒQEQä!„x›/ēb !”Rn65ˆ¬ wBäe“Eę  zĶDĪz>•ĶljšŗS1l P ` ČüZ² 2"`åqoZUĖ”‘łčn·›W üż~ĀŁ3jMuÕ¶Ąi©,—£©rn7M•ĀĪ<` Té8U‚ėŹ$ŅÕÆ{k­ķ ŪScŖ¬B¢ż7Kxę#YŠ|]fćft»]­5˜dµ©1“-Z‘Év£ Ś÷Āiµ•vQÄQ»$ˆē2!BKĖļP¹øæ¢)…y@“Ć©zķß®0Ÿų¬ÓŸ¹ŌŻO±­;(#Øp ˜ØŁ*'OŖĢ–DDĪ_Č)ÜjŹVeJ?—{ĢŠ×‘YöŽŽĢŹł˜'łCd0©Ø¢ēl38RJ„”VDš]ژ™mŖ˜µŃS¬Ą_›GPD¦ h†ķg­Ó鄸šl™—ÆJ+SĮÖłnƒ9Shˆ.ÄräSū鳊āü7ÄAĪ]¢ ³" I@Њ\N°Ł²†ݙӋRˆHŠŒĪJ DB–;×rls±%¶œu — B\³SL"Ҧ5¹Ō…ž±­ĢfbhFŹ)ßgh>ÆMrP±zĶ˜Ķ·`óäwYŠ9*<•Ķ˜-ŻéP䢧[s˜ ¼Ī@ōā¬KŠo³EŻØżČųƒ¬Ņ ĒxXNØŁUbĖļ’RFQ’æ’² 2¶œ/4¶cØ¼ÅĄ^p”*ÆØj‰®µ¹TaŠ źĶõ]­€” – wÜt˘ŒßššYõuJ§=ėt@ŽP"d™‚ģN|¹!ļ2šRZ®²_S{Äŗ4Gö-€0bø†źŻ]™•055åŹAæ¶058|ør /ęĢŁb¶YŲĢ„Øt_üĒ÷¹Y*RJĻo‚ĪH×$”E@ö8L` 3½œuę ~|ÉĻvŻcwP$EČ(M·ōš ­0¹īµ6ų¾B”3b›ė·^ £[?FKCk6ßz1ćCņ8 SٲiIĢŪĘnMŁR­ X+!Ć&S1`Żą —­mē8=VSH§ŪśoĻ;ÖøāĢy†ƒNŽYĢkeļG³TQ¦¬Ōį$ˆˆ‡źwā G¼ay||œK=Ƶ~ēm3ATÜŠsU×< å†Ļ nzS-^”³­¬:—E=ENlX˜„i„B‹{9Ż\QŹ.[yD€Ń±1sCxčXQ9źąY¦č<¦Ī„Vó}÷0|ƒ.)yK›0IY@ōz½–[Žį8+:RĪTꊏīÜŗ„Tµ„ŖDR³÷.ø šėLČÆĒō.ĒĢ˜Õ ¾ Ąø…ˆf°R©Œi6®­ĒĖ’]ˆ!ć*zŖK7›ķe`ös4(ūä諿ʀĄLę•LˆA9 Ā5Ģ»- ¼öė̘…ˆ÷D­;a]Ęl'öū}“ėOÓ4M”ł„ÕŚAØō¼[2MV¶TŗĪyš }Ė é¤j ¬_ß#ļ;(÷a”5×DVA;"‚ą¬öĪ•«·ģč V”‘xGQäö¢˜$`¹Ø „0čewČøh6’|*·9œŪrż÷fÉM·˜Ķ’jc… ˆ/Ą|øįäÕN©)į…hņ;¦²ĒĄäHglƦ,PSYB ƒ‹.RICŹŁŗ×ņ5 ńs;ØR Ų¦l°Š†ŌŹm›UѲŲfŒ‰«ŹÖ„ęv†ķł œ“µV”E‡)° H:ēžœc 5ō²ņ 4g@š M•ļY €8MÓN§Čy¶nĘź–ÆĀ¼jĮąsQ §Ć”NÓÓӋ/Pż““}ĀH'ޜ¤&+pņ‰ĒŸõĀ?ūyĻ)Ż»y`µ£tB°&Ÿ£Ųćg„ Zi‚šėƒĢ¶Š»~ĢĢ ŅŌąB”Q· ʌ»­7¤±QUJؕÓSšÅŽ5CšŖøėéTSĮłĪ„)øČ“ļĪ „ žsĪ©ó ?TŚV‘ŪĒ#Ō±6é¶£aŠQ¹²čn„ģĻI?ķŒÄƒƒa(”t*T ŒŗxšvJ³b}ķ"ČŁqš–nėäÜȘYŗÓˆ42eÜędiZ­#@+’‘p€Ö,Ā/x!ÖAą ®ĢĀīUĢ ŸŻ®rEóĢ“ć«Ģ-4’ŗū<ąqŖg¾•aÆķ÷ccc^÷\ß&ŗE½œ <]J&ėą[~+›öэ ©i-$Į±kö;묳¾üµ üĖŸĻŻc„y~g‘š·]?¤FŻł‘U«Vö¬Ó_’oļb)%g4 Ÿ-YęaŸn½ķ.ó¬ežf>łŪ’]u€„€'?깍7®X±jÓ¦M湞J@ļ…!1ŠŠ°ÖÕ9Ė € śų@kE®­Č—¤SZĄå—_®”B€īhG0ĄŖŻWĄ}ĀĪ’Æ]|ɳŸ†Q<ʵO§t”̘Ÿ ‘C¶ZŅŠ7Ō–ė0•é(ŽĖH¤Ź^\²Ō}‰ŖŽWØ”@ ˆ1sŌ E9Į°½ĒēĀÅ —¦|•M³~ŹŖx–[¦%3õ†`©²#%¤łm!å]GWVYĄiĪoÕå>Mž5gœnXEœüy©¶X„ŗ…&oԌüČŁ“ķĢT>.Šā“xœŸ×]w©TßČՋŒ‹lF(MSŅ®‰BMąbä9; [ ‚°9fÓmنķé(eį‘ »¦nkŒYą\ź‚{g&Ś—ŗ#ĆFć8ꕱU9¢x&[÷Ė(Źęj,?¾9O¬k" Žž³Ą[·Ü’šCÓ½™ł+veOAfff°h+*g²±ØXpw„a æaėb•źóĮ4jśUĻÆ*ʧž»S@ė1Ł*‹æI¢(†£>Śš»Nö’aÉŅŽō¶·œžœgĒˆ˜‰“P°{XĄ›½Ÿ0dƒa°:rnĶ(•D‘‘ qW5Ę«Y–¼>ÓRYÜ($Mµ³]®¦Ņ-n™¬*‡L £\-)8÷¹Ó)ŖŌŖLgYo°„_¾7_ł.1¢a!Ž;Š1ÉĎ<{‡•ŁĒ6ݹ¾(T€$ŚšCZ eķ=ŠŖU&ļß^m·¢ `0Ō8ŪfžŸ‰!jŃ(‘īĄ~¤™„aĶŠłB¢į§2—ģ""!¤1Ģ…]9;•© a,ČL­\¦r%šµ <²¬ŚÉ „D!4“Œ„#ə撈¢ŽdfJŁ`¶ įDp0dó¶š.D(-NGČęķõŖųĖŪ&Ī€tŖEÅŻ³ņ•f’7\qåżŚcŻŚ‹–”@Ō¤‘m:lttŌæNżJĄ_]ö—„2ŗūī{Ö¬[ @c™ća æDõ(6Æ’²±%«åŖöłŲ`¶šŠJS `„OxŹ“>ś‰Oī<6wƽֱJ;«—,?źy}ģ1’ųĒ?Žöź×~賟jÖ&­8JŠģ¾ YץŹĶ¢oņÓ§`” ŗ2‡K9懵ėßæk?@-ž5ÉTĪ‹“Zk!#’ø©³cYwĀ–m—o~‘ü6d$dŌqŲW!¬;ļŅ}¶/ž”"bĆŖU g)QkņrsėML†,#cƒ<)„wTA‹0|)“iÆ#³P…ż)œChŌd’ŖN'@ß3ÓZyĢ«ÆŗśŹ+Æ<üŠĒv:=ÖīZ+EICZ"„ Ż9Ó]wK¶J“3 ¹NB×$ĢŠp»}V€ūź‚Ž DnĄ€„E?°„2lNĖU&…!ų³dUŒU©Ąl1ĻåEå6[@Ž+Ń6BĘ2ŠJNVć8i°Ź©C“:ĖrׂŒDT? š./ŃLī ŠĘ=@W׌Ė7"¼\ø÷ÆŁ±¬YH ]n@P©6Ō²~Éŗ|ūXr”g‡ģhĪ@1„ŠĀĻań ŁēŚŁ“9!ĘĪ%²p2O½Lˆ,®ŗNÖ[õ8˜ao0;“ ·Q‰šŃ’—ˆ„ISfÕ$­µ²?=Ó’q“fķž $J@žœœ3õX³r”R•d•ī#f€ōu7ßxē7īvĄ~ĄĀ7&ue4®A°g(dšÉ0Ėēt]:²}F¼½T°Ģ@`‚:źq»ī¼¬’šĘ…s®žūÕ~ų²eĖŽ=öŲ9óę½ļß_öżŸ]¤AȖĖ5ĻČx»»%Ņ»šW^›4Ė2W_*Č~ņ€fT‡lÜ&5nējī\ˆµ„¹8 !K0ģRXĶ…šFį=ꏓL†”ČĀų17¬µŽ¢xv ÄP 0+=Ń #aįQ ˆ)éN7ĪQĒ6ĀJi)%zb¢ŲJs“·Vš-Ż”MG€”hdÜr+Ńć-}Z†xĻāóźZ€÷¹®ŽZ‘j^ģ’){Nō˜Ź1’&žX«[U ČRTPøĪ&HʐäAuŖPóc!Dµ[åŚŹ€ł@€”4 I• Ä$PduĻ“då³k7-P$”{†1€uF~ąNĒ#“}õŻ!N‡–×ń¹čgß¹V•ą(†Łm` ÷AeĮ¦\®LĪœµŗgiZfQ}np ¬me‹į™Øļ¢ōÉ<©-ņdIÜ4QJéJöy(2|@‘)š“>ąĄ_ōāļ½’{¬ŪĖJÉ(ŠāŲØŃ‚@'1e)$†H($b vK˜„”ŻnW”™Œˆńź’FµT@U+kydDŻČIV*¬ŪįĶń°6‹-—C‚‚¶p.škhä yÕŹģ,׬vwkŁĪ œ(gÜ(Ųēģs5·Ąb]B³Ro95CW§‹Z¾ņüĄFÜįŅ–œS[{Sg[0ŅD±e-*€¢X"BG^ī¼laóå¤5µ9”ėųiź¦ĻIeWHšoł€ĮØķs„+ģńÄXO‹!ŠeĒBbŠŖ`nĆi":£ćZÆ8ž6ĖZdńłµ«Ė”²Gož13Ē j&{’Ąqƒ¦Ēv(¼éÜ·®Y»§¹ƒcŸ˜˜0FŪQ=—ćUw @œpŲ‘kvZ¶÷ī{\ÅUVAŃ6jG@P±V‹õČWŌYģ6Ģ‹uŖfCy҂ޠ##/ńK–-Łiƃ½õ­o)sČ! Ń’|ć[ ࢋ.jS²®=øQ¹”ķaCQ„ePī—Ź]Мn`ļõ ū“@Ékćs K&DyÓ¦vÄZPŲ¤q m;i­•VŹōę aæŠmbĘ{‰"±öøŽ»»Æf½²ŻnWD„ŠZ«T»G¤Ļ"ÄHäqŚ?…”¦£ī抬9`ÓYźšŲiššĶ(-kĶPtüł5&ŌĶ!iED¬55œ–…F.16WÆ öʵY²Ņ(–c&?Ÿ…ā¦+‚=e2ļė|ŅĮ¢,ˆł–qD`$ׁ1S‡ŪDźC¼µĪļ}ē{€ ™€3^pf:=-(z;—c‡,5Y˜ÖN饐²²Ū®ü‰¢ˆ•ƒAŲ`,i5ļš± "Fcöż¾č!ƹ^(§9 h`›M«`½»Õµē÷(DĪÉ<ŌŃÕģø³Očq"„é܆ŃD/å&$ʝˆ™§§§'·M%ż” r­v{žyµYŪ¾%гYk@ °0õChB¤““~ LŃ©ārŅ­ŚĄį˜M¾§ÄWWZ4UŽĀāóhKCÉūēŗõŚÜā ćCłyE*ģźJéĄ"gĮmņŅN¾\—.7‡D•pyŠzwT²K¶²÷ŁFŗ}q²÷Ü{$iśŻ\d żPmffĘ Kƒč@€ZŒŻūš·Żqūg’ćs4[ń ²B]&ģ,!DC‰ø.-R™ko¹¶Óœ™™€É©I`1ń’Ūŗēž‡Z2huŠA‰_üņ×}ą[ļų“„‡neÖ/ė ZÖŽ?‡¤µ"¾.}­Ä£ÓVS*œw+F_Ź’W”ä ×r. jæEĶ3h*!‘9¼·ĢWdמjÓFäIJE2ŠLœlōÕĒ~0nĆrų•Ļčj÷Ś?o§5") Żn7Šdk˜w”·=^+c/ä+×į±iĘqģŽošæsf)”Ų S™Üb§ĖH1&C'^Ø&dó„µę¢’v… {`ßHaPØ!#zjŲX‘‰Ū¬$˜««˜BŲĢB@œZ_õIŠŁŅ&ć2G(0±Üžpč:VNbKžŽ–E&į›°f|]>²²Ų['Y”æ’rzƒ2:C~ƒž-Žćh|blbĪx§£€²,µ 9ĖŌF e„AÉ…Oņ$KÖJ©SŅĮłT ŽpŖæĢFP¢˜u.č¦2/V+ēÆN‰»šW/ŲĖÅĶ϶lo(Į­CœÉĄ.~„6FPjhP5l(•ųąLĒräólła–[qjśŹŹėް鸫9ŃÆLō‚ĆxøØfTW ®³ŻåĢt?ZŠxÕ)uµ9BŹo…@ŖQĻ-pJ50$!iM¶0"ĘĘĒ 733ŌĄ%†–Ä<){ō8¤œóŲzĶE*čR¾ØŒūå3Ng„- K‹_)UNĶųŁÖZWŲeˆJ“sĪņ˜Żė<Ā‚ ˆm®C’RHiĒŠÜét˜ ī­•“|pC)"g A³ģÉD5Vœ@(›-”ĢWćTŃ®{īƒģ÷ū7Ü|€‘ Ī—Šé%¶qo)dĶĶ€ņŠ{ę3ž³Ėā„÷Żq—"Ķ5‚vś1Ng¾Y¦9*vP.„”Ń2Jæ±lÉgįŁ.k ć ÄK^÷Z9>¶~rĖ_ńŪ£VÆ[½rÕ¼±‰É$Q –.]:‹*ōPŻŃ-Ł@ĒDc€„GH¦ˆux}ѼŽŃą_D»}r©PҦįx\÷6Ļö#" ß¼ ɶ‘ĒŃč‰HŠHV p“)°“O,śi2.!Ļó$¾@ˆ4z$…ŒL@ĢÄLĄ@š­–[}†.§×ņ õ˜‡£oÄÆ»ż4Õ胖‹ą/Ó¤­µęĢĀ³×ŽN`>ąĒō馯ÜA_ķŃhQŃÆƒ x.њųch½Ä"!`@%īū?Pbe-@xš‹O\ŗÉB:‰Š”r]Ää'­˜Aˆ™Ķ[žżģgF`Č·į?ųžźuk³&ĮL›+Čó6ńĖöŌž•㢔«5E+Żą’._’$,qaūŌ@ūCĒu“Ķ&ļ€åŒŚ(sķƒT†ŠmÜ*h„Y ŸŪøŁmĆ&*0Öń•7—ĖXmÓo¬!c"ów ßÖś‚±\‘Šu%;Īū?ŻP§”ó™9ŽcĒ7¹me”»•XE!ģB)¤/^Ļ0kó/”HŽ”JyØy)»<”!Ö¢k®ā| ˜ŸĶŸ3Rīš™Įb5¬Ph-T)xŖżµ8Ō®}1Bµb0–8!źyį+Ó1.0pjrĮ†µ;. GCö±7^išż%T‰Ć© č”V•ri.j*ŌŲčŁä,…”†FĪ2“ 12:Zī"†’Žxy „|ūÓmšī¶lŁŅėõ¦§{ĄĄš)§Q-:²ƶé 4U  ’Ż*§=mšżĘ-åŪ¶€üS)" ¢2N.Ķ)Ŗ‹f „Z“-öŗ+H³)¤ųŹé·ŒvGGG³[^œB‚ÕūĄm2­"~UD DĮ²Ż ƒ³ķ?!@ J‹(61ccc)+fžī7æĮE4—‹?›sķ†Vmjrę¦oIu÷#GčÅ϶€(LžėŻ©öyk"źõzI’øńt.QĆźÕZ[ūķCęŖ¼YĢA :÷ĆļߤӳńØģ©{o½5ōUJ/|į‹+āPN8­%"0k„ Ō,]IåJģōlźē^×zžĒZG›}Ńģ\‚ž“¦ņļ+K(v«ŗČVųńs§©Ŗ ČQ€#göك-ŽĘS¹‡*Ęļ2µĒPUµąŌó&ĀC;¢wĀ“ČÜō*’ł’h$Ö o_|‹^° E‚w® ®Ī= Qd.(Ņ ŠéÄPÄ·kĶ¦ģ‘8bpt’ĪŠ([ȤżCŸˆ­rK߈łb~x\©ŽąGßę$*Œ (P™ģżoMž‚m p ưē¼ń ēt0¦¬f|Ś©O‚€-¦’ÉIWZϳųA;Œ<¹EJ(WŠhd–Ų™  kÄĆžĖ‡I¢Œö³ æÉ+\p¼c*ĘeČO…ūŗ=±Å<~„ÓėŃJ0·9ō6ž^¦ÕW#/«Ą4ŪÉŹŹ«ūAhŅ©J9+ŒUÖ ^žģ²/$H*2Iv…Ö ¢pł†2!3 60eU‰a“R©}SÆc¢‰‰ Ć J|ż‚Æżł’?@š„uA¦Z$ØRAuķ¬phvež•Wv†ĢƒZsœ`ŪۜƦqÄŁł‰˜uDK‡]·żKž„L€0Ėh¶ČքśģY…9ī*,h‹“Rģó±ģÄĀXUÖd)_löFdiŠ¢Š,{®yµ‰“Ÿ‘“ab‰B¢@Ó÷hŽ;)L Ä­®‚‘Ķt*41eĆÅu;Ķ,!C(Vq$XmČ®“ē„P ;8Ąž X›W¾³ÓÓÓ YF9ἱё±ŃšeŠBkra³ZG[ä°„œļ—*ĀĘŗ#Ģ_###{”SeF²½ąŠĄĄŚ!Ėśē¤vŪŗęĆⷌEg$f4 †öĪūi*"”±0Wf @Ȥ¤Čī8KŌ$€™L—£ß„¢SŹnŲą­| 3J±Š@ 4ņD¢+ŲHĄAÄ”JķżŪšÆ4 ŲwŻ^#ĶŸxŁŁ/D ĀĪ>QhD$͆g:‡ Z" `ĖöŽżŹ›Æ?‡Ņé²ū@ M >­ÓšRʉ‰‰ŃŃQW»v›“rŻŗÄe§ÓŁNQ›#ÖĄ 4KJõ«_öŗåsß:³åīÉéł§×Üpå5a¦‡“j÷•ł0/•Y›ŁA"" ‹*2"·ÕH6„óÕĀ–¬ŲBė³šÄéŠķĮ.aÜU]™ōzb³Ņ\v-ÅR‰Ųe”8o) ī?źDf×hbs¾€Ż¹  Ņw¢|śēivB1z?·a‹tJfćū¦Łm“āŸ²Ń ŗü-Co¾ „[ČĢ 0Ł‹›ķć‚¶,¤)īwÓUA…š³Éµ1™fv`ÓHź['ÖålNBéƊŁlN£ŽĘäknaDR°.h~Ąåé ¹ĄGģv»Dœ†x"›2/@ergXĮę»…m: @³•ČŅÄ3ż>g—¢ģ¼C¦ ŗ”`ƒ@D™N¢³’dĪ ņö̬1Yž4DK‘€B(ŅŽnb·}3/Ŗ0£(5ŻCĄĄŠ4±ŅĤ”°ļ䌊ćØĒ<ęĀÆ|qDB‚ŠG~’;ß ĶŹY°/Qä¾S€ĮA&”Ķ/7ģĢÖ<śą²ƒsE|½IēÕuؕ › ”TBˆ8Ž£(²UĄœyq,M~ WœwGł4lĮ6€?«uĪ-ƙs﫽Cs3ol¶'BTEX€=Ŗł®=Ā …¤Ÿ·qķ;T‘˜˜ƒLōūimö³EA® .+„t-øÓQk&¾†õ@Ģp¹FŌßå§p*åpżö¹§$# ƒ`€ó?łÉ{o¹õÓļł€±-ŚÄ`‘TIæĆQ̲%ެw1 ”‚:Wž ÷0¤v'«Ó¾|ņʖ謁u³Š<³)īeYW6rmŽ’†•X)cšd*³P$Q T"MÖ?» w:ˆ8599~ĘY!|å ņß~*wl6t;eė"q·6$Ļźn£Üm,æöėß½¾2”PYXx«MéĆĢ1²….Qe™+xš†¹-Ų(ć Ł6øŖ”ū_!0Š_…"×WyÓŚ€ī¶ˆl¦–³+ßQkķrö̧5åŐŖŚWXU+¢§,äzL®%,‘,°Ąé¤g*SØÉ•ś@ģuąžS ¶ō¦g€n¾ģ*čė,ˆČ×I,Ńł¬ę7Ą&Ń ¤‚ĪČČ$ėėļ¾sĪ‚łńŲ(h@ēqŽ$ˆŪ”¶éƛ&gĀęęģø“[Ķ.› ńO—żUB żōž;ļųÉ0‚Q‡ÅĪ+vв6’D.<üŽ_1Į€a$ĘIäs›3(Œ+цŻ-’S¤ź—uŖ€™R.UĶ€(B^»A)KWŪWJ5`2żęO³ŖÉØmä& é€Z‹x%ē’†“ΐ’¾r$!'ā†Œ{ϧz*×H™@)mĆ]ļ©z½žĮ›8pŠQIt‹ĮĻfVŚsÅ8in½åT’„YʄlÄfÄüēLŻ][¶Ø3÷b’SväB­Q[–;Ž/°d{÷”R”ńh–õ™,«@Cå”Ōb “Ģ % •¦±Œüµ…ą„Ym ĮX<ūŒi–­ŒÅēæxĮ™gœŃŪøEö“ŌK@@HōsO{ŚU×^“ ±Y„£ŒÆxĮŁo{ļ{5a!Ė’[½öDį»į¤óOpq·®rįĻ„ķ(±ßŗź`/€Ė9(ė°žvŠ*ļĆĪnö—ŚĖPC7”ōfeø^öÓŲ"&PК-)@qLBœģvøĒhŒšÖZkŻét|wŁÆķ”ŪŒĖLå;ŠąŖö|·Ū0‘Öurŗ¬¼;ÕLÅŲüI¢@§"0CW’ö÷ļ{ļ{wŁeųŁÆ_ÖBJ`č €ī °#•µKÕĀbŒV6ƒ'rć×åĢS×KoēĻ€B.YĄjŅŗŁgf›¶]%5ļ墮}żżäņPh×1‡œ£Õ-6Ąp°Ģä*6njŅ45 J*…»u©C)SīaŠ3 y„fŽŪN§Ø4P:boĄ±Ą}RžńŲyXy §(Bd…78SX‰"Ų™²śXa”2ø}QŠŹÉÄš˜Ą&v“Ü*‚a€FJ+d@M2Qģ»ļu÷܉ė/½ęškāeKē^±–fē"„)t"€D„B0šäŻ÷®\µR ŠL[Hyy3±Žøˆ:ūÓfūه:CóåϾ:ˆóźŹ’ąåu.y2ĪųźŌ&ī–MĢ{jtFFFīH·lÓɶŽt§ŪšµÖ–Ī8?Ö0ŒŠ ®‡ģIę-(Š`”ųž¾\ ®du6²X¹Éī“]ó§@™ōśQ™nyS1ĶnJ¤Gż~b*Ł“Bś)93eBˆŒoذ5ZüŃĢ\ɞtXH±Ą)Y›©…§ʈˆĄ„N¢lĻ1sIęŠčqʦįiõ™ņ śĘüŽī¼ä…•{mö č+T±•)ҊŅ4ED3;N8{Ūc@@ˆ™dg–+pr<&2dÅŹÜZĀ·ÕE«”/ÖWĮ@Åķ…ģģZŲJ¦ŽŽ¶suD Ś×”lm~Ó[Ÿ%2I‘ōIĖŻūLj™“FÄN,MŹ’4”Öc “eś€øćĮ{fTĀ€ųʗ¾ź#Ÿū Ā¢žV³! råż@QĘJlmŁN®ņN§“ŪRķ¹q–ŽH›7č€ į“…¢öPów”¹=ŖČ³ž”&X’ µ„?ŲxjĢb¬„K®”Ó AŲ9 ĒJŪ7M•³tĶ<Ż rĢ~ļxÆ×3’ėüS· Ļ”Ļ~ņӟyüqOzźIųėļ}š¾Ļ}ļkk0{•ŗ ]jµVČP„•é1ļƒœĆŹ ūįȊØv±NŲ&»SųrA €‘hWÆĪh!½¾Jjģü©qMœźŲ&†uŠjr)ƒÕž’łQ¢JģjąTĻ…%Ua„oBŽ/µ_öĮzŖ’ŠK¤‡ē_e™3\r˜ė·I™3lam9Ī®?SHéWb3”]U< ~XĶ^e_zĮÅ“ü±®ĀDzhW«SѵžJ3ęt>lz¬P €ÄLķI  Ņ1#JA‘€ŃīĻ’÷&„L7O¾üłgCtš &G¤«JŪS)KæT5^qÅGzxWFĻÖsL·…ŠećĮ­Ju™rђ4„L#\ŁD3Šbē±1“a2²DÉ€@ĀŅwž†TÅ÷÷6j"čt»;ČīT Bće5I ĆØS‚eā ß0_T,ō(;H!;±6˜^0`ZfŜ˜F£=d 20ū–± wTs+’×ßõDTŠ~ó{MMiŻ·~^TœU¼JM×į`fåh£|YÖ¬Æ3ˆ•Żæy_4†•yæ4W¹}žVŽČĄ‘Ł2µŒD§Ó‰ćŲ‡°Õõv™æźlóxĪźÉt¶=”¬š]®›õN“fC'^S¾ØXϾsŻ„6ŪZ(LÖFi‹3/i ųيlH Xd§“B £££ąˆż@„m« CŗyjåŹ•wŽ{'+%mo’ūē?§b&)’!{LņnlFd,€ŠfēG…ŗ†E"LČżč}•»Ū*)x6fß1h„:Ÿ:7`{ŠŽ’ĒU™”ī¶WG7ĻxeŪo/ŠkŁ>Ūl˜LdRYĪ8vĮśhļ£C lYGg]§jćc] ŒyǃĀ̬éŅß’ńČ£żÖĻų‡K’Š» čėn½é?ž™ L¤psI³r}µ‡¤ŠhJKūU}~„öHĪŚ@ā”’ʈµ˜fĻį^C”ÆbŌž‚”Ņg­ōåÉzB‹ ‚»6HļąW¾) £…°£Ø›]ö팺Ėh·aÆ\N^‘Ó¼m¶æ—YÓė}ĶŪbo3Ųęy˦ÄFeÄ6l݊%˜VˆÉÆY’BˆŒA|0pŗĪėį`+lßyTXäsn|£»J“&»Ym3 xų;ćæ”.‹~D„ėĆŚŽ®)}Ų%”T’¦®Q“X€b@!d¤#¹t—å»ģ²|”a2ŗį¦N=śX "Ҧ¶£AØé$ļŠ¤óvQ2ȔnūĒķ¹ņņÖ_śī·A"2D Ż?ó^Ž®X‡š+uÆ1WĄ;umó•ĶZˆ( _“łGŹ­›6 ĄāÜwžŪz Łŗō6VYyėüš )Ń)Ķb ūĘVp”×ė‘ÖlŻÉē×-d®üVoż„mʁZ‘Ÿ‰É“bö"DDS.³5Ҽ§.ܳQ,ŃCoHQ[üÆŌµę*6©RqŪ¢„D)Ńāø®;mŲcSh¶>‡1ēƒć‰ā֏—>g įśź6zF‰­0‡="Ė@w S©ŸŁ6uŽyĻ}ŚÓN;å©żGYŪ?¾üńO?ķqĒ®X“č”éĶÓ g€4āĘ{īćDK€P0wÄ,˜™Šw* @’YU}-Ē™Žj· ĢŽ¢Čo!ÖZo§W6lia~—ƒ’ģX1¤GÆ ³]|-Āžąm‹qK’DėBīŽÄÉ®lXßŅo“ >æøZ!ē3ČWšŌ݊¬ė0™õd7hēB ļ«ŁxRJ)¤JRĆ*ńķ/|ł)ĒĶåWÄBn|O:õ½żųĻW\vēg I‰Óż>¤\×ītKB鱝i§ŖY,ōGT\Æ|Ūœi p£Ün›) Ū+ŁĖķ@‰Ēr@ŲÅCŗ˜į„"ÅeU†µ·ÓŠŪPż'“•ÆŖłØP\€ŌÖ"ׇ_ŽŠąó! ‹LßŪ%ģ |‡ŽžPd Ļõ Ļ@K|™Ø@€ °Ś˜ųz”a‘9 Å,]Ä+ūzR^ĄŸiš ‡8›ķžņÄr¹ˆĖŚ^8 ĖmA'‹0‘A¢0TU¤r«ŗ,€é¬FQAC˜‘GsŠVuČqęßVZ˜Œi””Ņ ēE±ŪĖxö5 5CSĮP øęŹ+_ś¢mݼ¹®X†E#ØŌ˜„2Ź@©9ćæ’ķoÆżÓ_Ī>éŌW=õō‹žćKw]u}%1H|Ū»ß9ÅĪ ³3‘‡ō1ы’3Čʘ¢ŅĆ)×c½”gZH¦?jįāĄŖoš\J×’·!żöĒĆĶ4åĮ,jwcDzü;•×įīŖ:¤õćį:@r¹µjĆFäĘõm>ć4®T8 „Ņh}Ź)§üō——óxŌ哿z—ŻÆżĒ?øSH@ ¶Ģ{$Po½_”Š|—“_QTŖyXÓč(eaŹ“$)÷~7whü6„2?įŖ4źt¹ŖŻbŪ„&@)m³Ęj „sŽf?М÷\ŽJÕM˜ŒÜ°˜Ūl• óy;3’7M;|Į ¾—†6”õ’ķ!²Ī ƒ{×”(µdÓūÜUœÆLČM›±Łņ"ų­€čąv¶OP”l* °!Zg łZ³a¼,“ß]7l»ˆżs=œ†/޳"'¢eč·š9O{®ŒX€ÖIPB(`)Ņé$€Ō:ļ}ļzĻNKv¹ėį»Ļ9ē­ołŠū!’y?æqīŻ¾,ØnŅc–­čt:Ū¶m}ūŪß~Ö_ĻBØlūfZ±ŁšŠ°wŻĻu‹ŹÉ¤2<µūĪPgg{׊»3ƒŠL“rł.=“ˆa&ÕmViyżT'kDķėÓT !¤® Ł@d›B‹GhåjŌŖŲéöŽÆ¾Sī ŠŌvßy/ćā^Š©B`äbrDbņūĘ=W»p¹qŻĮ›ąä»Ā`da]š¦PDż¹H’“Óķż‹Āƒč ģ 7ø?ś®ē^›6xS¾Ė{‰]=\œģuĆr­’Pē0zwżć›ó&įŠģÆo,[țą7$Ūńɰlž ‡¢^RÉ5ó¼±ÖZf$לóЉ\Ž €“6ŗåŻn×Ux‰ņŠ}–Ӂ$IFF:¦*””źvāŚfHóŠĘ»]Ŋ¾öÕÆ=÷Ģē;fqōoq™Pģ‘HŹÆ}õK/{ÉĖWGNēém“ö„`fĮxĄ^ūžö׿š·d Ƴ!hānwt4°—øĮ ÆI³‰źć»Ą³Ė®„’Ūr«’8Zė~æ/„ģÖ··4GŪļU֝V’ƾ*ļ'ČĮ i¶JĢrBĀ×V‰ƒ¤Ehń‰Ūd)„SSSī¤ßž†ŗ××>ŻMśŗ5y<Ģ|ī¹ēžņ’ŸO€ač§ż•k×]sļķŌaĄŒ”T%1Į±@āŚņPŠ\ŌČD7,š DŪ[‘RJ’$0ī u ĢzѮ˺¶w«MGh(ƒ&l¢RJ)¤ƒxµŠ0† W™’E†ÜŽłD†tŽŅ<ųK·!“W‰µŖ«ÕĢ@²£č©ŅÅYߏ{Ke‹c…·ņė}R'‘ąĻ”K‡E—TåbV䪚·6¦ĖŃ“N3'IbołJ¦Ü±¦”økoø åĪĄlŲGB :„“nĶŌžņ晾A¶Ačī:<™™4÷ū}$`eš6‘™S•B,Xp$@cŒ”V,įš'yŹÓN驙 1ö‹üųĀ˜J‚2Õ<#XbPšę“SŌ¦mozä®ūļŻ4½ķŠcHÄ`S m‡¦Ųųs]é£Rf¼NŌ½Įö“Į½k#“„ĄR豇¹lž<Éš““Ÿ:›xøź˜0nq'’RqŅOmåk›5żŽQÄb3­OIĮ ”bŹ qž2D¬ˆ‡9“ˆeo £{i©ƒĮöīvāHŲ2¬6c”b”¦"vX«ņCRYš¦iĄĶćŪ.ÓÕlNLeś> µ5/‰_qmī; •+֕ń”r zÄŁ®Ølgz½fwæŸ@šØŹ‚O°ę 6æŠ:° x¢Ēy1ÜĆØg¶ĪF˜ī]1n¢ó’½gŽ*uS”HäŁłb”1oķvĆĀąp7BEŻ‘‘RWB”¼/˜&#!@JŒżŖr™k4}ņ¼ģŗĖФ8ņ°Ć+v§ė¶tn#H™½T“åžLHŠóĻżęPKp”5!¢ģT[¶l›7w0'(Œ/ƒ L¤¤0>‰d}üŁ·¾5¦i*@,Y8?kŚ!"‚•–‘„ŠĆ¢ŗ1£żų–»mēĪ ž¼p€3 wlš±rż¤ķÜ$VŹ3VĀWŹ›Į§ųnžČ0.Gň&~ˆ”p|€RžŅ­Ź@—x÷oš¦RŹfUŽ^P 2Ē~t“Ķ2Ō>ąbŲ4^]ęb(±„a?±Œ š± C uQz”™qGLDž{«&$Dæ6Rw“5˜e÷³×-}źéā—ŃT4KĀĀ[5 ŹNĢ̤ķ‰KLF©ŒE.§’2 " ’tŖ”ßļ[¢A3ģB 9K4BŌķ ø cfŖ”iß ęšļģL’R'Ģv«°&)­ Ŗæö\H)…ijdlŒ5aĖH>žčcīøž¦‡ļ{šøOüĮE?łĖĻ~Ķg9ōŠ;ļ¼ó’|¶œ;ŹŒu@¦üČõø#Ą0½®Żk-"‘»¶ŖĢ³_„ ƒņØcvČåvJ%"DAäÜDh. ÷ Š?“Ā.°;:²ļžū”Yˆžå:[ģ;Ÿ-!%3Ē2vTS£ŽI1²%·„Ä4Õq$QŲÖm+żĀv ŹŃ Onn ņ¼L„¤Ÿ@§BŁõ ,˜ Kņ°„†*<Š įˆšc$SfĢG‘×36¦iFĄŒŪ¹üéyA›VK](/ŲB-­Tv’2ŒńPy€ZzNĪ«Ķę˱źA”ÓŌōJ˜u+Q@I"¶mTøa)%P1bB/uˆYµž‹‰Ŗą@G \ŒxM§€7¹Å&”źĒÄŚBzA‚;WĢWĒÖaó`86Ćć‹N;ƒœd+6{–(ŖOdū¾AVõADÕ#™ŅöĖ'{ā#’Ü'?fĆ&ŅŹ¢32ķšõ ‰:"Ī_“ų£Ÿł,!L8! ·’f²¢X2IŅ„ž‰O~īéŲ퀐@bŗ×ÉÄL׊:u·ĘĢ‘~K£qY)Œ"Šä9$ÄJ©(Ž=4®HĮfVā 9”ßDPAńgCä\6wåŽ÷Ź÷ś,³ę¬ŖTB N–:čYeĢæ=u?ÜmŽ2ŚŠß6œPåvīkKPmCo9kĻs`(«¬‡Ylļż ÆF(½_dM>ģ%{a`+fea¹ź˜·œUńmVfOŻ1gīJHč'©b`‚Ų‰;C„lŁ/iēå»Ģ<øażÕ—^žŽzäXH`ņ|E~~ŪŲĀ€Üv]ĻÄ~gÆ’śę¦ŠŗK UU™hlsŸķ½®Ź„[[®y£ŅU_¼ŖįS+吙H ,8×U=i€X®\„õnt&čCa' 2ŗļ€RµŁč8ƒhņŠĪ@˜.£aŖ+WķĆ£ńUGßZ1ŖĘ}qɜÕ“!JÓŌ×uØčsęźČŹė~Ļ[›*ŌK‹E—övb6‘±Ź”uŅ# `„”0Œ£Œ@Œ`2G%¢é±°°=óQRb¦q‚&æY–³ŗń/sg|ÖnŸ^¢ Å:%hŻ_; ~#ÖJ™Ą#Š„R„R ˆ:ŒD§36‡¢hńźŻÆŗśŗ{6?tŚšė{ÆŁæ¼ģūßžĘān÷‘;ļ|ī‰Oŗč‹_¾÷ŗołŪ §(D_„}•wÜq?üÅĻ@Fœ)v–WŌP‹k{XĀN§ĢJ˜’‹D8ahGM)o •q=•C°ą ,kŚųdK&8D ā“גŏ/~÷[ßžĶ’ž 5óå]`'®“„–ĪŲėÉ̾‘ŲF;>ʤlķ½6ߌ”ŲżP1•jx˜s˜0šRš43RŠ“mmU‰)Ći2lv†æ…ilC ‚m^ƒ•dzĢLÄÄ^Óu`sØŠ[”ˆĪ`åą°ŹĘ2}@?§\ ĻōĢɶū†"Ņ~G"xŠ ĄIģčRż©]"4)Źīdæ˜0HēnÜ0>CAÉ¢ +U4ĀĻųä2[AЧŲ&­5OMĶ8>ߏr‚†…!tä{ģ±dɲ͓S¹źŖ­Ó3€4³ÕmF`"` ėŲ:¤” dŻ ‘CŅt;VcµĶĮ—–ćˆŹAb±¤xPR”qÖDŠFD§Ł±RļqČŸ»j­<üJ!±JĖŁüUɐRW‘j¦SRĄu€šĒ°¢' ‘ĪŽŗlń8Ė2•ążĄµŪ¹”7»į£ ˜Ü XAƒ4TœŚg;\rŻ€ RģZ¶’ŽĢččhŽ”ŽŃF,M]±ŠoŒH̼ĒĪĖ7ox¤u§Ņ™]W®¾čG?\»’~~Ģ 5¶«_•ÕĖ̦`wJvĆUš(/rnŸ^]ŗĖŸÓąęĖU놅œŖ”2UȜ$‰3Ü~²\Ć@!KTµ7 ćt¹JģgĖź¦ •'Z¦3Įšū)1p–—J°**WK`4‡mŻ’æ§¼nčšń÷xĪ料J-»Ćå=źē«†É¹¼ņ]khÆ×BĄž n}©j@®fdޘį˱åŽRVe’Unp«žµ1pĮQџ035ÕEDFaźŽfų|šį„KvBi¢ā8²õ¬īc*•_8/y &;>žĆ²¼&ŅZGqōėŖÄāH3m5GĄ».ūūĖ_žņß]ū7bX0&»c¶lM±Ś‚Æ{Õ?ā3Ÿd@¤¬Ve…Šs]aĪ«r¤µˆd„q€6ĢäTœw’q‘Œ„V¦ĒD€€ęźĮv„Ē­ši*™±­Ķ÷&ρ®ŠPƶ;üĆžš¬—qÉĻyōÉǹņ%)Bų³lÕJž˜(Ųšų&m“§V”SK*e»ź’†ˆ¤°]ś„ZN.sqŸĢŁ»OdĆ5ĪČ:'^5#ékƒō‰")¢ ŸĢé2T‡»Y¬‹Ėu8'Ūkˆ©E$24J„‹°•UÓ; ycmf“ŻŃS‚ž”³äŒUl‘ˆ¾‚„ėįĶ^_®­ÄEóŚ¢²J\®2¦¢™±‚_€™0L@ˆ&»^˜ĢI ƞjĪģC†‰ŠpÕ’ś•O}öņĖ/æé¾Ū7LOq„h sh” …¶µßiržiTiš·‚#¦š 0>tļŸ…;qB»ZÄū®]A‹]sM@Sēų&]¾iX¦åĄvÕśHeŌXėJuClŁl®}bˆŚo€ŁP ž½“Ź0­ ¶ŪŽėrž•_Ųõ¬YHōŃĮ>³ ·Q|š’xŌčgs‚]źūfŁīʁv~°änµ ‰xk ä1®¬“:žČ£®øęŠ=wYµhĮĀ™m“g<ļ¹sęĢyÖK_֙;±Ä(¢4Bp$@iÉ( k ˜7Ž~ĒAtß¶mA0DB^yÕ5{ī»/”$ˆ†ĀrVv+¾Ģ„“ðɣ7ĄŁļä[-‘!ęaM³JuH “ĘĻ,Ö5E7Škµ ‰+‘Ž•ģVķG¬„ŖP9kPgń‹Ż†čĒąÆķ¤¶*E ĶvŲģ«£l:•–Ö Ńv…Ä\G›Q™åO=„ hŗ*]„ČŃŽŌ*ÓT»NX&CR¶ī‚ÉĢĢčČØ«¹5d}_ł Ļī*M’8ޱŸ¤RJ­u·[ä'ƒ)‚™¢®%ą5…Bį›ś¢’ą°ūīĆü<“ˆ½ “ęEßĆ6…¶@k" „£H°R*2­w)iÆ×ė=“į;ßłĪw~š½koøžįÉ)  ĀĒ>öį“N|ņ^ūīĮRŹW¼6…ÄÊu×6V(Źų5E—qŲķYŁF”Õ @„{ēCށ™ 9kix¹Ō „ož’Å·¼å-ėū[Ļ<ó¬/|ķæ«ģ[UIŅ[čÓ±pa<1iĶB%ģ¼ęœĪPD˜%/Xf¼_y*Ö\Üļ÷GFFróģmŅO™9I"NĢh "Ā’ņ Ē°1š±ŹtƒM+®Į€J-r>­—÷bÖZ£~Æ\õr„bi4HzcĶQĪÕ”l{œ…ÄV—‹+.›Ū(QŠrĖĄi?—‡aHĢĢ Š ę»U o÷l_½šF”97Ś™łfäŲYČSP!e–Ć¢Ń9#“éäūōĒ+ÆéõŚųŸ5ĢLč,ƒVJd˜ | PŠ k­·ūČx JÉ8r,īČK9wūKv‡Į+ŲVź–BNĪŽ©-1j„Ł¬ó‘ŚšŖ “Ą žįĄė8/Ø9ām)½§(ĒĆ8öC±Ćly…Ū‡NµŒæ–^QŽrśT‹CŃ­i­µÖ†6Æūćė¹/@™›•ƒ–”ąūD;„Ū¶.ś"„£8ŹN%š™‘”9B$0ĮŽ+V=pĻ]Ėę.Żc=ŅXœł¢³xģc<ōPŻŪ&;ˆŸ÷ž½÷ļ™9w|īōTƽ½āUżÄDZŪqĢ%³s¾›cEŪ‰Q\ńuµh͹—;vEUäķL \ė~Ž<?h­•RN§)$®õĄ¹ūč3õbœö¼µZ•ę ­¢”Ėbо.Q„muTäī¶{½ŽŲؘsīƒoĪ “žŠ’ųōѬ”“Z‘mĒ=Ō§ŁvL9 H\Q iJCpµ“›¦Śź¹¹¼Ī3Æ=„NųžLR˜hM ÉS½Mė7üčū}ń‹_üįO²p× ą”eVėÉy‰3ūž(DZćb0¬Čåö¼¼Ņa„Ļ–³·ąĘłķ=aĒ*!Søļ„Hś© €‚JS!„R#hā źõź‘ŃQ՛‰ŗ]ÕļGŻ®iXżéw~xŹ)§ą˜QtDd°Čöqźų Źf*jg•!qƒ5öOĄjO«øBņ+#ĢīÜä źNē2(i@lĻł%lH\vj́eŹD R:“ÜzĆMoyĆk’÷Æ’+ŗ£Lmc‰j!¶l:ߨTT敼–tyóBäBœę*„T™B™Ąē_0o4A#I@”Āģ.hw3‰HšJ©Ēje[š.£JNꏐ!"€pEfƒ;‘ØP…cŠNéœ]zU†ÄžÖ˃4lQ,-o“&DōŁńĘW$2Źö”~9—,v7éøør‘^=ZwšX»=ńäŚ5a² ‹=ŌšŠBbx5ƒ@RZd=äaÖ4ŁdbPd&?UV2EÖø\¬„fvūŖ+®8ņšĆ:žų/¾ä5Ģ,™XĒ8ķŅOÖ©Āń“&!„I°Yų\ü .$Ī_°œ1SD•rp(;Th:»ėlWń©/]ž‘b°›?E½ĒŽtWģ_ Q¼å;€ŖXÕĪ"$j¬†*µĻz‰õyøŅŗRŹD+ĪÓĪ^ aśj¼A ÄR į—‘ķ>1[ĖżF–݁PoĀ"Źtc$Ļ}Ē»4!j€­33˜€XŅeųǽwOl‚ŽoÆśó—]öÆ’üŖ#KaŌŪ£(B(„*É¬ļŠ¤±šm½*±ūA)•Ė·śĖ ė{ܱv5ż’De²Ąœ“Ą»ĄŲumųQ×Å%ŁwGB`¶&³š”L+$]ĒcÖĒå’  4I!Ań/¾’£_}ē‡~śüõ·ÜyĢc=’CēA_ @)$1‘©ź8eÓ'ÜķÄ@)bŅǧ„hń½™¬H)Lm¼ņłˆ|Ü;±•Ķćę"" ²kTW†fŠZ Ą6äfšcDP:BaRQÜՉJūJA ‚¢SŸq:ŽŽ*@ B :#³%KžĘž”i‰!©bµēØI3–·i@ ŒŖ[0¦b×93ė”öµiv5Ē“”qĪ;āŲöw³Y'l.?W±7ōq…(sĒ¢0޳)a(Ś6ó›nٶm‹œźOd5›(Ä72BD Įˆč3ė„˜ ½eOø[kM:Čb[iqī܁˜ŗDb4õ Z30¤©VJ™`!P 9{(€Œl^’4+„Ü&Ž"13ÓsČC{į±žBIcĄĶn ¾”ŲģŅ_μžV< ¹('žUG Jßve×č$=Ćīõ”ķ“£³š¬,Ū ™Ģ²)0š7ŗ‘Ä 2g "ͤ™Ķ:p”0¢5/~qŪfü‚6i.µI£™Ź:°D~«„°”čĶĄ¢6!…A%Š «7ž0•St|ˆųŻÆ](` šĀœĄ@' °@Č„MqH® ģ[M€Ā¬^’ąĆģ Ź‹7PjzöNpQ6^/hĖbĆ@Ū;ĮŖ({š}’Šz\*9CĪĶaÓ *w]‰¾^C¤..Ø\Ģ6ūĘŠf覓i J”ćĻžš@”d g柘L {„)ųB,Šś˜9Š"ći{Œš‡ō‹WA/›’H9Ć$—č¶ÆŗśÉLwdä”ūī’ĆžpÉ%?»łę›/żĖeƲ1°öģÆ@ˆ4H€ĘēĢLM3pÜķnīĻ(f€‹ć‰g{BĖę›n¼VJ9ŻÅzpįāE·?š *Me'6ŽJT_šĒ±Ŗ7¬`W^I&+Ŝ¦i§ÓŲłPåĘV›ļĀéčŅ¢ kQī'åźs9y Ŗ.ĒSÕĢSPóƒ¼Ol Še(Ł7’"&-š¦©QźĖŖ|© ģėØ+ÓĢæ_‡qYwł'Ų"oįĖ8SõŪÅó\‡7nSµ ‡S,hœdø[raYéWĶ[Ó”ŲŲTLé;nŽŗ•VŒ¹URغņ@g⤠<šĄ®»ī‚ĄÆ~ę×]wŻņ]W\ņ«K–¬XqÅm·CsAQ­mŸaŠģ*6֒#H‰Fw4 Š0¬Ūd¦#'¦b8‰vQq&ćį>…ow*Z@żŽa+“ÅdŒ`NŽjj™žOÜtofŌ4K3£‹eVŖPń 5˼Ąöؙٸ„ٳ³č4MHGż±;‚”DFl¶ĻC˜Ŗ©iMg"”@Z£ˆLC1DHŠ!„ŪÆ¹ö¦›nśąß{żķ7²člé÷ BΘ„"‰a[€ÆxlcļĒEüŖix}¶;µ„ĀbĀŃTnĶPp„T§›˜¹3ŅńW²Qķ6]§{©•-ŸšE®µŽbéį÷rĘų¬–ž×x1F×ļļf§¢tÖ z‘)/ééāb&såkĻ"iķėP°Gl^oŗøJ«ēct£Č4­¹:m^ŗžƒwKPa7xPÉZTŌÆźĪÓŁģ2]¬Ö–KÓĮBBĮė± µÖåÄ:zšÖ£‘囟0„Ū&—,Y”¤ Q(¦^/A)AV0ź;™+‡’3Ė;xŠ1œŹöu°ŚŌ(aX£ē¶y’$Ng BĄ{¹ƒ™sd Ō;),z%Ī«’Š7č¶›%­EĆŻ°qPō)B‰!'bu=¶Ķ}–cŚ”ˆ¢\ī!¶©“y”†† 9ŅU¦J4īį_CŚX®“ØKW ]ćŹÕK—/{öĻ{öóžׯ€^oółŪ~ō£mŪ¶½ō„/żå/~»`ŃĀ\ōćõ›7Ü}Ļż@`‡ś)@„(˜)EuÆŚöé__Ō%ˆĻå‘a|ŽÜĶŪ6Ļ]°£N ‘±¦Uņ)YŚ[ß>ś©6o“ZA¤×bÜÄŁÅ-õ·~r·ĮR4 Y”RqWƽM žv‚ėŃr§/Pžc.k ›b8ę&āņĖųę,Įvj„ͳiŚŖż2£o\ō°Čłöø”J¾G£Ü&ŃŪrūĶĪĪˆwœ™™±ź»·o°Ē̊“t:¢¾§ˆ™ćB®'°~νDaęaP‘ĢożŽ¼ŁĀ¤½×{o¼łä£ŽŽ{ÉNl|hÉ®óæņĪ ~rńÅ÷<üż÷y LN©9Qģe…ø²lĀ‹ >®¶“Ռٶurbb¤˜ükŸ@)"¢N1Aš¦ĢÜé˜@:æ{T1ˆQ)„ š$Ļyy:?nň́3ÄŌRJDA¤uFzab!rµ3ļ~jÉä>*–byezĻE5į‘Ƀ÷˰Œw•Q©€™xŲŁ½ę¶Žŗ\a¶DóīŹĻß8 ­•R*6ŠÓ6s™%ĶÄūżF„ķÄ'|ĀM’qć _śb@ĖĶđ`eä+ˆ P™¹Ų+ĖPBū;RJĮ QVĪtœ-x€LČAHŒ16?t¤=¶“& ć{Iįŗp[)+!J)]¶×bƒ³^ҬµaŻ!rŗ5óJ·¤eGͫȮlG“"×6Gص-¾õół½…$ 3„6rÖZ‘ÄWŒ%.evµ\a%Ē€+T”ó°¹ŌĒėG_AżŖ¹Ī94DČc(÷ō; „=ĮrŠ¢Č`m\*¶õfn8ŠG¬ä*n$&‘q»oŚ“)MU$E¢i¬;‚2ł@Ølß/ėžŌމeå*5ź—¢ā"O<·,? Go;śčcŽyÜu7Ż0oŁRöiÖeėŪ:KvÓč“ k½S‰ˆ„y±“:ĶQü)?M¼ĻŹĘGJČv%‘…&‘“š Ā4dņ³š˜9²×KŗŲISÕķFŽAJ8²¢üģ"BGQĶL¬u‹č,KčCWŹÖž ¾`EŠPóń:±‘ĄļŽöxéQ€”"oؑ,2"+:ž< G”ŽĖ„©©Wż­\ɏ*Åc›YpŠģ±cE­emĪ7 õ@ˆ”Łh7mxä†kƋ8U]‰£óē™ĶHĄ %€½ė°M1FĶ ’¤€mõŪN\Čå°Üułė6˜ÓüÖŻļ½*ŽóZB’½uŲsDDA×^9(«kÖõeóņŻ9|MŲO Į¬ŗ„ŹU‡Ąqj[ś.v ^_“łĶ˾’i2ø±¦6G”äR¹e+ćJyŻnGH«3\ż²YY±ņ˜Žfó!##£S”&‘M7“%VC „†ˆ{B“xĮ’Å —” Ē#,"¶ń=ŅŠ¤nāh)r…zLĀ£ŚijÜwµŁØÉ€µdYC°`±yšą—¹ŹGfīõś*ՎeĒruT&ņ±f+ßgž­ō*omč Ö[N)1ØąéĆtėF  “¦ĶŖ“yŻ– ŖšuŌm~_łæ;6ĢŅlnuØ{Blŗązš¦RH­Ć,P+œkØ,*ų𠯆åŲ°\MĄKi¹ “„8Y’ Ŗ”EAJ‘ø¼zŌp桀2į ĻūŲ†‡ļyöé§\yÅßFQüä[=ż”gk–#KvAčLO÷~’‹_ƒRĘhę$Iµf¢¢Ą^qfž_¾ÓDƒƒ²ē£“!æĶ¬VŹ Žė“d­µÖ Q'ƌ˜Wkēńƒ‚’„Sb7\¹¤¢ŅrjVd‚š‘Ń®`K) O;“īč 5ÓÅŃŌŌ" łPĮķÉÉIƒAe²lgi¢L@ėČłüćĄ_'ń‡Cøų5炨 @)D$Q ”¢ą1sš>²ićć’ų“Ÿzņ_’śē[o½uÆ5kO8įą@WÉgFf4N„õŲĄÄ„-;– Ž/¬ņR‡…ĶU;­TU×*6Ó5Ķ:Q‘•Öš„Ly˜ēó?fR dĽ»#Q.Õ!^Ę£ßĖĶK1_ąQ»åéĢ×­O®Ś%љµRI>}ˆ–os’c+²3ĪžÕ©ŽYn0ŗF21’ ŸĮķĒŚ“ Ì÷«½æ7ģ‘Śęœj• >Ė,9ý\NÅVŗĀŒ4ŌŽ²æVe·s—“žŽ¼¹—&÷܏č±pī| Œ½ŽXŲ&‹Æ6KNk2‘m%æTm–,GCd"ÉP”s_ė –O1öČØż[jā^mōEĖŽ‡=ķæģ X(X ĮzŲQJą×µ‡3kfõU*31(F=¹żoXźžĶ“I=”E掶’6ųĄĶĮ]K`0>~ĢŲbK×C„x›P÷KŃ0ŁfLµÖ–)@4ćą“ßP=„ ?#ZJw£¢‚±ČjŌ'"S¶«Š³H52 Er$"! „ФˆŃÄՍĒ&ŪBś‰ *–ēŒ/“>IÖƔϢ÷ʵك}#ˆe(Ž“¦wōŠĘ—2zv±[ķ^%–ĄŌ[ µ5s…§V‹•3_!·(췐†”ˆ*L6ŹT˜Gw8”#Ž2 '"_Ųp؋‰sēεžØ āNT¶’•eŸĒ6oŽ|õÕW»®9" KÄ>ķł نżĘZgŠ(åC=“~żśx¤{ņiOķė“;:śņWæt’„  Č%Ÿ_Ū”ŒĢ’Š@ ‹ÄæģŖÆX<7K,¾•ģÓ³{x¬XVQ#Ė”Ł^ĀĀ&5 Æŗe”ŒR˜°U5Z‘ķr|W…Y†]Ü8ė(e~ømč2夵‘²Ÿ^(£³pRŁC%IŅĘ?Īb WJU–L-7gg³Ö©£‘÷ķ" [ĖŹĖūƒ o‡Ī“īĄŻ:‹/„T·Ū-ć†‚ØÆ¶PÜF/Ć[·n³DQBl™Ü¶zŻZ£n$§¶m3p¶+¤j²…€6„aŌtģWňC„…•‰r!†*éXMOM0Ś…ŹQæßē”ā®a÷mVfƒZåAÖl˜šƒ#҈½±¦ 7źū®;j›®We<2°kŗ²¼7TJŗī2„J\„*7|Ņ­ąŌMžĖ‚÷z½™™ž_"Ø|Ҝ!īp ¶Š¬£b[)ØČt€#‚Ō©Ź}hõœŠ&^É⯉%d`•u9IĢ„"œÄ.i.}UŹM5×  JĮ ؃5XĮ^?v*—7gĘpĮÉpQ«]żō<Ör3€Ē(ꛧ,­e~™9%†½ÖӇ¬3e…ÕģV—W.Ø£œūĢ^lD’Ó4mØ»`‰ˆ¶mŪÖ°]=G™±Ś^ŪYöū ]j¾‚ŲŪ«³?ŲĘŻ ę«ŅžėÅöā8ÜJš36ÅC\0aÄčT²2ĶßŗUŽm»Ś’ĶŌf@‚”Ø5žŲĒ~ģC•rÓCE‘“$RšÉ§g3×qWó¹ÜorN5ͱ©yZ ŒÜ;Äśå¶¦Öe7±ōU0Š‘„³ŸöģŻ¢ī®»ģ¶|ē]ŸzģI‡Æ;šĄ5{±” uźŽ]ˆRoŽŠMÜčb×JŸĘ?܅„z3ż|S(*'_}5z!Ø4ķ÷g ’m&±cC›[!½¬Ķ˜ˆžČŽLQEę~æOš™š™éåy4'C’ YG¬eś9a¤°—ĻJن¼ę“”oĀßæķ•?ŹöŁÖ‡‰M…EĮ¹ óė€ČŁ7 ÷,ˆ€‹.ź(€€5¬-˜›Mėξʊ‡õ‡„iI3AZŖžž÷æ !¾żoĄn«væāŚkī½óNˆ$ ”™ņ, "ıōKū±~T* դځ[EVeēŪFž˜E×X€R³@G^æR¦÷#°’gˆHi­,Į2Aæß'­Ż*ę°"źR«vw @ j£E—#/ŅT{T€Å3lŅe˜`d“ŪŹ Äm…€¤“Y9¦`ŪČč] tæéŽŽdŠJčū F½ZˆPņ·ęf, \ććĶ:h™…{YY×"¢~æäĒ+æ*¢¦ā_YćŹO梟jEĄoXó­·@'’Q¬R„’4Š$Q„ŃB!@ Ų¬S‘hĄ K³Ź%ƒ²Vę!ē仛Ap-A—ÕĮjI±@ą"D·ŪÅRMoGÉOÖÕ̇X®Y­Ņ~:=9•ōśīØ"E¤„Ā ϽS°A~{žÅ\-(! µŻźj°œ·_8]Č~ƒ›|gµ!Zffѐļ1ć2666::b…-DĶzbҶāŠv$cźje–“€Z „łf`… “… qDL©†D"PĄ ±BE¬"6•@j%ęµĪDÉ5 ©HąP÷ٰČj bł bļYd³\K£Ė…Tś,mfp ŪĶĮ(UŹj>eŹG‡Ūq÷#dm<\g΂בdˉ]uó2Sä3Ó411Q怲šrł7•÷ék8›p¼Ī µY'9šVY€LļŠl»ļ䐼 @Bž³_%˜ŌȄ=3ŸX›ķ‰DDRāŒžzļ»ßsł_’võWj­Ló¹˜AŲFB`M¤t.dmNʗ&’3ņd(8»9ŒB¦õ1ŖŖ'·8ž H_ōćmVéĶw>šūĖ®:धī{Ģ bīb–] "†h|é¢DĄƒ÷ßēū¤AląŖd¦ĶŲłøZs é:ū##ұf£ā:Į˜Č ś¹Čg?d!  š¢HJ@įg¾Ł7&¶•mddDH$­attÄDé&B¶[ 3.~ŹÉ\1īt*¶B„hżŹˆŚ#)Æ|ŅģS–٤‰īō4¤eåb‹_Õ)ōv0[<¹Lņ²OuµŹÉc¦iš$IW„«\: ÆŗāŹ„Kvz֙gŽOtFī¼ēīwZŗb÷Żm̆‚€u_6°@"ąśś2ŁįĀ&*U„ܱUŖ gUŁRE+÷ŠņԌśčĄś i™į„@­µÖŚP(ēg"P”²npsīĄ5łÖ,ŐdN“Ą”r·!H)£N„2£uŠétĢJpÖĆÜ {9 ȘĄz½^sŹĘŪ¶eĄb⯌Æ‰ėpUu«”żŸ!ĆcwЌŽŽŚ.ŒÖå¾ü“ŚWĆD\FģZF°d§Ž=ī8ī©DŒt»/~ń‹}“ELīØq£m \s¤ŻóĢŲr”pŃ[2QŽwŁ~v|ŪŪ5”ēS5Ü”ėĮŁQuŌ:ÜbŻR,ƒ“ėܤN'ŸėtcšZ=€”ßK ž 10 [¼ø³°¦Ė£ Šlöū@f‹H)›U]BgµŹ!ANI“9*ΚjėŃ I3ŸĶ©VĮ 0hŠĀTłŁĶ£Y[6$bI–€Y2K ™¬ ±„N‘`ÉŲ "MZDҜę]6ykŪx„ÖŒ"&ūīŅš…a“:Y«”MšP Ü :3ŚÕ2”3ź¹€ ĢJ­Ź…sę8“ČŪŖĒ JŁ”¬čš’q÷ßar×0|nU÷ĢlŹ9g„„Q€±ČAd° &™l‚Į& l 6°1`L0LΈ,BB (‡Ķ3Ó]U÷ż£ŗ{zā®ž½ļ÷ķ£‡gŁé®®pļ=ēžĆ%KžXy­°H:E®6׍Ó/ó~6ZĶQv\ŃOr'.2azŲtZ¼™ö„¤QÜŒ³ķ,xϰ3¾ó2¬ b,*£Ųd9Œ^1IrXɶæ‹Źė"Ŗ^wė(²(j:2įL‹q¼.7VQ3-w³¹”Šń³ż‡q‰ųų&n)Ź`e“]ČįĮūØø&6‘ėŗķ€ i`‹c`£<˜Åß|5mū)ūĒķäū`m5ę„€>…@R l’ vXßQÄoŒÖE6끠”¦ˆ(؃V(­żčz£xIē²G†1¬“1 ‡HęL¶7”~¬:5ŽÄŹ–õēżśb°†F8ڊ kL;ā‚sĻ:÷Ņ P±›Ź›™I„ ųØV^ ¤}"`v1rīŜcQ". H`L”H%A°€„õžAHК‰  £ „3„$WąÉd;·säČėĆŅlŸ&4› É%LJ‰HŗŽ½ .¤†źÆ‚8BÊĀ÷’U'ÄÜ2ŹpF8ļõ\ö_Tʍ؁ć@ø-KWHW€ą$dI.\@ĆłW.Ī‘c–…ÄĒnń¾§Ųä-F[£q‰d*Eq³ ū@ŌÖa„AGęæO=óŠć"!ļøł–ūī¼»ŚIŒ3Ģʖ–XXįE ${Œ JĮ…ę” ' Büv>(t‘¹ĆT„§”e8‡„)ˆ@+„”ĒŒ(> ć+ŠåF™`{`#„°Ł°¶›L¦ŒķZŒ‹Z!æ3ź ŌŚŲęG bÜį‘QŃó‘BŁ@ 0uj•6Ś~ŗ%Q čšIy~“uČuÜ8ļ—¤å½éØödhöź€Å-rå¦`¾ ¶/³ģŹ—ČÅõń-ˆ‚łxYĮršĆ­’ā]ÅDĶü5˜kĻżMƒ‚±"ߏq ‘1К#‘£˜=C*(Čh“`!G³aĄ€³`Į*Ž3‚yCł‰`”Ū«ˆmvŻC*ÜY¹ØcN€Į–ìـ¤RYåwll· ŒI4Xƒ5‘²# YŲ9^" Ų÷l52ģžC Ņl÷Įą²uH)įs±ŽJ“žāEšŲSąœ GlL(ŚÓ)”–c±•Ņ \gTā‰Õ^ƒćŪŖ”6׉ķ-%ķv‹Éh%«$Å3Ŗ‚~u1q/žŽŪŻĘ`‘·YŲS Ś ƒ] Y•vÅXĒ߅T ’Øų@¬t4‡‹" Gół} ‹%Xސöh®0bQ–Ä0Äńßā–ĆüS;ʜ¬6…eįpÄü->Ē+c“‡{œUaæé¾Ó½œqV)Ī’(`öö¹y ™ŹŻ¶%bb±ĖĄZhŲK²łæÕcŒ”ł^źV•±¼õ|„3Łng„“ ¬)ˆņ„/˜ŃŃ&”Fčr]¬‹Šw¢ø9ŠU…ą ¤°Dćē €b·W”"uP¤C1ĮµžŃfŠŹń¦Ī·hϊĆb(ņ”+1ĒDŲQ¹õŲ†² C2”DD”¢ČkŠ-„S‘H/ōÄ5ĒĄÄ©0ď<“sWĖeÕ㳨.L “Mąs”‰Ā§f·J „ؐВе¾exŸ©TjUg+3 )Œ ¤ömĮÜ&Œ’Šæ ™H g’”×2ŻSŠē ‚ŃĮ€޼(pŲŽ*AńЦEāˆeü'Lş,łŠČŠŪ>š„l Ūc’Y’аĀPćøAŖĆlh–X b@Ȅ«”’Ž“Īf©Ą§]",ˆ«ć”Hø¾„$£Ų*…ÅVƁ¢˜ˆ›Üt“·×ŌŌ…ƒX|ä…Ŗ€ĪŗĄŪ6hĻ'ԘØ!ž c µN„ē£=­“RĀu|_'iEc“…&|ńvāB' –‚cx©r'c|#ʐIZCZ?ĘĻ ‘“Cm¬mgŽĄ”ŁŅ" ‡ •¢ķk‚ĄRK)%kCBH![7¶ųFū€f 9’„¶ŸU@b†L XHž‰c­¤ŗf#ķłdDžŃ’H Ņ ‚ 9 Pžv\ÉŚ …<Õė²r±7å×ŗ ‚‡(Ÿ,gīPi@„Z’dĻņ’@näiZ ź\ĀL+œ6g‹Ä+Ss+lJ•”Š@(ōD3<“^Ī zĖs– i„Ą¦`­ńcTŪÖN¢¢ å —Ü-*ƛd²³yédA°ä”«šDÅo;'BÅ®`Ō֓“m³o£œxķAŌՊ#ą‚ .čŌøQ•H)w?²Q#…Į!3)>ģc#r;tv)…1zütD9³'Ŗn\yā·YŅĢF„“Ėš}ėŸ”!„ÄėQ(VÖ-™ņŽ —eQ÷X±P™p¶Xžł ›dąŁJII'ĆāyUy=ǹÓyæ°ę ØÖ½Y_峤[@“ʈg‹yį¬¦Š€ŌžCemŠįč§~d.:)Śm@ąG8ü82 ¾śź±Ē;jÄČ/¹śėeż†e 6FŗQ`+v¾Ć’ƍ1jĀč±~&ćÖT1ÅW©+¬ōą‚0ŅęŽ'Åē‡xņ=N£ū,ē_!¶Č‰&h³Åō)“z÷^æ|eW{VŚ— !EsSļŸßü H¹ļ?`—+Yƒ-O"ė>%""«jyJ)åŗN˜8„ō3ŹéĒRøŠRĪsՊc\7Øąų¾Ļ,s2ĘŲ]EDÜÖą 43٤ĒŪ ż&’(Ž(*+š•ėĮŪŌ%_I 9ō0ŠāóāļrLĪ’Z÷ł6¢dį8؟¹D„2ŠęXуsßP,i Ą ߒЃDtĄ1F·wu¦YĶ[ø Õ«WšZĆ ’ÕŌTń·ˆQJųĘåŠk±õÕ c3pB ÓĪ"ĖŠ¦ÅZ '‰`ØM,m#PŲ+n$šįTŠ ZŠMS” ”8ėņĶ‚OѾ/„4‚lš•*¼;»o(Ȗ”5[üĄ–œ˜æę"~»5ٰ™„ė€!#NCŠŠh\ c q®œA"×·PC>_$°ÆŁ$!L(ÜĖ$ƒ«µå9b6BJėü}„5Īō•/RrÜs«h—R²U( o¼¾±”p1¾õ<”“į ‘€0­„Õ5)JK)5Œõ&$ĶŌA…„q>y÷ć!Ɔ !ŗtg]]¢£££_’ž0E‹« Įøœ/)Eż)¹JĒ%ė#są² bʚ·ü9ēbmgHesćrFe ‚ż6J‚ rū’®{¬(Ė…¦2T®ŗ3.†‰*eX¦Ä‘Ū‡d‡hsĖ7+ådE[§:&a‰ŗ«¹[.EÅ/™•lR’ų˜-śNe¢l·!~Ļ+4ßÉW1aƉPµPŒŽqvłŪ“ [żĖ5¾Ś¹·*µ›l¤š³§óķL hߖFŗĻ:Œ1Žc4‚#Ó÷}!„ėʰ8ZŚ’­Ū']e*éź\0A: ¶=­!”ņµ“e"ŒBļMK*N&’Q”p {ÓćĻūģówŽ|ėˆc޶q]Éӗržä"Æ–Ē°^Įy-ĆuĒq"%ä8“k—MN„Č›'ĘŲ !ŒˆĘ! ±Ņ6YpĮµNq"·Fˆd<.V)8Żlž’ó9ņ²Ž\Ž¾Ćśtåķ.NĒ(ˆŲŹÕL‹ƒ?šZćé!؇R©<-? «Ɔ 2dHsCH¬^æ6)œĘ’pīÅ3!l2C§äRŹ%=“9 Å8¤ˆŸMKį­ŁqßSPF:‚Ā; ź4Ū)iłņāü@¬ųfٲe˶Üqū‡zčœsĪ™6mŚ+VO›6mšąĮ˜9•˜ŸD9Mųnu £/ęŹHO·B¼¶øź8ŽÖ:āłē©g•É?ĖysōÜ!)Ī,IJ¢»żõÜ,č;ČÕC:ŗ}Žq.R8Ŗ&ŹŃ‹³Ö°ß×6‘©h7VøĆäāēĶM€+ē>›Qu-žC§2q«\cUÉ [<ēģą’YqŁqŒ›qřŹvaŲÅ,(~SÅFįvĢpĒ‚Eø®Č{Pi#¾ø¬+]cąDĀ-g\W2’Ūä̧ˆ8kķ.d+Akc5“"”¾–iU”ŽŸL‰D"l' 8¬l ”ƒ)z‚×ā3›A«ų®āרCŪ‘Žmµ©&‰Ņ\†’ŠSt/vulFĮf,ž¼¬9õ²Ø!‚ g³ŁŖźT”šĘ§“­6'—b1³ēy2éä⿀ŽL¶‚R²Ųˆ;¼pšéĒźI'zÄį'œųcĮ&™aŲŅўyźé]æ7óWæ¼čż>|÷ƒ÷ćoŽųøI: ¢ŒxD©0ŗ š4›ģs¼>ŸÜm1 EŽVŃĻoæżv«‹æżŒźz5×%8L f)‰™įą“¹ŸŽųē?NŽzkˆŅŒ÷`LĖŻÆÉYĒKZDAVĄ”2qbņ5E#±–ąĶ9ĻĮ”CтŗC>Ø$‰,=;|#ŪŲ\AźæB°R9‡Œs…¢ā;ü’ŽĪ»ņ)_žrIéM”ņscŠ_!ƒ.ā5’ –s“ń;Ó[o½uCs3@ūĪÜmPßž+Ö¬Śv›ķaµ9„ą<Ŗj‰¢QĻ·Æ\õ!Śņź°ł°ˆå [ī'…}q|>ʇ}­7’‹‹Į摢DœŲlÕD¬žY9¢8Ū(tīEUć3`‚4Dģ„ Š.“V Ģ~÷īo™4mź[s?V¬V¢õš“÷ž»æśń{ĶŚē³Æ¾lŠ›C°Ļ²ićM”‚Q®.ƹŅ_@mšC"ĶŌŌT]Łl ˆHÖŅh-„•Ł øĮĢQ V«@ž†–’­u€MŁ#)jä)} Ū:ė*_;,‰ŃŃŽ²f͚G’łĄÄ‰÷:ā`įJĮA‡{6œ'²O’1Õ¬ē6$v®kHōąg²ģ:YO' LB€ģ¶)Ą=„9ŚœĻ B:sąžū¾ņŚ+`Aš4ǟH$zo“\?\aąĄ.xX}Ɖ'ŗ$c4„¢e˾®MV%„xī¹ēʏ?o޼›nŗé÷f3PŸØ²;²ŹŻŠŅš\!ėŪŚŚ:”Ų·ĻIŪżōˆüpž’%¦OŸHTWW‡ŻŃ†@¾Ry‡QD|efėNJ‘jvܦ,V!Š ”ß>‹¦„EzrC&%ĪÄ"Viåē۟åŗŅŠ_ÅZQ ¶ƒŁc>īUś56dM$¬”wuuÕÕՕźw¬$E¾ŁCWœ£ś=A׋Ƴ ÄCDN·WY¹ƒRäIōGøė·$*„õT xĢ»ĖŻ«ņš£”ž€épų‘‡:ōč#L‚ČQūOĻ:{ß]w[øxį ACZ;Ū[҇ NeH›Tz“ŁQAi/OļÆb³++”z8‡Ėį“Ń÷Łt: ¹®³m—½voč?0‡Č…A³ŃzÜ“ÉdCŸ^ń°ØG7. ]¦De †±ŗž‰æ‰“5Ē•”ęV I3q:/°vÆ6Œ“"¤ćR\› ōį¢^e[Ÿ–Ł £/)éÕ f0‘ß.}S_Ŗ,M_®öÜ ķ“x{ž²~Zi„<<æ¢ŚYŒa«t-mƒæµä˜Ņ\T/0bžüł¾ļoŁP/œÄ>»ķqŁ«Æ4ä‚ .4ĄA!jcLZ]Ē*4UĪņ¢8pՎó*ćjš@ üĢ”€e”„šĒ¾•%J„ [ÓI€(ĢØJĮ üž£敼©ø.ė½/*Ž"DPąåH‡)œģ²5ė,łę›o^{óµNØż÷Ū’’_žrĢČQwŽz›yҬėjłŪ½wuī¹& Ał`u®G1s¼ģ‰ą8‚™kŖ«,·N{Žģٳ‰Ä“m¶†#¤“A\ó,^‚“J’öl$‚gWĮĪc,kš™¬ŽFœ—d   {…VR@ūźļ7üńŚkÆõ¢ÓėxVß;īøcĘž{ŗ©”І,źEd‘!f“KÜ Ö-"€É%ĄGėē‹?ygöżŪŒ3ڳéŸ_xģߗX°°Ņź“BHR öƗļŗė®Ė¾Y2 ±ĻŅ–µ½{U,ĘB²!" "P}MmĀI|Õ¶~éģ7æ^¾¬I¦2?žxUMõ¤I“īyų_n}ĶŖ ė„Bh®Ŗ›ÜšÜµßlōŅOv³p%õ<š’ųĒż÷ß?ląą=÷ŲmüųńN]˜Ēo32©¬Ž•„, ²4ÉŅd("6,Š+@±ą­‚ˆCĻéYQaŗ$Ī™Ūō@čZjAW°eF¬Ÿn/ø$×›Bį,0U.Kęl%»‚‰)RŒ—‘+–åξ¾\[%•Rj­…Ģ’Ŗ««‹ć ‚š;¬ o^ wб˜Xš{å&Yiõ¼Q³@”ė[ęĆČ÷)-˜ĶåZ°zbŅÓż'”(KsĢ.E?ēŠ 8r?ä’9ü¦•I*¤ÄŻŽIiŲ±l6²-uŅ@dʰDlUy)NĆĖĆĘØÄĶ`mµj”ØlņŽśö“ÖQkS×B„żężÖäG@›uGÅŻĆū*A>¬čØå7HÆĒ;d6©œYųJ '6u)6Ź+|“Gć6Ęxßx~ĒĘ־ͽ~tōQ>ż(Ct* CĢ mtĀjbj mŚsĻ׎x̓Łgļ}xāqé8¶90āoU¾rT4<̧Z”Zk’¢R-% ½J–rŠÆaņŠQ‹—/6ĄśõkŖš{Āh–¹nTVž×²zEgggæį£R¶ĒDŹ÷ƒ,QJD:ołōxŽ)‚2³Ķ}˜įy~2éĘY±Ø4Ŗ€TĀŽāpo væpˆ”ŅQRž—7Į:KÓµDŒHāAJėÖ66†ÓZK׉?ĒxKB·‡Bå³ ĀŠ“ĪšVń6c(y ś²“o›īJ4DŲG)im¢Ż›­#(Śń­F·L+åūķ™®¦>} ÕgsĒķ©­­żē½’ŚeĻ=9)“юZk)$"T QJŚŌs?Ōž.@¼.w©c·ą“ ‚Č8ļĄ*?‡}‰ÄT"Ń% ¹„ł§aį'Š…ßŒs1;Ś„Ėå`°¢»Ģ,H@£kåź)S¦¬ŽøĪ‡ń’ų‡ĒÜqĻ=p5€łÆ¾;sęLCųzŁR§o£IŁ«“‰Z",悒“Ņ<üš‚_¾žśėĻ’÷æ  äæ၇<ųąƒ-q×" Ń1^š„ć±DŌ£ž«nˆĀp €2]4ÕĮ¶%6¢²ō©Æ_ŸnO&Ż*5ė,Xµ$O<ńÄ7ßz«¶¶v—™»żä§g×÷īPõā~%“1ūĘÄŗą§?’Ėo2ŠkzO8bȐ!ķĘ{ģ•gę± ßčģŅQĀoav|Ģ~ķõ³N>m`æ¾Æ½ūZߎż–®[™p“ŗ:-ń©ŹP٬ć&”|ųjÉĀ…³gϾõ¶[Ž}’}‚00M©Ś¶L‡ip p@|ę÷[ZZʎ×gĄąŸyzŸ!ĆFXk6i_‘”Vˆ>ÜT ’¢8 (]^·;ƒ öaäóĖ*š»Ļ JÉÅTAc ±ČYFõ,B³0‘[G錨g„óļäØÜY« éœAiŃ>ē\mŚWœŲ“»ˆĪV*6Ž!D?ėÉØ~ēŠéꔊ•§+Ć,%ąų~W¬é‚ö­nJι‚ī¬ā[šļū‘ŲFÉRt¬&ĶĢłEĶĖvŪ@$PŪŅA€hV‹2 j™§[Yœ­dæD·ÅŽ 5/›I$RJ)įČāx7¢Tš}Ķ̉„#Ć}Ö ’I'æ»ī„ó*ķ›Żš^NĻkŚt¾q\8½`ū(7ĮŃyLģą„Š‘KJEš®Ō-v^n#‹ÜŃŗŻŹ*ĆG €R }%ė ń’ĘĒ#)’&ĶõyšĀbKųž©6aš † ¢ļĄAšü?żh2Q½ŃļźČvV§Ŗ ŪŖÅóŚU«Ž’ų£,Œ+݆ę&é8°ĻNk#IŠ&W墈¹Ś_ā'” «1,„S,›d)ID n×rœw³jłŅøžkŖ›5Ą€#*ŒBµ·t­[ß2tčŠTUU:ķWU¹ˆ=¬’>ŗ%‹¬1„’RFńs&“­ŖJ¹ ŹÆā„-Åŗ óŃr Tcr÷1MéÜ~jAū)̈ēĘÄ$„Ż9ŽtœP1^.W%ģaķ¹\ ōæn$īö€/Ž‚*ŸĪńJew:č §F„p&GsĶ„”„µė×5čĒlH©›n»„”¦fm{[SSSü2¤”V27,ĘmV°:1JBü‹¹„źøaX\ '/¶ŽÅAŪ#ņ“ø­° %šŁ 3ĀÅuŪ\ż(Ļ«¼°@(#Ō ÖlADšł£—_;ć“ÓŁ×J „õÉĒ÷—æž®­a›l6;vüøŽ½{-[³rłŹU#ō±Z‰Ń¢HQ°f™bÕ\DČf/^ü£cŽy’££jƒUbŠ»Wc’žż·Žzk,bm¢10$œ>!¾ äM÷ā“?“Éø®ĻJĢȊ­ĘiÉ23Ó0‚„&i’½—_ó {7&vœ¹;4K 0 CøÅTzż†łŸĻaęń“›™Ŗv£™ļ&Į>`“6…(Šōvņ­m€#žē'’n*‘“sR„čnD³Ž™Tšßpž³&„ń’ńn”H»(ēDœŖ0"tŽA˜Ą&Z”ķ(Öüu±  ‘īźŖŖ®ŽŅ9ŽųØČ£Ļę„mœ#¤ĒE¶ƒyB$H”Ü7ņģĒB|)ųS£‚ä!6¶ń™UœŠĆ‹hEĒ ŅāĮG@=“sc…Ś\ŗgµ™JA<tiDĪŁCĄ3×ÖÖ&^xžŁ> [ŽæbŊ-flk‡@F­IV_ĶŠDpå¹£“ņ¤ļ˜a`m B–ƒ,ŁxÄ&hSŌ­µ‘Ž Æø4ēĘJ@ V–‹øfv˜±"źF8ĘŚ”!Į"8Ē ”ƒMM…€Ÿ`A¤””oRRč.ļ?O>ńōÓOĻ›7÷ŁgŸuŖS2•‚g „Ż%5 B)—`(K{²>Œ€˜żŚk»īµ«„łń ?¾éĪæf`R,  „›dzą_÷447Æko¹å@31 ”IHŪĄk‹°¼Ū­@$œ‹–œzź©o¾łz—ו%@ i0Ø’€™3w=ķ“ÓšGOœˆAamVy¬(fóTQĘ÷ĮV§É‰=Pū(­9}Ž”@eĮp#!`€Lꙧžf¢¹ŁéÓ¶ķ;tä~v63Æ8°­uåŹ’ūß/¼šĀø±cvŁy§+ƼźżwŽŽjŚ“’üē?‡uŌ×_G C`"$&cDB¤¬@ūΜłŸ·^¶×łå¢Å ƒ¬š?÷³G}tĪ'BŚY&B{ ƒ”¦–ƾ9ņ裾üxεW^±nåźźŚäŪÆ&;欋{eąĘ ,,#$€g×Mgzū-¦ÖŠŅÖź"±Qz`†0`¦IćĘ:÷ó/?żlÜø1Z)’‰œœIŽøÉS9×§^Åk%”eńXŖ…ŻE•ŅŅ•qIˆ\#XX€&Ÿ9Č÷‹›E«Ļh–²Aw-ƒœL@\脂R]T`*« 1*ųŠ2"v‰½aĆ&Äci[üŻ4ķ«Š¤·ĄŹ«2ﬨ“±-¢`ÉDdX›;Ųó«‚„]Įń¶„üĢJ<±YžgA¹Ūä˜Ō¼“ż#æ {•Hå+õ=,|KŻéātŅ)Ī„£|#.4ņ-u®ńõÕĆĻŚ¤&±‚<Ŗ$æ4Ņh©ĄŁĖ3[+\Ä’ŠęĆ%k ļS\¶(°'"cX8V+ؐ¦B9Re̬yķ[=I āŠ*›ŚõZP™wQƌcÅå*;•ūÉĖaJA”ĀZ>HńmčN ­Œ„p²-üŸ»īūäƒ÷/ųå¹w?|ßC>“|īƒ‡»ų¶ėŲv.1;”ĘP˜­ž'A6Ć>·Kæyčļw?śč£qšiēŸ‹D€ņUd_ŃmĆB±~Æm*¬ų9ŽS¶0QtR!ß»dµ8Bó ēĪšp{ Č@I‡DĀ Ž:ƤĄ $‘p²ŚŅŲtå/Ī»ų7Dé‡fˆĄoƒ !„QZHikķV¢”“‚*BJIF·ĀĀ%~eĀeFBŹøwY‚rł¼a$× ‚6 ł«sϟ<|˜ėŗÜ•‹(‘0 &C$¾YµrCkĖ„  Č¢øyõ2+\%ˆ‰6X“Õ¼›·!p¬ ({†ÕŠŁ,9傏0É,ōjĪGņØĀ\ų JcW§$9–»@YŪŗqɒ%ÓūNxÄÄqZ[?’ć£>ŗ[ ]E€aC,„¶F„Bś1"‚ļø”†jtHŁ'µ†Ś2"ā%ݘ„üaAĬMĄ×£“ÖÖpĒVpH£™dĮiØŲ&ūąīĄYÖZsŅI&Z½żfĪ|ńćw“ѽ¶ßfĖÆ—.?퓟0ŠÜÜ|že—į„š†Hœ””+™@”ĆóŽ>ꇁö’1ķ-kjkc?¹ $œķ·ŁöŅ‹/ń2Ł–å+‡ ;4l­d ģŃ%mœ-”ѤYJ§­eCCcóĮūģ3oį¼vE"žxņÉ=÷ÜŻ€ÖÖ™œH{FFEį,,ŃuGYzy•8GBScŒpjRÆæņ*3wA{ĄĒ’Č÷3N¢Š ,Š0xŠ gqĀŁ?QŗkńāÅOķ±ćCükų!+W/žzĮ'~ū!C†0ėą™{ģī4Z 1A)hć r(A^KėGŸ|Hyš!ĮH:kÖ­÷µł|ŃWĘó4‚®[»½Hƒ[Æøjńüƾ7rųą/Ī:tčõ·ßüźĒ ž2¹Õdó1åƒ ĆnæłO­+WÕÕ5š;»RU.Ņi ;@}mõŸ}FõŲIW&&@ˆ`³ć‘MP‘“Ž+ł 1&š^0ė6Eį¹D„š r 5\š¢„9’0˜”µÖZ'R‰b%nķTģąY6nĻÉF–•c-åe÷°Ņłm¼ÆxÓ=zҹ¹yyM¹.čŹXt±“_‰;ĘZX” 5"7hŌ=6É āšcēkN9‚q[ś¦öd~}ö’W““ʈwAėr<.éZYa»ļVÓ« ĢS<™āĻØųņ*ų‘2„”#Üør]qźbŲ” †1“œ`‹UĮņZ¬ ¶æĶ"ō°I£Üć+Éqˆˆs\‘M%Ģ ßS­µ†޵“ŠE¾ōūß]?°©÷ĒæńÖ[oķ·’>gžģ¬– kÖ5mX¶ņ­7ެīÓš‹Ė~ M1ÄRj!8¢5Į_Ķ~ķLGēq'žŠ»”‰²ŁŃ£G_|É%§żźüt]­µęBa’ “9fq„|–AČ®ĢŪóf`AåŲ‘ Jƒ’œ_hDĢŽ,b}Gß䮄bIB ĆI/<ł¤@łÉćĒ3&£m¬ēkĒq$#·˜ä}śö’ńI§@A†ĮĢ®P€Ė”UC8Ö_4§’Q¾+\‡eĶērŻb¢d˜#PŹ&y™ˆÕ­ 3PaĄPōH h3m›éžŪ_8yē,“ 0”Yłõā9|°ļ¾ū¦ššA"Ø×ōhoŽ˜“¢Č‹%¼z«®Ļ¬“6Ęq]+®c‹‚±‘WW.޵“2D$bŚiŅŹóP L„ˆlĪgĒ*Ó¦RI„“ćŠ(WU‹–J*eŒ2 *Q° īā"*ž]“+ ²Ųˆ1*F4‰1kŪHĀŽćŲ™ *?aņ,rkŖā , 䓞J–G ļ1UŹ’U `CöyZś4„!„!FŌŌ ! ÕÕŌl½ÕVÈn8ķ‚='mūįÜ9Õśö0 ˆ”4šdŠF!˜`BÜ/āõ b Ļ÷7Иʳ¢¢łƒŻø°5˜r6¶ż2ģČ3A…S:–$µ6¬™™]×ŃÖņMę)¾j¢ŒŹÖø.-¤ō=/‘J2C§Hk‘ …™ŪN_¼xńˆTķĄē|õÅʖ5>pÓ_žü˜żY·7VĮ‚øL” vǘᛤ–ū³‚=¹ŪJś’Ō˶[× ŻÆØxqĘ÷āˆ{Ģ„ó žĢ’ -®žÓ°K&¶*¶™żæ‚ōžß$Ćń*Q…:J”pFńy”’ņRĻåžJɾ訖S,B[,ķS‡F2ā%'·½D«Ü­žj2d:K)8_W¶l«p\ „§żÄ=ŻāĀ}Ѧö [PČ()«Pn;Ė+oūŠ(prHHh1 p{śģ³ĻžĒ?ža`<šĢ™{\rļŸ¼zŃ×[MŲb«‰[lµĶÖÆ>õģÉ?<¦~āHH8Xb˜ Ņ‹d°!C ¹ż^3ƒ>"į:U.·vź3𭧟ŻqÖžQšaĄe)g(–K„śbŠų·©ŗcņ¾ļGj–q ¤ŅucN>öx’ŅpĄ²+=źK>f°MĆ:ZÖ?žōćÓ§OOõŖgG[‰p»ŸåšaŹ…Q^–ć:(€±Å½ģĢ,$Į@0 „±LoCĀ…`•äā jö²~"įęģšcr;ĮĒEū[ŲrĢNč€EŃC)BŖ…Łl6™LŚ‚nÉRÕī _&ĒÆ&bHK<ŽÉ)ģ¶g .;ü6ˆ~)R˜w=a&Šn™ŁųŚqŻ€gČDDZ)滑! -!¤”q™AŽ4&@…ó-ŚŲŚ>p`żä4›”cĒ|šå^łŪM­8d˜°[t1%f !ˆ•‰œ.q‰ųɄ‰}ČĢ™Ųy yņNē–u ²-Y„®œs¤”öąsĆśķÉ –!ČČ aĪ0Aƒ @ GĀ!čźzež‡ļüżżūßŖŹ,Y²dķņÕēū«w?žŲĻæöB[WĖ_ļøķŠ+®æĆt’SPŻ|m\G€±qĮ×7^}ͤ#’ūŅĖ_-_‚ź$†1RøĀ^²zEŠÄ±G¾tõ 3¾’=±rķa)0Z»‰„"M †„ Óm×ßšŌ}}üéĒėß7,¼üĘėŪOŁ®ŒzP'rĄH$R¾ļ RHfŌŌŌ ”BĀ!;[ R@–`bPlcfSāāĀS9WAGš3·* ÖI’ƈpłå—!HŲ>vIBŚ4Hˆ€#IDŚuĒnæó ŪĻ€6ļ¼õÖgoĶ~ęGU»yćŁ×wŪf—‡ž{ŖyÄ@8ŗ½½żóO?'ą——\éD«Ö‘ĪźÕ«·ŻvŪ¹‹ęĆų€$ß÷½ō7K–}³tÉØaĆÆūćõ/>ólŖ:±Ē{ȦŚęaż:ņpT²t”.ˆö9pÖ9?ż™Źųõż«ėFNŠŗäҵ«š ;Öo¬N¦DM »‚!|£‰Č”X 3¦$×# ˜ źe†™E‘rR Ē,ĮaiöEyiܔ»šƒØĢĮ—m,õĒEŃ&Å_Ui ,8Į)Ųī"ō»h‚õ(ķ¾ļ÷[UæsŲ³rīVŽSŁC9ÕBīRw99īMåź¢Œ<[eŌ·'ć\‰ē}Y”݈5}’’O_ö¦”RŃ Ęo9‡pD˜ ³a£˜ ·lhµßhß?ŌĢ:ų-ėī?:>¤ń ˆF¾`ĢKžoōbĖ6‰’yŃGŚÆōKüRēn9ø#ĶløģD(~± mX›ļäI Wń“,ł£ŸÄ73ū¾ŸÉdŗŗŗ”R%ŸNń0®bVł£üİJūŪm¹U ؁LKēĢcß{é5Ījö™}žĒ5’Ō3›’‰$0Ś­ Œ€»U}Ÿ­{l¼L–Mnŗ^|ŁĒ\8ĀåffŽ;ŲgŖ kSīĖž­R*·‚ĀO±³4®hšc×|Ž1ģ+VzHu}į6śö’āƒ÷ŁŸaåéų*8tĒ]‰Ō`YuŅ~+֊µĻŠYŪ 6Jwut¾óßWn½śś“ūĮ€ŖZA„; =eĄ`öż ūfö™Uį(~ō…„˜5kßųY„}L7[ØŻRāǰQZ³QFkV†5+oŹØQõBT-+V²Œ˜Æ=Ćś›Æ~ņž»¬²l|Ķžf·1†µ w-mÅŹÓŃ>¦}]vš@cKŲŽK°®U0ź:£r;ƒĪ[ļ¹2śŽN•ŲŚWfŗ²^Ę/Ü1 ³f?«ĀUGæ vWĆ^Ę.;܈“ÖJ)ĻóāCmgWÉż!·«‡ó­ų±”~X:®ąs»ŁKć/ˆęsīs滫6Fé¼Ėcc˜5ķ+ūāyŸĪ}’­÷ŲgĪjcA©“z³wמoX±Ż' sgŗ‹µaeŲ3vūäĶw"1Źmh€ĖŖR„-ҼŸhęš±Ś9⇧֬˜µÖ~0L¾ŠNųŽāū¾\ķķ›`bėpnė¼'›»¼pĄķ³i—†fŹ VJŽ _iO@„L0*¶²Ģ~°o›L& xą÷ąÖ6ƞaO³gŲ÷TZ«Ģā>8lęĢ&¢½¶ŪīžŪ’ĀŹcåsVŪEĢÖĢŗčLīÕ÷‹_a?Ėi³ŚĪ­™5/śr”­’T[ ڵn=+eÆÖn°>³m/v[PŚ_»į·gŸŪn Š@”Fõė§;ŪŁųiÖi־ݛģ•(ķu„ƒU›ŽĘ°ē©¼ŻŪ~…ćil4JуČd2ys.[SīšĶ[NŚh_Ł«ZōégƒRµĶ`»­µXĮ»łĢYķC×4³ęÖ̹‡;µŗßöĶĆz„jŁ3¬¼™Ó·Ž~ģč:€ŁÓŚ_į—]¾Ķ Į³¶ŁšŪ[7,[xõEæzęᇸ³ƒ3]ģeø«ė„½÷ūõ±?ŽoŅŌÓ9Œ}Ļp6Є⻬@;󙙕f­?}ż­£·ŽéĢŻg]sźŁļ?ū|Öļ‚Ą żvœĮ¾6¬}e ³ŅEqZüŻŗżŅ±P-&łY/vp+‚u“å‹Ė˜‚%üoīWįÕÓ$¾Lk]žEŸRłīb«Ų?)*D˜•ƒĄšżķ$4g}Éw+kmŅė7)Z®Ō‹%“ŽĀŪ?Ćeæü˜°ĀŲvsŚö8uŠßBqŅśmNF|Ń­čqģ;ž› żē+‚+ˆu8•GÅ¤ŚŚZß÷£ŅˆÖŚö9Ä”ŚŹm”¹ØU»ŲA·ri*~ńń"G¼ƒ4ļIQN= …l‡H” Ļ3-æyŲÖŚT’f”ßZ.nŽü)9zŔŖžtJDöHBˆd2YUUU,Š^A—?ś²‹M–†mÉ])“Ng„‚ōAcF ’äӏ’ŅmLU½ųÄ3ż'ŒŅŽ™¾Ė øB;ŠvžįĻ|öNśĆyŸĻž=ŹH­“”LNckɒtŚ#ƒÅļ~šņ“’ńµbąÕ՞t6ĄW. jźÕ)7‘€%UĘ&až+i!Š‚[0yJ— »k ˆ·–1‚Į–B‰ .s}W[ļ~}’?<ęG㷜 @­ĆŚJS I0Jjć·wéßČ%kuXßłį³/ž~Ų‘æśŃI»ŽžōĆ}ö’ķ%æ~ą©ĒÖ¤;ˆ!5żś|Ó±qĻ£€¤¤r’>³–Ż—l ×£°MSp! AK1y’šŸį÷K ) ² Ļł‹vÓÜæO]æŽFXĖv„K,¾åŌé!.,8lå 8ą3ŚŽWŽ$:Ć%z· ­Eu ĄDœ+‹@Œ™aĶZ™Ü†ŒE±ÉjšSd³Y­ ÉdBkmģķēŃĖ!„š‚ßóB:„ ą&’ i‰–&ZюćˆµaBŌSJJ©nž#[h’+s•C¤8p (±Ē[2aģŸUŽV` hmˆ…ˆ˧_Ą’©Exˆ Į7Čź©[NŽeĒķ_|āé5K–ĻŸ3~niĒ7üž>åwŌąM|߇C †fĒē%Ÿ9®ļąƒ§ķōįcĻ­üb>„™qĒU»ÉŖT¢oc#“F "*Į0“Ī ¤É(‚b怄ŅčģņW¬}ż¾G>yģ¹żGœ¾ēßŸ:=Z)Ńć( ÅØ}q]ŒŅģ%ŪkÕæŒÉjv-H'Š‘1š•Ņl |HQ‚:DF€%ĮŠXĄPähœqŚ)’Š›œ±½śüąœÓQŸbv™]Į.iįŹ„īš)ļzšžżgķ»~ĆŚėÆ¾ šA€+ČzY96Åמź× !Üm¾·Óųftmģüķ•׎yómš`tp³cʍ!†ėė“UU©¦zHb°]P̜s i?[°żÄ)¹łĻØ“Š >ū¬³æZžHU”%!d ¢g,{ÅqŪįy*RŁŲqDč<Č[sš7G®KQĆJĻXHå’ĀĄ€ł•×^]—éČ øOC3Ÿ [?…ˆØļĄ$ČF¶= #ąsēŚÖמłļ]øuĘŌ)’züįu~Ǽ K +žŻEæśņӏū66žäø³F± °oˆA††2vä(ÉX0ū})å!G“Ē~ū”Ŗ Ž„ §zdś“é_̟’īē’üā Aląų0ĢĀŹpŻ †£!õ]uŻuĻ}šĘʬק’ ī¼/įSŅ Ė,ŻTk[; Āj›JQšŻsŹt.T9܁{Ųm7·‚gRbÅQOć’…ĖӎDōæD¢%å Ļ1o6ˆf]l·,Ė=ģ6kˆŅ°ļ„KŪ-#²²(wĮo{"\2¬ķ–YRŗHå"ƒ@n”€”Ų½7åØźyްŁyØ(XåkĖ…¹ŻęĆÅōą’äÉ=¼åė`iYGXņ§Qj RTnKˆßuTŪ( c• zFq[[µ!‚)ˆ¹c?,šLÅtŁĶĢ`&·' a“ķÜö”£ŗ”É“æ ¢{¼šSņ!ŚMŖ-¼ éæ`awėU“ū!L$wĘR ĖŲ”ųķÕW.[µBŚļŌé-·źJG’ )@†„ŅƆ ń€o–.łžN3Žx÷M@IH0”V Ųdʰ€ØNdŒ>š¤£?_±°Öˆ^Ąń{īżņ]÷õś„źt]j)2~W:īˆŌæār˰ ¼¶VīŸÅX <ĆÄy‰AäčSģP5G3°ø“y£…kZ[;X;Śd20”NgɑĀuŲ‘>Œ&2t” Oņóo¾|É%3Ŗa@sŖwż¾ļ’Š£~8磯W-Yīw¬Š];Œ<¢®×½½ÓWž¼Ė­[ó»ė®cŪ>āRÉ-µųĢ(7Ć&7,Å/ą<ńöP±™—žĖŚZg tĘ ¦ŖšFˆžUõB)AÄ Ć`)X Ÿ I’J™`ż,œ¾ˆ­ÜE©EøŅ©pJŅq˜µV*x„petg&-AĄķ9’޹°į*™LÜiB"‘’Ų JŒf£9ŌAVŹDĪi6Bäb K@ˆNV"bĻ7žƙöŽØāą:.¶nb Ų1™Š¼c¾”„ŒŅ~ÖSžo”†Ņ¤|æ­}ɼ/u:-“Že„i{Ś×ށ4˜óÖ»"QMņ™GƒV€ &ŲN]Ts˜µ šŃƒņŖ­Mˆ³O;żŽŪžž‚<ņŠĆÖ-_łĒ«ÆĒĘĪxTm}8݌Å’¹Āu] hA†)÷’+/]×¾ałŹå?>åĒ{o×-šūžõņ«/ųń©+tū‚öµÓwŲ¦@ŗ¦-ļ, Ž‘™t•į§ļśĒ“½{DZ‡ŌÕO™>­vŠ€™G±Ćū²féß_xźyŸ<üčCń=ĮnMA²”!„Č‹Īƒ^ŪP‚ŖpWa›fŪS@kˆ÷ÄŅc!Čq%‰P.’¼¤š V”¬ö;6¬ūĖŻ÷xJé/ęĪc!nPS²yŒ=—e¢¦Wļ{}tܖSÖ­\7¼WŸ{oż+”¶EO2 e2~×Å×]„€éÓ§Cćue›j&Lœä·wI@Ÿ}20Ч”ŗ¹wóūŸĻU0D:Jŗ˜&R€bd:Ówžćļméö¦½3š·1–3ŽÕ7żA;€ŌvYlĮ†!%I @ł¾ėŹŲ8XŪq&­ŁJ!²‚ńs‹4æ8ØdmR„Y4uIkÉ_žź"H³ŽrāV„ €ĶݳŹ3",>!ĻS`PĘ_žÅü'NŁĄūķ}öĻĻübń|#ØĆļź]×ē«/@!ŻŁVW•\·vÕ»ļš0¾2iCP¼`ĪÜ'yŗm}ė׋—ö>¼¦©iÜäiVĻI@:ŗÓ{ōŃĒ7“µ××5™:……€ Ŗ¦ÄlĄ†(Ŗ'J†0Š ,čG>ń䟬X³:éøūõoYŗ²‰’v–nŲŠ­ģÖŒ‰X±ÓSzÖv‡QQįę/DP5†£łO”ó®/ŁįT®lN” iŁP*V= Äų;ĒgNŽ…w^RaæX4ė|_[ [Łw>C»d#X`c¹¹ŖĆ›'ÉŌĆśĀ·y’øōiއę7•ŽóĖąR„q»M<¶653-Ę{*¼øPq:.%U™FßĆd¦Š½ę’:[Ģx Ńq%/ė'’ntĢł.J)GČre…H~ĘŹKD­5q ø’RŅńõ`?%!Üh¢Š£1™+*etOƒ•R®ėę®3VŒ/tr„@ɳHX.Ü2L©åĄł\=^„©ieĒéųĻ}ß·V7弦 ‚Hūʘk‰O)žyäWlõt(L%ĆvŽ}÷ßm•?įȃ=¤¶”>ĆF ’šŌŒ±“–Ī_°”½u͚5pl坙Y“!""e¤” K—ĻūņKĘOœšņ;o^ō³³oąīžM½Ž9źČ?ßw— <óĢ3zh|ĻŖ<Ō(n¹$Ŗź•[ Å~nįü)!Z uĪYdCU ‹c=’Üó£‘Ķąč掉WUUAcżÆ>õl]]ݳĻ>³nŻŗ×ß~5E©©=„~š”,g;ˆAXėe.ä‰Ēżü§?>|8ÕŌh£Ųq5H2`X Av¬AšŅ­¬`ü‡=źÅžēˆt› 1³HR<r1‚]Ć@0ˆœt{{UuĶŠ”Ćē͟ūĄćpĀŗåAkvĀ÷5ĘøĀ :f„±n+Ū…ÅEt#‹!›yD؊A:įÕ )٘"³ņ'®¢6v !¬F“(§ ×¾1Fˆž…VA‡°Uķ "9™7¶¾ļK)£śB\ƒˆ‰„”Ņr ‚A–.²]ņå’¾8sŻēĢ™3}‡ķ9¬„ŁN¹ÜsAĪ=·Ę•Wµ¹å”ŌöåW3fĢż§œš“ņ.<ūēūΚĮaŻŽ‰! k\‘§›e HgĘ 9mŹŌļŗ’_÷żėŁĒž>lցmk××õJœ×§'…”®D¹.>ŹÉž•“ZĢ+ļŽC$„€6K—.čņG “`ÉšŖŖß]~EÆĘ^52‘5Žč‘#¢Ś@IՂ×·łļøxĪæå¶Å‹Æģhķš3IH)eõ×ėwj“jćzå8ߘŒņ4vŲāļµ”ę•t£#/²#{²ƒŚtåŸ,¶;TŚć :c‚†öĄPP¢ė”s`õKt-¤Hi‹ü9žżóc@SŸ -­ŌŌ°²ŻĢd"0+;äüó’üčcūōéóäc}Ź).| Į’ķ¶Ū„ʐ>ż?x’ż[/>V.^:uü¤ó¾Üa×]ŲrÄ{³ß ­õŽ8 Z¹RĀJ—ŁĮśŠ AŠƒ-GŽß°n©mčh:dč ¼„”‘3–cųxaYuĆL€tXīh‹±©3ł¾/ą’9ZH+G9ӊ ‚F°‹·ĄēŪćĀJÄp Ć-ķm–YuČĀ„źóŚ‘ć&`Ļē®ģŅĻßó·æO˜8ž™gž7aģĶ·ŽhĄ‰T’ČmI{]ą6Æó¼ ~ńŪ«ÆŁŠŗū÷¾7 wļ§’óĢ»}MGē”?8R:)"ĄčQć¾ų|žŌ©[œų³³ź† Õa{:Œ!Gj­ļ¹ēŸĖ—ÆX×¾ń¦[o5–«c˜HŲäĪžŒ:ęŻ#­Ö›06Ž8ūŅ_ šż^X]×ÖŽöĆ=ö¹śź«’ńÆū_ķķ½šüs?9žĒ?ņĄņöµµÕ©Žµ5­ķ¤!€żŲēŠCuū4ī8sę;Ææ²żöŪ£¦!šŸ6c— Ļód"Į9_P²Pɲ ń’ów6{«šˆ,¶k CĖ#<²zż†õėׯ[³nĪGĻ:`ßŌ74ļµ×^Użšą;I ōc9ؒ iDUUź‹ysgĻū¼¢}Ķ‚ AA”Åncå—bN`‘993֟<Ē2ģ™e(’É,ģ&b¶Y|–@¦³3U]ŻŁÖYWWėĄõ:½Ö޶ĪĪö½v’~ēĘõDtśŁg\pÕåZęVĀ A hVP®t…CŒ@H ’ģ“õ»²¢&É`G„RU²YŸˆB¬vOø0 ¤&–Vø Ā 6¬ÜxĮłg·µµxčAJ¢Kł‚ °–ŽE5ßxõµWżīźiÓ¦=ūäJG[Ö ÕfAš„'Œ`Ņ0ęĘkÆ½äź«:::–l\k>axćķ×·ßy—Ą0Łz†J»‚‰Č'EDß¼?礓NzwĪRˆ.2kW.ń::õõŅAÄĒÖˆ\5ķµõ5ö}5ē³/ŽūšĖ>^“lńžüēŽMo½õ֘)źĒ 5d(_1·šćo`cŘ„Ʋę iJOķ)Ļ‚k,$ ±ūž{æūÖŪĆĘōŸżŃūKtfc‘hkYķT„<ß{ų7ūćó/æt«m§C™Ŗtģ¬źhļt2™LĀč +W_ݵ ¾˜×ŚŚņŽ»ļ jn4Ę,ki«KÖ u…TĘĻ Ęä)ćæžzyMŸ Ö.Ō)'šē[žÖńƒ-ŚŽā"—qžg Ä#Ā”3D‚ó¹śˆ ¼E”(£™™„#Ȧ"ų|c µv]ɬw##ŖHŚyžU~¶³ćŽž‘²:~zž/@ÖŠÖf+F! 0Čį߬YńŠco³Ķ6Š‚š<pfõ؃5ŁŅŚ:hšąż÷;€}s×ßų‡Żŗa#‡ļxą±’¾ŸŸ|Ü?ļ’GssŻÅW_ †4ĘņŒ ­K’u_ßvŃU©L¶Ŗ!•Jõź×’žūīmØo6`š?IR`µ›‚óĀ@@äĘ* ‚=ƾRs"é²)hµäņUĀq¢Ńސ²>“A“Ą†„“ÓĆŗ¼°uȇ‡cĢ‚ńīkÆĶæ`ŊwßxĖ{ģń·GrșŠošŠUKÆX¢„ģŠjpc}Æŗŗ /¼p‡Żvm0É`jķZųégmmjĄ€Q·ßqoæŃc‘l$1ą«ŽŽ¶źdŹIŠætŪ½¾#[a¤šĮ$å6Ó¶^öõ’öŽŽCö? 0c³¶bVÓ&Ą”»„!ÖBXA,iÓZOź7ؗ[óāĖÆ 8x÷™{\’ū›žÉń™lf|ÆŽ CaŃÓjuJ÷¶~A:¦ŖfbŽłŻ9ŌbʳB [Žb6ę6L§3©TŹWŹM:”éĄ Æ 1ū[§Tōʹ g¢Ö[ƒś— Ųʘ§œDś=M× łb%n-6V”ł€‰Ć-Å&da‚`ižŻhSŪļćōŠb”+²Ņ¬Ąv¬LŒ Ö¢(j-ū‡Ō=¬]q,ēÖY\Ś(ų¬rĘK\܎VG<ĻuJ> ūŅHŠ Pjå)Žą’vtĮ5Äk-† ‘ķ¶£ā±ĪĒ>`Œ l3ņķŌāI2å'cÖ'1æāRpAk–Ņ:‹ęįĘßEU ģČC!de1ķÜČĻ­f[‚5A‘ć‚y+9ī–O°»i.¢ņ¬˜|Ķn•ćŶb.GÉTba€Y b ¬{Œ1éöŽšŖšŸœ~¦P2Ńæ¶×°Ńą€‰Œ‹ˆˆ“ю”™Õvłž®Æ¾śźÜÆęĻ{wöųŪfŽ ų_Š%岯¾r‘œzź©€Üjā”[Ƽaā˜q?ńo#Éh}ķ ×_󧛬`)G,hÓU£K¶¦—«2,®Ą§] ‘p‰ĮJ‘+RĘ2ģ‚Ä i³ ØŖ&õõ's‡ōé’Ź+ƽöāĖ3wŪõ‘L%ݚDźūž9 U©“N"±ģÓ¹ē{¢2zŊåĖ–/É ė_Ļ>¾²½„ŠŚ•É&’"-Öųå®8p`6ézp¦Ķü>(_MV9@"‘(łp z= øßŬ!* ķJDF')4ž»’įテˆ¾\°`ļ½÷^ōчė–,™’öŪć8`Ī«ļ¬_¼ü؟VÕT 8 ! Ļp«P¬„‚~8gXCŸ#†Lš4)–č’BkĄžłZāžń'˜c‘ŪT©å…œ³ŌŚŁŃQS[«™•2Éź¤Œ0¼łĘēļ~šīŪo Õµƒļ’ÓķĶɚŸs–[[f8i ×»ĘZ(A+_jZƕn2 ß~®€a .%-Ē0Lč8-@Ź€Óśū__ńŅĻL1ōµW^n&ŁŖµčŹ&R² ןpćšćņŚkÆĶ:ęW^µĻ¾O½ōÅPzбbżĖ/æ¼åŌ)ĆĒ1"¬œ’Օ^²ŻÖÓŽ’ą=W#‘…wśįĒ|ŗj Ćd`-­a›’•c“BuņŃĒ®ų滹W““Qź³łó¦mæm°ÅDÖ Š !µ®©JZ¤śG’sōŃG'j«Wn\óÆĒƒ+^ųųķĖ~w©IŠŸLœ „ˆWZmD£ū„Y"[“qD¤£n1@öZŪžxģß­­­Ē{–Ņ€“Ń®Ś×R ”ĄDŌąq3ŠźuNš:éŚ³Ī;źĒĒc< ™“ jļjūšćöŲ{ĻĘŗ†c:ü©§žõ‰/»ģ²›’ō§Å‹(* »3äm*THp~Īư„[„q_!ąŗN¤-a ¶iĀī{q©ŪpŃ÷<_Śž{!µŁøq#{+Ö¶¶¶īäas>’lT]?Ēq¾j[óÕ#÷J ®Ź]§6lDęķłŸõļŪ밃¼žśėSµµaų• :TūŖ¶w^y·£cķäɓ[;ŗś9#H C†ŗēŖ[o¾łęm»ą|Źq9n“ŽŌFæ±hĪg«šÖģ·w°ÆBxšGZŠU1˜‘²^6‘HPˆÄć"‰a^|’ķ¦LķŪ·÷ŹåĖöŁkO]^ö•×^ Śs(Ąš­ģ„͇ķju(—8Z)Y¦ŗ‡ćĶņƒ¢ŠR2™$’%ņždßĘt§»w P‘е-ęnzĪQŅaØĀ§ŪHRk-…“%d`>Mģå ‡Ī”–ˆO^`ˆ[2ó,@w"†p%T£;ņl!X’­QÜ  i9Uź<Ųæn ›¤Ā{ *¢ƒękBę¤ńJj o¶b𒽬t9Õ²øBoI„;­u6›+*+OHü²™¾‰~IžĆ]]ūM¤ŌWk41ÕS„r—j{pbŹ~ßVōŪĖdŅ¶”Ny¾—ÉF7[ SØJźøĘ¦‰Tšó$ŻT\«ÓIī}BŹœŗ]±LwLx¶@̶šuįūēÄ`#mŪņņtö~­ö`$N[B/¦«\jFic}KmX…Ā¼ŽŚ–ø€+OŲ’PNŸYŹØ*·Ž s–y}ׁSvœŚ8Ø8ēōŸX=L+3̚YS“70ŗ¦a ¹gś{=_šŃĘOęģž¬ "!H'ĻŲcŁsÆC®¾ąBöt±§kĶJķķ³ā—ž~֕5pĪ:ń»{œ}āI) ŃI°ÆĖ‹ys)ė{ł 9|†9ķ³Ē—}ī;Ķ쟪©~:7÷žŃl²ó¤ĖūķĻ~1©®īˆķ¦ż÷o±āźÅ_×u@-P ōJ`t"5­×€$P ©oŖšD²Öņf%@ØĖDˆ©cFuāńĒ~hvĆŗŽ–õ¬²¼nĆU'žvČčqßļÕ×¾øO¢ŠķÖ_.ųņ}æ««+I{ÅÕe Å®už®=&¼ŒŸ“Uׇ<‰‚3(\#J‡;æfVź›_Moź? 2A: Ozż:öó£)ÖĢZm8˜ŗv<ļŗīw#jk&÷ļ·źÓĻż¬—īģbß{ż…g›€)ƒūŸr聜ɶģ)ęĆ>ØāI;?|Õ­]}ė(4üž¼_­_øHµµsØŽ.ÕHoŸuĘų]źĪŪž&! )éöĶŚnGc”Ö~°Wū~“į[߄ņrźy§p¤Ś] Ń]|L³.§ńŽSõݼæņüŽ -  ø$¾xū½ ½Œ¬kźÖ AbR€ƒ‰Mżö›¶ż;O=Ć­mģ{m«V²Ÿ}šž»Ųųl|þaöµŹ¦gxž[Ÿ¼žČóWŸzĮ#æżÓŸĪ¾hŽėļ:9ßųŁ‚æ\rå~Ó¶ŸŲŌ/ŠE7̆³Z)fe4k^4ū£)ż‡ö3$Q{ĮI§qĘg @Fłv<ģYÆŁųYC©óPįŪ†ƒ\ Lź=š=¾ų•wzįHĄģŠE ĄĮFąÜ±«“öU6)tȏšssUē<"ö(`cSZø‡šŅßy<ź!ĒÖfōß2 Ņœ2¾ÅÅÅf»É›ÕļØŅ+£Ģó¼Ča”dØVĪ9å;ä2ńpågŗIJćŻéĢŖ£WP&ßä¹WA9%RsŪ@hµr[]O°ā’kz3®§$‹˜#SX~žö‰Hå„hJ…ˆ”člÆi ³–m`A`ŪŚVzZĮ›xCæ­ņÄŠžo;b®›ˆĢe`ńT\ čgYßK„RZ[Z›J§”–±–’•5Ķć6åqrĄŒ“ Ø*cŒ‘RwŒ”ī*āBUŪx“3 ŊvtYGt “7„’˜Ą–3Ÿ'Әs܋_PĮoM@Ø6ĘH’ĮJģyš¬ųAé Æ¼ 9UŲ)UJ9 ŽŸ½¾Y°pąĄ«»Zo¼é¦ €.@ĶFA¾Y9~ tWFų7?šO ·566ß|żu3fĢøxń۳ߛ2zBCMmĪ…•ȱ¬æåęóŹu³WØŗEķ=Ę0A‘ć:ó¬!0žóÄSüĆļ_ć†÷P]•čŪŌkżŖE͵‰u]™?Žq«}JŅ/õIm")R¢#“Q€0?łÉ)¤Ķ9gœŁŲؘlč][WJŻś Æ×ˆĮ‰Ö®*$ośĆ_~{Ķ5ģ N EšˆdHŒ±–§¹īżĄ©˜#åžb›ńŹUp»• v`˜¤$"µŗżĄ|õ½—õķwäŽŪœ~śé¦l¹ÕvÓ}Āēs?š8vü„ac_ū|öę~Grš?;ļźæßJ5‰øų§"Tʘžx“^Sㆵ|Ūģ¹)}+(V’Ļƒlļ!XXlŻ…Öµ"ŖDĄ®łŻ{oæsŪķ77ö®Oö®4`ź;ĶÜo·=ƾčŅ‘ĆG¬\± m|)’7ŅĘ÷…ė‚ŁM¦2;~:7A f&müŽt"‘8q„3°·JJæƒGSS[ķg•ė:$‚ %]Ś@™eK–ü訣'64.ų|NĀ‘~¶E@8@mޱ”Åw}ö†«®LueœĪv ģ×oˉ,¹-ņŪĢȤӂHy™®+«‡÷=’ģsęĪłģė…‹vßu—»īŗ+į$46/_æĮui×=æGøv¬*)@€‡‹–ŗė^[łźźÆHā”ó~śöÜO`@„e Ć@ūJ:bĶ5Ȥ3©Ŗfn·ųźs/TZI!·7é¦[o³³bŃ¢EŌÖ×!l÷Žü‹#'Ų€„vW³±bģ0l1ŲĮ׿ö†öööõK—üęŪi”²ĄŸ~Ÿó§›ov“ĪŲ±c·Ūn;!„pœčBJ’`’Y’yö9AŌ«*9qāDńžŚ[n¹å€÷‡kɐ~Rˆ$8ŽcÅ£C<7˜łl˜‹€ õGlcX8”Y,妄] ‹ŖšD{É–ó;ķ¼aćjI²tų§ź ƒ•™`"²j1åÜ^D£ ŌG/.Ę©Jīl€ėx]Ę ¢=w˜!„µU-~gSUmCCĆE|é—;½ź‰Č€  Ŗ~ż5pČQĒX’²6šČq"%ęņéÜ/?iYænĄ˜~w=ņļ×ß~Żo®·ż64I€’ µ[L"’ņĶ7ß“M+V Į%I&š±õ–_®ZŹūŁ·Ÿ{iI[=ōā)„u;w˜ŒÖģH$j†–Ä#ĢȉĢżbŸxĢA‡ķ7d͚5iRĘHɀäčä MŽƒą•8lßȵ^QŠūĶqpå˜<Ē”9Äų[¶}v« Óœ¹ĢÕʙ›Ü(r“d«*ŒO0]ĆfCcŒtEćvʧa”āćōŅr8jeŻéų›¤õS.8,§}Ūķ¬Ų¤Gš?';øĘł43§Ói­uWW×ęÕžwęƕ߹[²øęsq &‡˜|ēĢ’Še>.jLĶ!i¾–­Ćb’ļė¶¶ū‚ööĪøńZ^’Ū|éœébtŁÆšÉ“t:RĻó Œs·O k‡`ø.¬żhSX†×9¼½ąs¶PāRptō}į* ;ėŅUŅNk±ń Ģ0sP«./U ūzĒ©[Õ;®@§Óœ_ŗ‹|Œ-UšŚ³Æµžō­÷ö˜ŗŻ¬ Ūül֑'ģq0gšIĪ7Ķ0g˜/žł/ə:|{~b`hE5Μćn)c^Ķ…’ņA ļ×:øjƆU&ˆ?~ļżĘźŚ$¹)Č#fīžŲ_ļüfĮ|V¾ÅHw¼u?§ŗÄJ?Tœi÷|ųĖ.[²b»ńSŽŚm֍ē_vĻ•7Ž|ęÆ/:ģōėOæäŽĖoŁiŠŌ‡O÷;sf߆9ćeƒ ŃģåvBß÷Yqך GĪ:°S•śŽ !ożķīŃĄ0×y柒\;o>gµ'cūöģ8ż€SöŽū×G3 ˜Üo {9¤=#ÓüĄļļxīļļ2nŹŅŁsf?öōȋN<¹?ÄźE_±ņXyēŸrŹ”>żūÓFŽä¬Ļš•ē )fĶgœq€© żGRu½›`_±ö÷ß}f=0¤”aŚØ±žmĀ!Bzꇇī„„ŸõŒŅ¬õœ>°ńÓ£÷ŽĒ!~!B~:l.šÓ™8\÷¾žąõ7 «~NbĖŗŽ#)5¹¾ļNCƼ’ꛬ½ė/kŸµ§|Nū>żĀ˜Śęļ3µ_6³ÅĻΚؿ÷Ų~½9ėYų €ŚĆ]Ī.:•;a}­}ÅŚćŠœZ)Öz‡é[& @ pīONa“1ĢžÆJ•fVœ5žoy6eų>9¼=~¾”ņCĪjņĪ‹8+§ēcÅĮ 5ģgUĪŁ (­+W¼ŪnƒkėiCƚó©%żŲĆØ€Ē”›Y¾łŹßöNøuĄ.Ó§±ŅģićłkÖ¬’Øžvó9 nÖśøĆ‡ź-M½ą\vĘĻļżćMÜŅŹ:øņj¶nÖ^G×KO=¹ąƒ÷×.üź;’–RĄs?ŹŁĢ¼7ߎšł—÷\õ»ßœxĘE?:9_*:jChN[‚ VŹ`¼x‡ Ƽ(" ”ūs%ÆWĻ÷ŪŚ»’ꤨ”¶0äņ“Oēm7^~¹=/“É܈Lě/,kX1§½ōĘõß,\šÅ³~ō!·lÜuŅDŪ }Ēõ7³ĒĮźf½qķšßżägÓū zä¶;ģ¤X«ˆö„™}ĶŹdYgYŸ}ÖéB —©~Ąˆŗ†]¶œŅ±f-{ž2¾ —zŽ̬tnķ0ó Ļ?›„$°ē1“Du_Čå_.Ta ;y»)¦ģ™øzÄŒ’+t =PńŚ l Ąż¬ŠĒĢ4ƞƀÅv¾Ż¦ Ō­Ų9øÖ‡l³IŃNy«önŽ"JŒ1ó|ó>·ģ ńX ˆ0–öXnĖŁłF_å>·$w Ūńéįčm‚Aqlūķś½į\tĪĻŲč\JŒCĢŌ>W> ¬”K…-² ×:7É3™ 3m³8ŸżN?½īšKĻųžæ éUuéy§°ūöæžåiÆ<’ą{o?³aķ|icķ¶L6Ėnԟ¼ónØsÜZé°Ņģy•Ø|M.ĻjeQ' R qÆNŁļ³<žżüUŠ“4³ŽnšˆŻĘO>fŸżXł6:oā%ŠpŽüV¼–;5§;3¬Źdu:ĖŹĢÜa§$Č\Š•^ĞoŲ3ģ1k“ÉL=¾ 4yĀD6p›b1s&Ėž·ūG~:kŸż›æ?“’` §xĄ—]łóY‡oßtĒ_|ā1³>{Ģ¾ßŚ2¦¶qĒc&ōéĒžoSĮ óĢšē’yu$Õī5v«įÉŗzŠS=ŹZqĘ?逃“pŌĮ‡ŲLBŅ\ĆmL³Õ *`ŃÜĻŲĻrK×Ų†>VßŲg„Ƕ5„9ć’÷‘§.’Ņé5­¬r;¢ĻĘŲķĒWæńÖą¦†PōvÅC¾u “^]ū«Oć“Ķ„ ¼V.+„¾Y²4ģŲwąŌŚFÖ’š¶ŸŅ·¹ĪĻrƒ³gt¼Lc·1?)ܓ•į°Ehb]ƔęŽõ.A™lT`kÉ6¤µ="O†Æ“Ķ>… 2¦TvŖKtå”ü•óś(IfƋēQT½š¹åä–ÆörÅt› Fļ¦Xłl4Ļ~ź„GM®’@ėś5ACęöõ­)ČAnŖ9æż{Ś6Ōčl׌u+­r=ÄS÷>īXĻŗ‹u†6Š»Ś=VܾŗķĶ'žżā·Žzöé9o¾Ę]ķ“ øųG?^ńöOžåo’øįF櫝Uö„}:pū] ŠæIQp|ØBŚy‰!2%jĶńįUžÖšu^1=—$÷¤Ó-/iļøåŠßösR–®Ÿ÷nž|ī'+W-ćĪε Ś@'/ŽÖ† Ū‚mD_W™ģŖU+:;Ū7¶®Óģ±ļzäI śļCs:óą¶-[ĮaĢ#—Śaņ³o>žäŽCĘķŌ4hĖŗŽ€I²öźcO]ōģ뷜÷ė®uėYk£}­Č!<¤Œ¶uSff½÷÷v­ĘT7œ8}—-QŻōó“Nb£µöó‡6Ų'ĆäÜÄWbéŲĘę6JIr9’|Q”e’åŗz†H•‹%J’™7;%Ī-ÉXL»Łäį?y†æe*^²]+ʽm2}b|X*_mOžTqœ“‡Ä*,ń»ž_$e%ŽŁ|Ū±ķ&%ĪOõƒ”8JĄr“.‘—Šņ;ęīŠ4o3ŸØk‹ĮawMЃgŹwĖčX¶¬óŽäā*ZÉjMT.7dnW¾‡;T|raYøĘÓæ‚ķĘ3]Łdµ§O0,Ęyµ),³U®QÅ;Įr ¹*Ŗ@ė<”ž»é.Č_*Łl6ÆVbƒž ų²jڰQ Z ø’Ö۟¾÷°“fב6Śg£6nX·ec’²¦æ[U č¶.£t†M–Ć.b?˜K ˆZG¤€?\śĪm·œ÷ė›ńĖKN8~õ']wŁ„) œ>"a2™(W+‹KĄß!§£dJ¬U”±Ś[ņ˜3^ŗ…uė6™Žµ×.5^«Ź¶°Īhå±Qūū¬-ŽŖū×Ö[Īķ¦MŁųĶņyļ¾Ļm9Š…RvĘE+ezWÕõJ&뀫Ͽ€=Ÿ=oÅüE/=ņō»ģłą]w?zļ}ó>śŲtvŁÄ8øĶųfĆ{7uwņ˜}ęæ\sm#ØĘuYė’łĄwŁsÖØqxĢī3ŁĖö•É>õäæ—|½ ½mļĮė’tŠ“ožõUŁõ­AØķE‚a„WĢłbzæĮ{Mœņõ±ļéHˆ‡_…zÉJjŒÆQžv”öU CČõ ‰ęŁo¾,2³Ė6Ū²Ńģ{AGnW×ÜW^źÖœ’£}r#‚}?ąŽ;蚁pƒĪ>ąąžęņ×’~w`ķqW×»O½pōv»6e×Y“fÜrĮÕ¬LT¾1†ŁćŸĢćŃg’tķ8ģØ7^rY=0 ‘Ŗī½ķ6ö¼½ĒLŚcäųSfd”6•Ér§wŌūŽķß§8’Ø#yÕŹÉ½z÷m=d8g$3(ife^ūĻ õ fŠĢQ“öżōÓ·’ż‘›n­& ĘŁĢ‚O>®…8įš¬Y²œżµŅ\i5vņZĄ°8ņ øŗtĻp„–Ūi*Kŗ”Ą¾˜ óżwß] ŌżœŌ™šæYÅĘg•µWlĆŪļÖJė¬g›‡}eŅ/8m8D³ļqFļ3} ø„Żž7ö4kĶž7¶WæF\uååZūQOonˆ|öŒVĢl4«€Ķ“ń½OŽŲjū­ ķLÆķsŲŪLr'U÷ź#œÉƆ=xĒķ«×|ńį'éöŽpÅčJ³§¤Ū—Ēļ“ėr{B°Ķ¢óOs;“•ē—q»Ćż žC•óB,›vVb•©&WØ2'™jDāˆ-Uc Ž’Ó\#.²“M{¹¾kÓ] =_„„ŪĮ±ßåƳŪFāM„b™\iÆ"§ģ;ŽK_­éžŃöķY“ńÜVhĶŁl6g£Ćyfl%?‘ē ¶ŁŹĻ=4VžßjP Į€‡2ÅŚ|õåü·_{=šŃ lSfŌDd ēµįō,i‘[›\{0—SlŽ‘ņ0D•Ę{Čõ/žŹµ"䶟C{†R†H„¾J9µś°!”wĻ·h³;N·—aĒSH²śųZ™čĶ­Xh¤l܍ā4Ł0ä¤Ćߒč¾"r4-Żr{6vłŁŃĖ5––ƒŸ‘ ×>Ąœ³d‘ļ&:‚žņ»›o¹ęß|šŅĘJ Åo=öģG“ż 1k[Ö·čĪõ~ŗ’ˆaT›")’ 7ģöTŽšCń)?:^¦dÖ³ŸłÉĒ÷łg;ļ>³ļųŃĒžzŖGš ˜õæzŲ6|JqCčüžwfpĻ[5*<ߢŁlJiė± /„£ąˆT‹*#R D¢¦”±÷rŖd¢fķŗõė—­’fīR¬K»i 0ÆźjkJ$Ŗƒ¾ægcuŻøi“Q—`aX ”¤“S’ Œ‚ŃUe²ŁšTĶŻ7’õś_\|éé?ŻwĘ.—_x~c]ņĖ9ŸßqŪķ£GŒ$aū+M®(6"®üYĘĖcž{Ń÷.Œ£¼ß]~én3¶æłŖ+±qĆnŗqeŪśŗŖ†‘CGæöźŪžżŸH;’»ļ¾—ć$u6Ū¹jķµæ½²s}KĖĀ%7wĀ!ć 6‚ }G [Ҳö­¹Ÿüī7Ų…I ÜŌöūu’ {ūK ƒGż’&ōµ Ź0 ‹HĆ ģ ·QN2©=l¾æŪL@0čģóśź{oXz!ū J³ä![ŽkÆ2g_s±vŒAļ™1Jņ—½’į3=tō’ŃGžńĪæ'šėĒŽnQ-¤N¹Ūīūż£:b͚%µ5ōÉ'o]ā°žd€1 |ę©§/øąüĻ?#H„ßxķõQƒG€łšĖ®8ꤓ å2ÕłŽā/æ\śµ·”•XJ'ńĪSĻ„7nĢ®o½č§ē\{ĻßT}+®–Õ™“‚F+!kOØļÓH *KØnØė@vŅŌ­é(rX( Y[Żč¦Ŗ ŖSUń ųż=éėµceżĀ•Ė•ƒW^}uėvŠR(W@ ć3°óö;Zżc aĀV1Ćįśż’śGCļ¦.(lX·ęĆ·Ž~’?ϾņŽ{†}š‰o3s&Kti† ö•ātf‹1ćŽ8ųŠK–Õ×ÕŻÅz0‘źź:ņ C»Ö· lnœ’żWę„^©ēŽ~…µµ®Ņ8¶Oœ%Œd–0  ±†1–,«M$~Ķ5Ü÷/0>Yŗ¬÷ČįŪļ“3@Ža'ŌŌŠl8ļfĄ°9Ö÷K MlˆŁ!EPZ›Q]«××$Ä1'ė޽ҁµ…ö0\Ō\ą(žÄ\”Ā]«ÜÉbO. w 8j D§ƒ¦b­ )š BdY†ėH#ČŗōēæüžÖ3ź(Ń«®ĆŽfĶ‚ Čhߏ\@°“ 0¾|’ćī¾ēŁžæėĮ{†zĘ9? b. &|łł\‡Ķč~?xłe‡•”åĄ¾ŻÄm§½ņž;§üü–Ņe„ €’ūś9ǟ¼|ĮWƒū6×66Ō÷ėH¤%źRõ*«ś4÷éÓŲšõ’%¼tMs–20÷=üąć=xēZE† ‚[Ž)wPq?0¾ļĒćŠc;źĖ H!ƒ^n­u ĄBy"’ѦZ >Sš¹Ź×¼ųāĖ€ŸwńÅNļŽĢ`Č*dXh IöŸŌi ćS¦Ė‡–¾ē„’.k„•ĻR0Aư#įņ#Ļ=ķ $>{ē½Gn¾«[Śuļ…ėWwcF¹š—³p4 Įd·\JĄsą>Ļ~śæ’ųķ×œž‹wī{ü„£Ō¾~c]"™­ļhūč³O܄œ0|ÄÖżG4lō~qņ)ŪMš¼Õ“©÷ß{ˆ` ŁA·ą¹0ģŅc/=·Žgß,Ģŗ,¤” Ą:Ü󭇨&d­Ń<Ćc+5ŻōŹŚŻ>lF-lI­)Ū(kŒ $iņų[Ž„<ĒMżŽ1%³+Ä5›‘k”“RokEvē°Ÿ•=ćbŃŃfeuJ>G‡ˆ悁Ŗpż\ä’Ė”³qAŲ“³ŸŠÓ·r™fYM“¢qŽ$ĒœĶ›<ŻĶ­üܶ˜®L@ē’Wu¤Kgł%P\S  A£‘™mwĒć=ā.œ”L¾łģĖ9ż^“«Ćmź-Ē„+“2"lŗk]ācM9z’)!*ØMĻėm…ÄāwŽ1®֍Ł4Šr€V™5ųØ ™ĆĀ*u¼8Ē’Ō„8ÕĖ–<:[+ Æč—č"„!x\¾Ö­ķ)`dß¾ÖBę°-w˜5nŪėN¹`ńĖžł×W^yÖ/¶ģ7dd²~¬ØŃoÄØŚę: S` ”:t®#ČÓ¬ōµ—\Ś Æ­SŪČķé‹N<„Ä蜦!ÕµĖ?ūœ3öÕǟ$rć<ˆ=Ÿ±Ā‡M®ŅʬłWē\0qČŲ&O2|TüYūģ)öCœ9ŌÕ ß#›öā`4?£b§ŽĘrzé9 ?qł‚E_¾üĪ/¾µtĪü5óæ¹ł’ßu,Z{ć××@nÕÜęč±¼|Æ_Ė&£3Ž† k-哞óļn|ā±ĒįŚ /˜2hą „ÜvÄŠŖ$Ø&Ō6żüš£ōņ•óŽy'ŻŽ¢2–öɑkł©šÉx!i³tÓKĮłœUģm1rx=Ąė6,{÷żļ?D&†:É!2±Õˆ‘ģ‡Č©a£8`—>ƒöÓ æéņ«Ų׬{Žž[oWŒ8Ųö]+åżč{{]qņYGīŗ'g4ūŁU‹¾ÓÆw-póUWr6`2ųʘšņé Œ‚ų~’įĒķ“Ū–½śX‰Ņ¬‚›Łvģ„ˆĄJ³ÆŚ×¬Ż~ČČm«wd8r§]3 ēpF­÷³óF×4ō•É›Æż]pīĐ»Ž-[ $žÕÕܙ™ŅwĄ@rśBŌ)ąŲ#3^6GĶ“ŪR–ÓėŚ2ė[ż–Ž“9¢“ӘɜŽÓÅFæūā˃k†76Õ7\{5Ÿ•÷ÅģŁV7{üą”ģ«ņŲ-{÷[Ūpķyēr6³ß6Ū®o<ļ䓣S¬ØˆŻ×T³Ē|č¬YÕ@įžpęįäāĮI”G8©>w3•įDį š$}Sņ)<ÆCž‚ÉtžķŒ˜1hų`r]ć£wÜĪ*cM¹“¹+זå§3WžęŅИHV‡īŗūÓ÷ÜNJµśŽķ£=įų“ nā7ē]²~4›ØgŪR‚Ɔ/ͼ>»dö¼ė/ųĶW’įĶ'žįάײ‘½“E•™ż kV.žčÓ{öŃ«ž°Ļ° ¼|}„Šūo½čåޓ̣żCåx^Ź(G /PŃy:#”óAšóIM"ņĄ± ńLģ3]éų¾½Ó.;ƒŠĪŌ~CŽzäIŽŲɝYNū¼”+»Ŗ„£-M+Ż„7®ŚŲ¶acūʖ_ĢŪ°fmü²ß}wvŌĪŸ$“ TS³Ć–[T)Ąr³›\—3YÖ*b:‹ÜŖ<½×.ß?xh°Żš±ż ‡ˆŖApū:ÉŽ$ū%S5@ hr› ,ĶŽJٟxĀqłķ*”>¹ļ³Ö§w|3ŠŌ Ŗę½’!+;fSŠO·ØW«€¼>Ž@”×°³™äŪžÓb (åš`+Hxœq)™+¤›˜¹LŠÉāxžŹK:ž”ū”Īמ®0’±ų<ßÖaZv+ærS•Ąæ«Ģ®ąF¢G·KBߕŌ%ƹgO¶d:PN„ÜŁ g§b¹¶’{Ō7Ŗ(%Ž ¦īd”ēóģHĶF*ŅŪøūÆĖ—/Ÿ:uڳĻ>[/S8ū|ŖO 7zĒļm ĒWF!ˆ5@²²;kłāÅ0ć@qQu$@¢#OŠj~U/.Ķ3 ¦rĻ1šŽ I„¤ńā—āō&EŅ©=¹ģP/ēäL”Óīv'' -?&ÉU+#łŹœē$•6N+˜„¾»‘qty§²¦µZkG8Dd“`°CÉDųzķÉ8^xī/ĒŽõMWĖ{Ÿ¼ß±nķü…ó5j؛§ÖĪ_Ū!_rŃE—_®GYĢ0†BćAø0ū|ąEW\¦»:]Bߎ™lV­m·Ūzė~C‡‚pč°u÷ż÷"ėńÉ“u W-J@Dģį0 @ƒ²†µõøq —-Ėj½n…›Õž‡o¼9m‡ķį:$ÜXmNPØ@k4 IöŁ0Hŗ‚ŠF^k Š œĀégŒ!«7nI B4õķĶ¦W,[^/ūōiŖŸµŪn·\qõ»o½9µk7¬]·aŻń‡¹råŹ¦¦^ÉDõ»ó>WJe2“'OŽŲ²n§Qc>zåÕ¦d¢×šį7n¬gźkƒ /½ųĢ3ϬonbA£6K͐2˜pĮŅØ¬Šī•Ö.±„fżĆćŽiLÕĄiVæ’ŸžēķĄĖ×­żÕOĻ„e“eX-eh¾ęÆ7’ę7æ©ö©¶oŅ!cFĀ(ÕŚ¹Ż„©+V¬ųᬠ|“µŻ}÷Ż«WÆ1dče—]Ö¶~ćłēŸæbŊ–Īö}ō‚‹/ž¹ĒŽ[Āŗeś¾ļū~*•RČ>ʶ8¢ˆ¬ų90± aāšŽŅ"Ō§’ćo  7sĢlÓ× ¦Š›H1P[So½vŁÖ•Ćɱbž¢­‡ŽłféB‚¤yVMŲeĘĒč)“nu²¶oæ'œpĀėo½½ē”“'OŽøz-”6’=ßK%Ŗ š×[o«®®žŗŻ4ųŁåĪ]ߎŗ¬mķé?=hśųĶ÷Ž:숯ęĪ2l(„@‡÷Ę3ĻŗŽóįüāŅ‹ąe‘tē¼÷įØś~}Pµ|ńRiˆvˆ2ķédm€S?ŗ# ³hÕņł«–ņĆ£aB(iĆ¢®W“†I@ ­sɜ/vŪm·“źŚk÷½ę¬^²’ūŻ÷Ųc0†Ij6‚ˆż źÕ§ß²Æē;Ь7K7\qE5Ė,ōØÉ‘¤%ŁÖVVvü®¼ņ²_]xaąćM’ĮZóŹåß“­];aĀY“„Ö’|ņß¼ćĢAJ°UzG뚵Wżņāz7…źäŚÆ¾JõŖ€¬~ż…³מń÷DL3ˆˆ ɀ Āźßƒx—]æ÷ĢćÖ$RĆūxōÖŪß’ż.Ö’ąpHb‘S½.mʟŽa­X·&#ą²zź„„!3ĮÄĢ,$!zŹK+p+š†g_p`Z)E±å)µ†Ģ"‚aĄ’°~įRƳcCG‡+SZŹ “¶“„a&T‘1ĄŹyó’óšc~ųa[Gū6#Ē“hŽōķ·æłŽæ8 ĮĆZkø3ßųĒ߯s×)Č[o¾ń’ß]&$iĶRH© +AB$ąH|üę;Ļ=ńČ«Æ¾Ś»ækoø®ĻŠH‘[U“ÉdRŽĖĢ`QėTĶYśumUÕīGrĪÅl;iŹ–żF~“zQucć¤)[2Ėø±9 Č0$ĒĪY!dNs1ā!å=` œv½ćŹR0QNo·PŠ—‚]Ėž7™Læõ „؇¬b¬jõše»:kņŲqGyō“iÓ>ś|ĪN;ķTƒTsss昔²ŚmßøaąĄ#FŹ3ęeLŸ>=ŒrĢ8}įg’ä쵟~fƒ‹ŗšŖžōŃGpehLĀ2Ņі²}嚭¶ŚjÉź•†`Ž]:0i\*Ūܩ褜ģźĢ­·ž©³³sāŲq×_żWż6“É >bĈD” Ę13±€ sĖ_ļxę±Ē:::,“~ńÅĒm9ŅŃJI×)‚ŠņĪ\AB+å8N$né‡ĘŠ1#/zūŠžDņ%—F…?¬ą^QĮ“¶œD”ÕDįk0‹±Ÿäk˜÷Ģ·%Ī­#’0aY ”ӟ/“A)XŻ×El$·^yķÖ췜xIoäųĄ~'©\%źŹ×°ÉŸN%äžćTAt=ÜÄśPĒĪ’©>V\--'Ōė—lĪV¬Ōæžń§n•Fõ`‹s€IŖNŁ{ļ’ÜvŪ}į™'Ē*Ėq{F½ł’‚š‡ķ:ˆ~^l2VˆUVīt5ŻĮÅfÜhsŅy›Ž×ŃmÆø6_Śļ1_ĮĖĻŖ<ĆÜ|B~G±.‹—|(ŃĄćĆq <CĪ]°—ɲföüşĻŃÆoļźŖ`Ī›o²Ń^Wē„!#R€ øŽ Ą†$jo»üVŠĆ'+™£"„¦tĘŹÕŲśī9ēœ%`›·:õĖĻ?cܹ­EŽ2“¢ųröl6Pl”¾,³Š®PCņņ‹/v`Msƒ ü‚óĻeÖŹųV Œ ³Ź²—‘É, óT"±qÆF)£<t™Ā&±Š•ZēĶŅŽŽUóę]uĮIĄ9 ŠK&j€©C‡… 9½×ĄQ¢n8źFÉFk‹Ś›pźaŒė]7ŗ©śŅ3OŽųÕ¼QµMĄ€Ŗ*ö”E«QJyŃ£6e†÷“Ōj“Õõ8ŻułĻqūļ®ūŪ æēLÖkieß:$#µ‚šī½öź-›&6õę.?(źs`qÉ̜ń^ž×Ćż!GU×o3jTŠ̘0nlļĘsŽśĮš¤ÜŖļ“÷ßū®«ūīć·-ś:»~#{¬=Ž0ÖĘĖdsZ#JĒūķķŹiᆺ£Į”WįŽŖ˜µłjŽ—5ĄčŽżvœ8‰3Łh%ĘUd ū«=/Z_žć5Ą(Š–nÕÖ5µÓŖkŽ;ā`Ö„ż@Ŗ{žgs`Õ\ō£S’óĄC¬4gU„aöÆŖÆ‡sŠī{³ĻOÜzē„ś>żX4ū#ėöÉYżŠ­wżē–»Ē8 v&gõā·Žæō”3ė@;o·] •Éņ†¶ļ¾ļ¤Śękua@2¬ĆƒCÆjwzćĄ1NĶHJ5¹IĪzłĒ€fÖ?=ćŒ$ŠæŖ¶Ø5 ·šD 8ļēø3Ķ*ĖģGū†y‹Cꁔ#Ł„ŚŻVŒ*Di˜łÕ×_±ŖZ €»:Łóø½żŻwæē–[8“a„Y+ÖF™K\ųŁŗ#(®+m党Üä}wŻ🺲æ8ė«ō–Žż Všf­:ZÖ'€fį®mTåāĀ{¶ßÕR ,„uĖ’å»›4”Ŗž¹[n’鬃›€Ž©Ō’/æ`„ƒŖź¾Ąoų×]—ś§Ŗj€ēy”•ĪMžčą²>ķ=A‰óxLĮī*h{Śf2™HK?.:XpÅŻSįsÖgŸŁÓo>ńL/é4ƒ)ńŁs/­[“ˆ•Ļžß²rÕĮ{ķ}ę‘?:mŸƒw3y‹ŗ>LŁnjŸĮ?=ņøæ^’‡ˆwŖŽēz­»Ņm ōvSGļą=¹•²“)&ĒÜÉ«ē,¾ä„sĪ<čŲ‡’ō§w{,³f%ū]Śt1ūŹų¾Ż “ęĪ.³±ķ½ēŸ?įąƒŸ¼÷ž`t¢q„¬KĖ}u‡Ŗ˜ßćŗœ/²e]Ė`éłų˜É§}E2]qżŃņ’, ŏVbŠs«|?{Äž³ź:`XUķ 3÷:sÖ!w\~Õ{Ļ?’ģ“²Ö-KVpZåćŃÜ0¹-+Š¤;£ŁóśūŻ{ļ“Ė^;ļ²zńׁhrķš,_±L Tj@×’ź’’ŽūŠłĒüėSĻāĪ gż`é…ˆ—MŪ•µ¤G²IĮłPĄeÓę†+®LÕ zĒŻ·Ż9āX•Ó1¬<ßö6G—źy;F$ƒĀ*d‚Äū‡Ėū Wˆ÷¾«öĪbjå½%ˆ¢M‰Ų/]0ĖEÅŁ¬ļy*.[N®µ$ŗX(FÕĶm‘p¤}Wśü6)UåŒ¬ŪySż~7泖ŌwųnX =łž /ņŲ°łĻų»RÜžWNńj“!xĄyˆ³O}Ÿ•¾łŠ«gmæóČĄXŖ ·č“LÖ&R¶Ų#¤Æ>’Ԛ„_³²Ē° h':ŅCŁLy€błøˆ_j ™“.ż†Å’ė%ōßbģÄ_1žlX}é³&6{)nZJ\NM:Ÿśc{²©s\ŠR‚gtāėĮ*×÷0%Žß ½ &¾V+•%YIąĖ¹Ÿ°ń¾Yžu6ÓÕŚ²įöŪn}ś©'®½ęjA°¤ŹąpŽ£V$^% eˆK-<ł„ć?ęh6:’«„[ī½ūž$hpm]-Šŗr?G“Öyv/öŠ_ü‘‘ŽóŁoČ`[;læżYٹó!•—•. ¹vǬqt$¾×§)ĆB„wö”NoX“ä–K®8v×½ūĀ!’G@Fv™‚’ -F1°÷.Ūmõ÷;nzåæO®[³ˆM›×µ–UzÜŠÕ@0’£9Vµ8’ĪŚ$‚Š¦Æ€ Üého0|D0iŲöeX²+vˆTø5eł éS÷˜0fŅąV1Eō„Ó™§ļüē]æ¹jZs? $„3¬Śķ'0²”j\’¦©cļ¶Ć”sŽi_ū5«Æc•×µÖdŪµJ[]—ˆ~7ҳLõč FJB~VłY•?Ļ­¢•ɉuN‚jķĒO:x·ŻŲHõ~VE¼ÓxéŹ(] Ż÷ӓNiśJōN=xĻó?|ĖƒŲĻs)RuBČą—?>ķ¾?ŽĀ]¾g²WŃ/Q[\yīœUĒī5kxUĆŲ!CŁŲšœ¹“/;õÜcwŚwŖ~uü)¼rżń{Ķź Ŗ!”•ŠM•zž”ļæÓ÷ꀓ’!+­ŒÖ6CĶ2§żÆŽžp»†žSSMc5 @“”¬ƒF› ©VеžĻsĻ€Šź/S¶ĖTĻ>ś˜ßŚÖ¹v•øĖµĢų¼ÕČq5 ĘźŚ T”MĪ)Ü„Ļ8ķtJ:p@XźR†µĻŹc?k<+¶j«&é ­Ėę/䮬§²élלÕ+’@¤$šĢÓO2knĻžęœó¶·E5PGņ‰ūŸ…ÖŁĢG¾/ ³>.r—°l}ł¬I^`ēūk7ģ>fāøT]˜/öŁbj-P/)»~=ū¦[ū’?T¬3:»äėEI`h}Ó$¶4rń³ĆžcT¾Vsσ”|‘§®®ŒR*JƒÓétä¤P"%օę‚yūF\[Ė„WO³ÆgæšR³Lō‚³źŌ»ó>øūßO]ėu§³E]ÆSö™õ«cŽßfą°cöÜĒ˜1c‡õė×Zć*XX…m.&ĢB=sōįGJrāG»Ą«Ś}_ēĪM_ĶżŻó>ņœ}9mÖ!»oµµß¶–U;«ö@f=ņ8Pеń;;¹³K·¶>rēæ9ē“q}MI~D½¶•)Os(:V¶ {ĘśN˜8F…ƒRAgl„ĖiPĒå…L7Üi“>5J³g–Ļū €ćˆ&)NłįXg˜=Ÿ³g”ŸÖ*“ü„%•øfÆ1œNg;;ÓQ–^ ĖdķßāŻ=…’cwį«Ģ†­-étghΤUpÄĶ2¾VQ…”|ČT"9ń<Y;€ż7øo;Č’ĖO›¼"— r-{ ń³:<&¢„¼BÄw•—K/{¢Ń%étŗCĶ‚˜S—Mœr ‡Ö0¦4$VR¢¹\bV|_VuׄĒčw.ݼ©v!ßU‚¶é½„¦B¬^næżEv›“"Bżļ”’‡ļ¬bśŗń”Ųč%ŸQ ©-zBb’Øž€ŌšD²70¹V4eģׯæŲ²`¾uŻ“J¶l<6žā •4ę;›4!J¼É3©t*fŖ¤<ßÖS‹ZŖ“—É–œmq)ģ‚ķÆĒ^›; ŦÅ懺Džœ×Ś”ĖÄĶ֊w‡čŽ+ćłīv…V“†m59h½ CĘ4õź+œŽ$¹«‹ÆUĘB”A”Ѭć«)Ų'Ų*x,QĢĖ(Š1’[iƬMd‰©ĆGœŚ©¶¤~Ś/)ž6lŠY³xōšk³ŸĪq$ ‚ÉdÅs?/ŠŖ˜]ī,h'Ė3ZT‘‰wL9FIˆ{6›6^–•~ėÉ’œ8sÖpŌōv’5ĄCwܱqńāÅ|šĮ /pk·µ½…A‡”Ļģö}aöŁų I×:pśmķyŗ»„JĆ&mt§AÕ£Ē2‰@ ä5’†=Ć1]kŪMb_ś—?>c·A¾? ßŻ·’‰•dzǦ£ó³č›HÖ) AH)ļm1ö¦KõūK/üź“Ł¬ŗXu2g|Õ”MFé“õć ż[*)ä ާÄń§ÖŁŽ•«tŲČØÜśRzĀšQõ ~Éźk.¾˜µoģ§eYgŒßåµoh+\”¾bm¼®4ījkßūĻÜpŻ’¼óŽ‹~śĄW<öĻæØtkWW‡mŁ2†Yé5óÖ?ÜsĻ’>üH€Młš•9ó„“ū€FW5ž°ē¬ū®»iHØmŗ’ŽæŪDZkĶżļqšć·¬ø„cßķf ­®möÜz;öB/£_~ę?õŽ›Ž{åUŽėūĘ[»aē‰[6ƒ…»Ėč1ĶĄ_‡ūChM(ÓN3Ųfčč;{ƒ÷¾—1Ś“©-āŸÖĖę-:pĻ}Ą7ßõxGG`h1„‡Ō67!QC‚U&ł¬²Ę »‚sŖŹč¹ó¾0¬•Ÿµ©sĪ8µŹ!øļÆw°Ņ Ž’Ø b€Ø¶YOz] ūAmČī<ļ>ńģšŖ²łsnžS"šcŽ»ģ+nķÜqЈ¦lsė// MU7Xe s›r^( Ä}=÷ k)äHr€#:(t{ÕYę ›`ŪĔ8R:(gšcÓ6cJłč–»ž°&›M{Ö?YYŲ?ķ³Ļ¬ —“÷“½Łjąš>p†Rb˜HÖĒīæļĢ1ßø’į_|™»ŗŲ×ģköėX Ū^¶ē‡ŽėģµvÕWÕIˆj'•‚lżzUĖā•Üö×­G;óØ£ŽŲé{n1õ¼CŽ8éąYk–g½N¬I/ČĮLNŹD)Å~†3ŗmŻźÅsĒökīV’ä #7,^”i8rß rræĖSš}e ]— j£åRSĀżĮä_UŽkŠœrKöēž×ē¹³?‚\Jsfæ«ŁÓVGA{fÅ®lłM>]Ä ĶQ·°gtčOĄZˆūÄzt5³Ö1:’ öT‘Mw7ŗ–üŲc j“pŹĶĖ`æ«l³'jŪ=’ł& žw‘ĄŹkU.Ģ|‡ļwŲĘOcņ¢`mˆ „Ս€Ą¶£NŠ|źŽ{\uņ)ĒĢÜķ–‹~“Yšõ²·fßvÅÕܑUĢi_Ł‚^(hŃ}U£' ėåŌž6¹»½Ø’šCfŠĪ’ØņW –F?I§Ó6]/NWŗ½wSž«ŪėϹ«¶„čøūK±Mq@„./rü¶»jYIf{‰+,%8‘Ū ĆsĪ“ŃYÅ×Apēļ’Ą‘ŠÖœõsŠN–ś‹†ÉyØ‘VQŁŗūF‡Å72™L<°ž”Ļk-MMIw@U{ߦīy„bĶĘó³-ķS›NŖīuɑ?¾ė⫺µuäZ¹ŸŸ W,‚Ģ’B…,„Ņ ·N}y+Wöy’]w·µšFrÕ60ūŠż §³œaöŲd}ö2ƳN€TG—¦ĶˆśęfČž©öĆēīē““"Äøē[P6ė÷taĪvv%Aõ"Ńæ¶qż’o¢(X˜6öŒźņō†öńĶ}fŒ²ÓØ”¬ŗXū¼¾żŸ7ܼĒvŪV“‡ m Ō') T;Ž °īŅ^;³F]įÄ4Äjs˜R:¦Td™sC±’ŗ:ŅńV)“nļšÓåł¬ĶŻūk"ä±wµ“X'kViŸUŽ[ىיՙp/ņÕßo¹­˜ŠŌ0±®źØ·¹łwæz÷Ēµæ‘U'wyœ č²6¢ķ눩CæžŲœÖģi+&`äųdć>ć§ † `Ūm¶ˆčš9kxUė“ž#fŒžŲ āĮėž8²7ÉAuużó>VŚ×üŅ·Žņ'VfŪŪŁó¢Õ÷}ŽŲ²ķŲq) ŽÅ¤śĘqÕµœī`­¢r’Æ•å+ZSÓl6ݶa½Åmjr+¢Ē͜eµ¾#•HpēM·°g"TÖ®5“ydCÆFP“pŁĻ¬Ź=2„Y“łˆ{ļxŪ®Ŗ^|Œ9׌ū”Ū’Üō„Rč!@U: HQš Ŗ¢č+ņ|Øš,ļłxŠļ‚"*(H&-é!BH ½ŻrĪŽk­9Ęļ1×\³­²Ļ½yæó¹Ÿ›“s÷Ł{­¹ęõ;¾_[ōlk¾†sĻóī<8Ź+>÷å?Õļļ8AÆļæõŖß•+·%B&bž~÷O8µųö7¾!Čæ*é9V¹ŖŖø17\ņ{Ÿvęo?óy?}ŸßÖīøkß&@ĶuŻTüéĢō+ż×J€ΆGŸ{×W>ķŁW}õėÜŌF¤Ģ]J@TC±¦.ivĄE'¼Ä¦æUÕīšjQwi[C/ųÉg­Čć1Xģ,²ž“'<ī_žĀµßæü{W_YqcXØq57 ”÷.~kk«‘MUUxĻ»5€š0m–ešŠ;ŽõQw»ēY{~ėł?ĻÓĻųÖg>³}Ćul–~¤§ģ0nMS™fĮ¼XnŻpĖß·"Ü)Mn¢įf»6ÄUmøb^’-æöbÅ~ßļ»ö”oĒĖ‡ʍ:/ūwežĒ«’›BP'é5^+}d&Ół}bĖērĖš2ÜEV‹śšĮCQ,‘%sŽ:¼9YÉķķķ E&"¾’·Š›¶ķGk~P'KžŒ­ČÉmj¼cĶyöĻżįĖžĖ~½Ī5yšÉ&ˆčüł*ZĮ#ĶұØx‰SŸ‰ī…U¤<åjÆÕźŗż|źœE&)q/p:̹&Ź --Ū’_Rāģ“¶Ļy¤)ńō߂>„ż.ø£;B°Ćūl­•aŖ˜D»Įś³?ųĆŪģ9ęNūO|čYw<ŹGŸ{×{pÜk_ö"„@ß¹<öŁ÷{ä9X>ž.ē?āÜórĪŻßõWo£[¬–fä×'¦ÄŅwõa¢ž7™ŚX‹lĢö3Ā}Æé{‡žģŃ!“}zēåv5Ź—žÜS×µ_ʛ: mmįž&°t’3#Ä=JŚ+©ē„uD ōå˶ĒŪ¶³ ’äӟŖŠ&ļų‡·Łŗ1¶:k;u¦#¬”ąXĄ“ ³}ćĮ­šŅ†ŻŌ¢²)JDÅv‹Ė[Ö¦ķŸ~ģ¾ēóęÅüśÆV\Ł:yݶĢŲ ßxč.{÷_xĢÉĻøąA’å‰Ļ|я<įŠ7æ#iIĶ¢i¶kW˜ØføŪ”éœ.e¤Ī—µ$²aģś,ł„r³˜kU\sÅĕt?¶e°Łp–ęƒ pļ;ÜyĄUpcģč~Ć®Ÿ×» øŁāĒ\ø¼’/żŅ/Éxv‰Š[q÷m±¦Åõ7_’ļ¼żuĮĪd:Ä\ßxÓµ3½š€ŪyæŪžqÆSoóOöē|ą–Ÿ|ō#÷¬m±- 4¶ēÉLDŪĖ1 TOś“75›|wÅt9³@¦% †·m/·«źšR:ŪĢÜT55¦©j&¾’½/\ŲxŠł÷lm‡½ 8ómjQ‘Y4TIęĄ@1Ó ąn§’ž7½ałƒĖų–«Ķā7K®H @M#[ ¾ļ·»Ūń'=ī^÷ēŚ!šŖ¹ąw’‘„{Žöv»eąÖT¶™h˜ž?ųŚ»ģ>īĮĒžvg˜ßUmŽŹż?øänj¹ķŚT\UÜ4_ūŅšÅaٵķ7[‹ļ\ņ p’VĒpå×¾¼ö±YŠ&€sõĘĪ»×õ_üŹ›»_uSĶMMŌTŅnÓą†YŲŻƒĘi‹aCĖå¶15“YŽ|Ėń›B}"›dŸRœx’ąŗår;ؙk īXÜfĆ“4Õ¢öT‚MÓTÄuÕl×-ó~ÓF8ņcGĀŪlø2¼ØżŚ½ūźSC•A6‡ēŠ|ĮŠ=ū§‹‹üŸWՃļqioœ¾±‡;žߐY֕ÅČĆk NĶWҬ²Lįś^ŽĮMĄnN–9`gY]ˆt•kZų#Ä&B“?’¾pćõ7 Ī*t8”/}ž Š#~ü¼ū?懯FļŚō'‡ż ö ¹Ņ?%{äa|Ō)„v/‹Sß¾÷ńŃM&&ä”B^ņæśÉ}?šBā&Ļ}sŌ}mź#L¾†ūv;Ł™tU£äŲy]b“ĮlŽJ_ŹjY MhNIx€Å×]ߑG¾Iö³±An @–sƒ„‚@3Ą ł/»ńšÆ]÷ƒ~ė+ßę­wó Ÿŗęś½öā±?ē”c¾]ßx—‡Ż½Ł·÷ć_żĻƒ7ŻxŽķo÷“ē=łSŸ’6Kdņٹ__Ė–ŗ’•~4 Ø:;mŪt=™¹%€ÅV±å²óåCŒ‘WBĄ,ķžxBsĮæśœlžā4*P…ĻYiG³yiÕ ‰ķŸVū®ūĘ’9 aöYć"]å`õŲ»Æ–,Ī‘K;…C2¼Ak…Ŗ}%ęØē„³7·Oś¶YŹŽÉ`jķTū"D `ƒ,œ8 Ą\(ƒ“ļøc ąŖ ®ŗō{`41°R¬E’•Ŗ–5Ėp,4\Ō„ŪĶM7ŻņķĖ.__Ū… P£’mT Fb`ؗ•ĀöČöb˜…XļŽø©Z*†O}ā?JĶ0¹ĒBĆŽsļ}įU¶/żę÷>ž‘ĻŚZTR 0”Zįœan%&QS9ćˆT¶ōöö²©<82V­Ń>;· 9ĒMTCināķ`iØQpüi§ keAĶē ēĄZq‰ÄŠ 26 Ą. }ęāÆm)ŲR ±`+1Ŗ„§Ü?}²ÉkAVW6Ą€ŠŸV̟żčĒ„łō3okX)VØEHÖĄ;žś-oś³×«­å]n{»ųĒC’ö×’ųŠgžģ)›ūą†źą3^ō3õĮwžŲ ŸėóO~ö3'ŸzŅŽõYµ@ p   `øVĪ‘”`­Y¬ V%é‚ ZPö8…œ”F­QÉŗ(˜ĻēbÉ}XTJn¾łf˜ańš‡?|¹\1”V Œ:Ų2n€Eć_ņ¢*€µŠ×žč/ž÷£ŸņäŁń'Ą®½ĶlÖč²)ŃXvdE€ź~čU7\æ¶±k눸X,€ńĄu70ĄL«źęƒū‹õ5+%JŒ†‚ūŽļBCÕ57_§ēå5E}9ŌĻéKN>ūL֊ˆ©PŅīzœ—Ą 6 Ū„õŚüMoś Ą†Ö°8ł¤“ŹŁŒ Ķ-}I ““­—`š™&-ŖÉJŒ”Ö…Be-hŲøū„ć˜ 4»ę€ÄŲ¢FUŖßöwoŻśœż'ē+ßk÷ ($`jŒF]Śŗś{WīŚŲ@­ ’AjÕ°‹ōÖ”Ćİw}×±ė{gŖ ąsļ|—Ütż/ø;Ģ4)&Å Œ€ŒĘģÅŁ˜½äW^k%ˆE2ĘŅD‹W XŪ­ žčžiųµo~ć!?śØÆ\yé`ŌŚ|CÆl ßÉ_³šg B€^ śÓæśß¾eyxąw^ņK/xō“ąŖ[FÉG³.UT:…VZ8šw«wŠ[²x„@ˆ¦ēC2Ņī· 5śDāćīwŸū Ö ]<éžóö/üĒqēŸżĶ®Ü8éøĘPƒØKSč!R+’‹JÄ0²*ܬU¤Y)B5Ū½ū;W_uĶĶ7^öĶ‹Æ½ā{ļ÷»>ų±|ö²‹a’n=›5`I’S)BÅŠ4óõ90£‚rVŪ6°RPbS”øV0ŒŠY·ŌńP*BEØ ö…‚RKÖį‹<#b^©u”ĀŒ9{ŁEƒ>TŹ#æoš˜Ś>,ļ°¶¹ µč”ŗ”7Ö fŖ d,tźā™2!„1F‚–•ąĘ`CŠP5rĄ5!3q+ ÅZk2P+Bf…¤€å{lC£6Üb"@ č腕Rö2ŹV!«į¬ˆčīwæū1Ē+¢"Į¾¼‰[OD@|ó_’Ķ'>ś‘]zvśžO9žDüē’ó*§~ČĄĀémߦM/ÅA‹©æ•`'čKo_žU“ƝTŠ{„<2Ææg°g³2Üu<å.Śp½dv¢å‘“ņŲ½øĄ’łÜ u”2ŌlĢo¼ā×f öœ1Ūõ€³īų¹w½ŸĆ-ыßĮ¶żŪ2ŻVC[KĖ“ä•ÉW’š…,Kџ*ŌŻõx™}’Ŗ†D3Vŗ¤gģŻw¬Ņū7w9†Ļ£h”†Ŗ§ÄÜš<š”» ˜l]yšH9L_žŅ÷šGœ³kļ3žČ’õŖß½ę’op½õ¹ųAgÜö¹{ųĆīx§·üé’0d¹ī—uõƒ«¾§ī“Ö7ŖVÓļŽ—uż.ŗkkøAw}Hœļwی¼˜ų~Ž[ģšmšŅ“Œ“ `®Xś)¶Ų]ssøYÜ®/„MōäJźGī~Æ_~Ƴmū‚+ĆĖvˆ ż5¶Ø„Ė>÷…óO?će?õ^Z,čėƟœx[=?Nė5€7æžõƒĶķ|ģö5×lģFTń6ń6]sÉå¼Õ\śõK®ūĮµĖeA­3ń_žÆ×€@ xū3ĻŗłŚė#fwļ‚&(ęĻŹÓ¹2®cé+—Š[¬«v 5Ģ7ß²ą©÷¹ļOŸĮ}×vŻūŌ“¾üń0WnmSœ |īÖbŪĀŪ=•ŌvV™ėŗ®™*®¶i›øę¦¾üÓ_øć¾4Ą\«żE¹ ąōŻ»łę›żĶß«ÅŚCŅbŃŹ,*Nx’}Œ óöāÓ’ń‘õī8wß±’ü×oā¦bŖÉ,Ŗ‰M-,Ā>a˜a&>|pKŽÜvSMˆ·Ŗuµ0MÕŌK2uS/É,ŁBßj¢Ężq؍2ß~87뛋lĄI ų;sˆĀ>§»Wńć> ōź_Zė øą¼ó¬ø€©¶ˆPğpH7}L“”£P'w ?żS9Ėl³=ūź›­ĖĘ-­¦æčÅ/P·U»ī°±_rŒ§<ź±\ń6óVk²ĒD†Ę…z‡l'ĀbÓ8s3h˜nŖ`!›†ŖŖń‰Æ˜ZcłŠķH¢€įY5nœÄLÖό=0½8|§“ˆh=±K<ڲö÷ü­ĒB•'%"•ž Dž¼J ×/’_ŃZ÷-ŽJéh¤r ŗ‚zšŹ“ß4 F&˜žVJ10,–wæĖyO{ņ“·©śĘuW~·9xÖ?ń̟TŒH¼TP©Õk ^G)„µī$ !8(ĮŲVņ–K)å—r³å„a)0 uŁģ‚Ś·ģ“+٩۵?”tū$*µŒV¹\ķŁ½^¼…u-~A¶™[łŗnźŚ…j[×Äī że÷> °«V*£K<„XÅĢ®Ģģę| Ą~ę“%ą £~ż’yĆk^ż_ĮtŲ†F3ļŚÜ@Ÿ’ąææēÆŽüėæšā+æł-mĢW¾ś%Ų,Y$"‡ĮŃ÷ˆhČąlŽ \,®»ęššĆ`PhĶ\“Åc£T£šį~ÕóĶ īsļ“N;UŽK:oBxÓ,ŅĄMC²ĀÜö¬ģ¤‚Łl†n ¹ķDöģó¾[°Ņŗ|’æ}^ńŠW¼ōe/ŲźZŁM éŠļ^öGæł;÷æėłWŗł2÷¾šB #*kŻ™:ĀR÷Šf@j°^Ū·¹ M°¶gŸAm@1 2ąįę½ł¦žČćYn?ų÷øó=ĪzŚĻ<÷„3Ļ|Āćģ>?ōŠÆ]žŻ/ēŅ»>ąŽO’…(˜±!l`åÉǟ“wcķŽw¼ć 'œ°½\J‡ŪÕ÷»Öéj;t3±1ÅԃÉ¢R®9Ü4VŚŌ aÓ4JkŖ[‡܂MµøēłwĆ`l;Å@A ĆK…$uM€_ņÅÆ}õSŸ©Æ¹ń}’ų÷ū‹āėßśę=ōĮ„NØÉ©#€jšsŃG?qĘń'vŹ©€,]‚Æ~żk°±¹{iš={öĄOžŌ³€”­åÆķ?ö9Ļ{Ī6ó[[wøĖ]¾÷ƒ«ĄJ§+·•}æą‹K‹ūīwæ«*2šĀ½čÆžĻ’R;Ņgź'vŅ“5=Ģ šō3n£Ö˜ßšg’jcžņ’ū'?ōĮ§?õ)~ß{ ężū›•… Bŗ˜ž÷‚\捗^śķK¾õ­‹æ}鎿ĒużĢ¶Ūi †ų Ox<ģŚÜ£€4*0F«m‡ŠA#ØaĻ®³ĪŗŻ¹ēßż»ŪĪyĄ½ļł€ūwāI¬€ iÕ¬‰Z/×Ģv­Zt‚FEĘ !p éĀ BIF!#hu›{ßõĖ×_žÜ‡<ś¶¼vÜlć85ß åńūöżż›ßl7?aūwĘå#†$čäC'Å'€Ŗ”nÕwŚLū6ełŖßü®oo]ł½+Ą®™Ā¢1T(¢ŗ`>Ÿ“a„ˆŖe-`#d`C U”gE1WXh=VZ•R4±“ūØŻ‡ ņ U ˜JÄ®õ5hڧ©žsś²)ū?ž-…ŖŠŅGŒ¬²·"޽g·xĄ}ļ†Üö=wŹ®"v·hA\Ü;,ėZøQ»ŅŻäÕ¹‹"j¶ū·ģ(²å³.Ón!"2Ń”›oś_śĒ3€ĖéŠ7·®G†ąŒsĪsCė,rÄd“Z‚iń\mωtÓ)gČo¦iRøOö8j„T‡}ŌĖR+„Ā”djŌģI\lŚŃ5T^?¬ģ–eØ3Ģ-ņ.÷ęiw7„#”ć,FoøÆ;ń¾ü÷™ø˜~ Ÿ®CŌI@ćīŲcŽĘ»Ä}x}jøZŌnxćÖ!­ĻõŽČĶ‘0»ŽƒŖ2Üš·æōµM€ć”¼ĻYw8ŌnĄ’ł‡ÄuĶĘx…Õ£Ć.°ƒŖĢ”Fė‘ŌBz»ÄVż†*‘k"‡c<Ł=“¼UH³TyŒ&į½ GE]Ėv²\Q”nź‚vMõŖY›÷üć?ŻóŽw’“µ°ź¼sĻ~öSŸüƒK.łī~é ōŚ‹Žūž Ļ<÷D5?c×¾Ż¼Ļż/żņWø®Ł£³Zi>§]jÓ,¶ €õgn:Lš3ė21›{Üå.3€5€œžcņ+cēMżC%½Vۊw•Ś€"•ŃZń¤“›²īpćš Ė’JęĄ5×Īö„PsmøÅ'FjĢŌ –¾ęühtAUĶęgžńĢ5€cŌüÓļ’°“×·’ķļ=ō3üšßyīO’ŌCī’Ŗ_|WW7õ6q-ĀŠ?r÷ žń°ęå›Ęאüž—æŗšŽgœńØóĻx¤§Ūˆ»UČØŚn€H(É×Į[4Um«é–b€LŻT2ÆŲŌė€3€cŹł’üÆÆį„ćō"nL]-˜©®>Tżé«žą}÷Ž+æņ­kæõåµ7ģ8ė˜cö+Å7d—LK»#µĻā†[ž~æ=üģ;>ėĒĻāūč‡>8Ų°`ŸB^n³i,ģĀpÅue)Ԛ—¾ōÅW]õ}ņöĘ\…X°ŗ®ßņ–æŃ%Ą³žö4æIh…šVŻ›@ėŌ€ĆÄ÷ŗóvlœ±k߅gŻžž·=ūłO~ڵ—|»¹ł€Ó¶óĻķ$y²&m:cüQÉżģϬœ¾{/–d–Ģ5-*³½¤Ee%É[ca%֘‰ł«ŸųěžäO~įOŪŲš¦?żļd–ŽĀÜ‡$FŌ éꆛ­Š—5WN•¹b³ vņc‹­śŗėłšöēžéwĘĶ3½š~ēŻƒ—%…źńȁ)jb¢y_“"s|ś:Ģm—Ų’ėø¬‰Łš“śšćQźwæĒ»ßņ·\×L†Ø‰I‰;ūĪ[‡¶]k®©L@bI3ĖiĘč*Ć.·;νj„–å¾Z}®o%©ĪÄŁ%SĄ3€'>śGø1™œ|9łß<˜BÕ|Šć)—]×õÖÖ֎,"Å_ŗ;Žö¬Y›pĪó°¶šÆĘtÜņķž!G”ŠÉQ$w8=z³4Ī55=ČkŠ&œ £Ćģ ·y„¹ĢjH“Vćpāiķ;/įė?—ŖŖ&&V’o¾FY{ż"&nī1DIH*JÜŖQœpÄiŽQ°”ž„z%•Ą`ŗˆĮеßųöy§ž¹_ÆÆ wÅ[ŽōF&cŒ©Č½D3˜Ȭ¤Ļ„G–ŹŽ&r½oŪŗŒ€oĄä 2袽į~ø\.}¶ź)t‚‘ūń©ü¤Äńō>ķB–#÷Š«=#)ĮČ~hĢ՗}W*ą%Ā ąä½{6NŌåI ĻŁŲ{ĪŽ|ō}ļ·0Ø··äI$źQ?|ņŽ}7^ł}Ÿ&d{{9Z–M‰y”S˜‰ß÷¾÷€›÷>ėœē<ęq¹š>»NŽÜŲš óļzīÉĒżĆ’y=ń”†Hįć„ć™<õ”’æÆłC^n¾.E4?vį}’äW}€=~pW“óMU[I­6"·pwĆõ²JŸcSÕM½\lfÓüékž`p‡Ón³·+›W¢ęęŠ4\1jŽł×’ųńĘē=éi·|ļū·\uuSo“YJ7čÄbķ9?ö$6\-–rµ”g¶­ė-W_óĶĻ|ī¹~Ģcļy!/“’/’ōö5P›gē}–šÕµpHw¬ļģįr-m2“ļ>ŅōŃģ#}Õoż¶³3 é…sڙ½TO=¼ī­sż•ß{ÖS~Bä…g_žģ§i±ąŹjŗS5N'<~["7‰q©ĘYU·įĻ~ņć3€S77’żļøéŗ«—‡šrł'ų‡"Ch©aafŚ>¼0uĆĖśŠåWÜ’œ;üź³žs<Ąń€æĒ=D„ÉN$ŸŽ’:ņķ6%n¶k&®·ʘķķm¹Tc˜–† ß|Õõę{×½śēé¤=»ēĒ*}ą)XŠŲՉ{Ža‡n5“óå­NTfjJhSƜA‡ &;ē!ŸwīīcnæēŲ=O}Ō£?ńž÷p]KĪ‘·9Ąvū\ģ:“ÕTFŽv¹]YveC)æ(+8„]VŽ•$$ē±J‡+Š{i;‡õØW—~B9|æoŪ?ĢNŲµ{ąI’ŃZ›·øį))śų¼Mi™i¢½­k惱Gu}Ӊ•H9rĒÉpÓXaäŗ^šåā…Ļ}žĪø]ĄÄŪlLUS;½w+Fݟs؞5ZHMbÓ*DĀSŌh»bh{dē&’”ųHć½i×9¶ ‡ĄŲQ.6=%ŽPĒé^ŠfV½žˆüģHÖm Ć—ŻQJÜGp}ä2Œ.JT-‹äUąq„µ®ģ½­öž9~?öh;]ņŗ¹Ż 'ķø×ķĪ=©\æóI§½üg_ČMFĮh„œ*]½„£ĖT>V¾Ė›¼õÉJĮŁė{^łÓĻ/®1ów?õł{ßęģ9Ą®õ¢÷~Ō$fn0’“Ńsć×Ōoŗįfū[¦njį®ĻŗĶ©’®ģ+fkæüs/zƒõįæēŁ{Oś—7¼å„Ļų™žÓ{~š•ol_y5:ÄõR‚h@Š„Śüśē>/±—ė°<°Ķ5Ó-Õį+ÆæįāĖšåÆ~ķ£åĻ’ü_÷:®—Ģ,āL’÷/ß [ŗŻ’Ūū%Ę7ž&Šį:ƒÆéōÉM$õéMį6dś¶Gļ®šÄ3 ĪÅHłŁ,¶-v]/©åÄö“üĪ…Ź"q"Kh‰Įė궖ėÆyņ>ś;_łŅ>’™‹>ūI³½Ķuķ„×Ņ솅üŸžęĶ{|ƹ·ĆµS˵ēžÄO°&s7 žeOķ.ŠjfóļśČėožÓWż·‡œwĮKžńģ³öķ/J„MĄcŌ4 XœĀÉś«æ^o/üiēńŒāāÆ%WĻ=AcLxB ‘ÆÜ:“ķ$ōléµ6·[ß}<ĄĄ™'žš¾·æƒ]~Åģvi¶'Ó4ݧXżv‡”™"ś÷ü PĪÅÆŲ%īM‰MöŲ“ļ+½ņ-ozć ą”}Ǭ¼ģ?kł¼Ūõ8ƒžƒGÖ4”RÆz‘’`ūņ;nŽWŠ&ĘäŚ];¾#‰ėĀ~ EÜ4C7Ņ/¢ŁóóyN_ū(%)Sna8ų÷“©izN4ŠVͶā¦äš©,ėō„vĒį“1¦ŖŖŖŖ”؇r^qĢxś+ fŽąę¦„¹Kg2-9pęvCžGqŠŲ zM»ó Bčk„ !Õ ˆāĒģŠkÆ€/~ē’rvŃĒžż“³Ī„H”RˆÜ„4½§µŌžŪy•ˆu9ŗ‹»ćŒčōOG ĀvśÓŖš˜­ƒĮT;_ƒR_fŒ1eY6MS… kŚQ+‹Ļ¹†®ŻųnÄPķ–ĖįÓZyTÜĢšø•ō%zÜ3xy¤“„œ T0 ”&¦{\xįM7ßLoŗé¦Ÿ|āOģŁ³ē’ś®öļūŻ÷’ųwķŁ»÷Ųcå^Œ7ļؓ‘§aŠģšķD.ŌĻ:ē{_ūęĘŚl±Xøāź=·9u¦eŚtGĄ€J+cŒÖZī5ķfČ*ć=nt‡C&p¦Ą&LٱžsŃZ‹rc]DC3BH¤”āB“U ā¦¹ŻŁē²B€”`fū“£d‘zŸˆŽåĖÆ¼āœsĪZ.*…p’‡żšāąį7æłĶǜx2 +@0J<…æżŪæ}ė[ßvłö×žßæŲ}›S~å×Taø Žžń~ł{—^p»s®¹ęšŒ!&c²cē̼žķ±€¦6E”™€ˆ“Vd‰Q+„µi]LŒ€{öģaTˆP($ł§Kæ}Łg’ćS?ōą­•5Õ?½żoļ~×»¬ļÅ{?輻ݒŽ÷śį N:ń4fPÅ: Zz€=ėė[[Ū[wŗąžĖƇfÅzcPk€]›k@°øå–w¼õmß¹ä[~ČżŠ¢8å“Ӟõā_`Ą\*Ķ Ļ~Īsžó3ĻS īx§;=ąaD…ʰÖ2šŒBś®PƒBÄž€¢O‚™ „k„erͱ¼ _¶Č‹E ē_pO”Ūf\W ŒÖõI› !bŽńõyŃĒ?~Ć 7¼ē3’±>[ßÕšcūŲæyóO;ķ“]·ą6óxAu Ё’ÕÆzŌ£uĘŁgģŽ³ø$cT”…eMÓ ‡膊ŪyŃŠ`;M;­mXi4†”RėėköÖÄV3qUŻ“8l Ą•×\ūČĒž(0Éćm¾z¢.|c+ĘMkäVj”ŻnĀTŒ¾Ū’æS –ŽeĆ¢ŸóÅQĪ _ńt?hy¤WŲĆ#2§£.o’žżpąĄØė˜už~%Œd‰Hk-‡B©”ńČčsū=²ųDŽŁŻR§”T:x CŹō,Sˆ€%«n÷‹Y`@b’Qn!aĪńN‰H•REQ`Ė?āā Č­'S£ž@©<µhž6\½žŪķ€Ä¬z;āHYExÉy€Ęj÷>–B暣B<īw"µ÷‰’Öłt<ZB£cł£ŌQ£G`ŠzÆ|…G%°w‹_DĢ•gʲ”5²Ń¦¦¢Šį >įełSŚīŻÜ§ÜI{\\0ęDg ąĘ(­@Ś7_Ūäś~·æżw¾ū½­åö>ōÓnw;P@D„R6`*“Øwģœq'>®qn6L¤¾ćg™%ˆØ#†•>"Ėl¤µģBi@T9r—§”|ÄæåææäŲ©‰Ļ¦^mVÖE.¾ w”­ļÓÄBVódQĆšŒŃJkTĢ –Z{ģ±ļżčGX1Zz„„ H˜Q©“lCĀq”1}”ĻNuŠźģ»Üń _śĻ S­o¬å«’y’ۜŹÜRi¶¬TuC Yk-4؇ŠDÄČł’ģņČMCŗPžĮģžLkŽ?C)%ŁĪĄ”—䇕8~( q‚MÓ`Q4ĄdRjßm ĖĖ­dpØ1M‰Åé'Ÿ²8¼""[zbBdŌĄløŃŠh&žæūŖ?’ó?’š‡?ü+æłI"póeß?~}Ļw¾’½¾š…ž•w¶Qė@b­ÆęŁh„”÷öłr|]ŗ(„*£“&f DؔmŒŃZ]ų ,©1ĘDT\cžęaĀ¢ØJ% Pm@¢®»īŗĶ]ØķŪ»{k±€ qVnŻ|ćÖĮCĻ}Ƴō‘>īøćO9óŒO}į¢SN9å§_š|PV‹źe=[+‰Ų@»’š•Š®@SÕEQ0*ω¶¹Gßćsy©å#B­$Ęr¬ÖėކųœHtōYŸƒĒ7† 40Š ¼¦Kļ™q}cĆŁł]Ƥ]˜čj”~¤ˆmĮ«ż\ƒ ¬Įd"I½AJŽ•”Ó×fs` c°Šum’ćODĄ«¶¬é™óĀ—¾¬•A›ŲceSVė, jāu—÷łĻü©+/½lqąføóŽī|ē;čӟų«łūĆ nüĮ•'ćŚY§ŗ¶kćGü æü»æålƬPōš$S¢ž„āӍI@ążöG4BŽ{ŗŖ+fńč2FļĪvś’–ģ ŗš-¼O֕ś©lxŁ5“Œ13Ō “r5n(ZNŃÖYwō5œ2¤®øJ™Ćæ’įŚZ|“”čŠ ©ŠgL††× N8 ³kĶ<®t/kśŁŲ,U BFf+śl@(Å\6š’ļ¤kĪżĀ¢A čń“%ŒeŲk?ć{±t‰^ĆdµuŖ(  £JĮpRé3ņN±°»(N?żōŌ§ĮĮ".±XĮ­­Å|>VaDĶ²Vs­ ÖĀ=īG#Ddµ4Qc”J„fM—‚A©Y ' Ą ¢°ĻÖ6/æģŠÓĻ<øįSŽ=ölģQõ EŃ,Ŗž3ų#ż7^~ĻÜ FųOELw¦ »™l¹°ķ·eia@Ņ›&b!łpšÄä˼-+&FŒ¹Uå%/tČV9Ó.MÅ/Do·}U„|Šā®gčv?"‹ 0ƒ1ZėBņˆŠVXiĶņ¹rÆls×öƒ:aufÖJ±!TJk$S+,”Ö† ,56\@“Y”NTŪüA 6ö¶üöUØ5é>ūY’ųĒÆøś œ8ǃ‡ŖŪĶ×.ŗü«gßļnoĶkļr§»ŽpĆ ›{÷ĢēółśĢRyĶ‹5`ÖŖLįČēlņ© ņ»ĀōŁ„$߈»Æ ł°-Č2h„@żąņ+„łzcVž}öŁĀ×-mU)ŁX @ö­“źSf.ĖŅ©Q0;ō.+h’†öļžž‚ŅA…ŚšĆJ”ĻA„ÜS"× $]„Ei t0:ōqĀK½³oĶ”R÷ŗ×½bģŅļ^QØ»`=—$ø(\ÜZ摊ž— ~²Q_{9qčŖo®ē’·ų}”`_|ĪĢZ!°2ˆ”d` T$ aŠØJÅķóSØŅj8d!‚R; æ“.Węem]×Õā':߈9*÷ųŁfŗ,[[[»6wɜDc j•.ą`'*q„½ĀbVŗNHuZóCõ¶:²éX-–6¢e‹cdfFVRw7±‰æŒań (­Ģī³ZŒ2"Īfv4Ąć{‰µf^.—³Ł¬ė/9÷ĀLdˆµŅZƒ”RrĶŹāžØŚ77ʀÖuS—ei­VĄ¬ÜR$VläTČD•Bøēīŗ®‹ņø½7\{żūŽż¾ē½ųelZ é^b›šŲQĒ»†† „Š¢Ó™ŲŚŚBÄõõuPąĘĖ766ęė3ū¶€Ć.gnA•ˆŲŌ¦(5cU5óµB¼³DoLʖ=¼6K[‹`D,Ą"Ņą² ¶@: ‚Ü“#Ć¹Ø®]dķܱūaX„$¬ė_zé/?õ O~ńK_Zāf{āę›» ØMóƒoŹ^ģűł³ī*ū[ė›ė@mĶQ!eŁÉo°¶B$I`YŚ,(HįŠ``ŻRs˜2ņ)gœzÅe—>āųö„—ŻpąøyėÜöōŪÜęŒ3~īÅ/~÷“ž(‹ÄDs5cfDmÕt™TÓ4e©—ĖJĶ sĄn}œ4Ē-&ˆ­ącxy’µ;óŅ_„¶MZŻv† Qū‹ģMUU³ŁL"ąćĪŖwDK÷”oŒSģҶ%Žż®ģQāe«rŗ4}÷ūWœ~źé†C³@™¦ŃX°aŌ(ę jFƒĄČżųč‡>š'Æ}Ż{ßū~ pŪÓN~Ģ#ż ’нīuÆćνƒļĀNŚ»«s=ŚäŲ¾ÕDTspłÜʏĆ“‰ŗ@%;‡Š~Oä%ŠŠį‚[„gg ˆIZš ŚtB€tš‹Ē?ę±5lźŁÆ¼ųe\– @ R ń 6,VŻ#ńO¦Ŗnūf†õńZ%<·…}‘<ń’ö6Ū_1Uˆz^¤žŲr·ąģƒQ”戈’„¾`#z„ŖŠ}¶7[øgęĶĶŻlöą¹Ļ|–Ō”Ń]>h°jČ 5“½½½kצÜ{ )* 8S _—< 8<¼+^ųU æŒĄÜ]†ā²(@üW[%—^œż56Ą[vÆē¶ģšH·hRVn˘•ė\3PZ¹d5Ę\ż¼UU“¹œėĮND­æ“»E#2u˜v’ÄnwF–«C­£/é÷ķl ’Ž#†’SŽOHéścÅT¢Ļ®CX’óßE(PLĢØŻū“0/^+[k—7g&c”Ö¾yŒėVdRö!w÷ 2ÉJŹŚ)KåD”|8{x]¶_UuY–Ģ™"”ÆCu¼»#oģŻøƒćŪ“>”\Nœ28Ā”,N‰‡{&½Ü§öõā†Į£(…)+śUz©ˆÕgŅ+bÜŲ·gł½+^}ż]N;ū?ńÓ·;÷œū>īŃŽ’ž7~ēŠcO? …˜“ aĀTg¾NÕ#’å×,ÓÄxĄĒųĆE>Ŗ\NÆĢć:'—ķQdƒa³Ž³7×uV}$‰“Y8 =.£źšŅn$Ktx-TŽZY–¾h^;Œ‘č\ŸsĘ2¤9’ūÉl6 ž‘“#VؔFV®(6äÓDekkk}}]īt­üVTJ(7ļqĮ=¦¹åŚėąŗ›n`”Ļ%tö¤IÆžÕ€õõu%„×1Z­ģĢM©„߂óy±½µX__Ćū:}¢jś$“ńØOśųŽ2Q€!S(ÄY §žzźų@ kūM×]‹@zöoļyß+~ē·'Ž…šdų–!DaŲČĘB-<øƒķ&µfĢÅÖņ¢®ŹĪŌÅXĆ­!÷“SĻ8óė—\ ̟żō§/žś7Žüę7æņ•ƼĻ}ī3›ĻA{… ė\9Ł~Ö|>“L=@J‡Ļnkkkcc#M>żøŹŸ³ˆD{įdĆ5{v#½]‚l“!ÖOī®,K·«śÖų¾/…Ё™Z³Ģ O>łdł¶Ŗ)ꢐŹ!·¶P"10mß|Ė<ü‘ū÷ķ½ėķĻŽ»wļ›’žļN¼Ķml#u¾+ōz%¶dTéńæó…ĻĻ”`ę·¾ū_¾Ū,žūk`7Ą}ļqļĶ{’ķxĢ^ÖØĮ¬R—•„DŃSwīnŠrōÓ¦1zˆå qƎOe c?PŚč3(Qīįa½<'5¬µ&ĆU]Ea'ÆÜ~eōmńÖÖÖĘ®MŒ1ZilK‹#Ņą‘+“@ū„µöĖ„iןt‚A õ¬›OĮKƃÖī ūÕĻ–¾{×n` Ęć{ĄńZ×@9Iž»Ņ%­·•f2Jį׿õMP@ĄMÓ̤ķƤv:X]‰K*"¬×ąR30TU³½½½{÷nńĒkkkMc,7÷&„¢ća¦dף[>r®„ 4±Q’œcŒyä#ÉĘ`‰dŒR ļ?ęXØMešjbź­ XˆAāŒż_‘į̬ ō Hśv×@i¬ļtoudĄ<æGł’æüźZćvųÕß’Ćßæńo|ė[ß eĪYé®·FLš”ÅÅŽåNwܜĻ^ö²—ķŽ·÷¹?’sP(؁Š¢§čCīöōdYž™™ŁŲ—Y—„^Ž!³,Aļ"צ°Ÿ Seš‚gˆJ_sƍR*ŗó]ļ Z¤½„ۼ͋Ä9 Ż\³ū‰|13n „©«z6/,‡”p8ÖMS–·¹5¬4JŅ«”ež³ĪVU ÄQ"ĀśśQ×žŹ²03²g@ 3E5Å,aōŸ^[Qˆø¶¶F@×\ü”>Š>lā-Cb[“’ņ ~ī@­ö~1Sj‘*•;žry[[Ūė›ė®~‘ͶZˆl²Ē‹ó/ ū„­•ˆ—†’ŲöüŁyĒ›f«£ÄŠĆ78š0¾é§Ō©§Ļ‚ęw…ōH =É\»_T¹Ņ$°Ģń31Ūłidž.©ÆeģŁ(bF«)uyæfÜcžņæ˜ćś™Žö‡A({tź-Eīd'˜–?¢Š‹™³ķĘé•Ó!Ģč±±;™ķēÉ“pś^.[ˆ*}ė…Ŗ’; s£ŒBü^[ŸJ5u…ØÕó^šüēżģ nšė‹®ŗģ:e¶J»•Zųś—’ósŸ’ÜėžŪ{ßß\Vløj“Ŗ.ÕQ‹H$‹Ā”ēĒ›ŽÉŗEńœ«å“L͆_)@æ1oą©ł©QĒXČÉŪĖ›o¾¹©Ņ÷Ts_››ģ‰ķ±Ię”Ü7"™ÓBJ,²æ3ß!3÷‡\ŃųžhŖ#źK‘e[s®snåF ±! vhY„ŗ®Į4d¬p.‘1Ō2£ā”ć{p ؐ¢WüźÆ@M|óÖaPåӏJBö»±ÓʱO˜Ķʽ{÷(Ż9֎›€WhĢö Syė¬ov+°GPŲE`įF’–Ü®¾ź“ÓNĆ¢ ¶¤‡—‡`Ļī]_rńō †ĻŌä8° ]’āČ¢Ė(’G®„ŠJö()$dЊRė± “ƒĢ8­ęˆ0W@ƒÄŽ‘ŒütÓ4ŠOdńŪūń‰ļz×»677½¦ ƒ"D-PV–-ÅyōßRUĻśŁŸyī “fVĢJĮLž˜GM]@‡e²E‡£TóöW˜Ąw²Ø„µ"ÖzmmM^üéģŚ›Æ'fxÉĖ^ŚBÓ­Ió脦ÓF©‡’ėfxĖøfø›d³ŽO¹ OfP —‹JYĀ9#lˆ®įŒ :žPģé2e=¾RrAYĄ×ō ¶ć×d;Zė~ū;ĄŌĄ[õtdm€ČCyĮtgĮ€ ČpĘŹyÆLC/W„ņŸ&¶ Š–b“ģ‡ ‘BP¢³…» =6NŽüļ™ žĄR‹½¹U„>p²QsŃ3¹«Ł®# ąónw°s&±Øbļ‹÷8;?6š,ƒ{ŁÄ, ²›lč¾ŖŚ$Z>_Ż•·Ó©Ō¹뚽Ó6Łƒśh :žP“Ü+ŒāŗŻ¾ćķēœBŽgxķZŹ !‰EŽƒ(Fū-SŗÄćūĒŻu™n'Ÿ "›ęąV}óÖ7æłĶ}’{˲üņ‡>öÅ/~ń’ęRp*ĪĻ;ļ¼³īr§×½į/`¦˜µm£ØU>¾ŸĶ%Øu];ŒÜhµføg{” –¶¬HŪ•G%„Šv•h ĶŹ™^Ź%,—UY–ą'°NdŒ±ó·ž=zĀ!6šE ]³Ż!4$Ü`‰ė*H˜8?¤©…U%²ņN#[”<}¼‘æ4ĘĢę%01–%0)ŌųĄ›»wc źb6ą‘O­”%J??"NėŅö6dgμz¶Ć%ŗP©ŹQOvPń9ź‰F RÆĶęAȁۚķßæo/Ÿņ”§¬Zh÷ޓҢÓki?Ć€aRØ “bQś%D“ĢęĆčõū”S<Ս·ŗŁĖf6/QAÓŠ|^‚ŠŗČঈ ­ÆGĀ]ŁŽ“ZĶc«¼8f4:Iø U—įō²x· ŁŃD+UŻ^šiH3Ą'>ń ¬«%‚åGō”f:ßIģ€G±Ł» J£äWJcµ¬g³Š?vY±¼A]5eik¬ŗPŽ0LʤµB…(ĢI^ż‘9Tī ,9{ŪLaßd>L`|N3å0*„žó?’¹aĖˆˆB2ä5QĆā,€Ē¤$aā‡8=Ēȇ»n³h†n¢»{O Z+ūrÕjÅ'Č#œr`9×Å嚎’Ķl…sŚ1€øiÜ6Pq¼…y¦±¬–ÄäwŪ)¹ŽĻZlČé&Īūż,Ńlß,Ęh²3„°’­ī+ębż•V/xķ,qXœHԜōĘxU>¼>Yn:›=ŚZ©eŪ—½æŁC:2½ų•©Žė£Ŗkcnj™ät ‚VXWĶĪ=ūņļ]nwƒ&8‘g ¬•^Šā€Fsčʗ>ī™ĻzÖ³īöĆa4 Ž.½‰K-ÖÖÖVB„kāZdv—Gćņ; Żg‚B b†djĖ“Ü!®Ž4M÷æ:‡ņļFģŽ½;Žī€©ś\›i#‹’+UŗAHŹ]Č0 &–ŁĒį §$įŁ@Ä&Ÿ­M”e)Y«BZŸ¾SG „m)cAc³\jPČ PsĢ16 Eī,zv£ž‚ććė ź!oźtÖz„” -`eźÕ\ó“^ą1)3ū\čŁ`hghØH4ø3¦\_™jD "­Ō§>ń)8n÷īcO:eŗįČ»»°i,…F­‹Žd‹YG””£×’ ŹR!²t4½QŹ ŲZQĆu]Ļē³6n.Pt•~!+Ē->ŲĘPQ(Ō*v[ö Ć‡¶ęóymŖł|fu ĪÖ µ‹³]‘}ÖZOÜŪ)ėŽątT¬³E·į9½£‚®³öP…cӍv– ŻJnŖīÄEć^ŗ_n$ŗ€lDr"ķ&’¼jŪ€ƒN”1ŽĮ&Ął˜øżæ/|ü“ÆxÅ+H³FfU–µ›;%qˆnō4rąö“]eó(ł*ē„å!6"¢į鯲̒sY¶¤åjÓŠ [e7ÕMĢv.¬ßz@’geŪ;é?uģDGVUL śņ¶7\{$   -)©ŅŚMTōFÆ‚a [āéõ;šBŅ1ßwkk„āœ3~ėØ:ļƒį €ĻĮīzŽpĘ9(ø›-cÜ<τޔ 0śtäžŪ©ŠĪŖN-J±öŠż»·ÆdZMiépZ¶˜>īžfq}Kąé‘cHĶzb¼)bE¹8!B)e²¦°³„nŌ öåĘYzēŌąøŠ¶ŸŖL¬ŽB.cwėYą{öA:®ĪČT ģĀ®=*ɛżōį²żWrĀÖ\¶8”rVüď?AĻŹœRī:†Õ6Šaą«xq“BC Æłó’qžĆR ¼ü2O«˜nā]Ÿ¶o 2iK’®ėz{{Ū¹Ś¤µ?)į“?GŚ7ĄńHGOÖKoā"ŚŠ®ć—ē­uėŽ ·ˆžĀU×¶u×¶X,‹…żakЛƸ+tÓŁ-šj/G_āö䈕~āV™ŻōŚšpxžś¹åD÷Ą€ĆÄTĢē'Ÿ|²aÓ0­ļŚå܁0šžµX,ŖŖ‚ž‰‘}Šk@˜ķ.….cŒ§BūctN6aܘŁĶ{ˆ5ß@»ėI¹w6Qģfo“jšf¹\ʤ„k 4pĮŻī>UŽPFŠōé(¬õ]Ć·Żķ^ˆęäat”$I€ŗnˆDŠŪ3&h–˜”H‘~`5Š™^TKؖµRø½½½\.¢‡ož ”Yź]kÓ\uœ-{ŠęęFQźÅbĮiŒĖр^7ß×lŸ^ņ|"Ž{“,ļ®Āü É4ŌŃE4„MÓ“]ŠH†¼ؐķA 2 #2Ė †U1ƒŚ“•Į”÷č ožÅ}&” ŖŖ²łRBØ«u»Œ8Æ ö`ŪpÖZŻć~÷żżWżīÖĮCbrŸžŌ§Ģņvåb±€VqGV¬®k'’{FļģĀz=gqŲ{—qŒR Ak…ˆVÅ2łŒMÓrł©EÕ±®õ>{˜nōŁEĆŲ> qśĘ‹죣ŗoß>‘ƒiM 7-ķfĀ!ŹrP˜V„ ˽ża7åŗÄ!²˜”Ŗ*’v›†«93ä%tŪČq°“Y6L¾;ό^Ѥõw°\.Éxƞ —­ē°yžWö®6øž“՞ńŗąG­ĪIAUÕn• åó!ėZė¢(‘‰ņįĪD„+ģļ±4‹Ėīmq|ņ­µØ eæ`špĘH<Ś­Ķžz"Oē§Ż‚ ꢀQĪ`;p›Ā1äP3ĢŠ4”½‰(ra¶ņ¾[Ł©nhRæ0Ą¦™·BŽā¤µēģÄ Ó •é)"čR|įSQRīĒ–&§ !—¾¤c@‚śšįG<ā7\ż·æóķ"” ĒģŁūņ_žå_złĖim†€C0FQ#ĮāŲÄZ<£ålŗ™“żą©(ēG%Jw±©?’”n»n?Øėz6+r“c‡Ī4>¤ŖBiČT˜ˆ,X›ŪiX„ @™=a·`–Ó*¦üoӐ֏ķ¬ [Ū§0ooo Ü:ģq \™žu3‘ņSŚ„wņÅĶ+Łi-Pōś±"e0i įōĒŹG„źV}–ļz›³.æāņm$¢‡]ņƒƒfnøpŲåH/]ī`¬ Z,‹¢ax ÕŖ³c½Ń§Läåīs™ŁŗÕĀĀßxĆÓSŁ"¶^VXÕՁ˯Y[[Ū}Ņń€@QZƒbfžz£(÷ķŚ¼üŗė •ŸXzˆ.c{{¹>ŸŪ±m­˜ķ·#Ä‘īˆ±3‡bM«žB†ėŗžÆĶ:µņv-Żx{…­źfہjq`œ× ˜ViŠDéüÕvĶ„¾I‡>™ŗČhdįŁ+©*ų~Óž|ķl>Ł×©²Č‚ȉnŻÅ.mL²¼£–'iLą²Ō‹Åb>Ÿ#PŒa- pf„Ū.—oŠ[® cLü™ų—åW?’å/67Ütćę¾c‚„+Ŗ6DF£K~ż1ēm##D ¹³4ė0ŽŅŃĶ:‡Ø·#Z©mæØĮtĖūhgŒnŲlļl‚ŽÉžģó#“ĪĶļüęo¾÷½ļ’ōEµI  Ü"7H¶LćĮØPg‰E²'2юWuŲP;“]Ó4"mčėĘ„n1ėĀZ^o耹!CD³Łlų°+„$ą\.—eYu†æQćć;ōUå‚:&{ł!޼C½ū¶ĪÓ0ÆÓ4Ķ|>÷„Ā}55cØŠŠD§½Ē£Mlęö¤ ü‰t‰|†Ę­Łg ĖÆĢta­éÕäļŸHłÕm"jÜj Z$؁Pä­ WĆó%UÜŁ6Ę‘ƒÉH¤“SUÕ|m¦Aō(rķąH˜øcÓis›ö)©ƒh(7×?ņéOrU>|xkkk’žż`h±Xlģ;X÷IDh„ż˜‹÷åē`>Šcø•/˜Ś ]ÓÓčeD8“L¤Bɇó{1„+š"Z&Ė`)A0€'Įb -—ĖĶĶM a<Ģ` +@„Ń4ŌjH¼ˆˆ9”sĆ”ŪŚ(fX”ŃИ. °J‰*“R½hɖår%Ąl ēGēm>, /—Ėł|„IŃH¤“¶Ėe-ӕ½ <Š0הīv _wŻu¤ŠĘ?l;Fd+'At"Į0®>j5d1½}ȎjnrŪ a‚ŌĒŒåt½·čʧ„ęéģ½ß@hčņ+®ŲŚŚzĄIEBB…’ūµÆ#šśŲPģrŖĮ¤`p®Pœ“Æ=CčO¦¹]I ‘ ®¹ęšO<±U;h¢ĘJi#‹ р8&†5‹|ž­eųÅŻ¬£õٹb„Į°łŸ‚\·ŠcKŁōĢMŚ·ō[Čń­N(M‰a•IéīÅj$śÉÖÓūŽŠØÓ| ¼Č¶¤ÓŒ}å0»żVŅ¢wźč9ĘulßĶ,>ż¹‹LÓ Ą ūŽŻµ{ÆOW£EÜT6’’’dF+×Į8Čaš+7öSļęÓ@ŲRaŽ÷ž˜ō[ā%‡ēĶō¢(pjŁ$&PĮG=Ÿ}3Ø“2žÖo’īo½ź÷€XK ˚„”"k6杈½–„PVS=ų{%§”śZ4Ž—cē ó¢4 ±°‘yŽ&ūķVž}ž’Ę(­‡L±W½é±¾k÷ÅģŅLÄÄuQ”„˜+Ų|!»&4…Ńāź¹—\ég|eRäE|×cJ½æ8-€6…ąh df’©±Qܑ]¤lŒDŌöŠŲ9>MHŗ”Zkæn$!¬t&E”o¾6sę§»P@/õāHb{%„!½ā„MN~“XÉhÅĄj>_/Š]Ēģ@½±¹aݤ!„+T­€.#"1©V؛™«Ŗ’š=jď*³IZ¢»›Ž»ķ$­{”`™Øo©ó‰ąą†Hź"–®Ćöf»`4µ1Ęȼ_QEQ¤©£=¤R —Ń> ź²D™ɂ9‘w¬K¬\ļoW…£-ÓHffʰzäTüIl’·²‰Ÿė§ø W•włpj›\g,5‚ˆPU•¤Äė…ł#Ą~ļQ«‡J„ć7÷@mVYNķR®ā„²µŪéģš]:ˆ*G[0eŲ&‚ ßŖŌ\«ØĘŁ0W ›¹Ž źæ½ś÷—P?āя†ł_ßłŽż——+€SO<ń^óš>j€¾¢CGĄŽĄŌ–x|V„¼*¢Cc’Õn•Ć“N>1å"rx²,ˆLUUuĶkkk-ۈ%ﱓ©Ŗb7-ꇮ6šxūyr_ƒW]āˈh{{{mmMĢĀb±iO”»O,”’æ}ŠŹŁ‹•j<ŠˆŖ4~ź&ē¤y8x"ś:ŅīÉf„˜]GKW}}3fvž¢Æ›g«Ó,Hōlø…”Ź~ē[—ž—W¾ņ¶'ž¼om楁@ŲŃŹ\e»o31&Ø(/±¤ץZ4Ÿ&Ÿ”ć0MA{Oyƞ˜Æ€A!DÜ;¢„Gpé;OÖ®€@8ӔBg­°‚TڐŃZ#`Šāa†“n²j5j˜Ś'ŗZI–Ąƒų®T„ņõ)Ś%‚£ Ï0Ā,ӗŪ߈Ī)}Ś$9Y§2įČ ^qŹÓMiҊhĢÕ9& 6Ƴrbj3Ą’åD©Aä8‘2nyd–£ŽT’5Ɔ=^Qb„žšŲĶ_ēb±(ŠBė­˜ŖVŽÉ¬ 4Cen„óÅf%ž°ģ¾ŖycØ!Ūs¶„‡āžāƒŖW]ÖµŸ–ĒŗĪ6śoLCLh˜”ÖZ:kD$ uЊY”;‰€H,4E~ŁŅO†G€oćl`ŠvĪ ÜpTn}¼ZHPģ—Éél} `īYGėመ(H”‰XČf¤±/厢ŠółĢ—cÉmAV*‰˜eZ ;°Š$”EYĪDfĘe1†żyöāņ¬A¶b:=’ńķW]×n,Ä^Ķār*ĒaۜŪĆ"c`Į”R:µ!’+X¦å²oō}e"c{Ģ ŗś;—)„†ac¾€F‘AZšĄłštė–­Œ7—’Œŗ7NŹEĆS»Ć×Ó7s2©ÉĪ3;:l+c"7FpļĄ<ŲÄņäŪńµK.žŪ’õŲŖ”2ÆłÕ_łsī½n*6Ozę3a¬tØ*Ŗ1„Q„°eœžsībÜWākc2“Ņzm}}mm ūÕ Ņ¦z&ąvŻé~Sļ§øŲ#„˜jN_ÉS׋¢Šŗ”‰'„Ōęę&€j8-)‘ūŪO°ūėŖKńč–Ų‡øÖ&ēicr¼Ń höŻä)ųŠŠŁźI:֛Ź ›śį†¼Ē¼üÜQŒē¾“·o¶~ņlsyŻĶ°Ų>s’I@ cģMŪhE("s'› Ö¹E"Źą™y<(®H(-Ł×ö÷Ų|ūŸm°GŪ ŖÕaмpßoµo« j%ł0L–7›h9³ĮꨩWJUU% ł‰‰\ŗ½ĒÜV:Ājco…Ž$|ŹĄŖ{„#O9ź įįśĀš‰ŽYś4ōpķŗ°t};šxRž-ĻRła@¤!/C«}ø£U¦zšm”é5¤s¶Ł%™n]q$i(ŚéæĪµµµĀĪ Y‚^T•óŻ‚}VJQe·ĻźÅEn"nšf6+m'Œ±iL1ÓJ)QƓžĆŁŖ'&Ģnv4Ź„ÖJD„.ä-©‹±…ŹēĘ ˆ5vĀ0NÜō×d+=ēŃ+S­š|[·G]ÓtRE(r£nä“-f{>V±Š˜rV8-D”N/¢BA;wµC‡C¶=(ņJąĄĢ2„÷ąf}1©7ō… f«r¼Ņ†sõė kkkžr] 2¹oÕ¶Ü³Hłōd„å鄝œĻĖ)é¾šŗĖV¼ł|ŌĆ1Ӛ™Ļ»ė]偊L–qNźźā[+•÷|’¾$y¼]˜{ī£Eč©ö²v'8tĄō†[š65°ē“ŸūāŸżµßśĶ7ļžŻļĪwūŚ×¾v(®žžU 2¹ńv=w“·ĆĖl'īüÉI“HHGÄ"±ķ0…‘Ł™¢(ä,Ė Ņmuc>RōBp«”ČĄ  (©ń±bGŗ†ę3Ė}R!X×6ÉUø¼Z[ę³u¹}ÉՉ8*ƒF¤D²ŪGæ½^ąhŌĪW5£ Ua\•ɇwÜ#ÖÕČV'ĮS^)6X”RąŲŖĄ™ō"®Ģ2Ą_¼ķ-WT‡÷Ŗb¼f*@h{•Įy1킹ص#=i‰“ÖM!:@YĖ{„¬Ŗd•éXf E°Ē|æ“Ą¹ƒ Ā(¾}x§M¬V§»: „„“1ŻPzz<żOļõŠ)„—™¼X Ü}ä/Óu:˜“Œ}ĖØd\DDę•G$`G’B;ΊūĪ»[ł#Ͼv\RĢ_[w=čO>tœ2Öcް>§ö ŒÖĘA„oŃ*ž>('õŌ*ÕÓZÉĖõ-ä#ąR±č‰“NŗIŌz–zÕG.⇶Ę©µ•T €¦1Jc]5 ĄeŖŠ‚•ŲtjExeK’ļfó^EB@!R•9@hLC ™]#WaCŒ…(ŅōŃóD’ė@€ŁŽ—_¶ k„ķø‘qѺ̐<ƒ™b_ˆ,ĒY)ģRĶ„mßį-AČ-%M­ĶrQA2Üā³Å@+š³UkJ˜½Ā8 E4R3“³Ž²e±æR0½m˜=*UU M±+ņ¹^qÓ4ŽJYõR‚næV- yŅ q­žtĪÅŃł€åEć @·‘"öNE6 !&hŖo~÷ŪucCČCX€Ü1Ž„;‡·eĻZö‡Yfęlםż’@™r…+降ūæ¤Hļ%ü¾Ē°ŪīžŁ3E†]SQĆĖ_ł_śCTūś—nĄ¦FØüė»ŽJ1Ē,Q}7Ūr@’|χ­”ČŸtsÖµIļĻmN­µ}xXÄ.!”Ē£2 FÆōķ"Oõ}Üą~=+·×ėh“‰L{§Žw5hfF=ēt#łĶĻaĒtä­ą•ėtō` ^µĢskõu!śš]ĮnIn'ķ1:ļ)Eł‰coĪ~zŸƒˆ)ŠåŅ~ŁēŻžO}ö3Pāaj*€ū?ōĮ “6n·«¤Š6Ž ;ęO–”i&ŖƒF~!ė)¦S={Ło{=^}*K„›ņBĆ0õwĻ)H©×£Ä>·9Eq€–Ū …Ŗ£"甤"ŠJIÅó¢(Ņ@nø­)ų{Ų32Į†qg WIxbÓaY¦9ŠˆŽns/Ś'ĆVńؤµ#;°I1£Ó_Ą_g°¤ Y…»iĢr¹¬Ŗ†(Ō»ž¼sŒ”ŗ®S§¾T\U6*ė|®Ē­Ķ^Ž‘ŗŒ 9ˆķu’ P“f„YY„ؤ4¤“Ā㢬§T‡ŽqnoŖišhÄ@(`R‰ÆīģGāQ€S‹/SpŃŁ:=‰ž÷‘ࢠ֛¦‘Ab…PøQ…L"wģŹŠbńŖŖq·^üL:Żl~Ø żŚŠ£vŁgĄcū¶éB÷½ŪĄDłT?ƒ• ˜P1Ā=ŻżŲ¬¶ÖĄ ŽČG;xŽ`;:z"Qų×ÅķNÉ €š†$ä+Ė®4Œ­vÓčX.L©9£Ō[]h›ž€ŌoE/¢?ŖChM Ū“x'Ā=Ņ7™ČĪ5źõVL«š~QĻÆś(R«µÅ~ē¢}®Ćˆ:šIĖŅŽÄŒEQ@˚ØĖ¢µNŻé¢˜ŲM)^¦ī ™ł™kŖDVĮfn؁°j>ōŽwŻxŁ•’śÆ’zöŁgÆ­­ķ9ż”Ÿzžóč˜RD‰˜ŗ‚±1F YĘĀlŠļļķķķł|0CäĶŠśœ™P¤JµĻMé]ÉØPĶ ŗ_d²:LÅ\…ŠČÄÕ¢žĶ _ÜČWÓ.Š‚ō„ČÆčė–t#Š ÜIüp#ķĶOCyž;ģ Œc2k¢®ī†p|†ģķ¬ŹB$~ćD˜Ū«EfLÓ¹÷鞬RČÜįq|*KśŸÆžĘ{þ§)µn€ßł¾÷l›JŌ|Ąó\Š·Ä€HĘP©†²ā¾ÄW”°ėk³»õ÷v/{„ć±=в«D££Ö?¢Źwņ<ӗĀ'įG£€€ Ęśߞ¢'’.£…lš#įö‘ä–½|8>‹-ھŠJJQ-ŸżŻˆŽ’]_Ϭ²Ł²€÷ŲŌEy½āNœĘ© EŽ%†P¤ ¦Įģ³Ŗžl”ˆ ZÓ4ZĻĄ›ij#/.ĖrŲūØiG|kI#B„4§øŻHc ,’¬čh8÷MzGłsö›żŃtE ä}ÄŃŁŌŚM F«Ŗ€YYŲ© ˜#(“s xĀŽÆŻt\Ēs^öB(åW¬ø“ ™Ģ ˜3żrīȄ㠯æ«äb!T •Ī ydi·‘ ŹžqgS’G%S;Y¢µt)–xe‡Rʲ}zźėń½§Ö ±ĢT(|±óAXxö‚³ŌčŁĆ½¬Ļʵ©Zpaž/‹#F„ģÖĶVm•óG~{{{sssłšh²”vAa2ŠļÖųź+XŲ}˜¤RŚ“QJ|„Ķœ‹BüfK-‡,ų¢!0?°ŃŹlؐņh@vPÖmėœĖóõSŅ “ń¼£;YŲAŃähM¤CyńcÅ<¾ļJ²uīl.đŲBD_S{Cöś˜”RH]@˜``DäʃĀzWR)_Ż…~ 9Ņȱ” v¹œˆ•eY–($')ģā+D"P „ŗ]7•ÖŗPh–Õ«~ē÷^żūÆfTÄ“OĶ—“ܜ­®¶ŸrĢŚ »÷m]ŗ…7Ü{×fU(kWU•ÖZTćüľ/h³²«U%ƟĻ×Ūł4DGÉajŅ… »%±ģÄŠm#ؐcv>”kSĻō,晜m˜y#²MB,,ŪĶc—¼•jÖIĄ»ķŝJ”óOˆālP)$bU ±%ģnõ{-·§ŸEßӑYŪ× wT”££e·¢0ė"-z3­'ÆŖf6+ÜȍŪ&eÕśŁr- F9Õ2ŪB †µVĀCfĖįѓQ4+N†‚¬ĒBZQåņ9[‡޽{SkdŒf€†·n<ųš×¼ę·’šÕŻē³ŃHL%+WņÕo|ż’~’ŽÆ+ą§=ł)æö{æFRbŠ ­¦ų‰®ūp虾k}` „7ÄÉ49ƒķ+ 2³HĀ\vvś.ś×h~”/FļNØi;ž)ŌBv€J2ü™1"r:vŻłeWƒ±œ«¾ ÄrÅ&@ CŗPF쾄SsD V½°ą €>¹ŗ śŃė³±š.~¹ µi ‚W°Ó(Į“"D'v*ē5jk ‘”kq4¦ig.0Rčé«WŽöµüdŪaGEpr¶VZæf¬ƒomxkµb3Õ„7n µŠ\²R7qYӊ±G·Œł7.Œ²„å¼n3ėĪ€£Ģæ¹qė(¤š»£‚VhUėŻ¶4ĖŹÅ Ž8›„ø $‚ļ¦ Õ©;vf9å?“7œĶŠ®ĀČĄÄ ±ZTzm“RŪ‹ś³×¾īękÆūģg?ūģg?ūģsn'Y”’XČjQxĢ t%¢•P%H†vÕó8Su¾ŠEĖčtXŃzƒTIvĶóŹ •˧PFńµƒćBKR×Ę'®é"ÅÄTgI‰}#f®Ŗz&2 ZMc¤‚oż):0¼{sŒ†’°eL`ǜük7‹‘ž…L.GĄŠ5Y7iÖ¶ßŖÄVŅłŠĆ»vķ’@ w<ˆŠ )iåĻ–3¶ōøŹRå†%Gf‰FśĀŃ,ÆMK¤RĆZw€jw®µ‘ÕJg;§×Ė&2ĢOįżŽŹMRț°Źņ9gšOŽqЦ*ZóģMüE%×EčŻ1gøėDēÅyy4ž ä¾<'kv{3M˜³]pžČ (O©łe딋™x=ńNķÖ‡””±×Įæ†Ķɑ«ĒXÅĮŲs uŻE‘ÆŹū—Ö„4˜@}ō]ļ|śSžŠ ­•k¦P7oŲVZo“€ć÷ī~޳~śŅK/}ė[ßZo®)T ‚,g±Xh­„W쟊½Ä4ji™ī;†aLTļč±%gb„3®n@Ą=xź04ŸŚÉiŗ<ƒ†-@ŒŌņ;Nry>„Ó7f„4œ‹¾w‰¢?w¬“©¬@’²uVgGĄgšįŹ>%X¶ļń øāŗŠ™@ŹNīdž%mĮ9āV6MÕüŅsö}ļ{ßÅW_ Lu m¶ĮŲJ€0üūūŽ’čżSئ! p蹁µĶŻĄL ÉAōōʇ}z½< Lū¢ö@ŗ¼ Ē«Å;–YrŻ9æxŃ7Į…D£akßĖ•]”“H)U•¢(ÜåÅėć¤meł܎f) …Š:+Ѳ¾[ß !¢-PRV2\UÕl6kck9kä¦ŲC®”E%+ʁę nuāä@t”Č“Į"ʇÓr*¦$ čCü?Bø™Ż`ųŌzØ 2Ż €°½XĪf3JjdI÷I>ÜÓ1†”ź(įÉÉ¢©A—`ģ$X™zR ŪCK±<ÜR¦';/f¹żV;xÄŠŹ’ÄŽYŖ¾ēėKĶwė ³ō*8bpĄ%®²ŗ;bŪz­–µ …vł°ķ+Óķ@›…jO/ŽkҾś@˜¾`÷üP½>¢ä ?d¬Nk& ķ‘„čj78’oųŪ²Æ·“¢±¢”8z’īÜyń¤(>Zc¢Fc†øɰwßSČß/O€ęqgå\&Ł4M9+ś*}łżCõ†³E“˜ķKūšd¶7ĆĮ09"ʌŒk&ū‰JÖ«f‹ęGŅi„U­śŖŽÓłÉWå'‹j£„ TŅHPˆ+„gą t0®i÷øćÄ5"`ņäה”ųØ»¼t«;īĆČ10ʰqó“æt÷+*SĀÉŅ!B‚ v•B/t #]ķ? īBO–¶ąÅ_śŅć~āI ‘ø”®ĻŚ<žŲ=§–óŁõ×_ŸūÜē·ū·=~’޽{õī Ų\›”e#õMłl6‹˜EmG¤ƒ$`UUą¢sŲB \xÄq£æ£)fA¬Y:zpß,'v$<"éņįī`gņa"A…“`õÖ¾7Mc”hō}VwŃ2õ„ćču§=ÕµDüÅw&Ės­Źqēk8ÉT”ån„ŲĮĖāĖ‚4¦)Š‚‘P)öS”¤…˜_fV`ŃéÕ²ó„ ؐŅJ~.‘ټ,mńH1)*>ūńæžo’jĻĘą“.ÜpćžćŽ/µCBn~×;ß©””ą÷^õ{kė›ĮsoŃÓŠ)MĒe’u” śhŲĮ£Ź›V2ܙy/£ŌŌĶŅĪG0Å̚p¾_ēŻ‹…sø&Ļj-Џ®7Ÿ @é('1°ķ0…`ŪuČ Æ”’Ä^i^‰å²^ßXs’Ś…°Ųéøöo$gFPČ~Y„Ģł~‹Ģæep\ 8„ŠƒAõĪᚺ-‹“!øĶV¹E” 8uV?x-ĖRkdVĮŪ"ŌuS–†“ˆ6Įs¢“JZ6~±0›ŗ™óNērx˰°™}å Ś¶žHš£¶0h„½n#P“v˜U:ņC†u”ŲČTŪƤīY WŽńį ’=d!vŲ"f‘­[TJł)au¢ŚØ¢, Å!«¢m‡ŽŃCd+5i`½rŠ;l•ų=†jØÄÕ2Ė“37W­ć Ņ>*źoNį¦I°~{6•ĒĶ‚ė÷AˆY~šśFµ¬4śØ+Lßq:ŸżI)įĶ‡]JļõÕW@B­ĀD’ńŗ *”Ū€¶ä~a¢,K?抑śŖ£5ōčS=:;3P—ļū UYėS©?æZŗ’źūœo"\©";Ä4ŠżÖZ+„‡5q&&½;LAŁīüu^ķčŅYGßSŠl“į0„2-ÓB‚G1›(:) [5oG•‡kõ+ʈ€Z :’5·éZŃĮ­žūæÅK~ńXŅ š ÜéŽw|ķk_{ĮlsL—ˉ(±a… ČFKĮÅžĖøÆCIY—©J˜āGʒ¾J2Ó„²^GXŲ/Pˆ—%V «ŖžĶJ ēóZ¢…ŽĻ&2Ŗƒŗ66¾ō†pŲ vś ĢīĮ©nŠĀ>>»@Ščęø8ī„a˜”°ć¶UīÅņśŗ6e©Ó@Į ?ų€.Ovix É(`ļ ‰(ļ„cŠWĘ C]?·ļ5-6ŪÅ ĄÜrķµÆ|Ž /¾ųā‹?ņÉė®»ī¤sĻ<ļĀ{žÕ_¾įé?żÓ`P`„š^üŠžēžā•ß6ĄˆxŪ3Ļ|É+]ČCƒŖL‰ v`—"ršhĪp8‚æ“?ÄB-ÜŻžÖN Żō‰¦!ÅąD¼¤„9|õ“”/=ąĆ¢\ŗåį531]ęķ½ƒ)RC`"ĖÆ Š6ü±KąIŠ6łQ¾‰HĖ”ńRĶR·UhTvøĄ£H`"ŪĢ‘¤~Ŗķ? ŅK@½l¤š7›ĶäNmU+ѦŽLGĻ~ž[ ’ÕV?½̚\Ū2k·°S¾e$$žž½…b­žUU’É 7æÖķń8ĆQ™Oo± ™Žš¬YT”kĆ&Fń8ĪE­µ•k+kĘP7šė“ MÉ"°³BE©9GĘŖœ;¤*lNī«vy› ż!xŖšŃgZ:6āg3‹‰™ž’xÅöó;~d¢]æō°R¤ŪNC±©ŖÅGUløÓš!Ün³™†¤„ē\Œó׈«;D’ņŽœĻxŚ+š%5—(‘³+†–ntŒ(Ėf’\³ßNÓH?čĖXŅ”!;B•66³5ė£E&²³WZ?ÕōrCć}D }c˜”$ pȖ)CŲfĒ/FĈ ;’Ņ<ŗė$YńQL€SøPśæÅĪŽ4>܉X…æ>_H”{ƒóG-ĄŅˆĄĢó¶EÆ{ŻėźŗŽ½k×r¹|ė^’ø§=ʲż(Ūp“|Rɜ “R%#æ!\9²ęĪSŗģ4ŗyD“’ŪŽKn]šŚmf8›—Õ²¾öŚkµÖ'Ÿz’ßSLEū”ģē¶ˆ+qŒ²¤Üõv0œ ³Ń›Ģ1¦Ś@ LO¦Rh˜›†…¹Ē½½,Ņuׯ°’q29,ÅŸkJųuŚ&U¢ēŅžæÄĒ.Åŗśź«O:é$ ¬ņ¼»`įd@:JA‡··X«¬Xq¶®?RxCšŁwŗ†(wč/@…­µ|ÄSžpÕeßūŪ·żżĖ~ķ埞ĀEąłĻŽuWżąŸüō«ūæ¾ķļŽś¶·½m’iĒīŹKk„ąœÓnóo^āC‘Ż^l™ vŠ]ÉÖFCźćŅ€7é…8īŚŻHįJĘ}gÆģL˜bßóŸˆ0PXAĵµµ¬!»Sm»4„PPQ–®ł`'¼F#¶ŒlP3ذćHŻƒÅ‰x9”“1WŻĢ°Ÿ“Ųa^†ź­yĮ®¢ģw~lŖĆ-?ę"ż„“i8—P²½żrV”e!Åg‘˜l.”~Iс™ÜŌzwŚm®µvI½Ų+"Žą.ÖGĻž¦gƒŗ¤­zŠ}@;FŖ] €0+‹.q²Łx0„ĘĢDP×µTXB/ļZ9 ^cßŪ“‹/é„ģœ6ÕL̵Ü2“³ŹnŸUęŒ!J;Ćģł]ąjŒ)PC:.$5@ØėZėRRŚa°“$\™@h‡­•œ PQȹżĄ`ł^#ŸhĆ-ōŚļ Ģąö§ķĄBgo\)U…ʁlū“gā"fĖŚU^XŠj3ĢŪšĢŃp!GĻh”}#®løq’|+¹õ·Ä >ŸBń “ąs¶J$¬Ū–ø!Ņ©Ƞ¹wMĮѤ`’A»vĪ@$ŠĒYÖ€Ņ'īŃźémT¢b“GšŌŸ3P)Čb4Ny [zZņօō®ēœYķ㠜²‰Œ—Ær³øćŲ)_\;Ŗ™ķB¦ū_ä…č§öm#‹,­ŒÖŚŽ–įo [kq»M©ŽśČMÆIÖd„ŃѾܟ†mßÄŠ“Ÿšøw½ėŻgzź 7ÜpÕ”ƒ€Øv:®u*–Ö(¬ł¼ł{!o¦J,”09w•ģĪq¶ƒ²&ØsRłńĒμdUžnLÓĘ©]Ų4 ]A¢YāžZ±i]ņĪķ÷^Ź©d½KO¢­zK±Vł~ƒ'žõõęµŖŖšĻēJϱ­\ä°h\i­;0†hö)-°¹1fčøwf.ĒBSüæ§C2„µźhK¼IBFb`ņ’ķżļ{Ücsņ1Ēnz„£é>‹č®§ün6°)ķ2NG\ 5ŖéżįårY…ø…Ó iHĆb%ćæD»Ć ŒČ„Ŗ /Ģeßŗōī矷µ]•eQ×Ķ…§ūÄ'>ń—žč÷”e‘ĄŹ@©«Ø„˜Ń ²āa ~Iuv]øĢJaÓ탬‚ąĻéģ9‘ĆØ7‚8jŖÖ•¹NYżķķķµµ5łˆL£8ųܜr’‹­UטuuGŸMźŗ™Ķ 'ü(<[”™ ŖŖÖ×× £­ēłUXŁ!]żÕK"TČtšŠ€ „öpƒqAēEȖØķz2%˜ąšŒ›¦©ŗå†›~’÷~’Móę%Āg?ūéÓo{ęqū÷·æŽ?0ŗuOæ^Š]–D4bš ½ä̶vDÆåŖ³ łd_6ś)ŁłˆĪ³o»ęóy¾3V”¾vw‡Uiū·MŪæŹĖ—łŖp¶Ÿ}xg+ł#‡‚ŒÕ¶’Õ™\0¾nūŗ,(Įé…j*”ų4Ō•m,KūĪ‘ē3R0˜†¦@0Zė¦2E”ƒęIˆĀ²³Ūj„ŽÉīŸ©1›?§¬?#ÕżVœ¦³Tņæ*Õu]…€ŠēóY'G—ŲgKkuŚēKĘ(­EYĻ/¤*2œ7uĶŖ8xüŽrmuÕŲŚ„Žl`°ĮeŚŠ# WŲcB”®›RŅĢģ:˜a„ņĶN$֝bHz“’:ś(ya–ä)®/ķųŅ;RtēSTz _®/0%B.“ej”“ĒžwA“„öoļč9“'„ Ŗ§·Į I2Ōę7ŲŻfvwmŒišfmm-É I™œ ™Ģ­Ó[ž)rgĆ ‹i42ģ\’k[™Ģn«§”0ń DņęøuųšĘę&ƒŗw"=E0!¢©É3[+żĻń?ĀJÜs+Χ2Īk€É0 p$‰Ó0Gń(Źor»»Ó«ƒdWżÜ>2ķ¾‰ĪćÓøÜVī¢Sp˜‚>ŁX…EzČ\WEŁ Lzęė÷Lś āž™Q¾goņ-«į$h“čŁåœÄŃźČ ·ć Ėår¾¾&° F-’Š-·<ėéĻų×÷žė®ŁFS-  ą‰?öä?ūƒ×pņÉ 7 ķ)$Z+Õ€J;¹be¦¼¼ł'w ä˜ŗcēgó™ˆŠB‰xI;ׁˆˆZuр}:ö°*=Ī Ÿ™Š„9”&{ĢĻ"ašzĒū-c BĒā‡MC4nžł“Ų‰Ÿ5yz'qČč8õ0ĄdĶ iÆĢr¹\[[ÓZ9Ī.Į@4Ƅ®VWŒ_f‡łj‹ˆQƒń•wż*ĶHÉMµĄ•>‹¾9–Ó³źJ®j” Tó‰4 ŲŽŅ2"b‡'»Ø>\ߔٹx}ģ ų*ČõPŚ' m¹G“Ʋ¹y$4]m.Œņ%õ"jtQHŖkH(e5x½Š5HDåL‘„s°Ln„~@$ćƒm”\Rųkjćņ{: ‘Iƒ89éJ€¶3ļh`H źeÓMõs¢ÄęŁmdnrīÓŃ€Šgė8Rņšėž$“5‰z{PÅ7R®łkĖVŻiÕbgž£ra[€år9_[Ė›āōƅ»(ŗĒ§ró¼YVH¶É˜Ģ˜Ä…ڵä‰ö…Ż»Eļ-Q±\p«28\—Ī5vHžˆ•Ź…:‹ ™-‚0ųRgŻÆjoĄ•zŅ×čö£sü>mQN+q:P®‹` [±”Ū?× $>yōLäāCL)¶ Ŗ:üQyźśÓ–€ėŚ)„…5Fd“”˜‹” G kŲÕ¦Wā†ś&„'†%}Ł~_!śiŅĒ>Č`‡\ž©˜¾ŖŖgke&:Š÷ķŹZS«ĘQ¾kkĆ{•M‰;25ō솳ō9Ū¾”x8¬ø +w‰}N?Ÿ<Ł]S\°'č«õĘĖĮ˜ÕfČ4čRFĶv¦·ŖŖr>s&Վ䩮”}͵WŻå.w¹į†›€ £žé’rw1ß»gĻ]ļz××üń¼šåæxģłg! ąĀŠĀŽĄ2nmmmīŚˆ3aæp]WBUŽ–£"ĀŽnÄvu„ #Uyméš Ģ@³.[åK•m­×‰Ke7²ėŠQŹ0v‰}J”8<•ŚŗdØėz6/ÉšįƇwķŚ•‰Ćp…=<¬ 7“PÜņ[b쒜&s¦Į%=—³Õ7NkTAE<Ȁ T•Ü+3r_ńz6%°/Ńj Ø Cł¶ƒń°LXč*\QOi)ń@ź2±?ķ×z†¹ß2ĘhTUU ŁRWź÷#“th¼”­” ŠĒ>] ;N‹üŖæŪiÉ |śx6@¶Ŗ2ᦔĆÜX1¶Ż'|LĀó†ž X»2vÕKc2·€™ć<ŠŽ`Ģ{ÜŽēś˜Ą·ŸSB+§Šä£$²XK*a[^¾YŸū°Ė‡{Ų¶F|SRYh "d?ܙśnV“ż®µƒ b—ž¹ß:[=o?ŗ!ņʓ‘Īć@įT³Ū p«Ø„°Ą‘)O³’>q\aņg‰}+ź[W[@M0܍’QÓį„ē:HĆ8ß×M°Ū#œšMg›c»%…ŲXĖOZ­«ėq\rM›Ą’N»Ū Ž•_Īc€VCUś'¤ŗäÖX•8kŁt‚Š˜005AÅ0}djŲ§$5l;$‡Ö‰Meś«¹˜ĄCaųŒJTD«”öŚź>MūvļIJÜ™jDNlÕ¶^ÓŲ>Jš’3ēžĮ”x æ¢¾n’@ćїșōwq­ö¦_Ī–Ł`W™E ~>µ\VóµYĆŃčāɝ5]WjZ G†.%vė)™v>ņ Ź~N×w )Pč(§Ä£±²@Ā¢kOß!»(–üĪ7ߚFŽŗš£É›«ą:‡ĶD®Ö_¼}kˆŪ7ÜųįüŪūŽõīü»ųįū=ō¬ÓĻśÖ·¾µoß¾Æ^ņÕ½Ēūϟüh …žšs&K÷)£;sĢ Ä^į»Œ±@蟏Żdr—ƒŁ”8›œK©FBŗQqoCēŖėEū5hź2ÄV8®čóth‡ .±p됔eZÕd«‰‰¤LźS’9©ØĢ®D$h] 1Ų• /—Ėõ͵Ž`¹č̟W”VŽt!sfĒRāȾō!*ūznYžśé]åōąEQU•L®:€n ?eŪ`§j«® cŌD—®ŹĄ¼weŚfĮŽ÷¢Æ[m›œ„H Ģw9½KŠ\€¢¢".{ĄHtĢT› PH(ĶŁ!s4™ƒĖeS–…Q^ZėŹ>.eāī5iēŁĻЇœ}ģ/­×Ą\Öß}“1Ō5 shŽčh¤ĮS>߇÷ƒ§FfŒ ĒĘA LŻßBąu2}BŖµū$„²œPG7 ŌJJʧĶōl±Ķ֑uėIiֆćAŲęҽż®®V’SHR_ė°…ŹÖ;b“…KQĄéŪ[b°¦6D4›—žu™fW¢en»Äõ]ø„€ wĢ7lÜCæĖŗšĶfZć@Jœ×†£–G½ßZŗžyę {›‘QŠņJ£”N,ŌŁļ”bŠõņAæ‘crokŒQ Ū‰Ķx`ŗÆ pckI1^&„Mń}ĮŻ%s*™į•ų 漄˜Š=zĆVŃĆqU5³²Ėnj #ę$cø®ėµł,-{µ„®°™Ķé*DFŲŲ‰É':äž­ł€<»¾"Œž§ˆX}Ģ~ŗg÷%RŁ\Č2„ ŒūoGØCŠe(żŖŪ{VKüÆ0Y*2ĄR”z9p;}ė0Ҙ„ž¢<ŽsøH6ŠŻžé›‡šˆąŪYE³Ü$Ų’—] •O"cš5ž”³ \!«²,QÆX‹ź·ó¦ŻÄ ­ øīŠ„_æōe?÷BSׇ~š>ģ’«®ųė÷½]YB˜t9+©›¼Š’ŲV—ŅU€bKÉCZ©j±D€r}ŗÉL•š‰”‹>]—cź„„”"f—ŲĻ'½0=‚6ʏg”N0®¼x•fMj9yNlKf#WcŒ0ō¾ƒüO‰qw’dØŅ˜Xܹ›Iīji”ż¬«¦˜*Į”C‡766:d£ņoóŖE~Fõ·ßó?5:…V§ €±'DZÜÕSpØ)½R£Ų©v­”Q»„ØŖ*ØōMø—‡Žc³Aj_7ćmžä„]ų=Œī.čqN7ɟ Č+Ēb×±÷ lqŗMxČ„“ߎc #äØ( ĻĶO…7ŻtÓ1ūŽ Ā ˜ĄµšÓ®K_ѧף„ Œ}‰»»¦6ÅLoæŃhĆÆŖų8ŸžŚ^~̽\ÖóyąkؓmsŅ1±3@4ƙjĘųfŠē¤`Ż™BvĒR«¼Ńb„ØK D3J‰Aå{kĶuW7Į±ī·?ŒŻĪ“COÆŲ‡qÉĒĻDhģžū°ē ųņ„A"šM‰ øk‰÷¤īMKŪ”ĄF§:˜0~F­ÜĆÅŽ2AŽOŽKéå6…–Éę±Ŗ;\ą#Ż ą’ČN½ŗxĄu‰»”b°­f ø@oWS¦•sŖcœ§häī²Ć]äwqŚŖŻæz8>ʀ>Pj(GöAøWõņ+Ķ„ÆšR¾uf‘“²/ŠhW Ļ ōÕ L8äR@–u%ňH!LHĪ{Fī‰y0†oXæ?ӐR¬ēZś+=÷Ķ†£BŽń_]×&eź<×ń&īpČö\![}xxv–‹…žĶµFdĆļ~ūæüß?ū_7}÷Ŗüą °jŖcŪwŃ׿ŽģŸi„[ ü„ÖPĪĮ/—˵õyFӈcÆģ§ÄŅ “‡܎‘šŖiźz¾¶…«S](ąä=9ļf¦VS8¶­Ž[[~åąĮƒ›››‘ …—Œå2źÉ)qöz"²šf2+W"Ėåż"f:ó=Z¶ļźŌčūXį§ÄÜX(tĄ3KhĮ UÕöŠqBżĻļ3ØāG܇“ß1]ÄpķĆÅŪ"ł{Ē€ŸØT7 Ų—Ć8ž§Œ …e§åØņ݉¤ė3=ādBŠ_•¤h¢2 vź{p!N$“{A¤O*X{†¦‘_æśīĻ…v–A°E"#ēÓĻtŹUœ Ē“”øwd¼ōaxŃ:f›ņĮŠČSÖ³ö}tĄUž«ti®æžĘćŽ;Ögw8,yjBf„ÄNŃm łI ·śĪ)5,<ŲQJĢt°¾@GĢVSCGŸ,µX¢j\ü/oC‚ØŽYb“¬’Ų~V˜tåõ‘ü3åVé§³%īŽ†sSßĶņ*93LŠÄ"ša`o½tNy¹;ūME_h—żŽ&tCŚn|¬ćōBlČVĮ£G’ʵęŅiļ(ÆRŃ2a·įˆ°?%N²å¾”øÆHĮ0” GP0Å=k_”Ń–KJ•ŻSĮeSĪYōDr)qHāÕĻŖ€!BGÓLFœdŁÄuøs8<ī4 ¹8Źąp«~Ew:Žźõ쭟…P-<,Üt•»ž”83{ķ"ÜIÉ Žq4?WĘ›¦³Ņąčxåā…×3·©»ZµC㒯ʲWgŁ®£ļ‡ĪiŁż„3āLn$/lÅ$=®~… 1”MÓ°”@„ɃĢģ» 0ŸĻ D¬ł»_ųŚ«ńמń”']~łe7cż:ōķꦿä^÷wo€żėZéĘ41:W[Ź\^+L¢µv“õ¾v…1Żl0ŁtHuˆ\`ā®v(Ņób¾¾ÄD-ĮbP_įī£]‡{hŠq‚ Ÿt¤Ōwųša"ڽ{·e”Ą‘ö£ń§$±žŚŗŗ‘[7UHµw¦‰Ž hōV?¤łč ūŖ ‘øĖ€ØFDįŃ)AlėĮdOмR©®h"b}뙤õžČąoE«=„ɖFįWö}śž3>|Ųu‰UŪX©”ŌPĄNuƒ]œ7EI+Ś“6µd3Ŗ ém{DuŌ°ųŚ0ÓŖŚņ[ˆ _‹Ÿ¢0°a’4»Žl‹¦†¦i„w7nk¹&—BĒSЦß^ORԈäžP+PØČłū»FģX‚Ė—Ńk«ē ćR©wæ}ģ)½ūĀõOž\tŃE’­ōłęqģcömX%BłžżĒ¶2’vŃęóR¾iŚšCѾ2ŽÉFr"jžOR} nƋ9ń#oēŪ[ĄĻ̰½½]U•L»v·iw]ńqEŠ4„\;!įs Ćģy 4#ØQ¤Œīhö¦üv™uŹVįlĄuzZbķ3 ~7JfÉįDžyģ.ˆX)żßUČbÜSĪļēöĮŁś;Śg†ģ2‚Jč£ģÆ(ōŖi–zóbTމ@lBY–Nā”F„p±X0YćĄ-ē«<­ˆš ’jŖ¤ąč*ŒcĶ^2ÜITІgāŅ=ļJ]½²O €ąąN^Ė©JÉ;ÓVŸŚĮ¶²CfµĒ=F› U^½&Āæ¤z–sRH“l¬æXVVegUƒ<ävG{¹Źję/ øĶŚĪ`¼-'ÆX.+„Šj„¬¾ Ō1\4+P(fd§ Ś) NC_×?˜ÆE\ńlR!½@£”˜t©H(z„RėĮɁ•RY ’“ƒ|8Žf¾Œ[¶–3NČ4Hnn~HYµ® ‚Ą«ö„śÜÄšQ²±W£•f`[?'©ŌįEųČ _šs?øź{'tŅwækµ0ę~ŽļåÆų•~Üćø †ÖŅ5µk³nD¼µµµ±±!µ|“īf‰”«;$uŸį@Ģ®‡©ėęØåŽAŚī0L9ÄĻε\QĄš…N‡×]g ųäthG‰aīźaÜ.Eʆ:ŻØ PóO©uEÄT) Ąšy‰$ŠE LIĖ'PARću0Éź¢įFæę•ĪɌ&ɐˆLĢ`cĢu³¬Bėś“;«ųŽ 0‰ %¢¾±UEĖ>­ėož¤­”nŸ$Ļ„µ¢w¢hž%4±`f@?fǰ€·©›¶ģŗVP.—Y±ÕÅ (čŠ*ƒÉĮY,*­µ@¬ĪKŅʱåšqøÕjŲż]bˆŲw8ö\+AQāø¼Mž³č ÕłĶŲ,qĀųHĖhE|+ıfu擝‘īĒĪun zįøI8ƒ© ŸKØ*31Ä ¦×J†–­žÖ€:…ż¶n&6K‡{;ńB7«œ6-AŁå"¢²Šł.1džŻż§­m’.†į>#)&BĪßŪ äŽe¶gČ4!!Œr# Y”¦åć(gķó%Ÿ”ŽD ‚ˆt©ŗ±ŹTLb€½+*1ŅŲ„¦1ˆ(‰kwaƌäĶŽźāx6®» ˆž„<3ŽJ—éĖŌ!&qščZüŹKž[į‰Ć®9ÄJ+ŌQōå`5SzŃ+µp‡µ ’a?źėŸ§9§ĆJ Ō2é@‹?]›ūĻ… @åłVvāNqjžlstr”_¶ŠĻw²P×µS‰ę^—Ė„RŖ( ēS|Gć1Tņšģ1 N? IT÷ÅĮIMŻē!d§ŽįŸ`¦LJ į@£'tÖÄ3ōŒńĘ ¹‘Ć܅n^"IP}xė7~ć7.śŌg>sŃē€iźĶĶĶĖ@„;œuī×.¾“q{ģI{vbŚ–ĘÆģEr˜ƒ¦“&Rjź’éUU=/Ėīõ!yG7ČĮ×7†Œ1­ĄIē)#j¢‰g³|&ƒčr“}FĖ±Žq_M2šCėž›†\;„ĻśL©ąų1čĀ0ӑjc²gxXKÓ¹źŗj2źD\½µe`ū$¦āo¼zÄ`J<Ń·­ä<¢”xŌ…d–Ī*µ½µµ¶¶†Z­dµ‡-ž!įh¢>@49­Ń ¤ćžQ3Ćģ7,¹T0ćŚk7Y ®JŠĻm›Wk$äPö<“įAŒųĢ}Ī|H¦ż:‘q±ōx-Ź‡ŃśˆnF.ަ¤ÄćūÄ+EA–ć:TŽdc`löÄßi{ŸŪ~}Ié•‘M7”xN#†øäčć%K€²Ōbszd„z Ķgā”8 αO„ĘSTfˆ™_ńĒ;ÉB;Ŗm`’FDÆ.z@Ł„ÄY:±ø¾ął>6]<Šķ1ÓÖŒa­0HéSV¹¬JYv^‰s»šų¦ÆŁÖEDåå['®Ę3ģjCm ¦ÅNkÕW„ĶĢ"z+"ćnܗŚ-A˜ŲUÓPÓ4ieĀdžžœ©M0ƒoѾŹÖ:ƒ÷ļļÄž0k%$G’åŁ‚„ē=Cć3rs4ÜĒ«2\‹ŗčż †>óč×aGéµR0Lž‹üžJ„C;±ĆŻ#SJövZ‚é|šä—VKŸĪ“”8S×\d”“ōm›#²ķ³ø-C ޶iG†ūFSāÕ֗;‚ )7śÕ Ÿż5Ą1’—3hµŅÛҗ»āŠ+Ī8ć +ˆŅ>—'=é‰O{ŚÓ~ģń- =„āžķ‘MńĘóĘĮ»[·ŻÖ6`‡IźŗÖZ”§Žµ2hˆ³”sWm|Žxc,ps¼ņ“¦iJmµ1žżw#†Ļį„šS/?ó ķć•#āLøß?6 üĒŹį~ˆĘ<Ŗõ$'‚/2‚d“Ń ;+ød‹;Yū–½‹é¦›ĆōūĆō.ń 3—Žā}Ö¦ »ÆRؔ›ĢĢĘɳG GUÜz҃ē¼ŪŪmC 婎¤¼¹•ó}Ę  iī—4\Ż„RĻcŅ}ķwŸü<®£:ąƒjjQ/āĘ©&¢²Ō)€\¤Šjoz?"Hī „RŽiĒŅS×õ|>Ø„Öݬe\„ŗ:ļc–ĖåĘĘFŸƒk?[¼qׯõ»j™”;Ÿ:rZqhō·ŸF–ó*Gö( µ®«F;Bžšń”=ēõŪCĆŪ«zŪ E¹ź¢ČķŽ»µYćéŪ՞©ćL€µń°6~jš)9õ’ÜP\żĢxѱŃN̼\.g³™«…P¬Ž•™ŠX\‘«9­€OöyĢU h`¢Ļ¢ß&MżüƒŁŁæ“ö¼Ė\'Ō”ŃmŽ”¦¶7 ģRā.zW9®&’ūW’ūõółü”xųÉ'Ÿl·oÓč¢Ųŗ7Ē!ž<†Å]¢®ģW»…L«Źņ÷˜c&ĢėV»xw©NęFø‡Ų# ™[µ“6½o‰ˆŠ——O}aÄ4ē°]‰Aõ4ÖŚ-'ZÓU°8~åpM˳µµµ¹¹éCó±'ś~ę$_ ĀēčʇŅkK»Ó}Q摳¦øØISƒ]Ó©—ēsqćHgBm³·_ Y†öt: Ź$G §=)q&g0id…­;rĶ $zø>ŃwOĢ3Æ!ZŻ©‘+&²M”.Ʀ®A}TGø•Ķ-ĒÖy')ń‘ēĘ0ej»¬®“±REĢoś<ÕW5zx‡Bm²zZ{§Ė!³ĆÓV°Ē—«Č¼d¤› ¤Ŗ–ĄĆ½ĘŖŖjmm­o Ź?PĘX–ų¶tćpu*Żē6µĻ¢Ō8KoiiĢŠŗN±źLQä.}¶Źļ ĒŲßēmūšT~·MšzKJ,p$0ŖÆG šéó2.,ģ›ÖqpĶŽ­ćbAŗ ĆōQ~™ƒ™Ø˜ćŠ”®I‰{ŖHīSŠikŪĒŹåĢ¢ŠāG5‹¦UłŠ^0˜§°“=,24œ]õŠ•ŚČIJœ#ānķL¦f™48#¬Ó³z}]GŚ7¬°ć~Żéeøo†{ĪG½Š‘R£EūįH¤³Ž|'Œ¾sH•źkŚĒö¹€YGAmŗŹŃ ½+UĪf3P¬ŠKWP̜«¶ųö1¢+Ī–Ć+énÕ_ŽĻž¢{ŽóžN 喛o޵k—. mķūXs⤀ßćß„ČčdøĮ%술µ7‰ŻN“UįhM܅MĒ‚f·ø˜xIwŠ‚ķ“3pÜ’1Ü0³"K Jc ÷iŸ‚ńFq«ó™F„īseūnFš]ŹJDTΊhT©• é@ ¤N%[³ ­õĘĘFōš”=€8ˆ·É0śā"`;MÓ0³.ęŅ( ķ»¢,n¹Æv{$”¼›}Fmb;+„ķɾÕ(­…ŗÕ½¼łQWļČvrÜ^ź›Mß=ĀyÕ;’ƒ0$œĻo.DÄår)3Y¹’må_›¦Y.—›››;OsŹ–cõXdQŚ3ŪåĆÉÕd—TJć~Ó=1S©’P¶YĖé†}Õ£”ē‰ĪžH§¼”—ų5F) p§gĆqI "11Śś¬‹$ņWNĄÄD$£nČpō¢1§Ć©l¬/ƒnę"9n;‰t_u”ÖԚ1F±ļ“(ŗEkŌŗh—=xķ «ūJČDĘ3…–Ń1ńŒ¢mˆ¢ŗlÖRŲµ¤2”-J‘!](å”Ģ”BTŻž·h&hłį{ģIėRAfYo•tS#)»q’˜ŌLįĪž•ņµN"z'’s*r߅„’›õŖ½”oR„Ø%ī/BóųcÜE*‰įķ_Łødž}(’1CØpXpn„ņśŲ)Ēš‡©…æ`,kr×1ė€˜Q+Œj¢X7_ pЉ¶±#Ēmõ“Ć7œŽķ¬Ž4žåty¾&āČXu'ŒJvewńv@šČü’g_’éüšl*3/‹õõõčW†÷q°-p'+šų9ĪnĮӖ5H?Š;Ū=ŻŹk ōõ;Ą~J,4;6MƒŚ+pP “UDSb}ų”LÉd"'rĮ¼ZuøņŌ3‰9Żj+Ślķ)Ģ.IēMFŌõ 4!‚[GbąO5÷%“Sę`żĪ°?å>Š„:¢h&ą²wę¢÷aŽie*ēūœHrǬ>\.Ģ)SŒ¤Ä![Üģ;z ĪŲ¹h@TD ŖƒJYhn…Ś ¦(zęp 8˜÷i1ŗ(üÉłˆ^ѼYQE/ɏ¬ŠÆQ/ siGēiuŲ:ńq)cBtæ~fe=©~“ “³ō;ŲēÓűūR©Čjc;jÕś³£Ż÷9j7¤ƒ¹o"N¤ŗęó‡hÉ}…mpurbĢŲ1Q÷•zC2ķL£VŸ œ6Č0l~£*Ć­‘; )$¹h”:Ž_ź@"øŠ“ž‹lujˆ¾ś«#;)e©F†©vÖn])>%čĪ–ģ§ų/8`vDźésøĖXó  ^ˆ1E]0įņį¾pAc’2żQaKōų/ "i¢ŚYp+ˆŹ‡ÆHÆuhūR›Is½+ŽŠŗg%g¢xwÕ3’„AÖø@;õÖ_łB@­äAŗĶ)•Oš4“°fo(# „ś/±+ęĒDŲĻį!Ē>±7“Z%®¾kYA†-CĶ=%õkżįN –aEŠõōōĘO€]ėkäšĆŻAžŌ6§–_­÷i ֑ÉIH-#‡ģØ ˜č²'¾~`‡āao­ļ·¦ūƝ…ų‰Xk)[Ē—Ż»¾E‹D›"‚µ)ķ—C[EŠ’&œE‘ē'd†6€‹^0 “ķ łJ † VJy™¦e|Œ“{÷.„Pm€Q)„żĒɩ͔söÄŻĪ>u‘Č“‰•īnįUīŃQ]ײ¾øtüV vU(J¾ó-5NÉzå_]§µV¶2}łu÷ž¾Z·H¼CDĢ÷·³ÄæYĶtē‰É°•#+J”f¼Įd—BPČķh³ļiŗ;PČ ó\—”!&‚&ülR'ŠĮčjzĖ!ę?]Č żś]`ź¾”†ŻSF@ Ya›zį°Įź³GĆ*/óóŒĖÄõßˉV?@ĢuAMyź`¦×ÅūkÉ ”BȆl‰MfP`7­ņŸi§I®ĘēŪ«t5üŹŽŲ·˜Ś'4ĖY•`ŽĆżń¬ŗ¦§ ā„åt±9kx{ķ¤«K‹R.O4ü+—ø©WešĖĢGT©Łiäw‹¼¬&Š$ŅC' “3ņōöW2r(¾a“ z½žüQčū¶”üā±mŪµ‡Błä=Śiæ-¹^€Üšéä 1PU¦©Ė‡DŠ›:‡įéx[oŒv†š ™Ś4 ܐ‘¶­¼Ę_~ӌKq壚·lœ-®9jŻ«öĖU{L%*@eßß{¬mķ˜Üä””éŲĖhgFæ_dą›N@tÆĒndV)m1=¾0Ębe¦…+³1† ~yĒé÷ øć¢©-B»]Ą SsŸōVŸ’“Žåįö…[™'HÄ©9tdÓ ĆŹ…GhrÓvbļž÷ļ"4›BŖŸ½Ó¾Œ#u÷Qk /ŚJŲ„-œĪsM9D;)?õoG^p$Õg’`¦ŹXĆ»nÕ Ł3}ķ>Q»Ó¢²wė"ŌÖ4MĆ­0ŸDł °³>>~/ŪŖJ?ŗ/,vµ¦i„”HŽßļÜ6J›pYÅA’˜BCBż•bŅ¢/c ‰} *å­gņśĄ,ŹOĄĆĪŹzĢ8ŲÖ°„bJ”ßVJ¹Yā‘Ęęžø„eķ”%”ž÷wy*Pµ=ÓģÜmd•$FÄƇū½J›)×h"²™6äŗĮ ŌĪśET)pI~6XgŃōa£SŽ%wWžm ‹Z¬k&§f=~ĻZ.[ƒ°”[“_)āŗŅĄč¹šQŪ|$.ǼŸ‘Ö˜n U‡#Hwoō“( ņŃĘä+ŻēR¶³ŖRĄc× Āžh¤Yēg}S¤}ڼ4éĄNV”1¾eר :qÉ1ƞ*•m£±OB£†ĮIPrgŠU‹¢³Ż‹_ ww=ŹÜ3Lµµ3µÉfę쇦…‰4ŻóhPÖ;ÄŠ/‚8ūÓW…ō—ԁÕo¹å–­­­ī•œ źCcLZĻę6>w]o,īŃ^ŹåĖßĢ`K„­st…rÄŗ2éo’„(tQjׅk@Ž-Å“}óˆąMk=ŸĻļ”ČDYJ‘öÓż"Bon‡ĄĮb 9vΚŲł@%ɏ_nOkŚ”ĶļĄö‰¦šī±™eeĆ#č4śk$ÉLģé’±%‰!uJ{ˆSŗP ‘Œt üļż2„’§Ż¾0po¦—9ŗ§ÓyŒ)BS”{(IŻżéŲL“ŠÕ@‚‡‘…wÓ±säį%*ŅõÅ„¾-ځˆ=ĘpŠj¦zż dņ¦„Ļ؊ Ÿ^g?˜©śfÜ}ōŠPēŲ’NģägĖī;`öõ½”ߎó„så.X© =½īźB8„¼Š¦Ļ„²œī{Ÿ¼id[EVZ;äē0“oØ׊¦Œ!y¢ķ¤e ¶0F‘BeQ™Šņc6²ˆ//~’Ū—żźĖõ[ßøų„/zńSŸžōj÷¬(“"‚ŗZ~ćß8ļīē[ņöŻĪŁr¬Āvx©š4–]ŗbŒ”)­Ńg«‰²aÉdo]׳yŁŽśŲ>ēų“')ŌŃńē<˜Żł<@˜Ą¤# –¹’tęþɄT™-؟ŌC烘iŁĆTQØHŹ ¦KźqųMą³G²0õ(uwˆwŽ)‹ä²E£Ņo¦P8rŹ{ņõ6Īū‰āöł•®Ģ,cVnn|X~ ó¼šNrXļĒĘX•éŽ €q  -÷xVW#Ҳv6$‰Ś7“ÆēžR,¶—kėsßvMé’x˜'/ÜĶeyƒżä˜ć”¹ė™ :ÅCĒq¹XĢēs@œŖŪ\q’Öµ‘N–Ņ3ø>)Ōčėn=ĻŲžų'!QG%ķ–køÓ€ŽņGkʎ„F‡(X2s”v ·żøvOZŠ) mv˜r4) ńėų—Ż]ŖĒÅha*×yK$Œ­–øåŁ%‘åż‰Čj ū~Š?X.«ł|¶½½XßXŪ:|xccĆA?Gö›¬dÓ4eQŗKķ¤""mšT†0 Źż‡ž›gī»č”$š™bڜSéՏ#€ų1Lē™ ©7]$ėr’œ]ź!²į“äŚm/Ļņ±*’ŠF‚*Ŗ2ś˜źģ&ģN+‡ŻŽä±#ŽEć¹dĘ: ˆQļĄųųĆ2)± ‘ķŁ V’¦*j+«ĘT}£‹S®J`”ĘvŹŲĪQ‰ōčKzµxW‰!mØščÄ„¬dz™”Lƒ‰§ģ>õ²*ĖŅēm‹ˆŃVKīū‘'ń¢{ol@ EFåk(= Ģ€bjµÜ€”Ē?öń~ļ»OŸķ/ĖņŗĆ÷īŽūc?üčßĶkųÄ]ø>3öQYóqųšöĘĘ:bŅ!a;)JZćöör^Ī\¼×4F)eķ”ź4ŠŪ),ˆ2k£ ­ān`ĢVL‰6k&ÄĻ=ėn};ėŅ€ˆbū]o–hdp“øW. )ʏHŌrØu†©)zj§gn+ß“*!_G˜]”?歂žĄ0‹Étc1~³~‡±"®Ļķ䃆õu{Ż !¶Å)āÕ „q”üyqĮJ(@ŻŃŖõ }s¦^,ļŠ‰LöÄčĮūūį`.%®ėF)„ ÕŌv0©O©uhŸ@ߤ(ŹÅ‘ÖŹĪ˜Ī]„œ4²ćīK³³™#¼ÕŚ”<ĮaŖ×•Ū*aÉģVu¾ĢA<)o>oŹ™wSćī©VJŸQnß÷A;Fą€ 4ƒ?Azķ5W?ń1½šĪwƒš= ŽÜOAÓ4J©ē<öĒO]ßūī÷¾{puuƒŃ\:xÓæóM8aļūßū`Š„b$@˹±¹¾Øģ/kkyŹ` hD ł[Ó4l»»ŹB°ŗŃVˆĀ]„R»‰;­U€“«R«OD\(Õ!Cr^¤€£$“ąØ=<†CiöX„įxN~wmmĶ”¤†Ž„›jC `CĘ0ÉX—a2LœČs°ŸtĀįV y#]YžGDR·ņ/LP%‚&%źÄ@|üsjg§ĆĒĻoµżÉķd2߯…ĆéłÓņ+-Q«ē ĢĢ“ŅFh„Ģ<>/žiM§Įż–Kū¹–@dL]] 1ųÓ.‡ÄćT¦+Ī*»Ü;2+`J‹BźĮ¹õ™²ģó’“ µ²3&ɼ}WD &HIĄž½öGkŸ9rD#‘7éĆĄ·Ŗ9-~#Z›IĒÄ ī‹Wy‡Ų§ƒ  x„§6u‡+fdˆĘw½>/ŁÄh7#¤ ĪRełć±ÓŽ“óęžÜ7gĢ»£ćĶLJNv Ā#•`NĪTäZčqśņ~ XŠø”š»õ6܈°¼c×ólé0˜:ä³ģėØ5šė”ŁÄøiH€„Ó Ų3 Ęćßņ-BŲNh³a`hŖ&»Ē\wŹ®GÄLr. ”Ģf³śœĻJßŪj³ho˜£āąÄ (ŚŽń7r© D°ķōY&)B°ƒė-ņW°ŪŖ»öŃŻ-—GՁMGWś¦~²^r¢^q„†žAŻÅÉ­—fļ«Ķw‡ĮCxFšņįŌīx%åĖAĪFzCÆ#qORÉى1jß ½—qģĄyūHH"RؼZc+ø~QߝĒÕMöĶD^?3€,Ŗ¤ß‚ļy÷»Ÿų˜Ē¬Üļ÷{×g?JS³²iš‚Ōwæņ•;\pž¬Ō»Šłķ­-ŲÕŪ%–i+ŽU–ÅTiö)¶Ž£¢6i­ŖŖž­•żź_«”@§ś”ŒEõ1_½¦Œi±ō €”nÅ“ür*h…«SQ3ĆMcׅŽC#ŗÄą”[!.ŠKĪÉK%Xˆ“-" u„Šķ^F’~+A¦‡p"GÉ4Ż.q–’ķV2žŁCäŠé=ł)°…>'>ŠØ(ÉŻZzZ`H§ Ž­ęŖ1jhą§ÉR^-ÕvRu]Ąė¤ƒSŠ c’ģ'ŽaŅ}ĻĄä@'Bu€vZ~ōŗčÓm|ä Ÿ9m}Æn)T³’Ł…śź'?qÆ ī± `*÷`qłæbø"®ßõ–·-·÷–kžå¢żĖg?¤ö7^{8rCH¬…3ŠĘR Ēø$#Bš ĖĀ*`6ėk+Črɲ}s–mš1­:auT¼¶I¦6ļ3¬„-ė\ŖƲR(ĘHß·÷²ģöUUÉĻ=m­^ąˆOüšVDĒ:ZƒōÉ]SZ£#dŗŸųŹxŹ_XĒŻ’šaōõ·Óī÷Ž÷Ņ€Ef™²Ņ*`÷=ž#-9O¬ŒĶάcÜęÓĆō“xgŪ_~}*zĒr9Ņ‹ GƒDĆ*Ł~N ŻIÕÖćČį™sĘŖk›$čG»ĘUU}āŸĄyOZČOŌŖĶģś¤ūÖĆųąŖo8„øžš č1­Üź_±:6]r£W^’˜ ±! ŽŹ\Hom … Ų!#ŪSнČR÷j׳FÄż/Dv,†®AŠ–„ŗÕi ‹¼6o‰µ˜²™ö%ūuAŚ)Rɕƒ©TŽ8ųĢ9‰¾¦6{@)‹>+ %JĻyŠõĖl•67Ce9ĢŲĒ›r›˜qHČü]‘ŗ×^¹HĆ9øĮĆ+RYE”Įį J­ „4¢ŌC‚FԈAWæŻÄ“*ꁰ“{`«ĘŅ…mķ¾µh‹žó"kž³]č5u¹ ‚&o·§]ɀ„™ż)€hž¬ƒ59 ×}Ō*83«0wīĢegI°¦’Ö(ŪāĪ(øG’ÕūJęįķΘØSśė£ęk­S^ģjĢ%M¹#'Wä寨ś¤¾µćŒ1Šī aøDɈĄH»Į0”ś¼ ī”fóEp’;ß·*` DšĖæōrŠ ½ŌšĪO}äøóo€†ĢŪ?üžƒfY>¼ ōéåę>€ß}åoŚ|Ū›KL‚Ä{m°ī龦Ej ?6Œāg¹ƒ$—ĒS•čŅ'†5¦ÅrGŚĮ–R#Bź²evg7}“µ† åäŖ\w×љfó±ģH|©¬d”¢%ڱ‘…ä&MŽR·įzŌD¹[㘌(½Śč˜ģ¼+{ōbėōWƒ¾P·9„ź4*•™e÷]u)&Jm5éV,šéµlfJĮ8½kӐå5d[5‘ Į½¤čĖ{ąŽž]2”†ˆ­Ü«“ ”ąÜxÅX4Īfqańl>Īsž=Ą¶‚Ž‚j1PHń#„·„t•ą ś„hś*w}'w%ļL&"*>P}½eīõd!ü/„,]…°£ķņ~–_†@v0äŹ<šČ3Ü錜+"«ŠįĪ,[ ¦ø½ē3HgwŽˆh@YjI’')ģH ƟÓé«ņ¤’0(ć”]MlźfČļDĻmbų•#@ziĪ“„C“ū•3`˜{‚±ó’’!3Ćʄķ0^ä„?Ā~&;'×3ž˜÷äāžŖOSRµ£’¶ oož¦”–83QŠ«ĀÕ嬾©ßJģ‹āņŒżÉ›;•Ö)•Ķ)ėy„ļ³jį [ó]µu?Xŗ­Øˆ!śf±–Ėeü½O:>ŎŒī¤XĮˆÓQ:{8€Į ˜v¢XĢRƒ¦Ń¼½µõĖ/|ŃUęš§æóµūœ>TFך__žk_’ā—xļū®“¾ī¦ƒēŽłn`0j,~śē_pPŃU—_1½k×FšĻļłW7o±/D›RŹÖNWÓ„4‹ÅĀÆ©øķī»sjiœ›†Ņģ(L?iŅÕ…Rƒ«v[Å<+„œƒ'j#WšPĢ`˜ä*Ņ&­Hm¹y$×.ξaT}Ų±dīŹéЊn ļ‘ł…óŌ śX0~ÜŖnŽ&Z+yżÄxАżĄÄø3Ó£ą‘dX® …ݔڰoK§L²g•„3”Ŗ«ųól“£/±÷ŗŽĮŅ-Ū/Ō„Ąō׎}‰thEPŹ•’üäĮ-D§sĢ ŒÜ“nĶēO‘’é’¶W?•īMŅśT(u‚Ć]øt}“Ö}–£²÷V§N„|åŅ·óœ$Ż0dl<ōžūēķ9^ Y2²ž6o*ŻäϲRżžŠõUNœ°“h†kk»‚ČhÅŽ)ÆpK¤@uY%³å£­šO»-q6›”Ź“a…vl0¢ŗ˜ ŗÆµKÖćn¬jUw›Žö@O¬ˆ³f<"’Ó1ųź/¬ĶåfA:Įįc€±^zV®/‹ß‘²ōp”L÷Åł­ģ¶¶ģC®“ä÷Ūyc7ķß¶gDÓ[fŚå!Ė”80(„¢ŻÜ‘^ōC“r;}Œ>f‡\BGˇ‡gDžėJœ;Wż­“s“V©š·é—ÄĢŃĆŻ1jiµ qŽÓQŻé?ˆ`ņ`Tz®W3ŖŖš•3ƌ‰ŁA¬©tĒq…;ØÜ,‘żĮ”!¢507 °D½øšŅ_xéoüįkn³æŁŚŗżY·?éNgæłŸ’±QĢ J)Ü ŠĮ¬„ĪĢŽü ;ąĖ’8a?8Hƅčēum¤ō»½½\_Ÿ·ž/ 'ó-QsPĖØ<”ķ“ņżĘÅ'č—bjß¼©…ų.ĒGŚ;ŹČĆžl"żĪĘA‡§Jśę4ŽŽŖ w5»u²ÕÓÕ³Ā$DDŖŠ}ĆĄ>_®¼r`÷C ŽYŽß·ķ[Ņō5Ÿ£}YĖŗµµ½±kŻtGĖ2ĄNy”¹‚=“”‹„@R«M„ö-13r ܒĪ“įŲ0B†ÓŹńÅä"{5j®~ęąoX.++”ŗĒ ³¾vļ„ȽN×ü5䬺ˆCN`iOxl¢S·F[å§¶$—ž‹Ą¬Z­0»nN°d„ŲhJōœł'NJ!jųFĘ ąN‡– -±EĻģk ‰ēG<”ptĢÉQ+•+å`ÆUqĢöA—B!ˆÓ  `ōł‰z@Źu”܍{Ėč„÷õjźĘhEųp ?”©ąNć ū­+ąäō„‹R/UY–^˜e—°į™[#•7¼ań„Ē›HĢ°;žJM†‚†"vcŒ.U¶Aš2Ā„ą׃ĻjŽzrxĆ~L™xIŅnē™ö»įE·ĘuŻÄRsŒ öĪĄći‘Ų“,wC¶Üßļ?’\4śŠŃ7±Āoķ2/Ėł¼Ģ*wōG(ޱj@QŽÜz:; ×žØ÷q7ōæĆJŹ~oŹÕ)Öšƒ™ø;żĖ5Ęh„#”ĪąĪū;*Ī{J1Ųśą¾…kaHD¤DæA¢.bśßxå¾ś÷OŪ{Ģ·Üōˆ?č?>ņ±ćŽ;žš®’ģ—¾|ʝļ-äėFiĖśŁO’É+Ƽņß’œRšę7æł©O{šĖ¶#ŲĢ!įP¶ool¬wĪŅóX"ļäL½;“` x ”žV źŚ…BB…\M!Ō‚īo¹“֊ˆ‹ÅĘę&cédsŖ¹SP Q\$I6NdÅW†Ā_±Ų±Ń8ZąQ4Ā.Øó ÜFjŹ™( âѭļŃ2ÉYŻ)I.pœ®wät•ÄßD+ć„€Ŗ q:Y݈üā2AM}Ķtn“h #ŒÄcį{¼ Ā ¶iBĮ’„ØīØyO 0 Žķ:h/V0^śM€ĘČ–Īš½0QV…v$‡¶7/j_U;usłÓJā…~ÖdōjåßQŒrrŗīį&·Ėā•]z©c'"õ öŗ”J©¾ēŪé]gÓœœZąŹÅÖ”Õč/qFśjœpĖ·Éx~0 a-©ŅīSDć0®yy·I†Ūž«Ŗ*˹ä„ĖeU–e§#–“ü“͹x…Ź æ) uŻĢfŹżV§ęt¤1yņ˜c{‚XŃżMNū,ør¤ķĮ‚•®dcu³ķžō• ±ÕmjkČģDFšŚt"ŅŲ_ÜÄĮóˉ‹VPZgۃ7!\&:thĻī=A÷ß}Š'¦ˆŒD\U•1fss#„K=¼ 9(„ŚbˆMڳĄo6ʔ³BV¦®Dģ“Ķ Wķ/ÆŲ5wWćA酒³łQÄ5źśŖ“q-!¤ž<xążbÜJ-Ÿ)V6¼IٳRńΈ£±Ļ…9éÓŽ+“d™ĘO†kÓŌu½k׆_ø„¶w‡Ø‡—ŚæH.ńHŅŅŚČfieƐœ-zTUU­Ķ×Ę{hKµ=‡¬]µÆl/I¶t+÷ģ’4„T—^r½©f3€Ó÷÷ÓOś‰|ą—\uon|ēĄõĄE›L²: 2}äƒŌZŸwŽy{÷_UUQŪŪŪ››»ż³šßLģŗ ,5WcĢöööśśzQhiŒŲ؆Rā6Œ°žØih{{{mm­ŌŚ[Āny…BHÜjęžąĘ³žV4źŲ Ŗ½ēō‡ŃõaģæP¦JÄ’¼v’¼ŒyŃEl$z˜;n™N;LIzūŽ<1x]I^`ƒ0ģž’cļĻ£mŪŅŗ@šūę\kļsī}ļE¼"ˆ:!>B5 bƒY:DtؐPCȒ¦ •Z5Č5Ȭ1ģ в$„ģIEÓŅD1­BE4 h¢o_{ļ=gÆ5ēW|³łf»ęŚū܇U£Īøć½sĻŻgļµęšókßļWJį?4ā9u3Śų=[S#Ҭćœ§Ä2a>#ŖöĢ„lr¢bĢü„˲ĪóTéÕ\žhJ\G#-ę„Õ­^J3g®J­BRˆäŁ×«ėc3Ó®~ ¦bśž­”Ų1ī&÷•J XcnooÆļß/p\X—[.ģ± >čęęęźź*WD'ØĒśj$ž«1—Ÿ%Ž —é TCœņ™ŗ!]i±†p¼ę§)VNyŻ”j OS“į9æzsU“ėƝˆqs7š9› 8ėŚØrFßĶĻ [¢µžQ÷˜ŠŽ“χ×u=öŲ¬«ÖS°$AĻÜi#üš`ģU\ƒēĒV­"ŠS£˜Q|Ēo¶Õo“H±ļ‚ˆjŚ(oåÕOˆF,Ō€0;Ё™OŒ1§ÓéšccocI]aBß@Öuå¬Õ-?–§­¹{eDņ擼4Ū“¢X­eé?‰Ś™ŽŒĮ.Ž#EFĪniäŠ ēÅ՝r–ŽĒ›½ō*}÷ˆœA«ėŽÉČF¢tY}ų»–†x Ęfū ĢüŹzUv JėaTC^²’ń4"H3˜„ŠNąū½ŗŗŚxʘgbdŁ/BäŹė€”ÜT.ō—MЬs žß’ģū~ĖośõÆłšWžąü«G/œµ‹C/ż<«’¢Ųz+Y¶©GņawäŃłĮįSé²/„‰ÄŃżd0IA³¾q&B‰ØäÖŹÆJiœ` ĘBĪFX»»ER«Å\—WšĆž ŖČZ«”­cYD)AštƒQ.6óįŠa^×ÕłōŌ×[kµ@zZkIJå¢D'våÓGD°N<Ų'Ą ±@,"‚F•ū†iēƒ$²ša‚7a I~Ē ŽA<óż‰ BM…ų¶ŸøŽČ7zA ”%“Ęśˆ^9˜PW§"Hė Z ĖR>Ų”£ĶšU“Å`ō‚ˆ–Sn­ &įŁr¢)„}‘a5¶ä¦Ī\Ė_o)'•æžIjŽBŹ|TõĖL¢‘Å«©nNJųšĘ'å, ©ŠEżR»ÅŗØcŸLj³ĪA@9:ƒ§jŠ©TŸ4ę O_RĶ#nå@ ųŒ)ü”O’“?ōu_÷c?õ¶÷ßęĶ Cź%ĖG %æ}ʛXc8¬sßtŠgՉ«'Øōb ˜Ąłēó `§IIŅÄā&*>U>˜Ačvo’ĪĻiŽü_ńÓ}ṼAG’÷:”'2ćUõŖż¤ŠĄOóø54†6ŒT©!!¹Tž!@DŒ&PĪg„`LI×"¶¬ Ū$DtP#ĒÄz”}{2ĪÜK cŒÜŽŽ “rA2"āXK)e-!Āķʬ¼%uA)œ&Ķ”fY9„^éCĮL¦„pŠć…˧뭵IMR‘'ˆEŠ|i·¢ĻĀ•yU(ƕ–Ó qńŽR“ óįyĄ“ ‰ d”‚ŌÅUĮ2ÉÅā—r|’=AbĀģĖU½L&XŲŹ ;ńXå·tœŻŃєĒVū•ˆhI¤wF¼4½Zžby„Ļ(æj85:jVž8y\g“Ą,+¦‰RšŁ•ón!"³ZÉx5É·½¹īąkTU‰«µ‚• ÅrŹ1ö`Yc†`s¦™Vy 3#¬Ąźe]é0Ķ›ßl“śąsĻć|ø’ŹWŽõ«9 ²šI5ƒ‚( DŠÜ³c`€ģ$DMŃŹ‘sbt @MČßX²,®Čņ¬×Z”Ž‚Ь/@›‰©Ź¬R7Rģ{ļ€Ć?yßĀ£~å­ Cf~ćÓ铹IņE¾G¹¹źĮ/Zb JD­œÜ”%Œ¼Š®"L8”œSŅ£dJlƒāmęƌŒN“(rXR¹ž” Č~ŽCŖė°É }É×Ō>²žLkø"švffBvźw ŻcPw—żH¾ŲˆIŒē :Z i:Ņ”ĘĘ~Äė?źłēŸ’£䏁Š”1‹Ņójͤ4w±8ča°A¢”!b‘DU³:äĘ-2žä;" ÓVUŗ/cź5!–¢pŪÖ$R=)Ė|$Yµ.ēI²źBQ#"ģ7%_ąœąŪOÉŗÖę6ƒ»­±±]ŅķcB:ALłżåé+»i?UNb’ą°»‘ī…̇ēåʃw§5®ė2Ļ3ceÆŲAv§©$ Ū,čögu²žpµWW/åTĪČ$f8„Ŗ%™šČā÷ŁG#æW4o“…«|%ś Ž =Q^®nŅ÷į>°,Ż‹ 4“E²aTZµęGĘXkźąUwīf&Ī?S0Ęć_­1§ÓiYžŚ©Ž‰÷4«u§Óŗ>ŖēQ#qüKbN’tym,F嫇Jʼn⠧°µ1ü,Ęܞ Ų•Ł£QˆP8"JŃ;W’!iA HŖµš,ÖueT]†Ėh‰¤ĮéL¢NÓä0ē©?Ŗz„N×$"Ū=É."£ž'Ė·õp«„żQͽlG;‚ń% rH”j6`zŽ bk§õAćĄ] 7ŲÄ•‘aUĪ6“ńד‰ņŸ,2:S‰gōV ‚ĖLn“[kåI čŚŲS’¤ŁM õĢĒYM p[Ģånæ±œĪ‚Č]Į}"Ņ:cĶJgb(4DØnh~ŁšxŒćø" džķæż·Ļ“yÅĠ½įćģ¬ (źå×¾|>¼zŗśŽ?żMܳ0Ü¢C `Į®4*†Āū'gS®äh+ooo„0=Ē܌ ĻąUQø|̬…Gn MįxŚA:¶MCė„ד־(„Xnže"ø1ļ¶=TĖ’¤,MeˆY)äeˆ£">äV’Öš½žrsK‹ĶP‹±ŠUJ”{S8žhßϤ3ņįs"ą`oGæcųøo„¦Ł’)G5Ÿ õÓéT-Ÿoʗ}ĄdSR§$B”<ż2›MŠ;bųŖņśŃ§ka!Ž€ķ087’·€Ö%ˆŗWö}šõżū÷›īG–Óžfg?0/.MV²ŃĪäI£Č…ų—ļźźÆßŽŽJŗN7/q–*\O ‚Ā`Ęi„.›$ģÓģŗÆ !ū]ž{j :e˜Ę‘ĖŲµŌ©+ājnę|ąµ7*A׏šQåE×® 2kMĶUŖ~ fŌJ˜”QPk„4VĘbŃńŠd6ø;žēŸ&LJ¬“žēyžµÖ(z6tƒG*'Ā„„š_.Īo#ļKRȆ(ŗę¦„1¤ŽˆsZ;¹Ŗ!‚”j=ųōøLK’Ćb]‹&‚iӍTāłĆ%MÓt<e¢›\gÉ7Zcē'WbŻŪQšķzšØž6µŅnł2ŒŽ§ZÜk7“É3޶śĘo&ŃW­‚Å(!So ¢«RµÜt÷‚³šc³ź—żdp 8–ŗŒ©L’•‘V”mD§uÄūJ”ŅØUŽ;æMh90½ ĀĖn‡µś£4яµXŒŌftĢśƒ­’u]5Šc¬öA­IŗļŖ›uÕÓT*vÄßB°dµŒUm”€'_žč/Ėņ§¾õ[`yžĮ«_żźgķ# ˜Įļłā/üĖżÆ­Pʳ¢¹ž1×K ån²Š*Š6ś×U’’·V–¬I„Āµņ(Ę=&…Įzōčöśś(ėcŠįōJ \ 䡙ÖT†q/€i©/œwoXL„é=ĄÉ™cUń A¹wP%h/=ßx輏ȟtäģ3å: øPN&Óm‡±ą ņښ‰xLņÅg‡Ī-}ćÓé4Ļó8m~°­ē©:ŋ!…)#`8ž¼m”Źƒ×}fÖ¹­ČԜ×jDuF2R¶ž¾µ¬+™ŻŽœŽWīɱ¢ž*™Åś’‡J„muåŽ÷ŅDožńØ»/L#Œ¦#ē"PŃö_¶®kRDP·–ļ,ϾüÅ_|ń‰'ž8ēüR㇠69³äĒCZēWu:$°Øł&$o”BķwkIk¬l~)żā%–•J$=ā4„ØĘÖm…j@®a+E”ŖÄIģ¦*µ”! ov:­ó·4¶ÕŸŲ•œ2"‹”.fšõķĶép8`U’Ŗ“’é,}AČf4µ©sžŸēצXéføžų&ŒÜŲŌų ~µXUÖZB3zŅū°ńŚn “c-\aóru\(¢ą­µü運gqĄ(kȼéÕÆ÷Ž{}¼³.·Ęh„õs§‡VE¶#ÅēŌH\³¶QhŽ8Ā$ ŁøŌԜV5O.ļõ!"¬«Õ“ZW«µBGQ@n˜IĪųą@ą‚…hD-%. ¾ń°ĀŖfsīł‚ŹÆ™źĪf$%v®"\Ćh†³=å½Ėšą›gœų™0zˆ ÖuŌ§Kś].Ŗbńißśā]ńųfū&eļPb'ɑy “Žwś]› öL~€])=UŽ*GLCp€ļ®€M‚ŖčG‹Q¾–ߏqk!M’DAŖ”Xš•rjJ•ŹĢÉbFņ%!MĢ“yiĘČŁ –•{6õ«Ēa<•ßI‰G)²Ī8HRŠWGēŸ‡¢ēž#źbīäyÅŻ›įy4æY³Ū q²”Ųż†’+F²sV¦ÄŁįü³^fŖ¤¬žR½žp\õn9Ŗ§mO;JĘ-~ņŠŲØö6sfrR‘« „‰ū¦Ø‚+WŪ‰ūW®^ų7M ė20­lŖšŗ$SxRئÄ)±”łXW£µ¾½½=Ė²ŽsHł8mę7“ĄĢ9;XCl;鹄fEÖξš“ē^ė[a«’ŠCӠؼ\Qė“n9 RD3vY–ĆÕ1³6ėÉėÕX°²¦ļćŲjķŖŅfįÖvfæŗ¢3*§ hæwļ^µ…€!‡4ł @„'ŌżģĖSāŖß%£ūŸ’×fągj·āö`?U‰ē‘9pkø’[*sėf†ŅI“pŠQ‚ś#Š„įpt¦Ģ¤_u2jżŚÆłŹ§Ōń]ųĄ½é©÷Ž>zά7`kVsó#’ę_+ ¤”²ˆĘ]&07·ŠHBBE0­f64Ģ« SIśj />zHäafY'­ŠŅ ¤,įj“sœ#ü8\VøS„M^ī,;ŹøŠZ1 Ÿ4fĻLj±Yk»Ł(ÖP $ėļ’K’Ąc ƒÕę°: 7‘jląA‰až\Ņ&ѰŠU6&³AS”ƒZ–v29Ÿa©ĖKŻ5 2Č++ŸŌˆˆq§ż2ų“Źģy>É–Ä ÖRÉm;¾˜Éj:Ü¢¶Łģ÷3™ ī{’hVĖZ¦+­]„CĮ=8ŖŻqÓQŠyӑŸl É-īsŖ”ꊩ§äņ֓ar~Ž···\³$a(ēY;ußEż…’īOžį/ŖŪi~Ļś¢ŃÖLöšŌqš¾ś+¾Ⱦų”ēŻø(X 8ĢG4 w°9Ÿ4hµ"œ&ü¹łqxžöö/ĄhįÉū÷ܤĆfęi5+(„I“ü®Ų€I±B‚¦YÄĘØ!UV,·|)’Ļ»§ģÉ2č&1‹§e={čüē +Öüh QH%=D<gpæė捛¤ž$¹ Ās±†$Ļeun§l:e*ß!ܔwA=zTldĆ'ĒćöŠu¬Ģęļ%ę¾j…Ź01 Iūh^hpķŽ×ģņ”F'DY³Ģ»Ś7īŪźN$¹÷zś ²ŠŁq”HWY›TP’źėNęü̍ņ3¢@ e3j*›§¬¤·éo›’²kD×a—£ŻÜ6C\ Śņ”„øčŽ|8+aäŽ=Õvūm_#ž%?²ł‰*Wž1E7³/Ģ”ŗ F1ß§›0;S/E„,}lXö˜ėj˜“6Ą³QmDrYɯϽTÆ?& q,—2tq­µ ŗÉ“X>ćĄ8d‡9­`<Xśé™5ĘrØuOƒ10-g&„Ņ• ‰«/:° •Ćgh­ęyÖ3£Ü@ōB›6 ķ"”­µ¤F+ £ń•Ó¤+O™ÕĶWX×uY·U čf·*=žĮTÕČŪRӑiķ”ńdFĀčnŖ•»~łxä˜Ė <“_’&É}JüE²óż1ņl5“xI{'aŅ%‰Ūn_åduuÖś±āz5¹›lEU²oуŽĘšU‡ĒČĒt]{“8#¢o :ądP+ŠZYKZ”3ŌĄ ~÷wžośĘo{JŻd¼ž‰§žōŸžÖ,/ž×_ł‡,Ą½—?õšżļ’‘ūńŸų÷?śK?ć3EvŃJóaŠ0Er ī¾®ę¹÷¾ļł_P†~’żž§Ÿ~ś¹ēž{ę™gžxŁĖæń[¾ł3?÷³AV–€g«N§·m Y…©^g‰¶Ŗ?籬µó<…‘ž¤RKŃ“÷Ą„GÓʼnP–Z!ŃK䔋"ĻŌæēl£RŠč™ČĘ,/é vzWØŗ«*aŒ ų%^FcŒ/ß½Z5‰o—[BIcā¤šnė]__wŽ[EK¦vå÷åk$ęä1™ąź"”„k µ:Ū%Œ@*wJõīš˜q(Ö”kĪj µµŒśwOĘ% :cķS!¬4FŒN@A^€‚ !ü“rā+–,¢5ŃßÄkY’¢ėtŪćóÜņKEnŅŅDœĒP@d…T†­™ŹÕl%ÕZ”šfÓ}-ćÜąģĮxp B #=HG“ĢĖ é&L·`%Œµį@ĪNd‘?n!"ęž[æ¬ųhbŲųóL¦+[{āw7®5&ZSo*ś2q5ų¶Öˆ ŹTIRÅóæˆ“ŅJ¹ŹÕ.Į¬«RjšēĄ¶…ø5°P•Q81ćĀ49wwå&rĀqžc£Gš“I”G²€śüh£WLt³ÄJ%ŐL@j]MȄ„z0­#ęž°E„ęyŹ…ß’ēµa|$(4{I Źó®”5†3ą[?žģØt¦“ę.Ü)~ŒėŠ+¹fÅxZt į_Ē#zADž/÷“]ČMĶ!Ē_7ō‹ņéõ³:Ø¢½ī†ā¦ræŽ'NÕP@©“¬:6sg})%Ēź[&D ˜ē9 ˜Įń8Ē–…7ˆŽļą/’•ļx×ßłP(ųޟü‘xõkˆNļ}÷»’ʟū ’ķ’÷üżō}’ė·üŁ?ū-ßłW'ē’ČL ęi7.B···Ļü§Ÿū¾ļł‡žŹW|ż×ż[ß÷ų“śÄ×ʧžŲæõĻ¼ēź}ןōiŸ `ÉsT+ց7pļŹ -LJKi¾„[‹R’Ģå# ‚VJ“Ģ«³;w—|u©vČ/+GūzĶĢÖU, :‘ł”I€“*œY—v¶E‡s^!­ĄzõČ2“Tž$¤¬(“+B:;­ˆ_Ž—üWcĢķķķÕÕUxA§. \€ĪŹfą.m›‘<ᄱ΄4ßøįŚKRy=Ök€”fĄžto7B›©ø f“q¹l=•gƟ°a›äYŅ8ń,±1FOŠLr0•(ėEV ©Heō&~J*cƒXéuÖy‰_F}wž‹­Š]æ”qFGųt/ƒ`Ńf³ĀŽX”Ęf†!Ķf»•µĖc¬|4OYm×Žžł-2Yé“ó ĆLD¢W»Įv£'uÄ#-Ė óŁ.‰ē!;ķߒą ¤R ®čYæv}.ÜK[˗щ÷"* ‚ŻįT„īnPp‰eōįē[µ²õŽBšÓM20y1›::g‡ū»P'{­a«u<˜Ņorüō……żq¬UQLw›lr”•µV)-eˆ8RrÜč)•[+DÕ···÷īŻ³Ö*TJ£YķįČ!Ėź}n3£o6 zC’Y6Šļä,;€ą”.ZkI˜ßĮl.]ŸÉ©sšFwāžĶ6_„ßĮįUõ1\Ü<æ(‡RYAīԳד¶ųO?N×ÓŖäÅõ¬˜Ą8(D#•ó-q!Hö{ż[©œ(«kźČrgµļiZC=ŗ÷Ä5“9’Ź8M|8z„ÜÄlõ)… ®Ūc¶Å|SĀ“@ņ‹,åÓZ:ė„œpa†oC„&IBīēī¢>’U'ēņŃSd!µd*¹PUGY5ԁe-`’ä¼ĘČ„TN$Ę-āŗ*ŅiC•=ö˜3KSØļ¶Č=L”4ʰ‘»C…j5Žē5z=K!˜zC· ’ļŖCģd-ėŲéĮr33Qä MO- pdGéµ:„lk“qCl‘ŅNh%św1óŲb€’’vó&_yķ]•¤“āx9pĘpEƒ›Œ%ÆU5©jx0Ūd†‰f†,“?䨓¢8——‡CTEņ%¾š=ßóEæów¼RnĶéē?ōž'^žr°Š>ŗ}öĮ’ō’ųė‹·ķÆżµw=÷žw~č_ž»æäc?öcüĒßśS?õS’ń'쉧_öćüą¤Õ“"‹ƞ9ć>Į'ā'~ģ'|ü3Ļ<ó­ßöńć?žcąpT«Yō||tóčśźŚ™'J+IŖä >“˜—ÆS&gÖ\ ÆyŖ!ŽˆĖ’ę‘ I3 %ar ¹įÆGüŻ„É0 •$źXK˜kā1©$@dœ–/“ßdņ¦J3ļÕL¢õāņĘū F"ŗ¹¹¹¾¾®RO'Žœ ĆƇ™ķ°WEdd?NĮĻøģ-šO2…­½i*ģ‘ɹ<%®¾œ©ŽūƒüĄµß¬ ®$*#֟*Ł*Ė"m²B%1&%eQjrЊÄåŗ%¢&5=Ŗ¼ņp qWa¶'«k¾)ža óؖ°JæEV-xÉėiémĄ€vĆ(‚”øĆjŃ®£TŽHI ’šWÅ¢ŹAżr”ÄŠ.)O#īƒ b llxD¬WTc¬)ye Ö ŚĄsĻ>’ÄOh­ĀY3†<³˜ ‚ŪeŃZO“ŹRb,N²[“LlG€¼@(|F[¢zķĄžĶ~łtZ‡)ŪĻü†ÕsŌĀ'÷ %Yš5“,‹µöźźJ`GJķe1ZkԘ HųzűX1„eAVŁ[ŖÓi™ēY©!°) čŠ A”HÅČ”hʂ³ŗl‹¤Õ‚Ķ$ ±Ė.±#ōiĪś”Bcģ4©Lė‹—u—ƒų³Ü{AT°¾7Yz±zō艧ī“Ļ:ų²/ž¢ü÷žĮ“‡«G·¾ų÷’ŽæńwžöC»ÜœĢ+ēć¼č Ōq>¾h—Å,ŒÓ €Ņpc`Ҿś+¾āßüĄæž?¼łž“’å{?šüņ_ń+×użņÆśƒOäė@k‹dY© "†µM£Fŗ¾wļ*ŹWųpótZĒ9Ģ-€¢Ŗķ@ČG£Č!`uxˆN‚Ņų¢VbČ,1Įćgžm¬ŌĮ4–°"Jk’Ō0(2µN£ cĢ“.œå>V$‚Dpž¾§ucŒÓ5M,X ī÷·øœN Ø!Ü8€.rHX4čįĆG÷ī]óx'}¬ ±uµ“Rģ­nooÆ®d°¢.c­čXCܱōMņäˆB%xōčęśžU«C…„{ |ї¬ŪTņŪœĆźHģn‡™ŻČ$č`Kæ—;k eÉ\"YzNź+dq-$Ęļ—båW&zI½ _܉$½Už“³ŽÕuAÄuµUČd”P…Ń.3]Ĥ§āŠ sŗXūĀ>ōźõ^÷‘ö¹‡ĘF‡|čöĮńp¼=Ż|쇿ž½ļ}?">óˆN Ą+_łō{>ųĢSO]’™’žO¾īuÆū˜ūŲOüŌO]N·óįz~\å™ĀŖŪc…÷šM”¢,‚‡#Öfē ™ÖrÅWk=ĶĪE…µ“¦©dØYvRā̾x\±¤xšāĆūOÜćŽ5Ŗ$0uÕ}yaE\¦(ĒųßÅєø5c|Ę ā¦R·xܦJ @„2s€FøM`ćā£lŸ”|$Y”ÖIq³ń’@'%¾+ 3¢½Ģ›–ą”E:„”=B8KļźšķdG†­*”SHŚ¢Qˆ²^q=˜nö»©.RI&ńhtŽĻ§Ä²[Öø ‚1¤kim«[īBdD ƒī!ź…l³īc‡˜$–MX†{6}ÆKP;l+*;äf’ŽQfŹ”#ٟ€d-¢Ŗ¦ÄĶ[óƒ&··§ĆÕA2lõWoeŗ©Ø7;Zד)1‡××ZN!¦3(ė†Źrgƈ-cQi,Y0Ŗ<£›ĆĄĶ–޼”ĘDŠ;@n0µO(yĖ Ō0VķY–ä:Q_Ōź»]­µĒ摈P£$Žb‡¾,ėašbu[š1˜°qFųĢb}A’ ‹¼0†åyXf"ʧCe“ŪÕ”BŒaó„.Qō¢|_éjVhÉk”lȐ;)qFIĪ}ęmŪRZą“­6f‚ņR”D–źĪ;aUÉAųhµ|šg 1AéČį’CŁł]×µ5k9kfiŖšś–L÷ų›Œ·(ŹēÖüņ”xʃŅĘÆdøŒ‘w[–…Sā3āŅV ½ŗnS6H|‡łpFkŽRŒ(ŃnŃ”+Ź0+pB°ØņÅeše…Ėb¦I=ū̳O=y’É{%hųéw½ć)5ŻŲu8h=)}sŗżŗÆųŖ/ś¢/śÕŸ’y“ĀIi½ĄŸųĆož‚ßö;éÆżU–¬ęv¤B²vŗ¾GĘ=åX”'k“҈½T& –(UߑzR’Ń”RDęĶŽSų(„ń€,‹óaŖšQry~o Į Ŗ¦ϐ–ž*Œąž÷ŸXåāC½g™ē™Q(¦£e£CFŃ Ģjķķŗ׆¢Ģol³øq¾w6¶¶JŠ5 -č>×WXLcŒœ °Ö*®ŗu˜™jß)›–ģSI=@Aƒy¾)ø«žpǰp¢»Łó—6WšE^ól”śģ kņ=E¾Ó’‰­Ā4Ž4¹|G‘i?p£dŃ9“©ĖC-Ģż—Ÿ~‹É“b˜”¬›ČŚ!Ģ£n@ ś–ä˜vę /”Ķ`į)™¹ī“L ĪųĢŁXõ…±FW“`ōΐŻ-×Gj/éöžo€‹m,®„ąx<@$ˆn”jPU•%ĢH×][>°Q*ėG&¦‘gfY‡ńŗŽpI0š<{ŽeNN¬]™Üˆ"XKėŗ*„”žŖ§©Åæt[Dn5Ń`Įyė9&˜wn”"l=l…]¹Ŗ¶Ź[‡ežgcŒcÉ"ä®»Ÿ•"č®’U4±²6l)u;H„#_™!¢S² LŖŠ Q·¼*vYŸž Ž*­Ć^źsĮ„Y?£EµlZ…wšŻmQMŹĻ&Ų½£°­¬£ÅOŁaHŖ6]µEĖRÕńüV#4Ų¢) Æé“ˆ÷Ņ”dmģ¾BŠr6b“æiOųz4zü³ņIˆhłŲfŻlg.<)U»'Yfq7‹ĢŻ•6Ł€B%²6AįīˆŪ`ŻĢ;Y{:ŽWW\Cŗ¹9]š¾õϽłĶož½æļwæåųżļ’šń«?÷į ˲|ʧ|Ųõ“_žJ"zp{óŗūčõ“?®p¶¤B„U#Hę1Č7$’Ž“YÖŠ:PļlÄŖŖ“šYõ4Aå³.4$ݳ”˜×?TX­E­²G}xå3 )q‡®„vd•œk-ų0Bm G0)ü `É*­ƒĀ ”ų Ė­ģ•Ļ'1Õ\÷paxž,}œKģ1 dՁ»Zsī®ļmņó3Z–Ev†ĒoגC,ĄF"®€{yŪč®PpŠøÄ¢ūšiĆVźÖktŅĮ,Čr…wš”BYgŪµćųģæ¶ •ø¼, n\[3:†+¶ʾĒf‡V|ķ:/Eæ$ķoFÕ+‘?D@lV¢`=-J)¶źa.žBķш ø¹¹†Dõėƒy’Šd-¦•Kg…PANB`¬ņZ@„īēĻĖi]–å޽k śĶ×ӊ“MĮ^+‘”:³ś2ŖõƒRΰhE¤cG˲ĪóĽež«RŖ“–†¢øÆ:ƒÉ$mE "óõ2w—kkcR#Ļš”’Vū~ L·f{¦ÕT2¢¢œń”u|śF¾j؃ —-ĒZą¢:Y»${öƑkwtkŃ®×C EŖ¹KPӝ ‘\® ŗÕ¢g§CDZ(h•g¶Cć…^ģ®q­NÆx“”wć²,pqadtą®ĪfWbT£wĘķSw‚éŖ2]béćFśŽł\ķŻEŖ¼£äN³yū’„Ä-÷߆dt§vøÅŒā ¶Šūć»T>ß²øV+ˆ}ųæ ÷GƞōČ€€y3ŗˆ)±„Źn Yédp’TæŠ"1&Š…‚ćŒMTO%—ģą¶Å ėŪīNTī° §ÆZžØ82¤¼ 4H;Ė剁ˆ€xž‡ż²źC,{™!Õ“––eŃó4Ę©ßQėW‚Fh©õ‘5Łå*¾2ˆ=Kčį83Cr¹ßœ-õ·[5;¦ÆZź*ēó_Ģ0Ä%÷JJ{ėäö‘`/ć`4Ȇ+3Īžv/Q÷ŎŒ83šĄ¬ÆŠĀ§Ö÷ä. Ę>Ųj *Źj9!Żn­÷”—×ņ§!¶n#s› ¦j„Ÿ~,WVõŚČDÉ£)Ē…ĀEi“Aq2(¹Ø Tõ˜%J¢„]{Q! ¢ZøŃxČaŖvĄ–ĘwīøŌĶl­œxæ$½ĻĀd­'uī ­›ĻńĪhõ°“ˆi³`L {ŪįŽd–ZK—=PuŽB_GU,s9•z„$ēź€–µš8.$?Šk Y~“†ģ²2ohT “™ŪB ēūÓ|ÕģĘbĢG½į Ÿūy掠zįŃĶW|Å’īö¤&°Ź…T4O3²ģø¼äšŅڐ%…(ņaæ“»r•ˁ¤u#Äm‡—’µ1+•ji+³ƒŃæqY@`W#Cš‘Žiė‰ $0ŃX’w;ł0GYECž$#¼+f^»W)EVČNZ@R{īTó̳­żąƒ3Ź>Hī ^o–”īŠŪŠĆ/Wk1ÓķbßJCW¢ś³^q/¾…+ɐś ,^”†®šR6: Ē+óŁņņ¦É„IØĄƒ©ĶĢó–pR‡SkĖl*Ėß -dFiŚŌŌs±8$ó'«”B –ģjVN[C#NžäXŁxˆXQ­ęµł.żétź/]Ē·ŚPEw7Ł“Ø@©X;ĄōĻ^·>eY–ŒT©Z¬Ļ|‡x„gģu)ĀeIBDź—>«łšģ3óĖžP &cA©³„·Ė±g–‚“4F‚²Ŗa\łĆźØź&©}IūŌ–Ė£MÖ¾N‘ŪČRųN)õšÅ÷īß 6ž–.‡éŽĪŸ”žyōƒc½ŸŪi'āU‡=Œ1Ó4µTŹŹūŖiē”9qöČĄķķķÕÕ1ßrj[3I^'5ś@ļÓéÄ.ķ¼jń»‚=Ł£7××WarlŅv¶½Ŗž²VyxĒgŁ”=Eš¶‚¢ *ĀT=ū☣¤•źD“”~×D˜<Ž8׎¢ź• õŚI­‹AD=©Ģ†¤ {hq`xƋÄf°X.ڳōÕ’œĒL]öˆ=ž!Ęl„W|’>B• ƒ¬(.`aˆŖs9*!\-¢‡¦®å¾Ó •‰Œ„ÓČBvE¶|X!—ąb<²,¢Y%ßõžr½,€=©˜<#1 [H1”"lŒŸxN–L–<žUڟģ`ƒ¤n/†&pĒͶi#›dįYxķ-=ś'% (V¹6“œ{mcQ)éƒd¬›gŽr™¢¬zpÖUč\’˜!gßmIjYK²ń`œ5ėŗĒųбų/$m čŠt¶—n›¹p3rkqĀUK rĘDU(ßūƒc!ŽĶȟśƒ¬ aU:ŃŻdv¤”Łļņ<|ųšŽ½{<Ž !¬Ź¶ÓČŲmHńĘĒtĻ œźšærCQģ āÉó‚šĪ?…ÖHXÕ²œŪTÕMėWųiPĀškЉ’¤oŖ«¶AĀLa,h=½ē?ż<˜õeĒū}’÷Oö«ļ—|ęk?ę’į­H€šé'_~„ĆӇ{÷Ɵ:„‰Œ†Ķ· ėC’g2śš f‰= kŚč””ļćb«ģ”ķŚriÓdƒš4lÖk Łé4Ma2–ÜÕՕš”Ńø‡ZŚ%€UܣڢĪׯxó’mßzmÕZ›Ķ”L—ÓśĀ /dœOaIy‡ōgW >ˆ’Ö&=±0)"w…‚Ćį% Ø œóļÜ/GJµ¦Zõ÷m™©?Y}·6$lŒyžå “œ­6ŌŁū¤…jQ¶lGÅŠ/e|? \> (Ō¹Ä÷•Šj³ČŖ ŗī]ģŗ®ĘX‡źL|dźģŽeĮ^ÖVūZnœ^ż%ń Ōoßåmɚģ„Č»·JĄś†oĆžĻv£t4›÷U‹Ź:ĘMÜÆ+åŽ\%Rą‡›Č„!f@Ą|Īö7zTĪō¹-’éŠÅ”€3ּ᭵ˆ°®+ ŁÕŚÕÅĒć,Xźh—Sėl°ųD°ó>.KßtŅČ$x脰®¤u“&!XK±ĻqĒ*7Éx]mjL  Cؤ(»p‘”Æ8ų+'BʞSéē÷Ē ×ļˆłpĶwg慈ÖRö±ZkGĪ"¢P )Æģ;:ĒR56ˆ|‚6Dõ5ŌmāKÓÜĮńǬŁ62Wķ;ź üĪhŅfļpļŽ=Ž“¹Š)µ*²ķ42stŽõœ]&®¼Õ@„ m$| 4ŌņŁvŅž+ü.Ļ @Ł‹×ZOӁ7M …’2¶č/ĮąŖ…³Qf˜[WŁqJG®Pµ°¬`Ķk>ģ•ąØÕ Ļ?;£ś°—=żŽ¼ć3Å/ūś’ęiCHųŠūO}ųĖ_y³.`‹@`‚ó™ĶN§“»EDN?6Ŗ•äįā6™d˼O_ŻgÓŁŒ ½HŠ{™Ē=†‘ pDłö­µjŅĘ2ÖȰ8äĻgĢTœ”Ł]-ÜaV,#¤Ź4÷ĒV«µIiĘ7P:ņL“žŹiB⠓˽§xī{ ń–lGß/„vĘyWY10ūTw“†ĻĒć×Ŗ·¹FŌ> ĖÓ;~^²@ÄZ[Ó!&łßšžīWUƒTAk5MgœĪJØĖ€HP€œg”I)"f nVeEčåĄĀVĘc8¬|xń^ēŁÕ5/®,Ÿ‘ƒĢ]…Ė]3X‡ŲŊ’Ō 8CĆ*é‘—ÕŻ*=ó„q¾I2˜żHZ{vTē¶3*$ŠØd5Ÿ¬ƒ7‡Hé 1Ņ āØ:z¼“¬ÄwŹNRJżČŹ®ČڽKįkdH;óÓ¤JŠtUg¤(aPĀZKvčõåń·)éf &ŖÄżXŸ›ĶėMé;X7ZÅĄy²”DA"z7JF²vt,Õ°M|µņ[¼7RŃfJćīh 25|ž 'ŌF$öU ¶J±œĘóŪŹŲ¬>b7_)¶ST=cĆ“&“Ļ,Lw(E¬k$.?bÕ²z•›Ķ ”üūģĻČŁ³]+?ĪØ~f4Ą¬`Y~čß’»—=ł²=|žśŽ¤č‘}ī™:>ń*}ųĪ?óĶ_ł;~7|š…Ļ>óņū÷^¤åįrćŌė{ά)_łįpŠ‹ LŻŌU¶>‘Iņp\āŻAüó…Ūz ĒŅÄDœć…{ä]Ä$C<Ō$ē@ųõwųõųr­³ĖɈčbܢѲ,jĀ«{G3¬: IēPµlßĖĢ“}LØhŃj×Ūå&M“ø[e]£€,Yyō6«]čr,"(֓؆^‚ē>²+öR‘\O9XŲYÕQź©Ż•ÆMg_+3®™C­ÕeؗZGT®ĮĮńi]<7X¦ų X…üµ¢0r, Ģs«?‰ū‚ĪÖņļUr”AźHŅ,WĒ顗C­łKf‘ś¤/gIJT>}™}”Gń„ķ‚‘f)>ę —ŌkCņ㊱ո·+Zq^”„Ü©Qź¼24~˽Ōyp[f$Žh% ļ§»Õ·+Ҍ­ŗńŻX ¦Ö²ל˜īzE ŸD]ÖGąÕ6s~&Ś“É3R[šZi‰*J‰Ż–XĻt(³b—8YńXDbCĘ~~>L4ŗ¶}Ü*^ųń2g³/§Pć‡?c_ Čϳ½YäꞤøI(%TI¼w„ėø¤sس¢Āó–śĀ02ēæ$Kʀµ¤52ƒrįMŠ9“PōG[ÕĢø«čV R…w^–%I9 ™xB ø²Äś ‹±Ęü¦Ļūõ’ęžÕ§~ōė^aę«««ŸżŁŸ}Շ½ögŽ÷‚łĆ_óźw¼ē½óp=±­]¦Ż)qFÄž …:Ÿ‹;m£¦ŽBļ7ōgŚ hHg 8•Ŗ³yŸµ]šØWrjqĀ› „ØZ™žkxŹ%Τ Ó;?/8ż¢|łŁ ”Ļ“SŖ$¢ÓéÄš˜źx'Æė:MS6„Ÿd[“œ<ĻP‘į’:ļS>…Iø@põœÕ–:eŠTĻzL£8éF{µ ™½P2& įöRóc喾 ²}XWŒ'7‘žæ¹¬9ä£Õ0; ß¹sa~\CŚ"Gː…*Q%ōÆžćŃ&"”aåĻĘY†l>­ß<¹óƎ©Ł<‰A;0ļ–Ų8ǘM6&»1ÜŲøY‚å“ĪóÄæk­—ļŚ§½Ę¬ėz8åC¦Ę4‹2Ęčy°ŲāōÅ ?+­ŻÄf˜½Ä\ĒøcgŖŹŗc©xū( \–rć®"Æņ!l\€-¤³ļ«Š®‘R(#” Uńć#ĻA@L­ŹcŅ%׀øź ŻūA‘°ų[ÖĖa=Īi§µqZRŖ U•ŪügåaaŌ¾’7 Š†VĶĮLiJ©mÖ°>×ßg7¢”Ę —]uĆ*9NU3Īģ`duĶ :=ŗ’> UBĶ9ŪR.QFĶõŁRŪ*«ü˜8Ž«šōŒ(¤Ļʾ×5ģr-’ŽKü]?Aø«/JƒŅ ĆF”¹Źäƒ×QÜNÖĻ.K‡‡ąĒņē¹© (ć4 õ V#¦ś/æ’#ßšŗ‡3¾OæćĖ~ßk?į—üü‡Žó¼ĀéÉ'ļ_Oó½9jäźIqõ¼±Öu <ﶬ“Ó¢%”8Ē[„@"2蛏p ƒ|z»š MC1īYWćo”tĀżć¢OÖu•ŲņN+ÆŽüž„Ģxi«YąfĢ,Ł€³}ĪÆƒŁĶ (™ŹĘÓU&U9ӂū Ìø!š=¾x6aq¹wuüI6ä©ß} Õŗ†ß-Šō7Lpü|ōäõˆ‡īž843›£jč×9ąŒTk65I„R9ŃŽƒ*ń©ˆ kģ±Że9µµEc·™åŠĀŸÖł}il”<ū#ī Æ©Ā:ĪaØÄ Ś3m•׏•8…M¶ŻD!ĮwµÖ3 zV§¢RAf™¬»ā(ĶŲ}øu7`>’N‰hp±óso(‚d’“ü„”Wߎ*J3ՋbS„)«lš?»Ō¶Ø[Ų`~%„<id968ĻóU¹÷ś[ŗC$Ń/' ź“”ņS6'Ģ’#Ä.é‰hŠ”$Wq&SĮø‰ˆZ+TNü‰(ė(KĻņ›gwIQlć«Ū‚CĂ)UJޱńX3üv¾ž]TČ)»xkķķķ­¬b‡łÄĶE»;ŪĖ“žH^1d>ŗ¢ģ]čĮŪ)1±<# YLp_,! V|\€ŒuåCQD/œWoŌ ’?-šō8`‚U@qģ!ȝ «.ėµJ”…ˆ!?õķņO&4"Õ,›e«UPīmˆ•)r&ÜņYn®ÆēA™G\jåŽ«Ć”ż„µ=ŪH/,Žlr…r@še™­ b^šXō²|Ņ"ıœz3%ĀęėiÉ"rž>Fž¤u1Õ°š±Öó¬C‚ĶÜćø‘źŌr!t2EĘX†/Aœ1öŹ“^ZĘEƒĆ…[qOW+5iJu Ó'Å› §ŗY!n,Ś€œēø„𤺠JkC~h½¶2«Ž³Ä–äČ[)īŚ°óīŅęYó8zĖ8öw“’†‡YlŒ%zQBŹž¼M˜Į²«Ö ]°";’gČĄøĀ¤PT](wZ©ä‚1¦>6LēŁŸ$b©Ņ£lŖyw|e©(["^Z맟~Z§Kŗ¬Éŧ“Ōp嘢ģ݈gęĖģ æ”¦ł_üą‘š~šß½å æō÷= ō‚½ł°~ķ¬'° Ą(Gńq~"łŗƒ"q@’g-ā0M| ¦kć%{t>PŠ‘oV•J“gŒåžĻS¹Ah dc½<Īs¤Ŗ*ó6ćcoYjWfżSśX³åĮeē‹įš_Õøgģ-R(€ Ü<¼åγńxŚŹH³X+­5Åų×¶"ū2-į™c(äĘ005ōų–½i”RJcV‹‘æÕ‚·Ü- RÖ-_9ä™"[øŹ:KŠm¹°! *ÖĖŖ'ša2A§¦)UėņYX–5U*اø” ˜iŸVćźjß·hwÄQ*˜Ī(iŻįŁ~=Ģ[‹gų——āKFGSjnnnÖÕ¬«‘еL“Xv™ˆčöö}÷Š®dWāÕ`4(jč ’;²Ī„0uāPY­”CįQ?ÅBų”]“õ~\¹J‚ƒš¤!"N“:ęN;E¾8T’[éDćŗ‰o.X»ķRY(ĮńTõOꐄ^wdPư7¢6“£öÖ­ń®«)-_ou„ųņZXā”=0“KļT'łļ¼'Wį2[us Źh•zĖ|Ų‰īkŅKoT1āo0  A㜠S¹õžŒL©Ń•ņ«{c$óŁD1HŹł[U2p¹m$ų®ńĪ­£nw…CżĄ;°ĻpæMöO§SŹnmž³— 6 ȳÜ>KyĘKiƒ[‚@.éX²üDPžŲiRւµėķķ-ƒņ/ģUļæz“²‹±'Stō«°ņéĘÆ’²unĖ‹ĻXm²a«'pɑ)M—ń^ł¤Ō’ÕKö…zmæ +9]“ŻžŻõ]ŽŸĒ3ÖVrŻĖcŅ'QÜÕōȖ"|JX·u]yŌ"©h¢ļw²J: ŗYėć0K«CM2E ‹Č„…/ˆßCZa¼ęņ¶LŸMg…õL@šõ0Y‹ˆh0ŽD÷ü’öW¼q ūg«YAApicĄ;É Ł-”Ķ«b Y&uÕ,kӕćÓļ*Cqįø] ŚÖi¤Ū›]yĖ”YkØfC¾ŗ°R™V5ū’"ßj4ØQ2PXõęÕ»ŽÅüœœżތ“F'¾‡ŒcßĢBNQž1Ū[[$ŪsnvP`,Ż c¬R* w$#½DŹ”„—ƒ[( Åć÷™ņD0Qōėb“ց޳[»+3«EÄlŚČ}ø¹¹łą?ųÆ’ČN» :ĒŖš\…ß ŗ–°š&ĮųŁłH+±Üü “*{AwkÕß Ēēģ…:;+~†Ī“^ŹP]Ś%®ÅŖZ5é`° ä:īīīśō°¬sųW—ļ!'vĘe1ZėÓiEĀIiEH+!"“Ļ?|ęŽõ׿żŪŸŌWiżÄ7~Ś?ųŽļT0ĻļüŠ?ųĀs_š…æP« ”·—‰“śŽ'(ĶbˆŽŚ ’¬ßø·[›čŹŽóąÓ¹­^VßŲe4¶<ÓRn°l}:żŠ£ĖŁßK$.‰M«g[‚6k·n˜¦Ž9źĄ‹ĢŸĘ½nK®†Œ=£V½†p 9c!YÆeTp`tĻXøĶłšöŖ:Rt t5ēw¼÷œÆĖ«››·–i¤Ÿq »t˜%­`ģkec™TēµV€BŠ]5bh„‹Rø8ćžĮŪ&Ȇ‘%qˆóē®3 i+»æ%j9łhZź§§ūĀ}r†n…Vƒ}cüųō,96óįrI ˆ&Jń…jųōŹīuŲ‡n±rœ`Ÿ“(pŖŪ†ü$§¬µ^ŁĮL1ł\ü3ąĮ7;W%ķ_•t |ā<”ś~ŽÕ SäHčj¦kŌŚĻ›ō–‰n8 wĆ[”Ä52Q:oWcF/žõń<Ō+"l3¢?cAęŅ—@“§K*ģé7­«‚—iģæ0ŪKTF”¦öp+ŠčųŽ`~›XŸ,‡ŗI`e[^<Ī@QP’“ķ”!’µ_ūµĢWnr~}•¹s<,æĢŒP- =OFx3øŖv¼«{µ®W›C›Ž!›’õ¶O!I¦C¼ŠqŒÄ{lŚ‚zm¶7Fzžēåeš±Sć}3ńŅt†Ŗ'»Kś²VO&ė;ÅĀ[®I”P§O§ÓįźÖžÜO’Ģ'~ņ'* pų²'_ö¾ž}ž…÷Å[PKvBÅ g… į¢9ÕĢ—(ĄÓé4ĻGcĢ4iś£¤ēu‰“:."WPA”l •ė)[š"ŠŹÜ`°k' i¹N`ŁyŲØ»į'°†¤ū®TQs6l¼‚µÆ¼Mė²cęyvœP N{mÖ5éq…ĘĮ†äf/EžōlŠcK'Ō©b‚)Ī›w5½JŚÕµ+EM©¹*TĖM1MG2ā„ī–²"žPr8‰ü[ ،;ū³ać[7\Ģ]MŚļŗ€ŽagbĻP'”R1Ēӕw³IēŖ•‡µŅ³jµŒź×O©aä^aČSc2y«{ ņ)¶’uō)*;¤_JŖŲ–Č©dżZĀbµ=ų¢{¾*ZĶPk„¢Ģ!q UĶ…Ŗ/ŻbœĻĮ3•ĀϬYė:Ɯ»%ĄéMx³x0V`¬‘QœīSAm»œ1>/ž.Ž8Ź gõ«Ų,œHŚgŽ!²ļX¹€Į±ÖMļ2j ©fĀ#&ØäąŲk¢/~dæŪjŅ–/ƒb‚£cźwÜQYžP—vk/ŒĒʆ¹DŸÜiqmā(÷Fz„v4’אÉŲ¹¦źS,7M9ŽSÕõzÜļŪʐęĢĪ’JEę _’᯽¾wœįśpūčvxöį‹?ö³?5?q‹Z‘RHĘj„€@‚Bk-ģŠg·%Ł3ų1<2ĘźIAm„ 4؍]x–rõ²JG+#­nĶÖRŒčQ‹ /ĀB¾S`KņaЦ|[?9ģsńŁYm^޵]+Ɨ” ö‚é0+«ŃėŲpŒ‚¹kWx''Ø:Ÿß‚īØH<“ń2P¶£F,ģ]‰ß”{ćBüyy@śBƒ\™Æž³Æėz˜ÖZķxŪE„_@—}_B„,ŃˆŽOõŠķt īJ£b5Wr_IllŻ7܍Ału T{żę<:@B(“ <ą”0tÆėͬĮąfh±­¼4_#S0"ɄXæĆāŠÜecŠŚ¦ Š "Jō–Ų•»ÉćZ šq¤żĆtf2Œ»+Š Ó†Có)wĪ>!ķākÜN­ųÆ“¦ė.ŠˆŃćfPqĒøy]Ū&Īņ‚oH ŗ}ų¾gŽ?Üæ”×>õŹ’é·ĶOæ’!˜™Ć)LNˆ,˜®ՈŖÓ56FžČ"JG&gĆ8R·Āš6Ó“ÖUĘéÖĶó®xöš€J C;P#Ŗ¾ƒ“Ńn–#Ź£Ÿ3ĪægY0ėÄ„é©T…E(Ģf”«Ż:äw’1V³b(śĘ(ų¢­µ õö†§„eXtzØZ)»“Īm'ϼŪJ\Ÿpų‡2r^äŅĶó̘ČEQ$Ÿąš]Yč&"ž¢"qĪ»©Óķ‚ˆó<¹a9lļ_\„`]&«ūRSÜzÅ!N†Ć njj (©¾¹WqĮs茘ŽĘ§Ä#^ų öĮķ}bŁńk[1„”½2Īa(éÜ2„3Ó,mšlg¹ō£J2TŽĆ!¢só¤Ųę[qw%KŖ#…ńW ctąęcz³Ų)NŲ.*ŁbŸsd™k¬¤Ž]Åó…šÜęøĘFhB‰£0 Ųź„}9üSĘę<Ģ“°®+{sY—“Ę­•Ā9 Sc܂0Ķzš““ĀāŽµŚN]ZŒžż[9ŒųqŃ4V ;^5Q’ZĶzZµėĪ ¢å‰÷°0pLZQefG*į¼tś+­\«åå7]so¬ “²ŹĢ’M}§¦0•ėĄlܱė?Ź‘2ń]M8·nź¢õŒĄˆČĢ—§ÄÕX¼ßĒcę9ø#°ā`Æ_" ŹČMiT 4bp§D's:ĪW_ś%_ņóļz'’ģŪžŅ’ķMŸśéŸö™ŸI“¾]NG¼BÄ€€fŁmЊčńčĒ0=÷9ÉF³˜­OńūŻ»¼”5”QÖ¶T× 6ĄŠß¬›ķIÉ&”ė¤ó-S•ŗ¬%V± b¢6HŠŲ(›Ajd,½Öā䬌»ņ•Rö£5A}ļĀŃX'½—?ڐIØQŖTKū²XŠ\RŻ›o~¢€‹Åī6³ī*Į[uĖĶė]÷bĖvyĪśå‡ćl ŗ¼—“sŸ @,9Ečjˆ[+Φ7–šÆ¼dNū"ūxō:¢2ŗX®Ńŗ®\H».Ū×"ėhp§ō]Žž;¬Ś@ +HD@ˆž@Ė·žzĄ¹Ķ¦e5n.Uė«r”YŠ.ÄÖXķ˜žŚ@½œ…{¹3ł“Śh»Ģ0©Lõ0f©"4 N²{ÉŁ>Ź9R‚Šį~6¾ *Ü@§’kćķ‡xʆ«¹4ˆńąņRJåÜSīySķ63ūɰ¢ō‚*pŻŻ4ÌJEāyIśD ’O3oĮ«Ł¦lŪ)¦ŠÖĪ˜~/ž‹č„†™0SJ)5«š(Į ‚"·¼~Óöe³t—›„’˜}qŻA6Ÿ;·ņ†w2ZUvdČ×O”ĒĖ—ūjs<]Š"„ƒŅīS‡PQż§)ZļØ'z'1X"?É/ +A–Fjöī{°4R (tsq%_ā…%„@˚lėŗó£G7÷®®āW`-÷³~տ˯«żąūŽsļé§×éĄ/×é;WHČRć8ˆ•‡aŒ""Ŗ“µ'té GPZ–ežg‰Īb#Õ?$ż; 3å4Ģ{Œ1޼H+Dźxb\‹©*-*jtB©}_åuē=!­ŃZ8NĒć±.<Ų  ¶”Õ"õīŒ1­õļKF÷MgŗQxzq Ļ:¶–Łq,WŻ[‰–~ŒU°×U+褸/ =»—ŁFØ·å,Łė‚‡†XCØlŸ$…LE›:B£{Ū3{L|Yš²”4I<’0iž”ĄQJēó)Ī…č—u:-f‘ 4źņ<"ŅD†Å’Ķē6­ƒ†(ČĮŗv³Z­UhČ(ÖĻ0 ¶ó"ą+ xd½ĘžŃ¶Ö²”£ŻA *ĆB6ó9¤Ę¹ÅBßµ–+ ź7•/ó;óęĢź¶r6ū@Ķź)k‡V6i(gēüĒhĢī+Ę먲čNUZˆY‰VīOėJGgJK„hŚM¬ķŗÄĮff®<\ŅUDĪĶad ®IV%Öžš`öŃīR:•³āaå=ŗ¹¾¾ā3n )R©žŽ-E[Iūt޽UF=½(N īó°·\i–K¤™¶Ó§ēy1§I91v„Ćį µ&PhÉüĶ’łļż–ßņ_~ņ'ņÕ«^A€x³źĆ$·K…Ģ6Ź6żHµ‹UiEB”2«b§ūCüÕĒTFoÕ_鼉Nšmræ¶4$:rSņ› v31U/‹ne9#­µ÷“ŠÕyłm9ĻļÓŪHe¹Šü@;—>łƒ‡CŚĶ‹?7ĄlĄ‰bb†ÜīKļ-ŖÅ±­Ē‚ƒnÆł9[£Q)m Vū@×fu\ī¬=2ST­æfæhŒŃ Ż„F]Š=“ą-²¹ßR!ęl+ßjѧ­dt&z¬GĵR".opQ]ū„H1Æēj­µóaŹ?®æAžyKVH777WWWZkk­YüÜA¦b…©2›š_˜K* į¶©-£RŖT0nMRȍŒ`Ś{ū݆΋/Ł!ņŌČO”­˜$c Õ+ VTšģ1·ęqŽųŒ6xxš¤\­U ¬’@yµ±"jRµ”e„r…±6ˆ?Ōµą£_'×(œłē‰Ø &=™BEØVĒD‡‚vßq:1m 4• öąn“ŅK2Ę+^ķ²2{WUBkZit°·ĀÜw¬€ĄCż]ė9Kzeõ00`E{ÖÉõœ"ŗQjŖwzŪ½śV“›RRYŻŻe 8śĆū””»ļŸt¶]bō ‰jÆ ²‡‡M=s”q&/zśēĖ‹Ü!ģĢH[„aŒE‹Ę˜mėŖK»šØū+“ʌgĒV³wż¤ĮŚźzŽä‡‘†Ėyę]]ÜŖŸŚ;Ņ #q;ķźóÅī –śuĄķ.q|Ō“"«ü„ee° +‘'P@ %}1ęB&­t(ÄZ<÷ąeęģŗØy2dŒµ ōįÖ'6“U—ĒŗL{7SągĻ8²—’Č[ ^ė/õīŸœ¾µ®Ll]Ŗ–3“G±Ē³*i«¢¦”éaŽGä.LŒėāBĻz¬XyёęY2·ŁŠfbŪ$ń‡µQAżņ%ŖöźCÉ Zܳ­®”ÆrĘN‹D†™ŗrSɉ¬'Ą­A1„ž_Å,ĘĮpģź„²§I'( IWES}ąP|‹“‹¦rB&­ _vµšÉø‰PÖŁ„G²į4eŸJQµœ£¼Ā^xįÉ'Ÿ”%æō,ĵ*“’*œćÜ_­¦£K.:š(ā5ʽj­G )ĒŠ> É`WėęzØ:Ȑę-Ü£³Õi£ņĮUhf)ļ¼ öų˜$iń onnÆī;nص‡—eyšąĮ˟złųYČÅóą=¼¹¾w”Ž.Ėŗāø1§Óéx¼–廬?,\¼Ÿųµõ،ķ°k§OŖŚ%ŽD1l2ĄK»ŻÉ„åÓ9N‡Ć”ÓUź ģJ/üčŃķõõ±nłpåN7a‚$įG kt£†$¦ƒI©Dƒ@p{{:^¤*ņ.c»+~ø$—®a™łgĻīt:q]5¬CÖŅŲu#Vnó(„Łd^ŽDmā›JkvŽYŁBĻ cDA™Ų¢³Żõé#ž}:;2Hźd5YŌVš>ˆļß"Y„Ō‘Į±į_‚ŅÖZDĄIq(¢3Ż(&Š©©‹«ØFö›C¼FvsŖVEP£•SĄ—«š_cĢŗ®DÄE¦źŽģŒüµ®DŽĖ¶źLį³ĀTĄ.Ō.Œ \•Ģ“›=Ū`&mUĄ -ų˜¤‘/£µmqų![vŁaīģOKÉŪI~Q–§y~šāĆyĘå“j­Cb|ēōQŠjÕB^bĶŠ)ēżśŠ’ByWߤó©QĢ7ŪÖq²nzŹ“›źĀÅōm“‰¦ŒróAƒ·-Ņeś*CVøß+Ķü³Ŗ!±Ļ–$į”<|ģķ ÜŽļX¦ŒÕ.%ŹMÅ (qA$e1–^\>ģS²%čÖŁ¦–D„“”3¶s㲟Ć"Ņr:櫪Žß’;†>(ß]e÷;;•L R'TŠ „qĢŖB…===+.'  ‚Ød<˜$eč)Ŗ”)„¢HOQŅĖ+CLJ¬°~ČćÉĀÕx¦äÅ؊Xrµ S4`“ö%³Ģ”ØLĶ<Ļ/{ŁĖś„”mVgĮĄœŽ\]]…#ĘÄ׽ؔ‰õ •>·²3œ×m”o£Kģń)ø DŚŪµėūåNÖĶmĘ>oH§Ō^”ģŠGlul÷‡“UJ¤s45%ī Æt‰«|"¼ē‡X²­i² æīŠdd3äĖrfž:””i¹2ćÉyKØLVėæ®*ļv'åŁĶ˜²Ł9H‘{”ŖHK.«B’uöVk±°„śĮē:ųu:²˜#čņ!%…€øÜž€”² ,üĢ¾õųæžÉļ’_žéóļ|7=’"Z‚Ó µ:-'‹D Ė*uY\)“” uŅ *T “VXŗĶѲ0)ńZN84ĆŖļLĆ:£-‘™gx<ēƒĖNƱ†@("$b'©, )°^Ü%|SDʘeYB½¶¬ą–ė/7Lčż&ӕēȅ‰÷¼ē=0 T ĀóŹ’kx„ qŪp@ī?qKŖ<(Waug_iN"@ĮqŒ­J&ļ=|扫o™Ž2?é¼&š°ˆKݧ7ˆā+evbŽ@…@–Ų&8€9‰Ę)3»£Į/¶ŃfŪ…„*O"¦_#7ŅĄžÉ@×óG÷×XŻ¢dõ²ĄėaVĖ OI W•Ą‰+N1łż¾œóėjÖÕVDĖ9Ā&‚ž‘! |²’NZ8ųJj”0YØ*aŒ•ū¹k‡OnÜNŽø•½/kįåBJœxŹóaš\;u'N°®«ūL÷N8±ž”łģ0MńƒZF^Ɗ;Ź£:¹ė īšr!!žhžž’•’ŖįĆE÷Æ_~MīŽü‰Ąųµš€`‘Ļ ŗ5C$ŒF,X@˜“{7įKÆW%Ė)Ł Īī”IĮ'vdÖģ‘Ļä’Ggū$+Q1ЃŗKŁį ƒVeµ¬Zё讌ōėģOR½AõT ņ¹1ŻB×Ē+ Ö’œÄßņ‡žō˜MčEr5*Qؘ%x€æ?{^JHœV9·:K~zy%Ųųŗ ‹P)÷—JŠ’GIęDՈ“įŠL¢ Ī7«µ†Ā“Queö։JĮķ~—%E‡ Øė„u|i4ŹÆ=fŖ§ÓY}Ÿi÷¾hLō‡*Hl¦„@ė³ ÜĪB Տqņ<™†€dģ<ĄĀŽń®oūę’᛿ńg=ƒ1Æ{ņåϾšģ'|śg|՛æī·żžßs8LQޜ“(Ø/™ä”„@(‡óĀŽŃ*«&„ņ³¼déVFėU’žoV@K”Õ¦t_9©¬s—[°9*Œ5V3,cŹ8ŻQYLNǫÓO=įPż%TOŖ bxō©ąSŒq°€ c˜ NŃ;T‹ŁWV!ģ\ضĶn±D’?‰ž›Ī„wµ “`™“`ę”b\ŚL6œ­p²`ŒADŠÉŪ‡°—gwõš~·!öješčÓ#Śø,NÕŌŒć fHykgJo›t×ĻhaŅź—ß›Õ:Ń5ÄÓķrøš»‹čīŠČłé•("X–E©ƒRb?`ū#†}f˜qŻ%¶²¹n2‚Ŗ’„·,@ āH¶iqĄŠŗÕār=’y¤žĘ¼šIÉĘ9ö¾’’]“¼÷ė±Ł ßm]×^xį駟†_ŒÆófÓŖ:j21>#%Ū™Q`‹ņ>ōQgWZ/‘ ­ ø%Ä%DŅĮŅØ¼yxżćt„ĮŻ…Ÿ%܆ø» ŸhŠ®0U¬¤:…Äې7p¾Ōük?÷s~ąū’%ķća^OĖ«ŲKχ–›ü؏ł'’ģū^÷±GTcŅŽyBܵYā\‹•i ¶Į¼Ä&ō²ÖĒČŹōŻófż²sƒż7Ü%’=BC-D£ņgQč {żuÕÓÄVŽć¾·Ė”3@@···WWWŃFŪä‰ŌV”‚uµÓ¤ 0<ÖGͳ¾ŗŗjÉčm ĒŪĻt|Śäl)v‰‚“®Ńuó09q2%īs\wę/‰é‡Ø-Å)„€§µl†8Õ0‘Ą‘#h”ZģžAóŒ ?DX)dH‰U“6G«ä  #¤Uź¼L^Żł”ö ü -ŲŽŅ†w$ā”¢f˜¢yć±I7ĘjTēl<ŖLŃ#7©˜ģōˆČėÅQŖC­°ķ¹†ƒk‰϶”Æßœŗ#R2e ‘Gõ²ø$N£ģe+%o‡½¾ óĶg“4›)1‹)²¾‹Į<ĒUNUł]' ‹ÜõÕ$Głļ ±J ŁŖdWēģgĄZ«@Uóįņ®%k†/Ü÷;³±,?kķ_†Ūa¶pČ$„ €[h[¼Į«–āÄĆD £®ĶͶ8¹Ł×V™ž·}Ą6”PGÜ+¤l įkYœN»ĢXłĘ×Õ µćšvuD lZŁņ7ńÓqߑ•IrØhD&‘“9œÓ"*j1ׄ ¶MDDŃŗgėjœ©“gŠ}¼ƒ&ĀN½’³[Ó{g§sĘ顖:Ģ鿒1–µüŌ§ļüĮeó¤g§±¦ę ųP¤»»—‡ŲY pŒ/¤?L3Ł­$@Kø˜·żĒ·²™P§Ór’‰ėgŸ˜Ž­ķū–›[€÷¼ćķé[ænOė‹/2|iõ „Il»^ī ¼1•ŅZ»ŸUä²ć*]W ėĒFįŚŖČį*-mėœlÖŌ3…Õ½[³DsEr,r^* y*˜CųdĄ'¾ŠÜ<øÆ\ŠEƒhbż-WH#PH@ņ-埚ŃÜųä7¹¾¾¾¾¾'{Ā­1³NeN:K!ĮŗS[ wŸK¤T‡É&¶ Éń3A›õ:Ć,e` bē\וµą÷L™“_«ØņšWi‚:!D䱅"…\„Ć-c!•šŪ=l#ōÜŻ)IÉG@5–Š^ąĖ©qs3Je ŗę³ SŒč—``7™/ˆI]’‚ˆ ¹§§4r&ĢāŲē»®m±–8ģ6ƹóƒ&ž5×aBhĆ ›ė6^ūĖĄ~”ć¾$‰ƒÜü­źg¹™ĆūōN$Q®@ŚŅś²•ń+qф2Ī<\vr³ļ5tZp–v’˜·ķż1ż°Øö‹J»|؃ šš~(Šz-ĪÅĪ,˜«x§c2T³07{õ¦R,h«¢8˲8ÆÖ"T¦ 9ŽĄowč0ŖJĖIž)EŃ1ĀĀ•Dė %°ülŃśčK7ś ½p3Œ d³sÕø«Ś¾k”a«;$ZxKī’«µžŒ]‰AĪd&„”ԟ&†éĢłpĒ‹Ź}įą£Ėą†3p_hˆæø¼‰*GAWWÆeß¼'ĀąV®3ų·ūZ# YĄóRfz™ĮÉZåĄ¦ć’ƒķÄfrē_å³Äƒ¾o<ŖåŖļ¦œ¬%@”PŽu…Õc^GnĒ.qćŻ;͹w3‘Ćnsœ.©z!€¦>žuÆū™½~ķ'|Ź÷|Ļ÷ü§½W)õüsśĒ÷ļąķļyė[ßzļŽ}ųņ?ņu_ųe_B2²IŻÓ5DĮŅ2Ŗåę°ÆOK”Š5"kœ¾Ō“Q£b¶”՞N§ėūW•vżć)ƒ•)īŠ/ö—•<ėÆw“„-ډį3 5&¶ßÚŖJ”ŚZ‹¤B?™RJ5RĢ EåĖ©(Ų¬µ§ė÷K i›RĘŪ„äi(ށō›cēqH–€Ą‘7iV•»·?"X”āÓLßT–ó\_¦Ģ??ļv|RŖ£“i?RŽ–ēެäb˜āašnCš¬DĶO—eē <īŽ(m5“Q(L"ęœäI¬ĮuåO‘g’fTÉŠ·LŹø…óX[°ÖF¤ĘĮ§V9ö䎻¹¹ń<“čłĻ `‰2Õ·$%±•ĮK!ßźœK)š3ڲ qƒ˜—J;ģ¦ŁV1+»˜uƂµ?hu3XfDaµŲ)åcy õ¬_x0MÓįp€ ³ZÜźĀO…=śŒėšÕ›ŌzÕG9"śąK'P#½÷WޓԩČ('¤ -/=æ=ŗŗŗĻ Z)Ś“ĻUį™ä)7høÄ é¹>|xļ‰ū#]#”&ŠųÕ5Ž@²[q%—ŖŠ¶CˆZ%b$ČjĶšCJš™4ÅZōf”k2ŹUfÕZīē9Ƴ9™Ē;«2'g~æäӁaĮŚ@¼’M!199ģę‘Ū훑K”.łŻKĆWK€øœNóįą66lW§”ŖĆnDk½, C+ł1g² eš PxµZ³ˆy¾ėŪ’Ņ;?šn­ĄZų'’ö_NWWŸń†ūŁæé7ĀĆõ?üÆß’ƒ?šƒO=õŌ ļn-^)BąR¤qčŌģR{šČ `| 6[ā ®÷Uæō¤p(ŪõgWSĘ_Ÿ±nĀÅźa mmĘ 7ÖĻpYy/ķ“ĄĖ*r$Ż®TŠ \n¾:®"ż%U§}9āĢķb øCŪ]’ļHŽlćzdJb:ąņA™* š¦"£Õ4蠔Æ?ˆ[šĒ|8ė„“ēgų†:ģ–bö($m<Ģ™Š+­0ā•‘Óǵ8 3d2ēĆžPrЦ9›WŖltoI?!Ȕ7BŻ!r9¶µÄKĖ (Š«ŽėĮÄ6ß”—NlGēÆÜK‡Ć!³ĻKTß K“ņc>ūZξc|Ż%{\£MŚž=Øb #²ĮSś²Ę%Ī…]ĆĄ­<”Ó Ģ£Œ‰“Ń RsZæęk¾ęĶo~ó§|ڧfĻÜY6PŒ ’³Õ°;󒛣I#å<č¢C[ŲÄzk“ō˜a+rrȄ<¶ /XkĒ£dÓ(ƒ½Ķz«„ČYke%ģf¹|¾Åü3r–¾7x«Ä~b#ĻŹÓm¢ŠŲ‘˜Qćūji.½ž:æšDĶPż½-čō—y”d½¹<&Ł›^ŪģśŹÄŅ`’¼q©>˜ŲzŹ>]“¤Rķ|æ¦vē)Ć] LŹ·E@t,<^A@ĮŲ cóv6­pJŹŁ¤ĪąÓę 宁Éņā± v€¢r|ÉżīæõŻĖü­ļžŪ_š;āj@k@°Ę,Ļ?˜WśœĻžÜ·žŌ[ÆīæüŻĻ~&qųkų„]µ/Ż&i<˜ĆŒaØłFIīŻ,µīŁŽŅy™›{½åźµUÆK\~­§eš¦@Sā†Lc6:F 1ŲuæØ°œŻ“»fņĻ+›ŻłLHG㳿Ӹz:“ցŪ^Ś©i‘dm»ŹåøO\¾aŠŹ=Pö ys†ślŌL=]§bĢO ä[ž8Ċ.ö¤’­ń+µv³»Ę˜iÖ2 xģ‹•‘€šŒŠßÉ.²ĪÕe»ĪĶ c‚ҬŅrHeū¬qwŽ”ŪźKĄ 9 qsss<³–ÆloōĒŚmĄ6g\«¶væ®ń¬ÜĘÅXY'+Ś­ÓK7FvSÖ5¹Ī¬ Ā5oåĢ„·­¼Ž¢µVM*C„Ŗ§„÷½ļ}O=õŌÕżkXW3Ķ}:# īŽ†'[oõ×tå†)ūĘżĒ׌Ū-„Üž–|(*ē[’µļe“ād“'e#Ū—’åAM·ė™D²ŗó4øŠų‡<ĮąBņ-՝‡ ĮdŠė §©‡³ˆŒśGŲŹõB:“ RČIöĢU³Ž}]’¦„)O·‚òŚŅ©nš’öłźÄ„ÕA¹=œjCįN^ŗ7[ټōĪ kI`­E­ZńpgMä?M”ŌOg?ļ,'$åhėT’°RÉ0{_^6ݳ@’Å?‹øļ˼ˆvUJOś ŽÓϽļŻO½ņUļśąū!›ö ė8£|R%ĪšŚ~܃s"ĬėžqWĮŠ€ķ&ö¶ń3 k6BvĘų~¤BĒĖDčŽņŽŽE^×õp8”‡hP­~0Įč·tdM7ĢP½=8+4ņ8™Q0ĪWcŁd ŖõCųߕMdS…2y…ļjŖģ1AŲ¬\“’¼"ŲĻĄ§+ŠjŲ±WvbcaA¤”*óį,lŹŗżõė±9Ün1e,ū¶VĄ(ķ%ž*s§rĶŚlĄ›cÕÅ­“fŻ›Ņ(!čIÉņб¤ż”ĘWæęĆĖÖ$Ŗ<ŚędXŽDŹiķ>ńģęY~±jlęö”ņ‰(2}šMzžbōƒ‹zA‚”e„%¾³v‹@ŽPҌm„ĮżBrטF(¦ Ś%³žs9£;·‘‹[hÖ³ØāK”u½å ŲIQ¶7°¹£ˆ3kY18xĪĒmÖ2ŖŲ®h” ČĻ[·AE˜2ņ¹F>rŗ‡rJĘāJé>©šČeL½mcD¾ĢĀåŒ1ÆQ żź·¶ąÜīė Ą#†…=|į¹ēģŗ> §’˜×“±”²øŖÉLOŽ{īŻļƒÕ|ļ÷ž“÷#o‰­ģµ'Ŗ•d¶ µ©UXu,‹Źõc(æ)ŸZV²*įL—d&Ł@`öęCēœ|,M.AÅZs¾Ü?uŒ«BeA­ø"ȽŹėćU<:Y®Wė+&cWˆ|iü‰Zį#QŪM1ż˜:®ņzr¶•ōŃĖäR>-i†2š?«ē qŅv‹šŠ§Š;„QIŲŅIö½£ŲńˆŁ!mqŠwTŽ*ĻÅ͊łĆd 1””Bl€ &L:B1ŲX «ägB­J©|•Œ5Ž<ŚM$³yJį…[Õļ4™fĒT§:Zry³"a#oĢ1¢.:±Ō-Źr xš #—(Ą¼¢p¶jyÄ«šXŪ'×dÄ<#ȉUC̬9˜0œB÷³Æ¼ˆź«źŠ*t)AĻŗģ2yżXÜ'2ą“”,Yč2ާõń|öøku X­#g£ÅŖ³A”škqÅ`Ć£›%ĒG^żo™±AҤ% ķ¦¦uļ™ĶW„X¹4~Id:’Üé\]źĮó’ueņ$9ˆ€”ō’©žx'Æ6ÅV]^ŠiÕ4·Č„z6 Ļń;-~a÷¢Edu„Ē„7¾“¬Xvļ¤šQŽģR&ĖÉū-¢”@1£’?«R#7 …«ō)v?xŒ$%|÷;ßuu8¾zŗf  X$DT@ʼģ5Æ~ē‡ŽÓō‰æüKŪŖK6„DmU© ‰JŲ-”åōĶ]›I&BuĻr’¾ŲĄx±Š›r’”yѾ,*ÕØ¢5“,’ꀻ»„£žw';õ•ŠyŚh† |īc2”M‡”H-‚„„.ėt:MӔќŹ7Œćµwq…#¶8pźŹx öƒ‹6?t3+sž —¢–½cÓ>`%bČX‚¤ŽQ&b éTpµÜÖ 4±j„¶^u–Ņń~*8fŒ!ÄQ’Ś1h’”·y0[|Z2FO4šš°SK [ć©}BīlĀPū«Uk.ļ.sOR_Ś=†±Öz|.=Xź–ģķUq«Ō.JZä‚Óétø: ‚1¤5:%0cl?ēycģ‡Õ·œ1vPǵ•÷–AĆė갅‡i¦Ričhų)Ģ}„²x‡7q5ŹQe#o·)“Ŗ„ÖīƒĻÖ’ŹŁ“, ̾§f„n"Īķõ„%¹“4V݉˜źtXg8˜ć0~”*U¼Õm›ÓpŲ+;zój÷Ø>å¾]”£$ndĘ„½rQBŪÆ·~Ņ/ uj£ēE›}#{oš";§·Ū™MģŽŗ®ó<·ō>w”0¼§„@!!’ń$ņ @1}OnåD·ĀäĻžx£”4ÆjIV½FаŃ¢;O.Ą-Q#ń’ćĢŠÉłĒŚ•‡žˆ Žąd[OŖ£w ¤¾`‘_!Q˜‚+³Ó0Ę£” ‰{ė6G4~‡ö‡0IŚĪ_’ݟž“'­Ž€ V«-Mh5Y$@TDŠH(c9:#‰Ž’²ܝ!„Ļ 2˜‚¦›5Ą½r]ŻČācŚĆu+ŁY+Źc”œ‡ļÓŗ€ą¶3VėØ$Ī!hay*THQšå%×”š‘@FsŚ }:ÖóMN½Ø³lič¦Õ[^öyŗÆ#.b‡š…/•ri‰!)%ŒiØŹ;mÕkF~½Ōe9c)ś…§¤@žŚŚc^Ģ'h¼ę«`.äō¤ŲłŪņ‰įN±JēšFc˜œ}įwPkåÄ9}1QkÅõސRbŠFˆ”蓱UõZ(½UĪ@)Œ™b‚±7!8^°.†štZĶź–dŽ]^jXčk™Tkv½X3¹£rāŌŽü>s®Ŗæ–Ÿ8ņ ½bŚh“¶äx.]Ä6üM(eķ=C4ĻŚŚ¼Ų‘õ¦ČĘÄXOź‰'ž€-”ԊPg*jŗÉĀŻ’f­ڈ³7$—tŁeqzČ”ˆFD,’Š‚YpöüétźĆCaqģRĒX:njdׁ߃ūyI‚„”GD;jń(tL=÷ŻĖÉ G9œķ$†¼zpøĀd¼“kŠ š`̱ĘP«KĶ5ę'.ŹŻ§xŌ\ģ)UōKĻ»¦ĻĪp²™]*•t @evnŖi¬ĀÆśæóYćģżjS„čwŠć”Š‹ ʧ$n(÷ēŠo]„d“€u]ŠR¤X!Æ(ņŪF”ūö<·˜²ĢĮßł«ßõ_żo’«7}ś›¾ūļ}Ļk>ź#›Ź§_œ¾hA‚ŗ&€äéFĀ·¾åäM,§Q^”N9p’ĖW QŒ¶^ćUł!ŌTkō‰Q|›¬w,7Ż©ntS•`¶č‹ZųFø©^Ģheʟ‘õWʦ›  ?33u–CĢǜ S-LA‰žJƒŒyž˜<'ō>¦AƒÖÄWĖ”YĻŲģ†K…u:-J©yÖb¼‹Z“0{怑[ČvØ*ŗ†_¦—³QĻ‚ń8yva“·ģCé’ŽÜĖeTÄGŲ•“/”½8t'BķČK­!„ µŪ#! ¤5¾Äk1ĮoK»$>±¦€Ņ¢Z„ę ·„^7Éow­”: ŠŠ76ĢŽ»˜»Ągf=·—NÜŠ˰,9+ØČ1žĮjJ,łĘ䂋4„²ƒÖ§“—Œ†¢ąļĶėņMæ–ķ"ϲγ²k"¹ˆR±nÉ£īÅf“Ü ~Bkģ4“…ŠOŲ±õA×R€+QDĆ>$ļ“,ė|˜j빓ƒŖŚöd?«Tņ†~Üæ3Ģ›sŪ(dĶՇ\˜’‘WĀ\%›‹Ņų'1兹€ÄęöÆŅéČŗŖ»­½LŃ-Aņ–™b÷Jd &4øćŒŪ&{}§aŻ—•ćīl1-ā’JA|.Į)m Ķģź'—5M™I„ŚŻZĖ ‹uagZœšU“~3i¼JĪD•‡ĆaD–¹fļo’±\yöVį$k#ĒķӄVĮŗ„jD쬔ķ„\ü+ĘIW1§-+R†ū,Qsƒ•~¾‡<ŒĶŠŹkN§Óŗ˜˜łˆ”į‹~’?š_æķ§~껾미I“Üž25n»f Šp WK¤āq R`'„¤4#­É‚%­$¹ōIü}™šÄ‡ ŚīWWž‰ņWņ0[01ėŗfEń~±§‚ü¹»th°Ŗ—ÕšŹ|D­•ƒ6PÅŖ”ŅZÕ« ae,¹x®UDș˻¤;ńæX­¾„‹ą3O›ņ“I„♵Šqņƒ $³hƒ,¾õFU¦YGųh4gk•b‰Øņ0 Ä<„˜. n‡awi=¬§ƒH&‹niŪ%ž-҇jW¶g’»¤VÄįä8s— 9"²į §&k³76hƲMī[¶Z2»ø‘ūÜ 7>0B°+ęŁl*“†,JBɒPÖt²!šŽŁIiˆµ$eL’OœłżÕ ägÕivi‡XWT'Ÿ”‚s‰ĄHč9R>¬²“öåHz\/e5ב’)““‚"5鏒¤_ś‡žš×źYN7 Šū÷ż“Vš”•ztZוž_ķ<ų…÷ć-(œµeQ£E“čØz,1Y?ēĘÕ–%9¤ŅL]Ŗ %9=)=©lX$Ü(ēW„ełżŃ·»\T¦š±ĄŠ,mvCĀā7>T777ŅFgigkąM–å$‡D'G•“CYģŪ§—k2‚FŽY^į‹Qć„bA¦³t٤݄īÜMŃ ÷Ū¼ńŅŹŽ\4ø³Än@*ö÷$ČŅŲÜt-0ÕīgŻ©÷„Č<¼¶LV&ŒaęŌH)œ&•Z,- J±Yėxü8Ē갉Ŗ¤‰žœś1ęhķ®”*„®—,¢mł~¢NĆ!2޼Œ€éÄ5fKAä|iČ<§ : [ø½‚%٤õD•ĢXi-u~#4Ć# DˆuEq8-cō¾Čµ!Å,3QSSķ¼Lf¼Ÿ“ńpÓĆ%[’“sˆ]Q~äŚÄ(ræy»é§Z!āöź¼W–]Š»Ær–7‹…o¹­«ŽµĢ/DŠóć3>ć·üöß ,(<'LD€„¢BČłŪ;ÖM¤˜Ū$°FĢ;qÅZGNJŠ$ņį:[/Ą—%ŒA5…ś¤ÓcžŒŻ4£a–Ų:ęw>¼wļž¼ųr©3ŽÜŅé• 9¶ŚŹīA õ_/+”ĢĆ((‹ŽlNņ“ä¦N§§Įį6³ “Aoz^Õ¶Ć4žiß„›››ėėk@4ÖĻ}OqŖ–°Y 9#Ģ^ÕN\Ž÷š=2,¬™ŌØÄĘ "ĢLYŁcŸ€ĄjF”šų_r²Oäó[„‘'H­1jŅUūnYŒÖŚ3O: i#ŲX„Žä46*ēTNę·„aöŗ¼!+;r‰MN{k€Ź’o©ćóXœgž‰Œ1ó<‰””¦“ģ’™ Žm&Y"9YW3Ķܛ«ßBō•E>LDq.’} ŒćjĶz‘¼āDŌF…ĖƒŒ¶R‘SSæĒ*ńŁvGTŒˆ*k( .¢75ŲI±ÄUŁ|8½”d«§]žlĀųhxC?—X™Į†z]ułŲcņ$-⽋ó¾]B]¹sPĢųW×½Ķķ2č^÷d+Ö”œŪē8Ā7?ā˜µvšTćVĪ“'Ł1©2›lšĮ]±ā]Å’ŲØŽMbÅ~ĮŃÕŽ=¾õ(;,<^¾!‹šļf“ż_²ź“ĀŖ³ƒ®G&Åō„k;£Ū?ų+Ón5Dįnji•źŌūœ”ū 1ó>®PĮ#j4ź0 ÷*^“Y˜7®Ö»‚¹~ÅĖn<<>qļ×üš_ó’ēæ’Ķöϼī#^’ĻąŸ+PŸż™æś?õóæõ·žÖćkžŗ÷²'Õń©d˜!{ssƤ”»ŗd™Ä±Y-'' T@*ĘźiI·³S¬lļ γ;w˜9gjœ¼/¤®]__C¦°źĶXEĖ¢F«øÓAFĄ–*żŽ|u¬‘Xu€ą1Ąé3޲Ćį Ɋ¬µe>|ē‘NV9(Ė^j*$ļ¬šźźŠćÆŠ%>s<aõ qŁÆDĪĒé×%®©)ßöÓ­›$ŲĆi¶CX©xB¢ÕZhop1Q+@@­Z(é³V–ģ1Z×J‚„Wu{Ōšdž«ū-—n‚ŗ²KȦ\ŠeėŁņ™ā“p;ĻSŲhʐRÅŲ’÷̶jņórź•š©`3{ß²o°AƎ¹ĪM†›•©JM2ˆŅDŃYŚ öS^œnJ ŃdÉĻ™ć§q=ŒęrC5noKTŖ(Ņłü®ÅŁ#VkĻĪZX–EėƒÜ6bGՇS†LtBZ†C[vĢĻVłĢ·ß$„I³Ö“ękR &ÕÅźŖF5)żąØ¹ė {ŪŽü]U’„Äit7”Š]Žxr+mĪ`̶W„R>ø0!1“Čé‘/ł†;+w÷{°¢ø‹įÆ`„¹<Ó¬ļäD_«0Ą,ü‡iĊķ~üżź5sĀ$ŗ—*cŠ=Xi…sGεLŗs-ždł[̬HėŠZjC`įŃ»ß÷Οł™÷æū½ßżŻWkż–’š#?÷Ž·ä§üŅļūßąū'į8gāJZUŸ>SŸä‹ć0‹»’‚4|¢« $Yœx0Ō½'ŅiŹknŃż Fx2¹hG2F™PDpAšķšL©āßVÓ ·:¦ib"YؚČīKt•”ØÜa)a„ś²Œ6$G_V ČŖƒĖ² xœjł£ÉĪŹĆņ5¼$F#įgß@6¼łŽ¬ŲʆjÕBŽ•]<[§āK¹k|f‹%ā#³ŠƒŲ ·?I…D42ĮfŸX“ŌĀģeXVY”ĀμÖCüjV«'å»ÅI”zŹ”Šcč²#Ö4t„ßHJ”µt:®®‰Só}ļÕ®ƒ…nē&OŠ]¹F뚱MSVūy5ŸŠ@Y¢ūĢM`R٤irшaNŸx “/än5…ˆr°thÖ†~]Å{›„ģd AbX{v”éÕF —¼ŲÕ9,¢¤lņ¢x1E%„2PL’+ć]u¹£S².Ōəŗ‚¬c«żEbƇ‹'w/[”'ʼn±–ö$Ē,æBŌ¼QĖrYJrrōņcóaāŖQÕX¬ņ·_WcŒ »±FŻ/ł>6¬k13‰fõ“e›åŒ;:e#.@)(w'„l!„+n‘*Ōńņ}`Z”&ŹŖŅ%Yéxā=Ž«öķ.ļ¦l¼lĻn©ĘĘćšIÖ7Gņ¬t ! ōäždT)„&ķ¬ƒt®–ˆ}žWŸļŽœxVŪ'„dAČš®ü`™Éc‹Ļż±Ś›ŠÆ²ZqAx‚ńxä3y¹ć0»yĻīS ["… X":Žā‹Ļ=÷ć?- ‹H7˃^øŗŗzōčѻߞ æī׿ŗw¾ųœ‹fŽŸżæģŁ·æūżz’'½ńŸūłæįWžĘßųė>ļó|±Ł¢RIݲŌS„klµĄŅd­=įWN§Ó<Ļ UšŽIŻŻĮäÜ/:5 ģ)K×ĖT­AzU1U\³DOX*Ä˲SĘær'łRéJIˆėtöd§ßXMz3[\¦#›Õē)Œ’āWOwZAægĶŽ$5ŻV‹#ėlųnÕŗ =OI·[ßśٲu}éu]‡cŻ•f GŠ ^šļ54E‹.G®£č{¶ėj§ÉÕ ×ÕNZ%›>śÉ[Ó5¶ˆDÜ[ܒ5F)e ¹Ićź½”ķ,a”8+^–už'÷CjŪł[Yχ P«ŗ›Mž’M¹ćĮJĶdæŁå…2D6_ݩʯ‹™fąp«Š/śØŽĘʧwb‡ŗølq]WDœf ˜œZkqz¼/Ü|”B˜Ą–Ų<łzcŒF].ūŸā̶&'­˜ä’ŗÖä#åtą5r›·¶§FĻ<ū'?ߝ¤ YNė4Mˆ`ŒÕbNÕ¦ÓõŒ˜r]ß ä^ź¬ZĖ(-_Ŗ¦fŌ‘«£S~®Ķŗźi’½#’4UŠā¬"Dņ˜Š±AŒ1zV~מ^q®ETč E8:ŽŌ=SŻ×&2Jū)m¬›,žĢåv9ę°=ÕA“¼םw•įk™»c–e¹ŗŗŚeßS²ĶŹą]Ķ`ļ `N!)X1³“(åućż.*'Øó(„z‘«E%€ ¬żŃ£GrʰßģģT6+<œLéŠCāzŁ“ķĪĪŲK5%Īoƒc®¢\¢hm~¶ƒ””&ŪŲL„¾Y`¶«ŠÉ-[ųWóļżļśk¼ųĪw¾óϼų³ļǃ‰–Õܛęe]īéƍ9€ćÕÕó§ ų/ŽōĘōžŃńx<>ń©)CĖa÷Ķ£U¶¤6GxAĄ²ņ›øćĄéŅ[ų’!cyĪe œ\5ŹfX)ˆx`Ŗ÷©*ĪYJ\„ĻĮĖ~ś`pĮ b‡Z`Sx¬z¤÷/2“rĖźķR¢?æ^xĪ…n 9C`ŹßœN«µ–5\¼Ų¼Ģ^JĢ§Ļå( dÕų•3Ų,HSB®ŹsWM‰WcO§Ó½{W1®„"Ā•]£²ƒĶŅC{œnĢaĘgRšą4„€ŅśĪź>øA_¼‘w‚›M`ŲųĄłīų@“ŗ‰°¶ŗ{RŌqģv–Ó¹¼Č ·æ|²˜1ēé”plµÜ9ā5B}§eŲ×uŌŒ%{ąDH°OòJD‰c’¼ŒrpCbģ³'’D>†Ufm$h?Ļü[ž‡ĄvŚÓ+&ƒ=?°Ļ‘ź{Ux9’ Qėf]uYĀĄˆ/ śK’§ =¹lŸļ¢ Ŗ~­ėŖõślĘ,¹v+ {®p<Æ6fķŹC°~`RĮĻmķj¢N8ØXVÅƅsJŠÕhßūļ„ļŗ<†о°a0ށYĆĶĶķµ·yųšę޽+cH+ §lcŚō9fÕ¬ć:a‚µd–¢ ć½K0Õnṕ<ćV'^ļ¤{<]ų¤;;IŅHķ~8B6Ö0ļČ©IKķ8“ØNŠRÄ ™ƒˆ°®ó4²@0-ōžŸ’łw½ēŻßš ßše_ų{æé›¾é§ögŽ<ü ZącšźdNļ ‡^ūäĖßó³įʞ@ĮļüģĻūœĻłœÆūæüŸNZ­p4֢ƌr©^XŻsJū_RGžDłĪ¹[REž ‘Ū0üĮ¤¹®ŁŪ׍$‹įd:яˆ kĀ(»ÖeÖ¤³>›qUo—9‰ÖfųŹ4Mվ؛«?Z¹ßyvA’Q?n÷Š_ĆėĘ.°ÓyÕÜKśx1ųŖ]MÜŲ B¼ŗŽĶ1ņMžF1¢°œšxYÓų­Nšģė¶–ŗ* &L“Is·RvpŖ³”4ĖD[ŅM•/ŽĆjģhS  ‰(OƲk8ėt@=@d6¤©_Š6ļ)UÄ›ų²ōįr°“±Ö!å’eDPŖĒbŅKģ—ÜźY^ņ7 ޱ™ż…ÖÜzE²MœĪ¦Q*[X5™Šz6™l uŻ/··M¼ 7ī ōŒņRR¶ķ^a(m”¹=Ī@;Ռ¢p+ŻP±Æč¶xčd$=ąŌ€¹  BāŚÅĶ•ķœõpÄJM\²¬Ļ/Č’c%‡Œēї ļĢ1…“n­å~Ć<öܽ”`FæĀä!®ń „ʔÓdJ< 0gžpza-1Žó%l”‹—ĄĢp—keu°÷!~Ū~9šdy(“Aȇ­…{÷®Ü"0&(čŹĀƒC„<Ŗ&®Ö#(oržē]õ‚7Ūy`+jŚ`€ŗ ōŽśc{BšĒ¾`¦”1œYīļx5¼ŅZ˳%e‘ļ­µØ,ż½æųļ{ßū¾ū»æū-oy‹ūĘOćæüŃ1D/»zāĮĶōŖū°>ó[ĖMd HšK>ę£ų‡x™_q’)@dœ ŪÉ1·fP–P{‹=™$śČ{˜IetVŚĀT÷·N•8 ¶†X:?—5ŻąŌAØ ”`<†Ą1‘Ęę=ö³Ö3:œĮ<õ ~1­µ™Æ\–ežē‹Jbc@ŹĒŃk=Ļō—cBmśūX»Ü›Ą›üĒ^٘mOa`Č`ĒIz¶²Yé$kURŸEŃƒ^·'ū9ƒ“ŃC„TY’Š0 ÜZ«gF[q¤ā€Ół0a6¢č”)R’s4ԘoeK*ļčR…ŹČ%PA”ä+#ŚĪLŲ)>ąP9r/žS|.£½KQĒd#Q¤ō¹ū-AIx][ĪĶ:Ž{L©!ˆš÷’łų§@¼ä$…E/4šŗ©Ż¶·lą“^’}Nµ„”čŠgSĶU˜}.™&śäĘX­UQ,NY¬Jīī]2QĮbfŅńŲŚˆFGa«ū%3xg‹T¬uŅ£"«fšR@lr€\’é rāĄ£QĪė•Ę?TĶøŒ¾yāJėŻI[ˆæJ~Ųr\xž ¬ Ac6ʞT;H(˵»&ĖJ±Üź°Ć]Å?ēZ}MIPjŒ M”ņŁöę_†GGń›Fž•ųŠ6čśą<.®=‘ź U5 ™‘V%Šęīu”ļPÕŗ•g6ńŒT‡ś+’ĶÆ*„ÖużłŸ’łOś„7X² ŗR­9čĆ ę O@š˜ļŻ»÷éæüMó<’ößńŪ~ļ—~éz8""CŁŻ(Pk Nš€+{y……%+˜Z±¢«6‚³ķ4"Āūp¾j·I?Ų¦ĶJTŅŻę“~Lē1-_^»‘ˆz g€įŁĢicø¼É…°·ŅÜz g2? ø®]R[{ƅ—,¤»Ov2„yŽ¹Ø¹dVJnōtŗ/¶„ z˜É#žÉ”؅׳”šw‰’=uZOĻMōĀz{}8><Ż>©§Ÿų‰ŸxĒ Ļ¾į o˜÷īZ Z.@³ÕąDŠŒµ‹„“¶ĘŚj°“AŃąfā“™vvh—BƒŹf›ĶŪ+ÅUŹŪÅ^÷„±¤.ĖĀ]O 0żæDhW–U}Łør]v ˜ Ł/ĻoưJ!ŌfŒKäɈ²ß]ŲńY.Ÿ»‡Qł±ęĄp×Wž@ŗŃ ģ:ŻL5‰3BIEƒ¦œ•4”­‹Ęe]̲,×÷Æź›ė,#Nė{1Õw)˜īźtŒ1™GŸ„óĄčg%R¤e„ ņÄZ;«zk¹ś:Õtv…ż1ßž¦ĮĢu°s1ˆIŻŲ%µząÅ”A¶!SÆ]°|šįƵEh„ū5=Õōz0Ó§…ø=©Ņa4rv²I³ł³‘xČJŽĪ€Rp8LAæ=+7Éõ‰]PH¹Ź!S]®Y×KiŌ8S"cq¼JEżH2Zē× !bÅŖiš8YD š‘E.¼±Ż×DāŽµ'U } ąŚC9üÕōM5ė½)²‹ÄøĢ|hoƒū_ͼl†vÅ5‹y½ŹŒW… Ė̶ańœö®²bttąJ¢ZŒp{įī½+ŽŅfÕ ŗ%„qźŽŅ©ę8œ>¼üå/a$"~^„tk¶ )Į93†„õÜµ>­źCŗ`–Nž—ovDÜøļ+=}ö%ĻjĖYˆj%0Ę5e…Xc¾ź«¾J”ś‰õłŽö£ī?õ«_’Kžå?ž'/Üܼ}ųŹ’ŲĻųŌO»wżäüÄ””‰Ō<™i¶33Xžc '»Ģėŧł€,a©#ÅĒÕZ.;IŽü~×)• üīČtDĄļJœ’K%O)žšpŽšüĢĒIĻJMI".Š+/¶Q]b’JGŅŁQ›KĒæ’QC³&"†ŠO¹ÉĖ“’Ægƒ ū¼šČć«¶ČŪ±ž«ónoo×u=cT~ļ#īŲ¢ĶB;Ö̽$üÖ²,ü‹f]ÉӤ՛Ø-yÕ­9Ź4i‰ĀŖ†€Öʓe-XKf]ĶŗJ¶„µJ70—Ņ3‰’¶k¤zł”`Ś’BQ d¾c`ėŽŠon’‘bV`ū—Mąqć9ø„/ńČJ©0ͱ Q²®ĘZ}Bj(“‹‚o`%Wż'T9Ŗa%ćā§XŖž$”1āŠ(™Uf³b ¼yÖå‹ćO°²Ī.Ē|N ŗåaq¬…uµ”…NާšY—Ų~6*Äņī²,NU¬ĒȞŹ^ĆĻŚZ¢pŠ©’GÅæJ/žŽYķķķ-Y°ĘmcŒ5~„ Å| B „.Kžh€@‘ŅČ­rŹŁŻpū S\üžˆģf ĆW?×$ßtO^0eP²“ „F)hYŁ„Ńæč½ś°p_ –E›iĄć’^ ø¹¹ńŪĢĘ]Ż®Pdy„#¼LieŖAHGXäŒXhŲõä}¬eŠkh}łōĮfoø.F†™q“³ōJćyīC¾’HKRN^čŃ ųw“§YœY–ŸĪųhy Ŗ7ø“PU9†ķ"§ķĖ —™ ™KdÅūW¶LŃ=RZæéMoś¬Ļś¬[€wÆĖO?÷xåĖüē’hmA[Ōp—ZYk“]•CkpUÓQ)@M W«P‚EKŸ`¬s“Z#»½]aŁųQl„#ŅŽY^×¹žŽn£^EĘ(\»’ žwVåŻØ|ßQŹŻqhF1°J[5}ͬOVł €HĘŹ®oVæ!i3øšAŪa4œ53SVŹK:\/ŲՋ¾Šžfµł‘8Ų’-[gŲI„Ōįp$[ģŻžĒ­ŅOhŗŖ­üOŹ-Hõ”Źó²L}g‰µF­µÖŚ…e!xϚq¢.€ökČZ‹ “vZ5²šŸ4ÖPP.„į5‡¹dĆJb«˜•~÷µŻŽU I—<¤™ÖNy©ņW:Ƽš,——j|ś8ś¶(‚!āōŲ6®³ŲŒäĒ1·äT'ui 8U²•„ŚZ‡tšYV.±C^isß]7Ś}ņŁqp/­RČ­ń؊?<Čßg’Ąü’ʦ„·†¶Sø4gFI½G=7-6 r”ŠĻ/ŁŖ täB±†’?–hµ“Zu}}Mä¦|ÉĀį8£·KņmŚöŻy–H>ń°v]Wš-k³ŚlהՖøI°®µ|IDQ&ä”+Ćē½t÷1…ąj#—# ćŠåYĮ>XęšÅ®X©xH™K‚§īyå•RJk³‚5€$2÷ÖM·z9½ę”І«‚Ö*$Žn»ō{#·ŸuŚĘÕ+%.uÓkÆéČ|·IŹĘÕH‹+lcö/=*SÖ;lŒpžW!„żŪ&³^/NĆ9f§Ūµw»Ī|kš¦„ķ~ōąęx<–śéZ£ĻN,÷e$ߢ—eyųÜ ļł‰·ż®ßõ»~ņ=ļ«…7~ę›~ąˆ_¦!•”؉vTČŌą DQóõqfsØ >)7ōTŚķ¦Ś½[K·¦8øq5Ļ(™{„BÕ9ŠĢ.§-MĒyˆōß_³µVMõauÉ푳AW<‘żn¹¹¹¹ŗŗŚD81¶t·X”ĒŪņÅ„‰Ū”3pŹĘŠåźcŃJHģ%U›[y÷©õ Ą–ŒÕ¶¬W¶÷:ćMÄ;å…ŃlŠ7±T s‚›÷­sK,Ļ“<ńÓi9ēÕųÕĘLl甓ˆZwÅ¢²#z6óÓcś:gkœ\T Åéž”Ę¹ĘväėNųP77ó»ø|)ń.iņĒŗ)ד;łĖ²ŽsÜ>H­'ŹfĄÓQŻŽŽ®fųĪļüĪÆü²ÆøĻDY‡ūļxž9:btœį ĄqēżZpŅ‚‚;:š$jmōóKS)ń¾w«J’RŠ£{=¦Ä˜[FØé—V> “bČZ;MZź„ńjĖhųDꋎ×ĢŒĘ=O#ŗ£”ü¬eYŖŌ‚%ˆ= Čµm ²ĖVJ\y² #UĆž”øĮ³++7Ķóģ,{IÅ&7|ˆĘ‰śptä%`G ”ø“…ē1\™[Iī¶ĢŁéėWʳž%ɜ)Å˶Z Ē$̽NVż7yżaŃ S {{Üy°†@q9…¶ĘēĪ/š‡sÄ­'­u č6SāĢęTG6Ēėé½¶‘€¤ŗŃ!„OlŖ9äoBµĢÉåŽ>ó——Ōźr+<زo 6J“•Jv=%.§Uū)q•HLz“›››««kY~Ŗ¦Ä>+2Ę ÆkSź¾’:kʉ¦øżÆµŖpƒ…D·f ’¤bDŸqį* Żū ÜPERdV+d},Ż”W½Ź6xJĮĶé_V,Hˆ½üyZnVn9­<Šśš Õ*d¦R#Ļ<6\mA%GÆ ņ§X H1%^Nė˜ 'dģ}¶ą;z4Ył’ē8¾ ­WŖ‘z'",kE}<ē*¬œd ‚iֈ€ nnn@ĄźŹuääLk-¦8”µØW÷NįĶņe_ņeæåó?’`EõŽÓ ßōmÖH l€ĆXj«@2ÖÆiÕ8šŒ@ā( K~č’‰ŁĀ˜A o=ņ”(uҼ„˜ĄXĀžŲŗĀ‘|ø5ÅĮNŗ¬qJHd’¦J‰¹pźJ¢õ*¦š_Čƕ„ž”Ÿ`tżż_2ė† vx}źᓜčx}„ēÉ=ʇY bŅ%’¼$²vR|Įą ʉ¾³o¹štuv{ĖŠUى|Å‘7源łł‹|\ߍü;ļ 1Ēøfµ #¬Ä›†/ņ¹s#ÖĘČĖ6ʁE­B-CHhāąMįD­Ē.NÓĎĆCŒiŲ‚„ĖÆĪJ“\gu«Plū7ń[N*3Łßźx•B¤”ņśH¹-ČŚÓé“®+ē¢RŁū.Ęö*ĆiŁūgŠ’ƒfær$IPUūd’ģčDzÓwūuėŠŪš×įp ²l “n`CÉ™ ØRä„%j#‰ö‚T@Ü¢F1óIE©NĢE»]†•DĖZ’{¹ŠˆJY Ż‚~CD­'„$»f(V)›é#r_ZŽwø‹“MӇ&/ü&÷ł0Ij“HgŒqū ŸÓ4iD ?ŪÆæH‰ @4#×ÓMŌśµ-g ģu{9­½?Ldąģ9*PŹÕXBnnn$9B¹·7Gó²ŌĶą”üIhnŹĀozš;ĪźaĒŖ“Ō Qšƒė—ŲÕ½³„ŹĮõ¬Ķ.ō[5Æ.é¾eÜņ¶#×|gs}#żäĮ¤ßBL$š%<ęęŃķÕÕ1ÖA;Uü@1„ąēÓ ĒĆĆ=óźW}،ÓZOd¤ Ś2=k]’aŅoĮ„~ń»Ä—Õ϶4Ey›ŹÆ %t^§Ł9ū:“ 5äv|mž¬ zhÕī÷ˆUĻÜm›cęYseURĀw00ŒxTv½šé¢ŽŪ)śīŖŅ…U øøpūŁÄKKĒbS™f°u ;ā|cPŪ©ÓÅ­ü“ušEn–žNĖ4MJaSֈŠ£j{óč” ™kt69WŌȑiS"N§Óa>š`§YmH bƒ‹“C‚ó a›&$^f/žēœÓaĪs²±Ž»}Üf2/y"3!C†œše·`)ƒ9m}ڤ.=ķóHĀ]0ĘÜ ©ĶV¬Äåö€ 4ęCŪ]bha Śļ–]|ĘĄŌǬBŃ%–3%ĘāÖjMĻ“Y—8¼ž…|ÜRé›ĒŠ÷ĆĮ®^ItŖ­%CVk°Ź•O“‘h«f÷žF†­ŽFy6"bĮ‹Š/U!!±ür€”ŌÜ0”Ń4ė€1ŽŖŻ ’d>žI”™sģ0ąāšDN7žæ'‰ņć ŠxuuÕéśvČ·«æŅĻ@²@„„Ģœć•ēńNā䑏ėē’ՄłŒČ¤äÜŚĢtnŖŖä芶h€«Oj/Żok÷>Įjō»kÖzwķ]—ēµÖÓ41,móś2ƒåčš=5Āżū÷ų ć™Ü-IFAB®i’š4˜eå× ZŅJk„‘Zģ»Žłö›Ū×Ū§^óŖ`DŠĘš+#|o‚ÜņcܔŪKdl fł’Į§;yш]č+5ߙŸB#L¾AŒŽįµĀŻ Žw;öŋÄ@°uņĖEhõF”{yĆ_]•rœ+>²cŠĒq”,®b0- –Zö„z1ٹī{£²:ą„νr@+TßŠ»ÆB‘‘Q˜7¤ē¬ƒ›š qG…‹ÆŌ2²PžkHČhS?Ź•{FbCŖæX Šh¼8^1ÜeB/1æg‡Y¹ēük Dų j‚—\aµ”···Ü6ćø#1¾Ŗ]Kגõmµ!ĖŖ½ū£„©ŲJwK<熦•Ģb9¢ åĖr?½=-„ż”V䊡š’üŸ?·OzĆ'>”§Ļśˆū ŸōĘ7żŹ_łH-7ó)ŸšŹLš³_$@  V°+ŲŖÉī'ö”nWŽ•Źgl-•˜ĻĖóįjy)Ikf6‹•7éa¶?ŌĻVį€ü żŌ“óś;ŸūyŸ—–Uō,ķ:“-bń(“#|I¤ĀG°–“ĘÖeWõi/}4ŽnVjƒ§799+-Ėr<#ńFÉóāūRT‰B–”‡bR+žMY@u¢ØPE..žRz¬g¼E¦r‰NZ‡&ŖŹĖUQ ²U•tE‚XĒ[Q¼'rw7E_X]¹ŗīĄb܁āŲCs)"=SxnœĮņA5÷K2W’QRĄ†O„Y-÷±U`%Q¬N^±9Mƒc„ź‰ÜT —r…;RēŠfqė„Üą cTü/w]˜²‹ėqŠEhUœī ź·,: ĖM›ƒJy¢r’Άā9`ætŪÓ¦ėS2#Ę(¼'ƓÓ#¹Ō=QڬŠ·µj”Yg£ĻĘĮæ»®ėétŗwļ^heōæĘė9±lQ U…dzBĘŽiØÖiŖ®Ŗ'5Z²…Ā-Y Ģm‚ßĆQ1vū¼÷ĀśŒ‚Īą­. X–už'ļ2 ź7§ ŻŪōõäµµū¦‰(ßæ‘ćJžTķx@¾č©F¼I™öVž…;w ”]­ž”+…Ųo™lĆRzxS_o 1dŌĄń€Y€½&"ŌŖ~”2r>¼¾¾—>±BB, E©”ø‹€$tG}Ęhy$d›£0‹²_YW{:Ż\__Ėų­#ź›ķJcģŗ®ĒćĘŽTĢƽg;_2­”źH§ģīvOBŸ¶$5Øģp¶Ö‚PaU³* Ŗ-q “f²ńÜ\EōM@2łž½°ĘäéÄ> ½-õē¦žČ&ĻbS§|gVŖą%Ōbš&·%·ŖģÆ*„øÕ_ö?«żĄśxy—øåNz®ģ«*e! ĘX²™qīŃÉ>’‰]_“ŗÅ'vŠżG<˜‘ö‹’½”FĖ* 3·č•éDŽ˵‰PJt)?D¶=Ćßŗ)†ó`÷TvQÜ“m2‘ūÓxs69ׅVS»5"Ž'ĢC&ØėŒ"¢!ådÄ 8Wę°Öž«Y5›i}®ķx<)²ś©ń“Ą!Ėe›€A[ ’į³ŅNhČŌ@y”iRœ‡•æ½½m‘’ȁaž£5γnQŲdĆJÕ>x¶Ō,ĮÅØČhŸ* ¦i’ū*ąBB0ņć'j’³ÜŸ×Žģą&Ā'‰ˆ1Y’4{} h¼}*ÄĢeŻCoźdrŹ,3ö}šyŸcuWǵOś8+ĆÖmŽ' żgzIK9[4Ül Ŗžä9ƒ——*kzT Ų²QĢך5H›T²Œ¤P‰ØĶf¹ŗæ ”O-ż+V $­¢W¦mķžjcÅŌ zz•ö1˜Ŗ7„ÜÓc‘Ģiš‚ZżxŖV­łd?ÆZ_Ą“c‡\„†D"o‹[—wu+fQ“ĪźYo9xh׃:Į}’‰ Į 8WÜ„#kŌļ”fćy±Y‹Ł”Ÿh-XkĮ’Öu³kŗ}^„,yéĀ3ʊ›r>™Vµ/ŗ `“}ńÉ ÅŌø×»=šÉžÜ1jueĖŻ(ćs(U1仯Ŗ–‡ļwRSų¬ų9ā€ÄŽŽrē1C6=±Óć1‡œn*^ åv`<’TčBµōJŁg8¼“;-…Ü%•Ö+Ļqܶep@a¾SĪŪ¼¾w”BBóµ)u¶ƒ?ÆZŹ×lQģbҾkŲ;ąwĘLåŻ{Ų£jüiöܙÖXiLŪ€ysŲA`ZUŲPF7ĘEƂ¹.¹g 4LĢļŗZØŽt‰AŒ¾kTq—šĒ©.®0)ĆU€̈höŗ *ŗ÷™•œP lŽ… DŚzuļćcž n”Āų]7¾ÓųŹę®yXk'-²5U÷æ %ÓüIąGÄ]@CŁ.\Ūh7lėUįŹĆå”ģōŁ•öŖ U}D—2†¼Ftƒ‡‡8”„ Čį²ź^y²|“¾źīĻĘRŖPį]9©–æčK¢ī †©Ų…é{vņż8™?'Żž{5 ī°‰d”žķesæčYS €±F+m=w k cŁ!émܲž™€XĒm7Ź2Ņ2É”ž:Ø)Śyv|ą. Ķ„ökšUļne`”“nč× MŌ“=Šg†ˆig·•ŻAnę-Ł;°‡–11ē(YėŪß]ŗĒ ­åĖ“Z«]gI"Y<$ē^Oqj”cŌtg‰Z~({ā„ŚmµøpR“ żS nÓŲ—[K Ņ@ÅųђEŖgž]Óģ7;Ų¢”«“:ń`Ė}Ó÷K³ :‡žž,šoNœŠ”®ŚśS®€•&śßͦ”«]ÄŹĻ™-‹4 Ē XtHā†šÅŽ¬ĖUHŖ"ö’#‚*!ūÄpTiÖė®ā›PBVL5UQr•ÉOés7/&™›yIÖ³:śŌ ²Ÿs2̘°'µ÷_yD½ŻLV€'Öõt:1÷*–@cÜ®r[fūpƒÅcå‘;Ü¢L{éY8•a2«rÜälaܔ®_JęœĢčVO„Bß<'ˆ]¬$įÄīGLņ¹*„“¶økŁĘwų;_Ö9NWWĒŪ‘ š¬dļG…¶f ŗĮƒüFÖĖü wz’®6‡d‘n0¦÷·MX¤%ņ·”BUņ•œbTœNøä`¼é“ u†sßUč‚“‹J†,Ń*ŕAkLģī ˜īŗ&¹Dņ®L7+“Łog¦:óww'ļö;³žŪā$oŽ]ݗ鮂!CšŻ1"O„bƒ (;üU/1żµ«źÜju$¬¬ÉMJ7ć@¬DKP›ŚĆa>[ņ>4 §I•”æĢĀ–†ćNā”Ų¦µ@H–į×ĘŠ™Hkü<0 ģhxēZÖźąĪ–¬&Ŗ3TżÉÄć„6CuńßMÖ¢¬&ź,7 m±S éÄD{̶$Śåķ(Zk‘ŽŠŌÆ ”•HˆŹk5‚2+ī$rfÖu=­ÄÆc¬Ü£žŽ1†“*)‡Vj‡D’aõ¾o“#JV’]F8‡ćær?“>Ńyl •—‡m‰‘aØL% ·ĪÅ©Žä|®øhgeU”ķ4½?4ˆXD2ƒėlrŲ„-œ™­5£ŻÓmkPqAē·ü.qÜ·Ö.Ė2ė)*\łRÓ¤'GÖąĖ"H¦>¢‰ ż³šmņĮ]YYh‹H4Œ‡+÷•ˆ½¬øŹ³”NŲņ©ŃÓtĶ Rēą“µ‹cyGG·oD¢*}ąxüō,䎒»µaZA%ćÜØbŌóŲ.ĀęV8ABś°Ü]4VM:Ā%ū{Iņó ZśÓ Iξ±OĆ&—ÅŚ¢M…Eœ’v:Ŗ¾¬v–(ž…Č“ļÅbņ „²źĶ]AŁ4eÉ _—S{¾ā \Ŗå ŻŽR®żć1¹aŒ1:q›’]ü…G YhŹÜY‰ŠŪ"2ėŗ,ĖyC+-č许"ÜŚ&}W߀übJUĶäyŲęĶ~Æģ1\ņ¼§ē¬@¤č 6IL„öāąlóÉy:ø^hkŖ÷r2Óž­“ü‘-D"Õ“r¹’nų{F‚ļ9“l%‚˜_*Ź’ ­śß*ŪŁ)xøоėDqG]ĀijĻ(Ÿp­…Ü!xtņ¶^ąC• …mä™ķšÜŽc¹¹ąŁÜoŚÜ DŹf_Ł/ņ‰( V„ĻŠć:ū“©;ŗ­UV%ŒžsU©žnÉ-Ą)¾{`ź&ģlHny!r!ĪžN7D®C˜Ć“Nzķ ;е †:źi\µUič3\—”c­v,ŻgŁtʞšei’ģŗBÆ·¼/ņēK~¬ņXYB'üNDŁæ¦`5°Z[ėŒ ŻņĶI3©&rµ.ę͈čįƇ™ •&ė¹Uäń¶n³£±|IÄF ˜«Ļ=ģFžĻsŚąÕMó<­›"¦23ŽĪ äĄļ[ڊmĮ¤¦é †jZŗ[c#>ó\–åöödV[q:@°.&ƎE9pŗČæ›@ń%+AZV Ą¢Äż„*><^«=a™ĘCKį,żØ•l…‚ĘøwDĮÅIćĘĪĻĪQ¹1’RFP‹é°ž@8PŠōʞ§TĻ?ˆA†…v]śˆ‰°JČ iĒQī[wAŲT}b«RP6‡ Ō§rüįż‘ʾr;Ÿ Ć!%ĢCÖDDĊ('„3RŒ½%¼* Ē&-QOUŽ±bzšō4G§Łū2ęü)ļ«Ę¼ ?¤÷™»ĮéÜuŖ»»»£‰pįGd“FĒ”d c8s’²[Ųxųš”e-ĖŚœ}'Ŗ®nāW A½±Ć/3lBO…J²NęDø™ šr^颚 †(ŚóäR™R½RTIµåŲ:£ŗm7PbpŌµ¼Ūį;FoŖ”jEH!D›ļł„t*¦(PPQŽ!k”•éÄ™‚ō¦¹ O§)¶l÷®Œ:ß½”\PŻóe  1ʬXtø»Ķ*iŚ)śą]ŌźDM”5!ŁŲ|x·É\ų~^‡Ć! ˜hµĘ’%nbZ_DA 愑ų{žk,¢Y@Šß÷»ĒLH#C®ŠżX–%ÜĪfC ä);‡ī碛äŃõXme“ÅA^Ē(Ø+`!Q±>T©NjĮōžjÕ>] $‘eĶóŪ”ö”qYŽ5$i«ūĢŅgP”’›”9_ŖéV›‡ńaY"c”MŽ&mH+Vī˜”żuīˆ+×<ī”Ul—GķʘÓÉ ZSŸé$„Jķ.ęöŹgAy(nĪ2a­Ż~†2šĪkžēĆįĄ€ÉRÕĘZ:N±Łˆe PyÜćń¢{Ls` s~ʊŠXÕ!Ź”˜źUōoņ śś !ž…4Y`6W–%»6•Œwę{ƒM7{1ė$Ü@Rjai`ۘm9kŒĖ}‹ė’[M ”Œ“ÖŁŹcXŒ³µ8UĻڤՖRG¢/CčøT%*„–x͆h1ʙY„nÓĘ­k‰ŒEQ‚wĢiŅZ—+pʗ¤^kqa6ω/ĶŲ‚Ļ1¦ŖDļ²¶Ö%Ykłd®Ē’j®'<Öīļ.>ˆāīĖLnֈaLź©ó2Ł“æ3&~SĒ•ҦdL UKWāÄ$–8ĆĆē›üōšā•džÉ*TŒ¢ŠlĮ¾ū-IV‚Aač&ĆN¬ĄUó4HiZ’ĮģĖŲVSO©µ DVr(oK:(ßd„€©ČAąe©Š0ÕJ1ń™Å…q[*yŸČWäés¢x Ž>/ó6da]׳8õSč֙¬2$± “ÅĮž@.IŚĢ-¦@“†hÄÆ«j­Ez”|b€M6xćą\Łś>ö{sĢC±u]ēł D@_‘¢i+6”ZR§HŽ*&īĆÖļŁB“ķĄ„U›6"=ĀÜęhĆJ…ģŖyŽĢOMŗ~eą²Q„)ž¾²ķ*‚8Nn j"y¼J×@we^”X†$Uī)»tLz˜ø‘­ćņ¤—l1Ū³'-zAå2ŚĖ„Źö½źĘč+¤ 攈¦$»ŌėKa›ęBG$i­eŒč eŽtµü\œRŖŠ8P‘ó}Yc‚Ō<Ȓ¢l5g$Ž/ÉOMY rz­MÆ“I—0R,ƒHQ4+“͉HĻ*‘¹*Qńf1|IZkkW„”“RCėj¬µ‡Ć\ēŁjˆŸmnŌĶ#Ł—lY*Ió™Œc!Ė”č„«5–ÉMÕYuż;VŚē®Å«:wė £59Æ\"°3Ó=m€ "(@ĆaŗV«å^wP„)¼ ;„Żš¬¾X­dt*­{LjŸt7)14H’8¤6Ę¢N(ÆK ØM½²2ß&)P»ašH(»g€ć”Ҧ»!!ų’P÷®”Ś-ŁYčUs¾k­o÷Īī[ŅńhÓ-š“&QP8* 'ŠŠAŠ—H~*‚Įkē§’^¼ć’‰ ē‡pĄ\"*ž£ˆ?ÄNPӍFC›ŽéģŪ·æµŽ9«†?FUĶQU£j֜ļśvr‹½×·Öū¾³fĶŖQćņŒē©Ū ō¦Z½?¤W4’ż\…²K=b’£1Ļfļųa[=T’$»n¦āU³ĀQ;2²¶z Ś“$Ōēß9£ļRņց»Y ļå»Z›n£A&ŒÉÕtHź#,Ėb­µ“Io!/šö18mֆBy1<+žņõz½Ģ°Óōī;ļ½łę›™ŚgĶņ.K7ØŚ7Ÿ")Ä’õ¹TŠDŠ&NŹĮ¦śČlEīUė«ŚwwƏgd$ ’AĖG]‡ó¹W‰2H’2 4JÕ6ū„Ł9ļvš&o<˜*œ!ŌDŅD§ÓkQ÷„„œń Į?—j1K½Œ@’ömH†1Ɗ–ŅVSÅu¾÷dź*+‚J²¬¾øE-!—ĒĆÜDŲX7·D‘kĆäŃ6‘Š;ŽĻa3}ZÕźƒ©ScLäłŅü¹]8‚†eG¼>DŻk’Øł;@"šn„K2uzČD¹ Üźd)8?¢܏°J1žŖ|QNÅ Ą`*Aż²ÖÜb.NlĻ£/kSÉģ³dķ¾Eø£JÆr?„ųčł½&;ߏ.}NŅSģĒÕf°HÕ©°õc•<ćŽ}O$ Łb‚čށ—RŌÄK”†é_ć>žYŪC’n\bź¤T· “ņPM€rź › HnÕcU:uŖ0"Irˆ ł(Óųžr ڿҕG$¾ńx~/“s7v«Ą«3£ńp~ŃÄ §Š0õ½°ļĀ.£>=§«¹˜¹“Ś+ŅČĆtĮē —įfŠšņvž—*:՚ŚĀa’ąēĮ6ćĀōSt‰0•¼(o0Ž“Ä3SW“2`dü§1ʐ÷¢l„ęˆŽ“ –æ@8‰“¾¤kā\Ō$jŒ1‰F•Ł•G nØ`R_9Δԭ¢œFKø¶»©@Ł8]Xš>Jé3¬$ęrIö=Ļoü^Ä%ņį1Ć®}> ‘#2E͹ī-<¦3 (Ę“ŽSÄmõĶI·,t)ßN҄ᐐĪü¼‹Œ(Xf n…X¾ <dF¦Ł’·ā"%”u“QD“mX›` ĮX“Ą :‡QJŁ<</$Č× “% KÆīś3oæüŹO’Óšś?}®ėæüW’¬ 0{˜<¢Oރ›.®ąh-*KEę&Q.ķVk`ÆŖ0^„ļ<Ó0NVs"ÅMș:2*ńMQŚ„x-ŒĀ śŗxČ)y.K$„J]"Ϧ—¬3+Ÿ-`’Tøµ„§ˆābĖN®«¼>Dōōōc&ÆF5wģ@É:;`eR™żE._ŠT¦£‘p¾±jQ¾ųw’)Y–a ¼£C$Š”ļĄŹhHÕŻ¼ä’^“BTć’KFĻBXmŲZCD``½.ą‹”«¼Ōå‹("R“¶ lŖå#š¦Mø{„ļDķP*ĆĒ “Ų=O®ą|–«eĆJÜü%Ą#‡zLzæź9:ĒWćJvE;j"ŒĪZ% MqŅĀU6iŚĶZ¶nPw ą÷rÆ„’ ć 5X…T,kóH¢`ĀP­%–$®v_Ó†Mź­“$b+‹„R~RpŌøž«ķ1¹ü» ¹æNu:96Ż­Ódƒ#$t1>VˆY$ņƒ÷_īš‘”Ś”4‘Ō [餛XŚÕų ·n%ōāqµÖp±8å™Xd”d]§Š€ØĻ—ĪÉ«ŅŽu•†¢„=ń¼NĪxŪ“Ū Õns«jśŃį„q”§_‡²ŠE_ź`{°„6*Cµī°ÓYē[ Ÿ'-Ž"!c2iąŠsLšõ/~čGžę_üĖ’ś’ż×Æ,]ŻśĶÓ“®š;¾ż;žģ_žßü»~'Yīr ԦƘ'øTÓפÄ:”¹§ń€”\ģšōųŻ.’l<°½R²žj5„P㣽Öā‘:dĶ)ף-»ŸßčØĶ{jÉ¢“䮋Å.Ųž©öU:\ģ¹JFg„|vŗP ŗr›+9įóGd¬-?Š1“Ūf,8÷ķ$vńęyyŹöZAUŅr»ĒaT7.@éu<W½½=˜Öąļwž¼ßfW“õ"µ“r$ąĆ”œ)±mQ&ģ–v«·ÖĮt?ĆJą™ŽP\ Ž5īä†v-Xb±ĪH@żÉķ°ö}ūFA:ŸVŌoų­G²-Ł=†čľī/ˬ‡–t»½ŌĮN·_Gn³gå|(üÕK ø@ģˆX4JT ŽŽ{Ž»>’$Ųc:”;9ż×쩤(> ī{&ŗ(`aA†åÜAš5 uSwēÉv*ŗū@h Ūt³¼Š€(t.• Ż–ļK¬€Ąo„sĘā‹/:k/ČÆTŃ¢Bg0mą ‚-¤,‡1uKæˆŚćÅRˆ³°lmØ~nŽŗ<œM.ŚŽĖ3-©`{÷%¼÷“™jÆ{Üī=AW->rB`D\¦Mʼnn£žå~CħļĮŽ÷˜T]%h FOü# ;:°'YǼjR!ń+?օ±©}H:Ī’«öĻ’Ę_’«?ņĆ?€ąÓp™q~ņ__>DkWē>ffļżæųÅ?÷—žL†iEœwY ‚ Ēöäöļ׋Ҧ.iµZ%ėŅcœwŽ{‰%Ŗ­ĻM­|2U®”5-ó*5·ų¢r“ß"F]=’[ĢV‹~š¼­!=”›č=“sbSļŁ­gXJnØģ‘xŚIei“Énįlŗu ÄE#!±X(•cšĻ {.5ķ9’­šF% ŗ,‘¾Nc˜oI ūŃŌ¢G½`Äk»˜Ėté^S$ę/)jŲf—¤Ö£ŠĄĘ„‹š9įnŌyŹ2×26Ž7ęT]U.æš3icHćcŚ1T€ävFšĆ¢Óøä8Vép[d"[]W”–ÜČŌIīÖ”yÖÖĘīm‘KĖgGØ eÅŪ&_”ģ°ĖuŅŁ¤£O™Śū1JOQ?)ē³čUжöĶģĀ\µŗŸlÕéȍŌé>ó?ć„4†åiåżBDv2Žm¢z}—FžFĘ{0˲NӔ~K} AgŒņŃ9kaiANŲŪ”b†æ¢ ¢²¾oÜqĢd:’pĒāk”Įœ?ī·Ą^ @æbž—Ł„Ī*ķ†Ä±­ixš*pę#fįŅkH ćł,™‹‘:yč:@/ŌĻ:iéśÆŅŽÉm6ō7cz‹nõ·®Yī ėń|×w’š?ūįóżżt÷ĪśDŽ£'Ą'Xīœū4Læź3ŸżÜē>÷S’žĒžēæūöūę_ż-dŠ ¾ÉąßofPSe}Ŗ˜ū=ŕ 9ĶZ·ˆ>O@ZnŻÜ-;ēi d=s3ĢŁ˜ćDzĪ$”P¦#ē™Äw½© ]¾±ć, ’ūł¼Żōé}޶,2õG(愊±¹ļ,’j±w™”Ģ ¢HäŪv­ŌžĘ”ā~6TM„Ć^oČéDŒ¶B”„’ü$NYœKch4įÓÅ” ÷°,ĖŻŻÜšc}ā)Ė»=>>><<‹’šĻ_ēܲ,ŅÕCDä§ź<CÜŹjzģ(9Ąp0ß\•»eA[ŽTDI„`˜殊V¤ā¾dz³•ń­mo€wZRŪ‰g¶āhɚTŁD§v ¹Gؤj¦ĆC¬‡LŚAK0”Ę_ą,ż˜^±Ē“”ģøź1<“÷ž)ńS:Ÿ“é=e5cÜŹGė~35}ł¤[é½·Ę ĄĖŌ ßT’Ż-ńŽ£ß;cŖ}Øz>ņŠĖ²LÓ$yŒ% ׆io )Å/ŃUŪYCŠZ”ä:Zō+Ę`g‘Jŗ@wŽKÅ1°Ļ”ža3Vķė{ٳ•|4”PZ$Ų(dł$#²¦żÓŖxjćŗcODeėŗ2Œ«O†zc‰OŚĘšŹl3ķ.ŌĮzćxūÕxU|÷Ņż  ­ėõ:M?®‹ž/Tč;¶Œ<šńČvä8PߎĪQBĒ=>>Yk§i*„·”&9żÅ_„ʏZŗlqiröŻ“·œüÄąœ9ē¬7ė‡ŽücBėÅÅĮo’­æķĻ’Ą|į _xc¾£§åW~Ė/æ¾÷Įoś¶oēw>žMßōS?ūµ’žæ¾öĻ’æū­æį×xJ”ŪłŪMZkÆ\×Uā–{ė@dµ‡Śœ<ʖ›ĶįŽÄE ūz”%£ö²Ŗź—sĒ-÷÷—- >C–Ą5ęśōt¹\ų‰o@ ­ ¼©F‡øSóģ­xŁj‰zāł¹²n:(¹Å#…‘:ńYėĒŽ§B„Ä(Œé“=»µ­ĆĖ4*ykżõ¶,ŽJ‹—„ Yא¤‹–j/-½„Ę/-;ōeńŹ zŌ™ ×µAzTj&m²Ć‘žc(˜ķÆŻ[]1&ˆ•“ræ°0õĘØ—’S‰-óßPKYQčā&ėT§b7ļA,Õ­œiķØ‘wV©„Yņ[žžžR؟ß{$Śž½ōN_ōE5ž*Ģņu$é‡cƒ_z“¦[¦ÓKq6µģŖøŹ 7$ʘ;@Q©µ‰¤ķCx6‹źŖå:\Ēi‡ā\#ļŸžžī²µĻjŲaØ£’>Ł ރ’‡ł`‚ė­Ō\pͼQß1į“ŅęŠā¤²ź˜Ķ|ƒ†7÷ÉZ„ŖÓ!•æ6Š…§ˆ¹šķmyøčōÚsÉ­Ś.U|Y~ŗ­}oGƒķ(%qijś'l1|§Kn¤xŪ75^fC—N3tiŠ ¢BņOƒƒ"—ŖU?jBćDĮ1I§ŪRFģ°ōӊF¹ž©ŃŅĶń4vѬē¶z”žā‚źĻĘ$G/—IJܝi·$Š«¦­µ, ‹¶%õ¶V1¶ˆ@dÉ®H0]½±˜ņōź~ēołæg༿Ÿ._łĪår‰õ’•ū±wß{÷Ķ æöŽĻ~įWįĒæü_>xüpq~÷ļž_~ū«–U© &"œqE„C{ūčĒx"ńpeÆZĘŽ½t5jŽ-źf®ėŗŽŻĶLc“)ˆś­Ŗ™•)LĄ °aŻH÷?[‘¦6Į¤·H5ø”dÖ¹Ī9ĮĶd -…Ņ£yVY~,u/Ę>ŖNĻwÜśē£IÜłŲBĘc·#šhŖ­5)6vn¹»»K÷›ä:FķžeśüŪ)÷_8§żˆķBĪn‚Oqs+&gL¬·¹ėŗi‰ĖŲēY¾™Š“«ß”ĢHy č³D[±Ø±ż±ćÖµ¬ķtœ&Ž[²|#E×3j_~ S£m]E·BĖ$&-^{#ęēœ0™z“6Ķ­ŽZā\Xo”™Źā5¹*唗7ówg%؁±Jė°/µ¹\MfsH„“Tąócžš&cœ ōˆūÄއį==4ĒććęÉY ŗ²)q灈0GĢf™āĪіŸ§Ūg¼'Ä(ĮĶQ”r¾­ŅY¢µOąŽ"/²m%HømŪ·p" ¹lŁÖ*¬ėz™ęÖ¹ÓŹv½zõźÅ‹Ęv„ -j Ļā]¢™¾P­ś–„¾”–P-Ė­1²Öues”޲±½Š~1vēĘĘ:ÕÜ`R9ü'üØAGZE}rėYhĮtąŸŻ×E¾Ō{æ 0Üe–¢ņ>ķ@JFĀGŸūWyŽÆ-)ĪBJ’`7scĮY"}»W­ŖIµ}”{õ×Õ:‚Ł’Ck~ļwż®/żųYōžļžķæóĮ‡O—łȂ[a]€ąO|’Ÿyxŗ˜ßš]æćļżą’óÖē~Łūś{/¾õ;¾ĶÆĪ9Ä(B‹)@BŽéUæ:įǹŁ._ą7c5![‡bw’Š”s]j’O†[»»»c£<ŸL™‚ĢēŌuĒTa·ĢVóī’umJŸņNU²Ō1-.’¶“†ŠBįCϵySb[½#¶§-źČ[,ĘČĄv/ĮĢÉ}¬ydW&"www—HPėŽ8÷~’ų©)=÷Ž…Ā+ńjV!ēhYVĻWŲ!ź–\¦uYŠn„¼Äå}±_И²„-‘Įn¾%Mī¶„(k†OnMÆå“^³u„ĖyØ“ģ½÷YKm#ĖĄœ¦©ˆ7 -ӑS5EŃ ĮĆ{|||– •¢idš$ `Ÿßkte@ Ź·-65¬†‹-p«BUńÉ5f5Œ7f"¼sŪ& K¢œ„ĄōŽA#Wīj¤¼Ć7ĒĆp¹\ŒzbEP‡Šy*"G"Ks8ē…š»üLŖ8«„H;›Č·óe r`9՜R”>’v –Od˧a3Ø'Bļˆ<¼EŚ?Óa]1rww—ĪS€¬µ‰d‹ĆQȉāūLõ-5Ś!łtm0ź_C£–tmĀ{,¹#ég×£%øÅMĀEMpčĻN“RkLž”Ģėå².“iv‹uj©F(Œ;™EʅXÅÜ9Š×ø=y­ždHWÕ9ņ–1.Ł<ų0d&LrÖóćiqšKĮ#Ų÷–"ń¢Eƒ×Ÿ’ģŻ`’Ōūćų߂>ørÖųɚ߿{~AśŲĖ÷ŠĆŪ?ó®@°ß÷}ŅŲiY=!­~éLŸģi§— ‡śWĒ—iŸ- BaßkK…Hēøp‘1ópŅ‘HO‚uēćč=L“‘CB„ķĒč/£1“†õ×ræYsąh'¤I¦Jøž©Z«– o| #dŚuü|Ś `؊D4fĪt–Š.5xņ$8tŌÕ§ČŽafFe® Öi*qŃf-}ü– £āŸ)d}ļŁõī·ÆqØ<°/ód nq)A©äŃoāė½§,ćAŁN‘yłŃDąVæ®Ī;Ś"jT”r Ą¤'|dĖą| „ÄG:āõ#= .bųN5*‰*Ģ“žéć»ļ¼†æp"m4˜Żf=ęT‹ }{Ww×dcµ…•SRńC®0 ¬…Ö“]Ė=ųNV®Ņט-d"Jµ½Öb!&ó•@D}‡h.{„8OÖ ³Ą4ŒE ÕDņŽjBŅJE-n0=Ż©éń=r!GM»ūPIjɼ•Z(+d-łŁJXŗ(éŅK”G?vÕwłĀ0†\L¬·v±š-õ#Ó®ƒ!b;ä‘ys£6—š:#i—”|+'RKōķöf.˲®«l¼æÕ_ķ©dzĀŸœ[Ä VP˜:"”S-¬6óD˜£ńp+»Ÿ6Æ`Tr cŅÄĆLLhtXéjYłæ‰ ! ? Č&™;ÖNŒŹŠ eÓ ŽH1Ŗ™©1gń yŲŽ ĒéfśyėŁgČ5܊ļƲ‘³†t²į=,Ėśųųx4ŻsŚ9ä|ŒœiŠ^½z• ,ÉÖ’JMoŌ:Å+8KvŽLjü[u8p«_·..Õ¬®OK'FT¶<ÆnYš‹7ēnÓēE$D æbžv2ÖŚ@CMį]….h¶1SŲlöe64ŌP£j;JoˆČ©VL¢&„ds|šĶ€ ņ —&ś²±‹kŻņ5¼łö\;äMÉz„22'I„~“ēQ,²†±’ÖlŪ/HqžC¾ "ö‘ÓOž¶×TĢy[ŖW%óĒüĆ(ŪøÅf{!x@ H#1i%Äcˆ •øš3óÕÆžģūļæ”ĢkólɃO;Hš›”c⾐bé¢s˜¢¦z™®‹ŸW©+RuyžN¬såüeՒX„J@F&-†QkqYÜ<ŪWƍėu-V+V%®³"zä’i Š~°ąĮ€A@ƒ –§åńśäć]·0[;‚É„dŠØJļ֓_Vƒ€žÉ?śĒŸżŌ§ī-üŸü©_ņńOąćÓ'īgZ®Öł ™ĮŒĮŖcz*ÕŹ`Eėō:ČC ņ„Ӎr ŗyLĻČ5“c`’ÄN÷M„©īMŻm$Š~sfv²*_ńūnĶłDMq“ oŸi©ūJ™Y [‚¬śN=‹¼ęŃxųÜJ6ń+-ŻN<\Ōæėd³HH#Ń–ęæææ×^jy³žU=› ¦Häļ‡.…Ÿē¤¶~EŹ‹¦R‘~›õȂ›:L„\$SYĆÓd§9’VÄŻ„&ż‹»ž7bŃuæWĘ”i–Gę9“6)ÜhģŁĒų@&ģ[ cײ!āĆƃōoøpØž0’]’ƒÜœ³įŪaL°G7JŸ®8x|¶‰h—s*DŲ̉<É~Żdiˆ%[<š”rCLL‘g”Ÿäœ#­‡  E|ø»æ›/Ö —mM PóŒ„`4&>É\B±Į­EO±U”MÉXŠbƒ‡­… Ņøźņ& `V%¼…ćŅī]“'»ķ\4DäӞ5­œ—8ė xGnõ\ćŹ|]yARķg“‚£qäÆv–&xšZžMƒ¬³jó]ßɬkŚ…’ h’wŠfż#²„›m 0ō½…¦iõlĖĻ”…ÓF’ŃõHų¹zeÓćė©J\_4ŃXōŪėŖÓ–r#yA“!F‘ł¹é@8pC,ó\ē`é ,ĖR{iĆNŽį8”¾·"±QąŠūk.ųXĪO„ÖÓÅĪ@3üĘßś[8!ų+¾ķ[W4 ¬ó3sĄ5żž?ō=’õgßžƒō¼ƒš/žć—~šßüŪ/õgĄX“ʓ'GždŚ¢2ŠxĘDŹą³gž2Šķ ©ADZ˜ĢBIn-;™yžvmT :Īż“÷ιĒWÆ ļ'—ˆ¾”¬{B¤ŠŸ¬šŒGřĆVĄĢ’¼F5Ć-쓚¦mżƒ€‹N‰ø³[ł— Œ9”C 3—­üĪķŲ¤'Ź.¶üZו1ŽÅśL7%˜³ØF HMÄ R¦µĪžży@=vĶÄ'36•7+Æß¶F¾Y>L=]\bĮ²ĆA®‘qCY»C„$uSJŪ'ĘA½ŪVńĘ ć1_~­×ėė õĒ%餼gĮ²[ć';ąF•äęīīnlæē˜ŹžĆ"]‹ˆóe€uq‰äl—'–Z=ƕż\–5œ>±M]Ą”I®Uļ=yX–Õ­>;‡cĘDVröM¶qĶŠ=ČSl¼Åņtßdv2“  ón±ŸÖ Ź¢īŚk­j{‡l‘źŠņō^Æ×>QYėCF‚ĆN²ˆŲ 6Ég‹ŌCæ†ÜwdźŒ !w2ūNĪī¼u:oŒŠo!Ä93zg‘‚œ „<¼sf²ÉBQįoŻV·T=ģ1NӜ \q]įVś-&0h<¬Č~ö“ŸüŚ«wW’÷?žGæļ{¾'Ö) ĒF‘«‡qbäżp5© ±µ¤;Ƒ!į]ž ÷żźŒ10”„„IÉ¬éØ āÓĢēŠ}ŌbbńCLŠ8¹‘‡VM±°˜^y¶qn%-k”‰õ7ˆ1įŽĀ 97‘Šœl¤Ą²,LŅ^ ŽÕśq{1eqÓī½rˆÆÉ2œN¾¶¶tÅ„ĒÓ¤żU _Œķ÷ Ģ–˜“¾Ø'¼Q ‡ ÉJ7a#¤GŒ¹ū™kŒ3p7э"ā|š±7>¦Ēē^’œ3Ö–‹µų²*»Š6+źAßė aķ?0āJ¹¦ķńЦu%óÕ8Zę™låSÓXĘŌv2ėcźx2õpĘoŌŻh`]Ü4[Ø;b‚J¼¾ė[ó&Ÿ#Eŗ¾ę܉™}|õźīī.óÓ¢PńŽėŗ:ē.—K1u5 ĀŃs¶µÜZŹÜɈ„Mż˜ś“2ߚh• Ŗ%q_ĆģÓ,µ˜#k§Eœ§š”^؇–b äĪü™tՐäö.žÓ.ė3^.łi]™yžra×ķ3’ģM =§š=’,‰H’Š#y‰1„Ē ¢ ŗwhĄ‚ąsŸ’üźĄų__ż82ąQ’>—׎Æ`W’ŠŃс.½~y!®·„äU¤–ŁĪŠ#­¹c˜[Ym5ńhÉ~,“āĮ ŒT@nSŽń+%· ]V-HŌ>%7ŠJOZM;ŁĒÄfq½^“IķŠütš<»SĮ„¤–F…ŗĘ¬µ[Ē]ćn©#Į€|×H†uŠę’o)ˆµž*ĻĖ¢鄹Uj5‰“¹ĮsĘłš¢zߟ–>SĻgm„“ä]ŽÓr]‹*–Ģ¤²d2¹EsuöV‚Šƒ#ßR*öoT| <¬«£čņTv|xA^ģ¢f†¢6»ŗ rĪ Xcż¼Ę©_N`ÆFör_“£š‚n&Ē ~;tÉūzn2’Ŗ³‡©(ż³@v‘=8žW¤„8†Ü)”žb?ßQUœs ƒ¼Æ$•1Y³¢|q å‘8·®+óĶB¬Ś #ß`ŗĘ&fq¬ā]ĢdœźCІļHzÓu»(ńnśj^“nQNKøVUØł–„qķyJTäŪ¼Jž(c Fµ¦¢`·źo’֟г{i3fŠ”ģ&GŻ*ĢUō•uō°ź^ŹV æ'ýDOhYŠźF)# µvžēĀ³åŻ”6ŌnCo«bT(A ŅZĖ’źuw©påUb"¦¬Õ·>¤5’€ oVżīWüF‚«ū„m0МU“ £ ̵Ā7~®xø³w^‡Öšrž˜ bōZÜźķld‘­ŸYé—×ʓD  µV{åÆä¬±”įÜĆ<-ßųéO}éK_śōg>ćé#"+ėß §{¹öĀqZ1ŸŅe©vć|š%AŌUņŒ¾šGÜĶrµö|<^u)ź¢D„„›c-Ł/pېµt?ÓÖŹŗuĘéCŠe“p7Nģ4‚čģ—DūÄü–­źb«Õ/[•ÓE ŅÕŒŌ™_+Ń“šŻ8Hģ®Ģg«k©l®ŗ·¬„bÄ)'t5„ąī›r8*,™)‹’Ä’_×uš/·IĘ#c©ń›…É/{Ą­+Z‘ Æįf’ŚG8iäB1pYÖy¶iTņég%ńNķR-ć~•µ…U«ć«:ÄM1²pג@›Iq7Ū=žŹIzN»ō‡L"Ŗ²>žĀRoM]ß¾÷‰­”1­sJŅ •Ŗ(!3Ī3cjTĖ®]…JEƕ³.·gLѦ=’ά-‹¦\ڬp} z­–µiü•œĻ–(WŃgqŅ>×U£Ā¬iö­i!©d{|õtwwĒ÷ėV⦅g›ź™ĮÓČø?kPµšwˆµc:ĄµŻHćį……X\}'ƒ“š=\ ĒŖfķ…ˆ~•9ӰޘUæäs>ωČ-gȋ= iw°[¢ĪRÅÖ„×­AJ„?ŅzVŠžĖ>‘tž‚ĪM6Źö5# ƞ©@!Ņ& ßė4FĄƒ½ævĮ?×땽ŠÄlzūČo)OvŲR~BĢ”?ćmR¼#Ė‚±< Æ#ŖTļA<]ē½·öBэkDÅÄń0x$cpŗ\ÜrżŚŪ?÷©ośF"oL*Āį” ~ė,»ÄĀwщ¤iõœ9¤P¬PÓZćÅL<Č)U÷Ąģ~øĪ:½ź?üš½šŽĢT6÷yS2,ėĘu¹4Ąs¶¬µ¹ŌÄŖ*öŠŹgjĶŲQ1*5Ū½mŽŽĪ8)”'{ ÓÆy<9Ė>n§hpīćö¼d“Łæō•ÓT Wśš2¬(ńhŠ„ Ģ—©šAź(Q>µŹ#ܚȅFc ".“ĮV¹„ŖĘČź²ŗ)¶ē‰vxꊊ1VĪĒ9īøĀ­•?Č«®““=Ē©MĒ™ĄNR¤­\Õ ‹ ądœ^X{8zŻÖ…#]½V¬#4k-q”økÕ/öm@ӑī8ōŁē°hd›¢“ā1ź?£¬¹7%ˆŖö­$t“!+¬IóOzŽŖø’8p#å^hė@4Yu+Æ(÷sÓ!Ƌ–ŠbH­F”…;XrTV# $p d”F:Įl]µ#;NßŃl²” P®±bQłēlBń ±č·C«|×}³£m=e”5څ⢲ZjłŹŽ 'Ó7#&Tµ?VĄ¦XdÜGU3Œņ@q^÷Ē©x;]•F¼|ł’bßm•Ū£ĮuÅėĘäBż^£'ör‘ČļnÜXŸ(Łu ÜČ*ōyKó‡/_”·z xćnõņœkˆbńHĢ•Ŗ]ŽÆ“×(Žæé ÆĻJŽ`źN1pQ'ļĄ2Ēżąž”„Ź/8*Äč–xųä{³VŽü‘„®ˆ‡2P%½z>}tSZI•nDņĆK=p-rcƒNČŃø •&«ó€@ˆQÜ;Ef3# &¼óĒ‘ģƒó˜& ÓdŁŗåŒH‰ÅrÕuŅŹŲ’KŠZ‘ÉÓpū® o9ÆĄƒ[¼_ļ#7†vI.™„RVjś7yGµšWP3¢uĮ_µuŚW–&“6ŒEkĮ tž$ć‘“µfŻJ•ū”6$Č÷:ē¼sžÉ·)£g»q¹›ł6CĒbH^rpß³“’ßč$ńxRDß$Ó°­ Ä¢YŽœ]a—ŃiįT$7@RŽpœ<ެD›šc_p°żĮt6iæ1Ŗ™£c1ėVĶ5ŽõZešĀĒFšīZ„ŚÖ…q“­v-iߖ\eۜ“~Ŗ IĻ>ਇ¶{Äš'Üßߟ¦wīGR'Ž ÉP;BRĶ/xxxą¶ÄŪ™®n”ģ~Ę2» "&„#Ÿ‚ß<ĻĖā¦ÉžTpŽĖ[w~“&ūa1@"5“R©ĢŪdмõÖ[šbŗ<®WFŚ0ą!å©Ļ޶[ķ<”Ž(ҚūеaōY Ā ŠR'óšV鷒Ž4„ŒÆ‚%čŋ`„žwd­ ź VŌÆF&Pò,éēsęfו¼:QgRŠ”ņ2“)InQ‡Ÿ-iwŖådcĻkæŽßUœŽœ!”²Ē.ŪĘõ”Õ )„€ŅĻ©COÉ©×2{Žˆč“r¦Ū†¢,®° ć­µ%¶äq§Ų²ęPÉø">==Ż›{k,P“&pĪŪÉ@ŒŠŪøÕƒ¦FIŠĪȞŸ8Åō:ĻŃÜJ#·u{|äźäaž <<Ü%ģōĆĆCĘL„•G- 5ąCi²“v#;£w“ħٺÕcPóŌee¦œ“Ō€ Ą”»Õ‡ņ Dżm(õ1¼Ż{?Mvkļž·A£čŠ—Õ§l`&‡”—}”;>"Ž–œ/ A–vf«Ō i¾TĮ1łf…‚N2J}ä„Öć2æp]sŽ;“9³P·9ˆ2E#(HEeŌ7k:qC>Ē„¤‘Xō–lŚiČŁĪš“@@4ĻÖŲpØŲɤZdB(Reęt<‹,(”³“gS}c]½[…ޱĮ’Aƒ€ä`½:.öņ·Ą+š(!& Œ\jĆøqĀ6”ŗ¶Ž{v9Š•¶±‘Ņž'#4ļ(ݫꢅX®†Õłėŗ:OL­Č)h޶hņd¦1”&¾½öWÅ;1dM’Ź« '3ʐdv„ģ~ ‰€ĄÓJńķóĶ:® G&NF5×8O¦+ˤ×Å (~Śömж*ō@ŽĀōzź¹4»ŚŠ#ӛ€‰Ė­FĄÖč¶zT“b’¹õ˜6ÖR ŅAäĢ3hˆČÅ žoM yvµMĪR'Ņ?×uM» Ŗ×E”1WĀ® ‘Ŗ }ļgՓNū‰²gżó™¹ĮVļ¦#Gb®B—ø•cań0ŽĪēśŃÕ.ÄēšÜŪĪÓ4IķņCQq’ Én‡r !ųąōlĶ0iˆāCh† GĄķÄ~²@õŽĻæóÉ·>~}õ!‹¢‡ŌݟѩՈŌB¶L2KķK-ć[B+ ė`BüÓwŌÕB÷.•÷VŌāGįɦŸ“ŽC>“°Œ©³!Żåu]­µ< ·sČ!čdyvŃ&p~K½ó9ņO×ėUżœ×XŹE˜8xėŻŌĻ”H5TÉ?48ŌCa@ŻĮ”öķ×Ō”ĒégØ5M%ķi ŚUu)ņP›ŗ’B®i®)ø¶Žƒsž’¾K‘Z8.›˜³BŻy\)ĖÄ+µ„Ä“OD—»;X®W`’jO@0Ķvžg@ø^ƌ¬f§Ŗs®Y£"ż±ĄŽ³„#ł¹$ä®å”ÖūDץ`¢ķčv.üž½a1‡L—ĘQ^“”=ˆŗÜą*CM„ŠaY¦oŹ i²v2Ó4]ÆWE֐sę/—‹,C%Ø«gRxm[““ńŽ/Ėŗ.®€˜ŁÉĢóĢĶšZĒcd‰Ŗs7q—eŌ÷„]°1`ÖŚ¼'³ŗqéeeõ$Ł@”Po™­Ā5q•ĖPJ£‰ æŽWɅž¶-šuœ#ēhY>ŗ7Ų 5”>œó˲ÄX7p2ė“Gt B;OÆ(H–GĢŽV±˜UdģfBŖ”ģĮĮWu‹gŃ š;ֆy͇|rq,pĒ;āóĀӆw$=5‘ķc2’/(¦ jĘ"m‘2Ń5Hæų”_7j‰,ŖdęćĄiĪž'lÜDĖęÓėõšę§’Ž:n*¼ŁŻŒöH°&½‹žė­±¶©Ż|ś‹3–{9å¤tŽoŸhåŚń@}̌q`Ąs ÖFĆ ½'oWųųe~®_o~óMÉH ŗŒŲA}™äž=J¦¾~g£RĄżl,—ńŗĖ²LÓ“Ń8»Ą6 Ü5ÜĢóÖā÷UW½ß,-‹ €µ(”2«„¢ŲÓü,Ėr¹\Öuģ¤0ņM± ČĮ?›!¦Ī óŸ˜x4ā8"Œ }²7RĘߣŻløŸžž.—K%§e_ˆgģF¹×ė•×;¤”EĪØÕF ©X{^ƒś5構 n™u3”ٛ躮 UČøĮė–WĢb6I“Sŗé¦q™¶žŠśŽų "F٘¼Ą’iś\^Ól£VŖX™+¬ėŠ“õŽĻwS½EŹgØjJn¢© 6UxöP‹‘AQŲXUM¦ć‚9Ó³]ƒO?ĶķÓÓõīž’āõx"°śaQ’0K×rˆšJFÓ~=q»wŗKÆŻ‘“(ūÅĪ7g·° mӠ̳¶@ĀĻ|ę’`šėŖž€¤ź «|²ū_żJČØ\ŸŠń¹½3a¶w­¬.š†Cµ*„‚C @ˆ<¢U¹³£¹%µčQ;gAµē?m×1 NpRLöŚ9_”\Zˆƒŗ:ĮØikmKy$Į’&ÖWžw|k ŠHeæCv4ŁęcÅŲYcuU~O]ЇG~)åöĮģŹV!¢T Ąöś„=Fń¦U$Mźī¬/Ąn‹DT/’ŽEq€E9Ī®By_f7,ŗ*ŗę}ĄŖ5ä½łņ%yX‡›ŸD¹»VŻ52ŽŌpmJąq[Ø9ŗą²saņżź€ņE.\—wŽĖæe Ż4Ü ŖoŹߗZÄ)ņM¤Čß%f«o¼O#g¦I°‰6TckĄ'£xA¬cŒ[WJ[õ”b½öv]ĢŻ>…ŪÜā²›x^aį2os©yKż£'‡ąĪóŒ†UĆIQ¤ö©"é0TūąŪĻŽ;ēČ{īÕ ż„”y’+Š$ż•I] (gy5xĄ)³³õė€j”wć½ļgkG+$R!:)ńņ7ƒd+ÉÜif »7‰į6 IOø•»<ŗŗ…ĆBf/…vó@RW…<ØeƒėxĮ*(Æ6\Ł¢Õ°@Ų QźO’XĄ‰•VsVkĘrą€ĘC—’žØ¬čWžc¾6š¹ģĄ~Ō4b¬v#ŸĢiÉkʌ©Pģ~¶fƒČ~Q«ZŲ©12„øĻŖŪ’ Ų­n-LY¼š’ó–Śi빟æ¦ļs• ‹Ik2N×Ϭy«Xve”ß*0éµ}„Šgy¾ń›?Ćė’'~ā?p+2zē0Ÿ6£Į’kÆ`v†$Z5e‰8KŹgCr[٦Dā?°uh-ź”ZA,1%¶nöõ­žøCGW¼I ō|<žČaE„ŪoŅK‡tІUm-¢āFŗēÉ%5'';l;L懬Ać¼ßõäŒ$Śåkxä~ųįHT”ÆöStāŲĪ_łY§ĢŌ»ļ¾{ȀRõÕy™¼hk;«Ć žJĮŠĀ“–E†용ĻÅs¦™aNY{d?ļĄQ±s.¹Čʏi\¬5YR’ĄÆĮ° `Ķ‘×K€ycm6Ļ"ńäW>Ī7|²ćīC+kś%+-”‰ž·ž·š“xhƒÄW…"čZ2»śBk·GņqN“ʑ‡1zæCĪŠ./=Ü@±Ńi¢‘įS8  ·zŖ=™żÉ€)8ć±Äģmž©V¢Ų”…˜ 57—Ė=8V¶+R¬qõŲ§Ķ~ĄÄ3W-3~?8ņ«÷œźĶŅ#°ķµķ÷Ö”eq#TMŸŠē!QčŰR'ĮÓÓ÷T†ˆ-€zģ²?“ŒmQŁ;Ṛä:‚RĻÜčV`kĶĄ«ųX•ÓDŁ\‚½ÕŪ2øĶ*ä}QKŲϘW§†^āĢKJ¾ØØŁ_ •£ķrž¹£v8oōl»*­D‘}]WJˆāŲtŁÜ-¦C¾®ų9R¾d·«sŽo¢cBeą™y@µjŁi7¹²}Tü,ōŻJHü F {ö+,~Oą mšļüżæ‡ßō©O|˾5tÆ!ZkaŅ )÷.äėĒ/)yśix ܤük}µ¹/?½aŃD®ź Ču”ēPŗŠL1ŌY™"(Ŗ«TīK•™Ā­D›gæŌ28h¹ *ks0nĆģšĢb$2žĮDI¹n“s#¼œ]Ÿµv…‹ ’£¬\ŪʘOśÓuj©īLś ū„¹a§\ś@‰SķĶ7ß’”ŠBMiMJPį EYMŲ‹rÆ4;O›&jŒ“½§uMEڦ¬]ź7ĘÜ„óĢth-¦£Ć9·®¾H`›œõTēÜZ\ʂE“©`•O`ōį¼§@P„JŪcz uIųG¤z'ÄÓē'ö¦²+; Éā˜aš8äLŌ­¼jT|£$ak/KA׳éKF®H®ŁĢŁ!Ęzµ’Clé\l}éQĢ{¢\ol;0²OƒŠI(ŒRį`L]Yu®X ž ¢żcĄCĪQŖN¦mÕ2ʦµ›”Õ:Ž|žųT–ÄT +€Æ¼¢’±­×Ļ­¾» ĢĪa±§ųN[F¦•+Ńø®»4Yg^dØ?6%¹0¤šg_‡¶ķėg?«™¾MÓ ƒkĪ,õč¹±Ÿ®eā‘ Ø|õI#Źń[]ĖSĮyĒ`Ņq‡\EŁ$Ö½ŪŃĖ}‹Ź¬BŒš£³FŌyąõģóęvł›fHüŃLśŃŠ«›ÅŁŽż85ōk~żÆ3_’¹Ÿ’”łA Õł§ō⣀aD|||d=1Ču€Ō-fĘ›Xn4ø+žµåÜsW-ĀQ‚ųVį‡ub;ŽOĒŒź ¤†‡³_­ÕĖ`ZŽdjwPAåEõĮ8 ¶Ż1%Ņ×9ńČRĮnY<…šc—É+õK.VšÕÓDźö©įŠŖ@e_A ō<·‰čDŌ<³\ģ“ ĻY-ģĖB"rƋ{Ÿ`'“œfŁ&‚O"āźYā§1fB“¢ō›z ęu4Yż)ć'S2!0­QŖČŘ!(,n T|–Õ1—,ō efOŽR0cbŚ ˜)Uz‰½ą)¾qÄĻėśV~Ā{xõźXk>’Ł_śp™æżŪæ ģ4qł¬ŃōĖhr3Ō}ö0ļ6×[Q‚1ކ¦, ¬Ŗ1†„µ® §ˆŻkzhŁØCU£‘ĮŒJß]WÄź# 5—żt9±>ēyęr½ œĪlu Qŗb¤»nĮ‰{Lø€N%*%ļ Žµsś«-q‹[µīžĖøWN?aµwÄ[ķ$Ōąš™L×DōTGß1A Įpb©“žņ¢B¾ņęsAĘ/b ļ)„⦪qÄļ­ WłųėŖW\N!÷«ŃTfB’{V؝÷É¢&©W„¢XQž•ņ_ƒ~†Dm$JŪĮ¬_?-5’ā9aĄ;Qś_Ió‘čkÅT ”%Yż6„[Ɗć4“4„P«u•!ī©\"X-͹eõ+…ŒL 7ÜJÄ>µ³Ę¦3ykól­µEéo,”ē¼wĮg”Ēv¬™ĄI%Ļ:“«R©IRļż<Ļ—Ė…i`OėnĄžė'³’Ÿvҹ ¾īœ/ؘ˜ bU*żæŽiwCE=$bk x;­<ŠŒb'śtmvéŁ¹u‡ō»3:ōŃM%s¬¢'®j›FØš2*Ę^®“–¦tQā{pQŖDĖ„įóŗˆ„__tv"”»„v.*>eŒœ_ŚųÕ×4õ‡gp4Qć=<<ń‰·ß~&i·ĄąN²Pż%3³“Ja©åņŋ Ü|' Ä`Œžī1e0IāҢЧŽ-Jj'†½+ŹŚŁo». *œ{Ą H;7QćŚ!m¤Żģu'ŚģŹ—§TĄŲą^ę׫*5öļ‘ uRu²,Ąūčz½¦xxDQ©ī=ėĢŪī źó»jÉĀ¢ĘĄ"ōņīLŚblō?$µ@»łGvę÷5”ą(»Ö.²__eŸUä6·Ŗß-żqDļ6r¾¤Lc­ Ļ*ļę·&"ø\¦MJt‡>jRÖ­Ģo*v‰J’šuu³)ö”%,VĻŹ”Ų Q:żébw«•_(—H-ŒŌ¢&Rp(yT„ ĆLBŽģ’#œsY2ŃĮõ±ģźqDž¼_–'cmhެ+ÉTÖhŽś@Žœ#ā qå““„õoēõ8M¶C7ų%D¼Ķø…č·ml‰ŹK“ yŪmGĮū¬‡#¶­ģ‚޳'µŠÅ©¢~${Ń ‘ś#ēΈvZ–ÉĮ\›B–z|õ'DE tr Ŗ‡Ų¼ˆ8āėöü;¹3=!sžń݉ūO.wÆ*DæI.r>k*YŁUÄ-Ń}uāC“ց:ž¢Š‡©ĘU Ÿq“ƒd1¦®S0°=ćŽø=źF@öŁŠń}ļ÷~ļžč^ÆWZWAč'n³ĄaŖnōn^­h¹,„L™ŃHK]SķC—–T}Kl©ŪģŹuŖ ”Į i±`U­Rā‘ĀćPS¬ĻŗEĘĻj_n·öķ{FÆØC. ¹Ųéļ‡ōüנƙ+ģķšŌZ ųĀź)‚c|ķҘ·²×ƒ{g{j ż‹„¾hEęŖ•ė>|uæĒčT]˱ÅW‰ü”Ø$öꛅœ ˜äsšČoWBpä·ØX«RśA–‹-i1V1*lńCŅUXe4+e‡‹ŚH¾ĖDÅĻĮsč „÷‹yVАš„€Č)`”‰²ió-ēBe€”ÆXU‚ķWTRbÓ9zzzzõźÕ6¶H{Ī)ć§§ėÓӓČg¢-÷łņOģŚrœ'Ł:-;„ƒ¾KG®*%į¾÷ŗĪąV¢Ōš”‰+hyĶ‘–¹ zzŗ:U,Eł–CÆĄ+ƒœß~%rLŖÖŅņtå ‘ó’* #¬ŗz$õš[³QIóY‚< ĀÅqJ,’If’Ū,§É$ąbŲ²ˆ(±`”1öńńŹė’“yęy¢P§ŽŖphĀx¼—¦ÕóżšĶųǟć‘q]®a;p“&sėżÖ‰Ź0Ÿ¢ź°<[/¬Ø»»;hWZ:B_IŒGŌ©Ųžf²½Ią Ɣ'#)¹Ī_‡}޼Xą pw7ćÅ4(B‰ʘš4cm­”ōF ŠÆė=¼’žĖ>”©€Lßß_īīœ#r°^] n¹%žr¹ph½:N,JŲ3qÅŽŹ[%ӅĀĀć>x1Eń3Zr^Ā4ČUÄRĄĆŖNĢ{·®žhĻĒ0@@„~ŗŲ邀0Ļó–9"XÆČ9?Ćp’ŌÓKŽļp²ƒ0•Ē%²em¼¾ŁTKßDĪlµŅŅŅr¹B€€“™ö4PŠ~:&9Cs™/EŚƒ³į‰œOčÉš ‚Q4érĪ‚:ś-rÓE”;®H}įŽū“ޜ[yÆmŠE Lmõ±‡Ć ŸAŪ/Ó7!„󄃖:‘&Kļ’•ē®Yʗ[C_?ŃĪo >Žvč)ćtg»ń¤“EŅ&‹öIØZ0źFDā– ~ŁĖ—/µ‹šśPo¹LÅń1^'kUä°ėk‘Qź“XŽKęAF²qväj>w‚v”:^OOKńēĂ ±;Q=÷F2‚)ę<šjquhD8U¬cĶ[o½…ˆßłß |¬Ę8ŸĒ#yo/ā×äć*’įųj¤ĆE­ väu5TYH łō‹€'ģҘ° ßņ ćc -ŪŽ3qžēn ʾy,•łp5;ŠØ¤ O !g©Yk± m9yÅīU•Ļ%ü¤Īŗ®2ō•ēkĘņ<qĪ·4¶Ō o˜Ļ?–%ø6óŠŽŌLź¾śė˜NeGģY¤8įeŚž¶Ó“„ėćŸ§©ŠN©Š[l'»ŻŃLµņ04„4åk¬5™ˆq‚Vbs6¢ÄģGą[FrĄléöĪĆ\Y[”ʱI™+ēä=ŅZZŲĻ·b]"ŗ\.isD-ō홆 lĢo S~ˆ›čKõčłČņżż³»Z¬7^·ćįuN„Ż­rźrØi Üßß§-Äž\qfå@¶Ö¢±8M6”"żĘA<æZ¬Ī¦^&%([ś±»ŗ«É‡Ķ…D0 šÆŽ“WsslĀŻ˲4`'a;āFśMaĮŽ#Tą,ˆšx„iÅ5Șņ„Ō+’„FC%-āśģÆsɃ˜ Õ®~ :"É|Ö§Å/HŠ) ‚’VĮ`BŁī޶Øč["f(¼sōH‚†8Ń)o€OyMMÕ|ßāGB¦åĖKY„sŠ—¼—>¶ŽĶ瘷"¤,hŲĒé|vłÕŽö–ęSG¬sa;=W±m•%^RÆ|šĮ‡äUO—ō¢ńƒ‘1¶D¬ÉżņbÓŹŗ8QWĀN9ķSµÓCß¾ i&R}އ¶żļ &N"ųhmņŒ°ääKGӑyJ'Ē|,cHy KRl9#'NŗéĀōmō(ušL¦ŲRBS²‹K&Č'ģŪX®?µGń””“” ¬ >Õrq¤§ßéēbN8GQ`ņ-„K9ģCu…@1³Ø%b•„e0bj)<÷éŠė Ā®£Ž”ē“aƒQŪķįėīĢļv i590¢·„mńie»¤Ä¼Åˬ]IŠä­­ųŻ5Ńb° ŽŒ²I r¦›¶Y’ōĄ°s'¬šQŠŽĒA†įbØ‘Lń:Շ“)oS߯ŗÆJ>$ž„ 46£>– n­‚”Ī:×w'j/åhpXŒŻ*YėrļĪmņĻ%ź°~å.|ZUÕ|Kæo“UNšuæ \¶ a-Ņ»š§ŻŒÅ€ž[o-ī¼±Įz’¶śź².ĻŸ“i'`Ģ\+ōUęį`‡¶Ä{d)ī½ęÄzJ ±Ś[*ęĄMT›;#[µŌ½ōQußénŹ@ŗaäHįŸ'›°VĪožē‘6Bµꖔ^J`Gēc½^Ÿ¤”ß”bZŸæŗ¦=·s~NĶƒŅ eŻ"Či¶ėā¼£äųb¾īŅ€ę*wQ€ōĘ ŃØŖAu-Ļ)ą‘™“*‚£>^óæ”””¶¶¶š ˆ§C‡ć8™L¦Źƒ0¶mkš677ę[XS0Ęb±Ų–w“Ņé“mŪ‘H$šgw%IJ„RŁlvĖ„mxģ ŖźĄĄ@"‘P….­ÕIĆ­@5ąžtxU‡ī„P ‡ē#VõĘd°q]×qœņ޲,Ӊś,ųč²VČķ@żeŒ™¦YĆżrĆ04M›ššĀ©o€¼7ŲāģīG—‘īޜŃ}£5(ŗeB8` ±ķĖ“…Ē”¾ķ”X[[[[Ųźśä½AUD"‘ÅÅÅķB%Jw×±°ƒßcĒžžžƒ¾Ń¤,&©§Ū šŲ:kŪöąą åükø8‰DP”ģt:ŌŚ‹Å¶›8²Łl*•zcV<$P 7æŃ¤Œ±0œŻUeppp»’vį±CÅ_Ņé“ėŗŖŖ&“ÉŻzĶ›) ļ:fgg©¢å-³Łģ挄 Øŗ°ezsĖD.Ÿ§Äø ”J`®¬¬TJå„ŁØ Źf·Śr„T*­¬¬¤R©šģ€Ś€N‡‹ńńqŠ”c±Ų꣄ƒbŒ ĄVUnN—J%гéŖ[Øvōi,Ń@ ³6,…éŸńx|õlkkcŒ%‰©©)øŲœ÷Æp]—Z°mŪŅŅ’ķķķ‚ ą½„ ŠYåT*…ė›3į‹‹‹mmmŲx{uCĮ« —žĄ³}›”“Aø6³å.µ$IŲ[ŻLåŽ#­óBū(Ø ˆ§£w…ĖåņĄĄ"éķ¦]Q1Ūn·Ž±, #gK,ĖźééAŹģœ÷;T­‚žķĆT»ŻT+IDz»EžŖŖĆĆĆ!©jRĆ –2H€č4ØĆ0ŚŪŪ Ć$ "½Ż<ŪÓӃG¶CEUUéH،®ėŁl–J•™¦¹ŻM6vūӔބh’ sĒŠę“¢(0Åv¤Ói,ņv€Ī|˜¦™L&A ō ĢŖūÓ!…ζضm&Ł7†Ō•Ī`‡5Ÿėŗ5Tć ‰dYv‡vš`;A×i²Ł,NwW#҈~ŖYöµ··3ĘJ„6ņwj:³‰·mĄ®@Ž;ŒPŗ·°Žå*c±¶v&‰P).DŠ;@Ļ‹9Ž“Ėåč_‘ŹՀsd”‹I”°œÆŅ\ČxWC&“!ÕA5˜7®iĘĒĒćń8•Ē9pšF÷ØU–e‰¢ˆŌw•éUUEĮ«UUMÓ4MkA€x¼Šx`„źq]—ŖJA¤«DÅr¹Œ£dÕcŪv¹\Ʋ@§Į«g-ˤP½Ń:;;q#«zdY€NļJ§3™ŒėŗxC@§Ć‹a===ŖŖŠ¢H'Č@5Ž ˜Ž™LF–eÓ4±K]%étšjÅ\¹rƒ @§Ć;uµŁm||Gāw‹¢(Édi›]”ŖŖ ŠiHw× ]uU·kŠiö:Ŗ7r]W’$X@§CŅŻ{Į4ĶöövlN×f³Y<˱[hEØėśÜÜ\2™Ä}-PuNLƒšušįęō¤ŚqœŹj°«å5cŒQÅĆՀĄżé`jŒ,Ė¢(†ķÕŚ RÕ²,c¢¬ ŗ£…Ś“5ć8½¦J7ųa0ƒ¼w×ćÉd’AL‘5‹4Y"]3ŗ® ‚;ģE§csssHŒčtŠ R—88ŗĒµĪĮƒ±©æGv+Ś‘eٲ¬ńńqEQØfl¾‡.­f2™l6‹ÓŻ{"¬uö„jÓé4ĪāՌ$IŠ¢Šr'™Lb³?“`:8! ¦i±X »Y{Ēq˲°9½w3Ņc—SSS8‘·TUĶår³³³X;"žAX€C¤÷ˆėŗT "½G"‘H*•J„R“{_…—J%I’ Ɛ$ µŽOŸašf$‘$‰B@d¤Óé+W®ą 2ą:EŃOŸ-“ét·ć8éŗ€ćµu·g$Į¢§^ƌĒćtśR ~å-ėH&“Āé§:²øø˜ĖåP`kļPڌąxb+$ ļķćHZ’$I’lŪĘé’z P^ ŖŖ,Ė©ėˆ®ėĆĆĆH€C§×"­iš ¶mCWź>żasŚ h¬āLY½ØLI§Óŗ®Ć°yoƒt·s{}÷Ō7¤īģģÄ ąśŗ?‰ō•+WØ8l‚xšIÓ¬‡t·X–eY¶ż¼·š¦µµµANź‹ć8t–… Ó€£ÉŽ1†Š^@7§aČd2ōŹ*LQ÷qĖEQ–eY–±Ź Č{ū I’AH„Ri/ M>”\õμ¤Ö0E}EQEÓ4ļŻ»wåŹ `ÄÓ i‘4{ż¬/ö¤="‰,.."Wįµ…qLĻ»YĀ0 ˲\×u]āiŠ8LÓŌ4MÓ4œīözš„H{É3¶Ø½3/‰“,Ėtc6 oĮ¾ˆBA ć°†wŠöģąŗ®£pzc(—˦ibĘ@< įéŗNKcl;y ]rĆ+æž"Šb$1 yoOlYÖŠŠP:¶mĻØģOó‹išÉd’1†ż¼ĘĢnår›Ó^Cū¦år]6I’ęęꉠ¾yo~‘e9‹I’‘n†aąJzcÖCŠ¢`ė“1čŗ®iŠÕ#žžh†eY†aąF/`/Š Ū¶EĮ޵OĮž4wŠéī\.gDŗ1ȲLsLŃlŪĘĖNķ„ÓéÅÅEY–©( @< öDåZŽ5ĢądŒ•J%EnX×ŽŽ›7rėŗNk#ģļųģOsD%ŻĄ®Įd³Yip—J„š|VĆØڳm»³³3›¦ ć#ž»Ć²¬žž†ÓŻ dqĆe 覊&łģOó‚,Ė©T*•JA¤Œ$I(ŽŌ2™ĢĮƒQń»‘PĶ2z»šx° āiPÕ 7“ÉąYŗfÅs“9½²²ū7Ź! ‚€ĆM§Rža||·8ēᓦOUÉdryyłŻwß=uź Ņ`~śé§'NH’ōį‡Ā †ņ®üć±Bj<ļ¾ūī?žńĒqŅé4ģx¼Jtćt7-†a(еhüšCzBÅ·ß~įM­ß}÷݉‰‰o¾łĒņĪ‘Õœī .Ѓƒƒƒ$ø Hčŗ)Ź75ģO×< ē‹ł…ź6Ąó ōŒŠ,Ė‘H$“É #‚xŗŃ†‘L&eYĘkžĀ¶mY–±Iį/č|~<Ē\ļ#DQ“mū޽{¹\ntv Yßašę½{÷P…ʏ+cT¼ņ’$ĶĪĪ& ]×]×ÅÉ2čtć&z×u ĆČf³X$ś12‹Ēć؜öéā·³ü(Õt`S–åĪĪNĢ™ŠéF,ź)ŻĶĆ|įGTUµ, :ķGDQœ››Ėårø£å;čY†ŪÕŠé@ƒ É7’dŠ¢`EļßČ,•Je³Y<ŠäĒ5–išŁl6“É8Žƒše5€zdoĘ4M:µˆĢ›Æ?āÄÄfy’Bk,z7gŹ|͜Š¢Pu}Äֈ§ė<;Pŗ›V‚0ˆ²x<Ž‹=¾&“É“··£nÆ§SA0‘B§=AQ„b~_ĪcsŚļP öõrٶm*,*Š"ö”ŖuNvZśI’$I’eYˆĆ|iš¦i*Š@HMÓĮ¾F×õįįaĘŲŹŹ ¾&āéŚEZÓ4JwC¤ Ó¹\[bĮ˜ßRc½500Ķfé”N–ķ Ī‘ķŅŻĮ€²mXoY–ēęęDQÄ6§ß„š1fŪv2™ŒÅbt\fA<]m$mŪ¶ŖŖ³³³Ų> L $ĻØ+Ap!õ`z£Hkš&‚mŪXÜę›Z–„Ŗ*t:ø®ė8*郮ƽ4 āé7 I’ Hw lN Q%I2 z`>Ø,˶mkš¦iZ:†M ÓŪF]tĄŪ¶m¤»ƒD$ikkC0°L×õ\.‡ģwb¤ĮĮAÜ®Žä½_‰“¦iŒ±ŁŁYäÓą]×MÓ4 +°€­Ąč½`˲(p‚M ÓÆ ŻŌä ŒNĀįš ¢(–ĖåD"AĻm°ē½‘īü÷ĘętP—׊¢ M<ĒI$4!ck#ģń“išÉd’1655…ģY QUÕ4MœŽźlŽŽŽĪ+•Jų¾Aõß\.—J„BD…ŗĪI$”ÓŻéĒÓ0B€żwpp½®ū ł‰iA†x:Œń4m[Ņ{ØX‰•L&ćŗ®ŖŖųÄĮ†Jd@­‰išGéŗ®ėz8šü<œ^Ó“įįaĆ00ƒ{5våŹlNŽ#‘.ŻEQDQĢd2¹\Ž\€N‡Y–c±X*•Ā ”`CūŲŌ6t6ĮF×õX,FØB(ÕįŹ{S Iø4A"Ncw# Ї,ĖT:@*§»³Ł,"é0ĢŻ¢(¢lØVį”#…)Ā0‡ē9ł÷¦t·$IéĢŚ‹‹‹’$A§Ć€¢(TOÖö‡·,KQ:z†“e”؟®ŌŸC1“š@ņŒĶéšLß 51Bó­é*‡,˲,‡”fYšuڲ,MÓęęę Š”²,ŌÄ ŖŖŽ£ĢdŲÖāår9 W‡bšŻŠéš@›ÓŖŖb·2l‹3Ŗ S„ē‹Ė²lY–iš™L:ķ? ĆČd2–ea²tWƟ…ó»ć h8æ{<źĘG`óŽōź8ŅŻ!Äu]ŗ9 ‘ŗ® ‚;„ Ć0A Z7Lƒ9žFŗ€°-Ń ˆ†Ó4UU„zŠiŽ”C€p׊.®Łėrƒ°F„šN' ’h”ėymmm«YL¶mŪ²,ܤ -ō%t:„8Žć8īć…]×UU Ųž×Ļpwą–ŸĆtŠi: €š–a!|vŪ_P¹y/~²ėŗ.¶t]÷čģŗišōčąI’¼» ŒŪküƒāzž æō†””!˜—¦¦¦<ńxę ­ūOMMĮ¼ü388ųźżéž _4½5ysģŁÓ'½‰s‡[6·%ó…éba&Śuŗ£«»¹-Y^z291ęŻĻ§śM\õ”‡”8:ņcŒ‡”HNįõßĀOOyŠäž‡ŽķSĪŪż zZq:(Ńę”Č«čō—M·Ī|aśŁÓ'}ʹ¦;*¹Q,Ģttu7Ż,ó…é8*W=åa(Ņ”ĮĆP$§šśoį§§< Er’C­GCāž<ōtNC‰6E†sdĻ@§č4 ÓtŠi: č4 Ó@huzmµĢ[^z¼ĆļY^züha~żæ¾ńŌ@5-Y[-Ϧ7“¤ī”–¬­–éUž‘jŚĻüō“Ņ€]żŲ&Å-[²+Kr;6ų{#y•?æa-©ęƒz4łtƝ®śŸģ©ĒķjtÕ C»Óéóæ|Ÿ1–7Go’ps»ß“¹ō™žqĻš„ĻÉu?оSZ(ŽŽÜøžyŖŽvÉ\ś¬X˜^^z¼ĆĶ›£’zś_FGnPk+m &Õ«%ysttäcL’øgó’ż(śżßõ̦’õōæ0Ę.j‰,Éüōtyéń%M”a°łS^ԵĖ-ōb(īą£#7>о³ł5*Ęń›ĒĄoä _ołµÕņµĻ?Łr¹Š€–l0ĖŸæ¹”7G·ü ¦»’vxŌߝgbżWšŌćŽ(‹ysōĻß\ŖĢ 5ČŠ.tś~žĪ”Ö£ū[„Ń‘ļ¶«Ūžha~rbląź÷Ć›:~¢ćŃĀü¾-Ń®īłĀtK½Æ­–''ĘNõŻ”%Œ±[ß^žÕÆ{=;ńŃo~Ē{“P<Õwf¾0½ļ@Ė©¾³õjĢķžtŖļlŽm?Żß"TóGJ Åh×éż-B±0ĆC|ßõōö7OõY^zü`ņN•ŸŅ£”XSli–S}g‹…铽gŖ“$Ÿc`ƒæ7ro°ü‹ēå“w+ßśH„ī¶Į,&ļĪf6„ņŽ BnŻß»žV3¬’ Žy\53Ą|aęĮäŻ×6©E†v”Ół‰±Ž®īłĀō‹ēå >¹Ž4Œ±Ź__,̜ģ=KŅ›ØŪwšœ‹v^[-?˜¼ķ:½i¦_<_]oˆbaŗ7qŽžYƖżą kÉf³ÜśÆæė×¾§’õéļ—=„Üŗæwż­fX’¼óøjfżŚ÷·žėļ{‘”juzmµü`ņn“«ū~žNū‰(ż—ūł;£#7*¹¦å„ĒĖKOČ1h={ņN’…/īēļō&ĪÕq“7Ē:ŗŗ‹…éĻWÉ4ó…éё÷ów*­„•ui”HĶ›/LŸģ={øõŲżü] ÆėÕZ1 3dZa­7K„y•5~i”Ų§ōßĻßłč7æõO֋—žŽĻßyń|µ£«ū~žīń×-y“0æ~Šh¹Q9ąÅPÜģō)V1ĀŚjłö7+)ø“wū/|±¶Z~¶ō¤ŽyĘ žN»ŌŌYÆł––Æ4ƒ¢ØłĀ4LÆŻm³k™/LæX]-=,ö&Īy=Č7XžģÜį‹CGŽVZÕž^ōŠ…c^·dƒYc·¾½Ģ;’ÕÕŹ,“Æ„„#;įŃ lü§gŒ]ųdßa߁Fõ­o/æX]eŒµŸˆź÷^Īź;ėQ7Ļ·¾¹|Øõč„?üĶBÅĀĢšß¦č+\ĻNxźqĘaŽ›œż?’Bēė©Ÿłļɉ±Ń‘ļn¬Y†ŖÕéŠ3T~QY¼x¾z?·’Ā—}J’³§OFG¾»ž ’EŽQG]\߆JKŽŸč æńŠ‘£Ć—?_[-?Ńqžė«—4åü×W)KSiC}}uCKn}{łÅóŽ¢żDTæöżņŅćO?ųŃÉ;}J?ż~‰4W=ŻŠ’¼9:91öē’üæ†ŁÅįŪß"œ’åū”}ńb(nvŠėŸ§Nöž„l[%-LƒšÅóÕ¼9ÖįKjÉžĮ_ÕfĖoš÷ёÅĀĢÉŽ3“Œöto¶|…ͳ×ī¶Į,6ĻB͇’ōꋅ™Ÿłļõ½.=,VžĖ­o/Ÿź;ۘłŸ1ķ:]Ł.f6l†zēq›ĒaGW÷üåOĖK·£­–õiĶ2T‡ūӇ[V6`šĖ”Öc4\šÕ€É‰±Ķٌõ …gOŸ°@ĄOOóc'{Ļl˜ *G]µ}ö“A`čyłĶÉÕ×f9˜Ææēæŗź»õ؍ 3-ÖcŒut~öōI#/žź;ūģéJ}W’jMžjŹč”Oõ©Ė­]§×VĖ£#7Ī’ņżŃ‘ļš>bņęčĄ’ī”“śĶ‚v *»e†«ž 3ĒyiÉ“ļŅ$uĒĮ"Ų-ĒOtō&Ī]’ü“-Ɵ5>^¢„på@GS·¢]§-_GöõiIķ:=|ł³ūł»×²f’…/š;hn’póÖ·—Ļ}Õw~ąGōkߟģ=;|łóõ‡7›«Žó…ébaz»@\4 3õ]1ŌØÓĖKéĖēŪ?ÜģMœėhöьCGŽ2Ę^ų­¼”ß{zčČŃ5nZĀ֕I R}†Žkmf߁–«céańŃB±éBķź.=,Ņ­żzżĢušvŚöń±õģé¶Ä·;täčż×Ē W=vu?ą¦%Œ±“wįąų‰håŌ÷fŒ Óū“4x(ŚÕ],Ģ<[zr²÷LsmB …¼9vŖ·nŪä5źtū{QĘŲżüµÕ2Ż=h"ķļEéšZÓkpž’źźäÄ]Ū]_W„ŸŖōŃÆ7’Ēę^:*y+{åRuć—uė7HÖ·”)ķ CO·«L$–[žŗ1¬wĆ­ĒšėģlÓ;ø~Ō}ō›ßÕ±ģ` ˵õ+ZU«rŹ=žõʰu_KKs§ø ĪŽxßßŅ/źāxąč4Ą/oĮö‚æ^~ƒN™NīģW ļ @§ Ó€NŠi@§‚Ā«:'µDӛBŪÜśęņ¾––ę¶äŁŅĘXŽkśŪ”•']=…«žņ0 †bc^|ā§§< Er’ŅB±éC±1īĻCO+@‰6Åźt±0ĆÉw*=,rŅ’gOŸTž@6\õCNĒCK^<_åg(†§§p’āékY“‡š„ō°xž««ķ'¢ĶmIŽ›œėMœėSš\“¶“P¼õķeÆ’®zŹĆP¼¤)Œ1†"9…× ?=åa(’ū·æ=’õÕ0ø?=­8”hóPü§NÆHøYP’”żD“é)¦c‡[ņ`–ĄUOłi C±1™7~zŹĆP$÷ß×Ņ÷ēŖ§P¢ĶC‘ÕńŁ|azyé1_śŃĀü£…yZ²¼ōøé›maėéŚjy¾0½¶Zę”1ü8œ.äCNēk§ųy]ģrQK\ŅŠŠ›ė¢™KŸé÷6 Yōʁ;:rC’ø‡’9ĮvQ~zš7G©%Mß[āĒ)ąt!Špŗ8Å^uśŃĀüõĻ?į$m¢ÜĆk/Śō– _žl¾0 AތŸžŽžįęčČw'{Ļš°ŽęĒ)ątaŠpŗ`8Å^uśŠ‘c™æNõ_ų’ė\˚śµļ›~˜ž1Öį‹ėىć'¢wT~zz²÷LęÆS§śĪ6½%\9œ.ĢCN §xk~‹°æEądŠ?с–„¶§‡[qŅ®œNę”§ ĘPD=2€_ ÓtŠi: č4t»ć­zż ŪÅ9éŅõģ'-éæšeHŠRńÓӎ®n~†"?-Ó…|(Āé|ķˆ§~NŠiģžWūÓµDӛRZ(2Ęn}s¹éoļ<[zĀĖ›cMpžÅźjž®zŹĆP$xŠäįé)C‘Üæ“PlśPlŒūóŠÓ P¢ĶC‘1ĘŚŚŚ°ZįœD"ńҲŁ,ĢĖ?³³³ €D"órN<÷čėĻĪμü“ĶfV*•ǁ-xF’$Q=śį¶m»® #s‹(Š’$yōĆ]×µmF†ūn‘eł’9Ķ’µĶ«ÄIEND®B`‚apache-couchdb-1.6.0/share/doc/build/html/_images/views-intro-03.png0000644000175000001440000003055212332105522025055 0ustar00djcusers00000000000000‰PNG  IHDRü. W pHYsgŸŅR cHRMz%€ƒł’€éu0ź`:˜o’_ÅF0šIDATxŚģpSי÷1i2Ö 9~Xņ.ņŚčŅŌk搐‹µMfbĖivgB%uM;Ćl"1ļ&Ķ‹™Zģ`&!}¹é0“ÄļśzÉŌt›†kgÖéĖ®Ģ5¼¦2N–+¤³ģkI3± ɑ”æP\Ū8²¬W÷~?$2–„sžsĻłžē9ē<'obb‚Į`ćøP(SE¢Õjyž7›Ķ0Č" `0†H‰D$I‚@vY€yRZ¾é`k‡zź»×Vćļ?ÓŌ*”•oVO­«K&„tśÆ©§ŹķGµyĄŸt€N: @§t€N: @§t€N: @§t€N: @§t€N: @§t€N: @§t€N: @§ Ó)y°H—˵gĻžL~ćSłm˜ż9?|+ņ%śujØ©©įyža˜@§AŽ!Bmmmf¾kõŅü}Ū“;+ `ö9uéꁮČé’ś ¦H‰T ‚;č4Č1Āį0Ēq,Ėņ<ŸÖ/ŗ}į7r’ĆŻ-Ė[“<»÷ū}Ę`(‘iÌߘ¢/ó?zą©Ę”|ŖÓéÜæcc£ÓéTĻC.Š¢ÕjeŁ`0Ø×ėŃńtä<Ļ‹¢˜nyž"ŅyK×ę?¾cvµ,088XRR"ŪšøńŁķĄæŻ ž;!$Żóüõ’JÉ“,«VØ\.—Óét¹\V«#€Nƒō:ĮTe†q8,ĖĪõāįīÖÖÖtYw®żįÖÆ·B¬Ü“Šųwr0 ĒćŃétSDŚķvū|¾X,f2™*++eŅÖ·‡zoŸ’'BČĀ'¶ż»”<<‚ Ģ2E£V8¶Z­f³YI‡ćøžž£Ń(IRJ>0 Rs±,ėt:±ž fū½ÕĆ0¢(:µƒI XF£Ńb±dĄ±’æ’HÉ+Ś(‘&„477;Ž‘‘‘)īueeeIIÉĮƒ=LŠšæjsžć;!ćg]_ER¢Ó6›­­­MÅß I’ŁlfY¶¶¶Va ŗ¢(ŚķvZ)žēĆįšüušāp8DQä8C€? fszč”Ƈ;Ž’„ēy—ĖE}ń ”pblč«~’ņĄÖ7ņ/—ƒŃ‡N§kii™ń v»]§Ó544ȧ”ouæJ¾¼ž€éēłė’vžŸfµZƒĮ Ėåš=ò¬^ÆWäŽ+‡ĆŃÜÜl4SÕh€źÜ¹sI·üi pĒz®ž„Ķfóz½™Y–&„ÜöBņ–®•‰HBJJJ~õ«_ķŻ»÷~oŠh4rkčü•›ćƜ?ńPmjŸ®ĀjµjµŚÖo÷Õ]BHā7Žć,‹ÅbIÜ’žÆ?żÅBȂekåc4ŗ}ædŃh4”••ÉŖ”󖭍3%H’ÄqÜ,«įp˜¾G‘‡eYI’h÷IÉaQµZ-œi6Œ ‚`µZxžgY–n@˘3-C¢ŃhCCĆ®]»¦,NĒ%üąĮƒƒ”ŗŗZń¦čééikk›qsƒ(Št‰:có¹Ģ£×ė†įyŽėõŚl¶¤ĆūtAåŻ @§Į}G‡7ĀH’”įp·l „ƒĮPTT4ż·ķķķ@@§ÓE£QeہeY‹ÅŅŚŚ:cĄÖétJ’¤×ėēæÓJęX­V»Ż^SSc6›é”µ$0īysĮŠŹoÕž:å>†a¦«5=J@OØ”+ŃśBAHā|9Ļó6›ķäɓŲõ ąOƒ©^‘ŁlžE}īž‚Ļē#„̒ޤ   ŗŗŚļ÷ĻW.—Ė`0ø\®éæ¢Gó{zz’8õ—£: “Ž9Y­Öāābt13 ×ėC”Šż\%īžq V!### /¼šĀģoÓét„ŃŃQ5<żWŃh”ę ół|---UUUŖø×‹f»Œ»Ōō!„&¼³X,j;Ģ0 ]cNd•ZÅ`0H„= )x{<€Nƒ9ūŠV«5//ēłé ŗiø;‰@”§ąół4͌;½c±Xggguuusssuuu}}½zĢĀqܞ={čÓ‡].W^^žÕju8ź\1q¹\ēĪ³Z­tŸę,Ńlš.ō”‡ ‡Ć'OžÄM\`°ßø?DO…J’$‡AV>ū½GFFvķŚ„ŃhŚŪŪs®YӷߛÜŪ«l±X0±›ŻüQ\\Œ…g0Ā€øōJ\Ū7¾¾>’Ąā“ ”)M°¶:ų¹GB.®óqo@Āį°Ćį@øū~TWW»\.U“„a–eAĄņźtĖŠM¢( Lt$ĶVAÆķĆ)¬ńł|%%%3.NŗŖ¹¹Y%YM’p¬ !‚  Ó xž7 4„ DzFźźź`Šū9Ž4SL1#‡£µµ•¦*į~'٘¬O«Ś¢įJŒ³@§+**`Šūįt:1ɛō¦÷LkµŚD.: īīm”7`…ŗŗŗŠŠŠX,SĢāRÓ9_ü5˜ĒqF£{Źt$=NCĻOC¤ggppp–œŽ€‡ŪŚŚö6Ļ:›E‘ž~ĢÖŻ6: rīĘ)¬oÄćńŠ[„›››aYŠėõ4Y›ŚrĶUŖ† ƒtN39›³€}dź‚.EÓŻŻ˜Ī#ōĪiœœN—ĖEUGń7OĻNsüųń§Ÿ~š¦Ē>p_Ćóüʍ­V+vw'H]]]SS“Éd‚)ījĘYźoÄl6‹¢H/eYGŚt|ķńĄ‰FĖŹŹ°> ĆD"l%KI’_@§!„Š »(ЇĘ  ~æßįp455Į ĀqœŻn‡NĻI§].W8Ʋ:­^xžßŗu«Õj„q6$Ačm•p¦ē„Ėåā8N¬R'½ŌjµīßæēŖtZ½C'Œõõõ{÷ī­ŖŖ‚)ꄣl®­­EŲfNX­V­V ŠiՁpwŅD£ŃX,VYY‰“ŽIč4!Ńļ¹M’$žēĆį0½Ś6Šiåƒp÷|čėėŪµk§“s [[[±‡y®Šü0‡ĆėõÖÖÖā¼ˆƒ<' w¦ArŠÅé²²2˜"9©ƒńÕ`NÓkBĆ0z½ÉŻtZ±‚ĄqĻóĒ!ćXrŲķö¾¾>d8I–e#‘˲x““ź`0Ȳ,MĀ,o*qovņŚŚZŽćȽ‹zĄ\‰F£„“É„Åé¤q8Z­vH÷öz½Œč“Ņ ™A±qt>twwæšĀ ļ¾ū.L1ƒ˜)& Ēq¢(?~Ül6 ‚€eŠi č”U—ĖÕŚŚŠŻŻóĮē󜜞4Tėt:éöo,˚Ķf:Ż©­­Åb?tä6ńpw8†3Oźėėķv;§ēI8ŽæGG"·óAÆ×Ó¹]ĢŠiópl9™'ŃhT£Ń`q:%c±X, žÉłĻ˲<ϳ,‹\ojū½szI‘ÕjÕėõ˜qϟ?ü°½½Żn·ć𬔠ŒŖI!ÄįpD"Žćč6äĘ8HĆŻĮ`"čā4H¢(Ņy$L‘c>żōÓtö©†Nƒ\Āl6#BŖØÆÆÆÆÆÆØØ€)RE(jkkC‚­łC/«¦š7āŠ-•€øw{Ņ4‰˲8…•*FFFJJJ°Ó;…pg±X8ŽĆT2…PgZH5üi _‘¶Łl4Ü ‘N!ÕÕÕn·¦HķćjµZ%IĀØTįr¹Ž?NąN§†…N™‚pwŹéėė#„h4˜"µX­Ö7āpj»?˲N§s’žż48lrqMØwrīÜ9l¦M9v»½®®®²²¦H-t“#žŲtL€ŒF£^ÆĒį7ƒõéi›ĶFĮšt:ˆF£eeeø#+Mr‚ <é€^ŌAa†ć8Žć°b d–eµZ­ÅbH§ƒ–––ŗŗ:,N§ z :Bß)‡a†aAčééŁæ?‚š§AÖ-ƾDĆŻčHĘn·ŽŽĮsņ, ²RgrbDŒH’“qćʧŸ~Z: ę†(Štw7⁦  Ąd2Į™Ÿ•Bhę,Fʐ$I«ÕŅ;Faö\qo¹ĄqœÅbAø;+Ī“ŻnĒātęq¹\=ō2~gš³LzŽį Óą› –eĆį0½³É$Ńh4œœĪ4Š žĪO§„œ8?Ķó¼ŁlĘrię”§«‡$IŲYĢ06!ܝuźėė÷īŻ;22Sdѱ³Łlˆ¾f½^ yžļééA&pč4ų3$I¢įn,Īe‘‘‘‘ŃŃQæßYY„Ę“°”)‹R-Š¢Ńh¤cB†ą\Vv`YÖb±BœN'¬‘-4M}}},ƒ)²«Óz½wrdw8¢»¬Vk[[[kk+NĄŸV54(½§įīģRPPP]]]WWSdŽćDQ„6ȬA@§UM0“Łl‘H -źėė›šš¢Ń(L‘uĢfs[[‚®Y÷"Z[[é @V«ÉĄ”ÓŖ#ėõśÖÖV»ŻŽeé¬388H§q"K8­V aČ:V«•^_ŻÖÖƲ,°Ė¬Ogn¢źp8ܓ:oYé4öjČŖ9DQä8Ž^·ąO+„»eHAAA]]¤Z&0 Cc­ŲP&čĪ2×ėõˆ’A§•/Ņwːŗŗŗ¦¦&ŲA>„Ćį¶¶¶žžÄZe2s"„š< …öģŁƒ“qYqļōĀó¼ĶfĆ9¹įółb±X €)ä½ģv4łI0¤6®"…N+Š? O9¦¢rC£Ń<ūģ³Ho"Ćym¼ļ@d%Õįp˜ć8†aA@J𠃸wŗƒ ƈ¢ˆp· )))ٵkWuu5L!7h–i䰔ē€ …°*VŽ[`0hoˆtÜžżķĮiśšh4Z__v‘' ĆD"‘¶¶6œŃ’4ī}üųq³Ł,Š"ŗO&AÜ;- ܝ4cC:żw÷DzŃņ”…ßļÅā“<į8Īn·ćś,yN”Ģfs04›Ķ‘H$ B­”Ó9 ŻŻ-Š"ĻóxˆēŖŠćg]·ާ?.X¹)MMŽāŌė“N§Ćⓜ‰_Į²,ŌZnŠcZ6›Ķl6Ć™qļT‚pwņ>ō撏ƞłI*Ņ Vnz`ė —‘&XœĪ¬VėÖ­[щdŪ:@€ćøųm° t:÷ü˜Bž M±Ūķļ¾ū.Œ/gh¶\!gƚz&‘HŽ5t:7 3JQ‘tLž Mńūż@‹Óņ÷ŲZ[[įØÉAjjjčt ćtZÖš<æqćFšæ9Še«ŠNWUUe2™Šņ—ź`0ˆZr&~œš&tĀ[iūČRVŃWčÉ;Åņ–®Ķ|ĒķźL–”¬¬¬¬¬ m‘°,‰DX–E:æœńųÓr„.E‹¢xųša„}÷”ó–®]XłŹ’żÕ ‹ōąą Żnw»Żh‘œ ž“¦9V«õäɓt[™Ćį€`§–¼‰‰ X!9hØĒb±@”ēęC?V½`Łŗ¬¦³³³„„„¢¢¢””A%öæs}`Üóę‚•ßŖżuĪžQq4+‡p¹\{öģŃjµ‚ ąź³Tø÷¼žH!Wšb0****++Ń:9½ģŅétƒĂsű!#8üé,Ÿ*ņ<}.9”ŠŖ%§żiBH04 „“'OĀ?Ėč5*ĒѤ(ˆˆĄŸĪ44Üm4%I‚HēB¶““˜L&löĪ!če—ōX#W ÉOzzzzzzX–Å8 Ī4tļ¢:Sś«Čmļ?K’DnÉӇīėėóūż::s3c!ē`YöܹsN§Óįp„Ćazƒ5Ģ’Ųļ=čŗ Ļó­­­;&+ōųŁĆ_µ=9~ÖEn}½—[fnNWZZŠÅéćtV.J5MĀqÜʍ1fŸĪĤ>īĘx‘+>ōdńĪ]†ńz½^Æ×étҌ• W‡Ćz½Žėõā°t:ķŠ‡ ”›\ThBˆĻēėģ쬬¬„TēØgf±Xč¾$X#ēęX‚ šMSd@­ Ķ*Jē܇C;ĖŖ³įiø;‘ū¤iŠ®ŪŽ—¹HĻ0+\•·tķ‚ekÕ&ĻqÜnw 0 jÖi5tg«ÕjµZqß„"1›Ķ„§ÓŁÖÖ&‚ 3P©T§9Ž3‰ˆōįßßś×Ē—uó WĖŗb,^PøŠ,Zž·xYNÜ nt:Żčč(§• ŻĢóĮ¹öįߓ[cdvcå0„ԃÕje†Ŗ5P z½ŽėõŖa±Cłž4Ēq‹Åb±$›»B‘ūīnpčāt4…)Tåf‰¢ˆŪ–TĆ0’$2–eÕy­  `eZµčõz$U3ŠLó¾ķ @§ ÓČ yžƒ0Ädž\|īÉÅÄē÷_ų䆏SZZš¦ū$¢Ńč‡~ˆ—9Ļ>ūlš« ‚@/²…eŁōĘĘxłcµZŅ;*Ąd¶iŸÜ®õū|’ņIŸ²uŗ»»»½½-.sŅ÷ø\®žžXXĪ<żōÓiŅiQ÷ļß ē€?M’W·ū•¬Å-½:TU³£hE–k—-÷ņ‡ā5ė·g·$įė×Ī÷NßēĒb1BHńšõÅkÖˤ¦[¶?—õGńTׄ O1ĖĪnI¼žS‘Ļ?K÷·Č”ÓŃī_Z¾©¬|svKāėļõ÷ŸŃ=ŗŹdޑݒŒ uwK÷·Č”¦„ö#oB‰f|'ėō«Y·ŽÆæwōźÉ¼#ėµ$š6 ž”xĶśożMvKŗt!­:M)^³>ėźÆ©|tŚX¹%ėÓ—Š„ Ši9t:ŚżĖŹ7g,:rČßF·bUÖKāėļĶ„NĖ ¦“tJ4õQ$ŲGČč4t€N: @§tP­NGĒ"„‘į˳¼gdųņą€oņßų'IHI¢c_ļ”’¤¼07oÄčé‹’„¾9|żZ=.ņ©i¼sśXśę”Ū<‰ Ņ7Ļɒ2ö»čX„¾˜Žß'æ3‘NšīA “%™l–Y†Ē“–$“MŸi’’dś¶¹>µĻaŅ247®ę;„·ŠŽyōķū½ĒÕš’ćł­Ķ /Ó®[]śp`Ąß~äŠĮ—-)“‹«į%ļČšåY>Ö-“æ°é/Ū¢„—)U%ńzNŃ4“ļ¾Ž0ż·žžEśŪɄ.]ųł«?!„mn:{ņw¹ŅKåSÓšõkG››!Gß¹šņŪ£ĶMō·ÓK8r%tŖėƒß¼s8…fyėgjœé<ÕõĮæqśŸPkč“Cø…öö#‡!Žē·ĪŲßćųś{_Ųō—„½¶šY†‹ł0y8ŠŽEš^žįŒÓ… ”dŠYŽ}½Į-Ģ|½MšĘƬ4}"¤©¾#ƗlfśųŻo0ŸÜ “éćOBśžĆū™.>f&'CsŠi»K·bUA”¶żČ›÷ĖŪ>8ąėī8f?šVóoO–¬+ši–––oöõ÷¦0Õ{t,ŅŻq¬Ņ“}–’BZŽŲ÷ģ‹?>ŲŚQ½ó'„Į„i›ÆæW³¤°Ņ“=U…9{ņwkßõzN­,~p±&‘?łōJØxĶśkB—.lØÜ’+U>5„% _ævńü'kßM°$ß^“øxĶśŌ–ä¢÷cfŁĆ.Öœźś ńżōJh­ń»”KŪšD‚–” Gß©4mw ķ†u„…Ś)ż}ņ;žŅņM…Z’™t\ó0e8Š}éėž(>šMöTŅ]’éféėžČ×fŠ+O‡ĒtŒ‡YiśDž$}õķ<śv„iŪČšå¾ī®ū ę“[!0ąÆ4m÷÷÷VTmK°š)”E_’™¾īīŁ$šƒN»;Ž••oöõ÷ƾˆL铓MC‰½æ’LEÕvŚCŖjRÖNŻĒJĖ7EĒ"}Ż]„å›īcšŽŲc“ įļļ­ŖŁA’›Ŗ’|z%42|¹xĶśó}§æ³!t醊§B—.­XżČŹāœč„²Ŗ©·ļt%Y»į :c0V<•Ś’„.]øłå+ų镩ƒ÷f ),Iš.śĖŹ7Ó”`zŸŅM5;|ż½†µ„÷.ęåŽżłpT“bu§’šÉ\GŻ—]ß"c%™n––’įhz‹žj×÷æøčOėx˜•¦O„ōÕ·»ćXiłfśßūśi“ZA³DKŸSŖĶžˆ,:šŽj9ńó‘”Du::éėžØ“|³ĒŻeXWJ’Åćīj?r(k¾<2ļĪżżg ėJ§ōwŗJ‹Šč_`Ąo2×yÜ]Õ;œņ’LŽ&ƒzQ¾ž^Ś÷ÓZ’éf”Ā@Mįļ?ūb,0ą§»dŅ4f¾éiø…v·ŠN‡śĮ5ždEHS}=ī®Ųceå›=īJ֕NV*CŌŚ“čl²n÷+ѱČčšP #©3>‡ń/%÷vGEĒ"ń"%-C ējš_#„ÖŽ ztwšk–:žÆŖŪżJŻīWżż½žž^BHū‘C¦šE+V×’ō@ŃŠÕ„Ņ”^ÖŌ*j£cZ¤Į_ū‘Ce四÷½ŌłŽŪ[;FÆ^v Ēčć52|¹äµ2Ż£«źz€boś-RJŲ²ż¹knވķūå{tD>ŚÜōąbMńšõ#WBtģ¦CöȕPßÉß½“’0!d§½²”rK®8Ó²Ŗińšõū~łŽĶ±]’ó`<ŗtĮX¹edų2U¾OƄ>|ļo/Z|Ŗėƒö†ā5ėæ÷ƒéeŅ©½Ŗ’Z£hÅjŖżŸ^ mnZ»į‰-¾łå śž£ĶMÅkÖ’›ų"Ÿ¶eūsmxā‘•Å7oÄØqrˆŗŻÆNīwn”}r½:äėļ.ś«jv4µ „“yG:\ŲéĆ!¤Įf®ŪżŠīŃUńR֖źvÆNwI¦˜…ŅņĘ>BHżOÄG!MaaYkGšĘĆĢ7=!ä ż‡š%ZĶķčÕ”ŗŻÆ¶¼±/66F1¬+u<_µ·¹­Ņ“=Mõ--ßÜéæ‹4’öä]ƒæ¾O·bUĆ/ž™Žžž3Ķæ=I[į`kGEÕ¶’ueѱ}Ņśŗ…cŻĒŚ’’Øė|ŠnłÕ™’źī8Ö~äĶN’µ¤e(QŽw†ų‹ųt öÅ˜ĒżQŻīWMęŗŃ«CķGŽ<ŲŚAE;F uqrā%)YWFæQ÷čŖę}/GĒ"%ėŹź_;Š`3׿v€FiāeHm_„£sÜ?;ńŪ÷n~y#®”GVWļüIųśµ_6ī¹xžcåśžiYÕtJI¼žSēūN’żžĆT†ćüķ.ǃ‹5ożĢįõœ*^³ž–aŹ{RR’É/~óĪįµžˆw’<’ !ä™ēwÆYóĖ^Ļ©-۟£%yp±&·V¦§÷»)ż½żČ!’™ŠŖmtMߖ&iœ>ř> „µ$ÓĶgś(”¦ń0óM?8ąó÷ŸłÕ™’š\ėĄEü_ZŽŲWiŚž™ńŸRZ¾)¾ģļ?3e1”#žL¦õ9,+ßüį{ļŒ _.Z±š.µLžŅ¤e(ē§‹V¬Š/Ąd݊ÕōqÉZpøļōō/uąØBD>’Œ(łŌō|ßéĒ6<1E€¹·ÓYöpĘJŗt!ņłg³˜E1­? õ?=[]4SFZŗYRV¾iōźP:Ž?ŻJÓöŃ«C4ōøčOmp{®%”žō½’lKÉĒ&ÆÓѱHū‘CõĻ|§żČ›YbÜB»ż[éNżlA—BsĖKV@M'ƗĆ,Y'E0WJ֕UÕģ8ųņg<~–y‰†+āūʲŗ¬PZ¾ipĄϳOMI’×éę}/yÜ5µ u»_ÉīCÓyōķ–7öÕæv ˦ąhz«¢j{ó¾—ć»w³Kił&_Æææ÷~'€29iš÷ŸIķŒ!I¾L7ŃÉaśÜyōķŖšeŁŽš”]ŗœLŹ“„`dUSķŅåņ)‰JīIõ6ŗ]k:š%…VĒĄE’ą€?ėBPZ¾9pŃOOķ§ź3“ŌéŃ«C„<¢FÆÉaIŒYö°véņ‹ē?Q|’”UM‹×¬—OI!jx ”¬+„Z@”ū½ !žž^Ķ’ĀōmÜ»Ÿ:śūόUTmĖ®MčDĮ-«¬JŁ2y’:mX[Jńø»¢czö ‹֖ŅcjiJ ˜8ĻüąÅó}§é±ŻųÉ]E"ŸšnŁžÜĶ/oüĖ;‡C—.L>?•éĖ_qß?ńŪ÷¼žS½ēVęv%AG§Ī£og=‡6-‰[86cBÓ܅ž“öø»Ü±g_¼{*=pŃOS»…cU™ŽÉUV¾Y³¤pōźå Ļf¤¢j[ࢠüé‚B­żĄ/śŗ?r<æµn÷+ńé]•łå{Ó/bcc»¾’ŹŖm„å›h¼E³¤0ž:c¬5~w§½!|żZß½TĻÅkÖÓpč”×¹Ž|jŹ,{x×kMĢŅå§ŗ> G–‹V¬Ž/ĒL~‰éĖó;ŸłĮ‹ĻB½jķŅåń榓_+†Éż=+}’Ļ=ŖMŗGWBčÉ]OwW ÓųĻUž©Bj÷6·Ńœ¦Jj÷Ų‘čX¤ó½·«wžd×kMńZ»;Žķśž„å›é)į SU³cr’Æx+dŖDńĆü»Ę¤’Ņd®£Yśčė钘ĮŲKYüĄ{üŪ㇪3Lńšõ“‡ćɹ,r.ÆE®Ō”Yöš3Ļļœ,–3¾Ī ĘŹ-Ę{‰¾™eĒ_OžwÅ0eČ|ߟĢäž^½ó')L;8WāŅE' Y<&”¾!·äµ©n«¦°0+CīŒfŸžc¶śEJŗīŸä t/ aóĮT³F€N«Nguk‚āAÜ€N: @§ Ó€N: (…»yNöŚj²^z¹MĖėū4……Ł-É.ćŲ_‰·ļō‰@–ļ¾y#–ońzNeżĪxM67ɤoœx’胋5Ł-ƧWBų9t:ŚżŻĀ1_ovK2:ndųrÖWø)ѱˆÆæ7:Q|ėĖŖ¦ŠT¢)±Ė^[MƒĶL=ōģvQWĆKŽē«2,śFµ8ÕõĮ»Æ7ČgW”jźõœ¢%ÉzG ]ŗp“¹éhsÓł¾ÓŹ~äÓé¢c‘ö#‡Ļo„ŌģāŚiIdµĢ©ģš*X‰ę«Óƒ¾ƒ/’P&aĒó[ !†µ„Y/Iē{ļ„.]OW 5ķ;ł»S]¬ŻšDÖKņ镩æ¼sX ­/«N×¼ļ%_o© ƢΣo·y³¢j›ņ»æljŖl%šÆNė]ķz’dŻīWå`¦VĮŃōVÖ7ÓB¶ln§½!뻐TUÓµžŲõZÓZćw³^féņ]Æ5mŁžœtZ>®n÷+[;JÖeĘPQµĶõžÉJÓvÅ·¾|jŖl%Z8Ļæ/(ŌjeņŠ”¬+“IIŌ Šr«)³ģa™”äĮڬ¼Va§“OIŠV¬VIė˧¦ŹV"ä#ä t€N: @§ Ó€N`n,LÕuśårߥĮÖ™”dĖöēT’”J>5-^³~ß/ߓ‰YäSõtŗŗŻÆŹ$)UYłfłŒŠź©©"•ž4 _ Ótsēīśō^[M֋šBZ^ߗõ»wvĒžĀH¼}§O>ÉnInވeą[¼žS”KdRSłÜŲ}āż£YæNćÓ+” |‹:ķžnᘯæ7»%¢åÉśØˌåå0žC‰ī÷(B‡B!’™““®U]®%FmäśµŠ„r°‰F“.µŠét„ČēŸE>’L&@Ög qF†/ˤ$é{†‘I§»Ūõ®^’CIb_ŒÉgTLkėĖŖ¦P¢éčõś¼@  X˜ĢŹŃć+G…Ļ“•×µ•r(Į`(((HӇĘb14ŗlŃh4%%%I’łėćž7¬ØüVķÆ§’6K’#Ė–e© ¦I’Āį0Œ,g8Ž[Ø×ėõz=l1™ń³ēĘGI‘N÷čceŠÆģ|4(Ą£ā8vPó$F?ŲG@§ Ó€NŠi@§ Ó€NŠi0‰¼åBī\æS€œēO7` ÓŠÓé%+ !c—a ėŠé&z ÓJ1ŹĆ’|«Œy{ØÖ¹ĖğnܹŅKY°¢Ö:­(²?"„ܾŌ1°!ČYn’±Œ™·de~É÷a  ÓŠ"ßų£¼%+ɗ×Ē=‡ Õ ÷žļ;WĪBųėŸĆä.y°ĀŒÜ¹ö‡[Ēw[cdį¢|Ć÷¬Üœ·x9ĢrąŃżō?n_źœ"„<`śyžśæ…M€N+VŖ’侇‰ĻžS€Üć[…<õ3ˆ4ŠiåsūĀonžø8S€ÜčÕĖĻ/y&ßų£¼oka  ÓH’pÄŠ7•”IEND®B`‚apache-couchdb-1.6.0/share/doc/build/html/_images/views-intro-04.png0000644000175000001440000003431112332105522025053 0ustar00djcusers00000000000000‰PNG  IHDRI.ū pHYsgŸŅR cHRMz%€ƒł’€éu0ź`:˜o’_ÅF8OIDATxŚģOL›ē–’ŸŽ_#¶»Œ@€É),^Ėn~²Āŋ#õN"æU»Ą£&ŲRŚHH Ī"é ŕB”Å¼¤šH6—jĢāŽņšJ‰:޳0“ČšÖČļĀ‘ę‡HŠE°éīņ[œä×’bü÷µżż,ZpŒż¼ēœēœēœēßGoß¾e Ž<Ļ' ˆ€r”V«EQ4›ĶEšˆ Ncå%‘HČ”18Ō/¶ń¶ń› ó8ŽłYļü}Ī8xĒķk˜‡Š„‚Sž1¶"żÖ`šjHóƒWAŽ ¶ˆmb€Ų± @lŪÄ6± b€Ų ¶ˆmbÄ6± @lŪÄ6ˆmb€Ų ¶ˆmŪÄ6± @lŪ ¶ˆmb€Ų ¶@lƒ ¶ˆmb€Ų ¶@lŪ€šŃŪ·o!…ŗĆår}÷ŻwååÖ­[.— r@Ž(ŽAżĀuFSĆ&ÖI‡õįŻ)ł×UŃ»*z'Ö\²L|14Ā\½Œ1łĶō·©ļ\YZx±śä0™Čü“hdŅa݈FŅ^xwźįŻ)śŠŻķ͇w§Ø…•xö“OūźBZ›öģōkÖw–‘“oɔ’a21sķŅwR˜ŗšæĮy”µ²“p˜LäŅ>©†ÄEIū“ŠZ`žö¤žɁž%Wó^¬>‘•UMŪˆm ²H”µĖŗmw{S ­qFÓ ’Ó¾Ó\®?¹sm¬½«{Eśķ¬åc,ZkļģŁˆF¤Š½"ćŸåŒ¦Ÿ~\Čü“£ƒ¤Z;:H¦½žŅ’ōT?G·‡ttõ ó£– ŗL$öJjļģ‘/^IūźBZ›öģœŃdæ™õedogė(™“ßlļģÉ*’G÷¦cQéßמēņ··ó78—²6¢‘G÷¦é¶t”E„£ƒDGWß·¬3šH€GÉäŽĪVÕ,0O{R’Éļ[nļģ>L&¼ó³i+37}Õ;æś¶Ū@ÅéėēNõėcR(xÖr¾£«G G.^É5LŽŪٶŽ2ĘZUjś«‘‹ßH”5‹u”^‘S„öĪžV•zU\¾PHKv·7ü- Ž\ü†1vŖ_××ĻUīŁ;ŗŗÉ!f~ua~łwĻŽŃÕSė7[T*Ń”Kž/żOĪZĪ·ŖŌ©źČŚą\Ź:ÕÆ›q‹ė»x3é°FBA9:Ž\¼²““©†/“ŖŌ:£©E„ŖšfFėŌö¤e¢:£é„’I_?—) bĘ-Ņ ś¶Ū@•xįJn¢ÆŸ“—H(˜Z›¢Œ¤å½§ŲˆFŚ»ŗOõė"”`Śż×/üO9ć`$ÜŪŁ’=žīöfZ½.õ•—ž§äŃbQ)×@»BdżźĆdBö陭ĶóģU#kŽ’i®ü0™ –®,9vīķl„ę.R(h±ŽJ”µJÖ‚nD%Ī8ńĶ&%öJźčź>֟¤ē‘źSc/VŸŌ‹KmiSÕKk‹&—²”¦‹¾~.³öH«B2Ė­łJg4Å¢ŅŽĪ¦I€ŲÖ““wvļno1ʤĀf5&Ö;×Ęry(Ī8čææ»½y˜L”„ÄTQF.^ńū–É„ÖE 8.y”•ir,©&ŃČīöęīöf,*É”H ­ŃlŁ ’“³æ_  Gø“łŪÉMtÄLĆL¦‚r=M„müĘÜōµXT*°&‹Jņŗó,ĪtīÆīM;æjiSO>XTü³ßdŒĶM]=:H\žöv{Ć­ ĻÆ¬T:ŗz>ūźļül$œzš×ŖµP ­­,-$Ø0.Z9$O>øöD-mŖüA«U„F5 ¶5;üķ¬åĀŽĪę©~ķxeŒéŒ¦é·¬£ģ£ƒdžż¼­*µsę{ƾ—_‘?'×gÖ<¼„z…·6•Ōꧬ“?üś/3“W½Ź©sę>¼ö®īɹæĘ^I™EÅH(XČvr:p ׯ iAM²ytw:ķõŌ€$ļżą(;sCXé”eBVÅå2ō^ųéõ„g]„Ü6PFeŃ=%V,óX`V›Ģ:[Vų” ±=€¼ T:—Øō•œq°‡0 󣕛¹üķķņ.÷ēŒ&Ŗ^x†}qX¬£“7‹īØ­²ä‹hZ®Vx˜LĢøÅņīOÆØķÄ6PYʵ`¬ĄōN![”ļčź©Āń„Kzūö-¤ņ6F‡=  œNg8ŽĒć ¦5­Vk0DQl0S“Ūķ.—Ė`0Y¢{Ä6P įpŲl6 ‚€Į,PĒét«"€ņ‚u’ '<Ļ'‰@ АOg·Ū,MMqAØhķ®†‚H$xžGČŪĄ±c£–"å”ō“O>Q«ÕU›¶¬&ńx¼ÆÆ1öę͛ƫŻķļļ;NA4M<×jµč°y(ČļkµZĒc05³aŒéõz³ŁÜ¦Õjõz½ÕjmČČ­Ńh<F£±Ūķƒ!£Ļäm  Ļųśõk½^Æ”ŒĮ`X__·Z­ ¶j oe†V Š¢hµZuš1¶ææĻó¼Ēćilm6ü" @ 066Fzl¼Å®y(“*²œ¾(ŠŸžyĆ'¦&‘HüśėÆ æžŠn·‹¢ˆ•“yȂÓéL$MR‡ląÉ6žēõz}CN¹„eįįp8‘Hø\.ōb€¼ ü/“Ų,ułdź+¼‘éŹ +d·5;įpŲ`0ŲķvyłYĆ?ÆŻnoąŁÄT<O5g«dŗŒ1³Łl6›žybų0.—«yJ‘Œ1Q~N‘Įēó5Ļ2Āx<¾¾¾ŽĄWb(ČŠŠ~ll¬Iņć÷öö6üdASnMR£Óh4@`bbĀårķļļ#{kr0ßÖ¤4ĻŖHŠlģļļÓŲ%`ī yh.覚p8ÜTĆ[Q阯ęyä@ `·Ū›jžžž>'1nkfp[ӏĒ5 ­‡t:M5°„É6FÓ$5IÄ,..Ņ­7MņČZ­6Šu4tCö†¼ 48“*’Ö’¹\®fėóF­V7Õņf³¹···ŁMG”Rq+'›Ģ·5N§snnNÆ×c*4ĆHĪl6'‰ĒćNœfć’`3“°ææ’÷撝zųæżŪæ5a`ayy¹æææŁž=ß½{÷ļ’{S=ų?žć?žó?’óĄĄĄčč(­ ž‡ųøäm ”VŽŃ±ńM8„įśõėĶ|^>%p4‡rE“€ł¶¦ ¬ÆÆ7¹“Z­Z­nžU$2f³Y­VćĻõõõ¦Z"‹¼ y[ƒglńxÜ`0ˆ¢ŲT‹åHKŻāń8Ļótõ.²7Ä6P߁Ķl6Ēćq\’įt:µZ-›Ł„ĒAŠjµN§³É#Š“Mj’ J‘2ēśõėM{ƒe8ž››Ć^f9ŅćNł†{·6c£ ĢćĒQŠŒĒćf³™öö5§0åF šr£*½ŁlFöÖØ &٘ „Hņēń‡ćܹsX]ŅØ &Ł€ ™†Żn§S*š|Ä#B“Ļ·„&pjµš˜@ČŪ@ųÆ@ ĄóĘX“›:äM¹Q•² w†4<˜okØĄf6››s{r~ōz=¦š“ZmooÆĮ`ˆĒćE5ö¾8966†…6ˆm@¹óx<Ž%™>‹ād ²"Š"B~ƒł¶ÉŲDQ¤ź ֏¤ūWSķD»ŻQČŲķöĒ­V ;i$0ßÖ‹J‘n·n+s<žłēŸ÷öö"ey×į?śˆ1‹Å£¤AWd 8Ł0 &ٱJ‘Hײ¢×ė±R@ĘjµĘćqÜg– uŗ‰›Ž·G5Z)Æų‚L(%˧ŻÜ%zómuŲĢfóēŸ.‚Į`@`Ė$ŪķvlĪMĆćńš<Ō-žē5Óét8ˆmˆm –4ē„-A€(RĮēó!äēB.NBˆm CoFƒU‘¤··[żŅ0›Ķz½rȅ¼r’:R§`¾­.ūŽāāāÄÄ2*ŻŃ°ryØūūūT-A:’Ÿ@ ąt:QyĖ%»ŻŽ²Ū\± T¹łųńct¼ŹjnnNEˆ"Aų?˜·={öĢćńŠžw± TŖ§Ńņ-Fƒ¤ķƒhµZµZ Ae…ēłŽŽ^Č”ĄŌĶl6_æ~+'Ū@Å;ų .—‹¶I@YĒIńx÷Ż…Ų*Ż=ęńxž={†Įc!x<§Ó‰s¶ņ@ó‘ØŁ8@q± ”æ_]æ~]®@ Žęęę0Ÿ”?¶a>²pR‹“X6‰ŲŹŖ"Ē“m„ēy\‡„nŲĄ`›rq¹\N§S£Ń„ĆalŠ@ Š5oįp˜Ntƒ@ŪĄń }£z½›Šh4ZP iäwÓt)|ōqåf0‰n•R2ØI*Ō@Š@„ėׯc!É”)7,Ž8.Z­ånäm ˜xf·Ū J‘E°ææOg’ćœūBd„ÕjĶf3V”uO'Ū@”mnnN­VĆ5 pPœT2ØI* JŌP&*ep@Ū!ŠS7APś.'‘·‚œ2•"i!RÜ8ŗÆÆ1öęĶ,$)„p8üÉ'Ÿ NP¢ mzCö¦N@JĄårĶĶĶy<¶Ńėõ­š:Aoo/FT%Ź0;śį ± ü/äVA€S.QŒŲ2QD² !”ŽĘĘĘDQÄā/倚dńx<ƒē²Ąó<Ļó8 :Ŗ”öŗA%Ž“Z-Š“ˆm€y<*eüśėÆń•H źķķE"rÜŲöńĒ3Ęb±FWe1BĘŲćĒ±Ģ¤¶`d-1 jµzll ­,>ZÆ×ć8éć¢ŃhĪ;§×ė!ŠŅ1›Ķccc8Øy[Sglģż5Zč4(N"okŽĄęp8G8F`+—7”ćH Š¢m5“r”ÕjEQ¤>Ž3_jÖIÖ*Eņ<Rd¹EqqqmĖåzżśµ(Šˆpeēł±±±p8 ƒDlk–Ń1cĢn·#c+/¦··~¤_Œ¬·ģ}_£ŃČĒ2@&ÕómUĶ->’üsĘŲ³gĻą…h’ēp8Ōju @x«&˜o«f³YÆ×!°•—@ ąt:‘v”.FZÜQ”»Ż>66¦ÕjQ§AlḵŻ Ø, Ź›ĻĶĶaҾDAX\\„+Ńż'qnb[Cy^‡ĆAĒEāH­J ŃhŌj5²įŅė ½½½0Ń ™Ø sssf³™quĄ|[Å”Å{ņIįų€¼­ŽA)²jBĘXø,`ę²¢©łżż}žēQœ¬4ŲP)ØÉ3 8› ¢±ķłóēr¹ŒvnnŪ+ŽcN§ÓēólBŽV—Č«"įs+ķ/0ŁV.xžĒYˆ•F½^Ļó<ä\Q0ßV‘LBZi²BÅIA°ļ y[ĒNēśś:nĆŖ.—KL¶•Ż€1=\œNēóēϱry[Ż@EHx‡* Õj_æ~s^Ź£qīÜ9¬(©Bކ•“ČŪź:•n1†±V:u­Œ˜ĶfµZrzŠh4įpŲćńŠ¢¬œDަDāńøĮ`H$cccl€ĀįyŽēó©Õźżż}Hy›²Šjµ<ĻėõzL³U §Ó)ÜAŁŁßßĮårAÕĮćńĄu oSįp˜œ,;UŁ’~üńnj±7oŽ €Vv“žä“OFŌDņ<Ļ‹¢g‚ŲV{«Õj‰„ÕjÅ!³Õ$Ó-š˜„ØĘl6ćŌ*c6›Ÿ?ŽQb›Rź ŲĶ(ĖXŁl6Ó]¦F‰`¾­ųź-m¢K“ŲŖ ĻóX³SQ'+‚Óé„(Ŗœ.“K “č2AŽV+D)²† LU:¶a:³† †õõuģ2DŽVčP8¤5!Ó‰|Eå†nz½^Æ×cōPVN"o«vʀ…L€ź€é|ämU‚ēł×Æ_c¢†ģļļŪķv”‚«ćX‘×:œZ@ŽV¼ĶétŠ¢ˆaT ®ĆįŠėõXż_ip\§ EČŪ*kaĘćń Ōj‹F£éķķÅ"é*@wbŹ­† :Ļœt¼­"Xä €ź#Ÿćj‘·•Q±W! “Óé„"Ŗiłv»ŒÕFĪ;‡•“ˆmå.”©<ĻÜ܆®UC„ÅÅE &jŽģ‚ģv;Š“ˆm„B«"1VRŌV­VcŁX5»@oo/ä āńø(ŠėėėXŖżA0ߖp8ģr¹pb,N ±­īĮ]ļŹDÅ@ ąt:µZ-¤Q5€(Š<Ļc'€¢ “l1W’ Ō$³@ū%EQÄŗ¢ É6ģŚ®žbW(N"¶;ccŒ ‚`µZņ„É¶źc6›Õj5’E”Õj€Õj„«ē±“$Ō$ŲPŠŌ×bŒ”8‰¼-'(E*AA€jjB<w:ó)3¶Åćńõõuh±-»}0”"Ū®_æŽsaj¦Ü ''&&œN'*“© &ł.©×h48YÉš<ļół`®µŹŪ ƒŁlFxSøƔŠĢ ˆ@„õõuŗÄ±MÉ©„PĆä9ņĒTœ4›Ķ8I¼Łó6ź®ĘétŅI60eār¹č“! >jč:ixEēJ’Z9‰žŅ¼± ė‹źHSü1c,‹a*“†~óóĻ?ļķķÅr…CW¾™Ķę&/N6ļZĒ³¾¾N‰<śƒĀc›^Æ×ėõl5„ēyµZŚF]dŲÆ_æĘ ×͘·” hģ;cŒ.'jŚaÓÅ6”"ė»ŻŽéq…ōĒ³ææļr¹ å‡Ķf3ĻóĶYœlŗŲFÓjµ: c«‹žłÉ'ŸŠ*VH£¶Äćń¾¾>ĘŲ›7o0.¬_Ēūõ×_›Š×h¶ĪÉó¼Ūķ6 lõ’+`¦M!hµZ½^OJAlS>äėcƒ” ‹“M”·ŁķvZ#‹Øhš³8Ł,ė$Ąāā"¬¼ī’6»ŻŽs…ĒćĮÜgŻÅ¶D"Ńl'å6EŽFłøĒćA)²¾  ½^c$•ƒF£I$Ķ9…S×#ņ~įpøI×8y[®! ­ņ‡ĆXī_ōööāŗgEĮó¼^ÆĒ®Šś‚¼ŸĒćłä“O²¦Żw \ćäm¤°“ś­²cŒ=~üwZš<{s8jµ:§.-”Qv»½‘Tkœ¼fŌR‡$”}»Żn·ŪĄ¦|҆įpŲét6łŁ ŹDE»ŻŽ]õ˜øŻnŗĘK®óS`[__o“¾ö¶!ˆÅbņ½}ūvllŒ1ęv»ß‚:ÖŗuėÖÆæžśöķŪ[·nÉŚJӔܹž={611”×딩:‚öŒ½y󆓣Hį€8Ń0IłēÅÅÅx<ŽÕu‡Łlž››[__’ī»ļŌjµü"$£4xž___w¹\N§3‘HŠ‹ø īX\\EQÖ Uæ¦Ē5HM2-›~žü¹V«}üų1+×Wl“N$Ōå‡Łlƒ•š‡].—Į`ųī»ļcÆ_æNu‹…Ō]q’:ZGZ×4ČZZ—œöāŲŲ¶FÕņ]6¹čķķ„©ČŖŹŠ[fKU VNÖW_£9¶“×Ļ;×0į­ņ6Ś™˜5ć6 ˜ń®£Jjé?—Ė…ĄVxžĻæ »k °1ʞ?Ž0Ł±-Ļ@ƒnXGx«ņŌµÜn7*Ģ5ÄćńLLL”8P/ķƒī±MA±Ā› °éŗŽmlJ@š¤Al«_œNgžĄĘ~æ.Æ®i„ł¶>ś(óE½^o6›é„Pt½ ߢ"£V«EQ„ėTTēp8Ņt„ŅH}„ntj|Ś"IŁs6Ęŗ­ŗm@`hhHīcĢĢf3&fź­VūśõkY”ø·AłįĶjµ6Ģ`æŁ‡ĆäRgŚć~¾ŗßßĪ;G! N°0›Ķtc›b”ś°ސU×/t€2ķM¤dŽh€rWÓŻ» ź"'@`«£ģ wÄ6>@<7 lõŽ\.v¶Ä6 o˜.­ö÷÷`n4'DQÄiF '×T"t§|ģv{Ö8ķńxī(§Ó™5l ‚€u”Ź×“„ŠåܹsYŗ†d”Õj…īź”[·ne*ī×_…dźBw'hƒmüFĶ[³*.ļķlY¬£]ݵmI$”BkœqPg4Õ¶%»Ū[~ßrž÷(AwŽłūŒ1%莬H9ŗĖ?Ą‡ī”©;ņY’‰ŚŽŁ=Ģ*DwšŽYuwā}»YséDBĮ½­a~“ę–Ķęg„КĪhŖ¹X"”`±ķ¦Bś˜tGVŻAw„{€<’ŽŽÕ­ŻĮ{gÕ]ćÜ» ˆmŪÄ6± @lŪ ¶ˆmbPŲ&L]ŻŻŽŒ„‚ļNe}ĆĆ»S¹ž)ė;7¢‘‰/†v·7‹hīa21sķcleiaUōųWļNŁžōĒ˟žaŒÉß^x³ o }ųwņįŻ©I‡u#Iū“«OäWEļ¤ĆŹ›tX –RZødm•Ü’TR[E?g}[į¬,-¼X}r˜LЇ¬,-&ĒżŅM(«U“ Fø“ĀŌÕ?”,2)®ĒAŃʖ¦µŅ)EnÅu’*«Æp ~šŪĖā" iĢŖč½üé۟ž˜éŹŲļŠS_š×*\qųąēĘ¢RGWw~6×Aa±WRģ•TH+_śŸžźēč°ÆŽ®ž"¤ć÷-·wv&ŽłŁ³– öźŸ~üaĘ- {Ę‹E„£ƒDGWß·\āŃg™¹sm¬½«{EśMg4I”µ£ƒdڟĢM_„#ąc‘ŠZ{gĻF4"…Ö |–[xtĢŚŖ½­ĢÓ󤊌ŽĪclw{S ­qFÓ ’Ó¾Ó\эńĪĻrFÓO?.ōę6¢‘G÷¦?xÜb%L(«U?ŗ7‹J’¾ö?—æ½]Č'”K&Åõø"(ŚŲRµVz3J”[ŻæŹź;–³ö»²hķXŁŻŽœ›¾6rńŹĆŸ9ÕÆ«\æ+N}©^ėXŠūƇFm?pĘAśÄį %šõŃAb˜·EBĮ‘‹ß=ö×M/żOśś¹VUA·óNõėčż‘ŠŚČÅ+ŃHK›ŗÄ'JkĢF4²·³5leŒµähی[”½§ Ž\üF ­Y¬£>Kĕ‰ žµœļ輑BĮ‘‹WŠĪŚ;{ZUźUqy`ųĀ©~݌[“XG«oBY­ś„’ÉYĖłV•ŗ@)•E&åźq‘Pjł\„±„i­ō§+Qne±ēŠŖ/«W–(_)¢%ŗˆBĢé„’)c,ĻW”Æß•Ŗ¾c)ī&?ŃM~ß2g”óŹH(˜«eV™6¢Źa_śŸRkbQ©č1ČŽĪg4­ž>åJūŽh$õ×£ƒD‹J•*‹uT ­•xEEfchd‘Õv·7SÓüSż:õlD#ķ]ݧśu‘P°B—eäWf«>88 Ń@_?Wōķ…’)g”zgŒéŒ¦4ūNS\¦rK7”\V}tLmL#'¹•E&¶-Se»Ū›©u!)¤ ;%gl™ZĖÕĶ —&„Č-«=hÉio«œś²jš…’ÉŃA⃦^.­bNæOŒŒ±Tū—vū]wt,ƒ,\q'ņÄ䃿öęZTź³–óxW–ZŚŌ{;›·æ—GÉäÄCG‰£ƒÄŒ[¤Äv#¹sm¬„M}tžö¬½³›3Žīno^žövŃc®·Č³ßlļģ¦qå£{Ó}żcģŽŪw˜LL9x*“NÜ~0ĢŪ&VŹ£Gø“3n±ļ4GßŽŅ¦:nҐæ1‘P¾zŹĮsĘAŗuĀ;?{”LĘ^IŸ}õĶ×™”b15•1F œĪhŖÜ­iā’«Li­Jõé_’łĢČÅ+©·f XĪ댦H(X`½.+ĆÖѾ~ŽĢƒ^įNŚĘoŲĘozēg_¬>•ėŪ“s‹dWŃȔƒļėēbQ‰Œ­,&”iÕ#ÜIʘwž¾wžžŠō}o{ē»ž30|ž Ū;{ü¾å鷲Ȥ¶‘]Y¬£±Ø{%‘ŃŅϤ>ļü,U¹Gø“œqšŽŪ' VņYĖłāŒ-Mk™¦®Ę¢ŅÜ<£Ī87}mEśMnöß’{ogkŹĮOÜ~07}mĘ-–(·Ģī?7}­ļ4××Ļł}Ė3nQg4‘6 Č̵K{Ū[äĮgÜbGWO…Ō—Uƒ©.Č6~㳯®Ü™ø‹J-mź–6µÜ%½ó÷žüß]=+K ŽłŁ‡?’Rŗ‹ČlLęY¬£?żųCjœ¹vI [ŚŌœŃDÖ^–~—©>Y2ļ²:é·T÷˜śsq¾(_lėčź”Ų(KÖb„>é°®üø ǶŲ+Ių›’TænŅa}toZ3©^’ŽÜŖR=P’kĮŌžH(HFnŽ£{Ó-*Õ·Œž3šīø}i2¢f ó¶8­1]=3nqŹĮS{hŌߎŁćtOödæ™jņŸ—½$’«…2yZõӏ -mźĻ¾ś]“HV%ąü­Ō±ˆwž>½łĪµ1²ļüģÜōÕį „›PV«^‘~Kņ÷®,-<ŗ7=0|ž]#£ŅQ299·X.™Ņ6™¹’xF*ūģ«oäŸmć7ߏ¢īSPÉo Ē5¶4­ejDg”'M7¢ÅæSż:)lļģīčź”„Ņ;āöƒ¾Óœœ²—nĻ4KDŻ-µāGr QMLÜž¾U„¦Wü¾eŪųĶ ©/«Ó\ŠŹŅB,*Qčr~9Dļłģ«++K Ō¶•„…‘‹WZUźVU©."³1™_D@¶Ÿ•„)|ųó/­*µ\č.KæĖtG²OžtXå”ä[ĒQÜńöČ~ÖJ¤ŽØé– ōŗß·|tLó’eŸL’{‹œ€“5“¤e„ŖA•Īh"÷Ķ”A®VķnozēļOĢ|_”Éæ­–šDu0lžµœ?:HFŖ¢ĶŌļMó)GÉ˹]–i§RTF ؾQeÕ÷~”É“Bk}§ß-7؈J\JĒęG‡y[yķŹļ[niSQ÷ĻōžŽłŁ–65}o«JŻ×ĻEjķ^ųŸpFĶģŹ•ĘV•zäā••„…H(xtØœŪüąÉĶ“­®āY}"…Ö*quųŠ0qaźźŖ˜}…•#”`$䌃õ’R((©iĄxtŒ„Ö¼ó³ŽłYĘXžIįœÆżµ¹ļ“$y¬G’­ĪH%õ{3Qˆp”£‘Ž®žöĪīXT:L&bƤįó”½Å¢’.e‚‡«€Ü6¢y›L“ æo9Õ]®ŠŽ™k—čj‹Z;•­ŁfꦮRŅV¹ä’¢\Ķ«`Šņć‚Å:ZöYĻcĒ6ļüģk—tĘĮkŚÜi%H[Ėžö«mü×ÄžØøp“V°rMõ½Ź'—d8£i#*Å^Iœq3š¤Pš0™ UµŅ•Öåy‡I‡ueé‡aėh…Æš@i„œ7Ą˜)U(i;^l;L&¼ó÷/{{˜·utuēygK›Jž&­-mŖĢ_‡łQš„°ßŌ!¶įo~)“V”]äåP·:R FtĘĮ½M)¤%{;[ņd[MZu˜L¬,-Čī’J^“†/¤®—V“Læ½³{eé‡~QšS­4“˜„B¦rŒŲFÅżölķ8J&Ó 4!WÄZįĀįŒ&y}}iK›źÅź8ā8ÕÆ;k9/o-Æ-4ź§uŪōß¾Ŗ”JR梑¾~N ­ÉsoœqpÕ·\…’‰ĪhŹZcLKŚČkÕ*ŠfćąF¶fÓ2}Ūų æo¹¢n3’„NIV“•NŚŽŪhįęŽö&{?{œöŽļūyB©®Å:ŚŅ¦ztoś0™(ål¤<Œ\¼{%­,-Š`„^ńū–©m5Ÿ4®GF.^ŁŪŁRBź¦3šZŚT“«ō„’i{gwu²š¾Óœü½dZʇ:¦ūNs•č¹4BcŹXT¢_ūNs/żOu¹wS•1ÖŹ+ŒdM„%m²phw]­ęŪŚ;{ö¶·(T讗m“ yÕ5{Ų:zÖr”„Mõӏ•2¼~Ѱu”F*»Ū›ETbŅÖwš£¹Ū²(ė±­£«Ēb›¾6ńÅPZåŚb½smģņ§gö¶·hēA«J=ć’2ųOw®UČżMĪ-®ŠĖ#ÜI2nŪųM‹utnźŖķO¤å$ąø"匃 IŻ&n沓0é°®,-L>X¬Ī—¶ŖŌ—æ½ķæ?ńÅŠ }ŌĪZ.œµœw~iyß nH”µ‰/†Ż.ļR¹4ĀMrV­{—½U#o³XG§<ķ¬„_śŸ$禯p'Gø““ėYĖ…¾ÓœóĖ”)_« ų‘‹ß““©’ešŸ6¢‘ϾŗŅŽŁóõŸĻ8æ’ŪC1†–’Z¬£ÅµZü¢aŽöŁWßܹvé届Š‹J£~ß2iŠv%ŅzWē—C©Ā)ščy6Ēd¶)WŽ K\ÓV¾Ōżjµāżę”©[˜kķ=wī\ Č¢¼>:–ī*Ų{¹“Œ±²ėŽVßė3ɊJŌŻa2±·³yŖ_—ŗļ­ŽtG‡$åZķYŠīŠŠHEuGīˆvˆēy„h„;–øuė–ĖåJū§@ 044D»Ā‹~Ņć¶'æī*dE$„?¼\Ž»t“uwāø™§rµ ģYTMŒ*uēl=R¹é„Zi$’“~p·Oa¾j(­=9°ÄU¾¶\9ĆżmŽ„MņdķK’ÓĖ…ś}–P'¹ąŒƒ©GqeŅҦ⌃U^掐Ä^IŽłŁ©ŠZ{g·müFåNDl –”2§ŖĘ©~4UtF“®Q$‰š$€F± b€Ų ¶ˆmbÄ6 >x·w{Ņa­ySčRƒGw§k~…ąŽöclU\®łE9ņÅxyP‚ī%莬ŗƒīJ÷ł›ŖŻĮ{Kw@Aœ;wīm6 čTŽ[·ne*īŁ³gL]čī]ŽVżóž³Fž£ƒdßiN ‘og«½³»½«Ęg %“tqp” ;)“ĘčbOŒż’ŠtWŗČó†–6Uu.‚/DwšŽYu÷.¶)į46ŗčņ_n+äž¶a~T!÷·åtG÷H)AwdEŠtWŗČó†¾~N9ŗƒ÷ĪŖ;¬%Šh ¶@lŪÄ6± @l€Ų ¶ˆm@µcŪŖčŻŻŽÜŻŽ\YZČõžhD˜ŗ:sķŅīö&cĢ;?ūbõI$|xwŖŒķŽ„‚tXxž=L&ŽštXérØIåjÉīöęŖčeŒ­,-Š#§āŸĶ<Ō|w{óįŻ)śĆ<’,/ŽłYB泯Š^z„Ģ?©„īņXQ$¤vfž ‰—äVCŻUȊŠ0ų•„…I‡5« +ŻĀT[:L&ri¤ -I³„h$—¢«ßć>h`yÄ[‰~—ß Č >L&*Śé %©vUœśžp,=yēļwtõxēļ·“©r5ˆĪж޶“©“ ļüżö®īUqłč YFŃĢM]mļģ^½y>öĪÄ%)“fæI­}±śdog‹ž¢ŒēœŅŁe¤¤Ž®žĢ•2üc,*ł}Ėł%YKŚ"¹e>ūŖoyÕ·œ©ŹJč.æI”`ÖsüV–~ }éš)äjź®BVt\ƒ÷ĪĻzēgG¾ŗ’نJ·0͖榯:æŹśĪJ·$Ķ–V–œ_Z²†·ź÷øB ,— ­ĻĢļē—CsÓW+Śé %©vUœśŽŪü¾eĪh:L&ü¾å³– YßóŅ’äč iæ10|”U„–BĮ¾ÓÜ©~ ó£eĆ2Ę:ŗzV–~°œĻ%>)“6rńŃtŖ_Ē“BkĆÖQ)䌃åRÕa2ńŅ’„3šV–ĪęhIÖö[¬£»Ū›G‰\’,³?ņ-댃/VŸ““© |ö é®+Źrģ•d±ŽFBkelIqŗ«„aš«āņYĖ…į ™GÓVŗ…i¶4rńŹåoogM»+Ż’4[:k9oæA}w{S˜ŗZĆW‚U¤ßč.{{äā•ŹuŗĀ@š]”¾cĶUqYgōū–ūNs­*uÖ÷Šå²ą^ųŸŽ\ü†RĖ2ž½*.sFÓF4{%q9>–ZŅž¾%$—į ‘ŠŚ°µlŖzég(~ßrįųŅ’täā)3SqŒ±ž'ōė ’SzE¾M·B.«āZŚŌ~ß}²)“‹J”ģ’9­¾ā÷œź×utõ“ŖŌĆüØō~>€ź$:£©jSōš²ŚŽ’ŃH«JM„¾~ŽźļÕįѽi‹õ”%`±ŽŅ“%׬֬ŠŽŲ+éņ··©ŒC/öę†/œź×qĘĮž*-’ŪŻŽüéĒlć7Ȑäjƒmü&ŁU5ÅUŗKp]Żr$ŪŪŁšq‹ÕL%³:„•ŖE„Ŗr÷Ļź=eGTĶثw7SwtõČ­jļģęm]=ĆüØ?c=WE°œ§ąAcø‚gĖMFŹ«ŁĖ5!ZŅž¶ĆdbUōFBĮņ®ē)Ž«OØQ«ĘģnoīķlešHÕźū ­QK}±&7ĮӐ(Ӕ«/±zŃ].Ŗ¹°Gßi®„Mõ莓¼ČžŖ_ļ5hb¹÷0TĘfLKv·7)Ł­įX¤½³›¼A,*é ^P©ŲöbõÉ×>yłkČīöęåOϬüøPŪfŠź•Å{ýĶšD²\SBüØ݁ś„U„žq‹/żO¦|jxK„šćrŠ(±Ø$…‚©5ä ĪLQ‰†˜åвÅǶ¹é«#Æ8g¾×Õ.ąīM·wußqūʾVŹÅ©~݌[ÜŪŁ|toZé¾) nD%®Ö>\g”BĮXT*c”-2¶Q²ę!^śŸźŠjC,*)¼ƒéŒ&…4²śu˜z×h€š6rńJęŌŚŽö&c¬ļ4W]³ŒE„Ų«²•KqGÉž§eŒ)EĘ6Ś~”L0ĘhÆ{ iiSQŽæWīƒaŽ‹Å:ŗ²“«ą ,ÖŃ£ƒd5OŹQŚ;»³DŻÕ#-mź£dR!-aŒ)M›‡ļ&-#§į½H³ąU®ĻsFÓŽĪV,*Um?{.Ø@śŅ’¤ŒKZŠŒm§śu}§¹G÷¦iSKͽ’ß·üšīŌjuerłŪŪķ]Ż_’łĢ¤Ćšõ\D%ŠŃÕ3qūw~vā‹”ĖŸž©mc&,Ę¢ŅåOĻL|1”yx#tW_ [GcƤ‰/†jž‹ŸµœoiS9æŹzPjM  _ ½ō?™|°(æ>åą…©«~ßr•÷Ž‘+č;͵wö(aĪū¬å|yk'ŠžKšeŒŁĘoŹ»",ÖŃź*æžĖŒĪhŚŪŁ¢–P^ßwš›q‹UĪń[Uź;nČ@Ė|gÜ¢ˆ· ó¶H(HņIŻ%ZŽ£… ’żē/ŃąŠŽŁ-ŪO•m©^t—Łž*«,sd)«i`ųĀæÆżOģ•T“•÷©]¾£«Ēū_’O¶p%00|3šbÆ¤Ō ”¾~Ī6~S žüß5YĶ11ó m„W+łŒ\¼B'5–«ūŸ(ÅČūidmutõŌDCņVG¹%ņ¦·š$FņĻ©mŠ)cz2³=©žØ&^IžŅTū©‰-՝īj„²T‰„ ­†ż.󫕦µ¬Ā‘wUׄ4ć©”-„RéŻ÷·h4Ū4' Ø>wÜ>y€Ų± @lŪÄ6± bŠX¼Ū»­„ƒĻ÷¶·c«ā²TÓóąct }$dµK!÷)ēŠz%莬ŗƒīJ÷ł›ŖŻĮ{Kw@Aœ;wīm6 åcµZ”»:åÖ­[™Š{öģ$Sŗ;įv»ćń8d”dĢfsÖ×’õ_’uņQ2<ĻCw¤;³Ł|ėÖ-GįŲķö’?Åõå.”^”±IEND®B`‚apache-couchdb-1.6.0/share/doc/build/html/_images/futon-overview.png0000644000175000001440000014317712332105522025356 0ustar00djcusers00000000000000‰PNG  IHDRD8cµ<£gAMA± üa cHRMz&€„ś€ču0ź`:˜pœŗQ<bKGDłC» pHYsÄÄ•+€IDATxŚģŻw|õ’šWV›īt±KĖZ(p°*¢(ˆ€Wq€Ø_Å­?Šśż~(EÅń„8Ą n–%«P6²Ś2KgŗŅ¤mræ?Āiš¤i›6mņz>÷čår÷¹Ļ]“»äĻēżˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆ\Bęī “ńś‘}‚»+`; vy7·LZ2(įŠ}1ˆBDDDDDDŌz55ĄŃb’ę04¤üĘŌ…"""""""÷iLĆŁmš58Ņ\…śŹ•5Ó¶DDDDDDDä>õ1„Fl×,‘ę.Ȱ\ÖĄĒ-Q"""""""r^CƒBžwv? 꼀BCƒ2˜-ĻŻĒLDDDDDDä)š#ˆ`ć9G˜)«É\p¶µ‡£æ 4DZ‘m i"8ųkļ9Góõķßi® "4¤ˆuÄr‚ĒŽźĖ@QĖ«Æk‹½ ˆõ4,@āhßNSŗą4¶%ˆå$·³Ü^ŽöODDDDDDD-ĆQ Ā:ČaBķ@ˆÉjGūY­'sb;‡\±Ō ˆe Dn5o/08nBDDDDDDD-ƙ|!ÖĮ“ż uƒ$–ŪÉģüu‰¦DŪ5Ę:¢°˜·ŽĄāƳłDœyžˆˆˆˆˆˆˆźēLĪ{ S­ƒ!F\ Šˆ1ĖēķķĆVP¤IW·Ł †Ų „XNÖĮ‘†ę!""""""¢–g««Œ8YAäQū{½ųœe`D°XĒ„CīM ˆ83|®å¤@ķ`ˆe@Diń×^PØæū 5Ÿś©Šó–­CÄI „TĆü}ŽhU†‘£vPDäŅV"ĶŃBÄQ²TĖ`ˆeDiõŲŁV"Žź@DDDDDDD®įLŠĮ^W1"~Ēģo79xŽ„­D\±n¹a̰ĪbŁ2DœTØ?(4,0BDDDDDDDĶĒÖ(3¶Z‡Ō\œ¬æē[Ī‹A£UY–IXmķ³Q±×mÅVšĀ:";,"*\ ˆ(­Ö±Œ ŁJ®jė15{ĆķŚ ˆˆėļų–ńq{“U™b®9jBÓän3ĶŻBD<`1‡ˆådQ”nPÄ:ÉŖåÉb+"""""""÷³eĘdń×: Rmµe€0· ±üž/n'F½ėŖ€ˆÜjŽz8]ĖÖÖŻdlMÖĖ!x­“µZb€„ˆˆˆˆˆˆØł5d˜]1°!N"ė^ 2˜ƒ"ÖåŠ#ЈåZ&]m4W·±•7Ä2'ˆ­¼!ö&Ė Š¶““Ś ŠXևˆˆˆˆˆˆˆšĪŃč2֓uė1 aŁ]ĘRǬžo-Dl ‰k ±±†ųąRĖ[ĖĄP7šbY"""""""r-ĮĪ2ė@ˆŲ½Å²…ˆŲĘVĪQqY źö±Ž‡e@¤É V]=ģ®eĀ^®qŽĒāÆŹā±õh3ÖŻo,.Ģ)BDDDDDDŌr,–łB¬[†X·«„9ą”€9ˆõwzĖļūÖ]f¬'—iL@Dfg™øÜ²U‡ukԟ;Ä2 b/(bÆ 5{£ÉXD,ó‡X·kŻŠAKĮėQglµ<±×m¦Į]i\CÄ^ «æu‚ ß»°.DDDDDD.sņäI@QQ‘»«BŌęÉd²©ø”7Ä:·ˆ8o ±ĢCā²V"®ˆXFp,#=õå ±žˆˆˆˆˆˆˆČół¢n‹Ė^–­MŒ6ÖćF'÷g“«"ā_±ļ½n3>“u"""""""ņ|¾Ø;z¬˜LÕ:«W° Ž4yČ] ł‡ŻµĢbÆe"DDDDDDDŽCģ%b=PŠež1bgóˆ4¹ėŒ«ÖĮė"–ėQg!""""""ņ>ó–¹B,!b,Įŗ[M“»Źˆ\ˆŪxl9YDl ĮĖ€‘w°Œˆ%́Ė4–“%—t›‘7µŌīVn±ÜVPÄÖ<"DDDDDDDŽA‰K±Ė^%¶‚!–ƒøX’9µ'\±Užubėī4āŠĪ€‘w°ģE"·š·5śŒ½ H“4µ0™ƒå–Yb­Ȳ•ˆ®ĢQėd™DŒ X÷2lÉk©I­D\=ʌ­æ–Aėæ–ļJ„S¦LĮøqć £Ńˆœœ¬^½«V­‚Éä’Ńyå‹/¾ĄŃ£Gńꫯŗ­DDDDDDDnfŻHØŻ°Ā²…uė&w•5% "³³Ģ2zc=/˜uōĒ%„R‰E‹aĄ€X±b-Z™L†+®øsēĪÅšįĆ1wī\·E/^ŒŅŅR·ģ›ˆˆˆˆˆˆØ•°n b#Į~lĮ^¢QCšŗrŲ]ėy™Éŗ…ˆ­Œ±rļ½÷bšąĮxųᇱ{÷niłöķŪ±gĻ,\øS§NÅņåĖ]tŲ ³mŪ6·ģ—ˆˆˆˆˆˆØ»ĖŲźMbklĒš¤¹rwXGnœ Œ4Ł”)S°~żśZĮѦM›‘‘)S¦–/_Ž7ß|³Ö:o¾ł&¾śź+ó‰‘Ėńąƒ⧟~¶mŪšÓO?įžūļ‡Lvé°vģ؁[n¹Ÿž9Ž’żzĖüā‹/šņĖ/_:łõģć?žĄż÷ß/­?nÜ8ģŚµ &L–ŻsĻ=ųż÷ߛéßHDDDDDDTף³g±{÷n¤§§ćųń㨮®nČęrŲN  Ō v8Ź!4!8Ņ”@„¬žĒ–·7źŒuß FėŅ„ """°uėV»ėlŚ“ ]ŗtAĒŽ±eĖ 8P >Čår <›6m<ōŠCøļ¾ū°xńbŒ?ļ¾ū.’’’šŠCIåÕŌŌąŽ;īĄ–-[šé§ŸÖ[¦µśö±{÷nōė×OZ?>>ēĪC\\œ“,..M=}DDDDDDDõŖ®®ĘįƇqųša”••”ŗŗŁŁŁ8~üxCбÕ*Ä^ kö' ÖŲ@„ĢĮ¼­JŪ: 9dƒDDDņņņģ®sīÜ9iŻ­[·"44Ż»wōźÕ ĮĮĮŲ“iüżżq×]wįĖ/æÄļæ’ŽĀĀB¬[·+V¬ĄŌ©S”P˜SžF`ɒ%ČĢĢtX¦5gö±{÷nōķŪWŚfĄ€X½z5bcc„eqqqŲµkWSO‘C•••8räĪž= h×®:wī ĄÜbd’žżØ¬¬t¦([ %œliTL”9‡»µUa[9\©©©ųłłŁ]GlĀc2™°wļ^”••ašąĮ€!C† ØØ‡BTTüżż±sēĪZŪgdd 88ŃŃŃҲƒJóŽŹ“ęĢ>vļŽČČH“k×AAA茵+V®\‰īŻ»Ćßß:t@dd$"DDDDDDŌ¬Ŗ««±’~\øpƒž={¢gĻžRPäĀ… 8|ų°³Żgģ%MuŁ(2õqå°»õØ­wYS—üü|@ĒŽķ®Ó”Ci]“É„ķŪ·#!!ß|ó † ‚-[¶@©µÉĒl³œššpœ|•••Ųæ?.æürŪ*ÖŽ@,õ­g¹¼ÉZj”[wYėŃ·ß~‹bäȑuž»āŠ+0bÄ|żõ×Ҳ-[¶ $$7Žx#|||¤aq=ŠŖŖ*DGGC«Õ֙Äī9¶Ų+Ӛ³ūóˆ 0ū÷ļ`ˆÄĘĘ"66–ŻeˆˆˆˆˆˆØŁģŲ±„„„šóóC\\œĶ`ˆØsēΈ‹‹ƒŸŸJKKÉ'b/)œXÖdĶŃe¦1IN\rpß~ū-†Š×__żµŒøāŠ+pēwāĻ?’ÄŹ•+„õ qōčQÜ}÷ŻŲ³gŌjC§ÓįūļæĒC=„üü|ģŻ»”””xąąėė‹'Ÿ|Ņnģ•iĶŁ}ģŽ½Ó§O‡Z­–Z›8p?ü0ŲB„ˆˆˆˆˆˆš]\\œ½Öµ“oß*• •••ŽÖÆÆ7I}£Ųŗ„+" ÉųźņÖ!€9‡ĒܹsqĖ-·ąę›oĘ­·Ž A••…×_kÖ¬©ÓÅeĖ–-ø’žū±jÕŖZĖSRRPVV†Ł³g£]»v(++Ć®]»°`Į‚zėaÆLkĪģćčŃ£P©TŠétŅ(9'Nœ€ææ?JKKqśōiWžB"""""""ÉØQ£¼MXXXcvåLK—j̬£2J‹É€/5?ž“ųX|Ž×rJHHx¦¹–ˆˆˆˆˆØ1ÄAŠŠŠÜ]¢6O&“„Š0Xü5ŠØPańWœ×­Pc1€`19­9‡Ż%"""""""r¤ŁÓkŲÓ‘é.CDDDDDDDä,¶!""""""¢Ö¢ÅO0 BDDDDDDD^‡"""""""ņ: ˆ‘×a@„ˆˆˆˆˆˆˆ¼"DDDDDDDäu”ī®9Vsą„’’zד…„@Ū×-ūnUæ>€FćŅ2L«EõĮĆī­C+Š*žnĀ€Q+WńÜ˨ټ„Žõ”Ƈ!dķnŁ·SB4ü „u|×h vj‚1ēŒū¢f’T’ü«»kÖ¢‚^ Õ°«Ü] ·`@„ˆˆˆˆˆˆšĻ“©śOrė†XPĘö5·Ŗ Ø’P§N¹»ZŌZM@d×®]ī®5‚ Ū[ę®m %Ų³;{÷ģvś „ƒšėz4Y×®śšŻ6Ó Į’¹§PńČ€V!"""""j b0dö³/;½MŹÆ®¹~¼»«ß¦ųʁĄgŸlu­BQ‹Š P¢uwUؙ1 BDDDDD^E †h rŽęŽ;ļÄ7+V0 ā$y\‚>|×å ^[„FßiS`ųšcwׄš‡Ż%""""""—ń{īi„nś³mC.ņd†»«@-€-DˆˆˆˆˆˆŚ(Ÿj=T5UŅc…¾Üåūš×—ĆXYZļzŠ# XśäQ]Ü}ZšLÕį×\ż/æ»»*.Sįģī*“: ˆµQ “źŖŹK ŒU/Ģ•± *Ė}XÓh€yó€Ł³]€Ą˜1€VŪšm.¬[§äd`ž|§‹P»žˆÜ†‘ŗŲe†ˆˆˆˆˆč¢ķ;vŗ» mˤI@VVė †Ąœ9Ąōén<9ŌŚ1 BDDDDD„KĮEœ Ń+Wš§ęA¦©ĮQj*0xpÓĖ!Ä€y=ė ƒ"Ģžmn2iRó”ļŖ`ˆeyš’Y`@„ˆˆˆˆˆ¼š½ąƒ"Vbb€ ̹9š£Uąś`ˆ(;Ū\nzzóž#jS˜T•ˆˆˆˆˆ¼ŚC‡@ŃĮīóŚ‚\wWŃżęĶ3'$mNĶ iµ@ZZóµ) ˆ‘×ó˜ GY™ėĖl®ŒuėÖį±ĒkŃć!""""¢F°üŅŽÖ}’=0p 9ÉjK™4 øļ>ó_g$'›ó±Ģ™Ó²õ¤å-D2ģōńŖ®®†V«…V«EuuµÓۚL&|šĮ1bžūß’ā„—^Ā©S§pąĄ&×µŗŗo½õVƒ¶iß¾=ęĶ›‡’üē?2dŽ’}›ž¦ģƒˆˆˆˆˆØEÄÄK—6’~Ģ-RЋͭ>œ †ˆ’’€æžj݉j©I<¢…H~~>€K9CÄ` Šh4Šėõ0 „J„‚B”rŠˆŪZ:tč1tčP€ÆÆ/žõÆNŸ>~ų …šÆż kÖ¬Įɓ'a2™Š±cGÜqĒŠétųģ³Ļ`2™PUU…øø8Üxćųā‹/pöģY|żõט:uŖĶme2™Żc½ņŹ+ń÷ßcß¾}čÕ«W½ū˜0a‚Ķu@Æ×cɒ%(,,Dxx8|šAčõz›ėWVV"55z½&“ ø÷Ž{įēē׹c """""/×\łD4sŁ=暮9 Ąž=ęrZkBXj4ˆˆ¹CĜ!ĮĮĮŠėõP«Õšńńn¾łfiYii)vīÜ‰ŹŹŹ:yGąĀ… ˆŠŠ²¹/…B'Ną™gžATTŽ9‚ÜÜ\<ńÄ€O>łūöķƀšųć0fžžyŒ17Üprss1uźT‡Ū:Ņ„K\øp¬wl®˜ƒ;’ž÷戔”ģŻ»ƒ ²¹žĮƒįļļY³föķŪ­V‹œœœFy¹… ĢL×&M2“”äśzj4Ą† ęd«©©-y†Ø™yD@ĵZŻčmF#L&“ŻēƤ€Éɓ'‘““ƒ… JĻWUUĮ`0ąĖ/æ„^ƇR©Dee%ŹĖĖk•coŪśČår‚ąŌ>­ÓµkWŗwļŽsēĪ”_æ~6×ļŻ»7žųć,Y²½zõB||łēĪCee%ĀĀĀū÷ļGEEŒF#d2™°±·­#Ū·oGII śöķėŌ>ģ­˜»Ģčõz@vv6:wīlwż½{÷āĉˆŽŽĘŲ±cqõÕWćĉ:"""""²Māī*“¼ÄÄś‡¹ML4·ŠČŹ2’uG0D$ęqēšĮäŃB$!!Įę°»:Īę¼õ¶uNŠR‰'žx_}õ~ūķ7(•J$$$`Š AČĶĶ­µnļŽ½1xš`¼óĪ;Édøģ²ĖŠ©S'ųųųąĆ?Ä©S§ŠµkWŒ5 +V¬Ąć?Žźźj|ōŃGxųį‡mnkķĀ… ˜?>ŒF#ĀĀĀšųćC©TāŠ+®Øw·Żv›Ķun¼ńFDEEałņå(..Fpp0 €ØØ(›ė'%%įĖ/æ„ ÉdšńńĮ=÷܃   §Ža͚50 øķ¶Ū`2™0kÖ,|ųᇐĖåųńĒ”R©0aĀw攈ˆˆˆˆČ’“ōōŚłDbbĢ-A’’ZßH/11ęhęĢa^‘6¬1CČ,&ĄT'¾Ōüųø8/>V[¬#®ļ+Ā3ĪW”®M›6Õ ŠDDD`Ȑ!€;wÖI Ś§O)Į(5Ž Ū[ę®m—,Z€=9&“ &£ &“9‡ `ŗ4o2/>gž߬XŁĻ¾ģ’sfÆĖŒßsOĆ’¹§\²6G«5ē¤6t˜\wII1FZ¹ĀöM.ĆU]fd2Y =ĆÅIœ×]œ/Pyń±8/®W ĘbĮbršG“€#F ??æVŠCĢ)"Ī[Šˆˆ`0„ˆˆˆˆˆØµŠh€ābw×¢įfĻ6·™>ŻcņŠx Č!"ŗå–[ЧO鱘SÄ2g`nrĖ-·ø»ŗDDDDDDä &M2w”a^‘6ÅcZˆˆFŒ„„dddŌj1ČČH$$$Ąßß߯Õ$""""""O’`ŠLž\;J3;ķˆc~”­=ķp½€ŹR§Ė¬š n±ś»“ĒDĄßߟŻaˆˆˆˆˆČóĶ™dfŚ|ź¼ŹŸ|Ut“»ké=4`Ćó’%%„YwU¬ōÅa’0čåĪ}­WWU:µĄ€µv™™v[#čÕĮŲ’čÓ“ö[w×Ņū,\ `Œ4C^‘,u0²Ō^8D³‹yT""""""ŗD»eNų™»«į’’Ģ]h4—Y¬ōÅÖąŽ †ø"DDDDDD,ėõ…ØĪÉqw5¼SB•å’d«Yź`ģ lētŖ"DDDDDDmEFšŚ MjJK±’ѧŻ]sļ„Ń»v™[Œ4‚;Z…ČMĘŪ—;1 BDDDDDŌV”•Ó§›sS4»Ī“K—šs‹4Ą!’0¶ iF ˆµ5))ĄąĮ@v¶Ó›°ėL]ł?’Ž­żÆFŁžƒ-³ĆٳͣŠŌ“WDl’ėąīSäŃ!"""""j‹22aיKŖsr°ū¦)Ų÷CП>ƒ#oÄłåßµĢ΁={ģęa«–Ć€‘—`׹ō‡Ÿįļ‘ć”ݲ­ÖņƏ>…£Ļ'·L%bbĢ#Š$%™ēœ÷ńg«ʀ‘ńÖ®3b«c/ĢGMi©ĶuĪ|ō?zäIT—”4…4s^‘¬,TggKS”¹k*ŌQ]Ü}Ŗ¼Ūąµ•Ææ’ß×O<LšŌ,ū»Ī Zū­»·Åd½¾§?üĢn ÄRīŠļQ¾’®żŖ–ŁEŽŃŃč8ķvęąMĮ–(Žü7“›·AśŒ[ϟ§b@„ˆˆˆˆˆØ5IK3O11ęĄHRR½I8Jģ:5ėwm³*Ū‡y å5h»ņ‡šw’aøöÅõkńzŪ ”ķ?ķęm >²­ĶD¾žśkwWˆˆˆˆˆÜč–[nqwZFv¶yxŻłóĶ­EęĶsińYÆ/D‡qc ŠŽv÷‘6‹¬×"ė† sk©¦“{nŗ—żwž˜p)@‚‹’’h7oCÖė i‚6€ńćĒ»» DNūłēŸłšõr| Q[Ąkµ?’ü³»«Šņ“Z 5Õ<]LĄé žŚu¦xóß8öü|— jJKqųѧPSRŚŖZÓØBB9~,jJĢõ£Ęi“‘ŹŹJwWØAųš%¾ˆØ-ąµŠØ hĄ0»Īš¤®3Õ%%Čz}!Ī|ō?——}ģ…ł(Ū}?xĒŻ‡YKĒi·ćŲó󝬍Buq”""""""/ę £Īož;GÜŲ,ĮQīŠļ±cÄ -3Mt˜v›»«Šfyd@DFF˜L&i¹Éd’&"ņn‚ @ŌŌŌ ŗŗÕÕÕØ©©‘®‚ šzA^„„ī–ļ­–z™L&›Ēfy ØŖŖBUU•t”EźÖ\ĒĖė—ē°¼/‰ÆĖ¦¼,·sō:oLłŽī­mł=å Ä®3mQuI =ņ$öLø£EFb)?p{nŗeūŗūŠ%Żžīī*“Y¹é¦›šĪ;ļ@§ÓA§ÓIć›nŗ 5550 Ø©©įE™Č‹żóĻ?xī¹ēššĆcęĢ™˜={66mŚN‡ .`ņäÉŅµĆś ‘'j©{ēéÓ§qļ½÷¢ŗŗŗÅīĒóęĶĆ<€ņņrčõzéĖŁM7Ż„»īŗ III˜6mž~śiüõ×_ØØØ@ee%Ŗ««Ūä{’É'Ÿ”¾ŒņśÕ¶UUUaÜøqČĻχĮ`€Į`€ (--Åųńć”Óé`0ōZ½ēž{]ļvy9ŗ·ņó·ūhj ˆØÖ9µ®Ųu¦-É’łwüŻrW|ߢūƒ"ś’®óœ;ZŚØ¢£”ve‹ļדÉ"H©Ä”C‡™™‰īŻ»Ćßß~~~ ]Œ•J%d2 …±–ÉdĖĶń!™LV'/“ÉjķG&“I“„·,G|ŽˆZŸW_}sēĪE×®]QUU…#GŽąŻwßÅŪo捊ŠP|žłēØŖŖéŗ`łė–\.‡\.ē{Ÿ<†3÷N…B!­ @ŗ’Yļ›öīā—*10”P( V«„ū²£ūŖõ>ÄuÅēÄå–Ū™L&ģܹ©©©Ø¬¬„B”€æææt óęĶC`` Ŗ««qüųq|łå—8{ö,&NœµZ-ÕM¬»õ{]ÜÆųœårQcĪ“3ēĀś³ŠL&ƒ^ÆGQQ‘ō?S©Tšõõ•ʉõ“<ÆŌz čt:(•ŹZ’3ƒĮP©Tµ>×°ł’_/z½^*O­VØż¾2 u^G>>>P*•ļyõŻ[}}}„ml•#¾,Ÿ³~ĶSƅÖZcPˆb„/Īū@«ō…^nūk`[u¦ŗ¤‡y æüį¶:Ō”–bĻ„;ŠgńŪč8ķvœ_žĪ/’Ś-Ū0dćÆ->To·©“ŸæsŪłh«<. b4q×]wį‹/¾Ą“O> ¹\.}ˆ«ŖŖBuu5¶n݊Ÿž …F£÷Ž{/śöķ‹ŠŠ Ģ;·ß~;Ö­[‡¢¢"éC‘ųxģŲ±˜0a”J%Ž9‚/æüRŗłL:±±±P(šńńB”ąÅ›Ø•1(--…N§Cee%ŒF#zõź…÷ß*• ÅÅŘ3g–-[†æ’ž?żōd2NŸ>éÓ§ćšk®ĮŃ£G±bÅ éĆßūŌÖÕwļ<~ü8/^ŒÅ‹Ćh4B”P`Ś“iHII\.—īėׯwxļŌėõ€Ææž0 ;v,ʏļš¾zźŌ),^¼ŃŃŃČĶĶErr2”J%|||{öģĮēŸ.Ėäɓ1dȼ÷Ž{€×^{ =öüüüąėė+wMM jjjżśõĆ£>Š’ūß>|8BCC±wļ^|’ż÷uŹU©TŲµk¾žśk DGGcƌČĖĖƂ šŃGA(•ŹF'G碠 Æ½öʏ““4””” 11·Ür žóŸ’ øøļ½÷ī½÷^üņĖ/ČĢĢ„B”@UUāćć1mŚ4ØT*ØT*`P¤ Ø®®†^Æ‡ÆÆÆąĢļĶ3gĪ`ńāÅHLLÄ®]»PQQnø7Žx# Ö­[‡µk×ĀĻĻ `Nœ«Ó鐙™‰_żr¹&“Iś<,¾Ž-Z„ūī»'NœĄ?ž(ÕĒÖ=Ļd29¼· ‚€żū÷Ū½wžõ×_R=ˆ7bΜ9ˆ‰‰‘^Æā5‰ļRpÄģ¼?ņU~(PłKĖjJKqų…WŃ’«OŻ]]»Ī/’®U%=üčSuFy9æü;ż×…‘“4ó_­ČĢ4Ļ—”\šĻĪF؋“ķz  ˆ‚€>}ś <<›6mĀõ×_/ŻōM&t:–-[†’üē?ĒĪ;ńŃGį7Ž€Į`@ii)ŒF#^|ńEœ8qo½õn¾łf<óĢ3(**Ā‹/¾ˆQ£F”ŗŗo½õ^~łetģŲ'OžÄ‚ šĘo ((ąėėĖ‹7Q+£P(p÷Żwć­·ŽBll,śōéƒųųx“k×Nś… 0łcTUU”  &“ /¼šņóóńā‹/bĈ˜2e RRRp×]wįŸžĮĪ;ńŹ+Æ@.—£ŗŗ«WÆĘٳgŃ©S§Z×;jŻÄ>F£±Vk#1XVPP€   ¼ųā‹(((Ą’żß’”OŸ>P©TųüóĻńÖ[o!((7n„V«Euu5ŹĖĖńÅ_ąµ×^CDDvķŚ%}ž:u*Ž~ūmÜsĻ=(,,Ä|€ēŸ]ŗtqxĻstoÕétXøp!ęĶ›‡vķŚÕzėõz,[¶ ,@PPŅÓӑ——‡ŖŖ*”——ĆĻĻÆV–\§c•«t°n=RšĖČ’łwDŽėī*ÖR“ƒż> ķ–mī®J½r—^’Mv¼’­ GNĪ„Q„23ĶĻQ³ņø€`žµcŹ”)xóĶ7qå•WJHL&|}}ńŽ{ļĮĒĒF£={öD^^*++a0`2™0dČ tīÜUUUcDEEĮh4b芔Šėõ App0ŠŠŠj%„ö÷÷GII ÖÆ_¾}ū",, “&M‚R©¬•˜“Ś>¹\ŽAƒIÆ£=ząčѣݺuƒ ®øā ¤¦¦JĮŗ… Ā××&“©ĪēaĄüś8zō(¢¢¢¤÷—£{ž£{ė¾}ūc³N‡īŻ»C­VKõ\¶lŒF#ŖŖŖ —Ė„–1l}Ł|¬[ä'MŽ4wW pśĆϐõśĀVÓ*DS£—ę-Ļ›Fœ/ϦO¢£½{/6ähuŚd@¤¤žaŽt:0bÄ|÷Żwøūī»Ś‹/¾ß’ĒŽ“śB@YYōz= ōz=L&“ōK©TĀ`0Ąh4B.—CÆ×£  'NœĄK/½Tkßååå(++“²j‹ż:É»Õ÷š„–%1lŲ0 :•••xć7°uėVÄÄÄHIėAĄŁ³gqäČL›6 ƒÅÅÅ8yņ$^~łåZeÖ÷Žēk€Z;G÷ĪŹŹJ˜L&”——C.—£ŖŖ ‚  ¼¼\ji`0¤/G€ķ{§^Æ‡æææ“½Ų2£¬¬ F£±Ö{K|’”——K9Mt:A€Ō ’üłóšóóƒV«EMM |||€āābTTT€Ō²E.—C§ÓIŻd,[¼Čd2ųśś¢  jµǵZ­Fii©”ėD,×`0@”P@«ÕB”PHŻpÄrÅzŠI$zžźūŒįććSė\>»ˆ9"ĀĀĀ0kÖ,l޼æžś+ąŖ«®ĀŲ±c„/ČbNK¼Vµāė©¢¢F£Q ¬étꙕ••Šėõšóó«•OÄßß„„„Ņ½Ø¤¤DzśłłI†µk×āųńću>WTTĄd2AÆ×£øøYYY˜7o^­ŗŁŗē°{o-((Ą±cĒšÜsĻÕ)G«ÕJõ߇~~~Ø©©‘ŗßŽ;Ō2" Ī“&£F™’ŗAK¶ ±äP›j 6™_ƒĘ*ØHNMmŃsEÓ&"ΐÉd3f ^żud_lvT]]żū÷c’žżxę™g T*”Õjńā‹/ŚL8&~XóˆIßär9‚‚‚…|‚ @”PŌJ4gł µČĻĻG—.] R© —Ė”R©†’’éØŃh„L&Ú5k0zōhųūū£¦¦aaaˆ‰‰ĮĢ™3„_®ųŽ'OaļŽi™0·ø°üYÜÖņ‹¾­{'p鋻Ų2£²²AAA0R7q;±¬óēĻ×J°(>'—Ė"0óż»¼¼!!!Ņ—'Ė$„Žœ8qÅÅÅčŁ³'“Z-ŹĖĖ„ķ-ĖÕét(//—Zžˆ×1Hc™ µ1ēÉŃgŒ¢¢¢ZĒc™(Žņ$“ɍž={Āh4"77©©© ŕW^)} f"čÖK©T"((łłłˆŠŠ)PÆŃh¤÷Tee%€KÆSN‡   )yŖų:Ģ÷@¹\Ž}ūöa’žż˜;w.|||PRRRēó°L&Cpp0¢¢¢0cĘ é}kėžWQQ‚‚»÷ր€é5-žč(–³}ūöZĒ –g+I1µ°ģl %Å<@b"0q"0{v‹ģ>ėõ…Čzca£·73j.Īį'Ķ_ rX¶ī ļäљ“|||0mŚ4|ūķ·P(Ø©©AEE…ŌēŃ`0ąĻ?’”2j[7!µ¼[~`Éd读7Īž=‹ .@.—£¬¬ ,²Ų‹x!'j] šź«ÆJĶŽM&8€“'Oā²Ė.«=yņ$rrr¤>ż‚  oß¾8}ś4rss„œ|ļ“'±uļ Dyy¹xŲøq#ŌŹi`+č`}ļ·Ł³gA@QQNž<‰=z WÆ^8wīņņņlŽW-G£°lÕ‹Ó§O#//pīÜ9œ>}½{÷®U[Ä@ŃhÄ?’üƒE‹aņäɐĖå读7Ο?ĀĀĀ:åöźÕ §N’ZS|łå—ųī»ļŒ²²2”””Ąd25ś<Õ÷€ĶėŒR©DMM d2öķۇߒ€9čҾ}{h4Fi8UÉŪś5 kÖ¬‘ZQ?_~ł%„––ļ)±c=н{wäää ¬¬ j½ÅĻĆāg`ĖĻĆ2™LjŻŌ«W/œ={¶Ž{^}÷ÖĖ.»L*Ēś5}Łe—!;;[z?ŁzßP+‘–Ģ™Ó"]>vŒøĮf0DmŖ¦FMŖ*ŠM_‚nś ,Ļ“¦ŃŚÓ­=«KĻcPy>•磯®Żō„č¦/EĒ*].BT—ŅXķī*“Ģqŗ»ĶAü°$—ˇM›6Iąøø8ģŻ»WJ„6~üx\øpŸž9ī¹ēžZeˆ4¬?€‰æŽLŸ>ß’½4>ūčŃ£(ķ›9ˆZŸččh<üšĆųśėÆ„nt=ō"##„d …Bś€łī»ļ077=z4fΜ‰ÆæžZśŠĒ÷>yG÷Ī€€\żõX“hŠŠPTUUIŻE¬‡ą“uļĢyCņóó±hŃ"TVVāę›oFpp0AĄż÷ߏü±Ī}Uģ" ¾·,ĮĮĮxä‘GšłēŸK­3¦OŸµZźjó‡9±5‰uįķ·ß–r{h4L˜0„ÉdBhh(xąiT Ėr}||pēwā’ūŒF#ڵk‡‰'B©Tā†nĄĀ… ›tž}ʰ¼F‰CżŠē$""xļ½÷0cĘ üšCųśś"..ØŖŖĀ€°gϼłę›u>?ųąƒĄ¢E‹šųć#)) ß}÷ĆĻ»õŻ[Å÷÷?üP§œL˜0‹/†ÆÆ/ś÷ļąą`)—s‡“BiiĶŽ…&ŹPuyžō˜Į‹–§øŲŠĘÓ5ęź"³˜sPEœ|ųPšą ąā¼ųXm±Žø¾Æ Ļ8³óÆæž vŸ7Ņøéb’4ĄÜD·²²Rź³,—Ė„ ²8ܘxĮ£ŻāPbā°| …*•ŖV?Nńƒ”å[Æ]Üy·ŒŒ ‡ÆYjyā{X¼VXž%~q› ‹Å®4jµZj/Dź{ļó5@­]}÷Nuī‰āżOüB$ŽÅį1ķŻ;Å÷Œå}S,C¼’Zߗā¶*•ŖÖhNbN„ŖŖŖZŪY&Q‡Įõõõ…R©„Ńh”†C<ĖįDÅ$©ÖåŠÉI-‡īµ^.v½kĢy²÷CL`).S©TRĖĖīMā$īÓd2I-BÄ}‰ēPü²ÉkUė#¾– ŖŖŖjŻsär9 ńĪ;ļąÕW_…^ÆÆõŚ'ąR¢pąŅč4b—ń>gżyŲ2Ųfł>²wĻsto_sbėėד؅«ŗŗF£/½ōfΜ‰ČČHØÕjĮĒǧÖkõ–[n‘źo}ĪlGkK-Ąæžœk~oM0™Ģß Ó„y“Éxń9ó¼ ųfÅ Ģ~öeøBõ–æQ:~rå~† ųėĖ[š•Ö@³g ߕÅ)sę\źŖCn”S¢Ņ7 ĪņąŸWB5ģŖ&—/“ÉRč.Nā¼īā|9€Ź‹Åyq½*5“Ó<®…ˆŲgQü$Žčś¾ųkŠå‡먳å‡31śmٷײ\҇Ė<–ĻQėbŁŚ2™œåū@­/n–_$,ūüó½OžĄ™{§õėŽ2g‡eĖ G÷Nń½%~³|ļY®/~į·$XÖ×2č(Ö_&“Ł|OŠ_ā,·G®·jß’ÅĄƒų9ĮŽ{]ürg9’ø~cĻS}Ÿ1Ä’ƒų˵Ģ#b™Ā2Ą+īCüózÕŗYē› –;Ė ųŗēÅm-ƒ@ķ×£u+ ėį©-ēŻóź»·Z¾fm•#£H%|¶B›65’>Fb@„Z„ĒD,?$X^ĄÅæøŽČ2 bļF FÅ-·³¾qXFĢMŽFDīaė—cq¹å{×ņ9ėÜB¶~-ć{ŸŚ*gļā @ķū u> Ąö½Óŗ;™å—v[÷]ė÷–å~­÷iżž®o;Ė_Ņ­“Ŗ[柕kłœuĄ£±ēəĻÖėY't¶Lījł÷Ķ\Gm‡e+)ĖĽ2™ ]»vÅ»ļ¾ ƒĮ 9,[žX¾>Ō ˆX²õyXdėõhėžēģ½Õ2Hiėż@:&ĖÄÅ|½¶"ę<"Ķ9$ob¢»’¼„ĒDŌł $.³ÕÆßŁ.-¶Ź³÷µ~Ī.šśFŒp÷Q’h“-D2)¤6†ÆYāk€ˆŚ^«ˆ”6§MDˆˆˆˆˆˆČyZ„ėcJUmŖA ± ”5«ފ$-­y“ŸĘʧģl7œ­¦å •“,_å'Ķ‹’r/Dˆˆˆˆˆˆ¼ŒŲņ @å/-ÓŌčZc€ŚTS+’ęˆęņSSŻ}Ŗ$—Zm(¤VeĖsIm"DDDDDD­R]«å‚ŚTM”Rw‹V$-•G¤™"õåå`KĻʀÕ”—+‘룔ŗŁ—Z‘h6’fĻ:Ō„(Ö]VŹ>R£!y9ȳńU@DDDDDDN±lE2póß~UóķĢ*ˆ­.+µ[x°55 "DDDDDD­„ÜdtwœV¾’PóDŗq2rW|ļīC%%wwŚŗæ¢c±sŅ4»‰Čµ~śé7 Œæ}.æƒŽĘÆæ:zoÕŖ_įļ…ļæ_ćp½Ø.ź¬óōÜd Œæ%%„Ņ:¾>į§īæ(téÜ=8eeåī>-DD69{ $r7¾VŪ¦āĶ7ū>‚āś¹ū0Ƀ±…ˆ‹ ųų](5!.)ėŲæ üŸcųłwQ«Ÿ_ˆ;§ĪĄ–­æ >>[¶ģĄõׯ†3g÷!4TSgżĻ>ū ?Æż]ŗtjš¾Žxć=üųćZlŁś BB‚„å_-’·Ż6•u ·Ż:’÷ņėX˜ņš»OQ-M¹µ$¾VŪ.ķęm;Ķš+Ż}˜äĮŲBÄÅ"Ē^‹Š+»¤¬ĀM[Ż}8D­Jvö)ØT*ÄĒĒ®¾zŖŖŖ‘“sĘęś§OÅ7ß~ __ŸķgéŅHYų~’ć;tčŠĪīzŻŗuÅøqcpāD¶»O Q½µ4¾VŪ®šŅR”ķ?Ų¬ūŠėeppÓ "²Įk"•§ĪąÆčXyńģ¹ļaģœt—ył™³Ų’ČSŲ88ė{%`÷“Qqü$Ąp!EĒb’£OįŸ—’ }ÆĄę«ÆĒ…Ÿ~µ»ė.3„{`ē-wcCŸ!ŲtåµČZōpqlč{ŅbÆÄī»’ö?减¢0} žŠŽ…PcDå©3Ų;ć l4éńƱē¾YØ8vĀįńy’žżū!<<Ė—’€ŹJ=>’ü[DGwAß¾½l®Ÿ<’ØTŖķc͚ß1÷©yųł—čŁ³›ŻõŒF#öļ?Œļæ_ƒiwŻźīSCDTGc®DīĄ×jŪĘV"Ō–yM@D~ń"›÷Ū:ČU*t˜4&ƒ{ām;ŠļķcšwĖP]Rн<”Ę(m“’gTa”č·ąU˜ōz|źETåŌ»Ļjm öÜ3ՅEč’į;»r²Žū¹?ż‚š²rģ¹ļaĪåbŠKūīŠīŲ= ˆ’ßb@Č ŗę˜Ŗ«‘1õ~h·ļBÆyĻįņW_B鎿Ų=ķAŌ”—Ū<>"Oćėėƒ–¼‡gĪEīƒńųæžĒāŽ„k~Qڲy;¦Žńnæżf Ōßę:÷Žó‚cÜśĀW ĀĶ7ßąīSCDDDä-‘G¤¹·’÷ņš€ˆHˆŸ¾‡Ø¤»Pü÷čNf£Ó·"|Ō0ˆE÷ٳ Ė>…ĀōĶŅ6~]» ūœGŠnÜõč<ķ6˜ŖŖP“u{½ū*ų+ Õ%„č|÷„'Ž@æ”×1śŲnt˜8Š ’ū/ żł[„$Ä#|Ōpõ½eGŽBØ©A`ļˤś÷ļ‡Ā“MП=‡.÷܁Ē£ż„ŠyŚķ0äå£0m³Ķć#ņ4¹¹y˜zĒCųćĻļqīüüńē÷˜vēLœ;—ė’ņ—/’o¼9_|ń-~łå/›ė|žÅ(+ĻFyEеĒ„ėĘÜ “ÉäīÓCDDDŌāŹ÷jö}°…HĖkK£5…×%U ø¬‡4Ææų%*ūƒO‘żĮ§µÖÓeå d łbuēK ž|Ū™ó TÕ»/żł ŸššŗOšLČz’cäżü ył)ŖŖA€`¬ūāӟ9g®K§ŽŅ2u‡öĆÅżX‘§łłē?ѳg7\yeąŠ+į²Ėŗć—_žĀƒŽŻäņß]ōL:*•wß5 ;wż‰=bģ®Œ·ĢG`@423ŲmUBDDDä©ō§Ļ :'ŖččfŪ‡˜G¤¦“ŌŻ‡ė5ŌU•ØšóüÜ-^‘)Ҽ\čśą½ˆš^»E…*8BM ĄpįRĄAœ÷‰ÆoWšm ØŹĖÆóÜée+pź“ečöÆč>ūȔJlæįV”žĒfYź‹Y·õgĻIĖ*Ϝ5?ÕŁęńy…B£UĄ°¦¦ĘeżŽ•Jó%qęĢū°}[n™|žŽöüżżģn#A€L&s÷é!"""r‹‚-;б"€¹•HĮ/øūPÉĆx]—K”W _t.¬ł eūAś,Ž0Ūī:Zm žy:={vCæ~½Ż}zˆˆˆˆÜ¢%ņˆÅõs÷a’ņź€ˆÜ׃¾ų!ńq8ņā«ČœžjŹ*ūīšėr©ÕEŲš« ĖŹĮĮ'ž…"0q‹Ž„Oxh½åū„‡aą²” ĆžGžBĮŗtD=pŗL›‚.÷މˆkF"ļ÷u8üģ’Į'< ńŸ½ߎķqų¹dȔJt¹g*Ŗµ%ųgŽAĄ åŸB3x ޼ō޾ņBÆ‚A_} …ŸŚŻ§’ØEtėÖ+¾ž³ž‹ž=†ąūŸĄWĖ?BLL`ņ¤{ńōÜdĄŁ³ēį§ī?u:twM{~ź.xķµwœŚ—ŸŸ?ü˜Šß߀wŽłPZ.–ć§ī‚޽®Ä¹s¹ųł—.KģJDä M½µ¾V=Gš”¶ŹkŗĢųvl19ź,÷‹ŽB’ßuø­L!Gß·^Eß·^­óœu™Ö5Cačźu¶S…#>õƒ:ĖGl['Ķ÷~åō~å…KŪhB0ąÓ÷t|DžfĀ„±˜0a¬ĶēV®ś\šļܹ#*õgœ.÷ō™½u–uėÖ…EG®CDŌ5ōHä.|­z†–Č#Ā‘fØ9xL@¤¦“ §>ūĀīó]ŗŹĄĄĘ.ī><"""""¢V«Eņˆ »Ś-Ķß…¼‡ĒD”ĮAč>ēwWƒˆˆˆˆˆØŃŌU•ī®B£”ķ?ˆŽø½Y÷:ü*DČ„<& ŅTa”ģ†BDDDDDTĖ#ņ†»”<‰W'U%"""""¢¦+?pÕ%%Ķŗę!Wc@„ˆˆˆˆˆˆšlēˆ‘õśĀf Œh†q“rDˆˆˆˆˆˆØÉō§Ļ ė…Ų‡C<Ł,ūŒėėīĆ$Ā€¹TīŠļQ¼ło——Ėn3äJm2©Ŗ ‘ī®Qó5ėõų ¢¶€×*¢Ö 0¤½ĖŹŅÉÜūuÆ|’!—04ĆŁeĘ­RķŅ׏7` """"""r¹ęh!¢ A`,»Ķk“É"DDDDDDm™¢küž{ŗY÷ŃY&C;7£28øYŹķżÜT8čĘ#k½ü”YĖWtr÷!ŗ"DDDDDD-LÕžĻ=Õ¬ūšw÷A6“ńcńcŻ] ņģ2CDDDDDDD^‡"""""""ņ: ˆ‘×a@„ˆZõė×cąĄŠh4čßæ?Ö­['=—‘‘Aƒ!((ƒ ĀŽ½{–µjÕ*ųłłįūļæwø^—.]ź¬3wī\ÄĒĒ£¤¤DZĒĒĒjµ~~~čܹ3|šA”••¹ū”Łäģ5Č Ōjµ4i4wW‰¼@zz:d2Y)==ŻŻU£ĤŖDŌŖbāĉHMMÅ­·ŽŠ„K—bŹ”)8}ś4T*n¹å¼ųā‹xąšńĒćÖ[oÅ?’ü…BQ§¬Ļ>ū k×®E—.]\7Žx?žų#¶n݊iłņåĖqŪm·²²²pė­·āå—_FJJŠ»OQ-M¹µ”ŠŠ ˜L&äēē#((ČŻÕiõVÆ^ĢĢL¤„„”¬¬ µžOLL„F£A||ū,vļŽM›6Ł]Gpaė«åĖ—ćĶ7ßÄ3Ļ<ƒ‰'bÜøquÖłā‹/¤"%%%xé„—0fĢl޼™æn5PHH’’’””„!C†`ÕŖUøóĪ;1`ĄōźÕĖŻÕs‹’’\{ķµuņƒXó>X<ŅŅҐ™™)Q&NœčīĆ!+‰‰‰uZļdgg#;;Ūa›““4\{ķµųį‡œļC|ŸY—·fĶ›ÆµģģlĢž=K—.u÷)kVŽż-Żā‹TųČDt˜0¹kBĮ†æąÓ +~€žÜ9@ö‹żĮ¢Z›ė²NJ‘€ĖzÕ[–ŗSgw1Q›ńōÓOć·ß~Ćśõė ˆˆˆĄ®]»j­WTT„ČČH—ģsŃ¢E˜:u*T*īŗė.ģŚµ =zō°»~HH,X€€€dffŚmUBDDD¶õčŃ|šōxņäɈĒ† ¼2 R_0$11³g϶č˜7osׇ͛7»ūpȆųųx¬\¹Ņīó%%%R˜ģģģ:ĻgddąÖ[oÅŗuėœĪ+˜"։ZG…yóęaõźÕHJJŖÓ)55ÉÉɝlÕk~Ī”ūųŖŠŠ¤eŗœ¬KĻ«Tˆ{’cŒŚµŻŗģ,œūį[ų] bD?8Ć·ģŖ5už2UŚ^¦PÖ[9ē“O>Įš5k°~żz“k×NZ>`Ąģßæ_zl2™°oß>—% T^lÉ5sęLLš4 “'O†N§sø 2™ĢݧˆˆØĶ),,ÄįƇk-3 P«Õ[$''Ū †h4¤¦¦bƆ NµśHHHĄO<įīĆ”F Į}÷݇¬¬,$''Ū\'##Ćīs1qāD»å5$)l[ä5æ.QP `Ć_8µō~įiŌ”–0”9»āK¤õļ ķĪķPw6O§ DčUĆąƒÜ5«Q¶/*OŸĀįēēbĒĶ7 śāöÖģ•EDõÓjµxī¹ēšå—_ÖiłqÕUWĮĒĒļæ’>Ŗ««±`Į„‡‡c芔.ÆĒ|…BxĄa]Ÿ~śiōģŁ³N²W"""Ŗß޽{qÕUW!33‚ ą›o¾ĮńćĒ1fĢwW­Å„§§#%%Åęsżõ—WüAfóęĶCjjŖĶēRRR““ć²}Yw§Łj„āI¼¦ĖŒ\­Fß’¾£’™ Ž@—{§£ŻŲqę«ĻaŖ2 żM7£`Ć_8šŌćÉč8ł6t™v/ä¾¾Hųāż÷|~ńYu¼¼/bßż~]¢ ?®Ī¾ģ•EDõūõ×_QTT„įƇ×Z¾téRÜyēųį‡0}śt<ū쳈Å?ü åī˜4izöģ‰ ąģٳRw—ŖŖ*L›6 wß}7^zé%¼ōŅKõÖĆĻĻ?žų#šĪ;ļąÉ'Ÿ©ʈ#šĖ/æĄĒĒĒŻ§ŽˆHŅŌk QK=z4^{ķ5Lž<Z­=zōĄźÕ«Ń¹³÷u5·÷ }JJ šuß999ČĢĢDff¦“,>>ńńńm¦»DNNN111ˆ‰‰©ÓU¤”妄„IÄÄÄ&•×P÷ŻwV­ZUgH^ĄüšqUŽ†tæń$^€'£ĆÄɵ–õłĻ[Ņü€SmnēƒŪ~”©;vĀu9j-SŪ-‹ˆ»óĪ;qēwŚ}>..®N‘卢sēĪŠėõNļ÷Ģ™3u–uėÖ EŻģl­CDŌ5ōHäN=ö{ģ1wWĆ­Ä/ŻÖ›­ėKII RSS‘’’ā°@LL ’’’0{öģzæ4ŪźBœœœ,å6qõvā1|ńÅ“ŠęĪåī°–žžŽääd›’FƒŁ³g×[?WIMM­3Ņ"`žģėŖ€ˆ½Ö&ž>R‘ĒDjJKóŁĒvŸ~ča(ƒÜ]M"""""¢ZlżśŲļĘŠTéééHJJrŖ;Dvv6’““‘ššŠļæ’¾Ł[«8Ė^"P{,[æŌgٲeϽV«•‚%6lhöcGc²ī>£Õj‘žžī’+¶ŗk5µuM[ą1epzĢyŚŻÕ """""j{‘ęČRߗ}{²³³1xš`¬ZµŹķĆłĪ™3Ēn¾{œm鐚šj7o‡µ““4Ģ™3 .löcNLL“YÆ“““&-ęϟoó|6ō·E!"""""j‹ģu—q5±eˆ-111˜4i4 “Z-RSSm¶¾HJJĀ_żå¶–"ļ¾ū®Ć/źbŽ(++“ŗŅ4$ Ņ)))˜={v³ēZ‰µ¹Ü٤§Ö-d“Z-ŅŅҰjÕ*›e¤¦¦ŗ=šÕ!"""""r“’’›Ėććć]¾/{Į”””:¹J.\ˆéÓ§Ūģ¦1wīÜé*b-==³g϶łÜ¤I“šŅK/Ł Ō¬^½ŗĮē399IIIˆŽŽFII V­Z…ٳgŪ „¤¤4{+{(g"öĪ›µ˜˜¤¦¦z|W‘× »KDDDDDŌŚŲĖma+‰fS,[¶Ģę—g[ĮŃŅ„K1iҤ:ĖÓŅҐžžŽĀgŹžH<©©©X¹r„Ż ĮĉŌ‚#55óęĶ“¶ Į}÷Ż‡æžśĖęśöŗ<µ5Ž !"""""ņxļ½÷^e111õŽbcÆ{JC»–4UFF†Ķ®EIII.͵⨼„„›"g[i“vŁŁŁHLLÄąĮƒėµĒS0 BDDDDDäĮrrrl~Įu¦Ett“Ķ @K·ŠX»v­ĶåöZ4–­cuęywœmI”€ÄÄDir”&##ƒƲeĖÜrL-©MęłśėÆŻ]¢ٽ{·»«@nĘ×µ¼Vµ¼ĄĄ@›ĖNÖöZ08›W#>>¾ND«Õ¢¤¤!!!-p–ģ'žuu2Óś bĀVkåååĶzüöŗ(9ū?|ūķ·mv…Y½z5RRRģ¶¾‰m5C-7‡6=z“»«@DDDDDn°~żzwWĮ„ģ}Ł“—[¤1l}Łąt®{#“dff¶X¾ [Aę‰§µ²Ō² qÖĉ1qāD̟?ßfkw%Šm)ģ2CDDDDDäF¶‚"iiivG ńFž’§£±ģuQrUPh޼y6ĖJKKCNNŽ»æŁ0 BDDDDDäFqqq6—{Źč%Ō4ā°æÖbbb\ŚeČ^N{-Œ<"DDDDDDnd/Q§«†ŚėVįl"P{ŻwœĶ_Ń\ĒąŹnE­™½‘~’’’\ŗ{łS<¹u"DDDDDDn4qāD›_ų³³³1žü&—ksłœŚŽVą!&&Ę©„Ŗ®ś2mėüxC·¢ŒŒ »1gF jW&ņm+!"""""r3{æö'''7yųӄ„›æž§¦¦Ö»­½ī¶ņMŲĖ…āČźÕ«:[­h“Z­ŻÖž ##cƌ±ł\rr²ĖGųiī<%­Q›e†ˆˆˆˆZOĻs`Æ;‘+Ķ›7kÖ¬±Ł%)) ™™™Mś|XśĢŃ«W/\wŻuµĪe^^¾śź+ 8GŽAee%®ŗź*\yå•ҹśóĻ?„óqżõ×#&&ēĪĆŹ•+Ń”CᔇrŗĢżū÷cÓ¦MŅ’fÜøqŅ;v`Ū¶mšóóCß¾}±k×.L:ķŪ··[“É„yóęį©§ž²9b…µœœ$%%”GųōÓO„寽öÖÆ_™L†kƽ/¼šB³’ß[“É„øø8ģŻ»‰‰‰6ßsöŽ€ÉdB’žż‘™™ •J­V[ė3•#mżżėMBBB°téR<öŲcx’ż÷ķv±'!!Aź:bméŅ„HJJBrrr½­4“®3_CBB°nŻŗzƒ9 X²d žžŽ s“€ĢĢL©ū3ēÅQ‹ūÖD£Ń 11‰‰‰˜4i¢££[dæāž’’’¼""ņ˜€ˆL&CŸ>}š÷ߣC‡h׮ڷo_«‰`MM är9F…ŹŹJüłēŸčÖ­AĄĪ;1räH”¢¢iiiøöŚkŃ®];"00ˆˆˆ@aa!BBBPXXX§¹”L&Cee„ĶżŌŌŌąąĮƒ3f Ōj5Ž;Nפ/ŁJ„²V0„¬¬ &“ µÖ3 vqąĄ8sę †^«.Ī–­ÓépčŠ!\{ķµP«Õ8}ś“ō+…Ńhľ}ū˜˜äęęb÷īŻøīŗė‡mŪ¶aŠ A×Ģ­U|}}qĶ5× ²²żõ:tčµZmw»¢¢"œ;w×\sōa’ȑ#ŠétP©TŲ¹s'† †ąą`”––bĖ–-øīŗėPZZjw»€€wæŌ‰Ø 3™LĖåĖå(//G÷īŻŖŖ*»×$±µ`dd¤ĶūŽ£ė»#Ž®‘Ī\ėÄcqtżÖétvļ{ŽŽY©lŽ'•••Ųøq#ŗvķ „R‰ŠŠ |ūķ·x蔇‰¢¢"|ųį‡xüńĒŃ£Gœ:u ČĪĪFLL ²³³Ń”CdggK?€>>ŅņśŽ;wĘöķŪѵkWųśśĀ`08µæ¶śž„KF%\• 4!!”ن¬ŽŽ–‚Ž„„„4©KˆåyqVc÷ŁŠķ,×uY·—zZõXž?=yČ\WšØ€`ž²ččhF¤„„!77ĮĮĮP(µZ@ˆM C­›`ž h0Š„K9rP^^ŽŽ;āŠ”Ć€¾}ūÖłrÆT*ŚB”hpżÄ‰R}.æür©ŪHqq1vķŚ…øø8› āc}ź+»ŖŖŖV™LVėńįƇQPP }µĒŃz>>>µ1>>>Ø®®vø]`` † †“'OāŲ±cĢå^½zĮ`0 øø¬¢Ŗb {Ū±Ė ‘÷Ŗ®®npž$ńW!¹\Žąą`\}õÕŅu_„RI×GפˆˆģŻ»‚  øøC† AMM“ޣ뻣€HCÆuŽŽÅŽuŲŃ}ĻŃ171‡ˆ ųųćŃ±cGųūū0ßßÅy‘ææ?ŹĖĖ1`ĄlŲ°‚ ??—_~¹8ČÉÉĮõ×_€€$%%aŪ¶mRKˆĮƒcäȑuĪ„Z­†B”ūłłIæŗŸ9s‹/®µ¾Ńh”Ö³žA¢¾2AĄśõė„.­ā’FTTTŌ:f•J%å“(//wX—¦*,,DÆ^½¤Ēbė•–PœŽfPÄĮĄüæźŽ½;8P«uG}ļN:įĉRėś“Ę÷oc®©DD®ę1‘źźjčtŗZMŒ Ōj5ōz}–lEÖ |}}įėė …Büü|éƒe`` ņóó”T*„ÖĪP©TŅ—xĄÜ…§ŖŖŖAĒŁ£G)"C† ±ŪŸ×Ń1:āLŁÖĒe2™¤ć:{ö,rss1räH( čõś:æ9³^uuµŌGU|ģććSļv!!!R÷ŠŠ ģŚµ žžžP«Õ ÅÕW_mó˜ģmÕ ’y†#GŽ k×® žšn™ČŠ‘ś®Ijµ¹¹¹ ‚R©¬qt}ņ"Ajmېk½cqtvtß«ļ˜›‹L&Ć 7܀+V 66jµØØØØµ^EE‚‚‚•J…“'O"222™ įįį8yņ$|}}„īE;vÄäɓ˜[ņ|ūķ· ©ÓŖCÆ××ŗŸUVVĀßß …;w¶9Ōę… äķ•yšąA9r3fĢ€J„Byy9Žxć ę/ā–Ÿ_ ƒŌr)00Šn]\Į:i¼Ų%¬„XEÜ õģŁ6l@aa”“¬¾÷GVV–ŌŠÉ™¤¬­ńż[]]'N4øÕ‘+ɛ^Dė Óé°yóęZ7“ÜÜ\՛@'22%%%(++`Ī•QZZ*ݜ###qģŲ1©œššp;v¬Į7o±›‡ųĮ5''ĒīÆ=Ī2Ųµkģ0¹Y}ĒŲ”²ĆĆĆQTT„ŹŹJéøDÕÕÕRPI?~\*[ģ»Zßz€łCüٳg˜?ų!""ĀįvēϟĒ?’ü#Õ% jµ‚ 22Z­„„„ĢÓŅŅPUUåp;"ņ>§OŸĘ‘#GšĒHCł‰Ó\²G×$ńyń ¹­mķ]ßÕj5ŖŖŖ¤/¾–}Ć]u­stvtß«ļ˜›Stt4ŗvķ*żŗŻ£Gäęę"??€¹Rnn®”×”GŲ“i“”Œ4::7n”~ 8tčP­>ā”””¶y.F#öļß/żÆĪœ9ƒnŻŗ”G8žS5DK½8PēśłĒąČ‘#8}ś“»’DäÅ<¦…HHHpąĄ ‚???\qÅ rx÷õõŐ!C¤ŃVsSW±õD»vķpüųq©ouxx88€Ė.»¬Au BĻž=±qćFųłłIżEmu›Yæ~=ŖŖŖ`0°cĒČd²ZC ‹rss”Óé°}ūöZĖ P+7ˆ£c“wu¶ģ€€ōéÓ›7o†R©DĒŽAйsgœ9sėׯ‡J„Bß¾}QVV†mŪ¶įź«Æ†6n܈«®ŗŹīz š.oÜøUUUčׯŸtķmwå•WāüłóXæ~½t£ŒŒDTT”t>÷ģŁA`2™pŁe—ĮĒĒ‘‘‘v·#"ļN‡ØØØ:Ż*\ÅĒĒĒī5 0ł8~ü8śōéSgŪśīa½zõĀʍįėė‹N:ĮĻĻOŗ®¹āZēč:<|ųp»÷½śŽ¹¹]żõųąƒ0dČDDD`Ź”)ųńĒ„ē§L™"µžčŃ£6oŽ,Öß~ū #GŽ”ž?r䎒}©kJ÷īŻkå0!??ü1ōz=ʎ+µn:u*VÆ^ “ɓɄaƆĮßß_ vŁcÆĢŲŲXģŻ»ļæ’>üüüpŻu×I£ŅÜ’ż>|8>žųc£’žšó󃏏üżżķÖ„!£ĢTUUįśėÆGQQņó󑘘ˆ7ß|C‡ÅčŃ£1zōhČd2ÜtÓMRK„–Ō‚!¢ČČHI’kGļ}ūö”[·nP(ˆŽŽĘ?’üƒJŸ©Äׄ3Zźż‹ŲŲŲZĖt:NŸ>ĶĻW䣮¹ˆęĶęĢV­V®.&4•dgóē›Ÿ×j˜ó6i©'–µ? }|Øųšpq^|¬¶XG\ßW„gœŁł×_Ń£G»ū¼5ŠÉd’äÉd2”––bėÖ­;v,sSµrāš¬ä¼ę¼ļżōÓOҰĆmE~~>RSSńōÓO»½Ģššäää [·nĖåČĶĶÅēŸާŸ~ŗQ’›U«VaƌĶ~J[ MDh rvęĻ’“Ķ“‹ųÖ>Y =ĆÅIœ×]œ/Pyń±8/®W ĘbĮbr?ٵ ¹\޼¼<8p@j–:dČCˆˆŚCŽ÷½ÖK”PąŲ±cųõ×_„dšwÜq’7$iī÷/Æ©ä523ĶA†¬,sŠĮŚōéęæ–ĮŠyóĢAŠ”ą‰'logϼyuƒ(˜%ļæ,]Zū¹ÄÄKłóĶŪfd˜'$4K0¤5ᕨ…Y7$""ņd¼ļ]éŅÖ!M)SL.ė R’÷‰»«ŠfńżKäZ­9a+ؑ}©%ˆuĖ'ž0?·lYƂ¶ŗ¶Ģž}©åˆu@0—æf9s÷ŻĄÜ¹ęr–,q÷Łkv ˆQ›ćI]Øłü÷·Zl_|M‘]“&Ł^ž–fž«Õš[gX”§„5®•ĘŖUĄŽ½—ö!īĒž%K€Įƒ1cĢė-\h;ēˆ‡a@„ˆˆˆˆ<Ņo½ķī*Ł'ŽĪ™šźŗ232€Ūn3Tkē0q$!ĮœĆ$5ÕܚeölwŸĮ€5ŁÉ“'Ż]"¢¶iƆŗ#¼4†Vknį»vÕnį‘œģxیŒKÉWőj<<Ą€5Ń${ĶĮ‰ˆČ¾Q£ĢWÆvM@$5Õ¢6ÄĢ™—F¢¹ķ6s7ŻäńŻfä×IL4!Ä@FS•”˜’Z—•’āx»łóĶ-DÄä®ā(53gŗū 5;DˆˆˆˆˆˆˆÜaįBs£[7są"-Ķ<„¦šG†iˆūī3’MM5Oiię`Ēüł¶GŸl±;i’yŹČ؛ģÕĆ0 BDDDDDDäIIĄŹ•ę€Åœ9Ą5ט§éӁM›VVLĢ„au§O7—“šj.?>޼ܲõˆVkīŌbwéRs’“́Å"DDDDDDD®&Ī­gŁ"£¬Ģ¼ĢQNGå&%™§“4 (čR[åi4@V–ķr4 øŲm§®„“ɀȶõėŻ]"""""""×qeSW$iõm. 2uźTwWˆˆˆˆˆ,VæX 6~ĮģüŖŻ”m‰ˆš‚9DˆˆˆˆˆˆˆČė0 BDDDDDDD^‡"""""""ņ: ˆ‘×a@„ˆˆˆˆˆˆˆ¼"DDDDDDDäu!"""""""ÆĆ€yDˆˆˆˆˆˆˆČė0 BDDDDDDD^‡"""""""ņ: ˆ‘×a@„ˆˆˆˆˆˆˆ¼"DDDDDDDäu!"""""""ÆĆ€y„»+@DDDDDŌVäåå¹» Dä"l!BDDDDDDD^‡"""""""ņ: ˆ‘×a@„ˆˆˆˆˆˆˆ¼"DDDDDDDäu8Ź ‘›üłēŸØØØ°ł\@@®»ī:—ķkÕŖUšńńĮøqćÜ}ŲD­"DDDDDDnҵkWTUU²²²`2™…BwWČ£1 BDDDDDä&½{÷–ęO:“É„¾}ū2BŌ!"""""jÅŖ««qäČäęęBÆ×C­V#22}śōÆÆÆÓėX»pįžłē”––B„„„ąņĖ/G»vķÜ}ČD-‚IU‰ˆˆˆˆˆZ)A°iÓ&œ8q‘‘‘8p Ś·oģģllŻŗ&“É©u¬UWWcūöķ04h`2™°gĻTWW»ū°‰Z[ˆµRyyy(--EXXāćć]ŗtAii) PTT£ŃXļ:µŹ5ƒ:”””1b …»™ØÅ0 BDDDDDŌJUVVk-@AA*** B½ėXDŌj5 „£GāĄ¹\Žččhōļß2™Ģ݇NŌģ!"""""j„üüüåå嵖—••06Dάc)** QQQ0 Šjµ8~ü8²²²Ī;»ūЉš"DDDDDD­T»vķŒ¢¢"dff"""Bź,%@ufKŲ¹s'"""P*Ķ_ķPˆ< "DDDDDD­”L&ƈ#¤dNŸ> µZ=z wļŽR×gÖ±Ė.» 999Ų¹s's—›Aƒ!<<ÜŻ‡MŌ"!"""""jʏos¹J„B\\āāāģnėĢ:“&MŖõøgĻžčŁ³§»›Čm8ģ.yDˆˆˆˆˆˆˆČė°Ė ‘“V­Zåī*‘‹0 BDDDDD䤊ŠPwWˆ\„]fˆˆˆˆˆˆˆČė0 BDDDDDDD^‡]fˆˆˆˆˆˆ|yyyͶOµZ &`åŹ•Ø©©q÷) Ŗ"DDDDDD¤k×®HHHĄīŻ»qöģY‚€.]ŗ`Ų°aŲ¹s'Μ9Ó,ū5 X³f ƒ!Ōf0 BDDDDDä!är9āććqąĄäääHĖsrrąė닁JAWz½ŽŻ§€ČiĢ!BDDDDDä!ĀĀĀąė달¬¬:Ļä%˜C„ˆˆˆˆˆČCTTTĄ××*• ÕÕÕµžS*•šõõEyy9*++1xš`( „„„ //111Ąųńćkm§R©˜ƒ-b™łłłu¶W(Ņ6jµŚnY.\@ll,d2‚‚‚pśōiÄĘĘ0·ÉĢĢt÷i$/Į€‘‡(..Fee%zōč#GŽŌz®GØØØ@qq1@§Ó”k×®())Auu5ōz=ŹŹŹšēŸÖ)7$$¤Öc½^_g{Ė€ˆ£²Ąh4¢sēĪ(--… (//G§NPUU…ŹŹJwŸFņģ2CDDDDDä!AĄīݻѧOtėÖ J„ …ŃŃŃčÓ§vļŽ-­›ŸŸnŻŗIŻZ.\ø€€€©ūJ@@ʎ ›ū²ŽŽR}eåååį²Ė.C~~> °°½{÷fžjQl!BDDDDDäAĪ;‡-[¶ OŸ>0` ØØ›7oFAA“^^^zō聃ŖŖŖ°uėV 0*• ‚ ąšįĆØŖŖ‚ŸŸ_żXooÉQY€9`ҽ{wģŪ·PPP€¾}ūāŸžq÷é#/"kä62‹m•“_j~ü\œ«-Ö×÷įwŸ """""j8A>¶·Ģ]Ū.Y“’zr.L&LFL&#L&Ó„y“Éxń9ó¼ ųfÅ tī~¹›Ļ6QŪ7eŹ”z†‹“8Æ»8_ ņācq^\Æ @Å‚Åä4v™!"""""""ÆĆ€yDˆˆˆˆˆˆˆČė0 BDDDDDDD^‡£Ģ9iŌØQ[ˆ‘×a@„ˆˆˆˆˆˆˆ¼"DDDDDDDäu!"""""ņ0’ż7žxā Lš4 ·ß~;ž}öYģŲ±£Éå¾÷Ž{˜6m 1nÜ8TVVŗåųŠ‹‹Żŗņ LŖJDDDDDäAŅŅŅšžūļcöģŁøņŹ+Q]]ķŪ·cńāÅčŲ±#¢¢¢U® ųć?°xńb„……᫯¾‚Z­n±ćZ“hŃæh4šß?yDˆˆˆˆˆˆ<„ŃhÄ'Ÿ|‚{ī¹Ƈ(•J$&&"11±Ie FA&“!44“E-''GšwĒžÉó°Ė ‘‡8~ü8Š‹‹1ḟėeddą±ĒĆC=„GyŪ¶mœ;w·ß~;Ö­[‡™3gāĪ;ļÄW_}xżõ×Ļ>ūl.3«WÆĘ}÷݇G}üńn»ķ6äääąäɓ˜8q¢“_£ŃˆqćĘįĀ… 8vģī¹ē|ņÉ'xź©§ééé˜9s&’’’šČ#`’žż€%K–ąčŃ£Xøp!^żõ:]fsĮæžõ/¼žśė(**‚B”€N§C~~>–,Y‚W^yĖ—/GYYž}öYĄo¼¹üŅWÉÜÜ\|śé§˜?>/^ŒÓ§O£²²²Ö:¶ØT*”——#$$Ƽņ ōz=/^Œ'Ÿ|©©©7nRRR3gĪDPPęĢ™ƒēž{Ī%ĒCĀ‘‡P(0™L×ÉĢĢDdd$bcc}śōA‡°oß>ę\!ćʍ\vŁeP((,,“[ŽĮƒ˜˜Ą¤I“ B½u•Éd0 ?~< V«ńķ·ß¢wļŽ€ąüłóõ–åźć!ļĮ"DDDDDD¢}ūöØØØ€V«…F£±¹ŽV«EHHH­eĮĮĮŠjµŅcĖ&2™Ģa„““ĮĮĮŅć†äöP*•ҾAĄ²e˰cĒųųų ŖŖ `2™ P(ģ–įźć!ļĮ"DDDDDD¢{÷īĒŚµkķ®£ŃhPRRRkYIII£“” ¢¢Bzœ——'ĶĖåņZ-<ŹĖĖkm+“ɤłĶ›7cŻŗuxżõב’’‚¹sē:µWyDˆˆˆˆˆˆ<„L&Ì3šż÷ßć·ß~ƒ^ÆGQQ6n܈xĒŽĆĄQPP€ƒ8€‚‚ÄĒĒ7jŸ½{÷FVVĪ;ųć?¤@GXXŒF#Nœ8ųå—_jA,•——#000 X½z5@Æ×0籕ūĆÕĒCރ]fˆˆˆˆˆˆ<Ȉ# V«ńõ×_cɒ%P*•čŃ£fΜ‰Ė.» šĀ /ąĆ?„^ƇŸŸ^|ńE„„„HĮ‡†ˆŽŽĘw܁gžyaaaøõÖ[!“É “ÉŒiÓ¦įå—_FPP¦L™µZm³ĖŹČ‘#±aĆ$%%!22³fĶĀ©S§šüóĻcŃ¢E3f .\ˆU«Vį…^¶ qéń÷5r™Å¶J‹É€/5?ž.Ī‹Õėˆėū ‚šŒ»O5œuŅK[I0ķ%ĘtǶK-Ąæžœ “ɓѓɓÉĮtiŽd2^|Ī>ģŪ·;v„ ;v, G茵+:„„„›ū:xš L&x’ż÷„ēæżö[i~Ą€ųąƒ Bī6™™™ˆŒŒDll, OŸ>芔öķŪ‡nŻŗĮ`0`üųńp÷é%Į€yµŹr-L&“ &“&ńÆŃäīŖ5Śæ’żoōė×555˜1cśōé#“Z-Ο?¤¤¤ZŪčt:i>((Hš DYY™Ż}"88Ųęs‚ `ٲeŲ±c|||PUU0™LP(µÖÕjµ ©µ,88Z­ T* !—b@„ˆˆˆˆˆ¼š'w™Q*•HJJĀG}„#F ”””čŅ„K­V¢Ó§OŹŹŹ¤ ‡ŲUް°0Łlõ±yóf¬[·‹/Fpp0Nž<‰Ē{Ģf9%%%µ–•”” 44šœĄ•ČG™!"""""Æ6ģŚńv'O0bÄ“k×Ė—/`ī"sįĀģßæ››‹™3g¢““€9ššēŸ0sśōiōėg?0 •J…5kÖ@TTTąÉŠ]GōEuIDAT'ŸÄO?ż„ņņr"00ƒ«WÆčõz€J„’ZŸ 88xš ąĄ(((ŗö¹[ˆ‘WóÄ.3–d2|šA¼šĀ øńĘŃ„K¼üņĖųä“OPQQ„R‰;īøĮĮĮ())B”€L&ƬY³ Ó隊C”}ūö(..¶Y¾ęϟ%K–ą›o¾\.Lj#0~üxčõzlŲ°IIIˆŒŒÄ¬Y³pźŌ)<’üóX“hƌƒ… bÕŖUxė­·šĀ /ąĆ?”FæyńÅ"u›!r„Ę“9’YL€9Ø"N>|Øųšpq^|¬¶XG\ßW„gÜ}2ˆˆˆˆˆØįApųŲŽ2wm»dŃüėÉ¹ęĄ‡Ń„]o“{l—]Ž&“‚ ą›+0mśĢ–:­nqśōi<ņČ#X³f»«B¬}ūö)ō 'q^wq¾@åÅĒā¼ø^€‹ ‹Éil!BDDDDD^ĶG™i {("Oƀy5Oļ2CD¶1©*¢¢¢°vķZwWƒØE0 BDDDDDDD^‡"""""""ņ: ˆ‘×a@„ˆˆˆˆˆˆˆ¼"DDDDDDDäu8ģ.‘Ńétųā‹/°mŪ6TVVB&“!** wŽy'čīźµ ˆy÷ßÕÕÕx÷Żw £Ńˆ-[¶ą÷ßG\\”J%-Z„ÄÄDōļßæŽņ².Q[Ā€‘Ł»w/ž|ņI Fމ‘#GJėäää8]^CÖ%jK!"""""ņ QQQXµjbbb^ēł%K–ąčŃ£Xøp!z÷īēž{éééX¾|9 üżż1kÖ,ÄÅÅÕYwŹ”)˜3gVÆ^ 0˜0a–.]ŠöķŪ㫯¾Ā† ‚ `ōčј6md2™»O Q ˆy'žx ,Ą½÷Ž‹nŻŗaĄ€6lśöķ ˜9s&ŅÓÓ1gĪōļßz½‹/Ę«Æ¾ŠŽ½{cķŚµHIIĮgŸ}VgŻ“'OŚŻļ‘#GšŪoæįć?†ŸŸŹĖĖńī»ļāģŁ³čŅ„‹»O Qe†ˆˆˆˆˆČƒtģŲoæż6>śč#Œ;ēĪĆsĻ=‡’ž÷æ”Īśjµß~ū-z÷ī 0`Ο?os]G ÓéšŪoæįܹs ċ/¾Č`µZl!BDDDDD䁢¢¢… &ąŌ©SxōŃG±oß> 0 Öz‚ `ٲeŲ±c|||PUU0™LP( Śßo¼5kÖ`ÕŖU€nøS§Ne—j•!"""""ņp]»vEHHJKKė<·yóf¬[·‹/Fpp0Nž<‰Ē{Ģf9r¹¼VĖ‘ņņņZĻ÷ģŁsęĢ`NĘśŚkÆ!22cƌq÷) Ŗƒ]fˆˆˆˆˆˆ<Ĺsē0mŚ4l޼ƒPQQåĖ—£ŖŖJj¢R©PVVĄŌ D`` ƒ”0UÆ××Y7,, F£'NœüņĖ/Rėõė×ćĶ7ߔZ˜tģŲĮĮĮ īzCŌRŲB„ˆˆˆˆˆČCtźŌ O>ł$V®\‰÷ßÕÕÕš÷÷Gæ~żšöŪoKCńŽ3 .ÄŖU«œœŒ 6 )) ‘‘‘˜5kN:…ēŸ‹-Ŗµī[o½…iÓ¦įå—_FPP¦L™µZ “É„aĆ†įŠ”C˜1cd2 ®¾śj\{ķµī>-D65¦#—ĢbĢAqņą @ Ą€?€€‹óācµÅ:āś¾‚ <ćī“ADDDDD gŻĄV‹{­ܱķ’E šÆ'ēĀd2Įd4Įd2Ād2A0]š7™ŒŸ3Ļ ‚€oV¬Ą“é3Ż|¶‰Ś¾öķŪ§Š0\œÄyŻÅłr•‹óāzUj,&,&§±Ė yDˆˆˆˆˆˆˆČė0 BDDDDDDD^‡"""""""ņ: ˆ‘×a@„ˆˆˆˆˆˆˆ¼"DDDDDDDäu”ī®Q[Ń®];wWˆ\„-DˆˆˆˆˆˆˆČė0 BDDDDDDD^‡"""""""ņ: ˆ‘×a@„ˆˆˆˆˆˆˆ¼"DDDDDDDäu!"""""""ÆĆ€yDˆˆˆˆˆˆˆČė0 BDDDDDDD^Géī y+½^Ļ?’\z,“Éąēē‡Ž;bąĄ swۜ?žjµ÷Ž{Æ»«B­[ˆ¹™\.Gll,.æürāĉX¹r%NŸ>ķīŖµ˜³gĻāć?†N§kŅ6Ɔ ĆŠ”CŻ}8Ō°…‘›)•J\}õÕŅć`ėÖ­HOOĒwŽ …Bįī*6»œœ—lÓÆ_?w µ ˆµ2±±±8tč“Z-.\ø€N:Į`0`÷īŻČÉɁN§ƒææ?:wīŒĮƒĆĻĻPQQķŪ·ćüłóØŖŖBūöķqÕUW!44:_~ł%BCCqūķ·Kūśß’žAšĄHėtźŌ Ż»wĒĪ;”R©˜˜N‡æ’žpÕUW”gĻž€ŖŖ*dff";;åååšóóCTT† ___‚€O>ł#GŽÄ–-[PRRFƒįƇ£]»vX³f Ο?ųņĖ/1xš` 4ēĪĆ®]»PXX™L†vķŚįꫯ†F£±»u—™śĪ›3õ#ĻÄ.3DDDDDD­Pxx8 ““&“ kÖ¬ĮžżūŃ©S'Œ9]»vÅįƇń믿Ād2Įd2į—_~Į‰'Š»wo\qÅøpį~łå §ö)¶DŃjµ8sę ¢¢¢P^^ŽĶ›7ćŸžA=PYY‰Ķ›7Ćd2A¬]»{÷īEÆ^½0nÜ8 4'NœĄļæ’ĄœE.—£²²Ū¶mC·nŻŠ©S'`żśõ€”C‡"((pĶ5× gĻž0 ųż÷ßQTT„ÄÄD$$$ąĢ™3ų믿ģncĶ™óęLżČ3±…Q+$sāģŁ³(**B»vķ0räH@Ļž=QXXˆóēĻ#77&“ ÅÅÅčŅ„  ĄL9|ų0Μ9ƒŽ;Ö»O™LĄÜźcōčѐĖåČŹŹ‚V«ÅŲ±c‚3gĪ@«Õ¢¢¢eee(((@xx8ڵk“É„   tķŚĒŽCnn.:tč™LƒĮ€ÄÄDh4˜L&|ńÅ(--•Z²ųųų:wī ĄōéÓ!d2L&öģŁƒ¢¢"˜L&»ŪXrę¼uźŌ©Žś‰ū!ĻĀ€Q+# !!!(,,h4šZė…„„ąüłó(--•–ž{÷UyØü™É=!7RBnkČ)Ų…‚Ź„EWZZźŽß³gvķŚ„““4uļŽ]Ru0b†¬V«ŠŠŠTUUÕģI[]÷MNNÖ¤I“Zō¤§§ėĄŗīŗė4tčP…„„hٲeŗpį‚ßuøĀ!Ž‚XUU•¶nŻ*Ó4UXXØÜÜ\…††jŌØQ’Ŗ‡„“nŻZ§OŸÖ—_~©vķŚ)''GłłłjŻŗµŚ·o/Ó4ÆS§NiĒŽjÕŖ•öķŪ'«ÕŖ.]ŗ(<<\±±±*--Õ§Ÿ~Ŗ6mŚčūļæWDDD“BO)))JJJR^^ž¾śź+učŠĮ=ÉŖaŗóĪ;éW]®)ūöķS×®]Żm²Ūķ:~üøŽ;ęnkVV–ŗuėV§Œ÷Øž¼7/0Ć0tąĄIRdd¤ŗt颸'VµZ­š8q¢¾żö[8qB™™™Š‰‰ŃM7ݤČj­^/cĀ„ śę›o”‘‘!‡Ć”ääd 2ÄŻā–[nŃW_}„ģģl•––jųšįڼy³ß“®z³X,ŗķ¶ŪÜ«Ģddd(,,L)))JMMõ; ‘Ŗ—Ė-..Vff¦¢££Õ«W/ååå)//O„„„ź×Ɵśōé£Ķ›7kēĪźŅ„K2ށˆæļ ĮÉŅĢ2²”[ø¤I‘’¢$EKŠ©ŁwGz\ćŗ>Ā4Ķ'ż24÷|¾ęwØo·@”}㯠4ļ±łÕ+³8 †³zÅćā¾a8k¾«Ž7MS’\¾\<łūæmą‡Ļb±¼,鼤ʚ͵_^³_&©¢ęŲµļŗĪ!©Źc“$Ócóq:" čˆ€ C ‚:" čˆĄ5dģŲ±š:uŖĻļf̘”±cǤ]JMMUyyy _ąF ׻ݮĢĢĢZēNœ8”āāā@7 øjˆĄ5&--MŸ|ņI­sė×Æ×ĄŻ4ąŖA טQ£FéÓO?•išīsėׯ×ȑ#k]·~żzM:U'NŌōéÓµk×.IÕ½Iƌ£5kÖhŚ“i7nœ-Z$IŹĢĢŌŠ”CŻu8N„¦¦*''§Į:« \cŗvķŖččhķßæ_’tōčQY,uķŚÕ}MEE…^xįżįŠźÕ«5yņdżéO’$…††Źn·+??_ļæ’¾^yå½łę›*))iš¾ Õ \mDątė­·jŻŗu’Ŗ{mŒ?¾Ö÷QQQŚøq£z÷ī-I4h²³³e†$É0 Mž}ŗĮ{6V'p5 t-ļÖ[oÕ¬Y³ōųćėÓO?ÕK/½¤ .øæ7 CÆæžŗ¾üņK…‡‡ĖįpHR­a6±±±ī}«ÕŚh°įOĄÕ‚@®AķŪ·WJJŠV­Z„ØØ(uźŌIYYYīļ7nÜØ5kÖčŻwßUBB‚2335cƌFėõF<‡Ń4·N 2ר[o½Uo¾łfį2Ru«øø8?^+V¬$•——7Xg›6md†222$I’ś×ædµZ/©N Dą5nÜ8č'?ł‰Ļļāććuūķ·ė”‡ŅĻ~ö3õźÕK>ų`ƒuĘĒĒėžūļ×¼yó4mŚ4„¤¤(22R†a4»N ,Ķ,cń(ź±…KА))JR“¤˜š}×q¤Ē5®ė#LÓ|"Š/@ÓyĻįk¾ˆśęDŁ7žŗ@ó›/Ć0d8 †S†aČ4.ī†³ę»ź}Ó4õĻåĖõȓæšŪ~ų,ĖĖ’ĪKŖ¬Ł\ūå5ūe’*jŽ]ū®ė’Ŗ<6I2=6æŃCtD@Š!A‡@tD@Š!A‡@tD@Š!A‡@tD@Š!A‡@tBŻVēϟ×Ņ„KŻĒ‹EQQQj×®ś÷ļÆÖ­[»æ[“h‘"##5sęĢ@7»E\kσ0«ÕŖž={ŹétŖ  @YYY:~üøĘƎ;J’† ¦@7µYN:„5kÖč?žć?żƒ\D ĄBCC5tčP÷ń“uėVmŚ“Iwß}·BBBŌ«WÆ@7³Ł¾’žū:ē~Čσk\ez÷ŖøøXłłł²Łlu†˜ääähēĪ*((ÅbQrr²†Ŗ„„IRaa”¾śź+(22Rƒ ŅĪ;UZZŖ_żźW2MS‹/VBB‚FŽ©-[¶čܹsJHHŠšįƕœœ,IŖ¬¬Ō®]»ōż÷ß«¼¼\ŃŃŃjß¾½RSS%I:yņ¤¾żö[É4MµnŻZ©©©źŠ”ƒVÆ^­ÜÜ\IŅ;ļ¼£ŌŌT 0 ĪóŲķv}óĶ7ŹĶĶ•ĆįPŪ¶muóĶ7+11±Ń{ĶĮ¤ŖpJJJ’$•””Ōł®²²RėÖ­Saa”F­*;;[6l$9N}ņÉ'ŹĖĖS=4pą@:tHv»]VkõĻ@‹Å"«ÕŖŠŠ mŪ¶M]ŗt‘ĶfÓŁ³gµqćFI’aZ½zµöļß/›Ķ¦‘#GŖS§N:tč>žųc†!‡Ć”uėÖÉétjōčŃ=z“LÓŌ¦M›äp8”––¦ŲŲXIҘ1cŌ­[·:Ļc†Ö®]«¬¬,õčŃCƒV~~¾Ö®]«ŹŹŹFļ4=Dą*dš¦$łœg#""Bæüå/eš¦,‹ ĆŠīŻ»UXX(Ć0”ŸŸÆ²²2µmŪÖ=§}ūöZ¶lY­ś,‹*++5zōh%$$Č0 żć’PII‰‡ņóóUXXØääd9R’Ō­[7(77WyyyJHHišŖØØPii©’““5qāD…†V’ÜlŪ¶­ĀĆĆŻmpĶ!ā)''GEEEźŠ”ƒRSS%UA‡Rvv¶Śµk׹=€ęąæ®2¦iźģٳ’¤ųųų:߆”mŪ¶éŲ±c*//w‡'®²åå咤øø8÷ł˜˜…††ÖŗVŖžæÄ5ĢĘjµ*::Z•••ŖŖŖRYY™$¹æw‰Wnn®JJJd³Ł4fĢķŚµKŪ¶m“TāōčŃCC‡u÷Hiˆė>­ZµrŸ2dˆ† ā>¾Ō{ŽDą*sąĄ•””(..Ī=—‡§ōōt8p@×]w†Ŗ-[¶L.\$÷ÜžĆmģv»ŖŖŖš“²‹+ (..®u¾ØØHRuČ"U÷éÖ­›ĪŸ?Æ3gĪhļŽ½:xš l6›ŗvķŚč}\õ”––ŗĻķŁ³G»vķRZZšz÷ī}É÷¼ˆ@€UUUiėÖ­2MS………ŹĶĶUhhØFåózWša·Ūuüųq;vLŗpႲ²²ōć’XQQQŹĻĻ×Ö­[•””¤ĢĢĢ&÷¤hß¾½Z·n­Ó§OėĖ/æT»v픓“£üü|µnŻZķŪ·Wnn®6lŲ vķŚ©{÷ī’ä"ććڲoß>uķŚµNČc³ŁÆS§NiĒŽjÕŖ•öķŪ'«ÕŖ.]ŗųu ©D Ą ĆŠ$I‘‘‘źŅ„‹ ąžXÕ[Æ^½”——§¼¼<•––Ŗ_æ~źÓ§6oެ;wŖK—.ŗõÖ[µeĖ:tH­ZµRZZš ät:żn—ÕjÕĉõķ·ßźÄ‰ŹĢĢTLLŒnŗé& 0@V«UķŚµSß¾}uųša÷¤®ńńń=z“RRRÜķ-..Vff¦¢££ė"!!!š0a‚¾łęeddČįp(99YC† QLLŒbbb½ŠT–f–±x” õŲĀ%EHŠ”%)ZRL;ė8Ņć×õ¦i>č— é¼ē¤š>®ļ\ Ź¾ńך÷Ų|†!ĆiČ0œ2 C¦qqß0œ5ßU©._®Gžü}€ßvó9-Y²Dqqqš>}z ›ƒ f±X^–t^ReĶęŚ/ÆŁ/“TQsģŚw]ēTå±I’鱳"p Z³f Õ·o_ÅÅÅ)33S’˜oØA × ĮƒkūöķŚµk—œN§bcc•ššŖ~żśŗiĄU@®A?śŃ4aĀ„@7øj±X3:" čˆ€ C ׈x@ .ōłŻėÆæ®x Iõ(55Uåå咤ēŸ^ćĒ—aMŖ'55U¼"ļĄ³ĶŽķoīsćŚD ׈I“&iķŚµ2M³ÖyÓ4õńĒėŽ;īhR}‰‰‰Z·n¢¢¢d†žżļkįĀ…²ZÆüOÉēž{Nß~ūķ©ßó¹qķ"€kÄŲ±cU\\¬={öŌ:æ{÷n;wN·ÜrK“ź³Z­JJJ’ÅbQee„œN§āććņlYYYW¬~Ļēʵ‹@®‘‘‘7nœÖ¬YSėüš5k4~üxEFFJ’vīÜ©{ļ½WS¦LŃĢ™3ŻŹĮƒ5a½ōŅKš5kV­”#æżķo%I³gĻÖÆ~õ+-]ŗ“Ö=Ž{ļ=Ż’ż ¶ļĉ3fŒÖ¬Y£iÓ¦iÜøqZ“h‘ūūE‹iņäÉŗė®»tēwjŃ¢E2MS ,PzzŗžųĒ?źé§Ÿ–$­_æ^S§NÕĉ5}śtķŚµ«Ń÷S_ļś½‡Ģ|żõך1c†&Ož¬éÓ§kóęĶ~=®n"p ™4i’6lŲ ‡Ć!Ir8śģ³Ļ4iŅ$IRqq±üqĶ›7O|š~żė_ėńĒWEE…ĀĆĆURR¢„„½ņŹ+µź}žłē%U‡Ó§O׏•+kĶ%ņ’÷š6mZƒm •ŻnW~~¾Ž’}½ņŹ+zóĶ7URR¢żū÷kÕŖUzēw“jÕ*-]ŗTGŽщ'4ž|ÅĒĒė™gžŃóĻ?ƊŠ ½šĀ śĆž Õ«WkņäɶӟžŌą½*ć]æ§ĀĀB=ńÄš?¾žõÆé駟Öoū[={¶ĮēĮՏ@®!}ūöUėÖ­µiÓ&IŅ_|”6mŚč¦›n’$mß¾]mŪ¶UZZš$)--M‰‰‰Ś¹s§,‹ĪŸ?ÆiÓ¦)66¶Ž{Œ3FN§S[¶l‘$}÷ŻwŹĻĻ÷kHŽašjß¾½vīÜŁąóąźčZ–krÕqćĘiķŚµš8q¢ū»‚‚egg×:'Iv»]’¦V­Z5XæÕjÕŌ©SõžūļkĈZ½zµīøć………łÕ>ϰÅjµŹ0 żųĒ?Öo¼”÷Ž{OĖ–-“$Żu×]š5kVI\ ĆŠėÆæ®/æüRįįįīŽ0Ž“É^j×ūJLL¬u.!!A……… >®~"p¹ķ¶Ū“hŃ":uJ;vģŠ’ū’Ļż]RR’~üćėŻwß­S.++Ėļ‰D'Ož¬·ß~['OžŌŗuėō÷æ’ż’Ū}ć7ź™gž‘$=zTóēĻWJJŠnæżöZ×mÜøQk֬ѻᆱ„„effjƌ ÖŻœ2®÷UTTTė\QQ‘~ō£]ņó"°2ט6mŚ(55U’õ_’„Įƒ«uėÖīļ¬œœ÷„¢§NŅ“iÓtīܹ&Ż#>>^ćʍÓļ~÷;ŻpĆ ²Łl—Ōęµkןwæū*++%I:tPBB‚»GXX˜»%%%ŠU\\œĪŸ?Æ+VH’{T_+ćYæ§““4åēē»'žŻ½{·ņóó5hŠ ĖóĒĆC × I“&iŪ¶mīÉT]āććµ`Į½ōŅKŗóĪ;õšĆė—æüe³–ӝ>}ŗŅÓÓ5uźŌKnļ-·Ü¢ččhM:U“&MŅĻžsõė×O·Żv›$iāĉść’Øūļæ_ćʍS||¼næżv=ōŠCśŁĻ~¦^½zéĮ¬·žĘŹxÖļ)11QžóŸõā‹/jņäÉZ°`^|ńÅ:ĆhšĆӜE•-›T=ģʵ…KА))JR“¤˜š}×q¤Ē5®ė#LÓ|"Š/@ÓyĻĮąkN†śęiDŁ7žŗ@ó›/Ć0d8 †S†aČ4.ī†³ę»ź}Ó4õĻåĖõȓæšŪ¾ŗ¤§§ė©§žŅæ’żļ:ó|õ±X,/K:/©²fsķ—×ģ—IŖØ9vķ»®sHŖņŲ$ÉōŲüĘ, Éģv»žūæ’[÷Ž{/a~ųÆ4ÉŪo歉'ŖGš6mZ ›4 «ĢšdÖ¬Yš5kV ›\zˆ€ C ‚:" čˆ€ C ‚:" čˆ€ C ‚:" čˆ€ C ‚:”n«óēĻkéŅ„uĪGGGĖf³iŠ AŠ t3/ł¹,‹¢¢¢Ō®];õļß_­[·¾¬÷ė­·d±X4kÖ¬@æ \Åč!fµZÕ»woõīŻ[½zõRLLŒŽ9¢?žX†aŗyuœ:uJ‹-Ryy¹_ĻuĆ 7ØU«VŹŹŹŅŖU«tņäÉæŠTō€ ÕŠ”CŻĒ†ahŊ*..VqqńeļQŃTß’}³žėĄŚŗu«6mڤ»ļ¾[!!!-v/ ©Dą*äźbµVwģw8ڳgŽ?®²²2EEE©cĒŽ4h"""$Iv»]ß|órssåp8Ō¶m[Ż|óĶJLLō«Ó4µxńb%$$häȑڲe‹Ī;§„„ >\ÉÉÉZ½zµrss%Iļ¼óŽRSS5`Ąæž©wļŽ:xš Š‹‹•ŸŸ/›Ķ¦œœķܹS²X,JNNÖŠ”C•Pļ½*ćbµZuāÄ mŪ¶MeeeJLLŌ°aƔœœ,IÖqņäI}ūķ·***’išjŻŗµRSSÕ”C撍ՁĄbČ XUU•¶nŻŖ­[·jĖ–-śšĆU^^®:(!!A¦iź£>ŅŽ½{Õ½{wM˜0A PVV–Ö­['©:@Y»v­²²²Ō£G }Z§OŸV~~¾Ś·oß`UUU2MS*--Urr²&NœØŠŠźŸŠ999¾Ėøøøė@ąń—€ ×/~ń IŅīŻ»µcĒŁķv÷gׄ¢EEEśä“Oj• UII‰{ˆM«V­Üß 2DC† ‘$9r¤Ń:RRRÜĒ®”#V«UŃŃŃŖ¬¬TUU•; hÓ4uöģYIR||¼ ĆŠ¶mŪtģŲ1•——»Ć×µ¾ų[&,,̆HRll¬NŸ>­ŠŠŠFėˆŽŽÖ˜1c“k×.mŪ¶MRu€Ó£G :ŌÆæGJJJƒuø‚\Enŗé&uķŚÕ=Q©7×Ü(¦iŖ°°P¹¹¹ ÕØQ£$É@Ųķv?~\ĒŽSDD„.\ø ¬¬,uė֭νü)cš¦¬V«>’üsuļŽ]gĪœŃ™3g«””ååå5XGLLŒ6nÜØvķŚ©{÷ī’äī­¶mŪ6ś.‹ŠŠ“aƆzė@ąˆĄU¦{÷īŚææ •žž®Ž½{ė¶ŪnsÆj’‘‘”°°0„¤¤(55ÕdL˜0Aß|ó222äp8”œœ¬!C†ø{4ųS‡?zõź„āābeff*::ŗŽ@Äsn”ČČHuéŅE p÷VéÕ«—ņņņ”——§ŅŅRõė×O}śōŃęĶ›µsēNué҄νü)c†bbbtć7jūöķ*//WJJІ.«ÕŚhÓ¦MSß¾}uųša÷D«ńńń=z“{XQcļ²]»vÖĄ²4³ŒÅ£lØĒ.)BR¤¤(Iђbjö]Ǒ׸®0Mó‰@æ Mē=׃ƹź›"eßųėĶ{l¾ Ɛį4dN†!ÓøøoΚļŖ÷MÓŌ?—/×#Ož>Ąoųį³X,/K:/©²fsķ—×ģ—IŖØ9vķ»®sHŖņŲ$ÉōŲüĘ,. čˆ€ C ‚:" čˆ€ C ‚:" čˆ€ C ‚:" čˆ€ C ‚:" čˆ€ C ‚:" čˆ€ C ‚:" čˆ€ C ‚:" čˆ€ C ‚:”nüPģŻ»7ŠMŠBDĄOmŪ¶ t“†Ģ€ C ‚:" čˆ€ C ‚ą²ųӟž¤3gĪH’ģv»ęĢ™£ŅŅRIŅŁ³gõĢ3ĻŌ[¶¤¤D/¼šB ”YŽ;¦¹sēźąĮƒõ^³téR:tČÆśŹŹŹ“hŃ"æļęĢżę7æŃ‚ “`Į=÷ÜsZµjU‹=ŸÓéŌ£>zł^ąB ø,zöģ©Ć‡K’>¬öķŪ+##C’”‘‘”^½zŗ‰ ŗpį‚.\Ųär7nԌ3ōÅ_“H;Zµj„ٳg7©ŒĶfÓüłó5ž|=żōÓ:qā„ŅÓÓ[ä¹CBBÖ"ĻH”nąŚŌ³gOmٲE#FŒPFF†ĘÆC‡)55UJKK“išZ±b…Ī;'IŠ×Żwß]§®>śHGUxxøœN§ĘÆė®»NĖ–-SYY™,‹"""4sęL9rDŸ~ś©āć敛›«®]»Ź4Méܹszä‘GŚč}W­Z„£Gźƒ>Š]wŻåó^!!!µŹ”””Ø  @Ɔ Ó×_­¢¢"%&&ŹįphńāÅ QTT” $UCµµ¢¢Bƽöšžzź)eddhƆ ŠUyy¹ŹĖĖ5o޼ ‹Å¢N:©  @v»]K–,QXX˜*++Õ¦MMŸ>][¶lѾ}ūdµZ•˜˜č~ī£Gźž{ī‘Ķfә3gōÖ[oé©§žRddd ’½.=D—Åõ×_ÆcĒŽI’Nœ8”Aƒ)''G’täČuļŽ];vģPHHˆęĢ™£9sęH’vļŽ]«žƒ*''GæłĶo4gĪĶ;W×_½¶oß.«ÕŖ|PsęĢQTT”¶oß.‹Å¢ŅŅRŻ{ļ½züńĒõÅ_č'?ł‰fĻž­„„?~ÜÆū>\;vŌ”)Sź½—·Ķ›7kŌØQ’¤[n¹E›6m’$mß¾]m۶՜9stß}÷Én·K’_mõd±XTXXØ{ļ½WsęĢQ«V­”••ÕąßįģŁ³Śææŗwﮘ˜Ķ;W³gĻÖ¼y󔕕„ĀĀBY,Y,=šĄµž{̘1ڼy³$iėÖ­9r¤$)"""Š’^—Œ"€Ė",,LmŚ“ŃįƇ+«ÕŖ„„edd())IįįįŹĶĶUfffƒC4N:„N:Õ9ŸŸŸÆŽ;ŗm6›NŸ>­¤¤$„¤¤HŖŽ«ÄÄDIRTT”‡_÷õē^žœN§vģŲ”ųųxmٲE’TTT¤‰'Ŗ  @mŪ¶­UŽ„±¶z³Łl²X,’¤ŲŲXŸ×äääč/ł‹,‹bcc5}śt„¤¤ØØØHĖ—/WLLŒ,‹Ī;ē.ļŁ>—žżūkõźÕŖ¬¬Ōžżūõä“OJŅ5ŃC„@pŁōźÕKėׯwĻҽ{÷ZĒ6›Mv»]3fĢØU®¤¤Ä½ß¾}{}žłēuźNII©Õ;";;[]»võ«]õŻ×›a~ßk×®]źÓ§¦L™ā>·jÕ*ķܹS‰‰‰ŹĻĻ—$™¦©ģģģĖśŽm6›{ģ±:ē·lŁ¢=zhģŲ±²ŪķJOO—iš’$«õā ×s‡„„(55Uļ½÷ž®æžz÷МĒü²¶’J`Č ą²éٳ§ŅÓÓÕ½{wIR=tąĄõģŁS’”šš*‹Å¢×^{M‹/Öāŋk…!®::w_~YƾśŖ^}õU„§§kŠ A2 C .ŌĀ… åt:•––ęW»ü¹oėÖ­uöģY-Y²ÄÆ{mÜøQ7ß|s­s7ß|³>’üs >ŽD\I7Żt“¾łę½łę›ś÷æ’­jåŹ•õ>·$5J[·nuŗpį‚ęϟÅŪŽŅ,Ķ,cń(ź±…KА))JR“¤˜š}×q¤Ē5®ė#LÓ|"Š/@Óy’Øóõ#ƾ~(ūĘ_hŽcóe† §!ĆpŹ0 ™ĘÅ}ĆpÖ|W½oš¦ž¹|¹¦ß÷«æmąŹĖĶĶÕŹ•+5o޼©Æ]»v/K:/©²fsķ—×ģ—IŖØ9vķ»®sHŖņŲ$ÉōŲüʐąÓśõėµwļ^Żwß}nJ‹#>?^ćĒt3. ęA‡@†ĢZŌ™3gōģ³ĻŖC‡µĪOš4I7ÜpC ›× ²²2½ū={v‹Ō·téR 4H7Žxće½÷…ܾ¹P”mŪŗĻEŽŠSQ©i*łæ•0żž&Õē8–„ņŪ•š³»k7ŹķĶŖļjD hq6›MO<ńĆ[L“U«V-†\é{‡µļ Ö³ź–÷;¼øpAÅļÆPŒ{%IKŻ…i­Ń1×D"ˆ® ^xA³fĶRrr²ņņņōæ’ūæzā‰'“bÅ ;wN’Æ»ļ¾[[¶lѾ}ūdµZURR¢{ī¹G6›MgΜŃ[o½„'žxBĖ–-SYY™,‹"""4sęL9rD6lPll¬ŹĖĖU^^®yóę)44Ōē}<•””čµ×^ÓSO=„ōōt­^½Z‹EwÜqG­Ž-v»]K–,QXX˜*++Õ¦MMŸ>]‡C‹/VHHˆ¢¢¢TPP IŹČČŠ§Ÿ~ŖųųxåęęŖk×®2MSEEE:wīœyäUTTøļ‘‘įóĀĀšō¾²R½³DIsę©üėÆd”—«ÕŲń*żdB[+zšĶŸżÓuįä÷*żd"zÜ gY‰J>ü@Fi© G„ZϜ%£ņ¼»¾Źļ2T¶ńSIŎ»Uį]»śß«ID-.''G ,ØuīŃGÕ°aĆ“mŪ6Mš4I_żµFŒ”;v($$DsęĢ‘$-_¾\»wļ–Åb‘ÅbŃ< ;wjóę͚>}ŗ¶nŻŖ‘#Gjūöķ²Z­zšĮ%I+V¬ŠöķŪ•””¤ĀĀB=ōŠC²X,Z“h‘²²²TRRāó>żū÷÷ł éééŗłę›ÕÆ_?wˆā£¹sēŗŸ{ī9źąĮƒjŪ¶­¦N*IzöŁg%U÷¶(--ÕÆżk9N=üšĆzöŁg•˜˜ØÅ‹ėųńćjė1ÜÅb±ų|†††]8•­‚EÆŗ£ QÄõŻ/ß<\ÅļžCåŪ¶ŹY\¤ŲŸŽV«|ōĄĮrž-PģOo“ćX–Œ2»ā~ń+ÉbQń{Ėå8ł½B“/¶Ńń]¦¢ś§*ņʞr––ś_®ÉD-Īf³ižüłuΧ„„éĻž³næżvķŻ»WO?ż“>žųceffjįĀ…u®w…żū÷×źÕ«UYY©żū÷ėÉ'ŸŌڵkÕ±cĒZ÷<}ś“’’’d³ŁÜC>bccåp8”››[ļ}|?~¼V®\©ÆæžZ?ūŁĻj}WTT¤åĖ—+&&F‹EēĪ“ĆįPAAA­`Ćf³¹÷SRR$I!!!ŠUbb¢$)**J‡Ćē;ō~††ų2c”•Ö:Ž3V’ó’~ō›łjLhŪ©ęžÖØ(™Ž µ¾>R„Ÿ¬QÅ®Š»ķæŽéՄ@pÅDDDØcĒŽZ·nŗwļ®ššpŁl6Łķv͘1£Öµ[·n•ÕZ½8jHHˆRSSõŽ{ļéśėÆWXX˜RRR”••å¾>;;[]»v­÷Žõݧ>'NœŠ=÷Ü££GjƆ µę÷Ų²e‹zōč”±cĒŹn·+==]¦i*11Qłłł’$Ó4•čW~‘aØō“5J¼ē*Yūjż‹ū݁‡$É"Étś]]UNŽāļ˜,lj²ołņ7· ÅåääčÅ_¬unŠ A3fŒ†®—^zIO=õ”$)55UGŽŃkƽęž#ćē?’y:G„'Ÿ|RĻ<󌻾ļ¾ūĪŻć#&&Fiii:räˆĻ6ÕwŸøø8Ÿ×Ÿ?^ūŪßdµZ5vģŲZ߯tÓMZ¶l™Ž;¦ččh 8P+W®ŌģŁ³õĘočÕW_Udd¤āććešf‹½WĆ0ōč£ź•W^irٲ ėŁė&Eō섪¢B•mX§Vć~źž>$>AU…:÷Į{Š0°ŃśĢŹó*üß·e±Z3tx‹=ć•bif‹GŁP-\R„¤HIQ’¢%ÅŌģ»Ž#=®q]ašęośau~ģłśńWßĀ@”}㯠4ļ±ł2 C†Óa8e†Lćā¾a8k¾«Ž7MS’\¾\ÓļūU€ßvpĖĶĶÕŹ•+5o޼@7— ]»v/K:/©²fsķ—×ģ—IŖØ9vķ»®sHŖņŲ$ÉōŲüFĄUożśõŚ»wÆī»ļ¾@7ץUoüųń?~| ›kˆ5Š AÆå&Zń:—;¹ā @cč!‚øŚµųV™€¶wļŽ@7øāśöķŪÕ\±©7.%1%Y®TCą‡¢…~øŒ®Ä³ž}łq'²‚fē Ģ!®¤«¢SÄå DL?ŽÆŠ®8Ók“üaŅb.g‘śBļ$ ø5†\–Ü „‘ś‚ ‚P€ą`6į»Ė–“t‘śB_½BLŃC€`äϐ³2—ģR–ŻõlÆŖ‘óõ=4\VūĖ‚@7į²;yņ¤,X öķŪ»ĻõéÓG?żéOŻ“F;vL ,ŠÜ¹sÕ³gĻ­;33S_~ł„žó?’³YåOž<©•+WŹįpČįpØOŸ>š8q¢¬Ö–éoP_ū¾’ž{½ōŅKźŠ”ƒ$)""BwŻu—:tč 3gĪčŁgŸU§N$I•••1b„FŽY§ž‚‚żżļWrr²fΜŁ`[žēžGQQQ>ßÕŚµkučŠ!Y,ŻpĆ š0aBSÓTż%.uŠßZ"ń÷ė;o“ă€æyņ÷M.óņŸŸ t³›¬sēĪzģ±ĒüŗöĀ… zė­·4gΜ@7[7nԌ3ōÅ_“x "I‹„YåŹĖĖõśėÆėĮTĒŽe†Ž~ūmķßæ_}ūö½ģķėŅ„‹~ųaIÕĮĢ믿®ßžö·’$›Ķ¦łóēK’ĪŸ?ƧžzŹg ņłēŸkŲ°aśī»ļlĆW_}Uo;Ž=Ŗ¬¬,=žų撤æżķo:v옺téāļ#šj8‘®ĄČ’ĖˆŌ÷Ą†×§k®˜ā³y~_[Q^č궘}ūö)==]wß}·$é­·ŽŅˆ#“gĻ=zT|šīŗė.-[¶Leee²X,ŠˆˆŠĢ™3uäČmŲ°A±±±*//Wyy¹ęĶ›§°°0wż†a4»¬$•””Ø  @Ɔ Ó×_­¢¢"%&&źąĮƒśģ³ĻŌŖU+•——Ė0 Ķž=[UUUZ²d‰ĀĀĀTYY©6mŚhśō钤>śHGUxxøœN§Ę/I:wīœžńؤ¤Dēϟ×o~󅆆jŊ:wīœ$)>>ŽżŽ\öļ߯^½z©cĒŽ’$«ÕŖūļææĮēNOO÷ł¾»wļŽ¤öyėŲ±£śöķ«½{÷Ŗ{÷īµŽ’‰'”’’āóļ?uźT„§§7ų?RPP mŪ¶iźŌ©śģ³Ļź|ųšaõļßß}ÜÆ_?>|ø)ˆwą\‘N-ˆ˜—°ˆ@ ūžūļõā‹/ŗGŽ©ččhŸ×>\łłłš2eжmŪ&«ÕŖ|P’“bÅ mß¾]III*,,ŌC=$‹Å¢E‹)++K7Üpƒ»žķŪ·7»¬$m޼Y£F’$ŻrĖ-Ś“i“ī¼óNY,jīܹ²Z­zļ½÷“}ūv1BsēĪu—ī¹ēTXXؼ¼<åääŌ 233UVV¦‡~XV«Uo½õ–²²²TRR¢w™åĖ—k÷īŻµ~ų)))Éēū«ļ¹cbb|^šąĮ&µ/**ŖN®w*I999śĖ_ž"I*++Ó°aÚżóĪ;ļhƌr:>æ·ŪķjŪ¶­ū8::ZyyžŒņ€ų»µ˜K DkŒæaCf …ł2³oß¾FĖåēē»{AHÕĆ1NŸ>­¤¤$Łl6÷PŠŲŲX9Ž+ėt:µcĒÅĒĒkĖ–-’ŖCˆ‰'J’:uźäž«£]»v*,,TQQ‘–/_®˜˜Y,;wN‡C§NrĻ©įĶf³¹ė‰ŽŽ–ĆįPnn®233µpįĀzßK\\œŽ9ҤwV_Ɖ¦¶ĻW ręĢ÷=m6[­æõ›o¾©={öØ_æ~ž½=}öŁgźÕ«—l6›Nž<éóW/»Ż®ŲŲئܦ¾^!ž„ -ĻŪ$Ķ DLIē¼Ģ×Ų×wNc£ęp™…‡‡Ėn·K’LÓŌ©S§ÜßFuēż””eee¹Ļggg«k×®~Õ)ewķŚ„>}śhŹ”)īs«V­ŅĪ;W«­yyyj×®¶lŁ¢=zhģŲ±²ŪķJOO—išjß¾½>’üsæß‹Ķf“Żn׌3꽦oß¾śšĆkĶ—±råJuīܹŽē®ļ}7µ}޲³³µoß>Mœ8±V8įéĀ… M®·¬¬LŁŁŁŹČČPEE…Īœ9£Ļ?’\cƌq_Ó³gO}ųį‡1b„$i÷īŻšßwĻž=›Ō>éāź;†aČjµjΜ9Љ‰Qyy¹rrr“`AõźIUUUźÜ¹³»].N§S/½ō’ģv»ŹŹŹ“`ĮM™2E;wÖ£>ŖW^yEwÜq‡ūś“'Ojżśõ3fŒ Ćp_Ó¹sgõčŃC ,ÅbQŸ>}jõŽńƒ«c„kó5—ˆÆŃ$-:ŗ¤ySėJžė …Ø:X ‘^³EHŠ”%)ŗę3Ņc ÷ŽLÓ|¾% Ą•ašfƒĒõ TŁ7žŗ@<łūZ“Ŗś EnP=L£ųlž*ŹĖōĻåĖ5ż¾_]™—Š::¤;v4ŗT,®~ķŚµūƒ¤JIŽšO×~…¤ó5Ÿ®Ķ^sĪuCÕ!J•j6irG‹–Y(ł¢†ę ńćōŚÆŗ¬oąŻÄ3 Šā\a†ēؑ*ÕĪź›c¤Å47©ÆŪJ}AˆÓǾgĀ"ŹŠ†\n¼ńFz‡\;œ>6Ļé5¼ƒ‘¦L“ź·–šC¤± T]H•ŖC˜šOKĶ'=Dœ+! .« [•×ę™!x‡".-2iKNŖźŁHļį1UŸ!5횿ĢęĻe-Š0øģŗˆ8t1 ń H¼‡ŌųZmę’\J Rßņ»ŽHUĶ}ŗŲ+„€ąT„‹”ˆ÷§woļ¹D¼5{^‘–ģ!Rßä©®”Ē‚øėł`pEōķ?@/’łYżüī»ż.óĻåĖÕ·’€@7øVøV–q!Ž”ˆ+qe ŽsŠ“ˆK D¼'6ńÕ;ÄŖŚ=CäU†@ĄÓĄ@IÕ!‡æśö žź<³-Įs©]ļ^"Ž=E|…!-²źLs‡­x–óœ$ÕŖź%DR˜¤ššć0Iūaß»>ý¾wÕźQwHĶfQķ „„—¾™Ŗ•Yļ‘#žC`\½?¼{‡Ty÷ī-āPŻŽ"®łE<ŪŌ$-¹ŹŒ”źpĀõéj¬t1@ńløē ó^™ĘuMØź®Lć‚X=ź·xŻ “Óǧ÷oy_ ­8U;ąh(üšµśŒ«>Ļ{^²– D\óƒx"Æk¼'C WŻ4ÉūåYU»‡ˆ+üp…!V‚p„ųŗāŻKÄTķ@Ä3ģØoˆŒĆćZļex›\µÉZ"ńœ ÄŠxöņóžįż0®—ęZ¢×5dĘ¢ŗ«Ō4“Z ! -Ćlą¼w(ā™ x/øāźā„x Ž=C|õB¹äP¤%W™‘ź›ńĻ"ßį‡w/ļ—ē91«ŌpBĄågśŲo(ńœ+ÄsˆL„.žöw]ēYĪ»¾ÓŅCf¤ŚCf¼ÆńoTߋ4t±gˆkī©nŅPpłx’Ī÷^QÖ»—ˆēĻ"ž=H<'Lu ńC:dĘ»g‡ē9WC­Ŗ½,Ž÷µ.¾zˆ„Ō<“ēŖ2Rķ`DõŌ.Æś::xŸ©ņųō\mĘ„8½Ž½WŖń' iV@ŅRsˆx÷ńl°Uµgƒõn¬ÆŽ!!ŗŖxĪ"±š W _ĮˆÆIV}-æėyĪ3 qõ qŖī0œśīŪd-9‡ˆg0ā|x†!Vė½W”ń|QV]\aĘ×|!ž†!„&4_S‚_s‰ųš\Õ3q7ä»wˆÆ¹H[DKOŖźŻ8Ļ#®pĆuĪózļ•iBtq2ÕĘę !ōąŹšgČJ}½D<‘†‚_+Ó¶Xār)ˆw‹|÷qq=µę3ÄĒĖņ|I¾z‡4§—ø| D\C_|õqŖī$Ŗ¾Āļū“H‘Ė1dĘÕĻ}OžēŁ#Ä3ńC|M¦z© —Öū¢”¢”ex›Ņ+¤”Uk›ķR_«Ķxgś8ē¹ē ņœ@ÕW ¢zīGøĄ•ÕŠšĻłD½CļdL5†4åž~ké9D|… ¾øĀļez->6©įž!„!\yĶ'ālxi,©ļ³E“T˜ŠPHaią³¾š£¾0¤¾6Špå˜~œ÷hųÓğ¹B.9iÉ ”±ąĀāĒē„ō!ąņkŹ0–śBłńŁX—¤„CzoXŁolāT‚®N …M]1Ɵ%~›ķr„ MéĮįoƒ+Ł~ąŸĘŠęōöšg8Ī%»\Ā„„ üšųX4'ģhŃ Äår‡ M©æ9m! pšVų[ę²!.W2Pø\+Ś€Ąk‰ć²† ž.lÜ®Xāķj%®öö€ś,𮐒 Uš³Ł|ƅ%tEXtdate:create2013-09-04T19:29:40+04:00üøĆķ%tEXtdate:modify2013-09-04T19:29:40+04:00å{QIEND®B`‚apache-couchdb-1.6.0/share/doc/build/html/_images/futon-replform.png0000644000175000001440000014577712332105522025346 0ustar00djcusers00000000000000‰PNG  IHDRD8cµ<£gAMA± üa cHRMz&€„ś€ču0ź`:˜pœŗQ<bKGDłC» pHYsÄÄ•+€IDATxŚģŻw|TUž’ń×dRIH'i”…"%Aé”(¬ØÄÕU• »Ų•µ+ĮUÄ]’Õµ`YāŗźŖ(ˆŹW!AŠ‚H/ 5„@*¤Ļüžfœ$3)dRŽĻĒć>rēνēž;Ń]ēs>DDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDź…ĮÕhężēĢ®ī€3® vˆˆˆˆˆˆˆ“n. L3”؏{)DiŗĪ7ąh“€¤”†ŗ“.}Q@"""""""ā:ē`Ōöš G*PØ©]C]+"""""""®SSˆa>‡ė$iˆpĮP‡ć†:¾nŒž‹ˆˆˆˆˆˆHķÕ5Ģ0×įżŚŽ§Īź;PØkčaØęXmŪsõ3‹ˆˆˆˆˆˆ“ QÄģą½źŽÕ¦­óVŸį@mG{T÷ó\’†xq¬.#BĢÕütö^uū5ŻæÖź+DØĖ(Źˆż†“×ÕõWAˆˆˆˆˆˆˆHć«ij‹³¤ņu HŖ»w­¹×Ćp®#Aģ77'ĒµQŻżEDDDDDD¤qTTT9LT BL•Ī©ī†Jējq]µź#±W—Ä>q«“ļ,źG£ˆˆˆˆˆˆˆHćØM½Źį‡Énß@ՐĞ:ƒ“Ÿõā|‘sS91ŚķWG°ūYŪz"µy_DDDDDDDjV›š!Ī ¦VCŹł=±föļ;»‡£Pä¼’ś!bå, q„Ųo•Ć‘ŗÖ‘ĘēhŖŒu³AÜξ.§ā÷zė{öĮˆŁīœz]rĪ/©Ķņ¹ö›‘Šaˆ} ān÷ÓY(5OŸ‘†SS!Uė¾żčėf BJ±|Ÿ/ÆŌ†5q£b(bUÆ£Db„HuÅRķĆūĽŅėŚŽ©®"""""""R?j:8›*c B¬ßńĮł÷vS5ļ×ė(‘ś D*Ü°3*×±bŻ<Ø9ŗ#"""""""Ņp­2ćhtHŁŁ­ņ÷|ū}khR^©-ū"¬ŽīyNĪ5q6mÅQxQ9 ±†öˆæ"ī•αOWuōZDDDDDDD޳åv"Ö £ņw|ūüĄz½©R›ÖZ#nT\…ę¼§Ķ4ōė[kˆŲoöˆUC‘ŹEVķ?,q½Ź«Ģ˜ģ~VDJ+]gp€e‰ż÷|ėuÖ`źq鯜 DÜ*ķW^N×~“Gåi2޶ʁˆż¼•‹µŚS@"""""""Ņšź²Ģ®5Ų°nV•g°„"•Ūµ®@cm×¾čź9«ļ"Žź†Ų×qT7ÄŁf¢øįøH«£Pľ?"""""""ržŖ[]¦ņVytˆ5аŸ.cƄźæć›+½ß$Fˆ8Z·rā(©†xņūČGˆ}0UƒūžˆˆˆˆˆˆˆHż2;9V9±No±!b ćØęØõXUg‡T¾‡} rŽVė{Ł]ūĀY­ė¾§ŻO»×•W›©<żĘ>pQM‘Ęc@Ų× ©<2Ä~¹]w,‡K‘ŹßéķæļWž2Sy«7ēˆœ³·ÕQy4ˆ'5×±Dœ…"ΦшˆˆˆˆˆˆHĆq¶šLå@ľ~ˆżr»•:ł=,©¼źŒ£‘'ΦĶŌy*M}×q6BijŅĻ*!Httō’zģ‹ˆˆˆˆˆH½IMMąŌ©S®īŠH³g0ną÷ŗ!•k‹X÷ķĆū:$õ6J¤>ūĒ>é©©^HåMDDDDDDDZ>/ŖŽ±Ÿõa?ڤÜĮ9ÖÜ”¼–÷sؾėOėÜgÓf<ķ¶ŹSdDDDDDDD¤åó¢źź±ÖbŖ•‹±Zsūp众܅†_v×¾ˆ³‘! DDDDDDDDZė,‘Ź „Ų×±†!•sk‘óž:S_ADå0¤ņū`¤ņŖ3 DDDDDDDDZO»}ūZ!öAˆ5KØ<­ę¼§ŹXÕWįęąµżfˆ8Z‚WˆˆˆˆˆˆˆHė`ŸXƒw,A‡}ūĶ^½L›q;ߨŗÜ­›ŻqG”ˆ£}""""""""­ƒ;ægö³J…!ö‹øŲ3ŌźNÕØ@ÄQ{• £TžNc}@ėƒ+iģg‘øUŚw“śŒ³P伜oc†jŽŪW‰­ü@ö£DŒŌ0#"""""""M“}}k.Py– 8^’׎y©ļUfż“A*’“ųza4>|8ƒ¦]»v˜L&Nœ8ĮO?żÄ¦M›0›Ļ»ķ9»÷Ž{9zō(Ÿ~ś©ĖśPmŪ¶%??æQīõę›o2dȐ ĒΜ9ƁxēwX»vm½Ž/$$„o¾ł†9sꐔ”Ä{ļ½GJJ ūŪßåyEDDDDDZ±Źƒ$ āĄ ū•G‡œ÷T«ó D NŽŁ§7•÷­V9ż©—@Äh42sęLŗvķŹśõėłæ’ū? ½zõāŹ+ƤOŸ>¼÷Ž{˜Lõ²dq}żõ×ŗäŽēĀĒĒ233å~ūöķcžüł¶×mŪ¶eźŌ©¼ōŅKÜsĻ=üšĆ vļW_}•¼¼¼zmó¾ūī£ØØˆ7ß|³Įś-"""""Ņ U bŸpž-8Ė!ĪiäC}.»[yßąd«œ]»vUC¬öīŻKjj*ƇgŻŗuÜwß}œ:uŠ’ž÷æ¶snŗé&‚ƒƒyłå—1 Œ?ž‹.ŗņņņŲ¼y3kÖ¬±M»yžłēY¶lC‡„°°__ßjŪ¬łä¶lŁĄ˜1c=z4Ļ=÷\ƒü"Ož•§ĢxxxpĻ=÷0yņdڶmĖįƇłšĆYŗt)aaaĢž=›‹.ŗ???[Ž}÷]Ģf3_|ń:tࢋ."**Š»īŗ īøć&OžLHH§Nā»ļ¾ć_’śÅÅÅlŚ“‰ K^^÷ÜsO£ę""""""59räĒ'??ŸŽ;ҵkW<<ū,?żōQQQĢ;wwwŪō”²²2®æžz¾žśkf̘Į\@||<óēĻē¶Ūn«ńž?ü0£Fā™gž!==aƆń׿ž•'N°nŻ:}ōQڵkĒ=÷ÜCNN£FāńĒēŌ©S,_¾œk®¹†/æü’eĖ–ŁśōČ#0~üxžö·æ±cĒśōéC||<<õŌSś½zõj~üńĒF’¬EDDDDDŖSZZŹÆæžŹ‘#Gššš ““”““4JKKéŪ·om›q4*ÄŁ‘Źœ'uv®A„”š}Gvō@nT’uҶm[rssž“m;7%%___ĀĀĀøą‚ hÓ¦ ūöķĆÓÓ“Ń£Góż÷ß³}ūvņóóٹs'ėׯgäȑø¹Y>6“ÉD^^+W®$--­Ś6+«Ķ=RSSéŌ©“ķšˆˆ~śé'ŗtéb;Ö„K~ūķ·óżųœ*,,“Vķܹ³ķŁƒææ?·Žz+}śōį‹/¾ M›6LŸ>’ž÷æ|óĶ7œ|˜M›6ńÖ[o1hŠ Ś·o_ć}Æŗź*^żuÖÆ_ĻįƇłģ³Ļ*L·zšĮ¹łę›III!33“Ļ>ūŒ””.¹äJJJKĄQVVF@@W^y%ļ½÷kÖ¬įäɓ¬_æžwß}—I“&XB¶¬¬,-ZĶmŪķ³©Iaa!ūöķćȑ#€eä|ĒŽˈ‘;wÖ¶n¦£µŻ9§L”!—»uŌaGA‰õˆ”——– ”¦sĢf3éééŅ£GzōčAAA‡&44OOĻ*ACjj*>>>“k×ĪvģšįƶżźŚ¬¬6÷8pąžžžąććChh(›6m",, OOOń÷÷oŠ"999¶ż† E† ĀO?żdŪVÆ^ĶōéÓyłå—Y±b…ķžmŚ“aóęͮݲe žžžtķŚÕv¬r ’’X‚„źōīŻ£ŃXķh#G222 tų^dd$F£‘ķŪ·W8¾gĻÜÜÜ*L ڽ{wƒ|¾""""""ēŖ““”;wŚJDDDгgOzöģi EŽ?ĪŽ½{)--­M“ĪŠ¦ÖŪ*25iØ"ŽŌу×ŪPė !Öæ“;bż²š››k«Mѽ{w6lŲ@=ųå—_0›Ķ¶Ń&³fĶrŲŽŸŸŸķūō«ŗ6+«Ķ=RSS9sę :u¢¬¬ŒŒŒ ČŹŹ¢sēĪųśś’——Wa:Is¶wļ^[ 777.\ȦM›ųĻžc;'44ĄéŹ-!!!¶€Ø   Ā{Öߕ··wµżšõõ ØØČé9}ūöå/ł }ūö% £Ńˆ››[• ¦r›•W²±¾¶¾ļØß""""""®”——Ǿ}ūlß_śöķk A¬Æ}||HOOēŌ©SlŚ“‰!C†ąććć¬IC÷DC¬2Słø³hœsNrssÉŹŹāĀ /tŗŠLdd$™™™¶_ā/æüĀžšŒF#Żŗuć“O>°ø|ēw8zōh•vŖū¢ģ¬ĶŹjs³Łl«#b2™8xš ¤K—.ųśś6ųč B“C‡5X‘ĀĀBŪ(€×^{§Ÿ~šO?ż”;vpśōiī¹ē‡S‘ģĆ??æ ļY’epą@ŹŹŹšŻ’Ģ"""""Ņ:lŚ“‰¼¼<|||0`€Ć0ÄŖcĒŽ 0ņņņjSOÄY Rjqģ¼5D r.ENźåį6lŲĄž={˜>}:—_~¹m>Óžšf̘ĮĪ;Ł“i“ķüüü|Ž;ĘčŃ£IKK³Ś(..ę‡~`Ā„ ōļߟ¶mŪҾ}{n¼ńFn¹å–jūą¬ĶŹj{Š”C:uźDzz:š{ Ņ”C‡!b»gcÆ0c2™Xøp!}śōįź«Æ,£;–,YĀ_žņʏOHH={öäłēŸē„—^Ŗp}xx8·Žz+aaa 8Ūn»~ų”Ę)Fyyy|łå—Ģ˜1ƒńćĒÓ©S'.æürÖÆ_ϤI“8vģf³™I“&L’žż™?>)))“oߎVŲµ  €ČČHŗtéB^^Ė–-榛nb̘1„„„0vģXn¾łf–.]Ze*ˆˆˆˆˆHS2`Ą‚ƒƒk¾żö[–,Y¢°ADDDDź…ud¶õ”"rī CPŪż,Ī…Ąi»ŸÖ}ė¹%@™Ż`¶Ūj­±V™‘fذ°°B±O‘zÖąå5œiØ¢ŖÕ=@ƒL—‘ś§0DDDDDDDZ*‘é²Ė.suDDDDDD¤īmšDcŒiRˆˆˆˆˆˆˆˆH«£@DDDDDDDDZ""""""""Ņź(‘VG«Ģˆˆˆˆˆˆ4qe»ö`ĪĶ­ńƒ4+ DDDDDD¤Õk1”G~~ż·ŁPuBģYGpØÖ‡4"M™i)¶l©’‘ †ä䥵×* ‘F§""""""Ņź;ų««»Špę̓˜ĖÖŌåäXF†Øą©ø€iu>śšCWw”a]}µe%˜†Żq>†ˆ‹)‘VēŽē`2™0•›0™Ź1™L˜Mæļ›Lågß³ģ›Ķęę¢ääXB‘5k\ŻēżS".¦"""""""-QR$$øŗU) ‘&BˆˆˆˆˆˆHKķźT„0DšV5eęōéÓģŚµ‹ƒ’››‹Édru—DDDDDZ777üżżéŅ„ żśõĆ×××Õ]j™¢£į¦› 6""\ݛІHÓj‘żū÷³~żzŗuėʰaĆ ÄŻ½Õ<¾ˆˆˆˆˆK™L&rrr8pąK—.eųšįōčŃĆÕŻjšrbļź«†H“Ņ*żū÷óć?2qāD‚‚‚\Ż‘VĒĶĶąą`‚ƒƒéŃ£ĒŽ#;;›Ą¦¼ Ję6`Ž7^‡×€Ī\ŻŚ¹’~K]“¦(.¦N…gŸUhӊ“ų@äōéÓ¬_æ^aˆˆˆˆˆHˆÄ××Ww©Y°AܚKb/6fĻn:…^££įž{,ż²s110s&,[꟎I#hńČ®]»čÖ­›Ā‘&ÄĖĖ ²²²čŠ”ƒ«»Óäü÷ßæ“7g Ā÷ß»nF` e4Čż÷;ž^K—B|<Ģ›ē²IG‹_eęąĮƒD4åyt"""""­T@@yyy®īFóŠĀ«%K’ybc-AGv¶%”©é;b|<,^ܲ>w©¢Å"¹¹¹š—(""""ŅyzzR\\ģźnHc‹ˆ°„ -:Ś~dg[ŲŲŗ]«V5ķBµr^Z| b2™“šŒˆˆˆˆHäęꆣlvu7ĬõDź›uJĢO?Y¶Ł³Ļo”Gt4lŻj©-"-N‹DDDDDDD¤ Zø°ž‚†ŲXĖØ“ģlĖĻččśėg` ¬Yc Z¤EiõC'RRRxć7lÆŻÜÜh×®W\q^xį9·ū믿ņŚkÆqŻu×jŪæä’K\żČ6‡bįĀ…ÄĘĘ2fĢWw§ÖÖ¬YĆŹ•+1›Ķ<÷Üsø¹)×i––.…nŻ '§ī×FDXŠ£ĘĘ6Ī“–Å‹aģXĖ*4Ņ"“ś@ÄjȐ!\xį…”””°råJžóŸ’šųćpŽmwźŌ‰ū￟ójē­·Ž"$$„?žń®žø\jćʍ“mŪ–Y³f) ‘f©tżFņ¦\]åø×³š{žWwÆńXWu7®öēĒĘŒ®™ĘĄÄ‰ēā4AŽž9tĘ’«„xŒīź.×"gu芁ĮƒPZZŹgŸ}Fzz:䥁,_¾œcĒŽ@ll,}ūö%--—_~™ńćdzwļ^²³³=z4ųĆ*“}ųšį #D<ȲeĖ8zō(mŚ“į’K.įŅK/Å`0°qćFVÆ^Mnn.!!!ÄĘĘŅ»wož{ī9Nž< XFvÜ’żNūU™³ūYĄńćĒ=z4—_~9€Ó¾XŸ{źŌ©lŻŗµŹuß~ū-k×®ÅĻĻ /¼5kÖpß}÷QmŸ×Æ_ORR¹¹¹0~üx†Æų/ŪK/½DVVĻ=÷=öĻ?’<—]væüņ ÷ß?æžś+Ė—/'33“ŠŠP®øā śōéĆńćĒyį…øüņĖłå—_8xš żū÷gĀ„ üē?’!//K/½”qćʑ••Åüłó‰‰‰įŖ«®rõ?¢""""Ņ øÕĆd›˜˜;·śencb,!Hl¬ėW~±Ö¹öZ×-,õB^wĄd2`0(((ąĶ7ßÄßߟ'Ÿ|’~żśńŸ’ü‡ĀĀBŒF#[·nåOś=zō`åŹ•=zŌiŪgΜaŃ¢EÜwß}Œ9’•+W²uėV²²²ųæ’ū?śōéƓO>‰ÆÆ/’łĻ0™LÜqĒ :”Ūn»­Ś~Õö~V[·neĀ„ “oߞļ¾ūŽS§NUŪėsÆ[·®ŹuGå믿¦GÜxćlß¾£ŃXmŸ322ųōÓO¹ä’KxüńĒ:t(_~ł„-ü°š5ktéŅ…§Ÿ~Ą¦tļŽ±cĒ’——ĒŪoæM›6mø÷Ž{ äß’ž7999¶¾oŲ°‘#GŅ­[7¶nŻŹĒĢ•W^Ipp0+V¬ąōéÓ®žĒPDDDD¤õˆÆ:ā#"Ā”8š{ W‡!ö}[µJuEš99ėŲ±clŻŗ•’’’““ńńń”WÆ^lß¾āāb†ŽŸŸ111$''³cĒ.øąLDD#GŽd÷īŻüöŪotčŠĮį}vļŽMaa!111\pĮ\pĮL˜0Įöž3ĻX†Ē™ĶfzōčAjj*ŁŁŁųłłąå兟Ÿ?žų£Ó~]|ńŵŗß”C‡8p     €ōōt²²²ˆŒŒtŚ+G×edd0räHŗtéĀąĮƒłī»ļl}qÖgėēµ’~BBBøä’Køģ²ĖŖ|~~~~ ŒF#äœ¦ÖµkW®¼ņJĄv”””0vģX:vģȘ1cŲ³g»wļ¦wļŽōéÓ‡ØØ(ÜÜÜHIIaąĄ\xį…deeńłēŸsņäIŗtéĀK/½äź4EDDDDZk=‘ŲX˜:µīĖä6¶Ą@K]‘Aƒą\Ż9 DĪśłēŸłłēŸšńńaÖ¬Yx{{“ŸŸĄ›o¾Yįüģģl[ āļÆ/@µ£ rssl‡½¢¢">žųcöļߏ››„„„”——W9·ŗ~Õö~VÖ:)ŽŽŽ”••ÕŖ/Ž®;sęL…ĻĀž¾Õõłā‹/ęŹ+ÆdõźÕüē?’ oß¾ÜrĖ-xyyÕųū wśĢÖ¾äåå9ķ»õµõ^Ž>si@–Ubš›Ł³-#FfĪl1uEZ "gM™2… &šÉ'Ÿ°qćFŹŹŹ€ßƎŪn»Ķ6ŗ,«Ń9rųż‹~AAšūpG¬ķŁ9·JJJbŪ¶mÜ}÷ŻōčуeĖ–±vķŚjŪqŌÆŚŽÆ:u鋽6mŚæ‡BÖϦ6}7n111ddd°}ūv¾żö[¶mŪVaċ3ƒĮ¶o 7¬÷¶ž¬¹""""""UÄĘBēĪpūķŖ+ŅŒØ†H%ųĆšööfɒ%”——Ó·o_<==Y·nYYY¬^½š§Ÿ~šĆ‡ۮٶmdƆ DFF:mæ_æ~xyy‘œœĢ‘#GX»v-żė_Y·n%%%€eśĪ¶mŪŲ¶mĒĒh4b08zō('NœØUæjŗ_uŖė‹Łlvz]÷īŻKM““4Ūu@µ}ޱcO=õ{÷īÅĒĒĒ6…Ę:‚£. €§§'k×®åȑ#$%%įééɀźŌNVV>ų Ė—/ÆsDDDDD¤•‰Ž¶ŌiäÕoył±:°sēłęÕzk-ˆTāēēĒ„ 8~ü8ÉÉÉ“mŪ–?’łĻœ>}š… ²iÓ&®¼ņJŗtéb»¦wļŽ|ųᇤ¦¦rłå—W˜¾įØżY³fa6›yå•Wųžūļ;v,#FŒ`ōčŃtīܙåĖ—³vķZn½õVĀĆĆłōÓO1›Ķ\rÉ%:tˆĻ>ū¬VżŖé~Õ©®/ÕM'éŌ©&L`’žż|ņÉ'¶‘ ^^^ÕöłĀ /$::š?ž˜ēž{ŽåĖ—3iŅ$Xēß”ż}^yåΜ9ß’ügڶmė’¦DDDDDĢX–¬u°»l „éé®īaėh);{vƒß*ŪŻ‹ žŲļT«ó½K k½µ†s¼Ę`w­»Żę xŽ€Šš=»o}ķmwŽõ|/³ŁüpC<ą›o¾ÉōéÓäĆ;tč .$66–1cĘ4Č=š³ŁĢéÓ§)--Å`0šŃGqōčQž~śiŪ /"""""VūöķcŠ A¶×ŽF#;”\łxmÆ]ōņ‹ÜūąL&¦r&S9&“ ³é÷}“©üģ{–}³ŁĢG~ČģGžŖ—ē.]摼)WW9īóč_ióčCµohÜ8HJrųÖo²'Lbȗ×KŸ„Ž-UŌ9ąķĻļŠ%ĘēŖ·öO8ž#æ’WKń9ü¼Ū7 @P|v³īŸ9»_ž}mŻ·žW”Łmf»­ÖTCDźUII Ÿ~ś))))”––Ņ”Cāāā†ˆˆˆˆˆø@Īś8ōś;t¾ó6Ww„õ‰‹ƒ`āÄz E²Ż½ŲŪ&˜"7}•ÆśĻCēĪµ,k%^^^̘1ĆÕŻ‘³,XHūĖ'āѵ««»ŅśDGƁ–Pä<‹­:"ēG5DDDDDDDš‹-[,S1ź ,/w’ÕÕ=o½᧟,#F΁µVHc†!n¦ņóo¤P """"""Ņ\äēĆĢ™–Śu`:#.“x1,\X§Kö“ f«_˜¦Č4"""""""ĶMB\t¤„Õś’ jՙJN|õ Ž ēīƹįģŁ–Uh«=Ķ:*$ĆÓ×ÕQ‹¦@DDDDDD¤9ڲ„Nˆ¦Īü®4=ŸÆøŽ7ż…¢C‡Ł<ęūą“ƹyL lŻj©/ā€F…4"""""""­„¦ĪĄ”×ßać˜)䬒”Āń½w?DŹcńÓ‰ˆXµŹRW$"€cžm4*¤‘)r’fķż÷ßwuZµéÓ§»ŗ """"RG­uՙŅōtvŽż×*Aˆ½Ćoü›²Ü|ø«IDDDDšƒ:,³[-iՙŅÜ\R‹gė•××ū؉żĻcĻ]ŗś«čpćŸp÷÷wu7š-"5°†!ƒĮ¶NC‘¦`åŹ•¤¤¤––ĘSO=żyóxį…j¼®  €ćĒ»ŗūĶJūöķ9}śō9_ŸŸŸOF†FjˆˆˆˆˆkX°Š²ŹI3–½n#›G’Ćoü»Įī‘ńį6žLin®«·‚ö7^ėź.4[ DŖQ9 ±w.”ČŖU«ˆ‰‰!&&†1cĘšÕW_ŁŽ[¾|9ƇgšąĮ̘1ƒ3gΰdÉFŒĮčŃ£9r$ėׯÆÓ3ø»»Ć{ļ½Ē‹/¾Č‰'ŖmwŚ“idddpĒwŌx777ęĻŸĻšįĆ0`Ææžŗķ½ź®›?>#FŒ`̘1 6Œ§žz “ÉĄŚµk?~<ćʍcüųń¬[·€²²2üüüH?Ļ’”žłēŸ‰ŠŠā–[naŌØQ¬Y³†įƇsÉ%—0|ųp’““Ų½{7={öäŁgŸe芔ōģŁ“W^y„J›ųśž¾VųŅ„K‰ŠŠ¢OŸ>ÜpĆ ¶ßå’ž÷?ĢE]Đ!CX»v-üć9vģ3gĪą›o¾įā‹/ęā‹/f芔,_¾ÜißEDDDDĪ—uźLsTš›Ėž»dė•×7ŹJ,»ö°õŠėÉß¹ŪՏnÓķŽ™®īB³„"NT†X ŪōƒĮPmM‘'NĒźÕ«‰ŒŒ$55•Ń£G³eĖxą6lŲ@XX·Ür o½õžóŸyšĮY·n]ŗtaŊÜyēģŲ±£ĪĻE‡Ųøq#&LpŚī /¼Ąµ×^Ėo¼ĮéÓ§«½FFaaalÜø‘ƇĶäɓ szݦM›ųüóĻYæ~=īīī”––ņÜsĻ‘žžŽææ?·Ür +V¬ _æ~ģŚµ‹«®ŗŠ;vąēēW/5[<<<Ųæ?÷Żw’łĻČŹŹāśėÆgõźÕōļߟ;vpŁe—±’~ŒF#ééétģŲ‘Ķ›7sšąA.¼šB.æüņ ˆ½cĒŽq×]w±uėVĀĆùžśėyķµ×øóĪ;¹ēž{Ų²e ]»vå‹/¾ą¶Ūnc’žż,\ø+®ø‚Å‹“™™É“iÓŲ°a}śōį×_ečŠ”ģŁ³§JßėSP»NßĖ>q¬^ļ%""""#°¬˜ŠŅ3dy“©ńÜęøźĢ‰Æ¾aļ]Õj)Żśd E¼’A£*N}/MOoō"µ]»8ņųźP£Ž·%Š‘8 Cjū¾URRƒ ²ÕŻč޽;QQQ¬]»–Õ«W3tčPĀĆĆ1 ¼÷Ž{Ü’żųśśršąAŗtéĄČ‘#IMMµ¦Ø«Ž;’››[ėvksތ3čŌ©Ɔ cƆ Õ^DFF‰‰‰¤§§ćįįA||<Żŗuc͚5DEEŃÆ_?ś÷ļOdd¤m$E}ż>M&“­ß«V­bȐ!ōļ߀ҧO’’’0ÜtÓMtéŅ…įƇW;JgåŹ•\|ńÅ“o߃ĮĄĒ̜9sšõõ%++‹®g’ĒqōčŃüśėÆU>óļ¾ūŽĮƒÓ§Ozöģɐ!CX³fM•¾×'g”‡Ā‘ę+ج˜§O2>ēƒ 2i_roS™Óó›ĖŌ™ŅÜ\vL’3;ośK£‡!Veyyl½ņzŽ}š Ē>ų„ŸÆøŽļ£F»dōH·®vÉēŠÜi„H#ÉĢĢ$$$¤Ā±ąą`Nœ8AYYž į˜Ķfž}öY’““ńöö¦¼¼ąœ‘£G^ėvk:/((ŪłAAAdggW{]Æ^½X¾|9‹-bįBĖX3fĢ`Μ9dff²yóę*FKJJźõwŒŃh,ÅiüńG¢¢¢*œS\\ @```•g¾ś“…é鿯"“m›å=iPš2Sk‘s}ßjÜøqģرö$oJJ ;wī$&&†ńćdzyóf²Ģłš={6Ļ>ū,ŁŁŁ„‡‡ćććCYY   ėō ?üš3fĢ >>__ßjŪõšš ØØ Ęū—––Ś–ó=zō(›6mbŌØQÕ^·|łržž÷æŪśÖ­[7.øąL&ćʍcūöķģŚµ °Œ¶5j§Nj°ßļĉŁŗu«­.ŹńćljŽŽ¶T„„„üļ’³=ć?žČŲ±c¶wé„—ņć?ršąAī¼óNž~śi²³³iß¾½ķ3łĒ?žĮ`ąĢ™3>ó‰'²mŪ6öķŪXB™ķŪ·3aĀ„ū *S""""Ņŗ•ÓļĢ)Fäc|Ī!ˆ›Ł¤¾Œzż6Ž™ŅdĄ²"ŪÖ­(×¶ .ČdpA&Žž 3gB|<\}5ŒgŁ‚‚Ą`°lÖcW_ óęY¶ÄDKP’”Ō¤>’–L#Dœ(((ØR4µ2ū¢«ö?ĒWaZC\\Ļ<ó ‰‰‰Ģš5ĖvMbb¢m“Į+Æ¼Āµ×^Kii)‘‘‘<óĢ3˜Ķf>žųc† FPPóęĶć—_~įŗė®#11±Śž_z鄍FŹŹŹčŲ±#O?ż4×]w×\sÓv?’üsBBB˜0aŸ}ö™Óó^zé%"""Ųæ?ćĒ';;›gŸ}–Ī;WŪžĒ̊+øųā‹mSGbbb˜6mF£‘÷Ž{{ļ½—ŅŅRŹŹŹø’žū ¦¬¬ŒĄĄ@vļŽm«ĆQBBBųų揙5k–ķžsęĢ!$$„'NpĮ°oß>†NNN/¼š]ŗtqŗLī\Ą¢E‹øāŠ+(--„wļŽ,X°³ŁĢ|Ą€fžüłģŻ»—©S§ņĶ7ßj[ēĆ?“Õ 1 |ųᇓk×NĖ!‹ˆˆˆH£h—u †ŲX;ÖņÓsTH`Y‘mß:µČŪT†·É2ÕŻÆ¼Zž1°„ŅäĖų{ƒŻ–PÅŗy^€7ą“|Ļī[_{Ūc=ßĖl6?Üųę›o2}śōs¾ŽŁj3ĪĀi\ļæ’¾-dŖoūöķcāĉ>ÜšĖw5¶œ¬ CŪ““•Q§ė–-’‚½{÷ńĀ?ž©©©„‡‡»śQDDD¤™Ū·oƒ ²½v4ŪŁØģŹĒk{ķ¢—_äŽē`2™0•›0™Ź1™L˜Mæļ›Lågß³ģ›Ķf>śšCf?ņT½X§ó<Č?’łOž|ņIWw]DD¤iūžū†æĒŲ±ąź'•V@ˆ4{©©©®ī‚ˆˆˆˆHė°e‹eIŲ†¬#ćź§”VBˆ4k糂ˆ“\/½ōRēüöŪo,^¼˜3gĪŠ„Kn»ķ6Ww[DD¤yhč:"m _D›«; ""ŅPĢf3K—.åūJĆ{óņņxóĶ79sę żū÷ē®»īRż‘ŚŚ¶­įļ1z“«ŸRZ‘©¤¤„’ž÷æģڵ  „ææ?`)Ŗ:eŹNžżōS}ōQī¹ēžļ’ž€ņņržō§?qā„eķļ½{÷Ņ·oß*ū"""""-AƒŚøŠÕ)-˜Fˆ8Q›0ÄŹŁH€œœ^|ńE.¾ųb¼½½9yņ$·Ür +V¬ _æ~ģŚµ‹«®ŗŠ;v`49yņ$F£‘ääd~žłg&MšÄO<ĮźÕ«IKKcȐ!Üu×]äååĒźÕ«‰ŒŒ$55•Ń£G³eĖ^xᮽöZŽxćjļgäFŽIjjŖm”†UmγÖģčŌ©Ɔ cƆ Õ^DFF‰‰‰¤§§ćįįA||<Żŗu«õ³UĒl6Ūj „„„ąļļĻ©S§Ŗ½ĘĶĶ1cĘJdd$ūöķ«rŽįƇéŲ±c•}‘– ,/ü»ōm\ˆ»ź€IŃ‘`­!b6›7n $$°L‹Ł¼y3ƇWœkWRRXŠz{[–vrw·üzģ ŗ»»S^^Nff¦­M«ąą`Ūt «šīguźŌ)mÆŻÜÜl÷5›Ķ<ūģ³$''ćķķMy¹e^cå@¤¦ó‚‚‚ššų}ī   ²³³«½®WÆ^,_¾œE‹٦ ͘1ƒ9sęŌśŁŖćå兛Ūļ¹ ››&“©Ā±ŹŚ“ic ‹Ą2š(??æĀ9GŽį‚ .Ą`0TŲiIrÖżŠąÓZG]B֊o]żØŅ)i@ƒłóēsć7rķµ×āļļOxx8ŃŃŃ,_¾¼Źł'Ož¬uŪaaadeeU¹><<¼Ā±źīg/00œœŪėŅŅRŪėeĖ–±bÅ VÆ^Ē§GUŚØé¼¼¼¼ aCNN!!!5^7hŠ ^{ķ5RSS™9s&:uŖõ³Õ·3gĪŲ¦I„°låÕ+T?DDDDDZƒģué|ēm z QĆˆHƒŠ”™6bÄ.¹äęϟĄøqćŲ¾};»vķ,#8FUć4ŹĘĒŽ;lĖ⦤¤°sēNbbbššš°p­ķżFŒĮ?žČ‘#Gx÷ŻwmļeggŽeee$$$`0(,,¬pÆźĪKȲd‰„BōŃ£GŁ“i£FŖöŗåĖ—ó÷æ’ŻÖ—nŻŗqĮ`2™źķ³tÄŻŻŻ6ŅÄ~,[­E_³³³ŁææmŚŽÕž={l!ˆż¾ˆˆˆˆHKR°sOƒßCuD_sZķč¼žÓÕhŖ j=ÅĮYAU«æżķo¼óĪ;ģßæŸąą`Ž{ļ=ī½÷^FÅUW]ÅŻwßMpppśJbb"³fĶ"&&†ŪoæÄÄDBCC錵+!!!L˜0”Ö÷ėŽ½;O>ł$“'OfĈdffAYY×\s EEE 6Œ)S¦0uźT.½ōR®»īŗ ÷Ŗī¼ņņr"""Ųæ?ćĒgŹ”)<ūģ³tīܹŚėʍGjj*_|1cĒŽeōčŃōčуiÓ¦Uūlµ]eʙ°°0üżżyņÉ'+ģƒejŅ‘#Gxā‰'˜7o7Żt”””V™IMM„[·nöEDDDDZ’¢C‡)=Ē’ę®-Õi|Ž%…®īB£8—¢» ,Ón¬›'ąx>@Ą÷ģ¾õµ·Ż9Öó½ĢfóĆ ń€o¾ł&Ó§O?ēėkZm¦¦0Dš–÷ߟY³fóõGŽį™gžaŃ¢E®~‘f'55µŹ“>‘}ūö1hŠ ŪkG’ķķģæĒ+Æķµ‹^~‘{œƒÉdĀTnĀd*Ēd2a6ż¾o2•Ÿ}ϲo6›łčĆ™żČSõņÜ„ė7’7åź*Ē} óźķĖčoxŌK[Õéūź’£ĆjŠ{ģ˜žgM›©A`YC NœCg Øśßmž_-Åcäšsh­"ƒĮÅg7ėž™³ū@įŁ×Ö}ėy%@™Ż`¶ŪjM#DjPŻH…!"""""ŅŚeÆŪŲą÷hčĀ­Ņ:)©k(RySŅśtģŲQ£CDDDDDģä¬ū”Įļ”:"Ņ“ŹL-)ü©ŹZGÄ£k×»GŠØóŸ¦!R™iuRSS]Ż‘%kż&:4` 8ņrÖ7ühi=ˆH«r>vE¤a½õÖ[„„„šĒ?žŃÕ]q™ęŗŗGžĪŻt a «®@Dź•q¹ēž{Ž“'OpčŠ!īæ’~~żõW–/_Nff&”””\qÅōéӇ¬¬,ęϟOLL W]u•«»."""4b‘\ż¤Ņ’ØØŖˆˆøÜwÜĄŠ”C¹ķ¶ŪČĖĖćķ·ß¦M›6Ü{ļ½ņļ’›œœWwUDDD(Ųµ‡ŅÜܽ‡źˆH}S """.ēē瀗—~~~ģŚµ‹’’ʎKĒŽ3f eeeģŽ½›ŠŠP^zé%ib6ž,lŠ`$p¤V›‘ś£@DDDšœÜ³’!e J|}}ČĖĖsu×DDDĉ¢C‡9šĀB¾Ąž»l{ų čēźĒ”Dˆˆˆ49äēēWųi=."""M[ʇKČ^·±ŽŪÕ“©O*Ŗ*"".ēīīŽĮ`ąčŃ£œ8q‚°|łrÖ®]K@@IIIxzz2`ĄU‘ķd@x½µuĘąŚÆ{;÷Ō{€8JSfœÉq÷®×~Z—3\rÉ%:tˆĻ>ūŒ¶mŪņē?’™Ó§OóŹ+ÆpęĢžüē?Ó¶m[WwUDDDj©!Fˆxą×_Óf¤~h„ˆˆˆ4 śÓŸųӟžd{ݳgOzč”*ēY‹ŖŠˆˆ4gĘ.ńyōÆ zŽa.|Fw’i·÷£P²k· Ÿ¬éņ1›“}c—Ī®~Äz„@DDDDDD¤‘¹uīD›G:’†ŖŃĘÕŁ@¦L‚)“\Ż i4eFDDDDDDDZ""""""""Ņź(‘VGˆˆˆˆˆˆˆ“*ÉÉÉ †*[rr²«»&HEUEDDDDDšĻ?’œmŪ¶‘””D~~>[¶l©š~LL DEEqÅWķź.·j[¶l”  €¤¤$Ū1ū}{ÖߛõēŲ±cĻł¾ÉÉÉäää°mŪ¶jļkæØØ(ŗvķźź¬Ń)i¢ŅÓÓIHH 11‘œœœjϵ~é]¶lńńńÄÄİfĶW?B«5gΧˆ#Ė–-«š:&&†øø8bcc ØUÉÉÉÄÄÄŌźÜŹ}‹ŽŽęŽ{ļeƌ.üŌ—9'ļæ’¾«» ­ÄōéÓ]Ż—˜7o 5!ĪDEE¹śä<$%%‘””D`` ńńńÜ’ż zæ-[¶Gbb"Ė–-«uӜ)‘s6kÖ,WwAZøŌŌTWwA¤Ńåęę2aĀ„*SbźŖ¶#¤iĖÉÉaöģŁ,[¶¬Q‚Ф¤$¢¢¢Ų¶m[‹Eˆˆˆˆˆˆˆ4µ C¬u*IIIlŪ¶Ķ6¢dźŌ©®~©$00˜˜˜*£wŅŅŅHKK«vŠMRR&LąÓO?­s½øø8āāāŖ“÷Å_8üg---Ł³g³xńbWd Jˆˆˆ4~~~UŽøŗ["""õ¢¦0$&&†Ł³g; :ęĪ X¦>¬[·ĪՏ#DEE±téR§ļēęęŚjĄ¤„„UyĖ–-\sĶ5|÷Żwu½W„PėŲ±c™;w.Ÿž9qqqU¦f%&&ߢ‹­jŁ]iüüü0›ĶU6G!IHH))) ާćĒ^«s###kÕ§ńćĒ×xNJJ ‘‘‘ ž|""Ņøāćć†!$&&²f͚ZśˆŽŽnšzŅ0˜1c >>Žį9[¶lqśŽ¹˜:uŖÓöźR¶9R """Mž5 0 ¶ pŠ4G?~ÜÕŻHNN&!!Įį{«V­jU+ˆÅܹsILLtų^BBéééõvÆŹÓi¬RiI4eFDDš“Źaˆ=ƒĮ`)b0j5}fÕŖU<ū쳘L&yä¦L™ĄņåĖyžłē)**bąĄ¼žśė“iӆ%K–šŅK/a41™LüżļgäČ‘ÕŽēķ·ßęõ×_ĒßߟK/½“Bߝµ7mŚ4222øćŽ;xć7Ŗ½Æ››óēĻē‹/¾   €»īŗ‹;ļ¼³ŚöęĻŸĻ—_~‰»»;EEELš4‰yóęįęęĘŚµk‰·}žĻ<ó £F¢¬¬ŒĄĄ@vļŽŻ¢‡ĶŠˆø’³æŠ'$$Ż ÷NOOgŪ¶mlŪ¶Ķv,**ŠØØØfóæūéééUjpDDDQeŖH]ŪMJJ²111ēÕ^]͘1ĆVLµ²ųųųz«ńŃŅ‹§:£@DDDš¬źĀ«ŗ„"'Nœ ..ŽÕ«WIjj*£G¶ O~ąŲ°aaaaÜrĖ-¼õÖ[üłĻęĮdŻŗutéŅ…+Vpēw²cǧ÷9xš O?ż4?’ü3ķŪ·ēƒ> ##€Ó§O;mļ…^ąŚkÆå7ŽØö<€ŒŒ ĀĀĀŲøq#‡&::šÉ“'ęōŗM›6ńłēŸ³~żzÜŻŻ)--å¹ēž#==n¹åV¬XAæ~żŲµkW]u;vģĄĻĻOµZDDõKwe111 6õ%77—ÄÄDŖA\\³gĻ®ńK³£’Ǝ·Õ6©ļė¬ĻšŽ{ļÕø"Olllµµ;*KNN&>>Žįļ%00Ł³g×Ųæś’˜˜H```•ćĖ–-«·@ÄŁh“–¾R‘¦ĢˆˆH“ē, ©ķūVIII 4ČV£{÷īDEE±vķZVÆ^ĶŠ”C Ē`0šŽ{ļq’ż÷ćėėĖĮƒéŅ„ #GŽ$55“Éäō>ėÖ­c芔“o߀nø£ŃPėöjsžuųt§N6l6lØöŗ   222HLL$==āććéÖ­kÖ¬!**Š~żśŠæ"##Y»v­«ż""-ž£æžƒói ē+99™ØØ(fĻž]攈““4āć扊Š:ļe€ėÓēŸNDD³gĻ®UæģGæŌäŻwß%&&ĘiżŒœœāćć7n\£|x…~”””øś×&"Ņā9 D¢nČ»ļ¾{NAKZZ]tĖ–-słr¾<š€Óz+ĪŌv¤Cbb¢Óŗ•%%%ńĄŲž?µ!ÅÄÄ8ģWRRŅy‡óęĶsųyÖõ3nŽˆˆˆH«FVVV…c'Ož$<<œāābNž>>”••‘€Į` °°Šé}FŒĮ?žČ‘#GĖ_㬪kĻĆƃ¢¢¢ĻKȲdÉŽ=ʦM›5jTµ×-_¾œæ’żļ¶¾tė֍ .ø“ÉÄøqćŲ¾};»vķ,£iFÅ©S§\żėiŃrssŠŠŖ÷{9 C8pą .dīܹ,\øģģl§Ó4ęĢ™ć’Ļ*99™Ł³g;|/66–Ÿ~ś‰°fĶÖ¬YĆO?ż„Łlfٲeu˜āććIKKĆl6Ū"Gu<¬Ÿ_Cs@Õ6™={6111¶-66Öaż˜ˆˆ’’’ZĶŖF DDD¤É*((ذ¼®#öEWķ Ž7Ž.]ŗŲ¶§Ÿ~šŠŠP™5k111Ü~ūķ$&&J‡xå•WøöŚk2dÜwß}\sĶ51lŲ0¦L™ĀŌ©S¹ōŅK¹īŗėœö»{÷ī<łä“Lž<™#F™™IDDeeeÕ¶×µkWBBB˜0aBµē•——Įžżū?~ū̶üųq‡mŻsĻ=ÜsĻ=¶×?žx­ŚŪ¼ys­Ī³®6óÄOT8'  ŚėŽxć §ŸĶ˜1cX³fM•ćīīīZeFD¤™{å•WŖ‹ˆˆØq›„„‡_ųū‹ó–-[N-Š‹‹«×Ń ÕµMlll•Ļ£¶£4šŗ““4bbbˆŽŽfŃ¢E.›՘4BDDDš¼Ź#E¬PćR»"""­]zzŗĆ•XœM?±×µkW‡£D{Tė_~éšø³Q#ēŹŃ³Öę}W­ĄSŪ‘DŃŃѦĢTvlٲ…‹.ŗØĀ”ß–Jˆˆˆ4 ÖP¤ņ¦0DDDš3???‡Ē4=WĪF0Ō¶N‰£órrrœÖ?iĪ ĻÖw1ӚkĮÖŹśæGœMQŖķļš’żæ’g«­RŪś*qqqMj©å† @DDDš‚‚‚*›ˆˆHsęģ/õĪj‹œ GaPė)/ξ0×gkā(Ōiˆ•xš*g”–³€¦¶¦NŹš5kœŽ“qUŻĘ¢""""rĪRSS]Ż‘f/::ŗŹ_ā“’’ČĶĶ% ĄÕŻkZJŽsålŠR}…BsēĪ%))©Jx–””Dzzzƒ/+ģ* DDDDäœLŸ>ŻÕ]i ąpj²eĖZĶņ§ā\nn®Ć@$""¢^ƒŠŁ³g;MŌ’—įՔrVس¾ †:›VQŪśΦĘŌ¶~EC=CcNŁq„„„‡Ēćāāźõ>Īź§“äŃ9 DDDDDDD\hźŌ©æš§„„1o޼ónæ’žļڵ«V×; """j5§¾¾L;ś|¬ÓŠZ²-[¶8 Ęj³JP]Ōg!ßęBˆˆˆˆˆˆˆ‹9ūk||üy/ķšÆ’‰‰‰5^ėlŗ†£ŚŽ Ä:+čjõłēŸ×ź¢ÉÉÉq:z¢%Ų²e 'Ntų^|||½×—ič:%M‘jˆˆˆˆH£z’ż÷]Ż‘VMõš¦¹sēņÅ_8œĘǶmŪĪėKplll•$))‰äääjW›‰w8rĄQ€Ó¹sē*żOKKszÜÜÜZrˆuxn||錵+ńńńU¾ųęääpŃEg»Æõ>ަ»ņā‹/:쟳QÖ{DGGÓ¶m[‡}­ųųx–-[ę00Š'!!˜˜[±×““4vīÜi«Ć1wīÜśūe£¤¤$ʍWįXm?ˆˆ–,YrN£a+ü>srrŲ¶m[µSšb$JS£@DDDš ??æ*Ē \Ż-‘z3cĘ """ˆ­±ČeMõ9*OU™;w.iiiGY$&&ÖŖ¦HBB‚Ó/ä]»veöģŁNėz8ūŅļ(ØqÖž²e˜֓ČÉÉaٲeG©4„ijś½9bņt®#Cjó»µĶwß}×äG՜/U‘fĮĻϳŁ\es’Š£G"##‰ŒŒ¤WÆ^\yå•ģٳ§Qū<~üųón#22’”””z¹WJJ ‘‘‘śŌäĉ̘1ĆéūO<ń„ĆżŚ2›ĶĢ™3§Ź¾ˆHS6vģXŅŅŅĪ{YUG!ĄāÅ‹Ļ©ŻĄĄ@–-[Vķ’fƒ%ܨˆÄÄÄ:ķ;v,?żō“Ó„„ėņY4±±±$%%±téŅF 'āćć[E DDD¤°†!Ž8 EV®\IJJŠm»ģ²Ė˜6mZ£õ¹  €ćĒ·ø{5¦ĀĀB²³³«ģ×EZZ]ŗt©²/"ŅŌ°xńb~śé'āāā®SččhŪŌ‘Ź/^LRRR­‚ˆĄĄ@fĻžMZZS§N­Uææūī»C—ččh~śé§g×Z‹ĢÖös ©ó}\!00ŲŲXHKKcéŅ„RŌ4&&†„„rrr˜;wn«C@SfDD¤‰«. ±2›Ķ §Óg śÓŸxģ±Ē(**ĀŪŪ›µk×o»ö™gžaŌØQdff2|ųp{ģ1Ž{ļ=Ž=ʜ9sšõõåß’ž7GåöŪoē`ÕŖU<ū쳘L&yä¦L™Ā“iÓČČČąŽ;īą7ŽpzæŹŽ~ūm^żuüżż¹ōŅK1 ¶÷–,YĀK/½„ŃhÄd2ń÷撝‘#GV¹—³óÜÜܘ?>_|ńÜu×]ÜyēÕ¶0ž|¾üņKÜŻŻ)**bҤIĢ›7777§ĻVVVF`` »wļ¦k×®NF£‘ÆæžšäädN:Åe—]Ę5×\Ƌ/¾HNNƾś*§N²ķ_uÕU¼šĀ Œ7ŽĶ›7SPPĄ”)SųĆž@yy97ÜpƽöķŚµcļŽ½ōķ۠¾ˆHsĶāŋY¼x1ÉÉÉlŪ¶œœœ*Ó.¬į†µ†FM_hĒŽ˚5kŲ²e ėÖ­cŪ¶m yZŪ‰‰‰©ó—ck˜c-äjßט˜˜*EY£¢¢Ŗ<£?vT¾Ēܹs™;w.ÉÉÉ$%%‘––f{†ØØ(‰ŠŠ"**ŖŹ’9ŗ§õxuźrݚ5kHNN¶½¶žīģYūhm£VŸµµɚ5U޲Ž ±ž7‘£{Z`©KRŻ’G·t DDD¤ÉŖMbU](’““Ć‹/¾ČÅ_Œ··7'Ožä–[naŊōė׏]»vqÕUW±cĒŒF#'OžÄh4’œœĢĻ?’̤I“xā‰'X½z5iii 2„»īŗ‹¼¼<āāāX½z5‘‘‘¤¦¦2zōh¶lŁĀ /¼Ąµ×^Ėo¼Qķżģ’ƒļąĮƒ<żōÓüüóĻ“oߞ>ų€ŒŒ NŸ>̓>ČŗuėčŅ„ +V¬ąĪ;ļdĒŽīUŻy„……±qćF>Ltt4“'O&,,Ģéu›6māóĻ?gżśõø»»SZZŹsĻ=Gzz:žžžÕ>[mj¼āīīĪóĻ?Ļɓ'¹÷Ž{™4i3fĢ`Į‚Ü}÷Żhʌˆˆ“H—^z)‘‘‘ōģŁ“N:Q^^ĪĒ XžbEæ~żčßæ?‘‘‘¬]»€ņņrŪōšRXXČõ×_Xž’āķķ͉'HJJbŠ A¶ŗŻ»w'**ŹÖŽUM÷³Z·nC‡„}ūöÜpĆ F|}}9xš mŹĒȑ#IMMÅd2Uh£6ēY‡'wźŌ‰aƆ±aƆjÆ "##ƒÄÄDŅÓÓńšš >>žnŻŗÕśŁŖc6›m5PBBBš÷÷ēŌ©SÕ^ćęęʘ1c %22’}ūöU9ļšįĆtģرʾˆˆˆˆFˆˆˆH‹“råJŗwļŽŁlfÜøq 0Ą6833“Ķ›73|ųš ה””ąé鉷·7īī–’«ō÷÷·ēīīNyy9™™™Uę$sāĉ ĒjŗŸÕ©S§*Ģ…vss³Ż×l6óģ³Ļ’œœŒ··7åååU‘šĪ ĀĆĆĆv~PPŁŁŁÕ^׫W/–/_Ī¢E‹lK8Θ1ƒ9sęŌśŁŖćå兛Ūļ£qssĆd2U8VY›6mlaXFåēēW8ēȑ#\pĮ † ū"""" @DDDZ8ƒĮĄüłó¹ńƹöŚkń÷÷'<<œččh–/_^åü“'OÖŗķ°°0²²²Ŗ\^įXu÷³Xažoii©ķõ²eĖX±b«WÆĘĒLJćĒÓ£G*mŌt^^^^…°!''‡Æ4hƽö©©©Ģœ9“N:ÕśŁźŪ™3glÓ¤ĄRXÖ>“T?DDDDŖ„)3""Ņā1‚K.¹„łóē0nÜ8¶oßĪ®]»ĖŽQ£FÕ8M£²qćʱcĒŪ²ø)))ģܹ“˜˜<<<(**ŖÓżFŒĮ?žČ‘#Gx÷ŻwmļeggŽeee$$$`0(,,¬pÆźĪKȲdÉŽ=ʦM›5jTµ×-_¾œæ’żļ¶¾tė֍ .ø“ÉToŸ„#īīī¶‘&öūeee¬_æŽöĢū÷ļ·M۱ڳg-±ßićĘĮ@N̜ AAŽė¤„żž¾ĮŻŗAbā¹ŻÓŚÖEYŚ2ąź«aĖĒēϜié§£~]}µå=EY[ ‘&«  ƒĮP«ĀŖÕ­2š·æż#FpŪm·Ń«W/Ž{ļ=ī½÷^JKK)++ćžūļ'88øN#DBCCILLdÖ¬Y¶>$&&Šææ?!!!L˜0ļ¾ūĪéżģuļŽ'Ÿ|’É“'Ó¶m[®øā """(++ćšk®įć?fŲ°a1oŽ<~łå®»ī:>’üsŪ½>ūģ3§ē½ōŅKDDD°’~ʏOvv6Ļ>ū,;w®¶ż?ž˜+VŲŠŅ–——Ć“iÓ0NŸ­¶«Ģ8†ææ?O>ł$ńńń¶ż;3ąą`Ž9ĀO<ĮéÓ§¹é¦› ­°ŹLjj*Żŗuذ/""Ņ(¬!ĆÕW[öcb mۊ礄ĮąĮ–żø8 “œ;s&lßg§ŖÖŚ?’i¹>6®¼ŅŅ~b¢åŲŖUP¹€īŒ–Š#- ¶nµÜ`ŽWŪ·oƒ ²½vōæ÷Īž? ņńŚ^»čå¹÷Į9˜L&Lå&L¦rL&fÓļū&SłŁ÷,ūf³™>üŁ<åźLš ƒĮ&Z–ȍˆØzĪøq°m[Õ°Ā:j楁Ŗ×Yėa9ś÷"'§j€‘`©‹W½fŽCPŸŻ¬ūgĪī…g_[÷­ē•ev€Łn«5M™‘&Ļ:RÄ…!"""ŅdåäXBGaHZš%ōˆ‹«:rćžū-?ķ¦Ļ֊£Ń³g[~.[ęųš¹s-÷OH°„!sęXŚixŠ”iœ…" CZŸŽ;jtˆˆˆ4±±Ž[§ŌääXFiŲKKūżœ¹sė~ĻeĖ,SnģkƒTW dŃ"ĖØ‰q*‡4-i6~ˆˆˆH‹‘žnły®Tٲ®½ÖØÄÄX6p\4Õ^t“e¤Jb¢e4‹uTI §@DDDD]jjŖ«» ""Ņ4¬Yó{pq>rr,#<ĄRūĆ~„G||õ×nŁb C-aʼyē62„™Q """"JÅĪEDD€±c-??’¼~‘ÄDK(_÷é.·ßn CV­²Œ0‰‡+®hńÓfTTUDDDDDD¤±ÅÄXBkq¾rs-?+·•PżuóęYFˆĢžm @¬KżŽ~»«?”§@DDDDDDDÄ.“ŻŗY‚‹¤$Ė–˜hY*·.f̰üLL“lII–°cŽ<ǫπ%±Ž(±N‘‰µl[¶T-öŚĀ(q…ø8XŗŌX<šŒgŁf΄￯[[°x±eęLK;‰‰–ö£¢,ĒķGääX¦Ē@Õ%v/¶ō)>ŽŒ“PŖ!"""""""RßĢꦝg?"#?ßr¬ŗš"ÕµgŁ’’ mŪßk€8j/0pÜN` dg»ģ£k, DDDDDDDD\­> ˜ÖG‘ÖV@SfDDDDDDD¤ÕQ """"""""­ŽiuˆˆˆˆˆˆˆˆH«£@DDDDDDDDZ""""""""Ņź(‘VGˆˆˆˆˆˆˆˆ“: DDDDDDDD¤ÕqwuDDDD¤ńM›6­Īה——óńĒ»ŗė"""õBˆˆˆˆH+µ|łņ:?eŹ” Ææųā žń°wļ^<<<8p ³gĻfņäÉõÖĒćĒÓ£GŽ?ŽÆÆÆ«?²&'==æžõƬX±‚Õ«W3lŲ0FŽÉśõė]Ż=‘&MSfDDDD¤Ī>łäf͚Ń>ȑ#GHIIįÖ[oeöģŁüņĖ/ēÕö½÷ŽĖ÷ß@»vķųķ·ßhÓ¦«łœ„§§sżõ×ćēēĒäɓ¹õÖ[‰å¦›nāĄēÕv×®]y’ż÷¤ßóēĻgÓ¦M®ųČDD…©“²²2}ōQž~śibccńōōÄĻĻė®»Ž}ūöŃ»wļójĻž=¶}777ĀĆĆ1 ®~ģsfZÜ}÷Żüūß’fٲexxxpÓM7wūUŽļ萜œ>ųą×|`""DˆˆˆˆˆŌÉÖ­[9~ü8Ó§OÆö¼U«V1bÄ¢¢¢øųā‹łź«Æųķ·ßčŲ±#|šŃŃŃDDD0ž|žś×æ²eĖīøćf̘ĮńćĒńóóćōéÓÕ^·cĒBBBl÷.++ĆĻĻōōōjūRÓuóēĻgŠ A 80ž|Ģfs?3w÷Ŗ3ÕūöķĖĮƒ8sę =ō111L˜0[o½•ģģlŅÓÓ¹īŗėšóóć믿füųń\xį…\żõdeeUi³  Ą6Å:ŗ#++‹k®¹†o¼‘±cĒņüóĻŪΟ3g'NdģŲ±üē?’±æżöŪIKK恹śėÆÆ¶""Ķ•©“Ƈ„æææÓsNœ8ĮōéÓłĒ?žĮ¶mŪxłå—‰‹‹###wwwņóó9|ų0[¶lį³Ļ>cĮ‚dggóüƒąą`Žxć Ž}÷Ż mVw]uŖėKu6mŚÄāŋYæ~=;vģąūļæg÷īŻüśėÆēõł•––²k×.–,YĀć?Ą‚ Ųµk+W®ä»ļ¾Ć`0šųćÓµkWŪH„K—²råJ¶oßNqq1sēέҶŸŸ’żļ+{ōŃG ćƒ>`Į‚|śé§¶÷VÆ^Ķ«Æ¾ŹOŗ$66£Ńˆ»»;Ó¦M³r©¬ņšU«V1iŅ$†ĪO?żd{ļēŸ¦wļŽ’™™Ym߫룈Hs¤UfDDDD¤NŗvķJ^^™™™„……9<'33“ŠŠŠ ĒBBB8qā„ķu@@€mßĶͭƐå\Æ«®/}śōqz]dd$_ż5‹-ā_’śqqq<üšĆø¹Ūßļ¾ūn.¹äČG}ÄE]Ą±cĒxõÕW+Ō툌Œ¬pm`` m?((ˆÜÜÜZŻ3;;??æ*Ē7lŲĄ /¼@—.]8}śtķŌ¦""͉©“rĮšÖ[ońÄO8<',,¬J‹¬¬,ĀĆƤOF£“Éd{““S«¾TwĄąĮƒyć7Ų»w/Ó¦M£sēĪ5ÖO©N»vķxųᇙ7o·Żv}śō”S§NÜ{ļ½ÕY=uź”m’äɓt芔V÷ r8ścęĢ™<öŲcÄÅűqćF>žųćjŪ©M[ƒšF҈Hó”)3""""R'ƒ^x… ²xńbNŸ>MFFŸ~ś) ąēŸfÜøq>|˜7–ч&&&¦Ęö===ė\¬³C‡”——³}ūvŽyēŪ(ŽźśRŻu’ūß’øõÖ[),, [·n„„„œSQÕ²²2Ūh–»īŗ‹Ī;óŠCa6›™1cÆæž:'Ož,ĮĢķ·ß^”’ž÷攗—S^^Ī|Ąųńć())©Švå{ÅĘĘņī»ļR\\ŒŁlę©§ž ØØČ¶œńš5k*<[Ū¶m+üjÓG‘ęDˆˆˆˆˆŌŁÕW_ĶūļæĻ’ū_ŗuėʐ!CxēwųĒ?žĮ!C åż÷ßēĮdŠ AüõÆåƒ>Ø2uő›nŗ‰ŪoæK/½“Öż ęŃG%66–ččh:wīL›6m0™LÕö„ŗė®ŗź*ڶmKtt4^x!Ɔ cųšįL›6­NŸUzz:7ß|3`YµfŊxyyńöŪosšąA®æžzī»ļ>žųĒ?ņ‡?üaƆqå•Wrłå—WhgŲ°aÄÄÄ0pą@¼½½yśé§+“żŲc±dɒ Ɠ““‰§C‡ 4ˆQ£FŁF–ÄĒĒóä“O2yņd.¹ä|}}yōŃGm÷»ļ¾ūxģ±Ēø÷Ž{)))©UEDš“sYŠŻ`·eŚuó¼oĄhųžŻ·¾ö¶;Ēz¾—Łl~ø!šĶ7ß<Æ!""""-Ń“iÓX¾|y®™2eJÓ*¤aųłł±fĶ†źź®Ō»}ūö1hŠ ŪkG#pœŹ©|¼¶×.złEī}p&“ S¹ “©“É„Łōū¾ÉT~ö=˾Łlę£?äʙ#r¾ĀĆĆ€" ųģfŻ?svæ(<ūŚŗo=Æ(³ŪĢv[­i„ˆˆˆˆˆHVZZ P뢳""R;*Ŗ*"""Ņ •——3eŹWwCjpüųqī»ļ>üq^~łeś÷ļļźn‰ˆ“ DDDDDZ!M}iĀĆĆłč£\Ż i@+W®tŗģ±ÆÆojéŌdٲexzzŖö‹ČY DDDDDDD\¤K—.¶•‚8€Éd"""£Ńˆ§§§«»'Ņ¢)q‘޽{Ūö<ˆÉd¢_æ~ CD‘&¬““”}ūö‘‘‘AQQŽŽŽ“k׎¾}ūāååUės*;~ü8æüņ yyy˜ĶfčÓ§aaa®~d‘F”UfDDDDDDš(³ŁĢ÷ßĻoæżF»vķŁl®ńœŹˆ··7C† !%%…]»vąęęF×®]8p ƒĮՏ.Ņąˆˆˆˆˆˆˆ4Q>>>T8žŸŸX‚ «ŚœcÆsēĪtīܙāābrrrųõ×_9pą”””tģŲŃՏ.Ņąˆˆˆˆˆˆˆ4QaaaųūūsźŌ)¶mŪFhhØmŒæææ­jmα—••ÅęĶ› „sēĪø»[¾: PDZšˆø¹¹Q^^®¹p"""""MŒÉdŅԌ Fm[AꊔCx{{Ó£Gz÷īmūüjsŽ½ŠŠPzõźEzz:›7o,Sn† BHHˆ«[¤Q“ų@$ €ÜÜ\‚ƒƒ]ݱS\\ģtIŲÖhŹ”){xx0`Ą ąōŚŚœ[įuĻž=éŁ³§«[ÄeZü²»]»våĄ®ī†ˆˆˆˆˆT’——‡æææ«»!"­T‹D.¼šB8@NNŽ«»""""""g“ŸŸ_eõ‘ĘŅā___FŽÉoæżFqq±«»#""""ŅźsčŠ!:uꄇ‡‡«»#"­T‹Æ!–¹qĮĮĮųąžūß’ré„—ņ·æżõė×7Ų}y’ż÷ńöövõG R+!""""""ŅB”••ńę›oróĶ73aĀŪń &——Ē믿Έ#0 õ~oƒĮ@PP«?‘ZÓ‘bß¾}äęę2yņä*ļMž<™ģģlöķŪǬY³HJJ 99™Ūoæ€;vpß}÷1kÖ,īæ’~vļŽ Ąžżū¹łę›yė­·x蔇^ŸĶå—_Naaaµm͘1ƒ}ūö°gĻ.æüröīŻ Ą/æüĀĶ7ßģźQZ """""""-Dff&AAA§­ųųųDff&d’žż€%D‰ŠŠ"//gžy†[o½•7ß|“™3gņ·æż¢¢"<<<((( €gžyĘįõöŖkkąĄ¶d×®]ōīŻŪ–ģٳ‡Aƒ¹śc”VBˆˆˆˆˆˆH įīīŽÉdrś¾ÉdĀĶĶĶa ±uėVڵkg 7¢¢¢`ĒŽ Š‹‹™2e ¾¾¾5"Õµ5hŠ öģŁĄĪ;™:u*»vķ,ČąĮƒ]ż1J+”"""""""-Dxx8999œ>}__ß ļ’““Cūöķi×®’üē?)))įĄ 8U«VqģŲ1āāā*\węĢĄ¶XŪ8p`•ėKJJl×äää8m+**Šwß}“ÉÄįƇ=z4ļ¾ū.f³™½{÷rĒwøśc”VBˆˆˆˆˆˆH Ihh(_}õ×]w]…÷V¬XAxx8={öÄ`0ʚ5kˆˆˆĄ×ח   :uźÄæžõÆ*ķ¦§§W(ÄXåzū@¤ŗ¶¼¼¼Ųøq#]»vÅh4rĮšć?āėėKHHˆ«?Fi%4eFDDDDD¤…0 Üu×]|ōŃG|ūķ·Q\\Ģwß}Ē’ž÷?ī¹ē[°1hŠ ¾łę› ÓZŽ?ĪĪ;ČČČąöŪo'//Ļį½*_oƦ¶¢¢¢Xŗt)żū÷ _æ~|öŁgš.#J#DDDDDDDZK.¹„¹sēņĮšÖ[o–‘#sēε`™öņå—_ŚVuń÷÷ē©§žā­·ŽāōéÓø»»sżõ×ćļļOvvv•ūT¾Ž^um%LY±b·Żv` DŽ’}žųĒ?ŗść“Vä\Ÿ6Ųm` U¬›'ąx>@Ą÷ģ¾õµ·Ż9Öó½ĢfóĆ®ž0DDDDD¤īĢfsµÆsÕµ‹^~‘{œƒÉdĀTnĀd*Ēd2a6ż¾o2•Ÿ}ϲo6›łčùqęķ.ž“Ešæššš (>»Y÷ϜŻ/ Ͼ¶ī[Ļ+Źģ6³ŻVkš2#"""""""­ŽiuˆˆˆˆˆˆˆˆH«£@DDDDDDDDZ""""""""Ņź(‘VGˆˆˆˆˆˆˆˆ“:ī®ī@]żļ’suDDDDDąžųĒ?ŗŗ "Ņ4»@`Ź”)®ī‚ˆˆˆˆˆøĄW_}åź.4 7nä’ūéééxxxн{w®¹ę† v^ķ¾ņŹ+lÜø‘W^y…›o¾™O?żŸF¾ģģl¦OŸī²ūKĖŠ,‘ĀĀBWwADDDDD¤IJJJā_’ś³gĻę’K.”““”ü‘W_}•:йsēsj×l6óķ·ßņꫯĢūļæ··w£=×Ė/æLLL $00°Ńļ/-O³ DDDDDDD¤ŖņņrŽzė-n¾łfF€»»;111ÄÄĜWŪÅÅŔ——Ó¶m[ AAAślééé¶}WÜ_ZžYTÕd2QVVFii)%%%”””PZZJii)&“ ³Ł\Æ÷²n""""""®ō믿’Ķĉ«=oĖ–-ÜsĻ=üå/į®»īā‡~ąčŃ£üéOā»ļ¾ćöŪogŚ“i¼’žū,X°€Gy„“'Orłå—ŪFļžłē̘1ƒ»ļ¾›oæż–kƽ–ōōtRSS™:uŖķ¾ååå\~łå?~œżū÷sóĶ7óÖ[ońŠCœœĢķ·ßN\\wŻu;wī`Ń¢E¤¤¤°pįB,X@vvv…ūŸĖ󈓨"ååå\yå•ųłłUy¢_æ~xxxąéé‰Į`8ļū=ųąƒ,X°³ŁŒ››%[²žil™™™“mŪ___§ēäääšÜsĻńĢ3ĻŠæöīŻĖc=Ęæ’żoŒF#gΜįĉ,Z“ˆżū÷3{öl®ŗź*y䮹ę^xį… ķeddšöŪoóŹ+ÆĮ;ļ¼Caa!nnn”——;퇇‡šĢ3ĻPTTīƾŹßžö7z÷īĶ—_~IBBļ¼ó·ß~;ÉÉÉ<šĄ 8ģģģó~ž¶mŪŗś×%.Ö¢« ąååEYYīīīø¹¹įęęFiii•) C…#Ö$ƒĮn Ūqė{EEEœ:uŠāābŪ}¼½½ˆˆˆˆˆˆˆĖĘGÆoŪ¶vķŚŃæśöķKūöķŁ±c}ūöÅl6słå—Š«W/ŒF#'Ož$<<Üa{»wļ¦k×®DDD˧Ÿ~Zc_ ÅÅÅL™2Åą|üńǶ÷ ÄkƽfūVßĻ£@DZd RVVf &ŒF#ø¹¹ń׿ž•[o½•²wļ^Ž~ūmŲµkļæ’¾-¹į†čßæ?YYY<ūģ³L™2…¤¤$rss‰‰‰įü#óēĻ';;›W^y…[n¹///<<}Śö:33Ó¶ļęęVį;RAAA…k풘¼nŻ:¾ūī;,X@BBsęĢ©Õżėūy¤õh‘Čܹsyä‘Gxųᇹēž{xä‘G(--„_æ~¤¤¤PVVĘŽ½{‰ŒŒdėÖ­téŅ…ąą`Μ9Cxx8ķŪ·g×®]¶*ŹĆ† £ØØˆ€€üżż9uź„„„˜ĶfL&“mJ Ń!"""""ā2ƒY³f±dɾžśkŪT’µk×rŪm·±’~LVV»wļ`×®]deeuN÷ģŻ»7ąčŃ£|ūķ·¶ļEĮĮĮ”——óŪoæ°bÅ §ß™ šóóĆĻĻāāb>’üsŠŠŠKĶ‘üüü*×Õ÷óHėŃ,§ĢTN’¬¬µAyä<==1›ĶxzzāīīNNN;wę·ß~#??ŸŠ”C~üńGRSSyę™g€ß‚‚ņóóńōōäĢ™3¶¶Ąņ/¤µ¦HQQnnn ŒF£mX—ˆˆˆˆˆˆ+Œ=ooož÷æ’±hŃ"ÜŻŻéŃ£·ß~;½zõąńĒēõ×_§ØØžxā lįC]tķŚ•ėÆæž‡~˜ąą`®¹ę ƒn¼ńFžzź)ڶmĖu×]‡···Ć)+cƌa͚5ÄÅÅŃ®];ī¼óN<Čc=ĘĖ/æĢĉYøp!Ė–-ćńĒ·]PÆĻ#­G³ Djbż—ĻRXkˆÄ®]» Ćh4āēēGēĪłĖ_žb››ęīnłXN:U”-k}£ŃXaŲ—u„ˆF‡ˆˆˆˆˆHS0tčP†źōżččh¢££«gŊŽYGj޳ߟ>}:Ó§O °°“Éd+Zj’Ą„ ¶ķėėĖß’ž÷ ÷^øp”m’ę›oęę›ovx’s}iŻZä”°„Ö0ÄZģŌh4ŅÆ_?Ö®]Kdd$f³™ČČHŽ9Bff&nnnäēēóā‹/RXXh+Üć(ģpww§¬¬ĢVĒŗ‰ˆˆˆˆˆ“&EEE<ōŠC¤¦¦°råJ:vģX„Š©HSÓ"Gˆ<÷ÜsUŒĖ/æœI“&ѧO¾łę.»ģ2 mŪ¶å/ł Ÿ|ņ eee˜L&ʏŸŸŸmjŽuDˆ}ŠŠP|}}yå•Wø’žūmUkZJDDDDD¤%ńööę²Ė.ćŁgŸ„¼¼œąą`yäWwK¤F-*1¼÷Ž{RXXHyy9F£ƒĮ€››eee\xį…¼õÖ[”””P^^Ž»»;dĄ€”––R^^n 5ڵkĒ+Ƽb;ęīīĪK/½DYY„„„Ģ;ׂT· ”ˆˆˆˆˆHK6iŅ$&MšäźnˆŌI‹ DĄ2½ÅĖĖ ƒĮ`+² ŲjFŪtė 1֚!nnn”——ŪŽ[Ćwww[ča_@ÕZGÄśÓ:‚DDDDDDDDš¶ˆXė…XGoĄļ«ĒX ¤¶‘ Ö×Ö5²ķW>מ<+ū@DÓeDDDDDZ®eĖ–¹ŗ "ROZ\ ē>R£ŗ0£ņ{ >DDDDDZŸ   WwADź‰ęxˆˆˆˆˆˆˆH«Ó,GˆlٲÅÕ]‘f¬Y"""""""āŲµ×^[”ęaYY™™™lŻŗ•¢¢¢sn×ŪŪ›+Ƽ’„K—āīīnŪ/++sõ#‹œ“fˆŒ?ŽÕ]X½zµ«»Š,$''“••€§§']tƆ cķŚµõŅ~qq1_|ńÅy‡!ŃŃŃÆŃ&V®žx¤k–#DDDDDDD¤öŒF#€m*MXXÄŻŻ²²2¶mŪFVVžžžŒ?žŻ»wÓ£GÜŻŻIII!%%„B{öÓgŹŹŹ ** ???ŅÓÓŁ½{7f³™Ī;sį…b4)--eėÖ­œ8q‚ØØ(‚ƒƒ:t(§Nā‡~ }ūö 0£ŃˆÉdb×®]=z”   FŽÉ”C‡ ŃH!© DDDDDD¤UūłĒõNßėÕēBWwļ¼y{{ÓÆ_?Ž9‚ŁlĘĖĖ‹#F°aĆ233 cäȑ|õÕW˜Ķf<<<0|żõ×2qāDŽ=źtzŒŃhdōčŃģŲ±ƒƒāįįALL >|˜!C†šż÷ßsźŌ)zöģÉE]Ä’żß’±mŪ6:wīĢęĶ›9qā^^^ >œuėÖqāÄ BBB;v,+V¬Ąd2įééIqq1ß’½«?Ri!ˆˆˆˆˆˆH«6r§ļeIsu÷Īɘ1c0›Ķ ŒF#iiilŪ¶ °Œ),,$33ÓņŒ™™Ó®]; 8pą999äååJFF†Ć{…††b08xš „„„¬\¹ŅöžēŸžūē™™ÉąĮƒ1  愇‡sęĢ[=‘“'OrśōiĀĀĀČĶĶÅh4ņŪoæQZZźźW 5šĻJõIDATZ""""""ŅŖä`2™0›L˜L嘬?ĖM®īŚ9[»v-YYYø¹¹1yņdNžü°ņņņŖ—ā­"Ž(‘V­%N™±wčŠ!"##éׯŪ·oēųńćDGGÓ®];Nœ8ÆÆ/£Fb͚5¶kŗuėĘ/æüB@@žžž¶%|ÉŹŹĀd2ѳgO~żõW<<<=z4Äd2QRRBII F£‘^½ząīīNii©­6`ėWhh(YYY„††Ņ¦M233."ēCˆˆˆˆˆˆ“j-qŹLe;vģ`̘1¤¦¦’ŸŸĻ† 4h˜ĶföīŻKII ^^^–ĻĀlfҤIø»»³mŪ6NŸ>ķ4”(//gŻŗuDEEŃ·o_Ģf3‡ę·ß~ĆŻŻ.]ŗ0eŹΜ9ĆÖ­[ń÷÷gģŲ±¬ZµŠ““4†Jdd$kÖ¬aćʍ <Ų¶śĶ† (..V " ¢E"Ÿž9]ŗtašąĮ¶cf³™åĖ—3uźŌFļOQQ+W®äŹ+Æ¤ØØˆoæż–«®ŗźœŪ[»v-cƌ©—¶DDDDDÄ¢„M™Y²dI•c'NœąÓO?µ½ĪĢĢdÕŖUÆ7 —Ś-**ā“O> ¬¬Ģ¶–ā«IIIUŚ*--­rü»ļ¾³ķļŽ½›Ż»wŪ^gdd8,ޚ››[”’"õ”E"nnnœeFDkQˆÉdbĄ€lß¾˜˜ C•s233Ł»w/`=ҧOŚ·o_᜜œŪP®3gĪ0zōh²²²Ų³gméŖ~żśJ~~>?üš]ŗtįŲ±c”––Ņ£Gŗwļ^”ĶŹ£:Ž;ƾ}ū(//' €!C†`49|ų0ū÷ļ·-C5pą@BBBųńĒ)**āēŸ¦_æ~ŚröL§OŸfƆ ōčуC‡Q\\L×®]鯻·«U"""""MFk˜2#"U¹¹ŗõ-,, ___ŪŗŁöŠ‹‹Ł¼y3C† aģŲ± :”-[¶T©ZģęęFAA”””Œ=š’’6oŽLTTcĒŽ%**ŠĶ›7SVVĄ™3gšńń!&&†Q£F±gĻNŸ>ķ“EEElß¾įƇ3qāDĄ²Īwyy9;vģąā‹/&&&†¾}ūņóĻ?0`Ą¼½½2dH­ŸÉ`0PXXˆ››cĒŽeōčŃüņĖ/¶jŃ""""""öņóóN¹i‰Z\ –š %%„ŹŅP'Nœ 00ж””ÆÆ/N+&wéҰŒĄ°VWš÷÷§mŪ¶¶ė :u,kpsźŌ)§ż;qāAAA¶Ā@C‡„gĻžF.æürŚ“i@HH§OŸĘl6WŪVuĻd6›éڵ«­oZ¶JDDDDDD¤…M™±ņńń”{÷īģŚµ«ĀˆŠāābŪ’NVĪÖŌöšš°M¹)..&;;»Ā2T`™¢c=×ĶĶ­ĀµÕĀ(..ĘŻŻńGæwļ^²²²pss«6©ķ3¹»»W˜:dŠ#"""""u7vģXWwADźI‹ Dzöģɚ5k8yņ¤ķ˜——W•𣸸//ÆjŪņöö&((ˆ#FTy/??ŸŅŅR[m°TR®RŲóōōt˜9r„ŒŒ ƌƒŃh¤ØØˆÆæžŗŚ¾ė3‰ˆˆˆˆˆˆ“f-rŹ Xź€ 8;vŲFo“k׎ÜÜ\ņóóK˜‘——G»vķŖm«]»vää䐗—X‡¤¤$[Øa6›9rä`©rźŌ)BCC¶Fvv6………lß¾½{÷RZZŠ——F£³ŁĢÆæž XÖõvss£¼¼ÜaßĪå™DDDDDDDZ³;B,aAŪ¶mma——C‡µ*øč¢‹jMįééɰaĆŲŗu+f³“ÉDÆ^½lSS¼½½ÉĻĻgķŚµ”––rį…āććć“V‡··7QQQlÜø³ŁŒŸŸżśõąšįƬ^½śõėg[ÅfĈxzz²vķZ† fk«ŗg:s挫"""""""M’įÆ1Ų]ėn·y^€7ą“|Ļī[_{Ūc=ßĖl6?\››’ļ’cüųń®žÜlņóóYæ~=“'OvuWDDDDDZ¼Õ«WóĒ?ž Jmˆææ?F£‘1cĘ0fĢŪ9éééµnÆ.ēŠ4' DDDDDDDZĪ;³lŁ2""" ©ņž¢E‹HIIaįĀ…ōīŻ›G}”ääd>ųąŠ‹‹ió’Ū»óšØŖĆ’ćŸ™ģ{BJH†Å‚ Č"›¢ŲĮ"żŠÕZE)ućqū¶?Ūśµµ~i]Zq©UŖ“čAAA@Y&Y€,$™I2dīżż‘Ģ0™l“dŽÆē¹OīvĪ=÷$’äóœsnt“ī¹ē]zé„ ī½łę›õĄčĆ?”Tūˆ‰'ź’ų‡:uź¤ h͚5’j§+]y啚>}ŗē‹œĄ¹„@Ī#÷ŻwŸęĪ«3fØ{÷ī0`€FŽ鳐Ưwß­µkןP’žżUUU„_|QO>ł¤z÷ī­>śHĻ=÷œ^żõ÷īßææÉē~ūķ·śä“O4ž|EEE©¢¢BĻ?’¼Ž9¢.]ŗŗ[€ĪŪĻī@0JKKÓ_žņĶ›7O×\sņņņōč£źOśS£‹ĢFFFź½÷ŽSļŽ½%I P~~~£÷6'&&F‡CŸ|ņ‰ņņņ«’žļ’& Į9‹"pźŚµ«ŗvķŖ‰'źŠ”Cš5k–vīܩԻĻ4MżóŸ’ŌęĶ›.§Ó)I2 C!!!­zޟ’üg-]ŗT|š$é'?ł‰¦M›Ę”œ“Dą<×­[7%$$ج¬¬Įµõė×ė³Ļ>Ӌ/¾Øųųxķßæ_æśÕÆ­ĒjµÖ9RQQQļzĻž=õĄHŖ]ŒõžēŌ±cG]uÕUī ¦ĢĄy"//OÓ§OלõėU]]-I²Ūķz÷Żwåt:=£CĀĀĀT^^.©6ԈUll¬Ŗ««= ¦VUU5ø·C‡r¹\ŹÉɑ$-_¾Ü3ścõźÕzę™g<#LŅŅŅßź©7ĄŁĀ8OŲl6=ųąƒZ²d‰žž÷æėäɓŠŽŽVß¾}õ—æüÅó)Ž«®ŗJĻ>ū¬>ųążīwæÓš5kōóŸ’\;vŌ=÷Ü£C‡é±ĒÓ /¼PļŽ’żß’ÕōéÓõŪßžVqqqŗłę›)Ć04räHķŁ³GwŻu—,‹BBB4bč7.ŠŻ4Ŗ-¹,^›TŖø·pI’"%EIŠ–S·ļ>ŽōŗĒ}„išūóšE‹éŹ+Æ tæ€Õ«WkņäɒŌ`äAc#;÷Ź s5ūĮ92 C†Ėaød†LćŌ¾aøź®Õ©-\Øé·ßč.~š:uźōœ¤*IÕu›{ßQ·_!©²īŲ½ļ¾Ļ)©Ęk“$ÓkóŪr„ČźÕ«Żšöƒ D¦M›č&šŅ֑§[N‹Ŗ€ C ‚:" čˆ€ óƒūŹ JJJJ › 0BtD@Š!A‡@tD@Š!A‡@tBŻVUUUzė­·<Ē‹EQQQJKKÓ AƒŌ”C‡@7ńgžüłŠŒŒŌŒ3Żœć!fµZÕÆ_?]|ńŊUNNŽ–,Y¢Ć‡ŗigĶ‘#G4ž|9ŽÓ*3räHeddśušĄ°ŠŠP1Ās¼{÷nmÜøQk×®Õ-·Ü¢@7ńŒ;xš`»”éŪ·o _?"pŽéׯŸöģŁ£ŅŅRŹf³©ŗŗZŪ¶mÓĮƒåp8­Ī;+==]QQQ’$»Ż®Æ¾śJłłłr:źŌ©“†®¤¤$9½óĪ;JJJŅŌ©S=Ļzć7dš¦~ń‹_xī±ŁlźŃ£‡¶lŁ¢°°03F‡C_~ł„$iųšįźŁ³§$Éétź›o¾Ń÷ßƊŠ EEE©k×®:tØ"""dš¦^}õU%&&jōčŃŚ°aƒNœ8”ÄÄD5J)))Zŗt©ņóó%Iļ¼óŽŅÓÓ5xš`åååiėÖ­***’ÅbQJJŠFŒ”ÄÄÄ&ĖųN™i©ßüiĪOL™€sPrr²$©¬¬L†ahé҄ڵk—l6›F­nŻŗiļŽ½śųće† ĆŠņåĖ•““£Ž½{ė²Ė.Saa”–/_®źźjæžé‰RZZŖÜÜ\uķŚUZæ~½²²²tį…Ŗ²²Rėׯ—a2MS}ō‘vģŲ”^½ziĀ„ Ób±HŖõqå•WŹjµźĄ*--Õ5×\£„„åęęŖ““Tv»]ååå:~üø’““•’’"Ć0§nŻŗé»ļ¾SAARSSe±XT]]­1cĘ(11Q†ačķ·ßVYY™g$Kxxø$©sēΊŽŽ–$Ż~ūķ2MS‹E†ahūöķ*..–aM–ńęOæŁl¶Ūē~Ī/"pŽ1MSĒ—$%$$ØØØH’”˜˜Xト„åē竬¬Ģs.66Ö³?lŲ0 6L’ZµXitt“BCk’] Wee„$IQQQ*--•ĖåņŌYRR¢O>ł¤^”””*++SjjŖēŲŻ~«ÕŖččhUWW«¦¦¦ŃĄĮ0 mŚ“IĆįšDīžńGEEE‹żf³ŁŚŌ>üšˆĄ9f÷īŻ*++S||¼RRRČĢĢŌīŻ»uį…jĈ т tņäIæėp‡Cžō‚XMM6nÜ(Ó4U\\¬üü|…††źŠ+®T;%¤C‡:zōؾųā „„„)//O………źŠ”ƒ:wī,Ó4• #GŽhĖ–-ŠÕĪ;eµZÕ½{w…‡‡+..NåååśōÓOÕ±cGłä“zēV®\©!C†ŗiĄ9ƒ@Ī3W\q…>żōS™¦é9·råJ=ŗŽ}+W®Ō”)S4qāDM›6MŪ¶m“T;šdģŲ±Z¶l™¦NŖ«Æ¾ZóēĻ—$eggkĈž:\.—ŅÓӕ——×lĄ¹†@Ī3=zōPtt“vķŚ%IŚææ,‹zōčį¹§²²RO?ż“~÷»ßiéŅ„š}z‹õś#ŽÓhŚZ'L™€óŌ5×\£×^{­Įt©6Ȉ‹‹S||¼ŖŖŖ“hŃ"I’Ćįh¶ĪŽ;Ź0 eeeI’žóŸ’ČjµžV@ ˆĄyźź«ÆVQQ‘®ŗźŖFÆ%$$čŗė®Ó½÷Ž«›o¾Y}ūöÕ=÷ÜÓl ŗóĪ;5{ölM:U©©©ŠŒŒ”am®KĖX¼Ź†zmį’"$EJŠ’-)¦nß}éuūžÓ4tgh=ßõ![/¢©5$Qö•ęjöƒsd† —!ĆpÉ0 ™Ę©}ĆpÕ]«Ż7MS’ZøP÷?ņŪ÷6šĆg±Xž“T%©ŗnsļ;źö+$UÖ»÷Ż÷9%Õxm’dzm~c„:" čˆ€ C ‚:" čˆ€ C ‚:" čˆ€ C ‚:" čˆ€ C ‚:" 脺¬ŖŖŖōÖ[oyŽ-‹¢¢¢”––¦Aƒ©C‡žkóēĻWdd¤f̘čf·‹óķ}šĆC fµZÕ§O¹\.)''Gß’½ĘÆ®]»J’FŽ©@7µMŽ9¢eĖ–éæžėæżƒœD ĄBCC5bÄĻńīŻ»µqćF­]»V·Ür‹BBBŌ·oß@7³Ķ<ŲąÜł}p~ €sLæ~ż“gĻ•––Ŗ°°P6›­Į“¼¼|X_żµJJJdš¦:tč ōōtuéŅEK—.U~~¾$éwŽQzzŗÜą}ģv»¾śź+åēēĖétŖS§N>|ø’’’Z|Š,Ŗ ē äädIRYYYƒkÕÕÕZ±b…Š‹‹5fĢ 2D¹¹¹Zµj•$Éåré“O>QAAz÷ī­!C†hļŽ½²Ūķ²Zk’ “X,²Z­Ŗ¬¬Ō¦M›Ō½{wŁl6?~\«WƖ$†”„K—j×®]²Łl=z“ŗu립{÷źć?–ar:Z±b…\.—ĘŒ£1cĘČ4M­]»VN§SŠ‹‹“$;V={ölš>†ahłņåŹÉÉQļŽ½uŁe—©°°PĖ—/Wuuu‹ĻŚ‚"p2MS’]g#""B·ß~»LӔÅb‘aھ}»Š‹‹e† UQQ”N:y¦ātīÜY ,ØWŸÅbQuuµĘŒ£ÄÄD†”·ß~[eeer:*,,Tqq±RRR4zōhIRĻž=UTT¤üü|(11Q¦iŖ²²RåååJIIŃĉZūļf§Nīiƒ{ oyyy*))Q—.]”žž.©6Ś»wÆrss•––Öģ3€¶ąÆĪ1¦iźųń撤„„„× ĆŠ¦M›tąĄ9Oxā.ėp8$Ińńńžó111 ­wÆT»~‰{šÕjUtt“Ŗ««USS£ŠŠ Iņ\wKHHP~~¾ŹŹŹd³Ł4vģXmŪ¶M›6m’TāōīŻ[#FŒšŒHiŽū9±±±žsƆ Ó°aĆ<ǧū ĄœcvļŽ­²²2ÅĒĒ{Öņš–™™©Ż»wėĀ /Ԉ#¢ čäɓ’äYŪĆ{ŗŻnWMMM«¾ģā(JKKė/))‘T²Hµ£Fzö쩪Ŗ*;vL;vģŠž={d³ŁŌ£GŸć®§¼¼Üsī›o¾Ń¶mŪ”‘‘”~żśö3_"`555Śøq£LÓTqq±ņóóŖ+®ø¢ŃūŻĮ‡Żn×÷߯(""B'OžTNNŽ~üć+**J………Śøq£’““•Żź‘;wV‡tōčQ}ńÅJKKS^^ž Õ”CuīÜYłłłZµj•ŅŅŅŌ«W/IņL‘qOqOmٹs§zōčŃ ä±ŁlJHHŠ‘#G“eĖÅĘĘjēĪ²Z­źŽ½»_ĻZ‹@Ģ0 ķŽ½[’©īŻ»kšąĮž…U}õķŪW*((Pyy¹ØžżūkŻŗuŚŗu«ŗwļ®k®¹F6lŠŽ½{«ŒŒ ÉårłŻ.«ÕŖ‰'źėÆæÖ”C‡”­˜˜]zé„]“'OÖ“iÓ“nŻ:æŽē68Lš4I«V­’Óé”$9N}öŁgš4i’$©““T=ōfĻž­’ūßśÕÆ~„‡zH••• WYY™õüóĻ׫÷ü£¤ŚŠbŚ“iZ¼xq½µDžļ’žOS§Nm¶m”””²Ūķ*,,Ōū￯ēŸ^ƽöšŹŹŹ“k×.-Y²Dļ¼óŽ–,Y¢·ŽzKūöķÓ”C‡4gĪ%$$č‰'žŠ’ųGUVVźé§ŸÖļ~÷;-]ŗT“'OÖžš‡fŸŻ\ßś½ėį‡֜9sōŸ’üG?žø{ģ1?~¼Ł÷Į¹@Ī# P‡“vķZIŅēŸ®Ž;źŅK/•$m޼Y:uRFF†$)##CIIIŚŗu«,‹ŖŖŖ4uźTÅÅÅ5łŒ±cĒŹåriƆ ’¤ļ¾ūN………~MÉ1 C“'O–$õéÓGV«UGU\\œģv»>ųą>|Xńńńzę™gtĮ4Ø#**J«WÆVæ~ż$IC‡Unnn³‹½¶„Œ$mٲE©©©>^UUUZ“h‘$yAmLKe¼ė÷–‘‘”ĀĀBϳ۷oWaa”†zf~y8kDą<4iŅ$mړɳ˜Ŗ[BB‚ęĪ«gŸ}V7Üpƒī»ļ>Ż~ūķmśœī“iӔ™™©)S¦œv{ƼņJEGGkŹ”)š4i’~śÓŸjąĄŗöŚk%I'NŌļ’{Żyēŗśź«• ė®»N÷Ž{Æn¾łfõķŪW÷ÜsO“õ·TĘ»~oIIIśóŸ’¬gžyF“'OÖܹsõĢ3Ļ4˜Fƒž¶|TŁāµIµÓnÜ[ø¤I‘’¢$EKŠ©ŪwGzŻć¾?Ā4͇ŻZĻw †ĘÖdhj†@”}兹šżą†!ĆeČ0\2 C¦qjß0\u×j÷MÓŌæ.Ōżü6Ą½}nÉĢĢŌ£>Ŗ?ü°Į:@S,Ės’Ŗ$U×mī}GŻ~…¤Źŗc÷¾ū>§¤ÆM’LÆĶoüÅZĶn·ė/ł‹n½õVĀü ńW h•7ŽxC'NTļŽ½5uźŌ@7h¾2h•;īøCwÜqG ›œFˆ€ C ‚:" čˆ€ C ‚:" čˆ€ C ‚:" čˆ€ C ‚:”n«ŖŖ*½õÖ[ ĪGGGĖf³i芔Š‹‹ t3Oū½,‹¢¢¢”––¦Aƒ©C‡gōłÆæžŗ,‹īøćŽ@wĪaŒ€³Z­ź×Ɵśõė§¾}ū*&&FūöķÓĒ,Ć0ݼŽ9¢łóēĖįpųõ^_|±bcc•““£%K–čšįĆķž, µ!Ŗ#FxŽ ĆŠ¢E‹TZZŖŅŅŅ3>¢¢µ<Ų¦÷ڽ{·6nÜØµkן–[nQHHH»= h-8¹G†X­µūN§¾łę}’ż÷ŖØØPTT”ŗvķŖ”C‡*""B’d·ŪõÕW_)??_N§S:uŅšįƕ””äW¦iźÕW_Ubb¢F­ 6čĉJLLŌØQ£”’’¢„K—*??_’ōĪ;ļ(==]ƒöėśõė§={öØ““T………²ŁlŹĖĖÓÖ­[UTT$‹Å¢””1B‰‰‰M>«¹2nV«U‡ҦM›TQQ”¤¤$9R)))’Ōb‡Ö×_­’’™¦©:(==]]ŗtńū÷ŃR,¦Ģ@€ÕŌŌhćĘŚøq£6lŲ >ų@‡C]ŗtQbb¢LÓŌG}¤;vØWÆ^š0a‚¬œœ­X±BRm€²|łråääØwļŽŗģ²ĖTXXØåĖ—«ŗŗŚÆ:,‹¬V«*++µiÓ&uļŽ]6›MĒ×źÕ«%IžuMʎ«ž={¶ź]“““%IeeeŖ®®ÖŠ+T\\¬1cĘhȐ!ŹĶĶÕŖU«š|VKeÜ\.—vīÜ©čā‹/Ö±cĒ“råJÕŌŌ“X‡ÓéԊ+är¹4fĢ3F¦ijķŚµr:~õeKu š!f†vļŽ]ļ\æ~ż”‘‘!IŹĻĻ×ńćĒ•œœ¬””†”øø8uėÖMß}÷ TSS£’’uéŅEééé’jC‡½{÷*77WQQQ-֑šš*‹Å¢źźj3F‰‰‰2 Coæż¶ŹŹŹ<£NĀĆĆ%I;wVttt«ŽÕ4MIRHHˆ"""tūķ·Ė4MY,†”ķŪ·«øøX†a4ł¬ęŹøGŌø\.;V111’¤£GźčŃ£*,,TēĪ›­£¦¦F¦iŖ²²RåååJIIŃĉZū/t^^^‹}ßl<~`įįįśłĻ.Iھ}»¶lŁ"»Żīłēٽ hII‰>łä“zeCCCUVVę™bė¹6lŲ0 6L’“oß¾ėHMMõ»§ŽX­VEGG«ŗŗZ555ž€¢-LÓŌńćĒ%I 2 C›6mҁäp8}ŗ>’üóviGll¬īŗė®V•±Łlš3gŽęĢ™£Ē\‡Rfff»¼wHHˆĀĀĀŚåŻ)4Š œŸśōé£ 6čņĖ/WVV–ʏƽ{÷*==]YYYŹČȐišZ“h‘Nœ8!IJHHŠ-·ÜŅ ®>śHū÷ļWxxø\.—ʏÆ /¼P ,PEE…,‹"""4cĘ ķŪ·OŸ~ś©”ŸŸÆ=zČ4M•””čĉŗ’žūŚās—,Y¢żū÷ėß’ž·n¼ńĘFŸRÆLYY™ŠŠŠ4räH}łå—*))QRR’œN§^}õU…„„(**JEEE’jƒ”–ŚZYY©—^zI>śØ²²²“jÕ*ÅÅÅÉįpČįphöģŁĶ‹EŻŗuSQQ‘ģv»Ž|óM………©ŗŗZ;vŌ“iÓ“aĆķܹSV«UIIIž÷Žææ~ö³ŸÉf³éŲ±czżõ×õč£*222Š^§"€3⢋.ҁ$I‡ŅŠ”C•——'IŚ·oŸzõź„-[¶($$D3gĪŌĢ™3%IŪ·oÆWĻž={”——§_’ś×š9s¦f͚„‹.ŗH›7o–ÕjÕ=÷Ü£™3g***J›7o–ÅbQyy¹n½õV=ōŠCśüóĻuÕUWé®»īRbb¢¾’ž{æž;jŌ(uķŚU7ŻtS“ĻņµnŻ:]qÅ’¤+ƼRk×®•$m޼Y:uŅĢ™3uŪm·Én·K’_mõf±XT\\¬[o½U3gĪTll¬rrršż=?~\»vķRÆ^½£Y³fé®»īŅģŁ³•““£āābY,Y,Ż}÷ŻõŽ{ģŲ±Z·n$ićʍ=z“$)"""Š^§"€3",,L;vŌ·ß~«øø8Y­V%&&*++KÉÉÉ W~~¾²³³›¢qäČuėÖ­ĮłĀĀBuķŚÕsl³ŁtōčQ%''+55URķōŽøø8%%%I’¢¢¢ät:żz®?Ļņęr¹“eĖ%$$hƆ ’¤’’Mœ8QEEEźŌ©S½ņn-µÕ—Ķf“Åb‘$ÅÅÅ5zO^^žžś×æŹb±(..NÓ¦MSjjŖJJJ“pįBÅÄÄČb±čĉžņŽķs4h–.]ŖźźjķŚµK<ņˆ$#DDgLß¾}µråJĻz!½zõŖwl³Łd·Ū5}śōzåŹŹŹ<ū;w֚5kŌššZotDnn®zōčįW»šz®/Ć0ü~Ö¶mŪŌæŻtÓMžsK–,ŃÖ­[•””¤ĀĀBI’išŹĶĶ=£żn³Łōąƒ68æaĆõīŻ[ćʍ“ŻnWff¦LӔ$Y­§&‘øß;$$Dééézļ½÷tŃEy¦ę<ōŠCg“żgSfgLŸ>}”™™©^½zI’z÷ī­Ż»w«OŸ>’¤ōōtY,½ōŅKzõÕWõź«ÆÖ CÜu\pĮzī¹ēōā‹/źÅ_Tff¦†*Ć04oŽ<Ķ›7O.—K~µĖŸēvčŠAĒכo¾é׳VÆ^­įƇ×;7|ųp­Y³F—]v™ņņņōā‹/ź7ŽPBB‚'ˆ8›.½ōR}õÕWzķµ×ōį‡jȐ!Z¼xq“ļ-IW\q…6nÜč™ tņäIĶ™3笷½½YŚXĘāU6Ōk —!)RR”¤hI1uūīćHÆ{Ü÷G˜¦łp ;@ėłžS×Ų?yMżćˆ²Æ¼0W³œ#Ć0dø †K†aČ4N톫īZķ¾išś×Ā…švŪ/ÜŪĄŁ—ŸŸÆÅ‹köģŁķR_ZZŚs’Ŗ$U×mī}GŻ~…¤Źŗc÷¾ū>§¤ÆM’LÆĶoL™Z¹r„vģŲ”Ūn»-ŠMiw" QćĒ×ųńć݌3‚5D@Š!A‡)3€vuģŲ1=łä“źŅ„K½ó“&MŅÅ_čę5«¢¢Bļ¾ū®īŗė®v©ļ­·ŽŅŠ”CuÉ%—œŃgŸĢĻSńkóŚ©“ē\äÅ}•ž”²’ū@‰Ó~ÖŖśœräŲ²Y‰7ßRļ¼į°·©¾s ŻŁl6=üšļc¢±±±ķ†œķg‡uī¢w4,ļwxqņ¤Jß_¤Äé·J’,–†¦µFǜaˆD 8‹ž~śiŻqĒJIIQAAžłĻźį‡Ö¢E‹tāÄ IRBB‚n¹åmŲ°A;wī”ÕjUYY™~ö³ŸÉf³éŲ±czżõ×õšĆkĮ‚ŖØØÅbQDD„f̘”}ūöiÕŖUŠ‹‹“ĆįĆįŠģٳŚčs¼•••é„—^Ņ£>ŖĢĢL-]ŗT‹E×_}½Ń-v»]o¾ł¦ĀĀĀT]]­Ž;jŚ“ir:zõÕW¢ØØ(I’²²²ō駟*!!AłłłźŃ£‡LÓTII‰Nœ8”ūļæ_•••žggee5śaaa­źo£¢\%I䙳åųr½ ‡C±ćĘ«ü“e Iź čˆŸz÷O?ÖÉĆUžÉ2Eō¾X®Š2•}šoåå2œÕź0ćÕUžśŖæĖRÅźO%Ywõ5 ļŃ3Š^­B hwyyyš;wn½s<š€FŽ©M›6iҤIśņĖ/ułå—kĖ–- ŃĢ™3%I .ŌöķŪe±Xd±Xt÷ŻwkėÖ­Z·n¦M›¦7jōčŃŚ¼y³¬V«ī¹ēIŅ¢E‹“yóf%''«øøX÷Ž{Æ,‹ęĻŸÆœœ•••5śœAƒ5ś™™™>|øč QÜbbb4kÖ,ĻńSO=„āābķŁ³G:uŅ”)S$IO>ł¤¤ŚŃåååśÕÆ~%—Ė„ūī»OO>ł¤’’’ōꫯźūļæW'Æé.‹„ŃwhnŹŃÉ#¹*š’¢ē8zč0E\ŌėŌńšQ*}÷m96m”«“Dq?¹¶^łč!—Éu¼Hq?¹VĪ92*슒ł/%‹E„ļ-”óšA…¦œj£ó»lE JWä%}ä*/ ōŸ\«ˆŚĶfӜ9sœĻČČŠŸ’üg]wŻuڱc‡üq}üńĒŹĪĪÖ¼yóÜļ  ¤„K—ŖŗŗZ»vķŅ#<¢åĖ—«k×®õžyōčQ%''Ėf³y¦|ÄÅÅÉét*??æÉē4füųńZ¼x±¾üņKŻ|óĶõ®•””hį…Љ‰‘Åbщ'ät:UTTT/Ų°ŁlžżŌŌTIRHHˆāāā”””$IŠŠŠ’Óél“}ß”9M™1*Źėnj§¢æ?«żzŽZŚ)UŖ{¾5*J¦ód½ėŃ£F«ü“eŖÜ¶Eń×^ļWŸžKDgMDD„ŗvķŖ+VØWÆ^ —Ķf“Żn×ōéÓėŻ»qćFY­µG QzzŗŽ{ļ=]tŃE SjjŖrrr<÷ēęęŖGM>»©ē4劔CśŁĻ~¦żū÷kÕŖUõÖ÷Ų°aƒz÷ī­qćĘÉn·+33S¦i*))I………’$Ó4•››č.?Å0TžÉ2%żģē*[žźšó;=‡$É"Étł]]M^ž®Ÿ,ē”C²oųā·¶ Żåååé™gž©wn芔;v¬F„gŸ}V>śØ$)==]ūöķÓK/½äY#ć§?żiƒ:Æøā =ņČ#zā‰'<õ}÷Żwž111ŹČČŠ¾}ūmSSωoōžŖŖ*żķo“ÕjÕøqćź]»ōŅKµ`Į8p@ŃŃŃ2dˆ/^¬»īŗKƼņŠ^|ńEEFF*!!A¦i¶[憔x@Ļ?’|«ĖV¬Z”Ⱦ—*¢O_Ք«bÕ Å^żĻõ„DÕėÄæßSŌą!-ÖgVW©ųŸoČbµ*fÄØv{dzÅŅĘ2Ʋ”^[ø¤I‘’¢$EKŠ©ŪwGzŻć¾?Ā4ĶŽņĆü³×Ų?MżCˆ²Æ¼0W³œ#Ć0dø †K†aČ4N톫īZķ¾išś×Ā…švŪ/ÜŪĮ-??_‹/ÖģŁ³Żœ†“““ē$UIŖ®ŪÜūŽŗż I•uĒī}÷}NI5^›$™^›ß!8ē­\¹R;vģŠm·Żč¦ąć šjßĮƒõģ³ĻŖK—.’¤ˆˆŻxćźŅ„‹Ž;¦'Ÿ|RŻŗu“$UWWėņĖ/×čŃ£Ō_TT¤üćJIIь3šmĖß’žwEEE5ŚWĖ—/׎½{e±XtńÅkĀ„ ­yMSM–8Ż(~k@Äßlź¼Ń/žŗ’‘ß¶ŗĢs~2ŠĶnµ .ø@>ų _÷ž}ŗ>’üóvD$Éb±“©œĆįŠĖ/æ¬{ī¹G]»v•azć7“k×. 0ąŒ·Æ{÷īŗļ¾ū$Õ3/æü²{ģ1I’ĶfӜ9s$IUUUzōŃG DÖ¬Y£‘#Gź»ļ¾k¶ ėׯo²ū÷ļWNNŽzč!IŅßžö78p@Ż»w÷÷M5ŠHgafə DšzaĆē§{ΚŅć~ß[éØtsŪĶĪ;•™™©[n¹E’ōśėÆėņĖ/×7ß|£żū÷ėß’ž·n¼ńF-X°@²X,ŠˆˆŠŒ3“oß>­ZµJqqqr8r8š={¶ĀĀĀ<õ†Ńę²’TVV¦¢¢"9R_~ł„JJJ”””¤={öč³Ļ>Sll¬‡ ĆŠ]wŻ„šš½łę› Suuµ:vģØiÓ¦I’>śč#ķßæ_įįįr¹\?~¼$éĉzūķ·UVV¦ŖŖ*żś×æVhhØ-Z¤'NH’<}ä¶k×.õķŪW]»v•$Y­VŻyēĶ¾wfff£żŻ«WÆVµĻW×®]5`ĄķŲ±C½zõŖ×’‡Rjjj£æ’)S¦(33³Łæ‘¢¢"mŚ“IS¦LŃgŸ}Öąś·ß~«AƒyŽØoæż¶5ˆoą›œ•Aķˆ˜§±ˆ@;;xš žyęĻńčŃ£Żč½£FRaa”nŗé&mŚ“IV«U÷Üs$iŃ¢Eڼy³’““U\\¬{ļ½W‹EóēĻWNNŽ.¾ųbO=›7onsYIZ·n®øā IŅ•W^©µkן†nÅbQqq±f͚%«ÕŖ÷Ž{O›7oÖå—_®Y³fyŹ?õŌS*..VAAņņņ„ ŁŁŁŖØØŠ}÷Ż'«ÕŖ×_]999*++SHHˆg„ĢĀ… µ}ūöz’ų—””(99¹Ńžkź½cbb½Ļž=­j_TTTƒ:Ü}*Iyyyśė_’*IŖØØŠČ‘#ŪüwóĪ;ļhśōér¹\^·ŪķźŌ©“ē8::ZžŒj<ńwk7§ˆ“ŌƦĢ@;klŹĢĪ;[,WXXč!ÕNĒ8zōؒ““e³Ł|øŃ{Ü£tÜģv»āāāZó˜¦F…ų~4÷yŽViK bJ²4rĪ÷Å›ūć¾ęņ:6źŽgXxxøģv»$É4M9rÄsĶ0j罹¦*''Ēs>77W=zōš«žÓ)»mŪ6õļß_7Żt“ēܒ%K“uėVÅĒĒ×kkAAŅŅŅ“aĆõīŻ[ćʍ“ŻnWff¦LÓTēĪµfĶæūÅf³Én·kśōéMŽ3`Ą}šĮõÖĖX¼x±.øą‚&ß»©žnmū|åęęjēĪš8qb½pĀŪɓ'[]oEE…rss•••„ŹŹJ;vLkÖ¬ŃŲ±c=÷ōéÓG|š.æürIŅöķŪ5yņäÖ<Ę„śŁwFŠŌ:"†Ļy_­GŚ{ ‘¦B©aäņź¦ĢˆÆ6oiņŚeCݼv×£G}ōŃGš7ožbbb”’’"Ó4Õ”C?~\o¾ł¦f̘”ļ¾ūĪ3Z"&&FMŽŽš6tčŠ6—]½zµn½õÖz熮7ß|S×_½¢££õÖ[oÉįpČåréśėÆW~~¾,X (::ZC† Ńāŋ5{ölķßæ_Ļ=÷œg’1cĘ4X³Ä-==]ūöķÓK/½ä¹ē§?ż©āćć=÷ÄÄÄhÖ¬Yz’ż÷=£[śöķ«!C†HR£ļ]SSÓh÷éÓ§Uķ“N}}Ē0 Y­V͜9S111r8ŹĖĖÓܹµ_OŖ©©Ń\ąi—›ĖåҳĻ>+»Ż®ŠŠ Ķ;W7Żt“.øą=šĄzžłēużõ×{ī?|ų°V®\©±cĒŹ0 Ļ=\pz÷ī­¹sēŹb±Ø’žõFĒųĮ=0½5¶–Hc³IŚuvIŪ–Ö•¼æ'¢Ś`%DRxŻ!)RR”¤čŗŸ‘^[øļfšęŪóŜ¦i6{ÜŌ¹@•}兹ŗ’‘ßÖ[Tµ±Päš µÓ4JØŅQ”-\Øi·żņģt*Ų»wƶlŁŅā§bqīKKKū¤jIĪŗŸīżJIUu?Ż›½īœū§jC”՟mŅźķó”äSš['Ä{zŒĖgæęŒö64Ćw$ˆw Ż¹Ć ļY#5ŖŸ4µĘH»ik ŅŌ°•¦‚W#ūŽakˆ(w(Brnŗä’Kržp5²y/ÆįŒ“f”Uæµ×"-- ź@jTĀ„Ōż“Ōżd„€€s‡"„!ĄuŅk«ńټ3ßPÄ­]Ö!mĻEU½é;=¦ĘėgHŻK»×/±Øķk™@»" Ī8§N"N C¼ß)5}m擜N ŅŌēw}‘šŗē8ujT!Į©F§Bߟ¾£E|×ńÕęuEŚs„HS‹§ŗSwān¬÷‹ĄY1`Š`=÷ē'õÓ[nń»Ģæ.Ō€AƒŻtą|įž²Œ;ń EÜĮˆ;Sš]S¤]œn ā»°Ic£C¬Ŗ?2D>eDœ5ƒ‘TrųkĄ Į4xˆŖXżhޟŚõ%ā;R¤±0¤]¾:ÓÖi+Žå¼IµŖ6d ‘&)¼ī8LR„×~˜×u÷ĻpŸėīzB½ź©Ū,Ŗ““÷ēƒ@ćL5ż•Yߙ#ŽS`Ü£?|G‡Ōųœ÷-āTĆŃ"īõE¼ŪŌ*ķł•Cµį„ū§»±Ņ©Å»įŽęūe÷=”jųeļÄźUæÅēY ż˜üōż_¾±­øT?ąh.ühģė3īś¼ŸyŚŚ3qÆāˆX|īń] %\ Ó$ßγŖžwųįC¬"ąlilźŠļ(Sõļ°£©)2NÆ{}?ĆŪŅ⪭ցˆ÷Z īPÄ{”‡9ļż¾/ćī4÷'zŻSf,jų•šę¾VCH@ū0›9ļŠxg¾\qń B¼ߑ!B9ķP¤=æ2#5œ6ć=Ÿ'D‡¾£H|;Ļ{aV©ł0„€3Ļldæ¹PÄ{­ļ)2Õ:õææū>ļr¾õµ›öž2#՟2ć{ļ|£¦:ŅŠ©‘!īµC¤†AHs#DĄ™ćū¾ļe}G‰xO™ń!ā=‚Ä{ĮT÷ ß0$ Sf|GvxŸs7ŌŖśŸÅń½×­±"!u/ķżU©~0¢&źgVS|§ĻŌxżōžŚŒ;qłū~©ĘŸ0¤MI{­!ā;:Ä»ĮVÕ_ Ö·± Ń©PÅ{퉯Ép®h,il‘ÕĘ>æė}Ī; q q©į4œ¦žŪjķ¹†ˆw0ā|x‡!VÆū}æBćŻQVśĀLcė…ų†šŠv­ [K¤±ÅU½ƒ÷yCil-ŅvŃŽ‹Ŗś6Ī{Ĉ;ÜpŸó¾ß÷Ė4!:µ˜jKk†zpvų3e„©Q"ށHsAHc_¦m· Äķtß!5>JÄĶżBÖŗŸ!t–w'56:¤-£DĄ™Ó\ āžśŅŲh—.¢ŚXāūœv1r&¦Ģøć½ļĶūå¼G„x!¾aHc‹©žn B Ąé¾h.¤hī3¼­ŅÜWkŪģt‘ƾ6ć{Ķläœ÷h¼;Č{ÕĘ5ń<Ā Ī®ę¦ĻxÆ'źŠų~AĘTóaHkžļ·ö^C¤±¤1īšĆ÷3½–F6©ł‘!„!œ}-­'ālųĪi)iźg»hÆ0”¹ĀŅĢĻ¦Ā¦Ā¦ŚL(ĄŁcśq¾±@ĆŸŃ ž¬rŚįH{ -?~žĪˆBμÖLci*‘?[Ŗó““wˆąĻč K ū--œJšĄ¹©¹š¢µ_Œńēæmv&Ā…ÖŒąšwTÉŁl?šOKE[F{ų3ē“©@įt‚ B~xü ,Śv“kāv¦Ć…ÖŌߖ¶Ž8m +ü-sF‚·³(œ©/Ś€ĄkćŒ† Ž.lÜĪZāė\%Īõö€¦,šĪ’’րĄn„ļ¾é%tEXtdate:create2013-09-04T19:29:46+04:00Ÿhö×%tEXtdate:modify2013-09-04T19:29:46+04:00ī5NkIEND®B`‚apache-couchdb-1.6.0/share/doc/build/html/_images/futon-createdb.png0000644000175000001440000022464212332105522025256 0ustar00djcusers00000000000000‰PNG  IHDR<t׊&[īiCCPICC ProfileX…•YXQÓ>»{‹{éīéīn¤SøtĒ„[QB@TR D0’FE“łDæļ’āłŸ’<Ļ9ūŽŁ9sęĢĢĪž¹ g922¦ ,<†bk¢ĻļģāŹ` ŲČ>ёz66–ąæ¶„Q”m„6dżw¾’Ų|ż¢}€lPģķķ†ā&VŸHJ Ų yBń1‘øÅĢTA×lą€ßøu{’ĘC›<ö¶(ž€@M&S ł„Ņłć|P9“ŌąĆ}ƒĀQV~kū’}ąōBy¶‡…Elą<‹y’“œ€’%ÓūÆL29ą/ž½—ĶF0 ŠŽ %'ž?Ķń·°ŠŲ?kš¢::Äν²¢vKš!Ł”˜Åł~f–[ōӑ1ś¶[ōŽ 3ū ”x80ÖŌa æ qŠC17ŠWC",6ųQ;ĮģįŽVÖ(fD±O“ėo™°rR ½Ó„Ɵ”ŠŃ(‚)¶ų£ćģžŠ“’ ¬žš“Ķ7üM‹ā2es/Øp©_ØÉĘŗŪP\ccæµÖ½šP«­½Ąoü)ʶ[xÅ/zsæ›kÅŚ›ž–ŠĒ š[&Āķdlö[D6bś‡®ŗÓč\Ğk»a!ūū…;lÉDr|Ɇæm‚ʀ (Ąxƒp°ų%0†[#?JGGBŃNį§ūsūūū;‚Ą>żĖmš‡_ōś‡īóOt;>£Rż@ōŸÕ0œmŒĘuŃ.QÅØż¹wļS˧æZżÖ5+µEŃßŅ>÷ Ź üĖļæ3ž]'cšfSź‡ģyŁŁÕ?ó’±cœĪgŠ3ʉ#+ČŅ‹ÜF:Ąt#­Čҹ’eņ–U(›ūµ@Wō±›æĀ’£F±9¶Ø““JĄv“?½ōwĒM­ƒžMJ,ڽQIĮč=‹æ{üciŌŗJ}ŒjgŌĘV 'Ā(¢×Ćč >PB©’:kk”ž›¶ŒŪÜKx‹ā°愘@7ˆˆL¤Ęšė”ŁŅo;æYøōv~yY9y°‘{?Ś ¶›9b½’]Uˆ+’ EŌŠø‚¦ž½’  ?€m€3}b)qæi˜ ˆ€~4s1TOy  4€.0ęĄŲ° µn C5Ž)`ȹ å œgĮp“€Š n‚;ąĻĮ˜Į,X?!ĀC4ÄńA$$©Bڐd ŁB.…C±P “Ź…Š rč$tŗµA½Šmč!ōš„f yhF`j˜ęE`Xփ-`{Ų€£ą$8·Kįjøn†{į;š<„€VD‘BTÄqEü ’†ä ÅH5Ņ€“£±ų™@>!ˆ Ə‘B=iŠqĄų`¢0i˜Ķ9š~š—4?h™h„iĶh}iÓi+h›iŃ~”£¢¦Ó£ŪE—DWLw…ī>Ż'z*zzz2}}}żśE&9k†0†<†:†Ū ļńŒ"ŒFŒ¾Œ™Œ§ū§˜&A&&¦½L5L7˜¦™qĢ¢ĢfĢĮ̹Ģ˜ļ1ϲ0²(²8²$°T°t²L°"¬"¬f¬”¬¬—YGYWŲxŲōŲüŲ²ŁŲ±}gēb×e÷cĻaoda_įąē0āį8ÄŃĀ1Ī‰į”ąÜÉĻy‚óē'.f. .®®Ė\Ļøan n[īdīSÜC܋<¼<&<‘ź!ź‘ąq{ē®Š]žtždĻ+^X/'Æ:ÆU²5¹š¼čmę}Ģ{ÖĒĄ§Ä磯®ļß?-æ"æwžZžEžļ“Ģź~ 2*š 6 ® žbr&d=Ō)“1ŒęÖĪ~=‚7"!āa¤ddVäD”zŌŃØYŠåt4ķŻÌr‡bÅb÷ÅNĘiĒUÄżˆwŒæ’Ąž0”(‘˜ų.É8©6“ģ“Ü—"²'e2U/õd”ęÖ—.˜ž™>½Ūd÷Ł=Ä=!{īfČfe|Ūė“·=“'swęŌ>“}ē³h³(YOökģÆ<€9tą^¶BvYöÆߜĮ\ŁÜāÜÕ<Ÿ¼ĮƒrK®ēūēß+P.8Qˆ+ /=¤sčlCQRŃŌᇛšÉ9ņķØēŃŪŊŕ%Ä’Ų’‰RĖŅÖ2”²Ā²ÕņĄņ‘ żŠĘcÜDz}?ī{üŃ Ż •<•¹•+UAUc'MN6W‹TŸĀŠ;õ¶Ę±f VµöÜiĪÓ¹§×Ī„Ÿ™8k{öś9•sēźøė ĪĆēcĻĻŌ»×?ø`x”µAŖįd#kcīEp1öā‡K^—F/[\z„”IøéŲU¦«9ĶPsbólK`ĖD«KėĆ6ó¶¾vö«×¤ÆéčØčdé,č"vev­w'u/öDö|ź 蝼óģ{ŽļÜ?|}ēõ{7,nÜŗi|³@o ū–Ö­ŽŪź·ŪU[ī(ßiRŗzWéīÕ{Ź÷šļ«Üo} ö ż”ęĆ®G:z>¾9l6|gÄjäįØĆčŲ÷'c¾cļŸ†>{÷ģēóŻ/°/rĘéĒ‹_ræ¬~%žŖqBy¢sŅpr赯ėēS>SßDæYĪ|Kó¶ųß»sļåßwĢĻ<ųąöaścäǟŸ²>3|>öEģKÓWŻÆC³Ī³Ós”¹õł¼Ž…3ßæõ-Ś,¾\ [śł=ēĒ³ĖŖĖ+N+ļ~ĘÆāWK×Ä׌Yüz±¶¾I¦7ŚaęĻ u‹ LŠ3ķļŚh«!čįFƎP6…a °28!<‹ŠƒČOҦ¶§‰£-£{͠ȘĘ4Ź"ǚÅöŽĆ’ó*7Oą˜ ś&’.F/^!)±½EZ_ꑜæü‚b¦2§Jššś¦“Ö„ŽæīGż0ƒY£0ć·¦žf-L,›¬¬ómęm5ķRķ;~8)8‡ŗT»Žŗ±…§0EsĒpÅ2ĒćVć?$ '¶&•%Ē„X§Š¤žL»Ÿ^³;a[†öŽm™ųĢ/ūF³zö×(ĻĪÉIĖ„äōĪw*P/ä(\>ō¼Øóp命GƒŠ­KTJłĖˆeߏ_U ė?Ž~āBeeUŽÉøj÷Sŗ5ŪjįŚ×§{ĪTM?ē[gެ^÷‚jƒ\£ųEKģ—©/’ŗņ©éÉÕīꚖ¬Ö6›v•küTß:'»t÷ö4õžķ;ŃōśĮ»o’4o±ßZŗ=ų2ö•Ų«7U“ƹ^M汛¦Ÿ¾ū6ūį»õ÷m3äš‡Š§>Žń’„ūkō,’lļœĶÜč¼ł|ėĀö…Óß¾U. ,Ö/é-M~Æų²ģ¾’ņóÉZĶśś¦’`9ƒĢ`z±Gq1x/‚3•ќdN½“ʇ6®—ž£,S ó)–wlrģIż\lÜ!<Ż|ˆ1˜9„9”1Œ.œGüˆüõœ2})¦$69Ī-^-5a>ńAŅÅäĀ”ˆTė4¹t¦ō„ŻĻ÷ōfœŁ[™°Ļ;Ė|æ8š'³»sŽå&ē¹TĖēČ’Y0^Ų}Øŗhßį#.GM‹•JJ‰„óecå•Ē2Ž{Ÿ0ØŖĀV͜­¾uŖ½¦±¶ętł™Cg÷ŸK®‹8ļUosA«A¼‘±qõāŪK/w”łźäÕāꂖÜÖܶƒķE׏:Ŗ;ėŗJŗ÷öDōzōķč×¹®tCź¦ų€ų-©ŪŠƒŚẇģīZß3¾Æł@ī”Č#®Ē“ĆŠšĀțё'7Ę®>­}včyģ ‡q„—,/_ O\™,z5eóFfšnśĖŪūļßēĻ„}0’(ņńקǟk¾P¾jĶbfoĶeĻ›.ąŗæy|›]Œ[üµtä»ü÷ń'–)+.?V×ņ~uoł_ŗ» ČeŒ–ˆmĆQšJ įU!їdL-G#HĖMĒHOĖĄĪČǤĄ¼ƒ…Āz‚ķÄ©ÅåĻ]ÄÓĖū™ŸS@[ˆ`‘P«š+Q & ®#į&IپWźØōY™6ŁA¹ēņŸ֔HŹ\*bŖ*jFźÖ;5m“vh›źččŹė čSė3xjŲnTfœ`ā`*kF47o“ȰtÜ!e…³zmŻmsbgš­—¾½ ĘįcæS„sŠ‹³«‚Ū;÷Ņ]žĘ^Ü^³äŽe>A¾*~8æ’š€˜@ƒ ¦ ©ą¦¬Pē0ń°Õš[¹‘¦Q˜ØJJ“rō\L]¬OWÜ£ųœŻ„„Äś$r2[ņż”©ś©ki×Ņw«ķ^ŁÓ‘‘¶W/Éģß·;K-ka’…ŁĀŁS9§r}óÄóf¶åļ+°-ä/ü|؍!ė#lG^=UP"^ņ”“®,Ø\¬ü]Źc¹Ē#NŲV*V±T-œ|P]wjO}­HķŅéėg ĻśŸs¬Ūy޲Žų‚Nƒr£ÄEīKÄKK—_^éoŖ½ŗÆ9¢%”5æ­¦½ćŚpĒ—.B·`vÆk_|’įėo Żüx‹ć¶ł`:ś›æ§p?įA’#–ĒaĆ·G%žä-=ó{ži<ļ•ŹÄ—×-oJßyßōaķsÖ¬ÕBųŅ·Ÿž’żŁFĆ)PŌ€Ćv{Ƚ €č*Zg°”Ą^ Ą“&>’ “&ß:āŠŖ“°”5²8PDkMKąŠV˜ ą(g@ć`Ā¢£ Z'ŗCŃPTuAcŠL KĄ&°/¼®„;įš*ƒh#^Č^ä r™Å°`4ŃŚ-só‹ĆŹa=°ŁŲfģ4Žg„‹ĒÕįĘńŒx|¾’• Aš#T&ØųØ¼ØŖ©¦‰āÄpb+‰@r%5P#ŌnŌM4t4”4wh·ÓŠ~£s£»N/C_Į@ŐÄ0ĒÄų†É›iŠ9€ł3K×Ī1.üXŠü‘¹bņóįĆ/©uÖĶü”§ < L€ˆ9 ,PļƒdŽƒFŠFĮG‚ŲQߛ@^Ptŗ A30†PĻgµšMų=ZŁĖ öHR…Öš_1ģ}L¦s3åĒZcÓ±±ÆŃZÜ·ׂ›Å‹ć}š•ų.‚į8į•UÕEŖe¢1Ÿ8AR&哎£õńIˆĘ‡ę­ m)†.Šn’ŽŽ~€A‹”…Qń2“S ³ó‹Ėk,‘­š]‹żG"'7źļnvīŪ<é¼j¼Ė|]üŁ®Ūd©? =¾"R&š!&ī*a&©¶]BŠWšQ† d×äI ܊ŅJŹ®*1Ŗjõźw4>iŃk+ėøė&č•éwĢq[›äš™3Xø[žŪ±lmisxēˆ»½›C•ć[gi—$×Aw>¤]ϼōČ >ü¾Gü©Ņ炽C…é„×E2F%R^ÅÅÖÅ3%Ō''æNMMgß}1ĆxļŲ¾€¬łÉ9pīžƒ¤ü“…V‡Ö7 -/żPŽx,ń„qūÉϧn֞:“{®ą|ń…źĘĖ—n\æś£•­]µĆ£k_OCßó4Ę·÷ß¹'÷ąÄcī‘ś1›ēšx’Dłµ÷Šļ~Yėū¦µ”öćčJŽjŲ/­-’c 0£Ļ¾4ŠÖĄ$‚pt'`¢…$ SČڇ>ļ×”70ƒĶįHøīF=Ī„č aČ1ä.²ŽQĄbŖ0O±ĢŲŲBģcĪWƒū‚WĆgᇠ„Ā• U2ÕQžx„øL"“†Ø5Øh„iNŅ Šž¦“„뤷¢ŸbHaäeģg b¦gne!³’X[Ų|Ł™Ł8R9U8—øŚøÓyLyYyßńuņ—ÄlsŌf”%ˆįÄqDIśķRĀŅ 2F²Īrūä{%så•5õjM¼V“ö”®›Ž°•įmc“n3uóVKÕֆ6/m3ģÅ;„ŗˆøŽs§ģböl"Ūy/śžšßˆ źÉ óˆPāˆ†cfć^'ä$É'O¤Nß±‡>ćEꕬ£öäÄēÅå{bÕv>J(ī,M,×:F<>YŁwņĀ©SµÕgöŸÆ»SŽĄŲŲrÉć ¦©¾Ł”“æęŅIÕu­'¢Oø’Ę ļ›æn•ŹŻøėrļżƒ˜‡«Ó‡¦<łž4āŁŪīć_MŌæ†§ĢßL?xGzo8ż”źcļ§—Ÿē¾¬Ļ‚Ł_sŸē_.\ūV²¼$æ“ņ½éGĄ2ērļŠēŹŚĻŠUĮÕś5„µĪ_ņæjף×ó6üķÆ æłś€ØõĄ¾\___ĄŚ”õõŸÕėėk§Šbć=”ææ»l¾kč86æ%Fv’ė÷’:޳-=Ӎ pHYs  šœ IDATxœģŻyt×}ąūoWÆh6v€X‰ ‚„ø€ŌJk±,=%²x™—drŽŲ“yĻ3öx˜Lū9ŃD£,ņČQ#…ćl,«±ķE z„B!„ó™7 Y@hÅϬ 'YP#ŽB!„b©f&3ž^i𳬀'IKŽeÖæ³ßŸ³‰%'&„B!„Ųˆ @ŒÅžæÜĄgÉĻ<-:Ąø;3'AXn0$óc !„Bqs1fżkž_¢@%[n©Ļ’ž„`'ń_  düĮüĮ=999X,–bĮB!„B¬DĄ0Œ®±±±W{ģ±#Äž1bĮΌĄg)AĻ¢ĻĮN·>ō”ŅOśÓŸ·X,—’=„B!„b~†aœüńüĶ·ß~»5ßNüw± gĮēš,ģdģ!„B!RÅb±üō§?żybń‡›éxóßÅ…³` ĻŌŹ³ƒČģ±Ē>RPPš›³×9pą@aEEEVNNŽĖn·ŪTUś|¾POOĻų©S§†–ł…B!„79Æ×ūĒü5`„é®mń–ž…Zyę}šh’I Ģ`Ē8óóóļO\>77×q芔ŅŅŅŅģÄU‡móęĶžĀĀBOIIɦ£GöŽŽŽF–ł…B!„7©ÜÜ܏o3w4b±Ė|AOŅ.m³ŗ²Ķ~)€uj‚‚øC‡•–••eĻ×¢d±X(++Ė>tčP钾•Bl:ݧOd_ōF¬×æ)æĢā÷-ŖŖÆBŽęæÜāhŗ0œ‘’o$z’ؘā÷‡åq B±¦b+Ó 0³ć•y»¶ĶŪĀ“,fc;pą@aiii6Ą=÷?l­Ū±’ńōSšĶf#ņÉzī|G^A+--Ķ>pą@”toB¬ ź ß{äÆ<š~ļcõWSg’öļk­æUvkžC[éV®µ¾įłŚ·’yGā{»>õ[=’žžšU­K‡Ś’ŗą»ź•żŪ fķ‹0G¾ó„Ļ4㉿U³'ņk}ōāuE€Ėļ|7’ė?jŖŠ}XĶCæžĖ]ŻV=ŗą`ŃłØWłßüI晄·¶žŅo^żĶū·¬ds«éZė«žÆ}ūłécQswäK’ļ'Z·x¬©{¼‚z™'łzćÆ>õōé­Ī”„"„ė™›X 2;ŲY“ī](ą™ŻŖcžk¾ā***²Ģ€Ŗ¦¦Šsē;ųüümė_>ż”öÅĆ_²vt^¤¦¦*¶Q‹…ŠŠŠ, x„ė÷ü1ĻI€W]}Øžj¹}õÓ°”Y­Ž7Ɍž{Éżµoæ“ć#ŸłĪ_h¬³ė*Ž~ė@$gE±Ä‚ģ[µb’7FEĒqšĄæxņ”ŗ«źÄصóÄĖEū?ŸŲéūĀ“’B]nĄˆ†ų0=yS’±ožö÷’¹f׎’|ŗr…čą”Ļ=zžm™~UĆbµ»<©EŽŪ~ū‰¦=_łśēO—¦ą8ų.¼”ńµoæ“ćcŸ{ōü»‹üØ£¼ń½’ŗć©ß‹īģæzŗ`õHŒ½˜ßxäw[²Sō½„āa6¼@ģ9=I»·%[i1‰AųĢ”rrr\ę’æüŪ_Ō++¶ŠŃy‘ĻńkGēE*+¶šåßž¢žly!„HŸ'Ÿ{½v× ģä ļĢ2?¹vüǹ?xżdŃ[?śoՇn<üĶēźÆų5 ĄPė«ž'n<|ųpćį'¾·÷ā˜«Kõ1Ž}öÆ*O}ö­#]…«™Ć£®æyøžšįƍßzžLyx*ļ…·3ĢmżąĪü¹y ÓōņK[¹ļ7†?ŽX1fPģdlŃjK3ÕX²—”ćpC,Ż?kõ'·ė€-Æ:üo’č©÷Ÿ~ś«§ŽtRūYsO>č4’ÓļW’ĆĻs ~óń'›æžŌWO’jcŁ0€=Čæ|ēŪŪ2ī{ōŅ|åß|pö՟õ‡±Våńæų§ś?ž§ĶO?õåÓĮ=]õŽš¬±>ź]8>±G_ņo1ŹO~’æļ»V÷¹‘§žžĘéĒžÓŽ¶žÅÖ·x5+č  [Ķ~tZ( t5=ŽÖŸzžžžĖ5æö[żś×Ÿ:żGæ²’¼0lŁz’«_tÖ}—śÕÆžnӝķ/gœ¾ęŸē&•BżķŸøĘ@›u( ą‚®÷ƾžĻEO>ł“[ī’wa„­;S[ćō»GŹŽ7÷wŽĻÓaŽļ¤lę¾š ķPÄ’÷čŸłŌ­[FkSžė7~øk÷m’ĘÓOžBĆŲąŸ’ž3ūF] [ښ’ŁóͶ²Ē¾śGM’śÖö±æ>ÖS`ĻŖ‰~ī”ē4¦ØC“wįųÄ-Ճ3Žw²Æ†ČŁ«Į¬­Ū7üä§ļo‹E¢ƒüü™¦ŠmŪJ}ŽÖŸzžĒ3ŽŠĒ¾ńōé?łŹżüš?Ž5؛łų™ēUļV÷ć_żM{ź¶ž}īµņ^@åō‹’X»©~됛Wŗś±”[£<óū¾/ćįßėzśé'Oß5ńcĒŽ_Ė-Ś’5žŽŚ«ĀĄŠłÓYķtsāü`Ø4=÷rmIU©oåGC!օÄ.mI_ÉĘń,µń}v$5c=UU£ę’333’žē„\ī¹BŖ2.÷\įæ’ł_)™™™F²å…"]Īæūż2vŽܤ©äo;čeąkŪ@Ä`‰†”ā_übß/6VyRĢ­’z춚‚Żī$;/SSKtLį®ßšžŪūwx<FAšŻjY¤;ž {ü¬EN~I°¢ķlkūęQuÖ¢ź /~ē;;žžļ’¾6öś›ŚæyöxåÜ֔#‚bD %g’ųw‚¬¬,ÜäęeEv…Įī3x»źŠ Nźī~x šw¹8±‚ ÜĶ}žĮ¶O¶QR²u¢ŲnÕ¬žcw]i`N‚SĒ"1Ķ™¬l½ķAŗ~āøĄ2Ńńžū ²ÆŌŖv5)†+¼żÜ³•/¾ńF%œ!8ŌĄ‡łOŸøķrž'ĆȪܹ›vŽ]œp¾Ä?¶e|ō`Õpb*š÷’õ]ąjė[›Ÿ}ö_*ŪŚÉhœÜ“¹¶qNÓXŚNt—ŻvW½÷ģÉĪŅpø‡ć;­¶f__“›B¤Ÿ2뵤VžÅZZf·š˜ŸqŅēó…6oŽģųāį/YĶ–/üūĻź’ó[ßU.vuóÅĆ_²žõ·žÖĢå—ńńbõ…/sōēĄ{üž#Ļ5iEĄ«ļž/;š‰†ĖQĄbwĘ'˜¾āpä›_©†ū9üÉŪ;6Ÿp ØXAG2¬s§ÄŌ€ģ̌$Óń«Ąößv[ļ&Uµģß__N±{ęrĪ<ź‹Šžmź,¹Æ²įņœmėąĘšpunŁ„ŠF•XU=}kØŃųI!v×É6'ŠˆÅŁ™aó[k0ψž˜óMĻ–PóÉH”®‚šŻ‘ż{oæķ–-Ķö[O6¾}`Æūću¹Ó™°gsą”‡ŗļzV·‘lhJøõC÷\½½Ō16iĢūbG€ųĮŅĀ+Ųęä_Ó¦ĪkE™šŁtµ¤»pĪ<ŠŠŽż §šŽŅķ½ń÷õ.vįŲ~o¦O…ń©ß>ł~AuŪk…wüƹą6·æó–`ću׌Š~åö;|ūTgó¢ mśūgsūÆģŗō'??QUs­s„[’Ʊj7 £6õżöøµw{†%Żææļ“9ÅQ<šńpрöĪ[o” ¶×g|ęɽķć_yv’Ļ~¾tąÖƒcÅ2žGqć3ƒ˜ŪmĮ•–bö3Öėéé7§½ŽŁyä‹ziii¼{[GēE Ć §§g|‰é !DJō5æ™ŪĪ/ņäӏž~śé§O?śč£ĶŸ’Üżēū~~“ąj¬6—Ž÷^sÉ@@³@€öGŹø«ŲėV}“µ“qχ>ŌS[䊎õ÷mšD„€†»š¾õĀŪ5×Ŗ=Ģ،)‹ē6’×6LĄ&]¶ŹŹŹH喂ˆkN­ģfßĆwwńóæ.ųééīluj[įnėŁ®a—£ J;H7Æ7]Ī“ŲžėĀŃø£ÄKr€¾‘I»:Ö”|÷ė?m Ę;Ū÷ŽÓωÉnī°ƒŽĢÆ,eV…É@Ą®ź*įš­Æ’MŃw~NĮ’ż‰ƒēc×Ņ.č :üŖŠļJÆ£°[g·†8Ł\ZŖ–&¼ŹŠr¢óŒ"Ŗ:óD6ļw»Ć£C€€kµyŪ-ćš"-½“v€k¼ŻĶŖ QC5, Ic9=<ʵŸmīžp³’—īļģń/KŽ¾ą“Ņż¼ūOOVŸį wß²yģģłČĒŗĻ>ó7?kߓqĻ®Ų{Ū÷ŽÓO{G†źŚ¬WVVFŠó³TH–ņ=÷y«ŪŸĖų›ēĪ–’ś».ĶŽ7Ž‚*ķn ćZ(³¤²2RY¹%’éRtp³ėŽżWŽæųJIšśń”=©šOA!ÖŠģÖӂAĻRgi37’t–¶S§N •””l*++Ė>ņś s¦]ż»æł«ų{½½½c2C›"½üœžžéš{>÷ųywĀ»y;īšäy»µ?ū®ńæ¾ņŸ÷ŻÆż—/ļ=]åĪv üļo?¾ćEÜu×^o’‹YņĪ-2t×'ėžč’śĆśÆ}åČ~0§Q.°mBKŚ*{·žŲ>Ńž‡ńxż³So}⑯µÜW9³5hóŽOŽ’Īgܝś·VūŚßNæ÷g~ÆsÅ”O?śoĻüÕ_ßsųū±÷?ņ™ßéŗóļ‚ł{’y’®OżvĻæægߊ’’™¾ĪÆ=ł»·üÕüĘW>÷ĮfBv‹A‘%~nJ<†ūO:¾öõPƓOō“›™ņv’’’w>cļüÓæx¼žŸĢ7kīŽüöW?Ń“yźĢ˜³uOšNžgą?ŌgĪ—·ūćž/üŅ?]żóßd_ģ|ł©ĻŸ.˜•<ÕĘ·2Ö=üpĘ®¢ŒxćÓō@Ŗ\>žųlžŃć’cļo=G9LOŁ]²sšø§±bģŌvKĶ®-›äßBˆ ±[²¹’žn-³H:5Š'qjkĀĖNģ¼PóōÓO?ø^nn®ćŠ”C„„„„I>j½½½cGķ•ŠW±®]|żĻ‹ž‘_ęwļß2D,.·ĖH¼Ó£†ĆątbĀį0v§3~'H ‡Ń;Nūļ©ė*aUG±;Yp=Œ? Z EĮåžŻ L'V“nC ‡ažmėjUWp:o¬žN }'5¬buڧļĢMķßÄc“ ˜jIRp»ž.;Ql³Jy‰s–Sքāvųšį/—ˆõŽėč¬k’׉<ŗ1+ĄYīƒGan£££‘ēŸžŅ +**²rrr\v»Ż¦ŖjŌēó…zzzĘ„eGqĆP'­}jX™ļ‚Öīœž~ĢétĪūŁ’(v–“ŠāÄ35B’ēäc)łQģNnÄēX.ōģ³ƒ·„īßåe·}ń‡ŻĶ¶ŗū{žc.„ŌģÉ –?iA’iܖ=(čŌ©SCŲ!nt[üRļSŚBĆõ…B±ĘfĒ&³ßża±X[y’µš,Ō,9šBˆšbĒ)½„„Bˆõd)1Ȝ±{Ēg?ūŁōfDˆcvW¶ėz“ā!„B!֛dqʼ±‹ōPB!„BlXš!„B!6¬•<Ė~ī€B!„B¤ĆJ[x$čB!„B¬{K x$ĄB!„BÜpd B!„bĆZźsxL)kķńPX’‰(”‰qFżįŌ$#„B!„øi,7ą1­bŠ“ĖŽCTmΚŃÜ sµć M†V/©•šŌńšƒõ(Ćēxž­¶ōęE!„B±,iīŅVν»šĶY(čƽ z Ø:6gU āĆ{ĖӛE¬€U:’ !„BqĆYi ĻŖØæwyv@õŃrō .ŒNVsąĆģ­Č!§f ׮Ғ®†?}į"„„‹B!„7šō<ĪmTĘ¢.Ģ vŗN½AVÖǨɱSµ³MūŖŲl£é„·ø_Ŗ;ŗ|F8śņ»Œā”įĪŪ©.Ί}1]ÅŪ{c'Īšlć#÷m'20‚»ø· "‘(Šę›»Gūi¼o7ŹP;ƼwaźóŅńlć#÷ģļŹo4ÅŅ-lą”Ū«±Löņʧ¦ß»£šh+ƝčJÕ^B!„bŻšūż„B!"‘›6m"33EImWŖ“uŌŹ­."ˆś®Š2š|™ęökDū¦MDt ¶ŒjźrćŸ;k¶Rģ¶cÕCŒāįև>¶ā,lzŸoU±“W^σ÷6ÄV°Ūɰ;)(; ‹l×ī"ĆnĆå²O}ŗH:~Q«Œœ"*œ±5Ź+KpŪmdäP6õ^eun›ØbÕö©B!„ė‘®ėŒŽŽāółˆD"čŗĪÄÄccc)O;#S¦’Ö#ó/2B°;čķ Ƽ:žńöŠB†»;pÖģ¦Ü­ ūłł?æĄo¼Ęó?9W{^5ūKœ ‚€Ź„/š“WŽęDĒĄ‚ŪE™„ÅÓēš7 dPTį 8Ļ=µ¶›ā2ą”$ß ¹v1Ķ“2!„B‘BŃh”ŃŃQ&''ČČČ`Ó¦MLNN222B4MYśiĆ`sø–“œÖuļīRņ²ŠŲę„ įŹņģ ūøxĮOÅ”ü©”¼a/•VŠ4 =ŖƒŻFVALÄĀ,Ż¦«a`ˆžšÖĶæ]<3óQQŗx:gÆŒŠ°¹”Ü’ø”Ą3WfēC—ƒü 0D B!„”®ėx½^"‘X#Gff&™™™ńĻ''' ƒ†A^^^Jŗ·„-ąQµXŖó/”įĄ  F2DĻ`€¼R7[¶ęŅ£–ćƒWč¶é±¶ÅS̶ms7•øė“P(ᯅ·;ĒŅ _¾Źxc)YŁ…”TFqŽK](5ädQ^ēĄ Œ÷_Cā!„B±E"‘x6€œœ<žéքÜÜ\l6„B!)((Ąf[Ż%mæĻ‹ŚPŒ=§Š†Ü–¤ćxźwmĮØĮqü€’ü5v•n#«t{Č¢ōuĒ&°;b_%pµ…ćŻ~\ńof%#ĆŹÄąėŖf™8v-°ŻŁ–– ųö“•“ĖŽ­:e¤£kA9žBźŖ¬€Jļå¤!•B!„7“h4vE!++kF°cŹĢĢÄb±ąółˆF£x½^rrrp8«–—ōįńŸćā° ŲŁvčĆŌäĪüøęĄ‡©Ė³Q®æ{s“ƒ€Ž’UJy– ĀĆtLÅ }ƒ±Į’ެLF‡śčė룯ĻKYĆ~öīmdgł¬-°ŻŁ–šĪÕ^ą$/'¢ćōūĆ ū'YnGč™g²!„B!ndƒƒƒD"l6yyyIƒ“Ēć!//›ĶF$Yõńœß“[H¦ĖF44ĮŠhźŚQÖ*!„BܘĘĒĒųģg?›ŽŒ±ģܹóŠMģĮ1Ń©—6õҧ^` ANڧ„žfhhuńūG‡Ö¤»ŲZ„#„B!„X™4wiB!„BˆŌ‘€G!„B±aIĄ#„B!„Ų°$ąB!„BlXš!„B!6, x„B!„–999”””¤!wB!„‡%/km ֊-ąń¤;;KÓŠW“mß ›š$([ĒŅštwwĒ[t¬Vk¼5GUU4MĄēó …Ø®®NK>…B!nT‰AŽåF rUUĮīŻŠŚšīœÄĄ®]±|™W-)#GąŅ„tęLĢ#mO__ߌ`Ąn·SXXĄŠŠP<ąX‹O__ߢ-=Z$DD«ÕŽĶnŻš³2„F{Ör(/p§;+B!„Xg÷Ż3}Q=ü“7 IDAT~#»óNčļO_+ŠĆkĶihHŽżĻé„„S§b­=b]IKĄ£ŖjŅnlŗ®ćp8⒟ĶēóĶ?¦G§³„™^ā›nī8@nŗ†i£4½ÓBb–œžĶToߏfĻźd*8ŌI—¾K!„B̵‚ÓĄ3ĻĞ“VŖŖ¦»­-ٱ€čŲ±µĶ§XPZžįy¢s]× O=Ż7YĄc®;·•'ȹcĶ Ś høu¹.+šb|l—u5r¬qłŌ;ōēļį¶źģe­©›·ļg[¾ƒpx‚«ēĪr®É ogsĘ|ķOĖHOqbŪšķXB!„øéef½÷¦žĮØędŪ·Æ,`ܱņņąÕWĮļ_|y‘ri xĢ®lꘝıĘétF1 ›Ķ†¢((ŠÓ3»€:ÖĻ °}_=¹®Ų{V»‹Ü‚Ųć=­tGrȚģāŹd)·ßY‹6ÜĶūmWˆŁ•»ŲS™h vœį\¬p:³·pKC5Zo+—@ą o]ÉfĻ]{ȶčnięŹXlyģŚ_O¾kną”6§«ŻŽŪžĻöū‰¼ÕD÷µ16×f-9=ūPĶżDlŁŌļk  C‰…:ś—[Ū¹ģ‚{3 »·“ėRō'_Gļ„„µpWrǁJ쀦õż6Ę¢`Ė®d’žJ\×y¬…B!VMŖĘó8±mļŚSĆ+®Ka!|źS±ąl½NøpIkĄcŽŁq8D£Ńx€ćp8ØŖŖŠæ‰Dācz’<ßPJ^Fņō -ÄXoöš]Üŗ3 G°—·Ś®P{ą.Jķć4kįrž]TzĄ™WÉĮ­łdh#ļ,×&Ź©-ŻĘęžSxs¶³[>«Nė)®Xk9tw)—Oq¦õ*wØ yƒ’‘še„NZGˆŌf-1=gä±ė`5ŁĒOp±‚‚źl°Ś‰ö^"XÓĄ­µVzĪ4ÓŅęįŠžr,I×Éd¤§Övķ.&ŠLå9@ūÉ6¬µū¹»ŌĮåSļŃŚ“ˁЬė9ŌB!„«ėĪ;addu‰Ŗ*جŒµŹ¬6§>ö1xóMččXżķ‹%Kū“Ō&›ķ:²¢³š7Ń4(Ø£¾<’U/C—ĪćCÅøĆxdēe2ŅßƵ@(č(v2¬`u8qŁķ ūöĪ!εłŠ„Š`ž€' ‡ Ö„„ddē”ōÓ}-@@›jÓTlÅ»Ø+Ļ ¢2žŽŃy×QpgeĆ„šĻ…ŁZUN6 ¼Ä¾Ņ%Ś| źRæB!ÄŚyšAųįW6NĘć‰M>°VĻŗ÷ŽéYÜDZ¤%ąq¹\„B!TUehh(Ž„Ķår͘„ĶlĶ1»“™ĖĢ–‘“Wń…jٜ¤–Ųl‰“h€‡¢²2œŗNI‰‚Ėcu”¦c-蛫ŲV^H¤·=a‰[Ōw~å…N4½„-V×;Ӓš’ }½aœ[r°/9½—O½Ēe6Sæ½gdI=a9e:ec ėdUģį`v?—/vqęÄej¢hź³ü’2 ķ —”`uŻ€SW !„˜Ž?@äå¹cX¬õ;±ßz 9JsV“ŸżliĖ›]Ö¶o‡ŅŅ”f-)s\Ļ /l˜É ’•Ćł8z„ø(…¹YXZF»›A‹ŁE-‰‰DfLC­iZüżP(’,YĄćČ.&(ēšŚ Ę–Óµ£żż“9‹ćÉ/üųU¹¹¹äf»±) śGšåUdŪ4`FŲķŽNmLńP”_{f.¹¹¹ø]ÉĆ+UUt]#£»é$ĆøŁ^ž½ōō“ CČ+Ƥ ĖN8E› ‰«•č`ćˆ0Ōė…<Žy×Ń ŒcĶ.¦nĻ.܀?ÅźÉ£škdę꒛›Ė–¬xØųĒüØfĄ„Ę45čĒ”–!!„b-Y¦f¹½©”–Āžż /SR÷Üæök±––t;&s\OAAśņp“JK OAAAŅi©ĶVœŁ’Ÿ½īЇś[čhm”ådĀ p¶ö£X™Łd’Qʁŗ§ŚNŅ;õViĆŌf—Rģģ„ćÄ[tŲ<äylōŸż€Ā»_^L×¹6ŽōŠpĒ~Šw xę'^‰mĄ¹…;n«žA*Ąą¹S NżķĪŪĀŽŪ«É²KNoå›Żttœä­yy¢żgé.ŗƒ<ü“¾wtjr‚ĶģŻS Vmžu¢\hŽMŠą)„>×8Ųq ŽÖSmŚ)ĪŅn«Ķł…“q>8s–ķwÜMš’ gZąö»·ćüWšhŃwqw]~Ņć'„B±jˆåIĻćńÄZrvģX›.kĖ‘™ ?›¶ZĘõ¬‹aLw‚²X,bżÆ,Ä®ÕbVbĮ‘ °ÕķķķGÆ'į¾¾¾9AĻ|]ŚL999‹>xT„ŠtP¬vöEFŌčŖ¦£XķX摊ŽŖjSĻśŃQU»¹MCƂuza4UEG™^fŁ–žž¦Ŗ`·c%Zķvtt4"›Ć>#čJ¾蚊¦'Ėw,?(VģV™īZ!Dź$^ƒ\Ļ2×»n*ŅŠ4`0ˆĻēchhˆ[o½uÅi$šÆK›mļl{oY•4n8įpl[aRIF§ !„BˆĀżųŪĪ„;7§;b]ÜVńŁJa‹BæŻ}S; B!„Hb¢¹}b"ŻŁø9Ę–ŗ “Œ[ķ Ū3–Ü…m#’€G!„b£‚ó痵Љą}ēxŠ2$åtĀ'?{ˆź ¤£UĒrĻ“J% x„B!6:U…#Gbƒā—Aŗ¶­÷Ž wܱ¬UFmĪ›¾U'‘1÷ćsD“mē1"*Ł·6¢¬ātŅI9±q=Syc`g’įž4’djÓ¾AIĄ#„Bqƒ‹6ŸĮvårl¬GUUJŅ0»¶ŻL$ož€É¶óčKxh ³ Õ;JĮCI}Š3EÉĢĝ™‰»¶ˆ@”!ĀĶ B!ÄFŠ×{y<±ĄgūöXkĄ*2»¶yźėVu»ėMÄėÅwō=Tļč²ÖS½£ üų9ņŗG^^Šr7æł ˆ×K¤pŁßg£HyĄÓŁŁ™ź$„B!RŖ*E­&)į÷Ʊcpśt¬µ§±qU7æŃ»¶7ĄDsˊ××#F^~ģ[ćGŗÄ jāy ÷0ŃÜrS?kŅĀSQQ±Ɉuا§GŽ Č~bķČļMōōō¤; +‰@GGģ55Ą}5lŌ®mįžĘNœ^•@@D=z =YW­aŠĆAFÅŒˆŹčŃcéĪΚY“€GÓ“µHF¬SrüSCö«kG~o↷Œiؗb#umÓ#‘ųXÕfP¹‡–÷ąŠTs×Ö0vāō’Ę&m2-µ«Ģ0 ĆHw6„X6)»āF&åwķm„’†ūüé‹) vLĪ.śāŗ .2j«Ó…5“ö€Ē¬ –ņb½2 UUQU5^^u]—²¼¬U]µÖåevŁ]×ē¼nŌr,æÅÅ­v9_źz׳ż…ź^‘Z7ņIĶ.gĆ/æ¶&3™©ŽQ†_~ˆ×›ņ“–*kēŽtgaͤu–¶H$Ā믿N}}=%%%X,¬V+W®\axx˜={ö ( yj¬X§†‡‡9{ö,ŃhĆ0p¹\ŌÕՑ••…ßļ§„„…C‡`±X¤,߀֪®ņł||šĮÜu×]†ÅbAQR{_źģٳ R\\ĢÖ­[Q]×yć7°Z­ńå222ج¬¤ØØ«ÕĻ׍Tž;;;©®®Ž’o¤¼Æ…h4Ź«Æ¾Ź½÷Ž‹ĶfCQEįņåĖ ³wļ^`éåÜėõŅŽŽĪķ·ß¾hy^ɱYØīU«ÕOW,S×P-QBKxåŲµ-ŲsßŃ÷Ö¼ÅEõŽ2ņņėä}ųnœÅE3>Ó'&Ö|%33–ž®5M7Ņš˜w_:;;ńx<8N 󖛕˜ĶfĆf³Ķøc3_¶ŌŹmörR!Š•Šuęęfn¹å233‰F£ōööŅŅŅĀĮƒq¹\466ĘļŒ›гļ<Ī.R>חåŌU‰AĀbŪLvÜĶķ™å˜÷"q©õÅb™Qę×ėėėćąĮƒŲķv"‘v»=¾Ü]wŻ…®ėhšĘÄĆAaaa¼^^j~Vrį¹Ņś<Łg†aŠŁŁIEE†a`µZćū7ŁyåfüĶ™ūAÓ“ų>²Ūķ3Źåģr¾Š9ٹQfm3[uB=WӚ‡į—_#÷Šøkktvčģ"Ü?@įĒaͧ²ĪÜZ%ĻZ)--åĀ… ģŲ±#~w¦+ŻĮĮA._¾L("##ƒŗŗ:²³³ \¾|«ÕJ__YYYģŲ±ƒööv‚Į TTT`±X£½½P(Dnn.uuu8Ž 7så&VĘ0Œx95/ŹŹŹšx<†Įää$]]]ģŪ·žžz{{g¬_RRBee%cccœ?^Źē:·P]511Į•+WŲ·otuu±wļ^&&&ø|ł2Š¢Šßß?o]eĘmmm ćńxØÆÆ'##«ÕŠĻ狯“XNĢŗ0‰āŒy‡~dd„K—.įõzÉĶĶeĒŽ8NšššˆF£477S]]MNNΌļkęGQņóó)++ćźÕ«äM}>W®\™³]3Æ ٶm@€īīnöķŪ‡a+ŚG ÕēĮ`K—.a³ŁčķķÅårQ__Off&--±)f;ĘīŻ»éééadd›ĶFYY•••ńV›ż·fv K ”ĶŗĪļ÷sõźUl6CCCdggSWW‡ĖåBQéģģ$RXXxčéé™s.O<6 „Ća.^¼ø`}øXŻ«ė:^ÆwŽzuhhˆ . i[¶latt”[n¹%Ž •ź–ÕÉtšPlėŒÖ=aōdł¾'Y\’@g×ŗ¤?zō؜YŅ]8n]ŀǼęˆD`xxś’##±’OLą\åÉ,Ö«uń‹Ž²e Į`įįa4M‹W¶Į`óēϳk×.næżv<„ĆaĀį0½½½8öļßO8ęŌ©S”——³sēNŗ»» ƒšššØ¬¬äąĮƒX,.^¼ˆŖŖń;©B¬„¢(ŌŌŌšžūļÓŚŚJoo/‘H„üüüųņP(„®ė³wļ^öķŪGmm-‘H„ĢĢLü~?ĶĶĶTTTHł\ēŖ«4M# FćĒĪü;‰ŠŪŪ‹Óé\°®RU•`0ˆĶfć–[nĮf³ŃÖÖF$arr’Ó§O'-'‘H„¾¾><UUUhš†ŖŖčŗÆ’ 8xš ­­­D"vļŽ¢(Ō×׳iÓ& ł]m›Ķ†Ćį 77—`0Ąää$gΜIŗ]æßĻūļæOii)$ ŅÓÓČĢ1+ŁG Õēę6¬V+x<.\ø@8fūöķ4440::J0äąĮƒģڵ‹K—.166†ŖŖńŁŲnöńó}MÓÄf³ŃŲŲ/£įp˜ńńqĪž=KMM »wļĘėõĘ’ÉÉÉyĻå‰Ē&ŅŚŚJyy9˜·>\¬īÕ4ęęę¤ådbb‚ÖÖVjkkihhąŚµkĀį0‘HDźÜEøõ(łŃ0e‘I Ō n=ŠÕ0õ\%Ųs%ŻŁ›CŸ˜`ųå×āSDÆgĮĪīÅźķ½.]‚S§bÆ7ß„ēŸ½¾ū]ųö·cƟż,özåhjнZ[§P{“;°NZx¬V+555\øpüüüķv{üÄ …p»ŻŒ£iš¦”( eeeØŖJvv6”PĻŌ\óv»ÉÉIü~?›6m"''‡h4Jyy9ķķķń›ÜĶ+e±XØ­­%//«WÆŅŪŪKww7ÕÕÕlٲ%¾œy·Ōét¢iŌÖ֒‘‘ĮĄĄn·›œœ4M“ņ¹Ž-TW™÷›/µ®2Ėɖ-[Šuņņrš››QU•įįa6mŚDnn.ŖŖĪ('š¦a±XØØØˆ:f÷”ĮĮA<›7o&RQQĮéÓ§ ‡Ćńnyę²fYK¼ąKSįr¹ˆF£X,†‡‡q»Ż¢iŚŒķŽćp8āinŻŗ5 ĀtėżJöŃBõy4Åf³±eĖTU„  €®®®-¤fĖW8fllŒ¬¬¬xØÄó7{+ĻB, ååå†Aii)MMMhš6£ŒjšĘęĶ›Xš\nÖov»””!Ün7¹¹¹ńß@²śp±ŗwhhhŽß‹YvĶ2TTTÄĄĄ@¼ŒšeAŹĄāf·žß<æņÆĄéLc®¦łŪĪÅf’['ŽSŸžŽŽahsßWƒ±ąÅćÆĀSūvd$Ö2#VlMžČ<ÉlęVU•ĢĢL²³³éźźĀćń ėzüóžž~†††ˆF£ø\®ų#UUq8ń»rŠ¢‘‘1£o°®ė„B!ü~?'Nœ˜‘~ ĄétʛĘekjĢwü7³ģøŻnjkk©ŖŖbdd„ŽŽ2§ś2†ækhmmmäå呗—‡¦iń»÷'Ožœ±ķÅŹēFŽÆėĶRź*ó"Ž 8Ģn6ęé„ŌU†aÄß7 ·Ūæ8ųż~ŽŸ9#’Łbāt:ćŪ7/ŲĢ.H'^].6›P(/Oš¦ÅĒ:D£ŃųÅ„ł̲ē÷ūćA{(bÓ¦M„§NȉŪ5ƒ’p8ŒańnDccc3Ęt¬d-TŸ›y ĢīO‰ئiäää099“TPP@UUU|ÜG²q)7ĆļĶ<ÖįpxĘšH$‚¢(ń²įv»ćåĖåraµZ ƒLNN’‘‘A$Į0 233ćÄĪå­­­sĪå‰å0399É©S§fä-Y}øPŻkĒÉ~/“““øŻīxłĢĢĢd`` ^VĢß»\,_F(Ļ<UUPZū7 ō‰ ¼ļ'Ü?ņ“’16ĆĄjÄź»”/Æ;UGĒ*ęN˜ÖE Ä*–šššų"³Raxx˜;wāt:įŹ•+3NHęI³rJ¼®( ‡ĢĢLvģ؁®ėX,¢ŃčŒĮ¹B¬ÄŠŠ—.]¢±±ˆŻ)/**āŚµk„Ćįų€_³¼öōōF©®®ŽJ7gs«««‹Ÿü„|®_óÕUĄŒ–óy9u•ŁĶ\Ž RG¼«««‹_š™å$‰ĢŲ~b« ĆįĄēóĶxFć­‰y[h†,Ć0&+++>ݟŠ"q»ćććńąbāŲŲ‡cĘؐ•죅źsUUg|sŻÄ‰BĢķšćv¼^/ŻŻŻ P\\|S™3[ń[Ö ÖµÜ P, ”P(¾|$‰>³ĖZ8އ”””Ļåęö*牫{Żn÷¼ŪÉĢ̤ææ?¾-3hŸŻŗ)VČļu›jmż]R |Ö$łńę˜hnYńśVĆĄ6¬X™\ƒ§!åäF³®śÉ8Ŗ««ńNĶQnŽ%u¹\ø\.t]gxxĆ0ģā3ū„ßļ' (J| cbÓųĶxr×/777>;Ē»KƒA²²²f,;::JüBͼxČĖĖcbbBŹē $Y]e³ŁˆD"ń‹x³®Zh,H²ckŽ10 ƒ²²²°Z­‹Öc³·kž›——‡Ļē# b}}}ń–£Å˜AL ąźÕ«ō÷÷SZZŠaäää0>>žt»YYYLNNĘĒū\¹r…‰‰ l6[|ü„@-w-g?$ī ŽJ1<<Ģłóēćū'###Ž‚”8.ėf”››ŸCUUśśś"''gĘx5s|ĪĄĄŁŁŁX,–ųĶsÜāŠŠ0ż¬œŒŒŒ¤ēr3(Ņ4mÉēėÅź^3/ɶ“››/Ÿ†aĢČēĶ|ģS¦ÆŽ›īž•Bƒ?}1i°c5 œŗ†S×pėQ2µ™Z„5•E&)‹LR¬(ˆ†(ˆ†Č†ÉŅT²4·uį“`gA–uŗÖE Oā ©¬¬Œžžžx„–ŸŸĻČČĶĶĶń®>ŸoĪ]słd••Õj„¢¢‚¶¶6G|°ćģ‹I¹ØĖe³ŁŲ·ommmōōō±‹įŗŗŗ]B, ½½½D£Qšššāå4;;›]»vQUUEkk«”Ļun”ŗŹétRPP@SS6›‚‚Ąœ 腼*ˆ=ļęņåĖń֊ŗŗŗxk`UUgĻžSNfo;QVVUUU|šĮń©¤[GfÆDf·"EQp»ŻģŲ±#~§?;;›ŹŹJZZZęl×ķvĒ?s8ø\.¶lŁß/ļæ’žŠ÷ŃBõł|ūĮü;;;›S§N±{÷nFGG9uźT¼ė`~~¾üʀķŪ·ÓŅŅ?ē:¶lŁ‚ŪķbūŅn·såŹŗ»»±Z­ģܹ]×ńx ĄœNŌ¬“Ģ>é³»™$vsP%ž€59Ł­¾”””y’FxĒÓ¼#šųl³L'^Š™“aŗ šer©ås£ļ×õf)u•y¬’ͬ—xŒŖ«Ģ®7†a …ā“ ˜u¹\(šSNĒ«˜ĻI1·eŽ•‡Ć3šøĶÄļe®gŽ•4ƒ#³ šĖ™wåēŪ®®ėńīv‰y5»®d-VŸ'ī‡Ä<š›i›/ó‚ŪĢ»¼%~ߛé÷fī“h4/ƒęłVQ”ųĢ©{÷ī%̘žÜ<īf×Ls’™-9V«uĘū‰ēr›Ķ6#ą°X,ØŖ:ćYT‰õ”i±ŗ×0Œå31Æf>'&&øté»vķĀb±ąp8p8sźÜŖy.Öē Ģ™}>CCCÜzė­+<*3éżD^~eĪū6MŦEW%”Ų½ī¼3µi¼ūītW:‘Q«Øun—|ĒC¢ĢzŲźJģܹóŠ Ø@tź„M½ō©—FĀ3­-<‰'ĮŁż¶/ņĢhāEc²žŻ³ļV&[Ę܎ł¹Ģ€%®‡y¶Z­8NģvūŒņe^“%Ž!0—O܆YÖ„|®OĖ©«ǜŗ*Y‹C²/ų7mŚ4c‰ósŹIbYL––™O3o‰]„» 'ęÉÜVb1»k‘™žģķ&¾fēÕf³]÷>‚äõłģż¤™ėĻHgļē›żę—yŒÜn÷œżkŽw1[5Ķąaö1O<6‰ė';öfš³§l%®ŸXN—R÷šŪNVNĢ4ƒĮąŒØ7ūńO™„qS)SZ*Hj]tiKvA—ģB/ń¢q” iög³’ž}b_l{B,$ń‚q¾2:»|;#˜ų¹”Ļõk­ėŖłŹ’y™ģ³…ŅZźzó•éł–]h»ó}¶–õy²ć“h)æŁ›ÅbĒŽķvS]]=£%/ń›ĖĶwÜaįcæœc³”ŗX0/V«•ĢĢLŖ««ćĮŲĶzģSnx86Ž'•SV—”¤nŪ↖ö€g%ĖõVF‰ĶčB¬†dei9q³?“ņ¹ž¬·ŗj9ådöÅāRÖ[īÅ’JóŗžźsłĶÅ,T^ģv;EEEń©Ć[üŚĪbé,“ĢBĒw©é.“§ÓIaaa¼{£“Ŗ§PŖĒń8PP ®„HpĆżŖWė„$'6‘*³»ę¬tāʶuÕJÓHUłZn^×K}¾æŁ,پIÖ²s½Ū¼Že;ŽKi½žļ$–`-ż;½z IDAT‘āāŌ§!n8kŅĀcNł(nNrüSCö«kG~oāf¶Ä‚¾UŸå¬Æou·—ŒŒć™Ć<ža%6VM³(hLß(ˆ†Ö<_kiMž­µek‘ŒX‡Ę|a²sRŲ_÷&%ūUˆµ#æ7q±óZŗ³°¦ĀŠ• «§®a%ö—½¾®Akšäē§>uĀ dĢ  b‰ż?jQŠ–Ų:źŌµÕĻÜ:“ö1MMÄ_gZ/28¹žÆ"„XÜbæc±ńIH‹p’@ŹÓ°ēå¦< qćøyC%t”‹P·ĄøŠEčż®«žÓƒųŽü1ƒ/ö\ßvDŚw~Ąk§Z¹00¹š‚Ń1š^x‰ęÖK¢ó,£«\nme(<šųÆ|Ą^:Nk(‹ź²M «\inåō©ĖōõöÓ×{™ļ¾Ės’š#:}źź}1!Ä\Kł‹MŹ@ŚDśSž†£xsŹÓ7Ž›§K›…ؐ3»5öÆÕC·ī@wf__Ō§ õ…®›(zÜxŒÉ^^}£»cž#©MōóÖ_„ĒüĒ|ź³WpąŚY~ųŅؽ“’ēĆ[qM-£w|ś!vēŁcłóę÷^āüÕ jsņ®÷k !’XņļXlXRŅKDˆx½8ņRwžsäå”8čé5!ÖqĄcŒ_eąõsXJаxĻ”śÜx~ńA6Eūyū8Ń Ąf6Ż»ŸœŅĢ©åĻ l­Ć¾Źä…AČ(Åó”F² \sŠĆ/^$šµ÷ęL,€įļgäŲiĀClې×X]1v·į;Ö6ՊćĘV×@žŽ§šŠ†ĪŃ÷āyģÅõ2zŗ…`Oģ†RŃ@īĮøœ–yæWvŽ}-v«H*Ä/½Ž·n?{Ē›\ ©näĀ«tęķę¾ŸYü”fV›uøƒļ抵·M;‰Ė$œj-¹ēA—"§_!Re¹æc±ńHHæH’`Jˆµņ„z®¦4 qcX·WUF4ˆ%ŚuՐƒŻčcą•ćDƒnģŪj°2Čä›/3:ĮˆтŌÖ&&/€½4‚½ų_yÉ`²Ń5jļ Ńž`lģMx˜žŸ¾Mx(€RZƒ-¢N1ųīU¢ĆēńkC'ēī:l9¢ēŽć»ˆ†§¶Ą‡1T/ƒĻ¾ vrJ±å€ŽÓĀČ3'E“/Ē& vŅiøķ=Nx«łWwng±æ’‡½;żnć¼|’­* A¤Š¢Ø²dI‘LĒŽÕöœ+NĒNO:NĻōĶ=}ņĀTæčÓ÷Ģ$é>Ó±3#¹ķVŚi9Qä%¢,‹“,QEŠIą{UŻpĄ}ÕļsŽDTÕSO-Ŗ~õ,zž§üāsŁWŌ~j¤Ənså½Ļ}üųBē’`GūņųŃcÓq7H ¤±ņóņ1o»Äv)ššókĄō™žLēÉBōŃcž4„=āg=Æ+­g_ēĶ—ŚˆßŗĀ„kŅŌųSNEęźyŅ,ģĆ_’ˆ’ųš+üāU‚;æ„ !„«f¤f0“IT’ę=ܓ~<[ĻaģÄ1@vžķŌ¼Ē/–aļBķĢwi~.„1'Č£Q¶gŠ&(˜‡pŖ`eK»|1E9m+S*Åń+=ŠŅ†Ūł˜ĢĄŚ©æ łL+¹ŽOHÜ^4ĀHĮnØčö.-N$±š£`Q˜* s¬Ķ«9ĒJ;‚ī?@ėAø÷U/#ščåF0H[Äæ®p“>AZξF׃åÓKŸžłZ<óēœ_£¤ÓjŅåB±‡eGāŌmbĄŅGŲv~Ą³ļ·qµµĮķQŒŪß0énĒ||ƒ\”SÆÓŅVžūńĄÓR$s×J¼ŚU§īöC(_F1ļ~ĀpžZrˆüdźŚńķ³Ÿ¾›ÓÓĢ<™!5?Ų±L;“}Œ\ĶŅpī X÷’ÄpīNĘČLĶ4ĄL|Év‰ķ¢sčüĶžmŠwłWōt¼ĶONƒį;_3Ńp„ū½SX.&1L;āöpīÉć_~Ģ„¾ęļŽyž:ģ&mńhŒŃœ“Üō(W>y ­ß¦Į¹1[)„ØMž-9¶Gnx„ŗ£‡7uz°Q±s-PŹż(źŌŁfEjąįæ8 Œ’łĀv“Ć/Ņ|faæ•GdīąyķMü¾4Lņ¶Ņō_^@ŒG÷ÉĒÓ(­Ļzåīöč°z˜žÓ-ŌöVĄˆM`ź xŚė€4Fō.ŁBˆ}o¾ŒĆęĄ};Ųń“xė<Wåķ;…‰ųÕ¹æ'ī|ŝ‰\•łėpŌ(A: ©sGYń¶ņż| 7¹Ö;6;σė’É’¾ōļ\ŗō;®|ņO½ĢO/>‡kż$„XVķr,žrlø@lŚ׹HQ»kŠ‚ ©Ų§5ģŚ ö=Ś”o¾łęŚJVšąĮŽŻæ±¹6  EÓQ„ž4‰ūÄ>ŗM/ŠśĘ¬\tg­žēU9T MŸß ÉĀĢ@s¢Vس y,e.?åļLSAs=»£°MMęhČ­ūF“ż*Ä֑ņ&>¢£££ā4«J'mĆ0Čd2LNNĒyé„—6$/ęšł®,łŽQĢć0 K¬Ž“¦“Ō¶¦™Aä'?ŚŌ~<C’ōĖMM·s™įbvĆŅĖ:=K¾s¾yu‚Ļ'N¼ <Ęī9P,}ŒŅĒ,},Ą²ęĪmkŅf%żčfÕéu’šĘp•¦źh‹Æ=åBž*`šk­UCsUź¹” ÖHSѝKjlŻ)C!„BT±żx\-ū¶¤6Iģ\ŪׇĒĀwīģĀŽü%–.ĻźBÅ߂ļœ¾¦ŪNO!„blTķĪVĖ'Ō±¹żxœ-Ķš<ć¶-ąQ<N6.=×ʦ'„B!6W~xtł™ÖÉÕ²$=›¾±sIeˆB!„Ų…ÄĦæ'G.š!„Bˆm3śžé[·75š‘ ēŁ&B!„Ų6Fj†ä­bæś_L\ūtSÖįJ·‡g™>N4„P(066¶`z$Įår …hoo§©©i›r*āń8…BX,6ū]4­8ołø9NB”Šŗ‚®h4J>Ÿg||¼ęzC”ŠģzC”~æĶėÜ*š˜3ƒ\ł}/ŗ³śc¾brˆ?üśŲsVoZšP.`3C·ųõ‡7ąčwłł÷ŽŪĆ}ŖPĪæó#Nķ+­™åź’ų-wŸNs4^ļf !*Xq9{Ö³p$“Izzzčėė#ŸĻל·|cŻßßOww7‘H„·ß~{+²)*ųģ³Ļ;Ėéļļ_šw$įųńćtttą\įßÕj®*Yœ·p8Ģ©S§čģģ\ŃņŪaĒ<ęōF?īĘj;K󷣑gś³«$~Bo¼‚[Ļ0Ż{‹äķūX„p½ŲEس(Ž=bģ×(fZš^ų­õ˜ÓOłø%AIōR˜ōį’«’‚ņōėŖi‰½.Ćķ?$ńÜKœž‚Q³śœ‰ūš x–ļ.ņūO’˦¬:4ņcwųå_Ų5;å`gž<óĪ2Õ¤%T9ó„Ų,«-ĒbļŁėē@ww7===Ė:ՄB” Ī‘ŲJ±XŒX,†Ó餫«‹Ó§OoźśĘĘĘøzõ*÷īŻćūß’žŠƒ¬­“cļŖ¬|šb&…Ļ•‚0’ĆX“IL 0ŲĖōķūŠz ’KßĘį'wć ćŃĢŌ#†Æ\£˜ń”;†Ę03WKb4‡ULcdĘ)>ź„0 Ј6yÆjZbļ»ó¾Håoϟ$øĢ¼ĮēĪ/Žy‰ĆūŲõ3Õ饚£›\yļŠŹß\8¹$ŲсĮž>=zĄƒ÷øł‡ø–€“mõkŽ!Dm«)ĒboŚ«ē@>Ÿē½÷Ž£»»{ĶĮ }Qöˆ|>ϧŸ~Ź„K—Öu>¬T,ć_’õ_·d]«µckxę‡bJ…‹S£öéL­ ļŁó(źź½äīŁ•Ōź©—i:³Ÿb‹‹Ń?ö’¾3Hżģ»ŗśékx”"™»’^5-±·'šŽµ'¼śĪ/8TFjŌ®8\vȒÆQ T¦n܂`Qnßå{'›+Ģs‡B«›l6K"‘`z* õō±VSŽÅŽ“ρ|>ĻåĖ——ōĻ™ÆZ?h4ŹųųųģjGGĒffU¬Ó餵µuIķ[2™$™LÖl‹Åø|ł2o¼ńĘŖūŪtvv.iŖ‹ÅxņäIÅs-•Jqżśu.\ø°Ŗõl¶š”长ö{ץČM>fęÓĒ„oC/~wi!³÷c¢½óšČb¢Ł’oڇSpŌL+^üL^ģy~ž{ą Ī™żÓ9F²}ō€žĘēhŌÆ« ““ž½Č›/uæu™K×~KsćĻ9™;§Ņ,ģĆy]’?üLJ7h’Å÷īü*„b›-ģD"NŸ>]5éźźģĪņĆĆƛ•M±”Pˆ‹/VžĻēéļļēʍ¤R©%ÓĒĘĘųŻļ~Ē[o½µŖ&gKäÖÖVŗŗŗčļļēźÕ«KjtśśśčźźŚQƒģŲŪ)E-E:£ōMcŽń+ųĪvįR½8 Ó¤Ÿ|Cv`œŌƒQ\>»zZ;s‘ęē˜Ó#Ģ$rč0*C‹Ņ­V |p ¶VlŻÖƒp÷«Æ€,ŃĄ-nĆ“m@Ąsųh röu^|šK®_ś”ŸŸČ‚8zžZœCA Mq=yB±ynÜøQ1Ųq:œ?~ŝɛššd„¶]ŹétĪÖĘtwwÓŻŻ½dž±±1nÜøĮłóē7dtuuń駟.™‹Å$ąY Õ@ŒÉ›ŒŻÖŠ&›™›ž½ó[&ļM§h8½Ķ„—–óālė€ŪĆ·o3é>Œłų:¹8(§Ž¤„m. ki‰½ĢÉįóßēšģßEī]žGz:ŽįSA HģĪm&ŽqråB»\Lbšv1órö?ąŃ/?äŅ·ų»wĪāÅ®Ą>e4ēĀĄ$7=Ā•O@ėyv^Ÿ?!ö$y¶ vó9Féķķ­8ķ‡?ü”0Ļ rķŹÕ«W—LėķķåōéÓŒ?~¼bĄ“Lī¬Į@vlĄƒ#HùC$¾|L”÷Ļ› 2ˆYj®ęėśŠĘuRz™* '¬¶æ@šxMž‹ cśŠĢvÕ¬vųAµŅĻę½|ĪdāĪ ī<×^%ą©ĆQ£ HTU™ż[õąū?x‘_ų×z[łžsŖŻ‡ēś•ŅŠØ¶ƒ§^ååO"Æb+Ō.ĒāY°»ĻJOņ^yå•Mv’É$ććć ŽŪ²›ŽĶ•ūĄųż~|>ßŗo(§Y¾ńD"[:Dgg'żżżK†¬ūœŁØ>6;qD¶JvnĄƒJŻ‰×š{ĆRq苳ź#š‹4¼˜Ē0,UGÓē~±ÜæEہ Ц£•Ķ“żlQÕ®Z;-ń¬prņ­w99’ļwę’=oĪąIŽ}·Ņ”G˜ļæūī’Æż^ąŻw_˜żū{ļ¾Ė÷֓e!Ě-[ŽÅž·ŪρjÕĖ}v6C>Ÿē޽{ōōōTģ+Ręół8~ü8§OŸ^ö¦ųžį–|×ÕÕ5Ū·h£—+oĆżū÷kņv³­Z}g‹F£twwW<.N§“Ó§O/›ærįĀžéŸžiÉ÷•‚ µŖV“‰D6laŪ3ŃGō£ĻŖNÆ»ų߆](gĶL*'Žj3ØN«xL^3-!„Bˆ¤ŚėńćĒ7e}Ńh”«WÆÖ tŹR©ŻŻŻÜ»w7ŽxcĒ4­«ÖѾšå¢łśśś*6#+ĖēótwwF·äÅ®å~=}}}KņF7¤Ę©§§gÉwė­Ū Ūv{ÆxĀųĻ}KӖL³ py–~/„B!lÕžĶxćżr7óÕ¤R)Ž’}.^¼øķĆ]_æ~½j§jVzćŽ××·$°Ø&‹qżśõ < –ÖÖ֊łŠÅbėJŗ»»+īĻ­Ų®ÕŚĘ€'HƉå^ó(„B!*©Öœm£•kv*ńł|tttąr¹ČårōõõU¬=¹zõź¶¢ŠÓÓS3Ųńł|³żŽ …ĀlĶĪjžÕŲčĮŖill¬ųżJ˜ß? ęj‡śūū+Öō]øpaŪŪJ¤—B!Ä.S­IÖāSn„jĮĪ+Ƽ²¤ÆŠłóē¹zõjÅfTŸ}öŁ–4åZ,VI ģ>:ēĪ«ˆõ÷÷ÆzvuuŃŁŁ‰ßļŸ}7Īõė×+ƞžžMÆ ©`®4ą©¶ßół|\øpaĒ5e+“žłB!„»Lµ¾%.×ʎńŁ××WńI~„`§¬ŚSžX,F4ŻŠü­Dµ‘ģ.\øĄÅ‹««Ŗ¹pįĀ‚n–ūŠüš‡?¬8’F°vz°š!„Bˆ**5ół|ĖŽ÷Ź+ÆTü~µMæÖ+WlśW~IēF©•^SSSÅp%ƒ?ģ©TŠĖ—/óŽ{ļĒ·;;IĄ#„B!–H&“k’V2äµßļÆx“æÕµæßč””—ė·Rmśv+­ ‡ĆD"‘ŁO8\ż•ccc¼’žū[ԮĖōį±ČlÅjÄ%ĒsČ~bėHy;®ėæĻår¶ŽjżĖ½ t„Ķö*ՂåółŖµ{A<ēƒ>Ø8­««kĆGČŪģ~Ba‡<é¾āŸõž1¶;3♓ēńĶ/鋭`ųŁĢ¾ŽGʬ2½˜¤÷ś—D“ ĻćéĮ>>½~ƒo†f ˜ä›/¾äęĶŪ³ŸÆz2:½óŸ”±',WŽÅŽ·΁®®®ŖMÄ®^½Źõė××õ¾RĄ‹Å– HnÜøQq½•^ĪY­–ŖŚ:ņł<ׯ_ƹž²jĶžŗ»»wģK2×£§§‡>ų ā¾‡Ć^»F+ÖN§sG†·Ć“üƒ»äŻ%›‘€Gl­é·ł½Ü™©=cqŠ›|Č­Ž~ŅÅ*ó˜žōöĻĶĒ©ĮŪüˇŸÓ›­ēŠ~/˜oõŅ}ć ±č0±č¾ø~’żĻ’ƒÉĶ—_ˆgŽJʱŲŪöŠ9šŚkÆU}jßŪŪĖÆ~õ+®_æ^ó?Ó××·$Ø6ģš•+WŖ¦×××Gooļ’ļ#‘Hśąj5•Ö‘L&¹|łņŠG_óūżƒ,€÷ߟīīīŖałA;]¹łŚÆ~õ+>żōӊyv:5Ļ“ÕŹēótwwsłņåŠÓ7:°ZÆ-yńčJX&(ŖŠRL‚²ŻĻk&Źļ~’ ŗ³śs#9Ģ~ż;ą¬žÄ 4A+ż™śš_ų=ĻĻæwwižšŹ;or*hæ@ĪŹŒqõ|Ƚ§IŽ*¾#„XŸ—c±gķµs ©©‰óēĻsõźÕŠÓół<½½½³AČü£P(,y/Īłóēg’ļ÷ūéźźZŅ$ŸĻóžūļÓŁŁ9P”›ŠUĖétņļ|§bž:::ųōÓO+ęūż÷ß'£ėzż®DWWżżżīīnzzzhmm}g2™$‘H066FWWWÕ o+Åb1.]ŗ“໕īŸĻĒo¼±¦öõõ-8ž¹\Žńńńš#°mFMŅzm{ĄS{ĢŲo`d@m? ŃÅÓ’ćē3Ķx/¼@ Õ59ĄČö”¶µ”Ķ<$MCÓ1ēZÉõž™L4 Ć4~÷,u^ū¶ÓŹ$˜čī!30 €Ś~šĘoĒķ’šźŁ–åö‡“xīĪNßd“FӆńūæćAšƟ6ųĻO–ŗ¤94 c}üņƒ›pōå¹`gž<ó.µŠ§‘– ĶÜĻ»NcK n #3Ęą(8FŪąõé8ƒ£ŠÖŃ“į; 9ņ„ ­‰öp]•9,2“£ŒLfPt-‘0®U…ž“±§Lę,ĄG[Gø“kK{åūŚ 51…£>ˆ»ĘŒ›yģÄ*™i†F),ųRĮ]¢9čې'›YžŲ‚mYKžć„Ä»ÜÉnLńõĶ>Ņ‹¾vÖéč^&ģw3‰&†‡ŠŪŪqY ›Q±Æ:ż„ĀlčĶøYĢ1f:g”łŖĻg¤Ē™ĢąGø-&bĆĆu¶6¬|[­Ó9 o8BØNŸ½€¬5mUQ`%OC­cSIš‚ĖĢ›uģÄź(44ķ£N³M1›dlrŒ‡N¤~ogfsŹS5›½-k±š3½ˆĘēNpŲł7‹ibŃw×͹Óū„ń:Y–E±XÄį˜Ū“•‚™įoųӟo02ŁĘ›’÷ė4•‚M+ēźož§SüčÆĪŃ )KŅŖ@͟¶xž?’łĻœŪķ®8mÉzVqŽ™€19Ā“·z½“œe±®*¢׃XN…϶m»¾ZÅ&ą©ó ėą Š¼c4‰e˜ VŽÄČ©L@ó>;˹ä8£ćI @ѽ45‡©säĘŁÜFŠ£QL'Šēhn‹ąŃ =>ÄA"¾ÓIØó¹Q² Åsxœ†½U'Š4·žĢdœŃÉ,<~/Åt‘ŠžÜ ScĘå§Ž"Uė"¢yh z©÷¹PÆG%5SÄdé cÅmŌrÄF1™±a“}m=«O{n»Tœŗj9J³HOŒŸŹ”ā†¦fėT&¢£ŒDi>éJóé„c—%>D՗e .{®¦Ļķ"?=C2WÄĢfĮ”ä Ši£®8Ua_LDŸ’óµŠRŗa)¤āD§4ZĆźlyŅØrŽź fv‚§ćū÷Ń3›ąé8„æWz«o 8kœ[µĖrõók£ix|ܳ÷ŖZ‚Q&āsõܙńA<& huaŽķ Į™ęĮ—÷š;Ć~æƒĀŌ=S;sæ¦æę)ķ<ĄÉšĆ &ģz$_óaŽ -ų”7RĆō>œĄė.21g=G:ōŲ{;;ćžż§³ė?Öyæn/wēį8NG‘é41E&ÆŚĘ««ŲwĶyR†›ę–f|Ž“£ö‘IO¢łCD"MøF‡F)(:.Õ"9“ ›LaY9Ņy(0, 9XF‘B®€e™F¶“ž&¼JÉŅj1=ĪČä ®†&"ĶņÉ£€±$ qŠøæŽHˆ:‡Ró”™ęņŅPļĮŹ„ˆĒ†I™øƒõKnģŖn£ź$®źCMųuuÕi—·Ėh"Ņ\Q˜ĖqqfŒŃ© uĮf"‘}ųõSń)Šhųõ((ųC82Õę£tģ dM/-‘f|Jޱ”8…šéCnjŒÉ „#ūi łÉ§ĘI¤‹X¹I†āS„}±Æ9ĆH)½jĖģE¹ä8“cM˚¦–…eYŅ“$Mp¹œX–aČ)ü>.kŗŹ¾Öp9²)ū¦“ŌÄ –Ɖ:ÆąéÓ§ .˜>?ƛĮB'ÜF3SŒLd—NÆZTü”¬B’ųd–ģTœ©¼E Ą?ļzP©ŁōN-§Fv’ńéܚö£b÷ŚĘę“:Mķm„|hFžäŌ#±§<‰&꿀)4ķ Qē®#ņƒ•§hAn&j=-!?.——}ū›PČ0•¶Ø«wbͤ1)’ÉŚ7SŁLвØųĖ5 Ø„õx …}`Ś@!=Zū½øźhmņVņŻ~Ģ“ø»©eFécĪF>GĮ²SŹĶ¤Y|]^* noŗcin–K;Ÿžµž¦€W]€–{®I›ĆK0ŌBø¾Ż”ć©s•Žču<^Ŗ^}¾Ł}ŚÄķŖ# ²…Śé›Å"`ĻŠźģDzdSIĄE°”MsŅnk†™œUu™½&—ŒĻį©ÕyŖ “±§Očņ„'Ož04:…„zxĖFTšö5 ±fŖļkæ¬$3ĄH3m@C nAyŖ~ŽKĖŻ¼æWzknKs«VY®u~m4чwłęī]īŽ½ĖĆ'ĆØĮƒœīlFfcąl„ó@Æ7Ą‘ē”‘`dŹ"°Ļ‡1>‰A©©<ÓÓY($™ĄIøĮE1—ŠdŅ9ō†gNā@}„ĪANŽtīĒėöqąø½ŽÉŒAj,Ōs „‡ĆCKGcLd¬ŁåŽ;āƒū+ō©œ&zŽĆ'čhjĄ©»©o¬Ÿ=.ŁÉøŪ8 ąmhęı0`¢@ķ¼h^Žœ>MÄ·śŚY„ßČŁ9gū锎•«!µ‘o"‘ „„…ĪĪN:;;™œœ\¢«b 8}“4ŗ(L 3](5e.©U½žHĄE~r˜į‰īĘźueĮõ@[“»wr9ÕÜr‰#ōńLŁÖ&my|a|a,³Hzzœųä4“3õU pS~ˆh_„ ĶR”ęqĻEkŠRśæ…«ĪS¤³N2–“@ƒĀd*CZĖ‚źĆ£-n¶l®¹õĢ›’Ļ›Øuī¹ āŖ‡75œ×Ämn€Ż¢ÕFfœĮ‘ Ņ…»©Fy“jlcłŠ\­ŪĶri(usikĒģ†;œ:ĘÄ0OĘē…IŖ“ł+“¬eęĆ„nŖ”Ł|]õå<Įfü¹¦£L'ĶCSK**cų鱂m(*Ėxõ½Ó56;1Äpé)żht˘½7[Ą²L¾fZgŪ8Ś źĆMxŌR§k͉ۭ£ö8O:ŽŁŻU}_+u^|Źə5‰…ŸK…ĢÜ|5ĻŪŖūÅDZֶ V?·j—åźŪ¼Ń?‘Eœ9{† ™Ä½GQŻžŁNß*@½o®VVQ°‹®…§> Ę0S©:¦ ŚTĒ’LéÓą ćw€Öv”–TŃž>¢ż€;ȱcęʦ Z`.`)­#“3ń¢Ó|sėĖłĪ勠š€W„˜»Fšzƒ‹bģ>7Ķ«YpڃŗdŅyœßÜqŃęļļyńTįaÕµ$ÕfWU`imČZ„ĆaĀįpõ,¬qt·Õ°LŠššO=%1c:ļ¦y_šeaU µR‘Vp×Õį©*:åŠBĖŖ¾ÆAĮßą$55Θ’GÆoDgayŖyŽZö_³9ŸwŽU;öKcõm©uNÖ*˵·y敟¬{‚yn&ÅŻč]†źĻ±ßļ°kˆÓ,ę1KŪ»ž°ÖO’ćAŒŗVĀAčÓGō=߁6»Æ[¶H ćy8 ’S <äQ,Ä ‡ó2)rĢ]LĄ­«˜f“ξp‡ 9&3čuūŽ_s£Wś Ŗ‘fņéžN8čxī>L?ęˇöVyźœä§g°šŪŪ;oHęšyYĘā¦båQŅꏜ6ÆjĒ~€Pś[Õģæģ$Ёß97<ĄāQפ7o½‹Gu‹Ēćo•t«ü6:½>(L26•¦K22šj÷ŃYĢįrįq»q»=ø]4]ĆĢM˜)`™&Ēʱpā]Ōŗö6V¶Ŗ“)&f ˜F–ÄŲ åĘšöõŁĖķB-¦‰ĒgģąÅ*O4IĻd1Ģó”9ĘĒg0­"Sń1,\xŻjĶōs“#ŒÄFɘž:OéĘIĮé©+ÉÄt ƒäų0ńń1 (U—ŁS4ĮÖvĪ<ɼŻ|R×õŠĒā¶%%5cõyÓjķk—ÆÕŹ“3źżī%Ė×:oUf˜Lå0 ā£sēŻjŽcµm©unÕ*ĖĖmófņ8LˆŽBpū}äi"ƒaäķļ'O!Ÿplrcd ź‚~./vć0pĄ¾‰ŽånļC’¦ƒū-ŽHó46…aJėØ'ąÕØk€1ĢÓx “"ć}Üō\9Ŗ]ČŖ§iĒ0n|>Z~Šž‡c`dÉYą †!=H’裙qī÷*ŌĪ‹•eųÉś“Ķ TUżwž’EA1- ‡UšWq4p“e˜¾§)Ea":göį™ÄŌLÆĀ§<-322B__}}}466V]fÓéõ4—›9–ŹR­2`å&™.ąķgŲC!9ŹdĪ\x=Øt­Ž¦rŖhÕu݁RH‘uho įŖņ{)„Ų{¶­†GqŲ6›&>œ*‹·±… [ÅČPį~GAU@÷5Ī 36# €JCó¾Ł‘ÓÜ^/$§©óč€Š×£Ķzń”M*‹Ņ®Ņ·@ó‰ b‰QfPŠu N5ü.÷óéš ¦ó$āC„¼k4¶ģƵhĮšŪXå½t+O»™p6ŹX|ˆéņ—„}ēņ5 ¦&ˆ=éĄéqA&O®hįŅx4Hc64 2Uq¾ņIULÅH–óь 0j¤_j&eäé@)Oö5ÖįpxhŹˆ'†™IŲ{ŁŠąsU–Ł{T­ķ›“ō¼óĆį Uß× N˜°ź™ķ4Æ<ÕūŒÓ§O/xiš‹EŠÅ"†a iŗ¾Ģ[h7é¼[K˜»¬jE[[N7ĄŠŠ§U{±¬ad2&''‰Ēć¼ōŅK›˜C!ž 'Nœxx öąæ„Qś˜„Ż.i^įÜĆY©Ė½Uŗ EÕ6uœn7ł‰q2I\Z\ĮĀnČ;^U›×Q|™ł¶šZ|’ĘĘF2™ĢlS¶Ż𨪊Ćį ŸĻćØU;7kžw+$×\!Äf€G!Ğ ėśl-Ɋš†m0MÓH&“kZ¶ōle€&¶V&“Y~&!Ħ€G!ĞQīĒ£Iæ>!„%{¬°B!„BĢ‘€G!„B±gI“6!6Aµ÷2!„Ų},ĖŖś»^ėūşNś‰½J!Ö`ńElń‹wƅM!ÄŹ†QuČšZ/-æP¶Öņkc‘K§)˜U®5č/.ĒźG œ’’ņõMĮ “Īb):nƇU&+Ķ“€GˆJ„R\½z•žžĘĘĘČēóŪ%!„[ |ćæÖe-ĖBU7¶ešŌz“¦(*«É²Óé$ qāÄ ĪŸ?O}}=`>ˆ‘fttKŃhn?ˆO"±ĖlIĄ344“«bÓÜ»wĖ—/K#„bgPfĆĖĀbQ““UĘ$ł|žX,F,ćOśż×ĶóĻ?ozذŠE UĮ2 LSŻšNˆĶ“éĻŃ£G7{BlŖ›7oņŽ{ļmłK …Bˆję_,,JOÅ8ga"„t=«>O&“埒ł_ųėæžaq·å IDATĻ?’<ŗV$ŸĻc9 X40U“ōŌ$É †i¢ ;}›‚x¤öGģ@ž QC2™ä’ń%ŠB±óUhćfYę¢~FV黌ó€Åæ}ų±XŒéd’t&C6›£P(KŽ1’HR4,4]G±, ¹$#ŃŁSIˆ"}x„Øįć?&›Ķnw6„BˆÕ³¬ŁĄ¦Ü§gń€;µę)äó|śÅ|ēÅo‘Iåpø-²™4J.…aŖ‡`ø&¦óč.—–<#;Œ󚰕b Ō n™yŸ<įŲ”ó&n2é4N‡= ¢Ģ024€Ŗjčn^]‚±I“6!jˆĒćŪ!„bC­$&)Ļ“ĶdH$&˜N&™™™!NSTė6Ō”+åa¹- Ł$£CQŅę&f\ˆ5’!Ŗ°,‹\.·ŻŁB!ÖĒK)1VÅ®>Uē1-‹d2‰Ŗ8P4ōĢ ÓfÅįÄŪ”5äÅĢN1œH™œAGۚķb…$ࢠyyØBˆ]MQP, «ō’Rkn’ܬ`žéd §īĀįt1“žĮc‚įšbZ1Ģb#µPZB§Ī%ĮŽŲy$ࢠx„BģvŠ:70Į\ ³š5 ĖĶ“Ėå°LČåņäsy”@ˆ:ÅĀ0 ņ™¦ĆŖź447ć‘Īb’€Gˆ*$ąB±”GW«2µā{wV3O>_Äķ®Ćét@1O”`P hØĒérćtŗpŗœ28›Ų±$B!„U†±ąS,1 ÓMÓŠ4U‚±£I 5tttlw„BģbåwŚØźī}ƜH$0MÓ4ķ@Ē“‡b[š>!v0 x„Ø!lw„Bģbå `7!›Ķ233ƒ®ė(ŠB±X$•Jįńxp:hš V v. x„B!6ŁnÆQUUŃ4 ]×Ńu§Ó‰ÓéÄårIĄ#v“Ż[æ*„B!„ː€G!„B±gIĄ#D{”͵B±åwšĢ~Xx]\|}Üčk¦ā °æ­…:¹KDN%!„BAł}<‹©š†īŲŗ[FMwćrÖ±…«{œ Z Ä&‰=ĒńƒM850ņS<śź&' ›æb݃^Ȱ¦5é<Ŗ§f0Öw›Įéņ„zŽŸ9‚_Ėó°÷k6u3ŹyXš„Az2ĪĄć™U§·Šż”7ņü©#8$oßczł%„bϘu,‹Åõ5ŖęĄ±Eć.SĆ>ČhŖøÉūNģtRY(ĆŅył'oĶ;Ó±Ēܹó˜éR€>~×x6i՝üÅŁv4ФW] RR0˜½,Ōē/Ÿo\ō½‰±Ž|®8±††KŁÓ“F^zūMšV’ĪZöĒģŗ‹äÖŗ…b«ŲĒ4±US(š«w)>r6ŌćT,²¹Š+ȁ}“BŠ‘XŒD*O] …H½Uu )*G‘ŌL†lĮÄį PWJĒh˜MGU؊Ŗ§é7Č u~  ×łq* nÆpxż„ō$ŲRĆ#ĆŅ}‡“õö’Gn]ęß¾ŒšłĶ§üä’y o!ƒg_Ę\¼żć—šŅ̘nĀõrcwøōYŠ×.œcŸO ¦c÷ųżGŸS®Šˆœ¹Ą«§Śš¹t0 łiīž{>\ąµ+ՊxųöOʑžOł·ėŃ›žēiÖyé»ųś· VŚÖj鼇ų«Ÿ¼BPĶqūĆßp{ž’˟p.ā!õōĻüöź=ōȋü×ןC/ŒņŸ’ė ±ŠkĻóĶĒsÆ,Ö’K~r¾“ēŽ×såŽōšöGõeęWēx8óęåŪįFt ¦‡īš»+7f›øÕNĆĆóēæĖ·7ćŅ50 23Ć|łū’ä^©jl=ĒD!6…2÷ĻҘg®Ö§Ėc”į­SžöĪ=øéėNōé'ɒ%Ė–_2˜Xˆ°Į6SbCqMH×Yv¦¤›d›™’M:„¤›{—ŪĪvn—“7Żä†YŚŪŽ2M¶Ķ4ģ@§lø[(…šÄ&vƃĄ ~ą²eɒ~ŅżC²-ėacó™łåŸĪłžļļ{Īłé|ĻÉIš8px!)- ~z»zšČ »{Š%f”KIFŁŒćZ+]®hLäĪ0‘œ¤fĄ ؞^^P%„6Gō)‘d&ŃÖ?HRJ":ŗP‚ Ø“hUR"Č}ō߁™ä‚{1Ā#L!:ĶŠčƒĘ†Ī‘/¼ųż»ļņ›wwrąŲe ¤„téĘ`æ[ā+µ4Ԑ0N›ĒŚÆ>ŠPO{„ÕŹĮF62Hj‰yĖń½~d˜:!Tc"čęņÕ(2ccbłcsĄ5¦‡,š\o$ N02˚d0+ۈZ­Ę4##0cNš9pŃ1m%Ŗ°Į0ǹOh ~NŹL›”=¢Ē!ݲ‘„1»'Ÿ( ʊ!Ć8w9KēN#A ƒ.²$”3fóčWʃiÜržĮm ź&kJCaäAeŠču(Ōząģ NK ųż€Ó“‡xhĘ rr²Š)…2Ōą”ń †ņÜ ßŗä$”š$ōJpöŽ<8šLoŸ“jō­׍ųPcHJĀ OŸ± HĀᦔä“Äą‡Į^ŗĘö*yGßz ;ZŽs°ś(—˜ĄŪĪž·ßęķ=§0Īį ÓŌØTŚżō“žāŻ·Ćļ?j RyČŲĆ>Z˜?Čéƒ{ųCŸ1ē‘¢Ø2#㢵5ųƓ]Ā#sFMe‹.×ESK0®qšµq¦”åLźT¦étĢČ6p½łĀ„6!Ņ!AŸ8){D3:­ö3‡yūķ·ł(4ņ£6Ļc¾Ž˜2¦YRƒ’{{h8ņ'ö>M{{+Īw¢RDzpyĮ]fÜ]Ś‚,Ė@€—$=™©IĄ ½N_(œxh»x‘‹”ėZg7==}”÷·"¬åé§·×j#Ó2“7=欵‰&ÓēķĒ)CRz:Zdśzn0ąCFZdśū§Ž>‚Ļ%bJ›@0…ōßp?ØHóZ§Ęėė rö£z.» qÖdŒ<ņÕÆʐ c†WżIŖ|)“šÕg Ń©G6EWÆ  \7zšzAŅØ£ŹäZäITöŗQ>łWLS«™·¼xŌw±ä^>oĒ;·µq dF4MĄRTD².ųģvŪų“ŁāĮuyāöšĘˆCŲ׃›Kœūō"_Č]ˆ%’:vŗm½­u:Å«ÖRŒŒ«§ {K^H½…<‚ŪG€Į3w Åš¹: …„Č śčŁåĀ‹µZÆ’@\}h }Z*ķ”‰©LK7€ė:}}7§čuō2˜>Mš³g­¢Éģq Š×ļĮ¬ŁÉ€ß‡ßåؤߥšśY@8<Į2Üh–Ņyxt·ē3X½žÆH÷ŗhłģ ‹¤†ą0GpĢGRė0 üøśūA-į1­fmń“`Ƌė×½¤§–ø‰č2#£DåķäP]3Ļ,ĻøÜĪ&:¼…d«Ó)œ ą„½õéŁédĻ›įŗŹł‰ģ‚¦Ī$5äEö^½:){Ä'lsŁ3jJD,=õū9Čr–äbL )›„«’ vžߤóD n3ňÓ3rŪĒćC—8tǃÓ%~(‚ ųœ“õ*1§¤“€ßÓǵ6žD-7Ļ›sq£ßG¦AĮĆwżĄpŲh2\}NüÉü.'~ĄåtA’šĮž~1M0Œpx‚)ÄqńżK§a@bnłtģū3zTU¬$‚gĀxÜхøšłżĪĆø˜FÅ‹z¹ŅåbśœąT)ļõÓ¼»÷L{”ēV ßüzh¦€FŠOf4$5x/ętA…¦±cÉõrńZ?Ł9†PĄ~?±±$;”;Ž–¦˜ÓŁtz#:/صÉ,ųbI(ī ×.÷0ż‘‰ŪcśōŲq‚ØÉš™A}}'Ó¬³†Gėä8dĢ}¤ė“œMÕ¼¢ ŹYYhČĪ1bi;@ ø‹Œs,ūovUz;øD§Ó” ;8m »ę%j•D@ö…¶“œ\¼xsrż-ōwŒ¾ē6¢LO—.ŽŒŒ®sńāõøWš` `*q] ę“•Õ…fH0³|ķ3,’~°•>ėŻōį[C 勧[x4{.črY÷õ \n:“Bė‰ōūŖŌéy¬}bsśpÜąß”±ƒ®}žükGŁõit™ńpģ/Ē™óÕ„„o¦KW»­•å9sƒś;hī¹Č¬ĮGCį¼ŲĻ·÷[8 ®ž*…cīŗZ?ådĢ™„=ŽĘŒ3Bvń_ńõyƒ$čBīNO6XbČš%›I7%€i%k3ÆįŌ¤ i޽ÅĮEĒ­ē‰@ ÜÓüx½S<¾r;d ĦĮsķŲłG/ą3;Éu½™ƒ8ĄčY\^CsŒ½×>ā’mfB`ŁÅ¹ź}|ę€ 'N†üTc2§CO(¦?d×Eε‡-ŠōĒ–™°)]ŽĻ8r¦gų~<ŗx/7Óz6Gė5Ą‹½=tžĪ`Ma›ŲŃ<č¢õL5æ?š09{Č3œ˜‹Lj³#÷·²’æ>ĘGŗēģć\č9 éÓ0€AšāœėVņD ĮdPĀN˜R'l]ŹŠ%….UčR¹5w\[ąšł|üņ—æ¼)jŒ& »{pÄ=[I‡)C >™žc×\M&$ŁMOj£ƒÄ˜øŃeNžŪ%7~&cXq†ŠMh%7==7‡‹)C­ĆdŠ‘ls÷m'n?@€@ 0jMĢēsēĪ‘˜˜HJJ ©©©ĆWrrrhJ›I’>×Ļ(ų|š•Æ|„ h¼€/tɔ˺@ ęäˆ)mĮmƋ£g2;n¹čéŒÜ%ÓėpŒs€et™“ēvɍŸÉŲ#Ž|q9z"®3Š)Ćė×Q “~×m'Įƒ€px@ n3ŸēŃI’Šh4hµZōz=ÉÉɤ„„a2™Šėõ$$$ R©>×Ļ(øækx@ Į}‹px@ Į}‹px@ Į}‹px@ !ųż~dYF–eüž› ®.;Ē|Ą”ź¹ŃßIżI}rģxS…ģī£Ļ¹ž™3gŽ{ß/ūšH*‰įżÖ~”’ ׹­œęÅéÜ’%䙂ĘćĶAy§œ Eš°µLPb½³é ī:Āį¦1"$‚pīE‡g\~üPJaĪ€B‰F-”ROs”Ż}4ŸķąŅ%: ėā%ĢĖI@īkåćOZIÉŅŠŅŅ@fīBŠÖÓpąuøa-eIf5GƳ`Å"RŌąloāŲ @bf6wźœÅĢOé †[¹ˆ š÷Q_u‚¤āGɑ:Ø;z•ŗ»Ȝ·Œ‡5œ>eĆR=3·ˆĀ¼L®}RĖŠT{ē¼e„Ž•¾»ē2Ÿžh ŪČģ…‹°N3"÷µRwōŹĶĻ”7 õÉĮTq×>@ ĮAĮxGéH* ‰ jšŠrķ:ƒś,ę?ÓĄ„†£œnsā—Ż8<Ż““ĄāŅe,ĪĖ¢£ł-} ĢYb +o1łYzü²‹v>—o$œ?¤ˆģ£Ē3€7„7@w·‘“štLę4T^/Ŗ$=šPÉ4œ~’VĀė“>9<ŗ(2{¾Ž6Ī“ńp1ži*¶qÜI„Ć#@š€3ĪĄĪ?^ŸL A ŲJŒ¦$pżŸˆvøe©ĀØ/7CȌŻ%@!©ĄćfDŖžŌD荠Źč†«‘DmŠ RŖŌx®ŸįЉ£ćč%}µ Ćž_IrŖ1LĻ$ų\!@ ‚…~üž’r“ūćd  !%1±Ć,īž>@&0Īvgńģś}€&ģν”j $a(I…"踌h~@‚Žęih‚’2²ŒIØé僵„Ļѓ7ėšśė¹ś@ʤŸIpļ!Öš@ <š(P*ü2²ß?¼Ł‚_–ń@“˜€:A8øŅīĄ+ūčļ¼Hż5Hmžō"~ć“Y@3vG_/MĒŅFŠį‘4:`€‹—:q{\“6~Ź@$A2€D]"’ßÅå³Į°}}nšĒ®w“Ńē=>cȜ“š©­ģÅqķ,'Z!uN–Ų˜ą>BŒš@ P(%$üĮƒGGī¢ÖhŃ©•(Õz²½-œ<ŽN§#sĪbęQÜ`l³R‚ŠT5ڰūĮė‚a„¤‡Ø(ńS[ץ‘0fåJ ŗ$-J½‘ŹW9a;F‡ HĶ"1äņ„Ė0>”GfÓ ŽV‚»½ejčøī€‡ŅČÉŌp¶©ž£ž„¬œ>W2›eE^ŽŌŸąPSPVjīB[Œ(]QžIšyB[x„P(§q*Žž( ę­D0ĒU€Čmll¬¹ćŚ wˆ@ €ĻēćÅ_œP¼ŽŽH³Ž‚‰a¶X «‹öžž»­Š@ øīÅm©'z„‚^Æ'))‰ŌŌT222ČĢHĒ”šFjZ&ÉF= ØT*ćmńēµ³œķN¢h~vpDEīįƒu˜K*Č3§ŗłe/>4šXc.~¼H*ŌŅĶö–e…$?½É/ćńÉ($ jq>Ļ=Ėāŋˀf‚K©|”K]žŠ0'ēŽ©}Įƒˆ¹’×¶mcŪØėM¾’ņ:Ģ€eõ+l{ó,w[ĻIaaŻĘ—©ø%åGd|¾m1,lųį›lټ™-[æ…5ģžķ“Eü2ćĖ×{"æBõėG*FŻ^żņOŲöÓMSö¬‘āLŽSQw¤MP{"ļ÷6 %jµÕ8:ƒŽŽ–z~\OSÓYŽØc€T2ō#ėz”’:g@‰Z£ף"9;ĮDŠh„³sæ"ą.£F¦±ź}væ’>ļæ’>5§ŪČxøŒŸ- ާ~^_¾†"Źņg‘čž"Į®?nEÜēCsM­5;yķµw±…Żæ¶čņŹń•µxóõÉ/%`,ü ĻFnŖ¤©}ÖHq&kƒ©Ø;įLō=ņy~ļ>w(“,”—.&W'ÓŪė$ÅZĄ²Š/¦‰W ˆ±†G øėȓ֢ŗ}č’1’t+³¦™”stČāµYWž­xēuöŪ Tnü6åłYĮvŠģ¤±źwüboPĄ†ś:…Yz-uģxć=ģQåŗ®¹b#ßżr:7ÉÉ҃ĒÉéCļ°c’ ·¬`ՖĮ›?ąź¢H26šŻÕ³p{՘ōpjēæņvm;`%C{ø¤4žł§×‚iÉNNx‡!…ćy–ČśŚ¢Ś0Øć n8µd™tČ®6j_bīc%dHąj;ĶÆ¼ŪlZśō&žŗ$w8\Õļ~ĪŽĪGųį–Uh€ģ²u¬ėŪĘöżÜ[¬Žš*f#įĮį”ĄÓś&’-śĘäė’‚5Ź2łę÷BV†<=Ōģü?ģ:Ž~ŪĖėXdYbÉśońńń7/ųøyѐwa"łƍĄ^{,]ū£—mo˜~?śŁ­’Å~qkå&6.“ųõƒ†”`cöÜ7ĶK‹ųž’üzlcū~;ÖŹ—ŁXžĪm?dæ*7½F)²å­żQŽ7׿ 3Ÿę+_ČE'ĒŁŹ”w^gæķĪ–ĮG›b&/Å|·ÕÜLją@›lƒƒĮ@qå3ĢŅ@÷µĖ£ĀJ7š\y>Žę:vīÜG«2›5_„°®żVågŃvģ ;wī£Ł©'æüq¬@éóOQ˜5»ĆūuĶsJųZ„5Ŗ¼xÓÕŖµčtä$vpšż*Ze=…O`ĮĪ'GĻ##Ó\w„s9ŃdŠiō˜äNš[ģ\ø8䳍–qĮ#ĘPZiqė)|ģ ,1teēˆśF·aPGY\aß¾c8uY”­)ĮsŗŠšÓč² łŅrsÜzXVæĢś’\¼ĶuģŽ]E§:›U/|›āö՜dĪ×UQ{±ė¶ŁĀZ¹‰5…Łtž®b÷ĮsØõ#]ś‘m1ZŽ%‘mœN­'#į ļļ>H‹l¢ģ¹oR|›ĖėX$œ|ų‡\š¾±±ā¦ļ#ęÅŹšńēS¼6®ļŠG×če;\æK]ŒłKCzX¶4©’ꈳÆ}śm\÷H̚_Ą‚ ’d"/ß³ WĻ@ū•ļŃu’Š”’§Jrń¶c÷ī*nč³Yó ĢæƒåE ܟ‡G øĖxŃPöŅV¶mŻŹÖ­[ynU>’§Ś WöČ ‡Ćüˆ®®Fžtø¤lJJ ŠÕȱŗ÷łło÷rńźEšģ= ÉÉZ@yętŚ?śæŚ¹“’زE—oŗxØŚń{ķįß·€&Ųp>~š22MŁĻ¬āxd¼Ī[olé-£[CiķåŻCĶ „cˆGĒpĘ×7š ‡ć½½żūĖ‘øłłŪ{Ųµcm€1%9n=Šę[Ąsžķo½Guõ~¼½ ™,VVj©Žw2öæģåømdƂ©¶Å\k6xĪóė{ØŽ»ƒwė:AŠm‹p=z:ā°ŁöķŖŽĖæ®²°D—«åõfŌČ'w±ėTśü'y¶œ¾‘ż§"ē…e‚exbłƍķa{VDÓuŲŽć•ķ0öWdQR ˜Ė™g„ꦏ"Z/ZYżōœ)ۊ+¹ĮłG™sę€uxhųØ!Ī÷G°īk‹ę‚ÜĀŽ·~Kuõ~µ»ŽóēŪļpy÷#bJ›@p—Q#s¾¦Š nPK޾ĖŌ:N?`ÉéL<łŅęQń“Ó§c«ŗŹ—¾øŽ­ŪžłĀÜ1n’Ž’$ļæż-/YÅĆKV«*ĻEÜQä1jāO”p^ čęrhŹMų¶£čƒ L%-xcŹpŅŽÅĶ„É.*čIK  '- \ĄCs¬¼wšv–×›‘ŅąųŪæcłO_bÉ3Æ@ŪȦ²ńęEŌ2ž~œłT§Ć‰Ŗk”²=ŠćҼ~ s‹+(0 ”“źCöH”£¦Y[ocżĀł¬Øx„ ÉĮéF™Ā™S¹, ¢ ƒńFt»WŠPØxõP¤˜1ż£d ‹©“…”‘=¬ƒV-1t†xL[„ōˆNJb:`ŠjŃ}7X½į…ŪV^#c歝Ēxó¹%,É\Į»ńäEĢ2<±ņ)^‡S×u1ˆź3=ž[œwŽ+V^L¤ O0Ÿāµ±%lVĢrēĪjĒ’r—d$Cg>ŖŠ6zš 4¶øtĪ–sŲlt c;y˜Ųūćœ-öéu„ĢÅ|£r É*¼ŹČ¶ŗÕ÷›@ x0#<Į½Nh¹mĻ/©šń=Ź—<ɖ%Į/Zźv²Ė–SgX‘³õ[·±p“õ@–‘™s üö÷)xak^ŚĀOūöģÅf3D”NŌtgč7V_ģ—étANɓ|±ź’Ru~]ü2øYʟʫ ūnJĢķŽ®c${Žżæ>Š [ĘÄóŽ#BŠa«pvżššģ—)+[Ļ–2ßįP;©Ķ>ŶhŲõoŌäl”¬ü9¶”‡nzbŪ¢śųˆšĻńŁf€6§œ-[˧ޛZnCy5ē2/'‡N[2}Øt’öß3’§Ļ‘²_Ō¼ ¾2<™|jŒÓĘ_s]ęõ=¶˜ŗZ‚¢Ē&5žg{Ÿu®bIr Gj#8”šŃķGO_aUīĆ“œ·ķ4µż­œ<”;‘÷‡mļ/©²|ņ²õl-pP·ó=Ž&>ĮŅŪō~„ĄļŒūM„ŪqćwµÓpö¹EVōžNĪö[d%é¶?—Ż} (õ$iDß½ 6аCHQČŗ””k؏JŗŌ@ncccĶ×V øC|>/¾ųā„āõööĘt«˜-X“į†Ķ>¦igĘbÕā¾j§}œ6ŒŁbA‹»½}ģäśn uĶڇš ·AĒ0Qmæ˜ųō0˜-L×ĀU»=ī~ē©¶EP7¶±å"VyÖ#–Ķ X¬itŁĘ>ćm.Æ$Z^L¦ Ē—OńŚ8~]㣀WŽ|“3»Ł²£:®·œęDņ-öźØ2so•—‰(•÷NĆ<%%eœ»dŸL@”@~7@£I %=¬ō4222ČĢĢ$33“É„^Æ'!!•JE°y3Žė.³tUF§ƒµM,]µ†“xι—#jIYZĮ|q`ĻÅāŋˀf‚}¾Š%‡.č @˜“#`īi‡G &‰uķ+¼Tž8Ł÷Ś–˜k·ĪēĶįQH*”£=$IB›œŠeZę䞎&Ö^”dÕ1©Į/ūQJ·`/ü©–i„aM§ä>HLÖįSځ@ x@øzę§²npķ“Ų„(‚½ą„šŽ~“–³ \ŗd@§3b]\¼œä¾V>žÄNbŖŠ¶¶ąj®ģy%XL£ÄÉ}—©9z+‘¢wĻe>;Ń@‡ ėāÅĢ6'ąøÖÄéS6”ø™¹Eęerķ“Z€¦Ś8ē-c‘ň»ē2Ÿžh ;$göĀEX§‘ūZ©;z•ŗ»Ȝ·Œb‹ń¶›Mpo!@ śm‡x[¬cD# 0ź_?~„„Z„$ »¹ŅŚqśl͟E¢ģĄÖš1’įKX5nŽīl––­@Ł{‰ŗ†:$m9քy~ŁÅ€Ē\¾å¾Ę‘ŗČ“Rš—‰ór=õ'jЬxœér3GNŁHµ.¤lŗĻõĖmØē¢¹˜<Ī=KVŽbę˜õČ;UugŠdåQjMĒÕvS§Žąfł:7Ļtg‘g5£2ʱKą¾ćŽ_f,ęŪt ĮŒ%Ęf]÷cmaĄb±0aó,X­ÖQ»z}žl11Ģ fƒ8Hņ^ĮZŗœ‚ f‡eõĖlŪö#*ā*§ÅüÓ¶m¼ŗ¶`2ź āÄļ—‘å‘ĖļM‚­J‰ĻķDFM–Ł„F©Ä˜5ƒ\jź`čt«¢G‹HKŅcz(Ÿ‚Th¹ŌŽT Į)hJ ·õ"²XZ<›}Ły‹)°Ī#I  Šf²xńRĶž†^„!1I&Og2aō¦t’“޶K@.Ź%EŸÄ“Ł (ȄÖ3m mR“b¹³óxČ$Öü<ˆ‡G ø±¬~…mo¾‚%vŠŪ‘:ė6¾LÅmKÜĢƟlįÅæyä¶H7V²yĖO؜ žį6·T¾Ź¶mÆbgTøÉŲm“- kłŃ¶­l޼™-[ßäå8v˟}•m[7óŅK/±yė66­-Ź›¤-ī},lųį›lټ™-[æ–O#yp;ėŠż]?'Ļ‚•NŸH Sń0žę#Ć»¾Eē85§d—?ĮżčņÄ]®¬kłé¶mlZ}{ RR”R©P©¤įµ<Ćksą„ÅÖČÉS§ųč£ć“øŸoxĆ=Ķš’%əFčŒø§R„ōaåźxh¶…­„R„Ęsż‡öķćOrø¶ah#I‚ŽL (Y”VrŲf J’SƧ­IԊ&Č}ą^D ćŽīv`(¢,‰·)qėŚæ'_×É®_ŗ-ņūkwPÕŖaÕóOO(^—W>¤ėÜqźjŽėˆĀQį&a·Ń¶°²įļĖ1zZŁż³Ÿq¬Męįņgb;+ÅĻņŌ’lœĶ5¼łŚĻØiv’[¾žµ–ÉŪāžĒPÄ\“DkĶN^{ķ]la÷‡óąvÖ”ūø~Nėņ§łįO·Q–e¢ä„m¼ł“WYLjyłr52'ī;­ź?ÅC6WĘźŽ“–Å:ńQÓ;Lų;(••ĖŠŠĘĮżQĪķš(% ŻŽ Óā÷zę°téRV¬XAińBĶĶ­‘=zāģu€6!ācɃnĄęyi=[OS§“ŽęihqSPRĘŖĒÖ°ę±RĀ6FAÉƏ±Ęsõ994=Ļǘa&Į†XĆ#Üe–?½‰Æ|!g+‡ŽyF/ „ńĢ?½FN–d'§¼ĆŽż6Ą@åĘoSžŸ|½ĖN«~Ē/ö6`®ŲĄwWĻĀķUcŅĆ©’Ęõ7nŲńÓžf~c«¶üŽüWmd]y>:@v¶rą×Łocœ“v#­ük ³ō8ZźŲńĘ{ŒžI.`my6Žcæ īn`ݦļQšk żT¹h®ūOŽzÆ6†Õ,lüŃwČׇ¶f‘=€›CŪČ~;ģŁó å/•šlĮ{ü¶!²”Õ^å±Āl$<8œx‚§Ēč͹·vO| 'ÓÖÜJR–ŽC’ū_hgį™-įvūĢ_’śÄlQü¹hŁ÷ļTŪ“'łK Ųkü–Œ4ĄCķ{»°·ƒ}LJo]Ćģ" ŲķqŪ¢ōéMüuIīp>Wżīēģmč'Ÿ’•·k‡ŗć£•ō|÷ĖétŽH –a“Ó‡ŽaĒžA6žč;d·ž?9½ÖŹMl\&ńė’ž ±tź|„nY…Č.[Ēŗ¾mlß*ay =Ü„AńŚńĖõX¬ś9¬¬}Ŗmó1Néf#5T3hy8®˜‹ŠgƒÜŹń(åņ&ģG9ē\żü¹°7ŽÅHž~óKHU?ćĒ{nǦčõ`ÓŖ4:zu̜žV‚zDzEļše9:ė0³M’¤| ø}¤%éaŠÉµ¶˜SSč½BżŁ+H³Kx,ĄCżgĶ”ĢŸÜÕÄ©6Č^˜‰2B÷‘1k&4įS[:‹f§ā¼ŚH}s+yÓē‡Īh2ØKDņ»ølū” ÆĻ ś ÷r½£Lm&†ĢŠd–ćīhāD+¤ĪĖBMē±”ąŽFŒšwóņ _ø82÷(zYŌ¢Óe„Źp­²žĀŠ'°`ēR—cžŅŠ“$Ė–ę"õ_Հ‹ØS{‡jĪ2ēėŖØ½ŲŠ1:.x"×!CiärĪW?'ƒĮLŠŻt’k®A®=Äo·’‚ź˜SŌ d¤hŪš˜˜ ŅĪ•RĘģ L)ģĀ#ƒĒ}cB)ÅĖäźAōwP$*Ö­@G'‡Ž;3ģ””P¢‘ų *ÉĪLašśe>=q‚cõŃeZYńpźHųī³|xč GN5“9{1ó§é67ƒ}ģĮķ¹ƒŸ%£…²…¹t7ąŠƒŌ5“’=Æ‹QĀųP™tp“ź:x˜‹n™čøīµžœL ŻMõ½ä@2›eE#rŽœj&5w!‹-ĘQé \D ī"K—ι…oż;`CĒŗ9ż€©Śń{ķ`f6[žL!Ēķ]«;ĪŽ;„Žb%ŻŽCī<–ź”jĒė챃uy%¦a#„żŁA/r¹…¦æģgÖÓ?z8üĒčžtx&/¬É§¤ŌĄŸĒ¤µzÓO óĢé4~ų~ui:}§G7e,¹Ó™ž¾”;vvüĖæP°¼’üü‡šö<4ĒJĮŒbŹf&ßl“ĮVžšö^ķ§`ĆųI“Öü.l›Ż«t8 ۘŃös­Łą9ĻÆwģ”č1|Ÿ¾jpxGĀͲfƒ«‘·~±‡~ Ez•ĶåĮĪǰpĒ^`}ČnŅÓ+'n Æ x‘­ćo œŽłTżV `õӑmńI;2¹,{ęYšwŸdŃ×Cø†Nō‹m‹¢łšœgū[ļŃT·Ą››ĖYYia·Āóyq•Å`>ŖžĶ–5AūīÆžŒ5¹K()…†‹åĢ3BóūÅ©“–7ö]ąÉ2 öæģåxXĆ:<ŗå©å?2‡Håŗ”väTĖ­~NŠžjź[Ÿ¤lÕ dŽon‚š?²§:–ģédAī‹“ŗ#R\Sæ *Ÿēqk2²,‘%%ĻĖy2 īŽżÅ®q"Z׎Ž;žį„ńÖƒĖŹQõ ź;h< ¬|Xćō>bO’jüf”¤Ń’””„N„@£7‘73Sj©ié$“HPķZm¤xå2Œ~²Rƒ:ō8RJ.kք:oŌaŸ¤iy¬1?ŒĒ'£PiPuÅėĢÆyÆĒ’ µ¤ІćåW#Ė(¤`"Ęģ<ÖL ɑFŅĘ8:=Įƒ‰px‚»ČĄ  ކśØŪ«ßc{upń*tr9ŌĄŌŖō¤„AõÉ«|é‹ėŲŗķÉAž”O%ĄI{H -JŲHic® JŅ‚?`āɗ6Ņ;9}:xG§µĒ’÷ßž–‡—¬āį%«ĄÕF•ē"öš© “sC gC)Æžóz²5ąr:š†–®Ź2˜¦Ķdöģd¼²?l(Z nFø<ĶwÖ<Œ«ł Æļ čējƇEšč)¹mäōõĪ×øØi)&¼ ¬Ž°žü /ĒöķäÚZ(•Ķåa/x¹«”Öy“°‘ŅŽ÷›`+NvƒZRƒÜĢĻ6æÅUōSĄŚŹ|ŗĪ]…Y£Ó²&söŪyėb«W”°¢¬„ģ9¾gD75@s-`³ƒ„üQ²5j~öģ²¬ę§ŪÖPżö‰ś³nXĪ÷_(Aź9Ķ’~kļŲ/ÉIÓ@ßø1‡‘2²1„ž_«–Æ!u­×ĆĀĢĆįFŗ ĒGvOĪ]W;ÉAC';_߆ÕdIŠŁŅLõ®½Qmaļ jß3`0ōÓÆÆä'[VŃueh-@l[ØRĢ#ĻČP»+ŌG–ĻįÄ.‹7—įĘTŸéį¹Ā•¬aÄÓr±tbźyhjc„:µ\‡ńĄÕĻ[ ”z3Š­|¶ćߙłĻ[°Zē@ŌU&żtözr‚SÓā_KdfF¦¹ķRĢ8µļ½ 1°éĶ­H‡·óFŒÓVc¾wĘaņõ ¾wPR_hÄuž}Sļ$]ÖŁ‰ˆĶŠ÷"¢X w‘s¶6ryz])s1ߨ\BF²Š2ćöōI µ·ūøPSK×ĢJž-Ļ)‰CX ŃĀFJūŗB4XæTAĒ„`˜µĻV ĒĀÓßz†ņ’2²†š aiĶ[¹†5ėŸgur'ū?<j_žń¶7nPŗ{€†“Y`(ąłļ?Fä¾¼p <’½§ČĄE͟>$¹ ˜āāF6†J#YnG/ŠŁšŹ+¬+½mTsK7čņłĘŚbĢ– ¾¶"DK‘‚;Žįī"¶½æ¤Źņ=ŹĖÖ³µ ĄAŻĪ÷čN~fœ¶ˆŒŪ §Ī°"g!ė·nc=ąhė,#3ēh ¦>JŲźiŪķ3čtANɓ|±ź’Ru~åKždĖ’ š–ŗģ²eÖč“öüž /¬bĶK[Xąicߞ1#/—:p¢” “óX{u Vņ×¼Ą¶5ē²²7V/~ÉZeė_¢ U×’1øĪÄRD¶­ēm _ʼœŚlÉ6æa׿Q“³…²ņēŲRŗ94[Ķ;ņlöżŪŁń*O-YÅs eœNō7h·ła6°_¶›tō#:MNČ`ć—»źŲ²¾„ē¶n „ę7ij©”Łŗ„Ā%KB’9ØŪł^Š—-~MMöĖ”•­gKYŠßįP;Į…įŚÅŃŹ×Ų²ČŲ’ķU|Ö¹Š%É-©½¹Ė:šNDj£†åĮźĘ« ūĘÖ!Ūž_R5ć{ć–ėpøś żōqĖĪ+Ų;aњ'ƒķśŒ­§ųݻՠÆ?NˆöChłŹK?VĮ.Ū”čé„(}b):Ś8>].F°óĒ»į¢mqā·ĮdėAŌwŠ( Ø(ÉĄÓr½·>Q x Q‘‚'K ]ŹŠ5ŌO¦ ]j ·±±±ęŽk+Ü!>Ÿ_|qBńz{{c³k2\µŁ‰o¶‚‹U‹ūŖö˜b„¶Łl }(B(Ģ ›=fÓĄl± ÅŻ>~Čå_橣Wyķ·Ė2[­$ŽĄ!ĪDY¾į5žš×Į››ßĀ:ÜÓT7ž–“³…éZwÄ“—?’O<–q‰ķÆĻ—>’#Ö/ģåĶļ¼1ī”šp»MĘĢXgf@g¶ ˜Ćl±’œWm¶Qł8q[ĄU{¼å&VĆ)ą•7_ ķĢn¶ģˆ<‰h2:*»QĘY®ˆśi¦ x ā]?w…5ߏ\vÖ¾ś}t{ž…÷†æŽ^Ž,•›Ų¼*÷’ĒBSµ¢Å)åūŪÖ#×üŠZ³;›™ź8‘ó1B»…ŻL¬wuķ«¼TžEÕĻ6ĒÕ))) Æ×ėIJJ"55•ŒŒ 233ÉĢĢÄd2”×ėIHH@„RP*Ü&/^\4ģšō….9tłCWœ1Ā#Ü “Ū'Ōø…vģq’šÅ!ķQ Ę č×n>³¾śŻ}¬ŁśϬ¶šFčą¼v›-Ž>ÖŲ*XSاyß‚‰ĮŠŖó揊Rčo·GŻ÷äŁ6žZXĀ–ŸĪ£Ē«Ē¤—č9}8āśp»MĘō·ck˜ø5ŚķćŲpŠm!å ”Å ÖµÆšRyądߎč+&&£S\ĪÄ_®„śi)å›Ļ•Gœ…ŲśįŸˆRvÜŻ½Čჳ1Ź€}ļ[|go¼qjł—ļŒ³?YéÜž8ÆCÄ*涃’Ī›µN¦Ø?H x #<Į8Üńž KÅÓ|9õ;vMżęŖęāµ<1«‹·wMŻNFęā [ō0zi=w„½1·ÜŸĻ›-¦ƒµ‚u_ŹåŚ'{Ł?»„ ¦fKøŻ7}£ÕB—½}£~‚pbšÜ ďąóŹdGx„Ć#Œƒpx@0‡G ˜:&ėšÜ;µO @pW ųżČ²¼ü~ĀśÅƒßĖÜr`üČcŻ}ōyü·AK`b‡G x€°¬~…mo¾‚eĢ组ƒ@ īü²ŁļĮŃæYöįõ‡œ€—«-­t»ćpbä^źŖjhé»[¢@pē›jFĪ„’|éņŹ0©ÓՁ@pū€R’PMMS*šūd|^™Ąp(”qL]Sē©Åū^p ą®b rć·)ĻĻ ś²“ĘŖßń‹½ ˜+6šŻÕ³p{՘ōpjēæRož֕ē£dg+Žyż7­Ÿ,oX0ļčX„OoāÆKr‡eWżīē콓ˆļ’Ļæ”÷Ą6¶ļ·c­|™åéŲöCöŪ”rÓk”ņ![ŽŚOńŚu[½įU+ĢFƒĆ)§åvS SŠ…¤D%)?=Żų5z:›ĪpA›ÄL&śŚ/q¢ńżJ% …‚ĢÜ" ó2¹öI-@Sķœó–Q”zƒš£×Y°r)ąļ£¾źIŏ’›×lõœjź@cĢaaq>iZ1I05ˆ’$ÜE¬k’UłY“;ČĪūhvźÉ/+ UŠiō˜äNš[ģ\JØä¹ņ|¼ĶuģܹVe6k6¾JĮdF²śe֗äām®c÷ī*:ÕŁ¬zįŪ÷Ūøī‘˜5æ€$ÉD^¾(fA®žö+J7DŌĶZ¹‰5…Łtž®b÷ĮsØÅ1܁@p¢@”æ,ć“eü~?@…B‰Z„D’ƒ€ä¬¦›“Čż-mhBõšŹV®`iA.Ķõ\ģ 9'€¬¼ÅĢ1ėńĖ.<䔣p²ĻŽ@gk§šś)*]Įʲ%¤:Z8z¤ylæœ@0i„Ć#ÜMŗ9V÷>?’ķ^.^½H“½€‘£,|”5<’ZƒŠč $j$ i-fĮ¬,ō* ‰Iz4—:“ # 7„“¤Śš7¬įÖõū<€¾żųTÉĢ_¹‚ĖrPß”ēÜ’ˆ)mĮ]Ävņ*_śā:¶n{rä¦ghkk pŅŽ5ō…0ńäK›GÉHNŸaĒÖE—9>^€Ī°SŚŻ2Ø­·±~į|VTwéķų䃃(•Jōędjčøī€‡ŅČÉŌp¶©ž£ž„TäMgqīUNŲŽŃaR³H ¹<)³3»ē( µ‡i@ĆģÅ%˜ÄōgĮ”„”«N¾ŗ””kh„™*t©ÜĘĘƚ;®­@p‡ų|>^|ńÅ Åėķ¾Vf|ĢX¬ZÜWķ“÷ĒŁ‚5nŲģQ\„ Ź a0[˜®…«v;ˆ—nAŁnlvįŲ‚‡@h“Dy W¤¤¤L(¼^Æ'))‰ŌŌT222HOO'3+‹4“ ½^‡R!”JŠ¢QŻģ”ȲŒB’†§łe/>4š›ēŖÉ^r@J£Sć²xńā2 ™ąņc_č’C—?t€@ ĢÉ#<Į]§ūMgéD nĒÓg˜ Ģżķv&-,ŁČŗŻ²l@ Ü(•Ź0‡D‰Z£ Õs3Ҙ]9•’M„‘I­{Śn @ ÷-Āį@ ÷-Āį@ ÷-Āį@ ÷-Āį@ ÷-Āį@ ÷-Āį@ ÷-Āį@ xĄńūżųĆ£Gözpyä‰ÉsuRŅF_(š«ĖĪń#pčƒz%Ón«ĒÖīœPśćJr÷ŃēńĒ ēwµėžy"ņĒ>æąī"@ ‚EĄ_Ēį šųdP(&$O씵­‰`ūߍżŌ:ÜZ2ŅõLL’ŸžĖ­\īńL(ÖĶ õRWUCKŸ/vP÷ ZŪ.ćńž<ł£Ÿ_p·QŻm@ w…R ²@‰2Ģ# ü€jb}äź+?6„ąÅéÜ’%䙤‰+§‚ &3 šj)Žō  Ž „ž€üŃĻ/øŪ‡G ąAG”@ °Ńœ…Z…ŗå÷8i9ŪĄ„Kt:#ÖÅ%ĢĖI@īkåćOšP »{€ōY³øādAŁlš’r„€ŗܰ.%«÷WōE,ĖĖ ķć³ź£Øē-Ú”Ŗ¦Ü×JŻŃ+¤dihii 3w!EyÓPć嚭žSMhŒ9,,Ī'M+c’¤– ©öĪyĖXd1āøÖÄéS6!Ł™¹EęeG?N&×ĘČ/J½AĶŃė,X±ˆ5ø{.ó鉺=‰Ģ^øė4cŒēLbJ›@ Į…RAĄ`xb[ €PKĮęb@vs„µ·>‹łEEĢJåRĆǜėv旯8<twɳ撔“š8•zę,±•·˜ü,#¦tŽf=”õ-žžVZ 9)ŗ³„Ņ馄—.cq^ͧhéõālmąTS?E„+XY¶„TG G4ćEM朼aę˜õȎ&Žœ²”².¤lå –äŅŃ\ĻÅ(Sē"Ē Ü$ß/»‚ĻČ;Uu ō§ęQŗ¢Œ…V#M§ŽPĶõyS‡į@ §µłe% Eh:›B9<ŗćs;‘1e6”Q*1fĢ §«‡KMĢɆ)Z±€l½oo€‰¤“4Œ€Ž”ŽQ/z‰gŽq¹Ć…iZķš!³€ƒ;£Xørf’GÖŁ6¼~ŸšŃw£c¦‰’ĻŽĒyfž’¾Wßŗ` H Hˆ¤HÉ¢4 %‘”l„”M)k²vRIJ){b%Ž$•T¼ÉNƳU³“­¤fŸŖÉī÷w¼oSD?ż;Ž{?F·ĄœDb”u! ĻLqčPœDs#v©„]%Ąź#Fhå2į+ź/å+sŁL`f¤hē‘ū; ń®ū(§G8yj„=¬|>²qxDDDD00 š|æņ«¦µ(ų%.ōœfr(F8&`…ŹøX@=‘Š2‘Į÷)ų.`A ‘Ż)xēüūšbōLB×įęk˜v!“š Ö¦>% ī®ū8ł)'O ļ@€ö‡Ų·3yELŪ”8~ŠN¼±īVW-så9.b86ą.š*gҐ¬‡ōźē#GGDDDD0MĻõ𠿀xe ŻŠžJ‘H$0JyJN6“@<®ü¼æ\+¤vuĆėēč9£Hm‰Ąu÷y~ēēŅ\ŽHŪ}üā=¹ŁĘ.œāŌÉwhiyŒĘjš²ŒJēŅ}?āä8pų-õu8¤yéł×VŻn=eęė_Ģ/•¹ņ¢äfg€mųĖ\,ķd½ń“†GDDDD* ×õ0LsÉ~+ꙦP.“MšŚOŽę­K„kÜjœÄvŚ)rap’śīv¢Šõ¹Įwxćµć\L D¢DB6`cšT†«€ń±fó„jŖˆ G°¼Ļü”,0;›_¹ÕŹ\Y’"±Ōą?ķ„薘>ƉAHīnŃĘ[D#<""""Re`š®ę£¦„­Į&3~‘Ÿž˜"Ó°ć‡÷$1ós,žXišę¢?\½<'ĢĪż).œJ³k{żŚŻ²–«÷ņKļ:D×Ōœ|ķEN ėŠa`EiO8ÓūoxńĮ»ö’ź=Į?x€HŖT ĖŲų Ō-nćņļėw®Rfg撶ß~¹œļāŃ{Kē/ōVjMv~€CwÕcĪL¬x>²q Ń¢(Ć0 `žaVVõaWŠyśōéW·¼·"[Ä÷}Źå2Ļ>ūģ5•K§Ók$""w ß÷ń}æśAżÖĒÆéųh4J]]Éd’mŪ¶‘ŚÖD"ŁH²±‰†ś:‚Į ¶mc\ćĶIGßy³»ųłG;7t¤Ć-q};ą\5•Éu] ĖŖ>ļQ*–Į²v¢[Ūźe–ÖeQ—bŁÅ°8ŗ?Ļu9t芠Ź2§rõįV^õ᾿(äh„GDdƒ–ƒˆ`F˜†„É ²~¾[Ā+fńꦚŠY|WĖ–åe˜8Žƒ½ī°”;s‘×|’™"t>Ō¶įÓŗ,'°ā2"kɍGMœĄµ®Z½ŒµŚMM‹@@IēfPąنå`EŲńVœDv4a+šČśłåå¹)JSƒ”ÓĆøŁ)…©MV€ŗxŠm©]ģn¼žĶ DÖKGDd˜vb;‘»>€Ó؁iøŁ]’ې›¦4ŃOög~¹€››¾Ł]ŁpV“™{h¾ŁŻ;ˆˆČ0£ œųvœĘ:;;p(¦p³»%·‘Aźwó꛱LįfÓ <""@GDd˜v4iĄ”ĢĻķŻAGüÖY¤,·¾ž“ĒłÉ"V¤»ŗLDDnœČ-,~čć<óXū’ē¼RŃóoņõ\߯”›ļżyŽģ˜ä›’xbõćś8æöh;ŁĮć|éėæóōFˆśĻ<Ö ^š¾ōUŽÉń‡ųō3+\ąæ’õ7ŻŅ];ĆrÖģ„)Š7Ł×¤Å©rmŅŁŹ.W†ķhÓ ‘ ¢ÆEnaA»ś¹”abb‚ōtœ ­w?ʧ?vhķ Bńń'ŅZæžļ6¬E’ŻZA»ŗhՌsģcG矬ģÜc*4ˆˆˆČõӏČm 0öSž[uŌ%“’—ųŌ/ÜM¬ó_šHü?LĒyüW…­q¼R–“?ą›/Nó‘_{ˆ @óĆüī3-|ó«/³oŁc{Ś ¦īć·ēa"čćł’öśX©uó‘_}ŒĪĘ&P*LsöÕēųŽ;•1™żœĒļk'hB)3ĢæóuN¬2\ć“ā#ū_į;ē«O,Ü}må>Ä}„_;ŗƒĢš8vŖ•ŅĪpŃmęžĪFLÆĄ…’Ģ7_éY£OĶ|䙏Ón š?æņ[~TIDDDÖ¦‘ہył»‰ü©Ÿ0\°°‚ŠłųGøæ-ŽC–‰‰ip"“ߘnĄ“nMc›l[åŲNŒ:fÉz&‘Ę.žśõĒWmc’‡ŽŠÕƒĢ†§q‚ ģā—č¦2%ļīo'h–˜žĪāÄZyģ_~‚¶ÕO–®Ē?Ns(»čŁÕś“CĶ mm„ y_śŅWųŅ×ߢ8‰ž*åb±P„ i‘æ@oļ»|ļ’@н»RqśŌ÷łŹW¾Eļ“N3÷ķ-{>™ ļŅ7ķA°_z¢óņąĪŖēył˜ŅÄ[üõ—æÄ+‰ō©ļšå/’w €™dWóZ}å•śß{īEoą}‘[‡¾Ä¹ķŲ8ÕÆ*, Mœ=ū÷’ŠäĮEG¹ÕcĢźŃźĒVä§GČLO’œR‘•Ėõœģįž¶ƒD"Ü}°€ö¦¹Æ¼HKCeŃu|’/šū/—K46Ā2‘±&łÖ÷ĪšÆu?ńö„›5¬§ļ^¾@Ł«<;7›‚ ĒøÄ×ģÓ`Ļ)…‘¢‘ہW^ųmŪ#Ņźä™ž†GŽ>H*␹š#žß’ō-†—½1{„üzŽ Õ'«æ‰(Ķ{`årĮÜŽ}÷ļ¾õ½ƒ•Q”†ķģhN3>[90żžq¾ńēųŃ©÷é=õ.ļžŸXž<Ķ ~c‹ī_SżWj]ēi.’ĒĖŪ¬£O””Šņ#P"""rūяČm Ųśæū;÷ƒ"XŽ™~’uŽÉĆ#ÕcL'Ī‘Ż] CÕ1`å§ł!~ūלwW9v¾žųA~ēדd")‚€77NžäŠåųł§ø;…±^Žģ§µ­§śźųTZƒŌwģå>ęčø» %fNžóŖēūŹsƳ÷™Ēˆ-óŚj}_‹Œ®Ś§f~õSæFƒ|ć‹ßŠHˆÜ1<Ļ[ńµr¹L”P ›Ķ233ƒeYxžG6›%ć8–eaĘöXn7» €Č-­P^H(#•©Xó÷įłÖ?žąŌ©~>Šz7‘Ö»9H‰lĮ#ŒŠzW3¼1ĪdZƒ M śŠĻžŽķ­†‡l:“j#Pć•ųgĪ·Vlć›ß9Nāc“Juńh Ąc¢÷M~8 |ļŲŽš/¹æ­‘»ļn<†ßż>/®pžó?oÓ'xéŻ}śÕ-ļ­Čń}Ÿr¹Ģ³Ļ>{MåŅéō&õh-qšŪ‚LŽVÖß\łjs3L’ĪÆ},”8mAo̼vQę&ęŪY\]3Q˜åĘ®Š:ś¾N×§j};ļ#Ņq?”÷q 9ĄGļэG嚜wy{ØĄ?žųł‹?%Ū’ł‹?½ŁŻ’äū>¾ļÆ(¶Z<æ¦ć£Ń(uuu$“I¶mŪF*•Rą‘›āŠ”CG€> Då»É2•ļ5]*_›z€ųž¢£‘šft•łWéŃÅĮeõcȧ¼ź˜µŪX)8äÓ£ nH\Gß×ićś$"""·²[ēė‘ ¦Ą#"""""5KGDDDDDj–ˆˆˆˆˆŌ,mZ "²|·„_®ÜŌ4GžōŹ÷“YNŚc2_ŁTČ/—šŻeļ",""×HGDdxÅ,å¹)Üģ4%œŸ,’Īj‹VYæÉ¼OĮ5p³Ó”ē¦šŠŁ›Ż%‘š Ą#"²¼¹)Jé!JżōF§nv—ä6äf§)MōSJįĶéČFPąŁ^1Kyjˆ¬ļćLaG¶s³»%·æ\¢<7EijrzX#<""DGDdųn 7;…_.ąę¦1 KGÖĻwKxÅ,^u:›Öšˆˆl ‘ ā»%ÜÜ4nnśfwED䚳¾æģóŽņOƟW`blвqy]£iŁĆ1ź¢A6kµ£_šet¼@¢¹‰ ö%¾£)šˆˆˆˆÜń|š}–Ė6+”õWķ’Ķēq ÓØ“åy>s™Y¦f““·ŌoJčńJņ…9Ź~ĮMØ_n <""""‚¦yUų°ĢŒ#F„īXŖ¦°Um¬ÄŌČÓłI¦ņQ’!ėĘŚX¶]06mIn <""""²&Ļ-‘™™Į²,<p"D£Q¼Ā 3XŽA©ähha{"tu‹GŠ ‡DK3łŸÉH†"øłFG')ś±d Mõ6SCdƒŪhkŒT;’cųāĮTɰ½B¹«ĒtJŁ4c—Ņ”|“X2ES}Æ0ĶąČ vĄ¤Pج 5¤hND0`Åś+å¦1mŖē"ꦙĢ+§h…ijIu Ąejh€\(ÅödxcŽY7Ķh‘ŹHˆļć/yT^ó½2łB Ļ Pߊ@]Ä";=ĪŲlß+ćś„’C}]”Hpß§A ¼l·4ĆĄČ$å@=-­­4ÕÉLsiĪ#4)ͦ)TūRŹLSš ‚Žæb¹„›~xł)ĒŅ”õ4·¶’¬sČLŽ02SØöß„P“ŲÖŚJ*&?=ĘŲliÕśÆ<ļ`9Ķd¦L¢¹•¶Ö&nŽKC“øÕ>˜¦y££er]xDDDDąŠ°ć3æŖĒs]Ą" įŲ6Ńś$uŅsxÕ²‰Ö’ŪˆGÖ?ČØ~ĶĶLćc’HÖc›&į†QęŅ‚õq ŠĢdĖ€ĖL:Į8Qņ«”[¼ņ(Ÿ™ĀloM©ol!€üTęr’·· ‰ÄSÄČĶdVķ×|żóē³}Ą§˜/ā™!¶µµŅŗ=Ne²žECK-ńeF¾dÓiJ›ˆˆˆˆTÖš&Ę2ƒ†aTXx†`Ą¤<Ÿ°pœk½š\Ą2±L (21o·PĀ©OŃŃlQ*äɤ'˜N“­k'ŗ {2ČśiJ›ˆˆˆˆ¬Ź“,Ą%›+āłŹ4é"ŲuQÖóYފŁYę22³³LMŒpadŃŲ$‹Ę/ĶPr] s“ 3‘-cv“žł‚G gž¶Ī«•[,9ĘĘg){.ł™KLäĮ©Uūļ3qi’B¹ņŚdB 1B묠8;Ī„Ń!Ņ9Ė ąŲ&`TGĢ<2£LĢ®ēņĖ ŅˆˆˆČĻĄXeˆĘ0m‚Ž…WŹ359~‚dó6Rń †ļråɕL 8;Å„ŁĖķĀ 46%@(IkŅcdr’Į¹ÉJ™`­MŃźńAźņ3 ±Ė;°Y«•Ėśe…iIxŒLM0™Ą‰&iI„ 7W©¬8ĆšĄ X#©z“•ė7 —ė'›‰FH’®žc¬±…ˆ ąSČäČDėh¬[õRÉ&Pą sõ‰?–¤¾¾ŽD"Į¶T MÉŹčˆJŠŃa/»ö3B[Gǚķ뛸«.IŁõ0LėŖū’„“mt$Æ”\8IĒ¢”†mtŌ7V³±Ŗ§[ŁEĶ"µs'!æŒg\~mÕśCKėĒ ŅŌvI·ŒēX¶µ(Y4ŽÕAćšWA6ƒˆˆˆˆ¬“išKĮĘVobŪ×QłzĖ-wœļž†e/?EļśeZ¶ÖŒÜbō~ˆl ŪÖw""rėŅĻ©«™N„ŗX¶¶R«Y <"(ÖŻ“EDäÖ„ŸSW3œMq‚śT\³ō֊l ˲ƒÕķ;EDDn ¾ļ ±,ķ,wkŠl°łoĻ m=)""·†P(¤Ń¹c)šˆl‚p8L  —ĖQ._½W戈ČV°m›p8¬‘ėą–Jx¦‰£kwŪSąŁ$–e‹Ånv7DDä&ņ}ß÷1×ŲņYV×ūŅ?ѓ]ī•żüc4:˽¶š—~6@p{'õW”ĶMōńĘgøÜ\’{=DŪ•^YćŌžłuxā÷X„~Łz <""""rKk;ō(¾YšäĒoœbہ‡čŒ;ø®Aōz`¼ ož:ĻįKŸ/MšĘgØßū µ6`ų.?Į;ĒHäÉĒH¬Ņ–ŻĪ”«®WŖ_n ¹„…źź x.”źŸėź.ä&~ʉ7N1’^{å y`nš4'/ĄƒGēŃC݌õž wŹ'µ{/tź"¶hŌʬk¢3'’3/żč-z6H:¤ėžnĆž[ ;YŗÜ¶[Zų³WĪ19’œ%õG +÷O¶†ˆˆˆˆÜ¶fF.-ģŁ™Äq¢“ß³Š}\šó(å³@žL&O ŁĪ£«!@8‘ĄĘ&ŁĒYņi8ĢŽĒžąĮż]„ņ“ōœz‡×^~~ŅW (WޜŌXž÷‹ėĻŽ®Ü?ŁšŅ&""""·1įų #KžĶĖģģüŻé79óöėœØoē”C{i TFˆ<X4ĀćsĢ ¶ŻÕͶ»ŗńÜ"SCgyćäś'ŚčZļz!’rżÖ*ż#Ŗym[AGDDDDn[¾›‡@7O<хķIž‰K³¢6Å\–ƽš‹pIO^āż7OņöĻZxbOeXēŹĶóf.¾Įk=õ<ž‹÷L+@ćνt÷\`<“‡z… u¾Ēj¦LsõžÉÖŠ”6¹mE[”ŲĆłį|JŒžū oœx“<&³żÆńŚĖ'I»ńdœŹĶ"ĢźŠN–Kć3”Ķ,«oŁŒšāz˜˜™#77Ć`Ļ›ō!•ˆbZŠG’„9Jł4§_ļƒHuŲĒ_Ō©Eõ+÷O¶†¢„ˆˆˆˆÜ&ŒŹnm‹wóŠŽ9Žxū8}•gč:tŒm`ĻaŚĘ_ēµłéd‘vŽ•'Gs=ōž8Ž÷Šģm¬L-3£;yüĮ2'Ž<ĆĒ{ē[ óŽG鬷€6ö·œēŌ›/Ó D"Kŗó3ԜȢś?“r’dKž¢]. Ć0ؼ]•Ń“ŹĢF‹J8²č<}śō«[Ž[‘-āū>år™gŸ}öfwEDDncµpćŃh4J]]Éd’mŪ¶‘J„H„R$ ¢Ń(Į`Ū¶©|Œ¼‰ÜE¬€Ć•KmÜR ĒYśŠėzXÖņļM„ XŽsÕXLå5 ĒYż}]R’*ż“õ9t芠(åźĆ­>¼źĆ|QČяˆˆˆˆÜž,‡Ą IĀr–+…ÕʬõڊõÆŅ?Ł\·ļ× """"""kŠˆˆČ"–eŃÕÕEWWmmmD",K_Ė.ęŗ.Łl–ĮĮAz{{éķķÅuŻ «æ–ŽƒĶ˜Ņ¶Ł×_¤Ö(šˆˆˆTuuuńŲc177G__ļ½÷Łl–r¹|³»vK±m›H$BKK ÷ß?GŽį„—^¢··wķĀkص÷`3Ļf^‘Z¤Ą#""w<Ć08r䯯Ż?~œ‘‘‘µ ŻĮŹå2333ĢĢĢŠÓÓCKK ?ž8Ū·oēÕW_eń†Hė„÷`ż6涋Ō2­į‘;Ž‘#GŲ±cßżīwõAū:ŒŒŒšŻļ~—;vpäȑėŖCļĮõۈė/RĖxDDäŽÖÕÕEww7/¼šÅbńfwē¶U,yį…čī«ėšŹź=øq7rżEjˆˆÜ±,Ėā±Ēćųńć›’A;ŅJww7ŻŻŻt“¶Y»Äm§X,rüųq{ģ±uo2°„ļA¢•īƒŻtwwКø9ļĄĮ§žį3Ÿ8ŗ)u_Ļõ¹h ˆˆÜ±ŗŗŗ˜››Ūä)T<żŁßäčžĘ+žĻšÜ_üĻobÓ7ĮČČssstuuŃÓÓ³ęń[õ|āžįįń„OēNóŸū¶ņ-hŻs}t|żś7”žk½ž"w¹cuuuŃ××·‰-“ņé’ˆn†·_~‰se›ļāīż”óŻ^‚gžüßšĘßž?žŒļg7ŗžõéė뻦Ą³5ļĖéü’ćłw !Eēī{ø§­Ä†æk(—]pó6±k¹žėa†a`Y¶m¼ū~ IDATƒAB””PŪ¶1 cCŚŁh <""rĒjkkć½÷ŽŪ“śG?Z ;dxī/—Ķ9śĢŸņ+ū£\č¹HāĄ>ģ³ßęϾų}Z?ͧ?öa Ü'’æÆšåē{ rˆĻüŃĒénŒan1Ķ»’ōU¾śż~Ž~ść㣒į/éžöäo¾?͇žł]~ń; ÅĢE¾óÅæā•MÖįŽ{ļ]×±›žžeÄ`ōµÆņ7ßz·ņd¶Ÿ©į~NT9ų±Ļņ›ÜC€§Ÿ’ ó\ŠŹ§’Żæ&ųÖ+”ļ‚}q‹bś,÷…/rb  ƒOüžoņpguō.sšæų³ŹˆŃŃßų#~åĮ˜¾ĻxĻ÷ųżOlUž¼–ė/r'йcE"²ŁĶūz’=;(^üįŠSלh+£óĄ>ā®K¹ t|Œ?üäQĆ9Næł6n˜Oż6O¶ MģŒCĻ›ÆšŹŪ!ēæü4Ż@zhŒłU0éŃAFŅyżĘńŃģÄJ÷ńęÉ!±<żŁgHlŚYC6›%Yß™Ķ~¶µ4EŽ|鯏‰ÖŁüģµēųÆ’õļ9› ³ļń'i­¾fĆģłą“teOóƒ×śÄ÷š”G:€ŸųÓ’‡;zūy¾öwßę•÷:žü}ž~p'=Ļ’_{ī$ń=OņƞģŲ“s¼Ņµ\‘;FxDDäŽeYÖ¦ŽŠ²ÄśėNŸ}žūÅēųŠg’}e4fō]¾ż·/ńčŸģēčö0ūvšüóĻógų<‰ŽnvŌMҵ'ŪMģi…ēžūōż<ūĀ^śĀų~¶•ĻžjeōįĀ/šĶQ¶w’ķ±Żü‹V6mżP¹\¾¦M 6ó=ččhÜUyżoæĄė@"ŃŹĄT‘=Ū/æf[P¼ųžųƾ“²ć”ĻqמnhķęĶŋĻó’|µņ¾UFŒ"üņįNp‡č¹0GĘļeœ{hßß Ļ÷oŹ9^éZ®æČ@GDDīX®ėbŪö¦~ą°¬ššĒ\:uāŖēĶó¹’üšŅ'[?ğüįGŁXśt €Š|‹Ų @–…ČÕłä§ųO.Ԍ³ŽĪ_Ū¶qŻÕCƼĶ~zNšTg;‘ąŹĒzś³|ņheJ› °h³8Ū‚Į?ZŌįźÆł2.0ÓįŠŚR4ŌÖv>ś©Oįū>¾ļ“ŻÜæbK\Ėõ¹(šˆˆČk~źĻĢĢ̦Ԓ“·xz_kū#üĘįųŪ×§V<Ö¶"Æ|;ļN¼Ę’ł}" K6 śģg؀ѷ’ž’ū«ēųĢ_|Ž}aXŗśŽĀ©žŁ®~Ńß÷üį Ļ T«Źnźz’k™¦¶ŁļĮŲų4`qų—Ÿä[_|žźOņÉ£{Ȟü{žųĖÆpų3Į'»—²ō½© ŁX@bG+°xŗÜÓY€³|žæČd5š˜ęÖ­"Ųģi‚"·­į‘;Öąą ---›Vöõæēķ4€ÅƒŸü7üɧ?Į“O>ÉÓæńžż_ž;žj]¾Üė/½ XóūŸłGŽ|’õ·’ˆß8ŚŹüC°”ƒ§?ż›•°C€]ęŽÅ§ŸęčAųiO€Ī'~‹O?żAŽ|š#ü«?ł,G7qOKK ƒƒƒė:vÓ߃ßāķ4„÷<şęct'$Z»9ś±Oóēś —ÆØCk÷‡x¬+ „hZ„N `ųUŽ›€@ē’Āg>v˜ÖÖnž|śi%²¼ņĘEģįŁO?Ik"AĒĮ£õ—Ÿ”–]…U,—,ūW_ćlö}š“|īsæĒSGļ§ čīÆųöŪC4xŠĻ}žóüĮ§žęCv×ZRtĆ®åś‹Ü ß÷/’”²śüƬ>¬źĆ®> óōéÓÆnyoE¶ˆļū”Ėež}öŁ›ŻŁD–eń[æõ[üš‡?Üä_‰Vŗ·ÕPœ½D’šŹÓŪ.‹ŠŚ‘‚BéįįEÓŠtt„ėÆ<׌ŃA~¬Ÿ©ł­t4°šz„Ŗ©…é<ĆSėiūś“““šČ#šµÆ}m]ėH¶ņ=ˆ“vŠU @‘K‹®hķ€éŹs‰ÖV˜^ņśj­­„ņĖ\×H‚»¶I1ßšļ˜ÆõśÆG,£®®Ž¦¦&R©---¤R)’É$±XL÷į‘-³oß¾#@•e‹åźĆ­>¼źĆ|QČѹc¹®ĖK/½Äć?Īwæū]ŠÅāŚ…®×Ō0=S×ŗ-Z–įžžå*cńÓW35L’•™&»“Ģf<śč£¼ųā‹×“iĮV½Łį~Ž]į-˜ī_ōūk{ŸV<>;EæļĆV,į¹žė/r'Š”6¹£õööŅÓÓĆOnaŽŃŸQ·wŪ²my…ÉUŹl_²E{~vį$ČM sŽ5én«_³#3ĘĄŲ4`ąƒ”  ¹).öĮīī/Cļ—æBõÉMr®čswG#ŽZåW¹b²6‘U8p@GDDna>¾wuČ1Œjš@ĘĒ÷ń ƒł²¦¹8łųŲ¦†M¬¾žmÉz ĆÄ,Ķ0Sņ©ĆĄ¤²ptŪ]“7…˜¼pŽŃ9—B&ƒ—JŃŅŁJęü0.­wQø¶ļóa®\,ƒoQᆒģhiĄ[Ź’+;Ė·Uœ^„ ,@©oī -&3ÖĻʼnīĢ8³­õDWmĢLus+Fj{3aޱÉ<Įp߃ģų„JŲ±źŁÕŻF°4͹sC”r—˜*$®Q^«īoŒČ*Ž;ĘK/½D>Ÿ_ū`‘›Ą0Œ„ÓŲ–™²,LY[Žę’°čxƬ¬żń}ŪŖÜ_Ē4”Ė1;&V|J%Ƙ’$īHFG0—ƒ²‡ 8ŽU]#–ķÜŠ:3Ō@k«ÉųŌ ż=ĆÜE÷“ĢåŚZ£Ģ¢3'V_™jK$°&røÕ§µŚ FB0Uw–Į¾YĄ S0”č¹Õc Œö÷W®>…‚KżååĘčЬ¢®®Žüćų¹ŻˆˆČ†©ī f. 9¾wՈKo4æęN¤¾ļcŪ6¦iV•2>”PˆP „ķ˜Kė©ī ]^Ÿsƛ&xE²ÕŚĀ±„™!Ž??ĄÄŌ ŌÕ­“č²õ—Y“Ƀa.ł¼VNżv:Ū¶vŽ sS œļgÖ«Ō ą»ņÅ"ł¢K0"č±mcååFh„Gd•o“Lī»ļ>ņłüęߔPDD䆹v|ĻĒ0Ū\¹A5ŒTļKĻB:ń<Ó“0-Ū¶°'„iŪ6šSI‚vˆh}uÓōÆ OĖÄ­…{āxėųžŠuĖx&xn™ōš•9±°CžReź—U×J÷Ž8&83›[Ņā•må3k—©¶L6[¤¾>@!3ĶüNŲĘ:źČLŽ’Īä$ļ¢=¤03L’š Pb.[&6ßD°‘Ż»R˜ĒwBÄsĶņu1}dæŗz"+˜’̲,|˜Ż»w311Įōō4³³³är9J„®ėāūžUAHÓįDDī<ó»³y՛ƒkŽAęZ[ \*W6pģ%SǼr ·jlĒĘš=Źe—Å«N,ŪĘ4ę×’\~}žĖ>'$ ‡‰…¦C(ą`BCu4ßÕN}ąņT·%ÓĮęŁÕĢõC3Õq * 'H<ŁBŖŗ>(’L¾Čœė273‹Š,ĢQšKdr%źė®nkĶ2ѳʂDCs¹JY#” sGsķno¹‹”;ĄŲLžüģōĀØT掕-¶ƒtķp¹00A©”ƼnIµļ¤ĪÖ*/7Äš—Īé4،ÜUžęVVõaWŠyśōé뻕²Čm¤\.S.—Éård2Ņé4SSSLNN2==M&“!—ĖQ((—ĖÕ»[ū 9""wˆÕž½÷<×u)•JD£ŃŪ*•¾Ėnh0o~fƒmŪƒÕĄ‹ŃŠPOC}œD2I¢1I},F8ʶml{}ߟ{å2®–cßš"ņr©„oX8öņ5-×ÖZe.—-įśĪ2÷æY³Ļ£äVī³³üyz”ŠÕūų,÷śšåļlūöķ;ō% \}øÕ‡W}TĘ4żĻ©‘UĢšĢ’Ć‹Ån®7’\>Ÿæ*š,¦š#"²¼Zų÷q„sš}!ģ‹E‰Ä÷l}®\3?»ažg\("‹Q__O}}= õ„ƒĮ%¬—ioÜxŪY}kėåŚZ«Ģå²ĪŠż\³ÓÄYõš˜8«m»¶fy¹ <"«X<„m~äĘ÷żźēįp˜B”@”PĄuŻ…oóDDdclE(ڌ6|ß§\.“ĻēÉår¤R© oc3X–…išX–E0$ F‘H„P(„ć8×xDn‘5X–µšū…¹ĶŽC0$‰P,)‹+ŽšˆˆČņÖóļåķx<Ļ£X,’Ė嘝„„„eĆŪŲ ‹Gx@€P(D8^˜āę8¶m/łł(r+SąYĆāüē9Žƒć8 Ēó<Źåņ’Q YŻf’[¹Žś7£®ėR,Éd2X–u[ŒšĢ©gĘĀ”µ@ °0½Ķ¶ķ…°cšęUÓįDnU <"ė0?d?’üü"M×u¦²ĶļĘ£°#"²qnäßŌ­<+•õ<|>išø®K2™¼ī6¶Ņü—|óæZ–µ°‰Įüt7Me“ŪČ:Ķ’XüC`qČQŲŁx·kąq]˲vśŒÅbĖw+ŗ2ō,÷«ČķDGäĢo×éū>¦i®8}MĮGDdm›½†ēfžłūļŲ¶M(ŗī6¶ŹrAfń47¹])šˆ\‡µžįWąY[-žłu0‹§„Żźh¤VŻś’÷‰Ü†ōCCDäĪvåȈ~.ˆÜEęZ/Č Rą‘[œE]SŒń™<nv†1`lt¦ņįŚĶ1ži"¹µn1éę&9{.„ ŒĘš\”¬i+„”+4ó`ktmū@=ņ(<ņ?w’^Ž‹KłõµµÖłśž ėŠiėÖś[!""""²ŒH²…ōł ~k”Ģų%Z÷ģ…³#d¼VźriŅńF"f‰±ž³œ¹lī¾/ĶuĖ•ųEFūĪšž@¹śś>šc~õ¹4cĻ}hmąeĒ8yfH“Ī4±ūī83ƒēĖĄ®{³#n¬Ž.ē8?ÖĄžmβķ\©<{‰ ģāŠ}pā§#Üu¬ƒ€W`Øē=ĪA¼ Ņ“Ņ kö³ÕI32££a‚·ĻŒb“&ŽżŅŽYŚøÄ‚¶…ŲuMģŠeÜ<gĻq~, @ūžčhŠāeĒxõĶ3Ä؞o “}”wģg{̆ā§ĪäŲ³?JŒńłkp]xDDDDä–gEhJ_¤ą%˜ŗPfŪ£M9ĆŌ\ '3IŖ„›üčYĪä›xōX £0É«?:GģČ~BÕ:ęFĪš¾»ƒ#Ē’ųŁ1Žœ"į}vrōŲ½PLóÖėgØ{ō^Ā^™4IŗcśÆż4ĻĻ;FWŗŸ×ĪOo›Z¶­čĀü)‹Ę»`̤3enčeŪ‰Y‹ĻŅcņāyRūŽXƒI;Æ12»ƒö:›¹Ń÷9ŚÅ±cqŠÓx½·2ŃĢ_£Ÿ©n—LÉĆ÷\2™8‡Ż‹ćÕ7&Ł~,²4 d.qqĄÅr“ēfFl Ó#”»8¶7†›åų›Sģ8ÅšĖĄxø'7Āėo›t¦źšģÆ_˜dūž³#}”·Żcx„āM„–œóęSą‘[Ÿ¦)Udrr‚ÉXŠ– ŪŚ9?2ŽY‚Ōī Å”2dĒy’Ō8˜©”C”č-ßµéHÕWÖtDRģßć2|ā »ŗļĮŌÓK3™-ÓfxÄSq€k™ÄŚ“× @ʧ[¾­hhъ£ņ{—™‘ō²ķÄź}/M30™üū‡ pq‚¶żMd.„ŁŻu€Jń$M•WÕūyyżG|W¢2ZÓ+.s‘} L]<Žķŗ4ÄbW,„ų±8vļyN B(T†xkå\|xĒ6¢Ž[œ?_$ZHK>I]Ą ’ŪŁæ?ūļŽI,&øüqדŹōOdš “œxł"ĮTŒó“•ē(Ļ1š‰Ń®†ļr\°Ķź°Dõ©ąmUŽõŖE,źVk§*s©ĢŽƒ9t/ŽĖчļ#6ž>yƒXSœs•Üģ,ć‹?ĘÆŅOcqóKqVŚ…ĄbQb1ꨫ†€t’ ĘźwqčŠ½ģķhƒtéźUD ē vģ ńĪN0ŪŽIƒ ˜vL,ķÓŠˆˆˆˆÜ‚u `€T<\yĀŠŠ”‚r}pZīf÷éńņĖ1 Cj÷}“™•Ļł6Yx½R|÷}‡IÖµ°ėä¼Ü_)Ó¾’lpYśAyį÷3ÆŠÖbV؁ońĆ36Gŗ÷/ŪĪ?Ėš¹ w?ŲP‰2ą4°«Ž™įX{7‹Źß³Vėēāē–|š·—÷ØVø\ŠnŪEę¼3ÆVd“/CdQ½KĪwoŠXS+œ§-U]Üćē¹šn»®šŹ·¹ ßæ|J†aTNÕ 2ścVõaWŠyśōéW·®›"""Rk¹‘cn“ģf“įŗ.¹\Žt:Ķ„K—8pąĄu·!×Īs]|ĆĀZa.“ēŗ`Z•ĶĪVyn#ŚZOŪ׌žaY[>J€ļįśÖ:;_Ź óŚ —GŽķؐQ–xąŠ”Øl÷V¦’M]*¹Ö£’×|Ń’œį‘šbZ«,÷śZe®·­jg£ŹßĆÄZgҚ>ÅOĪŽ³ūž‡oząøŁķ‹ˆˆˆˆH‰¶īćH³y ģp tADDDDDjĖ­v@#<""""r rē†9ž“³W<ēžGļ„ī&ĪźZwöĒ'8ÖѰ•qź½Yŗļݾę÷ėn7;Jö½¾„Ļ…;ŻU$?'ŅQæFĆ9Š£9Ū“ 7Ł@ø½né1³Č®§®M Ą#""""· čą”Gڰ}Æŗs˜}‹‡3Ņ̃ źØiĄÕ@op».°ŠżmÕ­„1- J„ÖS_n‚ņ I`{åĘr›Dš×W×&Pą‘[”c[X,ž ģ2zę=hæ‡ęˆ…_ēŻ^—{ö'™č?Ė™ yĄęīū÷Ņ\ĄĖŽńź›gˆ7ŌÓŌu€ķ1ŠSœ:“cĻĮ&&ūĪšž@ˆ±ē¾“6š²£¼}f›4é tģö¦Pbl™vóņiFfbt$3ōæL¹LŚŽs’ŹŚ'ZśIDAT¾NźœEaĄĶ2pöēĒ*7mß’MQš õ¼Ē¹1ˆ7AšVŗ/;ĘÉ3#@št¦‰ŻwĒ™<ĒXvŻ{˜V§ŚnĆÄ }_…ccŚó›3WeÓg¢ŲÅ>Jģ$ÜĒ8EŃk%ܞXx?JCä/5ŠŚxĆgɍšK`u$Ų…BšāLŒP"CžģEürßn xw'–³¹{Ī)šˆˆˆˆČ-ČĪrüÄ1€L†LźnŻŪL¼)Ą§iŽ“dzšvćƒFĻr&ßÄ£ĒR…I^żŃ9bGöņĖš’·wļ_M\’Ēß3“„@ ˆQ.Rš‚ŲTń=¶ĖĻŃZż*Vl)„~Eb!\’™9?L¹L­ÅēµVVn³gļ °Ö~ųĢģŠĖčĶ>ĢõEž³øFw&ÅĘė?)žbwiš.ņóų0ģęxōė4­cĆ4{.Ž“äĒńa"ŪYnß_£{¼…Żż$*ÆWń 8Ķå)^6g<ĖĪZ–üvÖč~8Śy·F±=Ķųe7æĢoéO°³<Ć\<Ķųx’ŻõE~}Ō·|ÆHŽ~ĘX_äīćm~ē›Üwēߐŗäā<üco<ń7”°ĄÖoĖ„į·Ņ42€åšw}"qüĘöī¼·-ÄæoÆhkķī„°nŅt.Ī:DĻŃt­³°Fžń ^gÓ+ąļzøĖÓxńZĪā­eq· XŃXų°Nˆˆˆˆˆ|†| ĶĶ‘^"{_©b`VĒE:ŸžÅF_”W/“ōµ°ūwņ«Ģ<]3J*eg×#ī{$ūĻ‘ˆFąģRO§Éķ“°²_żēŻTŽō„ļ‚﵉”Ēα–/Ņcx$ÓķÄbĶtŚ»ģn…÷“ˆ×_”ߌż=Īqgā)töqķ›ĪŖ÷cv’Č‹y&’ ńx’]ø8+9¾ ¾»)v¦ƒNr„ÉT’ąZ&v_M€ćW|ahųŲó€^ā×z0ŹĒŗņćqbCŻlͼ"rłRżw•V'0Jū2:“Į6‘ońŻž½M­īkDęČ’gģ ÄŅ|lŸÉŚ """""ļSžŒ'ø8ī=b»’+l bM@G7™L†ĢŠEģX3ńXĶT×h”w0ĪŌ½I6ś¾¦-bњ²™_s‚÷‹›,;6mĶ„š€WŻ-²Ÿ’õl«+Ćųų8דļx¼äT½Ÿ[˜${&ĶČČ0—ū{ WĄĆĀīL2÷f7æĮjå”ŻŪLÄ“ŖĘW•CBĘ…B‘ŗÆĖõL ĆĀKķņjŽ&;3ưz.Pœ~ėÖ¶÷Ŗ»ņ*{خƳĖpį[Zž÷GšŚ6Ų]ڬ͉S…GDDDD>C0ĒŻ‰łŖW‡FĒ8Ÿ°h=×s«ōŸVżj¹0ÄĄ³{LLŲ€Cją=f0—ÆœšŚ]0»JO*XÉĢīΐžż> A»¾Ģ(m‘ą2žŖ‰rÄ<°ŸZ ŃÖĀ‹‡æ0cŪąDø<šØŚ&q.35ÉŌj²ŌY„ķ"“^øDŘHī…™HM@tl£źµ°±ćnņäī,ƒc#Õ+Ż™&DĆF0š(Ģüßs…x·ĖSvž/Óņķłżām˜üĮÖó(ĶŻ5Į kļ°’ < m‚B„čwﹶ辿ŸĄ Ć0Jc1Ŗ?f0J,‚ć¢Ą×Ļž=»żŃG'"""§VåäC¶łŠ¶£×uŁŚŚ"—˱²²Ā•+WŽŻ‡ēŗų†…Õą<¦‚³ÄŻI—ŸĘ{«Bēŗ`Zõ§k³Ÿ}>®ėaZ”»ö=\ߥ éŲs]ŒFķžÕ|p=°Ž¶jŪččč-ąO K7·tóJ7šżŠ?NUxDDDDäŌ0˜Do.=åįģ*×oÖM‚jwŌ~ŖXmk˜X ĶQĒōļa9ģ|ł"$ŗ¾åÖy£ī9Żōć‘/„ĀĪ—H?r9µxDDDDDäŌRą‘SK‹ˆˆˆˆ|&޼yóOAä“;{öģGŻæˆˆˆČgācOüD¾D:„MDDDDDN-9µxDDDDDäŌRą‘SKGDDDDDN-‘OČs‹ø®’Oć‹”e©EDDD¤Ž»¹Ģ‡3Õ/&īĀ mgiy›TwGųūŸP>;̓i½u™Ä ž{ßu^ņĒZĆ}­Ēkæż–ŁūOȖžŪ½C\żśDų;,ĶżĮģ’@śź zŪć5y¼]œęÉĀ*ŠÉ•Ct4čė$)šˆˆˆˆHčēĘO=D|0L«a˜q·Ö˜3IuĀ!†Ś!;DŠWkż vÖNŗ?LÄy€õżų@7~ŗH';ĒŌÓeĘFŗė~Ī;미÷x’ƒ„õ²óę³øłs7F~™_.ŠńóeZ*6.n¼āɂĶ·2°¾Č½§Ėįįé„)šˆˆˆˆH8;B,baVLŻĶ%ę×[ģ¶Įs˜}¾Iśr'o^Ī0Ÿmcš\”å?§™y™lÆ]”«-†—_ę·ée"äČ9Пłž¾Ī–ź>żŻć·Š+,’fäL>~ĶWćżÄ/Ÿå·é×D"Er9H_Ķ7ĻĖŁ9ę³9ś2£ōw&*ĘQ" ]’–NÓbuž9SY‡œS±-² ³L/n—¶½ĢłÖXÕøvßeYMqė|kpMI¤…¾®ao™ ?sų±>u¤±DˆF,,,"ķ½\Ogy“š§ó,@lļ½D†°8ć9,žµĶŠ@Š™×į§ā™Ķ]\²ƒjUsČćzP™œ¶×³ŲéK4™@²ƒ¤óœ-·›Ö\äQą‘8³ü6łĒiedlfße«Xšōś>…|‹³½iȚ|J°łjŠ.ņóų0ģęxōė4­cĆ4{.Ž“äĒńa"ŪYnß_£{¼„jBŗ¹4}ģ¶ą±ö÷<©ĢŲm&}ÜåõF/}­|ÆXjßG¬cņīs’·†‰¾[£Ųžfü²›_ę΃·ōŽ'Ųy=͌ŪĖ­ńü|–™’¾„½Ė;ÅŠõb…5žļ×ŗĒ—g™Žīdl<…±³Ęķ{sŲ·2U§Óķn9Ųē«. 7›Śčl¢ńń =Ö°y„±…e‰DūxøNń¬Ģrgņ5¶ćąC£õmL›Įa?’Š™¹šß–h¢öą“ņź÷ĒŲżĆŲu;ŠÓa7•~½ātŲq¼šŻ( įi®^ļĮņƒI·i'ŗķĶŚŠj€¼hąņīuŽō„ļ‚ZAģ =v޵|‘Ć#™n'k¦ÓŽ­éóCŚ…u^®‚³=Ćī+Čüż†žĢyĄ#Łß“ž”ĖĪńnĖ„ĖNy1Ļä!/B² šŻż©3ĮGmI‘ ®“I¦’4@$F’5vÜ~Ü­"äW™yŗ f”T*ŹĪ®G"¾oL+‚³UØļ&oó>Ū ?sų±>ŹŲźk`PŲŁ„ŌY,¶47Gz‰īöwī?$×1N2ZßĪ{Ļ: ŽNŽē÷¦šŅĆ\ļMÖՊ|ŠUĻ<§Č§ UŚDDDD¤ž`b¦ibšęŽė¹ŅĽ˜ß`µ<ō½ŅŪ­)›łµąāuŠ›,;6mĶ„’³{•ūÆõ!mĮYł§÷*·F†¹zu˜Ÿo^Ć^įͶ˜äœ`Ź]Ü`ÉIr¦Ł"·0IöLš‘‘a.÷÷@®€˜V‘…7Į8ü5&'؁šY0®XŠŃM&“!3t;ÖL¾÷žzKŻq÷(Šų€·½Źķ{SŲĆ7Čō&Į÷ė¶iJŲ,.®įŽö[ˆżiä  OŲÆ’ÖĻłŲõS?«%IļŅ$K„J±[ń6R<ā—é·.eH’~Ÿ‰pčˌŅ ŖCU“ĻHżl×ī>f[?ĻŅœĆŠ÷mA,0€hé>˜zżŽ±s¬Ī25¹„ć8ō_¹mĀī¹4ĪŌ$S«ÉR¶‹Šzaˆg÷˜˜v?pķGšČÖLž#“ģmŒ95pžŚMrsä2Ļ&„¼.šŻ5Ä4ł-”Ÿ™Ēŗåc ĉm>“ķĒčĆu]¶¶¶Čår¬¬¬påŹ•c÷ń¹ņ\Ó:ųßóžė‚iqœ…Ķ>¤m×yÉL.I¦7ēÕūõ=\ߥ éģ(ćš\ß°xĻa)mgÖõרÆFĒś¤Ń§rÜqŽŽŽęA.ß{„{æ|ó+ž8r _qÆJˆˆˆČģ}a'ŲęųĖo}HŪ{$˜ĀõmĆÄj0ł>Ź8»m£ķæ~¬Ož}0īŹrč<x‚ß„ƒ}ŠDDDDDN„ew“9™Æ»‘Īa2H]ŖŠ‹~}]ÖÆy\~²,†ˆˆˆˆˆČGSĪ µgœUe˜ŚLs˜uüš›l{˜""""""G·AEjóɁžF•ņćĶcSDDDDDäč6 Ļ&T<ÆsP…'lg•U‘O„QuēĄJQ{ŁĪ{–¦6 :ˆ–n  H-ģ/]]y3kö'"""""_¶ŚbŠ[s+y ¬ÅŅk…Ņćr›—¤†Ć-K– \öƒĢ»Ņ`"„‡ŹĄ#"""""Ձ',ōK·Ź×ĀĪ@;ŠQĒ~p1+U2õI­6š(ōˆˆˆˆˆHmnØ =ÕaĒ ŁöxĒ÷}?8«­į€*ĖNFé¾Ģ¢>씯Ŗ < ?"""""_ŽF £y„‡žŹ°SzŽB¾fēPžŹ•«<ŽÆ ;åÆPU…GDDDDD*…-ˆV5ļ«ōŗŗž°/!m“:[Xe§\Ŗ½•)üˆˆˆˆˆ|9Ā*<Nm «ö¼ÆŅźØžņćŚąć³æ¢[łŸŚSŁTį+•Õ›ņ•!ēČ_: Oé:žņ"°æ Ay µŹ•ņ½Qq_nư#"""""eaE•F÷+Ų{vżPį©=åUŖMW•ØöšĘ&"""""•:½­\`© < OckvąšĖRWšJ^Ķū•÷  ˆˆˆˆˆ„«­ŌT¾VYįit«lאq@ 6ŲÆņ„݇]§öxDDDDDd_£*OŲsšpt`uxą½”§|p……‘/O£šQ»A£JĪ‘Ā2š@UčĘĮ§üø6Š(ąˆˆˆˆˆH­°ÆĀ© >a÷‡ ;p„Ą³× <ųōønGźPDDDDDN“ƒHXŲ©z|Ų SväĄ³×°:ų€Ŗ:"""""r|a՞ż'Ē .Ē ÄŲ6 éTFŗŪ;mu 3±ÕvĘEŪ±Õ:5“}ŗĒ¾&v.­\ ­XzCōĮŁ„WčĮ$ĄˆN;¾„ūv%䐐æĻuyI²VÖ}'J¾ėw»vķŚ5Da³Ł`6›&“iČsŒšššÆ#•J”T*]žS©T™L„RÉ’&"“ #1$³Ł «Õ ³Ł ³Ł ›ĶvCóL8•J%är9’Y&“łe?AxC" `¢g2™`6›o(zŠ“ŀ„$"$ŅĮē–øœ#>ꉖ¦Fō÷:ųćžĪvōtu ³ æ×ŽžĪžœ'āćć”T*”R©ųßA$†„_°Łl0™L0 0™LhkkrNx¤ É $$)7‡’<’Ął &œ–śZtwv µÉ‚Ösēfdd@„RA­V“‹• ‚CbŅ0›Ķ0 0 hhhr\‘¶ I ¤¤-AB²SĘśZ“6YŠŅd„¾vˆ)•J¹0ŖÕjr«D€BbHų³Ł ½^ƒĮ0ÄśKHR =k%iKāęā Vŗ;Ūa©ÆEcż)ā˜““CĀH‰!įu¬V+ōz=ōz½‹†GJ°0sRŅcaę*æø;'›–¦Fœ®>†ŗŖcCÜŖL56G‡ÄšLÅÉ/LÓ3W"=k•wēŗ;ŪqŗśŖ .Ā(•J”V«”Õj)ĘH~‚Đ˜Ģ v»?æ0s%Ņ3W"KļĒŻ.ŻķØ6V ŹPįāJĶČȀF£!k‘ &Cb\˜Ķf‚€²²2ž\tģld©ó™“É/Bc}-Ŗ Ø6Všēāćć”Ńh Õj)¶H“‰!1&L&t:‹+T‘¶«zlŹ»A'JŸĆŽŽŻēb-J„RhµZE‚š1$†ÄØš$‚™9yČßō Y> ŹPŽņ½/‘(Ä$AbHŒ‰ i¬ÆEłŽŻ°ŌŸ@¢H¾‚ĐšˆÕj…N§s‰ ’śO¢ØÓé Õjż¼3‚ H l6AĄöķŪłs$‚C]ÕQŲUĢŻ§ńńńŠėõŌ• &‰!Į1 Šjµ¼P^‘¶ė·ģĄÜä?ļŒpēČ;ūP¾w7o4ž““A —Ėż»±ĘjµĀf³Q-§0›ĶÉdAūÄ€Õj…F£įqĮčŲŁXæee‡8};Ź÷īĘļī@®Óį`7y2™ŒĻ½¤x«÷‘ĖåjµŚß[$†SA ÓéxĮ|ž¦gpļCM‰Vi”BKS#ģ*ęńÄŌŌTčõz²€ąBFƒĮ@®d‚ €×nœl6¢¢¢ŠŚŚ“–į?ł{„°Z­P©TŲ¼y3ģv;i‹ńęńϐæéYĀ cnr v4bż–” ””wŻut:æ·ęw4 t:G!4™L°Z­_ĒK»?g2™\žc£Č—]SüY$†S½^»īŗ mmmˆŽ įP5ņ7=ėļm>&&nJß?üMĻŹŹŹųŻūT ­­mˆub0‘‘ĮŸg®LÜŗa?K„RČd2>AD„Rń/{f½1+“¹ŪŚŚ\®ĮÜÓ:F£Ńe‰ų8‹żÉårė¹æ/¶†Ųŗ4™Lüµf³mmmÜ2¶ŁlJ„ü<&†Ć}l?ā› ƒĮąbi³sŁūV*•P*•ČÉɁJ„ul4P 1 q4 Ö®] Ą9VI8t‚ź§ł›žEÉAO®aÖĢTÄŻZ ūlŲóģg&Ģõ555ÜJbÉhīI$āk(•J>|eeeü³ÆmµZ‘‘‘1ģzāż‹× ›ųz&“‰_ĻÓZāó<}āė÷Ł544x|ß,^l%>$†! ¬³vjł›žAŃ+oS¦č%%m‰‹ŪtٲeC¾hCųųų!։ŲҲŁlØ©©įÉ0<Š!žČ"¾‰`s'Ŗ„ų5īÕj5222x–„ŻnēĒŻÅĒÓzž®Éā¢V«Õåzī%³źÄVÜHŸ‡'ÄóJ āć泍•xO2™lH?ć`€Ä0aæ0 ”`[i¹E ī6ĶĢÉąLÆå!Ā,a„%ĄŲl6Čår.‚ ##ƒgFŗ[Rīń;±e”ššŹ”¹Å֗XtŲq–Ģ"v!² β²2¾7Oė¹ļ ĻebČÜŗ\Ž'³2Å¢ļé<ńē”T*QSSĆ?;Ąys!>Wģ’[Ąu÷k0Abb°_ ¶¶6$$)PrŠ@d“%Æbż–®ĒC1±†•$(•Jža©Ńhx6¤Į`€Į`ąæœ.@V¢…ØØ(n­NW   s±‹øŽ•%,,Œ»Y&¦T*…R©„N§Cjj*·²<­Ē`„,«“%Ėø[gL U*4 L&d2”J%āććyöėpŸ‡Z­Faa!ų{bƦŁēÉJ&˜@[­VžYˆTgBčõzdBHnQb8źŖŽ¢“ų ō÷:ššŹæ0CV.įļŽ4ć镆Ƈ»duk=§T*GüwĖēįīN%H C±fęäA[ņŖŸwD-M(Z«ę‚HmÜ³ŁŒ»īŗ ō•ķČMčt:Bb\ĢMNAÉA’.فDąa6›]Šō ļB–a£Ńh\2F)Q†};ŠÖŖŃzĪ©Tź1µžš/4‚Ź·1b!,Üń ²Ōł~Ž̐ Sr“)$„„·‰H¹ĖŌn·‡ŒĖ”5Éo +Ļ`˜L&žÅÉ`-Ņ&›Pų÷ H ƒAH Ÿj‚ČšK«TŖqwDټy³K鉻8²ē¶oß>‘­Ž–Ps£1OÄč 1 2ōz=6oŽ €„š ž1XæTÅ­ĮĘćņeB3Rgąz‘łdŽ8°oƕDˆ ć‰CbDø—O¾"‘.bÅóĄuw¦ŲĶÉźńl6ېBq÷1K\Ś™ąEėģZž°Łl|¾¢ųuīóŁ> t:ĖõŲ¼B¶w6ļ]_~=Vœ/nŗ-¾†ø+;ŸĶIt’ ٬B÷ĒĆ VH ƒ³ŁLåĤ!‘bŪ+e¼Į·æ‹ŌNJ Ø©©įĀ nĘĘĪß-Öʓø÷ąŅ­†Ķ*v qS6·umah4Ž(›Ķ œŻtŲĻāKz½ž‹"Ū;ʆ†~C\źĶ\Ēā½3!’‹‡ Ėd2‚ą"ÄlVcØ@٤AūOj·Ū±0s%Š^yŪß["¦āĀü‚‚‚!É#ŠĶfCTTZ[[yæM&*āÉģ‚ `óęĶ8xšą·"ńX&Ö7”=·>cSćÅ(•JŽŹ ˆĖ¬Ŗ°°0œ8q*• aaaxī¹ē Óé\ö(“É`0\®Ķ޳$Å ÕjEBB²ĖD—Ķ< Ƶk×\¦W˜L&,[¶ ×®]sŚĖœYµloV«5hž/Œ² 63Ķn·#!IĀd“ĖÜäl¼+++óKÖäxb.>O146>ÉÓ±šš+ŠŻR¼Q\ŽĶ='ļ0 ĶÓ~šcāi┽ 6rŠ5ū[µf³ńńń\ČŲ>ŁD ÖD›YÅāĻø.xƵqÓėõ!$1 pŌj5Ÿ>A½F ‘’¶…;^lß¾=(,±p¹[Uāx³ī<½øŪcā TVVĘ搞āgž&OĘ!S˜`§¦¦rļQÆ×£¬¬Œ —8±G£Ń@©Tŗ nöäŽ5™L<~ŹÜ«,,^Ļf³yt‹3ĖŅÓąßP€Ä0€ŃjµØ©©!!$‚,u>’Ä\hŒū°[÷ŒPv¬¦¦Ęc¦©ÕjE||¼ĖsāĄz½©©©.–£§=ˆ»g§2 ŽMÕļCl•ŖT*>|„„„<įE<"‰ ū$ ń¾Łō v.{L|Łóā‰b˜»Õ=(T 1 P JKKė·ģ éōD@ -yŠ“ŰŪķŠh4aź©pŠ\CCƒĖ|?OVĪpÉ3ģ9A Õj¹Õ8œ(Žō±”»ģśb‘tß;‰”ū{c±KözO–»0wƒąißbŃ)a(X!1 @Ģf3÷ĒßūŠ*” Šm„o#:v6·66“øīāœVmaa!·tÜ­?†»XˆĖ,Ų“z÷÷ļn-«Õjčõzn‘±ė1Ac‰*ģµb1dk±ä­V‹ųųxžõŹŽ›C(ŽćµµµńdČÉÉįū`.nńzĢeŹÜ­R©”'š°Ļ üU©T!9ź‹Ä0a 3Š“Åxtk‰æ·C.°’ Ą’ Ä!®,„}ŁkµZ˜L&„……ń»€ÓśĪŹ‘ÉdCމ­8wW”§¹Z­–[,+ō¹ēžCBBŌj5wM²ÜbńeVšøęY§,viµZ!Æ1dbøgĻ^ŗ€  8¶)ž‰h³Ł‘‘įbż¹·˜—t„"TZ`hµZ”––"ŲU ųā‹/Ø©wˆŠåbČ2 ÄqĀĀƒĶź‡ĆĀĢ•šńCbb0ė3½Ž‚Ä0@Ēī}hҳVłwC1 w¼Ź;Ō„ŖūlŖc0 ‚KP„ܤ‚Z­†ŃhDB’‚Ź(ˆ ¢®ź(vļ¤\({²Ÿ,@Ä?'ū{+A ³ųCY² ƒĮ£Ń(,y…„*ҳVįŽ‡6wéÅĆF“¼°Ķ/ģö÷V‚™LņBś±{4Ó3TOH%ł›žEtģl“µµD\©ķµ×²Ÿ¤ły'D°@bčgt:ģv;¢cg#Ó³žŽAŒ‹‰ė·ģąl×ęĻī4ŹŽÅ•Ī.L‹‹EÜ#’ę·}Į‰”1™L׳Gi$ä¤g­āŁ„ć*?Q¾u8øU’ųFÜ,‘ųeDšAbčGŲFfNRŅ–ųy71qÖoفšH jjjüRÖłö’ƒļz{1-.3×äLśśDšBbč'ōz=ŸFĮÜKģÄÄĶĮź‡>ko²ųÖįĄ…²w‰’A!blśń|³üMĻRö(R°d»Ż>©É4Ķ/ģĘw½½ždn’—ĢI[— H ż€ >~ŌEų¶?×ć/üš“Ŗc¼ŪŒÕj…Į`€ Cpaę*¤g®œ’7¢-M°ŌŸB•”ĀÅ„*•J¹(RŽ+$†>B­VĆh4āŽ‡6ąŃ­%žŽAł‹ŃßėĄ‰'Fõ„ÜšČ:Ų’ü)bÖ¬FŅ ;`2™ ŒF#?gŖ ąptw¶£ŚX*C…‹Å­V FCnTś›Ķ†ØØ(€pØŚ'ŁgĢEO ŚX‚‚‚ö,[…gĪƋoīw±i‹‘•“‡…™«(Iķ“45āČ;ūqŗś(ĻReÖ¢7š!3$†>€Õ&$)Pśž o‡ ę*MĶįgźūŃßtæź†žėN+03'«~,$c€¾¦ĻaĒéź£8ņĪ~7jNN“Zķ”t”’śę"]æeV?ü˜æ·Cɍ\„6› u{Jńż÷ŽGļwß!Æ„ ߟ‡üMϐčEėkqä}8]}Œ?—‘‘N7„D‘uūV?„H[ģߍD³0Ó×cMģ6›»ģģļ–ĪĶKĀϟp ņsd©óI½HJڽņ6Ž<žoØ^SSƒeĖ–A„Rłde Bbče ģv;¢cgS¬ F =ÓY3ČÄP,‚Ū·oĒ’ü§›ń?¾w žqG ~°ż·Ō××ĒÄÄ́¶äU¢ØV«½:~+!1ō2ģ.jįą/:AžaŸmmmJ„Ū·o‡ŻnĒÜYrhn‹ wĪt¼ž\‹žé—=c£Ļaǁ]ÅØ6VŽX"Y†^Āl6 x!A0ZšQ“VĶ…šžūÖa£Pį"„=ŲNmį9ēļŠUÕrĀ "B"…¶äUl+-ć±D•Juƞ³‰”—`b˜¤šóNĀ’TŹQ“VÖsL—`ćž ä<žfD ķu{4ūl˜×o0XWHéY«šęńĻ”H[ »ŻŽµk×B£ŃMr ‰”—`ń¹É$†ÄŌF(z„ÅO¢æ×ÄŌtUœD¢rŃˆÆł·^ghaą_ Č* b"$Rģ6 P,]>Ŗ×ĘT1ķė|ó½iع}VŠÄ—ˆŃ!‘¢ōż¼ĒéęĶ›”Ńhü»©a 1ōL £cƒ{Č(øŚÓÕĮŸóµŪ—MŪīéjæį¹Ī)Żūšę‹E>Ż1zŖ 弈ž ”{¶čpÜō·>ÄZ…¶7bą¦›ŃŻŻķĖķ~B[ņ*ÖoŁĄGT«Õwćs³æ7 °ԘøŁ~ŽÉÄ(-~€3#vŪ+eˆ‰›ćs÷åź‡Cx¤dT ģ*†„žTHXą”@łŽŻ(ßū`Įņ\ämżĒónūäæ_/ś—ēcŖąęĖżør[4¾^ō/ųŽ™³ųūÕ+øxń"fΤ$šPƒż®ŲU £ŃČg%Źd2o ‰”W`™¤Į\VQWu”[iė·ī@Ģ`ķ—xˆj]ÕQT+ŠßkGVNŸ/×ŻŁŽjc¢cgC‘¶GŽŁ‡Ös¬~č1—ɍõµØ2T §« I äoz­ē,čéź@µ±‚÷¦ģīlē׈ŽƒÕo@k“=N‹µ§³å{wC‘¶„·¾«2”£ŹXšH)V?ü˜Ėó=]ČĢɃ„¾uÕĒ)Åś-;† ˆmijäRf®ä?³uėka©Æ¾×©ŠPōO”¹ē¾uČyü¹aĻöuāžōÄżéh-،ަিõ!¦Źhæ’QĪ‹ž® ųž ~!K„dŠÖŖybM "‰”`–axOßnü’Žķ±·ŖŲ Kż)“4YščÖōtušcį‘.Ŗ–śS|”Uc}­K\ŠR n-„¾–æ6Ó³čsŲ”Ķ]ĘÆœB–:UĘ ī¾eėåoréÅ_ĢpŗśJ’¶UĘ XźOįČ;ūD×Z›,(}’ģ~ &źż½Üū)iKPWu¼»ŹĻŖVlyi+īÕė¦}݃äßž?t&™Ż|¹Ž¦Ą6Xv)\¼xr¹Üū'‚¹É)(9hpDƒĮą÷sŠz††Įm²±,Ń\½};޼³°~Ėīū’ąŻżCÜØ É l+-ćė­+öśĢœ<±|‰7ęqÕĘ ō÷:¤ĄNĒ›Ē?CJڬ߲ƒ¾ I ”4 3'õµü‹Y8T{Śą²£æ×ĀÆp!k=gAw§3NY¾w7æFfNī}hRŅ–`aę*—φż=•±WÅHžŚÉ__-Źāϳ›I² C&ˆ I 444@©Tś½‘ÄŠ‹ø»ŻBK}-·Ŗ2sņxf;&&Ó³HĻZÅćzī‰1­M“45r7ģpōtµĆR_ĖĻ››œ‚p‰Ór—H’¶1qsPWu€3“wnr wĖŗļK‘¶Yź|¬~ų1ŃNKS,ŌŚ’WńčÖ@Źą{`CM™›vŖĘ,Ē+„½?¾Ühn™€„²=øåėnÜrĖ4Nː}Ăh·Ūż^œOb8AX¼0:6ø“gĀ#Feėb IDATBŽļp 9Ę,"Ą)ųbŃ &B­ē,Šęf¢ŹąyzyfNwµī,,€PōĈ×eė[źOaµāīŠ»DG¢Q$ōYź<—cĢ2œńĞ®„GJB¦–t,xĆ"ŽŪ?©Ā;ž„ņ‹“˜žŻ·dN!"$RAōgū6C/įɽL°6r­ē,>É MI[Āǽ@iń“hijrūå`ÖWµ±bˆĖÓΌŌÅ.&J„DŹÆSep ĮTĻåK!dÜ|¹Šŗ’ĀO¾!«pŖ!DCō‡ ’ą’r`W±Ė1q,“Ļaw˱ÄIÓ³VA8t‚ "ĖÖtgnr v4ņ=ÕUöšlżčŲ9ŲyŠčņg4ˆ÷ļīZ€ōLęv=5ųxj%ĻygŸĻ…?LĮOļĘGwĢB[[›OÖ —‰…%Æø“o›lA$1œ ”PV8Hl­Ļž1¶­ĶĮ‘wö¹ŽW+pzPœF[8Ė2źŖŽŗŽ'×rKS#Ŗ åƒīKūąys\ž¶ŌŸĀ›/”»³Ē[ĻYP¾w7ėkQWu”'ĒܱõW¾÷%EOøõ³cĢ;•,Ć*C9æ1ņ•~;#ķ÷?ŠsO½€oēĶ÷śõ‰ąÅ™ ŖÕ“Ū•ŠÄŠK„Bņ̶ҷ¹Ø÷tuĄR uÕG7‡giŲUŒŅā'8〣}ßå{_ĀĪĀŽį&!IĮėÅT*PZü$ŠÖŖa©?…šH ļ€/Žé}šī~ōtu %m Oč)ßūŠÖŖ±³°Ą„LāFīx•æļjc…K–ģÜä.ŚŃ±³o˜ų*4Ö×ņēĖs}"„_-ŹĀ_J~ī¬Æ_›NĂXSS3©­ŪØĪą°>‚uUG‡XBn-ĮÜd/lĻŹÉćVYtģl.XL8²rņ’¶„?.,y–śSčļµ#!IĮ_«H[‚üM×÷°śįĒ07Yž®DĒĪĘĀĢU\pSŅ–@8TĶŻ«LĄ“%ÆbõĆųó¬ųßÓ><ķ5&nŽĖūfÉDŒčøŁč韘2õ…-MŲłä#Fī,3^®ÜĶ‹ļ‡c``Ó§O÷źŗDp079ė·ģ@iń“(++ƒR©„V«õłŗa×®]»ęóUBN‡ķŪ·#Ó3S¾+I("nšęńĻBŽ2dMXÓķ§xŽėŽ…Čæ6"ł·’og„£;+]?{pŲsŠ:PPPą÷"lĀæTʹwāšįĆ>w›’›” †įČ;ūøŽūІBŲYųzŗ:3 …Ń»šGāŹmŃpü0gŠ_Q BL–:Ÿ‡@4ĻkI 'HØ$ŠĆĆśØ†:o¾XKż)ē<Āūo8”w“\½-ēžzWo‹ńŹõˆ©ƒ¶äU(ŅOJ "‰”—澤„gf®Dž¦gPrŠ R#Įś®@Īćæõ&‚š5ŪJßFtģl444ų4”†Ä †!&nņ7=ņBŲŻŁĪĒwŻsß:ŸÕÄxˆH±ķgæc£ŃA|²‰!ALqv>y}8ļH£˜Ā_° SŲ¼y³Oā‡$†1…yóÅ"“ž³š8!A*«~Œ—7©ÕjÆĒI ½Dæ'Ā„·i¬Æåq¼­/ć֙ĮŻ_—} w¼ŠčŲŁhkkƒN§óźµI 'ˆJ„0śé ō9ģ(œ²`y.K—ūyGqcœ=L_”––Ā`0xķŚ$†1)ß»›×ę<ž+o‡ FMJŚŽŅ›å$†1Åpwz«žŠ°Ė3gĪōóNˆ@&Ó³ˆŽ »ŻīµVm$†1Å`īŃ{ī[‡Då¢1æ¾óütž?ćķm¹@}I‰‘»KĖŹŹxó“‰@bč%|1— ¼ sN— [3¾;ź÷^|{]…ś’čåŻÄčqw—NĆ B 4D°ŠŻŁŽņ½/æ{“žĆ?¢«ł,¦‡K XšķÕż]½2ąÕė”Ož¦g)ńJv)‰!ALX—™ÄŌōqgZNVŅV予é7;P©ßƒJżžq[Œ—¾źÄĒĒėõÄŌ#B"åÅų‚ ĄjµŽūZ4ĻŠKōtvų{ 1,õµ°ŌŸ<°õåq_g ĻųęāĄå>;*õ>~’-—ó>>ō6 •œC„&Yź|T+`©?N½^?®ėe8A˜›”eĮD Ā’f² “*®_°"p¦¶Å?KĮ/ļżŃ!€®ę³ŠoÓµmƒ–!%Ļc…Y‡I¦!1ō"”DC"U†rž4sOīŗ ]+mÅżX°Ü)ˆżž|bj:¶•ŸÄĖ'ڰśßu‹Ķ ucŗöÕ«WPY1vę&§šŁ‡ć’zŌŌT”DC};OšÉÖhĒķ¶“œ<ĪĪŪśh~½ŁZdh±łĶ£Ų(¼Ē-Ī“Aėq¬°–†dć!Ó3” ¦¦f\Ö!Å ½€L&@żI‰Ąćƒw÷ńN3?Ķżłø®Ńlžś_n@TĢ,ܓ»i+œķŪ†KĀłųÓm3kLėō÷:-M² ‰ń7«~ å{_‚F£s2 Y†^€Ź+ˆ@¤ĻaĒ‘wöĄøk  Rļœw©ūŽüīyüņŽ”āÅ_ Łüɐs›ĶŸą£A1«KöÅ ‰ rļCńR‹±&ҐzfvSF)@|šī>ō÷:3kB{³5ZL—ø<÷éńCx}s~»~%ź?ü#.÷9½"Q3g!nŽ|$¦¦É½ze§˜!1A"$R¬~ų1c’z„R čéj÷óNā:ް  Q¹O8ŠŲÄł€ŲÄłøs‰³ą¾«ł,ŽŪõ4Jņ–¢āÅ_ąrŸ…÷Ę<‘Y…111Ś+Aˆ­Ć±Lµ 1ōL YAų›*C¹W¬BĘ­3gc£PĖsŃÕ|]ēĻņ$šØ˜YčwąÓ懰ēŃU8Xüč˜uXYó²Äx[‡‚ Œśu$†^@&“A*užņ·45śy7— ŅńņŃ”ßć£Cæē±ĮRämż Ųņ2.÷9Pńāӈš9 Eµx`ĖĖHLM€qµiė£äĀ‹0ėp,™„”Mź%”J%jjjŠŚdĮÜäo‡˜ĀŌUåu…ćķśĶÅłŻó.Ļ%¦¦#Qéü³QØĄ{/>÷v=K/ [³i+īGēł3ˆ›wē˜×c–”\.×~ BL„DŠ…™«Pm¬€ <Éq$Č2ōģĆni¢ŒRĀæy×+üiīŗq×~śį”!Ļ57Ō”²LĄė›ó°ēŃU˜!Įōp *Ė„Įx”}\B\ļąDnRĀ[äoz`4GUfAbč%XܐŹ+ŅŻŁĪc× ĘYüŁšĶŠüzæK­`bj:² “øsI6¦‡KŠÜPĒ»Š|zü/Į+,yF*•’^#&nf®0ŗŲ!‰”— $"`±ĀĖs'ԃK—£Ø¢ŁZ.~z qó棨ā$¶•ŸÄ[^Ę=÷­Clāüq‹oO§3 ›ā…„·ÉlŃ6ššCC/!—Ėłč™ĘśZ?ļ†˜Ŗœ®> `ü-Ńē$Šfó'¼v0[³O8ŠĖs1Šļ@e™€’¼„h6×!mÅżČyü9®Ä™ĪógŠÜP‡éįdk“HT.ĀŚo"*f>=~]Į¾¤Ś<̈"[³ٚĶćŽ7Å ‰É }0«t¤ø!‰”—Q«ÕČUJL.U† ć/§`u…ż>•⛋øÜēt™.XžėŅe¦«ł¬Ē©c„³õ< 99yĀ×"ˆįX˜¹ ŠŠŠ0¬«”ÄŠĖ0W)»S'_ÓŻŁĪė[Ēė"U,ĶęB8­æłK1ŠļĄK²‘·õ7H[q?6 ļń†ŻĶę±M²wēBĖ śBĀ÷8;Ņ8­ĆįiH ½ŒZ­†T*EOWõ)%&vćuē’ģqĒīXb̶ņ“X°ÜÕŗ€Å ėŖH ßŅē°óģåńøH/÷ŁQńā/P’·O/‹Ēoׯ„ńµķ0¬(ξ§įBĖćļWÆ`Ś“i” ĄiZNV"oėĖP,]޼­æĮå>;ŗĪŸwl’Į\¤¬§/ALdśfRܐš%Ģ2«‹ō›‹ųų}gĮüF”‚× >uą6æy”g–ō; ’嗿޺H„R)¹H‰Ienr ļUź.ˆ$†>BœUJų„/čīlēsĒ*P–“•üg}ńŌųGž8nŽŲ(¼ĶÆ÷czø3s“āŧ½°c'-ƒe ä"%ü"m €”Ö!‰”Ńh4®»²Ā›0«P\8˜Šu5ŸåM·Å¢ØXŗkwģ\ź¾ĄK+&BŸĆĪ ķÓÓ'žżJc%eW)‰”a=šŖčsŒÆ‘1A GK“ÓĀO¼š§¹?GQÅIŽpp ž»(&*ń"ūK/LxϬ9@||<Ś~Y†f³ŁåyC"—Ė‘‘‘ųąŻ}~Ž j°’ŠńÖΈ"mÅż(ŖØV?:ō{žP3ŃX!“ 8%Īž"&nĀ#%°Ūķ.‚Hbčc˜«”õŽ$oĮ¬¬ŲyóGżVWųō²x’,Ę×¶ćrŸ}XQ<ņ;ē$ ÷®4攄ÉĀĒ5‘žÄ“uHbčc4 O¤©2”ū{;DˆĄĮGÅĢS™ƒ¾x/œčwąć÷ßĀėŚ<~ܓ(@¶ĘóŲ›±Ą¬BŠžfn²‰į¤Ćb‡UF² ļĄ„e,Vaż‡¼>¦©@ė2Bœ8\ō{*°śß5®±PbęÆ$†„æńdRŃż$ Õj!,õ§ŠX_‹”Į‚/,y&n bX©€ŃĄG‡~#æ{Ÿ~x•z—ūHT¦‹ž,ņj¬055Ó§OŸšõb"$$9-ښžY†“€L&ćEųå{wūy7D(ŠÓåœ?Śä™ĪógxĖ5ćkĻ£Ræg0VčŒ67ŌįR÷ ō;p¦¶G~÷<ö<ŗ Æk˜š^ūv“ž;ąz{‚š')Ā#„EĢ:$1œ$t:pė &Ė$š9ėg:čsø$ĘT– (É[Ź‹écēć-/ćžūÖńR Ą;±BV™ššJåDĄ07“ŁlH ' ¹\Ž‚‚dC\³:ŚX^¢rŠ*j”łõ~—Vkgj+§C±49?‡§ƶņ“Ųø§bĀ.R±UH±B"`®RV|Ob8‰uHxVR1žĪ3Š„˱QxĻ)t¢×üž[(É[ŠJż|s±·Īœķ•X!³ “’’0sęĢ _ ¼E„Ä™…Ķf’N"dŽ §Ó/œ>8q~<°ÉöbQčw ²LĄĪ|§(N”īĪvn®X±bĀ×#oĀ2JI ż„N§ƒT*…„ž5š&Ę+QK&épxE`ō±Č‘`qMЁ ‰”ŸĖå¼īšĄ®b?ļ†Fŗ;'Ž0Ū&ŠŪŹOāžūÖ!mÅżŗžø®2H‰@„•øµµµ 1ō Z­–w„9ņõ,%ĘĘXĖ*ĘĀ­3g#ēńē&|6Ē3##ƒ¬B"ą±Łl$†ž@&“AœŠå{wÓD "¤h¬Æå=H)ƒ”dXF©Łl&1ō©©©čļu»”¬›‹7āzަĻaǹ†Ļ8“f½ŪL•”ŪÖę`ŪŚÆö>ņĪ>”<łæŃėo¾X„mksšę‹Eww¶£äÉGųõZšł-M÷@ %\r= ÄŠ0ė°ŚXA„ÄØéļu}įdņym5ž~õ āććƒb2E•±–śS°ŌŸņjļą»ŠqŗśŻĘÖ`qŌŃzĪKż)^FćNµ±§«”“ųIĪ’l ö’Ć}ŒīĪvH7ČMźgT* „EOųy711.“ü7Ÿb,„­MŽ–‹YÜŽąŽ‡6 :v6f®ōŚ5Å,Ģ\‰čŲŁø÷” £ŽCKS# ļ[†G—ß=¬ČN5RD »I ż +µčéź ŚCā†źżÕ+ų¼¶€3i& ģ[šŃßė@B²į‘ō÷:Š=XĆ9Zėk=zuŻZ‚•ŸcnrŹ ÷ŠX_{ĆW÷5ę&§ą@åēxtkɰÆqßCƃDpH żŒL&ƒ^Æ”ļ}‰ūū Āé>ćKŻsR©4h’f˜%;‡÷©dĻ­Ļž1V+īĄ¶µ9œb“ZqV+ī@wg;޼³«w h­EkÕČ_”č"XģÜįnpėk‘æ(ŚÜL­UćĮÅó2źµ£cg#!YüMĻ@‘¶€3Ęē~3,¶ä&’l)ᙓģ}(Ņ#]äĘmijtYaęŖq­¬z½R©­ē,ä.%‚†«WP7XSøpįBČår’nh °9Š“%ˆ‰sėŽÅ’XĀ ktĄ„+KmÉ«Čßō,ÖoŁĄ)V£õģÄÄĶĮ΃FäozŪJß²'Ftģl”¾‚ĒŻ–¹É)Xæu¼~ėģÆ=X¾|yPdŠ—Qø×󱟙 4rwŖÓZźīlGõ`MbÉA²ŌcĆņ½/ÖoŁ1bFØ'¢c½[_Ź”µÉĀ-`ÅC1$†ˆ8~8\ ‚šWÆ  Źąƒ¤¤¤ ÉĆ,Ć̜<±|‰#–/¹Čø» ™š„&”ˆ ēcāęŒk}vč¼Ž='<ņŗõ'NŠńUל@F.—#ģŚµk×ü½bxT*jjj)Į›Ē?Ÿ’ī oŅē°~µód #oŚŗ'Ā#%üK’„©'$).‘NčĪ›O'¦¦c£šž·¶;*Zš,|4Ó<€äääI]?ŠčīlGÆż†]f†ƒżß»Ń’&޾“ŲŽ¼³v#:v6T~ī³uņ½»Q¾÷%<÷ÜsøŁß›!FĘ`0@„R”””EkÕ(9h A%-Mhm² „ɂÖs—:Ŗ1=\2ęIņēĻb ßy}Ö8š,²L,SŅ–šģń~©NŻķ.3 §ŗć2"Fyc7Ē+qĀᨫ:Źk›ó7=ć³uƇµkS©Th=gAiń(zåķæpŠŃē°ĆR_‹Ös4Ö׎håÅ&Īnj ŽĖžŽš9Ėk“ ¾¹ŲK/šĶuüļĖ}t5Ÿu™2 F‘¶)iK H[āń‹’¹Óšź¼²ĻŃpé«||ĢY›ššJ“ėCˆīĪv^'©H[Œ,u¾Ÿwä?H ƒ„R “É„»īŗ §«A(zŚ’Wż½-æć½ZŌUóŲ€˜Yw‰ŹtÄĪ›Ø™³7ļĪIŁŪ­3gsaMT.r¼óü\ŗx]ēĻ¢Ł\Ē­ŹėéL˜`āø0s%ę&§LŗWąŅW=Ø2T}Ā į–I.‘øtĀ™ŠPĢ0ˆŠėõX»v-gJųTDfżÕUĆéź£C\ž±‰NįcāˆóžF⛋h6×qģj>ėr<|˜,Ć`B£ŃÖ®]‹jcR¦ˆ[£®ź(Ŗ‡™Š‰Š™ÅÅO±43"‚ūśÖ™³qėŠėĪıŁ\ĖÉJō÷:øĄG¼‡¹wž³ęžĄė{ ”T*%! a¦ŖŠ‘Éd$†Į†XŁ”ėP˦Fyg’ 0*fK³±`E<żĒ“÷pŗV?żšź?<„~š>ūķųŽ-Ó0+a’R źöč Æ+ĀiÓ¦!//„Iś׿[ČM¤h4”•• w¼‚Ųē°£ŚX#ļģséņ1•p4¼®}Ķ uXśšÓøvÓ-<ƒd·Ż¤Ō˜•0·L»€¹ ”F£ ŗVk1ZŲĒK—.‘e¬°5eeeAo!vw¶£|ļK.Vąōp K³qOī:@7¢fĪ|w?}ą’ą›ĮDœ®ę³°}ż%NWĆē·LCB²I?ŗ{Ōn0BbŖBnŅ Ē][š,cnśėOėkqä}.±ĄŲÄłø'w]HÄ}Å­3g y|ėĢYHśIzŚ›Ńl®Ć@æżĖgųė_>CBŅHHVŒX«FBHL5XŚųųxTZōčõz(•Jl޼¼»ż½Ž€Ļ2m¬ÆEłŽŻ.5v –ē"mE®Ē2Ā•ØA1ģnqĶ6żŽ-Ó7o>āęĶĒ7/ ķģų²£­ēĪ õܙĮ¹}‹‡ˆ¢³Žš0ś{$„Ä”ƒ ¤&1 “Z-d2Ļ2œ=-Kl8ĢÖhƒ® Ÿ0ĖšJļˆēÜ:s.÷9x™FOWŖļ¹ˆ¢§:BBb* nŅ † īe­M–€iŻÖŅԈ»Š¹N—ą§¹ė°`E.‰ą8ˆl׎xś†ēΈpĘ^•éCDQvŪčļup!¤ņ b*Į†831¤©!„F£Į‰'ų,Dmī2æN»čīlwvĖÉĶäBø`y.Š*N"[³™„pœˆc©¶ī £|Ķ`BŅ}ė›čSŪ×_āļWƕOSֵе$1 1T*L&āććŃÓՁ¢µjŌUō}”ļŻ mī2ī¶]°<ŪŹO"oėo(1Ę $¦:ū©Ś{:Ēōŗ[¦²øD’ Ó#eüł7Žxuu“×ļ” ü Õ%“9ØĪ0D±Łl|ŚąģFŸæéYŸÆŪX_‹Ņ¢'x`bj:²5ZÆ'Ę_ŪŽ®ó×H•éSŹķZńā/šéńCXśą“øēĮ'Gõš«WŠ~¾ —’HLLÄ÷ĀžĻOVĆöõ—€˜˜¬X±‚»Ž"ésŲńąāy&$†!Žø8aęJīxÕ'qÄ>‡vsKpzø9’ŠwOń6O/‹÷ųü[^öٚÄG‡~#æ{?H’äæqĆóū{ķh;߄|÷nŗé&( ~G 8g~~²š»M.\•JE®S"$asA322`2™›4äŃėõ8xš ēTnmī2^_ć-źŖŽāŃå?ęBxĻ}ėšŅ֗‘9×÷3ļ,Ļ…ę×ūyĢųŚó>_3`³{Zžļ Ļķéź@ė¹3ųĒwß!<< ,pB˜›¬Ąź‡7 !ÉŁąąōéÓxć7`µZ½¾w‚š7,÷Ō IDAT“T©TņēH §_|ń…K‘ óœ};Jž|; Šßė@lā|lÜSœĒŸĆm¶Æ‘üŪ’Ą;žĄmŸü—Ž…gn9 Єˑ­Ńśh6Ā7›?qy<œ²?Įå>»ĒćĶęOŠyžĢø®=Q˜ŪŁŽÓ‰>Ļ‹Æ^Ął3fī²Ž‰‰R©ÖŚ»eŚt¤g­BfĪ”Ąn·£¬¬ ~ų!|óFĀ“ Ę ÅbH„S„R ³Ł F£Ńˆņ½/”®ź¶½R6®)Śī±Įģ-²5›łńļf„¾”sĖÄżéčĪĢĮW‹²šŻ÷#¼ó¦D̈ø ~š»3"¤ųųŠ[8S[‰éįܹ$ż¼·ėi|s±—ūģ\,ĻÅ=÷­C¢2Ż«ļe“°uÅõ†WÆ  õœ;¬ųĒwßA*•bĮ‚£BĘ-Ó¦ćī„™.Vā¾}ūx|… ‚•īĪvō÷: •J½kšL&ČårŹ> "4 T*4 jjjp`W1źŖbż–˜›œ2ģėśvģ,|Ä„f0ēń_©TāęĖżˆūÓ÷§?ą«EYčüكøz[ĢøßKż‡‡`9YÉįŽsß:@ڊū¹%;o>ōæÜ€~:ϟA¢r¢bfįR÷||č-t5ŸÅōp īÉu¾– k¶F‹ŸęžÅ?KqN”?Y‰øyó¹E8Ö÷īm܋ļÅÖ ąģ¹8ŃßKf%ÖUCgėyŌŌŌĄjµR]"“x² ‘eØR©Ę’°&ŠĆa³Ł T*”Õja0¼æcZ­jµŚ§k0Ģfó¤­åOär9L&öģŁ©T Kż)hs3Q¾w7ļĢ ¦„©.’1,õ§0=\‚¶¼Ecż)L—8ŰÆćž×¾ļ-u{“‹ŪŌh4āāŋX±b…O×%oŠŅԈž®H„Ņ!bųO€ÓņŠR{¤Õjłˆ ±ė”u6Ńét\¤“Z-ĀĀĀ —Ėa6›8kÜōz=·>l6Ÿ°ĄĒl6C.—óä³<™šø µ§kéõzČd2Čd27ÆJ„‚^Æēė°ż Čår„……¹¼¶N™L†°°0˜L&hµZ˜L& ŽŪÓžõz=A€Z­FXX?pZ–ģyAųg,Ž«7¬ķ¾’Ū۟ėńÕU£ķµ×ŃöŚė8óļ…hxdY‡’„’„?g­Ä_ł9žņČĻqׅ’koĮJiīś~¤ķV—k:~˜ĒSx¬Æóg¢é©ŠōŌ °½‚ś7ž„ś7ž„3ÅÆāÜS/ĄńCĻńĒog„£é©&,„Ćqéāõ~Ću¤©Ō œ–%ąt—~s±Ćepē`‡ö7³/÷ŁqėĢŁČyüWĪõFŁŌ“4Ypä}ų¼öž~õ fÖW~mmš“s›žšGwpÖ$VTTPłšX†q‘ƒ–”Édrqy²„& &“ :z½ž[N555r¹:V«×®]ƒF£ Šėõ0›Ķ0 P©T\är9¬V+d2ƒĮ«ÕŹĻaÆgĻ1‘ć~-¶GęĘŌétŠh40›ĶØ©©įē*•J.‚kÖ¬į®aę---å{bļA.—»J„rŲż ˜L&˜L&h4¬Y³z½žĒYu:‹ą²Āfv‘\¶?×:»p„³Ėå¹o½čo:7¦’7EF"āŸ“ÉIøY"qŽhģżl6¾ ĆtåO!‹›‹„¤;”H[2”6—RÓŃZ õIyƒ%–ĄĮāG]ÄpÖ^ź¾ĄK&,'+1ŠļĄ§B¶f3w«Vźt?‹~¦‡K¶"ß\ģĄoׯBܼł\$™ ś’īĪvXźOńR–iÓ¦aŊ˜77.žŃÕ|ß\ģ˜Ōvtw/ĶDŌķŃ8]} ēĪƒ^ƧÉD@SWķģÓģÉūw3ą“nl6·ŽAą®Sf”1+‰RFF‘ķŪ·£µÕ;bāÉ®ĖD•‰›Ųźa‚Åjąd2߇Į`ąŻ­BO×ŅjµÜ’“Ėåhkką“ĤR)Įi °ćĢ:d×[Œ*•ŹåZģ8ƒYzfČžŁšZ­J„6›ORĒē<Į¬h1Ķ;w᫪\ųFĖ“øXL‹uīż'i< Ÿ;,>k·Ū)Į/ģĆ_­ŠÖÖʇĎVÆŽĶžvF8ŗ~ö ŗ³rĘō>ĘÌ)V’ūÆpäwĻćLm%,ĻåŁ¦Ąu«P±43"¤P,ĶʧĒį£CoįžÜuČyüWøtńšźšéńC˜.AŽÖ—1#BŠ®ógqėĢYhnØĆōp ĻØõZžēžņ™‹¦§§#==‹Ž"m1,õ§`9Y‰ŸęžÜg{ń‹#V*ŠŻŻĶo˜©‘4śö[†b«†a2™\üŖ&“‰’Ģ,,Ąiͤ¦¦zŒ£™Ķfī»ƒ‚ p«SÆ×sdkyJžqæ–ÕjECCƒGµgÆgBÅā*• ©©©Ü-ÉÄ055ø…«Ńhų{0›ĶČČČq’ŠŠŠĄf„'ģ|÷Ģ[&ų6› F£qHÆ»†''įfI¤óµƒ"ēIųʃX’¼ 1Ąo>ÜE1)u¢nöx½+ƒ%›•€–‚ĶøģV{8^>Ń6āńŸęžЄٸÜē@ܼ;‘·õ7üŲFĮ5ʘ·õ7.Ēē¼ēĢ,ķsøÄ$•‹šŌc^x#ÓŅd„¾ż½Ī„O"ČHĻ\Kż)4›ė&] g1K‡您ŃhH‰€āō U8œ^Ż 8æ¼Ż­/“ÉäņœŲ}Ē:™°óÄbÅ[­VŲķv1[=f³™g¤)•J.Z­Öåzf³yHņŒūµL&RSS¹ą™L&.Zī"\æ+`w±,ng6›ł{fķš5kxMžų&`øż3k•Ē>7v¾»°3·©L&CAAĮwšŻ‡’]ˆųgßöłtB÷ĮĄr¹œī¢;I?ŗ³ęž`Ču½‘$3^&ź2Ē'ƒ«Wpī/Ÿ”µÉ2*d,Ģ\‰»Šq¦¶—ūģ~©}d‰5U† Ų¾ž’‘8źŖ7±īFćfqœPŒXül6ŚŚŚų9,^č~ąüRaHRŽŻīZ»ĘbpīÉ"bK Ŗ»P»_‹Å Å×`V¢»ˆ3—%ą"AxLϽĘP­V£°°’b‹o†ŪæÕju±Łū©\€‹e)ęf‰ܙŽäFB(†‰āŋQWW‡††ōtu §«į‘$$+¤@„DŠ® ”LL%ŗ;ŪŃŚdAė¹ė}NYwŒ‘D7 I “ž³Ąr²rܙ­ß\ģpĘOĖKī\š=¦‚[¦MG–:‘8śvœĆįŖžÉŻõĒ[If³R©tŲXƒ%ŗ°šX`ććć]„ƒI$ōz=¤RékÉżZāćV«F£‘gƶµµ¹¼OY©L kjj<ß°Ÿ‡ŪæūĢźf绋'KÄa?O6cB13gĪä7 ˜6mś{°ŌŸĀļīĒGĒóføÄPśv4Ö×āČ;ūPm| a||DbXÉĖŽ‚¼ģ­HNNīsŽ6‰”“`įTė°špĄ¼įŗŗ:‡ aWš››ĮĀņ--Ży‡„E"x|BÆ.»n†–Ęz˜¾iŅoZŃŚŌĄ«@¾¾¾ˆ‰‰D"qˆv%õ¾Éčh³`é¶ü>EģŒįģxVČ3Öó³kA „Ę|bXYōąhmj@NNNßaRCē`0ŗµˆ8ꉖ——»våŅ„K0ØŖŖāUĆ]ńöńÅŲń!‚0‰<>cLJ8%¼zį›V\ī¼$žÅŒ ß“v {2Ųź¤˜˜˜a j2W Ø wϙ߭wŅ6ČVēsųäšv‹‡ž‘‹+—;ŠgžyĘ”×#(-<€i‹ÅżVō“z …aCŽ®ĻŻ…Ć Gę=² B½<īGšńõCšųųųśFŽe×V???Ödóx­ļsXhČ/@„Ģüc=N¤9ß܀©÷€MH•U2&KŠx}XłP…SkŖ*ł›Ō‚ l>ÄPĮRżĪ0H G8֕£.|‹_Üąl“ˆa€ ōåŃ1į ›|;–jņqĘP ķļ…ŃycC# \’&§܁œ5‹qŖäLSõźi”ŅĀØ­>E-„Ch·˜±xĪčh³Ų½“~”ćĶ"œ…Éd‚B”€ŁlFlü B"uŁónlčč‰ų‡‡ņ•7±ąśFŽ‚7ž@č7üķīŸrOŸĀƒŠ~1vBĐٗ4—O©Ńét“ ‘Röæ³m¾]ÉH G0J„uuu ‹Äꬷm1Œ$)R$Ā…–³(;ō^ÆĒÅŽ?įSīą;pql<} ;T)|Ÿ£°Ȝ5‹q±½{õļĄmL·/ZZZp芔›>A‚WøoĻNöå $†#FĆ fVoĻu‹ž=bh™÷ä}{‡ æ@a¼_€įSī@Ł”÷ø@ņņ—q¾ł,^[4§JŽ`‡*å¦ŃĒ×<,T”–——ó‘ˆq30Æ0**j@Ė$†#ƒĮ€gŸr;‹V­w¹ŹQbxxtỼC@XW5Yš€K<7+ ļn~Ž į‚UDŲ”Ū±C•½Ēɲ„!YÅŖ_ąŠ”Cżö‚D_X{…÷Lb8aSīż0÷Ļ#P$wØ\’&&Ko“:L–&`é¶|.„Ö☼|-.¶›qD»ķ¦ķŒ‹Ÿ‰°Htvv"??’¦ĻGx.Ö^a_Ófz‚ŖIG*• YYYa×į“õpŚ-fØęĻBkSƒŻ¼­±Ī7ś ­‡|÷7ķĘ^;Ł„š=£„±Ŗł³TAj y†#½^¬¬,@Ęś×I ŠÄ6•„Ķói×<ݧ„wŽ?€°7”v %/{ė€+H­!1AX‡G’ę:×ĀeHR¤"$,—:,ųųż·ģ~œu…éƒi*Ä?ō8OŸĀ†”ū¹…WȘ‹šč)`W“4A0jŖ*PT „Ų»–Äp„ V«QWW‡€ 2Öæīls#cƒš;q$WƒóĶö°³ī+<ß|¶[…éƒi*!l<}ź¦ķL˜ż0o·(--½éóžĮīĶk Ōb§œįĄh4"::°:+—¼B¢GV§'£²ģų€V6•zoü ƒ…LOŸĀ­§JŽZ3žcžÆl&Õ\l7ćć÷ß²{zMuł?q²ä(|}}ńĢ3Ļ،Ģ#ˆ®°=žb±ƒaŠĆņÉ3°šhlü B¢WXÄąLy)*¶ė1ń=ŽõVŲT™Z įU BøŌaĮ‘\ ŽX<æx$WÓo{cšōn^]JĶųD_“[ĢÜ+T©T7µ5†ÄŠĶŃét(..¦š(Ń/”įy1Mž¦ēTLs÷CóÜĀóĶ 6ÓiLSį•ż’Ā‚U „UOŸĀk‹ęņü"ėf¬˜¦ŗŗšc'ˆ®äeoį­ƒĶ2(LźĘXo­O]ö¾0›ĶTLCŲŠn1#+s ##cHśRI Ż“ÉÄ77§.{žz »‰‹Ÿ‰G «š.eų_Ÿeʾ2*¶BæšNaw«5>¾~<\Ŗ×ėi³ĮÉĖŽ‚Ö¦ˆÅā›2H Ż•JÅW3¹ū²^bųI]öBĀ"q”å,_Ż4˜’+@Ł”÷¹wYvč=h’“MhōÖ ųųƒ·šŚ¢¹ƒŻI1±”³³“¼C€Ż’Ī›„ÅåCUmLbč†Fäęęå ‰A(ópé?æowu)#ž”Ēq÷”ØĘ/PÄ‚7ųģ®H^¾*…\ß„ šNŪN¬Éßō;»*Lļœ)x‡„„„äz8]Ć£ŁJŃ$†n ÄĘĻ@\üLēCø-qń3mŖKŹLyńOČĢ?†3†R!\ŖÉ狁ó7Żø?lŹķü±¬ēŻĶĻõ+ˆ“¦ņV ņ=›¬5+ŠŚŌ0$Õ£]!1t3Č+$†’Ōe/ zZ,.uX ]óō ĪńĻCBUiW!ģŗŃ?PĢ—³JTxwósżz¦lĶy‡žĖ¾=;q¢č ”„l؇1ŗäCĶźķ¹”é̼YŽ^üÅXŖÉĒ3ÄowčQ»ųfMśa“oǼ߼ ÜƒģŠš‰äz05U¼¹~Ū¶mÉdC~ C7‚¼BĀ„†Oä>žą-»'Å0üÅH_æ ·NˆÄĆ'ż®|„–Œßī>ČWJ]ź°ōŪęAŽ”gŅn1cćŹ4@rr²ĆzNI Ż­V €¼BbčIHšĖŪ- ŽųĆ †n !Šī+ŸŲ“šž6] $O>‘*K=O”µ©R©”æ:C7ĮŗÆp5Ų`ń‹?ƒēŚ ĮB¦cC#šģ®|~©õH¶®+ŸŽµ ZŲōvķŲė ƀl#ÜMę T–‡X,Ņ6Šž 1tt:Ģf3BĀ"i7į0Vg½ĶūwØR,ˆįSīč5w8ļ7/Ūaž¦ßįL¹ąį=š‹_Į?PĢļļķŚ¬ļŠl6“ Žp uy|G”V«uHžŠC7ΰRx‚p"q—‚š7ä³ŖŃ®¹C–ģZQ6łvŽČZ.šĪ|Ń« FĒÄ ļp$ĆÖ2BĮĢPöö‰” ×ėłāŽ{g“WH8–I1qX½żmBC~ž¦ß ųžb.pŒĘÓ§Pvč=lH¹ß¦¢t©FųōæCµ€ ¤_€ˆ bW¦żō.@]]š››lįŚXWަ„„ ېöŃź”ī\$†µZņņr<ššcų¹9ŪĀ`­ 'Š¢éĢ;!¢ĒÜ}uū8ß|Mg¾Ą©’#(Ż’7œ*9‚«W:“„ X¼EØŽŽ”JAżæ?ē÷ÆĢŽ‹ś/>Gżæ?ļvķŃcĘ Ćb†éŪs3f ¦L™2DϚp65UČLW £Ķ‚ÄÄDčtŗa»6y†.ŽÉdāķóž\S4A †$E*­ZvMŠé‰”’å+oblhæ/lņķX°źXŖyŗUš.Õ¼ ’@1ĘNSyģH·óRØtäa-„R©tX…Ę ėՈĆ~!¢§ÅbRLœ“­!<yO.AMU%Š ņłČµų‡Š9bŲūēt»æńō)¼»é9.„ŒóĶ Ø„ę€ĶRak¢§ ”ŅźźjšHć¦X ”X,vČĢQ{!ĻŠ…a!Ņ{g?LĖ{ §3Tā¾7žŠmJ \h> ;!éėwõ{ž@‘Įć~Ó·ēČ;tCjŖ*°qe_Ņ«×ė!‘Hœfy†. =”0ūaēB× Q¹žMųyĄ3†Rœon@Ł”÷šļæ5ąsMŗ^HSUU5ąĒ΃˰1kF£Ńéf¼®]»vĶ©=b4 ųūńÓä.…&sŸŅuĚ=t •Z³t[>&Ėī³ė<ķ3ßz¾jÕ*ųłł ČbųéZ5ź¬aWČ3tQXˆ46~ !įrØ6¼ĪŪ.Ә>ådęĆdiæĻ/@„«žh·7B„y‡ī@”.Ļ%… œ”Ė¢×ė 4q†pQę=¹A"d­Y)ŒP;ż–jņłŒŃž{æ‹óĶ øŠ|–‹ Ļ·-€ĖćBķ:OĤ©0}{Ī%BmDļģŪ³“O–INNvųąķBž”‹RPP@(ž!W%I‘ŠÕY7f™īP„ xżÓ­"m¼Aßo[!Ķü5¦½ö‚¾¬č÷ńŃSgčŹh2W،XsfÕhoŗ ,D‰Šš‰N¶† ś&!i.6äčɱņŲ¾J£8 IDATįAŸÆs\@ōeb^{©_Q;>Ž>¾čģģ¤Y„.F»ÅŒŒ_ĢāłåmŪ¶9t'įĶ@b肰)y…„»0)&š÷"zZ¬°ń÷OćˆvŪ ĪÕ5<ŹDń§™æĀøOž·ĒĒDD óIÉ;t*ŹJ°xĪ¼‡pļŽ½Ć6t{0ŗ L i›=įNŠÄČśą(o½8’«ĮՂļDģ ßo[1)WÓ£(†\ Ę!¹qsäeoéV(3k˜nCĆd2ń©3±$†„¢Śš:2ÖoG@gŹK±!å~œ1|2 s°PiO0Qœžģ„}ųwŒž®!a”𺺺›²ø9Ś-f¬NOF^öVB~PÆ×»Ea‰”‹Į¦šGO‹„– ĀmIR¤bCŽŽ‡Mw<›‚‚7ÖŁķ%vŚQI:ębniØ x„AB#?y‡Ī”“šϹ•eĒ!‹‘““ćr£}Abčb°)[Q3’h·˜QQVĀoަ¦Ŗķ–žß|ķ=Ž“bā°!G‡G «Ē>žą­AU›öÄU’|õL&N/]ƒļo ¼I*¢^Ś-fh2W`cFšMXT©T:Ū“AbčbÜČĪp®!ą‰S™®ą·y±?‚&s…C„ØP—ÕüŁČLļ;OaļqÄą‰±ųÅ 6ķŪĻÅķ¶>½ÄĖ}„I-·ÅįԚķ0uiν*%Ļpų(-<ÕüÕ¢n»R‹ÄŠÅąaŅč2BĀ"łĘ¢‚|lĢxź¦ĪWSU}{vbצL~_G›0ꫵ©~ĄĒCOBŅ\ģ:|’WHÉÕąµEs{Ķ%ö&mzä‰ņÉ3>Ś-flXł6fƒ¶£¢¢pōčQ¾rĪ” 4.„Ńh„Ł,|Zɋ|“)H]öņ²· /{+*ĖŽ£„±~Š=•»7ÆAeŁqÄZyÓl:Šu’½ĒŽ!P$Fęö·QZx»7ÆAkSv<›‚;f>ˆäå/÷ŗŖ ¾‹ˆĘÕ[!ś²ѹŪp*s;2Ųļū"þ=;‘—½…ĢČȀZ­v›Ü`oŒV«ÕjgA äęę"6~’©Ī6gČafqń3yŪ Æ$$ cēöæ#ü”䣣͂iŅ»­æ•e%ˆž‹ģ?<Ž63j«*q¢č ’ĆģhŽ[›P[]‰ŚźJÄÅĻD”.Ϯㄅ«y‡ž”pćĆIKc=öæ³­õ#/{ >ųėv‰1iŖC^·‘FĤ©˜œ‚Ė—šåæ>ù†3(;ō>®^ī“É6¶¼ŠųČØY“ &inżē’Į÷ŪVx]¹ Ėwu;÷ٚÆpéāwH$n’ęģjT”•`ćŹ4äćŹåNH„R:tJ„rD H'ĻŠ…ąÅ3ÓFnˆŌšÖĘ”ɐ°HģŪ³“o €Ź²ćØ(+Aęö·ÜÓB]>Z›‰Š²“65ēkj@^öV¤.ƒĶń©Ė^@aA¾]Ē ’ŽĀļcvŌTUbń‹ųc HÄŵ²ģ8VgårQ'ś†å“)Üc?’«AŁ”÷ń R…Ł“bŠ9.µiĻ¢ķ6įƒČ÷·¢6ķYļö&ķCŪmqŻņ†"1LߞCss³Swć$Z둵f*ĖŽÄb1ŌjµK7ŠŹŗ,ń?ŅG°µ46šPpcģܼ'—`×įϰÆņÆ@\Ązég_$)ŗ{tC…µšvzP[]I…6$P$Fź²ščĀ%Ų’ĪNģŪ³gŹK±ćŁL–&ąī‡ę#ž”Ē5iĻ"vĆJŒ-/EhaZ’’aR€<ĆĮŠŅX¼ģ­\ 11jµr¹Üy† äŗ #=Lš¤HĮƜĢ{r‰ą0!L]ö<6äčœh!įL˜(ī:|’{ŠgŹKńīęē°!e&ʽ‡ócĒ”ń‘'ažļ@daRŖ(µŸŠ²lXł”'˜˜˜ˆ£GBÆ×{„$†.ƒ§Ļt„Ā*<É Yœõėßn1Ūä =õ’ĘYō$Š,§ø!å~ģ0~…:Qp·p©·/ņū¢ŻbF”.昅ĢtN\Ļw'''{œ2H ] –×ņ4Ų\I@—ÖVUöq“-!a‚']Yv»6e¢„±ēܝ=ĒYēk‹ ņq¢č·B¤ĪĮZY”Ķ„ >žą-¼šy)ھ’¢/+öįßPM_ŌTU\Ļމ¬5+łz„““4ŌÖÖB§Óyœ2(gč"xŗg8)&ŃÓbQ[] ÕüŁ6āŲIŠŽŁ’Ī›½¶7Ųs\hųD<ŗšiģēM^ķ  [H—~Eb$)R‘¤HEEY öķŁ‰EńFk^śq$Ā?ü;ö}u Wį-K—.9Ūd— „±Eł¼%‰•J„R9b‹b‰”‹1’ßpS—= ÷ÕT«·ē"/{+:ŚĢH]ö<ݰ‚¢Ž?š÷‹ųńģė#čq‹_܀I1±(,ČG@IÉ)\8CĀ"¹Ģ®¤äÄÅĻń…O®ÜŠŅXEQ]tÓ,fü¬¼6Ōąāč1øÖzż<Õ#{?kŖ*PYv…ŗ|›¢0±X …B•Jå–óC‰×µk×®9ŪP©TČŹŹBź²ēš3#·¤£¢gRįõ]Ž;’ Ž8÷5’ q'Ģ~±½“Ōø;ķ3*Æoƒ9QtŠĘ„\ B”p»MĆ ‰”‹ —ĖQ\\Œ 9:ŚpOƒ`̉cŲņ2 £¾µ>cÜmįoHX$bćg".~†ŪŠ#æŚźJT”•š¦x†X,†\.‡B”€B” 0ØP˜” ˆĮÕ{ļGēż¾}€=’p|XXƒĮ½^N‡āāb“65 Ø Ÿē‚DˆŽ‰E\üLDO‹EtL¬K d»Å,ĢĻ­ŖDM•šµė J„Ėå\‰AbHø,yŁ[ąś§xņ–‰ž¹“ ޟĆĻµ`©Ÿ°ÕB&“A&“ńbz½žß Ģf3*ĖŽwó®bćg HŒI1±×ELD@Č!e˜ąu\’j-€½ ”°?¹\NŽßMBaRA"‘ ®®ŽĀ¤VĢ‹żP•—>)Fč×nCƒń?›Żēńƒ”ŪĶž¦}6I‰Į„³7Zŗģė*Ą½!•J!“É ‘HøųC y†.ĖkŒD!li¬ēeš^‘Ļ‘p¾3¾iAśųPTæō{ßs7ĘōŃæĖ&|„ó!1$JMUvoŗŃ¼¾{ÓˆDؘS@ؚ½oĻN“65 6~­ZßgN¦¦Ŗ‚ļæc+œXŁźtaXs겐•¹IФ.{ķ3vo^ƒ¢‚|‰0ļÉ%<ģZØĖCaA>fĻEG›…ŗ|t“™±hÕz›Ėķ3Š ņQz}"MĘś×>Ńfk»=öއælj> mܝ0śOœĶ}i ‡ō:䱍,H ‡ŅŃf±©|³ž¾P—g³Ó°²ģ82ÓŲuųdĆZėł0o6­fcFvž ”įyže揧lŠ2ÓØ­®DHX$:ŚĢČĖŽŠ°H$)RŃŚŌŠcńD֚•ˆŽ‰Å¤˜8“[Ģü7ž—„…°1# €ŠĄ_YvW¦a÷‘“CšŹ7ĖéĪKˆZ¾5ÆnAŻ;|ĻŻüIŒ³Ķ"\šMJ8”øų™6(6äč°Æņ€ę]ų44ļ ˆ'›Śa:±ń3õĮQÜ;ūa°Y9ĆĪ1;9±ń3QØĖCmu%‚D×÷å]÷»<VgåŚŲŹr÷ę5üė·cuV.&ÅÄq!O]ö<²>8Š€ Z›šÆO”óāe“]čĄłĘ h>ӂŗS 8żY N}\Ļ’_>Ż’޽WŠ¢·’µåuŻl!††ˆ“…ßs7¾okCõKæw¶9„ Cž!įZėyńABŅ\ŠÄˆŸŹ²ćØ(;n¢d°åŗ!aQQV‚€ Į{¬(+õѱń3 Śš:@£Ėē¹įŁyįTY,ē,øhžŽ^·bĘ`ląmøŅq£&Į cp¦“µĀɿĭ£ļÅŌč»ŃōĻŃøŅy'ņ²1Ŗõ§sžõ?mØüŸ? äŹcųĮŪ }ę#ŁżZ<“$ ŃŅØ½€„ŻL{õ|¦ų%:ŖŖQ÷ĘD-_źl“„Đp ]«šl~v¶¦ŒFFa :¾¹ŠÓ'kŃöõøÅK‚ū’‰²żxa ‚GÉpłė|°eʏ¾^š†)^śW\¾xu_ŽA„÷ćøZ3;Ÿž£ąhŸ_~?ēU@„÷ĻŁK’ #”ā?¹ć'Å;śNĮ®ŖN“V}ĪķōõcĄw篸 Ą£¼€k×®ĮĒϾžŽšö÷æ||½…ÆžŽšõ÷·Æš½æ7 ”ƒń Ē“W_ĮĖUØ{cĘ%Ķ¢p)Ń ź3t¼¼¼€‡G U„_ᘮ%÷Ć cšÓ{įļ/ĀłÖsØ«Ŗ‚¼qkH8š½ŚMmøöƒ-†0z p‹8—/w Ķt?ą{ü4į>ųųy£ōčGø†«˜÷S„FF ų£ą\ż§~ IL |ü|ŃT’“Ū^ĘøŠ{f=ˆšc”·pޟŽ÷µ8‘v‹O̘@ų`Ā8õ› |[x¾įaøkļ?śl· <ņ ‡R[^‡Š#g }»šļϾ Qö%ģk’ę»ėG‚—ą5 šō‡Å|?ą*‚ĒĆ„ČϜB›ł„F„#.a&|ż½įćē ?Įūڹi®į*īč$ż||ż}Pøļo8šī_1.4ŪuEšöóĘļæöyŁ[—-“}ģü‹ąī}šŸ3ŗl öæųŖž0~łÜdˆÅ_^{p×ģ„Ćŗ„s`įpַǘöź+ųģ±_¢³± uoģĄäÕ«œaį¢P‹  łÆŽÓŗ+1 SńŠ9¾¹Z‚sW‹aö>މ÷{ałĪEš›Z‹³W>"NāĮߎće-j/ļĘKKńŖže4\ÉGć•÷ńÓĒDČxė<ņģ “^ż_TsŃ|±—üæĄWMā¾ĒļDā3ŃžC5:~8ƒ[%>ˆI˜ŠhiżÕB\…--§ńŹŹ¼·ė5ģŚ”‰ŠėłG{xt” z'Šbуw"ć³³“S6»6e"/{ vmŹś‘ʈD˜öź+€Ę·’†ož·ČÉ®‰”‹Ąz–śŹ„¹#ŃŅ(<¼däO<€ö¾ĀłŽ/šmŪ)LŸŒ%ė2įų=jkNbē¦ßā®"uŁó½INR¤ra**ČG^öVä÷8“˜>ė·# H„ʲćČĖŽŠżļ¼É‹qģ!uŁ üŗ­M Ø­®DKc=­ZŲųčh³`’;oņs®Kš=ńJšī«_ś=®ZzžūIx”3tŹū+^|ź\8×ālS7£ęztŞmwüYƒŃAA|˜7Ṑŗ,¤3’‚ ŗĆ¢+öl•š ēįҚW· żßUµp]H ]OŁiÖh<Fćg›AŒ`Z֞‘¶撄ŽQ —z.$†.Ėv]%4ŅXæ|!^U)m1‚a4}-ęķŹ“W_Įč  tTUćĢĘͲŒpeH ]&†€ŠĻF źņlŲ'6ŃÉ^ŗN§1}Z6ä¶® ‰” !•J Ļ‰*ī̟V=ƒ–Ę|]_ƒ¬5+ż}7~żŸÓ±xĪ]8üžž^ŪŅXĪÅϼ ^÷;\ūį@ē„‹ųͼ™x[³Łx»ÆCū¤š#(gĒaķӿĻł~3o&Ī}}–Ÿ»ķüyŻļšÄŒ©xżeQėė¼ū—?ńėæ·Kƒ4łXńŲąßŸꨗˆøIģi«čń?›ŠĒę é4ž‰” Į¼ĆÖ6Ÿ”5%>¾¾šńõGääiųāä ģÜų.v“£ŻbFöŗß”ęß=>öO/<ƒ3_”#bŅT~ļmģ’Ū.Ąµ~@CĶ—8ŸƒĆļ½[‚DøöĆų³ś·8ߌ ółsųĒ›Æ””ęK\½r…’įßvįĀ7­øzå2žß’ü g¾(ēש2”Į?0gkæ|~ü(ödmĄøćÜ×Ųøņ)\½B-®³gi“_z¾įačllĀ™W· ”e„«CbčBŒŌł¤Œł‹U;>ćBŒŸ§/GńGŌÉĒĖŁǵk×pģȾnū¦„ UåeXšĢsŲ¼ē#„EMĀLJl'‹üšżUģ<š)ž{ł‹Øżņ X.œĒ) y’(&ß.ķvĪ©±Ó±ęõ=x,}9ąŪ–Æńmėר*/Cød2žņa)~£~ PrxüüoĮ–æĄ3k6Ć|į[üėSŖśuEZ®Ļ V ­Ć„-{÷Ń0o‚ÄŠ…š“öŠŗÆ¾ĄoL»Ó¤waōč1Ø?ݽ“żlĶ—€ČÉ·]’: ĘźS6ĒL¹C† ‘Ą7_ŸÜ~W`źŻCfć'„&D ‹uÆ\¹Œ†3Հ»ųĘxūĄĻ’@ż™jLˆ”`Œ·&N–Āæ<Õķœ„óim¢*)žéJš=ń¼Ż‚Ā„ž‰” įi#ŁĢēæ…Ÿ’-šņņĀØQ£įėļ6Ółnǵ™.v½š‰„Ü‡ŠO”óŅE\ī¼Ä ±ØŻŃ.¼yłn ź¾ÄuŌha§įčŃ7v¶™M€±ćCŗ]æ©®K¹›®WĀZ.t·“p>¬{°ž!Ćz:Ķ©åŖ!°Œpuh¹Æ Į<Ǝ6 Zė{]e4Rųžū«šućó˜—×(\½r„ŪqWÆ ÷I@xŌd~•££®Ÿ{ŌØŃvŁĆņ€^^^¶v^½ŃŲqHJ^Ąļ›ŌCč•p.5UB¾Y,ß“B»ÅÉĒ~ɧÓD¤-¼és® y†.ŪĪķ Ž”hģ8t^üŽ’»óŅEˆĘŽŚķø@‘0 .~&ę/Vį¾’|Sbešõóļń¼·.}÷ŻõƽŚ`-|AbįŚ–ėžØõõG…ł‹UxģWĖ1%V†°‰Ńö*®‡Ho&_Ų•ˆ“…ßs7¾okCĖŽīÅ]Äȁ¤.†\.GVV*ŹJźlcĢżsęA’į{P/ł%yŽ’ą¼nĒEO»ć'„coΟqåņe|~ü(ī‘Ļéõ¼“?’[°’]ørł2ŹK‹ķ²'rŅm—LFUy¶>’4&N‰Į‚%æE|āƒ(-<€ +ŸĀ÷W懗—ķœtA˜g8”bw¼”AćŪć#ۈ‘ y†.ó GśX6øgÖCxōæ£łl=Z›ĪbĮ’ßāŽ»ļėń،W²ąķ拞ŗ?šŽ'32{=ļč1ŽüēŸźć?ęž¢w#ŗäŸŻųgˆĒŽĆĒ÷ņ³}÷żģœNĒ=qĄö5ģķõcķźIZ{ņåååüƒ‹5$†.ŒuØ“P—ēlsĀ„®io°0'ódz*ą ī&:C…ÉdāośGµ ³ö÷ø”FÆ×#99f³™{Ŗƒ9¦'d2åöGO…8ĄKģ’Ŗ§O$†.ó)TJ¶ģŪó&LJH{Ć:%‹!—ĖmDO«Õņ0¤uE„=Ų#ƒf³Ł&/6»‹‹‹m¼>ÖĪe2™l®oC§ÓA*•ņœč@a×d×cDģf,|ŪõõfāĒBČ=½^$†.ĪPéA“4Ö;ׂpZėł`īįĆāāb^ÕÉņRģ ¶¼¼œæ¹ó¢¹\µZ „Ri÷Ō&HJ„Z­ÖF …Ķ›<ó† t:]æ¹B Y²ļ™čX{Oģ:öxdF£‘?W£Ń±XÜMøz;Ęś8™LƒĮĄ½]V$£V«{,Źé öŲ‚‚Čd2ž»Įz·™ēHbč†H$ži§Ø ßÉÖ„k°oĻNBØŅŹ‹‹O —IDATY Ū‰QQQlĆniii0™LX·n ƒŻ!A­VĖß“õz=‚ƒƒyõfAAĶ›øD"AFFĢf3{ģ±…bõz=ŅŅŅø‡ •J…ÄÄD`ŻŗuJ„vU¦2OrŻŗuH$ŠjµŻžOz;&88999ˆŠŠB]] $ öīŻ ©TŠÜÜ\h4»_?…BaSYŪõg@ļĆhk… Õj‘žžŽ°Hģ>rŅŁę„ÓI½o2:Ś,Ų»wļ°ö: &X=åFūśŁ`Æ ż*,g£P(PPP€œœœ£ $†nBpp0Ģf3Vgå"!i®³Ķ!§QØĖC֚•ˆŠŠr›”Ł„ó`…F¹¹¹}žĪP˜ŌM`±š}ļģt²%į\XጳPīGnn.ÄbqŸyUC7¹õ•eĒ©†šX*ŹJP[] ±Xģ6ŪēŒµk×ö[‘Jbč&X.ŹĖŽźdkĀ9°Ā…Bį›÷@­V÷›„œ”ĮęīĄ®ĆŸ!4|¢“-"ˆį£„±‹ēÜØ­­uJ£=1r!ĻŠ`“ņ σżĪ§„„‘Cy†n†õŚņ O¼BĀѐgčfČårņ ƒż®;zÓ<Ṑg膐wHxäĆy†ny‡„'‘µfŹŽ…mĘŽ>1XH ݉DĀē3īŽ¼ķ–ž·<„»Ńn1óˆ‡Z­¦i3„Ć!1tsT*¢¢¢ŠŚŌ€ż4ě!äeoAG›QQQ4›H ݜąą`¾•:/{+jŖ*œlAÜe%ؒް™Āžå²1Ž ߎLÅ4„»ĆŠfŅŅŅl6»„#!1!h4^LĆ&ū„»‘—½…ͰˆA $†#‰DĀ+īņ²·Pø”p;jŖ*ų ­VKE3İBM÷# ¹\ŽāābDO‹EÖGmAŲE»ÅŒĢtj«+‘œœÜēFr‚päŽ0“Z-Äb1j«+‘—½ÅŁę„]X‡G©h†p$†# ‰DĀßLņ²·¢¢¬Ä¹D?”°©„š(į H G …‚jŪøņ)jĘ'\––Ęz>ˆ;## …ĀÉž å G(&“ r¹åå刍Ÿ9Ī6‰ ŗ‘ń‹YØ­®„T*…Į`p¶9„Cžį%88˜ē+ĖŽSžp9vmŹäyB*˜!œ ‰įF&“ŁL§”aŽ„«PØĖ³ÉŅF ĀŁŽp”J%Ļf­YAż‡„Ó©©Ŗ@֚•€µk×Ržp (gč!°žĆ°HhŽ?Š@‘ŲŁ&HKc=Tóg”£ĶBż„„KAž”‡ Óé •JŃŚŌ€ĢtU˜ĆN»ÅŒ+ÓŠŃfT*„~BĀ„ ĻŠƒ0 Ėå0›ĶøwöĆČÜž¶³M"<V9*‹a0(OHøäz2™ z½p¢č 4™+œkį1h2Wp!Ōėõ$„„ĖAbčaČd2äääŠ ņI ‡£É\¢‚|Bø^&“9Ł"‚艔¢T*m‘z Ga-„999“ŸpYH =kAĢĖŽŠB]ž“-"F]…P©T:× ‚čCĘZ³Ö¬$A$† BĀŻ jRZ­ééé€G>Å/np²E„;CBHø#$†[AœœՆםlįŽīŹg@øģM+==æ™‘ öŅn1c÷ę5$„„ŪBž!aƒµ‡?«³Ž¦ŃmDŸ“[ĢČLW ¶ŗ !įžŻŠétP*•0›Ķˆž‹ÕŪs>ŃŁf.HMU²2WŚ4ŌS!įŽ=b=ŗ- H„ 9:LЉs¶Y„ QQV‚+ŸBG›QQQŌPOø5ŌZAōˆL&ƒĮ`€T*EG›Ŗł³©õ‚ąģŪ³™é >tŪ`0n y†DŸ˜L&(•J JSO§k”LZZ4 ‚ƒƒlAÜ$†„]ØÕj¬[·(č”Xē`Ū¶mP©TN¶Š †CĀn¬ k‚DČX’:’ę:Ū,b(Ōåa÷ę5čh³@,C§ÓќQbDAbH £Ń…BņņrBŲtŃŖõŌ~1Bi·˜‘µfN$&&B§ÓQX”qP 1 $ Ö®] @Ųz”š? e%N¶ŒjJ `ńœ;¹®]»z½ž„‘gH ½^„R‰ŗŗ:Ā\ÓŌe/—čęt-’”¶ Ā ϐ4r¹ƒ€żļ¼ ÕüY(-<ądˈĮ¼A&„Ō6AxäCBW/ńŽŁcŃŖõTqź&“4Ö#kĶ T– xƒZ­–ŠdÄ2L&4 oĮaŽ“KščĀ%:uQŚ-fģg'ņ²·ņūÖ®] µZķ<£Ā CŽĮ`€J„Bqq1 $,©ĖžG’"ÕɖÖX·KB„ØV«…D"q®aįH ‡”Óé R©xč4zZ,½øqń3l™gSØĖC^öV“65B¢ …Āɖ„ó 1$ŽZ­†F£Łl ¬†J]ö‰ā0SQV‚¼ģ-±«(Ī[ø„¦Ų8˜®ž X,†J„‚J„¢žA‚ø‰!1¬ō$Š”SzŚ-fœ(:@"HvBbH8…žD1 H„ŁÉ)˜÷äjÉ$-õŲ·g'Š ņya ‰ Aō‰!įTL&“Z-4 /“„>ńŁ“·h'…ŗ<äó| ĘØÕj(•JēFn‰!į2čt:hµZ¾;¼Å{gĻż'ŸĘ¤˜8'Zēz”@iŃAœ(:Ą½@HNN†J„¢†y‚$†„Ėa4”Õj”Õjm¼Å°HÜ;ūa$)R€eęb RŚą@Ǔʁ’šĆņycnĒŠ–¹§yc2Iœ“,•o21į,æćą„‡cŁ›øÆ%óćr•§!7°¹C#e`Y.IĪ:¦3~|a§RśaYÖoļĻb±¤r©j×®½÷gOA©‰ĒY–%½€²Ūķ===4MgffFń²Ē9N…B‘“īt:ķv;Bˆ¦éq>i2?ę8ß źĆ#Lš<ßÓÓ3}śōųĻxpįšąyžÜ¹søO’’„Ēg²,ĖqĆ0ųĆØóĪh4Ā ‚*•JŲęńOIŃ:wīĻóÓ§O~ŽéĀāƒ½)“Éæ…į¾µ‘HqńāEƒĮ`0š››o޼922róęMėĻĒ/^¼hõĆŋĆ¼ŃĄĄ@qq±Õj‰%Ōj5B(œ»Ąć„yŁqvņXA_ „Į`Ļ}µZ-Bز²2ZbµZµZ-ŒŸÄB8Y"„uuuƒa```sß%ĢŪA_©Õjü§( .¢Õj£8”š]DwŒ‚=`8kŃX%4že Ö/ø·Šį|Ąæį²ĶĶĶÉ@ccq¦±ś**4¦T*BÅÅÅŃ}É@c°ė‚+ P%—Ėǹ4Ć(Ŗ««‹Ö^'œVĮv fŗpxU`2żD­VćU8ĢmMų;ČČ.Ÿ9(—Ė”Kń‡Šøyó&žĒ)Š¢(Źl6Ɛ‹Öˆ?{Ąhnn†å ó^‘‰Ļ---J„’eYš¦ķv»P‚V«Õų+|Šét𔦦¦Ä¤E„L&EQ†h>“¶Æ,‹ÉdŅėõŃRGŲl6µZ +ŗ‘©w,‹Ēćg·Š4mµZķv{“ŗ7ĢV “[¢öӘ©T*8ßh4VUUÕ××ėõś“T5ū?f˜Ļ §) üŽ{<µZ­Ńhģv»ĆįH µķ˜0œŸŒ©'B‘Š˜Ńh¤(Šć8˜Ū¢1 ŚaįN€ĘĘd3™L.—«²²ī…­8‹EÆ×;N‹Å¢ÓéœN'ĻóøĖšōUCĶó¼ÅbĮ|Šn·ć+ĄEąhĻóXy ³žd·Ūa’ūkM&“ÓéŌétĀŚķvžēU*Ć0Ā…Ņn·[,x‘ ĆąŸĄóĀOü¹JŌWį,gų1ż;D”Ph4šQ[Åó¼š||)į¶śV”PŠ4 źoN'j0Œį:°Upküұ©F”P|ƒpP„RY,•J„R©L&<‹°UF£‘¦i’V…<ž}ģAr6Ųš˜>~;*•JŌ½žƒ.„R©„v,x.አjUĄ¾'ōz}UU4 nūJxø)Œ˜Yš¤4Mkīx(čXōƒ]Źæ·ńŹš Ā-šo”%ķ9ÄŹ EQ0, EQ¢×ē F£Į—‚„Ƴh‘Į?®ožFPZx) 8®ü‡Ø÷†Ł!¢ĘˆĘg$ˆL8 Ø>U=ĮEŹ%µZµ•••šĮ`0ŌÕÕ å֋/‚Ž~Tµ V€ ĪcĄeżU¦X0Ēj ,ĆøÄjUŠ¢Ą QYY)<_©TbC…Ha‹-"¢Öś éį+āDĻoMt<œV…° ˆś^=Œüīü•ž*Æ`­‚—Ž$°¹|ƒxčĀ‹€Wož¤ÕjƒµŹ_[¢Æ„3eT] ŒUŠ¢DZøW0Ė\ĄĮ"< Śąoٶ*`_…3©CLgP į—(j-ž˜W¤sPųƒĮ€Ē$Ø­‚] ·s`` LĻ`oFžĀŠ«‘Ł}C¬ ”•üŠĪŗŗŗ‹/b7čՀ‹ ,Œ¢EĘŚś+ńšƒ»WpŽpJĀ9‘Y|ƒŁžĘe˜ŒĄ8ģĘŠ>µZmx„qŚZ”ū„” ¶ üA­VĆ8Ęk¬P£Ś`¬ĄX®SĶĶĶ¢—zóęMp`ĒW*•"G•ŗŗ:xXŃĘ3ÄjµĀō€VY­V`<—`PƒČår"7oŽÄcE.—ćŃ&šiūjTÓ&¼Dį:Ēį²ĀAˆV³ @k”O oįya Q^ø{ELų _¹¹¹žÆ5ß ¦1³Ł,ü “ō@«„ŒŒĘB“ ļ(W&h!œ)ÉĮ,s&­›7oĀ’pDųC’Vģ«ńŠLÜ<ÜWųāć§«««ƒÆ0“‚µ ĻAX š››į„‡øn'¼Düš‚½Ah?žJpMhŒĮ£šō‚­ £®Kp&¬ox`×b>†+CoĆ"ƒg„šAšFMDc°e®$ĮįŒĄÓZåß'”wŅV«NĆ[łńū.”Čøk0źsń§­ʙš"jµŽ®š¼mŠ#Bė(¶H‹ˆG“- fgĒ:*|Lį{¾ž`]Š7G¢]b‚ķ©żū*t ńtŽ]$Āāӂµ*Äb'ģ%ų+“ ,1žŻIøŃ Ö*į> ć·‡ųpk¼ÜćBŹŹB*õogˆVįE'L+ŗŠĻ3 #„žƒÓ `!Ć?µUž9VƂ‘)aA,..øĄźāšńƙ­ĀvāMöØo‹P@ž»Ņˆ%‰p@”Č%Ō7@ūńŠ/tę.2Ā÷%TϤ18?BˆEfü >Ć­En«crč¢{ócćG°ŁlX-zÆćѳ;Ī––¹\.ŗH0 čśA ģp8”J%6Ž €M ؓåy^Æ×«TŖI“&Łl¶0ƒl@%=iŅ$’悊«Ś±‰‘a˜I“&ÉkóµZ­ĒćŁøqć¤I“Ąģ‡[[__?iҤI“&A…ī«`ĮŽ;ŽI€r¹\!Z5ŖŠl– åZŌju@­:˜÷„v¦­‚†UVVŗ\.Ē6­Qß`2n•čMėĆ`­Āö'l pMų?““N°Į 4–ąx)į“lU£=“1Ö&įėfY–¢ØŽŽŽ§Ÿ~Z”PĄ9£.,”[ęhĒ€Y†oā Ņ4 +¬ÅbĮ†Ø` 4Ŗ„?ōŹš©A”T*Į¾(ōµ)))ÖĀć§”’˜~ fv²Łl6›M.—ćG±ČąÕ’·cĘæOĀy/&“ üFćųm±cvń€>ņVģœīĘä¢Ńh6nÜh±X°{$^­„bb°—Š×,°®Ć­U*•^Æw8£CQQøn* xż!ĻąõŪl¶ŹŹJ–eį \£ŃĄjiiĮ‹ģŒ„k^µĒŚWė?¬­ ę“qćʧŸ~(MČ1¼ōĆEŽć s"xƒ!ŽTk0·\.ŸĘ(Š·“ŽŽŽQi,Ų`Ą ąēi³Ł`¶ ,D­ŠV_ ×µZ-rdP©Tąh`2™ĒʍCs|8­«S@ee%xNĀ*ś j4š––‹Å]Š›ź?2C;ŌieĄN¤•••ą½¢R©<šśuuu¾ æü÷djµšēy‡Ća4…^H…B”T*‡Åbq¹\ÅÅÅpĒ)‹|śB7Ģét[‡³”‰‰‹HŁX#”U£ėāPM„Uˆž°ī"Ģx Ž…¶‡…Ę?¬ƒ­T„ūĀ9 ę)E;8GŌl’~ĆŹ 0¤…š”R ρõ$š€ Žī^ŲŖŖ'|D¤au P $źį킵 ^Vqq1Øųį:ĮŽ H…č’ßZh Ø­ §UcR7Įöž÷W;‹īb0ĄĆĀÉXŻ¢U”G{d¶±‹/†Š0 „oŁ_ĮU©čļßz“܁U©beU9,TėŌź /+¼‚Š~CK¤Tłw„^d°[€°‘)E?2"Ų¢jµŚ––†a4’–Üd2a§XNę†Ō’"°+“C§N§ėččjCö8‹…eYŠzy<¼ū©ŽeYŃ.¶B6›MÆ×Ćž>@›±N.%ܔĮ¶…¢(N‡Ż‚- ĒqB—wš†ķ uMÓEµ““`qˆ4`f¬}„P(är¹Ė傈ü€4Mwtth4¬CP(z½>X«šžk±`שÓé„Åq\8¾¹°/¹§‡h•Óém•Éd²X,7nmgč7zĒ ÆĆįp€H7›0ĪalĆB{ y …ÜāM&SˆiÅ0LKK „ī ePįķ CMM ¼Öć PUUb1¢ Tk0\Äd2ĮšV©TćU-FęE »ŒQ]ŅE[•šļL¢ -a§Æ0óą ^*°ŗį ū’Jč“*Ģ\ ‡’öM.—‹|·ą pļ)ŚŻrńāE¼×†?łū³„ Ųvłß}``@č@OQŌØ­ „ rĘī!Į¤±»ć`­I±B±2ąU>‚PŁpTkUč-m8žŁX” q÷`ƒAŲ'Ā x°V…ķĮŽlĄČi“üCč½K°3ĒŌWįō¼’øĀĆ!ŗQō×ČZśFį«0uģaŽ®1-’0‚ż$ō_>ŻX»1Ųø ”ŲL,ŠH!>¹ĀĀ™‡¢½“V2r⃨äM'@Yų6ųx"„8ŽMqÄ{i†€DĮ¼­¢lŪ_/¬ÜŸČo$X·źÖEg€ ²„„…¢ØņX¹Ż™2Yś-&`ƒ7 Q,µ>L§­“H“;‘ЬĻ7.²Eä8šmץ·]’Ś×—ŅX°×ė DcoĄ‘o¬æż—’ū”-wĮ?XŅo1Łc‡;°t.śõmÓ?…’“I#iQż<ī"ĖŻI#@NUF‚ę€ųcŽB„|k…|kéL‚øŅųF,"»'˲§—§ŁDŽJĪčpp’äiO׳Łļ½žOŅ„ĘŅ„ĘRƒ×z†}¾ ‰$knŽ„ķ„aÆ÷FķNłÖŠ4Ó(&¶?gWæ!•Žzré/‚ä°U°ˆtE’ćFķNO×Ŗ`‘²õĖ Ū īÖ¶{ęĆ|ׅēN'Cbüp”oś”§!”[ū”1‚Ō¦1‚Āģź·I'D§'ß{ūRł¦ ‰$œ“‰R‘ IĮwGeʲ‰–&ÉA”ŠĆ^o†Tš~>ŠÉŠ«šč3'īéɉ®å/ß3ΐJ邍7’Oübj¦LöÄ/¦NĢĒækīøüææłŲäÉ’~Y! QÄc“'ß?yŚQ¾é±É“„Ŗ…”Ī$E@@0ĪuÜÕŠx×Ü11ßÕŠų£Ļ÷£ĻGFBō2ŸļGŸĻÕŠś4b#HRTĮ=søx¤“—yųČ­żšž¹CV¾žŒ„ØczI±§ėü“ŃĘ”1‚¤¦1‚$—D§—½w,w !„ų®óYy¹ĮŒdÄŃ IšŖ`Y#’ÖÅ㮹ćzõO-/š’Y=±Coõū÷̇C„ŪAņҘ«”ŃÓutE’#kn]°xŗ)~ņ4Bč©/1SP‹aÓģ¢T$ ÆPņĄŻŸf˜ĀĮüĻźļš;¦./"c ¦€qbt„"A’‚č„ åÆMĄ,}-ūé‚E9’Vœ1ävß?iĶŃn ŅAŹ€˜Ä’yIżKķN„PĮ©ÆČ6+>čZž2B(ąÖŠA’‚øx¤ fWæ .瑯õ>.‘Š‹‡Å ÓJÖŽ3ģéõ§1¢T$HR3Üßųų“ĮžŽ¬¼\(ßą( !$ś:­¤xzIńąµžµ;ƒ}½kīøg7kn^°Æ ƒ›Š¾†n| Żü5ā6ąÆ!Śf·„n| ŻQ·L {½Ć>”±xJĄI@Ÿ{"$5&˲Bƒ=½B—E‘ū"|”mŲē ńõ»¾ū|!¾>Üq’ü¦į“įį² ųkLŪf·„n| Żų:x­!4A˜Œļ:?x­wźŠ"ĀańD¦L6ävß5Κ›+ŅŠ#HR@žpOŹŹĖÅ’ć?‰¾įeH$!¾N–eĆWŠ€ū Ą×~ Żųŗ Éćɏ“p“AŌEć閩m€Æ”Ū ś:pĻÜqĻ|ų‡žžpjˆDµē»ŸZ^$¢1¢T$ H€>j°§—ŲüR7>žÄŻŚ6ÆĮ8•DŒÅƒ×zž\²Ī?ޜŠA\ ĢŻŚ6­d-ŃG„ś{ §*1A|zždń ˆÜ­m®†Ę+æ×“®HQÜ5wōµģ&łģż „GˆmŒ€ ސ į$HHĖžzzIT~¢0ŲÓ{½śƒÉ²la4”1‚ųA¾µ‚hÓ4©”°ž_üøD’!‘kmŪA\v‘×zå›ä[+rˆ(F@UŪA<Š[żĮ>Ÿ§ė<éŠŌÅż“§ļš;†½^Ņ İ×{×Ü!LxO¤1‚8Ic®†ĘÜŚ‰‡[ź¢[SśCOļĀÖ&,‘Ų©ōē’uK$ϟ’†HcńßuŽÕИ57ožgõ„ĆR[šłŠ„ŒųN*@NÅ ©‹ÅD# ˆ!†ÜīnĶŗ}¾9µN“r\ńńT$ ˆå“H2eŁ!R\1 ¤źaÆ/kn.q4M†Żį»ŲėƒD*D©H@ {½7>ž!”o9¤lm"źÄT‡»e’Õ­śū'­¤+ŽĮk½—Ź7¹[÷iŒ€ †p”oś”§wČŻOLbi²/ĆŲ\bK<ą- ¹ūį+±Ä½Õļß?iU¶6‘:÷é$a“I’€„?ÄpvŻųx'8Ö gAŖT%4–„o„ŲĘ¢‰nĶŗļOY{«?@Kš].•oŗ²UOŗ"IŠ[żĮ„ņMw͇qń ˆÆõ „r“¦äåĪ~ļmŅ!é„zz‰K&€®žGŸ„"Įų1äv÷V0x­—XĀŅ{›’!• ;y&ݰ×ӍHcQYćz‘ĄuŠ żͬ¹y„Ć’™2YÖܼ!·›ŠXšCÆ×Ūķv“Éd2™āvS§Óɲlčs8Ž xŽš·,Ė:N„Ć0ųY’Ŗ{ł®óݚRWCc¦L–[ūa¾å ©jŸ®č­žąy łŲgvęyžeY–eM&Ļó œ¤¢&%įĘāy »5ė„9ģv;ĻóN§ų n4VSSś‹Å¢P(B’¶¦¦šm³Łš³$U÷Ž3wüŠÓ …h§®xlÕÓž® (.¶1Žć`Ói2™` X,ŽćĀ_Fā¹_Clc$ü™ °X,Iøæ sčjhä».ĮétŅ4m2™ą Ēq0µ`vĮ‡æj4šŠwÄ"MÓšUt»dĘąµž¬¹yCīž{ęĆ!¾ė<]°8·ö#2Ø&āV™ LA«ÕR%ü‰š4éāŋE]¼xQ8I” ###J„R©TVVVā¹ō¼ū¶Üßv›@”†>ĆSE.—777 Ń(7›Ķ0ˆaČ…ĄÅ#&Bع¹žŖV«…TšŽ0ōa »ˆĘøxõ¼ūßvŒŒœ{aeē¢_ß6żH–ĘģæŪó „Ģf3ģķ`šg–pšĄģĄD;Bą?8°Z­š€g™ŁlĘ3.čs¬° ÅWĆó!w7 Ā{Åößm#JʼnŽć”J%Ø@)Į0 ˲F£‘ēy”½×b±X,Ēƒ€n“Žųvø€ƒFdxGŠR Uķž·Køņ!”57Æ·śƒī~Š]Ģo0fʲI"¢‰‰LY¶|kÅdYv4ŠEF›Ķf6›U*•Óé¬ÆÆ‡!¶QŁķv„R‰Õz ĆŲķvģś=„Ńh›ŃhŲģv»Z­å”P!šĒqE±,«Ńh@Q‰uŒ<Ļ»\.•Js\ōĆ8`ZI1]°8C"!46QžŠąX I£ŃlÜøQ©TĀWžē†Ņ՘ ¢¢€wš¬Ēy»čņ:Ź_ót]˜V²6·ö#Ył†zzd劣”•ĘdąĪ‡½¦J„‚p`‹Å‚§'¶Hį!—Ė„P(Ą­,Rv»]£Ńš<ļp8ŒF£N§ÓétBŽĮ<ŌŃŃÓ›øüĄ“ć8īāt:Į ¤KÓ“ÓéT*•ųī±s°×”%÷0CxcEQ”ÓéъeY›¢åpįG‹Å‚=A¢~»ČpććOž˜·ŠŻ²öŻKfjČŃnČ­żˆĮ]s‡£üµ»ęŽ8ģ5†q8¢m–ʰ>”(ąa56› KH|i4Ež01‘ĄĆK.—u Ą•µZ-Ŗšśčē®ųīńtkÄļ…ŠŲDĆ06›MzjpDēN £ŽŃb±ą[Äsć&”ŗ€ŗ¾Yü<”µ„:R€C¾µāłóßÄgėM*xąī÷t]xū-ž~š<Ļqēńx@, Øń,ƒ‰Œ/‚E4!‡č.ĀĶ„čČv ĆĄ•… š\ę8ėZ@Ēē÷BhlјR©y<";::t:XČ`[¾† 8Ł&ųßf)žW‘Ż.ŽĀŌ…„®aŸļGŸo°§Ø«ąŌWó?«G$'=A P‹ä[+؂E±¾‘Ćį)ŲAeö-ą'Qœ |€©d±XŒF£\.§iša0³Įq|A,„aĮĪn·[,½^ļ7I£Ń8œHēy“Éd³Ł„łąjĻ@iü^M @Ü Ė²Ēń×Ū·śū~: (JódŅĘY-!‘dĶĶć»Ī»BŹÖ/ł®ó@Wæé¹4ävw-!R—£üµLY¶¬|”"z¤yśOM(¤ ƒ€Ńh²×œy ņ—Ī™·pĪü¹óŽé‚ŻgĻō^¹Ü}öL÷¹ĪAÆGČg:.Qū‹t¶KŻ5w|ņt¦,{ö{ļø] Sņró-‡īŸ<}u«ØkšZOoõRIn퇙2¦:Ņ‰Śl„Šmlb¾— 1Č!ĢW¤~q³ružŅĀģ™ņØÜ¢÷Ź„£‡Śøǰ”¦T*õz}ņ§]OZø‡½Ž)só¦— ScuQ‹”­_Ž5wø3eŁŹÖ/‡ÜīĮk½R Y)’p0ƒ †&ē{IjŪXKK |‘3ėÕMo®)-“PQœsē/Ģæp;ūI÷Ł3Gµ=Ōīp86nÜ)a™…Ž ^ėŗ¢ū\(¢®Žź÷Ń£TÓPX’L*‚ōŪĄ öōm²ašZϰϗ•—›\4%GĮ?~FĪ,vwcBLDf{ėj45"„ `AüėÄsŗņ]@¢Āī‚§¾Ź”É€ŗĄ]°ÆeÖÜÜLY6QLĄ\ƒ.éäݶ6%Q2*ȹ¶¹ŖśČŁļĪa! Eog?i;Ž9gŽĒSUUEŅIäŗkī€$¹ƒ=½W·ź] Cn7˜ÆØ‚Ežõ+óĮßō\ aŽv]°˜pĮ„ĀPģSD†d‘Ęōz=XĀęĢ[`ŲŻ8Vļłų`ļīŚ½uµ!¹\¤›ŗR׿SÖ®õĢ~ļģé^pź« ‰äŹV}V^®L»°pʐ¢©Éł^’‚Ęxž×h4 „­.-cwžĢ½Ö{åŅ[ƗŻé»Ł£SˉqšZßu!G»į®¹ćzõBź¢ ĖŹ×“‰J@bśŪXr¾‘ÓŌ’…ˆfĆ®Ę5ėÖ'ßł<ü[ƗuŸėD577'?“ń]ē!ė ”.‚ČšĶāēōłĄNLz#Iūßō\J¤m ’q9Ž,)Õv¼3%8 !$”č/żóźŅ2„ŠĘ“ŁććžÉÓß,~žRł¦!·{źņ¢Ē%’i%kBR©²õKłÖ Āaį kn."ę±$ÅŠ£¾„IcĄa'KJ}qšXrĆBcūx0jµŚ8g•aÆ×ŻŚv×ܑo>8ģóu-y²,;·öCæE@0žE|»ÉĪ/y:‘ĆŗÄ9ó|ŗÆ=Z9„ā#Ūj¶W „źźź.–Ż5wL]^Ō…‚l$.AzćqQmŠxrČa©Ėa!"»Ļuž8qBX9Īr»»KÖżóį’噧é‚ÅĆ^ļĢ’}Óōæ/F‰6v»}hh(¦i°9Žs:q‹‡ә™™d2Ä}-ūķæŻ0ģõžūe…¤7’®†ĘKå›—H¤Ŗ… °étŗōą0ĄęmÕŲNĘq\œŁėĘǟš]ē3e²LYödY6ÄxĶ~ļ©+^ų½^¦žS”PD¦)eY6žÕ"ŠŠŠp”T‚!S–‚2xÉaŠĖx§fY¶££!”¢ö°ĄµūsŸĒcūś˜F£±ŪķqD囸ū{zéÖÅPÓ$Š×h4—<ĻCŻ#2ĶŅ YssŸ©~ź²$då¦äåM]Q„Š«4Ęq_6ģjL{Ädę#օ7‡½^WC#d2”o­  AńˆQ9Œć8Qņ(Ÿ-<„“į³ŃhÄlä&>ßétŠī‚s(ū•č|YŹn·ćƒ ¢žÕétæĀ¹#ADҘ,G»Ä%ÓĘ"/ēQ–†ųIcęŒZ]Z–*¾õįCBŃ†Ż[Ö­r8PŽ%F7r·¶A•dłÖ a”“ŠP©T<ĻÓ4™Ģn·k48b·ŪišÖét`g‚Bk Ć0 •Žt:PšĶfŸ I“&iµZ§Ói³Ł¬V+¦.‹ÅoYt}»Ż^TTtóęM…BÆ æ‚3A‰/k·Ūu:оĆ0P©ŻétśĒžū?™źQĕßWņ]”­M„ĢŽaÆ÷Ūå/gĶĶ…,—ń“Ęt:Ē晑3k»aGZölīü…šh555Q·Öš]ē»5„Ć^Ƭ|żSĖ‹¶6…ÆB4™L°² 2NDz,Ø@M&“Żnoii¾у^ÆgYV(f Ēq¢`‹Å§‰®Ļ0ŒZ­6@QąÕi±X@kiiĮ"\Öh4Ö××Ć}Õj5¾üÜh4śū…ŠīH¦:A”—NŸļGŸ„Ž%{zōłĄ ~4f±XĄ$öé¾öؽL¬Y·^żā*XR£xŁ!·ūRł¦zzoŌī̐JēV?¦ 0` š¦iš”Šēy‡ĆbĆ0 „Į™¢ß:N—Ė…Ļž ¾* Ģ@ ņčś!–eM&0Üž‡Ÿć‹ąĖāĻ ĆˆžŖŃh<PŁšŽQ„¬|ƒ|kųz$Yy¹ņ­2ķų„"Ļó°w~uSE8&±Ž+— Ä׌œYQqeōyųž¾[ń±Ę±»×üzĆį(1Œ÷OžFM]ń‚¬|=B(²źN§SÄ@ ,>łä“šU­V+ ƒĮPRRb0„Q Š0V°(ę}`š¦ėėėo޼‰ÅD½^?ę?ܰ€w$ ˆ"¦®x!˜0Aœ‘!• ĆxИŃht¹\3rfm®Ŗõä-„Æ@ŗBĄŒœYŪŁĢŹÕći@ŁK…wśn}ŗÆ}œ× ŠŽ\U½»ę]–eu:ŻØš™³] ®†ĘĒ%ŗ`Ńģ÷މzSE‘ļ,ĖŖT*N§P("“&-‹Åb v}ģvūʍ/^¼ØR©&Mš‹'" ˆ®RäĘĒ;‡}>Ru,įč­~ČŻŻ³c®TäyŽh4"„6WU‡ÆNĪ›‘3ėNß­·^/ėæķ -½µļŪ³‹ ŗŠū¼„P’ķ[ńéā²×ߜ‘3Ėćń„ćčŃ[żĮ]s‡’„A=µ¼!4½dķ8Ū#Ōū@ņ7ąi4N'4,Į™¢Ÿ“łxžń(ąõM&MÓÅÅÅŠ-‹E­VGęšļ/#{"‚h!S&ūž”ÕÓuŠƒ$÷̇=]š×˜Ó˜ŃhōxOø‹cžŅełK G]śĮō…2™«”ńGŸĻݲ… Ą ]„R1 S\üŠAøäÉ'Ÿvžē±rOŌf“É> ”¤Ų0šśą‘ØŃhĄBīņpS–e•Jeųr˜J„Ņėõž+ŗ#™źQGnķGņ­$Ii2ŠŲĻT»#±„Į`@Ķ™·ąĀmo˜’`õĻ_Rxį¶÷šŸ XŸīkæpŪkŲÕ(|’ĶUÕų|įA°ĄĶșG.Üö Ļ·~wkμųü,)eżīÖ¶G1Ā›¶ļl;Ž™%„~"§%…į?ˆ’E 럒ž_vŲrąĪÜ322ā»zķæ’—QV«5DK¼BˆSWW7Ö  X­ÖšĻW«Õƒįāŋ7oŽ! ˆ;žµÆÆēŻˆÅō$ĪÜóŻ›’iąŪ.|$¶ŅXY^Ż4fmžĻėé>{ę­×Ė€™•«}~WĶ»”m†ŸīkGµ7ķAmcw-Ķ™·ą‹ƒĒ ½!BčNß- ѕ45^æzyFĪ,ą³AÆēČ”öü„…XڃfI©Üł w³ļz=źWY滅ź>ף{åRųXČBÄ0Ż?e~u54Žųų“¬¹y8tčõz&šŻA ĻŪ„® ėiš¹P†•J·t_B {}÷̇ļš“®H īŸ<żżĻWĪz*Z,—Ė•%„"ČŁqżźå-ėVPbM÷¹NP-b× ×Ó{åRīü…)…’H©ü„Ė„ XNš;q!“¦t½„¢™•«Æ_½Ü}ö 8eÜé»Õūę?Ÿ‡ŸÉ²×ߔPtž’ĀīsŻg;ĆwÜß\U]³½"˜ēżŪżĄ/”ņ®łš“’āŅ„Ö^ŽF£¬M&“‰„LddĶĶ£ eå咮H č‚ER‰š-ÄPƒ%oĶ#ńhL˜‘3ėÕM TAiJģĮ±h¦tŃL)f² HŸ×Æ^Fķ­«]4Sŗ·®_²;}·śū\!`8ųɖu«Ķ”„…¾£ĢŹUYRŹår4ÕÜ?iõ?ų£Ļē(ß…M“ 0Ń4-tāHüPÄŹÖ/cżB>fæ÷޲õK”ć[¬¤1žē!mGE„Pvάķģ'”MķM{6oū)ąLØ'®ĘJ“ŁŒgsę/Ž:zØ»ä/-± !4gŽÉ£a“[8P4³rÕŃC퐽BōWO׳€æ&KžŌm*•*I2֓ij ßužž¹#S&‹,Į8Ńײ’‡žži%ÅĀLF±¢1ƒ3oĮxŅpä/]v ©”‡@6hÜé¬ęĢ[pżźefå* I;ö÷ŻŗÓw ²‡`źŚ¼­:āøi`G‹Å"¢±aÆW¤Žõg²|ĖAāE@løg>gŽĀ왳śo߯£„¢įBĢŹUpģaąˆ/‘R>Æg¬OĬ\õŠBa‚Äī 9;؂œ *‚€€ I@,ž,Ė&…Ē×’‹†}>Q’ĒŠĘ LU½rÕx.’;!PW÷Ł3ĢŹÕŪ ;j¶WŲ¾>fūśČO_Z†ZSŗžč”v„Ё¦ĘQięÕM܉£×Æ^®Łžp3•=sŠ!¶‡aW‘mģŽ-ėV]æz|&‘Ą} 2å’BŪ×Ē8ŽŅŲ÷§N¤.R‚€ Éńܩ椅Łļ½ćo›Œ ŁķvĒ>ėcżķźŅõąŖ_·v€–!“fŻśü„…܉cƒ^O–”Ā^ņłK—µļ“8†ēūĶčgÉ!’ Ī—Ptū‰oøGĮgdĪü8Œ ;ėcó[īü…Gžt™;qģ”ūāŅĀz#é2 1”æā»’©åE„ŗRPŗ–TŅń„«”qŲėõ÷åž‹lŖF£±ŖŖJżāŖ]MH×÷^¹“ž„BŠ¢H†$‚4ĄŪݵüe„Šoz.‘Žˆ'¾]žŅw’ĀÖ&Q„Ŗ˜8܃y| £$? Dõ±R™2Ł”¼Üi%k!…7AÜ@,š,Ėöƶ„"¬×‘©ąŅą*…‰Io¤üŒ¶"‘ ö£€Ēc"Aõ1…Xż·]Ū7½ŠS' Z€ä«% HøÆü¾’ōCÜŠ[żž? X%'ś4†-@Q)Ü>Žj·}} ū&$R…Wµ‹€€ %Š×²’ūSÖ¤Jø“Ęr»ļ™»[K)ŃW*‚Ģ!Ģ"ØW®:r؍Ÿ‹¬TK Q”1‚ōĮŌEĆ^©=7@į€Åc•SQišØˆ‘;ᑳ߉rsō^¹„óKDmĮ©żhžgõžī!†aōz½Żn–˜“ÉÄ0ŒŻn‡ éŌ?ųńń3†8?>t’ ™2ŁüĻźēVšēѧ19²bFcģ¶7„فį3Ō½÷yų-„Ƭ©pĖŗUk–ž ¬¬YśĖE3„PK“;qī>{~ U4£0ŪA:᮹£[SźÆW“ŪķPŠÖf³…ÖĮĄ9<ĻŪķvp)H'Ąć;NxĘŠ¬o³Łü×É!·»[SŚ×²?ŲĻcEc±ó¶Ēy:śo»°¤åÆK|ėõ²īssę-PæøźNß­Żģ»čēĪ“ž yėūoß²‰‘=.ėńxČĢ' HxŗĪ’ŠÓėn/ƐM‹!®™}ąäÅüRĀG § ¼Z­ö?󞳹=½Įr©£˜j‰pŠ († żĻ“÷^¹üōé¾öķģ +Ÿ‡Ļ_² S¦ĄŽ+—Ę“¤ƒ€€`bbZIń”¼\QšZ@ĄµN§“ć8¹dœõl“į?Zˆ3§äåR‹žZńB°2R®_„,›żą?A®Å‡ā×ÕĖĀ3{Æ^†\Ą×Æ\Jg"c‚ ŗ`qĄ2£Ń‹²Õj” EXSYY %/T*•ÕjEétŗÄó‹šćĆ3"„X–­©©ži¤šćć®bźŠ¦ē°”¤1„zåźīsż}®;·o¤\Ü cbdĻ”C•ē#Ū½Č|żź%‘œG@@@†ÜīļD ½pp¬S©T,ĖBŃWFS__Æ×ė MÓpNZ&FĄļ’Įn·wtthµZųŠßæ¦`oõūCī~łÖŠ€Ž4)Lc+5ß¾Õ’PøLtv0łāą1|bņ—=ŌŌ„^¹Ŗ½iĻõ+—ĮŠ6ž2fP8pČķ]Y š •ų>LĄœ> Ć0 Ćó¼B”ĖåžÅ„EözžčóeH$q•Ę@$ģļsÅ®/ € ˜øŌ/® Ęs>’Œäņ—,;zØż@S#$ąĻ· ÷aq–Šb>Of;Aś!S&›V²6S& ½Ī"„X–5ÄĻ äQĒĆq\8–3łÖŠzzB—‰¾‹H… ī‹!«?rMōŀē@CøeŻŖ-„Æl)}…Żö†ˆįą„ü„Ė@š:Ń”1K3O$„PnķG£V‚›˲###ƒa"w˲6›­®®Ī_9Ś ĮR)ʐĘāš9 !E}ŗÆ}uim½W/ćpl0aŽĀ?'ž‘ĮÕŠų§‚Āū'O;Źėt:žēCD§78Ž«©©Q*•*•Šć8č–`ą»Ī’© šĘǟŒzŁč+Aį æŲaĶŗõkÖ­ټ­z󶟪eJ(šŻżyĄß9ūŻOtøtYĒŠŽ+—QšZq ÷ĢĮźt:ĶfS©T<Ļ3 ćr¹&f±,‹r8EEEp$DĮĖ{ę„P8é¾bEc!Ÿ‡'NŠ[# HK@ķ±ŖEN§R©,‹F£Q(v»=L•ZšĮh4†_=X¾µ"C"‘i7ŒzfLŖ?«T*‡ĆńÅĮc158„¶”¾Ņ}®Ól6§_hĮOÖk£8#„ß“™²ģ€‰€żŪˆ I#@3$‘ĘŅCn÷7‹Ÿ’sÉŗ€±ʄaÆ×Q¾éŪå/‡Y'&4ņ2+?ŹV>©{Ķ”–­|¾}ß’spz_į?Čü›XōßvRqbŖ&2e²¬¹¹”ū§¬¤7ʉū§¬?ś|RI˜¢mLŸ†©©©Į”ĘpXŸ‘3K"„®_½¼»ęŻAÆGčŠ‘Ģ€~ Žö鍣Õoū|!’M„‰é%ř²ģšĻ‰4Gīō݊nŻ“5„ėŪO|ń^ķMblμ_<†Óv¬.-ūāą±mģŽÄÓŲ¹3h“ϩެ¹ytĮb¾ė|Ļ{‚QĮwē»ĪÓ‹ĆßÄ*n¬øø!ĝ8õ+ƒŪʈ!”čü„˰SIvŽ<é²Üł »ĻžĢæG¶į¬öż·]{w×¶ļŪ#ŹÆŃ}öĢŽŻµG¶E±ĮŠ „ĘŅ÷Ož¾T¾©·śb!‹½Õ\*ßt×ÜžOb•S‘a˜ŽŽŽ£‡ŚŹ^3ŹĀĶŁ3 l…yž–u«BźWپ>¶¹Ŗ:é²#Ūj¶?tŻ[WŪ~¼ź±ŪŽĄń4ķi?ńM^ɕKƒ^EQ„ĘŅSW¼0Y–=ģõ ¹ū³Āó²#bČķF=.‘L/)’W±’ĘĄ³üśÕĖQŌ+9Ō¶fé/!ļvĆŲ“…¶Æa9 8l›a‡śÅUƒ^dĮ?r°ķč”ö,)õé¾ö9³®_½™ģč”6ÜiekÓs§¾"n÷‘!S&{īŌqekӘ~+S(PĶ3ŠzÅ;}· ¾„ĻėĖBhų:żn–”:ü§Ė›·Uƒ¼5gŽ‚²×߄< ą‚|³¦“ŒY¹6‚MkÜŌŪNhŒ€`B-ÄĆ>_oõū®†FŅcB_ĖžŽź÷‡Üī±nb˜S hŚ­ n®Ŗ¶~wkuiŁ¾[5Ū+śo»Žjß²nüoĘ`XSZšCŠIö÷ŻŚRśŹŽŻµĄŽčQö,īı-„ÆGŽ?»1T5“Ėå„Ę&ų® ÷̇ūZö Yųöz] ÷̇ł® cżm ėi4½^§ļV÷Ł3ŃJē!”čķ† Qq'Žå/-܌ŗŻCĀß ?”ŅĀÆƒ^OĄ¬Xą‹ @ƒZyÓKŠļ™;Ęä2N€š^²öž)똬b1§1š¦5MKKĖŽŻµ_ŠZV*œ§qŠėŗ&†‰3g”s(Iį‡žłgĒsfŻé»µ¹Ŗ:ZįhŻgĻS# ˜hP¶~ ʰכA|=ĀÅB³ß{gö{ļDšóŲj|ĘŻē:±§ū8įóšør˜zåŖ®^p“|ŒjP±åČ”6šIægŹ‘Cm!­VKrPL@š]ē»KÖ]ŁŖ']1*nŌīüvłĖĒŪŖĘ …V«EjœŲ[W[ōĖY Q\]Z–;aY³nżœy B[Ö­Z4SZōĖYą…±¹Ŗ:KJŻé»µö× Ķ”®żõ‚Ž+‘'Óź>{Ś DN@@0ѐ)Ė~ąī÷t]31ą„Åąµž{ęƐ}*²+dÄŗ‰,˶““€ō±… 2w<ü¼tYžŅĀ—‚“±©Lō!ōÅĮcGµŪNE͘9+wž„PöLyūńĪM{®_¹Œš3®“ ćī®%¢ĮĦ1™|kU°ˆ8߇FÖܼ…­Mƒ×z#Īć“B-"čtŗ–––9óD% 8łĮ8śÖėe”›7o# ˜ąą»Ī^ėĶ £nÖ(ƒ• Å””F£‘¢ØėW/ĢLŸfšyų]ģ»”ŹŹJĀad™¾T¾ÉÕŠł)„öz{«?øŗU?¦ŌS‰”1š¦ĮD“·®6ŗÉ‚“{ėjļōŻ¢(ŠXŦ®x*X„r÷“ŽÓ˜Ļ—!•LÉĖĄÉ^ˆx(PŚßÓ=Š}ö ¤p$…ž Cnw†D’!•ē{‘(}2ģóeŹdÉ.L&EQŻē:£āµ˜„šyųķÆ—!„Š‹‹ ‡`¾ńń'ß.Y”×cšZĻDšcr»ł®ó"ė.Ywå÷•øRƒĘT*V-F+Œ,©šÖėezŹd2‘©K@@€‘!•BEćµ;ńĮ¾–ż.Y÷żØ}’¤ „ųČ]óįīžĮžŽčto<FÆ×Ūķö–––ķƗ}qšXd_ɉ]ģ;³Ćb±Š4Mę-¹µŽ3wĢ®~d‘+[õž±' N§ÓétrĒó¼Żn‡#.W`§ØJÆ %„~ōłB®†Ęū'Oϒ̘)“M/YūĄķ¦ GEĖ?Ū€ēy†akʙ„Rø€Yss3I=E@@ ÷®ł0¬ģ”i%ksk?ēe¹G°ŪķgœWS*• ĆØT*†a¢ānķjhÄ¢ŲćÉŌE³«ßŽ¢™0Ž4[•Jåńx҃É0‡UVVF2Q ‚q˜æF,‚Œˆ‹Åb±ttˆ½Õó—Θ9+;Gi²¤T@ÕW’mdBļ½ryŠėé>{¦ß/7:PšN§S©T?ø£ü5ŃS?.‘ó§1„ŠdYvnķ‡gīH<„“›Č`Y¶¦¦ę§Åˆ¢4 ˲įLrŽćŠŠŠ‚żÕjµĘĀ>A@µjžųMOXé[N§Ńh4™LXm8gނՄėó—ĘČĻĄēį¹ĒøGm_’TżøøøXÆ×iˆ~»ü„AĀęä[+ä[+R•ĘRÉ‡Ņ&3§Ó9Ŗ”± …€²Č˜hĢétBrZ,{­)]æśQ)ą8ųģč”6\¦Q.—³,¦+ĄóB±ģ”¼Ü|Ė”ń4ļ±¾]•JÅqä©Z3¾Œņń^¶½A8Œ022222b0BĒb±Œś†aF\ÅŌj5>B8,͐[ūį“’µ!NQ$Śétźtŗ§Ÿ~8,Iį§ūŚœżnó¶źøqBHBŃkÖ­’āŠ?žÓåÕ„eYRŹårmÜøQ”PŒsœV²vžgĘ–ʰL¦ÓéBȰ«qĶŗõÉ<"}ž­×Ė`KB|:ˆ44öp.Mš„2 cŹCĘ0ŒĶfS«ÕĒ /§Ó ŸišV©T<ĻĆz”Ńh°ŽŒüN§ü¤żõ™v»h•aĀŽ‰ÅŪ}Ļ|øÆe?öQÄXŲŚäo"āyžeŁśśzųŗŗ“lM霈‹„D}<ŠŌŲŽ“gŠėM˲ĮŲąµž?—¬|\"ÉŃn˜V²vü±Ļ(Īqc·!yæųĒqĘf³ÕlÆąNew7&§‚‘;q”ŻV1čõPe4‰o=x°ŽaüW3™LXc©V«F#ØßŃ£8GÆ×c3‰hLņ<s ¾ÖŌŌØÕjԘ@@ŻYłś»ęĆīÖżB¦X¾Üü%…›·U' aįló¶źW7U™Łl¶¢¢¢ŹŹJ–eżŲšĻi{²,[V¾azÉŚ(:Ü?–Ųīø²Uß­Y7|įĻǁZĘöõ±5æ^Ą8šlBŲ.öČÓ”T*9Ž#FšpsĆq‹Ņ)•ŹØä!cĘ`0@ÉYĄ€Ļär9ģy9ŽŪøq£Ēć1 V«Õ`0x<ž7b6S*•f³Łl6+•J›Ķ¦×ėÉūJ,2¤Ņķ†ēNŸSūįdYö#A­_øb^Y_<öÅ”N*‘YūńNõ‹«Bõõõ …"„R}²,{Nķ‡Ļ:ž£ŻŻÜ’‰T*¹Ż]Ė_Fœś DK 8Wæøj;»#žśß`8r°mWĶ» >Üqōµģw·īŸŗ¼hZI1)‘7AŠÅ#ļŒ€JELą BQĒqB9~%TkĆPiā ĄXÅGnD ‚ļ:ļjh¤ ƒ·žÅbŃét „m®ŖŽ¼­:U¤ūģv[Ĝ‰IWC#ßu^¾µ"*¾õ7‰•² N}Åw]ĄźQ†aģv;h„m_³}}lsUõ«›*„cģ>{fū.O@²Ä€‹Ō=sĒwæ»µĶŻŚ"óŌEQŃł$?ĄGŌwó N$"­n”×ė…Ęó<ÜN”P`ņS(6› ¾ĀŽX©Tś7€ć8b$KŠ‹éÖÅšNõz=ųqĢ™·Ą°»1µrõå/]Ö~¼so]ķ¦ĘśśzŽćL& ZłÖ 9ŖˆéŻ& ^ėģé VfĘn·ėõz˜«YRŖlӛńō.Ū»»\9(ŠŅėõĮģö ˜”)y¹2톩ˋHi†ō–Ę`įÜ4ÅÅÅĄ"½źż§[8ŅŲŋ…4Ā_®× xńęOB8NFnnÆnŖŲĪ~’ŗĻ"t 0™Lń©õ‘0iģFķNOׅīž€±oą‹o±Xōz½ĖåŚ[W»·®6¾:>äPū¦=8#‹V«5! ćĮT’ŠÓ{½śƒė=µ¼č©/Œ³.A’C”Pčtŗśśz,Ń4 ‚ŚųĢm¤®®Nō'į@U*•žž“Qń@!ˆ"pųl–”bw72+W§ōć0+W·_šÖėeׯ^.))«ćnŠŃX5C‡Sh4Fc2™L&“Ķf;zØżč”ö9³˜•«V—®¢Šķ¬žŸ|*ēß?õū?ü_’aį‚Šæ•o­˜’—{ĻÜŒĻ¾?eżž”õĘĒ;§®(zjł SW¼@¦nŗī©Ļ„[±XÜSMÓE+•Je³Ł 7y/É l KEEb0dĻ”·Ÿų†ŻöĘŃCķ555N§3ÖĮµ vń߀d·ŪF£ÅbĮĘćL#ęóš×Æ^ī>ŪŁ}ö M‡=¬^ƶļŽg’n•ÆG18ģõŽ?e½gī±?Y–MœAŅ"„¢Åb)))AQŠ{؟ ī—æ’Ėåv»K`˜Gńėźź„މÄ0–T0™L7nD„S¹!Ś÷ķŁ]ó.Š}šˆŠŲ°×{£vē“’āWpRgŽćDõpRē,)•;?°Õ}¶!N"gQešÉ čłžIė=sĒ!‹ĀMÉĖVRLœARĘD£ˆćø1Åf¤±QŻ …NŒŲ£ÄįpąRAŲ<¦T*”=@xŲ#?ÕĮ?tzļ©~1;Õ9lui»ūót&ńIŚ—„āżSÖ{ęĆ|ׅēNėoiš†,ĖČÆÄN÷¹NtnlWS*•PSĒ?Ā”¼\üłGŸĻÕŠŲײ?L2Ė”Ér“r“ÆõÜ3wÜ?e źųCOļ_jwž„v'U°hZI1qIi@Ę^ƏO|1Ć0f³,ĒŲ›C©Tāa v喖pĀKQĢtķė'?EióžĪōw’™pXҲ2ÕlÆ'Ģ1Y¤±»ęWC£¬|CŽvC“®‰ žĀ®“ēł€§©T*š¦Ć)rŹwæT¾É’ųX%3|µ{ęŽū'­žyh„xjyŃ“’bb<#x“ĻŲéēžH'ÜŌ¶*¤ÓSØżX’œö7™l ‡a2“o­ˆ€†ļŸ<Ā_|źŠ¢Č”®é ‡QOLᷘSkŪ~‰‡ĆDL‹T“ĒĮR$ŠŻ3wüĶ3O'¹mČŻĻ|8Ų_’ꙧs“žųÅŌ±^öožyśoW½,+_’æ<óō°ĻPŁ8ņ׿žŠÓ{Ļ|ų®¹ćŪżÄŌ©܈€ ķ9 !ōyQe ™ĒxžĒ…ļ?ž¬yrfęÄyw¹óĪșeūśŲ·ß~«P(¢ųoiģŹļ+æ?e}¦śķ(jcCceł#*uŽš]Žš'”8ƒųsXݲ7ōŖæO”GP©T‡#]żĆxį#戞£±Žź÷ę[&’Šģ_źmJ^nn퇱p”ķ ņ“ %łœAÆõ ū|Yy¹Ä?… ž–rĪz½¾¾¾>KJ}qšXzćE†-„ÆtŸėŊ¤„D4E!,īŸ<żż©Ó©ā ‚Ʀäå*[›“ćĆŌ²…ÜßšB€Ż:>Ż×žźy:Ę Ÿ‡/{©šNß-œ¶-Åh JĘE«TZÜhŒ*X”[ūa†Dānm›’—ņøkīųžäé$włfńó˜nćCó„Ć”SŸįžžSzrVŖ<Ļó …Āćń¤z¾Äh”ūģ™-ėV!æšüŌ ±nMé=½óŒ)įSžĒ¼…BÄ¾–ż©Ż9Y–Aø[Ä€Ģ ī–ż”#©!3ˆL»!Īūx”ų+.øC@#£ž˜bµ1µ<ģ5MGGĒD6‰łcļīŚ½uµEŁķöń‡‚ĕʮü¾’ļŗšÜ©ÆRBūäjh ŽĆ^ļ·Ė_Κ››[ūaüėät¹ņōÕ­?m¦žZ^4’³z2E#Ū°CzƒDĆi­Ģõ9Ņic垀Ężż§©•¹«ŪŽwNd“˜?ŹV>żźåØØ‰mll\’pi#LgH«gGłkĀ’ [›HøŪXa·Ū5 T‹"֙čāAĻ™?¼åø’ź‰)–U,“£Œ˜ĆBĶ+ŽŅĶ}1µv' NL­˜ńAļ•Kė_*D™ĶęqÖs‰_Üßužžłp¦,;u2¤Ņū'O’?쇙²ģDńŁæ˜śļ—ęh7LÉĖ}lņCīž‘æžÕ’“½éüž”õö’÷Ė!·!ō7Ļ<£ödååŽło‡LßOJҌ•Ɔ¹wļ^€-‚Ć•ØR÷éĪŻ½öɟ"„üųoœū’nī‹™ODĘa†‚ß„–{=BhĒŽ'Nœ˜‘3‹ŻŻ8”¢ÄĀĮŌæęóņß]¼pīܹqZČāGc7>Žyēæš27/„3»ßłÆ’åŸO {}»źåĶäožyzźŠfmŽ4Y– ¼š“zz’埏÷µģ’כ73eŁQ¤~āS‡Ünl!{ąīŸ,Ė&ÉūĆĒoūŪŽŽ †O‡ĆõXŃ8£Žń0ˆēÆ? ’õ%łā8L›÷wĘߤ˜‘Óéu"›.X¢ŽĻ.ž’ķ’ņ_žĒ=iatĄcqkq¦,’Ÿŗi7L–eSɤ7›^R<’³ś_wu>Sż¶0£±?ś|÷̇’\²īŪå/ŻųųŃ¢łÖŠĒ%üÕÕŠ8ģõ’)¦(¬LóOĖz*ėŅéŚ¼æR×ē+‡)§>“ŠłABČ_R8Į=ģC@BŃŪ ;BF£1X"Üp@lcé†!·ūQ"«ų9ƒėŚ ā|6ŒFcUUÕØ§„ō$uzļ>ŻRžÓؐL³æŚŠ]>‡„–{=Ş~śi„ŠÅ“`}`ĶŅ_Žé»5ž:Ńq’ʆÜī»ęŽĮk=éĮW~_łķņ—’³y™2™|kÅs§Ž’Ź|PV¾^(' ebŗ–æ|å÷•wĶ攟dåė' äģ¾–żŃųŅ棁¦Ø@ęņŻcæż§09ŒzbŠiÅN9Šbqć°ī³gŗĻžéæż“£ĻĆĆAįi>ä`ŪŽŻµÜ‰£!Īģ½rItµŲasUõ8²8IcwĶ׫?  )[æLƒ™ aææ2L #P˜™A¦•¬}jł ‡ōĮ+^-·ö#BTDóČB֒’Sčµh¹ńMÉ?×ų’šāoS±0&ĻóO>łdœE±E3„@ ๋}ē@ÓCI–”ā®ÜFõßv½õzŁõ«—į8βć‘ »”B¤ŒŠ›ƒ%døčk’Jc ąJWl(9–*v¾©+^Č­żč¹S_Ķ©żš©åEĮN»g>|u«ž›ÅĻßųų“äęé%ÅTĮ"įÕų®ó„ØBĄn·‡c÷’Ėå©.“‰2„īä§üƒĮ‡żš/7t'd–j^ńVŠw†B$sę-H”:qļīZĢa”Üy ąCͶŠėW/gI©9ó „Žj?r°MųĆ£‡ŚŅąW7½‰EŲä„1łÖŠßō\J{‰|kÅģ÷ŽI­Č ©4Lgwk8ƒøǤ½_”µŒ@–eŸ}öY\š9\.—B”€ź—)ü¼Ļżīgå»÷žÉ=|׳sö?2xĖó×Dēo—.†1¾ė<ßu”Žš9łõÕ°;„9!8rØ !”椊śŻ­ ·½†Żō„ē:B»öµ·Ÿų&I!Bč@Óį»ĻuĘG‘(–ĘJ˲¤”Ėå‚ŅĒIJcƒ×zŅloŽ[żž7‹ŸOE P†Tš£Żo9Tpź+łÖŠÉAdŹī~WCc×ņ—»5„}-ūĆ1žŃ‹§•¬Å_=]īš;cł a*•Ŗ¦¦&üŸx<žgŸ}6™]‡½Žū'O捋£ü5Głk Ó’1oįóNj5‹²Ļžr²ź+’īä’įĻa/]ū×µµGąó„ņM—Ź7 öōāĻPŠQžŚóĀūZö;Ź_»ńń'”ū'Oßųų8>äv Y0>°X,.—+KJv.!øÓw !4gžČ}•=SŽź>Ū Q½r5B+’äźjćß` E3+W”HżrćDc½Õ\*ߔNL6ģõżčóŻ?iMŻG“3ȟ Ćqńw¾'¼%R7ł aE)•£§·Ųøqcd–ƒ(‚ļ:½R] @Q”ĮžŽ«[õX|÷t]št]öłBx<ˆ2„© kp²x š’Ä/v žÆXAM,¢ eH$ų³’ĘėŪķéŗT÷COÆ»µķõóāZ «Š|†Mv“¶¤ZiMiY_HZGµ ż8®_½„’„Ź’PÓŲ{åžU–”āNóyųų·„×–––Tčńi"„ĒfQd„"žZńB¦,›XƒRYsó²ęęĶ~ļŠĪ ßŸ²~ŹzC"™ŗ¢(˜3H¦L–£Ż€Ł D:ā|r::Ī?JL­V[,š¦!§¢ÓéD1 £Óéxž%©jii±Ūķ‹eüŁTG„«!w¦,›.XÜ[żž=óaH˜ééŗąjhœ’—+ßZ!4…fH$TĮ"lü^ŲŚ„ēūóēæĮ§ ~WÓõO”¶A’iÆ6Ņ[~rM:…ū,ÓnxjÅ @u ŖƒVį'ś™€ŪuĮÓuaŹÜ<„ŠŚž® %rććO{z³ņrgæ÷ßu~ŲėːJĀ7źó<ßŅŅ‚Z]ŗ>ƒmó¶ź-ėV z=o½^¦~q»»QBŃwnß ¬*óząCß-fåŖ£‡Ś¹Dz¤TœŪ å”ļōݲX,cݮʼnĘ~ŻÕ9ŲӛNõئ—£“Ėŗ4uÅ SW¼0»Ś{’”5X™ˆ¤¾g>üøD2½dķ“’b‘»¦¬|=T䁯}-ūeåė'x)2£ŃȲ¬Ēć a,Ėā4<Ę?ļ¤[’ŸĆįP©T‹%ź‰ƒ] |×yYł†©+^p54zŗ.ČŹ×Ó‹@“¢ a›.Xü›žKx'$ä•`ė¾^Ub“’Į_‹ų°Cž˜bYÅFą^Ÿ)“įšGŠ1ų·JŲZ ZO×Ų†ŪĮC öōzŗ.Ą#cĪĪ·ŗņt8|¢ŲŒœY‰MŪ‘ætŁm½lŠė±}}ģ­×˾8ōĻ£žźNß-fåź£‡Ś4ķaV®¶}},žŁīšw# ±8)3¤ŅōĖėjhüvłKé 'zYą Rpź«œA2¤ŅŁļ½-<ķFķĪ K` QUUU‰8L­VŪķöQSÉŃ4Ķq\eeåĻ$ §ØØÜį"Ö ;Ź_ūfńó÷OžFŻ5wxŗ.€ā„.XüŌņ"VdŚ æé¹|@,Ę„‹"=9+D^DĖ*6n®‰š @~ó?«W¶~ •[ūįĀÖ&ĄSņr©‚E@u?ōōfŃŗ  `ęI,ņ—.;ņ§Ė Bģ>ף}öL0KxœY¹zFάėW/÷÷¹ŃęB„PGǘ źń 1¾ėüóvkJÓl…¼ÖóĄŻĻ ņ»§@CĪ ¢g!üA¦— Éļžłpś‘}8ퟒ“¬««ć8.|Å Ńhlnn¦ØŸ-CUUU xu ¹ŻŻšŅ?>2 õžčóuÉ·VĢ©ż”rņ­ó?«‡,ĻŃĶ‚­W•POLń?Ž¼ā­šóßĒtĢÓ‹į‘§®xAŁśåģ÷ށ 'H¤±Äj1$żé¾vųÜ}öa™˜ž¾‡ŖÅŽ+;D‚#ŲØŽjƒAƈ»1é¤1„P†T’f‹ŌS+^•ÆĻš›‹Ņ™2Łģ÷Žgi%kĆquĖDČ@+)) aJ„ņāŋäóÖétĒÉårįĮ––†aĄœzæŌ5x­'S&r÷!„”­Mæ2-Üō’āé%ű.ŻP «T–¤V–€°Ūķ'KJÅ_£ˆ2@“Ā_}ģ^3rfĶ™æ!t§ļøŌƒĒǜG!e vNYZˆ…Ś1KZ–•—»°µ)‘<µ–ę±Q^åÜ¼ÜŚrkf×gųÕ<]īŸ<UæĒŽć4ˆĄBćɇR©TĮLe&“IdWr»{«?št](8õUÖÜ<·†ÜżYsó”­Mø^RBŅŠˆ,d©˜½>Ų{GWĄø؁¦ĘŸ¼ —"„Ź^*ĢĪ™…ź½zøY¹JBŃYR ü>ņ—‚¼å/8J(zuiYB¤1„ēĘJcńĘĄ0––Å;n|ü‰£ü54ń™A~ŻÕ:3ČDČxž×ėõEEE…°ńES™Į`ųŁĮć)))aYvŲė½ńń'ß.iČķΐH œ)(½e>ųė®NŲFdĶĶK¬ĒP SN}&=8ģ'‹oęŽėW/ļ­«wŒ9óäĪ_čóšwśnuŸėģ>×9čõdI©]ūŚ!€ŒŻŻ?sę-({%0p6į¤"9ł®ó—Ź7ɏ׃–9šķņ—øūS%¹bģ0ävß?i½gīĄ…ĒbNķ‡i\T“ć8Nē_Ĺ²²’eYš¦£x/šę²ü“3_’>iśžŽóæŹĻ7„ū™ļ:ŸĄś®£Āž/7ųƒŖ_ĢNÅĢæ”P(\.WœSŚ÷ßvÕl«ś|uSŠUļ•K¶ĒB3rf†Ļļ>{¦}ߞAÆGx~’mˆ_8ƒā£s ćŸO ņ+Z­Öš}qćGci“X$ ū|Ųå‰`Čķv·ģæŹ°LLpaYÖ?1‡\.7™LQ÷Œœ;vģų‡zz›’+BØöĪķć^^÷Ōß®÷om#C1ž˜4iBčĀmRlo\Ų¾éUŪ×ĒźźźĀ7!ĒĆ6–)Ė‘ō(„‘~ņåø·,{zƒ•:›’—†ī0v»]§Ół«A“Z­ŃhŒ®öz回ŚÓū}ľµæõāŸ/Żż·ūļ†B¦ļ’‡ł£’ĆōžńA#ˆµ,ŅéŠq"wžBŪ×ĒFu\"¶1HLKmҐŪ-Ŗ911x­’L^ÆžĄ$aZÉŚōsń˜į—¢(³Łl2™¢ĖaŠÉƒ×z2¤RFžwwļY,–×ŹwÜķCSYBö¹”0żNaśéŚ×1½,»Ł„ĘĘ šØS.ģxHcƒ×znŌī„ü.iGcż®†FŖ`‘MÄ|KĆ^ļ]óįŠ&±Ē%’©+ŠdåŅĢ|čt:5æV\\]ƒxÆ ©ŌQ¾ r£äÖ~4æĮˆ½ Y–eFäYSSĆq¤¹šČ†Óēė’ŲSŸ~ ±zŽRś Bhuéś5ėÖļbß¹~åņœł ¶³Ÿ„…ö}{ŗĻžĢU |k)…ū3‰hlŲēó¤iŒ0¤±ÉŹĖh Dh‡ū‡BIĮ¢i%Åi)…K.åļų>NÜųų“»ęĆ9Ś ;cČķ–•o@~Žņ ƀ/¾Vm6¤­R©TœĆā³­IģóBąŃėW.Ć×QŃŪ%‘RĄ[»kŽEhjŒO©Ģ`€Gšw•J0eH$O-/z*c†D©äŅCn÷=óį»ęŽ`Ö/„ŠdYöō’āi%kÓŅķ%D†_“É­Œ½ƒ×z†}>ŗ`ń° )œÕ;F”Pp§×ė!5-Ąår1 c4ž?įk·žGŅXaŖtQļ•KPE»V¾ŗ©‚;qL™“ĘL1ńYėēVŸĘrÉ=½iŸÄż®¹ćž¹#“T=­dm°Ģ÷é“ɤ×ėCgųŠęnm›,Ė~īŌqYł†š»”¦i“ɤR©ŖŖŖšAĒ³qćF»Ż>žŒ©ĪaڼæKƒ,!")źNß­9ó„©„ógäĢ‚Śc”AÆGTll;ū‰H éóš×Æ^žJD„)šO㤺ē8.L/ß8eø'ˆ“\ė] ?ōō «T¤Æõø[÷+Ż˜’—;­¤xzÉŚ4NcĻó¼N§óĻŽØT*£U6åžÉӞ®ó³ß{ņŅ‹†½^Ø”3¦ėčõz•J%2•Õ××C…š¦ķv;dbT©Tég9óē°āg~mś»’œŗOŌ{åŅŽŻœŪŽwfēĢb·UĄ×,)µŻ°#t}NŸ‡/{©šĪ£TŠźWķj:Š}öĢ–u„.ųpį¶wŃL)BhsU5(÷ī®Å%4_ŻT ·„ō•īs ·Į5 »£^ 4;gnp8ˆSNÅ4vēKæ\‘B±ąĻ%ėī™ä°Ē%’i%ke>˜o9”£ŻĘ,ĆÆĮ`°ŪķQį°¾–żW·źŻ­m|׳é%ŧ¾Ź­ż(ā.S™Ø§ĶfS( …āŁgŸ-*****zņÉ'5MĀ:1å0åŌgL+ފíAĻ쟢pü¶eŻ*\3E"„45ھ>–%„Ō/®ōzj¶W@ŽÄ`PtvάĶUÕ«KĖB¶ÆµļŪ“%„pSēĢ[ąŸ@«ūģą0ųՁ¦Ę#Ūš_! äo¬Łžxį$N4e[ÓrS¶~ł›žKi)й[Ū‚½Ķ9µ>ž›ÜŚŅ;} aĮ2üŽß©ļ:å÷•Ć^ļō’µ“eŁņ­ą.4~³¢B”°ŪķZ­VxŠćńˆ,琪1-9Œzb ÷÷ŸĘ3KHŌ}üv³ļz=3rfžÓeėw·²gŹŪ›ö€Ģ“«é wb”Ā`_śēĶŪŖŁŻŸuuŸ=“;įvvüu;»ĆæYū¾= ŗ±»?Wæø !$,$=#g֑³ßm7ģĄœ7!hLŁśeŗŗB@t\Ą) ŹdėlĮ©Æ”­_NŸ9‘9ŽS©TB ”6~÷æ!·ūRł¦ļOYoŌī̐JŸ;u\¾µ"ŗB­Édjnn}ŽĒća&‚Źń„ĆbžŪ.p8Ü\U=S.”čŽ+— Xsīü”ÜG“4ŖH·}Ó«Ģü™` ĆåžCī ©śį”ė#„ĒeĻL– ¹8ŃŲąµaeÅtĀ=sĒ„ņMĮ—”Ęģ÷Ž~üQaųy FXg'BŚ-œįW$»Čår«Õ:N!lšZ£üµ»ęŽL™LV¾^¾µbvõŪ±{NgµZGe²”—č[oZńVč"œÉæaū&Œ€ š–°Z’Y¹*ü$#ž× ‡üŅœĘĄ6––&ÓŲ&4½¤ųłóßü¦ēRnķG¤Ę B$­śz±omee„Żn‚D؟¦āŁļ½u , +zĪX Fæ‘™?¼5é_džš’`pœÖ¼ā-Ķģēży«Æe_Ė~„Š]sG×ņ—£žøŠWT€ė2ć²a+8+ė 8Š“gŠėY]ZĘīž<ü$#ž× }— AcilA‘o­ųMĻ„“wøŸ €äR…°ń$Höz] PÓgö{oO+Y«lmŠ'1¾Ńt¹Ūó–æüÉ澄²¹/±ßžÓx8Lč^Ļww”ævå÷•”ū'­©Żł—Ś”LY6HĘŃj?8Ԉ\ŲĒ‰Üł <öī®ķæķņyx\j7C9±Š©Cīܾ…ŹĪ‘דԕPĘ žsµd¤1Xė§O°"“)'„łg©/..-„…£›ŗk>ģjhōt]¼ÖC,Ī­żˆ”Dz‡™ė½āT@SĖ~pž~³ųyŲ4xŗ.xŗ.€ˆ.X4­d-ģ8é‚Åæé¹ÅķuŒB6WU;®żõ‚¢_ĪB\÷ÖÕ²ŪŽ€rb”ė5CŠĀö¦=»Ųw„ö­ü„Ė€#w×¼ ‰¬„€rš¶Æķbß?ɲ×ćW„Ģ7FfœhlŲėå»Īß?y:ż¦œ«”ńy Ivą”†Ńh –į7tZĀaÆ·[³.“ń]ē»5„Cn÷ō’µO-/ZŲŚ”µD8Ž(r¹<±Æ@7÷E¹džŖ9ʆV-ä°łOü²ŠĶJōł†Üż”i%kēŌ~²/Ō.O-ÅIŁėo~ŗÆ< ³¤T’m×vƎü%…ƒ^ĻŃCķYRjŌˆ›«ŖgäĢōzŽjŸCŒķ†`-óW®Y·žÕMč‘ożęŖźx¦‹”6¹źĮl’SA!Bč7=—ŅĘ\ i\I+½,¹T˜~!ćFĄZzCn7X_¦•¬Ķ­ż(±$-ĢėZ­Öd2%ö]˜®}½ńä§?½‚g~mYÅÜ|÷ାŗOÄaYžēńÉ/=’’~ vq–wu:]KKĖ6ƎųH-ą²>µtŸ=~ŹŒ±ę ‰ ;|nŠS ©ōq‰äGŸoČķN3uŹ“’µTĮ¢Ģt¬¦–ömaÄÉ„†ÜnšPõt]øņ4xĮ€lŹÜ¼é%ŲņõR©¬|}ŸŃd2Źa!ˆ+H,“éę¾Č~ūO.ß=ųŚń—?Yn|žø’õ·Ė_śīĮ’ŠkžżąäŸi’Ø'¦pæż\²Ā@|ÜÜł°‘,LD&KeĻ”Ē"×ŌØ =VõĄcqk\¾åąoz.„ŸI S&£ SG*Āb±ˆ8L­VŪķö0$öVš“XV»t·¶Żųx'Š—#b°,»qćĘŠēPUYY L¦R©›Ōƒ}īw?#¶“ŸņæYüü„ņMPNįž+Kż9 !düMEh÷śXwX‚ ĘŲ Œ)9Nüh,S&¼Ö“~”cW~_łĒ¼…wĶdü„‡‰²åsęüį»Ī %?p÷ƒ;œL»a²,{žgʄ? N§y¬(•JŃ&W«ÕBÖ`«ÕJQ”ĆįP©TPČ8!Ų [’ƒžõüõŻÉOé‚EP;Žž/7ÖgŁż9¬nŁ Ļü Č1eŒ›p“š,cB÷ŁĪ䄱ū'O’¹dp›€:¼D©˜Bąy^£Ńų§˜źčč?|Ź$Źz’äiŗ`ńs§Ž'69äŠåQ«ÕĒ9Ī›7oZ­V«Õ:22‚‹Ėą4Œ§ØØ(!éšÆü¾ņO…oø&¼vüåO’϶uĻ:>šæ½°~˜6ļļōŖæOų ‹®Ć}TšÖėe{w× HāĢ¢™ŅE3„Bnė>{fū¦Wį8¤”‚ĻšĆ€?‰śū\(<椊XÖÜ\„PśÕĻ”•oo­ 4–BBĪók0@Ÿ&”`вjh XqķūS‰÷Ååyža‡iµZŽć@ń„P(†ńwƒŠe†±ŖŖJ§ÓÅ!C•«”±[S Ź š-ü­t¾Še!¤;ł)×ēČajŁĀ$É^OÓ4EQ(  žŒn»īōŻRÆ\āœ#ۄهŽėW.'/eŹd [›ŅĻSqźŠ&HЦ4Āōz=a8·ÆŃh,.ž)œŃćńh4šŠĖ÷°× ™ üqĻ|8еs˜(r |/DØXVWW‡jiia&¦²Įk=7>ž„ļ:•ėūžäi„Šüό§¾šżŽ;¢œōžæžPdžĻž¦œśL@WĘDv£‰ČĢƄŁŪµ«ę]„Šœy >Ż×žÅĮcLBĖfB…³ä„1„]°xČķN3ó˜£ü5“$Hf@ž_H1UYY _įO&“IXÓ*&‡øŌŚ!ŖÆa_ųŖĘˆ8¬¹¹y¬ž‡z½>¦²!·2h_ŁŖw·¶Ż3w „ä[+ęŌ~˜[ū!ģta;Čä(Õ²Q<ńØ'¦XV±I•ł÷‘^1ę;u0wa±Ļ’3.ŻrōPۜy Bxr'ށKŧūŚ™•«ó—.‹æk¢ ­T*ĒNWƒC:Gų M’m×õ«—!G0ŲNE©_\•Xöś‰ĘĪžAc |dij‰tĮ"”vę1łÖŠÄź‘B/ī:”ŹŹJ–eīņĄ,ōģ³Ļā# Róē€ļOYG­œēé:ē¼k&“IÆ× 9Œ¢(‹Å2žDĘP± \Ejjjģv{8ńąBÜ?yśž¹#kn=eH$(¼*š A–E4–½>Q4FQ”Ēćé½ri¬q]cBžŅe\«ąBׯ^ĘÉ8 ’įØEōó‚,ÉAcÉNc™2ټ#^õ3Iņޤ˲ąqNQ”ÉdŅh4”5BĶĶĶĀ(«7‚7„čuĖQr½q“É$ £(JØ5ēņٸqcGGĆ0&“iŌ˹ŻCī~ŗ`ń=sĒ÷§¬ƒ=½ćfvõŪc ”c ~Wdą¾a(ų]ĀŻėC0YGGG÷ŁĪŲŅŲ£,½×Æ^¾žČ×}¶Ņ'⤣j“ >F@cÅ¹”SW¼0ģó„MrEØŽK‚Ę’PĆy~‹‹‹Nghčt:‘ć¢F£IņŹČžĪJ„2Z†»åāŋ`*c&tLBoõū]Ė_†čo™vƒ|kä3Ģ”ÉĘŠB¦Ķū;QˆtR†ŁŃC±­>(”hȲčózŗĻžVė½r (Y¹…§QL6€ųØV«Ēšg9Ž46x­ĢcéQ.ŁÓuįūSր¾×‰‚Ńho½prūś’V­V’ō~=žųųGL0žĪŃå0,Ŗ:N0••””ˆLeCn÷?čoŖ`1z]C,§ÆČB¦œśL’ø×‡¦±ėW/c'‹X dK Bׯ\ī½zyĪüsę-ø~õ²ĻĖć?…£QĂ]’ ż‡³ćL0eĶĶ›,ĖžŃēģéMƒsJ^.õ(ÅAĀįt:†©ŖŖņx<V*‚)a±X„Ž‹‡#‚‹Ä\ <Ą9FChš¶Ūķ ­ÖŌŌ0 Ćó„i¬·śƒ ©Äæd"A|äN&—Ė-KŌ]„ö'«Õ:ž0¬ØpXœĒÄ^®†Ęi%ÅtĮāo—æ”!‘Ģ~ļm0 čõzHŒ¢V«ĒäJ“Žp:O?ż4B蹟.'Äß½ūģ™,)•<Ń`£¢låóׯ^6 ‘Ś'†Ę€RŠ =ĄqœN§s¹~ņ»xńbThĢétB°”P ˜K!d2™œN'˲,Ė*ŠŲ1J,œĆÄ7‹Ÿ’ŃēƒMē°×+2}į†Åh'‘¢Šh4«KĖŲŻŸ“Ž•t·¬[EQ”ÓéŒl'ōX¢šž57ļ:ß[ż¾x‹Żu>UzæÆe’]sGzD¤–&J.¾a£¦ō ŸĘjjj8Žć8\ņX– Ę&“ \Žkjjb§Łƒg‡q;öz{«ßæńń'”ķŖ`‘L»!äļ¾”Óé8ŽS*•.—ėŁgŸMlżčä(Zjµē}ŹĮh4šˆ„łĒŲśŽźī™c ˜9—Ź7„D×{½©Ży=ķŹ§%æ&Ģš z6Čķėr¹¢āÜ P(@°-^0 …(•JeŒ’g¹\‹ą0!nŌī¼g>ģnmr»å[+”­_†p-†ōĮ°™ŲøqcRyu& Ć@ā.ö]Ņ”fō‰£Żē:)ŠOŽĪDҘ|kÅdY6Tźŗņō·Ė_N!§!w’”¼Ü)y¹ ,Q?ŃĄ²lĄ æŲEŽf³EĖŻ@”Pą‹z&œ ĖPĄgČQ‹†ź_07ŸZ^“°µ)ĢąeHÆl0B---*•*icĘć(=jūśXj_Ž3€ęõzżx<³īźˆ‘57/G»į‰©O]Ūöö­Ļ>łė_įųSĖ‹žųÅŌ$ļż'~15ū·ė²»Ž Ä8Ąn·æōŅK’ķæż7„PqqńńćĒóņ~fX>}śōéÓ;::¾żö[•J%śkd»i`&l$Óétz½¾ŗŗŚn·ēååMŸ>Ó–Ū¢ā$ ąyž7އA’ŽyRÜ?yśæ³żŪżļ'˲é‚Å»źå±&ą`F„R?~Üår}žłē/½ōī„ ˆéÓ§;N‡ĆqżŹå’×ļ6‘Yģ½»km_£(źæž×’š™™ńuęāgNoõ¢źM [›’?8ŚÕŠ8%/7F±2"!,Ģ æą8ÅÄø?©>8Īd2ét:§Ó¹qćF‰b÷Čń ć»Ī»å[+肎ÕļS‹ĒĪ/¬*PWW7‘ŻńyžW(g›aGLÖSż·]e/z=ć$ £±aÆ··śƒļOYż’”ü46ävw-!”~Ŭ“ ŅÄāāāp …0 c³Łb*µĄ-b7qāą,tDŒā#ąX­V+*š6”`4«ŖŖ²¤TūńĪJ6l)}„ū\gTv„‰±%, ‡„†Üż“eŁO-/"c1¦ó_„RA†ßęęę0ƒ fˆŗ—¼š'Mšd³Łb÷Ōœėźź¢Īa}-ū!r_¾µbZÉŚŁļ½ŋƒ©¬®®=ŖÜęt:'ę0ÖėõJ„rŠė©ŁF*:ż„ö}{ ŌYTv¤±¾–ż Yč}Nķ‡)‘„Š?†† ZB˜N§¶P«Õ&“iL6'»Ż0£ØŃu„Į``FÆ×;ŽńO§Ói4ńVT„RA”Ī88ßųųwkBØąŌWćÉ@?*8ŽÓh4'nQnI< ‰jŠ{åŅ–u«½žˆćOcč‘:>Xh(²—Ä¢˜ŪÕŠ(+ß@Ā·c‹ÅK9ųąFĘCø’d“RoLš4 ņĒckĒ8'Ž­K„Sķs¬Æ»ęĆÓKÖū|ŽņM²ņ 9Ś qŲ”`Ķš„5•j!Ōv¼3…’kÄ>æeŻŖėW/GŃĄœ„"]°XŁśåĀÖ&*+A»[ö“TŠ1ŁÜš¼F£)))ńx<`܊xÉÓétZ­!¤Ńh¢¢ĪR«ÕąĶÆR©Ęoę “Ć@”‰"‡u—¬ūKķNwk[¦LöÜ©ćqą0„B”ą8^GUUU2×o‹ōz=ÄÕmY·Źēį'ņ4ßUóīõ«—A:Ö57–¢d–!•>.‘L#ÅY¢-„ 3üŽ?4Źh4B™ĒØ0ÉdŖ¬¬5 Éd‚©ˆ„“Qé9ŗĪĆ^ļŪ!•fʲ'˲ć?ŻxžĒūn0•%yMķXĄd2ÉåņAÆgĖŗUvš·ļŪōĒj)EY’X‡ūŸŗ@Ķ(+_?ū½wĘōs»Żīt:ķv»pĀĄüA‚Vš¦a7­R©¢²­&ˆŹ§×ė!@J©TšL¦h-ßN§S„Ry<žøÕ1 “_AæQT¾ALK¦,;ßr§ÅŁ ‹3ĖårŠƒĘ8ŗśŅ”īŠ‰™kńČĮ¶šķ°On¼r²Š˜ĢB£ęŒēy²ŽŁķöˆ=Ēär9ŲÕ!l3œŸ\ł}eÖÜ{¦÷Źåī³g ¼)ę3½^ÆÓéü§Öąµwė~„PnķG„‡Ę ˆ !Œe٘.dP5C.—Ūķö„Æ˜Š˜ŠēÓAĶÓJÖ&j¬ā.ĮBŃńj]MrJo­ »׬[ŸŽ+ä°%%H3™L,ĖāŹRsę-X]ŗžY¹*ŗ!ń܉£Ü‰£Ü‰cƒŽ‡Q;Z­ŠH*#DFcPŁ+¬ČŠ¢²nüKXDlözł® SW¼p×ÜńżÉÓ¹µ&Dm€)*“°…ŵ h*ĆņhzkćĄaÉNcBĖ’RĢŹUÆnz3¦Q>Ļ8v iV9b2s”æ6äīĻ­ż0łó=„X1ca‹ ”O»yóf~\ƒ×zå›~ōł~e>˜Ą FĢaįXA Ź“¬‰}5ń®®Lvä`Ū®šwcĶaÉKc3J§,)U¶éĶW7UH(:n č>{fļīZH—‚Śžæż¶ØūMÓł–ƒD&KQąåÕl6'dć#»G=3²i?ävwkÖeʲsk?La?Ģ1Yņń‚®V«ĆĢ:–fc2Iį§ūŚć¹ÄÅķūöģ®yÅø,C’Ņ˜Šż:!ŒĢ¦gü»·¼ńzĆ’‡šAź49EÅ?7œēȘ ²lgĶĶ“o­r»3$’DłaEYŽhŲ–&—Ė-ĖÄ1•įŸ‘3ėÓ}ķićĆēįwÕ¼ ńań‰uI.ĆŲ@ŠŽnŲ‘ ŪīÄŃ]ģ»wśn” éX•6Ą‚B¬Ė¬„ø58g:N‹Å ®hš‰d¬LÖ[ż>Ō›u‚Ä09,āػݮŃh\.EQF£qāT‘ĘŖę,)µŻ°#„>zÆ\ŖŁVF™øT$aÅŒœYģīĘü„Ė’j±·®ö@S#,@j·˜Šųń߈ąõ}T~ņ—ŲB3ßuž.X<ģõ:Ź7%P‘Ćo*ĶLe7>ždŹÜ¼Qs \żā*vwc**Ū÷ķŁ[W;č·ĻNRИ0"2y„0tŸ=Ćn«±,yĀi FŻź&°Šcų6V&ƒøęRŽD}ņāŅbњŲ™3f•Xsؘ* ąĻ’RģīFfåźTyŅžŪ®šm`‰ *Å8ńX2¬2B”%„ »ŁŻŸ'ķ6$é²ö杼W!„6nÜHh,łQÕP“ĢjµĘ“ĆxžW©T"Ójµ”c×t:]ss³šˆĆį`ĘߘwĻ܁žyåō„l@;::(Š2›Ķњ,˚ĶfاP(R1ćŪšVRüøD2§öĆ0•½,ĖZ­VH½ųÖėe[J_éæķJņ'õyų½»kמzp˜Į`ą8.ž–xi +…S˼¹‹}ŒI•¬@„śæ³‚s™lŲė½Q»3·ö#"–p% $ćŗš](F§–ņƒļ:å÷śķ†Č NńģśOŪčéMø.=ŹĆ#Ć :ÖX¦Š–±[SśCOÜ|Ė”ńŒ"½^Ö²„ūl‡&0HśœĄ}FĀh WDMEĆ/÷MĄĀI aÅįųē†ą™0É¾XZ8|ᢲµ)įU[U*ä8µ»SŖ˜Ź†½^WCćģ÷Žr»Ż-ūå[+Ęł Ģ ) 6WUG7Ń˜ "0Q„×ėõz}b_Jbh OõŌå0@LÓ6ŒsɃf Q0ą#ć¤RĢd’aręÖæń¾Ū%W(8«uź¬Yźµ k‚;Ī$d2ˆ=’Ńē‹EńzQB¾ü%…«K×ĒŁ/æ÷Ź„M{pŗ¾$!°„ŃXŚp–É@»H˜,±ŗ,kµZ£Ńē ę/Öą°šq×ÜįnŁÆlmŚ’‡?Œ)2š >p54ŗ—HāŸmÕn·›L&Ÿ!„ņ—Θ9+;Gžæ“!4*±õ^¹4čõ@-Ęī³gzÆ^ĘU>@£Ą0 °WҶøŅ^nŚŽw¦Aź0¶ozÕöõ±¤Õݧ%›ž#Ö6ävw-!ę–±ęų ˆ†ÜīļœżŽŪ™2™«”1±åąķv;ĒqĒŁķv„ 1gŽĻź ‹čJµZĶ©žĖét:NŽćœ‚Ų°¼„R©hšV©T …B„R„œ>)~4Q&łK æ8ōĻé:7zÆ\Z’R!J\)‰œœ¢(‹Å’=cL9쮹ćĘĒ;zÕc2žēań‚¹F†_0öŗgī€LŹžx\"™ŗ¢H¾µ"˜zpČķ¼Ö;uÅ ®†F¾ė|nŲé9’Ao! R(Éę)“ģ4nŠégóɈj1¦HxyŖØ8Ö%‹qög2¹\.j̬§ż$‰ +_ļõu’äéGޤčąÄ£1§Ó©R©<Ļ˜Ō‰ż·]P±Fˆ9³DŃ>äP{žŅĀä1¶­YśĖ;}·&Z)ŪøéL˜žsX“œCHc?\ė ‘§#ĢźeÄu0x­ēŹVżwų?™’—«lm&r»3e²Įk=.YG,šß`L %Œ 146š±Ŗ»ĻžŁ²n•č ’E Ęh–”ā®ÜN’>Å-¬=A0$6= źĪžūż03t„ÉdV«5%¬ō1å0Gł¦żr(ƒ=ģŃ9½ž'“¹[Ū\ ĻT杣Ż0x­'įÉSü‘‡ķ3ųqmŽV=¦fI©ü%…!Hœ<#gVvά9óˆNĖž9 !”“DI ņ—.Ė_RŲ}®SÆ×_h!±é9‚1G3 Bē}¾{ęŽpÖJNĒó¼(XĶF£q"ÓcQŌ“’µÓJŠE÷Ožv·īś}üŠÓė(ߟ=]ēs“‡MPi D1õ‹«v5ˆģ ‹fJB›«Ŗƒa’mW²ŁŪśo»ÖžzŁ G Oρł vĪx%żžŌiģ—ŽhXRR2źiIUį=ĪøņūŹļOYE§•¬ ÖÉą\#¤½§–M+)N`%‚QŪzcXŪĪīˆÖ5·”¾²„ō•ī³gÖ,żåŽŻµG¶Õl«ŲRś üÕēįŁmo,š)e·½±wwķ–ŅWŽlƒ?ķŻ]Ė̟¹„ō•ö}{¶”¾²‹}GōfžĢ½»kįą.ö-„Æp'ŽĀķĘŚČģ™ņÕ„e°'ƒl<€rt6›¢Øęęę„D†ĮnLÄa:*6äv»ü„»ęŽ©+^ŸĆ sČ µź:ļĻa”{ęýÕļüÉō’bekÓć >ņż)+Ö=LDcY!”æ¤0ŠŅR÷¹ĪīsŪ_/ƒ,)wśnĮ‘‡wÜVŽ!Gµļ­«ķ>÷0™ ®®Ż}®swĶ»Żē:Æ_¹ü×­:zØ}FĪ,„ŠŽŗZ ½ėW.wŸėdÕ3›«ŖB---ąM™ōģ³Ļŗ\.¹\©¾ҌŲ8z«?xąīw·ģė‰+lh„čŅ€L6ģõöVæŸ!•Ģ~ļķ0ÆCę4EŠŲ­bį`ŠėY]ZŁV0śo»l_Cm3ģųāą1įŸ4ķA©_\eżīV– ”żČĮ¶ėW/C$ĻŃCmĀ»@2éZ˜=S¶=āÆŁąĮPqqq“äžšAē±bvõŪ“eŁó?ó8 G_-—Ė'ęöz…¢Ų“’µÓJֆf²o—æ|Ļ|ŲÕŠ8½¤˜*X„ß ĻMŸ iĢb±@YēØd«!I!»ūsѕ»Ļ>”œÖ”– ’ŌŪ2ٚuė%;o@¶;ƒŹĪ™użźe,ķįæfI©O÷µG\įÕ×ßDDÆ8v€G;G]]]B"ĆPg¹\ÅŚ[żž]sGÖܼēN I„RŹRÖįž8k „dårk? Čdƒ×zīŸ<š^²vJ^®¬|œOūŃē¼ÖC&ęD¤1B^Ż“¼S©'c%Ī’éø@{ų§Ū·Bׯ^޲nÕīšwEĶ·`<9ų™•«³¤”Ēć!žŠįĆd2yPeµZćŸb S)äw¹\Ń¢±rĻ|ųzõCnwčäy~ŌŻäØē¤%~čéş'˲ĮÉ0 “ż¹d]oõĆ^ļģ÷ŽÉ·‚3E>ƒ‚«$båpļt:a XSZ–ü½0#g֚ҘԠ[SZv ©Ńb±| į įé9„ā (Ą|īƗr xÖ’ų“’āū§¬!R…Ž¢ }šĆį`fę]n2eŁ?ķMk?öõ Sņr1Ž)tš M¤1?Ō/®ŠgE1l*ćNõyxэ;q!ääuĘڼ­’‹b“Ą®F¤±QV(ą°ŹŹŹ.»”Qą¬V«Et¾—`·fŻ]s‡šČż“§ūZöƒ.qzIqd2kQQ‘Ø‘õPŁ T*ż™l¢ÉdCā…ˆĶ®~[苈śŃē»Q»S¼Ē—JČÄ$4†ba IcĖĄ}ƒŻVQöŅϼ?Ō/®Bhj,[ł<6ƒ!„Ą-žNß­-„ÆģŻ]»‹}§ūģ™(6)wžĀ9³<Ēqd“…, (ĶfsbL&SII‰ˆ  FqńO|ćńx† ‡ÉÆõüčó]Æž3ZüKķN·©‘Į²ŒŒŒŒŒŲķöęęę ĪdB Œļ:?C„fŠņ÷ųöśČܜŠ4ĮŖĢŹUq~vwc–”ōzDf°ķģp©ļļ»5Cņ#{¦Ü°«1KJuŸėÜ[W{ ©ū‰DWF$4ō•±,‰•@ķ«Ńh ‘¤Ćd2 „Ēy4F‘29`&Ė”egʲ§äåF,‡ä0‘'§N§›ąL&TՂdĘwļ֔Bzßł Ę_™†ö]Y×ČTMZÄÄ6KöŒœYQ ×yĢ=¢Æ"·{fåź#*¼~õržŅežä³ģ™ņ#gæė>{fμo½^v§ļ'·ū5ėÖÆY·„0ÜęmģŽAÆ'ĖĻ%$[²ģč”vBc–xž×ét(”é9šŗ:8Œ¦i` œKˆ!“LęČ׫?€„æŹÖ¦Č‰m‡Į)z"ōȒ'lš±“MÉū)fł»Čķžžäézz‡ÜżĆ^/öų@?·“ĮēÜŚĄw#+D@OHuCšYāköL¹ˆ,%æt˜ĮB¹‚4ŒłK—ł<<øŌ‹2ā‹.Å|łŠ ž`ąZ'EĘÄś…‡ąLÓ“Čręp8t:]ßEQ wkB(Dźśń7’0ŁĆ—%üB¹gWæU` ĘdBÓŚć ɦ˜Ģx,F+BhμTNŁÅ¾S¶ņł-„ưŪ*@ŗ~āN]³ō—[J_Į6³Õńr”Ģž)©Ž¤°X,ɐžp¶Š«T*‘ĆNKKK°Ø”IFČdXÅü9,Ģ(ģ «]̐JŸZ^$$§ĮžŽŁļ½ć_c% ¾0GšōŸ’•`BФ_ŹõĖF\ærłśÕĖŻē:!ǧūŚńqH[u§ļ֌œYŸīkg6aø&4&Śč$0=ę°`œCŠĆ0"bØÆÆ(y~ūÓ(x|„ÓȀ~ųŚd2H+•łsƒÖ•ßėƒE1ū3™2ķ2g“1Ép?iŅ$„õ»[£zŪū<|ŁK…)õÅĮcŃrĶļ½riŠėń·ĢA.,)Baø„ō•īsc-6* $“Į`€$“PR=±¹’Vp’įĀ1f³YäŸŅ­)ż!xŲģœŚGõņA“c}^ߐāāāt žŸ,ĖĪŹĖźu—Hęfłß’“tTæļO&ßZ!ßZAęģĒĘp&ÜphéśÕĖwśn]æzYč?^ŃgžĀü„Ėü…­ģ™ņü„Ė¢bōźæķjß·'üó‰RQš¦Īa ƈ8¬¹¹9ü}˲Z­V$ō_ń°×ūCČŌ׫?ā( ‡ †Č҈ųĖdi–ŖŠļ:ļjhDĶ~ļķ)y¹¹µęÖ~( ūŃē»T¾ P‰~{’äé!æē)y¹²ņõdĀ&9¢ļā4YqGEžŅe7Īfć­BeƇ›g ō«3'PĀ?’Edn&&“ÉétbēL%=ł Åɲģ©Ė‹Ø‚ÅtĮ";Mhknnńų{|€®2=Ņ~Ž?yśźV=Bˆ*XD,Ī·‚ćŹÖ&QåĢ{ęĆ÷̇G­žüøD¢lm ńŽŅ–Ę‚‰/ŲpμŠ½_–”ŹĪ™Ž|>„·#ŪīōŻŹ_ZÜ'cŖĻxįg”ž_9wžB|SpP„LöŁ9³øĒBĀ„æż·]܉cžĘ¼žŪ®ī³ĶiĢŹUŠīæķźļ{ø…ļ>{«(}žČ”vČ»Ÿl5< DÜÅ ĪąøˆÉĘćńh4płžŌiį‚H,zjÅ tĮ¢0SOéõśčrX3Ł]sĒŌåEtĮ¢Ē%’©+ŠDĪńYsóü™ $³`ĘKĆ‡„ F¢ŗŗ:„ŠźŅ² ·½ųvµųāą± ·½sę-@½ŗ©—SćÖļnͤŸuSÅ…ŪŽW7=TL_øķ=ü§‡ŗGėw·.ÜöĀēO÷µć˜æ¤šĀm/ČyšC|#|}8ēĀmoŪńNąOÖļn ;jFĪ,ėw·š5…^AŌų‡/5BPˆ“jĄa/^Ļ5p(€Z­9÷ĀJūļ6Ž6ż“ļźµ.+JÕÜÜÓ~Šjµ)śN/’G[ī‚žw’addäß<ž`§ż›ĒóŻ›’É–» œ’żæģq)‚dCōmc :ĖĪł™D¬\żHZŗŒK>ˆ±«ęŻėW/Ļ™·hļ@Sc’mÖ7‚DõŠ®põrļ•K˜KĘŌBHLÕ}®bĖv³ļ‚÷ꦊAAŗE Eo®Ŗžāą1Ć®F„Š¾[šó—āŪm®Ŗ†”‰o½^rÜ.Vœ)?ž‰% BČ7žł/œNē8]%!,ZČd6›M§Ó=wźø²õĖķ†ČBް?dś®ĖßNÖŅŅ’Zv²!·ā²ęę>.‘LÉĖC…ž2¤ŅłŸÕ/lm į‘ųøD2­dmĮ©ÆśåLt„"‡ķėcwś\?ŃĻŅe¢†Pøyó¶jfåź9ó\æz¹ūl'Īhużźe\²¹ūlēœł °–2üfĄÅ™ł3½žėW.3+WC4ōęŖź²×ßģ>Ū)t64ĮYŅKsfó¶źü„‹MĆ_»ĻžÕåvĆ„ŠŽŗŚ;}·śo»ˆj1©ąt:ĆĻ1VØT*HĘ(d…B1ŖĆĆ0*•J§ÓéõzN'$FsńāEžē …B”0™L&“Éh4šL&»Ż>ž¤0)­]ģkŁļjh̐JņĶgWæ=»śķ0Y‡.XL,ž]żö`OÆH£52S…BžŅe¶Æ]ærłĪŅ[X$SŚŽŻµöķéļ»2„¢E|^O÷Ł3łK »Ļub.ōéBr-ęĪ[Š}®³ūģ™ī³E+0Œ‰219Ų¶«ę]”ˆęœƒń­×Ч¾Ów‹ŠX2#깯4Mss³jjjF„1šläyŽf³ł»n ÅD8¢•&™lšZOÖܼ¬¹¹?ś|Yss‡}¾ŹÜdH„Ągd"¤‹Ū@Øź}$Q…pMÄńĖ ,D]ær¹÷źå9óÆēč”öQé0 ä،™³šM}~"בƒm”5„ekÖ­?zØ-Ų„š°Ė ArĀd2xń±€Ńhäydš0)mLl‹DˆÉ/“ {½D±^ųŸ.X,ŖĪL@¤±(o{BXé÷s6*©eFĪ,’0dą9„Pū¾=Pō²’öC×všŖ°}} .Ł!݆č"ą1Ų{õ²ĻƬÖ}¶³÷Ź%0€Ķ™·'<×ŃCķłK _}żĶūö€dŁėo^æzéč”v‰”ŚfŲa;qŽgĻ”ŗÆżČĮ¶AÆŽlg?™3o!wā(8īÕė„ b`‹MÓ555£š— ŌZ­ŽJ*¬XÜū7Ā9±°į…`2Gķā]sĒw>wź+'ĆaÆ÷FķN¾ė8"NÉĖ#AD?50ĻóO>ł$J2[Q÷Ł3[Ö­B oq䯊,£+Į(#xŅ$ж 3IBĀ`Y–ć8Žć†a&*išCÜ]”Pš<óc½;䮫«‹ŠņsLšĻr‹q;ģõ~»üå}>Yłz’źk|׳Kå›BóŒÄF0*¢ÆTěGф8UĘγ`"¬JŲtŠh4O?żtQQMÓXƒ‡­JQ¬Ņé÷I“&©TŖ§Ÿ~ZÆ× €įßćøšššāāāųs ¢]Œz:PWC#¤†r·¶ ¹ŻpšžÉÓß. eåė¶6#HŒ4ś›Ķ–¹'9„1Ø’bµZ›Ö}‚D™‹/bĮUā#jµZš¦M&“Åb)**Ó{ĒŅV'‚Ņ2±2YtW‰!·»kłĖųėSĖ‹ęVśfńó?ś|ų+A¤1,vąøądĄŒœY›«Ŗ7WUc’ųø’č¹N"Å ‹E©Tā’f.—+Ī%r4 Mӑ£1Ēćń”””%¤¾ČdEQ埀qœč­ž@ųõūSÖŽź÷B¹µŹ·VäÖ~HĘ0Į˜Ø Šē>QȞ)‡ÜQńōEQ„ĘāH _TT$qāŁģsˆČ/Q®¢äXŃĀż“§żóŹß3–o­˜ŗā¢E$HƒyHRZ<ÅĪv¢Ńr4DE©TŖńgL ƒbņ“ŅN* Ø£¢mąS™P,Ķ’pA ųs¾ėĀōāLO b¢TT©TE z=I%%ŽĘĪ‹'Ą4‹uqń4Œ„ŠŠŠōz½Żn/** ķÆh2™@Ŗ×ė…¢°īÖ¶~–7>މ³u$^Ci4š–––£‡Śü³uD†#Ū 0K½r5.»|ä`ŪŃCmYRŖģõ7ĮqJn®.-;zØŻē噕«A‚j–š×9³Ö¬[ļóšš»Ļž™1sÖęŖjČä+śłvö“ń·’‹ĄµżŁgŸU«Õ8÷.é–Č T*AC?W“‚°+Õ8L[”PÜ: ¹Ż}-ūƒŻčGŸĻŻŚ&ßZAśœ YhŒa˜––īıØ0Ä]įÆ@cģ¶7 ° Pø =ŌÖ}®óČ”¶;}·ņ—®.]?Ģ_Z˜=SUT¶vų<ü–u«ęę8‡øĒŽü鲄¢E?‚NęÄQ„\.')<āŠkY,§Ó‰S@Å ą‚ÆP(4 d™JQŠ4SĄ’ą8ćńx``sDZ_e0ŻćwŠź/‹ąjhœV²–äé H"ilćʍwśnõ^¹4~¬½iBȰ«qĶŗõŽÖ}ö pXŪńĪ£‡Ś45¶ļۃ=éļōŻŹ’Rsę/ȝæ0KJ z=Żg;ó—.ƒ¤PłK 45^æzyFάö条gGµc!’Ł’BLBłK–!„īܾÕūz”ŲŌ‰Ģ“ŽĮ~>Ą³ćģ®é‹ÅB¶hé,!„4\.w¹\G¶­Y·~<—‚Æö¦=ƒ^Ļ–u«ø+·Ŗ)¤Tīh-™•«j¶£īs rVĢș•ż(:**D4ķA%$„Aģ ×ė9Žs8J„’ŠA:ÓģŌjjjöÖՎ“Ę€ÉŌ+W­©pŠėé>{fĪüŻē:³sf}qčŸC’м\æzłČ”6ō()>aV®ŠŠJ`Qģ`Ū¾[EĆAšņcŃ4m³Łōz}ŌėŸŒ Åōźz½ž¢Ø;}· ’rÄhß·§ūģP$‚ÅP®_½¼wwm÷Ł3܉£!2uŻé»5gŽ‚G³Õ”#‡Ślė>{fœĶ (­×ėćŸ€ ÖŪS–e- EQõõ$’!AZÓMÓ RŗĖ>æ»ęŻ-ėVÕlÆ@½ŗ©"{¦<é²Õ„epå-ėV½õzŁŃąF8’rÆnŖ˜3oĮ ×S³½®°TtÄąNķ>×IQŃ(¤+@ #5Ķ Ž˜dø2v{<p—ģ"ŻgĻ@³zå*”ßcļ•K¶Ē@>ƒČ0a€³š P?SōsīÄQšęĢ_æ¤PBŃĮ~>V¬YśĖ;}· CTŠZ$œN'Ċ™L¦–––ŹŹJ¢T$HsC gdI)1Nū>…`mŠ¢œNgŚkĆɤŁī’ųĮ-R¬„ „5\"ę°šS5’‘@0*‹Ć=X–•Ėåƒ^ĻxT‹©‚žŪ.ÖfYv"Ģ·p2éįa0é„AHų q?|}2W“:īāŋV«u`` b9,üTd$$Įb‡‚†éŻ”5Ū*½„R9A¬bĀLzr¹<ōņgµZµZ­čøÕjnöæ,"„Ś’ļ„3 3ž]Z°T” ‰¤1†aŠ‹‹Bģ¶ Ÿ‡O׎lß·’‰„Ž`¦Fͤ‡”P(†ń?‡aU¤š²dńJĖaęĖ%#`TdÄķN&“I„R¹\.v[Å®¦éו½W.ÖŌ`0Lœ“3éq@Ó“F£‰,B'ńƒė¤™<'JÕčt:E›?N':‡Œ‚€ˆ‡‹Ēq`>ŁfŲ!L`˜šyų²— ļōŻR«Õ)Z°1ŠŠétN§²ĒŚl¶ŗŗ:¬b«Õ*’Ą&MšDŗn"//^$YÜĀĮcń¼Ć0ƒ!“»ęŻ43’½õzäģ€Ds&“‰ć8ˆE’ļ„^FFFFFFš››'šJƒ •h 6ć`äßžzYŚŌ†f·½&1P£‘Q]”×ėI".‚1\^•J% ø$H^CF„R I~ӀÉpõĪęęf²čtŗ¢¢¢(†‘Lš<fT"¾DBcN§“eYaéq»ŻĪ²¬č ˆS Ćh4ah„„ā!Ī#ą-išę8.=˜LČa$Õ79ÜĮd2‘>!z½Žįp˜L&āŽH! +ąétŗgŸ}¶¦¦¦¦¦FøA”<ą-†a0“AXį*„ “ öraHX,FƒsīĮ^œ8L&Ž!Įn ļ„&N¬‹„„„…¢(£Ń1$Ņ™`l4&¤Jknn‹+Ō7™L6›Ķjµr‡ įĒŅ/b²ŌņųšyxĀaĮ P(źźźxž×ėõ:N§Ó®rń!„Ōj5|ń\óÕjµB”ą8Ž,^<Ļ«Õj¢–'ˆīĮŪÜ 5Óéō_M†üfXP__?00@Ó4ģ²ķv;Ēq0Į(2Ŗ’4˜OBh<¹ƒćĢa[Ö­‚śŃ„Ć’Nšø„°ŁlBĒ3ųŒYĶn·3 3Ök “A‚šķģ¶7’<ĒG÷Ł3k~½ąśÕĖE™ĶfĀaIGc: ­Āƒ EŠüXS_=F£±X,ĮX0“Y,ƒĮš&göžCŁK…Ik*Ū»»vĖŗU2‘ć8āMN@@@¤4¦T*7nÜØ×ė1'] ƒ¢p įQ¤Ī²śWV™üŹ8󙑻wÖæTøwwmR‰eŻgĻ”­|rMiµZ¬;% H:C¢Æ¾¾ģaį_N§ÓEV»aČŻ’£Ļ7}ž¼åk× „öÖՖ½Tȝ8ššo0†"Ńd2‘ēp×Üį( žŻųųŅ!B ^ėĮĆĆQžé‚š850(śŒFcUU•^Æßü>D”f”įjh¤ M/)Ī”eÓ‹÷#ō-½^ļr¹Žz½,IįęmÕłK—%„Ą45¶7ķōzBÅÅńĄĘƒī~O×Ņ1ģó‘įAMi s’V«miiįy…’|** µZ¾@vććO\ W~Æözé‚Åpb« EQŻē:·¬[µ„ō•xJfż·]{w×®łõ‚½uµ` ³Z­‹…pA*ŃzdīĀEą^ųšŁ?Ž^§ÓY,–0³M+)FĶ~ļķ ©T$²,k·Ū!c÷¹Ī·^/[³ō—{w×ößvÅ®;øGŁmo¬}D`r¹¼¹¹œ0ÉX!£Ńqd‚˜ÓØqÕ”ū|ö_ßu:Ļó”=†½ŽnMé]sGÖܼ‚S_M/)xšB”0™L7oŽÉģNß­½uµk½ låóķūöD‘Ļ€½˜ł3ßz½ ‚šÕjuss³Óé$.õ£Ī‘1iŃ ¢‹ N7<š¦ķv»Ńh„ō ĄO7n„4T<Ļ›L&’‚ō˜ÉźėėCŌøė.Y÷ĄŻććÓKŠ3e²ŠMT(,Ėźõz‹Å™D®_½¼»ęŻŻ5ļĪș•æ“0ɲ왳Ęd?óyųėW/wŸķģ>{’Ó(Š&ž G#@@HhµZą­V ٧är9ž«\.æxńāČ#(•JTär9EQ7oŽ„ćPE ŸvóęM8mÄ’Ś×722ā»zĶž»¾«×Fʎ›7oÖÕÕAÄ“3rfå/)\]Z¶¹Ŗ:ąæü%…łK ż(—˵Z­Łl!ˆœ’øĒ–»žŁ·1EŸ¢øøĘÉĄĄ€Z­¾yófsssee%üµ²²F>L |ņČČ>hµZ‹‹‹ń/^¼XYYi0ŌjõĄĄL1<ļąÆų²š“ŲAŖÕźŹŹJ8Ś#œČ©…o»šš°å. ó… |d€§†°>/$u·F#ōk€ģ®`+bYĘDŖEČŖēļq×Üq½śƒ9µN/)V¶~ļ* ½^­åĮétŗ\®;}·īōŻBēĀŗH™„”dŌ&ƒ šćĄ lĘ8s›Ńh“Ūķ###ē8†“” 6œ/ŹŠŠ ПÓ4m2™T*¤£“Ūķ<Ļ××××ÕÕ ( ȶ 70™LUUU†ÆÓ醱X,*•ŠŌ ˜XJE#šDĄ³išØB2 xwĖ~„§ė|0cŲX!ŗ/,!9* ļž ²!'ä'įŸ, œ ó ²`cJżŠćńX,“ ĶÖh4õõõ¢Ł¤R©ģv;äŹŃét4MėõśŖŖ*8§££Ćh4Ņ4­Óé8Ž#4F0h,>·¹kī˜^R<’3£»e’ģ÷މŻƒy$<]ž˜·0Éł›žIŃ4 00ŠšO6› D+žē]. EįɰĮ²Ūķž˜x_e±XX–…dŁĮąp8D¶[ø2P—Óéōß„¹] dą‹Ć^ooõߟ²žp­gö{ļĎĆā…B!—ĖA•ķƙ9©T*Š¢ ņƒÅb™4i’Óé¤i:˜2Ä,ąŠŠŠĘŚ6\8‰8‹2†ÜżK$Sęęł#{z=]Æõ öōŅ‹rk?"/• ¦`†ć86’Ėå4M‹”Ų^……¬„Š€M ®¢r¹\”"ZB“å„Ę¢ŒĮk=īÖż¹µ)[›†ÜżYŃ 1o=p÷ ’:-J&7‚Š4Ʋ¬?ŁLd”‚ƒ ~„JF¢b³Bˆ2q‡h\³ȈPS›¼ BcђĄÜŽņM?ś|™2™|kEÖĻ“tDWCć]s‡ˆ·„˜,ĖĘ鬒Sņrgæ÷vźŅ˜Ėåņ§1£Ń^Æ …B„RŹĢcųsMMMiL§Óéõz(Ā¢z½žaīÄAĪ…$˲"»Ż“’µTĮ¢dīÕĮk½©ŻI¦AŃX¦L–57wŲė“•G§ ó“’µ}-ūCœ0uyy)3ģ¤’ŌŻs( «ÕŠm`:82a®R©TPTZ­V‘ŽNĄ—™Ģb±€æšÆąˆĮ˟a˜I“&įėĄAš¦żƒ÷3e²Qó ¤(&ŒŒD,oœ}-ūļ™;”­M,i“Ś:x­$¼€ż•ł`V ĢoтŠYŽ*Xqą †Óé|śé§ŅĄ§ƒļ:©|žŠM”€ ‹ģgĆ^o×ņ—ÆõˆŽß5wü„vē=½w͇3¤Ņ(rB(kn^n퇒4Y–M8Œ`ā°—Åbą0µZMü &8"T*Ž?eE9Ź7)[›€?†½^„Šō’bO׳)yy9Ś ±hīŌ/ȏ׻[ŪÄljF‘`"ŃD§©T*āÓA@!}ņ4BčGŸļŹV}¾ł PBHŁŚk—włÖ ¾ėĀ=½ĀƒÄG‘`āĄ?iĮDF$JÅaÆ÷ūSĶĪÜżŽņM÷OYčér÷÷$?z«ßæņūŹ ©TŁŚ4­d->N4ŠDīš 枊ÓūżÉÓ²ņõÓJŠcG'wĶ÷̇B|×yŗ`qnķGƒ×zA&#E"÷Ģ¢#ߟ²ū|1ā°aÆwŲė^RL,š×`ÄŽŚŹÖ¦)y¹ˆh &0Ęģp?ävw-9ąŸä[+ä[+¢Ū>p²Ļ”e+[›üż‡½^Gł¦|Ė!ņ" ˆ4ū$ڈnūī™;‚Š!„2¤RĀaDŗ5„"/A¶6E%AĆż“§é‚ER©«”QV¾>ŗ!h遱¹x ¹ŻĮ8ģq‰$knn“2 õµģ’KķĪ)y¹ł–CQWTLPj'˲³ņr³ęęMÉĖ͚›‹ŒmYssÉ" ±)!'U°(+/7Z¾aÆ÷FķNYł†¬¹yąXOŽAŌh,ÖĆčÉ»! %UkdŚ K$Įņ’$£46x­ēŹVżücÖܼaƗ8%¤’4ę(ßōĄŻ†7Āa)# ^ėɚ›w×Üįé:?»śmĀa)Cc½Õļß3ž×`œŗāņ&"@Ā”ŠCn7D” Ļ5E@@@@@tŅŲ°×Ėw]˜ŗā…Įk=ƒ=½ÓI~z‚T”1pJ|ąī'ŗD‚ń#ŽJÅLYö°×7Y–)Ė&½O@@@@2ŅŲż“§=]ēgæ÷ĪąµžLY6qJ$ H%iŒ.XÄw]øņtÖÜ<Āa1§1»ŻĪ0L“ī”!•*[›„ö0ŽćX– x²Óé q)†aģv;yy”hŒēy›Ķś‰„0ŽćjjjŅēÓO?­Ńh‚]Ēf³ńĖqœPPŠćń˜L&Ā[c“Ę„L>RxaŠ4Ž|KK‹N§óg#šéł,˜Ÿ}h’{Bc”ĄqœZ­ĮÜB»ęĆłD”ét:Š¢D–3‚1ŠXzH…BQRR"ō! HQÄA½^O¢ž ĘLc ƈg€zŪĆģv»Hėč„PĊAš¦Y–õx<$Į˜i \9„.`Zāyžć8l'“ĖåBzĆ?)..6™Lcå!Ģąå”P(Č;# ĄĖį^„RUVVÖ××CĄ–N§Óét•••F£‘ēy`&›Ģ0LKK‹^ƹF•J…ƒĘplYh°,k±X …Ķf«¬¬$4F@@@@0fŅét ~†Šh4* ąa\DAź !™) §Ói±X ł9. WF–e!8šeŁ(¦Ū' HÄÆlfųąyžÉ'ŸF[DljŹY,¬cĄ[1Țū-£ŃˆĆĻõz=>޳¢˜żøöv°½Ć»C‚ ‡‘äC]]Bčāŋ#Q…Į`Ąc~``@˜2Ō`0ąćEQ^KJ„r``@ųóęęf|AµZ­V«õ8øŁ0eźźźČ+&˜€H:‡{–e«ŖŖŌj5IžKS€¼»„,QĄétrgµZ‡(`1tҵ„€aµZM“īIGc<Ļ×ÕՑœc…«”qŲė ’|‹Å¢Óé`·DÓ4ÖČ ³¦1 £T*…4¦V«Ng²~@l%ŁłK F”ķ ¦ą8Īd29N\m‡ć8F£ŃhšN‚eYį:β,^ÄĮĪ^<žõtāOcŻ%ėīš;Ā<ßćńģō(Ā Ńhžj·Ū†U ³ŪķPÕHT~Čn·ƒAK§Ó 1żkĮKńæ\Y£Ń}}N'~ųsĄ×a4qq„D½)‚4§1‚8ÓB`+**¢iš¦é’’X‚…>v»½¦¦/Ķ‹„¦¦|PżėéÄܿ׫?p”æĘwõd­VėȍŠ5¢¤Õ8>DB»Żžģ³ĻānÄ|SSS£Ńhģv»J„‚ |SQ #žē”’J„‚ŠHųLča•J%ō+q:555˜Ęjjj  MÓ555x¢×뫪ŖT*Ļ󍦦¦†L‚t1—‡āābųŖT*±Ć‚Z­V*•ųpshnnß‘ƒø`Wˆ„Ą–»@ųÆēŻų7'„‹ĒĶ›7Į•Cč!<`µZBV«UųWŠ¢ĄŃ# ‹Gqq1>ØT*q÷"„ Kį¹\ŸµZ­\.ö^ee%EQpDŲ’Āćf³=rń6>WVVĀ„(ŠŅjµ`’COpo!S€ Aˆœ«­(ÓŖŖŖB ĆŌŌŌ€2 0øšĶfƒEĖ!Ģ3®†Ęx>Ō=óįū'­9Ś ņ­OH§ÓUUUŁķö1%žÖétIšÆĶĶĶø…WĘźJ•JÕŃńP’ŁŅŅb0„Štčm8bŃBį°ÖWx\¤,% H]#x˜āĖæų’7ų¶“¢¢"\ž–EN&“Ély½kīxąīēsżčóń]ē§¹×fŹdOϽ^ßŅŅ"“K ½^___P}ŠÕ³šWŽć\.Wh½.ņK Ü_„hß0V²H_J@@hŒ`¢@­VŪķv§Óér¹T*•R©„aŠ¢°§H6%%%ĶĶĶłą¹SĒcŚČ?ę-~,Ė–o­˜^RśW4M›L&°źt:`tžē…”ŠČ/™§B”P«Õ=ą|č.Ü{dÄÄŃ`t€:Ėn·+•J\ģÜ D’M2ŌÓy\"‘o­Č7•Ć0t:hŲ€®„~šŁ?Aäf Ŗe49Č" 4F®B?/¾ƒ2 ćr¹Ą0ƒY ė…’MĀėéL+Y›o9(ßZ‘!•†’+§Ó)—ĖQ ŠB‹% 8óžŽX;¦n]Ä_’ršxŽ/įTBcé „R)t¦Ē¹š`7n¼‡PK†z:Sņr¶6åÖ~Ģ&ā$į“B(4|G|x"ŽćG0›–įD€šDዤž5Œ@“…+@;Ay+<>Öbč*•Š¢(P„ņīHąļŠõ»ļƵZ öųWpGø¦\.—ĖåĮīń»†ĄM•J„\.'÷iƒĒI$’‡B”ĄBU^^žJ„:wīÜŠŠŠēŸ.Ō* (‡õ‡/½ōv{[²dIffęōéÓY–}ć7’ķļŽ½k±X¦OŸ¾cĒŽßžö·Š~F3}śt†aōzżŽ;233…Ęó<Ļóæżķo?’üsü'QwA|ń’%KDīÓ§Oć7 üõ·æż-va‹ŖųR4Mćó!ŚŠÓÓÓÓÓóī»ļāšg8”§§ēīŻ»Ÿž9¼/ø ü n$ü r“ŅįgffźõśĢĢL›ĶF¦?A  µÄz½Š’‘® HuŪĮ„8§2‚ō‰# ˆ+®ü¾!4’³śųß2÷CŸĖå"^D# 3†}¾aŸ/!·†ŠĒ) «ÕJꓤˆmŒ€ ®p”æ†R¶~Iŗ‚€€Hc„ʍ# 4F@@@@@hŒ€€€€€€Š”1Bc„ʍ# 4F@@@@@@hŒ€€€€€ Ž e3 bŽ»ęŽī~ų<äīG¹įėdYöō’bŅE„Ę’Ć^ę-ž:ÆĮHś‡€`< JE‚˜#G»a²,Ū’8U°hźŠH’# HväÖ~čpvõŪ¤g¤č‚ÅO-/‘•ÆĻš›Gz†€`œ˜422Bz€ r»»–æ Ÿ—Hž;õU†TJŗ…€€Hc©L™L¾µ>Ė·V# ŅAŠaŲėżvłĖRÉs§Ž“Ž 4F@zøņt†TB,&]A@@hŒ€€€€`¢ƒŲʍ# HNE‚dÅbaYÖįpX­V†aBN§Ód2) †aąƒN§‹OcœN§Óé„Ļ4M«TŖ$é%“Éät:u:ĒqšA”ų’³wmWŖ*A"#€‰N0Hr"###Љ@Œ@ˆ@Œ@ˆ@Œ`īĒ^·nßęaƒčqÖéż1 UÕŻUMÕ¦5'×}“Łėŗ.ŠBQ“ ‹¢(źŗ6Msrć8Ę_Śų‰fŸVA×uó<Ē6 Øi”Ŗ*m³ UU Ćš}’ юo‰æĒćńx<Ņīét:×ėõr¹Ūp½^»Ž³—\.—Ēe»\.š¦išEŻšx<*Šā8m°—@ž”8N"gFQDc„{īŸ…ć8pL“ńŒ~Ņcö¬×k2Śz½fײ,×4ķAٚ-ČyŅjöŒPrFQÄØi›†Į‰Eš{»Ż¾Č>ҹ’=ąĘ HÖe³€k=Ī]ā8Ž`xčĀv»möūĖå¢(Źb± ¦«4ź0°Ćźńx„_~«0¶X,E¹\.“!®ŽųÉ]fļĮétRÅ0Œż~æßļŁgĶēsEQ‚ 8ūżžæŁŚ‚†a†Įn Œ9ŁóĢ>F(ˆŃż²yUkšĻ篱L*Jü—’ŁķvUU- $LLӄćȲ,ĻsĒqp&„S‹…ļūI’Ļó( 7.‘ÅŽ 1hće6yFīk*Į٤®kĻó(æA’$Ó>ȲLQß÷=Ļkż×Żē>hqQėŗö}’p8ąķ0I’»YÓ?ŲG(ų&½“®kY“x]C|ʲ¬Ŗ*ß÷)°Q.>Ļs×u¹d7Ź'®ėš¦YUUQTC¢Ā“ŖV(ĄŌu ɖƲ,˲L×uĻó0œP•A¤,Ė—Kʲ 'Ų¶ķŗ®®ėćĆméĪiš"„ą†]R±E ØfŪ¶®ėu]§i ™©DdąĢ޶›Ļē¶m'I²Łl\×mFš”U"Ó4I5Š ]—Ün·ÖXŅ„`š¦EQˆ·`ÄŚķvt ĆĆį0ŸĻMÓÜl6a¢5EA÷KÓb·Ś ēsb£Wąņ²,Ńmt]w]W¤"ŪŖą_™j“IŞ#]Éīw!ņKā<ŗ”HÉ”5Jy?ä|Ø ƒT'Ä棂 `Z–Åf™„.Ł;“Č>µJ…T[«N§“¦i¬Tāi=Öģ×ė‰>6s;:Õs½^©ÄÅŚ %RčøX,šTŹESe«GĮ”-ŲYÓ4jVĪ&čl%ohŲļ÷0īÜj+4'6u0“!š ¾CR‘ÕKÖĘ$¦cĪæ€y<Œ]ÆW܊ oĮ”x:P()T°U+˲XēG€ƒžUĪĻ"ĄPµ†ü[ŸĘŲZš¦iŪķźwIEA Ēé¹rņ­‚uǦŁ9ł±;šdĮŹ]ßĖuÕ\!L—‚°ŖqTlėoA'Ėv­ż~Ϛ»‚õæf\'©DZ,k»ŻB©[ĮQa Ń8Ā€)0 "ͱóĒĆŽo·[Įź£ cĀXÓŻŒcŽćU‰‹XĻ"=˜|ė ^Sk€A¢ńĮh÷.Å£yĀP" ūęqW* cpsūż¾¦Ųół|(•€3; Ųłž8—ĶŽ 5|ģŽxėR=äĒ®x ¶Nz(`“ŽdWصŪō¼š±¶">f3ų„Į\0Š¢A~æ©ą›„1š›jÆqŸ?’½iäÖDĶ äy¾Z­ŖŖj|ßĆP¤Īdšf·Ūķq Ął|nÖĆļO’$q]WUÕÕj5‰… Ć`+=]R±Å<*kaäĒq¬iŚįpųųų0Ms·Ū >š3»mŪ†aTUåy^ĒaŽV E N‹ŖŖØ²EÜģźŗNŪl Zw)*Źl6SUUUUģ>B2M3Žćg|5Ł­öŲ s“ųł|fĻD’_­V³ŁĢu]*µ¾‰‚#jØą‹½@6Ę$ĘSļļļļG"išI’A@£śÅō–åriŪ6½OLČ+ė¼^Ē·ŪĶqœ4MéZŪ¶‹¢XÆ×–eUUõū÷ońHĘ!MSĆ0‡Ćjµ‚Cį¦/‚īrZō+Č}§8ķ·ē\뀙Ā>‚%n<£ŃóżA†.;Յ3Ņ4­gE šBö$~p—Tp^yž[–åy^UUeYҌŽ4Ķ0 ‹¢A$ŒµšŻ¶ķ²,QIƒŽuŁžē}~~ŠÄ œĘ ©ƒÜąčĪÓT¶¢×8z±{ä@UU¶„āģ ¦ižśõė‘7×[Q£‡aØińléĀ$Iʲ„D½© H'™ĶfM±ļū³ŁĢ¶mn €5:›Ķ†Ī„iøA„{‰é‘e2iiš>Āķ¾ė)ąt]×u= CĻóĪē36²,»Żn,Ė—ąÅTx"s§i B<ėh=Ŗ²,EŠć˜=Ÿņi]RŃü ųår‰Æp+HH_ˆų©³#HC~ö_pXēó9˲žGčŗī8Nžē¾ļŪ¶ 6Ś×w)čūžr¹D T×õ¢(Š¢ ļŁlĮ»fĮÉyžƒųŽ›X–u>Ÿ}ß×u}³Ł†A6!¾Łlīę°jå„ć8Ę"U=¶āżėė‹ō‚:˜vŠww-ŁT°EQ “|}}qa Ā )Ā}’€O&v»ŻĖVƒI|„ūĒ ÷M:€ć8†aˆ/ķ!Nø'°\y*ѳļMž$ˁ†š”H4 ©ŁjpIø—ųŸŗR|4Ēvė_x‰xtģł®¤%Č(“ž$-hłąsūć:ÅqvÜ 5œF+x÷_ ŠõxmĮoõ¦µ:É$½±‡©Ėw٤UŚž1Ņś p5_¶• co¢ Oā”$XĒEŃz½nFPZ!š”čŌńõāÅ'eVž7 ps˜‹;Ī}ųlØßŸIH¼an6åiæ+1 ŗŹc/žåŽ©:(®<©~łćP–åĒĒ(?ļóÓ<ćšgØE,Ķõee“x#€ČŗŻ{JČ]®(ņ¶”·§Ś’ӝµ“I"DWyŅ€b)QlēϲģÅ+kĖ0&!!!!ńƒńχt-ŠCVcIEND®B`‚apache-couchdb-1.6.0/share/doc/build/html/_images/intro-consistency-03.png0000644000175000001440000004166512332105522026270 0ustar00djcusers00000000000000‰PNG  IHDR|ŃŁ’ų pHYsgŸŅR cHRMz%€ƒł’€éu0ź`:˜o’_ÅFC;IDATxŚģ½_l÷™ļżc­ė4"9F„W:¦3©÷Trƒd&k‰’¢Y>ļ&7& “9qE:¾R#TōSychŒäX_ѧJtsQZx‘.JŹxļJāp‘J9ś­#²§*‡ØGµvepHŹ[yC/ĻÅż:!)Y(‰”ž c43œgę;Ļó{ž˜ …AAdēłžAAŃEA݃Éd2™L’$Ušć²,3 ćõzńō"Ȟ£ėŗ$IĒ™L&Žćt]ßž6eY†{_–å¢E@€aXŹqœ×ė„{TE±ōćŠ.²•2“ÉŒŽŽā©@=W\QÆ\¹’J„ąO†avtŖŖf2˜N„R£££‚ €īźŗ‡Įó<˲‘H¤££uEŁ.>ŸĻćńƒA<²·H’‹Å!żżżįp8 ķŚ® …B8é-r†łż~EQ¬V+LćĻT»Ōį)Øąėj(ŅuŻėõrWjĖBDQ,É0ŒŃ·¬ėŗ¢( Ć‚ …E)Ś ,Ė0SUU]×AŲé7q98BˆĒć)’=]×C”ŖŖ¢(ŅYQ0…APUUUբۜŽĪĘM•½ÆQ=Ļččh (WŲK$©ˆ»Ł3 Č&óÖßßoœ į%”‹FFFč"x…'“IŗrŃ«®ÕjåyfZ­ÖŁŁYŲZoo/ĢdY–n©ō„wL&é’ ó!Äįp ć]\t·ļ}z_B’Édé©Ē+™LŅO…Ćįt: Oćć©9н\1’p&“ńx<ž¤Æ“ēĪĖd2,ĖņŸLŽõĒzUUÅķļļWÅøré}½b±[)вńO!(ŗūüķ˜ć8:H#Æ ĘŌš„€åźt:‹^ØK_x-ģ>‚–.‚ģž N’_?„˜Ŗlé½_z_Æ’Āįp2™äy>‹¹\.üQPt‘2Šx‡Ņ ^ZeYʘ©h Ō6ÓrÖ¹÷7®ńEoäǁ+•J”±‹¢{ ) A,²zc3€Ēć±Z­™LfSŃ’°ĮŅ­!RØĪo̵nš<¶p·‚•l.µ}ńeE÷Ą”ŖŖ,ĖąC¦7j(¢n%Q9ŽƒįŸĻŒć:ǁüĢ›z O„R~æSDd#0 ±ććć¢(J’8Žƒ°aČ ŒD"ōf„Ä!£qL-f—Ė …6h7˲ģr¹ Kø4ZJUUpV[­Ö¢äC¤–Ąī­„ Q [2¬V+Ø,Ķ(‡ĆĘT"cĘŃģģ,L—M"«¹@Ɯ„t:mĢ[0®† HEH§Óʬø+é ‹X–„ k=T!Ī™>%Ö¹ÆéĘ)½½½E)LF0eئĮā›ī–"T(ņł|āŲŪŪKC‹EQTŖÉ0 £Ŗ*|œć8AœN'¼ ‹¢H7Ė0 LĆK4lŸOɲ,ITŖ»pįžRqcW–eźšG1ÜŃ~æ?‹9Nź|öz½²,ŽŽņ<ļ÷ū9>ŸO„@  Ŗ*ĒqėÜׂ ŠŪ_E—ĖEgōSdµ8FŁ’H aĀ~ŗ5J 8wī!$Nc$3‚ HM€–nķi-¼ēĀ»6Ė²Øø‚ hé";Ć0“! !$ bŅ‚ ZŗČŽąółh‰ Ø ‡ēA-]AA¾ęéīŠ¢@@£i†a\.fÜ"‚ „‹T h²;>>¾Ö ,Ėśż~EAŃE¶kąŠ¢ŃOÆX˜4X„ļ4˜"„üļ•?)’śšļÓK÷ó_B<Z½‚ (ŗ{cŖŖŗNžŚRÜæ<\’óęc’¹ž?žļ•?}ŗœ…„yøxdi1šąŸQwAPt÷(ļBėzėŗ^s ©ŗ® ‚J„žņp½’/¾{’«śē?*zh\§į[߶ёĘsM·3éæ½`‚ Čž„zS†ŒÕĪ|>Ć05×¶Żļ÷§R©ęŗoƒāśžšūå’w«Õźr¹8ŽÓu= „R©Ąƒ¾’Õæõż§æø’Õæü³×ėUUK^ ‚ģ?v;zYUUŚ RUUŚ÷JQUUu]‡ p±Ņ²,CWX9ųżžźonE£¼M„P\žēE ’$łż~UU”*ś'Y}diń\cSsŻ·3™Œ±‚ ‚¢»EEyį…`Z’$ھ (ŠāõzétGGH,(.Xŗ^ÆZeUłpÆ,Ė™L¦¹īŪÆZ,‚āʲ\TĪĀēóīž}z)÷ųńŽ4’MöūCAj†Żo›E™- ,ĖZ­ÖB”L& !étśX ŅžVš)‡ĆŃßßo\>^Ķ]ķ ]׏Ž<iy®¹īŪ„`0øÖŹŠ/ģēĶĒžŸļ¶ģÉļ‚ ‚ģ»mé2 .VŒŒZžēé(&4j^Ė|„Ė² øŖü¦į[‡!“Nx,ŗ’Õæż§o’|DŁÆģA xAqÉźhīćuaüĢ Ć`åaAE÷ ¢ F¢(‚č*вńČdAŖßĄ%„Tœ‚ ²ĖģAķe'%Š"L«Ŗ ¼‘ĻF"‘šŠ3Ҿó^d‚ Ȟ‰.ø…u]ē8Žć8UUŸč%ę8N–eŠižē½^Æ,Ėā‹ ‚Ō{SĆėõRkÕXƒa‡ĆQ:ķół$I’$ ’…ąOŽć\.Wu‘$‰¦ g®µ~©Ć\’$šą5Š ²oĄ†•G–eČ0&„ų’ā™¾ÓąHü’zyś’:×Ųō_ēćķģp8jbōA©jK÷ Š\÷mocÓ ßiéUžõįśė7|ėŠ+Ö#„wmģß§—>ÉźxAPt‘‰ī·’Ć«Ö#0żĀw@}7Ā®’ÆX č"‚ čV€|6»Oä³¹†-õ6[jh˜Ņä>So³ŻŽ?Ҭö6ĘŽ®G§3љƶ£Ķn犦峹†­ųƒ!‚ µĖĪF//Ļŗēā0ń…ėĒ’Ųś›½7z3ŸĶ2_·å³9Pµš0ŌOŸzyś3~ģYMOśĀż,J ?ZRoł.‘eÄi#‚ hé~­ø_ø_{¤-<ĪåŲžnūäķZÉĢ)ūéĪSąĆ]ūˆ®°¼ÅötļĀ·«7äęÖ”Õ‹ ‚¢ūēÅ ˆÄS­-Tŗj~Īg³łlvžźµ¢„©”ašA»£čŃi¼ņAPtĖšģŸģÆŸ:‹å„aĆKįć}Łž¦‹Į[PÜA9h˜ —ĪœĖĪ‚ ²Ū–ī>cEÓ։™ŗ7z“Ę6o“å<ūÆĖ[ūģļVVšŅDAŃ­y}—שGĘ®±2å–łŻ£ß’x…!‚ S”P8PfīüÕkł\޲<—(«¾‡mG_œüd›;ņz½ŖŖns#’$‰¢ˆ×(‚ Šīžay.^$ĆŠÜ/AEwgQUuūFjõ€¶2‚¬…,Ėū껂Ą0 ž¦(ŗµ‡$IW®\Ł7__Yóńg2ķ›ļ‡ń »&ųžAAŃEA]AA6Žéī6Ę1c‡Ć±ŸB9łĘćÕ0fŒc®Zŗ‚ ‚¢‹ ‚ (ŗ‚ ‚ č"‚ Š.‚ ‚ (ŗ‚ Įö*(ŗ‚ ‚¢‹ ‚ Š.‚ ČĮFÅP(ķ†Eį8ŽaæßK½^ÆÉdb&Ąœ@ Ą0 ĒqŠ¢ąŁCŃEA6A$ńł| ©¢(Y–/\øķJ}>_”PēĪÓu]×uŸĻē÷ūEAŃEŃEA6$I.—K–e†aDQ–›ār¹Ą†™^ƗaÆ×‹§EAŁĒBdYÖu]EQEKWQ—ĖE+B+Š2Œģ&ux AjŽ{£7SCĆ/NŽ®³XÖR_I’蓪Ŗ¢(J’ …Œ]Ad=–ēāæøFI æōVYÅK—ĪńūżĒł|>:‡a]×ńdī2č^F©%¹Õ£Ó 'ZŁžīļö],«ø„QS©”±s(ÕWp5Ć:±X ęc Zŗ‚ Č7ø7zó÷×™Ķ'C³=Żė¬ÉqÜČČHGG‡ĆįPUUQÆ×{åŹŸĻ§( ˲„Axž‡q_UU!ŃAŃEžŒ¢(TW»G(Ė2V›C­Ńp¢…ĀŲŪźĢę²+„ĆaåõzAM![—a˜p8,Ėr ŠuĘ[AŖ®$IŌFv–²»ō÷÷ӓļp86ž)«Õźp86ž‘  ­Vk„¶Ę²ģČČH2™“Z­³³³EKĆįp÷… UN‘ny;éĻ£Ÿ¶½ō/’0Y(žtļžŲšĒtkŸĻ … ÆĪ8HShl…ŖŖ.—«(°Āļ÷Ór6OD×õT*%¤ż•Ś»˜¢€ [ Ńwłq.§Ż$„ŌŪlxBjŻp)_æ~=5L×uČĆ+Ņ<*É43ļ‰KA€¼p:ė\øpĮ(“²,Æåƒ¢/ ŗ~æ6„Ŗ*=TEQŠ·Œ dEÓRCƄg‡ü¶®×ŸņWÕįŃņŒW€{Gt/ט{Łćńx<朣ŁY–e‡ÕjM&“°M§ÓÉó¼Õjķķķ„ÓYŹóüČČHoo/=Ŗt:](Ņé4ÓŪŪ›N§yž‡ƒĮ¢ć”‹ąõööĀ1÷ööĀĢžž~ŲW0L§ÓV«udd/ŻĖk‘ūrīÓ¶—"-ρW¹Śšx<,ĖĀÓ£P(ŒŒŒ°,˲¬Óé4Ž%9§Ó‰Bó«OA•‹.˲F‘K§Ó,ĖĀ Ģóüąą`”Pp8,˦ÓiŲ8 ¦Ņū|ż„t½ŒĆ½,ĖĀ“ÓéįŁ6®f<ŒŽŽ^˜L&“TĀé3hvv–®† (ŗ„|•ÉĄæ:õ×3ĪUį īģģ¬ńֆōd2 ļÓš>CæE õą”¦£Ā°~$”{”īhp=…B!*ĘAJYž‹ĒŗĪ'ś.×Y,üŲ“”_Vį .ŒQ×±,Ė<ĻCŒ4ģĖøÓ¢`(ś'•mEQxž§v° `þœN'ĘV Hłlvžź{łl–ķénrŸyqņv•G)K’ ż~?¼CGŹhĮēJ@ٚY„£dµŁĆZJpąÕCŃ­1ØXŅ9™L†š˜,˂ȁpźŗžÉd@©^npii2Ķ’!†rŗ®G"£æ(•JŃŽŁ ŪĘMAŅ}$ł­æÖµˆ –/ÜÆicĶ\«³XZŽ]«‡AUįr¹¼^/¼X)"<øŹf:ä³ŁĶd“Ś<ŲHGGG«Zr·)ēŌü¢Æ#(ŗµ'ŗ‡C’$]×į fY$Šļ÷C L£ÓŖ»Į4ģu–Ņq\Ø$Uō IV=ŪP<vźp8мFtQ‘=  ®iBH$į8Īårc™uV4ŅŲŁqŲv“Éķ¬‰cÓ&8Žƒ' ø0Ÿć8–eįõŗč%ūnlśģR%ĮĢŻ«—˵©]C’DųæüKVåŃĖÉdbī!øææ"õi:¤qŤ$&¹ti8¦Ąąą !ā“aҰžēyŽ ”‰æDƛ !įpŠRĮwœ…Hę¢Fƒ½üU&󛟾ģÓ¶—¾ŹdąĻZł^³³³pw;Nx @#<¦`ĪČČÜž0ŲD?«üä\¤å¹OŪ^śCąļžø#§Ó988h|v%“Ic©;šŽ,š‘ńÄXqŗrŃLH¤L&“įpøčYGS”JēәÉdžź<ĻcŹP­ŠnŁ+¾“ĀāNWaŁEk]‚¢»Žč¦?FZž«ŚL܊<4Š^ī©čĀæēŅŸGף¤õĆK<¹Õj…·ü"х·|(Pt¶iņ¼śĆQéB_śūū”Ø@?ģÅįp€aCwµ  Č¤q†ĆaŲ#ĢL§ÓšpN&“EÅ Ptk[t©iŃUń­ś‹r_Īķļ“°ŽčĀæßüōgÉE¦ŁĄ…ÕļFEōx<` ĆīŒg›Ö¢…س * ŠĒ2Ģ,Ŗ’CwAkž@%¢}ŃCz"8¦‹ ²{$śŽN 'ś.ÆhŪÓŻp¢õ€Ÿ“įhē«©”įõzeYfYG k£h)Œ”–š„+Ć8«®ė±XŒ®L·ĆóÉPø~Ėf.Zŗ‚ Č®rŲvōxßÅĘÓ§¶šŁu:ў§;Źöw¢‹Ō6>ŸO„"_‚ Չ­ėģÖäv߀yŗHmS¶·‚ ›B–åŻit}Ą-Ż2Š;·}: łŚ;śup Aˆ.„ęā©@ŃŻm tŚib±XGGĒŽī¢&å ķ3T_óūżŠ¢H’½x”« $IPĘļ÷CC(ņūżųJ Hmīe¤*DW’$UU•ęм:Žć$IRU横źv»].Ć0‘HO ‚PƒU×uæßOMæßOĖĀė¬q¬¼;Že-]¤ŠH„RSö«ĖåEńȑ#ŗ®3 ćół!’$c 8˜‰Ļ ”ttt8NUU}>Ÿ×ėqõūż0Ŗå÷ū9Ž …B@Ŗ)A…a(Ų“W]āQtdo_1¼ŖÓr3x§ŖŖßļ§ćß“Ż)©&ƒ DŽŽŽ¦ÓipĮ-oØŗ®9rD7‰Ą:ŗ®c@āī€īåb$IŖŻ~ŗ„m)kīü;{ō÷÷sUR†Į(y"ą’eŖüÓh ŖĒą|†(N(GLÖĶEŠŅ=ø@æÉuJ¦i£7µ±¬ö6ĘŽžTkKƉZ7µV #øtŽ×ėu¹\’$aõ.”¬hš6zóų„·Ź.…, øąž‚[É¢ c7x&Qt‘5YŽ'}—×éÅŃävjce¢3“…Ö!³¹įD co·ŚŪZ[*Ū3k'€a] p&S#ŲŲz}bČĮTÜ/\Æ=Īåź,¶§»ģ:‚ ßSC”P(RU•a˜]KŠ@JA÷r€¦Ķztŗ"[‹u½mYi wŗĪß}³wEÓJ—6œh=l;jœó8—ĖDgRCĆwŗĪ’ŚžƒĻ;_I WóÉōz½PĪM’$xO‡±(Č&‚u\.W$m.j4 ūž|6[o³ÕŪŽ>ÕŚŅä>³ÖĖk$1Žt˜ĘØŹ“9ŽG(ŗµ„ÉDgņŁ\lٹx&:ė:æŽīBL†æp½VV>;;Ö½]s¶®×«ķB’˜†ń'—˲Ś?$V! †B!h÷ŁŗČA2p|·ĒGįĒnœ żr­ń#Qyž2ÄOAx„1”zļm¶ĶA6ŗ—+@“Ūł`rб·mS‹ĮqBČĆx"ŃwłŁ÷ƗÜr F654¼41uüŅE£·<Ģe7~ČlęĒnT‰‡ł~pœŅģvĀćĄ8ˆKs„čŸ4/ˆf5ø\.f98,o=Œ'™Ķ+šVVnµeeYöł|PaĘåry½Ž@ päČ‘ŽŽŽŽŽ^†a†u ž žį][ūķ6ė·öū¼ó•G«ŹŚä>Ó2š®qijhø¬uŪä>s¼ļ"USćFŒüUšćĶ6ŅŚ!–&¦¾ģńBž»±Öų4‚ŌüćµB­żņŁljhŲę9[o³Ķ_}&šōÖ(č^Ž.‰¾·ļ¾Ł[‘Żå¹øQ,ƒ·68žŗ¼õyē«÷FoŸe=ĢlOw5(n>›Ķg³Œ½ķ°ķh“ū *.‚<‘X×ym죻oś!Ē/½…Š‹¢{ Yš?˜ יĶŪßų–‹LŪū%3Ėņ8—ūżĄ5Xłé’>Oµ¶°=Ż x{x®–ēā±®óóן,~ģF‘ Hé-Ci<}źŁ|üŅEy†H{ū!ĆK€­ėõ“”_ĀūņēÆndk;Äbpüa<±4†šK¼xd-ņŁģŻ7{c]ē—ēālO÷‹“·«Ź-¤( Ōj…2]×!ŸžŽ—éŗ!²,#6ŻķĀötócV䕶ģ@,!$Ńw^xĖbµ·=?v£eą]£Œ5žī b éóbō8—ƒh¬²G;ÄżąųēÆä³Y¶§»É}ęÅÉŪ՟.Œ {ˊ¶š`2LoŲŖŗe \³(Š>ŸŹnˆ¢ČqTM‡ģ#Øf!Z˜Œ¢[1¾pż8Ń÷vElqm7ņć\^xKŁŗ^ēĒ>,}~ŗóč1uįÖŪl'CæünßÅcž³+šķ|5ÖõʎJ/ø²—ēāæķ»üH[ø¼Ug±“ ¼‹Š‹ ėƒJ 'Zæ7šĪ_?®Ā®ļŠ¢d20m!‰6 ƒ:Ļ„ėׯCó¬ŽZ¦ mĖ6}O¬h ›,ė[¦ŌŪŽź«E¦!0ĄĆŲŪźm¶²µ!OŸ²ŚŪžņmē˜ē,!6•‰ĪŌ™Ķłlö~šVć鎬ś{}o/M„_ŗŲģv6¹ĻXķķąśFd毾§}tČlfģmU{ˈ¢Č²¬Ėå …BXŻÆĮ†Ö×dµ… VuFK·r/,³­ėu±ķėw©o¢Ÿž»ńĆų“”_ĀŽ™Ķ0ĄÓģvÖŪlztśóĪWĖÓąĒ>\˦lv;_Š~śż!År?xė÷×¢Æ®hZ>›ŻNöŅÄT¢ļm3^žK<ĪåLLBZŽEÅE'>!MnēaŪŃć—.VyŠtć8NUUc5+Æ×+Šbė[©«”M##»ģ±ķՙQU`­z#hénz›m­jć›e18~Ųv“”µ„įD«ÕŽVo; Ū/ZĶjo³u½n”RXóa<±Ol*Ī¢Īb·U½ķčӝ+ŚB½Ķv?8žŪ¾Ė„Ęļ¬hŚbšÖS­-°Z>›„ū]Ń“m*9§††õč“­ėlćéS©”į‡ńŲŁĒ/]¬3›«$-AjĀĄ…ŃŸ'?©žÆ2”k…ź’Ęh© ö&q¹\“U6 bµŠuttl'+ŗō›J’“q'9 ƒĆFK·b,ML}Öž2MŻ&Ē/½õāä'Ͼķéfģķõ6[½Ķ¶41U4ęŹŲŪ‹Œ×z›»ńż!?coߌmćéSϾĀ›ėĢę§Z[ z󊶐†Ėsń_Ūš­Ļƒķ|õN׳åxĪC&:“‰NĆK:ŪÓmė: ‡ŠŠ‹ F|ķbxcE€^×¢(Ęb1£ÅI{c“’–$©”įuĀB‹`LCįč=łŽ.—kS»­]KqŃŅŻ–mś8—Ū¹›$Ń÷öbšViQŖRN“6œhÕ£Ówßōóœ]«åČŲµĮötƒŹęsß(+ ‹ ØŅę9Kihm!«Ę¹“Kß^d_¾»?˜œjx·eąm” c¦Źõœ9Žóūż@@Ē1SŖŖBŃV§ÓéółŠ:†BōčtjhøØˆŽZ@eõP(De¼ŁeU†“7hą–]Y×uź3WU,ų¢ć—e¹Øo„q¦ŖŖĒĮÖ2ŽQt·ˆĶs¶Īb¶UHfJir;ƒ·–ē\E[xœĖݽŁä>S‘Ń ĘŽĪŲŪYŅ Ó?Œß”‹^žžŒNć`-‚lYqĮ“ōTkė1ĻŁņ ‚ ‚®ė 6`’°z”Mo Ńõz½.\(1Zn-M„Ÿh$Ą1µa›ŠøČƒ Éq\i‡`Žć|>ŸĻēSUõ™gžI&“ŗ®»\.†a@zĮ7®ė:lև­j@¢ģ+@R2®ė ÓŠO‚v2.OŁ<¹/ē¶üYŚN‡āp8*ø—?ž*I­éÓėp8śūūń2Cjć“6oķ?Ż»W(fœ?śŻūŪż}Āį°Qh”Ÿœ‹“U»©‡ć’o[S3ŻTŁGS&:ķ|užź{ė˜ 4ż·¬Ā„R©µ‚].W*•g88« !GŽ1™LW®\”ÆųŌ/ Õ““֟m­X v’oPbQt+@³Ūł½wZŽŁ…}±=݇6ŁJ”ńō©“””oīüÕ÷ī¾Ł»W&o&“ˆP(Ɛ>Ÿ”†^†”÷DLĄX‘ĆįĄĖl›EQE”­ˆ«Æ×»©śD>ŸOQxī›ŸĀOŸŖ³Xƒć©”aØF—‰ĪŠiČX•·…UI[0ČŪ!>ž‰ĪŠé*ܔłö’÷?’ļW馭mhc}į~­āD†axžW%‰P;˜:{KZ¬UUÕŲÕ»‚` Õ& øč4ŁÅč”f·³±³£Īb1¦É>‘z›ŲȊ¦A7ūłk{ÕĻ^ #‘¾ŗ®§R)X$IR H„R ±;D6‚$IąfX+oaOŲģO Šėół6ž- ‰<a{ŗ!לх V{co_ž‹ēs9Č5ß哊äv2öv«½NC’žÕŽĘötž:G’(0¢Ó”oœ®ÅMŻŽÆ„»Mī3lO÷ZD£u aSß°OXvÓSÅ@ Ąó<Ć0šĮõsA$Éķvßöč.ąAŹÖėx2ģ°)žéŌ_GZžūćÆB»HEQńA¤å¹-„G„?*?9÷U&óU&£üäÜv{;Ń„ĮĮĮš*’Ąó|2™ģļ` žĀ@Ŗm2;;kµZ!$dvvÖ8āP֙³åŸ;N…½Ą–Óét8.»—ŅO)™LµĮóüF®så'ē`"t …ĀŸī݃iøw`īē ¦?žī7?żŁNÜĘ'­1“ē SH’fœ?zāó-™L’ RƒĮҳ ­Vkoo/}Ā8Īō*šX¦Ocųģąą DKwQ6j³O-“t7Įņ\<ŸĶ2›Ėv‰ßAT6K™æz JXlĀÆbogĘŚ !÷Fof¢3™č ½ŚåóƲ,x’ĪOČó3ŗ€0~Ŗ‚€Œ&8šL&Ē£Ŗj$”Åz¼^oQ©zȬŠużČ‘#³³³‚ I’Ø įõzé+Tźžn Ć(ŠcĘģ X é%Š¢@ē¦-ʾ(=HH‘\+ūā~p\½Yg1óc.Ļ%2«•ÉėĢfcM·RkŒ±·ŃÕĄĢ}09ov;SCĆKSŒ½ķ€Ē7ķPF~#¾CŽćśūū!“§“ԁ‚dYžēK-ŻL&CA”PČår9rÄjµĀE[4’J„xž/Š$€°Pø˜·d€o^›ā«Lf› 9[°tæŹdā?’Č1Ųņa«æųą7?żd}ŚöRÅžų«˜„–®Ēć)ś¦„ʧ‹©AcµZŃŅ­øÉUō¶NÓ'Āį0˜ÅĘEd5}‚¦IōŸęoŠśūūĮŌ0f_8Nj^ķ‰Ņ싲Yz’ńW!õ€yj“h’å&·œČ—ūrƒūģ0ø’’å&·i£„»¾„«žāƒÆ2™M}<™L7EĪ•]8ÉeŻ3›©6ŹŅÄŌüÕ÷Ą|Üå]CG¼z›mžź{0.µ…-°=ŻĻ¾’‰N?Īå ©‘žæśŽvŚŚ/MLå³ŁMūmßåLtę~¹…~æź¼@NBˆĒćėŠŠø\.UU].4 Ćėm‡ĘS饘1Å"“ÉĄ˜:üŠ¢8Nšea“h²„¢(<ĻC‚õ³/E)õal-ūb~ąŚoū.§††óŁlćéŽļ ¼óRōS°hOŸŚ² §įDė1ĻYøÆŸņČ6ńbpüĮdX½ ^®/DžČӝöÉŪlO÷fĒŌ9Ž[k,¶Č¶s÷QiżĶ=ńēß ƒw~ąŚ#mį°ĶvlĒŖP­†Ą(Ś„`k“ ¼Ū“źĢY Ž/o-M†OŸŅ£Ó&¦Ö’‚łlv9žXŃĄĮžkū!ßņ7ž>±*Ōń.»ōÉ Odø+ 2ˆąń IDP’Ew€`Īėׯ}uéŗ(ŠēĪEōz½Pż.‰=iĒA (ćX,ęv»KF„±Ÿ•„ŁłŃŁžn=:³ź1¶5»+Ÿ³GĄī¬öö:‹™’~0~ŗ³Ž\‘-So;ŹŽŻŲ}Ó„z@ŃŻ(Œ½MĪģ•ā‚…Żä>³<—€A©mn &šÜĪ:³ł°ĶFy01„}tŲvō˜ē¬¾ÓužņĆųć4!¦ėĒnŠ DŖåėæu’d††ćÓg1Œā•¶kō÷÷p–e”;Š×ė?|żŽš EĮu:ŗĄ»t;ßr^£įymŪĶŠuÆģ SƉV¶§|wlO÷ćwĄ“…n?ŒßyęĒ>äĒ><ČŽ”żĖå/j¾ć²O]ذĖå &åjō·ot Ó`Øķ·ĶA²]2P,x+=ę9{Čüu³“{£7iń=: ķØLNᆠčn‘å¹x&:óH[Ø7øR÷–cž³Mī3Œ½ Ö"[Fő‘—Ėe2™Ø£šØč³,Œ–+ÄÄĮŸ5ōĢ3ϘL¦Ņ<Š@ `2™\.×ČȈQt!wJŌV‰GˆI|yś³z›ķŽčĶß\ƒ"JĖsń»o~}—&Āx!ka*ŠkGJYš˜ZŃ*5š+IŅ•+W`Śįp”­¬½AņŁl¬ė|Ɖ&Aj‘²­Ik=:č»\g6· ¼ė:’ŲŠvśł±Œ½Żd2Ń9ėŒ|# Ó]ł«ļ=żĶ¾īUvĻĻ<Œ'ĘV{{uöµ•e¹££_쐵¬ķš>~ĘŽ~2ųq>—»ū¦ĻØø„S8ƒ”ŻĖėøŚŲGwŗĪļm¼uh<}źūC~[×ėĶnēņ\|³ĶˆŁ>wßō=Œ'ŠŸ“čaFŠŅŻģ©±˜™Ķǟ/ Ał!Ø¢`2™hķSæßĻ0Œ1:_B®^KČ~%Ń÷vŁä:`±\u6AŃ-ĆüÕ÷¾ģń„††«ŁĘ-‚ķé>śüĢ_öų>ļ|µ‚9N“Z‚ ^ÆWÅt: mē !¢(źŗžL&”k=Y->®ė:ö0@öńSś®łāŽfEw#ä³Yø[žjm©­#§}(”~ECkK>›Mō½]õu¹\>Ÿa˜ńńqÆ×Ė0Œ×ė…ŠkØl5Q”Šn$«w‡ŗ@#ȞsüŅ[öÉŪßxĒÖõŗµ\‘øuŗµW!POÖ]ĒtæĮЦÕŪl'ƒC9āZü 'Zł±W4­ĪbI /o-oŁ'oיĶ+ŚĀ–S{!ÉTĖ“^®®ėą†“Nøu«æĘ‚l’5·Łm#«‰ztzy.ń0_žK”č­ft]ğEwWmÜ/\Æ5žīhx·:3p6kõ>ŻŁ±¢iš'Ø;d6æ<żŁŠ¦­h ufóÖ4˜ģ… Kč1 =‚š*B,Ę¢ŖŠ„¼hĒӂ č®ÉüĄµĒ¹Üņ\"ŸĶÖŠhīśV/ fĪgs‡ĢfØ«µ<—ų²ĒGVūĢ_½ĶĄ !’ŲśøC–īŅÄcoc{ŗ—&ĆĒū.ŅBėE ćĖDŃĮ@ށ1¶1@&FT”čVžŌŠšÓ§O}·ļb³ū *.‚ E¢ ‚$˲ŖŖ¼7šļ„z%śŽ^ ŽjrŸix÷ÅÉO¶¼¢¼ŖĶx čVpĖܽłņōgĒæßĻqÜČČHGGe3ŖĪ¶T-:żūkć‰„ÉšŽ¶OXėtĮ`6ˆ.¤WAŻ+XĮļ÷ÓŠīŽŽ¼Ą(ūٽœĻfļŽ$„<˜˜bģķ8ˆ‹ ČZSl…A E0ŒÓ 1 Ó^ÆWE0Ž·ß±gy.NaģķMī3Oµ¶V”© Ėr,£yĄŖŖŽŽŽ¦ÓiȒe:+—ĖÅ0Ģ… šŪĻ¢›ĻfSCƄć—Žjx‡‚™ø‚¬Ń™lœ6"C­HսћæøvŲvōdšcŚ—³Ś€$+0ōAƒyž †T%Žć2™ M¬Ā«kŸ‹njhXūˆŅäv¢Ü"RC@Ēė†Ö–j>H†a€×ėU% Įp8Äoƒ±KĖqąZŹžÓ]Ń“DßŪłlÖę9ūTkĖ÷‡üŲĄAš@NÖž2DŸüUšćgßæ^åĆa.— ĀĶĄŲ…"!mvR VĖļ÷WUͬŅ/ėżøŗ£Š·xŸˆīЦE;_] ŽŅĘ>Ŗ·ŁN†~‰6.‚ µĀŻ7}s9mō&!¤V¬Žć¼^/ŒąF"c­1BVc¼)KSłlvƒ»PUŗ9łżžźéW¦(Ź•+W6Ž“ʜ1 3>>.Šbm‹. ßźŃéz›Ķjo{ŗ³£É}o`AjÅZø'„“ ¼cėzbPŖEQ ­9 A’Ļó ĄƒĘ0 Ļó`µÖĘn~į~mibj#;­Ż­gµ ÉdrćcÕ`żĖ²ģńx†©mэuO Ļ_½FįĒ>|öżė˜?Ž HM G§æp½öŪ¾ĖąU>~é­Zɰ`rp½^/8Z![’$Č#­…™„błH[ų²Ēėzā“×·tĮ %9Į} ŸŒŽf˜ź.Ė2 D‡×˜†ć”›…b: ¹×ėu¹\t5I’č®a„`k0n]ś©ŅƒŃ …BPz…j?Ż»’łßÄž7…Bįæ )?9—žŲąĆ“ēł"Õ“Z­³³³ ¾½½½E‹@öfgg‹,L‡ĆŃßßĀ<888;;K’ēł`0ہuą+€÷nÜ,Ż`ك4RW+~˜Dßå|6÷āäķ&÷™å¹øĶs=ɂԩ”į‡ńĊ¶Ąötē³9]›®3›N“®hڊ¶Ółlv9ž „0öv:ŻŠŚRg±čŃi:½<Ļērõ¶£õ6LWᦨ6u¤<ĪåRCĆ÷ƒć-ļ<±šV‘³ZQh¼ …hd“ĆįP…ć8v…öNē7jŒ@ 1l¼āą1õ*Cō–(Š,ĖĀGŒ ˲Ćį€iźy&OŹ•Ŗź1ŻūĮń»oöBźĢęGŚ!dE[Ø·Łž}’:öĮE¤Éēr„cž³uĖüĄµ;]ēē®Bƒ·čōrĆöto9FĒļ÷ū|>Šõz½`Ā:ØGa“k‹EńĀ… “@“ĒćµŖŖE¶,äCć"ėõł|ą¬^Ė~²{YN§††3љ8æ+š£ė “öÉŪ 'ZĮĖB{2ō1FH!RC,ML„††OŸb{ŗyĪ®hZUõ¾­Zžjm9~éāĘt y"L÷÷÷Ć“×ė…ÖFƜ`š† Óeæ.— tįĻ@ Ł·¢(‚`Ó]ĄŲ04†õé"HɅ$`˜Sö ˜Œ>|6;?p Ą)?Œß٦!›Ļå`Œ6Öužq.gŸ¼]g6’ŚžBŒŌ.ĻÅėmGHė=I’®\¹BŻĖŲŽAj°"}o/o¶}qņ“o<^M&:‡«§įėz#9d6ætń`68’³„›¾7zs­!ī źkƉV=:‰Ī¬hZĖĄ»KS_öų@¹ė,fŲx>›«·Łž»ńå¤vj"‚÷Fojc7 !/N~ŅävÖŪl¶®×ń“l¶§ŪÖõśmp^¾‘łk“SŠ1ė~pü‘¶`µ·1öö{£7LN5¹Ķngjh854lµ·ńc.Ļ% mĖĄ»uó!³¹įD ¼ŅQ[Bęü Rsä³Ł„Ép³ŪYg1?ŅŪŽ®hcoĒŚyvČ`åökŃc5 +ėł±Œ½B«ŲžnĘŽž`r >Xä"h<Żń8—ƒxqĘŽžņōgtZ“‚Ō.KS‰¾Ės¹zŪQxīLé¶$ē`+.!¤Žķéžæzm­„eņĶ,øĀ`N“ŪÉötĆ|¶§›ŌŪlD€ ȾaEÓRCĆĒū.2ö6xŸ‡²9Ńeģķ'C漟æz­ģ€.?ö!6Ŗ)^p‚ģ{ņŁl“óUjN`z²M¾EōÅÉŪh”"‚Bōčt¬ėūĮń:‹„É}¦É}<|ØøČv-Ż?OY,lOw“ūL¢ļņ%é"‚T9õ µ V“…f·Ė\ •·t)õ6?öįóc7  A䀰41õyē+‰¾Ė„[×Y[×ėüŲ <-ČΊ.ĄŲŪ_œüä»}™ĶxŽŁĒä³Ł„‰)BČĆxā‘¶°<—XŃ“ĘÓ§Ž_z ÉHÅYÆĖŠ1ĻŁ.¼Œ ²·Ö-dŁ'oŪŗ^?d67»Ļ`Z ²Ū–.‚ Č>²€! 'Z ®@>›«³X Ķ-ždo,]A}©øtŲv“Łķ4VŹC]A  G§ƒćMn'co_Ķ’9J°R‚¢‹ Rq}—i łlޱ·kž Š.‚ HXš˜ŅĘnÖŪŽ¶ ¼kė:ū0Ē@Š.‚ H…N£Š—eŁln ˜‹ č"‚T=:č»œĻę^žžŒķéĘN·HU)C‚ģņŁģżą8L?Ņź,ęå¹8t)ŲH¢(²,Ó?UUU„h…¢9‚–.‚ ‘å¹x¬ėµń{½^Y–†ńł|^Æ7H’D! Bü~æ$IĒq§ėŗQžEAż@¢ļmČšYkØqĮöt7œh­³˜ėW+ĘoJqEM§Ó ĆBt]?wī\2™d†ć8EQ†¹pįĀģģ¬ ‚ Ąj‚¢‹ Čžaibj1x‹²Žč~įz ŗ€· ¼{2ųń֊IˆŹ²ģr¹`‚ēyŽćĄŅ•e™ć8–eA „ø\.4s‘ķ€cŗ‚Tłlŗż,o­hšqtŗ…"Ž§;žīģhr; ![.ßČq\æŪķ—²¢(±XĢd2™L¦H$¢ėŗ¢( Į‚–.‚ ūhBÓ©”ačh nµŃ›™čĢņ\‚ķé®T§[I’Ašz½ ®‡ĆhĪ‚#Zŗ‚ģCīŽ|0¦.oݽłyē+±®ó„›ēl“ūĢÉŠĒ•Ż©Ėå‚*AŠ¢”9ŽSUEAżķ’cä÷× ‚抦1öö–w+ŲéVUUŠTUU9ŽE‘Z·0_ÅT*J ĮĢ‚¢‹ Č~ąī›>źX¦2›Łžī'oļDWy]×A0™L„æßĻ0Œ,ˁ@Ąd2‰¢Øė:ĒqGEˆ„Bķ€cŗ‚T ©”į‡ńDé|įźt+‚®ėEsŠüɁ@r‡F/#hé"Ró,ĻÅKĖ”{£7óŁģž Ì č"² 9Bkń8—ÓĘ>Ā…Ō:¦B”€gA=7sL†—ēāł\޲<—(Ł=l;śāä'{{œŖŖĀ0ždŠ.‚ ūPŒ2Üä>³±T²küŸ'ŌĆ·6J”IEND®B`‚apache-couchdb-1.6.0/share/doc/build/html/_images/intro-consistency-04.png0000644000175000001440000003266012332105522026264 0ustar00djcusers00000000000000‰PNG  IHDR –· pHYsgŸŅR cHRMz%€ƒł’€éu0ź`:˜o’_ÅF56IDATxŚģ}lwŗļN‘ŻÄsZŠKķŠ£Mø5k·4Š Ņń$©Ī*Ot¶+8„ńdū¦²“1ŗ*-*Ž P]eL)ˆ–nʁ*Ø»GS©œ•H2¾:TŠķøÉ.ĪJ1Ōį“wgģä^*Qq’xŚ9®óę$NbĒĻēHü2žeĘžśyū=Ļ’{÷ī‘%4M“eYQEQ4MÓ4-‰÷Z­V›Ķf6›?b³Łč¤Äܱ„nö(Š"Š¢,Ė©r– V«•eYŽć8Ž£ÓH$p¹eƉ¢(B,3n,+·Ū+7­“ŸdŽ HąŸĻgHۊŅÕŪw¾¾±ś©iéŚøJwīĢIƦkjjņz½f³™Ī6AĄĶŠ¢š<¶²rū o¶¤z ³§Æ÷bĒń#(sV«UE–eé“ ܜ#ĀīŻ»Ń!ݾsĻÖē^ž£ŗŌłŁ©Ć·‡n@CCƒ tņ ‚nįy>€½rÓ>ū,Ņ)IčĒ|zęp8²,“»J$pŁGÓ4–eŃ-}į–¹3ÜĘŅ)uœ:Ü8šL8I’(ó@$ps¢nE¦’†–÷žØyjžp=Ś·æžM&†‘eŁétŅE!ø,«Ū6iMÅŗYĘpüĘĮ×<ƒż ĆØŖJ¾*AdĪßŃ)˜L˜.¬ŗĄJĖCڤ²r»®ė,ĖjšF—† Hąf…Ļē …B°°ź†—0 Ž™J"‘Ļótu‚\Ō™#ĖrUU4“­į¶ēČŖ®Gū¼æŖ€ÖÖVÆ×K—‰ Hą¦¦i6›M×õj÷6ļ÷rjmēNŸś(h“²» +[ ĒoxU5šL“µµ‘ĢYpÓc[«·ä¦ŗĄJĖCXlģółčz \¦Č²‡ ÓTžŽńr‘©$‹‰¢HW Hą2õ¢Ś½m„å”\^gq CFAdÅą~@UÕ²²2ųš_äøĄĄHBń—&ŻŻŻŌR‰ Ȃ›I’»ēžj‹K˜ÕOV'A$pSū§5īmł²ą­Ļ½dč2A$p“ł§Ų Ķ¢¼`MÅŗ„«u]—e™® AĄMj„½rÓ\w²Ģ.öŹĶĘā ‚ ›Ląr¶öm"žØŽBG$pS»Ø†A”GąčU¬Ż#‚n|P#ŹŹķłµl#į‹M \:F Éü Ą!öŹM$pA7!Š¢J‘×.6A$p‹ LŒĄ A$pA$pA$pA$p Ēh"‘Ėīė½4ńž HąĘÕap ?’wO$pSØĆpüFŽ-¾æ÷s ‚A7!.— £yfÄ”"3 CG$p‹ĶKķ§AĄe(p—:Ļēײūz?šÉ@$p“ĮqZpł†»Üõ AĄMŁlv8p¹+oŒøKŸ& ƐĄ Üš<Ņټø®ó†ķIÄøŠ\ŌŠ4młņåp MŹżŽå# ż_7ż|łå—s—dPE–eģ—g³ŁX–qŗVEUUm6Ļ󚦉¢Č²ģ,Wž­ć‹˜„t /ÕćńNélī ܧgN€Ćį˜Ó϶×ėMė‡ŽŠŠ ĀĢ.»\.žēEQܽ{7Ć0F«Ń‹fVŽC‹Zų|>č ½ķĖqóķÜé“(@óšr‡£»»Ūķv€ßļĒž ³ĶĄƒ>ŸĻétāešĶqøBÄf³y<8uø1—ףqüČh2aµZ1n8¶-˲8²1jšćøĮĮĮess3ŽÆåqø‚6āś{?æŌłYn®šz“ļÓ3 ƒ;vārĶ?s”k~d.ķI’l6Ū’%KX–E•Q…eYŽćDQ“Łl6›m\5E‘ēłŌäÆ,Ėx žI’X–]²dɒ%K8ŽĆ~ÅĘć1ī¦(JŚq4Móz½f³yɒ%é3–Äó¼$IN§sɒ%ócö9ÅąŅø¦¦¦ęęfć«öŹĶ98†Ęæ’5p»Ż,Ė^~ūļāCńö3UFUUUUÕår…ĆįP(¤ŖŖ¢(ĘSb±X,Ó4-ķ8^Æ70 Ć0L PU3$įp8N ßo³ŁHęȂ+P¼^ÆÕjM&üÆę s:8ŠĻ0 Fś×?±īzÅŗėˆŌżęĻæmøgżEUUõł|ØkÓ(MMMŠ¢0 ‹ÅRēO755}łå— ėśä.­ŖŖØnn·»»»-8žēQžŚŚŚ ‰ØŖj¤ū›ššīŻ»—Vż§Ŗ*J˜(ŠčM‡ĆįŌQ ūŪ߆•MWȘĶfüL^ī:±üįRēgĒßAŠ&ZZRbŻõŠyCåČÕØŽsåŪĪn­ēJÖ_7‹577ėŗnµZQXUUÅbx®dYĘŤŖ–n`ķōä12< Ć0©xXÆ×kdl§œŖ“j`µ©Kā8Īl6ćń)ėJWŠ8ĪÖÖV8uø±SźČ…%]ö”EéńxĘęŠ×V<üdeķÖUµī;ńųÅŹĶ±c'²õ҇# ¢™††›!7»wﮪŖJ ü§}UL©M(N§35Ę'ŠbUU•ßļŸ–™™įDAA1ø’Bėé]j2Æ­@LQ”@ ąo|­¬Ā¾¦bŻĀŖŪžzn4™p8F6s¬Ę•j€Ų±ß'“_ά¬ŻŗĢbɊIĖqœ×ėmnn© šxQu]ŸRexžA×õG}Ōår„FŠAH‹ß9ŽH$‚ÅĘiŚēt:†ŃuŻēóįY²Z­I$Q8P ĪāŁqŸÉ4¹ŗ„łtf³YQ¬žõ7¾öį;ūēsĮēNŸLµŻf0xa}š“•µ[Ž».×ü󵃇ļĪt¶ŽĶf³Z­†™&‚ĖåŅuŻļ÷777§ÅĖTUÅJĒ3¹Ąa­ķ8›Ķ†»&vļŽ&pʆ“ dx„Pa€ßļ7ĶD“O›ķUU•$i6Lß\čśĖ® Ÿž‹ö&rå¼^/~†ĖŹķ ŽĪuHn$”ū_ÅŽMG„YŽ•1žšŸzŪ°ļ¦DQMӌäcŚÆšcĮša¦É²Œ!³`0ØŖŖŁl6ŲŌē¦=+õF¶ćXF)YMÓŠf÷8ŖŖŠ¢ˆAC49ńńĘĘž  \Nąół0Č2ĖOäØU”Æ—~?É%IāyŻ®ķ;_zĒĖsT|īōI܌­­­Ł*IÕzz‡ƒ”ņC-#W£Žåµīz%s„ĖCąŗ»»)žE®‹jōįQÅēóa,ļD'HÓ4ük֍ĒȲ<›ķ‡ļ{c"vņ'r§( ާé8ž®÷WUYÆ é”:^ų§ĒNnD·ōĖ/æĢbĮ½yC%¦Yćķg¾‹];xän~Ž‚%ˆ\·ą0w†1c¼æóSĶ“Ts@–e¼q¹\³ 8sżŠ‘Ō[ī3™6÷^Ģšé¢(ś|>¬t]Qŗŗ†ŪVķŽ¶ŅņŠlŅĖ]Ÿu÷öŠM`ĘēóĶŻ^¢»‰D¼żćūL¦=;bĒNŒ\>¼oOV JȂ#r…Ģ¢F"‘††L·a>nA”eCĖMMM3됃ŗöXš“=; UćœŹ|K…ēyžē1Q‹Å:ŽæŪqüŻÕ[ÖUnŽX½%s„Žßčļ½x©ė¼Ń'aÆ×‹;Ęēš’—”ąī.<'ß'“KKLhÜĶž{‹ś§$p?ąp8p×ŃīŻ»'Ŗ†7>9hōAJ*mZ܉DZø8*^[ń gĒwńøŒK«ÉŸĻ‡‡­/wæÜužŌįĘ„«Ė*ģk*ģ+JWÆ#v£ }p ’z“0Śöšq*P7ēyFżzé“k Ž}Į=óĄ“Õ–ŗg—–”Šƒ ›-ųa6ņYsT²4r5z'>ōĄ“ÕļŪs7‘4Œµ‡÷½”õ\̦āU Ó»’$…ĆįŪC7oŻĢpxĆįĄŹÆ…Jź-³Xyß·‚”ŃčĄhtąg–Ҭ'¢nųęB×ĄŽ·¾O& ~2ösūČūĀÜÆWĪśóŒķw0j†9̐Œ}¤ŽsÅłßŠ{NgNE©šäč=½«jŻZO﵃GŽ·göū¢ŠĪŲy3½§‹×–³įńe–Ņ ģ!»cō¦'ŗ÷n"‘³ąŖZ7Ź\™¹}ąÉj­§78“­żA7!w‰k‡ŽŒ\X/żž‘cärŖÖÓūUŻó̆ĒķæĖ»Smģˆ;”÷\Ńz®P𕠁g™•ŗo:»‡ƒēP;rßõ[j2ĄųP^æiʽ}ķą“”qķ r“|ź—.mŗ–YJ‹×V\;xųž'«ó%°u+Zf)]5“wāńžš-(p9÷$Hąņlė6e7bō:8óČūĀR“錔#+kŻ“’ČņµełĻ,ČĒt޵ƒ‡’wÅ/pŲĶ"`U­{½ōūeĖ­ą¹į๯źž¹„Ļ‘#äY’įV0tķąGūGzv˜7éX±¾včHqEy!¤4«u×+ ņµ$Š¢$I©ŗVd*)«°Æ«Ü÷rV¦;żŚtó3:ƒXä÷ēß6|ŪŁ=­yWDŽ[ā±c'ī&’¼ļ’ęB¶EWÅbĒN܉ĒgGĀYŃ萢“ew|m_ļŎćGś{?G§UEF7mēVšÜƒžwāńk”z{ńķŗ }{”kޜµd’4ėŻDārĶ–ļ“É_“4­šaY–9ŽĆÉÜOļxiūĪ=s4™»SźĄŁµŠŌŌ4³)HÄü[…¾wāńHŻó×¹vš0ĪCY”;‡ƒ”o;»ļ&“ū¶{xļžŸYJqŲvģŲ‰Ō²ēk‡Ž|ŸLĄµƒG2?  UUUŗ®—•Ū…?t½ųę9R7Øį¶ųĒ?m¬ŽĶĶĶ,ĖŽ[nBĄ„“-fĻż5Õ̆Ēļ& Wąx²zcēæć€›Ų±_Õ=­4ļÄćŲ:F£Ų¾tJxžß½{7T»·h“ÖT¬›ėõ—0ū¶7“-2•„Ća–e§l£O®‹šŚņh–f"æø›HÄŪ?ž:pŪ/QūėļRöxÜg2mģŸ2Ŗ…"pÅkĖ€Łšų2K)ō“£§w¢ń<Ļ+ŠŅŌŌ„’7ū*ł`0čńx00?-3płņåõõõĘfvœl”Ŗź5½oętpcūĪ=+JWĒb±ü& ęCąF®Fæąž‰;±ĢbY/}āh’mQ0Ōķ«ŗēÆšl»„Ń©ĀŠUU}>Ÿ †i (Š,˚¦)Šāół&’B³ŁĢó|šAĪ¦qdl &Š"> ™ś*ćG’$|–q‹±$UUAH½k–ą”ģ•›ÖUnĪńė»}ēėhÄŃ[}a™Ūµ<š\ą~f)ŻŲłļ?¹K–Ą=*$IŖ­­€ĮĮA›Ķ&Šb}}=>ŒaEQl6ĘģŠŸÅ»0č–ƒK=,*śzų§Ó¹|łrc V«ą īŻ»—vœ“ˆ”,Ė8Ķ »\.ć.Ē“™3›Ķŗ®ļóžØy*÷/ńö’ńšh2 ³d rȂ»›H`įŅĆūöÜ_S…Ū ‰Ÿ|V7Tž¢ż£4uū‰jŠˆĖå²ŁlŖŖ¢ŗµ¶¶ŗŻn]×S­ƒH$ŅŠŠĄ0 Lé?J’T__Æė:Fśp“JSSSwww[[Äb1Al6›Ēć1 żå4{*3 ÓÖÖĘ0L$IU±p8ģńxŁG£DQŌu}Eéź¼P7Øvo3¬Nbń\“<ŹŠĘŻ‰Ē±¹@ĶĶĶĖ—/D".— ć8ų9q88Lćń‡C”<Ɣ›T@—Ė…“„0EėółpŽJ’,Ė6›ĶHņÆį·ĪņtįĮ±IQ^€©†P(D©†dijØ%[ ßŗóGžĻŅæ»™„R E9Ąm’R8«ÕŠ–޶3›Ķ(gŖŖ»ič»įYĀ_'©ĄRŸ˜fč„:­‚(N'Ą ŸŌXRÆžQ5ܶ|¹¾+-••Ūś±'iĶĀœÓéLżØd“7ödėHV«u±öŪ·+Ļó^Æ/Mj_×õT™†5‘*=č“¢³)Ā”6ąü#Ė2ś§óŠė-‹Ų+7 ōK’D·`÷ƒŗ=čČŻ5~™+ ^Pʽ}'>4QŻ FėZ.6› #÷“Xg†xaĢnÜĒć R€Źó<Ļó™ĒŒ¬VkŚuAĆsŽģ9Ÿ=óAÖ=$b÷Ć’ĻüÆÜ]cė“‹ņŌ/³X&߈Šb„"‚b‡eY6¼TĆ COµ‰a˜É… ]T³ŁĢq\j(õgćų¢(šĶꓯ h`b™Čęn jĚ {~]b,gÉA‹øpų;: ÅČÕčÅŹĶ‘ŗßLōC/p†’«ŖŖ–,Y²|łņTSK×õåĖ—ć4©)³Ø¢(2 £ėz}}=–” å÷ūq{Ŗ„”QĘo‰D"Ƴę®ģ ®,ßV”®†I£¢Ä¼Xpļs7™ü~ĢÜ—ĖeŲn,ĖāÆhŽÉ²ŒsŚń©ö”Ćį0›Ķįpø””UĘl6ćsŃ K;¬¢(‚ ` [)ŠĢfskk«$IĘĮ%I“c ½^o$Į4.ŽŽĻÅӖ1cЌ]—o.*¬°¬¾=t“© Œžß}!Ē]Ԝß:sK$āķU”Ϧ#žQU»ˆmMÓ°ł\’ęŻā?|g’§g> é‚dĮŽ©/)”¦ÓšOĖķłøų¹›^HdÅą’kĮ=3ŃĢ"•"*'ȂĖ/F¢£ŃŁēy–eā‚ Hąr…ūkŖgŁŃ—Z* \Ž2¶į%AY„bp ɝxüĻæmøvš0ŠIĄŠ“žŽĻéT$pł%pCßvvĢ. ·čÉė> }½!„AWH“‰ŁšxqE9ŠÉĮ }yŲ6u4‘ČwĪļ‚¤xm…£żwt¦Äf³Åb±Ūńo›śa.wédĮå4·‚”Ų±wāq:“€їoa849ē®É A—ė ’ pCt*¦øž|sQqĮd¾‘ĄpŒĄdb6<¾Ōd¢S1„ĄŻŗ9æ‘G˾ŌyžŽ® yä}æ£żwÅk+čTLŽŪķ€Ė]y3Ąh8~pŌĪ—®p¹›HÜ †nCt*&eāÜ铳²ą®ŠYŌeJ”’Ą.#сæī}k˜.cęöŠĶ|)é”Ī’łFGŻÕ ćų‘|P·ŽŪC7†”ĶĀ$p…ż¹ŻPłŃÆØ.°gdļē¹oÄu2hOĢ5Tč›^źÕčŻ{—߉}ŗß_S=›Næ‹›Ķęńx@Ēń#ėŚrש?wś$šo$p µ,Ÿoī&#ѽē `«Ė‘«iĆī3™6vž_J-Ē ŖjYY4“­į¶ēā×UBń—&­­­$pdĮŽ/)¹všČä}.x²ŠŌm"#®©©©¹¹łŌįʍÕOå`Cp㫣ɄĆį uĖ(·<ņ¾pߤ•½4«a|>ŸĆįM&üÆęŚŚ:„¬Ō® \²Ģb)?ōöD÷2Ÿ| 43a/wĻ©Œźõhß©ĆŠŌŌD»Hą šž¬¶Ō=;ī]–:jó;N§³µµ:ŽæŪ)uäĀ’FśĮ×<čœŅ„@8Ž÷FјNp?³”Rņ4¼^ÆĒććk×£} ®nūė¹ŪC7üūææpī]8`¼`™oÓrTqƒźžzn+ćPŻś†ł“³ó‡¹„«CG¤ćī3™VÕn„Ó2-Ć„ĆžznA|ÕėŃ>CŻdYv:·‚”?Õžz`o#]8ā'Į8Ŗ™.f³Y–eĆWżšżółź}½ÓŌĶøė› ŻŌÄ4 Bߜą ī™Ń衆Īó”?^Æ×ļ÷@Y¹}ßŃĄJĖCsżŠ¾³’Ó3€Ćį$)uöö­`Øø¢¼xm…ÖÓ;˹·Yp‹GŽ"u›1‚ “µµ1 38ŠļżU՜–ōõ^|įŸCuóx<²,§Ŗ¬ŖuÆ­ø }U÷<łŖ$p,³XyßOēa6š<Æ(ŠĖåM&:ŽæūĀ?=–õØÜpüʁן0aŹ0L0EqņvoZĻ•»‰]rQ ŚEMCUUEQEŃ4MQ”“{±ˆ”eY›Ķ–f; Š¢×ėÕuV”®Ž¾óõŁoźŗŌłŁ¹3'įӏG„);Y~s”k™„“xmÅׁ3«j·R€•®pNÓ4I’$I’e?œ™Ą0 Ēq,ĖrGcSO¦ ‚ g²Ś½m]å¦é*]_ļÅKŸ]ī:{č¦!m>ŸoZß+׎·\TQīh’ˆ4Ž®ąN’$QC”Ÿō’±Wn*+·—0eåö¢”ĻähBčIčƒżż?£ēv»yž§²iß‚ D"ćƲr{Y…}M…½¬ĀėR­^ö&·ć7°opźéÅ֕^Æw&óČÕh¤īłe–R8øĀ8Q}>_,3>{5Ü6{å¦5ė2<Āõhßå®ó—:Ļć|°Z­>Ÿɦ¢(Š(в,§*]&X­V“Žgłµ1r5ŗĢRŗ“¤$vģ„„īY’9øE.p’$y½^”¶"SIµ{ŪÖē^žMqĆpüƹÓ'»BgG“ üdŠ¢H[¾ĒŚtТȲ¬ŖŖŖŖš¦„JžÕjE ć›ųo_|UøÅ/pŖŖņ<‡Qڶ>÷ņÓ;^ĪV_³‘„žé™“ēNŸD™s»ŻS¦łˆyƒ|UøE.p’$ń<‘ļķ;_Ļ¢“„É\Ēń#XØÅ0Œ$IdŹåwāqņ}ķŠKŻš‡;×PÜüįõzkkku]/+· čŚ¾sĻ5¤-.a^|󀹇®²r»®ėUUUŌĄ'GXf±`$n8x.R÷ĻōV›Sxž7ŌmÜŅI4üÆ”!‰3 ˆēį½{F®Æ-Ÿ}Ÿ–e›››@UU¬nQUsč<Ļc&‹cš^I’œNēøŁ'|Цi©łwÜ8čt:Ķf³ŖŖXjc³ŁŠMŻSˆ?°,;ö8’$)Šb³ŁŒ/ZcIf³Y’$ ęd1ļO7‡ų|¾=Ó÷PŻĘj˲dŹåˆ·^ś=ÜM$"uĻ[<;VÕŗg ĮPæDQ¬ÆÆ7އ(+¢(677[­VMÓ0•ßŌŌ46UUU•z—¢(ĒaĶfSS“×ėÅŃ“©We÷īŻx žpļŽ½“ć°,‹>5‚ ˲ŁlĘ%9UUqIX’-#u®eæQ_x£å‰š§raI5Üöķ;_€śśś… żiÄŪ?üuļ[3óU5MCq¹\6›MUUT·ÖÖV·Ū­ėzŖŠÅb1–e477Ož—PU•eŁX,Ę0ŒĖåB ®©©©»»»­­ &‚Ķfƶ£ąńxŠ_NEÅp8Ģ0 vµŠD"©nD$q:Ų€>‰`®ƒ.wAKp‹Bī,lūĪ=«· ļ<³Œ1Xw½²²vėϽ=_µ¹¹yłņå‘HÄåraDµ‡Oćū0M2DQ4ōeņÆ:ŸĻ§ė:Ć0č–bĆēó±,ėt:Q%±#žįšćFd—į`čūdrZ¾*fQ­Vkš+Ŗėz8žn40.–*=’$”’ŪÖֆ\.óc’įf„Ž[Łóā«·¤¶āÉ)žØyŹ^¹©æ÷sŸĻG՜āį}o@ŃŚŠeĖŻD"Ć-«f³k-ѳŁlįpŲårMb„%%&1c±Xź!¾axžēy>ó7'ķ–yø?üOzoeY–ŃöĪAē4•ŽhńžŖ:L·}#1?‡;óx²ŖüPFo$¼ˆ("(vįpX–e–eQĖR­0Y–8—Óéœ$‹‡ F{•Ō§žlŲŌcų*±XL’$ŸĻ‡nļüģ^ŚŌŌ”ÅœÅ‘v²r lU»·ĶĆ`§Ł°¦b]µ{[Wč,q¹ÉHtąūdņ› ŻÖ]ńL2Fœ,Ė<Ļc›O,Ō€ÖÖÖŌ‚[ćvLŒN¢XĻ‹Åš›››››»»»9Ž ‡Ć~æ?­æžÓéD3-`F"Ķ­ …B˜-ÅgĶĻžč„“ ;‹ØŖŠy±#Ē©į¶u…΁LĘ ó Ä-5™–Y,#W£ćöq¹\†ķƲ,žŠī¤,Ė¢(¢­d³ŁŅL„††æßod]Ķf3>ß©‡ÅͤƔPŖE f³¹µµ †ń.ģŸŒÉ±Ė ƒ^Æ7‰8¬,Į{ńac’¢¬°¤ †¹Ģ5>ŸÆ¹¹ycõ–żGŪóbĮ ’R58ПöõNä·‚”æī}keķÖ }Õ)ߟPH#œ(‹šMŠ×{¢zK¾,xės/ķÜŹ¾¹ŠM½•fā¢Ņ)ČŠ¢`ˆwcõSł²ęÕO¼‰DŒ-ŠDśŖKM¦e–Ņe‹ÖÓkŽPIē„nĄØźĘź-9Xū68µkp #Óts“ž¬6|ÕŁŒt(ĄĘĪ$pYøœ­}›ˆ'j¶ĄåĒ·QEł}&ӝųŠŻdrĘWhG1ølŗØ€Ó6ó{åfČźī?b®nm…£ż#GūGĖ,–Ægī&tN¦„²ØŁ;•K–Ą¹ž’ĢÆe$ōŻōPH™µ|‡Ę’·0žéŠŅÕłgü1¤}©łĀŹZ÷}&øłf…eu>.Ū^¹‰.æ|ÕõŅ'h¾ÅŽ ņø9Õ”ČÄŠ© ęcü`ģŲ‰/ø_“Ę‘ĄĶ‡Ą­É· ‘×Xźž-Ŗ(_f)]J+ A,2pü śŖžmÌĒ’Ą‘£‡¾ź·Ż³?HGL¶aŽß¤SA,”ÆśĄ“U³?HGŒvŒ¹=tƒN±P¾jł”–»‰D¤ī7ZO/8ā£żšÓŽÆD>jÄŪ?Ö{®|U÷<Åć~8-t ²hĮõ÷~ž‹M& ÆŚ&aŻõ †įĘmI1CĢf3Ć0p=Ś—_+ļė½ó5„˜Źµ Æś÷̓ƒĄSqčīåJęŪ"#Žžńht`ZćIąˆÉĄF4}łę„¢W€Ā½Æŗ²v뚽{pü ‘ėx_Ėī'[¼¾źƒž#W£—k¶ÄŽ #f+p ĆÜŗ™GaøKŸ&V«•\ŌŊÖsåūd2vģDaęUIą² Ēqpīōł²ąĪŠYcŁÄ¢äAĻŽŸzūē‡Ž.^[Q€ń8jx™MdY®ŖŖ*2•|ųĒ?åžd†įų¹iāĢ¢gäj4R÷üOVĶ~ü Yp…ė„Z­ÖŃdāÓ3'sµ]”³ąr¹HŻ Bą¢ß'“ĆĮseĒ‘—eDQ¬ÆÆĻ}#n$”æųĖĒF“‰`0H.j€eq«jŻ…3~,ø,Ćó|^qĒ`zŌ­pXUė^Uė¾ }U÷|¤ī7…P>B—}|>œ;}r8ž£{ļÆGū>=óŠLū‚d™„ō>“i䟥Żd’\Tb&°,‡ķ•›¶åā^™†©čw¹\8+‡(4°d¤xmÅ7ŗĢ_Ä£¹Č‚›A€žŽĻĻĪ9Gµćų‘Į~†aČ|+XŠ×VÆ­ø że—7R÷ü"öUIąę§ÓŁŚŚ §7ęTŻo_ļŎćļ¢Sņ“Še®¢ü>“éN|hūŖä¢Ī!Ē…B”"S‰š‡ī•–‡|=×£}ūė¹ŃdĀćńłF¤śŖ±c',uĻ.>_•nŃ4eŁH$RVn?Š&-lՈQāp8dY¦ö–„Į­`čÆ{ßś™„ŌŃžŃ"kzN.źb6›%Ibfp =7’Šj%Ćńh»‘ŗcy ¦ŖØ¢|©É4ŃųĮo.t‘GŒ¢(,Ėźŗ^Vno8ptMÅŗ…ņL†‘e™öÕcĮ<ĆŅ’’kƬu§6ĘńŅ›zž#X²ąę§Ó)˲aĒõĶo?„N©Ć°ŻTU%u#ĘĒ~8o’8uüą­`[-i=WČE%&Ō8UUĒh2±æžūšżóš¢# żĆwöū_#ϔȐUµ[‹*Ź—YJŃWÅŲŽõmg^z©ä¢Īš¦y½Ž@ eåöŽlYW¹yŽ^«Æ÷¢’«·‡n@CCÖåÄ“|ÕxūĒĘķ?³”nģüw8b $Iāy^×uŲX½å…7Z²[A2æįo|ē{a5/ķ6%¦ ĘŻŅn|,ųIŽ ė"u¾į8NUUĒ—»ĪæųĖõĀžW³˜ėė½øÆŽżā/×£ŗ544ØŖJźFL#ī–Ę·ŻdĮ™¢(Š×ė ‡ĆųėŠŅÕ[Ÿ{Ł^¹iŗiÖėѾNéģå®ó萀Ēćńł|“Q˜ß\čśĖ.ļøwU”Æ—~OGLUU}>Ÿ$Ič“@‘©Ä^¹yM…Ż^¹¹ČT2VļŠÜėļ½x=Śßß{Ē6£CŹqI1c°ėļ÷ļܚY±ˆ’_ź.— X–µŁlų/ Ü¢BÓ4I’$I’eŁPŗ A]cY–ēy:“ÄŒ¹›HDźžLņ˜Ÿz{U­;ĆJ?2Ż·“ÕjeY–ćøŁXHąrY–ń»NUUUUc±ŲŲĖo³ŁœN'~ŻQi‘EīÄćZϽ§Wė¹ņ]|(ķŽ•µ[§é ŖŖ ¢(¦:%eöu•›ĖŹķE%LY¹=uŪāpüĘķ”›·ć7nŻģė½ŲŸ2YŲjµņ<ĻóüŒm:8‚ &»Ń«Q­ē Zv÷™L›'Nˆa¼ ”`E鼍Õ[jømÓ +_źüģR׳Ė]Ÿį—‡•Ią‚ČȁEĖĪāŁ1vC¾¦i>ŸĻļ÷ćÆöŹMŪwī™}™g§ŌŃ:kŌ÷rN­ķĆwözę†aTUM ʑGÄŌ hÆÜ”kźŪwīYQŗZ×õ±Ž* AS Šb8ʒ·\^q Ópą=²,“Ą1 p_ŌÖē^Ī‘ŠŪXÖUn®vo3–JGD¦ęīXxzĒ˹¼Īķ;_€p8œj𥑑ł¶ąu!“³Ņņq©C2)‹JĄȲ\UUUd*łšŹq€įų¹±;&YpALęŸĄĘź§r_ŻŠˆ³Wn£&ŽŽ ˆ A„ŲśÜKł²ą÷6C—Ią‚˜LݰeČü÷ ™1«Ÿ€H$¢Ŗ* A‚éHūœ5é ŠKōRqń$pAŒĪi~¢zK~-Ū¦“Ą18‚¾¬Āž_ĖF“ՙŽ ˆqĄäģī…‰(+·‹ #bBĆxV~aT“ØŖJGÄ8hš–æ‹G]&#b|0†µ.ÆRØc!#bŃBG A A‹†‘„NGÄbĆétĄą@>.~4‘ #bB&šŸ .;N8‚ &“ąś{?Ļ»•ĒoMGÄųĆ0p=Ś—gę[“\.¹ØALaÄ”^ä}½Å“Ą1>,Ė@_¾y©čVćāIą‚Žćąr×gy“ęįų Ģ0Ą1…‹jµZG“‰Ky£q—»Ī€ĆįĄ,0 ASq—ŗĪēĖ‚;„³ąõzńW8‚ &„ēyč 5j/r™¾Ž‹čŸ¢.“Ą1…—Šõ]”³¹æŚs§O€Ēć1Ŗ”Ią‚˜ t÷Ī>™ćūRūz/bĪēó7’Ą1ǹ\®ŃdāŌįĘ\^gĒń#h¾Łl68‚ 2m¢®ŠŁœŻÕp©ó3,K5ßHą‚˜–eŻn7ų÷斃ĖIčžĘW ©©)Õ|€%÷īŻ£ėGÄähšf³Łt]zĒK/¾y §Ö¶ÆŽŻßū¹ĆįĄ9dĮ1=Ģf³(Ššé™:„ŽÜYXĒń#čœāņHą‚˜ Ē544Ą©Ć9Œė”::Žæ mmmø»> rQ ‚˜,ˆĆį"SɁ6iMÅŗ…U7ćkąńxĘ5ßȂ#bzH’äp8F“‰żõÜŚq™Ø AÓĆl6˲lh܂ģĆĻPŻČE%b&hšĘ²l$€ķ;_ß¾sĻü¼īHB?uø÷M©ndĮ1C;NQĒĒ߯Wļž‡Żų×£}ūė9T·¦¦¦)Ս,8‚ f… >ŸO×õ"SÉÖē^ž#Sn$”zę$&L†EŃčBGÄ¢(Š×ė ‡Ć°¢tõöÆ×pŪ³+mēNŸM&Ąķv‹¢˜łHC8‚ ²€(Š^ÆW×u”¹­Ļ½\ķŽV\ĀĢų€Ćń]”³†“Y­VA24ÜHą‚Č2𦠂 Źl¬ŽņDõ{åꕖ‡2<Čõh_ļēŅYl]‰Ņęół°õęt!#"ū֜ ˜cEV”®^aY½®rs‘‰)«°§=~0Ś?šŌūz/FūŃ^CÜn7Ēq3“68‚ ęUU%I’$ ĆsĀ0 ˲DZ,›Ö„Ž ˆ\DQEQTUUEÓ““{m?āt:ĒŻR:cž’× ęŪČ't÷IEND®B`‚apache-couchdb-1.6.0/share/doc/build/html/_images/intro-consistency-05.png0000644000175000001440000006177012332105522026271 0ustar00djcusers00000000000000‰PNG  IHDR³- ćć pHYsgŸŅR cHRMz%€ƒł’€éu0ź`:˜o’_ÅFc~IDATxŚģ½{t×½?ś•ml§¶4“ƒy, "™“µ!))6.$G²Ķ̓®DņmҚ[‚ä<č !‘X'!įŃZœ@HHŗ,'”¬<Ė„.œ6­ĘäHSlĖēŲ“Čą€Ü_ƒe°|Āėx$™€mŻ?¾°3ŃĖņ[’÷g±XćŃĢž={ö|ęūŚßÆČēó… t((((¦3:N›Ķęt:馠 ˜8f4™L"‘H$įŸjµZ$©Õźhø%£Ń˜••UXXØÕj'ņŗ8 &“i<ēy^.—+•Jžē'xV§Ó9\j³X,………µµµÖķ––²ŻŲŲXRRBśŒ7Ā0ŒJ„źč訬¬l”gϧµL&›xWØÕźņņr܈ćKó<6•J5NŅwX­VŽćŒFćT`FæĒj2™¶n݊_¦[p:x°B”0™L,ĖŹåņ‰é|yy¹ŃhŌėõµµµėׯ×ėõ,Ė”Ņf³įķ466Śķv„R-ĢČó<ĒqN§S©T"mß\.GE(Ūķv½^ļt:yžW*•ų+Ļó‹…ēy½^tĝN'ĒqĀˆm‘eY›ĶFšņcĒšH^H‹Åāt:Õj5NT+X–E™7Ō%„ć%, ˲ĀGtæŻnĒAĄ»#·Ęó,ņņš<‹{ģv;Ēqd|"¹“š0›Ķ&—Ėõz½Ÿ CtŽ@"Ę+ ‡‹<;–eÉd^Ńb±€^Æ'ŻŽƒÅb!÷ˆĻKÆ×ćm’a·ŪN'ögu˜÷ŸōP«Õņ<K8är9īĒYDn'čü!½õ›ŠĀkž‹·†#)—Ėår9%²S—Ÿ÷ą=Z­Vrw¤ņ5kooöŖŖŖŠ4Å0L{{;t?ޤšźx äOÜf†Ę0̉'Ā)°q†aGIx€Õj^šÜ&öSx›a.MFÓétä\…B!¼4:F#[į”Ž/īT(d2( r"¹Ņa;äW|¾~żÄŌh4䔓n“kł ¹}l“ü)lÜjµ’—…¬ÓéH#UUUĀöƒNEįä!“įÅ ,܉=ĒsɈ «pl±oäWįÕÉŌ¾õ&’w3č,"}>qāyFåååŲ²L&#ķ!ņ;»‡æ YļH&“łFбgF| 8øä)//Ē?…7vāÄ ņ€‡Ć¤ÓéBŻ!9/Ē0 ^÷Ėd2dØaŻ ¹#lS”PlooĒĆȅȿ2#į«^QQÆ>ÅPūÉ c0pZ w2#Ž&yżpއRį»gµZ­V+Ž•ß]ą3’ÉdV«µŖŖŖ»»;čœfĘÆ‡a.-|čŲ>Ć0¤d’ųń¦L&#=6Ž/$yv*• ‡‘|G+**üFŅ…żÄ©ȌLj`…ŸC«ÕzāÄ 2 ĀG&lY§Ó‘¦ĶÉ|“ÉdHńA§bww7yr×Bf$”ųQĒć ƒßŒ"½*//ÆŖŖ 3Ē'|$ļff$²šÉĒ#čł]TČ<øM$”øĢH¾$~ß||y„IČ5äĮ §‘PŽŅ9 ½½ĢHqaO†{/~²¾`ŲįŖŖ*2Ń»»»qzłĶ Ņnų 5ä‘åCķ'2£šŻŌĀ†ŅĄ»noo'82™Œ xŠ9c%‹Ā\:q„§ %&”wČŪNīQų$ßWį³N?”/h?ńņLń*A™Q؁0ė7J|į+**šį "|ō~pöŠäZ'Nœš»k?›~õ±‘@UĄļ3ĒĀ3cØw3 3%Œfˆ†dF”bįGåĆĀŲū¦Ń"P[[‹6b(aYöī»ļŗ–ŠÖ€f?Ė#nhµZb'’„vŠŃ‡P …‘“ƒ¦.¼.ŚLq¢£į »Ō[‡/$޶†F"l½®”ö ™0·†‡]ąśŁĀäryVVVuuuØĒ×ŃŃ”T*ń^ĘšŅčODĖ ¹š ;E‹!ł*`ˆYŠüļ7,,Ėś]/¦?Ä ,“ośA”PąSņīŌj5ņZaa!±yį¹v»ŪZ ÅBHØ©Hö‡±¤"Œ¬a·ŪńŒÜiŲĻšĮ»‰ÓĄĻ@<¬K A–¬ØØp»Ż•••aępxŒ 3ā÷Ŗ££'Ēqeeeų¹š-†Dcc#Īß3hiiillD³ßDoiia&ØĻ ·ŁlBÓÆŪķnll~Āļ? wtt­ßr¹M]n·»¬¬lœBX:::…?F” Żn÷$†DĪų†#9VVV"»÷c 3u›„ŗhąTŒÄõŒ'ā„…?ŁjÄĄvF/‘ą} k؃~’üęR͈'š™‘| šqā’¤f³](Füƒ~Ÿl$p„ i\(Ü gUPēąXE v„jŠuŲėP³\§Óįc˜¶؆„ŚōU‰üÖB ©Ÿ?Ć,B5‹žeœX‘r‡¼“Š"TĮĀKÄ#~āx”×A ŲA¬įq:ų½ĮqĆIŅŲŲČó<Ć0ᙑÜésØ©č÷ö…=|‚6›M&“E2u‡ 4ŒŒ™°'(l†IˆĖ„2#\³ŁĢqJ=8RčzŹŅĀĪ ·±‘ŽŽ³Ł,|Ić$€ĘoŌČ<ę8ŽŒĪX=o¹\ŽŹl6coÉÕÉD£(æwßæHŽĄżĀšla˜Č™1Ԑ’ “£:„šęX]Zx†”>Y§Ó©ÕjM&“ÉdB±K&“)•Jņb¤ ī?,„ „“ÄOļ#AĀCŽ,€"X(600ˆeY¬‡œŸdāF‹Å‚”0A§"é­Åb #PćkkkÕjµ\.g§nŠžļŁlސ¤ˆÖÆV«F£ÉdB£SŠw““[ż¬®®6™L.źÅp7„ Eąć3›ĶįßÓ”1b „ŸLNbq„ęs“Ŗ›Q„QVźīī&®zü<  ‚F?q„ZdGęM}É]F“:¾‰m˜ŲõŃėźg@ØØØ Ž!ū5Ƃz`Na†”8Įüž…ß +Ū¹pčĀ\:Ø#’@č@$×"#-o,‰äĄ±õ{vĀ ‘;õ›ķ~”ĀŁč!?‘ 9°~.2žä¹ [öŪ††įUĀLÅPóÄ/zF8ńÅ$-ų]šxK°©0s,0’ĮÆ”ŽĶĄéĒūĶā(:Dņ&™?c" į.F鍫ЊÆŃh0^hśU*•F£‘eY£Ńh·Ū«««Y–­ØØą8ŽX²1ZØׯ_/¤| cʰŪ@ā^Ż`0é[–¼#—ĖżĘT«Õ644¹FųÕėõz(°`#øU£Ń ńcŒQ 撏gŠżųDY–mll$·F¤dį¶š–Ć )ŸŠŠ < ŖŖ*Pø“Ėå:ƒõz=Ft^š8CČŠ…¹“ß)v»Żl6 •—Ė僁üd4ń,lÜh4666Źd2“É„ņ‚ß³^H©T644˜ĶftĪąŅrŠV«Å9©R©ˆhćwŗp"±,‹įÄ<Ļ›ĶfmüLcŲsœ®$2™“@ę°ßóŽ-Ž6˲(AŠf³GĆ`0ČåņĄXk<dz0ų\xGĀKĖår«ÕŠk+š”„šc~†¹\ī×½Pļ&Jy$ü›ōćźÉ»~ˆšĶĀ«Õjį²a÷PĻ?ī2ćŲ‚||FĢńńȼQ8¤Ńö4ITąÄ_Z=CC˜äuÓø< æ(ĢE5¤ ,”»¼¼|ā×ēĘĮFŪ„ƒ5bšŁśŁƒēy“É„²jœĶ±)É%f?ŪMą*@*3ĘŠFÕÓō3ü ×eN H öhā)& ‰“ū5»~ż:ńēÖŌŌŠo.õ±€3‰CUO;“ššŠ©ś,ĖģŁ³'²©©©h(|ķµ×謎9ˆh ?Š:0”)((((3RPPPPf¤    ĢHAAAA™‘‚‚‚b¼‘D‡€‚bŹS‘lø”–Ša6RĢĄ„˜°2“ĻHA1µ€É¤m6ŪhźD3 £Õjżr:Pf¤  ˆIB“X,ĀņibIVNī¼e33ēĪ”Ž13sī,éē^p»Ųu¾ŻŃzĮu®½­µµłˆšWFƒ…Iā‰")3RPÄ90ߝ°ģĻ’¢‡ę-ĖĶ[:/gįČŚ<ė8u¬žąŃŗƒķm­DŠŌėõ$qeF ŠčåD“ÉD¬‡¹yK‹5„KŠV¤K˜±ŗÄ×¹cõ÷ōīÅ®óøG§Ó…©„A™‘‚‚b2ug½^O8±HSśČćkF,!F‚S͇÷ķŽImĢY»ś5eF ŠxƒÉdŚŗu+įĕk_ j=o~dĘl6*±6eF ŠŃĆn·ėõzō±äę-5l{{Ā8я+7?‡ś5֓ˆ9į‘2#EœĄl6cł4±Ä°ķķ‚ā“ŪŸ}»wīŪż ĒUuOʌēyR”jIŃC†mo”e48ė8U¹łyō_WTTB¬”Ē$f•ēy»Żīv»'±3XØ»ā~…ETŃ¢Z­F ś©—¶=ņų/£Ŗ{=÷Æo©Æ­N¦9eʱįD“É$ ъ*ØT*,ĻDß[Šń~“ZmKKKšX²é­= ó–Eg?÷ōīÆoFc±X¢ßģ“Ģˆ•QB\$¶jIšbN²ģ_’dÓ'm8’ĶąIW_Ē•žOO^ūōŌ5Ü… )¢ v»]­V»Żī4±d{7®A9£G·ÆrĖó P(l6[”“cģ1£Åb)++CN|ć§·’ėR£­‡Wś_üS7ņc ©1§D+•ŹŽŽŽ¬ģ\Ćö·¢œg§6—iÆz=*• sXPfcZ\µ$ķżUÓ£¹«ķYóū’ƒĮ€õ—)(ʐѶ˜&–¼’—æG‰æ%Br4>ZżBCb ©{hRéķķ~ZŜdŁæ$~zźŚ±cĒŌj5õÉPŒ!|šĮcĒŽ”=)‹#Ęķ³ffĪ=V]FQŹK™kM&“Ūķ^$ż“ˆx¼ }Ւ4ˆ”`Šč‡ŃhÄeŃo[ ŠbķJƶ·`ėÖ­ĒQmz“cVVüåł™Qh[ ©õ|3˜cr¹Æłb+Ņ•":a³Ł Ą°ķ­bķŹŲ½óęēźkk†±ŪķQØQÅŒĢˆß–ū¾ŸC“ģ÷_’ŌC1Zž×jµP¤)iZ€§^Ś–•ėv»£sauĢ0#z²^t[ĢĶģs”{ā(bz½ŽķvĻ̜ūŌKŪbż^Ņ%Œaū[ŠŲŲ….ʘaFžē@1'9ęf ¹ōŦ„p€õ Ūߎ!gtĢĖYørķ‹`2™š§Ģ8l ÉYö/“¤ÅŌąįUk¢v”˰rķŌ©£ĶKcUU'q• Å$Āb±ttt¤‰%+×nˆ³[{źåmP]]m·Ū)3RPP w¼rķ†ųŠ£…X˜·lIŃCeĮm”)(bC`œ™97Śņ茙ŲųŅ6hllŒ±1®˜1AZ ü'Ļ”/E Œ/Ęė Ī’ŽQ¤)€čqRĒ3&—|,ü—¢;œŗ®#åé“É%5ӊßLŹ7&H YBß“!”V«Ć,ÕėõAH6›-T`šĶf‰D~ÆśāŽĆ÷*^ĮqZ—­ˆćŪ,֖@uuu”8©ć_›„0 Ņ'Ī,)}rÉĒ©kN%’ü@ҽæe,  82Ųķvœ¾<Ļ“<&¦ƒ3Ŗ4iJćĻĀ(ļeYٹ5k"¦¢1aĘ]IŹ'SJ¦<}’RäȘWbŲķv,<Z­–2昃ēyŒaŒW £<¾†2c“ˆ“H‘É%5‰9Ņ÷0ØĄb6›ÕjµH$"š¬Ńh“X,v»‰jµ’DóŠD"¹\†+1–H$"o‚ŁlfYV$%Ļóz½›ņSĘńģ ÜŹįŠF£Ńh4ŠD¢­ēé§J@Vvnl%ŌŠ\ŠŅŅāt:)3F‡)żń“åæIYżåG?8ĪõėכĶꆆ†­[·¢m·ŪN§\.GźA£!ĻóĻ²¬Åbńł|Z­6 7µ““`³eeeų&`#ķķķ‹Įd29Īīīn!Ć:Ī­[·bĖŲäP¼:Ļ󕕕r¹¼»»›ćøX_®Žć€6øøGŗ„ĮšhHĄC™Q BJęN[ž›äŸHŠŃ P©TJ„’Hdd?˲Xč&0ū$īĒś$C6‹ŁVČYr¹\©TāžŹŹJ£ŃȲ¬03¾^Æ///_cϊUéܼ„Sd²PfŒ^łqĘ]É%'ŻūkźÅ¤£T*1Y֐ <ˆŗ3˲(ż”ū š6›Ķn·G蔯ĪG?pffĪÅ$Œ#CnŽ2øµ˜2ć˜Į×;fUU“”O&—ŌPēĢČhQÆ×£¦<¬Q,u:XŸ6”vS&qŽfn­’³¤wĢ̜ 8®–!÷¾æčęV²$aĘe,‰ē$ĢX ŹX J^ŠCŒ»’Kjś’ėߟP¾‹‹EÆ×«ÕźČ'7 w---Ā’rØ”£ASØJcAŻHēy>ś«w† ¼órr§ŌüÉŹÉ½ŲužøŌ(3Ž)ś<ƒ®£ų?²d‚“ qŽż ŅG،(…™¶ü7"hłR^„D"uĆ{…ž³Ł,Œļşär¹L&³X,~ŗ³ÉdŹŹŹ²ŁljµšeYŅŽ_ćr¹ņ‚ė\}m iJżüć\ēŽÕ¼źu£ŹŸ›·Œ@ŗAtäČóĶĖÉ=VpŅĶ S(uļņéĖ§Z>‰ē$Ģ»?Iń„H27’§ŻWž±ąFŻ ”õ_†aŌjµpQ—^ÆGHx±=$pĖ2™ ‰Œš,Ēqjµšć8akr¹\§Ó”ŲØÕjFc ©×ė•J„ÓéŒ6flŪøE¶ī™T©4’ƒŃ9§Ōqū>x}ĖUÆ’Üß:Iæ/vß·ū d7?f¬Æ­ĮŸžziĘ]¶·µbié[x#7o馏=‘0unŽ2€7&=p'®˜Q”± „ō ĻsŽēķÄ=ƒ—N£üˆ7)ŅŪ9Šņį@ˇ Ņ‚¤|c$"dāüĒ|½žž/ž}ŠP†"ÅHCCRłå¬ćĮ²,‘Œxžē8Ž8żlŽz½^Æ×cĢ !/›Ķf±X„žnd7R'„\×l6ć:œĄk¹}5ѦM_°īæ|ØaŽn•tõ/’$’!Ę4q¤nĄS͇‘ŒŅǬœÜ4ńÄ-˜Y¹öÅS͇[›|šś–™™s ŠW¹>x}Kkó‘O÷¾I 5¼åI—c¦B.¼½övøx×iArÉĒ”~¼ōå ėč€ćßåÓß9+ėži÷ż:łńĘ”™Ķń¶ēĪ@l•öŽQ`©Øź’̹i O‘fŹÖ=3»DžFró–¾ZUIˆŸ¶·µĪ̜kž¤a מj>¼¹L Ū«8?éußī(3īo½OŻĻÅ®óŲaæ³°o‘ßĖ#¹3&ż}™BQ;ß. \żER¾‘å ¶Ž»ēŽž¦Š”Õźåæ”ŽjŠ1AÆ«ėÕ²ś‰ž3Ž1E]ēŚŪZQ|ó£Åż½ūŌż÷<’;cS™ę¬ćī|’µĶ›Ź4ļæ¶ušMešMe!š7?·©L³o÷N²³ŻŃjųiį#¹3Ģ›Ÿ Ng’Z›„źäĢĢXZĘ3ćE’¹IłėStßįĒž&soĶC>Ļłšē&—ŌŠ8Ēh†\.///•Žŗ›Ž’½ägm·ō{<~?”:!›“6Ę æ|OŃ©[A>Ż·{g{[kšXy5L-1¹;S·x€(…IŹ_ŸØxāĘ”Ū?ßåÓ½5+’KjfÜę¬iĖß¼q`ĶČ.ڱė˜UņHŖTśµµ¶×ÕÅä/fóóp;Eš9»DĆ75»›Žćöu—ė‚u?ČÖ=C¶ńtŚTЦD&“)jo0¼ńQ¶ī²½ķ³¤9 ‰ŲO`Dm÷įUkV®Żš’,żžUÆēXż0åX/øĪ”±rIŃC<žĖ4±„ųs°‘§øēŖ×s“ž`„5]?x} ‘(#_ś&™|įcŖÆ„0É?yڊ÷nJ‚}ž¾W œłc˜Sē=u’ˆ™±c×;×]]pĮZŪ±ėwÓq²}ĮZ‹rپīźĀS„Ūx:m*› 51¼ŽŽ]ļ+~0PxŠŒYP¼"]ĀąĆS”µ]T½ M,1l{{aŽ2įŚlCŒŌ‰EšRLI»o÷Ø¼Ē hĮ©›d'*™s£ītĪ`€NāüĒBļūuÆė(qvG R„™0«DĆęē1ł‹ÉvŠ4˜üŲuĻąvŖ4“ČdO§MÅbSaęĘōāĀ;7mH‘ø„ėF ‰hFÉļJ—ēĀ“ƒśrVNī|8]ēˆ.Œķ@±¶ta޲YҹūvæńéŽ÷b؎ eĘ[Ā󌻒Kjś¬„„E B©Õ"ÉÜ$åżMę‘1#Bč—n³łyl~Ž­wI*xƤĀÓiS±ŲTŠY‘"ĶĢŽń 9e 6¾ÖęƓ•Æ „љ™s¹C‘yc„$l\iӃ—N÷7Ug’2čśļįiւµŅ}ÖŅ0™DÅŌC1ZeE,ž·qƒŗĻiCG…ŽŒ0˜—³ÅĘ^ßBN!„ŅÜE×yųnÜųUŠ'#<„µłńbGˆ³ŽSĒź 2ˆ(zĖ“CdŪš@w_'*3Ž}ž rœH<'AZ0ļžÄyDBŽ}5+|ŽNčóōX“Rz0Ō‘#)(ŅÕæ­{&”ś<Üõ§^ŚöŖAwÕėĮ@Ā™™s?ųüļ¹yK[›ģ’č=¢\£Õ/+;}Óļæ¶’³ąžŽ½źõ-ŹĶ[ZP“"’µ‰›Ź4Čeå°ėøš:®/‘›·tXņģä2改Ąų¼ŽOnXsż½…żMįSņˆR˜i+Ž»yāåÓaāiš[Š‘É_|õwnziH«āՈ2Å+ ŪŽ"kfŸzi[šXBÖź­\ū"r©šéŽ÷„Ü7KzǦ·ö dēµ3¤ˆ·¤č”Ą óśŚ²ģzSåžHZʰ“ˆøZ)’%IŹ'’ņׇ9¤ßž;²0eõ”VČōżĒÓńt āXńƒwnܐ±¼(ņ9+L"jÓ33ē" öxÜõµ5W½ī%E }͘*"+;· xž"T“Ļ:N]õz0®š¦[&;7]Āąž4±d^ĪĀ›xZü¬‡ĀŸšąaõs™V”PLīĮ)Ɍ(-K ¦­x/Lj²>ėĻ1aOBÖżÉ?y?č1gžI¦ ʌ#˲n·ūżæüm*(ąū*·<ÆR©&7Ņ{źĘ3ŗŽöVß;xéĖP$åoŁžy(ON¼ūé L1N@'L{d*mÜUųÉMĪ85˜1Y’ -^Ś„ĻÓg- evLž˜XĪO$!JaFõMA3¶M-fÄū _ē‡2㨐˜óhņϤ®9•\ņqrÉĒ©ė:’Kjü)²ĻÓg Y˜-QńÄMft|*‚‡–Ó¢WfŒ0p'n€žʌć…iÅoN[žæPķéoVæ Œ:aĘ]„ųĪ~N™‘b"ekó‘(q×NŽÖ™L6¹!;qĖŒÓŠß ³¶/Ił$żMęP"į· uˆĢŒ 3ī¢!ßć¹\®P(@J'īņ¤ć“¤ahń&uŽW.Ļń#Ēą­Żņ±ų.Ÿ©PĻ I)ĘQl źŠ„0D_ŌŪśĪ14-ÅųĖ9«?0ź³ŽS»Ī3 C™q¼dʈ4 ą&”zhfü®ųIA1VP*•2™ ó*ĘżĶā*Ęh ÅųdĘį֕&µš…0#)¼EµiŠ ė«›ćXˆ•Ü/eĘ(ŹrØ((ʛ[›ÄwųN}mĶUÆG&“Eƒū%>™1̲!|žĪ`äųßĮ…Š[Žē N˜Hź²RPŒ X_źøx1øÉdŠ’žÄ!3FXų4čaAéRØ/‡RØ)(ĘČõµ5ĆM›+Øćö]ģ:/“É¢D•ŽSf<óɐ%]’T5¦ÄGĶb#)8Očńøń¾¢G`Œ=fäæś >O߁5a’0^ś²ļ?‚’óõzF ƒSPLŒŲŲŚ|W‰Ä>Żū.Z£G`Œ%fT©TpŅÕÉĮ¾Ė§ū¬„A†g’Ņg- UÜ ‹Ą¦”ÜÓ4p‡b¼ÅFƒĮ€bc<Å6žuœĀŅÆf³9Ŗ:cÕ:®ōĆ":ÉQ”± qŽż¢ŒŠėńy;Ī|2Nś²H2'TĖ-}Ą0 }½)F)6r×Ńѱo÷Χ_Ž7U¹ły”{¢$Œ1ö˜Q«Õ666~zņŚć鑟å»|ŗ?„JY!i~~K?x€Æ×3x)äU>=y ¢c)(EōćŗĖÕ²śÉY’XeY³Ł\RRņéŽ÷ ŠWÄJ¾0Ų·{g{[+Ć0‹%Śś39½NgVV8L™²é±$źf—»Īżļ@UUUT™Q(¢żOŪĘ_ńMdzw¼’±¼čXńƒ²uĻĖ“ ”×ė«««ÓĒ÷’ņ÷X©ŻXÕ¢óՈ;£\.GSć‹źŽ”Ēæķ€ūÜ’D›uyjĀétNni?6ģ¬Žū峆ž3Ž$‰„o:>ąõ^u“Ą]»Ģ”hĢf³B” 5c\ē^}~5čtŗč|5£ŹSJ„ņŻwßżĒÅ~Łæ$*ę$G‡[:ūt–+8›'=ē‡Żn/((ąy~rķY=g|–=uĶ}m0_ž’:MJ“Īr„· ĒqŃłUœ:HMM•Ėå/æüņÖ­[Õjõ„å‹ī÷xRRē-ūść?NĖȐ(]w¹R„™l~Ž÷ęe±łyå¢!KNENNŽ\.Æ­­-rō£ÅœœœØķjŒ1#hµZžē;Öäģūą°÷‚g0uš(J|2-}|ŃóōŽ+’ß©k Ńh8ŽcY–rÓ$ĀétĪž=[©T¦¦¦Śl6žē|šĮń¾č—Ļ’öŅmó²Ņēē\:šYBJŠD±H¢\”±¼hęOśŽ¼¬Ń_B©TĘ9śŃb”Ū—D1ZŁf³éõśŽŽŽčģžL&3™LŌė2Yąy?HĒ™ĶfR¹Ųl6[,–qņĆtVļ½`­•­{&cyŃß“]u“Ķ*y${Ƕ~gd‚a$°X,eeeP¤)5n;&h‘ćøčb‹ÕuÓØV[­VN'“É¢¤W Ćh4šŖŖ*§ÓIiqińöŪoĒ9–eyžN›––§Ó9f/üĒWƾĪ75€kĻŽ«Ž¶+uõpē¦ łu³wl€ń£EŠėõUUUP_[cųiat.9ė8õō÷i1&b{cUf¤ Ї‹Åh4ŗŻnƒĮ`6›M&“Åbq:6›­°°P8Éår¹Ńh4£¹čåCõéó³S„ŅĆy˼^éź_ܹ鄯­µĄę/N•J'x8ŽÓėõn·;M,ŁōÖžØ ß’Ń»˜0B&“q+A”)bČzv»’gYMŗjµ_?„R©×ėÕjµ3F§ÓÉqÜpÆŲļń x¬ųĮ^W²įWƾŽļõĪ*Ѱły“; v»]«Õ¢}iåŚW®Ż tå–ē°č•J„Š-›;eFŠ˜ā !ĄŻwߍ3YÆ×ó<ĻqŠQN§óöŪoNrŽćJJJ†;ķæ|Öp„®aŽĘ st«¾|ÖŠćh“®^5G·*ŚÄg½^_[[ 33ē¶æ=‰ĀćžŽŻ·{ēUÆŹĖĖcĪÓK«PL2Fę¦ÄSär9ŗhQT*•6› ’ŌjµJ„20ƒ FzG"3vVļż›ö±Īź½dĻU‡īśmå’ŗĻ¢æV«•a˜‹]ē7—i·?æś‚ėÜwćTóaĆO ?x}ĖUÆG”Pœ8q"ęh‘ŹŒQ!éÜ~ūķV«uø«SP$Dæ3źŃf³Y«čt:‘@…N”7CqqĻĒk-“ŸGüĖӋ ļśmåu— &Ž€8ā!5ÕÕÕųg‘¦tåŚgIļ˜NÜ·{gkó`Ęh4Ę"'Rf¤˜-˜°‰­Q*•ČkO”)Ō‹…,)„ÉdŚŗu됓üņ”śTifśü!ņMĶ×]]Ņćź\×”6ųē’¢‡Š5„ćöˆe’öō^{[+īŃétf³9¦#y)3RL0aRCCśIL&R”Łl6›ĶZ­¶²²"N¾"6Q<4z½ł[ąyžHŽ~č÷xś½ŽT©=*{ŲY½÷ŖĆ •14V˜Ķf4>ĄĢ̹KŠ“$f=wkóį£õÕ@{"r¢Édš°UF”)āå˲,ĘÓ`žj½^÷Żwć’!“Éd6›żōßPĄ„~ŗHœ³Ęd2…<Ń£BüĖ—ė¢Š£2¶ß$Œrw»o<¦‰%¹yĖę-ĖŹÉœ%{<īö¶ÖÖęƧš£ÖŒÉdųYŠ›_”)&śµX,&“ _!b”Ėåz½Žd2”$ˆr吭”°aä6®Qaó߹鄶[.X÷£œ8Õ¾LB‘D–œ)›&fęåäž…„®Ū­D6$„ØÕjõz}ü„’¢ĢH1A@ƓR©¼ūī»ŪŪŪY–E…ŻÄ$ŚfĒHxEŐwSó•Cõiósf—hPNLĖÉž÷ĒŲņ،0£A‡µŹV”PąšČÜ”)āP‰CŽC7%”p .\AÅŻ)ŻŻŻ,Ė’,C¶O|8Bō{<|Óń$‰˜Ķϲa¬{Tʛ(yžĒ’• 0UFÄGA1444(ŠšĒTTT444ų|¾ööv(//÷ł|ååå*•Źēóét:Fćółŗ»»Äm«ÕźółNœ8ķķķAļīīĘõņ …¢ŖŖŠģæÖŁy­³ÓēóŁ/kĢ^ŲŗöyŸĻ÷?ę/o¾ō×:śą(†éM1<(•Ź––æHižē…EŽģv;jŹr¹\”PX,”p§Õjkkkq毖eŃƒ—Ą5¶ā'Ęoc¦%rhŪø„©ų”Æ^Ż Ó‹‹Ņr²S„™0»D“½c[Ęņ"śą(ØĢH1¾P(ƒ…»'NąNį\źīīf:†a ƒĮ`hhh@™Q(VTTČd2"i’m«Õ*” ƒF£©ØØīŸL&«ŖŖb‰R£ŃfЇķķķ ŻŻŻ”.}ĆķžŸ?sh+t¼¼¹1{įŃ¢|>Ÿ÷ōj@¤ ĢH1ö°Z­åååååå~¤&„N§C"“Éd Ć 9Źd²ŠŠ ŸĻW^^NäGæFd2aCįv$ā!ńØ“®}¾1{įqĶ£(3žsūkŻĒšč³£WPĢŌ…Z­Ę®N§³°°x$G‹Å‚å›1fp€ļf 4 ^>Ō0ąõŹÖ=ÓY½÷ģŽ°“é čq“ŃŲC ʌ±»ŻŽ©dår9֜Ćņ¤AęŠH$¬ŠŅsĘqŻÕ•±¼HȆż^ļėžéŅéósčŲR„~’yžGWYą•JX>“ęRf¤˜`]ę!'–ż»īr„J„»ŽéŲõN¢X¼¬łpĻĒW;vN/.š]ņ µ”rqg³ŁBń`$P(hķæ* ”)"Å×ÖZL€ˆlŲ²śI6ń›6Låš‘¢Åbį8NXYafęܬœÜy9¹YٹiffęÜĄ¢Ų\ē.væźq··µžu“¶;Z/v'æ2 £ÕjCi9”)Ę |S³«zo£mIŻg—՟^gL‹Äż²!E„°X,‹…Hˆibɒ¢ ó–ęę- äĮHpĮu®µłš©ę#Āj® …‹Rf¤/ GåŖĆ‘½c²!ÜcżCśüœž3j@¤ˆœM&—=T¬)-(^1†—8ZwąhżĮśŚüS&“™L¦1įGʌ7ŃsĘĮ7Ÿ£[õµµöłu“Ä⯭ūŁüŔ)"–£@NLKyü—EšŅ‘IˆM]ūÓ½ļÖq5Øh ?Rf¤„čHŸŸćmÓ¶ńWӗŃ2{ƅÓé4µµµ„^õĖt 31WÆćö}šśT±U*•Åbq±CʌS—Õ·müՀ׋Ń6Óž,cy”lŻ3Ō†H1bõŁh4ŗŻnxx՚•k7L'śÉūvæ ƘL&LB:µ˜ŃétrĒqĻó---“Ū™L&—ĖÕj5‰ŽŽB G…o:Žžåæ—ü,Ešy×.3U–)F5ÆxŽh4VWW@Vv®aū[órNb.øĪUny®µł ˜8jJ0£Óé4™Lų$¢*•Źd2MLHź@Ź•ŗzŞ‘ `Ńžß±łyŌ£B1z`y[MV®}qåŚ Qұż½ūĮė[Pjį8nXņJL2ćw„ö…·=¼č6Łō¤żAźäöŖ„³ļdgßž³wﱫøĒ`0 +qį«gWźdėžńó/wVļĶX^HUfб¢EµZķv»ÓĒMoķY˜·,ŖŗwÖqźÕēu»Ī3 c6›#wĖÄ3Z,–²²2øļū)ﯚ.›žm=ģøŅ’⟺?=u t:]`fĆń֗ŁüJDšø7—iŪŪZ@ø¼5®˜‘Šā:µųŸŽĶ]żčhϚߒļp%Ē~FĘ_ø.eĄėÅh›cÅQ żŒ¹yK7Uī™xg˰`Žü†=FHŽ±ÄŒN§S©TŗŻīč§E?rlhhˆŠęų7ķcRŻŖŁ%š/qŻåśźÕWź0ŚęHž½)ŅĢģÆŠ 7ć ̽EšRćö·c¢ĻĆ"ĒXŹĻh2™Ün÷}ßO‰ Z€Ē ŅשŔ߶qĖUG›»©yH¹²c×;-«Ÿ@óJ]šMĒ“$’{¬XR÷„EŠqŗ\b‹Ąøżķ"M)”••‘F1/3:Ī¬¬,8śŅlŜäXyü7ƒ9&—ūšĻjµ†Æ°Ü¶qĖė~Ą6Ašjjv7—­{†ų—ģ2g,/śŚZĖę/¦*3Å«nYٹ•jˆ¹ž£äČ0ŒĶf 歎™9ž¾ļ§Ä-ū½„Ē—¤“žI‹0ąõ^>TOÄCÜī9ć8¹śÉŽ]ļ\>TŸ>?Gŗś?Üń ›æf—h(-RL“Z-Ņāö*.ū’ŌKŪ²²sŻn7¦©yfÄܖ/ŗ-ęžö™”Ł Dgõ^B‹ˆ ÖZdĆ#ł÷ž^gÄØĆ“œģY%¤J3ąĪM/Ķ.ŃPG3ÅD+¤FcKKKšXbŲžV”»\B!]ĀlÆāŅĒŽŽŽ0f®˜aFd÷Ųh)LK'Ä×ÖZ\°,ĕŗdĆD±8EšyŻÕ?āž˜½c ̦˜D½­²² ŪŽžÜ%.£'ĒMoķ€ŚŚŚPq#1̘ßMö/Iń4ÕHV›@ō8Ś`IŻĮ%uŸŃ*ĢŃ š „õšŖ5c›IlR°0oŁŹµ/€Édr:1̌ˆ(ŒėłTkjE‹põŒFŲHA1ęĄČ™™s£gńß(±rķ48M9A«ŖNzĪ8¾|Ö–7ÓQ¢ˆŲķö›zōö·cŌ¼†ķo”Nč Ģ89H’ˆeėž™^\˜"Ķ .3:Ś®»\t (¢(U-)z(Ś–Eórb„c Ų3ńŒ"‘®½naf‚“ĄoĻ ėh4tž¶ēĪ@Ø”¾īrõœis75óMĒÆ:ھ}l7ĢŃ­¢Æ%ÅäĀf³Ąūł[t®Œ•öęq?żĄ=W½æ…1qŌ©ė‚ū/}éóvś.Ÿ¼tzŠuś™ü“÷Sž>9­ųĶ@œbß-bĆV«Õ&“) ævćžēÕjuą ‡ū6z`få į ± ÷לV“Žt ƒÖFalćMf“X,dfŪl¶ńH)Hšu:aåLčūœĀ$Ī,¹äć”Õ_$ęa cœ¹¤1KzGnŽRä7øÉŒ---$ķ„ŻnO¤YŽćŠG®Õj'8ßu„üHõė1Åb1›ĶjµZ$‘m·Ūår9˲dĻóJ„R$Éår¤0“õFœ'‹…eY¹\. :s:jµ Čn·“ßo™Ÿ±qŁl6“É$œĮf³Y8Åyž·Łl~A’ų>>9«££C©Tā~–em6„ŗĮļZ“ĖÉ%'ŻūkH¦ėOF§Ó¹~żz³ŁÜŠŠPVV†,f4ŃHf²¤ĻēÓjµ6\£×ėõz=²V1U āäį8®¶¶$ÖŲ؈ ڰ #į/<Ėh4Fnplll4‹%°3B†­®®qućčT„ń ]RōŠT˜®KŠV Œˆ5g°B” ³Łķv+•JņģqĀ”IŪétrĹ嗬?›6› æö˜ŹĶétā)J„F¬ĮHĢI~×1|½ī±¦$å“)„D (Į*•J©TŖÕj™L†ŸRdųnl-~•µZ-֟óR©Ä £ÕjY–5B-„Bü¬* üB766 Ó§+•JńČN½^ϲ¬Z­V^“ɤÕj;ƒķ ˆ “É¢¶šī€ć93snū^„H—0ØPć'ł©ĻN§“aüŒsGę“ŃhŌjµØ;†ēy»ŻN‹Åāt:QŠ~ö…^ ē–ŁlĘNą‡wō5H{ß_ō­č—±@”"‰ēˆ$s¤¢Œ¢”į­jIꦔ¼qčߟPŽ%PÄĆ©HĒ™L¦ Te³Ł€Čü$r*¹8©Pk–ĖåćDOxŃĄĪŅ'šVœ1ć ó–µ6į8NÆ×'ł™iHž[$G|Ų<ĻWWWwww£ōg±Xxžw»Ż~ö4ń śŒßóĘĘF2w±Yr-! Æ5Vš]>ķ=(ĻI$Ģ»?qŽ‘·3młoD śæųwŹnćgĢ":\khę#Ŗ‰õPGʉ„ŪBŁpœŲµZm³Ł„/Q|åńø÷½‘›· ą ¼ńT@Œ‹„ŗŗU›ĶĘ0ŒV«E-Yaį,äy¾„„Ål6Ėår¹\n49ŽS©THØV Æ%dFįµĘ>oē€ć“Ö\oįC’6xéĖČ5ėiÅoR „ъeYœ ~6‹Å¢×ėC1 kź[~‰‰C²ŪķBnœ$ߥĪLĢ„'˜÷/+'wJɌŠŃŃĮó|ŖĘBfÄOŸZ­¶Z­%%%DO1™L䣖P@¢ÅH.œ1Bż}ßBĻ£Żn'*¶šZ£±a‹2¤”_ÆŪwł4ų<>oēą„Ó¾Ė§}ŽĪ›ĒõyŸ 8>I$å¤?²åÄłĄŗ(Ē…²'Śl6t­Ųķv•…³ æšjµZ©Tbż ­VK"iQśEŗą~µZ†é Ž^TØńrJ„R–ŲԘŒ!īxræąÓIK†ed¼ą:w¬žąUÆ;+;wLr8Öqū.vŸ™9·X»Ņļ§³ŽSĒźāvVvnnŽ2’ˆtŅÄLnŽŅČóģfeē¶·µŚķö›ĢH$»ŽŽBgH‘äį'1”UÅOŠ$ꙸčźA?š`r­Q1cŠäÖ#B¾ŌGńyĪŗŽœżœ, tķ³–&H ’īżuŒ»†$ĒA×Qjs āC³Łlr¹œ|5yžĒ'‹®øez6„ĀšO W j4ā¶éG|jµzżśõ8‘ŌjµÅb œ?hēy~ō‘z½>°3DŒņgŌsĘĮ70G ¾õĆßmó§{ß»„–.f¬­im>’›·4?x}KkóņgšX²é­=(ōÕ×ÖģŪż†šą‡W­yśåķ1cNn{[«ĶfK"¦eüōét:¹\Ž”ĒÉd2ŌĢf3‰‡@'µŸUE­V3 c6›14]x8¾f³ ‘hŠø/źw­ń›"ÉÜDÉÜÄłł<ēŸōŪ?ÄŌƒ®£}ÆHŹ7&åÆŅęčóvFIžžØśmm6›^ÆN „R‰uˆˆmŽĢ²Ź…„%×½`k$„Ż}®”ŽNBņSCCOā„@iØT*"­{Gš Õņj„:+ŠļõžŻ±Óµgo$åČńAdeGʌūvļDZœ™9w¦tā"ĆgfĪ-֖Öq5»Īæśüjó' B!w{WĒÕŌ×Ö|ŗ÷½‚ā‘ōj–tīMš\.///Ēz`:ŽćP|#”Ž„Ȳ,*,Ė>utI“@nŌ¾Q '3ž|Žu:Éd²Łl~ךˆ$s“ņ×'åÆļ·’®æÉŒüŲßd8ūł“ā7Ć ÓV¼×[}ļÄgė‰~ é-؜j0’&Pēš ¾ zQį<ō›“AO,<€–BhD ՙ Ż‹N)²×Õurõ“Ó‹ ļÜ“aȒ“&©ķńøQF[RōŠę·öLäķĢ”Ī]¹vC‘¦ōé~tÕ멯­¦_˜·,+;·¾¶Z›GŒ33ē"•%Įwćųɇ1P(~ƒ²FŸ ’ō³ļl“KLbtw’ņÉÄłö7™Z>ßåÓ}ÖŅ䟼Ęņ(Ja’ņ^Ÿµ”Ra<Į(ćWź®Ō5ČÖ=#]ż‹ 5H0c$­«?€O½“-€1wÖ×Ö\õzŠ4„O½“-]œuœśąõ-xš¼œ…›Ź4P¬)%śr·ļhżĮ«^÷#«~)TÕėkkŅČaūہ7KzĒ’¢‡ŽÕ<Õ|xeXŹ‹€joŠœISü•„0Óī+Oœw߬>ōyś¬„ӊßD—KP$Hœu’„e0‹i)2VœS»Žé¬Ž{ē¦ ³K4įi"BN©ÜüÜŸ’=°órrÕZąTóįż½‹} “T!6ŃÉ.„ō@߁5čŃFtrœ¶üĶ‘éŌ|S3¤ēd'I$=gż^oŖ43U*Åķ$±8}~Īu—ėŗ« ·ū=,"Čęē‘m<=ś›ZkéMÉńŠ ¢’9”2‰Š'ˆw;r0ł‹ I,Ę/<`…,Ü&{˜üÅø$ć)Ām<6E›VS‰bq˜™‰6ĒŗA2ļ8rŃuž»‚äł`Ņåł0z{[+ŒtÕĶ×yp¦Æ\»a%Ą¦2Mkó‘}»ßV Ń0Ŗ`lv„¹›p 5/ p¹LAµƒēāŗ@iA™Ą×ėī«Yaį$t<(ś›*ś›Ģ‘t€V; ˜tšMĶ(o~­³w¼āē§ĘŚ/Ū«øHxj’Gļ¢SEX‹«ĄžÖKšHī ¢&£’‹“ż+×nnc#Hj¹yK_­Ŗ=Õ|Xx¢š'xźž{.vĒb5~—öūs(›éįĶeZ•J5 mšćøČ׏3Ēąt:',»ēĶuu/\oį’ŚźóœĀ'³ā=LAę»ü]!ŌOl¤in)b)ŅĢE{~§Ųóįį;įA²N¼ś¼ŽX‰ņ{Įu.p'\õø{<ßIŽ…šoWć·HąR(–’⬣"öMÄĪ8¬l"ä`\ĘH‹YYY“0ś<-öÖ¬Ćw€…bņ·Cs(&Ię&dŻO_0Š˜C¢X?gČ#ńÅD=4rr\¹vzQļе+só–a„ö’¢‡ˆ Ņøżķ…yKÆz=؆cΈ›bććæ|äń_¢“ø0oYVNīUÆeϬģÜķUiܰķmŌ ÓÄæ ž"M)QŪG–y7$3ā²h\Ģ_YY‰#Ć0øŌ3cŠF Ÿ’Ģņ~©Ęjkk…µ\Y–ÅŒ¶00y- ^:ķļJīóōYKSJˆ$sƒźŌ‰9b ‰~ū‡É!ĘŠØoŠ˜›ŸĒī‰4b_[LW9Ņ%ŒŸĒf–ōŽ Āš0ī:¹H#BŹók|–ōŽP”ę§!qź–Ģ\›nll$KY†AŚ1Rˆp%9‹¬˜&fT©T˜¾)P1GcJĪ£)«æHŃN.ł8¹äćŌ5§’Kjü«_õyś¬ U&!Qq3hq°żóPŖ7-§EĄ×ÓoIÉTĘgF”I‘,ĀqhUt»Żø€šüD2wbŽ=ø_HIBLNV^Å|¼,™¶ā½iĖć' &H|³śÕwÕźPĮ7 3ī"Ä7pösʌSEĄdY‰Ī:NM»¾ą:‡ŗZ­Œv»Ģ’R©“Łl*•ŠüD“c·Ū9ė1ójŁĀ’„˜Ł¬±±Ńn·c†šq]Q;ķ¾_‡)i¤|’øžo²^ˇ”DBš*3cŒ»h•AŠų¾ŻSJllw“¢‚ A}ӘĮn՟ōsæ¹²±±‘°›L&³X,ØJ÷‹Żn'4 o×x«Ņ‘Dt'寉ē÷„ēŻODː õ Zb">™ńTd;ń£õ‰0„QÖĆ,¤Xuˆ˜qR(„ģ°“9įS?##Ö_Õjµ$±s˜tx£1qŲwnŸµ6ŠR¢/‡ŹYKjŠų•§3āĶā'••J„ÉdÖ>ǰD\Šb6›Ķf3-ż˜ŽŌo#IØŠiī!X*Ó1—GvŲĄ™O’”O=9qŠu4ø4JµiŠøƒR©”ÉdGėŒIé‚(ĒYĒ©‹]ē±`fÄXæģķĀ„/„‰FŒõó3n °ŲōųŻįpėJ ¶!˜ńę—OSmšbź@«ÕVVV­?8˜±Ž«[©‚hÓØ8G€łĄ'1/÷"”²LR“łB0#•)ā(Ó«?0܅̱\D’Qķ°-¬j„ÕŌ¢ˆą"+$ķót#Ē’.„Žā¾ N˜!ėRPÄ®B}Õė!õ āW`Ü'T„ƒ0£^ÆVk t@GU4^ÉaAéRØ/[“š‚b _~EJćkkČĶgĘ8ĄĄ™OĀēCŁ0ØīL‰‚ĀOTbęb׳:n_¼Žć©ęƶ)T—cŒło‡>(ģ‚?T·ūžcMp»7DŽīoµiJSÄ_Ēbć¾Ż;@§Ó ­‚1Ì4~ŅÕÉĮ¾Ė§ūjV5œłcŸµ4T•ßPŽēPB„_Ü8E<)Ōq,6Ń/ĮMŒÕéøŅ?ˆčHŸ·³ĻZ*ŹXH±ōzĻ~>Nś²H2'TĖ-}€Y×((bTlÜŗuė¾Żo,)Z‘.aāéī*7?ƒĮĻ3ĢØÕj?=yķń‚ōČĻņ]>Ż*Ō&čńžN"i ³–‘tƒ—N{€ĄR9x)äUö» ‚šO ŠX-KGGǾŻ;Ÿ~y{<éŃč’̈(Š•²M¤@‚Ć”)›3„Ī3˜cr¹ÆłŖŖŖĘ{ńÅųćø’’øU *īč‚ėœńŃĀ«^OEEEąŚ“˜±3Źår45¾ų§īż]6ÆūšO&“QZ¤ˆihµZFƒźg|~æś¼īŖ×ƒ©c%ß4Z~zźŚŪ ž˜čšžŸėŪŗIĻ)(b‹]1XC5¦ńžk›ŪŪZ† µ~/–˜Q©TVTTĄ†?óķ‰~ZüŁū—@§Ó‘Ąz ŠŲ˲X/ƾ¶ĖĘ(źø}Ÿī}nå|zLāÄc+8Ī–––OO];ŁŁ÷Ķæ-uš(Ś:É3ųę_=k~’æ½ż P(jjjRSSé{E@illüūįś¬ģÜ9ó~s·pÖqźĶ×Üčė5 /æürØĆbŒį֒ļĘĘĘ\ģ’ą°·ķB?Ģ'FEžē’¹¾Ėę]óū+=s„ښšI¬HA1ęP«Õ(üżpż=÷Żž1+¶hqs™Ķ‹555aŽŒß“°vccctvO&“™ĶfŖDSÄ®»\|ÓńŁ%įN„RŁŅŅ’&–lÆāüŠšF?-* ›Ķ^d‰Uf$üˆÉ~ZZZ¢„ÕjµV«„œH„˜*•~m­żĒĘ_ĄŅ¦/’$ßfŪćy^­VĒ9‹cž)((Ę|SsŪĘ_õŗŗ–6}Ńļõ6?4½øšĪMR„Ņļ& ǧ^Ś&,!ė“1·:‚‚b<ŠsĘįŚ³—o:¾¤ī³$±ø×Օ(_wu„ĻĻłWĒÉ §°,‹D[ZZ*·<Õėyäń_Fį­Õqū*·<‘Ó"•)(¦“¾Ģ7ærØž®ßVöœqü½äg°hĻļŲü<¾©™ĶĻ‹°½^_]] KŠ2l{;zV÷xܼ¾„¾¶4Åb‰ÜJ™‘‚bŹāåC st«.Ŗ?½Ī÷X’>?§c×;Ӌ Óē猠M³Ł¼~żz˜™9×°żķhX>xÖqźÕēu»Ī@yyłpƒp(3RPL}9}~ńØ ¶¬~bzqŃģ’G„Ž•‘kÓwtt@‘¦ō©—¶M–šŲćqļŪ½c¹†į8NXć2#ÅMNür±×Օ_w0I,>’ļōāBŁŗgF&†Ļó&“©²²ŅĒG’åŹµ&ųfėø}¼¾åŖ×3 š2#Eü«Ģ»Ž¹|ØaIŻA8’o¢Xœ½ć•ŒåEć}i›Ķ¦×ėQxœ™9wåŚ'&«c·oßī7P}}@1eF Š8AæĒóµu滩9{Ē+m?ÜńŹģͰ<*c‹Åb2™Q~,ҔΒŽ1ęŗą:W_[SĒÕ '2 c4G擏2#ÅH`·ŪFccc£J„ā8n׀öœqšMĒēčV’ņ‚]ęŒåEÕ{ŁüÅc®2K¹ę8Žš#äę--֔ęę-=EöxÜĒź­?ˆu¢ 'Ę1y”)(F„R©×ė•J%¾Š6›mā 1}~Ž~ł¬ÉĻĖX^č•=¹°X,ĒÕÖ֒=Yٹ¹yKę-ĖŹÉœ%/øĪµ;Z±rK{[+ŁÆR©ōzżŲ¦@„ĢHA1Be›ĶVXXŲŽŽ*ŸÕxpbĖź'¼^ō/+~0='[Ŗ[5Įśņpįt:9޳X,kysó–@ØXŸ³ŽÖ«^7Ö±B”Pčõz­V;#O™‘‚b$/¹šm‰D # ‰×]®Æ^Ży„®ŁšpŽ2øsÓæD±ņQ±Łl6›Ķn·7)ŒJ„R*•jµZ­V«ƒ®¤ žˆźó¤ļCŹ•ŗśģÆ$‰ÅWź€o:ž>?ēGÜ¢J_X–f]q ōx¹ÖIʌCėC”ŹĢ²,ĻóBłĘ“6dĻĒ•ŗéź_ĄŁ;—¬,ŲeN•f¢G%vi1ńE[Æ褧  £Ń(‰X–µX,Z­V„R9Ńn·“Ćl6›B”½fĒ75÷{<×]®æ—ü¬c×;—ė’$éź_üpĒ+Ė  cyŃ$:š§ØĢHAń-ģv»Żn·ŁlXa¹»»›ć8£ŃØÕjĶfóŻwßčÅ|3£¹ču—ėoڟ x½č_fņ§J3S„™p禗čC”2#Å$«ĢZ­Öd2)•J›Ķ¦T*Y–Õėõ(6*•JƒĮ`2™üx©ó¦Ü'вãßćłņYĆę,ŗ|Ø>U*M’ˆS¤™ż^/(ö|˜½c[”;š)3RPĤč“ˆpx`B¹\n4år¹ÓéŌėõhXDeŁd2”DINĮe¹H©"‘Kė…aĆĪź½-«Ÿč9ćH’Hų¦ćpÕŃŠ=æ[R÷Y,:šć> ŠøC{{;œ8qbø'j4•JåółNœ8åååŻŻŻĀŖŖŖd2ƒĒ€B”ØØØu9ļé3’Üžš÷ōŸĻ÷Åā„Ł oļöł|—žZw­³“>¬čµ3RÄ0¶F.—Ėd2Žć†ė2Öjµ(l*•J™L~®½^/¬Żn6›Ces¹|Ø>}~vŖTŠkTR¤Ņōł9st«R¤™Å7=*ōyQ™‘‚b¼ÄC†aP^3 ƒ÷ …BQUUÅ0 9`X¦Õj«ÕŚŽŽ^^^NZhooooozś ·ū†ŪMdĆó–|>ŸćåĶŽ—7wk¢+†@ķŒ± ¹\ŽN”ļ8ŽC±N«Õ¶““ąŠ],čak …„B­V[UU…‹£…‹^BÅß}ł¬įHž½—ė Uš™"ĶL’ˆ {Ē6źQ”2#Å$ ””įĉ ƍƒ Ɣ——×ģˆĀf„×=ołčøęŃK­ół|Ē56f/üēö×Px¤…Ś)(&z½Žh4:N\ ‚FFāJV«Õø@ĶŽˆI›įč9ćø`­¾¼ˆĶĻsķŁŪėźŗRWŸ±¼čĪMR„™ø:eōÅ(&T›¦ˆ1Ųl6³ŁŒŪN§“ēy­VĖ0 ÓhµZU£ÕjIV«zNĀ@©T’öż<*×].hYż¤kĻﯪ€;7nųįŽWīÜøŲü¼xZ“G™‘‚b’a6›ĆKj<ĻFŒ£v:ėׯ'ō‡jµš0#ÉØV«Żn79 „„%L$6Ļó‹EÆ× i±ßćé÷xąXńƒ§×]Õ{`ŽnÕ¬’G¦//€ŒåE³K4TB¤ĢHA1öĖåÕÕՁ“E’Æ kćiär9YĀLĀeˆxˆ TpŻ)øre`$¶Żn7›Ķ˜ŲŹétbRhü =*_[÷@zNvŠ43E*ŁŗgØG…2#Åøé …;Āče&ĒX,–źźjäJĢv# W$ā!˲FØDéW¶U„Ri2™vķv»ÉdŹhiż›ö±Īź½ä°«ÜõŪŹ%uŸĶŃ­¢kŖ€:”(¢F§Óuww@UUŗ›† <¦””A„R544Čd²ņņrō>ū|>…BĮŒ‡(“ɬVė‰'H„c`č"ntkśēöׄžåÖµĻū|¾kt õMSPL4Š‚rŸZ­6›Ķ,Ė–——›L& ?t»Ż~ęȬ¬,üI­V+•J»ŻNÄF¢PkµŚ'Nš<¢hPw ¤’ólϵėéós¾zuēUGŪuWś—Æ»ŗp u§LePf¤K ’‹:/¦czŒÅb‘Ėå%%% Óé00{żśõ˜ Āb±˜Ķꡔr¹¼¼¼œhŹH”Bf$šxØčœ~§ßėM•J?ŲėźšUņHöŽm³J4WŽY% ÖC ŖMSŒ1ŗ»»†Q©Tååå*•Šaį*: Ę&‡Éd²īīnŌ||>ŸL&«ØØ z4jÖ”.VTT ź Z×>O"±’¹żµ£Eąź= Š@Pf¤Kc2ŁV( …‚aÜCRŚų|>N§ŃhüŸ I1č—»ŖŖJ§Ó k ²”ćåĶŁ /o¦‰‚2#ńBČn(9¢ (“É|·R{µ··c¢< ÅF"?āĀ>” G¦Ó GåžĢ9ńøęQźQ”b;jĒétbŽe–eEQµZm4…EB¦ōz}KK ŚI›Ķ†,ĖŹd2³Ł¬Õj…1Ų`·Ū…!‡Ć-Ī×ļń\>TĻ75€«zÆkĻļ1*[Ŗ[õĆÆ(öü=*Ō©BēvĘööv•Jµ£Ša%SócĖ0LEEEEEŚ ‰ŻP&“”®ÖF…BA”bbjD%w¢€žZ7Ünķ—‘h›’ł3ēxy3FįPPŒ 1零X,eeeøżšĀŪ^tŪ¢9Ɋ9ɓ۫Ž+ż-®¾OO^ūōä7………ƒ!TČH½Ģ*•ŠeY\“'—ĖŻn7: …‡™Ķf›Ķ†e*±”3Q0wl(“mÜrĮŗzqį]歜^\ŌļńbU©Ł%Z6€b”į;¶ōµźźjøļū)ﯚ.›uäĪ3øż {—ĶKBR¦Ō”²X,d³R©T*•‹-ĀÅyv»żī»ļV©Tø>/pŻ4F,ś}Z:«÷^°Ö¦ĻĻĪŽ±ķ«W_wķł=“æX±ēCś&SLif$Ņāꇘ-+˜hīźGG{Öüž§ 9ņ<ūķ·[­V\™WXXˆłĮŌj5fµX,hĘZTAKY9N"oņMͬµi99st« Åāe͇1×Ķę@1ՙŃét*•J·Ūż“čGŽHSgVa‚÷ˆ“ˆ “QF QÆ×cdx` żĻ?’d͘;7cyjĶ)ŅĢ%uŸõœq\wu±ł‹)!RPfüŽ}ß÷S>7̊•>æų§ī]6ÆL&#ic¦Ģf³ŁlĘ[FeWžłĘq\IIIww7ł  ¦J„_>køRא–“ż#ī|Só•CõL~-)EA™1ˆĄ˜••SfŚCŖ–ß ę˜\īk¾)%6Śķv½^™oĀėŻ˜CMŁškk­«zoĘņ"Łŗgč[J1ńˆ™xFŌ¹īū~J Ń"°ßKx|I:é’ŌѦķv{xZ–e½=£ķ§„_>k€”›uÄ0»Dó#ī”)& 1Ć2üš¢Ūbnˆ^tŪ.›—d ¤@J’X|禗 ×ÕÕėź€Ł%Ģ.y„)(3ēuāy˜ō Åą_ Syžõ{?‡ŽeFŠ©‚Ė‡źæŚ±3I,ž÷Ē“œlHĻÉ€ŒåE4ꆂ2#ÅBχkĻŽė®.Şū½Ž^WWæXÜļń°ł‹—6}A­‡”' Ņæ=ƒ—NCŸ‡>ę1zTz]]²uĻšMĒ/X÷ćΌā¤]f*RPfŒ"$—|tæĻsŽēķt¼tŚwł“ĻŪIüČpŻåź9Ӗ±¼čkėž³;v€tõ/2–öŗ\³n¤§“HA™16 ’ĢIę&HLˆrŠutąģēƒķŸÓ!!¦J„Õ{ĻīŲ™(g,/bó§åd£G%U*ÅČD ʌ±M”‰’¹‰óóõŗĻ~N)2 Š£Ņļń.k>Ģę/6ńu—+}~Īø?Ņń” Ģ™Ā$Ī,qžc>Ļłž&óĄŁĻ©QnyTzĪ“!÷õŗŗÅbdĆuœ¤ćCA™q I‘Ó–’&©×=Šņa“y ŽzT®žqܹé„ė®.ōØōœqd,/Z“ēw“ 3ÅT œžŽ™”æ>eõ Y÷O‘[¾īr}m­€Ėu ’Ųų+מß_w¹ŲüŲuĻÜcżĘcSZ¤ 2#ˆ$s“ņžĄŁæÜ8ōB¼*×B df^Č_<½ø(I,N’Hh’ *3Ę|½ī±j*qŽ)ŗ/$c—Õ+~°©ų”~'cy!L/.ģ÷z“$ŞēčVŃĄl Šx“{ß_ōķɒ„ šQʂ„Œ"ÉÜį*×É%ß8ōoŽObzX0ėßt|IŻg©ŅĢ[•.źQ” ˜zŚtŸgŠuHDŽH<'AZ0ļži(%Ņ22Ӗ’&AZp£ī…˜Ó—/jp75ßõŪŹ$±=*|S3›ŸG=*S˜umoē€ć“Ē',IœwāüGIģ÷šõüĒ &ȱ猃o:>G·ŖēLŚ{Ī8ŅēēČÖ=3½øzT((¦"3&H ČA\ƒ®£>OēąåӾ˧‰8‰™ -HŹ7FĀFŽ×].ō —Óēē\>TzŲüÅĖ‹˜üÅӋ‹°8=õØPPP™ąÖŠ@ųvQ`ĄŠ—A×Ń>ki‚“ éŽ_'ĢøkHr¼|z e‹¾÷{<_>k”źVĶ.ŃDΉ-«Ÿšzóėā•éŅų­OOA1r1kźÜ*®xIžÉū)OŸLŗ÷×"ńœołńć7žk됮ķi÷•_ØcæĒÓ²śÉ«Ž¶+‡ź‡”+æ|Öp8oYæĒ“*ĶšzÅāž3mIÉæ:NŽõŪJš–‚‚2ćH(2IłdŠīš“ā7!ł¦Ž:ŠņaŸµtšŅ—Cćņ7 „Ž-Ą•ŗ†~'š€Īź½-«ŸĄŸ®Ō5 x½—ė’$’{¬XÖ|˜fø”  Ģ86Hœ’XŠī‹DÅ7Õķ˧ū¬„g’žU§-sĢ{ņՎH‹¾é8Q–;v½×]]gwģt7ē›Ž§J„?ÜńŹ=Ö?̾U<€Īc ʌc,?N»Æ<¹¤ę¦šŲē¹q`ĶĄ™pYd¤?NĢyt ūжq FÕ\°Ö"-ž½äg»Ž¹|Ø>}~ά’Gęmܐ>?f—h(!RPŒ蟥›d—¢ū¢ĻZŠžkōA£?:ųØŻ÷ė±JĢH‹Ø,£»9EšÉę/ĘāōŁ;¶Ń'EAAeʉ“KjD šĻu/„‘E)L’ņ‰Ń_“³zo -r€%uŸeļŲF#)(ØĢ8r ^:Żgż¹(c(ErK,‰ēDø.Éń[Éńæž]”± T4O¢ā‰~ū‡£æ¶Öb0vP:a(((&NTņł|±ŃQ‘®½}ĒHNN–$H ēŻŸ0ļž!לzŻ„E ’KjBŅßTa2ĒŪž;Ā”&QŁ”€ešé„  Śōø”Ļ3Ųžłŗzß_tćŠæł<ēĆKŽ$šĒwłtī#Nķ€Ķ_¼hĻļdėžaņ'ŠÅōŗŗzĪ8č„  2ćøÉŒF„|c¢ā‰0ņcæżwż_üūM‰óēBéŌ}’ńt$5deF?ōœqō8ŚÜMĶ|Óń^Wī”®ž­j6­ÖjĶRæjŚ,OQjū³l¬ÖŖh6jė„—,ŚŖ­B6¶"‘MMT`CH€½ä²›Żóū擆Ż$,„$ĢūEķdvęĢ™™3Ÿ÷ł\””‚ $HøäĮI@‚ $H| A‚ $>8wx½^«ÕJ!„˜ĶfŸĻwįmśż~“Éd6›ż~’uŪb±B,˹žčp8šf·Ÿ›õx<—Īąų®S|¼ēś*Żn·ŁlĘėZ­ÖAæ)lŁįp$ģw:„—Ė5XƒS|˜Ēć1 6›M’H\4ų|>‹Å²eĖü³¦¦Ę`0 ĒŌ×××ŌŌx½ŽĪ…gķ§Ļēs:C÷ü‡®ń‹õH™ÄŠaąv»W­ZUSSĆą°ŻšŪķ€Tųąü˜5TTT\Č$Ģår ē-I E8Ī@ ååå&“Éēó X,–ŅŅRÜÉ·Ö~:Žõė×€Żnō«ićėyVWWąŸÉd²Z­ƒĮėõ¢°`ś8$|*~æ_ÜOœz½^lÄļ÷³ŁŖóf³9į˜>駐 æz<Ēc2™š|>_BćŲ„'tūŸŠ”ųŗØš±›Ā§g6›±Ļ6›-į `7L&“Į`p¹\ƒE’Ūķöūż6› ;†›b=Oxūģūż~ģžĮ`čsøŻnŸĻĒļómbg’AĶĄf³%‹NŸĻĒŗĶnó¼ĒūÕjµ²ÖŲgĻ ;²vÉĄ^+a(&¼Mœļ‹oGü²Ä/ˆ}¤ģ‹Ę{Ä[ĘwzI“•ŠŠŠš‰UUU±łłłH”ŅŖŖ*< ­­ 7 Ųs.//gg•””°żģ,lv€ŁYF£1¹'¬ģė„[Ć?YßXSmmm¬e<·+++qƊūśÉ®’p¤ųŅ Ē ŠÕüüüäēĢö'7.īšįƇŁcw¾Ļ¦š ˆ;VRRĀŗ¤×ėŁOz½~ļŽ½ā€Ż0z½žõ„O2įi÷÷ÅļJKKūāĪ$7N)-//gčõśĆ‡‹;ŒćÄh4&쯬¬d· `ē1ö’ū‰×J~xQJ鎽{YpƒŻĆ޽{ٵJKKū{Ŗ ­±WĒäē糟ņóóŪŚŚŲs @ń÷ˆćį’…Ä©‚É4ų}nŚ“‰*6īŁw¢×ėKJJpD2yÄ_~~~aaaŸ‚ łÄ½{÷āO………ģóė ÅßF‚AéĆDIii)k¼ŖŖŠµ3€8ĆsFceeeyy9~fLŽ”–––——'3pWQōąYz½¾²²ÅAyyyr敕•ŒŲvUU»‘¶¶¶>›b$‘ŸŸĻN<|ų0ė’Ńhd/(A4°§!~?ķ Öų:āΈgrÓ¦MŲ‡¢¢"q‡Ł+Öėõ›6mJą‰¢¢"|z½^Ģē4ö’ū‰}čó!°GæŠĻJąƒĆ‡cōz}AAAeeå|Ąn‡¶ų˜‚‚ń :|ų0›%ą)ģ1āøJ˜H| ”_ˆ'V ŸŹŽ½{qp—––²ļæį>'³xXņ¼»æq|ć§+–€ÉB„öƒĄlV%VnšųM›6ać‹3öį‰'ž _iŸĒ ŠU±¼ß>Ź—„Ę™–Ć:ƒ7‹ĒWÓ_SāKć@ŹIޟšÄŲ…ÄÓL<^üNSįƒä—2Ą0@q†G&7Ž7‹7Ž¢°Ļ>'hBȂl4ž÷ŲKī§ųį'<ĘÆŒĘś{ԌØŲ4ā¬Oµ­­ŠĆ‡‹_Ū/(įQ'üy‰CŠ/:X­VÆ×‹#ø¦¦ĘétšĶfœžx½^±9V±™-ūgõ‹&Ÿˆ¶]4¤ģĒĘ_ńČ>CŃÜ|ÕUW±Č¼µžī"h½­ÆÆ7›ĶżÅ¤rŒø«xŻźźj|Jh:ļ/*Ę`0ą[@ū; Öy¼—>›bÄįpX,l\|‰ä'ß_·“·ā烷“ą…ް74Ź×××'»”«ŖŖqĖŹŹ¼^/{ĢŒ0NĪcģ‰ū)T}ś·Łµh9ĄĪśxYkV«•¹I^衍X,ü„—.]:f¢ĪœL&“×ėÅ„cG”ĻēKE’²!•#Ąķvć¤XlF?§»0™Låååz½>3’;×cśC}}}uuu²tKųŒ˜ĶęüüüÆųĄMÕŌŌTWWcĄŲØF Ø®®@ £8Yī?Róų^Īé©®®N¦ĢŌ? ü¢ĖŹŹ.qJųąBG6 k ĢR9€$MžĀ¤ČCētJĘäH œŖŪl¶„ÉŽEuuµßļ×ėõgzÄ8d”T„³ƀ³Eü,™1Rڟc|Ģf³Łl®ÆÆ“YŸM±"6$§S(ą«dĪՄ!‘`i9ėpķ3xfąˆšs{āIĘĄŸĄńÆx³©\‘µ&~糋‘`h¤¢œ ‰Ę‡Żnw86› §c8§['RI³dóq·Ūś| O¬ÆÆw:YŒüĆ&Ēó‰?Bń¶Į`@«KuuõYļƒłXPi‚Šq:¾^$ÓgWńŃįaxi–+Ä$BBćģHL“X,ĢØĀ<Ļ}6e2™PÖ8N¼żAOJGš~Ła ŁßóńūżØZ%?FFįxæßŸŠŽÕju8‡ƒR¬V+kĒķv3„mą7~Ö±‡żÄŸĪBj2™Š~…¢}>¼bEE…ĆįĄŲč³~PŒŌĻśBŁXr¹\8Ē+_ź\()"!F°°°żÄŌœ€āä4ĮŹB’pr×§#1łÄ¶¶¶äbŸžd†>ƒŁÕ“ĆRŁO,„?wØųX7ÄńW„„„}sÖ®²Ą|¤ ‹ƒ}щŹū¬óż5Å<¢ģŅguöü4ޚ8Tü•%œ">¬æų¢ä˜Š±„Éø8ˆ(¹ö+ ļa‘9ŚĘ^*żL’ÉGɏ:įŠ,Ą¬ĻÅŃ¢ģĆL8&aä°Ę ŲČI8ęŅ„”–*X> &­ˆ3bĢfó–-[ŒF#›įšEeÖd2‰¹Än·£‹•åĖąÆ8méļDĢQr8˜¶f͚žśYTT„™5ų_6eĆ’ŚķvÆ×[QQa06mŚ$Ī bl:™ŠÖO“ÉTTT„ż·Łl8±2™L•••8éƦ’7…‰xÅÅÅF£‘uŻ3N§“eö±ż ćAw1‰ŻcźÆ)«ÕZUUÅō<>į-ˆŸ˜xbŪēÓHxk6›ĶćńTTTäēē;N6oM8Åf³±¹æÉdņūżā_™hC=Ćét²ŪwĢćńø\.ֈøĆ~æß/ž$~n·Ūn·c½‡’’ÖĆó{x SAśģgĀų‡Ž㊊Š‚‚»ŻŽq Sx,ęĮ4˜ÄÓQĶbI‚ Ljo Ÿ*šŲŪ’’ĢFLų®%ż@Āł§iĆ6³`SĖ>ƒśĻ;lēYəA.BųH«ö9ö$Hś„c%ŗōzżPG&ø\.œą`Y7£Ń8XAJ~æßįp”••‰ķ°$ ĆŲ“0¢ ńĮ¹C1ØHÆe·ŪÅń‘ƒ[ģÉ ¤¤DņŖIę±'a䀗ęƒ‚ٳg»Żīß’ž÷CQ\>įpm V«õÕW_½īŗėĄšh‹å\™I„RaĮČ_žņ—Ņ;!ĄW9Bj«uģI TZ?Y‚ $Hł$H Aā $H ń $Hų@‚ $H| A‚ $> A‚ H A‚‰$H A‚Ä$H Aā $H ń $Hų@‚ $œ;¤z×$œ\ł9a§Éd!„F%Hų@‚„!Ēćńz½^Æ×ēóy½^q•’dčõz³ŁŒ+SšĶfi­ c R½k —¢ąv»=Ļ–-[ś< ožā„=ūwoļóČĀĀB‹ÅbµZ%ķA‚Ä$Œąśõ.— —“Cصŗ¼łKfĢĪĖ›æD­Õ͘=o€N4injŲæūƒCµū×īonj`?åēēŪķv«Õ*-$)aŒóßļ÷z½#ó ƒŁl–^¤„§Óér¹˜9hznŽrėĶyóLćDć‘ŪŽŽ·ūƒŪŽĘ=z½Žjµ:I]0¦ųuj·Ū-žLXFTŪ‡aŻJ £‹ GEEž™™•³ņÖ;.[1){Ś ^‰į—žaCQQ‘Ä Ęųż~»ŻĪ>!DAAĮˆżąėėėÅÄąp8l6›ōj/qųż~§Óét:Q'țæxå-w^·üĘ!½č¾Ż¼ņ»_1gCii©Żn—,HF+ø\.»ŻŽŸPAAĶf9‹zĒƒ¦aÖs·Ū-}‡—,<ĶfƉBŽüÅ«ōĄ¼łK†ķźbV0N§SR[%Œ>>°ŪķeeeŸŸļt:G]8xJØ×ė=äZøÕ‡ĆĆX­ÕŻžą†åÖÕ„';¶¾µł±uhA***r:ŅEĀØį‡Ć±~żz())q:£÷–¼^ÆĶf«©©‘(įR{õpÓ-w¬žŃž"ö§=xåwæzóågQQp»ŻŅh” †Ļēs¹\f³y„h=|ąv»W­ZåååcĄųī÷ū-KMMM~~¾Ēć‘ęe—Ün·Ķf j­®dĆo‡ŚU:öķžąŃ{oėõz½Ó锜[Ųœł· œNēEŸ.J©ßļ7™L@ ØØČår»ŽTii©ĆįßŲ†Ėå*..€é¹y”»/®ZЧ¢šhÉmčQŲ“i“Żn—^™4b{Fģōé‡ʝŻ®Čr:¾ĘĢć6 ČmėׯO.G#a,Įn·ć§µ¬šę²æT42N’hł–e…7Ąš5kʰŠąół<4&SyPšõÆż©§žŚ¼yóĀ…  ¢¢Ād2]Äłk ņ’ĢKTö'ūI|€xĻG&–ÜHĝéó€ä+"¬V+†ÉŽ„GB2l6zoŗåū#æѼõČoop~öCG &“‰B1›ĶÜFЦp‡Ć1(×õx<„ó0ŒŠ@äƒÜÜܼ¼¼yóę­[·īŃG>}z Xæ~½Édŗ(“ʹŻnT’h²@“„xOŸR¾Ļ#ū£„L9}ÓßĢQāƒ1 §Ó‰‰2%žųߟ>2ņ;¼ņÖ;K6<1¤”P___UUE)=§Š{n·ūĀ…øĆįp8RGź|°hŃ¢cBNNN^^Ž¢E‹žx≒’µZ]__ætéR‹Å2̶ ĪķvćTz€ƒ„‡”ŅŃ _Ājµźõśśśś[oCĀ…ĢF׬Y1Øō<°ÜŗšQĪTŠœā4sÕŖU~æ’Ā©Hb‚sÖßnśę«¾Ļ477wÖ¬Y7ŽxćęĶ›WÆ^ ÕÕÕÓ§O·ŪķžjRå䟳F;QJSŃŻ8uŲA恳¶‰Tr!Œ1x½^ę3Xyė£«óĖ­«oŗå(..:³šńæ.—Ė`00+ą”M P°ŪķLŸĘƒq²ˆ?¹Żn<ŻėõšL&ƒĮąn7ār¹\.—ÅbASøŻn'„X,œ–y½^<Œb2™¼^/v¦Omcŗ”ĒćAƒ˜ÅbaRmŻ„ńgīv»­V+V[@ŽÅ ±ŽāmšĶęa“¶b` ¹sē~ŲŠłaCēW*ŁßjäéóęĶ›={ö-·Üœ eee&“ixœ»¾”2qĪĪÄīĄSų~M¶ļJ#@ŅĘPœĄĀe+FøĻ ?üļOA÷²Õj¢ÉŠŻnĻĻĻG/‚Żn÷ł|v»+VŃ ”¢ÄG©m³Łl6ģõz14e%&vŲķv“A¹\.Ē³fĶqĻōąµL&“Ķfs:^Æ·­­Ķl6#ßųż~”q”R“ÉtÕUW9ĪƇWWW3b0™LmmmX}’ÄÖŲŻn7»„XŽŁķv‹Åb0pq ¼.«Ę†×ņūżƒį"†{éõ§c^?Xųģēp233s޼yyyyk×®eN…5kÖ ƒSĆčמų ŁjsüĄaļēłåPō>”3C”H°Z­@`zn^É†ßŽŽ»øżĮ Ós󁥠ē"”ąĘ5ŲL_}}½ĻēC9Č>|$W\äĒķvc‰ģ@V«yĀ`0X,³Ł\PP OāF 7Ą• ¼ŗĶf«®®f“q”Ā‹„  W*((Hž·!u1ŻUńä-Ü/&'“É4° Ē_‘‡_»€©S§n?Ņ!ŽŒo?¹šŁ/Ž=ܙ““3o޼E‹•••Ż~ūķĆćT8ūśÉn牅Ūżżw'Ī羓“xĆ%§ÓY]]­ÖźJyb†–¦N’šj­®¦¦fpC q.ļ÷ūQ^{<Ēc±XPdćäŚÉ¦±7X”„ĢįńxP9Cq<€`bSĢźźjl’{~ĀWÜ”õXLŪO TV·&•–M&&“³‚ 999}žz4ŲżwĆ·^«’<@g͚•››ūķo{óęĶ+W®„!v*pKŪA™q+õ™”Ęė’¹ł¬²÷ˆ÷^‰?p“~TÉoŌf³õ§2kģ{R¤ŲŃ!Žõ«`õø„ F&eOĆŌõė×ā,Õl6#%0™ˆCÅįpTUU”ĶgļŽ½ēĢO =§“““æcjjjÄĪ‘9Œ@§Ó}ŲŠŁßgśaCĒW*®y»I§ēååĶž=ū‡?üįęĶ›óņņ ×©0čńÜyĻĶĻa”5K5>«łćŠx ÷œüxāɲ>ÅŌäNvļżøłß’Eäį÷ūQmĒ»^Æ÷¢x·F °"EŽüţ·Ü–[WćņœƒnŶX,h.gF!ŚUĢf³Ēć©®®Ną!ƒĮĄF &ł'ÓR¬|¬×ė±AüļyKĘ].WĀĀF£1AM)((@.LåSņūżb#žpņJöžfć˜SaūÉĢĢLĢTŲøqć£>š™™Š‹‹ń=Ÿ½č¼!Ä£ŃĪ@,Ü”f/łvWK£ļĶńīšī_|·į½— ĒŹUh<Žéz>öąšpķQä?0™L>Ÿ‡5šeHµ‘ū[iT» ’Q²į·j­®ŗŗzp§{Ģ>c±XŠwš`ÆHČ?ŝ‹…Å ÕŌŌ$ďZ,–śśśs@¬AĒ£×ėĻ•Pt²R€l…;ĘčßNž7°(ƒĮĄüÉÉ-£%ķ¢Ų‹`s8‰&µ4~³żäĀgæxļpēŌ©S1SįłēŸG§BMMĶŅ„K+*į,ö¢T~MČJĆ?;šÕv Ęó%h÷V«Õår‰ƒšŲÕ].<'„Œœl>|«t’ą®n6¬FØī ®Į`0F ²Z­&“‰¹¬V+ś„‹ŠŠPĪāœ£ƒ0Lˆż*žĒ”——£Wu…æŻnĒņmēt ˜'‹ĮQ8zqį9ń õ“Éd6›āš'«Õźv»“ÆŽV/ģŪ0æqģüܹsƒ‘x‚½C,a{©ĄŃ`÷÷ŻGŃ©››;sęL±SaĖ–-Ó§Ow8h]]ø½H|ŪVgĪøź‡å@…ų©Śjž½;<•.‹+żŸde(`’[Ÿü“V6ķJżÕ’=ńŚeœLq]ģžw¬¬”uC:ׯ>b?x“a ŸĆį@ c-Ša€_<gmč]šł|hķķOišz½Ų,N0ØūXą.j„ž@v"2ž—ᱫū|¾õė×ļŻ»×ļ÷³’ā>C—ĖU__ÆÖźnŗeŒXŠÄøé–;ßx陶śz—ĖuFyō0Šå )ĀŃh2™ŲkE£<†ī`fŒb2—)8œP»MŠ0Ų„‘Äó6Ć@Å„ŖŖŠµĘŽL(å†ĮN¬·ų®ƒm0Jœ aē1ĀÄ #üÄpŖ”ƒ-`<ÕEyé:īĄgÉśAŌĄ~E§Āķ×dÜ·xā¼y󚚚~ųĆ®\¹ŅétīßæżśõčH?ļ!$;ļ›9+[±īÖŚ÷[÷ŗų`ķüESŅ Wƒzȵ„S§¤‚œ¶wÅžóŲ[etź<ż—棝}MŸĻ Otŗ~Mžµ…S(!§Ēd™Kž{$Ū‹PµX,,.‚ zĒ ƒæ+œõ `DĀf­Vėśõė1ˆO“Z­XÕĒćńŌŌŌ ĀĪ>6LŅx 9ŒÄ9ŹŽ‹ūqī¼ņÖ;GuLQŠčō·?ø”lݽ¾Ś«x ‰g÷āmŠż˜’Ÿ¬%ō9X É^±ź#¾ŗųȄ«°ĮœŠsÖ7ńž>d;Ł#ß5’ĒŚ @NNNšƒPź·—-Čę=­Æļ÷ß·xā’^›•™™i06nÜøcĒŽēž{®¹¹¹øøYį!2sö•źń“ OHĒQ8µZ>¢'w‘ą8•_~٤ɫžgržÕĀÖēN¼ø>h¾¢Œśč›o7ØP ]\ģȅӟxyü¼ü±~ŠóƒĮĄ&ļ©XŠ™„uéŅ„ų“Ēć)((Hū8VR.bÓÓłŪķĆŹb¹uµZ«C$Œi $ œŲÜļ[ę‰Y!‰—V_šĢ绚"&“iΜ9×_żóĻ?æzõź q* A|„õśŲKE³³:&geBg+=±—ž¬”Ķ{iėh«„mupj?mž~ž>ż-ióh®¾&cś¬¶G¾ŁY»+„(#­ŌŌ—u.ækęĻ#KW±ĆBűDkźr3B™>ŽŁ$˜F8PD.+¼yL* čEøDųąāŽĄŅŅŅ‹„ņ²`Ó`8Žæ*ŠÆtķ5)8ģžÖk¾o¾źkŹŠ©`³Ł6o޼|łrŲ²e –›Mż9ŸO|ŃņZˆF>yŚ®ųäłĖēf’īS:‘Vįō¹±č§>ggDd( C뇓ī)ZW1nUlŽŗ“¼żcx÷Ax’Qųč9ųüpĢ ]mg\(oķLÓŁŸzsŃŲūT¼^oMM͹®ŒńČhŽļLž#`Ė):÷X.ėłĻēŪ²e —cXĮ¢ŗŗśR(·µtéŅ‹Øw&­?Ģ;÷@sŸĪŹ‚Mūą Ā~9-@?lč\ųģ?ßvœØ“óęĶ»üņĖļ»ļ¾²²²¼¼<¬žm6›SœdœōgĻ¢Żū~}{V×™Sä> ń®Ów×ūļŁ4-y¬méßēGāżDDŁ,»r¾lęU¦”r]j€£Ūaļ šīŚę—“›]+ŌŚ-Ø'«/Ÿ=f¬Cżż9°h`ŃxÉĒNGćõ Č¢/˜¹ĻėbŠįÅ-(Nżł‹ĒXXQ2&eO[ølō.I"!AG…}eĮˆŠ—Z@zÅ=IdŠ3Ž$WD?ėŁ¦(ݼēŌĀg?ī£Ö¬¬¬¼¼¼łóēoÜøqķŚµ™™™õõõÅÅÅ,šwł ?­į€óĒF”F3N”óōmLč莶hI‰Ÿ”’£[»:»Eæ§Ÿ šń 6€zh3@— ć²aāLČŗņ(ŸõԯߊGE¾¹œF¢cc cܧصe±X0Ņ æ ¬I`$+ʂ ;l: ; Y€¶Łl6”¢nµZm6s,_\cŃņĀ›/©wݲŒ/®éf{ŽĻēK˜Ś'ļ9W…8YT%“ér¹ę+ÉWd%:Føö‹/nt‹÷’?õß \§ˆ ’c(¤Ń®ń½ō–®æĪÖP F„ŅŖż9Ŗ««—.]ŠńÄżõM6X7yšUēÄćUźY*ĀĒO«g%@2&¦o޼(ÕüyWĒ­’„`‡}ȄŽž—Æõ~ōńŸ*ÓäĄĖEa©irĀ…Gņ[Õ1Ėx' ĪĆBŒ8ÖŁ‘“˜V›l>r:h#bu+ū ­c‚x9v]ĒĆRrÄՉY’±\šąĘ`ųwķ®ņé܍æPeg§Ø\cy™…Ėn¼ų`į²īÅŖsĆ`Š`•b1ĘŌjµz<,!‡įĪÄ,ž©`|AĀƒSčʼnR«œįółp”ąä›Ād¼†ŠÆ‚Ń“˜k]]]½~żzJ)Žyqo\” sžūĢPhŠg“t7½üĒ«qbE²:@8!¦:;¹“.’ˆ«V ļqTąØŠ£4ąr4żÖkõ‹rŅ+²rssń^¹råęĶ›·nŻZQQįv»±Žxņ\spų šÅ¾č[æÉøFĒ)H_ŚĶi^˜›­IOēŃÖŌäŸqdŗų^(‰ tēo¾?äӔ2 ˆu…N¾ł’Å>ß*Ó_ļźäÓŅGęĖÕ±łµxgŸql#yÕäI:£ńĪžBėŲw(ŽĢƝż-Ł:DŃx]ķZ¾"ū¶’1Žs—L§;ėŌ¦ēęmO2ƒF§_ølÅĪmoćG;Ō—s8h\F ‹aĶ555UUU(”“‹įÄ9}•ÅÅŇFéŒé8œŠŲČÖ<0}2[©W|9vœė°z|ā+āfŗ5Īoü~?–{±+󱐞:ujƒ_Ģä³®‰Ž oüYuÕ§į)§e(…‚Ąæyėź‰mŗlM\Į·vĖžŅ™×Žŗ2ZūĒ4 @ ĒµpzNŠ©pū5ćY¦Ā}÷Ż·|łņ?žń˜©€o0į傽ˆĘcŸo“Mæ,hd¢ ~Ā? @įęłéW_F4F£!œ (JКDxd2‚’ŗ„°ēo/ųö}*ˆ+Ą“x1jM§ŽūŻU.SQŚń™ė[’]u”¢ńÅ?ģ\¾āhÅĖ©|<×-_qé<™y󗀨ŠōPĖ&œ ŸIģv‚~‚ŲOõõõŲB~~>ę¦a-lŹļ÷{½ŽĀĀB¼q|ņĢ zs!:€…Ķśąńxµˆmā,•'??äÆw’““sōLżą5„ŗTæÉü #Nˆ’šųĖ’—^2ę©ĘMŠOß={j|ķU?+č˜0Y»¢cė“ī£ś*tąT°X,7n,));ÄĻjųąšŸŸž!kį2„ˆ½ā”ū$Ź’ļėŠ…³ŗ 鯋.ēĪ0ńČ2"4ŚwĻļOō€ Ā|é BĒ.((Či¬›Ź'dJ‚u(`±X†!U' Śų«=Öoūwķ˜ņę/¹t>–·>ĄR Š›ĘuqM ‡Uń1åŽd2a#rƒßļG³ž9ö˜–|uq°CĀńLĒķ󬑠…ņ7i". @(ŻśļåšÉŅōĻP$ŽŅśęu•~–†ÓČ ‚āTˆ@GczüäU×/¾}nūoO¬½ą„ścŃßæ2£ŽĻN@‚Ņsņ¦ęoUn2JRõ5ŗ…_’d÷čåDGmŻnūĮ»KĀÉÖmœ„Ī»”ųėx'Ļ‹G, h/ŠR„ÓvfäĮŖ*żééąõz/‘µ—1M7uÖœĄ³ ^ŠqŌē÷š7T$:­«ń’ŶjŒéœŠ'4ÉÜė‚“›ęfĪXžÕ0ŸÖ—r@A”€N–©ŸŸo³ŁŹŹŹ0S”¢¢-oź?8ņ÷—ŒéQNŸFŠRDzļO.…ŪāųŌ0įi¢ŻŸŽš„Ö6Ä_ż§«/S^¾½kļ, ‚Āśąz؋‰«ŸéŲžrZń‰²I6ńLK“sœ YYYĢ©0|pźÆOMŹPכKA˜ł§÷NIO8ToPŌ™ &>ŠƒĒā•ļY7M—ń™=!žń?£’UZ¤ŸrzåeVžņ[ē¹śf{m]`×GøilbŪ±P(y; €xO7,˜/5uŽMÅCl©ņi0Žs—Xdfē¤ś~ƒµÅÖĆuūŁžÕƒń ®Ūæ÷ö¾¹gĖ«ģ§ż»·æłņ³·?øóęÄ?lß¶å՛n¹#™QśDfÖ4€ķĆPŠ7:lFćy$bŃ·Ģ1:~™gbu“Y„°,»_V"›¹ ˜ˆ¹:0øˆ…B`Į>Ō)/nĘĢYE‹-:8Ćy@žÕ:³”Éš„¹įß°&ķ.įĘ) GNŽĄQLšŻy0Xś×“/ß½ā²/’.¼’fßuaNÕG¬jRvŪę=§ÄåŌju(Śæ?\`|Qg“obg37CK9ƒ z:@€ąŽ×K ”™Ģz¬fø‡†ü±g·‚¼‹ØyBØ!-G¹čćčžrĻøEŸŒ›~Ņ挙= …dZ-LZµRæąZÜÖĢνņÅēń¶­™ ām<]•%5uŽM©gēö÷vō ®5ŽsRˆ˜fĢNU?([÷c$ƒe…7OŹĪ9WÅā¼1=7ļöŸnxć„gvn{{ócėņę/fk·åĶ_ühł–Gī½mē¶·ß|łŁ•·Ž™JVݤ”)šRŪl6³Ńs‰bEEt SD+*ƙŃn źEAA®Ņ#>'ž‹{°7*„„„øä²˜iXż»’’’A×bĮ œ5ī¬F¬Ņ5F‹€{ś‹/)«€›|“1§\ŗ¾7Üz‡(€@€hDi3–WļŪó ŻŽ§Ļæūø÷ńīėΐž”öاkįTx}æ’]ŪĢqćĘķŪ·Æ āƒ¦÷ž4YĶsi²DB"½‰v=LĄO€ćz(”ē®(H”Ɨ’ß„]ūh0¾z9Ī§ZLŽzšÅ›®ūŹ£ĻĢY™8Ū;×=5sNē3«²³Y¼L§cbH¼ āmńéRSēהL§M~/Źģ,ć=wM^UŲ§¹ Eœh<²sŪŪ°śG÷'›‰Õīė/ÜqØvŸZ«OéjnŽü%Ósóž÷«Ww„‚o¼ō¬ż‘3VģYyėŲ·ę¦†Tų 3+†Å„Œā+®³Bė¬MrŲńa $æ»>óŚÄWw€ILĘd’³a” Tl,B xĀĪĮB{m݁»ķ3~ y”žšžQ¬B“\@uū¬Ś–¬ŁńcŖ('S¢ąė­Q“iŽöz€4Š8pą'É7t}r÷ĀÜŹ÷[‘ §e1!āøÕdóс“ˆF£ģČTŲ@ūt7§ä‰œė±põ\•Y‡ 8ą9q ć€ćzØÉ .ōü£Jż'€'\Į5ˆ¾#"4µŒūjėu\ē$?šøéŪ@Īčš(ZMBæ&ģ3}É2%Åą"øPõPķ¾²µ÷¢Ž™•óš3fĻŪ·ūƒµÅVx¤Ü=ož’•yÅDŅ l~lŻĪmou„‚ø¾1tƒ%ß\Šķ0£Š³ ~į²·myõpķž„Ÿš€Z«KQeÉŽŹŻŗŅgė}jCź6ˆ‡BŸ=ō³ĘŠ—g>ü€xźsŠėõ}³£ĶD_ÖrżÓŠ?pšr 2®ĒÄĀąd½"^€ 3'PóLM•Cœķ˜÷>µłīĪD>‰„ ēD-aQN:ƒĮ††T°÷ĀGĻÄßų=ųW }×įK?Õ@”ń"ŗˆ‘lĪ5·}’żŁWbzGż“O³m’®ŻļϾņżŁWŠ·1Ł[¼§c,ÆŌŌł5Ŧilśģ”ŸÕÜöżrģĻ śz˜{õ‚>~ė)\MyŽ,ÉZ÷¤‡„Lœ#IR ĆR,9}šh¶Ū ‡ =8/uäč'Ջę¦#Ņ›{h’“.ÜŲ”¢±Ø_ż€ 4NŅq ć@Ī“¢„‚A2ā1ąšAæ,ĻįĄ0dņ«ŒiZÖ¶¼å3MFbu@§äąĄŸŸ©äB`Ī ŅšŲ÷"õGhg7÷Ó¦’Ś&p“W-8m&¢źM“õZ8@¬ä ätī\O,-ę.pP„‚@hšŻ’ Ńä€örBw¹4ę$ Œ…ĖnTk×u„‚Ž{ŪķnČĢž–™•3½7wAģ3țæ}ÅŠÜxäDÖŖ@Žü%;·½½mĖ«˜lœ"1`H6»Üzs’ް—óK‰Čń¶m¼ē.–ÆgX0’˵’IŽń¶ųt©©ókJæąŚžŽNŠ•z”י!Ā܎Xö_ s£|ĻB2zßŅ҉Īt؜Ķ^Å?’NÜw—Šś{²ņ; ŸAT č&]BLˆö8A€#DM@N€'©ƒ -źt0Œµä2 ķU'(”—ĀQJ{,H=n n"Ä kķEž]»w.æįŠĘ_Å,„ į¢šĮYĶżb,·®~ø¬‚ĶĮQŠ?üDEfV֜˜ž›Ēņ 0Õ #TkõøJeÆŻižóĻŪŲžE3ćµV·pي‡Ė**Rt„‚xŻe…7;’\•ā’Ÿą4b‹.HPfg]łāół/¾pNd€śANNN¢•č̵â1ŚÖūØÕpš U(z-I„»@”„öČOŽōÄōwœā’k wŁģtµ\ĪC—\]}łäS §Ó÷|ū¬Ēåóߦćjćåå=ŹĮD%n Š€ßŚŁō^Ė„ß ż’„č{ó8r’#Jõw§ $"@ZDJ€¢ Gg2T*ą PärąIÄ¢Ąó@ø2$Dć=Źf,£;ŗGi茩%j%Qi‡ā„†ėśYž" ØĆJJļ×-æ1”l܌Łó6’óć}»?Pkuā™ūŹ[ļ\ølEG( ŽÉNYūċā6Łö¼łKŽŲ’ż)>,–o9ļo—ōƒ‘ ^«Zt 3CŪŌÓļG>x½”ΰ“ˆ«JP +’”¦»æø¬„Ū)[8‘tvB<±tuJœœ ؔσLN|:’•ėł½ ­§rK/_w¤3}młż×Ŗöķ*ææ;}œIC:­­­­­­lg žƒģļsńq§?§‘D£ō2 ūT ”§G LćB8.(Ņ (低€HŌźž…Üŗ#‚2­· 픁ŽØ0£öÜ> J!‡®8tSĪ|M*F­sŹBˆƒõO>Żųā¤ń=’„Ķ ŽTŸ§Iƛœ:$ż`dbŅŖ•3zą¼Ó'1ŲT§Ó?QŹž™>„]QįnžŹ=»gŅf~ž$€p\oµ7`džƒŽ4ŠJ“ćwÜ:ż’«5ś`Ü3ų“ŹÜ'՚6Š$w&G×£( ą`K©^4™¶Š»āŅ9‚ :.LŠétγ’Y4Ė%Č06ĆB(p/)ÆŻ/›Ü-Čč_hŧ“Ŗ“§>l….ŗ¢‹Č8š‚ĪP™2lÖL€£t²®ÜÆk5} ¤©z9D£Qō'ćÜė\ź›ŽĖęmo/Żm€ ‡•éJčˆ(ɀ#@Éz\ēM‰€\ŽcŠF{ĀA ¢ŗ)(8ˆh bqˆĘ!4ēē-EŚ ¼QōDśF’- M‰U„śśśCŒĘ’rp‰,6ęĖÖ#8Ī¼¼¼`0˜— ¹ŁōĪēĮŸo;!ZHłĢEÄ9ŗr++åÆM™ĄÉ£1ņE'|Ń:ŒS€‚^ÖŒC)į°‡›|ŻßØmø+ßExE¤7ščĢö{ģE ń¦d€™uæÓķĘCĀOŠO«hW“½µS÷É gL Dŗ@!#G1 ˆĄ0ŗ»A©Žµŗ:įŻć.‡‰*H—PˆÅz ‘(‰ ń 4Dä¼B²®Lżé'›ŒĒśõėKKKq݌ś'Ÿ>ZńrŸśzvī5ī?łĮöŚ:ŠĢĪ•ét˜vˆŪķŸÖbMUv6nĖ“Z͜ŁįĘĘpcn³Ó ęKMwSģ„8Ī5kÖ`äč%"Ap±„M›6õ·j˜„Q\«§ŗŗŒF£Óé“Z­‚ Äćq¹\‰D‚Į`,€Ē?8łÜžÖ`DHT Bŗ»ī•øV»C ]r'*dŒW@ŗ xä=!9BC{ö’÷v3śZAó >ŲyĒe9zÅļ~÷» 6°eņĪ™˜Ą„±ŻńŽmNŸy×=>3™€ Ļ„pŖ@£•€@Zv4Į”0LVAé2q@)Ä㉂Ћr¦+d?|ķœŽĮYł…ś'Ÿ>QłFĀ‘ś׊3P$Œų|¾éÓ§Ą·q‰]½hfG(øwļ^IE½ƒÖįpTTT ŻĻn·£šéčč…B”R…B”×ėe2Yggg0¤”ĀńŅmĒ_?`Ā·wC€h"ķ%i;×NųX#t)äddTČŠ8ÄāuÆÄę“Ūś³B‰-nŗ’Šh4ZVVö›ßü¦  }ē¶ž°XŚ™ŒūŅ×Ō7}½'}Œ&"½dĄõœ12&€B „ärhōĆ' W€ZJpx…L” ņōø, 8Y…ę4Šž¹ņzõ¶ņĮ9ė}j „Č^*,y&š~³P×N: †H7tG «ZOĮ§ °ć ¼\ O}u]092ÓĄ ­d8JD)Ź+c7®‹OĢ„”āµx¦ƒøŽ*;ū<źņć¼Ąb±X­V·Ū}NēZ,¬gr~`īńuŲ‚R<OŸė¤ŠšĘKόmį‚7Ų盕0įp8L&S‚« -- }ē*"‘Čɓ'C”PZZZfffzzzŽ^į¼1ūĻß5.š¦L 5Øt Ō€L¼,Fäqą’D?ō\” p 6eąå¹BČuߏiæ{·-ö—fįo-tĖ xµŹ@å ØjƒSäh![ ćU ą ‡īXOīu·@ N!]Óµģįč“ė(„‚ ¤ž@/Öi(‡ÅbYµjÕ9QBuuõyĖSÆ×»~żzF'lĆēó]Ǥ~×&“iéŅ„Ćp-„Ķf3”ąV÷+cUøluæŅÜŌ ×ė%ēĮȇŪķ6™LÉ®‚S§N:u £HĻķķķĶĶĶįpXÆ×Oœ8Q”P,ž¦žĖͦM7fO5(A¦E:Ø“ TƒLœŒÆī‹Hśśŗŗŗ>ūģ3eŸ°™;3ęB8ŽƒoŽ/|ż PĒĀ4$PąAŸćÓ`œ “ s  <€Œ!ˆtāē`œ"6>Ė’„ŸE¦.ɀ]č¬^„‹ø„²Į`°X,v»½ØØČår ĻEĶfóįÇѪąp8†9PŻn·ŪŠ)^łŻÆĒŖˆĮ[Ckƒ$pG,¼^/Nž\”Pčäɓ‘HäĀ/A)EĒC<ĻČČ@§Āwó ļͼļK“tź4«@žr%š=ė£õJüļ1ķ)°˜]4Ś“wA|Š·~@ĒqtÅ£·’šN›)tB<Ā ¼œ¦+A£ tJŠ+!]„ƒ88™ Ґ£…ÉĪņ¦ł„]ć.OP FŃŚČ&“‰Ķ÷Żn·Åbq8øĒćń`rJ²Čćń°uĄ=XĪ:v0k C›Ń4„Q<īČ<Ųb±¤®¬ø\.Æ×k³Ł¼^Æßļ·ŁlV«ć‘].kĒårįNü$†łńŚķv£ŃŲÜŌšŹļ~5&-EØH9h#ųi\uÕUÕÕÕz½¾““æ jooÜĖÅb1Ō6xžĻĢĢŌét†4Ł}K2ßµĶüĪ• S€L ¼ß«"0«/Љ:”qōąŹhz½~ģEb-)ć8žē!÷ŗš=OvÆ“AF&ÉAA*š–éi “ČA©ƒ&i![3'ž2-śÜtWSöwbrm ͜-]\5}·Ū(n·e½Ēć±Z­ØIX,±™Č`0¬Y³÷8N&Óń,”ÅbėŹėׯ,6Cį…RQq¹\6›Ķļ÷ć‰&“ ="~æßēó1ŗ*..¾ˆ×`0 ¾ńŅ3c¬t{0€$')#ƒė*Hż8¦žyõōEFp|Æ'Y¼&ķĒ|”ōˆƒĪĪg²ģY0Jąµć»-·īümū×~Š•»$®OI•§S½ŽNÖĆŌńtŚÄąŌ9õ“®ÆŃ|Æ.me»r:Ó0X„Ņ3rßRōE™Ą¹¹Łl6›Ķ8¹C§.źlrm2™Xš¢XE0›Ķz½÷$Ģ»- Š~Ē£×ėūœ›#Į˜L&ƐŸŸ xJŠŅÖķv# Źd2”·ī½^Æ^Ææø˜m6[~~~G(X¶īĒcIÖąB›F£Qņ$@ «ąf }84¾Ł“éƜ©€ō,%p†½HüßÓĄ”·–––®®®„ŸR]/s`ĀSŠu™LF5ćĀł+ŗē,vu’QŅ~ŗ;b|zˆ7D‰Šēe2^¦P(är¹L&“Éd\/^Œpż@<å÷x<8™õł|555Lą2@9› ÷±p[Ā~œ›{½^»ŻĪų``©q~L¼.ė9Ž^ ©Čēó„rü.—ėŖ«®Ś¹ķķ[ßJX÷f”bßī0Ģtų]2~w¬‘Ćį°Łl‚ „B”A·„"‡@WW—F£ÉČȈD"@ą;yś.×nŽsź¹=­ĮH\$żSRąĢe6Īӟœ,ˆP ó»X0›Ķ%%%P¶īĒc =­=xōŽŪ ¤¤DZżfä@ģ*ę*@ڧvxŠŻŻ}źŌ)æßN½^oH“Ż·dā»E3¾3׀BĪ&ēØ  &’$;>õ)¦ŁNBĻóā >£„R‹Å˜Ē…¾L&cL€ąyžµp®.„‹“É„5”ŠžcµZS“Z­Č(ÉŪ4 &“Éd2”›zčīĀ`00ż@LK^Æ×ēóW§Óéōx<555Ž[Tö—ѝBųhÉm’„h¤Įįp8NœÕ:NńBF£±®®ī‹/¾0r¹ü¢ō°««+«ÕjµZ–– …¦RŗiEÖ·óōæŁŽņaCG*D£Q 6ķĆ0@ |bBr’Ņ9A?@AÆT*U*UzzŗZ­Öh4Z4F£Į[R*•Ø" 0“ŃØ F ØōŪƞpuuu‚L7™LƒĮår%Ėz‹ÅĀö‹·‡‹„¦¦&aśƒ|ąõzGNҬĖåŅėõ‡ėö;׎bGĀsæ\‹KøŻnɍ KM™Ķf|ŒčF¶Łl‡ƒ…kjjœN§Ćį0}Ź}æßßē~Ęāķ„ėVWWŹÓl6”'œ…'™Ķęā<÷=+Ū¶¼:J3Ō¶ŗ_yóåg ¼¼\ŖN1Bąõzėėėõz}yyłĄAÕJ„2??޼yGŽ9vģŲÅźp<Ē„˜©‘‘!“ɾ3W’nŃ̟`ł£žmG]]]č?ĖF§„bx~}JV Ą‹€”³q"œ$Ÿe·Ū#‘ˆĆį˜4 J)Ś+€x‘įŃ“€×××Kߎ„f8ZVxóķni+-·›[‡ygŅ€łĄčź-[¶€F£¹ćŽ;¾÷½ļéõśœœ„R9š¹įp8 555?^\hų‘––¦Óé8ŽCó3Ū“““<üšĆūŪßJJJÄžŽįpØT*•Jõü£ŗŗz€™ģčĀ 7ÜPSS£×ėßyē‹åē‘0l@7ų?žńĆuū?ž÷¶ÜükĘM˜4BśvØvߣ÷ķż`”––Š?? #ƒįę›oĘH놆†?üšĶ7ß4čKHKKćø>2y#‘Č©S§Āįp<—Éd“&MjooollŌjµ<Ļ_”‰Åb2™L­V§§§ ‚€6Ž’ż^x”««ė†n[ŒO{}Ł «¼¼|T/ׇy$L“Ę÷%¬ˆ™D«t’H°½ńŅ3ÆüīW” ^Æw¹\ŅŚ£XŽ UN…X,ś\S”P444tvv^§B,kii™6mZFFī‰F£?žńŸyęH–g¬7É(!9+o“’€D—&ü~æÕjEæŃōܼŪŗaŽü%K-ŲüŲ:Ģ8+((p¹\£ńƒ’€ƒ  ųg‚S!$/4&†Mś|¾av*455 †iÓ¦%„Œg/ģÕW_µŁleee‘HÄh4¾óĪ;\‚P©T6›Ķ`0ģŲ±ćxcƶ-ƞhl˜>;o8= 'l~lŻÓæø—4ųå/łūß’^Ź@Ճ Čū|¾ŗŗŗżū÷’å/į8.++«³³żĢńx|€(„˜,ÖŠŠ0 ™ ~ææ««ėņĖ/Ÿ4i’ŲTå÷ūßyē×^{Ķļ÷’ņ—æœ={v"u%'ˆ«ś!b’F|>_}}=n‹—“–Ęń„ ,܍ś.,+¼yõīŸ”=mؙą•ßżżĘ£ZĻ–Š<襔)Sf*hµZL ųt„RyüųńÖÖÖ!ŹTčģģģģģĢŹŹb"D8ޱcĒŽ;źźź°²}UUU ż%įZ]‡‰ŚŽüü|›Ķ†sCiŌJ`ĆŲįp°ÉMŽüÅ+o¹s( eļŲśÖÖ-ÆīÜö6›Bį*uŅ+“ĄŚ3 N…ģģl•J%ćéZ­öąĮƒƒ›©‹ÅZ[[322rrr’§ų(ÉßyēŚŚZœ7{½Žä™ 9k×}>ßE¬ļš"¤OĀĄ¬ąt:1|ŌZŻĀe7^·lŅƎ­oķŲööĪmou„‚\Ršūż‡£¬¬ ’D§Ā”)S&Mš}F÷€B”Šh4“:ˆ™ 'OžT«ÕÉ®¬–_WW·cĒ–^Ö§ē U> alSÜn·XåĶ›æxŽü%Ósó2³S*‚t¢ńČįŚż‡ėöļŪżśŠz½Žf³įŗrŅ£¾¤•ĶfC”e*`i¹īīnqÄĻóXĮ3”…¦¦¦Ļ>ūlņäÉē—©ą÷ū)„&“)”etŌÕÕy½ŽwŽy'C q Høäąõz].W1 2³r2³{Ōm L:T»æ#€ęʆꦆ„ćF£ÕjÅ妄{)+ 6› ‡:,X™™‰NAp­‚>³uuuG½üņĖSw* ģ*Ø®®öł|č*ĄšJµ|‰$\Ņ“;\™Į¶z½ŽÜ \¹ZzŒÉN“É4yņäqćĘ„R/‰ŌÖÖ¶··Ļ˜1ć¬Gśżžž\ļ¼óΉ'Ün7Śłõz=®ˆžŹ-H| AĀ=Fų9įŹtøSņ H N…;īøcõźÕS¦LÉŹŹ:kł#D(ņz½ƒ”Ļ"z±X¬­­­?WĮ;ļ¼S__ļńxvģ؁;pH| A‚ Ć”wŠ ÷ŻwßM7Ż”‘‘1eŹ”³–?B S!''Gģhiiįy~W:StH| A‚ Ƨk2§Ā¬Y³ī»ļ>t*œÓš 'Nœ0™Lįp8‰L›6-Įē|!®‰$H aX!v*Üwß}&“iŹ”)©¬©½N…I“&%/ļŲ§«Ąét^Hõ9‰$H į‚ŠņŽ6͜\UvvŸæ^øS!Ø œ8qBģ*(--½šŗ H AĀ9#ÜŲčßõ‘*;˰`ž»KTŁY3~p`!~N¤Œ“» ±,ŠÄ$H*Ś?­͜Ł5·}?°ė#ż‚kó_|”å½m±PhņŖĀ³ž~ŽN…p8ģńxvīÜY[[ūĪ;ļ « ??ßétbŲ›Ä$H”Ąj#a9¹X0(ÓéÜ]Ņŗµ*cłŅ¹O•­x¹u붌å˦Żr®­«Sµ,@4X®‚‹Ć‘HäŲ±cMMM­­­ŻŻŻ­­­ …"##C”Pdee„īW‘ AĀ„FÅÅÅŠÖÖv‹TÖ?łōъ—'\æ4wćÜ6,øvīSeŲlŠNę*xēw¼^/īWĮpóA(ڳgĻē!==]©TńL!¢4‰tuuF"‘ńćĒēåååęęJ€ ˜ø4›Ķn·Ūb± ÅDx`“¼·ķDå™N›»qĆĮGk|ńŹģ¬…[ßA-a/4€S”«« ]č4tWĮ°ņĮž={öģŁ“žžn0ŒWŖT×Ēņ”h“»»£=ų CAA¤+H Q‚Į`@&“Qø±±å½*˜ZtKŻCėNT¾nlŒCš9³‡īŅn·Ūn·‹ &“éĆ?RWĮ0ńA$łŪßž …&dLT„„BŲOŃX4@ZZo~Bˆ·“4‡‚Į‚‚IQ AŅ X}\¾eāP żÓŚX(dX0_Ģž]»Ū?­3,øvHi ‡Ćét¢SaĮ‚ĶĶĶųŒF£Ćį ił  żóŸ’ģģģœ0q’L&€øļģčhĆį3 ‚Ėd2UZŗĮ0N„J#!”`ąųńcsēĪ]¼x±ōUHpIĮf³™L&\¾—ÓrÉļ÷7nļŽ½ƒ»ümø±Q• ž{ūOh#Źø~Y*aBCĒ…v»-ź7ü«=rƒ«üóŸ’ģč蜘9™ēe”ŅP(pōˆ/ÜÕqÕUęo|ćwÜqĒ<ŠŁŁYTT“lٲ¬)“6Ō7=‰D€Ćøń“'O9pą@]]ōyH0ę Łl6Ō œN'ÓXaAƒĮŸŸ?ˆö¢ś'Ÿž`ž’ŗ‡~śóy­V3'&\ælīSe‘ šf].׎½{ ‹ŠŠ¼^ļ9U£Y|ąńxŚŪŪ'fN"„£”žß18ĪĒü«_żźu×]×rņDWggww·V§OOOg ŽJ aĢĄjµ¢6`003Ėb±ø\®ŠŠ \½®¬¬Ģēóåēē'ˆ×šššs]µ7ÜŲx“āåś'Ÿ€ŽŚŗÖ­U­[«`ņŖ•WW¾¾pė;Cw›ÕÕÕLŃńz½C“ްĻēCÖAw4īōūżr¹AćƒķŪ·k4Z¹BI)mkm‰vwżė_Ÿ0a‚Ķfcå–ÄšūżN§ÓétĄ¼yó-ZŌ|āŽć&fNnmm•¬F$ŒXąŹ£ēĮÕÕÕ,b9Ąįpąņī‹„ØØ(ŁBb6›FcŠ*Bū§µĒ+·@cŎ6žźhÅĖ0iÕŹ=°`ėŪ Óé†ÓK< °ŪķL7nÜÅēŸĻ×ŁŁ©Öź(…īH$ ~å+_Į¢ƒ…~ŸCнųyóęåääœ8~LĘó:½N­ŃģŁ³Gśź$H™@ƒĻyšŪ6™LØ`ųž„4“MtÖč,#Q÷ŠŗW}u‚I« 3–/łš ŹĪžZtKõę†~æõ!&Ń}Ā£Ėåņz½6› wv–Õjetčõz™šÅÄ/6‚–4Ĕހ+¹¦ĪƒĆuuuiii<ĻŠ@Ą?kÖ¬gŸ}–u"aYA ­NwÓŹ•qAˆ ĀĒlµZ'O™wu…»xžŸ0ab{{{² Ž øŲ”ōqJ0̰X,[¶l9׳p¦ß,€ŻnĒŌ ‡ĆQSS“pā—G+^ž`ž’÷Ų cł2^«5,ø4sf_t’p2: ”ĀI=:NPÖ»\.fL?gtµZ­V$«Õj0¬V+#ŸĻ·~żś„Ė”9Īn·[­ÖŌóׇŽ;¦JK§¢ŃXø«óšk®ĮÕe<CÅ£ŻQöļ…^(..žŃ~”;+÷йsżm§d¼lŅäɐ¼Ü9rĢśõėqĆļ÷_uÕUčk’ AĀĄI3Mąē†Ņ ×]!„¤o±X°³Ł\PPĄNdÖ'»Ż^ZZ:pt©×īw—ģ±~d:m<€X08įśeCįTWW[­V‹Å‚ü‡OgśģŽ ƒŪķfā}øś±Édņx«ūŒ—ń<ĒéōśdżĄįp 2[See„“Ŗ­ Cjč`ŗ¾Ēćńūżh²(((Ąi»Żn_µjFަ2M^µj΂Ѡ2Ī q»Ļ”pc扬7bĮąĢ‡ 76”s8ÜŲ8ałRMåė#ß%PTT„bŻl6{½Ž@ ąv»Żn·XH&ˆ2Ēƒ ¾<²  €‘Ē—³Łlėׯ·Ūķż™ė‡Šŗ»»yž'„§¢ŻŻSMF±zČČ £³õ*ńx¼Ļ¦tZ ”ņ<ÆÕj»»»“ńz½F£Ÿ…ĻēcŽ)üÆĒćAW;Fk1{%šŲ9³¦L&Ś+m6{¾Ģ‡92~æßårį1&“ ÅLzƒĮ€æ²Äś„ƒ%i"a“ƒÅ®``HMMĮ`@“Åš5kPZ¹ŻīTų?@ĒƒvÆ×‹3Łž>’®Żįʦɫ [Ž«BĒ€ńž» ®ńŠ®_Š.Ķ Ö"8N»Ż~ÕUWUVV&[„ścb±|gŖU*0™LUUUčxHŻØ>|pģŲ1 h4ŚŻēŚq”‡žõÆSŗ±Ļ¦ōz]VVV8ܕžž®P(:Ō'0šĮPŒSĀQ…”€T“fĶLkdTYŲÓĒįk±Xp #‘:4äa„Åb1›ĶhƒĆÅ(PĆ ŽßļGŽĮ‹&,‰ #yÖÖD'œÜ ‰MŲN§³øø3fQ²ćœĢb±0Śƒ”““4A & ƍMš9³ėŸ|9`ņŖĀ ×/ ģŚqż2čõ®޹f&“Én·£č¬‰ĒČ»bméœlć‹ß “”Ī”Œ>śčłēŸóļoæł÷·Ė]®>śØ      °°čģģlmmmmm =łäĄŃét.—k×ī:üŽÖ­Ļ<óLņå KKKq;??æ¼¼œRŠW¤”–––źõś¶¶6ŌEŖŖŖ(„F£7 pŲTii)ž^YY)>}ļŽ½›6mŸ’ÆN)-**b-”––&,AĀČDeeåßžŽ½{÷īŻK)mkkĆĆJJJņóóńW½^~Y›6mbGVVV^xߎżÕ];ļß×.¦”†>łtDzÆÖžtm×Ń££čń2¹„HüXŖŖŖš‘Š#¢  @,[šEĄįƇ“OGįƒŅF¼“ ½šƒĄµµµ›{ųąŠ_śč£8ÕÖÖŅŚŚęńP€Š“O¶“¶šÆÜåŖłĻ¾ś# Ū¶U%<Æäē‹".ī,*****¢”>|ŸQee%åŖŖ*&ėŁ³Ę?F¼({Äåååz½ƂķēēēćYų “µµ>|)'į` F&’Åw[[“#………Lść'†Ÿū¢¢"6Õc" …`IIɥ׭ŖŖźó˜¶»>*ü֎e_ÅķźÜy;–}5ōɧ£ōń–––¢@())Ńėõb¹Ģžʊ’’’’’”} "£ŃXZZŠb e]QQQee„ŃhLęƒüü|œõnŚ“ ×ėõbFƒ_¤Õj)„‚ pQ( Nąh4 ÜöéV® żöÉšĶ«)…žž…Ć‘x,6nÜ8^ʇBĮŒŒŒd¶¾¾ķEĢ.ä÷ūÓ^qŻ Ģf6›Ń/väēē㟘 ćõzėėėŃåąõzŃoc³ŁŠÓ…. §ÓÉ.įńxōz½Õj5›ĶØS',Aˆµ]ˆ^ÆwéŅ„āoŠ…3¢QTÆ×£•ClÅĘü24Šćd’Nų™ ł‡>ś֐ˆCµu‘ʦöOk ę/ŲśöĀ­ļŒŽ¬1t³;æßĻžZl°ˆ){\ƒĮd2”BABS,øĖb±ąsF†¾hlÓd2•––2ŹtϘL&±…|8ģEįpų™gžqoyó­wŽuoy“MźŪŚŚŹĖĖ;::NUUÅuŗŠ† '[Z’’¹·l¹’¾8xšdKĖ^Æ÷•W^iX‚„ØTUUį6Įˌ®%%%F£±­­™X ńƒJŠ-Ųö޽{şL[[~ łłł„„„ģ<łīÖ×KĢ.T;mAĒžźŽŅŪ¹øż@©Tj4šH8Ģq$=]‹Åźźź\.Īāłżūõ……Ż7ŽŲuēūŌ ęĪĶ K-–}ūö^õX0hXp­2;+ū¶’‘iµ2.wㆠ×/»di-?CqšEęƒyóęE£Ż]„ńć3ĀįȬY³ X­‘o|ēęÕÆ¾ņJņY×\}.jµŗįȑŁs꤄„ ‚šŁgŸĶš5+9tU<G‘-މV³3¶G‚ó `ŠJvfąĆÖŠś†AØXr ėŠ`;UUUŲ¾ĖåĀ’öūżųžŲÓ`$Høpø\®qćʱŁLŸŻf8³aŽ1³ŁĢ,žv»]¬‹ M£Ė©Å˜4Ū_ø¤×ī=Öoæ?ūJĄÕŌ³sc”*;{įÖwf>ü ¤ ĄŅ„KSĻ `cüčPõi° OUUU/”—æ·ĶSżÆžńĻ÷žyꙦŚZŗiSWWWNNĪG{>n>ŁŅ|²eŊøŃ|²åžūøćŽ;›O¶4;žę›{óĶ7Ūü~ PUUõĢ3ĻƒĮ”3“‰]$Œ:`ų\²ļ #劊ŠŚŚŚŠŠ6} A9|ų°8Ņ·YÄć^0Š„­­ÅjŸ]G~ńČ/?*üʉ¢oc„FW“č°”Ļ7xփYĖĖĖÓjµCŖ©IÉĆF/Ün·ŃhL0Ō$¬0ƒ3zŌM1@ˆyژõ’Rœ˜!ˆYP®Óņ޶ƒ>įʦĘ’ŠQ[ēßµ[3gö¬æX¼ėß#tq ‹Ž4ū^f½s͜N§ŲfĪβ#Ā^Z­vŃ¢Ež¶¶Ö–f^&›0qBīģ+>ū쳦¦¦»ļ¹§ĻS"‘Č=÷üŲSµM«Õ~õ†”Je[[ŪæžõƌŒŒk®¹fH_ ˜JTĀ(…Åb©ÆÆO°6$Æ0#®“ŒÖ!“ÉTPP 68$‰ŗŻī‹ŽÄ‚A\c å½mŸÜco|ń'ŠžaƂł ł‡Ļ–®CO~rŖ0V9eL,vŪ0æ½ųÕ³ŗučÄ(Žźźźõė×B.¤Ÿ²A¼ēÜÜÜÖÖÖżū÷Āeeg˵ņyWęŸ8qb÷®*•jņä)jęɧž:xš œ8~¼µµuÜ8ƒ%K2'M"„“µµmŪŗ•ĀÖNŅé•4F%Œ^˜Ķ梢"”/X% ÷£ 3cpҳfĶōX,–āāb”MK—.E‰_PPü-ōēĄ5čŪ?­żxÕwĄ°ąŚ ×/SfgMX¾T•#³°čzžż~’ōéÓķv»8ā‘-„'V«µøøß®ˆŠēŒ¶¢¢¢­­Mœ»\Rś¢éˆÅ‹ēåå?ÖTļ;,Äć „Ņd2}éæ¾iņdBH]]ݶ­[•Jå׿žõ!µI06€± n·å ōµĀŒxe1“a¾Ree%ŅFŸk&£żÓŚ=ÖoļZ¾"Ü؈¢_=;7 €äNĀ17???A±cY±h 3 ģ˜źźź>-xŹ —ś— śm/^¼8##ćĆ?üO7{źŌiӌ<ĻOž<™ć9žćyüž‡ć!Ķ'Nģßææ¹¹yŹ”)Ć H0f€Ę¶®:+qœ:ƒėėbŽ[SE¼TYŚ@cÅĖ-[«®©|]¦ÓvŌÖ@ø±É°`žā]’–ą¼ĮāŚÅ“}ŠČŒBčģ1}z:1'yÕŖU„„„Ø - į(++kĻž=Ÿ}öYSccfffʄ &LŌj5Œ NžŸÆ©©©ĻÌFc~~¾Ä’ĮҦ¼^/.ɒ¼^ō.‚Ź8Ö?k籓Ʉ©<É+Ģ¤Ø ųw}4yUaø±é³‡~Ė—Mø~™ńž»Ō³s'\æ ŠK,aP¶xŹļńx@Bš*®äńx{Į2žēPĪśbńc…Å‹/^¼8 …B”ÖÖV\ā&##C”PdeeIƒCB§Āņ½Y®āĄØ®®f’ÅUdóóóY½žKä¹¹\.äÅTV˜Ӏ*;Ūæk÷nūز³ ęg,_ŖŹĪĀ$2ć=wIcr°€Ó¬Č™°d4Ž||wģ§‚‚‚ŠŠŠžlAhYĀ ų¢“ĶP#ŽÄÄ Õj%Š'0ĘĪår%,¤ž7ńōܼIŁÓ¦ĻĪ€yó—$œŲ ®Ūūwp¢±įpķžĆuūkjjjjjŹŹŹ°śl*äQ ĒƒV\{RlųÄöOkÜc46]]łŗaĮ|^«E€¹O•Ir(Ąź)”””ˆ©בF­Nüā° éK§Y,–@ PXXČ ¦²Ļ»“3ß$HøX ƒåÅpݲóę/ž1{Žy4Ų ģßżĮ¾ŻģÜövsSī4—9ĘLIlMŻT’iĀõO>Żņ^Õ5ī×UŁŁXLbÖĘ_L^U(Ć”†ĆįĄ”Žµ÷ūüLØąs¹3‰$\̹-Śy`znŽŹ[ļXøģFN?X—8T»o«ūÕm[^ķ@Æ×cāĻ„ć`@’pė{Ūf>ü€L«Ż¾ąK0攦ŻŅžiķč]``”ņAźį”3†F$‰$Œeų|>›Ķʘ`YįĶ+o½ćü“±ÕżŹ+æū5Ŗ Č ƒ¢7nllyÆjņŖ•±Ph×ņL8^¹Ņ É|ąõzÆŗźŖņņņĮņK| aä~čõE&Xż£ū'eOžK‹YĮh4Š×źĄ)ø±QĢu­SĻž=įś„R”‹;źĻRŌ'0Vxųū)ń„afŽ£Ē8ožāŪÜ0¤:Į¬°ł±uhA*))a„F»BPsŪ"MW<éœpż²ĖoŠĢĪĶ.ŗER$H| aÄĮét®Y³ŌZ]Ɇß^·üʋ9^łŻÆŽ|łYČĻĻgkł:@’šÜ§œ†ów.æ! Ķ|ųÉ?,Aā #~æßn·cŃĀe+J6üv=Ę‚}»?xōŽŪ:BA½^ļt:‡ßV{`žać=więĢž`ž’x(d¼ē.ć=wIža Héd`±XŠFtūƒVŽzēˆź^{0šhÉmūwo€Į­3čŖ@Ė{UčĄ8Qä€ć•[4³s%0XąĒv …„‹¬ŅUSS£Öźϼöå«FZJÕrėź ‡ėöWWW‹×[tõi-§TpJåö_jū÷ŹģlłŹX08ńĘ™_»A¦ÓięĢVLœ 4 ’~ a¤“ęOŖµŗGŹŻÅuœ:¶ŗ_)[w/ įā“ē‚Ėoˆ46aŒPĶmߗiµ“Vb)! †²T>ģ–y»č0‰ ½Ī–L?=7ļ‘r÷q €åÖÕP¶ī^ōs\,JØ{h]Ė{Uč–iµ1­×ČńiPIø˜|ąv»].ז-[FĖFLļ–ˆA"ƒ ¤“É4lvŌ£/vķĘŲP’®ā”Pǧµ°ŖpīSN)c@Ā0£{®ĀŹj ć‚ #vŽź KvE•ßét^‚EGp)×Qa&J3„žŚži­×GS‹nIż*xŠaĮµš9³Ń.4iÕŹÜZŽŪ¦ŹĪ’üĆF Ųķö²²2čMėĒ‚y£āNpp$½^…ą„<ĢĄń3JÉį\ūćm[^ÕėõXbląƒcĮ`Ķm?€kÜ:»ę“k·*;K•q¢Ł·żĻ̇§6 .— )Įjµāā†6› }Č«ōĄhæN’š/@EEEk×=ō3Fp¢²'ņāhÅĖ5·}’x刅BŲµr7žbÉī¤ĒFČÜÅb±ššš„K—Z­Ö _\lŒšĻēĆhŠM›6›»ÓéĢĻĻO^˜TĀPĄķv÷Xyb“ Œyó—ÜtĖØ7'O)źZ×ŗõ … £¶®å½mH ]µ¾· f>ōĄ‚­oćŠcŅō#^Æ·ŗŗZ­VÆ^½zåŹ•°eĖ–éÓ§;ŽK|śČ€ĆįcIt¢–€S<\CJĀŠGĪźŻ?J}Č}bõČĢŹ©ÆÆĒõÅdp¢ņäć[·n€™?0kć/f>ühęĢ–¼Ä#Ø \yå•÷ŻwßųĆĶ›7ēååĄśõėM&ÓIH¼8|ą÷ūŃR”pM/ż5"Žßß¶xgź÷ßl6£Õ(į{–0øp8õõõj­ī¦[īK÷„ŃéW’č~?̘P’äÓ}’„›Ą°`žäU… Œ|>X¼xqVV֜9s®øāŠ7>śč£™™™@ øøų’u*phĶĻĻ KQÅ0ÄūĻZ0#YŠ!$łČä8oķĻ,įĀį÷ū‘nopĆŲ°‰±Üŗ:ožā@ €³„ć•[źŸ|ŗæƒ»>’ĘĆčĀkūż{NÄL&Ó¬Y³-ZōüóĻÆ^½Z­V_²Niš¬>ä>'ąĆĘż™@ɧ›Ķf£Ń¤‚!‚Óé ™Y9£=¦Ø? {¼¢¢¢öƒ+^ų`t!Hį@i0wīÜ×÷ūæõZż7_õłenn®Ńh“Łl›7o^¾|9\’N 0•õ@!}ĪŹS<ଧą­IĮC4¶¢]eLbŽü%yóĄ«ļ¾{ūO‹wżūŹŸ7Žs—~ĮµÉ£ AĀØ€®×Ć’aCēĀgæxüƒ“rĶø9sę\vŁe÷Żw_YYs*˜ĶęKÄ©Š# ŪŚŚ’K ń˜ņŠ“ḟ$ŹĮ{GruūQMÅÅřY9›’łń¾Ķ[ßz“¤HÆ×'ϱņDGm­×G‘Ę&^«]²ūi`Œp †@ °sēĪ…Æ†Ī`%·~é¤ļäŗ»»›ššN:µcĒŽēž{®¹¹ ĒŲ®zĄ±4t×8U·cļoo§Tt‰Ÿ ż]’Šr°ÜzóŲ¾Ķė–ߘ™•’'‰š9³§Ż’»qĆĀ­ļ,ŲśvīĘ_„„1Ā '''a0"¬yēŲWŚs"6}śōY³f]żõĢ©P]]½téR›Ķ6† ÜY¦öē¢"ō'Ž Ļ·ģóų?Ū5(óżsņEK:ų|>¬µ¬šę1³Čy&ز³'\æLŠ,łćt:Żö#}ʼON†æõZ}qå栜5kV‚S”¢¢Āl6U§700qĢ‚Aσ<Ņ' G޼W‘pt*ż“$žˆ Ǽł‹'eOó7‹œ·eĖ–aĒćńœGҌĒćōīy½Ž16ĘŪ™;wī³PųĒķ Ÿżüńķ=N…Ė/æœ9ĄXu*p)ĪĶI/ĪćŖńYŚiy'’³-ā?įÖ¦C•O¢ §įpWł GžōšDĆĻĖ/å&eO›ž›C»ģp8¬V+ž×l6Ÿ“|_ŗtéy§^ś|>BH²č·ŪķC-õ¼^ÆŁl&„˜L¦a gō@s8Y–œł_ņ›ķ- Ÿżü/µķS¦L™3gĪüłó7nÜXRR’™™Y___\\ŒÓ. >čsŖ>°¢ĄbRc‘ŽÖŚ5×¼sņ?ļŖŻ®7åĒ:C_üõ7ŸļüłŖą”}„ćåā'›;±^sńAæä?6°5'ņę/¹Dnłŗå+ 7TqHÉPø°Ē°A †¢¢"ō#ŗ\®įLį4 N§“RŠö‡śrH™‹/FšhR H 4Ö¼Żų•ŠC{NČFć¬Y³¬VkYYY‚Sal˜øsµÕ Ģ%„ō÷+ ·‡?9žńßæū{ļļļhx’e ŠšŽ‹;~^ŲyĀļwO]čtžŅīļw•qv ”—ōƒaŠÅé¹y—‚±Ģ7l¹ƒĮf³±ł~ŸkÖś|¾ĮŖÅ‚õ]$H·ó»;e`£“ÉdĀ »Ż>œ©BūūŠ€…\öž?AuįĄÉČ·^ó}߯€™ sēεŁleeeĢ©0œkź]|{Ń9ۈō“LĖļ¼²ų·WßżĀ¶ŗÉ3&*s.˜1C7×<#£ė3߆Æöó›_,m«y?é:×ö…Žö®—ŸŠ=±–'ķ ¦q•tJbzŲ€Ÿ:ę_"˜7 a³§ūż~\ -*ø,Jj‹Åb³Ł¬V«ÅbI°ē0±Ž–ĶøŃ"„/Īķv³cl6Cńx<ø¼ŻśõėŁēļv»ńB©Ė;BˆĆįøźŖ«Xūf³uģ6c‚į7Į#ßL:5‰§2ė³Ā?¾h_ųģЌN³Ł|ß}÷=śč£Ģ©0<&Æa/:W¶Ÿjüā ‡_øAöÉ ’+÷źĀĀŁ+nšöß_ŸŗāÓVŻ|ŁźŪ.[µjŅ“ ņŻÆ’ݽĶī§b]ķ©_½ė©ŸĀæ^!ŌB'‰ĻūŅų›‹%{Ń0T3fē]Rwü7<åqs,øb³Ł‡×ė Pœ³;Ī„2”V«5`'½^/‹—7™LøĀ¾>Flācš§‚‚‚ŅŅR¦m ¼Š9Én·ŪŻÖÖęv»Ńöåv»‘N, öĮļ÷×××'\†Ē›“““ä? żź §¢ōńķ'Ń©€å,‹Ų©°jÕ*v£²ķEē*ań!Ö}äŻĀū*²sŌźĖf@< ń0„C4L…(„q <Č5 Ź ¼:-ofšŅ;rØ­ü”4Ė÷4W,JéJ‘“ ¦p*(#«ī¾ģ›ß;æKøż`ś¹šA{0°sŪ[ĶM ™Y9 —ŻxįŎöķž`’ī ·¤„'ģÜövG(™Y9yó—0»ė³ĶKŁ2=7o’īķ^ƗĶp‡ÕÕÕ8ŒĖĖĖŃ„\SSƒWDļ%ŹM«ÕZ\\ģółŲŗ¶ƒ!??UŠźźj±grŹėõāJé555‹`üÕd2±5ÕS.°čńxXĻ‘„,K}}½Ļēół|łłłāåxٲ%C ošä? ż( PFākŽnÜüQėśe“›Lęŗė®{ć7Žxćźźź«®ŗj4.ä.KEH]ĪB¢ĮĻ]÷‹ż'gV&Ä;iėg DśxŌįVÕ’e–ĢpÕøüėŚgąkwė—~¼ø~»Gµņx{¼5:U’㇠ęk$=œšūż˜Ń“zuė­īW6?¶®#Ä?ßŲ?Ŏöļžą•ßżŗO>Ų¶åUü‰įö7¬¼õN8\·ælݽ¢_~7ńĆe/¦ĀOØ µ»  Ąćń8»ŻnµZQ‚7Žż*>ō˜m`ń®„żH^ÆĒ“ ” Ų1\i—dĒ‘c6›‘®ōŸĻWQQqųšį”½=¬–yĄ”~LC$ĮLtś ’„N†æõZżW/Óžß²I¹¹¹ćĒ_¾|łsĻ=·sēN\LÉn·"æBJłhg-wڌsņč'æüvŽģ“ĢI čh„p Š3Č =ŲńĢŪŸ:uś9€ī&zģļō?æŃ-ĢчŽ÷jųėwįõoĮŸæ»Žß=õg”ˆÉI[|āŌ /JdpєƒÜT•ƒ}»?([woG(ØÖźņę/^ølŰuuõīG#ĻęĒÖķŲśVCÜžąŲæ{ū›/?“Jk™ĆčŠĖ™ĶęŅŅŅG}tśōéĢ©0ZbR¹³Ī÷SÜ į–¦ŗ_ޜ›HO@,4ā§G(üśĶĻņé®ģ>qś©R pz7ćjČŗ ²Ģ0åJ˜<ĘM¹õPļŁżüĻØpŚcÜq*& Ÿ®–¤ół:åæ6’rŚmžūĒĒ–oYūċĆČĄ«$ӕĒć_W˜†y4vfŃ¢E ĮØx’Bł"&8ÓX$žžRČ mšŻ®7®ˆÖ1 N…/}éKO<ńDII‰Z­®ÆÆ_ŗt©Åbł™}Ü`5w~ŗńÖܬv™* 4Śól…Ž€Ą‚«Æ¾Z;!ū’ż„ėxs‡čW †P©@©„ Ti RCŗ“0ĮųQ݉·žąb§ĆˆJŽĆ7†8ŁÉĢJi²|¢ńČįŗż8UO°É¼ńŅ3·åź•y..\\ųpqįV÷+šÜ/×>\\ųÜ/׊U ēŚ?\\ųŹļ~%6FŻž•«W/šłĘK}OóŃR“÷öž}J÷2ĢĮµ(7 VRó÷Bü<O‚Qˆ™•***’e=¶ÉęéČ É¦žĮ’\V«uĖ–-ŲUÖ&źƒŁ”‡8,jp4pt Š"żv Š3Ō6±%dzōмx­ āęīgLu)f*4}óUߞ±Ė.»lÖ¬Y7ŻtÓęĶ›WÆ^ÓˆéÓ§÷¹üź䃿æ¾kFz“\'Ž&« (˜²Õļ¾ūī©S§‚Tū×½Żācˆn2Č ē’%1ž¾’·×æų×{Ź4ąå=R…h$ļąxI2_LLŹĪIi`ōN½.»Q¼= č^Žæ{ūŚbk{0€R{’īķčļ=\·’īķH'xŹŚbė¶-Æīß½żPķ~ÖTŁŗ{››:BĮĶ­;Ńx$¹Ģļ-Ö×īåwæ:\·_­ÕĢzŻlrķv»ż~’øqćPc`š”ö™;f±Xśt X,4āć¶ÉdJ–Ā6›ĶķvŠéĘb±”——[­VB‹ƒ2 ,ēz×ė]ŗt)f/«–nlŒƒē4•™;wnC ū “f<ē7™ž k?Ó@pYēĮ[[’ś@÷ė?!•·v»Oq‹c{ęEk ō :<’ōŲ—>lčüÖkõö·ż‚ņŠ+®˜;wī­·Žŗyóę… @YY™Éd±+6Ź.¼ JiÓÖ?O8āIĻ×9mź óMéÆļ‘qmgаJ< (PŅŽŁžĮ_’8r”Ø@¦SI€HkCsłŻ²ć^PMī>Ѥ˜”%‰ę‘ ɓ  æ÷¦[īXż£¾·ų²ŽPpē¶·XTēDćō/\¶bå­wŖµŗŪŽīQ)Ź*Ō:żŚb+ģÜö6jg·b=¶Ži#'«N, ­V+Ī%Ŏ±Ō¶Z­([Ł—(|}ęś²l°ŪķāXUv:».ˆœē‹å\—«J¾b‚Żqū'*ß8^¹ÅxĻ]“W¦xŠ^Æ?p¦½Ź’żŅԊ¾»™ŠĄĒ»}ģ7ß÷Ł„+µœA J‘)»¹ŗŖćĪ[{œN±ōښz,NƼóEčÆÉøżšńyy†ĢĢĢuėÖķŪ·ļ¹ēž;|ųšš5k0~w¤UĻ>ˆuZ^xpμt¢āįlękWhŽ?Ņå©UBŌŖ(P‘+‚ē@ÖcVŹo:ŗćo/u:@1 sV|jycß¼„FŽ?Øšš’‘dīØĆ‰Ę#Č×-æQ£ÓēĶ_¼÷ö}»·Ąh Rku%~‹ŌĀųąŗå§5Œ1MX¢#‘Śƒ’żé#©œ„Öź:BAfÖæč DŸū].†üŻ„½^oBŽCĀ|8ilśģ”ŸØÜ2ó”4sfÜm˜:ujƒ?‘žyrÖ:Óßæ¬łāżöĖQ¾?Ū°įę'dÓuœ’>ńŠNÆNˊĪX:īźNž¦žŹĒéW&Q`Dx|ūÉ×öūļ[2ń»yYz½~޼yļ½÷Žę͛ѩPPPąr¹†Ś‹>¬|Pūōŗ™€ÓĖéS3 b%1ņóėÓr³ƒūDWšå½Ž„Ą@õB€Xõ'ĶėžŌż­(IƒŽ |żöµ@”ūó*å@£A2~ž\4ҁ>Xä6 gJƙšÄ‘ŚA«ŃōŁy瑸ŠÜkDšž›Ē¬OĖ­7Ļ›ædRvĪ+æūõ›/?»śG¤Ņ2†ĢŽœøO‘W\\\^^>¤ęųøā|`×GÆśĪ¤U+g>ō€¬Ÿ`Ō{rrrމ2]|yŅgļŸČĮ”ysYūņ“ć/~wŅ1yŽšš\Å›ėųķMrEčŚoÜØūēŽ×Ze"A×G”źŃ`tĶŪMÆļ÷ß·xāāĖ. …Biii×]wŻ+Ƽ‚™ Ó§O/))Įp²‹ž /ŌŠh•ļrĖ3=Oķ 2JĪŲI(h(÷ƒ¹šM_3̘Š$P 8dd$¾ż?Āo5¶€ ā20~ÉŖŸ’„“Ė€ŒĘƂ|Öź“ĖgŻGÅj.©’§?½‹ é»ĒKc‚”»Gf»ßńŪ·{;2S²ÄgõųO¤‚‹žé:ĪžJæ™ĶꏏŹa( 7BUĻŹ7v._Q’äÓ}žŠ>ķ±3™ ŻšŽņM抬ųR{ķJĶ~u¬ć'‘÷dSӀē{,qŃ? Š‚&Ϭ-æšŗ7I9 =4#B²Sį‡?üįęĶ›qINt*Œ„§w”|pčĪ©ćdœFÄ‚8T—!@øž×Kź ”#ĄsBõ^a«‡hA9C9÷ lH›“ģīĶ=IB&ŽüŒī¦§ «_ɲoŗē‚õa0Ü{H?~æßĻl©n·{8ÓÜ1ąĻįp`ÖĢ]eĘģyØ"l~lsē²”`œ¹776ˆwś–;D~Büu’īķ,)Õ!Z»oē¶· Ļ¼‡Ć½~i¦ĒŒ ˜Ķę$Ȑ¦O|ÄC”ś'ŸŽ¹ü†–÷—³Ęd“œ¹āµÆ)łWŪ,y(ö€łmsO*žxĖ©w T\ŗœōLgIļæ^JØkk3łĒĖ§½ å“!„ż·Æ˜üמ»āf*äåå™Ķę7nŲ°z—l­|ĄŖ^‡·žQ¦—Ÿv#‹učeŽėłG8Ń6ŅBzr=(U5Ā i2nœ<#[™ń6·ōšoÉÓƳ¤>Ż ¹¶P{ķ—«bvŸē@ €"rØy›% ĄŖU«†3 }ŒR?ŸÉ¾”ēū˜öÕ ®-¶®Ģ›xūW®†ŽZ@o¼ōģV÷+h>Bƒ>&lŪņźsæ\+ž³/+¼Y­Õ€ż[Ė..ģ/“4Śæµ SįҘ·ŗ_u®ż1z•Ļ{UŸšŪ¾’žģ+q6ŠŪ5·}źŸ|šmūwķ~ö•ļϾR¼ķßµÄŪRSē×īIF¤±é“{ģ5·}?yÓӕģč鄃'k-2! a˜ÜÜņÓųßyƒ‚ hbM$ßbBē_Ž]żģ?›ĮWyĖצÆ$Ÿ$$©‰Č†žyiįńķ'’»āf*äååį'ŸŸŸ?Šł„sąÓ=Y|„ÓÉGN3°'@z €ĻŒ9rd½’ų^’@V8Õ,ģ8HŪćēĻ“t™2[yeyć/ā~1õ^]8XQÉ Ż`0°°9‡ĆĮBA0>zKK&¤#byHÜv¹\ g±QVņ—MÕYk)ƒ£‹-łŠ«ÕŠōūż ©1ø¼ų¹>ŸŌqŻņK6<Ņz·?øA­Õ±ź«t?J䕷ށäńęĖϊė§NŹžöš/ā,>!Žt`ĪĮĀe+œ®J0mŪņź¶-Æ"Ó<\–ŅCÕÄh4‚„Q‚X0 †Ų<ęĪ{ 9r¦Čņ§ąµm‡4M HU1N«č!fŪ`Ü N®:pąĄ ’ź äȟ_ŗ®U%DDŽŲņ l;‚^§Āö#Ē ‚0, ¦²>#ÉĪ^Vū۟ę|üŠā -—.ėIšĘ& éł/O€ć€'ĄsĄsĄ‘žźA8ż_J¤éų„ߤGšč©nźėćŸ5ł? x§u׆hī×īøį±ßŸ%8Žõėח––žS\³Õjõł|.—‹…p Gƒ¾].žŠœAŁ»w/Źt܏ł–ģÄ«®ŗŖ­­Ķ`0`ō·ų,æßætéR4L-]ŗtÓ¦M˜;J),,t»Żųg*ĖX;Œ•ĄLč žät:ń0±"‚”o©›ŖšŽŌZŻ+qʰ‘ōfY­V6•öūż6›Ķ`0`ł,)®†Ė c„0eē3™Ž¦˜]Ķd”VɝĮš6ŠW½ūbÉūš;÷]¼”‹‚ Œpd,_ŗ`ėŪĘ{īJ9eĮ¦½Åģ¬ŪĄqšż.įyB8PrDĖOŅį(¤É ]j¤+A%ž_4Aį½Ÿė‰šį•Šk¼reՙ AB9¼30w¢Z[[[[[GĪÓHĀrę[!t˜Ö½?ųwīŹļ“¼»€W±_»N6ńĮ’©éŃzXQž9 ä2‚*ŗ‘)Šœ?m\((=v€L iDčyø‘ ĢY=€hˆVŹÄT\–ķ6(X¤¼x‹ó>+DƘcØėˆ%wĘ`0Fä ±õ =ēj¾4™L555‡k÷Ļ»dÖO†Ž`¤‘–S*”ĢĪŹŻų ƂłżĄV>8p2’$ø p„TOū”ŗäI½“dš=6pŽƒīn¢Lž§U/—!ŻS”@›’éé–+dUŸ–Ö}ēL…ąLc„h3שzźķ ŒAu2·d-™øŗb‡ĻÄ’“ŒÖ’ó“šÓp2®÷–{ƄP9ą Č9sDƲ^’×ėKč±#ń=ŸO\gxØł ĻĪ0Zb3\ō©œG]Iģü%„0ĒĆQķ%0šZķŒ‡XøõȀńAĪe³ūŌ”R @)Ļ‘Ou—ÉÆÕƒœ%rrōi‹€‚'rž(ä$MéJĖĆ y 9³@N@©(øbҶYźu “¤‚©”-Ÿ07SĮ`pD=ɳÅq<·üq’>F€6œŽZ#üżVho€šÉc ŽōD”~Šćˆ'ĄPpDĪżhzßz(·×šÄ÷R…¬×ķ ŅoĄ‘‘į!Ž éĄÉ‡ķ”0_+3ģˆ½Æ eŁ"·člč3` äĘ}š+Ž“ĻĪ$Ō³ōz½ėׯ?æl±‘ż—ąĶęēē®Æ.ŃĀ­oO-ŗ%ÅļZ\$ņśö†¹Ą×5ŒĆé,Č{’dA›Ń0Ä»ńD)„d<x%(Čä”r˜Ģm—½–lJ0é•<D£ŃĻ>ūläL2R°Č§øåS÷m“+@O„ip=²‚»īžX•sDlµé5Pq @Ö+č¹^o Rą(¤µŠžDeŚŁL½Æp3W€r<B2ēēCĮ% ŃŠK€ŃhDó ŒšO›ĶęńxŠį IU\0²ˆŲ'ŚķvŸĻwįŁa}v—*d¶Z­z½ž]Ėét¦>(ŃIÕī;§Ń‹ŪŽ–ŒE#,żgsēĪ…#mX¦"qJĆQį”‚f¾§ćĆ ć .€œ‡n@€ė™ūŹx¢”Óh ā”dNö¢GŽGEåŠÅO”Źݿ˂_ Wt *ōG9-3&ßs3•ŠėL†ozv> „Š)søE?¶®„]p*JƒqįŸ›čqJ0Ać“„ˆ€Œ4±¤)@.b*@$JUOö”=ʉŠĖœŠÓ‚@(]BŻ_×‚j&ĻMžŅĄܕ“­V+ -eļÉćńąäZ,ŹŻn·ųEbŌ&«',†Ųd/ž’›ĶęŖŖ*ÖK‡®ŖŖĀF°ŒeŠ2š5ÕggL&k6”pīnR«ÕZQQ±ÕżźŒŸ^|€IĪ—xźļĄ€X蝳#PˆÄ„`8öó›sś³Ą)@ˆƒJŃnˆąeĄ+pd‘ó‹C„÷÷ж£“®}f'(!Ś »„q÷%xCö‡).’hˆdĻśI‡²ĒĖ­Sņ€ŹĮČÉh9;P!DAĢ7’qŲž[ŚÕ”8ķˆš8P 1J“!št„©?HĘ«AĮĄŠj -­7Yü.(ŚC GJ9Śkw¢4ŠäŽt*K@ĪFZƒū\’§šę,‚Ļŗ'Yڊ·™“Yl‡o$tĀ}¶ÉĘw¦Ļk7kVTTģÜövŠ•AG·r°õ­ŽPPÆ×KśĮ(~5S§N=mĻ8mĢ9-=ŗćB[Wō½ÖiAtsd ā Ąń=B‰#@z ®×:)»÷ÖŲÓ.¾µ~ŅńĪćs #¤mĢ’tBććÓŚā ć9žĀČrōņh4ŠśĮč©oÅ?ż*@7I»‚ä^IL%õ“3aAŁM£UDf,"éd8“„Ó‡Ö7ärą¹Ž įz’÷8 TčI'ø‹Ē…’ “Lj‚'SfIšÉż>EŅšė›hnjnjŲ·ūƒ1e„Ę¢K¶HܘANNĪö†Ž$żą ”³[8Š>×<æDæS6C „‰J ¬Ņ)6ĀŹHH_ø’śžΰ‚å͉ß8Ņ”*vVoč^ų„¾pŗpxń‰ŻĖ9zEKK ŌŁų€×rS6 ‡~FOķbŪ!‡£ +hWw:„q†)”j=ZČšžņĻĒ_Ī.9U׃|0r"ÖĪ^æˆdp3Ÿ„®,Źą„@§E)'é Ēó„Špā”šTāńž@+*Pčģ¹ €B“ŗ: Ü |oŁ?tęŚcŠM!ėõPč)_‰’p¢”›÷å³µ†2äTB@_ō¶-Æö¹Jå˜Į›/?łłłR¤éh烼¼¼:ū”sāıø@ż1ž×ÜŅīæ¤ļŅ5ž„€\œ N†!*ąŖ-mm*'¦é—?sĻ×#ļ¢(KK‹ƒŠNåZ’«Śåčå ™?yŌšńWrK^å Ÿ“+įQ ”h„#4"Šn j•Ą wAK3œj…Hd2ąe@P„8Š8įtĘ”;Ż1 ĒRDāÄGi%įÆ=ū2xč?t/ĀČAø±Ńæk7–r 76bĶ,ÜXsŪ÷knū~ū§µpšŃĒjnū>ęßµ»žÉ§Ł)އäB’f³¹  zæ«ŹÖRŗ’ą†XÅ ·wŽqŁW/Óö7±ģ1é"PxDńß­T=ŌM_Ø„ūŪ@7tzą98x އ”+Żńž…¼N€īP™fŅ”Ÿk ¶ó­Ž‡žŲ¾ų-õBQć½| “@4=zōč(Óz®f2wÓĖdÜWH§‚“óTŁ 1„ ¢”Ęā  Č“¦•2ńdņD˜0ʏ‡“tˆFēA .@<ÖuŚÖ qčŠC”ˆ1€ĪDbD—Ff|)ÅNŽ -!ÜŲˆĀżxå–šŪ¾ąīh’“ī?·żą?·żĀM½|Ё]v} … ½¶’„Ž:_XźėDåļϾņƒłKÆÜr®«{čg},a'śŲǰŠšęĖĻt„‚,ŚXĀč‚Ēć1›ĶÅÅŁ@Ąh4åčå«ržü]#VŒčĒvD€Źq7˾Ó.WʉŒ|x Öļg?…Ķ_ĄĒA 1 „Āc*•pŲ‚ BßŽ{-j;ɜTwUON.V‘£WĄČ 6…s[/“—sßÜD·VŪ_"ń&Jcir9Ä"ÜDYOPiOhix9ķ‰ĀaP©€RˆĒA&^@Ąß Q Ż(å q"Qčh„Ņv·|8ž‰ū1©ĂA’®d:­aĮüw—“n­Ņ/ø6’ÅbĮJvPegéō,āaX0ßxĻ]ø®|ńyŠĢĪ€™=nl’é“0iUaBŗ¦fN.“¼W…$1yUaū§µużL3'×xĻ]Ŗģģ:Łņ޶HcS拊/˜?įśelæÅb)((Ø®®~åwæ¶?ņŪ±ŖœG ·„‹n ²Ūķ[¶l̳Į—FƒĮąāiš®mękūż„ŪŽ#B"+ Ąį>ä§æĀåߢžD­č’SöĹLPF@ ›‚²§Tm?’bĻ›ķ“ßź]~łLµć Į5U/€®®.Œ7½ė'²ÜĘ[n”Ū^£ūßS¶7ŽØ2gšAwŗ)Čd ć`ŒPd…xär𷃯 Ę)ć!N ‹ƒŒƒh¢q„B(„šw%…Ę Ücģś(cłRƂłš9³ż»>’iµ0yÕJ͜\śš9³ó_|Ž|ĄčA$ńg³ōq„_ć=w±SPś£©½¶®£¶®£¶nęC„÷XæcXpķ̇Hę†Ę_fZ‚fN®ų‡Ć±téŅm[^]yėc,7ķ•ßżJRFü~æÓé\æ~=žYTT„•fĀįpgg§Z­ĪČȇĆĮ`š»y†.ÓnŽsźńķ'O“«6Įɀ—•t-Ļ”w|ESÆęŗe@Ł’Žƒ8ōŲ‹8 ńøŠŌ)|śžcŅÆ“„2%0{ž9rųąœ×Ć!„™œūŹ-üO\ü’½•¾źĄąą4¤§J2PŚSĖH•]Ąó —! J‡X v“Ņr\xĀ1ˆÄ B§ ļę ōYci¤†{ž?ųä{cÅĖ(Šõ ®Õ/˜‚{Éīę>U2Ī°`žĄÓöóŖ¹7Ą„åKÆ|ńy,Łži]<jŻZ…tµsł u­Ćކ™¦…Üm7h±X  lķ½céeŖŻ÷ęĖĻBRāž„‘ \³É   `ļŽ½.—K£Ń“¶¶¶µµE"‘S§Nłż~™L–™™©Ńh i²ū–L<Ć©ĄJ-89ČU«O}õŻųō.™2†l‰‚æšŪ!†@ŗØ?"4Dž /ųO‡N$żÉi.8XĢīŠ”CØ»Œœ§—* i>a†N2³•y—&QŖ2qą9 h4 ÓĒ!–„Bm 4DĄ µ¼ĒX ½Ā1ˆD)¢Ws7Ü?–FꁻKvõ®ōmXp­zv.ć€ü_H„Ėą«‡:³>Mø~Ł‚­oĻxčUv¶×G‘ʦ•oąŚR5·ż@|VGm]‚#ĮétźõśĆuūS\ĘrTé­°°PŹAĄz‘ÅÅÅõõõF£±²²Ņćń\y啁@ąäÉ“ŻŻŻģČ®®®–––P(¤V«333ÓŅŅśp* –ĄÉ@¦EśĶõæ Ķ뜤‹b(Žƒ(@„ŅNoˆģ"Ó>S!čÕ ņpņ2U0ņ‚MĻĪ,n‡ćø¾Ķ5B“'“€ˆxG4 ‚=«P)a\ČP× ’öƒ¶Ēķ q€īų#Šƒ8nJ#”v ÜŹūiŚųŃī"nyoŪė·Qz¢å1óįÆq’é¢pĄPegc—&\æ õ͜Łč9H2żA¼X9KŽŽüŲŗs]ļ~dWoÖėõ’r0ņįółl6ŪŅ„K«««õz}ii)Ö„ļččhnnī3¦“RŚŽŽŽŅ҇ Ƅ  Åāiźwm37­ČŅ)9QA69(ŅA„Żx4ž‚÷ ³£ćÕTĮ@h„ T8}WČū*ż‰@–: I%ķtJZZZŗŗŗFŚ“”„¢ˆ…r¢Š0ķzZæHwļź˜½rŽ™ d P*“Ag;ü» >@†Ŗ§Ī„"@AʁŠ-Š!³Cž7ą\|ČC· Āy żÓŚX(dX0æuė¶ŽŚŗX(4óįшŸ¼LĒȄaĮ|ōLśYÆ<Į‘`·ŪŻnwuuuŁŚ{)w',V<ŗ°cė[ĢR$U3É@WÓéÄĄ™« ‰x<>šéńx<tuui4š~ „™”€īōs7UrŅónŽ¤ˆD¹(Deé^y 6H²ō§I%Æz+]@CCŒ° ‰² •°ćÆ ×æ$ś i|8ä2É@.™ 8Y®B{Ō“Ąž6h‹ĮØå ‘ģźY‹Ėe‡Źq`0 _}ˆėe‚ž(!a’Č!ƒƒ>Öųā”ŁY ·¾“}Ū-źŁ³'ÆZ‰Ę™Q©āl­źū[ …ÜmæĘż'¶—ź<\·ælŻ×>ńā(1‡j÷•­ū1 ©zŻH†Ėår8õõõPPP€zc±Xkk«Ų:tVtwwŸ:u*--M£Ńdff†B!B:ī[2ń;yśŸo;ń/B\O‰ĀAwWC4žč W< d ąåg |"b‚3ÖŪéÕxy+œŻ^Ō§„MŲIō)tĪ]ŻŁėā…ݧhüŠŠ ‡ŽĮŽzųēgąžžŖƒwO‚ĄĆ4-LJ d(žŽƒ(ĀAŒR9'Ø'uż‚z‚ ‚ čGTøQ,<^¹„ī”u ž3 ®͜ŁS‹n„LĒ+·$‹ ƒ×ß¹ķķē~¹v4Žo{0P¶öŽŽP0??_\’VˆBꮂŌ1S!S2%(5 Ņ‚R 2%püéj gd 'Ė«>œ#m僔ģEżńD¢Õˆ.wQlY)ļZŃNN§ 6 ŹĪZ°õķóH€Ą˜œQD d Õ­i,WAźų’Ł;óų¶ź+џ߽W‹W) dARHB BB‡N+˜)Ģ,OéF)RŗĄĄ£cåŃ…–ZŚa`ŚFy“)oĄJJ:Óbx ,—BÉB-‡%NXNāģ‰%Ė‹¬åŽ÷DZ\®dYvģŲNĪ÷‚"Żåw²ĻłåwN*•:~üxIIIee„&Ø0ļK—ZøåŠļ>čJHešIAkØC¹—#{ØĪ_žk_p• Z焾ōŗņӟ~Ć:ŽWÓ*3Ģ,0 ”ˆP"°rSŗbĪįŖžŅĖ¤ŅŁęįŗ\ÖOO7։›_S}nMµķŽ»M hwŸIH••ć6t“*įčĮż_½ē~RÄ8‡Ć~ææ„„l6›ßļ÷z½Š¢$‰ŽŽŽÉ¾ūĄĄ@2™,++«ØØ@÷Ńb€†æµ½¹ÆĻ÷Ū®=i^ģ(ĒA¤Ķ5ś„»ęü2Ų½{÷tü•/fķ_¤WnČk¤Ŗ¢Į˜^²2±ų2õȇB×ns×»¦ų~‘%Į P"Ø„¦ž²Ł'Œ‹cŅā~ń\ĮXn’LĀ0ØWø‚Į+ ‚0}¦ģĆ|¼Æ}w²ė źśU%<÷ó>ҵ’[üh&”~ŌžĪ÷×ø±÷)ƒiEnØĄēóY­ÖžžžžžžÓ–OØ *”””ōööžÅbuė]aNźpł#®ŌOŲ#€›Ń°<šLŅ£Ī;—ŚøœAEōł¤ē/IĪZæč³©ä€ŅߓMö¦³J’ÓŖĄEQ’$£Ńh4 ƒ$I¢(Š¢ØU Z­PŒBš¼™:ÜŲß¶}é£?ZņŠżG›H©0䵦ē;Śß­żń’™VŽ^üœ’žŲpį …HLü~æ6Tą÷ūeYĪd2ĒŽĖd2§<ŗ Booļ·VĪžŅ„ÖŸ¾yģßß>1,.¹ ČÆ žbq)ąsĶHū x“›™EQŌŁ iƒQ-©3™E1«*®śEQDe€£Vą¶Ā84ł$©„ƍM*˜sݵsÆæVW7”(€×ė•eŁķvwģ~÷ūkÜ_½ēž[¾~×tš­’Įw¶¾¶×h”M4}…B>Ÿ‡ ü~?ß±500šŽ{ļ-^¼ø““tJʦ *˜Ķę¾¾>A諯š’­•³×n>ų§żżŲŲ±€³™žÉ¦PT“¢·BE¾ö7™Lf³¹““}p•••üŠņņņŅŅŅ’’³Łl2™P JąW›ŚĀįʦLOĻÜėŖL Ųī½[[ꙉLOOF³ŻĘårE"§ÓŁ—čł÷Ē~šŠšź©­i±%ōÜ·?%*ƒŗŗŗp8LŹ`:‰D\.WMM ī*hhhĄ}ü€ŠŠ —Ė•Éd>ųąžÆyś8zō襥@EEÅܹsKKKW~żeŪÆæl[Tiüd A/»®Y\Ƒd˜fÉE Y,–x<FGJ°+ŽO§Ü¢(jՃĮ`Čf³Š¢ąß|!v€Ø’ÉĻŚŁĮn'®«ZńÆėÆŽņ żĘ© °ž}ÓÓ<-Ėr8~æ’Żķośn½öęŪļüź=÷ŸęˆĀ;Ūßxīēæ»żM°ŪķX “¾²i‚ĖåŠĒćŚPAŽĆ–.]*Ėr{{{ooļ…^8%CUUµ§§§ÆÆĻb±h‚ °õĪO ²¹™¦œžž~L6niĶž>D"‘‰rqošč 2f³¹¤¤ …²²2|Įm!7lp*±£p8<» —·XĪBŽ”±YT/b¼[¶ińł|h(ĄKĻ>õķĻ_łÜĻļķ9¾Ōw¶æńКźļÆqæ»żM,y‰DHL+Š«žśėÆūżžĀ g“Éd·Ū/æüņ½{÷?~|ŖœĶfOžŸÆ­­ ’ymõW&Æ—Ī–Šs[šžG›4ĮIśš¦ų«ŗcĒŽ9sę,Z“H’ŠŠnąE#ʱT×ķT€ŖPhÕĆ)žHq‚Įąš5kņ>ŻHĶmĒ6Å?śČ™ŗ±`Ņ,ƒ¦Ī O¬Ų(  tßN0ÄŌr˜·`ń-_æėźkoœæšüSĢ[[~ūÖk›·¾öŪ¾Di‚¤.¾ųāūī»oõźÕóęĶ[° ŲvX»wļ>räˆ,Ėƒa Ē_QQQZZšĶf‰D2™€7÷õł6<Š3ķŲõ„³ųę›oŽzė­0żZ¾3UU­Vk<ohh8óšŗ\®–––ŗŗŗbśßņ"Õ6>k^ø€BĒc"ŁÕµķŗąĀļS_‡p8 1͜+†KW}ę²U×\°ģŅ1 ļlćŻķo|Ōž.ƊģvYĄML‚Į ĻēCƑÓé¼ļ¾ūdY^¼xq‘_ÜąąąŌQ-‹ŃhL„R½½½ø}ś’ī8;žļKą…^ø÷Ž{§©>šūżõõõ6›-‰œIæ3hX,–h4:źsaF©XQ±2ōŸä ·}Š·«}ÉCŒćÜX, …B”6@×réŖką²UŸÉ{ā‘®żGī;ڵ’čĮżŚ÷m6›Ūķöz½$˜AÄb1ŸĻĒwŽyēWæśÕóĪ;ÆxwŠÉ“'[[[ēĶ›7wīÜ)|£Ńh±X$IĀ Łl6žĢ¾²7ńåK­š“Ÿüäg?ū™ŻnŸØĄķDźƒX,ęp8:;;=ĻÓ s×āńx‘Ęŗ‰ę×ܲäĮūόjt§Ž]ķļŻė+ŽMTŒÅ€D"‘1ķܱŁl.—ĖįpąßōÕĢÜ_^ŸĻ‡ŽÄņņņūī»ļę›o5ؐN§{zzR©”ŃhL${öģY²dÉŌŹĖĖĖŹŹ`8؀Ö@’OśÓ'žxĀétb¶ĖōŅųXUUg†JˆÅb.—«­­mT œé飿ąĆs®æöܚźŽ]ķ%ŃĪ*ŽXõ™l"1ēŗŖ’ŗ~2¾ŹH$F D€0EŗŸah7¦*(ŠŅÓÓ£k?YRRFūūū-Z4…A…žžž%K–@&“éķķ=|ųšC=ŌŲŲ8=…ķĒńaō®€¦ģL· Šń€įģeFæćvum|V»Ū€ & mኼA…cƒaļŽ½Œ±Å‹ŸžU©ŖŖ²,km”žš‡<ņTWWi—oŖG®l6Vž™qfA ØÆÆ»ŻŽķ XRee1¾Žh4 …Šęp¹\x,‘Ļ'ś7vX ƒŲć[–e|ĶÆ†A{\hYųOɽ/ o¤ąČ²\Lü?‹Åb1Ż< ĶtŠ• wÄH?Ć<ØP^^~Ūm·ń B6›µŹ)–SkooŸ={öé *ō÷÷÷÷÷/X°`Μ9Ś÷“ɤĻē{ņÉ'óę÷O ŌOŅÜÜl± mµŁlėÖ­knnV§7ŻŻŻ‡¼ŗŗŗ»»»Ą)‰÷wżńŖk½õā |®jkkUUՖ$“Ūķx£ŗŗ:°X,xƒS§+aŲÜÜÜÜܜ;łüÓ¼÷Åėkq:ŗ”vttč.āńxųĮ8Īīīn>>ųńńÖµŸoYzŁŽź[U‚˜|Z[[łīyēWWW·cĒŽŽŽŽ¾¾¾£GćĒG£Ń-[¶ģŻ»÷ऱoß¾ÖÖÖ}ūöå’£>Šk»ŗŗŗé9ÉR®+6b¢ĪĪεk×ά„¶½Õ²ŁżąĆŁD¢kć³…w„B!īC“eŁįp„B”––“Ÿ¼^o[[&Éįńńx< åmĀīt:qT²,ŗ"÷¾Ü Į»kĶ…”żēʍķv;“““ Żķv»17nÜøŃėõbĒć1¦ÕŠ }|ņ-`‰Ó€Ćį‡Ć<ØP__’ņĖ/ßyēT°X,…ūebœłŹ+ÆģģģśH„Ź€sŁe—­\¹ņȑ#Ų– ĒO$Ė—/Ē]fZćĖp555TÕÕÕ£–ļ&}pZéÜšD6‘čݵ{LgɲŒf 6„'J[ś:yŠKļÜ"<§xßĀśŚŚŚźėėŃAõ{¤Ėå²Z­~æŸw5D‘ģźźÜš„TY¹ōŃG.ŁS”:‚8ųżžh4Š/æüņm·Ż¶aƆH$²{÷ībÜA&“iÕŖUĖ—/ß³gOŽž ‰DāųńćēŸž%—\¢5#’Éä+Ƽ²~żśßżīw@ą•W^I&“v»½¹¹¹š(ҧlk³ōŃGę×Ü2—7ŠKŸĻ Ćįp4åŪĶø¼Ö‰TY–««O5К{ßĀ&só0˜]ŗnŻ:‡ĆÆ±Hą?l?€·(¬ Žv©sƝž(_¾Œ ¾Ӝ‘‚ »vķŠF£™LfŌ+ä *¼õÖ[ŁŚŚŚÕÕUüvīÜłĘo“µµķ޽;o†÷ŗuė¾÷½ļi£("fī¤!žŒ•ÅøŅĆņ “į‹F£XrõŌŻD}ķ»ÅŠŠL"1¾Ņ:V«»žņ¦›ųŽŪķīģģļ8ŖEŪŠķvWWWĒb1üDk6Z­Vķ¦e<ßĮSrļĖ§ÓY`fš#¼ˆ×ėå¹n~æmŽX,F«««}>ßHė¬ń—I$ģ›žA£Š 3Æ×ėv»qk-nŗé¦;ļ¼óĉ²,c/³Qƒ ƒƒƒ‚ č‚ĢX›±ļĶō¬G4‰ö®jµū§&©”E]].=Ēć9•Kķżń?%ŽßEk„1±?ų‹–„—µ,½Œ¦Ž8čč豅[ŹĖĖļ¼óĪęęęöööd29ÖK l޼Łļ÷å+_įKa œs5­ćŚ„żQ“)u–ĮŪī/fzz–<ō%GŽÉ¢Jvu-ņÜ>æę–+’“¦Ž8Ąš’ĶĶĶŗ Ā»ļ¾»’žb‚ gfØ`ņģƒÖÖV­†ģččČ-ŃŃŃ”ó¬åÖŚŚŚŃŃĮķ]9ķ-° C~§’Ömø¼=öźZĻŽź[©>qV~łĖ_¶¶¶>|øšY»vķŅ… ,ĖLäeōĒ汣lv»½””ĻøĶfĆJ>äÄ@ØV ēV[[k±Xģv»ŻnēE“±V.żĒŲl¶ŽŽŽ‘ÜD{üOōÓ_$芞ĖĻ’xÕ5¤D‰3›īīn]ł£ęęę;wöōōä|芔††æßļr¹x"Ē3’ä9ŪõÖJćz«¤”)`±Xp ļt:łė‘Ćrlüx>ŠŖŸuėÖŁķvś±ž(M°£śÖ?^u f;‹ f¹A…;vhƒ ŗPÓétčŠwæūŻ»īŗėõ×_ojjśÕÆ~…u_0T‰DΰbĻy™€zv~æßįpš-N§³˜D Żaŗ^.… ‡Ć~ææ¦¦¦££cĘ'üžv³@Ŗ¬<±åµl"qbĖk‹<·Ó®cā,G·Sįk_ūšŁlĘ]Ēļ÷Ÿ=Bf öAīÖ3žŽŪķöz½Į`Šįpä–rĖ%÷°bŗ†é”n£Ÿę"‰mŪŽvĒ7Ž»×¶{ļ¾šĮūķ›ž”i!e~æ?‰`P!™LbØ  žU+Ī1č‡Ća±XPƒAt÷sW>:|醋żņ=÷0—ĖÅĖ‚ęuY,^E.6ĢD}U™žžŲ¶ķĒ’&ąŸaß1>Q²ė`|ŪŽŽ]»“]]ÖÕ«Ø2A襠fϟń”‚¼ŒĶ_°ČZKK –ljÅb.—+ćvm^Ī”¾¾Žf³E"‘¼-r“eŁćńø\.lœ«K|>ߚ5kšKŗāŠ+,Ė8Ś·õījĻ$½»vg‰dWW²ė`²ėą`×A~€XQ±šŽÆIš`÷ƒĒ·ķX½eó¹5Õ}»Śzn7/\HæłQ`į{Ö>;S‹ØČÆ ‚IŖ\„śc’ 4¬ÖYø?Śüš[–>ś£™ž„fzzŽoiž{]¼¹ś/ūŲŠÆ:qŚŠŚōEJ[]µ“™ĖDUc›¦ś`Fsü÷ƽÆÆĄ«·lžéĖēLOĻÖėnĢ&¶{ļ¶Ż{÷ńßæV¾|)ŁÄé–,Œi’‰¤HuRUU5åŅ)^pĮ§’·‚ķFtO-˲ßļ/ƽqźgW’ä¹×_[ĄdY}ÕĢ•›‡›Žvńpc“TYY¾|©iႲeKń‘I§Ż6ŅÓ°ŅS‰³"±Z­g¬¾Ž_d$Ünwa‹?Ėų0ƒõv5*RWó“ŌqńKze.s®›a™—™žžĆM±mŪ kć³}ķ»Oüž5X±!põ–W(‘”˜†Äb1Ż/oī;y%lnāb$ъŽõė×ų”ːb µś€×“Ļ{Y¼īF¹£Õ=c ąś ‰ä>>–¼ąׯŗ˜™,JOeŌ¢ėfó‚X$cÄzv£™8pąW]ƒ5ļ“°fƎź[Ūæ÷żé\źyąĄź[×~¾eéeļŽó÷ŖŖz!“?ų *8ALÆz8šßīŗŗ:,tf³ŁxšÖÖVž¦ö7W[ ŲX,^ż<¶h¼T¾ĶfĆ­dü"Ēn·cQRmį .L- ¾Ļ‹ķóGą7åļ“¶¶Z,§Ó©­ ƒµŚø—,ļScI·Üāoüé“Ļ’;‹ÅR[[‹Ó¢LŽ™œ¬śEÓG`9¼¼ĒŌÖÖj;‘Ä±W·č”Öæćļ£>ˆ|}Mō_~>„,×ļŽó÷-K/k’Ž÷UUŻūćŚQ}ė”B$wˆ”°Ÿ Š`, ĒE”ÓéŌ6ģÓž²£tӞĆM=/ˆÉļÕŲŲh³Łt§šŖh \č#X‹„GīĄ“ā˜ßUEuuummmīSk Æå}jŌŗāo#Ķ[ī0·“·_ÄĮŒ4“Pæ( b-¬@  õźą<£ēøµW§Ąwr7‹ń@^wöFZ»,×ō“eo‡N$¼;Z^ŃhtT£IH+*l÷Žļ_¾éiŪ½w—/_Ö»«=¾mGē†'zŪw@ŪßųšCēĢi ŁÕŪ¶½wW;¼ķžā¶ėnģŚų,˜.©¢}_+C’E‰CÄLó14Š¢£­­ ;÷a鈑œ60¼Q‰Ė HøŻī\’ß: ˲Ķfć—å§Äćq­2æęėźUØŗ6życÕg¶^wĆįĘ& äʶm?•]lÉ®.¬.×¹į‰Żžu@ŪßÜyĒ7Oli€ņå<zn’\ūĪ%=@Ā…˜éąÆķ¬Y³cõõõ# Vt ēż„¶Z­¹—åŁ8¹…“Ś%Wąk^p³˜Ų'?}¬čŠæ†™•<ūŃÖÆ_ßÜÜĢu#+–C9īp8pI>kÖ,Lœ’e?ĀŻÅ@3„tVž …jjjtV‚īFn·ƒ*±X¬³³3ļ¤c… ~@ €ßh‘ó»ā_ø#€~j*+Ļ­©ĘÕ·yį‚Ė7=ß¶£|ŁRČ&ŁDéČÅäζ;¾ß¶71nl:ŅŲT¾l钇čŻÕžį£€}Ó3Ś×š‡e—Ąå›ž¶®^Õ¹į 0/\X¾|™yįóĀ"ŚŽĻwEP²q†Q8©4‰¬Y³¦µµÕįpčrX' —ĖÅ÷ŗŗ\.ŸĻĒK-Œ*Š±ĪŪķ_Åemń·SƗwźé¹yģ§Óé÷ūµūø„OדųZ–åx<Žę–°Ę ŹM¼Åõ>×i¹.#¼~h…Ųķö¼W.—«„„e܅NĶ .}ō‘bŅL„ŹJ“Ќų\ūĪĖ7=m]}XW_eY}•iįŻ)ƒX¢}7d‰ų¶ńm;“ƹėI¬Ø@Õrń£\ųążóknAmaßō V• 2Ōęź>Ź+“„B!§Ó9Rvf4åżĪ“B†Kgt!čNį‚ˆo³Ł‚Į ĖåĀŅjøź/ę0’§³³sÜ.^üm²grœöśyp‘īp8Š·S¼īŠƒŖ„@ę¬ĪØÉ½Ö@åŗ!Æ>@ƒ«¶¶6oLbTę^-Šõ±Ā Dk]7øäGßŃüš[,«ÆBA_¾lé回Ęcųk45>×¾“ŸN‘ā¬Ājµāź“KüE3ó®,q9Æ­2ÄKœqA4ķģģäśÆ€­Vt¾ ¼z8\.GG?Ž=WĮš1**¹öŅ‡?ĖĪä8ķ\Ż;ŸĻ‹ÅÖ¬Y …@ńä¼^/ߋXüöōÜaŲ š¶uæßßÜܼ~żśqėē _}£µa^øŠŗz¶¤GóUM«~‚…BčvFßK^a‚õ°¤±vłčr¹B”ÜXā ˚ɲŒ>Ÿ††.OŠVąńQ>ąU%°ŠZ1ņ4 2ĘÜn·ö.Ü’Į+,ÓńŽčÓ ‰?ĖĪd±.§ɝŗ,`Ģvā/“¹PüČŗŗŗ‘śYņµ‰Vx…¼7jmmÅ|a ‚ HA¤‚ ŅAé‚ ‚ōAAś€ ‚ }@A> ‚ ФP}Óh4Š­fĘŌÉsJĄFŲŗ^ ADńäÆ_„ mŠlˆ6}°X,^Æ;äŠWKqJś»pMP]]ķp8ĘQmüt‹Å°7ggg'jæßļółčŪ%‚§>Ą.Äńxźźź¼^ļĢźE£5k<vP ‚ ʦø2°ŪķĮ`pę¶ k×®§Ó‡é;&‚ƒ>ˆF£‡•A8žéž÷p8ģv»ćń8Y AE2”oźõzĻe.— ÕĄĘC”}ĶAEéƒ`0ŲŅŅb±XB”Š“™ćv»ėźź€ĖAÅźæßrsfEGÅēóŁl¶ĪĪNrAŒ kmm½āŠ+,K4Õ<Ō¬Ŗ*cģtŒ†åß1ŅūyŌžcĖv»=‰Š—MQČ>@÷ŗŪķ.ą)*  PLēÖ£JšÜĖŽtJ‘Ź Æ× mmm±XŒ¾l‚ ˆBś32GŻq6’ÜG™žWaš7GR'ć–ņŚ[6\¬V«Żn²‚ FŃX›ØĄn”Ś\īCˆŹX½RŖŖŽzqTu“ b}€5FŅ9ŠŹÜqśķ;¼ż„‰ÕÅ«ŖeDQ”>(FĀžb0¹’HĒūL%NžŠR™{‚ ‚§>Č]¹c o(·¦śŗ»žšüØvĄ8üEōAœV}0jpø€XÆX“ÜPZyčO[ ‡:T%;!ņļ•9r$ńчōuALŗ>ӂ]'ÖÉ8’Ź{ö½wxėKšįoÖļłb‚8QwLķŲ–Z{ļ‰-ƒ¹@1n¤qČ_aʵ¹v·~Äė;śŃīža°ū0€(I%ƒ±ć°ēWž|÷O›ŸYšŁ['F¤ÓŸ„Ɣl‰Č(œ@qśōAn„Y'…ńŸeó.t|ūߎwvŽ}ōvĒo’ śD –ŁĄž­»Ÿ~ø|‰ćœ+œFĖÜń ={ų`2ą>Ü& J™Ó¶š ‚ōĮDÉTyĪ‘w_N}żāåe„•r™užd*0@VRŅ©Īęī­Ļ§Uƒ`’ėsÆæM0‹æxņæĶžźēB_Ź@=–ČšĪ_B_'AĤ胑–ŪÅ,ó©_üIśƒē—,=ßxž> ĢŁ4Ø*° ¢`,«/¬>­¦$åČŃ#?ś‚įZĻ\ē­PÜ®·ģ« tCØŖŗæ·|Įć?ÆXņ)ś: ‚ &EŒ$ō —3bŒÅ÷¶~šĢ·—]RYāXĮŅźńvČōĖWćHX™M˜ūéyīof÷}tä§ß˜s×ϤrėčƐ „ ögĶś‹‹Ö’ó˜l ‚ blś`¬vŖŠ撏¾ę_qÅ"€A8¹Gåj€«ƒlDĆšń ōw@g‡š-eF»µæ-õ‹Ū¤UĢĘr0Ļ‚ŅsĄjceēč•I…”ē€Źnxš¢’QCß"AÄŌčƒöĮŽēfz?ų©Kę@ņ(0˜F Ą«Ūŗ¾±1ö?VHė×ŲL%f®*˜ŠoƾšĒŪ «@& 餓źWSIuį•ģƟŹRMÄÓiė§“2 ‚˜ &r’AGč©’Ö§Ļ“M(C6ö¢žŗµ’®µ·„/æū™ƒ (Cļ€ ‚e>›#ƬÅ0Ūs.€s.†ó.…E+AžĢą…łų?<ŸĶōš{eU!Ū›¢ļo2ˆD"^v2®IÄ4ÕĒ[’}å±y²ÄÄ_õėž0`¬Ōōä“OvvvnŽ[²łĻń?`ÖE H"h^'“½/üägjĻQAŠ$¹–ńTwŸ…ĆaöIĄåraĆ8N,s¹\ŪA!÷.ÓÆ×ėv»ĒŚd“šćŒļšAœfF÷åfūš-iÜq”īė‰>ī¹üŹRfÖh‚T€å -[ö )”÷enT4—Ķ @ž#ØBō£ö­’ń¬`UbL¬Ą»’üJę`«TvØ*œĀ†‡ĆŃÜ܉DÖ®]ŪÜÜ<Ņa±X,Ęb±W*5 ɲ\ ˜¹Žh4ŗqćĘÖÖÖāO™’k15ś@§ r ©ŖŗÓ’µ²(XEč(byPį+W›^xGéI–Ą@ŗG{“†ś@Q”m뫼ŽĀJ@IĮ9—,ąä›Ļüę~ @9y"ö‡W-Ÿū«qļA³Z­¼PŽ@²,c—ˆGMMM=—WvCĮfćÓ~M‚ &ƒ¢ź]PplŪ«ē‹Hēš™Ą†ż?* hĪdl¾±¤¾Fš,įp8w~“ӈ.˲vJ ‚˜J}P ”1/]·ļēĢY`f&TE=P™ęĻŠū®sKž’¶²Ń{āĖW•|"Ą 2HLM¦RēżzÄĢ š cš}é ßĄŪ J$IĶ(ēY«>?“‚ĮO”›ųNKKK, ƒ”PØ»»E•v ¼vķŚ@ ŠÜÜ\__ŅĶėõ:Žīīīh4 ƒĮÖÖÖ@ ŠÖֆēz½^—ĖÕŻŻŸj‡ŃŅŅ …b±˜Ļē«©©‘e築DP1Äb±––”§Śįįą½^ÆVÓš§@ ‰ØŖjµZż~æ,Ėx$j‹h4źółšMŻ £Ńčš5kĀįpww7WE¹“†¦•öš‘HÄėõś|>‡Ć‘;?|ńÜnw$ihhąSJÄTźƒv.Ģoß²X9.Ī22Ę>Vk‚OjzӒ2.+Ŗį C@ /™łæ’)ō²|Źøųw,k€Ažź=É30A˜]ż#f¹P1¬œ÷wO &ódLŠ×ėEW—Ś\˜¢—I« §Óép8P8¢%ŃŌŌ„×q»Żød…B.—Ėįp8§Ó‰'ņü^onSO¾øęƽ^ļH‰:ŗįįYx;ķańx< 9ŽP(„ĀŚēó…Ća«ÕŠGŗ\.¼‚Õj ƒ²,ėÉo„˜“Ükb`ŁjµęĪŸF<‹ßØż5AœNµ~ŃžM/Ÿe`f@`€’:ō’”w~ĮHŖĘ”¤€ŹėMfžy’ŻPn° dŪž”¾bĶߞåų+_Øp|aJ&Ėėõśż~”¤¹*A Jv…‡E¤Ö±£= E^4-|Ķ ~ŹžX,†mSó–;HŌgx£q—·Ī;?AĢ`}NÄ*»Ž.­ cü`X# Œ€06ü™:cą‘čO?õĖv3³é,«€ņÅęÕmJ’öćYOæh,ņÉBæ¼Ūķv8Ńht¢Ņøƒå/8Žį”Ófƒ ‡Ć>ŸÆŖŖŖ¹¹y¬* ˆ3PjĶ/—X™„5°‡ķƒaMĆŹ@` 2„!ÅĄ5¢€‚ЁØźńāß^«lk…ž;Ź$Uœg˜W*4æžzūß\ż…g^°,ž”6z¬ķĮÅUŁ›•‡eYĘčhĆЁcµZc±˜ĶfĆ7u~p\,˲|Š–ĮX‡‡Ųl6m†Uį}ī @,Ćš8ʙ;?AL-§“­wĒŃ$Q. pe ‰`Ą(É0üGƒ’’8¬'õČ>a…Mśfµō?ļīūŽōå/K7__yėg®ŗéŖ Æ4žł±o3ųD‹MĆą’œģÉāŅ|Ō„·Ćį°X,č ‡Ć܇Ī#č—eŁf³éĀČc²“£Ź;¼‘XĢł)ĘĆ£dńó0¦ł!bśŚź®_«½ĀÅ5`É_Jŗ,v™ÅOŗ‰†ĶT"HH"ˆĀPK5E¬…e³ 05‹V‚Ŗ?Źę/Us [²D“]PńiX–Q—õ…¾80铣y <ņ™›Ŗ=#‘H(³Ün·ßļw»Ż|Ń ĆAf<€Z ˜õūż\Ē䯺ŗŚēóa¦PŽĒĮ0/†0É'/ŗAb˜W–åH$’/’Üł!bjaZߋåų^å÷÷@ś[ö·Ā%wBé¹ŚO³Éžƒ__qĪbƒt~)“`(VŒqA@Ą ‚Qƒ‘”)0ä/R!‹*! ™,dPTPT(±«ÜĄdH«C§³pģXō9øō+£?OŽŖšūżõõõuuu#„±Ēb1m¤7‰`ŠŽö}\Ć¢7†ēĢpp÷2¾ÉÄ×įpE'?“ś¹† ÷²üRŚ‘hļ…”`Ģ8āćŌ]G÷Žīaa8“‹ļŒt£ÜAF"Ü@P`ŅrļČć·ÖĪöŽŚ#µSJÄŌčUUÕ®ķŹ–{`0•s„K½léķ •ą§={vö>p朋+¤óĢ 0`šńߢ"£& "3Hh€ ŻPP4ś “ŅŖŹä«ŁłvH§!£BZŒƒ)8Ō UAły“”‚ }ņĀUĀÕ?URS^’™ņŹ7Ō®?bzh’į}’Ą˜Č“‰„C EŒQ`’Ą$DŒ''1"ź $aȕ„/DAŻ·]=Ś Ģ “DP3 ˆÅ(‚ b²ō°„7³ek˜hP»ÓŹūo+/žņ‡zč?–Ž4¢pĒf\ ŒŒĘ QVĆq]ąZ”™śįõŠ; IĄ „٧£f4Ÿ 1īŃē3nü©\ 7 Ūq^ śż!ˆ³É>` „æō±¹Ÿf#$²ź”¤ś§ē³’łµģGa‘±O b c&‰ /ł‡„æŖ€ŖĖ@äń†į„TQ`ØPlU?Ų¬žüTŌĢYZxœ£ö[.,ŚøXÆÆÆŸ>(|b$Ÿ)с@  āęµqßH$ ß%‚8ĆõĮœDįęŸ@Ł…Ģh„U=–V?ˆ²ö0SUȧ1ʘYƒŽH§Ad d30Š ƒ d@†t6Ń`hó°VP‡L¦&ö«ūšÓÆ=ŚņGU:ƽ5"‘Čd';:Žé¶”…Bn·›‡µĒ×ėåØ>ŸÆ@nAgŠæ(Ū§ś‰r<زÄ/žŹd€$@wĘŠ—Ķ*LĶØ* ;‚Ģ Œ D–RH„ąd āqH‚Ł„%`2mQÖ*6Źö5©ź°­Ą@T©G{ŌżūaĪ’ÉxųX,‡;;;Ćį0ÆWŠĪķ*;÷ķ2·eiŒßļēo†Ćį¶¶6ŽL÷©ī:Zyķ÷ūµ)’8~"ni÷€ījŗqbj>{ŽKįX·Įļ÷ēVüʄL9F£¹óƒ&>øī‰ŠŻ4ŅÄāųMu“Ę łi_ųŽ‚˜ } –@ßAµó±ģ;·g£_„åǘQd¢ƒ¬$ĖRYUP0ĘD™„!Q^b€sgĮüŁ`­„ņr0A` Ø f²ĄT`S!£ „Ÿņ ‚&1˜V“ ˜%f9w2³?@+J°ürUUFčq»Ż:łė÷ū}>ÖÕŗb`8a†Ė<`ķčÜOł)‘H„ļ(FYĢÆćt8Üe‰žX4w„ījųD”PˆoūBAR/…Ēk‹fc)$ >ć\ U ‘H¤ŖŖJw5ķ0ųf7Ō=ŗ'Āņ„ŗ©Öž‹Uóš}ݤƒAžŌ8ųßAcF͇‚¤{3;æŸ~uYź„ SM¤žø }ßņŌ·>5šłąM ūæ¹$żĻW¦’åŖĢ/Vg~¹*ó_ŸĪ¼pMęÅĻdžßg3/żEęæ™×®Ė„ÆĻ“\Ÿłżē2įė2ü|ę7d^æ!óʍ™–æĪü×g3M®ĢK®ĢKĪLćg3/¹2/¹2/ŗ2ŸĖüę³é»bąž‹z“2Łl_ä>E]]ŌÕÕå}Fl£}ŻŃŃ”ŖŖŻn_·nŖŖ§¶¶VUՆ†§Ó©=×b±466āGŗ9ģīī€ÖÖVtø577ō©Óéōx<ŖŖ666ź.ŅŲŲh±Xš“·nhh°ŪķŖŖvttčNɽÓŻŻ­ŖŖĶfƑ8Nœ~)ݐl6?ŸŃćńhēP;oüjŚZ,¼BŽ'Ź;Õ¹WĪ;iü"üŃ |GA0zš@,Vųٜ»YÆNŠ €Z‘d%Ń(™DAI*jFef0˜‚t 2iP²p²“Š—€ž  •³TT@& }YH)Q ­€ U¼Č*żI5©‚Ā„•3Ŗ>›Ą˼Ō3wųšž-Ųf€/ćń8.Ku^ųH$‚KڼQÖÜOµå©y¤wķĘćqü{!ąGøŅē>.“Dwµp8l·Ūńī§Ó‡ńH«Õj·ŪµFÖĆčģģägļ ‡Ćn·[·ƒLūDy§š‡[,‹nCµvŅ\.W<G³Ąétņ’M¹ßAcB*,d‡š'3Qp|G-[Ŗ¼öHÄU!£²AV^’J¤L)EMf”Ō"QŃ8F–˜c…lLF0Aɂ ł…š5“ 7}$f €wPP!™†“Ŗöf™Qī¼ŗźōT­čģģÄ^`Ą›€¦Ł€īxģ0R5‹Ÿņo(ņ“ūx].W]]]MMMmmm ˆƒCŹ»q—_ DgNnēŽF ņ•ŪĆ[pGИś0ė²tOTlŗ€›®C”oŗĄ'Ķjµ:N­›h¤ļˆ ˆ ÓšÉ ć+³J„–±Õ7e¶+Äļ„„ėČL‹Y©”R²Š*.4iv™dRÉ@& Š‚:’ż @Uap€ `0A6‡`P…ˆQ!™A³Ґµ_¤"žÕ=EŖ«IĀétꯓÅĖģh=?˜½:R„ĀŸāb%]^Ńęr¹œN'zxFŻGĘÆ†¾¦‘öhsasļ‹’Ēž5ŻGz¢Ā^;4 ņNš.Œ<ŅwDÄ$ź`e•‚ė«ā?līi\_ÉĢ©“š‰]Ē%&0ˆ`0婪ŚŪ'ŽAH$öĘąp €¬éĢPż"` i’Š˰¹sŲņĻöh¢J@†Ė{¶­Ē}^Ś•2:ÜŃ©ĶsZ°ä'¦Kņ#m6®pó~Źļ Ńׁ®pĪ«į†E(B čõzyze®Ō]ĶårŁķv”­¹¹7n·[›-šėŖ­­õūżÜ²iQpkŻb|„ųąŗ'*&;į£į‰ÜIC%ĒG;ŅwDĤčŲeF³°üjŃė·Ž÷ĄĒ–ĮŠNcT…o5`óēƬŁ`6ˆ˜K §¶wC©„0@’`0Y€ŽAČØUÕAPO¤„/Ճ Ž2’Ssɲ\WW‡¢Ó|įĢūż¢¬ĮüKäųÜn7žˆķĘf͚FkkkqUĖ@ó~źp8°—=ß4€y÷ŚĖZ­VÜ"Ąk£¢üåŁżŚõ¾īj0\ā„3>:—ĖÅ»ŪćaŚOqšn·ļ®}|ķ\a?d­’J;BT ¹O”;ÕüŹøY}by' (ųŽ‚Ćræ€ć„É«¼żSµć× `Ž|€ELÓiPUD†O4›”¬ś{įÅNčUa^ Ģ6A©™ Ø $ÓC»—Ój¶'#,ŗ”y6 Ā=ZTߔ b\Œ”_fž”ž’s†+iŪ#$PUEŅ`0@y%ˆ8y~Ó }*Ģ5YQ€“ƒYč“ƒTVĘ#ūb¦“ū Aéƒ1ضüv5yö‡€±”&Ųē@` ˆ J`4h5 żšĪ~õ揲Ģ6Ą`0¢i0 `dAU™šõę‡Õ+Mœzü€ ‚>ČU Œ Ģńæ²Ėæ­žž!a`'³A`ˆ"0śz ?mŻšV7 ŖĢb‹¬&(“@ɂ¢@©eØnv:« ¢ņ™5źŅæE1¦(J^Æi‚ ˆ©Ōł×醲ģõ’¬<~;|øK˜cę™Sa Ż)8š‚“ŹM°Ą„€ ÉH Dō3©ŖŁ^žÅģŹŪEEįk|‘k%hß!·AÄ)"ŒćķĀ1cL%廛ąŅ«ŌžlvOær(£ĘĢ.…łe0·Ź0TĄkš*€DŹ j…±×ń­¾+¤T(—ĄÄ˜Ä€)U@ČŖPb€JD°˜ResO–\Ń=»ŹTZa®«Ź=E¤‚ ¦‹>(ĆƗšüHʘ(ŠźāKś=±};MŽ,üHĢōØ ˜Y`Ų0ĒÄ Ģ ”˜zĶ N—e—JęŠŃČÆĄį*‡“AÄŌėƒQųŚĄÆ ŖŖŠ¢( éó/Ÿ»,•Ž}$čśŽC¦?k’¦Š㜘0_J%LF“Į`EQEL(Āæ€§‘> ‚˜z}WCčw!°÷9£J$‰ė’Ōü‹zgŁR©T*•Źd2™LFUUc‚ H’dĘ`0 I’„a`d—E‚ ¦^äÄ|EÆŪ.€’]Eż™L™” —†A}€ÆŃP@+a$}@Ź€ ātė]ü @8«m @« ²Ł,6¶Ōś—šSž·ÖqDńd‚ ˆÓ§ģv{[[ļ›˜‹Nś'pńĶ#¢(f³YI’P š.Ē0ģ āŽ!nL¬2Ą*Ķ#u ‚ †ō,Ėmmm#•¶<5hØA³ ˆ¢ØėtÆ;XkLhß,ž¦Ā Xŗų^Ag'Āø{`Ŗų’}A†aŒx ™»‰ø}PŲžČ«„ņmmm¤‚ F×Ų·©©)ƉĄÓ’ĒķĄÉu éŠzŠF½EoUŽ°#Xuu5ł‹‚ FѲ,c§ŖÜv1y÷‚±S@¾ēąŌŃ•7Y䍓‚ ˆ—ļŖŖ†ĆįŖŖ*hnnkßóéŒŪķnjj²Ūķŗ¦’ADū\.—ĒćA:å©%455¦Ł=A1Š>@éi·ŪćńøŪķ>VÓĮ`pķŚµ°nŻ:Š$AĆǛˢѨĆįˆĒć‹% bœyĘ‹Å|>ßʍĄćńq@16ūdYŽF£h%ŌŌŌø\®p8<³4ßļ—e•A]])‚ ˆńŲæß___Æm6›Ė咇™†‰Db±X8niiįcƒgR`œ bjōD£Ń@  ćńų z»Żīół(»” bĀō'£×hŚśŽøķ‚v }£Aćć’ż|䖹IEND®B`‚apache-couchdb-1.6.0/share/doc/build/html/_images/intro-consistency-07.png0000644000175000001440000015060212332105522026264 0ustar00djcusers00000000000000‰PNG  IHDR@Ó@ā0 pHYsgŸŅR cHRMz%€ƒł’€éu0ź`:˜o’_ÅFŃIDATxŚģ{|Suš’Ÿļ9¹µ¹r+ŲR’‚Ś"Įµ‚0;M‹3īJƎ3 ³JSudUāŗźĢ6ģ*ģĢ¤źą 8MÕŁ2³ŗ¤ø?ŠŪ¦3 ŌK:­Z¼Š”ŅBĖ-IļMrĪļ§=„$½…&ķ÷żŖxrn9É99Ÿó\¾ĻCxž ećv»].—Ėår»Żn·\.—×ėVP«Õƒt:N§3 ƒA§ÓŃÆŽB[0ŹÄ-‡Ćįt:NgØVµZm4F£Éd¢bF”P£P®‡nŁķöšššŠłś¬Åiéz…J­ĻZIÉ©ÓSf K[›O“µ4@]õĮŸ·įX]]õ”ŠĶ333Ķf3U2 … …2ś8N›ĶVVV*Z‹rļÕg-ž1’ vx¼¾¶®śPmõĮ#„™yyy‹Åh4Ņ/œBcs¹\čcńx<1ž10,a2™4 =©”0é²Z­UUU‚n-Ķ[¹0÷^…J=*ūļšyTģ//Ū#˜eZ­ÖjµšĶfśåS(c `‡Ćjµ†¹YbµZm2™¬V+õäP"„+7o媵τśG—ÖęūŽŚYQ¶§³ŻŁŁŁV«•ZcŹõ0·Ūm6›…ß|^^žŃhĬæU9T\µZm±X¬V+=»Ēc±XJJJšåŖµĻÜ÷Ą££er k½÷öĪ}oķDĖĖ˳ŪķŌ1@”\ss¹\F£Ńėõ¢X,–ųśį…>qÓĒ„Åįp˜ĶfĢ-¼ÖV×2¶ū„e{š‰Źn·›L&zj(”k%`‚zeff:ŽųõĀŁl¶§žz 233N'Õ° …Åb)**€¤äŌu[^™Ÿµd ¦¶śąī76«€üü|›ĶFÆF eōĢķv Æ×›ķp8āżg&ˆq~~¾Żn§§y"ąńxŒF#ŗ‘ļ{ą‘UkŸ½>>ĆaŁõā†÷Ž~ŸØāśŃB‰Q3UUUćÉdq:999°wļ^ź½÷,r„jŻęW-½7¦ƶśąÖ'Ww¶ūŌjµÓ錿 2…0`·Ū«ŖŖŌjõ8°½ŒFcaa!X,zš'ˆz„„ė·;bM½`~ÖŪ;•iézÆ×k4=kŹčX`:®±±±°°püeīįG+..¦ƒr&ˆzňŪ0*>Äč5I”Œ‚€}śé§ ,P«Õn·;Ģüņ;xž'„\£!ŃĒ„ 6?Ꚕ/1”#33ÓårѓMÕ+°mx³©s›B¹Jōf ]ĆbõB]‰Ŗ.ĆJNänŪäŠė]įCnMMMģ”LõĖ–WróVāÅIŸ«(”«0§Ó ĆÖ LØP„¢*œ0s0ż»ś2Œ„”MCF“™™‰7;z²Ē˜swź…¬yn³Ć. åJ ?C¤E”ĢBuŖ3ņM.×QÉóü°;GmF¦ŒP½’’SćN½@”Ro)v †™L&ź P®PĄ‡0Œ~…ŠÄúΜ8]żŽčJŻČõX,–šš¹Rµžå’øS/AĆÖmyY®TÕŌŌŠ²gŹ ŲH$į*38ŗZ>/y¾ÆżüÕØąØXl”q€ÓéÄZkžŪ|ePb„Łó×m~ŠŠŠhb=…2śi]‘$Vhś:/4’yϰ–Öøé)œPx<LĢÉĶ[¹Ō“*Ž?Ī¢„÷Ž÷Ą#`6›©#‘B¹V6lFĘ:¤œ9WœØ:õ×½m²S <AĀ÷ “¶¶’†žĪqÕjmllLJN]óÜęńń‰V­}6)9ÕėõRG"…r­ģ²L¢0bD’é·-óųģō‘÷ą›w‹¾üÆ ƎÖ;ö}t“ļ©ĒĻ•’‰dć·Ū-8ć4ō‰B„^·„ߑHS(”ĖBt‚!¤u õ:ĢB:ŪŽūŸ’č½p€‰z=gąĖßæp¾īƍ~›üw÷ŽzłżŻ%;aß»„ &°„†ÄĘ7č<Ōg-ŽĮbQWĆü¬% s—©8`µZ©†Q(׊Ņ:s*āKyŅlĆĆ»o}č×é+ÖO™÷ķ^otµŗOUŚ$¤ūĖ#ĒŽųY³óŻ>ļŁ+>ōąé–®Ÿż łą÷D„^č¦Ų8Ęétb§7L|g G“ŖŖŠ …r -°ĖŠFV$UMk­ūß¾¶æÜK2+D‹€ˆ!螆e$r„n¶’YÄ÷‰øÖ¶ÖĶßēęO;F6\:ų§b.€xžoźP$oŪ”œs#=ć·Ūę×ŖµĻŒ×Ļøjķ3e{ж2…BFĄS©”K#B¼_śÕoĪøE•`˜GüŻüŁzt‰V/‘cˆ\ĖL]”dśqšÄńÖ_<4åŃ_Ššį\)‚>®·+xfŅ]7mæ,ėBĶÆX6Āģv;0 åjģr-3Ō¶“žWgå– fōĀł/yA·ż ś¬ĻAW46šĮD"ÉŌtÕō½õ#QÖ½@$ Q€l$N–ȧ…«ŸRģ;ɓļ=Ó߯ gq|ćńxpœļRÓŹČ„åŽŅĆ:Ū½ó³–¬ZūģÕæ]¹£“¼ll-.l¤„ė-½w~Ö|Y[}pß[;;Ū½ WŖēg-Yžą£Q÷æėÅ ŲQ%r öņ©(ŪSRRb³Łh åšŲŲ×{~)żÜ~ć-S § $D·ąOG›*ńüż]ŪŹö‹źŖ½÷öėkžŪŒBUW}šHÅaĶ#Ź{ŠŽ­ŒÜÉ{oæ.¬&`³3ę§„ėŽÕ9Ś-ŒB–ŃÖąx=įÓ7nŠI!čąś­®Š?ŽēÓ®GŸśY’ÖĒ~Ū×?x`ŌÓÉLJ…ÉZ˜’Ón†ō0óvŠ-靿­m’±'š ļä™`GßÄ1AœN§Óé -ÖśŅåraQf焌āƒ™_EŸ@õŹĶ[¹jķ3ĖxōśÖæ_˜» væ“ńx}mčŅ}ug0„°įX]¹£4l[\Y®TĄńśŗČćĒ“ŁlōŽD”\?;ūéŸƒļæ”¤¶O°«Āž’(ݹsgccは|ā½ø€hf‚@ĄBČs¾§ćžó—¼Æa.Z~$A°%iŽd2™Ķf«Õ:iŅ$‹Å‚3srr„1‹Ån·ćĢPĘAĒSVV†*:æµłZ<«Ö>cŁņŹŖµĻ†km>Q[}°Ćē½Źwom>¦O W©ęg-Y·łŌ”}o½¶‚ąk 4D0ŌEŚĮŽB¬ķdh¢ æÓēŽ–?kŽŒČ¤‹‹ņĒs07E-“Éär¹B”ųüŌ„+Č'÷ė– abĘ}ņ؟~ó FÜĒ‹a•ųv>y?Šņ©H€ 3šĖl6;ĪO?ż“ØØhYśĖTVVņŹ`0dggOØ[ Ś%”ŌV}ÖⰚRļ½½óHŹRµ0wYg»Æh擂œ †mĆ„;¶£µ$WŖC4rRr*Še¤ÓSR 4‡Zø”Ą„&ćüCµKJ™…{ŪY“tŠvŹÕ Ų`ęW(gŽžiĘ—h†Œ0d@x!²²% Ó% ›V°3&ń‰ų¦,¹ųĒ2‚Ę‚æŗēėO«ˆ @½®~ߎ[žK"įAĀóĄsŻŻ“|ŌD°H%Ą|æHö½µV­}vĆĖo¢‹/4·"’Śźƒe{`ÕŚg„šUæ°½S¹„Ųfš ‹ …³3ōa‹:|^T¬łYK’RR ®ś`äŠn£=Ä)”«°ĮģĮUÅóü‰ĻMI–)Óļ9¼˜²Ą“æžłĘ {ęJĢēžéŽ„K‚dlæķÅ÷ōõŁJg¾óxdĄK! ¬’ŽCųv ×"ąnŠäÜ3”ĪŽē5™Lē#×ŌŌ@4_\TŽ××v¶ū -C/ü[M$Ź{ )9SšCķ¹é)³®`ŲŁ–bŽ¶ŽżŅFōX^4æŽÕį{ ’ÜŚÜ¹t!Ņ0…rµ6„e†¦ĻŁźņTī,;IB¹Ø[„ėRIƒž™ź>IFā$ąÅ—(ĆĖ@gO`טĪSź%© z9ųĪæī$Œ ĆLĪŪLŌ³9ńķI?y‘Ź&Ž!b±X C~~ž`ķ³Ēh…$%§FÖžĒ»|Xü Õk„¶ŅÖrŠŗ\0 „ĻZ:‡£aŹ Ŗ£Ś[ķŽõyø(j‡B„ĘOG0 eh®¶bӛŪęN ĄĄ’€ļ’’B&æ"/üƒ’ć !=ßžō\…„M&³Okžź_Pš³nū¾šŽJĆ÷•†ļOĄS„ŃhœNēÄQ/“8StŠu¶ūj« Fō†Öli§Ļw‡‡‚„b†Ē²Qš:Ū}Ā`²Ø10üČ Ēź\.-ÉA”Œ¾†ųŪ=Ŗę:F-†wŃĄ µŌ€0Ą0żÖ•ˆ– "XœŚF€čīņŪö‚ˆ”%J±"Uvg ėÆ>ģėšąēÉh4Z­Ö „^‚ U!ꮋrµõÉÕåŽŅŚźƒ­Ķ'„qĮhŁąæ”ń3tٵ…8īpiƱ: ž0ó¾Ćēµmx ¾Čj>ļįņ‘GŽ‚·nóĖūźĪģśącœÕƉņL]ˆŹ5°S•Žé ‘‹0-1Ü[ĢEõ1 XˆY‰@$ Ń0įĻžd’1“7r:EDİIā¤D¦į/±ß»Šsā«°€œ‡^NØ3§V«Ćģ³ø8ģžęęžęęĖŚ$jļJ…J ˜jø”Ą“ū„00\¬tĒ6¹R…s0±¢lĻŗļē„F¹y+1(µū„ĖõÓŽ{{ē ÆC?Z|#¦~Ü÷Ą#aÕ4Öä=|ĻmhZ…–nm>‚—”2 „čZT/"Ś…Ō…H”\Cėų؜•2Œ˜ ĶŃčh”ېĮÜB¶_ŗ¤ā?ˆE ˆ4Œo=ĮĢӊ~œ'ś—Õ¢§ŸżÓ?‰ī»[u’’;žįŽŁ·I>yéaAøÄŗ»¤ƒåDKG48x9¾2;zš[Ž.]Öųźkxķ01ŖKM«Ö•Kń¦æę¹Ķś¬Åķ¾Š²=r„jŻęWP’–?ų(Zlm-'ī{ą‘P!“½S™›·—m ŽHLÓ__TņšO·DŹ›\©^˜»lK±#tlµp(X„<‹Z#Z`ʲŹļš ĢĶ+@½S‰ÜÓBd,0nĆž€ U/D ˆX`™ž&ĪA !|žžē϶‘é3ē@–@ęĢaµiŹEą3|mŠé"‚‘5s™X­V£Ńh4].W~~¾N§‹£ƒo|õµÓ{Ė“?6cEް+ĖUƒ±-½7¬;³B„ŽZ\†éˆ”ĪĆłYKv}šIƱ:œ*< •ڲ個}2C‹ļ«;#LoxłĶĮŽdÕŚg‡.%¼Ō“j©é’b‘łǷŪm±XP2M&“Pše$`z޵ĒG«Ė}k§ÓIk?RFYĄ i’·]Įcæ#’ČÜņ$Ī]ģébN'©b@9įr6`€0 °,ˆū’[„Ļž††ƒ$„ŽŽēL¦¤įņ@xąƒŠćķ·'¦„ƒŒi5 n·Ūårétŗ0õŠ ojosĖ—Ļ’¬uo™öńĒ4wfīĪĆÜz‚PĶY:žÄķv—••UVVz<³Łģv»G^Ńår”7”€¹\.Œé:«ÕJŒr åB$Sę0ߌ œ˜’ōæ‚ļ}Ÿ’lŗ…„'¾f}DĢąČ@Ü r1 a@ĢT/–––„¤r üõ/b ×ǟ<D "ašw€.›ž­04ŃhŒ/Ū+ ļяž¶śĒĒžßx¹1ʵĄh4šL&›Ķ†ŽéĖÅn·pC§Ó¹`ĮĮ€£Ń>Źč ”,fįæ/āOŸįžņKīż‡ųę’Ć$®Ó'D !, Ķ—æ˜R(& aˆˆ!"X,éw*āR–ō+–ˆé÷.āĖš'Ŗł¶Ę cƂāz¶Ę+­{÷}lśa㫯ѯ"Šét^o,Šįp`,zŻn·ŻnĒ™‘Zår¹„:gN§Ód2Fō˜Ķf܏°°Z­N§Sx‰{ĄŅÕ8‚E77™LTē(—'`@Ņļ#„óüÜēsū~Āżytń{ĪKPxĮźHܐ"fĘĄP«śÕk 6&DČ»hœž›ržT-0 " böĀäGåÓÖ¬~čĻ·Ö¬~_}M˜ö­žsĘ­Īø5tŚs“B§qs¼ĻŅ]]Ł®¼G?Šzj‚ķķÆ¾vdé÷Ī~XGæŸrGiéŽma7:|^¬¼\?ķŠ+ā+fĘõw8yyy8a±X¬V«Ćį@÷ †Źp~AAA˜sŪét¢¹\®œœŒ„”‡§ķv{¤gŅķvoŚ“ 'ŠDׂ `&“ s”P’(a2Bxžg¾eįZ>‡žæņŽ^¾£|{‚Ē=3YB.)fH!RXąŒŖ¹ā9˜sął~ĮėĻZd<įēł“GĄŪŖ9D1 ų>˜rėŠĒI3;ĘÉåØTŠTŹø8ŌŚźƒ„;¶ C’C38B‡' i#—ĖŅ„eźI(’Ž£©ļ¼#óĶߞŽ[ę=Z-KIŃ>žŲµųPV«{Ė”2Łķv‹Å‚–^ÆFēåå9ĪØ/«ÕšŸŸ/„µ †»ŠD³X,f³¹¤¤w(Ø ĆįĄd(**vަŃhrrrčo„r֟Ą°Ģ}’|óAŅż ļėć»üąs“s_ž‡ą@"Ŗ—Œ1_$ŠA. €¾n‹A$‰l S‘€ņīa ; Ox¾½ <'§|{¢ųG÷į„v$Ÿ6óĶß ÓŚĒīš;³¾]’·ČiŻœīźŹv„¾óŽØ§†U*µ?63’Š™˜ŠÖ|b/ł¢hĆ‘ķ¾̘OJNmkiŖ )rYtpĮÓž‹-[銳E}ėŽ}ź;ļŠĀc§÷–5¾śšęĪ;Ņ_Ų<ŠŸ+¬iŖF£±Z­n·‹R†žƒĮ0XÉ|Į ›ćt:‡نŹavv¶š2^Ę8RbNĄ Ųɵ½ā©$ńö’|ė čj‚v?tĝĮ GųĻ£|0d$XźDčģ„ó~‰ A‰ •a/šź—”,ȀĒqż& „ē9¾Ķǟ=SęŠS5ŽIYżĻŚĒ©Ā A †²²²ĮtāŹhm>ŃÖŅ„ƒ—+Źö åŌįóV”ķél÷ę歜ž2K(}Čpø“؇>kÉü¬Åm-M„;¶GgøBEŁžØĆ¼†„®śą×½=_LR‡É’ōyŅ”4R;æØļmnńżĪ~XŃųźkÓWä…=\:m/!¦Óé G¾Æ×Ŗ:ø7Į 9ķ¤PFCĄŲčlį½op a„0—%Xžļ$I_“õņĄ „° HI¾†TŹIĄ2@Ä8Z™įćśõ pżÕ…‘d8ŖŒ0½~¾‡™ˆØgŠS5.QßyGś ?—„¤ )9£)`e{Jwl×g-nØÆėl÷­ZūģńśŚ &,“Qŗcūś¢}Öģéµjķ3«Ö>»ļ­ļ½żzZŗ¾čŻJa?–-Æ@Xō«ßm8е²¢lOĆ ˜ ass3s3pzĪśē¦ÜšµĄ¹ņŠĪścĶo¾=3’žęfĻяF2Ąn0pD—ÅbQ«ÕBüéņN«ZŖFV«Õf³ajĘ5¼(Ć2lƤm&ŅūI‡ˆoķężķ|rHDĄ²‰Ąyą{‚„ ä€H/`żż0ą BOpA ĄĻ÷[b]šóĄńżbĘ tć8ŗüŠĖ3ŗ›†ż­ŽŌ8@š’|Ė«¶Ģ7;„z” ʏ.uՇ„Ņõ[ŸĢļl÷åę­Ś (TźŠ2haŸÉ‘XxXĀ [ĄDm»<,hĆ [śRsgÖŌ»s`ĪóĻŽüĀĻŃĶŪųźk_>’³ƒWįtÕét˜ļg4£vOEq,¹acc#ŠńŠ6–Ńh|’UUU­ņ'e”¬_ŲDfž•LyŒtČą< šŹ’ f%")Ėp=ą‰Œ€ˆčķüĄįüčķĪvšy ·»æž/šĄsĄs@Ač Bü0 šƒ@WßĆG˜ŪļöcŠ Ž8Ć] ĖßĒ›ļ°&ˆ(1ŗÜ÷Ą#ūźĪŌVD÷ąšē6ß÷Ą£(9­Ķ'åŽ eśŪ¦ŒHśKŌgč*5–§¬äüąūŽ|„ŸH„š±"­.yF†4%yźŻ9p²äķVķ Å`0466z<Ģ?4›ĶV«54¦…‰ˆUUUƒ>6ÄźŁŁŁ6›ĶįpŖ†āš./«ŖŖģv»ÕjĶĢ̤•ų)Ć_łC«f!aü<«Ųķ^ž š¤—(śŚū¤}ß„D1°X°` 0"¦h ©$ą‚Ą0żšqšˆ #`Dd¢~Ć mÆ?ųy¾#H$ k0EW*Zńˆ"#}ałČp×`¦V«½^ļńśŚØÅ5®Œ~ % ·®[}Q?ZšŠk8V×įó¢E5¤M5ė` ~cZ†¾®śPCżå%" !·+3Afę?03’­ĘW_ ¶·w|Q?ļ×EĆ~ÕB”Ė`0z<ƒĮąr¹PŗBĘ`0Ųl¶½{÷¢ÄšĶfœ†Õ  :PŅŚv¦²² o­Óé*++1ÅQ0ń_nŽ2Ń,Ģ5Gnś.#™Ęķł7Ņ{Šgü|O/›(…ī>Bæ«`Ą÷½dRōAB П¾Įq ö×§' \čƒ>z9`Eąx rŠė‡>ą}AF7T3ØÉ5~.ø‘IWč½²ŖŖŖ”¾nŌ,¬Č}˜7;c>¦bÕyżˆķ­÷Ž~ż½·_•“‘ƒ_vvöÕĻé/üü›¶„ä?ßl}iŹŻ¹ƒUķŅét”£¬„é°ł‚Z,Q°ĆBm¦Š C˜ķ…+ ė k†Ī ŪyŌ#”Pāe@“ Ų'ĢŻ’N¤©$Q¬1AŽgS¤!Ɠ}@Ą‡"=] ĻCo/a@,…`NuC/`!ĄCO /čöƒų.z8ö;kGØÆ”q ŽĪjƍ0ö՝žŠ`BŃ:\±.Ķ?Ā“t½>k1īüró8Wøbó+Œ©wē.,_sgÖé½eĶožīo«_ćÄ)”Ń0 rc\ÅžĒfm±Čø20ER꒶ R³ – R곎N8wŗ:A$†±€Æ=pŗ8€ žó »ü<ōpœ'@¦N!sļź`ŠĆIæ` ܑŠż×h’‚i%ä¶6÷ēŒĢĻZ,¶”;å–bĒÖā2ģXv¹10ōjŽnhźŅœé+–Ė3Ņ§Žšł:¾Øæ²żh4š«4 )”1°0 3w!k¶jž~ī¢ķÕ_ І3ęéÓaŅdÉXd ąė„ź (‚D1HÅ Ao‚½ą!Čó½ĄŸó‹~ø v˜#”¾ÄqĮ`P«Õķ¾Ø‹Æžé)³°=XéŽķXü cĄĀÜ{+Mč?94hlɕ*ōO&„¤† Ū°ÆÆmkiĀüõQü˜"•*ż…Ķ·;ž>{ÜņɊžŽ[ve§c°ĮĖŹõG4ĀõĀŗG^¤«µæ’CJJ‘ž C–? ;P> @&¹ ŗ:ąĆV ,$ŠAĢa Ė<=}ż›ūėęŲŪnēo4’hGBOŪD3ĀJJJŹ{F„JRr*&h<üÓ-³3ō‡+t¶{åJõ¢cK”Rēę­lk91Äū†ķ­³Ż«ĻZ,ō؜1—vŽ8“¾Ü±G°;ÆÕo^Ł?®b¬… ØfĶ`3#ŃūüMžó߀˜ń„E{q°ƒc– ˆÅ P+†óēįŻFčäaŖ¦&€RŒ–”£¤,0ś‚<¾—eÖķ‡ÄIƒ ēąB6ĒjµnŚ“©°°F€ć‡Ć±bÅ ¹RUś×oĘż‡]óŻŪŚZšöīŻ{M5ģģ‡SļĪķinžfė¶ō~~¹™5JœY`‚¤…)™ūßÓM äbg/•ŒV)°bąƒŠŻµMüŪH‚&K!Š–ƒn?H3‚Ąó„ļž¾Ÿń 2\ŗ<M L«Õ666–;JÚGe}AŽ`Cǰ²FĢ~ŅĆåūƅ’0wģłŸy~T³śĒčZ¤Pƹ€Ej! 1ükpīĆü‡ė™īæĀĖa€ć Ó]}Ps_€^žØ% –€F rpAą8HA€ėoĖāņ Ė-)ąÓæĒ0 !„ć8†aFb RĘ+f³yÓ¦MūŽz}$¶µø,N?ę¾·wBHāųµfĪóĻÖ¬žqŹÕ•O¤PāIĄ¢[Bbyšīķܶą›/˜)&IJŻ~øŠm}ąē@Ģ€B ÉH˜šŠÓ",ś2y^&öĻżAšöXެ+œˆ“ĆBēŠqĶć‹Å²iÓ¦†cuµWZÜ=ö©­>ˆ†cč«kŠbn*ļų¢ž³Ē-™o¾1tQJ %Ö`®`›PÓ•ƒ°"īߎż¼/ü²‹;ą=œ&'Āt9LM… Ą]¬@ĻŚĄ° óJI‡aMē‚ü ĒqĒóüČm,Ŗ^ćF“ŸŸƒĻąGĖĻĻy©Qx€U©ą›¶õ6·|ö/z„QĘæ€A4÷Ć0¬HXūZąŽ‡@”Ąp½„‹ł Č„ —€B* (Ä aø b42Ј{§Ļ>½pSūģļ {ʉŠ)ĢĮ©«>tņécÄü“T£yÆŚ¤)ÉŌ—H™(&*d‘HÄ}÷įĖ+ĮĢ,ž‘ņ},/’ņ 2'B‚1š"2 •‚:¦Č!Uӗ~ćé9’xüʧ»:“ŗŠü‚!r÷)N·nŻ:(ŚšÄųūt»_ÜxżĶÆP;lałū3Väu|Q’Ķ֗čÅF‰† ‘éf”ް,˧ŽŅ•’9ń7é'D-ĒŁ€'@d ĮŽ—Rr1— ķ%Ÿ—Ģi#z‘L™ĄJB…PØ#ŒFeŒ‚Ö‰Żnoki*ݱ-–“ /—}oķl8V§V«±åćXšł>YńCŌ3”7…ß6¬ū.4Ū‚ažēY–‰ÅžY·zgdōõt3gŽ‹Ī5ˆ:ĻB +(fz¤JŸdЇ™Ī1‰"I%R±X̲,˲˜vˆ’€|HŒĘf³”īŲ¾0wŁØ—÷Z›O`ōĖjµŽm G‘Juó ?’fė6yF:½Ų(ćDĄ¢JZųh0rq@4j˜H$ÄÆośM““}}}}}}@ šŃŁīĖĢ̼nɇC0cEžęĪ;d))ž£ÕŠŒt:Ą™ć\I ,Ŗrōē"˜P,Ė¢8I„R™L–˜˜ØP( …J„R*•J„_&&&Źd2™L&•JE"‘H$BS w5˜€Qõš°ŲķvµZŻp¬n׋āż³”īŲVW}H­V‡¶‹[d))§÷–żmõ=’3z±Qā^Ą3¶†Š0ōŠD"±X,‘HPĄär¹B”@é4L.—'&&&&&J„R4ĀB}‰4‰ƒ‰N§ĆŪż{oæ^ī(ßrø|éŽķ`³ŁF„yŹh”ČHĻяzš›éõF‰iĖĢĢ€!*L‡ÅĄ†‰ Ŗƒ2†¦a” €”ł…&X`£„^Ų³|l£ ”ŃÅd2aFāī—6ÆÆĒp¼¾¶hćŸŸŻJoŒTĄęfÜņŖmał:®™ė†i»Ųē{T@õ¢\R©4Ō˜˜˜˜ ØśÆĢöBVQ›cź —rõŲl¶ģģģĪv߆SÜiŲńśŚ & }Ŏó0,–Ųųźk4«žÓ†}óF½Ē`„ ń0ń’„Ä Įs(DæŪķ–_Tó«±±F»= %p8™™™q§a>oц'Q½b¹·VGż±ĘW_k~ówŌ‘H‰]Ćŗ×eeečj‹*”c³®@ÉBm26AēFā6ĀҊŗÖäåѾGćFćt:ćKĆŠöĀQ_‡#–=ۚ;³¦,ĶQßy½Ņ(1 įyŽh4VUUåēēǦ7ćŠq»ŻƒĮėõVVVR l¼āńxŒFcMM\©ŚRģˆåĮa‚ēP­V;Ī8rk÷47Óx%-0(æVRR2Κ…[,Æ×›MÕk‚Ųa–ūsc6/±ÜQ*ĽšŃ*>žŽVYś½ĘW_£W%FĢh4bN—ÉdÅlޱÅjµ–••Į€‘2ī5,;;Š6>ƒćĆv½ø”hćÅøWåÄŹR’{›[Z÷0J Ņ_JšĆĝs#*6›ķ©§ž€āāāXĖQ¦\S›»ØØŅŅõė¶¼ īÄćõµEžl8Vqź„’fėKņ¹3VŠ@2%V,LƬVk,¶¹<ŁlFŪküEõ(Ćāp8Ģf³×ė€UkŸ¹ļG*õXLéŽm8Tkm`ĀTœBĆ`”˜°P €ģģl‹ÅG?9·Ūm·Ūm6޼Øķ5ańx<&“©ŖŖ ’’SW­}f©iÕu>†Ćåūw擱­„ Jv»}Lś¤ŒĒžßŲŗwßĶ/üœŚa”Ų0Äjµ 2 V«FcŒ{=ÓéDŻJG.SSĢb±ą(Ąė)cµÕ±Ā!ž|l6Ū8x:Yņöń¶MYš3ļ×EōҢ瀔$Ųl6»ŻŽæ’x!;;Ūl6SƋz OcIÉ©Ė|47oåµp*vų¼G*ö—īŲŽV—Z­¶X,‹e|Ō0ėin>ūaåŌ»sØ‘&ąr¹œN§Ēć‰ńa0ŒF#-xHVĘ 7oå¢Üe‹–Ž;*ū?\¾’pŁ#ū;Ū}‚t™ĶęøöF%ąóŚŪ©†QāFĄ(”q#c‡Ćf³ ®fŠg-žŸµDŸµd~Ö’ĖŚ[mõĮ†śŗŚźƒG*3µZ-J×ø|:½·ģĖē6}Åņō6ÓˉBŒB\.—Żnw8aīń¤äŌ¤”TAÉō!’ÖP_ףīEŻźōł0'>T·L&“Łlßa׎/ź?YńCV©\R}^E*`ŹXāv»:É/7Ö«ÕjŃkū)N£Čɒ·5wŽ”˜›A/ 0 %†ĄX/V¢q»Ż”µ­u:“ ƒF£™ą•É>ŸH„¢ … …B‰0 –²śŸē¬Ž~”X€”_…B ²”dčØ?Fæ µĄ(J<£ĮhŒBŒB”P(”«bĢ\ˆX’)jh …›|³õ„ƒYKž˜öńĒčeC™(ęńxģv»Óé4ćµz7%~ }Ą­V;‘Óe,ż^؆4%yałūōš”L £Pb‡Ć±bÅ įåÆ~õ«‰œ+ė9Zż·Õ?lé-ÆŚ¦ŽKÆ 0 %†4 ć^f³Łd2Mšo£fõCŽ£EĪWßyG替„W … …B‰Qzš›.]9’¶½ e„(c-ęK”P†A–’’²śŸĆf¦¬žgŖ^jQ(”X'ąóYŗL(ĆĮ*• ĖŠĘ`jQ(”XG¤RĶY’¬šRūųcT½(TĄ(J|0cEž<#¤)É3ó _… …B‰ŠKįēō« Ä4F”P.ƒÓ{Ėhį( 0 …ėx<—ĖƒTÜĘ&:N§ÓŃļŠ2QL(%e0, -%E”Än·Ūétŗ\.—Ė%T4 ŁŁŁƒĮ`0FŖg”ń,`“˜/…Sø\.|¦ -‰č³@Zŗ^”R‡ĪļšyŽÕ@]õ”°M“Z­Éd2›Ķƒ~·”q%`N§3'''tNqq±Łl¦'ƒS†–’2ćøŪ*śBl6[cccØbĶĻZ’–®OĖŠOO™5’ż“6ŸhØÆk8VW[}0TĻ“Z­Åb”»)ćYĄ ­V+=”!¬˜ļ޽{Ē_9D·ŪmµZ‡Š8&7oåü¬Å sļ ³“.—Ÿ·®śąįŠG*öw¶ūpf~~¾Õj„®EJÜ ˜ŪķNKK SYY9Žr)qGX;•ĢĢLLd7V—Åb)))Į—iéśå>rõŗUɎTģß÷Öėči¤2Fv»Żb±ą£ßŗuėl6=”Ųa7““Z­6› ?>kńŖµĻĪĻZr­ß“¶ś`éŽmčZT«Õ‹…¦nQāXĄ` =×`0Šė˜k˜L¦²²2įevvvŌ$ņųĀår™Ķf“,ÓŅõk~ŗł:H×`2¦Õjķv;õ»Ä²™n·ŪM&SŒ›Ėt…ŽŪķ6˜× ÕjG¼gÓY­ÖM›6€\©ZóÜꄦUcu$åŽŅŻ/mÄŲõ¾Ä&‡Ćl6£™^XXĖę20 %:huÅ»•ąńxL&ŽčZ˜»lŻęWF=Öu¹tų¼EŸ8Rqč(šŲĆf³=õŌS —Ė;;;@­VŪl¶ŲL§µ)”čŒƒzōŅWUU”įµįå7Ē\½@”RoxłĶu›_–+U555:n<åČÄ;¾żķoļŁ³gƆ III^Æ·  Ą`0Ä # …2>q¹\čMJNŻRģXžą£1uxKM«¶;ŅŅõ^Æ×h4āØ;JŒ8ĢfóĶ7ß|÷ŻwæńĘ«V­’Ėå555999f³ŁķvS£P(׻ݾ`ĮÆ×›–®·½S9;c~ äģŒł[Šś¬ÅųŒO5,vP©Tœ81==]«ÕšĶ꯻w/]ŗJJJ ƒÕjECmĢ”10 eŖWAAÄLŠkXlžØ(Ū“(O €cHžųĒ?>tPśOz͚Ū'ĖE|[[[[[ŪW_}µk×®ŗŗ:ŠjµV«uĢOV< ˜Õj–ĄŖ?aµ<œN§Ūķ¦?ŹD=‡^Æ77o„eĖ+ńrŲ‚†Ėŗ'q!ZZZ’·*)³)wĘ?é5½½½---ēĪ;räČ®]»ŚŚŚ ;;oĖTĄ†ėwD‘ƒµ©Ā>ˆÕju:ć`ų…rź„ĻZ¼µø,¾5L­VcŸ z6Ēź6 G¾p/|żkaž¼iŅM¹3īJMloo?uźT{{{iié¾}ū0Mq ¬ÄM ĢétfggÓl% e0<ßIKׯ/z3īŽß²å!§#FB,PĄą®»ījņśCēv¦÷žß7>ä8éįe7ß|³N§3›ĶEEEa1*`C >Z†jҽÖ=Ķf‹ v»Ż6›ĶjµĘT …2Z`” ¹Rµ„ŲūqÆØl)v$%§z½^źE[š|žČ™|ķ[ōśWæ8tF¬˜4wī\ƒĮšōÓOoŻŗUÆ×{½ŽM›6ét:‡Ć1žĢįpčt:BˆF£aźśFB0«Õj±X°2©°šÉd²Ūķ.—+r„æŻn÷xÓét׌ŒŽ‰Ų°*ķr¹°¾ŖĶf«©©(lCĒ3Ä®ģv;uRFØ^EEE8]RRćĘŗŻnĒbQė6æ2nNĮŗĶÆ`”)Zķ÷z‚÷ÕŌŌT_OšŅ%$D¹ų-ćąŸy¾Srü?¶‰“ōz½Į`°X,×-06f4ќBŌjõ°ĻYN§Ól6c+#į1įrOLAAĆį°Łl“ŸehĀ~o×9.}¹6źėņž2kܜ…J½jķ³;E&ų|ÆR©>;Óa…h¹d™Æ7ųĖCg¾SrüŻśŽääd½^/Ęärł5 Œęt:óóó³³³óóó].×°XUU•ÉdĀQĢ8 =ćų×·ą` jÓžC”Qq ÄŲ2)9o÷ć‰å>ЉԻn` ”Ōē^ĪFżjvŅēź@ó÷÷ø?n Üxć7ß|ó}÷Ż·{÷īU«Vį=|Į‚˜Ä÷†łN§Ón·k…iŃhÄž ™™™xe yŒ˜gŁ†aOĶų.N§Óårak e0ĀrøcօˆƒF`ÕŚgĘå‰X·åŲ“i5Ā®Ļ償µõ !T„fvĄ_›:ļ’½Ū²æ940¶{÷ī… @QQ‘N§Å'6ösU>,“ÉBļ).—kåŹ•‹-zńÅ…dz³Ł,“Ét:Åb*K}ļ{ß }¦.((ØÆÆ·X,3fĢ ŁM”Įž–pĄfĢžF^|ńÅ>ų )9Õ²åÕqy"¦§ĢŖ­>ŲÖŅ$“ÉØūä:ÜiKJJęĶ›wū÷~PVļ‹&`dŠŸéłC·7Ągé&Ϝ‘¤T*o»ķ¶łóē?~üōéÓ|šf$\}4‡ó„PāN×ŲŲønóĖcŲałZƒ)õjµŚķvÓ¾—׬Éw×]w-ž×ßüāŠ™u‚PK+Bۢꙩ?½d–Rljjņz½~ųįīŻ»1Õ>;;{$Nø!ŃÓF”Ä#‡£±±Q®TEUÆŸ·įX\©•F*ø7HK×GŽ’nm>ŃÖŅ‘o',€łYK†ŽyŌż/5­*ݱ½­„ ū܏ķwn·Ū6¹¶X,.—+Ō½ŒÕ‚B×·ŁlqäéĮQ³©©©ŽŽ`4}"Éō!rŇYenńū\|3ž?éķ{ź@Ėźˆ‹¹Rµjķ³8-l¬ZūLd²Éßś2²ĢņŻżŅF»Ż>¶†± ³Ł¬ŃhšnėńxŖŖŖ*++…uPĄ6mŚ”ŸŸÆÓéāŃdLMM=ti ģßä’ow·ŃĆ%†hXØ`õ›h |÷|īŲQÖš@÷’üV|&N"Ęŗī’}ć穟^2ķ–[n9{ö¬Z­^ŗté®]»Ž9RTT„AŸ+6ӆ–Jüįńx°pTäČå &A½ -C})-]Ÿ”œŚŁīŪżŅĘrGič¢Ü¼•80¹tĒö°Eś¬Å÷=š©8°ū„a’UUUc8ˆÓét9N¬§*„ĘĄjµbÄC§ń5bGČ”æt6_ĶßōÄ“*AØĀŒ3† *ķ,č†oP¶Ü’!Ćs Ļ”€ćĘpĘ÷;%ĒqšŒ0blćʍ[·nMJJņz½O=õ”N§»Üž!TĄ(”ų“lÓŅõacæö½µŻqkžŪ¼ÆīĢśśŗ [óÓĶ»’ų‰>k1 U袄¦•^~3)9ŹCÄ5”łYKžé4(+.]gzŹ,Ō°1g·ŪóóóĒwę Ų¼yóžŚŌ*Q_vOĖ•~>WvśŅį̐ķ9ųūÖēĮć_'’GÓ¬µ36®šāŗ™oøÕ_OŠPÜB€ō‹ŸÆ—ūEĈ±7Žxc͚58b,''Ēd2üI… …ƶhé²°łåŽ=hĶ e&8ā:|Ž]/nX_gŪšDk󉁕KKwlC“ضś`éŽm„;¶…īķpłžŅŪö½µS˜Ó9°ŸĮ ©å< m-MµÕĆ%„¤€\9T”įéżėØ"åml,2¾5.Ķśh³łS¼¦½[öˤw Œį‚?9żö‹›w[»V/›4#8mJ_ĘĢą†Ķ?Ėīœ:C¹¬³bVßI†ē.u9öOœōłŸ:Š:blåŹ•»wļ^¾|9”••„„„p;_߯ŁlʂR8› 楰5³Ćį0”©Ļv»ēŲķvZJŠ2@O Ś%B6ÄŅKc>ļĆ÷ÜöŽŪÆ×UŖ(Ūc¹?5¬¼lOéŽķhÕU,ݱ]°œ:|ŽußĻŁŗ.ætĒöP‡^ŃĘ'p?EŸŒ”(ām õu”ók«ÖU‚h>OÖę(Ą‘ė^ıśĀŃčr¹Ā:墒pÆ©©˜™"^<š<’«öļ,…ĻsæD#ģsļm–WŖoV0 1BP˜ø^člN žYp÷ā5ó:^iŻpSļńKs<.IVÄĄX舱Ÿüä'»wļÖėõ€5؆ķUO†CĮ¬V+ņ‹ÅétZ,T&0‹Åāp8,˦M›p“Żn·X,‹—R£Ä;XÉ:2åOČåKŗŌmųŽŪ;;Ū}IÉ©»>ųĆT”FUT¶®[IŒ÷=šČšē6 óÓ2ōė‹JB­½ĮčlæX°{C ³9Ö<·y°\ÄŅŪ¾ēö¶–¦…¹Ė"=¦§ĢBä˜÷XĒūINNŽ0ć^ć³ī0 šśoŽķ™ōŠ}2āŸÕŻüor…6‘‘±„ą.ż tƙOtó’f/½§‡Mˆ6ė‰!‘±^xAŒ„ÖWŠ!Ć““6CB J {0™Lf³YŲž1™LŁŁŁčpĄ Īd2aŃzū£ŒóK?ˆDrøü1B0 ”Į8^_‹+¬ynóĆ?Żj­Zū좄÷b «­åÄó; 2æC )95-]G*Ų6<¹~ޱ0µZ-›ĶVHļHń:…ĄČļŽßõŪģßYvaē×*Ž®ōVĢ™ŌĖ(Äx问 @eŒƒóµ³¹}ó>JœM.&݇—RģŒ}ŲŠ«©©Āŗ3›Ķ›6mBįVłłł8ö.m§b4C} a©«UUUøI avDz”:źōy#-3Œ‡į悭•#pā ĘGw ¼5*‚ł؝a†KM+‹Ž­DkÆ¢lĻńśŚ°šó^·N‰a`»qiE¦ Ą_ĪĶijŃĢ™w:į©Ąū’Dź˜IRĀō'jĄą XcG¾ō}oė7gæ9|˜Ž³ėd\wd,’“>’CŽ“ßß枏Ėc`ģ‡?üįźÕ«‡¾u€¹\®’’įeMMĶķ0›Ķf4,X€c 鍌rķĄ2ƒ6›-}Īx“ĄbŌčŌõ”ną­#Ó÷ђėl÷ qx‚µ'ˆčE3.C/ˆ÷õGhõ>^/xüh*•źPSē€Ö Ųš0Æ}żmh '›gĻ0‰"ąI’ŚS(c<z%0{iU­o;|oŚ©‘¹¤kĄć.Ŗß%üµ©ė»%Ē-ū›•JåŒ3ššš`#‡“[CŌ'ŹaĮĄ………‘„Z­Āö§·cŹåž˜u:ŻSO=õŌSO ķ‚Ć{MdŖ $;„Y0čšCŪ’Å9ƒ!,½!Ĕ¤äŌČ ‚]õČĆ øČdE<ŖžDƒ±p ÉaÜÖĘüYĒs“śČŅļyŽV_ńm(ś¹čč#U7ןM† /ó3 2‘°Ą`~<Āaa€0(i  śģ³Ļ~÷ !<īĻ’e”d6.d4äŅībjź€sēĪuuu }Ųc `‘ƒū.Ė}l4Ń+ˆF½Š]e°õ1FÓ7(#Äjµ įRÆ×kńy<¶Ø5¢+Ērīś‚¼õy>/Ś.G*tų¼hŁ`ž}Rņ,Ø«>tø|hF†>k jĢÖ'WļzqưżŅåŲ³¾ ÷–FŲP_Wī(-ŚųÄ`Ś­ĶM‡Ė÷ •;Ā,!dHĄXy_öĮŠét{÷īÅ[Yaaa䚅……c5„¹·¹åo«\³ś”žęęĖŚPø=F+EĻ·uŃŁ»AĀ0 ˊ"b€0Ą0Ą°Ą2 f@$ @ęLå sJ…‚<ų;gvżéiłGp‰0†Õņ×°Tµ'Nž< C¶ĮƒRRxÖ7mŚ„/óóóĆŗW !EØFėÖ­Ć ńĮĒn·QŸßl6ÆX±ĘĪ{N‰;°Č…ĄX=õq£̈™ŸµdŻę—‹6> ™ ĒźV­}ęHÅž¶–&,Ś$WŖī{ąQXjZ‰C†·®ĖŻ”B„^’ņ›[Ÿ\ŻŁī{ļķ×ÓŅõk~ŗyŲFÆZūL˜€ qƤäŌõ/— ¶9īA®T­ynsŌńל¬ÅuՇ\.×X É2 ”ĻŹ:.j§‚1o_ą=śŃф˓?–²śŸE*ÕČÆ«»īŗė¹(&Ą›’æ[Öłł?Č\„åe €€%@0 0 ȁ?0™—–wÖ6ō{ ćūžĶ ;j›? &_Ŗ^Āž#L%ŸĻ7ģaM-DĢ:ÅņŅ#7æpĢ<„t lӌsBˆĢf3>™L¦ŹŹJģ=–––FļĪ”aÉĖĖ Õ°Šā1"`CˆZjZ„ĻZr¤ā@g»W®Tcy\Ū;•„;¶·µœHKׯZū,Z3Øvåe{pę{oļ Ā]|‚²—”œš”œŠ-Ē05ciŽŹłYKp:-]/t#KK×ė³–¦’°ŗÓ2ōQsčC›™é³–D­L¹_}ķdÉŪsÖ?;cEŽ7 1æ.Bˆˆ![&­¼ķTÓ `2KX†@O0y–† ½ ōųÓäņ“yp„gfĢKR¤¾'łKΧ÷4ś'…v26 d|æw1U-æß’å—_FuŚ]<°‰ÓNÅćńLš4©””!¾ ”Q®?ųŒž:µZ=“ś:ƒ=/ōY‹·—M“ó²¾ Æ®śPee%ķ żw“śo«9_ž‘>gż³š;³†Ų–æżćĒø.`<0 ‘‰ŁI ¢æ}žė”]D.‚((ea€'¼?=ŠÓ x•ģ¼ą$Št»Oåø¾3ˆ†ń”yö›r¦?|Ē”ŖŖ*ģę<„H’RRęV«U«ÕRõ¢ŒÄSäv»‹‹‹‹‹‹Żn7ķ};<>ķņĖ—qŗfõC5«źų¢^˜>½· ¾Łś’0}zoYĶź‡¾Łś’0]³ś!čų¢^˜7»źųāXŌ/­³žŲßV’ų³Y7l`¬©GMܰ/Ļ2dIŅ7D!1RÄ ˆ (¤ŠŪ „"†HŐ ±ćaD*yˆ HXݬäŹ[’¤IA$!Nŋ­Yę%Éą³Ļ>ƒį²šĘ;§Ói6›½^offęÖR£Äf|ÖVˆsn”Éȗ_ć“÷čGho¦ŃČčØ?ę=śN÷6·ą¢°é@{»0=nvloā«;W^)KIž³ž¹Ø.˜9s¦Æ—‹ŗ-|ćAī ? D ˆ™‹É„„x€`D „HD¼T  pŁłŃütˆĮÉ S  žōż¢óŪxĶyĀq2iĻäL żA}’ģģŁ³ŻŻŻĆ^“”%…B5:|ŽŅŪŽ{ūuˆh_¹ļ­˜dæ0·īŠģėŽøł¦~+9äv:­˜›!LĖRRd))‘Ó"•j°ĶćwW"•2ņ“¦$klč<”˜ļb/f2šoæg/ČC·?ųMgĀö¦¼Wn|ƒ ĘóhuAO'ˆeĄJ€°D ³ Ā4³d>÷ē’“Ÿd޾>Yļo_ē ¤‹Ļż£ęsāe ‡9HyW3ĻĻJ@%ķ—1ŬP=åĮ*•3óI&= ˜^Æ’½×CS'xāšŗ5߀bĪmŅ× ĄĻAo$&;`“†€ˆ ēٿˆ–³‰Ē]b¶Ū+–WŻōć&ŃL>µĖżw³W<éžxkül’Ų/ €łFv…S£Pā ]Ģp¬«Ōķ¾Ü¼•]+[›O“µ4į@®¶–¦Ÿ÷ råۚ›č0B¦,Ķ™³žYĮ8!ČrŅē™š^<Šķ~Į':¾¾qsD“p鼂`čī™ šš<°,ˆ8`DĄ&²ß½›ż“éÜłōĀ›6žčJœĪŸż!’—‡ž“>T8R£’C?t Œ6“¤Pā‰kT“ĖvŌV\óŻŪ°­åńśŚõyĖõÓÖ|÷¶Ćåū tĒ6\-t\„`ĒĖ–W3æäJ5V²æ2nkާD‘g¤ßśęó~]4Bõ”āĢ›"–„uó"Ż~ī·LVĆĒ wø ¤rH”ƒB š@€!ąė… €e ³•÷žå$É#¦‰ŚDĶn˜ĶžyNę˜$ļŗ RDĢāT9 dp {ĮS£Pā ­V £]±·®śP]õ”­O®F‘hm>±”ĄTW}(-]ßÖŅ“u]~kó‰¤äT\­ĆēŖ+uՇB‡TOO™µ‚† X³3ōXä°īņ›pŅҦC R*o~įē·;ž{č!_‘ęZ`*•zŽ4i4 #!• ćį+~r±xaļ§]ÜŪߥ™>ŠL„ !Ī÷Ą™^šóĄ0Ÿk^ĀN›rēóęMūšų©'` ~Q00XUßīīnŒ =š‰ …gąOŗ­łÄØļ€ś¬%„;¶w¶ūōY‹‹Ž­  õļŽÕ”7/)9u0Å å6-]]QŽ_~ m8:&os3F^t±Ūķ:‹„-ÖĻž“yĪÆ–% i!  ĮĢĢ[Ņ;źD3ś8’n_ņ_Ł Ÿ]güõtsŠķ‡@@Āē8tµ/’ś}mŠYp’ŸšÓżB6³½^EœīJMæßYˆ±(`X逢ÓéčŲ, å²@Śńk ”ĻZlŁņŹü¬%h!%%ĻŖ­>ˆ6SmõĮé)³°$|C}ZT#oŖ‰…“Rś»V^A4 ߑ Ųhõe ¼^ÆV«Ż»wļ­·ŽŹ²ģ?é5G¹ééÅÓ·ĆrT?a–·Š•ž©‰Ą±äė.8|Z( ¬€Āąz¹'t]ų'd[›nE·d/+¹ U]ŗ’K8~üųˆŒĪė’Åy<”NOccćŠ+hy' eäąM|讏W†ŻŽŽD”ĄnØĀ5«ĆŒ XQ3>*Bo—#Z››ąŠb`hĆQ»zÜn·ÅbĮjŸjµŚb±`õį@ ””ŌŽŽNHēÓK¦żPÆž÷ŠÖ¾næÄėÆžĮĆž$ń‹6H+„ŻbyČX10Y2ōqĄō w¢¹³±z³ēG"¢§%²x–Ī;ŁŁŁ1'`ŲL9̌óśĶJ(V«›õĘX»8…DÄ+Ėå»,ƒL4,Ż»hé½ļ½żzƱ:Ģć”&äĶ—īŲ*H—5ŒŗGÅxĄčxĪĻĻ·Łl¦§§Ēēóq'Ąēó„ÆH=t¢³°āōggzģ$Ō0ŒXńĖŻ·šo˜ś‰‚ė–°<°­VKģŠA;”±±-›Ķf0Ą¹sēśśśpŽŽŽīīn…B”ŃhPĘĻ‚?™ēģśčÜ/ńõrżCÄx¬Ä EķNB6Ģü›Ŗ³CL8ĀóŠ„^YĄµö¹ƒS ™ū¢˜^ĀL€ Ū‹ƒ˜Į`M%R«Õ“č%Ö~ź”/‡č67V`’ Ć®Ńž—歀в=¶ O”īŲfŪš„Š+yaī2ŖŒ]1Gn<ĶĻZ‚i—ŸĒÉś4žŹp:F£±   ±±Ć]N§óÖ[oõz½gΜŌ ƒ^Æ÷ܹsĒM™2E­V³,ūšSŽzS`¬@$ ų{€ Ćˆ€ iśŻŽ˜CB,0)ų|>ĢBօH-0 %^½Ciii°ėƒ‡Õƒa,f?f‡Ļū£Å7mÄ<œN§ÕjÅĢ#­Vk³ŁL&ĒqķķķC8 GˆD"Q©Tb±ø«««££# z{‚æ8tf÷Gē€ē čļ’ćy`X`ÅĄŠ,0auńQ-°wžI»x–üŠ”C÷ß? Ł‹™Z`J£Óé²³³«ŖŖö½µóįŸnzåé)³bY„†ą½·w@ff&UÆah¬VkII \:ŗ«³³³½½}T •¾¾¾³gĻ&$$ØT*™LÖŁŁIHēäĪxųöɖ-mģ†F|€`Gę‰"!)ó!…£ųšŒal$ŠRRJ¼‚w؊²=BŠą8£ĆēŻ÷ÖN°X,ōt†Ēć±Z­ƒÕ+??Ŭ···­­Ķē󍮛­»»»­­­³³S©TN:5!!!U-yw„īUi35 ’€H ¬;Š ’æT½B$+Ü2µŒlŲQĢTĄ(”8Ęh4fggw¶ū°~üųć½·wāš/:Ņf0ģv»Į`Ų“i“×ėĶĪĪ®¬¬“Ūķ …āܹsēϟy²Ęe±¶¶¶@  Ńh&Ož,‘HĻ’yō¦MK“U ’~SLHV„ŠcƒŖ)–+sAŒBēFŲ{oæŽz jūŽ-­Ķ'Šü¢ez¢6ŗ«øøŲét~ūŪßnooŻu-ƒ.\8wī˲8bL$­¹}ņ‘Go^“5 鯅H "āśļET2B:dx0 %ī0(ŚųÄ8ūh»_ŚŲŁīĖĢ̤ęW'lt—Ėå2›Ķ]]]mmm×ó`śśśĪœ9ćõzqĘR©Ō$ˆ6åL?ņčMwĶ’_š@O†6ĀRUb0|IŒB’ąµŗźC”½%杦źƒ8x9Gą¹Ķ­Óé„p—Ėå²Z­¦¹¹łģٳc•UŽŚŁŻŻ±ÄÄę*ń»+uļü“n¦J Ąó0ܱ„Ŗ%ąół06’Ž­TĄ(”ųĘ`0¢6>²9:|Ž¢ OĄŗuėhņ”€ĆįŠétaį.ĮL™:ujkkėČó÷Fžē}>_[[[0Ōh4S¦L‘H$w„&yä&kĪt•ŒV4źfŖÅ8Ć„GR÷rĢĢårŁl6,ųM”P®ņ©<33³³Ż·uŻźqšqŠ6>ŃÖҤÕjiō ĮT+V¬ w…I»T*ĶŹŹš;wī—_~yöģŁ±:Ō`0xžüy!0¦ŃhD"ŃĆ·c)Å)k‘Ø%хxīܹ‘Y3›Ķ ,xź©§rrr؃›B¹z°nH]õ”xĻHÜ÷ÖNtŚķö‘8‘&.—+,Ü5ؚJ„2;;{Ź”)_|ńÅՏ\¾b Œ~䦻R¢»S,°“'OĀČj73cr2Ё‹”””Ц̔Äét:Īx©æg0Š‹‹ tĒörGiœ~ēµÕwæ“ ©ó0ŒōōōGyd$¢žœœœ››ŪÕÕÕŠŠ äD\00ÖÓÓ£P(¦N*“ÉRUāwžI÷†)u¦ZMĄ$ūiō‘w—ĖEÆNJL=šźtŗœœœœœN/×§ŁlĪĻĻ€Ż/mš ĒĒėk·>¹ņóó©ó0’¦¦¦?žø¶¶v„UóēĻæżöŪĒ<0ęõzĻž= 'Mš4eʱXü½•G½ééÅÓTŅ‹ԟėšŁgŸ@fffŒ Xäm§B‰)„BØų<G7S»ŻŽĮ° ¦ųҰćõµ L˜7O3£Ž3O:õ£żčÕW_u¹\ĒŽ‰‡0Fc@ąüłó.\`YvźŌ©†ņō’iG¹é‡óŌę—¶Įd"VĢ`0ąs"’MĆ`”˜¢¬¬lˆ—1ŽÓéŒ; U/§ÓIC_‘÷ĢO?ż4;;»££ćõ×_’я~TZZśÅ_øŻī@ 0ģę1ėķķ=sęLGG‡L&KJJR(jk»7åł³ļJMTIY0 €ŠŖ›$»Ż^YYYXXˆ½AéJ‰)аŠ›;Oėń„aT½FØaN§sļŽ½Z­öŌ©S›6mzōŃG’ųĒ?ÖÕÕµ““Œd“'O¾ķ¶Ū:::Ę60†5Øzzz”Jå“iÓ¤R©>IöīJmY2ųż~”Ų ;VīNg4322č„I‰5„¢Čo~ó›ųŗPe2ŁŹ•+ß’ż¦'žr`朗I³3ęĒę”.ßæu]>UÆ’‘‘u].WCCĆ’žļ’677'''÷õõI„R™Lu+æßļńx:;;€B”HJJ:yņ¤×ėU«ÕchõōōČd2…B!‘Hü~æ„8räČļ~÷;ŸĻg4G’ÅCūQ(Qp»ŻBCĖ8Ńz<“É„­”ī{ą‘a[®\Jwl+ݱm\Ŗ^—{r- >f)ŠżčG«V­ŗį†RSS…ÕėƲ,!äóĻ?ŸQ“ń 4¼233±—=;£bÓŲl6›Ķ†£€’įžį‘GŃét³fĶ‚ÜōAe€±X|üųqžēSSSÆÅsēĪM™2%r’.—ėż÷ßommµŪķ§²²räcŲ©€Q(«Õ*ÜćróV®ZūĢuó(¶6Ÿ(ݱ½¢l¾,,,¤¾ŸQ1G ŒuwwŪ!ŒeY‰DRSS3ŗ±@ pį¹\>kÖ¬P« ųż÷ßollt:‡ʙ#Œ~Q£P&ā=Īb±#ŪróV.š‘kj…IWvvvh uŹØćt:­VkX`,))iŹ”)ƒõhfYV”P`PŹķv?~|TcgĻžeY62ÜåńxŽ’żcĒŽ>|Ųétöōō\ٵAŒB¹Ä›!ŌéĮiĮ›”Ńhʍæ+ōiéśå>²0÷^…jŌņŖ;|Ž#ūĖĖö ĆoOV«•V8¼>Ųķv” Ģķ·ßžÆ’śÆ·ÜrĖ 7Ü P(Ā2;!r¹\.—3Ģ%Ƃ?žųćŽŽŽ™3g†™M#¤½½½··wÖ¬YaÉś===‡®ŖŖr»Ż‡nZ­Ön·_ĮµAŒ2”Ķ—Ėåt:].—ĖåIQµZmĄh4ʵ%įt:ķv{舷…¹Ėęg-Y˜»ģŠ]‹­Ķ'źŖ®8€呼¼<‹ÅB„ė:{śé§§L™KHHP("‘(źz{{].!ä²c½½½gƌ3f̈|@Äp—Ćįp»Żųƒ²ŁlW\Œ‰ e"šYv»Żįp’’S“RR¦g@[Ė |ŁÖÜŌÖ^U«ÕšL&“ÉæwgĒc·Ūķv;¦x r„JŸµdv†>-]/W©ēg-l󌟃>oƱŗćõu õu”_‘V«µX,˜IÆŗ1|J Œ=ņČ# …"55U,Äŗ:{öģ—_~‰­–‡^SwĶ™3'ņ0"Ć]………‹åjFPP£L _2Ž©CuKŸµ8-]??kIRJźHBAĒėkۚ›ŽÕÕVœc‚’Y,–ų½Y£KĒįp®ÅHäJUZ†¾”¾®³Ż7Ų:ŁŁŁØč4Ć0¦¬ķŠĄŲÓO?m4“’’nøį†ĮĢÆČĖ£©©)99y°Ą†»nŗé¦0Qōx<ų°īŗ¬Į^W%`'öŪIPļeč_ÆĶf2äJÕĀÜ{å.Óg-¹ŹØĻįņż‡+©Ų/ÜŠĒ‡» =«čbõx<”ĘY¤ ŖÓé žK‰±Ģ`±éÓ§p555a±!Ā]N§óȑ#õõõļæ’>†»°ŪĄh]'ƒ ˜Ėå²ŁlN§3ŅĶ›ąsŸŁl¦Cś)Q<ŃŽZš·r©iÕØæŃįņżåe{„ĄĻxMXp»Żn·[§ÓQÆ`œ2X`L§Ó)•Ź‘ģ!406Dø ķ­ĘĘĘ÷ßTĀ]#°Šņ$ĀÆ1ĘT‚ŹŖÕj‹År•~UŹųų” Åāąz { K-? …2ź÷ĢØ1N'•JG²‡³gĻž8qB”PÜ|óĶ‘;w8­­­ļæ’¾ą½»śp׈ĢjµnŚ“ §óóó1@ēŻDč렃ü'86›ĶjµŽÉˆŻ0S«ÕV«+ˆS(1럸²ĄXäS#†»0SctĆ]Ć ˜P÷3~Ÿ‡ŁlĘNN§“jŲ4¼„ģiéś5?Ż0×%Ü5Œ€ źU\\×-’qšiMM Õ° ųDi2™ŠšZµö™UkŸóCŚ÷ÖĪŅŪ:Ū}jµŚn·Ē…?ƒ2ū®&0v}Ā]C ˜Żn/((ź¦aZ­ÖårŃxŲyÄk8-]ænĖ˱ÓĀńx}mц'ŽÕĄÆ~õ+źN¤Ä&”eĘFC{+4Üu³ĻóG§Óy½ŽńTaÓćń †ĘĘĘüü|ģLHĒžƒÜ¼•kžŪ<Š%‘F…Ÿw÷K1*F/HJŒ»1, & ;}śtčĄd wåēē[­Öėé*'<Ļć?333öĒ{]ī™ČÉÉ€††~˜ź#nĆĮŲ÷ÖĪŻ/m¤F‰ †ÅbAbX`¬§§ēż÷߯©© wÕørįĀ4æ¢va «łˆ/ !øH˜#, ż7źš‘«Eī$ü &ź ‘Ē&€->éżb"Ø×ŗĶ/_‹^£K¹£“hć“TĆ(±ʄ¤t Œ‰Åāæüå/ĒŽĆqī Õj­VėXžHqqqAAATóK TŽėq4äjK[…§ĆįX±b…Z­JŒSØzQ £PFHX`ģļ’žļ;6&ᮨ0N§†NŽ ©k}4£ž&“I­V{½Žqę„€03ŽŌ –šV­Ūü2”””Š„JŒ£ÓéGeeefffGGĒļ’{¼—ęēē»\.«Õ:¶)r šĆś.Gh„ ±!äZ˜qĆīÓč©€3ģv;:7āK½Ā4¬ØØˆa”ŲĒh4ŗ\®āāb­V›]YY#ćņ9Ä”„Å–†6’†XŹóüµ°į†Ż'j3ź4e|€ÕĪ ÷Ś6¼>vߏ@AAA¼<]y< Ō[,ź“Ÿ€˜Ķf¬y;E>ĮNBĀR9.÷=¼ ®ÆŽ}ńZ}ŲĮ\Ÿ@%~H^Æ7-]oŁņJü~ЇŗEŸµL&S\čŃhÜ“iSUUUQQ‘Ńh¤F‰Z$®R=Ē’ßŽ®Ö+±†~kŚĢl‚ƒTäJÕś—Kāż³¬/zS®T566ĘžųK‡ĆŚT„¦¦ĘįpŠ«‘»6ZɇRuĻ’ø{XqĀ9”ó©DQBq¹\EEE°nó+׳>ļ5B”RÆłM(**ĀtŖ˜%ŅŽ¢nyJL ŲhyäÉ7Ė&'·}ņ ąœ3ŸTš\0Rœ"=–#4Ńś>ż¤ķ’žBÕn܃ĆMę.[“ōŽńń‰ęg-ÉĶ[)|“˜%2ģAė:RbZĄ®.č÷wy=Ąó)K~Š}¶Łżžī`_OõĻ’©éĆ· ĆŽŹ»šĮ`—żĄsOõŌFc`滯ŽĪĆ5ĻmOŸkĶs›Ń‘h³Łbö u:]qq1¶ÜU«ÕÅÅÅ“L6eĢŖéĖŠ.DaičjBŹbgŪń/’ēē¾µ=Z!ĄóA_żįÅS’ēš~õiņ·8:yž\×ęēŁÆėA ĢõpM¹ž` ,šŃqą<¼ÄE”RÆZūģī—6bEƒ˜­=m6›ĶfsL%”QØ6(#ƒŠÕ„ŒyŅģ?)ĪŽśŃwķ¾ć©’’Ø&1"’( J=Ÿ'O‘@ŻžĻś/w<Żzų}.Šwe‡Ž[żŻOžmłyH䙾z:Ē·łÕŲؘ”œĖÕƘå>š”œźõzcŁCØzQāùnE7}ēź’|īS;ė«Ļŗė†DĶm Ÿb%a¤ĄHyNĢwt¾łć©żEüĢłźo’P™q;ĄHķ§.ūvņ—2F …`?%Jš²ä;ŌüĒą}ÕŚgĘė\µö™¢OŚl¶±­ĶC”Œ»œ÷›O›öo$>q“vI¾ø'y.ĄóDLÄJ’8M|ćō·ÜĘ÷‰:Ėwµżß)y‹ŌS#‹üF96w5‘sŠŻĶ]Š.Nū·Ÿ‹åŌ…8¾Ķ/¹R§Ć–GĀRÓŖŅŪŪZš°«8=éŹU ŲŠĻ7ī’Mwõkógqtć/| Ą]\Ž’’)‘É ·Ż.(.lł¾ü”ķ‰w°¹ˆJ1ōņŸ8øōĒsVęÓ9ī –?ųhŌ„Ēėk;Ū}iéśQiÖŚ|¢­„ ęg-‰\Z[}'"ßäJÕķ4…Õ"÷°üĮGwæ“ńś“²„P. Ēc·Ū±Wpģø‘ÆÄ…Ś %lēļ­ßõģ¤Īƒ3ē%Aßyčés ņżÉNmRBb¢Šā³Īż•?żW>0cŅ,=Ēo$DĀ‹AŖ†Äi žŠé ŃB¤‹o”Č^čJ˜dŁ!æ)ƒ^[ć·ŪĻ0Ż<”Ćåūwæ“õ&-]_ōnåÕæ]EŁžŅŪ`_Ż™°Eė ņźŖ /õY‹…įh„;¶įVˆ\©Z·ł•عž[ŸĢĒŽ¬ā˜›·r÷Kkjj\.Ķń£ÄŌoŠ`0`{°M›6ĒČ3֕¤ŃG7PƾŚķk’»&Ż †ž3ģī7øBž^’ eÉKr6»æ:į OD@¤m¢[³Ds@‚‚‹€ė†ö&8y>ż-üiCŪŪ?žbŗGū¹>N>ƒŖ×D£_ s—…%.ßæu]æ@Z†žś\©ĀPuՇ¶>™ßįó†.]µö™“t}g»oėŗüÖęaŪvų¼ĀÆÆ [ŖP©Q¤i…_JLaµZQ½Ųé¢0zćĄxž3ŪZ®F1‰®k`&'ØŽ?Üč_·ĪĀNĻ\ūę¹ī®¾„ĄØg‚b2Č5 ŸŹ) J‚I)0m$ßz’MžõöżAūÅ·‹ł^’Ń£Łn±X„ņXZøžš–g¼”ńQƒK-Ź]6æhćhxķśąć}ug®Ūą°“ żÖā²-Åh8Vw¤b’„ö¬PćŖ¢lOŲ¶uÕń˜qŪȝćǤUš(±f…¾ ³q"`ßģ±M;])Ÿ„ ^”..d‚ć O¦LKܽ{wSSÓļķ U8¢Nō’±’JŲś/>łsÉ ā>V,¹ų~ bĀL”«Ēįpčt:«ÕІ<õ©ŖŖŖūø\.”-6”ÖétF£q$³¹ŻīĘĘFX˜{o˜ł…‘¤5?݌–™O:^_kŪšÄś‚¼ŅŪóØtǶŅŪ0‚Uī(-ݱ­ÜQjįĢĆåÕ÷³åÉÕBÜ+”łYKP‡Ź#TJ°åŹš˜Š–`ĄE°„÷ā fڈ;„9“µZķø0ļ×µžżæœ’*f$¤_½¢żń<ĢKQ$&&Źår…BŃāį/Y!QŁÆ[ż$(‚£žßæ}°—MŠ€( ŠŻ~ź…ÆŹEŅóĮī® r” 9F3Äć¹ÕjÅѾf³ŁjµĘBƞQ1æōY‹ĆņPT’’SĆR-j«ZīĻ­(ŪSW}ØtĒö ¦Ū^ŗc;@åe{Jwl„ēx}ķĆ÷ÜV“ńÉŅŪ÷½½SŲՆSEŁž#¶>¹:ĢO8 6Ė !ĀXŗcȕŖČ ¶;^_¹[}ÖˆĮ҈.—Ėd2B Õ× …ÕjĶĢĢÄiµZ;£GAĄų`ą«Ģi7&…@°·"žxVf%Žv#Q( …‚0"ą šŒ„eP·šÆ›ėqžļoݵ% [¼G‰’p“X$ćłĪ/=åū'Ś•¤Óé&TU¼/ʽ7Ŗ)“”’U<ę.³½S«ņ"éšy7˜:Ū}IÉ©«Ö>³ü‹‰Ž¹y+qŲYg»/ĢO ‚ĖõÓ0›cK±#2+Õ.)9°HńƒģĒXó"bś¶–Æ©©1“˜ļÄA£Ńø\®ŹŹŹŹŹJ·Ū;e0GAĄŽym¶č,3EBHhÄką€ P‘^ü’ Yxs·&±ļ®›„w',J€ˆp-ēk’Ķł3n"Aßzų9žėŠĒ‹§&M“+Éķv»ź²žśaÄ >/śå–ę­œ1]|Q€e{P¶;V­}64ošįŸnŖ~™Ć¢ĻZ,WŖŠ€ 3°„śé)³’’g ¶[Ō¶X3qGhäĆėõŅ@ŻD#1˜øZćü½¾’±ÉgȈ˜éW¬‹öžG.Ń3n’‹m’~šxąļę(.YŌ/` ×xŹ’›ŅŁö+2ą$˜ŖŸ™yJX3D<IJNķl÷…&Ö öVZŗ^ŠŌØāŠcȼ^oL™8“8%¹Z;ń’ŽŅ&śµ˜@XĀ! -ąģ0üėaŲīDą™"žš„–š_Ÿ īŁĒHzä7Jo:ŻAčå$Ėžū]’”2mÕNŁ­Hę=>s}1L˜DŽM›6Mš4 ūyOœ[Iæł•®v—ļO䋝ŗ> µi*Tꄦ•p¤āĄ„X3F×`¢`„Å”€F,EØÕjŚN…÷vž~-ÓHˆD0æ"L. @˜ž?††¹ų’PU#„šßœ ī}Ÿˆś QÄ&IR¦Jų?2÷ķ|õ ėH“õ“ļqŚ?’T¤™„Ń,Ī|¤āĄĆ÷܎ęŖśōŚZš¶®Ė5Œęg-ĮMŚZšJwl:ć£_ĄZšPóŅŅõė_. K5ÜP`ĀŠ—>kqčŲjaĻBĢ '¢†čšsÅ`&=…“É„Cw ĆØT™ŹÉÉIӐĻ d |QĶHY"fȀ]żfŌ‹–"ōŽއ ×’ĒóĄń¼§XĀdßA€ a;{¹–³“ī9·ˆéŗ…ō?ūÜ÷ —šD®=o2™p¤—Ćįˆ£ĢŽ@{{㫯Ž[¦}ü±+ņF"`ƒ„ *Tź¢w+—ļ¼-Ŗ-Ŏ}oķģl÷¢M†+ß÷Ą£Ø"‹rļ]˜»¬¢l $Ė|taī²#:Ū½ø“Uk/¾ fŅćüå<Šr(WŖõY‹C+öź³–[%%§¦eč#ėłā®{kÕŚgŚZšĀr@łhT%¦P®'(`.—kĮ‚&“éśÜ‘†0ī£ü©rfŽČģ< lä ‰ē›ˆ”†„ų ¤‹Ą€n± fAĢ‚ˆ!,„Ą HW    Ļs<ßz’ĢŹσDʤ$˦ß0#ĄĶšœ‚4@õš€=SĢfs¤UŽ–QĆĀÕ c<>ŃŪÜņåó?kŻ[¦}ü1ĶYW³«EKļ «™;?kIdÖ"v=^uQK.éŠ9=eVh©ūŠĶC׌|Æ”ßtčĘqkŹ„Å`0dggć˜wp-†VƏœƒ3=N§liäL·Ū­Ńh†0ęÖø¶jīĻėIż›ä¶%7|;t©ßwž9s’ĢN0æPTHHō‹–1D,,0€g€į€ ĒĀóīOHŅK€p €ž‡/¤0«kčĪaćCĄ¢ĪG łüXĆ{ō£æ­žńō˵?&KI”?~ %fq:6› dz}‡A)‚Ņ-GCF*̲Z­ŲØÅb±˜ĶfƒĮ ÓéBC_‘;Įįh›6mŖ¬¬2&U2·ä³ł“õ܁ǸņG”żbĘTGć× Ļ!ż—„¾J³DÄ, , ,–;š7°ˆe€š_ˆˆD@DĄó솙w v˜96hŻ»ļcÓ_}~JĢŖWNNNYYYUUÕ¦M›†ØF‹ŠüœŠ:«›Ķf›Ķ†2&Ø`QQ‘ĶfĆ2xX‚K/óżĀ8 Ž!c8ą 8ĀūNšu„D‘ Ź›ĻĮ¤›Få4L_‘§¹3Kš’Œ÷Yķćį“,%YūųcøŽ0-KIĘŪ“0›«ļ¼ƒīźŠw…’F…U*µ?63’øųIwś|IÉ©r„ŗįX][KÓÖ'ów’ń\Z_£”¾nœ ŲčPĘ&“ »¢‡ IĘf³„„„ ‚ß¹āa!C‰D#ܘ¹ūßø¶Fč©ā/ōņŻhļ`<^Āó|ēŃņ"! D<]ĄaŠ8zƒ@xHHižĘĒaæ’1¤?Ÿž0Ōøīü—ÜG›ś¤’vļØä†ęmkīĢņßd))!7å‹ÓĀM9rsŗ«+Ū•lKYżĻŚĒ©.qėtŗŖŖŖŗźƒC'ųör zKwl+ݱ½­„éx}-jUķ@ōŗźCĒėė–^žĪŪ¢•ēs0ŅŽ%}c§©<å:€­t‹ŠŠP½†h§"¤o ‹O˜a9r·Ū-ōg¹xŃjĆŹ§Eī$Œį2ۃ_ż0č~Œ;÷²ü‡ žMdč#ŠĪIŗ¹ąēŃL†91–@’ ¦(ˆ'‚fČå !@ųƒĒäĆ~É"Ć£G-6†¼·pHžKÆ”ńŠśĪ;ī,?0gżsaź%\ń£K¹£t}A޾·vīzqĆrż4œYŗcŪŖ»ę,×O³mx¢Ćēmm>±¾ o}A6½ÄM¶<¹śk~ ī„W”Æ Z`ŲfčRƒ XK„Db·Ū]PP ¤/(( -Į&6›ēyžēŃbM¬4¦Ńh²³³1ÉPȒ×jµh‡EŻ ¶<„^B‘;¹L ŒU2‰ßćNž'ē’`>CĪ0D*į=} éå ”—žDB@L€!żĆæd2` šˆÅĄ’~Å ųe0żÅ¦ž`æł…ƒĆé_Š>Å®^¾—'r)‘)é4ž¦$§æšó!ʁ”€ÆÆÅ7Ų õu‚ŽģzqĆ{oæ.WŖ’’S±¼“eĖ+mĶMm-Miéś„‡+ŌUŠģNf- e؆m»<,­ĶM±v²"‹HM“ʜ”"ō;u8&“iҤIjµŚįpF›Ķf6›ķv;¦ŃGŚyF£Ō‚}¹“Ės!’”‡˜ą$ī‹ē{{ĮļēoR+©8±zų ×q< pHÄżY ·är <}½ōƒ4”ßmˆ–šŠ…ęēeū}‹< t”g ·ÄĻ9‘«rĬR93’P—ćÖv īęŲĮr©iekó ¬[øžå7åJvs¶lyEŸµ¤¢lJĄü¬ÅŃMŗ²=Ņ3KF„„ėCs:.7 ÖÖr"Ö,°H­¢Å|)”j$8±tčj&“Éķv‡ŽJ͘7 aK£ī$ōåˆj!’Y+˜[v’®Éą“@;į'õ KÄ–į{8ŽĻ9K@ĢBO/ōõß|÷xąĀ9øp<ēx‰a€ēē€ē€ō”3}ųƒä€(iŠÕĖ÷p„'Ģ÷ „„ĄÄ®,GL_±|ałaÕKøi^™nXÖmyeÕŚgėBŠ 6YmõA¬1ß0ŠB\…”.ߏ6–.;Ä śż„/_€qŸ1„F£14h‘™™IŪ©P®‰|eK#i5z’ŗ˜½ēŻąņ”³™ļõól7‘É{E½R?Ļ÷r %Ą1 źb‰Iž b€0ąļ©xx.¬ÆŗĄH‰€HŹē:{ ¼/ ,3ļļGxŌ‹ƒĖ7$d$×ŗV«mll¬½yøC”'ņ†‚KnĒ(Wķ>Į¢ŠģÕįóm|ę.žķŽŅŪ:Ū½Øƒ Š öqV«Õ±fā`-Œ^X­VšˆHs.§Ź¤Ö¼{ėøąš==ŅD)töUČ`/†ĻHtq¼čķ±øßIč÷÷›b„oųyčćAĀ@€ćš zo²ó‚$ž§ ‹Ńh,))¹‰ˆXiIJNUØŌ˜Fxø¼æesä&EŸĄšōė6æ"ĢD£­®śżŖ­>xYEqƘņ ĻńR„ŒB,ŅDfĶÆ”ł8·ļeų¢RŁķļhēeÉŅ~éb }}@8Ā0¼X@8čīé$”Ƥ2 ¤2čīw$ŠAÅšsōĆzż$Ą;9šó] =ITĄ.WFŽ>k ĄvČĶ[fcĶĻZ‚żĘąŅņ¾Č¾·v©8 WŖÖmyYčØŅŚ|Mŗu›_NJ™uø|’{oæŽp™I(hóÅ €Q(q.`gš9‡][ÄüįDŁ ģé~• €"Ā×/Hœ= %Ȥ2)pAųōų‚(üD 0,ƒŠėų.Ž;ćg2ō$łVz’&ø€”QŅįó*®A“‘łYK°×å†ö “+ÕX™~aī²ŅŪ10ę<^_‹ ;Ū}–ūsNHD*Ķcē°Öę‘ČØtų¼G*Ą@59 …2—׊24ĀDD"ę[/æļśĒ÷ÜØ)…ź…L™ S¦‚D R ˆÅŠģĻ;A-¹¤`Xč BOŗüņ¼Ÿ a’qSä1ŠŅ½ N‡¹G*ö_£·X’r jXéŽķ„;¶x£Łó±õe¤’PH÷ˆj< 2v1±~ÄF~L­VKsü(q VęF»c<Žč·Ūm·Ū…™ĀVv»ēŲķvԌÕč±āUY`Ńó#z½żźE.­vČūKŌ‹ŽBÄ@¢Ä8u*ĻB‚¤"±=č €?, Ąs“ó~źĶd„‡Aæ˜Ķ꧞zŖ¼lĻØ4ŠŹĶ[–O8;cžī?~r¼¾¶³Ż'WŖBSŽ·;0į>l'iéś-Ŏ°™IÉ©ķŽEKļ:>+Tj\-j׏ئę%VÉf³y½Žģģl‡Ć1t Õju8Ų~ÕĖb±Ųl6›Ķ†Ņåv»-‹Éd²X,+V¬0™LƒK½ °Łl6|Ō3Nõ‘Ž aÖDΌīćüŃ Vƒ‘‹ŻĮ€aaA*…9šu+8 h$0EJ1pAčńC_$,°zƒG ałÉ»„Ć\†™y„V«uÓ¦M………4ž§øŻī““4ŲõĮĒ#qĕ;J…ÜĀ0ōƵ[Z›O<|ĻķŠŠŠ@-0Jģ`·Ū „—Xkcˆõq<²0 õÉjµb[,ē‘““sįĀ”æZl‚•6iŅ¤ŹŹJV‹śF—ēBŒ"i©KÉŸƒźf Ä"H@&ƒD9(T ž ““`rh¦+‚¦6Ų[ož„$ ųąėo7ß_&±—ēyDĪ›¶š= ‡šRkl" Óéņņņ`ß[;Ē÷'ń‘ģģlŖ^”X°Š—”…}óšŲķva+§Ó)tQ‘Ča²TUU…+óF£V«5™Lƒ•Ćæģ$ް±V„>%‡›ńķą”Żģēv¢‘I‹AÄōB_Īö€·>o‡/;A!†‰0I *1Hš0"ų9`ąxVøg#LKgyßkˆŃ]46A0›Ķeeee{V­}vŲTŽQń4Ž ØŠ“H.%ÖøÜ1f³Łćń`ĮLt<^ń[;N“ɤÓé°§åUY`CXBdŃCåßžt!šn÷ægł²VŲÓ Å'`o+T^€ó¤*!E“e aĄ„¾š<š}  p‰ŠīÜõžY‹xžē8näśD•l|c2™“Zmg»ļ½·Ē­Vī(ķl÷iµŚX0ģ–Y‘2īŸ C_ęē绉Åb©¬¬,** +0?„ŖÕꨬF5t%†5‰C 2BĆ0šżgøų1H$Ü©¾ćuLN€I2PJ@Ģ@x`D @ 3,“$Éɞoż¬węBŽćP½„7ā8nX„Łų/ß}oķģšyĒß§ėšy±f,GjĶfó‚ 6mŚ“bÅ j&N“'Ƚ{÷fgggggŃN%ōŗŻn!f†’VZØF©yF£1r&\ qP Œ†aĖ~āO˽[Ä5Ÿ)Ć$²DBĄDD8‚<€”) “e(öLY⛵‚UL•^jxŃźPįīiµZß{{§PxpÜšŽŪ;ŪZšbŁür¹\%%%ĀĖ’’“ÉD³%'”†üt›Ķf“œ2331™Žjµbžįŗuė†ŲjŊ0ЈĻn·ėt:›Ķ‡»r ,ŅC c†eYH_Ōóų«}ĖĶ0%‰ˆ9NĀKd|B$&€H ©4r˜®„Ģ™v^w×WŗĒZR~+Cw.čāeé(½ĪĘ1ųÜWŗc{kLö{¼bZ›O`ō+–ͯȬ3ŚŒ2„”ęįeƒf³Ł„ŌDNWXX(¬Œ¶šÉdŖ¬¬Ōh4‚V 4×0åž*‘…Ŗ0t„ —¢žq @___°ż¼č‹?³'攝9Ęš=D #Ą–—KŪ„I$ZH×Å&ĖBH$b±X,‹D"–eIW¦a4~ļś‚kńŖµĻĪĻZrŻŽ½¶ś`éŽmuՇ@­VŪķöųʃu»ŻN§Ó5Ą°żąÕjµįRčHĆĖ×jµ†6ÆCIˆŁާ­VkµZ隊Ē汣lhŽ_7 •.(,,“X,ńņ åp8‡Óé żA č³GĪlØÆėl÷Eź6?4ō!’r½L¼ Ć²'c­Vk4i‹XŹŠOcIÉ©Ė|taī²é)³Fń]:|^,‚CČĻĻ·Z­qį^Ʀ·8ä?T®ęg-IK×'„¤ĪΘ?ōŽ××¶575««­>(ˆ· dB»B åś XŲ] –‡ˆŃŸeŲ [’ ÷h}ÖāE¹÷^„’µ6Ÿ8Rq ¶ś 6ōnŁń"]v»Żf³aĪ ŖūĀÜe‹–Ž{•vjmõĮĆåūT䜶E(c)`Ź8Ąćń8ŽŠ[6޵Ó2ō³3ōś¬%IÉ©CėYk󉶖¦ŗźƒĒėėźė„4ą€ “ÉN3»ŻnµZŃU(WŖꎻüĮG†µ“.—ćõµūŽzżHÅ~t3R£P£PFĮ Ć`OYYYäR¹R•–”›5ŲŁŁŁčøŽ—d<§Ói±XPĀåJÕņ½ļGÆé`ƒŸ÷½·w–;ö ŽkµZ»ŻN½&*`Ź(ÜŠ1×Īķv$ܛ­Óé0×.¾īĀĒb±`8šśHWūŽŚYŗc>Äūø‚‰€ĖåŠż„R*`Jø}ń÷ON§Ód2a07oåšē6ÉļŠ‘Żń8Ą`āüĢfsUU•V«µŁl±|ŽØ€Q(ć”@ARrźŗ-Æ\Ļ!qQ9^_[“įɆcu’uĘB ōPƃĶf‹MkŒ”'ŒBÆ`QPTÆÜ¼•¶w*Ē\½`vĘü¢w+ļ{ą(**2 ‡ž¬{}„„„­Zµ ŖŖŖ,X`±Xbš4Q ŒBŸøŻn“ÉTSS#WŖÖ<·y¬Jj ĮįņżEŸčl÷ŃB‘±ƒÉd*++ūÕÆ~e4O:ÕŅҲk×®#GŽ€Z­¶Z­1U …2>Ÿ£±!ƒ\©ŚRģõłŃāx}ķÖ'óŪZšhńŅ[½óĪ;‹/§Njkk«­­ŻµkWCCÄX)u!R(ćV½ŅŅõ¶w*cV½`vĘ|Ū;•iézÆ×k4c§WżD6Ü@„R}ūƆ®ŌŌT½^×]w½üņĖėÖ­“Ė卍999F£1Ŗ[P ŒBo7 ƒĮ€źµ„Ų1¶ eFH‡Ļ»”ĄŌp¬ŽŚac/ „@KKKņöĻą®ŌÄM¹3ōI²ööö††† .ģŪ·Æ““W^·nÕjĆįTĄ(”ńfmŌŌŌđz…i˜V«u¹\tˆŲX]?“&M€/Ž7Ķ}å˜0’‡óŌ›rgؤL[[[KKĖ©S§b$0FŒB?`C®TŁŽ©Ż‚Å×GĆ,÷瓵4effR_ā˜ąt:srręĶ›·é Ēżææ¤)Jʬ¹}ņӋ§ƒĮ–––¶¶¶ŗŗ:›ĶÖÖÖc£10 eœ`±XP½¶;āN½@”RƹD®TÕŌŌŠ’‰cˆJ„ņõĆfśz¹_:³šõÆžŌŠ•šš:žü»īŗk÷īŻkÖ¬c&“é:ĘX«ÕJO…2ž{ģ1XūļŪo’ÖŅ8ż“¦NŸ™vÓ_ŽwŌŌŌ †ŒŒ zfÆ'v»½ŖŖjńāŽŗÅmźŠ\Į×Ėķ«÷żµ©óÖäsgMOLLLMMżĪw¾ć÷ū;vģŲ1th0d2µĄ(Źšx<¬÷“›·2Ē{]‹–Ž‹cœĶfs,wqǤ¦¦z#,°Č_›ŗ¾ūęń§“0 *½^ÓM7żä'?ٽ{·^Æ€M›6ét:»ŻNŒB” Åbńz½IÉ©kžŪ<>ĪĆ?Ż‚‰õ15fv" äŠÖÖsé <[āuž…Ƶūćó7Üpƒ^Ææå–[^xį…­[·&%%y½Ž‚‚ƒĮąt:©€Q(”Aq:Xc~Ż–Wā(ķphÖmyŹŹŹ=Å×YĄęĶ›ēė ³ĄHˆ–ńżZFĄ×,¬<½šõƏ¶ōjµŚ¹sēŽu×]o¼ńĘjjj®u`Œ …÷ęä歌…:‡£ÅģŒł«Ö>#|:ŹõAØvųŁ™Ž ,DĖČ%ĖNśśī’½ūžß7žó‹ŅÓÓēĢ™óƒü`÷īŻĖ—/ǧ““4«Õz-J)Ņ4z %ޱŪķr„jןŒó éšy¾ē¶Īv_aa!Ķ5»>„bŽ.`ƒo ĄÆ¹}ŹÓ‹§©e,¦ŚõÕW»vķŖ««µZm³ŁF7æ” …ĒčtŗĘĘĘUkŸYµöŁń÷鏄EŸT«Õn·›m¾nöĪįÆĀLĄśQI٧O{ųŽ)@ąäɓēĪ;|ųš®]»pÄXvv¶Õj­cŌ…H”ıłÕŲŲ(WŖī{ąŃqł—šV%%§z½Žė“Ņ6ĮĮ„‹yóę n` NH’ĘīÜłÕі^N7wīÜ»ļ¾ū7ŽXµj•\.ÆŖŖŹÉÉ­S*`J¼‚­ —?ųč8s†‚‘0Śōņŗ”R©"F€ń—k„A`¬ńū{ÜB`Ģl6ļŽ½{éŅ„PRRb0®>0F]ˆJ¼>/ēä䥜z ˜ Ū»wo,÷¶G<Żn÷x<Ęd2ét:4”u::͜N§Ūķ6›Ķv»=Ō1cŽ Äf³=õŌS÷Üs~Ͷ_:”a„ģCAĢpvč€iĮsgŲ)P\ĮTQcZ­Öjµ^q`ŒZ`J\‚^µÜ¼•‘źUī(]÷żœåśi«īšS[}šźß«¶śąrż“åśi‘{;^_»ę»·įŅUwĶŁņäźćõµ‘‹–ė§­/ȋz0xØų·īū9ūŽŚŗT”Rēę­>oŒćr¹žzź)œHKKĆ1v»]åt:ńƒø\.§Ói³Łpi, ŁFcHÆ×jź ’Łń‡HT¤ĶĆ@ߣćNĄšī’Ņšx żŽ»?>æšõÆv}t.99YÆ×gee½šĀ 6lHJJjll,((0W6bŒ …—ąĶq©ieųsō†'Š6>Łp¬:Ū}r„źšFg»Æ­„I˜>RqĄr.j˜°(-]Ÿ”œZW}hC)RĆšP“’SÓŅõ Ēźv擱tǶŠš3–••Å`KūØX­V»Ż>tņ¤ĶfĆĘ1f³ŁétĘBķĒAD”ļe$ĖU‹¾ Ā󮏚\7Čn4߬SŪ•\ō[`<<ļėå +[G=0FŒB‰KõĀŅacæ—ļÆ(Ū s—m)v¬/*¹nŻ,·;v}šqRr*mx2tњŸn¶½S‰Rf`…ŖTŃ»•ś¬Å‘ėĢȟ–®4;^Ą¾6qtĄ(wŻuWXŽ/ū¦?¦qŽ ö†]ŗīO{󍞒üołÆ÷Øvü:aēT9—ė?4;p"Lä€ō[i'}žČĄXQQQX`Œ …2žĶƅ¹ĖĀꗗķAkfĆĖoĪĻZ²hé½”ŚVŗc[¹£T˜s¼¾¶¶ś ZK­Ķ'j«†™G>ưBŲ~Z›ODÕō”Y˜sŃp¬.l+…J–”€ĪvļŸ õø³Ż6ŃŅeq'`G­ŽĖŲ¤Æ— }Yļæ”Ē/-œvą¢$ńœŃóļtmŪ¤;üĻ·¶,»©eōMÜzŖōöæüčÖĪ$EĄŠū™:č#įĪĘž—mźZųś×’^qšČ”óēĻ7 O?żōÖ­[õz½×ėÅRŠ#<×"z/ Pā „źr¤ā,0<«~}A^]õ!œŽ÷ÖėŲėr÷KėŖé³o-.«(ŪSŗc;ģ«ėŽļzqĆ{oæ.XW8±ūōčń+ݱ}×G6mY˜{/Ą“ŠP_—²“ĆēmØÆ€„y+‡ų\Ø ¹ė,Ģ]Vŗcūµ.¬7ŗźe³Łb?ė$”ŖŖ*€isĪ (NæäüīBÖÆ¦½óŁ·\=©üāöOv~7{.ĖL–1æ_ŹvĪOšŅ{÷Bń‘O5~“}ņæø„©—Śb¼ŽæūćóØó<½xŚĆw$'%%i4šłóēųᇄ„„+V¬ČĪζŁlC·ē¦…gøŻīĘĘFĮ^ »ūŚ:Ķ2Gi]õ!¹RµnóĖr„ŖįXŗ‡@PÆ“t}Ø×ŁīÅRń0ˆ3PČ(c({˜I8D±ürĒž5ß½­®śPZŗ>²$ńģŒłr„ŹėõĘE£K£Ńˆł‡q™ż/U„Ķx<½¢‘›ĢµsO)>Apr߅M’¦%ŒJL€ą8€`ŗŚ¤ž¦Ū³õó3’{‰8Śš”¦^X`Ģd2 ± ˜Ķę!bŸTĄ(”ø4æ0\4Źū£b÷.5­Z˜{/®Ų?Äś­Ķ'P½V­}¦čŻŹ /æ),ZóÜf,É#”įXzźĆ]‹m-MØyķŽ#ŃOŸµDųģ1ŽÕjÅ$Ć8Ŗ‚O3gμ$Fx»-wT4rÓīėż47įĖeķGīPžc'I a€'żŅ%üń}¬ĒµpńĢm3?Ur]—š_—vĘ ö6a`,333,06D† 0 %ĪĄ{ĶČK÷¢ópzJŖšÆąNŒ ś! ²Ą‡\„¹jųĢF¹ņbųó;0Épė“łQ×_µö™’:ōunŽŹ¶–¦¢OFĘŲfgč…Ļ/XVNjjjX €üæSóӂgn½ń¤¢³÷9с{I'K ĖōW߹ȥ_æ)V²ÓŗĒŻÓņ×ÜĪ’LsTÄĀß,ZM¾n_ųś×æ8x†Č”sēĪÅĄX~~>„”¦F”ŒC3(AŅź®n에gqć£sc łm-Mƒa •Zp "fÅc‹KN'܂=Olj›Š ¬N°Ąśķ$ž|@^śUÓå?,hł|9É(Äxü€ńŠ’’ƒÖī¾Śążģsī/k ŻĖDß ¬1PĒž‡ŚSįCŹ~qčĢĀ׿z·¾#99yęĢ™ēĪĆ*`Ź8ļ5I)©‘‹PÕŹ{:|“ż0µ=”Č9Q—FM5šĆåū@®TEˆņ9ŒL2 Õ°0 ;ŖžDƒį8½·ģŲócĒ Ćņn·Ūn·Ēff^Tz½Ž„3);o8}A"éä„"–HE@Hæ ¦’'hÉÄŹO’öŁļŽō’@ƲļӟĶ÷Mį;\ˆƒ #JAłz¹ĀŠÓąół†=l*`JœQx-š“r,÷ē”īŲ†#‚Ń:\~@ų­ōņ5Ō×aŗ|˜­[ŸĢ?\¾„µ<źėJwlĆąYdakó‰Ż/nLېŸ×¶į œŽ!™ń}'_Ō׬~čĖēÖÓÜrżOF£ÉĪĪ›i6›Ķfó¤I“pŲr؀ †1ȱÉ됭‹"ó%?ŻŽŗ81¬XŹ  ,žĖ‚ˆ @fČɍ3}Œ 8zĻfJ>śqBhø”\āB"ʼ$ųżž/æüæ„Į›¦ŃS(ńg~ ĘRÓŖŚźCe{ŚZš0-^Ÿµdłƒ©8Šp¬nŻ÷s0ó½y‹r—©8ŠŁīūŃāƤbĶs›w擱įXŻÖułś¬Å#éÕ²ū„ś¾ž†‚‹·ģČ C¤tĒv<`ŌæØņŒQ4§ÓÕ§šł¾ya[ėŽ}cxv CŌ4›Ķ5#1vŅŃ/=o޼“µ~ˆP0š2¹'·÷Ė;ÄĒ Ą2 ` 0,B8A­žķ»=®Æą ž¦‚Čļnj†É(‡aę]¤€©¤,tuu TĄ(”ń#`C¤ Z¶¼2?kńįŠķ^¹R”œ:=eÖś¢¤“tżšŸnFkFP;œZĄiłƒ¦ečĖ{ŚZN$%Ļ’+UųŽXM•ųoRrŖp0i霊ŃÓĀVhķĶĪŠē歌4¤B?Ėü¬%ś¬%ƒ™hC$4¾śŚÉ’·ƒķķō ¹¼|‚`u]"2„t0‰æ”ęķģx]!é%C¤™Œg ‚ō ·ļ»³¤ßÅĄ3E—®Ó½"=RšeŽ—KˆVJ1<©CŸ$€īī&ĀH„Õč)q>Ūj4š”Ē6FŻŠ`0ŒŽˆX„GO“ ‡cWVV†Z`ž£ÕĒž’Yo„ĆP}ē™ož–žjF¶²üÕ;OäĀŒ†!21£–‰ üyÌw™$ C Čš H†åx€¾tõBOƒ@xČ˜¹9„Č”£ÓńE ą+£—“E0¾æz=!šōāiO/™v芔ūᅥ)jQā«ÕŠĆņ±9ļe ²ÉÉÉĮ»žN§»‚Ž ø>ķ©kō47{žgŽ£ ²“×A§āōĖe))Æ¾&LŸŽ[ÖŪÜ¢¾óĶY8-MIž±"Ļs“Ś{ō#œ6×>žŲ8Ž•śĪ;śæ5Õ €–H#‰ēyąAÄ0 ),3U "ąA*ž/Čå„e0 Ļńä€ēć QMT*čį QnJļĪłŠ7FOø† ō#ż¦Ų]©‰pģŲ±aÆšÄA‰0Ąąr¹<ĻeUü0™L#“ޜN§ÅbĮé1ļÕšłN–¼÷&ųžJC/†žęęM?L½ ·_ĄZ_}­ńÕ×PĻB§[÷–5¾śī§[÷–€÷čGĀ“°łųŽUĶŽ•Ju²?ƒƒ„H<@žēS$@D@L€% f€š " H†€ˆ!21HÅĄ²@’Ø1€@L 1Į”.łmZ…šéŚ…ˆ`}dR µĄ(qŒF£Įż$Ēår… LŌ™3G3% uQŲ•2ŌŚ!ér¹4ĶÕg”u|Qй§÷–}łüĻX„rIõĮŽścĒ_Ų†OÜš=õ¤Ż1|‚j«Ź•ŖŠ,ŒÖęG*`f¼\©Ög-¾śł²””…å†Čڐ¦$€,%æ4YJ²šāōōyš;³ŠųĄiÜD}ēŚĒ Ū||ļźÓ®˜7o^“· ®HM r|·ŸūƒoÉw'×Na;€!ˆ€ BB< b‰DÄūĄq”~’!“;ÓÖ},']" —8›O’”Ģ‘»ó{>nf&Ÿē/Y]Ā įMĻ’{½Žīīīa/*`”ųC źr¹L&“F£AÅŅh4XÅĒķv£…łżŠ–²Z­n·Ūh4j4ōFZ,Ü _Śl¶M›6!¤²²Ņ9€ p”z!łłłn·»ŖŖ*,<3r+ŠŽ.KI9öüĘÖ½ūäé·;ž[¤Tf%ˆ”Jt õ47ĄūŽ 0ć†&Ā1Ąē5ŽÉóćū$įyēżż|¾ŸOjøD!•€lÓ÷7U]’ķĻhČß.V¼ś³EqqpĆåĶ·¦×åä3=n—EØēX\"võā‡3Ņ*_œ”ó’ö5¢„ ¦ž™¤„„¹ś†`t‘²W8Åē¹’pš?;Vw·G{##¼ ņ‚× ĆCa"yA¼†Ad8ŒxµŪDkāb¢#Ą@Täg¶wÉÖ€|¤»~XR»dĶыŗ"ĆĆ£šdćķ×ų”n0bĪpėÖ-‘H“sēNĢęp8õõõhƒ„-Éq~O©T¦¤¤0‡ĆqėÖ-”į zøqZń+4MKK æ%>ØT*ƒ,tŌ׎ž·“ļb©įmwõΜts ęĪEH„(W> õæ˜įÓbĒKū+žļßNž«äŪÆųT„JNMēׁM”Ž•gģŅ +ž.kćåÆž,\"”æ”)óYw’ć y”d1ģõzF>é[^Õ;üeæw‰ĀĆĮ;ā|4‘čŃĄˆ¼a ŠYž™!‹q|ēüšā Ģžˆį¾Ķ^ŪOüžĶĮ’¾5ņåIóßZę»nżįƇ꩓€s “DĒŽÓėõ8gK—.‰DĒ÷Æų9–įŽĀ© ōpv4ÆÆÆĒ?'ü ułp°óņ•öóæé¼|„ƽ}Ev榪ėŁņO¢pC“­įH~ޱč@[‘ūĀōFuU×öžĆ÷vØVÉĻĮź…'ī9’Ÿsę"~—#ł9BÅÆńārÓ¾rürVĮUŲcMŅFH„ŠW¶‘żhÕĪōĒ2)šĖߌ I~Ļų†Ā†¼^÷ĄšÆ żŽ~ķµ{`±¢£Ebń£œĆ‘xaŲ‹ ŠēšöŗDŠ„ČÜ.ķtŪz–yF¢žµ~ńŽ*źĖ{3õ•xukL®“x1 ¢ ##ęƒ#U¾Ž2FĆ`“]a6)éj|ėčķ‡\®ø=?]žłŻóæ^7–Óģó;VIÜ)ąq»¬ęŚźŹKgß=Š… ėŖ®,ĢėźhKHTY͵XB^,a¬ęZ4ųCW{[Ą O¼ŖłTn0ה=€Õl,„ÕĒaQ\\āŪÅß=’k>ĢC‰ K£Ći˜č%óĀš˜½±ģąwøūŽ?“ĆpH¤°D ‘Q½AO? „…wąŠ|ž;ß’łö–4@oŲ’ŽˆÅ‹#ś–xūĒŖźėr¹0 ‘¦‰ł†R©äÅfœžv»=ą×7Ÿ9Žs:ĀűP(čŗš’ ÕnČå€!—»óņ•a·ŪńÉEH„ĻżŖtŹwXåkqRqļ›ÅS³_ć'Uc¾7„ Óˆ±Ąd],‘üĀ3ņŪū¾õćē¶  ŒhŲvjŃچ™Į¶ļGĶŽš»ŽÆĮ9 ĶųÓ}č‚Ƈ`p "ĢŪmƒžšF¬\)}ö™åš—‘u»ž¼ ųöóœüQ* %qó ŒxaįTƒĮą…’›ÄŹß---§›|vÄÆx˜ĮĮ«ZĄéG>ŅĘqœB”f%uĻTßĪŽz÷re̳Iß~ū›Ŗ®Æų»¬i^>žIßO2xv¼““±·¤XĀ4˜kä±ėĄj®Įf˜hžšģɁ*Zu¶·b³ę/ķ÷iȒ[pS<ŠņµX·>x0f6ēśl…,‡C§Ó=’üóØ^ĒŽŪ²e ³(Üø-ī÷yė1“āqĘū1ˆĀaå[a’ Z< é±­påKعG , ģ›*õCī‘/?Æļt 5„ą”> ’Võāż£‰¹J,„ˆ° !#ę˜ ,Ė:Ž„K—¢'ćµG­Vk4šĀ±īwüŽF­VgddhFĮ ųy”Œa²¢Z­6 ģhęńųüķķ’a·»½ü"¬Ž™3ŁŁĀql¦²ų„ aBõ€³ļ-Ź×ņJ#epJ°«½­Łf^Ņ„”=ąq»ä±ńžż0s Ÿ[ņŽŠń‰łŽTo8ņFāŪæp~ņ_3;…*; ‰ˆY9»VvCmŪ’½µ¹ŃŚ`®ńø] ‰*’Ž—W.œ¶škÅé‘SåcõĆLNM·šk'ė с=Ż’(óŽćt:väIII1fhhčžżūCCC Ć,[¶¬ææßårżč[Ņ}KśĖšī3wī¶iĶ­‰ ,¢/|ń[_’ :bč„{ū#""Ć`dś½ąw†D#ށ”‘–Ž[ēļ"VūŖ—×Ē}0‹Āł:ōBFĢC¦0ŃüqĀ-Ÿ˜’¼ēe?›“zgΌg(•J…BŃŅŅŅ`®«pūtą™œšę“j”JMxC\žń›l <ŪūFń8µ6ŠKM* ±ÉÖąq»†!6eģv»N§Ć C†aŒF£N§q»Ż½½½øĶżū÷£¢¢†Y¹r„Ēćq»ŻÆ§ÆÜ»qٱź»}ę|$]ąõBX„GŗĆ%?ī]öŅ¦˜¾pšŠ†``D^X"š>|špŃŪ?ņŒL,7Ļ­Œ€‡b'° ’i ‘ fŒ!—kČåŠIJ'%®Ś¹cEvę:ŠčdĆH“ņ^pöŻ£gŽ)Ŗ(+ĮŌyŌ6±DŠ™Š|Ū¾ļWéу;T+1_øAEYɑüĢćČÖżŖ%ū5e‡^ÆOHHąĆ](f>ģééįÕ čīīv:‹/–ĖåK–,ĮĄŲĒ?Q<AXD,rGČ~žeźįĪē;V¬ŠŠņzĮ+‚°pšBŸw¤kŠy/B/ś§[ĆĻ™ˆ_4żé¢p ņ›(90b^įÓńv–Õ«~ĻĖ‹ābŸūUišėŗ¦†V«-//æ]}}ś™²÷ā®ŽV«¹;,"Uj:*æłCaŒ{‰%Ņ/ķ¦I&O{ F“Ĥ0ƒĮét@NNŽŃhT*•żżż÷īŻkƇ~żõ×R©”a±Xģt:ÓÖAŚ:ń’±:~YÓż„kĄ ᑵ¤wdéæu&ÕõŹ_Mś2SҲ!Ģ!śz†a`0üŽgm d_ƒgżV”‰¾)B/x`.— c`ęIQ?0‚˜°xøD²‘żhF’5ĘG&“9NćĒÕÓ/ŒŪėrbDŹ'¬ÕŁŽŠ B­Ā}Źõ"žy%øĄ›“^g{ė+?Ü<˜MŻf‡±Ā]½½½ĮŌÉ}dq""¤RitttæÓévö Ÿ½s’Ģ{źN ĆPōõB/ ĘĒō'ˆ"½"Æ(źėˆ˜?Ēy zŒró¼’}vkllÜæ’ēŸ>aqQr`1Ž F›3ÅķŁ= źÅ›°+>ԟų`ĀĢ5c•n’ĒĘgksĘŅVÅ­ó›€"cäĘŁ%0)?''‡Ō+HĘ wy<žI™ĢļˆŽŽ–J„r¹ÜćńˆDī×ÓWžXÅü²¦ū£Ļœ‹`@X8 öµ ,nŠ€ČE #Q1®zł:°µL$Ü»w/Č<ЁÄtÕ«~ĻĖõ{^r¹ß.Žy6ivĪ‹M^nW_ ²DÅÜsF&Ū†ta2aøkjSnżżżŻŻŻn·›ŒÅ3QcėÄŃ-†EˆCD4ˆĀłī”åĶ?¦oń£‰ū_~ł%õ$FÓ¢żüo<¶FqRā,ŸW£Ń`.āՋ§'Œ'%§¦?‰|ÅY Š­šø] …‚`2µpWšōööz<ž1c]_:Ā ,†#Į; ¢šQq=.WŽ1Ü@< x äĄā‰Ū/Å«?‹ŪóÓÄ·!•ĪņŁqåŁ• §ē± ü²_ćĆqœR©|ķµ×œN§B”øyó&˲k×®u8÷ļߟõz¤8^ÆÓéģīī^¾|ł²eĖĀĆĆ¢’ż!oĆė’m•tÉ"ˆˆ†ˆh„°p…=īĄD®bŽg¢ą³Ļ>€””0‚xR4¾u“~ĻĖ}ķķ޼1k3‡Bt:B”šø]W/žž—Æp[ŃÕŃĘ0L0•*&ؚ533³„„…a˜÷ßßn·’ą?p»Ż===Į'kLī{ŪŠŠżū÷ļßæ.—Ė„R©lqÄėéņ?č6üų»Ė ,ĀĀ!,D¢Ń,yŃćJĘ+Ścž šŃÆ`Bž$`1Ÿ˜;/_ńŲ{’Śų‡1MXÆĖ‰öKÆ×SśF€Oąćį®ĀĀB»Ż®×ėūśś¦ī žžžžžžæĄŲŚs׿ <*„¢Ńv˜¼ Ē~=0 €SŽ€Œ ¦‚lSźś·Æėšō‹óΈ «(+™gÆšÕ‹§»:Ś Ł/0¾UZZ ĶĶĶF£Q,ß»wļĮƒĆĆó3 Æ×ŪŪŪŪÓÓÓ×ׇõ;¢¢¢Ņ։?Ž„|kģZ&J Xž&ĢW̰Œļąą š00‚xó'.Wć[G{’j[›·{mŽī§>“ÉW/~8ƒĀž:M¶“_F£‘ģ—,Å) waĢétöōōĢ`ø+x†‡‡Nē½{÷ųĄXDDďU²?ä­’yŚJ”%šz'Ёjt36R 0‚˜-’śæ:/_©ßórˆŒG£Ńäää@iŃĮy3‘XZt½%ņŲķv­V›™™Y__χ»ųDóĮĮĮęęęąó÷fœū÷ļ; Œ1 #[ńzŚŹßļY’ĻĻÉ@$šhAšķ4QĄ‚©FF“CülRøD’ųö/BgH&“‰a˜ęFėü˜H¬(+in“2 ƒę’ƒĮPYY ‚p—pƒ+V¤„„‰D¢/¾ų‚Æ%8ū|żõ×ĀĄ˜X,Žg"[c?ž‰ā…x±`ĆjĘב ¾=•’"ˆIŠ×޾(.’©±,»sēN(,>åSB~nŃ`®Į¢ĄēĪ£ģy„ćøĢĢL“¤&“iüąPæĶfóx< OqĢįįį111K–,r:żżżš‘ÕńĖŚī/]ƒąõMA€ßē­WÉÕÖÖ¾ųā‹\å0r`,w/W~’½õĖņ‹”¦^ Õj ąģ»Gēn0¬ÉÖpņąČĖĖ#õņį…^øzõź„© ŃŃŃ)))ÉÉÉ­­­_}õÕÓ-óz½Ė–-[ŗtixxųU²?ämųyŚJõ‚Ń„ŃÄįo'Cz‚Īh4¦¤¤xÜ®¢|ķ\ †õŗœ„E=nVž„Ļ›÷īŻūüóĻæųā t3ć#‘H6o޼zõź§ėééq:ŃŃŃr¹\"‘``ģö¾g~ųŒDø%ĆN` …"˜ć“€D°ld?ŠŪóÓPČ< Žć0«~ĪiXÆĖY”ÆÅŠ˲”yčĻēŸ¾}ūöźźj«ÕŚŃŃ1444į.±±±!ėźźźķķ‰‰įWŒŪ’ńOŲĮF`“Ź”'#ˆ r¹ī^®\·įČ”œåcŲ¢L©T._¾\ųøF£¹uė–B”0AV`!#ˆńčko’${+lŖŗ‚Ėæ‚A§Ó•——@B¢ŖšÄ©õIÉOwū¬zݽ{×d2•——OįģäĄ"(6wŒ’Ŗ®Ó鰘žX"ŻūFń,WœŖb+*ŹŽėźhƒąJ"“…ć8N×ŅŅ£±M›6įņ᯿žzĀ+ŃŃŃ]]]ŻŻŻ3s»Żn·ūŁgŸ]²dÉcV}}7nÜØÆÆ·X,Ē9ųōÓOƒ†’€ÄŲ3.Wūłß,ĻΜ[éćĄ²¬^ÆĒ{œ<6>·ąŠę¬m1RfÖ¤kRb FƒĮ Œ)•ŹÕ«W/Z“ČćńŒsĆ_²d‰D"“ŁlSwéģ”H$ė֭󙊼{÷ī7ėźźźźźśśś //Ļ`0Lm>™Œ 4,˚L&Œ!b‰T•š¾>I„JM—ĒĘÆŠ[7”Óźźh³škšlV«¹ż’““£ÓéhĀš)" Œ}ūŪß~żõ׳ĄXxxx0ŹŌŲŲŲŁŁ©T*ƒ Œ¹Żī¾¾¾gžyĘēȇƒć8ŸpWFF†ŃhœĪś?0‚cÄåŗ{łJ̳‰sqŲŌ ˲Ēł'ƒÉcćåqńž{y\.Žfń0 £Ńh“Z­V«%Ė"'322^żu„R¹f͚ g±ĒXooÆś»p›¬[·Ī'ÜÕ×ׇ~kšį.0‚˜Ģ=żóŸ÷¼<’`‚ß‘-‹ŻnĒ Ø ÉČČP*•jµZ£ŃPAżŽ" ŒķŪ·/77w͚5±±±‰$˜#Œ'܅Ÿ%’p—Į`˜‘‹"#ˆĄ|Y~±éķ’U;w$¾]¼Ą_ ŽćĘz*ų5§D(0V`l͚5cEĀ|š Œī²ŪķĒaø‹’üĢųŗu0‚ ˆ÷$``Ģæ”āX466vuu1 3~øėʍ˜©1żp AL‚޿چÜī…#&Ó Œł# wŻøqćīŻ»š„Wž‘€D`īh’Łcküīł_“†ó•éĘxųp׍7l6Ģtø‹Œ &Į“¾ ?°ż™^ b~3ĶĄŲģ„»HĄb’ßO?1“ż"SŒB—$`AÄ# ƒŃhœ00†į®[·nŁķvaøĖd2Ķfb* AōüGuūł‹ĀGœŸü0›¾/|š¹5FH„ōróyāĮįŠėõŲCĘŠouvv Ć]ƒAÆ×ĻņPIĄ`Čåŗ³óĒżķćl·ē§޼AƱ°X,z½Ž'0¶xńā?žńø0¹®®·,,,4 O„ź A|cĀžņź˜_!Ć%’ĶU×É~ a’oūŪ:īü#Ēq³ī"#ˆ Øßó?p꩟õo^›·›^"b" Œ!³ī H½7Į³į­ĆŽ‹%õ"²€Łķö¼¼<`ęż÷ß·Ūķ”PEŒAé…Åč_Ģ¬ÆÆ7T“ž ʇ¦‰Š{+@nĮ!ŸrheäqńÅcsÖVćĒÕøY]ÕµqN€·KŸ[phĒīoś°dåģŹ-8·ĖgžPŠÜ7.JµÅ2`¢?Ŗ<6£hžā·*nMƒĮąp8č3@$`ĜÄh4:Nyl|eę{]Nœ—ĖĪŁµ>)ēłÄ÷€TW^B:qŽĶ-8,Ģ|åĶüyłĢ‹ Q„¦‰%R4pM¶įS|żŖøuņŲucvĒKū±R"90‚ #ę$v»żųńć0;ĆK—Ėߖ€XŹ€X*æ\ źŖÆ”źL” "ęŹcs'ĻUžłŻŸä±ń·K˜XĻū­„DÆ©c‰ėŽ7‹ ¼¼Ün·Ó' HĄˆ9†Į`@i øšj}Ņ£D>Ÿ,öŁŻžś~Œ”ÉÖī€ŪÕ×w`VsQ¾ż§‘äŌtœcā 0b.Ł/\ų5Öäįꬭųö‡DųBĖÉū3ab”?2Śm“Ā&[z»-£#ń7g8—č#xŖŌ“܂C˜ßįq»ü׊!xįdĀ‚Œ˜c`‡aN ŸKFR]yiļ?|ļH~Ī• §c¤ NčUU^źlo}$0ŁŪ`t¢ÆŠ½TWuM˜æŽĻzÜ.ż‹™e%ćg| ]ķmgŽ)Ā\Gylüę¬Ē bƒ¹¦¢¬“ }žĀńäĪ-8¬?ńĮ£Ʉ 1ŸĄjŁ~ičBŽ”žG’ŌÕŃf5×b4 f·«ÆæņƍB Ä9½®Ž¶“…yBc”œšŽ»tu“U”½7~ĘĒ#ėh»zńC¬¾xäT¹OŖaQ¾C_ŖŌ4aōŽ?23ĆĘ Ń” cY–Ņ " “ŒEū…ɇ> „}ˆ‘2„æ½YWumtup::ŖēŲ+N{ÜĪ-YŪv¼ō(-~ūīżØ"[²¶mĪŚZ]y‰’/ķߜµõvõuŪ‰É-ŖČ!žą;v?ZŃ,–0ŖŌ4į.Uj:æ—<6>!Iå_ĻÅg‹äĀõŌc]`rjŗ<6¾«£eYźFžP1_"äŠjµ•••Ūwļ{åĶ ü„ørįōŁw¦¤¤Pa‚ #B‡Ć±téR8ó»;SHmŸgt¶·ā\hss³R©¤A”Z`3‘„D©¬Š[‡q>ź±B$`Äܰ-Ł[Cؽ.gƒ¹&`|EY ž›žY0ż„ć8śl„4…H„2™Ģét?®§©q( ln)?rŖœp“­A’bž<ż įgéO• ȁ”‹Åbq:b‰4ÄÕ <.—<6žĻć?y0Jø“k¬e^Į³*nf*’ #0"tĮ{“jŒÅĖ”åĄN•ŸżżŸJ{“ć»:Śųҽ £7ąń¶ĖS_0‚ #BځĮhĆ'D[e;μS“Cµ¬(+É}aĆÕJcс^—³³½õH~Ī‘üœ*¶‚ßåÄĮ=>ĘHØ. č«‚®kKÖ6˜Ø”pą B™ōį-d&BNĄžØòĶ6+Æ7gŽ)ŗzńC±D*Ē»śtµ·aƒęl€ŗźėVsmÖeAŗF“8ų¢‹|Ūe­8MHĄ‚āŌ××ĆDåwg¾ƒeg{+Ö-Č-8l?ä=Yƒ¹kĢ76@Ėņ„łŖłx@lż(Å£½mś£Å<” Óh4Ę`0ØÕj„R9©…b™™™X.™˜žœAff&™c0‚Ģ£3o³Ś¾'rQ¾ Ģ#(W·‹wTž «{]ĪŅ£`sÖV¾j>fmxÜΊ²Ū 3CEōł¦ÆV«ńėæZ­ž°X")AFó“Ü‚Cü?yl|Œ”A)Å+eµōč¬I_Xü’ š6«¹¶¢ģ=TĒ`*ÜOv 뛾^Æw:ć¤) †üü|z— 0‚x"ążw`Bų‰Į¬œ]Ų©+·ą0š-4UóoKvåĀéŪÕ×Åiį‰Süœgg{+ŠVań©ēŲķ»÷ĮL,ƒŃDıb-ų8_,‘eY­V«ÓéŠŌr‡Æ­Į`ą}˜Ćį0 ĘīŃn· ‡Ć”ÓéP2F£F£Į7x^,9ŽĆŽe‡CÆ×kµZ~3£Ńˆćīe2™,‹V«å·žĀg0v»]§ÓńćACÉq˲z½„Żg’ńšš—ģ3Œ€×plžć!HĄb–`<Ų²õń*©(+¹rį4>…MŸ10†}/yšl Ų Śćvé_ĢŚ”Z¹Cµ²¢¬„×Ŗlmnrj:ß-s¬¶Ė3JQ^^ ö^ĮEF3–ę•––*•J„R¹sēNŸ„»Ż~üųq­V‹ws½^o2™ōz½ŃhDµŽÜQHp3¼­ūŸĖn·ćŽ™™™¼¦¢*ąÆž§šŒF£Ńjµ‡ƒæ"“Éd0vī܉Ūh4µZ-“É„Ēōī«Õjwī܉ę3Œ±®Ėgl8g‹‡¢v£$`ń49rŖŪnU”½WQö6Ę€õIÉŲśŅžO÷š˜įÆß$ÖĻ„ óĒb±h4Ō!ŽZéõzN‡Ī£„„…eYL÷@‡Įߊóņņt:ŗŠ±@ģv»R©,--5 x³.--­VĖ;Žćо”——£æńQ Ć[œśśz½^o±X‡’)|Ą#c£8žJoŻŗuóęM£Ńh4•J%jŒL&Ć |Ęòl}}½ŃhŌétyyy¼ā‡šŗŽeYF@»IĢ&“ŒXXdåģņÉ'\Ÿ”|ö÷j²5xÜ.Ÿ*V'α˜pļs„DՉs¾7}yl¼Ēķܒ½ļų#ep³qŗVN„R‰³^x_6™L‡£„„åJ&“„¤¤pŠ”]“Éd0ĘĢ$o¶šĪĪļĀqœF£q:‹E©Tņ§S((TćČ-rM'<…p_µZĶ_Æ1)))ø/¢x< Ļx8ŽĖČČĄėU*•ååå>Ć@‹ęs]ĒĘq\JJ (ś›"#ˆ£Š­ąs }P„¦'§¦lŌ°śāX%c¤Lrp«­“Ÿä¢lœ1C–ŸŸÆ×ėQŠšŽŠ?Ly½ÕB$łČ Ć0‹Ån·3 ƒź‚V#ł ƒĮh4āfAžbœQńWğ„¾¾¾¾¾žųńćųkFF†’x,Ė­[·ž…?Ž’u”7õŁĖn·ū\ ń“ )D‚˜ó Ēzr=üŠÓ ;Į9Lžīė£y3„°,{üųq>‘$ųSLŠcĒŽń»ć‰üĒ“‘‘!7z“Éä#WjµŚd2ķܹÓb±š~Ėd2eddųŪÆ OL šy0%%% ŃōO0ļs]ǦT*)łA s&źVĢ|ęa( S “Z­R©T(hAG}}ż8Ź †a’EŠ¦¾¾Žßo”Ÿ‚<…Ō'¼"IĘĢųńė9iµŚ––– +śū\WĄ±©Õźśśz<Uä"FīĒļźh„—ĀĢoōń(øFŹb±TVV;v ŸÕėõüƔ”œ]Ōjµ˜Æ×ė'åÉd2™ŃhĢĻĻGb·Ūńn®V« ?$“z˜(˜——'TM­VūŚkÆaV:Ć0ĮŸBˆ^ÆĒōB†aü%SÆ×³,‹åH0u^­Vū'//—£į°ż³%żÆ+ąŲt:ęsāōį$#bb„Ę'c6<’Žė1i‚7jµśÓO?eY³Ž;ʢšgž,¼āńłT”xļŻxḞōŌ \J…ł&ųeEøĶX§žĖd2a.^‚0µR&“aŒ —3ć‚0’ń ˆr§V«QŅj¹&ł Og4ŁQ(ńi!¢>åDˆąp8–.] W¬Ż³sĘ&[ƒÕ\ėq;UüRȩOHTyÜN¬µ! Ŗ5ŁnW_ĻŹŁõŹ7Ā£T‡gaع/lšø]Ÿ~śé4§ēĒeff޼y“²'r`Dč§&w¶·ĢtŸYźŖ®,ĢćݜµµčŌy8ūīQ«¹V•šĘ·ņj0ןO|UlEéуĄWė˜z]N\:½ŠŌ‹ ʇ’8ˆWšŒµŠkfQ„¦ēā+Ž®¾.¬ŗ‹,±”Fuå„^—³×åÄņQ ‰Ŗ'ŚrÓ¬gŸ’’BŸ‚ #BŒ%Xg¢|ū„ÄH™Ü‚Ć|ÅBŸó&$Ŗō'>Č-8ÄKHsć£&Ī…'N ĖĻφ€Ł¬°P‹>ØÕź›7o’õ$HĄˆPć ³"`pę¢Ŗ•Ā6`õækæ8ó»;˜IŁ<ɩ鯼yō§RWu ×/SĆ_‚ #ę° ;ūīѬŽTÅVT”•t¶·V”•œy§ˆšH~Ήƒ{°„Uƒ¹¦¢¬7ćwńŃŃlmnŒ”Y·.[» Ęh³*.FאM 4m¶ČAųC ™‰6a&“©„„„¢¬d¦Ö„UU^²šk«ŲK]møHŁXt€7I·«ÆŸ8NJ%RœŗT„¦ÆŠ[WQö^WGŪŽ7ŠÅÕEsg{+ڲ/ķŸŌ+ŹJ0łŅ7‚1‡M˜Ńh€«?œŁņƒ]mb‰4!QÕ`®Aõ2~\Q«+NÆOJFŪ„eąŃ]”ŚłƒUÆ|Z\V”½÷Ź7vu“mĪś&æ#šl ؝F£‘zˆ 1‡Ńjµ999PZtpfĖĄ?¾łŹ›'°j°*5m}R2–„GŃŚœµ :ŪŪpRQ,‘¬kuåĀi”7¾õ%"ĒbT·«Æ‹?ŖŅ¢ƒ‘‘Ak悌˜ó˜L&†aš­SKē ˆ*5mUÜ:ĄJƒVs-ߣ«Ō'§¦@WGkW{+Æg>` °4¢š©lķ®ŅߎÄYĒą«×Ÿy§Ø¹ŃŹ0ŒÉd¢÷ HĄˆ9L&Ćzuå„'”‘ˆE{ł¼bY͵h°’Ķ–=ąq»UcMņŃÆ`Šė×U]»zńClŹŻ ˆ` $b Õj KKKϾ{4!I5ƒUźUVs­!.Ø(+±škÅé‘Såc­Sęē<Œ 27ŁJ€¼¼<Ŗ|H䥈y…ŃhĢČČšø]EłŚ †aÜ«¹ŃZQVŅ`®©«ŗ†©ó0𵁵6|fėŖ®aŖ…XĀ”=p$?ēH~Žpž°³½­®źĪIĀhļ±±ču9OĢóø])))4yH$`Ä<„eŁ”””™Õ°äŌt\n\Qö^Q¾ödaŸRŚņ1r†ņf5×ā?¾Å3TW^:Y˜×ÜhK¤…ŧ|ōĻG½Šņµ˜7Ļq½ĖŽ9›³¶śLZ6˜k0YQHVĪ®Uqė„5„T©é ‰Ŗq‰ź…‰Ē©Õjz‹ ‚ŒXøÖą'-<ćĖÉ,CźE$`Ăְ#§Ź}&čŽä猵ćŽ7Šg0„Ō‹ HĄbź&–HOœcCD–‚¤ÉÖpņ`÷"õ"ˆ©AIĜD­VsĒētĢ”ŽĶ˜ŲÕѦP(H½‚±@q8Z­öÖ­[•³kļÅ”ā șwŠpµrJJ ĒqTķ Č ™LĘq\aa!TW^Ņæ˜9NĒÓ„ÉÖPųO™Ø^………‹…Ō‹ ȁ°,«ÓéœN'lß½/·ąpHe^½x>cCŖµA$`ń ‡C§ÓUVV€X"ŻūF±p„×ӢЭĄvb““c2™Čx A¶bz½¾„„ä±ń¹‡ž–Œ „K”PF2^AF`0ŒF#Ī(¢ŒmĪŚ6k“ŠBéĀĘŹz½žŒA€DP8£ŃȢX"ݜµmĒKūžÜб&[C{©ŗņE$é"0‚˜–Œ™L&£Ńˆ“ŠhČ6gmŻ’½-ŁÆCŹŌĄö·«Æ£å…B”ÓéHŗ‚Œ fŽćL&˲hČUjZrjzB¢*!I5NĮx:Ū[›mÖęFkƒ¹Ęj®>…ݼ(ÖE$`1ó°,˲,Ēq¼'ćIHT‰„Rš7gM6«Ēķōø\|#…B”Ńh“Z­F£!ĖE$`ńıŪķĒYF:³ ÉČČP«ÕjµZ£Ń(•Jz1 ‚Œ ž&ŲOŅn·ŪķvŸ§”J% •Z­&›E!Ā’n>(·ž!IEND®B`‚apache-couchdb-1.6.0/share/doc/build/html/about.html0000644000175000001440000004535212332105700022237 0ustar00djcusers00000000000000 17. About CouchDB Documentation — Apache CouchDB 1.6 Documentation

    17. About CouchDB Documentation¶

    17.1. License¶

                                    Apache License
                              Version 2.0, January 2004
                           http://www.apache.org/licenses/
    
      TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION
    
      1. Definitions.
    
         "License" shall mean the terms and conditions for use, reproduction,
         and distribution as defined by Sections 1 through 9 of this document.
    
         "Licensor" shall mean the copyright owner or entity authorized by
         the copyright owner that is granting the License.
    
         "Legal Entity" shall mean the union of the acting entity and all
         other entities that control, are controlled by, or are under common
         control with that entity. For the purposes of this definition,
         "control" means (i) the power, direct or indirect, to cause the
         direction or management of such entity, whether by contract or
         otherwise, or (ii) ownership of fifty percent (50%) or more of the
         outstanding shares, or (iii) beneficial ownership of such entity.
    
         "You" (or "Your") shall mean an individual or Legal Entity
         exercising permissions granted by this License.
    
         "Source" form shall mean the preferred form for making modifications,
         including but not limited to software source code, documentation
         source, and configuration files.
    
         "Object" form shall mean any form resulting from mechanical
         transformation or translation of a Source form, including but
         not limited to compiled object code, generated documentation,
         and conversions to other media types.
    
         "Work" shall mean the work of authorship, whether in Source or
         Object form, made available under the License, as indicated by a
         copyright notice that is included in or attached to the work
         (an example is provided in the Appendix below).
    
         "Derivative Works" shall mean any work, whether in Source or Object
         form, that is based on (or derived from) the Work and for which the
         editorial revisions, annotations, elaborations, or other modifications
         represent, as a whole, an original work of authorship. For the purposes
         of this License, Derivative Works shall not include works that remain
         separable from, or merely link (or bind by name) to the interfaces of,
         the Work and Derivative Works thereof.
    
         "Contribution" shall mean any work of authorship, including
         the original version of the Work and any modifications or additions
         to that Work or Derivative Works thereof, that is intentionally
         submitted to Licensor for inclusion in the Work by the copyright owner
         or by an individual or Legal Entity authorized to submit on behalf of
         the copyright owner. For the purposes of this definition, "submitted"
         means any form of electronic, verbal, or written communication sent
         to the Licensor or its representatives, including but not limited to
         communication on electronic mailing lists, source code control systems,
         and issue tracking systems that are managed by, or on behalf of, the
         Licensor for the purpose of discussing and improving the Work, but
         excluding communication that is conspicuously marked or otherwise
         designated in writing by the copyright owner as "Not a Contribution."
    
         "Contributor" shall mean Licensor and any individual or Legal Entity
         on behalf of whom a Contribution has been received by Licensor and
         subsequently incorporated within the Work.
    
      2. Grant of Copyright License. Subject to the terms and conditions of
         this License, each Contributor hereby grants to You a perpetual,
         worldwide, non-exclusive, no-charge, royalty-free, irrevocable
         copyright license to reproduce, prepare Derivative Works of,
         publicly display, publicly perform, sublicense, and distribute the
         Work and such Derivative Works in Source or Object form.
    
      3. Grant of Patent License. Subject to the terms and conditions of
         this License, each Contributor hereby grants to You a perpetual,
         worldwide, non-exclusive, no-charge, royalty-free, irrevocable
         (except as stated in this section) patent license to make, have made,
         use, offer to sell, sell, import, and otherwise transfer the Work,
         where such license applies only to those patent claims licensable
         by such Contributor that are necessarily infringed by their
         Contribution(s) alone or by combination of their Contribution(s)
         with the Work to which such Contribution(s) was submitted. If You
         institute patent litigation against any entity (including a
         cross-claim or counterclaim in a lawsuit) alleging that the Work
         or a Contribution incorporated within the Work constitutes direct
         or contributory patent infringement, then any patent licenses
         granted to You under this License for that Work shall terminate
         as of the date such litigation is filed.
    
      4. Redistribution. You may reproduce and distribute copies of the
         Work or Derivative Works thereof in any medium, with or without
         modifications, and in Source or Object form, provided that You
         meet the following conditions:
    
         (a) You must give any other recipients of the Work or
             Derivative Works a copy of this License; and
    
         (b) You must cause any modified files to carry prominent notices
             stating that You changed the files; and
    
         (c) You must retain, in the Source form of any Derivative Works
             that You distribute, all copyright, patent, trademark, and
             attribution notices from the Source form of the Work,
             excluding those notices that do not pertain to any part of
             the Derivative Works; and
    
         (d) If the Work includes a "NOTICE" text file as part of its
             distribution, then any Derivative Works that You distribute must
             include a readable copy of the attribution notices contained
             within such NOTICE file, excluding those notices that do not
             pertain to any part of the Derivative Works, in at least one
             of the following places: within a NOTICE text file distributed
             as part of the Derivative Works; within the Source form or
             documentation, if provided along with the Derivative Works; or,
             within a display generated by the Derivative Works, if and
             wherever such third-party notices normally appear. The contents
             of the NOTICE file are for informational purposes only and
             do not modify the License. You may add Your own attribution
             notices within Derivative Works that You distribute, alongside
             or as an addendum to the NOTICE text from the Work, provided
             that such additional attribution notices cannot be construed
             as modifying the License.
    
         You may add Your own copyright statement to Your modifications and
         may provide additional or different license terms and conditions
         for use, reproduction, or distribution of Your modifications, or
         for any such Derivative Works as a whole, provided Your use,
         reproduction, and distribution of the Work otherwise complies with
         the conditions stated in this License.
    
      5. Submission of Contributions. Unless You explicitly state otherwise,
         any Contribution intentionally submitted for inclusion in the Work
         by You to the Licensor shall be under the terms and conditions of
         this License, without any additional terms or conditions.
         Notwithstanding the above, nothing herein shall supersede or modify
         the terms of any separate license agreement you may have executed
         with Licensor regarding such Contributions.
    
      6. Trademarks. This License does not grant permission to use the trade
         names, trademarks, service marks, or product names of the Licensor,
         except as required for reasonable and customary use in describing the
         origin of the Work and reproducing the content of the NOTICE file.
    
      7. Disclaimer of Warranty. Unless required by applicable law or
         agreed to in writing, Licensor provides the Work (and each
         Contributor provides its Contributions) on an "AS IS" BASIS,
         WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
         implied, including, without limitation, any warranties or conditions
         of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A
         PARTICULAR PURPOSE. You are solely responsible for determining the
         appropriateness of using or redistributing the Work and assume any
         risks associated with Your exercise of permissions under this License.
    
      8. Limitation of Liability. In no event and under no legal theory,
         whether in tort (including negligence), contract, or otherwise,
         unless required by applicable law (such as deliberate and grossly
         negligent acts) or agreed to in writing, shall any Contributor be
         liable to You for damages, including any direct, indirect, special,
         incidental, or consequential damages of any character arising as a
         result of this License or out of the use or inability to use the
         Work (including but not limited to damages for loss of goodwill,
         work stoppage, computer failure or malfunction, or any and all
         other commercial damages or losses), even if such Contributor
         has been advised of the possibility of such damages.
    
      9. Accepting Warranty or Additional Liability. While redistributing
         the Work or Derivative Works thereof, You may choose to offer,
         and charge a fee for, acceptance of support, warranty, indemnity,
         or other liability obligations and/or rights consistent with this
         License. However, in accepting such obligations, You may act only
         on Your own behalf and on Your sole responsibility, not on behalf
         of any other Contributor, and only if You agree to indemnify,
         defend, and hold each Contributor harmless for any liability
         incurred by, or claims asserted against, such Contributor by reason
         of your accepting any such warranty or additional liability.
    
      END OF TERMS AND CONDITIONS
    
      APPENDIX: How to apply the Apache License to your work.
    
         To apply the Apache License to your work, attach the following
         boilerplate notice, with the fields enclosed by brackets "[]"
         replaced with your own identifying information. (Don't include
         the brackets!)  The text should be enclosed in the appropriate
         comment syntax for the file format. We also recommend that a
         file or class name and description of purpose be included on the
         same "printed page" as the copyright notice for easier
         identification within third-party archives.
    
      Copyright [yyyy] [name of copyright owner]
    
      Licensed under the Apache License, Version 2.0 (the "License");
      you may not use this file except in compliance with the License.
      You may obtain a copy of the License at
    
          http://www.apache.org/licenses/LICENSE-2.0
    
      Unless required by applicable law or agreed to in writing, software
      distributed under the License is distributed on an "AS IS" BASIS,
      WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
      See the License for the specific language governing permissions and
      limitations under the License.
    
    apache-couchdb-1.6.0/share/doc/build/html/config/0000755000175000001440000000000012332106073021477 5ustar00djcusers00000000000000apache-couchdb-1.6.0/share/doc/build/html/config/couchdb.html0000644000175000001440000004504212332105726024005 0ustar00djcusers00000000000000 3.2. Base Configuration — Apache CouchDB 1.6 Documentation

    3.2. Base Configuration¶

    3.2.1. Base CouchDB Options¶

    [couchdb]¶
    attachment_stream_buffer_size¶

    Higher values may result in better read performance due to fewer read operations and/or more OS page cache hits. However, they can also increase overall response time for writes when there are many attachment write requests in parallel.

    [couchdb]
    attachment_stream_buffer_size = 4096
    
    database_dir¶

    Specifies location of CouchDB database files (*.couch named). This location should be writable and readable for the user the CouchDB service runs as (couchdb by default).

    [couchdb]
    database_dir = /var/lib/couchdb
    
    delayed_commits¶

    When this config value as false the CouchDB provides guaranty of fsync call before return 201 Created response on each document saving. Setting this config value as true may raise some overall performance with cost of losing durability - it’s strongly not recommended to do such in production:

    [couchdb]
    delayed_commits = false
    

    Warning

    Delayed commits are a feature of CouchDB that allows it to achieve better write performance for some workloads while sacrificing a small amount of durability. The setting causes CouchDB to wait up to a full second before committing new data after an update. If the server crashes before the header is written then any writes since the last commit are lost.

    file_compression¶

    Changed in version 1.2: Added Google Snappy compression algorithm.

    Method used to compress everything that is appended to database and view index files, except for attachments (see the attachments section). Available methods are:

    • none: no compression
    • snappy: use Google Snappy, a very fast compressor/decompressor
    • deflate_N: use zlib’s deflate; N is the compression level which ranges from 1 (fastest, lowest compression ratio) to 9 (slowest, highest compression ratio)
    [couchdb]
    file_compression = snappy
    
    fsync_options¶

    Specifies when to make fsync calls. fsync makes sure that the contents of any file system buffers kept by the operating system are flushed to disk. There is generally no need to modify this parameter.

    [couchdb]
    fsync_options = [before_header, after_header, on_file_open]
    
    max_dbs_open¶

    This option places an upper bound on the number of databases that can be open at once. CouchDB reference counts database accesses internally and will close idle databases as needed. Sometimes it is necessary to keep more than the default open at once, such as in deployments where many databases will be replicating continuously.

    [couchdb]
    max_dbs_open = 100
    
    max_document_size¶

    Changed in version 1.3: This option now actually works.

    Defines a maximum size for JSON documents, in bytes. This limit does not apply to attachments, since they are transferred as a stream of chunks. If you set this to a small value, you might be unable to modify configuration options, database security and other larger documents until a larger value is restored by editing the configuration file.

    [couchdb]
    max_document_size = 4294967296 ; 4 GB
    
    os_process_timeout¶

    If an external process, such as a query server or external process, runs for this amount of microseconds without returning any results, it will be terminated. Keeping this value smaller ensures you get expedient errors, but you may want to tweak it for your specific needs.

    [couchdb]
    os_process_timeout = 5000 ; 5 sec
    
    uri_file¶

    This file contains the full URI that can be used to access this instance of CouchDB. It is used to help discover the port CouchDB is running on (if it was set to 0 (e.g. automatically assigned any free one). This file should be writable and readable for the user that runs the CouchDB service (couchdb by default).

    [couchdb]
    uri_file = /var/run/couchdb/couchdb.uri
    
    util_driver_dir¶

    Specifies location of binary drivers (icu, ejson, etc.). This location and its contents should be readable for the user that runs the CouchDB service.

    [couchdb]
    util_driver_dir = /usr/lib/couchdb/erlang/lib/couch-1.5.0/priv/lib
    
    uuid¶

    New in version 1.3.

    Unique identifier for this CouchDB server instance.

    [couchdb]
    uuid = 0a959b9b8227188afc2ac26ccdf345a6
    
    view_index_dir¶

    Specifies location of CouchDB view index files. This location should be writable and readable for the user that runs the CouchDB service (couchdb by default).

    [couchdb]
    view_index_dir = /var/lib/couchdb
    
    apache-couchdb-1.6.0/share/doc/build/html/config/http.html0000644000175000001440000013117012332105730023346 0ustar00djcusers00000000000000 3.3. CouchDB HTTP Server — Apache CouchDB 1.6 Documentation

    3.3. CouchDB HTTP Server¶

    3.3.1. HTTP Server Options¶

    [httpd]¶
    allow_jsonp¶

    The true value of this option enables JSONP support (it’s false by default):

    [httpd]
    allow_jsonp = false
    
    authentication_handlers¶

    List of used authentication handlers that used by CouchDB. You may extend them via third-party plugins or remove some of them if you won’t let users to use one of provided methods:

    [httpd]
    authentication_handlers = {couch_httpd_oauth, oauth_authentication_handler}, {couch_httpd_auth, cookie_authentication_handler}, {couch_httpd_auth, default_authentication_handler}
    
    • {couch_httpd_oauth, oauth_authentication_handler}: handles OAuth;
    • {couch_httpd_auth, cookie_authentication_handler}: used for Cookie auth;
    • {couch_httpd_auth, proxy_authentication_handler}: used for Proxy auth;
    • {couch_httpd_auth, default_authentication_handler}: used for Basic auth;
    • {couch_httpd_auth, null_authentication_handler}: disables auth. Everlasting Admin Party!
    bind_address¶

    Defines the IP address by which CouchDB will be accessible:

    [httpd]
    bind_address = 127.0.0.1
    

    To let CouchDB listen any available IP address, just setup 0.0.0.0 value:

    [httpd]
    bind_address = 0.0.0.0
    

    For IPv6 support you need to set ::1 if you want to let CouchDB listen local address:

    [httpd]
    bind_address = ::1
    

    or :: for any available:

    [httpd]
    bind_address = ::
    
    changes_timeout¶

    Specifies default timeout value for Changes Feed in milliseconds (60000 by default):

    [httpd]
    changes_feed = 60000 ; 60 seconds
    
    config_whitelist¶

    Sets the configuration modification whitelist. Only whitelisted values may be changed via the config API. To allow the admin to change this value over HTTP, remember to include {httpd,config_whitelist} itself. Excluding it from the list would require editing this file to update the whitelist:

    [httpd]
    config_whitelist = [{httpd,config_whitelist}, {log,level}, {etc,etc}]
    
    default_handler¶

    Specifies default HTTP requests handler:

    [httpd]
    default_handler = {couch_httpd_db, handle_request}
    
    enable_cors¶

    New in version 1.3.

    Controls CORS feature:

    [httpd]
    enable_cors = false
    
    log_max_chunk_size¶

    Defines maximum chunk size in bytes for _log resource:

    [httpd]
    log_max_chunk_size = 1000000
    
    port¶

    Defined the port number to listen:

    [httpd]
    port = 5984
    

    To let CouchDB handle any free port, set this option to 0:

    [httpd]
    port = 0
    

    After that, CouchDB URI could be located within the URI file.

    redirect_vhost_handler¶

    This option customizes the default function that handles requests to virtual hosts:

    [httpd]
    redirect_vhost_handler = {Module, Fun}
    

    The specified function take 2 arguments: the Mochiweb request object and the target path.

    server_options¶

    Server options for the MochiWeb component of CouchDB can be added to the configuration files:

    [httpd]
    server_options = [{backlog, 128}, {acceptor_pool_size, 16}]
    
    secure_rewrites¶

    This option allow to isolate databases via subdomains:

    [httpd]
    secure_rewrites = true
    
    socket_options¶

    The socket options for the listening socket in CouchDB can be specified as a list of tuples. For example:

    [httpd]
    socket_options = [{recbuf, 262144}, {sndbuf, 262144}, {nodelay, true}]
    

    The options supported are a subset of full options supported by the TCP/IP stack. A list of the supported options are provided in the Erlang inet documentation.

    vhost_global_handlers¶

    List of global handlers that are available for virtual hosts:

    [httpd]
    vhost_global_handlers = _utils, _uuids, _session, _oauth, _users
    
    x_forwarded_host¶

    The x_forwarded_host header (X-Forwarded-Host by default) is used to forward the original value of the Host header field in case, for example, if a reverse proxy is rewriting the “Host” header field to some internal host name before forward the request to CouchDB:

    [httpd]
    x_forwarded_host = X-Forwarded-Host
    

    This header has higher priority above Host one, if only it exists in the request.

    x_forwarded_proto¶

    x_forwarded_proto header (X-Forwarder-Proto by default) is used for identifying the originating protocol of an HTTP request, since a reverse proxy may communicate with CouchDB instance using HTTP even if the request to the reverse proxy is HTTPS:

    [httpd]
    x_forwarded_proto = X-Forwarded-Proto
    
    x_forwarded_ssl¶

    The x_forwarded_ssl header (X-Forwarded-Ssl by default) tells CouchDB that it should use the https scheme instead of the http. Actually, it’s a synonym for X-Forwarded-Proto: https header, but used by some reverse proxies:

    [httpd]
    x_forwarded_ssl = X-Forwarded-Ssl
    
    WWW-Authenticate¶

    Set this option to trigger basic-auth popup on unauthorized requests:

    [httpd]
    WWW-Authenticate = Basic realm="Welcome to the Couch!"
    

    3.3.2. Secure Socket Level Options¶

    [ssl]¶

    CouchDB supports SSL natively. All your secure connection needs can now be served without needing to setup and maintain a separate proxy server that handles SSL.

    SSL setup can be tricky, but the configuration in CouchDB was designed to be as easy as possible. All you need is two files; a certificate and a private key. If you bought an official SSL certificate from a certificate authority, both should be in your possession already.

    If you just want to try this out and don’t want to pay anything upfront, you can create a self-signed certificate. Everything will work the same, but clients will get a warning about an insecure certificate.

    You will need the OpenSSL command line tool installed. It probably already is.

    shell> mkdir /etc/couchdb/cert
    shell> cd /etc/couchdb/cert
    shell> openssl genrsa > privkey.pem
    shell> openssl req -new -x509 -key privkey.pem -out couchdb.pem -days 1095
    shell> chmod 600 privkey.pem couchdb.pem
    shell> chown couchdb privkey.pem couchdb.pem
    

    Now, you need to edit CouchDB’s configuration, either by editing your local.ini file or using the /_config API calls or the configuration screen in Futon. Here is what you need to do in local.ini, you can infer what needs doing in the other places.

    At first, enable the HTTPS daemon:

    [daemons]
    httpsd = {couch_httpd, start_link, [https]}
    

    Next, under [ssl] section setup newly generated certificates:

    [ssl]
    cert_file = /etc/couchdb/cert/couchdb.pem
    key_file = /etc/couchdb/cert/privkey.pem
    

    For more information please read certificates HOWTO.

    Now start (or restart) CouchDB. You should be able to connect to it using HTTPS on port 6984:

    shell> curl https://127.0.0.1:6984/
    curl: (60) SSL certificate problem, verify that the CA cert is OK. Details:
    error:14090086:SSL routines:SSL3_GET_SERVER_CERTIFICATE:certificate verify failed
    More details here: http://curl.haxx.se/docs/sslcerts.html
    
    curl performs SSL certificate verification by default, using a "bundle"
    of Certificate Authority (CA) public keys (CA certs). If the default
    bundle file isn't adequate, you can specify an alternate file
    using the --cacert option.
    If this HTTPS server uses a certificate signed by a CA represented in
    the bundle, the certificate verification probably failed due to a
    problem with the certificate (it might be expired, or the name might
    not match the domain name in the URL).
    If you'd like to turn off curl's verification of the certificate, use
    the -k (or --insecure) option.

    Oh no! What happened?! Remember, clients will notify their users that your certificate is self signed. curl is the client in this case and it notifies you. Luckily you trust yourself (don’t you?) and you can specify the -k option as the message reads:

    shell> curl -k https://127.0.0.1:6984/
    {"couchdb":"Welcome","version":"1.5.0"}
    

    All done.

    cacert_file¶

    Path to file containing PEM encoded CA certificates (trusted certificates used for verifying a peer certificate). May be omitted if you do not want to verify the peer:

    [ssl]
    cacert_file = /etc/ssl/certs/ca-certificates.crt
    
    cert_file¶

    Path to a file containing the user’s certificate:

    [ssl]
    cert_file = /etc/couchdb/cert/couchdb.pem
    
    key_file¶

    Path to file containing user’s private PEM encoded key:

    [ssl]
    key_file = /etc/couchdb/cert/privkey.pem
    
    password¶

    String containing the user’s password. Only used if the private keyfile is password protected:

    [ssl]
    password = somepassword
    
    ssl_certificate_max_depth¶

    Maximum peer certificate depth (must be set even if certificate validation is off):

    [ssl]
    ssl_certificate_max_depth = 1
    
    verify_fun¶

    The verification fun (optional) if not specified, the default verification fun will be used:

    [ssl]
    verify_fun = {Module, VerifyFun}
    
    verify_ssl_certificates¶

    Set to true to validate peer certificates:

    [ssl]
    verify_ssl_certificates = false
    

    3.3.3. Cross-Origin Resource Sharing¶

    [cors]¶

    New in version 1.3: added CORS support, see JIRA COUCHDB-431

    CORS, or “Cross-Origin Resource Sharing”, allows a resource such as a web page running JavaScript inside a browser, to make AJAX requests (XMLHttpRequests) to a different domain, without compromising the security of either party.

    A typical use case is to have a static website hosted on a CDN make requests to another resource, such as a hosted CouchDB instance. This avoids needing an intermediary proxy, using JSONP or similar workarounds to retrieve and host content.

    While CouchDB’s integrated HTTP server has support for document attachments makes this less of a constraint for pure CouchDB projects, there are many cases where separating the static content from the database access is desirable, and CORS makes this very straightforward.

    By supporting CORS functionality, a CouchDB instance can accept direct connections to protected databases and instances, without the browser functionality being blocked due to same-origin constraints. CORS is supported today on over 90% of recent browsers.

    CORS support is provided as experimental functionality in 1.3, and as such will need to be enabled specifically in CouchDB’s configuration. While all origins are forbidden from making requests by default, support is available for simple requests, preflight requests and per-vhost configuration.

    This section requires httpd/enable_cors option have true value:

    [httpd]
    enable_cors = true
    
    credentials¶

    By default, neither authentication headers nor cookies are included in requests and responses. To do so requires both setting XmlHttpRequest.withCredentials = true on the request object in the browser and enabling credentials support in CouchDB.

    [cors]
    credentials = true
    

    CouchDB will respond to a credentials-enabled CORS request with an additional header, Access-Control-Allow-Credentials=true.

    origins¶

    List of origins separated by a comma, * means accept all. You can’t set origins = * and credentials = true option at the same time:

    [cors]
    origins = *
    

    Access can be restricted by protocol, host and optionally by port. Origins must follow the scheme: http://example.com:80:

    [cors]
    origins = http://localhost, https://localhost, http://couch.mydev.name:8080
    

    Note that by default, no origins are accepted. You must define them explicitly.

    headers¶

    List of accepted headers separated by a comma:

    [cors]
    headers = X-Couch-Id, X-Couch-Rev
    
    methods¶

    List of accepted methods:

    [cors]
    methods = GET,POST
    

    See also

    Original JIRA implementation ticket

    Standards and References:

    Mozilla Developer Network Resources:

    Client-side CORS support and usage:

    Per Virtual Host Configuration¶

    To set the options for a vhosts, you will need to create a section with the vhost name prefixed by cors:. Example case for the vhost example.com:

    [cors:example.com]
    credentials = false
    ; List of origins separated by a comma
    origins = *
    ; List of accepted headers separated by a comma
    headers = X-CouchDB-Header
    ; List of accepted methods
    methods = HEAD, GET
    

    3.3.4. Virtual Hosts¶

    [vhosts]¶

    CouchDB can map requests to different locations based on the Host header, even if they arrive on the same inbound IP address.

    This allows different virtual hosts on the same machine to map to different databases or design documents, etc. The most common use case is to map a virtual host to a Rewrite Handler, to provide full control over the application’s URIs.

    To add a virtual host, add a CNAME pointer to the DNS for your domain name. For development and testing, it is sufficient to add an entry in the hosts file, typically /etc/hosts` on Unix-like operating systems:

    # CouchDB vhost definitions, refer to local.ini for further details
    127.0.0.1       couchdb.local
    

    Test that this is working:

    $ ping -n 2 couchdb.local
    PING couchdb.local (127.0.0.1) 56(84) bytes of data.
    64 bytes from localhost (127.0.0.1): icmp_req=1 ttl=64 time=0.025 ms
    64 bytes from localhost (127.0.0.1): icmp_req=2 ttl=64 time=0.051 ms
    

    Finally, add an entry to your configuration file in the [vhosts] section:

    [vhosts]
    couchdb.local:5984 = /example
    *.couchdb.local:5984 = /example
    

    If your CouchDB is listening on the the default HTTP port (80), or is sitting behind a proxy, then you don’t need to specify a port number in the vhost key.

    The first line will rewrite the request to display the content of the example database. This rule works only if the Host header is couchdb.local and won’t work for CNAMEs. The second rule, on the other hand, matches all CNAMEs to example db, so that both www.couchdb.local and db.couchdb.local will work.

    Rewriting Hosts to a Path¶

    Like in the _rewrite handler you can match some variable and use them to create the target path. Some examples:

    [vhosts]
    *.couchdb.local = /*
    :dbname. = /:dbname
    :ddocname.:dbname.example.com = /:dbname/_design/:ddocname/_rewrite
    

    The first rule passes the wildcard as dbname. The second one does the same, but uses a variable name. And the third one allows you to use any URL with ddocname in any database with dbname.

    You could also change the default function to handle request by changing the setting httpd/redirect_vhost_handler.

    apache-couchdb-1.6.0/share/doc/build/html/config/compaction.html0000644000175000001440000004627612332105726024544 0ustar00djcusers00000000000000 3.5. Compaction Configuration — Apache CouchDB 1.6 Documentation

    3.5. Compaction Configuration¶

    3.5.1. Database Compaction Options¶

    [database_compaction]¶
    doc_buffer_size¶

    Specifies the copy buffer’s maximum size in bytes:

    [database_compaction]
    doc_buffer_size = 524288
    
    checkpoint_after¶

    Triggers a checkpoint after the specified amount of bytes were successfully copied to the compacted database:

    [database_compaction]
    checkpoint_after = 5242880
    

    3.5.2. Compaction Daemon Rules¶

    [compactions]¶

    A list of rules to determine when to run automatic compaction. The daemons/compaction_daemon compacts databases and their respective view groups when all the condition parameters are satisfied. Configuration can be per-database or global, and it has the following format:

    [compactions]
    database_name = [ {ParamName, ParamValue}, {ParamName, ParamValue}, ... ]
    _default = [ {ParamName, ParamValue}, {ParamName, ParamValue}, ... ]
    

    For example:

    [compactions]
    _default = [{db_fragmentation, "70%"}, {view_fragmentation, "60%"}, {from, "23:00"}, {to, "04:00"}]
    
    • db_fragmentation: If the ratio of legacy data, including metadata, to current data in the database file size is equal to or greater than this value, this condition is satisfied. The percentage is expressed as an integer percentage. This value is computed as:

      (file_size - data_size) / file_size * 100

      The data_size and file_size values can be obtained when querying GET /{db}.

    • view_fragmentation: If the ratio of legacy data, including metadata, to current data in a view index file size is equal to or greater then this value, this database compaction condition is satisfied. The percentage is expressed as an integer percentage. This value is computed as:

      (file_size - data_size) / file_size * 100

      The data_size and file_size values can be obtained when querying a view group’s information URI.

    • from and to: The period for which a database (and its view group) compaction is allowed. The value for these parameters must obey the format:

      HH:MM - HH:MM  (HH in [0..23], MM in [0..59])
    • strict_window: If a compaction is still running after the end of the allowed period, it will be canceled if this parameter is set to true. It defaults to false and is meaningful only if the period parameter is also specified.

    • parallel_view_compaction: If set to true, the database and its views are compacted in parallel. This is only useful on certain setups, like for example when the database and view index directories point to different disks. It defaults to false.

    Before a compaction is triggered, an estimation of how much free disk space is needed is computed. This estimation corresponds to two times the data size of the database or view index. When there’s not enough free disk space to compact a particular database or view index, a warning message is logged.

    Examples:

    1. [{db_fragmentation, "70%"}, {view_fragmentation, "60%"}]

      The foo database is compacted if its fragmentation is 70% or more. Any view index of this database is compacted only if its fragmentation is 60% or more.

    2. [{db_fragmentation, "70%"}, {view_fragmentation, "60%"}, {from, "00:00"}, {to, "04:00"}]

      Similar to the preceding example but a compaction (database or view index) is only triggered if the current time is between midnight and 4 AM.

    3. [{db_fragmentation, "70%"}, {view_fragmentation, "60%"}, {from, "00:00"}, {to, "04:00"}, {strict_window, true}]

      Similar to the preceding example - a compaction (database or view index) is only triggered if the current time is between midnight and 4 AM. If at 4 AM the database or one of its views is still compacting, the compaction process will be canceled.

    4. [{db_fragmentation, "70%"}, {view_fragmentation, "60%"}, {from, "00:00"}, {to, "04:00"}, {strict_window, true}, {parallel_view_compaction, true}]

      Similar to the preceding example, but a database and its views can be compacted in parallel.

    3.5.3. Configuration of Compaction Daemon¶

    [compaction_daemon]¶
    check_interval¶

    The delay, in seconds, between each check for which database and view indexes need to be compacted:

    [compaction_daemon]
    check_interval = 300
    
    min_file_size¶

    If a database or view index file is smaller than this value (in bytes), compaction will not happen. Very small files always have high fragmentation, so compacting them is inefficient.

    [compaction_daemon]
    min_file_size = 131072
    

    3.5.4. Views Compaction Options¶

    [view_compaction]¶
    keyvalue_buffer_size¶

    Specifies maximum copy buffer size in bytes used during compaction:

    [view_compaction]
    keyvalue_buffer_size = 2097152
    
    apache-couchdb-1.6.0/share/doc/build/html/config/services.html0000644000175000001440000003671412332105734024226 0ustar00djcusers00000000000000 3.11. CouchDB Internal Services — Apache CouchDB 1.6 Documentation

    3.11. CouchDB Internal Services¶

    3.11.1. CouchDB Daemonized Mini Apps¶

    [daemons]¶
    auth_cache¶

    This daemon provides authentication caching to avoid repeated opening and closing of the _users database for each request requiring authentication:

    [daemons]
    auth_cache={couch_auth_cache, start_link, []}
    
    compaction_daemon¶

    Automatic compaction daemon:

    [daemons]
    compaction_daemon={couch_compaction_daemon, start_link, []}
    
    external_manager¶

    External processes manager:

    [daemons]
    external_manager={couch_external_manager, start_link, []}
    
    httpd¶

    HTTP server daemon:

    [daemons]
    httpd={couch_httpd, start_link, []}
    
    httpsd¶

    Provides SSL support. The default ssl port CouchDB listens on is 6984:

    [daemons]
    httpsd = {couch_httpd, start_link, [https]}
    
    index_server¶

    The couch_index application is responsible for managing all of the different types of indexers. This manages the process handling for keeping track of the index state as well as managing the updater and compactor handling:

    [daemons]
    index_server={couch_index_server, start_link, []}
    
    os_daemons¶

    OS Daemons manager:

    [daemons]
    os_daemons={couch_os_daemons, start_link, []}
    
    query_servers¶

    Query servers manager:

    [daemons]
    query_servers={couch_query_servers, start_link, []}
    
    replicator_manager¶

    Replications manager:

    [daemons]
    replicator_manager={couch_replicator_manager, start_link, []}
    
    stats_aggregator¶

    Runtime statistics aggregator:

    [daemons]
    stats_aggregator={couch_stats_aggregator, start, []}
    
    stats_collector¶

    Runtime statistics collector:

    [daemons]
    stats_collector={couch_stats_collector, start, []}
    
    uuids¶

    UUIDs generator daemon:

    [daemons]
    uuids={couch_uuids, start, []}
    
    vhosts¶

    Virtual hosts manager. Provides dynamic add of vhosts without restart, wildcards support and dynamic routing via pattern matching

    [daemons]
    vhosts={couch_httpd_vhost, start_link, []}
    
    apache-couchdb-1.6.0/share/doc/build/html/config/query-servers.html0000644000175000001440000004444512332105734025237 0ustar00djcusers00000000000000 3.8. Query Servers — Apache CouchDB 1.6 Documentation

    3.8. Query Servers¶

    3.8.1. Query Servers Definition¶

    [query_servers]¶

    Changed in version 1.2:: Added CoffeeScript query server

    CouchDB delegates computation of design documents functions to external query servers. The external query server is a special OS process which communicates with CouchDB over standard input/output using a very simple line-based protocol with JSON messages.

    The external query server may be defined in configuration file following next pattern:

    [query_servers]
    LANGUAGE = PATH ARGS
    

    Where:

    • LANGUAGE: is a programming language which code this query server may execute. For instance, there are python, ruby, clojure and other query servers in wild. This value is also used for ddoc field language to determine which query server processes the functions.

      Note, that you may setup multiple query servers for the same programming language, but you have to name them different (like python-dev etc.).

    • PATH: is a system path to the executable binary program that runs the query server.

    • ARGS: optionally, you may specify additional command line arguments for the executable PATH.

    The default query server is written in JavaScript, running via Mozilla SpiderMonkey:

    [query_servers]
    javascript = /usr/bin/couchjs /usr/share/couchdb/server/main.js
    coffeescript = /usr/bin/couchjs /usr/share/couchdb/server/main-coffee.js
    

    See also

    Native Erlang Query Server that allows to process Erlang ddocs and runs within CouchDB bypassing stdio communication and JSON serialization/deserialization round trip overhead.

    3.8.2. Query Servers Configuration¶

    [query_server_config]¶
    commit_freq¶

    Specifies the delay in seconds before view index changes are committed to disk. The default value is 5:

    [query_server_config]
    commit_freq = 5
    
    os_process_limit¶

    Amount of time in seconds that the Query Server may process CouchDB command:

    [query_server_config]
    os_process_limit = 10
    

    CouchDB will raise os_process_timeout error and kill the process in case the Query Server doesn’t return any result within this limit.

    reduce_limit¶

    Controls Reduce overflow error that raises when output of reduce functions is too big:

    [query_server_config]
    reduce_limit = true
    

    Normally, you don’t have to disable (by setting false value) this option since main propose of reduce functions is to reduce the input.

    3.8.3. Native Erlang Query Server¶

    [native_query_servers]¶

    Warning

    Due to security restrictions, the Erlang query server is disabled by default.

    Unlike the JavaScript query server, the Erlang one does not runs in a sandbox mode. This means that Erlang code has full access to your OS, filesystem and network, which may lead to security issues. While Erlang functions are faster than JavaScript ones, you need to be careful about running them, especially if they were written by someone else.

    CouchDB has a native Erlang query server, allowing you to write your map/reduce functions in Erlang.

    First, you’ll need to edit your local.ini to include a [native_query_servers] section:

    [native_query_servers]
    erlang = {couch_native_process, start_link, []}
    

    To see these changes you will also need to restart the server. To test out using Erlang views, visit the Futon admin interface, create a new database and open a temporary view. You should now be able to select erlang from the language drop-down.

    Let’s try an example of map/reduce functions which count the total documents at each number of revisions (there are x many documents at version “1”, and y documents at “2”... etc). Add a few documents to the database, then enter the following functions as a temporary view:

    %% Map Function
    fun({Doc}) ->
      <<K,_/binary>> = proplists:get_value(<<"_rev">>, Doc, null),
      V = proplists:get_value(<<"_id">>, Doc, null),
      Emit(<<K>>, V)
    end.
    
    %% Reduce Function
    fun(Keys, Values, ReReduce) -> length(Values) end.
    

    If all has gone well, after running the view you should see a list of the total number of documents at each revision number.

    apache-couchdb-1.6.0/share/doc/build/html/config/index.html0000644000175000001440000003410512332105731023477 0ustar00djcusers00000000000000 3. Configuring CouchDB — Apache CouchDB 1.6 Documentation

    Previous topic

    2.4. Installation on FreeBSD

    Next topic

    3.1. Introduction Into Configuring

    Utilities

    More Help

    apache-couchdb-1.6.0/share/doc/build/html/config/replicator.html0000644000175000001440000004541512332105734024545 0ustar00djcusers00000000000000 3.7. Replicator — Apache CouchDB 1.6 Documentation

    3.7. Replicator¶

    3.7.1. Replicator Database Configuration¶

    [replicator]¶

    New in version 1.2.

    db¶

    Specifies replicator database name:

    [replicator]
    db = _replicator
    
    max_replication_retry_count¶

    Maximum replication retry count can be a non-negative integer or “infinity”

    [replicator]
    max_replication_retry_count = 10
    
    worker_batch_size¶

    With lower batch sizes checkpoints are done more frequently. Lower batch sizes also reduce the total amount of used RAM memory:

    [replicator]
    worker_batch_size = 500
    
    worker_processes¶

    More worker processes can give higher network throughput but can also imply more disk and network IO:

    [replicator]
    worker_processes = 4
    
    http_connections¶

    Maximum number of HTTP connections per replication:

    [replicator]
    http_connections = 20
    
    connection_timeout¶

    HTTP connection timeout per replication. Even for very fast/reliable networks it might need to be increased if a remote database is too busy:

    [replicator]
    connection_timeout = 30000
    
    retries_per_request¶

    If a request fails, the replicator will retry it up to N times:

    [replicator]
    retries_per_request = 10
    
    socket_options¶

    Some socket options that might boost performance in some scenarios:

    • {nodelay, boolean()}
    • {sndbuf, integer()}
    • {recbuf, integer()}
    • {priority, integer()}

    See the inet Erlang module’s man page for the full list of options:

    [replicator]
    socket_options = [{keepalive, true}, {nodelay, false}]
    
    checkpoint_interval¶

    New in version 1.6.

    Defines replication checkpoint interval in milliseconds. Replicator will requests from the Source database at the specified interval:

    [replicator]
    checkpoint_interval = 5000
    

    Lower intervals may be useful for frequently changing data, while higher values will lower bandwidth and make fewer requests for infrequently updated databases.

    use_checkpoints¶

    New in version 1.6.

    If use_checkpoints is set to true, CouchDB will make checkpoints during replication and at the completion of replication. CouchDB can efficiently resume replication from any of these checkpoints:

    [replicator]
    use_checkpoints = true
    

    Note

    Checkpoints are stored in local documents on both the source and target databases (which requires write access).

    Warning

    Disabling checkpoints is not recommended as CouchDB will scan the Source database’s changes feed from the beginning.

    cert_file¶

    Path to a file containing the user’s certificate:

    [replicator]
    cert_file = /full/path/to/server_cert.pem
    
    key_file¶

    Path to file containing user’s private PEM encoded key:

    [replicator]
    key_file = /full/path/to/server_key.pem
    
    password¶

    String containing the user’s password. Only used if the private keyfile is password protected:

    [replicator]
    password = somepassword
    
    verify_ssl_certificates¶

    Set to true to validate peer certificates:

    [replicator]
    verify_ssl_certificates = false
    
    ssl_trusted_certificates_file¶

    File containing a list of peer trusted certificates (in the PEM format):

    [replicator]
    ssl_trusted_certificates_file = /etc/ssl/certs/ca-certificates.crt
    
    ssl_certificate_max_depth¶

    Maximum peer certificate depth (must be set even if certificate validation is off):

    [replicator]
    ssl_certificate_max_depth = 3
    
    apache-couchdb-1.6.0/share/doc/build/html/config/auth.html0000644000175000001440000010130612332105725023332 0ustar00djcusers00000000000000 3.4. Authentication and Authorization — Apache CouchDB 1.6 Documentation

    3.4. Authentication and Authorization¶

    3.4.1. Server Administrators¶

    [admins]¶

    A default CouchDB install provides admin-level access to all connecting users. This configuration is known as Admin Party, and is not recommended for in-production usage. You can crash the party simply by creating the first admin account. CouchDB server administrators and passwords are not stored in the _users database, but in the local.ini file, which should be appropriately secured and readable only by system administrators:

    [admins]
    ;admin = mysecretpassword
    admin = -hashed-6d3c30241ba0aaa4e16c6ea99224f915687ed8cd,7f4a3e05e0cbc6f48a0035e3508eef90
    architect = -pbkdf2-43ecbd256a70a3a2f7de40d2374b6c3002918834,921a12f74df0c1052b3e562a23cd227f,10000
    

    Administrators can be added directly to the [admins] section, and when CouchDB is restarted, the passwords will be salted and encrypted. You may also use the HTTP interface to create administrator accounts; this way, you don’t need to restart CouchDB, and there’s no need to temporarily store or transmit passwords in plaintext. The HTTP _config/admins endpoint supports querying, deleting or creating new admin accounts:

    GET /_config/admins HTTP/1.1
    Accept: application/json
    Host: localhost:5984
    
    HTTP/1.1 200 OK
    Cache-Control: must-revalidate
    Content-Length: 196
    Content-Type: application/json
    Date: Fri, 30 Nov 2012 11:37:18 GMT
    Server: CouchDB (Erlang/OTP)
    
    {
      "admin": "-hashed-6d3c30241ba0aaa4e16c6ea99224f915687ed8cd,7f4a3e05e0cbc6f48a0035e3508eef90",
      "architect": "-pbkdf2-43ecbd256a70a3a2f7de40d2374b6c3002918834,921a12f74df0c1052b3e562a23cd227f,10000"
    }
    

    If you already have a salted, encrypted password string (for example, from an old local.ini file, or from a different CouchDB server), then you can store the “raw” encrypted string, without having CouchDB doubly encrypt it.

    PUT /_config/admins/architect?raw=true HTTP/1.1
    Accept: application/json
    Content-Type: application/json
    Content-Length: 89
    Host: localhost:5984
    
    "-pbkdf2-43ecbd256a70a3a2f7de40d2374b6c3002918834,921a12f74df0c1052b3e562a23cd227f,10000"
    
    HTTP/1.1 200 OK
    Cache-Control: must-revalidate
    Content-Length: 89
    Content-Type: application/json
    Date: Fri, 30 Nov 2012 11:39:18 GMT
    Server: CouchDB (Erlang/OTP)
    
    "-pbkdf2-43ecbd256a70a3a2f7de40d2374b6c3002918834,921a12f74df0c1052b3e562a23cd227f,10000"
    

    Further details are available in security, including configuring the work factor for PBKDF2, and the algorithm itself at PBKDF2 (RFC-2898).

    Changed in version 1.4: PBKDF2 server-side hashed salted password support added, now as a synchronous call for the _config/admins API.

    3.4.2. Authentication Configuration¶

    [couch_httpd_auth]¶
    allow_persistent_cookies¶

    Makes cookies persistent if true.

    [couch_httpd_auth]
    allow_persistent_cookies = false
    
    auth_cache_size¶

    Number of User Context Object to cache in memory, to reduce disk lookups.

    [couch_httpd_auth]
    auth_cache_size = 50
    
    authentication_db¶

    Specifies the name of the system database for storing CouchDB users.

    [couch_httpd_auth]
    authentication_db = _users
    

    Warning

    If you change the database name, do not forget to remove or clean up the old database, since it will no longer be protected by CouchDB.

    authentication_redirect¶

    Specifies the location for redirection on successful authentication if a text/html response is accepted by the client (via an Accept header).

    [couch_httpd_auth]
    authentication_redirect = /_utils/session.html
    
    iterations¶

    New in version 1.3.

    The number of iterations for password hashing by the PBKDF2 algorithm. A higher number provides better hash durability, but comes at a cost in performance for each request that requires authentication.

    [couch_httpd_auth]
    iterations = 10000
    
    min_iterations¶

    New in version 1.6.

    The minimum number of iterations allowed for passwords hashed by the PBKDF2 algorithm. Any user with fewer iterations is forbidden.

    [couch_httpd_auth]
    min_iterations = 100
    
    max_iterations¶

    New in version 1.6.

    The maximum number of iterations allowed for passwords hashed by the PBKDF2 algorithm. Any user with greater iterations is forbidden.

    [couch_httpd_auth]
    max_iterations = 100000
    
    proxy_use_secret¶

    When this option is set to true, the couch_httpd_auth/secret option is required for Proxy Authentication.

    [couch_httpd_auth]
    proxy_use_secret = false
    
    public_fields¶

    New in version 1.4.

    A comma-separated list of field names in user documents (in couch_httpd_auth/authentication_db) that can be read by any user. If unset or not specified, authenticated users can only retrieve their own document.

    [couch_httpd_auth]
    public_fields = first_name, last_name, contacts, url
    

    Note

    Using the public_fields whitelist for user document properties requires setting the couch_httpd_auth/users_db_public option to true (the latter option has no other purpose):

    [couch_httpd_auth]
    users_db_public = true
    
    require_valid_user¶

    When this option is set to true, no requests are allowed from anonymous users. Everyone must be authenticated.

    [couch_httpd_auth]
    require_valid_user = false
    
    secret¶

    The secret token used for Proxy Authentication method.

    [couch_httpd_auth]
    secret = 92de07df7e7a3fe14808cef90a7cc0d91
    
    timeout¶

    Number of seconds since the last request before sessions will be expired.

    [couch_httpd_auth]
    timeout = 600
    
    users_db_public¶

    New in version 1.4.

    Allow all users to view user documents. By default, only admins may browse all users documents, while users may browse only their own document.

    [couch_httpd_auth]
    users_db_public = false
    
    x_auth_roles¶

    The HTTP header name (X-Auth-CouchDB-Roles by default) that contains the list of a user’s roles, separated by a comma. Used for Proxy Authentication.

    [couch_httpd_auth]
    x_auth_roles = X-Auth-CouchDB-Roles
    
    x_auth_token¶

    The HTTP header name (X-Auth-CouchDB-Token by default) containing the token used to authenticate the authorization. This token is an HMAC-SHA1 created from the couch_httpd_auth/secret and couch_httpd_auth/x_auth_username. The secret key should be the same on the client and the CouchDB node. This token is optional if the value of the couch_httpd_auth/proxy_use_secret option is not true. Used for Proxy Authentication.

    [couch_httpd_auth]
    x_auth_roles = X-Auth-CouchDB-Token
    
    x_auth_username¶

    The HTTP header name (X-Auth-CouchDB-UserName by default) containing the username. Used for Proxy Authentication.

    [couch_httpd_auth]
    x_auth_username = X-Auth-CouchDB-UserName
    

    3.4.3. HTTP OAuth Configuration¶

    [couch_httpd_oauth]¶

    New in version 1.2.

    use_users_db¶

    CouchDB is able to store OAuth credentials within user documents instead of config file by using this option:

    [couch_httpd_oauth]
    use_users_db = true
    

    If set to true, OAuth token and consumer secrets will be looked up in the authentication database. These secrets are stored in a top level field named "oauth" in user documents, as below.

    {
        "_id": "org.couchdb.user:joe",
        "type": "user",
        "name": "joe",
        "password_sha": "fe95df1ca59a9b567bdca5cbaf8412abd6e06121",
        "salt": "4e170ffeb6f34daecfd814dfb4001a73"
        "roles": ["foo", "bar"],
        "oauth": {
            "consumer_keys": {
                "consumerKey1": "key1Secret",
                "consumerKey2": "key2Secret"
            },
            "tokens": {
                "token1": "token1Secret",
                "token2": "token2Secret"
           }
        }
    }
    

    3.4.4. OAuth Configuration¶

    [oauth_*]¶

    To let users be authenticated by OAuth Authentication (RFC 5849), three special sections must be set up in the configuration file:

    1. The Consumer secret:
    [oauth_consumer_secrets]
    consumer1 = sekr1t
    
    1. Token secrets:
    [oauth_token_secrets]
    token1 = tokensekr1t
    
    1. A mapping from tokens to users:
    [oauth_token_users]
    token1 = couchdb_username
    
    apache-couchdb-1.6.0/share/doc/build/html/config/externals.html0000644000175000001440000004331012332105727024400 0ustar00djcusers00000000000000 3.9. External Processes — Apache CouchDB 1.6 Documentation

    3.9. External Processes¶

    3.9.1. OS Daemons¶

    [os_daemons]¶

    This is a simple feature that allows users to configure CouchDB so that it maintains a given OS level process alive. If the process dies for any reason, CouchDB will restart it. If the process restarts too often, then CouchDB will mark it has halted and not attempt to restart it. The default max restart rate is 3 times in the last 5 seconds. These parameters are adjustable.

    Commands that are started in this manner will have access to a simple API over stdio to request configuration parameters or to add log statements to CouchDB’s logs.

    To configure an OS process as a CouchDB os_daemon, create a section in your local.ini like such:

    [os_daemons]
    daemon_name = /path/to/command -with args
    

    This will make CouchDB bring up the command and attempt to keep it alive. To request a configuration parameter, an os_daemon can write a simple JSON message to stdout like such:

    ["get", "os_daemons"]\n

    which would return:

    {"daemon_name": "/path/to/command -with args"}\n

    Or:

    ["get", "os_daemons", "daemon_name"]\n

    which would return:

    "/path/to/command -with args"\n

    There’s no restriction on what configuration variables are visible. There’s also no method for altering the configuration.

    If you would like your OS daemon to be restarted in the event that the configuration changes, you can send the following messages:

    ["register", $(SECTION)]\n

    When anything in that section changes, your OS process will be rebooted so it can pick up the new configuration settings. If you want to listen for changes on a specific key, you can send something like:

    ["register", $(SECTION), $(KEY)]\n

    In this case, CouchDB will only restart your daemon if that exact section/key pair changes, instead of anything in that entire section.

    Logging commands look like:

    ["log", $(JSON_MESSAGE)]\n

    Where $(JSON_MESSAGE) is arbitrary JSON data. These messages are logged at the ‘info’ level. If you want to log at a different level you can pass messages like such:

    ["log", $(JSON_MESSAGE), {"level": $(LEVEL)}]\n

    Where $(LEVEL) is one of “debug”, “info”, or “error”.

    When implementing a daemon process to be managed by CouchDB you should remember to use a method like checking the parent process id or if stdin has been closed. These flags can tell you if your daemon process has been orphaned so you can exit cleanly.

    There is no interactivity between CouchDB and the running process, but you can use the OS Daemons service to create new HTTP servers and responders and then use the new proxy service to redirect requests and output to the CouchDB managed service. For more information on proxying, see CouchDB As Proxy. For further background on the OS Daemon service, see CouchDB Externals API.

    3.9.2. OS Daemons settings¶

    [os_daemon_settings]¶
    max_retries¶

    Specifies maximum attempts to run os_daemons before mark them halted:

    [os_daemon_settings]
    max_retries = 3
    
    retry_time¶

    Delay in seconds between os_daemons restarts:

    [os_daemon_settings]
    retry_time = 5
    

    3.9.3. Update notifications¶

    [update_notification]¶

    CouchDB is able to spawn OS processes to notify them about recent databases updates. The notifications are in form of JSON messages sent as a line of text, terminated by CR (\n) character, to the OS processes through stdout:

    [update_notification]
    ;unique notifier name=/full/path/to/exe -with "cmd line arg"
    index_updater = ruby /usr/local/bin/index_updater.rb
    

    The update notification messages are depend upon of event type:

    • Database created:

      {"type":"created","db":"dbname"}
      
    • Database updated: this event raises when any document gets updated for specified database:

      {"type":"updated","db":"dbname"}
      
    • Design document updated: for design document updates there is special event raised in additional to regular db update one:

      {"type":"ddoc_updated","db":"dbname","id":"_design/ddoc_name"}
      
    • Database deleted:

      {"type":"deleted","db":"dbname"}
      

    Note

    New line (\n) trailing character was removed from examples.

    apache-couchdb-1.6.0/share/doc/build/html/config/intro.html0000644000175000001440000004420012332105732023521 0ustar00djcusers00000000000000 3.1. Introduction Into Configuring — Apache CouchDB 1.6 Documentation

    3.1. Introduction Into Configuring¶

    3.1.1. Configuration files¶

    Warning

    The following section covering load order of config files applies only to UNIX-ish systems. For Windows, only the provided default.ini and local.ini files are relevant. These can of course have content appended, which achieves the same type of functionality as outlined for UNIX-ish systems below.

    By default, CouchDB reads configuration files from the following locations, in the following order:

    1. LOCALCONFDIR/default.ini
    2. LOCALCONFDIR/default.d/*.ini
    3. PLUGINS_DIR/*/priv/default.d/*.ini
    4. LOCALCONFDIR/local.ini
    5. LOCALCONFDIR/local.d/*.ini

    The LOCALCONFDIR points to the directory that contains configuration files (/usr/local/etc/couchdb by default). This variable may vary from the target operation system and may be changed during building from the source code. For binary distributions, it mostly points to the installation path (e.g. C:\Program Files\CouchDB\etc\couchdb for Windows).

    To see the actual configuration files chain run in shell:

    couchdb -c

    This will print out all actual configuration files that will form the result CouchDB configuration:

    /etc/couchdb/default.ini
    /etc/couchdb/default.d/geocouch.ini
    /etc/couchdb/local.ini
    /etc/couchdb/local.d/geocouch.ini
    /etc/couchdb/local.d/vendor.ini

    Settings in successive documents override the settings in earlier entries. For example, setting the httpd/bind_address parameter in local.ini would override any setting in default.ini.

    Warning

    The default.ini file may be overwritten during an upgrade or re-installation, so localised changes should be made to the local.ini file or files within the local.d directory.

    The configuration files chain may be changed by specifying additional sources by using next command line options:

    • -a: adds configuration file to the chain
    • -A: adds configuration directory to the chain

    Let’s add these options and see how the configuration chain changes:

    shell> couchdb -c -a /home/couchdb/custom.ini
    /etc/couchdb/default.ini
    /etc/couchdb/default.d/geocouch.ini
    /etc/couchdb/local.ini
    /etc/couchdb/local.d/geocouch.ini
    /etc/couchdb/local.d/vendor.ini
    /home/couchdb/custom.ini

    In case when /home/couchdb/custom.ini exists it will be added to the configuration chain.

    3.1.2. Parameter names and values¶

    All parameter names are case-sensitive. Every parameter takes a value of one of five types: boolean, integer, string, tuple and proplist. Boolean values can be written as true or false.

    Parameters with value type of tuple or proplist are following the Erlang requirement for style and naming.

    3.1.3. Setting parameters via the configuration file¶

    The common way to set some parameters is to edit the local.ini file which is mostly located in the etc/couchdb directory relative your installation path root.

    For example:

    ; This is a comment
    [section]
    param = value ; inline comments are allowed
    

    Each configuration file line may contains section definition, parameter specification, empty (space and newline characters only) or commented line. You can setup inline commentaries for sections or parameters.

    The section defines group of parameters that are belongs to some specific CouchDB subsystem. For instance, httpd section holds not only HTTP server parameters, but also others that directly interacts with it.

    The parameter specification contains two parts divided by the equal sign (=): the parameter name on the left side and the parameter value on the right one. The leading and following whitespace for = is an optional to improve configuration readability.

    Note

    In case when you’d like to remove some parameter from the default.ini without modifying that file, you may override in local.ini, but without any value:

    [httpd_global_handlers]
    _all_dbs =
    

    This could be read as: “remove the _all_dbs parameter from the httpd_global_handlers section if it was ever set before”.

    The semicolon (;) signs about commentary start: everything after this character is counted as commentary and doesn’t process by CouchDB.

    After editing of configuration file CouchDB server instance should be restarted to apply these changes.

    3.1.4. Setting parameters via the HTTP API¶

    Alternatively, configuration parameters could be set via the HTTP API. This API allows to change CouchDB configuration on-the-fly without requiring a server restart:

    curl -X PUT http://localhost:5984/_config/uuids/algorithm -d '"random"'

    In the response the old parameter’s value returns:

    "sequential"

    You should be careful with changing configuration via the HTTP API since it’s easy to make CouchDB unavailable. For instance, if you’d like to change the httpd/bind_address for a new one:

    curl -X PUT http://localhost:5984/_config/httpd/bind_address -d '"10.10.0.128"'

    However, if you make a typo, or the specified IP address is not available from your network, CouchDB will be unavailable for you in both cases and the only way to resolve this will be by remoting into the server, correcting the errant file, and restarting CouchDB. To protect yourself against such accidents you may set the httpd/config_whitelist of permitted configuration parameters for updates via the HTTP API. Once this option is set, further changes to non-whitelisted parameters must take place via the configuration file, and in most cases, also requires a server restart before hand-edited options take effect.

    apache-couchdb-1.6.0/share/doc/build/html/config/proxying.html0000644000175000001440000003060212332105733024247 0ustar00djcusers00000000000000 3.13. Proxying Configuration — Apache CouchDB 1.6 Documentation

    3.13. Proxying Configuration¶

    3.13.1. CouchDB As Proxy¶

    The HTTP proxy feature makes it easy to map and redirect different content through your CouchDB URL. The proxy works by mapping a pathname and passing all content after that prefix through to the configured proxy address.

    Configuration of the proxy redirect is handled through the [httpd_global_handlers] section of the CouchDB configuration file (typically local.ini). The format is:

    [httpd_global_handlers]
    PREFIX = {couch_httpd_proxy, handle_proxy_req, <<"DESTINATION">>}
    

    Where:

    • PREFIX

      Is the string that will be matched. The string can be any valid qualifier, although to ensure that existing database names are not overridden by a proxy configuration, you can use an underscore prefix.

    • DESTINATION

      The fully-qualified URL to which the request should be sent. The destination must include the http prefix. The content is used verbatim in the original request, so you can also forward to servers on different ports and to specific paths on the target host.

    The proxy process then translates requests of the form:

    http://couchdb:5984/PREFIX/path
    

    To:

    DESTINATION/path
    

    Note

    Everything after PREFIX including the required forward slash will be appended to the DESTINATION.

    The response is then communicated back to the original client.

    For example, the following configuration:

    [httpd_global_handlers]
    _google = {couch_httpd_proxy, handle_proxy_req, <<"http://www.google.com">>}
    

    Would forward all requests for http://couchdb:5984/_google to the Google website.

    The service can also be used to forward to related CouchDB services, such as Lucene:

    [httpd_global_handlers]
    _fti = {couch_httpd_proxy, handle_proxy_req, <<"http://127.0.0.1:5985">>}
    

    Note

    The proxy service is basic. If the request is not identified by the DESTINATION, or the remainder of the PATH specification is incomplete, the original request URL is interpreted as if the PREFIX component of that URL does not exist.

    For example, requesting http://couchdb:5984/_intranet/media when /media on the proxy destination does not exist, will cause the request URL to be interpreted as http://couchdb:5984/media. Care should be taken to ensure that both requested URLs and destination URLs are able to cope.

    apache-couchdb-1.6.0/share/doc/build/html/config/logging.html0000644000175000001440000003062412332105732024021 0ustar00djcusers00000000000000 3.6. Logging — Apache CouchDB 1.6 Documentation

    3.6. Logging¶

    3.6.1. Logging options¶

    [log]¶

    CouchDB logging configuration.

    file¶

    Specifies the location of file for logging output:

    [log]
    file = /var/log/couchdb/couch.log
    

    This path should be readable and writable for user that runs CouchDB service (couchdb by default).

    level¶

    Changed in version 1.3:: Added warning level.

    Logging level defines how verbose and detailed logging will be:

    [log]
    level = info
    

    Available levels:

    • debug: Very informative and detailed debug logging. Includes HTTP headers, external processes communications, authorization information and more;
    • info: Informative logging. Includes HTTP requests headlines, startup of an external processes etc.
    • warning: Warning messages are alerts about edge situations that may lead to errors. For instance, compaction daemon alerts about low or insufficient disk space at this level.
    • error: Error level includes only things that going wrong, crush reports and HTTP error responses (5xx codes).
    • none: Disables logging any messages.
    include_sasl¶

    Includes SASL information in logs:

    [log]
    include_sasl = true
    

    3.6.2. Per module logging¶

    [log_level_by_module]¶

    New in version 1.3.

    In this section you can specify log level on a per-module basis:

    [log_level_by_module]
    couch_httpd = debug
    couch_replicator = info
    couch_query_servers = error
    

    See src/*/*.erl for available modules.

    apache-couchdb-1.6.0/share/doc/build/html/config/misc.html0000644000175000001440000005336312332105733023334 0ustar00djcusers00000000000000 3.12. Miscellaneous Parameters — Apache CouchDB 1.6 Documentation

    3.12. Miscellaneous Parameters¶

    3.12.1. Configuration of Attachment Storage¶

    [attachments]¶
    compression_level¶

    Defines zlib compression level for the attachments from 1 (lowest, fastest) to 9 (highest, slowest). A value of 0 disables compression

    [attachments]
    compression_level = 8
    
    compressible_types¶

    Since compression is ineffective for some types of files, it is possible to let CouchDB compress only some types of attachments, specified by their MIME type:

    [attachments]
    compressible_types = text/*, application/javascript, application/json, application/xml
    

    3.12.2. Statistic Calculation¶

    [stats]¶
    rate¶

    Rate of statistics gathering in milliseconds:

    [stats]
    rate = 1000
    
    samples¶

    Samples are used to track the mean and standard value deviation within specified intervals (in seconds):

    [stats]
    samples = [0, 60, 300, 900]
    

    3.12.3. UUIDs Configuration¶

    [uuids]¶
    algorithm¶

    Changed in version 1.3: Added utc_id algorithm.

    CouchDB provides various algorithms to generate the UUID values that are used for document _id‘s by default:

    [uuids]
    algorithm = sequential
    

    Available algorithms:

    • random: 128 bits of random awesome. All awesome, all the time:

      {
        "uuids": [
          "5fcbbf2cb171b1d5c3bc6df3d4affb32",
          "9115e0942372a87a977f1caf30b2ac29",
          "3840b51b0b81b46cab99384d5cd106e3",
          "b848dbdeb422164babf2705ac18173e1",
          "b7a8566af7e0fc02404bb676b47c3bf7",
          "a006879afdcae324d70e925c420c860d",
          "5f7716ee487cc4083545d4ca02cd45d4",
          "35fdd1c8346c22ccc43cc45cd632e6d6",
          "97bbdb4a1c7166682dc026e1ac97a64c",
          "eb242b506a6ae330bda6969bb2677079"
        ]
      }
      
    • sequential: Monotonically increasing ids with random increments. The first 26 hex characters are random, the last 6 increment in random amounts until an overflow occurs. On overflow, the random prefix is regenerated and the process starts over.

      {
        "uuids": [
          "4e17c12963f4bee0e6ec90da54804894",
          "4e17c12963f4bee0e6ec90da5480512f",
          "4e17c12963f4bee0e6ec90da54805c25",
          "4e17c12963f4bee0e6ec90da54806ba1",
          "4e17c12963f4bee0e6ec90da548072b3",
          "4e17c12963f4bee0e6ec90da54807609",
          "4e17c12963f4bee0e6ec90da54807718",
          "4e17c12963f4bee0e6ec90da54807754",
          "4e17c12963f4bee0e6ec90da54807e5d",
          "4e17c12963f4bee0e6ec90da54808d28"
        ]
      }
      
    • utc_random: The time since Jan 1, 1970 UTC, in microseconds. The first 14 characters are the time in hex. The last 18 are random.

      {
        "uuids": [
          "04dd32b3af699659b6db9486a9c58c62",
          "04dd32b3af69bb1c2ac7ebfee0a50d88",
          "04dd32b3af69d8591b99a8e86a76e0fb",
          "04dd32b3af69f4a18a76efd89867f4f4",
          "04dd32b3af6a1f7925001274bbfde952",
          "04dd32b3af6a3fe8ea9b120ed906a57f",
          "04dd32b3af6a5b5c518809d3d4b76654",
          "04dd32b3af6a78f6ab32f1e928593c73",
          "04dd32b3af6a99916c665d6bbf857475",
          "04dd32b3af6ab558dd3f2c0afacb7d66"
        ]
      }
      
    • utc_id: The time since Jan 1, 1970 UTC, in microseconds, plus the utc_id_suffix string. The first 14 characters are the time in hex. The uuids/utc_id_suffix string value is appended to these.

      {
        "uuids": [
          "04dd32bd5eabcc@mycouch",
          "04dd32bd5eabee@mycouch",
          "04dd32bd5eac05@mycouch",
          "04dd32bd5eac28@mycouch",
          "04dd32bd5eac43@mycouch",
          "04dd32bd5eac58@mycouch",
          "04dd32bd5eac6e@mycouch",
          "04dd32bd5eac84@mycouch",
          "04dd32bd5eac98@mycouch",
          "04dd32bd5eacad@mycouch"
        ]
      }
      

    Note

    Impact of UUID choices: the choice of UUID has a significant impact on the layout of the B-tree, prior to compaction.

    For example, using a sequential UUID algorithm while uploading a large batch of documents will avoid the need to rewrite many intermediate B-tree nodes. A random UUID algorithm may require rewriting intermediate nodes on a regular basis, resulting in significantly decreased throughput and wasted disk space space due to the append-only B-tree design.

    It is generally recommended to set your own UUIDs, or use the sequential algorithm unless you have a specific need and take into account the likely need for compaction to re-balance the B-tree and reclaim wasted space.

    utc_id_suffix¶

    New in version 1.3.

    The utc_id_suffix value will be appended to UUIDs generated by the utc_id algorithm. Replicating instances should have unique utc_id_suffix values to ensure uniqueness of utc_id ids.

    [uuid]
    utc_id_suffix = my-awesome-suffix
    
    max_count¶

    New in version 1.5.1.

    No more than this number of UUIDs will be sent in a single request. If more UUIDs are requested, an HTTP error response will be thrown.

    [uuid]
    max_count = 1000
    

    3.12.4. Vendor information¶

    [vendor]¶

    New in version 1.3.

    CouchDB distributors have the option of customizing CouchDB’s welcome message. This is returned when requesting GET /.

    [vendor]
    name = The Apache Software Foundation
    version = 1.5.0
    
    apache-couchdb-1.6.0/share/doc/build/html/config/http-handlers.html0000644000175000001440000005655512332105731025162 0ustar00djcusers00000000000000 3.10. HTTP Resource Handlers — Apache CouchDB 1.6 Documentation

    3.10. HTTP Resource Handlers¶

    3.10.1. Global HTTP Handlers¶

    [httpd_global_handlers]¶

    These HTTP resources are provided for CouchDB server root level.

    /¶
    [httpd_global_handlers]
    / = {couch_httpd_misc_handlers, handle_welcome_req, <<"Welcome">>}
    
    favicon.ico¶

    The favicon handler looks for favicon.ico file within specified directory:

    [httpd_global_handlers]
    favicon.ico = {couch_httpd_misc_handlers, handle_favicon_req, "/usr/share/couchdb/www"}
    
    _active_tasks¶
    [httpd_global_handlers]
    _active_tasks = {couch_httpd_misc_handlers, handle_task_status_req}
    
    _all_dbs¶

    Provides a list of all server’s databases:

    [httpd_global_handlers]
    _all_dbs = {couch_httpd_misc_handlers, handle_all_dbs_req}
    

    Note

    Sometimes you don’t want to disclose database names for everyone, but you also don’t like/want/able to setup any proxies in front of CouchDB. Removing this handler disables _all_dbs resource and there will be no way to get list of available databases.

    The same also is true for other resource handlers.

    _config¶

    Provides resource to work with CouchDB config remotely. Any config changes that was made via HTTP API are applied automatically on fly and doesn’t requires server instance to be restarted:

    [httpd_global_handlers]
    _config = {couch_httpd_misc_handlers, handle_config_req}
    
    _log¶
    [httpd_global_handlers]
    _log = {couch_httpd_misc_handlers, handle_log_req}
    
    _oauth¶
    [httpd_global_handlers]
    _oauth = {couch_httpd_oauth, handle_oauth_req}
    
    _replicate¶

    Provides an API to run temporary replications:

    [httpd_global_handlers]
    _replicate = {couch_replicator_httpd, handle_req}
    
    _restart¶
    [httpd_global_handlers]
    _restart = {couch_httpd_misc_handlers, handle_restart_req}
    
    _session¶

    Provides a resource with information about the current user’s session:

    [httpd_global_handlers]
    _session = {couch_httpd_auth, handle_session_req}
    
    _stats¶
    [httpd_global_handlers]
    _stats = {couch_httpd_stats_handlers, handle_stats_req}
    
    _utils¶

    The _utils handler serves Futon‘s web administration page:

    [httpd_global_handlers]
    _utils = {couch_httpd_misc_handlers, handle_utils_dir_req, "/usr/share/couchdb/www"}
    

    In similar way, you may setup custom handler to let CouchDB serve any static files.

    _uuids¶

    Provides a resource to get UUIDs generated by CouchDB:

    [httpd_global_handlers]
    _uuids = {couch_httpd_misc_handlers, handle_uuids_req}
    

    This is useful when your client environment isn’t capable of providing truly random IDs (web browsers e.g.).

    3.10.2. Database HTTP Handlers¶

    [httpd_db_handlers]¶

    These HTTP resources are available on every CouchDB database.

    _all_docs¶
    [httpd_db_handlers]
    _all_docs = {couch_mrview_http, handle_all_docs_req}
    
    _changes¶
    [httpd_db_handlers]
    _changes = {couch_httpd_db, handle_changes_req}
    
    _compact¶
    [httpd_db_handlers]
    _compact = {couch_httpd_db, handle_compact_req}
    
    _design¶
    [httpd_db_handlers]
    _design = {couch_httpd_db, handle_design_req}
    
    _temp_view¶
    [httpd_db_handlers]
    _temp_view = {couch_mrview_http, handle_temp_view_req}
    
    _view_cleanup¶
    [httpd_db_handlers]
    _view_cleanup = {couch_mrview_http, handle_cleanup_req}
    

    3.10.3. Design Documents HTTP Handlers¶

    [httpd_design_handlers]¶

    These HTTP resources are provided for design documents.

    _compact¶
    [httpd_design_handlers]
    _compact = {couch_mrview_http, handle_compact_req}
    
    _info¶
    [httpd_design_handlers]
    _info = {couch_mrview_http, handle_info_req}
    
    _list¶
    [httpd_design_handlers]
    _list = {couch_mrview_show, handle_view_list_req}
    
    _rewrite¶
    [httpd_design_handlers]
    _rewrite = {couch_httpd_rewrite, handle_rewrite_req}
    
    _show¶
    [httpd_design_handlers]
    _show = {couch_mrview_show, handle_doc_show_req}
    
    _update¶
    [httpd_design_handlers]
    _update = {couch_mrview_show, handle_doc_update_req}
    
    _view¶
    [httpd_design_handlers]
    _view = {couch_mrview_http, handle_view_req}
    
    apache-couchdb-1.6.0/share/doc/build/html/query-server/0000755000175000001440000000000012332106073022703 5ustar00djcusers00000000000000apache-couchdb-1.6.0/share/doc/build/html/query-server/javascript.html0000644000175000001440000010025112332105757025746 0ustar00djcusers00000000000000 8.2. JavaScript — Apache CouchDB 1.6 Documentation

    8.2. JavaScript¶

    Note

    While every design function has access to all JavaScript objects, the table below describes appropriate usage cases. For example, you may use emit() in List functions, but getRow() is not permitted during Map functions.

    JS Function Reasonable to use in design doc functions
    emit() Map functions
    getRow() List functions
    JSON any
    isArray() any
    log() any
    provides() Show functions, List functions
    registerType() Show functions, List functions
    require() any, except Reduce and rereduce functions
    send() List functions
    start() List functions
    sum() any
    toJSON() any

    8.2.1. Design functions context¶

    Each design function executes in a special context of predefined objects, modules and functions:

    emit(key, value)¶

    Emits a key-value pair for further processing by CouchDB after the map function is done.

    Arguments:
    • key – The view key
    • value – The key‘s associated value
    function(doc){
      emit(doc._id, doc._rev);
    }
    
    getRow()¶

    Extracts the next row from a related view result.

    Returns:View result row
    Return type:object
    function(head, req){
      send('[');
      row = getRow();
      if (row){
        send(toJSON(row));
        while(row = getRow()){
          send(',');
          send(toJSON(row));
        }
      }
      return ']';
    }
    
    JSON¶

    JSON2 object.

    isArray(obj)¶

    A helper function to check if the provided value is an Array.

    Arguments:
    • obj – Any Javascript value
    Returns:

    true if obj is Array-typed, false otherwise

    Return type:

    boolean

    log(message)¶

    Log a message to the CouchDB log (at the INFO level).

    Arguments:
    • message – Message to be logged
    function(doc){
      log('Procesing doc ' + doc['_id']);
      emit(doc['_id'], null);
    }
    

    After the map function has run, the following line can be found in CouchDB logs (e.g. at /var/log/couchdb/couch.log):

    [Sat, 03 Nov 2012 17:38:02 GMT] [info] [<0.7543.0>] OS Process #Port<0.3289> Log :: Processing doc 8d300b86622d67953d102165dbe99467
    
    provides(key, func)¶

    Registers callable handler for specified MIME key.

    Arguments:
    • key – MIME key previously defined by registerType()
    • func – MIME type handler
    registerType(key, *mimes)¶

    Registers list of MIME types by associated key.

    Arguments:
    • key – MIME types
    • mimes – MIME types enumeration

    Predefined mappings (key-array):

    • all: */*
    • text: text/plain; charset=utf-8, txt
    • html: text/html; charset=utf-8
    • xhtml: application/xhtml+xml, xhtml
    • xml: application/xml, text/xml, application/x-xml
    • js: text/javascript, application/javascript, application/x-javascript
    • css: text/css
    • ics: text/calendar
    • csv: text/csv
    • rss: application/rss+xml
    • atom: application/atom+xml
    • yaml: application/x-yaml, text/yaml
    • multipart_form: multipart/form-data
    • url_encoded_form: application/x-www-form-urlencoded
    • json: application/json, text/x-json
    require(path)¶

    Loads CommonJS module by a specified path. The path should not start with a slash.

    Arguments:
    • path – A CommonJS module path started from design document root
    Returns:

    Exported statements

    send(chunk)¶

    Sends a single string chunk in response.

    Arguments:
    • chunk – Text chunk
    function(head, req){
      send('Hello,');
      send(' ');
      send('Couch');
      return !
    }
    
    start(init_resp)¶

    Initiates chunked response. As an option, a custom response object may be sent at this point. For list-functions only!

    Note

    list functions may set the HTTP response code and headers by calling this function. This function must be called before send(), getRow() or a return statement; otherwise, the query server will implicitly call this function with the empty object ({}).

    function(head, req){
      start({
        "code": 302,
        "headers": {
          "Location": "http://couchdb.apache.org"
        }
      });
      return "Relax!";
    }
    
    sum(arr)¶

    Sum arr‘s items.

    Arguments:
    • arr – Array of numbers
    Return type:

    number

    toJSON(obj)¶

    Encodes obj to JSON string. This is an alias for the JSON.stringify method.

    Arguments:
    • obj – JSON encodable object
    Returns:

    JSON string

    8.2.2. CommonJS Modules¶

    Support for CommonJS Modules (introduced in CouchDB 0.11.0) allows you to create modular design functions without the need for duplication of functionality.

    Here’s a CommonJS module that checks user permissions:

    function user_context(userctx, secobj) {
      var is_admin = function() {
        return userctx.indexOf('_admin') != -1;
      }
      return {'is_admin': is_admin}
    }
    
    exports['user'] = user_context
    

    Each module has access to additional global variables:

    • module (object): Contains information about the stored module
      • id (string): The module id; a JSON path in ddoc context
      • current (code): Compiled module code object
      • parent (object): Parent frame
      • exports (object): Export statements
    • exports (object): Shortcut to the module.exports object

    The CommonJS module can be added to a design document, like so:

    {
       "views": {
          "lib": {
             "security": "function user_context(userctx, secobj) { ... }"
          }
       },
       "validate_doc_update": "function(newdoc, olddoc, userctx, secobj) {
          user = require('lib/security').user(userctx, secobj);
          return user.is_admin();
       }"
       "_id": "_design/test"
    }
    

    Modules paths are relative to the design document’s views object, but modules can only be loaded from the object referenced via lib. The lib structure can still be used for view functions as well, by simply storing view functions at e.g. views.lib.map, views.lib.reduce, etc.

    apache-couchdb-1.6.0/share/doc/build/html/query-server/index.html0000644000175000001440000002547512332105757024725 0ustar00djcusers00000000000000 8. Query Server — Apache CouchDB 1.6 Documentation

    8. Query Server¶

    The Query server is an external process that communicates with CouchDB by JSON protocol through stdio interface and processed all design functions calls: views, shows, lists and more.

    The default query server is written in JavaScript, running via Mozilla SpiderMonkey. You can use other languages by setting a Query server key in the language property of a design document or the Content-Type header of a temporary view. Design documents that do not specify a language property are assumed to be of type javascript, as are ad hoc queries that are POSTed to _temp_view without a Content-Type header.

    Previous topic

    7. CouchDB Externals API

    Next topic

    8.1. Query Server Protocol

    Utilities

    More Help

    apache-couchdb-1.6.0/share/doc/build/html/query-server/erlang.html0000644000175000001440000005123512332105756025056 0ustar00djcusers00000000000000 8.3. Erlang — Apache CouchDB 1.6 Documentation

    8.3. Erlang¶

    Note

    The Erlang query server is disabled by default. Read configuration guide about reasons why and how to enable it.

    Emit(Id, Value)¶

    Emits key-value pairs to view indexer process.

    fun({Doc}) ->
      <<K,_/binary>> = proplists:get_value(<<"_rev">>, Doc, null),
      V = proplists:get_value(<<"_id">>, Doc, null),
      Emit(<<K>>, V)
    end.
    
    FoldRows(Fun, Acc)¶

    Helper to iterate over all rows in a list function.

    Arguments:
    • Fun – Function object.
    • Acc – The value previously returned by Fun.
    fun(Head, {Req}) ->
      Fun = fun({Row}, Acc) ->
        Id = couch_util:get_value(<<"id">>, Row),
        Send(list_to_binary(io_lib:format("Previous doc id: ~p~n", [Acc]))),
        Send(list_to_binary(io_lib:format("Current  doc id: ~p~n", [Id]))),
        {ok, Id}
      end,
      FoldRows(Fun, nil),
      ""
    end.
    
    GetRow()¶

    Retrieves the next row from a related view result.

    %% FoldRows background implementation.
    %% https://git-wip-us.apache.org/repos/asf?p=couchdb.git;a=blob;f=src/couchdb/couch_native_process.erl;hb=HEAD#l368
    %%
    foldrows(GetRow, ProcRow, Acc) ->
      case GetRow() of
        nil ->
          {ok, Acc};
        Row ->
          case (catch ProcRow(Row, Acc)) of
            {ok, Acc2} ->
              foldrows(GetRow, ProcRow, Acc2);
            {stop, Acc2} ->
              {ok, Acc2}
          end
    end.
    
    Log(Msg)¶
    Arguments:
    • Msg – Log a message at the INFO level.
    fun({Doc}) ->
      <<K,_/binary>> = proplists:get_value(<<"_rev">>, Doc, null),
      V = proplists:get_value(<<"_id">>, Doc, null),
      Log(lists:flatten(io_lib:format("Hello from ~s doc!", [V]))),
      Emit(<<K>>, V)
    end.
    

    After the map function has run, the following line can be found in CouchDB logs (e.g. at /var/log/couchdb/couch.log):

    [Sun, 04 Nov 2012 11:33:58 GMT] [info] [<0.9144.2>] Hello from 8d300b86622d67953d102165dbe99467 doc!
    
    Send(Chunk)¶

    Sends a single string Chunk in response.

    fun(Head, {Req}) ->
      Send("Hello,"),
      Send(" "),
      Send("Couch"),
      "!"
    end.
    

    The function above produces the following response:

    Hello, Couch!
    
    Start(Headers)¶
    Arguments:

    Initialize List functions response. At this point, response code and headers may be defined. For example, this function redirects to the CouchDB web site:

    fun(Head, {Req}) ->
      Start({[{<<"code">>, 302},
              {<<"headers">>, {[
                {<<"Location">>, <<"http://couchdb.apache.org">>}]
              }}
            ]}),
      "Relax!"
    end.
    

    Previous topic

    8.2. JavaScript

    Next topic

    9. Fauxton

    Utilities

    More Help

    apache-couchdb-1.6.0/share/doc/build/html/query-server/protocol.html0000644000175000001440000023045212332105760025442 0ustar00djcusers00000000000000 8.1. Query Server Protocol — Apache CouchDB 1.6 Documentation

    8.1. Query Server Protocol¶

    The Query Server is an external process that communicates with CouchDB via a JSON protocol over stdio and processes all design functions calls: views, shows, lists, filters, updates and validate_doc_update.

    CouchDB communicates with the Query Server process though stdio interface by JSON messages that terminated by newline character. Messages that are sent to the Query Server are always array-typed that could be matched by the pattern [<command>, <*arguments>]\n.

    Note

    To simplify examples reading we omitted trailing \n character to let Sphinx highlight them well. Also, all examples contain formatted JSON values while real data transfers in compact mode without formatting spaces.

    8.1.1. reset¶

    Command:reset
    Arguments:Query server state (optional)
    Returns:true

    This resets the state of the Query Server and makes it forget all previous input. If applicable, this is the point to run garbage collection.

    CouchDB sends:

    ["reset"]
    

    The Query Server answers:

    true
    

    To set up new Query Server state the second argument is used with object data. This argument is used

    CouchDB sends:

    ["reset", {"reduce_limit": true, "timeout": 5000}]
    

    The Query Server answers:

    true
    

    8.1.2. add_lib¶

    Command:add_lib
    Arguments:CommonJS library object by views/lib path
    Returns:true

    Adds CommonJS library to Query Server state for further usage in map functions.

    CouchDB sends:

    [
      "add_lib",
      {
        "utils": "exports.MAGIC = 42;"
      }
    ]
    

    The Query Server answers:

    true
    

    Note

    This library shouldn’t have any side effects nor track its own state or you’ll have a lot of happy debugging time if something went wrong. Remember that a complete index rebuild is a heavy operation and this is the only way to fix your mistakes with shared state.

    add_fun¶

    Command:add_fun
    Arguments:Map function source code.
    Returns:true

    When creating or updating a view the Query Server gets sent the view function for evaluation. The Query Server should parse, compile and evaluate the function it receives to make it callable later. If this fails, the Query Server returns an error. CouchDB might store several functions before sending in any actual documents.

    CouchDB sends:

    [
      "add_fun",
      "function(doc) { if(doc.score > 50) emit(null, {'player_name': doc.name}); }"
    ]
    

    The Query Server answers:

    true
    

    8.1.3. map_doc¶

    Command:map_doc
    Arguments:Document object
    Returns:Array of key-value pairs per applied function

    When the view function is stored in the Query Server, CouchDB starts sending in all the documents in the database, one at a time. The Query Server calls the previously stored functions one after another with a document and stores its result. When all functions have been called, the result is returned as a JSON string.

    CouchDB sends:

    [
      "map_doc",
      {
        "_id": "8877AFF9789988EE",
        "_rev": "3-235256484",
        "name": "John Smith",
        "score": 60
      }
    ]
    

    If the function above is the only function stored, the Query Server answers:

    [
      [
        [null, {"player_name": "John Smith"}]
      ]
    ]
    

    That is, an array with the result for every function for the given document.

    If a document is to be excluded from the view, the array should be empty.

    CouchDB sends:

    [
      "map_doc",
      {
        "_id": "9590AEB4585637FE",
        "_rev": "1-674684684",
        "name": "Jane Parker",
        "score": 43
      }
    ]
    

    The Query Server answers:

    [[]]
    

    8.1.4. reduce¶

    Command:

    reduce

    Arguments:
    • Reduce function source
    • Array of map function results where each item represented in format [[key, id-of-doc], value]
    Returns:

    Array with pair values: true and another array with reduced result

    If the view has a reduce function defined, CouchDB will enter into the reduce phase. The view server will receive a list of reduce functions and some map results on which it can apply them.

    CouchDB sends:

    [
      "reduce",
      [
        "function(k, v) { return sum(v); }"
      ],
      [
        [[1, "699b524273605d5d3e9d4fd0ff2cb272"], 10],
        [[2, "c081d0f69c13d2ce2050d684c7ba2843"], 20],
        [[null, "foobar"], 3]
      ]
    ]
    

    The Query Server answers:

    [
      true,
      [33]
    ]
    

    Note that even though the view server receives the map results in the form [[key, id-of-doc], value], the function may receive them in a different form. For example, the JavaScript Query Server applies functions on the list of keys and the list of values.

    8.1.5. rereduce¶

    Command:rereduce
    Arguments:List of values.

    When building a view, CouchDB will apply the reduce step directly to the output of the map step and the rereduce step to the output of a previous reduce step.

    CouchDB will send a list of values, with no keys or document ids, to the rereduce step.

    CouchDB sends:

    [
      "rereduce",
      [
        "function(k, v, r) { return sum(v); }"
      ],
      [
        33,
        55,
        66
      ]
    ]
    

    The Query Server answers:

    [
      true,
      [154]
    ]
    

    8.1.6. ddoc¶

    Command:

    ddoc

    Arguments:

    Array of objects.

    • First phase (ddoc initialization):
      • "new"
      • Design document _id
      • Design document object
    • Second phase (design function execution):
      • Design document _id
      • Function path as an array of object keys
      • Array of function arguments
    Returns:
    • First phase (ddoc initialization): true
    • Second phase (design function execution): custom object depending on executed function

    This command acts in two phases: ddoc registration and design function execution.

    In the first phase CouchDB sends a full design document content to the Query Server to let it cache it by _id value for further function execution.

    To do this, CouchDB sends:

    [
      "ddoc",
      "new",
      "_design/temp",
      {
        "_id": "_design/temp",
        "_rev": "8-d7379de23a751dc2a19e5638a7bbc5cc",
        "language": "javascript",
        "shows": {
          "request": "function(doc,req){ return {json: req}; }",
          "hello": "function(doc,req){ return {body: 'Hello, ' + (doc || {})._id + '!'}; }"
        }
      }
    ]
    

    The Query Server answers:

    true
    

    After than this design document is ready to serve next subcommands - that’s the second phase.

    Note

    Each ddoc subcommand is the root design document key, so they are not actually subcommands, but first elements of the JSON path that may be handled and processed.

    The pattern for subcommand execution is common:

    ["ddoc", <design_doc_id>, [<subcommand>, <funcname>], [<argument1>, <argument2>, ...]]

    shows¶

    Command:

    ddoc

    SubCommand:

    shows

    Arguments:
    • Document object or null if document id wasn’t specified in request
    • Request object
    Returns:

    Array with two elements:

    Executes show function.

    Couchdb sends:

    [
      "ddoc",
      "_design/temp",
      [
          "shows",
          "doc"
      ],
      [
        null,
        {
          "info": {
            "db_name": "test",
            "doc_count": 8,
            "doc_del_count": 0,
            "update_seq": 105,
            "purge_seq": 0,
            "compact_running": false,
            "disk_size": 15818856,
            "data_size": 1535048,
            "instance_start_time": "1359952188595857",
            "disk_format_version": 6,
            "committed_update_seq": 105
          },
          "id": null,
          "uuid": "169cb4cc82427cc7322cb4463d0021bb",
          "method": "GET",
          "requested_path": [
            "api",
            "_design",
            "temp",
            "_show",
            "request"
          ],
          "path": [
            "api",
            "_design",
            "temp",
            "_show",
            "request"
          ],
          "raw_path": "/api/_design/temp/_show/request",
          "query": {},
          "headers": {
            "Accept": "*/*",
            "Host": "localhost:5984",
            "User-Agent": "curl/7.26.0"
          },
          "body": "undefined",
          "peer": "127.0.0.1",
          "form": {},
          "cookie": {},
          "userCtx": {
            "db": "api",
            "name": null,
            "roles": [
              "_admin"
            ]
          },
          "secObj": {}
        }
      ]
    ]
    

    The Query Server sends:

    [
      "resp",
      {
        "body": "Hello, undefined!"
      }
    ]
    

    lists¶

    Command:

    ddoc

    SubCommand:

    lists

    Arguments:
    Returns:

    Array. See below for details.

    Executes list function.

    The communication protocol for list functions is a bit complex so let’s use an example for illustration.

    Let’s assume that we have view a function that emits id-rev pairs:

    function(doc) {
      emit(doc._id, doc._rev);
    }

    And we’d like to emulate _all_docs JSON response with list function. Our first version of the list functions looks like this:

    function(head, req){
      start({'headers': {'Content-Type': 'application/json'}});
      var resp = head;
      var rows = [];
      while(row=getRow()){
        rows.push(row);
      }
      resp.rows = rows;
      return toJSON(resp);
    }

    The whole communication session during list function execution could be divided on three parts:

    1. Initialization

      The first returned object from list function is an array of next structure:

      ["start", <chunks>, <headers>]

      Where <chunks> is an array of text chunks that will be sent to client and <headers> is an object with response HTTP headers.

      This message is sent from the Query Server to CouchDB on the start() call which initialize HTTP response to the client:

      [
        "start",
        [],
        {
          "headers": {
            "Content-Type": "application/json"
          }
        }
      ]
      

      After this, the list function may start to process view rows.

    2. View Processing

      Since view results can be extremely large, it is not wise to pass all its rows in a single command. Instead, CouchDB can send view rows one by one to the Query Server allowing processing view and output generation in a streaming way.

      CouchDB sends a special array that carries view row data:

      [
        "list_row",
        {
          "id": "0cb42c267fe32d4b56b3500bc503e030",
          "key": "0cb42c267fe32d4b56b3500bc503e030",
          "value": "1-967a00dff5e02add41819138abb3284d"
        }
      ]
      

      If Query Server has something to return on this, it returns an array with a "chunks" item in the head and an array of data in the tail. Now, for our case it has nothing to return, so the response will be:

      [
        "chunks",
        []
      ]
      

      When there is no more view rows to process, CouchDB sends special message, that signs about that there is no more data to send from its side:

      ["list_end"]
      
    3. Finalization

      The last stage of the communication process is the returning list tail: the last data chunk. After this, processing list function will be completed and client will receive complete response.

      For our example the last message will be the next:

      [
        "end",
        [
          "{\"total_rows\":2,\"offset\":0,\"rows\":[{\"id\":\"0cb42c267fe32d4b56b3500bc503e030\",\"key\":\"0cb42c267fe32d4b56b3500bc503e030\",\"value\":\"1-967a00dff5e02add41819138abb3284d\"},{\"id\":\"431926a69504bde41851eb3c18a27b1f\",\"key\":\"431926a69504bde41851eb3c18a27b1f\",\"value\":\"1-967a00dff5e02add41819138abb3284d\"}]}"
        ]
      ]
      

    There, we had made a big mistake: we had returned out result in a single message from the Query Server. That’s ok when there are only a few rows in the view result, but it’s not acceptable for millions documents and millions view rows

    Let’s fix our list function and see the changes in communication:

    function(head, req){
      start({'headers': {'Content-Type': 'application/json'}});
      send('{');
      send('"total_rows":' + toJSON(head.total_rows) + ',');
      send('"offset":' + toJSON(head.offset) + ',');
      send('"rows":[');
      if (row=getRow()){
        send(toJSON(row));
      }
      while(row=getRow()){
        send(',' + toJSON(row));
      }
      send(']');
      return '}';
    }

    “Wait, what?” - you’d like to ask. Yes, we’d build JSON response manually by string chunks, but let’s take a look on logs:

    [Wed, 24 Jul 2013 05:45:30 GMT] [debug] [<0.19191.1>] OS Process #Port<0.4444> Output :: ["start",["{","\"total_rows\":2,","\"offset\":0,","\"rows\":["],{"headers":{"Content-Type":"application/json"}}]
    [Wed, 24 Jul 2013 05:45:30 GMT] [info] [<0.18963.1>] 127.0.0.1 - - GET /blog/_design/post/_list/index/all_docs 200
    [Wed, 24 Jul 2013 05:45:30 GMT] [debug] [<0.19191.1>] OS Process #Port<0.4444> Input  :: ["list_row",{"id":"0cb42c267fe32d4b56b3500bc503e030","key":"0cb42c267fe32d4b56b3500bc503e030","value":"1-967a00dff5e02add41819138abb3284d"}]
    [Wed, 24 Jul 2013 05:45:30 GMT] [debug] [<0.19191.1>] OS Process #Port<0.4444> Output :: ["chunks",["{\"id\":\"0cb42c267fe32d4b56b3500bc503e030\",\"key\":\"0cb42c267fe32d4b56b3500bc503e030\",\"value\":\"1-967a00dff5e02add41819138abb3284d\"}"]]
    [Wed, 24 Jul 2013 05:45:30 GMT] [debug] [<0.19191.1>] OS Process #Port<0.4444> Input  :: ["list_row",{"id":"431926a69504bde41851eb3c18a27b1f","key":"431926a69504bde41851eb3c18a27b1f","value":"1-967a00dff5e02add41819138abb3284d"}]
    [Wed, 24 Jul 2013 05:45:30 GMT] [debug] [<0.19191.1>] OS Process #Port<0.4444> Output :: ["chunks",[",{\"id\":\"431926a69504bde41851eb3c18a27b1f\",\"key\":\"431926a69504bde41851eb3c18a27b1f\",\"value\":\"1-967a00dff5e02add41819138abb3284d\"}"]]
    [Wed, 24 Jul 2013 05:45:30 GMT] [debug] [<0.19191.1>] OS Process #Port<0.4444> Input  :: ["list_end"]
    [Wed, 24 Jul 2013 05:45:30 GMT] [debug] [<0.19191.1>] OS Process #Port<0.4444> Output :: ["end",["]","}"]]

    Note, that now the Query Server sends response by lightweight chunks and if our communication process was extremely slow, the client will see how response data appears on their screen. Chunk by chunk, without waiting for the complete result, like they have for our previous list function.

    updates¶

    Command:

    ddoc

    SubCommand:

    updates

    Arguments:
    • Document object or null if document id wasn’t specified in request
    • Request object
    Returns:

    Array with there elements:

    Executes update function.

    CouchDB sends:

    [
        "ddoc",
        "_design/id",
        [
            "updates",
            "nothing"
        ],
        [
            null,
            {
                "info": {
                    "db_name": "test",
                    "doc_count": 5,
                    "doc_del_count": 0,
                    "update_seq": 16,
                    "purge_seq": 0,
                    "compact_running": false,
                    "disk_size": 8044648,
                    "data_size": 7979601,
                    "instance_start_time": "1374612186131612",
                    "disk_format_version": 6,
                    "committed_update_seq": 16
                },
                "id": null,
                "uuid": "7b695cb34a03df0316c15ab529002e69",
                "method": "POST",
                "requested_path": [
                    "test",
                    "_design",
                    "1139",
                    "_update",
                    "nothing"
                ],
                "path": [
                    "test",
                    "_design",
                    "1139",
                    "_update",
                    "nothing"
                ],
                "raw_path": "/test/_design/1139/_update/nothing",
                "query": {},
                "headers": {
                    "Accept": "*/*",
                    "Accept-Encoding": "identity, gzip, deflate, compress",
                    "Content-Length": "0",
                    "Host": "localhost:5984"
                },
                "body": "",
                "peer": "127.0.0.1",
                "form": {},
                "cookie": {},
                "userCtx": {
                    "db": "test",
                    "name": null,
                    "roles": [
                        "_admin"
                    ]
                },
                "secObj": {}
            }
        ]
    ]
    

    The Query Server answers:

    [
      "up",
      null,
      {"body": "document id wasn't provided"}
    ]
    

    or in case of successful update:

    [
      "up",
      {
        "_id": "7b695cb34a03df0316c15ab529002e69",
        "hello": "world!"
      },
      {"body": "document was updated"}
    ]
    

    filters¶

    Command:

    ddoc

    SubCommand:

    filters

    Arguments:
    Returns:

    Array of two elements:

    • true
    • Array of booleans in the same order of input documents.

    Executes filter function.

    CouchDB sends:

    [
        "ddoc",
        "_design/test",
        [
            "filters",
            "random"
        ],
        [
            [
                {
                    "_id": "431926a69504bde41851eb3c18a27b1f",
                    "_rev": "1-967a00dff5e02add41819138abb3284d",
                    "_revisions": {
                        "start": 1,
                        "ids": [
                            "967a00dff5e02add41819138abb3284d"
                        ]
                    }
                },
                {
                    "_id": "0cb42c267fe32d4b56b3500bc503e030",
                    "_rev": "1-967a00dff5e02add41819138abb3284d",
                    "_revisions": {
                        "start": 1,
                        "ids": [
                            "967a00dff5e02add41819138abb3284d"
                        ]
                    }
                }
            ],
            {
                "info": {
                    "db_name": "test",
                    "doc_count": 5,
                    "doc_del_count": 0,
                    "update_seq": 19,
                    "purge_seq": 0,
                    "compact_running": false,
                    "disk_size": 8056936,
                    "data_size": 7979745,
                    "instance_start_time": "1374612186131612",
                    "disk_format_version": 6,
                    "committed_update_seq": 19
                },
                "id": null,
                "uuid": "7b695cb34a03df0316c15ab529023a81",
                "method": "GET",
                "requested_path": [
                    "test",
                    "_changes?filter=test",
                    "random"
                ],
                "path": [
                    "test",
                    "_changes"
                ],
                "raw_path": "/test/_changes?filter=test/random",
                "query": {
                    "filter": "test/random"
                },
                "headers": {
                    "Accept": "application/json",
                    "Accept-Encoding": "identity, gzip, deflate, compress",
                    "Content-Length": "0",
                    "Content-Type": "application/json; charset=utf-8",
                    "Host": "localhost:5984"
                },
                "body": "",
                "peer": "127.0.0.1",
                "form": {},
                "cookie": {},
                "userCtx": {
                    "db": "test",
                    "name": null,
                    "roles": [
                        "_admin"
                    ]
                },
                "secObj": {}
            }
        ]
    ]
    

    The Query Server answers:

    [
      true,
      [
        true,
        false
      ]
    ]
    

    views¶

    Command:

    ddoc

    SubCommand:

    views

    Arguments:

    Array of document objects

    Returns:

    Array of two elements:

    • true
    • Array of booleans in the same order of input documents.

    New in version 1.2.

    Executes view function in place of the filter.

    Acts in the same way as filters command.

    validate_doc_update¶

    Command:

    ddoc

    SubCommand:

    validate_doc_update

    Arguments:
    Returns:

    1

    Executes validation function.

    CouchDB send:

    [
      "ddoc",
      "_design/id",
      ["validate_doc_update"],
      [
        {
          "_id": "docid",
          "_rev": "2-e0165f450f6c89dc6b071c075dde3c4d",
          "score": 10
        },
        {
          "_id": "docid",
          "_rev": "1-9f798c6ad72a406afdbf470b9eea8375",
          "score": 4
        },
        {
          "name": "Mike",
          "roles": ["player"]
        },
        {
          "admins": {},
          "members": []
        }
      ]
    ]
    

    The Query Server answers:

    1
    

    Note

    While the only valid response for this command is true to prevent document save the Query Server need to raise an error: forbidden or unauthorized - these errors will be turned into correct HTTP 403 and HTTP 401 responses respectively.

    8.1.7. Raising errors¶

    When something went wrong the Query Server is able to inform CouchDB about such a situation by sending special message in response of received command.

    Error messages prevent further command execution and return an error description to CouchDB. All errors are logically divided into two groups:

    • Common errors. These errors only break the current Query Server command and return the error info to the CouchDB instance without terminating the Query Server process.
    • Fatal errors. The fatal errors signal about something really bad that hurts the overall Query Server process stability and productivity. For instance, if you’re using Python Query Server and some design function is unable to import some third party module, it’s better to count such error as fatal and terminate whole process or you still have to do the same after import fixing, but manually.

    error¶

    To raise an error, the Query Server have to answer:

    ["error", "error_name", "reason why"]
    

    The "error_name" helps to classify problems by their type e.g. if it’s "value_error" so probably user have entered wrong data, "not_found" notifies about missed resource and "type_error" definitely says about invalid and non expected input from user.

    The "reason why" is the error message that explains why it raised and, if possible, what is needed to do to fix it.

    For example, calling Update functions against non existent document could produce next error message:

    ["error", "not_found", "Update function requires existent document"]
    

    forbidden¶

    The forbidden error is widely used by Validate document update functions to stop further function processing and prevent on disk store of the new document version. Since this error actually is not an error, but an assertion against user actions, CouchDB doesn’t log it at “error” level, but returns HTTP 403 Forbidden response with error information object.

    To raise this error, the Query Server have to answer:

    {"forbidden": "reason why"}
    

    unauthorized¶

    The unauthorized error mostly acts like forbidden one, but with the meaning of please authorize first. This small difference helps end users to understand what they can do to solve the problem. CouchDB doesn’t log it at “error” level, but returns HTTP 401 Unauthorized response with error information object.

    To raise this error, the Query Server have to answer:

    {"unauthorized": "reason why"}
    

    8.1.8. Logging¶

    At any time, the Query Server may send some information that will be saved in CouchDB’s log file. This is done by sending a special object with just one field, log, on a separate line:

    ["log", "some message"]
    

    CouchDB responds nothing, but writes received message into log file:

    [Sun, 13 Feb 2009 23:31:30 GMT] [info] [<0.72.0>] Query Server Log Message: some message

    These messages are only logged at info level.

    apache-couchdb-1.6.0/share/doc/build/html/_static/0000755000175000001440000000000012332106072021657 5ustar00djcusers00000000000000apache-couchdb-1.6.0/share/doc/build/html/_static/plus.png0000644000175000001440000000030711644410761023360 0ustar00djcusers00000000000000‰PNG  IHDR &Īąq pHYs  šœtIME× 1l9tEXtCommentöĢ–æRIDATÓczō(BÅńćĒįŅpöæ’Øčˆip»‘¹P÷īŻĆc· ø |¶IEND®B`‚apache-couchdb-1.6.0/share/doc/build/html/_static/favicon.ico0000644000175000001440000002215612332105522024005 0ustar00djcusers00000000000000h6 Øž@@(F( ÖÖŲ×ŁŪ Ū Ü Ü Ż Ż Ž Ųāćåčäé!ź"ė%ė( ģ/+å3+ķ4/ę=9čGEåIIā[Uš[Yē`Zńebģhhēpoéwró{zģ„ƒķ††ķŠ†ōļ“’ļ˜–ō¢ ņ¢¢ń¦¦ń«Øų°°ņ²±õ“±ųµ³ųøøō¹øõææõĶĖśĶĢłŠĻūŪŚūÜŪūąßüååūēężīķžīīžļīžļļüšļžńńżóóżöõž÷öžųųžłłžüü’žž’’’’KKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKK-----AK3--------KH (K7  8K* +KKC!"9: 'JKKKK5/K6 $@;KKK1=KK.K0GKK2#KKF?>BKK,K<)DI?E4%%%%&KKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKK( @ÖÖ×Ų×ŲŁŁ×ŚŚ×Ū Ū Ų Ü Ż Ż Ž ą ą ąįāÜÜāįćŚäåćŚÜęęŻēēćččé é źŪ ā!ź"ėÜ#ė$ė#"Ž*$č+#ģ+$ģ.&ģ,,Ż0(ģ0)ģ1*ģ3,ģ22Ž66Ž92ķ:3ķ>7ī@9ī?>āDDāFBéNHļOHļNNāUNšVOš]Wšd_šlkźllēroītoņzvó|wóź‚ń„€ō†‚óˆƒō‰…ō‹‡ō““š˜–ō¢¢š©©ń¬Øų®«ųƬųÆ­öÆÆņ¹¹ō»¹ł¼¹ł½ŗł¾¼ų¾¼łĄĄõĮæśÅÅöĘĘöĒĒöČĘśĖĖöĪĪ÷ĻĻ÷ÓŅśÓŅūÕŌūÜŚüŽÜüŽŻüāįüääüēēūččūźéżņńžņņžóóżōóžõõžööž÷÷žųųžłłžüüžžž’’’’ŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒJJJJJJJJJJmŒŒŒ\JJJJJJJJJJJJJJJJJ ---P‹ŒŒŒ:--- 111gŒŒŒ~111 111ƒŒŒŒf111 111GŒŒŒŒX'$ 111 1111111YŒŒŒŒI11111111111111111 1111111iŒŒŒˆ(#&*,111111111111 1110$/xŒŒŒŒŒq:%ekkkk6111 111\ŒŒŒŒŒŒŒˆU `ŒŒŒŒ†] 111 ;WD?ŠŒŒŒŒŒŒŒŒŒt@!oŒŒŒ‡_.111 SŒNpŒŒŒŒŒŒŒŒŒŒŒ‰ŒŒŒ€K1) 111 QŒlVŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒwB1111+1asŒŒŒŒŒŒŒŒŒŒTLb‚ŒŒŒŒd81111111aaŒŒŒŒŒŒŒŒŒŒŒc3119RrŒZ411111111"ŒŒŒŒE[|ŒŒŒŒŒ…>111111=1111111111"ŒŒŒŒ57{ŒŒŒŒŒŒn<1111111111111111"ŒŒŒŒ5MŒŒŒjhŒŒŒyC11HA11111111111"ŒŒŒŒ2OŒŒŒ^ FuŒŒzz„}v ŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒ(@€ÖÖ××ÖŲŲÖŲŲŁ×ŁŁŚ×ŚŚ××Ū Ü Ü Ü Ż Ż Ž Ų ß ß ą ąŲ ą įŁāŁāŁįćŪćääÜŁåååŚęęŚēēčęŚēčéé źŪ ź!ź"ė#ė$ė""Ū%ė&ė##Ü$$Ü'ģ)!ģ''Ü*"ģ+#ģ-%ģ,'č.'ģ0(ģ1)ģ/,ä2*ģ1*ķ1,č2+ķ10ą5-ķ6/ķ52å66ß:2ķ77ß;4ķ>6ī<<ą@9ī??ąB;īD=īE>īF?īG@ļHHįIGęIIāLEļRKļPPćSSćVOšTTćVTēUUäWSėYSš[Tš[UšZZä]]åa[ńa\šaaåd^ńgańgbšfeéidńkeņlgņoiņnnčqkņrrčtoóuuéwrózuó}yņ~yņ~yō€{ōź€|ō}ņ€€ėƒ~óˆƒō††ėˆõ’Žō”ö““ķ–’ö—”õ››ļ™öœœļ””š„„š©„÷Ŗ§÷©©ńƬų°­ų±®ų°°ņ²²ó³³ó·“łøµłøøōŗøł¼¹ł½ŗł¾»łĄæ÷ĮĮõÅĆśĒÅśĒĒöŹČśĖÉśĖĖ÷ĶĶ÷ŠŠ÷ŃĻūŃŃųÓŃūÕÓūÕÕųÖÖų×ÖūŁŁłŚŁüŚŚłŪŚüŪŪłÜÜłŽŽśßŽüąąśįįśāāśāāūęęūēężččūėźżōōżśśžüüž’’’ŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁ¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢«ŁŁŁŁŁŁŁŁ¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢tŁŁŁŁŁŁŁ¬>>>>>>&™ŲŁŁŁŁŁŁŁŠ >>>>>>>!DDDDDD,KŁŁŁŁŁŁŁŁŁd DDDDDDD!!DDDDDD,tŁŁŁŁŁŁŁŁŅ' DDDDDDD!!DDDDDD,ŁŁŁŁŁŁŁŁ° DDDDDDD!!DDDDDD,¾ŁŁŁŁŁŁŁŁ“ DDDDDDD!!DDDDDD,6ŁŁŁŁŁŁŁŁŁf DDDDDDD!!DDDDDD, uŁŁŁŁŁŁŁŁŲR-)$"  DDDDDDD!!DDDDDD7&18>@DDŸŁŁŁŁŁŁŁŁŗIDDDDDDDDDCB?>9842+)$DDDDDDD!!DDDDDDDDDDDDDDHŗŁŁŁŁŁŁŁŁžDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDD!!DDDDDDDDDDDDDDUŁŁŁŁŁŁŁŁŁ~DDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDD!!DDDDDDDDDDDDDDzŁŁŁŁŁŁŁŁŁWDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDD!!DDDDDDDDDDDDDEžŁŁŁŁŁŁŁŁŃ*"$+058=BDDDDDDDDDDDDDDDDDDDDDDD!!DDDDDDDDDD?<•ĀŁŁŁŁŁŁŁŁŁŁÄlwYDDDDDDD!!DDDDDDD?+ fŁŁŁŁŁŁŁŁŁŁŁŁŁŁ %_3ŌŁŁŁŁŁŁŁŁŁ[DDDDDDD!!DDDDDDB¼ŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁĻt#«ŁŁŁŁŁŁŁŁŁŁŁ¾.DDDDDDD!!DDDDDD@ŒŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁ¤;J¹ŁŁŁŁŁŁŁŁŁŁŹˆ/ DDDDDDD!!DDD`gD@AÖŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŠ{aĢŁŁŁŁŁŁŁŁŁĘ DDDDDDD!!Dx®ŁŽD@ §ŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁ­GvŁŁŁŁŁŁŁŁŁĶ†: DDDDDDD!!DĮŁŁ‚F@nŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŌ£ŁŁŁŁŁŁŁŁŁøcDD? DDDDDDD!!DĮŁŁ›‹@#ĄŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁ¦QDDDDD1 DDDDDDD!!DĮŁŁŁ—@–ŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁ’HDDDDDDDB)DDDDDDD! ½ŁŁŁ„ŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁÕ€EDDDDDDDDDDDDD rrrĖŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁs}©ŁŁŁŁŁŁŁŁŁŁŁŁŁĀkDDDDDDDDDDDDDDDrrrrŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŽDDEZ‘»ŁŁŁŁŁŁŁŁŁÆXDDDDDDDDDDDDDDDDKŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁØIDDDDDLo”ÓŁŁŁŁŁœMDDDDDDDDDDDDDDDDDKŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁÉTDDDDDDDDDO±ŁŁ‡EDDDDDDDDDDDDDDDDDDKŁŁŁŁŁŁŁŁqƒ·ŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁpDDDDDDDDDDDDFbjDDDDDDDDDDDDDDDDDDDDKŁŁŁŁŁŁŁŁdFhšŁŁŁŁŁŁŁŁŁŁŁŁÅ]DDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDKŁŁŁŁŁŁŁŁdDD”ŁŁŁŁŁŁŁŁŁŁŁŁŁĒiDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDKŁŁŁŁŁŁŁŁdDi×ŁŁŁŁŁŁŁŁŁŁŁŁŁŁÓyEDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDKŁŁŁŁŁŁŁŁdD˜ŁŁŁŁŁŁŁŖŁŁŁŁŁŁŁŁŁ‰EDDDDDDS\DDDDDDDDDDDDDDDDDDDDDDDKŁŁŁŁŁŁŁŁdD„ŁŁŁŁŁŁŁheØŁŁŁŁŁŁŁŁšIDDDDP“…DDDDDDDDDDDDDDDDDDDDDDDKŁŁŁŁŁŁŁŁd !µŁŁŁŁŁŁŁ^!(m¶ŁŁŁŁŁŁŁŗ³³³³æŁÅ³³²V!!!!!!!!!!!!!!!!!!!KŁŁŁŁŁŁŁŁdČŁŁŁŁŁŁŁN|ĪŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁĆKŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁapache-couchdb-1.6.0/share/doc/build/html/_static/basic.css0000644000175000001440000002041712332105766023467 0ustar00djcusers00000000000000/* * basic.css * ~~~~~~~~~ * * Sphinx stylesheet -- basic theme. * * :copyright: Copyright 2007-2011 by the Sphinx team, see AUTHORS. * :license: BSD, see LICENSE for details. * */ /* -- main layout ----------------------------------------------------------- */ div.clearer { clear: both; } /* -- relbar ---------------------------------------------------------------- */ div.related { width: 100%; font-size: 90%; } div.related h3 { display: none; } div.related ul { margin: 0; padding: 0 0 0 10px; list-style: none; } div.related li { display: inline; } div.related li.right { float: right; margin-right: 5px; } /* -- sidebar --------------------------------------------------------------- */ div.sphinxsidebarwrapper { padding: 10px 5px 0 10px; } div.sphinxsidebar { float: left; width: 230px; margin-left: -100%; font-size: 90%; } div.sphinxsidebar ul { list-style: none; } div.sphinxsidebar ul ul, div.sphinxsidebar ul.want-points { margin-left: 20px; list-style: square; } div.sphinxsidebar ul ul { margin-top: 0; margin-bottom: 0; } div.sphinxsidebar form { margin-top: 10px; } div.sphinxsidebar input { border: 1px solid #98dbcc; font-family: sans-serif; font-size: 1em; } div.sphinxsidebar #searchbox input[type="text"] { width: 170px; } div.sphinxsidebar #searchbox input[type="submit"] { width: 30px; } img { border: 0; } /* -- search page ----------------------------------------------------------- */ ul.search { margin: 10px 0 0 20px; padding: 0; } ul.search li { padding: 5px 0 5px 20px; background-image: url(file.png); background-repeat: no-repeat; background-position: 0 7px; } ul.search li a { font-weight: bold; } ul.search li div.context { color: #888; margin: 2px 0 0 30px; text-align: left; } ul.keywordmatches li.goodmatch a { font-weight: bold; } /* -- index page ------------------------------------------------------------ */ table.contentstable { width: 90%; } table.contentstable p.biglink { line-height: 150%; } a.biglink { font-size: 1.3em; } span.linkdescr { font-style: italic; padding-top: 5px; font-size: 90%; } /* -- general index --------------------------------------------------------- */ table.indextable { width: 100%; } table.indextable td { text-align: left; vertical-align: top; } table.indextable dl, table.indextable dd { margin-top: 0; margin-bottom: 0; } table.indextable tr.pcap { height: 10px; } table.indextable tr.cap { margin-top: 10px; background-color: #f2f2f2; } img.toggler { margin-right: 3px; margin-top: 3px; cursor: pointer; } div.modindex-jumpbox { border-top: 1px solid #ddd; border-bottom: 1px solid #ddd; margin: 1em 0 1em 0; padding: 0.4em; } div.genindex-jumpbox { border-top: 1px solid #ddd; border-bottom: 1px solid #ddd; margin: 1em 0 1em 0; padding: 0.4em; } /* -- general body styles --------------------------------------------------- */ a.headerlink { visibility: hidden; } h1:hover > a.headerlink, h2:hover > a.headerlink, h3:hover > a.headerlink, h4:hover > a.headerlink, h5:hover > a.headerlink, h6:hover > a.headerlink, dt:hover > a.headerlink { visibility: visible; } div.body p.caption { text-align: inherit; } div.body td { text-align: left; } .field-list ul { padding-left: 1em; } .first { margin-top: 0 !important; } p.rubric { margin-top: 30px; font-weight: bold; } img.align-left, .figure.align-left, object.align-left { clear: left; float: left; margin-right: 1em; } img.align-right, .figure.align-right, object.align-right { clear: right; float: right; margin-left: 1em; } img.align-center, .figure.align-center, object.align-center { display: block; margin-left: auto; margin-right: auto; } .align-left { text-align: left; } .align-center { text-align: center; } .align-right { text-align: right; } /* -- sidebars -------------------------------------------------------------- */ div.sidebar { margin: 0 0 0.5em 1em; border: 1px solid #ddb; padding: 7px 7px 0 7px; background-color: #ffe; width: 40%; float: right; } p.sidebar-title { font-weight: bold; } /* -- topics ---------------------------------------------------------------- */ div.topic { border: 1px solid #ccc; padding: 7px 7px 0 7px; margin: 10px 0 10px 0; } p.topic-title { font-size: 1.1em; font-weight: bold; margin-top: 10px; } /* -- admonitions ----------------------------------------------------------- */ div.admonition { margin-top: 10px; margin-bottom: 10px; padding: 7px; } div.admonition dt { font-weight: bold; } div.admonition dl { margin-bottom: 0; } p.admonition-title { margin: 0px 10px 5px 0px; font-weight: bold; } div.body p.centered { text-align: center; margin-top: 25px; } /* -- tables ---------------------------------------------------------------- */ table.docutils { border: 0; border-collapse: collapse; } table.docutils td, table.docutils th { padding: 1px 8px 1px 5px; border-top: 0; border-left: 0; border-right: 0; border-bottom: 1px solid #aaa; } table.field-list td, table.field-list th { border: 0 !important; } table.footnote td, table.footnote th { border: 0 !important; } th { text-align: left; padding-right: 5px; } table.citation { border-left: solid 1px gray; margin-left: 1px; } table.citation td { border-bottom: none; } /* -- other body styles ----------------------------------------------------- */ ol.arabic { list-style: decimal; } ol.loweralpha { list-style: lower-alpha; } ol.upperalpha { list-style: upper-alpha; } ol.lowerroman { list-style: lower-roman; } ol.upperroman { list-style: upper-roman; } dl { margin-bottom: 15px; } dd p { margin-top: 0px; } dd ul, dd table { margin-bottom: 10px; } dd { margin-top: 3px; margin-bottom: 10px; margin-left: 30px; } dt:target, .highlighted { background-color: #fbe54e; } dl.glossary dt { font-weight: bold; font-size: 1.1em; } .field-list ul { margin: 0; padding-left: 1em; } .field-list p { margin: 0; } .refcount { color: #060; } .optional { font-size: 1.3em; } .versionmodified { font-style: italic; } .system-message { background-color: #fda; padding: 5px; border: 3px solid red; } .footnote:target { background-color: #ffa; } .line-block { display: block; margin-top: 1em; margin-bottom: 1em; } .line-block .line-block { margin-top: 0; margin-bottom: 0; margin-left: 1.5em; } .guilabel, .menuselection { font-family: sans-serif; } .accelerator { text-decoration: underline; } .classifier { font-style: oblique; } abbr, acronym { border-bottom: dotted 1px; cursor: help; } /* -- code displays --------------------------------------------------------- */ pre { overflow: auto; overflow-y: hidden; /* fixes display issues on Chrome browsers */ } td.linenos pre { padding: 5px 0px; border: 0; background-color: transparent; color: #aaa; } table.highlighttable { margin-left: 0.5em; } table.highlighttable td { padding: 0 0.5em 0 0.5em; } tt.descname { background-color: transparent; font-weight: bold; font-size: 1.2em; } tt.descclassname { background-color: transparent; } tt.xref, a tt { background-color: transparent; font-weight: bold; } h1 tt, h2 tt, h3 tt, h4 tt, h5 tt, h6 tt { background-color: transparent; } .viewcode-link { float: right; } .viewcode-back { float: right; font-family: sans-serif; } div.viewcode-block:target { margin: -1px -10px; padding: 0 10px; } /* -- math display ---------------------------------------------------------- */ img.math { vertical-align: middle; } div.body div.math p { text-align: center; } span.eqno { float: right; } /* -- printout stylesheet --------------------------------------------------- */ @media print { div.document, div.documentwrapper, div.bodywrapper { margin: 0 !important; width: 100%; } div.sphinxsidebar, div.related, div.footer, #top-link { display: none; } }apache-couchdb-1.6.0/share/doc/build/html/_static/ajax-loader.gif0000644000175000001440000000124111644410761024543 0ustar00djcusers00000000000000GIF89aņ’’’U|ĘÖßN€U|l–®Š«¾™¶Ę!žCreated with ajaxload.info!ł !’ NETSCAPE2.0,3ŗÜž0ŹIkc:œN˜f E±1Āŗ™Į¶.`ÄĀqŠ-[9ݦ9 JkēH!ł ,4ŗÜžNŒ! „ »°ęŠDqBQT`1 `LE[Ø|µußķa€ ×ā†C²%$*!ł ,6ŗ2#+ŹAȐ̔V/…cōNńIBa˜«pš ̳½ĘØ+YķüƒĆ2©dŸæ!ł ,3ŗb%+Ź2†‘ģœV_…‹¦ …! 1D‡aŖF‚°ŃbR]ó=08,Č¤r9L!ł ,2ŗr'+JēdšóL &vĆ`\bT”…„¹hYB)ĻŹ@é<Ć&,Č¤R’!ł ,3ŗ 9ćtē¼Śž0Ēą!.B¶ŹW¬¢1  sa»°5÷•0° ‰»Ÿm)J!ł ,2ŗÜžš ٜU]šīŚqp•`ˆŻaœŻ4–…AFÅ0`›¶ Ā@›1€ĀÖĪ‘!ł ,2ŗÜž0ŹI«eBԜ)×Ć ŽĒq10©Ź°®PĀaVŚ„ ub‚ž[;apache-couchdb-1.6.0/share/doc/build/html/_static/default.css0000644000175000001440000000771012332105766024033 0ustar00djcusers00000000000000/* * default.css_t * ~~~~~~~~~~~~~ * * Sphinx stylesheet -- default theme. * * :copyright: Copyright 2007-2011 by the Sphinx team, see AUTHORS. * :license: BSD, see LICENSE for details. * */ @import url("basic.css"); /* -- page layout ----------------------------------------------------------- */ body { font-family: sans-serif; font-size: 100%; background-color: #11303d; color: #000; margin: 0; padding: 0; } div.document { background-color: #1c4e63; } div.documentwrapper { float: left; width: 100%; } div.bodywrapper { margin: 0 0 0 230px; } div.body { background-color: #ffffff; color: #000000; padding: 0 20px 30px 20px; } div.footer { color: #ffffff; width: 100%; padding: 9px 0 9px 0; text-align: center; font-size: 75%; } div.footer a { color: #ffffff; text-decoration: underline; } div.related { background-color: #133f52; line-height: 30px; color: #ffffff; } div.related a { color: #ffffff; } div.sphinxsidebar { } div.sphinxsidebar h3 { font-family: 'Trebuchet MS', sans-serif; color: #ffffff; font-size: 1.4em; font-weight: normal; margin: 0; padding: 0; } div.sphinxsidebar h3 a { color: #ffffff; } div.sphinxsidebar h4 { font-family: 'Trebuchet MS', sans-serif; color: #ffffff; font-size: 1.3em; font-weight: normal; margin: 5px 0 0 0; padding: 0; } div.sphinxsidebar p { color: #ffffff; } div.sphinxsidebar p.topless { margin: 5px 10px 10px 10px; } div.sphinxsidebar ul { margin: 10px; padding: 0; color: #ffffff; } div.sphinxsidebar a { color: #98dbcc; } div.sphinxsidebar input { border: 1px solid #98dbcc; font-family: sans-serif; font-size: 1em; } /* -- hyperlink styles ------------------------------------------------------ */ a { color: #355f7c; text-decoration: none; } a:visited { color: #355f7c; text-decoration: none; } a:hover { text-decoration: underline; } /* -- body styles ----------------------------------------------------------- */ div.body h1, div.body h2, div.body h3, div.body h4, div.body h5, div.body h6 { font-family: 'Trebuchet MS', sans-serif; background-color: #f2f2f2; font-weight: normal; color: #20435c; border-bottom: 1px solid #ccc; margin: 20px -20px 10px -20px; padding: 3px 0 3px 10px; } div.body h1 { margin-top: 0; font-size: 200%; } div.body h2 { font-size: 160%; } div.body h3 { font-size: 140%; } div.body h4 { font-size: 120%; } div.body h5 { font-size: 110%; } div.body h6 { font-size: 100%; } a.headerlink { color: #c60f0f; font-size: 0.8em; padding: 0 4px 0 4px; text-decoration: none; } a.headerlink:hover { background-color: #c60f0f; color: white; } div.body p, div.body dd, div.body li { text-align: justify; line-height: 130%; } div.admonition p.admonition-title + p { display: inline; } div.admonition p { margin-bottom: 5px; } div.admonition pre { margin-bottom: 5px; } div.admonition ul, div.admonition ol { margin-bottom: 5px; } div.note { background-color: #eee; border: 1px solid #ccc; } div.seealso { background-color: #ffc; border: 1px solid #ff6; } div.topic { background-color: #eee; } div.warning { background-color: #ffe4e4; border: 1px solid #f66; } p.admonition-title { display: inline; } p.admonition-title:after { content: ":"; } pre { padding: 5px; background-color: #eeffcc; color: #333333; line-height: 120%; border: 1px solid #ac9; border-left: none; border-right: none; } tt { background-color: #ecf0f3; padding: 0 1px 0 1px; font-size: 0.95em; } th { background-color: #ede; } .warning tt { background: #efc2c2; } .note tt { background: #d6d6d6; } .viewcode-back { font-family: sans-serif; } div.viewcode-block:target { background-color: #f4debf; border-top: 1px solid #ac9; border-bottom: 1px solid #ac9; }apache-couchdb-1.6.0/share/doc/build/html/_static/down.png0000644000175000001440000000055311644410761023347 0ustar00djcusers00000000000000‰PNG  IHDRó’asRGB®ĪébKGDłC» pHYs × ×B(›xtIMEŚ"ÅķU{ėIDAT8ĖĶŅ”NCAŠóŚJ, ++@ ™4>‡Øā/ŠUü’¤^,†~T&Ō3M^^^ŪPÅM6ŁŁ¹sļĢī*„ōķ‰RJæ‡a)e¼GńĆ*ƒœąń¹”čWøÅ<"®«Fņ ‡ųFgÜć78G…>q ƒ†ĮOIØp‘«‰:s“õAÕjń5GنyDœ®ƒ^+y†U:ép_%G§@D|ašÕ­O“£s„Ę(ļy”M,"āØĶķm˜sŌx:÷£.b§@D|`–V˜åٟŪ²”²ÜĘģŠøÜe²KąÅæĒ/źG!‚ ™IEND®B`‚apache-couchdb-1.6.0/share/doc/build/html/_static/rtd.css0000644000175000001440000003640312332105522023167 0ustar00djcusers00000000000000/* * rtd.css * ~~~~~~~~~~~~~~~ * * Sphinx stylesheet -- sphinxdoc theme. Originally created by * Armin Ronacher for Werkzeug. * * Customized for ReadTheDocs by Eric Pierce & Eric Holscher * * :copyright: Copyright 2007-2010 by the Sphinx team, see AUTHORS. * :license: BSD, see LICENSE for details. * */ /* RTD colors * light blue: #e8ecef * medium blue: #8ca1af * dark blue: #465158 * dark grey: #444444 * * white hover: #d1d9df; * medium blue hover: #697983; * green highlight: #8ecc4c * light blue (project bar): #e8ecef */ @import url("basic.css"); /* PAGE LAYOUT -------------------------------------------------------------- */ body { font: 100%/1.5 "ff-meta-web-pro-1","ff-meta-web-pro-2",Arial,"Helvetica Neue",sans-serif; text-align: center; color: black; background-color: #465158; padding: 0; margin: 0; } div.document { text-align: left; background-color: #e8ecef; } div.bodywrapper { background-color: #ffffff; border-left: 1px solid #ccc; border-bottom: 1px solid #ccc; margin: 0 0 0 16em; } div.body { margin: 0; padding: 0.5em 1.3em; min-width: 20em; } div.related { font-size: 1em; background-color: #465158; } div.documentwrapper { float: left; width: 100%; background-color: #e8ecef; } /* HEADINGS --------------------------------------------------------------- */ h1 { margin: 0; padding: 0.7em 0 0.3em 0; font-size: 1.5em; line-height: 1.15; color: #111; clear: both; } h2 { margin: 2em 0 0.2em 0; font-size: 1.35em; padding: 0; color: #465158; } h3 { margin: 1em 0 -0.3em 0; font-size: 1.2em; color: #6c818f; } div.body h1 a, div.body h2 a, div.body h3 a, div.body h4 a, div.body h5 a, div.body h6 a { color: black; } h1 a.anchor, h2 a.anchor, h3 a.anchor, h4 a.anchor, h5 a.anchor, h6 a.anchor { display: none; margin: 0 0 0 0.3em; padding: 0 0.2em 0 0.2em; color: #aaa !important; } h1:hover a.anchor, h2:hover a.anchor, h3:hover a.anchor, h4:hover a.anchor, h5:hover a.anchor, h6:hover a.anchor { display: inline; } h1 a.anchor:hover, h2 a.anchor:hover, h3 a.anchor:hover, h4 a.anchor:hover, h5 a.anchor:hover, h6 a.anchor:hover { color: #777; background-color: #eee; } /* LINKS ------------------------------------------------------------------ */ /* Normal links get a pseudo-underline */ a { color: #444; text-decoration: none; border-bottom: 1px solid #ccc; } /* Links in sidebar, TOC, index trees and tables have no underline */ .sphinxsidebar a, .toctree-wrapper a, .indextable a, #indices-and-tables a { color: #444; text-decoration: none; border-bottom: none; } /* Most links get an underline-effect when hovered */ a:hover, div.toctree-wrapper a:hover, .indextable a:hover, #indices-and-tables a:hover { color: #111; text-decoration: none; border-bottom: 1px solid #111; } /* Footer links */ div.footer a { color: #86989B; text-decoration: none; border: none; } div.footer a:hover { color: #a6b8bb; text-decoration: underline; border: none; } /* Permalink anchor (subtle grey with a red hover) */ div.body a.headerlink { color: #ccc; font-size: 1em; margin-left: 6px; padding: 0 4px 0 4px; text-decoration: none; border: none; } div.body a.headerlink:hover { color: #c60f0f; border: none; } /* NAVIGATION BAR --------------------------------------------------------- */ div.related ul { height: 2.5em; } div.related ul li { margin: 0; padding: 0.65em 0; float: left; display: block; color: white; /* For the >> separators */ font-size: 0.8em; } div.related ul li.right { float: right; margin-right: 5px; color: transparent; /* Hide the | separators */ } /* "Breadcrumb" links in nav bar */ div.related ul li a { order: none; background-color: inherit; font-weight: bold; margin: 6px 0 6px 4px; line-height: 1.75em; color: #ffffff; padding: 0.4em 0.8em; border: none; border-radius: 3px; } /* previous / next / modules / index links look more like buttons */ div.related ul li.right a { margin: 0.375em 0; background-color: #697983; text-shadow: 0 1px rgba(0, 0, 0, 0.5); border-radius: 3px; -webkit-border-radius: 3px; -moz-border-radius: 3px; } /* All navbar links light up as buttons when hovered */ div.related ul li a:hover { background-color: #8ca1af; color: #ffffff; text-decoration: none; border-radius: 3px; -webkit-border-radius: 3px; -moz-border-radius: 3px; } /* Take extra precautions for tt within links */ a tt, div.related ul li a tt { background: inherit !important; color: inherit !important; } /* SIDEBAR ---------------------------------------------------------------- */ div.sphinxsidebarwrapper { padding: 0; } div.sphinxsidebar { margin: 0; margin-left: -100%; float: left; top: 3em; left: 0; padding: 0 1em; width: 14em; font-size: 1em; text-align: left; background-color: #e8ecef; } div.sphinxsidebar img { max-width: 12em; } div.sphinxsidebar h3, div.sphinxsidebar h4, div.sphinxsidebar p.logo { margin: 1.2em 0 0.3em 0; font-size: 1em; padding: 0; color: #222222; font-family: "ff-meta-web-pro-1", "ff-meta-web-pro-2", "Arial", "Helvetica Neue", sans-serif; } div.sphinxsidebar h3 a { color: #444444; } div.sphinxsidebar ul, div.sphinxsidebar p { margin-top: 0; padding-left: 0; line-height: 130%; background-color: #e8ecef; } /* No bullets for nested lists, but a little extra indentation */ div.sphinxsidebar ul ul { list-style-type: none; margin-left: 1.5em; padding: 0; } /* A little top/bottom padding to prevent adjacent links' borders * from overlapping each other */ div.sphinxsidebar ul li { padding: 1px 0; } /* A little left-padding to make these align with the ULs */ div.sphinxsidebar p.topless { padding-left: 0 0 0 1em; } /* Make these into hidden one-liners */ div.sphinxsidebar ul li, div.sphinxsidebar p.topless { white-space: nowrap; overflow: hidden; } /* ...which become visible when hovered */ div.sphinxsidebar ul li:hover, div.sphinxsidebar p.topless:hover { overflow: visible; } /* Search text box and "Go" button */ #searchbox { margin-top: 2em; margin-bottom: 1em; background: #ddd; padding: 0.5em; border-radius: 6px; -moz-border-radius: 6px; -webkit-border-radius: 6px; } #searchbox h3 { margin-top: 0; } /* Make search box and button abut and have a border */ input, div.sphinxsidebar input { border: 1px solid #999; float: left; } /* Search textbox */ input[type="text"] { margin: 0; padding: 0 3px; height: 20px; width: 144px; border-top-left-radius: 3px; border-bottom-left-radius: 3px; -moz-border-radius-topleft: 3px; -moz-border-radius-bottomleft: 3px; -webkit-border-top-left-radius: 3px; -webkit-border-bottom-left-radius: 3px; } /* Search button */ input[type="submit"] { margin: 0 0 0 -1px; /* -1px prevents a double-border with textbox */ height: 22px; color: #444; background-color: #e8ecef; padding: 1px 4px; font-weight: bold; border-top-right-radius: 3px; border-bottom-right-radius: 3px; -moz-border-radius-topright: 3px; -moz-border-radius-bottomright: 3px; -webkit-border-top-right-radius: 3px; -webkit-border-bottom-right-radius: 3px; } input[type="submit"]:hover { color: #ffffff; background-color: #8ecc4c; } div.sphinxsidebar p.searchtip { clear: both; padding: 0.5em 0 0 0; background: #ddd; color: #666; font-size: 0.9em; } /* Sidebar links are unusual */ div.sphinxsidebar li a, div.sphinxsidebar p a { background: #e8ecef; /* In case links overlap main content */ border-radius: 3px; -moz-border-radius: 3px; -webkit-border-radius: 3px; border: 1px solid transparent; /* To prevent things jumping around on hover */ padding: 0 5px 0 5px; } div.sphinxsidebar li a:hover, div.sphinxsidebar p a:hover { color: #111; text-decoration: none; border: 1px solid #888; } div.sphinxsidebar p.logo a { border: 0; } /* Tweak any link appearing in a heading */ div.sphinxsidebar h3 a { } /* OTHER STUFF ------------------------------------------------------------ */ cite, code, tt { font-family: 'Consolas', 'Deja Vu Sans Mono', 'Bitstream Vera Sans Mono', monospace; font-size: 0.95em; letter-spacing: 0.01em; } tt { background-color: #f2f2f2; color: #444; } tt.descname, tt.descclassname, tt.xref { border: 0; } hr { border: 1px solid #abc; margin: 2em; } pre, #_fontwidthtest { font-family: 'Consolas', 'Deja Vu Sans Mono', 'Bitstream Vera Sans Mono', monospace; margin: 1em 2em; font-size: 0.95em; letter-spacing: 0.015em; line-height: 120%; padding: 0.5em; border: 1px solid #ccc; background-color: #eee; border-radius: 6px; -moz-border-radius: 6px; -webkit-border-radius: 6px; } pre a { color: inherit; text-decoration: underline; } td.linenos pre { margin: 1em 0em; } td.code pre { margin: 1em 0em; } div.quotebar { background-color: #f8f8f8; max-width: 250px; float: right; padding: 2px 7px; border: 1px solid #ccc; } div.topic { background-color: #f8f8f8; } table { border-collapse: collapse; margin: 0 -0.5em 0 -0.5em; } table td, table th { padding: 0.2em 0.5em 0.2em 0.5em; } /* ADMONITIONS AND WARNINGS ------------------------------------------------- */ /* Shared by admonitions, warnings and sidebars */ div.admonition, div.warning, div.sidebar { font-size: 0.9em; margin: 2em; padding: 0; /* border-radius: 6px; -moz-border-radius: 6px; -webkit-border-radius: 6px; */ } div.admonition p, div.warning p, div.sidebar p { margin: 0.5em 1em 0.5em 1em; padding: 0; } div.admonition pre, div.warning pre, div.sidebar pre { margin: 0.4em 1em 0.4em 1em; } div.admonition p.admonition-title, div.warning p.admonition-title, div.sidebar p.sidebar-title { margin: 0; padding: 0.1em 0 0.1em 0.5em; color: white; font-weight: bold; font-size: 1.1em; text-shadow: 0 1px rgba(0, 0, 0, 0.5); } div.admonition ul, div.admonition ol, div.warning ul, div.warning ol, div.sidebar ul, div.sidebar ol { margin: 0.1em 0.5em 0.5em 3em; padding: 0; } /* Admonitions and sidebars only */ div.admonition, div.sidebar { border: 1px solid #609060; background-color: #e9ffe9; } div.admonition p.admonition-title, div.sidebar p.sidebar-title { background-color: #70A070; border-bottom: 1px solid #609060; } /* Warnings only */ div.warning { border: 1px solid #900000; background-color: #ffe9e9; } div.warning p.admonition-title { background-color: #b04040; border-bottom: 1px solid #900000; } /* Sidebars only */ div.sidebar { max-width: 30%; } div.versioninfo { margin: 1em 0 0 0; border: 1px solid #ccc; background-color: #DDEAF0; padding: 8px; line-height: 1.3em; font-size: 0.9em; } .viewcode-back { font-family: 'Lucida Grande', 'Lucida Sans Unicode', 'Geneva', 'Verdana', sans-serif; } div.viewcode-block:target { background-color: #f4debf; border-top: 1px solid #ac9; border-bottom: 1px solid #ac9; } dl { margin: 1em 0 2.5em 0; } /* Highlight target when you click an internal link */ dt:target { background: #ffe080; } /* Don't highlight whole divs */ div.highlight { background: transparent; } /* But do highlight spans (so search results can be highlighted) */ span.highlight { background: #ffe080; } div.footer { background-color: #465158; color: #eeeeee; padding: 0 2em 2em 2em; clear: both; font-size: 0.8em; text-align: center; } p { margin: 0.8em 0 0.5em 0; } .section p img.math { margin: 0; } .section p img { margin: 1em 2em; } /* MOBILE LAYOUT -------------------------------------------------------------- */ @media screen and (max-width: 600px) { h1, h2, h3, h4, h5 { position: relative; } ul { padding-left: 1.25em; } div.bodywrapper a.headerlink, #indices-and-tables h1 a { color: #e6e6e6; font-size: 80%; float: right; line-height: 1.8; position: absolute; right: -0.7em; visibility: inherit; } div.bodywrapper h1 a.headerlink, #indices-and-tables h1 a { line-height: 1.5; } pre { font-size: 0.7em; overflow: auto; word-wrap: break-word; white-space: pre-wrap; } div.related ul { height: 2.5em; padding: 0; text-align: left; } div.related ul li { clear: both; color: #465158; padding: 0.2em 0; } div.related ul li:last-child { border-bottom: 1px dotted #8ca1af; padding-bottom: 0.4em; margin-bottom: 1em; width: 100%; } div.related ul li a { color: #465158; padding-right: 0; } div.related ul li a:hover { background: inherit; color: inherit; } div.related ul li.right { clear: none; padding: 0.65em 0; margin-bottom: 0.5em; } div.related ul li.right a { color: #fff; padding-right: 0.8em; } div.related ul li.right a:hover { background-color: #8ca1af; } div.body { clear: both; min-width: 0; word-wrap: break-word; } div.bodywrapper { margin: 0 0 0 0; } div.sphinxsidebar { float: none; margin: 0; width: auto; } div.sphinxsidebar input[type="text"] { height: 2em; line-height: 2em; width: 70%; } div.sphinxsidebar input[type="submit"] { height: 2em; margin-left: 0.5em; width: 20%; } div.sphinxsidebar p.searchtip { background: inherit; margin-bottom: 1em; } div.sphinxsidebar ul li, div.sphinxsidebar p.topless { white-space: normal; } .bodywrapper img { display: block; margin-left: auto; margin-right: auto; max-width: 100%; } div.documentwrapper { float: none; } div.admonition, div.warning, pre, blockquote { margin-left: 0em; margin-right: 0em; } .body p img { margin: 0; } #searchbox { background: transparent; } .related:not(:first-child) li { display: none; } .related:not(:first-child) li.right { display: block; } div.footer { padding: 1em; } .rtd_doc_footer .rtd-badge { float: none; margin: 1em auto; position: static; } .rtd_doc_footer .rtd-badge.revsys-inline { margin-right: auto; margin-bottom: 2em; } table.indextable { display: block; width: auto; } .indextable tr { display: block; } .indextable td { display: block; padding: 0; width: auto !important; } .indextable td dt { margin: 1em 0; } ul.search { margin-left: 0.25em; } ul.search li div.context { font-size: 90%; line-height: 1.1; margin-bottom: 1; margin-left: 0; } } apache-couchdb-1.6.0/share/doc/build/html/_static/websupport.js0000644000175000001440000006123611653721004024442 0ustar00djcusers00000000000000/* * websupport.js * ~~~~~~~~~~~~~ * * sphinx.websupport utilties for all documentation. * * :copyright: Copyright 2007-2011 by the Sphinx team, see AUTHORS. * :license: BSD, see LICENSE for details. * */ (function($) { $.fn.autogrow = function() { return this.each(function() { var textarea = this; $.fn.autogrow.resize(textarea); $(textarea) .focus(function() { textarea.interval = setInterval(function() { $.fn.autogrow.resize(textarea); }, 500); }) .blur(function() { clearInterval(textarea.interval); }); }); }; $.fn.autogrow.resize = function(textarea) { var lineHeight = parseInt($(textarea).css('line-height'), 10); var lines = textarea.value.split('\n'); var columns = textarea.cols; var lineCount = 0; $.each(lines, function() { lineCount += Math.ceil(this.length / columns) || 1; }); var height = lineHeight * (lineCount + 1); $(textarea).css('height', height); }; })(jQuery); (function($) { var comp, by; function init() { initEvents(); initComparator(); } function initEvents() { $('a.comment-close').live("click", function(event) { event.preventDefault(); hide($(this).attr('id').substring(2)); }); $('a.vote').live("click", function(event) { event.preventDefault(); handleVote($(this)); }); $('a.reply').live("click", function(event) { event.preventDefault(); openReply($(this).attr('id').substring(2)); }); $('a.close-reply').live("click", function(event) { event.preventDefault(); closeReply($(this).attr('id').substring(2)); }); $('a.sort-option').live("click", function(event) { event.preventDefault(); handleReSort($(this)); }); $('a.show-proposal').live("click", function(event) { event.preventDefault(); showProposal($(this).attr('id').substring(2)); }); $('a.hide-proposal').live("click", function(event) { event.preventDefault(); hideProposal($(this).attr('id').substring(2)); }); $('a.show-propose-change').live("click", function(event) { event.preventDefault(); showProposeChange($(this).attr('id').substring(2)); }); $('a.hide-propose-change').live("click", function(event) { event.preventDefault(); hideProposeChange($(this).attr('id').substring(2)); }); $('a.accept-comment').live("click", function(event) { event.preventDefault(); acceptComment($(this).attr('id').substring(2)); }); $('a.delete-comment').live("click", function(event) { event.preventDefault(); deleteComment($(this).attr('id').substring(2)); }); $('a.comment-markup').live("click", function(event) { event.preventDefault(); toggleCommentMarkupBox($(this).attr('id').substring(2)); }); } /** * Set comp, which is a comparator function used for sorting and * inserting comments into the list. */ function setComparator() { // If the first three letters are "asc", sort in ascending order // and remove the prefix. if (by.substring(0,3) == 'asc') { var i = by.substring(3); comp = function(a, b) { return a[i] - b[i]; }; } else { // Otherwise sort in descending order. comp = function(a, b) { return b[by] - a[by]; }; } // Reset link styles and format the selected sort option. $('a.sel').attr('href', '#').removeClass('sel'); $('a.by' + by).removeAttr('href').addClass('sel'); } /** * Create a comp function. If the user has preferences stored in * the sortBy cookie, use those, otherwise use the default. */ function initComparator() { by = 'rating'; // Default to sort by rating. // If the sortBy cookie is set, use that instead. if (document.cookie.length > 0) { var start = document.cookie.indexOf('sortBy='); if (start != -1) { start = start + 7; var end = document.cookie.indexOf(";", start); if (end == -1) { end = document.cookie.length; by = unescape(document.cookie.substring(start, end)); } } } setComparator(); } /** * Show a comment div. */ function show(id) { $('#ao' + id).hide(); $('#ah' + id).show(); var context = $.extend({id: id}, opts); var popup = $(renderTemplate(popupTemplate, context)).hide(); popup.find('textarea[name="proposal"]').hide(); popup.find('a.by' + by).addClass('sel'); var form = popup.find('#cf' + id); form.submit(function(event) { event.preventDefault(); addComment(form); }); $('#s' + id).after(popup); popup.slideDown('fast', function() { getComments(id); }); } /** * Hide a comment div. */ function hide(id) { $('#ah' + id).hide(); $('#ao' + id).show(); var div = $('#sc' + id); div.slideUp('fast', function() { div.remove(); }); } /** * Perform an ajax request to get comments for a node * and insert the comments into the comments tree. */ function getComments(id) { $.ajax({ type: 'GET', url: opts.getCommentsURL, data: {node: id}, success: function(data, textStatus, request) { var ul = $('#cl' + id); var speed = 100; $('#cf' + id) .find('textarea[name="proposal"]') .data('source', data.source); if (data.comments.length === 0) { ul.html('
  • No comments yet.
  • '); ul.data('empty', true); } else { // If there are comments, sort them and put them in the list. var comments = sortComments(data.comments); speed = data.comments.length * 100; appendComments(comments, ul); ul.data('empty', false); } $('#cn' + id).slideUp(speed + 200); ul.slideDown(speed); }, error: function(request, textStatus, error) { showError('Oops, there was a problem retrieving the comments.'); }, dataType: 'json' }); } /** * Add a comment via ajax and insert the comment into the comment tree. */ function addComment(form) { var node_id = form.find('input[name="node"]').val(); var parent_id = form.find('input[name="parent"]').val(); var text = form.find('textarea[name="comment"]').val(); var proposal = form.find('textarea[name="proposal"]').val(); if (text == '') { showError('Please enter a comment.'); return; } // Disable the form that is being submitted. form.find('textarea,input').attr('disabled', 'disabled'); // Send the comment to the server. $.ajax({ type: "POST", url: opts.addCommentURL, dataType: 'json', data: { node: node_id, parent: parent_id, text: text, proposal: proposal }, success: function(data, textStatus, error) { // Reset the form. if (node_id) { hideProposeChange(node_id); } form.find('textarea') .val('') .add(form.find('input')) .removeAttr('disabled'); var ul = $('#cl' + (node_id || parent_id)); if (ul.data('empty')) { $(ul).empty(); ul.data('empty', false); } insertComment(data.comment); var ao = $('#ao' + node_id); ao.find('img').attr({'src': opts.commentBrightImage}); if (node_id) { // if this was a "root" comment, remove the commenting box // (the user can get it back by reopening the comment popup) $('#ca' + node_id).slideUp(); } }, error: function(request, textStatus, error) { form.find('textarea,input').removeAttr('disabled'); showError('Oops, there was a problem adding the comment.'); } }); } /** * Recursively append comments to the main comment list and children * lists, creating the comment tree. */ function appendComments(comments, ul) { $.each(comments, function() { var div = createCommentDiv(this); ul.append($(document.createElement('li')).html(div)); appendComments(this.children, div.find('ul.comment-children')); // To avoid stagnating data, don't store the comments children in data. this.children = null; div.data('comment', this); }); } /** * After adding a new comment, it must be inserted in the correct * location in the comment tree. */ function insertComment(comment) { var div = createCommentDiv(comment); // To avoid stagnating data, don't store the comments children in data. comment.children = null; div.data('comment', comment); var ul = $('#cl' + (comment.node || comment.parent)); var siblings = getChildren(ul); var li = $(document.createElement('li')); li.hide(); // Determine where in the parents children list to insert this comment. for(i=0; i < siblings.length; i++) { if (comp(comment, siblings[i]) <= 0) { $('#cd' + siblings[i].id) .parent() .before(li.html(div)); li.slideDown('fast'); return; } } // If we get here, this comment rates lower than all the others, // or it is the only comment in the list. ul.append(li.html(div)); li.slideDown('fast'); } function acceptComment(id) { $.ajax({ type: 'POST', url: opts.acceptCommentURL, data: {id: id}, success: function(data, textStatus, request) { $('#cm' + id).fadeOut('fast'); $('#cd' + id).removeClass('moderate'); }, error: function(request, textStatus, error) { showError('Oops, there was a problem accepting the comment.'); } }); } function deleteComment(id) { $.ajax({ type: 'POST', url: opts.deleteCommentURL, data: {id: id}, success: function(data, textStatus, request) { var div = $('#cd' + id); if (data == 'delete') { // Moderator mode: remove the comment and all children immediately div.slideUp('fast', function() { div.remove(); }); return; } // User mode: only mark the comment as deleted div .find('span.user-id:first') .text('[deleted]').end() .find('div.comment-text:first') .text('[deleted]').end() .find('#cm' + id + ', #dc' + id + ', #ac' + id + ', #rc' + id + ', #sp' + id + ', #hp' + id + ', #cr' + id + ', #rl' + id) .remove(); var comment = div.data('comment'); comment.username = '[deleted]'; comment.text = '[deleted]'; div.data('comment', comment); }, error: function(request, textStatus, error) { showError('Oops, there was a problem deleting the comment.'); } }); } function showProposal(id) { $('#sp' + id).hide(); $('#hp' + id).show(); $('#pr' + id).slideDown('fast'); } function hideProposal(id) { $('#hp' + id).hide(); $('#sp' + id).show(); $('#pr' + id).slideUp('fast'); } function showProposeChange(id) { $('#pc' + id).hide(); $('#hc' + id).show(); var textarea = $('#pt' + id); textarea.val(textarea.data('source')); $.fn.autogrow.resize(textarea[0]); textarea.slideDown('fast'); } function hideProposeChange(id) { $('#hc' + id).hide(); $('#pc' + id).show(); var textarea = $('#pt' + id); textarea.val('').removeAttr('disabled'); textarea.slideUp('fast'); } function toggleCommentMarkupBox(id) { $('#mb' + id).toggle(); } /** Handle when the user clicks on a sort by link. */ function handleReSort(link) { var classes = link.attr('class').split(/\s+/); for (var i=0; iThank you! Your comment will show up ' + 'once it is has been approved by a moderator.
    '); } // Prettify the comment rating. comment.pretty_rating = comment.rating + ' point' + (comment.rating == 1 ? '' : 's'); // Make a class (for displaying not yet moderated comments differently) comment.css_class = comment.displayed ? '' : ' moderate'; // Create a div for this comment. var context = $.extend({}, opts, comment); var div = $(renderTemplate(commentTemplate, context)); // If the user has voted on this comment, highlight the correct arrow. if (comment.vote) { var direction = (comment.vote == 1) ? 'u' : 'd'; div.find('#' + direction + 'v' + comment.id).hide(); div.find('#' + direction + 'u' + comment.id).show(); } if (opts.moderator || comment.text != '[deleted]') { div.find('a.reply').show(); if (comment.proposal_diff) div.find('#sp' + comment.id).show(); if (opts.moderator && !comment.displayed) div.find('#cm' + comment.id).show(); if (opts.moderator || (opts.username == comment.username)) div.find('#dc' + comment.id).show(); } return div; } /** * A simple template renderer. Placeholders such as <%id%> are replaced * by context['id'] with items being escaped. Placeholders such as <#id#> * are not escaped. */ function renderTemplate(template, context) { var esc = $(document.createElement('div')); function handle(ph, escape) { var cur = context; $.each(ph.split('.'), function() { cur = cur[this]; }); return escape ? esc.text(cur || "").html() : cur; } return template.replace(/<([%#])([\w\.]*)\1>/g, function() { return handle(arguments[2], arguments[1] == '%' ? true : false); }); } /** Flash an error message briefly. */ function showError(message) { $(document.createElement('div')).attr({'class': 'popup-error'}) .append($(document.createElement('div')) .attr({'class': 'error-message'}).text(message)) .appendTo('body') .fadeIn("slow") .delay(2000) .fadeOut("slow"); } /** Add a link the user uses to open the comments popup. */ $.fn.comment = function() { return this.each(function() { var id = $(this).attr('id').substring(1); var count = COMMENT_METADATA[id]; var title = count + ' comment' + (count == 1 ? '' : 's'); var image = count > 0 ? opts.commentBrightImage : opts.commentImage; var addcls = count == 0 ? ' nocomment' : ''; $(this) .append( $(document.createElement('a')).attr({ href: '#', 'class': 'sphinx-comment-open' + addcls, id: 'ao' + id }) .append($(document.createElement('img')).attr({ src: image, alt: 'comment', title: title })) .click(function(event) { event.preventDefault(); show($(this).attr('id').substring(2)); }) ) .append( $(document.createElement('a')).attr({ href: '#', 'class': 'sphinx-comment-close hidden', id: 'ah' + id }) .append($(document.createElement('img')).attr({ src: opts.closeCommentImage, alt: 'close', title: 'close' })) .click(function(event) { event.preventDefault(); hide($(this).attr('id').substring(2)); }) ); }); }; var opts = { processVoteURL: '/_process_vote', addCommentURL: '/_add_comment', getCommentsURL: '/_get_comments', acceptCommentURL: '/_accept_comment', deleteCommentURL: '/_delete_comment', commentImage: '/static/_static/comment.png', closeCommentImage: '/static/_static/comment-close.png', loadingImage: '/static/_static/ajax-loader.gif', commentBrightImage: '/static/_static/comment-bright.png', upArrow: '/static/_static/up.png', downArrow: '/static/_static/down.png', upArrowPressed: '/static/_static/up-pressed.png', downArrowPressed: '/static/_static/down-pressed.png', voting: false, moderator: false }; if (typeof COMMENT_OPTIONS != "undefined") { opts = jQuery.extend(opts, COMMENT_OPTIONS); } var popupTemplate = '\
    \

    \ Sort by:\ best rated\ newest\ oldest\

    \
    Comments
    \
    \ loading comments...
    \
      \
      \

      Add a comment\ (markup):

      \
      \ reStructured text markup: *emph*, **strong**, \ ``code``, \ code blocks: :: and an indented block after blank line
      \
      \ \

      \ \ Propose a change ▹\ \ \ Propose a change ▿\ \

      \ \ \ \ \
      \
      \
      '; var commentTemplate = '\
      \
      \
      \ \ \ \ \ \ \
      \
      \ \ \ \ \ \ \
      \
      \
      \

      \ <%username%>\ <%pretty_rating%>\ <%time.delta%>\

      \
      <#text#>
      \

      \ \ reply ▿\ proposal ▹\ proposal ▿\ \ \

      \
      \
      <#proposal_diff#>\
              
      \
        \
        \
        \
        \ '; var replyTemplate = '\
      • \
        \
        \ \ \ \ \ \
        \
        \
      • '; $(document).ready(function() { init(); }); })(jQuery); $(document).ready(function() { // add comment anchors for all paragraphs that are commentable $('.sphinx-has-comment').comment(); // highlight search words in search results $("div.context").each(function() { var params = $.getQueryParameters(); var terms = (params.q) ? params.q[0].split(/\s+/) : []; var result = $(this); $.each(terms, function() { result.highlightText(this.toLowerCase(), 'highlighted'); }); }); // directly open comment window if requested var anchor = document.location.hash; if (anchor.substring(0, 9) == '#comment-') { $('#ao' + anchor.substring(9)).click(); document.location.hash = '#s' + anchor.substring(9); } }); apache-couchdb-1.6.0/share/doc/build/html/_static/pygments.css0000644000175000001440000000753412332105766024261 0ustar00djcusers00000000000000.highlight .hll { background-color: #ffffcc } .highlight { background: #eeffcc; } .highlight .c { color: #408090; font-style: italic } /* Comment */ .highlight .err { border: 1px solid #FF0000 } /* Error */ .highlight .k { color: #007020; font-weight: bold } /* Keyword */ .highlight .o { color: #666666 } /* Operator */ .highlight .cm { color: #408090; font-style: italic } /* Comment.Multiline */ .highlight .cp { color: #007020 } /* Comment.Preproc */ .highlight .c1 { color: #408090; font-style: italic } /* Comment.Single */ .highlight .cs { color: #408090; background-color: #fff0f0 } /* Comment.Special */ .highlight .gd { color: #A00000 } /* Generic.Deleted */ .highlight .ge { font-style: italic } /* Generic.Emph */ .highlight .gr { color: #FF0000 } /* Generic.Error */ .highlight .gh { color: #000080; font-weight: bold } /* Generic.Heading */ .highlight .gi { color: #00A000 } /* Generic.Inserted */ .highlight .go { color: #333333 } /* Generic.Output */ .highlight .gp { color: #c65d09; font-weight: bold } /* Generic.Prompt */ .highlight .gs { font-weight: bold } /* Generic.Strong */ .highlight .gu { color: #800080; font-weight: bold } /* Generic.Subheading */ .highlight .gt { color: #0044DD } /* Generic.Traceback */ .highlight .kc { color: #007020; font-weight: bold } /* Keyword.Constant */ .highlight .kd { color: #007020; font-weight: bold } /* Keyword.Declaration */ .highlight .kn { color: #007020; font-weight: bold } /* Keyword.Namespace */ .highlight .kp { color: #007020 } /* Keyword.Pseudo */ .highlight .kr { color: #007020; font-weight: bold } /* Keyword.Reserved */ .highlight .kt { color: #902000 } /* Keyword.Type */ .highlight .m { color: #208050 } /* Literal.Number */ .highlight .s { color: #4070a0 } /* Literal.String */ .highlight .na { color: #4070a0 } /* Name.Attribute */ .highlight .nb { color: #007020 } /* Name.Builtin */ .highlight .nc { color: #0e84b5; font-weight: bold } /* Name.Class */ .highlight .no { color: #60add5 } /* Name.Constant */ .highlight .nd { color: #555555; font-weight: bold } /* Name.Decorator */ .highlight .ni { color: #d55537; font-weight: bold } /* Name.Entity */ .highlight .ne { color: #007020 } /* Name.Exception */ .highlight .nf { color: #06287e } /* Name.Function */ .highlight .nl { color: #002070; font-weight: bold } /* Name.Label */ .highlight .nn { color: #0e84b5; font-weight: bold } /* Name.Namespace */ .highlight .nt { color: #062873; font-weight: bold } /* Name.Tag */ .highlight .nv { color: #bb60d5 } /* Name.Variable */ .highlight .ow { color: #007020; font-weight: bold } /* Operator.Word */ .highlight .w { color: #bbbbbb } /* Text.Whitespace */ .highlight .mf { color: #208050 } /* Literal.Number.Float */ .highlight .mh { color: #208050 } /* Literal.Number.Hex */ .highlight .mi { color: #208050 } /* Literal.Number.Integer */ .highlight .mo { color: #208050 } /* Literal.Number.Oct */ .highlight .sb { color: #4070a0 } /* Literal.String.Backtick */ .highlight .sc { color: #4070a0 } /* Literal.String.Char */ .highlight .sd { color: #4070a0; font-style: italic } /* Literal.String.Doc */ .highlight .s2 { color: #4070a0 } /* Literal.String.Double */ .highlight .se { color: #4070a0; font-weight: bold } /* Literal.String.Escape */ .highlight .sh { color: #4070a0 } /* Literal.String.Heredoc */ .highlight .si { color: #70a0d0; font-style: italic } /* Literal.String.Interpol */ .highlight .sx { color: #c65d09 } /* Literal.String.Other */ .highlight .sr { color: #235388 } /* Literal.String.Regex */ .highlight .s1 { color: #4070a0 } /* Literal.String.Single */ .highlight .ss { color: #517918 } /* Literal.String.Symbol */ .highlight .bp { color: #007020 } /* Name.Builtin.Pseudo */ .highlight .vc { color: #bb60d5 } /* Name.Variable.Class */ .highlight .vg { color: #bb60d5 } /* Name.Variable.Global */ .highlight .vi { color: #bb60d5 } /* Name.Variable.Instance */ .highlight .il { color: #208050 } /* Literal.Number.Integer.Long */apache-couchdb-1.6.0/share/doc/build/html/_static/comment-close.png0000644000175000001440000000677211644410761025156 0ustar00djcusers00000000000000‰PNG  IHDRó’a OiCCPPhotoshop ICC profilexŚSgTSé=÷ŽōBKˆ€”KoR RB‹€‘&*! Jˆ!”ŁQĮEEČ ˆŽŽ€ŒQ, Š Ųä!¢Žƒ£ˆŠŹūį{£kÖ¼÷ęĶžµ×>ē¬ó³ĻĄ –H3Q5€ ©BąƒĒÄĘįä.@ $p³d!sż#ų~<<+"Ą¾xÓ ĄM›Ą0‡’źB™\€„Ąt‘8K€@zŽB¦@F€˜&S `ĖcbćP-`'ęӀų™{[”! ‘ eˆDh;¬ĻVŠEX0fKÄ9Ų-0IWfH°·ĄĪ ² 0Qˆ…){`Č##x„™FņW<ń+®ē*x™²<¹$9E[-qWW.(ĪI+6aaš@.Āy™24ąóĢ ‘ąƒóżxĪ®ĪĪ6޶_-źæ’"bbćžåĻ«p@įt~Ńž,/³€;€mž¢%īh^  u÷‹f²@µ éŚWópų~<ß5°j>{‘-Ø]cöK'XtĄā÷ņ»oĮŌ(€hƒįĻw’ļ?żG %€fI’q^D$.Tʳ?ĒD *°AōĮ,ĄĮÜĮ ü`6„B$ÄĀBB d€r`)¬‚B(†Ķ°*`/Ō@4ĄQh†“p.ĀUø=pśažĮ(¼ AČa!ڈbŠX#Ž™…ų!ĮH‹$ ɈQ"K‘5H1RŠT UHņ=r9‡\Fŗ‘;Č2‚ü†¼G1”²Q=Ō µC¹Ø7„F¢ Šdt1š ›Šr“=Œ6”ēŠ«hŚ>CĒ0Ąč3Äl0.ĘĆB±8, “c˱"¬ «Ę°V¬»‰õcϱwEĄ 6wB aAHXLXNŲHØ $4Ś 7 „QĀ'"“ØK“&ŗłÄb21‡XH,#֏/{ˆCÄ7$‰C2'¹I±¤TŅŅFŅnR#é,©›4H#“ÉŚdk²9”, +ȅääĆä3ää!ņ[ b@q¤ųSā(RŹjJåå4åe˜2AU£šRŻØ”T5ZB­”¶RÆQ‡Ø4uš9̓IK„­¢•Óhh÷iÆčtŗŻ•N—ŠWŅĖéGč—čōw †ƒĒˆg(›gwƘL¦ӋĒT071ė˜ē™™oUX*¶*|‘Ź •J•&•*/T©Ŗ¦ŖŽŖ UóUĖT©^S}®FU3Sć© Ō–«UŖPėSSg©;؇ŖgØoT?¤~Yż‰YĆLĆOC¤Q ±_ć¼Ę c³x,!k «†u5Ä&±ĶŁ|v*»˜ż»‹=Ŗ©”9C3J3W³Ró”f?ć˜qųœtN ē(§—ó~ŠŽļ)ā)¦4L¹1e\kŖ–—–X«H«Q«Gė½6®ķ§¦½E»YūAĒJ'\'GgĪēSŁSݧ §M=:õ®.Ŗk„”»Dwæn§ī˜ž¾^€žLo§Žy½ēś}/żTżmś§õG X³ $Ū Ī<Å5qo</ĒŪńQC]Ć@C„a•a—į„‘¹Ń<£ÕFFŒiĘ\ć$ćmĘmĘ£&&!&KMźMīšRM¹¦)¦;L;LĒĶĢĶ¢Ķ֙5›=1×2ē›ē›×›ß·`ZxZ,¶Ø¶øeI²äZ¦Yī¶¼n…Z9Y„XUZ]³F­­%Ö»­»§§¹N“N«žÖgưń¶É¶©·°åŲŪ®¶m¶}agbg·Å®Ć“}ŗ}ż= ‡Ł«Z~s“r:V:ޚΜī?}Åō–é/gXĻĻŲ3ć¶Ė)ÄiS›ÓGgg¹sƒóˆ‹‰K‚Ė.—>.›ĘŻČ½äJtõq]įzŅõ›³›ĀķØŪÆī6īiī‡ÜŸĢ4Ÿ)žY3sŠĆČCąQåŃ? Ÿ•0k߬~OCOgµē#/c/‘W­×°·„wŖ÷aļ>ö>rŸć>ć<7Ž2ŽY_Ģ7Ą·Č·ĖOĆož_…ßC#’d’z’ѧ€%g‰A[ūųz|!æŽ?:Ūeö²ŁķAŒ ¹AA‚­‚åĮ­!hČ쐭!÷ē˜Ī‘Īi…P~čÖŠaęa‹Ć~ '…‡…W†?ŽpˆXŃ1—5wŃÜCsßDśD–DŽ›g1O9Æ-J5*>Ŗ.j<Ś7ŗ4ŗ?Ę.fYĢÕXXIlK9.*®6nl¾ßüķó‡āā ć{˜/Č]py”ĪĀō…§©.,:–@LˆN8”šA*ØŒ%ņw%Ž yĀĀg"/Ń6шŲC\*NņH*Mz’쑼5y$Å3„,幄'©¼L LŻ›:žšv m2=:½1ƒ’‘qBŖ!M“¶gźgęfvˬe…²žÅn‹·/•Ék³¬Y- ¶B¦čTZ(×*²geWfæĶ‰Ź9–«ž+Ķķ̳ŹŪ7œļŸ’ķĀį’¶„†KW-X潬j9²‰Š®Ū—Ų(Üxå‡oŹæ™Ü”“©«Ä¹dĻfŅféęŽ-ž[–Ŗ—ę—n ŁŚ“ ßV“ķõöEŪ/—Ķ(Ū»ƒ¶C¹£æ<ø¼e§ÉĪĶ;?T¤TōTśT6īŅŻµa×ųnŃī{¼ö4ģÕŪ[¼÷ż>ɾŪUUMÕfÕeūIū³÷?®‰Ŗéų–ūm]­NmqķĒŅż#¶×¹ŌÕŅ=TRÖ+ėGǾžļw- 6 UœĘā#pDyäé÷ ß÷ :ŚvŒ{¬įÓvg/jBšņšF›Sšū[b[ŗOĢ>ŃÖźŽzüGŪœ499ā?rżéü§CĻdĻ&žž¢žĖ®/~ųÕė×Īјє—ņ—“æm|„żźĄėÆŪĘĀƾÉx31^ōVūķĮwÜwļ£ßOä| (’hł±õSЧū“““’˜óüc3-ŪbKGD’’’ ½§“ pHYs  šœtIMEŚ!ā›ČŻ,IDAT8Ėe’_HuĒ?Ļļ}ßsŽž3ĶyņĖ•¶¦‹U2MvQÉ֊FŌE¬.ŠŃĶĆł­ÄŠbŃE$DD­‹ĖZF5b@QĢ"š:2§›š¦¾ļū{Ÿn.źsõåēū<_ų yī?ō½m÷²żč·wV™ź@t£R`}Z ķÄŠ_£# _=œį_@ŻĖż ßw^óRė®·•%6gC-Ī­(K>ä| $„Éļ{Æ})[^>]*$|^#([\w-]+)$/,Ua=/^.[^:#\[\.,]*$/,Va=/\S/, Wa=/^(\s|\u00A0)+|(\s|\u00A0)+$/g,Xa=/^<(\w+)\s*\/?>(?:<\/\1>)?$/,P=navigator.userAgent,xa=false,Q=[],L,$=Object.prototype.toString,aa=Object.prototype.hasOwnProperty,ba=Array.prototype.push,R=Array.prototype.slice,ya=Array.prototype.indexOf;c.fn=c.prototype={init:function(a,b){var d,f;if(!a)return this;if(a.nodeType){this.context=this[0]=a;this.length=1;return this}if(a==="body"&&!b){this.context=s;this[0]=s.body;this.selector="body";this.length=1;return this}if(typeof a==="string")if((d=Ta.exec(a))&& (d[1]||!b))if(d[1]){f=b?b.ownerDocument||b:s;if(a=Xa.exec(a))if(c.isPlainObject(b)){a=[s.createElement(a[1])];c.fn.attr.call(a,b,true)}else a=[f.createElement(a[1])];else{a=sa([d[1]],[f]);a=(a.cacheable?a.fragment.cloneNode(true):a.fragment).childNodes}return c.merge(this,a)}else{if(b=s.getElementById(d[2])){if(b.id!==d[2])return T.find(a);this.length=1;this[0]=b}this.context=s;this.selector=a;return this}else if(!b&&/^\w+$/.test(a)){this.selector=a;this.context=s;a=s.getElementsByTagName(a);return c.merge(this, a)}else return!b||b.jquery?(b||T).find(a):c(b).find(a);else if(c.isFunction(a))return T.ready(a);if(a.selector!==w){this.selector=a.selector;this.context=a.context}return c.makeArray(a,this)},selector:"",jquery:"1.4.2",length:0,size:function(){return this.length},toArray:function(){return R.call(this,0)},get:function(a){return a==null?this.toArray():a<0?this.slice(a)[0]:this[a]},pushStack:function(a,b,d){var f=c();c.isArray(a)?ba.apply(f,a):c.merge(f,a);f.prevObject=this;f.context=this.context;if(b=== "find")f.selector=this.selector+(this.selector?" ":"")+d;else if(b)f.selector=this.selector+"."+b+"("+d+")";return f},each:function(a,b){return c.each(this,a,b)},ready:function(a){c.bindReady();if(c.isReady)a.call(s,c);else Q&&Q.push(a);return this},eq:function(a){return a===-1?this.slice(a):this.slice(a,+a+1)},first:function(){return this.eq(0)},last:function(){return this.eq(-1)},slice:function(){return this.pushStack(R.apply(this,arguments),"slice",R.call(arguments).join(","))},map:function(a){return this.pushStack(c.map(this, function(b,d){return a.call(b,d,b)}))},end:function(){return this.prevObject||c(null)},push:ba,sort:[].sort,splice:[].splice};c.fn.init.prototype=c.fn;c.extend=c.fn.extend=function(){var a=arguments[0]||{},b=1,d=arguments.length,f=false,e,j,i,o;if(typeof a==="boolean"){f=a;a=arguments[1]||{};b=2}if(typeof a!=="object"&&!c.isFunction(a))a={};if(d===b){a=this;--b}for(;b
        a"; var e=d.getElementsByTagName("*"),j=d.getElementsByTagName("a")[0];if(!(!e||!e.length||!j)){c.support={leadingWhitespace:d.firstChild.nodeType===3,tbody:!d.getElementsByTagName("tbody").length,htmlSerialize:!!d.getElementsByTagName("link").length,style:/red/.test(j.getAttribute("style")),hrefNormalized:j.getAttribute("href")==="/a",opacity:/^0.55$/.test(j.style.opacity),cssFloat:!!j.style.cssFloat,checkOn:d.getElementsByTagName("input")[0].value==="on",optSelected:s.createElement("select").appendChild(s.createElement("option")).selected, parentNode:d.removeChild(d.appendChild(s.createElement("div"))).parentNode===null,deleteExpando:true,checkClone:false,scriptEval:false,noCloneEvent:true,boxModel:null};b.type="text/javascript";try{b.appendChild(s.createTextNode("window."+f+"=1;"))}catch(i){}a.insertBefore(b,a.firstChild);if(A[f]){c.support.scriptEval=true;delete A[f]}try{delete b.test}catch(o){c.support.deleteExpando=false}a.removeChild(b);if(d.attachEvent&&d.fireEvent){d.attachEvent("onclick",function k(){c.support.noCloneEvent= false;d.detachEvent("onclick",k)});d.cloneNode(true).fireEvent("onclick")}d=s.createElement("div");d.innerHTML="";a=s.createDocumentFragment();a.appendChild(d.firstChild);c.support.checkClone=a.cloneNode(true).cloneNode(true).lastChild.checked;c(function(){var k=s.createElement("div");k.style.width=k.style.paddingLeft="1px";s.body.appendChild(k);c.boxModel=c.support.boxModel=k.offsetWidth===2;s.body.removeChild(k).style.display="none"});a=function(k){var n= s.createElement("div");k="on"+k;var r=k in n;if(!r){n.setAttribute(k,"return;");r=typeof n[k]==="function"}return r};c.support.submitBubbles=a("submit");c.support.changeBubbles=a("change");a=b=d=e=j=null}})();c.props={"for":"htmlFor","class":"className",readonly:"readOnly",maxlength:"maxLength",cellspacing:"cellSpacing",rowspan:"rowSpan",colspan:"colSpan",tabindex:"tabIndex",usemap:"useMap",frameborder:"frameBorder"};var G="jQuery"+J(),Ya=0,za={};c.extend({cache:{},expando:G,noData:{embed:true,object:true, applet:true},data:function(a,b,d){if(!(a.nodeName&&c.noData[a.nodeName.toLowerCase()])){a=a==A?za:a;var f=a[G],e=c.cache;if(!f&&typeof b==="string"&&d===w)return null;f||(f=++Ya);if(typeof b==="object"){a[G]=f;e[f]=c.extend(true,{},b)}else if(!e[f]){a[G]=f;e[f]={}}a=e[f];if(d!==w)a[b]=d;return typeof b==="string"?a[b]:a}},removeData:function(a,b){if(!(a.nodeName&&c.noData[a.nodeName.toLowerCase()])){a=a==A?za:a;var d=a[G],f=c.cache,e=f[d];if(b){if(e){delete e[b];c.isEmptyObject(e)&&c.removeData(a)}}else{if(c.support.deleteExpando)delete a[c.expando]; else a.removeAttribute&&a.removeAttribute(c.expando);delete f[d]}}}});c.fn.extend({data:function(a,b){if(typeof a==="undefined"&&this.length)return c.data(this[0]);else if(typeof a==="object")return this.each(function(){c.data(this,a)});var d=a.split(".");d[1]=d[1]?"."+d[1]:"";if(b===w){var f=this.triggerHandler("getData"+d[1]+"!",[d[0]]);if(f===w&&this.length)f=c.data(this[0],a);return f===w&&d[1]?this.data(d[0]):f}else return this.trigger("setData"+d[1]+"!",[d[0],b]).each(function(){c.data(this, a,b)})},removeData:function(a){return this.each(function(){c.removeData(this,a)})}});c.extend({queue:function(a,b,d){if(a){b=(b||"fx")+"queue";var f=c.data(a,b);if(!d)return f||[];if(!f||c.isArray(d))f=c.data(a,b,c.makeArray(d));else f.push(d);return f}},dequeue:function(a,b){b=b||"fx";var d=c.queue(a,b),f=d.shift();if(f==="inprogress")f=d.shift();if(f){b==="fx"&&d.unshift("inprogress");f.call(a,function(){c.dequeue(a,b)})}}});c.fn.extend({queue:function(a,b){if(typeof a!=="string"){b=a;a="fx"}if(b=== w)return c.queue(this[0],a);return this.each(function(){var d=c.queue(this,a,b);a==="fx"&&d[0]!=="inprogress"&&c.dequeue(this,a)})},dequeue:function(a){return this.each(function(){c.dequeue(this,a)})},delay:function(a,b){a=c.fx?c.fx.speeds[a]||a:a;b=b||"fx";return this.queue(b,function(){var d=this;setTimeout(function(){c.dequeue(d,b)},a)})},clearQueue:function(a){return this.queue(a||"fx",[])}});var Aa=/[\n\t]/g,ca=/\s+/,Za=/\r/g,$a=/href|src|style/,ab=/(button|input)/i,bb=/(button|input|object|select|textarea)/i, cb=/^(a|area)$/i,Ba=/radio|checkbox/;c.fn.extend({attr:function(a,b){return X(this,a,b,true,c.attr)},removeAttr:function(a){return this.each(function(){c.attr(this,a,"");this.nodeType===1&&this.removeAttribute(a)})},addClass:function(a){if(c.isFunction(a))return this.each(function(n){var r=c(this);r.addClass(a.call(this,n,r.attr("class")))});if(a&&typeof a==="string")for(var b=(a||"").split(ca),d=0,f=this.length;d-1)return true;return false},val:function(a){if(a===w){var b=this[0];if(b){if(c.nodeName(b,"option"))return(b.attributes.value||{}).specified?b.value:b.text;if(c.nodeName(b,"select")){var d=b.selectedIndex,f=[],e=b.options;b=b.type==="select-one";if(d<0)return null;var j=b?d:0;for(d=b?d+1:e.length;j=0;else if(c.nodeName(this,"select")){var u=c.makeArray(r);c("option",this).each(function(){this.selected= c.inArray(c(this).val(),u)>=0});if(!u.length)this.selectedIndex=-1}else this.value=r}})}});c.extend({attrFn:{val:true,css:true,html:true,text:true,data:true,width:true,height:true,offset:true},attr:function(a,b,d,f){if(!a||a.nodeType===3||a.nodeType===8)return w;if(f&&b in c.attrFn)return c(a)[b](d);f=a.nodeType!==1||!c.isXMLDoc(a);var e=d!==w;b=f&&c.props[b]||b;if(a.nodeType===1){var j=$a.test(b);if(b in a&&f&&!j){if(e){b==="type"&&ab.test(a.nodeName)&&a.parentNode&&c.error("type property can't be changed"); a[b]=d}if(c.nodeName(a,"form")&&a.getAttributeNode(b))return a.getAttributeNode(b).nodeValue;if(b==="tabIndex")return(b=a.getAttributeNode("tabIndex"))&&b.specified?b.value:bb.test(a.nodeName)||cb.test(a.nodeName)&&a.href?0:w;return a[b]}if(!c.support.style&&f&&b==="style"){if(e)a.style.cssText=""+d;return a.style.cssText}e&&a.setAttribute(b,""+d);a=!c.support.hrefNormalized&&f&&j?a.getAttribute(b,2):a.getAttribute(b);return a===null?w:a}return c.style(a,b,d)}});var O=/\.(.*)$/,db=function(a){return a.replace(/[^\w\s\.\|`]/g, function(b){return"\\"+b})};c.event={add:function(a,b,d,f){if(!(a.nodeType===3||a.nodeType===8)){if(a.setInterval&&a!==A&&!a.frameElement)a=A;var e,j;if(d.handler){e=d;d=e.handler}if(!d.guid)d.guid=c.guid++;if(j=c.data(a)){var i=j.events=j.events||{},o=j.handle;if(!o)j.handle=o=function(){return typeof c!=="undefined"&&!c.event.triggered?c.event.handle.apply(o.elem,arguments):w};o.elem=a;b=b.split(" ");for(var k,n=0,r;k=b[n++];){j=e?c.extend({},e):{handler:d,data:f};if(k.indexOf(".")>-1){r=k.split("."); k=r.shift();j.namespace=r.slice(0).sort().join(".")}else{r=[];j.namespace=""}j.type=k;j.guid=d.guid;var u=i[k],z=c.event.special[k]||{};if(!u){u=i[k]=[];if(!z.setup||z.setup.call(a,f,r,o)===false)if(a.addEventListener)a.addEventListener(k,o,false);else a.attachEvent&&a.attachEvent("on"+k,o)}if(z.add){z.add.call(a,j);if(!j.handler.guid)j.handler.guid=d.guid}u.push(j);c.event.global[k]=true}a=null}}},global:{},remove:function(a,b,d,f){if(!(a.nodeType===3||a.nodeType===8)){var e,j=0,i,o,k,n,r,u,z=c.data(a), C=z&&z.events;if(z&&C){if(b&&b.type){d=b.handler;b=b.type}if(!b||typeof b==="string"&&b.charAt(0)==="."){b=b||"";for(e in C)c.event.remove(a,e+b)}else{for(b=b.split(" ");e=b[j++];){n=e;i=e.indexOf(".")<0;o=[];if(!i){o=e.split(".");e=o.shift();k=new RegExp("(^|\\.)"+c.map(o.slice(0).sort(),db).join("\\.(?:.*\\.)?")+"(\\.|$)")}if(r=C[e])if(d){n=c.event.special[e]||{};for(B=f||0;B=0){a.type= e=e.slice(0,-1);a.exclusive=true}if(!d){a.stopPropagation();c.event.global[e]&&c.each(c.cache,function(){this.events&&this.events[e]&&c.event.trigger(a,b,this.handle.elem)})}if(!d||d.nodeType===3||d.nodeType===8)return w;a.result=w;a.target=d;b=c.makeArray(b);b.unshift(a)}a.currentTarget=d;(f=c.data(d,"handle"))&&f.apply(d,b);f=d.parentNode||d.ownerDocument;try{if(!(d&&d.nodeName&&c.noData[d.nodeName.toLowerCase()]))if(d["on"+e]&&d["on"+e].apply(d,b)===false)a.result=false}catch(j){}if(!a.isPropagationStopped()&& f)c.event.trigger(a,b,f,true);else if(!a.isDefaultPrevented()){f=a.target;var i,o=c.nodeName(f,"a")&&e==="click",k=c.event.special[e]||{};if((!k._default||k._default.call(d,a)===false)&&!o&&!(f&&f.nodeName&&c.noData[f.nodeName.toLowerCase()])){try{if(f[e]){if(i=f["on"+e])f["on"+e]=null;c.event.triggered=true;f[e]()}}catch(n){}if(i)f["on"+e]=i;c.event.triggered=false}}},handle:function(a){var b,d,f,e;a=arguments[0]=c.event.fix(a||A.event);a.currentTarget=this;b=a.type.indexOf(".")<0&&!a.exclusive; if(!b){d=a.type.split(".");a.type=d.shift();f=new RegExp("(^|\\.)"+d.slice(0).sort().join("\\.(?:.*\\.)?")+"(\\.|$)")}e=c.data(this,"events");d=e[a.type];if(e&&d){d=d.slice(0);e=0;for(var j=d.length;e-1?c.map(a.options,function(f){return f.selected}).join("-"):"";else if(a.nodeName.toLowerCase()==="select")d=a.selectedIndex;return d},fa=function(a,b){var d=a.target,f,e;if(!(!da.test(d.nodeName)||d.readOnly)){f=c.data(d,"_change_data");e=Fa(d);if(a.type!=="focusout"||d.type!=="radio")c.data(d,"_change_data", e);if(!(f===w||e===f))if(f!=null||e){a.type="change";return c.event.trigger(a,b,d)}}};c.event.special.change={filters:{focusout:fa,click:function(a){var b=a.target,d=b.type;if(d==="radio"||d==="checkbox"||b.nodeName.toLowerCase()==="select")return fa.call(this,a)},keydown:function(a){var b=a.target,d=b.type;if(a.keyCode===13&&b.nodeName.toLowerCase()!=="textarea"||a.keyCode===32&&(d==="checkbox"||d==="radio")||d==="select-multiple")return fa.call(this,a)},beforeactivate:function(a){a=a.target;c.data(a, "_change_data",Fa(a))}},setup:function(){if(this.type==="file")return false;for(var a in ea)c.event.add(this,a+".specialChange",ea[a]);return da.test(this.nodeName)},teardown:function(){c.event.remove(this,".specialChange");return da.test(this.nodeName)}};ea=c.event.special.change.filters}s.addEventListener&&c.each({focus:"focusin",blur:"focusout"},function(a,b){function d(f){f=c.event.fix(f);f.type=b;return c.event.handle.call(this,f)}c.event.special[b]={setup:function(){this.addEventListener(a, d,true)},teardown:function(){this.removeEventListener(a,d,true)}}});c.each(["bind","one"],function(a,b){c.fn[b]=function(d,f,e){if(typeof d==="object"){for(var j in d)this[b](j,f,d[j],e);return this}if(c.isFunction(f)){e=f;f=w}var i=b==="one"?c.proxy(e,function(k){c(this).unbind(k,i);return e.apply(this,arguments)}):e;if(d==="unload"&&b!=="one")this.one(d,f,e);else{j=0;for(var o=this.length;j0){y=t;break}}t=t[g]}m[q]=y}}}var f=/((?:\((?:\([^()]+\)|[^()]+)+\)|\[(?:\[[^[\]]*\]|['"][^'"]*['"]|[^[\]'"]+)+\]|\\.|[^ >+~,(\[\\]+)+|[>+~])(\s*,\s*)?((?:.|\r|\n)*)/g, e=0,j=Object.prototype.toString,i=false,o=true;[0,0].sort(function(){o=false;return 0});var k=function(g,h,l,m){l=l||[];var q=h=h||s;if(h.nodeType!==1&&h.nodeType!==9)return[];if(!g||typeof g!=="string")return l;for(var p=[],v,t,y,S,H=true,M=x(h),I=g;(f.exec(""),v=f.exec(I))!==null;){I=v[3];p.push(v[1]);if(v[2]){S=v[3];break}}if(p.length>1&&r.exec(g))if(p.length===2&&n.relative[p[0]])t=ga(p[0]+p[1],h);else for(t=n.relative[p[0]]?[h]:k(p.shift(),h);p.length;){g=p.shift();if(n.relative[g])g+=p.shift(); t=ga(g,t)}else{if(!m&&p.length>1&&h.nodeType===9&&!M&&n.match.ID.test(p[0])&&!n.match.ID.test(p[p.length-1])){v=k.find(p.shift(),h,M);h=v.expr?k.filter(v.expr,v.set)[0]:v.set[0]}if(h){v=m?{expr:p.pop(),set:z(m)}:k.find(p.pop(),p.length===1&&(p[0]==="~"||p[0]==="+")&&h.parentNode?h.parentNode:h,M);t=v.expr?k.filter(v.expr,v.set):v.set;if(p.length>0)y=z(t);else H=false;for(;p.length;){var D=p.pop();v=D;if(n.relative[D])v=p.pop();else D="";if(v==null)v=h;n.relative[D](y,v,M)}}else y=[]}y||(y=t);y||k.error(D|| g);if(j.call(y)==="[object Array]")if(H)if(h&&h.nodeType===1)for(g=0;y[g]!=null;g++){if(y[g]&&(y[g]===true||y[g].nodeType===1&&E(h,y[g])))l.push(t[g])}else for(g=0;y[g]!=null;g++)y[g]&&y[g].nodeType===1&&l.push(t[g]);else l.push.apply(l,y);else z(y,l);if(S){k(S,q,l,m);k.uniqueSort(l)}return l};k.uniqueSort=function(g){if(B){i=o;g.sort(B);if(i)for(var h=1;h":function(g,h){var l=typeof h==="string";if(l&&!/\W/.test(h)){h=h.toLowerCase();for(var m=0,q=g.length;m=0))l||m.push(v);else if(l)h[p]=false;return false},ID:function(g){return g[1].replace(/\\/g,"")},TAG:function(g){return g[1].toLowerCase()}, CHILD:function(g){if(g[1]==="nth"){var h=/(-?)(\d*)n((?:\+|-)?\d*)/.exec(g[2]==="even"&&"2n"||g[2]==="odd"&&"2n+1"||!/\D/.test(g[2])&&"0n+"+g[2]||g[2]);g[2]=h[1]+(h[2]||1)-0;g[3]=h[3]-0}g[0]=e++;return g},ATTR:function(g,h,l,m,q,p){h=g[1].replace(/\\/g,"");if(!p&&n.attrMap[h])g[1]=n.attrMap[h];if(g[2]==="~=")g[4]=" "+g[4]+" ";return g},PSEUDO:function(g,h,l,m,q){if(g[1]==="not")if((f.exec(g[3])||"").length>1||/^\w/.test(g[3]))g[3]=k(g[3],null,null,h);else{g=k.filter(g[3],h,l,true^q);l||m.push.apply(m, g);return false}else if(n.match.POS.test(g[0])||n.match.CHILD.test(g[0]))return true;return g},POS:function(g){g.unshift(true);return g}},filters:{enabled:function(g){return g.disabled===false&&g.type!=="hidden"},disabled:function(g){return g.disabled===true},checked:function(g){return g.checked===true},selected:function(g){return g.selected===true},parent:function(g){return!!g.firstChild},empty:function(g){return!g.firstChild},has:function(g,h,l){return!!k(l[3],g).length},header:function(g){return/h\d/i.test(g.nodeName)}, text:function(g){return"text"===g.type},radio:function(g){return"radio"===g.type},checkbox:function(g){return"checkbox"===g.type},file:function(g){return"file"===g.type},password:function(g){return"password"===g.type},submit:function(g){return"submit"===g.type},image:function(g){return"image"===g.type},reset:function(g){return"reset"===g.type},button:function(g){return"button"===g.type||g.nodeName.toLowerCase()==="button"},input:function(g){return/input|select|textarea|button/i.test(g.nodeName)}}, setFilters:{first:function(g,h){return h===0},last:function(g,h,l,m){return h===m.length-1},even:function(g,h){return h%2===0},odd:function(g,h){return h%2===1},lt:function(g,h,l){return hl[3]-0},nth:function(g,h,l){return l[3]-0===h},eq:function(g,h,l){return l[3]-0===h}},filter:{PSEUDO:function(g,h,l,m){var q=h[1],p=n.filters[q];if(p)return p(g,l,h,m);else if(q==="contains")return(g.textContent||g.innerText||a([g])||"").indexOf(h[3])>=0;else if(q==="not"){h= h[3];l=0;for(m=h.length;l=0}},ID:function(g,h){return g.nodeType===1&&g.getAttribute("id")===h},TAG:function(g,h){return h==="*"&&g.nodeType===1||g.nodeName.toLowerCase()===h},CLASS:function(g,h){return(" "+(g.className||g.getAttribute("class"))+" ").indexOf(h)>-1},ATTR:function(g,h){var l=h[1];g=n.attrHandle[l]?n.attrHandle[l](g):g[l]!=null?g[l]:g.getAttribute(l);l=g+"";var m=h[2];h=h[4];return g==null?m==="!=":m=== "="?l===h:m==="*="?l.indexOf(h)>=0:m==="~="?(" "+l+" ").indexOf(h)>=0:!h?l&&g!==false:m==="!="?l!==h:m==="^="?l.indexOf(h)===0:m==="$="?l.substr(l.length-h.length)===h:m==="|="?l===h||l.substr(0,h.length+1)===h+"-":false},POS:function(g,h,l,m){var q=n.setFilters[h[2]];if(q)return q(g,l,h,m)}}},r=n.match.POS;for(var u in n.match){n.match[u]=new RegExp(n.match[u].source+/(?![^\[]*\])(?![^\(]*\))/.source);n.leftMatch[u]=new RegExp(/(^(?:.|\r|\n)*?)/.source+n.match[u].source.replace(/\\(\d+)/g,function(g, h){return"\\"+(h-0+1)}))}var z=function(g,h){g=Array.prototype.slice.call(g,0);if(h){h.push.apply(h,g);return h}return g};try{Array.prototype.slice.call(s.documentElement.childNodes,0)}catch(C){z=function(g,h){h=h||[];if(j.call(g)==="[object Array]")Array.prototype.push.apply(h,g);else if(typeof g.length==="number")for(var l=0,m=g.length;l";var l=s.documentElement;l.insertBefore(g,l.firstChild);if(s.getElementById(h)){n.find.ID=function(m,q,p){if(typeof q.getElementById!=="undefined"&&!p)return(q=q.getElementById(m[1]))?q.id===m[1]||typeof q.getAttributeNode!=="undefined"&& q.getAttributeNode("id").nodeValue===m[1]?[q]:w:[]};n.filter.ID=function(m,q){var p=typeof m.getAttributeNode!=="undefined"&&m.getAttributeNode("id");return m.nodeType===1&&p&&p.nodeValue===q}}l.removeChild(g);l=g=null})();(function(){var g=s.createElement("div");g.appendChild(s.createComment(""));if(g.getElementsByTagName("*").length>0)n.find.TAG=function(h,l){l=l.getElementsByTagName(h[1]);if(h[1]==="*"){h=[];for(var m=0;l[m];m++)l[m].nodeType===1&&h.push(l[m]);l=h}return l};g.innerHTML=""; if(g.firstChild&&typeof g.firstChild.getAttribute!=="undefined"&&g.firstChild.getAttribute("href")!=="#")n.attrHandle.href=function(h){return h.getAttribute("href",2)};g=null})();s.querySelectorAll&&function(){var g=k,h=s.createElement("div");h.innerHTML="

        ";if(!(h.querySelectorAll&&h.querySelectorAll(".TEST").length===0)){k=function(m,q,p,v){q=q||s;if(!v&&q.nodeType===9&&!x(q))try{return z(q.querySelectorAll(m),p)}catch(t){}return g(m,q,p,v)};for(var l in g)k[l]=g[l];h=null}}(); (function(){var g=s.createElement("div");g.innerHTML="
        ";if(!(!g.getElementsByClassName||g.getElementsByClassName("e").length===0)){g.lastChild.className="e";if(g.getElementsByClassName("e").length!==1){n.order.splice(1,0,"CLASS");n.find.CLASS=function(h,l,m){if(typeof l.getElementsByClassName!=="undefined"&&!m)return l.getElementsByClassName(h[1])};g=null}}})();var E=s.compareDocumentPosition?function(g,h){return!!(g.compareDocumentPosition(h)&16)}: function(g,h){return g!==h&&(g.contains?g.contains(h):true)},x=function(g){return(g=(g?g.ownerDocument||g:0).documentElement)?g.nodeName!=="HTML":false},ga=function(g,h){var l=[],m="",q;for(h=h.nodeType?[h]:h;q=n.match.PSEUDO.exec(g);){m+=q[0];g=g.replace(n.match.PSEUDO,"")}g=n.relative[g]?g+"*":g;q=0;for(var p=h.length;q=0===d})};c.fn.extend({find:function(a){for(var b=this.pushStack("","find",a),d=0,f=0,e=this.length;f0)for(var j=d;j0},closest:function(a,b){if(c.isArray(a)){var d=[],f=this[0],e,j= {},i;if(f&&a.length){e=0;for(var o=a.length;e-1:c(f).is(e)){d.push({selector:i,elem:f});delete j[i]}}f=f.parentNode}}return d}var k=c.expr.match.POS.test(a)?c(a,b||this.context):null;return this.map(function(n,r){for(;r&&r.ownerDocument&&r!==b;){if(k?k.index(r)>-1:c(r).is(a))return r;r=r.parentNode}return null})},index:function(a){if(!a||typeof a=== "string")return c.inArray(this[0],a?c(a):this.parent().children());return c.inArray(a.jquery?a[0]:a,this)},add:function(a,b){a=typeof a==="string"?c(a,b||this.context):c.makeArray(a);b=c.merge(this.get(),a);return this.pushStack(qa(a[0])||qa(b[0])?b:c.unique(b))},andSelf:function(){return this.add(this.prevObject)}});c.each({parent:function(a){return(a=a.parentNode)&&a.nodeType!==11?a:null},parents:function(a){return c.dir(a,"parentNode")},parentsUntil:function(a,b,d){return c.dir(a,"parentNode", d)},next:function(a){return c.nth(a,2,"nextSibling")},prev:function(a){return c.nth(a,2,"previousSibling")},nextAll:function(a){return c.dir(a,"nextSibling")},prevAll:function(a){return c.dir(a,"previousSibling")},nextUntil:function(a,b,d){return c.dir(a,"nextSibling",d)},prevUntil:function(a,b,d){return c.dir(a,"previousSibling",d)},siblings:function(a){return c.sibling(a.parentNode.firstChild,a)},children:function(a){return c.sibling(a.firstChild)},contents:function(a){return c.nodeName(a,"iframe")? a.contentDocument||a.contentWindow.document:c.makeArray(a.childNodes)}},function(a,b){c.fn[a]=function(d,f){var e=c.map(this,b,d);eb.test(a)||(f=d);if(f&&typeof f==="string")e=c.filter(f,e);e=this.length>1?c.unique(e):e;if((this.length>1||gb.test(f))&&fb.test(a))e=e.reverse();return this.pushStack(e,a,R.call(arguments).join(","))}});c.extend({filter:function(a,b,d){if(d)a=":not("+a+")";return c.find.matches(a,b)},dir:function(a,b,d){var f=[];for(a=a[b];a&&a.nodeType!==9&&(d===w||a.nodeType!==1||!c(a).is(d));){a.nodeType=== 1&&f.push(a);a=a[b]}return f},nth:function(a,b,d){b=b||1;for(var f=0;a;a=a[d])if(a.nodeType===1&&++f===b)break;return a},sibling:function(a,b){for(var d=[];a;a=a.nextSibling)a.nodeType===1&&a!==b&&d.push(a);return d}});var Ja=/ jQuery\d+="(?:\d+|null)"/g,V=/^\s+/,Ka=/(<([\w:]+)[^>]*?)\/>/g,hb=/^(?:area|br|col|embed|hr|img|input|link|meta|param)$/i,La=/<([\w:]+)/,ib=/"},F={option:[1,""],legend:[1,"
        ","
        "],thead:[1,"","
        "],tr:[2,"","
        "],td:[3,"","
        "],col:[2,"","
        "],area:[1,"",""],_default:[0,"",""]};F.optgroup=F.option;F.tbody=F.tfoot=F.colgroup=F.caption=F.thead;F.th=F.td;if(!c.support.htmlSerialize)F._default=[1,"div
        ","
        "];c.fn.extend({text:function(a){if(c.isFunction(a))return this.each(function(b){var d= c(this);d.text(a.call(this,b,d.text()))});if(typeof a!=="object"&&a!==w)return this.empty().append((this[0]&&this[0].ownerDocument||s).createTextNode(a));return c.text(this)},wrapAll:function(a){if(c.isFunction(a))return this.each(function(d){c(this).wrapAll(a.call(this,d))});if(this[0]){var b=c(a,this[0].ownerDocument).eq(0).clone(true);this[0].parentNode&&b.insertBefore(this[0]);b.map(function(){for(var d=this;d.firstChild&&d.firstChild.nodeType===1;)d=d.firstChild;return d}).append(this)}return this}, wrapInner:function(a){if(c.isFunction(a))return this.each(function(b){c(this).wrapInner(a.call(this,b))});return this.each(function(){var b=c(this),d=b.contents();d.length?d.wrapAll(a):b.append(a)})},wrap:function(a){return this.each(function(){c(this).wrapAll(a)})},unwrap:function(){return this.parent().each(function(){c.nodeName(this,"body")||c(this).replaceWith(this.childNodes)}).end()},append:function(){return this.domManip(arguments,true,function(a){this.nodeType===1&&this.appendChild(a)})}, prepend:function(){return this.domManip(arguments,true,function(a){this.nodeType===1&&this.insertBefore(a,this.firstChild)})},before:function(){if(this[0]&&this[0].parentNode)return this.domManip(arguments,false,function(b){this.parentNode.insertBefore(b,this)});else if(arguments.length){var a=c(arguments[0]);a.push.apply(a,this.toArray());return this.pushStack(a,"before",arguments)}},after:function(){if(this[0]&&this[0].parentNode)return this.domManip(arguments,false,function(b){this.parentNode.insertBefore(b, this.nextSibling)});else if(arguments.length){var a=this.pushStack(this,"after",arguments);a.push.apply(a,c(arguments[0]).toArray());return a}},remove:function(a,b){for(var d=0,f;(f=this[d])!=null;d++)if(!a||c.filter(a,[f]).length){if(!b&&f.nodeType===1){c.cleanData(f.getElementsByTagName("*"));c.cleanData([f])}f.parentNode&&f.parentNode.removeChild(f)}return this},empty:function(){for(var a=0,b;(b=this[a])!=null;a++)for(b.nodeType===1&&c.cleanData(b.getElementsByTagName("*"));b.firstChild;)b.removeChild(b.firstChild); return this},clone:function(a){var b=this.map(function(){if(!c.support.noCloneEvent&&!c.isXMLDoc(this)){var d=this.outerHTML,f=this.ownerDocument;if(!d){d=f.createElement("div");d.appendChild(this.cloneNode(true));d=d.innerHTML}return c.clean([d.replace(Ja,"").replace(/=([^="'>\s]+\/)>/g,'="$1">').replace(V,"")],f)[0]}else return this.cloneNode(true)});if(a===true){ra(this,b);ra(this.find("*"),b.find("*"))}return b},html:function(a){if(a===w)return this[0]&&this[0].nodeType===1?this[0].innerHTML.replace(Ja, ""):null;else if(typeof a==="string"&&!ta.test(a)&&(c.support.leadingWhitespace||!V.test(a))&&!F[(La.exec(a)||["",""])[1].toLowerCase()]){a=a.replace(Ka,Ma);try{for(var b=0,d=this.length;b0||e.cacheable||this.length>1?k.cloneNode(true):k)}o.length&&c.each(o,Qa)}return this}});c.fragments={};c.each({appendTo:"append",prependTo:"prepend",insertBefore:"before",insertAfter:"after",replaceAll:"replaceWith"},function(a,b){c.fn[a]=function(d){var f=[];d=c(d);var e=this.length===1&&this[0].parentNode;if(e&&e.nodeType===11&&e.childNodes.length===1&&d.length===1){d[b](this[0]); return this}else{e=0;for(var j=d.length;e0?this.clone(true):this).get();c.fn[b].apply(c(d[e]),i);f=f.concat(i)}return this.pushStack(f,a,d.selector)}}});c.extend({clean:function(a,b,d,f){b=b||s;if(typeof b.createElement==="undefined")b=b.ownerDocument||b[0]&&b[0].ownerDocument||s;for(var e=[],j=0,i;(i=a[j])!=null;j++){if(typeof i==="number")i+="";if(i){if(typeof i==="string"&&!jb.test(i))i=b.createTextNode(i);else if(typeof i==="string"){i=i.replace(Ka,Ma);var o=(La.exec(i)||["", ""])[1].toLowerCase(),k=F[o]||F._default,n=k[0],r=b.createElement("div");for(r.innerHTML=k[1]+i+k[2];n--;)r=r.lastChild;if(!c.support.tbody){n=ib.test(i);o=o==="table"&&!n?r.firstChild&&r.firstChild.childNodes:k[1]===""&&!n?r.childNodes:[];for(k=o.length-1;k>=0;--k)c.nodeName(o[k],"tbody")&&!o[k].childNodes.length&&o[k].parentNode.removeChild(o[k])}!c.support.leadingWhitespace&&V.test(i)&&r.insertBefore(b.createTextNode(V.exec(i)[0]),r.firstChild);i=r.childNodes}if(i.nodeType)e.push(i);else e= c.merge(e,i)}}if(d)for(j=0;e[j];j++)if(f&&c.nodeName(e[j],"script")&&(!e[j].type||e[j].type.toLowerCase()==="text/javascript"))f.push(e[j].parentNode?e[j].parentNode.removeChild(e[j]):e[j]);else{e[j].nodeType===1&&e.splice.apply(e,[j+1,0].concat(c.makeArray(e[j].getElementsByTagName("script"))));d.appendChild(e[j])}return e},cleanData:function(a){for(var b,d,f=c.cache,e=c.event.special,j=c.support.deleteExpando,i=0,o;(o=a[i])!=null;i++)if(d=o[c.expando]){b=f[d];if(b.events)for(var k in b.events)e[k]? c.event.remove(o,k):Ca(o,k,b.handle);if(j)delete o[c.expando];else o.removeAttribute&&o.removeAttribute(c.expando);delete f[d]}}});var kb=/z-?index|font-?weight|opacity|zoom|line-?height/i,Na=/alpha\([^)]*\)/,Oa=/opacity=([^)]*)/,ha=/float/i,ia=/-([a-z])/ig,lb=/([A-Z])/g,mb=/^-?\d+(?:px)?$/i,nb=/^-?\d/,ob={position:"absolute",visibility:"hidden",display:"block"},pb=["Left","Right"],qb=["Top","Bottom"],rb=s.defaultView&&s.defaultView.getComputedStyle,Pa=c.support.cssFloat?"cssFloat":"styleFloat",ja= function(a,b){return b.toUpperCase()};c.fn.css=function(a,b){return X(this,a,b,true,function(d,f,e){if(e===w)return c.curCSS(d,f);if(typeof e==="number"&&!kb.test(f))e+="px";c.style(d,f,e)})};c.extend({style:function(a,b,d){if(!a||a.nodeType===3||a.nodeType===8)return w;if((b==="width"||b==="height")&&parseFloat(d)<0)d=w;var f=a.style||a,e=d!==w;if(!c.support.opacity&&b==="opacity"){if(e){f.zoom=1;b=parseInt(d,10)+""==="NaN"?"":"alpha(opacity="+d*100+")";a=f.filter||c.curCSS(a,"filter")||"";f.filter= Na.test(a)?a.replace(Na,b):b}return f.filter&&f.filter.indexOf("opacity=")>=0?parseFloat(Oa.exec(f.filter)[1])/100+"":""}if(ha.test(b))b=Pa;b=b.replace(ia,ja);if(e)f[b]=d;return f[b]},css:function(a,b,d,f){if(b==="width"||b==="height"){var e,j=b==="width"?pb:qb;function i(){e=b==="width"?a.offsetWidth:a.offsetHeight;f!=="border"&&c.each(j,function(){f||(e-=parseFloat(c.curCSS(a,"padding"+this,true))||0);if(f==="margin")e+=parseFloat(c.curCSS(a,"margin"+this,true))||0;else e-=parseFloat(c.curCSS(a, "border"+this+"Width",true))||0})}a.offsetWidth!==0?i():c.swap(a,ob,i);return Math.max(0,Math.round(e))}return c.curCSS(a,b,d)},curCSS:function(a,b,d){var f,e=a.style;if(!c.support.opacity&&b==="opacity"&&a.currentStyle){f=Oa.test(a.currentStyle.filter||"")?parseFloat(RegExp.$1)/100+"":"";return f===""?"1":f}if(ha.test(b))b=Pa;if(!d&&e&&e[b])f=e[b];else if(rb){if(ha.test(b))b="float";b=b.replace(lb,"-$1").toLowerCase();e=a.ownerDocument.defaultView;if(!e)return null;if(a=e.getComputedStyle(a,null))f= a.getPropertyValue(b);if(b==="opacity"&&f==="")f="1"}else if(a.currentStyle){d=b.replace(ia,ja);f=a.currentStyle[b]||a.currentStyle[d];if(!mb.test(f)&&nb.test(f)){b=e.left;var j=a.runtimeStyle.left;a.runtimeStyle.left=a.currentStyle.left;e.left=d==="fontSize"?"1em":f||0;f=e.pixelLeft+"px";e.left=b;a.runtimeStyle.left=j}}return f},swap:function(a,b,d){var f={};for(var e in b){f[e]=a.style[e];a.style[e]=b[e]}d.call(a);for(e in b)a.style[e]=f[e]}});if(c.expr&&c.expr.filters){c.expr.filters.hidden=function(a){var b= a.offsetWidth,d=a.offsetHeight,f=a.nodeName.toLowerCase()==="tr";return b===0&&d===0&&!f?true:b>0&&d>0&&!f?false:c.curCSS(a,"display")==="none"};c.expr.filters.visible=function(a){return!c.expr.filters.hidden(a)}}var sb=J(),tb=//gi,ub=/select|textarea/i,vb=/color|date|datetime|email|hidden|month|number|password|range|search|tel|text|time|url|week/i,N=/=\?(&|$)/,ka=/\?/,wb=/(\?|&)_=.*?(&|$)/,xb=/^(\w+:)?\/\/([^\/?#]+)/,yb=/%20/g,zb=c.fn.load;c.fn.extend({load:function(a,b,d){if(typeof a!== "string")return zb.call(this,a);else if(!this.length)return this;var f=a.indexOf(" ");if(f>=0){var e=a.slice(f,a.length);a=a.slice(0,f)}f="GET";if(b)if(c.isFunction(b)){d=b;b=null}else if(typeof b==="object"){b=c.param(b,c.ajaxSettings.traditional);f="POST"}var j=this;c.ajax({url:a,type:f,dataType:"html",data:b,complete:function(i,o){if(o==="success"||o==="notmodified")j.html(e?c("
        ").append(i.responseText.replace(tb,"")).find(e):i.responseText);d&&j.each(d,[i.responseText,o,i])}});return this}, serialize:function(){return c.param(this.serializeArray())},serializeArray:function(){return this.map(function(){return this.elements?c.makeArray(this.elements):this}).filter(function(){return this.name&&!this.disabled&&(this.checked||ub.test(this.nodeName)||vb.test(this.type))}).map(function(a,b){a=c(this).val();return a==null?null:c.isArray(a)?c.map(a,function(d){return{name:b.name,value:d}}):{name:b.name,value:a}}).get()}});c.each("ajaxStart ajaxStop ajaxComplete ajaxError ajaxSuccess ajaxSend".split(" "), function(a,b){c.fn[b]=function(d){return this.bind(b,d)}});c.extend({get:function(a,b,d,f){if(c.isFunction(b)){f=f||d;d=b;b=null}return c.ajax({type:"GET",url:a,data:b,success:d,dataType:f})},getScript:function(a,b){return c.get(a,null,b,"script")},getJSON:function(a,b,d){return c.get(a,b,d,"json")},post:function(a,b,d,f){if(c.isFunction(b)){f=f||d;d=b;b={}}return c.ajax({type:"POST",url:a,data:b,success:d,dataType:f})},ajaxSetup:function(a){c.extend(c.ajaxSettings,a)},ajaxSettings:{url:location.href, global:true,type:"GET",contentType:"application/x-www-form-urlencoded",processData:true,async:true,xhr:A.XMLHttpRequest&&(A.location.protocol!=="file:"||!A.ActiveXObject)?function(){return new A.XMLHttpRequest}:function(){try{return new A.ActiveXObject("Microsoft.XMLHTTP")}catch(a){}},accepts:{xml:"application/xml, text/xml",html:"text/html",script:"text/javascript, application/javascript",json:"application/json, text/javascript",text:"text/plain",_default:"*/*"}},lastModified:{},etag:{},ajax:function(a){function b(){e.success&& e.success.call(k,o,i,x);e.global&&f("ajaxSuccess",[x,e])}function d(){e.complete&&e.complete.call(k,x,i);e.global&&f("ajaxComplete",[x,e]);e.global&&!--c.active&&c.event.trigger("ajaxStop")}function f(q,p){(e.context?c(e.context):c.event).trigger(q,p)}var e=c.extend(true,{},c.ajaxSettings,a),j,i,o,k=a&&a.context||e,n=e.type.toUpperCase();if(e.data&&e.processData&&typeof e.data!=="string")e.data=c.param(e.data,e.traditional);if(e.dataType==="jsonp"){if(n==="GET")N.test(e.url)||(e.url+=(ka.test(e.url)? "&":"?")+(e.jsonp||"callback")+"=?");else if(!e.data||!N.test(e.data))e.data=(e.data?e.data+"&":"")+(e.jsonp||"callback")+"=?";e.dataType="json"}if(e.dataType==="json"&&(e.data&&N.test(e.data)||N.test(e.url))){j=e.jsonpCallback||"jsonp"+sb++;if(e.data)e.data=(e.data+"").replace(N,"="+j+"$1");e.url=e.url.replace(N,"="+j+"$1");e.dataType="script";A[j]=A[j]||function(q){o=q;b();d();A[j]=w;try{delete A[j]}catch(p){}z&&z.removeChild(C)}}if(e.dataType==="script"&&e.cache===null)e.cache=false;if(e.cache=== false&&n==="GET"){var r=J(),u=e.url.replace(wb,"$1_="+r+"$2");e.url=u+(u===e.url?(ka.test(e.url)?"&":"?")+"_="+r:"")}if(e.data&&n==="GET")e.url+=(ka.test(e.url)?"&":"?")+e.data;e.global&&!c.active++&&c.event.trigger("ajaxStart");r=(r=xb.exec(e.url))&&(r[1]&&r[1]!==location.protocol||r[2]!==location.host);if(e.dataType==="script"&&n==="GET"&&r){var z=s.getElementsByTagName("head")[0]||s.documentElement,C=s.createElement("script");C.src=e.url;if(e.scriptCharset)C.charset=e.scriptCharset;if(!j){var B= false;C.onload=C.onreadystatechange=function(){if(!B&&(!this.readyState||this.readyState==="loaded"||this.readyState==="complete")){B=true;b();d();C.onload=C.onreadystatechange=null;z&&C.parentNode&&z.removeChild(C)}}}z.insertBefore(C,z.firstChild);return w}var E=false,x=e.xhr();if(x){e.username?x.open(n,e.url,e.async,e.username,e.password):x.open(n,e.url,e.async);try{if(e.data||a&&a.contentType)x.setRequestHeader("Content-Type",e.contentType);if(e.ifModified){c.lastModified[e.url]&&x.setRequestHeader("If-Modified-Since", c.lastModified[e.url]);c.etag[e.url]&&x.setRequestHeader("If-None-Match",c.etag[e.url])}r||x.setRequestHeader("X-Requested-With","XMLHttpRequest");x.setRequestHeader("Accept",e.dataType&&e.accepts[e.dataType]?e.accepts[e.dataType]+", */*":e.accepts._default)}catch(ga){}if(e.beforeSend&&e.beforeSend.call(k,x,e)===false){e.global&&!--c.active&&c.event.trigger("ajaxStop");x.abort();return false}e.global&&f("ajaxSend",[x,e]);var g=x.onreadystatechange=function(q){if(!x||x.readyState===0||q==="abort"){E|| d();E=true;if(x)x.onreadystatechange=c.noop}else if(!E&&x&&(x.readyState===4||q==="timeout")){E=true;x.onreadystatechange=c.noop;i=q==="timeout"?"timeout":!c.httpSuccess(x)?"error":e.ifModified&&c.httpNotModified(x,e.url)?"notmodified":"success";var p;if(i==="success")try{o=c.httpData(x,e.dataType,e)}catch(v){i="parsererror";p=v}if(i==="success"||i==="notmodified")j||b();else c.handleError(e,x,i,p);d();q==="timeout"&&x.abort();if(e.async)x=null}};try{var h=x.abort;x.abort=function(){x&&h.call(x); g("abort")}}catch(l){}e.async&&e.timeout>0&&setTimeout(function(){x&&!E&&g("timeout")},e.timeout);try{x.send(n==="POST"||n==="PUT"||n==="DELETE"?e.data:null)}catch(m){c.handleError(e,x,null,m);d()}e.async||g();return x}},handleError:function(a,b,d,f){if(a.error)a.error.call(a.context||a,b,d,f);if(a.global)(a.context?c(a.context):c.event).trigger("ajaxError",[b,a,f])},active:0,httpSuccess:function(a){try{return!a.status&&location.protocol==="file:"||a.status>=200&&a.status<300||a.status===304||a.status=== 1223||a.status===0}catch(b){}return false},httpNotModified:function(a,b){var d=a.getResponseHeader("Last-Modified"),f=a.getResponseHeader("Etag");if(d)c.lastModified[b]=d;if(f)c.etag[b]=f;return a.status===304||a.status===0},httpData:function(a,b,d){var f=a.getResponseHeader("content-type")||"",e=b==="xml"||!b&&f.indexOf("xml")>=0;a=e?a.responseXML:a.responseText;e&&a.documentElement.nodeName==="parsererror"&&c.error("parsererror");if(d&&d.dataFilter)a=d.dataFilter(a,b);if(typeof a==="string")if(b=== "json"||!b&&f.indexOf("json")>=0)a=c.parseJSON(a);else if(b==="script"||!b&&f.indexOf("javascript")>=0)c.globalEval(a);return a},param:function(a,b){function d(i,o){if(c.isArray(o))c.each(o,function(k,n){b||/\[\]$/.test(i)?f(i,n):d(i+"["+(typeof n==="object"||c.isArray(n)?k:"")+"]",n)});else!b&&o!=null&&typeof o==="object"?c.each(o,function(k,n){d(i+"["+k+"]",n)}):f(i,o)}function f(i,o){o=c.isFunction(o)?o():o;e[e.length]=encodeURIComponent(i)+"="+encodeURIComponent(o)}var e=[];if(b===w)b=c.ajaxSettings.traditional; if(c.isArray(a)||a.jquery)c.each(a,function(){f(this.name,this.value)});else for(var j in a)d(j,a[j]);return e.join("&").replace(yb,"+")}});var la={},Ab=/toggle|show|hide/,Bb=/^([+-]=)?([\d+-.]+)(.*)$/,W,va=[["height","marginTop","marginBottom","paddingTop","paddingBottom"],["width","marginLeft","marginRight","paddingLeft","paddingRight"],["opacity"]];c.fn.extend({show:function(a,b){if(a||a===0)return this.animate(K("show",3),a,b);else{a=0;for(b=this.length;a").appendTo("body");f=e.css("display");if(f==="none")f="block";e.remove();la[d]=f}c.data(this[a],"olddisplay",f)}}a=0;for(b=this.length;a=0;f--)if(d[f].elem===this){b&&d[f](true);d.splice(f,1)}});b||this.dequeue();return this}});c.each({slideDown:K("show",1),slideUp:K("hide",1),slideToggle:K("toggle",1),fadeIn:{opacity:"show"},fadeOut:{opacity:"hide"}},function(a,b){c.fn[a]=function(d,f){return this.animate(b,d,f)}});c.extend({speed:function(a,b,d){var f=a&&typeof a==="object"?a:{complete:d||!d&&b||c.isFunction(a)&&a,duration:a,easing:d&&b||b&&!c.isFunction(b)&&b};f.duration=c.fx.off?0:typeof f.duration=== "number"?f.duration:c.fx.speeds[f.duration]||c.fx.speeds._default;f.old=f.complete;f.complete=function(){f.queue!==false&&c(this).dequeue();c.isFunction(f.old)&&f.old.call(this)};return f},easing:{linear:function(a,b,d,f){return d+f*a},swing:function(a,b,d,f){return(-Math.cos(a*Math.PI)/2+0.5)*f+d}},timers:[],fx:function(a,b,d){this.options=b;this.elem=a;this.prop=d;if(!b.orig)b.orig={}}});c.fx.prototype={update:function(){this.options.step&&this.options.step.call(this.elem,this.now,this);(c.fx.step[this.prop]|| c.fx.step._default)(this);if((this.prop==="height"||this.prop==="width")&&this.elem.style)this.elem.style.display="block"},cur:function(a){if(this.elem[this.prop]!=null&&(!this.elem.style||this.elem.style[this.prop]==null))return this.elem[this.prop];return(a=parseFloat(c.css(this.elem,this.prop,a)))&&a>-10000?a:parseFloat(c.curCSS(this.elem,this.prop))||0},custom:function(a,b,d){function f(j){return e.step(j)}this.startTime=J();this.start=a;this.end=b;this.unit=d||this.unit||"px";this.now=this.start; this.pos=this.state=0;var e=this;f.elem=this.elem;if(f()&&c.timers.push(f)&&!W)W=setInterval(c.fx.tick,13)},show:function(){this.options.orig[this.prop]=c.style(this.elem,this.prop);this.options.show=true;this.custom(this.prop==="width"||this.prop==="height"?1:0,this.cur());c(this.elem).show()},hide:function(){this.options.orig[this.prop]=c.style(this.elem,this.prop);this.options.hide=true;this.custom(this.cur(),0)},step:function(a){var b=J(),d=true;if(a||b>=this.options.duration+this.startTime){this.now= this.end;this.pos=this.state=1;this.update();this.options.curAnim[this.prop]=true;for(var f in this.options.curAnim)if(this.options.curAnim[f]!==true)d=false;if(d){if(this.options.display!=null){this.elem.style.overflow=this.options.overflow;a=c.data(this.elem,"olddisplay");this.elem.style.display=a?a:this.options.display;if(c.css(this.elem,"display")==="none")this.elem.style.display="block"}this.options.hide&&c(this.elem).hide();if(this.options.hide||this.options.show)for(var e in this.options.curAnim)c.style(this.elem, e,this.options.orig[e]);this.options.complete.call(this.elem)}return false}else{e=b-this.startTime;this.state=e/this.options.duration;a=this.options.easing||(c.easing.swing?"swing":"linear");this.pos=c.easing[this.options.specialEasing&&this.options.specialEasing[this.prop]||a](this.state,e,0,1,this.options.duration);this.now=this.start+(this.end-this.start)*this.pos;this.update()}return true}};c.extend(c.fx,{tick:function(){for(var a=c.timers,b=0;b
        "; a.insertBefore(b,a.firstChild);d=b.firstChild;f=d.firstChild;e=d.nextSibling.firstChild.firstChild;this.doesNotAddBorder=f.offsetTop!==5;this.doesAddBorderForTableAndCells=e.offsetTop===5;f.style.position="fixed";f.style.top="20px";this.supportsFixedPosition=f.offsetTop===20||f.offsetTop===15;f.style.position=f.style.top="";d.style.overflow="hidden";d.style.position="relative";this.subtractsBorderForOverflowNotVisible=f.offsetTop===-5;this.doesNotIncludeMarginInBodyOffset=a.offsetTop!==j;a.removeChild(b); c.offset.initialize=c.noop},bodyOffset:function(a){var b=a.offsetTop,d=a.offsetLeft;c.offset.initialize();if(c.offset.doesNotIncludeMarginInBodyOffset){b+=parseFloat(c.curCSS(a,"marginTop",true))||0;d+=parseFloat(c.curCSS(a,"marginLeft",true))||0}return{top:b,left:d}},setOffset:function(a,b,d){if(/static/.test(c.curCSS(a,"position")))a.style.position="relative";var f=c(a),e=f.offset(),j=parseInt(c.curCSS(a,"top",true),10)||0,i=parseInt(c.curCSS(a,"left",true),10)||0;if(c.isFunction(b))b=b.call(a, d,e);d={top:b.top-e.top+j,left:b.left-e.left+i};"using"in b?b.using.call(a,d):f.css(d)}};c.fn.extend({position:function(){if(!this[0])return null;var a=this[0],b=this.offsetParent(),d=this.offset(),f=/^body|html$/i.test(b[0].nodeName)?{top:0,left:0}:b.offset();d.top-=parseFloat(c.curCSS(a,"marginTop",true))||0;d.left-=parseFloat(c.curCSS(a,"marginLeft",true))||0;f.top+=parseFloat(c.curCSS(b[0],"borderTopWidth",true))||0;f.left+=parseFloat(c.curCSS(b[0],"borderLeftWidth",true))||0;return{top:d.top- f.top,left:d.left-f.left}},offsetParent:function(){return this.map(function(){for(var a=this.offsetParent||s.body;a&&!/^body|html$/i.test(a.nodeName)&&c.css(a,"position")==="static";)a=a.offsetParent;return a})}});c.each(["Left","Top"],function(a,b){var d="scroll"+b;c.fn[d]=function(f){var e=this[0],j;if(!e)return null;if(f!==w)return this.each(function(){if(j=wa(this))j.scrollTo(!a?f:c(j).scrollLeft(),a?f:c(j).scrollTop());else this[d]=f});else return(j=wa(e))?"pageXOffset"in j?j[a?"pageYOffset": "pageXOffset"]:c.support.boxModel&&j.document.documentElement[d]||j.document.body[d]:e[d]}});c.each(["Height","Width"],function(a,b){var d=b.toLowerCase();c.fn["inner"+b]=function(){return this[0]?c.css(this[0],d,false,"padding"):null};c.fn["outer"+b]=function(f){return this[0]?c.css(this[0],d,false,f?"margin":"border"):null};c.fn[d]=function(f){var e=this[0];if(!e)return f==null?null:this;if(c.isFunction(f))return this.each(function(j){var i=c(this);i[d](f.call(this,j,i[d]()))});return"scrollTo"in e&&e.document?e.document.compatMode==="CSS1Compat"&&e.document.documentElement["client"+b]||e.document.body["client"+b]:e.nodeType===9?Math.max(e.documentElement["client"+b],e.body["scroll"+b],e.documentElement["scroll"+b],e.body["offset"+b],e.documentElement["offset"+b]):f===w?c.css(e,d):this.css(d,typeof f==="string"?f:f+"px")}});A.jQuery=A.$=c})(window); apache-couchdb-1.6.0/share/doc/build/html/_static/minus.png0000644000175000001440000000030711644410761023530 0ustar00djcusers00000000000000‰PNG  IHDR &Īąq pHYs  šœtIME× <®8åtEXtCommentöĢ–æRIDATÓc= 0 && !jQuery(node.parentNode).hasClass(className)) { var span = document.createElement("span"); span.className = className; span.appendChild(document.createTextNode(val.substr(pos, text.length))); node.parentNode.insertBefore(span, node.parentNode.insertBefore( document.createTextNode(val.substr(pos + text.length)), node.nextSibling)); node.nodeValue = val.substr(0, pos); } } else if (!jQuery(node).is("button, select, textarea")) { jQuery.each(node.childNodes, function() { highlight(this); }); } } return this.each(function() { highlight(this); }); }; /** * Small JavaScript module for the documentation. */ var Documentation = { init : function() { this.fixFirefoxAnchorBug(); this.highlightSearchWords(); this.initIndexTable(); }, /** * i18n support */ TRANSLATIONS : {}, PLURAL_EXPR : function(n) { return n == 1 ? 0 : 1; }, LOCALE : 'unknown', // gettext and ngettext don't access this so that the functions // can safely bound to a different name (_ = Documentation.gettext) gettext : function(string) { var translated = Documentation.TRANSLATIONS[string]; if (typeof translated == 'undefined') return string; return (typeof translated == 'string') ? translated : translated[0]; }, ngettext : function(singular, plural, n) { var translated = Documentation.TRANSLATIONS[singular]; if (typeof translated == 'undefined') return (n == 1) ? singular : plural; return translated[Documentation.PLURALEXPR(n)]; }, addTranslations : function(catalog) { for (var key in catalog.messages) this.TRANSLATIONS[key] = catalog.messages[key]; this.PLURAL_EXPR = new Function('n', 'return +(' + catalog.plural_expr + ')'); this.LOCALE = catalog.locale; }, /** * add context elements like header anchor links */ addContextElements : function() { $('div[id] > :header:first').each(function() { $('\u00B6'). attr('href', '#' + this.id). attr('title', _('Permalink to this headline')). appendTo(this); }); $('dt[id]').each(function() { $('\u00B6'). attr('href', '#' + this.id). attr('title', _('Permalink to this definition')). appendTo(this); }); }, /** * workaround a firefox stupidity */ fixFirefoxAnchorBug : function() { if (document.location.hash && $.browser.mozilla) window.setTimeout(function() { document.location.href += ''; }, 10); }, /** * highlight the search words provided in the url in the text */ highlightSearchWords : function() { var params = $.getQueryParameters(); var terms = (params.highlight) ? params.highlight[0].split(/\s+/) : []; if (terms.length) { var body = $('div.body'); window.setTimeout(function() { $.each(terms, function() { body.highlightText(this.toLowerCase(), 'highlighted'); }); }, 10); $('') .appendTo($('#searchbox')); } }, /** * init the domain index toggle buttons */ initIndexTable : function() { var togglers = $('img.toggler').click(function() { var src = $(this).attr('src'); var idnum = $(this).attr('id').substr(7); $('tr.cg-' + idnum).toggle(); if (src.substr(-9) == 'minus.png') $(this).attr('src', src.substr(0, src.length-9) + 'plus.png'); else $(this).attr('src', src.substr(0, src.length-8) + 'minus.png'); }).css('display', ''); if (DOCUMENTATION_OPTIONS.COLLAPSE_INDEX) { togglers.click(); } }, /** * helper function to hide the search marks again */ hideSearchWords : function() { $('#searchbox .highlight-link').fadeOut(300); $('span.highlighted').removeClass('highlighted'); }, /** * make the url absolute */ makeURL : function(relativeURL) { return DOCUMENTATION_OPTIONS.URL_ROOT + '/' + relativeURL; }, /** * get the current relative url */ getCurrentURL : function() { var path = document.location.pathname; var parts = path.split(/\//); $.each(DOCUMENTATION_OPTIONS.URL_ROOT.split(/\//), function() { if (this == '..') parts.pop(); }); var url = parts.join('/'); return path.substring(url.lastIndexOf('/') + 1, path.length - 1); } }; // quick alias for translations _ = Documentation.gettext; $(document).ready(function() { Documentation.init(); }); apache-couchdb-1.6.0/share/doc/build/html/_static/up-pressed.png0000644000175000001440000000056411644410761024471 0ustar00djcusers00000000000000‰PNG  IHDRó’asRGB®ĪébKGDłC» pHYs × ×B(›xtIMEŚ ,ˆ±ZeōIDAT8ĖĶ“æjAĘ—»*’W„KkåŲŁ-,ÓŁBņy‘@Ņ- ŪŁˆ/`cįXYh!6jĪf GrOlXvŲłvęūføk2±!ūóp!GOOŌ² &z·®f 6|M ©~„%‘Ļ`]*š äĪ›M]K Õ‰śĖZĆ1Eé¹rÅ%čȶĄc…¼ŲmēĶ1Ę`ę)ā-ƒ ž ”ĀEYm4%7YTk-¾–Q¶a–"NWAo-y†eqŅį¾,)ā ÓŅYÓŃś“ptŽŠå½\hóq“Īķm˜sŌz¦ģG]ÄNń‡Ņa…‡röēß¶Øs^lć vh\ī2Ł%šāßćŽ0EeRvŲIEND®B`‚apache-couchdb-1.6.0/share/doc/build/html/_static/up.png0000644000175000001440000000055311644410761023024 0ustar00djcusers00000000000000‰PNG  IHDRó’asRGB®ĪébKGDłC» pHYs × ×B(›xtIMEŚ!.<̓EėIDAT8ĖĶ“±NA†æõ®B‚P\EG{õ„ް³%<„ń|éxcžž ĄŠ cƒr6“@t×;bć$›ģü;ó’3ų×&)—”’†¹hČ1ö““¼!ĮŚļ«³Hzz@ĻżØ…Äē°=)p 3Ūµe°2/Üß“’ é(€śä¹ „%ųČ^ND^ ¼}3ūH1؀ĖDo‚ĒŖØIS üF‹Ņ±?,š ģG`ĢÜß{¬vģ±’–^żX™Ł[b¼]ąøžĶģ&HC3{:sO&Ą ’²?,[öļeL#«¾éIEND®B`‚apache-couchdb-1.6.0/share/doc/build/html/_static/searchtools.js0000644000175000001440000003725312332105766024566 0ustar00djcusers00000000000000/* * searchtools.js_t * ~~~~~~~~~~~~~~~~ * * Sphinx JavaScript utilties for the full-text search. * * :copyright: Copyright 2007-2011 by the Sphinx team, see AUTHORS. * :license: BSD, see LICENSE for details. * */ /** * helper function to return a node containing the * search summary for a given text. keywords is a list * of stemmed words, hlwords is the list of normal, unstemmed * words. the first one is used to find the occurance, the * latter for highlighting it. */ jQuery.makeSearchSummary = function(text, keywords, hlwords) { var textLower = text.toLowerCase(); var start = 0; $.each(keywords, function() { var i = textLower.indexOf(this.toLowerCase()); if (i > -1) start = i; }); start = Math.max(start - 120, 0); var excerpt = ((start > 0) ? '...' : '') + $.trim(text.substr(start, 240)) + ((start + 240 - text.length) ? '...' : ''); var rv = $('
        ').text(excerpt); $.each(hlwords, function() { rv = rv.highlightText(this, 'highlighted'); }); return rv; } /** * Porter Stemmer */ var Stemmer = function() { var step2list = { ational: 'ate', tional: 'tion', enci: 'ence', anci: 'ance', izer: 'ize', bli: 'ble', alli: 'al', entli: 'ent', eli: 'e', ousli: 'ous', ization: 'ize', ation: 'ate', ator: 'ate', alism: 'al', iveness: 'ive', fulness: 'ful', ousness: 'ous', aliti: 'al', iviti: 'ive', biliti: 'ble', logi: 'log' }; var step3list = { icate: 'ic', ative: '', alize: 'al', iciti: 'ic', ical: 'ic', ful: '', ness: '' }; var c = "[^aeiou]"; // consonant var v = "[aeiouy]"; // vowel var C = c + "[^aeiouy]*"; // consonant sequence var V = v + "[aeiou]*"; // vowel sequence var mgr0 = "^(" + C + ")?" + V + C; // [C]VC... is m>0 var meq1 = "^(" + C + ")?" + V + C + "(" + V + ")?$"; // [C]VC[V] is m=1 var mgr1 = "^(" + C + ")?" + V + C + V + C; // [C]VCVC... is m>1 var s_v = "^(" + C + ")?" + v; // vowel in stem this.stemWord = function (w) { var stem; var suffix; var firstch; var origword = w; if (w.length < 3) return w; var re; var re2; var re3; var re4; firstch = w.substr(0,1); if (firstch == "y") w = firstch.toUpperCase() + w.substr(1); // Step 1a re = /^(.+?)(ss|i)es$/; re2 = /^(.+?)([^s])s$/; if (re.test(w)) w = w.replace(re,"$1$2"); else if (re2.test(w)) w = w.replace(re2,"$1$2"); // Step 1b re = /^(.+?)eed$/; re2 = /^(.+?)(ed|ing)$/; if (re.test(w)) { var fp = re.exec(w); re = new RegExp(mgr0); if (re.test(fp[1])) { re = /.$/; w = w.replace(re,""); } } else if (re2.test(w)) { var fp = re2.exec(w); stem = fp[1]; re2 = new RegExp(s_v); if (re2.test(stem)) { w = stem; re2 = /(at|bl|iz)$/; re3 = new RegExp("([^aeiouylsz])\\1$"); re4 = new RegExp("^" + C + v + "[^aeiouwxy]$"); if (re2.test(w)) w = w + "e"; else if (re3.test(w)) { re = /.$/; w = w.replace(re,""); } else if (re4.test(w)) w = w + "e"; } } // Step 1c re = /^(.+?)y$/; if (re.test(w)) { var fp = re.exec(w); stem = fp[1]; re = new RegExp(s_v); if (re.test(stem)) w = stem + "i"; } // Step 2 re = /^(.+?)(ational|tional|enci|anci|izer|bli|alli|entli|eli|ousli|ization|ation|ator|alism|iveness|fulness|ousness|aliti|iviti|biliti|logi)$/; if (re.test(w)) { var fp = re.exec(w); stem = fp[1]; suffix = fp[2]; re = new RegExp(mgr0); if (re.test(stem)) w = stem + step2list[suffix]; } // Step 3 re = /^(.+?)(icate|ative|alize|iciti|ical|ful|ness)$/; if (re.test(w)) { var fp = re.exec(w); stem = fp[1]; suffix = fp[2]; re = new RegExp(mgr0); if (re.test(stem)) w = stem + step3list[suffix]; } // Step 4 re = /^(.+?)(al|ance|ence|er|ic|able|ible|ant|ement|ment|ent|ou|ism|ate|iti|ous|ive|ize)$/; re2 = /^(.+?)(s|t)(ion)$/; if (re.test(w)) { var fp = re.exec(w); stem = fp[1]; re = new RegExp(mgr1); if (re.test(stem)) w = stem; } else if (re2.test(w)) { var fp = re2.exec(w); stem = fp[1] + fp[2]; re2 = new RegExp(mgr1); if (re2.test(stem)) w = stem; } // Step 5 re = /^(.+?)e$/; if (re.test(w)) { var fp = re.exec(w); stem = fp[1]; re = new RegExp(mgr1); re2 = new RegExp(meq1); re3 = new RegExp("^" + C + v + "[^aeiouwxy]$"); if (re.test(stem) || (re2.test(stem) && !(re3.test(stem)))) w = stem; } re = /ll$/; re2 = new RegExp(mgr1); if (re.test(w) && re2.test(w)) { re = /.$/; w = w.replace(re,""); } // and turn initial Y back to y if (firstch == "y") w = firstch.toLowerCase() + w.substr(1); return w; } } /** * Search Module */ var Search = { _index : null, _queued_query : null, _pulse_status : -1, init : function() { var params = $.getQueryParameters(); if (params.q) { var query = params.q[0]; $('input[name="q"]')[0].value = query; this.performSearch(query); } }, loadIndex : function(url) { $.ajax({type: "GET", url: url, data: null, success: null, dataType: "script", cache: true}); }, setIndex : function(index) { var q; this._index = index; if ((q = this._queued_query) !== null) { this._queued_query = null; Search.query(q); } }, hasIndex : function() { return this._index !== null; }, deferQuery : function(query) { this._queued_query = query; }, stopPulse : function() { this._pulse_status = 0; }, startPulse : function() { if (this._pulse_status >= 0) return; function pulse() { Search._pulse_status = (Search._pulse_status + 1) % 4; var dotString = ''; for (var i = 0; i < Search._pulse_status; i++) dotString += '.'; Search.dots.text(dotString); if (Search._pulse_status > -1) window.setTimeout(pulse, 500); }; pulse(); }, /** * perform a search for something */ performSearch : function(query) { // create the required interface elements this.out = $('#search-results'); this.title = $('

        ' + _('Searching') + '

        ').appendTo(this.out); this.dots = $('').appendTo(this.title); this.status = $('

        ').appendTo(this.out); this.output = $('\n\n
        \n
        \n\n\n
        '+__e(JSON.stringify(doc.attributes,null," "))+"
        \n\n\n";return __p},this.JST["app/templates/documents/doc_field_editor.html"]=function(obj){obj||(obj={});{var __t,__p="";_.escape,Array.prototype.join}with(obj)__p+='\n\n
        \n
        \n\n
        \n \n \n \n
        \n
        \n \n \n
        \n
        \n\n
        \n \n\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n ',_.each(doc,function(a,b){__p+='\n \n \n \n \n \n "}),__p+='\n \n \n \n ',_.each(attachments,function(a){__p+='\n \n \n \n \n "}),__p+='\n \n
        \n KeyValue
        \n \n
        \n Attachments\n
        \n '+(null==(__t=a.fileName)?"":__t)+" \n "+(null==(__t=a.contentType)?"":__t)+", "+(null==(__t=formatSize(a.size))?"":__t)+" \n
        \n New field\n\n
        \n';return __p},this.JST["app/templates/documents/doc_field_editor_tabs.html"]=function(obj){obj||(obj={});{var __t,__p="";_.escape}with(obj)__p+='\n\n\n';return __p},this.JST["app/templates/documents/duplicate_doc_modal.html"]=function(obj){obj||(obj={});{var __p="";_.escape}with(obj)__p+='\n\n\n \n\n';return __p},this.JST["app/addons/search/templates/search_menu.html"]=function(obj){obj||(obj={});{var __t,__p="";_.escape}with(obj)__p+='\n
      • \n \n New\n \n
      • \n';return __p},this.JST["app/addons/stats/templates/by_method.html"]=function(obj){obj||(obj={});{var __p="";_.escape}with(obj)__p+='\n\n

        By Method GET, POST, PUT, DELETE

        \n
        \n';return __p},this.JST["app/addons/stats/templates/pie_table.html"]=function(obj){obj||(obj={});{var __t,__p="";_.escape,Array.prototype.join}with(obj)__p+='\n\n
        \n

        '+(null==(__t=datatype)?"":__t)+'

        \n
        \n\n
        \n
        \n \n \n \n \n \n \n \n \n \n \n \n \n ',_.each(statistics,function(a){a.get("sum")&&(__p+="\n \n \n \n \n \n \n \n \n \n ")}),__p+='\n
        Description current sum mean stddev min max
        "+(null==(__t=a.get("description"))?"":__t)+""+(null==(__t=a.get("current"))?"":__t)+""+(null==(__t=a.get("sum"))?"":__t)+""+(null==(__t=a.get("mean"))?"":__t)+""+(null==(__t=a.get("stddev"))?"":__t)+""+(null==(__t=a.get("min"))?"":__t)+""+(null==(__t=a.get("max"))?"":__t)+"
        \n
        \n\n
        \n
        \n \n
        \n
        \n
        \n';return __p},this.JST["app/addons/stats/templates/stats.html"]=function(obj){obj||(obj={});{var __p="";_.escape}with(obj)__p+='\n\n
        \n
        \n';return __p},this.JST["app/addons/stats/templates/statselect.html"]=function(obj){obj||(obj={});{var __t,__p="";_.escape,Array.prototype.join}with(obj)__p+='\n\n',_.each(datatypes,function(a){__p+='\n
      • \n \n '+(null==(__t=a)?"":__t)+'\n \n\n
      • \n'}),__p+="\n";return __p},this.JST["app/addons/style/templates/footer.html"]=function(obj){obj||(obj={});{var __t,__p="";_.escape}with(obj)__p+='
        \n
        \n
        \n\n
        \n

        Company

        \n \n
        \n\n
        \n

         

        \n \n
        \n\n
        \n

        Resources

        \n \n
        \n\n
        \n

        For Developers

        \n \n
        \n\n
        \n

        Connect

        \n \n
        \n\n
        \n

         

        \n Contact Us\n
        \n\n
        \n
        \n\n
        \n\n';return __p},this.JST["app/addons/style/templates/nav-bar.html"]=function(obj){obj||(obj={});{var __t,__p="";_.escape,Array.prototype.join}with(obj)__p+='\n
        \n
        \n\n\n';return __p},this.JST["app/addons/style/templates/nav_link_title.html"]=function(obj){obj||(obj={});{var __t,__p="";_.escape}with(obj)__p+='\n Logout\n '+(null==(__t=username)?"":__t)+' \n \n \n \n\n';return __p},this.JST["app/addons/style/templates/new_portal_modal.html"]=function(obj){obj||(obj={});{var __t,__p="";_.escape}with(obj)__p+='\n \n \n\n';return __p},this.JST["app/addons/support/templates/closedtickets.html"]=function(obj){obj||(obj={});{var __t,__p="";_.escape,Array.prototype.join}with(obj)__p+="\n",0===tickets.length?__p+="\n
        \n

        You have no closed tickets.

        \n
        \n":(__p+="\n ",_.each(tickets,function(a){__p+="\n
        \n

        \n CLOSED: \n "+(null==(__t=a.get("title"))?"":__t)+" \n - Case "+(null==(__t=a.get("caseID"))?"":__t)+' \n

        \n

        View the full ticket

        \n
        \n'}),__p+="\n"),__p+="\n";return __p},this.JST["app/addons/support/templates/detailedticket.html"]=function(obj){obj||(obj={});{var __t,__p="";_.escape,Array.prototype.join}with(obj)model.get("responses")?(__p+='\n\n
        \n

        '+(null==(__t=model.get("title"))?"":__t)+'

        \n
        \n\n
        \n\n',showReply&&(__p+='\n
        \n
        \n \n \n
        \n
        \n
        From '+(null==(__t=username)?"":__t)+' \n '+(null==(__t=model.humanDate())?"":__t)+" "+(null==(__t=model.getTime())?"":__t)+' \n
        \n \n\n \n
        \n \n Cancel\n \n
        \n\n
        \n
        \n'),__p+="\n\n"):__p+="\n

        This case cannot be found.

        \n",__p+="\n";return __p},this.JST["app/addons/support/templates/discussionvolley.html"]=function(obj){obj||(obj={});{var __t,__p="";_.escape,Array.prototype.join}with(obj)__p+='\n
        \n
        \n

        \n
        \n '+(null==(__t=model.humanDate())?"":__t)+'\n
        \n '+(null==(__t=model.getTime())?"":__t)+'\n
        \n
        \n

        \n
        \n
        \n

        \n
        From '+(null==(__t=user)?"":__t)+'\n
        \n

        \n
        \n
        \n\n
        \n
        \n
        '+(null==(__t=model.get("content"))?"":__t)+"
        \n ",model.get("attachments")&&(__p+='\n \n "),__p+="\n \n ",first&&showReply&&(__p+='\n \n '),__p+="\n
        \n
        \n";return __p},this.JST["app/addons/support/templates/form.html"]=function(obj){obj||(obj={});{var __p="";_.escape}with(obj)__p+='
        \n

        New Case

        \n
        \n

        Submit a case, and our support staff will reply via email as soon as possible.

        \n
        \n
        \n
        \n \n \n\n \n \n \n

        Please describe your issue in as much detail as possible.

        \n \n \n
        \n \n
        \n
        \n';return __p},this.JST["app/addons/support/templates/sidebar.html"]=function(obj){obj||(obj={});{var __p="";_.escape}with(obj)__p+=' \n\n
        \n New Case\n \n
        \n';return __p},this.JST["app/addons/support/templates/sidebaritem.html"]=function(obj){obj||(obj={});{var __t,__p="";_.escape}with(obj)__p+='\n\n
        \n '+(null==(__t=ticket.get("caseID"))?"":__t)+'\n
        \n
        \n '+(null==(__t=ticket.get("title"))?"":__t)+'\n
        \n
        \n '+(null==(__t=status)?"":__t)+"\n
        \n
        \n";return __p},this.JST["app/addons/support/templates/support.html"]=function(obj){obj||(obj={});{var __p="";_.escape}with(obj)__p+='
        \n
        \n
        \n \n
        \n
        \n
        \n';return __p},this.JST["app/addons/verifyinstall/templates/main.html"]=function(obj){obj||(obj={});{var __p="";_.escape}with(obj)__p+='\n\n
        \n\n\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n
        Test Status
        Create Database
        Create Document
        Update Document
        Delete Document
        Create View
        Replication
        \n';return __p},define("initialize",[],function(){var a={root:"/_utils/fauxton/",version:"1.0",host:"../.."};return a}),function(a,b){function c(a){var b=a.length,c=kb.type(a);return kb.isWindow(a)?!1:1===a.nodeType&&b?!0:"array"===c||"function"!==c&&(0===b||"number"==typeof b&&b>0&&b-1 in a)}function d(a){var b=zb[a]={};return kb.each(a.match(mb)||[],function(a,c){b[c]=!0}),b}function e(a,c,d,e){if(kb.acceptData(a)){var f,g,h=kb.expando,i=a.nodeType,j=i?kb.cache:a,k=i?a[h]:a[h]&&h;if(k&&j[k]&&(e||j[k].data)||d!==b||"string"!=typeof c)return k||(k=i?a[h]=bb.pop()||kb.guid++:h),j[k]||(j[k]=i?{}:{toJSON:kb.noop}),("object"==typeof c||"function"==typeof c)&&(e?j[k]=kb.extend(j[k],c):j[k].data=kb.extend(j[k].data,c)),g=j[k],e||(g.data||(g.data={}),g=g.data),d!==b&&(g[kb.camelCase(c)]=d),"string"==typeof c?(f=g[c],null==f&&(f=g[kb.camelCase(c)])):f=g,f}}function f(a,b,c){if(kb.acceptData(a)){var d,e,f=a.nodeType,g=f?kb.cache:a,i=f?a[kb.expando]:kb.expando;if(g[i]){if(b&&(d=c?g[i]:g[i].data)){kb.isArray(b)?b=b.concat(kb.map(b,kb.camelCase)):b in d?b=[b]:(b=kb.camelCase(b),b=b in d?[b]:b.split(" ")),e=b.length;for(;e--;)delete d[b[e]];if(c?!h(d):!kb.isEmptyObject(d))return}(c||(delete g[i].data,h(g[i])))&&(f?kb.cleanData([a],!0):kb.support.deleteExpando||g!=g.window?delete g[i]:g[i]=null)}}}function g(a,c,d){if(d===b&&1===a.nodeType){var e="data-"+c.replace(Bb,"-$1").toLowerCase();if(d=a.getAttribute(e),"string"==typeof d){try{d="true"===d?!0:"false"===d?!1:"null"===d?null:+d+""===d?+d:Ab.test(d)?kb.parseJSON(d):d}catch(f){}kb.data(a,c,d)}else d=b}return d}function h(a){var b;for(b in a)if(("data"!==b||!kb.isEmptyObject(a[b]))&&"toJSON"!==b)return!1;return!0}function i(){return!0}function j(){return!1}function k(){try{return Y.activeElement}catch(a){}}function l(a,b){do a=a[b];while(a&&1!==a.nodeType);return a}function m(a,b,c){if(kb.isFunction(b))return kb.grep(a,function(a,d){return!!b.call(a,d,a)!==c});if(b.nodeType)return kb.grep(a,function(a){return a===b!==c});if("string"==typeof b){if(Qb.test(b))return kb.filter(b,a,c);b=kb.filter(b,a)}return kb.grep(a,function(a){return kb.inArray(a,b)>=0!==c})}function n(a){var b=Ub.split("|"),c=a.createDocumentFragment();if(c.createElement)for(;b.length;)c.createElement(b.pop());return c}function o(a,b){return kb.nodeName(a,"table")&&kb.nodeName(1===b.nodeType?b:b.firstChild,"tr")?a.getElementsByTagName("tbody")[0]||a.appendChild(a.ownerDocument.createElement("tbody")):a}function p(a){return a.type=(null!==kb.find.attr(a,"type"))+"/"+a.type,a}function q(a){var b=ec.exec(a.type);return b?a.type=b[1]:a.removeAttribute("type"),a}function r(a,b){for(var c,d=0;null!=(c=a[d]);d++)kb._data(c,"globalEval",!b||kb._data(b[d],"globalEval"))}function s(a,b){if(1===b.nodeType&&kb.hasData(a)){var c,d,e,f=kb._data(a),g=kb._data(b,f),h=f.events;if(h){delete g.handle,g.events={};for(c in h)for(d=0,e=h[c].length;e>d;d++)kb.event.add(b,c,h[c][d])}g.data&&(g.data=kb.extend({},g.data))}}function t(a,b){var c,d,e;if(1===b.nodeType){if(c=b.nodeName.toLowerCase(),!kb.support.noCloneEvent&&b[kb.expando]){e=kb._data(b);for(d in e.events)kb.removeEvent(b,d,e.handle);b.removeAttribute(kb.expando)}"script"===c&&b.text!==a.text?(p(b).text=a.text,q(b)):"object"===c?(b.parentNode&&(b.outerHTML=a.outerHTML),kb.support.html5Clone&&a.innerHTML&&!kb.trim(b.innerHTML)&&(b.innerHTML=a.innerHTML)):"input"===c&&bc.test(a.type)?(b.defaultChecked=b.checked=a.checked,b.value!==a.value&&(b.value=a.value)):"option"===c?b.defaultSelected=b.selected=a.defaultSelected:("input"===c||"textarea"===c)&&(b.defaultValue=a.defaultValue) }}function u(a,c){var d,e,f=0,g=typeof a.getElementsByTagName!==W?a.getElementsByTagName(c||"*"):typeof a.querySelectorAll!==W?a.querySelectorAll(c||"*"):b;if(!g)for(g=[],d=a.childNodes||a;null!=(e=d[f]);f++)!c||kb.nodeName(e,c)?g.push(e):kb.merge(g,u(e,c));return c===b||c&&kb.nodeName(a,c)?kb.merge([a],g):g}function v(a){bc.test(a.type)&&(a.defaultChecked=a.checked)}function w(a,b){if(b in a)return b;for(var c=b.charAt(0).toUpperCase()+b.slice(1),d=b,e=yc.length;e--;)if(b=yc[e]+c,b in a)return b;return d}function x(a,b){return a=b||a,"none"===kb.css(a,"display")||!kb.contains(a.ownerDocument,a)}function y(a,b){for(var c,d,e,f=[],g=0,h=a.length;h>g;g++)d=a[g],d.style&&(f[g]=kb._data(d,"olddisplay"),c=d.style.display,b?(f[g]||"none"!==c||(d.style.display=""),""===d.style.display&&x(d)&&(f[g]=kb._data(d,"olddisplay",C(d.nodeName)))):f[g]||(e=x(d),(c&&"none"!==c||!e)&&kb._data(d,"olddisplay",e?c:kb.css(d,"display"))));for(g=0;h>g;g++)d=a[g],d.style&&(b&&"none"!==d.style.display&&""!==d.style.display||(d.style.display=b?f[g]||"":"none"));return a}function z(a,b,c){var d=rc.exec(b);return d?Math.max(0,d[1]-(c||0))+(d[2]||"px"):b}function A(a,b,c,d,e){for(var f=c===(d?"border":"content")?4:"width"===b?1:0,g=0;4>f;f+=2)"margin"===c&&(g+=kb.css(a,c+xc[f],!0,e)),d?("content"===c&&(g-=kb.css(a,"padding"+xc[f],!0,e)),"margin"!==c&&(g-=kb.css(a,"border"+xc[f]+"Width",!0,e))):(g+=kb.css(a,"padding"+xc[f],!0,e),"padding"!==c&&(g+=kb.css(a,"border"+xc[f]+"Width",!0,e)));return g}function B(a,b,c){var d=!0,e="width"===b?a.offsetWidth:a.offsetHeight,f=kc(a),g=kb.support.boxSizing&&"border-box"===kb.css(a,"boxSizing",!1,f);if(0>=e||null==e){if(e=lc(a,b,f),(0>e||null==e)&&(e=a.style[b]),sc.test(e))return e;d=g&&(kb.support.boxSizingReliable||e===a.style[b]),e=parseFloat(e)||0}return e+A(a,b,c||(g?"border":"content"),d,f)+"px"}function C(a){var b=Y,c=uc[a];return c||(c=D(a,b),"none"!==c&&c||(jc=(jc||kb("') .css("opacity", "0").appendTo(document.body); if (parseInt($.browser.version)<7) { dialog.css("position", "absolute"); overlay.css("position", "absolute"); $("html,body").css({width: "100%", height: "100%"}); } } overlay.appendTo(document.body).fadeTo(100, 0.6); dialog.appendTo(document.body).addClass("loading").centerBox().fadeIn(400); $(document).keydown(function(e) { if (e.keyCode == 27) dismiss(); // dismiss on escape key }); function dismiss() { dialog.fadeOut("fast", function() { $("#dialog, #overlay, #overlay-frame").remove(); }); $(document).unbind("keydown"); } overlay.click(function() { dismiss(); }); function showError(name, message) { var input = dialog.find(":input[name=" + name + "]"); input.addClass("error").next("div.error").remove(); $('
        ').text(message).insertAfter(input); } $.get(url, function(html) { $(html).appendTo(dialog); dialog.removeClass("loading").addClass("loaded").centerBox().each(function() { options.load(dialog.children()[0]); $(":input:first", dialog).each(function() { this.focus() }); $("button.cancel", dialog).click(function() { // dismiss on cancel dismiss(); options.cancel(); }); $("form", dialog).submit(function(e) { // invoke callback on submit e.preventDefault(); dialog.find("div.error").remove().end().find(".error").removeClass("error"); var data = {}; $.each($("form :input", dialog).serializeArray(), function(i, field) { data[field.name] = field.value; }); $("form :file", dialog).each(function() { data[this.name] = this.value; // file inputs need special handling }); options.submit(data, function callback(errors) { if ($.isEmptyObject(errors)) { dismiss(); } else { for (var name in errors) { showError(name, errors[name]); } } }); return false; }); }); }); } })(jQuery); apache-couchdb-1.6.0/share/www/script/base64.js0000644000175000001440000000746312332105522021204 0ustar00djcusers00000000000000/* Copyright (C) 1999 Masanao Izumo * Version: 1.0 * LastModified: Dec 25 1999 * This library is free. You can redistribute it and/or modify it. */ /* Modified by Chris Anderson to not use CommonJS */ /* Modified by Dan Webb not to require Narwhal's binary library */ var Base64 = {}; (function(exports) { var encodeChars = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/"; var decodeChars = [ -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 62, -1, -1, -1, 63, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, -1, -1, -1, -1, -1, -1, -1, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, -1, -1, -1, -1, -1, -1, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, -1, -1, -1, -1, -1 ]; exports.encode = function (str) { var out, i, length; var c1, c2, c3; length = len(str); i = 0; out = []; while(i < length) { c1 = str.charCodeAt(i++) & 0xff; if(i == length) { out.push(encodeChars.charCodeAt(c1 >> 2)); out.push(encodeChars.charCodeAt((c1 & 0x3) << 4)); out.push("=".charCodeAt(0)); out.push("=".charCodeAt(0)); break; } c2 = str.charCodeAt(i++); if(i == length) { out.push(encodeChars.charCodeAt(c1 >> 2)); out.push(encodeChars.charCodeAt(((c1 & 0x3)<< 4) | ((c2 & 0xF0) >> 4))); out.push(encodeChars.charCodeAt((c2 & 0xF) << 2)); out.push("=".charCodeAt(0)); break; } c3 = str.charCodeAt(i++); out.push(encodeChars.charCodeAt(c1 >> 2)); out.push(encodeChars.charCodeAt(((c1 & 0x3)<< 4) | ((c2 & 0xF0) >> 4))); out.push(encodeChars.charCodeAt(((c2 & 0xF) << 2) | ((c3 & 0xC0) >>6))); out.push(encodeChars.charCodeAt(c3 & 0x3F)); } var str = ""; out.forEach(function(chr) { str += String.fromCharCode(chr) }); return str; }; exports.decode = function (str) { var c1, c2, c3, c4; var i, length, out; length = len(str); i = 0; out = []; while(i < length) { /* c1 */ do { c1 = decodeChars[str.charCodeAt(i++) & 0xff]; } while(i < length && c1 == -1); if(c1 == -1) break; /* c2 */ do { c2 = decodeChars[str.charCodeAt(i++) & 0xff]; } while(i < length && c2 == -1); if(c2 == -1) break; out.push(String.fromCharCode((c1 << 2) | ((c2 & 0x30) >> 4))); /* c3 */ do { c3 = str.charCodeAt(i++) & 0xff; if(c3 == 61) return out.join(''); c3 = decodeChars[c3]; } while(i < length && c3 == -1); if(c3 == -1) break; out.push(String.fromCharCode(((c2 & 0xF) << 4) | ((c3 & 0x3C) >> 2))); /* c4 */ do { c4 = str.charCodeAt(i++) & 0xff; if(c4 == 61) return out.join(''); c4 = decodeChars[c4]; } while(i < length && c4 == -1); if(c4 == -1) break; out.push(String.fromCharCode(((c3 & 0x03) << 6) | c4)); } return out.join(''); }; var len = function (object) { if (object.length !== undefined) { return object.length; } else if (object.getLength !== undefined) { return object.getLength(); } else { return undefined; } }; })(Base64); apache-couchdb-1.6.0/share/www/script/couch_tests.js0000644000175000001440000000677212332105522022445 0ustar00djcusers00000000000000// Licensed under the Apache License, Version 2.0 (the "License"); you may not // use this file except in compliance with the License. You may obtain a copy of // the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, WITHOUT // WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the // License for the specific language governing permissions and limitations under // the License. CouchDB.urlPrefix = ".."; var couchTests = {}; function loadTest(file) { loadScript("script/test/"+file); }; // keep first loadTest("basics.js"); // keep sorted loadTest("all_docs.js"); loadTest("attachments.js"); loadTest("attachments_multipart.js"); loadTest("attachment_names.js"); loadTest("attachment_paths.js"); loadTest("attachment_ranges.js"); loadTest("attachment_views.js"); loadTest("auth_cache.js"); loadTest("batch_save.js"); loadTest("bulk_docs.js"); loadTest("changes.js"); loadTest("coffee.js"); loadTest("compact.js"); loadTest("config.js"); loadTest("conflicts.js"); loadTest("content_negotiation.js"); loadTest("cookie_auth.js"); loadTest("copy_doc.js"); loadTest("delayed_commits.js"); loadTest("design_docs.js"); loadTest("design_options.js"); loadTest("design_paths.js"); loadTest("erlang_views.js"); loadTest("etags_head.js"); loadTest("etags_views.js"); loadTest("form_submit.js"); loadTest("http.js"); loadTest("invalid_docids.js"); loadTest("jsonp.js"); loadTest("large_docs.js"); loadTest("list_views.js"); loadTest("lots_of_docs.js"); loadTest("method_override.js"); loadTest("multiple_rows.js"); loadScript("script/oauth.js"); loadScript("script/sha1.js"); loadTest("oauth.js"); loadTest("oauth_users_db.js"); loadTest("proxyauth.js"); loadTest("purge.js"); loadTest("reader_acl.js"); loadTest("recreate_doc.js"); loadTest("reduce.js"); loadTest("reduce_builtin.js"); loadTest("reduce_false.js"); loadTest("reduce_false_temp.js"); loadTest("replication.js"); loadScript("script/replicator_db_inc.js"); loadTest("replicator_db_bad_rep_id.js"); loadTest("replicator_db_by_doc_id.js"); loadTest("replicator_db_compact_rep_db.js"); loadTest("replicator_db_continuous.js"); loadTest("replicator_db_credential_delegation.js"); loadTest("replicator_db_field_validation.js"); loadTest("replicator_db_filtered.js"); loadTest("replicator_db_identical.js"); loadTest("replicator_db_identical_continuous.js"); loadTest("replicator_db_invalid_filter.js"); loadTest("replicator_db_simple.js"); loadTest("replicator_db_successive.js"); loadTest("replicator_db_survives.js"); loadTest("replicator_db_swap_rep_db.js"); loadTest("replicator_db_update_security.js"); loadTest("replicator_db_user_ctx.js"); loadTest("replicator_db_write_auth.js"); loadTest("replicator_db_security.js"); loadTest("rev_stemming.js"); loadTest("rewrite.js"); loadTest("security_validation.js"); loadTest("show_documents.js"); loadTest("stats.js"); loadTest("update_documents.js"); loadTest("users_db.js"); loadTest("users_db_security.js"); loadTest("utf8.js"); loadTest("uuids.js"); loadTest("view_collation.js"); loadTest("view_collation_raw.js"); loadTest("view_conflicts.js"); loadTest("view_compaction.js"); loadTest("view_errors.js"); loadTest("view_include_docs.js"); loadTest("view_multi_key_all_docs.js"); loadTest("view_multi_key_design.js"); loadTest("view_multi_key_temp.js"); loadTest("view_offsets.js"); loadTest("view_pagination.js"); loadTest("view_sandboxing.js"); loadTest("view_update_seq.js"); // keep sorted apache-couchdb-1.6.0/share/www/custom_test.html0000644000175000001440000000707612332105522021515 0ustar00djcusers00000000000000 Custom Test

        Overview Test Suite Custom Test

        Test Function
          
        apache-couchdb-1.6.0/share/www/couch_tests.html0000644000175000001440000000672312332105522021465 0ustar00djcusers00000000000000 Test Suite

        Overview Test Suite

        Note: Each of the tests will block the browser. If the connection to your CouchDB server is slow, running the tests will take some time, and you'll not be able to do much with your browser while a test is being executed. Also: The test suite is designed to work with Firefox (with Firebug disabled). Patches are welcome for convenience compatibility with other browsers, but official support is for Firefox (latest stable version) only.

        Tests
        Name Status Elapsed Time Details
        apache-couchdb-1.6.0/share/www/verify_install.html0000644000175000001440000000703612332105522022172 0ustar00djcusers00000000000000 Test Suite

        Overview Verify Install

        apache-couchdb-1.6.0/share/www/session.html0000644000175000001440000000700012332105522020612 0ustar00djcusers00000000000000 Session

        Overview Session

        Establish or Modify Your Session

        or Welcome ?!
        Logout
        Welcome ?!
        Setup more admins or Logout
        Welcome to Admin Party!
        Everyone is admin. Fix this
        apache-couchdb-1.6.0/share/Makefile.am0000644000175000001440000002172612332105522017464 0ustar00djcusers00000000000000## Licensed under the Apache License, Version 2.0 (the "License"); you may not ## use this file except in compliance with the License. You may obtain a copy of ## the License at ## ## http://www.apache.org/licenses/LICENSE-2.0 ## ## Unless required by applicable law or agreed to in writing, software ## distributed under the License is distributed on an "AS IS" BASIS, WITHOUT ## WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the ## License for the specific language governing permissions and limitations under ## the License. SUBDIRS = doc JS_FILE = server/main.js JS_FILE_COMPONENTS = \ server/json2.js \ server/filter.js \ server/mimeparse.js \ server/render.js \ server/state.js \ server/util.js \ server/validate.js \ server/views.js JS_FILE_COMPONENTS_LAST = server/loop.js $(JS_FILE): $(JS_FILE_COMPONENTS) $(JS_FILE_COMPONENTS_LAST) mkdir -p `dirname $(JS_FILE)` echo "// DO NOT EDIT THIS FILE BY HAND" > $@ echo >> $@ cat $^ >> $@ COFFEE_FILE = server/main-coffee.js COFFEE_FILE_COMPONENTS_LAST = server/coffee-script.js server/loop.js $(COFFEE_FILE): $(JS_FILE_COMPONENTS) $(COFFEE_FILE_COMPONENTS_LAST) mkdir -p `dirname $(COFFEE_FILE)` echo "// DO NOT EDIT THIS FILE BY HAND" > $@ echo >> $@ cat $^ >> $@ CLEANFILES = $(JS_FILE) $(COFFEE_FILE) EXTRA_DIST = $(JS_FILE_COMPONENTS) $(JS_FILE_COMPONENTS_LAST) $(COFFEE_FILE_COMPONENTS_LAST) nobase_localdata_SCRIPTS = \ $(JS_FILE) \ $(COFFEE_FILE) nobase_dist_localdata_DATA = \ www/config.html \ www/couch_tests.html \ www/custom_test.html \ www/database.html \ www/session.html \ www/dialog/_admin_party.html \ www/dialog/_change_password.html \ www/dialog/_compact_cleanup.html \ www/dialog/_create_admin.html \ www/dialog/_login.html \ www/dialog/_signup.html \ www/dialog/_create_database.html \ www/dialog/_create_config.html \ www/dialog/_delete_database.html \ www/dialog/_delete_document.html \ www/dialog/_database_security.html \ www/dialog/_share_test_reports.html \ www/dialog/_save_view_as.html \ www/dialog/_upload_attachment.html \ www/document.html \ www/fauxton/css/index.css \ www/fauxton/img/couchdb-site.png \ www/fauxton/img/couchdblogo.png \ www/fauxton/img/fontawesome-webfont.eot \ www/fauxton/img/fontawesome-webfont.svg \ www/fauxton/img/fontawesome-webfont.ttf \ www/fauxton/img/fontawesome-webfont.woff \ www/fauxton/img/FontAwesome.otf \ www/fauxton/img/fontcustom_fauxton.eot \ www/fauxton/img/fontcustom_fauxton.svg \ www/fauxton/img/fontcustom_fauxton.ttf \ www/fauxton/img/fontcustom_fauxton.woff \ www/fauxton/img/glyphicons-halflings-white.png \ www/fauxton/img/glyphicons-halflings.png \ www/fauxton/img/linen.png \ www/fauxton/img/loader.gif \ www/fauxton/img/minilogo.png \ www/fauxton/index.html \ www/fauxton/js/require.js \ www/fauxton/js/ace/mode-javascript.js \ www/fauxton/js/ace/mode-json.js \ www/fauxton/js/ace/theme-crimson_editor.js \ www/fauxton/js/ace/worker-javascript.js \ www/fauxton/js/ace/worker-json.js \ www/favicon.ico \ www/image/add.png \ www/image/apply.gif \ www/image/bg.png \ www/image/cancel.gif \ www/image/compact.png \ www/image/delete-mini.png \ www/image/delete.png \ www/image/grippie.gif \ www/image/hgrad.gif \ www/image/key.png \ www/image/load.png \ www/image/logo.png \ www/image/order-asc.gif \ www/image/order-desc.gif \ www/image/path.gif \ www/image/progress.gif \ www/image/rarrow.png \ www/image/run-mini.png \ www/image/run.png \ www/image/running.png \ www/image/save.png \ www/image/sidebar-toggle.png \ www/image/spinner.gif \ www/image/spinner_33.gif \ www/image/spinner_6b.gif \ www/image/test_failure.gif \ www/image/test_success.gif \ www/image/thead-key.gif \ www/image/thead.gif \ www/image/toggle-collapse.gif \ www/image/toggle-expand.gif \ www/image/twisty.gif \ www/index.html \ www/plugins.html \ www/replicator.html \ www/script/couch.js \ www/script/couch_tests.js \ www/script/couch_test_runner.js \ www/script/futon.browse.js \ www/script/futon.format.js \ www/script/futon.js \ www/script/jquery.couch.js \ www/script/jquery.dialog.js \ www/script/jquery.editinline.js \ www/script/jquery.form.js \ www/script/jquery.js \ www/script/jquery-ui-1.8.11.custom.min.js \ www/script/jquery.resizer.js \ www/script/jquery.suggest.js \ www/script/json2.js \ www/script/jspec/jspec.css \ www/script/jspec/jspec.jquery.js \ www/script/jspec/jspec.js \ www/script/jspec/jspec.xhr.js \ www/script/oauth.js \ www/script/sha1.js \ www/script/base64.js \ www/script/test/all_docs.js \ www/script/test/attachments.js \ www/script/test/attachments_multipart.js \ www/script/test/attachment_names.js \ www/script/test/attachment_paths.js \ www/script/test/attachment_ranges.js \ www/script/test/attachment_views.js \ www/script/test/auth_cache.js \ www/script/test/basics.js \ www/script/test/batch_save.js \ www/script/test/bulk_docs.js \ www/script/test/changes.js \ www/script/test/coffee.js \ www/script/test/compact.js \ www/script/test/config.js \ www/script/test/conflicts.js \ www/script/test/content_negotiation.js \ www/script/test/cookie_auth.js \ www/script/test/copy_doc.js \ www/script/test/delayed_commits.js \ www/script/test/design_docs.js \ www/script/test/design_options.js \ www/script/test/design_paths.js \ www/script/test/erlang_views.js \ www/script/test/etags_head.js \ www/script/test/etags_views.js \ www/script/test/form_submit.js \ www/script/test/http.js \ www/script/test/invalid_docids.js \ www/script/test/jsonp.js \ www/script/test/large_docs.js \ www/script/test/list_views.js \ www/script/test/lorem.txt \ www/script/test/lorem_b64.txt \ www/script/test/lots_of_docs.js \ www/script/test/method_override.js \ www/script/test/multiple_rows.js \ www/script/test/oauth.js \ www/script/test/oauth_users_db.js \ www/script/test/proxyauth.js \ www/script/test/purge.js \ www/script/test/reader_acl.js \ www/script/test/recreate_doc.js \ www/script/test/reduce.js \ www/script/test/reduce_builtin.js \ www/script/test/reduce_false.js \ www/script/test/reduce_false_temp.js \ www/script/test/replication.js \ www/script/replicator_db_inc.js \ www/script/test/replicator_db_bad_rep_id.js \ www/script/test/replicator_db_by_doc_id.js \ www/script/test/replicator_db_compact_rep_db.js \ www/script/test/replicator_db_continuous.js \ www/script/test/replicator_db_credential_delegation.js \ www/script/test/replicator_db_field_validation.js \ www/script/test/replicator_db_filtered.js \ www/script/test/replicator_db_identical.js \ www/script/test/replicator_db_identical_continuous.js \ www/script/test/replicator_db_invalid_filter.js \ www/script/test/replicator_db_security.js \ www/script/test/replicator_db_simple.js \ www/script/test/replicator_db_successive.js \ www/script/test/replicator_db_survives.js \ www/script/test/replicator_db_swap_rep_db.js \ www/script/test/replicator_db_update_security.js \ www/script/test/replicator_db_user_ctx.js \ www/script/test/replicator_db_write_auth.js \ www/script/test/rev_stemming.js \ www/script/test/rewrite.js \ www/script/test/security_validation.js \ www/script/test/show_documents.js \ www/script/test/stats.js \ www/script/test/update_documents.js \ www/script/test/users_db.js \ www/script/test/users_db_security.js \ www/script/test/utf8.js \ www/script/test/uuids.js \ www/script/test/view_collation.js \ www/script/test/view_collation_raw.js \ www/script/test/view_conflicts.js \ www/script/test/view_compaction.js \ www/script/test/view_errors.js \ www/script/test/view_include_docs.js \ www/script/test/view_multi_key_all_docs.js \ www/script/test/view_multi_key_design.js \ www/script/test/view_multi_key_temp.js \ www/script/test/view_offsets.js \ www/script/test/view_update_seq.js \ www/script/test/view_pagination.js \ www/script/test/view_sandboxing.js \ www/spec/couch_js_class_methods_spec.js \ www/spec/couch_js_instance_methods_1_spec.js \ www/spec/couch_js_instance_methods_2_spec.js \ www/spec/couch_js_instance_methods_3_spec.js \ www/spec/custom_helpers.js \ www/spec/jquery_couch_js_class_methods_spec.js \ www/spec/jquery_couch_js_instance_methods_1_spec.js \ www/spec/jquery_couch_js_instance_methods_2_spec.js \ www/spec/jquery_couch_js_instance_methods_3_spec.js \ www/spec/run.html \ www/status.html \ www/style/jquery-ui-1.8.11.custom.css \ www/style/layout.css \ www/verify_install.html \ www/_sidebar.html apache-couchdb-1.6.0/share/Makefile.in0000644000175000001440000010021512332105550017465 0ustar00djcusers00000000000000# Makefile.in generated by automake 1.11.6 from Makefile.am. # @configure_input@ # Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, # 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011 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__make_dryrun = \ { \ am__dry=no; \ case $$MAKEFLAGS in \ *\\[\ \ ]*) \ echo 'am--echo: ; @echo "AM" OK' | $(MAKE) -f - 2>/dev/null \ | grep '^AM OK$$' >/dev/null || am__dry=yes;; \ *) \ for am__flg in $$MAKEFLAGS; do \ case $$am__flg in \ *=*|--*) ;; \ *n*) am__dry=yes; break;; \ esac; \ done;; \ esac; \ test $$am__dry = yes; \ } 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 = share DIST_COMMON = $(nobase_dist_localdata_DATA) $(srcdir)/Makefile.am \ $(srcdir)/Makefile.in ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 am__aclocal_m4_deps = $(top_srcdir)/m4/libtool.m4 \ $(top_srcdir)/m4/ltoptions.m4 $(top_srcdir)/m4/ltsugar.m4 \ $(top_srcdir)/m4/ltversion.m4 $(top_srcdir)/m4/lt~obsolete.m4 \ $(top_srcdir)/acinclude.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 \ $(top_builddir)/src/snappy/google-snappy/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)$(localdatadir)" \ "$(DESTDIR)$(localdatadir)" SCRIPTS = $(nobase_localdata_SCRIPTS) SOURCES = DIST_SOURCES = RECURSIVE_TARGETS = all-recursive check-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 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 = $(nobase_dist_localdata_DATA) RECURSIVE_CLEAN_TARGETS = mostlyclean-recursive clean-recursive \ distclean-recursive maintainer-clean-recursive AM_RECURSIVE_TARGETS = $(RECURSIVE_TARGETS:-recursive=) \ $(RECURSIVE_CLEAN_TARGETS:-recursive=) tags TAGS ctags CTAGS \ distdir 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@ AMTAR = @AMTAR@ AR = @AR@ AS = @AS@ AUTOCONF = @AUTOCONF@ AUTOHEADER = @AUTOHEADER@ AUTOMAKE = @AUTOMAKE@ AWK = @AWK@ CC = @CC@ CCDEPMODE = @CCDEPMODE@ CFLAGS = @CFLAGS@ CPP = @CPP@ CPPFLAGS = @CPPFLAGS@ CURL_CFLAGS = @CURL_CFLAGS@ CURL_CONFIG = @CURL_CONFIG@ CURL_LIBS = @CURL_LIBS@ CXX = @CXX@ CXXCPP = @CXXCPP@ CXXDEPMODE = @CXXDEPMODE@ CXXFLAGS = @CXXFLAGS@ CYGPATH_W = @CYGPATH_W@ DEFS = @DEFS@ DEPDIR = @DEPDIR@ DLLTOOL = @DLLTOOL@ DSYMUTIL = @DSYMUTIL@ DUMPBIN = @DUMPBIN@ ECHO_C = @ECHO_C@ ECHO_N = @ECHO_N@ ECHO_T = @ECHO_T@ EGREP = @EGREP@ ERL = @ERL@ ERLANG_FLAGS = @ERLANG_FLAGS@ ERLC = @ERLC@ ERLC_FLAGS = @ERLC_FLAGS@ ESCRIPT = @ESCRIPT@ EXEEXT = @EXEEXT@ FGREP = @FGREP@ FLAGS = @FLAGS@ GREP = @GREP@ HAS_HELP2MAN = @HAS_HELP2MAN@ HAS_INSTALLINFO = @HAS_INSTALLINFO@ HAS_MAKEINFO = @HAS_MAKEINFO@ HAS_PDFLATEX = @HAS_PDFLATEX@ HAS_SPHINX_BUILD = @HAS_SPHINX_BUILD@ ICU_BIN = @ICU_BIN@ ICU_CFLAGS = @ICU_CFLAGS@ ICU_CONFIG = @ICU_CONFIG@ ICU_CPPFLAGS = @ICU_CPPFLAGS@ ICU_CXXFLAGS = @ICU_CXXFLAGS@ ICU_LIBS = @ICU_LIBS@ INNO_COMPILER_EXECUTABLE = @INNO_COMPILER_EXECUTABLE@ INSTALL = @INSTALL@ INSTALL_DATA = @INSTALL_DATA@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ INSTALL_SCRIPT = @INSTALL_SCRIPT@ INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ JS_CFLAGS = @JS_CFLAGS@ JS_LIBS = @JS_LIBS@ JS_LIB_BINARY = @JS_LIB_BINARY@ LD = @LD@ LDFLAGS = @LDFLAGS@ LIBOBJS = @LIBOBJS@ LIBS = @LIBS@ LIBTOOL = @LIBTOOL@ LIPO = @LIPO@ LN_S = @LN_S@ LTLIBOBJS = @LTLIBOBJS@ MAKEINFO = @MAKEINFO@ MANIFEST_TOOL = @MANIFEST_TOOL@ MKDIR_P = @MKDIR_P@ NM = @NM@ NMEDIT = @NMEDIT@ OBJDUMP = @OBJDUMP@ OBJEXT = @OBJEXT@ OTOOL = @OTOOL@ OTOOL64 = @OTOOL64@ PACKAGE = @PACKAGE@ PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ PACKAGE_NAME = @PACKAGE_NAME@ PACKAGE_STRING = @PACKAGE_STRING@ PACKAGE_TARNAME = @PACKAGE_TARNAME@ PACKAGE_URL = @PACKAGE_URL@ PACKAGE_VERSION = @PACKAGE_VERSION@ PATH_SEPARATOR = @PATH_SEPARATOR@ PKG_CONFIG = @PKG_CONFIG@ PKG_CONFIG_LIBDIR = @PKG_CONFIG_LIBDIR@ PKG_CONFIG_PATH = @PKG_CONFIG_PATH@ RANLIB = @RANLIB@ SED = @SED@ SET_MAKE = @SET_MAKE@ SHELL = @SHELL@ SNAPPY_MAJOR = @SNAPPY_MAJOR@ SNAPPY_MINOR = @SNAPPY_MINOR@ SNAPPY_PATCHLEVEL = @SNAPPY_PATCHLEVEL@ STRIP = @STRIP@ VERSION = @VERSION@ 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@ ac_cv_have_stddef_h = @ac_cv_have_stddef_h@ ac_cv_have_stdint_h = @ac_cv_have_stdint_h@ am__include = @am__include@ am__leading_dot = @am__leading_dot@ am__quote = @am__quote@ am__tar = @am__tar@ am__untar = @am__untar@ bindir = @bindir@ bug_uri = @bug_uri@ 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@ dvidir = @dvidir@ erlangbin = @erlangbin@ erlangversion = @erlangversion@ exec_prefix = @exec_prefix@ host = @host@ host_alias = @host_alias@ host_cpu = @host_cpu@ host_os = @host_os@ host_vendor = @host_vendor@ htmldir = @htmldir@ includedir = @includedir@ infodir = @infodir@ initdir = @initdir@ install_sh = @install_sh@ launchddir = @launchddir@ libdir = @libdir@ libexecdir = @libexecdir@ localconfdir = @localconfdir@ localdatadir = @localdatadir@ localdocdir = @localdocdir@ localedir = @localedir@ localerlanglibdir = @localerlanglibdir@ locallibbindir = @locallibbindir@ locallibdir = @locallibdir@ localstatedir = @localstatedir@ localstatelibdir = @localstatelibdir@ localstatelogdir = @localstatelogdir@ localstaterundir = @localstaterundir@ mandir = @mandir@ mkdir_p = @mkdir_p@ msvc_redist_dir = @msvc_redist_dir@ msvc_redist_name = @msvc_redist_name@ oldincludedir = @oldincludedir@ openssl_bin_dir = @openssl_bin_dir@ otp_release = @otp_release@ package_author_address = @package_author_address@ package_author_name = @package_author_name@ package_identifier = @package_identifier@ package_name = @package_name@ package_tarname = @package_tarname@ 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@ version = @version@ version_major = @version_major@ version_minor = @version_minor@ version_release = @version_release@ version_revision = @version_revision@ version_stage = @version_stage@ SUBDIRS = doc JS_FILE = server/main.js JS_FILE_COMPONENTS = \ server/json2.js \ server/filter.js \ server/mimeparse.js \ server/render.js \ server/state.js \ server/util.js \ server/validate.js \ server/views.js JS_FILE_COMPONENTS_LAST = server/loop.js COFFEE_FILE = server/main-coffee.js COFFEE_FILE_COMPONENTS_LAST = server/coffee-script.js server/loop.js CLEANFILES = $(JS_FILE) $(COFFEE_FILE) EXTRA_DIST = $(JS_FILE_COMPONENTS) $(JS_FILE_COMPONENTS_LAST) $(COFFEE_FILE_COMPONENTS_LAST) nobase_localdata_SCRIPTS = \ $(JS_FILE) \ $(COFFEE_FILE) nobase_dist_localdata_DATA = \ www/config.html \ www/couch_tests.html \ www/custom_test.html \ www/database.html \ www/session.html \ www/dialog/_admin_party.html \ www/dialog/_change_password.html \ www/dialog/_compact_cleanup.html \ www/dialog/_create_admin.html \ www/dialog/_login.html \ www/dialog/_signup.html \ www/dialog/_create_database.html \ www/dialog/_create_config.html \ www/dialog/_delete_database.html \ www/dialog/_delete_document.html \ www/dialog/_database_security.html \ www/dialog/_share_test_reports.html \ www/dialog/_save_view_as.html \ www/dialog/_upload_attachment.html \ www/document.html \ www/fauxton/css/index.css \ www/fauxton/img/couchdb-site.png \ www/fauxton/img/couchdblogo.png \ www/fauxton/img/fontawesome-webfont.eot \ www/fauxton/img/fontawesome-webfont.svg \ www/fauxton/img/fontawesome-webfont.ttf \ www/fauxton/img/fontawesome-webfont.woff \ www/fauxton/img/FontAwesome.otf \ www/fauxton/img/fontcustom_fauxton.eot \ www/fauxton/img/fontcustom_fauxton.svg \ www/fauxton/img/fontcustom_fauxton.ttf \ www/fauxton/img/fontcustom_fauxton.woff \ www/fauxton/img/glyphicons-halflings-white.png \ www/fauxton/img/glyphicons-halflings.png \ www/fauxton/img/linen.png \ www/fauxton/img/loader.gif \ www/fauxton/img/minilogo.png \ www/fauxton/index.html \ www/fauxton/js/require.js \ www/fauxton/js/ace/mode-javascript.js \ www/fauxton/js/ace/mode-json.js \ www/fauxton/js/ace/theme-crimson_editor.js \ www/fauxton/js/ace/worker-javascript.js \ www/fauxton/js/ace/worker-json.js \ www/favicon.ico \ www/image/add.png \ www/image/apply.gif \ www/image/bg.png \ www/image/cancel.gif \ www/image/compact.png \ www/image/delete-mini.png \ www/image/delete.png \ www/image/grippie.gif \ www/image/hgrad.gif \ www/image/key.png \ www/image/load.png \ www/image/logo.png \ www/image/order-asc.gif \ www/image/order-desc.gif \ www/image/path.gif \ www/image/progress.gif \ www/image/rarrow.png \ www/image/run-mini.png \ www/image/run.png \ www/image/running.png \ www/image/save.png \ www/image/sidebar-toggle.png \ www/image/spinner.gif \ www/image/spinner_33.gif \ www/image/spinner_6b.gif \ www/image/test_failure.gif \ www/image/test_success.gif \ www/image/thead-key.gif \ www/image/thead.gif \ www/image/toggle-collapse.gif \ www/image/toggle-expand.gif \ www/image/twisty.gif \ www/index.html \ www/plugins.html \ www/replicator.html \ www/script/couch.js \ www/script/couch_tests.js \ www/script/couch_test_runner.js \ www/script/futon.browse.js \ www/script/futon.format.js \ www/script/futon.js \ www/script/jquery.couch.js \ www/script/jquery.dialog.js \ www/script/jquery.editinline.js \ www/script/jquery.form.js \ www/script/jquery.js \ www/script/jquery-ui-1.8.11.custom.min.js \ www/script/jquery.resizer.js \ www/script/jquery.suggest.js \ www/script/json2.js \ www/script/jspec/jspec.css \ www/script/jspec/jspec.jquery.js \ www/script/jspec/jspec.js \ www/script/jspec/jspec.xhr.js \ www/script/oauth.js \ www/script/sha1.js \ www/script/base64.js \ www/script/test/all_docs.js \ www/script/test/attachments.js \ www/script/test/attachments_multipart.js \ www/script/test/attachment_names.js \ www/script/test/attachment_paths.js \ www/script/test/attachment_ranges.js \ www/script/test/attachment_views.js \ www/script/test/auth_cache.js \ www/script/test/basics.js \ www/script/test/batch_save.js \ www/script/test/bulk_docs.js \ www/script/test/changes.js \ www/script/test/coffee.js \ www/script/test/compact.js \ www/script/test/config.js \ www/script/test/conflicts.js \ www/script/test/content_negotiation.js \ www/script/test/cookie_auth.js \ www/script/test/copy_doc.js \ www/script/test/delayed_commits.js \ www/script/test/design_docs.js \ www/script/test/design_options.js \ www/script/test/design_paths.js \ www/script/test/erlang_views.js \ www/script/test/etags_head.js \ www/script/test/etags_views.js \ www/script/test/form_submit.js \ www/script/test/http.js \ www/script/test/invalid_docids.js \ www/script/test/jsonp.js \ www/script/test/large_docs.js \ www/script/test/list_views.js \ www/script/test/lorem.txt \ www/script/test/lorem_b64.txt \ www/script/test/lots_of_docs.js \ www/script/test/method_override.js \ www/script/test/multiple_rows.js \ www/script/test/oauth.js \ www/script/test/oauth_users_db.js \ www/script/test/proxyauth.js \ www/script/test/purge.js \ www/script/test/reader_acl.js \ www/script/test/recreate_doc.js \ www/script/test/reduce.js \ www/script/test/reduce_builtin.js \ www/script/test/reduce_false.js \ www/script/test/reduce_false_temp.js \ www/script/test/replication.js \ www/script/replicator_db_inc.js \ www/script/test/replicator_db_bad_rep_id.js \ www/script/test/replicator_db_by_doc_id.js \ www/script/test/replicator_db_compact_rep_db.js \ www/script/test/replicator_db_continuous.js \ www/script/test/replicator_db_credential_delegation.js \ www/script/test/replicator_db_field_validation.js \ www/script/test/replicator_db_filtered.js \ www/script/test/replicator_db_identical.js \ www/script/test/replicator_db_identical_continuous.js \ www/script/test/replicator_db_invalid_filter.js \ www/script/test/replicator_db_security.js \ www/script/test/replicator_db_simple.js \ www/script/test/replicator_db_successive.js \ www/script/test/replicator_db_survives.js \ www/script/test/replicator_db_swap_rep_db.js \ www/script/test/replicator_db_update_security.js \ www/script/test/replicator_db_user_ctx.js \ www/script/test/replicator_db_write_auth.js \ www/script/test/rev_stemming.js \ www/script/test/rewrite.js \ www/script/test/security_validation.js \ www/script/test/show_documents.js \ www/script/test/stats.js \ www/script/test/update_documents.js \ www/script/test/users_db.js \ www/script/test/users_db_security.js \ www/script/test/utf8.js \ www/script/test/uuids.js \ www/script/test/view_collation.js \ www/script/test/view_collation_raw.js \ www/script/test/view_conflicts.js \ www/script/test/view_compaction.js \ www/script/test/view_errors.js \ www/script/test/view_include_docs.js \ www/script/test/view_multi_key_all_docs.js \ www/script/test/view_multi_key_design.js \ www/script/test/view_multi_key_temp.js \ www/script/test/view_offsets.js \ www/script/test/view_update_seq.js \ www/script/test/view_pagination.js \ www/script/test/view_sandboxing.js \ www/spec/couch_js_class_methods_spec.js \ www/spec/couch_js_instance_methods_1_spec.js \ www/spec/couch_js_instance_methods_2_spec.js \ www/spec/couch_js_instance_methods_3_spec.js \ www/spec/custom_helpers.js \ www/spec/jquery_couch_js_class_methods_spec.js \ www/spec/jquery_couch_js_instance_methods_1_spec.js \ www/spec/jquery_couch_js_instance_methods_2_spec.js \ www/spec/jquery_couch_js_instance_methods_3_spec.js \ www/spec/run.html \ www/status.html \ www/style/jquery-ui-1.8.11.custom.css \ www/style/layout.css \ www/verify_install.html \ www/_sidebar.html 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) --foreign share/Makefile'; \ $(am__cd) $(top_srcdir) && \ $(AUTOMAKE) --foreign share/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-nobase_localdataSCRIPTS: $(nobase_localdata_SCRIPTS) @$(NORMAL_INSTALL) @list='$(nobase_localdata_SCRIPTS)'; test -n "$(localdatadir)" || list=; \ if test -n "$$list"; then \ echo " $(MKDIR_P) '$(DESTDIR)$(localdatadir)'"; \ $(MKDIR_P) "$(DESTDIR)$(localdatadir)" || exit 1; \ fi; \ $(am__nobase_strip_setup); \ 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 "s|$$srcdirstrip/||" -e 'h;s|[^/]*$$||; 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 \ case $$type in \ d) echo " $(MKDIR_P) '$(DESTDIR)$(localdatadir)/$$dir'"; \ $(MKDIR_P) "$(DESTDIR)$(localdatadir)/$$dir" || exit $$?;; \ f) \ if test "$$dir" = .; then dir=; else dir=/$$dir; fi; \ test -z "$$files" || { \ echo " $(INSTALL_SCRIPT) $$files '$(DESTDIR)$(localdatadir)$$dir'"; \ $(INSTALL_SCRIPT) $$files "$(DESTDIR)$(localdatadir)$$dir" || exit $$?; \ } \ ;; esac \ ; done uninstall-nobase_localdataSCRIPTS: @$(NORMAL_UNINSTALL) @list='$(nobase_localdata_SCRIPTS)'; test -n "$(localdatadir)" || exit 0; \ $(am__nobase_strip_setup); \ files=`$(am__nobase_strip) \ -e 'h;s,.*/,,;$(transform);x;s|[^/]*$$||;G;s,\n,,'`; \ dir='$(DESTDIR)$(localdatadir)'; $(am__uninstall_files_from_dir) mostlyclean-libtool: -rm -f *.lo clean-libtool: -rm -rf .libs _libs install-nobase_dist_localdataDATA: $(nobase_dist_localdata_DATA) @$(NORMAL_INSTALL) @list='$(nobase_dist_localdata_DATA)'; test -n "$(localdatadir)" || list=; \ if test -n "$$list"; then \ echo " $(MKDIR_P) '$(DESTDIR)$(localdatadir)'"; \ $(MKDIR_P) "$(DESTDIR)$(localdatadir)" || exit 1; \ fi; \ $(am__nobase_list) | while read dir files; do \ xfiles=; for file in $$files; do \ if test -f "$$file"; then xfiles="$$xfiles $$file"; \ else xfiles="$$xfiles $(srcdir)/$$file"; fi; done; \ test -z "$$xfiles" || { \ test "x$$dir" = x. || { \ echo " $(MKDIR_P) '$(DESTDIR)$(localdatadir)/$$dir'"; \ $(MKDIR_P) "$(DESTDIR)$(localdatadir)/$$dir"; }; \ echo " $(INSTALL_DATA) $$xfiles '$(DESTDIR)$(localdatadir)/$$dir'"; \ $(INSTALL_DATA) $$xfiles "$(DESTDIR)$(localdatadir)/$$dir" || exit $$?; }; \ done uninstall-nobase_dist_localdataDATA: @$(NORMAL_UNINSTALL) @list='$(nobase_dist_localdata_DATA)'; test -n "$(localdatadir)" || list=; \ $(am__nobase_strip_setup); files=`$(am__nobase_strip)`; \ dir='$(DESTDIR)$(localdatadir)'; $(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. $(RECURSIVE_TARGETS): @fail= failcom='exit 1'; \ for f in x $$MAKEFLAGS; do \ case $$f in \ *=* | --[!k]*);; \ *k*) failcom='fail=yes';; \ esac; \ done; \ dot_seen=no; \ target=`echo $@ | sed s/-recursive//`; \ list='$(SUBDIRS)'; for subdir in $$list; do \ echo "Making $$target in $$subdir"; \ if test "$$subdir" = "."; then \ dot_seen=yes; \ local_target="$$target-am"; \ else \ local_target="$$target"; \ fi; \ ($(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" $(RECURSIVE_CLEAN_TARGETS): @fail= failcom='exit 1'; \ for f in x $$MAKEFLAGS; do \ case $$f in \ *=* | --[!k]*);; \ *k*) failcom='fail=yes';; \ esac; \ done; \ dot_seen=no; \ case "$@" in \ distclean-* | maintainer-clean-*) list='$(DIST_SUBDIRS)' ;; \ *) list='$(SUBDIRS)' ;; \ esac; \ rev=''; for subdir in $$list; do \ if test "$$subdir" = "."; then :; else \ rev="$$subdir $$rev"; \ fi; \ done; \ rev="$$rev ."; \ target=`echo $@ | sed s/-recursive//`; \ for subdir in $$rev; do \ echo "Making $$target in $$subdir"; \ if test "$$subdir" = "."; then \ local_target="$$target-am"; \ else \ local_target="$$target"; \ fi; \ ($(am__cd) $$subdir && $(MAKE) $(AM_MAKEFLAGS) $$local_target) \ || eval $$failcom; \ done && test -z "$$fail" tags-recursive: list='$(SUBDIRS)'; for subdir in $$list; do \ test "$$subdir" = . || ($(am__cd) $$subdir && $(MAKE) $(AM_MAKEFLAGS) tags); \ done ctags-recursive: list='$(SUBDIRS)'; for subdir in $$list; do \ test "$$subdir" = . || ($(am__cd) $$subdir && $(MAKE) $(AM_MAKEFLAGS) ctags); \ done ID: $(HEADERS) $(SOURCES) $(LISP) $(TAGS_FILES) list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | \ $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ END { if (nonempty) { for (i in files) print i; }; }'`; \ mkid -fID $$unique tags: TAGS TAGS: tags-recursive $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ $(TAGS_FILES) $(LISP) 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; \ list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | \ $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ END { if (nonempty) { for (i in files) print i; }; }'`; \ 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 CTAGS: ctags-recursive $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ $(TAGS_FILES) $(LISP) list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | \ $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ END { if (nonempty) { for (i in files) print i; }; }'`; \ 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" 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 $(SCRIPTS) $(DATA) installdirs: installdirs-recursive installdirs-am: for dir in "$(DESTDIR)$(localdatadir)" "$(DESTDIR)$(localdatadir)"; 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: -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-nobase_dist_localdataDATA \ install-nobase_localdataSCRIPTS 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-nobase_dist_localdataDATA \ uninstall-nobase_localdataSCRIPTS .MAKE: $(RECURSIVE_CLEAN_TARGETS) $(RECURSIVE_TARGETS) ctags-recursive \ install-am install-strip tags-recursive .PHONY: $(RECURSIVE_CLEAN_TARGETS) $(RECURSIVE_TARGETS) CTAGS GTAGS \ all all-am check check-am clean clean-generic clean-libtool \ ctags ctags-recursive 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-nobase_dist_localdataDATA \ install-nobase_localdataSCRIPTS 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-recursive \ uninstall uninstall-am uninstall-nobase_dist_localdataDATA \ uninstall-nobase_localdataSCRIPTS $(JS_FILE): $(JS_FILE_COMPONENTS) $(JS_FILE_COMPONENTS_LAST) mkdir -p `dirname $(JS_FILE)` echo "// DO NOT EDIT THIS FILE BY HAND" > $@ echo >> $@ cat $^ >> $@ $(COFFEE_FILE): $(JS_FILE_COMPONENTS) $(COFFEE_FILE_COMPONENTS_LAST) mkdir -p `dirname $(COFFEE_FILE)` echo "// DO NOT EDIT THIS FILE BY HAND" > $@ echo >> $@ cat $^ >> $@ # 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: apache-couchdb-1.6.0/share/server/0000755000175000001440000000000012332105604016727 5ustar00djcusers00000000000000apache-couchdb-1.6.0/share/server/filter.js0000644000175000001440000000266312332105522020560 0ustar00djcusers00000000000000// Licensed under the Apache License, Version 2.0 (the "License"); you may not // use this file except in compliance with the License. You may obtain a copy of // the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, WITHOUT // WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the // License for the specific language governing permissions and limitations under // the License. var Filter = (function() { var view_emit = false; return { emit : function(key, value) { view_emit = true; }, filter : function(fun, ddoc, args) { var results = []; var docs = args[0]; var req = args[1]; for (var i=0; i < docs.length; i++) { results.push((fun.apply(ddoc, [docs[i], req]) && true) || false); }; respond([true, results]); }, filter_view : function(fun, ddoc, args) { // recompile var source = fun.toSource ? fun.toSource() : '(' + fun.toString() + ')'; fun = evalcx(source, filter_sandbox); var results = []; var docs = args[0]; for (var i=0; i < docs.length; i++) { view_emit = false; fun(docs[i]); results.push((view_emit && true) || false); }; respond([true, results]); } } })(); apache-couchdb-1.6.0/share/server/json2.js0000644000175000001440000004174612332105522020333 0ustar00djcusers00000000000000/* http://www.JSON.org/json2.js 2010-03-20 Public Domain. NO WARRANTY EXPRESSED OR IMPLIED. USE AT YOUR OWN RISK. See http://www.JSON.org/js.html This code should be minified before deployment. See http://javascript.crockford.com/jsmin.html USE YOUR OWN COPY. IT IS EXTREMELY UNWISE TO LOAD CODE FROM SERVERS YOU DO NOT CONTROL. This file creates a global JSON object containing two methods: stringify and parse. JSON.stringify(value, replacer, space) value any JavaScript value, usually an object or array. replacer an optional parameter that determines how object values are stringified for objects. It can be a function or an array of strings. space an optional parameter that specifies the indentation of nested structures. If it is omitted, the text will be packed without extra whitespace. If it is a number, it will specify the number of spaces to indent at each level. If it is a string (such as '\t' or ' '), it contains the characters used to indent at each level. This method produces a JSON text from a JavaScript value. When an object value is found, if the object contains a toJSON method, its toJSON method will be called and the result will be stringified. A toJSON method does not serialize: it returns the value represented by the name/value pair that should be serialized, or undefined if nothing should be serialized. The toJSON method will be passed the key associated with the value, and this will be bound to the value For example, this would serialize Dates as ISO strings. Date.prototype.toJSON = function (key) { function f(n) { // Format integers to have at least two digits. return n < 10 ? '0' + n : n; } return this.getUTCFullYear() + '-' + f(this.getUTCMonth() + 1) + '-' + f(this.getUTCDate()) + 'T' + f(this.getUTCHours()) + ':' + f(this.getUTCMinutes()) + ':' + f(this.getUTCSeconds()) + 'Z'; }; You can provide an optional replacer method. It will be passed the key and value of each member, with this bound to the containing object. The value that is returned from your method will be serialized. If your method returns undefined, then the member will be excluded from the serialization. If the replacer parameter is an array of strings, then it will be used to select the members to be serialized. It filters the results such that only members with keys listed in the replacer array are stringified. Values that do not have JSON representations, such as undefined or functions, will not be serialized. Such values in objects will be dropped; in arrays they will be replaced with null. You can use a replacer function to replace those with JSON values. JSON.stringify(undefined) returns undefined. The optional space parameter produces a stringification of the value that is filled with line breaks and indentation to make it easier to read. If the space parameter is a non-empty string, then that string will be used for indentation. If the space parameter is a number, then the indentation will be that many spaces. Example: text = JSON.stringify(['e', {pluribus: 'unum'}]); // text is '["e",{"pluribus":"unum"}]' text = JSON.stringify(['e', {pluribus: 'unum'}], null, '\t'); // text is '[\n\t"e",\n\t{\n\t\t"pluribus": "unum"\n\t}\n]' text = JSON.stringify([new Date()], function (key, value) { return this[key] instanceof Date ? 'Date(' + this[key] + ')' : value; }); // text is '["Date(---current time---)"]' JSON.parse(text, reviver) This method parses a JSON text to produce an object or array. It can throw a SyntaxError exception. The optional reviver parameter is a function that can filter and transform the results. It receives each of the keys and values, and its return value is used instead of the original value. If it returns what it received, then the structure is not modified. If it returns undefined then the member is deleted. Example: // Parse the text. Values that look like ISO date strings will // be converted to Date objects. myData = JSON.parse(text, function (key, value) { var a; if (typeof value === 'string') { a = /^(\d{4})-(\d{2})-(\d{2})T(\d{2}):(\d{2}):(\d{2}(?:\.\d*)?)Z$/.exec(value); if (a) { return new Date(Date.UTC(+a[1], +a[2] - 1, +a[3], +a[4], +a[5], +a[6])); } } return value; }); myData = JSON.parse('["Date(09/09/2001)"]', function (key, value) { var d; if (typeof value === 'string' && value.slice(0, 5) === 'Date(' && value.slice(-1) === ')') { d = new Date(value.slice(5, -1)); if (d) { return d; } } return value; }); This is a reference implementation. You are free to copy, modify, or redistribute. */ /*jslint evil: true, strict: false */ /*members "", "\b", "\t", "\n", "\f", "\r", "\"", JSON, "\\", apply, call, charCodeAt, getUTCDate, getUTCFullYear, getUTCHours, getUTCMinutes, getUTCMonth, getUTCSeconds, hasOwnProperty, join, lastIndex, length, parse, prototype, push, replace, slice, stringify, test, toJSON, toString, valueOf */ // Create a JSON object only if one does not already exist. We create the // methods in a closure to avoid creating global variables. if (!this.JSON) { this.JSON = {}; } (function () { function f(n) { // Format integers to have at least two digits. return n < 10 ? '0' + n : n; } if (typeof Date.prototype.toJSON !== 'function') { Date.prototype.toJSON = function (key) { return isFinite(this.valueOf()) ? this.getUTCFullYear() + '-' + f(this.getUTCMonth() + 1) + '-' + f(this.getUTCDate()) + 'T' + f(this.getUTCHours()) + ':' + f(this.getUTCMinutes()) + ':' + f(this.getUTCSeconds()) + 'Z' : null; }; String.prototype.toJSON = Number.prototype.toJSON = Boolean.prototype.toJSON = function (key) { return this.valueOf(); }; } var cx = /[\u0000\u00ad\u0600-\u0604\u070f\u17b4\u17b5\u200c-\u200f\u2028-\u202f\u2060-\u206f\ufeff\ufff0-\uffff]/g, escapable = /[\\\"\x00-\x1f\x7f-\x9f\u00ad\u0600-\u0604\u070f\u17b4\u17b5\u200c-\u200f\u2028-\u202f\u2060-\u206f\ufeff\ufff0-\uffff]/g, gap, indent, meta = { // table of character substitutions '\b': '\\b', '\t': '\\t', '\n': '\\n', '\f': '\\f', '\r': '\\r', '"' : '\\"', '\\': '\\\\' }, rep; function quote(string) { // If the string contains no control characters, no quote characters, and no // backslash characters, then we can safely slap some quotes around it. // Otherwise we must also replace the offending characters with safe escape // sequences. escapable.lastIndex = 0; return escapable.test(string) ? '"' + string.replace(escapable, function (a) { var c = meta[a]; return typeof c === 'string' ? c : '\\u' + ('0000' + a.charCodeAt(0).toString(16)).slice(-4); }) + '"' : '"' + string + '"'; } function str(key, holder) { // Produce a string from holder[key]. var i, // The loop counter. k, // The member key. v, // The member value. length, mind = gap, partial, value = holder[key]; // If the value has a toJSON method, call it to obtain a replacement value. if (value && typeof value === 'object' && typeof value.toJSON === 'function') { value = value.toJSON(key); } // If we were called with a replacer function, then call the replacer to // obtain a replacement value. if (typeof rep === 'function') { value = rep.call(holder, key, value); } // What happens next depends on the value's type. switch (typeof value) { case 'string': return quote(value); case 'number': // JSON numbers must be finite. Encode non-finite numbers as null. return isFinite(value) ? String(value) : 'null'; case 'boolean': case 'null': // If the value is a boolean or null, convert it to a string. Note: // typeof null does not produce 'null'. The case is included here in // the remote chance that this gets fixed someday. return String(value); // If the type is 'object', we might be dealing with an object or an array or // null. case 'object': // Due to a specification blunder in ECMAScript, typeof null is 'object', // so watch out for that case. if (!value) { return 'null'; } // Make an array to hold the partial results of stringifying this object value. gap += indent; partial = []; // Is the value an array? if (Object.prototype.toString.apply(value) === '[object Array]') { // The value is an array. Stringify every element. Use null as a placeholder // for non-JSON values. length = value.length; for (i = 0; i < length; i += 1) { partial[i] = str(i, value) || 'null'; } // Join all of the elements together, separated with commas, and wrap them in // brackets. v = partial.length === 0 ? '[]' : gap ? '[\n' + gap + partial.join(',\n' + gap) + '\n' + mind + ']' : '[' + partial.join(',') + ']'; gap = mind; return v; } // If the replacer is an array, use it to select the members to be stringified. if (rep && typeof rep === 'object') { length = rep.length; for (i = 0; i < length; i += 1) { k = rep[i]; if (typeof k === 'string') { v = str(k, value); if (v) { partial.push(quote(k) + (gap ? ': ' : ':') + v); } } } } else { // Otherwise, iterate through all of the keys in the object. for (k in value) { if (Object.hasOwnProperty.call(value, k)) { v = str(k, value); if (v) { partial.push(quote(k) + (gap ? ': ' : ':') + v); } } } } // Join all of the member texts together, separated with commas, // and wrap them in braces. v = partial.length === 0 ? '{}' : gap ? '{\n' + gap + partial.join(',\n' + gap) + '\n' + mind + '}' : '{' + partial.join(',') + '}'; gap = mind; return v; } } // If the JSON object does not yet have a stringify method, give it one. if (typeof JSON.stringify !== 'function') { JSON.stringify = function (value, replacer, space) { // The stringify method takes a value and an optional replacer, and an optional // space parameter, and returns a JSON text. The replacer can be a function // that can replace values, or an array of strings that will select the keys. // A default replacer method can be provided. Use of the space parameter can // produce text that is more easily readable. var i; gap = ''; indent = ''; // If the space parameter is a number, make an indent string containing that // many spaces. if (typeof space === 'number') { for (i = 0; i < space; i += 1) { indent += ' '; } // If the space parameter is a string, it will be used as the indent string. } else if (typeof space === 'string') { indent = space; } // If there is a replacer, it must be a function or an array. // Otherwise, throw an error. rep = replacer; if (replacer && typeof replacer !== 'function' && (typeof replacer !== 'object' || typeof replacer.length !== 'number')) { throw new Error('JSON.stringify'); } // Make a fake root object containing our value under the key of ''. // Return the result of stringifying the value. return str('', {'': value}); }; } // If the JSON object does not yet have a parse method, give it one. if (typeof JSON.parse !== 'function') { JSON.parse = function (text, reviver) { // The parse method takes a text and an optional reviver function, and returns // a JavaScript value if the text is a valid JSON text. var j; function walk(holder, key) { // The walk method is used to recursively walk the resulting structure so // that modifications can be made. var k, v, value = holder[key]; if (value && typeof value === 'object') { for (k in value) { if (Object.hasOwnProperty.call(value, k)) { v = walk(value, k); if (v !== undefined) { value[k] = v; } else { delete value[k]; } } } } return reviver.call(holder, key, value); } // Parsing happens in four stages. In the first stage, we replace certain // Unicode characters with escape sequences. JavaScript handles many characters // incorrectly, either silently deleting them, or treating them as line endings. text = String(text); cx.lastIndex = 0; if (cx.test(text)) { text = text.replace(cx, function (a) { return '\\u' + ('0000' + a.charCodeAt(0).toString(16)).slice(-4); }); } // In the second stage, we run the text against regular expressions that look // for non-JSON patterns. We are especially concerned with '()' and 'new' // because they can cause invocation, and '=' because it can cause mutation. // But just to be safe, we want to reject all unexpected forms. // We split the second stage into 4 regexp operations in order to work around // crippling inefficiencies in IE's and Safari's regexp engines. First we // replace the JSON backslash pairs with '@' (a non-JSON character). Second, we // replace all simple value tokens with ']' characters. Third, we delete all // open brackets that follow a colon or comma or that begin the text. Finally, // we look to see that the remaining characters are only whitespace or ']' or // ',' or ':' or '{' or '}'. If that is so, then the text is safe for eval. if (/^[\],:{}\s]*$/. test(text.replace(/\\(?:["\\\/bfnrt]|u[0-9a-fA-F]{4})/g, '@'). replace(/"[^"\\\n\r]*"|true|false|null|-?\d+(?:\.\d*)?(?:[eE][+\-]?\d+)?/g, ']'). replace(/(?:^|:|,)(?:\s*\[)+/g, ''))) { // In the third stage we use the eval function to compile the text into a // JavaScript structure. The '{' operator is subject to a syntactic ambiguity // in JavaScript: it can begin a block or an object literal. We wrap the text // in parens to eliminate the ambiguity. j = eval('(' + text + ')'); // In the optional fourth stage, we recursively walk the new structure, passing // each name/value pair to a reviver function for possible transformation. return typeof reviver === 'function' ? walk({'': j}, '') : j; } // If the text is not JSON parseable, then a SyntaxError is thrown. throw new SyntaxError('JSON.parse'); }; } }()); apache-couchdb-1.6.0/share/server/loop.js0000644000175000001440000001202112332105522020231 0ustar00djcusers00000000000000// Licensed under the Apache License, Version 2.0 (the "License"); you may not // use this file except in compliance with the License. You may obtain a copy of // the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, WITHOUT // WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the // License for the specific language governing permissions and limitations under // the License. var sandbox = null; var filter_sandbox = null; function init_sandbox() { try { // if possible, use evalcx (not always available) sandbox = evalcx(''); sandbox.emit = Views.emit; sandbox.sum = Views.sum; sandbox.log = log; sandbox.toJSON = Couch.toJSON; sandbox.JSON = JSON; sandbox.provides = Mime.provides; sandbox.registerType = Mime.registerType; sandbox.start = Render.start; sandbox.send = Render.send; sandbox.getRow = Render.getRow; sandbox.isArray = isArray; } catch (e) { //log(e.toSource()); } }; init_sandbox(); function init_filter_sandbox() { try { filter_sandbox = evalcx(''); for (var p in sandbox) { if (sandbox.hasOwnProperty(p)) { filter_sandbox[p] = sandbox[p]; } } filter_sandbox.emit = Filter.emit; } catch(e) { log(e.toSource ? e.toSource() : e.stack); } }; init_filter_sandbox(); // Commands are in the form of json arrays: // ["commandname",..optional args...]\n // // Responses are json values followed by a new line ("\n") var DDoc = (function() { var ddoc_dispatch = { "lists" : Render.list, "shows" : Render.show, "filters" : Filter.filter, "views" : Filter.filter_view, "updates" : Render.update, "validate_doc_update" : Validate.validate }; var ddocs = {}; return { ddoc : function() { var args = []; for (var i=0; i < arguments.length; i++) { args.push(arguments[i]); }; var ddocId = args.shift(); if (ddocId == "new") { // get the real ddocId. ddocId = args.shift(); // store the ddoc, functions are lazily compiled. ddocs[ddocId] = args.shift(); print("true"); } else { // Couch makes sure we know this ddoc already. var ddoc = ddocs[ddocId]; if (!ddoc) throw(["fatal", "query_protocol_error", "uncached design doc: "+ddocId]); var funPath = args.shift(); var cmd = funPath[0]; // the first member of the fun path determines the type of operation var funArgs = args.shift(); if (ddoc_dispatch[cmd]) { // get the function, call the command with it var point = ddoc; for (var i=0; i < funPath.length; i++) { if (i+1 == funPath.length) { var fun = point[funPath[i]]; if (!fun) { throw(["error","not_found", "missing " + funPath[0] + " function " + funPath[i] + " on design doc " + ddocId]); } if (typeof fun != "function") { fun = Couch.compileFunction(fun, ddoc, funPath.join('.')); // cache the compiled fun on the ddoc point[funPath[i]] = fun; }; } else { point = point[funPath[i]]; } }; // run the correct responder with the cmd body ddoc_dispatch[cmd].apply(null, [fun, ddoc, funArgs]); } else { // unknown command, quit and hope the restarted version is better throw(["fatal", "unknown_command", "unknown ddoc command '" + cmd + "'"]); } } } }; })(); var Loop = function() { var line, cmd, cmdkey, dispatch = { "ddoc" : DDoc.ddoc, // "view" : Views.handler, "reset" : State.reset, "add_fun" : State.addFun, "add_lib" : State.addLib, "map_doc" : Views.mapDoc, "reduce" : Views.reduce, "rereduce" : Views.rereduce }; function handleError(e) { var type = e[0]; if (type == "fatal") { e[0] = "error"; // we tell the client it was a fatal error by dying respond(e); quit(-1); } else if (type == "error") { respond(e); } else if (e.error && e.reason) { // compatibility with old error format respond(["error", e.error, e.reason]); } else if (e.name) { respond(["error", e.name, e]); } else { respond(["error","unnamed_error",e.toSource ? e.toSource() : e.stack]); } }; while (line = readline()) { cmd = JSON.parse(line); State.line_length = line.length; try { cmdkey = cmd.shift(); if (dispatch[cmdkey]) { // run the correct responder with the cmd body dispatch[cmdkey].apply(null, cmd); } else { // unknown command, quit and hope the restarted version is better throw(["fatal", "unknown_command", "unknown command '" + cmdkey + "'"]); } } catch(e) { handleError(e); } }; }; Loop(); apache-couchdb-1.6.0/share/server/coffee-script.js0000644000175000001440000051174412332105522022031 0ustar00djcusers00000000000000/** * CoffeeScript Compiler v1.2.0 * http://coffeescript.org * * Copyright 2011, Jeremy Ashkenas * Released under the MIT License */ (function(root){var CoffeeScript=function(){function require(a){return require[a]}require["./helpers"]=new function(){var a=this;(function(){var b,c;a.starts=function(a,b,c){return b===a.substr(c,b.length)},a.ends=function(a,b,c){var d;d=b.length;return b===a.substr(a.length-d-(c||0),d)},a.compact=function(a){var b,c,d,e;e=[];for(c=0,d=a.length;c=0)f+=1;else if(j=g[0],t.call(d,j)>=0)f-=1;a+=1}return a-1},a.prototype.removeLeadingNewlines=function(){var a,b,c,d;d=this.tokens;for(a=0,c=d.length;a=0)))return 1;d.splice(b,1);return 0})},a.prototype.closeOpenCalls=function(){var a,b;b=function(a,b){var c;return(c=a[0])===")"||c==="CALL_END"||a[0]==="OUTDENT"&&this.tag(b-1)===")"},a=function(a,b){return this.tokens[a[0]==="OUTDENT"?b-1:b][0]="CALL_END"};return this.scanTokens(function(c,d){c[0]==="CALL_START"&&this.detectEnd(d+1,b,a);return 1})},a.prototype.closeOpenIndexes=function(){var a,b;b=function(a,b){var c;return(c=a[0])==="]"||c==="INDEX_END"},a=function(a,b){return a[0]="INDEX_END"};return this.scanTokens(function(c,d){c[0]==="INDEX_START"&&this.detectEnd(d+1,b,a);return 1})},a.prototype.addImplicitBraces=function(){var a,b,c,f,g,i,j;f=[],g=null,j=null,c=!0,i=0,b=function(a,b){var d,e,f,g,i,k;i=this.tokens.slice(b+1,b+3+1||9e9),d=i[0],g=i[1],f=i[2];if("HERECOMMENT"===(d!=null?d[0]:void 0))return!1;e=a[0],t.call(l,e)>=0&&(c=!1);return(e==="TERMINATOR"||e==="OUTDENT"||t.call(h,e)>=0&&c)&&(!j&&this.tag(b-1)!==","||(g!=null?g[0]:void 0)!==":"&&((d!=null?d[0]:void 0)!=="@"||(f!=null?f[0]:void 0)!==":"))||e===","&&d&&(k=d[0])!=="IDENTIFIER"&&k!=="NUMBER"&&k!=="STRING"&&k!=="@"&&k!=="TERMINATOR"&&k!=="OUTDENT"},a=function(a,b){var c;c=["}","}",a[2]],c.generated=!0;return this.tokens.splice(b,0,c)};return this.scanTokens(function(h,i,k){var m,n,o,p,q,r,s,u;if(s=p=h[0],t.call(e,s)>=0){f.push([p==="INDENT"&&this.tag(i-1)==="{"?"{":p,i]);return 1}if(t.call(d,p)>=0){g=f.pop();return 1}if(p!==":"||(m=this.tag(i-2))!==":"&&((u=f[f.length-1])!=null?u[0]:void 0)==="{")return 1;c=!0,f.push(["{"]),n=m==="@"?i-2:i-1;while(this.tag(n-2)==="HERECOMMENT")n-=2;o=this.tag(n-1),j=!o||t.call(l,o)>=0,r=new String("{"),r.generated=!0,q=["{",r,h[2]],q.generated=!0,k.splice(n,0,q),this.detectEnd(i+2,b,a);return 2})},a.prototype.addImplicitParentheses=function(){var a,b,c,d,e;c=e=d=!1,b=function(a,b){var c,g,i,j;g=a[0];if(!e&&a.fromThen)return!0;if(g==="IF"||g==="ELSE"||g==="CATCH"||g==="->"||g==="=>"||g==="CLASS")e=!0;if(g==="IF"||g==="ELSE"||g==="SWITCH"||g==="TRY"||g==="=")d=!0;if((g==="."||g==="?."||g==="::")&&this.tag(b-1)==="OUTDENT")return!0;return!a.generated&&this.tag(b-1)!==","&&(t.call(h,g)>=0||g==="INDENT"&&!d)&&(g!=="INDENT"||(i=this.tag(b-2))!=="CLASS"&&i!=="EXTENDS"&&(j=this.tag(b-1),t.call(f,j)<0)&&(!(c=this.tokens[b+1])||!c.generated||c[0]!=="{"))},a=function(a,b){return this.tokens.splice(b,0,["CALL_END",")",a[2]])};return this.scanTokens(function(f,h,k){var m,n,o,p,q,r,s,u;q=f[0];if(q==="CLASS"||q==="IF")c=!0;r=k.slice(h-1,h+1+1||9e9),p=r[0],n=r[1],o=r[2],m=!c&&q==="INDENT"&&o&&o.generated&&o[0]==="{"&&p&&(s=p[0],t.call(i,s)>=0),e=!1,d=!1,t.call(l,q)>=0&&(c=!1),p&&!p.spaced&&q==="?"&&(f.call=!0);if(f.fromThen)return 1;if(!(m||(p!=null?p.spaced:void 0)&&(p.call||(u=p[0],t.call(i,u)>=0))&&(t.call(g,q)>=0||!f.spaced&&!f.newLine&&t.call(j,q)>=0)))return 1;k.splice(h,0,["CALL_START","(",f[2]]),this.detectEnd(h+1,b,a),p[0]==="?"&&(p[0]="FUNC_EXIST");return 2})},a.prototype.addImplicitIndentation=function(){var a,b,c,d,e;e=c=d=null,b=function(a,b){var c;return a[1]!==";"&&(c=a[0],t.call(m,c)>=0)&&(a[0]!=="ELSE"||e==="IF"||e==="THEN")},a=function(a,b){return this.tokens.splice(this.tag(b-1)===","?b-1:b,0,d)};return this.scanTokens(function(f,g,h){var i,j,k;i=f[0];if(i==="TERMINATOR"&&this.tag(g+1)==="THEN"){h.splice(g,1);return 0}if(i==="ELSE"&&this.tag(g-1)!=="OUTDENT"){h.splice.apply(h,[g,0].concat(u.call(this.indentation(f))));return 2}if(i==="CATCH"&&((j=this.tag(g+2))==="OUTDENT"||j==="TERMINATOR"||j==="FINALLY")){h.splice.apply(h,[g+2,0].concat(u.call(this.indentation(f))));return 4}if(t.call(n,i)>=0&&this.tag(g+1)!=="INDENT"&&(i!=="ELSE"||this.tag(g+1)!=="IF")){e=i,k=this.indentation(f),c=k[0],d=k[1],e==="THEN"&&(c.fromThen=!0),c.generated=d.generated=!0,h.splice(g+1,0,c),this.detectEnd(g+2,b,a),i==="THEN"&&h.splice(g,1);return 1}return 1})},a.prototype.tagPostfixConditionals=function(){var a,b,c;c=null,b=function(a,b){var c;return(c=a[0])==="TERMINATOR"||c==="INDENT"},a=function(a,b){if(a[0]!=="INDENT"||a.generated&&!a.fromThen)return c[0]="POST_"+c[0]};return this.scanTokens(function(d,e){if(d[0]!=="IF")return 1;c=d,this.detectEnd(e+1,b,a);return 1})},a.prototype.indentation=function(a){return[["INDENT",2,a[2]],["OUTDENT",2,a[2]]]},a.prototype.tag=function(a){var b;return(b=this.tokens[a])!=null?b[0]:void 0};return a}(),b=[["(",")"],["[","]"],["{","}"],["INDENT","OUTDENT"],["CALL_START","CALL_END"],["PARAM_START","PARAM_END"],["INDEX_START","INDEX_END"]],a.INVERSES=k={},e=[],d=[];for(q=0,r=b.length;q","=>","[","(","{","--","++"],j=["+","-"],f=["->","=>","{","[",","],h=["POST_IF","FOR","WHILE","UNTIL","WHEN","BY","LOOP","TERMINATOR"],n=["ELSE","->","=>","TRY","FINALLY","THEN"],m=["TERMINATOR","CATCH","FINALLY","ELSE","OUTDENT","LEADING_WHEN"],l=["TERMINATOR","INDENT","OUTDENT"]}).call(this)},require["./lexer"]=new function(){var a=this;(function(){var b,c,d,e,f,g,h,i,j,k,l,m,n,o,p,q,r,s,t,u,v,w,x,y,z,A,B,C,D,E,F,G,H,I,J,K,L,M,N,O,P,Q,R,S,T,U,V,W=Array.prototype.indexOf||function(a){for(var b=0,c=this.length;b=0||W.call(g,c)>=0)&&(j=c.toUpperCase(),j==="WHEN"&&(l=this.tag(),W.call(v,l)>=0)?j="LEADING_WHEN":j==="FOR"?this.seenFor=!0:j==="UNLESS"?j="IF":W.call(N,j)>=0?j="UNARY":W.call(H,j)>=0&&(j!=="INSTANCEOF"&&this.seenFor?(j="FOR"+j,this.seenFor=!1):(j="RELATION",this.value()==="!"&&(this.tokens.pop(),c="!"+c)))),W.call(["eval","arguments"].concat(t),c)>=0&&(b?(j="IDENTIFIER",c=new String(c),c.reserved=!0):W.call(I,c)>=0&&this.error('reserved word "'+c+'"')),b||(W.call(e,c)>=0&&(c=f[c]),j=function(){switch(c){case"!":return"UNARY";case"==":case"!=":return"COMPARE";case"&&":case"||":return"LOGIC";case"true":case"false":case"null":case"undefined":return"BOOL";case"break":case"continue":return"STATEMENT";default:return j}}()),this.token(j,c),a&&this.token(":",":");return d.length},a.prototype.numberToken=function(){var a,b,c,d;if(!(c=E.exec(this.chunk)))return 0;d=c[0],b=d.length;if(a=/0b([01]+)/.exec(d))d=parseInt(a[1],2).toString();this.token("NUMBER",d);return b},a.prototype.stringToken=function(){var a,b;switch(this.chunk.charAt(0)){case"'":if(!(a=L.exec(this.chunk)))return 0;this.token("STRING",(b=a[0]).replace(A,"\\\n"));break;case'"':if(!(b=this.balancedString(this.chunk,'"')))return 0;0=0))return 0;if(!(c=G.exec(this.chunk)))return 0;g=c,c=g[0],e=g[1],a=g[2],e.slice(0,2)==="/*"&&this.error("regular expressions cannot begin with `*`"),e==="//"&&(e="/(?:)/"),this.token("REGEX",""+e+a);return c.length},a.prototype.heregexToken=function(a){var b,c,d,e,f,g,h,i,j,k,l,m,n;d=a[0],b=a[1],c=a[2];if(0>b.indexOf("#{")){e=b.replace(o,"").replace(/\//g,"\\/"),e.match(/^\*/)&&this.error("regular expressions cannot begin with `*`"),this.token("REGEX","/"+(e||"(?:)")+"/"+c);return d.length}this.token("IDENTIFIER","RegExp"),this.tokens.push(["CALL_START","("]),g=[],k=this.interpolateString(b,{regex:!0});for(i=0,j=k.length;ithis.indent){if(d){this.indebt=f-this.indent,this.suppressNewlines();return b.length}a=f-this.indent+this.outdebt,this.token("INDENT",a),this.indents.push(a),this.ends.push("OUTDENT"),this.outdebt=this.indebt=0}else this.indebt=0,this.outdentToken(this.indent-f,d);this.indent=f;return b.length},a.prototype.outdentToken=function(a,b){var c,d;while(a>0)d=this.indents.length-1,this.indents[d]===void 0?a=0:this.indents[d]===this.outdebt?(a-=this.outdebt,this.outdebt=0):this.indents[d]=0)&&this.error('reserved word "'+this.value()+"\" can't be assigned");if((h=b[1])==="||"||h==="&&"){b[0]="COMPOUND_ASSIGN",b[1]+="=";return f.length}}if(f===";")this.seenFor=!1,e="TERMINATOR";else if(W.call(z,f)>=0)e="MATH";else if(W.call(i,f)>=0)e="COMPARE";else if(W.call(j,f)>=0)e="COMPOUND_ASSIGN";else if(W.call(N,f)>=0)e="UNARY";else if(W.call(K,f)>=0)e="SHIFT";else if(W.call(x,f)>=0||f==="?"&&(b!=null?b.spaced:void 0))e="LOGIC";else if(b&&!b.spaced)if(f==="("&&(k=b[0],W.call(c,k)>=0))b[0]==="?"&&(b[0]="FUNC_EXIST"),e="CALL_START";else if(f==="["&&(l=b[0],W.call(q,l)>=0)){e="INDEX_START";switch(b[0]){case"?":b[0]="INDEX_SOAK"}}switch(f){case"(":case"{":case"[":this.ends.push(r[f]);break;case")":case"}":case"]":this.pair(f)}this.token(e,f);return f.length},a.prototype.sanitizeHeredoc=function(a,b){var c,d,e,f,g;e=b.indent,d=b.herecomment;if(d){l.test(a)&&this.error('block comment cannot contain "*/", starting');if(a.indexOf("\n")<=0)return a}else while(f=m.exec(a)){c=f[1];if(e===null||0<(g=c.length)&&gh;1<=h?c++:c--){switch(d=a.charAt(c)){case"\\":c++;continue;case b:g.pop();if(!g.length)return a.slice(0,c+1);b=g[g.length-1];continue}b!=="}"||d!=='"'&&d!=="'"?b==="}"&&d==="/"&&(e=n.exec(a.slice(c))||G.exec(a.slice(c)))?c+=e[0].length-1:b==="}"&&d==="{"?g.push(b="}"):b==='"'&&f==="#"&&d==="{"&&g.push(b="}"):g.push(b=d),f=d}return this.error("missing "+g.pop()+", starting")},a.prototype.interpolateString=function(b,c){var d,e,f,g,h,i,j,k,l,m,n,o,p,q,r,s,t;c==null&&(c={}),e=c.heredoc,m=c.regex,o=[],l=0,f=-1;while(j=b.charAt(f+=1)){if(j==="\\"){f+=1;continue}if(j!=="#"||b.charAt(f+1)!=="{"||!(d=this.balancedString(b.slice(f+1),"}")))continue;l1&&(k.unshift(["(","(",this.line]),k.push([")",")",this.line])),o.push(["TOKENS",k])}f+=d.length,l=f+1}f>l&&l1)&&this.token("(","(");for(f=0,q=o.length;f|[-+*\/%<>&|^!?=]=|>>>=?|([-+:])\1|([&|<>])\2=?|\?\.|\.{2,3})/,O=/^[^\n\S]+/,h=/^###([^#][\s\S]*?)(?:###[^\n\S]*|(?:###)?$)|^(?:\s*#(?!##[^#]).*)+/,d=/^[-=]>/,B=/^(?:\n[^\n\S]*)+/,L=/^'[^\\']*(?:\\.[^\\']*)*'/,s=/^`[^\\`]*(?:\\.[^\\`]*)*`/,G=/^(\/(?![\s=])[^[\/\n\\]*(?:(?:\\[\s\S]|\[[^\]\n\\]*(?:\\[\s\S][^\]\n\\]*)*])[^[\/\n\\]*)*\/)([imgy]{0,4})(?!\w)/,n=/^\/{3}([\s\S]+?)\/{3}([imgy]{0,4})(?!\w)/,o=/\s+(?:#.*)?/g,A=/\n/g,m=/\n+([^\n\S]*)/g,l=/\*\//,w=/^\s*(?:,|\??\.(?![.\d])|::)/,M=/\s+$/,j=["-=","+=","/=","*=","%=","||=","&&=","?=","<<=",">>=",">>>=","&=","^=","|="],N=["!","~","NEW","TYPEOF","DELETE","DO"],x=["&&","||","&","|","^"],K=["<<",">>",">>>"],i=["==","!=","<",">","<=",">="],z=["*","/","%"],H=["IN","OF","INSTANCEOF"],b=["TRUE","FALSE","NULL","UNDEFINED"],C=["NUMBER","REGEX","BOOL","++","--","]"],D=C.concat(")","}","THIS","IDENTIFIER","STRING"),c=["IDENTIFIER","STRING","REGEX",")","]","}","?","::","@","THIS","SUPER"],q=c.concat("NUMBER","BOOL"),v=["INDENT","OUTDENT","TERMINATOR"]}).call(this)},require["./parser"]=new function(){var a=this,b=function(){var a={trace:function(){},yy:{},symbols_:{error:2,Root:3,Body:4,Block:5,TERMINATOR:6,Line:7,Expression:8,Statement:9,Return:10,Comment:11,STATEMENT:12,Value:13,Invocation:14,Code:15,Operation:16,Assign:17,If:18,Try:19,While:20,For:21,Switch:22,Class:23,Throw:24,INDENT:25,OUTDENT:26,Identifier:27,IDENTIFIER:28,AlphaNumeric:29,NUMBER:30,STRING:31,Literal:32,JS:33,REGEX:34,DEBUGGER:35,BOOL:36,Assignable:37,"=":38,AssignObj:39,ObjAssignable:40,":":41,ThisProperty:42,RETURN:43,HERECOMMENT:44,PARAM_START:45,ParamList:46,PARAM_END:47,FuncGlyph:48,"->":49,"=>":50,OptComma:51,",":52,Param:53,ParamVar:54,"...":55,Array:56,Object:57,Splat:58,SimpleAssignable:59,Accessor:60,Parenthetical:61,Range:62,This:63,".":64,"?.":65,"::":66,Index:67,INDEX_START:68,IndexValue:69,INDEX_END:70,INDEX_SOAK:71,Slice:72,"{":73,AssignList:74,"}":75,CLASS:76,EXTENDS:77,OptFuncExist:78,Arguments:79,SUPER:80,FUNC_EXIST:81,CALL_START:82,CALL_END:83,ArgList:84,THIS:85,"@":86,"[":87,"]":88,RangeDots:89,"..":90,Arg:91,SimpleArgs:92,TRY:93,Catch:94,FINALLY:95,CATCH:96,THROW:97,"(":98,")":99,WhileSource:100,WHILE:101,WHEN:102,UNTIL:103,Loop:104,LOOP:105,ForBody:106,FOR:107,ForStart:108,ForSource:109,ForVariables:110,OWN:111,ForValue:112,FORIN:113,FOROF:114,BY:115,SWITCH:116,Whens:117,ELSE:118,When:119,LEADING_WHEN:120,IfBlock:121,IF:122,POST_IF:123,UNARY:124,"-":125,"+":126,"--":127,"++":128,"?":129,MATH:130,SHIFT:131,COMPARE:132,LOGIC:133,RELATION:134,COMPOUND_ASSIGN:135,$accept:0,$end:1},terminals_:{2:"error",6:"TERMINATOR",12:"STATEMENT",25:"INDENT",26:"OUTDENT",28:"IDENTIFIER",30:"NUMBER",31:"STRING",33:"JS",34:"REGEX",35:"DEBUGGER",36:"BOOL",38:"=",41:":",43:"RETURN",44:"HERECOMMENT",45:"PARAM_START",47:"PARAM_END",49:"->",50:"=>",52:",",55:"...",64:".",65:"?.",66:"::",68:"INDEX_START",70:"INDEX_END",71:"INDEX_SOAK",73:"{",75:"}",76:"CLASS",77:"EXTENDS",80:"SUPER",81:"FUNC_EXIST",82:"CALL_START",83:"CALL_END",85:"THIS",86:"@",87:"[",88:"]",90:"..",93:"TRY",95:"FINALLY",96:"CATCH",97:"THROW",98:"(",99:")",101:"WHILE",102:"WHEN",103:"UNTIL",105:"LOOP",107:"FOR",111:"OWN",113:"FORIN",114:"FOROF",115:"BY",116:"SWITCH",118:"ELSE",120:"LEADING_WHEN",122:"IF",123:"POST_IF",124:"UNARY",125:"-",126:"+",127:"--",128:"++",129:"?",130:"MATH",131:"SHIFT",132:"COMPARE",133:"LOGIC",134:"RELATION",135:"COMPOUND_ASSIGN"},productions_:[0,[3,0],[3,1],[3,2],[4,1],[4,3],[4,2],[7,1],[7,1],[9,1],[9,1],[9,1],[8,1],[8,1],[8,1],[8,1],[8,1],[8,1],[8,1],[8,1],[8,1],[8,1],[8,1],[8,1],[5,2],[5,3],[27,1],[29,1],[29,1],[32,1],[32,1],[32,1],[32,1],[32,1],[17,3],[17,4],[17,5],[39,1],[39,3],[39,5],[39,1],[40,1],[40,1],[40,1],[10,2],[10,1],[11,1],[15,5],[15,2],[48,1],[48,1],[51,0],[51,1],[46,0],[46,1],[46,3],[53,1],[53,2],[53,3],[54,1],[54,1],[54,1],[54,1],[58,2],[59,1],[59,2],[59,2],[59,1],[37,1],[37,1],[37,1],[13,1],[13,1],[13,1],[13,1],[13,1],[60,2],[60,2],[60,2],[60,1],[60,1],[67,3],[67,2],[69,1],[69,1],[57,4],[74,0],[74,1],[74,3],[74,4],[74,6],[23,1],[23,2],[23,3],[23,4],[23,2],[23,3],[23,4],[23,5],[14,3],[14,3],[14,1],[14,2],[78,0],[78,1],[79,2],[79,4],[63,1],[63,1],[42,2],[56,2],[56,4],[89,1],[89,1],[62,5],[72,3],[72,2],[72,2],[84,1],[84,3],[84,4],[84,4],[84,6],[91,1],[91,1],[92,1],[92,3],[19,2],[19,3],[19,4],[19,5],[94,3],[24,2],[61,3],[61,5],[100,2],[100,4],[100,2],[100,4],[20,2],[20,2],[20,2],[20,1],[104,2],[104,2],[21,2],[21,2],[21,2],[106,2],[106,2],[108,2],[108,3],[112,1],[112,1],[112,1],[110,1],[110,3],[109,2],[109,2],[109,4],[109,4],[109,4],[109,6],[109,6],[22,5],[22,7],[22,4],[22,6],[117,1],[117,2],[119,3],[119,4],[121,3],[121,5],[18,1],[18,3],[18,3],[18,3],[16,2],[16,2],[16,2],[16,2],[16,2],[16,2],[16,2],[16,2],[16,3],[16,3],[16,3],[16,3],[16,3],[16,3],[16,3],[16,3],[16,5],[16,3]],performAction:function(a,b,c,d,e,f,g){var h=f.length-1;switch(e){case 1:return this.$=new d.Block;case 2:return this.$=f[h];case 3:return this.$=f[h-1];case 4:this.$=d.Block.wrap([f[h]]);break;case 5:this.$=f[h-2].push(f[h]);break;case 6:this.$=f[h-1];break;case 7:this.$=f[h];break;case 8:this.$=f[h];break;case 9:this.$=f[h];break;case 10:this.$=f[h];break;case 11:this.$=new d.Literal(f[h]);break;case 12:this.$=f[h];break;case 13:this.$=f[h];break;case 14:this.$=f[h];break;case 15:this.$=f[h];break;case 16:this.$=f[h];break;case 17:this.$=f[h];break;case 18:this.$=f[h];break;case 19:this.$=f[h];break;case 20:this.$=f[h];break;case 21:this.$=f[h];break;case 22:this.$=f[h];break;case 23:this.$=f[h];break;case 24:this.$=new d.Block;break;case 25:this.$=f[h-1];break;case 26:this.$=new d.Literal(f[h]);break;case 27:this.$=new d.Literal(f[h]);break;case 28:this.$=new d.Literal(f[h]);break;case 29:this.$=f[h];break;case 30:this.$=new d.Literal(f[h]);break;case 31:this.$=new d.Literal(f[h]);break;case 32:this.$=new d.Literal(f[h]);break;case 33:this.$=function(){var a;a=new d.Literal(f[h]),f[h]==="undefined"&&(a.isUndefined=!0);return a}();break;case 34:this.$=new d.Assign(f[h-2],f[h]);break;case 35:this.$=new d.Assign(f[h-3],f[h]);break;case 36:this.$=new d.Assign(f[h-4],f[h-1]);break;case 37:this.$=new d.Value(f[h]);break;case 38:this.$=new d.Assign(new d.Value(f[h-2]),f[h],"object");break;case 39:this.$=new d.Assign(new d.Value(f[h-4]),f[h-1],"object");break;case 40:this.$=f[h];break;case 41:this.$=f[h];break;case 42:this.$=f[h];break;case 43:this.$=f[h];break;case 44:this.$=new d.Return(f[h]);break;case 45:this.$=new d.Return;break;case 46:this.$=new d.Comment(f[h]);break;case 47:this.$=new d.Code(f[h-3],f[h],f[h-1]);break;case 48:this.$=new d.Code([],f[h],f[h-1]);break;case 49:this.$="func";break;case 50:this.$="boundfunc";break;case 51:this.$=f[h];break;case 52:this.$=f[h];break;case 53:this.$=[];break;case 54:this.$=[f[h]];break;case 55:this.$=f[h-2].concat(f[h]);break;case 56:this.$=new d.Param(f[h]);break;case 57:this.$=new d.Param(f[h-1],null,!0);break;case 58:this.$=new d.Param(f[h-2],f[h]);break;case 59:this.$=f[h];break;case 60:this.$=f[h];break;case 61:this.$=f[h];break;case 62:this.$=f[h];break;case 63:this.$=new d.Splat(f[h-1]);break;case 64:this.$=new d.Value(f[h]);break;case 65:this.$=f[h-1].add(f[h]);break;case 66:this.$=new d.Value(f[h-1],[].concat(f[h]));break;case 67:this.$=f[h];break;case 68:this.$=f[h];break;case 69:this.$=new d.Value(f[h]);break;case 70:this.$=new d.Value(f[h]);break;case 71:this.$=f[h];break;case 72:this.$=new d.Value(f[h]);break;case 73:this.$=new d.Value(f[h]);break;case 74:this.$=new d.Value(f[h]);break;case 75:this.$=f[h];break;case 76:this.$=new d.Access(f[h]);break;case 77:this.$=new d.Access(f[h],"soak");break;case 78:this.$=[new d.Access(new d.Literal("prototype")),new d.Access(f[h])];break;case 79:this.$=new d.Access(new d.Literal("prototype"));break;case 80:this.$=f[h];break;case 81:this.$=f[h-1];break;case 82:this.$=d.extend(f[h],{soak:!0});break;case 83:this.$=new d.Index(f[h]);break;case 84:this.$=new d.Slice(f[h]);break;case 85:this.$=new d.Obj(f[h-2],f[h-3].generated);break;case 86:this.$=[];break;case 87:this.$=[f[h]];break;case 88:this.$=f[h-2].concat(f[h]);break;case 89:this.$=f[h-3].concat(f[h]);break;case 90:this.$=f[h-5].concat(f[h-2]);break;case 91:this.$=new d.Class;break;case 92:this.$=new d.Class(null,null,f[h]);break;case 93:this.$=new d.Class(null,f[h]);break;case 94:this.$=new d.Class(null,f[h-1],f[h]);break;case 95:this.$=new d.Class(f[h]);break;case 96:this.$=new d.Class(f[h-1],null,f[h]);break;case 97:this.$=new d.Class(f[h-2],f[h]);break;case 98:this.$=new d.Class(f[h-3],f[h-1],f[h]);break;case 99:this.$=new d.Call(f[h-2],f[h],f[h-1]);break;case 100:this.$=new d.Call(f[h-2],f[h],f[h-1]);break;case 101:this.$=new d.Call("super",[new d.Splat(new d.Literal("arguments"))]);break;case 102:this.$=new d.Call("super",f[h]);break;case 103:this.$=!1;break;case 104:this.$=!0;break;case 105:this.$=[];break;case 106:this.$=f[h-2];break;case 107:this.$=new d.Value(new d.Literal("this"));break;case 108:this.$=new d.Value(new d.Literal("this"));break;case 109:this.$=new d.Value(new d.Literal("this"),[new d.Access(f[h])],"this");break;case 110:this.$=new d.Arr([]);break;case 111:this.$=new d.Arr(f[h-2]);break;case 112:this.$="inclusive";break;case 113:this.$="exclusive";break;case 114:this.$=new d.Range(f[h-3],f[h-1],f[h-2]);break;case 115:this.$=new d.Range(f[h-2],f[h],f[h-1]);break;case 116:this.$=new d.Range(f[h-1],null,f[h]);break;case 117:this.$=new d.Range(null,f[h],f[h-1]);break;case 118:this.$=[f[h]];break;case 119:this.$=f[h-2].concat(f[h]);break;case 120:this.$=f[h-3].concat(f[h]);break;case 121:this.$=f[h-2];break;case 122:this.$=f[h-5].concat(f[h-2]);break;case 123:this.$=f[h];break;case 124:this.$=f[h];break;case 125:this.$=f[h];break;case 126:this.$=[].concat(f[h-2],f[h]);break;case 127:this.$=new d.Try(f[h]);break;case 128:this.$=new d.Try(f[h-1],f[h][0],f[h][1]);break;case 129:this.$=new d.Try(f[h-2],null,null,f[h]);break;case 130:this.$=new d.Try(f[h-3],f[h-2][0],f[h-2][1],f[h]);break;case 131:this.$=[f[h-1],f[h]];break;case 132:this.$=new d.Throw(f[h]);break;case 133:this.$=new d.Parens(f[h-1]);break;case 134:this.$=new d.Parens(f[h-2]);break;case 135:this.$=new d.While(f[h]);break;case 136:this.$=new d.While(f[h-2],{guard:f[h]});break;case 137:this.$=new d.While(f[h],{invert:!0});break;case 138:this.$=new d.While(f[h-2],{invert:!0,guard:f[h]});break;case 139:this.$=f[h-1].addBody(f[h]);break;case 140:this.$=f[h].addBody(d.Block.wrap([f[h-1]]));break;case 141:this.$=f[h].addBody(d.Block.wrap([f[h-1]]));break;case 142:this.$=f[h];break;case 143:this.$=(new d.While(new d.Literal("true"))).addBody(f[h]);break;case 144:this.$=(new d.While(new d.Literal("true"))).addBody(d.Block.wrap([f[h]]));break;case 145:this.$=new d.For(f[h-1],f[h]);break;case 146:this.$=new d.For(f[h-1],f[h]);break;case 147:this.$=new d.For(f[h],f[h-1]);break;case 148:this.$={source:new d.Value(f[h])};break;case 149:this.$=function(){f[h].own=f[h-1].own,f[h].name=f[h-1][0],f[h].index=f[h-1][1];return f[h]}();break;case 150:this.$=f[h];break;case 151:this.$=function(){f[h].own=!0;return f[h]}();break;case 152:this.$=f[h];break;case 153:this.$=new d.Value(f[h]);break;case 154:this.$=new d.Value(f[h]);break;case 155:this.$=[f[h]];break;case 156:this.$=[f[h-2],f[h]];break;case 157:this.$={source:f[h]};break;case 158:this.$={source:f[h],object:!0};break;case 159:this.$={source:f[h-2],guard:f[h]};break;case 160:this.$={source:f[h-2],guard:f[h],object:!0};break;case 161:this.$={source:f[h-2],step:f[h]};break;case 162:this.$={source:f[h-4],guard:f[h-2],step:f[h]};break;case 163:this.$={source:f[h-4],step:f[h-2],guard:f[h]};break;case 164:this.$=new d.Switch(f[h-3],f[h-1]);break;case 165:this.$=new d.Switch(f[h-5],f[h-3],f[h-1]);break;case 166:this.$=new d.Switch(null,f[h-1]);break;case 167:this.$=new d.Switch(null,f[h-3],f[h-1]);break;case 168:this.$=f[h];break;case 169:this.$=f[h-1].concat(f[h]);break;case 170:this.$=[[f[h-1],f[h]]];break;case 171:this.$=[[f[h-2],f[h-1]]];break;case 172:this.$=new d.If(f[h-1],f[h],{type:f[h-2]});break;case 173:this.$=f[h-4].addElse(new d.If(f[h-1],f[h],{type:f[h-2]}));break;case 174:this.$=f[h];break;case 175:this.$=f[h-2].addElse(f[h]);break;case 176:this.$=new d.If(f[h],d.Block.wrap([f[h-2]]),{type:f[h-1],statement:!0});break;case 177:this.$=new d.If(f[h],d.Block.wrap([f[h-2]]),{type:f[h-1],statement:!0});break;case 178:this.$=new d.Op(f[h-1],f[h]);break;case 179:this.$=new d.Op("-",f[h]);break;case 180:this.$=new d.Op("+",f[h]);break;case 181:this.$=new d.Op("--",f[h]);break;case 182:this.$=new d.Op("++",f[h]);break;case 183:this.$=new d.Op("--",f[h-1],null,!0);break;case 184:this.$=new d.Op("++",f[h-1],null,!0);break;case 185:this.$=new d.Existence(f[h-1]);break;case 186:this.$=new d.Op("+",f[h-2],f[h]);break;case 187:this.$=new d.Op("-",f[h-2],f[h]);break;case 188:this.$=new d.Op(f[h-1],f[h-2],f[h]);break;case 189:this.$=new d.Op(f[h-1],f[h-2],f[h]);break;case 190:this.$=new d.Op(f[h-1],f[h-2],f[h]);break;case 191:this.$=new d.Op(f[h-1],f[h-2],f[h]);break;case 192:this.$=function(){return f[h-1].charAt(0)==="!"?(new d.Op(f[h-1].slice(1),f[h-2],f[h])).invert():new d.Op(f[h-1],f[h-2],f[h])}();break;case 193:this.$=new d.Assign(f[h-2],f[h],f[h-1]);break;case 194:this.$=new d.Assign(f[h-4],f[h-1],f[h-3]);break;case 195:this.$=new d.Extends(f[h-2],f[h])}},table:[{1:[2,1],3:1,4:2,5:3,7:4,8:6,9:7,10:20,11:21,12:[1,22],13:8,14:9,15:10,16:11,17:12,18:13,19:14,20:15,21:16,22:17,23:18,24:19,25:[1,5],27:60,28:[1,71],29:49,30:[1,69],31:[1,70],32:24,33:[1,50],34:[1,51],35:[1,52],36:[1,53],37:23,42:61,43:[1,45],44:[1,46],45:[1,29],48:30,49:[1,58],50:[1,59],56:47,57:48,59:36,61:25,62:26,63:27,73:[1,68],76:[1,43],80:[1,28],85:[1,56],86:[1,57],87:[1,55],93:[1,38],97:[1,44],98:[1,54],100:39,101:[1,63],103:[1,64],104:40,105:[1,65],106:41,107:[1,66],108:67,116:[1,42],121:37,122:[1,62],124:[1,31],125:[1,32],126:[1,33],127:[1,34],128:[1,35]},{1:[3]},{1:[2,2],6:[1,72]},{6:[1,73]},{1:[2,4],6:[2,4],26:[2,4],99:[2,4]},{4:75,7:4,8:6,9:7,10:20,11:21,12:[1,22],13:8,14:9,15:10,16:11,17:12,18:13,19:14,20:15,21:16,22:17,23:18,24:19,26:[1,74],27:60,28:[1,71],29:49,30:[1,69],31:[1,70],32:24,33:[1,50],34:[1,51],35:[1,52],36:[1,53],37:23,42:61,43:[1,45],44:[1,46],45:[1,29],48:30,49:[1,58],50:[1,59],56:47,57:48,59:36,61:25,62:26,63:27,73:[1,68],76:[1,43],80:[1,28],85:[1,56],86:[1,57],87:[1,55],93:[1,38],97:[1,44],98:[1,54],100:39,101:[1,63],103:[1,64],104:40,105:[1,65],106:41,107:[1,66],108:67,116:[1,42],121:37,122:[1,62],124:[1,31],125:[1,32],126:[1,33],127:[1,34],128:[1,35]},{1:[2,7],6:[2,7],26:[2,7],99:[2,7],100:85,101:[1,63],103:[1,64],106:86,107:[1,66],108:67,123:[1,84],125:[1,78],126:[1,77],129:[1,76],130:[1,79],131:[1,80],132:[1,81],133:[1,82],134:[1,83]},{1:[2,8],6:[2,8],26:[2,8],99:[2,8],100:88,101:[1,63],103:[1,64],106:89,107:[1,66],108:67,123:[1,87]},{1:[2,12],6:[2,12],25:[2,12],26:[2,12],47:[2,12],52:[2,12],55:[2,12],60:91,64:[1,93],65:[1,94],66:[1,95],67:96,68:[1,97],70:[2,12],71:[1,98],75:[2,12],78:90,81:[1,92],82:[2,103],83:[2,12],88:[2,12],90:[2,12],99:[2,12],101:[2,12],102:[2,12],103:[2,12],107:[2,12],115:[2,12],123:[2,12],125:[2,12],126:[2,12],129:[2,12],130:[2,12],131:[2,12],132:[2,12],133:[2,12],134:[2,12]},{1:[2,13],6:[2,13],25:[2,13],26:[2,13],47:[2,13],52:[2,13],55:[2,13],60:100,64:[1,93],65:[1,94],66:[1,95],67:96,68:[1,97],70:[2,13],71:[1,98],75:[2,13],78:99,81:[1,92],82:[2,103],83:[2,13],88:[2,13],90:[2,13],99:[2,13],101:[2,13],102:[2,13],103:[2,13],107:[2,13],115:[2,13],123:[2,13],125:[2,13],126:[2,13],129:[2,13],130:[2,13],131:[2,13],132:[2,13],133:[2,13],134:[2,13]},{1:[2,14],6:[2,14],25:[2,14],26:[2,14],47:[2,14],52:[2,14],55:[2,14],70:[2,14],75:[2,14],83:[2,14],88:[2,14],90:[2,14],99:[2,14],101:[2,14],102:[2,14],103:[2,14],107:[2,14],115:[2,14],123:[2,14],125:[2,14],126:[2,14],129:[2,14],130:[2,14],131:[2,14],132:[2,14],133:[2,14],134:[2,14]},{1:[2,15],6:[2,15],25:[2,15],26:[2,15],47:[2,15],52:[2,15],55:[2,15],70:[2,15],75:[2,15],83:[2,15],88:[2,15],90:[2,15],99:[2,15],101:[2,15],102:[2,15],103:[2,15],107:[2,15],115:[2,15],123:[2,15],125:[2,15],126:[2,15],129:[2,15],130:[2,15],131:[2,15],132:[2,15],133:[2,15],134:[2,15]},{1:[2,16],6:[2,16],25:[2,16],26:[2,16],47:[2,16],52:[2,16],55:[2,16],70:[2,16],75:[2,16],83:[2,16],88:[2,16],90:[2,16],99:[2,16],101:[2,16],102:[2,16],103:[2,16],107:[2,16],115:[2,16],123:[2,16],125:[2,16],126:[2,16],129:[2,16],130:[2,16],131:[2,16],132:[2,16],133:[2,16],134:[2,16]},{1:[2,17],6:[2,17],25:[2,17],26:[2,17],47:[2,17],52:[2,17],55:[2,17],70:[2,17],75:[2,17],83:[2,17],88:[2,17],90:[2,17],99:[2,17],101:[2,17],102:[2,17],103:[2,17],107:[2,17],115:[2,17],123:[2,17],125:[2,17],126:[2,17],129:[2,17],130:[2,17],131:[2,17],132:[2,17],133:[2,17],134:[2,17]},{1:[2,18],6:[2,18],25:[2,18],26:[2,18],47:[2,18],52:[2,18],55:[2,18],70:[2,18],75:[2,18],83:[2,18],88:[2,18],90:[2,18],99:[2,18],101:[2,18],102:[2,18],103:[2,18],107:[2,18],115:[2,18],123:[2,18],125:[2,18],126:[2,18],129:[2,18],130:[2,18],131:[2,18],132:[2,18],133:[2,18],134:[2,18]},{1:[2,19],6:[2,19],25:[2,19],26:[2,19],47:[2,19],52:[2,19],55:[2,19],70:[2,19],75:[2,19],83:[2,19],88:[2,19],90:[2,19],99:[2,19],101:[2,19],102:[2,19],103:[2,19],107:[2,19],115:[2,19],123:[2,19],125:[2,19],126:[2,19],129:[2,19],130:[2,19],131:[2,19],132:[2,19],133:[2,19],134:[2,19]},{1:[2,20],6:[2,20],25:[2,20],26:[2,20],47:[2,20],52:[2,20],55:[2,20],70:[2,20],75:[2,20],83:[2,20],88:[2,20],90:[2,20],99:[2,20],101:[2,20],102:[2,20],103:[2,20],107:[2,20],115:[2,20],123:[2,20],125:[2,20],126:[2,20],129:[2,20],130:[2,20],131:[2,20],132:[2,20],133:[2,20],134:[2,20]},{1:[2,21],6:[2,21],25:[2,21],26:[2,21],47:[2,21],52:[2,21],55:[2,21],70:[2,21],75:[2,21],83:[2,21],88:[2,21],90:[2,21],99:[2,21],101:[2,21],102:[2,21],103:[2,21],107:[2,21],115:[2,21],123:[2,21],125:[2,21],126:[2,21],129:[2,21],130:[2,21],131:[2,21],132:[2,21],133:[2,21],134:[2,21]},{1:[2,22],6:[2,22],25:[2,22],26:[2,22],47:[2,22],52:[2,22],55:[2,22],70:[2,22],75:[2,22],83:[2,22],88:[2,22],90:[2,22],99:[2,22],101:[2,22],102:[2,22],103:[2,22],107:[2,22],115:[2,22],123:[2,22],125:[2,22],126:[2,22],129:[2,22],130:[2,22],131:[2,22],132:[2,22],133:[2,22],134:[2,22]},{1:[2,23],6:[2,23],25:[2,23],26:[2,23],47:[2,23],52:[2,23],55:[2,23],70:[2,23],75:[2,23],83:[2,23],88:[2,23],90:[2,23],99:[2,23],101:[2,23],102:[2,23],103:[2,23],107:[2,23],115:[2,23],123:[2,23],125:[2,23],126:[2,23],129:[2,23],130:[2,23],131:[2,23],132:[2,23],133:[2,23],134:[2,23]},{1:[2,9],6:[2,9],26:[2,9],99:[2,9],101:[2,9],103:[2,9],107:[2,9],123:[2,9]},{1:[2,10],6:[2,10],26:[2,10],99:[2,10],101:[2,10],103:[2,10],107:[2,10],123:[2,10]},{1:[2,11],6:[2,11],26:[2,11],99:[2,11],101:[2,11],103:[2,11],107:[2,11],123:[2,11]},{1:[2,71],6:[2,71],25:[2,71],26:[2,71],38:[1,101],47:[2,71],52:[2,71],55:[2,71],64:[2,71],65:[2,71],66:[2,71],68:[2,71],70:[2,71],71:[2,71],75:[2,71],81:[2,71],82:[2,71],83:[2,71],88:[2,71],90:[2,71],99:[2,71],101:[2,71],102:[2,71],103:[2,71],107:[2,71],115:[2,71],123:[2,71],125:[2,71],126:[2,71],129:[2,71],130:[2,71],131:[2,71],132:[2,71],133:[2,71],134:[2,71]},{1:[2,72],6:[2,72],25:[2,72],26:[2,72],47:[2,72],52:[2,72],55:[2,72],64:[2,72],65:[2,72],66:[2,72],68:[2,72],70:[2,72],71:[2,72],75:[2,72],81:[2,72],82:[2,72],83:[2,72],88:[2,72],90:[2,72],99:[2,72],101:[2,72],102:[2,72],103:[2,72],107:[2,72],115:[2,72],123:[2,72],125:[2,72],126:[2,72],129:[2,72],130:[2,72],131:[2,72],132:[2,72],133:[2,72],134:[2,72]},{1:[2,73],6:[2,73],25:[2,73],26:[2,73],47:[2,73],52:[2,73],55:[2,73],64:[2,73],65:[2,73],66:[2,73],68:[2,73],70:[2,73],71:[2,73],75:[2,73],81:[2,73],82:[2,73],83:[2,73],88:[2,73],90:[2,73],99:[2,73],101:[2,73],102:[2,73],103:[2,73],107:[2,73],115:[2,73],123:[2,73],125:[2,73],126:[2,73],129:[2,73],130:[2,73],131:[2,73],132:[2,73],133:[2,73],134:[2,73]},{1:[2,74],6:[2,74],25:[2,74],26:[2,74],47:[2,74],52:[2,74],55:[2,74],64:[2,74],65:[2,74],66:[2,74],68:[2,74],70:[2,74],71:[2,74],75:[2,74],81:[2,74],82:[2,74],83:[2,74],88:[2,74],90:[2,74],99:[2,74],101:[2,74],102:[2,74],103:[2,74],107:[2,74],115:[2,74],123:[2,74],125:[2,74],126:[2,74],129:[2,74],130:[2,74],131:[2,74],132:[2,74],133:[2,74],134:[2,74]},{1:[2,75],6:[2,75],25:[2,75],26:[2,75],47:[2,75],52:[2,75],55:[2,75],64:[2,75],65:[2,75],66:[2,75],68:[2,75],70:[2,75],71:[2,75],75:[2,75],81:[2,75],82:[2,75],83:[2,75],88:[2,75],90:[2,75],99:[2,75],101:[2,75],102:[2,75],103:[2,75],107:[2,75],115:[2,75],123:[2,75],125:[2,75],126:[2,75],129:[2,75],130:[2,75],131:[2,75],132:[2,75],133:[2,75],134:[2,75]},{1:[2,101],6:[2,101],25:[2,101],26:[2,101],47:[2,101],52:[2,101],55:[2,101],64:[2,101],65:[2,101],66:[2,101],68:[2,101],70:[2,101],71:[2,101],75:[2,101],79:102,81:[2,101],82:[1,103],83:[2,101],88:[2,101],90:[2,101],99:[2,101],101:[2,101],102:[2,101],103:[2,101],107:[2,101],115:[2,101],123:[2,101],125:[2,101],126:[2,101],129:[2,101],130:[2,101],131:[2,101],132:[2,101],133:[2,101],134:[2,101]},{27:107,28:[1,71],42:108,46:104,47:[2,53],52:[2,53],53:105,54:106,56:109,57:110,73:[1,68],86:[1,111],87:[1,112]},{5:113,25:[1,5]},{8:114,9:115,10:20,11:21,12:[1,22],13:8,14:9,15:10,16:11,17:12,18:13,19:14,20:15,21:16,22:17,23:18,24:19,27:60,28:[1,71],29:49,30:[1,69],31:[1,70],32:24,33:[1,50],34:[1,51],35:[1,52],36:[1,53],37:23,42:61,43:[1,45],44:[1,46],45:[1,29],48:30,49:[1,58],50:[1,59],56:47,57:48,59:36,61:25,62:26,63:27,73:[1,68],76:[1,43],80:[1,28],85:[1,56],86:[1,57],87:[1,55],93:[1,38],97:[1,44],98:[1,54],100:39,101:[1,63],103:[1,64],104:40,105:[1,65],106:41,107:[1,66],108:67,116:[1,42],121:37,122:[1,62],124:[1,31],125:[1,32],126:[1,33],127:[1,34],128:[1,35]},{8:116,9:115,10:20,11:21,12:[1,22],13:8,14:9,15:10,16:11,17:12,18:13,19:14,20:15,21:16,22:17,23:18,24:19,27:60,28:[1,71],29:49,30:[1,69],31:[1,70],32:24,33:[1,50],34:[1,51],35:[1,52],36:[1,53],37:23,42:61,43:[1,45],44:[1,46],45:[1,29],48:30,49:[1,58],50:[1,59],56:47,57:48,59:36,61:25,62:26,63:27,73:[1,68],76:[1,43],80:[1,28],85:[1,56],86:[1,57],87:[1,55],93:[1,38],97:[1,44],98:[1,54],100:39,101:[1,63],103:[1,64],104:40,105:[1,65],106:41,107:[1,66],108:67,116:[1,42],121:37,122:[1,62],124:[1,31],125:[1,32],126:[1,33],127:[1,34],128:[1,35]},{8:117,9:115,10:20,11:21,12:[1,22],13:8,14:9,15:10,16:11,17:12,18:13,19:14,20:15,21:16,22:17,23:18,24:19,27:60,28:[1,71],29:49,30:[1,69],31:[1,70],32:24,33:[1,50],34:[1,51],35:[1,52],36:[1,53],37:23,42:61,43:[1,45],44:[1,46],45:[1,29],48:30,49:[1,58],50:[1,59],56:47,57:48,59:36,61:25,62:26,63:27,73:[1,68],76:[1,43],80:[1,28],85:[1,56],86:[1,57],87:[1,55],93:[1,38],97:[1,44],98:[1,54],100:39,101:[1,63],103:[1,64],104:40,105:[1,65],106:41,107:[1,66],108:67,116:[1,42],121:37,122:[1,62],124:[1,31],125:[1,32],126:[1,33],127:[1,34],128:[1,35]},{13:119,14:120,27:60,28:[1,71],29:49,30:[1,69],31:[1,70],32:24,33:[1,50],34:[1,51],35:[1,52],36:[1,53],37:121,42:61,56:47,57:48,59:118,61:25,62:26,63:27,73:[1,68],80:[1,28],85:[1,56],86:[1,57],87:[1,55],98:[1,54]},{13:119,14:120,27:60,28:[1,71],29:49,30:[1,69],31:[1,70],32:24,33:[1,50],34:[1,51],35:[1,52],36:[1,53],37:121,42:61,56:47,57:48,59:122,61:25,62:26,63:27,73:[1,68],80:[1,28],85:[1,56],86:[1,57],87:[1,55],98:[1,54]},{1:[2,68],6:[2,68],25:[2,68],26:[2,68],38:[2,68],47:[2,68],52:[2,68],55:[2,68],64:[2,68],65:[2,68],66:[2,68],68:[2,68],70:[2,68],71:[2,68],75:[2,68],77:[1,126],81:[2,68],82:[2,68],83:[2,68],88:[2,68],90:[2,68],99:[2,68],101:[2,68],102:[2,68],103:[2,68],107:[2,68],115:[2,68],123:[2,68],125:[2,68],126:[2,68],127:[1,123],128:[1,124],129:[2,68],130:[2,68],131:[2,68],132:[2,68],133:[2,68],134:[2,68],135:[1,125]},{1:[2,174],6:[2,174],25:[2,174],26:[2,174],47:[2,174],52:[2,174],55:[2,174],70:[2,174],75:[2,174],83:[2,174],88:[2,174],90:[2,174],99:[2,174],101:[2,174],102:[2,174],103:[2,174],107:[2,174],115:[2,174],118:[1,127],123:[2,174],125:[2,174],126:[2,174],129:[2,174],130:[2,174],131:[2,174],132:[2,174],133:[2,174],134:[2,174]},{5:128,25:[1,5]},{5:129,25:[1,5]},{1:[2,142],6:[2,142],25:[2,142],26:[2,142],47:[2,142],52:[2,142],55:[2,142],70:[2,142],75:[2,142],83:[2,142],88:[2,142],90:[2,142],99:[2,142],101:[2,142],102:[2,142],103:[2,142],107:[2,142],115:[2,142],123:[2,142],125:[2,142],126:[2,142],129:[2,142],130:[2,142],131:[2,142],132:[2,142],133:[2,142],134:[2,142]},{5:130,25:[1,5]},{8:131,9:115,10:20,11:21,12:[1,22],13:8,14:9,15:10,16:11,17:12,18:13,19:14,20:15,21:16,22:17,23:18,24:19,25:[1,132],27:60,28:[1,71],29:49,30:[1,69],31:[1,70],32:24,33:[1,50],34:[1,51],35:[1,52],36:[1,53],37:23,42:61,43:[1,45],44:[1,46],45:[1,29],48:30,49:[1,58],50:[1,59],56:47,57:48,59:36,61:25,62:26,63:27,73:[1,68],76:[1,43],80:[1,28],85:[1,56],86:[1,57],87:[1,55],93:[1,38],97:[1,44],98:[1,54],100:39,101:[1,63],103:[1,64],104:40,105:[1,65],106:41,107:[1,66],108:67,116:[1,42],121:37,122:[1,62],124:[1,31],125:[1,32],126:[1,33],127:[1,34],128:[1,35]},{1:[2,91],5:133,6:[2,91],13:119,14:120,25:[1,5],26:[2,91],27:60,28:[1,71],29:49,30:[1,69],31:[1,70],32:24,33:[1,50],34:[1,51],35:[1,52],36:[1,53],37:121,42:61,47:[2,91],52:[2,91],55:[2,91],56:47,57:48,59:135,61:25,62:26,63:27,70:[2,91],73:[1,68],75:[2,91],77:[1,134],80:[1,28],83:[2,91],85:[1,56],86:[1,57],87:[1,55],88:[2,91],90:[2,91],98:[1,54],99:[2,91],101:[2,91],102:[2,91],103:[2,91],107:[2,91],115:[2,91],123:[2,91],125:[2,91],126:[2,91],129:[2,91],130:[2,91],131:[2,91],132:[2,91],133:[2,91],134:[2,91]},{8:136,9:115,10:20,11:21,12:[1,22],13:8,14:9,15:10,16:11,17:12,18:13,19:14,20:15,21:16,22:17,23:18,24:19,27:60,28:[1,71],29:49,30:[1,69],31:[1,70],32:24,33:[1,50],34:[1,51],35:[1,52],36:[1,53],37:23,42:61,43:[1,45],44:[1,46],45:[1,29],48:30,49:[1,58],50:[1,59],56:47,57:48,59:36,61:25,62:26,63:27,73:[1,68],76:[1,43],80:[1,28],85:[1,56],86:[1,57],87:[1,55],93:[1,38],97:[1,44],98:[1,54],100:39,101:[1,63],103:[1,64],104:40,105:[1,65],106:41,107:[1,66],108:67,116:[1,42],121:37,122:[1,62],124:[1,31],125:[1,32],126:[1,33],127:[1,34],128:[1,35]},{1:[2,45],6:[2,45],8:137,9:115,10:20,11:21,12:[1,22],13:8,14:9,15:10,16:11,17:12,18:13,19:14,20:15,21:16,22:17,23:18,24:19,26:[2,45],27:60,28:[1,71],29:49,30:[1,69],31:[1,70],32:24,33:[1,50],34:[1,51],35:[1,52],36:[1,53],37:23,42:61,43:[1,45],44:[1,46],45:[1,29],48:30,49:[1,58],50:[1,59],56:47,57:48,59:36,61:25,62:26,63:27,73:[1,68],76:[1,43],80:[1,28],85:[1,56],86:[1,57],87:[1,55],93:[1,38],97:[1,44],98:[1,54],99:[2,45],100:39,101:[2,45],103:[2,45],104:40,105:[1,65],106:41,107:[2,45],108:67,116:[1,42],121:37,122:[1,62],123:[2,45],124:[1,31],125:[1,32],126:[1,33],127:[1,34],128:[1,35]},{1:[2,46],6:[2,46],25:[2,46],26:[2,46],52:[2,46],75:[2,46],99:[2,46],101:[2,46],103:[2,46],107:[2,46],123:[2,46]},{1:[2,69],6:[2,69],25:[2,69],26:[2,69],38:[2,69],47:[2,69],52:[2,69],55:[2,69],64:[2,69],65:[2,69],66:[2,69],68:[2,69],70:[2,69],71:[2,69],75:[2,69],81:[2,69],82:[2,69],83:[2,69],88:[2,69],90:[2,69],99:[2,69],101:[2,69],102:[2,69],103:[2,69],107:[2,69],115:[2,69],123:[2,69],125:[2,69],126:[2,69],129:[2,69],130:[2,69],131:[2,69],132:[2,69],133:[2,69],134:[2,69]},{1:[2,70],6:[2,70],25:[2,70],26:[2,70],38:[2,70],47:[2,70],52:[2,70],55:[2,70],64:[2,70],65:[2,70],66:[2,70],68:[2,70],70:[2,70],71:[2,70],75:[2,70],81:[2,70],82:[2,70],83:[2,70],88:[2,70],90:[2,70],99:[2,70],101:[2,70],102:[2,70],103:[2,70],107:[2,70],115:[2,70],123:[2,70],125:[2,70],126:[2,70],129:[2,70],130:[2,70],131:[2,70],132:[2,70],133:[2,70],134:[2,70]},{1:[2,29],6:[2,29],25:[2,29],26:[2,29],47:[2,29],52:[2,29],55:[2,29],64:[2,29],65:[2,29],66:[2,29],68:[2,29],70:[2,29],71:[2,29],75:[2,29],81:[2,29],82:[2,29],83:[2,29],88:[2,29],90:[2,29],99:[2,29],101:[2,29],102:[2,29],103:[2,29],107:[2,29],115:[2,29],123:[2,29],125:[2,29],126:[2,29],129:[2,29],130:[2,29],131:[2,29],132:[2,29],133:[2,29],134:[2,29]},{1:[2,30],6:[2,30],25:[2,30],26:[2,30],47:[2,30],52:[2,30],55:[2,30],64:[2,30],65:[2,30],66:[2,30],68:[2,30],70:[2,30],71:[2,30],75:[2,30],81:[2,30],82:[2,30],83:[2,30],88:[2,30],90:[2,30],99:[2,30],101:[2,30],102:[2,30],103:[2,30],107:[2,30],115:[2,30],123:[2,30],125:[2,30],126:[2,30],129:[2,30],130:[2,30],131:[2,30],132:[2,30],133:[2,30],134:[2,30]},{1:[2,31],6:[2,31],25:[2,31],26:[2,31],47:[2,31],52:[2,31],55:[2,31],64:[2,31],65:[2,31],66:[2,31],68:[2,31],70:[2,31],71:[2,31],75:[2,31],81:[2,31],82:[2,31],83:[2,31],88:[2,31],90:[2,31],99:[2,31],101:[2,31],102:[2,31],103:[2,31],107:[2,31],115:[2,31],123:[2,31],125:[2,31],126:[2,31],129:[2,31],130:[2,31],131:[2,31],132:[2,31],133:[2,31],134:[2,31]},{1:[2,32],6:[2,32],25:[2,32],26:[2,32],47:[2,32],52:[2,32],55:[2,32],64:[2,32],65:[2,32],66:[2,32],68:[2,32],70:[2,32],71:[2,32],75:[2,32],81:[2,32],82:[2,32],83:[2,32],88:[2,32],90:[2,32],99:[2,32],101:[2,32],102:[2,32],103:[2,32],107:[2,32],115:[2,32],123:[2,32],125:[2,32],126:[2,32],129:[2,32],130:[2,32],131:[2,32],132:[2,32],133:[2,32],134:[2,32]},{1:[2,33],6:[2,33],25:[2,33],26:[2,33],47:[2,33],52:[2,33],55:[2,33],64:[2,33],65:[2,33],66:[2,33],68:[2,33],70:[2,33],71:[2,33],75:[2,33],81:[2,33],82:[2,33],83:[2,33],88:[2,33],90:[2,33],99:[2,33],101:[2,33],102:[2,33],103:[2,33],107:[2,33],115:[2,33],123:[2,33],125:[2,33],126:[2,33],129:[2,33],130:[2,33],131:[2,33],132:[2,33],133:[2,33],134:[2,33]},{4:138,7:4,8:6,9:7,10:20,11:21,12:[1,22],13:8,14:9,15:10,16:11,17:12,18:13,19:14,20:15,21:16,22:17,23:18,24:19,25:[1,139],27:60,28:[1,71],29:49,30:[1,69],31:[1,70],32:24,33:[1,50],34:[1,51],35:[1,52],36:[1,53],37:23,42:61,43:[1,45],44:[1,46],45:[1,29],48:30,49:[1,58],50:[1,59],56:47,57:48,59:36,61:25,62:26,63:27,73:[1,68],76:[1,43],80:[1,28],85:[1,56],86:[1,57],87:[1,55],93:[1,38],97:[1,44],98:[1,54],100:39,101:[1,63],103:[1,64],104:40,105:[1,65],106:41,107:[1,66],108:67,116:[1,42],121:37,122:[1,62],124:[1,31],125:[1,32],126:[1,33],127:[1,34],128:[1,35]},{8:140,9:115,10:20,11:21,12:[1,22],13:8,14:9,15:10,16:11,17:12,18:13,19:14,20:15,21:16,22:17,23:18,24:19,25:[1,144],27:60,28:[1,71],29:49,30:[1,69],31:[1,70],32:24,33:[1,50],34:[1,51],35:[1,52],36:[1,53],37:23,42:61,43:[1,45],44:[1,46],45:[1,29],48:30,49:[1,58],50:[1,59],56:47,57:48,58:145,59:36,61:25,62:26,63:27,73:[1,68],76:[1,43],80:[1,28],84:142,85:[1,56],86:[1,57],87:[1,55],88:[1,141],91:143,93:[1,38],97:[1,44],98:[1,54],100:39,101:[1,63],103:[1,64],104:40,105:[1,65],106:41,107:[1,66],108:67,116:[1,42],121:37,122:[1,62],124:[1,31],125:[1,32],126:[1,33],127:[1,34],128:[1,35]},{1:[2,107],6:[2,107],25:[2,107],26:[2,107],47:[2,107],52:[2,107],55:[2,107],64:[2,107],65:[2,107],66:[2,107],68:[2,107],70:[2,107],71:[2,107],75:[2,107],81:[2,107],82:[2,107],83:[2,107],88:[2,107],90:[2,107],99:[2,107],101:[2,107],102:[2,107],103:[2,107],107:[2,107],115:[2,107],123:[2,107],125:[2,107],126:[2,107],129:[2,107],130:[2,107],131:[2,107],132:[2,107],133:[2,107],134:[2,107]},{1:[2,108],6:[2,108],25:[2,108],26:[2,108],27:146,28:[1,71],47:[2,108],52:[2,108],55:[2,108],64:[2,108],65:[2,108],66:[2,108],68:[2,108],70:[2,108],71:[2,108],75:[2,108],81:[2,108],82:[2,108],83:[2,108],88:[2,108],90:[2,108],99:[2,108],101:[2,108],102:[2,108],103:[2,108],107:[2,108],115:[2,108],123:[2,108],125:[2,108],126:[2,108],129:[2,108],130:[2,108],131:[2,108],132:[2,108],133:[2,108],134:[2,108]},{25:[2,49]},{25:[2,50]},{1:[2,64],6:[2,64],25:[2,64],26:[2,64],38:[2,64],47:[2,64],52:[2,64],55:[2,64],64:[2,64],65:[2,64],66:[2,64],68:[2,64],70:[2,64],71:[2,64],75:[2,64],77:[2,64],81:[2,64],82:[2,64],83:[2,64],88:[2,64],90:[2,64],99:[2,64],101:[2,64],102:[2,64],103:[2,64],107:[2,64],115:[2,64],123:[2,64],125:[2,64],126:[2,64],127:[2,64],128:[2,64],129:[2,64],130:[2,64],131:[2,64],132:[2,64],133:[2,64],134:[2,64],135:[2,64]},{1:[2,67],6:[2,67],25:[2,67],26:[2,67],38:[2,67],47:[2,67],52:[2,67],55:[2,67],64:[2,67],65:[2,67],66:[2,67],68:[2,67],70:[2,67],71:[2,67],75:[2,67],77:[2,67],81:[2,67],82:[2,67],83:[2,67],88:[2,67],90:[2,67],99:[2,67],101:[2,67],102:[2,67],103:[2,67],107:[2,67],115:[2,67],123:[2,67],125:[2,67],126:[2,67],127:[2,67],128:[2,67],129:[2,67],130:[2,67],131:[2,67],132:[2,67],133:[2,67],134:[2,67],135:[2,67]},{8:147,9:115,10:20,11:21,12:[1,22],13:8,14:9,15:10,16:11,17:12,18:13,19:14,20:15,21:16,22:17,23:18,24:19,27:60,28:[1,71],29:49,30:[1,69],31:[1,70],32:24,33:[1,50],34:[1,51],35:[1,52],36:[1,53],37:23,42:61,43:[1,45],44:[1,46],45:[1,29],48:30,49:[1,58],50:[1,59],56:47,57:48,59:36,61:25,62:26,63:27,73:[1,68],76:[1,43],80:[1,28],85:[1,56],86:[1,57],87:[1,55],93:[1,38],97:[1,44],98:[1,54],100:39,101:[1,63],103:[1,64],104:40,105:[1,65],106:41,107:[1,66],108:67,116:[1,42],121:37,122:[1,62],124:[1,31],125:[1,32],126:[1,33],127:[1,34],128:[1,35]},{8:148,9:115,10:20,11:21,12:[1,22],13:8,14:9,15:10,16:11,17:12,18:13,19:14,20:15,21:16,22:17,23:18,24:19,27:60,28:[1,71],29:49,30:[1,69],31:[1,70],32:24,33:[1,50],34:[1,51],35:[1,52],36:[1,53],37:23,42:61,43:[1,45],44:[1,46],45:[1,29],48:30,49:[1,58],50:[1,59],56:47,57:48,59:36,61:25,62:26,63:27,73:[1,68],76:[1,43],80:[1,28],85:[1,56],86:[1,57],87:[1,55],93:[1,38],97:[1,44],98:[1,54],100:39,101:[1,63],103:[1,64],104:40,105:[1,65],106:41,107:[1,66],108:67,116:[1,42],121:37,122:[1,62],124:[1,31],125:[1,32],126:[1,33],127:[1,34],128:[1,35]},{8:149,9:115,10:20,11:21,12:[1,22],13:8,14:9,15:10,16:11,17:12,18:13,19:14,20:15,21:16,22:17,23:18,24:19,27:60,28:[1,71],29:49,30:[1,69],31:[1,70],32:24,33:[1,50],34:[1,51],35:[1,52],36:[1,53],37:23,42:61,43:[1,45],44:[1,46],45:[1,29],48:30,49:[1,58],50:[1,59],56:47,57:48,59:36,61:25,62:26,63:27,73:[1,68],76:[1,43],80:[1,28],85:[1,56],86:[1,57],87:[1,55],93:[1,38],97:[1,44],98:[1,54],100:39,101:[1,63],103:[1,64],104:40,105:[1,65],106:41,107:[1,66],108:67,116:[1,42],121:37,122:[1,62],124:[1,31],125:[1,32],126:[1,33],127:[1,34],128:[1,35]},{5:150,8:151,9:115,10:20,11:21,12:[1,22],13:8,14:9,15:10,16:11,17:12,18:13,19:14,20:15,21:16,22:17,23:18,24:19,25:[1,5],27:60,28:[1,71],29:49,30:[1,69],31:[1,70],32:24,33:[1,50],34:[1,51],35:[1,52],36:[1,53],37:23,42:61,43:[1,45],44:[1,46],45:[1,29],48:30,49:[1,58],50:[1,59],56:47,57:48,59:36,61:25,62:26,63:27,73:[1,68],76:[1,43],80:[1,28],85:[1,56],86:[1,57],87:[1,55],93:[1,38],97:[1,44],98:[1,54],100:39,101:[1,63],103:[1,64],104:40,105:[1,65],106:41,107:[1,66],108:67,116:[1,42],121:37,122:[1,62],124:[1,31],125:[1,32],126:[1,33],127:[1,34],128:[1,35]},{27:156,28:[1,71],56:157,57:158,62:152,73:[1,68],87:[1,55],110:153,111:[1,154],112:155},{109:159,113:[1,160],114:[1,161]},{6:[2,86],11:165,25:[2,86],27:166,28:[1,71],29:167,30:[1,69],31:[1,70],39:163,40:164,42:168,44:[1,46],52:[2,86],74:162,75:[2,86],86:[1,111]},{1:[2,27],6:[2,27],25:[2,27],26:[2,27],41:[2,27],47:[2,27],52:[2,27],55:[2,27],64:[2,27],65:[2,27],66:[2,27],68:[2,27],70:[2,27],71:[2,27],75:[2,27],81:[2,27],82:[2,27],83:[2,27],88:[2,27],90:[2,27],99:[2,27],101:[2,27],102:[2,27],103:[2,27],107:[2,27],115:[2,27],123:[2,27],125:[2,27],126:[2,27],129:[2,27],130:[2,27],131:[2,27],132:[2,27],133:[2,27],134:[2,27]},{1:[2,28],6:[2,28],25:[2,28],26:[2,28],41:[2,28],47:[2,28],52:[2,28],55:[2,28],64:[2,28],65:[2,28],66:[2,28],68:[2,28],70:[2,28],71:[2,28],75:[2,28],81:[2,28],82:[2,28],83:[2,28],88:[2,28],90:[2,28],99:[2,28],101:[2,28],102:[2,28],103:[2,28],107:[2,28],115:[2,28],123:[2,28],125:[2,28],126:[2,28],129:[2,28],130:[2,28],131:[2,28],132:[2,28],133:[2,28],134:[2,28]},{1:[2,26],6:[2,26],25:[2,26],26:[2,26],38:[2,26],41:[2,26],47:[2,26],52:[2,26],55:[2,26],64:[2,26],65:[2,26],66:[2,26],68:[2,26],70:[2,26],71:[2,26],75:[2,26],77:[2,26],81:[2,26],82:[2,26],83:[2,26],88:[2,26],90:[2,26],99:[2,26],101:[2,26],102:[2,26],103:[2,26],107:[2,26],113:[2,26],114:[2,26],115:[2,26],123:[2,26],125:[2,26],126:[2,26],127:[2,26],128:[2,26],129:[2,26],130:[2,26],131:[2,26],132:[2,26],133:[2,26],134:[2,26],135:[2,26]},{1:[2,6],6:[2,6],7:169,8:6,9:7,10:20,11:21,12:[1,22],13:8,14:9,15:10,16:11,17:12,18:13,19:14,20:15,21:16,22:17,23:18,24:19,26:[2,6],27:60,28:[1,71],29:49,30:[1,69],31:[1,70],32:24,33:[1,50],34:[1,51],35:[1,52],36:[1,53],37:23,42:61,43:[1,45],44:[1,46],45:[1,29],48:30,49:[1,58],50:[1,59],56:47,57:48,59:36,61:25,62:26,63:27,73:[1,68],76:[1,43],80:[1,28],85:[1,56],86:[1,57],87:[1,55],93:[1,38],97:[1,44],98:[1,54],99:[2,6],100:39,101:[1,63],103:[1,64],104:40,105:[1,65],106:41,107:[1,66],108:67,116:[1,42],121:37,122:[1,62],124:[1,31],125:[1,32],126:[1,33],127:[1,34],128:[1,35]},{1:[2,3]},{1:[2,24],6:[2,24],25:[2,24],26:[2,24],47:[2,24],52:[2,24],55:[2,24],70:[2,24],75:[2,24],83:[2,24],88:[2,24],90:[2,24],95:[2,24],96:[2,24],99:[2,24],101:[2,24],102:[2,24],103:[2,24],107:[2,24],115:[2,24],118:[2,24],120:[2,24],123:[2,24],125:[2,24],126:[2,24],129:[2,24],130:[2,24],131:[2,24],132:[2,24],133:[2,24],134:[2,24]},{6:[1,72],26:[1,170]},{1:[2,185],6:[2,185],25:[2,185],26:[2,185],47:[2,185],52:[2,185],55:[2,185],70:[2,185],75:[2,185],83:[2,185],88:[2,185],90:[2,185],99:[2,185],101:[2,185],102:[2,185],103:[2,185],107:[2,185],115:[2,185],123:[2,185],125:[2,185],126:[2,185],129:[2,185],130:[2,185],131:[2,185],132:[2,185],133:[2,185],134:[2,185]},{8:171,9:115,10:20,11:21,12:[1,22],13:8,14:9,15:10,16:11,17:12,18:13,19:14,20:15,21:16,22:17,23:18,24:19,27:60,28:[1,71],29:49,30:[1,69],31:[1,70],32:24,33:[1,50],34:[1,51],35:[1,52],36:[1,53],37:23,42:61,43:[1,45],44:[1,46],45:[1,29],48:30,49:[1,58],50:[1,59],56:47,57:48,59:36,61:25,62:26,63:27,73:[1,68],76:[1,43],80:[1,28],85:[1,56],86:[1,57],87:[1,55],93:[1,38],97:[1,44],98:[1,54],100:39,101:[1,63],103:[1,64],104:40,105:[1,65],106:41,107:[1,66],108:67,116:[1,42],121:37,122:[1,62],124:[1,31],125:[1,32],126:[1,33],127:[1,34],128:[1,35]},{8:172,9:115,10:20,11:21,12:[1,22],13:8,14:9,15:10,16:11,17:12,18:13,19:14,20:15,21:16,22:17,23:18,24:19,27:60,28:[1,71],29:49,30:[1,69],31:[1,70],32:24,33:[1,50],34:[1,51],35:[1,52],36:[1,53],37:23,42:61,43:[1,45],44:[1,46],45:[1,29],48:30,49:[1,58],50:[1,59],56:47,57:48,59:36,61:25,62:26,63:27,73:[1,68],76:[1,43],80:[1,28],85:[1,56],86:[1,57],87:[1,55],93:[1,38],97:[1,44],98:[1,54],100:39,101:[1,63],103:[1,64],104:40,105:[1,65],106:41,107:[1,66],108:67,116:[1,42],121:37,122:[1,62],124:[1,31],125:[1,32],126:[1,33],127:[1,34],128:[1,35]},{8:173,9:115,10:20,11:21,12:[1,22],13:8,14:9,15:10,16:11,17:12,18:13,19:14,20:15,21:16,22:17,23:18,24:19,27:60,28:[1,71],29:49,30:[1,69],31:[1,70],32:24,33:[1,50],34:[1,51],35:[1,52],36:[1,53],37:23,42:61,43:[1,45],44:[1,46],45:[1,29],48:30,49:[1,58],50:[1,59],56:47,57:48,59:36,61:25,62:26,63:27,73:[1,68],76:[1,43],80:[1,28],85:[1,56],86:[1,57],87:[1,55],93:[1,38],97:[1,44],98:[1,54],100:39,101:[1,63],103:[1,64],104:40,105:[1,65],106:41,107:[1,66],108:67,116:[1,42],121:37,122:[1,62],124:[1,31],125:[1,32],126:[1,33],127:[1,34],128:[1,35]},{8:174,9:115,10:20,11:21,12:[1,22],13:8,14:9,15:10,16:11,17:12,18:13,19:14,20:15,21:16,22:17,23:18,24:19,27:60,28:[1,71],29:49,30:[1,69],31:[1,70],32:24,33:[1,50],34:[1,51],35:[1,52],36:[1,53],37:23,42:61,43:[1,45],44:[1,46],45:[1,29],48:30,49:[1,58],50:[1,59],56:47,57:48,59:36,61:25,62:26,63:27,73:[1,68],76:[1,43],80:[1,28],85:[1,56],86:[1,57],87:[1,55],93:[1,38],97:[1,44],98:[1,54],100:39,101:[1,63],103:[1,64],104:40,105:[1,65],106:41,107:[1,66],108:67,116:[1,42],121:37,122:[1,62],124:[1,31],125:[1,32],126:[1,33],127:[1,34],128:[1,35]},{8:175,9:115,10:20,11:21,12:[1,22],13:8,14:9,15:10,16:11,17:12,18:13,19:14,20:15,21:16,22:17,23:18,24:19,27:60,28:[1,71],29:49,30:[1,69],31:[1,70],32:24,33:[1,50],34:[1,51],35:[1,52],36:[1,53],37:23,42:61,43:[1,45],44:[1,46],45:[1,29],48:30,49:[1,58],50:[1,59],56:47,57:48,59:36,61:25,62:26,63:27,73:[1,68],76:[1,43],80:[1,28],85:[1,56],86:[1,57],87:[1,55],93:[1,38],97:[1,44],98:[1,54],100:39,101:[1,63],103:[1,64],104:40,105:[1,65],106:41,107:[1,66],108:67,116:[1,42],121:37,122:[1,62],124:[1,31],125:[1,32],126:[1,33],127:[1,34],128:[1,35]},{8:176,9:115,10:20,11:21,12:[1,22],13:8,14:9,15:10,16:11,17:12,18:13,19:14,20:15,21:16,22:17,23:18,24:19,27:60,28:[1,71],29:49,30:[1,69],31:[1,70],32:24,33:[1,50],34:[1,51],35:[1,52],36:[1,53],37:23,42:61,43:[1,45],44:[1,46],45:[1,29],48:30,49:[1,58],50:[1,59],56:47,57:48,59:36,61:25,62:26,63:27,73:[1,68],76:[1,43],80:[1,28],85:[1,56],86:[1,57],87:[1,55],93:[1,38],97:[1,44],98:[1,54],100:39,101:[1,63],103:[1,64],104:40,105:[1,65],106:41,107:[1,66],108:67,116:[1,42],121:37,122:[1,62],124:[1,31],125:[1,32],126:[1,33],127:[1,34],128:[1,35]},{8:177,9:115,10:20,11:21,12:[1,22],13:8,14:9,15:10,16:11,17:12,18:13,19:14,20:15,21:16,22:17,23:18,24:19,27:60,28:[1,71],29:49,30:[1,69],31:[1,70],32:24,33:[1,50],34:[1,51],35:[1,52],36:[1,53],37:23,42:61,43:[1,45],44:[1,46],45:[1,29],48:30,49:[1,58],50:[1,59],56:47,57:48,59:36,61:25,62:26,63:27,73:[1,68],76:[1,43],80:[1,28],85:[1,56],86:[1,57],87:[1,55],93:[1,38],97:[1,44],98:[1,54],100:39,101:[1,63],103:[1,64],104:40,105:[1,65],106:41,107:[1,66],108:67,116:[1,42],121:37,122:[1,62],124:[1,31],125:[1,32],126:[1,33],127:[1,34],128:[1,35]},{8:178,9:115,10:20,11:21,12:[1,22],13:8,14:9,15:10,16:11,17:12,18:13,19:14,20:15,21:16,22:17,23:18,24:19,27:60,28:[1,71],29:49,30:[1,69],31:[1,70],32:24,33:[1,50],34:[1,51],35:[1,52],36:[1,53],37:23,42:61,43:[1,45],44:[1,46],45:[1,29],48:30,49:[1,58],50:[1,59],56:47,57:48,59:36,61:25,62:26,63:27,73:[1,68],76:[1,43],80:[1,28],85:[1,56],86:[1,57],87:[1,55],93:[1,38],97:[1,44],98:[1,54],100:39,101:[1,63],103:[1,64],104:40,105:[1,65],106:41,107:[1,66],108:67,116:[1,42],121:37,122:[1,62],124:[1,31],125:[1,32],126:[1,33],127:[1,34],128:[1,35]},{1:[2,141],6:[2,141],25:[2,141],26:[2,141],47:[2,141],52:[2,141],55:[2,141],70:[2,141],75:[2,141],83:[2,141],88:[2,141],90:[2,141],99:[2,141],101:[2,141],102:[2,141],103:[2,141],107:[2,141],115:[2,141],123:[2,141],125:[2,141],126:[2,141],129:[2,141],130:[2,141],131:[2,141],132:[2,141],133:[2,141],134:[2,141]},{1:[2,146],6:[2,146],25:[2,146],26:[2,146],47:[2,146],52:[2,146],55:[2,146],70:[2,146],75:[2,146],83:[2,146],88:[2,146],90:[2,146],99:[2,146],101:[2,146],102:[2,146],103:[2,146],107:[2,146],115:[2,146],123:[2,146],125:[2,146],126:[2,146],129:[2,146],130:[2,146],131:[2,146],132:[2,146],133:[2,146],134:[2,146]},{8:179,9:115,10:20,11:21,12:[1,22],13:8,14:9,15:10,16:11,17:12,18:13,19:14,20:15,21:16,22:17,23:18,24:19,27:60,28:[1,71],29:49,30:[1,69],31:[1,70],32:24,33:[1,50],34:[1,51],35:[1,52],36:[1,53],37:23,42:61,43:[1,45],44:[1,46],45:[1,29],48:30,49:[1,58],50:[1,59],56:47,57:48,59:36,61:25,62:26,63:27,73:[1,68],76:[1,43],80:[1,28],85:[1,56],86:[1,57],87:[1,55],93:[1,38],97:[1,44],98:[1,54],100:39,101:[1,63],103:[1,64],104:40,105:[1,65],106:41,107:[1,66],108:67,116:[1,42],121:37,122:[1,62],124:[1,31],125:[1,32],126:[1,33],127:[1,34],128:[1,35]},{1:[2,140],6:[2,140],25:[2,140],26:[2,140],47:[2,140],52:[2,140],55:[2,140],70:[2,140],75:[2,140],83:[2,140],88:[2,140],90:[2,140],99:[2,140],101:[2,140],102:[2,140],103:[2,140],107:[2,140],115:[2,140],123:[2,140],125:[2,140],126:[2,140],129:[2,140],130:[2,140],131:[2,140],132:[2,140],133:[2,140],134:[2,140]},{1:[2,145],6:[2,145],25:[2,145],26:[2,145],47:[2,145],52:[2,145],55:[2,145],70:[2,145],75:[2,145],83:[2,145],88:[2,145],90:[2,145],99:[2,145],101:[2,145],102:[2,145],103:[2,145],107:[2,145],115:[2,145],123:[2,145],125:[2,145],126:[2,145],129:[2,145],130:[2,145],131:[2,145],132:[2,145],133:[2,145],134:[2,145]},{79:180,82:[1,103]},{1:[2,65],6:[2,65],25:[2,65],26:[2,65],38:[2,65],47:[2,65],52:[2,65],55:[2,65],64:[2,65],65:[2,65],66:[2,65],68:[2,65],70:[2,65],71:[2,65],75:[2,65],77:[2,65],81:[2,65],82:[2,65],83:[2,65],88:[2,65],90:[2,65],99:[2,65],101:[2,65],102:[2,65],103:[2,65],107:[2,65],115:[2,65],123:[2,65],125:[2,65],126:[2,65],127:[2,65],128:[2,65],129:[2,65],130:[2,65],131:[2,65],132:[2,65],133:[2,65],134:[2,65],135:[2,65]},{82:[2,104]},{27:181,28:[1,71]},{27:182,28:[1,71]},{1:[2,79],6:[2,79],25:[2,79],26:[2,79],27:183,28:[1,71],38:[2,79],47:[2,79],52:[2,79],55:[2,79],64:[2,79],65:[2,79],66:[2,79],68:[2,79],70:[2,79],71:[2,79],75:[2,79],77:[2,79],81:[2,79],82:[2,79],83:[2,79],88:[2,79],90:[2,79],99:[2,79],101:[2,79],102:[2,79],103:[2,79],107:[2,79],115:[2,79],123:[2,79],125:[2,79],126:[2,79],127:[2,79],128:[2,79],129:[2,79],130:[2,79],131:[2,79],132:[2,79],133:[2,79],134:[2,79],135:[2,79]},{1:[2,80],6:[2,80],25:[2,80],26:[2,80],38:[2,80],47:[2,80],52:[2,80],55:[2,80],64:[2,80],65:[2,80],66:[2,80],68:[2,80],70:[2,80],71:[2,80],75:[2,80],77:[2,80],81:[2,80],82:[2,80],83:[2,80],88:[2,80],90:[2,80],99:[2,80],101:[2,80],102:[2,80],103:[2,80],107:[2,80],115:[2,80],123:[2,80],125:[2,80],126:[2,80],127:[2,80],128:[2,80],129:[2,80],130:[2,80],131:[2,80],132:[2,80],133:[2,80],134:[2,80],135:[2,80]},{8:185,9:115,10:20,11:21,12:[1,22],13:8,14:9,15:10,16:11,17:12,18:13,19:14,20:15,21:16,22:17,23:18,24:19,27:60,28:[1,71],29:49,30:[1,69],31:[1,70],32:24,33:[1,50],34:[1,51],35:[1,52],36:[1,53],37:23,42:61,43:[1,45],44:[1,46],45:[1,29],48:30,49:[1,58],50:[1,59],55:[1,189],56:47,57:48,59:36,61:25,62:26,63:27,69:184,72:186,73:[1,68],76:[1,43],80:[1,28],85:[1,56],86:[1,57],87:[1,55],89:187,90:[1,188],93:[1,38],97:[1,44],98:[1,54],100:39,101:[1,63],103:[1,64],104:40,105:[1,65],106:41,107:[1,66],108:67,116:[1,42],121:37,122:[1,62],124:[1,31],125:[1,32],126:[1,33],127:[1,34],128:[1,35]},{67:190,68:[1,97],71:[1,98]},{79:191,82:[1,103]},{1:[2,66],6:[2,66],25:[2,66],26:[2,66],38:[2,66],47:[2,66],52:[2,66],55:[2,66],64:[2,66],65:[2,66],66:[2,66],68:[2,66],70:[2,66],71:[2,66],75:[2,66],77:[2,66],81:[2,66],82:[2,66],83:[2,66],88:[2,66],90:[2,66],99:[2,66],101:[2,66],102:[2,66],103:[2,66],107:[2,66],115:[2,66],123:[2,66],125:[2,66],126:[2,66],127:[2,66],128:[2,66],129:[2,66],130:[2,66],131:[2,66],132:[2,66],133:[2,66],134:[2,66],135:[2,66]},{6:[1,193],8:192,9:115,10:20,11:21,12:[1,22],13:8,14:9,15:10,16:11,17:12,18:13,19:14,20:15,21:16,22:17,23:18,24:19,25:[1,194],27:60,28:[1,71],29:49,30:[1,69],31:[1,70],32:24,33:[1,50],34:[1,51],35:[1,52],36:[1,53],37:23,42:61,43:[1,45],44:[1,46],45:[1,29],48:30,49:[1,58],50:[1,59],56:47,57:48,59:36,61:25,62:26,63:27,73:[1,68],76:[1,43],80:[1,28],85:[1,56],86:[1,57],87:[1,55],93:[1,38],97:[1,44],98:[1,54],100:39,101:[1,63],103:[1,64],104:40,105:[1,65],106:41,107:[1,66],108:67,116:[1,42],121:37,122:[1,62],124:[1,31],125:[1,32],126:[1,33],127:[1,34],128:[1,35]},{1:[2,102],6:[2,102],25:[2,102],26:[2,102],47:[2,102],52:[2,102],55:[2,102],64:[2,102],65:[2,102],66:[2,102],68:[2,102],70:[2,102],71:[2,102],75:[2,102],81:[2,102],82:[2,102],83:[2,102],88:[2,102],90:[2,102],99:[2,102],101:[2,102],102:[2,102],103:[2,102],107:[2,102],115:[2,102],123:[2,102],125:[2,102],126:[2,102],129:[2,102],130:[2,102],131:[2,102],132:[2,102],133:[2,102],134:[2,102]},{8:197,9:115,10:20,11:21,12:[1,22],13:8,14:9,15:10,16:11,17:12,18:13,19:14,20:15,21:16,22:17,23:18,24:19,25:[1,144],27:60,28:[1,71],29:49,30:[1,69],31:[1,70],32:24,33:[1,50],34:[1,51],35:[1,52],36:[1,53],37:23,42:61,43:[1,45],44:[1,46],45:[1,29],48:30,49:[1,58],50:[1,59],56:47,57:48,58:145,59:36,61:25,62:26,63:27,73:[1,68],76:[1,43],80:[1,28],83:[1,195],84:196,85:[1,56],86:[1,57],87:[1,55],91:143,93:[1,38],97:[1,44],98:[1,54],100:39,101:[1,63],103:[1,64],104:40,105:[1,65],106:41,107:[1,66],108:67,116:[1,42],121:37,122:[1,62],124:[1,31],125:[1,32],126:[1,33],127:[1,34],128:[1,35]},{47:[1,198],52:[1,199]},{47:[2,54],52:[2,54]},{38:[1,201],47:[2,56],52:[2,56],55:[1,200]},{38:[2,59],47:[2,59],52:[2,59],55:[2,59]},{38:[2,60],47:[2,60],52:[2,60],55:[2,60]},{38:[2,61],47:[2,61],52:[2,61],55:[2,61]},{38:[2,62],47:[2,62],52:[2,62],55:[2,62]},{27:146,28:[1,71]},{8:197,9:115,10:20,11:21,12:[1,22],13:8,14:9,15:10,16:11,17:12,18:13,19:14,20:15,21:16,22:17,23:18,24:19,25:[1,144],27:60,28:[1,71],29:49,30:[1,69],31:[1,70],32:24,33:[1,50],34:[1,51],35:[1,52],36:[1,53],37:23,42:61,43:[1,45],44:[1,46],45:[1,29],48:30,49:[1,58],50:[1,59],56:47,57:48,58:145,59:36,61:25,62:26,63:27,73:[1,68],76:[1,43],80:[1,28],84:142,85:[1,56],86:[1,57],87:[1,55],88:[1,141],91:143,93:[1,38],97:[1,44],98:[1,54],100:39,101:[1,63],103:[1,64],104:40,105:[1,65],106:41,107:[1,66],108:67,116:[1,42],121:37,122:[1,62],124:[1,31],125:[1,32],126:[1,33],127:[1,34],128:[1,35]},{1:[2,48],6:[2,48],25:[2,48],26:[2,48],47:[2,48],52:[2,48],55:[2,48],70:[2,48],75:[2,48],83:[2,48],88:[2,48],90:[2,48],99:[2,48],101:[2,48],102:[2,48],103:[2,48],107:[2,48],115:[2,48],123:[2,48],125:[2,48],126:[2,48],129:[2,48],130:[2,48],131:[2,48],132:[2,48],133:[2,48],134:[2,48]},{1:[2,178],6:[2,178],25:[2,178],26:[2,178],47:[2,178],52:[2,178],55:[2,178],70:[2,178],75:[2,178],83:[2,178],88:[2,178],90:[2,178],99:[2,178],100:85,101:[2,178],102:[2,178],103:[2,178],106:86,107:[2,178],108:67,115:[2,178],123:[2,178],125:[2,178],126:[2,178],129:[1,76],130:[2,178],131:[2,178],132:[2,178],133:[2,178],134:[2,178]},{100:88,101:[1,63],103:[1,64],106:89,107:[1,66],108:67,123:[1,87]},{1:[2,179],6:[2,179],25:[2,179],26:[2,179],47:[2,179],52:[2,179],55:[2,179],70:[2,179],75:[2,179],83:[2,179],88:[2,179],90:[2,179],99:[2,179],100:85,101:[2,179],102:[2,179],103:[2,179],106:86,107:[2,179],108:67,115:[2,179],123:[2,179],125:[2,179],126:[2,179],129:[1,76],130:[2,179],131:[2,179],132:[2,179],133:[2,179],134:[2,179]},{1:[2,180],6:[2,180],25:[2,180],26:[2,180],47:[2,180],52:[2,180],55:[2,180],70:[2,180],75:[2,180],83:[2,180],88:[2,180],90:[2,180],99:[2,180],100:85,101:[2,180],102:[2,180],103:[2,180],106:86,107:[2,180],108:67,115:[2,180],123:[2,180],125:[2,180],126:[2,180],129:[1,76],130:[2,180],131:[2,180],132:[2,180],133:[2,180],134:[2,180]},{1:[2,181],6:[2,181],25:[2,181],26:[2,181],47:[2,181],52:[2,181],55:[2,181],64:[2,68],65:[2,68],66:[2,68],68:[2,68],70:[2,181],71:[2,68],75:[2,181],81:[2,68],82:[2,68],83:[2,181],88:[2,181],90:[2,181],99:[2,181],101:[2,181],102:[2,181],103:[2,181],107:[2,181],115:[2,181],123:[2,181],125:[2,181],126:[2,181],129:[2,181],130:[2,181],131:[2,181],132:[2,181],133:[2,181],134:[2,181]},{60:91,64:[1,93],65:[1,94],66:[1,95],67:96,68:[1,97],71:[1,98],78:90,81:[1,92],82:[2,103]},{60:100,64:[1,93],65:[1,94],66:[1,95],67:96,68:[1,97],71:[1,98],78:99,81:[1,92],82:[2,103]},{64:[2,71],65:[2,71],66:[2,71],68:[2,71],71:[2,71],81:[2,71],82:[2,71]},{1:[2,182],6:[2,182],25:[2,182],26:[2,182],47:[2,182],52:[2,182],55:[2,182],64:[2,68],65:[2,68],66:[2,68],68:[2,68],70:[2,182],71:[2,68],75:[2,182],81:[2,68],82:[2,68],83:[2,182],88:[2,182],90:[2,182],99:[2,182],101:[2,182],102:[2,182],103:[2,182],107:[2,182],115:[2,182],123:[2,182],125:[2,182],126:[2,182],129:[2,182],130:[2,182],131:[2,182],132:[2,182],133:[2,182],134:[2,182]},{1:[2,183],6:[2,183],25:[2,183],26:[2,183],47:[2,183],52:[2,183],55:[2,183],70:[2,183],75:[2,183],83:[2,183],88:[2,183],90:[2,183],99:[2,183],101:[2,183],102:[2,183],103:[2,183],107:[2,183],115:[2,183],123:[2,183],125:[2,183],126:[2,183],129:[2,183],130:[2,183],131:[2,183],132:[2,183],133:[2,183],134:[2,183]},{1:[2,184],6:[2,184],25:[2,184],26:[2,184],47:[2,184],52:[2,184],55:[2,184],70:[2,184],75:[2,184],83:[2,184],88:[2,184],90:[2,184],99:[2,184],101:[2,184],102:[2,184],103:[2,184],107:[2,184],115:[2,184],123:[2,184],125:[2,184],126:[2,184],129:[2,184],130:[2,184],131:[2,184],132:[2,184],133:[2,184],134:[2,184]},{8:202,9:115,10:20,11:21,12:[1,22],13:8,14:9,15:10,16:11,17:12,18:13,19:14,20:15,21:16,22:17,23:18,24:19,25:[1,203],27:60,28:[1,71],29:49,30:[1,69],31:[1,70],32:24,33:[1,50],34:[1,51],35:[1,52],36:[1,53],37:23,42:61,43:[1,45],44:[1,46],45:[1,29],48:30,49:[1,58],50:[1,59],56:47,57:48,59:36,61:25,62:26,63:27,73:[1,68],76:[1,43],80:[1,28],85:[1,56],86:[1,57],87:[1,55],93:[1,38],97:[1,44],98:[1,54],100:39,101:[1,63],103:[1,64],104:40,105:[1,65],106:41,107:[1,66],108:67,116:[1,42],121:37,122:[1,62],124:[1,31],125:[1,32],126:[1,33],127:[1,34],128:[1,35]},{8:204,9:115,10:20,11:21,12:[1,22],13:8,14:9,15:10,16:11,17:12,18:13,19:14,20:15,21:16,22:17,23:18,24:19,27:60,28:[1,71],29:49,30:[1,69],31:[1,70],32:24,33:[1,50],34:[1,51],35:[1,52],36:[1,53],37:23,42:61,43:[1,45],44:[1,46],45:[1,29],48:30,49:[1,58],50:[1,59],56:47,57:48,59:36,61:25,62:26,63:27,73:[1,68],76:[1,43],80:[1,28],85:[1,56],86:[1,57],87:[1,55],93:[1,38],97:[1,44],98:[1,54],100:39,101:[1,63],103:[1,64],104:40,105:[1,65],106:41,107:[1,66],108:67,116:[1,42],121:37,122:[1,62],124:[1,31],125:[1,32],126:[1,33],127:[1,34],128:[1,35]},{5:205,25:[1,5],122:[1,206]},{1:[2,127],6:[2,127],25:[2,127],26:[2,127],47:[2,127],52:[2,127],55:[2,127],70:[2,127],75:[2,127],83:[2,127],88:[2,127],90:[2,127],94:207,95:[1,208],96:[1,209],99:[2,127],101:[2,127],102:[2,127],103:[2,127],107:[2,127],115:[2,127],123:[2,127],125:[2,127],126:[2,127],129:[2,127],130:[2,127],131:[2,127],132:[2,127],133:[2,127],134:[2,127]},{1:[2,139],6:[2,139],25:[2,139],26:[2,139],47:[2,139],52:[2,139],55:[2,139],70:[2,139],75:[2,139],83:[2,139],88:[2,139],90:[2,139],99:[2,139],101:[2,139],102:[2,139],103:[2,139],107:[2,139],115:[2,139],123:[2,139],125:[2,139],126:[2,139],129:[2,139],130:[2,139],131:[2,139],132:[2,139],133:[2,139],134:[2,139]},{1:[2,147],6:[2,147],25:[2,147],26:[2,147],47:[2,147],52:[2,147],55:[2,147],70:[2,147],75:[2,147],83:[2,147],88:[2,147],90:[2,147],99:[2,147],101:[2,147],102:[2,147],103:[2,147],107:[2,147],115:[2,147],123:[2,147],125:[2,147],126:[2,147],129:[2,147],130:[2,147],131:[2,147],132:[2,147],133:[2,147],134:[2,147]},{25:[1,210],100:85,101:[1,63],103:[1,64],106:86,107:[1,66],108:67,123:[1,84],125:[1,78],126:[1,77],129:[1,76],130:[1,79],131:[1,80],132:[1,81],133:[1,82],134:[1,83]},{117:211,119:212,120:[1,213]},{1:[2,92],6:[2,92],25:[2,92],26:[2,92],47:[2,92],52:[2,92],55:[2,92],70:[2,92],75:[2,92],83:[2,92],88:[2,92],90:[2,92],99:[2,92],101:[2,92],102:[2,92],103:[2,92],107:[2,92],115:[2,92],123:[2,92],125:[2,92],126:[2,92],129:[2,92],130:[2,92],131:[2,92],132:[2,92],133:[2,92],134:[2,92]},{8:214,9:115,10:20,11:21,12:[1,22],13:8,14:9,15:10,16:11,17:12,18:13,19:14,20:15,21:16,22:17,23:18,24:19,27:60,28:[1,71],29:49,30:[1,69],31:[1,70],32:24,33:[1,50],34:[1,51],35:[1,52],36:[1,53],37:23,42:61,43:[1,45],44:[1,46],45:[1,29],48:30,49:[1,58],50:[1,59],56:47,57:48,59:36,61:25,62:26,63:27,73:[1,68],76:[1,43],80:[1,28],85:[1,56],86:[1,57],87:[1,55],93:[1,38],97:[1,44],98:[1,54],100:39,101:[1,63],103:[1,64],104:40,105:[1,65],106:41,107:[1,66],108:67,116:[1,42],121:37,122:[1,62],124:[1,31],125:[1,32],126:[1,33],127:[1,34],128:[1,35]},{1:[2,95],5:215,6:[2,95],25:[1,5],26:[2,95],47:[2,95],52:[2,95],55:[2,95],64:[2,68],65:[2,68],66:[2,68],68:[2,68],70:[2,95],71:[2,68],75:[2,95],77:[1,216],81:[2,68],82:[2,68],83:[2,95],88:[2,95],90:[2,95],99:[2,95],101:[2,95],102:[2,95],103:[2,95],107:[2,95],115:[2,95],123:[2,95],125:[2,95],126:[2,95],129:[2,95],130:[2,95],131:[2,95],132:[2,95],133:[2,95],134:[2,95]},{1:[2,132],6:[2,132],25:[2,132],26:[2,132],47:[2,132],52:[2,132],55:[2,132],70:[2,132],75:[2,132],83:[2,132],88:[2,132],90:[2,132],99:[2,132],100:85,101:[2,132],102:[2,132],103:[2,132],106:86,107:[2,132],108:67,115:[2,132],123:[2,132],125:[1,78],126:[1,77],129:[1,76],130:[1,79],131:[1,80],132:[1,81],133:[1,82],134:[1,83]},{1:[2,44],6:[2,44],26:[2,44],99:[2,44],100:85,101:[2,44],103:[2,44],106:86,107:[2,44],108:67,123:[2,44],125:[1,78],126:[1,77],129:[1,76],130:[1,79],131:[1,80],132:[1,81],133:[1,82],134:[1,83]},{6:[1,72],99:[1,217]},{4:218,7:4,8:6,9:7,10:20,11:21,12:[1,22],13:8,14:9,15:10,16:11,17:12,18:13,19:14,20:15,21:16,22:17,23:18,24:19,27:60,28:[1,71],29:49,30:[1,69],31:[1,70],32:24,33:[1,50],34:[1,51],35:[1,52],36:[1,53],37:23,42:61,43:[1,45],44:[1,46],45:[1,29],48:30,49:[1,58],50:[1,59],56:47,57:48,59:36,61:25,62:26,63:27,73:[1,68],76:[1,43],80:[1,28],85:[1,56],86:[1,57],87:[1,55],93:[1,38],97:[1,44],98:[1,54],100:39,101:[1,63],103:[1,64],104:40,105:[1,65],106:41,107:[1,66],108:67,116:[1,42],121:37,122:[1,62],124:[1,31],125:[1,32],126:[1,33],127:[1,34],128:[1,35]},{6:[2,123],25:[2,123],52:[2,123],55:[1,220],88:[2,123],89:219,90:[1,188],100:85,101:[1,63],103:[1,64],106:86,107:[1,66],108:67,123:[1,84],125:[1,78],126:[1,77],129:[1,76],130:[1,79],131:[1,80],132:[1,81],133:[1,82],134:[1,83]},{1:[2,110],6:[2,110],25:[2,110],26:[2,110],38:[2,110],47:[2,110],52:[2,110],55:[2,110],64:[2,110],65:[2,110],66:[2,110],68:[2,110],70:[2,110],71:[2,110],75:[2,110],81:[2,110],82:[2,110],83:[2,110],88:[2,110],90:[2,110],99:[2,110],101:[2,110],102:[2,110],103:[2,110],107:[2,110],113:[2,110],114:[2,110],115:[2,110],123:[2,110],125:[2,110],126:[2,110],129:[2,110],130:[2,110],131:[2,110],132:[2,110],133:[2,110],134:[2,110]},{6:[2,51],25:[2,51],51:221,52:[1,222],88:[2,51]},{6:[2,118],25:[2,118],26:[2,118],52:[2,118],83:[2,118],88:[2,118]},{8:197,9:115,10:20,11:21,12:[1,22],13:8,14:9,15:10,16:11,17:12,18:13,19:14,20:15,21:16,22:17,23:18,24:19,25:[1,144],27:60,28:[1,71],29:49,30:[1,69],31:[1,70],32:24,33:[1,50],34:[1,51],35:[1,52],36:[1,53],37:23,42:61,43:[1,45],44:[1,46],45:[1,29],48:30,49:[1,58],50:[1,59],56:47,57:48,58:145,59:36,61:25,62:26,63:27,73:[1,68],76:[1,43],80:[1,28],84:223,85:[1,56],86:[1,57],87:[1,55],91:143,93:[1,38],97:[1,44],98:[1,54],100:39,101:[1,63],103:[1,64],104:40,105:[1,65],106:41,107:[1,66],108:67,116:[1,42],121:37,122:[1,62],124:[1,31],125:[1,32],126:[1,33],127:[1,34],128:[1,35]},{6:[2,124],25:[2,124],26:[2,124],52:[2,124],83:[2,124],88:[2,124]},{1:[2,109],6:[2,109],25:[2,109],26:[2,109],38:[2,109],41:[2,109],47:[2,109],52:[2,109],55:[2,109],64:[2,109],65:[2,109],66:[2,109],68:[2,109],70:[2,109],71:[2,109],75:[2,109],77:[2,109],81:[2,109],82:[2,109],83:[2,109],88:[2,109],90:[2,109],99:[2,109],101:[2,109],102:[2,109],103:[2,109],107:[2,109],115:[2,109],123:[2,109],125:[2,109],126:[2,109],127:[2,109],128:[2,109],129:[2,109],130:[2,109],131:[2,109],132:[2,109],133:[2,109],134:[2,109],135:[2,109]},{5:224,25:[1,5],100:85,101:[1,63],103:[1,64],106:86,107:[1,66],108:67,123:[1,84],125:[1,78],126:[1,77],129:[1,76],130:[1,79],131:[1,80],132:[1,81],133:[1,82],134:[1,83]},{1:[2,135],6:[2,135],25:[2,135],26:[2,135],47:[2,135],52:[2,135],55:[2,135],70:[2,135],75:[2,135],83:[2,135],88:[2,135],90:[2,135],99:[2,135],100:85,101:[1,63],102:[1,225],103:[1,64],106:86,107:[1,66],108:67,115:[2,135],123:[2,135],125:[1,78],126:[1,77],129:[1,76],130:[1,79],131:[1,80],132:[1,81],133:[1,82],134:[1,83]},{1:[2,137],6:[2,137],25:[2,137],26:[2,137],47:[2,137],52:[2,137],55:[2,137],70:[2,137],75:[2,137],83:[2,137],88:[2,137],90:[2,137],99:[2,137],100:85,101:[1,63],102:[1,226],103:[1,64],106:86,107:[1,66],108:67,115:[2,137],123:[2,137],125:[1,78],126:[1,77],129:[1,76],130:[1,79],131:[1,80],132:[1,81],133:[1,82],134:[1,83]},{1:[2,143],6:[2,143],25:[2,143],26:[2,143],47:[2,143],52:[2,143],55:[2,143],70:[2,143],75:[2,143],83:[2,143],88:[2,143],90:[2,143],99:[2,143],101:[2,143],102:[2,143],103:[2,143],107:[2,143],115:[2,143],123:[2,143],125:[2,143],126:[2,143],129:[2,143],130:[2,143],131:[2,143],132:[2,143],133:[2,143],134:[2,143]},{1:[2,144],6:[2,144],25:[2,144],26:[2,144],47:[2,144],52:[2,144],55:[2,144],70:[2,144],75:[2,144],83:[2,144],88:[2,144],90:[2,144],99:[2,144],100:85,101:[1,63],102:[2,144],103:[1,64],106:86,107:[1,66],108:67,115:[2,144],123:[2,144],125:[1,78],126:[1,77],129:[1,76],130:[1,79],131:[1,80],132:[1,81],133:[1,82],134:[1,83]},{1:[2,148],6:[2,148],25:[2,148],26:[2,148],47:[2,148],52:[2,148],55:[2,148],70:[2,148],75:[2,148],83:[2,148],88:[2,148],90:[2,148],99:[2,148],101:[2,148],102:[2,148],103:[2,148],107:[2,148],115:[2,148],123:[2,148],125:[2,148],126:[2,148],129:[2,148],130:[2,148],131:[2,148],132:[2,148],133:[2,148],134:[2,148]},{113:[2,150],114:[2,150]},{27:156,28:[1,71],56:157,57:158,73:[1,68],87:[1,112],110:227,112:155},{52:[1,228],113:[2,155],114:[2,155]},{52:[2,152],113:[2,152],114:[2,152]},{52:[2,153],113:[2,153],114:[2,153]},{52:[2,154],113:[2,154],114:[2,154]},{1:[2,149],6:[2,149],25:[2,149],26:[2,149],47:[2,149],52:[2,149],55:[2,149],70:[2,149],75:[2,149],83:[2,149],88:[2,149],90:[2,149],99:[2,149],101:[2,149],102:[2,149],103:[2,149],107:[2,149],115:[2,149],123:[2,149],125:[2,149],126:[2,149],129:[2,149],130:[2,149],131:[2,149],132:[2,149],133:[2,149],134:[2,149]},{8:229,9:115,10:20,11:21,12:[1,22],13:8,14:9,15:10,16:11,17:12,18:13,19:14,20:15,21:16,22:17,23:18,24:19,27:60,28:[1,71],29:49,30:[1,69],31:[1,70],32:24,33:[1,50],34:[1,51],35:[1,52],36:[1,53],37:23,42:61,43:[1,45],44:[1,46],45:[1,29],48:30,49:[1,58],50:[1,59],56:47,57:48,59:36,61:25,62:26,63:27,73:[1,68],76:[1,43],80:[1,28],85:[1,56],86:[1,57],87:[1,55],93:[1,38],97:[1,44],98:[1,54],100:39,101:[1,63],103:[1,64],104:40,105:[1,65],106:41,107:[1,66],108:67,116:[1,42],121:37,122:[1,62],124:[1,31],125:[1,32],126:[1,33],127:[1,34],128:[1,35]},{8:230,9:115,10:20,11:21,12:[1,22],13:8,14:9,15:10,16:11,17:12,18:13,19:14,20:15,21:16,22:17,23:18,24:19,27:60,28:[1,71],29:49,30:[1,69],31:[1,70],32:24,33:[1,50],34:[1,51],35:[1,52],36:[1,53],37:23,42:61,43:[1,45],44:[1,46],45:[1,29],48:30,49:[1,58],50:[1,59],56:47,57:48,59:36,61:25,62:26,63:27,73:[1,68],76:[1,43],80:[1,28],85:[1,56],86:[1,57],87:[1,55],93:[1,38],97:[1,44],98:[1,54],100:39,101:[1,63],103:[1,64],104:40,105:[1,65],106:41,107:[1,66],108:67,116:[1,42],121:37,122:[1,62],124:[1,31],125:[1,32],126:[1,33],127:[1,34],128:[1,35]},{6:[2,51],25:[2,51],51:231,52:[1,232],75:[2,51]},{6:[2,87],25:[2,87],26:[2,87],52:[2,87],75:[2,87]},{6:[2,37],25:[2,37],26:[2,37],41:[1,233],52:[2,37],75:[2,37]},{6:[2,40],25:[2,40],26:[2,40],52:[2,40],75:[2,40]},{6:[2,41],25:[2,41],26:[2,41],41:[2,41],52:[2,41],75:[2,41]},{6:[2,42],25:[2,42],26:[2,42],41:[2,42],52:[2,42],75:[2,42]},{6:[2,43],25:[2,43],26:[2,43],41:[2,43],52:[2,43],75:[2,43]},{1:[2,5],6:[2,5],26:[2,5],99:[2,5]},{1:[2,25],6:[2,25],25:[2,25],26:[2,25],47:[2,25],52:[2,25],55:[2,25],70:[2,25],75:[2,25],83:[2,25],88:[2,25],90:[2,25],95:[2,25],96:[2,25],99:[2,25],101:[2,25],102:[2,25],103:[2,25],107:[2,25],115:[2,25],118:[2,25],120:[2,25],123:[2,25],125:[2,25],126:[2,25],129:[2,25],130:[2,25],131:[2,25],132:[2,25],133:[2,25],134:[2,25]},{1:[2,186],6:[2,186],25:[2,186],26:[2,186],47:[2,186],52:[2,186],55:[2,186],70:[2,186],75:[2,186],83:[2,186],88:[2,186],90:[2,186],99:[2,186],100:85,101:[2,186],102:[2,186],103:[2,186],106:86,107:[2,186],108:67,115:[2,186],123:[2,186],125:[2,186],126:[2,186],129:[1,76],130:[1,79],131:[2,186],132:[2,186],133:[2,186],134:[2,186]},{1:[2,187],6:[2,187],25:[2,187],26:[2,187],47:[2,187],52:[2,187],55:[2,187],70:[2,187],75:[2,187],83:[2,187],88:[2,187],90:[2,187],99:[2,187],100:85,101:[2,187],102:[2,187],103:[2,187],106:86,107:[2,187],108:67,115:[2,187],123:[2,187],125:[2,187],126:[2,187],129:[1,76],130:[1,79],131:[2,187],132:[2,187],133:[2,187],134:[2,187]},{1:[2,188],6:[2,188],25:[2,188],26:[2,188],47:[2,188],52:[2,188],55:[2,188],70:[2,188],75:[2,188],83:[2,188],88:[2,188],90:[2,188],99:[2,188],100:85,101:[2,188],102:[2,188],103:[2,188],106:86,107:[2,188],108:67,115:[2,188],123:[2,188],125:[2,188],126:[2,188],129:[1,76],130:[2,188],131:[2,188],132:[2,188],133:[2,188],134:[2,188]},{1:[2,189],6:[2,189],25:[2,189],26:[2,189],47:[2,189],52:[2,189],55:[2,189],70:[2,189],75:[2,189],83:[2,189],88:[2,189],90:[2,189],99:[2,189],100:85,101:[2,189],102:[2,189],103:[2,189],106:86,107:[2,189],108:67,115:[2,189],123:[2,189],125:[1,78],126:[1,77],129:[1,76],130:[1,79],131:[2,189],132:[2,189],133:[2,189],134:[2,189]},{1:[2,190],6:[2,190],25:[2,190],26:[2,190],47:[2,190],52:[2,190],55:[2,190],70:[2,190],75:[2,190],83:[2,190],88:[2,190],90:[2,190],99:[2,190],100:85,101:[2,190],102:[2,190],103:[2,190],106:86,107:[2,190],108:67,115:[2,190],123:[2,190],125:[1,78],126:[1,77],129:[1,76],130:[1,79],131:[1,80],132:[2,190],133:[2,190],134:[1,83]},{1:[2,191],6:[2,191],25:[2,191],26:[2,191],47:[2,191],52:[2,191],55:[2,191],70:[2,191],75:[2,191],83:[2,191],88:[2,191],90:[2,191],99:[2,191],100:85,101:[2,191],102:[2,191],103:[2,191],106:86,107:[2,191],108:67,115:[2,191],123:[2,191],125:[1,78],126:[1,77],129:[1,76],130:[1,79],131:[1,80],132:[1,81],133:[2,191],134:[1,83]},{1:[2,192],6:[2,192],25:[2,192],26:[2,192],47:[2,192],52:[2,192],55:[2,192],70:[2,192],75:[2,192],83:[2,192],88:[2,192],90:[2,192],99:[2,192],100:85,101:[2,192],102:[2,192],103:[2,192],106:86,107:[2,192],108:67,115:[2,192],123:[2,192],125:[1,78],126:[1,77],129:[1,76],130:[1,79],131:[1,80],132:[2,192],133:[2,192],134:[2,192]},{1:[2,177],6:[2,177],25:[2,177],26:[2,177],47:[2,177],52:[2,177],55:[2,177],70:[2,177],75:[2,177],83:[2,177],88:[2,177],90:[2,177],99:[2,177],100:85,101:[1,63],102:[2,177],103:[1,64],106:86,107:[1,66],108:67,115:[2,177],123:[1,84],125:[1,78],126:[1,77],129:[1,76],130:[1,79],131:[1,80],132:[1,81],133:[1,82],134:[1,83]},{1:[2,176],6:[2,176],25:[2,176],26:[2,176],47:[2,176],52:[2,176],55:[2,176],70:[2,176],75:[2,176],83:[2,176],88:[2,176],90:[2,176],99:[2,176],100:85,101:[1,63],102:[2,176],103:[1,64],106:86,107:[1,66],108:67,115:[2,176],123:[1,84],125:[1,78],126:[1,77],129:[1,76],130:[1,79],131:[1,80],132:[1,81],133:[1,82],134:[1,83]},{1:[2,99],6:[2,99],25:[2,99],26:[2,99],47:[2,99],52:[2,99],55:[2,99],64:[2,99],65:[2,99],66:[2,99],68:[2,99],70:[2,99],71:[2,99],75:[2,99],81:[2,99],82:[2,99],83:[2,99],88:[2,99],90:[2,99],99:[2,99],101:[2,99],102:[2,99],103:[2,99],107:[2,99],115:[2,99],123:[2,99],125:[2,99],126:[2,99],129:[2,99],130:[2,99],131:[2,99],132:[2,99],133:[2,99],134:[2,99]},{1:[2,76],6:[2,76],25:[2,76],26:[2,76],38:[2,76],47:[2,76],52:[2,76],55:[2,76],64:[2,76],65:[2,76],66:[2,76],68:[2,76],70:[2,76],71:[2,76],75:[2,76],77:[2,76],81:[2,76],82:[2,76],83:[2,76],88:[2,76],90:[2,76],99:[2,76],101:[2,76],102:[2,76],103:[2,76],107:[2,76],115:[2,76],123:[2,76],125:[2,76],126:[2,76],127:[2,76],128:[2,76],129:[2,76],130:[2,76],131:[2,76],132:[2,76],133:[2,76],134:[2,76],135:[2,76]},{1:[2,77],6:[2,77],25:[2,77],26:[2,77],38:[2,77],47:[2,77],52:[2,77],55:[2,77],64:[2,77],65:[2,77],66:[2,77],68:[2,77],70:[2,77],71:[2,77],75:[2,77],77:[2,77],81:[2,77],82:[2,77],83:[2,77],88:[2,77],90:[2,77],99:[2,77],101:[2,77],102:[2,77],103:[2,77],107:[2,77],115:[2,77],123:[2,77],125:[2,77],126:[2,77],127:[2,77],128:[2,77],129:[2,77],130:[2,77],131:[2,77],132:[2,77],133:[2,77],134:[2,77],135:[2,77]},{1:[2,78],6:[2,78],25:[2,78],26:[2,78],38:[2,78],47:[2,78],52:[2,78],55:[2,78],64:[2,78],65:[2,78],66:[2,78],68:[2,78],70:[2,78],71:[2,78],75:[2,78],77:[2,78],81:[2,78],82:[2,78],83:[2,78],88:[2,78],90:[2,78],99:[2,78],101:[2,78],102:[2,78],103:[2,78],107:[2,78],115:[2,78],123:[2,78],125:[2,78],126:[2,78],127:[2,78],128:[2,78],129:[2,78],130:[2,78],131:[2,78],132:[2,78],133:[2,78],134:[2,78],135:[2,78]},{70:[1,234]},{55:[1,189],70:[2,83],89:235,90:[1,188],100:85,101:[1,63],103:[1,64],106:86,107:[1,66],108:67,123:[1,84],125:[1,78],126:[1,77],129:[1,76],130:[1,79],131:[1,80],132:[1,81],133:[1,82],134:[1,83]},{70:[2,84]},{8:236,9:115,10:20,11:21,12:[1,22],13:8,14:9,15:10,16:11,17:12,18:13,19:14,20:15,21:16,22:17,23:18,24:19,27:60,28:[1,71],29:49,30:[1,69],31:[1,70],32:24,33:[1,50],34:[1,51],35:[1,52],36:[1,53],37:23,42:61,43:[1,45],44:[1,46],45:[1,29],48:30,49:[1,58],50:[1,59],56:47,57:48,59:36,61:25,62:26,63:27,73:[1,68],76:[1,43],80:[1,28],85:[1,56],86:[1,57],87:[1,55],93:[1,38],97:[1,44],98:[1,54],100:39,101:[1,63],103:[1,64],104:40,105:[1,65],106:41,107:[1,66],108:67,116:[1,42],121:37,122:[1,62],124:[1,31],125:[1,32],126:[1,33],127:[1,34],128:[1,35]},{12:[2,112],28:[2,112],30:[2,112],31:[2,112],33:[2,112],34:[2,112],35:[2,112],36:[2,112],43:[2,112],44:[2,112],45:[2,112],49:[2,112],50:[2,112],70:[2,112],73:[2,112],76:[2,112],80:[2,112],85:[2,112],86:[2,112],87:[2,112],93:[2,112],97:[2,112],98:[2,112],101:[2,112],103:[2,112],105:[2,112],107:[2,112],116:[2,112],122:[2,112],124:[2,112],125:[2,112],126:[2,112],127:[2,112],128:[2,112]},{12:[2,113],28:[2,113],30:[2,113],31:[2,113],33:[2,113],34:[2,113],35:[2,113],36:[2,113],43:[2,113],44:[2,113],45:[2,113],49:[2,113],50:[2,113],70:[2,113],73:[2,113],76:[2,113],80:[2,113],85:[2,113],86:[2,113],87:[2,113],93:[2,113],97:[2,113],98:[2,113],101:[2,113],103:[2,113],105:[2,113],107:[2,113],116:[2,113],122:[2,113],124:[2,113],125:[2,113],126:[2,113],127:[2,113],128:[2,113]},{1:[2,82],6:[2,82],25:[2,82],26:[2,82],38:[2,82],47:[2,82],52:[2,82],55:[2,82],64:[2,82],65:[2,82],66:[2,82],68:[2,82],70:[2,82],71:[2,82],75:[2,82],77:[2,82],81:[2,82],82:[2,82],83:[2,82],88:[2,82],90:[2,82],99:[2,82],101:[2,82],102:[2,82],103:[2,82],107:[2,82],115:[2,82],123:[2,82],125:[2,82],126:[2,82],127:[2,82],128:[2,82],129:[2,82],130:[2,82],131:[2,82],132:[2,82],133:[2,82],134:[2,82],135:[2,82]},{1:[2,100],6:[2,100],25:[2,100],26:[2,100],47:[2,100],52:[2,100],55:[2,100],64:[2,100],65:[2,100],66:[2,100],68:[2,100],70:[2,100],71:[2,100],75:[2,100],81:[2,100],82:[2,100],83:[2,100],88:[2,100],90:[2,100],99:[2,100],101:[2,100],102:[2,100],103:[2,100],107:[2,100],115:[2,100],123:[2,100],125:[2,100],126:[2,100],129:[2,100],130:[2,100],131:[2,100],132:[2,100],133:[2,100],134:[2,100]},{1:[2,34],6:[2,34],25:[2,34],26:[2,34],47:[2,34],52:[2,34],55:[2,34],70:[2,34],75:[2,34],83:[2,34],88:[2,34],90:[2,34],99:[2,34],100:85,101:[2,34],102:[2,34],103:[2,34],106:86,107:[2,34],108:67,115:[2,34],123:[2,34],125:[1,78],126:[1,77],129:[1,76],130:[1,79],131:[1,80],132:[1,81],133:[1,82],134:[1,83]},{8:237,9:115,10:20,11:21,12:[1,22],13:8,14:9,15:10,16:11,17:12,18:13,19:14,20:15,21:16,22:17,23:18,24:19,27:60,28:[1,71],29:49,30:[1,69],31:[1,70],32:24,33:[1,50],34:[1,51],35:[1,52],36:[1,53],37:23,42:61,43:[1,45],44:[1,46],45:[1,29],48:30,49:[1,58],50:[1,59],56:47,57:48,59:36,61:25,62:26,63:27,73:[1,68],76:[1,43],80:[1,28],85:[1,56],86:[1,57],87:[1,55],93:[1,38],97:[1,44],98:[1,54],100:39,101:[1,63],103:[1,64],104:40,105:[1,65],106:41,107:[1,66],108:67,116:[1,42],121:37,122:[1,62],124:[1,31],125:[1,32],126:[1,33],127:[1,34],128:[1,35]},{8:238,9:115,10:20,11:21,12:[1,22],13:8,14:9,15:10,16:11,17:12,18:13,19:14,20:15,21:16,22:17,23:18,24:19,27:60,28:[1,71],29:49,30:[1,69],31:[1,70],32:24,33:[1,50],34:[1,51],35:[1,52],36:[1,53],37:23,42:61,43:[1,45],44:[1,46],45:[1,29],48:30,49:[1,58],50:[1,59],56:47,57:48,59:36,61:25,62:26,63:27,73:[1,68],76:[1,43],80:[1,28],85:[1,56],86:[1,57],87:[1,55],93:[1,38],97:[1,44],98:[1,54],100:39,101:[1,63],103:[1,64],104:40,105:[1,65],106:41,107:[1,66],108:67,116:[1,42],121:37,122:[1,62],124:[1,31],125:[1,32],126:[1,33],127:[1,34],128:[1,35]},{1:[2,105],6:[2,105],25:[2,105],26:[2,105],47:[2,105],52:[2,105],55:[2,105],64:[2,105],65:[2,105],66:[2,105],68:[2,105],70:[2,105],71:[2,105],75:[2,105],81:[2,105],82:[2,105],83:[2,105],88:[2,105],90:[2,105],99:[2,105],101:[2,105],102:[2,105],103:[2,105],107:[2,105],115:[2,105],123:[2,105],125:[2,105],126:[2,105],129:[2,105],130:[2,105],131:[2,105],132:[2,105],133:[2,105],134:[2,105]},{6:[2,51],25:[2,51],51:239,52:[1,222],83:[2,51]},{6:[2,123],25:[2,123],26:[2,123],52:[2,123],55:[1,240],83:[2,123],88:[2,123],100:85,101:[1,63],103:[1,64],106:86,107:[1,66],108:67,123:[1,84],125:[1,78],126:[1,77],129:[1,76],130:[1,79],131:[1,80],132:[1,81],133:[1,82],134:[1,83]},{48:241,49:[1,58],50:[1,59]},{27:107,28:[1,71],42:108,53:242,54:106,56:109,57:110,73:[1,68],86:[1,111],87:[1,112]},{47:[2,57],52:[2,57]},{8:243,9:115,10:20,11:21,12:[1,22],13:8,14:9,15:10,16:11,17:12,18:13,19:14,20:15,21:16,22:17,23:18,24:19,27:60,28:[1,71],29:49,30:[1,69],31:[1,70],32:24,33:[1,50],34:[1,51],35:[1,52],36:[1,53],37:23,42:61,43:[1,45],44:[1,46],45:[1,29],48:30,49:[1,58],50:[1,59],56:47,57:48,59:36,61:25,62:26,63:27,73:[1,68],76:[1,43],80:[1,28],85:[1,56],86:[1,57],87:[1,55],93:[1,38],97:[1,44],98:[1,54],100:39,101:[1,63],103:[1,64],104:40,105:[1,65],106:41,107:[1,66],108:67,116:[1,42],121:37,122:[1,62],124:[1,31],125:[1,32],126:[1,33],127:[1,34],128:[1,35]},{1:[2,193],6:[2,193],25:[2,193],26:[2,193],47:[2,193],52:[2,193],55:[2,193],70:[2,193],75:[2,193],83:[2,193],88:[2,193],90:[2,193],99:[2,193],100:85,101:[2,193],102:[2,193],103:[2,193],106:86,107:[2,193],108:67,115:[2,193],123:[2,193],125:[1,78],126:[1,77],129:[1,76],130:[1,79],131:[1,80],132:[1,81],133:[1,82],134:[1,83]},{8:244,9:115,10:20,11:21,12:[1,22],13:8,14:9,15:10,16:11,17:12,18:13,19:14,20:15,21:16,22:17,23:18,24:19,27:60,28:[1,71],29:49,30:[1,69],31:[1,70],32:24,33:[1,50],34:[1,51],35:[1,52],36:[1,53],37:23,42:61,43:[1,45],44:[1,46],45:[1,29],48:30,49:[1,58],50:[1,59],56:47,57:48,59:36,61:25,62:26,63:27,73:[1,68],76:[1,43],80:[1,28],85:[1,56],86:[1,57],87:[1,55],93:[1,38],97:[1,44],98:[1,54],100:39,101:[1,63],103:[1,64],104:40,105:[1,65],106:41,107:[1,66],108:67,116:[1,42],121:37,122:[1,62],124:[1,31],125:[1,32],126:[1,33],127:[1,34],128:[1,35]},{1:[2,195],6:[2,195],25:[2,195],26:[2,195],47:[2,195],52:[2,195],55:[2,195],70:[2,195],75:[2,195],83:[2,195],88:[2,195],90:[2,195],99:[2,195],100:85,101:[2,195],102:[2,195],103:[2,195],106:86,107:[2,195],108:67,115:[2,195],123:[2,195],125:[1,78],126:[1,77],129:[1,76],130:[1,79],131:[1,80],132:[1,81],133:[1,82],134:[1,83]},{1:[2,175],6:[2,175],25:[2,175],26:[2,175],47:[2,175],52:[2,175],55:[2,175],70:[2,175],75:[2,175],83:[2,175],88:[2,175],90:[2,175],99:[2,175],101:[2,175],102:[2,175],103:[2,175],107:[2,175],115:[2,175],123:[2,175],125:[2,175],126:[2,175],129:[2,175],130:[2,175],131:[2,175],132:[2,175],133:[2,175],134:[2,175]},{8:245,9:115,10:20,11:21,12:[1,22],13:8,14:9,15:10,16:11,17:12,18:13,19:14,20:15,21:16,22:17,23:18,24:19,27:60,28:[1,71],29:49,30:[1,69],31:[1,70],32:24,33:[1,50],34:[1,51],35:[1,52],36:[1,53],37:23,42:61,43:[1,45],44:[1,46],45:[1,29],48:30,49:[1,58],50:[1,59],56:47,57:48,59:36,61:25,62:26,63:27,73:[1,68],76:[1,43],80:[1,28],85:[1,56],86:[1,57],87:[1,55],93:[1,38],97:[1,44],98:[1,54],100:39,101:[1,63],103:[1,64],104:40,105:[1,65],106:41,107:[1,66],108:67,116:[1,42],121:37,122:[1,62],124:[1,31],125:[1,32],126:[1,33],127:[1,34],128:[1,35]},{1:[2,128],6:[2,128],25:[2,128],26:[2,128],47:[2,128],52:[2,128],55:[2,128],70:[2,128],75:[2,128],83:[2,128],88:[2,128],90:[2,128],95:[1,246],99:[2,128],101:[2,128],102:[2,128],103:[2,128],107:[2,128],115:[2,128],123:[2,128],125:[2,128],126:[2,128],129:[2,128],130:[2,128],131:[2,128],132:[2,128],133:[2,128],134:[2,128]},{5:247,25:[1,5]},{27:248,28:[1,71]},{117:249,119:212,120:[1,213]},{26:[1,250],118:[1,251],119:252,120:[1,213]},{26:[2,168],118:[2,168],120:[2,168]},{8:254,9:115,10:20,11:21,12:[1,22],13:8,14:9,15:10,16:11,17:12,18:13,19:14,20:15,21:16,22:17,23:18,24:19,27:60,28:[1,71],29:49,30:[1,69],31:[1,70],32:24,33:[1,50],34:[1,51],35:[1,52],36:[1,53],37:23,42:61,43:[1,45],44:[1,46],45:[1,29],48:30,49:[1,58],50:[1,59],56:47,57:48,59:36,61:25,62:26,63:27,73:[1,68],76:[1,43],80:[1,28],85:[1,56],86:[1,57],87:[1,55],92:253,93:[1,38],97:[1,44],98:[1,54],100:39,101:[1,63],103:[1,64],104:40,105:[1,65],106:41,107:[1,66],108:67,116:[1,42],121:37,122:[1,62],124:[1,31],125:[1,32],126:[1,33],127:[1,34],128:[1,35]},{1:[2,93],5:255,6:[2,93],25:[1,5],26:[2,93],47:[2,93],52:[2,93],55:[2,93],70:[2,93],75:[2,93],83:[2,93],88:[2,93],90:[2,93],99:[2,93],100:85,101:[1,63],102:[2,93],103:[1,64],106:86,107:[1,66],108:67,115:[2,93],123:[2,93],125:[1,78],126:[1,77],129:[1,76],130:[1,79],131:[1,80],132:[1,81],133:[1,82],134:[1,83]},{1:[2,96],6:[2,96],25:[2,96],26:[2,96],47:[2,96],52:[2,96],55:[2,96],70:[2,96],75:[2,96],83:[2,96],88:[2,96],90:[2,96],99:[2,96],101:[2,96],102:[2,96],103:[2,96],107:[2,96],115:[2,96],123:[2,96],125:[2,96],126:[2,96],129:[2,96],130:[2,96],131:[2,96],132:[2,96],133:[2,96],134:[2,96]},{8:256,9:115,10:20,11:21,12:[1,22],13:8,14:9,15:10,16:11,17:12,18:13,19:14,20:15,21:16,22:17,23:18,24:19,27:60,28:[1,71],29:49,30:[1,69],31:[1,70],32:24,33:[1,50],34:[1,51],35:[1,52],36:[1,53],37:23,42:61,43:[1,45],44:[1,46],45:[1,29],48:30,49:[1,58],50:[1,59],56:47,57:48,59:36,61:25,62:26,63:27,73:[1,68],76:[1,43],80:[1,28],85:[1,56],86:[1,57],87:[1,55],93:[1,38],97:[1,44],98:[1,54],100:39,101:[1,63],103:[1,64],104:40,105:[1,65],106:41,107:[1,66],108:67,116:[1,42],121:37,122:[1,62],124:[1,31],125:[1,32],126:[1,33],127:[1,34],128:[1,35]},{1:[2,133],6:[2,133],25:[2,133],26:[2,133],47:[2,133],52:[2,133],55:[2,133],64:[2,133],65:[2,133],66:[2,133],68:[2,133],70:[2,133],71:[2,133],75:[2,133],81:[2,133],82:[2,133],83:[2,133],88:[2,133],90:[2,133],99:[2,133],101:[2,133],102:[2,133],103:[2,133],107:[2,133],115:[2,133],123:[2,133],125:[2,133],126:[2,133],129:[2,133],130:[2,133],131:[2,133],132:[2,133],133:[2,133],134:[2,133]},{6:[1,72],26:[1,257]},{8:258,9:115,10:20,11:21,12:[1,22],13:8,14:9,15:10,16:11,17:12,18:13,19:14,20:15,21:16,22:17,23:18,24:19,27:60,28:[1,71],29:49,30:[1,69],31:[1,70],32:24,33:[1,50],34:[1,51],35:[1,52],36:[1,53],37:23,42:61,43:[1,45],44:[1,46],45:[1,29],48:30,49:[1,58],50:[1,59],56:47,57:48,59:36,61:25,62:26,63:27,73:[1,68],76:[1,43],80:[1,28],85:[1,56],86:[1,57],87:[1,55],93:[1,38],97:[1,44],98:[1,54],100:39,101:[1,63],103:[1,64],104:40,105:[1,65],106:41,107:[1,66],108:67,116:[1,42],121:37,122:[1,62],124:[1,31],125:[1,32],126:[1,33],127:[1,34],128:[1,35]},{6:[2,63],12:[2,113],25:[2,63],28:[2,113],30:[2,113],31:[2,113],33:[2,113],34:[2,113],35:[2,113],36:[2,113],43:[2,113],44:[2,113],45:[2,113],49:[2,113],50:[2,113],52:[2,63],73:[2,113],76:[2,113],80:[2,113],85:[2,113],86:[2,113],87:[2,113],88:[2,63],93:[2,113],97:[2,113],98:[2,113],101:[2,113],103:[2,113],105:[2,113],107:[2,113],116:[2,113],122:[2,113],124:[2,113],125:[2,113],126:[2,113],127:[2,113],128:[2,113]},{6:[1,260],25:[1,261],88:[1,259]},{6:[2,52],8:197,9:115,10:20,11:21,12:[1,22],13:8,14:9,15:10,16:11,17:12,18:13,19:14,20:15,21:16,22:17,23:18,24:19,25:[2,52],26:[2,52],27:60,28:[1,71],29:49,30:[1,69],31:[1,70],32:24,33:[1,50],34:[1,51],35:[1,52],36:[1,53],37:23,42:61,43:[1,45],44:[1,46],45:[1,29],48:30,49:[1,58],50:[1,59],56:47,57:48,58:145,59:36,61:25,62:26,63:27,73:[1,68],76:[1,43],80:[1,28],83:[2,52],85:[1,56],86:[1,57],87:[1,55],88:[2,52],91:262,93:[1,38],97:[1,44],98:[1,54],100:39,101:[1,63],103:[1,64],104:40,105:[1,65],106:41,107:[1,66],108:67,116:[1,42],121:37,122:[1,62],124:[1,31],125:[1,32],126:[1,33],127:[1,34],128:[1,35]},{6:[2,51],25:[2,51],26:[2,51],51:263,52:[1,222]},{1:[2,172],6:[2,172],25:[2,172],26:[2,172],47:[2,172],52:[2,172],55:[2,172],70:[2,172],75:[2,172],83:[2,172],88:[2,172],90:[2,172],99:[2,172],101:[2,172],102:[2,172],103:[2,172],107:[2,172],115:[2,172],118:[2,172],123:[2,172],125:[2,172],126:[2,172],129:[2,172],130:[2,172],131:[2,172],132:[2,172],133:[2,172],134:[2,172]},{8:264,9:115,10:20,11:21,12:[1,22],13:8,14:9,15:10,16:11,17:12,18:13,19:14,20:15,21:16,22:17,23:18,24:19,27:60,28:[1,71],29:49,30:[1,69],31:[1,70],32:24,33:[1,50],34:[1,51],35:[1,52],36:[1,53],37:23,42:61,43:[1,45],44:[1,46],45:[1,29],48:30,49:[1,58],50:[1,59],56:47,57:48,59:36,61:25,62:26,63:27,73:[1,68],76:[1,43],80:[1,28],85:[1,56],86:[1,57],87:[1,55],93:[1,38],97:[1,44],98:[1,54],100:39,101:[1,63],103:[1,64],104:40,105:[1,65],106:41,107:[1,66],108:67,116:[1,42],121:37,122:[1,62],124:[1,31],125:[1,32],126:[1,33],127:[1,34],128:[1,35]},{8:265,9:115,10:20,11:21,12:[1,22],13:8,14:9,15:10,16:11,17:12,18:13,19:14,20:15,21:16,22:17,23:18,24:19,27:60,28:[1,71],29:49,30:[1,69],31:[1,70],32:24,33:[1,50],34:[1,51],35:[1,52],36:[1,53],37:23,42:61,43:[1,45],44:[1,46],45:[1,29],48:30,49:[1,58],50:[1,59],56:47,57:48,59:36,61:25,62:26,63:27,73:[1,68],76:[1,43],80:[1,28],85:[1,56],86:[1,57],87:[1,55],93:[1,38],97:[1,44],98:[1,54],100:39,101:[1,63],103:[1,64],104:40,105:[1,65],106:41,107:[1,66],108:67,116:[1,42],121:37,122:[1,62],124:[1,31],125:[1,32],126:[1,33],127:[1,34],128:[1,35]},{113:[2,151],114:[2,151]},{27:156,28:[1,71],56:157,57:158,73:[1,68],87:[1,112],112:266},{1:[2,157],6:[2,157],25:[2,157],26:[2,157],47:[2,157],52:[2,157],55:[2,157],70:[2,157],75:[2,157],83:[2,157],88:[2,157],90:[2,157],99:[2,157],100:85,101:[2,157],102:[1,267],103:[2,157],106:86,107:[2,157],108:67,115:[1,268],123:[2,157],125:[1,78],126:[1,77],129:[1,76],130:[1,79],131:[1,80],132:[1,81],133:[1,82],134:[1,83]},{1:[2,158],6:[2,158],25:[2,158],26:[2,158],47:[2,158],52:[2,158],55:[2,158],70:[2,158],75:[2,158],83:[2,158],88:[2,158],90:[2,158],99:[2,158],100:85,101:[2,158],102:[1,269],103:[2,158],106:86,107:[2,158],108:67,115:[2,158],123:[2,158],125:[1,78],126:[1,77],129:[1,76],130:[1,79],131:[1,80],132:[1,81],133:[1,82],134:[1,83]},{6:[1,271],25:[1,272],75:[1,270]},{6:[2,52],11:165,25:[2,52],26:[2,52],27:166,28:[1,71],29:167,30:[1,69],31:[1,70],39:273,40:164,42:168,44:[1,46],75:[2,52],86:[1,111]},{8:274,9:115,10:20,11:21,12:[1,22],13:8,14:9,15:10,16:11,17:12,18:13,19:14,20:15,21:16,22:17,23:18,24:19,25:[1,275],27:60,28:[1,71],29:49,30:[1,69],31:[1,70],32:24,33:[1,50],34:[1,51],35:[1,52],36:[1,53],37:23,42:61,43:[1,45],44:[1,46],45:[1,29],48:30,49:[1,58],50:[1,59],56:47,57:48,59:36,61:25,62:26,63:27,73:[1,68],76:[1,43],80:[1,28],85:[1,56],86:[1,57],87:[1,55],93:[1,38],97:[1,44],98:[1,54],100:39,101:[1,63],103:[1,64],104:40,105:[1,65],106:41,107:[1,66],108:67,116:[1,42],121:37,122:[1,62],124:[1,31],125:[1,32],126:[1,33],127:[1,34],128:[1,35]},{1:[2,81],6:[2,81],25:[2,81],26:[2,81],38:[2,81],47:[2,81],52:[2,81],55:[2,81],64:[2,81],65:[2,81],66:[2,81],68:[2,81],70:[2,81],71:[2,81],75:[2,81],77:[2,81],81:[2,81],82:[2,81],83:[2,81],88:[2,81],90:[2,81],99:[2,81],101:[2,81],102:[2,81],103:[2,81],107:[2,81],115:[2,81],123:[2,81],125:[2,81],126:[2,81],127:[2,81],128:[2,81],129:[2,81],130:[2,81],131:[2,81],132:[2,81],133:[2,81],134:[2,81],135:[2,81]},{8:276,9:115,10:20,11:21,12:[1,22],13:8,14:9,15:10,16:11,17:12,18:13,19:14,20:15,21:16,22:17,23:18,24:19,27:60,28:[1,71],29:49,30:[1,69],31:[1,70],32:24,33:[1,50],34:[1,51],35:[1,52],36:[1,53],37:23,42:61,43:[1,45],44:[1,46],45:[1,29],48:30,49:[1,58],50:[1,59],56:47,57:48,59:36,61:25,62:26,63:27,70:[2,116],73:[1,68],76:[1,43],80:[1,28],85:[1,56],86:[1,57],87:[1,55],93:[1,38],97:[1,44],98:[1,54],100:39,101:[1,63],103:[1,64],104:40,105:[1,65],106:41,107:[1,66],108:67,116:[1,42],121:37,122:[1,62],124:[1,31],125:[1,32],126:[1,33],127:[1,34],128:[1,35]},{70:[2,117],100:85,101:[1,63],103:[1,64],106:86,107:[1,66],108:67,123:[1,84],125:[1,78],126:[1,77],129:[1,76],130:[1,79],131:[1,80],132:[1,81],133:[1,82],134:[1,83]},{1:[2,35],6:[2,35],25:[2,35],26:[2,35],47:[2,35],52:[2,35],55:[2,35],70:[2,35],75:[2,35],83:[2,35],88:[2,35],90:[2,35],99:[2,35],100:85,101:[2,35],102:[2,35],103:[2,35],106:86,107:[2,35],108:67,115:[2,35],123:[2,35],125:[1,78],126:[1,77],129:[1,76],130:[1,79],131:[1,80],132:[1,81],133:[1,82],134:[1,83]},{26:[1,277],100:85,101:[1,63],103:[1,64],106:86,107:[1,66],108:67,123:[1,84],125:[1,78],126:[1,77],129:[1,76],130:[1,79],131:[1,80],132:[1,81],133:[1,82],134:[1,83]},{6:[1,260],25:[1,261],83:[1,278]},{6:[2,63],25:[2,63],26:[2,63],52:[2,63],83:[2,63],88:[2,63]},{5:279,25:[1,5]},{47:[2,55],52:[2,55]},{47:[2,58],52:[2,58],100:85,101:[1,63],103:[1,64],106:86,107:[1,66],108:67,123:[1,84],125:[1,78],126:[1,77],129:[1,76],130:[1,79],131:[1,80],132:[1,81],133:[1,82],134:[1,83]},{26:[1,280],100:85,101:[1,63],103:[1,64],106:86,107:[1,66],108:67,123:[1,84],125:[1,78],126:[1,77],129:[1,76],130:[1,79],131:[1,80],132:[1,81],133:[1,82],134:[1,83]},{5:281,25:[1,5],100:85,101:[1,63],103:[1,64],106:86,107:[1,66],108:67,123:[1,84],125:[1,78],126:[1,77],129:[1,76],130:[1,79],131:[1,80],132:[1,81],133:[1,82],134:[1,83]},{5:282,25:[1,5]},{1:[2,129],6:[2,129],25:[2,129],26:[2,129],47:[2,129],52:[2,129],55:[2,129],70:[2,129],75:[2,129],83:[2,129],88:[2,129],90:[2,129],99:[2,129],101:[2,129],102:[2,129],103:[2,129],107:[2,129],115:[2,129],123:[2,129],125:[2,129],126:[2,129],129:[2,129],130:[2,129],131:[2,129],132:[2,129],133:[2,129],134:[2,129]},{5:283,25:[1,5]},{26:[1,284],118:[1,285],119:252,120:[1,213]},{1:[2,166],6:[2,166],25:[2,166],26:[2,166],47:[2,166],52:[2,166],55:[2,166],70:[2,166],75:[2,166],83:[2,166],88:[2,166],90:[2,166],99:[2,166],101:[2,166],102:[2,166],103:[2,166],107:[2,166],115:[2,166],123:[2,166],125:[2,166],126:[2,166],129:[2,166],130:[2,166],131:[2,166],132:[2,166],133:[2,166],134:[2,166]},{5:286,25:[1,5]},{26:[2,169],118:[2,169],120:[2,169]},{5:287,25:[1,5],52:[1,288]},{25:[2,125],52:[2,125],100:85,101:[1,63],103:[1,64],106:86,107:[1,66],108:67,123:[1,84],125:[1,78],126:[1,77],129:[1,76],130:[1,79],131:[1,80],132:[1,81],133:[1,82],134:[1,83]},{1:[2,94],6:[2,94],25:[2,94],26:[2,94],47:[2,94],52:[2,94],55:[2,94],70:[2,94],75:[2,94],83:[2,94],88:[2,94],90:[2,94],99:[2,94],101:[2,94],102:[2,94],103:[2,94],107:[2,94],115:[2,94],123:[2,94],125:[2,94],126:[2,94],129:[2,94],130:[2,94],131:[2,94],132:[2,94],133:[2,94],134:[2,94]},{1:[2,97],5:289,6:[2,97],25:[1,5],26:[2,97],47:[2,97],52:[2,97],55:[2,97],70:[2,97],75:[2,97],83:[2,97],88:[2,97],90:[2,97],99:[2,97],100:85,101:[1,63],102:[2,97],103:[1,64],106:86,107:[1,66],108:67,115:[2,97],123:[2,97],125:[1,78],126:[1,77],129:[1,76],130:[1,79],131:[1,80],132:[1,81],133:[1,82],134:[1,83]},{99:[1,290]},{88:[1,291],100:85,101:[1,63],103:[1,64],106:86,107:[1,66],108:67,123:[1,84],125:[1,78],126:[1,77],129:[1,76],130:[1,79],131:[1,80],132:[1,81],133:[1,82],134:[1,83]},{1:[2,111],6:[2,111],25:[2,111],26:[2,111],38:[2,111],47:[2,111],52:[2,111],55:[2,111],64:[2,111],65:[2,111],66:[2,111],68:[2,111],70:[2,111],71:[2,111],75:[2,111],81:[2,111],82:[2,111],83:[2,111],88:[2,111],90:[2,111],99:[2,111],101:[2,111],102:[2,111],103:[2,111],107:[2,111],113:[2,111],114:[2,111],115:[2,111],123:[2,111],125:[2,111],126:[2,111],129:[2,111],130:[2,111],131:[2,111],132:[2,111],133:[2,111],134:[2,111]},{8:197,9:115,10:20,11:21,12:[1,22],13:8,14:9,15:10,16:11,17:12,18:13,19:14,20:15,21:16,22:17,23:18,24:19,27:60,28:[1,71],29:49,30:[1,69],31:[1,70],32:24,33:[1,50],34:[1,51],35:[1,52],36:[1,53],37:23,42:61,43:[1,45],44:[1,46],45:[1,29],48:30,49:[1,58],50:[1,59],56:47,57:48,58:145,59:36,61:25,62:26,63:27,73:[1,68],76:[1,43],80:[1,28],85:[1,56],86:[1,57],87:[1,55],91:292,93:[1,38],97:[1,44],98:[1,54],100:39,101:[1,63],103:[1,64],104:40,105:[1,65],106:41,107:[1,66],108:67,116:[1,42],121:37,122:[1,62],124:[1,31],125:[1,32],126:[1,33],127:[1,34],128:[1,35]},{8:197,9:115,10:20,11:21,12:[1,22],13:8,14:9,15:10,16:11,17:12,18:13,19:14,20:15,21:16,22:17,23:18,24:19,25:[1,144],27:60,28:[1,71],29:49,30:[1,69],31:[1,70],32:24,33:[1,50],34:[1,51],35:[1,52],36:[1,53],37:23,42:61,43:[1,45],44:[1,46],45:[1,29],48:30,49:[1,58],50:[1,59],56:47,57:48,58:145,59:36,61:25,62:26,63:27,73:[1,68],76:[1,43],80:[1,28],84:293,85:[1,56],86:[1,57],87:[1,55],91:143,93:[1,38],97:[1,44],98:[1,54],100:39,101:[1,63],103:[1,64],104:40,105:[1,65],106:41,107:[1,66],108:67,116:[1,42],121:37,122:[1,62],124:[1,31],125:[1,32],126:[1,33],127:[1,34],128:[1,35]},{6:[2,119],25:[2,119],26:[2,119],52:[2,119],83:[2,119],88:[2,119]},{6:[1,260],25:[1,261],26:[1,294]},{1:[2,136],6:[2,136],25:[2,136],26:[2,136],47:[2,136],52:[2,136],55:[2,136],70:[2,136],75:[2,136],83:[2,136],88:[2,136],90:[2,136],99:[2,136],100:85,101:[1,63],102:[2,136],103:[1,64],106:86,107:[1,66],108:67,115:[2,136],123:[2,136],125:[1,78],126:[1,77],129:[1,76],130:[1,79],131:[1,80],132:[1,81],133:[1,82],134:[1,83]},{1:[2,138],6:[2,138],25:[2,138],26:[2,138],47:[2,138],52:[2,138],55:[2,138],70:[2,138],75:[2,138],83:[2,138],88:[2,138],90:[2,138],99:[2,138],100:85,101:[1,63],102:[2,138],103:[1,64],106:86,107:[1,66],108:67,115:[2,138],123:[2,138],125:[1,78],126:[1,77],129:[1,76],130:[1,79],131:[1,80],132:[1,81],133:[1,82],134:[1,83]},{113:[2,156],114:[2,156]},{8:295,9:115,10:20,11:21,12:[1,22],13:8,14:9,15:10,16:11,17:12,18:13,19:14,20:15,21:16,22:17,23:18,24:19,27:60,28:[1,71],29:49,30:[1,69],31:[1,70],32:24,33:[1,50],34:[1,51],35:[1,52],36:[1,53],37:23,42:61,43:[1,45],44:[1,46],45:[1,29],48:30,49:[1,58],50:[1,59],56:47,57:48,59:36,61:25,62:26,63:27,73:[1,68],76:[1,43],80:[1,28],85:[1,56],86:[1,57],87:[1,55],93:[1,38],97:[1,44],98:[1,54],100:39,101:[1,63],103:[1,64],104:40,105:[1,65],106:41,107:[1,66],108:67,116:[1,42],121:37,122:[1,62],124:[1,31],125:[1,32],126:[1,33],127:[1,34],128:[1,35]},{8:296,9:115,10:20,11:21,12:[1,22],13:8,14:9,15:10,16:11,17:12,18:13,19:14,20:15,21:16,22:17,23:18,24:19,27:60,28:[1,71],29:49,30:[1,69],31:[1,70],32:24,33:[1,50],34:[1,51],35:[1,52],36:[1,53],37:23,42:61,43:[1,45],44:[1,46],45:[1,29],48:30,49:[1,58],50:[1,59],56:47,57:48,59:36,61:25,62:26,63:27,73:[1,68],76:[1,43],80:[1,28],85:[1,56],86:[1,57],87:[1,55],93:[1,38],97:[1,44],98:[1,54],100:39,101:[1,63],103:[1,64],104:40,105:[1,65],106:41,107:[1,66],108:67,116:[1,42],121:37,122:[1,62],124:[1,31],125:[1,32],126:[1,33],127:[1,34],128:[1,35]},{8:297,9:115,10:20,11:21,12:[1,22],13:8,14:9,15:10,16:11,17:12,18:13,19:14,20:15,21:16,22:17,23:18,24:19,27:60,28:[1,71],29:49,30:[1,69],31:[1,70],32:24,33:[1,50],34:[1,51],35:[1,52],36:[1,53],37:23,42:61,43:[1,45],44:[1,46],45:[1,29],48:30,49:[1,58],50:[1,59],56:47,57:48,59:36,61:25,62:26,63:27,73:[1,68],76:[1,43],80:[1,28],85:[1,56],86:[1,57],87:[1,55],93:[1,38],97:[1,44],98:[1,54],100:39,101:[1,63],103:[1,64],104:40,105:[1,65],106:41,107:[1,66],108:67,116:[1,42],121:37,122:[1,62],124:[1,31],125:[1,32],126:[1,33],127:[1,34],128:[1,35]},{1:[2,85],6:[2,85],25:[2,85],26:[2,85],38:[2,85],47:[2,85],52:[2,85],55:[2,85],64:[2,85],65:[2,85],66:[2,85],68:[2,85],70:[2,85],71:[2,85],75:[2,85],81:[2,85],82:[2,85],83:[2,85],88:[2,85],90:[2,85],99:[2,85],101:[2,85],102:[2,85],103:[2,85],107:[2,85],113:[2,85],114:[2,85],115:[2,85],123:[2,85],125:[2,85],126:[2,85],129:[2,85],130:[2,85],131:[2,85],132:[2,85],133:[2,85],134:[2,85]},{11:165,27:166,28:[1,71],29:167,30:[1,69],31:[1,70],39:298,40:164,42:168,44:[1,46],86:[1,111]},{6:[2,86],11:165,25:[2,86],26:[2,86],27:166,28:[1,71],29:167,30:[1,69],31:[1,70],39:163,40:164,42:168,44:[1,46],52:[2,86],74:299,86:[1,111]},{6:[2,88],25:[2,88],26:[2,88],52:[2,88],75:[2,88]},{6:[2,38],25:[2,38],26:[2,38],52:[2,38],75:[2,38],100:85,101:[1,63],103:[1,64],106:86,107:[1,66],108:67,123:[1,84],125:[1,78],126:[1,77],129:[1,76],130:[1,79],131:[1,80],132:[1,81],133:[1,82],134:[1,83]},{8:300,9:115,10:20,11:21,12:[1,22],13:8,14:9,15:10,16:11,17:12,18:13,19:14,20:15,21:16,22:17,23:18,24:19,27:60,28:[1,71],29:49,30:[1,69],31:[1,70],32:24,33:[1,50],34:[1,51],35:[1,52],36:[1,53],37:23,42:61,43:[1,45],44:[1,46],45:[1,29],48:30,49:[1,58],50:[1,59],56:47,57:48,59:36,61:25,62:26,63:27,73:[1,68],76:[1,43],80:[1,28],85:[1,56],86:[1,57],87:[1,55],93:[1,38],97:[1,44],98:[1,54],100:39,101:[1,63],103:[1,64],104:40,105:[1,65],106:41,107:[1,66],108:67,116:[1,42],121:37,122:[1,62],124:[1,31],125:[1,32],126:[1,33],127:[1,34],128:[1,35]},{70:[2,115],100:85,101:[1,63],103:[1,64],106:86,107:[1,66],108:67,123:[1,84],125:[1,78],126:[1,77],129:[1,76],130:[1,79],131:[1,80],132:[1,81],133:[1,82],134:[1,83]},{1:[2,36],6:[2,36],25:[2,36],26:[2,36],47:[2,36],52:[2,36],55:[2,36],70:[2,36],75:[2,36],83:[2,36],88:[2,36],90:[2,36],99:[2,36],101:[2,36],102:[2,36],103:[2,36],107:[2,36],115:[2,36],123:[2,36],125:[2,36],126:[2,36],129:[2,36],130:[2,36],131:[2,36],132:[2,36],133:[2,36],134:[2,36]},{1:[2,106],6:[2,106],25:[2,106],26:[2,106],47:[2,106],52:[2,106],55:[2,106],64:[2,106],65:[2,106],66:[2,106],68:[2,106],70:[2,106],71:[2,106],75:[2,106],81:[2,106],82:[2,106],83:[2,106],88:[2,106],90:[2,106],99:[2,106],101:[2,106],102:[2,106],103:[2,106],107:[2,106],115:[2,106],123:[2,106],125:[2,106],126:[2,106],129:[2,106],130:[2,106],131:[2,106],132:[2,106],133:[2,106],134:[2,106]},{1:[2,47],6:[2,47],25:[2,47],26:[2,47],47:[2,47],52:[2,47],55:[2,47],70:[2,47],75:[2,47],83:[2,47],88:[2,47],90:[2,47],99:[2,47],101:[2,47],102:[2,47],103:[2,47],107:[2,47],115:[2,47],123:[2,47],125:[2,47],126:[2,47],129:[2,47],130:[2,47],131:[2,47],132:[2,47],133:[2,47],134:[2,47]},{1:[2,194],6:[2,194],25:[2,194],26:[2,194],47:[2,194],52:[2,194],55:[2,194],70:[2,194],75:[2,194],83:[2,194],88:[2,194],90:[2,194],99:[2,194],101:[2,194],102:[2,194],103:[2,194],107:[2,194],115:[2,194],123:[2,194],125:[2,194],126:[2,194],129:[2,194],130:[2,194],131:[2,194],132:[2,194],133:[2,194],134:[2,194]},{1:[2,173],6:[2,173],25:[2,173],26:[2,173],47:[2,173],52:[2,173],55:[2,173],70:[2,173],75:[2,173],83:[2,173],88:[2,173],90:[2,173],99:[2,173],101:[2,173],102:[2,173],103:[2,173],107:[2,173],115:[2,173],118:[2,173],123:[2,173],125:[2,173],126:[2,173],129:[2,173],130:[2,173],131:[2,173],132:[2,173],133:[2,173],134:[2,173]},{1:[2,130],6:[2,130],25:[2,130],26:[2,130],47:[2,130],52:[2,130],55:[2,130],70:[2,130],75:[2,130],83:[2,130],88:[2,130],90:[2,130],99:[2,130],101:[2,130],102:[2,130],103:[2,130],107:[2,130],115:[2,130],123:[2,130],125:[2,130],126:[2,130],129:[2,130],130:[2,130],131:[2,130],132:[2,130],133:[2,130],134:[2,130]},{1:[2,131],6:[2,131],25:[2,131],26:[2,131],47:[2,131],52:[2,131],55:[2,131],70:[2,131],75:[2,131],83:[2,131],88:[2,131],90:[2,131],95:[2,131],99:[2,131],101:[2,131],102:[2,131],103:[2,131],107:[2,131],115:[2,131],123:[2,131],125:[2,131],126:[2,131],129:[2,131],130:[2,131],131:[2,131],132:[2,131],133:[2,131],134:[2,131]},{1:[2,164],6:[2,164],25:[2,164],26:[2,164],47:[2,164],52:[2,164],55:[2,164],70:[2,164],75:[2,164],83:[2,164],88:[2,164],90:[2,164],99:[2,164],101:[2,164],102:[2,164],103:[2,164],107:[2,164],115:[2,164],123:[2,164],125:[2,164],126:[2,164],129:[2,164],130:[2,164],131:[2,164],132:[2,164],133:[2,164],134:[2,164]},{5:301,25:[1,5]},{26:[1,302]},{6:[1,303],26:[2,170],118:[2,170],120:[2,170]},{8:304,9:115,10:20,11:21,12:[1,22],13:8,14:9,15:10,16:11,17:12,18:13,19:14,20:15,21:16,22:17,23:18,24:19,27:60,28:[1,71],29:49,30:[1,69],31:[1,70],32:24,33:[1,50],34:[1,51],35:[1,52],36:[1,53],37:23,42:61,43:[1,45],44:[1,46],45:[1,29],48:30,49:[1,58],50:[1,59],56:47,57:48,59:36,61:25,62:26,63:27,73:[1,68],76:[1,43],80:[1,28],85:[1,56],86:[1,57],87:[1,55],93:[1,38],97:[1,44],98:[1,54],100:39,101:[1,63],103:[1,64],104:40,105:[1,65],106:41,107:[1,66],108:67,116:[1,42],121:37,122:[1,62],124:[1,31],125:[1,32],126:[1,33],127:[1,34],128:[1,35]},{1:[2,98],6:[2,98],25:[2,98],26:[2,98],47:[2,98],52:[2,98],55:[2,98],70:[2,98],75:[2,98],83:[2,98],88:[2,98],90:[2,98],99:[2,98],101:[2,98],102:[2,98],103:[2,98],107:[2,98],115:[2,98],123:[2,98],125:[2,98],126:[2,98],129:[2,98],130:[2,98],131:[2,98],132:[2,98],133:[2,98],134:[2,98]},{1:[2,134],6:[2,134],25:[2,134],26:[2,134],47:[2,134],52:[2,134],55:[2,134],64:[2,134],65:[2,134],66:[2,134],68:[2,134],70:[2,134],71:[2,134],75:[2,134],81:[2,134],82:[2,134],83:[2,134],88:[2,134],90:[2,134],99:[2,134],101:[2,134],102:[2,134],103:[2,134],107:[2,134],115:[2,134],123:[2,134],125:[2,134],126:[2,134],129:[2,134],130:[2,134],131:[2,134],132:[2,134],133:[2,134],134:[2,134]},{1:[2,114],6:[2,114],25:[2,114],26:[2,114],47:[2,114],52:[2,114],55:[2,114],64:[2,114],65:[2,114],66:[2,114],68:[2,114],70:[2,114],71:[2,114],75:[2,114],81:[2,114],82:[2,114],83:[2,114],88:[2,114],90:[2,114],99:[2,114],101:[2,114],102:[2,114],103:[2,114],107:[2,114],115:[2,114],123:[2,114],125:[2,114],126:[2,114],129:[2,114],130:[2,114],131:[2,114],132:[2,114],133:[2,114],134:[2,114]},{6:[2,120],25:[2,120],26:[2,120],52:[2,120],83:[2,120],88:[2,120]},{6:[2,51],25:[2,51],26:[2,51],51:305,52:[1,222]},{6:[2,121],25:[2,121],26:[2,121],52:[2,121],83:[2,121],88:[2,121]},{1:[2,159],6:[2,159],25:[2,159],26:[2,159],47:[2,159],52:[2,159],55:[2,159],70:[2,159],75:[2,159],83:[2,159],88:[2,159],90:[2,159],99:[2,159],100:85,101:[2,159],102:[2,159],103:[2,159],106:86,107:[2,159],108:67,115:[1,306],123:[2,159],125:[1,78],126:[1,77],129:[1,76],130:[1,79],131:[1,80],132:[1,81],133:[1,82],134:[1,83]},{1:[2,161],6:[2,161],25:[2,161],26:[2,161],47:[2,161],52:[2,161],55:[2,161],70:[2,161],75:[2,161],83:[2,161],88:[2,161],90:[2,161],99:[2,161],100:85,101:[2,161],102:[1,307],103:[2,161],106:86,107:[2,161],108:67,115:[2,161],123:[2,161],125:[1,78],126:[1,77],129:[1,76],130:[1,79],131:[1,80],132:[1,81],133:[1,82],134:[1,83]},{1:[2,160],6:[2,160],25:[2,160],26:[2,160],47:[2,160],52:[2,160],55:[2,160],70:[2,160],75:[2,160],83:[2,160],88:[2,160],90:[2,160],99:[2,160],100:85,101:[2,160],102:[2,160],103:[2,160],106:86,107:[2,160],108:67,115:[2,160],123:[2,160],125:[1,78],126:[1,77],129:[1,76],130:[1,79],131:[1,80],132:[1,81],133:[1,82],134:[1,83]},{6:[2,89],25:[2,89],26:[2,89],52:[2,89],75:[2,89]},{6:[2,51],25:[2,51],26:[2,51],51:308,52:[1,232]},{26:[1,309],100:85,101:[1,63],103:[1,64],106:86,107:[1,66],108:67,123:[1,84],125:[1,78],126:[1,77],129:[1,76],130:[1,79],131:[1,80],132:[1,81],133:[1,82],134:[1,83]},{26:[1,310]},{1:[2,167],6:[2,167],25:[2,167],26:[2,167],47:[2,167],52:[2,167],55:[2,167],70:[2,167],75:[2,167],83:[2,167],88:[2,167],90:[2,167],99:[2,167],101:[2,167],102:[2,167],103:[2,167],107:[2,167],115:[2,167],123:[2,167],125:[2,167],126:[2,167],129:[2,167],130:[2,167],131:[2,167],132:[2,167],133:[2,167],134:[2,167]},{26:[2,171],118:[2,171],120:[2,171]},{25:[2,126],52:[2,126],100:85,101:[1,63],103:[1,64],106:86,107:[1,66],108:67,123:[1,84],125:[1,78],126:[1,77],129:[1,76],130:[1,79],131:[1,80],132:[1,81],133:[1,82],134:[1,83]},{6:[1,260],25:[1,261],26:[1,311]},{8:312,9:115,10:20,11:21,12:[1,22],13:8,14:9,15:10,16:11,17:12,18:13,19:14,20:15,21:16,22:17,23:18,24:19,27:60,28:[1,71],29:49,30:[1,69],31:[1,70],32:24,33:[1,50],34:[1,51],35:[1,52],36:[1,53],37:23,42:61,43:[1,45],44:[1,46],45:[1,29],48:30,49:[1,58],50:[1,59],56:47,57:48,59:36,61:25,62:26,63:27,73:[1,68],76:[1,43],80:[1,28],85:[1,56],86:[1,57],87:[1,55],93:[1,38],97:[1,44],98:[1,54],100:39,101:[1,63],103:[1,64],104:40,105:[1,65],106:41,107:[1,66],108:67,116:[1,42],121:37,122:[1,62],124:[1,31],125:[1,32],126:[1,33],127:[1,34],128:[1,35]},{8:313,9:115,10:20,11:21,12:[1,22],13:8,14:9,15:10,16:11,17:12,18:13,19:14,20:15,21:16,22:17,23:18,24:19,27:60,28:[1,71],29:49,30:[1,69],31:[1,70],32:24,33:[1,50],34:[1,51],35:[1,52],36:[1,53],37:23,42:61,43:[1,45],44:[1,46],45:[1,29],48:30,49:[1,58],50:[1,59],56:47,57:48,59:36,61:25,62:26,63:27,73:[1,68],76:[1,43],80:[1,28],85:[1,56],86:[1,57],87:[1,55],93:[1,38],97:[1,44],98:[1,54],100:39,101:[1,63],103:[1,64],104:40,105:[1,65],106:41,107:[1,66],108:67,116:[1,42],121:37,122:[1,62],124:[1,31],125:[1,32],126:[1,33],127:[1,34],128:[1,35]},{6:[1,271],25:[1,272],26:[1,314]},{6:[2,39],25:[2,39],26:[2,39],52:[2,39],75:[2,39]},{1:[2,165],6:[2,165],25:[2,165],26:[2,165],47:[2,165],52:[2,165],55:[2,165],70:[2,165],75:[2,165],83:[2,165],88:[2,165],90:[2,165],99:[2,165],101:[2,165],102:[2,165],103:[2,165],107:[2,165],115:[2,165],123:[2,165],125:[2,165],126:[2,165],129:[2,165],130:[2,165],131:[2,165],132:[2,165],133:[2,165],134:[2,165]},{6:[2,122],25:[2,122],26:[2,122],52:[2,122],83:[2,122],88:[2,122]},{1:[2,162],6:[2,162],25:[2,162],26:[2,162],47:[2,162],52:[2,162],55:[2,162],70:[2,162],75:[2,162],83:[2,162],88:[2,162],90:[2,162],99:[2,162],100:85,101:[2,162],102:[2,162],103:[2,162],106:86,107:[2,162],108:67,115:[2,162],123:[2,162],125:[1,78],126:[1,77],129:[1,76],130:[1,79],131:[1,80],132:[1,81],133:[1,82],134:[1,83]},{1:[2,163],6:[2,163],25:[2,163],26:[2,163],47:[2,163],52:[2,163],55:[2,163],70:[2,163],75:[2,163],83:[2,163],88:[2,163],90:[2,163],99:[2,163],100:85,101:[2,163],102:[2,163],103:[2,163],106:86,107:[2,163],108:67,115:[2,163],123:[2,163],125:[1,78],126:[1,77],129:[1,76],130:[1,79],131:[1,80],132:[1,81],133:[1,82],134:[1,83]},{6:[2,90],25:[2,90],26:[2,90],52:[2,90],75:[2,90]}],defaultActions:{58:[2,49],59:[2,50],73:[2,3],92:[2,104],186:[2,84]},parseError:function(a,b){throw new Error(a)},parse:function(a){function o(){var a;a=b.lexer.lex()||1,typeof a!="number"&&(a=b.symbols_[a]||a);return a}function n(a){c.length=c.length-2*a,d.length=d.length-a,e.length=e.length-a}var b=this,c=[0],d=[null],e=[],f=this.table,g="",h=0,i=0,j=0,k=2,l=1;this.lexer.setInput(a),this.lexer.yy=this.yy,this.yy.lexer=this.lexer,typeof this.lexer.yylloc=="undefined"&&(this.lexer.yylloc={});var m=this.lexer.yylloc;e.push(m),typeof this.yy.parseError=="function"&&(this.parseError=this.yy.parseError);var p,q,r,s,t,u,v={},w,x,y,z;for(;;){r=c[c.length-1],this.defaultActions[r]?s=this.defaultActions[r]:(p==null&&(p=o()),s=f[r]&&f[r][p]);if(typeof s=="undefined"||!s.length||!s[0]){if(!j){z=[];for(w in f[r])this.terminals_[w]&&w>2&&z.push("'"+this.terminals_[w]+"'");var A="";this.lexer.showPosition?A="Parse error on line "+(h+1)+":\n"+this.lexer.showPosition()+"\nExpecting "+z.join(", "):A="Parse error on line "+(h+1)+": Unexpected "+(p==1?"end of input":"'"+(this.terminals_[p]||p)+"'"),this.parseError(A,{text:this.lexer.match,token:this.terminals_[p]||p,line:this.lexer.yylineno,loc:m,expected:z})}if(j==3){if(p==l)throw new Error(A||"Parsing halted.");i=this.lexer.yyleng,g=this.lexer.yytext,h=this.lexer.yylineno,m=this.lexer.yylloc,p=o()}for(;;){if(k.toString()in f[r])break;if(r==0)throw new Error(A||"Parsing halted.");n(1),r=c[c.length-1]}q=p,p=k,r=c[c.length-1],s=f[r]&&f[r][k],j=3}if(s[0]instanceof Array&&s.length>1)throw new Error("Parse Error: multiple actions possible at state: "+r+", token: "+p);switch(s[0]){case 1:c.push(p),d.push(this.lexer.yytext),e.push(this.lexer.yylloc),c.push(s[1]),p=null,q?(p=q,q=null):(i=this.lexer.yyleng,g=this.lexer.yytext,h=this.lexer.yylineno,m=this.lexer.yylloc,j>0&&j--);break;case 2:x=this.productions_[s[1]][1],v.$=d[d.length-x],v._$={first_line:e[e.length-(x||1)].first_line,last_line:e[e.length-1].last_line,first_column:e[e.length-(x||1)].first_column,last_column:e[e.length-1].last_column},u=this.performAction.call(v,g,i,h,this.yy,s[1],d,e);if(typeof u!="undefined")return u;x&&(c=c.slice(0,-1*x*2),d=d.slice(0,-1*x),e=e.slice(0,-1*x)),c.push(this.productions_[s[1]][0]),d.push(v.$),e.push(v._$),y=f[c[c.length-2]][c[c.length-1]],c.push(y);break;case 3:return!0}}return!0}};return a}();typeof require!="undefined"&&typeof a!="undefined"&&(a.parser=b,a.parse=function(){return b.parse.apply(b,arguments)},a.main=function(b){if(!b[1])throw new Error("Usage: "+b[0]+" FILE");if(typeof process!="undefined")var c=require("fs").readFileSync(require("path").join(process.cwd(),b[1]),"utf8");else var d=require("file").path(require("file").cwd()),c=d.join(b[1]).read({charset:"utf-8"});return a.parser.parse(c)},typeof module!="undefined"&&require.main===module&&a.main(typeof process!="undefined"?process.argv.slice(1):require("system").args))},require["./scope"]=new function(){var a=this;(function(){var b,c,d,e;e=require("./helpers"),c=e.extend,d=e.last,a.Scope=b=function(){function a(b,c,d){this.parent=b,this.expressions=c,this.method=d,this.variables=[{name:"arguments",type:"arguments"}],this.positions={},this.parent||(a.root=this)}a.root=null,a.prototype.add=function(a,b,c){if(this.shared&&!c)return this.parent.add(a,b,c);return Object.prototype.hasOwnProperty.call(this.positions,a)?this.variables[this.positions[a]].type=b:this.positions[a]=this.variables.push({name:a,type:b})-1},a.prototype.find=function(a,b){if(this.check(a,b))return!0;this.add(a,"var");return!1},a.prototype.parameter=function(a){if(!this.shared||!this.parent.check(a,!0))return this.add(a,"param")},a.prototype.check=function(a,b){var c,d;c=!!this.type(a);if(c||b)return c;return(d=this.parent)!=null?!!d.check(a):!!void 0},a.prototype.temporary=function(a,b){return a.length>1?"_"+a+(b>1?b:""):"_"+(b+parseInt(a,36)).toString(36).replace(/\d/g,"a")},a.prototype.type=function(a){var b,c,d,e;e=this.variables;for(c=0,d=e.length;c1&&a.level>=w?"("+c+")":c},b.prototype.compileRoot=function(a){var b,c,d,e,f,g;a.indent=a.bare?"":Q,a.scope=new M(null,this,null),a.level=z,this.spaced=!0,e="",a.bare||(f=function(){var a,b,e;b=this.expressions,e=[];for(d=0,a=b.length;d=u?"(void 0)":"void 0":this.value==="this"?((c=a.scope.method)!=null?c.bound:void 0)?a.scope.method.context:this.value:this.value.reserved&&(d=""+this.value)!=="eval"&&d!=="arguments"?'"'+this.value+'"':this.value;return this.isStatement()?""+this.tab+b+";":b},b.prototype.toString=function(){return' "'+this.value+'"'};return b}(e),a.Return=K=function(a){function b(a){a&&!a.unwrap().isUndefined&&(this.expression=a)}bj(b,a),b.prototype.children=["expression"],b.prototype.isStatement=X,b.prototype.makeReturn=R,b.prototype.jumps=R,b.prototype.compile=function(a,c){var d,e;d=(e=this.expression)!=null?e.makeReturn():void 0;return!d||d instanceof b?b.__super__.compile.call(this,a,c):d.compile(a,c)},b.prototype.compileNode=function(a){return this.tab+("return"+[this.expression?" "+this.expression.compile(a,y):void 0]+";")};return b}(e),a.Value=V=function(a){function b(a,c,d){if(!c&&a instanceof b)return a;this.base=a,this.properties=c||[],d&&(this[d]=!0);return this}bj(b,a),b.prototype.children=["base","properties"],b.prototype.add=function(a){this.properties=this.properties.concat(a);return this},b.prototype.hasProperties=function(){return!!this.properties.length},b.prototype.isArray=function(){return!this.properties.length&&this.base instanceof c},b.prototype.isComplex=function(){return this.hasProperties()||this.base.isComplex()},b.prototype.isAssignable=function(){return this.hasProperties()||this.base.isAssignable()},b.prototype.isSimpleNumber=function(){return this.base instanceof A&&L.test(this.base.value)},b.prototype.isAtomic=function(){var a,b,c,d;d=this.properties.concat(this.base);for(b=0,c=d.length;b"+this.equals],h=l[0],e=l[1],c=this.stepNum?+this.stepNum>0?""+h+" "+this.toVar:""+e+" "+this.toVar:g?(m=[+this.fromNum,+this.toNum],d=m[0],j=m[1],m,d<=j?""+h+" "+j:""+e+" "+j):(b=""+this.fromVar+" <= "+this.toVar,""+b+" ? "+h+" "+this.toVar+" : "+e+" "+this.toVar),i=this.stepVar?""+f+" += "+this.stepVar:g?d<=j?""+f+"++":""+f+"--":""+b+" ? "+f+"++ : "+f+"--";return""+k+"; "+c+"; "+i},b.prototype.compileArray=function(a){var b,c,d,e,f,g,h,i,j,k,l,m,n,o,p;if(this.fromNum&&this.toNum&&Math.abs(this.fromNum-this.toNum)<=20){j=function(){p=[];for(var a=n=+this.fromNum,b=+this.toNum;n<=b?a<=b:a>=b;n<=b?a++:a--)p.push(a);return p}.apply(this),this.exclusive&&j.pop();return"["+j.join(", ")+"]"}g=this.tab+Q,f=a.scope.freeVariable("i"),k=a.scope.freeVariable("results"),i="\n"+g+k+" = [];",this.fromNum&&this.toNum?(a.index=f,c=this.compileNode(a)):(l=""+f+" = "+this.fromC+(this.toC!==this.toVar?", "+this.toC:""),d=""+this.fromVar+" <= "+this.toVar,c="var "+l+"; "+d+" ? "+f+" <"+this.equals+" "+this.toVar+" : "+f+" >"+this.equals+" "+this.toVar+"; "+d+" ? "+f+"++ : "+f+"--"),h="{ "+k+".push("+f+"); }\n"+g+"return "+k+";\n"+a.indent,e=function(a){return a!=null?a.contains(function(a){return a instanceof A&&a.value==="arguments"&&!a.asKey}):void 0};if(e(this.from)||e(this.to))b=", arguments";return"(function() {"+i+"\n"+g+"for ("+c+")"+h+"}).apply(this"+(b!=null?b:"")+")"};return b}(e),a.Slice=N=function(a){function b(a){this.range=a,b.__super__.constructor.call(this)}bj(b,a),b.prototype.children=["range"],b.prototype.compileNode=function(a){var b,c,d,e,f,g;g=this.range,e=g.to,c=g.from,d=c&&c.compile(a,y)||"0",b=e&&e.compile(a,u),e&&(!!this.range.exclusive||+b!==-1)&&(f=", "+(this.range.exclusive?b:L.test(b)?(+b+1).toString():""+b+" + 1 || 9e9"));return".slice("+d+(f||"")+")"};return b}(e),a.Obj=E=function(a){function b(a,b){this.generated=b!=null?b:!1,this.objects=this.properties=a||[]}bj(b,a),b.prototype.children=["properties"],b.prototype.compileNode=function(a){var b,c,e,f,g,h,i,j,l,m,n;l=this.properties;if(!l.length)return this.front?"({})":"{}";if(this.generated)for(m=0,n=l.length;m=0?"[\n"+a.indent+b+"\n"+this.tab+"]":"["+b+"]"},b.prototype.assigns=function(a){var b,c,d,e;e=this.objects;for(c=0,d=e.length;c=0},c.prototype.assigns=function(a){return this[this.context==="object"?"value":"variable"].assigns(a)},c.prototype.unfoldSoak=function(a){return bf(a,this,"variable")},c.prototype.compileNode=function(a){var b,c,d,e,f,g,h,i,k;if(b=this.variable instanceof V){if(this.variable.isArray()||this.variable.isObject())return this.compilePatternMatch(a);if(this.variable.isSplice())return this.compileSplice(a);if((g=this.context)==="||="||g==="&&="||g==="?=")return this.compileConditional(a)}d=this.variable.compile(a,w);if(!this.context){if(!(f=this.variable.unwrapAll()).isAssignable())throw SyntaxError('"'+this.variable.compile(a)+'" cannot be assigned.');if(typeof f.hasProperties=="function"?!f.hasProperties():!void 0)this.param?a.scope.add(d,"var"):a.scope.find(d)}this.value instanceof j&&(c=B.exec(d))&&(c[1]&&(this.value.klass=c[1]),this.value.name=(h=(i=(k=c[2])!=null?k:c[3])!=null?i:c[4])!=null?h:c[5]),e=this.value.compile(a,w);if(this.context==="object")return""+d+": "+e;e=d+(" "+(this.context||"=")+" ")+e;return a.level<=w?e:"("+e+")"},c.prototype.compilePatternMatch=function(a){var d,e,f,g,h,i,j,k,l,m,n,p,q,r,s,u,v,y,B,C,D,E,F,G,J,K;s=a.level===z,v=this.value,m=this.variable.base.objects;if(!(n=m.length)){f=v.compile(a);return a.level>=x?"("+f+")":f}i=this.variable.isObject();if(s&&n===1&&!((l=m[0])instanceof O)){l instanceof c?(C=l,D=C.variable,h=D.base,l=C.value):l.base instanceof H?(E=(new V(l.unwrapAll())).cacheReference(a),l=E[0],h=E[1]):h=i?l["this"]?l.properties[0].name:l:new A(0),d=o.test(h.unwrap().value||0),v=new V(v),v.properties.push(new(d?b:t)(h));if(F=l.unwrap().value,bk.call(["arguments","eval"].concat(I),F)>=0)throw new SyntaxError("assignment to a reserved word: "+l.compile(a)+" = "+v.compile(a));return(new c(l,v,null,{param:this.param})).compile(a,z)}y=v.compile(a,w),e=[],r=!1;if(!o.test(y)||this.variable.assigns(y))e.push(""+(p=a.scope.freeVariable("ref"))+" = "+y),y=p;for(g=0,B=m.length;g=0)throw new SyntaxError("assignment to a reserved word: "+l.compile(a)+" = "+u.compile(a));e.push((new c(l,u,null,{param:this.param,subpattern:!0})).compile(a,w))}!s&&!this.subpattern&&e.push(y),f=e.join(", ");return a.level=0&&(a.isExistentialEquals=!0);return(new F(this.context.slice(0,-1),b,new c(d,this.value,"="))).compile(a)},c.prototype.compileSplice=function(a){var b,c,d,e,f,g,h,i,j,k,l,m;k=this.variable.properties.pop().range,d=k.from,h=k.to,c=k.exclusive,g=this.variable.compile(a),l=(d!=null?d.cache(a,x):void 0)||["0","0"],e=l[0],f=l[1],h?(d!=null?d.isSimpleNumber():void 0)&&h.isSimpleNumber()?(h=+h.compile(a)- +f,c||(h+=1)):(h=h.compile(a,u)+" - "+f,c||(h+=" + 1")):h="9e9",m=this.value.cache(a,w),i=m[0],j=m[1],b="[].splice.apply("+g+", ["+e+", "+h+"].concat("+i+")), "+j;return a.level>z?"("+b+")":b};return c}(e),a.Code=j=function(a){function b(a,b,c){this.params=a||[],this.body=b||new f,this.bound=c==="boundfunc",this.bound&&(this.context="_this")}bj(b,a),b.prototype.children=["params","body"],b.prototype.isStatement=function(){return!!this.ctor},b.prototype.jumps=D,b.prototype.compileNode=function(a){var b,e,f,g,h,i,j,k,l,m,n,o,p,q,s,t,v,w,x,y,z,B,C,D,E;a.scope=new M(a.scope,this.body,this),a.scope.shared=Z(a,"sharedScope"),a.indent+=Q,delete a.bare,o=[],e=[],z=this.params;for(q=0,v=z.length;q=u?"("+b+")":b},b.prototype.traverseChildren=function(a,c){if(a)return b.__super__.traverseChildren.call(this,a,c)};return b}(e),a.Param=G=function(a){function b(a,b,c){this.name=a,this.value=b,this.splat=c}bj(b,a),b.prototype.children=["name","value"],b.prototype.compile=function(a){return this.name.compile(a,w)},b.prototype.asReference=function(a){var b;if(this.reference)return this.reference;b=this.name,b["this"]?(b=b.properties[0].name,b.value.reserved&&(b=new A("_"+b.value))):b.isComplex()&&(b=new A(a.scope.freeVariable("arg"))),b=new V(b),this.splat&&(b=new O(b));return this.reference=b},b.prototype.isComplex=function(){return this.name.isComplex()};return b}(e),a.Splat=O=function(a){function b(a){this.name=a.compile?a:new A(a)}bj(b,a),b.prototype.children=["name"],b.prototype.isAssignable=X,b.prototype.assigns=function(a){return this.name.assigns(a)},b.prototype.compile=function(a){return this.index!=null?this.compileParam(a):this.name.compile(a)},b.prototype.unwrap=function(){return this.name},b.compileSplattedArray=function(a,c,d){var e,f,g,h,i,j,k;i=-1;while((j=c[++i])&&!(j instanceof b))continue;if(i>=c.length)return"";if(c.length===1){g=c[0].compile(a,w);if(d)return g;return""+bg("slice")+".call("+g+")"}e=c.slice(i);for(h=0,k=e.length;h1?b.expressions.unshift(new r((new H(this.guard)).invert(),new A("continue"))):this.guard&&(b=f.wrap([new r(this.guard,b)]))),b="\n"+b.compile(a,z)+"\n"+this.tab),c=e+this.tab+("while ("+this.condition.compile(a,y)+") {"+b+"}"),this.returns&&(c+="\n"+this.tab+"return "+d+";");return c};return b}(e),a.Op=F=function(a){function e(a,c,d,e){var f;if(a==="in")return new s(c,d);if(a==="do"){f=new g(c,c.params||[]),f["do"]=!0;return f}if(a==="new"){if(c instanceof g&&!c["do"]&&!c.isNew)return c.newInstance();if(c instanceof j&&c.bound||c["do"])c=new H(c)}this.operator=b[a]||a,this.first=c,this.second=d,this.flip=!!e;return this}var b,c;bj(e,a),b={"==":"===","!=":"!==",of:"in"},c={"!==":"===","===":"!=="},e.prototype.children=["first","second"],e.prototype.isSimpleNumber=D,e.prototype.isUnary=function(){return!this.second},e.prototype.isComplex=function(){var a;return!this.isUnary()||(a=this.operator)!=="+"&&a!=="-"||this.first.isComplex()},e.prototype.isChainable=function(){var a;return(a=this.operator)==="<"||a===">"||a===">="||a==="<="||a==="==="||a==="!=="},e.prototype.invert=function(){var a,b,d,f,g;if(this.isChainable()&&this.first.isChainable()){a=!0,b=this;while(b&&b.operator)a&&(a=b.operator in c),b=b.first;if(!a)return(new H(this)).invert();b=this;while(b&&b.operator)b.invert=!b.invert,b.operator=c[b.operator],b=b.first;return this}if(f=c[this.operator]){this.operator=f,this.first.unwrap()instanceof e&&this.first.invert();return this}return this.second?(new H(this)).invert():this.operator==="!"&&(d=this.first.unwrap())instanceof e&&((g=d.operator)==="!"||g==="in"||g==="instanceof")?d:new e("!",this)},e.prototype.unfoldSoak=function(a){var b;return((b=this.operator)==="++"||b==="--"||b==="delete")&&bf(a,this,"first")},e.prototype.compileNode=function(a){var b,c;c=this.isChainable()&&this.first.isChainable(),c||(this.first.front=this.front);if(this.isUnary())return this.compileUnary(a);if(c)return this.compileChain(a);if(this.operator==="?")return this.compileExistence(a);b=this.first.compile(a,x)+" "+this.operator+" "+this.second.compile(a,x);return a.level<=x?b:"("+b+")"},e.prototype.compileChain=function(a){var b,c,d,e;e=this.first.second.cache(a),this.first.second=e[0],d=e[1],c=this.first.compile(a,x),b=""+c+" "+(this.invert?"&&":"||")+" "+d.compile(a)+" "+this.operator+" "+this.second.compile(a,x);return"("+b+")"},e.prototype.compileExistence=function(a){var b,c;this.first.isComplex()&&a.level>z?(c=new A(a.scope.freeVariable("ref")),b=new H(new d(c,this.first))):(b=this.first,c=b);return(new r(new l(b),c,{type:"if"})).addElse(this.second).compile(a)},e.prototype.compileUnary=function(a){var b,c,d;c=[b=this.operator],d=b==="+"||b==="-",(b==="new"||b==="typeof"||b==="delete"||d&&this.first instanceof e&&this.first.operator===b)&&c.push(" ");if(d&&this.first instanceof e||b==="new"&&this.first.isStatement(a))this.first=new H(this.first);c.push(this.first.compile(a,x)),this.flip&&c.reverse();return c.join("")},e.prototype.toString=function(a){return e.__super__.toString.call(this,a,this.constructor.name+" "+this.operator)};return e}(e),a.In=s=function(a){function b(a,b){this.object=a,this.array=b}bj(b,a),b.prototype.children=["object","array"],b.prototype.invert=C,b.prototype.compileNode=function(a){var b,c,d,e,f;if(this.array instanceof V&&this.array.isArray()){f=this.array.base.objects;for(d=0,e=f.length;d= 0");if(d===c)return b;b=d+", "+b;return a.level1?b.expressions.unshift(new r((new H(this.guard)).invert(),new A("continue"))):this.guard&&(b=f.wrap([new r(this.guard,b)]))),this.pattern&&b.expressions.unshift(new d(this.name,new A(""+D+"["+k+"]"))),c+=this.pluckDirectCall(a,b),p&&(E="\n"+i+p+";"),this.object&&(e=""+k+" in "+D,this.own&&(h="\n"+i+"if (!"+bg("hasProp")+".call("+D+", "+k+")) continue;")),b=b.compile(bc(a,{indent:i}),z),b&&(b="\n"+b+"\n");return""+c+(s||"")+this.tab+"for ("+e+") {"+h+E+b+this.tab+"}"+(t||"")},b.prototype.pluckDirectCall=function(a,b){var c,e,f,h,i,k,l,m,n,o,p,q,r,s;e="",n=b.expressions;for(i=0,m=n.length;if.length+d.length)return""+this.tab+"if ("+f+") "+d.replace(/^\s+/,"");d&&(d="\n"+d+"\n"+this.tab),h="if ("+f+") {"+d+"}",e||(h=this.tab+h);if(!this.elseBody)return h;return h+" else "+(this.isChain?(a.indent=this.tab,a.chainChild=!0,this.elseBody.unwrap().compile(a,z)):"{\n"+this.elseBody.compile(a,z)+"\n"+this.tab+"}")},b.prototype.compileExpression=function(a){var b,c,d,e;e=this.condition.compile(a,v),c=this.bodyNode().compile(a,w),b=this.elseBodyNode()?this.elseBodyNode().compile(a,w):"void 0",d=""+e+" ? "+c+" : "+b;return a.level>=v?"("+d+")":d},b.prototype.unfoldSoak=function(){return this.soak&&this};return b}(e),i={wrap:function(a,c,d){var e,h,i,k,l;if(a.jumps())return a;i=new j([],f.wrap([a])),e=[];if((k=a.contains(this.literalArgs))||a.contains(this.literalThis))l=new A(k?"apply":"call"),e=[new A("this")],k&&e.push(new A("arguments")),i=new V(i,[new b(l)]);i.noReturn=d,h=new g(i,e);return c?f.wrap([h]):h},literalArgs:function(a){return a instanceof A&&a.value==="arguments"&&!a.asKey},literalThis:function(a){return a instanceof A&&a.value==="this"&&!a.asKey||a instanceof j&&a.bound}},bf=function(a,b,c){var d;if(!!(d=b[c].unfoldSoak(a))){b[c]=d.body,d.body=new V(b);return d}},U={"extends":function(){return"function(child, parent) { for (var key in parent) { if ("+bg("hasProp")+".call(parent, key)) child[key] = parent[key]; } function ctor() { this.constructor = child; } ctor.prototype = parent.prototype; child.prototype = new ctor; child.__super__ = parent.prototype; return child; }"},bind:function(){return"function(fn, me){ return function(){ return fn.apply(me, arguments); }; }"},indexOf:function(){return"Array.prototype.indexOf || function(item) { for (var i = 0, l = this.length; i < l; i++) { if (i in this && this[i] === item) return i; } return -1; }"},hasProp:function(){return"Object.prototype.hasOwnProperty"},slice:function(){return"Array.prototype.slice"}},z=1,y=2,w=3,v=4,x=5,u=6,Q=" ",p="[$A-Za-z_\\x7f-\\uffff][$\\w\\x7f-\\uffff]*",o=RegExp("^"+p+"$"),L=/^[+-]?\d+$/,B=RegExp("^(?:("+p+")\\.prototype(?:\\.("+p+")|\\[(\"(?:[^\\\\\"\\r\\n]|\\\\.)*\"|'(?:[^\\\\'\\r\\n]|\\\\.)*')\\]|\\[(0x[\\da-fA-F]+|\\d*\\.?\\d+(?:[eE][+-]?\\d+)?)\\]))|("+p+")$"),q=/^['"]/,bg=function(a){var b;b="__"+a,M.root.assign(b,U[a]());return b},bd=function(a,b){a=a.replace(/\n/g,"$&"+b);return a.replace(/\s+$/,"")}}).call(this)},require["./coffee-script"]=new function(){var a=this;(function(){var b,c,d,e,f,g,h,i,j,k=Object.prototype.hasOwnProperty;e=require("fs"),h=require("path"),j=require("./lexer"),b=j.Lexer,c=j.RESERVED,g=require("./parser").parser,i=require("vm"),require.extensions?require.extensions[".coffee"]=function(a,b){var c;c=d(e.readFileSync(b,"utf8"),{filename:b});return a._compile(c,b)}:require.registerExtension&&require.registerExtension(".coffee",function(a){return d(a)}),a.VERSION="1.2.0",a.RESERVED=c,a.helpers=require("./helpers"),a.compile=d=function(b,c){var d;c==null&&(c={}),d=a.helpers.merge;try{return g.parse(f.tokenize(b)).compile(d({},c))}catch(e){c.filename&&(e.message="In "+c.filename+", "+e.message);throw e}},a.tokens=function(a,b){return f.tokenize(a,b)},a.nodes=function(a,b){return typeof a=="string"?g.parse(f.tokenize(a,b)):g.parse(a)},a.run=function(a,b){var c;c=require.main,c.filename=process.argv[1]=b.filename?e.realpathSync(b.filename):".",c.moduleCache&&(c.moduleCache={}),c.paths=require("module")._nodeModulePaths(h.dirname(b.filename));return h.extname(c.filename)!==".coffee"||require.extensions?c._compile(d(a,b),c.filename):c._compile(a,c.filename)},a.eval=function(a,b){var c,e,f,g,j,l,m,n,o,p,q,r,s,t;b==null&&(b={});if(!!(a=a.trim())){e=i.Script;if(e){if(b.sandbox!=null){if(b.sandbox instanceof e.createContext().constructor)m=b.sandbox;else{m=e.createContext(),r=b.sandbox;for(g in r){if(!k.call(r,g))continue;n=r[g],m[g]=n}}m.global=m.root=m.GLOBAL=m}else m=global;m.__filename=b.filename||"eval",m.__dirname=h.dirname(m.__filename);if(m===global&&!m.module&&!m.require){c=require("module"),m.module=q=new c(b.modulename||"eval"),m.require=t=function(a){return c._load(a,q,!0)},q.filename=m.__filename,s=Object.getOwnPropertyNames(require);for(o=0,p=s.length;o, targeting the Spidermonkey runtime. // // To run the tests, open mimeparse-js-test.html in a browser. // Ported from version 0.1.2 // Comments are mostly excerpted from the original. var Mimeparse = (function() { // private helpers function strip(string) { return string.replace(/^\s+/, '').replace(/\s+$/, ''); }; function parseRanges(ranges) { var parsedRanges = [], rangeParts = ranges.split(","); for (var i=0; i < rangeParts.length; i++) { parsedRanges.push(publicMethods.parseMediaRange(rangeParts[i])); }; return parsedRanges; }; var publicMethods = { // Carves up a mime-type and returns an Array of the // [type, subtype, params] where "params" is a Hash of all // the parameters for the media range. // // For example, the media range "application/xhtml;q=0.5" would // get parsed into: // // ["application", "xhtml", { "q" : "0.5" }] parseMimeType : function(mimeType) { var fullType, typeParts, params = {}, parts = mimeType.split(';'); for (var i=0; i < parts.length; i++) { var p = parts[i].split('='); if (p.length == 2) { params[strip(p[0])] = strip(p[1]); } }; fullType = parts[0].replace(/^\s+/, '').replace(/\s+$/, ''); if (fullType == '*') fullType = '*/*'; typeParts = fullType.split('/'); return [typeParts[0], typeParts[1], params]; }, // Carves up a media range and returns an Array of the // [type, subtype, params] where "params" is a Object with // all the parameters for the media range. // // For example, the media range "application/*;q=0.5" would // get parsed into: // // ["application", "*", { "q" : "0.5" }] // // In addition this function also guarantees that there // is a value for "q" in the params dictionary, filling it // in with a proper default if necessary. parseMediaRange : function(range) { var q, parsedType = this.parseMimeType(range); if (!parsedType[2]['q']) { parsedType[2]['q'] = '1'; } else { q = parseFloat(parsedType[2]['q']); if (isNaN(q)) { parsedType[2]['q'] = '1'; } else if (q > 1 || q < 0) { parsedType[2]['q'] = '1'; } } return parsedType; }, // Find the best match for a given mime-type against // a list of media_ranges that have already been // parsed by parseMediaRange(). Returns an array of // the fitness value and the value of the 'q' quality // parameter of the best match, or (-1, 0) if no match // was found. Just as for qualityParsed(), 'parsed_ranges' // must be a list of parsed media ranges. fitnessAndQualityParsed : function(mimeType, parsedRanges) { var bestFitness = -1, bestFitQ = 0, target = this.parseMediaRange(mimeType); var targetType = target[0], targetSubtype = target[1], targetParams = target[2]; for (var i=0; i < parsedRanges.length; i++) { var parsed = parsedRanges[i]; var type = parsed[0], subtype = parsed[1], params = parsed[2]; if ((type == targetType || type == "*" || targetType == "*") && (subtype == targetSubtype || subtype == "*" || targetSubtype == "*")) { var matchCount = 0; for (var param in targetParams) { if (param != 'q' && params[param] && params[param] == targetParams[param]) { matchCount += 1; } } var fitness = (type == targetType) ? 100 : 0; fitness += (subtype == targetSubtype) ? 10 : 0; fitness += matchCount; if (fitness > bestFitness) { bestFitness = fitness; bestFitQ = params["q"]; } } }; return [bestFitness, parseFloat(bestFitQ)]; }, // Find the best match for a given mime-type against // a list of media_ranges that have already been // parsed by parseMediaRange(). Returns the // 'q' quality parameter of the best match, 0 if no // match was found. This function bahaves the same as quality() // except that 'parsedRanges' must be a list of // parsed media ranges. qualityParsed : function(mimeType, parsedRanges) { return this.fitnessAndQualityParsed(mimeType, parsedRanges)[1]; }, // Returns the quality 'q' of a mime-type when compared // against the media-ranges in ranges. For example: // // >>> Mimeparse.quality('text/html','text/*;q=0.3, text/html;q=0.7, text/html;level=1, text/html;level=2;q=0.4, */*;q=0.5') // 0.7 quality : function(mimeType, ranges) { return this.qualityParsed(mimeType, parseRanges(ranges)); }, // Takes a list of supported mime-types and finds the best // match for all the media-ranges listed in header. The value of // header must be a string that conforms to the format of the // HTTP Accept: header. The value of 'supported' is a list of // mime-types. // // >>> bestMatch(['application/xbel+xml', 'text/xml'], 'text/*;q=0.5,*/*; q=0.1') // 'text/xml' bestMatch : function(supported, header) { var parsedHeader = parseRanges(header); var weighted = []; for (var i=0; i < supported.length; i++) { weighted.push([publicMethods.fitnessAndQualityParsed(supported[i], parsedHeader), i, supported[i]]); }; weighted.sort(); return weighted[weighted.length-1][0][1] ? weighted[weighted.length-1][2] : ''; } }; return publicMethods; })(); apache-couchdb-1.6.0/share/server/state.js0000644000175000001440000000203512332105522020404 0ustar00djcusers00000000000000// Licensed under the Apache License, Version 2.0 (the "License"); you may not // use this file except in compliance with the License. You may obtain a copy of // the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, WITHOUT // WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the // License for the specific language governing permissions and limitations under // the License. var State = { reset : function(config) { // clear the globals and run gc State.funs = []; State.lib = null; State.query_config = config || {}; init_sandbox(); gc(); print("true"); // indicates success }, addFun : function(newFun) { // Compile to a function and add it to funs array State.funs.push(Couch.compileFunction(newFun, {views : {lib : State.lib}})); print("true"); }, addLib : function(lib) { State.lib = lib; print("true"); } }; apache-couchdb-1.6.0/share/server/util.js0000644000175000001440000001263112332105522020244 0ustar00djcusers00000000000000// Licensed under the Apache License, Version 2.0 (the "License"); you may not // use this file except in compliance with the License. You may obtain a copy of // the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, WITHOUT // WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the // License for the specific language governing permissions and limitations under // the License. var resolveModule = function(names, mod, root) { if (names.length == 0) { if (typeof mod.current != "string") { throw ["error","invalid_require_path", 'Must require a JavaScript string, not: '+(typeof mod.current)]; } return { current : mod.current, parent : mod.parent, id : mod.id, exports : {} }; } // we need to traverse the path var n = names.shift(); if (n == '..') { if (!(mod.parent && mod.parent.parent)) { throw ["error", "invalid_require_path", 'Object has no parent '+JSON.stringify(mod.current)]; } return resolveModule(names, { id : mod.id.slice(0, mod.id.lastIndexOf('/')), parent : mod.parent.parent, current : mod.parent.current }); } else if (n == '.') { if (!mod.parent) { throw ["error", "invalid_require_path", 'Object has no parent '+JSON.stringify(mod.current)]; } return resolveModule(names, { parent : mod.parent, current : mod.current, id : mod.id }); } else if (root) { mod = {current : root}; } if (mod.current[n] === undefined) { throw ["error", "invalid_require_path", 'Object has no property "'+n+'". '+JSON.stringify(mod.current)]; } return resolveModule(names, { current : mod.current[n], parent : mod, id : mod.id ? mod.id + '/' + n : n }); }; var Couch = { // moving this away from global so we can move to json2.js later toJSON : function (val) { return JSON.stringify(val); }, compileFunction : function(source, ddoc, name) { if (!source) throw(["error","not_found","missing function"]); var evaluate_function_source = function(source, evalFunction, sandbox) { sandbox = sandbox || {}; if(typeof CoffeeScript === "undefined") { return evalFunction(source, sandbox, name); } else { var coffee = CoffeeScript.compile(source, {bare: true}); return evalFunction(coffee, sandbox, name); } } try { if (sandbox) { if (ddoc) { if (!ddoc._module_cache) { ddoc._module_cache = {}; } var require = function(name, module) { module = module || {}; var newModule = resolveModule(name.split('/'), module.parent, ddoc); if (!ddoc._module_cache.hasOwnProperty(newModule.id)) { // create empty exports object before executing the module, // stops circular requires from filling the stack ddoc._module_cache[newModule.id] = {}; var s = "function (module, exports, require) { " + newModule.current + "\n }"; try { var func = sandbox ? evalcx(s, sandbox, newModule.id) : eval(s); func.apply(sandbox, [newModule, newModule.exports, function(name) { return require(name, newModule); }]); } catch(e) { throw [ "error", "compilation_error", "Module require('" +name+ "') raised error " + (e.toSource ? e.toSource() : e.stack) ]; } ddoc._module_cache[newModule.id] = newModule.exports; } return ddoc._module_cache[newModule.id]; }; sandbox.require = require; } var functionObject = evaluate_function_source(source, evalcx, sandbox); } else { var functionObject = evaluate_function_source(source, eval); } } catch (err) { throw([ "error", "compilation_error", (err.toSource ? err.toSource() : err.stack) + " (" + source + ")" ]); }; if (typeof(functionObject) == "function") { return functionObject; } else { throw(["error","compilation_error", "Expression does not eval to a function. (" + source.toString() + ")"]); }; }, recursivelySeal : function(obj) { // seal() is broken in current Spidermonkey try { seal(obj); } catch (x) { // Sealing of arrays broken in some SpiderMonkey versions. // https://bugzilla.mozilla.org/show_bug.cgi?id=449657 } for (var propname in obj) { if (typeof obj[propname] == "object") { arguments.callee(obj[propname]); } } } }; // prints the object as JSON, and rescues and logs any toJSON() related errors function respond(obj) { try { print(Couch.toJSON(obj)); } catch(e) { log("Error converting object to JSON: " + e.toString()); log("error on obj: "+ (obj.toSource ? obj.toSource() : obj.toString())); } }; function log(message) { // idea: query_server_config option for log level if (typeof message == "xml") { message = message.toXMLString(); } else if (typeof message != "string") { message = Couch.toJSON(message); } respond(["log", String(message)]); }; function isArray(obj) { return toString.call(obj) === "[object Array]"; } apache-couchdb-1.6.0/share/server/render.js0000644000175000001440000002405012332105522020544 0ustar00djcusers00000000000000// Licensed under the Apache License, Version 2.0 (the "License"); you may not // use this file except in compliance with the License. You may obtain a copy of // the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, WITHOUT // WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the // License for the specific language governing permissions and limitations under // the License. var Mime = (function() { // registerType(name, mime-type, mime-type, ...) // // Available in query server sandbox. TODO: The list is cleared on reset. // This registers a particular name with the set of mimetypes it can handle. // Whoever registers last wins. // // Example: // registerType("html", "text/html; charset=utf-8"); var mimesByKey = {}; var keysByMime = {}; function registerType() { var mimes = [], key = arguments[0]; for (var i=1; i < arguments.length; i++) { mimes.push(arguments[i]); }; mimesByKey[key] = mimes; for (var i=0; i < mimes.length; i++) { keysByMime[mimes[i]] = key; }; } // Some default types // Ported from Ruby on Rails // Build list of Mime types for HTTP responses // http://www.iana.org/assignments/media-types/ // http://dev.rubyonrails.org/svn/rails/trunk/actionpack/lib/action_controller/mime_types.rb registerType("all", "*/*"); registerType("text", "text/plain; charset=utf-8", "txt"); registerType("html", "text/html; charset=utf-8"); registerType("xhtml", "application/xhtml+xml", "xhtml"); registerType("xml", "application/xml", "text/xml", "application/x-xml"); registerType("js", "text/javascript", "application/javascript", "application/x-javascript"); registerType("css", "text/css"); registerType("ics", "text/calendar"); registerType("csv", "text/csv"); registerType("rss", "application/rss+xml"); registerType("atom", "application/atom+xml"); registerType("yaml", "application/x-yaml", "text/yaml"); // just like Rails registerType("multipart_form", "multipart/form-data"); registerType("url_encoded_form", "application/x-www-form-urlencoded"); // http://www.ietf.org/rfc/rfc4627.txt registerType("json", "application/json", "text/x-json"); var mimeFuns = []; function provides(type, fun) { Mime.providesUsed = true; mimeFuns.push([type, fun]); }; function resetProvides() { // set globals Mime.providesUsed = false; mimeFuns = []; Mime.responseContentType = null; }; function runProvides(req, ddoc) { var supportedMimes = [], bestFun, bestKey = null, accept = req.headers["Accept"]; if (req.query && req.query.format) { bestKey = req.query.format; Mime.responseContentType = mimesByKey[bestKey][0]; } else if (accept) { // log("using accept header: "+accept); mimeFuns.reverse().forEach(function(mimeFun) { var mimeKey = mimeFun[0]; if (mimesByKey[mimeKey]) { supportedMimes = supportedMimes.concat(mimesByKey[mimeKey]); } }); Mime.responseContentType = Mimeparse.bestMatch(supportedMimes, accept); bestKey = keysByMime[Mime.responseContentType]; } else { // just do the first one bestKey = mimeFuns[0][0]; Mime.responseContentType = mimesByKey[bestKey][0]; } if (bestKey) { for (var i=0; i < mimeFuns.length; i++) { if (mimeFuns[i][0] == bestKey) { bestFun = mimeFuns[i][1]; break; } }; }; if (bestFun) { return bestFun.call(ddoc); } else { var supportedTypes = mimeFuns.map(function(mf) { return mimesByKey[mf[0]].join(', ') || mf[0]; }); throw(["error","not_acceptable", "Content-Type "+(accept||bestKey)+" not supported, try one of: "+supportedTypes.join(', ')]); } }; return { registerType : registerType, provides : provides, resetProvides : resetProvides, runProvides : runProvides }; })(); //// //// Render dispatcher //// //// //// //// var Render = (function() { var new_header = false; var chunks = []; // Start chunks var startResp = {}; function start(resp) { startResp = resp || {}; new_header = true; }; function sendStart() { startResp = applyContentType((startResp || {}), Mime.responseContentType); respond(["start", chunks, startResp]); chunks = []; startResp = {}; new_header = false; } function applyContentType(resp, responseContentType) { resp["headers"] = resp["headers"] || {}; if (responseContentType) { resp["headers"]["Content-Type"] = resp["headers"]["Content-Type"] || responseContentType; } return resp; } function send(chunk) { chunks.push(chunk.toString()); }; function blowChunks(label) { if (new_header) { respond([label||"chunks", chunks, startResp]); new_header = false; } else { respond([label||"chunks", chunks]); } chunks = []; }; var gotRow = false, lastRow = false; function getRow() { if (lastRow) return null; if (!gotRow) { gotRow = true; sendStart(); } else { blowChunks(); } var json = JSON.parse(readline()); if (json[0] == "list_end") { lastRow = true; return null; } if (json[0] != "list_row") { throw(["fatal", "list_error", "not a row '" + json[0] + "'"]); } return json[1]; }; function maybeWrapResponse(resp) { var type = typeof resp; if ((type == "string") || (type == "xml")) { return {body:resp}; } else { return resp; } }; // from http://javascript.crockford.com/remedial.html function typeOf(value) { var s = typeof value; if (s === 'object') { if (value) { if (value instanceof Array) { s = 'array'; } } else { s = 'null'; } } return s; }; function isDocRequestPath(info) { var path = info.path; return path.length > 5; }; function runShow(fun, ddoc, args) { try { resetList(); Mime.resetProvides(); var resp = fun.apply(ddoc, args) || {}; resp = maybeWrapResponse(resp); // handle list() style API if (chunks.length && chunks.length > 0) { resp.headers = resp.headers || {}; for(var header in startResp) { resp.headers[header] = startResp[header]; } resp.body = chunks.join("") + (resp.body || ""); resetList(); } if (Mime.providesUsed) { var provided_resp = Mime.runProvides(args[1], ddoc) || {}; provided_resp = maybeWrapResponse(provided_resp); resp.body = (resp.body || "") + chunks.join(""); resp.body += provided_resp.body || ""; resp = applyContentType(resp, Mime.responseContentType); resetList(); } var type = typeOf(resp); if (type == 'object' || type == 'string') { respond(["resp", maybeWrapResponse(resp)]); } else { throw(["error", "render_error", "undefined response from show function"]); } } catch(e) { if (args[0] === null && isDocRequestPath(args[1])) { throw(["error", "not_found", "document not found"]); } else { renderError(e, fun.toString()); } } }; function runUpdate(fun, ddoc, args) { try { var method = args[1].method; // for analytics logging applications you might want to remove the next line if (method == "GET") throw(["error","method_not_allowed","Update functions do not allow GET"]); var result = fun.apply(ddoc, args); var doc = result[0]; var resp = result[1]; var type = typeOf(resp); if (type == 'object' || type == 'string') { respond(["up", doc, maybeWrapResponse(resp)]); } else { throw(["error", "render_error", "undefined response from update function"]); } } catch(e) { renderError(e, fun.toString()); } }; function resetList() { gotRow = false; lastRow = false; chunks = []; startResp = {}; new_header = false; }; function runList(listFun, ddoc, args) { try { Mime.resetProvides(); resetList(); var head = args[0]; var req = args[1]; var tail = listFun.apply(ddoc, args); if (Mime.providesUsed) { tail = Mime.runProvides(req, ddoc); } if (!gotRow) getRow(); if (typeof tail != "undefined") { chunks.push(tail); } blowChunks("end"); } catch(e) { renderError(e, listFun.toString()); } }; function renderError(e, funSrc) { if (e.error && e.reason || e[0] == "error" || e[0] == "fatal") { throw(e); } else { var logMessage = "function raised error: " + (e.toSource ? e.toSource() : e.toString()) + " \n" + "stacktrace: " + e.stack; log(logMessage); throw(["error", "render_error", logMessage]); } }; function escapeHTML(string) { return string && string.replace(/&/g, "&") .replace(//g, ">"); }; return { start : start, send : send, getRow : getRow, show : function(fun, ddoc, args) { // var showFun = Couch.compileFunction(funSrc); runShow(fun, ddoc, args); }, update : function(fun, ddoc, args) { // var upFun = Couch.compileFunction(funSrc); runUpdate(fun, ddoc, args); }, list : function(fun, ddoc, args) { runList(fun, ddoc, args); } }; })(); // send = Render.send; // getRow = Render.getRow; // start = Render.start; // unused. this will be handled in the Erlang side of things. // function htmlRenderError(e, funSrc) { // var msg = ["

        Render Error

        ", // "

        JavaScript function raised error: ", // e.toString(), // "

        Stacktrace:

        ",
        //     escapeHTML(e.stack),
        //     "

        Function source:

        ",
        //     escapeHTML(funSrc),
        //     "
        "].join(''); // return {body:msg}; // }; apache-couchdb-1.6.0/share/server/validate.js0000644000175000001440000000143212332105522021055 0ustar00djcusers00000000000000// Licensed under the Apache License, Version 2.0 (the "License"); you may not // use this file except in compliance with the License. You may obtain a copy of // the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, WITHOUT // WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the // License for the specific language governing permissions and limitations under // the License. var Validate = { validate : function(fun, ddoc, args) { try { fun.apply(ddoc, args); respond(1); } catch (error) { if (error.name && error.stack) { throw error; } respond(error); } } }; apache-couchdb-1.6.0/share/server/views.js0000644000175000001440000001075712332105522020433 0ustar00djcusers00000000000000// Licensed under the Apache License, Version 2.0 (the "License"); you may not // use this file except in compliance with the License. You may obtain a copy of // the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, WITHOUT // WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the // License for the specific language governing permissions and limitations under // the License. var Views = (function() { var map_results = []; // holds temporary emitted values during doc map function runReduce(reduceFuns, keys, values, rereduce) { for (var i in reduceFuns) { reduceFuns[i] = Couch.compileFunction(reduceFuns[i]); }; var reductions = new Array(reduceFuns.length); for(var i = 0; i < reduceFuns.length; i++) { try { reductions[i] = reduceFuns[i](keys, values, rereduce); } catch (err) { handleViewError(err); // if the error is not fatal, ignore the results and continue reductions[i] = null; } }; var reduce_line = Couch.toJSON(reductions); var reduce_length = reduce_line.length; // TODO make reduce_limit config into a number if (State.query_config && State.query_config.reduce_limit && reduce_length > 200 && ((reduce_length * 2) > State.line_length)) { var reduce_preview = "Current output: '"+(reduce_line.substring(0,100) + "'... (first 100 of "+reduce_length+" bytes)"); throw(["error", "reduce_overflow_error", "Reduce output must shrink more rapidly: "+reduce_preview]); } else { print("[true," + reduce_line + "]"); } }; function handleViewError(err, doc) { if (err == "fatal_error") { // Only if it's a "fatal_error" do we exit. What's a fatal error? // That's for the query to decide. // // This will make it possible for queries to completely error out, // by catching their own local exception and rethrowing a // fatal_error. But by default if they don't do error handling we // just eat the exception and carry on. // // In this case we abort map processing but don't destroy the // JavaScript process. If you need to destroy the JavaScript // process, throw the error form matched by the block below. throw(["error", "map_runtime_error", "function raised 'fatal_error'"]); } else if (err[0] == "fatal") { // Throwing errors of the form ["fatal","error_key","reason"] // will kill the OS process. This is not normally what you want. throw(err); } var message = "function raised exception " + (err.toSource ? err.toSource() : err.stack); if (doc) message += " with doc._id " + doc._id; log(message); }; return { // view helper functions emit : function(key, value) { map_results.push([key, value]); }, sum : function(values) { var rv = 0; for (var i in values) { rv += values[i]; } return rv; }, reduce : function(reduceFuns, kvs) { var keys = new Array(kvs.length); var values = new Array(kvs.length); for(var i = 0; i < kvs.length; i++) { keys[i] = kvs[i][0]; values[i] = kvs[i][1]; } runReduce(reduceFuns, keys, values, false); }, rereduce : function(reduceFuns, values) { runReduce(reduceFuns, null, values, true); }, mapDoc : function(doc) { // Compute all the map functions against the document. // // Each function can output multiple key/value pairs for each document. // // Example output of map_doc after three functions set by add_fun cmds: // [ // [["Key","Value"]], <- fun 1 returned 1 key value // [], <- fun 2 returned 0 key values // [["Key1","Value1"],["Key2","Value2"]] <- fun 3 returned 2 key values // ] // Couch.recursivelySeal(doc); var buf = []; for (var i = 0; i < State.funs.length; i++) { map_results = []; try { State.funs[i](doc); buf.push(Couch.toJSON(map_results)); } catch (err) { handleViewError(err, doc); // If the error is not fatal, we treat the doc as if it // did not emit anything, by buffering an empty array. buf.push("[]"); } } print("[" + buf.join(", ") + "]"); } }; })(); apache-couchdb-1.6.0/utils/0000755000175000001440000000000012332106073015460 5ustar00djcusers00000000000000apache-couchdb-1.6.0/utils/Makefile.am0000644000175000001440000000354012332105522017514 0ustar00djcusers00000000000000## Licensed under the Apache License, Version 2.0 (the "License"); you may not ## use this file except in compliance with the License. You may obtain a copy of ## the License at ## ## http://www.apache.org/licenses/LICENSE-2.0 ## ## Unless required by applicable law or agreed to in writing, software ## distributed under the License is distributed on an "AS IS" BASIS, WITHOUT ## WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the ## License for the specific language governing permissions and limitations under ## the License. noinst_SCRIPTS = run CLEANFILES = $(noinst_SCRIPTS) transform = @program_transform_name@ couchdb_command_name = `echo couchdb | sed '$(transform)'` run: ../bin/couchdb.tpl sed -e "s|%ERL%|$(ERL)|g" \ -e "s|%ICU_CONFIG%|$(ICU_CONFIG)|g" \ -e "s|%bindir%|$(abs_top_builddir)/bin|g" \ -e "s|%defaultini%|default_dev.ini|g" \ -e "s|%localini%|local_dev.ini|g" \ -e "s|%localerlanglibdir%|$(abs_top_builddir)\/src \ -pa $(abs_top_builddir)\/src\/couchdb \ -pa $(abs_top_builddir)\/src\/ejson \ -pa $(abs_top_builddir)\/src\/erlang-oauth \ -pa $(abs_top_builddir)\/src\/ibrowse \ -pa $(abs_top_builddir)\/src\/mochiweb \ -pa $(abs_top_builddir)\/src\/snappy|g" \ -e "s|%localconfdir%|$(abs_top_builddir)/etc/couchdb|g" \ -e "s|%localstatelogdir%|$(abs_top_builddir)/tmp/log|g" \ -e "s|%localstatelibdir%|$(abs_top_builddir)/tmp/lib|g" \ -e "s|%localstatedir%|$(abs_top_builddir)/tmp|g" \ -e "s|%locallibdir%|$(abs_top_builddir)/tmp|g" \ -e "s|%bug_uri%|@bug_uri@|g" \ -e "s|%package_author_address%|@package_author_address@|g" \ -e "s|%package_author_name%|@package_author_name@|g" \ -e "s|%package_name%|@package_name@|g" \ -e "s|%version%|@version@|g" \ -e "s|%couchdb_command_name%|$(couchdb_command_name)|g" > \ $@ < $< chmod +x $@ apache-couchdb-1.6.0/utils/Makefile.in0000644000175000001440000003263612332105553017541 0ustar00djcusers00000000000000# Makefile.in generated by automake 1.11.6 from Makefile.am. # @configure_input@ # Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, # 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011 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__make_dryrun = \ { \ am__dry=no; \ case $$MAKEFLAGS in \ *\\[\ \ ]*) \ echo 'am--echo: ; @echo "AM" OK' | $(MAKE) -f - 2>/dev/null \ | grep '^AM OK$$' >/dev/null || am__dry=yes;; \ *) \ for am__flg in $$MAKEFLAGS; do \ case $$am__flg in \ *=*|--*) ;; \ *n*) am__dry=yes; break;; \ esac; \ done;; \ esac; \ test $$am__dry = yes; \ } 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) NORMAL_INSTALL = : PRE_INSTALL = : POST_INSTALL = : NORMAL_UNINSTALL = : PRE_UNINSTALL = : POST_UNINSTALL = : build_triplet = @build@ host_triplet = @host@ subdir = utils DIST_COMMON = $(srcdir)/Makefile.am $(srcdir)/Makefile.in ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 am__aclocal_m4_deps = $(top_srcdir)/m4/libtool.m4 \ $(top_srcdir)/m4/ltoptions.m4 $(top_srcdir)/m4/ltsugar.m4 \ $(top_srcdir)/m4/ltversion.m4 $(top_srcdir)/m4/lt~obsolete.m4 \ $(top_srcdir)/acinclude.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 \ $(top_builddir)/src/snappy/google-snappy/config.h CONFIG_CLEAN_FILES = CONFIG_CLEAN_VPATH_FILES = SCRIPTS = $(noinst_SCRIPTS) 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 DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) transform = @program_transform_name@ ACLOCAL = @ACLOCAL@ AMTAR = @AMTAR@ AR = @AR@ AS = @AS@ AUTOCONF = @AUTOCONF@ AUTOHEADER = @AUTOHEADER@ AUTOMAKE = @AUTOMAKE@ AWK = @AWK@ CC = @CC@ CCDEPMODE = @CCDEPMODE@ CFLAGS = @CFLAGS@ CPP = @CPP@ CPPFLAGS = @CPPFLAGS@ CURL_CFLAGS = @CURL_CFLAGS@ CURL_CONFIG = @CURL_CONFIG@ CURL_LIBS = @CURL_LIBS@ CXX = @CXX@ CXXCPP = @CXXCPP@ CXXDEPMODE = @CXXDEPMODE@ CXXFLAGS = @CXXFLAGS@ CYGPATH_W = @CYGPATH_W@ DEFS = @DEFS@ DEPDIR = @DEPDIR@ DLLTOOL = @DLLTOOL@ DSYMUTIL = @DSYMUTIL@ DUMPBIN = @DUMPBIN@ ECHO_C = @ECHO_C@ ECHO_N = @ECHO_N@ ECHO_T = @ECHO_T@ EGREP = @EGREP@ ERL = @ERL@ ERLANG_FLAGS = @ERLANG_FLAGS@ ERLC = @ERLC@ ERLC_FLAGS = @ERLC_FLAGS@ ESCRIPT = @ESCRIPT@ EXEEXT = @EXEEXT@ FGREP = @FGREP@ FLAGS = @FLAGS@ GREP = @GREP@ HAS_HELP2MAN = @HAS_HELP2MAN@ HAS_INSTALLINFO = @HAS_INSTALLINFO@ HAS_MAKEINFO = @HAS_MAKEINFO@ HAS_PDFLATEX = @HAS_PDFLATEX@ HAS_SPHINX_BUILD = @HAS_SPHINX_BUILD@ ICU_BIN = @ICU_BIN@ ICU_CFLAGS = @ICU_CFLAGS@ ICU_CONFIG = @ICU_CONFIG@ ICU_CPPFLAGS = @ICU_CPPFLAGS@ ICU_CXXFLAGS = @ICU_CXXFLAGS@ ICU_LIBS = @ICU_LIBS@ INNO_COMPILER_EXECUTABLE = @INNO_COMPILER_EXECUTABLE@ INSTALL = @INSTALL@ INSTALL_DATA = @INSTALL_DATA@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ INSTALL_SCRIPT = @INSTALL_SCRIPT@ INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ JS_CFLAGS = @JS_CFLAGS@ JS_LIBS = @JS_LIBS@ JS_LIB_BINARY = @JS_LIB_BINARY@ LD = @LD@ LDFLAGS = @LDFLAGS@ LIBOBJS = @LIBOBJS@ LIBS = @LIBS@ LIBTOOL = @LIBTOOL@ LIPO = @LIPO@ LN_S = @LN_S@ LTLIBOBJS = @LTLIBOBJS@ MAKEINFO = @MAKEINFO@ MANIFEST_TOOL = @MANIFEST_TOOL@ MKDIR_P = @MKDIR_P@ NM = @NM@ NMEDIT = @NMEDIT@ OBJDUMP = @OBJDUMP@ OBJEXT = @OBJEXT@ OTOOL = @OTOOL@ OTOOL64 = @OTOOL64@ PACKAGE = @PACKAGE@ PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ PACKAGE_NAME = @PACKAGE_NAME@ PACKAGE_STRING = @PACKAGE_STRING@ PACKAGE_TARNAME = @PACKAGE_TARNAME@ PACKAGE_URL = @PACKAGE_URL@ PACKAGE_VERSION = @PACKAGE_VERSION@ PATH_SEPARATOR = @PATH_SEPARATOR@ PKG_CONFIG = @PKG_CONFIG@ PKG_CONFIG_LIBDIR = @PKG_CONFIG_LIBDIR@ PKG_CONFIG_PATH = @PKG_CONFIG_PATH@ RANLIB = @RANLIB@ SED = @SED@ SET_MAKE = @SET_MAKE@ SHELL = @SHELL@ SNAPPY_MAJOR = @SNAPPY_MAJOR@ SNAPPY_MINOR = @SNAPPY_MINOR@ SNAPPY_PATCHLEVEL = @SNAPPY_PATCHLEVEL@ STRIP = @STRIP@ VERSION = @VERSION@ 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@ ac_cv_have_stddef_h = @ac_cv_have_stddef_h@ ac_cv_have_stdint_h = @ac_cv_have_stdint_h@ am__include = @am__include@ am__leading_dot = @am__leading_dot@ am__quote = @am__quote@ am__tar = @am__tar@ am__untar = @am__untar@ bindir = @bindir@ bug_uri = @bug_uri@ 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@ dvidir = @dvidir@ erlangbin = @erlangbin@ erlangversion = @erlangversion@ exec_prefix = @exec_prefix@ host = @host@ host_alias = @host_alias@ host_cpu = @host_cpu@ host_os = @host_os@ host_vendor = @host_vendor@ htmldir = @htmldir@ includedir = @includedir@ infodir = @infodir@ initdir = @initdir@ install_sh = @install_sh@ launchddir = @launchddir@ libdir = @libdir@ libexecdir = @libexecdir@ localconfdir = @localconfdir@ localdatadir = @localdatadir@ localdocdir = @localdocdir@ localedir = @localedir@ localerlanglibdir = @localerlanglibdir@ locallibbindir = @locallibbindir@ locallibdir = @locallibdir@ localstatedir = @localstatedir@ localstatelibdir = @localstatelibdir@ localstatelogdir = @localstatelogdir@ localstaterundir = @localstaterundir@ mandir = @mandir@ mkdir_p = @mkdir_p@ msvc_redist_dir = @msvc_redist_dir@ msvc_redist_name = @msvc_redist_name@ oldincludedir = @oldincludedir@ openssl_bin_dir = @openssl_bin_dir@ otp_release = @otp_release@ package_author_address = @package_author_address@ package_author_name = @package_author_name@ package_identifier = @package_identifier@ package_name = @package_name@ package_tarname = @package_tarname@ 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@ version = @version@ version_major = @version_major@ version_minor = @version_minor@ version_release = @version_release@ version_revision = @version_revision@ version_stage = @version_stage@ noinst_SCRIPTS = run CLEANFILES = $(noinst_SCRIPTS) couchdb_command_name = `echo couchdb | sed '$(transform)'` 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) --foreign utils/Makefile'; \ $(am__cd) $(top_srcdir) && \ $(AUTOMAKE) --foreign utils/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 TAGS: ctags: CTAGS CTAGS: 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 $(SCRIPTS) 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 check check-am clean clean-generic clean-libtool \ 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 uninstall uninstall-am run: ../bin/couchdb.tpl sed -e "s|%ERL%|$(ERL)|g" \ -e "s|%ICU_CONFIG%|$(ICU_CONFIG)|g" \ -e "s|%bindir%|$(abs_top_builddir)/bin|g" \ -e "s|%defaultini%|default_dev.ini|g" \ -e "s|%localini%|local_dev.ini|g" \ -e "s|%localerlanglibdir%|$(abs_top_builddir)\/src \ -pa $(abs_top_builddir)\/src\/couchdb \ -pa $(abs_top_builddir)\/src\/ejson \ -pa $(abs_top_builddir)\/src\/erlang-oauth \ -pa $(abs_top_builddir)\/src\/ibrowse \ -pa $(abs_top_builddir)\/src\/mochiweb \ -pa $(abs_top_builddir)\/src\/snappy|g" \ -e "s|%localconfdir%|$(abs_top_builddir)/etc/couchdb|g" \ -e "s|%localstatelogdir%|$(abs_top_builddir)/tmp/log|g" \ -e "s|%localstatelibdir%|$(abs_top_builddir)/tmp/lib|g" \ -e "s|%localstatedir%|$(abs_top_builddir)/tmp|g" \ -e "s|%locallibdir%|$(abs_top_builddir)/tmp|g" \ -e "s|%bug_uri%|@bug_uri@|g" \ -e "s|%package_author_address%|@package_author_address@|g" \ -e "s|%package_author_name%|@package_author_name@|g" \ -e "s|%package_name%|@package_name@|g" \ -e "s|%version%|@version@|g" \ -e "s|%couchdb_command_name%|$(couchdb_command_name)|g" > \ $@ < $< chmod +x $@ # 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: apache-couchdb-1.6.0/THANKS0000644000175000001440000001461312332105522015236 0ustar00djcusers00000000000000Apache CouchDB THANKS ===================== A number of people have contributed to Apache CouchDB by reporting problems, suggesting improvements or submitting changes. Some of these people are: * William Beh * Dirk Schalge * Roger Leigh * Sam Ruby * Carlos Valiente * Till Klampaeckel * Jim Lindley * Yoan Blanc * Michael Gottesman * Mark Baran * Michael Hendricks * Antony Blakey * Paul Carey * Hunter Morris * Brian Palmer * Maximillian Dornseif * Eric Casteleijn * Maarten Thibaut * Florian Ebeling * Volker Mische * Brian Candler * Brad Anderson * Nick Gerakines * Kevin Ilchmann JĆørgensen * Sebastian Cohnen * Sven Helmberger * Dan Walters * Curt Arnold * Gustavo Niemeyer * Joshua Bronson * Kostis Sagonas * Matthew Hooker * Ilia Cheishvili * Lena Herrmann * Jack Moffit * Damjan Georgievski * Jan Kassens * James Marca * Matt Goodall * Joel Clark * Matt Lyon * mikeal * Joscha Feth * Jarrod Roberson * Jae Kwon * Gavin Sherry * Timothy Smith * Martin Haaß * Hans Ulrich Niedermann * Dmitry Unkovsky * Zachary Zolton * Brian Jenkins * Paul Bonser * Caleb Land * Juhani RƤnkimies * Kev Jackson * Jonathan D. Knezek * David Rose * Lim Yue Chuan * David Davis * Juuso VƤƤnƤnen * Jeff Zellner * Gabriel Farrell * Mike Leddy * Wayne Conrad * Thomas Vander Stichele * Felix Hummel * Tim Smith * Dipesh Patel * Sam Bisbee * Nathan Vander Wilt * Caolan McMahon * Andrey Somov * Chris Coulson * Trond Norbye * Christopher Bonhage * Christian Carter * Lukasz Mielicki * Omar Yasin * Simon Leblanc * Rogutės Sparnuotos * Gavin McDonald * Fedor Indutny * Tim Blair * Tady Walsh * Sam Rijs * Adam Kocoloski * Adam Lofts * Alexander Dorofeev * Alexander Shorin * Andrey Somov * Andy Wenk * Anthony Ananich * Anthony S Baker * Ben Reser * Ben Russell * Benjamin Nortier 27 BigBlueHat * Bob Dionne * Bob Ippolito * Caleb Case * Christian Hogan * Christopher Bonhage * Dale Harvey * Damjan Georgievski 23 Dirkjan Ochtman * Dustin Sallings * Ewan McDougall * Fedor Indutny * Filippo Fadda 185 Garren Smith * Jakub * Jason Smith (work) * Jason Smith (work) * Jason Smith (work) * Jens Rantil * Joel Reed * Johannes J. Schmidt * Julian Duque * Keith Gable * Keks Keksov * Klaus Trainer * Kyle Snavely * Magnus Hoff * Mariano Guerra * Martin Higham * Michael Jackson * Michael Rhodes * Michael Wallace * Michael Wheeler * Mike McKay * Mike Wallace * NickNorth * Noah Slater * Paul J. Davis * Paul Mietz Egli * Peter Lemenkov 34 Robert Kowalski * Robert Newson * Robin Berjon * Ronny Pfannschmidt 94 Russell Branca * Ryan Ramage 78 Simon Metson 10 Simon Metson * Sriram Melkote * Stefan Kƶgl * Sven Lito * Volker Mische * Wei Cao * Wendall Cada * Will Holley * dileepbapat * karlin * nvdev * sean barclay 76 suelockwood * telis94 For a list of authors see the `AUTHORS` file. apache-couchdb-1.6.0/configure0000755000175000001440000243510112332105555016241 0ustar00djcusers00000000000000#! /bin/sh # From configure.ac 1.6.0. # Guess values for system-dependent variables and create Makefiles. # Generated by GNU Autoconf 2.69 for Apache CouchDB 1.6.0. # # Report bugs to . # # # 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 and https://issues.apache.org/jira/browse/COUCHDB $0: about your system, including any error possibly output $0: before this message. Then install a modern shell, or $0: manually run the script under such a shell if you do $0: 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='Apache CouchDB' PACKAGE_TARNAME='apache-couchdb' PACKAGE_VERSION='1.6.0' PACKAGE_STRING='Apache CouchDB 1.6.0' PACKAGE_BUGREPORT='https://issues.apache.org/jira/browse/COUCHDB' PACKAGE_URL='' # 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 abs_top_builddir abs_top_srcdir localerlanglibdir locallibbindir erlangbin erlangversion localstaterundir localstatelogdir localstatelibdir locallibdir localdocdir localdatadir localconfdir bug_uri version_release version_stage version_revision version_minor version_major version package_name package_tarname package_identifier package_author_address package_author_name STRICTNESS_FALSE STRICTNESS_TRUE TESTS_FALSE TESTS_TRUE BUILD_HTML_FALSE BUILD_HTML_TRUE BUILD_PDF_FALSE BUILD_PDF_TRUE BUILD_INFO_FALSE BUILD_INFO_TRUE BUILD_MAN_FALSE BUILD_MAN_TRUE USE_CURL_FALSE USE_CURL_TRUE USE_NATIVE_MOCHIJSON_FALSE USE_NATIVE_MOCHIJSON_TRUE LAUNCHD_FALSE LAUNCHD_TRUE INIT_FALSE INIT_TRUE HAS_SPHINX_BUILD HAS_INSTALLINFO HAS_MAKEINFO HAS_PDFLATEX HAS_HELP2MAN launchddir initdir ERLC USE_EJSON_COMPARE_NIF_FALSE USE_EJSON_COMPARE_NIF_TRUE USE_OTP_NIFS_FALSE USE_OTP_NIFS_TRUE otp_release CURL_LIBS CURL_CFLAGS CURL_CONFIG ICU_BIN ICU_LIBS ICU_CXXFLAGS ICU_CFLAGS ICU_CPPFLAGS ICU_CONFIG msvc_redist_name msvc_redist_dir INNO_COMPILER_EXECUTABLE openssl_bin_dir JS_LIB_BINARY WINDOWS_FALSE WINDOWS_TRUE FLAGS ERLC_FLAGS JS_LIBS JS_CFLAGS ERLANG_FLAGS ESCRIPT ERL SNAPPY_PATCHLEVEL SNAPPY_MINOR SNAPPY_MAJOR ac_cv_have_stddef_h ac_cv_have_stdint_h CXXCPP am__fastdepCXX_FALSE am__fastdepCXX_TRUE CXXDEPMODE ac_ct_CXX CXXFLAGS CXX PKG_CONFIG_LIBDIR PKG_CONFIG_PATH PKG_CONFIG OTOOL64 OTOOL LIPO NMEDIT DSYMUTIL MANIFEST_TOOL RANLIB ac_ct_AR AR LN_S NM ac_ct_DUMPBIN DUMPBIN LD FGREP SED host_os host_vendor host_cpu host build_os build_vendor build_cpu build LIBTOOL OBJDUMP DLLTOOL AS 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 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 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 enable_dependency_tracking enable_shared enable_static with_pic enable_fast_install with_gnu_ld with_sysroot enable_libtool_lock with_erlang with_js_include with_js_lib enable_js_trunk with_openssl_bin_dir with_msvc_redist_dir with_win32_icu_binaries with_win32_curl with_curl_prefix with_curl_exec_prefix enable_init enable_launchd enable_native_mochijson enable_tests enable_docs enable_strictness ' ac_precious_vars='build_alias host_alias target_alias CC CFLAGS LDFLAGS LIBS CPPFLAGS CPP PKG_CONFIG PKG_CONFIG_PATH PKG_CONFIG_LIBDIR CXX CXXFLAGS CCC CXXCPP JS_CFLAGS JS_LIBS ERLC_FLAGS FLAGS CURL_CONFIG CURL_CFLAGS CURL_LIBS ERL ERLC' # 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_TARNAME}' infodir='${datarootdir}/info' htmldir='${docdir}' dvidir='${docdir}' pdfdir='${docdir}' psdir='${docdir}' libdir='${exec_prefix}/lib' localedir='${datarootdir}/locale' mandir='${datarootdir}/man' ac_prev= ac_dashdash= for ac_option do # If the previous option needs an argument, assign it. if test -n "$ac_prev"; then eval $ac_prev=\$ac_option ac_prev= continue fi case $ac_option in *=?*) ac_optarg=`expr "X$ac_option" : '[^=]*=\(.*\)'` ;; *=) ac_optarg= ;; *) 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 Apache CouchDB 1.6.0 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/apache-couchdb] --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 case $ac_init_help in short | recursive ) echo "Configuration of Apache CouchDB 1.6.0:";; esac 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] --disable-dependency-tracking speeds up one-time build --enable-dependency-tracking do not reject slow dependency extractors --enable-shared[=PKGS] build shared libraries [default=yes] --enable-static[=PKGS] build static libraries [default=no] --enable-fast-install[=PKGS] optimize for fast installation [default=yes] --disable-libtool-lock avoid locking (might break parallel builds) --enable-js-trunk allow use of SpiderMonkey versions newer than js185-1.0.0 --disable-init don't install init script where applicable --disable-launchd don't install launchd configuration where applicable --enable-native-mochijson compile mochijson to native code (EXPERIMENTAL) --disable-tests skip tests during build --disable-docs skip docs during build --enable-strictness exit when optional checks fail Optional Packages: --with-PACKAGE[=ARG] use PACKAGE [ARG=yes] --without-PACKAGE do not use PACKAGE (same as --with-PACKAGE=no) --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-erlang=PATH set PATH to the Erlang include directory --with-js-include=PATH set PATH to the SpiderMonkey include directory --with-js-lib=PATH set PATH to the SpiderMonkey library directory --with-openssl-bin-dir=PATH path to the open ssl binaries for distribution on Windows --with-msvc-redist-dir=PATH path to the msvc redistributables for the Windows platform --with-win32-icu-binaries=PATH set PATH to the Win32 native ICU binaries directory --with-win32-curl=PATH set PATH to the Win32 native curl directory --with-curl-prefix=PREFIX Prefix where curl is installed (optional) --with-curl-exec-prefix=EPREFIX Exec prefix where curl is installed (optional) 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 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 CXX C++ compiler command CXXFLAGS C++ compiler flags CXXCPP C++ preprocessor JS_CFLAGS C compiler flags for JS, overriding pkg-config JS_LIBS linker flags for JS, overriding pkg-config ERLC_FLAGS general flags to prepend to ERLC_FLAGS FLAGS general flags to prepend to LDFLAGS and CPPFLAGS CURL_CONFIG config script used for curl CURL_CFLAGS CFLAGS used for curl CURL_LIBS LIBS used for curl ERL path to the `erl' executable ERLC path to the `erlc' executable 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 . _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 Apache CouchDB configure 1.6.0 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;} ( $as_echo "## ------------------------------------------------------------ ## ## Report this to https://issues.apache.org/jira/browse/COUCHDB ## ## ------------------------------------------------------------ ##" ) | sed "s/^/$as_me: WARNING: /" >&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_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_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_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_cxx_try_run LINENO # ------------------------ # Try to link conftest.$ac_ext, and return whether this succeeded. Assumes # that executables *can* be run. ac_fn_cxx_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_cxx_try_run # ac_fn_cxx_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_cxx_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_cxx_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_cxx_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_cxx_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;} ( $as_echo "## ------------------------------------------------------------ ## ## Report this to https://issues.apache.org/jira/browse/COUCHDB ## ## ------------------------------------------------------------ ##" ) | sed "s/^/$as_me: WARNING: /" >&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_cxx_check_header_mongrel # ac_fn_cxx_check_func LINENO FUNC VAR # ------------------------------------ # Tests whether FUNC exists, setting the cache variable VAR accordingly ac_fn_cxx_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_cxx_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_cxx_check_func # ac_fn_cxx_check_type LINENO TYPE VAR INCLUDES # --------------------------------------------- # Tests whether TYPE exists after having included INCLUDES, setting cache # variable VAR accordingly. ac_fn_cxx_check_type () { 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 eval "$3=no" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ $4 int main () { if (sizeof ($2)) return 0; ; return 0; } _ACEOF if ac_fn_cxx_try_compile "$LINENO"; then : cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ $4 int main () { if (sizeof (($2))) return 0; ; return 0; } _ACEOF if ac_fn_cxx_try_compile "$LINENO"; then : else eval "$3=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 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_cxx_check_type 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 Apache CouchDB $as_me 1.6.0, 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 build-aux "$srcdir"/build-aux; 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 build-aux \"$srcdir\"/build-aux" "$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. ac_config_headers="$ac_config_headers config.h" ac_config_headers="$ac_config_headers src/snappy/google-snappy/config.h" am__api_version='1.11' # 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; } # Just in case sleep 1 echo timestamp > conftest.file # 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 ( set X `ls -Lt "$srcdir/configure" conftest.file 2> /dev/null` if test "$*" = "X"; then # -L didn't work. set X `ls -t "$srcdir/configure" conftest.file` fi rm -f conftest.file if test "$*" != "X $srcdir/configure conftest.file" \ && test "$*" != "X conftest.file $srcdir/configure"; then # If neither matched, then we have a broken ls. This can happen # if, for instance, CONFIG_SHELL is bash and it inherits a # broken ls alias from the environment. This has actually # happened. Such a system could not be considered "sane". as_fn_error $? "ls -t appears to fail. Make sure there is not a broken alias in your environment" "$LINENO" 5 fi 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; } 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 --run true"; then am_missing_run="$MISSING --run " 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; } mkdir_p="$MKDIR_P" case $mkdir_p in [\\/$]* | ?:[\\/]*) ;; */*) mkdir_p="\$(top_builddir)/$mkdir_p" ;; esac 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 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='apache-couchdb' VERSION='1.6.0' 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"} # 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}' { $as_echo "$as_me:${as_lineno-$LINENO}: checking how to create a ustar tar archive" >&5 $as_echo_n "checking how to create a ustar tar archive... " >&6; } # Loop over all known methods to create a tar archive until one works. _am_tools='gnutar plaintar pax cpio none' _am_tools=${am_cv_prog_tar_ustar-$_am_tools} # Do not fold the above two line into one, because Tru64 sh and # Solaris sh will not grok spaces in the rhs of `-'. for _am_tool in $_am_tools do case $_am_tool in gnutar) for _am_tar in tar gnutar gtar; do { echo "$as_me:$LINENO: $_am_tar --version" >&5 ($_am_tar --version) >&5 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } && break done am__tar="$_am_tar --format=ustar -chf - "'"$$tardir"' am__tar_="$_am_tar --format=ustar -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 ustar -w "$$tardir"' am__tar_='pax -L -x ustar -w "$tardir"' am__untar='pax -r' ;; cpio) am__tar='find "$$tardir" -print | cpio -o -H ustar -L' am__tar_='find "$tardir" -print | cpio -o -H ustar -L' am__untar='cpio -i -H ustar -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_ustar}" && break # tar/untar a dummy directory, and stop if the command works rm -rf conftest.dir mkdir conftest.dir echo GrepMe > conftest.dir/file { echo "$as_me:$LINENO: tardir=conftest.dir && eval $am__tar_ >conftest.tar" >&5 (tardir=conftest.dir && eval $am__tar_ >conftest.tar) >&5 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } rm -rf conftest.dir if test -s conftest.tar; then { echo "$as_me:$LINENO: $am__untar &5 ($am__untar &5 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } grep GrepMe conftest.dir/file >/dev/null 2>&1 && break fi done rm -rf conftest.dir if ${am_cv_prog_tar_ustar+:} false; then : $as_echo_n "(cached) " >&6 else am_cv_prog_tar_ustar=$_am_tool fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $am_cv_prog_tar_ustar" >&5 $as_echo "$am_cv_prog_tar_ustar" >&6; } 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 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 8's {/usr,}/bin/sh. touch 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 # 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 # 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 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 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 8's {/usr,}/bin/sh. touch 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 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" # 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 # 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"; 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 ;; gnu*) lt_cv_deplibs_check_method=pass_all ;; 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) lt_cv_deplibs_check_method=pass_all ;; netbsd*) 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*|ppc*-*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*) LD="${LD-ld} -m elf_i386" ;; ppc64-*linux*|powerpc64-*linux*) 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" ;; ppc*-*linux*|powerpc*-*linux*) 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 # Set options 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 enable_dlopen=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) 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 ;; 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*) 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 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*) 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 # Handle Gentoo/FreeBSD as it was Linux case $host_vendor in gentoo) version_type=linux ;; *) version_type=freebsd-$objformat ;; esac 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 ;; linux) library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major ${libname}${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' need_lib_prefix=no need_version=no ;; 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 ;; 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' shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=no hardcode_into_libs=yes ;; 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) 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' ;; 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" ac_config_commands="$ac_config_commands libtool" # Only expand once: { $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 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 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 8's {/usr,}/bin/sh. touch 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 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 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 ;; gnu*) ;; 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) 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) 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*) ;; *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 ;; *) 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 # Handle Gentoo/FreeBSD as it was Linux case $host_vendor in gentoo) version_type=linux ;; *) version_type=freebsd-$objformat ;; esac 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 ;; linux) library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major ${libname}${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' need_lib_prefix=no need_version=no ;; 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 ;; 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' shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=no hardcode_into_libs=yes ;; 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) 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' ;; 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_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 cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { ; return 0; } _ACEOF if ac_fn_cxx_try_link "$LINENO"; then : else as_fn_error $? "A C++ compiler is required." "$LINENO" 5 fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether byte ordering is bigendian" >&5 $as_echo_n "checking whether byte ordering is bigendian... " >&6; } if ${ac_cv_c_bigendian+:} false; then : $as_echo_n "(cached) " >&6 else ac_cv_c_bigendian=unknown # See if we're dealing with a universal compiler. cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #ifndef __APPLE_CC__ not a universal capable compiler #endif typedef int dummy; _ACEOF if ac_fn_cxx_try_compile "$LINENO"; then : # Check for potential -arch flags. It is not universal unless # there are at least two -arch flags with different values. ac_arch= ac_prev= for ac_word in $CC $CFLAGS $CPPFLAGS $LDFLAGS; do if test -n "$ac_prev"; then case $ac_word in i?86 | x86_64 | ppc | ppc64) if test -z "$ac_arch" || test "$ac_arch" = "$ac_word"; then ac_arch=$ac_word else ac_cv_c_bigendian=universal break fi ;; esac ac_prev= elif test "x$ac_word" = "x-arch"; then ac_prev=arch fi done fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext if test $ac_cv_c_bigendian = unknown; then # See if sys/param.h defines the BYTE_ORDER macro. cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include #include int main () { #if ! (defined BYTE_ORDER && defined BIG_ENDIAN \ && defined LITTLE_ENDIAN && BYTE_ORDER && BIG_ENDIAN \ && LITTLE_ENDIAN) bogus endian macros #endif ; return 0; } _ACEOF if ac_fn_cxx_try_compile "$LINENO"; then : # It does; now see whether it defined to BIG_ENDIAN or not. cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include #include int main () { #if BYTE_ORDER != BIG_ENDIAN not big endian #endif ; return 0; } _ACEOF if ac_fn_cxx_try_compile "$LINENO"; then : ac_cv_c_bigendian=yes else ac_cv_c_bigendian=no fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi if test $ac_cv_c_bigendian = unknown; then # See if defines _LITTLE_ENDIAN or _BIG_ENDIAN (e.g., Solaris). cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include int main () { #if ! (defined _LITTLE_ENDIAN || defined _BIG_ENDIAN) bogus endian macros #endif ; return 0; } _ACEOF if ac_fn_cxx_try_compile "$LINENO"; then : # It does; now see whether it defined to _BIG_ENDIAN or not. cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include int main () { #ifndef _BIG_ENDIAN not big endian #endif ; return 0; } _ACEOF if ac_fn_cxx_try_compile "$LINENO"; then : ac_cv_c_bigendian=yes else ac_cv_c_bigendian=no fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi if test $ac_cv_c_bigendian = unknown; then # Compile a test program. if test "$cross_compiling" = yes; then : # Try to guess by grepping values from an object file. cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ short int ascii_mm[] = { 0x4249, 0x4765, 0x6E44, 0x6961, 0x6E53, 0x7953, 0 }; short int ascii_ii[] = { 0x694C, 0x5454, 0x656C, 0x6E45, 0x6944, 0x6E61, 0 }; int use_ascii (int i) { return ascii_mm[i] + ascii_ii[i]; } short int ebcdic_ii[] = { 0x89D3, 0xE3E3, 0x8593, 0x95C5, 0x89C4, 0x9581, 0 }; short int ebcdic_mm[] = { 0xC2C9, 0xC785, 0x95C4, 0x8981, 0x95E2, 0xA8E2, 0 }; int use_ebcdic (int i) { return ebcdic_mm[i] + ebcdic_ii[i]; } extern int foo; int main () { return use_ascii (foo) == use_ebcdic (foo); ; return 0; } _ACEOF if ac_fn_cxx_try_compile "$LINENO"; then : if grep BIGenDianSyS conftest.$ac_objext >/dev/null; then ac_cv_c_bigendian=yes fi if grep LiTTleEnDian conftest.$ac_objext >/dev/null ; then if test "$ac_cv_c_bigendian" = unknown; then ac_cv_c_bigendian=no else # finding both strings is unlikely to happen, but who knows? ac_cv_c_bigendian=unknown fi fi fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ $ac_includes_default int main () { /* Are we little or big endian? From Harbison&Steele. */ union { long int l; char c[sizeof (long int)]; } u; u.l = 1; return u.c[sizeof (long int) - 1] == 1; ; return 0; } _ACEOF if ac_fn_cxx_try_run "$LINENO"; then : ac_cv_c_bigendian=no else ac_cv_c_bigendian=yes 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_c_bigendian" >&5 $as_echo "$ac_cv_c_bigendian" >&6; } case $ac_cv_c_bigendian in #( yes) $as_echo "#define WORDS_BIGENDIAN 1" >>confdefs.h ;; #( no) ;; #( universal) $as_echo "#define AC_APPLE_UNIVERSAL_BUILD 1" >>confdefs.h ;; #( *) as_fn_error $? "unknown endianness presetting ac_cv_c_bigendian=no (or yes) will help" "$LINENO" 5 ;; esac for ac_header in stdint.h stddef.h sys/mman.h sys/resource.h do : as_ac_Header=`$as_echo "ac_cv_header_$ac_header" | $as_tr_sh` ac_fn_cxx_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_cxx_check_func "$LINENO" "mmap" "ac_cv_func_mmap" if test "x$ac_cv_func_mmap" = xyes; then : fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking if the compiler supports __builtin_expect" >&5 $as_echo_n "checking if the compiler supports __builtin_expect... " >&6; } cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { return __builtin_expect(1, 1) ? 1 : 0 ; return 0; } _ACEOF if ac_fn_cxx_try_compile "$LINENO"; then : snappy_have_builtin_expect=yes { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 $as_echo "yes" >&6; } else snappy_have_builtin_expect=no { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext if test x$snappy_have_builtin_expect = xyes ; then $as_echo "#define HAVE_BUILTIN_EXPECT 1" >>confdefs.h fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking if the compiler supports __builtin_ctzll" >&5 $as_echo_n "checking if the compiler supports __builtin_ctzll... " >&6; } cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { return (__builtin_ctzll(0x100000000LL) == 32) ? 1 : 0 ; return 0; } _ACEOF if ac_fn_cxx_try_compile "$LINENO"; then : snappy_have_builtin_ctz=yes { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 $as_echo "yes" >&6; } else snappy_have_builtin_ctz=no { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext if test x$snappy_have_builtin_ctz = xyes ; then $as_echo "#define HAVE_BUILTIN_CTZ 1" >>confdefs.h fi if test "$ac_cv_header_stdint_h" = "yes"; then ac_cv_have_stdint_h=1 else ac_cv_have_stdint_h=0 fi if test "$ac_cv_header_stddef_h" = "yes"; then ac_cv_have_stddef_h=1 else ac_cv_have_stddef_h=0 fi SNAPPY_MAJOR="1" SNAPPY_MINOR="0" SNAPPY_PATCHLEVEL="5" { $as_echo "$as_me:${as_lineno-$LINENO}: checking for pthread_create in -lpthread" >&5 $as_echo_n "checking for pthread_create in -lpthread... " >&6; } original_LIBS="$LIBS" LIBS="-lpthread $original_LIBS" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include int main () { pthread_create((void *)0, (void *)0, (void *)0, (void *)0) ; return 0; } _ACEOF if ac_fn_cxx_try_link "$LINENO"; then : pthread=yes else pthread=no fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext if test x${pthread} = xyes; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 $as_echo "yes" >&6; } else LIBS="$original_LIBS" { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi # Extract the first word of "erl", so it can be a program name with args. set dummy erl; 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_ERL+:} false; then : $as_echo_n "(cached) " >&6 else case $ERL in [\\/]* | ?:[\\/]*) ac_cv_path_ERL="$ERL" # 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_ERL="$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 ERL=$ac_cv_path_ERL if test -n "$ERL"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ERL" >&5 $as_echo "$ERL" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi # Extract the first word of "escript", so it can be a program name with args. set dummy escript; 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_ESCRIPT+:} false; then : $as_echo_n "(cached) " >&6 else case $ESCRIPT in [\\/]* | ?:[\\/]*) ac_cv_path_ESCRIPT="$ESCRIPT" # 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_ESCRIPT="$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 ESCRIPT=$ac_cv_path_ESCRIPT if test -n "$ESCRIPT"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ESCRIPT" >&5 $as_echo "$ESCRIPT" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi if test x${ERL} = x; then : as_fn_error $? "Could not find the \`erl' executable. Is Erlang installed?" "$LINENO" 5 fi # Check whether --with-erlang was given. if test "${with_erlang+set}" = set; then : withval=$with_erlang; ERLANG_FLAGS="-I$withval" else realerl=`readlink -f $ERL 2>/dev/null` if test $? -eq 0; then : erlbase=`dirname $realerl` erlbase=`dirname $erlbase` ERLANG_FLAGS="-I${erlbase}/usr/include" else # Failed to figure out where erl is installed.. # try to add some default directories to search ERLANG_FLAGS="-I${libdir}/erlang/usr/include" ERLANG_FLAGS="$ERLANG_FLAGS -I/usr/lib/erlang/usr/include" ERLANG_FLAGS="$ERLANG_FLAGS -I/usr/local/lib/erlang/usr/include" ERLANG_FLAGS="$ERLANG_FLAGS -I/opt/local/lib/erlang/usr/include" fi fi pkg_failed=no { $as_echo "$as_me:${as_lineno-$LINENO}: checking for JS" >&5 $as_echo_n "checking for JS... " >&6; } if test -n "$JS_CFLAGS"; then pkg_cv_JS_CFLAGS="$JS_CFLAGS" elif test -n "$PKG_CONFIG"; then if test -n "$PKG_CONFIG" && \ { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"mozjs185\""; } >&5 ($PKG_CONFIG --exists --print-errors "mozjs185") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then pkg_cv_JS_CFLAGS=`$PKG_CONFIG --cflags "mozjs185" 2>/dev/null` test "x$?" != "x0" && pkg_failed=yes else pkg_failed=yes fi else pkg_failed=untried fi if test -n "$JS_LIBS"; then pkg_cv_JS_LIBS="$JS_LIBS" elif test -n "$PKG_CONFIG"; then if test -n "$PKG_CONFIG" && \ { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"mozjs185\""; } >&5 ($PKG_CONFIG --exists --print-errors "mozjs185") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then pkg_cv_JS_LIBS=`$PKG_CONFIG --libs "mozjs185" 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 JS_PKG_ERRORS=`$PKG_CONFIG --short-errors --print-errors --cflags --libs "mozjs185" 2>&1` else JS_PKG_ERRORS=`$PKG_CONFIG --print-errors --cflags --libs "mozjs185" 2>&1` fi # Put the nasty error message in config.log where it belongs echo "$JS_PKG_ERRORS" >&5 pkg_failed=no { $as_echo "$as_me:${as_lineno-$LINENO}: checking for JS" >&5 $as_echo_n "checking for JS... " >&6; } if test -n "$JS_CFLAGS"; then pkg_cv_JS_CFLAGS="$JS_CFLAGS" elif test -n "$PKG_CONFIG"; then if test -n "$PKG_CONFIG" && \ { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"mozilla-js >= 1.7\""; } >&5 ($PKG_CONFIG --exists --print-errors "mozilla-js >= 1.7") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then pkg_cv_JS_CFLAGS=`$PKG_CONFIG --cflags "mozilla-js >= 1.7" 2>/dev/null` test "x$?" != "x0" && pkg_failed=yes else pkg_failed=yes fi else pkg_failed=untried fi if test -n "$JS_LIBS"; then pkg_cv_JS_LIBS="$JS_LIBS" elif test -n "$PKG_CONFIG"; then if test -n "$PKG_CONFIG" && \ { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"mozilla-js >= 1.7\""; } >&5 ($PKG_CONFIG --exists --print-errors "mozilla-js >= 1.7") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then pkg_cv_JS_LIBS=`$PKG_CONFIG --libs "mozilla-js >= 1.7" 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 JS_PKG_ERRORS=`$PKG_CONFIG --short-errors --print-errors --cflags --libs "mozilla-js >= 1.7" 2>&1` else JS_PKG_ERRORS=`$PKG_CONFIG --print-errors --cflags --libs "mozilla-js >= 1.7" 2>&1` fi # Put the nasty error message in config.log where it belongs echo "$JS_PKG_ERRORS" >&5 JS_LIB_DIR="${libdir}" JS_CFLAGS="-I/usr/include" JS_CFLAGS="$JS_CFLAGS -I/usr/include/js" JS_CFLAGS="$JS_CFLAGS -I/usr/include/mozjs" JS_CFLAGS="$JS_CFLAGS -I/usr/local/include/js" JS_CFLAGS="$JS_CFLAGS -I/opt/local/include/js" elif test $pkg_failed = untried; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } JS_LIB_DIR="${libdir}" JS_CFLAGS="-I/usr/include" JS_CFLAGS="$JS_CFLAGS -I/usr/include/js" JS_CFLAGS="$JS_CFLAGS -I/usr/include/mozjs" JS_CFLAGS="$JS_CFLAGS -I/usr/local/include/js" JS_CFLAGS="$JS_CFLAGS -I/opt/local/include/js" else JS_CFLAGS=$pkg_cv_JS_CFLAGS JS_LIBS=$pkg_cv_JS_LIBS { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 $as_echo "yes" >&6; } JS_LIB_DIR="$(${PKG_CONFIG} --variable=sdkdir mozilla-js)/lib" fi elif test $pkg_failed = untried; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } pkg_failed=no { $as_echo "$as_me:${as_lineno-$LINENO}: checking for JS" >&5 $as_echo_n "checking for JS... " >&6; } if test -n "$JS_CFLAGS"; then pkg_cv_JS_CFLAGS="$JS_CFLAGS" elif test -n "$PKG_CONFIG"; then if test -n "$PKG_CONFIG" && \ { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"mozilla-js >= 1.7\""; } >&5 ($PKG_CONFIG --exists --print-errors "mozilla-js >= 1.7") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then pkg_cv_JS_CFLAGS=`$PKG_CONFIG --cflags "mozilla-js >= 1.7" 2>/dev/null` test "x$?" != "x0" && pkg_failed=yes else pkg_failed=yes fi else pkg_failed=untried fi if test -n "$JS_LIBS"; then pkg_cv_JS_LIBS="$JS_LIBS" elif test -n "$PKG_CONFIG"; then if test -n "$PKG_CONFIG" && \ { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"mozilla-js >= 1.7\""; } >&5 ($PKG_CONFIG --exists --print-errors "mozilla-js >= 1.7") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then pkg_cv_JS_LIBS=`$PKG_CONFIG --libs "mozilla-js >= 1.7" 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 JS_PKG_ERRORS=`$PKG_CONFIG --short-errors --print-errors --cflags --libs "mozilla-js >= 1.7" 2>&1` else JS_PKG_ERRORS=`$PKG_CONFIG --print-errors --cflags --libs "mozilla-js >= 1.7" 2>&1` fi # Put the nasty error message in config.log where it belongs echo "$JS_PKG_ERRORS" >&5 JS_LIB_DIR="${libdir}" JS_CFLAGS="-I/usr/include" JS_CFLAGS="$JS_CFLAGS -I/usr/include/js" JS_CFLAGS="$JS_CFLAGS -I/usr/include/mozjs" JS_CFLAGS="$JS_CFLAGS -I/usr/local/include/js" JS_CFLAGS="$JS_CFLAGS -I/opt/local/include/js" elif test $pkg_failed = untried; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } JS_LIB_DIR="${libdir}" JS_CFLAGS="-I/usr/include" JS_CFLAGS="$JS_CFLAGS -I/usr/include/js" JS_CFLAGS="$JS_CFLAGS -I/usr/include/mozjs" JS_CFLAGS="$JS_CFLAGS -I/usr/local/include/js" JS_CFLAGS="$JS_CFLAGS -I/opt/local/include/js" else JS_CFLAGS=$pkg_cv_JS_CFLAGS JS_LIBS=$pkg_cv_JS_LIBS { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 $as_echo "yes" >&6; } JS_LIB_DIR="$(${PKG_CONFIG} --variable=sdkdir mozilla-js)/lib" fi else JS_CFLAGS=$pkg_cv_JS_CFLAGS JS_LIBS=$pkg_cv_JS_LIBS { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 $as_echo "yes" >&6; } JS_LIB_DIR="$(${PKG_CONFIG} --variable=libdir mozjs185)" fi # Check whether --with-js-include was given. if test "${with_js_include+set}" = set; then : withval=$with_js_include; JS_INCLUDE="$withval" JS_CFLAGS="-I$JS_INCLUDE" fi # Check whether --with-js-lib was given. if test "${with_js_lib+set}" = set; then : withval=$with_js_lib; JS_LIB_DIR=$withval JS_LIBS="-L$withval" fi use_js_trunk=no # Check whether --enable-js-trunk was given. if test "${enable_js_trunk+set}" = set; then : enableval=$enable_js_trunk; use_js_trunk=$enableval fi case $(uname -s) in #( CYGWIN*) : ;; #( *) : CPPFLAGS="$CPPFLAGS -I/opt/local/include" CPPFLAGS="$CPPFLAGS -I/opt/local/include/js" CPPFLAGS="$CPPFLAGS -I/usr/local/include" CPPFLAGS="$CPPFLAGS -I/usr/local/include/js" CPPFLAGS="$CPPFLAGS -I/usr/include" CPPFLAGS="$CPPFLAGS -I/usr/include/js" LDFLAGS="$LDFLAGS -L/opt/local/lib" LDFLAGS="$LDFLAGS -L/usr/local/lib" ;; #( *) : ;; esac CPPFLAGS="$CPPFLAGS $FLAGS" LDFLAGS="$LDFLAGS $FLAGS" # The erlang cc.sh/ld.sh scripts will convert a -O option # into the same optimization flags erlang itself uses. CFLAGS="-O2 $CFLAGS" LIBS="$LIBS $LDFLAGS" case $(uname -s) in #( CYGWIN*) : JS_CFLAGS="-DXP_WIN $JS_CFLAGS" IS_WINDOWS="TRUE" ;; #( *) : # XP_UNIX required for jsapi.h, tested on Linux and Darwin. JS_CFLAGS="-DXP_UNIX $JS_CFLAGS" ;; #( *) : ;; esac if test x$IS_WINDOWS = xTRUE; then WINDOWS_TRUE= WINDOWS_FALSE='#' else WINDOWS_TRUE='#' WINDOWS_FALSE= fi OLD_LIBS="$LIBS" LIBS="$JS_LIBS $LIBS" OLD_CPPFLAGS="$CPPFLAGS" CPPFLAGS="$JS_CFLAGS $CPPFLAGS" ac_fn_cxx_check_header_mongrel "$LINENO" "jsapi.h" "ac_cv_header_jsapi_h" "$ac_includes_default" if test "x$ac_cv_header_jsapi_h" = xyes; then : else ac_fn_cxx_check_header_mongrel "$LINENO" "js/jsapi.h" "ac_cv_header_js_jsapi_h" "$ac_includes_default" if test "x$ac_cv_header_js_jsapi_h" = xyes; then : CPPFLAGS="$CPPFLAGS -I$JS_INCLUDE/js" else as_fn_error $? "Could not find the jsapi header. Are the Mozilla SpiderMonkey headers installed?" "$LINENO" 5 fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking for JS_NewContext in -lmozjs185" >&5 $as_echo_n "checking for JS_NewContext in -lmozjs185... " >&6; } if ${ac_cv_lib_mozjs185_JS_NewContext+:} false; then : $as_echo_n "(cached) " >&6 else ac_check_lib_save_LIBS=$LIBS LIBS="-lmozjs185 $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 JS_NewContext (); int main () { return JS_NewContext (); ; return 0; } _ACEOF if ac_fn_cxx_try_link "$LINENO"; then : ac_cv_lib_mozjs185_JS_NewContext=yes else ac_cv_lib_mozjs185_JS_NewContext=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_mozjs185_JS_NewContext" >&5 $as_echo "$ac_cv_lib_mozjs185_JS_NewContext" >&6; } if test "x$ac_cv_lib_mozjs185_JS_NewContext" = xyes; then : JS_LIB_BASE=mozjs185 else { $as_echo "$as_me:${as_lineno-$LINENO}: checking for JS_NewContext in -lmozjs185-1.0" >&5 $as_echo_n "checking for JS_NewContext in -lmozjs185-1.0... " >&6; } if ${ac_cv_lib_mozjs185_1_0_JS_NewContext+:} false; then : $as_echo_n "(cached) " >&6 else ac_check_lib_save_LIBS=$LIBS LIBS="-lmozjs185-1.0 $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 JS_NewContext (); int main () { return JS_NewContext (); ; return 0; } _ACEOF if ac_fn_cxx_try_link "$LINENO"; then : ac_cv_lib_mozjs185_1_0_JS_NewContext=yes else ac_cv_lib_mozjs185_1_0_JS_NewContext=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_mozjs185_1_0_JS_NewContext" >&5 $as_echo "$ac_cv_lib_mozjs185_1_0_JS_NewContext" >&6; } if test "x$ac_cv_lib_mozjs185_1_0_JS_NewContext" = xyes; then : JS_LIB_BASE=mozjs185-1.0 else { $as_echo "$as_me:${as_lineno-$LINENO}: checking for JS_NewContext in -lmozjs" >&5 $as_echo_n "checking for JS_NewContext in -lmozjs... " >&6; } if ${ac_cv_lib_mozjs_JS_NewContext+:} false; then : $as_echo_n "(cached) " >&6 else ac_check_lib_save_LIBS=$LIBS LIBS="-lmozjs $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 JS_NewContext (); int main () { return JS_NewContext (); ; return 0; } _ACEOF if ac_fn_cxx_try_link "$LINENO"; then : ac_cv_lib_mozjs_JS_NewContext=yes else ac_cv_lib_mozjs_JS_NewContext=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_mozjs_JS_NewContext" >&5 $as_echo "$ac_cv_lib_mozjs_JS_NewContext" >&6; } if test "x$ac_cv_lib_mozjs_JS_NewContext" = xyes; then : JS_LIB_BASE=mozjs else { $as_echo "$as_me:${as_lineno-$LINENO}: checking for JS_NewContext in -ljs" >&5 $as_echo_n "checking for JS_NewContext in -ljs... " >&6; } if ${ac_cv_lib_js_JS_NewContext+:} false; then : $as_echo_n "(cached) " >&6 else ac_check_lib_save_LIBS=$LIBS LIBS="-ljs $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 JS_NewContext (); int main () { return JS_NewContext (); ; return 0; } _ACEOF if ac_fn_cxx_try_link "$LINENO"; then : ac_cv_lib_js_JS_NewContext=yes else ac_cv_lib_js_JS_NewContext=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_js_JS_NewContext" >&5 $as_echo "$ac_cv_lib_js_JS_NewContext" >&6; } if test "x$ac_cv_lib_js_JS_NewContext" = xyes; then : JS_LIB_BASE=js else { $as_echo "$as_me:${as_lineno-$LINENO}: checking for JS_NewContext in -ljs3250" >&5 $as_echo_n "checking for JS_NewContext in -ljs3250... " >&6; } if ${ac_cv_lib_js3250_JS_NewContext+:} false; then : $as_echo_n "(cached) " >&6 else ac_check_lib_save_LIBS=$LIBS LIBS="-ljs3250 $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 JS_NewContext (); int main () { return JS_NewContext (); ; return 0; } _ACEOF if ac_fn_cxx_try_link "$LINENO"; then : ac_cv_lib_js3250_JS_NewContext=yes else ac_cv_lib_js3250_JS_NewContext=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_js3250_JS_NewContext" >&5 $as_echo "$ac_cv_lib_js3250_JS_NewContext" >&6; } if test "x$ac_cv_lib_js3250_JS_NewContext" = xyes; then : JS_LIB_BASE=js3250 else { $as_echo "$as_me:${as_lineno-$LINENO}: checking for JS_NewContext in -ljs32" >&5 $as_echo_n "checking for JS_NewContext in -ljs32... " >&6; } if ${ac_cv_lib_js32_JS_NewContext+:} false; then : $as_echo_n "(cached) " >&6 else ac_check_lib_save_LIBS=$LIBS LIBS="-ljs32 $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 JS_NewContext (); int main () { return JS_NewContext (); ; return 0; } _ACEOF if ac_fn_cxx_try_link "$LINENO"; then : ac_cv_lib_js32_JS_NewContext=yes else ac_cv_lib_js32_JS_NewContext=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_js32_JS_NewContext" >&5 $as_echo "$ac_cv_lib_js32_JS_NewContext" >&6; } if test "x$ac_cv_lib_js32_JS_NewContext" = xyes; then : JS_LIB_BASE=js32 else as_fn_error $? "Could not find the js library. Is the Mozilla SpiderMonkey library installed?" "$LINENO" 5 fi fi fi fi fi fi # Figure out what version of SpiderMonkey to use as_ac_Lib=`$as_echo "ac_cv_lib_$JS_LIB_BASE''_JS_NewCompartmentAndGlobalObject" | $as_tr_sh` { $as_echo "$as_me:${as_lineno-$LINENO}: checking for JS_NewCompartmentAndGlobalObject in -l$JS_LIB_BASE" >&5 $as_echo_n "checking for JS_NewCompartmentAndGlobalObject in -l$JS_LIB_BASE... " >&6; } if eval \${$as_ac_Lib+:} false; then : $as_echo_n "(cached) " >&6 else ac_check_lib_save_LIBS=$LIBS LIBS="-l$JS_LIB_BASE $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 JS_NewCompartmentAndGlobalObject (); int main () { return JS_NewCompartmentAndGlobalObject (); ; return 0; } _ACEOF if ac_fn_cxx_try_link "$LINENO"; then : eval "$as_ac_Lib=yes" else eval "$as_ac_Lib=no" fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext LIBS=$ac_check_lib_save_LIBS fi eval ac_res=\$$as_ac_Lib { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 $as_echo "$ac_res" >&6; } if eval test \"x\$"$as_ac_Lib"\" = x"yes"; then : # Prevent people from accidentally using SpiderMonkey's that are too new if test "$use_js_trunk" = "no"; then # ac_fn_cxx_check_decl LINENO SYMBOL VAR INCLUDES # ----------------------------------------------- # Tests whether SYMBOL is declared in INCLUDES, setting cache variable VAR # accordingly. ac_fn_cxx_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_cxx_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_cxx_check_decl ac_fn_cxx_check_decl "$LINENO" "JSOPTION_ANONFUNFIX" "ac_cv_have_decl_JSOPTION_ANONFUNFIX" " #include " if test "x$ac_cv_have_decl_JSOPTION_ANONFUNFIX" = xyes; then : else as_fn_error $? "Your SpiderMonkey library is too new. Versions of SpiderMonkey after the js185-1.0.0 release remove the optional enforcement of preventing anonymous functions in a statement context. This will most likely break your existing JavaScript code as well as render all example code invalid. If you wish to ignore this error pass --enable-js-trunk to ./configure." "$LINENO" 5 fi fi $as_echo "#define SM185 1" >>confdefs.h fi as_ac_Lib=`$as_echo "ac_cv_lib_$JS_LIB_BASE''_JS_ThrowStopIteration" | $as_tr_sh` { $as_echo "$as_me:${as_lineno-$LINENO}: checking for JS_ThrowStopIteration in -l$JS_LIB_BASE" >&5 $as_echo_n "checking for JS_ThrowStopIteration in -l$JS_LIB_BASE... " >&6; } if eval \${$as_ac_Lib+:} false; then : $as_echo_n "(cached) " >&6 else ac_check_lib_save_LIBS=$LIBS LIBS="-l$JS_LIB_BASE $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 JS_ThrowStopIteration (); int main () { return JS_ThrowStopIteration (); ; return 0; } _ACEOF if ac_fn_cxx_try_link "$LINENO"; then : eval "$as_ac_Lib=yes" else eval "$as_ac_Lib=no" fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext LIBS=$ac_check_lib_save_LIBS fi eval ac_res=\$$as_ac_Lib { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 $as_echo "$ac_res" >&6; } if eval test \"x\$"$as_ac_Lib"\" = x"yes"; then : $as_echo "#define SM180 1" >>confdefs.h fi as_ac_Lib=`$as_echo "ac_cv_lib_$JS_LIB_BASE''_JS_GetStringCharsAndLength" | $as_tr_sh` { $as_echo "$as_me:${as_lineno-$LINENO}: checking for JS_GetStringCharsAndLength in -l$JS_LIB_BASE" >&5 $as_echo_n "checking for JS_GetStringCharsAndLength in -l$JS_LIB_BASE... " >&6; } if eval \${$as_ac_Lib+:} false; then : $as_echo_n "(cached) " >&6 else ac_check_lib_save_LIBS=$LIBS LIBS="-l$JS_LIB_BASE $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 JS_GetStringCharsAndLength (); int main () { return JS_GetStringCharsAndLength (); ; return 0; } _ACEOF if ac_fn_cxx_try_link "$LINENO"; then : eval "$as_ac_Lib=yes" else eval "$as_ac_Lib=no" fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext LIBS=$ac_check_lib_save_LIBS fi eval ac_res=\$$as_ac_Lib { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 $as_echo "$ac_res" >&6; } if eval test \"x\$"$as_ac_Lib"\" = x"yes"; then : $as_echo "#define HAVE_JS_GET_STRING_CHARS_AND_LENGTH 1" >>confdefs.h fi # Else, hope that 1.7.0 works # Deal with JSScript to JSObject to JSScript switcheroo as_ac_Type=`$as_echo "ac_cv_type_JSScript*" | $as_tr_sh` ac_fn_cxx_check_type "$LINENO" "JSScript*" "$as_ac_Type" "#include " if eval test \"x\$"$as_ac_Type"\" = x"yes"; then : $as_echo "#define JSSCRIPT_TYPE JSScript*" >>confdefs.h else $as_echo "#define JSSCRIPT_TYPE JSObject*" >>confdefs.h fi $as_echo "#define COUCHJS_NAME \"couchjs\"" >>confdefs.h if test x${IS_WINDOWS} = xTRUE; then $as_echo "#define COUCHJS_NAME \"couchjs.exe\"" >>confdefs.h if test -f "$JS_LIB_DIR/$JS_LIB_BASE.dll"; then # seamonkey 1.7- build layout on Windows JS_LIB_BINARY="$JS_LIB_DIR/$JS_LIB_BASE.dll" else # seamonkey 1.8+ build layout on Windows if test -f "$JS_LIB_DIR/../bin/$JS_LIB_BASE.dll"; then JS_LIB_BINARY="$JS_LIB_DIR/../bin/$JS_LIB_BASE.dll" else as_fn_error $? "Could not find $JS_LIB_BASE.dll." "$LINENO" 5 fi fi # On windows we need to know the path to the openssl binaries. # Check whether --with-openssl-bin-dir was given. if test "${with_openssl_bin_dir+set}" = set; then : withval=$with_openssl_bin_dir; openssl_bin_dir=`cygpath -m "$withval"` fi # Windows uses Inno setup - look for its compiler. # Extract the first word of "iscc", so it can be a program name with args. set dummy iscc; 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_INNO_COMPILER_EXECUTABLE+:} false; then : $as_echo_n "(cached) " >&6 else case $INNO_COMPILER_EXECUTABLE in [\\/]* | ?:[\\/]*) ac_cv_path_INNO_COMPILER_EXECUTABLE="$INNO_COMPILER_EXECUTABLE" # 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_INNO_COMPILER_EXECUTABLE="$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 INNO_COMPILER_EXECUTABLE=$ac_cv_path_INNO_COMPILER_EXECUTABLE if test -n "$INNO_COMPILER_EXECUTABLE"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $INNO_COMPILER_EXECUTABLE" >&5 $as_echo "$INNO_COMPILER_EXECUTABLE" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi if test x${INNO_COMPILER_EXECUTABLE} = x; then { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: You will be unable to build the Windows installer." >&5 $as_echo "$as_me: WARNING: You will be unable to build the Windows installer." >&2;} fi # We need the msvc redistributables for this platform too # (in theory we could just install the assembly locally - but # there are at least 4 directories with binaries, meaning 4 copies; # so using the redist .exe means it ends up installed globally...) # Check whether --with-msvc-redist-dir was given. if test "${with_msvc_redist_dir+set}" = set; then : withval=$with_msvc_redist_dir; msvc_redist_dir=`cygpath -m "$withval"` msvc_redist_name="vcredist_x86.exe" fi if test ! -f ${msvc_redist_dir}/${msvc_redist_name}; then { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: Installer may fail due to missing MSVC redistributable." >&5 $as_echo "$as_me: WARNING: Installer may fail due to missing MSVC redistributable." >&2;} fi fi JS_LIBS="-l$JS_LIB_BASE -lm $JS_LIBS" LIBS="$OLD_LIBS" CPPFLAGS="$OLD_CPPFLAGS" %% auto detect "kegged" icu4c on Mac / Homebrew PATH="/usr/local/opt/icu4c/bin:$PATH" # Check whether --with-win32-icu-binaries was given. if test "${with_win32_icu_binaries+set}" = set; then : withval=$with_win32_icu_binaries; ICU_CPPFLAGS="-I$withval/include" ICU_LIBS="-L$withval/lib -licuuc -licudt -licuin" ICU_BIN=$withval/bin else succeeded=no if test -z "$ICU_CONFIG"; then # Extract the first word of "icu-config", so it can be a program name with args. set dummy icu-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_ICU_CONFIG+:} false; then : $as_echo_n "(cached) " >&6 else case $ICU_CONFIG in [\\/]* | ?:[\\/]*) ac_cv_path_ICU_CONFIG="$ICU_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_ICU_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 test -z "$ac_cv_path_ICU_CONFIG" && ac_cv_path_ICU_CONFIG="no" ;; esac fi ICU_CONFIG=$ac_cv_path_ICU_CONFIG if test -n "$ICU_CONFIG"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ICU_CONFIG" >&5 $as_echo "$ICU_CONFIG" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi fi if test "$ICU_CONFIG" = "no" ; then echo "*** The icu-config script could not be found. Make sure it is" echo "*** in your path, and that taglib is properly installed." echo "*** Or see http://ibm.com/software/globalization/icu/" else ICU_VERSION=`$ICU_CONFIG --version` { $as_echo "$as_me:${as_lineno-$LINENO}: checking for ICU >= 3.4.1" >&5 $as_echo_n "checking for ICU >= 3.4.1... " >&6; } VERSION_CHECK=`expr $ICU_VERSION \>\= 3.4.1` if test "$VERSION_CHECK" = "1" ; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 $as_echo "yes" >&6; } succeeded=yes { $as_echo "$as_me:${as_lineno-$LINENO}: checking ICU_CPPFLAGS" >&5 $as_echo_n "checking ICU_CPPFLAGS... " >&6; } ICU_CPPFLAGS=`$ICU_CONFIG --cppflags` { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ICU_CPPFLAGS" >&5 $as_echo "$ICU_CPPFLAGS" >&6; } { $as_echo "$as_me:${as_lineno-$LINENO}: checking ICU_CFLAGS" >&5 $as_echo_n "checking ICU_CFLAGS... " >&6; } ICU_CFLAGS=`$ICU_CONFIG --cflags` { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ICU_CFLAGS" >&5 $as_echo "$ICU_CFLAGS" >&6; } { $as_echo "$as_me:${as_lineno-$LINENO}: checking ICU_CXXFLAGS" >&5 $as_echo_n "checking ICU_CXXFLAGS... " >&6; } ICU_CXXFLAGS=`$ICU_CONFIG --cxxflags` { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ICU_CXXFLAGS" >&5 $as_echo "$ICU_CXXFLAGS" >&6; } { $as_echo "$as_me:${as_lineno-$LINENO}: checking ICU_LIBS" >&5 $as_echo_n "checking ICU_LIBS... " >&6; } ICU_LIBS=`$ICU_CONFIG --ldflags` { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ICU_LIBS" >&5 $as_echo "$ICU_LIBS" >&6; } else ICU_CPPFLAGS="" ICU_CFLAGS="" ICU_CXXFLAGS="" ICU_LIBS="" ## If we have a custom action on failure, don't print errors, but ## do set a variable so people can do so. echo "can't find ICU >= 3.4.1" fi fi if test $succeeded = yes; then : else as_fn_error $? "Library requirements (ICU) not met." "$LINENO" 5 fi ICU_BIN= fi use_curl=yes # Check whether --with-win32-curl was given. if test "${with_win32_curl+set}" = set; then : withval=$with_win32_curl; # default build on windows is a static lib, and that's what we want too CURL_CFLAGS="-I$withval/include -DCURL_STATICLIB" CURL_LIBS="-L$withval/lib -llibcurl -lWs2_32 -lkernel32 -luser32 -ladvapi32 -lWldap32" # OpenSSL libraries may be pulled in via libcurl if it was built with SSL # these are libeay32 ssleay32 instead of crypto ssl on unix else # Check whether --with-curl-prefix was given. if test "${with_curl_prefix+set}" = set; then : withval=$with_curl_prefix; curl_config_prefix="$withval" else curl_config_prefix="" fi # Check whether --with-curl-exec-prefix was given. if test "${with_curl_exec_prefix+set}" = set; then : withval=$with_curl_exec_prefix; curl_config_exec_prefix="$withval" else curl_config_exec_prefix="" fi if test x$CURL_CFLAGS != x -o x$CURL_LIBS != x; then : : $as_echo "#define HAVE_CURL 1" >>confdefs.h else if test x$curl_config_exec_prefix != x; then : curl_config_args="$curl_config_args --exec-prefix=$curl_config_exec_prefix" if test x${CURL_CONFIG+set} != xset; then : CURL_CONFIG=$curl_config_exec_prefix/bin/curl-config fi fi if test x$curl_config_prefix != x; then : curl_config_args="$curl_config_args --prefix=$curl_config_prefix" if test x${CURL_CONFIG+set} != xset; then : CURL_CONFIG=$curl_config_prefix/bin/curl-config fi fi for ac_prog in curl-config 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_path_CURL_CONFIG+:} false; then : $as_echo_n "(cached) " >&6 else case $CURL_CONFIG in [\\/]* | ?:[\\/]*) ac_cv_path_CURL_CONFIG="$CURL_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_CURL_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 CURL_CONFIG=$ac_cv_path_CURL_CONFIG if test -n "$CURL_CONFIG"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CURL_CONFIG" >&5 $as_echo "$CURL_CONFIG" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi test -n "$CURL_CONFIG" && break done test -n "$CURL_CONFIG" || CURL_CONFIG="no" if test "$CURL_CONFIG" == "no"; then : : { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: You will be unable to run some JavaScript unit tests." >&5 $as_echo "$as_me: WARNING: You will be unable to run some JavaScript unit tests." >&2;} use_curl=no CURL_LIBS= else if test x"" == x; then : CURL_CFLAGS="`$CURL_CONFIG $curl_config_args --cflags`" else CURL_CFLAGS="`$CURL_CONFIG $curl_config_args `" fi if test x"" == x; then : CURL_LIBS="`$CURL_CONFIG $curl_config_args --libs`" else CURL_LIBS="`$CURL_CONFIG $curl_config_args `" fi if test x"7.18.0" != x; then : if test x"'s/^libcurl\ \+//'" != x; then : curl_version="`$CURL_CONFIG $curl_config_args --version | $SED -e 's/^libcurl\ \+//'`" else curl_version="`$CURL_CONFIG $curl_config_args --version | $SED -e 's/^\ *\(.*\)\ *$/\1/'`" fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking for curl ($curl_version) >= 7.18.0" >&5 $as_echo_n "checking for curl ($curl_version) >= 7.18.0... " >&6; } # Used to indicate true or false condition ax_compare_version=false # Convert the two version strings to be compared into a format that # allows a simple string comparison. The end result is that a version # string of the form 1.12.5-r617 will be converted to the form # 0001001200050617. In other words, each number is zero padded to four # digits, and non digits are removed. ax_compare_version_A=`echo "$curl_version" | sed -e 's/\([0-9]*\)/Z\1Z/g' \ -e 's/Z\([0-9]\)Z/Z0\1Z/g' \ -e 's/Z\([0-9][0-9]\)Z/Z0\1Z/g' \ -e 's/Z\([0-9][0-9][0-9]\)Z/Z0\1Z/g' \ -e 's/[^0-9]//g'` ax_compare_version_B=`echo "7.18.0" | sed -e 's/\([0-9]*\)/Z\1Z/g' \ -e 's/Z\([0-9]\)Z/Z0\1Z/g' \ -e 's/Z\([0-9][0-9]\)Z/Z0\1Z/g' \ -e 's/Z\([0-9][0-9][0-9]\)Z/Z0\1Z/g' \ -e 's/[^0-9]//g'` ax_compare_version=`echo "x$ax_compare_version_A x$ax_compare_version_B" | sed 's/^ *//' | sort -r | sed "s/x${ax_compare_version_A}/true/;s/x${ax_compare_version_B}/false/;1q"` if test "$ax_compare_version" = "true" ; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 $as_echo "yes" >&6; } : $as_echo "#define HAVE_CURL 1" >>confdefs.h else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } : { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: You will be unable to run some JavaScript unit tests." >&5 $as_echo "$as_me: WARNING: You will be unable to run some JavaScript unit tests." >&2;} use_curl=no CURL_LIBS= fi else : $as_echo "#define HAVE_CURL 1" >>confdefs.h fi fi fi fi case "$(uname -s)" in Linux) LIBS="$LIBS -lcrypt" CPPFLAGS="-D_XOPEN_SOURCE $CPPFLAGS" ;; FreeBSD) LIBS="$LIBS -lcrypt" ;; OpenBSD) LIBS="$LIBS -lcrypto" ;; esac { $as_echo "$as_me:${as_lineno-$LINENO}: checking Erlang version compatibility" >&5 $as_echo_n "checking Erlang version compatibility... " >&6; } erlang_version_error="The installed Erlang version must be >= R14B (erts-5.8.1) and =< 17 (erts-6.0)" version="`${ERL} -version 2>&1 | ${SED} 's/[^0-9]/ /g'` 0 0 0" major_version=`echo $version | ${AWK} "{print \\$1}"` minor_version=`echo $version | ${AWK} "{print \\$2}"` patch_version=`echo $version | ${AWK} "{print \\$3}"` echo -n "detected Erlang version: $major_version.$minor_version.$patch_version..." if test $major_version -lt 5 -o $major_version -gt 6; then as_fn_error $? "$erlang_version_error major_version does not match" "$LINENO" 5 fi if test $major_version -eq 5 -a $minor_version -lt 8; then as_fn_error $? "$erlang_version_error minor_version does not match" "$LINENO" 5 fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: compatible" >&5 $as_echo "compatible" >&6; } # returns 17 for erts-6.0, and R14B03 or similar for earlier releases otp_release="`\ ${ERL} -noshell \ -eval 'io:put_chars(erlang:system_info(otp_release)).' \ -s erlang halt`" if can_use_nifs=$(echo $otp_release | grep -E "^(R14B|R15|R16|17)"); then USE_OTP_NIFS_TRUE= USE_OTP_NIFS_FALSE='#' else USE_OTP_NIFS_TRUE='#' USE_OTP_NIFS_FALSE= fi if can_use_ejson=$(echo $otp_release | grep -E "^(R14B03|R15|R16|17)"); then USE_EJSON_COMPARE_NIF_TRUE= USE_EJSON_COMPARE_NIF_FALSE='#' else USE_EJSON_COMPARE_NIF_TRUE='#' USE_EJSON_COMPARE_NIF_FALSE= fi has_crypto=`\ ${ERL} -eval "\ case application:load(crypto) of ok -> ok; _ -> exit(no_crypto) end. \ " -noshell -s init stop` if test -n "$has_crypto"; then as_fn_error $? "Could not find the Erlang crypto library. Has Erlang been compiled with OpenSSL support?" "$LINENO" 5 fi # Extract the first word of "erlc", so it can be a program name with args. set dummy erlc; 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_ERLC+:} false; then : $as_echo_n "(cached) " >&6 else case $ERLC in [\\/]* | ?:[\\/]*) ac_cv_path_ERLC="$ERLC" # 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_ERLC="$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 ERLC=$ac_cv_path_ERLC if test -n "$ERLC"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ERLC" >&5 $as_echo "$ERLC" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi if test x${ERLC} = x; then as_fn_error $? "Could not find the \`erlc' executable. Is Erlang installed?" "$LINENO" 5 fi OLD_CPPFLAGS="$CPPFLAGS" CPPFLAGS="$ERLANG_FLAGS $CPPFLAGS" ac_fn_cxx_check_header_mongrel "$LINENO" "erl_driver.h" "ac_cv_header_erl_driver_h" "$ac_includes_default" if test "x$ac_cv_header_erl_driver_h" = xyes; then : else as_fn_error $? "Could not find the \`erl_driver.h' header. Are the Erlang headers installed? Use the \`--with-erlang' option to specify the Erlang include directory." "$LINENO" 5 fi CPPFLAGS="$OLD_CPPFLAGS" use_init=yes use_launchd=yes native_mochijson_enabled=no tests_enabled=yes docs_enabled=yes strictness_enabled=no # Check whether --enable-init was given. if test "${enable_init+set}" = set; then : enableval=$enable_init; use_init=$enableval fi # Check whether --enable-launchd was given. if test "${enable_launchd+set}" = set; then : enableval=$enable_launchd; use_launchd=$enableval fi # Check whether --enable-native-mochijson was given. if test "${enable_native_mochijson+set}" = set; then : enableval=$enable_native_mochijson; native_mochijson_enabled=$enableval fi # Check whether --enable-tests was given. if test "${enable_tests+set}" = set; then : enableval=$enable_tests; tests_enabled=$enableval fi # Check whether --enable-docs was given. if test "${enable_docs+set}" = set; then : enableval=$enable_docs; docs_enabled=$enableval fi # Check whether --enable-strictness was given. if test "${enable_strictness+set}" = set; then : enableval=$enable_strictness; strictness_enabled=$enableval fi init_enabled=false launchd_enabled=false if test "$use_init" = "yes"; then { $as_echo "$as_me:${as_lineno-$LINENO}: checking location of init directory" >&5 $as_echo_n "checking location of init directory... " >&6; } if test -d /etc/rc.d; then init_enabled=true initdir='${sysconfdir}/rc.d' { $as_echo "$as_me:${as_lineno-$LINENO}: result: ${initdir}" >&5 $as_echo "${initdir}" >&6; } else if test -d /etc/init.d; then init_enabled=true initdir='${sysconfdir}/init.d' { $as_echo "$as_me:${as_lineno-$LINENO}: result: ${initdir}" >&5 $as_echo "${initdir}" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: not found" >&5 $as_echo "not found" >&6; } fi fi fi if test "$use_launchd" = "yes"; then { $as_echo "$as_me:${as_lineno-$LINENO}: checking location of launchd directory" >&5 $as_echo_n "checking location of launchd directory... " >&6; } if test -d /Library/LaunchDaemons; then init_enabled=false launchd_enabled=true launchddir='${prefix}/Library/LaunchDaemons' { $as_echo "$as_me:${as_lineno-$LINENO}: result: ${launchddir}" >&5 $as_echo "${launchddir}" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: not found" >&5 $as_echo "not found" >&6; } fi fi # Extract the first word of "help2man", so it can be a program name with args. set dummy help2man; 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_HAS_HELP2MAN+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$HAS_HELP2MAN"; then ac_cv_prog_HAS_HELP2MAN="$HAS_HELP2MAN" # 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_HAS_HELP2MAN="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 fi fi HAS_HELP2MAN=$ac_cv_prog_HAS_HELP2MAN if test -n "$HAS_HELP2MAN"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $HAS_HELP2MAN" >&5 $as_echo "$HAS_HELP2MAN" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi if test x${HAS_HELP2MAN} = x; then if test x${strictness_enabled} = xyes; then as_fn_error $? "Could not find the \`help2man' executable." "$LINENO" 5 else { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: You will be unable to regenerate man pages." >&5 $as_echo "$as_me: WARNING: You will be unable to regenerate man pages." >&2;} fi fi # Extract the first word of "pdflatex", so it can be a program name with args. set dummy pdflatex; 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_HAS_PDFLATEX+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$HAS_PDFLATEX"; then ac_cv_prog_HAS_PDFLATEX="$HAS_PDFLATEX" # 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_HAS_PDFLATEX="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 fi fi HAS_PDFLATEX=$ac_cv_prog_HAS_PDFLATEX if test -n "$HAS_PDFLATEX"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $HAS_PDFLATEX" >&5 $as_echo "$HAS_PDFLATEX" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi if test x${HAS_PDFLATEX} = x; then if test x${strictness_enabled} = xyes; then as_fn_error $? "Could not find the \`pdflatex' executable. Is LaTeX installed?" "$LINENO" 5 else { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: You will be unable to regenerate PDF documentation." >&5 $as_echo "$as_me: WARNING: You will be unable to regenerate PDF documentation." >&2;} fi fi # Extract the first word of "makeinfo", so it can be a program name with args. set dummy makeinfo; 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_HAS_MAKEINFO+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$HAS_MAKEINFO"; then ac_cv_prog_HAS_MAKEINFO="$HAS_MAKEINFO" # 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_HAS_MAKEINFO="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 fi fi HAS_MAKEINFO=$ac_cv_prog_HAS_MAKEINFO if test -n "$HAS_MAKEINFO"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $HAS_MAKEINFO" >&5 $as_echo "$HAS_MAKEINFO" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi if test x${HAS_MAKEINFO} = x; then if test x${strictness_enabled} = xyes; then as_fn_error $? "Could not find the \`makeinfo' executable. Is GNU Texinfo installed?" "$LINENO" 5 else { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: You will be unable to regenerate info documentation." >&5 $as_echo "$as_me: WARNING: You will be unable to regenerate info documentation." >&2;} fi fi # Extract the first word of "install-info", so it can be a program name with args. set dummy install-info; 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_HAS_INSTALLINFO+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$HAS_INSTALLINFO"; then ac_cv_prog_HAS_INSTALLINFO="$HAS_INSTALLINFO" # 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_HAS_INSTALLINFO="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 fi fi HAS_INSTALLINFO=$ac_cv_prog_HAS_INSTALLINFO if test -n "$HAS_INSTALLINFO"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $HAS_INSTALLINFO" >&5 $as_echo "$HAS_INSTALLINFO" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi if test x${HAS_INSTALLINFO} = x; then if test x${strictness_enabled} = xyes; then as_fn_error $? "Could not find the \`install-info' executable. Is GNU Texinfo installed?" "$LINENO" 5 else { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: You will be unable to install info documentation." >&5 $as_echo "$as_me: WARNING: You will be unable to install info documentation." >&2;} fi fi # Extract the first word of "sphinx-build", so it can be a program name with args. set dummy sphinx-build; 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_HAS_SPHINX_BUILD+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$HAS_SPHINX_BUILD"; then ac_cv_prog_HAS_SPHINX_BUILD="$HAS_SPHINX_BUILD" # 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_HAS_SPHINX_BUILD="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 fi fi HAS_SPHINX_BUILD=$ac_cv_prog_HAS_SPHINX_BUILD if test -n "$HAS_SPHINX_BUILD"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $HAS_SPHINX_BUILD" >&5 $as_echo "$HAS_SPHINX_BUILD" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi if test x${HAS_SPHINX_BUILD} = x; then if test x${strictness_enabled} = xyes; then as_fn_error $? "Could not find the \`sphinx-build' executable." "$LINENO" 5 else { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: You will be unable to regenerate documentation." >&5 $as_echo "$as_me: WARNING: You will be unable to regenerate documentation." >&2;} fi fi if test x${docs_enabled} = xyes; then if test x${HAS_HELP2MAN} = xyes; then build_man=yes fi if test x${HAS_SPHINX_BUILD} = xyes; then build_html=yes if test x${HAS_MAKEINFO} = xyes; then build_info=yes fi if test x${HAS_PDFLATEX} = xyes; then build_pdf=yes fi fi fi if test x${strictness_enabled} = xyes; then if test -z $PYTHON; then PYTHON="python" fi PYTHON_NAME=`basename $PYTHON` { $as_echo "$as_me:${as_lineno-$LINENO}: checking $PYTHON_NAME module: pygments" >&5 $as_echo_n "checking $PYTHON_NAME module: pygments... " >&6; } $PYTHON -c "import pygments" 2>/dev/null if test $? -eq 0; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 $as_echo "yes" >&6; } eval HAVE_PYMOD_PYGMENTS=yes else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } eval HAVE_PYMOD_PYGMENTS=no # if test -n "fatal" then as_fn_error $? "failed to find required module pygments" "$LINENO" 5 exit 1 fi fi else if test -z $PYTHON; then PYTHON="python" fi PYTHON_NAME=`basename $PYTHON` { $as_echo "$as_me:${as_lineno-$LINENO}: checking $PYTHON_NAME module: pygments" >&5 $as_echo_n "checking $PYTHON_NAME module: pygments... " >&6; } $PYTHON -c "import pygments" 2>/dev/null if test $? -eq 0; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 $as_echo "yes" >&6; } eval HAVE_PYMOD_PYGMENTS=yes else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } eval HAVE_PYMOD_PYGMENTS=no # if test -n "" then as_fn_error $? "failed to find required module pygments" "$LINENO" 5 exit 1 fi fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking pygments version >= 1.5" >&5 $as_echo_n "checking pygments version >= 1.5... " >&6; } python 2> /dev/null << EOF import sys import pygments if float(pygments.__version__) >= 1.5: sys.exit(0) else: sys.exit(1) EOF if test $? -eq 0; 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; } if test x${strictness_enabled} = xyes; then as_fn_error 1 "Your copy of pygments is out of date." "$LINENO" 5 else { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: Syntax highlighting may not work." >&5 $as_echo "$as_me: WARNING: Syntax highlighting may not work." >&2;} fi fi ERL_VERSION_COMMAND="${ESCRIPT} bin/erlang-version.escript" erlangversion=`${ERL_VERSION_COMMAND}` if test x${init_enabled} = xtrue; then INIT_TRUE= INIT_FALSE='#' else INIT_TRUE='#' INIT_FALSE= fi if test x${launchd_enabled} = xtrue; then LAUNCHD_TRUE= LAUNCHD_FALSE='#' else LAUNCHD_TRUE='#' LAUNCHD_FALSE= fi if test x${native_mochijson_enabled} = xyes; then USE_NATIVE_MOCHIJSON_TRUE= USE_NATIVE_MOCHIJSON_FALSE='#' else USE_NATIVE_MOCHIJSON_TRUE='#' USE_NATIVE_MOCHIJSON_FALSE= fi if test x${use_curl} = xyes; then USE_CURL_TRUE= USE_CURL_FALSE='#' else USE_CURL_TRUE='#' USE_CURL_FALSE= fi if test x${build_man} = xyes; then BUILD_MAN_TRUE= BUILD_MAN_FALSE='#' else BUILD_MAN_TRUE='#' BUILD_MAN_FALSE= fi if test x${build_info} = xyes; then BUILD_INFO_TRUE= BUILD_INFO_FALSE='#' else BUILD_INFO_TRUE='#' BUILD_INFO_FALSE= fi if test x${build_pdf} = xyes; then BUILD_PDF_TRUE= BUILD_PDF_FALSE='#' else BUILD_PDF_TRUE='#' BUILD_PDF_FALSE= fi if test x${build_html} = xyes; then BUILD_HTML_TRUE= BUILD_HTML_FALSE='#' else BUILD_HTML_TRUE='#' BUILD_HTML_FALSE= fi if test x${tests_enabled} = xyes; then TESTS_TRUE= TESTS_FALSE='#' else TESTS_TRUE='#' TESTS_FALSE= fi if test x${strictness_enabled} = xyes; then STRICTNESS_TRUE= STRICTNESS_FALSE='#' else STRICTNESS_TRUE='#' STRICTNESS_FALSE= fi package_author_name="The Apache Software Foundation" package_author_address="dev@couchdb.apache.org" package_identifier="couchdb" package_tarname="apache-couchdb" package_name="Apache CouchDB" version="1.6.0" version_major="1" version_minor="6" version_revision="0" version_stage="" version_release="" bug_uri="https://issues.apache.org/jira/browse/COUCHDB" localconfdir=${sysconfdir}/${package_identifier} localdatadir=${datadir}/${package_identifier} localdocdir=${datadir}/doc/${package_identifier} locallibdir=${libdir}/${package_identifier} localstatelibdir=${localstatedir}/lib/${package_identifier} localstatelogdir=${localstatedir}/log/${package_identifier} localstaterundir=${localstatedir}/run/${package_identifier} erlangversion=${erlangversion} erlangbin=${ERL} # On Windows we install directly into our erlang distribution. if test x${IS_WINDOWS} = xTRUE; then locallibbindir=${prefix}/bin localerlanglibdir=${libdir} else locallibbindir=${locallibdir}/bin localerlanglibdir=${locallibdir}/erlang/lib fi # fix for older autotools that don't define "abs_top_YYY" by default ac_config_files="$ac_config_files Makefile" ac_config_files="$ac_config_files bin/couch-config.tpl" ac_config_files="$ac_config_files bin/couchdb.tpl" ac_config_files="$ac_config_files bin/couchdb.bat.tpl" ac_config_files="$ac_config_files bin/Makefile" ac_config_files="$ac_config_files etc/couchdb/Makefile" ac_config_files="$ac_config_files etc/couchdb/default.ini.tpl" ac_config_files="$ac_config_files etc/default/Makefile" ac_config_files="$ac_config_files etc/init/couchdb.tpl" ac_config_files="$ac_config_files etc/init/Makefile" ac_config_files="$ac_config_files etc/launchd/org.apache.couchdb.plist.tpl" ac_config_files="$ac_config_files etc/launchd/Makefile" ac_config_files="$ac_config_files etc/logrotate.d/couchdb.tpl" ac_config_files="$ac_config_files etc/logrotate.d/Makefile" ac_config_files="$ac_config_files etc/windows/Makefile" ac_config_files="$ac_config_files etc/Makefile" ac_config_files="$ac_config_files share/Makefile" ac_config_files="$ac_config_files share/doc/Makefile" ac_config_files="$ac_config_files share/doc/build/Makefile" ac_config_files="$ac_config_files src/Makefile" ac_config_files="$ac_config_files src/couch_dbupdates/Makefile" ac_config_files="$ac_config_files src/couch_index/Makefile" ac_config_files="$ac_config_files src/couch_mrview/Makefile" ac_config_files="$ac_config_files src/couch_plugins/Makefile" ac_config_files="$ac_config_files src/couch_replicator/Makefile" ac_config_files="$ac_config_files src/couchjs-node/Makefile" ac_config_files="$ac_config_files src/couchdb/couch.app.tpl" ac_config_files="$ac_config_files src/couchdb/Makefile" ac_config_files="$ac_config_files src/couchdb/priv/Makefile" ac_config_files="$ac_config_files src/erlang-oauth/Makefile" ac_config_files="$ac_config_files src/etap/Makefile" ac_config_files="$ac_config_files src/ibrowse/Makefile" ac_config_files="$ac_config_files src/mochiweb/Makefile" ac_config_files="$ac_config_files src/snappy/Makefile" ac_config_files="$ac_config_files src/snappy/google-snappy/snappy-stubs-public.h" ac_config_files="$ac_config_files src/ejson/Makefile" ac_config_files="$ac_config_files test/Makefile" ac_config_files="$ac_config_files test/bench/Makefile" ac_config_files="$ac_config_files test/etap/Makefile" ac_config_files="$ac_config_files test/etap/test_util.erl" ac_config_files="$ac_config_files test/javascript/Makefile" ac_config_files="$ac_config_files test/view_server/Makefile" ac_config_files="$ac_config_files utils/Makefile" ac_config_files="$ac_config_files var/Makefile" 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 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 "${WINDOWS_TRUE}" && test -z "${WINDOWS_FALSE}"; then as_fn_error $? "conditional \"WINDOWS\" was never defined. Usually this means the macro was only invoked conditionally." "$LINENO" 5 fi if test -z "${USE_OTP_NIFS_TRUE}" && test -z "${USE_OTP_NIFS_FALSE}"; then as_fn_error $? "conditional \"USE_OTP_NIFS\" was never defined. Usually this means the macro was only invoked conditionally." "$LINENO" 5 fi if test -z "${USE_EJSON_COMPARE_NIF_TRUE}" && test -z "${USE_EJSON_COMPARE_NIF_FALSE}"; then as_fn_error $? "conditional \"USE_EJSON_COMPARE_NIF\" was never defined. Usually this means the macro was only invoked conditionally." "$LINENO" 5 fi if test -z "${INIT_TRUE}" && test -z "${INIT_FALSE}"; then as_fn_error $? "conditional \"INIT\" was never defined. Usually this means the macro was only invoked conditionally." "$LINENO" 5 fi if test -z "${LAUNCHD_TRUE}" && test -z "${LAUNCHD_FALSE}"; then as_fn_error $? "conditional \"LAUNCHD\" was never defined. Usually this means the macro was only invoked conditionally." "$LINENO" 5 fi if test -z "${USE_NATIVE_MOCHIJSON_TRUE}" && test -z "${USE_NATIVE_MOCHIJSON_FALSE}"; then as_fn_error $? "conditional \"USE_NATIVE_MOCHIJSON\" was never defined. Usually this means the macro was only invoked conditionally." "$LINENO" 5 fi if test -z "${USE_CURL_TRUE}" && test -z "${USE_CURL_FALSE}"; then as_fn_error $? "conditional \"USE_CURL\" was never defined. Usually this means the macro was only invoked conditionally." "$LINENO" 5 fi if test -z "${BUILD_MAN_TRUE}" && test -z "${BUILD_MAN_FALSE}"; then as_fn_error $? "conditional \"BUILD_MAN\" was never defined. Usually this means the macro was only invoked conditionally." "$LINENO" 5 fi if test -z "${BUILD_INFO_TRUE}" && test -z "${BUILD_INFO_FALSE}"; then as_fn_error $? "conditional \"BUILD_INFO\" was never defined. Usually this means the macro was only invoked conditionally." "$LINENO" 5 fi if test -z "${BUILD_PDF_TRUE}" && test -z "${BUILD_PDF_FALSE}"; then as_fn_error $? "conditional \"BUILD_PDF\" was never defined. Usually this means the macro was only invoked conditionally." "$LINENO" 5 fi if test -z "${BUILD_HTML_TRUE}" && test -z "${BUILD_HTML_FALSE}"; then as_fn_error $? "conditional \"BUILD_HTML\" was never defined. Usually this means the macro was only invoked conditionally." "$LINENO" 5 fi if test -z "${TESTS_TRUE}" && test -z "${TESTS_FALSE}"; then as_fn_error $? "conditional \"TESTS\" was never defined. Usually this means the macro was only invoked conditionally." "$LINENO" 5 fi if test -z "${STRICTNESS_TRUE}" && test -z "${STRICTNESS_FALSE}"; then as_fn_error $? "conditional \"STRICTNESS\" 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 Apache CouchDB $as_me 1.6.0, 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 ." _ACEOF cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 ac_cs_config="`$as_echo "$ac_configure_args" | sed 's/^ //; s/[\\""\`\$]/\\\\&/g'`" ac_cs_version="\\ Apache CouchDB config.status 1.6.0 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_shared='`$ECHO "$enable_shared" | $SED "$delay_single_quote_subst"`' enable_static='`$ECHO "$enable_static" | $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"`' AS='`$ECHO "$AS" | $SED "$delay_single_quote_subst"`' DLLTOOL='`$ECHO "$DLLTOOL" | $SED "$delay_single_quote_subst"`' OBJDUMP='`$ECHO "$OBJDUMP" | $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"`' 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"`' 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"`' LD_CXX='`$ECHO "$LD_CXX" | $SED "$delay_single_quote_subst"`' reload_flag_CXX='`$ECHO "$reload_flag_CXX" | $SED "$delay_single_quote_subst"`' reload_cmds_CXX='`$ECHO "$reload_cmds_CXX" | $SED "$delay_single_quote_subst"`' old_archive_cmds_CXX='`$ECHO "$old_archive_cmds_CXX" | $SED "$delay_single_quote_subst"`' compiler_CXX='`$ECHO "$compiler_CXX" | $SED "$delay_single_quote_subst"`' GCC_CXX='`$ECHO "$GCC_CXX" | $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_pic_CXX='`$ECHO "$lt_prog_compiler_pic_CXX" | $SED "$delay_single_quote_subst"`' lt_prog_compiler_wl_CXX='`$ECHO "$lt_prog_compiler_wl_CXX" | $SED "$delay_single_quote_subst"`' lt_prog_compiler_static_CXX='`$ECHO "$lt_prog_compiler_static_CXX" | $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"`' archive_cmds_need_lc_CXX='`$ECHO "$archive_cmds_need_lc_CXX" | $SED "$delay_single_quote_subst"`' enable_shared_with_static_runtimes_CXX='`$ECHO "$enable_shared_with_static_runtimes_CXX" | $SED "$delay_single_quote_subst"`' export_dynamic_flag_spec_CXX='`$ECHO "$export_dynamic_flag_spec_CXX" | $SED "$delay_single_quote_subst"`' whole_archive_flag_spec_CXX='`$ECHO "$whole_archive_flag_spec_CXX" | $SED "$delay_single_quote_subst"`' compiler_needs_object_CXX='`$ECHO "$compiler_needs_object_CXX" | $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_expsyms_cmds_CXX='`$ECHO "$old_archive_from_expsyms_cmds_CXX" | $SED "$delay_single_quote_subst"`' archive_cmds_CXX='`$ECHO "$archive_cmds_CXX" | $SED "$delay_single_quote_subst"`' archive_expsym_cmds_CXX='`$ECHO "$archive_expsym_cmds_CXX" | $SED "$delay_single_quote_subst"`' module_cmds_CXX='`$ECHO "$module_cmds_CXX" | $SED "$delay_single_quote_subst"`' module_expsym_cmds_CXX='`$ECHO "$module_expsym_cmds_CXX" | $SED "$delay_single_quote_subst"`' with_gnu_ld_CXX='`$ECHO "$with_gnu_ld_CXX" | $SED "$delay_single_quote_subst"`' allow_undefined_flag_CXX='`$ECHO "$allow_undefined_flag_CXX" | $SED "$delay_single_quote_subst"`' no_undefined_flag_CXX='`$ECHO "$no_undefined_flag_CXX" | $SED "$delay_single_quote_subst"`' hardcode_libdir_flag_spec_CXX='`$ECHO "$hardcode_libdir_flag_spec_CXX" | $SED "$delay_single_quote_subst"`' hardcode_libdir_separator_CXX='`$ECHO "$hardcode_libdir_separator_CXX" | $SED "$delay_single_quote_subst"`' hardcode_direct_CXX='`$ECHO "$hardcode_direct_CXX" | $SED "$delay_single_quote_subst"`' hardcode_direct_absolute_CXX='`$ECHO "$hardcode_direct_absolute_CXX" | $SED "$delay_single_quote_subst"`' hardcode_minus_L_CXX='`$ECHO "$hardcode_minus_L_CXX" | $SED "$delay_single_quote_subst"`' hardcode_shlibpath_var_CXX='`$ECHO "$hardcode_shlibpath_var_CXX" | $SED "$delay_single_quote_subst"`' hardcode_automatic_CXX='`$ECHO "$hardcode_automatic_CXX" | $SED "$delay_single_quote_subst"`' inherit_rpath_CXX='`$ECHO "$inherit_rpath_CXX" | $SED "$delay_single_quote_subst"`' link_all_deplibs_CXX='`$ECHO "$link_all_deplibs_CXX" | $SED "$delay_single_quote_subst"`' always_export_symbols_CXX='`$ECHO "$always_export_symbols_CXX" | $SED "$delay_single_quote_subst"`' export_symbols_cmds_CXX='`$ECHO "$export_symbols_cmds_CXX" | $SED "$delay_single_quote_subst"`' exclude_expsyms_CXX='`$ECHO "$exclude_expsyms_CXX" | $SED "$delay_single_quote_subst"`' include_expsyms_CXX='`$ECHO "$include_expsyms_CXX" | $SED "$delay_single_quote_subst"`' prelink_cmds_CXX='`$ECHO "$prelink_cmds_CXX" | $SED "$delay_single_quote_subst"`' postlink_cmds_CXX='`$ECHO "$postlink_cmds_CXX" | $SED "$delay_single_quote_subst"`' file_list_spec_CXX='`$ECHO "$file_list_spec_CXX" | $SED "$delay_single_quote_subst"`' hardcode_action_CXX='`$ECHO "$hardcode_action_CXX" | $SED "$delay_single_quote_subst"`' compiler_lib_search_dirs_CXX='`$ECHO "$compiler_lib_search_dirs_CXX" | $SED "$delay_single_quote_subst"`' predep_objects_CXX='`$ECHO "$predep_objects_CXX" | $SED "$delay_single_quote_subst"`' postdep_objects_CXX='`$ECHO "$postdep_objects_CXX" | $SED "$delay_single_quote_subst"`' predeps_CXX='`$ECHO "$predeps_CXX" | $SED "$delay_single_quote_subst"`' postdeps_CXX='`$ECHO "$postdeps_CXX" | $SED "$delay_single_quote_subst"`' compiler_lib_search_path_CXX='`$ECHO "$compiler_lib_search_path_CXX" | $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 AS \ DLLTOOL \ OBJDUMP \ SHELL \ ECHO \ PATH_SEPARATOR \ SED \ GREP \ EGREP \ FGREP \ LD \ NM \ LN_S \ lt_SP2NL \ lt_NL2SP \ reload_flag \ deplibs_check_method \ file_magic_cmd \ file_magic_glob \ want_nocaseglob \ 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 \ LD_CXX \ reload_flag_CXX \ compiler_CXX \ lt_prog_compiler_no_builtin_flag_CXX \ lt_prog_compiler_pic_CXX \ lt_prog_compiler_wl_CXX \ lt_prog_compiler_static_CXX \ lt_cv_prog_compiler_c_o_CXX \ export_dynamic_flag_spec_CXX \ whole_archive_flag_spec_CXX \ compiler_needs_object_CXX \ with_gnu_ld_CXX \ allow_undefined_flag_CXX \ no_undefined_flag_CXX \ hardcode_libdir_flag_spec_CXX \ hardcode_libdir_separator_CXX \ exclude_expsyms_CXX \ include_expsyms_CXX \ file_list_spec_CXX \ compiler_lib_search_dirs_CXX \ predep_objects_CXX \ postdep_objects_CXX \ predeps_CXX \ postdeps_CXX \ compiler_lib_search_path_CXX; 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 \ old_archive_cmds_CXX \ old_archive_from_new_cmds_CXX \ old_archive_from_expsyms_cmds_CXX \ archive_cmds_CXX \ archive_expsym_cmds_CXX \ module_cmds_CXX \ module_expsym_cmds_CXX \ export_symbols_cmds_CXX \ prelink_cmds_CXX \ postlink_cmds_CXX; 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" ;; "src/snappy/google-snappy/config.h") CONFIG_HEADERS="$CONFIG_HEADERS src/snappy/google-snappy/config.h" ;; "depfiles") CONFIG_COMMANDS="$CONFIG_COMMANDS depfiles" ;; "libtool") CONFIG_COMMANDS="$CONFIG_COMMANDS libtool" ;; "Makefile") CONFIG_FILES="$CONFIG_FILES Makefile" ;; "bin/couch-config.tpl") CONFIG_FILES="$CONFIG_FILES bin/couch-config.tpl" ;; "bin/couchdb.tpl") CONFIG_FILES="$CONFIG_FILES bin/couchdb.tpl" ;; "bin/couchdb.bat.tpl") CONFIG_FILES="$CONFIG_FILES bin/couchdb.bat.tpl" ;; "bin/Makefile") CONFIG_FILES="$CONFIG_FILES bin/Makefile" ;; "etc/couchdb/Makefile") CONFIG_FILES="$CONFIG_FILES etc/couchdb/Makefile" ;; "etc/couchdb/default.ini.tpl") CONFIG_FILES="$CONFIG_FILES etc/couchdb/default.ini.tpl" ;; "etc/default/Makefile") CONFIG_FILES="$CONFIG_FILES etc/default/Makefile" ;; "etc/init/couchdb.tpl") CONFIG_FILES="$CONFIG_FILES etc/init/couchdb.tpl" ;; "etc/init/Makefile") CONFIG_FILES="$CONFIG_FILES etc/init/Makefile" ;; "etc/launchd/org.apache.couchdb.plist.tpl") CONFIG_FILES="$CONFIG_FILES etc/launchd/org.apache.couchdb.plist.tpl" ;; "etc/launchd/Makefile") CONFIG_FILES="$CONFIG_FILES etc/launchd/Makefile" ;; "etc/logrotate.d/couchdb.tpl") CONFIG_FILES="$CONFIG_FILES etc/logrotate.d/couchdb.tpl" ;; "etc/logrotate.d/Makefile") CONFIG_FILES="$CONFIG_FILES etc/logrotate.d/Makefile" ;; "etc/windows/Makefile") CONFIG_FILES="$CONFIG_FILES etc/windows/Makefile" ;; "etc/Makefile") CONFIG_FILES="$CONFIG_FILES etc/Makefile" ;; "share/Makefile") CONFIG_FILES="$CONFIG_FILES share/Makefile" ;; "share/doc/Makefile") CONFIG_FILES="$CONFIG_FILES share/doc/Makefile" ;; "share/doc/build/Makefile") CONFIG_FILES="$CONFIG_FILES share/doc/build/Makefile" ;; "src/Makefile") CONFIG_FILES="$CONFIG_FILES src/Makefile" ;; "src/couch_dbupdates/Makefile") CONFIG_FILES="$CONFIG_FILES src/couch_dbupdates/Makefile" ;; "src/couch_index/Makefile") CONFIG_FILES="$CONFIG_FILES src/couch_index/Makefile" ;; "src/couch_mrview/Makefile") CONFIG_FILES="$CONFIG_FILES src/couch_mrview/Makefile" ;; "src/couch_plugins/Makefile") CONFIG_FILES="$CONFIG_FILES src/couch_plugins/Makefile" ;; "src/couch_replicator/Makefile") CONFIG_FILES="$CONFIG_FILES src/couch_replicator/Makefile" ;; "src/couchjs-node/Makefile") CONFIG_FILES="$CONFIG_FILES src/couchjs-node/Makefile" ;; "src/couchdb/couch.app.tpl") CONFIG_FILES="$CONFIG_FILES src/couchdb/couch.app.tpl" ;; "src/couchdb/Makefile") CONFIG_FILES="$CONFIG_FILES src/couchdb/Makefile" ;; "src/couchdb/priv/Makefile") CONFIG_FILES="$CONFIG_FILES src/couchdb/priv/Makefile" ;; "src/erlang-oauth/Makefile") CONFIG_FILES="$CONFIG_FILES src/erlang-oauth/Makefile" ;; "src/etap/Makefile") CONFIG_FILES="$CONFIG_FILES src/etap/Makefile" ;; "src/ibrowse/Makefile") CONFIG_FILES="$CONFIG_FILES src/ibrowse/Makefile" ;; "src/mochiweb/Makefile") CONFIG_FILES="$CONFIG_FILES src/mochiweb/Makefile" ;; "src/snappy/Makefile") CONFIG_FILES="$CONFIG_FILES src/snappy/Makefile" ;; "src/snappy/google-snappy/snappy-stubs-public.h") CONFIG_FILES="$CONFIG_FILES src/snappy/google-snappy/snappy-stubs-public.h" ;; "src/ejson/Makefile") CONFIG_FILES="$CONFIG_FILES src/ejson/Makefile" ;; "test/Makefile") CONFIG_FILES="$CONFIG_FILES test/Makefile" ;; "test/bench/Makefile") CONFIG_FILES="$CONFIG_FILES test/bench/Makefile" ;; "test/etap/Makefile") CONFIG_FILES="$CONFIG_FILES test/etap/Makefile" ;; "test/etap/test_util.erl") CONFIG_FILES="$CONFIG_FILES test/etap/test_util.erl" ;; "test/javascript/Makefile") CONFIG_FILES="$CONFIG_FILES test/javascript/Makefile" ;; "test/view_server/Makefile") CONFIG_FILES="$CONFIG_FILES test/view_server/Makefile" ;; "utils/Makefile") CONFIG_FILES="$CONFIG_FILES utils/Makefile" ;; "var/Makefile") CONFIG_FILES="$CONFIG_FILES var/Makefile" ;; *) 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"" || { # Autoconf 2.62 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"` # When using ansi2knr, U may be empty or an underscore; expand it U=`sed -n 's/^U = //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' -e 's/\$U/'"$U"'/g'`; do # Make sure the directory exists. test -f "$dirpart/$file" && continue fdir=`$as_dirname -- "$file" || $as_expr X"$file" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ X"$file" : 'X\(//\)[^/]' \| \ X"$file" : 'X\(//\)$' \| \ X"$file" : 'X\(/\)' \| . 2>/dev/null || $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 " # ### BEGIN LIBTOOL CONFIG # Whether or not to build shared libraries. build_libtool_libs=$enable_shared # Whether or not to build static libraries. build_old_libs=$enable_static # Which release of libtool.m4 was used? macro_version=$macro_version macro_revision=$macro_revision # Assembler program. AS=$lt_AS # DLL creation program. DLLTOOL=$lt_DLLTOOL # Object dumper program. OBJDUMP=$lt_OBJDUMP # 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 # 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 # 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 # 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 ;; 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 # Windows Erlang build tools wrap Microsoft's linker and compiler just enough # to be able to build Erlang/OTP successfully, but not enough for full # compatibility with GNU AutoTools. The MS VC compiler and linker are # hidden from autotools in Erlang's cc.sh and ld.sh wrappers. GNU autoconf # identifies this dastardly mix as a unix variant, and libtool kindly # passes incorrect flags and names through to the MS linker. The simplest fix # is to modify libtool via sed to remove those options. # # As this is only done once at first configure, and subsequent config or source # changes may trigger a silent reversion to the non-functioning original. # # Changes are; # # 1. replace LIB$name with $name in libname_spec (e.g. libicu -> icu) to ensure # correct windows versions of .lib and .dlls are found or generated. # 2. remove incompatible \w-link\w from archive_cmds # 3. remove GNU-style directives to be passed through to the linker # 4. swap GNU-style shared library flags with MS -dll variant # # This obscene hackery is tracked under COUCHDB-440 and COUCHDB-1197. if test x${IS_WINDOWS} = xTRUE; then mv libtool libtool.dist /bin/sed -E -e 's,^libname_spec="lib,libname_spec=",' \ -e 's,( -link ), ,' \ -e 's,-Xlinker --out-implib -Xlinker \\\$lib,,' \ -e 's,(-shared -nostdlib), -dll ,' \ < libtool.dist > libtool # probably would chmod +x if we weren't on windows... fi echo echo "You have configured Apache CouchDB, time to relax." echo echo "Run \`make && sudo make install' to install." apache-couchdb-1.6.0/configure.ac0000644000175000001440000005757012332105522016622 0ustar00djcusers00000000000000dnl Licensed under the Apache License, Version 2.0 (the "License"); you may not dnl use this file except in compliance with the License. dnl You may obtain a dnl copy of the License at dnl dnl http://www.apache.org/licenses/LICENSE-2.0 dnl dnl Unless required by applicable law or agreed to in writing, software dnl distributed under the License is distributed on an "AS IS" BASIS, WITHOUT dnl WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the dnl License for the specific language governing permissions and limitations dnl under the License. AC_INIT( [LOCAL_PACKAGE_NAME], [LOCAL_VERSION], [LOCAL_BUG_URI], [LOCAL_PACKAGE_TARNAME]) AC_PREREQ([2.63]) AC_CONFIG_AUX_DIR([build-aux]) AC_CONFIG_MACRO_DIR([m4]) AC_CONFIG_HEADERS([config.h]) AC_CONFIG_HEADERS([src/snappy/google-snappy/config.h]) AM_INIT_AUTOMAKE([1.6.3 foreign tar-ustar]) AC_USE_SYSTEM_EXTENSIONS AC_ENABLE_SHARED AC_DISABLE_STATIC AC_PROG_CC LT_INIT([win32-dll]) LT_INIT AC_PROG_LN_S PKG_PROG_PKG_CONFIG dnl Config for google snappy m4_define([snappy_major], [1]) m4_define([snappy_minor], [0]) m4_define([snappy_patchlevel], [5]) AC_PROG_CXX AC_LANG([C++]) AC_LINK_IFELSE([AC_LANG_PROGRAM([], [])],, AC_MSG_ERROR([A C++ compiler is required.])) AC_C_BIGENDIAN AC_CHECK_HEADERS([stdint.h stddef.h sys/mman.h sys/resource.h]) AC_CHECK_FUNC([mmap]) AC_MSG_CHECKING([if the compiler supports __builtin_expect]) AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[]], [[ return __builtin_expect(1, 1) ? 1 : 0 ]])],[ snappy_have_builtin_expect=yes AC_MSG_RESULT([yes]) ],[ snappy_have_builtin_expect=no AC_MSG_RESULT([no]) ]) if test x$snappy_have_builtin_expect = xyes ; then AC_DEFINE([HAVE_BUILTIN_EXPECT], [1], [Define to 1 if the compiler supports __builtin_expect.]) fi AC_MSG_CHECKING([if the compiler supports __builtin_ctzll]) AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[]], [[ return (__builtin_ctzll(0x100000000LL) == 32) ? 1 : 0 ]])],[ snappy_have_builtin_ctz=yes AC_MSG_RESULT([yes]) ],[ snappy_have_builtin_ctz=no AC_MSG_RESULT([no]) ]) if test x$snappy_have_builtin_ctz = xyes ; then AC_DEFINE([HAVE_BUILTIN_CTZ], [1], [Define to 1 if the compiler supports __builtin_ctz and friends.]) fi if test "$ac_cv_header_stdint_h" = "yes"; then AC_SUBST([ac_cv_have_stdint_h], [1]) else AC_SUBST([ac_cv_have_stdint_h], [0]) fi if test "$ac_cv_header_stddef_h" = "yes"; then AC_SUBST([ac_cv_have_stddef_h], [1]) else AC_SUBST([ac_cv_have_stddef_h], [0]) fi SNAPPY_MAJOR="snappy_major" SNAPPY_MINOR="snappy_minor" SNAPPY_PATCHLEVEL="snappy_patchlevel" AC_SUBST([SNAPPY_MAJOR]) AC_SUBST([SNAPPY_MINOR]) AC_SUBST([SNAPPY_PATCHLEVEL]) AC_MSG_CHECKING([for pthread_create in -lpthread]) original_LIBS="$LIBS" LIBS="-lpthread $original_LIBS" AC_LINK_IFELSE([ AC_LANG_PROGRAM( [[#include]], [[pthread_create((void *)0, (void *)0, (void *)0, (void *)0)]])], [pthread=yes], [pthread=no]) if test x${pthread} = xyes; then AC_MSG_RESULT([yes]) else LIBS="$original_LIBS" AC_MSG_RESULT([no]) fi AC_PATH_PROG([ERL], [erl]) AC_PATH_PROG([ESCRIPT], [escript]) AS_IF([test x${ERL} = x], [ AC_MSG_ERROR([Could not find the `erl' executable. Is Erlang installed?]) ]) AC_ARG_WITH([erlang], [AS_HELP_STRING([--with-erlang=PATH], [set PATH to the Erlang include directory]) ], [ ERLANG_FLAGS="-I$withval" ], [ realerl=`readlink -f $ERL 2>/dev/null` AS_IF([test $? -eq 0], [ erlbase=`dirname $realerl` erlbase=`dirname $erlbase` ERLANG_FLAGS="-I${erlbase}/usr/include" ], [ # Failed to figure out where erl is installed.. # try to add some default directories to search ERLANG_FLAGS="-I${libdir}/erlang/usr/include" ERLANG_FLAGS="$ERLANG_FLAGS -I/usr/lib/erlang/usr/include" ERLANG_FLAGS="$ERLANG_FLAGS -I/usr/local/lib/erlang/usr/include" ERLANG_FLAGS="$ERLANG_FLAGS -I/opt/local/lib/erlang/usr/include" ]) ]) AC_SUBST(ERLANG_FLAGS) PKG_CHECK_MODULES([JS], [mozjs185], [ JS_LIB_DIR="$(${PKG_CONFIG} --variable=libdir mozjs185)" ], [ PKG_CHECK_MODULES([JS], [mozilla-js >= 1.7], [ JS_LIB_DIR="$(${PKG_CONFIG} --variable=sdkdir mozilla-js)/lib" ], [ JS_LIB_DIR="${libdir}" JS_CFLAGS="-I/usr/include" JS_CFLAGS="$JS_CFLAGS -I/usr/include/js" JS_CFLAGS="$JS_CFLAGS -I/usr/include/mozjs" JS_CFLAGS="$JS_CFLAGS -I/usr/local/include/js" JS_CFLAGS="$JS_CFLAGS -I/opt/local/include/js" ]) ]) AC_ARG_WITH([js-include], [AS_HELP_STRING([--with-js-include=PATH], [set PATH to the SpiderMonkey include directory]) ], [ JS_INCLUDE="$withval" JS_CFLAGS="-I$JS_INCLUDE" ], []) AC_ARG_WITH([js-lib], [AS_HELP_STRING([--with-js-lib=PATH], [set PATH to the SpiderMonkey library directory]) ], [ JS_LIB_DIR=$withval JS_LIBS="-L$withval" ], []) use_js_trunk=no AC_ARG_ENABLE([js-trunk], [AS_HELP_STRING([--enable-js-trunk], [allow use of SpiderMonkey versions newer than js185-1.0.0]) ], [ use_js_trunk=$enableval ], []) AC_ARG_VAR([ERLC_FLAGS], [general flags to prepend to ERLC_FLAGS]) AC_ARG_VAR([FLAGS], [general flags to prepend to LDFLAGS and CPPFLAGS]) AS_CASE([$(uname -s)], [CYGWIN*], [] , [*], [ CPPFLAGS="$CPPFLAGS -I/opt/local/include" CPPFLAGS="$CPPFLAGS -I/opt/local/include/js" CPPFLAGS="$CPPFLAGS -I/usr/local/include" CPPFLAGS="$CPPFLAGS -I/usr/local/include/js" CPPFLAGS="$CPPFLAGS -I/usr/include" CPPFLAGS="$CPPFLAGS -I/usr/include/js" LDFLAGS="$LDFLAGS -L/opt/local/lib" LDFLAGS="$LDFLAGS -L/usr/local/lib" ]) CPPFLAGS="$CPPFLAGS $FLAGS" LDFLAGS="$LDFLAGS $FLAGS" # The erlang cc.sh/ld.sh scripts will convert a -O option # into the same optimization flags erlang itself uses. CFLAGS="-O2 $CFLAGS" LIBS="$LIBS $LDFLAGS" AS_CASE([$(uname -s)], [CYGWIN*], [ JS_CFLAGS="-DXP_WIN $JS_CFLAGS" IS_WINDOWS="TRUE" ], [*], [ # XP_UNIX required for jsapi.h, tested on Linux and Darwin. JS_CFLAGS="-DXP_UNIX $JS_CFLAGS" ]) AM_CONDITIONAL([WINDOWS], [test x$IS_WINDOWS = xTRUE]) OLD_LIBS="$LIBS" LIBS="$JS_LIBS $LIBS" OLD_CPPFLAGS="$CPPFLAGS" CPPFLAGS="$JS_CFLAGS $CPPFLAGS" AC_CHECK_HEADER([jsapi.h], [], [ AC_CHECK_HEADER([js/jsapi.h], [ CPPFLAGS="$CPPFLAGS -I$JS_INCLUDE/js" ], [ AC_MSG_ERROR([Could not find the jsapi header. Are the Mozilla SpiderMonkey headers installed?]) ]) ]) AC_CHECK_LIB([mozjs185], [JS_NewContext], [JS_LIB_BASE=mozjs185], [ AC_CHECK_LIB([mozjs185-1.0], [JS_NewContext], [JS_LIB_BASE=mozjs185-1.0], [ AC_CHECK_LIB([mozjs], [JS_NewContext], [JS_LIB_BASE=mozjs], [ AC_CHECK_LIB([js], [JS_NewContext], [JS_LIB_BASE=js], [ AC_CHECK_LIB([js3250], [JS_NewContext], [JS_LIB_BASE=js3250], [ AC_CHECK_LIB([js32], [JS_NewContext], [JS_LIB_BASE=js32], [ AC_MSG_ERROR([Could not find the js library. Is the Mozilla SpiderMonkey library installed?]) ]) ]) ]) ]) ]) ]) # Figure out what version of SpiderMonkey to use AC_CHECK_LIB([$JS_LIB_BASE], [JS_NewCompartmentAndGlobalObject], # Prevent people from accidentally using SpiderMonkey's that are too new if test "$use_js_trunk" = "no"; then AC_CHECK_DECL([JSOPTION_ANONFUNFIX], [], [ AC_MSG_ERROR([Your SpiderMonkey library is too new. Versions of SpiderMonkey after the js185-1.0.0 release remove the optional enforcement of preventing anonymous functions in a statement context. This will most likely break your existing JavaScript code as well as render all example code invalid. If you wish to ignore this error pass --enable-js-trunk to ./configure.]) ], [ [#include ] ]) fi AC_DEFINE([SM185], [1], [Use SpiderMonkey 1.8.5]) ) AC_CHECK_LIB([$JS_LIB_BASE], [JS_ThrowStopIteration], AC_DEFINE([SM180], [1], [Use SpiderMonkey 1.8.0]) ) AC_CHECK_LIB([$JS_LIB_BASE], [JS_GetStringCharsAndLength], AC_DEFINE([HAVE_JS_GET_STRING_CHARS_AND_LENGTH], [1], [Use newer JS_GetCharsAndLength function.]) ) # Else, hope that 1.7.0 works # Deal with JSScript to JSObject to JSScript switcheroo AC_CHECK_TYPE([JSScript*], [AC_DEFINE([JSSCRIPT_TYPE], [JSScript*], [Use JSObject* for scripts])], [AC_DEFINE([JSSCRIPT_TYPE], [JSObject*], [Use JSScript* for scripts])], [[#include ]] ) AC_DEFINE([COUCHJS_NAME], ["couchjs"], ["CouchJS executable name."]) if test x${IS_WINDOWS} = xTRUE; then AC_DEFINE([COUCHJS_NAME], ["couchjs.exe"], ["CouchJS executable name."]) if test -f "$JS_LIB_DIR/$JS_LIB_BASE.dll"; then # seamonkey 1.7- build layout on Windows JS_LIB_BINARY="$JS_LIB_DIR/$JS_LIB_BASE.dll" else # seamonkey 1.8+ build layout on Windows if test -f "$JS_LIB_DIR/../bin/$JS_LIB_BASE.dll"; then JS_LIB_BINARY="$JS_LIB_DIR/../bin/$JS_LIB_BASE.dll" else AC_MSG_ERROR([Could not find $JS_LIB_BASE.dll.]) fi fi AC_SUBST(JS_LIB_BINARY) # On windows we need to know the path to the openssl binaries. AC_ARG_WITH([openssl-bin-dir], [AS_HELP_STRING([--with-openssl-bin-dir=PATH], [path to the open ssl binaries for distribution on Windows]) ], [ openssl_bin_dir=`cygpath -m "$withval"` AC_SUBST(openssl_bin_dir) ], []) # Windows uses Inno setup - look for its compiler. AC_PATH_PROG([INNO_COMPILER_EXECUTABLE], [iscc]) if test x${INNO_COMPILER_EXECUTABLE} = x; then AC_MSG_WARN([You will be unable to build the Windows installer.]) fi # We need the msvc redistributables for this platform too # (in theory we could just install the assembly locally - but # there are at least 4 directories with binaries, meaning 4 copies; # so using the redist .exe means it ends up installed globally...) AC_ARG_WITH([msvc-redist-dir], [AS_HELP_STRING([--with-msvc-redist-dir=PATH], [path to the msvc redistributables for the Windows platform]) ], [ msvc_redist_dir=`cygpath -m "$withval"` msvc_redist_name="vcredist_x86.exe" AC_SUBST(msvc_redist_dir) AC_SUBST(msvc_redist_name) ], []) if test ! -f ${msvc_redist_dir}/${msvc_redist_name}; then AC_MSG_WARN([Installer may fail due to missing MSVC redistributable.]) fi fi JS_LIBS="-l$JS_LIB_BASE -lm $JS_LIBS" AC_SUBST(JS_LIBS) LIBS="$OLD_LIBS" CPPFLAGS="$OLD_CPPFLAGS" %% auto detect "kegged" icu4c on Mac / Homebrew PATH="/usr/local/opt/icu4c/bin:$PATH" AC_ARG_WITH([win32-icu-binaries], [AS_HELP_STRING([--with-win32-icu-binaries=PATH], [set PATH to the Win32 native ICU binaries directory]) ], [ ICU_CPPFLAGS="-I$withval/include" ICU_LIBS="-L$withval/lib -licuuc -licudt -licuin" ICU_BIN=$withval/bin ], [ AX_CHECK_ICU([3.4.1]) ICU_BIN= ]) AC_SUBST(ICU_CFLAGS) AC_SUBST(ICU_CPPFLAGS) AC_SUBST(ICU_LIBS) AC_SUBST(ICU_BIN) use_curl=yes AC_ARG_WITH([win32-curl], [AS_HELP_STRING([--with-win32-curl=PATH], [set PATH to the Win32 native curl directory]) ], [ # default build on windows is a static lib, and that's what we want too CURL_CFLAGS="-I$withval/include -DCURL_STATICLIB" CURL_LIBS="-L$withval/lib -llibcurl -lWs2_32 -lkernel32 -luser32 -ladvapi32 -lWldap32" # OpenSSL libraries may be pulled in via libcurl if it was built with SSL # these are libeay32 ssleay32 instead of crypto ssl on unix ], [ AX_LIB_CURL([7.18.0],[ AC_DEFINE([HAVE_CURL], [1], ["Provide HTTP support to couchjs"]) ],[ AC_MSG_WARN([You will be unable to run some JavaScript unit tests.]) use_curl=no CURL_LIBS= ]) ]) AC_SUBST(CURL_CFLAGS) AC_SUBST(CURL_LIBS) case "$(uname -s)" in Linux) LIBS="$LIBS -lcrypt" CPPFLAGS="-D_XOPEN_SOURCE $CPPFLAGS" ;; FreeBSD) LIBS="$LIBS -lcrypt" ;; OpenBSD) LIBS="$LIBS -lcrypto" ;; esac { $as_echo "$as_me:${as_lineno-$LINENO}: checking Erlang version compatibility" >&5 $as_echo_n "checking Erlang version compatibility... " >&6; } erlang_version_error="The installed Erlang version must be >= R14B (erts-5.8.1) and =< 17 (erts-6.0)" version="`${ERL} -version 2>&1 | ${SED} 's/[[^0-9]]/ /g'` 0 0 0" major_version=`echo $version | ${AWK} "{print \\$1}"` minor_version=`echo $version | ${AWK} "{print \\$2}"` patch_version=`echo $version | ${AWK} "{print \\$3}"` echo -n "detected Erlang version: $major_version.$minor_version.$patch_version..." if test $major_version -lt 5 -o $major_version -gt 6; then as_fn_error $? "$erlang_version_error major_version does not match" "$LINENO" 5 fi if test $major_version -eq 5 -a $minor_version -lt 8; then as_fn_error $? "$erlang_version_error minor_version does not match" "$LINENO" 5 fi AC_MSG_RESULT(compatible) # returns 17 for erts-6.0, and R14B03 or similar for earlier releases otp_release="`\ ${ERL} -noshell \ -eval 'io:put_chars(erlang:system_info(otp_release)).' \ -s erlang halt`" AC_SUBST(otp_release) AM_CONDITIONAL([USE_OTP_NIFS], [can_use_nifs=$(echo $otp_release | grep -E "^(R14B|R15|R16|17)")]) AM_CONDITIONAL([USE_EJSON_COMPARE_NIF], [can_use_ejson=$(echo $otp_release | grep -E "^(R14B03|R15|R16|17)")]) has_crypto=`\ ${ERL} -eval "\ case application:load(crypto) of ok -> ok; _ -> exit(no_crypto) end. \ " -noshell -s init stop` if test -n "$has_crypto"; then AC_MSG_ERROR([Could not find the Erlang crypto library. Has Erlang been compiled with OpenSSL support?]) fi AC_PATH_PROG([ERLC], [erlc]) if test x${ERLC} = x; then AC_MSG_ERROR([Could not find the `erlc' executable. Is Erlang installed?]) fi OLD_CPPFLAGS="$CPPFLAGS" CPPFLAGS="$ERLANG_FLAGS $CPPFLAGS" AC_CHECK_HEADER([erl_driver.h], [], [ AC_MSG_ERROR([Could not find the `erl_driver.h' header. Are the Erlang headers installed? Use the `--with-erlang' option to specify the Erlang include directory.]) ]) CPPFLAGS="$OLD_CPPFLAGS" use_init=yes use_launchd=yes native_mochijson_enabled=no tests_enabled=yes docs_enabled=yes strictness_enabled=no AC_ARG_ENABLE([init], [AS_HELP_STRING([--disable-init], [don't install init script where applicable]) ], [ use_init=$enableval ], []) AC_ARG_ENABLE([launchd], [AS_HELP_STRING([--disable-launchd], [don't install launchd configuration where applicable]) ], [ use_launchd=$enableval ], []) AC_ARG_ENABLE([native-mochijson], [AS_HELP_STRING([--enable-native-mochijson], [compile mochijson to native code (EXPERIMENTAL)]) ], [ native_mochijson_enabled=$enableval ], []) AC_ARG_ENABLE([tests], [AS_HELP_STRING([--disable-tests], [skip tests during build]) ], [ tests_enabled=$enableval ], []) AC_ARG_ENABLE([docs], [AS_HELP_STRING([--disable-docs], [skip docs during build]) ], [ docs_enabled=$enableval ], []) AC_ARG_ENABLE([strictness], [AS_HELP_STRING([--enable-strictness], [exit when optional checks fail]) ], [ strictness_enabled=$enableval ], []) init_enabled=false launchd_enabled=false if test "$use_init" = "yes"; then AC_MSG_CHECKING(location of init directory) if test -d /etc/rc.d; then init_enabled=true AC_SUBST([initdir], ['${sysconfdir}/rc.d']) AC_MSG_RESULT(${initdir}) else if test -d /etc/init.d; then init_enabled=true AC_SUBST([initdir], ['${sysconfdir}/init.d']) AC_MSG_RESULT(${initdir}) else AC_MSG_RESULT(not found) fi fi fi if test "$use_launchd" = "yes"; then AC_MSG_CHECKING(location of launchd directory) if test -d /Library/LaunchDaemons; then init_enabled=false launchd_enabled=true AC_SUBST([launchddir], ['${prefix}/Library/LaunchDaemons']) AC_MSG_RESULT(${launchddir}) else AC_MSG_RESULT(not found) fi fi AC_CHECK_PROG([HAS_HELP2MAN], [help2man], [yes]) if test x${HAS_HELP2MAN} = x; then if test x${strictness_enabled} = xyes; then AC_MSG_ERROR([Could not find the `help2man' executable.]) else AC_MSG_WARN([You will be unable to regenerate man pages.]) fi fi AC_CHECK_PROG([HAS_PDFLATEX], [pdflatex], [yes]) if test x${HAS_PDFLATEX} = x; then if test x${strictness_enabled} = xyes; then AC_MSG_ERROR([Could not find the `pdflatex' executable. Is LaTeX installed?]) else AC_MSG_WARN([You will be unable to regenerate PDF documentation.]) fi fi AC_CHECK_PROG([HAS_MAKEINFO], [makeinfo], [yes]) if test x${HAS_MAKEINFO} = x; then if test x${strictness_enabled} = xyes; then AC_MSG_ERROR([Could not find the `makeinfo' executable. Is GNU Texinfo installed?]) else AC_MSG_WARN([You will be unable to regenerate info documentation.]) fi fi AC_CHECK_PROG([HAS_INSTALLINFO], [install-info], [yes]) if test x${HAS_INSTALLINFO} = x; then if test x${strictness_enabled} = xyes; then AC_MSG_ERROR([Could not find the `install-info' executable. Is GNU Texinfo installed?]) else AC_MSG_WARN([You will be unable to install info documentation.]) fi fi AC_CHECK_PROG([HAS_SPHINX_BUILD], [sphinx-build], [yes]) if test x${HAS_SPHINX_BUILD} = x; then if test x${strictness_enabled} = xyes; then AC_MSG_ERROR([Could not find the `sphinx-build' executable.]) else AC_MSG_WARN([You will be unable to regenerate documentation.]) fi fi if test x${docs_enabled} = xyes; then if test x${HAS_HELP2MAN} = xyes; then build_man=yes fi if test x${HAS_SPHINX_BUILD} = xyes; then build_html=yes if test x${HAS_MAKEINFO} = xyes; then build_info=yes fi if test x${HAS_PDFLATEX} = xyes; then build_pdf=yes fi fi fi if test x${strictness_enabled} = xyes; then AX_PYTHON_MODULE([pygments], [fatal]) else AX_PYTHON_MODULE([pygments]) fi AC_MSG_CHECKING(pygments version >= 1.5) python 2> /dev/null << EOF import sys import pygments if float(pygments.__version__) >= 1.5: sys.exit(0) else: sys.exit(1) EOF if test $? -eq 0; then AC_MSG_RESULT(yes) else AC_MSG_RESULT(no) if test x${strictness_enabled} = xyes; then AC_MSG_ERROR([Your copy of pygments is out of date.], 1) else AC_MSG_WARN([Syntax highlighting may not work.]) fi fi ERL_VERSION_COMMAND="${ESCRIPT} bin/erlang-version.escript" erlangversion=`${ERL_VERSION_COMMAND}` AC_ARG_VAR([ERL], [path to the `erl' executable]) AC_ARG_VAR([ERLC], [path to the `erlc' executable]) AM_CONDITIONAL([INIT], [test x${init_enabled} = xtrue]) AM_CONDITIONAL([LAUNCHD], [test x${launchd_enabled} = xtrue]) AM_CONDITIONAL([USE_NATIVE_MOCHIJSON], [test x${native_mochijson_enabled} = xyes]) AM_CONDITIONAL([USE_CURL], [test x${use_curl} = xyes]) AM_CONDITIONAL([BUILD_MAN], [test x${build_man} = xyes]) AM_CONDITIONAL([BUILD_INFO], [test x${build_info} = xyes]) AM_CONDITIONAL([BUILD_PDF], [test x${build_pdf} = xyes]) AM_CONDITIONAL([BUILD_HTML], [test x${build_html} = xyes]) AM_CONDITIONAL([TESTS], [test x${tests_enabled} = xyes]) AM_CONDITIONAL([STRICTNESS], [test x${strictness_enabled} = xyes]) AC_SUBST([package_author_name], ["LOCAL_PACKAGE_AUTHOR_NAME"]) AC_SUBST([package_author_address], ["LOCAL_PACKAGE_AUTHOR_ADDRESS"]) AC_SUBST([package_identifier], ["LOCAL_PACKAGE_IDENTIFIER"]) AC_SUBST([package_tarname], ["LOCAL_PACKAGE_TARNAME"]) AC_SUBST([package_name], ["LOCAL_PACKAGE_NAME"]) AC_SUBST([version], ["LOCAL_VERSION"]) AC_SUBST([version_major], ["LOCAL_VERSION_MAJOR"]) AC_SUBST([version_minor], ["LOCAL_VERSION_MINOR"]) AC_SUBST([version_revision], ["LOCAL_VERSION_REVISION"]) AC_SUBST([version_stage], ["LOCAL_VERSION_STAGE"]) AC_SUBST([version_release], ["LOCAL_VERSION_RELEASE"]) AC_SUBST([bug_uri], ["LOCAL_BUG_URI"]) AC_SUBST([localconfdir], [${sysconfdir}/${package_identifier}]) AC_SUBST([localdatadir], [${datadir}/${package_identifier}]) AC_SUBST([localdocdir], [${datadir}/doc/${package_identifier}]) AC_SUBST([locallibdir], [${libdir}/${package_identifier}]) AC_SUBST([localstatelibdir], [${localstatedir}/lib/${package_identifier}]) AC_SUBST([localstatelogdir], [${localstatedir}/log/${package_identifier}]) AC_SUBST([localstaterundir], [${localstatedir}/run/${package_identifier}]) AC_SUBST([erlangversion], [${erlangversion}]) AC_SUBST([erlangbin], [${ERL}]) # On Windows we install directly into our erlang distribution. if test x${IS_WINDOWS} = xTRUE; then AC_SUBST([locallibbindir], [${prefix}/bin]) AC_SUBST([localerlanglibdir], [${libdir}]) else AC_SUBST([locallibbindir], [${locallibdir}/bin]) AC_SUBST([localerlanglibdir], [${locallibdir}/erlang/lib]) fi # fix for older autotools that don't define "abs_top_YYY" by default AC_SUBST(abs_top_srcdir) AC_SUBST(abs_top_builddir) AC_REVISION([LOCAL_VERSION]) AC_CONFIG_FILES([Makefile]) AC_CONFIG_FILES([bin/couch-config.tpl]) AC_CONFIG_FILES([bin/couchdb.tpl]) AC_CONFIG_FILES([bin/couchdb.bat.tpl]) AC_CONFIG_FILES([bin/Makefile]) AC_CONFIG_FILES([etc/couchdb/Makefile]) AC_CONFIG_FILES([etc/couchdb/default.ini.tpl]) AC_CONFIG_FILES([etc/default/Makefile]) AC_CONFIG_FILES([etc/init/couchdb.tpl]) AC_CONFIG_FILES([etc/init/Makefile]) AC_CONFIG_FILES([etc/launchd/org.apache.couchdb.plist.tpl]) AC_CONFIG_FILES([etc/launchd/Makefile]) AC_CONFIG_FILES([etc/logrotate.d/couchdb.tpl]) AC_CONFIG_FILES([etc/logrotate.d/Makefile]) AC_CONFIG_FILES([etc/windows/Makefile]) AC_CONFIG_FILES([etc/Makefile]) AC_CONFIG_FILES([share/Makefile]) AC_CONFIG_FILES([share/doc/Makefile]) AC_CONFIG_FILES([share/doc/build/Makefile]) AC_CONFIG_FILES([src/Makefile]) AC_CONFIG_FILES([src/couch_dbupdates/Makefile]) AC_CONFIG_FILES([src/couch_index/Makefile]) AC_CONFIG_FILES([src/couch_mrview/Makefile]) AC_CONFIG_FILES([src/couch_plugins/Makefile]) AC_CONFIG_FILES([src/couch_replicator/Makefile]) AC_CONFIG_FILES([src/couchjs-node/Makefile]) AC_CONFIG_FILES([src/couchdb/couch.app.tpl]) AC_CONFIG_FILES([src/couchdb/Makefile]) AC_CONFIG_FILES([src/couchdb/priv/Makefile]) AC_CONFIG_FILES([src/erlang-oauth/Makefile]) AC_CONFIG_FILES([src/etap/Makefile]) AC_CONFIG_FILES([src/ibrowse/Makefile]) AC_CONFIG_FILES([src/mochiweb/Makefile]) AC_CONFIG_FILES([src/snappy/Makefile]) AC_CONFIG_FILES([src/snappy/google-snappy/snappy-stubs-public.h]) AC_CONFIG_FILES([src/ejson/Makefile]) AC_CONFIG_FILES([test/Makefile]) AC_CONFIG_FILES([test/bench/Makefile]) AC_CONFIG_FILES([test/etap/Makefile]) AC_CONFIG_FILES([test/etap/test_util.erl]) AC_CONFIG_FILES([test/javascript/Makefile]) AC_CONFIG_FILES([test/view_server/Makefile]) AC_CONFIG_FILES([utils/Makefile]) AC_CONFIG_FILES([var/Makefile]) AC_OUTPUT # Windows Erlang build tools wrap Microsoft's linker and compiler just enough # to be able to build Erlang/OTP successfully, but not enough for full # compatibility with GNU AutoTools. The MS VC compiler and linker are # hidden from autotools in Erlang's cc.sh and ld.sh wrappers. GNU autoconf # identifies this dastardly mix as a unix variant, and libtool kindly # passes incorrect flags and names through to the MS linker. The simplest fix # is to modify libtool via sed to remove those options. # # As this is only done once at first configure, and subsequent config or source # changes may trigger a silent reversion to the non-functioning original. # # Changes are; # # 1. replace LIB$name with $name in libname_spec (e.g. libicu -> icu) to ensure # correct windows versions of .lib and .dlls are found or generated. # 2. remove incompatible \w-link\w from archive_cmds # 3. remove GNU-style directives to be passed through to the linker # 4. swap GNU-style shared library flags with MS -dll variant # # This obscene hackery is tracked under COUCHDB-440 and COUCHDB-1197. if test x${IS_WINDOWS} = xTRUE; then mv libtool libtool.dist /bin/sed -E -e 's,^libname_spec="lib,libname_spec=",' \ -e 's,( -link ), ,' \ -e 's,-Xlinker --out-implib -Xlinker \\\$lib,,' \ -e 's,(-shared -nostdlib), -dll ,' \ < libtool.dist > libtool # probably would chmod +x if we weren't on windows... fi echo echo "You have configured Apache CouchDB, time to relax." echo echo "Run \`make && sudo make install' to install." apache-couchdb-1.6.0/Makefile.am0000644000175000001440000000733412332105522016361 0ustar00djcusers00000000000000## Licensed under the Apache License, Version 2.0 (the "License"); you may not ## use this file except in compliance with the License. You may obtain a copy of ## the License at ## ## http://www.apache.org/licenses/LICENSE-2.0 ## ## Unless required by applicable law or agreed to in writing, software ## distributed under the License is distributed on an "AS IS" BASIS, WITHOUT ## WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the ## License for the specific language governing permissions and limitations under ## the License. SUBDIRS = bin etc src share test var utils ACLOCAL_AMFLAGS = -I m4 localdoc_DATA = \ AUTHORS.gz \ BUGS.gz \ DEVELOPERS.gz \ INSTALL.gz \ INSTALL.Unix.gz \ INSTALL.Windows.gz \ LICENSE.gz \ NOTICE.gz \ README.gz \ THANKS.gz DISTCLEANFILES = $(localdoc_DATA) EXTRA_DIST = \ AUTHORS \ BUGS \ DEVELOPERS \ INSTALL \ INSTALL.Unix \ INSTALL.Windows \ LICENSE \ NOTICE \ README.rst \ THANKS \ build-aux/dist-error \ build-aux/sphinx-build \ build-aux/sphinx-touch \ license.skip \ Vagrantfile AUTHORS.gz: AUTHORS gzip -9 < $< > $@ BUGS.gz: BUGS gzip -9 < $< > $@ DEVELOPERS.gz: DEVELOPERS gzip -9 < $< > $@ INSTALL.gz: INSTALL gzip -9 < $< > $@ INSTALL.Unix.gz: INSTALL.Unix gzip -9 < $< > $@ INSTALL.Windows.gz: INSTALL.Windows gzip -9 < $< > $@ LICENSE.gz: LICENSE gzip -9 < $< > $@ NOTICE.gz: NOTICE gzip -9 < $< > $@ README.gz: README.rst gzip -9 < $< > $@ THANKS.gz: THANKS gzip -9 < $< > $@ check: dev check-js if TESTS $(top_builddir)/test/etap/run $(top_srcdir)/test/etap endif check-js: dev if TESTS if USE_CURL MAKE=$(MAKE) $(top_builddir)/test/javascript/run endif endif check-etap: dev if TESTS $(top_builddir)/test/etap/run $(top_srcdir)/test/etap endif cover: dev if TESTS rm -f cover/*.coverdata COVER=1 COVER_BIN=./src/couchdb/ $(top_builddir)/test/etap/run SRC=./src/couchdb/ \ $(ERL) -noshell \ -pa src/etap \ -eval 'etap_report:create()' \ -s init stop > /dev/null 2>&1 endif dev: all if TESTS @echo "This command is intended for developers to use;" @echo "it creates development ini files as well as a" @echo "$(top_builddir)/tmp structure for development runtime files." @echo "Use ./utils/run to launch CouchDB from the source tree." mkdir -p $(top_builddir)/etc/couchdb/default.d mkdir -p $(top_builddir)/etc/couchdb/local.d mkdir -p $(top_builddir)/tmp/lib mkdir -p $(top_builddir)/tmp/log mkdir -p $(top_builddir)/tmp/run/couchdb mkdir -p $(top_builddir)/tmp/plugins endif install-data-hook: @echo @echo "You have installed Apache CouchDB, time to relax." distclean-local: rm -fr $(top_builddir)/etc/couchdb/default.d rm -fr $(top_builddir)/etc/couchdb/local.d rm -fr $(top_builddir)/tmp rm -f $(top_builddir)/couchdb.stdout rm -f $(top_builddir)/couchdb.stderr .PHONY: local-clean local-clean: maintainer-clean @echo "This command is intended for maintainers to use;" @echo "it deletes files that may need special tools to rebuild." rm -f $(top_srcdir)/INSTALL rm -f $(top_srcdir)/acinclude.m4 rm -f $(top_srcdir)/aclocal.m4 rm -f $(top_srcdir)/config.h.in rm -f $(top_srcdir)/configure rm -f $(top_srcdir)/test/etap/temp.* rm -f $(top_srcdir)/*.tar.gz rm -f $(top_srcdir)/*.tar.gz.* find $(top_srcdir) -name Makefile.in -exec rm -f {} \; dist-hook: find $(top_srcdir) -type f -name "._*" -exec rm -f {} \; find $(top_builddir) -type f -name "._*" -exec rm -f {} \; distcheck-hook: $(MAKE) -C bin distcheck-hook $(MAKE) -C src/couchdb/priv distcheck-hook $(MAKE) -C share/doc/build distcheck-hook grep -rL 'http://www.apache.org/licenses/LICENSE-2.0' * \ | grep --include= -vEf $(top_srcdir)/license.skip; \ test "$$?" -eq 1 apache-couchdb-1.6.0/Makefile.in0000644000175000001440000010020412332105553016364 0ustar00djcusers00000000000000# Makefile.in generated by automake 1.11.6 from Makefile.am. # @configure_input@ # Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, # 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011 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__make_dryrun = \ { \ am__dry=no; \ case $$MAKEFLAGS in \ *\\[\ \ ]*) \ echo 'am--echo: ; @echo "AM" OK' | $(MAKE) -f - 2>/dev/null \ | grep '^AM OK$$' >/dev/null || am__dry=yes;; \ *) \ for am__flg in $$MAKEFLAGS; do \ case $$am__flg in \ *=*|--*) ;; \ *n*) am__dry=yes; break;; \ esac; \ done;; \ esac; \ test $$am__dry = yes; \ } 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 = . DIST_COMMON = $(am__configure_deps) $(srcdir)/Makefile.am \ $(srcdir)/Makefile.in $(srcdir)/config.h.in \ $(top_srcdir)/configure \ $(top_srcdir)/src/snappy/google-snappy/config.h.in \ $(top_srcdir)/src/snappy/google-snappy/snappy-stubs-public.h.in \ AUTHORS THANKS build-aux/config.guess build-aux/config.sub \ build-aux/depcomp build-aux/install-sh build-aux/ltmain.sh \ build-aux/missing ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 am__aclocal_m4_deps = $(top_srcdir)/m4/libtool.m4 \ $(top_srcdir)/m4/ltoptions.m4 $(top_srcdir)/m4/ltsugar.m4 \ $(top_srcdir)/m4/ltversion.m4 $(top_srcdir)/m4/lt~obsolete.m4 \ $(top_srcdir)/acinclude.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 \ $(top_builddir)/src/snappy/google-snappy/config.h CONFIG_CLEAN_FILES = src/snappy/google-snappy/snappy-stubs-public.h CONFIG_CLEAN_VPATH_FILES = SOURCES = DIST_SOURCES = RECURSIVE_TARGETS = all-recursive check-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 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)$(localdocdir)" DATA = $(localdoc_DATA) RECURSIVE_CLEAN_TARGETS = mostlyclean-recursive clean-recursive \ distclean-recursive maintainer-clean-recursive AM_RECURSIVE_TARGETS = $(RECURSIVE_TARGETS:-recursive=) \ $(RECURSIVE_CLEAN_TARGETS:-recursive=) tags TAGS ctags CTAGS \ distdir dist dist-all distcheck ETAGS = etags CTAGS = ctags DIST_SUBDIRS = $(SUBDIRS) 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__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 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@ AMTAR = @AMTAR@ AR = @AR@ AS = @AS@ AUTOCONF = @AUTOCONF@ AUTOHEADER = @AUTOHEADER@ AUTOMAKE = @AUTOMAKE@ AWK = @AWK@ CC = @CC@ CCDEPMODE = @CCDEPMODE@ CFLAGS = @CFLAGS@ CPP = @CPP@ CPPFLAGS = @CPPFLAGS@ CURL_CFLAGS = @CURL_CFLAGS@ CURL_CONFIG = @CURL_CONFIG@ CURL_LIBS = @CURL_LIBS@ CXX = @CXX@ CXXCPP = @CXXCPP@ CXXDEPMODE = @CXXDEPMODE@ CXXFLAGS = @CXXFLAGS@ CYGPATH_W = @CYGPATH_W@ DEFS = @DEFS@ DEPDIR = @DEPDIR@ DLLTOOL = @DLLTOOL@ DSYMUTIL = @DSYMUTIL@ DUMPBIN = @DUMPBIN@ ECHO_C = @ECHO_C@ ECHO_N = @ECHO_N@ ECHO_T = @ECHO_T@ EGREP = @EGREP@ ERL = @ERL@ ERLANG_FLAGS = @ERLANG_FLAGS@ ERLC = @ERLC@ ERLC_FLAGS = @ERLC_FLAGS@ ESCRIPT = @ESCRIPT@ EXEEXT = @EXEEXT@ FGREP = @FGREP@ FLAGS = @FLAGS@ GREP = @GREP@ HAS_HELP2MAN = @HAS_HELP2MAN@ HAS_INSTALLINFO = @HAS_INSTALLINFO@ HAS_MAKEINFO = @HAS_MAKEINFO@ HAS_PDFLATEX = @HAS_PDFLATEX@ HAS_SPHINX_BUILD = @HAS_SPHINX_BUILD@ ICU_BIN = @ICU_BIN@ ICU_CFLAGS = @ICU_CFLAGS@ ICU_CONFIG = @ICU_CONFIG@ ICU_CPPFLAGS = @ICU_CPPFLAGS@ ICU_CXXFLAGS = @ICU_CXXFLAGS@ ICU_LIBS = @ICU_LIBS@ INNO_COMPILER_EXECUTABLE = @INNO_COMPILER_EXECUTABLE@ INSTALL = @INSTALL@ INSTALL_DATA = @INSTALL_DATA@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ INSTALL_SCRIPT = @INSTALL_SCRIPT@ INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ JS_CFLAGS = @JS_CFLAGS@ JS_LIBS = @JS_LIBS@ JS_LIB_BINARY = @JS_LIB_BINARY@ LD = @LD@ LDFLAGS = @LDFLAGS@ LIBOBJS = @LIBOBJS@ LIBS = @LIBS@ LIBTOOL = @LIBTOOL@ LIPO = @LIPO@ LN_S = @LN_S@ LTLIBOBJS = @LTLIBOBJS@ MAKEINFO = @MAKEINFO@ MANIFEST_TOOL = @MANIFEST_TOOL@ MKDIR_P = @MKDIR_P@ NM = @NM@ NMEDIT = @NMEDIT@ OBJDUMP = @OBJDUMP@ OBJEXT = @OBJEXT@ OTOOL = @OTOOL@ OTOOL64 = @OTOOL64@ PACKAGE = @PACKAGE@ PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ PACKAGE_NAME = @PACKAGE_NAME@ PACKAGE_STRING = @PACKAGE_STRING@ PACKAGE_TARNAME = @PACKAGE_TARNAME@ PACKAGE_URL = @PACKAGE_URL@ PACKAGE_VERSION = @PACKAGE_VERSION@ PATH_SEPARATOR = @PATH_SEPARATOR@ PKG_CONFIG = @PKG_CONFIG@ PKG_CONFIG_LIBDIR = @PKG_CONFIG_LIBDIR@ PKG_CONFIG_PATH = @PKG_CONFIG_PATH@ RANLIB = @RANLIB@ SED = @SED@ SET_MAKE = @SET_MAKE@ SHELL = @SHELL@ SNAPPY_MAJOR = @SNAPPY_MAJOR@ SNAPPY_MINOR = @SNAPPY_MINOR@ SNAPPY_PATCHLEVEL = @SNAPPY_PATCHLEVEL@ STRIP = @STRIP@ VERSION = @VERSION@ 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@ ac_cv_have_stddef_h = @ac_cv_have_stddef_h@ ac_cv_have_stdint_h = @ac_cv_have_stdint_h@ am__include = @am__include@ am__leading_dot = @am__leading_dot@ am__quote = @am__quote@ am__tar = @am__tar@ am__untar = @am__untar@ bindir = @bindir@ bug_uri = @bug_uri@ 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@ dvidir = @dvidir@ erlangbin = @erlangbin@ erlangversion = @erlangversion@ exec_prefix = @exec_prefix@ host = @host@ host_alias = @host_alias@ host_cpu = @host_cpu@ host_os = @host_os@ host_vendor = @host_vendor@ htmldir = @htmldir@ includedir = @includedir@ infodir = @infodir@ initdir = @initdir@ install_sh = @install_sh@ launchddir = @launchddir@ libdir = @libdir@ libexecdir = @libexecdir@ localconfdir = @localconfdir@ localdatadir = @localdatadir@ localdocdir = @localdocdir@ localedir = @localedir@ localerlanglibdir = @localerlanglibdir@ locallibbindir = @locallibbindir@ locallibdir = @locallibdir@ localstatedir = @localstatedir@ localstatelibdir = @localstatelibdir@ localstatelogdir = @localstatelogdir@ localstaterundir = @localstaterundir@ mandir = @mandir@ mkdir_p = @mkdir_p@ msvc_redist_dir = @msvc_redist_dir@ msvc_redist_name = @msvc_redist_name@ oldincludedir = @oldincludedir@ openssl_bin_dir = @openssl_bin_dir@ otp_release = @otp_release@ package_author_address = @package_author_address@ package_author_name = @package_author_name@ package_identifier = @package_identifier@ package_name = @package_name@ package_tarname = @package_tarname@ 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@ version = @version@ version_major = @version_major@ version_minor = @version_minor@ version_release = @version_release@ version_revision = @version_revision@ version_stage = @version_stage@ SUBDIRS = bin etc src share test var utils ACLOCAL_AMFLAGS = -I m4 localdoc_DATA = \ AUTHORS.gz \ BUGS.gz \ DEVELOPERS.gz \ INSTALL.gz \ INSTALL.Unix.gz \ INSTALL.Windows.gz \ LICENSE.gz \ NOTICE.gz \ README.gz \ THANKS.gz DISTCLEANFILES = $(localdoc_DATA) EXTRA_DIST = \ AUTHORS \ BUGS \ DEVELOPERS \ INSTALL \ INSTALL.Unix \ INSTALL.Windows \ LICENSE \ NOTICE \ README.rst \ THANKS \ build-aux/dist-error \ build-aux/sphinx-build \ build-aux/sphinx-touch \ license.skip \ Vagrantfile all: 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) --foreign'; \ $(am__cd) $(srcdir) && $(AUTOMAKE) --foreign \ && exit 0; \ exit 1;; \ esac; \ done; \ echo ' cd $(top_srcdir) && $(AUTOMAKE) --foreign Makefile'; \ $(am__cd) $(top_srcdir) && \ $(AUTOMAKE) --foreign 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 @if test ! -f $@; then rm -f stamp-h1; else :; fi @if test ! -f $@; then $(MAKE) $(AM_MAKEFLAGS) stamp-h1; else :; fi stamp-h1: $(srcdir)/config.h.in $(top_builddir)/config.status @rm -f stamp-h1 cd $(top_builddir) && $(SHELL) ./config.status config.h $(srcdir)/config.h.in: $(am__configure_deps) ($(am__cd) $(top_srcdir) && $(AUTOHEADER)) rm -f stamp-h1 touch $@ src/snappy/google-snappy/config.h: src/snappy/google-snappy/stamp-h2 @if test ! -f $@; then rm -f src/snappy/google-snappy/stamp-h2; else :; fi @if test ! -f $@; then $(MAKE) $(AM_MAKEFLAGS) src/snappy/google-snappy/stamp-h2; else :; fi src/snappy/google-snappy/stamp-h2: $(top_srcdir)/src/snappy/google-snappy/config.h.in $(top_builddir)/config.status @rm -f src/snappy/google-snappy/stamp-h2 cd $(top_builddir) && $(SHELL) ./config.status src/snappy/google-snappy/config.h distclean-hdr: -rm -f config.h stamp-h1 src/snappy/google-snappy/config.h src/snappy/google-snappy/stamp-h2 src/snappy/google-snappy/snappy-stubs-public.h: $(top_builddir)/config.status $(top_srcdir)/src/snappy/google-snappy/snappy-stubs-public.h.in cd $(top_builddir) && $(SHELL) ./config.status $@ mostlyclean-libtool: -rm -f *.lo clean-libtool: -rm -rf .libs _libs distclean-libtool: -rm -f libtool config.lt install-localdocDATA: $(localdoc_DATA) @$(NORMAL_INSTALL) @list='$(localdoc_DATA)'; test -n "$(localdocdir)" || list=; \ if test -n "$$list"; then \ echo " $(MKDIR_P) '$(DESTDIR)$(localdocdir)'"; \ $(MKDIR_P) "$(DESTDIR)$(localdocdir)" || 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)$(localdocdir)'"; \ $(INSTALL_DATA) $$files "$(DESTDIR)$(localdocdir)" || exit $$?; \ done uninstall-localdocDATA: @$(NORMAL_UNINSTALL) @list='$(localdoc_DATA)'; test -n "$(localdocdir)" || list=; \ files=`for p in $$list; do echo $$p; done | sed -e 's|^.*/||'`; \ dir='$(DESTDIR)$(localdocdir)'; $(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. $(RECURSIVE_TARGETS): @fail= failcom='exit 1'; \ for f in x $$MAKEFLAGS; do \ case $$f in \ *=* | --[!k]*);; \ *k*) failcom='fail=yes';; \ esac; \ done; \ dot_seen=no; \ target=`echo $@ | sed s/-recursive//`; \ list='$(SUBDIRS)'; for subdir in $$list; do \ echo "Making $$target in $$subdir"; \ if test "$$subdir" = "."; then \ dot_seen=yes; \ local_target="$$target-am"; \ else \ local_target="$$target"; \ fi; \ ($(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" $(RECURSIVE_CLEAN_TARGETS): @fail= failcom='exit 1'; \ for f in x $$MAKEFLAGS; do \ case $$f in \ *=* | --[!k]*);; \ *k*) failcom='fail=yes';; \ esac; \ done; \ dot_seen=no; \ case "$@" in \ distclean-* | maintainer-clean-*) list='$(DIST_SUBDIRS)' ;; \ *) list='$(SUBDIRS)' ;; \ esac; \ rev=''; for subdir in $$list; do \ if test "$$subdir" = "."; then :; else \ rev="$$subdir $$rev"; \ fi; \ done; \ rev="$$rev ."; \ target=`echo $@ | sed s/-recursive//`; \ for subdir in $$rev; do \ echo "Making $$target in $$subdir"; \ if test "$$subdir" = "."; then \ local_target="$$target-am"; \ else \ local_target="$$target"; \ fi; \ ($(am__cd) $$subdir && $(MAKE) $(AM_MAKEFLAGS) $$local_target) \ || eval $$failcom; \ done && test -z "$$fail" tags-recursive: list='$(SUBDIRS)'; for subdir in $$list; do \ test "$$subdir" = . || ($(am__cd) $$subdir && $(MAKE) $(AM_MAKEFLAGS) tags); \ done ctags-recursive: list='$(SUBDIRS)'; for subdir in $$list; do \ test "$$subdir" = . || ($(am__cd) $$subdir && $(MAKE) $(AM_MAKEFLAGS) ctags); \ done ID: $(HEADERS) $(SOURCES) $(LISP) $(TAGS_FILES) list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | \ $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ END { if (nonempty) { for (i in files) print i; }; }'`; \ mkid -fID $$unique tags: TAGS TAGS: tags-recursive $(HEADERS) $(SOURCES) config.h.in $(TAGS_DEPENDENCIES) \ $(TAGS_FILES) $(LISP) 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; \ list='$(SOURCES) $(HEADERS) config.h.in $(LISP) $(TAGS_FILES)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | \ $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ END { if (nonempty) { for (i in files) print i; }; }'`; \ 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 CTAGS: ctags-recursive $(HEADERS) $(SOURCES) config.h.in $(TAGS_DEPENDENCIES) \ $(TAGS_FILES) $(LISP) list='$(SOURCES) $(HEADERS) config.h.in $(LISP) $(TAGS_FILES)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | \ $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ END { if (nonempty) { for (i in files) print i; }; }'`; \ 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" distclean-tags: -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags 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__remove_distdir) dist-bzip2: distdir tardir=$(distdir) && $(am__tar) | BZIP2=$${BZIP2--9} bzip2 -c >$(distdir).tar.bz2 $(am__remove_distdir) dist-lzip: distdir tardir=$(distdir) && $(am__tar) | lzip -c $${LZIP_OPT--9} >$(distdir).tar.lz $(am__remove_distdir) dist-lzma: distdir tardir=$(distdir) && $(am__tar) | lzma -9 -c >$(distdir).tar.lzma $(am__remove_distdir) dist-xz: distdir tardir=$(distdir) && $(am__tar) | XZ_OPT=$${XZ_OPT--e} xz -c >$(distdir).tar.xz $(am__remove_distdir) dist-tarZ: distdir tardir=$(distdir) && $(am__tar) | compress -c >$(distdir).tar.Z $(am__remove_distdir) dist-shar: distdir shar $(distdir) | GZIP=$(GZIP_ENV) gzip -c >$(distdir).shar.gz $(am__remove_distdir) dist-zip: distdir -rm -f $(distdir).zip zip -rq $(distdir).zip $(distdir) $(am__remove_distdir) dist dist-all: distdir tardir=$(distdir) && $(am__tar) | GZIP=$(GZIP_ENV) gzip -c >$(distdir).tar.gz $(am__remove_distdir) # This target untars the dist file and tries a VPATH configuration. Then # it guarantees that the distribution is self-contained by making another # tarfile. distcheck: dist 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.lzma*) \ lzma -dc $(distdir).tar.lzma | $(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 mkdir $(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-$$$$/" \ && $(MAKE) $(AM_MAKEFLAGS) distcheck-hook \ && am__cwd=`pwd` \ && $(am__cd) $(distdir)/_build \ && ../configure --srcdir=.. --prefix="$$dc_install_base" \ $(AM_DISTCHECK_CONFIGURE_FLAGS) \ $(DISTCHECK_CONFIGURE_FLAGS) \ && $(MAKE) $(AM_MAKEFLAGS) \ && $(MAKE) $(AM_MAKEFLAGS) dvi \ && $(MAKE) $(AM_MAKEFLAGS) check \ && $(MAKE) $(AM_MAKEFLAGS) install \ && $(MAKE) $(AM_MAKEFLAGS) installcheck \ && $(MAKE) $(AM_MAKEFLAGS) uninstall \ && $(MAKE) $(AM_MAKEFLAGS) distuninstallcheck_dir="$$dc_install_base" \ distuninstallcheck \ && chmod -R a-w "$$dc_install_base" \ && ({ \ (cd ../.. && 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__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: check-recursive all-am: Makefile $(DATA) config.h installdirs: installdirs-recursive installdirs-am: for dir in "$(DESTDIR)$(localdocdir)"; 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) -test -z "$(DISTCLEANFILES)" || rm -f $(DISTCLEANFILES) 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 $(am__CONFIG_DISTCLEAN_FILES) -rm -f Makefile distclean-am: clean-am distclean-generic distclean-hdr \ distclean-libtool distclean-local distclean-tags dvi: dvi-recursive dvi-am: html: html-recursive html-am: info: info-recursive info-am: install-data-am: install-localdocDATA @$(NORMAL_INSTALL) $(MAKE) $(AM_MAKEFLAGS) install-data-hook 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 $(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-localdocDATA .MAKE: $(RECURSIVE_CLEAN_TARGETS) $(RECURSIVE_TARGETS) all \ ctags-recursive install-am install-data-am install-strip \ tags-recursive .PHONY: $(RECURSIVE_CLEAN_TARGETS) $(RECURSIVE_TARGETS) CTAGS GTAGS \ all all-am am--refresh check check-am clean clean-generic \ clean-libtool ctags ctags-recursive dist dist-all dist-bzip2 \ dist-gzip dist-hook dist-lzip dist-lzma dist-shar dist-tarZ \ dist-xz dist-zip distcheck distclean distclean-generic \ distclean-hdr distclean-libtool distclean-local distclean-tags \ distcleancheck distdir distuninstallcheck dvi dvi-am html \ html-am info info-am install install-am install-data \ install-data-am install-data-hook install-dvi install-dvi-am \ install-exec install-exec-am install-html install-html-am \ install-info install-info-am install-localdocDATA 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-recursive uninstall uninstall-am \ uninstall-localdocDATA AUTHORS.gz: AUTHORS gzip -9 < $< > $@ BUGS.gz: BUGS gzip -9 < $< > $@ DEVELOPERS.gz: DEVELOPERS gzip -9 < $< > $@ INSTALL.gz: INSTALL gzip -9 < $< > $@ INSTALL.Unix.gz: INSTALL.Unix gzip -9 < $< > $@ INSTALL.Windows.gz: INSTALL.Windows gzip -9 < $< > $@ LICENSE.gz: LICENSE gzip -9 < $< > $@ NOTICE.gz: NOTICE gzip -9 < $< > $@ README.gz: README.rst gzip -9 < $< > $@ THANKS.gz: THANKS gzip -9 < $< > $@ check: dev check-js @TESTS_TRUE@ $(top_builddir)/test/etap/run $(top_srcdir)/test/etap check-js: dev @TESTS_TRUE@@USE_CURL_TRUE@ MAKE=$(MAKE) $(top_builddir)/test/javascript/run check-etap: dev @TESTS_TRUE@ $(top_builddir)/test/etap/run $(top_srcdir)/test/etap cover: dev @TESTS_TRUE@ rm -f cover/*.coverdata @TESTS_TRUE@ COVER=1 COVER_BIN=./src/couchdb/ $(top_builddir)/test/etap/run @TESTS_TRUE@ SRC=./src/couchdb/ \ @TESTS_TRUE@ $(ERL) -noshell \ @TESTS_TRUE@ -pa src/etap \ @TESTS_TRUE@ -eval 'etap_report:create()' \ @TESTS_TRUE@ -s init stop > /dev/null 2>&1 dev: all @TESTS_TRUE@ @echo "This command is intended for developers to use;" @TESTS_TRUE@ @echo "it creates development ini files as well as a" @TESTS_TRUE@ @echo "$(top_builddir)/tmp structure for development runtime files." @TESTS_TRUE@ @echo "Use ./utils/run to launch CouchDB from the source tree." @TESTS_TRUE@ mkdir -p $(top_builddir)/etc/couchdb/default.d @TESTS_TRUE@ mkdir -p $(top_builddir)/etc/couchdb/local.d @TESTS_TRUE@ mkdir -p $(top_builddir)/tmp/lib @TESTS_TRUE@ mkdir -p $(top_builddir)/tmp/log @TESTS_TRUE@ mkdir -p $(top_builddir)/tmp/run/couchdb @TESTS_TRUE@ mkdir -p $(top_builddir)/tmp/plugins install-data-hook: @echo @echo "You have installed Apache CouchDB, time to relax." distclean-local: rm -fr $(top_builddir)/etc/couchdb/default.d rm -fr $(top_builddir)/etc/couchdb/local.d rm -fr $(top_builddir)/tmp rm -f $(top_builddir)/couchdb.stdout rm -f $(top_builddir)/couchdb.stderr .PHONY: local-clean local-clean: maintainer-clean @echo "This command is intended for maintainers to use;" @echo "it deletes files that may need special tools to rebuild." rm -f $(top_srcdir)/INSTALL rm -f $(top_srcdir)/acinclude.m4 rm -f $(top_srcdir)/aclocal.m4 rm -f $(top_srcdir)/config.h.in rm -f $(top_srcdir)/configure rm -f $(top_srcdir)/test/etap/temp.* rm -f $(top_srcdir)/*.tar.gz rm -f $(top_srcdir)/*.tar.gz.* find $(top_srcdir) -name Makefile.in -exec rm -f {} \; dist-hook: find $(top_srcdir) -type f -name "._*" -exec rm -f {} \; find $(top_builddir) -type f -name "._*" -exec rm -f {} \; distcheck-hook: $(MAKE) -C bin distcheck-hook $(MAKE) -C src/couchdb/priv distcheck-hook $(MAKE) -C share/doc/build distcheck-hook grep -rL 'http://www.apache.org/licenses/LICENSE-2.0' * \ | grep --include= -vEf $(top_srcdir)/license.skip; \ test "$$?" -eq 1 # 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: apache-couchdb-1.6.0/config.h.in0000644000175000001440000000700012332105546016344 0ustar00djcusers00000000000000/* config.h.in. Generated from configure.ac by autoheader. */ /* Define if building universal (internal helper macro) */ #undef AC_APPLE_UNIVERSAL_BUILD /* "CouchJS executable name." */ #undef COUCHJS_NAME /* Define to 1 if the compiler supports __builtin_ctz and friends. */ #undef HAVE_BUILTIN_CTZ /* Define to 1 if the compiler supports __builtin_expect. */ #undef HAVE_BUILTIN_EXPECT /* "Provide HTTP support to couchjs" */ #undef HAVE_CURL /* Define to 1 if you have the header file. */ #undef HAVE_DLFCN_H /* Define to 1 if you have the header file. */ #undef HAVE_INTTYPES_H /* Use newer JS_GetCharsAndLength function. */ #undef HAVE_JS_GET_STRING_CHARS_AND_LENGTH /* Define to 1 if you have the header file. */ #undef HAVE_MEMORY_H /* Define to 1 if you have the header file. */ #undef HAVE_STDDEF_H /* 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 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_MMAN_H /* Define to 1 if you have the header file. */ #undef HAVE_SYS_RESOURCE_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_UNISTD_H /* Use JSScript* for scripts */ #undef JSSCRIPT_TYPE /* Define to the sub-directory in which libtool stores uninstalled libraries. */ #undef LT_OBJDIR /* 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 /* Use SpiderMonkey 1.8.0 */ #undef SM180 /* Use SpiderMonkey 1.8.5 */ #undef SM185 /* Define to 1 if you have the ANSI C header files. */ #undef STDC_HEADERS /* 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 WORDS_BIGENDIAN to 1 if your processor stores words with the most significant byte first (like Motorola and SPARC, unlike Intel). */ #if defined AC_APPLE_UNIVERSAL_BUILD # if defined __BIG_ENDIAN__ # define WORDS_BIGENDIAN 1 # endif #else # ifndef WORDS_BIGENDIAN # undef WORDS_BIGENDIAN # endif #endif /* 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 apache-couchdb-1.6.0/README.rst0000644000175000001440000000561212332105522016011 0ustar00djcusers00000000000000Apache CouchDB README ===================== Installation ------------ For a low-level guide, see: INSTALL For a high-level guide to Unix-like systems, inc. Mac OS X and Ubuntu, see: INSTALL.Unix For a high-level guide to Microsoft Windows, see: INSTALL.Windows Follow the proper instructions to get CouchDB installed on your system. If you're having problems, skip to the next section. Documentation ------------- We have documentation: http://docs.couchdb.org/ They include a changelog: http://docs.couchdb.org/en/latest/changelog.html For troubleshooting, see: http://wiki.apache.org/couchdb/Troubleshooting If you're getting a cryptic error message, see: http://wiki.apache.org/couchdb/Error_messages For general help, see: http://couchdb.apache.org/#mailing-list We also have an IRC channel: http://webchat.freenode.net/?channels=couchdb The mailing lists provide a wealth of support and knowledge for you to tap into. Feel free to drop by with your questions or discussion. See the official CouchDB website for more information about our community resources. Running the Testsuite --------------------- Run the testsuite for couch.js and jquery.couch.js by browsing here: http://127.0.0.1:5984/_utils/spec/run.html It should work in at least Firefox >= 3.6 with Private Browsing mode enabled. Read more about JSpec here: https://github.com/liblime/jspec When you change the specs, but your changes have no effect, manually reload the changed spec file in the browser. When the spec that tests Erlang views fails, make sure you have enabled Erlang views as described here: http://wiki.apache.org/couchdb/EnableErlangViews Cryptographic Software Notice ----------------------------- This distribution includes cryptographic software. The country in which you currently reside may have restrictions on the import, possession, use, and/or re-export to another country, of encryption software. BEFORE using any encryption software, please check your country's laws, regulations and policies concerning the import, possession, or use, and re-export of encryption software, to see if this is permitted. See for more information. The U.S. Government Department of Commerce, Bureau of Industry and Security (BIS), has classified this software as Export Commodity Control Number (ECCN) 5D002.C.1, which includes information security software using or performing cryptographic functions with asymmetric algorithms. The form and manner of this Apache Software Foundation distribution makes it eligible for export under the License Exception ENC Technology Software Unrestricted (TSU) exception (see the BIS Export Administration Regulations, Section 740.13) for both object code and source code. The following provides more details on the included cryptographic software: CouchDB includes a HTTP client (ibrowse) with SSL functionality. apache-couchdb-1.6.0/INSTALL.Unix0000644000175000001440000002203712332105522016275 0ustar00djcusers00000000000000Apache CouchDB INSTALL.Unix ========================== A high-level guide to Unix-like systems, inc. Mac OS X and Ubuntu. Community installation guides are available on the wiki: http://wiki.apache.org/couchdb/Installation If you are trying to build CouchDB from a git checkout rather than a .tar.gz, see the `DEVELOPERS` file. This document is the canonical source of installation information. However, many systems have gotchas that you need to be aware of. In addition, dependencies frequently change as distributions update their archives. If you're running into trouble, be sure to check out the wiki. If you have any tips to share, please also update the wiki so that others can benefit from your experience. Troubleshooting --------------- There is a troubleshooting guide: http://wiki.apache.org/couchdb/Troubleshooting There is a wiki for general documentation: http://wiki.apache.org/couchdb/ There are collection of friendly mailing lists: http://couchdb.apache.org/community/lists.html Please work through these in order if you experience any problems. Dependencies ------------ You should have the following installed: * Erlang OTP (>=R14B01, ==2.7) for docs (http://python.org/) * Python Sphinx (>=1.1.3) (http://pypi.python.org/pypi/Sphinx) It is recommended that you install Erlang OTP R13B-4 or above where possible. You will only need libcurl if you plan to run the JavaScript test suite. And help2man is only need if you plan on installing the CouchDB man pages. Python and Sphinx are only required for building the online documentation. Debian-based Systems ~~~~~~~~~~~~~~~~~~~~ You can install the dependencies by running: sudo apt-get install build-essential sudo apt-get install erlang-base-hipe sudo apt-get install erlang-dev sudo apt-get install erlang-manpages sudo apt-get install erlang-eunit sudo apt-get install erlang-nox sudo apt-get install libicu-dev sudo apt-get install libmozjs-dev sudo apt-get install libcurl4-openssl-dev sudo apt-get install pkg-config There are lots of Erlang packages. If there is a problem with your install, try a different mix. There is more information on the wiki. Additionally, you might want to install some of the optional Erlang tools which may also be useful. Be sure to update the version numbers to match your system's available packages. For up to date instructions, please see: http://wiki.apache.org/couchdb/Installing_on_Debian http://wiki.apache.org/couchdb/Installing_on_Ubuntu Unfortunately, it seems that installing dependencies on Ubuntu is troublesome. RedHat-based (Fedora, Centos, RHEL) Systems ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ You can install the dependencies by running: sudo yum install autoconf sudo yum install autoconf-archive sudo yum install automake sudo yum install curl-devel sudo yum install erlang-asn1 sudo yum install erlang-erts sudo yum install erlang-eunit sudo yum install erlang-os_mon sudo yum install erlang-xmerl sudo yum install help2man sudo yum install js-devel sudo yum install libicu-devel sudo yum install libtool sudo yum install perl-Test-Harness While CouchDB builds against the default js-devel-1.7.0 included in some distributions, it's recommended to use a more recent js-devel-1.8.5. Mac OS X ~~~~~~~~ To build CouchDB from source on Mac OS X, you will need to install Xcode. You can install the other dependencies by running: brew install autoconf brew install autoconf-archive brew install automake brew install libtool brew install erlang brew install icu4c brew install spidermonkey brew install curl brew install pkg-config You will need Homebrew installed to use the `brew` command. Learn more about Homebrew at: http://mxcl.github.com/homebrew/ Some versions of Mac OS X ship a problematic OpenSSL library. If you're experiencing troubles with CouchDB crashing intermittently with a segmentation fault or a bus error, you will need to install your own version of OpenSSL. See the troubleshooting guide, mentioned above, for more information. Installing ---------- Once you have satisfied the dependencies you should run: ./configure This script will configure CouchDB to be installed into `/usr/local` by default. If you wish to customize the installation, pass `--help` to this script. If everything was successful you should see the following message: You have configured Apache CouchDB, time to relax. Relax. To install CouchDB you should run: make && sudo make install You only need to use `sudo` if you're installing into a system directory. Try `gmake` if `make` is giving you any problems. If everything was successful you should see the following message: You have installed Apache CouchDB, time to relax. Relax. First Run --------- You can start the CouchDB server by running: sudo -i -u couchdb couchdb This uses the `sudo` command to run the `couchdb` command as the `couchdb` user. When CouchDB starts it should eventually display the following message: Apache CouchDB has started, time to relax. Relax. To check that everything has worked, point your web browser to: http://127.0.0.1:5984/_utils/index.html From here you should run the test suite in Firefox. Security Considerations ----------------------- You should create a special `couchdb` user for CouchDB. On many Unix-like systems you can run: adduser --system \ --home /usr/local/var/lib/couchdb \ --no-create-home \ --shell /bin/bash \ --group --gecos \ "CouchDB Administrator" couchdb On Mac OS X you can use the Workgroup Manager to create users: http://www.apple.com/support/downloads/serveradmintools1047.html You must make sure that: * The user has a working POSIX shell * The user's home directory is `/usr/local/var/lib/couchdb` You can test this by: * Trying to log in as the `couchdb` user * Running `pwd` and checking the present working directory Change the ownership of the CouchDB directories by running: chown -R couchdb:couchdb /usr/local/etc/couchdb chown -R couchdb:couchdb /usr/local/var/lib/couchdb chown -R couchdb:couchdb /usr/local/var/log/couchdb chown -R couchdb:couchdb /usr/local/var/run/couchdb Change the permission of the CouchDB directories by running: chmod 0770 /usr/local/etc/couchdb chmod 0770 /usr/local/var/lib/couchdb chmod 0770 /usr/local/var/log/couchdb chmod 0770 /usr/local/var/run/couchdb Update the permissions for your `default.ini` file: chmod 0644 /usr/local/etc/couchdb/default.ini Running as a Daemon ------------------- SysV/BSD-style Systems ~~~~~~~~~~~~~~~~~~~~~~ You can use the `couchdb` init script to control the CouchDB daemon. On SysV-style systems, the init script will be installed into: /usr/local/etc/init.d On BSD-style systems, the init script will be installed into: /usr/local/etc/rc.d We use the `[init.d|rc.d]` notation to refer to both of these directories. You can control the CouchDB daemon by running: /usr/local/etc/[init.d|rc.d]/couchdb [start|stop|restart|status] If you wish to configure how the init script works, you can edit: /usr/local/etc/default/couchdb Comment out the `COUCHDB_USER` setting if you're running as a non-superuser. To start the daemon on boot, copy the init script to: /etc/[init.d|rc.d] You should then configure your system to run the init script automatically. You may be able to run: sudo update-rc.d couchdb defaults If this fails, consult your system documentation for more information. A `logrotate` configuration is installed into: /usr/local/etc/logrotate.d/couchdb Consult your `logrotate` documentation for more information. It is critical that the CouchDB logs are rotated so as not to fill your disk. Mac OS X ~~~~~~~~ You can use the `launchctl` command to control the CouchDB daemon. You can load the configuration by running: sudo launchctl load \ /usr/local/Library/LaunchDaemons/org.apache.couchdb.plist You can stop the CouchDB daemon by running: sudo launchctl unload \ /usr/local/Library/LaunchDaemons/org.apache.couchdb.plist You can start CouchDB by running: sudo launchctl start org.apache.couchdb You can restart CouchDB by running: sudo launchctl stop org.apache.couchdb You can edit the launchd configuration by running: open /usr/local/Library/LaunchDaemons/org.apache.couchdb.plist To start the daemon on boot, copy the configuration file to: /Library/LaunchDaemons Consult your system documentation for more information. apache-couchdb-1.6.0/acinclude.m40000644000175000001440000000257612332105522016521 0ustar00djcusers00000000000000dnl Licensed under the Apache License, Version 2.0 (the "License"); you may not dnl use this file except in compliance with the License. dnl You may obtain a dnl copy of the License at dnl dnl http://www.apache.org/licenses/LICENSE-2.0 dnl dnl Unless required by applicable law or agreed to in writing, software dnl distributed under the License is distributed on an "AS IS" BASIS, WITHOUT dnl WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the dnl License for the specific language governing permissions and limitations dnl under the License. m4_define([LOCAL_PACKAGE_AUTHOR_NAME], [The Apache Software Foundation]) m4_define([LOCAL_PACKAGE_AUTHOR_ADDRESS], [dev@couchdb.apache.org]) m4_define([LOCAL_PACKAGE_IDENTIFIER], [couchdb]) m4_define([LOCAL_PACKAGE_TARNAME], [apache-couchdb]) m4_define([LOCAL_PACKAGE_NAME], [Apache CouchDB]) m4_define([LOCAL_BUG_URI], [https://issues.apache.org/jira/browse/COUCHDB]) m4_define([LOCAL_VERSION_MAJOR], [1]) m4_define([LOCAL_VERSION_MINOR], [6]) m4_define([LOCAL_VERSION_REVISION], [0]) m4_define([LOCAL_VERSION_STAGE], []) m4_define([LOCAL_VERSION_RELEASE], []) m4_define([LOCAL_VERSION_PRIMARY], [LOCAL_VERSION_MAJOR.LOCAL_VERSION_MINOR.LOCAL_VERSION_REVISION]) m4_define([LOCAL_VERSION_SECONDARY], [LOCAL_VERSION_STAGE[]LOCAL_VERSION_RELEASE]) m4_define([LOCAL_VERSION], [LOCAL_VERSION_PRIMARY[]LOCAL_VERSION_SECONDARY]) apache-couchdb-1.6.0/build-aux/0000755000175000001440000000000012332105577016222 5ustar00djcusers00000000000000apache-couchdb-1.6.0/build-aux/depcomp0000755000175000001440000005064312021144127017574 0ustar00djcusers00000000000000#! /bin/sh # depcomp - compile a program generating dependencies as side-effects scriptversion=2012-03-27.16; # UTC # Copyright (C) 1999, 2000, 2003, 2004, 2005, 2006, 2007, 2009, 2010, # 2011, 2012 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 # A tabulation character. tab=' ' # A newline character. nl=' ' 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" # 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 informations. 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 -eq 0; then : else rm -f "$tmpdepfile" exit $stat fi mv "$tmpdepfile" "$depfile" ;; gcc) ## There are various ways to get dependency output from gcc. Here's ## why we pick this rather obscure method: ## - Don't want to use -MD because we'd like the dependencies to end ## up in a subdir. Having to rename by hand is ugly. ## (We might end up doing this anyway to support other compilers.) ## - The DEPENDENCIES_OUTPUT environment variable makes gcc act like ## -MM, not -M (despite what the docs say). ## - Using -M directly means running the compiler twice (even worse ## than renaming). if test -z "$gccflag"; then gccflag=-MD, fi "$@" -Wp,"$gccflag$tmpdepfile" stat=$? if test $stat -eq 0; then : else rm -f "$tmpdepfile" exit $stat fi rm -f "$depfile" echo "$object : \\" > "$depfile" alpha=ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz ## The second -e expression handles DOS-style file names with drive letters. sed -e 's/^[^:]*: / /' \ -e 's/^['$alpha']:\/[^:]*: / /' < "$tmpdepfile" >> "$depfile" ## This next piece of magic avoids the "deleted header file" problem. ## The problem is that when a header file which appears in a .P file ## is deleted, the dependency causes make to die (because there is ## typically no way to rebuild the header). We avoid this by adding ## dummy dependencies for each header file. Too bad gcc doesn't do ## this for us directly. tr ' ' "$nl" < "$tmpdepfile" | ## Some versions of gcc put a space before the ':'. On the theory ## that the space means something, we add a space to the output as ## well. 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. 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 -eq 0; then : else rm -f "$tmpdepfile" exit $stat fi rm -f "$depfile" if test -f "$tmpdepfile"; then # yes, the sourcefile depend on other files echo "$object : \\" > "$depfile" # Clip off the initial element (the dependent). Don't try to be # clever and replace this with sed code, as IRIX sed won't handle # lines with more than a fixed number of characters (4096 in # IRIX 6.2 sed, 8192 in IRIX 6.5). We also remove comment lines; # the IRIX cc adds comments like '#:fec' to the end of the # dependency line. tr ' ' "$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 # The sourcefile does not contain any dependencies, so just # store a dummy comment line, to avoid errors with the Makefile # "include basename.Plo" scheme. echo "#dummy" > "$depfile" fi rm -f "$tmpdepfile" ;; 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. dir=`echo "$object" | sed -e 's|/[^/]*$|/|'` test "x$dir" = "x$object" && dir= base=`echo "$object" | sed -e 's|^.*/||' -e 's/\.o$//' -e 's/\.lo$//'` if test "$libtool" = yes; then tmpdepfile1=$dir$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 -eq 0; then : else rm -f "$tmpdepfile1" "$tmpdepfile2" "$tmpdepfile3" exit $stat fi for tmpdepfile in "$tmpdepfile1" "$tmpdepfile2" "$tmpdepfile3" do test -f "$tmpdepfile" && break done if test -f "$tmpdepfile"; then # Each line is of the form 'foo.o: dependent.h'. # Do two passes, one to just change these to # '$object: dependent.h' and one to simply 'dependent.h:'. sed -e "s,^.*\.[a-z]*:,$object:," < "$tmpdepfile" > "$depfile" sed -e 's,^.*\.[a-z]*:['"$tab"' ]*,,' -e 's,$,:,' < "$tmpdepfile" >> "$depfile" else # The sourcefile does not contain any dependencies, so just # store a dummy comment line, to avoid errors with the Makefile # "include basename.Plo" scheme. echo "#dummy" > "$depfile" fi rm -f "$tmpdepfile" ;; icc) # Intel's C compiler anf tcc (Tiny C Compiler) understand '-MD -MF file'. # However on # $CC -MD -MF foo.d -c -o sub/foo.o sub/foo.c # ICC 7.0 will fill foo.d with something like # foo.o: sub/foo.c # foo.o: sub/foo.h # which is wrong. We want # sub/foo.o: sub/foo.c # sub/foo.o: sub/foo.h # sub/foo.c: # sub/foo.h: # ICC 7.1 will output # foo.o: sub/foo.c sub/foo.h # and will wrap long lines using '\': # foo.o: sub/foo.c ... \ # sub/foo.h ... \ # ... # tcc 0.9.26 (FIXME still under development at the moment of writing) # will emit a similar output, but also prepend the continuation lines # with horizontal tabulation characters. "$@" -MD -MF "$tmpdepfile" stat=$? if test $stat -eq 0; then : else rm -f "$tmpdepfile" exit $stat fi rm -f "$depfile" # Each line is of the form 'foo.o: dependent.h', # or 'foo.o: dep1.h dep2.h \', or ' dep3.h dep4.h \'. # Do two passes, one to just change these to # '$object: dependent.h' and one to simply 'dependent.h:'. sed -e "s/^[ $tab][ $tab]*/ /" -e "s,^[^:]*:,$object :," \ < "$tmpdepfile" > "$depfile" sed ' s/[ '"$tab"'][ '"$tab"']*/ /g s/^ *// s/ *\\*$// s/^[^:]*: *// /^$/d /:$/d s/$/ :/ ' < "$tmpdepfile" >> "$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. dir=`echo "$object" | sed -e 's|/[^/]*$|/|'` test "x$dir" = "x$object" && dir= base=`echo "$object" | sed -e 's|^.*/||' -e 's/\.o$//' -e 's/\.lo$//'` if test "$libtool" = yes; then tmpdepfile1=$dir$base.d tmpdepfile2=$dir.libs/$base.d "$@" -Wc,+Maked else tmpdepfile1=$dir$base.d tmpdepfile2=$dir$base.d "$@" +Maked fi stat=$? if test $stat -eq 0; then : else 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,^.*\.[a-z]*:,$object:," "$tmpdepfile" > "$depfile" # Add 'dependent.h:' lines. sed -ne '2,${ s/^ *// s/ \\*$// s/$/:/ p }' "$tmpdepfile" >> "$depfile" else echo "#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. dir=`echo "$object" | sed -e 's|/[^/]*$|/|'` test "x$dir" = "x$object" && dir= base=`echo "$object" | sed -e 's|^.*/||' -e 's/\.o$//' -e 's/\.lo$//'` if test "$libtool" = yes; then # With Tru64 cc, shared objects can also be used to make a # static library. This mechanism is used in libtool 1.4 series to # handle both shared and static libraries in a single compilation. # With libtool 1.4, dependencies were output in $dir.libs/$base.lo.d. # # With libtool 1.5 this exception was removed, and libtool now # 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.libs/$base.lo.d # libtool 1.4 tmpdepfile2=$dir$base.o.d # libtool 1.5 tmpdepfile3=$dir.libs/$base.o.d # libtool 1.5 tmpdepfile4=$dir.libs/$base.d # Compaq CCC V6.2-504 "$@" -Wc,-MD else tmpdepfile1=$dir$base.o.d tmpdepfile2=$dir$base.d tmpdepfile3=$dir$base.d tmpdepfile4=$dir$base.d "$@" -MD fi stat=$? if test $stat -eq 0; then : else rm -f "$tmpdepfile1" "$tmpdepfile2" "$tmpdepfile3" "$tmpdepfile4" exit $stat fi for tmpdepfile in "$tmpdepfile1" "$tmpdepfile2" "$tmpdepfile3" "$tmpdepfile4" do test -f "$tmpdepfile" && break done if test -f "$tmpdepfile"; then sed -e "s,^.*\.[a-z]*:,$object:," < "$tmpdepfile" > "$depfile" sed -e 's,^.*\.[a-z]*:['"$tab"' ]*,,' -e 's,$,:,' < "$tmpdepfile" >> "$depfile" else echo "#dummy" > "$depfile" fi rm -f "$tmpdepfile" ;; 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" = 0; then : else 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" 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" tr ' ' "$nl" < "$tmpdepfile" | \ ## Some versions of the HPUX 10.20 sed can't process this invocation ## correctly. Breaking it into two sed invocations is a workaround. sed -e 's/^\\$//' -e '/^$/d' -e '/:$/d' | sed -e 's/$/ :/' >> "$depfile" rm -f "$tmpdepfile" ;; dashXmstdout) # This case only exists to satisfy depend.m4. It is never actually # run, as this mode is specially recognized in the preamble. exit 1 ;; makedepend) "$@" || exit $? # Remove any Libtool call if test "$libtool" = yes; then while test "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" sed '1,2d' "$tmpdepfile" | tr ' ' "$nl" | \ ## Some versions of the HPUX 10.20 sed can't process this invocation ## correctly. Breaking it into two sed invocations is a workaround. sed -e 's/^\\$//' -e '/^$/d' -e '/:$/d' | sed -e 's/$/ :/' >> "$depfile" rm -f "$tmpdepfile" "$tmpdepfile".bak ;; cpp) # Important note: in order to support this mode, a compiler *must* # always write the preprocessed file to stdout. "$@" || exit $? # Remove the call to Libtool. if test "$libtool" = yes; then while test "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: apache-couchdb-1.6.0/build-aux/ltmain.sh0000644000175000001440000105152212332105523020037 0ustar00djcusers00000000000000 # 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 # 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 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% $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" elif test "$linkmode" != prog && test "$linkmode" != lib; then func_fatal_error "\`$lib' is not a convenience library" fi 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 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 ;; 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 apache-couchdb-1.6.0/build-aux/config.guess0000755000175000001440000013207612300616344020545 0ustar00djcusers00000000000000#! /bin/sh # Attempt to guess a canonical system name. # Copyright 1992-2013 Free Software Foundation, Inc. timestamp='2013-11-29' # 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:*:*) eval $set_cc_for_build X86_64_ABI= # If there is a compiler, see if it is configured for 32-bit objects. if [ "$CC_FOR_BUILD" != 'no_compiler_found' ]; then if (echo '#ifdef __ILP32__'; echo IS_X32; echo '#endif') | \ (CCOPTS= $CC_FOR_BUILD -E - 2>/dev/null) | \ grep IS_X32 >/dev/null then X86_64_ABI=x32 fi fi echo x86_64-unknown-linux-gnu${X86_64_ABI} 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 test `echo "$UNAME_RELEASE" | sed -e 's/\..*//'` -le 10 ; then 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 elif test "$UNAME_PROCESSOR" = i386 ; then # Avoid executing cc on OS X 10.9, as it ships with a stub # that puts up a graphical alert prompting to install # developer tools. Any system running Mac OS X 10.7 or # later (Darwin 11 and later) is required to have a 64-bit # processor. This is not true of the ARM version of Darwin # that Apple uses in portable devices. UNAME_PROCESSOR=x86_64 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: apache-couchdb-1.6.0/build-aux/install-sh0000755000175000001440000003325612021144127020224 0ustar00djcusers00000000000000#!/bin/sh # install - install a program, script, or datafile scriptversion=2011-01-19.21; # 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-writeable 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: apache-couchdb-1.6.0/build-aux/config.sub0000755000175000001440000010577012300616344020211 0ustar00djcusers00000000000000#! /bin/sh # Configuration validation subroutine script. # Copyright 1992-2013 Free Software Foundation, Inc. timestamp='2013-10-01' # 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 | dvp \ | epiphany \ | fido | fr30 | frv \ | h8300 | h8500 | hppa | hppa1.[01] | hppa2.0 | hppa2.0[nw] | hppa64 \ | hexagon \ | i370 | i860 | i960 | ia64 \ | ip2k | iq2000 \ | k1om \ | 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 | nvptx | 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-* \ | k1om-* \ | 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 ;; mipsEE* | ee | ps2) basic_machine=mips64r5900el-scei case $os in -linux*) ;; *) os=-elf ;; esac ;; iop) basic_machine=mipsel-scei os=-irx ;; dvp) basic_machine=dvp-scei os=-elf ;; 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* | -irx* \ | -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: apache-couchdb-1.6.0/build-aux/missing0000755000175000001440000002415212021144127017612 0ustar00djcusers00000000000000#! /bin/sh # Common stub for a few missing GNU programs while installing. scriptversion=2012-01-06.13; # UTC # Copyright (C) 1996, 1997, 1999, 2000, 2002, 2003, 2004, 2005, 2006, # 2008, 2009, 2010, 2011, 2012 Free Software Foundation, Inc. # Originally 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 run=: sed_output='s/.* --output[ =]\([^ ]*\).*/\1/p' sed_minuso='s/.* -o \([^ ]*\).*/\1/p' # In the cases where this matters, `missing' is being run in the # srcdir already. if test -f configure.ac; then configure_ac=configure.ac else configure_ac=configure.in fi msg="missing on your system" case $1 in --run) # Try to run requested program, and just exit if it succeeds. run= shift "$@" && exit 0 # Exit code 63 means version mismatch. This often happens # when the user try to use an ancient version of a tool on # a file that requires a minimum version. In this case we # we should proceed has if the program had been absent, or # if --run hadn't been passed. if test $? = 63; then run=: msg="probably too old" fi ;; -h|--h|--he|--hel|--help) echo "\ $0 [OPTION]... PROGRAM [ARGUMENT]... Handle \`PROGRAM [ARGUMENT]...' for when PROGRAM is missing, or return an error status if there is no known handling for PROGRAM. Options: -h, --help display this help and exit -v, --version output version information and exit --run try to run the given command, and emulate it if it fails Supported PROGRAM values: aclocal touch file \`aclocal.m4' autoconf touch file \`configure' autoheader touch file \`config.h.in' autom4te touch the output file, or create a stub one automake touch all \`Makefile.in' files bison create \`y.tab.[ch]', if possible, from existing .[ch] flex create \`lex.yy.c', if possible, from existing .c help2man touch the output file lex create \`lex.yy.c', if possible, from existing .c makeinfo touch the output file yacc create \`y.tab.[ch]', if possible, from existing .[ch] 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 # normalize program name to check for. program=`echo "$1" | sed ' s/^gnu-//; t s/^gnu//; t s/^g//; t'` # Now exit if we have it, but it failed. Also exit now if we # don't have it and --version was passed (most likely to detect # the program). This is about non-GNU programs, so use $1 not # $program. case $1 in lex*|yacc*) # Not GNU programs, they don't have --version. ;; *) if test -z "$run" && ($1 --version) > /dev/null 2>&1; then # We have it, but it failed. exit 1 elif test "x$2" = "x--version" || test "x$2" = "x--help"; then # Could not run --version or --help. This is probably someone # running `$TOOL --version' or `$TOOL --help' to check whether # $TOOL exists and not knowing $TOOL uses missing. exit 1 fi ;; esac # If it does not exist, or fails to run (possibly an outdated version), # try to emulate it. case $program in aclocal*) echo 1>&2 "\ WARNING: \`$1' is $msg. You should only need it if you modified \`acinclude.m4' or \`${configure_ac}'. You might want to install the \`Automake' and \`Perl' packages. Grab them from any GNU archive site." touch aclocal.m4 ;; autoconf*) echo 1>&2 "\ WARNING: \`$1' is $msg. You should only need it if you modified \`${configure_ac}'. You might want to install the \`Autoconf' and \`GNU m4' packages. Grab them from any GNU archive site." touch configure ;; autoheader*) echo 1>&2 "\ WARNING: \`$1' is $msg. You should only need it if you modified \`acconfig.h' or \`${configure_ac}'. You might want to install the \`Autoconf' and \`GNU m4' packages. Grab them from any GNU archive site." files=`sed -n 's/^[ ]*A[CM]_CONFIG_HEADER(\([^)]*\)).*/\1/p' ${configure_ac}` test -z "$files" && files="config.h" touch_files= for f in $files; do case $f in *:*) touch_files="$touch_files "`echo "$f" | sed -e 's/^[^:]*://' -e 's/:.*//'`;; *) touch_files="$touch_files $f.in";; esac done touch $touch_files ;; automake*) echo 1>&2 "\ WARNING: \`$1' is $msg. You should only need it if you modified \`Makefile.am', \`acinclude.m4' or \`${configure_ac}'. You might want to install the \`Automake' and \`Perl' packages. Grab them from any GNU archive site." find . -type f -name Makefile.am -print | sed 's/\.am$/.in/' | while read f; do touch "$f"; done ;; autom4te*) echo 1>&2 "\ WARNING: \`$1' is needed, but is $msg. You might have modified some files without having the proper tools for further handling them. You can get \`$1' as part of \`Autoconf' from any GNU archive site." file=`echo "$*" | sed -n "$sed_output"` test -z "$file" && file=`echo "$*" | sed -n "$sed_minuso"` if test -f "$file"; then touch $file else test -z "$file" || exec >$file echo "#! /bin/sh" echo "# Created by GNU Automake missing as a replacement of" echo "# $ $@" echo "exit 0" chmod +x $file exit 1 fi ;; bison*|yacc*) echo 1>&2 "\ WARNING: \`$1' $msg. You should only need it if you modified a \`.y' file. You may need the \`Bison' package in order for those modifications to take effect. You can get \`Bison' from any GNU archive site." rm -f y.tab.c y.tab.h if test $# -ne 1; then eval LASTARG=\${$#} case $LASTARG in *.y) SRCFILE=`echo "$LASTARG" | sed 's/y$/c/'` if test -f "$SRCFILE"; then cp "$SRCFILE" y.tab.c fi SRCFILE=`echo "$LASTARG" | sed 's/y$/h/'` if test -f "$SRCFILE"; then cp "$SRCFILE" y.tab.h fi ;; esac fi if test ! -f y.tab.h; then echo >y.tab.h fi if test ! -f y.tab.c; then echo 'main() { return 0; }' >y.tab.c fi ;; lex*|flex*) echo 1>&2 "\ WARNING: \`$1' is $msg. You should only need it if you modified a \`.l' file. You may need the \`Flex' package in order for those modifications to take effect. You can get \`Flex' from any GNU archive site." rm -f lex.yy.c if test $# -ne 1; then eval LASTARG=\${$#} case $LASTARG in *.l) SRCFILE=`echo "$LASTARG" | sed 's/l$/c/'` if test -f "$SRCFILE"; then cp "$SRCFILE" lex.yy.c fi ;; esac fi if test ! -f lex.yy.c; then echo 'main() { return 0; }' >lex.yy.c fi ;; help2man*) echo 1>&2 "\ WARNING: \`$1' is $msg. You should only need it if you modified a dependency of a manual page. You may need the \`Help2man' package in order for those modifications to take effect. You can get \`Help2man' from any GNU archive site." file=`echo "$*" | sed -n "$sed_output"` test -z "$file" && file=`echo "$*" | sed -n "$sed_minuso"` if test -f "$file"; then touch $file else test -z "$file" || exec >$file echo ".ab help2man is required to generate this page" exit $? fi ;; makeinfo*) echo 1>&2 "\ WARNING: \`$1' is $msg. You should only need it if you modified a \`.texi' or \`.texinfo' file, or any other file indirectly affecting the aspect of the manual. The spurious call might also be the consequence of using a buggy \`make' (AIX, DU, IRIX). You might want to install the \`Texinfo' package or the \`GNU make' package. Grab either from any GNU archive site." # The file to touch is that specified with -o ... file=`echo "$*" | sed -n "$sed_output"` test -z "$file" && file=`echo "$*" | sed -n "$sed_minuso"` if test -z "$file"; then # ... or it is the one specified with @setfilename ... infile=`echo "$*" | sed 's/.* \([^ ]*\) *$/\1/'` file=`sed -n ' /^@setfilename/{ s/.* \([^ ]*\) *$/\1/ p q }' $infile` # ... or it is derived from the source name (dir/f.texi becomes f.info) test -z "$file" && file=`echo "$infile" | sed 's,.*/,,;s,.[^.]*$,,'`.info fi # If the file does not exist, the user really needs makeinfo; # let's fail without touching anything. test -f $file || exit 1 touch $file ;; *) echo 1>&2 "\ WARNING: \`$1' is needed, and is $msg. You might have modified some files without having the proper tools for further handling them. Check the \`README' file, it often tells you about the needed prerequisites for installing this package. You may also peek at any GNU archive site, in case some other package would contain this missing \`$1' program." exit 1 ;; esac exit 0 # 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: apache-couchdb-1.6.0/build-aux/dist-error0000755000175000001440000000171712332105522020236 0ustar00djcusers00000000000000#!/bin/sh -e # Licensed under the Apache License, Version 2.0 (the "License"); you may not # use this file except in compliance with the License. You may obtain a copy of # the License at # # http://www.apache.org/licenses/LICENSE-2.0 # # Unless required by applicable law or agreed to in writing, software # distributed under the License is distributed on an "AS IS" BASIS, WITHOUT # WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the # License for the specific language governing permissions and limitations under # the License. # This script is called by the build system and is used to provide an error # about missing or empty files. Some files are optional, and will be built when # the environment allows. But these files are required for distribution. cat << EOF ERROR: This file is missing or incomplete: $1 This file is optional at build and install time, but is required when preparing a distribution. EOF exit 1 apache-couchdb-1.6.0/build-aux/sphinx-build0000755000175000001440000000402012332105522020540 0ustar00djcusers00000000000000#!/bin/sh -e # Licensed under the Apache License, Version 2.0 (the "License"); you may not # use this file except in compliance with the License. You may obtain a copy of # the License at # # http://www.apache.org/licenses/LICENSE-2.0 # # Unless required by applicable law or agreed to in writing, software # distributed under the License is distributed on an "AS IS" BASIS, WITHOUT # WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the # License for the specific language governing permissions and limitations under # the License. # This script is called by the build system and is used to call sphinx-build if # is is available, or alternatively, emit a warning, and perform a no-op. Any # required directories or Makefiles are created and stubbed out as appropriate. if test -z "`which sphinx-build`"; then missing=yes cat << EOF WARNING: 'sphinx-build' is needed, and is missing on your system. You might have modified some files without having the proper tools for further handling them. EOF fi if test "$2" = "texinfo"; then if test -z "`which makeinfo`"; then missing=yes cat << EOF WARNING: 'makeinfo' is needed, and is missing on your system. You might have modified some files without having the proper tools for further handling them. EOF fi if test "$missing" != "yes"; then sphinx-build $* else mkdir -p texinfo echo "info:" > texinfo/Makefile fi fi if test "$2" = "latex"; then if test -z "`which pdflatex`"; then missing=yes cat << EOF WARNING: 'pdflatex' is needed, and is missing on your system. You might have modified some files without having the proper tools for further handling them. EOF fi if test "$missing" != "yes"; then sphinx-build $* else mkdir -p latex echo "all-pdf:" > latex/Makefile fi fi if test "$2" = "html"; then if test "$missing" != "yes"; then sphinx-build $* else mkdir -p html fi fi apache-couchdb-1.6.0/build-aux/sphinx-touch0000755000175000001440000000162412332105522020572 0ustar00djcusers00000000000000#!/bin/sh -e # Licensed under the Apache License, Version 2.0 (the "License"); you may not # use this file except in compliance with the License. You may obtain a copy of # the License at # # http://www.apache.org/licenses/LICENSE-2.0 # # Unless required by applicable law or agreed to in writing, software # distributed under the License is distributed on an "AS IS" BASIS, WITHOUT # WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the # License for the specific language governing permissions and limitations under # the License. # This script is called by the build system and is used to touch the list of # expected output files when sphinx-build is not available. If the files exist, # this will satisfy make. If they do not exist, we create of empty files. if test -z "`which sphinx-build`"; then for file in $*; do mkdir -p `dirname $file` touch $file done fiapache-couchdb-1.6.0/INSTALL.Windows0000644000175000001440000001275512332105522017012 0ustar00djcusers00000000000000Apache CouchDB INSTALL.Windows ============================== For a high-level guide to Microsoft Windows. Troubleshooting --------------- There is a troubleshooting guide: http://wiki.apache.org/couchdb/Troubleshooting There is a wiki for general documentation: http://wiki.apache.org/couchdb/ And some Windows-specific tips: http://wiki.apache.org/couchdb/Quirks_on_Windows There are collection of friendly mailing lists: http://couchdb.apache.org/community/lists.html Please work through these in order if you experience any problems. Dependencies ------------ You will need the following installed: * Erlang OTP (>=14B01, =4.*) (http://icu-project.org/) * OpenSSL (>=0.9.8r) (http://www.openssl.org/) * Mozilla SpiderMonkey (=1.8.5) (http://www.mozilla.org/js/spidermonkey/) * libcurl (>=7.20) (http://curl.haxx.se/libcurl/) * Cygwin (http://www.cygwin.com/) * Microsoft SDK 7.0 or 7.1 (http://www.microsoft.com/en-us/download/details.aspx?id=8279) * Python (>= 2.68) for docs (http://python.org/) * Python Sphinx (>=1.1.3) (http://pypi.python.org/pypi/Sphinx) General Notes ------------- * When installing Cygwin, be sure to select all the `development` tools. * When installing Erlang, you must build it from source. * The CouchDB build requires a number of the Erlang build scripts. * All dependent libraries should be built with the same version of microsoft SDK. * Do not try to link against libraries built with, or included in, Cygwin or MingW. They are not compatible with the Erlang/OTP or CouchDB build scripts. * ICU version 4.6 and later will build cleanly using MSBuild. * Python and Sphinx are optional for building the online documentation. Use cygwin-provided Python and install Sphinx via easy_install or pip. Further information is here http://pypi.python.org/pypi/setuptools#id4 Setting Up Cygwin ----------------- Before starting any Cygwin terminals, run: set CYGWIN=nontsec To set up your environment, run: [VS_BIN]/vcvars32.bat Replace [VS_BIN] with the path to your Visual Studio `bin` directory. You must check that: * The `which link` command points to the Microsoft linker. * The `which cl` command points to the Microsoft compiler. * The `which mc` command points to the Microsoft message compiler. * The `which mt` command points to the Microsoft manifest tool. * The `which nmake` command points to the Microsoft make tool. If you do not do this, the build may fail due to Cygwin ones found in `/usr/bin` being used instead. Building Erlang --------------- You must include Win32 OpenSSL, built statically from source. Use exactly the same version as required by the Erlang/OTP build process. However, you can skip the GUI tools by running: echo "skipping gs" > lib/gs/SKIP echo "skipping ic" > lib/ic/SKIP echo "skipping jinterface" > lib/jinterface/SKIP Follow the rest of the Erlang instructions as described. After running: ./otp_build release -a You should run: ./release/win32/Install.exe -s This will set up the release/win32/bin directory correctly. The CouchDB installation scripts currently write their data directly into this location. To set up your environment for building CouchDB, run: eval `./otp_build env_win32` To set up the `ERL_TOP` environment variable, run: export ERL_TOP=[ERL_TOP] Replace `[ERL_TOP]` with the Erlang source directory name. Remember to use `/cygdrive/c/` instead of `c:/` as the directory prefix. To set up your path, run: export PATH=$ERL_TOP/release/win32/erts-5.8.5/bin:$PATH If everything was successful, you should be ready to build CouchDB. Relax. Building CouchDB ---------------- Note that `win32-curl` is only required if you wish to run the developer tests. The documentation step may be skipped using `--disable-docs` if you wish. Once you have satisfied the dependencies you should run: ./configure \ --with-js-include=/cygdrive/c/path_to_spidermonkey_include \ --with-js-lib=/cygdrive/c/path_to_spidermonkey_lib \ --with-win32-icu-binaries=/cygdrive/c/path_to_icu_binaries_root \ --with-erlang=$ERL_TOP/release/win32/usr/include \ --with-win32-curl=/cygdrive/c/path/to/curl/root/directory \ --with-openssl-bin-dir=/cygdrive/c/openssl/bin \ --with-msvc-redist-dir=/cygdrive/c/dir/with/vcredist_platform_executable \ --disable-init \ --disable-launchd \ --prefix=$ERL_TOP/release/win32 This command could take a while to complete. If everything was successful you should see the following message: You have configured Apache CouchDB, time to relax. Relax. To install CouchDB you should run: make install If everything was successful you should see the following message: You have installed Apache CouchDB, time to relax. Relax. To build the .exe installer package, you should run: make dist Alternatively, you may run CouchDB directly from the build tree, but to avoid any contamination do not run `make dist` after this. First Run --------- You can start the CouchDB server by running: $ERL_TOP/release/win32/bin/couchdb.bat When CouchDB starts it should eventually display the following message: Apache CouchDB has started, time to relax. Relax. To check that everything has worked, point your web browser to: http://127.0.0.1:5984/_utils/index.html From here you should run the verification tests in Firefox. apache-couchdb-1.6.0/AUTHORS0000644000175000001440000000231412332105522015366 0ustar00djcusers00000000000000Apache CouchDB AUTHORS ====================== A number of people have contributed directly to Apache CouchDB by writing documentation or developing software. Some of these people are: * Damien Katz * Jan Lehnardt * Noah Slater * Christopher Lenz * J. Chris Anderson * Paul Joseph Davis * Adam Kocoloski * Jason Davies * Mark Hammond * BenoƮt Chesneau * Filipe Manana * Robert Newson * Randall Leeds * Bob Dionne * Dave Cottlehuber * Jason Smith * Joan Touzet * Dale Harvey * Dirkjan Ochtman * Alexander Shorin * Garren Smith * Sue Lockwood * Andy Wenk * Klaus Trainer * Benjamin Young * Robert Kowalski For a list of other credits see the `THANKS` file. apache-couchdb-1.6.0/INSTALL0000644000175000001440000003660012021144127015353 0ustar00djcusers00000000000000Installation Instructions ************************* Copyright (C) 1994-1996, 1999-2002, 2004-2011 Free Software Foundation, Inc. Copying and distribution of this file, with or without modification, are permitted in any medium without royalty provided the copyright notice and this notice are preserved. This file is offered as-is, without warranty of any kind. Basic Installation ================== Briefly, the shell commands `./configure; make; make install' should configure, build, and install this package. The following more-detailed instructions are generic; see the `README' file for instructions specific to this package. Some packages provide this `INSTALL' file but do not implement all of the features documented below. The lack of an optional feature in a given package is not necessarily a bug. More recommendations for GNU packages can be found in *note Makefile Conventions: (standards)Makefile Conventions. 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 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. Running `configure' might take a while. 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, generally using the just-built uninstalled binaries. 4. Type `make install' to install the programs and any data files and documentation. When installing into a prefix owned by root, it is recommended that the package be configured and built as a regular user, and only the `make install' phase executed with root privileges. 5. Optionally, type `make installcheck' to repeat any self-tests, but this time using the binaries in their final installed location. This target does not install anything. Running this target as a regular user, particularly if the prior `make install' required root privileges, verifies that the installation completed correctly. 6. 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. 7. Often, you can also type `make uninstall' to remove the installed files again. In practice, not all packages have tested that uninstallation works correctly, even though it is required by the GNU Coding Standards. 8. Some packages, particularly those that use Automake, provide `make distcheck', which can by used by developers to test that all other targets like `make install' and `make uninstall' work correctly. This target is generally not run by end users. 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=c99 CFLAGS=-g 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 can use 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 `..'. This is known as a "VPATH" build. With a non-GNU `make', it is safer 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. On MacOS X 10.5 and later systems, you can create libraries and executables that work on multiple system types--known as "fat" or "universal" binaries--by specifying multiple `-arch' options to the compiler but only a single `-arch' option to the preprocessor. Like this: ./configure CC="gcc -arch i386 -arch x86_64 -arch ppc -arch ppc64" \ CXX="g++ -arch i386 -arch x86_64 -arch ppc -arch ppc64" \ CPP="gcc -E" CXXCPP="g++ -E" This is not guaranteed to produce working output in all cases, you may have to build one architecture at a time and combine the results using the `lipo' tool if you have problems. Installation Names ================== By default, `make install' installs the package's commands under `/usr/local/bin', include files under `/usr/local/include', etc. You can specify an installation prefix other than `/usr/local' by giving `configure' the option `--prefix=PREFIX', where PREFIX must be an absolute file name. You can specify separate installation prefixes for architecture-specific files and architecture-independent files. If you pass the option `--exec-prefix=PREFIX' to `configure', the package uses PREFIX as the prefix for installing programs and libraries. Documentation and other data files still use the regular prefix. In addition, if you use an unusual directory layout you can give options like `--bindir=DIR' 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. In general, the default for these options is expressed in terms of `${prefix}', so that specifying just `--prefix' will affect all of the other directory specifications that were not explicitly provided. The most portable way to affect installation locations is to pass the correct locations to `configure'; however, many packages provide one or both of the following shortcuts of passing variable assignments to the `make install' command line to change installation locations without having to reconfigure or recompile. The first method involves providing an override variable for each affected directory. For example, `make install prefix=/alternate/directory' will choose an alternate location for all directory configuration variables that were expressed in terms of `${prefix}'. Any directories that were specified during `configure', but not in terms of `${prefix}', must each be overridden at install time for the entire installation to be relocated. The approach of makefile variable overrides for each directory variable is required by the GNU Coding Standards, and ideally causes no recompilation. However, some platforms have known limitations with the semantics of shared libraries that end up requiring recompilation when using this method, particularly noticeable in packages that use GNU Libtool. The second method involves providing the `DESTDIR' variable. For example, `make install DESTDIR=/alternate/directory' will prepend `/alternate/directory' before all installation names. The approach of `DESTDIR' overrides is not required by the GNU Coding Standards, and does not work on platforms that have drive letters. On the other hand, it does better at avoiding recompilation issues, and works well even when some directory options were not specified in terms of `${prefix}' at `configure' time. Optional Features ================= 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'. 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. Some packages offer the ability to configure how verbose the execution of `make' will be. For these packages, running `./configure --enable-silent-rules' sets the default to minimal output, which can be overridden with `make V=1'; while running `./configure --disable-silent-rules' sets the default to verbose, which can be overridden with `make V=0'. Particular systems ================== On HP-UX, the default C compiler is not ANSI C compatible. If GNU CC is not installed, it is recommended to use the following options in order to use an ANSI C compiler: ./configure CC="cc -Ae -D_XOPEN_SOURCE=500" and if that doesn't work, install pre-built binaries of GCC for HP-UX. HP-UX `make' updates targets which have the same time stamps as their prerequisites, which makes it generally unusable when shipped generated files such as `configure' are involved. Use GNU `make' instead. On OSF/1 a.k.a. Tru64, some versions of the default C compiler cannot parse its `' header file. The option `-nodtk' can be used as a workaround. If GNU CC is not installed, it is therefore recommended to try ./configure CC="cc" and if that doesn't work, try ./configure CC="cc -nodtk" On Solaris, don't put `/usr/ucb' early in your `PATH'. This directory contains several dysfunctional programs; working variants of these programs are available in `/usr/bin'. So, if you need `/usr/ucb' in your `PATH', put it _after_ `/usr/bin'. On Haiku, software installed for all users goes in `/boot/common', not `/usr/local'. It is recommended to use the following options: ./configure --prefix=/boot/common 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 option `--target=TYPE' 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 causes the specified `gcc' to be used as the C compiler (unless it is overridden in the site shell script). Unfortunately, this technique does not work for `CONFIG_SHELL' due to an Autoconf bug. Until the bug is fixed you can use this workaround: CONFIG_SHELL=/bin/bash /bin/bash ./configure CONFIG_SHELL=/bin/bash `configure' Invocation ====================== `configure' recognizes the following options to control how it operates. `--help' `-h' Print a summary of all of the options to `configure', and exit. `--help=short' `--help=recursive' Print a summary of the options unique to this package's `configure', and exit. The `short' variant lists options used only in the top level, while the `recursive' variant lists options also present in any nested packages. `--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. `--prefix=DIR' Use DIR as the installation prefix. *note Installation Names:: for more details, including other options available for fine-tuning the installation locations. `--no-create' `-n' Run the configure checks, but stop before creating any output files. `configure' also accepts some other, not widely useful, options. Run `configure --help' for more details. apache-couchdb-1.6.0/DEVELOPERS0000644000175000001440000001216012332105522015711 0ustar00djcusers00000000000000Apache CouchDB DEVELOPERS ========================= Before you start here, read `INSTALL.Unix` (or `INSTALL.Windows`) and follow the setup instructions including the installation of all the listed dependencies for your system. Only follow these instructions if you are building from a source checkout. If you're unsure what this means, ignore this document. Dependencies ------------ You will need the following installed: * GNU Libtool (http://www.gnu.org/software/libtool/) * GNU Automake (>=1.6.3) (http://www.gnu.org/software/automake/) * GNU Autoconf (>=2.63) (http://www.gnu.org/software/autoconf/) * GNU Autoconf Archive (http://www.gnu.org/software/autoconf-archive/) * pkg-config (http://www.freedesktop.org/wiki/Software/pkg-config) You may also need: * Sphinx (http://sphinx.pocoo.org/) * LaTex (http://www.latex-project.org/) * GNU Texinfo (http://www.gnu.org/software/texinfo/) * GNU help2man (http://www.gnu.org/software/help2man/) * GnuPG (http://www.gnupg.org/) * md5sum (http://www.microbrew.org/tools/md5sha1sum/) * sha1sum (http://www.microbrew.org/tools/md5sha1sum/) The first of these optional dependencies are required for building the documentation. The last three are needed to build releases. You will need these optional dependencies installed if: * You are working on the documentation, or * You are preparing a distribution archive However, you do not need them if: * You are building from a distribution archive, or * You don't care about building the documentation Here is a list of *optional* dependencies for various operating systems. Installation will be easiest, when you install them all. Debian-based (inc. Ubuntu) Systems ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ sudo apt-get install help2man sudo apt-get install python-sphinx sudo apt-get install texlive-latex-base sudo apt-get install texlive-latex-recommended sudo apt-get install texlive-latex-extra sudo apt-get install texlive-fonts-recommended sudo apt-get install texinfo sudo apt-get install gnupg Gentoo-based Systems ~~~~~~~~~~~~~~~~~~~~ sudo emerge texinfo sudo emerge gnupg sudo emerge coreutils sudo emerge pkgconfig sudo emerge help2man sudo USE=latex emerge sphinx RedHat-based (Fedora, Centos, RHEL) Systems ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ sudo yum install help2man sudo yum install python-sphinx sudo yum install python-docutils sudo yum install python-pygments sudo yum install texlive-latex sudo yum install texlive-latex-fonts sudo yum install texinfo sudo yum install gnupg Mac OS X ~~~~~~~~ Install Homebrew, if you do not have it already: https://github.com/mxcl/homebrew Unless you want to install the optional dependencies, skip to the next section. Install what else we can with Homebrew: brew install help2man brew install gnupg brew install md5sha1sum If you don't already have pip installed, install it: sudo easy_install pip Now, install the required Python packages: sudo pip install sphinx sudo pip install docutils sudo pip install pygments Download MaxTeX from here: http://www.tug.org/mactex/ Follow the instructions to get a working LaTeX install on your system. Windows ~~~~~~~ Follow the instructions in INSTALL.Windows and build all components from source, using the same Visual C++ compiler and runtime. Bootstrapping ------------- Bootstrap the pristine source by running: ./bootstrap You must repeat this step every time you update your source checkout. Configuring ----------- Configure the source by running: ./configure Note that this will not fail when the optional dependencies are missing. To ensure the optional dependencies are installed, run: ./configure --enable-strictness If you don't care about docs and want to skip the whole thing, run: ./configure --disable-docs If you're working on the build system itself, you can run: ./configure --disable-tests This skips the tests allowing quicker `make' cycles. If you want to build it into different destination than `/usr/local`. ./configure --prefix=/ Testing ------- Check the test suite by running: make check Generate a coverage report by running: make cover Please report any problems to the developer's mailing list. Releasing --------- The release procedure is documented here: https://wiki.apache.org/couchdb/Release_Procedure Unix-like Systems ~~~~~~~~~~~~~~~~~ Prepare the release artefacts by running: make distcheck You can prepare signed release artefacts by running: make distsign The release artefacts can be found in the root source directory. Microsoft Windows ~~~~~~~~~~~~~~~~~ Prepare the release artefacts by running: make dist The release artefacts can be found in the `etc/windows` directory. Until the build system has been improved, you must make sure that you run this command from a clean source checkout. If you do not, your test database and log files will be bundled up in the release artefact. apache-couchdb-1.6.0/Vagrantfile0000644000175000001440000000441412332105522016506 0ustar00djcusers00000000000000# -*- mode: ruby -*- # vi: set ft=ruby : BOX_NAME = ENV['BOX_NAME'] || "ubuntu" BOX_URI = ENV['BOX_URI'] || "http://files.vagrantup.com/precise64.box" AWS_REGION = ENV['AWS_REGION'] || "us-east-1" AWS_AMI = ENV['AWS_AMI'] || "ami-d0f89fb9" Vagrant::Config.run do |config| # Setup virtual machine box. This VM configuration code is always executed. config.vm.box = BOX_NAME config.vm.box_url = BOX_URI # Install couchdb dependencies if deployment was not done if Dir.glob("#{File.dirname(__FILE__)}/.vagrant/machines/default/*/id").empty? # install build-essential pkg_cmd = "apt-get update -qq; apt-get install -q -y build-essential git " \ "autoconf autoconf-archive gnu-standards help2man texinfo; " # Install erlang pkg_cmd << "apt-get install -q -y erlang-base-hipe erlang-dev " \ "erlang-manpages erlang-eunit erlang-nox erlang-xmerl erlang-inets; " # couchdb developper dependencies pkg_cmd << "apt-get install -q -y libmozjs185-dev libicu-dev " \ "curl libcurl4-gnutls-dev libtool; " # doc dependencies pkg_cmd << "apt-get install -q -y help2man texinfo python-sphinx python-pip; " \ "pip install -U pygments; " config.vm.provision :shell, :inline => pkg_cmd end end # Providers were added on Vagrant >= 1.1.0 Vagrant::VERSION >= "1.1.0" and Vagrant.configure("2") do |config| config.vm.provider :aws do |aws, override| aws.access_key_id = ENV["AWS_ACCESS_KEY_ID"] aws.secret_access_key = ENV["AWS_SECRET_ACCESS_KEY"] aws.keypair_name = ENV["AWS_KEYPAIR_NAME"] override.ssh.private_key_path = ENV["AWS_SSH_PRIVKEY"] override.ssh.username = "ubuntu" aws.region = AWS_REGION aws.ami = AWS_AMI aws.instance_type = "t1.micro" end config.vm.provider :rackspace do |rs| config.ssh.private_key_path = ENV["RS_PRIVATE_KEY"] rs.username = ENV["RS_USERNAME"] rs.api_key = ENV["RS_API_KEY"] rs.public_key_path = ENV["RS_PUBLIC_KEY"] rs.flavor = /512MB/ rs.image = /Ubuntu/ end config.vm.provider :virtualbox do |vb| config.vm.box = BOX_NAME config.vm.box_url = BOX_URI end config.vm.provider :lxc do |lxc| config.vm.box = BOX_NAME config.vm.box_url = BOX_URI lxc.customize 'cgroup.memory.limit_in_bytes', '1024M' end end